| // Test that the instrumentation puts the right linkage on the profile data for |
| // inline functions. |
| // RUN: %clang_profgen -g -fcoverage-mapping -c -o %t1.o %s -DOBJECT_1 |
| // RUN: %clang_profgen -g -fcoverage-mapping -c -o %t2.o %s |
| // RUN: %clang_profgen -g -fcoverage-mapping %t1.o %t2.o -o %t.exe |
| // RUN: env LLVM_PROFILE_FILE=%t.profraw %run %t.exe |
| // RUN: llvm-profdata show %t.profraw -all-functions | FileCheck %s |
| |
| // Again, with optimizations and inlining. This tests that we use comdats |
| // correctly. |
| // RUN: %clang_profgen -O2 -g -fcoverage-mapping -c -o %t1.o %s -DOBJECT_1 |
| // RUN: %clang_profgen -O2 -g -fcoverage-mapping -c -o %t2.o %s |
| // RUN: %clang_profgen -g -fcoverage-mapping %t1.o %t2.o -o %t.exe |
| // RUN: env LLVM_PROFILE_FILE=%t.profraw %run %t.exe |
| // RUN: llvm-profdata show %t.profraw -all-functions | FileCheck %s |
| |
| // CHECK: {{.*}}foo{{.*}}: |
| // CHECK-NEXT: Hash: |
| // CHECK-NEXT: Counters: 1 |
| // CHECK-NEXT: Function count: 1 |
| // CHECK: {{.*}}inline_wrapper{{.*}}: |
| // CHECK-NEXT: Hash: |
| // CHECK-NEXT: Counters: 1 |
| // CHECK-NEXT: Function count: 2 |
| // CHECK: main: |
| // CHECK-NEXT: Hash: |
| // CHECK-NEXT: Counters: 1 |
| // CHECK-NEXT: Function count: 1 |
| |
| extern "C" int puts(const char *); |
| |
| inline void inline_wrapper(const char *msg) { |
| puts(msg); |
| } |
| |
| void foo(); |
| |
| #ifdef OBJECT_1 |
| void foo() { |
| inline_wrapper("foo"); |
| } |
| #else |
| int main() { |
| inline_wrapper("main"); |
| foo(); |
| } |
| #endif |