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