16f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===- FGNode.h -----------------------------------------------------------===//
26f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//
36f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//                     The MCLinker Project
46f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//
56f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// This file is distributed under the University of Illinois Open Source
66f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// License. See LICENSE.TXT for details.
76f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//
86f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===//
96f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#ifndef MCLD_FGNODE_H
106f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#define MCLD_FGNODE_H
116f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#ifdef ENABLE_UNITTEST
126f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <gtest.h>
136f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#endif
146f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
156f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <llvm/Support/DataTypes.h>
166f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
176f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <vector>
186f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
196f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesnamespace mcld
206f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{
216f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
226f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass Relocation;
236f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass ResolveInfo;
246f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass Fragment;
256f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
266f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/** \class FGNode
276f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines *  \brief FGNode is a node for FragmentGraph
286f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines */
296f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesclass FGNode
306f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{
316f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinespublic:
326f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef ResolveInfo* Slot;
336f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef Relocation*  Signal;
346f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
356f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef std::vector<Fragment*> FragmentListType;
366f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef FragmentListType::iterator frag_iterator;
376f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef FragmentListType::const_iterator const_frag_iterator;
386f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
396f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef std::vector<Slot> SlotListType;
406f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef SlotListType::iterator slot_iterator;
416f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef SlotListType::const_iterator const_slot_iterator;
426f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
436f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef std::vector<Signal> SignalListType;
446f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef SignalListType::iterator signal_iterator;
456f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  typedef SignalListType::const_iterator const_signal_iterator;
466f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
476f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinespublic:
486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  FGNode();
496f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  explicit FGNode(uint32_t pIndex);
506f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
516f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void addFragment(Fragment* pFrag);
526f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void addSignal(Signal pSignal);
536f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void addSlot(Slot pSlot);
546f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
556f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// ----- observers ----- ///
566f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  uint32_t getIndex() const
576f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  {  return m_Index; }
586f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
596f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  slot_iterator         slot_begin   ()       { return m_Slots.begin();     }
606f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const_slot_iterator   slot_begin   () const { return m_Slots.begin();     }
616f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  slot_iterator         slot_end     ()       { return m_Slots.end();       }
626f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const_slot_iterator   slot_end     () const { return m_Slots.end();       }
636f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
646f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  signal_iterator       signal_begin ()       { return m_Signals.begin();   }
656f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const_signal_iterator signal_begin () const { return m_Signals.begin();   }
666f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  signal_iterator       signal_end   ()       { return m_Signals.end();     }
676f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const_signal_iterator signal_end   () const { return m_Signals.end();     }
686f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
696f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  frag_iterator         frag_begin   ()       { return m_Fragments.begin(); }
706f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const_frag_iterator   frag_begin   () const { return m_Fragments.begin(); }
716f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  frag_iterator         frag_end     ()       { return m_Fragments.end();   }
726f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const_frag_iterator   frag_end     () const { return m_Fragments.end();   }
736f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
746f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprivate:
756f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  FragmentListType m_Fragments;
766f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
776f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// m_Signals - a list of relocations describes the possible fan-out of this
786f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// node
796f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  SignalListType m_Signals;
806f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
816f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// m_Slots - a list of symbols describes the possible fan-in of this node
826f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  SlotListType m_Slots;
836f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
846f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /// m_Index - the index in the reachability matrix
856f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  uint32_t m_Index;
866f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines};
876f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
886f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} // namespace of mcld
896f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
906f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#endif
916f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
92