[llvm] 0ddc283 - [RISCV] A at plt-B+C: emit R_RISCV_PLT32 even if A is defined

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Tue Mar 14 15:17:04 PDT 2023


Author: Fangrui Song
Date: 2023-03-14T15:16:58-07:00
New Revision: 0ddc283a29a7a2d5415a3d363396e39c262a5dc2

URL: https://github.com/llvm/llvm-project/commit/0ddc283a29a7a2d5415a3d363396e39c262a5dc2
DIFF: https://github.com/llvm/llvm-project/commit/0ddc283a29a7a2d5415a3d363396e39c262a5dc2.diff

LOG: [RISCV] A at plt-B+C: emit R_RISCV_PLT32 even if A is defined

Follow-up to D143226

Currently we incorrectly emit R_RISCV_ADD32/R_RISCV_SUB32.
Emit R_RISCV_PLT32 instead. The new behavior matches x86-64 and AArch64.

Added: 
    

Modified: 
    llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFStreamer.cpp
    llvm/test/MC/RISCV/elf-reloc-plt32.s

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFStreamer.cpp b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFStreamer.cpp
index 40f38ee1dd758..41399b231519f 100644
--- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFStreamer.cpp
+++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFStreamer.cpp
@@ -140,6 +140,10 @@ bool RISCVELFStreamer::requiresFixups(MCContext &C, const MCExpr *Value,
                              MCConstantExpr::create(E.getConstant(), C), C);
   RHS = E.getSymB();
 
+  // Avoid ADD/SUB if Kind is not VK_None, e.g. A at plt - B + C.
+  if (E.getSymA()->getKind() != MCSymbolRefExpr::VK_None)
+    return false;
+
   // If either symbol is in a text section, we need to delay the relocation
   // evaluation as relaxation may alter the size of the symbol.
   //

diff  --git a/llvm/test/MC/RISCV/elf-reloc-plt32.s b/llvm/test/MC/RISCV/elf-reloc-plt32.s
index 8f3a40d36a390..f93262a138a91 100644
--- a/llvm/test/MC/RISCV/elf-reloc-plt32.s
+++ b/llvm/test/MC/RISCV/elf-reloc-plt32.s
@@ -3,9 +3,14 @@
 # RUN: llvm-mc -triple=riscv32 -filetype=obj %s -o - \
 # RUN:   | llvm-readobj -r - | FileCheck %s
 
+.globl func
+func:
+
 .data
 .word extern_func at PLT - . + 4
+.word func at PLT - . + 8
 
 # CHECK:      Section ({{.*}}) .rela.data {
 # CHECK-NEXT:   0x0 R_RISCV_PLT32 extern_func 0x4
+# CHECK-NEXT:   0x4 R_RISCV_PLT32 func 0x8
 # CHECK-NEXT: }


        


More information about the llvm-commits mailing list