[llvm-dev] Handling far branches with fixups or ELF relocs
Hal Finkel via llvm-dev
llvm-dev at lists.llvm.org
Wed Jul 1 07:46:41 PDT 2020
Hi, Denis,
You might also take a look at llvm/lib/Target/PowerPC/PPCBranchSelector.cpp
It does things like change:
// short branch:
// bCC MBB
into:
// long branch:
// b!CC $PC+8
// b MBB
-Hal
On 7/1/20 3:47 AM, Denis Steckelmacher via llvm-dev wrote:
> Hello,
>
> I'm working on an LLVM backend for an experimental microprocessor.
> Work is going on nicely, and I've until now found the answer to all my
> questions directly in the LLVM source code, or in the documentation.
>
> However, I'm having problems with the AsmBackend class and the
> handling of fixups.
>
> The processor I'm working with has a single conditional branch
> instruction, JCC, that takes an IP-relative 9-bit immediate offset as
> operand. A second version of the instruction takes a register as
> operand and can therefore jump to any 32-bit address.
>
> In AsmBackend, there are methods for relaxing instructions, that I
> wanted to use to replace "JCC imm9" instructions with a sequence of
> instructions that jumps further. However, I have two questions:
>
> - relaxInstruction does not seem to be able to replace one instruction
> with a sequence of instructions
> - I've looked at many other LLVM backends (AVR, ARC, ARM, MIPS and
> RISC-V), and none of them really seem to do interesting things in
> relaxInstruction. ARM for instance relaxes Thumb instructions to
> normal instructions, and RISC-V relaxes compressed instructions to
> normal ones too. But in both cases, even the normal instructions have
> limited range, for which there is an assertion, but no "solution" for
> when a branch exceeds the range of the instruction.
>
> It therefore seems that the problem of "conditional branches that jump
> too far" is solved elsewhere, but I could not find that location. I
> looked at LLD, and I've seen that RISC-V has some code there (related
> to the PLT) that produces sequences of instructions, but not the other
> targets.
>
> So, what would be the best way to change "JCC imm9" instructions to
> something else when a branch has to jump further than 256 instructions
> before or after the current one?
>
> Best regards,
> Denis Steckelmacher
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
--
Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory
More information about the llvm-dev
mailing list