Skip to content

Commit b6e2093

Browse files
author
George Rimar
committed
[yaml2obj/obj2yaml] - Make RawContentSection::Info Optional<>
This allows to customize this field for "implicit" sections properly. Differential revision: https://reviews.llvm.org/D63487 llvm-svn: 363777
1 parent af22e07 commit b6e2093

File tree

8 files changed

+159
-14
lines changed

8 files changed

+159
-14
lines changed

llvm/include/llvm/ObjectYAML/ELFYAML.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ struct DynamicSection : Section {
153153
struct RawContentSection : Section {
154154
Optional<yaml::BinaryRef> Content;
155155
Optional<llvm::yaml::Hex64> Size;
156-
llvm::yaml::Hex64 Info;
156+
Optional<llvm::yaml::Hex64> Info;
157157

158158
RawContentSection() : Section(SectionKind::RawContent) {}
159159

llvm/lib/ObjectYAML/ELFYAML.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -917,7 +917,7 @@ static void sectionMapping(IO &IO, ELFYAML::RawContentSection &Section) {
917917
commonSectionMapping(IO, Section);
918918
IO.mapOptional("Content", Section.Content);
919919
IO.mapOptional("Size", Section.Size);
920-
IO.mapOptional("Info", Section.Info, Hex64(0));
920+
IO.mapOptional("Info", Section.Info);
921921
}
922922

923923
static void sectionMapping(IO &IO, ELFYAML::NoBitsSection &Section) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
## Check that obj2yaml does not write a section Info
2+
## field in the case when it has a value of zero.
3+
4+
# RUN: yaml2obj %s -o %t
5+
# RUN: obj2yaml %t | FileCheck %s
6+
7+
# CHECK: Sections:
8+
# CHECK-NEXT: - Name: .foo
9+
# CHECK-NEXT: Type: SHT_PROGBITS
10+
# CHECK-NEXT: - Name: .bar
11+
# CHECK-NEXT: Type: SHT_PROGBITS
12+
# CHECK-NEXT: Info: 0x0000000000000001
13+
14+
--- !ELF
15+
FileHeader:
16+
Class: ELFCLASS64
17+
Data: ELFDATA2LSB
18+
Type: ET_DYN
19+
Machine: EM_X86_64
20+
Sections:
21+
- Name: .foo
22+
Type: SHT_PROGBITS
23+
- Name: .bar
24+
Type: SHT_PROGBITS
25+
Info: 1

llvm/test/tools/yaml2obj/dynsymtab-implicit-sections-size-content.yaml

+4-4
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ DynamicSymbols:
7878
# CASE4-NEXT: Offset: 0x180
7979
# CASE4-NEXT: Size: 2
8080
# CASE4-NEXT: Link: 0
81-
# CASE4-NEXT: Info: 0
81+
# CASE4-NEXT: Info: 1
8282
# CASE4-NEXT: AddressAlignment: 0
8383
# CASE4-NEXT: EntrySize: 24
8484
# CASE4-NEXT: SectionData (
@@ -110,7 +110,7 @@ Sections:
110110
# CASE5-NEXT: Offset: 0x180
111111
# CASE5-NEXT: Size: 5
112112
# CASE5-NEXT: Link: 0
113-
# CASE5-NEXT: Info: 0
113+
# CASE5-NEXT: Info: 1
114114
# CASE5-NEXT: AddressAlignment: 0
115115
# CASE5-NEXT: EntrySize: 24
116116
# CASE5-NEXT: SectionData (
@@ -144,7 +144,7 @@ Sections:
144144
# CASE6-NEXT: Offset: 0x180
145145
# CASE6-NEXT: Size: 4
146146
# CASE6-NEXT: Link: 0
147-
# CASE6-NEXT: Info: 0
147+
# CASE6-NEXT: Info: 1
148148
# CASE6-NEXT: AddressAlignment: 0
149149
# CASE6-NEXT: EntrySize: 24
150150
# CASE6-NEXT: SectionData (
@@ -178,7 +178,7 @@ Sections:
178178
# CASE7-NEXT: Offset: 0x180
179179
# CASE7-NEXT: Size: 2
180180
# CASE7-NEXT: Link: 0
181-
# CASE7-NEXT: Info: 0
181+
# CASE7-NEXT: Info: 1
182182
# CASE7-NEXT: AddressAlignment: 0
183183
# CASE7-NEXT: EntrySize: 24
184184
# CASE7-NEXT: SectionData (
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
## Check the values of sh_info fields set by default for
2+
## explicitly listed .dynstr, .dynsym, .strtab and .symtab
3+
## sections.
4+
##
5+
## For symbol table sections, sh_info has a value which is
6+
## one greater than the symbol table index of the last
7+
## local symbol.
8+
##
9+
## sh_info isn't set for string table sections.
10+
11+
# RUN: yaml2obj --docnum=1 %s -o %t
12+
# RUN: llvm-readobj --sections %t | FileCheck %s --check-prefix=CASE1
13+
14+
# CASE1: Name: .symtab
15+
# CASE1: Info:
16+
# CASE1-SAME: 2
17+
# CASE1: Name: .strtab
18+
# CASE1: Info:
19+
# CASE1-SAME: 0
20+
# CASE1: Name: .dynsym
21+
# CASE1: Info:
22+
# CASE1-SAME: 1
23+
# CASE1: Name: .dynstr
24+
# CASE1: Info:
25+
# CASE1-SAME: 0
26+
27+
--- !ELF
28+
FileHeader:
29+
Class: ELFCLASS64
30+
Data: ELFDATA2LSB
31+
Type: ET_DYN
32+
Machine: EM_X86_64
33+
Sections:
34+
- Name: .symtab
35+
Type: SHT_SYMTAB
36+
- Name: .strtab
37+
Type: SHT_STRTAB
38+
- Name: .dynsym
39+
Type: SHT_DYNSYM
40+
- Name: .dynstr
41+
Type: SHT_STRTAB
42+
Symbols:
43+
- Name: local
44+
- Name: global1
45+
Binding: STB_GLOBAL
46+
DynamicSymbols:
47+
- Name: global2
48+
Binding: STB_GLOBAL
49+
50+
## In the case when these sections are not defined in YAML, the
51+
## behavior is the same as when we define them, but do not set the Info.
52+
53+
# RUN: yaml2obj --docnum=2 %s -o %t
54+
# RUN: llvm-readobj --sections %t | FileCheck %s --check-prefix=CASE1
55+
56+
--- !ELF
57+
FileHeader:
58+
Class: ELFCLASS64
59+
Data: ELFDATA2LSB
60+
Type: ET_DYN
61+
Machine: EM_X86_64
62+
Symbols:
63+
- Name: local
64+
- Name: global1
65+
Binding: STB_GLOBAL
66+
DynamicSymbols:
67+
- Name: global2
68+
Binding: STB_GLOBAL
69+
70+
## Check we are able to set any sh_info explicitly.
71+
72+
# RUN: yaml2obj --docnum=3 %s -o %t
73+
# RUN: llvm-readobj --sections %t | FileCheck %s --check-prefix=CASE2
74+
75+
# CASE2: Name: .dynstr
76+
# CASE2: Info:
77+
# CASE2-SAME: 10
78+
# CASE2: Name: .dynsym
79+
# CASE2: Info:
80+
# CASE2-SAME: 11
81+
# CASE2: Name: .strtab
82+
# CASE2: Info:
83+
# CASE2-SAME: 12
84+
# CASE2: Name: .symtab
85+
# CASE2: Info:
86+
# CASE2-SAME: 13
87+
88+
--- !ELF
89+
FileHeader:
90+
Class: ELFCLASS64
91+
Data: ELFDATA2LSB
92+
Type: ET_DYN
93+
Machine: EM_X86_64
94+
Sections:
95+
- Name: .dynstr
96+
Type: SHT_STRTAB
97+
Info: 10
98+
- Name: .dynsym
99+
Type: SHT_DYNSYM
100+
Info: 11
101+
- Name: .strtab
102+
Type: SHT_STRTAB
103+
Info: 12
104+
- Name: .symtab
105+
Type: SHT_SYMTAB
106+
Info: 13
107+
Symbols:
108+
- Name: local
109+
- Name: global1
110+
Binding: STB_GLOBAL
111+
DynamicSymbols:
112+
- Name: global2
113+
Binding: STB_GLOBAL

llvm/test/tools/yaml2obj/symtab-implicit-sections-size-content.yaml

+4-4
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ Symbols:
7373
# CASE4-NEXT: Offset: 0x140
7474
# CASE4-NEXT: Size: 2
7575
# CASE4-NEXT: Link: 2
76-
# CASE4-NEXT: Info: 0
76+
# CASE4-NEXT: Info: 1
7777
# CASE4-NEXT: AddressAlignment: 0
7878
# CASE4-NEXT: EntrySize: 24
7979
# CASE4-NEXT: SectionData (
@@ -104,7 +104,7 @@ Sections:
104104
# CASE5-NEXT: Offset: 0x140
105105
# CASE5-NEXT: Size: 5
106106
# CASE5-NEXT: Link: 2
107-
# CASE5-NEXT: Info: 0
107+
# CASE5-NEXT: Info: 1
108108
# CASE5-NEXT: AddressAlignment: 0
109109
# CASE5-NEXT: EntrySize: 24
110110
# CASE5-NEXT: SectionData (
@@ -137,7 +137,7 @@ Sections:
137137
# CASE6-NEXT: Offset: 0x140
138138
# CASE6-NEXT: Size: 4
139139
# CASE6-NEXT: Link: 2
140-
# CASE6-NEXT: Info: 0
140+
# CASE6-NEXT: Info: 1
141141
# CASE6-NEXT: AddressAlignment: 0
142142
# CASE6-NEXT: EntrySize: 24
143143
# CASE6-NEXT: SectionData (
@@ -170,7 +170,7 @@ Sections:
170170
# CASE7-NEXT: Offset: 0x140
171171
# CASE7-NEXT: Size: 2
172172
# CASE7-NEXT: Link: 2
173-
# CASE7-NEXT: Info: 0
173+
# CASE7-NEXT: Info: 1
174174
# CASE7-NEXT: AddressAlignment: 0
175175
# CASE7-NEXT: EntrySize: 24
176176
# CASE7-NEXT: SectionData (

llvm/tools/obj2yaml/elf2yaml.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -442,7 +442,8 @@ ELFDumper<ELFT>::dumpContentSection(const Elf_Shdr *Shdr) {
442442
ArrayRef<uint8_t> Content = *ContentOrErr;
443443
if (!Content.empty())
444444
S->Content = yaml::BinaryRef(Content);
445-
S->Info = Shdr->sh_info;
445+
if (Shdr->sh_info)
446+
S->Info = static_cast<llvm::yaml::Hex64>(Shdr->sh_info);
446447
return S.release();
447448
}
448449

llvm/tools/yaml2obj/yaml2elf.cpp

+9-3
Original file line numberDiff line numberDiff line change
@@ -436,8 +436,8 @@ void ELFState<ELFT>::initSymtabSectionHeader(Elf_Shdr &SHeader,
436436

437437
// If the symbol table section is explicitly described in the YAML
438438
// then we should set the fields requested.
439-
SHeader.sh_info =
440-
RawSec ? (unsigned)RawSec->Info : findFirstNonGlobal(Symbols) + 1;
439+
SHeader.sh_info = (RawSec && RawSec->Info) ? (unsigned)(*RawSec->Info)
440+
: findFirstNonGlobal(Symbols) + 1;
441441
SHeader.sh_entsize = (YAMLSec && YAMLSec->EntSize)
442442
? (uint64_t)(*YAMLSec->EntSize)
443443
: sizeof(Elf_Sym);
@@ -488,6 +488,9 @@ void ELFState<ELFT>::initStrtabSectionHeader(Elf_Shdr &SHeader, StringRef Name,
488488
if (YAMLSec && YAMLSec->EntSize)
489489
SHeader.sh_entsize = *YAMLSec->EntSize;
490490

491+
if (RawSec && RawSec->Info)
492+
SHeader.sh_info = *RawSec->Info;
493+
491494
if (YAMLSec && YAMLSec->Flags)
492495
SHeader.sh_flags = *YAMLSec->Flags;
493496
else if (Name == ".dynstr")
@@ -624,7 +627,10 @@ bool ELFState<ELFT>::writeSectionContent(
624627
SHeader.sh_entsize = sizeof(Elf_Relr);
625628
else
626629
SHeader.sh_entsize = 0;
627-
SHeader.sh_info = Section.Info;
630+
631+
if (Section.Info)
632+
SHeader.sh_info = *Section.Info;
633+
628634
return true;
629635
}
630636

0 commit comments

Comments
 (0)