LLVM API Documentation

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
ValueSymbolTable.cpp
Go to the documentation of this file.
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 IR library.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #define DEBUG_TYPE "valuesymtab"
16 #include "llvm/ADT/SmallString.h"
17 #include "llvm/IR/GlobalValue.h"
18 #include "llvm/IR/Type.h"
19 #include "llvm/Support/Debug.h"
21 using namespace llvm;
22 
23 // Class destructor
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 //
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 }
const ValueTy & getValue() const
Definition: StringMap.h:132
iterator begin()
Get an iterator that from the beginning of the symbol table.
bool hasName() const
Definition: Value.h:117
size_t size() const
size - Get the string size.
Definition: StringRef.h:113
void remove(MapEntryTy *KeyValue)
Definition: StringMap.h:389
void setValue(const ValueTy &V)
Definition: StringMap.h:135
bool empty() const
Definition: StringMap.h:103
void dump() const
Print out symbol table on stderr.
StringRef getName() const
Definition: Value.cpp:167
void Destroy(AllocatorTy &Allocator)
Definition: StringMap.h:217
iterator end()
Get an iterator to the end of the symbol table.
iterator begin() const
Definition: StringRef.h:97
bool insert(MapEntryTy *KeyValue)
Definition: StringMap.h:323
raw_ostream & dbgs()
dbgs - Return a circular-buffered debug stream.
Definition: Debug.cpp:101
MapEntryTy & GetOrCreateValue(StringRef Key, InitTy Val)
Definition: StringMap.h:361
iterator begin()
Definition: StringMap.h:278
#define I(x, y, z)
Definition: MD5.cpp:54
void resize(unsigned N)
Definition: SmallVector.h:401
LLVM Value Representation.
Definition: Value.h:66
iterator end() const
Definition: StringRef.h:99
iterator end()
Definition: StringMap.h:281