diff options
| author | Owen Anderson <resistor@mac.com> | 2015-03-10 06:34:57 +0000 |
|---|---|---|
| committer | Owen Anderson <resistor@mac.com> | 2015-03-10 06:34:57 +0000 |
| commit | e90f992b219850f06ea6c236e73de4c6725a3dd7 (patch) | |
| tree | 3047b59752a1ddc9400317daa515572c16e0584f /llvm/lib/AsmParser/LLParser.cpp | |
| parent | 3e7e67b5eda50ee13e60da4abd4ceb5bb9d4f65f (diff) | |
| download | bcm5719-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/lib/AsmParser/LLParser.cpp')
| -rw-r--r-- | llvm/lib/AsmParser/LLParser.cpp | 8 |
1 files changed, 6 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)) |

