[llvm] 4418a8e - [SPARC] Add llvm-readobj support, update ELF reloc types and dynamic tags. (#137916)

via llvm-commits llvm-commits at lists.llvm.org
Mon May 5 08:39:35 PDT 2025


Author: Alex Rønne Petersen
Date: 2025-05-05T17:39:31+02:00
New Revision: 4418a8e5ef865bc5062a338697ddd44b14c8005d

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

LOG: [SPARC] Add llvm-readobj support, update ELF reloc types and dynamic tags. (#137916)

Values sourced from binutils.

Added: 
    llvm/test/tools/llvm-readobj/ELF/reloc-types-sparcv9.test

Modified: 
    llvm/include/llvm/BinaryFormat/DynamicTags.def
    llvm/include/llvm/BinaryFormat/ELFRelocs/Sparc.def
    llvm/lib/ObjectYAML/ELFYAML.cpp
    llvm/test/tools/llvm-readobj/ELF/dynamic-tags-machine-specific.test

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/BinaryFormat/DynamicTags.def b/llvm/include/llvm/BinaryFormat/DynamicTags.def
index 2d4596c81ba87..1e9b87e1e58a7 100644
--- a/llvm/include/llvm/BinaryFormat/DynamicTags.def
+++ b/llvm/include/llvm/BinaryFormat/DynamicTags.def
@@ -36,6 +36,11 @@
 #define RISCV_DYNAMIC_TAG_DEFINED
 #endif
 
+#ifndef SPARC_DYNAMIC_TAG
+#define SPARC_DYNAMIC_TAG(name, value) DYNAMIC_TAG(name, value)
+#define SPARC_DYNAMIC_TAG_DEFINED
+#endif
+
 #ifndef DYNAMIC_TAG_MARKER
 #define DYNAMIC_TAG_MARKER(name, value) DYNAMIC_TAG(name, value)
 #define DYNAMIC_TAG_MARKER_DEFINED
@@ -239,6 +244,10 @@ PPC64_DYNAMIC_TAG(PPC64_OPT, 0x70000003) // Flags to control optimizations
 // RISC-V specific dynamic array tags.
 RISCV_DYNAMIC_TAG(RISCV_VARIANT_CC, 0x70000001)
 
+// SPARC specific dynamic table entry tags.
+
+SPARC_DYNAMIC_TAG(SPARC_REGISTER, 0x70000001)
+
 // Sun machine-independent extensions.
 DYNAMIC_TAG(AUXILIARY, 0x7FFFFFFD) // Shared object to load before self
 DYNAMIC_TAG(USED, 0x7FFFFFFE)      // Same as DT_NEEDED

diff  --git a/llvm/include/llvm/BinaryFormat/ELFRelocs/Sparc.def b/llvm/include/llvm/BinaryFormat/ELFRelocs/Sparc.def
index 7e01a4a8a0a06..00194bc2e7200 100644
--- a/llvm/include/llvm/BinaryFormat/ELFRelocs/Sparc.def
+++ b/llvm/include/llvm/BinaryFormat/ELFRelocs/Sparc.def
@@ -87,3 +87,8 @@ ELF_RELOC(R_SPARC_GOTDATA_LOX10,  81)
 ELF_RELOC(R_SPARC_GOTDATA_OP_HIX22,  82)
 ELF_RELOC(R_SPARC_GOTDATA_OP_LOX10,  83)
 ELF_RELOC(R_SPARC_GOTDATA_OP,     84)
+ELF_RELOC(R_SPARC_H34,            85)
+ELF_RELOC(R_SPARC_SIZE32,         86)
+ELF_RELOC(R_SPARC_SIZE64,         87)
+ELF_RELOC(R_SPARC_WDISP10,        88)
+ELF_RELOC(R_SPARC_IRELATIVE,      249)

diff  --git a/llvm/lib/ObjectYAML/ELFYAML.cpp b/llvm/lib/ObjectYAML/ELFYAML.cpp
index 1f970739c1e7e..520e956fdab9f 100644
--- a/llvm/lib/ObjectYAML/ELFYAML.cpp
+++ b/llvm/lib/ObjectYAML/ELFYAML.cpp
@@ -953,6 +953,9 @@ void ScalarEnumerationTraits<ELFYAML::ELF_REL>::enumeration(
   case ELF::EM_PPC64:
 #include "llvm/BinaryFormat/ELFRelocs/PowerPC64.def"
     break;
+  case ELF::EM_SPARCV9:
+#include "llvm/BinaryFormat/ELFRelocs/Sparc.def"
+    break;
   case ELF::EM_68K:
 #include "llvm/BinaryFormat/ELFRelocs/M68k.def"
     break;
@@ -1029,6 +1032,13 @@ void ScalarEnumerationTraits<ELFYAML::ELF_DYNTAG>::enumeration(
 #undef RISCV_DYNAMIC_TAG
 #define RISCV_DYNAMIC_TAG(name, value)
     break;
+  case ELF::EM_SPARCV9:
+#undef SPARC_DYNAMIC_TAG
+#define SPARC_DYNAMIC_TAG(name, value) DYNAMIC_TAG(name, value)
+#include "llvm/BinaryFormat/DynamicTags.def"
+#undef SPARC_DYNAMIC_TAG
+#define SPARC_DYNAMIC_TAG(name, value)
+    break;
   default:
 #include "llvm/BinaryFormat/DynamicTags.def"
     break;

diff  --git a/llvm/test/tools/llvm-readobj/ELF/dynamic-tags-machine-specific.test b/llvm/test/tools/llvm-readobj/ELF/dynamic-tags-machine-specific.test
index e7bd9cf9b48b2..9a338a852ffe7 100644
--- a/llvm/test/tools/llvm-readobj/ELF/dynamic-tags-machine-specific.test
+++ b/llvm/test/tools/llvm-readobj/ELF/dynamic-tags-machine-specific.test
@@ -445,3 +445,41 @@ ProgramHeaders:
   - Type:     PT_DYNAMIC
     FirstSec: .dynamic
     LastSec:  .dynamic
+
+## Case 7: Test that SPARCV9 machine-specific tags can be dumped.
+# RUN: yaml2obj --docnum=7 %s -o %t.sparcv9
+# RUN: llvm-readobj --dynamic-table %t.sparcv9 | FileCheck %s --check-prefix=LLVM-SPARCV9
+# RUN: llvm-readelf --dynamic-table %t.sparcv9 | FileCheck %s --check-prefix=GNU-SPARCV9
+
+# LLVM-SPARCV9:      DynamicSection [ (2 entries)
+# LLVM-SPARCV9-NEXT:   Tag        Type                      Name/Value
+# LLVM-SPARCV9-NEXT:   0x0000000070000001 SPARC_REGISTER    0x12345
+# LLVM-SPARCV9-NEXT:   0x0000000000000000 NULL              0x0
+# LLVM-SPARCV9-NEXT: ]
+
+# GNU-SPARCV9:      Dynamic section at offset {{.*}} contains 2 entries:
+# GNU-SPARCV9-NEXT:  Tag        Type                       Name/Value
+# GNU-SPARCV9-NEXT:  0x0000000070000001 (SPARC_REGISTER)   0x12345
+# GNU-SPARCV9-NEXT:  0x0000000000000000 (NULL)             0x0
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2MSB
+  Type:    ET_EXEC
+  Machine: EM_SPARCV9
+Sections:
+  - Name: .dynamic
+    Type: SHT_DYNAMIC
+    Entries:
+      - Tag:   DT_SPARC_REGISTER
+        Value: 0x12345
+      - Tag:   DT_NULL
+        Value: 0
+ProgramHeaders:
+  - Type:     PT_LOAD
+    FirstSec: .dynamic
+    LastSec:  .dynamic
+  - Type:     PT_DYNAMIC
+    FirstSec: .dynamic
+    LastSec:  .dynamic

diff  --git a/llvm/test/tools/llvm-readobj/ELF/reloc-types-sparcv9.test b/llvm/test/tools/llvm-readobj/ELF/reloc-types-sparcv9.test
new file mode 100644
index 0000000000000..e93a289eabc58
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/reloc-types-sparcv9.test
@@ -0,0 +1,195 @@
+## Test that llvm-readobj shows proper relocation type
+## names and values for sparcv9 target.
+
+# RUN: yaml2obj %s -o %t-sparcv9.o
+# RUN: llvm-readobj -r --expand-relocs %t-sparcv9.o | FileCheck %s
+
+# CHECK: Type: R_SPARC_NONE (0)
+# CHECK: Type: R_SPARC_8 (1)
+# CHECK: Type: R_SPARC_16 (2)
+# CHECK: Type: R_SPARC_32 (3)
+# CHECK: Type: R_SPARC_DISP8 (4)
+# CHECK: Type: R_SPARC_DISP16 (5)
+# CHECK: Type: R_SPARC_DISP32 (6)
+# CHECK: Type: R_SPARC_WDISP30 (7)
+# CHECK: Type: R_SPARC_WDISP22 (8)
+# CHECK: Type: R_SPARC_HI22 (9)
+# CHECK: Type: R_SPARC_22 (10)
+# CHECK: Type: R_SPARC_13 (11)
+# CHECK: Type: R_SPARC_LO10 (12)
+# CHECK: Type: R_SPARC_GOT10 (13)
+# CHECK: Type: R_SPARC_GOT13 (14)
+# CHECK: Type: R_SPARC_GOT22 (15)
+# CHECK: Type: R_SPARC_PC10 (16)
+# CHECK: Type: R_SPARC_PC22 (17)
+# CHECK: Type: R_SPARC_WPLT30 (18)
+# CHECK: Type: R_SPARC_COPY (19)
+# CHECK: Type: R_SPARC_GLOB_DAT (20)
+# CHECK: Type: R_SPARC_JMP_SLOT (21)
+# CHECK: Type: R_SPARC_RELATIVE (22)
+# CHECK: Type: R_SPARC_UA32 (23)
+# CHECK: Type: R_SPARC_PLT32 (24)
+# CHECK: Type: R_SPARC_HIPLT22 (25)
+# CHECK: Type: R_SPARC_LOPLT10 (26)
+# CHECK: Type: R_SPARC_PCPLT32 (27)
+# CHECK: Type: R_SPARC_PCPLT22 (28)
+# CHECK: Type: R_SPARC_PCPLT10 (29)
+# CHECK: Type: R_SPARC_10 (30)
+# CHECK: Type: R_SPARC_11 (31)
+# CHECK: Type: R_SPARC_64 (32)
+# CHECK: Type: R_SPARC_OLO10 (33)
+# CHECK: Type: R_SPARC_HH22 (34)
+# CHECK: Type: R_SPARC_HM10 (35)
+# CHECK: Type: R_SPARC_LM22 (36)
+# CHECK: Type: R_SPARC_PC_HH22 (37)
+# CHECK: Type: R_SPARC_PC_HM10 (38)
+# CHECK: Type: R_SPARC_PC_LM22 (39)
+# CHECK: Type: R_SPARC_WDISP16 (40)
+# CHECK: Type: R_SPARC_WDISP19 (41)
+# CHECK: Type: R_SPARC_7 (43)
+# CHECK: Type: R_SPARC_5 (44)
+# CHECK: Type: R_SPARC_6 (45)
+# CHECK: Type: R_SPARC_DISP64 (46)
+# CHECK: Type: R_SPARC_PLT64 (47)
+# CHECK: Type: R_SPARC_HIX22 (48)
+# CHECK: Type: R_SPARC_LOX10 (49)
+# CHECK: Type: R_SPARC_H44 (50)
+# CHECK: Type: R_SPARC_M44 (51)
+# CHECK: Type: R_SPARC_L44 (52)
+# CHECK: Type: R_SPARC_REGISTER (53)
+# CHECK: Type: R_SPARC_UA64 (54)
+# CHECK: Type: R_SPARC_UA16 (55)
+# CHECK: Type: R_SPARC_TLS_GD_HI22 (56)
+# CHECK: Type: R_SPARC_TLS_GD_LO10 (57)
+# CHECK: Type: R_SPARC_TLS_GD_ADD (58)
+# CHECK: Type: R_SPARC_TLS_GD_CALL (59)
+# CHECK: Type: R_SPARC_TLS_LDM_HI22 (60)
+# CHECK: Type: R_SPARC_TLS_LDM_LO10 (61)
+# CHECK: Type: R_SPARC_TLS_LDM_ADD (62)
+# CHECK: Type: R_SPARC_TLS_LDM_CALL (63)
+# CHECK: Type: R_SPARC_TLS_LDO_HIX22 (64)
+# CHECK: Type: R_SPARC_TLS_LDO_LOX10 (65)
+# CHECK: Type: R_SPARC_TLS_LDO_ADD (66)
+# CHECK: Type: R_SPARC_TLS_IE_HI22 (67)
+# CHECK: Type: R_SPARC_TLS_IE_LO10 (68)
+# CHECK: Type: R_SPARC_TLS_IE_LD (69)
+# CHECK: Type: R_SPARC_TLS_IE_LDX (70)
+# CHECK: Type: R_SPARC_TLS_IE_ADD (71)
+# CHECK: Type: R_SPARC_TLS_LE_HIX22 (72)
+# CHECK: Type: R_SPARC_TLS_LE_LOX10 (73)
+# CHECK: Type: R_SPARC_TLS_DTPMOD32 (74)
+# CHECK: Type: R_SPARC_TLS_DTPMOD64 (75)
+# CHECK: Type: R_SPARC_TLS_DTPOFF32 (76)
+# CHECK: Type: R_SPARC_TLS_DTPOFF64 (77)
+# CHECK: Type: R_SPARC_TLS_TPOFF32 (78)
+# CHECK: Type: R_SPARC_TLS_TPOFF64 (79)
+# CHECK: Type: R_SPARC_GOTDATA_HIX22 (80)
+# CHECK: Type: R_SPARC_GOTDATA_LOX10 (81)
+# CHECK: Type: R_SPARC_GOTDATA_OP_HIX22 (82)
+# CHECK: Type: R_SPARC_GOTDATA_OP_LOX10 (83)
+# CHECK: Type: R_SPARC_GOTDATA_OP (84)
+# CHECK: Type: R_SPARC_H34 (85)
+# CHECK: Type: R_SPARC_SIZE32 (86)
+# CHECK: Type: R_SPARC_SIZE64 (87)
+# CHECK: Type: R_SPARC_WDISP10 (88)
+# CHECK: Type: R_SPARC_IRELATIVE (249)
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2MSB
+  Type:    ET_REL
+  Machine: EM_SPARCV9
+Sections:
+  - Name: .rela.text
+    Type: SHT_RELA
+    Relocations:
+      - Type: R_SPARC_NONE
+      - Type: R_SPARC_8
+      - Type: R_SPARC_16
+      - Type: R_SPARC_32
+      - Type: R_SPARC_DISP8
+      - Type: R_SPARC_DISP16
+      - Type: R_SPARC_DISP32
+      - Type: R_SPARC_WDISP30
+      - Type: R_SPARC_WDISP22
+      - Type: R_SPARC_HI22
+      - Type: R_SPARC_22
+      - Type: R_SPARC_13
+      - Type: R_SPARC_LO10
+      - Type: R_SPARC_GOT10
+      - Type: R_SPARC_GOT13
+      - Type: R_SPARC_GOT22
+      - Type: R_SPARC_PC10
+      - Type: R_SPARC_PC22
+      - Type: R_SPARC_WPLT30
+      - Type: R_SPARC_COPY
+      - Type: R_SPARC_GLOB_DAT
+      - Type: R_SPARC_JMP_SLOT
+      - Type: R_SPARC_RELATIVE
+      - Type: R_SPARC_UA32
+      - Type: R_SPARC_PLT32
+      - Type: R_SPARC_HIPLT22
+      - Type: R_SPARC_LOPLT10
+      - Type: R_SPARC_PCPLT32
+      - Type: R_SPARC_PCPLT22
+      - Type: R_SPARC_PCPLT10
+      - Type: R_SPARC_10
+      - Type: R_SPARC_11
+      - Type: R_SPARC_64
+      - Type: R_SPARC_OLO10
+      - Type: R_SPARC_HH22
+      - Type: R_SPARC_HM10
+      - Type: R_SPARC_LM22
+      - Type: R_SPARC_PC_HH22
+      - Type: R_SPARC_PC_HM10
+      - Type: R_SPARC_PC_LM22
+      - Type: R_SPARC_WDISP16
+      - Type: R_SPARC_WDISP19
+      - Type: R_SPARC_7
+      - Type: R_SPARC_5
+      - Type: R_SPARC_6
+      - Type: R_SPARC_DISP64
+      - Type: R_SPARC_PLT64
+      - Type: R_SPARC_HIX22
+      - Type: R_SPARC_LOX10
+      - Type: R_SPARC_H44
+      - Type: R_SPARC_M44
+      - Type: R_SPARC_L44
+      - Type: R_SPARC_REGISTER
+      - Type: R_SPARC_UA64
+      - Type: R_SPARC_UA16
+      - Type: R_SPARC_TLS_GD_HI22
+      - Type: R_SPARC_TLS_GD_LO10
+      - Type: R_SPARC_TLS_GD_ADD
+      - Type: R_SPARC_TLS_GD_CALL
+      - Type: R_SPARC_TLS_LDM_HI22
+      - Type: R_SPARC_TLS_LDM_LO10
+      - Type: R_SPARC_TLS_LDM_ADD
+      - Type: R_SPARC_TLS_LDM_CALL
+      - Type: R_SPARC_TLS_LDO_HIX22
+      - Type: R_SPARC_TLS_LDO_LOX10
+      - Type: R_SPARC_TLS_LDO_ADD
+      - Type: R_SPARC_TLS_IE_HI22
+      - Type: R_SPARC_TLS_IE_LO10
+      - Type: R_SPARC_TLS_IE_LD
+      - Type: R_SPARC_TLS_IE_LDX
+      - Type: R_SPARC_TLS_IE_ADD
+      - Type: R_SPARC_TLS_LE_HIX22
+      - Type: R_SPARC_TLS_LE_LOX10
+      - Type: R_SPARC_TLS_DTPMOD32
+      - Type: R_SPARC_TLS_DTPMOD64
+      - Type: R_SPARC_TLS_DTPOFF32
+      - Type: R_SPARC_TLS_DTPOFF64
+      - Type: R_SPARC_TLS_TPOFF32
+      - Type: R_SPARC_TLS_TPOFF64
+      - Type: R_SPARC_GOTDATA_HIX22
+      - Type: R_SPARC_GOTDATA_LOX10
+      - Type: R_SPARC_GOTDATA_OP_HIX22
+      - Type: R_SPARC_GOTDATA_OP_LOX10
+      - Type: R_SPARC_GOTDATA_OP
+      - Type: R_SPARC_H34
+      - Type: R_SPARC_SIZE32
+      - Type: R_SPARC_SIZE64
+      - Type: R_SPARC_WDISP10
+      - Type: R_SPARC_IRELATIVE


        


More information about the llvm-commits mailing list