mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-23 21:45:46 -04:00

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
43 lines
1.9 KiB
C++
43 lines
1.9 KiB
C++
// Tests for instrumentation of templated code. Each instantiation of a template
|
|
// should be instrumented separately.
|
|
|
|
// RUN: %clang_cc1 -x c++ %s -triple %itanium_abi_triple -main-file-name cxx-templates.cpp -std=c++11 -o - -emit-llvm -fprofile-instrument=clang > %tgen
|
|
// RUN: FileCheck --input-file=%tgen -check-prefix=T0GEN -check-prefix=ALL %s
|
|
// RUN: FileCheck --input-file=%tgen -check-prefix=T100GEN -check-prefix=ALL %s
|
|
|
|
// RUN: llvm-profdata merge %S/Inputs/cxx-templates.proftext -o %t.profdata
|
|
// RUN: %clang_cc1 -x c++ %s -triple %itanium_abi_triple -main-file-name cxx-templates.cpp -std=c++11 -o - -emit-llvm -fprofile-instrument-use-path=%t.profdata > %tuse
|
|
// RUN: FileCheck --input-file=%tuse -check-prefix=T0USE -check-prefix=ALL %s
|
|
// RUN: FileCheck --input-file=%tuse -check-prefix=T100USE -check-prefix=ALL %s
|
|
|
|
// T0GEN: @[[T0C:__profc__Z4loopILj0EEvv]] = linkonce_odr {{(hidden|dso_local)}} global [2 x i64] zeroinitializer
|
|
// T100GEN: @[[T100C:__profc__Z4loopILj100EEvv]] = linkonce_odr {{(hidden|dso_local)}} global [2 x i64] zeroinitializer
|
|
|
|
// T0GEN-LABEL: define linkonce_odr {{.*}}void @_Z4loopILj0EEvv()
|
|
// T0USE-LABEL: define linkonce_odr {{.*}}void @_Z4loopILj0EEvv()
|
|
// T100GEN-LABEL: define linkonce_odr {{.*}}void @_Z4loopILj100EEvv()
|
|
// T100USE-LABEL: define linkonce_odr {{.*}}void @_Z4loopILj100EEvv()
|
|
template <unsigned N> void loop() {
|
|
// ALL-NOT: ret
|
|
// T0GEN: store {{.*}} @[[T0C]], i64 0, i64 0
|
|
// T100GEN: store {{.*}} @[[T100C]], i64 0, i64 0
|
|
|
|
// ALL-NOT: ret
|
|
// T0GEN: store {{.*}} @[[T0C]], i64 0, i64 1
|
|
// T0USE: br {{.*}} !prof ![[T01:[0-9]+]]
|
|
// T100GEN: store {{.*}} @[[T100C]], i64 0, i64 1
|
|
// T100USE: br {{.*}} !prof ![[T1001:[0-9]+]]
|
|
for (unsigned I = 0; I < N; ++I) {}
|
|
|
|
// ALL: ret
|
|
}
|
|
|
|
// T0USE-DAG: ![[T01]] = !{!"branch_weights", i32 1, i32 2}
|
|
// T100USE-DAG: ![[T1001]] = !{!"branch_weights", i32 101, i32 2}
|
|
|
|
int main(int argc, const char *argv[]) {
|
|
loop<0>();
|
|
loop<100>();
|
|
return 0;
|
|
}
|