[llvm] r184260 - [yaml2obj][ELF] Don't monkeypatch the YAML sections.

Sean Silva silvas at purdue.edu
Tue Jun 18 16:37:23 PDT 2013


Author: silvas
Date: Tue Jun 18 18:37:23 2013
New Revision: 184260

URL: http://llvm.org/viewvc/llvm-project?rev=184260&view=rev
Log:
[yaml2obj][ELF] Don't monkeypatch the YAML sections.

Previously, we would monkeypatch the vector of YAML::Section's in order
to ensure that the SHT_NULL entry is present. Now we just add it
unconditionally.

The proliferation of small numerical adjustments is beginning to
frighten me, but I can't think of a way having a single point of truth
for them without introducing a whole new layer  of data structures (i.e.
lots of code and complexity) between the YAML and binary ELF formats.

Modified:
    llvm/trunk/tools/yaml2obj/yaml2elf.cpp

Modified: llvm/trunk/tools/yaml2obj/yaml2elf.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/yaml2elf.cpp?rev=184260&r1=184259&r2=184260&view=diff
==============================================================================
--- llvm/trunk/tools/yaml2obj/yaml2elf.cpp (original)
+++ llvm/trunk/tools/yaml2obj/yaml2elf.cpp Tue Jun 18 18:37:23 2013
@@ -209,27 +209,23 @@ static int writeELF(raw_ostream &OS, con
   Header.e_shentsize = sizeof(Elf_Shdr);
   // Immediately following the ELF header.
   Header.e_shoff = sizeof(Header);
-  std::vector<ELFYAML::Section> Sections = Doc.Sections;
-  if (Sections.empty() || Sections.front().Type != SHT_NULL) {
-    ELFYAML::Section S;
-    S.Type = SHT_NULL;
-    zero(S.Flags);
-    zero(S.Address);
-    zero(S.AddressAlign);
-    Sections.insert(Sections.begin(), S);
-  }
-  // "+ 2" for string table and section header string table.
-  Header.e_shnum = Sections.size() + 2;
+  const std::vector<ELFYAML::Section> &Sections = Doc.Sections;
+  // "+ 3" for
+  // - SHT_NULL entry (placed first, i.e. 0'th entry)
+  // - string table (.strtab) (placed second to last)
+  // - section header string table. (placed last)
+  Header.e_shnum = Sections.size() + 3;
   // Place section header string table last.
-  Header.e_shstrndx = Sections.size() + 1;
-  const unsigned DotStrtabSecNo = Sections.size();
+  Header.e_shstrndx = Header.e_shnum - 1;
+  const unsigned DotStrtabSecNo = Header.e_shnum - 2;
 
   SectionNameToIdxMap SN2I;
   for (unsigned i = 0, e = Sections.size(); i != e; ++i) {
     StringRef Name = Sections[i].Name;
     if (Name.empty())
       continue;
-    if (SN2I.addName(Name, i)) {
+    // "+ 1" to take into account the SHT_NULL entry.
+    if (SN2I.addName(Name, i + 1)) {
       errs() << "error: Repeated section name: '" << Name
              << "' at YAML section number " << i << ".\n";
       return 1;
@@ -244,6 +240,13 @@ static int writeELF(raw_ostream &OS, con
       Header.e_ehsize + Header.e_shentsize * Header.e_shnum;
   ContiguousBlobAccumulator CBA(SectionContentBeginOffset, Buf);
   std::vector<Elf_Shdr> SHeaders;
+  {
+    // Ensure SHN_UNDEF entry is present. An all-zero section header is a
+    // valid SHN_UNDEF entry since SHT_NULL == 0.
+    Elf_Shdr SHdr;
+    zero(SHdr);
+    SHeaders.push_back(SHdr);
+  }
   StringTableBuilder DotStrTab;
   for (unsigned i = 0, e = Sections.size(); i != e; ++i) {
     const ELFYAML::Section &Sec = Sections[i];





More information about the llvm-commits mailing list