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