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"
#include "llvm/Support/raw_ostream.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)
dbgs() << "Value still in symbol table! Type = '"
<< VI->getValue()->getType()->getDescription() << "' Name = '"
<< VI->getKeyData() << "'\n";
assert(vmap.empty() && "Values remain in symbol table!");
#endif
}
void ValueSymbolTable::reinsertValue(Value* V) {
assert(V->hasName() && "Can't insert nameless Value into symbol table");
if (vmap.insert(V->Name)) {
return;
}
SmallString<256> UniqueName(V->getName().begin(), V->getName().end());
V->Name->Destroy();
unsigned BaseSize = UniqueName.size();
while (1) {
UniqueName.resize(BaseSize);
raw_svector_ostream(UniqueName) << ++LastUnique;
ValueName &NewName =
vmap.GetOrCreateValue(StringRef(UniqueName.data(),
UniqueName.size()));
if (NewName.getValue() == 0) {
NewName.setValue(V);
V->Name = &NewName;
return;
}
}
}
void ValueSymbolTable::removeValueName(ValueName *V) {
vmap.remove(V);
}
ValueName *ValueSymbolTable::createValueName(StringRef Name, Value *V) {
ValueName &Entry = vmap.GetOrCreateValue(Name);
if (Entry.getValue() == 0) {
Entry.setValue(V);
return &Entry;
}
SmallString<128> UniqueName(Name.begin(), Name.end());
while (1) {
UniqueName.resize(Name.size());
raw_svector_ostream(UniqueName) << ++LastUnique;
ValueName &NewName =
vmap.GetOrCreateValue(StringRef(UniqueName.data(),
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();
}
}
MDSymbolTable::~MDSymbolTable() { }