mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
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. llvm-svn: 231760
This commit is contained in:
parent
b10fb77aca
commit
a93b443224
@ -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))
|
||||
|
9
test/Assembler/unsized-recursive-type.ll
Normal file
9
test/Assembler/unsized-recursive-type.ll
Normal 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
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user