// RUN: split-file %s %t // RUN: cd %t // //--- foo.c int foo() { return 3; } //--- main.c int foo(); int main() { return foo() - 3; } // # no LTO // ## PGO, with and without function-sections, and all permutations of -bcdtors // RUN: %clang_pgogen -O2 -c -fno-function-sections foo.c // RUN: %clang_pgogen -O2 -c -fno-function-sections main.c // // RUN: %clang_pgogen -Wl,-bcdtors:all foo.o main.o // RUN: rm -f default* && %run ./a.out // RUN: llvm-profdata show --all-functions default* | FileCheck %s -check-prefix=BOTH // // RUN: %clang_pgogen -Wl,-bcdtors:mbr foo.o main.o // RUN: rm -f default* && %run ./a.out // RUN: llvm-profdata show --all-functions default* | FileCheck %s -check-prefix=BOTH // RUN: %clang_pgogen -O2 -c -ffunction-sections foo.c // RUN: %clang_pgogen -O2 -c -ffunction-sections main.c // // RUN: %clang_pgogen -Wl,-bcdtors:all foo.o main.o // RUN: rm -f default* && %run ./a.out // RUN: llvm-profdata show --all-functions default* | FileCheck %s -check-prefix=BOTH // // RUN: %clang_pgogen -Wl,-bcdtors:mbr foo.o main.o // RUN: rm -f default* && %run ./a.out // RUN: llvm-profdata show --all-functions default* | FileCheck %s -check-prefix=BOTH // ## no PGO at compile step, but PGO at link step. // RUN: %clang -O2 -c foo.c // RUN: %clang -O2 -c main.c // // RUN: %clang_pgogen -Wl,-bcdtors:all foo.o main.o // RUN: rm -f default* && %run ./a.out // RUN: llvm-profdata show --all-functions default* | FileCheck %s -check-prefix=NONE // // RUN: %clang_pgogen -Wl,-bcdtors:mbr foo.o main.o // RUN: rm -f default* && %run ./a.out // RUN: llvm-profdata show --all-functions default* | FileCheck %s -check-prefix=NONE // # LTO, with and without function-sections, and all permutations of -bcdtors // ## LTO one file, no PGO at compile, PGO at link // RUN: %clang -O2 -c foo.c // RUN: %clang -O2 -c -flto main.c // // RUN: %clang_pgogen -flto -fno-function-sections -Wl,-bcdtors:all foo.o main.o // RUN: rm -f default* && %run ./a.out // RUN: llvm-profdata show --all-functions default* | FileCheck %s -check-prefix=NONE // // RUN: %clang_pgogen -flto -fno-function-sections -Wl,-bcdtors:mbr foo.o main.o // RUN: rm -f default* && %run ./a.out // RUN: llvm-profdata show --all-functions default* | FileCheck %s -check-prefix=NONE // // RUN: %clang_pgogen -flto -ffunction-sections -Wl,-bcdtors:all foo.o main.o // RUN: rm -f default* && %run ./a.out // RUN: llvm-profdata show --all-functions default* | FileCheck %s -check-prefix=NONE // // RUN: %clang_pgogen -flto -ffunction-sections -Wl,-bcdtors:mbr foo.o main.o // RUN: rm -f default* && %run ./a.out // RUN: llvm-profdata show --all-functions default* | FileCheck %s -check-prefix=NONE // ## LTO one file, PGO at compile and link // RUN: %clang -O2 -c -fno-function-sections foo.c // RUN: %clang_pgogen -O2 -c -flto main.c // RUN: %clang_pgogen -flto -fno-function-sections -Wl,-bcdtors:all foo.o main.o // RUN: rm -f default* && %run ./a.out // RUN: llvm-profdata show --all-functions default* | FileCheck %s -check-prefix=MAIN // RUN: %clang -O2 -c -flto foo.c // RUN: %clang_pgogen -O2 -c -fno-function-sections main.c // RUN: %clang_pgogen -flto -fno-function-sections -Wl,-bcdtors:mbr foo.o main.o // RUN: rm -f default* && %run ./a.out // RUN: llvm-profdata show --all-functions default* | FileCheck %s -check-prefix=MAIN // RUN: %clang -O2 -c -flto foo.c // RUN: %clang_pgogen -O2 -c -ffunction-sections main.c // RUN: %clang_pgogen -flto -ffunction-sections -Wl,-bcdtors:all foo.o main.o // RUN: rm -f default* && %run ./a.out // RUN: llvm-profdata show --all-functions default* | FileCheck %s -check-prefix=MAIN // RUN: %clang -O2 -c -ffunction-sections foo.c // RUN: %clang_pgogen -O2 -c -flto main.c // RUN: %clang_pgogen -flto -ffunction-sections -Wl,-bcdtors:mbr foo.o main.o // RUN: rm -f default* && %run ./a.out // RUN: llvm-profdata show --all-functions default* | FileCheck %s -check-prefix=MAIN // ## LTO and PGO both files // RUN: %clang_pgogen -O2 -c -flto foo.c // RUN: %clang_pgogen -O2 -c -flto main.c // // RUN: %clang_pgogen -flto -fno-function-sections -Wl,-bcdtors:all foo.o main.o // RUN: rm -f default* && %run ./a.out // RUN: llvm-profdata show --all-functions default* | FileCheck %s -check-prefix=BOTH // // RUN: %clang_pgogen -flto -fno-function-sections -Wl,-bcdtors:mbr foo.o main.o // RUN: rm -f default* && %run ./a.out // RUN: llvm-profdata show --all-functions default* | FileCheck %s -check-prefix=BOTH // // RUN: %clang_pgogen -flto -ffunction-sections -Wl,-bcdtors:all foo.o main.o // RUN: rm -f default* && %run ./a.out // RUN: llvm-profdata show --all-functions default* | FileCheck %s -check-prefix=BOTH // // RUN: %clang_pgogen -flto -ffunction-sections -Wl,-bcdtors:mbr foo.o main.o // RUN: rm -f default* && %run ./a.out // RUN: llvm-profdata show --all-functions default* | FileCheck %s -check-prefix=BOTH // BOTH-DAG: foo: // BOTH-DAG: main: // MAIN-NOT: foo: // MAIN: main: // MAIN-NOT: foo: // NONE: Total functions: 0