1 //===-- llvm/SymbolTableListTraitsImpl.h - Implementation ------*- C++ -*--===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
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.
14 //===----------------------------------------------------------------------===//
16 #ifndef LLVM_LIB_IR_SYMBOLTABLELISTTRAITSIMPL_H
17 #define LLVM_LIB_IR_SYMBOLTABLELISTTRAITSIMPL_H
19 #include "llvm/IR/SymbolTableListTraits.h"
20 #include "llvm/IR/ValueSymbolTable.h"
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.
32 ValueSymbolTable *OldST = getSymTab(getListOwner());
37 // Get the new SymTab object.
38 ValueSymbolTable *NewST = getSymTab(getListOwner());
40 // If there is nothing to do, quick exit.
41 if (OldST == NewST) return;
43 // Move all the elements from the old symtab to the new one.
44 iplist<ValueSubClass> &ItemList = getList(getListOwner());
45 if (ItemList.empty()) return;
48 // Remove all entries from the previous symtab.
49 for (auto I = ItemList.begin(); I != ItemList.end(); ++I)
51 OldST->removeValueName(I->getValueName());
55 // Add all of the items to the new symtab.
56 for (auto I = ItemList.begin(); I != ItemList.end(); ++I)
58 NewST->reinsertValue(I);
63 template<typename ValueSubClass, typename ItemParentClass>
64 void SymbolTableListTraits<ValueSubClass,ItemParentClass>
65 ::addNodeToList(ValueSubClass *V) {
66 assert(!V->getParent() && "Value already in a container!!");
67 ItemParentClass *Owner = getListOwner();
70 if (ValueSymbolTable *ST = getSymTab(Owner))
74 template<typename ValueSubClass, typename ItemParentClass>
75 void SymbolTableListTraits<ValueSubClass,ItemParentClass>
76 ::removeNodeFromList(ValueSubClass *V) {
77 V->setParent(nullptr);
79 if (ValueSymbolTable *ST = getSymTab(getListOwner()))
80 ST->removeValueName(V->getValueName());
83 template<typename ValueSubClass, typename ItemParentClass>
84 void SymbolTableListTraits<ValueSubClass,ItemParentClass>
85 ::transferNodesFromList(ilist_traits<ValueSubClass> &L2,
86 ilist_iterator<ValueSubClass> first,
87 ilist_iterator<ValueSubClass> last) {
88 // We only have to do work here if transferring instructions between BBs
89 ItemParentClass *NewIP = getListOwner(), *OldIP = L2.getListOwner();
90 if (NewIP == OldIP) return; // No work to do at all...
92 // We only have to update symbol table entries if we are transferring the
93 // instructions to a different symtab object...
94 ValueSymbolTable *NewST = getSymTab(NewIP);
95 ValueSymbolTable *OldST = getSymTab(OldIP);
97 for (; first != last; ++first) {
98 ValueSubClass &V = *first;
99 bool HasName = V.hasName();
100 if (OldST && HasName)
101 OldST->removeValueName(V.getValueName());
103 if (NewST && HasName)
104 NewST->reinsertValue(&V);
107 // Just transferring between blocks in the same function, simply update the
108 // parent fields in the instructions...
109 for (; first != last; ++first)
110 first->setParent(NewIP);
114 } // End llvm namespace