[llvm-dev] [MC] Questions about relaxation in MC

Kai Wang via llvm-dev
2020-10-06T03:11:36Z

Hi all,

In RISC-V ISA, the range of conditional branches is within 4KiB. In current
implementation, if the branch target is out of range, LLVM MC will issue an
error message to tell users it could not resolve the fixup record. I have
compared the result with the GNU assembler. GNU assembler will convert the
branch to inverted one plus jump to make the branch possible. The range of
unconditional jump is 1MiB. It looks like

##########################
bne a0, a1, FAR_BRANCH
…
FAR_BRANCH:

converted to

##########################
beq a0, a1, SKIP_J
j FAR_BRANCH
SKIP_J:
…
FAR_BRANCH:

I found there is a target hook, relaxInstruction, that tries to achieve the
similar goal. However, the target hook only replaces one MCInst with
another one with a larger branch range. For example, c.beqz will be
converted to beq in the RISC-V backend if the fixup value is out of range.
There seems no target hook to convert one MCInst to a complex pattern in
LLVM MC. Do I miss something obvious?

I found there is a target hook, finishLayout, to manipulate the code
generated. Does it make sense to implement the feature in finishLayout? Or
is there any better idea to achieve the conversion? Thanks a lot.

Best,
Kai
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20201006/42aac2d1/attachment.html>