[PATCH] D142278: [LoongArch] Allow %pc_lo12 relocs in JIRL's immediate operand position
WÁNG Xuěruì via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Sat Jan 21 02:22:45 PST 2023
xen0n created this revision.
xen0n added reviewers: SixWeining, wangleiat, MaskRay, xry111.
Herald added a subscriber: hiraditya.
Herald added a project: All.
xen0n requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
Currently, gcc-13 will generate such assembly when `-mcmodel=medium`,
which is ostensibly a dirty hack to allow bigger offsets for extern
function calls without having to add more reloc types. This is not the
best way to accomplish the original goal, but such usages will appear
soon and we have to support it anyway.
Example:
c
extern int foo(int);
int bar(int x) {
return foo(x + 123);
}
will produce the following (simplified) assembly when compiled with
`-O2 -mcmodel=medium`:
.globl bar
.type bar, @function
bar:
.cfi_startproc
addi.w $r4,$r4,123
pcalau12i $r12,%pc_hi20(foo)
jirl $r0,$r12,%pc_lo12(foo)
.cfi_endproc
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D142278
Files:
llvm/lib/Target/LoongArch/AsmParser/LoongArchAsmParser.cpp
llvm/test/MC/LoongArch/Relocations/relocations.s
Index: llvm/test/MC/LoongArch/Relocations/relocations.s
===================================================================
--- llvm/test/MC/LoongArch/Relocations/relocations.s
+++ llvm/test/MC/LoongArch/Relocations/relocations.s
@@ -74,6 +74,11 @@
# INSTR: addi.d $t1, $t1, %pc_lo12(foo+4)
# FIXUP: fixup A - offset: 0, value: %pc_lo12(foo+4), kind: FK_NONE
+jirl $zero, $t1, %pc_lo12(foo)
+# RELOC: R_LARCH_PCALA_LO12 foo 0x0
+# INSTR: jirl $zero, $t1, %pc_lo12(foo)
+# FIXUP: fixup A - offset: 0, value: %pc_lo12(foo), kind: FK_NONE
+
st.b $t1, $a2, %pc_lo12(foo)
# RELOC: R_LARCH_PCALA_LO12 foo 0x0
# INSTR: st.b $t1, $a2, %pc_lo12(foo)
Index: llvm/lib/Target/LoongArch/AsmParser/LoongArchAsmParser.cpp
===================================================================
--- llvm/lib/Target/LoongArch/AsmParser/LoongArchAsmParser.cpp
+++ llvm/lib/Target/LoongArch/AsmParser/LoongArchAsmParser.cpp
@@ -318,7 +318,8 @@
LoongArchMCExpr::VariantKind VK = LoongArchMCExpr::VK_LoongArch_None;
bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK);
bool IsValidKind = VK == LoongArchMCExpr::VK_LoongArch_None ||
- VK == LoongArchMCExpr::VK_LoongArch_B16;
+ VK == LoongArchMCExpr::VK_LoongArch_B16 ||
+ VK == LoongArchMCExpr::VK_LoongArch_PCALA_LO12;
return IsConstantImm
? isShiftedInt<16, 2>(Imm) && IsValidKind
: LoongArchAsmParser::classifySymbolRef(getImm(), VK) &&
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D142278.491056.patch
Type: text/x-patch
Size: 1500 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230121/9d8f6b74/attachment.bin>
More information about the llvm-commits
mailing list