From fe57e347a57d643bbbcc9c19c8267a3e8c06b5a6 Mon Sep 17 00:00:00 2001 From: Sean Silva Date: Sat, 15 Jun 2013 00:25:26 +0000 Subject: [yaml2obj] Add support for sh_link via `Link` key. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@184022 91177308-0d34-0410-b5e6-96231b3b80d8 --- tools/yaml2obj/yaml2elf.cpp | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) (limited to 'tools') diff --git a/tools/yaml2obj/yaml2elf.cpp b/tools/yaml2obj/yaml2elf.cpp index e5988be329..e6a157cfd8 100644 --- a/tools/yaml2obj/yaml2elf.cpp +++ b/tools/yaml2obj/yaml2elf.cpp @@ -76,6 +76,29 @@ public: void writeBlobToStream(raw_ostream &Out) { Out << OS.str(); } }; +// Used to keep track of section names, so that in the YAML file sections +// can be referenced by name instead of by index. +class SectionNameToIdxMap { + StringMap Map; +public: + /// \returns true if name is already present in the map. + bool addName(StringRef SecName, unsigned i) { + StringMapEntry &Entry = Map.GetOrCreateValue(SecName, -1); + if (Entry.getValue() != -1) + return true; + Entry.setValue((int)i); + return false; + } + /// \returns true if name is not present in the map + bool lookupSection(StringRef SecName, unsigned &Idx) const { + StringMap::const_iterator I = Map.find(SecName); + if (I == Map.end()) + return true; + Idx = I->getValue(); + return false; + } +}; + template static size_t vectorDataSize(const std::vector &Vec) { return Vec.size() * sizeof(T); @@ -138,6 +161,18 @@ static void writeELF(raw_ostream &OS, const ELFYAML::Object &Doc) { // Place section header string table last. Header.e_shstrndx = Sections.size(); + 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)) { + errs() << "error: Repeated section name: '" << Name + << "' at YAML section number " << i << ".\n"; + return; + } + } + StringTableBuilder StrTab; SmallVector Buf; // XXX: This offset is tightly coupled with the order that we write @@ -159,7 +194,15 @@ static void writeELF(raw_ostream &OS, const ELFYAML::Object &Doc) { SHeader.sh_size = Sec.Content.binary_size(); Sec.Content.writeAsBinary(CBA.getOS()); - SHeader.sh_link = 0; + if (!Sec.Link.empty()) { + unsigned Index; + if (SN2I.lookupSection(Sec.Link, Index)) { + errs() << "error: Unknown section referenced: '" << Sec.Link + << "' at YAML section number " << i << ".\n"; + return; + } + SHeader.sh_link = Index; + } SHeader.sh_info = 0; SHeader.sh_addralign = Sec.AddressAlign; SHeader.sh_entsize = 0; -- cgit v1.2.3