}
};
-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) {}
} // 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)
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);
};
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>
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 {};
}
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");
Sections:
- Name: .llvm_addrsig
Type: SHT_LLVM_ADDRSIG
- Symbols:
- - Name: foo
- - Name: bar
+ Symbols: [ foo, bar ]
Symbols:
- Name: foo
- Name: bar
Sections:
- Name: .llvm_addrsig
Type: SHT_LLVM_ADDRSIG
- Symbols:
- - Index: 1
- - Index: 255
- - Index: 2
+ Symbols: [ 1, 255, 2 ]
Symbols:
- Name: foo
- Name: bar
# 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:
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
# EMPTY: - Name: .llvm_addrsig
# EMPTY-NEXT: Type: SHT_LLVM_ADDRSIG
-# EMPTY-NEXT: Symbols: []
+# EMPTY-NEXT: Symbols: [ ]
--- !ELF
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
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'
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 (
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:
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:
## 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
## "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"
## 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:
## 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:
## 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:
## 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
## 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:
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,
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)
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;
}