diff options
Diffstat (limited to 'lib/CodeGen/LLVMTargetMachine.cpp')
| -rw-r--r-- | lib/CodeGen/LLVMTargetMachine.cpp | 113 | 
1 files changed, 55 insertions, 58 deletions
diff --git a/lib/CodeGen/LLVMTargetMachine.cpp b/lib/CodeGen/LLVMTargetMachine.cpp index ad2c5534a88e..df96b945a8d9 100644 --- a/lib/CodeGen/LLVMTargetMachine.cpp +++ b/lib/CodeGen/LLVMTargetMachine.cpp @@ -12,12 +12,15 @@  //===----------------------------------------------------------------------===//  #include "llvm/Target/TargetMachine.h" -#include "llvm/ADT/OwningPtr.h" -#include "llvm/Assembly/PrintModulePass.h" + +#include "llvm/Analysis/Passes.h"  #include "llvm/CodeGen/AsmPrinter.h" +#include "llvm/CodeGen/JumpInstrTables.h"  #include "llvm/CodeGen/MachineFunctionAnalysis.h"  #include "llvm/CodeGen/MachineModuleInfo.h"  #include "llvm/CodeGen/Passes.h" +#include "llvm/IR/IRPrintingPasses.h" +#include "llvm/IR/Verifier.h"  #include "llvm/MC/MCAsmInfo.h"  #include "llvm/MC/MCContext.h"  #include "llvm/MC/MCInstrInfo.h" @@ -44,33 +47,24 @@ static cl::opt<cl::boolOrDefault>  EnableFastISelOption("fast-isel", cl::Hidden,    cl::desc("Enable the \"fast\" instruction selector")); -static cl::opt<bool> ShowMCEncoding("show-mc-encoding", cl::Hidden, -    cl::desc("Show encoding in .s output")); -static cl::opt<bool> ShowMCInst("show-mc-inst", cl::Hidden, -    cl::desc("Show instruction structure in .s output")); - -static cl::opt<cl::boolOrDefault> -AsmVerbose("asm-verbose", cl::desc("Add comments to directives."), -           cl::init(cl::BOU_UNSET)); - -static bool getVerboseAsm() { -  switch (AsmVerbose) { -  case cl::BOU_UNSET: return TargetMachine::getAsmVerbosityDefault(); -  case cl::BOU_TRUE:  return true; -  case cl::BOU_FALSE: return false; -  } -  llvm_unreachable("Invalid verbose asm state"); -} -  void LLVMTargetMachine::initAsmInfo() { -  AsmInfo = TheTarget.createMCAsmInfo(*getRegisterInfo(), TargetTriple); +  MCAsmInfo *TmpAsmInfo = TheTarget.createMCAsmInfo(*getRegisterInfo(), +                                                    TargetTriple);    // TargetSelect.h moved to a different directory between LLVM 2.9 and 3.0,    // and if the old one gets included then MCAsmInfo will be NULL and    // we'll crash later.    // Provide the user with a useful error message about what's wrong. -  assert(AsmInfo && "MCAsmInfo not initialized. " +  assert(TmpAsmInfo && "MCAsmInfo not initialized. "           "Make sure you include the correct TargetSelect.h"           "and that InitializeAllTargetMCs() is being invoked!"); + +  if (Options.DisableIntegratedAS) +    TmpAsmInfo->setUseIntegratedAssembler(false); + +  if (Options.CompressDebugSections) +    TmpAsmInfo->setCompressDebugSections(true); + +  AsmInfo = TmpAsmInfo;  }  LLVMTargetMachine::LLVMTargetMachine(const Target &T, StringRef Triple, @@ -92,7 +86,12 @@ static MCContext *addPassesToGenerateCode(LLVMTargetMachine *TM,                                            bool DisableVerify,                                            AnalysisID StartAfter,                                            AnalysisID StopAfter) { -  // Targets may override createPassConfig to provide a target-specific sublass. + +  // Add internal analysis passes from the target machine. +  TM->addAnalysisPasses(PM); + +  // Targets may override createPassConfig to provide a target-specific +  // subclass.    TargetPassConfig *PassConfig = TM->createPassConfig(PM);    PassConfig->setStartStopPasses(StartAfter, StopAfter); @@ -127,7 +126,7 @@ static MCContext *addPassesToGenerateCode(LLVMTargetMachine *TM,    // Ask the target for an isel.    if (PassConfig->addInstSelector()) -    return NULL; +    return nullptr;    PassConfig->addMachinePasses(); @@ -142,6 +141,11 @@ bool LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM,                                              bool DisableVerify,                                              AnalysisID StartAfter,                                              AnalysisID StopAfter) { +  // Passes to handle jumptable function annotations. These can't be handled at +  // JIT time, so we don't add them directly to addPassesToGenerateCode. +  PM.add(createJumpInstrTableInfoPass()); +  PM.add(createJumpInstrTablesPass(Options.JTType)); +    // Add common CodeGen passes.    MCContext *Context = addPassesToGenerateCode(this, PM, DisableVerify,                                                 StartAfter, StopAfter); @@ -154,18 +158,18 @@ bool LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM,      // machine-level pass), and whatever other information is needed to      // deserialize the code and resume compilation.  For now, just write the      // LLVM IR. -    PM.add(createPrintModulePass(&Out)); +    PM.add(createPrintModulePass(Out));      return false;    } -  if (hasMCSaveTempLabels()) +  if (Options.MCOptions.MCSaveTempLabels)      Context->setAllowTemporaryLabels(false);    const MCAsmInfo &MAI = *getMCAsmInfo();    const MCRegisterInfo &MRI = *getRegisterInfo();    const MCInstrInfo &MII = *getInstrInfo();    const MCSubtargetInfo &STI = getSubtarget<MCSubtargetInfo>(); -  OwningPtr<MCStreamer> AsmStreamer; +  std::unique_ptr<MCStreamer> AsmStreamer;    switch (FileType) {    case CGFT_AssemblyFile: { @@ -174,20 +178,16 @@ bool LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM,                                        MII, MRI, STI);      // Create a code emitter if asked to show the encoding. -    MCCodeEmitter *MCE = 0; -    if (ShowMCEncoding) +    MCCodeEmitter *MCE = nullptr; +    if (Options.MCOptions.ShowMCEncoding)        MCE = getTarget().createMCCodeEmitter(MII, MRI, STI, *Context);      MCAsmBackend *MAB = getTarget().createMCAsmBackend(MRI, getTargetTriple(),                                                         TargetCPU); -    MCStreamer *S = getTarget().createAsmStreamer(*Context, Out, -                                                  getVerboseAsm(), -                                                  hasMCUseLoc(), -                                                  hasMCUseCFI(), -                                                  hasMCUseDwarfDirectory(), -                                                  InstPrinter, -                                                  MCE, MAB, -                                                  ShowMCInst); +    MCStreamer *S = getTarget().createAsmStreamer( +        *Context, Out, Options.MCOptions.AsmVerbose, +        Options.MCOptions.MCUseDwarfDirectory, InstPrinter, MCE, MAB, +        Options.MCOptions.ShowMCInst);      AsmStreamer.reset(S);      break;    } @@ -198,30 +198,28 @@ bool LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM,                                                           *Context);      MCAsmBackend *MAB = getTarget().createMCAsmBackend(MRI, getTargetTriple(),                                                         TargetCPU); -    if (MCE == 0 || MAB == 0) +    if (!MCE || !MAB)        return true; -    AsmStreamer.reset(getTarget().createMCObjectStreamer(getTargetTriple(), -                                                         *Context, *MAB, Out, -                                                         MCE, hasMCRelaxAll(), -                                                         hasMCNoExecStack())); -    AsmStreamer.get()->setAutoInitSections(true); +    AsmStreamer.reset(getTarget().createMCObjectStreamer( +        getTargetTriple(), *Context, *MAB, Out, MCE, STI, +        Options.MCOptions.MCRelaxAll, Options.MCOptions.MCNoExecStack));      break;    }    case CGFT_Null:      // The Null output is intended for use for performance analysis and testing,      // not real users. -    AsmStreamer.reset(createNullStreamer(*Context)); +    AsmStreamer.reset(getTarget().createNullStreamer(*Context));      break;    }    // Create the AsmPrinter, which takes ownership of AsmStreamer if successful.    FunctionPass *Printer = getTarget().createAsmPrinter(*this, *AsmStreamer); -  if (Printer == 0) +  if (!Printer)      return true;    // If successful, createAsmPrinter took ownership of AsmStreamer. -  AsmStreamer.take(); +  AsmStreamer.release();    PM.add(Printer); @@ -238,7 +236,8 @@ bool LLVMTargetMachine::addPassesToEmitMachineCode(PassManagerBase &PM,                                                     JITCodeEmitter &JCE,                                                     bool DisableVerify) {    // Add common CodeGen passes. -  MCContext *Context = addPassesToGenerateCode(this, PM, DisableVerify, 0, 0); +  MCContext *Context = addPassesToGenerateCode(this, PM, DisableVerify, nullptr, +                                               nullptr);    if (!Context)      return true; @@ -257,11 +256,11 @@ bool LLVMTargetMachine::addPassesToEmitMC(PassManagerBase &PM,                                            raw_ostream &Out,                                            bool DisableVerify) {    // Add common CodeGen passes. -  Ctx = addPassesToGenerateCode(this, PM, DisableVerify, 0, 0); +  Ctx = addPassesToGenerateCode(this, PM, DisableVerify, nullptr, nullptr);    if (!Ctx)      return true; -  if (hasMCSaveTempLabels()) +  if (Options.MCOptions.MCSaveTempLabels)      Ctx->setAllowTemporaryLabels(false);    // Create the code emitter for the target if it exists.  If not, .o file @@ -272,23 +271,21 @@ bool LLVMTargetMachine::addPassesToEmitMC(PassManagerBase &PM,                                                         STI, *Ctx);    MCAsmBackend *MAB = getTarget().createMCAsmBackend(MRI, getTargetTriple(),                                                       TargetCPU); -  if (MCE == 0 || MAB == 0) +  if (!MCE || !MAB)      return true; -  OwningPtr<MCStreamer> AsmStreamer; -  AsmStreamer.reset(getTarget().createMCObjectStreamer(getTargetTriple(), *Ctx, -                                                       *MAB, Out, MCE, -                                                       hasMCRelaxAll(), -                                                       hasMCNoExecStack())); -  AsmStreamer.get()->InitSections(); +  std::unique_ptr<MCStreamer> AsmStreamer; +  AsmStreamer.reset(getTarget().createMCObjectStreamer( +      getTargetTriple(), *Ctx, *MAB, Out, MCE, STI, +      Options.MCOptions.MCRelaxAll, Options.MCOptions.MCNoExecStack));    // Create the AsmPrinter, which takes ownership of AsmStreamer if successful.    FunctionPass *Printer = getTarget().createAsmPrinter(*this, *AsmStreamer); -  if (Printer == 0) +  if (!Printer)      return true;    // If successful, createAsmPrinter took ownership of AsmStreamer. -  AsmStreamer.take(); +  AsmStreamer.release();    PM.add(Printer);  | 
