[lld] [llvm] [llvm][lld] Support R_RISCV_GOT32_PCREL (PR #72587)

via llvm-commits llvm-commits at lists.llvm.org
Thu Nov 16 16:23:47 PST 2023


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-lld-elf

Author: None (PiJoules)

<details>
<summary>Changes</summary>

This is the followup implementation to
https://github.com/riscv-non-isa/riscv-elf-psabi-doc/pull/402 that supports this relocation in llvm and lld.

---
Full diff: https://github.com/llvm/llvm-project/pull/72587.diff


5 Files Affected:

- (modified) lld/ELF/Arch/RISCV.cpp (+2) 
- (added) lld/test/ELF/riscv64-reloc-got32_pcrel.s (+35) 
- (modified) llvm/include/llvm/BinaryFormat/ELFRelocs/RISCV.def (+1-2) 
- (modified) llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFObjectWriter.cpp (+2) 
- (added) llvm/test/MC/RISCV/elf-reloc-got32_pcrel.s (+14) 


``````````diff
diff --git a/lld/ELF/Arch/RISCV.cpp b/lld/ELF/Arch/RISCV.cpp
index 6413dcd7dcd7976..7567703bb5ce648 100644
--- a/lld/ELF/Arch/RISCV.cpp
+++ b/lld/ELF/Arch/RISCV.cpp
@@ -289,6 +289,7 @@ RelExpr RISCV::getRelExpr(const RelType type, const Symbol &s,
   case R_RISCV_PLT32:
     return R_PLT_PC;
   case R_RISCV_GOT_HI20:
+  case R_RISCV_GOT32_PCREL:
     return R_GOT_PC;
   case R_RISCV_PCREL_LO12_I:
   case R_RISCV_PCREL_LO12_S:
@@ -495,6 +496,7 @@ void RISCV::relocate(uint8_t *loc, const Relocation &rel, uint64_t val) const {
   case R_RISCV_SET32:
   case R_RISCV_32_PCREL:
   case R_RISCV_PLT32:
+  case R_RISCV_GOT32_PCREL:
     write32le(loc, val);
     return;
 
diff --git a/lld/test/ELF/riscv64-reloc-got32_pcrel.s b/lld/test/ELF/riscv64-reloc-got32_pcrel.s
new file mode 100644
index 000000000000000..e9a7849ff847689
--- /dev/null
+++ b/lld/test/ELF/riscv64-reloc-got32_pcrel.s
@@ -0,0 +1,35 @@
+// REQUIRES: riscv
+// RUN: llvm-mc -filetype=obj -triple=riscv64 %s -o %t.o
+// RUN: ld.lld %t.o -o %t.so -shared
+// RUN: llvm-readobj -S %t.so | FileCheck --check-prefix=SEC %s
+// RUN: llvm-objdump --no-print-imm-hex -s -d %t.so | FileCheck %s
+
+
+// SEC:         Name: .got (58)
+// SEC-NEXT:    Type: SHT_PROGBITS (0x1)
+// SEC-NEXT:    Flags [ (0x3)
+// SEC-NEXT:      SHF_ALLOC (0x2)
+// SEC-NEXT:      SHF_WRITE (0x1)
+// SEC-NEXT:    ]
+// SEC-NEXT:    Address: 0x2350
+// SEC-NEXT:    Offset: 0x350
+// SEC-NEXT:    Size: 16
+// SEC-NEXT:    Link: 0
+// SEC-NEXT:    Info: 0
+// SEC-NEXT:    AddressAlignment: 8
+// SEC-NEXT:    EntrySize: 0
+
+  .section .data
+  .globl bar
+bar:
+
+  .globl _start
+_start:
+// bar at GOTPCREL   = 0x2350 (got entry for `bar`) - 0x3360 (.) = 0xffffeff0
+// bar at GOTPCREL+4 = 0x2350 (got entry for `bar`) - 0x3364 (.) + 4 = 0xffffeff0
+// bar at GOTPCREL-4 = 0x2350 (got entry for `bar`) - 0x3368 (.) + 4 = 0xffffefe4
+// CHECK: Contents of section .data:
+//  3360 f0efffff f0efffff e4efffff
+  .word bar at GOTPCREL
+  .word bar at GOTPCREL+4
+  .word bar at GOTPCREL-4
diff --git a/llvm/include/llvm/BinaryFormat/ELFRelocs/RISCV.def b/llvm/include/llvm/BinaryFormat/ELFRelocs/RISCV.def
index c7fd6490041cd1d..b478799c91fb2f7 100644
--- a/llvm/include/llvm/BinaryFormat/ELFRelocs/RISCV.def
+++ b/llvm/include/llvm/BinaryFormat/ELFRelocs/RISCV.def
@@ -40,8 +40,7 @@ ELF_RELOC(R_RISCV_SUB8,              37)
 ELF_RELOC(R_RISCV_SUB16,             38)
 ELF_RELOC(R_RISCV_SUB32,             39)
 ELF_RELOC(R_RISCV_SUB64,             40)
-ELF_RELOC(R_RISCV_GNU_VTINHERIT,     41)
-ELF_RELOC(R_RISCV_GNU_VTENTRY,       42)
+ELF_RELOC(R_RISCV_GOT32_PCREL,       41)
 ELF_RELOC(R_RISCV_ALIGN,             43)
 ELF_RELOC(R_RISCV_RVC_BRANCH,        44)
 ELF_RELOC(R_RISCV_RVC_JUMP,          45)
diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFObjectWriter.cpp b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFObjectWriter.cpp
index 0799267eaf7c769..76e5b3ed402543b 100644
--- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFObjectWriter.cpp
+++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFObjectWriter.cpp
@@ -106,6 +106,8 @@ unsigned RISCVELFObjectWriter::getRelocType(MCContext &Ctx,
     if (Expr->getKind() == MCExpr::Target &&
         cast<RISCVMCExpr>(Expr)->getKind() == RISCVMCExpr::VK_RISCV_32_PCREL)
       return ELF::R_RISCV_32_PCREL;
+    if (Target.getSymA()->getKind() == MCSymbolRefExpr::VK_GOTPCREL)
+      return ELF::R_RISCV_GOT32_PCREL;
     return ELF::R_RISCV_32;
   case FK_Data_8:
     return ELF::R_RISCV_64;
diff --git a/llvm/test/MC/RISCV/elf-reloc-got32_pcrel.s b/llvm/test/MC/RISCV/elf-reloc-got32_pcrel.s
new file mode 100644
index 000000000000000..32a1d57fb536091
--- /dev/null
+++ b/llvm/test/MC/RISCV/elf-reloc-got32_pcrel.s
@@ -0,0 +1,14 @@
+// RUN: llvm-mc -triple=riscv64 -filetype=obj %s -o - | \
+// RUN:   llvm-readobj -r - | FileCheck %s
+
+        .section .data
+this:
+        .word this at GOTPCREL
+        .word extern_sym at GOTPCREL+4
+        .word negative_offset at GOTPCREL-4
+
+// CHECK:      Section ({{.*}}) .rela.data
+// CHECK-NEXT:   0x0 R_RISCV_GOT32_PCREL this 0x0
+// CHECK-NEXT:   0x4 R_RISCV_GOT32_PCREL extern_sym 0x4
+// CHECK-NEXT:   0x8 R_RISCV_GOT32_PCREL negative_offset 0xFFFFFFFFFFFFFFFC
+// CHECK-NEXT: }

``````````

</details>


https://github.com/llvm/llvm-project/pull/72587


More information about the llvm-commits mailing list