[llvm-commits] [llvm] r65404 - in /llvm/trunk: include/llvm/Intrinsics.h include/llvm/Target/TargetIntrinsicInfo.h lib/VMCore/Function.cpp utils/TableGen/IntrinsicEmitter.cpp utils/TableGen/IntrinsicEmitter.h
Mon P Wang
wangmp at apple.com
Tue Feb 24 15:17:49 PST 2009
Author: wangmp
Date: Tue Feb 24 17:17:49 2009
New Revision: 65404
URL: http://llvm.org/viewvc/llvm-project?rev=65404&view=rev
Log:
Added support to have TableGen provide information if an intrinsic (core
or target) can be overloaded or not.
Modified:
llvm/trunk/include/llvm/Intrinsics.h
llvm/trunk/include/llvm/Target/TargetIntrinsicInfo.h
llvm/trunk/lib/VMCore/Function.cpp
llvm/trunk/utils/TableGen/IntrinsicEmitter.cpp
llvm/trunk/utils/TableGen/IntrinsicEmitter.h
Modified: llvm/trunk/include/llvm/Intrinsics.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Intrinsics.h?rev=65404&r1=65403&r2=65404&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Intrinsics.h (original)
+++ llvm/trunk/include/llvm/Intrinsics.h Tue Feb 24 17:17:49 2009
@@ -49,6 +49,10 @@
///
const FunctionType *getType(ID id, const Type **Tys = 0, unsigned numTys = 0);
+ /// Intrinsic::isOverloaded(ID) - Returns true if the intrinsic can be
+ /// overloaded.
+ bool isOverloaded(ID id);
+
/// Intrinsic::getAttributes(ID) - Return the attributes for an intrinsic.
///
AttrListPtr getAttributes(ID id);
Modified: llvm/trunk/include/llvm/Target/TargetIntrinsicInfo.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetIntrinsicInfo.h?rev=65404&r1=65403&r2=65404&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Target/TargetIntrinsicInfo.h (original)
+++ llvm/trunk/include/llvm/Target/TargetIntrinsicInfo.h Tue Feb 24 17:17:49 2009
@@ -18,6 +18,7 @@
class Function;
class Module;
+class Type;
//---------------------------------------------------------------------------
///
@@ -39,7 +40,19 @@
virtual Function *getDeclaration(Module *M, const char *BuiltinName) const {
return 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;
+ }
+
+ // Returns true if the Builtin can be overloaded.
+ virtual bool isOverloaded(Module *M, const char *BuiltinName) const {
+ return false;
+ }
+
virtual unsigned getIntrinsicID(Function *F) const { return 0; }
};
Modified: llvm/trunk/lib/VMCore/Function.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Function.cpp?rev=65404&r1=65403&r2=65404&view=diff
==============================================================================
--- llvm/trunk/lib/VMCore/Function.cpp (original)
+++ llvm/trunk/lib/VMCore/Function.cpp Tue Feb 24 17:17:49 2009
@@ -356,6 +356,16 @@
return FunctionType::get(ResultTy, ArgTys, IsVarArg);
}
+bool Intrinsic::isOverloaded(ID id) {
+ const bool OTable[] = {
+ false,
+#define GET_INTRINSIC_OVERLOAD_TABLE
+#include "llvm/Intrinsics.gen"
+#undef GET_INTRINSIC_OVERLOAD_TABLE
+ };
+ return OTable[id];
+}
+
/// This defines the "Intrinsic::getAttributes(ID id)" method.
#define GET_INTRINSIC_ATTRIBUTES
#include "llvm/Intrinsics.gen"
Modified: llvm/trunk/utils/TableGen/IntrinsicEmitter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/IntrinsicEmitter.cpp?rev=65404&r1=65403&r2=65404&view=diff
==============================================================================
--- llvm/trunk/utils/TableGen/IntrinsicEmitter.cpp (original)
+++ llvm/trunk/utils/TableGen/IntrinsicEmitter.cpp Tue Feb 24 17:17:49 2009
@@ -35,7 +35,10 @@
// Emit the intrinsic ID -> name table.
EmitIntrinsicToNameTable(Ints, OS);
-
+
+ // Emit the intrinsic ID -> overload table.
+ EmitIntrinsicToOverloadTable(Ints, OS);
+
// Emit the function name recognizer.
EmitFnNameRecognizer(Ints, OS);
@@ -120,6 +123,23 @@
OS << "#endif\n\n";
}
+void IntrinsicEmitter::
+EmitIntrinsicToOverloadTable(const std::vector<CodeGenIntrinsic> &Ints,
+ std::ostream &OS) {
+ OS << "// Intrinsic ID to overload table\n";
+ OS << "#ifdef GET_INTRINSIC_OVERLOAD_TABLE\n";
+ OS << " // Note that entry #0 is the invalid intrinsic!\n";
+ for (unsigned i = 0, e = Ints.size(); i != e; ++i) {
+ OS << " ";
+ if (Ints[i].isOverloaded)
+ OS << "true";
+ else
+ OS << "false";
+ OS << ",\n";
+ }
+ OS << "#endif\n\n";
+}
+
static void EmitTypeForValueType(std::ostream &OS, MVT::SimpleValueType VT) {
if (MVT(VT).isInteger()) {
unsigned BitWidth = MVT(VT).getSizeInBits();
Modified: llvm/trunk/utils/TableGen/IntrinsicEmitter.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/IntrinsicEmitter.h?rev=65404&r1=65403&r2=65404&view=diff
==============================================================================
--- llvm/trunk/utils/TableGen/IntrinsicEmitter.h (original)
+++ llvm/trunk/utils/TableGen/IntrinsicEmitter.h Tue Feb 24 17:17:49 2009
@@ -36,6 +36,8 @@
std::ostream &OS);
void EmitIntrinsicToNameTable(const std::vector<CodeGenIntrinsic> &Ints,
std::ostream &OS);
+ void EmitIntrinsicToOverloadTable(const std::vector<CodeGenIntrinsic> &Ints,
+ std::ostream &OS);
void EmitVerifier(const std::vector<CodeGenIntrinsic> &Ints,
std::ostream &OS);
void EmitGenerator(const std::vector<CodeGenIntrinsic> &Ints,
More information about the llvm-commits
mailing list