mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
[yaml2obj] - Allow setting custom sh_info for RawContentSection sections.
This is for tweaking SHT_SYMTAB sections. Their sh_info contains the (number of symbols + 1) usually. But for creating invalid inputs for test cases it would be convenient to allow explicitly override this field from YAML. Differential revision: https://reviews.llvm.org/D58779 llvm-svn: 355193
This commit is contained in:
parent
f86038e485
commit
359226d29a
@ -153,6 +153,7 @@ struct DynamicSection : Section {
|
|||||||
struct RawContentSection : Section {
|
struct RawContentSection : Section {
|
||||||
yaml::BinaryRef Content;
|
yaml::BinaryRef Content;
|
||||||
llvm::yaml::Hex64 Size;
|
llvm::yaml::Hex64 Size;
|
||||||
|
llvm::yaml::Hex64 Info;
|
||||||
|
|
||||||
RawContentSection() : Section(SectionKind::RawContent) {}
|
RawContentSection() : Section(SectionKind::RawContent) {}
|
||||||
|
|
||||||
|
@ -887,6 +887,7 @@ static void sectionMapping(IO &IO, ELFYAML::RawContentSection &Section) {
|
|||||||
commonSectionMapping(IO, Section);
|
commonSectionMapping(IO, Section);
|
||||||
IO.mapOptional("Content", Section.Content);
|
IO.mapOptional("Content", Section.Content);
|
||||||
IO.mapOptional("Size", Section.Size, Hex64(Section.Content.binary_size()));
|
IO.mapOptional("Size", Section.Size, Hex64(Section.Content.binary_size()));
|
||||||
|
IO.mapOptional("Info", Section.Info, Hex64(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sectionMapping(IO &IO, ELFYAML::NoBitsSection &Section) {
|
static void sectionMapping(IO &IO, ELFYAML::NoBitsSection &Section) {
|
||||||
|
20
test/tools/obj2yaml/elf-shinfo.yaml
Normal file
20
test/tools/obj2yaml/elf-shinfo.yaml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
# RUN: yaml2obj %s -o %t
|
||||||
|
# RUN: obj2yaml %t | FileCheck %s
|
||||||
|
|
||||||
|
## Check obj2yaml is able to dump sh_info field of a section.
|
||||||
|
|
||||||
|
# CHECK: - Name: .test
|
||||||
|
# CHECK-NEXT: Type: SHT_PROGBITS
|
||||||
|
# CHECK-NEXT: Content: ''
|
||||||
|
# CHECK-NEXT: Info: 0x000000000000002A
|
||||||
|
|
||||||
|
--- !ELF
|
||||||
|
FileHeader:
|
||||||
|
Class: ELFCLASS64
|
||||||
|
Data: ELFDATA2LSB
|
||||||
|
Type: ET_REL
|
||||||
|
Machine: EM_X86_64
|
||||||
|
Sections:
|
||||||
|
- Name: .test
|
||||||
|
Type: SHT_PROGBITS
|
||||||
|
Info: 42
|
43
test/tools/yaml2obj/elf-symtab-shinfo.yaml
Normal file
43
test/tools/yaml2obj/elf-symtab-shinfo.yaml
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
## Check we are able to set sh_info field for SHT_SYMTAB sections.
|
||||||
|
# RUN: yaml2obj %s -o %t
|
||||||
|
# RUN: llvm-readobj -sections %t | FileCheck %s
|
||||||
|
|
||||||
|
# CHECK: Name: .symtab
|
||||||
|
# CHECK-NEXT: Type: SHT_SYMTAB
|
||||||
|
# CHECK-NEXT: Flags [
|
||||||
|
# CHECK-NEXT: ]
|
||||||
|
# CHECK-NEXT: Address:
|
||||||
|
# CHECK-NEXT: Offset:
|
||||||
|
# CHECK-NEXT: Size:
|
||||||
|
# CHECK-NEXT: Link:
|
||||||
|
# CHECK-NEXT: Info: 42
|
||||||
|
# CHECK: Name: .dynsym
|
||||||
|
# CHECK-NEXT: Type: SHT_DYNSYM
|
||||||
|
# CHECK-NEXT: Flags [
|
||||||
|
# CHECK-NEXT: SHF_ALLOC
|
||||||
|
# CHECK-NEXT: ]
|
||||||
|
# CHECK-NEXT: Address:
|
||||||
|
# CHECK-NEXT: Offset:
|
||||||
|
# CHECK-NEXT: Size:
|
||||||
|
# CHECK-NEXT: Link:
|
||||||
|
# CHECK-NEXT: Info: 26
|
||||||
|
|
||||||
|
--- !ELF
|
||||||
|
FileHeader:
|
||||||
|
Class: ELFCLASS64
|
||||||
|
Data: ELFDATA2LSB
|
||||||
|
Type: ET_REL
|
||||||
|
Machine: EM_X86_64
|
||||||
|
Sections:
|
||||||
|
- Name: .symtab
|
||||||
|
Info: 42
|
||||||
|
Type: SHT_SYMTAB
|
||||||
|
- Name: .dynsym
|
||||||
|
Info: 26
|
||||||
|
Type: SHT_SYMTAB
|
||||||
|
Symbols:
|
||||||
|
Global:
|
||||||
|
- Name: foo
|
||||||
|
DynamicSymbols:
|
||||||
|
Global:
|
||||||
|
- Name: bar
|
21
test/tools/yaml2obj/elf-symtab-shtype.yaml
Normal file
21
test/tools/yaml2obj/elf-symtab-shtype.yaml
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
## Check we dont crash when .symtab has type different from SHT_SYMTAB.
|
||||||
|
# RUN: yaml2obj %s -o %t
|
||||||
|
# RUN: llvm-readobj -sections %t | FileCheck %s
|
||||||
|
|
||||||
|
## TODO: the output is still SHT_SYMTAB because we do not yet
|
||||||
|
## support changing it.
|
||||||
|
# CHECK: Name: .symtab
|
||||||
|
# CHECK-NEXT: Type: SHT_SYMTAB
|
||||||
|
|
||||||
|
--- !ELF
|
||||||
|
FileHeader:
|
||||||
|
Class: ELFCLASS64
|
||||||
|
Data: ELFDATA2LSB
|
||||||
|
Type: ET_REL
|
||||||
|
Machine: EM_X86_64
|
||||||
|
Sections:
|
||||||
|
- Name: .symtab
|
||||||
|
Type: SHT_DYNAMIC
|
||||||
|
Symbols:
|
||||||
|
Global:
|
||||||
|
- Name: foo
|
@ -458,6 +458,7 @@ ELFDumper<ELFT>::dumpContentSection(const Elf_Shdr *Shdr) {
|
|||||||
return errorToErrorCode(ContentOrErr.takeError());
|
return errorToErrorCode(ContentOrErr.takeError());
|
||||||
S->Content = yaml::BinaryRef(ContentOrErr.get());
|
S->Content = yaml::BinaryRef(ContentOrErr.get());
|
||||||
S->Size = S->Content.binary_size();
|
S->Size = S->Content.binary_size();
|
||||||
|
S->Info = Shdr->sh_info;
|
||||||
|
|
||||||
return S.release();
|
return S.release();
|
||||||
}
|
}
|
||||||
|
@ -341,13 +341,16 @@ void ELFState<ELFT>::initSymtabSectionHeader(Elf_Shdr &SHeader,
|
|||||||
SHeader.sh_entsize = sizeof(Elf_Sym);
|
SHeader.sh_entsize = sizeof(Elf_Sym);
|
||||||
SHeader.sh_addralign = 8;
|
SHeader.sh_addralign = 8;
|
||||||
|
|
||||||
// If .dynsym section is explicitly described in the YAML
|
// Get the section index ignoring the SHT_NULL section.
|
||||||
// then we want to use its section address.
|
unsigned SecNdx =
|
||||||
if (!IsStatic) {
|
IsStatic ? getDotSymTabSecNo() - 1 : getDotDynSymSecNo() - 1;
|
||||||
// Take section index and ignore the SHT_NULL section.
|
// If the symbol table section is explicitly described in the YAML
|
||||||
unsigned SecNdx = getDotDynSymSecNo() - 1;
|
// then we should set the fields requested.
|
||||||
if (SecNdx < Doc.Sections.size())
|
if (SecNdx < Doc.Sections.size()) {
|
||||||
SHeader.sh_addr = Doc.Sections[SecNdx]->Address;
|
ELFYAML::Section *Sec = Doc.Sections[SecNdx].get();
|
||||||
|
SHeader.sh_addr = Sec->Address;
|
||||||
|
if (auto S = dyn_cast<ELFYAML::RawContentSection>(Sec))
|
||||||
|
SHeader.sh_info = S->Info;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<Elf_Sym> Syms;
|
std::vector<Elf_Sym> Syms;
|
||||||
@ -503,6 +506,7 @@ ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader,
|
|||||||
else
|
else
|
||||||
SHeader.sh_entsize = 0;
|
SHeader.sh_entsize = 0;
|
||||||
SHeader.sh_size = Section.Size;
|
SHeader.sh_size = Section.Size;
|
||||||
|
SHeader.sh_info = Section.Info;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool isMips64EL(const ELFYAML::Object &Doc) {
|
static bool isMips64EL(const ELFYAML::Object &Doc) {
|
||||||
|
Loading…
Reference in New Issue
Block a user