1 //===-- llvm/SymbolTableListTraitsImpl.h - Implementation ------*- C++ -*--===// 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 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_LIB_IR_SYMBOLTABLELISTTRAITSIMPL_H 17 #define LLVM_LIB_IR_SYMBOLTABLELISTTRAITSIMPL_H 18 19 #include "llvm/IR/SymbolTableListTraits.h" 20 #include "llvm/IR/ValueSymbolTable.h" 21 22 namespace llvm { 23 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> 28 template <typename TPtr> 29 void SymbolTableListTraits<ValueSubClass>::setSymTabObject(TPtr *Dest, 30 TPtr Src) { 31 // Get the old symtab and value list before doing the assignment. 32 ValueSymbolTable *OldST = getSymTab(getListOwner()); 33 34 // Do it. 35 *Dest = Src; 36 37 // Get the new SymTab object. 38 ValueSymbolTable *NewST = getSymTab(getListOwner()); 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. 44 ListTy &ItemList = getList(getListOwner()); 45 if (ItemList.empty()) return; 46 47 if (OldST) { 48 // Remove all entries from the previous symtab. 49 for (auto I = ItemList.begin(); I != ItemList.end(); ++I) 50 if (I->hasName()) 51 OldST->removeValueName(I->getValueName()); 52 } 53 54 if (NewST) { 55 // Add all of the items to the new symtab. 56 for (auto I = ItemList.begin(); I != ItemList.end(); ++I) 57 if (I->hasName()) 58 NewST->reinsertValue(&*I); 59 } 60 61 } 62 63 template <typename ValueSubClass> 64 void SymbolTableListTraits<ValueSubClass>::addNodeToList(ValueSubClass *V) { 65 assert(!V->getParent() && "Value already in a container!!"); 66 ItemParentClass *Owner = getListOwner(); 67 V->setParent(Owner); 68 if (V->hasName()) 69 if (ValueSymbolTable *ST = getSymTab(Owner)) 70 ST->reinsertValue(V); 71 } 72 73 template <typename ValueSubClass> 74 void SymbolTableListTraits<ValueSubClass>::removeNodeFromList( 75 ValueSubClass *V) { 76 V->setParent(nullptr); 77 if (V->hasName()) 78 if (ValueSymbolTable *ST = getSymTab(getListOwner())) 79 ST->removeValueName(V->getValueName()); 80 } 81 82 template <typename ValueSubClass> 83 void SymbolTableListTraits<ValueSubClass>::transferNodesFromList( 84 SymbolTableListTraits &L2, ilist_iterator<ValueSubClass> first, 85 ilist_iterator<ValueSubClass> last) { 86 // We only have to do work here if transferring instructions between BBs 87 ItemParentClass *NewIP = getListOwner(), *OldIP = L2.getListOwner(); 88 if (NewIP == OldIP) return; // No work to do at all... 89 90 // We only have to update symbol table entries if we are transferring the 91 // instructions to a different symtab object... 92 ValueSymbolTable *NewST = getSymTab(NewIP); 93 ValueSymbolTable *OldST = getSymTab(OldIP); 94 if (NewST != OldST) { 95 for (; first != last; ++first) { 96 ValueSubClass &V = *first; 97 bool HasName = V.hasName(); 98 if (OldST && HasName) 99 OldST->removeValueName(V.getValueName()); 100 V.setParent(NewIP); 101 if (NewST && HasName) 102 NewST->reinsertValue(&V); 103 } 104 } else { 105 // Just transferring between blocks in the same function, simply update the 106 // parent fields in the instructions... 107 for (; first != last; ++first) 108 first->setParent(NewIP); 109 } 110 } 111 112 } // End llvm namespace 113 114 #endif 115