[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