X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FVMCore%2FSymbolTableListTraitsImpl.h;h=b2b6a3fa346db059c6ffe7fc82cda97b87f7a57e;hb=277f0741c5ea123b30360c382a153df238c31cae;hp=a9971c8bbbaa63e5b2ffe0bb46be1b5d51305db6;hpb=7e70829632f82de15db187845666aaca6e04b792;p=oota-llvm.git diff --git a/lib/VMCore/SymbolTableListTraitsImpl.h b/lib/VMCore/SymbolTableListTraitsImpl.h index a9971c8bbba..b2b6a3fa346 100644 --- a/lib/VMCore/SymbolTableListTraitsImpl.h +++ b/lib/VMCore/SymbolTableListTraitsImpl.h @@ -1,5 +1,12 @@ //===-- llvm/SymbolTableListTraitsImpl.h - Implementation ------*- C++ -*--===// // +// The LLVM Compiler Infrastructure +// +// This file was developed by the LLVM research group and is distributed under +// the University of Illinois Open Source License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// // This file implements the stickier parts of the SymbolTableListTraits class, // and is explicitly instantiated where needed to avoid defining all this code // in a widely used header. @@ -10,79 +17,102 @@ #define LLVM_SYMBOLTABLELISTTRAITS_IMPL_H #include "llvm/SymbolTableListTraits.h" -#include "llvm/SymbolTable.h" +#include "llvm/ValueSymbolTable.h" -template -void SymbolTableListTraits -::setParent(SymTabClass *STO) { - iplist &List = SubClass::getList(ItemParent); +namespace llvm { - // Remove all of the items from the old symtab.. - if (SymTabObject && !List.empty()) { - SymbolTable *SymTab = SymTabObject->getSymbolTable(); - for (iplist::iterator I = List.begin(); I != List.end(); ++I) - if (I->hasName()) SymTab->remove(I); - } +/// 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 +template +void SymbolTableListTraits +::setSymTabObject(TPtr *Dest, TPtr Src) { + // Get the old symtab and value list before doing the assignment. + ValueSymbolTable *OldST = TraitsClass::getSymTab(getListOwner()); - SymTabObject = STO; + // 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 &ItemList = TraitsClass::getList(getListOwner()); + if (ItemList.empty()) return; + + if (OldST) { + // Remove all entries from the previous symtab. + for (typename iplist::iterator I = ItemList.begin(); + I != ItemList.end(); ++I) + if (I->hasName()) + OldST->removeValueName(I->getValueName()); + } - // Add all of the items to the new symtab... - if (SymTabObject && !List.empty()) { - SymbolTable *SymTab = SymTabObject->getSymbolTableSure(); - for (iplist::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::iterator I = ItemList.begin(); + I != ItemList.end(); ++I) + if (I->hasName()) + NewST->reinsertValue(I); } + } -template -void SymbolTableListTraits +template +void SymbolTableListTraits ::addNodeToList(ValueSubClass *V) { assert(V->getParent() == 0 && "Value already in a container!!"); - V->setParent(ItemParent); - if (V->hasName() && SymTabObject) - SymTabObject->getSymbolTableSure()->insert(V); + ItemParentClass *Owner = getListOwner(); + V->setParent(Owner); + if (V->hasName()) + if (ValueSymbolTable *ST = TraitsClass::getSymTab(Owner)) + ST->reinsertValue(V); } -template -void SymbolTableListTraits +template +void SymbolTableListTraits ::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 -void SymbolTableListTraits +template +void SymbolTableListTraits ::transferNodesFromList(iplist > &L2, ilist_iterator first, ilist_iterator last) { - // We only have to do work here if transfering instructions between BB's - ItemParentClass *NewIP = ItemParent, *OldIP = L2.ItemParent; + // We only have to do work here if transferring instructions between BBs + 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 transfering the + // 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->getSymbolTableSure()->insert(&V); + if (NewST && HasName) + NewST->reinsertValue(&V); } } else { - // Just transfering between blocks in the same function, simply update the + // Just transferring between blocks in the same function, simply update the // parent fields in the instructions... for (; first != last; ++first) first->setParent(NewIP); } } +} // End llvm namespace + #endif