//===- SectLinker.h -------------------------------------------------------===//
//
//                     The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
//SectLinker is a base class inherited by target specific linker.
//This class primarily handles common functionality used by all linkers.
//
//===----------------------------------------------------------------------===//
#ifndef MCLD_SECTION_LINKER_H
#define MCLD_SECTION_LINKER_H
#ifdef ENABLE_UNITTEST
#include <gtest.h>
#endif
#include <llvm/CodeGen/MachineFunctionPass.h>
#include <mcld/Support/PositionDependentOption.h>
#include <vector>

namespace llvm
{
class Module;
class MachineFunction;
} // namespace of llvm

namespace mcld
{
class MCLDInfo;
class MCLDFile;
class MCLDDriver;
class TargetLDBackend;
class AttributeFactory;
class SectLinkerOption;
class MemoryAreaFactory;

/** \class SectLinker
*  \brief SectLinker provides a linking pass for standard compilation flow
*
*  SectLinker is responded for
*  - provide an interface for target-specific SectLinekr
*  - set up environment for MCLDDriver
*  - control AsmPrinter, make sure AsmPrinter has already prepared
*    all MCSectionDatas for linking
*
*  SectLinker resolves the absolue paths of input arguments.
*
*  @see MachineFunctionPass MCLDDriver
*/
class SectLinker : public llvm::MachineFunctionPass
{
protected:
  // Constructor. Although SectLinker has only two arguments,
  // TargetSectLinker should handle
  // - enabled attributes
  // - the default attribute
  // - the default link script
  // - the standard symbols
  SectLinker(SectLinkerOption &pOption,
             TargetLDBackend &pLDBackend);

public:
  virtual ~SectLinker();

  /// doInitialization - Read all parameters and set up the AsmPrinter.
  /// If your pass overrides this, it must make sure to explicitly call
  /// this implementation.
  virtual bool doInitialization(llvm::Module &pM);

  /// doFinalization - Shut down the AsmPrinter, and do really linking.
  /// If you override this in your pass, you must make sure to call it
  /// explicitly.
  virtual bool doFinalization(llvm::Module &pM);

  /// runOnMachineFunction
  /// redirect to AsmPrinter
  virtual bool runOnMachineFunction(llvm::MachineFunction& pMFn);

protected:
  void initializeInputTree(const PositionDependentOptions &pOptions) const;

  void initializeInputOutput(MCLDInfo& pLDInfo);

  MemoryAreaFactory* memAreaFactory()
  { return m_pMemAreaFactory; }

private:
  SectLinkerOption *m_pOption;

protected:
  TargetLDBackend *m_pLDBackend;
  MCLDDriver *m_pLDDriver;
  MemoryAreaFactory *m_pMemAreaFactory;

private:
  static char m_ID;
};

} // namespace of MC Linker

#endif

