• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===- FGNode.h -----------------------------------------------------------===//
2 //
3 //                     The MCLinker Project
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 #ifndef MCLD_FGNODE_H
10 #define MCLD_FGNODE_H
11 #ifdef ENABLE_UNITTEST
12 #include <gtest.h>
13 #endif
14 
15 #include <llvm/Support/DataTypes.h>
16 
17 #include <vector>
18 
19 namespace mcld
20 {
21 
22 class Relocation;
23 class ResolveInfo;
24 class Fragment;
25 
26 /** \class FGNode
27  *  \brief FGNode is a node for FragmentGraph
28  */
29 class FGNode
30 {
31 public:
32   typedef ResolveInfo* Slot;
33   typedef Relocation*  Signal;
34 
35   typedef std::vector<Fragment*> FragmentListType;
36   typedef FragmentListType::iterator frag_iterator;
37   typedef FragmentListType::const_iterator const_frag_iterator;
38 
39   typedef std::vector<Slot> SlotListType;
40   typedef SlotListType::iterator slot_iterator;
41   typedef SlotListType::const_iterator const_slot_iterator;
42 
43   typedef std::vector<Signal> SignalListType;
44   typedef SignalListType::iterator signal_iterator;
45   typedef SignalListType::const_iterator const_signal_iterator;
46 
47 public:
48   FGNode();
49   explicit FGNode(uint32_t pIndex);
50 
51   void addFragment(Fragment* pFrag);
52   void addSignal(Signal pSignal);
53   void addSlot(Slot pSlot);
54 
55   /// ----- observers ----- ///
getIndex()56   uint32_t getIndex() const
57   {  return m_Index; }
58 
slot_begin()59   slot_iterator         slot_begin   ()       { return m_Slots.begin();     }
slot_begin()60   const_slot_iterator   slot_begin   () const { return m_Slots.begin();     }
slot_end()61   slot_iterator         slot_end     ()       { return m_Slots.end();       }
slot_end()62   const_slot_iterator   slot_end     () const { return m_Slots.end();       }
63 
signal_begin()64   signal_iterator       signal_begin ()       { return m_Signals.begin();   }
signal_begin()65   const_signal_iterator signal_begin () const { return m_Signals.begin();   }
signal_end()66   signal_iterator       signal_end   ()       { return m_Signals.end();     }
signal_end()67   const_signal_iterator signal_end   () const { return m_Signals.end();     }
68 
frag_begin()69   frag_iterator         frag_begin   ()       { return m_Fragments.begin(); }
frag_begin()70   const_frag_iterator   frag_begin   () const { return m_Fragments.begin(); }
frag_end()71   frag_iterator         frag_end     ()       { return m_Fragments.end();   }
frag_end()72   const_frag_iterator   frag_end     () const { return m_Fragments.end();   }
73 
74 private:
75   FragmentListType m_Fragments;
76 
77   /// m_Signals - a list of relocations describes the possible fan-out of this
78   /// node
79   SignalListType m_Signals;
80 
81   /// m_Slots - a list of symbols describes the possible fan-in of this node
82   SlotListType m_Slots;
83 
84   /// m_Index - the index in the reachability matrix
85   uint32_t m_Index;
86 };
87 
88 } // namespace of mcld
89 
90 #endif
91 
92