[PATCH] D143226: [llvm][RISCV] Introduce handling for R_RISCV_PLT32 relocation

Leonard Chan via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Feb 2 15:52:03 PST 2023


leonardchan created this revision.
leonardchan added reviewers: phosek, mcgrathr, MaskRay.
Herald added subscribers: luke, VincentWu, vkmr, frasercrmck, evandro, luismarques, apazos, sameer.abuasal, s.egerton, Jim, benna, psnobl, jocewei, PkmX, the_o, brucehoult, MartinMosbeck, rogfer01, edward-jones, zzheng, shiva0217, kito-cheng, niosHD, sabuasal, simoncook, johnrusso, rbar, asb, hiraditya, arichardson.
Herald added a project: All.
leonardchan requested review of this revision.
Herald added subscribers: llvm-commits, pcwang-thead, eopXD.
Herald added a project: LLVM.

This introduces R_RISCV_PLT32, a pc-relative relocation that takes the offset to a function (or its plt entry) from the reloc's location.

This is needed to support relative vtables on RISCV.

Github PR: https://github.com/riscv-non-isa/riscv-elf-psabi-doc/pull/363

The lld handling of this reloc is D143115 <https://reviews.llvm.org/D143115>.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D143226

Files:
  llvm/include/llvm/BinaryFormat/ELFRelocs/RISCV.def
  llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFObjectWriter.cpp
  llvm/lib/Target/RISCV/RISCVTargetObjectFile.cpp
  llvm/test/MC/RISCV/elf-reloc-plt32.s


Index: llvm/test/MC/RISCV/elf-reloc-plt32.s
===================================================================
--- /dev/null
+++ llvm/test/MC/RISCV/elf-reloc-plt32.s
@@ -0,0 +1,10 @@
+# RUN: llvm-mc -triple=riscv64 -filetype=obj %s -o - | \
+# RUN:   llvm-readobj -r - | FileCheck %s
+
+  .section .data
+this:
+  .word extern_func at PLT - . + 4
+
+# CHECK:      Section ({{.*}}) .rela.data {
+# CHECK-NEXT:   0x0 R_RISCV_PLT32 extern_func 0x4
+# CHECK-NEXT: }
Index: llvm/lib/Target/RISCV/RISCVTargetObjectFile.cpp
===================================================================
--- llvm/lib/Target/RISCV/RISCVTargetObjectFile.cpp
+++ llvm/lib/Target/RISCV/RISCVTargetObjectFile.cpp
@@ -18,6 +18,8 @@
                                           const TargetMachine &TM) {
   TargetLoweringObjectFileELF::Initialize(Ctx, TM);
 
+  PLTRelativeVariantKind = MCSymbolRefExpr::VK_PLT;
+
   SmallDataSection = getContext().getELFSection(
       ".sdata", ELF::SHT_PROGBITS, ELF::SHF_WRITE | ELF::SHF_ALLOC);
   SmallBSSSection = getContext().getELFSection(".sbss", ELF::SHT_NOBITS,
Index: llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFObjectWriter.cpp
===================================================================
--- llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFObjectWriter.cpp
+++ llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFObjectWriter.cpp
@@ -13,6 +13,7 @@
 #include "llvm/MC/MCELFObjectWriter.h"
 #include "llvm/MC/MCFixup.h"
 #include "llvm/MC/MCObjectWriter.h"
+#include "llvm/MC/MCValue.h"
 #include "llvm/Support/ErrorHandling.h"
 
 using namespace llvm;
@@ -61,7 +62,9 @@
       return ELF::R_RISCV_NONE;
     case FK_Data_4:
     case FK_PCRel_4:
-      return ELF::R_RISCV_32_PCREL;
+      return Target.getAccessVariant() == MCSymbolRefExpr::VK_PLT
+                 ? ELF::R_RISCV_PLT32
+                 : ELF::R_RISCV_32_PCREL;
     case RISCV::fixup_riscv_pcrel_hi20:
       return ELF::R_RISCV_PCREL_HI20;
     case RISCV::fixup_riscv_pcrel_lo12_i:
Index: llvm/include/llvm/BinaryFormat/ELFRelocs/RISCV.def
===================================================================
--- llvm/include/llvm/BinaryFormat/ELFRelocs/RISCV.def
+++ llvm/include/llvm/BinaryFormat/ELFRelocs/RISCV.def
@@ -54,3 +54,4 @@
 ELF_RELOC(R_RISCV_SET32,             56)
 ELF_RELOC(R_RISCV_32_PCREL,          57)
 ELF_RELOC(R_RISCV_IRELATIVE,         58)
+ELF_RELOC(R_RISCV_PLT32,             59)


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D143226.494457.patch
Type: text/x-patch
Size: 2388 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230202/0d61eab1/attachment.bin>


More information about the llvm-commits mailing list