]>
Commit | Line | Data |
---|---|---|
223e47cc LB |
1 | //===-- ValueSymbolTable.cpp - Implement the ValueSymbolTable class -------===// |
2 | // | |
3 | // The LLVM Compiler Infrastructure | |
4 | // | |
5 | // This file is distributed under the University of Illinois Open Source | |
6 | // License. See LICENSE.TXT for details. | |
7 | // | |
8 | //===----------------------------------------------------------------------===// | |
9 | // | |
10 | // This file implements the ValueSymbolTable class for the VMCore library. | |
11 | // | |
12 | //===----------------------------------------------------------------------===// | |
13 | ||
14 | #define DEBUG_TYPE "valuesymtab" | |
15 | #include "llvm/GlobalValue.h" | |
16 | #include "llvm/Type.h" | |
17 | #include "llvm/ValueSymbolTable.h" | |
18 | #include "llvm/ADT/SmallString.h" | |
19 | #include "llvm/Support/Debug.h" | |
20 | #include "llvm/Support/raw_ostream.h" | |
21 | using namespace llvm; | |
22 | ||
23 | // Class destructor | |
24 | ValueSymbolTable::~ValueSymbolTable() { | |
25 | #ifndef NDEBUG // Only do this in -g mode... | |
26 | for (iterator VI = vmap.begin(), VE = vmap.end(); VI != VE; ++VI) | |
27 | dbgs() << "Value still in symbol table! Type = '" | |
28 | << *VI->getValue()->getType() << "' Name = '" | |
29 | << VI->getKeyData() << "'\n"; | |
30 | assert(vmap.empty() && "Values remain in symbol table!"); | |
31 | #endif | |
32 | } | |
33 | ||
34 | // Insert a value into the symbol table with the specified name... | |
35 | // | |
36 | void ValueSymbolTable::reinsertValue(Value* V) { | |
37 | assert(V->hasName() && "Can't insert nameless Value into symbol table"); | |
38 | ||
39 | // Try inserting the name, assuming it won't conflict. | |
40 | if (vmap.insert(V->Name)) { | |
41 | //DEBUG(dbgs() << " Inserted value: " << V->Name << ": " << *V << "\n"); | |
42 | return; | |
43 | } | |
44 | ||
45 | // Otherwise, there is a naming conflict. Rename this value. | |
46 | SmallString<256> UniqueName(V->getName().begin(), V->getName().end()); | |
47 | ||
48 | // The name is too already used, just free it so we can allocate a new name. | |
49 | V->Name->Destroy(); | |
50 | ||
51 | unsigned BaseSize = UniqueName.size(); | |
52 | while (1) { | |
53 | // Trim any suffix off and append the next number. | |
54 | UniqueName.resize(BaseSize); | |
55 | raw_svector_ostream(UniqueName) << ++LastUnique; | |
56 | ||
57 | // Try insert the vmap entry with this suffix. | |
58 | ValueName &NewName = vmap.GetOrCreateValue(UniqueName); | |
59 | if (NewName.getValue() == 0) { | |
60 | // Newly inserted name. Success! | |
61 | NewName.setValue(V); | |
62 | V->Name = &NewName; | |
63 | //DEBUG(dbgs() << " Inserted value: " << UniqueName << ": " << *V << "\n"); | |
64 | return; | |
65 | } | |
66 | } | |
67 | } | |
68 | ||
69 | void ValueSymbolTable::removeValueName(ValueName *V) { | |
70 | //DEBUG(dbgs() << " Removing Value: " << V->getKeyData() << "\n"); | |
71 | // Remove the value from the symbol table. | |
72 | vmap.remove(V); | |
73 | } | |
74 | ||
75 | /// createValueName - This method attempts to create a value name and insert | |
76 | /// it into the symbol table with the specified name. If it conflicts, it | |
77 | /// auto-renames the name and returns that instead. | |
78 | ValueName *ValueSymbolTable::createValueName(StringRef Name, Value *V) { | |
79 | // In the common case, the name is not already in the symbol table. | |
80 | ValueName &Entry = vmap.GetOrCreateValue(Name); | |
81 | if (Entry.getValue() == 0) { | |
82 | Entry.setValue(V); | |
83 | //DEBUG(dbgs() << " Inserted value: " << Entry.getKeyData() << ": " | |
84 | // << *V << "\n"); | |
85 | return &Entry; | |
86 | } | |
87 | ||
88 | // Otherwise, there is a naming conflict. Rename this value. | |
89 | SmallString<256> UniqueName(Name.begin(), Name.end()); | |
90 | ||
91 | while (1) { | |
92 | // Trim any suffix off and append the next number. | |
93 | UniqueName.resize(Name.size()); | |
94 | raw_svector_ostream(UniqueName) << ++LastUnique; | |
95 | ||
96 | // Try insert the vmap entry with this suffix. | |
97 | ValueName &NewName = vmap.GetOrCreateValue(UniqueName); | |
98 | if (NewName.getValue() == 0) { | |
99 | // Newly inserted name. Success! | |
100 | NewName.setValue(V); | |
101 | //DEBUG(dbgs() << " Inserted value: " << UniqueName << ": " << *V << "\n"); | |
102 | return &NewName; | |
103 | } | |
104 | } | |
105 | } | |
106 | ||
107 | ||
108 | // dump - print out the symbol table | |
109 | // | |
110 | void ValueSymbolTable::dump() const { | |
111 | //DEBUG(dbgs() << "ValueSymbolTable:\n"); | |
112 | for (const_iterator I = begin(), E = end(); I != E; ++I) { | |
113 | //DEBUG(dbgs() << " '" << I->getKeyData() << "' = "); | |
114 | I->getValue()->dump(); | |
115 | //DEBUG(dbgs() << "\n"); | |
116 | } | |
117 | } |