PageRenderTime 118ms CodeModel.GetById 38ms app.highlight 11ms RepoModel.GetById 29ms app.codeStats 0ms

/3rd_party/llvm/lib/VMCore/SymbolTableListTraitsImpl.h

https://code.google.com/p/softart/
C++ Header | 118 lines | 72 code | 17 blank | 29 comment | 30 complexity | 5804a642febd36f7c7f6d7d3d31e3bdb MD5 | raw file
Possible License(s): LGPL-2.1, BSD-3-Clause, JSON, MPL-2.0-no-copyleft-exception, GPL-2.0, GPL-3.0, LGPL-3.0, BSD-2-Clause
  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_SYMBOLTABLELISTTRAITS_IMPL_H
 17#define LLVM_SYMBOLTABLELISTTRAITS_IMPL_H
 18
 19#include "llvm/SymbolTableListTraits.h"
 20#include "llvm/ValueSymbolTable.h"
 21
 22namespace 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.
 27template<typename ValueSubClass, typename ItemParentClass>
 28template<typename TPtr>
 29void SymbolTableListTraits<ValueSubClass,ItemParentClass>
 30::setSymTabObject(TPtr *Dest, TPtr Src) {
 31  // Get the old symtab and value list before doing the assignment.
 32  ValueSymbolTable *OldST = TraitsClass::getSymTab(getListOwner());
 33
 34  // Do it.
 35  *Dest = Src;
 36  
 37  // Get the new SymTab object.
 38  ValueSymbolTable *NewST = TraitsClass::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  iplist<ValueSubClass> &ItemList = TraitsClass::getList(getListOwner());
 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());
 53  }
 54
 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);
 61  }
 62  
 63}
 64
 65template<typename ValueSubClass, typename ItemParentClass>
 66void SymbolTableListTraits<ValueSubClass,ItemParentClass>
 67::addNodeToList(ValueSubClass *V) {
 68  assert(V->getParent() == 0 && "Value already in a container!!");
 69  ItemParentClass *Owner = getListOwner();
 70  V->setParent(Owner);
 71  if (V->hasName())
 72    if (ValueSymbolTable *ST = TraitsClass::getSymTab(Owner))
 73      ST->reinsertValue(V);
 74}
 75
 76template<typename ValueSubClass, typename ItemParentClass>
 77void SymbolTableListTraits<ValueSubClass,ItemParentClass>
 78::removeNodeFromList(ValueSubClass *V) {
 79  V->setParent(0);
 80  if (V->hasName())
 81    if (ValueSymbolTable *ST = TraitsClass::getSymTab(getListOwner()))
 82      ST->removeValueName(V->getValueName());
 83}
 84
 85template<typename ValueSubClass, typename ItemParentClass>
 86void SymbolTableListTraits<ValueSubClass,ItemParentClass>
 87::transferNodesFromList(ilist_traits<ValueSubClass> &L2,
 88                        ilist_iterator<ValueSubClass> first,
 89                        ilist_iterator<ValueSubClass> last) {
 90  // We only have to do work here if transferring instructions between BBs
 91  ItemParentClass *NewIP = getListOwner(), *OldIP = L2.getListOwner();
 92  if (NewIP == OldIP) return;  // No work to do at all...
 93
 94  // We only have to update symbol table entries if we are transferring the
 95  // instructions to a different symtab object...
 96  ValueSymbolTable *NewST = TraitsClass::getSymTab(NewIP);
 97  ValueSymbolTable *OldST = TraitsClass::getSymTab(OldIP);
 98  if (NewST != OldST) {
 99    for (; first != last; ++first) {
100      ValueSubClass &V = *first;
101      bool HasName = V.hasName();
102      if (OldST && HasName)
103        OldST->removeValueName(V.getValueName());
104      V.setParent(NewIP);
105      if (NewST && HasName)
106        NewST->reinsertValue(&V);
107    }
108  } else {
109    // Just transferring between blocks in the same function, simply update the
110    // parent fields in the instructions...
111    for (; first != last; ++first)
112      first->setParent(NewIP);
113  }
114}
115
116} // End llvm namespace
117
118#endif