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

objtool: Rewrite add_ignores()



The whole add_ignores() thing was wildly weird; rewrite it according
to 'modern' ways.

Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Acked-by: default avatarJosh Poimboeuf <jpoimboe@redhat.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent 09f30d83
Loading
Loading
Loading
Loading
+20 −31
Original line number Diff line number Diff line
@@ -104,29 +104,6 @@ static struct instruction *next_insn_same_func(struct objtool_file *file,
	for (insn = next_insn_same_sec(file, insn); insn;		\
	     insn = next_insn_same_sec(file, insn))

/*
 * Check if the function has been manually whitelisted with the
 * STACK_FRAME_NON_STANDARD macro, or if it should be automatically whitelisted
 * due to its use of a context switching instruction.
 */
static bool ignore_func(struct objtool_file *file, struct symbol *func)
{
	struct rela *rela;

	/* check for STACK_FRAME_NON_STANDARD */
	if (file->whitelist && file->whitelist->rela)
		list_for_each_entry(rela, &file->whitelist->rela->rela_list, list) {
			if (rela->sym->type == STT_SECTION &&
			    rela->sym->sec == func->sec &&
			    rela->addend == func->offset)
				return true;
			if (rela->sym->type == STT_FUNC && rela->sym == func)
				return true;
		}

	return false;
}

/*
 * This checks to see if the given function is a "noreturn" function.
 *
@@ -436,20 +413,33 @@ static void add_ignores(struct objtool_file *file)
	struct instruction *insn;
	struct section *sec;
	struct symbol *func;
	struct rela *rela;

	for_each_sec(file, sec) {
		list_for_each_entry(func, &sec->symbol_list, list) {
			if (func->type != STT_FUNC)
	sec = find_section_by_name(file->elf, ".rela.discard.func_stack_frame_non_standard");
	if (!sec)
		return;

	list_for_each_entry(rela, &sec->rela_list, list) {
		switch (rela->sym->type) {
		case STT_FUNC:
			func = rela->sym;
			break;

		case STT_SECTION:
			func = find_symbol_by_offset(rela->sym->sec, rela->addend);
			if (!func || func->type != STT_FUNC)
				continue;
			break;

			if (!ignore_func(file, func))
		default:
			WARN("unexpected relocation symbol type in %s: %d", sec->name, rela->sym->type);
			continue;
		}

		func_for_each_insn_all(file, func, insn)
			insn->ignore = true;
	}
}
}

/*
 * FIXME: For now, just ignore any alternatives which add retpolines.  This is
@@ -2199,7 +2189,6 @@ int check(const char *_objname, bool orc)

	INIT_LIST_HEAD(&file.insn_list);
	hash_init(file.insn_hash);
	file.whitelist = find_section_by_name(file.elf, ".discard.func_stack_frame_non_standard");
	file.c_file = find_section_by_name(file.elf, ".comment");
	file.ignore_unreachables = no_unreachable;
	file.hints = false;
+0 −1
Original line number Diff line number Diff line
@@ -60,7 +60,6 @@ struct objtool_file {
	struct elf *elf;
	struct list_head insn_list;
	DECLARE_HASHTABLE(insn_hash, 16);
	struct section *whitelist;
	bool ignore_unreachables, c_file, hints, rodata;
};