Summary: I hadn't realized that instrumentation runs before inlining, so we can't use the function as the comdat group. Doing so can create relocations against discarded sections when references to discarded __profc_ variables are inlined into functions outside the function's comdat group. In the future, perhaps we should consider standardizing the comdat group names that ELF and COFF use. It will save object file size, since __profv_$sym won't appear in the symbol table again. Reviewers: xur, vsk Subscribers: eraman, hiraditya, cfe-commits, #sanitizers, llvm-commits Tags: #clang, #sanitizers, #llvm Differential Revision: https://reviews.llvm.org/D58737 llvm-svn: 355044
48 lines
1.4 KiB
C++
48 lines
1.4 KiB
C++
// 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
|