From fe893839f94dbd47ff372f2b040917d3c9ec6c2d Mon Sep 17 00:00:00 2001 From: Frederic Riss Date: Wed, 26 Aug 2015 05:09:52 +0000 Subject: [PATCH] [dsymutil] Split NonRelocatableStringPool into its own file. NFC. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@246009 91177308-0d34-0410-b5e6-96231b3b80d8 --- tools/dsymutil/DwarfLinker.cpp | 121 +++++++++--------------------- tools/dsymutil/NonRelocatableStringpool.h | 68 +++++++++++++++++ 2 files changed, 103 insertions(+), 86 deletions(-) create mode 100644 tools/dsymutil/NonRelocatableStringpool.h diff --git a/tools/dsymutil/DwarfLinker.cpp b/tools/dsymutil/DwarfLinker.cpp index e2ece42d30c..5d9a4f86329 100644 --- a/tools/dsymutil/DwarfLinker.cpp +++ b/tools/dsymutil/DwarfLinker.cpp @@ -10,6 +10,7 @@ #include "BinaryHolder.h" #include "DebugMap.h" #include "dsymutil.h" +#include "NonRelocatableStringpool.h" #include "llvm/ADT/IntervalMap.h" #include "llvm/ADT/StringMap.h" #include "llvm/ADT/STLExtras.h" @@ -83,7 +84,6 @@ struct PatchLocation { class CompileUnit; struct DeclMapInfo; -class NonRelocatableStringpool; /// A DeclContext is a named program scope that is used for ODR /// uniquing of types. @@ -444,91 +444,6 @@ void CompileUnit::addTypeAccelerator(const DIE *Die, const char *Name, Pubtypes.emplace_back(Name, Die, Offset, false); } -/// \brief A string table that doesn't need relocations. -/// -/// We are doing a final link, no need for a string table that -/// has relocation entries for every reference to it. This class -/// provides this ablitity by just associating offsets with -/// strings. -class NonRelocatableStringpool { -public: - /// \brief Entries are stored into the StringMap and simply linked - /// together through the second element of this pair in order to - /// keep track of insertion order. - typedef StringMap, BumpPtrAllocator> - MapTy; - - NonRelocatableStringpool() - : CurrentEndOffset(0), Sentinel(0), Last(&Sentinel) { - // Legacy dsymutil puts an empty string at the start of the line - // table. - getStringOffset(""); - } - - /// \brief Get the offset of string \p S in the string table. This - /// can insert a new element or return the offset of a preexisitng - /// one. - uint32_t getStringOffset(StringRef S); - - /// \brief Get permanent storage for \p S (but do not necessarily - /// emit \p S in the output section). - /// \returns The StringRef that points to permanent storage to use - /// in place of \p S. - StringRef internString(StringRef S); - - // \brief Return the first entry of the string table. - const MapTy::MapEntryTy *getFirstEntry() const { - return getNextEntry(&Sentinel); - } - - // \brief Get the entry following \p E in the string table or null - // if \p E was the last entry. - const MapTy::MapEntryTy *getNextEntry(const MapTy::MapEntryTy *E) const { - return static_cast(E->getValue().second); - } - - uint64_t getSize() { return CurrentEndOffset; } - -private: - MapTy Strings; - uint32_t CurrentEndOffset; - MapTy::MapEntryTy Sentinel, *Last; -}; - -/// \brief Get the offset of string \p S in the string table. This -/// can insert a new element or return the offset of a preexisitng -/// one. -uint32_t NonRelocatableStringpool::getStringOffset(StringRef S) { - if (S.empty() && !Strings.empty()) - return 0; - - std::pair Entry(0, nullptr); - MapTy::iterator It; - bool Inserted; - - // A non-empty string can't be at offset 0, so if we have an entry - // with a 0 offset, it must be a previously interned string. - std::tie(It, Inserted) = Strings.insert(std::make_pair(S, Entry)); - if (Inserted || It->getValue().first == 0) { - // Set offset and chain at the end of the entries list. - It->getValue().first = CurrentEndOffset; - CurrentEndOffset += S.size() + 1; // +1 for the '\0'. - Last->getValue().second = &*It; - Last = &*It; - } - return It->getValue().first; -} - -/// \brief Put \p S into the StringMap so that it gets permanent -/// storage, but do not actually link it in the chain of elements -/// that go into the output section. A latter call to -/// getStringOffset() with the same string will chain it though. -StringRef NonRelocatableStringpool::internString(StringRef S) { - std::pair Entry(0, nullptr); - auto InsertResult = Strings.insert(std::make_pair(S, Entry)); - return InsertResult.first->getKey(); -} - /// \brief The Dwarf streaming logic /// /// All interactions with the MC layer that is used to build the debug @@ -3141,6 +3056,40 @@ bool DwarfLinker::link(const DebugMap &Map) { } } +/// \brief Get the offset of string \p S in the string table. This +/// can insert a new element or return the offset of a preexisitng +/// one. +uint32_t NonRelocatableStringpool::getStringOffset(StringRef S) { + if (S.empty() && !Strings.empty()) + return 0; + + std::pair Entry(0, nullptr); + MapTy::iterator It; + bool Inserted; + + // A non-empty string can't be at offset 0, so if we have an entry + // with a 0 offset, it must be a previously interned string. + std::tie(It, Inserted) = Strings.insert(std::make_pair(S, Entry)); + if (Inserted || It->getValue().first == 0) { + // Set offset and chain at the end of the entries list. + It->getValue().first = CurrentEndOffset; + CurrentEndOffset += S.size() + 1; // +1 for the '\0'. + Last->getValue().second = &*It; + Last = &*It; + } + return It->getValue().first; +} + +/// \brief Put \p S into the StringMap so that it gets permanent +/// storage, but do not actually link it in the chain of elements +/// that go into the output section. A latter call to +/// getStringOffset() with the same string will chain it though. +StringRef NonRelocatableStringpool::internString(StringRef S) { + std::pair Entry(0, nullptr); + auto InsertResult = Strings.insert(std::make_pair(S, Entry)); + return InsertResult.first->getKey(); +} + bool linkDwarf(StringRef OutputFilename, const DebugMap &DM, const LinkOptions &Options) { DwarfLinker Linker(OutputFilename, Options); diff --git a/tools/dsymutil/NonRelocatableStringpool.h b/tools/dsymutil/NonRelocatableStringpool.h new file mode 100644 index 00000000000..9db1f3342bd --- /dev/null +++ b/tools/dsymutil/NonRelocatableStringpool.h @@ -0,0 +1,68 @@ +//===-- NonRelocatableStringpool.h - A simple stringpool -----------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_TOOLS_DSYMUTIL_NONRELOCATABLESTRINGPOOL_H +#define LLVM_TOOLS_DSYMUTIL_NONRELOCATABLESTRINGPOOL_H + +namespace llvm { +namespace dsymutil { + +/// \brief A string table that doesn't need relocations. +/// +/// We are doing a final link, no need for a string table that +/// has relocation entries for every reference to it. This class +/// provides this ablitity by just associating offsets with +/// strings. +class NonRelocatableStringpool { +public: + /// \brief Entries are stored into the StringMap and simply linked + /// together through the second element of this pair in order to + /// keep track of insertion order. + typedef StringMap, BumpPtrAllocator> + MapTy; + + NonRelocatableStringpool() + : CurrentEndOffset(0), Sentinel(0), Last(&Sentinel) { + // Legacy dsymutil puts an empty string at the start of the line + // table. + getStringOffset(""); + } + + /// \brief Get the offset of string \p S in the string table. This + /// can insert a new element or return the offset of a preexisitng + /// one. + uint32_t getStringOffset(StringRef S); + + /// \brief Get permanent storage for \p S (but do not necessarily + /// emit \p S in the output section). + /// \returns The StringRef that points to permanent storage to use + /// in place of \p S. + StringRef internString(StringRef S); + + // \brief Return the first entry of the string table. + const MapTy::MapEntryTy *getFirstEntry() const { + return getNextEntry(&Sentinel); + } + + // \brief Get the entry following \p E in the string table or null + // if \p E was the last entry. + const MapTy::MapEntryTy *getNextEntry(const MapTy::MapEntryTy *E) const { + return static_cast(E->getValue().second); + } + + uint64_t getSize() { return CurrentEndOffset; } + +private: + MapTy Strings; + uint32_t CurrentEndOffset; + MapTy::MapEntryTy Sentinel, *Last; +}; +} +} + +#endif -- 2.11.0