fbt: simplify arm64 function-prologue parsing

Reviewed by:	markj
Approved by:	markj (mentor)
Sponsored by:	The FreeBSD Foundation
Differential Revision:	https://reviews.freebsd.org/D40364
This commit is contained in:
Christos Margiolis 2023-06-03 20:04:33 +03:00
parent bab7781e78
commit 980746e5cb

View file

@ -130,35 +130,25 @@ fbt_provide_module_function(linker_file_t lf, int symindx,
*/
if (*instr == NOP_INSTR)
found = true;
if (!found) {
for (; instr < limit; instr++) {
for (; !found && instr < limit; instr++) {
/*
* Functions start with "stp xt1, xt2, [xn, <const>]!" or
* "sub sp, sp, <const>".
*
* Sometimes the compiler will have a sub instruction that is
* not of the above type so don't stop if we see one.
*/
if ((*instr & LDP_STP_MASK) == STP_64) {
/*
* Some functions start with
* "stp xt1, xt2, [xn, <const>]!"
* Assume any other store of this type means we are
* past the function prologue.
*/
if ((*instr & LDP_STP_MASK) == STP_64) {
/*
* Assume any other store of this type means we
* are past the function prolog.
*/
if (((*instr >> ADDR_SHIFT) & ADDR_MASK) == 31)
found = true;
break;
}
/*
* Some functions start with a "sub sp, sp, <const>"
* Sometimes the compiler will have a sub instruction
* that is not of the above type so don't stop if we
* see one.
*/
if ((*instr & SUB_MASK) == SUB_INSTR &&
((*instr >> SUB_RD_SHIFT) & SUB_R_MASK) == 31 &&
((*instr >> SUB_RN_SHIFT) & SUB_R_MASK) == 31) {
if (((*instr >> ADDR_SHIFT) & ADDR_MASK) == 31)
found = true;
break;
}
}
} else if ((*instr & SUB_MASK) == SUB_INSTR &&
((*instr >> SUB_RD_SHIFT) & SUB_R_MASK) == 31 &&
((*instr >> SUB_RN_SHIFT) & SUB_R_MASK) == 31)
found = true;
}
if (!found)