Related to PR2911, reject as invalid non-pointer GC roots.

llvm-svn: 58143
This commit is contained in:
Gordon Henriksen 2008-10-25 16:28:35 +00:00
parent 5457ce9ac3
commit bf40eee91a
2 changed files with 14 additions and 2 deletions

View File

@ -1347,8 +1347,10 @@ void Verifier::visitIntrinsicFunctionCall(Intrinsic::ID ID, CallInst &CI) {
case Intrinsic::gcwrite:
case Intrinsic::gcread:
if (ID == Intrinsic::gcroot) {
Assert1(isa<AllocaInst>(CI.getOperand(1)->stripPointerCasts()),
"llvm.gcroot parameter #1 must be an alloca.", &CI);
AllocaInst *AI =
dyn_cast<AllocaInst>(CI.getOperand(1)->stripPointerCasts());
Assert1(AI && isa<PointerType>(AI->getType()->getElementType()),
"llvm.gcroot parameter #1 must be a pointer alloca.", &CI);
Assert1(isa<Constant>(CI.getOperand(2)),
"llvm.gcroot parameter #2 must be a constant.", &CI);
}

View File

@ -0,0 +1,10 @@
; RUN: not llvm-as < %s >& /dev/null
declare void @llvm.gcroot(i8**, i8*) nounwind
define void @f() gc "x" {
%st = alloca { i8*, i1 } ; <{ i8*, i1 }*> [#uses=1]
%st_ptr = bitcast { i8*, i1 }* %st to i8** ; <i8**> [#uses=1]
call void @llvm.gcroot(i8** %st_ptr, i8* null)
ret void
}