C++程序  |  105行  |  2.77 KB

//===- 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 SectionDatas 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