Commit c536ed2f authored by Peter Zijlstra's avatar Peter Zijlstra Committed by Ingo Molnar
Browse files

objtool: Remove SAVE/RESTORE hints

parent 9f2dfd61
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -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__
/*
+0 −27
Original line number Diff line number Diff line
@@ -86,15 +86,6 @@
	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
@@ -104,24 +95,6 @@
	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 */
+1 −3
Original line number Diff line number Diff line
@@ -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__
/*
+3 −39
Original line number Diff line number Diff line
@@ -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;
+1 −1
Original line number Diff line number Diff line
@@ -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;