| // -fkeep-inline-functions has an effect without optimization, although it is |
| // primarily useful with optimization enabled. |
| |
| // RUN: %clang_cc1 -O2 -fkeep-inline-functions -emit-llvm %s -o - -triple x86_64-unknown-linux-gnu | FileCheck %s |
| // RUN: %clang_cc1 -O0 -fkeep-inline-functions -emit-llvm %s -o - -triple x86_64-unknown-linux-gnu | FileCheck %s |
| // RUN: %clang_cc1 -O2 -fkeep-inline-functions -emit-llvm %s -o - -triple powerpc64-ibm-aix-xcoff | FileCheck %s |
| // RUN: %clang_cc1 -O2 -fkeep-inline-functions -fgnu89-inline -emit-llvm %s -o - -triple powerpc64-ibm-aix-xcoff | FileCheck %s --check-prefix=CHECK-GNU89 |
| |
| // Retained: |
| // f1 static inline |
| // f2 plain inline under -fgnu89-inline |
| // f5 C99 external definition with external linkage; |
| // considered plain inline under -fgnu89-inline |
| // |
| // Not retained: |
| // f2 C99 inline definition |
| // f3 non-inline |
| // f4 GNU C89/C90 extern inline |
| |
| static inline int f1(int x) { return x + 1; } |
| |
| inline int f2(int x) { return x + 2; } |
| |
| int f3(int x) { return x + 3; } |
| |
| __attribute__((gnu_inline)) extern inline int f4(int x) { return x + 4; } |
| |
| extern inline int f5(int x); |
| inline int f5(int x) { return x + 5; } |
| |
| // f1 and f5 are unused, so their definitions are emitted due to -fkeep-inline-functions. |
| |
| // CHECK: @llvm{{(\.compiler)?}}.used = appending global [2 x ptr] [ptr @f1, ptr @f5] |
| // CHECK: define internal {{.*}}@f1 |
| // CHECK: define {{.*}}@f5 |
| |
| int use(void) { return f2(0) + f3(0) + f4(0); } |
| |
| // CHECK-GNU89: @llvm{{(\.compiler)?}}.used = appending global [3 x ptr] [ptr @f1, ptr @f2, ptr @f5] |
| // CHECK-GNU89: define {{.*}}@f1 |
| // CHECK-GNU89: define {{.*}}@f2 |
| // CHECK-GNU89: define {{.*}}@f5 |