[llvm] 3d4c873 - [yaml2obj] - Map section names to chunks for each ELFYAML::ProgramHeader early. NFCI.
Georgii Rymar via llvm-commits
llvm-commits at lists.llvm.org
Tue May 26 02:32:28 PDT 2020
Author: Georgii Rymar
Date: 2020-05-26T12:32:10+03:00
New Revision: 3d4c873a14fe2ffb5cd6ac329354857eef245196
URL: https://github.com/llvm/llvm-project/commit/3d4c873a14fe2ffb5cd6ac329354857eef245196
DIFF: https://github.com/llvm/llvm-project/commit/3d4c873a14fe2ffb5cd6ac329354857eef245196.diff
LOG: [yaml2obj] - Map section names to chunks for each ELFYAML::ProgramHeader early. NFCI.
Each `ELFYAML::ProgramHeader` currently contains a list of section names
included. We are trying to map them to Fill/Sections very late,
though we can create such mapping early, in `initProgramHeaders`.
The benefit is that with such change it is possible to access mapped
chunks earlier (for example during writing section content) and have
simpler code.
Differential revision: https://reviews.llvm.org/D80520
Added:
Modified:
llvm/include/llvm/ObjectYAML/ELFYAML.h
llvm/lib/ObjectYAML/ELFEmitter.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/ObjectYAML/ELFYAML.h b/llvm/include/llvm/ObjectYAML/ELFYAML.h
index 2fd18fcd2957..22ed82289ca8 100644
--- a/llvm/include/llvm/ObjectYAML/ELFYAML.h
+++ b/llvm/include/llvm/ObjectYAML/ELFYAML.h
@@ -90,18 +90,6 @@ struct SectionName {
StringRef Section;
};
-struct ProgramHeader {
- ELF_PT Type;
- ELF_PF Flags;
- llvm::yaml::Hex64 VAddr;
- llvm::yaml::Hex64 PAddr;
- Optional<llvm::yaml::Hex64> Align;
- Optional<llvm::yaml::Hex64> FileSize;
- Optional<llvm::yaml::Hex64> MemSize;
- Optional<llvm::yaml::Hex64> Offset;
- std::vector<SectionName> Sections;
-};
-
struct Symbol {
StringRef Name;
ELF_STT Type;
@@ -503,6 +491,21 @@ struct MipsABIFlags : Section {
}
};
+struct ProgramHeader {
+ ELF_PT Type;
+ ELF_PF Flags;
+ llvm::yaml::Hex64 VAddr;
+ llvm::yaml::Hex64 PAddr;
+ Optional<llvm::yaml::Hex64> Align;
+ Optional<llvm::yaml::Hex64> FileSize;
+ Optional<llvm::yaml::Hex64> MemSize;
+ Optional<llvm::yaml::Hex64> Offset;
+
+ std::vector<SectionName> Sections;
+ // This vector is parallel to Sections and contains corresponding chunks.
+ std::vector<Chunk *> Chunks;
+};
+
struct Object {
FileHeader Header;
std::vector<ProgramHeader> ProgramHeaders;
diff --git a/llvm/lib/ObjectYAML/ELFEmitter.cpp b/llvm/lib/ObjectYAML/ELFEmitter.cpp
index 95d74eeeb6e6..78093491704b 100644
--- a/llvm/lib/ObjectYAML/ELFEmitter.cpp
+++ b/llvm/lib/ObjectYAML/ELFEmitter.cpp
@@ -330,7 +330,13 @@ void ELFState<ELFT>::writeELFHeader(ContiguousBlobAccumulator &CBA, raw_ostream
template <class ELFT>
void ELFState<ELFT>::initProgramHeaders(std::vector<Elf_Phdr> &PHeaders) {
- for (const auto &YamlPhdr : Doc.ProgramHeaders) {
+ DenseMap<StringRef, ELFYAML::Fill *> NameToFill;
+ for (const std::unique_ptr<ELFYAML::Chunk> &D : Doc.Chunks)
+ if (auto S = dyn_cast<ELFYAML::Fill>(D.get()))
+ NameToFill[S->Name] = S;
+
+ std::vector<ELFYAML::Section *> Sections = Doc.getSections();
+ for (ELFYAML::ProgramHeader &YamlPhdr : Doc.ProgramHeaders) {
Elf_Phdr Phdr;
zero(Phdr);
Phdr.p_type = YamlPhdr.Type;
@@ -338,6 +344,23 @@ void ELFState<ELFT>::initProgramHeaders(std::vector<Elf_Phdr> &PHeaders) {
Phdr.p_vaddr = YamlPhdr.VAddr;
Phdr.p_paddr = YamlPhdr.PAddr;
PHeaders.push_back(Phdr);
+
+ // Map Sections list to corresponding chunks.
+ for (const ELFYAML::SectionName &SecName : YamlPhdr.Sections) {
+ if (ELFYAML::Fill *Fill = NameToFill.lookup(SecName.Section)) {
+ YamlPhdr.Chunks.push_back(Fill);
+ continue;
+ }
+
+ unsigned Index;
+ if (SN2I.lookup(SecName.Section, Index)) {
+ YamlPhdr.Chunks.push_back(Sections[Index]);
+ continue;
+ }
+
+ reportError("unknown section or fill referenced: '" + SecName.Section +
+ "' by program header");
+ }
}
}
@@ -757,31 +780,19 @@ template <class ELFT> void ELFState<ELFT>::reportError(const Twine &Msg) {
template <class ELFT>
std::vector<Fragment>
ELFState<ELFT>::getPhdrFragments(const ELFYAML::ProgramHeader &Phdr,
- ArrayRef<typename ELFT::Shdr> SHeaders) {
- DenseMap<StringRef, ELFYAML::Fill *> NameToFill;
- for (const std::unique_ptr<ELFYAML::Chunk> &D : Doc.Chunks)
- if (auto S = dyn_cast<ELFYAML::Fill>(D.get()))
- NameToFill[S->Name] = S;
-
+ ArrayRef<Elf_Shdr> SHeaders) {
std::vector<Fragment> Ret;
- for (const ELFYAML::SectionName &SecName : Phdr.Sections) {
- unsigned Index;
- if (SN2I.lookup(SecName.Section, Index)) {
- const typename ELFT::Shdr &H = SHeaders[Index];
- Ret.push_back({H.sh_offset, H.sh_size, H.sh_type, H.sh_addralign});
- continue;
- }
-
- if (ELFYAML::Fill *Fill = NameToFill.lookup(SecName.Section)) {
- Ret.push_back({*Fill->Offset, Fill->Size, llvm::ELF::SHT_PROGBITS,
+ for (const ELFYAML::Chunk *C : Phdr.Chunks) {
+ if (const ELFYAML::Fill *F = dyn_cast<ELFYAML::Fill>(C)) {
+ Ret.push_back({*F->Offset, F->Size, llvm::ELF::SHT_PROGBITS,
/*ShAddrAlign=*/1});
continue;
}
- reportError("unknown section or fill referenced: '" + SecName.Section +
- "' by program header");
+ const ELFYAML::Section *S = cast<ELFYAML::Section>(C);
+ const Elf_Shdr &H = SHeaders[SN2I.get(S->Name)];
+ Ret.push_back({H.sh_offset, H.sh_size, H.sh_type, H.sh_addralign});
}
-
return Ret;
}
More information about the llvm-commits
mailing list