15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- LLVMTargetMachine.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 10cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <mcld/CodeGen/SectLinker.h> 11cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <mcld/CodeGen/SectLinkerOption.h> 12cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <mcld/MC/MCLDFile.h> 13cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <mcld/Support/RealPath.h> 14cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <mcld/Support/TargetRegistry.h> 15cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <mcld/Target/TargetMachine.h> 16cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <mcld/Target/TargetLDBackend.h> 175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/ADT/OwningPtr.h> 195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Analysis/Passes.h> 205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Analysis/Verifier.h> 215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Assembly/PrintModulePass.h> 225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/CodeGen/AsmPrinter.h> 235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/CodeGen/MachineFunctionAnalysis.h> 245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/CodeGen/MachineModuleInfo.h> 255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/CodeGen/GCStrategy.h> 265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/CodeGen/Passes.h> 275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/MC/MCAsmInfo.h> 285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/MC/MCStreamer.h> 295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/MC/MCInstrInfo.h> 305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/MC/MCSubtargetInfo.h> 315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/MC/MCObjectStreamer.h> 325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/MC/MCAssembler.h> 335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/MC/MCObjectWriter.h> 345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/MC/MCContext.h> 355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/PassManager.h> 365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Support/CommandLine.h> 375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Support/Debug.h> 385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Support/TargetRegistry.h> 395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Support/FormattedStream.h> 405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Support/ToolOutputFile.h> 415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Target/TargetData.h> 425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Target/TargetInstrInfo.h> 435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Target/TargetLowering.h> 445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Target/TargetOptions.h> 455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Target/TargetSubtargetInfo.h> 465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Target/TargetLoweringObjectFile.h> 475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Target/TargetRegisterInfo.h> 485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Transforms/Scalar.h> 495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <string> 515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace mcld; 535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace llvm; 545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===// 565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// Arguments 57cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//===----------------------------------------------------------------------===// 585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// Enable or disable FastISel. Both options are needed, because 595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// FastISel is enabled by default with -fast, and we wish to be 605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// able to enable or disable fast-isel independently from -O0. 615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::opt<cl::boolOrDefault> 635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoArgEnableFastISelOption("lfast-isel", cl::Hidden, 645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao cl::desc("Enable the \"fast\" instruction selector")); 655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::opt<bool> 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoArgShowMCEncoding("lshow-mc-encoding", 685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao cl::Hidden, 695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao cl::desc("Show encoding in .s output")); 705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::opt<bool> 725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoArgShowMCInst("lshow-mc-inst", 735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao cl::Hidden, 745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao cl::desc("Show instruction structure in .s output")); 755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic cl::opt<cl::boolOrDefault> 775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoArgAsmVerbose("fverbose-asm", 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao cl::desc("Put extra commentary information in the \ 795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao generated assembly code to make it more readable."), 805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao cl::init(cl::BOU_UNSET)); 815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic bool getVerboseAsm() { 835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao switch (ArgAsmVerbose) { 845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao default: 855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao case cl::BOU_UNSET: return TargetMachine::getAsmVerbosityDefault(); 865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao case cl::BOU_TRUE: return true; 875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao case cl::BOU_FALSE: return false; 885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===---------------------------------------------------------------------===// 935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// LLVMTargetMachine 94cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//===----------------------------------------------------------------------===// 955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaomcld::LLVMTargetMachine::LLVMTargetMachine(llvm::TargetMachine &pTM, 965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const mcld::Target& pTarget, 975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const std::string& pTriple ) 985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao : m_TM(pTM), m_pTarget(&pTarget), m_Triple(pTriple) { 995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaomcld::LLVMTargetMachine::~LLVMTargetMachine() { 1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_pTarget = 0; 1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoconst mcld::Target& mcld::LLVMTargetMachine::getTarget() const 1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return *m_pTarget; 1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// Turn exception handling constructs into something the code generators can 1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// handle. 1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic void addPassesToHandleExceptions(llvm::TargetMachine *TM, 1135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao PassManagerBase &PM) { 1145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao switch (TM->getMCAsmInfo()->getExceptionHandlingType()) { 1155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao case llvm::ExceptionHandling::SjLj: 1165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // SjLj piggy-backs on dwarf for this bit. The cleanups done apply to both 1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // Dwarf EH prepare needs to be run after SjLj prepare. Otherwise, 1185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // catch info can get misplaced when a selector ends up more than one block 1195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // removed from the parent invoke(s). This could happen when a landing 1205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // pad is shared by multiple invokes and is also a target of a normal 1215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // edge from elsewhere. 1225dd372680727e9930c9b17ab14c27e9e99ef590aShih-wei Liao PM.add(createSjLjEHPreparePass(TM->getTargetLowering())); 1235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // FALLTHROUGH 1245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao case llvm::ExceptionHandling::DwarfCFI: 1255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao case llvm::ExceptionHandling::ARM: 1265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao case llvm::ExceptionHandling::Win64: 1275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao PM.add(createDwarfEHPass(TM)); 1285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao break; 1295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao case llvm::ExceptionHandling::None: 1305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao PM.add(createLowerInvokePass(TM->getTargetLowering())); 1315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // The lower invoke pass may create unreachable code. Remove it. 1335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao PM.add(createUnreachableBlockEliminationPass()); 1345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao break; 1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostatic llvm::MCContext *addPassesToGenerateCode(llvm::LLVMTargetMachine *TM, 1405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao PassManagerBase &PM, 1415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool DisableVerify) 1425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // Targets may override createPassConfig to provide a target-specific sublass. 1445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao TargetPassConfig *PassConfig = TM->createPassConfig(PM); 1455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // Set PassConfig options provided by TargetMachine. 1475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao PassConfig->setDisableVerify(DisableVerify); 1485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao PM.add(PassConfig); 1505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao PassConfig->addIRPasses(); 1525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao addPassesToHandleExceptions(TM, PM); 1545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao PassConfig->addISelPrepare(); 1565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // Install a MachineModuleInfo class, which is an immutable pass that holds 1585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // all the per-module stuff we're generating, including MCContext. 1595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MachineModuleInfo *MMI = 1605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao new MachineModuleInfo(*TM->getMCAsmInfo(), *TM->getRegisterInfo(), 1615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao &TM->getTargetLowering()->getObjFileLowering()); 1625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao PM.add(MMI); 1635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MCContext *Context = &MMI->getContext(); // Return the MCContext by-ref. 1645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // Set up a MachineFunction for the rest of CodeGen to work on. 1665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao PM.add(new MachineFunctionAnalysis(*TM)); 1675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // Enable FastISel with -fast, but allow that to be overridden. 1695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (ArgEnableFastISelOption == cl::BOU_TRUE || 1705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao (TM->getOptLevel() == CodeGenOpt::None && 1715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ArgEnableFastISelOption != cl::BOU_FALSE)) 1725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao TM->setFastISel(true); 1735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // Ask the target for an isel. 1755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (PassConfig->addInstSelector()) 1765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return NULL; 1775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao PassConfig->addMachinePasses(); 1795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao PassConfig->setInitialized(); 1815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return Context; 1835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool mcld::LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &pPM, 1875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao formatted_raw_ostream &Out, 1885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const std::string& pOutputFilename, 1895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao mcld::CodeGenFileType pFileType, 1905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao CodeGenOpt::Level pOptLvl, 1915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao SectLinkerOption *pLinkerOpt, 1925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool pDisableVerify) 1935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao llvm::MCContext* Context = 1965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao addPassesToGenerateCode(static_cast<llvm::LLVMTargetMachine*>(&m_TM), 1975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao pPM, pDisableVerify); 1985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (!Context) 1995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return true; 2005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao switch(pFileType) { 2025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao default: 2035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao case mcld::CGFT_NULLFile: 2045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao assert(0 && "fatal: file type is not set!"); 2055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao break; 2065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao case CGFT_ASMFile: { 2075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao assert(Context != 0 && "Failed to get MCContext"); 2085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (getTM().hasMCSaveTempLabels()) 2105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Context->setAllowTemporaryLabels(false); 2115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (addCompilerPasses(pPM, 2135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Out, 2145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao pOutputFilename, 2155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Context)) 2165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return true; 2175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao pPM.add(createGCInfoDeleter()); // not in addPassesToMC 2195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao break; 2205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 2215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao case CGFT_OBJFile: { 2225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao assert(Context != 0 && "Failed to get MCContext"); 2235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (getTM().hasMCSaveTempLabels()) 2255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Context->setAllowTemporaryLabels(false); 2265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (addAssemblerPasses(pPM, 2275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Out, 2285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao pOutputFilename, 2295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Context)) 2305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return true; 2315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao pPM.add(createGCInfoDeleter()); // not in addPassesToMC 2335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao break; 2345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 2355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao case CGFT_EXEFile: { 2365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (pLinkerOpt == NULL) 2375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return true; 2385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (addLinkerPasses(pPM, 2405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao pLinkerOpt, 2415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao pOutputFilename, 2425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MCLDFile::Exec, 2435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Context)) 2445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return true; 2455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao break; 2465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 2475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao case CGFT_DSOFile: { 2485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (pLinkerOpt == NULL) 2495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return true; 2505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (addLinkerPasses(pPM, 2525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao pLinkerOpt, 2535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao pOutputFilename, 2545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MCLDFile::DynObj, 2555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Context)) 2565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return true; 2575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao break; 2585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 2595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } // switch 2605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return false; 2615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 2625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool mcld::LLVMTargetMachine::addCompilerPasses(PassManagerBase &pPM, 2645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao formatted_raw_ostream &Out, 2655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const std::string& pOutputFilename, 2665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao llvm::MCContext *&Context) 2675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 2685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const MCAsmInfo &MAI = *getTM().getMCAsmInfo(); 269cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao const MCInstrInfo &MII = *getTM().getInstrInfo(); 270cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao const MCRegisterInfo &MRI = *getTM().getRegisterInfo(); 2715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const MCSubtargetInfo &STI = getTM().getSubtarget<MCSubtargetInfo>(); 2725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MCInstPrinter *InstPrinter = 2745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao getTarget().get()->createMCInstPrinter(MAI.getAssemblerDialect(), MAI, 275cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao MII, 2765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Context->getRegisterInfo(), STI); 2775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MCCodeEmitter* MCE = 0; 2795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MCAsmBackend *MAB = 0; 2805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (ArgShowMCEncoding) { 281cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao MCE = getTarget().get()->createMCCodeEmitter(MII, MRI, STI, *Context); 2825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MAB = getTarget().get()->createMCAsmBackend(m_Triple); 2835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 2845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // now, we have MCCodeEmitter and MCAsmBackend, we can create AsmStreamer. 2875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao OwningPtr<MCStreamer> AsmStreamer( 2885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao getTarget().get()->createAsmStreamer(*Context, Out, 2895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao getVerboseAsm(), 2905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao getTM().hasMCUseLoc(), 2915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao getTM().hasMCUseCFI(), 2925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao getTM().hasMCUseDwarfDirectory(), 2935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao InstPrinter, 2945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MCE, MAB, 2955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ArgShowMCInst)); 2965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao llvm::MachineFunctionPass* funcPass = 2985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao getTarget().get()->createAsmPrinter(getTM(), *AsmStreamer.get()); 2995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 3005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (funcPass == 0) 3015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return true; 3025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // If successful, createAsmPrinter took ownership of AsmStreamer 3035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao AsmStreamer.take(); 3045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao pPM.add(funcPass); 3055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return false; 3065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 3075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 3085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool mcld::LLVMTargetMachine::addAssemblerPasses(PassManagerBase &pPM, 3095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao formatted_raw_ostream &Out, 3105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const std::string& pOutputFilename, 3115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao llvm::MCContext *&Context) 3125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 3135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // MCCodeEmitter 314cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao const MCInstrInfo &MII = *getTM().getInstrInfo(); 315cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao const MCRegisterInfo &MRI = *getTM().getRegisterInfo(); 3165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const MCSubtargetInfo &STI = getTM().getSubtarget<MCSubtargetInfo>(); 317cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao MCCodeEmitter* MCE = 318cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao getTarget().get()->createMCCodeEmitter(MII, MRI, STI, *Context); 3195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 3205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // MCAsmBackend 3215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MCAsmBackend* MAB = getTarget().get()->createMCAsmBackend(m_Triple); 3225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (MCE == 0 || MAB == 0) 3235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return true; 3245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 3255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // now, we have MCCodeEmitter and MCAsmBackend, we can create AsmStreamer. 3265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao OwningPtr<MCStreamer> AsmStreamer(getTarget().get()->createMCObjectStreamer( 3275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_Triple, 3285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *Context, 3295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *MAB, 3305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Out, 3315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MCE, 3325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao getTM().hasMCRelaxAll(), 3335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao getTM().hasMCNoExecStack())); 3345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao AsmStreamer.get()->InitSections(); 3355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MachineFunctionPass *funcPass = getTarget().get()->createAsmPrinter(getTM(), 3365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *AsmStreamer.get()); 3375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (funcPass == 0) 3385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return true; 3395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // If successful, createAsmPrinter took ownership of AsmStreamer 3405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao AsmStreamer.take(); 3415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao pPM.add(funcPass); 3425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return false; 3435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 3445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 3455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool mcld::LLVMTargetMachine::addLinkerPasses(PassManagerBase &pPM, 3465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao SectLinkerOption *pLinkerOpt, 3475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const std::string &pOutputFilename, 3485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MCLDFile::Type pOutputLinkType, 3495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao llvm::MCContext *&Context) 3505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 351affc150dc44fab1911775a49636d0ce85333b634Zonr Chang TargetLDBackend* ldBackend = getTarget().createLDBackend(m_Triple); 3525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (0 == ldBackend) 3535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return true; 3545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 3555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // set up output's SOName 3565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (pOutputLinkType == MCLDFile::DynObj && 3575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao pLinkerOpt->info().output().name().empty()) { 3585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // if the output is a shared object, and the option -soname was not 3595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // enable, set soname as the output file name. 3605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao pLinkerOpt->info().output().setSOName(pOutputFilename); 3615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 3625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 3635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao pLinkerOpt->info().output().setPath(sys::fs::RealPath(pOutputFilename)); 3645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao pLinkerOpt->info().output().setType(pOutputLinkType); 3655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 3665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MachineFunctionPass* funcPass = getTarget().createSectLinker(m_Triple, 3675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *pLinkerOpt, 3685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *ldBackend); 3695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (0 == funcPass) 3705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return true; 3715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 3725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao pPM.add(funcPass); 3735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return false; 3745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 375affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 376