mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-01 15:11:24 +00:00
1d4f28c6bc
Having two ways to do this doesn't seem terribly helpful and consistently using the insert version (which we already has) seems like it'll make the code easier to understand to anyone working with standard data structures. (I also updated many references to the Entry's key and value to use first() and second instead of getKey{Data,Length,} and get/setValue - for similar consistency) Also removes the GetOrCreateValue functions so there's less surface area to StringMap to fix/improve/change/accommodate move semantics, etc. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@222319 91177308-0d34-0410-b5e6-96231b3b80d8
68 lines
1.7 KiB
C++
68 lines
1.7 KiB
C++
//===-- StringTableBuilder.h - String table building utility ------*- C++ -*-=//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_MC_STRINGTABLEBUILDER_H
|
|
#define LLVM_MC_STRINGTABLEBUILDER_H
|
|
|
|
#include "llvm/ADT/SmallString.h"
|
|
#include "llvm/ADT/StringMap.h"
|
|
#include <cassert>
|
|
|
|
namespace llvm {
|
|
|
|
/// \brief Utility for building string tables with deduplicated suffixes.
|
|
class StringTableBuilder {
|
|
SmallString<256> StringTable;
|
|
StringMap<size_t> StringIndexMap;
|
|
|
|
public:
|
|
/// \brief Add a string to the builder. Returns a StringRef to the internal
|
|
/// copy of s. Can only be used before the table is finalized.
|
|
StringRef add(StringRef s) {
|
|
assert(!isFinalized());
|
|
return StringIndexMap.insert(std::make_pair(s, 0)).first->first();
|
|
}
|
|
|
|
enum Kind {
|
|
ELF,
|
|
WinCOFF,
|
|
MachO
|
|
};
|
|
|
|
/// \brief Analyze the strings and build the final table. No more strings can
|
|
/// be added after this point.
|
|
void finalize(Kind kind);
|
|
|
|
/// \brief Retrieve the string table data. Can only be used after the table
|
|
/// is finalized.
|
|
StringRef data() {
|
|
assert(isFinalized());
|
|
return StringTable;
|
|
}
|
|
|
|
/// \brief Get the offest of a string in the string table. Can only be used
|
|
/// after the table is finalized.
|
|
size_t getOffset(StringRef s) {
|
|
assert(isFinalized());
|
|
assert(StringIndexMap.count(s) && "String is not in table!");
|
|
return StringIndexMap[s];
|
|
}
|
|
|
|
void clear();
|
|
|
|
private:
|
|
bool isFinalized() {
|
|
return !StringTable.empty();
|
|
}
|
|
};
|
|
|
|
} // end llvm namespace
|
|
|
|
#endif
|