forked from OSchip/llvm-project
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. llvm-svn: 208742
This commit is contained in:
parent
e24614f74e
commit
aabde05da1
|
@ -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 "<stdin>"
|
||||
// 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 = "<unknown>";
|
||||
MainFileName = "<stdin>";
|
||||
|
||||
// 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
|
||||
|
|
|
@ -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() {
|
||||
}
|
||||
|
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue