// Check that instrprof does not introduce references to discarded sections when // using comdats. // // Occasionally, it is possible that the same function can be compiled in // different TUs with slightly different linkages, e.g., due to different // compiler options. However, if these are comdat functions, a single // implementation will be chosen at link time. we want to ensure that the // profiling data does not contain a reference to the discarded section. // UNSUPPORTED: target={{.*windows.*}} // RUN: mkdir -p %t.d // RUN: %clangxx_pgogen -O2 -fPIC -ffunction-sections -fdata-sections -c %s -o %t.d/a1.o -DOBJECT_1 -mllvm -disable-preinline // RUN: %clangxx_pgogen -O2 -fPIC -ffunction-sections -fdata-sections -c %s -o %t.d/a2.o // RUN: %clangxx_pgogen -fPIC -shared -o %t.d/liba.so %t.d/a1.o %t.d/a2.o 2>&1 | FileCheck %s --allow-empty // Ensure that we don't get an error when linking // CHECK-NOT: relocation refers to a discarded section: .text._ZN1CIiE1fEi template struct C { void f(T x); int g(T x) { f(x); return v; } int v; }; template #ifdef OBJECT_1 __attribute__((weak)) #else __attribute__((noinline)) #endif void C::f(T x) { v += x; } #ifdef OBJECT_1 int foo() { C c; c.f(1); return c.g(2); } #else int bar() { C c; c.f(3); return c.g(4); } #endif