aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Laskey <jlaskey@mac.com>2007-02-06 18:02:54 +0000
committerJim Laskey <jlaskey@mac.com>2007-02-06 18:02:54 +0000
commitba4cc09f51eaf7bf7dff12bb4bb405caab3c29d1 (patch)
treed3cb20b6a959aec67805d5619906572c775cf5a3
parent53a58106d418db0acfe6a0c0821164158ed1ef2b (diff)
Support var arg intrinsics.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@33962 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/Intrinsics.td7
-rw-r--r--lib/VMCore/Verifier.cpp4
-rw-r--r--utils/TableGen/FileLexer.l2
-rw-r--r--utils/TableGen/IntrinsicEmitter.cpp5
4 files changed, 17 insertions, 1 deletions
diff --git a/include/llvm/Intrinsics.td b/include/llvm/Intrinsics.td
index 3fc55f79da..bda4a927bb 100644
--- a/include/llvm/Intrinsics.td
+++ b/include/llvm/Intrinsics.td
@@ -88,6 +88,8 @@ def llvm_v4i32_ty : LLVMPackedType<v4i32, 4, llvm_i32_ty>; // 4 x i32
def llvm_v4f32_ty : LLVMPackedType<v4f32, 4, llvm_float_ty>; // 4 x float
def llvm_v2f64_ty : LLVMPackedType<v2f64, 2, llvm_double_ty>;// 2 x double
+def ... : LLVMType<isVoid, "...">; // vararg
+
//===----------------------------------------------------------------------===//
// Intrinsic Definitions.
//===----------------------------------------------------------------------===//
@@ -217,6 +219,11 @@ def int_dbg_func_start : Intrinsic<[llvm_void_ty, llvm_descriptor_ty]>;
def int_dbg_declare : Intrinsic<[llvm_void_ty, llvm_ptr_ty,
llvm_descriptor_ty]>;
+//===------------------ Exception Handling Intrinsics----------------------===//
+//
+def int_eh_exception : Intrinsic<[llvm_ptr_ty]>;
+def int_eh_handlers : Intrinsic<[llvm_ptr_ty, llvm_ptr_ty, ...]>;
+
//===----------------------------------------------------------------------===//
// Target-specific intrinsics
//===----------------------------------------------------------------------===//
diff --git a/lib/VMCore/Verifier.cpp b/lib/VMCore/Verifier.cpp
index f5b0550d88..c2fd8746b7 100644
--- a/lib/VMCore/Verifier.cpp
+++ b/lib/VMCore/Verifier.cpp
@@ -987,6 +987,10 @@ void Verifier::VerifyIntrinsicPrototype(Function *F, ...) {
for (unsigned ArgNo = 0; 1; ++ArgNo) {
int TypeID = va_arg(VA, int);
+ if (TypeID == -2) {
+ break;
+ }
+
if (TypeID == -1) {
if (ArgNo != FTy->getNumParams()+1)
CheckFailed("Intrinsic prototype has too many arguments!", F);
diff --git a/utils/TableGen/FileLexer.l b/utils/TableGen/FileLexer.l
index cc6825f5e0..fa89b8ba04 100644
--- a/utils/TableGen/FileLexer.l
+++ b/utils/TableGen/FileLexer.l
@@ -176,7 +176,7 @@ using namespace llvm;
Comment \/\/.*
-Identifier [a-zA-Z_][0-9a-zA-Z_]*
+Identifier [a-zA-Z_][0-9a-zA-Z_]*|\.\.\.
Integer [-+]?[0-9]+|0x[0-9a-fA-F]+|0b[01]+
CodeFragment \[\{([^}]+|\}[^\]])*\}\]
StringVal \"[^"]*\"
diff --git a/utils/TableGen/IntrinsicEmitter.cpp b/utils/TableGen/IntrinsicEmitter.cpp
index 7cd03751de..9a1132a275 100644
--- a/utils/TableGen/IntrinsicEmitter.cpp
+++ b/utils/TableGen/IntrinsicEmitter.cpp
@@ -109,6 +109,11 @@ EmitIntrinsicToNameTable(const std::vector<CodeGenIntrinsic> &Ints,
}
static void EmitTypeVerify(std::ostream &OS, Record *ArgType) {
+ if (ArgType->getValueAsString("TypeVal") == "...") {
+ OS << "-2, ";
+ return;
+ }
+
OS << "(int)" << ArgType->getValueAsString("TypeVal") << ", ";
// If this is an integer type, check the width is correct.
if (ArgType->isSubClassOf("LLVMIntegerType"))