| //===- NonRelocatableStringpool.h - A simple stringpool --------*- C++ -*-===// |
| // |
| // 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 |
| |
| #include "llvm/ADT/StringMap.h" |
| #include "llvm/ADT/StringRef.h" |
| #include "llvm/Support/Allocator.h" |
| #include <cstdint> |
| #include <utility> |
| |
| 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. |
| using MapTy = |
| StringMap<std::pair<uint32_t, StringMapEntryBase *>, BumpPtrAllocator>; |
| |
| NonRelocatableStringpool() : 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<const MapTy::MapEntryTy *>(E->getValue().second); |
| } |
| |
| uint64_t getSize() { return CurrentEndOffset; } |
| |
| private: |
| MapTy Strings; |
| uint32_t CurrentEndOffset = 0; |
| MapTy::MapEntryTy Sentinel, *Last; |
| }; |
| |
| } // end namespace dsymutil |
| } // end namespace llvm |
| |
| #endif // LLVM_TOOLS_DSYMUTIL_NONRELOCATABLESTRINGPOOL_H |