Linker.h revision 22add6ff3426df1a85089fe6a6e1597ee3b6f300
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
10#ifndef ALONE_LINKER_H
11#define ALONE_LINKER_H
12
13#include <string>
14
15namespace mcld {
16
17class Module;
18class TargetLDBackend;
19class ObjectLinker;
20class ContextFactory;
21class LinkerConfig;
22class TreeIteratorBase;
23class Input;
24class InputFactory;
25class InputBuilder;
26class MemoryArea;
27class MemoryAreaFactory;
28
29namespace sys { namespace fs {
30
31class Path;
32
33} } // end namespace sys::fs
34
35} // end namespace mcld
36
37namespace alone {
38
39class LinkerConfig;
40
41class Linker {
42public:
43  enum ErrorCode {
44    kSuccess,
45    kDoubleConfig,
46    kCreateBackend,
47    kDelegateLDInfo,
48    kFindNameSpec,
49    kOpenNameSpec,
50    kOpenObjectFile,
51    kNotConfig,
52    kNotSetUpOutput,
53    kOpenOutput,
54    kReadSections,
55    kReadSymbols,
56    kAddAdditionalSymbols,
57    kMaxErrorCode
58  };
59
60  static const char *GetErrorString(enum ErrorCode pErrCode);
61
62private:
63  const mcld::LinkerConfig *mLDConfig;
64  mcld::Module *mModule;
65  mcld::TargetLDBackend *mBackend;
66  mcld::ObjectLinker *mObjLinker;
67  mcld::InputFactory *mInputFactory;
68  mcld::MemoryAreaFactory *mMemAreaFactory;
69  mcld::ContextFactory *mContextFactory;
70  mcld::InputBuilder *mBuilder;
71  mcld::TreeIteratorBase *mRoot;
72  std::string mSOName;
73  mcld::MemoryArea* mOutput;
74
75public:
76  Linker();
77
78  Linker(const LinkerConfig& pConfig);
79
80  ~Linker();
81
82  enum ErrorCode config(const LinkerConfig& pConfig);
83
84  enum ErrorCode addNameSpec(const std::string &pNameSpec);
85
86  enum ErrorCode addObject(const std::string &pObjectPath);
87
88  enum ErrorCode addObject(void* pMemory, size_t pSize);
89
90  enum ErrorCode addCode(void* pMemory, size_t pSize);
91
92  enum ErrorCode setOutput(const std::string &pPath);
93
94  enum ErrorCode setOutput(int pFileHandler);
95
96  enum ErrorCode link();
97
98private:
99  enum ErrorCode extractFiles(const LinkerConfig& pConfig);
100
101  enum ErrorCode openFile(const mcld::sys::fs::Path& pPath,
102                          enum ErrorCode pCode,
103                          mcld::Input& pInput);
104
105  void advanceRoot();
106};
107
108} // end namespace alone
109
110#endif // ALONE_LINKER_H
111