1 //===-- llvm/SymbolTableListTraits.h - Traits for iplist --------*- 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 defines a generic class that is used to implement the automatic
11 // symbol table manipulation that occurs when you put (for example) a named
12 // instruction into a basic block.
14 // The way that this is implemented is by using a special traits class with the
15 // intrusive list that makes up the list of instructions in a basic block. When
16 // a new element is added to the list of instructions, the traits class is
17 // notified, allowing the symbol table to be updated.
19 // This generic class implements the traits class. It must be generic so that
20 // it can work for all uses it, which include lists of instructions, basic
21 // blocks, arguments, functions, global variables, etc...
23 //===----------------------------------------------------------------------===//
25 #ifndef LLVM_SYMBOLTABLELISTTRAITS_H
26 #define LLVM_SYMBOLTABLELISTTRAITS_H
28 #include "llvm/ADT/ilist.h"
31 class ValueSymbolTable
;
33 template<typename NodeTy
> class ilist_iterator
;
34 template<typename NodeTy
, typename Traits
> class iplist
;
35 template<typename Ty
> struct ilist_traits
;
37 // ValueSubClass - The type of objects that I hold, e.g. Instruction.
38 // ItemParentClass - The type of object that owns the list, e.g. BasicBlock.
40 template<typename ValueSubClass
, typename ItemParentClass
>
41 class SymbolTableListTraits
: public ilist_default_traits
<ValueSubClass
> {
42 typedef ilist_traits
<ValueSubClass
> TraitsClass
;
44 SymbolTableListTraits() {}
46 /// getListOwner - Return the object that owns this list. If this is a list
47 /// of instructions, it returns the BasicBlock that owns them.
48 ItemParentClass
*getListOwner() {
49 typedef iplist
<ValueSubClass
> ItemParentClass::*Sublist
;
50 size_t Offset(size_t(&((ItemParentClass
*)0->*ItemParentClass::
51 getSublistAccess(static_cast<ValueSubClass
*>(0)))));
52 iplist
<ValueSubClass
>* Anchor(static_cast<iplist
<ValueSubClass
>*>(this));
53 return reinterpret_cast<ItemParentClass
*>(reinterpret_cast<char*>(Anchor
)-
57 static iplist
<ValueSubClass
> &getList(ItemParentClass
*Par
) {
58 return Par
->*(Par
->getSublistAccess((ValueSubClass
*)0));
61 static ValueSymbolTable
*getSymTab(ItemParentClass
*Par
) {
62 return Par
? toPtr(Par
->getValueSymbolTable()) : 0;
65 void addNodeToList(ValueSubClass
*V
);
66 void removeNodeFromList(ValueSubClass
*V
);
67 void transferNodesFromList(ilist_traits
<ValueSubClass
> &L2
,
68 ilist_iterator
<ValueSubClass
> first
,
69 ilist_iterator
<ValueSubClass
> last
);
71 template<typename TPtr
>
72 void setSymTabObject(TPtr
*, TPtr
);
73 static ValueSymbolTable
*toPtr(ValueSymbolTable
*P
) { return P
; }
74 static ValueSymbolTable
*toPtr(ValueSymbolTable
&R
) { return &R
; }
77 } // End llvm namespace