//===- MCLDOptions.h ------------------------------------------------------===//
//
// The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef MCLD_OPTIONS_H
#define MCLD_OPTIONS_H
#ifdef ENABLE_UNITTEST
#include <gtest.h>
#endif
#include <string>
#include <llvm/ADT/StringRef.h>
#include <mcld/ADT/StringEntry.h>
#include <mcld/ADT/HashTable.h>
#include <mcld/Support/RealPath.h>
#include <mcld/Support/FileSystem.h>
#include <mcld/MC/SearchDirs.h>
#include <mcld/MC/ZOption.h>
namespace mcld
{
class Input;
/** \class ScriptOptions
*
*/
class ScriptOptions
{
public:
typedef HashTable<StringEntry<llvm::StringRef>,
StringHash<ELF>,
StringEntryFactory<llvm::StringRef> > SymbolRenameMap;
public:
ScriptOptions();
~ScriptOptions();
SymbolRenameMap& renameMap()
{ return m_SymbolRenames; }
const SymbolRenameMap& renameMap() const
{ return m_SymbolRenames; }
private:
SymbolRenameMap m_SymbolRenames;
};
/** \class GeneralOptions
* \brief GeneralOptions collects the options that not be one of the
* - input files
* - attribute of input files
* - script options
*/
class GeneralOptions
{
public:
GeneralOptions();
~GeneralOptions();
/// default link script
bool hasDefaultLDScript() const;
const char* defaultLDScript() const;
void setDefaultLDScript(const std::string& pFilename);
/// sysroot
const sys::fs::Path& sysroot() const
{ return m_Sysroot; }
void setSysroot(const sys::fs::Path &pPath);
/// search directory
SearchDirs& directories()
{ return m_SearchDirs; }
const SearchDirs& directories() const
{ return m_SearchDirs; }
/// trace
void setTrace(bool pEnableTrace = true)
{ m_bTrace = pEnableTrace; }
bool trace() const
{ return m_bTrace; }
void setBsymbolic(bool pBsymbolic = false)
{ 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 = false)
{ 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 setAllowShlibUndefined(bool pEnabled = true)
{ m_bAllowShlibUndefined = pEnabled; }
bool isAllowShlibUndefined() const
{ return m_bAllowShlibUndefined; }
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 = false)
{ m_bNoUndefined = pEnable; }
void setMulDefs(bool pEnable = false)
{ 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; }
private:
enum status {
YES,
NO,
Unknown
};
private:
Input* m_pDefaultBitcode;
std::string m_DefaultLDScript;
sys::fs::RealPath m_Sysroot;
SearchDirs m_SearchDirs;
std::string m_Entry;
std::string m_Dyld;
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_bAllowShlibUndefined : 1; // --[no-]allow-shlib-undefined and
bool m_bCreateEhFrameHdr : 1; // --eh-frame-hdr
};
} // namespace of mcld
#endif