Chris Lattner | 7e70829 | 2002-06-25 16:13:24 +0000 | [diff] [blame] | 1 | //===-- llvm/SymbolTableListTraitsImpl.h - Implementation ------*- C++ -*--===// |
Misha Brukman | fd93908 | 2005-04-21 23:48:37 +0000 | [diff] [blame] | 2 | // |
John Criswell | 856ba76 | 2003-10-21 15:17:13 +0000 | [diff] [blame] | 3 | // The LLVM Compiler Infrastructure |
| 4 | // |
Chris Lattner | 4ee451d | 2007-12-29 20:36:04 +0000 | [diff] [blame^] | 5 | // This file is distributed under the University of Illinois Open Source |
| 6 | // License. See LICENSE.TXT for details. |
Misha Brukman | fd93908 | 2005-04-21 23:48:37 +0000 | [diff] [blame] | 7 | // |
John Criswell | 856ba76 | 2003-10-21 15:17:13 +0000 | [diff] [blame] | 8 | //===----------------------------------------------------------------------===// |
Chris Lattner | 7e70829 | 2002-06-25 16:13:24 +0000 | [diff] [blame] | 9 | // |
| 10 | // This file implements the stickier parts of the SymbolTableListTraits class, |
| 11 | // and is explicitly instantiated where needed to avoid defining all this code |
| 12 | // in a widely used header. |
| 13 | // |
| 14 | //===----------------------------------------------------------------------===// |
| 15 | |
| 16 | #ifndef LLVM_SYMBOLTABLELISTTRAITS_IMPL_H |
| 17 | #define LLVM_SYMBOLTABLELISTTRAITS_IMPL_H |
| 18 | |
| 19 | #include "llvm/SymbolTableListTraits.h" |
Reid Spencer | ef9b9a7 | 2007-02-05 20:47:22 +0000 | [diff] [blame] | 20 | #include "llvm/ValueSymbolTable.h" |
Chris Lattner | 7e70829 | 2002-06-25 16:13:24 +0000 | [diff] [blame] | 21 | |
Brian Gaeke | d0fde30 | 2003-11-11 22:41:34 +0000 | [diff] [blame] | 22 | namespace llvm { |
| 23 | |
Chris Lattner | 17fcdd5 | 2007-04-17 03:26:42 +0000 | [diff] [blame] | 24 | /// setSymTabObject - This is called when (f.e.) the parent of a basic block |
| 25 | /// changes. This requires us to remove all the instruction symtab entries from |
| 26 | /// the current function and reinsert them into the new function. |
| 27 | template<typename ValueSubClass, typename ItemParentClass> |
| 28 | template<typename TPtr> |
| 29 | void SymbolTableListTraits<ValueSubClass,ItemParentClass> |
| 30 | ::setSymTabObject(TPtr *Dest, TPtr Src) { |
| 31 | // Get the old symtab and value list before doing the assignment. |
Chris Lattner | f8dfef7 | 2007-04-17 04:04:14 +0000 | [diff] [blame] | 32 | ValueSymbolTable *OldST = TraitsClass::getSymTab(getListOwner()); |
Chris Lattner | 7e70829 | 2002-06-25 16:13:24 +0000 | [diff] [blame] | 33 | |
Chris Lattner | 17fcdd5 | 2007-04-17 03:26:42 +0000 | [diff] [blame] | 34 | // Do it. |
| 35 | *Dest = Src; |
| 36 | |
| 37 | // Get the new SymTab object. |
Chris Lattner | f8dfef7 | 2007-04-17 04:04:14 +0000 | [diff] [blame] | 38 | ValueSymbolTable *NewST = TraitsClass::getSymTab(getListOwner()); |
Chris Lattner | 17fcdd5 | 2007-04-17 03:26:42 +0000 | [diff] [blame] | 39 | |
| 40 | // If there is nothing to do, quick exit. |
| 41 | if (OldST == NewST) return; |
| 42 | |
| 43 | // Move all the elements from the old symtab to the new one. |
Chris Lattner | f8dfef7 | 2007-04-17 04:04:14 +0000 | [diff] [blame] | 44 | iplist<ValueSubClass> &ItemList = TraitsClass::getList(getListOwner()); |
Chris Lattner | 17fcdd5 | 2007-04-17 03:26:42 +0000 | [diff] [blame] | 45 | if (ItemList.empty()) return; |
| 46 | |
| 47 | if (OldST) { |
| 48 | // Remove all entries from the previous symtab. |
| 49 | for (typename iplist<ValueSubClass>::iterator I = ItemList.begin(); |
| 50 | I != ItemList.end(); ++I) |
| 51 | if (I->hasName()) |
| 52 | OldST->removeValueName(I->getValueName()); |
Chris Lattner | 7e70829 | 2002-06-25 16:13:24 +0000 | [diff] [blame] | 53 | } |
| 54 | |
Chris Lattner | 17fcdd5 | 2007-04-17 03:26:42 +0000 | [diff] [blame] | 55 | if (NewST) { |
| 56 | // Add all of the items to the new symtab. |
| 57 | for (typename iplist<ValueSubClass>::iterator I = ItemList.begin(); |
| 58 | I != ItemList.end(); ++I) |
| 59 | if (I->hasName()) |
| 60 | NewST->reinsertValue(I); |
Chris Lattner | 7e70829 | 2002-06-25 16:13:24 +0000 | [diff] [blame] | 61 | } |
Chris Lattner | 17fcdd5 | 2007-04-17 03:26:42 +0000 | [diff] [blame] | 62 | |
Chris Lattner | 7e70829 | 2002-06-25 16:13:24 +0000 | [diff] [blame] | 63 | } |
| 64 | |
Chris Lattner | 17fcdd5 | 2007-04-17 03:26:42 +0000 | [diff] [blame] | 65 | template<typename ValueSubClass, typename ItemParentClass> |
| 66 | void SymbolTableListTraits<ValueSubClass,ItemParentClass> |
Chris Lattner | 7e70829 | 2002-06-25 16:13:24 +0000 | [diff] [blame] | 67 | ::addNodeToList(ValueSubClass *V) { |
| 68 | assert(V->getParent() == 0 && "Value already in a container!!"); |
Chris Lattner | f8dfef7 | 2007-04-17 04:04:14 +0000 | [diff] [blame] | 69 | ItemParentClass *Owner = getListOwner(); |
| 70 | V->setParent(Owner); |
Chris Lattner | 17fcdd5 | 2007-04-17 03:26:42 +0000 | [diff] [blame] | 71 | if (V->hasName()) |
Chris Lattner | f8dfef7 | 2007-04-17 04:04:14 +0000 | [diff] [blame] | 72 | if (ValueSymbolTable *ST = TraitsClass::getSymTab(Owner)) |
Chris Lattner | 17fcdd5 | 2007-04-17 03:26:42 +0000 | [diff] [blame] | 73 | ST->reinsertValue(V); |
Chris Lattner | 7e70829 | 2002-06-25 16:13:24 +0000 | [diff] [blame] | 74 | } |
| 75 | |
Chris Lattner | 17fcdd5 | 2007-04-17 03:26:42 +0000 | [diff] [blame] | 76 | template<typename ValueSubClass, typename ItemParentClass> |
| 77 | void SymbolTableListTraits<ValueSubClass,ItemParentClass> |
Chris Lattner | 7e70829 | 2002-06-25 16:13:24 +0000 | [diff] [blame] | 78 | ::removeNodeFromList(ValueSubClass *V) { |
| 79 | V->setParent(0); |
Chris Lattner | 17fcdd5 | 2007-04-17 03:26:42 +0000 | [diff] [blame] | 80 | if (V->hasName()) |
Chris Lattner | f8dfef7 | 2007-04-17 04:04:14 +0000 | [diff] [blame] | 81 | if (ValueSymbolTable *ST = TraitsClass::getSymTab(getListOwner())) |
Chris Lattner | 17fcdd5 | 2007-04-17 03:26:42 +0000 | [diff] [blame] | 82 | ST->removeValueName(V->getValueName()); |
Chris Lattner | 7e70829 | 2002-06-25 16:13:24 +0000 | [diff] [blame] | 83 | } |
| 84 | |
Chris Lattner | 17fcdd5 | 2007-04-17 03:26:42 +0000 | [diff] [blame] | 85 | template<typename ValueSubClass, typename ItemParentClass> |
| 86 | void SymbolTableListTraits<ValueSubClass,ItemParentClass> |
Chris Lattner | 7e70829 | 2002-06-25 16:13:24 +0000 | [diff] [blame] | 87 | ::transferNodesFromList(iplist<ValueSubClass, ilist_traits<ValueSubClass> > &L2, |
| 88 | ilist_iterator<ValueSubClass> first, |
| 89 | ilist_iterator<ValueSubClass> last) { |
Misha Brukman | 6b63452 | 2003-10-10 17:54:14 +0000 | [diff] [blame] | 90 | // We only have to do work here if transferring instructions between BBs |
Chris Lattner | f8dfef7 | 2007-04-17 04:04:14 +0000 | [diff] [blame] | 91 | ItemParentClass *NewIP = getListOwner(), *OldIP = L2.getListOwner(); |
Chris Lattner | 7e70829 | 2002-06-25 16:13:24 +0000 | [diff] [blame] | 92 | if (NewIP == OldIP) return; // No work to do at all... |
| 93 | |
Misha Brukman | 6b63452 | 2003-10-10 17:54:14 +0000 | [diff] [blame] | 94 | // We only have to update symbol table entries if we are transferring the |
Chris Lattner | 7e70829 | 2002-06-25 16:13:24 +0000 | [diff] [blame] | 95 | // instructions to a different symtab object... |
Chris Lattner | f8dfef7 | 2007-04-17 04:04:14 +0000 | [diff] [blame] | 96 | ValueSymbolTable *NewST = TraitsClass::getSymTab(NewIP); |
Chris Lattner | 17fcdd5 | 2007-04-17 03:26:42 +0000 | [diff] [blame] | 97 | ValueSymbolTable *OldST = TraitsClass::getSymTab(OldIP); |
| 98 | if (NewST != OldST) { |
Chris Lattner | 7e70829 | 2002-06-25 16:13:24 +0000 | [diff] [blame] | 99 | for (; first != last; ++first) { |
| 100 | ValueSubClass &V = *first; |
| 101 | bool HasName = V.hasName(); |
Chris Lattner | 17fcdd5 | 2007-04-17 03:26:42 +0000 | [diff] [blame] | 102 | if (OldST && HasName) |
| 103 | OldST->removeValueName(V.getValueName()); |
Chris Lattner | 7e70829 | 2002-06-25 16:13:24 +0000 | [diff] [blame] | 104 | V.setParent(NewIP); |
Chris Lattner | 17fcdd5 | 2007-04-17 03:26:42 +0000 | [diff] [blame] | 105 | if (NewST && HasName) |
| 106 | NewST->reinsertValue(&V); |
Chris Lattner | 7e70829 | 2002-06-25 16:13:24 +0000 | [diff] [blame] | 107 | } |
| 108 | } else { |
Misha Brukman | 6b63452 | 2003-10-10 17:54:14 +0000 | [diff] [blame] | 109 | // Just transferring between blocks in the same function, simply update the |
Chris Lattner | 7e70829 | 2002-06-25 16:13:24 +0000 | [diff] [blame] | 110 | // parent fields in the instructions... |
| 111 | for (; first != last; ++first) |
| 112 | first->setParent(NewIP); |
| 113 | } |
| 114 | } |
| 115 | |
Brian Gaeke | d0fde30 | 2003-11-11 22:41:34 +0000 | [diff] [blame] | 116 | } // End llvm namespace |
| 117 | |
Chris Lattner | 7e70829 | 2002-06-25 16:13:24 +0000 | [diff] [blame] | 118 | #endif |