1 1.1 joerg """ 2 1.1 joerg This test produces three shared libraries: 3 1.1 joerg 4 1.1 joerg 1. libt-instr.so is instrumented 5 1.1 joerg 2. libt-no-instr1.so is not instrumented 6 1.1 joerg 3. libt-no-instr2.so is built with profile rt linked in (via -u<hook>), but the object file is built 7 1.1 joerg with instrumentation turned off. 8 1.1 joerg 9 1.1 joerg After the libraries are built, the main program is then built with/without instrumentation and linked 10 1.1 joerg against 3 libraries above. 11 1.1 joerg 12 1.1 joerg The test is to verify that programs linked against these shared objects with and without instrumentation 13 1.1 joerg enabled behave as expected. 14 1.1 joerg """ 15 1.1 joerg 16 1.1 joerg RUN: mkdir -p %t.d 17 1.1 joerg RUN: %clang_profgen -o %t.d/libt-instr.so -fPIC -shared %S/Inputs/instrprof-shared-lib.c 18 1.1 joerg RUN: %clang -o %t.d/libt-no-instr1.so -fPIC -shared %S/Inputs/instrprof-shared-lib.c 19 1.1 joerg RUN: %clang -c -o %t.d/instrprof-shared-lib-no-instr2.o -fPIC %S/Inputs/instrprof-shared-lib.c 20 1.1 joerg RUN: %clang_profgen -o %t.d/libt-no-instr2.so -fPIC -shared %t.d/instrprof-shared-lib-no-instr2.o 21 1.1 joerg 22 1.1 joerg RUN: %clang_profgen -o %t-instr-instr -L%t.d -rpath %t.d -lt-instr %S/Inputs/instrprof-shared-main.c 23 1.1 joerg RUN: %clang_profgen -o %t-instr-no-instr1 -L%t.d -rpath %t.d -lt-no-instr1 %S/Inputs/instrprof-shared-main.c 24 1.1 joerg RUN: %clang_profgen -o %t-instr-no-instr2 -L%t.d -rpath %t.d -lt-no-instr2 %S/Inputs/instrprof-shared-main.c 25 1.1 joerg RUN: %clang -o %t-no-instr1-instr -L%t.d -rpath %t.d -lt-instr %S/Inputs/instrprof-shared-main.c 26 1.1 joerg RUN: %clang -o %t-no-instr1-no-instr1 -L%t.d -rpath %t.d -lt-no-instr1 %S/Inputs/instrprof-shared-main.c 27 1.1 joerg RUN: %clang -o %t-no-instr1-no-instr2 -L%t.d -rpath %t.d -lt-no-instr2 %S/Inputs/instrprof-shared-main.c 28 1.1 joerg RUN: %clang -c -o %t.d/instrprof-shared-main-no-instr2.o %S/Inputs/instrprof-shared-main.c 29 1.1 joerg RUN: %clang -o %t-no-instr2-instr -L%t.d -rpath %t.d -lt-instr %t.d/instrprof-shared-main-no-instr2.o 30 1.1 joerg RUN: %clang -o %t-no-instr2-no-instr1 -L%t.d -rpath %t.d -lt-no-instr1 %t.d/instrprof-shared-main-no-instr2.o 31 1.1 joerg RUN: %clang -o %t-no-instr2-no-instr2 -L%t.d -rpath %t.d -lt-no-instr2 %t.d/instrprof-shared-main-no-instr2.o 32 1.1 joerg 33 1.1 joerg RUN: env LLVM_PROFILE_FILE=%t-instr-instr.profraw %run %t-instr-instr 34 1.1 joerg RUN: env LLVM_PROFILE_FILE=%t-instr-no-instr1.profraw %run %t-instr-no-instr1 35 1.1 joerg RUN: env LLVM_PROFILE_FILE=%t-instr-no-instr2.profraw %run %t-instr-no-instr2 36 1.1 joerg RUN: env LLVM_PROFILE_FILE=%t-no-instr1-instr.profraw %run %t-no-instr1-instr 37 1.1 joerg RUN: env LLVM_PROFILE_FILE=%t-no-instr2-instr.profraw %run %t-no-instr2-instr 38 1.1 joerg RUN: env LLVM_PROFILE_FILE=%t-no-instr1-no-instr1.profraw %run %t-no-instr1-no-instr1 39 1.1 joerg RUN: env LLVM_PROFILE_FILE=%t-no-instr1-no-instr2.profraw %run %t-no-instr1-no-instr2 40 1.1 joerg RUN: env LLVM_PROFILE_FILE=%t-no-instr2-no-instr1.profraw %run %t-no-instr2-no-instr1 41 1.1 joerg RUN: env LLVM_PROFILE_FILE=%t-no-instr2-no-instr2.profraw %run %t-no-instr2-no-instr2 42 1.1 joerg 43 1.1 joerg RUN: llvm-profdata merge -o %t-instr-instr.profdata %t-instr-instr.profraw 44 1.1 joerg RUN: llvm-profdata merge -o %t-instr-no-instr1.profdata %t-instr-no-instr1.profraw 45 1.1 joerg RUN: llvm-profdata merge -o %t-instr-no-instr2.profdata %t-instr-no-instr2.profraw 46 1.1 joerg RUN: llvm-profdata merge -o %t-no-instr1-instr.profdata %t-no-instr1-instr.profraw 47 1.1 joerg RUN: llvm-profdata merge -o %t-no-instr2-instr.profdata %t-no-instr2-instr.profraw 48 1.1 joerg 49 1.1 joerg RUN: not llvm-profdata merge -o %t-no-instr1-no-instr1.profdata %t-no-instr1-no-instr1.profraw 2>&1 | FileCheck %s --check-prefix=MISSING-FILE 50 1.1 joerg RUN: not llvm-profdata merge -o %t-no-instr2-no-instr1.profdata %t-no-instr2-no-instr1.profraw 2>&1 | FileCheck %s --check-prefix=MISSING-FILE 51 1.1 joerg MISSING-FILE: profraw 52 1.1 joerg 53 1.1 joerg RUN: llvm-profdata show -counts --function main %t-instr-instr.profdata | grep -v 'Total\|Maximum' > %t-main-1 54 1.1 joerg RUN: llvm-profdata show -counts --function main %t-instr-no-instr1.profdata | grep -v 'Total\|Maximum' > %t-main-2 55 1.1 joerg RUN: llvm-profdata show -counts --function main %t-instr-no-instr2.profdata | grep -v 'Total\|Maximum' > %t-main-3 56 1.1 joerg RUN: llvm-profdata show -counts --function foo %t-instr-instr.profdata | grep -v 'Total\|Maximum' > %t-foo-1 57 1.1 joerg RUN: llvm-profdata show -counts --function foo %t-no-instr1-instr.profdata | grep -v 'Total\|Maximum' > %t-foo-2 58 1.1 joerg RUN: llvm-profdata show -counts --function foo %t-no-instr2-instr.profdata | grep -v 'Total\|Maximum' > %t-foo-3 59 1.1 joerg 60 1.1 joerg RUN: %clang_profuse=%t-instr-instr.profdata -o %t-main-instr-instr.ll -S -emit-llvm %S/Inputs/instrprof-shared-main.c 61 1.1 joerg RUN: %clang_profuse=%t-instr-no-instr1.profdata -o %t-main-instr-no-instr1.ll -S -emit-llvm %S/Inputs/instrprof-shared-main.c 62 1.1 joerg RUN: %clang_profuse=%t-instr-no-instr2.profdata -o %t-main-instr-no-instr2.ll -S -emit-llvm %S/Inputs/instrprof-shared-main.c 63 1.1 joerg RUN: %clang_profuse=%t-instr-instr.profdata -o %t-lib-instr-instr.ll -S -emit-llvm %S/Inputs/instrprof-shared-lib.c 64 1.1 joerg RUN: %clang_profuse=%t-no-instr1-instr.profdata -o %t-lib-no-instr1-instr.ll -S -emit-llvm %S/Inputs/instrprof-shared-lib.c 65 1.1 joerg RUN: %clang_profuse=%t-no-instr2-instr.profdata -o %t-lib-no-instr2-instr.ll -S -emit-llvm %S/Inputs/instrprof-shared-lib.c 66 1.1 joerg RUN: %clang_profuse=%t-instr-instr.profdata -o %t-lib-instr-instr.ll -S -emit-llvm %S/Inputs/instrprof-shared-lib.c 67 1.1 joerg 68 1.1 joerg RUN: diff %t-main-instr-no-instr1.ll %t-main-instr-no-instr2.ll 69 1.1 joerg RUN: diff %t-lib-no-instr1-instr.ll %t-lib-no-instr2-instr.ll 70 1.1 joerg 71 1.1 joerg RUN: diff %t-main-1 %t-main-2 72 1.1 joerg RUN: diff %t-main-1 %t-main-3 73 1.1 joerg RUN: diff %t-foo-1 %t-foo-2 74 1.1 joerg RUN: diff %t-foo-1 %t-foo-3 75 1.1 joerg 76