objtool: Remove SAVE/RESTORE hints

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>
This commit is contained in:
Peter Zijlstra 2020-04-01 16:54:26 +02:00 committed by Ingo Molnar
parent 9f2dfd61dd
commit c536ed2fff
5 changed files with 6 additions and 73 deletions

View File

@ -58,9 +58,7 @@
#define ORC_TYPE_CALL 0 #define ORC_TYPE_CALL 0
#define ORC_TYPE_REGS 1 #define ORC_TYPE_REGS 1
#define ORC_TYPE_REGS_IRET 2 #define ORC_TYPE_REGS_IRET 2
#define UNWIND_HINT_TYPE_SAVE 3 #define UNWIND_HINT_TYPE_RET_OFFSET 3
#define UNWIND_HINT_TYPE_RESTORE 4
#define UNWIND_HINT_TYPE_RET_OFFSET 5
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
/* /*

View File

@ -86,15 +86,6 @@
UNWIND_HINT sp_offset=\sp_offset UNWIND_HINT sp_offset=\sp_offset
.endm .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 * RET_OFFSET: Used on instructions that terminate a function; mostly RETURN
* and sibling calls. On these, sp_offset denotes the expected offset from * and sibling calls. On these, sp_offset denotes the expected offset from
@ -104,24 +95,6 @@
UNWIND_HINT type=UNWIND_HINT_TYPE_RET_OFFSET sp_offset=\sp_offset UNWIND_HINT type=UNWIND_HINT_TYPE_RET_OFFSET sp_offset=\sp_offset
.endm .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 /* __ASSEMBLY__ */
#endif /* _ASM_X86_UNWIND_HINTS_H */ #endif /* _ASM_X86_UNWIND_HINTS_H */

View File

@ -58,9 +58,7 @@
#define ORC_TYPE_CALL 0 #define ORC_TYPE_CALL 0
#define ORC_TYPE_REGS 1 #define ORC_TYPE_REGS 1
#define ORC_TYPE_REGS_IRET 2 #define ORC_TYPE_REGS_IRET 2
#define UNWIND_HINT_TYPE_SAVE 3 #define UNWIND_HINT_TYPE_RET_OFFSET 3
#define UNWIND_HINT_TYPE_RESTORE 4
#define UNWIND_HINT_TYPE_RET_OFFSET 5
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
/* /*

View File

@ -1254,15 +1254,7 @@ static int read_unwind_hints(struct objtool_file *file)
cfa = &insn->state.cfa; cfa = &insn->state.cfa;
if (hint->type == UNWIND_HINT_TYPE_SAVE) { if (hint->type == UNWIND_HINT_TYPE_RET_OFFSET) {
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) {
insn->ret_offset = hint->sp_offset; insn->ret_offset = hint->sp_offset;
continue; continue;
} }
@ -2113,37 +2105,9 @@ static int validate_branch(struct objtool_file *file, struct symbol *func,
return 0; return 0;
} }
if (insn->hint) { 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;
}
state = insn->state; state = insn->state;
else
} else
insn->state = state; insn->state = state;
insn->visited |= visited; insn->visited |= visited;

View File

@ -34,7 +34,7 @@ struct instruction {
enum insn_type type; enum insn_type type;
unsigned long immediate; unsigned long immediate;
bool alt_group, dead_end, ignore, ignore_alts; bool alt_group, dead_end, ignore, ignore_alts;
bool hint, save, restore; bool hint;
bool retpoline_safe; bool retpoline_safe;
u8 visited; u8 visited;
u8 ret_offset; u8 ret_offset;