Home | History | Annotate | Download | only in mcld
      1 //===- GeneralOptions.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_GENERAL_OPTIONS_H
     10 #define MCLD_GENERAL_OPTIONS_H
     11 #ifdef ENABLE_UNITTEST
     12 #include <gtest.h>
     13 #endif
     14 #include <string>
     15 #include <vector>
     16 #include <mcld/Support/RealPath.h>
     17 #include <mcld/Support/FileSystem.h>
     18 #include <mcld/MC/ZOption.h>
     19 
     20 namespace mcld {
     21 
     22 class Input;
     23 
     24 /** \class GeneralOptions
     25  *  \brief GeneralOptions collects the options that not be one of the
     26  *     - input files
     27  *     - attribute of input files
     28  */
     29 class GeneralOptions
     30 {
     31 public:
     32   enum StripSymbolMode {
     33     KeepAllSymbols,
     34     StripTemporaries,
     35     StripLocals,
     36     StripAllSymbols
     37   };
     38 
     39   enum HashStyle {
     40     SystemV = 0x1,
     41     GNU     = 0x2,
     42     Both    = 0x3
     43   };
     44 
     45   typedef std::vector<std::string> RpathList;
     46   typedef RpathList::iterator rpath_iterator;
     47   typedef RpathList::const_iterator const_rpath_iterator;
     48 
     49   typedef std::vector<std::string> AuxiliaryList;
     50   typedef AuxiliaryList::iterator aux_iterator;
     51   typedef AuxiliaryList::const_iterator const_aux_iterator;
     52 
     53 public:
     54   GeneralOptions();
     55   ~GeneralOptions();
     56 
     57   /// default link script
     58   bool hasDefaultLDScript() const;
     59   const char* defaultLDScript() const;
     60   void setDefaultLDScript(const std::string& pFilename);
     61 
     62   /// trace
     63   void setTrace(bool pEnableTrace = true)
     64   { m_bTrace = pEnableTrace; }
     65 
     66   bool trace() const
     67   { return m_bTrace; }
     68 
     69   void setBsymbolic(bool pBsymbolic = true)
     70   { m_Bsymbolic = pBsymbolic; }
     71 
     72   bool Bsymbolic() const
     73   { return m_Bsymbolic; }
     74 
     75   void setPIE(bool pPIE = true)
     76   { m_bPIE = pPIE; }
     77 
     78   bool isPIE() const
     79   { return m_bPIE; }
     80 
     81   void setBgroup(bool pBgroup = true)
     82   { m_Bgroup = pBgroup; }
     83 
     84   bool Bgroup() const
     85   { return m_Bgroup; }
     86 
     87   bool hasEntry() const
     88   { return !m_Entry.empty(); }
     89 
     90   void setEntry(const std::string& pEntry)
     91   { m_Entry = pEntry; }
     92 
     93   const std::string& entry() const
     94   { return m_Entry; }
     95 
     96   void setDyld(const std::string& pDyld)
     97   { m_Dyld = pDyld; }
     98 
     99   const std::string& dyld() const
    100   { return m_Dyld; }
    101 
    102   bool hasDyld() const
    103   { return !m_Dyld.empty(); }
    104 
    105   void setSOName(const std::string& pName);
    106 
    107   const std::string& soname() const
    108   { return m_SOName; }
    109 
    110   void setVerbose(int8_t pVerbose = -1)
    111   { m_Verbose = pVerbose; }
    112 
    113   int8_t verbose() const
    114   { return m_Verbose; }
    115 
    116   void setMaxErrorNum(int16_t pNum)
    117   { m_MaxErrorNum = pNum; }
    118 
    119   int16_t maxErrorNum() const
    120   { return m_MaxErrorNum; }
    121 
    122   void setMaxWarnNum(int16_t pNum)
    123   { m_MaxWarnNum = pNum; }
    124 
    125   int16_t maxWarnNum() const
    126   { return m_MaxWarnNum; }
    127 
    128   void setColor(bool pEnabled = true)
    129   { m_bColor = pEnabled; }
    130 
    131   bool color() const
    132   { return m_bColor; }
    133 
    134   void setNoUndefined(bool pEnable = true)
    135   { m_bNoUndefined = pEnable; }
    136 
    137   void setMulDefs(bool pEnable = true)
    138   { m_bMulDefs = pEnable; }
    139 
    140   void setEhFrameHdr(bool pEnable = true)
    141   { m_bCreateEhFrameHdr = pEnable; }
    142 
    143   ///  -----  the -z options  -----  ///
    144   void addZOption(const mcld::ZOption& pOption);
    145 
    146   bool hasCombReloc() const
    147   { return m_bCombReloc; }
    148 
    149   bool isNoUndefined() const
    150   { return m_bNoUndefined; }
    151 
    152   bool hasStackSet() const
    153   { return (Unknown != m_ExecStack); }
    154 
    155   bool hasExecStack() const
    156   { return (YES == m_ExecStack); }
    157 
    158   bool hasInitFirst() const
    159   { return m_bInitFirst; }
    160 
    161   bool hasInterPose() const
    162   { return m_bInterPose; }
    163 
    164   bool hasLoadFltr() const
    165   { return m_bLoadFltr; }
    166 
    167   bool hasMulDefs() const
    168   { return m_bMulDefs; }
    169 
    170   bool hasNoCopyReloc() const
    171   { return m_bNoCopyReloc; }
    172 
    173   bool hasNoDefaultLib() const
    174   { return m_bNoDefaultLib; }
    175 
    176   bool hasNoDelete() const
    177   { return m_bNoDelete; }
    178 
    179   bool hasNoDLOpen() const
    180   { return m_bNoDLOpen; }
    181 
    182   bool hasNoDump() const
    183   { return m_bNoDump; }
    184 
    185   bool hasRelro() const
    186   { return m_bRelro; }
    187 
    188   bool hasNow() const
    189   { return m_bNow; }
    190 
    191   bool hasOrigin() const
    192   { return m_bOrigin; }
    193 
    194   uint64_t commPageSize() const
    195   { return m_CommPageSize; }
    196 
    197   uint64_t maxPageSize() const
    198   { return m_MaxPageSize; }
    199 
    200   bool hasEhFrameHdr() const
    201   { return m_bCreateEhFrameHdr; }
    202 
    203   // -n, --nmagic
    204   void setNMagic(bool pMagic = true)
    205   { m_bNMagic = pMagic; }
    206 
    207   bool nmagic() const
    208   { return m_bNMagic; }
    209 
    210   // -N, --omagic
    211   void setOMagic(bool pMagic = true)
    212   { m_bOMagic = pMagic; }
    213 
    214   bool omagic() const
    215   { return m_bOMagic; }
    216 
    217   // -S, --strip-debug
    218   void setStripDebug(bool pStripDebug = true)
    219   { m_bStripDebug = pStripDebug; }
    220 
    221   bool stripDebug() const
    222   { return m_bStripDebug; }
    223 
    224   // -E, --export-dynamic
    225   void setExportDynamic(bool pExportDynamic = true)
    226   { m_bExportDynamic = pExportDynamic; }
    227 
    228   bool exportDynamic() const
    229   { return m_bExportDynamic; }
    230 
    231   // --warn-shared-textrel
    232   void setWarnSharedTextrel(bool pWarnSharedTextrel = true)
    233   { m_bWarnSharedTextrel = pWarnSharedTextrel; }
    234 
    235   bool warnSharedTextrel() const
    236   { return m_bWarnSharedTextrel; }
    237 
    238   void setBinaryInput(bool pBinaryInput = true)
    239   { m_bBinaryInput = pBinaryInput; }
    240 
    241   bool isBinaryInput() const
    242   { return m_bBinaryInput; }
    243 
    244   void setDefineCommon(bool pEnable = true)
    245   { m_bDefineCommon = pEnable; }
    246 
    247   bool isDefineCommon() const
    248   { return m_bDefineCommon; }
    249 
    250   void setFatalWarnings(bool pEnable = true)
    251   { m_bFatalWarnings = pEnable; }
    252 
    253   bool isFatalWarnings() const
    254   { return m_bFatalWarnings; }
    255 
    256   StripSymbolMode getStripSymbolMode() const
    257   { return m_StripSymbols; }
    258 
    259   void setStripSymbols(StripSymbolMode pMode)
    260   { m_StripSymbols = pMode; }
    261 
    262   void setNewDTags(bool pEnable = true)
    263   { m_bNewDTags = pEnable; }
    264 
    265   bool hasNewDTags() const
    266   { return m_bNewDTags; }
    267 
    268   void setNoStdlib(bool pEnable = true)
    269   { m_bNoStdlib = pEnable; }
    270 
    271   bool nostdlib() const
    272   { return m_bNoStdlib; }
    273 
    274   // -M, --print-map
    275   void setPrintMap(bool pEnable = true)
    276   { m_bPrintMap = pEnable; }
    277 
    278   bool printMap() const
    279   { return m_bPrintMap; }
    280 
    281   // -G, max GP size option
    282   void setGPSize(int gpsize)
    283   { m_GPSize = gpsize; }
    284 
    285   int getGPSize() const
    286   { return m_GPSize; }
    287 
    288   unsigned int getHashStyle() const { return m_HashStyle; }
    289 
    290   void setHashStyle(unsigned int pStyle)
    291   { m_HashStyle = pStyle; }
    292 
    293   // -----  link-in rpath  ----- //
    294   const RpathList& getRpathList() const { return m_RpathList; }
    295   RpathList&       getRpathList()       { return m_RpathList; }
    296 
    297   const_rpath_iterator rpath_begin() const { return m_RpathList.begin(); }
    298   rpath_iterator       rpath_begin()       { return m_RpathList.begin(); }
    299   const_rpath_iterator rpath_end  () const { return m_RpathList.end();   }
    300   rpath_iterator       rpath_end  ()       { return m_RpathList.end();   }
    301 
    302   // -----  filter and auxiliary filter  ----- //
    303   void setFilter(const std::string& pFilter)
    304   { m_Filter = pFilter; }
    305 
    306   const std::string& filter() const
    307   { return m_Filter; }
    308 
    309   bool hasFilter() const
    310   { return !m_Filter.empty(); }
    311 
    312   const AuxiliaryList& getAuxiliaryList() const { return m_AuxiliaryList; }
    313   AuxiliaryList&       getAuxiliaryList()       { return m_AuxiliaryList; }
    314 
    315   const_aux_iterator aux_begin() const { return m_AuxiliaryList.begin(); }
    316   aux_iterator       aux_begin()       { return m_AuxiliaryList.begin(); }
    317   const_aux_iterator aux_end  () const { return m_AuxiliaryList.end();   }
    318   aux_iterator       aux_end  ()       { return m_AuxiliaryList.end();   }
    319 
    320 private:
    321   enum status {
    322     YES,
    323     NO,
    324     Unknown
    325   };
    326 
    327 private:
    328   Input* m_pDefaultBitcode;
    329   std::string m_DefaultLDScript;
    330   std::string m_Entry;
    331   std::string m_Dyld;
    332   std::string m_SOName;
    333   int8_t m_Verbose;            // --verbose[=0,1,2]
    334   uint16_t m_MaxErrorNum;      // --error-limit=N
    335   uint16_t m_MaxWarnNum;       // --warning-limit=N
    336   status m_ExecStack;          // execstack, noexecstack
    337   uint64_t m_CommPageSize;     // common-page-size=value
    338   uint64_t m_MaxPageSize;      // max-page-size=value
    339   bool m_bCombReloc     : 1;   // combreloc, nocombreloc
    340   bool m_bNoUndefined   : 1;   // defs, --no-undefined
    341   bool m_bInitFirst     : 1;   // initfirst
    342   bool m_bInterPose     : 1;   // interpose
    343   bool m_bLoadFltr      : 1;   // loadfltr
    344   bool m_bMulDefs       : 1;   // muldefs
    345   bool m_bNoCopyReloc   : 1;   // nocopyreloc
    346   bool m_bNoDefaultLib  : 1;   // nodefaultlib
    347   bool m_bNoDelete      : 1;   // nodelete
    348   bool m_bNoDLOpen      : 1;   // nodlopen
    349   bool m_bNoDump        : 1;   // nodump
    350   bool m_bRelro         : 1;   // relro, norelro
    351   bool m_bNow           : 1;   // lazy, now
    352   bool m_bOrigin        : 1;   // origin
    353   bool m_bTrace         : 1;   // --trace
    354   bool m_Bsymbolic      : 1;   // --Bsymbolic
    355   bool m_Bgroup         : 1;
    356   bool m_bPIE           : 1;
    357   bool m_bColor         : 1;   // --color[=true,false,auto]
    358   bool m_bCreateEhFrameHdr : 1;    // --eh-frame-hdr
    359   bool m_bNMagic : 1; // -n, --nmagic
    360   bool m_bOMagic : 1; // -N, --omagic
    361   bool m_bStripDebug : 1; // -S, --strip-debug
    362   bool m_bExportDynamic :1; //-E, --export-dynamic
    363   bool m_bWarnSharedTextrel : 1; // --warn-shared-textrel
    364   bool m_bBinaryInput : 1; // -b [input-format], --format=[input-format]
    365   bool m_bDefineCommon : 1; // -d, -dc, -dp
    366   bool m_bFatalWarnings : 1; // --fatal-warnings
    367   bool m_bNewDTags: 1; // --enable-new-dtags
    368   bool m_bNoStdlib: 1; // -nostdlib
    369   bool m_bPrintMap: 1; // --print-map
    370   uint32_t m_GPSize; // -G, --gpsize
    371   StripSymbolMode m_StripSymbols;
    372   RpathList m_RpathList;
    373   unsigned int m_HashStyle;
    374   std::string m_Filter;
    375   AuxiliaryList m_AuxiliaryList;
    376 };
    377 
    378 } // namespace of mcld
    379 
    380 #endif
    381 
    382