Linker.h revision 37b74a387bb3993387029859c2d9d051c41c724e
1//===- Linker.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#ifndef MCLD_LINKER_H_
10#define MCLD_LINKER_H_
11
12#include <string>
13
14namespace mcld {
15
16class FileHandle;
17class FileOutputBuffer;
18class IRBuilder;
19class LinkerConfig;
20class LinkerScript;
21class Module;
22class ObjectLinker;
23class Target;
24class TargetLDBackend;
25
26/** \class Linker
27*  \brief Linker is a modular linker.
28*/
29class Linker {
30 public:
31  Linker();
32
33  ~Linker();
34
35  /// emulate - To set up target-dependent options and default linker script.
36  bool emulate(LinkerScript& pScript, LinkerConfig& pConfig);
37
38  /// normalize - To normalize the command line language into mcld::Module.
39  bool normalize(Module& pModule, IRBuilder& pBuilder);
40
41  /// resolve - To build up the topology of mcld::Module.
42  bool resolve(Module& pModule);
43
44  /// layout - To serialize the final result of the output mcld::Module.
45  bool layout();
46
47  /// link - A convenient way to resolve and to layout the output mcld::Module.
48  bool link(Module& pModule, IRBuilder& pBuilder);
49
50  /// emit - To emit output mcld::Module to a FileOutputBuffer.
51  bool emit(FileOutputBuffer& pOutput);
52
53  /// emit - To open a file for output in pPath and to emit output mcld::Module
54  /// to the file.
55  bool emit(const Module& pModule, const std::string& pPath);
56
57  /// emit - To emit output mcld::Module in the pFileDescriptor.
58  bool emit(const Module& pModule, int pFileDescriptor);
59
60  bool reset();
61
62 private:
63  bool initTarget();
64
65  bool initBackend();
66
67  bool initOStream();
68
69  bool initEmulator(LinkerScript& pScript);
70
71 private:
72  LinkerConfig* m_pConfig;
73  IRBuilder* m_pIRBuilder;
74
75  const Target* m_pTarget;
76  TargetLDBackend* m_pBackend;
77  ObjectLinker* m_pObjLinker;
78};
79
80}  // namespace mcld
81
82#endif  // MCLD_LINKER_H_
83