Author: gordon Date: Mon Dec 24 20:02:10 2007 New Revision: 45349 URL: http://llvm.org/viewvc/llvm-project?rev=45349&view=rev Log: Adjusting verification of "llvm.gc*" intrinsic prototypes to match LangRef.
Added: llvm/trunk/test/CodeGen/Generic/GC/badreadproto.ll llvm/trunk/test/CodeGen/Generic/GC/badrootproto.ll llvm/trunk/test/CodeGen/Generic/GC/badwriteproto.ll Modified: llvm/trunk/lib/VMCore/Verifier.cpp llvm/trunk/test/CodeGen/Generic/GC/lower_gcroot.ll Modified: llvm/trunk/lib/VMCore/Verifier.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Verifier.cpp?rev=45349&r1=45348&r2=45349&view=diff ============================================================================== --- llvm/trunk/lib/VMCore/Verifier.cpp (original) +++ llvm/trunk/lib/VMCore/Verifier.cpp Mon Dec 24 20:02:10 2007 @@ -1153,12 +1153,6 @@ InstsInThisBlock.insert(&I); } -static bool HasPtrPtrType(Value *Val) { - if (const PointerType *PtrTy = dyn_cast<PointerType>(Val->getType())) - return isa<PointerType>(PtrTy->getElementType()); - return false; -} - /// visitIntrinsicFunction - Allow intrinsics to be verified in different ways. /// void Verifier::visitIntrinsicFunctionCall(Intrinsic::ID ID, CallInst &CI) { @@ -1173,30 +1167,43 @@ switch (ID) { default: break; - case Intrinsic::gcroot: - Assert1(HasPtrPtrType(CI.getOperand(1)), - "llvm.gcroot parameter #1 must be a pointer to a pointer.", &CI); - Assert1(isa<AllocaInst>(IntrinsicInst::StripPointerCasts(CI.getOperand(1))), - "llvm.gcroot parameter #1 must be an alloca (or a bitcast of one).", - &CI); - Assert1(isa<Constant>(CI.getOperand(2)), - "llvm.gcroot parameter #2 must be a constant.", &CI); - break; - case Intrinsic::gcwrite: - Assert1(CI.getOperand(3)->getType() - == PointerType::getUnqual(CI.getOperand(1)->getType()), - "Call to llvm.gcwrite must be with type 'void (%ty*, %ty2*, %ty**)'.", - &CI); - break; - case Intrinsic::gcread: - Assert1(CI.getOperand(2)->getType() == PointerType::getUnqual(CI.getType()), - "Call to llvm.gcread must be with type '%ty* (%ty2*, %ty**).'", - &CI); - break; + case Intrinsic::gcroot: { + Type *PtrTy = PointerType::getUnqual(Type::Int8Ty), + *PtrPtrTy = PointerType::getUnqual(PtrTy); + Assert1(CI.getOperand(1)->getType() == PtrPtrTy, + "Intrinsic parameter #1 is not i8**.", &CI); + Assert1(CI.getOperand(2)->getType() == PtrTy, + "Intrinsic parameter #2 is not i8*.", &CI); + Assert1( + isa<AllocaInst>(IntrinsicInst::StripPointerCasts(CI.getOperand(1))), + "llvm.gcroot parameter #1 must be an alloca.", + &CI); + Assert1(isa<Constant>(CI.getOperand(2)), + "llvm.gcroot parameter #2 must be a constant.", &CI); + } break; + case Intrinsic::gcwrite: { + Type *PtrTy = PointerType::getUnqual(Type::Int8Ty), + *PtrPtrTy = PointerType::getUnqual(PtrTy); + Assert1(CI.getOperand(1)->getType() == PtrTy, + "Intrinsic parameter #1 is not a i8*.", &CI); + Assert1(CI.getOperand(2)->getType() == PtrTy, + "Intrinsic parameter #2 is not a i8*.", &CI); + Assert1(CI.getOperand(3)->getType() == PtrPtrTy, + "Intrinsic parameter #3 is not a i8**.", &CI); + } break; + case Intrinsic::gcread: { + Type *PtrTy = PointerType::getUnqual(Type::Int8Ty), + *PtrPtrTy = PointerType::getUnqual(PtrTy); + Assert1(CI.getOperand(1)->getType() == PtrTy, + "Intrinsic parameter #1 is not a i8*.", &CI); + Assert1(CI.getOperand(2)->getType() == PtrPtrTy, + "Intrinsic parameter #2 is not a i8**.", &CI); + } break; case Intrinsic::init_trampoline: Assert1(isa<Function>(IntrinsicInst::StripPointerCasts(CI.getOperand(2))), "llvm.init_trampoline parameter #2 must resolve to a function.", &CI); + break; } } Added: llvm/trunk/test/CodeGen/Generic/GC/badreadproto.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Generic/GC/badreadproto.ll?rev=45349&view=auto ============================================================================== --- llvm/trunk/test/CodeGen/Generic/GC/badreadproto.ll (added) +++ llvm/trunk/test/CodeGen/Generic/GC/badreadproto.ll Mon Dec 24 20:02:10 2007 @@ -0,0 +1,13 @@ +; RUN: not llvm-as < %s + + %list = type { i32, %list* } + +; This usage is invalid now; instead, objects must be bitcast to i8* for input +; to the gc intrinsics. +declare %list* @llvm.gcread(%list*, %list**) + +define %list* @tl(%list* %l) gc "example" { + %hd.ptr = getelementptr %list* %l, i32 0, i32 0 + %hd = call %list* @llvm.gcread(%list* %l, %list** %hd.ptr) + ret i32 %tmp +} Added: llvm/trunk/test/CodeGen/Generic/GC/badrootproto.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Generic/GC/badrootproto.ll?rev=45349&view=auto ============================================================================== --- llvm/trunk/test/CodeGen/Generic/GC/badrootproto.ll (added) +++ llvm/trunk/test/CodeGen/Generic/GC/badrootproto.ll Mon Dec 24 20:02:10 2007 @@ -0,0 +1,13 @@ +; RUN: not llvm-as < %s + + %list = type { i32, %list* } + %meta = type opaque + +; This usage is invalid now; instead, objects must be bitcast to i8* for input +; to the gc intrinsics. +declare void @llvm.gcroot(%list*, %meta*) + +define void @root() gc "example" { + %x.var = alloca i8* + call void @llvm.gcroot(i8** %x.var, %meta* null) +} Added: llvm/trunk/test/CodeGen/Generic/GC/badwriteproto.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Generic/GC/badwriteproto.ll?rev=45349&view=auto ============================================================================== --- llvm/trunk/test/CodeGen/Generic/GC/badwriteproto.ll (added) +++ llvm/trunk/test/CodeGen/Generic/GC/badwriteproto.ll Mon Dec 24 20:02:10 2007 @@ -0,0 +1,22 @@ +; RUN: not llvm-as < %s + + %list = type { i32, %list* } + +; This usage is invalid now; instead, objects must be bitcast to i8* for input +; to the gc intrinsics. +declare void @llvm.gcwrite(%list*, %list*, %list**) + +define %list* @cons(i32 %hd, %list* %tl) gc "example" { + %tmp = call i8* @gcalloc(i32 bitcast(%list* getelementptr(%list* null, i32 1) to i32)) + %cell = bitcast i8* %tmp to %list* + + %hd.ptr = getelementptr %list* %cell, i32 0, i32 0 + store i32 %hd, i32* %hd.ptr + + %tl.ptr = getelementptr %list* %cell, i32 0, i32 0 + call void @llvm.gcwrite(%list* %tl, %list* %cell, %list** %tl.ptr) + + ret %cell.2 +} + +declare i8* @gcalloc(i32) Modified: llvm/trunk/test/CodeGen/Generic/GC/lower_gcroot.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Generic/GC/lower_gcroot.ll?rev=45349&r1=45348&r2=45349&view=diff ============================================================================== --- llvm/trunk/test/CodeGen/Generic/GC/lower_gcroot.ll (original) +++ llvm/trunk/test/CodeGen/Generic/GC/lower_gcroot.ll Mon Dec 24 20:02:10 2007 @@ -1,6 +1,6 @@ ; RUN: llvm-as < %s | llc - %Env = type opaque* + %Env = type i8* define void @.main(%Env) { %Root = alloca %Env _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits