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_SUPPORT_LINKER_CONFIG_H
11#define ALONE_SUPPORT_LINKER_CONFIG_H
12
13#include <string>
14
15#include <mcld/LinkerConfig.h>
16#include <mcld/LinkerScript.h>
17#include <mcld/Support/TargetRegistry.h>
18#include <mcld/LD/DiagnosticLineInfo.h>
19#include <mcld/LD/DiagnosticPrinter.h>
20
21namespace alone {
22
23class LinkerConfig {
24private:
25  //===--------------------------------------------------------------------===//
26  // Available Configurations
27  //===--------------------------------------------------------------------===//
28  const std::string mTriple;
29  std::string mSOName;
30
31private:
32  //===--------------------------------------------------------------------===//
33  // These are generated by LinkerConfig during initialize().
34  //===--------------------------------------------------------------------===//
35  const mcld::Target *mTarget;
36  bool initializeTarget();
37
38  mcld::LinkerConfig *mLDConfig;
39  bool initializeLDInfo();
40
41  mcld::LinkerScript *mLDScript;
42  bool initializeLDScript();
43
44  mcld::DiagnosticLineInfo *mDiagLineInfo;
45  mcld::DiagnosticPrinter *mDiagPrinter;
46  bool initializeDiagnostic();
47
48public:
49  enum ZOptionEnum {
50    kCombReloc     = 1 << 0,  ///< [on] -z combreloc, [off] -z nocombreloc
51    kDefs          = 1 << 1,  ///< -z defs
52    kExecStack     = 1 << 2,  ///< [on] -z execstack, [off] -z noexecstack
53    kInitFirst     = 1 << 3,  ///< -z initfirst
54    kInterPose     = 1 << 4,  ///< -z interpose
55    kLoadFltr      = 1 << 5,  ///< -z loadfltr
56    kMulDefs       = 1 << 6,  ///< -z muldefs
57    kNoCopyReloc   = 1 << 7,  ///< -z nocopyreloc
58    kNoDefaultLib  = 1 << 8,  ///< -z nodefaultlib
59    kNoDelete      = 1 << 9,  ///< -z nodelete
60    kNoDLOpen      = 1 << 10, ///< -z nodlopen
61    kNoDump        = 1 << 11, ///< -z nodump
62    kRelro         = 1 << 12, ///< [on] -z relro, [off] -z norelro
63    kLazy          = 1 << 13, ///< [on] -z lazy, [off] -z now
64    kOrigin        = 1 << 14, ///< -z origin
65    kZOptionMask   = 0xFFFF
66  };
67
68public:
69  //===--------------------------------------------------------------------===//
70  // Getters
71  //===--------------------------------------------------------------------===//
72  inline const std::string &getTriple() const
73  { return mTriple; }
74
75  inline const mcld::Target *getTarget() const
76  { return mTarget; }
77
78  inline mcld::LinkerConfig* getLDConfig()
79  { return mLDConfig; }
80
81  inline const mcld::LinkerConfig* getLDConfig() const
82  { return mLDConfig; }
83
84  inline mcld::LinkerScript* getLDScript()
85  { return mLDScript; }
86
87  inline const mcld::LinkerScript* getLDScript() const
88  { return mLDScript; }
89
90  bool isShared() const;
91
92  inline std::string getSOName() const
93  { return mSOName; }
94
95  void setShared(bool pEnable = true);
96
97  void setBsymbolic(bool pEnable = true);
98
99  void setDefineCommon(bool pEnable = true);
100
101  void setSOName(const std::string &pSOName);
102
103  void setDyld(const std::string &pDyld);
104
105  void setSysRoot(const std::string &pSysRoot);
106
107  void setZOption(unsigned int pOptions);
108
109  void addWrap(const std::string &pWrapSymbol);
110
111  void addPortable(const std::string &pPortableSymbol);
112
113  void addSearchDir(const std::string &pDir);
114
115public:
116  LinkerConfig(const std::string& pTriple);
117
118  virtual ~LinkerConfig();
119};
120
121} // end namespace alone
122
123#endif // ALONE_SUPPORT_LINKER_CONFIG_H
124