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
19namespace mcld
20{
21
22class Relocation;
23class ResolveInfo;
24class Fragment;
25
26/** \class FGNode
27 *  \brief FGNode is a node for FragmentGraph
28 */
29class FGNode
30{
31public:
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
47public:
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 ----- ///
56  uint32_t getIndex() const
57  {  return m_Index; }
58
59  slot_iterator         slot_begin   ()       { return m_Slots.begin();     }
60  const_slot_iterator   slot_begin   () const { return m_Slots.begin();     }
61  slot_iterator         slot_end     ()       { return m_Slots.end();       }
62  const_slot_iterator   slot_end     () const { return m_Slots.end();       }
63
64  signal_iterator       signal_begin ()       { return m_Signals.begin();   }
65  const_signal_iterator signal_begin () const { return m_Signals.begin();   }
66  signal_iterator       signal_end   ()       { return m_Signals.end();     }
67  const_signal_iterator signal_end   () const { return m_Signals.end();     }
68
69  frag_iterator         frag_begin   ()       { return m_Fragments.begin(); }
70  const_frag_iterator   frag_begin   () const { return m_Fragments.begin(); }
71  frag_iterator         frag_end     ()       { return m_Fragments.end();   }
72  const_frag_iterator   frag_end     () const { return m_Fragments.end();   }
73
74private:
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