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 {
|
||||
yaml::BinaryRef Content;
|
||||
llvm::yaml::Hex64 Size;
|
||||
llvm::yaml::Hex64 Info;
|
||||
|
||||
RawContentSection() : Section(SectionKind::RawContent) {}
|
||||
|
||||
|
@ -887,6 +887,7 @@ static void sectionMapping(IO &IO, ELFYAML::RawContentSection &Section) {
|
||||
commonSectionMapping(IO, Section);
|
||||
IO.mapOptional("Content", Section.Content);
|
||||
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) {
|
||||
|
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());
|
||||
S->Content = yaml::BinaryRef(ContentOrErr.get());
|
||||
S->Size = S->Content.binary_size();
|
||||
S->Info = Shdr->sh_info;
|
||||
|
||||
return S.release();
|
||||
}
|
||||
|
@ -341,13 +341,16 @@ void ELFState<ELFT>::initSymtabSectionHeader(Elf_Shdr &SHeader,
|
||||
SHeader.sh_entsize = sizeof(Elf_Sym);
|
||||
SHeader.sh_addralign = 8;
|
||||
|
||||
// If .dynsym section is explicitly described in the YAML
|
||||
// then we want to use its section address.
|
||||
if (!IsStatic) {
|
||||
// Take section index and ignore the SHT_NULL section.
|
||||
unsigned SecNdx = getDotDynSymSecNo() - 1;
|
||||
if (SecNdx < Doc.Sections.size())
|
||||
SHeader.sh_addr = Doc.Sections[SecNdx]->Address;
|
||||
// Get the section index ignoring the SHT_NULL section.
|
||||
unsigned SecNdx =
|
||||
IsStatic ? getDotSymTabSecNo() - 1 : getDotDynSymSecNo() - 1;
|
||||
// If the symbol table section is explicitly described in the YAML
|
||||
// then we should set the fields requested.
|
||||
if (SecNdx < Doc.Sections.size()) {
|
||||
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;
|
||||
@ -503,6 +506,7 @@ ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader,
|
||||
else
|
||||
SHeader.sh_entsize = 0;
|
||||
SHeader.sh_size = Section.Size;
|
||||
SHeader.sh_info = Section.Info;
|
||||
}
|
||||
|
||||
static bool isMips64EL(const ELFYAML::Object &Doc) {
|
||||
|
Loading…
Reference in New Issue
Block a user