1533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines//===- OutputFormatOptions.cpp --------------------------------------------===// 2533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines// 3533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines// The MCLinker Project 4533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines// 5533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines// This file is distributed under the University of Illinois Open Source 6533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines// License. See LICENSE.TXT for details. 7533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines// 8533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines//===----------------------------------------------------------------------===// 9533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines#include <mcld/OutputFormatOptions.h> 10533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines#include <mcld/Module.h> 11533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines#include <mcld/Support/MsgHandling.h> 12533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 13533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesnamespace { 14533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 15533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesllvm::cl::opt<mcld::sys::fs::Path, 16533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines false, 17533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::parser<mcld::sys::fs::Path> > ArgOutputFilename("o", 18533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::desc("Output filename"), 19533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::value_desc("filename")); 20533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 21533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesllvm::cl::alias AliasOutputFilename("output", 22533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::desc("alias for -o"), 23533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::aliasopt(ArgOutputFilename)); 24533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 25533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesllvm::cl::opt<mcld::LinkerConfig::CodeGenType> ArgFileType("filetype", 26533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::init(mcld::LinkerConfig::Exec), 27533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::desc("Choose a file type\n" 28533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines "(not all types are supported by all targets):"), 29533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::values( 30533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines clEnumValN(mcld::LinkerConfig::Object, "obj", 31533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines "Emit a relocatable object ('.o') file"), 32533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines clEnumValN(mcld::LinkerConfig::DynObj, "dso", 33533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines "Emit an dynamic shared object ('.so') file"), 34533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines clEnumValN(mcld::LinkerConfig::Exec, "exe", 35533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines "Emit an executable ('.exe') file"), 36533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines clEnumValN(mcld::LinkerConfig::Binary, "bin", 37533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines "Emit a binary file"), 38533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines clEnumValN(mcld::LinkerConfig::External, "null", 39533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines "Emit nothing for performance testing"), 40533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines clEnumValEnd)); 41533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 42533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesllvm::cl::opt<mcld::LinkerConfig::CodeGenType> ArgOFormat("oformat", 43533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::value_desc("Format"), 44533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::desc("set output format"), 45533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::init(mcld::LinkerConfig::Unknown), 46533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::values( 47533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines clEnumValN(mcld::LinkerConfig::Binary, "binary", 48533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines "generate binary machine code."), 49533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines clEnumValEnd)); 50533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 51533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesllvm::cl::opt<bool> ArgShared("shared", 52533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::ZeroOrMore, 53533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::desc("Create a shared library."), 54533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::init(false)); 55533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 56533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesllvm::cl::alias ArgSharedAlias("Bshareable", 57533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::desc("alias for -shared"), 58533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::aliasopt(ArgShared)); 59533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 60533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesllvm::cl::opt<bool> ArgPIE("pie", 61533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::desc("Emit a position-independent executable file"), 62533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::init(false)); 63533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 64533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesllvm::cl::opt<bool> ArgRelocatable("relocatable", 65533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::desc("Generate relocatable output"), 66533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::init(false)); 67533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 68533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesllvm::cl::alias ArgRelocatableAlias("r", 69533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::desc("alias for --relocatable"), 70533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::aliasopt(ArgRelocatable)); 71533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 72533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesllvm::cl::opt<mcld::Input::Type> ArgFormat("b", 73533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::value_desc("Format"), 74533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::desc("set input format"), 75533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::init(mcld::Input::Unknown), 76533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::values( 77533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines clEnumValN(mcld::Input::Binary, "binary", 78533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines "read in binary machine code."), 79533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines clEnumValEnd)); 80533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 81533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesllvm::cl::alias ArgFormatAlias("format", 82533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::desc("alias for -b"), 83533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::aliasopt(ArgFormat)); 84533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 85533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesllvm::cl::opt<bool> ArgStripDebug("strip-debug", 86533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::desc("Omit debugger symbol information from the output file."), 87533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::init(false)); 88533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 89533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesllvm::cl::alias ArgStripDebugAlias("S", 90533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::desc("alias for --strip-debug"), 91533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::aliasopt(ArgStripDebug)); 92533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 93533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesllvm::cl::opt<bool> ArgStripAll("strip-all", 94533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::desc("Omit all symbol information from the output file."), 95533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::init(false)); 96533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 97533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesllvm::cl::alias ArgStripAllAlias("s", 98533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::desc("alias for --strip-all"), 99533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::aliasopt(ArgStripAll)); 100533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 101533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesllvm::cl::opt<bool> ArgDiscardAll("discard-all", 102533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::desc("Delete all local symbols."), 103533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::init(false)); 104533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 105533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesllvm::cl::alias ArgDiscardAllAlias("x", 106533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::desc("alias for --discard-all"), 107533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::aliasopt(ArgDiscardAll)); 108533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 109533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesllvm::cl::opt<bool> ArgDiscardLocals("discard-locals", 110533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::desc("Delete all temporary local symbols."), 111533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::init(false)); 112533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 113533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesllvm::cl::alias ArgDiscardLocalsAlias("X", 114533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::desc("alias for --discard-locals"), 115533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::aliasopt(ArgDiscardLocals)); 116533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 117533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesllvm::cl::opt<bool> ArgEhFrameHdr("eh-frame-hdr", 118533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::ZeroOrMore, 119533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::desc("Request creation of \".eh_frame_hdr\" section and\n" 120533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines "ELF \"PT_GNU_EH_FRAME\" segment header."), 121533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::init(false)); 122533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 123533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesllvm::cl::opt<bool> ArgNMagic("nmagic", 124533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::desc("Do not page align data"), 125533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::init(false)); 126533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 127533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesllvm::cl::alias ArgNMagicAlias("n", 128533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::desc("alias for --nmagic"), 129533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::aliasopt(ArgNMagic)); 130533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 131533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesllvm::cl::opt<bool> ArgOMagic("omagic", 132533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::desc("Do not page align data, do not make text readonly"), 133533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::init(false)); 134533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 135533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesllvm::cl::alias ArgOMagicAlias("N", 136533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::desc("alias for --omagic"), 137533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::aliasopt(ArgOMagic)); 138533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 139533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesllvm::cl::opt<mcld::GeneralOptions::HashStyle> ArgHashStyle("hash-style", 140533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::init(mcld::GeneralOptions::SystemV), 141533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::desc("Set the type of linker's hash table(s)."), 142533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::values( 143533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines clEnumValN(mcld::GeneralOptions::SystemV, "sysv", 144533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines "classic ELF .hash section"), 145533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines clEnumValN(mcld::GeneralOptions::GNU, "gnu", 146533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines "new style GNU .gnu.hash section"), 147533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines clEnumValN(mcld::GeneralOptions::Both, "both", 148533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines "both the classic ELF and new style GNU hash tables"), 149533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines clEnumValEnd)); 150533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 151533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesllvm::cl::opt<bool> ArgNoWarnMismatch("no-warn-mismatch", 152533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::desc("Allow linking together mismatched input files."), 153533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::init(false)); 154533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 155533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines// Not supported yet { 156533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesllvm::cl::opt<bool> ArgExportDynamic("export-dynamic", 157533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::desc("Export all dynamic symbols"), 158533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::init(false)); 159533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 160533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesllvm::cl::alias ArgExportDynamicAlias("E", 161533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::desc("alias for --export-dynamic"), 162533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::aliasopt(ArgExportDynamic)); 163533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 164533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesllvm::cl::opt<std::string> ArgBuildID("build-id", 165533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::desc("Request creation of \".note.gnu.build-id\" ELF note section."), 166533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::value_desc("style"), 167533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::ValueOptional); 168533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 169533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesllvm::cl::list<std::string> ArgExcludeLIBS("exclude-libs", 170533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::CommaSeparated, 171533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::desc("Exclude libraries from automatic export"), 172533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines llvm::cl::value_desc("lib1,lib2,...")); 173533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 174533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines// } Not supported yet 175533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 176533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines} // anonymous namespace 177533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 178533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesusing namespace mcld; 179533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 180533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines//===----------------------------------------------------------------------===// 181533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines// OutputFormatOptions 182533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines//===----------------------------------------------------------------------===// 183533eae20118036f425f27bf0536ef0ccbb090b65Stephen HinesOutputFormatOptions::OutputFormatOptions() 184533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines : m_OutputFilename(ArgOutputFilename), 185533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines m_FileType(ArgFileType), 186533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines m_OFormat(ArgOFormat), 187533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines m_Shared(ArgShared), 188533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines m_PIE(ArgPIE), 189533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines m_Relocatable(ArgRelocatable), 190533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines m_Format(ArgFormat), 191533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines m_StripDebug(ArgStripDebug), 192533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines m_StripAll(ArgStripAll), 193533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines m_DiscardAll(ArgDiscardAll), 194533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines m_DiscardLocals(ArgDiscardLocals), 195533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines m_EhFrameHdr(ArgEhFrameHdr), 196533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines m_NMagic(ArgNMagic), 197533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines m_OMagic(ArgOMagic), 198533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines m_HashStyle(ArgHashStyle), 199533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines m_ExportDynamic(ArgExportDynamic), 200533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines m_BuildID(ArgBuildID), 201533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines m_ExcludeLIBS(ArgExcludeLIBS), 202533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines m_NoWarnMismatch(ArgNoWarnMismatch) { 203533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines} 204533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 205533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesbool OutputFormatOptions::parse(mcld::Module& pModule, LinkerConfig& pConfig) 206533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines{ 207533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines if (!parseOutput(pModule, pConfig)) { 208533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines mcld::unreachable(mcld::diag::unrecognized_output_file) << pModule.name(); 209533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines return false; 210533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines } 211533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 212533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines if (mcld::Input::Binary == m_Format) 213533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines pConfig.options().setBinaryInput(); 214533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 215533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines pConfig.options().setStripDebug(m_StripDebug || m_StripAll); 216533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines if (m_StripAll) 217533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines pConfig.options().setStripSymbols(mcld::GeneralOptions::StripAllSymbols); 218533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines else if (m_DiscardAll) 219533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines pConfig.options().setStripSymbols(mcld::GeneralOptions::StripLocals); 220533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines else if (m_DiscardLocals) 221533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines pConfig.options().setStripSymbols(mcld::GeneralOptions::StripTemporaries); 222533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines else 223533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines pConfig.options().setStripSymbols(mcld::GeneralOptions::KeepAllSymbols); 224533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 225533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines pConfig.options().setEhFrameHdr(m_EhFrameHdr); 226533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines pConfig.options().setPIE(m_PIE); 227533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines pConfig.options().setNMagic(m_NMagic); 228533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines pConfig.options().setOMagic(m_OMagic); 229533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines pConfig.options().setHashStyle(m_HashStyle); 230533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines pConfig.options().setExportDynamic(m_ExportDynamic); 231a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines 232a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines // --exclude-libs 233a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines llvm::cl::list<std::string>::iterator exclude, 234a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines excludeEnd = m_ExcludeLIBS.end(); 235a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines for (exclude = m_ExcludeLIBS.begin(); exclude != excludeEnd; ++exclude) { 236a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines pConfig.options().excludeLIBS().insert(*exclude); 237a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines } 238a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines 239533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines if (m_NoWarnMismatch) 240533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines pConfig.options().setWarnMismatch(false); 241533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines else 242533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines pConfig.options().setWarnMismatch(true); 243533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines // build-id 244533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines // exclude-libs 245533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 246533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines return true; 247533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines} 248533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 249533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines/// configure the output filename 250533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesbool OutputFormatOptions::parseOutput(Module& pModule, LinkerConfig& pConfig) 251533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines{ 252533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines if (true == m_Shared || true == m_PIE) { 253533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines // -shared or -pie 254533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines m_FileType = mcld::LinkerConfig::DynObj; 255533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines } 256533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines else if (true == m_Relocatable) { 257533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines // partial linking 258533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines m_FileType = mcld::LinkerConfig::Object; 259533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines } 260533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines else if (mcld::LinkerConfig::Binary == m_OFormat) { 261533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines // binary output 262533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines m_FileType = mcld::LinkerConfig::Binary; 263533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines } 264533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 265533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines pConfig.setCodeGenType(m_FileType); 266533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 267533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines std::string output_filename(m_OutputFilename.native()); 268533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 269533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines if (m_OutputFilename.empty()) { 270533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 271533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines if (llvm::Triple::Win32 == pConfig.targets().triple().getOS()) { 272533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines output_filename.assign("_out"); 273533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines switch (m_FileType) { 274533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines case mcld::LinkerConfig::Object: { 275533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines output_filename += ".obj"; 276533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines break; 277533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines } 278533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines case mcld::LinkerConfig::DynObj: { 279533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines output_filename += ".dll"; 280533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines break; 281533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines } 282533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines case mcld::LinkerConfig::Exec: { 283533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines output_filename += ".exe"; 284533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines break; 285533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines } 286533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines case mcld::LinkerConfig::External: 287533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines break; 288533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines default: { 289533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines return false; 290533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines break; 291533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines } 292533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines } // switch 293533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines } 294533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines else { 295533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines if (mcld::LinkerConfig::Object == m_FileType || 296533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines mcld::LinkerConfig::DynObj == m_FileType || 297533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines mcld::LinkerConfig::Exec == m_FileType || 298533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines mcld::LinkerConfig::External == m_FileType) { 299533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines output_filename.assign("a.out"); 300533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines } 301533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines else { 302533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines return false; 303533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines } 304533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines } 305533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines } // end of if empty m_OutputFilename 306533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines 307533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines pModule.setName(output_filename); 308533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines return true; 309533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines} 310