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