objtool: Remove SAVE/RESTORE hints
authorPeter Zijlstra <peterz@infradead.org>
Wed, 1 Apr 2020 14:54:26 +0000 (16:54 +0200)
committerIngo Molnar <mingo@kernel.org>
Wed, 22 Apr 2020 08:53:50 +0000 (10:53 +0200)
The SAVE/RESTORE hints are now unused; remove them.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Miroslav Benes <mbenes@suse.cz>
Reviewed-by: Alexandre Chartre <alexandre.chartre@oracle.com>
Acked-by: Josh Poimboeuf <jpoimboe@redhat.com>
Link: https://lkml.kernel.org/r/20200416115118.926738768@infradead.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
arch/x86/include/asm/orc_types.h
arch/x86/include/asm/unwind_hints.h
tools/arch/x86/include/asm/orc_types.h
tools/objtool/check.c
tools/objtool/check.h

index 5f18ca7..d255349 100644 (file)
@@ -58,9 +58,7 @@
 #define ORC_TYPE_CALL                  0
 #define ORC_TYPE_REGS                  1
 #define ORC_TYPE_REGS_IRET             2
-#define UNWIND_HINT_TYPE_SAVE          3
-#define UNWIND_HINT_TYPE_RESTORE       4
-#define UNWIND_HINT_TYPE_RET_OFFSET    5
+#define UNWIND_HINT_TYPE_RET_OFFSET    3
 
 #ifndef __ASSEMBLY__
 /*
index aabf7ac..7d903fd 100644 (file)
        UNWIND_HINT sp_offset=\sp_offset
 .endm
 
-.macro UNWIND_HINT_SAVE
-       UNWIND_HINT type=UNWIND_HINT_TYPE_SAVE
-.endm
-
-.macro UNWIND_HINT_RESTORE
-       UNWIND_HINT type=UNWIND_HINT_TYPE_RESTORE
-.endm
-
-
 /*
  * RET_OFFSET: Used on instructions that terminate a function; mostly RETURN
  * and sibling calls. On these, sp_offset denotes the expected offset from
        UNWIND_HINT type=UNWIND_HINT_TYPE_RET_OFFSET sp_offset=\sp_offset
 .endm
 
-#else /* !__ASSEMBLY__ */
-
-#define UNWIND_HINT(sp_reg, sp_offset, type, end)              \
-       "987: \n\t"                                             \
-       ".pushsection .discard.unwind_hints\n\t"                \
-       /* struct unwind_hint */                                \
-       ".long 987b - .\n\t"                                    \
-       ".short " __stringify(sp_offset) "\n\t"                 \
-       ".byte " __stringify(sp_reg) "\n\t"                     \
-       ".byte " __stringify(type) "\n\t"                       \
-       ".byte " __stringify(end) "\n\t"                        \
-       ".balign 4 \n\t"                                        \
-       ".popsection\n\t"
-
-#define UNWIND_HINT_SAVE UNWIND_HINT(0, 0, UNWIND_HINT_TYPE_SAVE, 0)
-
-#define UNWIND_HINT_RESTORE UNWIND_HINT(0, 0, UNWIND_HINT_TYPE_RESTORE, 0)
-
 #endif /* __ASSEMBLY__ */
 
 #endif /* _ASM_X86_UNWIND_HINTS_H */
index 5f18ca7..d255349 100644 (file)
@@ -58,9 +58,7 @@
 #define ORC_TYPE_CALL                  0
 #define ORC_TYPE_REGS                  1
 #define ORC_TYPE_REGS_IRET             2
-#define UNWIND_HINT_TYPE_SAVE          3
-#define UNWIND_HINT_TYPE_RESTORE       4
-#define UNWIND_HINT_TYPE_RET_OFFSET    5
+#define UNWIND_HINT_TYPE_RET_OFFSET    3
 
 #ifndef __ASSEMBLY__
 /*
index 93c88ac..464f10c 100644 (file)
@@ -1254,15 +1254,7 @@ static int read_unwind_hints(struct objtool_file *file)
 
                cfa = &insn->state.cfa;
 
-               if (hint->type == UNWIND_HINT_TYPE_SAVE) {
-                       insn->save = true;
-                       continue;
-
-               } else if (hint->type == UNWIND_HINT_TYPE_RESTORE) {
-                       insn->restore = true;
-                       insn->hint = true;
-
-               } else if (hint->type == UNWIND_HINT_TYPE_RET_OFFSET) {
+               if (hint->type == UNWIND_HINT_TYPE_RET_OFFSET) {
                        insn->ret_offset = hint->sp_offset;
                        continue;
                }
@@ -2113,37 +2105,9 @@ static int validate_branch(struct objtool_file *file, struct symbol *func,
                                return 0;
                }
 
-               if (insn->hint) {
-                       if (insn->restore) {
-                               struct instruction *save_insn, *i;
-
-                               i = insn;
-                               save_insn = NULL;
-                               sym_for_each_insn_continue_reverse(file, func, i) {
-                                       if (i->save) {
-                                               save_insn = i;
-                                               break;
-                                       }
-                               }
-
-                               if (!save_insn) {
-                                       WARN_FUNC("no corresponding CFI save for CFI restore",
-                                                 sec, insn->offset);
-                                       return 1;
-                               }
-
-                               if (!save_insn->visited) {
-                                       WARN_FUNC("objtool isn't smart enough to handle this CFI save/restore combo",
-                                                 sec, insn->offset);
-                                       return 1;
-                               }
-
-                               insn->state = save_insn->state;
-                       }
-
+               if (insn->hint)
                        state = insn->state;
-
-               } else
+               else
                        insn->state = state;
 
                insn->visited |= visited;
index 81ce27e..7c30760 100644 (file)
@@ -34,7 +34,7 @@ struct instruction {
        enum insn_type type;
        unsigned long immediate;
        bool alt_group, dead_end, ignore, ignore_alts;
-       bool hint, save, restore;
+       bool hint;
        bool retpoline_safe;
        u8 visited;
        u8 ret_offset;