[llvm-branch-commits] [lld] ff421be - [ELF] Support R_PPC_NONE/R_PPC64_NONE in getImplicitAddend

Fangrui Song via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Fri Feb 4 15:16:44 PST 2022


Author: Fangrui Song
Date: 2022-02-04T15:16:30-08:00
New Revision: ff421befd25827223952913d58e90d56e7779eb6

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

LOG: [ELF] Support R_PPC_NONE/R_PPC64_NONE in getImplicitAddend

Similar to f457863ae345d2635026501f5383e0e625869639

(cherry picked from commit 53fc5d9b9a0110f097c6e9f7aa3bff3621eaf268)

Added: 
    

Modified: 
    lld/ELF/Arch/PPC.cpp
    lld/ELF/Arch/PPC64.cpp
    lld/test/ELF/relocation-none.test

Removed: 
    


################################################################################
diff  --git a/lld/ELF/Arch/PPC.cpp b/lld/ELF/Arch/PPC.cpp
index 97e4d66331381..315ac7df608d0 100644
--- a/lld/ELF/Arch/PPC.cpp
+++ b/lld/ELF/Arch/PPC.cpp
@@ -30,6 +30,7 @@ class PPC final : public TargetInfo {
   RelExpr getRelExpr(RelType type, const Symbol &s,
                      const uint8_t *loc) const override;
   RelType getDynRel(RelType type) const override;
+  int64_t getImplicitAddend(const uint8_t *buf, RelType type) const override;
   void writeGotHeader(uint8_t *buf) const override;
   void writePltHeader(uint8_t *buf) const override {
     llvm_unreachable("should call writePPC32GlinkSection() instead");
@@ -275,6 +276,17 @@ RelType PPC::getDynRel(RelType type) const {
   return R_PPC_NONE;
 }
 
+int64_t PPC::getImplicitAddend(const uint8_t *buf, RelType type) const {
+  switch (type) {
+  case R_PPC_NONE:
+    return 0;
+  default:
+    internalLinkerError(getErrorLocation(buf),
+                        "cannot read addend for relocation " + toString(type));
+    return 0;
+  }
+}
+
 static std::pair<RelType, uint64_t> fromDTPREL(RelType type, uint64_t val) {
   uint64_t dtpBiasedVal = val - 0x8000;
   switch (type) {

diff  --git a/lld/ELF/Arch/PPC64.cpp b/lld/ELF/Arch/PPC64.cpp
index d9e4fc97ea0be..c083484f42804 100644
--- a/lld/ELF/Arch/PPC64.cpp
+++ b/lld/ELF/Arch/PPC64.cpp
@@ -363,6 +363,7 @@ class PPC64 final : public TargetInfo {
   RelExpr getRelExpr(RelType type, const Symbol &s,
                      const uint8_t *loc) const override;
   RelType getDynRel(RelType type) const override;
+  int64_t getImplicitAddend(const uint8_t *buf, RelType type) const override;
   void writePltHeader(uint8_t *buf) const override;
   void writePlt(uint8_t *buf, const Symbol &sym,
                 uint64_t pltEntryAddr) const override;
@@ -1059,6 +1060,17 @@ RelType PPC64::getDynRel(RelType type) const {
   return R_PPC64_NONE;
 }
 
+int64_t PPC64::getImplicitAddend(const uint8_t *buf, RelType type) const {
+  switch (type) {
+  case R_PPC64_NONE:
+    return 0;
+  default:
+    internalLinkerError(getErrorLocation(buf),
+                        "cannot read addend for relocation " + toString(type));
+    return 0;
+  }
+}
+
 void PPC64::writeGotHeader(uint8_t *buf) const {
   write64(buf, getPPC64TocBase());
 }

diff  --git a/lld/test/ELF/relocation-none.test b/lld/test/ELF/relocation-none.test
index a9ba6402ae8de..4e808cc67c0d1 100644
--- a/lld/test/ELF/relocation-none.test
+++ b/lld/test/ELF/relocation-none.test
@@ -15,6 +15,14 @@
 # RUN: ld.lld -r %t.o -o %t
 # RUN: llvm-readobj -r %t | FileCheck --check-prefix=RELOC %s
 
+# RUN: yaml2obj -DBITS=32 -DMACHINE=PPC %s -o %t.o
+# RUN: ld.lld -r %t.o -o %t
+# RUN: llvm-readobj -r %t | FileCheck --check-prefix=RELOC %s
+
+# RUN: yaml2obj -DMACHINE=PPC64 %s -o %t.o
+# RUN: ld.lld -r %t.o -o %t
+# RUN: llvm-readobj -r %t | FileCheck --check-prefix=RELOC %s
+
 # RUN: yaml2obj -DMACHINE=RISCV %s -o %t.o
 # RUN: ld.lld -r %t.o -o %t
 # RUN: llvm-readobj -r %t | FileCheck --check-prefix=RELOC %s


        


More information about the llvm-branch-commits mailing list