[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
diff --git a/llvm/tools/yaml2obj/yaml2elf.cpp b/llvm/tools/yaml2obj/yaml2elf.cpp
index d651c92..7b5841b 100644
--- a/llvm/tools/yaml2obj/yaml2elf.cpp
+++ b/llvm/tools/yaml2obj/yaml2elf.cpp
@@ -341,13 +341,16 @@
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 @@
else
SHeader.sh_entsize = 0;
SHeader.sh_size = Section.Size;
+ SHeader.sh_info = Section.Info;
}
static bool isMips64EL(const ELFYAML::Object &Doc) {