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