[llvm-commits] [llvm] r75799 - in /llvm/trunk: include/llvm/Target/ lib/ExecutionEngine/JIT/ lib/Support/ lib/Target/ lib/Target/ARM/ lib/Target/ARM/AsmPrinter/ lib/Target/Alpha/ lib/Target/Alpha/AsmPrinter/ lib/Target/CBackend/ lib/Target/CellSP

Daniel Dunbar daniel at zuster.org
Wed Jul 15 13:30:53 PDT 2009


Sorry for the breakage, this has now been reapplied. The problem
wasn't actually with any of this stuff, there was just a misspelling
in the llvm-gcc commit, but in a file which only gets built during an
Apple FSF build (install actually).

 - Daniel

On Wed, Jul 15, 2009 at 10:27 AM, Stuart Hastings<stuart at apple.com> wrote:
> Author: stuart
> Date: Wed Jul 15 12:27:11 2009
> New Revision: 75799
>
> URL: http://llvm.org/viewvc/llvm-project?rev=75799&view=rev
> Log:
> Revert 75762, 75763, 75766..75769, 75772..75775, 75778, 75780, 75782 to repair broken LLVM-GCC build.
> Will revert 75770 in the llvm-gcc trunk.
>
> Modified:
>    llvm/trunk/include/llvm/Target/TargetMachine.h
>    llvm/trunk/include/llvm/Target/TargetMachineRegistry.h
>    llvm/trunk/include/llvm/Target/TargetRegistry.h
>    llvm/trunk/include/llvm/Target/TargetSelect.h
>    llvm/trunk/lib/ExecutionEngine/JIT/TargetSelect.cpp
>    llvm/trunk/lib/Support/TargetRegistry.cpp
>    llvm/trunk/lib/Target/ARM/ARM.h
>    llvm/trunk/lib/Target/ARM/ARMTargetMachine.cpp
>    llvm/trunk/lib/Target/ARM/ARMTargetMachine.h
>    llvm/trunk/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp
>    llvm/trunk/lib/Target/Alpha/AlphaTargetMachine.cpp
>    llvm/trunk/lib/Target/Alpha/AlphaTargetMachine.h
>    llvm/trunk/lib/Target/Alpha/AsmPrinter/AlphaAsmPrinter.cpp
>    llvm/trunk/lib/Target/CBackend/CBackend.cpp
>    llvm/trunk/lib/Target/CBackend/CTargetMachine.h
>    llvm/trunk/lib/Target/CellSPU/AsmPrinter/SPUAsmPrinter.cpp
>    llvm/trunk/lib/Target/CellSPU/SPU.h
>    llvm/trunk/lib/Target/CellSPU/SPUTargetMachine.cpp
>    llvm/trunk/lib/Target/CellSPU/SPUTargetMachine.h
>    llvm/trunk/lib/Target/CppBackend/CPPBackend.cpp
>    llvm/trunk/lib/Target/CppBackend/CPPTargetMachine.h
>    llvm/trunk/lib/Target/IA64/AsmPrinter/IA64AsmPrinter.cpp
>    llvm/trunk/lib/Target/IA64/IA64.h
>    llvm/trunk/lib/Target/IA64/IA64TargetMachine.cpp
>    llvm/trunk/lib/Target/IA64/IA64TargetMachine.h
>    llvm/trunk/lib/Target/MSIL/MSILWriter.cpp
>    llvm/trunk/lib/Target/MSP430/MSP430TargetMachine.cpp
>    llvm/trunk/lib/Target/MSP430/MSP430TargetMachine.h
>    llvm/trunk/lib/Target/Mips/AsmPrinter/MipsAsmPrinter.cpp
>    llvm/trunk/lib/Target/Mips/Mips.h
>    llvm/trunk/lib/Target/Mips/MipsTargetMachine.cpp
>    llvm/trunk/lib/Target/Mips/MipsTargetMachine.h
>    llvm/trunk/lib/Target/PIC16/PIC16TargetMachine.cpp
>    llvm/trunk/lib/Target/PIC16/PIC16TargetMachine.h
>    llvm/trunk/lib/Target/PowerPC/AsmPrinter/PPCAsmPrinter.cpp
>    llvm/trunk/lib/Target/PowerPC/PPC.h
>    llvm/trunk/lib/Target/PowerPC/PPCTargetMachine.cpp
>    llvm/trunk/lib/Target/PowerPC/PPCTargetMachine.h
>    llvm/trunk/lib/Target/Sparc/AsmPrinter/SparcAsmPrinter.cpp
>    llvm/trunk/lib/Target/Sparc/SparcTargetMachine.cpp
>    llvm/trunk/lib/Target/Sparc/SparcTargetMachine.h
>    llvm/trunk/lib/Target/TargetMachine.cpp
>    llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.h
>    llvm/trunk/lib/Target/X86/AsmPrinter/X86AsmPrinter.cpp
>    llvm/trunk/lib/Target/X86/AsmPrinter/X86IntelAsmPrinter.h
>    llvm/trunk/lib/Target/X86/X86.h
>    llvm/trunk/lib/Target/X86/X86TargetMachine.cpp
>    llvm/trunk/lib/Target/X86/X86TargetMachine.h
>    llvm/trunk/lib/Target/XCore/XCoreTargetMachine.cpp
>    llvm/trunk/lib/Target/XCore/XCoreTargetMachine.h
>    llvm/trunk/test/Analysis/PointerTracking/   (props changed)
>    llvm/trunk/tools/llc/llc.cpp
>    llvm/trunk/tools/lto/LTOCodeGenerator.cpp
>    llvm/trunk/tools/lto/LTOModule.cpp
>
> Modified: llvm/trunk/include/llvm/Target/TargetMachine.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetMachine.h?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Target/TargetMachine.h (original)
> +++ llvm/trunk/include/llvm/Target/TargetMachine.h Wed Jul 15 12:27:11 2009
> @@ -19,7 +19,6 @@
>
>  namespace llvm {
>
> -class Target;
>  class TargetAsmInfo;
>  class TargetData;
>  class TargetSubtarget;
> @@ -100,14 +99,11 @@
>   TargetMachine(const TargetMachine &);   // DO NOT IMPLEMENT
>   void operator=(const TargetMachine &);  // DO NOT IMPLEMENT
>  protected: // Can only create subclasses.
> -  TargetMachine(const Target &);
> +  TargetMachine();
>
>   /// getSubtargetImpl - virtual method implemented by subclasses that returns
>   /// a reference to that target's TargetSubtarget-derived member variable.
>   virtual const TargetSubtarget *getSubtargetImpl() const { return 0; }
> -
> -  /// TheTarget - The Target that this machine was created for.
> -  const Target &TheTarget;
>
>   /// AsmInfo - Contains target specific asm information.
>   ///
> @@ -120,7 +116,18 @@
>  public:
>   virtual ~TargetMachine();
>
> -  const Target &getTarget() const { return TheTarget; }
> +  /// getModuleMatchQuality - This static method should be implemented by
> +  /// targets to indicate how closely they match the specified module.  This is
> +  /// used by the LLC tool to determine which target to use when an explicit
> +  /// -march option is not specified.  If a target returns zero, it will never
> +  /// be chosen without an explicit -march option.
> +  static unsigned getModuleMatchQuality(const Module &) { return 0; }
> +
> +  /// getJITMatchQuality - This static method should be implemented by targets
> +  /// that provide JIT capabilities to indicate how suitable they are for
> +  /// execution on the current host.  If a value of 0 is returned, the target
> +  /// will not be used unless an explicit -march option is used.
> +  static unsigned getJITMatchQuality() { return 0; }
>
>   // Interfaces to the major aspects of target machine information:
>   // -- Instruction opcode and operand information
> @@ -301,7 +308,7 @@
>  ///
>  class LLVMTargetMachine : public TargetMachine {
>  protected: // Can only create subclasses.
> -  LLVMTargetMachine(const Target &T) : TargetMachine(T) { }
> +  LLVMTargetMachine() { }
>
>   /// addCommonCodeGenPasses - Add standard LLVM codegen passes used for
>   /// both emitting to assembly files or machine code output.
>
> Modified: llvm/trunk/include/llvm/Target/TargetMachineRegistry.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetMachineRegistry.h?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Target/TargetMachineRegistry.h (original)
> +++ llvm/trunk/include/llvm/Target/TargetMachineRegistry.h Wed Jul 15 12:27:11 2009
> @@ -19,21 +19,25 @@
>
>  #include "llvm/Module.h"
>  #include "llvm/Support/Registry.h"
> -#include "llvm/Target/TargetRegistry.h"
>
>  namespace llvm {
>   class Module;
> -  class Target;
>   class TargetMachine;
>
>   struct TargetMachineRegistryEntry {
> -    const Target &TheTarget;
>     const char *Name;
>     const char *ShortDesc;
> +    TargetMachine *(*CtorFn)(const Module &, const std::string &);
> +    unsigned (*ModuleMatchQualityFn)(const Module &M);
> +    unsigned (*JITMatchQualityFn)();
>
>   public:
> -    TargetMachineRegistryEntry(const Target &T, const char *N, const char *SD)
> -      : TheTarget(T), Name(N), ShortDesc(SD) {}
> +    TargetMachineRegistryEntry(const char *N, const char *SD,
> +                      TargetMachine *(*CF)(const Module &, const std::string &),
> +                               unsigned (*MMF)(const Module &M),
> +                               unsigned (*JMF)())
> +      : Name(N), ShortDesc(SD), CtorFn(CF), ModuleMatchQualityFn(MMF),
> +        JITMatchQualityFn(JMF) {}
>   };
>
>   template<>
> @@ -46,15 +50,24 @@
>   };
>
>   struct TargetMachineRegistry : public Registry<TargetMachine> {
> +    /// getClosestStaticTargetForModule - Given an LLVM module, pick the best
> +    /// target that is compatible with the module.  If no close target can be
> +    /// found, this returns null and sets the Error string to a reason.
> +    static const entry *getClosestStaticTargetForModule(const Module &M,
> +                                                        std::string &Error);
> +
> +    /// getClosestTargetForJIT - Pick the best target that is compatible with
> +    /// the current host.  If no close target can be found, this returns null
> +    /// and sets the Error string to a reason.
> +    static const entry *getClosestTargetForJIT(std::string &Error);
>
>   };
>
>   //===--------------------------------------------------------------------===//
>   /// RegisterTarget - This class is used to make targets automatically register
> -  /// themselves with the tools they are linked with.  Targets should define an
> -  /// single global Target instance and register it using the TargetRegistry
> -  /// interfaces. Targets must also include a static instance of this class.
> -  ///
> +  /// themselves with the tool they are linked.  Targets should define an
> +  /// instance of this and implement the static methods described in the
> +  /// TargetMachine comments.
>   /// The type 'TargetMachineImpl' should provide a constructor with two
>   /// parameters:
>   /// - const Module& M: the module that is being compiled:
> @@ -63,19 +76,19 @@
>
>   template<class TargetMachineImpl>
>   struct RegisterTarget {
> -    RegisterTarget(Target &T, const char *Name, const char *ShortDesc)
> -      : Entry(T, Name, ShortDesc),
> -        Node(Entry) {
> -      TargetRegistry::RegisterTargetMachine(T, &Allocator);
> -    }
> +    RegisterTarget(const char *Name, const char *ShortDesc)
> +      : Entry(Name, ShortDesc, &Allocator,
> +              &TargetMachineImpl::getModuleMatchQuality,
> +              &TargetMachineImpl::getJITMatchQuality),
> +        Node(Entry)
> +    {}
>
>   private:
>     TargetMachineRegistry::entry Entry;
>     TargetMachineRegistry::node Node;
>
> -    static TargetMachine *Allocator(const Target &T, const Module &M,
> -                                    const std::string &FS) {
> -      return new TargetMachineImpl(T, M, FS);
> +    static TargetMachine *Allocator(const Module &M, const std::string &FS) {
> +      return new TargetMachineImpl(M, FS);
>     }
>   };
>
>
> Modified: llvm/trunk/include/llvm/Target/TargetRegistry.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetRegistry.h?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Target/TargetRegistry.h (original)
> +++ llvm/trunk/include/llvm/Target/TargetRegistry.h Wed Jul 15 12:27:11 2009
> @@ -42,8 +42,7 @@
>     typedef unsigned (*ModuleMatchQualityFnTy)(const Module &M);
>     typedef unsigned (*JITMatchQualityFnTy)();
>
> -    typedef TargetMachine *(*TargetMachineCtorTy)(const Target &,
> -                                                  const Module &,
> +    typedef TargetMachine *(*TargetMachineCtorTy)(const Module &,
>                                                   const std::string &);
>     typedef FunctionPass *(*AsmPrinterCtorTy)(formatted_raw_ostream &,
>                                               TargetMachine &,
> @@ -88,22 +87,18 @@
>     /// getShortDescription - Get a short description of the target.
>     const char *getShortDescription() const { return ShortDesc; }
>
> -    /// getJITMatchQuality - Get the quality of this targets match for use as a
> -    /// JIT.
> -    unsigned getJITMatchQuality() const { return JITMatchQualityFn(); }
> -
>     /// createTargetMachine - Create a target specific machine implementation.
>     TargetMachine *createTargetMachine(const Module &M,
> -                                       const std::string &Features) const {
> +                                       const std::string &Features) {
>       if (!TargetMachineCtorFn)
>         return 0;
> -      return TargetMachineCtorFn(*this, M, Features);
> +      return TargetMachineCtorFn(M, Features);
>     }
>
>     /// createAsmPrinter - Create a target specific assembly printer pass.
>     FunctionPass *createAsmPrinter(formatted_raw_ostream &OS,
>                                    TargetMachine &M,
> -                                   bool Verbose) const {
> +                                   bool Verbose) {
>       if (!AsmPrinterCtorFn)
>         return 0;
>       return AsmPrinterCtorFn(OS, M, Verbose);
> @@ -140,8 +135,7 @@
>     /// @name Target Registration
>     /// @{
>
> -    /// RegisterTarget - Register the given target. Attempts to register a
> -    /// target which has already been registered will be ignored.
> +    /// RegisterTarget - Register the given target.
>     ///
>     /// Clients are responsible for ensuring that registration doesn't occur
>     /// while another thread is attempting to access the registry. Typically
>
> Modified: llvm/trunk/include/llvm/Target/TargetSelect.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetSelect.h?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Target/TargetSelect.h (original)
> +++ llvm/trunk/include/llvm/Target/TargetSelect.h Wed Jul 15 12:27:11 2009
> @@ -58,9 +58,7 @@
>   inline bool InitializeNativeTarget() {
>   // If we have a native target, initialize it to ensure it is linked in.
>  #ifdef LLVM_NATIVE_ARCH
> -#define DoInit2(TARG) \
> -    LLVMInitialize ## TARG ## Info ();          \
> -    LLVMInitialize ## TARG ()
> +#define DoInit2(TARG)   LLVMInitialize ## TARG ()
>  #define DoInit(T) DoInit2(T)
>     DoInit(LLVM_NATIVE_ARCH);
>     return false;
>
> Modified: llvm/trunk/lib/ExecutionEngine/JIT/TargetSelect.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/JIT/TargetSelect.cpp?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/ExecutionEngine/JIT/TargetSelect.cpp (original)
> +++ llvm/trunk/lib/ExecutionEngine/JIT/TargetSelect.cpp Wed Jul 15 12:27:11 2009
> @@ -45,16 +45,16 @@
>                                 JITMemoryManager *JMM,
>                                 CodeGenOpt::Level OptLevel,
>                                 bool AllocateGVsWithCode) {
> -  const Target *TheTarget;
> -  if (MArch == 0) {
> +  const TargetMachineRegistry::entry *TheArch = MArch;
> +  if (TheArch == 0) {
>     std::string Error;
> -    TheTarget = TargetRegistry::getClosestTargetForJIT(Error);
> -    if (TheTarget == 0) {
> +    TheArch = TargetMachineRegistry::getClosestTargetForJIT(Error);
> +    if (TheArch == 0) {
>       if (ErrorStr)
>         *ErrorStr = Error;
>       return 0;
>     }
> -  } else if (TheTarget->getJITMatchQuality() == 0) {
> +  } else if (TheArch->JITMatchQualityFn() == 0) {
>     cerr << "WARNING: This target JIT is not designed for the host you are"
>          << " running.  If bad things happen, please choose a different "
>          << "-march switch.\n";
> @@ -71,8 +71,7 @@
>   }
>
>   // Allocate a target...
> -  TargetMachine *Target =
> -    TheTarget->createTargetMachine(*MP->getModule(), FeaturesStr);
> +  TargetMachine *Target = TheArch->CtorFn(*MP->getModule(), FeaturesStr);
>   assert(Target && "Could not allocate target machine!");
>
>   // If the target supports JIT code generation, return a new JIT now.
>
> Modified: llvm/trunk/lib/Support/TargetRegistry.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/TargetRegistry.cpp?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Support/TargetRegistry.cpp (original)
> +++ llvm/trunk/lib/Support/TargetRegistry.cpp Wed Jul 15 12:27:11 2009
> @@ -111,13 +111,15 @@
>                                     Target::TripleMatchQualityFnTy TQualityFn,
>                                     Target::ModuleMatchQualityFnTy MQualityFn,
>                                     Target::JITMatchQualityFnTy JITQualityFn) {
> +  // Note that we don't require the constructor functions already be defined, in
> +  // case a module happens to initialize the optional functionality before the
> +  // target.
> +  assert(!T.Next && !T.Name && !T.ShortDesc && !T.TripleMatchQualityFn &&
> +         !T.ModuleMatchQualityFn && !T.JITMatchQualityFn &&
> +         "This Target already registered!");
> +
>   assert(Name && ShortDesc && TQualityFn && MQualityFn && JITQualityFn &&
>          "Missing required target information!");
> -
> -  // Check if this target has already been initialized, we allow this as a
> -  // convenience to some clients.
> -  if (T.Name)
> -    return;
>
>   // Add to the list of targets.
>   T.Next = FirstTarget;
>
> Modified: llvm/trunk/lib/Target/ARM/ARM.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARM.h?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/ARM/ARM.h (original)
> +++ llvm/trunk/lib/Target/ARM/ARM.h Wed Jul 15 12:27:11 2009
> @@ -94,7 +94,7 @@
>
>  FunctionPass *createARMISelDag(ARMBaseTargetMachine &TM);
>  FunctionPass *createARMCodePrinterPass(formatted_raw_ostream &O,
> -                                       TargetMachine &TM,
> +                                       ARMBaseTargetMachine &TM,
>                                        bool Verbose);
>  FunctionPass *createARMCodeEmitterPass(ARMBaseTargetMachine &TM,
>                                        MachineCodeEmitter &MCE);
>
> Modified: llvm/trunk/lib/Target/ARM/ARMTargetMachine.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMTargetMachine.cpp?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/ARM/ARMTargetMachine.cpp (original)
> +++ llvm/trunk/lib/Target/ARM/ARMTargetMachine.cpp Wed Jul 15 12:27:11 2009
> @@ -36,11 +36,8 @@
>  int ARMTargetMachineModule = 0;
>
>  // Register the target.
> -extern Target TheARMTarget;
> -static RegisterTarget<ARMTargetMachine>   X(TheARMTarget, "arm",   "ARM");
> -
> -extern Target TheThumbTarget;
> -static RegisterTarget<ThumbTargetMachine> Y(TheThumbTarget, "thumb", "Thumb");
> +static RegisterTarget<ARMTargetMachine>   X("arm",   "ARM");
> +static RegisterTarget<ThumbTargetMachine> Y("thumb", "Thumb");
>
>  // Force static initialization.
>  extern "C" void LLVMInitializeARMTarget() { }
> @@ -48,32 +45,57 @@
>  // No assembler printer by default
>  ARMBaseTargetMachine::AsmPrinterCtorFn ARMBaseTargetMachine::AsmPrinterCtor = 0;
>
> +/// ThumbTargetMachine - Create an Thumb architecture model.
> +///
> +unsigned ThumbTargetMachine::getJITMatchQuality() {
> +#if defined(__thumb__)
> +  return 10;
> +#endif
> +  return 0;
> +}
> +
> +unsigned ThumbTargetMachine::getModuleMatchQuality(const Module &M) {
> +  std::string TT = M.getTargetTriple();
> +  // Match thumb-foo-bar, as well as things like thumbv5blah-*
> +  if (TT.size() >= 6 &&
> +      (TT.substr(0, 6) == "thumb-" || TT.substr(0, 6) == "thumbv"))
> +    return 20;
> +
> +  // If the target triple is something non-thumb, we don't match.
> +  if (!TT.empty()) return 0;
> +
> +  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
> +
> +  return getJITMatchQuality()/2;
> +}
> +
>  /// TargetMachine ctor - Create an ARM architecture model.
>  ///
> -ARMBaseTargetMachine::ARMBaseTargetMachine(const Target &T,
> -                                           const Module &M,
> +ARMBaseTargetMachine::ARMBaseTargetMachine(const Module &M,
>                                            const std::string &FS,
>                                            bool isThumb)
> -  : LLVMTargetMachine(T),
> -    Subtarget(M, FS, isThumb),
> +  : Subtarget(M, FS, isThumb),
>     FrameInfo(Subtarget),
>     JITInfo(),
>     InstrItins(Subtarget.getInstrItineraryData()) {
>   DefRelocModel = getRelocationModel();
>  }
>
> -ARMTargetMachine::ARMTargetMachine(const Target &T, const Module &M,
> -                                   const std::string &FS)
> -  : ARMBaseTargetMachine(T, M, FS, false), InstrInfo(Subtarget),
> +ARMTargetMachine::ARMTargetMachine(const Module &M, const std::string &FS)
> +  : ARMBaseTargetMachine(M, FS, false), InstrInfo(Subtarget),
>     DataLayout(Subtarget.isAPCS_ABI() ?
>                std::string("e-p:32:32-f64:32:32-i64:32:32") :
>                std::string("e-p:32:32-f64:64:64-i64:64:64")),
>     TLInfo(*this) {
>  }
>
> -ThumbTargetMachine::ThumbTargetMachine(const Target &T, const Module &M,
> -                                       const std::string &FS)
> -  : ARMBaseTargetMachine(T, M, FS, true),
> +ThumbTargetMachine::ThumbTargetMachine(const Module &M, const std::string &FS)
> +  : ARMBaseTargetMachine(M, FS, true),
>     DataLayout(Subtarget.isAPCS_ABI() ?
>                std::string("e-p:32:32-f64:32:32-i64:32:32-"
>                            "i16:16:32-i8:8:32-i1:8:32-a:0:32") :
> @@ -87,6 +109,32 @@
>     InstrInfo = new Thumb1InstrInfo(Subtarget);
>  }
>
> +unsigned ARMTargetMachine::getJITMatchQuality() {
> +#if defined(__arm__)
> +  return 10;
> +#endif
> +  return 0;
> +}
> +
> +unsigned ARMTargetMachine::getModuleMatchQuality(const Module &M) {
> +  std::string TT = M.getTargetTriple();
> +  // Match arm-foo-bar, as well as things like armv5blah-*
> +  if (TT.size() >= 4 &&
> +      (TT.substr(0, 4) == "arm-" || TT.substr(0, 4) == "armv"))
> +    return 20;
> +  // If the target triple is something non-arm, we don't match.
> +  if (!TT.empty()) return 0;
> +
> +  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
> +
> +  return getJITMatchQuality()/2;
> +}
> +
>
>  const TargetAsmInfo *ARMBaseTargetMachine::createTargetAsmInfo() const {
>   switch (Subtarget.TargetType) {
>
> Modified: llvm/trunk/lib/Target/ARM/ARMTargetMachine.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMTargetMachine.h?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/ARM/ARMTargetMachine.h (original)
> +++ llvm/trunk/lib/Target/ARM/ARMTargetMachine.h Wed Jul 15 12:27:11 2009
> @@ -42,13 +42,12 @@
>   // To avoid having target depend on the asmprinter stuff libraries, asmprinter
>   // set this functions to ctor pointer at startup time if they are linked in.
>   typedef FunctionPass *(*AsmPrinterCtorFn)(formatted_raw_ostream &o,
> -                                            TargetMachine &tm,
> +                                            ARMBaseTargetMachine &tm,
>                                             bool verbose);
>   static AsmPrinterCtorFn AsmPrinterCtor;
>
>  public:
> -  ARMBaseTargetMachine(const Target &T, const Module &M, const std::string &FS,
> -                       bool isThumb);
> +  ARMBaseTargetMachine(const Module &M, const std::string &FS, bool isThumb);
>
>   virtual const ARMFrameInfo     *getFrameInfo() const { return &FrameInfo; }
>   virtual       ARMJITInfo       *getJITInfo()         { return &JITInfo; }
> @@ -61,6 +60,9 @@
>     AsmPrinterCtor = F;
>   }
>
> +  static unsigned getModuleMatchQuality(const Module &M);
> +  static unsigned getJITMatchQuality();
> +
>   virtual const TargetAsmInfo *createTargetAsmInfo() const;
>
>   // Pass Pipeline Configuration
> @@ -97,7 +99,7 @@
>   const TargetData    DataLayout;       // Calculates type size & alignment
>   ARMTargetLowering   TLInfo;
>  public:
> -  ARMTargetMachine(const Target &T, const Module &M, const std::string &FS);
> +  ARMTargetMachine(const Module &M, const std::string &FS);
>
>   virtual const ARMRegisterInfo  *getRegisterInfo() const {
>     return &InstrInfo.getRegisterInfo();
> @@ -123,7 +125,7 @@
>   const TargetData    DataLayout;   // Calculates type size & alignment
>   ARMTargetLowering   TLInfo;
>  public:
> -  ThumbTargetMachine(const Target &T, const Module &M, const std::string &FS);
> +  ThumbTargetMachine(const Module &M, const std::string &FS);
>
>   /// returns either Thumb1RegisterInfo of Thumb2RegisterInfo
>   virtual const ARMBaseRegisterInfo *getRegisterInfo() const {
>
> Modified: llvm/trunk/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp (original)
> +++ llvm/trunk/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp Wed Jul 15 12:27:11 2009
> @@ -31,7 +31,6 @@
>  #include "llvm/Target/TargetData.h"
>  #include "llvm/Target/TargetMachine.h"
>  #include "llvm/Target/TargetOptions.h"
> -#include "llvm/Target/TargetRegistry.h"
>  #include "llvm/ADT/Statistic.h"
>  #include "llvm/ADT/StringExtras.h"
>  #include "llvm/ADT/StringSet.h"
> @@ -1288,7 +1287,7 @@
>  /// regardless of whether the function is in SSA form.
>  ///
>  FunctionPass *llvm::createARMCodePrinterPass(formatted_raw_ostream &o,
> -                                             TargetMachine &tm,
> +                                             ARMBaseTargetMachine &tm,
>                                              bool verbose) {
>   return new ARMAsmPrinter(o, tm, tm.getTargetAsmInfo(), verbose);
>  }
> @@ -1302,8 +1301,4 @@
>  }
>
>  // Force static initialization.
> -extern "C" void LLVMInitializeARMAsmPrinter() {
> -  extern Target TheARMTarget, TheThumbTarget;
> -  TargetRegistry::RegisterAsmPrinter(TheARMTarget, createARMCodePrinterPass);
> -  TargetRegistry::RegisterAsmPrinter(TheThumbTarget, createARMCodePrinterPass);
> -}
> +extern "C" void LLVMInitializeARMAsmPrinter() { }
>
> Modified: llvm/trunk/lib/Target/Alpha/AlphaTargetMachine.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Alpha/AlphaTargetMachine.cpp?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/Alpha/AlphaTargetMachine.cpp (original)
> +++ llvm/trunk/lib/Target/Alpha/AlphaTargetMachine.cpp Wed Jul 15 12:27:11 2009
> @@ -22,9 +22,7 @@
>  using namespace llvm;
>
>  // Register the targets
> -extern Target TheAlphaTarget;
> -static RegisterTarget<AlphaTargetMachine> X(TheAlphaTarget, "alpha",
> -                                            "Alpha [experimental]");
> +static RegisterTarget<AlphaTargetMachine> X("alpha", "Alpha [experimental]");
>
>  // No assembler printer by default
>  AlphaTargetMachine::AsmPrinterCtorFn AlphaTargetMachine::AsmPrinterCtor = 0;
> @@ -36,10 +34,35 @@
>   return new AlphaTargetAsmInfo(*this);
>  }
>
> -AlphaTargetMachine::AlphaTargetMachine(const Target &T, const Module &M,
> -                                       const std::string &FS)
> -  : LLVMTargetMachine(T),
> -    DataLayout("e-f128:128:128"),
> +unsigned AlphaTargetMachine::getModuleMatchQuality(const Module &M) {
> +  // We strongly match "alpha*".
> +  std::string TT = M.getTargetTriple();
> +  if (TT.size() >= 5 && TT[0] == 'a' && TT[1] == 'l' && TT[2] == 'p' &&
> +      TT[3] == 'h' && TT[4] == 'a')
> +    return 20;
> +  // If the target triple is something non-alpha, 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;
> +}
> +
> +unsigned AlphaTargetMachine::getJITMatchQuality() {
> +#ifdef __alpha
> +  return 10;
> +#else
> +  return 0;
> +#endif
> +}
> +
> +AlphaTargetMachine::AlphaTargetMachine(const Module &M, const std::string &FS)
> +  : DataLayout("e-f128:128:128"),
>     FrameInfo(TargetFrameInfo::StackGrowsDown, 16, 0),
>     JITInfo(*this),
>     Subtarget(M, FS),
>
> Modified: llvm/trunk/lib/Target/Alpha/AlphaTargetMachine.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Alpha/AlphaTargetMachine.h?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/Alpha/AlphaTargetMachine.h (original)
> +++ llvm/trunk/lib/Target/Alpha/AlphaTargetMachine.h Wed Jul 15 12:27:11 2009
> @@ -45,7 +45,7 @@
>   static AsmPrinterCtorFn AsmPrinterCtor;
>
>  public:
> -  AlphaTargetMachine(const Target &T, const Module &M, const std::string &FS);
> +  AlphaTargetMachine(const Module &M, const std::string &FS);
>
>   virtual const AlphaInstrInfo *getInstrInfo() const { return &InstrInfo; }
>   virtual const TargetFrameInfo  *getFrameInfo() const { return &FrameInfo; }
> @@ -61,6 +61,9 @@
>     return &JITInfo;
>   }
>
> +  static unsigned getJITMatchQuality();
> +  static unsigned getModuleMatchQuality(const Module &M);
> +
>   // Pass Pipeline Configuration
>   virtual bool addInstSelector(PassManagerBase &PM, CodeGenOpt::Level OptLevel);
>   virtual bool addPreEmitPass(PassManagerBase &PM, CodeGenOpt::Level OptLevel);
>
> Modified: llvm/trunk/lib/Target/Alpha/AsmPrinter/AlphaAsmPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Alpha/AsmPrinter/AlphaAsmPrinter.cpp?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/Alpha/AsmPrinter/AlphaAsmPrinter.cpp (original)
> +++ llvm/trunk/lib/Target/Alpha/AsmPrinter/AlphaAsmPrinter.cpp Wed Jul 15 12:27:11 2009
> @@ -24,7 +24,6 @@
>  #include "llvm/CodeGen/DwarfWriter.h"
>  #include "llvm/Target/TargetAsmInfo.h"
>  #include "llvm/Target/TargetMachine.h"
> -#include "llvm/Target/TargetRegistry.h"
>  #include "llvm/Support/Compiler.h"
>  #include "llvm/Support/ErrorHandling.h"
>  #include "llvm/Support/Mangler.h"
> @@ -293,6 +292,9 @@
>   return false;
>  }
>
> +// Force static initialization.
> +extern "C" void LLVMInitializeAlphaAsmPrinter() { }
> +
>  namespace {
>   static struct Register {
>     Register() {
> @@ -300,10 +302,3 @@
>     }
>   } Registrator;
>  }
> -
> -// Force static initialization.
> -extern "C" void LLVMInitializeAlphaAsmPrinter() {
> -  extern Target TheAlphaTarget;
> -  TargetRegistry::RegisterAsmPrinter(TheAlphaTarget,
> -                                     createAlphaCodePrinterPass);
> -}
>
> Modified: llvm/trunk/lib/Target/CBackend/CBackend.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/CBackend/CBackend.cpp?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/CBackend/CBackend.cpp (original)
> +++ llvm/trunk/lib/Target/CBackend/CBackend.cpp Wed Jul 15 12:27:11 2009
> @@ -30,10 +30,9 @@
>  #include "llvm/CodeGen/Passes.h"
>  #include "llvm/CodeGen/IntrinsicLowering.h"
>  #include "llvm/Transforms/Scalar.h"
> +#include "llvm/Target/TargetMachineRegistry.h"
>  #include "llvm/Target/TargetAsmInfo.h"
>  #include "llvm/Target/TargetData.h"
> -#include "llvm/Target/TargetMachineRegistry.h"
> -#include "llvm/Target/TargetRegistry.h"
>  #include "llvm/Support/CallSite.h"
>  #include "llvm/Support/CFG.h"
>  #include "llvm/Support/ErrorHandling.h"
> @@ -59,8 +58,7 @@
>  int CBackendTargetMachineModule = 0;
>
>  // Register the target.
> -extern Target TheCBackendTarget;
> -static RegisterTarget<CTargetMachine> X(TheCBackendTarget, "c", "C backend");
> +static RegisterTarget<CTargetMachine> X("c", "C backend");
>
>  // Force static initialization.
>  extern "C" void LLVMInitializeCBackendTarget() { }
> @@ -3188,27 +3186,27 @@
>
>   const char *const *table = 0;
>
> -  // Grab the translation table from TargetAsmInfo if it exists.
> +  //Grab the translation table from TargetAsmInfo if it exists
>   if (!TAsm) {
>     std::string E;
> -    const Target *Match =
> -      TargetRegistry::getClosestStaticTargetForModule(*TheModule, E);
> +    const TargetMachineRegistry::entry* Match =
> +      TargetMachineRegistry::getClosestStaticTargetForModule(*TheModule, E);
>     if (Match) {
> -      // Per platform Target Machines don't exist, so create it;
> -      // this must be done only once.
> -      const TargetMachine* TM = Match->createTargetMachine(*TheModule, "");
> +      //Per platform Target Machines don't exist, so create it
> +      // this must be done only once
> +      const TargetMachine* TM = Match->CtorFn(*TheModule, "");
>       TAsm = TM->getTargetAsmInfo();
>     }
>   }
>   if (TAsm)
>     table = TAsm->getAsmCBE();
>
> -  // Search the translation table if it exists.
> +  //Search the translation table if it exists
>   for (int i = 0; table && table[i]; i += 2)
>     if (c.Codes[0] == table[i])
>       return table[i+1];
>
> -  // Default is identity.
> +  //default is identity
>   return c.Codes[0];
>  }
>
>
> Modified: llvm/trunk/lib/Target/CBackend/CTargetMachine.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/CBackend/CTargetMachine.h?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/CBackend/CTargetMachine.h (original)
> +++ llvm/trunk/lib/Target/CBackend/CTargetMachine.h Wed Jul 15 12:27:11 2009
> @@ -22,14 +22,18 @@
>  struct CTargetMachine : public TargetMachine {
>   const TargetData DataLayout;       // Calculates type size & alignment
>
> -  CTargetMachine(const Target &T, const Module &M, const std::string &FS)
> -    : TargetMachine(T), DataLayout(&M) {}
> +  CTargetMachine(const Module &M, const std::string &FS)
> +    : DataLayout(&M) {}
>
>   virtual bool WantsWholeFile() const { return true; }
>   virtual bool addPassesToEmitWholeFile(PassManager &PM,
>                                         formatted_raw_ostream &Out,
>                                         CodeGenFileType FileType,
>                                         CodeGenOpt::Level OptLevel);
> +
> +  // This class always works, but must be requested explicitly on
> +  // llc command line.
> +  static unsigned getModuleMatchQuality(const Module &M) { return 0; }
>
>   virtual const TargetData *getTargetData() const { return &DataLayout; }
>  };
>
> Modified: llvm/trunk/lib/Target/CellSPU/AsmPrinter/SPUAsmPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/CellSPU/AsmPrinter/SPUAsmPrinter.cpp?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/CellSPU/AsmPrinter/SPUAsmPrinter.cpp (original)
> +++ llvm/trunk/lib/Target/CellSPU/AsmPrinter/SPUAsmPrinter.cpp Wed Jul 15 12:27:11 2009
> @@ -37,7 +37,6 @@
>  #include "llvm/Target/TargetRegisterInfo.h"
>  #include "llvm/Target/TargetInstrInfo.h"
>  #include "llvm/Target/TargetOptions.h"
> -#include "llvm/Target/TargetRegistry.h"
>  #include "llvm/ADT/Statistic.h"
>  #include "llvm/ADT/StringExtras.h"
>  #include <set>
> @@ -290,7 +289,7 @@
>   class VISIBILITY_HIDDEN LinuxAsmPrinter : public SPUAsmPrinter {
>     DwarfWriter *DW;
>   public:
> -    explicit LinuxAsmPrinter(formatted_raw_ostream &O, TargetMachine &TM,
> +    explicit LinuxAsmPrinter(formatted_raw_ostream &O, SPUTargetMachine &TM,
>                              const TargetAsmInfo *T, bool V)
>       : SPUAsmPrinter(O, TM, T, V), DW(0) {}
>
> @@ -600,11 +599,14 @@
>  /// that the Linux SPU assembler can deal with.
>  ///
>  FunctionPass *llvm::createSPUAsmPrinterPass(formatted_raw_ostream &o,
> -                                            TargetMachine &tm,
> +                                            SPUTargetMachine &tm,
>                                             bool verbose) {
>   return new LinuxAsmPrinter(o, tm, tm.getTargetAsmInfo(), verbose);
>  }
>
> +// Force static initialization.
> +extern "C" void LLVMInitializeCellSPUAsmPrinter() { }
> +
>  namespace {
>   static struct Register {
>     Register() {
> @@ -612,9 +614,3 @@
>     }
>   } Registrator;
>  }
> -
> -// Force static initialization.
> -extern "C" void LLVMInitializeCellSPUAsmPrinter() {
> -  extern Target TheCellSPUTarget;
> -  TargetRegistry::RegisterAsmPrinter(TheCellSPUTarget, createSPUAsmPrinterPass);
> -}
>
> Modified: llvm/trunk/lib/Target/CellSPU/SPU.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/CellSPU/SPU.h?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/CellSPU/SPU.h (original)
> +++ llvm/trunk/lib/Target/CellSPU/SPU.h Wed Jul 15 12:27:11 2009
> @@ -25,7 +25,7 @@
>
>   FunctionPass *createSPUISelDag(SPUTargetMachine &TM);
>   FunctionPass *createSPUAsmPrinterPass(formatted_raw_ostream &o,
> -                                        TargetMachine &tm,
> +                                        SPUTargetMachine &tm,
>                                         bool verbose);
>
>   /*--== Utility functions/predicates/etc used all over the place: --==*/
>
> Modified: llvm/trunk/lib/Target/CellSPU/SPUTargetMachine.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/CellSPU/SPUTargetMachine.cpp?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/CellSPU/SPUTargetMachine.cpp (original)
> +++ llvm/trunk/lib/Target/CellSPU/SPUTargetMachine.cpp Wed Jul 15 12:27:11 2009
> @@ -23,11 +23,10 @@
>
>  using namespace llvm;
>
> -extern Target TheCellSPUTarget;
>  namespace {
>   // Register the targets
>   RegisterTarget<SPUTargetMachine>
> -  CELLSPU(TheCellSPUTarget, "cellspu", "STI CBEA Cell SPU [experimental]");
> +  CELLSPU("cellspu", "STI CBEA Cell SPU [experimental]");
>  }
>
>  // No assembler printer by default
> @@ -48,10 +47,22 @@
>   return new SPULinuxTargetAsmInfo(*this);
>  }
>
> -SPUTargetMachine::SPUTargetMachine(const Target &T, const Module &M,
> -                                   const std::string &FS)
> -  : LLVMTargetMachine(T),
> -    Subtarget(*this, M, FS),
> +unsigned
> +SPUTargetMachine::getModuleMatchQuality(const Module &M)
> +{
> +  // We strongly match "spu-*" or "cellspu-*".
> +  std::string TT = M.getTargetTriple();
> +  if ((TT.size() == 3 && std::string(TT.begin(), TT.begin()+3) == "spu")
> +      || (TT.size() == 7 && std::string(TT.begin(), TT.begin()+7) == "cellspu")
> +      || (TT.size() >= 4 && std::string(TT.begin(), TT.begin()+4) == "spu-")
> +      || (TT.size() >= 8 && std::string(TT.begin(), TT.begin()+8) == "cellspu-"))
> +    return 20;
> +
> +  return 0;                     // No match at all...
> +}
> +
> +SPUTargetMachine::SPUTargetMachine(const Module &M, const std::string &FS)
> +  : Subtarget(*this, M, FS),
>     DataLayout(Subtarget.getTargetDataString()),
>     InstrInfo(*this),
>     FrameInfo(*this),
>
> Modified: llvm/trunk/lib/Target/CellSPU/SPUTargetMachine.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/CellSPU/SPUTargetMachine.h?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/CellSPU/SPUTargetMachine.h (original)
> +++ llvm/trunk/lib/Target/CellSPU/SPUTargetMachine.h Wed Jul 15 12:27:11 2009
> @@ -42,12 +42,12 @@
>   // To avoid having target depend on the asmprinter stuff libraries, asmprinter
>   // set this functions to ctor pointer at startup time if they are linked in.
>   typedef FunctionPass *(*AsmPrinterCtorFn)(formatted_raw_ostream &o,
> -                                            TargetMachine &tm,
> +                                            SPUTargetMachine &tm,
>                                             bool verbose);
>   static AsmPrinterCtorFn AsmPrinterCtor;
>
>  public:
> -  SPUTargetMachine(const Target &T, const Module &M, const std::string &FS);
> +  SPUTargetMachine(const Module &M, const std::string &FS);
>
>   /// Return the subtarget implementation object
>   virtual const SPUSubtarget     *getSubtargetImpl() const {
> @@ -66,6 +66,12 @@
>   virtual       TargetJITInfo    *getJITInfo() {
>     return NULL;
>   }
> +
> +  //! Module match function
> +  /*!
> +    Module matching function called by TargetMachineRegistry().
> +   */
> +  static unsigned getModuleMatchQuality(const Module &M);
>
>   virtual       SPUTargetLowering *getTargetLowering() const {
>    return const_cast<SPUTargetLowering*>(&TLInfo);
>
> Modified: llvm/trunk/lib/Target/CppBackend/CPPBackend.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/CppBackend/CPPBackend.cpp?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/CppBackend/CPPBackend.cpp (original)
> +++ llvm/trunk/lib/Target/CppBackend/CPPBackend.cpp Wed Jul 15 12:27:11 2009
> @@ -81,8 +81,7 @@
>  int CppBackendTargetMachineModule = 0;
>
>  // Register the target.
> -extern Target TheCppBackendTarget;
> -static RegisterTarget<CPPTargetMachine> X(TheCppBackendTarget, "cpp", "C++ backend");
> +static RegisterTarget<CPPTargetMachine> X("cpp", "C++ backend");
>
>  // Force static initialization.
>  extern "C" void LLVMInitializeCppBackendTarget() { }
>
> Modified: llvm/trunk/lib/Target/CppBackend/CPPTargetMachine.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/CppBackend/CPPTargetMachine.h?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/CppBackend/CPPTargetMachine.h (original)
> +++ llvm/trunk/lib/Target/CppBackend/CPPTargetMachine.h Wed Jul 15 12:27:11 2009
> @@ -24,8 +24,8 @@
>  struct CPPTargetMachine : public TargetMachine {
>   const TargetData DataLayout;       // Calculates type size & alignment
>
> -  CPPTargetMachine(const Target &T, const Module &M, const std::string &FS)
> -    : TargetMachine(T), DataLayout(&M) {}
> +  CPPTargetMachine(const Module &M, const std::string &FS)
> +    : DataLayout(&M) {}
>
>   virtual bool WantsWholeFile() const { return true; }
>   virtual bool addPassesToEmitWholeFile(PassManager &PM,
> @@ -33,6 +33,9 @@
>                                         CodeGenFileType FileType,
>                                         CodeGenOpt::Level OptLevel);
>
> +  // This class always works, but shouldn't be the default in most cases.
> +  static unsigned getModuleMatchQuality(const Module &M) { return 1; }
> +
>   virtual const TargetData *getTargetData() const { return &DataLayout; }
>  };
>
>
> Modified: llvm/trunk/lib/Target/IA64/AsmPrinter/IA64AsmPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/IA64/AsmPrinter/IA64AsmPrinter.cpp?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/IA64/AsmPrinter/IA64AsmPrinter.cpp (original)
> +++ llvm/trunk/lib/Target/IA64/AsmPrinter/IA64AsmPrinter.cpp Wed Jul 15 12:27:11 2009
> @@ -26,7 +26,6 @@
>  #include "llvm/CodeGen/DwarfWriter.h"
>  #include "llvm/CodeGen/MachineFunctionPass.h"
>  #include "llvm/Target/TargetAsmInfo.h"
> -#include "llvm/Target/TargetRegistry.h"
>  #include "llvm/Support/ErrorHandling.h"
>  #include "llvm/Support/FormattedStream.h"
>  #include "llvm/Support/Mangler.h"
> @@ -370,7 +369,7 @@
>  /// the given target machine description.
>  ///
>  FunctionPass *llvm::createIA64CodePrinterPass(formatted_raw_ostream &o,
> -                                              TargetMachine &tm,
> +                                              IA64TargetMachine &tm,
>                                               bool verbose) {
>   return new IA64AsmPrinter(o, tm, tm.getTargetAsmInfo(), verbose);
>  }
> @@ -385,7 +384,4 @@
>
>
>  // Force static initialization.
> -extern "C" void LLVMInitializeIA64AsmPrinter() {
> -  extern Target TheIA64Target;
> -  TargetRegistry::RegisterAsmPrinter(TheIA64Target, createIA64CodePrinterPass);
> -}
> +extern "C" void LLVMInitializeIA64AsmPrinter() { }
>
> Modified: llvm/trunk/lib/Target/IA64/IA64.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/IA64/IA64.h?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/IA64/IA64.h (original)
> +++ llvm/trunk/lib/Target/IA64/IA64.h Wed Jul 15 12:27:11 2009
> @@ -38,7 +38,7 @@
>  /// regardless of whether the function is in SSA form.
>  ///
>  FunctionPass *createIA64CodePrinterPass(formatted_raw_ostream &o,
> -                                        TargetMachine &tm,
> +                                        IA64TargetMachine &tm,
>                                         bool verbose);
>
>  } // End llvm namespace
>
> Modified: llvm/trunk/lib/Target/IA64/IA64TargetMachine.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/IA64/IA64TargetMachine.cpp?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/IA64/IA64TargetMachine.cpp (original)
> +++ llvm/trunk/lib/Target/IA64/IA64TargetMachine.cpp Wed Jul 15 12:27:11 2009
> @@ -20,8 +20,7 @@
>  using namespace llvm;
>
>  // Register the target
> -extern Target TheIA64Target;
> -static RegisterTarget<IA64TargetMachine> X(TheIA64Target, "ia64",
> +static RegisterTarget<IA64TargetMachine> X("ia64",
>                                            "IA-64 (Itanium) [experimental]");
>
>  // No assembler printer by default
> @@ -34,12 +33,36 @@
>   return new IA64TargetAsmInfo(*this);
>  }
>
> +unsigned IA64TargetMachine::getModuleMatchQuality(const Module &M) {
> +  // we match [iI][aA]*64
> +  bool seenIA64=false;
> +  std::string TT = M.getTargetTriple();
> +
> +  if (TT.size() >= 4) {
> +    if( (TT[0]=='i' || TT[0]=='I') &&
> +        (TT[1]=='a' || TT[1]=='A') ) {
> +      for(unsigned int i=2; i<(TT.size()-1); i++)
> +        if(TT[i]=='6' && TT[i+1]=='4')
> +          seenIA64=true;
> +    }
> +
> +    if (seenIA64)
> +      return 20; // strong match
> +  }
> +  // If the target triple is something non-ia64, we don't match.
> +  if (!TT.empty()) return 0;
> +
> +#if defined(__ia64__) || defined(__IA64__)
> +  return 5;
> +#else
> +  return 0;
> +#endif
> +}
> +
>  /// IA64TargetMachine ctor - Create an LP64 architecture model
>  ///
> -IA64TargetMachine::IA64TargetMachine(const Target &T, const Module &M,
> -                                     const std::string &FS)
> -  : LLVMTargetMachine(T),
> -    DataLayout("e-f80:128:128"),
> +IA64TargetMachine::IA64TargetMachine(const Module &M, const std::string &FS)
> +  : DataLayout("e-f80:128:128"),
>     FrameInfo(TargetFrameInfo::StackGrowsDown, 16, 0),
>     TLInfo(*this) { // FIXME? check this stuff
>  }
>
> Modified: llvm/trunk/lib/Target/IA64/IA64TargetMachine.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/IA64/IA64TargetMachine.h?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/IA64/IA64TargetMachine.h (original)
> +++ llvm/trunk/lib/Target/IA64/IA64TargetMachine.h Wed Jul 15 12:27:11 2009
> @@ -37,12 +37,12 @@
>   // To avoid having target depend on the asmprinter stuff libraries, asmprinter
>   // set this functions to ctor pointer at startup time if they are linked in.
>   typedef FunctionPass *(*AsmPrinterCtorFn)(formatted_raw_ostream &o,
> -                                            TargetMachine &tm,
> +                                            IA64TargetMachine &tm,
>                                             bool verbose);
>   static AsmPrinterCtorFn AsmPrinterCtor;
>
>  public:
> -  IA64TargetMachine(const Target &T, const Module &M, const std::string &FS);
> +  IA64TargetMachine(const Module &M, const std::string &FS);
>
>   virtual const IA64InstrInfo      *getInstrInfo() const { return &InstrInfo; }
>   virtual const TargetFrameInfo    *getFrameInfo() const { return &FrameInfo; }
> @@ -55,6 +55,8 @@
>   }
>   virtual const TargetData       *getTargetData() const { return &DataLayout; }
>
> +  static unsigned getModuleMatchQuality(const Module &M);
> +
>   // Pass Pipeline Configuration
>   virtual bool addInstSelector(PassManagerBase &PM, CodeGenOpt::Level OptLevel);
>   virtual bool addPreEmitPass(PassManagerBase &PM, CodeGenOpt::Level OptLevel);
>
> Modified: llvm/trunk/lib/Target/MSIL/MSILWriter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/MSIL/MSILWriter.cpp?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/MSIL/MSILWriter.cpp (original)
> +++ llvm/trunk/lib/Target/MSIL/MSILWriter.cpp Wed Jul 15 12:27:11 2009
> @@ -31,8 +31,8 @@
>   struct VISIBILITY_HIDDEN MSILTarget : public TargetMachine {
>     const TargetData DataLayout;       // Calculates type size & alignment
>
> -    MSILTarget(const Target &T, const Module &M, const std::string &FS)
> -      : TargetMachine(T), DataLayout(&M) {}
> +    MSILTarget(const Module &M, const std::string &FS)
> +      : DataLayout(&M) {}
>
>     virtual bool WantsWholeFile() const { return true; }
>     virtual bool addPassesToEmitWholeFile(PassManager &PM,
> @@ -55,8 +55,7 @@
>  extern "C" int MSILTargetMachineModule;
>  int MSILTargetMachineModule = 0;
>
> -extern Target TheMSILTarget;
> -static RegisterTarget<MSILTarget> X(TheMSILTarget, "msil", "MSIL backend");
> +static RegisterTarget<MSILTarget> X("msil", "MSIL backend");
>
>  // Force static initialization.
>  extern "C" void LLVMInitializeMSILTarget() { }
>
> Modified: llvm/trunk/lib/Target/MSP430/MSP430TargetMachine.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/MSP430/MSP430TargetMachine.cpp?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/MSP430/MSP430TargetMachine.cpp (original)
> +++ llvm/trunk/lib/Target/MSP430/MSP430TargetMachine.cpp Wed Jul 15 12:27:11 2009
> @@ -32,17 +32,14 @@
>
>
>  // Register the targets
> -extern Target TheMSP430Target;
>  static RegisterTarget<MSP430TargetMachine>
> -X(TheMSP430Target, "msp430", "MSP430 [experimental]");
> +X("msp430", "MSP430 [experimental]");
>
>  // Force static initialization.
>  extern "C" void LLVMInitializeMSP430Target() { }
>
> -MSP430TargetMachine::MSP430TargetMachine(const Target &T,
> -                                         const Module &M,
> +MSP430TargetMachine::MSP430TargetMachine(const Module &M,
>                                          const std::string &FS) :
> -  LLVMTargetMachine(T),
>   Subtarget(*this, M, FS),
>   // FIXME: Check TargetData string.
>   DataLayout("e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8"),
> @@ -69,3 +66,14 @@
>   return false;
>  }
>
> +unsigned MSP430TargetMachine::getModuleMatchQuality(const Module &M) {
> +  std::string TT = M.getTargetTriple();
> +
> +  // We strongly match msp430
> +  if (TT.size() >= 6 && TT[0] == 'm' && TT[1] == 's' && TT[2] == 'p' &&
> +      TT[3] == '4' &&  TT[4] == '3' && TT[5] == '0')
> +    return 20;
> +
> +  return 0;
> +}
> +
>
> Modified: llvm/trunk/lib/Target/MSP430/MSP430TargetMachine.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/MSP430/MSP430TargetMachine.h?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/MSP430/MSP430TargetMachine.h (original)
> +++ llvm/trunk/lib/Target/MSP430/MSP430TargetMachine.h Wed Jul 15 12:27:11 2009
> @@ -41,7 +41,7 @@
>   virtual const TargetAsmInfo *createTargetAsmInfo() const;
>
>  public:
> -  MSP430TargetMachine(const Target &T, const Module &M, const std::string &FS);
> +  MSP430TargetMachine(const Module &M, const std::string &FS);
>
>   virtual const TargetFrameInfo *getFrameInfo() const { return &FrameInfo; }
>   virtual const MSP430InstrInfo *getInstrInfo() const  { return &InstrInfo; }
> @@ -60,6 +60,7 @@
>   virtual bool addAssemblyEmitter(PassManagerBase &PM,
>                                   CodeGenOpt::Level OptLevel, bool Verbose,
>                                   formatted_raw_ostream &Out);
> +  static unsigned getModuleMatchQuality(const Module &M);
>  }; // MSP430TargetMachine.
>
>  } // end namespace llvm
>
> Modified: llvm/trunk/lib/Target/Mips/AsmPrinter/MipsAsmPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/AsmPrinter/MipsAsmPrinter.cpp?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/Mips/AsmPrinter/MipsAsmPrinter.cpp (original)
> +++ llvm/trunk/lib/Target/Mips/AsmPrinter/MipsAsmPrinter.cpp Wed Jul 15 12:27:11 2009
> @@ -33,7 +33,6 @@
>  #include "llvm/Target/TargetData.h"
>  #include "llvm/Target/TargetMachine.h"
>  #include "llvm/Target/TargetOptions.h"
> -#include "llvm/Target/TargetRegistry.h"
>  #include "llvm/Support/ErrorHandling.h"
>  #include "llvm/Support/Mangler.h"
>  #include "llvm/ADT/Statistic.h"
> @@ -52,7 +51,7 @@
>   class VISIBILITY_HIDDEN MipsAsmPrinter : public AsmPrinter {
>     const MipsSubtarget *Subtarget;
>   public:
> -    explicit MipsAsmPrinter(formatted_raw_ostream &O, TargetMachine &TM,
> +    explicit MipsAsmPrinter(formatted_raw_ostream &O, MipsTargetMachine &TM,
>                             const TargetAsmInfo *T, bool V)
>       : AsmPrinter(O, TM, T, V) {
>       Subtarget = &TM.getSubtarget<MipsSubtarget>();
> @@ -93,7 +92,7 @@
>  /// using the given target machine description.  This should work
>  /// regardless of whether the function is in SSA form.
>  FunctionPass *llvm::createMipsCodePrinterPass(formatted_raw_ostream &o,
> -                                              TargetMachine &tm,
> +                                              MipsTargetMachine &tm,
>                                               bool verbose) {
>   return new MipsAsmPrinter(o, tm, tm.getTargetAsmInfo(), verbose);
>  }
> @@ -585,11 +584,4 @@
>  }
>
>  // Force static initialization.
> -extern "C" void LLVMInitializeMipsAsmPrinter() {
> -  extern Target TheMipsTarget;
> -  TargetRegistry::RegisterAsmPrinter(TheMipsTarget, createMipsCodePrinterPass);
> -
> -  extern Target TheMipselTarget;
> -  TargetRegistry::RegisterAsmPrinter(TheMipselTarget,
> -                                     createMipsCodePrinterPass);
> -}
> +extern "C" void LLVMInitializeMipsAsmPrinter() { }
>
> Modified: llvm/trunk/lib/Target/Mips/Mips.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/Mips.h?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/Mips/Mips.h (original)
> +++ llvm/trunk/lib/Target/Mips/Mips.h Wed Jul 15 12:27:11 2009
> @@ -26,7 +26,7 @@
>   FunctionPass *createMipsISelDag(MipsTargetMachine &TM);
>   FunctionPass *createMipsDelaySlotFillerPass(MipsTargetMachine &TM);
>   FunctionPass *createMipsCodePrinterPass(formatted_raw_ostream &OS,
> -                                          TargetMachine &TM,
> +                                          MipsTargetMachine &TM,
>                                           bool Verbose);
>  } // end namespace llvm;
>
>
> Modified: llvm/trunk/lib/Target/Mips/MipsTargetMachine.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MipsTargetMachine.cpp?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/Mips/MipsTargetMachine.cpp (original)
> +++ llvm/trunk/lib/Target/Mips/MipsTargetMachine.cpp Wed Jul 15 12:27:11 2009
> @@ -28,12 +28,8 @@
>  int MipsTargetMachineModule = 0;
>
>  // Register the target.
> -extern Target TheMipsTarget;
> -static RegisterTarget<MipsTargetMachine>    X(TheMipsTarget, "mips", "Mips");
> -
> -extern Target TheMipselTarget;
> -static RegisterTarget<MipselTargetMachine>  Y(TheMipselTarget, "mipsel",
> -                                              "Mipsel");
> +static RegisterTarget<MipsTargetMachine>    X("mips", "Mips");
> +static RegisterTarget<MipselTargetMachine>  Y("mipsel", "Mipsel");
>
>  MipsTargetMachine::AsmPrinterCtorFn MipsTargetMachine::AsmPrinterCtor = 0;
>
> @@ -55,9 +51,7 @@
>  // an easier handling.
>  // Using CodeModel::Large enables different CALL behavior.
>  MipsTargetMachine::
> -MipsTargetMachine(const Target &T, const Module &M, const std::string &FS,
> -                  bool isLittle=false):
> -  LLVMTargetMachine(T),
> +MipsTargetMachine(const Module &M, const std::string &FS, bool isLittle=false):
>   Subtarget(*this, M, FS, isLittle),
>   DataLayout(isLittle ? std::string("e-p:32:32:32-i8:8:32-i16:16:32") :
>                         std::string("E-p:32:32:32-i8:8:32-i16:16:32")),
> @@ -76,8 +70,43 @@
>  }
>
>  MipselTargetMachine::
> -MipselTargetMachine(const Target &T, const Module &M, const std::string &FS) :
> -  MipsTargetMachine(T, M, FS, true) {}
> +MipselTargetMachine(const Module &M, const std::string &FS) :
> +  MipsTargetMachine(M, FS, true) {}
> +
> +// return 0 and must specify -march to gen MIPS code.
> +unsigned MipsTargetMachine::
> +getModuleMatchQuality(const Module &M)
> +{
> +  // We strongly match "mips*-*".
> +  std::string TT = M.getTargetTriple();
> +  if (TT.size() >= 5 && std::string(TT.begin(), TT.begin()+5) == "mips-")
> +    return 20;
> +
> +  if (TT.size() >= 13 && std::string(TT.begin(),
> +      TT.begin()+13) == "mipsallegrex-")
> +    return 20;
> +
> +  return 0;
> +}
> +
> +// return 0 and must specify -march to gen MIPSEL code.
> +unsigned MipselTargetMachine::
> +getModuleMatchQuality(const Module &M)
> +{
> +  // We strongly match "mips*el-*".
> +  std::string TT = M.getTargetTriple();
> +  if (TT.size() >= 7 && std::string(TT.begin(), TT.begin()+7) == "mipsel-")
> +    return 20;
> +
> +  if (TT.size() >= 15 && std::string(TT.begin(),
> +      TT.begin()+15) == "mipsallegrexel-")
> +    return 20;
> +
> +  if (TT.size() == 3 && std::string(TT.begin(), TT.begin()+3) == "psp")
> +    return 20;
> +
> +  return 0;
> +}
>
>  // Install an instruction selector pass using
>  // the ISelDag to gen Mips code.
>
> Modified: llvm/trunk/lib/Target/Mips/MipsTargetMachine.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MipsTargetMachine.h?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/Mips/MipsTargetMachine.h (original)
> +++ llvm/trunk/lib/Target/Mips/MipsTargetMachine.h Wed Jul 15 12:27:11 2009
> @@ -38,13 +38,12 @@
>     // asmprinter set this functions to ctor pointer at startup time if they are
>     // linked in.
>     typedef FunctionPass *(*AsmPrinterCtorFn)(formatted_raw_ostream &o,
> -                                              TargetMachine &tm,
> +                                              MipsTargetMachine &tm,
>                                               bool verbose);
>     static AsmPrinterCtorFn AsmPrinterCtor;
>
>   public:
> -    MipsTargetMachine(const Target &T, const Module &M, const std::string &FS,
> -                      bool isLittle);
> +    MipsTargetMachine(const Module &M, const std::string &FS, bool isLittle);
>
>     static void registerAsmPrinter(AsmPrinterCtorFn F) {
>       AsmPrinterCtor = F;
> @@ -67,6 +66,8 @@
>       return const_cast<MipsTargetLowering*>(&TLInfo);
>     }
>
> +    static unsigned getModuleMatchQuality(const Module &M);
> +
>     // Pass Pipeline Configuration
>     virtual bool addInstSelector(PassManagerBase &PM,
>                                  CodeGenOpt::Level OptLevel);
> @@ -81,7 +82,7 @@
>  ///
>  class MipselTargetMachine : public MipsTargetMachine {
>  public:
> -  MipselTargetMachine(const Target &T, const Module &M, const std::string &FS);
> +  MipselTargetMachine(const Module &M, const std::string &FS);
>
>   static unsigned getModuleMatchQuality(const Module &M);
>  };
>
> Modified: llvm/trunk/lib/Target/PIC16/PIC16TargetMachine.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PIC16/PIC16TargetMachine.cpp?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/PIC16/PIC16TargetMachine.cpp (original)
> +++ llvm/trunk/lib/Target/PIC16/PIC16TargetMachine.cpp Wed Jul 15 12:27:11 2009
> @@ -32,31 +32,26 @@
>
>
>  // Register the targets
> -extern Target ThePIC16Target;
>  static RegisterTarget<PIC16TargetMachine>
> -X(ThePIC16Target, "pic16", "PIC16 14-bit [experimental].");
> -
> -extern Target TheCooperTarget;
> +X("pic16", "PIC16 14-bit [experimental].");
>  static RegisterTarget<CooperTargetMachine>
> -Y(TheCooperTarget, "cooper", "PIC16 Cooper [experimental].");
> +Y("cooper", "PIC16 Cooper [experimental].");
>
>  // Force static initialization.
>  extern "C" void LLVMInitializePIC16Target() { }
>
>  // PIC16TargetMachine - Traditional PIC16 Machine.
> -PIC16TargetMachine::PIC16TargetMachine(const Target &T, const Module &M,
> -                                       const std::string &FS, bool Cooper)
> -: LLVMTargetMachine(T),
> -  Subtarget(M, FS, Cooper),
> +PIC16TargetMachine::PIC16TargetMachine(const Module &M, const std::string &FS,
> +                                       bool Cooper)
> +: Subtarget(M, FS, Cooper),
>   DataLayout("e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8"),
>   InstrInfo(*this), TLInfo(*this),
>   FrameInfo(TargetFrameInfo::StackGrowsUp, 8, 0) { }
>
>  // CooperTargetMachine - Uses the same PIC16TargetMachine, but makes IsCooper
>  // as true.
> -CooperTargetMachine::CooperTargetMachine(const Target &T, const Module &M,
> -                                         const std::string &FS)
> -  : PIC16TargetMachine(T, M, FS, true) {}
> +CooperTargetMachine::CooperTargetMachine(const Module &M, const std::string &FS)
> +  : PIC16TargetMachine(M, FS, true) {}
>
>
>  const TargetAsmInfo *PIC16TargetMachine::createTargetAsmInfo() const {
>
> Modified: llvm/trunk/lib/Target/PIC16/PIC16TargetMachine.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PIC16/PIC16TargetMachine.h?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/PIC16/PIC16TargetMachine.h (original)
> +++ llvm/trunk/lib/Target/PIC16/PIC16TargetMachine.h Wed Jul 15 12:27:11 2009
> @@ -41,7 +41,7 @@
>   virtual const TargetAsmInfo *createTargetAsmInfo() const;
>
>  public:
> -  PIC16TargetMachine(const Target &T, const Module &M, const std::string &FS,
> +  PIC16TargetMachine(const Module &M, const std::string &FS,
>                      bool Cooper = false);
>
>   virtual const TargetFrameInfo *getFrameInfo() const { return &FrameInfo; }
> @@ -68,7 +68,7 @@
>  /// CooperTargetMachine
>  class CooperTargetMachine : public PIC16TargetMachine {
>  public:
> -  CooperTargetMachine(const Target &T, const Module &M, const std::string &FS);
> +  CooperTargetMachine(const Module &M, const std::string &FS);
>  }; // CooperTargetMachine.
>
>  } // end namespace llvm
>
> Modified: llvm/trunk/lib/Target/PowerPC/AsmPrinter/PPCAsmPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/AsmPrinter/PPCAsmPrinter.cpp?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/PowerPC/AsmPrinter/PPCAsmPrinter.cpp (original)
> +++ llvm/trunk/lib/Target/PowerPC/AsmPrinter/PPCAsmPrinter.cpp Wed Jul 15 12:27:11 2009
> @@ -43,7 +43,6 @@
>  #include "llvm/Target/TargetRegisterInfo.h"
>  #include "llvm/Target/TargetInstrInfo.h"
>  #include "llvm/Target/TargetOptions.h"
> -#include "llvm/Target/TargetRegistry.h"
>  #include "llvm/ADT/Statistic.h"
>  #include "llvm/ADT/StringExtras.h"
>  #include "llvm/ADT/StringSet.h"
> @@ -318,7 +317,7 @@
>   /// PPCLinuxAsmPrinter - PowerPC assembly printer, customized for Linux
>   class VISIBILITY_HIDDEN PPCLinuxAsmPrinter : public PPCAsmPrinter {
>   public:
> -    explicit PPCLinuxAsmPrinter(formatted_raw_ostream &O, TargetMachine &TM,
> +    explicit PPCLinuxAsmPrinter(formatted_raw_ostream &O, PPCTargetMachine &TM,
>                                 const TargetAsmInfo *T, bool V)
>       : PPCAsmPrinter(O, TM, T, V){}
>
> @@ -344,7 +343,7 @@
>   class VISIBILITY_HIDDEN PPCDarwinAsmPrinter : public PPCAsmPrinter {
>     formatted_raw_ostream &OS;
>   public:
> -    explicit PPCDarwinAsmPrinter(formatted_raw_ostream &O, TargetMachine &TM,
> +    explicit PPCDarwinAsmPrinter(formatted_raw_ostream &O, PPCTargetMachine &TM,
>                                  const TargetAsmInfo *T, bool V)
>       : PPCAsmPrinter(O, TM, T, V), OS(O) {}
>
> @@ -1081,7 +1080,7 @@
>  /// Darwin assembler can deal with.
>  ///
>  FunctionPass *llvm::createPPCAsmPrinterPass(formatted_raw_ostream &o,
> -                                            TargetMachine &tm,
> +                                            PPCTargetMachine &tm,
>                                             bool verbose) {
>   const PPCSubtarget *Subtarget = &tm.getSubtarget<PPCSubtarget>();
>
> @@ -1104,10 +1103,4 @@
>  int PowerPCAsmPrinterForceLink = 0;
>
>  // Force static initialization.
> -extern "C" void LLVMInitializePowerPCAsmPrinter() {
> -  extern Target ThePPC32Target;
> -  TargetRegistry::RegisterAsmPrinter(ThePPC32Target, createPPCAsmPrinterPass);
> -
> -  extern Target ThePPC64Target;
> -  TargetRegistry::RegisterAsmPrinter(ThePPC64Target, createPPCAsmPrinterPass);
> -}
> +extern "C" void LLVMInitializePowerPCAsmPrinter() { }
>
> Modified: llvm/trunk/lib/Target/PowerPC/PPC.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPC.h?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/PowerPC/PPC.h (original)
> +++ llvm/trunk/lib/Target/PowerPC/PPC.h Wed Jul 15 12:27:11 2009
> @@ -30,7 +30,7 @@
>  FunctionPass *createPPCBranchSelectionPass();
>  FunctionPass *createPPCISelDag(PPCTargetMachine &TM);
>  FunctionPass *createPPCAsmPrinterPass(formatted_raw_ostream &OS,
> -                                      TargetMachine &TM,
> +                                      PPCTargetMachine &TM,
>                                       bool Verbose);
>  FunctionPass *createPPCCodeEmitterPass(PPCTargetMachine &TM,
>                                        MachineCodeEmitter &MCE);
>
> Modified: llvm/trunk/lib/Target/PowerPC/PPCTargetMachine.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCTargetMachine.cpp?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/PowerPC/PPCTargetMachine.cpp (original)
> +++ llvm/trunk/lib/Target/PowerPC/PPCTargetMachine.cpp Wed Jul 15 12:27:11 2009
> @@ -30,13 +30,10 @@
>  int PowerPCTargetMachineModule = 0;
>
>  // Register the targets
> -extern Target ThePPC32Target;
>  static RegisterTarget<PPC32TargetMachine>
> -X(ThePPC32Target, "ppc32", "PowerPC 32");
> -
> -extern Target ThePPC64Target;
> +X("ppc32", "PowerPC 32");
>  static RegisterTarget<PPC64TargetMachine>
> -Y(ThePPC64Target, "ppc64", "PowerPC 64");
> +Y("ppc64", "PowerPC 64");
>
>  // Force static initialization.
>  extern "C" void LLVMInitializePowerPCTarget() { }
> @@ -51,10 +48,60 @@
>     return new PPCLinuxTargetAsmInfo(*this);
>  }
>
> -PPCTargetMachine::PPCTargetMachine(const Target&T, const Module &M,
> -                                   const std::string &FS, bool is64Bit)
> -  : LLVMTargetMachine(T),
> -    Subtarget(*this, M, FS, is64Bit),
> +unsigned PPC32TargetMachine::getJITMatchQuality() {
> +#if defined(__POWERPC__) || defined (__ppc__) || defined(_POWER) || defined(__PPC__)
> +  if (sizeof(void*) == 4)
> +    return 10;
> +#endif
> +  return 0;
> +}
> +unsigned PPC64TargetMachine::getJITMatchQuality() {
> +#if defined(__POWERPC__) || defined (__ppc__) || defined(_POWER) || defined(__PPC__)
> +  if (sizeof(void*) == 8)
> +    return 10;
> +#endif
> +  return 0;
> +}
> +
> +unsigned PPC32TargetMachine::getModuleMatchQuality(const Module &M) {
> +  // We strongly match "powerpc-*".
> +  std::string TT = M.getTargetTriple();
> +  if (TT.size() >= 8 && std::string(TT.begin(), TT.begin()+8) == "powerpc-")
> +    return 20;
> +
> +  // If the target triple is something non-powerpc, we don't match.
> +  if (!TT.empty()) return 0;
> +
> +  if (M.getEndianness()  == Module::BigEndian &&
> +      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
> +
> +  return getJITMatchQuality()/2;
> +}
> +
> +unsigned PPC64TargetMachine::getModuleMatchQuality(const Module &M) {
> +  // We strongly match "powerpc64-*".
> +  std::string TT = M.getTargetTriple();
> +  if (TT.size() >= 10 && std::string(TT.begin(), TT.begin()+10) == "powerpc64-")
> +    return 20;
> +
> +  if (M.getEndianness()  == Module::BigEndian &&
> +      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;
> +}
> +
> +
> +PPCTargetMachine::PPCTargetMachine(const Module &M, const std::string &FS,
> +                                   bool is64Bit)
> +  : Subtarget(*this, M, FS, is64Bit),
>     DataLayout(Subtarget.getTargetDataString()), InstrInfo(*this),
>     FrameInfo(*this, is64Bit), JITInfo(*this, is64Bit), TLInfo(*this),
>     InstrItins(Subtarget.getInstrItineraryData()), MachOWriterInfo(*this) {
> @@ -71,15 +118,13 @@
>  /// groups, which typically degrades performance.
>  bool PPCTargetMachine::getEnableTailMergeDefault() const { return false; }
>
> -PPC32TargetMachine::PPC32TargetMachine(const Target &T, const Module &M,
> -                                       const std::string &FS)
> -  : PPCTargetMachine(T, M, FS, false) {
> +PPC32TargetMachine::PPC32TargetMachine(const Module &M, const std::string &FS)
> +  : PPCTargetMachine(M, FS, false) {
>  }
>
>
> -PPC64TargetMachine::PPC64TargetMachine(const Target &T, const Module &M,
> -                                       const std::string &FS)
> -  : PPCTargetMachine(T, M, FS, true) {
> +PPC64TargetMachine::PPC64TargetMachine(const Module &M, const std::string &FS)
> +  : PPCTargetMachine(M, FS, true) {
>  }
>
>
>
> Modified: llvm/trunk/lib/Target/PowerPC/PPCTargetMachine.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCTargetMachine.h?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/PowerPC/PPCTargetMachine.h (original)
> +++ llvm/trunk/lib/Target/PowerPC/PPCTargetMachine.h Wed Jul 15 12:27:11 2009
> @@ -45,13 +45,12 @@
>   // To avoid having target depend on the asmprinter stuff libraries, asmprinter
>   // set this functions to ctor pointer at startup time if they are linked in.
>   typedef FunctionPass *(*AsmPrinterCtorFn)(formatted_raw_ostream &o,
> -                                            TargetMachine &m,
> +                                            PPCTargetMachine &tm,
>                                             bool verbose);
>   static AsmPrinterCtorFn AsmPrinterCtor;
>
>  public:
> -  PPCTargetMachine(const Target &T, const Module &M, const std::string &FS,
> -                   bool is64Bit);
> +  PPCTargetMachine(const Module &M, const std::string &FS, bool is64Bit);
>
>   virtual const PPCInstrInfo     *getInstrInfo() const { return &InstrInfo; }
>   virtual const PPCFrameInfo     *getFrameInfo() const { return &FrameInfo; }
> @@ -104,14 +103,20 @@
>  ///
>  class PPC32TargetMachine : public PPCTargetMachine {
>  public:
> -  PPC32TargetMachine(const Target &T, const Module &M, const std::string &FS);
> +  PPC32TargetMachine(const Module &M, const std::string &FS);
> +
> +  static unsigned getJITMatchQuality();
> +  static unsigned getModuleMatchQuality(const Module &M);
>  };
>
>  /// PPC64TargetMachine - PowerPC 64-bit target machine.
>  ///
>  class PPC64TargetMachine : public PPCTargetMachine {
>  public:
> -  PPC64TargetMachine(const Target &T, const Module &M, const std::string &FS);
> +  PPC64TargetMachine(const Module &M, const std::string &FS);
> +
> +  static unsigned getJITMatchQuality();
> +  static unsigned getModuleMatchQuality(const Module &M);
>  };
>
>  } // end namespace llvm
>
> Modified: llvm/trunk/lib/Target/Sparc/AsmPrinter/SparcAsmPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Sparc/AsmPrinter/SparcAsmPrinter.cpp?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/Sparc/AsmPrinter/SparcAsmPrinter.cpp (original)
> +++ llvm/trunk/lib/Target/Sparc/AsmPrinter/SparcAsmPrinter.cpp Wed Jul 15 12:27:11 2009
> @@ -26,7 +26,6 @@
>  #include "llvm/CodeGen/MachineConstantPool.h"
>  #include "llvm/CodeGen/MachineInstr.h"
>  #include "llvm/Target/TargetAsmInfo.h"
> -#include "llvm/Target/TargetRegistry.h"
>  #include "llvm/Support/ErrorHandling.h"
>  #include "llvm/Support/FormattedStream.h"
>  #include "llvm/Support/Mangler.h"
> @@ -360,8 +359,4 @@
>  }
>
>  // Force static initialization.
> -extern "C" void LLVMInitializeSparcAsmPrinter() {
> -  extern Target TheSparcTarget;
> -  TargetRegistry::RegisterAsmPrinter(TheSparcTarget,
> -                                     createSparcCodePrinterPass);
> -}
> +extern "C" void LLVMInitializeSparcAsmPrinter() { }
>
> Modified: llvm/trunk/lib/Target/Sparc/SparcTargetMachine.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Sparc/SparcTargetMachine.cpp?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/Sparc/SparcTargetMachine.cpp (original)
> +++ llvm/trunk/lib/Target/Sparc/SparcTargetMachine.cpp Wed Jul 15 12:27:11 2009
> @@ -19,8 +19,7 @@
>  using namespace llvm;
>
>  // Register the target.
> -extern Target TheSparcTarget;
> -static RegisterTarget<SparcTargetMachine> X(TheSparcTarget, "sparc", "SPARC");
> +static RegisterTarget<SparcTargetMachine> X("sparc", "SPARC");
>
>  // No assembler printer by default
>  SparcTargetMachine::AsmPrinterCtorFn SparcTargetMachine::AsmPrinterCtor = 0;
> @@ -36,14 +35,38 @@
>
>  /// SparcTargetMachine ctor - Create an ILP32 architecture model
>  ///
> -SparcTargetMachine::SparcTargetMachine(const Target &T, const Module &M,
> -                                       const std::string &FS)
> -  : LLVMTargetMachine(T),
> -    DataLayout("E-p:32:32-f128:128:128"),
> +SparcTargetMachine::SparcTargetMachine(const Module &M, const std::string &FS)
> +  : DataLayout("E-p:32:32-f128:128:128"),
>     Subtarget(M, FS), TLInfo(*this), InstrInfo(Subtarget),
>     FrameInfo(TargetFrameInfo::StackGrowsDown, 8, 0) {
>  }
>
> +unsigned SparcTargetMachine::getModuleMatchQuality(const Module &M) {
> +  std::string TT = M.getTargetTriple();
> +  if (TT.size() >= 6 && std::string(TT.begin(), TT.begin()+6) == "sparc-")
> +    return 20;
> +
> +  // If the target triple is something non-sparc, we don't match.
> +  if (!TT.empty()) return 0;
> +
> +  if (M.getEndianness()  == Module::BigEndian &&
> +      M.getPointerSize() == Module::Pointer32)
> +#ifdef __sparc__
> +    return 20;   // BE/32 ==> Prefer sparc on sparc
> +#else
> +    return 5;    // BE/32 ==> Prefer ppc elsewhere
> +#endif
> +  else if (M.getEndianness() != Module::AnyEndianness ||
> +           M.getPointerSize() != Module::AnyPointerSize)
> +    return 0;                                    // Match for some other target
> +
> +#if defined(__sparc__)
> +  return 10;
> +#else
> +  return 0;
> +#endif
> +}
> +
>  bool SparcTargetMachine::addInstSelector(PassManagerBase &PM,
>                                          CodeGenOpt::Level OptLevel) {
>   PM.add(createSparcISelDag(*this));
>
> Modified: llvm/trunk/lib/Target/Sparc/SparcTargetMachine.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Sparc/SparcTargetMachine.h?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/Sparc/SparcTargetMachine.h (original)
> +++ llvm/trunk/lib/Target/Sparc/SparcTargetMachine.h Wed Jul 15 12:27:11 2009
> @@ -43,7 +43,7 @@
>   static AsmPrinterCtorFn AsmPrinterCtor;
>
>  public:
> -  SparcTargetMachine(const Target &T, const Module &M, const std::string &FS);
> +  SparcTargetMachine(const Module &M, const std::string &FS);
>
>   virtual const SparcInstrInfo *getInstrInfo() const { return &InstrInfo; }
>   virtual const TargetFrameInfo  *getFrameInfo() const { return &FrameInfo; }
> @@ -55,6 +55,7 @@
>     return const_cast<SparcTargetLowering*>(&TLInfo);
>   }
>   virtual const TargetData       *getTargetData() const { return &DataLayout; }
> +  static unsigned getModuleMatchQuality(const Module &M);
>
>   // Pass Pipeline Configuration
>   virtual bool addInstSelector(PassManagerBase &PM, CodeGenOpt::Level OptLevel);
>
> Modified: llvm/trunk/lib/Target/TargetMachine.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/TargetMachine.cpp?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/TargetMachine.cpp (original)
> +++ llvm/trunk/lib/Target/TargetMachine.cpp Wed Jul 15 12:27:11 2009
> @@ -176,8 +176,8 @@
>  // TargetMachine Class
>  //
>
> -TargetMachine::TargetMachine(const Target &T)
> -  : TheTarget(T), AsmInfo(0) {
> +TargetMachine::TargetMachine()
> +  : AsmInfo(0) {
>   // Typically it will be subtargets that will adjust FloatABIType from Default
>   // to Soft or Hard.
>   if (UseSoftFloat)
>
> Modified: llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.h?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.h (original)
> +++ llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.h Wed Jul 15 12:27:11 2009
> @@ -37,7 +37,7 @@
>   MCContext *Context;
>   MCStreamer *Streamer;
>  public:
> -  explicit X86ATTAsmPrinter(formatted_raw_ostream &O, TargetMachine &TM,
> +  explicit X86ATTAsmPrinter(formatted_raw_ostream &O, X86TargetMachine &TM,
>                             const TargetAsmInfo *T, bool V)
>     : AsmPrinter(O, TM, T, V) {
>     Subtarget = &TM.getSubtarget<X86Subtarget>();
>
> Modified: llvm/trunk/lib/Target/X86/AsmPrinter/X86AsmPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/AsmPrinter/X86AsmPrinter.cpp?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/AsmPrinter/X86AsmPrinter.cpp (original)
> +++ llvm/trunk/lib/Target/X86/AsmPrinter/X86AsmPrinter.cpp Wed Jul 15 12:27:11 2009
> @@ -17,7 +17,6 @@
>  #include "X86ATTAsmPrinter.h"
>  #include "X86IntelAsmPrinter.h"
>  #include "X86Subtarget.h"
> -#include "llvm/Target/TargetRegistry.h"
>  using namespace llvm;
>
>  /// createX86CodePrinterPass - Returns a pass that prints the X86 assembly code
> @@ -25,7 +24,7 @@
>  /// machine description.
>  ///
>  FunctionPass *llvm::createX86CodePrinterPass(formatted_raw_ostream &o,
> -                                             TargetMachine &tm,
> +                                             X86TargetMachine &tm,
>                                              bool verbose) {
>   const X86Subtarget *Subtarget = &tm.getSubtarget<X86Subtarget>();
>
> @@ -46,10 +45,4 @@
>  int X86AsmPrinterForceLink = 0;
>
>  // Force static initialization.
> -extern "C" void LLVMInitializeX86AsmPrinter() {
> -  extern Target TheX86_32Target;
> -  TargetRegistry::RegisterAsmPrinter(TheX86_32Target, createX86CodePrinterPass);
> -
> -  extern Target TheX86_64Target;
> -  TargetRegistry::RegisterAsmPrinter(TheX86_64Target, createX86CodePrinterPass);
> -}
> +extern "C" void LLVMInitializeX86AsmPrinter() { }
>
> Modified: llvm/trunk/lib/Target/X86/AsmPrinter/X86IntelAsmPrinter.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/AsmPrinter/X86IntelAsmPrinter.h?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/AsmPrinter/X86IntelAsmPrinter.h (original)
> +++ llvm/trunk/lib/Target/X86/AsmPrinter/X86IntelAsmPrinter.h Wed Jul 15 12:27:11 2009
> @@ -25,7 +25,7 @@
>  namespace llvm {
>
>  struct VISIBILITY_HIDDEN X86IntelAsmPrinter : public AsmPrinter {
> -  explicit X86IntelAsmPrinter(formatted_raw_ostream &O, TargetMachine &TM,
> +  explicit X86IntelAsmPrinter(formatted_raw_ostream &O, X86TargetMachine &TM,
>                               const TargetAsmInfo *T, bool V)
>     : AsmPrinter(O, TM, T, V) {}
>
>
> Modified: llvm/trunk/lib/Target/X86/X86.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86.h?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/X86.h (original)
> +++ llvm/trunk/lib/Target/X86/X86.h Wed Jul 15 12:27:11 2009
> @@ -47,7 +47,7 @@
>  /// using the given target machine description.
>  ///
>  FunctionPass *createX86CodePrinterPass(formatted_raw_ostream &o,
> -                                       TargetMachine &tm,
> +                                       X86TargetMachine &tm,
>                                        bool Verbose);
>
>  /// createX86CodeEmitterPass - Return a pass that emits the collected X86 code
>
> Modified: llvm/trunk/lib/Target/X86/X86TargetMachine.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86TargetMachine.cpp?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/X86TargetMachine.cpp (original)
> +++ llvm/trunk/lib/Target/X86/X86TargetMachine.cpp Wed Jul 15 12:27:11 2009
> @@ -31,18 +31,13 @@
>  int X86TargetMachineModule = 0;
>
>  // Register the target.
> -extern Target TheX86_32Target;
>  static RegisterTarget<X86_32TargetMachine>
> -X(TheX86_32Target, "x86",    "32-bit X86: Pentium-Pro and above");
> -
> -extern Target TheX86_64Target;
> +X("x86",    "32-bit X86: Pentium-Pro and above");
>  static RegisterTarget<X86_64TargetMachine>
> -Y(TheX86_64Target, "x86-64", "64-bit X86: EM64T and AMD64");
> +Y("x86-64", "64-bit X86: EM64T and AMD64");
>
>  // Force static initialization.
> -extern "C" void LLVMInitializeX86Target() {
> -
> -}
> +extern "C" void LLVMInitializeX86Target() { }
>
>  // No assembler printer by default
>  X86TargetMachine::AsmPrinterCtorFn X86TargetMachine::AsmPrinterCtor = 0;
> @@ -66,23 +61,78 @@
>     }
>  }
>
> -X86_32TargetMachine::X86_32TargetMachine(const Target &T, const Module &M,
> -                                         const std::string &FS)
> -  : X86TargetMachine(T, M, FS, false) {
> +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;
> +}
> +
> +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;
> +
> +  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
> +
> +  return getJITMatchQuality()/2;
> +}
> +
> +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_64TargetMachine::X86_64TargetMachine(const Target &T, const Module &M,
> -                                         const std::string &FS)
> -  : X86TargetMachine(T, M, FS, true) {
> +X86_64TargetMachine::X86_64TargetMachine(const Module &M, const std::string &FS)
> +  : X86TargetMachine(M, FS, true) {
>  }
>
>  /// X86TargetMachine ctor - Create an X86 target.
>  ///
> -X86TargetMachine::X86TargetMachine(const Target &T, const Module &M,
> -                                   const std::string &FS, bool is64Bit)
> -  : LLVMTargetMachine(T),
> -    Subtarget(M, FS, is64Bit),
> +X86TargetMachine::X86TargetMachine(const Module &M, const std::string &FS,
> +                                   bool is64Bit)
> +  : Subtarget(M, FS, is64Bit),
>     DataLayout(Subtarget.getDataLayout()),
>     FrameInfo(TargetFrameInfo::StackGrowsDown,
>               Subtarget.getStackAlignment(), Subtarget.is64Bit() ? -8 : -4),
>
> Modified: llvm/trunk/lib/Target/X86/X86TargetMachine.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86TargetMachine.h?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/X86TargetMachine.h (original)
> +++ llvm/trunk/lib/Target/X86/X86TargetMachine.h Wed Jul 15 12:27:11 2009
> @@ -44,13 +44,12 @@
>   // To avoid having target depend on the asmprinter stuff libraries, asmprinter
>   // set this functions to ctor pointer at startup time if they are linked in.
>   typedef FunctionPass *(*AsmPrinterCtorFn)(formatted_raw_ostream &o,
> -                                            TargetMachine &tm,
> +                                            X86TargetMachine &tm,
>                                             bool verbose);
>   static AsmPrinterCtorFn AsmPrinterCtor;
>
>  public:
> -  X86TargetMachine(const Target &T, const Module &M, const std::string &FS,
> -                   bool is64Bit);
> +  X86TargetMachine(const Module &M, const std::string &FS, bool is64Bit);
>
>   virtual const X86InstrInfo     *getInstrInfo() const { return &InstrInfo; }
>   virtual const TargetFrameInfo  *getFrameInfo() const { return &FrameInfo; }
> @@ -67,6 +66,9 @@
>     return Subtarget.isTargetELF() ? &ELFWriterInfo : 0;
>   }
>
> +  static unsigned getModuleMatchQuality(const Module &M);
> +  static unsigned getJITMatchQuality();
> +
>   static void registerAsmPrinter(AsmPrinterCtorFn F) {
>     AsmPrinterCtor = F;
>   }
> @@ -99,7 +101,7 @@
>  ///
>  class X86_32TargetMachine : public X86TargetMachine {
>  public:
> -  X86_32TargetMachine(const Target &T, const Module &M, const std::string &FS);
> +  X86_32TargetMachine(const Module &M, const std::string &FS);
>
>   static unsigned getJITMatchQuality();
>   static unsigned getModuleMatchQuality(const Module &M);
> @@ -109,7 +111,7 @@
>  ///
>  class X86_64TargetMachine : public X86TargetMachine {
>  public:
> -  X86_64TargetMachine(const Target &T, const Module &M, const std::string &FS);
> +  X86_64TargetMachine(const Module &M, const std::string &FS);
>
>   static unsigned getJITMatchQuality();
>   static unsigned getModuleMatchQuality(const Module &M);
>
> Modified: llvm/trunk/lib/Target/XCore/XCoreTargetMachine.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/XCore/XCoreTargetMachine.cpp?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/XCore/XCoreTargetMachine.cpp (original)
> +++ llvm/trunk/lib/Target/XCore/XCoreTargetMachine.cpp Wed Jul 15 12:27:11 2009
> @@ -26,10 +26,9 @@
>  extern "C" int XCoreTargetMachineModule;
>  int XCoreTargetMachineModule = 0;
>
> -extern Target TheXCoreTarget;
>  namespace {
>   // Register the target.
> -  RegisterTarget<XCoreTargetMachine> X(TheXCoreTarget, "xcore", "XCore");
> +  RegisterTarget<XCoreTargetMachine> X("xcore", "XCore");
>  }
>
>  // Force static initialization.
> @@ -41,10 +40,8 @@
>
>  /// XCoreTargetMachine ctor - Create an ILP32 architecture model
>  ///
> -XCoreTargetMachine::XCoreTargetMachine(const Target &T, const Module &M,
> -                                       const std::string &FS)
> -  : LLVMTargetMachine(T),
> -    Subtarget(*this, M, FS),
> +XCoreTargetMachine::XCoreTargetMachine(const Module &M, const std::string &FS)
> +  : Subtarget(*this, M, FS),
>     DataLayout("e-p:32:32:32-a0:0:32-f32:32:32-f64:32:32-i1:8:32-i8:8:32-"
>                "i16:16:32-i32:32:32-i64:32:32"),
>     InstrInfo(),
> @@ -52,6 +49,15 @@
>     TLInfo(*this) {
>  }
>
> +unsigned XCoreTargetMachine::getModuleMatchQuality(const Module &M) {
> +  std::string TT = M.getTargetTriple();
> +  if (TT.size() >= 6 && std::string(TT.begin(), TT.begin()+6) == "xcore-")
> +    return 20;
> +
> +  // Otherwise we don't match.
> +  return 0;
> +}
> +
>  bool XCoreTargetMachine::addInstSelector(PassManagerBase &PM,
>                                          CodeGenOpt::Level OptLevel) {
>   PM.add(createXCoreISelDag(*this));
>
> Modified: llvm/trunk/lib/Target/XCore/XCoreTargetMachine.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/XCore/XCoreTargetMachine.h?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/XCore/XCoreTargetMachine.h (original)
> +++ llvm/trunk/lib/Target/XCore/XCoreTargetMachine.h Wed Jul 15 12:27:11 2009
> @@ -36,7 +36,7 @@
>   virtual const TargetAsmInfo *createTargetAsmInfo() const;
>
>  public:
> -  XCoreTargetMachine(const Target &T, const Module &M, const std::string &FS);
> +  XCoreTargetMachine(const Module &M, const std::string &FS);
>
>   virtual const XCoreInstrInfo *getInstrInfo() const { return &InstrInfo; }
>   virtual const XCoreFrameInfo *getFrameInfo() const { return &FrameInfo; }
> @@ -49,6 +49,7 @@
>     return &InstrInfo.getRegisterInfo();
>   }
>   virtual const TargetData       *getTargetData() const { return &DataLayout; }
> +  static unsigned getModuleMatchQuality(const Module &M);
>
>   // Pass Pipeline Configuration
>   virtual bool addInstSelector(PassManagerBase &PM, CodeGenOpt::Level OptLevel);
>
> Propchange: llvm/trunk/test/Analysis/PointerTracking/
>
> ------------------------------------------------------------------------------
> --- svn:ignore (original)
> +++ svn:ignore (removed)
> @@ -1 +0,0 @@
> -Output
>
> Modified: llvm/trunk/tools/llc/llc.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llc/llc.cpp?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/llc/llc.cpp (original)
> +++ llvm/trunk/tools/llc/llc.cpp Wed Jul 15 12:27:11 2009
> @@ -128,8 +128,7 @@
>   return outputFilename;
>  }
>
> -static formatted_raw_ostream *GetOutputStream(const char *TargetName,
> -                                              const char *ProgName) {
> +static formatted_raw_ostream *GetOutputStream(const char *ProgName) {
>   if (OutputFilename != "") {
>     if (OutputFilename == "-")
>       return &fouts();
> @@ -170,10 +169,10 @@
>   bool Binary = false;
>   switch (FileType) {
>   case TargetMachine::AssemblyFile:
> -    if (TargetName[0] == 'c') {
> -      if (TargetName[1] == 0)
> +    if (MArch->Name[0] == 'c') {
> +      if (MArch->Name[1] == 0)
>         OutputFilename += ".cbe.c";
> -      else if (TargetName[1] == 'p' && TargetName[2] == 'p')
> +      else if (MArch->Name[1] == 'p' && MArch->Name[2] == 'p')
>         OutputFilename += ".cpp";
>       else
>         OutputFilename += ".s";
> @@ -249,13 +248,10 @@
>
>   // Allocate target machine.  First, check whether the user has
>   // explicitly specified an architecture to compile for.
> -  const Target *TheTarget;
> -  if (MArch) {
> -    TheTarget = &MArch->TheTarget;
> -  } else {
> +  if (MArch == 0) {
>     std::string Err;
> -    TheTarget = TargetRegistry::getClosestStaticTargetForModule(mod, Err);
> -    if (TheTarget == 0) {
> +    MArch = TargetMachineRegistry::getClosestStaticTargetForModule(mod, Err);
> +    if (MArch == 0) {
>       errs() << argv[0] << ": error auto-selecting target for module '"
>              << Err << "'.  Please use the -march option to explicitly "
>              << "pick a target.\n";
> @@ -273,13 +269,12 @@
>     FeaturesStr = Features.getString();
>   }
>
> -  std::auto_ptr<TargetMachine>
> -    target(TheTarget->createTargetMachine(mod, FeaturesStr));
> +  std::auto_ptr<TargetMachine> target(MArch->CtorFn(mod, FeaturesStr));
>   assert(target.get() && "Could not allocate target machine!");
>   TargetMachine &Target = *target.get();
>
>   // Figure out where we are going to send the output...
> -  formatted_raw_ostream *Out = GetOutputStream(TheTarget->getName(), argv[0]);
> +  formatted_raw_ostream *Out = GetOutputStream(argv[0]);
>   if (Out == 0) return 1;
>
>   CodeGenOpt::Level OLvl = CodeGenOpt::Default;
>
> Modified: llvm/trunk/tools/lto/LTOCodeGenerator.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lto/LTOCodeGenerator.cpp?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/lto/LTOCodeGenerator.cpp (original)
> +++ llvm/trunk/tools/lto/LTOCodeGenerator.cpp Wed Jul 15 12:27:11 2009
> @@ -328,9 +328,9 @@
>     if ( _target == NULL ) {
>         // create target machine from info for merged modules
>         Module* mergedModule = _linker.getModule();
> -        const Target *march =
> -          TargetRegistry::getClosestStaticTargetForModule(*mergedModule,
> -                                                          errMsg);
> +        const TargetMachineRegistry::entry* march =
> +          TargetMachineRegistry::getClosestStaticTargetForModule(
> +                                                       *mergedModule, errMsg);
>         if ( march == NULL )
>             return true;
>
> @@ -351,7 +351,7 @@
>         // construct LTModule, hand over ownership of module and target
>         std::string FeatureStr =
>           getFeatureString(_linker.getModule()->getTargetTriple().c_str());
> -        _target = march->createTargetMachine(*mergedModule, FeatureStr.c_str());
> +        _target = march->CtorFn(*mergedModule, FeatureStr.c_str());
>     }
>     return false;
>  }
>
> Modified: llvm/trunk/tools/lto/LTOModule.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lto/LTOModule.cpp?rev=75799&r1=75798&r2=75799&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/lto/LTOModule.cpp (original)
> +++ llvm/trunk/tools/lto/LTOModule.cpp Wed Jul 15 12:27:11 2009
> @@ -147,15 +147,15 @@
>     if ( !m )
>         return NULL;
>     // find machine architecture for this module
> -    const Target* march =
> -      TargetRegistry::getClosestStaticTargetForModule(*m, errMsg);
> +    const TargetMachineRegistry::entry* march =
> +            TargetMachineRegistry::getClosestStaticTargetForModule(*m, errMsg);
>
>     if ( march == NULL )
>         return NULL;
>
>     // construct LTModule, hand over ownership of module and target
>     std::string FeatureStr = getFeatureString(m->getTargetTriple().c_str());
> -    TargetMachine* target = march->createTargetMachine(*m, FeatureStr);
> +    TargetMachine* target = march->CtorFn(*m, FeatureStr);
>     return new LTOModule(m.take(), target);
>  }
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>




More information about the llvm-commits mailing list