Re: [RFC PATCH] objtool: Skip unannotated intra-function call warning for bl+mflr pattern
From: Josh Poimboeuf <jpoimboe@kernel.org>
Date: 2025-02-20 19:59:42
Also in:
lkml, llvm
On Wed, Feb 19, 2025 at 09:50:14PM +0530, Sathvika Vasireddy wrote:
Architectures like PowerPC use a pattern where the compiler generates a branch-and-link (bl) instruction that targets the very next instruction, followed by loading the link register (mflr) later. This pattern appears in the code like: bl .+4 li r5,0 mflr r30
If I understand correctly, this is basically a fake call which is used to get the value of the program counter?
Objtool currently warns about this as an "unannotated intra-function call" because find_call_destination() fails to find any symbol at the target offset. Add a check to skip the warning when a branch targets the immediate next instruction in the same function. Reported-by: kernel test robot <redacted> Closes: https://lore.kernel.org/oe-kbuild-all/202502180818.XnFdv8I8-lkp@intel.com/ (local) Signed-off-by: Sathvika Vasireddy <redacted>
This should have a Fixes tag as well.
quoted hunk ↗ jump to hunk
static int add_call_destinations(struct objtool_file *file) { + struct instruction *next_insn; struct instruction *insn; unsigned long dest_off; struct symbol *dest;@@ -1625,6 +1626,11 @@ static int add_call_destinations(struct objtool_file *file) reloc = insn_reloc(file, insn); if (!reloc) { dest_off = arch_jump_destination(insn); + + next_insn = next_insn_same_func(file, insn); + if (next_insn && dest_off == next_insn->offset) + continue; +
This won't work on x86, where an intra-function call is converted to a stack-modifying JUMP. So this should probably be checked in an arch-specific function. -- Josh