Commit 106f11d4 authored by Josh Poimboeuf's avatar Josh Poimboeuf Committed by Peter Zijlstra
Browse files

objtool: Remove second pass of .cold function correlation



The .cold function parent/child correlation logic has two passes: one in
read_symbols() and one in add_jump_destinations().

The second pass was added with commit cd77849a ("objtool: Fix GCC 8
cold subfunction detection for aliased functions") to ensure that if the
parent symbol had aliases then the canonical symbol was chosen as the
parent.

That solution was rather clunky, not to mention incomplete due to the
existence of alternatives and switch tables.  Now that we have
sym->alias, the canonical alias fix can be done much simpler in the
first pass, making the second pass obsolete.

Signed-off-by: default avatarJosh Poimboeuf <jpoimboe@kernel.org>
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Link: https://patch.msgid.link/bdab245a38000a5407f663a031f39e14c67a43d4.1763671318.git.jpoimboe@kernel.org
parent a91a61b2
Loading
Loading
Loading
Loading
+1 −22
Original line number Diff line number Diff line
@@ -1623,34 +1623,13 @@ static int add_jump_destinations(struct objtool_file *file)
			continue;
		}

		if (!insn->sym || insn->sym == dest_insn->sym)
		if (!insn->sym || insn->sym->pfunc == dest_sym->pfunc)
			goto set_jump_dest;

		/*
		 * Internal cross-function jump.
		 */

		/*
		 * For GCC 8+, create parent/child links for any cold
		 * subfunctions.  This is _mostly_ redundant with a
		 * similar initialization in read_symbols().
		 *
		 * If a function has aliases, we want the *first* such
		 * function in the symbol table to be the subfunction's
		 * parent.  In that case we overwrite the
		 * initialization done in read_symbols().
		 *
		 * However this code can't completely replace the
		 * read_symbols() code because this doesn't detect the
		 * case where the parent function's only reference to a
		 * subfunction is through a jump table.
		 */
		if (func && dest_sym->cold) {
			func->cfunc = dest_sym;
			dest_sym->pfunc = func;
			goto set_jump_dest;
		}

		if (is_first_func_insn(file, dest_insn)) {
			/* Internal sibling call */
			if (add_call_dest(file, insn, dest_sym, true))
+2 −1
Original line number Diff line number Diff line
@@ -658,8 +658,9 @@ static int read_symbols(struct elf *elf)
				return -1;
			}

			sym->pfunc = pfunc;
			sym->pfunc = pfunc->alias;
			pfunc->cfunc = sym;
			pfunc->alias->cfunc = sym;

			/*
			 * Unfortunately, -fnoreorder-functions puts the child