summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorOwen Anderson <resistor@mac.com>2015-03-10 06:34:57 +0000
committerOwen Anderson <resistor@mac.com>2015-03-10 06:34:57 +0000
commite90f992b219850f06ea6c236e73de4c6725a3dd7 (patch)
tree3047b59752a1ddc9400317daa515572c16e0584f /llvm
parent3e7e67b5eda50ee13e60da4abd4ceb5bb9d4f65f (diff)
downloadbcm5719-llvm-e90f992b219850f06ea6c236e73de4c6725a3dd7.tar.gz
bcm5719-llvm-e90f992b219850f06ea6c236e73de4c6725a3dd7.zip
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
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/AsmParser/LLParser.cpp8
-rw-r--r--llvm/test/Assembler/unsized-recursive-type.ll9
2 files changed, 15 insertions, 2 deletions
diff --git a/llvm/lib/AsmParser/LLParser.cpp b/llvm/lib/AsmParser/LLParser.cpp
index 65e622af66c..c1d2810a5cf 100644
--- a/llvm/lib/AsmParser/LLParser.cpp
+++ b/llvm/lib/AsmParser/LLParser.cpp
@@ -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))
diff --git a/llvm/test/Assembler/unsized-recursive-type.ll b/llvm/test/Assembler/unsized-recursive-type.ll
new file mode 100644
index 00000000000..b6d93fa19fe
--- /dev/null
+++ b/llvm/test/Assembler/unsized-recursive-type.ll
@@ -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
+}
OpenPOWER on IntegriCloud