15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- llvm-mcld.cpp ------------------------------------------------------===//
25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//                     The MCLinker Project
45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source
65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details.
75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
95460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/Target/TargetMachine.h>
105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/Support/TargetSelect.h>
115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/Support/TargetRegistry.h>
125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/Support/CommandLine.h>
135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/Support/DerivedPositionDependentOptions.h>
145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/Support/RealPath.h>
155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/CodeGen/SectLinkerOption.h>
165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Module.h>
185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/PassManager.h>
195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Pass.h>
205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/ADT/Triple.h>
215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/LLVMContext.h>
225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/MC/SubtargetFeature.h>
235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Support/CommandLine.h>
245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Support/Debug.h>
255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Support/FormattedStream.h>
265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Support/Host.h>
275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Support/IRReader.h>
285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Support/ManagedStatic.h>
295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Support/TargetRegistry.h>
305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Support/TargetSelect.h>
315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Support/ToolOutputFile.h>
325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Target/TargetData.h>
335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Target/TargetMachine.h>
345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace llvm;
365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifdef ENABLE_UNITTEST
385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <gtest.h>
395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::opt<bool>
415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoUnitTest("unittest",  cl::desc("do unit test") );
425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoint unit_test( int argc, char* argv[] )
445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  testing::InitGoogleTest( &argc, argv );
465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return RUN_ALL_TESTS();
475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// General options for llc.  Other pass-specific options are specified
535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// within the corresponding llc passes, and target-specific options
545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// and back-end code generation options are specified with the target machine.
555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::opt<std::string>
575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoInputFilename("dB",
585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao              cl::desc("set default bitcode"),
595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao              cl::value_desc("bitcode"));
605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::opt<std::string>
625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoOutputFilename("o",
635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao               cl::desc("Output filename"),
645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao               cl::value_desc("filename"));
655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// Determine optimization level.
675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::opt<char>
685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoOptLevel("O",
695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao         cl::desc("Optimization level. [-O0, -O1, -O2, or -O3] "
705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                  "(default = '-O2')"),
715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao         cl::Prefix,
725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao         cl::ZeroOrMore,
735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao         cl::init(' '));
745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::opt<std::string>
765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoTargetTriple("mtriple", cl::desc("Override target triple for module"));
775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::opt<std::string>
795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoMArch("march", cl::desc("Architecture to generate code for (see --version)"));
805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::opt<std::string>
825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoMCPU("mcpu",
835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::desc("Target a specific cpu type (-mcpu=help for details)"),
845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::value_desc("cpu-name"),
855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::init(""));
865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::list<std::string>
885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoMAttrs("mattr",
895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::CommaSeparated,
905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::desc("Target specific attributes (-mattr=help for details)"),
915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::value_desc("a1,+a2,-a3,..."));
925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::opt<Reloc::Model>
945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoRelocModel("relocation-model",
955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao             cl::desc("Choose relocation model"),
965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao             cl::init(Reloc::Default),
975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao             cl::values(
985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao            clEnumValN(Reloc::Default, "default",
995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                       "Target default relocation model"),
1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao            clEnumValN(Reloc::Static, "static",
1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                       "Non-relocatable code"),
1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao            clEnumValN(Reloc::PIC_, "pic",
1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                       "Fully relocatable, position independent code"),
1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao            clEnumValN(Reloc::DynamicNoPIC, "dynamic-no-pic",
1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                       "Relocatable external references, non-relocatable code"),
1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao            clEnumValEnd));
1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::opt<llvm::CodeModel::Model>
1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoCMModel("code-model",
1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        cl::desc("Choose code model"),
1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        cl::init(CodeModel::Default),
1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        cl::values(clEnumValN(CodeModel::Default, "default",
1135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                              "Target default code model"),
1145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                   clEnumValN(CodeModel::Small, "small",
1155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                              "Small code model"),
1165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                   clEnumValN(CodeModel::Kernel, "kernel",
1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                              "Kernel code model"),
1185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                   clEnumValN(CodeModel::Medium, "medium",
1195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                              "Medium code model"),
1205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                   clEnumValN(CodeModel::Large, "large",
1215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                              "Large code model"),
1225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                   clEnumValEnd));
1235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaocl::opt<mcld::CodeGenFileType>
1255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoFileType("filetype", cl::init(mcld::CGFT_EXEFile),
1265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::desc("Choose a file type (not all types are supported by all targets):"),
1275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::values(
1285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao       clEnumValN(mcld::CGFT_ASMFile, "asm",
1295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                  "Emit an assembly ('.s') file"),
1305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao       clEnumValN(mcld::CGFT_OBJFile, "obj",
1315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                  "Emit a relocatable object ('.o') file"),
1325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao       clEnumValN(mcld::CGFT_ARCFile, "arc",
1335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                  "Emit an archive ('.a') file"),
1345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao       clEnumValN(mcld::CGFT_DSOFile, "dso",
1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                  "Emit an dynamic shared object ('.so') file"),
1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao       clEnumValN(mcld::CGFT_EXEFile, "exe",
1375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                  "Emit a executable ('.exe') file"),
1385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao       clEnumValN(mcld::CGFT_NULLFile, "null",
1395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                  "Emit nothing, for performance testing"),
1405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao       clEnumValEnd));
1415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaocl::opt<bool> NoVerify("disable-verify", cl::Hidden,
1435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                       cl::desc("Do not verify input module"));
1445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::opt<bool>
1465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoEnableFPMAD("enable-fp-mad",
1475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::desc("Enable less precise MAD instructions to be generated"),
1485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::init(false));
1495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::opt<bool>
1515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoPrintCode("print-machineinstrs",
1525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::desc("Print generated machine code"),
1535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::init(false));
1545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::opt<bool>
1565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoDisableFPElim("disable-fp-elim",
1575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::desc("Disable frame pointer elimination optimization"),
1585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::init(false));
1595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::opt<bool>
1615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoDisableFPElimNonLeaf("disable-non-leaf-fp-elim",
1625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::desc("Disable frame pointer elimination optimization for non-leaf funcs"),
1635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::init(false));
1645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::opt<bool>
1665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoDisableExcessPrecision("disable-excess-fp-precision",
1675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::desc("Disable optimizations that may increase FP precision"),
1685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::init(false));
1695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::opt<bool>
1715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoEnableUnsafeFPMath("enable-unsafe-fp-math",
1725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::desc("Enable optimizations that may decrease FP precision"),
1735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::init(false));
1745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::opt<bool>
1765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoEnableNoInfsFPMath("enable-no-infs-fp-math",
1775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::desc("Enable FP math optimizations that assume no +-Infs"),
1785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::init(false));
1795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::opt<bool>
1815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoEnableNoNaNsFPMath("enable-no-nans-fp-math",
1825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::desc("Enable FP math optimizations that assume no NaNs"),
1835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::init(false));
1845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::opt<bool>
1865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoEnableHonorSignDependentRoundingFPMath("enable-sign-dependent-rounding-fp-math",
1875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::Hidden,
1885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::desc("Force codegen to assume rounding mode can change dynamically"),
1895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::init(false));
1905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::opt<bool>
1925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoGenerateSoftFloatCalls("soft-float",
1935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::desc("Generate software floating point library calls"),
1945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::init(false));
1955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::opt<llvm::FloatABI::ABIType>
1975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoFloatABIForCalls("float-abi",
1985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::desc("Choose float ABI type"),
1995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::init(FloatABI::Default),
2005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::values(
2015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    clEnumValN(FloatABI::Default, "default",
2025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao               "Target default float ABI type"),
2035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    clEnumValN(FloatABI::Soft, "soft",
2045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao               "Soft float ABI (implied by -soft-float)"),
2055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    clEnumValN(FloatABI::Hard, "hard",
2065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao               "Hard float ABI (uses FP registers)"),
2075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    clEnumValEnd));
2085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::opt<bool>
2105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoDontPlaceZerosInBSS("nozero-initialized-in-bss",
2115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::desc("Don't place zero-initialized symbols into bss section"),
2125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::init(false));
2135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::opt<bool>
2155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoEnableJITExceptionHandling("jit-enable-eh",
2165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::desc("Emit exception handling information"),
2175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::init(false));
2185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// In debug builds, make this default to true.
2205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifdef NDEBUG
2215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#define EMIT_DEBUG false
2225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#else
2235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#define EMIT_DEBUG true
2245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
2255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::opt<bool>
2265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoEmitJitDebugInfo("jit-emit-debug",
2275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::desc("Emit debug information to debugger"),
2285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::init(EMIT_DEBUG));
2295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#undef EMIT_DEBUG
2305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::opt<bool>
2325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoEmitJitDebugInfoToDisk("jit-emit-debug-to-disk",
2335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::Hidden,
2345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::desc("Emit debug info objfiles to disk"),
2355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::init(false));
2365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::opt<bool>
2385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoEnableGuaranteedTailCallOpt("tailcallopt",
2395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::desc("Turn fastcc calls into tail calls by (potentially) changing ABI."),
2405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::init(false));
2415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::opt<unsigned>
2435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoOverrideStackAlignment("stack-alignment",
2445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::desc("Override default stack alignment"),
2455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::init(0));
2465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::opt<bool>
2485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoEnableRealignStack("realign-stack",
2495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::desc("Realign stack if needed"),
2505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::init(true));
2515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::opt<bool>
2535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoDisableSwitchTables(cl::Hidden, "disable-jump-tables",
2545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::desc("Do not generate jump tables."),
2555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::init(false));
2565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::opt<std::string>
2585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoTrapFuncName("trap-func", cl::Hidden,
2595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::desc("Emit a call to trap function rather than a trap instruction"),
2605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::init(""));
2615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::opt<bool>
2635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoSegmentedStacks("segmented-stacks",
2645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::desc("Use segmented stacks if possible."),
2655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::init(false));
2665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
2685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// Command Line Options
2695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// There are four kinds of command line options:
2705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//   1. input, (may be a file, such as -m and /tmp/XXXX.o.)
2715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//   2. attribute of inputs, (describing the attributes of inputs, such as
2725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//      --as-needed and --whole-archive. usually be positional.)
2735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//   3. scripting options, (represent a subset of link scripting language, such
2745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//      as --defsym.)
2755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//   4. and general options. (the rest of options)
2765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
2775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// General Options
2785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::opt<mcld::sys::fs::Path, false, llvm::cl::parser<mcld::sys::fs::Path> >
2795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoArgSysRoot("sysroot",
2805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao           cl::desc("Use directory as the location of the sysroot, overriding the configure-time default."),
2815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao           cl::value_desc("directory"),
2825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao           cl::ValueRequired);
2835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::list<mcld::MCLDDirectory, bool, llvm::cl::parser<mcld::MCLDDirectory> >
2855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoArgSearchDirList("L",
2865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                 cl::ZeroOrMore,
2875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                 cl::desc("Add path searchdir to the list of paths that ld will search for archive libraries and ld control scripts."),
2885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                 cl::value_desc("searchdir"),
2895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                 cl::Prefix);
2905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::alias
2925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoArgSearchDirListAlias("library-path",
2935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                      cl::desc("alias for -L"),
2945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                      cl::aliasopt(ArgSearchDirList));
2955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::opt<bool>
2975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoArgTrace("t",
2985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao         cl::desc("Print the names of the input files as ld processes them."));
2995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::alias
3015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoArgTraceAlias("trace",
3025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao              cl::desc("alias for -t"),
3035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao              cl::aliasopt(ArgTrace));
3045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::opt<bool>
3065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoArgVerbose("V",
3075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao          cl::desc("Display the version number for ld and list the linker emulations supported."));
3085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::alias
3105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoArgVerboseAlias("verbose",
3115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                cl::desc("alias for -V"),
3125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                cl::aliasopt(ArgVerbose));
3135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::opt<std::string>
3155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoArgEntry("e",
3165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao         cl::desc("Use entry as the explicit symbol for beginning execution of your program."),
3175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao         cl::value_desc("entry"),
3185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao         cl::ValueRequired);
3195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::alias
3215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoArgEntryAlias("entry",
3225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao              cl::desc("alias for -e"),
3235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao              cl::aliasopt(ArgEntry));
3245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::opt<bool>
3265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoArgBsymbolic("Bsymbolic",
3275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao             cl::desc("Bind references within the shared library."),
3285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao             cl::init(false));
3295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::opt<std::string>
3315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoArgSOName("soname",
3325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao          cl::desc("Set internal name of shared library"),
3335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao          cl::value_desc("name"));
3345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
3365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// Inputs
3375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::list<mcld::sys::fs::Path>
3385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoArgInputObjectFiles(cl::Positional,
3395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                    cl::desc("[input object files]"),
3405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                    cl::ZeroOrMore);
3415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::list<std::string>
3435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoArgNameSpecList("l",
3445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao            cl::ZeroOrMore,
3455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao            cl::desc("Add the archive or object file specified by namespec to the list of files to link."),
3465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao            cl::value_desc("namespec"),
3475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao            cl::Prefix);
3485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::alias
3505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoArgNameSpecListAlias("library",
3515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                 cl::desc("alias for -l"),
3525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                 cl::aliasopt(ArgNameSpecList));
3535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::list<bool>
3555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoArgStartGroupList("start-group",
3565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                  cl::ValueDisallowed,
3575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                  cl::desc("start to record a group of archives"));
3585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::alias
3605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoArgStartGroupListAlias("(",
3615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                       cl::desc("alias for --start-group"),
3625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                       cl::aliasopt(ArgStartGroupList));
3635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::list<bool>
3655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoArgEndGroupList("end-group",
3665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                cl::ValueDisallowed,
3675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                cl::desc("stop recording a group of archives"));
3685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::alias
3705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoArgEndGroupListAlias(")",
3715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                     cl::desc("alias for --end-group"),
3725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                     cl::aliasopt(ArgEndGroupList));
3735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
3755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// Attributes of Inputs
3765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::list<bool>
3775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoArgWholeArchiveList("whole-archive",
3785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                    cl::ValueDisallowed,
3795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                    cl::desc("For each archive mentioned on the command line after the --whole-archive option, include all object files in the archive."));
3805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::list<bool>
3825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoArgNoWholeArchiveList("no-whole-archive",
3835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                    cl::ValueDisallowed,
3845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                    cl::desc("Turn off the effect of the --whole-archive option for subsequent archive files."));
3855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::list<bool>
3875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoArgAsNeededList("as-needed",
3885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                cl::ValueDisallowed,
3895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                cl::desc("This option affects ELF DT_NEEDED tags for dynamic libraries mentioned on the command line after the --as-needed option."));
3905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::list<bool>
3925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoArgNoAsNeededList("no-as-needed",
3935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                cl::ValueDisallowed,
3945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                cl::desc("Turn off the effect of the --as-needed option for subsequent dynamic libraries"));
3955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::list<bool>
3975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoArgAddNeededList("add-needed",
3985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                cl::ValueDisallowed,
3995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                cl::desc("--add-needed causes DT_NEEDED tags are always emitted for those libraries from DT_NEEDED tags. This is the default behavior."));
4005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::list<bool>
4025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoArgNoAddNeededList("no-add-needed",
4035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                cl::ValueDisallowed,
4045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                cl::desc("--no-add-needed causes DT_NEEDED tags will never be emitted for those libraries from DT_NEEDED tags"));
4055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::list<bool>
4075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoArgBDynamicList("Bdynamic",
4085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                cl::ValueDisallowed,
4095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                cl::desc("Link against dynamic library"));
4105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::alias
4125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoArgBDynamicListAlias1("dy",
4135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                     cl::desc("alias for --Bdynamic"),
4145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                     cl::aliasopt(ArgBDynamicList));
4155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::alias
4175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoArgBDynamicListAlias2("call_shared",
4185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                     cl::desc("alias for --Bdynamic"),
4195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                     cl::aliasopt(ArgBDynamicList));
4205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::list<bool>
4225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoArgBStaticList("Bstatic",
4235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                cl::ValueDisallowed,
4245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                cl::desc("Link against static library"));
4255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::alias
4275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoArgBStaticListAlias1("dn",
4285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                     cl::desc("alias for --Bstatic"),
4295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                     cl::aliasopt(ArgBStaticList));
4305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::alias
4325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoArgBStaticListAlias2("static",
4335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                     cl::desc("alias for --Bstatic"),
4345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                     cl::aliasopt(ArgBStaticList));
4355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::alias
4375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoArgBStaticListAlias3("non_shared",
4385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                     cl::desc("alias for --Bstatic"),
4395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                     cl::aliasopt(ArgBStaticList));
4405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
4425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// Scripting Options
4435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
4465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// non-member functions
4475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// GetFileNameRoot - Helper function to get the basename of a filename.
4495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic inline void
4505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoGetFileNameRoot(const std::string &pInputFilename, std::string& pFileNameRoot)
4515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
4525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  std::string outputFilename;
4535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /* *** */
4545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const std::string& IFN = pInputFilename;
4555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  int Len = IFN.length();
4565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if ((Len > 2) &&
4575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      IFN[Len-3] == '.' &&
4585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      ((IFN[Len-2] == 'b' && IFN[Len-1] == 'c') ||
4595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao       (IFN[Len-2] == 'l' && IFN[Len-1] == 'l')))
4605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    pFileNameRoot = std::string(IFN.begin(), IFN.end()-3); // s/.bc/.s/
4615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  else
4625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    pFileNameRoot = std::string(IFN);
4635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
4645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic tool_output_file *GetOutputStream(const char* pTargetName,
4665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                          Triple::OSType pOSType,
4675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                          mcld::CodeGenFileType pFileType,
4685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                          const std::string& pInputFilename,
4695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                          std::string& pOutputFilename)
4705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
4715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // If we don't yet have an output filename, make one.
4725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (pOutputFilename.empty()) {
4735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    if (pInputFilename == "-")
4745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      pOutputFilename = "-";
4755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    else {
4765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      GetFileNameRoot(pInputFilename, pOutputFilename);
4775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
4785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      switch (pFileType) {
4795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      case mcld::CGFT_ASMFile:
4805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        if (pTargetName[0] == 'c') {
4815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao          if (pTargetName[1] == 0)
4825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao            pOutputFilename += ".cbe.c";
4835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao          else if (pTargetName[1] == 'p' && pTargetName[2] == 'p')
4845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao            pOutputFilename += ".cpp";
4855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao          else
4865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao            pOutputFilename += ".s";
4875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        }
4885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        else
4895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao          pOutputFilename += ".s";
4905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        break;
4915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      case mcld::CGFT_OBJFile:
4925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        if (pOSType == Triple::Win32)
4935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao          pOutputFilename += ".obj";
4945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        else
4955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao          pOutputFilename += ".o";
4965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        break;
4975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      case mcld::CGFT_DSOFile:
4985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        if (pOSType == Triple::Win32)
4995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao         pOutputFilename += ".dll";
5005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        else
5015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao         pOutputFilename += ".so";
5025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        break;
5035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      case mcld::CGFT_ARCFile:
5045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao         pOutputFilename += ".a";
5055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        break;
5065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      case mcld::CGFT_EXEFile:
5075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      case mcld::CGFT_NULLFile:
5085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        // do nothing
5095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        break;
5105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      default:
5115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        assert(0 && "Unknown file type");
5125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      }
5135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    }
5145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
5155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
5165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // Decide if we need "binary" output.
5175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  bool Binary = false;
5185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  switch (pFileType) {
5195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  default: assert(0 && "Unknown file type");
5205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  case mcld::CGFT_ASMFile:
5215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    break;
5225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  case mcld::CGFT_ARCFile:
5235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  case mcld::CGFT_OBJFile:
5245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  case mcld::CGFT_DSOFile:
5255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  case mcld::CGFT_EXEFile:
5265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  case mcld::CGFT_NULLFile:
5275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    Binary = true;
5285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    break;
5295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
5305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
5315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // Open the file.
5325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  std::string error;
5335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  unsigned OpenFlags = 0;
5345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (Binary) OpenFlags |= raw_fd_ostream::F_Binary;
5355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  tool_output_file *FDOut = new tool_output_file(pOutputFilename.c_str(), error,
5365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                                 OpenFlags);
5375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (!error.empty()) {
5385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    errs() << error << '\n';
5395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    delete FDOut;
5405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return 0;
5415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
5425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
5435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return FDOut;
5445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
5455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
5465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic bool ProcessLinkerInputsFromCommand(mcld::SectLinkerOption &pOption) {
5475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // -----  Set up General Options  ----- //
5485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // set up soname
5495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  pOption.info().output().setSOName(ArgSOName);
5505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
5515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // set up sysroot
5525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (!ArgSysRoot.empty()) {
5535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    if (exists(ArgSysRoot) && is_directory(ArgSysRoot))
5545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      pOption.info().options().setSysroot(ArgSysRoot);
5555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
5565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
5575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // add all search directories
5585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::list<mcld::MCLDDirectory>::iterator sd;
5595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::list<mcld::MCLDDirectory>::iterator sdEnd = ArgSearchDirList.end();
5605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  for (sd=ArgSearchDirList.begin(); sd!=sdEnd; ++sd) {
5615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    if (sd->isInSysroot())
5625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      sd->setSysroot(pOption.info().options().sysroot());
5635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    if (exists(sd->path()) && is_directory(sd->path())) {
5645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      pOption.info().options().directories().add(*sd);
5655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    }
5665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    else {
5675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      // FIXME: need a warning function
5685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      errs() << "WARNING: can not open search directory `-L"
5695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao             << sd->name()
5705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao             << "'.\n";
5715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    }
5725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
5735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
5745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  pOption.info().options().setTrace(ArgTrace);
5755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  pOption.info().options().setVerbose(ArgVerbose);
5765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  pOption.info().options().setEntry(ArgEntry);
5775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  pOption.info().options().setBsymbolic(ArgBsymbolic);
5785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
5795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // -----  Set up Inputs  ----- //
5805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // add all start-group
5815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::list<bool>::iterator sg;
5825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::list<bool>::iterator sgEnd = ArgStartGroupList.end();
5835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  for (sg=ArgStartGroupList.begin(); sg!=sgEnd; ++sg) {
5845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    // calculate position
5855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    pOption.appendOption(new mcld::StartGroupOption(
5865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                    ArgStartGroupList.getPosition(sg-ArgStartGroupList.begin())));
5875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
5885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
5895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // add all end-group
5905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::list<bool>::iterator eg;
5915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::list<bool>::iterator egEnd = ArgEndGroupList.end();
5925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  for (eg=ArgEndGroupList.begin(); eg!=egEnd; ++eg) {
5935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    // calculate position
5945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    pOption.appendOption(new mcld::EndGroupOption(
5955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                    ArgEndGroupList.getPosition(eg-ArgEndGroupList.begin())));
5965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
5975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
5985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // add all namespecs
5995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::list<std::string>::iterator ns;
6005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::list<std::string>::iterator nsEnd = ArgNameSpecList.end();
6015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  for (ns=ArgNameSpecList.begin(); ns!=nsEnd; ++ns) {
6025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    // calculate position
6035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    pOption.appendOption(new mcld::NamespecOption(
6045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                    ArgNameSpecList.getPosition(ns-ArgNameSpecList.begin()),
6055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                    *ns));
6065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
6075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
6085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // add all object files
6095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::list<mcld::sys::fs::Path>::iterator obj;
6105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::list<mcld::sys::fs::Path>::iterator objEnd = ArgInputObjectFiles.end();
6115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  for (obj=ArgInputObjectFiles.begin(); obj!=objEnd; ++obj) {
6125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    // calculate position
6135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    pOption.appendOption(new mcld::InputFileOption(
6145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                    ArgInputObjectFiles.getPosition(obj-ArgInputObjectFiles.begin()),
6155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                    *obj));
6165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
6175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
6185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // -----  Set up Attributes of Inputs  ----- //
6195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // --whole-archive
6205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::list<bool>::iterator attr = ArgWholeArchiveList.begin();
6215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::list<bool>::iterator attrEnd = ArgWholeArchiveList.end();
6225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  for (; attr!=attrEnd; ++attr) {
6235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    pOption.appendOption(new mcld::WholeArchiveOption(
6245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                    ArgWholeArchiveList.getPosition(attr-ArgWholeArchiveList.begin())));
6255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
6265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
6275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // --no-whole-archive
6285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  attr = ArgNoWholeArchiveList.begin();
6295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  attrEnd = ArgNoWholeArchiveList.end();
6305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  for (; attr!=attrEnd; ++attr) {
6315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    pOption.appendOption(new mcld::NoWholeArchiveOption(
6325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                    ArgNoWholeArchiveList.getPosition(attr-ArgNoWholeArchiveList.begin())));
6335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
6345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
6355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // --as-needed
6365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  attr = ArgAsNeededList.begin();
6375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  attrEnd = ArgAsNeededList.end();
6385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  while(attr != attrEnd) {
6395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    pOption.appendOption(new mcld::AsNeededOption(
6405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                    ArgAsNeededList.getPosition(attr-ArgAsNeededList.begin())));
6415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    ++attr;
6425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
6435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
6445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // --no-as-needed
6455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  attr = ArgNoAsNeededList.begin();
6465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  attrEnd = ArgNoAsNeededList.end();
6475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  while(attr != attrEnd) {
6485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    pOption.appendOption(new mcld::NoAsNeededOption(
6495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                    ArgNoAsNeededList.getPosition(attr-ArgNoAsNeededList.begin())));
6505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    ++attr;
6515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
6525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
6535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // --add-needed
6545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  attr = ArgAddNeededList.begin();
6555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  attrEnd = ArgAddNeededList.end();
6565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  while(attr != attrEnd) {
6575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    pOption.appendOption(new mcld::AddNeededOption(
6585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                    ArgAddNeededList.getPosition(attr-ArgAddNeededList.begin())));
6595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    ++attr;
6605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
6615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
6625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // --no-add-needed
6635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  attr = ArgNoAddNeededList.begin();
6645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  attrEnd = ArgNoAddNeededList.end();
6655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  while(attr != attrEnd) {
6665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    pOption.appendOption(new mcld::NoAddNeededOption(
6675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                    ArgNoAddNeededList.getPosition(attr-ArgNoAddNeededList.begin())));
6685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    ++attr;
6695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
6705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
6715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // -Bdynamic
6725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  attr = ArgBDynamicList.begin();
6735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  attrEnd = ArgBDynamicList.end();
6745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  while(attr != attrEnd) {
6755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    pOption.appendOption(new mcld::BDynamicOption(
6765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                    ArgBDynamicList.getPosition(attr-ArgBDynamicList.begin())));
6775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
6785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
6795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // -Bstatic
6805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  attr = ArgBStaticList.begin();
6815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  attrEnd = ArgBStaticList.end();
6825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  while(attr != attrEnd) {
6835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    pOption.appendOption(new mcld::BStaticOption(
6845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                    ArgBStaticList.getPosition(attr-ArgBStaticList.begin())));
6855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    ++attr;
6865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
6875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
6885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // -----  Set up Scripting Options  ----- //
6895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
6905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return false;
6915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
6925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
6935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoint main( int argc, char* argv[] )
6945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
6955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
6965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  LLVMContext &Context = getGlobalContext();
6975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  llvm_shutdown_obj Y;  // Call llvm_shutdown() on exit.
6985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // Initialize targets first, so that --version shows registered targets.
6995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  InitializeAllTargets();
7005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  InitializeAllAsmPrinters();
7015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  InitializeAllAsmParsers();
7025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  InitializeAllTargetMCs();
7035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  mcld::InitializeAllTargets();
7045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  mcld::InitializeAllLinkers();
7055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  cl::ParseCommandLineOptions(argc, argv, "llvm MCLinker\n");
7065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
7075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifdef ENABLE_UNITTEST
7085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (UnitTest) {
7095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return unit_test( argc, argv );
7105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
7115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
7125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
7135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // Load the module to be compiled...
7145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  std::auto_ptr<Module> M;
7155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
7165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (InputFilename.empty() && (FileType != mcld::CGFT_DSOFile)) {
7175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    // Read from stdin
7185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    InputFilename = "-";
7195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
7205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
7215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (!InputFilename.empty()) {
7225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    SMDiagnostic Err;
7235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    M.reset(ParseIRFile(InputFilename, Err, Context));
7245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
7255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    if (M.get() == 0) {
7265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      Err.print(argv[0], errs());
7275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      errs() << "** Failed to to the given bitcode/llvm asm file '"
7285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao             << InputFilename << "'. **\n";
7295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      return 1;
7305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    }
7315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  } else {
7325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    // If here, output must be dynamic shared object (mcld::CGFT_DSOFile).
7335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
7345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    // Create an empty Module
7355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    M.reset(new Module("Empty Module", Context));
7365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
7375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Module &mod = *M.get();
7385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
7395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // If we are supposed to override the target triple, do so now.
7405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Triple TheTriple;
7415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (!TargetTriple.empty()) {
7425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    TheTriple.setTriple(TargetTriple);
7435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    mod.setTargetTriple(TargetTriple);
7445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
7455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
7465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // User doesn't specify the triple from command.
7475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (TheTriple.getTriple().empty()) {
7485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    // Try to get one from the input Module.
7495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    const std::string &TripleStr = mod.getTargetTriple();
7505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
7515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    if (TripleStr.empty())
7525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      TheTriple.setTriple(sys::getDefaultTargetTriple());
7535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    else
7545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      TheTriple.setTriple(TripleStr);
7555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
7565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
7575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // Allocate target machine.  First, check whether the user has explicitly
7585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // specified an architecture to compile for. If so we have to look it up by
7595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // name, because it might be a backend that has no mapping to a target triple.
7605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const mcld::Target *TheTarget = 0;
7615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (!MArch.empty()) {
7625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    for (mcld::TargetRegistry::iterator it = mcld::TargetRegistry::begin(),
7635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao           ie = mcld::TargetRegistry::end(); it != ie; ++it) {
7645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      if (MArch == (*it)->get()->getName()) {
7655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        TheTarget = *it;
7665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao        break;
7675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      }
7685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    }
7695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
7705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    if (!TheTarget) {
7715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      errs() << argv[0] << ": error: invalid target '" << MArch << "'.\n";
7725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      return 1;
7735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    }
7745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
7755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    // Adjust the triple to match (if known), otherwise stick with the
7765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    // module/host triple.
7775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    Triple::ArchType Type = Triple::getArchTypeForLLVMName(MArch);
7785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    if (Type != Triple::UnknownArch)
7795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      TheTriple.setArch(Type);
7805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
7815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  else {
7825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    std::string Err;
7835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    TheTarget = mcld::TargetRegistry::lookupTarget(TheTriple.getTriple(), Err);
7845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    if (TheTarget == 0) {
7855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      errs() << argv[0] << ": error auto-selecting target for module '"
7865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao             << Err << "'.  Please use the -march option to explicitly "
7875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao             << "pick a target.\n";
7885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      return 1;
7895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    }
7905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
7915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
7925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // Package up features to be passed to target/subtarget
7935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  std::string FeaturesStr;
7945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (MAttrs.size()) {
7955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    SubtargetFeatures Features;
7965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    for (unsigned i = 0; i != MAttrs.size(); ++i)
7975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      Features.AddFeature(MAttrs[i]);
7985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    FeaturesStr = Features.getString();
7995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
8005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
8015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  CodeGenOpt::Level OLvl = CodeGenOpt::Default;
8025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  switch (OptLevel) {
8035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  default:
8045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    errs() << argv[0] << ": invalid optimization level.\n";
8055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return 1;
8065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  case ' ': break;
8075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  case '0': OLvl = CodeGenOpt::None; break;
8085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  case '1': OLvl = CodeGenOpt::Less; break;
8095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  case '2': OLvl = CodeGenOpt::Default; break;
8105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  case '3': OLvl = CodeGenOpt::Aggressive; break;
8115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
8125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
8135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  TargetOptions Options;
8145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Options.LessPreciseFPMADOption = EnableFPMAD;
8155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Options.PrintMachineCode = PrintCode;
8165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Options.NoFramePointerElim = DisableFPElim;
8175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Options.NoFramePointerElimNonLeaf = DisableFPElimNonLeaf;
8185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Options.NoExcessFPPrecision = DisableExcessPrecision;
8195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Options.UnsafeFPMath = EnableUnsafeFPMath;
8205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Options.NoInfsFPMath = EnableNoInfsFPMath;
8215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Options.NoNaNsFPMath = EnableNoNaNsFPMath;
8225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Options.HonorSignDependentRoundingFPMathOption =
8235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      EnableHonorSignDependentRoundingFPMath;
8245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Options.UseSoftFloat = GenerateSoftFloatCalls;
8255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (FloatABIForCalls != FloatABI::Default)
8265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    Options.FloatABIType = FloatABIForCalls;
8275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Options.NoZerosInBSS = DontPlaceZerosInBSS;
8285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Options.JITExceptionHandling = EnableJITExceptionHandling;
8295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Options.JITEmitDebugInfo = EmitJitDebugInfo;
8305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Options.JITEmitDebugInfoToDisk = EmitJitDebugInfoToDisk;
8315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Options.GuaranteedTailCallOpt = EnableGuaranteedTailCallOpt;
8325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Options.StackAlignmentOverride = OverrideStackAlignment;
8335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Options.RealignStack = EnableRealignStack;
8345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Options.DisableJumpTables = DisableSwitchTables;
8355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Options.TrapFuncName = TrapFuncName;
8365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Options.EnableSegmentedStacks = SegmentedStacks;
8375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
8385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  std::auto_ptr<mcld::LLVMTargetMachine> target_machine(
8395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao          TheTarget->createTargetMachine(TheTriple.getTriple(),
8405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                         MCPU, FeaturesStr, Options,
8415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                         RelocModel, CMModel, OLvl));
8425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  assert(target_machine.get() && "Could not allocate target machine!");
8435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  mcld::LLVMTargetMachine &TheTargetMachine = *target_machine.get();
8445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
8455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  TheTargetMachine.getTM().setMCUseLoc(false);
8465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  TheTargetMachine.getTM().setMCUseCFI(false);
8475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
8485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // Figure out where we are going to send the output...
8495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  OwningPtr<tool_output_file>
8505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Out(GetOutputStream(TheTarget->get()->getName(),
8515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                      TheTriple.getOS(),
8525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                      FileType,
8535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                      InputFilename,
8545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                      OutputFilename));
8555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (!Out) return 1;
8565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
8575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // Build up all of the passes that we want to do to the module.
8585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  PassManager PM;
8595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
8605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // Add the target data from the target machine, if it exists, or the module.
8615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (const TargetData *TD = TheTargetMachine.getTM().getTargetData())
8625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    PM.add(new TargetData(*TD));
8635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  else
8645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    PM.add(new TargetData(&mod));
8655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
8665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // Override default to generate verbose assembly.
8675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  TheTargetMachine.getTM().setAsmVerbosityDefault(true);
8685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
8695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // Process the linker input from the command line
8705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  mcld::SectLinkerOption *LinkerOpt =
8715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      new mcld::SectLinkerOption(TheTargetMachine.getLDInfo());
8725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
8735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (ProcessLinkerInputsFromCommand(*LinkerOpt)) {
8745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    errs() << argv[0] << ": failed to process inputs from command line!\n";
8755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return 1;
8765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
8775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
8785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  {
8795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    formatted_raw_ostream FOS(Out->os());
8805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
8815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    // Ask the target to add backend passes as necessary.
8825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    if( TheTargetMachine.addPassesToEmitFile(PM,
8835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                             FOS,
8845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                             OutputFilename,
8855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                             FileType,
8865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                             OLvl,
8875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                             LinkerOpt,
8885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                             NoVerify)) {
8895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      errs() << argv[0] << ": target does not support generation of this"
8905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao             << " file type!\n";
8915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      return 1;
8925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    }
8935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
8945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    // Before executing passes, print the final values of the LLVM options.
8955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    cl::PrintOptionValues();
8965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
8975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    PM.run(mod);
8985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
8995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
9005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // Declare success.
9015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Out->keep();
9025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
9035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // clean up
9045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  delete LinkerOpt;
9055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
9065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return 0;
9075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
9085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
909