Recognize and verify the new GC intrinsics.
authorChris Lattner <sabre@nondot.org>
Sun, 23 May 2004 21:16:51 +0000 (21:16 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 23 May 2004 21:16:51 +0000 (21:16 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@13687 91177308-0d34-0410-b5e6-96231b3b80d8

lib/VMCore/Function.cpp
lib/VMCore/Verifier.cpp

index 5b2b0543306a104a991376ad97a65ab4352f9e11..01339e1bb06206267d5d9e72c1faf80dd3b15062 100644 (file)
@@ -217,6 +217,11 @@ unsigned Function::getIntrinsicID() const {
   case 'f':
     if (getName() == "llvm.frameaddress")  return Intrinsic::frameaddress;
     break;
+  case 'g':
+    if (getName() == "llvm.gcwrite") return Intrinsic::gcwrite;
+    if (getName() == "llvm.gcread")  return Intrinsic::gcread;
+    if (getName() == "llvm.gcroot")  return Intrinsic::gcroot;
+    break;
   case 'l':
     if (getName() == "llvm.longjmp")  return Intrinsic::longjmp;
     break;
index b69511bc246cc0da94a78966c1ec5224c7837ded..7d8f8ff5619857e1c9fa7f10b12db9b593f1001e 100644 (file)
@@ -653,15 +653,14 @@ void Verifier::visitIntrinsicFunctionCall(Intrinsic::ID ID, CallInst &CI) {
     NumArgs = 1;
     break;
 
-  case Intrinsic:: readio: {
-    const Type * ParamType  = FT->getParamType(0);
-    const Type * ReturnType = FT->getReturnType();
+  case Intrinsic::readio: {
+    const PointerType *ParamType = dyn_cast<PointerType>(FT->getParamType(0));
+    const Type *ReturnType = FT->getReturnType();
 
     Assert1(FT->getNumParams() == 1,
             "Illegal # arguments for intrinsic function!", IF);
-    Assert1(isa<PointerType>(ParamType),
-            "First argument not a pointer!", IF);
-    Assert1(((cast<PointerType>(ParamType)->getElementType()) == ReturnType),
+    Assert1(ParamType, "First argument not a pointer!", IF);
+    Assert1(ParamType->getElementType() == ReturnType,
             "Pointer type doesn't match return type!", IF);
     NumArgs = 1;
     break;
@@ -672,6 +671,17 @@ void Verifier::visitIntrinsicFunctionCall(Intrinsic::ID ID, CallInst &CI) {
   case Intrinsic::sigsetjmp:       NumArgs = 2; break;
   case Intrinsic::siglongjmp:      NumArgs = 2; break;
 
+  case Intrinsic::gcroot:
+    Assert1(FT->getNumParams() == 2,
+            "Illegal # arguments for intrinsic function!", IF);
+    Assert1(isa<Constant>(CI.getOperand(2)) ||
+            isa<GlobalValue>(CI.getOperand(2)),
+            "Second argument to llvm.gcroot must be a constant!", &CI);
+    NumArgs = 2;
+    break;
+  case Intrinsic::gcread:          NumArgs = 1; break;
+  case Intrinsic::gcwrite:         NumArgs = 2; break;
+
   case Intrinsic::dbg_stoppoint:   NumArgs = 4; break;
   case Intrinsic::dbg_region_start:NumArgs = 1; break;
   case Intrinsic::dbg_region_end:  NumArgs = 1; break;