Partial fix for PR1678: correct some parts of constant
[oota-llvm.git] / lib / VMCore / SymbolTableListTraitsImpl.h
index 6d70401c89f732df7a4c031dcb7ba347bfb4efff..b2b6a3fa346db059c6ffe7fc82cda97b87f7a57e 100644 (file)
 #define LLVM_SYMBOLTABLELISTTRAITS_IMPL_H
 
 #include "llvm/SymbolTableListTraits.h"
-#include "llvm/SymbolTable.h"
+#include "llvm/ValueSymbolTable.h"
 
 namespace llvm {
 
-template<typename ValueSubClass, typename ItemParentClass,typename SymTabClass,
-         typename SubClass>
-void SymbolTableListTraits<ValueSubClass,ItemParentClass,SymTabClass,SubClass>
-::setParent(SymTabClass *STO) {
-  iplist<ValueSubClass> &List = SubClass::getList(ItemParent);
+/// setSymTabObject - This is called when (f.e.) the parent of a basic block
+/// changes.  This requires us to remove all the instruction symtab entries from
+/// the current function and reinsert them into the new function.
+template<typename ValueSubClass, typename ItemParentClass>
+template<typename TPtr>
+void SymbolTableListTraits<ValueSubClass,ItemParentClass>
+::setSymTabObject(TPtr *Dest, TPtr Src) {
+  // Get the old symtab and value list before doing the assignment.
+  ValueSymbolTable *OldST = TraitsClass::getSymTab(getListOwner());
 
-  // Remove all of the items from the old symtab..
-  if (SymTabObject && !List.empty()) {
-    SymbolTable &SymTab = SymTabObject->getSymbolTable();
-    for (typename iplist<ValueSubClass>::iterator I = List.begin();
-         I != List.end(); ++I)
-      if (I->hasName()) SymTab.remove(I);
+  // Do it.
+  *Dest = Src;
+  
+  // Get the new SymTab object.
+  ValueSymbolTable *NewST = TraitsClass::getSymTab(getListOwner());
+  
+  // If there is nothing to do, quick exit.
+  if (OldST == NewST) return;
+  
+  // Move all the elements from the old symtab to the new one.
+  iplist<ValueSubClass> &ItemList = TraitsClass::getList(getListOwner());
+  if (ItemList.empty()) return;
+  
+  if (OldST) {
+    // Remove all entries from the previous symtab.
+    for (typename iplist<ValueSubClass>::iterator I = ItemList.begin();
+         I != ItemList.end(); ++I)
+      if (I->hasName())
+        OldST->removeValueName(I->getValueName());
   }
 
-  SymTabObject = STO;
-
-  // Add all of the items to the new symtab...
-  if (SymTabObject && !List.empty()) {
-    SymbolTable &SymTab = SymTabObject->getSymbolTable();
-    for (typename iplist<ValueSubClass>::iterator I = List.begin();
-         I != List.end(); ++I)
-      if (I->hasName()) SymTab.insert(I);
+  if (NewST) {
+    // Add all of the items to the new symtab.
+    for (typename iplist<ValueSubClass>::iterator I = ItemList.begin();
+         I != ItemList.end(); ++I)
+      if (I->hasName())
+        NewST->reinsertValue(I);
   }
+  
 }
 
-template<typename ValueSubClass, typename ItemParentClass, typename SymTabClass,
-         typename SubClass>
-void SymbolTableListTraits<ValueSubClass,ItemParentClass,SymTabClass,SubClass>
+template<typename ValueSubClass, typename ItemParentClass>
+void SymbolTableListTraits<ValueSubClass,ItemParentClass>
 ::addNodeToList(ValueSubClass *V) {
   assert(V->getParent() == 0 && "Value already in a container!!");
-  V->setParent(ItemParent);
-  if (V->hasName() && SymTabObject)
-    SymTabObject->getSymbolTable().insert(V);
+  ItemParentClass *Owner = getListOwner();
+  V->setParent(Owner);
+  if (V->hasName())
+    if (ValueSymbolTable *ST = TraitsClass::getSymTab(Owner))
+      ST->reinsertValue(V);
 }
 
-template<typename ValueSubClass, typename ItemParentClass, typename SymTabClass,
-         typename SubClass>
-void SymbolTableListTraits<ValueSubClass,ItemParentClass,SymTabClass,SubClass>
+template<typename ValueSubClass, typename ItemParentClass>
+void SymbolTableListTraits<ValueSubClass,ItemParentClass>
 ::removeNodeFromList(ValueSubClass *V) {
   V->setParent(0);
-  if (V->hasName() && SymTabObject)
-    SymTabObject->getSymbolTable().remove(V);
+  if (V->hasName())
+    if (ValueSymbolTable *ST = TraitsClass::getSymTab(getListOwner()))
+      ST->removeValueName(V->getValueName());
 }
 
-template<typename ValueSubClass, typename ItemParentClass, typename SymTabClass,
-         typename SubClass>
-void SymbolTableListTraits<ValueSubClass,ItemParentClass,SymTabClass,SubClass>
+template<typename ValueSubClass, typename ItemParentClass>
+void SymbolTableListTraits<ValueSubClass,ItemParentClass>
 ::transferNodesFromList(iplist<ValueSubClass, ilist_traits<ValueSubClass> > &L2,
                         ilist_iterator<ValueSubClass> first,
                         ilist_iterator<ValueSubClass> last) {
   // We only have to do work here if transferring instructions between BBs
-  ItemParentClass *NewIP = ItemParent, *OldIP = L2.ItemParent;
+  ItemParentClass *NewIP = getListOwner(), *OldIP = L2.getListOwner();
   if (NewIP == OldIP) return;  // No work to do at all...
 
   // We only have to update symbol table entries if we are transferring the
   // instructions to a different symtab object...
-  SymTabClass *NewSTO = SymTabObject, *OldSTO = L2.SymTabObject;
-  if (NewSTO != OldSTO) {
+  ValueSymbolTable *NewST = TraitsClass::getSymTab(NewIP);
+  ValueSymbolTable *OldST = TraitsClass::getSymTab(OldIP);
+  if (NewST != OldST) {
     for (; first != last; ++first) {
       ValueSubClass &V = *first;
       bool HasName = V.hasName();
-      if (OldSTO && HasName)
-        OldSTO->getSymbolTable().remove(&V);
+      if (OldST && HasName)
+        OldST->removeValueName(V.getValueName());
       V.setParent(NewIP);
-      if (NewSTO && HasName)
-        NewSTO->getSymbolTable().insert(&V);
+      if (NewST && HasName)
+        NewST->reinsertValue(&V);
     }
   } else {
     // Just transferring between blocks in the same function, simply update the