//===- GeneralOptions.h ---------------------------------------------------===//
//
// The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef MCLD_GENERAL_OPTIONS_H
#define MCLD_GENERAL_OPTIONS_H
#ifdef ENABLE_UNITTEST
#include <gtest.h>
#endif
#include <string>
#include <vector>
#include <mcld/Support/RealPath.h>
#include <mcld/Support/FileSystem.h>
#include <mcld/MC/ZOption.h>
namespace mcld {
class Input;
/** \class GeneralOptions
* \brief GeneralOptions collects the options that not be one of the
* - input files
* - attribute of input files
*/
class GeneralOptions
{
public:
enum StripSymbolMode {
KeepAllSymbols,
StripTemporaries,
StripLocals,
StripAllSymbols
};
enum HashStyle {
SystemV = 0x1,
GNU = 0x2,
Both = 0x3
};
typedef std::vector<std::string> RpathList;
typedef RpathList::iterator rpath_iterator;
typedef RpathList::const_iterator const_rpath_iterator;
typedef std::vector<std::string> AuxiliaryList;
typedef AuxiliaryList::iterator aux_iterator;
typedef AuxiliaryList::const_iterator const_aux_iterator;
public:
GeneralOptions();
~GeneralOptions();
/// default link script
bool hasDefaultLDScript() const;
const char* defaultLDScript() const;
void setDefaultLDScript(const std::string& pFilename);
/// trace
void setTrace(bool pEnableTrace = true)
{ m_bTrace = pEnableTrace; }
bool trace() const
{ return m_bTrace; }
void setBsymbolic(bool pBsymbolic = true)
{ m_Bsymbolic = pBsymbolic; }
bool Bsymbolic() const
{ return m_Bsymbolic; }
void setPIE(bool pPIE = true)
{ m_bPIE = pPIE; }
bool isPIE() const
{ return m_bPIE; }
void setBgroup(bool pBgroup = true)
{ m_Bgroup = pBgroup; }
bool Bgroup() const
{ return m_Bgroup; }
bool hasEntry() const
{ return !m_Entry.empty(); }
void setEntry(const std::string& pEntry)
{ m_Entry = pEntry; }
const std::string& entry() const
{ return m_Entry; }
void setDyld(const std::string& pDyld)
{ m_Dyld = pDyld; }
const std::string& dyld() const
{ return m_Dyld; }
bool hasDyld() const
{ return !m_Dyld.empty(); }
void setSOName(const std::string& pName);
const std::string& soname() const
{ return m_SOName; }
void setVerbose(int8_t pVerbose = -1)
{ m_Verbose = pVerbose; }
int8_t verbose() const
{ return m_Verbose; }
void setMaxErrorNum(int16_t pNum)
{ m_MaxErrorNum = pNum; }
int16_t maxErrorNum() const
{ return m_MaxErrorNum; }
void setMaxWarnNum(int16_t pNum)
{ m_MaxWarnNum = pNum; }
int16_t maxWarnNum() const
{ return m_MaxWarnNum; }
void setColor(bool pEnabled = true)
{ m_bColor = pEnabled; }
bool color() const
{ return m_bColor; }
void setNoUndefined(bool pEnable = true)
{ m_bNoUndefined = pEnable; }
void setMulDefs(bool pEnable = true)
{ m_bMulDefs = pEnable; }
void setEhFrameHdr(bool pEnable = true)
{ m_bCreateEhFrameHdr = pEnable; }
/// ----- the -z options ----- ///
void addZOption(const mcld::ZOption& pOption);
bool hasCombReloc() const
{ return m_bCombReloc; }
bool isNoUndefined() const
{ return m_bNoUndefined; }
bool hasStackSet() const
{ return (Unknown != m_ExecStack); }
bool hasExecStack() const
{ return (YES == m_ExecStack); }
bool hasInitFirst() const
{ return m_bInitFirst; }
bool hasInterPose() const
{ return m_bInterPose; }
bool hasLoadFltr() const
{ return m_bLoadFltr; }
bool hasMulDefs() const
{ return m_bMulDefs; }
bool hasNoCopyReloc() const
{ return m_bNoCopyReloc; }
bool hasNoDefaultLib() const
{ return m_bNoDefaultLib; }
bool hasNoDelete() const
{ return m_bNoDelete; }
bool hasNoDLOpen() const
{ return m_bNoDLOpen; }
bool hasNoDump() const
{ return m_bNoDump; }
bool hasRelro() const
{ return m_bRelro; }
bool hasNow() const
{ return m_bNow; }
bool hasOrigin() const
{ return m_bOrigin; }
uint64_t commPageSize() const
{ return m_CommPageSize; }
uint64_t maxPageSize() const
{ return m_MaxPageSize; }
bool hasEhFrameHdr() const
{ return m_bCreateEhFrameHdr; }
// -n, --nmagic
void setNMagic(bool pMagic = true)
{ m_bNMagic = pMagic; }
bool nmagic() const
{ return m_bNMagic; }
// -N, --omagic
void setOMagic(bool pMagic = true)
{ m_bOMagic = pMagic; }
bool omagic() const
{ return m_bOMagic; }
// -S, --strip-debug
void setStripDebug(bool pStripDebug = true)
{ m_bStripDebug = pStripDebug; }
bool stripDebug() const
{ return m_bStripDebug; }
// -E, --export-dynamic
void setExportDynamic(bool pExportDynamic = true)
{ m_bExportDynamic = pExportDynamic; }
bool exportDynamic() const
{ return m_bExportDynamic; }
// --warn-shared-textrel
void setWarnSharedTextrel(bool pWarnSharedTextrel = true)
{ m_bWarnSharedTextrel = pWarnSharedTextrel; }
bool warnSharedTextrel() const
{ return m_bWarnSharedTextrel; }
void setBinaryInput(bool pBinaryInput = true)
{ m_bBinaryInput = pBinaryInput; }
bool isBinaryInput() const
{ return m_bBinaryInput; }
void setDefineCommon(bool pEnable = true)
{ m_bDefineCommon = pEnable; }
bool isDefineCommon() const
{ return m_bDefineCommon; }
void setFatalWarnings(bool pEnable = true)
{ m_bFatalWarnings = pEnable; }
bool isFatalWarnings() const
{ return m_bFatalWarnings; }
StripSymbolMode getStripSymbolMode() const
{ return m_StripSymbols; }
void setStripSymbols(StripSymbolMode pMode)
{ m_StripSymbols = pMode; }
void setNewDTags(bool pEnable = true)
{ m_bNewDTags = pEnable; }
bool hasNewDTags() const
{ return m_bNewDTags; }
void setNoStdlib(bool pEnable = true)
{ m_bNoStdlib = pEnable; }
bool nostdlib() const
{ return m_bNoStdlib; }
// -M, --print-map
void setPrintMap(bool pEnable = true)
{ m_bPrintMap = pEnable; }
bool printMap() const
{ return m_bPrintMap; }
// -G, max GP size option
void setGPSize(int gpsize)
{ m_GPSize = gpsize; }
int getGPSize() const
{ return m_GPSize; }
unsigned int getHashStyle() const { return m_HashStyle; }
void setHashStyle(unsigned int pStyle)
{ m_HashStyle = pStyle; }
// ----- link-in rpath ----- //
const RpathList& getRpathList() const { return m_RpathList; }
RpathList& getRpathList() { return m_RpathList; }
const_rpath_iterator rpath_begin() const { return m_RpathList.begin(); }
rpath_iterator rpath_begin() { return m_RpathList.begin(); }
const_rpath_iterator rpath_end () const { return m_RpathList.end(); }
rpath_iterator rpath_end () { return m_RpathList.end(); }
// ----- filter and auxiliary filter ----- //
void setFilter(const std::string& pFilter)
{ m_Filter = pFilter; }
const std::string& filter() const
{ return m_Filter; }
bool hasFilter() const
{ return !m_Filter.empty(); }
const AuxiliaryList& getAuxiliaryList() const { return m_AuxiliaryList; }
AuxiliaryList& getAuxiliaryList() { return m_AuxiliaryList; }
const_aux_iterator aux_begin() const { return m_AuxiliaryList.begin(); }
aux_iterator aux_begin() { return m_AuxiliaryList.begin(); }
const_aux_iterator aux_end () const { return m_AuxiliaryList.end(); }
aux_iterator aux_end () { return m_AuxiliaryList.end(); }
private:
enum status {
YES,
NO,
Unknown
};
private:
Input* m_pDefaultBitcode;
std::string m_DefaultLDScript;
std::string m_Entry;
std::string m_Dyld;
std::string m_SOName;
int8_t m_Verbose; // --verbose[=0,1,2]
uint16_t m_MaxErrorNum; // --error-limit=N
uint16_t m_MaxWarnNum; // --warning-limit=N
status m_ExecStack; // execstack, noexecstack
uint64_t m_CommPageSize; // common-page-size=value
uint64_t m_MaxPageSize; // max-page-size=value
bool m_bCombReloc : 1; // combreloc, nocombreloc
bool m_bNoUndefined : 1; // defs, --no-undefined
bool m_bInitFirst : 1; // initfirst
bool m_bInterPose : 1; // interpose
bool m_bLoadFltr : 1; // loadfltr
bool m_bMulDefs : 1; // muldefs
bool m_bNoCopyReloc : 1; // nocopyreloc
bool m_bNoDefaultLib : 1; // nodefaultlib
bool m_bNoDelete : 1; // nodelete
bool m_bNoDLOpen : 1; // nodlopen
bool m_bNoDump : 1; // nodump
bool m_bRelro : 1; // relro, norelro
bool m_bNow : 1; // lazy, now
bool m_bOrigin : 1; // origin
bool m_bTrace : 1; // --trace
bool m_Bsymbolic : 1; // --Bsymbolic
bool m_Bgroup : 1;
bool m_bPIE : 1;
bool m_bColor : 1; // --color[=true,false,auto]
bool m_bCreateEhFrameHdr : 1; // --eh-frame-hdr
bool m_bNMagic : 1; // -n, --nmagic
bool m_bOMagic : 1; // -N, --omagic
bool m_bStripDebug : 1; // -S, --strip-debug
bool m_bExportDynamic :1; //-E, --export-dynamic
bool m_bWarnSharedTextrel : 1; // --warn-shared-textrel
bool m_bBinaryInput : 1; // -b [input-format], --format=[input-format]
bool m_bDefineCommon : 1; // -d, -dc, -dp
bool m_bFatalWarnings : 1; // --fatal-warnings
bool m_bNewDTags: 1; // --enable-new-dtags
bool m_bNoStdlib: 1; // -nostdlib
bool m_bPrintMap: 1; // --print-map
uint32_t m_GPSize; // -G, --gpsize
StripSymbolMode m_StripSymbols;
RpathList m_RpathList;
unsigned int m_HashStyle;
std::string m_Filter;
AuxiliaryList m_AuxiliaryList;
};
} // namespace of mcld
#endif