[PATCH] D127549: RISCV: handle 64-bit PCREL data relocations

Saleem Abdulrasool via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 13 10:21:39 PDT 2022


compnerd updated this revision to Diff 436464.
compnerd added a comment.

Apply changes from feedback from @luismarques


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D127549/new/

https://reviews.llvm.org/D127549

Files:
  llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFStreamer.cpp
  llvm/test/MC/RISCV/riscv64-64b-pcrel.s


Index: llvm/test/MC/RISCV/riscv64-64b-pcrel.s
===================================================================
--- /dev/null
+++ llvm/test/MC/RISCV/riscv64-64b-pcrel.s
@@ -0,0 +1,22 @@
+# RUN: llvm-mc -triple riscv64-unknown-linux-gnu -filetype obj -o - %s | llvm-readobj -r - | FileCheck %s
+
+# CHECK: Relocations [
+# CHECK:  .relasx {
+# CHECK-NEXT:    0x0 R_RISCV_ADD64 y 0x0
+# CHECK-NEXT:    0x0 R_RISCV_SUB64 x 0x0
+# CHECK:  }
+# CHECK:  .relasy {
+# CHECK-NEXT:    0x0 R_RISCV_ADD64 x 0x0
+# CHECK-NEXT:    0x0 R_RISCV_SUB64 y 0x0
+# CHECK:  }
+# CHECK: ]
+
+	.section	sx,"aw", at progbits
+	.global x
+x:
+	.quad y-x
+
+	.section	sy,"aw", at progbits
+	.global y
+y:
+	.quad x-y
Index: llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFStreamer.cpp
===================================================================
--- llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFStreamer.cpp
+++ llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFStreamer.cpp
@@ -207,6 +207,10 @@

   static bool requiresFixups(MCContext &C, const MCExpr *Value,
                              const MCExpr *&LHS, const MCExpr *&RHS) {
+    auto IsDebugOrEHFrameSection = [](const MCSection &S) -> bool {
+      return S.getKind().isMetadata() || S.getName() == ".eh_frame";
+    };
+
     const auto *MBE = dyn_cast<MCBinaryExpr>(Value);
     if (MBE == nullptr)
       return false;
@@ -225,10 +229,15 @@
                              MCConstantExpr::create(E.getConstant(), C), C);
     RHS = E.getSymB();

-    return (A.isInSection() ? A.getSection().hasInstructions()
-                            : !A.getName().empty()) ||
-           (B.isInSection() ? B.getSection().hasInstructions()
-                            : !B.getName().empty());
+    // TODO: when available, R_RISCV_n_PCREL should be preferred.
+
+    // Avoid pairwise relocations for symbolic difference in debug and .eh_frame
+    if (A.isInSection())
+      return !IsDebugOrEHFrameSection(A.getSection());
+    if (B.isInSection())
+      return !IsDebugOrEHFrameSection(B.getSection());
+    // as well as for absolute symbols.
+    return !A.getName().empty() || !B.getName().empty();
   }

   void reset() override {


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D127549.436464.patch
Type: text/x-patch
Size: 2156 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220613/623559cf/attachment.bin>


More information about the llvm-commits mailing list