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:
parent
9f2dfd61dd
commit
c536ed2fff
|
@ -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__
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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__
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue