SymbolTableListTraits.h revision 674be02d525d4e24bc6943ed9274958c580bcfbc
147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs//===-- llvm/SymbolTableListTraits.h - Traits for iplist --------*- C++ -*-===//
247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs//
347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs//                     The LLVM Compiler Infrastructure
447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs//
547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs// This file is distributed under the University of Illinois Open Source
647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs// License. See LICENSE.TXT for details.
747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs//
83250bacd2411d3f1af50135599380b2140238535Ben Skeggs//===----------------------------------------------------------------------===//
93250bacd2411d3f1af50135599380b2140238535Ben Skeggs//
1047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs// This file defines a generic class that is used to implement the automatic
1147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs// symbol table manipulation that occurs when you put (for example) a named
1247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs// instruction into a basic block.
1347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs//
143250bacd2411d3f1af50135599380b2140238535Ben Skeggs// The way that this is implemented is by using a special traits class with the
153250bacd2411d3f1af50135599380b2140238535Ben Skeggs// intrusive list that makes up the list of instructions in a basic block.  When
163250bacd2411d3f1af50135599380b2140238535Ben Skeggs// a new element is added to the list of instructions, the traits class is
173250bacd2411d3f1af50135599380b2140238535Ben Skeggs// notified, allowing the symbol table to be updated.
183250bacd2411d3f1af50135599380b2140238535Ben Skeggs//
193250bacd2411d3f1af50135599380b2140238535Ben Skeggs// This generic class implements the traits class.  It must be generic so that
203250bacd2411d3f1af50135599380b2140238535Ben Skeggs// it can work for all uses it, which include lists of instructions, basic
213250bacd2411d3f1af50135599380b2140238535Ben Skeggs// blocks, arguments, functions, global variables, etc...
223250bacd2411d3f1af50135599380b2140238535Ben Skeggs//
233250bacd2411d3f1af50135599380b2140238535Ben Skeggs//===----------------------------------------------------------------------===//
243250bacd2411d3f1af50135599380b2140238535Ben Skeggs
253250bacd2411d3f1af50135599380b2140238535Ben Skeggs#ifndef LLVM_IR_SYMBOLTABLELISTTRAITS_H
263250bacd2411d3f1af50135599380b2140238535Ben Skeggs#define LLVM_IR_SYMBOLTABLELISTTRAITS_H
273250bacd2411d3f1af50135599380b2140238535Ben Skeggs
283250bacd2411d3f1af50135599380b2140238535Ben Skeggs#include "llvm/ADT/ilist.h"
293250bacd2411d3f1af50135599380b2140238535Ben Skeggs
303250bacd2411d3f1af50135599380b2140238535Ben Skeggsnamespace llvm {
313250bacd2411d3f1af50135599380b2140238535Ben Skeggsclass ValueSymbolTable;
323250bacd2411d3f1af50135599380b2140238535Ben Skeggs
333250bacd2411d3f1af50135599380b2140238535Ben Skeggstemplate<typename NodeTy> class ilist_iterator;
343250bacd2411d3f1af50135599380b2140238535Ben Skeggstemplate<typename NodeTy, typename Traits> class iplist;
353250bacd2411d3f1af50135599380b2140238535Ben Skeggstemplate<typename Ty> struct ilist_traits;
363250bacd2411d3f1af50135599380b2140238535Ben Skeggs
373250bacd2411d3f1af50135599380b2140238535Ben Skeggs// ValueSubClass   - The type of objects that I hold, e.g. Instruction.
383250bacd2411d3f1af50135599380b2140238535Ben Skeggs// ItemParentClass - The type of object that owns the list, e.g. BasicBlock.
393250bacd2411d3f1af50135599380b2140238535Ben Skeggs//
403250bacd2411d3f1af50135599380b2140238535Ben Skeggstemplate<typename ValueSubClass, typename ItemParentClass>
413250bacd2411d3f1af50135599380b2140238535Ben Skeggsclass SymbolTableListTraits : public ilist_default_traits<ValueSubClass> {
423250bacd2411d3f1af50135599380b2140238535Ben Skeggs  typedef ilist_traits<ValueSubClass> TraitsClass;
433250bacd2411d3f1af50135599380b2140238535Ben Skeggspublic:
443250bacd2411d3f1af50135599380b2140238535Ben Skeggs  SymbolTableListTraits() {}
453250bacd2411d3f1af50135599380b2140238535Ben Skeggs
463250bacd2411d3f1af50135599380b2140238535Ben Skeggs  /// getListOwner - Return the object that owns this list.  If this is a list
473250bacd2411d3f1af50135599380b2140238535Ben Skeggs  /// of instructions, it returns the BasicBlock that owns them.
483250bacd2411d3f1af50135599380b2140238535Ben Skeggs  ItemParentClass *getListOwner() {
493250bacd2411d3f1af50135599380b2140238535Ben Skeggs    size_t Offset(size_t(&((ItemParentClass*)0->*ItemParentClass::
503250bacd2411d3f1af50135599380b2140238535Ben Skeggs                           getSublistAccess(static_cast<ValueSubClass*>(0)))));
513250bacd2411d3f1af50135599380b2140238535Ben Skeggs    iplist<ValueSubClass>* Anchor(static_cast<iplist<ValueSubClass>*>(this));
523250bacd2411d3f1af50135599380b2140238535Ben Skeggs    return reinterpret_cast<ItemParentClass*>(reinterpret_cast<char*>(Anchor)-
533250bacd2411d3f1af50135599380b2140238535Ben Skeggs                                              Offset);
543250bacd2411d3f1af50135599380b2140238535Ben Skeggs  }
553250bacd2411d3f1af50135599380b2140238535Ben Skeggs
563250bacd2411d3f1af50135599380b2140238535Ben Skeggs  static iplist<ValueSubClass> &getList(ItemParentClass *Par) {
573250bacd2411d3f1af50135599380b2140238535Ben Skeggs    return Par->*(Par->getSublistAccess((ValueSubClass*)0));
583250bacd2411d3f1af50135599380b2140238535Ben Skeggs  }
593250bacd2411d3f1af50135599380b2140238535Ben Skeggs
603250bacd2411d3f1af50135599380b2140238535Ben Skeggs  static ValueSymbolTable *getSymTab(ItemParentClass *Par) {
613250bacd2411d3f1af50135599380b2140238535Ben Skeggs    return Par ? toPtr(Par->getValueSymbolTable()) : 0;
623250bacd2411d3f1af50135599380b2140238535Ben Skeggs  }
633250bacd2411d3f1af50135599380b2140238535Ben Skeggs
643250bacd2411d3f1af50135599380b2140238535Ben Skeggs  void addNodeToList(ValueSubClass *V);
6547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs  void removeNodeFromList(ValueSubClass *V);
6647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs  void transferNodesFromList(ilist_traits<ValueSubClass> &L2,
6747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs                             ilist_iterator<ValueSubClass> first,
6847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs                             ilist_iterator<ValueSubClass> last);
6947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs//private:
703250bacd2411d3f1af50135599380b2140238535Ben Skeggs  template<typename TPtr>
713250bacd2411d3f1af50135599380b2140238535Ben Skeggs  void setSymTabObject(TPtr *, TPtr);
723250bacd2411d3f1af50135599380b2140238535Ben Skeggs  static ValueSymbolTable *toPtr(ValueSymbolTable *P) { return P; }
733250bacd2411d3f1af50135599380b2140238535Ben Skeggs  static ValueSymbolTable *toPtr(ValueSymbolTable &R) { return &R; }
7447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs};
7547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
7647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} // End llvm namespace
7747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
7847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs#endif
793250bacd2411d3f1af50135599380b2140238535Ben Skeggs