[lld] df97922 - [ELF] Implement getImplicitAddend and enable checkDynamicRelocsDefault for AMDGPU

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 15 22:59:13 PDT 2023


Author: Fangrui Song
Date: 2023-09-15T22:59:08-07:00
New Revision: df979228ef46caa23f0dff1e6a2c8948d45513bf

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

LOG: [ELF] Implement getImplicitAddend and enable checkDynamicRelocsDefault for AMDGPU

Added: 
    

Modified: 
    lld/ELF/Arch/AMDGPU.cpp
    lld/ELF/Driver.cpp
    lld/test/ELF/amdgpu-relocs.s

Removed: 
    


################################################################################
diff  --git a/lld/ELF/Arch/AMDGPU.cpp b/lld/ELF/Arch/AMDGPU.cpp
index e5605497e27220e..650744db7dee32b 100644
--- a/lld/ELF/Arch/AMDGPU.cpp
+++ b/lld/ELF/Arch/AMDGPU.cpp
@@ -34,6 +34,7 @@ class AMDGPU 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;
 };
 } // namespace
 
@@ -183,6 +184,20 @@ RelType AMDGPU::getDynRel(RelType type) const {
   return R_AMDGPU_NONE;
 }
 
+int64_t AMDGPU::getImplicitAddend(const uint8_t *buf, RelType type) const {
+  switch (type) {
+  case R_AMDGPU_NONE:
+    return 0;
+  case R_AMDGPU_ABS64:
+  case R_AMDGPU_RELATIVE64:
+    return read64(buf);
+  default:
+    internalLinkerError(getErrorLocation(buf),
+                        "cannot read addend for relocation " + toString(type));
+    return 0;
+  }
+}
+
 TargetInfo *elf::getAMDGPUTargetInfo() {
   static AMDGPU target;
   return ⌖

diff  --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp
index f64b806aec986c9..e08edc83d108f01 100644
--- a/lld/ELF/Driver.cpp
+++ b/lld/ELF/Driver.cpp
@@ -1713,8 +1713,7 @@ static void setConfigs(opt::InputArgList &args) {
   // enable the debug checks for all targets, but currently not all targets
   // have support for reading Elf_Rel addends, so we only enable for a subset.
 #ifndef NDEBUG
-  bool checkDynamicRelocsDefault =
-      !llvm::is_contained({EM_AMDGPU, EM_HEXAGON}, m);
+  bool checkDynamicRelocsDefault = m != EM_HEXAGON;
 #else
   bool checkDynamicRelocsDefault = false;
 #endif

diff  --git a/lld/test/ELF/amdgpu-relocs.s b/lld/test/ELF/amdgpu-relocs.s
index 2de7d9ae306f71a..f0a75130d69dc46 100644
--- a/lld/test/ELF/amdgpu-relocs.s
+++ b/lld/test/ELF/amdgpu-relocs.s
@@ -5,6 +5,9 @@
 # RUN: llvm-nm %t.so | FileCheck %s --check-prefix=NM
 # RUN: llvm-readelf -x .rodata -x nonalloc %t.so | FileCheck %s --check-prefix=HEX
 
+## ABS64 and RELATIVE64 relocs do not cause --check-dynamic-relocations errors.
+# RUN: ld.lld --hash-style=sysv -shared %t.o -o /dev/null --apply-dynamic-relocs
+
 .text
 
 kernel0:


        


More information about the llvm-commits mailing list