[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