From 8ae5e0b154ae18a78f73c0aef58356002b8ff0d7 Mon Sep 17 00:00:00 2001 From: Adrian Prantl Date: Tue, 17 Aug 2021 13:58:40 -0700 Subject: [PATCH] Add missing nullptr check Unfortunatley the IR Verifier doesn't reject debug intrinsics that have nullptr as arguments, so coro::salvageDebugInfo for now also needs to deal with them. rdar://81979541 --- llvm/lib/Transforms/Coroutines/CoroFrame.cpp | 4 +++- llvm/test/Transforms/Coroutines/coro-debug.ll | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/llvm/lib/Transforms/Coroutines/CoroFrame.cpp b/llvm/lib/Transforms/Coroutines/CoroFrame.cpp index e4ef23c..e213de2 100644 --- a/llvm/lib/Transforms/Coroutines/CoroFrame.cpp +++ b/llvm/lib/Transforms/Coroutines/CoroFrame.cpp @@ -2514,7 +2514,7 @@ void coro::salvageDebugInfo( bool OutermostLoad = true; Value *Storage = DVI->getVariableLocationOp(0); Value *OriginalStorage = Storage; - while (auto *Inst = dyn_cast(Storage)) { + while (auto *Inst = dyn_cast_or_null(Storage)) { if (auto *LdInst = dyn_cast(Inst)) { Storage = LdInst->getOperand(0); // FIXME: This is a heuristic that works around the fact that @@ -2543,6 +2543,8 @@ void coro::salvageDebugInfo( Expr = DIExpression::appendOpsToArg(Expr, Ops, 0, /*StackValue*/ false); } } + if (!Storage) + return; // Store a pointer to the coroutine frame object in an alloca so it // is available throughout the function when producing unoptimized diff --git a/llvm/test/Transforms/Coroutines/coro-debug.ll b/llvm/test/Transforms/Coroutines/coro-debug.ll index 1e86b65..ec5924f 100644 --- a/llvm/test/Transforms/Coroutines/coro-debug.ll +++ b/llvm/test/Transforms/Coroutines/coro-debug.ll @@ -34,8 +34,10 @@ sw.bb: ; preds = %entry call void @llvm.dbg.declare(metadata i32 %direct, metadata !25, metadata !13), !dbg !14 call void @llvm.dbg.declare(metadata i32* %x.addr, metadata !12, metadata !13), !dbg !14 call void @llvm.dbg.declare(metadata i8** %coro_hdl, metadata !15, metadata !13), !dbg !16 - call void @llvm.dbg.declare(metadata i8* null, metadata !28, metadata !13), !dbg !16 call void @llvm.dbg.declare(metadata i32* %late_local, metadata !29, metadata !13), !dbg !16 + ; don't crash when encountering nonsensical debug info, verfifier doesn't yet reject these + call void @llvm.dbg.declare(metadata i8* null, metadata !28, metadata !13), !dbg !16 + call void @llvm.dbg.declare(metadata !{}, metadata !28, metadata !13), !dbg !16 br label %next, !dbg !18 next: -- 2.7.4