// This is a regression test for supplementary profiles. // What the test does: // - Generate raw profiles from an executable and convert it to indexed profiles. // - Merge indexed profiles with supplementary sample-pgo profiles // - Check that the block counters for function foo is scaled up. // REQUIRES: lld-available // Building the instrumented binary will fail because lld doesn't support // big-endian ELF for PPC (aka ABI 1). // ld.lld: error: /lib/../lib64/Scrt1.o: ABI version 1 is not supported // UNSUPPORTED: ppc && host-byteorder-big-endian // This compiler-rt test aims to have test coverage for the IRPGO name format // of local-linkage functions during raw profile generation. The C++ functions // are simple with little optimization space so test outputs are more stable. // On the other hand, LLVM tests (like tools/llvm-profdata/suppl-instr-with-sample-static-func.test // or other suppl* test under tools/llvm-profdata dir) are more suitable for // more sophisticated cases (e.g., pseudo hot functions or profiles with discriminiators, etc). // RUN: rm -rf %t && split-file %s %t && cd %t // Use clangxx_pgogen for IR level instrumentation for C++. // The test case is constructed such that `-funique-internal-linkage-names` is // not used in instrPGO but used in static function names in SamplePGO. // RUN: %clangxx_pgogen -fuse-ld=lld -O2 main.cpp -o main // RUN: env LLVM_PROFILE_FILE=main.profraw %run ./main // RUN: llvm-profdata merge main.profraw -o main.profdata // The function counters are not scaled up. // RUN: llvm-profdata show -all-functions -counts main.profdata | FileCheck %s --check-prefix=INSTR // The instrPGO profile counter of function foo should be scaled up. Note the // scaling factor of a function is computed based on instrPGO profiles and // invariant to samplePGO profile counters. // RUN: llvm-profdata merge -supplement-instr-with-sample=sampleprof.proftext \ // RUN: -suppl-min-size-threshold=0 -instr-prof-cold-threshold=1 \ // RUN: main.profdata -o merge.profdata // RUN: llvm-profdata show -all-functions -counts merge.profdata | FileCheck %s --check-prefix=SUPPL // INSTR: Counters: // INSTR: main: // INSTR: Counters: 1 // INSTR: Block counts: [1] // INSTR: _Z3barv: // INSTR: Counters: 1 // INSTR: Block counts: [2] // INSTR: main.cpp;_ZL3foov: // INSTR: Counters: 1 // INSTR: Block counts: [1] // INSTR: Functions shown: 3 // INSTR: Total functions: 3 // SUPPL: Counters: // SUPPL: main: // SUPPL: Counters: 1 // SUPPL: Block counts: [1] // SUPPL: _Z3barv: // SUPPL: Counters: 1 // SUPPL: Block counts: [2] // SUPPL: main.cpp;_ZL3foov: // SUPPL: Counters: 1 // SUPPL: Block counts: [3] //--- main.cpp // mark foo and bar as noinline so preinliner won't inlined them into main // before the instrumentation pass. __attribute__((noinline)) static void foo() { } __attribute__((noinline)) void bar() { } int main() { foo(); bar(); bar(); return 0; } //--- sampleprof.proftext _ZL3foov.__uniq.23343505234642233139497840575431302970:5:5 1: 5