mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-01-27 03:48:33 +00:00
[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 llvm-svn: 365716
This commit is contained in:
parent
c0ae1be066
commit
31c4d2a40d
@ -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<FunctionDecl>(D))
|
||||
SPDefCache[cast<FunctionDecl>(D)].reset(SP);
|
||||
//
|
||||
// FIXME: Use AbstractCallee here to support ObjCMethodDecl.
|
||||
if (CGM.getCodeGenOpts().EnableDebugEntryValues && HasDecl)
|
||||
if (auto *FD = dyn_cast<FunctionDecl>(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
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user