diff options
Diffstat (limited to 'lib/Target/X86/X86TargetMachine.cpp')
| -rw-r--r-- | lib/Target/X86/X86TargetMachine.cpp | 279 | 
1 files changed, 107 insertions, 172 deletions
diff --git a/lib/Target/X86/X86TargetMachine.cpp b/lib/Target/X86/X86TargetMachine.cpp index b000914c9203..a61de1cd182a 100644 --- a/lib/Target/X86/X86TargetMachine.cpp +++ b/lib/Target/X86/X86TargetMachine.cpp @@ -11,172 +11,134 @@  //  //===----------------------------------------------------------------------===// -#include "X86TargetAsmInfo.h" +#include "X86MCAsmInfo.h"  #include "X86TargetMachine.h"  #include "X86.h" -#include "llvm/Module.h"  #include "llvm/PassManager.h"  #include "llvm/CodeGen/MachineFunction.h"  #include "llvm/CodeGen/Passes.h" -#include "llvm/Support/raw_ostream.h" +#include "llvm/Support/FormattedStream.h"  #include "llvm/Target/TargetOptions.h" -#include "llvm/Target/TargetMachineRegistry.h" +#include "llvm/Target/TargetRegistry.h"  using namespace llvm; -/// X86TargetMachineModule - Note that this is used on hosts that cannot link -/// in a library unless there are references into the library.  In particular, -/// it seems that it is not possible to get things to work on Win32 without -/// this.  Though it is unused, do not remove it. -extern "C" int X86TargetMachineModule; -int X86TargetMachineModule = 0; - -// Register the target. -static RegisterTarget<X86_32TargetMachine> -X("x86",    "32-bit X86: Pentium-Pro and above"); -static RegisterTarget<X86_64TargetMachine> -Y("x86-64", "64-bit X86: EM64T and AMD64"); - -// Force static initialization. -extern "C" void LLVMInitializeX86Target() { } - -// No assembler printer by default -X86TargetMachine::AsmPrinterCtorFn X86TargetMachine::AsmPrinterCtor = 0; - -const TargetAsmInfo *X86TargetMachine::createTargetAsmInfo() const { -  if (Subtarget.isFlavorIntel()) -    return new X86WinTargetAsmInfo(*this); -  else -    switch (Subtarget.TargetType) { -     case X86Subtarget::isDarwin: -      return new X86DarwinTargetAsmInfo(*this); -     case X86Subtarget::isELF: -      return new X86ELFTargetAsmInfo(*this); -     case X86Subtarget::isMingw: -     case X86Subtarget::isCygwin: -      return new X86COFFTargetAsmInfo(*this); -     case X86Subtarget::isWindows: -      return new X86WinTargetAsmInfo(*this); -     default: -      return new X86GenericTargetAsmInfo(*this); -    } -} - -unsigned X86_32TargetMachine::getJITMatchQuality() { -#if defined(i386) || defined(__i386__) || defined(__x86__) || defined(_M_IX86) -  return 10; -#endif -  return 0; -} - -unsigned X86_64TargetMachine::getJITMatchQuality() { -#if defined(__x86_64__) || defined(_M_AMD64) -  return 10; -#endif -  return 0; +static const MCAsmInfo *createMCAsmInfo(const Target &T, +                                                const StringRef &TT) { +  Triple TheTriple(TT); +  switch (TheTriple.getOS()) { +  case Triple::Darwin: +    return new X86MCAsmInfoDarwin(TheTriple); +  case Triple::MinGW32: +  case Triple::MinGW64: +  case Triple::Cygwin: +    return new X86MCAsmInfoCOFF(TheTriple); +  case Triple::Win32: +    return new X86WinMCAsmInfo(TheTriple); +  default: +    return new X86ELFMCAsmInfo(TheTriple); +  }  } -unsigned X86_32TargetMachine::getModuleMatchQuality(const Module &M) { -  // We strongly match "i[3-9]86-*". -  std::string TT = M.getTargetTriple(); -  if (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' && -      TT[4] == '-' && TT[1] - '3' < 6) -    return 20; -  // If the target triple is something non-X86, we don't match. -  if (!TT.empty()) return 0; +extern "C" void LLVMInitializeX86Target() {  +  // Register the target. +  RegisterTargetMachine<X86_32TargetMachine> X(TheX86_32Target); +  RegisterTargetMachine<X86_64TargetMachine> Y(TheX86_64Target); -  if (M.getEndianness()  == Module::LittleEndian && -      M.getPointerSize() == Module::Pointer32) -    return 10;                                   // Weak match -  else if (M.getEndianness() != Module::AnyEndianness || -           M.getPointerSize() != Module::AnyPointerSize) -    return 0;                                    // Match for some other target +  // Register the target asm info. +  RegisterAsmInfoFn A(TheX86_32Target, createMCAsmInfo); +  RegisterAsmInfoFn B(TheX86_64Target, createMCAsmInfo); -  return getJITMatchQuality()/2; +  // Register the code emitter. +  TargetRegistry::RegisterCodeEmitter(TheX86_32Target, createX86MCCodeEmitter); +  TargetRegistry::RegisterCodeEmitter(TheX86_64Target, createX86MCCodeEmitter);  } -unsigned X86_64TargetMachine::getModuleMatchQuality(const Module &M) { -  // We strongly match "x86_64-*". -  std::string TT = M.getTargetTriple(); -  if (TT.size() >= 7 && TT[0] == 'x' && TT[1] == '8' && TT[2] == '6' && -      TT[3] == '_' && TT[4] == '6' && TT[5] == '4' && TT[6] == '-') -    return 20; - -  // We strongly match "amd64-*". -  if (TT.size() >= 6 && TT[0] == 'a' && TT[1] == 'm' && TT[2] == 'd' && -      TT[3] == '6' && TT[4] == '4' && TT[5] == '-') -    return 20; -   -  // If the target triple is something non-X86-64, we don't match. -  if (!TT.empty()) return 0; - -  if (M.getEndianness()  == Module::LittleEndian && -      M.getPointerSize() == Module::Pointer64) -    return 10;                                   // Weak match -  else if (M.getEndianness() != Module::AnyEndianness || -           M.getPointerSize() != Module::AnyPointerSize) -    return 0;                                    // Match for some other target -  return getJITMatchQuality()/2; -} - -X86_32TargetMachine::X86_32TargetMachine(const Module &M, const std::string &FS) -  : X86TargetMachine(M, FS, false) { +X86_32TargetMachine::X86_32TargetMachine(const Target &T, const std::string &TT, +                                         const std::string &FS) +  : X86TargetMachine(T, TT, FS, false) {  } -X86_64TargetMachine::X86_64TargetMachine(const Module &M, const std::string &FS) -  : X86TargetMachine(M, FS, true) { +X86_64TargetMachine::X86_64TargetMachine(const Target &T, const std::string &TT, +                                         const std::string &FS) +  : X86TargetMachine(T, TT, FS, true) {  } -/// X86TargetMachine ctor - Create an ILP32 architecture model +/// X86TargetMachine ctor - Create an X86 target.  /// -X86TargetMachine::X86TargetMachine(const Module &M, const std::string &FS, -                                   bool is64Bit) -  : Subtarget(M, FS, is64Bit), +X86TargetMachine::X86TargetMachine(const Target &T, const std::string &TT,  +                                   const std::string &FS, bool is64Bit) +  : LLVMTargetMachine(T, TT),  +    Subtarget(TT, FS, is64Bit),      DataLayout(Subtarget.getDataLayout()),      FrameInfo(TargetFrameInfo::StackGrowsDown, -              Subtarget.getStackAlignment(), Subtarget.is64Bit() ? -8 : -4), +              Subtarget.getStackAlignment(), +              (Subtarget.isTargetWin64() ? -40 : +               (Subtarget.is64Bit() ? -8 : -4))),      InstrInfo(*this), JITInfo(*this), TLInfo(*this), ELFWriterInfo(*this) {    DefRelocModel = getRelocationModel(); -  // FIXME: Correctly select PIC model for Win64 stuff +       +  // If no relocation model was picked, default as appropriate for the target.    if (getRelocationModel() == Reloc::Default) { -    if (Subtarget.isTargetDarwin() || -        (Subtarget.isTargetCygMing() && !Subtarget.isTargetWin64())) -      setRelocationModel(Reloc::DynamicNoPIC); -    else +    if (!Subtarget.isTargetDarwin())        setRelocationModel(Reloc::Static); +    else if (Subtarget.is64Bit()) +      setRelocationModel(Reloc::PIC_); +    else +      setRelocationModel(Reloc::DynamicNoPIC);    } -  // 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) +  assert(getRelocationModel() != Reloc::Default && +         "Relocation mode not picked"); + +  // If no code model is picked, default to small. +  if (getCodeModel() == CodeModel::Default) +    setCodeModel(CodeModel::Small); +       +  // ELF and X86-64 don't have a distinct DynamicNoPIC model.  DynamicNoPIC +  // is defined as a model for code which may be used in static or dynamic +  // executables but not necessarily a shared library. On X86-32 we just +  // compile in -static mode, in x86-64 we use PIC. +  if (getRelocationModel() == Reloc::DynamicNoPIC) { +    if (is64Bit)        setRelocationModel(Reloc::PIC_); -    // Default X86-64 code model is small. -    if (getCodeModel() == CodeModel::Default) -      setCodeModel(CodeModel::Small); +    else if (!Subtarget.isTargetDarwin()) +      setRelocationModel(Reloc::Static);    } -  if (Subtarget.isTargetCygMing()) -    Subtarget.setPICStyle(PICStyles::WinPIC); -  else if (Subtarget.isTargetDarwin()) { +  // If we are on Darwin, disallow static relocation model in X86-64 mode, since +  // the Mach-O file format doesn't support it. +  if (getRelocationModel() == Reloc::Static && +      Subtarget.isTargetDarwin() && +      is64Bit) +    setRelocationModel(Reloc::PIC_); +       +  // Determine the PICStyle based on the target selected. +  if (getRelocationModel() == Reloc::Static) { +    // Unless we're in PIC or DynamicNoPIC mode, set the PIC style to None. +    Subtarget.setPICStyle(PICStyles::None); +  } else if (Subtarget.isTargetCygMing()) { +    Subtarget.setPICStyle(PICStyles::None); +  } else if (Subtarget.isTargetDarwin()) {      if (Subtarget.is64Bit())        Subtarget.setPICStyle(PICStyles::RIPRel); -    else -      Subtarget.setPICStyle(PICStyles::Stub); +    else if (getRelocationModel() == Reloc::PIC_) +      Subtarget.setPICStyle(PICStyles::StubPIC); +    else { +      assert(getRelocationModel() == Reloc::DynamicNoPIC); +      Subtarget.setPICStyle(PICStyles::StubDynamicNoPIC); +    }    } else if (Subtarget.isTargetELF()) {      if (Subtarget.is64Bit())        Subtarget.setPICStyle(PICStyles::RIPRel);      else        Subtarget.setPICStyle(PICStyles::GOT);    } +       +  // Finally, if we have "none" as our PIC style, force to static mode. +  if (Subtarget.getPICStyle() == PICStyles::None) +    setRelocationModel(Reloc::Static);  }  //===----------------------------------------------------------------------===// @@ -212,33 +174,16 @@ bool X86TargetMachine::addPostRegAlloc(PassManagerBase &PM,    return true;  // -print-machineinstr should print after this.  } -bool X86TargetMachine::addAssemblyEmitter(PassManagerBase &PM, -                                          CodeGenOpt::Level OptLevel, -                                          bool Verbose, -                                          raw_ostream &Out) { -  // FIXME: Move this somewhere else! -  // On Darwin, override 64-bit static relocation to pic_ since the -  // assembler doesn't support it. -  if (DefRelocModel == Reloc::Static && -      Subtarget.isTargetDarwin() && Subtarget.is64Bit() && -      getCodeModel() == CodeModel::Small) -    setRelocationModel(Reloc::PIC_); - -  assert(AsmPrinterCtor && "AsmPrinter was not linked in"); -  if (AsmPrinterCtor) -    PM.add(AsmPrinterCtor(Out, *this, Verbose)); -  return false; -} -  bool X86TargetMachine::addCodeEmitter(PassManagerBase &PM,                                        CodeGenOpt::Level OptLevel, -                                      bool DumpAsm,                                         MachineCodeEmitter &MCE) {    // FIXME: Move this to TargetJITInfo!    // On Darwin, do not override 64-bit setting made in X86TargetMachine().    if (DefRelocModel == Reloc::Default &&  -        (!Subtarget.isTargetDarwin() || !Subtarget.is64Bit())) +      (!Subtarget.isTargetDarwin() || !Subtarget.is64Bit())) {      setRelocationModel(Reloc::Static); +    Subtarget.setPICStyle(PICStyles::None); +  }    // 64-bit JIT places everything in the same buffer except external functions.    // On Darwin, use small code model but hack the call instruction for  @@ -251,24 +196,20 @@ bool X86TargetMachine::addCodeEmitter(PassManagerBase &PM,    }    PM.add(createX86CodeEmitterPass(*this, MCE)); -  if (DumpAsm) { -    assert(AsmPrinterCtor && "AsmPrinter was not linked in"); -    if (AsmPrinterCtor) -      PM.add(AsmPrinterCtor(errs(), *this, true)); -  }    return false;  }  bool X86TargetMachine::addCodeEmitter(PassManagerBase &PM,                                        CodeGenOpt::Level OptLevel, -                                      bool DumpAsm,                                        JITCodeEmitter &JCE) {    // FIXME: Move this to TargetJITInfo!    // On Darwin, do not override 64-bit setting made in X86TargetMachine().    if (DefRelocModel == Reloc::Default &&  -        (!Subtarget.isTargetDarwin() || !Subtarget.is64Bit())) +      (!Subtarget.isTargetDarwin() || !Subtarget.is64Bit())) {      setRelocationModel(Reloc::Static); +    Subtarget.setPICStyle(PICStyles::None); +  }    // 64-bit JIT places everything in the same buffer except external functions.    // On Darwin, use small code model but hack the call instruction for  @@ -281,40 +222,34 @@ bool X86TargetMachine::addCodeEmitter(PassManagerBase &PM,    }    PM.add(createX86JITCodeEmitterPass(*this, JCE)); -  if (DumpAsm) { -    assert(AsmPrinterCtor && "AsmPrinter was not linked in"); -    if (AsmPrinterCtor) -      PM.add(AsmPrinterCtor(errs(), *this, true)); -  }    return false;  } +bool X86TargetMachine::addCodeEmitter(PassManagerBase &PM, +                                      CodeGenOpt::Level OptLevel, +                                      ObjectCodeEmitter &OCE) { +  PM.add(createX86ObjectCodeEmitterPass(*this, OCE)); +  return false; +} +  bool X86TargetMachine::addSimpleCodeEmitter(PassManagerBase &PM,                                              CodeGenOpt::Level OptLevel, -                                            bool DumpAsm,                                              MachineCodeEmitter &MCE) {    PM.add(createX86CodeEmitterPass(*this, MCE)); -  if (DumpAsm) { -    assert(AsmPrinterCtor && "AsmPrinter was not linked in"); -    if (AsmPrinterCtor) -      PM.add(AsmPrinterCtor(errs(), *this, true)); -  } -    return false;  }  bool X86TargetMachine::addSimpleCodeEmitter(PassManagerBase &PM,                                              CodeGenOpt::Level OptLevel, -                                            bool DumpAsm,                                              JITCodeEmitter &JCE) {    PM.add(createX86JITCodeEmitterPass(*this, JCE)); -  if (DumpAsm) { -    assert(AsmPrinterCtor && "AsmPrinter was not linked in"); -    if (AsmPrinterCtor) -      PM.add(AsmPrinterCtor(errs(), *this, true)); -  } -    return false;  } +bool X86TargetMachine::addSimpleCodeEmitter(PassManagerBase &PM, +                                            CodeGenOpt::Level OptLevel, +                                            ObjectCodeEmitter &OCE) { +  PM.add(createX86ObjectCodeEmitterPass(*this, OCE)); +  return false; +}  | 
