//
// The LLVM Compiler Infrastructure
//
-// This file was developed by Reid Spencer based on the original SymbolTable.h
-// written by the LLVM research group and re-written by Reid Spencer.
-// It is distributed under the University of Illinois Open Source License.
-// See LICENSE.TXT for details.
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
#define LLVM_VALUE_SYMBOL_TABLE_H
#include "llvm/Value.h"
-#include <map>
+#include "llvm/ADT/StringMap.h"
+#include "llvm/Support/DataTypes.h"
namespace llvm {
-
+ template<typename ValueSubClass, typename ItemParentClass>
+ class SymbolTableListTraits;
+ class BasicBlock;
+ class Function;
+ class Module;
+
/// This class provides a symbol table of name/value pairs. It is essentially
/// a std::map<std::string,Value*> but has a controlled interface provided by
/// LLVM as well as ensuring uniqueness of names.
///
class ValueSymbolTable {
-
+ friend class Value;
+ friend class SymbolTableListTraits<Argument, Function>;
+ friend class SymbolTableListTraits<BasicBlock, Function>;
+ friend class SymbolTableListTraits<Instruction, BasicBlock>;
+ friend class SymbolTableListTraits<Function, Module>;
+ friend class SymbolTableListTraits<GlobalVariable, Module>;
+ friend class SymbolTableListTraits<GlobalAlias, Module>;
/// @name Types
/// @{
public:
-
/// @brief A mapping of names to values.
- typedef std::map<const std::string, Value *> ValueMap;
+ typedef StringMap<Value*> ValueMap;
/// @brief An iterator over a ValueMap.
typedef ValueMap::iterator iterator;
/// @{
public:
- ValueSymbolTable() : LastUnique(0) {}
+ ValueSymbolTable() : vmap(0), LastUnique(0) {}
~ValueSymbolTable();
/// @}
/// @returns the value associated with the \p name
/// @brief Lookup a named Value.
Value *lookup(const std::string &name) const;
+ Value *lookup(const char *NameBegin, const char *NameEnd) const;
/// @returns true iff the symbol table is empty
/// @brief Determine if the symbol table is empty
/// @brief The number of name/type pairs is returned.
inline unsigned size() const { return unsigned(vmap.size()); }
- /// Given a base name, return a string that is either equal to it or
- /// derived from it that does not already occur in the symbol table
- /// for the specified type.
- /// @brief Get a name unique to this symbol table
- std::string getUniqueName(const std::string &BaseName) const;
-
/// This function can be used from the debugger to display the
/// content of the symbol table while debugging.
/// @brief Print out symbol table on stderr
/// @name Iteration
/// @{
public:
-
/// @brief Get an iterator that from the beginning of the symbol table.
inline iterator begin() { return vmap.begin(); }
/// @brief Get a const_iterator to the end of the symbol table.
inline const_iterator end() const { return vmap.end(); }
-
+
/// @}
/// @name Mutators
/// @{
-public:
-
- /// This method will strip the symbol table of its names.
- /// @brief Strip the symbol table.
- bool strip();
-
+private:
/// This method adds the provided value \p N to the symbol table. The Value
/// must have a name which is used to place the value in the symbol table.
+ /// If the inserted name conflicts, this renames the value.
/// @brief Add a named value to the symbol table
- void insert(Value *Val);
-
- /// This method removes a value from the symbol table. The name of the
- /// Value is extracted from \p Val and used to lookup the Value in the
- /// symbol table. If the Value is not in the symbol table, this method
- /// returns false.
- /// @returns true if \p Val was successfully erased, false otherwise
- /// @brief Remove a value from the symbol table.
- bool erase(Value* Val);
-
- /// Given a value with a non-empty name, remove its existing
- /// entry from the symbol table and insert a new one for Name. This is
- /// equivalent to doing "remove(V), V->Name = Name, insert(V)".
- /// @brief Rename a value in the symbol table
- bool rename(Value *V, const std::string &Name);
-
+ void reinsertValue(Value *V);
+
+ /// createValueName - This method attempts to create a value name and insert
+ /// it into the symbol table with the specified name. If it conflicts, it
+ /// auto-renames the name and returns that instead.
+ ValueName *createValueName(const char *NameStart, unsigned NameLen, Value *V);
+
+ /// This method removes a value from the symbol table. It leaves the
+ /// ValueName attached to the value, but it is no longer inserted in the
+ /// symtab.
+ void removeValueName(ValueName *V);
+
/// @}
/// @name Internal Data
/// @{
mutable uint32_t LastUnique; ///< Counter for tracking unique names
/// @}
-
};
} // End llvm namespace