[SelectionDAG] Add a SDTCisSameSizeAs type constraint that can be used to ensure...
[oota-llvm.git] / include / llvm / Target / TargetIntrinsicInfo.h
index c14275f52a4ce1c307e66c71177ddb207756a8f4..c630f5b12a15d020c7e009480ace26652565e862 100644 (file)
@@ -14,6 +14,9 @@
 #ifndef LLVM_TARGET_TARGETINTRINSICINFO_H
 #define LLVM_TARGET_TARGETINTRINSICINFO_H
 
+#include "llvm/Support/Compiler.h"
+#include <string>
+
 namespace llvm {
 
 class Function;
@@ -25,35 +28,36 @@ class Type;
 /// TargetIntrinsicInfo - Interface to description of machine instruction set
 ///
 class TargetIntrinsicInfo {
-  
-  const char **Intrinsics;               // Raw array to allow static init'n
-  unsigned NumIntrinsics;                // Number of entries in the desc array
-
-  TargetIntrinsicInfo(const TargetIntrinsicInfo &);  // DO NOT IMPLEMENT
-  void operator=(const TargetIntrinsicInfo &);   // DO NOT IMPLEMENT
+  TargetIntrinsicInfo(const TargetIntrinsicInfo &) = delete;
+  void operator=(const TargetIntrinsicInfo &) = delete;
 public:
-  TargetIntrinsicInfo(const char **desc, unsigned num);
+  TargetIntrinsicInfo();
   virtual ~TargetIntrinsicInfo();
 
-  unsigned getNumIntrinsics() const { return NumIntrinsics; }
+  /// Return the name of a target intrinsic, e.g. "llvm.bfin.ssync".
+  /// The Tys and numTys parameters are for intrinsics with overloaded types
+  /// (e.g., those using iAny or fAny). For a declaration for an overloaded
+  /// intrinsic, Tys should point to an array of numTys pointers to Type,
+  /// and must provide exactly one type for each overloaded type in the
+  /// intrinsic.
+  virtual std::string getName(unsigned IID, Type **Tys = nullptr,
+                              unsigned numTys = 0) const = 0;
 
-  virtual Function *getDeclaration(Module *M, const char *BuiltinName) const {
-    return 0;
-  }
+  /// Look up target intrinsic by name. Return intrinsic ID or 0 for unknown
+  /// names.
+  virtual unsigned lookupName(const char *Name, unsigned Len) const =0;
 
-  // Returns the Function declaration for intrinsic BuiltinName.  If the
-  // intrinsic can be overloaded, uses Tys to return the correct function.
-  virtual Function *getDeclaration(Module *M, const char *BuiltinName,
-                                   const Type **Tys, unsigned numTys) const {
-    return 0;
-  }
+  /// Return the target intrinsic ID of a function, or 0.
+  virtual unsigned getIntrinsicID(Function *F) const;
 
-  // Returns true if the Builtin can be overloaded.
-  virtual bool isOverloaded(Module *M, const char *BuiltinName) const {
-    return false;
-  }
+  /// Returns true if the intrinsic can be overloaded.
+  virtual bool isOverloaded(unsigned IID) const = 0;
 
-  virtual unsigned getIntrinsicID(Function *F) const { return 0; }
+  /// Create or insert an LLVM Function declaration for an intrinsic,
+  /// and return it. The Tys and numTys are for intrinsics with overloaded
+  /// types. See above for more information.
+  virtual Function *getDeclaration(Module *M, unsigned ID, Type **Tys = nullptr,
+                                   unsigned numTys = 0) const = 0;
 };
 
 } // End llvm namespace