Skip to content

Commit 4418a8e

Browse files
authored
[SPARC] Add llvm-readobj support, update ELF reloc types and dynamic tags. (#137916)
Values sourced from binutils.
1 parent 44856d9 commit 4418a8e

File tree

5 files changed

+257
-0
lines changed

5 files changed

+257
-0
lines changed

llvm/include/llvm/BinaryFormat/DynamicTags.def

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@
3636
#define RISCV_DYNAMIC_TAG_DEFINED
3737
#endif
3838

39+
#ifndef SPARC_DYNAMIC_TAG
40+
#define SPARC_DYNAMIC_TAG(name, value) DYNAMIC_TAG(name, value)
41+
#define SPARC_DYNAMIC_TAG_DEFINED
42+
#endif
43+
3944
#ifndef DYNAMIC_TAG_MARKER
4045
#define DYNAMIC_TAG_MARKER(name, value) DYNAMIC_TAG(name, value)
4146
#define DYNAMIC_TAG_MARKER_DEFINED
@@ -239,6 +244,10 @@ PPC64_DYNAMIC_TAG(PPC64_OPT, 0x70000003) // Flags to control optimizations
239244
// RISC-V specific dynamic array tags.
240245
RISCV_DYNAMIC_TAG(RISCV_VARIANT_CC, 0x70000001)
241246

247+
// SPARC specific dynamic table entry tags.
248+
249+
SPARC_DYNAMIC_TAG(SPARC_REGISTER, 0x70000001)
250+
242251
// Sun machine-independent extensions.
243252
DYNAMIC_TAG(AUXILIARY, 0x7FFFFFFD) // Shared object to load before self
244253
DYNAMIC_TAG(USED, 0x7FFFFFFE) // Same as DT_NEEDED

llvm/include/llvm/BinaryFormat/ELFRelocs/Sparc.def

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,3 +87,8 @@ ELF_RELOC(R_SPARC_GOTDATA_LOX10, 81)
8787
ELF_RELOC(R_SPARC_GOTDATA_OP_HIX22, 82)
8888
ELF_RELOC(R_SPARC_GOTDATA_OP_LOX10, 83)
8989
ELF_RELOC(R_SPARC_GOTDATA_OP, 84)
90+
ELF_RELOC(R_SPARC_H34, 85)
91+
ELF_RELOC(R_SPARC_SIZE32, 86)
92+
ELF_RELOC(R_SPARC_SIZE64, 87)
93+
ELF_RELOC(R_SPARC_WDISP10, 88)
94+
ELF_RELOC(R_SPARC_IRELATIVE, 249)

llvm/lib/ObjectYAML/ELFYAML.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -953,6 +953,9 @@ void ScalarEnumerationTraits<ELFYAML::ELF_REL>::enumeration(
953953
case ELF::EM_PPC64:
954954
#include "llvm/BinaryFormat/ELFRelocs/PowerPC64.def"
955955
break;
956+
case ELF::EM_SPARCV9:
957+
#include "llvm/BinaryFormat/ELFRelocs/Sparc.def"
958+
break;
956959
case ELF::EM_68K:
957960
#include "llvm/BinaryFormat/ELFRelocs/M68k.def"
958961
break;
@@ -1029,6 +1032,13 @@ void ScalarEnumerationTraits<ELFYAML::ELF_DYNTAG>::enumeration(
10291032
#undef RISCV_DYNAMIC_TAG
10301033
#define RISCV_DYNAMIC_TAG(name, value)
10311034
break;
1035+
case ELF::EM_SPARCV9:
1036+
#undef SPARC_DYNAMIC_TAG
1037+
#define SPARC_DYNAMIC_TAG(name, value) DYNAMIC_TAG(name, value)
1038+
#include "llvm/BinaryFormat/DynamicTags.def"
1039+
#undef SPARC_DYNAMIC_TAG
1040+
#define SPARC_DYNAMIC_TAG(name, value)
1041+
break;
10321042
default:
10331043
#include "llvm/BinaryFormat/DynamicTags.def"
10341044
break;

llvm/test/tools/llvm-readobj/ELF/dynamic-tags-machine-specific.test

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -445,3 +445,41 @@ ProgramHeaders:
445445
- Type: PT_DYNAMIC
446446
FirstSec: .dynamic
447447
LastSec: .dynamic
448+
449+
## Case 7: Test that SPARCV9 machine-specific tags can be dumped.
450+
# RUN: yaml2obj --docnum=7 %s -o %t.sparcv9
451+
# RUN: llvm-readobj --dynamic-table %t.sparcv9 | FileCheck %s --check-prefix=LLVM-SPARCV9
452+
# RUN: llvm-readelf --dynamic-table %t.sparcv9 | FileCheck %s --check-prefix=GNU-SPARCV9
453+
454+
# LLVM-SPARCV9: DynamicSection [ (2 entries)
455+
# LLVM-SPARCV9-NEXT: Tag Type Name/Value
456+
# LLVM-SPARCV9-NEXT: 0x0000000070000001 SPARC_REGISTER 0x12345
457+
# LLVM-SPARCV9-NEXT: 0x0000000000000000 NULL 0x0
458+
# LLVM-SPARCV9-NEXT: ]
459+
460+
# GNU-SPARCV9: Dynamic section at offset {{.*}} contains 2 entries:
461+
# GNU-SPARCV9-NEXT: Tag Type Name/Value
462+
# GNU-SPARCV9-NEXT: 0x0000000070000001 (SPARC_REGISTER) 0x12345
463+
# GNU-SPARCV9-NEXT: 0x0000000000000000 (NULL) 0x0
464+
465+
--- !ELF
466+
FileHeader:
467+
Class: ELFCLASS64
468+
Data: ELFDATA2MSB
469+
Type: ET_EXEC
470+
Machine: EM_SPARCV9
471+
Sections:
472+
- Name: .dynamic
473+
Type: SHT_DYNAMIC
474+
Entries:
475+
- Tag: DT_SPARC_REGISTER
476+
Value: 0x12345
477+
- Tag: DT_NULL
478+
Value: 0
479+
ProgramHeaders:
480+
- Type: PT_LOAD
481+
FirstSec: .dynamic
482+
LastSec: .dynamic
483+
- Type: PT_DYNAMIC
484+
FirstSec: .dynamic
485+
LastSec: .dynamic
Lines changed: 195 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,195 @@
1+
## Test that llvm-readobj shows proper relocation type
2+
## names and values for sparcv9 target.
3+
4+
# RUN: yaml2obj %s -o %t-sparcv9.o
5+
# RUN: llvm-readobj -r --expand-relocs %t-sparcv9.o | FileCheck %s
6+
7+
# CHECK: Type: R_SPARC_NONE (0)
8+
# CHECK: Type: R_SPARC_8 (1)
9+
# CHECK: Type: R_SPARC_16 (2)
10+
# CHECK: Type: R_SPARC_32 (3)
11+
# CHECK: Type: R_SPARC_DISP8 (4)
12+
# CHECK: Type: R_SPARC_DISP16 (5)
13+
# CHECK: Type: R_SPARC_DISP32 (6)
14+
# CHECK: Type: R_SPARC_WDISP30 (7)
15+
# CHECK: Type: R_SPARC_WDISP22 (8)
16+
# CHECK: Type: R_SPARC_HI22 (9)
17+
# CHECK: Type: R_SPARC_22 (10)
18+
# CHECK: Type: R_SPARC_13 (11)
19+
# CHECK: Type: R_SPARC_LO10 (12)
20+
# CHECK: Type: R_SPARC_GOT10 (13)
21+
# CHECK: Type: R_SPARC_GOT13 (14)
22+
# CHECK: Type: R_SPARC_GOT22 (15)
23+
# CHECK: Type: R_SPARC_PC10 (16)
24+
# CHECK: Type: R_SPARC_PC22 (17)
25+
# CHECK: Type: R_SPARC_WPLT30 (18)
26+
# CHECK: Type: R_SPARC_COPY (19)
27+
# CHECK: Type: R_SPARC_GLOB_DAT (20)
28+
# CHECK: Type: R_SPARC_JMP_SLOT (21)
29+
# CHECK: Type: R_SPARC_RELATIVE (22)
30+
# CHECK: Type: R_SPARC_UA32 (23)
31+
# CHECK: Type: R_SPARC_PLT32 (24)
32+
# CHECK: Type: R_SPARC_HIPLT22 (25)
33+
# CHECK: Type: R_SPARC_LOPLT10 (26)
34+
# CHECK: Type: R_SPARC_PCPLT32 (27)
35+
# CHECK: Type: R_SPARC_PCPLT22 (28)
36+
# CHECK: Type: R_SPARC_PCPLT10 (29)
37+
# CHECK: Type: R_SPARC_10 (30)
38+
# CHECK: Type: R_SPARC_11 (31)
39+
# CHECK: Type: R_SPARC_64 (32)
40+
# CHECK: Type: R_SPARC_OLO10 (33)
41+
# CHECK: Type: R_SPARC_HH22 (34)
42+
# CHECK: Type: R_SPARC_HM10 (35)
43+
# CHECK: Type: R_SPARC_LM22 (36)
44+
# CHECK: Type: R_SPARC_PC_HH22 (37)
45+
# CHECK: Type: R_SPARC_PC_HM10 (38)
46+
# CHECK: Type: R_SPARC_PC_LM22 (39)
47+
# CHECK: Type: R_SPARC_WDISP16 (40)
48+
# CHECK: Type: R_SPARC_WDISP19 (41)
49+
# CHECK: Type: R_SPARC_7 (43)
50+
# CHECK: Type: R_SPARC_5 (44)
51+
# CHECK: Type: R_SPARC_6 (45)
52+
# CHECK: Type: R_SPARC_DISP64 (46)
53+
# CHECK: Type: R_SPARC_PLT64 (47)
54+
# CHECK: Type: R_SPARC_HIX22 (48)
55+
# CHECK: Type: R_SPARC_LOX10 (49)
56+
# CHECK: Type: R_SPARC_H44 (50)
57+
# CHECK: Type: R_SPARC_M44 (51)
58+
# CHECK: Type: R_SPARC_L44 (52)
59+
# CHECK: Type: R_SPARC_REGISTER (53)
60+
# CHECK: Type: R_SPARC_UA64 (54)
61+
# CHECK: Type: R_SPARC_UA16 (55)
62+
# CHECK: Type: R_SPARC_TLS_GD_HI22 (56)
63+
# CHECK: Type: R_SPARC_TLS_GD_LO10 (57)
64+
# CHECK: Type: R_SPARC_TLS_GD_ADD (58)
65+
# CHECK: Type: R_SPARC_TLS_GD_CALL (59)
66+
# CHECK: Type: R_SPARC_TLS_LDM_HI22 (60)
67+
# CHECK: Type: R_SPARC_TLS_LDM_LO10 (61)
68+
# CHECK: Type: R_SPARC_TLS_LDM_ADD (62)
69+
# CHECK: Type: R_SPARC_TLS_LDM_CALL (63)
70+
# CHECK: Type: R_SPARC_TLS_LDO_HIX22 (64)
71+
# CHECK: Type: R_SPARC_TLS_LDO_LOX10 (65)
72+
# CHECK: Type: R_SPARC_TLS_LDO_ADD (66)
73+
# CHECK: Type: R_SPARC_TLS_IE_HI22 (67)
74+
# CHECK: Type: R_SPARC_TLS_IE_LO10 (68)
75+
# CHECK: Type: R_SPARC_TLS_IE_LD (69)
76+
# CHECK: Type: R_SPARC_TLS_IE_LDX (70)
77+
# CHECK: Type: R_SPARC_TLS_IE_ADD (71)
78+
# CHECK: Type: R_SPARC_TLS_LE_HIX22 (72)
79+
# CHECK: Type: R_SPARC_TLS_LE_LOX10 (73)
80+
# CHECK: Type: R_SPARC_TLS_DTPMOD32 (74)
81+
# CHECK: Type: R_SPARC_TLS_DTPMOD64 (75)
82+
# CHECK: Type: R_SPARC_TLS_DTPOFF32 (76)
83+
# CHECK: Type: R_SPARC_TLS_DTPOFF64 (77)
84+
# CHECK: Type: R_SPARC_TLS_TPOFF32 (78)
85+
# CHECK: Type: R_SPARC_TLS_TPOFF64 (79)
86+
# CHECK: Type: R_SPARC_GOTDATA_HIX22 (80)
87+
# CHECK: Type: R_SPARC_GOTDATA_LOX10 (81)
88+
# CHECK: Type: R_SPARC_GOTDATA_OP_HIX22 (82)
89+
# CHECK: Type: R_SPARC_GOTDATA_OP_LOX10 (83)
90+
# CHECK: Type: R_SPARC_GOTDATA_OP (84)
91+
# CHECK: Type: R_SPARC_H34 (85)
92+
# CHECK: Type: R_SPARC_SIZE32 (86)
93+
# CHECK: Type: R_SPARC_SIZE64 (87)
94+
# CHECK: Type: R_SPARC_WDISP10 (88)
95+
# CHECK: Type: R_SPARC_IRELATIVE (249)
96+
97+
--- !ELF
98+
FileHeader:
99+
Class: ELFCLASS64
100+
Data: ELFDATA2MSB
101+
Type: ET_REL
102+
Machine: EM_SPARCV9
103+
Sections:
104+
- Name: .rela.text
105+
Type: SHT_RELA
106+
Relocations:
107+
- Type: R_SPARC_NONE
108+
- Type: R_SPARC_8
109+
- Type: R_SPARC_16
110+
- Type: R_SPARC_32
111+
- Type: R_SPARC_DISP8
112+
- Type: R_SPARC_DISP16
113+
- Type: R_SPARC_DISP32
114+
- Type: R_SPARC_WDISP30
115+
- Type: R_SPARC_WDISP22
116+
- Type: R_SPARC_HI22
117+
- Type: R_SPARC_22
118+
- Type: R_SPARC_13
119+
- Type: R_SPARC_LO10
120+
- Type: R_SPARC_GOT10
121+
- Type: R_SPARC_GOT13
122+
- Type: R_SPARC_GOT22
123+
- Type: R_SPARC_PC10
124+
- Type: R_SPARC_PC22
125+
- Type: R_SPARC_WPLT30
126+
- Type: R_SPARC_COPY
127+
- Type: R_SPARC_GLOB_DAT
128+
- Type: R_SPARC_JMP_SLOT
129+
- Type: R_SPARC_RELATIVE
130+
- Type: R_SPARC_UA32
131+
- Type: R_SPARC_PLT32
132+
- Type: R_SPARC_HIPLT22
133+
- Type: R_SPARC_LOPLT10
134+
- Type: R_SPARC_PCPLT32
135+
- Type: R_SPARC_PCPLT22
136+
- Type: R_SPARC_PCPLT10
137+
- Type: R_SPARC_10
138+
- Type: R_SPARC_11
139+
- Type: R_SPARC_64
140+
- Type: R_SPARC_OLO10
141+
- Type: R_SPARC_HH22
142+
- Type: R_SPARC_HM10
143+
- Type: R_SPARC_LM22
144+
- Type: R_SPARC_PC_HH22
145+
- Type: R_SPARC_PC_HM10
146+
- Type: R_SPARC_PC_LM22
147+
- Type: R_SPARC_WDISP16
148+
- Type: R_SPARC_WDISP19
149+
- Type: R_SPARC_7
150+
- Type: R_SPARC_5
151+
- Type: R_SPARC_6
152+
- Type: R_SPARC_DISP64
153+
- Type: R_SPARC_PLT64
154+
- Type: R_SPARC_HIX22
155+
- Type: R_SPARC_LOX10
156+
- Type: R_SPARC_H44
157+
- Type: R_SPARC_M44
158+
- Type: R_SPARC_L44
159+
- Type: R_SPARC_REGISTER
160+
- Type: R_SPARC_UA64
161+
- Type: R_SPARC_UA16
162+
- Type: R_SPARC_TLS_GD_HI22
163+
- Type: R_SPARC_TLS_GD_LO10
164+
- Type: R_SPARC_TLS_GD_ADD
165+
- Type: R_SPARC_TLS_GD_CALL
166+
- Type: R_SPARC_TLS_LDM_HI22
167+
- Type: R_SPARC_TLS_LDM_LO10
168+
- Type: R_SPARC_TLS_LDM_ADD
169+
- Type: R_SPARC_TLS_LDM_CALL
170+
- Type: R_SPARC_TLS_LDO_HIX22
171+
- Type: R_SPARC_TLS_LDO_LOX10
172+
- Type: R_SPARC_TLS_LDO_ADD
173+
- Type: R_SPARC_TLS_IE_HI22
174+
- Type: R_SPARC_TLS_IE_LO10
175+
- Type: R_SPARC_TLS_IE_LD
176+
- Type: R_SPARC_TLS_IE_LDX
177+
- Type: R_SPARC_TLS_IE_ADD
178+
- Type: R_SPARC_TLS_LE_HIX22
179+
- Type: R_SPARC_TLS_LE_LOX10
180+
- Type: R_SPARC_TLS_DTPMOD32
181+
- Type: R_SPARC_TLS_DTPMOD64
182+
- Type: R_SPARC_TLS_DTPOFF32
183+
- Type: R_SPARC_TLS_DTPOFF64
184+
- Type: R_SPARC_TLS_TPOFF32
185+
- Type: R_SPARC_TLS_TPOFF64
186+
- Type: R_SPARC_GOTDATA_HIX22
187+
- Type: R_SPARC_GOTDATA_LOX10
188+
- Type: R_SPARC_GOTDATA_OP_HIX22
189+
- Type: R_SPARC_GOTDATA_OP_LOX10
190+
- Type: R_SPARC_GOTDATA_OP
191+
- Type: R_SPARC_H34
192+
- Type: R_SPARC_SIZE32
193+
- Type: R_SPARC_SIZE64
194+
- Type: R_SPARC_WDISP10
195+
- Type: R_SPARC_IRELATIVE

0 commit comments

Comments
 (0)