Skip to content

Commit

Permalink
objtool: Collapse annotate sequences
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Peter Zijlstra committed Dec 2, 2024
1 parent 112765c commit a8a330d
Showing 1 changed file with 32 additions and 55 deletions.
87 changes: 32 additions & 55 deletions tools/objtool/check.c
Original file line number Diff line number Diff line change
Expand Up @@ -2381,21 +2381,24 @@ static int read_annotate(struct objtool_file *file,
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)
return 0;
switch (type) {
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)
{
if (type != ANNOTYPE_NOENDBR)
return 0;
default:
break;
}

insn->noendbr = 1;
return 0;
}

Expand Down Expand Up @@ -2429,26 +2432,21 @@ static int __annotate_ifc(struct objtool_file *file, int type, struct instructio
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;
}
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;
return 0;
}
insn->retpoline_safe = true;
break;

static int __annotate_instr(struct objtool_file *file, int type, struct instruction *insn)
{
switch (type) {
case ANNOTYPE_INSTR_BEGIN:
insn->instr++;
break;
Expand All @@ -2457,23 +2455,17 @@ static int __annotate_instr(struct objtool_file *file, int type, struct instruct
insn->instr--;
break;

case ANNOTYPE_UNRET_BEGIN:
insn->unret = 1;
break;

default:
break;
}

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
* function from noinstr code can safely be removed, but compilers won't do so.
Expand Down Expand Up @@ -2583,14 +2575,7 @@ static int decode_sections(struct objtool_file *file)
add_ignores(file);
add_uaccess_safe(file);

ret = read_annotate(file, __annotate_ignore_alts);
if (ret)
return ret;

/*
* Must be before read_unwind_hints() since that needs insn->noendbr.
*/
ret = read_annotate(file, __annotate_noendbr);
ret = read_annotate(file, __annotate_early);
if (ret)
return ret;

Expand Down Expand Up @@ -2636,15 +2621,7 @@ static int decode_sections(struct objtool_file *file)
if (ret)
return ret;

ret = read_annotate(file, __annotate_retpoline_safe);
if (ret)
return ret;

ret = read_annotate(file, __annotate_instr);
if (ret)
return ret;

ret = read_annotate(file, __annotate_unret);
ret = read_annotate(file, __annotate_late);
if (ret)
return ret;

Expand Down

0 comments on commit a8a330d

Please sign in to comment.