[gcov] Ignore blocks from another file
Constructs such as inline variables, #line, and #include can create
lexical blocks with a different filename.
GCOVProfiling and llvm-cov gcov currently don't handle such cases (see
GCOVLines::writeOut and GCOVFile::readGCNO) and would incorrectly
attribute the line number to the current file.
For now, ignore such blocks. Missing line execution counts is better
than wrong ones.
---
As a workaround that Apple targets don't use -mconstructor-aliases yet,
allow line execution count 4 on the A::A line (1f34e282e8).
This commit is contained in:
41
compiler-rt/test/profile/Posix/gcov-file-change.cpp
Normal file
41
compiler-rt/test/profile/Posix/gcov-file-change.cpp
Normal file
@@ -0,0 +1,41 @@
|
||||
// RUN: rm -rf %t && split-file %s %t && cd %t
|
||||
// RUN: %clangxx --coverage main.cpp -o t
|
||||
// RUN: %run ./t
|
||||
// RUN: llvm-cov gcov -t t-main. | FileCheck %s
|
||||
|
||||
//--- main.cpp
|
||||
#include "a.h"
|
||||
#include <stdio.h>
|
||||
|
||||
// CHECK: Runs:1
|
||||
/// __cxx_global_var_init contains a block from a.h. Don't attribute its lines to main.cpp.
|
||||
// CHECK-NOT: {{^ +[0-9]+:}}
|
||||
|
||||
inline auto *const inl_var_main = // CHECK: 1: [[#]]:inline auto
|
||||
new A; // CHECK-NEXT: 1: [[#]]:
|
||||
void foo(int x) { // CHECK-NEXT: 1: [[#]]:
|
||||
if (x) { // CHECK-NEXT: 1: [[#]]:
|
||||
#include "a.inc"
|
||||
}
|
||||
}
|
||||
// CHECK-NOT: {{^ +[0-9]+:}}
|
||||
|
||||
int main(int argc, char *argv[]) { // CHECK: 1: [[#]]:int main
|
||||
foo(1); // CHECK-NEXT: 1: [[#]]:
|
||||
} // CHECK-NEXT: 1: [[#]]:
|
||||
// CHECK-NOT: {{^ +[0-9]+:}}
|
||||
|
||||
// CHECK: Source:a.h
|
||||
// CHECK: 1: 1:struct A
|
||||
// CHECK-NOT: {{^ +[0-9]+:}}
|
||||
|
||||
//--- a.h
|
||||
/// Apple targets doesn't enable -mconstructor-aliases by default and the count may be 4.
|
||||
struct A { A() { } }; // CHECK: {{[24]}}: [[#]]:struct A
|
||||
inline auto *const inl_var_a =
|
||||
new A;
|
||||
/// TODO a.inc:1 should have line execution.
|
||||
// CHECK-NOT: {{^ +[0-9]+:}}
|
||||
|
||||
//--- a.inc
|
||||
puts("");
|
||||
@@ -898,7 +898,9 @@ bool GCOVProfiler::emitProfileNotes(
|
||||
|
||||
if (Line == Loc.getLine()) continue;
|
||||
Line = Loc.getLine();
|
||||
if (SP != getDISubprogram(Loc.getScope()))
|
||||
MDNode *Scope = Loc.getScope();
|
||||
// TODO: Handle blocks from another file due to #line, #include, etc.
|
||||
if (isa<DILexicalBlockFile>(Scope) || SP != getDISubprogram(Scope))
|
||||
continue;
|
||||
|
||||
GCOVLines &Lines = Block.getFile(Filename);
|
||||
|
||||
Reference in New Issue
Block a user