[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20241128094311.688871544@infradead.org>
Date: Thu, 28 Nov 2024 10:38:59 +0100
From: Peter Zijlstra <peterz@...radead.org>
To: jpoimboe@...nel.org
Cc: chenhuacai@...nel.org,
kernel@...0n.name,
x86@...nel.org,
peterz@...radead.org,
loongarch@...ts.linux.dev,
linux-kernel@...r.kernel.org
Subject: [PATCH v2 08/16] objtool: Collapse annotate sequences
Reduce read_annotate() runs by collapsing subsequent runs into a
single call.
Signed-off-by: Peter Zijlstra (Intel) <peterz@...radead.org>
---
tools/objtool/check.c | 87 ++++++++++++++++++--------------------------------
1 file changed, 32 insertions(+), 55 deletions(-)
--- a/tools/objtool/check.c
+++ b/tools/objtool/check.c
@@ -2381,21 +2381,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;
}
@@ -2429,26 +2432,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;
@@ -2457,6 +2455,10 @@ static int __annotate_instr(struct objto
insn->instr--;
break;
+ case ANNOTYPE_UNRET_BEGIN:
+ insn->unret = 1;
+ break;
+
default:
break;
}
@@ -2464,16 +2466,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.
@@ -2583,14 +2575,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;
@@ -2636,15 +2621,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;
Powered by blists - more mailing lists