objtool: Collapse annotate sequences

Reduce read_annotate() runs by collapsing subsequent runs into a
single call.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Acked-by: Josh Poimboeuf <jpoimboe@kernel.org>
Link: https://lore.kernel.org/r/20241128094311.688871544@infradead.org
This commit is contained in:
Peter Zijlstra 2024-11-28 10:38:59 +01:00
parent 112765ca1c
commit a8a330dd99

View File

@ -2381,21 +2381,24 @@ static int read_annotate(struct objtool_file *file,
return 0; return 0;
} }
static int __annotate_ignore_alts(struct objtool_file *file, int type, struct instruction *insn) static int __annotate_early(struct objtool_file *file, int type, struct instruction *insn)
{ {
if (type != ANNOTYPE_IGNORE_ALTS) switch (type) {
return 0; case ANNOTYPE_IGNORE_ALTS:
insn->ignore_alts = true;
break;
insn->ignore_alts = true; /*
return 0; * Must be before read_unwind_hints() since that needs insn->noendbr.
} */
case ANNOTYPE_NOENDBR:
insn->noendbr = 1;
break;
static int __annotate_noendbr(struct objtool_file *file, int type, struct instruction *insn) default:
{ break;
if (type != ANNOTYPE_NOENDBR) }
return 0;
insn->noendbr = 1;
return 0; return 0;
} }
@ -2429,26 +2432,21 @@ static int __annotate_ifc(struct objtool_file *file, int type, struct instructio
return 0; return 0;
} }
static int __annotate_retpoline_safe(struct objtool_file *file, int type, struct instruction *insn) static int __annotate_late(struct objtool_file *file, int type, struct instruction *insn)
{
if (type != ANNOTYPE_RETPOLINE_SAFE)
return 0;
if (insn->type != INSN_JUMP_DYNAMIC &&
insn->type != INSN_CALL_DYNAMIC &&
insn->type != INSN_RETURN &&
insn->type != INSN_NOP) {
WARN_INSN(insn, "retpoline_safe hint not an indirect jump/call/ret/nop");
return -1;
}
insn->retpoline_safe = true;
return 0;
}
static int __annotate_instr(struct objtool_file *file, int type, struct instruction *insn)
{ {
switch (type) { switch (type) {
case ANNOTYPE_RETPOLINE_SAFE:
if (insn->type != INSN_JUMP_DYNAMIC &&
insn->type != INSN_CALL_DYNAMIC &&
insn->type != INSN_RETURN &&
insn->type != INSN_NOP) {
WARN_INSN(insn, "retpoline_safe hint not an indirect jump/call/ret/nop");
return -1;
}
insn->retpoline_safe = true;
break;
case ANNOTYPE_INSTR_BEGIN: case ANNOTYPE_INSTR_BEGIN:
insn->instr++; insn->instr++;
break; break;
@ -2457,6 +2455,10 @@ static int __annotate_instr(struct objtool_file *file, int type, struct instruct
insn->instr--; insn->instr--;
break; break;
case ANNOTYPE_UNRET_BEGIN:
insn->unret = 1;
break;
default: default:
break; break;
} }
@ -2464,16 +2466,6 @@ static int __annotate_instr(struct objtool_file *file, int type, struct instruct
return 0; return 0;
} }
static int __annotate_unret(struct objtool_file *file, int type, struct instruction *insn)
{
if (type != ANNOTYPE_UNRET_BEGIN)
return 0;
insn->unret = 1;
return 0;
}
/* /*
* Return true if name matches an instrumentation function, where calls to that * Return true if name matches an instrumentation function, where calls to that
* function from noinstr code can safely be removed, but compilers won't do so. * function from noinstr code can safely be removed, but compilers won't do so.
@ -2583,14 +2575,7 @@ static int decode_sections(struct objtool_file *file)
add_ignores(file); add_ignores(file);
add_uaccess_safe(file); add_uaccess_safe(file);
ret = read_annotate(file, __annotate_ignore_alts); ret = read_annotate(file, __annotate_early);
if (ret)
return ret;
/*
* Must be before read_unwind_hints() since that needs insn->noendbr.
*/
ret = read_annotate(file, __annotate_noendbr);
if (ret) if (ret)
return ret; return ret;
@ -2636,15 +2621,7 @@ static int decode_sections(struct objtool_file *file)
if (ret) if (ret)
return ret; return ret;
ret = read_annotate(file, __annotate_retpoline_safe); ret = read_annotate(file, __annotate_late);
if (ret)
return ret;
ret = read_annotate(file, __annotate_instr);
if (ret)
return ret;
ret = read_annotate(file, __annotate_unret);
if (ret) if (ret)
return ret; return ret;