Skip to content

Commit 2d0d853

Browse files
committedJan 20, 2016
[llvm-readobj][ELF] Teach llvm-readobj to show arch specific ELF section's flags
Some architecture specific ELF section flags might have the same value (for example SHF_X86_64_LARGE and SHF_HEX_GPREL) and we have to check machine architectures to select an appropriate set of possible flags. The patch selects architecture specific flags into separate arrays `ElfxxxSectionFlags` and combines `ElfSectionFlags` and `ElfxxxSectionFlags` before pass to the `StreamWriter::printFlags()` method. Differential Revision: http://reviews.llvm.org/D16269 llvm-svn: 258334
1 parent 2d7fa70 commit 2d0d853

File tree

4 files changed

+157
-3
lines changed

4 files changed

+157
-3
lines changed
 

‎llvm/lib/Object/ELFYAML.cpp

+19
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,9 @@ void ScalarBitSetTraits<ELFYAML::ELF_EF>::bitset(IO &IO,
336336
BCase(EF_AVR_ARCH_XMEGA6)
337337
BCase(EF_AVR_ARCH_XMEGA7)
338338
break;
339+
case ELF::EM_AMDGPU:
340+
case ELF::EM_X86_64:
341+
break;
339342
default:
340343
llvm_unreachable("Unsupported architecture");
341344
}
@@ -422,6 +425,22 @@ void ScalarBitSetTraits<ELFYAML::ELF_SHF>::bitset(IO &IO,
422425
BCase(SHF_AMDGPU_HSA_CODE)
423426
BCase(SHF_AMDGPU_HSA_AGENT)
424427
break;
428+
case ELF::EM_HEXAGON:
429+
BCase(SHF_HEX_GPREL)
430+
break;
431+
case ELF::EM_MIPS:
432+
BCase(SHF_MIPS_NODUPES)
433+
BCase(SHF_MIPS_NAMES)
434+
BCase(SHF_MIPS_LOCAL)
435+
BCase(SHF_MIPS_NOSTRIP)
436+
BCase(SHF_MIPS_GPREL)
437+
BCase(SHF_MIPS_MERGE)
438+
BCase(SHF_MIPS_ADDR)
439+
BCase(SHF_MIPS_STRING)
440+
break;
441+
case ELF::EM_X86_64:
442+
BCase(SHF_X86_64_LARGE)
443+
break;
425444
default:
426445
// Nothing to do.
427446
break;

‎llvm/test/Object/obj2yaml.test

+1-1
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ ELF-MIPS64EL-NEXT: Flags: [ SHF_WRITE, SHF_ALLOC ]
327327
ELF-MIPS64EL-NEXT: AddressAlign: 0x0000000000000010
328328
ELF-MIPS64EL-NEXT: - Name: .MIPS.options
329329
ELF-MIPS64EL-NEXT: Type: SHT_MIPS_OPTIONS
330-
ELF-MIPS64EL-NEXT: Flags: [ SHF_ALLOC ]
330+
ELF-MIPS64EL-NEXT: Flags: [ SHF_ALLOC, SHF_MIPS_NOSTRIP ]
331331
ELF-MIPS64EL-NEXT: AddressAlign: 0x0000000000000008
332332
ELF-MIPS64EL-NEXT: Content: '01280000000000000000000000000000000000000000000000000000000000000000000000000000'
333333
ELF-MIPS64EL-NEXT: - Name: .pdr
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
# Check that llvm-readobj shows arch specific ELF section flags.
2+
3+
# RUN: yaml2obj -format=elf -docnum 1 %s > %t-amdgpu.o
4+
# RUN: llvm-readobj -s %t-amdgpu.o | FileCheck -check-prefix=AMD %s
5+
6+
# AMD: Flags [ (0x300000)
7+
# AMD-NEXT: SHF_AMDGPU_HSA_GLOBAL (0x100000)
8+
# AMD-NEXT: SHF_AMDGPU_HSA_READONLY (0x200000)
9+
# AMD-NEXT: ]
10+
11+
# amdgpu.o
12+
---
13+
FileHeader:
14+
Class: ELFCLASS64
15+
Data: ELFDATA2LSB
16+
OSABI: ELFOSABI_GNU
17+
Type: ET_REL
18+
Machine: EM_AMDGPU
19+
Flags: []
20+
Sections:
21+
- Name: .amdgpu
22+
Type: SHT_PROGBITS
23+
Flags: [SHF_AMDGPU_HSA_GLOBAL, SHF_AMDGPU_HSA_READONLY]
24+
Size: 4
25+
26+
# RUN: yaml2obj -format=elf -docnum 2 %s > %t-hex.o
27+
# RUN: llvm-readobj -s %t-hex.o | FileCheck -check-prefix=HEX %s
28+
29+
# HEX: Flags [ (0x10000000)
30+
# HEX-NEXT: SHF_HEX_GPREL (0x10000000)
31+
# HEX-NEXT: ]
32+
33+
# hex.o
34+
---
35+
FileHeader:
36+
Class: ELFCLASS32
37+
Data: ELFDATA2LSB
38+
Type: ET_REL
39+
Machine: EM_HEXAGON
40+
Flags: []
41+
Sections:
42+
- Name: .hex
43+
Type: SHT_PROGBITS
44+
Flags: [SHF_HEX_GPREL]
45+
Size: 4
46+
47+
# RUN: yaml2obj -format=elf -docnum 3 %s > %t-mips.o
48+
# RUN: llvm-readobj -s %t-mips.o | FileCheck -check-prefix=MIPS %s
49+
50+
# MIPS: Flags [ (0x38000000)
51+
# MIPS-NEXT: SHF_MIPS_GPREL (0x10000000)
52+
# MIPS-NEXT: SHF_MIPS_MERGE (0x20000000)
53+
# MIPS-NEXT: SHF_MIPS_NOSTRIP (0x8000000)
54+
# MIPS-NEXT: ]
55+
56+
# mips.o
57+
---
58+
FileHeader:
59+
Class: ELFCLASS32
60+
Data: ELFDATA2LSB
61+
Type: ET_REL
62+
Machine: EM_MIPS
63+
Flags: []
64+
Sections:
65+
- Name: .mips
66+
Type: SHT_PROGBITS
67+
Flags: [SHF_MIPS_GPREL, SHF_MIPS_MERGE, SHF_MIPS_NOSTRIP]
68+
Size: 4
69+
70+
# RUN: yaml2obj -format=elf -docnum 4 %s > %t-x86_64.o
71+
# RUN: llvm-readobj -s %t-x86_64.o | FileCheck -check-prefix=X86_64 %s
72+
73+
# X86_64: Flags [ (0x10000000)
74+
# X86_64-NEXT: SHF_X86_64_LARGE (0x10000000)
75+
# X86_64-NEXT: ]
76+
77+
# x86_64.o
78+
---
79+
FileHeader:
80+
Class: ELFCLASS64
81+
Data: ELFDATA2LSB
82+
Type: ET_REL
83+
Machine: EM_X86_64
84+
Flags: []
85+
Sections:
86+
- Name: .x86_64
87+
Type: SHT_PROGBITS
88+
Flags: [SHF_X86_64_LARGE]
89+
Size: 4
90+
...

‎llvm/tools/llvm-readobj/ELFDumper.cpp

+47-2
Original file line numberDiff line numberDiff line change
@@ -806,13 +806,34 @@ static const EnumEntry<unsigned> ElfSectionFlags[] = {
806806
LLVM_READOBJ_ENUM_ENT(ELF, SHF_TLS ),
807807
LLVM_READOBJ_ENUM_ENT(ELF, XCORE_SHF_CP_SECTION),
808808
LLVM_READOBJ_ENUM_ENT(ELF, XCORE_SHF_DP_SECTION),
809-
LLVM_READOBJ_ENUM_ENT(ELF, SHF_MIPS_NOSTRIP ),
809+
};
810+
811+
static const EnumEntry<unsigned> ElfAMDGPUSectionFlags[] = {
810812
LLVM_READOBJ_ENUM_ENT(ELF, SHF_AMDGPU_HSA_GLOBAL),
811813
LLVM_READOBJ_ENUM_ENT(ELF, SHF_AMDGPU_HSA_READONLY),
812814
LLVM_READOBJ_ENUM_ENT(ELF, SHF_AMDGPU_HSA_CODE),
813815
LLVM_READOBJ_ENUM_ENT(ELF, SHF_AMDGPU_HSA_AGENT)
814816
};
815817

818+
static const EnumEntry<unsigned> ElfHexagonSectionFlags[] = {
819+
LLVM_READOBJ_ENUM_ENT(ELF, SHF_HEX_GPREL)
820+
};
821+
822+
static const EnumEntry<unsigned> ElfMipsSectionFlags[] = {
823+
LLVM_READOBJ_ENUM_ENT(ELF, SHF_MIPS_NODUPES),
824+
LLVM_READOBJ_ENUM_ENT(ELF, SHF_MIPS_NAMES ),
825+
LLVM_READOBJ_ENUM_ENT(ELF, SHF_MIPS_LOCAL ),
826+
LLVM_READOBJ_ENUM_ENT(ELF, SHF_MIPS_NOSTRIP),
827+
LLVM_READOBJ_ENUM_ENT(ELF, SHF_MIPS_GPREL ),
828+
LLVM_READOBJ_ENUM_ENT(ELF, SHF_MIPS_MERGE ),
829+
LLVM_READOBJ_ENUM_ENT(ELF, SHF_MIPS_ADDR ),
830+
LLVM_READOBJ_ENUM_ENT(ELF, SHF_MIPS_STRING )
831+
};
832+
833+
static const EnumEntry<unsigned> ElfX86_64SectionFlags[] = {
834+
LLVM_READOBJ_ENUM_ENT(ELF, SHF_X86_64_LARGE)
835+
};
836+
816837
static const char *getElfSegmentType(unsigned Arch, unsigned Type) {
817838
// Check potentially overlapped processor-specific
818839
// program header type.
@@ -1118,7 +1139,31 @@ void ELFDumper<ELFT>::printSections() {
11181139
W.printHex("Type",
11191140
getElfSectionType(Obj->getHeader()->e_machine, Sec.sh_type),
11201141
Sec.sh_type);
1121-
W.printFlags("Flags", Sec.sh_flags, makeArrayRef(ElfSectionFlags));
1142+
std::vector<EnumEntry<unsigned>> SectionFlags(std::begin(ElfSectionFlags),
1143+
std::end(ElfSectionFlags));
1144+
switch (Obj->getHeader()->e_machine) {
1145+
case EM_AMDGPU:
1146+
SectionFlags.insert(SectionFlags.end(), std::begin(ElfAMDGPUSectionFlags),
1147+
std::end(ElfAMDGPUSectionFlags));
1148+
break;
1149+
case EM_HEXAGON:
1150+
SectionFlags.insert(SectionFlags.end(),
1151+
std::begin(ElfHexagonSectionFlags),
1152+
std::end(ElfHexagonSectionFlags));
1153+
break;
1154+
case EM_MIPS:
1155+
SectionFlags.insert(SectionFlags.end(), std::begin(ElfMipsSectionFlags),
1156+
std::end(ElfMipsSectionFlags));
1157+
break;
1158+
case EM_X86_64:
1159+
SectionFlags.insert(SectionFlags.end(), std::begin(ElfX86_64SectionFlags),
1160+
std::end(ElfX86_64SectionFlags));
1161+
break;
1162+
default:
1163+
// Nothing to do.
1164+
break;
1165+
}
1166+
W.printFlags("Flags", Sec.sh_flags, makeArrayRef(SectionFlags));
11221167
W.printHex("Address", Sec.sh_addr);
11231168
W.printHex("Offset", Sec.sh_offset);
11241169
W.printNumber("Size", Sec.sh_size);

0 commit comments

Comments
 (0)
Please sign in to comment.