1*6b4eb0b9SAmir Ayupov /* Checks that BOLT correctly processes a user-provided function list file, 2*6b4eb0b9SAmir Ayupov * reorder functions according to this list, update hot_start and hot_end 3*6b4eb0b9SAmir Ayupov * symbols and insert a function to perform hot text mapping during program 4*6b4eb0b9SAmir Ayupov * startup. 5*6b4eb0b9SAmir Ayupov */ 6*6b4eb0b9SAmir Ayupov #include <stdio.h> 7*6b4eb0b9SAmir Ayupov 8*6b4eb0b9SAmir Ayupov int foo(int x) { 9*6b4eb0b9SAmir Ayupov return x + 1; 10*6b4eb0b9SAmir Ayupov } 11*6b4eb0b9SAmir Ayupov 12*6b4eb0b9SAmir Ayupov int fib(int x) { 13*6b4eb0b9SAmir Ayupov if (x < 2) 14*6b4eb0b9SAmir Ayupov return x; 15*6b4eb0b9SAmir Ayupov return fib(x - 1) + fib(x - 2); 16*6b4eb0b9SAmir Ayupov } 17*6b4eb0b9SAmir Ayupov 18*6b4eb0b9SAmir Ayupov int bar(int x) { 19*6b4eb0b9SAmir Ayupov return x - 1; 20*6b4eb0b9SAmir Ayupov } 21*6b4eb0b9SAmir Ayupov 22*6b4eb0b9SAmir Ayupov int main(int argc, char **argv) { 23*6b4eb0b9SAmir Ayupov printf("fib(%d) = %d\n", argc, fib(argc)); 24*6b4eb0b9SAmir Ayupov return 0; 25*6b4eb0b9SAmir Ayupov } 26*6b4eb0b9SAmir Ayupov 27*6b4eb0b9SAmir Ayupov /* 28*6b4eb0b9SAmir Ayupov REQUIRES: system-linux 29*6b4eb0b9SAmir Ayupov 30*6b4eb0b9SAmir Ayupov RUN: %clang %cflags %s -o %t.exe -Wl,-q 31*6b4eb0b9SAmir Ayupov 32*6b4eb0b9SAmir Ayupov RUN: llvm-bolt %t.exe -relocs=1 -lite -reorder-functions=user \ 33*6b4eb0b9SAmir Ayupov RUN: -hugify -function-order=%p/Inputs/user_func_order.txt -o %t 34*6b4eb0b9SAmir Ayupov RUN: llvm-nm --numeric-sort --print-armap %t | \ 35*6b4eb0b9SAmir Ayupov RUN: FileCheck %s -check-prefix=CHECK-NM 36*6b4eb0b9SAmir Ayupov RUN: %t 1 2 3 | FileCheck %s -check-prefix=CHECK-OUTPUT 37*6b4eb0b9SAmir Ayupov 38*6b4eb0b9SAmir Ayupov CHECK-NM: W __hot_start 39*6b4eb0b9SAmir Ayupov CHECK-NM: T main 40*6b4eb0b9SAmir Ayupov CHECK-NM-NEXT: T fib 41*6b4eb0b9SAmir Ayupov CHECK-NM-NEXT: W __hot_end 42*6b4eb0b9SAmir Ayupov 43*6b4eb0b9SAmir Ayupov CHECK-OUTPUT: fib(4) = 3 44*6b4eb0b9SAmir Ayupov */ 45