[PATCH 08/11] objtool: Collapse annotate sequences

From: Peter Zijlstra
Date: Mon Dec 04 2023 - 04:40:36 EST


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

Signed-off-by: Peter Zijlstra (Intel) <peterz@xxxxxxxxxxxxx>
---
tools/objtool/check.c | 87 ++++++++++++++++++--------------------------------
1 file changed, 32 insertions(+), 55 deletions(-)

--- a/tools/objtool/check.c
+++ b/tools/objtool/check.c
@@ -2308,21 +2308,24 @@ static int read_annotate(struct objtool_
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;
}

@@ -2356,26 +2359,21 @@ static int __annotate_ifc(struct objtool
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;
@@ -2384,6 +2382,10 @@ static int __annotate_instr(struct objto
insn->instr--;
break;

+ case ANNOTYPE_UNRET_BEGIN:
+ insn->unret = 1;
+ break;
+
default:
break;
}
@@ -2391,16 +2393,6 @@ static int __annotate_instr(struct objto
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.
@@ -2507,14 +2499,7 @@ static int decode_sections(struct objtoo
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;

@@ -2560,15 +2545,7 @@ static int decode_sections(struct objtoo
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;