]> www.infradead.org Git - linux.git/commitdiff
objtool: Collapse annotate sequences
authorPeter Zijlstra <peterz@infradead.org>
Thu, 28 Nov 2024 09:38:59 +0000 (10:38 +0100)
committerPeter Zijlstra <peterz@infradead.org>
Mon, 2 Dec 2024 11:01:42 +0000 (12:01 +0100)
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
tools/objtool/check.c

index 2222fe7108328c5d313b9500123e694768416f06..3bea8b2963d343b788d155d80a66d2919fb45e99 100644 (file)
@@ -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;
 }
 
@@ -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;
@@ -2457,6 +2455,10 @@ 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;
        }
@@ -2464,16 +2466,6 @@ static int __annotate_instr(struct objtool_file *file, int type, struct instruct
        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 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;
 
@@ -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;