//===- OutputRelocSection.h -----------------------------------------------===//
//
//                     The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef MCLD_OUTPUT_RELOCATION_SECTION_H
#define MCLD_OUTPUT_RELOCATION_SECTION_H
#ifdef ENABLE_UNITTEST
#include <gtest.h>
#endif

#include <mcld/LD/RelocData.h>

namespace mcld
{

class LDSymbol;
class Module;
class Relocation;
class RelocationFactory;

/** \class OutputRelocSection
 *  \brief Dynamic relocation section for ARM .rel.dyn and .rel.plt
 */
class OutputRelocSection
{
public:
  OutputRelocSection(Module& pModule, LDSection& pSection);

  ~OutputRelocSection();

  void reserveEntry(size_t pNum=1);

  Relocation* consumeEntry();

  /// addSymbolToDynSym - add local symbol to TLS category so that it'll be
  /// emitted into .dynsym
  bool addSymbolToDynSym(LDSymbol& pSymbol);

  // ----- observers ----- //
  bool empty()
  { return m_pRelocData->empty(); }

  size_t numOfRelocs();

private:
  typedef RelocData::iterator RelocIterator;

private:
  Module& m_Module;

  /// m_RelocData - the output RelocData which contains the dynamic
  /// relocations
  RelocData* m_pRelocData;

  /// m_isVisit - First time visit the function getEntry() or not
  bool m_isVisit;

  /// m_ValidEntryIterator - point to the first valid entry
  RelocIterator m_ValidEntryIterator;
};

} // namespace of mcld

#endif