From c272d4e6deaeb32baa1b73087fb3f5f53b966d88 Mon Sep 17 00:00:00 2001 From: Vedant Kumar Date: Thu, 11 Jul 2019 00:09:16 +0000 Subject: [PATCH] [CGDebugInfo] Fix -femit-debug-entry-values crash on os_log_helpers An os_log_helper FunctionDecl may not have a body. Ignore these for the purposes of debug entry value emission. Fixes an assertion failure seen in a stage2 build of clang: Assertion failed: (FD->hasBody() && "Functions must have body here"), function analyzeParametersModification git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@365716 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGDebugInfo.cpp | 9 ++++++--- test/CodeGen/debug-info-param-modification.c | 13 +++++++++++-- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/lib/CodeGen/CGDebugInfo.cpp b/lib/CodeGen/CGDebugInfo.cpp index f49d1ef878..f6ee7ee26d 100644 --- a/lib/CodeGen/CGDebugInfo.cpp +++ b/lib/CodeGen/CGDebugInfo.cpp @@ -3587,9 +3587,12 @@ void CGDebugInfo::EmitFunctionStart(GlobalDecl GD, SourceLocation Loc, // We use the SPDefCache only in the case when the debug entry values option // is set, in order to speed up parameters modification analysis. - if (CGM.getCodeGenOpts().EnableDebugEntryValues && HasDecl && - isa(D)) - SPDefCache[cast(D)].reset(SP); + // + // FIXME: Use AbstractCallee here to support ObjCMethodDecl. + if (CGM.getCodeGenOpts().EnableDebugEntryValues && HasDecl) + if (auto *FD = dyn_cast(D)) + if (FD->hasBody() && !FD->param_empty()) + SPDefCache[FD].reset(SP); if (CGM.getCodeGenOpts().DwarfVersion >= 5) { // Starting with DWARF V5 method declarations are emitted as children of diff --git a/test/CodeGen/debug-info-param-modification.c b/test/CodeGen/debug-info-param-modification.c index ef7ff92256..f2aa4c7290 100644 --- a/test/CodeGen/debug-info-param-modification.c +++ b/test/CodeGen/debug-info-param-modification.c @@ -1,12 +1,21 @@ -// RUN: %clang -Xclang -femit-debug-entry-values -g -O2 -S -target x86_64-none-linux-gnu -emit-llvm %s -o - | FileCheck %s -check-prefix=CHECK-ENTRY-VAL-OPT +// RUN: %clang -Xclang -femit-debug-entry-values -g -O2 -Xclang -disable-llvm-passes -S -target x86_64-none-linux-gnu -emit-llvm %s -o - | FileCheck %s -check-prefix=CHECK-ENTRY-VAL-OPT // CHECK-ENTRY-VAL-OPT: !DILocalVariable(name: "a", arg: 1, scope: {{.*}}, file: {{.*}}, line: {{.*}}, type: {{.*}}) // CHECK-ENTRY-VAL-OPT: !DILocalVariable(name: "b", arg: 2, scope: {{.*}}, file: {{.*}}, line: {{.*}}, type: {{.*}}, flags: DIFlagArgumentNotModified) // -// RUN: %clang -g -O2 -target x86_64-none-linux-gnu -S -emit-llvm %s -o - | FileCheck %s +// For the os_log_helper: +// CHECK-ENTRY-VAL-OPT: !DILocalVariable(name: "buffer", arg: 1, {{.*}}, flags: DIFlagArtificial) +// +// RUN: %clang -g -O2 -Xclang -disable-llvm-passes -target x86_64-none-linux-gnu -S -emit-llvm %s -o - | FileCheck %s // CHECK-NOT: !DILocalVariable(name: "b", arg: 2, scope: {{.*}}, file: {{.*}}, line: {{.*}}, type: {{.*}}, flags: DIFlagArgumentNotModified) // +// For the os_log_helper: +// CHECK: !DILocalVariable(name: "buffer", arg: 1, {{.*}}, flags: DIFlagArtificial) int fn2 (int a, int b) { ++a; return b; } + +void test_builtin_os_log(void *buf, int i, const char *data) { + __builtin_os_log_format(buf, "%d %{public}s %{private}.16P", i, data, data); +} -- 2.40.0