Index: lib/CodeGen/CGDebugInfo.h =================================================================== --- lib/CodeGen/CGDebugInfo.h +++ lib/CodeGen/CGDebugInfo.h @@ -377,7 +377,9 @@ /// Emit metadata to indicate a change in line/column information in /// the source file. If the location is invalid, the previous /// location will be reused. - void EmitLocation(CGBuilderTy &Builder, SourceLocation Loc); + /// \param ImplicitCode True if the Loc must have coverage information + void EmitLocation(CGBuilderTy &Builder, SourceLocation Loc, + bool ImplicitCode = false); /// Emit a call to llvm.dbg.function.start to indicate /// start of a new function. @@ -657,16 +659,19 @@ /// location or preferred location of the specified Expr. class ApplyDebugLocation { private: - void init(SourceLocation TemporaryLocation, bool DefaultToEmpty = false); + void init(SourceLocation TemporaryLocation, bool DefaultToEmpty = false, + bool ImplicitCode = false); ApplyDebugLocation(CodeGenFunction &CGF, bool DefaultToEmpty, - SourceLocation TemporaryLocation); + SourceLocation TemporaryLocation, + bool ImplicitCode = false); llvm::DebugLoc OriginalLocation; CodeGenFunction *CGF; public: /// Set the location to the (valid) TemporaryLocation. - ApplyDebugLocation(CodeGenFunction &CGF, SourceLocation TemporaryLocation); + ApplyDebugLocation(CodeGenFunction &CGF, SourceLocation TemporaryLocation, + bool ImplicitCode = false); ApplyDebugLocation(CodeGenFunction &CGF, const Expr *E); ApplyDebugLocation(CodeGenFunction &CGF, llvm::DebugLoc Loc); ApplyDebugLocation(ApplyDebugLocation &&Other) : CGF(Other.CGF) { @@ -687,7 +692,8 @@ /// SourceLocation to CGDebugInfo::setLocation() will result in the /// last valid location being reused. static ApplyDebugLocation CreateArtificial(CodeGenFunction &CGF) { - return ApplyDebugLocation(CGF, false, SourceLocation()); + return ApplyDebugLocation(CGF, false, SourceLocation(), + true /* ImplicitCode */); } /// Apply TemporaryLocation if it is valid. Otherwise switch /// to an artificial debug location that has a valid scope, but no @@ -695,7 +701,8 @@ static ApplyDebugLocation CreateDefaultArtificial(CodeGenFunction &CGF, SourceLocation TemporaryLocation) { - return ApplyDebugLocation(CGF, false, TemporaryLocation); + return ApplyDebugLocation(CGF, false, TemporaryLocation, + true /* ImplicitCode */); } /// Set the IRBuilder to not attach debug locations. Note that Index: lib/CodeGen/CGDebugInfo.cpp =================================================================== --- lib/CodeGen/CGDebugInfo.cpp +++ lib/CodeGen/CGDebugInfo.cpp @@ -76,20 +76,22 @@ } ApplyDebugLocation::ApplyDebugLocation(CodeGenFunction &CGF, - SourceLocation TemporaryLocation) + SourceLocation TemporaryLocation, + bool ImplicitCode) : CGF(&CGF) { - init(TemporaryLocation); + init(TemporaryLocation, false /* DefaultToEmpty */, ImplicitCode); } ApplyDebugLocation::ApplyDebugLocation(CodeGenFunction &CGF, bool DefaultToEmpty, - SourceLocation TemporaryLocation) + SourceLocation TemporaryLocation, + bool ImplicitCode) : CGF(&CGF) { - init(TemporaryLocation, DefaultToEmpty); + init(TemporaryLocation, DefaultToEmpty, ImplicitCode); } void ApplyDebugLocation::init(SourceLocation TemporaryLocation, - bool DefaultToEmpty) { + bool DefaultToEmpty, bool ImplicitCode) { auto *DI = CGF->getDebugInfo(); if (!DI) { CGF = nullptr; @@ -102,7 +104,7 @@ return; if (TemporaryLocation.isValid()) { - DI->EmitLocation(CGF->Builder, TemporaryLocation); + DI->EmitLocation(CGF->Builder, TemporaryLocation, ImplicitCode); return; } @@ -3484,7 +3486,8 @@ setInlinedAt(llvm::DebugLoc(CurInlinedAt).getInlinedAt()); } -void CGDebugInfo::EmitLocation(CGBuilderTy &Builder, SourceLocation Loc) { +void CGDebugInfo::EmitLocation(CGBuilderTy &Builder, SourceLocation Loc, + bool ImplicitCode) { // Update our current location setLocation(Loc); @@ -3492,8 +3495,9 @@ return; llvm::MDNode *Scope = LexicalBlockStack.back(); - Builder.SetCurrentDebugLocation(llvm::DebugLoc::get( - getLineNumber(CurLoc), getColumnNumber(CurLoc), Scope, CurInlinedAt)); + Builder.SetCurrentDebugLocation( + llvm::DebugLoc::get(getLineNumber(CurLoc), getColumnNumber(CurLoc), Scope, + CurInlinedAt, ImplicitCode)); } void CGDebugInfo::CreateLexicalBlock(SourceLocation Loc) { @@ -3540,7 +3544,7 @@ assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!"); // Provide an entry in the line table for the end of the block. - EmitLocation(Builder, Loc); + EmitLocation(Builder, Loc, true /* ImplicitCode */); if (DebugKind <= codegenoptions::DebugLineTablesOnly) return; @@ -3556,7 +3560,7 @@ // Pop all regions for this function. while (LexicalBlockStack.size() != RCount) { // Provide an entry in the line table for the end of the block. - EmitLocation(Builder, CurLoc); + EmitLocation(Builder, CurLoc, true /* ImplicitCode */); LexicalBlockStack.pop_back(); } FnBeginRegionCount.pop_back(); Index: lib/CodeGen/CodeGenFunction.h =================================================================== --- lib/CodeGen/CodeGenFunction.h +++ lib/CodeGen/CodeGenFunction.h @@ -786,7 +786,7 @@ // If we should perform a cleanup, force them now. Note that // this ends the cleanup scope before rescoping any labels. if (PerformCleanup) { - ApplyDebugLocation DL(CGF, Range.getEnd()); + ApplyDebugLocation DL(CGF, Range.getEnd(), true /* ImplicitCode */); ForceCleanup(); } } Index: lib/CodeGen/CodeGenFunction.cpp =================================================================== --- lib/CodeGen/CodeGenFunction.cpp +++ lib/CodeGen/CodeGenFunction.cpp @@ -317,7 +317,7 @@ if (OnlySimpleReturnStmts) DI->EmitLocation(Builder, LastStopPoint); else - DI->EmitLocation(Builder, EndLoc); + DI->EmitLocation(Builder, EndLoc, true /* ImplicitCode */); } // Pop any cleanups that might have been associated with the @@ -333,7 +333,7 @@ // the ret after it's been at EndLoc. if (CGDebugInfo *DI = getDebugInfo()) if (OnlySimpleReturnStmts) - DI->EmitLocation(Builder, EndLoc); + DI->EmitLocation(Builder, EndLoc, true /* ImplicitCode */); PopCleanupBlocks(PrologueCleanupDepth); } @@ -1179,7 +1179,7 @@ } // Emit a location at the end of the prologue. if (CGDebugInfo *DI = getDebugInfo()) - DI->EmitLocation(Builder, StartLoc); + DI->EmitLocation(Builder, StartLoc, true /* ImplicitCode */); // TODO: Do we need to handle this in two places like we do with // target-features/target-cpu? Index: test/CodeGen/debug-info-scope-file.c =================================================================== --- test/CodeGen/debug-info-scope-file.c +++ test/CodeGen/debug-info-scope-file.c @@ -5,10 +5,11 @@ // CHECK: ret void, !dbg [[F1_LINE:![0-9]*]] // CHECK: ret void, !dbg [[F2_LINE:![0-9]*]] -// CHECK: [[F1:![0-9]*]] = distinct !DISubprogram(name: "f1",{{.*}} isDefinition: true -// CHECK: [[F1_LINE]] = !DILocation({{.*}}, scope: [[F1]]) -// CHECK: [[F2:![0-9]*]] = distinct !DISubprogram(name: "f2",{{.*}} isDefinition: true -// CHECK: [[F2_LINE]] = !DILocation({{.*}}, scope: [[F2]]) +// CHECK: [[F1:![0-9]*]] = distinct !DISubprogram(name: "f1",{{.*}} +// isDefinition: true CHECK: [[F1_LINE]] = !DILocation({{.*}}, scope: [[F1]], +// isImplicitCode: true) CHECK: [[F2:![0-9]*]] = distinct !DISubprogram(name: +// "f2",{{.*}} isDefinition: true CHECK: [[F2_LINE]] = !DILocation({{.*}}, +// scope: [[F2]], isImplicitCode: true) void f1() { } Index: test/CodeGenCXX/debug-info-inheriting-constructor.cpp =================================================================== --- test/CodeGenCXX/debug-info-inheriting-constructor.cpp +++ test/CodeGenCXX/debug-info-inheriting-constructor.cpp @@ -21,5 +21,6 @@ // CHECK-DAG: ![[LOC]] = !DILocation(line: 0, scope: ![[A]], inlinedAt: ![[INL:[0-9]+]]) // CHECK-DAG: ![[INL]] = !DILocation(line: [[@LINE+1]], scope: ![[FOO]]) B b(0); -// CHECK: ![[NOINL]] = !DILocation(line: [[@LINE+1]], scope: !{{[0-9]+}}) + // CHECK: ![[NOINL]] = !DILocation(line: [[@LINE+1]], scope: !{{[0-9]+}}, + // isImplicitCode: true) } Index: test/CodeGenCXX/debug-info-nested-exprs.cpp =================================================================== --- test/CodeGenCXX/debug-info-nested-exprs.cpp +++ test/CodeGenCXX/debug-info-nested-exprs.cpp @@ -37,7 +37,6 @@ // NESTED: call i32 @{{.*}}bar{{.*}}, !dbg ![[BAR:[0-9]+]] // NESTED: call i32 @{{.*}}baz{{.*}}, !dbg ![[BAZ:[0-9]+]] // NESTED: call i32 @{{.*}}qux{{.*}}, !dbg ![[QUX:[0-9]+]] - // NESTED: store i32 {{.*}}, i32* %a,{{.*}} !dbg ![[BAR]] // COLUMNS: call i32 @{{.*}}bar{{.*}}, !dbg ![[BAR:[0-9]+]] // COLUMNS: call i32 @{{.*}}baz{{.*}}, !dbg ![[BAZ:[0-9]+]] // COLUMNS: call i32 @{{.*}}qux{{.*}}, !dbg ![[QUX:[0-9]+]] @@ -98,7 +97,6 @@ // NONEST: store i32 %{{[^,]+}}, i32* %d,{{.*}} !dbg ![[DECLD]] // NESTED: call i32 @{{.*}}noargs{{.*}}, !dbg ![[DNOARGS:[0-9]+]] // NESTED: call i32 @{{.*}}onearg{{.*}}, !dbg ![[DECLD:[0-9]+]] - // NESTED: store i32 %{{[^,]+}}, i32* %d,{{.*}} !dbg ![[DECLD]] // COLUMNS: call i32 @{{.*}}noargs{{.*}}, !dbg ![[DNOARGS:[0-9]+]] // COLUMNS: call i32 @{{.*}}onearg{{.*}}, !dbg ![[DONEARG:[0-9]+]] // COLUMNS: store i32 %{{[^,]+}}, i32* %d,{{.*}} !dbg ![[DECLD:[0-9]+]] @@ -178,16 +176,16 @@ // NESTED: ![[RETSUB]] = !DILocation( // NESTED: ![[RETMUL]] = !DILocation( -// COLUMNS: ![[DECLA]] = !DILocation( // COLUMNS: ![[BAR]] = !DILocation( // COLUMNS: ![[BAZ]] = !DILocation( // COLUMNS: ![[QUX]] = !DILocation( +// COLUMNS: ![[DECLA]] = !DILocation( // COLUMNS: ![[ILOC]] = !DILocation( // COLUMNS: ![[BLOC]] = !DILocation( // COLUMNS: ![[CLOC]] = !DILocation( -// COLUMNS: ![[DECLD]] = !DILocation( // COLUMNS: ![[DNOARGS]] = !DILocation( // COLUMNS: ![[DONEARG]] = !DILocation( +// COLUMNS: ![[DECLD]] = !DILocation( // COLUMNS: ![[SETDNOARGS]] = !DILocation( // COLUMNS: ![[SETDONEARG]] = !DILocation( // COLUMNS: ![[SETD]] = !DILocation( Index: test/CodeGenCXX/linetable-virtual-variadic.cpp =================================================================== --- test/CodeGenCXX/linetable-virtual-variadic.cpp +++ test/CodeGenCXX/linetable-virtual-variadic.cpp @@ -11,12 +11,12 @@ void Derived::VariadicFunction(...) { } -// CHECK: define void @_ZN7Derived16VariadicFunctionEz({{.*}} !dbg ![[SP:[0-9]+]] -// CHECK: ret void, !dbg ![[LOC:[0-9]+]] -// CHECK: define void @_ZT{{.+}}N7Derived16VariadicFunctionEz({{.*}} !dbg ![[SP_I:[0-9]+]] -// CHECK: ret void, !dbg ![[LOC_I:[0-9]+]] +// CHECK: define void @_ZN7Derived16VariadicFunctionEz({{.*}} !dbg +// ![[SP:[0-9]+]] CHECK: ret void, !dbg ![[LOC:[0-9]+]] CHECK: define void +// @_ZT{{.+}}N7Derived16VariadicFunctionEz({{.*}} !dbg ![[SP_I:[0-9]+]] CHECK: +// ret void, !dbg ![[LOC_I:[0-9]+]] // // CHECK: ![[SP]] = distinct !DISubprogram(name: "VariadicFunction" -// CHECK: ![[LOC]] = !DILocation({{.*}}scope: ![[SP]]) +// CHECK: ![[LOC]] = !DILocation({{.*}}scope: ![[SP]], isImplicitCode: true) // CHECK: ![[SP_I]] = distinct !DISubprogram(name: "VariadicFunction" -// CHECK: ![[LOC_I]] = !DILocation({{.*}}scope: ![[SP_I]]) +// CHECK: ![[LOC_I]] = !DILocation({{.*}}scope: ![[SP_I]], isImplicitCode: true) Index: test/CodeGenObjC/arc-linetable.m =================================================================== --- test/CodeGenObjC/arc-linetable.m +++ test/CodeGenObjC/arc-linetable.m @@ -60,7 +60,8 @@ - (int)testNoSideEffect:(NSString *)foo { int x = 1; return 1; // Return expression - // CHECK: ![[RET1]] = !DILocation(line: [[@LINE+1]], scope: ![[TESTNOSIDEEFFECT]]) + // CHECK: ![[RET1]] = !DILocation(line: [[@LINE+1]], scope: + // ![[TESTNOSIDEEFFECT]], isImplicitCode: true) } // Cleanup + Ret - (int)testNoCleanup { Index: test/CodeGenObjC/debug-info-blocks.m =================================================================== --- test/CodeGenObjC/debug-info-blocks.m +++ test/CodeGenObjC/debug-info-blocks.m @@ -18,11 +18,9 @@ // CHECK: call {{.*}}, !dbg ![[DBG_LINE:[0-9]+]] // CHECK-NOT: ret // CHECK: load {{.*}}, !dbg ![[COPY_LINE:[0-9]+]] -// CHECK: ret void, !dbg ![[COPY_LINE]] // CHECK: define {{.*}} @__destroy_helper_block_{{.*}}(i8*) // CHECK-NOT: ret // CHECK: load {{.*}}, !dbg ![[DESTROY_LINE:[0-9]+]] -// CHECK: ret void, !dbg ![[DESTROY_LINE]] typedef unsigned int NSUInteger;