• 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/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 
options()76   const GeneralOptions& options() const { return m_Options; }
options()77   GeneralOptions&       options()       { return m_Options; }
78 
scripts()79   const ScriptOptions&  scripts() const { return m_Scripts; }
scripts()80   ScriptOptions&        scripts()       { return m_Scripts; }
81 
targets()82   const TargetOptions&  targets() const { return m_Targets; }
targets()83   TargetOptions&        targets()       { return m_Targets; }
84 
bitcode()85   const BitcodeOption&  bitcode() const { return m_Bitcode; }
bitcode()86   BitcodeOption&        bitcode()       { return m_Bitcode; }
87 
attribute()88   const AttributeOption& attribute() const { return m_Attribute; }
attribute()89   AttributeOption&       attribute()       { return m_Attribute; }
90 
codeGenType()91   CodeGenType codeGenType() const { return m_CodeGenType; }
92 
setCodeGenType(CodeGenType pType)93   void setCodeGenType(CodeGenType pType) { m_CodeGenType = pType; }
94 
codePosition()95   CodePosition codePosition() const { return m_CodePosition; }
setCodePosition(CodePosition pPosition)96   void setCodePosition(CodePosition pPosition) { m_CodePosition = pPosition; }
97 
isCodeIndep()98   bool isCodeIndep()   const { return (Independent == m_CodePosition); }
isCodeDynamic()99   bool isCodeDynamic() const { return (DynamicDependent == m_CodePosition); }
isCodeStatic()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