| // REQUIRES: x86-registered-target |
| // RUN: %clang_cc1 -triple x86_64-unknown-unknown -S -finstrument-functions -O0 -o - -emit-llvm %s | FileCheck %s |
| // RUN: %clang_cc1 -triple x86_64-unknown-unknown -S -finstrument-functions -O2 -o - -emit-llvm %s | FileCheck %s |
| // RUN: %clang_cc1 -triple x86_64-unknown-unknown -S -finstrument-functions-after-inlining -O2 -o - -emit-llvm %s | FileCheck -check-prefix=NOINLINE %s |
| |
| __attribute__((always_inline)) int leaf(int x) { |
| return x; |
| // CHECK-LABEL: define {{.*}} @leaf |
| // CHECK: call void @__cyg_profile_func_enter |
| // CHECK-NOT: cyg_profile |
| // CHECK: call void @__cyg_profile_func_exit |
| // CHECK-NOT: cyg_profile |
| // CHECK: ret |
| } |
| |
| int root(int x) { |
| return leaf(x); |
| // CHECK-LABEL: define {{.*}} @root |
| // CHECK: call void @__cyg_profile_func_enter |
| // CHECK-NOT: cyg_profile |
| |
| // Inlined from leaf(): |
| // CHECK: call void @__cyg_profile_func_enter |
| // CHECK-NOT: cyg_profile |
| // CHECK: call void @__cyg_profile_func_exit |
| // CHECK-NOT: cyg_profile |
| |
| // CHECK: call void @__cyg_profile_func_exit |
| // CHECK: ret |
| |
| // NOINLINE-LABEL: define {{.*}} @root |
| // NOINLINE: call void @__cyg_profile_func_enter |
| // NOINLINE-NOT: cyg_profile |
| // NOINLINE: call void @__cyg_profile_func_exit |
| // NOINLINE-NOT: cyg_profile |
| // NOINLINE: ret |
| } |