Home | History | Annotate | Download | only in mcld
      1 //===- LinkerConfig.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_LINKER_CONFIG_H
     10 #define MCLD_LINKER_CONFIG_H
     11 #ifdef ENABLE_UNITTEST
     12 #include <gtest.h>
     13 #endif
     14 
     15 #include <llvm/ADT/Triple.h>
     16 
     17 #include <mcld/GeneralOptions.h>
     18 #include <mcld/ScriptOptions.h>
     19 #include <mcld/TargetOptions.h>
     20 #include <mcld/BitcodeOption.h>
     21 #include <mcld/AttributeOption.h>
     22 #include <mcld/Support/Path.h>
     23 
     24 #include <string>
     25 
     26 namespace mcld {
     27 
     28 /** \class LinkerConfig
     29  *  \brief LinkerConfig is composed of argumments of MCLinker.
     30  *   options()        - the general options
     31  *   scripts()        - the script options
     32  *   bitcode()        - the bitcode being linked
     33  *   attribute()      - the attribute options
     34  */
     35 class LinkerConfig
     36 {
     37 public:
     38   enum CodeGenType {
     39     Unknown,
     40     Object,
     41     DynObj,
     42     Exec,
     43     External,
     44     Binary
     45   };
     46 
     47   /** \enum CodePosition
     48    *  CodePosition indicates the ability of the generated output to be
     49    *  loaded at different addresses. If the output can be loaded at different
     50    *  addresses, we say the output is position independent. Shared libraries
     51    *  and position-independent executable programs (PIE) are in this category.
     52    *  ::Independent indicates the output is position independent.
     53    *  If a executable program can not be loaded at arbitrary addresses, but it
     54    *  can call outside functions, we say the program is dynamic dependent on
     55    *  the address to be loaded. ::DynamicDependent indicates the output is not
     56    *  only a executable program, but also dynamic dependent. In general,
     57    *  executable programs are dynamic dependent.
     58    *  If a executable program can not be loaded at different addresses, and
     59    *  only call inner functions, then we say the program is static dependent on
     60    *  its loaded address. ::StaticDependent is used to indicate this kind of
     61    *  output.
     62    */
     63   enum CodePosition {
     64     Independent,      ///< Position Independent
     65     DynamicDependent, ///< Can call outside libraries
     66     StaticDependent   ///< Can not call outside libraries
     67   };
     68 
     69 public:
     70   LinkerConfig();
     71 
     72   explicit LinkerConfig(const std::string &pTripleString);
     73 
     74   ~LinkerConfig();
     75 
     76   const GeneralOptions& options() const { return m_Options; }
     77   GeneralOptions&       options()       { return m_Options; }
     78 
     79   const ScriptOptions&  scripts() const { return m_Scripts; }
     80   ScriptOptions&        scripts()       { return m_Scripts; }
     81 
     82   const TargetOptions&  targets() const { return m_Targets; }
     83   TargetOptions&        targets()       { return m_Targets; }
     84 
     85   const BitcodeOption&  bitcode() const { return m_Bitcode; }
     86   BitcodeOption&        bitcode()       { return m_Bitcode; }
     87 
     88   const AttributeOption& attribute() const { return m_Attribute; }
     89   AttributeOption&       attribute()       { return m_Attribute; }
     90 
     91   CodeGenType codeGenType() const { return m_CodeGenType; }
     92 
     93   void setCodeGenType(CodeGenType pType) { m_CodeGenType = pType; }
     94 
     95   CodePosition codePosition() const { return m_CodePosition; }
     96   void setCodePosition(CodePosition pPosition) { m_CodePosition = pPosition; }
     97 
     98   bool isCodeIndep()   const { return (Independent == m_CodePosition); }
     99   bool isCodeDynamic() const { return (DynamicDependent == m_CodePosition); }
    100   bool isCodeStatic()  const { return (StaticDependent == m_CodePosition); }
    101 
    102   static const char* version();
    103 
    104 private:
    105   // -----  General Options  ----- //
    106   GeneralOptions m_Options;
    107   ScriptOptions m_Scripts;
    108   TargetOptions m_Targets;
    109   BitcodeOption m_Bitcode;
    110   AttributeOption m_Attribute;
    111 
    112   CodeGenType m_CodeGenType;
    113   CodePosition m_CodePosition;
    114 };
    115 
    116 } // namespace of mcld
    117 
    118 #endif
    119 
    120