122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===- LinkerConfig.h -----------------------------------------------------===//
222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//
322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//                     The MCLinker Project
422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//
522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// This file is distributed under the University of Illinois Open Source
622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// License. See LICENSE.TXT for details.
722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//
822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#ifndef MCLD_LINKER_CONFIG_H
1022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#define MCLD_LINKER_CONFIG_H
1122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#ifdef ENABLE_UNITTEST
1222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <gtest.h>
1322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#endif
1422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
1522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <llvm/ADT/Triple.h>
1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/GeneralOptions.h>
18d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#include <mcld/TargetOptions.h>
1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/BitcodeOption.h>
2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/AttributeOption.h>
2122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Support/Path.h>
2222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <string>
2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
2522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld {
2622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
2722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/** \class LinkerConfig
2822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *  \brief LinkerConfig is composed of argumments of MCLinker.
2922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *   options()        - the general options
3022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *   bitcode()        - the bitcode being linked
3122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *   attribute()      - the attribute options
3222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao */
3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LinkerConfig
3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
3522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaopublic:
3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  enum CodeGenType {
3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    Unknown,
3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    Object,
3922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    DynObj,
4022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    Exec,
41d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    External,
42d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    Binary
4322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  };
4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
456f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  /** \enum CodePosition
466f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines   *  CodePosition indicates the ability of the generated output to be
476f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines   *  loaded at different addresses. If the output can be loaded at different
486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines   *  addresses, we say the output is position independent. Shared libraries
496f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines   *  and position-independent executable programs (PIE) are in this category.
506f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines   *  ::Independent indicates the output is position independent.
516f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines   *  If a executable program can not be loaded at arbitrary addresses, but it
526f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines   *  can call outside functions, we say the program is dynamic dependent on
536f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines   *  the address to be loaded. ::DynamicDependent indicates the output is not
546f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines   *  only a executable program, but also dynamic dependent. In general,
556f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines   *  executable programs are dynamic dependent.
566f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines   *  If a executable program can not be loaded at different addresses, and
576f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines   *  only call inner functions, then we say the program is static dependent on
586f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines   *  its loaded address. ::StaticDependent is used to indicate this kind of
596f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines   *  output.
606f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines   */
616f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  enum CodePosition {
626f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    Independent,      ///< Position Independent
636f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    DynamicDependent, ///< Can call outside libraries
64f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    StaticDependent,  ///< Can not call outside libraries
65f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    Unset             ///< Undetermine code position mode
666f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  };
676f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaopublic:
6922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  LinkerConfig();
7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  explicit LinkerConfig(const std::string &pTripleString);
7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ~LinkerConfig();
7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const GeneralOptions& options() const { return m_Options; }
7622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  GeneralOptions&       options()       { return m_Options; }
7722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
78d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  const TargetOptions&  targets() const { return m_Targets; }
79d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  TargetOptions&        targets()       { return m_Targets; }
80d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
8122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const BitcodeOption&  bitcode() const { return m_Bitcode; }
8222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  BitcodeOption&        bitcode()       { return m_Bitcode; }
8322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const AttributeOption& attribute() const { return m_Attribute; }
8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  AttributeOption&       attribute()       { return m_Attribute; }
8622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  CodeGenType codeGenType() const { return m_CodeGenType; }
8822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  void setCodeGenType(CodeGenType pType) { m_CodeGenType = pType; }
9022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
916f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  CodePosition codePosition() const { return m_CodePosition; }
926f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  void setCodePosition(CodePosition pPosition) { m_CodePosition = pPosition; }
936f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
946f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  bool isCodeIndep()   const { return (Independent == m_CodePosition); }
956f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  bool isCodeDynamic() const { return (DynamicDependent == m_CodePosition); }
966f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  bool isCodeStatic()  const { return (StaticDependent == m_CodePosition); }
976f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
9822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  static const char* version();
9922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
10022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoprivate:
10122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // -----  General Options  ----- //
10222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  GeneralOptions m_Options;
103d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  TargetOptions m_Targets;
10422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  BitcodeOption m_Bitcode;
10522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  AttributeOption m_Attribute;
10622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
10722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  CodeGenType m_CodeGenType;
1086f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  CodePosition m_CodePosition;
10922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao};
11022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
11122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} // namespace of mcld
11222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
11322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#endif
11422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
115