Home | History | Annotate | Download | only in MC
      1 //===-- StringTableBuilder.h - String table building utility ------*- C++ -*-=//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #ifndef LLVM_MC_STRINGTABLEBUILDER_H
     11 #define LLVM_MC_STRINGTABLEBUILDER_H
     12 
     13 #include "llvm/ADT/SmallString.h"
     14 #include "llvm/ADT/DenseMap.h"
     15 #include <cassert>
     16 
     17 namespace llvm {
     18 
     19 /// \brief Utility for building string tables with deduplicated suffixes.
     20 class StringTableBuilder {
     21 public:
     22   enum Kind { ELF, WinCOFF, MachO, RAW };
     23 
     24 private:
     25   SmallString<256> StringTable;
     26   DenseMap<StringRef, size_t> StringIndexMap;
     27   size_t Size = 0;
     28   Kind K;
     29 
     30 public:
     31   StringTableBuilder(Kind K);
     32 
     33   /// \brief Add a string to the builder. Returns the position of S in the
     34   /// table. The position will be changed if finalize is used.
     35   /// Can only be used before the table is finalized.
     36   size_t add(StringRef S);
     37 
     38   /// \brief Analyze the strings and build the final table. No more strings can
     39   /// be added after this point.
     40   void finalize();
     41 
     42   /// \brief Retrieve the string table data. Can only be used after the table
     43   /// is finalized.
     44   StringRef data() const {
     45     assert(isFinalized());
     46     return StringTable;
     47   }
     48 
     49   /// \brief Get the offest of a string in the string table. Can only be used
     50   /// after the table is finalized.
     51   size_t getOffset(StringRef S) const;
     52 
     53   const DenseMap<StringRef, size_t> &getMap() const { return StringIndexMap; }
     54   size_t getSize() const { return Size; }
     55   void clear();
     56 
     57 private:
     58   bool isFinalized() const {
     59     return !StringTable.empty();
     60   }
     61 };
     62 
     63 } // end llvm namespace
     64 
     65 #endif
     66