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