diff options
author | Alex Lorenz <arphaman@gmail.com> | 2017-03-23 11:14:27 +0000 |
---|---|---|
committer | Alex Lorenz <arphaman@gmail.com> | 2017-03-23 11:14:27 +0000 |
commit | 50a59090a4e5ed73761a8aafb8ea2597775cf8fe (patch) | |
tree | 6aaa202f1ad1654b5687828ba2cd330feb1aee07 /test/CodeGenObjC | |
parent | 942d4ddd5316a1bb4dcfba6e6710a7747cd62e46 (diff) |
[CodeGen] Emit a CoreFoundation link guard when @available is used
After r297760, __isOSVersionAtLeast in compiler-rt loads the CoreFoundation
symbols at runtime. This means that `@available` will always fail when used in a
binary without a linked CoreFoundation.
This commit forces Clang to emit a reference to a CoreFoundation symbol when
`@available` is used to ensure that linking will fail when CoreFoundation isn't
linked with the build product.
rdar://31039592
Differential Revision: https://reviews.llvm.org/D30977
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@298588 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CodeGenObjC')
-rw-r--r-- | test/CodeGenObjC/availability-cf-link-guard.m | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/test/CodeGenObjC/availability-cf-link-guard.m b/test/CodeGenObjC/availability-cf-link-guard.m new file mode 100644 index 0000000000..918d13ffd9 --- /dev/null +++ b/test/CodeGenObjC/availability-cf-link-guard.m @@ -0,0 +1,45 @@ +// RUN: %clang_cc1 -triple x86_64-apple-macosx10.11 -emit-llvm -o - %s | FileCheck --check-prefixes=CHECK,CHECK_LINK_OPT %s +// RUN: %clang_cc1 -triple x86_64-apple-macosx10.11 -emit-llvm -o - -D USE_BUILTIN %s | FileCheck --check-prefixes=CHECK,CHECK_LINK_OPT %s +// RUN: %clang_cc1 -triple x86_64-apple-macosx10.11 -emit-llvm -o - -D DEF_CF %s | FileCheck --check-prefixes=CHECK_CF,CHECK_LINK_OPT %s +// RUN: %clang_cc1 -triple x86_64-apple-macosx10.12 -emit-llvm -o - %s | FileCheck --check-prefix=CHECK_NO_GUARD %s +// RUN: %clang_cc1 -triple x86_64-unknown-linux -emit-llvm -o - %s | FileCheck --check-prefix=CHECK_NO_GUARD %s + +#ifdef DEF_CF +struct CFBundle; +typedef struct CFBundle *CFBundleRef; +unsigned CFBundleGetVersionNumber(CFBundleRef bundle); +// CHECK_CF: declare i32 @CFBundleGetVersionNumber(%struct.CFBundle*) +// CHECK_CF: @__clang_at_available_requires_core_foundation_framework +// CHECK_CF-NEXT: call {{.*}}@CFBundleGetVersionNumber +#endif + +void use_at_available() { +#ifdef DEF_CF + CFBundleGetVersionNumber(0); +#endif +#ifdef USE_BUILTIN + if (__builtin_available(macos 10.12, *)) + ; +#else + if (@available(macos 10.12, *)) + ; +#endif +} + +// CHECK: @llvm.compiler.used{{.*}}@__clang_at_available_requires_core_foundation_framework + +// CHECK: declare i32 @CFBundleGetVersionNumber(i8*) + +// CHECK-LABEL: linkonce hidden void @__clang_at_available_requires_core_foundation_framework +// CHECK: call i32 @CFBundleGetVersionNumber(i8* null) +// CHECK-NEXT: unreachable + +// CHECK_NO_GUARD-NOT: __clang_at_available_requires_core_foundation_framework +// CHECK_NO_GUARD-NOT: CFBundleGetVersionNumber + +// CHECK_LINK_OPT: !"Linker Options", ![[OPTS:[0-9]+]] +// CHECK_LINK_OPT: ![[OPTS]] = !{![[FRAMEWORK:[0-9]+]] +// CHECK_LINK_OPT: ![[FRAMEWORK]] = !{!"-framework", !"CoreFoundation"} + +// CHECK_NO_GUARD-NOT: "Linker Options" +// CHECK_NO_GUARD-NOT: CoreFoundation |