forked from OSchip/llvm-project
[yaml2obj][obj2yaml] - Simplify format of the SHT_LLVM_ADDRSIG section.
Previously the description allowed to describe symbols with use of `Name` and `Index` keys. This patch removes them and now it is still possible to use either names or symbol indexes, but the code is simpler and the format is slightly different. Such a change will be useful for another patches, e.g: https://reviews.llvm.org/D73788#inline-671077 Differential revision: https://reviews.llvm.org/D73888
This commit is contained in:
parent
ca1c21d4b6
commit
60f161eb62
|
@ -340,19 +340,10 @@ struct VerneedSection : Section {
|
|||
}
|
||||
};
|
||||
|
||||
struct AddrsigSymbol {
|
||||
AddrsigSymbol(StringRef N) : Name(N), Index(None) {}
|
||||
AddrsigSymbol(llvm::yaml::Hex32 Ndx) : Name(None), Index(Ndx) {}
|
||||
AddrsigSymbol() : Name(None), Index(None) {}
|
||||
|
||||
Optional<StringRef> Name;
|
||||
Optional<llvm::yaml::Hex32> Index;
|
||||
};
|
||||
|
||||
struct AddrsigSection : Section {
|
||||
Optional<yaml::BinaryRef> Content;
|
||||
Optional<llvm::yaml::Hex64> Size;
|
||||
Optional<std::vector<AddrsigSymbol>> Symbols;
|
||||
Optional<std::vector<YAMLFlowString>> Symbols;
|
||||
|
||||
AddrsigSection() : Section(ChunkKind::Addrsig) {}
|
||||
|
||||
|
@ -532,7 +523,6 @@ struct Object {
|
|||
} // end namespace ELFYAML
|
||||
} // end namespace llvm
|
||||
|
||||
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::ELFYAML::AddrsigSymbol)
|
||||
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::ELFYAML::StackSizeEntry)
|
||||
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::ELFYAML::DynamicEntry)
|
||||
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::ELFYAML::LinkerOption)
|
||||
|
@ -700,10 +690,6 @@ template <> struct MappingTraits<ELFYAML::VernauxEntry> {
|
|||
static void mapping(IO &IO, ELFYAML::VernauxEntry &E);
|
||||
};
|
||||
|
||||
template <> struct MappingTraits<ELFYAML::AddrsigSymbol> {
|
||||
static void mapping(IO &IO, ELFYAML::AddrsigSymbol &Sym);
|
||||
};
|
||||
|
||||
template <> struct MappingTraits<ELFYAML::LinkerOption> {
|
||||
static void mapping(IO &IO, ELFYAML::LinkerOption &Sym);
|
||||
};
|
||||
|
|
|
@ -1230,12 +1230,9 @@ void ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader,
|
|||
return;
|
||||
}
|
||||
|
||||
for (const ELFYAML::AddrsigSymbol &Sym : *Section.Symbols) {
|
||||
uint64_t Val =
|
||||
Sym.Name ? toSymbolIndex(*Sym.Name, Section.Name, /*IsDynamic=*/false)
|
||||
: (uint32_t)*Sym.Index;
|
||||
SHeader.sh_size += encodeULEB128(Val, OS);
|
||||
}
|
||||
for (StringRef Sym : *Section.Symbols)
|
||||
SHeader.sh_size += encodeULEB128(
|
||||
toSymbolIndex(Sym, Section.Name, /*IsDynamic=*/false), OS);
|
||||
}
|
||||
|
||||
template <class ELFT>
|
||||
|
|
|
@ -1383,11 +1383,6 @@ StringRef MappingTraits<std::unique_ptr<ELFYAML::Chunk>>::validate(
|
|||
|
||||
if (!Sec->Symbols)
|
||||
return {};
|
||||
|
||||
for (const ELFYAML::AddrsigSymbol &AS : *Sec->Symbols)
|
||||
if (AS.Index && AS.Name)
|
||||
return "\"Index\" and \"Name\" cannot be used together when defining a "
|
||||
"symbol";
|
||||
return {};
|
||||
}
|
||||
|
||||
|
@ -1604,12 +1599,6 @@ void MappingTraits<ELFYAML::Object>::mapping(IO &IO, ELFYAML::Object &Object) {
|
|||
IO.setContext(nullptr);
|
||||
}
|
||||
|
||||
void MappingTraits<ELFYAML::AddrsigSymbol>::mapping(IO &IO, ELFYAML::AddrsigSymbol &Sym) {
|
||||
assert(IO.getContext() && "The IO context is not initialized");
|
||||
IO.mapOptional("Name", Sym.Name);
|
||||
IO.mapOptional("Index", Sym.Index);
|
||||
}
|
||||
|
||||
void MappingTraits<ELFYAML::LinkerOption>::mapping(IO &IO,
|
||||
ELFYAML::LinkerOption &Opt) {
|
||||
assert(IO.getContext() && "The IO context is not initialized");
|
||||
|
|
|
@ -20,9 +20,7 @@ FileHeader:
|
|||
Sections:
|
||||
- Name: .llvm_addrsig
|
||||
Type: SHT_LLVM_ADDRSIG
|
||||
Symbols:
|
||||
- Name: foo
|
||||
- Name: bar
|
||||
Symbols: [ foo, bar ]
|
||||
Symbols:
|
||||
- Name: foo
|
||||
- Name: bar
|
||||
|
@ -74,10 +72,7 @@ FileHeader:
|
|||
Sections:
|
||||
- Name: .llvm_addrsig
|
||||
Type: SHT_LLVM_ADDRSIG
|
||||
Symbols:
|
||||
- Index: 1
|
||||
- Index: 255
|
||||
- Index: 2
|
||||
Symbols: [ 1, 255, 2 ]
|
||||
Symbols:
|
||||
- Name: foo
|
||||
- Name: bar
|
||||
|
|
|
@ -7,21 +7,13 @@
|
|||
# RUN: yaml2obj --docnum=1 %s -o %t1
|
||||
# RUN: obj2yaml %t1 | FileCheck %s --check-prefix=NAME
|
||||
|
||||
# NAME: - Name: .llvm_addrsig
|
||||
# NAME-NEXT: Type: SHT_LLVM_ADDRSIG
|
||||
# NAME-NEXT: Link: .symtab
|
||||
# NAME-NEXT: Symbols:
|
||||
# NAME-NEXT: - Name: foo
|
||||
# NAME-NEXT: - Name: bar
|
||||
# NAME-NEXT: - Index: 0x00000003
|
||||
# NAME-NEXT: - Index: 0xFFFFFFFF
|
||||
# NAME: - Name: .llvm_addrsig
|
||||
# NAME-NEXT: Type: SHT_LLVM_ADDRSIG
|
||||
# NAME-NEXT: Link: .symtab
|
||||
# NAME-NEXT: Symbols: [ foo, bar, '3', '4294967295' ]
|
||||
# NAME: - Name: .llvm_addrsig_unlinked
|
||||
# NAME-NEXT: Type: SHT_LLVM_ADDRSIG
|
||||
# NAME-NEXT: Symbols:
|
||||
# NAME-NEXT: - Index: 0x00000001
|
||||
# NAME-NEXT: - Index: 0x00000002
|
||||
# NAME-NEXT: - Index: 0x00000003
|
||||
# NAME-NEXT: - Index: 0xFFFFFFFF
|
||||
# NAME-NEXT: Symbols: [ '1', '2', '3', '4294967295' ]
|
||||
|
||||
--- !ELF
|
||||
FileHeader:
|
||||
|
@ -32,19 +24,11 @@ FileHeader:
|
|||
Sections:
|
||||
- Name: .llvm_addrsig
|
||||
Type: SHT_LLVM_ADDRSIG
|
||||
Symbols:
|
||||
- Index: 1
|
||||
- Index: 2
|
||||
- Index: 3
|
||||
- Index: 0xFFFFFFFF
|
||||
Symbols: [ 1, 2, 3, 0xFFFFFFFF ]
|
||||
- Name: .llvm_addrsig_unlinked
|
||||
Type: SHT_LLVM_ADDRSIG
|
||||
Link: 0
|
||||
Symbols:
|
||||
- Index: 1
|
||||
- Index: 2
|
||||
- Index: 3
|
||||
- Index: 0xFFFFFFFF
|
||||
Symbols: [ 1, 2, 3, 0xFFFFFFFF ]
|
||||
Symbols:
|
||||
- Name: foo
|
||||
Type: STT_FUNC
|
||||
|
@ -82,7 +66,7 @@ Sections:
|
|||
|
||||
# EMPTY: - Name: .llvm_addrsig
|
||||
# EMPTY-NEXT: Type: SHT_LLVM_ADDRSIG
|
||||
# EMPTY-NEXT: Symbols: []
|
||||
# EMPTY-NEXT: Symbols: [ ]
|
||||
|
||||
--- !ELF
|
||||
FileHeader:
|
||||
|
|
|
@ -33,11 +33,7 @@ FileHeader:
|
|||
Sections:
|
||||
- Name: .llvm_addrsig
|
||||
Type: SHT_LLVM_ADDRSIG
|
||||
Symbols:
|
||||
- Name: foo
|
||||
- Name: bar
|
||||
- Index: 1
|
||||
- Index: 2
|
||||
Symbols: [ foo, bar, 1, 2 ]
|
||||
Symbols:
|
||||
- Name: foo
|
||||
Type: STT_FUNC
|
||||
|
@ -46,33 +42,10 @@ Symbols:
|
|||
Type: STT_FUNC
|
||||
Binding: STB_GLOBAL
|
||||
|
||||
## We can't specify both "Index" and "Name" when defining a symbol.
|
||||
|
||||
# RUN: not yaml2obj --docnum=2 %s 2>&1 | FileCheck %s --check-prefix=INDEX-NAME
|
||||
|
||||
# INDEX-NAME: error: "Index" and "Name" cannot be used together when defining a symbol
|
||||
|
||||
--- !ELF
|
||||
FileHeader:
|
||||
Class: ELFCLASS64
|
||||
Data: ELFDATA2LSB
|
||||
Type: ET_DYN
|
||||
Machine: EM_X86_64
|
||||
Sections:
|
||||
- Name: .llvm_addrsig
|
||||
Type: SHT_LLVM_ADDRSIG
|
||||
Symbols:
|
||||
- Name: foo
|
||||
Index: 1
|
||||
Symbols:
|
||||
- Name: foo
|
||||
Type: STT_FUNC
|
||||
Binding: STB_GLOBAL
|
||||
|
||||
## Check we report an error if an unknown symbol is referenced in the
|
||||
## SHT_LLVM_ADDRSIG section description.
|
||||
|
||||
# RUN: not yaml2obj --docnum=3 %s 2>&1 | FileCheck %s --check-prefix=SYMBOL-UNKNOWN
|
||||
# RUN: not yaml2obj --docnum=2 %s 2>&1 | FileCheck %s --check-prefix=SYMBOL-UNKNOWN
|
||||
|
||||
# SYMBOL-UNKNOWN: error: unknown symbol referenced: 'foo' by YAML section '.llvm_addrsig'
|
||||
# SYMBOL-UNKNOWN: error: unknown symbol referenced: 'bar' by YAML section '.llvm_addrsig'
|
||||
|
@ -86,14 +59,12 @@ FileHeader:
|
|||
Sections:
|
||||
- Name: .llvm_addrsig
|
||||
Type: SHT_LLVM_ADDRSIG
|
||||
Symbols:
|
||||
- Name: foo
|
||||
- Name: bar
|
||||
Symbols: [ foo, bar ]
|
||||
|
||||
## Check we can specify any arbitrary symbol indices.
|
||||
|
||||
# RUN: yaml2obj --docnum=4 %s -o %t4
|
||||
# RUN: llvm-readobj --sections --section-data %t4 | FileCheck %s --check-prefix=SYMBOL-INDEX
|
||||
# RUN: yaml2obj --docnum=3 %s -o %t3
|
||||
# RUN: llvm-readobj --sections --section-data %t3 | FileCheck %s --check-prefix=SYMBOL-INDEX
|
||||
|
||||
# SYMBOL-INDEX: Type: SHT_LLVM_ADDRSIG
|
||||
# SYMBOL-INDEX: SectionData (
|
||||
|
@ -109,18 +80,14 @@ FileHeader:
|
|||
Sections:
|
||||
- Name: .llvm_addrsig
|
||||
Type: SHT_LLVM_ADDRSIG
|
||||
Symbols:
|
||||
- Index: 0
|
||||
- Index: 255
|
||||
- Index: 0x11223344
|
||||
## 0xFFFFFFFF is a maximum allowed index value.
|
||||
- Index: 0xFFFFFFFF
|
||||
Symbols: [ 0, 255, 0x11223344, 0xFFFFFFFF ]
|
||||
|
||||
## Check that the maximum symbol index size is 32 bits.
|
||||
|
||||
# RUN: not yaml2obj --docnum=5 %s 2>&1 | FileCheck %s --check-prefix=SYMBOL-INDEX-OVERFLOW
|
||||
# RUN: not yaml2obj --docnum=4 %s 2>&1 | FileCheck %s --check-prefix=SYMBOL-INDEX-OVERFLOW
|
||||
|
||||
# SYMBOL-INDEX-OVERFLOW: error: out of range hex32 number
|
||||
# SYMBOL-INDEX-OVERFLOW: error: unknown symbol referenced: '0x1122334455' by YAML section '.llvm_addrsig'
|
||||
|
||||
--- !ELF
|
||||
FileHeader:
|
||||
|
@ -131,13 +98,12 @@ FileHeader:
|
|||
Sections:
|
||||
- Name: .llvm_addrsig
|
||||
Type: SHT_LLVM_ADDRSIG
|
||||
Symbols:
|
||||
- Index: 0x1122334455
|
||||
Symbols: [ 0x1122334455 ]
|
||||
|
||||
## Check we can use the "Content" tag to specify any data for SHT_LLVM_ADDRSIG sections.
|
||||
|
||||
# RUN: yaml2obj --docnum=6 %s -o %t6
|
||||
# RUN: llvm-readobj --sections --section-data %t6 | FileCheck %s --check-prefix=CONTENT
|
||||
# RUN: yaml2obj --docnum=5 %s -o %t5
|
||||
# RUN: llvm-readobj --sections --section-data %t5 | FileCheck %s --check-prefix=CONTENT
|
||||
|
||||
# CONTENT: Type: SHT_LLVM_ADDRSIG
|
||||
# CONTENT: Size:
|
||||
|
@ -159,7 +125,7 @@ Sections:
|
|||
|
||||
## Either "Content" or "Symbols" must be specifed for SHT_LLVM_ADDRSIG sections.
|
||||
|
||||
# RUN: not yaml2obj --docnum=7 %s 2>&1 | FileCheck %s --check-prefix=NO-TAGS
|
||||
# RUN: not yaml2obj --docnum=6 %s 2>&1 | FileCheck %s --check-prefix=NO-TAGS
|
||||
|
||||
# NO-TAGS: error: one of "Content", "Size" or "Symbols" must be specified
|
||||
|
||||
|
@ -175,7 +141,7 @@ Sections:
|
|||
|
||||
## "Content" and "Symbols" cannot be used together to describe the SHT_LLVM_ADDRSIG section.
|
||||
|
||||
# RUN: not yaml2obj --docnum=8 %s 2>&1 | FileCheck %s --check-prefix=CONTENT-SYMBOLS
|
||||
# RUN: not yaml2obj --docnum=7 %s 2>&1 | FileCheck %s --check-prefix=CONTENT-SYMBOLS
|
||||
|
||||
# CONTENT-SYMBOLS: "Symbols" cannot be used with "Content" or "Size"
|
||||
|
||||
|
@ -193,8 +159,8 @@ Sections:
|
|||
|
||||
## Check we can set an arbitrary sh_link value for SHT_LLVM_ADDRSIG sections.
|
||||
|
||||
# RUN: yaml2obj --docnum=9 %s -o %t9
|
||||
# RUN: llvm-readobj --sections %t9 | FileCheck %s --check-prefix=LINK
|
||||
# RUN: yaml2obj --docnum=8 %s -o %t8
|
||||
# RUN: llvm-readobj --sections %t8 | FileCheck %s --check-prefix=LINK
|
||||
|
||||
# LINK: Name: .llvm_addrsig
|
||||
# LINK: Link:
|
||||
|
@ -214,8 +180,8 @@ Sections:
|
|||
|
||||
## Check we can use only "Size" to create a SHT_LLVM_ADDRSIG section.
|
||||
|
||||
# RUN: yaml2obj --docnum=10 %s -o %t10
|
||||
# RUN: llvm-readobj --sections --section-data %t10 | FileCheck %s --check-prefix=SIZE
|
||||
# RUN: yaml2obj --docnum=9 %s -o %t9
|
||||
# RUN: llvm-readobj --sections --section-data %t9 | FileCheck %s --check-prefix=SIZE
|
||||
|
||||
# SIZE: Name: .llvm_addrsig
|
||||
# SIZE: Size:
|
||||
|
@ -238,8 +204,8 @@ Sections:
|
|||
|
||||
## Check we can use "Size" and "Content" together to create a SHT_LLVM_ADDRSIG section.
|
||||
|
||||
# RUN: yaml2obj --docnum=11 %s -o %t11
|
||||
# RUN: llvm-readobj --sections --section-data %t11 | FileCheck %s --check-prefix=SIZE-CONTENT
|
||||
# RUN: yaml2obj --docnum=10 %s -o %t10
|
||||
# RUN: llvm-readobj --sections --section-data %t10 | FileCheck %s --check-prefix=SIZE-CONTENT
|
||||
|
||||
# SIZE-CONTENT: Name: .llvm_addrsig_sizegr
|
||||
# SIZE-CONTENT: Size:
|
||||
|
@ -274,7 +240,7 @@ Sections:
|
|||
## Check that when "Size" and "Content" are used together, the size
|
||||
## must be greater than or equal to the content size.
|
||||
|
||||
# RUN: not yaml2obj --docnum=12 %s 2>&1 | FileCheck %s --check-prefix=SIZE-CONTENT-ERR
|
||||
# RUN: not yaml2obj --docnum=11 %s 2>&1 | FileCheck %s --check-prefix=SIZE-CONTENT-ERR
|
||||
|
||||
# SIZE-CONTENT-ERR: error: "Size" must be greater than or equal to the content size
|
||||
|
||||
|
@ -292,7 +258,7 @@ Sections:
|
|||
|
||||
## Check we can't use "Size" and "Symbols" tags together.
|
||||
|
||||
# RUN: not yaml2obj --docnum=13 %s 2>&1 | FileCheck %s --check-prefix=CONTENT-SYMBOLS
|
||||
# RUN: not yaml2obj --docnum=12 %s 2>&1 | FileCheck %s --check-prefix=CONTENT-SYMBOLS
|
||||
|
||||
--- !ELF
|
||||
FileHeader:
|
||||
|
|
|
@ -40,6 +40,8 @@ class ELFDumper {
|
|||
DenseMap<StringRef, uint32_t> UsedSymbolNames;
|
||||
std::vector<std::string> SymbolNames;
|
||||
|
||||
BumpPtrAllocator StringAllocator;
|
||||
|
||||
Expected<StringRef> getUniquedSectionName(const Elf_Shdr *Sec);
|
||||
Expected<StringRef> getUniquedSymbolName(const Elf_Sym *Sym,
|
||||
StringRef StrTable,
|
||||
|
@ -603,7 +605,7 @@ ELFDumper<ELFT>::dumpAddrsigSection(const Elf_Shdr *Shdr) {
|
|||
ArrayRef<uint8_t> Content = *ContentOrErr;
|
||||
DataExtractor::Cursor Cur(0);
|
||||
DataExtractor Data(Content, Obj.isLE(), /*AddressSize=*/0);
|
||||
std::vector<ELFYAML::AddrsigSymbol> Symbols;
|
||||
std::vector<ELFYAML::YAMLFlowString> Symbols;
|
||||
while (Cur && Cur.tell() < Content.size()) {
|
||||
uint64_t SymNdx = Data.getULEB128(Cur);
|
||||
if (!Cur)
|
||||
|
@ -612,7 +614,8 @@ ELFDumper<ELFT>::dumpAddrsigSection(const Elf_Shdr *Shdr) {
|
|||
Expected<StringRef> SymbolName = getSymbolName(Shdr->sh_link, SymNdx);
|
||||
if (!SymbolName || SymbolName->empty()) {
|
||||
consumeError(SymbolName.takeError());
|
||||
Symbols.emplace_back(SymNdx);
|
||||
Symbols.emplace_back(
|
||||
StringRef(std::to_string(SymNdx)).copy(StringAllocator));
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue