diff options
Diffstat (limited to 'lib/CodeGen/LLVMTargetMachine.cpp')
| -rw-r--r-- | lib/CodeGen/LLVMTargetMachine.cpp | 96 | 
1 files changed, 47 insertions, 49 deletions
diff --git a/lib/CodeGen/LLVMTargetMachine.cpp b/lib/CodeGen/LLVMTargetMachine.cpp index f985af8ba83e..80ecc224810c 100644 --- a/lib/CodeGen/LLVMTargetMachine.cpp +++ b/lib/CodeGen/LLVMTargetMachine.cpp @@ -27,16 +27,18 @@  #include "llvm/MC/MCInstrInfo.h"  #include "llvm/MC/MCStreamer.h"  #include "llvm/MC/MCSubtargetInfo.h" -#include "llvm/Target/TargetAsmInfo.h"  #include "llvm/Target/TargetData.h"  #include "llvm/Target/TargetInstrInfo.h" -#include "llvm/Target/TargetRegistry.h" +#include "llvm/Target/TargetLowering.h" +#include "llvm/Target/TargetLoweringObjectFile.h" +#include "llvm/Target/TargetRegisterInfo.h"  #include "llvm/Target/TargetSubtargetInfo.h"  #include "llvm/Transforms/Scalar.h"  #include "llvm/ADT/OwningPtr.h"  #include "llvm/Support/CommandLine.h"  #include "llvm/Support/Debug.h"  #include "llvm/Support/FormattedStream.h" +#include "llvm/Support/TargetRegistry.h"  using namespace llvm;  namespace llvm { @@ -55,8 +57,12 @@ static cl::opt<bool> DisableCodePlace("disable-code-place", cl::Hidden,      cl::desc("Disable code placement"));  static cl::opt<bool> DisableSSC("disable-ssc", cl::Hidden,      cl::desc("Disable Stack Slot Coloring")); +static cl::opt<bool> DisableMachineDCE("disable-machine-dce", cl::Hidden, +    cl::desc("Disable Machine Dead Code Elimination"));  static cl::opt<bool> DisableMachineLICM("disable-machine-licm", cl::Hidden,      cl::desc("Disable Machine LICM")); +static cl::opt<bool> DisableMachineCSE("disable-machine-cse", cl::Hidden, +    cl::desc("Disable Machine Common Subexpression Elimination"));  static cl::opt<bool> DisablePostRAMachineLICM("disable-postra-machine-licm",      cl::Hidden,      cl::desc("Disable Machine LICM")); @@ -103,20 +109,17 @@ EnableFastISelOption("fast-isel", cl::Hidden,    cl::desc("Enable the \"fast\" instruction selector"));  LLVMTargetMachine::LLVMTargetMachine(const Target &T, StringRef Triple, -                                     StringRef CPU, StringRef FS) +                                     StringRef CPU, StringRef FS, +                                     Reloc::Model RM, CodeModel::Model CM)    : TargetMachine(T, Triple, CPU, FS) { +  CodeGenInfo = T.createMCCodeGenInfo(Triple, RM, CM);    AsmInfo = T.createMCAsmInfo(Triple); -} - -// Set the default code model for the JIT for a generic target. -// FIXME: Is small right here? or .is64Bit() ? Large : Small? -void LLVMTargetMachine::setCodeModelForJIT() { -  setCodeModel(CodeModel::Small); -} - -// Set the default code model for static compilation for a generic target. -void LLVMTargetMachine::setCodeModelForStatic() { -  setCodeModel(CodeModel::Small); +  // 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." +	 "Make sure you include the correct TargetSelect.h!");  }  bool LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM, @@ -134,21 +137,22 @@ bool LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM,      Context->setAllowTemporaryLabels(false);    const MCAsmInfo &MAI = *getMCAsmInfo(); +  const MCSubtargetInfo &STI = getSubtarget<MCSubtargetInfo>();    OwningPtr<MCStreamer> AsmStreamer;    switch (FileType) {    default: return true;    case CGFT_AssemblyFile: {      MCInstPrinter *InstPrinter = -      getTarget().createMCInstPrinter(MAI.getAssemblerDialect(), MAI); +      getTarget().createMCInstPrinter(MAI.getAssemblerDialect(), MAI, STI);      // Create a code emitter if asked to show the encoding.      MCCodeEmitter *MCE = 0; -    TargetAsmBackend *TAB = 0; +    MCAsmBackend *MAB = 0;      if (ShowMCEncoding) {        const MCSubtargetInfo &STI = getSubtarget<MCSubtargetInfo>(); -      MCE = getTarget().createCodeEmitter(*getInstrInfo(), STI, *Context); -      TAB = getTarget().createAsmBackend(getTargetTriple()); +      MCE = getTarget().createMCCodeEmitter(*getInstrInfo(), STI, *Context); +      MAB = getTarget().createMCAsmBackend(getTargetTriple());      }      MCStreamer *S = getTarget().createAsmStreamer(*Context, Out, @@ -156,7 +160,7 @@ bool LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM,                                                    hasMCUseLoc(),                                                    hasMCUseCFI(),                                                    InstPrinter, -                                                  MCE, TAB, +                                                  MCE, MAB,                                                    ShowMCInst);      AsmStreamer.reset(S);      break; @@ -164,17 +168,16 @@ bool LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM,    case CGFT_ObjectFile: {      // Create the code emitter for the target if it exists.  If not, .o file      // emission fails. -    const MCSubtargetInfo &STI = getSubtarget<MCSubtargetInfo>(); -    MCCodeEmitter *MCE = getTarget().createCodeEmitter(*getInstrInfo(), STI, -                                                       *Context); -    TargetAsmBackend *TAB = getTarget().createAsmBackend(getTargetTriple()); -    if (MCE == 0 || TAB == 0) +    MCCodeEmitter *MCE = getTarget().createMCCodeEmitter(*getInstrInfo(), STI, +                                                         *Context); +    MCAsmBackend *MAB = getTarget().createMCAsmBackend(getTargetTriple()); +    if (MCE == 0 || MAB == 0)        return true; -    AsmStreamer.reset(getTarget().createObjectStreamer(getTargetTriple(), -                                                       *Context, *TAB, Out, MCE, -                                                       hasMCRelaxAll(), -                                                       hasMCNoExecStack())); +    AsmStreamer.reset(getTarget().createMCObjectStreamer(getTargetTriple(), +                                                         *Context, *MAB, Out, +                                                         MCE, hasMCRelaxAll(), +                                                         hasMCNoExecStack()));      AsmStreamer.get()->InitSections();      break;    } @@ -198,8 +201,6 @@ bool LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM,    PM.add(Printer); -  // Make sure the code model is set. -  setCodeModelForStatic();    PM.add(createGCInfoDeleter());    return false;  } @@ -214,9 +215,6 @@ bool LLVMTargetMachine::addPassesToEmitMachineCode(PassManagerBase &PM,                                                     JITCodeEmitter &JCE,                                                     CodeGenOpt::Level OptLevel,                                                     bool DisableVerify) { -  // Make sure the code model is set. -  setCodeModelForJIT(); -    // Add common CodeGen passes.    MCContext *Ctx = 0;    if (addCommonCodeGenPasses(PM, OptLevel, DisableVerify, Ctx)) @@ -248,16 +246,16 @@ bool LLVMTargetMachine::addPassesToEmitMC(PassManagerBase &PM,    // Create the code emitter for the target if it exists.  If not, .o file    // emission fails.    const MCSubtargetInfo &STI = getSubtarget<MCSubtargetInfo>(); -  MCCodeEmitter *MCE = getTarget().createCodeEmitter(*getInstrInfo(),STI, *Ctx); -  TargetAsmBackend *TAB = getTarget().createAsmBackend(getTargetTriple()); -  if (MCE == 0 || TAB == 0) +  MCCodeEmitter *MCE = getTarget().createMCCodeEmitter(*getInstrInfo(),STI, *Ctx); +  MCAsmBackend *MAB = getTarget().createMCAsmBackend(getTargetTriple()); +  if (MCE == 0 || MAB == 0)      return true;    OwningPtr<MCStreamer> AsmStreamer; -  AsmStreamer.reset(getTarget().createObjectStreamer(getTargetTriple(), *Ctx, -                                                     *TAB, Out, MCE, -                                                     hasMCRelaxAll(), -                                                     hasMCNoExecStack())); +  AsmStreamer.reset(getTarget().createMCObjectStreamer(getTargetTriple(), *Ctx, +                                                       *MAB, Out, MCE, +                                                       hasMCRelaxAll(), +                                                       hasMCNoExecStack()));    AsmStreamer.get()->InitSections();    // Create the AsmPrinter, which takes ownership of AsmStreamer if successful. @@ -270,9 +268,6 @@ bool LLVMTargetMachine::addPassesToEmitMC(PassManagerBase &PM,    PM.add(Printer); -  // Make sure the code model is set. -  setCodeModelForJIT(); -    return false; // success!  } @@ -369,8 +364,9 @@ bool LLVMTargetMachine::addCommonCodeGenPasses(PassManagerBase &PM,    // Install a MachineModuleInfo class, which is an immutable pass that holds    // all the per-module stuff we're generating, including MCContext. -  TargetAsmInfo *TAI = new TargetAsmInfo(*this); -  MachineModuleInfo *MMI = new MachineModuleInfo(*getMCAsmInfo(), TAI); +  MachineModuleInfo *MMI = new MachineModuleInfo(*getMCAsmInfo(), +                                                 *getRegisterInfo(), +                                     &getTargetLowering()->getObjFileLowering());    PM.add(MMI);    OutContext = &MMI->getContext(); // Return the MCContext specifically by-ref. @@ -412,12 +408,14 @@ bool LLVMTargetMachine::addCommonCodeGenPasses(PassManagerBase &PM,      // there is one known exception: lowered code for arguments that are only      // used by tail calls, where the tail calls reuse the incoming stack      // arguments directly (see t11 in test/CodeGen/X86/sibcall.ll). -    PM.add(createDeadMachineInstructionElimPass()); +    if (!DisableMachineDCE) +      PM.add(createDeadMachineInstructionElimPass());      printAndVerify(PM, "After codegen DCE pass");      if (!DisableMachineLICM)        PM.add(createMachineLICMPass()); -    PM.add(createMachineCSEPass()); +    if (!DisableMachineCSE) +      PM.add(createMachineCSEPass());      if (!DisableMachineSink)        PM.add(createMachineSinkingPass());      printAndVerify(PM, "After Machine LICM, CSE and Sinking passes"); @@ -452,8 +450,8 @@ bool LLVMTargetMachine::addCommonCodeGenPasses(PassManagerBase &PM,    if (addPostRegAlloc(PM, OptLevel))      printAndVerify(PM, "After PostRegAlloc passes"); -  PM.add(createLowerSubregsPass()); -  printAndVerify(PM, "After LowerSubregs"); +  PM.add(createExpandPostRAPseudosPass()); +  printAndVerify(PM, "After ExpandPostRAPseudos");    // Insert prolog/epilog code.  Eliminate abstract frame index references...    PM.add(createPrologEpilogCodeInserter());  | 
