diff --git a/llvm/lib/CodeGen/StackProtector.cpp b/llvm/lib/CodeGen/StackProtector.cpp --- a/llvm/lib/CodeGen/StackProtector.cpp +++ b/llvm/lib/CodeGen/StackProtector.cpp @@ -170,7 +170,8 @@ // If this instruction accesses memory make sure it doesn't access beyond // the bounds of the allocated object. Optional MemLoc = MemoryLocation::getOrNone(I); - if (MemLoc.hasValue() && MemLoc->Size.getValue() > AllocSize) + if (MemLoc.hasValue() && MemLoc->Size.hasValue() && + MemLoc->Size.getValue() > AllocSize) return true; switch (I->getOpcode()) { case Instruction::Store: diff --git a/llvm/test/CodeGen/X86/stack-guard-memloc-vararg.ll b/llvm/test/CodeGen/X86/stack-guard-memloc-vararg.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/X86/stack-guard-memloc-vararg.ll @@ -0,0 +1,17 @@ +; RUN: llc -mtriple=x86_64 -O0 < %s | FileCheck %s + +; Check that we don't crash on this input. +; CHECK-LABEL: @foo +; CHECK: __stack_chk_guard +; CHECK: retq +define hidden void @foo(i8** %ptr) #0 { +entry: + %args.addr = alloca i8*, align 8 + %0 = va_arg i8** %args.addr, i8* + store i8* %0, i8** %ptr + ret void +} + +attributes #0 = { sspstrong } +attributes #1 = { optsize } +