Index: test/profile/Inputs/extern_template.h =================================================================== --- test/profile/Inputs/extern_template.h +++ test/profile/Inputs/extern_template.h @@ -0,0 +1,17 @@ +template struct Test { + Test() : M(10) {} + void doIt(int N) { // CHECK: 2| [[@LINE]]| void doIt + if (N > 10) { // CHECK: 2| [[@LINE]]| if (N > 10) { + M += 2; // CHECK: 1| [[@LINE]]| M += 2; + } else // CHECK: 1| [[@LINE]]| } else + M -= 2; // CHECK: 1| [[@LINE]]| M -= 2; + } + T M; +}; + +#ifdef USE +extern template struct Test; +#endif +#ifdef DEF +template struct Test; +#endif Index: test/profile/Inputs/extern_template.cpp =================================================================== --- test/profile/Inputs/extern_template.cpp +++ test/profile/Inputs/extern_template.cpp @@ -0,0 +1,14 @@ +#define DEF +#include "extern_template.h" +#undef DEF +extern int bar(); +extern int foo(); +extern Test TO; +int main() { + foo(); + int R = bar(); + + if (R != 10) + return 1; + return 0; +} Index: test/profile/Inputs/extern_template1.cpp =================================================================== --- test/profile/Inputs/extern_template1.cpp +++ test/profile/Inputs/extern_template1.cpp @@ -0,0 +1,9 @@ +#define USE +#include "extern_template.h" +#undef USE + +Test TO; +int foo() { + TO.doIt(20); + return TO.M; +} Index: test/profile/Inputs/extern_template2.cpp =================================================================== --- test/profile/Inputs/extern_template2.cpp +++ test/profile/Inputs/extern_template2.cpp @@ -0,0 +1,9 @@ +#define USE +#include "extern_template.h" +#undef USE + +extern Test TO; +int bar() { + TO.doIt(5); + return TO.M; +} Index: test/profile/Linux/extern_template.test =================================================================== --- test/profile/Linux/extern_template.test +++ test/profile/Linux/extern_template.test @@ -0,0 +1,23 @@ +// RUN: %clang -O2 -c -o %t.o %S/../Inputs/extern_template.cpp +// RUN: %clang_profgen -O2 -fcoverage-mapping %S/../Inputs/extern_template1.cpp %S/../Inputs/extern_template2.cpp %t.o -o %t +// RUN: env LLVM_PROFILE_FILE=%t.profraw %t +// RUN: llvm-profdata show --all-functions %t.profraw | FileCheck %s +// RUN: llvm-profdata merge -o %t.profdata %t.profraw +// RUN: llvm-cov show -instr-profile=%t.profdata %t | FileCheck %S/../Inputs/extern_template.h +#define DEF +#include "extern_template.h" +#undef DEF +extern int bar(); +extern int foo(); +extern Test TO; +int main() { + foo(); + int R = bar(); + + if (R != 10) + return 1; + return 0; +} +// No duplicate entries +// CHECK: _ZN4TestIiE4doItEi: +// CHECK-NOT: _ZN4TestIiE4doItEi: