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//===----------------------------------------------------------------------===// 987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#ifndef MCLD_LINKERCONFIG_H 1087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#define MCLD_LINKERCONFIG_H 1122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 1222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <llvm/ADT/Triple.h> 1322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 1422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/GeneralOptions.h> 15d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#include <mcld/TargetOptions.h> 1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/BitcodeOption.h> 1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/AttributeOption.h> 1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Support/Path.h> 1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <string> 2122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 2222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld { 2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/** \class LinkerConfig 2522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao * \brief LinkerConfig is composed of argumments of MCLinker. 2622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao * options() - the general options 2722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao * bitcode() - the bitcode being linked 2822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao * attribute() - the attribute options 2922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao */ 3022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LinkerConfig 3122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 3222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaopublic: 3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao enum CodeGenType { 3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao Unknown, 3522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao Object, 3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao DynObj, 3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao Exec, 38d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao External, 39d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao Binary 4022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao }; 4122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 426f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines /** \enum CodePosition 436f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines * CodePosition indicates the ability of the generated output to be 446f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines * loaded at different addresses. If the output can be loaded at different 456f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines * addresses, we say the output is position independent. Shared libraries 466f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines * and position-independent executable programs (PIE) are in this category. 476f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines * ::Independent indicates the output is position independent. 486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines * If a executable program can not be loaded at arbitrary addresses, but it 496f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines * can call outside functions, we say the program is dynamic dependent on 506f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines * the address to be loaded. ::DynamicDependent indicates the output is not 516f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines * only a executable program, but also dynamic dependent. In general, 526f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines * executable programs are dynamic dependent. 536f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines * If a executable program can not be loaded at different addresses, and 546f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines * only call inner functions, then we say the program is static dependent on 556f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines * its loaded address. ::StaticDependent is used to indicate this kind of 566f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines * output. 576f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines */ 586f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines enum CodePosition { 596f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines Independent, ///< Position Independent 606f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines DynamicDependent, ///< Can call outside libraries 61f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines StaticDependent, ///< Can not call outside libraries 62f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines Unset ///< Undetermine code position mode 636f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines }; 646f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaopublic: 6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao LinkerConfig(); 6722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao explicit LinkerConfig(const std::string &pTripleString); 6922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ~LinkerConfig(); 7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const GeneralOptions& options() const { return m_Options; } 7322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao GeneralOptions& options() { return m_Options; } 7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 75d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao const TargetOptions& targets() const { return m_Targets; } 76d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao TargetOptions& targets() { return m_Targets; } 77d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const BitcodeOption& bitcode() const { return m_Bitcode; } 7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao BitcodeOption& bitcode() { return m_Bitcode; } 8022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 8122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const AttributeOption& attribute() const { return m_Attribute; } 8222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao AttributeOption& attribute() { return m_Attribute; } 8322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 8422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao CodeGenType codeGenType() const { return m_CodeGenType; } 8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 8622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao void setCodeGenType(CodeGenType pType) { m_CodeGenType = pType; } 8722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 886f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines CodePosition codePosition() const { return m_CodePosition; } 896f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines void setCodePosition(CodePosition pPosition) { m_CodePosition = pPosition; } 906f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 916f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines bool isCodeIndep() const { return (Independent == m_CodePosition); } 926f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines bool isCodeDynamic() const { return (DynamicDependent == m_CodePosition); } 936f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines bool isCodeStatic() const { return (StaticDependent == m_CodePosition); } 946f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 9522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao static const char* version(); 9622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 9722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoprivate: 9822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // ----- General Options ----- // 9922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao GeneralOptions m_Options; 100d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao TargetOptions m_Targets; 10122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao BitcodeOption m_Bitcode; 10222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao AttributeOption m_Attribute; 10322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 10422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao CodeGenType m_CodeGenType; 1056f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines CodePosition m_CodePosition; 10622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}; 10722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 10822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} // namespace of mcld 10922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 11022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#endif 11122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 112