diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp index 4279e4985e85..acdce84e1572 100644 --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/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/clang/test/CodeGen/debug-info-scope-file.c b/clang/test/CodeGen/debug-info-scope-file.c new file mode 100644 index 000000000000..3479ade7a329 --- /dev/null +++ b/clang/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/clang/test/CodeGenObjC/debug-info-blocks.m b/clang/test/CodeGenObjC/debug-info-blocks.m index 63068a9ca980..d025ca87d560 100644 --- a/clang/test/CodeGenObjC/debug-info-blocks.m +++ b/clang/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.