From e899705c27719afb24d34d194b787d2fc496b39c Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 23 May 2004 21:16:51 +0000 Subject: [PATCH] Recognize and verify the new GC intrinsics. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@13687 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/VMCore/Function.cpp | 5 +++++ lib/VMCore/Verifier.cpp | 22 ++++++++++++++++------ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/lib/VMCore/Function.cpp b/lib/VMCore/Function.cpp index 5b2b0543306..01339e1bb06 100644 --- a/lib/VMCore/Function.cpp +++ b/lib/VMCore/Function.cpp @@ -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; diff --git a/lib/VMCore/Verifier.cpp b/lib/VMCore/Verifier.cpp index b69511bc246..7d8f8ff5619 100644 --- a/lib/VMCore/Verifier.cpp +++ b/lib/VMCore/Verifier.cpp @@ -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(FT->getParamType(0)); + const Type *ReturnType = FT->getReturnType(); Assert1(FT->getNumParams() == 1, "Illegal # arguments for intrinsic function!", IF); - Assert1(isa(ParamType), - "First argument not a pointer!", IF); - Assert1(((cast(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(CI.getOperand(2)) || + isa(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;