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::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::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