1//===- SectLinker.h -------------------------------------------------------===//
2//
3//                     The MCLinker Project
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10//SectLinker is a base class inherited by target specific linker.
11//This class primarily handles common functionality used by all linkers.
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef SECTION_LINKER_H
16#define SECTION_LINKER_H
17#ifdef ENABLE_UNITTEST
18#include <gtest.h>
19#endif
20#include <llvm/CodeGen/MachineFunctionPass.h>
21#include <mcld/Support/PositionDependentOption.h>
22#include <vector>
23
24namespace llvm
25{
26  class Module;
27  class MachineFunction;
28} // namespace of llvm
29
30namespace mcld
31{
32  class MCLDFile;
33  class MCLDDriver;
34  class TargetLDBackend;
35  class AttributeFactory;
36  class SectLinkerOption;
37
38  /** \class SectLinker
39   *  \brief SectLinker provides a linking pass for standard compilation flow
40   *
41   *  SectLinker is responded for
42   *  - provide an interface for target-specific SectLinekr
43   *  - set up environment for MCLDDriver
44   *  - control AsmPrinter, make sure AsmPrinter has already prepared
45   *    all MCSectionDatas for linking
46   *
47   *  SectLinker resolves the absolue paths of input arguments.
48   *
49   *  @see MachineFunctionPass MCLDDriver
50   */
51  class SectLinker : public llvm::MachineFunctionPass
52  {
53  protected:
54    // Constructor. Although SectLinker has only two arguments,
55    // TargetSectLinker should handle
56    // - enabled attributes
57    // - the default attribute
58    // - the default link script
59    // - the standard symbols
60    SectLinker(SectLinkerOption &pOption,
61               TargetLDBackend &pLDBackend);
62
63  public:
64    virtual ~SectLinker();
65
66    /// addTargetOptions - target SectLinker can hook this function to add
67    /// target-specific inputs
68    virtual void addTargetOptions(llvm::Module &pM,
69                                  SectLinkerOption &pOption)
70    { }
71
72    /// doInitialization - Read all parameters and set up the AsmPrinter.
73    /// If your pass overrides this, it must make sure to explicitly call
74    /// this implementation.
75    virtual bool doInitialization(llvm::Module &pM);
76
77    /// doFinalization - Shut down the AsmPrinter, and do really linking.
78    /// If you override this in your pass, you must make sure to call it
79    /// explicitly.
80    virtual bool doFinalization(llvm::Module &pM);
81
82    /// runOnMachineFunction
83    /// redirect to AsmPrinter
84    virtual bool runOnMachineFunction(llvm::MachineFunction& pMFn);
85
86  protected:
87    void initializeInputTree(const PositionDependentOptions &pOptions) const;
88
89    AttributeFactory* attrFactory()
90    { return m_pAttrFactory; }
91
92  private:
93    SectLinkerOption *m_pOption;
94
95  protected:
96    TargetLDBackend *m_pLDBackend;
97    MCLDDriver *m_pLDDriver;
98    AttributeFactory *m_pAttrFactory;
99
100  private:
101    static char m_ID;
102  };
103
104} // namespace of MC Linker
105
106#endif
107