Home | History | Annotate | Download | only in IR
      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