mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2024-12-29 17:22:07 +00:00
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:
parent
112765ca1c
commit
a8a330dd99
@ -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;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user