• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===- MCLDOptions.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_OPTIONS_H
10 #define MCLD_OPTIONS_H
11 #ifdef ENABLE_UNITTEST
12 #include <gtest.h>
13 #endif
14 #include <string>
15 #include <llvm/ADT/StringRef.h>
16 #include <mcld/ADT/StringEntry.h>
17 #include <mcld/ADT/HashTable.h>
18 #include <mcld/Support/RealPath.h>
19 #include <mcld/Support/FileSystem.h>
20 #include <mcld/MC/SearchDirs.h>
21 #include <mcld/MC/ZOption.h>
22 
23 namespace mcld
24 {
25 class Input;
26 
27 /** \class ScriptOptions
28  *
29  */
30 class ScriptOptions
31 {
32 public:
33   typedef HashTable<StringEntry<llvm::StringRef>,
34                     StringHash<ELF>,
35                     StringEntryFactory<llvm::StringRef> > SymbolRenameMap;
36 
37 public:
38   ScriptOptions();
39   ~ScriptOptions();
40 
renameMap()41   SymbolRenameMap& renameMap()
42   { return m_SymbolRenames; }
43 
renameMap()44   const SymbolRenameMap& renameMap() const
45   { return m_SymbolRenames; }
46 
47 private:
48   SymbolRenameMap m_SymbolRenames;
49 };
50 
51 /** \class GeneralOptions
52  *  \brief GeneralOptions collects the options that not be one of the
53  *     - input files
54  *     - attribute of input files
55  *     - script options
56  */
57 class GeneralOptions
58 {
59 public:
60   GeneralOptions();
61   ~GeneralOptions();
62 
63   /// default link script
64   bool hasDefaultLDScript() const;
65   const char* defaultLDScript() const;
66   void setDefaultLDScript(const std::string& pFilename);
67 
68   /// sysroot
sysroot()69   const sys::fs::Path& sysroot() const
70   { return m_Sysroot; }
71 
72   void setSysroot(const sys::fs::Path &pPath);
73 
74   /// search directory
directories()75   SearchDirs& directories()
76   { return m_SearchDirs; }
77 
directories()78   const SearchDirs& directories() const
79   { return m_SearchDirs; }
80 
81   /// trace
82   void setTrace(bool pEnableTrace = true)
83   { m_bTrace = pEnableTrace; }
84 
trace()85   bool trace() const
86   { return m_bTrace; }
87 
88   void setBsymbolic(bool pBsymbolic = false)
89   { m_Bsymbolic = pBsymbolic; }
90 
Bsymbolic()91   bool Bsymbolic() const
92   { return m_Bsymbolic; }
93 
94   void setPIE(bool pPIE = true)
95   { m_bPIE = pPIE; }
96 
isPIE()97   bool isPIE() const
98   { return m_bPIE; }
99 
100   void setBgroup(bool pBgroup = false)
101   { m_Bgroup = pBgroup; }
102 
Bgroup()103   bool Bgroup() const
104   { return m_Bgroup; }
105 
hasEntry()106   bool hasEntry() const
107   { return !m_Entry.empty(); }
108 
setEntry(const std::string & pEntry)109   void setEntry(const std::string& pEntry)
110   { m_Entry = pEntry; }
111 
entry()112   const std::string& entry() const
113   { return m_Entry; }
114 
setDyld(const std::string & pDyld)115   void setDyld(const std::string& pDyld)
116   { m_Dyld = pDyld; }
117 
dyld()118   const std::string& dyld() const
119   { return m_Dyld; }
120 
hasDyld()121   bool hasDyld() const
122   { return !m_Dyld.empty(); }
123 
124   void setAllowShlibUndefined(bool pEnabled = true)
125   { m_bAllowShlibUndefined = pEnabled; }
126 
isAllowShlibUndefined()127   bool isAllowShlibUndefined() const
128   { return m_bAllowShlibUndefined; }
129 
130   void setVerbose(int8_t pVerbose = -1)
131   { m_Verbose = pVerbose; }
132 
verbose()133   int8_t verbose() const
134   { return m_Verbose; }
135 
setMaxErrorNum(int16_t pNum)136   void setMaxErrorNum(int16_t pNum)
137   { m_MaxErrorNum = pNum; }
138 
maxErrorNum()139   int16_t maxErrorNum() const
140   { return m_MaxErrorNum; }
141 
setMaxWarnNum(int16_t pNum)142   void setMaxWarnNum(int16_t pNum)
143   { m_MaxWarnNum = pNum; }
144 
maxWarnNum()145   int16_t maxWarnNum() const
146   { return m_MaxWarnNum; }
147 
148   void setColor(bool pEnabled = true)
149   { m_bColor = pEnabled; }
150 
color()151   bool color() const
152   { return m_bColor; }
153 
154   void setNoUndefined(bool pEnable = false)
155   { m_bNoUndefined = pEnable; }
156 
157   void setMulDefs(bool pEnable = false)
158   { m_bMulDefs = pEnable; }
159 
160   void setEhFrameHdr(bool pEnable = true)
161   { m_bCreateEhFrameHdr = pEnable; }
162 
163   ///  -----  the -z options  -----  ///
164   void addZOption(const mcld::ZOption& pOption);
165 
hasCombReloc()166   bool hasCombReloc() const
167   { return m_bCombReloc; }
168 
isNoUndefined()169   bool isNoUndefined() const
170   { return m_bNoUndefined; }
171 
hasStackSet()172   bool hasStackSet() const
173   { return (Unknown != m_ExecStack); }
174 
hasExecStack()175   bool hasExecStack() const
176   { return (YES == m_ExecStack); }
177 
hasInitFirst()178   bool hasInitFirst() const
179   { return m_bInitFirst; }
180 
hasInterPose()181   bool hasInterPose() const
182   { return m_bInterPose; }
183 
hasLoadFltr()184   bool hasLoadFltr() const
185   { return m_bLoadFltr; }
186 
hasMulDefs()187   bool hasMulDefs() const
188   { return m_bMulDefs; }
189 
hasNoCopyReloc()190   bool hasNoCopyReloc() const
191   { return m_bNoCopyReloc; }
192 
hasNoDefaultLib()193   bool hasNoDefaultLib() const
194   { return m_bNoDefaultLib; }
195 
hasNoDelete()196   bool hasNoDelete() const
197   { return m_bNoDelete; }
198 
hasNoDLOpen()199   bool hasNoDLOpen() const
200   { return m_bNoDLOpen; }
201 
hasNoDump()202   bool hasNoDump() const
203   { return m_bNoDump; }
204 
hasRelro()205   bool hasRelro() const
206   { return m_bRelro; }
207 
hasNow()208   bool hasNow() const
209   { return m_bNow; }
210 
hasOrigin()211   bool hasOrigin() const
212   { return m_bOrigin; }
213 
commPageSize()214   uint64_t commPageSize() const
215   { return m_CommPageSize; }
216 
maxPageSize()217   uint64_t maxPageSize() const
218   { return m_MaxPageSize; }
219 
hasEhFrameHdr()220   bool hasEhFrameHdr() const
221   { return m_bCreateEhFrameHdr; }
222 
223 private:
224   enum status {
225     YES,
226     NO,
227     Unknown
228   };
229 
230 private:
231   Input* m_pDefaultBitcode;
232   std::string m_DefaultLDScript;
233   sys::fs::RealPath m_Sysroot;
234   SearchDirs m_SearchDirs;
235   std::string m_Entry;
236   std::string m_Dyld;
237   int8_t m_Verbose;            // --verbose[=0,1,2]
238   uint16_t m_MaxErrorNum;      // --error-limit=N
239   uint16_t m_MaxWarnNum;       // --warning-limit=N
240   status m_ExecStack;          // execstack, noexecstack
241   uint64_t m_CommPageSize;     // common-page-size=value
242   uint64_t m_MaxPageSize;      // max-page-size=value
243   bool m_bCombReloc     : 1;   // combreloc, nocombreloc
244   bool m_bNoUndefined   : 1;   // defs, --no-undefined
245   bool m_bInitFirst     : 1;   // initfirst
246   bool m_bInterPose     : 1;   // interpose
247   bool m_bLoadFltr      : 1;   // loadfltr
248   bool m_bMulDefs       : 1;   // muldefs
249   bool m_bNoCopyReloc   : 1;   // nocopyreloc
250   bool m_bNoDefaultLib  : 1;   // nodefaultlib
251   bool m_bNoDelete      : 1;   // nodelete
252   bool m_bNoDLOpen      : 1;   // nodlopen
253   bool m_bNoDump        : 1;   // nodump
254   bool m_bRelro         : 1;   // relro, norelro
255   bool m_bNow           : 1;   // lazy, now
256   bool m_bOrigin        : 1;   // origin
257   bool m_bTrace         : 1;   // --trace
258   bool m_Bsymbolic      : 1;   // --Bsymbolic
259   bool m_Bgroup         : 1;
260   bool m_bPIE           : 1;
261   bool m_bColor         : 1;   // --color[=true,false,auto]
262   bool m_bAllowShlibUndefined : 1; // --[no-]allow-shlib-undefined and
263   bool m_bCreateEhFrameHdr : 1;    // --eh-frame-hdr
264 };
265 
266 } // namespace of mcld
267 
268 #endif
269 
270