diff options
Diffstat (limited to 'contrib/llvm/lib/CodeGen/LLVMTargetMachine.cpp')
| -rw-r--r-- | contrib/llvm/lib/CodeGen/LLVMTargetMachine.cpp | 126 | 
1 files changed, 57 insertions, 69 deletions
diff --git a/contrib/llvm/lib/CodeGen/LLVMTargetMachine.cpp b/contrib/llvm/lib/CodeGen/LLVMTargetMachine.cpp index 9018314f2132..610c9f47bac7 100644 --- a/contrib/llvm/lib/CodeGen/LLVMTargetMachine.cpp +++ b/contrib/llvm/lib/CodeGen/LLVMTargetMachine.cpp @@ -12,32 +12,26 @@  //===----------------------------------------------------------------------===//  #include "llvm/Target/TargetMachine.h" -#include "llvm/Analysis/JumpInstrTableInfo.h"  #include "llvm/Analysis/Passes.h"  #include "llvm/CodeGen/AsmPrinter.h" -#include "llvm/CodeGen/ForwardControlFlowIntegrity.h" -#include "llvm/CodeGen/JumpInstrTables.h" +#include "llvm/CodeGen/BasicTTIImpl.h"  #include "llvm/CodeGen/MachineFunctionAnalysis.h"  #include "llvm/CodeGen/MachineModuleInfo.h"  #include "llvm/CodeGen/Passes.h"  #include "llvm/IR/IRPrintingPasses.h" +#include "llvm/IR/LegacyPassManager.h"  #include "llvm/IR/Verifier.h"  #include "llvm/MC/MCAsmInfo.h"  #include "llvm/MC/MCContext.h"  #include "llvm/MC/MCInstrInfo.h"  #include "llvm/MC/MCStreamer.h"  #include "llvm/MC/MCSubtargetInfo.h" -#include "llvm/PassManager.h"  #include "llvm/Support/CommandLine.h"  #include "llvm/Support/ErrorHandling.h"  #include "llvm/Support/FormattedStream.h"  #include "llvm/Support/TargetRegistry.h" -#include "llvm/Target/TargetInstrInfo.h" -#include "llvm/Target/TargetLowering.h"  #include "llvm/Target/TargetLoweringObjectFile.h"  #include "llvm/Target/TargetOptions.h" -#include "llvm/Target/TargetRegisterInfo.h" -#include "llvm/Target/TargetSubtargetInfo.h"  #include "llvm/Transforms/Scalar.h"  using namespace llvm; @@ -49,8 +43,16 @@ EnableFastISelOption("fast-isel", cl::Hidden,    cl::desc("Enable the \"fast\" instruction selector"));  void LLVMTargetMachine::initAsmInfo() { -  MCAsmInfo *TmpAsmInfo = TheTarget.createMCAsmInfo( -      *getSubtargetImpl()->getRegisterInfo(), getTargetTriple()); +  MRI = TheTarget.createMCRegInfo(getTargetTriple()); +  MII = TheTarget.createMCInstrInfo(); +  // FIXME: Having an MCSubtargetInfo on the target machine is a hack due +  // to some backends having subtarget feature dependent module level +  // code generation. This is similar to the hack in the AsmPrinter for +  // module level assembly etc. +  STI = TheTarget.createMCSubtargetInfo(getTargetTriple(), getTargetCPU(), +                                        getTargetFeatureString()); + +  MCAsmInfo *TmpAsmInfo = TheTarget.createMCAsmInfo(*MRI, getTargetTriple());    // 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. @@ -68,17 +70,20 @@ void LLVMTargetMachine::initAsmInfo() {    AsmInfo = TmpAsmInfo;  } -LLVMTargetMachine::LLVMTargetMachine(const Target &T, StringRef Triple, -                                     StringRef CPU, StringRef FS, -                                     TargetOptions Options, +LLVMTargetMachine::LLVMTargetMachine(const Target &T, +                                     StringRef DataLayoutString, +                                     StringRef Triple, StringRef CPU, +                                     StringRef FS, TargetOptions Options,                                       Reloc::Model RM, CodeModel::Model CM,                                       CodeGenOpt::Level OL) -  : TargetMachine(T, Triple, CPU, FS, Options) { +    : TargetMachine(T, DataLayoutString, Triple, CPU, FS, Options) {    CodeGenInfo = T.createMCCodeGenInfo(Triple, RM, CM, OL);  } -void LLVMTargetMachine::addAnalysisPasses(PassManagerBase &PM) { -  PM.add(createBasicTargetTransformInfoPass(this)); +TargetIRAnalysis LLVMTargetMachine::getTargetIRAnalysis() { +  return TargetIRAnalysis([this](Function &F) { +    return TargetTransformInfo(BasicTTIImpl(this, F)); +  });  }  /// addPassesToX helper drives creation and initialization of TargetPassConfig. @@ -89,7 +94,7 @@ static MCContext *addPassesToGenerateCode(LLVMTargetMachine *TM,                                            AnalysisID StopAfter) {    // Add internal analysis passes from the target machine. -  TM->addAnalysisPasses(PM); +  PM.add(createTargetTransformInfoWrapperPass(TM->getTargetIRAnalysis()));    // Targets may override createPassConfig to provide a target-specific    // subclass. @@ -112,8 +117,7 @@ static MCContext *addPassesToGenerateCode(LLVMTargetMachine *TM,    // Install a MachineModuleInfo class, which is an immutable pass that holds    // all the per-module stuff we're generating, including MCContext.    MachineModuleInfo *MMI = new MachineModuleInfo( -      *TM->getMCAsmInfo(), *TM->getSubtargetImpl()->getRegisterInfo(), -      &TM->getSubtargetImpl()->getTargetLowering()->getObjFileLowering()); +      *TM->getMCAsmInfo(), *TM->getMCRegisterInfo(), TM->getObjFileLowering());    PM.add(MMI);    // Set up a MachineFunction for the rest of CodeGen to work on. @@ -136,22 +140,9 @@ static MCContext *addPassesToGenerateCode(LLVMTargetMachine *TM,    return &MMI->getContext();  } -bool LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM, -                                            formatted_raw_ostream &Out, -                                            CodeGenFileType FileType, -                                            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( -      getSubtargetImpl()->getInstrInfo()->getJumpInstrTableEntryBound())); -  PM.add(createJumpInstrTablesPass(Options.JTType)); -  if (Options.FCFI) -    PM.add(createForwardControlFlowIntegrityPass( -        Options.JTType, Options.CFIType, Options.CFIEnforcing, -        Options.getCFIFuncName())); - +bool LLVMTargetMachine::addPassesToEmitFile( +    PassManagerBase &PM, raw_pwrite_stream &Out, CodeGenFileType FileType, +    bool DisableVerify, AnalysisID StartAfter, AnalysisID StopAfter) {    // Add common CodeGen passes.    MCContext *Context = addPassesToGenerateCode(this, PM, DisableVerify,                                                 StartAfter, StopAfter); @@ -171,27 +162,28 @@ bool LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM,    if (Options.MCOptions.MCSaveTempLabels)      Context->setAllowTemporaryLabels(false); -  const MCSubtargetInfo &STI = getSubtarget<MCSubtargetInfo>(); +  const MCSubtargetInfo &STI = *getMCSubtargetInfo();    const MCAsmInfo &MAI = *getMCAsmInfo(); -  const MCRegisterInfo &MRI = *getSubtargetImpl()->getRegisterInfo(); -  const MCInstrInfo &MII = *getSubtargetImpl()->getInstrInfo(); +  const MCRegisterInfo &MRI = *getMCRegisterInfo(); +  const MCInstrInfo &MII = *getMCInstrInfo(); +    std::unique_ptr<MCStreamer> AsmStreamer;    switch (FileType) {    case CGFT_AssemblyFile: { -    MCInstPrinter *InstPrinter = -      getTarget().createMCInstPrinter(MAI.getAssemblerDialect(), MAI, -                                      MII, MRI, STI); +    MCInstPrinter *InstPrinter = getTarget().createMCInstPrinter( +        Triple(getTargetTriple()), MAI.getAssemblerDialect(), MAI, MII, MRI);      // Create a code emitter if asked to show the encoding.      MCCodeEmitter *MCE = nullptr;      if (Options.MCOptions.ShowMCEncoding) -      MCE = getTarget().createMCCodeEmitter(MII, MRI, STI, *Context); +      MCE = getTarget().createMCCodeEmitter(MII, MRI, *Context);      MCAsmBackend *MAB = getTarget().createMCAsmBackend(MRI, getTargetTriple(),                                                         TargetCPU); +    auto FOut = llvm::make_unique<formatted_raw_ostream>(Out);      MCStreamer *S = getTarget().createAsmStreamer( -        *Context, Out, Options.MCOptions.AsmVerbose, +        *Context, std::move(FOut), Options.MCOptions.AsmVerbose,          Options.MCOptions.MCUseDwarfDirectory, InstPrinter, MCE, MAB,          Options.MCOptions.ShowMCInst);      AsmStreamer.reset(S); @@ -200,17 +192,19 @@ bool LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM,    case CGFT_ObjectFile: {      // Create the code emitter for the target if it exists.  If not, .o file      // emission fails. -    MCCodeEmitter *MCE = getTarget().createMCCodeEmitter(MII, MRI, STI, -                                                         *Context); +    MCCodeEmitter *MCE = getTarget().createMCCodeEmitter(MII, MRI, *Context);      MCAsmBackend *MAB = getTarget().createMCAsmBackend(MRI, getTargetTriple(),                                                         TargetCPU);      if (!MCE || !MAB)        return true; -    AsmStreamer.reset( -        getTarget() -            .createMCObjectStreamer(getTargetTriple(), *Context, *MAB, Out, MCE, -                                    STI, Options.MCOptions.MCRelaxAll)); +    // Don't waste memory on names of temp labels. +    Context->setUseNamesOnTempLabels(false); + +    Triple T(getTargetTriple()); +    AsmStreamer.reset(getTarget().createMCObjectStreamer( +        T, *Context, *MAB, Out, MCE, STI, Options.MCOptions.MCRelaxAll, +        /*DWARFMustBeAtTheEnd*/ true));      break;    }    case CGFT_Null: @@ -221,13 +215,11 @@ bool LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM,    }    // Create the AsmPrinter, which takes ownership of AsmStreamer if successful. -  FunctionPass *Printer = getTarget().createAsmPrinter(*this, *AsmStreamer); +  FunctionPass *Printer = +      getTarget().createAsmPrinter(*this, std::move(AsmStreamer));    if (!Printer)      return true; -  // If successful, createAsmPrinter took ownership of AsmStreamer. -  AsmStreamer.release(); -    PM.add(Printer);    return false; @@ -238,9 +230,8 @@ bool LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM,  /// code is not supported. It fills the MCContext Ctx pointer which can be  /// used to build custom MCStreamer.  /// -bool LLVMTargetMachine::addPassesToEmitMC(PassManagerBase &PM, -                                          MCContext *&Ctx, -                                          raw_ostream &Out, +bool LLVMTargetMachine::addPassesToEmitMC(PassManagerBase &PM, MCContext *&Ctx, +                                          raw_pwrite_stream &Out,                                            bool DisableVerify) {    // Add common CodeGen passes.    Ctx = addPassesToGenerateCode(this, PM, DisableVerify, nullptr, nullptr); @@ -252,29 +243,26 @@ bool LLVMTargetMachine::addPassesToEmitMC(PassManagerBase &PM,    // Create the code emitter for the target if it exists.  If not, .o file    // emission fails. -  const MCRegisterInfo &MRI = *getSubtargetImpl()->getRegisterInfo(); -  const MCSubtargetInfo &STI = getSubtarget<MCSubtargetInfo>(); -  MCCodeEmitter *MCE = getTarget().createMCCodeEmitter( -      *getSubtargetImpl()->getInstrInfo(), MRI, STI, *Ctx); +  const MCRegisterInfo &MRI = *getMCRegisterInfo(); +  MCCodeEmitter *MCE = +      getTarget().createMCCodeEmitter(*getMCInstrInfo(), MRI, *Ctx);    MCAsmBackend *MAB = getTarget().createMCAsmBackend(MRI, getTargetTriple(),                                                       TargetCPU);    if (!MCE || !MAB)      return true; -  std::unique_ptr<MCStreamer> AsmStreamer; -  AsmStreamer.reset(getTarget() -                        .createMCObjectStreamer(getTargetTriple(), *Ctx, *MAB, -                                                Out, MCE, STI, -                                                Options.MCOptions.MCRelaxAll)); +  Triple T(getTargetTriple()); +  const MCSubtargetInfo &STI = *getMCSubtargetInfo(); +  std::unique_ptr<MCStreamer> AsmStreamer(getTarget().createMCObjectStreamer( +      T, *Ctx, *MAB, Out, MCE, STI, Options.MCOptions.MCRelaxAll, +      /*DWARFMustBeAtTheEnd*/ true));    // Create the AsmPrinter, which takes ownership of AsmStreamer if successful. -  FunctionPass *Printer = getTarget().createAsmPrinter(*this, *AsmStreamer); +  FunctionPass *Printer = +      getTarget().createAsmPrinter(*this, std::move(AsmStreamer));    if (!Printer)      return true; -  // If successful, createAsmPrinter took ownership of AsmStreamer. -  AsmStreamer.release(); -    PM.add(Printer);    return false; // success!  | 
