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/CachedHashString.h"
     14 #include "llvm/ADT/DenseMap.h"
     15 #include "llvm/ADT/StringRef.h"
     16 #include <cstddef>
     17 #include <cstdint>
     18 
     19 namespace llvm {
     20 
     21 class raw_ostream;
     22 
     23 /// \brief Utility for building string tables with deduplicated suffixes.
     24 class StringTableBuilder {
     25 public:
     26   enum Kind { ELF, WinCOFF, MachO, RAW };
     27 
     28 private:
     29   DenseMap<CachedHashStringRef, size_t> StringIndexMap;
     30   size_t Size = 0;
     31   Kind K;
     32   unsigned Alignment;
     33   bool Finalized = false;
     34 
     35   void finalizeStringTable(bool Optimize);
     36   void initSize();
     37 
     38 public:
     39   StringTableBuilder(Kind K, unsigned Alignment = 1);
     40   ~StringTableBuilder();
     41 
     42   /// \brief Add a string to the builder. Returns the position of S in the
     43   /// table. The position will be changed if finalize is used.
     44   /// Can only be used before the table is finalized.
     45   size_t add(CachedHashStringRef S);
     46   size_t add(StringRef S) { return add(CachedHashStringRef(S)); }
     47 
     48   /// \brief Analyze the strings and build the final table. No more strings can
     49   /// be added after this point.
     50   void finalize();
     51 
     52   /// Finalize the string table without reording it. In this mode, offsets
     53   /// returned by add will still be valid.
     54   void finalizeInOrder();
     55 
     56   /// \brief Get the offest of a string in the string table. Can only be used
     57   /// after the table is finalized.
     58   size_t getOffset(CachedHashStringRef S) const;
     59   size_t getOffset(StringRef S) const {
     60     return getOffset(CachedHashStringRef(S));
     61   }
     62 
     63   size_t getSize() const { return Size; }
     64   void clear();
     65 
     66   void write(raw_ostream &OS) const;
     67   void write(uint8_t *Buf) const;
     68 
     69 private:
     70   bool isFinalized() const { return Finalized; }
     71 };
     72 
     73 } // end namespace llvm
     74 
     75 #endif // LLVM_MC_STRINGTABLEBUILDER_H
     76