From dfb7a74bfe4a5ead8fbecd73c054a8c4a32b7a4b Mon Sep 17 00:00:00 2001 From: David Blaikie Date: Wed, 14 May 2014 00:29:00 +0000 Subject: [PATCH] DebugInfo: Avoid creating DILexicalScopeFiles when the filename in the current scope has not changed. This looks like the right way for this check to work, but there is another semi-obvious bug, I would think: why is CurLoc not zero'd out between functions? The possibility for it to bleed between them seems problematic. (& indeed I caused tests to fail when I fixed this a different way, by setting CurLoc to SourceLocation() and the end of EmitFunctionEnd... ) The changes to debug-info-blocks.m are due to a mismatch between the source manager's file naming and CGDebugInfo's default handling when no -main-file-name is specified. This actually reveals somewhat of a bug in the debug info when using source files from standard in, too. See the comment in CGDebugInfo::CreateCompileUnit for more details. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@208742 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGDebugInfo.cpp | 18 +++++++++++------- test/CodeGen/debug-info-scope-file.c | 20 ++++++++++++++++++++ test/CodeGenObjC/debug-info-blocks.m | 2 +- 3 files changed, 32 insertions(+), 8 deletions(-) create mode 100644 test/CodeGen/debug-info-scope-file.c diff --git a/lib/CodeGen/CGDebugInfo.cpp b/lib/CodeGen/CGDebugInfo.cpp index 4279e4985e..acdce84e15 100644 --- a/lib/CodeGen/CGDebugInfo.cpp +++ b/lib/CodeGen/CGDebugInfo.cpp @@ -112,17 +112,14 @@ void CGDebugInfo::setLocation(SourceLocation Loc) { if (LexicalBlockStack.empty()) return; SourceManager &SM = CGM.getContext().getSourceManager(); + llvm::DIScope Scope(LexicalBlockStack.back()); PresumedLoc PCLoc = SM.getPresumedLoc(CurLoc); - PresumedLoc PPLoc = SM.getPresumedLoc(PrevLoc); - if (PCLoc.isInvalid() || PPLoc.isInvalid() || - !strcmp(PPLoc.getFilename(), PCLoc.getFilename())) + if (PCLoc.isInvalid() || Scope.getFilename() == PCLoc.getFilename()) return; - llvm::MDNode *LB = LexicalBlockStack.back(); - llvm::DIScope Scope = llvm::DIScope(LB); if (Scope.isLexicalBlockFile()) { - llvm::DILexicalBlockFile LBF = llvm::DILexicalBlockFile(LB); + llvm::DILexicalBlockFile LBF = llvm::DILexicalBlockFile(Scope); llvm::DIDescriptor D = DBuilder.createLexicalBlockFile(LBF.getScope(), getOrCreateFile(CurLoc)); @@ -317,11 +314,18 @@ StringRef CGDebugInfo::getCurrentDirname() { /// CreateCompileUnit - Create new compile unit. void CGDebugInfo::CreateCompileUnit() { + // Should we be asking the SourceManager for the main file name, instead of + // accepting it as an argument? This just causes the main file name to + // mismatch with source locations and create extra lexical scopes or + // mismatched debug info (a CU with a DW_AT_file of "-", because that's what + // the driver passed, but functions/other things have DW_AT_file of "" + // because that's what the SourceManager says) + // Get absolute path name. SourceManager &SM = CGM.getContext().getSourceManager(); std::string MainFileName = CGM.getCodeGenOpts().MainFileName; if (MainFileName.empty()) - MainFileName = ""; + MainFileName = ""; // The main file name provided via the "-main-file-name" option contains just // the file name itself with no path information. This file name may have had diff --git a/test/CodeGen/debug-info-scope-file.c b/test/CodeGen/debug-info-scope-file.c new file mode 100644 index 0000000000..3479ade7a3 --- /dev/null +++ b/test/CodeGen/debug-info-scope-file.c @@ -0,0 +1,20 @@ +// RUN: %clang_cc1 -g -emit-llvm < %s | FileCheck %s + +// Check that, just because we emitted a function from a different file doesn't +// mean we insert a file-change inside the next function. + +// CHECK: ret void, !dbg [[F1_LINE:![0-9]*]] +// CHECK: ret void, !dbg [[F2_LINE:![0-9]*]] +// CHECK: [[F1:![0-9]*]] = {{.*}} ; [ DW_TAG_subprogram ] {{.*}} [def] [f1] +// CHECK: [[F2:![0-9]*]] = {{.*}} ; [ DW_TAG_subprogram ] {{.*}} [def] [f2] +// CHECK: [[F1_LINE]] = {{.*}}, metadata [[F1]], null} +// CHECK: [[F2_LINE]] = {{.*}}, metadata [[F2]], null} + +void f1() { +} + +# 2 "foo.c" + +void f2() { +} + diff --git a/test/CodeGenObjC/debug-info-blocks.m b/test/CodeGenObjC/debug-info-blocks.m index 63068a9ca9..d025ca87d5 100644 --- a/test/CodeGenObjC/debug-info-blocks.m +++ b/test/CodeGenObjC/debug-info-blocks.m @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -emit-llvm -fblocks -g -triple x86_64-apple-darwin10 -fobjc-dispatch-method=mixed %s -o - | FileCheck %s +// RUN: %clang_cc1 -emit-llvm -fblocks -g -triple x86_64-apple-darwin10 -fobjc-dispatch-method=mixed -x objective-c < %s -o - | FileCheck %s // rdar://problem/9279956 // Test that we generate the proper debug location for a captured self. -- 2.40.0