1 | // Check that instrprof does not introduce references to discarded sections when |
2 | // using comdats. |
3 | // |
4 | // Occasionally, it is possible that the same function can be compiled in |
5 | // different TUs with slightly different linkages, e.g., due to different |
6 | // compiler options. However, if these are comdat functions, a single |
7 | // implementation will be chosen at link time. we want to ensure that the |
8 | // profiling data does not contain a reference to the discarded section. |
9 | |
10 | // UNSUPPORTED: target={{.*windows.*}} |
11 | |
12 | // RUN: mkdir -p %t.d |
13 | // RUN: %clangxx_pgogen -O2 -fPIC -ffunction-sections -fdata-sections -c %s -o %t.d/a1.o -DOBJECT_1 -mllvm -disable-preinline |
14 | // RUN: %clangxx_pgogen -O2 -fPIC -ffunction-sections -fdata-sections -c %s -o %t.d/a2.o |
15 | // RUN: %clangxx_pgogen -fPIC -shared -o %t.d/liba.so %t.d/a1.o %t.d/a2.o 2>&1 | FileCheck %s --allow-empty |
16 | |
17 | // Ensure that we don't get an error when linking |
18 | // CHECK-NOT: relocation refers to a discarded section: .text._ZN1CIiE1fEi |
19 | |
20 | template <typename T> struct C { |
21 | void f(T x); |
22 | int g(T x) { |
23 | f(x); |
24 | return v; |
25 | } |
26 | int v; |
27 | }; |
28 | |
29 | template <typename T> |
30 | #ifdef OBJECT_1 |
31 | __attribute__((weak)) |
32 | #else |
33 | __attribute__((noinline)) |
34 | #endif |
35 | void C<T>::f(T x) { |
36 | v += x; |
37 | } |
38 | |
39 | #ifdef OBJECT_1 |
40 | int foo() { |
41 | C<int> c; |
42 | c.f(1); |
43 | return c.g(2); |
44 | } |
45 | #else |
46 | int bar() { |
47 | C<int> c; |
48 | c.f(x: 3); |
49 | return c.g(x: 4); |
50 | } |
51 | #endif |
52 | |