Fix a stack overflow in the assembler when checking that GEPs must be over sized types.

We failed to use a marking set to properly handle recursive types, which caused use
to recurse infinitely and eventually overflow the stack.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@231760 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Owen Anderson 2015-03-10 06:34:57 +00:00
parent 4935faa4ee
commit bb6a88c25d
2 changed files with 15 additions and 2 deletions

View File

@ -2810,7 +2810,9 @@ bool LLParser::ParseValID(ValID &ID, PerFunctionState *PFS) {
}
}
if (!Indices.empty() && !BasePointerType->getElementType()->isSized())
SmallPtrSet<const Type*, 4> Visited;
if (!Indices.empty() &&
!BasePointerType->getElementType()->isSized(&Visited))
return Error(ID.Loc, "base element of getelementptr must be sized");
if (!GetElementPtrInst::getIndexedType(Elts[0]->getType(), Indices))
@ -5496,7 +5498,9 @@ int LLParser::ParseGetElementPtr(Instruction *&Inst, PerFunctionState &PFS) {
Indices.push_back(Val);
}
if (!Indices.empty() && !BasePointerType->getElementType()->isSized())
SmallPtrSet<const Type*, 4> Visited;
if (!Indices.empty() &&
!BasePointerType->getElementType()->isSized(&Visited))
return Error(Loc, "base element of getelementptr must be sized");
if (!GetElementPtrInst::getIndexedType(BaseType, Indices))

View File

@ -0,0 +1,9 @@
; RUN: not llvm-as < %s 2>&1 | FileCheck %s
; CHECK: base element of getelementptr must be sized
%myTy = type { %myTy }
define void @foo(%myTy* %p){
%0 = getelementptr %myTy, %myTy* %p, i32 0
ret void
}