//===- 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 <llvm/ADT/DenseMap.h>
#include <mcld/LD/SectionData.h>
#include <mcld/LD/RelocationFactory.h>

namespace mcld
{

class ResolveInfo;
class Relocation;

/** \class OutputRelocSection
 *  \brief Dynamic relocation section for ARM .rel.dyn and .rel.plt
 */
class OutputRelocSection
{
public:
  OutputRelocSection(LDSection& pSection,
                     SectionData& pSectionData,
                     unsigned int pEntrySize);

  ~OutputRelocSection();

  void reserveEntry(RelocationFactory& pRelFactory, size_t pNum=1);

  Relocation* getEntry(const ResolveInfo& pSymbol,
                       bool isForGOT,
                       bool& pExist);

private:
  typedef llvm::DenseMap<const ResolveInfo*, Relocation*> SymRelMapType;

  typedef SymRelMapType::iterator SymRelMapIterator;

  typedef SectionData::iterator FragmentIterator;

private:
  /// m_pSection - LDSection of this Section
  LDSection* m_pSection;

  /// m_SectionData - SectionData which contains the dynamic relocations
  SectionData* m_pSectionData;

  /// m_EntryBytes - size of a relocation entry
  unsigned int m_EntryBytes;

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

  /// m_ValidEntryIterator - point to the first valid entry
  FragmentIterator m_ValidEntryIterator;

  /// m_SymRelMap - map the resolved symbol to the Relocation entry
  SymRelMapType m_SymRelMap;
};

} // namespace of mcld

#endif