diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/include/llvm/Target/TargetRegistry.h | 62 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/MCTargetDesc/X86TargetDesc.cpp | 6 | ||||
| -rw-r--r-- | llvm/utils/TableGen/InstrInfoEmitter.cpp | 10 | 
3 files changed, 77 insertions, 1 deletions
diff --git a/llvm/include/llvm/Target/TargetRegistry.h b/llvm/include/llvm/Target/TargetRegistry.h index cf338992d14..071198f9570 100644 --- a/llvm/include/llvm/Target/TargetRegistry.h +++ b/llvm/include/llvm/Target/TargetRegistry.h @@ -33,6 +33,7 @@ namespace llvm {    class MCContext;    class MCDisassembler;    class MCInstPrinter; +  class MCInstrInfo;    class MCRegisterInfo;    class MCStreamer;    class TargetAsmBackend; @@ -66,6 +67,7 @@ namespace llvm {      typedef MCAsmInfo *(*AsmInfoCtorFnTy)(const Target &T,                                            StringRef TT); +    typedef MCInstrInfo *(*MCInstrInfoCtorFnTy)(void);      typedef MCRegisterInfo *(*MCRegInfoCtorFnTy)(void);      typedef TargetMachine *(*TargetMachineCtorTy)(const Target &T,                                                    const std::string &TT, @@ -126,6 +128,10 @@ namespace llvm {      /// registered.      AsmInfoCtorFnTy AsmInfoCtorFn; +    /// MCInstrInfoCtorFn - Constructor function for this target's MCInstrInfo, +    /// if registered. +    MCInstrInfoCtorFnTy MCInstrInfoCtorFn; +      /// MCRegInfoCtorFn - Constructor function for this target's MCRegisterInfo,      /// if registered.      MCRegInfoCtorFnTy MCRegInfoCtorFn; @@ -239,6 +245,14 @@ namespace llvm {        return AsmInfoCtorFn(*this, Triple);      } +    /// createMCInstrInfo - Create a MCInstrInfo implementation. +    /// +    MCInstrInfo *createMCInstrInfo() const { +      if (!MCInstrInfoCtorFn) +        return 0; +      return MCInstrInfoCtorFn(); +    } +      /// createMCRegInfo - Create a MCRegisterInfo implementation.      ///      MCRegisterInfo *createMCRegInfo() const { @@ -460,6 +474,21 @@ namespace llvm {          T.AsmInfoCtorFn = Fn;      } +    /// RegisterMCInstrInfo - Register a MCInstrInfo implementation for the +    /// given target. +    /// +    /// Clients are responsible for ensuring that registration doesn't occur +    /// while another thread is attempting to access the registry. Typically +    /// this is done by initializing all targets at program startup. +    /// +    /// @param T - The target being registered. +    /// @param Fn - A function to construct a MCInstrInfo for the target. +    static void RegisterMCInstrInfo(Target &T, Target::MCInstrInfoCtorFnTy Fn) { +      // Ignore duplicate registration. +      if (!T.MCInstrInfoCtorFn) +        T.MCInstrInfoCtorFn = Fn; +    } +      /// RegisterMCRegInfo - Register a MCRegisterInfo implementation for the      /// given target.      /// @@ -685,6 +714,39 @@ namespace llvm {      }    }; +  /// RegisterMCInstrInfo - Helper template for registering a target instruction +  /// info implementation.  This invokes the static "Create" method on the class +  /// to actually do the construction.  Usage: +  /// +  /// extern "C" void LLVMInitializeFooTarget() { +  ///   extern Target TheFooTarget; +  ///   RegisterMCInstrInfo<FooMCInstrInfo> X(TheFooTarget); +  /// } +  template<class MCInstrInfoImpl> +  struct RegisterMCInstrInfo { +    RegisterMCInstrInfo(Target &T) { +      TargetRegistry::RegisterMCInstrInfo(T, &Allocator); +    } +  private: +    static MCInstrInfo *Allocator() { +      return new MCInstrInfoImpl(); +    } +  }; + +  /// RegisterMCInstrInfoFn - Helper template for registering a target +  /// instruction info implementation.  This invokes the specified function to +  /// do the construction.  Usage: +  /// +  /// extern "C" void LLVMInitializeFooTarget() { +  ///   extern Target TheFooTarget; +  ///   RegisterMCInstrInfoFn X(TheFooTarget, TheFunction); +  /// } +  struct RegisterMCInstrInfoFn { +    RegisterMCInstrInfoFn(Target &T, Target::MCInstrInfoCtorFnTy Fn) { +      TargetRegistry::RegisterMCInstrInfo(T, Fn); +    } +  }; +    /// RegisterMCRegInfo - Helper template for registering a target register info    /// implementation.  This invokes the static "Create" method on the class to    /// actually do the construction.  Usage: diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86TargetDesc.cpp b/llvm/lib/Target/X86/MCTargetDesc/X86TargetDesc.cpp index 77bfbb9e74c..44d10979ca2 100644 --- a/llvm/lib/Target/X86/MCTargetDesc/X86TargetDesc.cpp +++ b/llvm/lib/Target/X86/MCTargetDesc/X86TargetDesc.cpp @@ -24,6 +24,12 @@  using namespace llvm; +MCInstrInfo *createX86MCInstrInfo() { +  MCInstrInfo *X = new MCInstrInfo(); +  InitX86MCInstrInfo(X); +  return X; +} +  MCRegisterInfo *createX86MCRegisterInfo() {    MCRegisterInfo *X = new MCRegisterInfo();    InitX86MCRegisterInfo(X); diff --git a/llvm/utils/TableGen/InstrInfoEmitter.cpp b/llvm/utils/TableGen/InstrInfoEmitter.cpp index 2f21ea6e399..7b90663716d 100644 --- a/llvm/utils/TableGen/InstrInfoEmitter.cpp +++ b/llvm/utils/TableGen/InstrInfoEmitter.cpp @@ -206,7 +206,15 @@ void InstrInfoEmitter::run(raw_ostream &OS) {    for (unsigned i = 0, e = NumberedInstructions.size(); i != e; ++i)      emitRecord(*NumberedInstructions[i], i, InstrInfo, EmittedLists,                 OperandInfoIDs, OS); -  OS << "};\n"; +  OS << "};\n\n"; + + +  // MCInstrInfo initialization routine. +  OS << "static inline void Init" << TargetName +     << "MCInstrInfo(MCInstrInfo *II) {\n"; +  OS << "  II->InitMCInstrInfo(" << TargetName << "Insts, " +     << NumberedInstructions.size() << ");\n}\n\n"; +    OS << "} // End llvm namespace \n";    OS << "#endif // GET_INSTRINFO_MC_DESC\n\n";  | 

