• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
~ValueSymbolTable()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  //
reinsertValue(Value * V)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  
removeValueName(ValueName * V)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.
createValueName(StringRef Name,Value * V)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  //
dump() const110  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  }
118