1affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===- Linker.h -----------------------------------------------------------===//
2affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//
3affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//                     The MCLinker Project
4affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//
5affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// This file is distributed under the University of Illinois Open Source
6affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// License. See LICENSE.TXT for details.
7affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//
8affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===//
967e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao
10affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#ifndef ALONE_LINKER_H
11affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#define ALONE_LINKER_H
12affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
1367e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao#include <string>
1467e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao
1567e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liaonamespace mcld {
1667e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao
1767e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liaoclass TargetLDBackend;
1867e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liaoclass MCLDDriver;
1967e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liaoclass MemoryFactory;
2067e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liaoclass MCLDInfo;
2167e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liaoclass TreeIteratorBase;
2267e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liaoclass Input;
2367e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao
2467e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liaonamespace sys { namespace fs {
2567e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao
2667e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liaoclass Path;
2767e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao
2867e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao} } // end namespace sys::fs
2967e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao
3067e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao} // end namespace mcld
31affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
32affc150dc44fab1911775a49636d0ce85333b634Zonr Changnamespace alone {
33affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
34affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass MemoryFactory;
35affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass LinkerConfig;
36affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
37affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass Linker {
38affc150dc44fab1911775a49636d0ce85333b634Zonr Changpublic:
39affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  enum ErrorCode {
40affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    kSuccess,
41affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    kDoubleConfig,
42affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    kCreateBackend,
43affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    kDelegateLDInfo,
4467e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao    kFindNameSpec,
45affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    kOpenNameSpec,
46affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    kOpenObjectFile,
47affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    kNotConfig,
48affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    kNotSetUpOutput,
49affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    kOpenOutput,
50affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    kReadSections,
51affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    kReadSymbols,
52affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    kAddAdditionalSymbols,
53affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    kMaxErrorCode,
54affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  };
55affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
56affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  static const char *GetErrorString(enum ErrorCode pErrCode);
57affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
58affc150dc44fab1911775a49636d0ce85333b634Zonr Changprivate:
59affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  mcld::TargetLDBackend *mBackend;
60affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  mcld::MCLDDriver *mDriver;
61affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  MemoryFactory *mMemAreaFactory;
6267e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  mcld::MCLDInfo *mLDInfo;
6367e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  mcld::TreeIteratorBase *mRoot;
6467e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  bool mShared;
6567e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao  std::string mSOName;
66affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
67affc150dc44fab1911775a49636d0ce85333b634Zonr Changpublic:
68affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  Linker();
69affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
70affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  Linker(const LinkerConfig& pConfig);
71affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
72affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  ~Linker();
73affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
74affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  enum ErrorCode config(const LinkerConfig& pConfig);
75affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
76affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  enum ErrorCode addNameSpec(const std::string &pNameSpec);
77affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
78affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  enum ErrorCode addObject(const std::string &pObjectPath);
79affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
80affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  enum ErrorCode addObject(void* pMemory, size_t pSize);
81affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
82affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  enum ErrorCode addCode(void* pMemory, size_t pSize);
83affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
84affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  enum ErrorCode setOutput(const std::string &pPath);
85affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
86affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  enum ErrorCode setOutput(int pFileHandler);
87affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
88affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  enum ErrorCode link();
89affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
90affc150dc44fab1911775a49636d0ce85333b634Zonr Changprivate:
91affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  enum ErrorCode extractFiles(const LinkerConfig& pConfig);
92affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
93affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  enum ErrorCode openFile(const mcld::sys::fs::Path& pPath,
94affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                          enum ErrorCode pCode,
95affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                          mcld::Input& pInput);
96affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
97affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  void advanceRoot();
98affc150dc44fab1911775a49636d0ce85333b634Zonr Chang};
99affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
100affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} // end namespace alone
101affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
102affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#endif // ALONE_LINKER_H
103