X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FTarget%2FX86%2FX86TargetMachine.cpp;h=a20e1c448968c3cf2d0ae7460e57fca98e9c48b7;hb=92722533819ab838d958966d0e40a60030bb3c16;hp=08753e70e8c9bc07fee23b6c2ba48a629ed30b71;hpb=32b952a2a60d1091e0e17bb6ce788cd1d41e6f8b;p=oota-llvm.git diff --git a/lib/Target/X86/X86TargetMachine.cpp b/lib/Target/X86/X86TargetMachine.cpp index 08753e70e8c..a20e1c44896 100644 --- a/lib/Target/X86/X86TargetMachine.cpp +++ b/lib/Target/X86/X86TargetMachine.cpp @@ -32,9 +32,9 @@ int X86TargetMachineModule = 0; // Register the target. static RegisterTarget -X("x86", " 32-bit X86: Pentium-Pro and above"); +X("x86", "32-bit X86: Pentium-Pro and above"); static RegisterTarget -Y("x86-64", " 64-bit X86: EM64T and AMD64"); +Y("x86-64", "64-bit X86: EM64T and AMD64"); // No assembler printer by default X86TargetMachine::AsmPrinterCtorFn X86TargetMachine::AsmPrinterCtor = 0; @@ -143,6 +143,15 @@ X86TargetMachine::X86TargetMachine(const Module &M, const std::string &FS, else setRelocationModel(Reloc::Static); } + + // ELF doesn't have a distinct dynamic-no-PIC model. Dynamic-no-PIC + // is defined as a model for code which may be used in static or + // dynamic executables but not necessarily a shared library. On ELF + // implement this by using the Static model. + if (Subtarget.isTargetELF() && + getRelocationModel() == Reloc::DynamicNoPIC) + setRelocationModel(Reloc::Static); + if (Subtarget.is64Bit()) { // No DynamicNoPIC support under X86-64. if (getRelocationModel() == Reloc::DynamicNoPIC) @@ -153,17 +162,17 @@ X86TargetMachine::X86TargetMachine(const Module &M, const std::string &FS, } if (Subtarget.isTargetCygMing()) - Subtarget.setPICStyle(PICStyle::WinPIC); + Subtarget.setPICStyle(PICStyles::WinPIC); else if (Subtarget.isTargetDarwin()) { if (Subtarget.is64Bit()) - Subtarget.setPICStyle(PICStyle::RIPRel); + Subtarget.setPICStyle(PICStyles::RIPRel); else - Subtarget.setPICStyle(PICStyle::Stub); + Subtarget.setPICStyle(PICStyles::Stub); } else if (Subtarget.isTargetELF()) { if (Subtarget.is64Bit()) - Subtarget.setPICStyle(PICStyle::RIPRel); + Subtarget.setPICStyle(PICStyles::RIPRel); else - Subtarget.setPICStyle(PICStyle::GOT); + Subtarget.setPICStyle(PICStyles::GOT); } } @@ -174,6 +183,14 @@ X86TargetMachine::X86TargetMachine(const Module &M, const std::string &FS, bool X86TargetMachine::addInstSelector(PassManagerBase &PM, bool Fast) { // Install an instruction selector. PM.add(createX86ISelDag(*this, Fast)); + + // If we're using Fast-ISel, clean up the mess. + if (EnableFastISel) + PM.add(createDeadMachineInstructionElimPass()); + + // Install a pass to insert x87 FP_REG_KILL instructions, as needed. + PM.add(createX87FPRegKillInserterPass()); + return false; } @@ -190,10 +207,10 @@ bool X86TargetMachine::addPostRegAlloc(PassManagerBase &PM, bool Fast) { } bool X86TargetMachine::addAssemblyEmitter(PassManagerBase &PM, bool Fast, - raw_ostream &Out) { + bool Verbose, raw_ostream &Out) { assert(AsmPrinterCtor && "AsmPrinter was not linked in"); if (AsmPrinterCtor) - PM.add(AsmPrinterCtor(Out, *this)); + PM.add(AsmPrinterCtor(Out, *this, Fast, Verbose)); return false; } @@ -219,7 +236,7 @@ bool X86TargetMachine::addCodeEmitter(PassManagerBase &PM, bool Fast, if (DumpAsm) { assert(AsmPrinterCtor && "AsmPrinter was not linked in"); if (AsmPrinterCtor) - PM.add(AsmPrinterCtor(errs(), *this)); + PM.add(AsmPrinterCtor(errs(), *this, Fast, true)); } return false; @@ -231,8 +248,17 @@ bool X86TargetMachine::addSimpleCodeEmitter(PassManagerBase &PM, bool Fast, if (DumpAsm) { assert(AsmPrinterCtor && "AsmPrinter was not linked in"); if (AsmPrinterCtor) - PM.add(AsmPrinterCtor(errs(), *this)); + PM.add(AsmPrinterCtor(errs(), *this, Fast, true)); } return false; } + +/// symbolicAddressesAreRIPRel - Return true if symbolic addresses are +/// RIP-relative on this machine, taking into consideration the relocation +/// model and subtarget. RIP-relative addresses cannot have a separate +/// base or index register. +bool X86TargetMachine::symbolicAddressesAreRIPRel() const { + return getRelocationModel() != Reloc::Static && + Subtarget.isPICStyleRIPRel(); +}