git: 980746e5cb26 - main - fbt: simplify arm64 function-prologue parsing
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sat, 03 Jun 2023 17:05:18 UTC
The branch main has been updated by christos: URL: https://cgit.FreeBSD.org/src/commit/?id=980746e5cb264a70ad3dcbbf38ba919ad3436aa1 commit 980746e5cb264a70ad3dcbbf38ba919ad3436aa1 Author: Christos Margiolis <christos@FreeBSD.org> AuthorDate: 2023-06-03 17:04:33 +0000 Commit: Christos Margiolis <christos@FreeBSD.org> CommitDate: 2023-06-03 17:04:33 +0000 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 --- sys/cddl/dev/fbt/aarch64/fbt_isa.c | 42 +++++++++++++++----------------------- 1 file changed, 16 insertions(+), 26 deletions(-) diff --git a/sys/cddl/dev/fbt/aarch64/fbt_isa.c b/sys/cddl/dev/fbt/aarch64/fbt_isa.c index cc4ea42715c8..4b32d42ca0b4 100644 --- a/sys/cddl/dev/fbt/aarch64/fbt_isa.c +++ b/sys/cddl/dev/fbt/aarch64/fbt_isa.c @@ -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)