Make the release build work
[oota-llvm.git] / lib / VMCore / ValueHolderImpl.h
index 1bfdd2512e129dcb4c521dec1367e331766d34cd..cbc3e5f55886dc6f54feeaf16a1e206787708d16 100644 (file)
 #include "llvm/SymbolTable.h"
 #include <algorithm>
 
-template<class ValueSubclass, class ItemParentType>
-void ValueHolder<ValueSubclass,ItemParentType>::setParent(SymTabValue *P) { 
+template<class ValueSubclass, class ItemParentType, class SymTabType>
+void ValueHolder<ValueSubclass,ItemParentType,SymTabType>
+::setParent(SymTabType *P) { 
   if (Parent) {     // Remove all of the items from the old symbol table..
     SymbolTable *SymTab = Parent->getSymbolTable();
-    for (iterator I = begin(); I != end(); I++)
+    for (iterator I = begin(); I != end(); ++I)
       if ((*I)->hasName()) SymTab->remove(*I);
   }
 
@@ -25,14 +26,15 @@ void ValueHolder<ValueSubclass,ItemParentType>::setParent(SymTabValue *P) {
 
   if (Parent) {     // Remove all of the items from the old symbol table..
     SymbolTable *SymTab = Parent->getSymbolTableSure();
-    for (iterator I = begin(); I != end(); I++)
+    for (iterator I = begin(); I != end(); ++I)
       if ((*I)->hasName()) SymTab->insert(*I);
   }
 }
 
 
-template<class ValueSubclass, class ItemParentType>
-void ValueHolder<ValueSubclass,ItemParentType>::remove(ValueSubclass *D) {
+template<class ValueSubclass, class ItemParentType, class SymTabType>
+void ValueHolder<ValueSubclass,ItemParentType,SymTabType>
+::remove(ValueSubclass *D) {
   iterator I(find(begin(), end(), D));
   assert(I != end() && "Value not in ValueHolder!!");
   remove(I);
@@ -42,10 +44,11 @@ void ValueHolder<ValueSubclass,ItemParentType>::remove(ValueSubclass *D) {
 // specified by the iterator, and leaves the iterator pointing to the element
 // that used to follow the element deleted.
 //
-template<class ValueSubclass, class ItemParentType>
-ValueSubclass *ValueHolder<ValueSubclass,ItemParentType>::remove(iterator &DI) {
+template<class ValueSubclass, class ItemParentType, class SymTabType>
+ValueSubclass *ValueHolder<ValueSubclass,ItemParentType,SymTabType>
+::remove(iterator &DI) {
   assert(DI != ValueList.end() && 
-         "Trying to remove the end of the def list!!!");
+         "Trying to remove the end of the value list!!!");
   
   ValueSubclass *i = *DI;
   DI = ValueList.erase(DI);
@@ -59,11 +62,27 @@ ValueSubclass *ValueHolder<ValueSubclass,ItemParentType>::remove(iterator &DI) {
   return i;
 }
 
-template<class ValueSubclass, class ItemParentType>
-ValueSubclass *ValueHolder<ValueSubclass,ItemParentType>
+template<class ValueSubclass, class ItemParentType, class SymTabType>
+ValueSubclass *ValueHolder<ValueSubclass,ItemParentType,SymTabType>
+::pop_back() {
+  assert(!ValueList.empty() && "Can't pop_back an empty valuelist!");
+  ValueSubclass *i = ValueList.back();
+  ValueList.pop_back();
+  i->setParent(0);  // I don't own you anymore... byebye...
+  
+  // You don't get to be in the symbol table anymore... byebye
+  if (i->hasName() && Parent)
+    Parent->getSymbolTable()->remove(i);
+  
+  return i;
+}
+
+
+template<class ValueSubclass, class ItemParentType, class SymTabType>
+ValueSubclass *ValueHolder<ValueSubclass,ItemParentType,SymTabType>
 ::remove(const iterator &DI) {
   assert(DI != ValueList.end() && 
-         "Trying to remove the end of the def list!!!");
+         "Trying to remove the end of the value holder list!!!");
   
   ValueSubclass *i = *DI;
   ValueList.erase(DI);
@@ -77,8 +96,35 @@ ValueSubclass *ValueHolder<ValueSubclass,ItemParentType>
   return i;
 }
 
-template<class ValueSubclass, class ItemParentType>
-void ValueHolder<ValueSubclass,ItemParentType>::push_front(ValueSubclass *Inst) {
+template<class ValueSubclass, class ItemParentType, class SymTabType>
+ValueSubclass *ValueHolder<ValueSubclass,ItemParentType,SymTabType>
+::replaceWith(iterator &DI, ValueSubclass *NewVal) {
+  assert(DI != ValueList.end() && 
+         "Trying to replace the end of the value holder list!!!");
+
+  // Remove the value from the current container...
+  ValueSubclass *Ret = *DI;
+  Ret->setParent(0);  // I don't own you anymore... byebye...
+  
+  // You don't get to be in the symbol table anymore... byebye
+  if (Ret->hasName() && Parent)
+    Parent->getSymbolTable()->remove(Ret);
+
+  // Insert the new value into the container...
+  assert(NewVal->getParent() == 0 && "Value already has parent!");
+  NewVal->setParent(ItemParent);
+  *DI = NewVal;
+  if (NewVal->hasName() && Parent)
+    Parent->getSymbolTableSure()->insert(NewVal);
+  return Ret;
+}
+
+
+template<class ValueSubclass, class ItemParentType, class SymTabType>
+void ValueHolder<ValueSubclass,ItemParentType,SymTabType>
+::push_front(ValueSubclass *Inst) {
   assert(Inst->getParent() == 0 && "Value already has parent!");
   Inst->setParent(ItemParent);
 
@@ -89,8 +135,9 @@ void ValueHolder<ValueSubclass,ItemParentType>::push_front(ValueSubclass *Inst)
     Parent->getSymbolTableSure()->insert(Inst);
 }
 
-template<class ValueSubclass, class ItemParentType>
-void ValueHolder<ValueSubclass,ItemParentType>::push_back(ValueSubclass *Inst) {
+template<class ValueSubclass, class ItemParentType, class SymTabType>
+void ValueHolder<ValueSubclass,ItemParentType,SymTabType>
+::push_back(ValueSubclass *Inst) {
   assert(Inst->getParent() == 0 && "Value already has parent!");
   Inst->setParent(ItemParent);
 
@@ -104,10 +151,10 @@ void ValueHolder<ValueSubclass,ItemParentType>::push_back(ValueSubclass *Inst) {
 // indicated iterator position, and returns an interator to the newly inserted
 // value.
 //
-template<class ValueSubclass, class ItemParentType>
-ValueHolder<ValueSubclass,ItemParentType>::iterator
-ValueHolder<ValueSubclass,ItemParentType>::insert(iterator Pos,
-                                                          ValueSubclass *Inst){
+template<class ValueSubclass, class ItemParentType, class SymTabType>
+ValueHolder<ValueSubclass,ItemParentType,SymTabType>::iterator
+ValueHolder<ValueSubclass,ItemParentType,SymTabType>
+::insert(iterator Pos, ValueSubclass *Inst) {
   assert(Inst->getParent() == 0 && "Value already has parent!");
   Inst->setParent(ItemParent);
 
@@ -117,4 +164,34 @@ ValueHolder<ValueSubclass,ItemParentType>::insert(iterator Pos,
   return I;
 }
 
+// ValueHolder::insert - This method inserts the specified _range_ of values
+// before the 'Pos' iterator, and returns an iterator to the first newly
+// inserted element.  This currently only works for vector iterators...
+//
+// FIXME: This is not generic so that the code does not have to be around
+// to be used... is this ok?
+//
+template<class ValueSubclass, class ItemParentType, class SymTabType>
+void ValueHolder<ValueSubclass,ItemParentType,SymTabType>
+::insert(iterator Pos,                     // Where to insert
+         iterator First, iterator Last) {   // Vector to read insts from
+
+  // Check to make sure that the values are not already in some valueholder...
+  
+  for (iterator X = First; X != Last; ++X) {
+    assert((*X)->getParent() == 0 &&
+           "Cannot insert into valueholder, value already has a parent!");
+    (*X)->setParent(ItemParent);
+  }
+
+  // Add all of the values to the value holder...
+  ValueList.insert(Pos, First, Last);
+
+  // Insert all of the instructions in the symbol table...
+  if (Parent)
+    for (;First != Last; ++First)
+      if ((*First)->hasName())
+        Parent->getSymbolTableSure()->insert(*First);
+}
+
 #endif