ValueSymbolTable.cpp [plain text]
#define DEBUG_TYPE "valuesymtab"
#include "llvm/GlobalValue.h"
#include "llvm/Type.h"
#include "llvm/ValueSymbolTable.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/Support/Debug.h"
using namespace llvm;
ValueSymbolTable::~ValueSymbolTable() {
#ifndef NDEBUG // Only do this in -g mode...
for (iterator VI = vmap.begin(), VE = vmap.end(); VI != VE; ++VI)
cerr << "Value still in symbol table! Type = '"
<< VI->getValue()->getType()->getDescription() << "' Name = '"
<< VI->getKeyData() << "'\n";
assert(vmap.empty() && "Values remain in symbol table!");
#endif
}
Value *ValueSymbolTable::lookup(const std::string &Name) const {
const_iterator VI = vmap.find(&Name[0], &Name[Name.size()]);
if (VI != vmap.end()) return VI->getValue();
return 0;
}
Value *ValueSymbolTable::lookup(const char *NameBegin,
const char *NameEnd) const {
const_iterator VI = vmap.find(NameBegin, NameEnd);
if (VI != vmap.end()) return VI->getValue();
return 0;
}
void ValueSymbolTable::reinsertValue(Value* V) {
assert(V->hasName() && "Can't insert nameless Value into symbol table");
if (vmap.insert(V->Name)) {
return;
}
SmallString<128> UniqueName(V->getNameStart(), V->getNameEnd());
V->Name->Destroy();
unsigned BaseSize = UniqueName.size();
while (1) {
UniqueName.resize(BaseSize);
UniqueName.append_uint_32(++LastUnique);
ValueName &NewName = vmap.GetOrCreateValue(&UniqueName[0],
&UniqueName[UniqueName.size()]);
if (NewName.getValue() == 0) {
NewName.setValue(V);
V->Name = &NewName;
return;
}
}
}
void ValueSymbolTable::removeValueName(ValueName *V) {
vmap.remove(V);
}
ValueName *ValueSymbolTable::createValueName(const char *NameStart,
unsigned NameLen, Value *V) {
ValueName &Entry = vmap.GetOrCreateValue(NameStart, NameStart+NameLen);
if (Entry.getValue() == 0) {
Entry.setValue(V);
return &Entry;
}
SmallString<128> UniqueName(NameStart, NameStart+NameLen);
while (1) {
UniqueName.resize(NameLen);
UniqueName.append_uint_32(++LastUnique);
ValueName &NewName = vmap.GetOrCreateValue(&UniqueName[0],
&UniqueName[UniqueName.size()]);
if (NewName.getValue() == 0) {
NewName.setValue(V);
return &NewName;
}
}
}
void ValueSymbolTable::dump() const {
for (const_iterator I = begin(), E = end(); I != E; ++I) {
I->getValue()->dump();
}
}