diff options
Diffstat (limited to 'clang/test/CodeGenObjC/dllstorage.m')
-rw-r--r-- | clang/test/CodeGenObjC/dllstorage.m | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/clang/test/CodeGenObjC/dllstorage.m b/clang/test/CodeGenObjC/dllstorage.m new file mode 100644 index 00000000000..4bdbd509151 --- /dev/null +++ b/clang/test/CodeGenObjC/dllstorage.m @@ -0,0 +1,151 @@ +// RUN: %clang_cc1 -triple i686-windows-itanium -fms-extensions -fobjc-runtime=macosx -fdeclspec -fobjc-exceptions -S -emit-llvm -o - %s | FileCheck -check-prefix CHECK-IR %s +// RUN: %clang_cc1 -triple i686-windows-itanium -fms-extensions -fobjc-runtime=objfw -fdeclspec -fobjc-exceptions -S -emit-llvm -o - %s | FileCheck -check-prefix CHECK-FW %s + +// CHECK-IR-DAG: @_objc_empty_cache = external dllimport global %struct._objc_cache + +__declspec(dllimport) +@interface I ++ (instancetype) new; +@end + +// CHECK-IR-DAG: @"OBJC_METACLASS_$_I" = external dllimport global %struct._class_t +// CHECK-IR-DAG: @"OBJC_CLASS_$_I" = external dllimport global %struct._class_t + +__declspec(dllexport) +@interface J : I +@end + +// CHECK-IR-DAG: @"OBJC_METACLASS_$_J" = dllexport global %struct._class_t +// CHECK-IR-DAG: @"OBJC_CLASS_$_J" = dllexport global %struct._class_t + +// CHECK-FW-DAG: @_OBJC_METACLASS_J = dllexport global +// CHECK-FW-DAG: @_OBJC_CLASS_J = dllexport global + +@implementation J { + id _ivar; +} +@end + +// CHECK-IR-DAG: @"OBJC_IVAR_$_J._ivar" = global i32 + +@interface K : J +@end + +// CHECK-IR-DAG: @"OBJC_METACLASS_$_K" = global %struct._class_t +// CHECK-IR-DAG: @"OBJC_CLASS_$_K" = global %struct._class_t + +// CHECK-FW-DAG: @_OBJC_METACLASS_K = global +// CHECK-FW-DAG: @_OBJC_CLASS_K = global + +@implementation K { + id _ivar; +} +@end + +// CHECK-IR-DAG: @"OBJC_IVAR_$_K._ivar" = global i32 + +__declspec(dllexport) +@interface L : K +@end + +// CHECK-IR-DAG: @"OBJC_METACLASS_$_L" = dllexport global %struct._class_t +// CHECK-IR-DAG: @"OBJC_CLASS_$_L" = dllexport global %struct._class_t + +// CHECK-FW-DAG: @_OBJC_METACLASS_L = dllexport global +// CHECK-FW-DAG: @_OBJC_CLASS_L = dllexport global + +@implementation L { + id _none; + + @public + id _public; + + @protected + id _protected; + + @package + id _package; + + @private + id _private; +} +@end + +// CHECK-IR-DAG: @"OBJC_IVAR_$_L._none" = global i32 +// CHECK-IR-DAG: @"OBJC_IVAR_$_L._public" = dllexport global i32 +// CHECK-IR-DAG: @"OBJC_IVAR_$_L._protected" = dllexport global i32 +// CHECK-IR-DAG: @"OBJC_IVAR_$_L._package" = global i32 +// CHECK-IR-DAG: @"OBJC_IVAR_$_L._private" = global i32 + +__declspec(dllimport) +@interface M : I { + @public + id _ivar; +} +@end + +// CHEKC-FW-DAG: @_OBJC_CLASS_M = external dllimport global i32 + +// CHECK-IR-DAG: @"OBJC_IVAR_$_M._ivar" = external dllimport global i32 + +__declspec(dllexport) +__attribute__((__objc_exception__)) +@interface N : I +@end + +// CHECK-FW-DAG: @_OBJC_METACLASS_N = dllexport global +// CHECK-FW-DAG: @_OBJC_CLASS_N = dllexport global + +@implementation N : I +@end + +// CHECK-IR-DAG: @"OBJC_EHTYPE_$_N" = dllexport global %struct._objc_typeinfo + +__declspec(dllimport) +__attribute__((__objc_exception__)) +@interface O : I +@end + +// CHECK-IR-DAG: @"OBJC_EHTYPE_$_O" = external dllimport global %struct._objc_typeinfo + +__attribute__((__objc_exception__)) +@interface P : I +@end + +// CHECK-IR-DAG: @"OBJC_EHTYPE_$_P" = external global %struct._objc_typeinfo + +int g() { + @autoreleasepool { + M *mi = [M new]; + @try { + mi->_ivar = (void *)0; + @throw(@"CFConstantString"); + } @catch (id) { + return 1; + } @catch (I *) { + return 2; + } @catch (J *) { + return 3; + } @catch (K *) { + return 4; + } @catch (L *) { + return 5; + } @catch (M *) { + return 6; + } @catch (N *) { + return 7; + } @catch (O *) { + return 8; + } @catch (P *) { + return 9; + } + } + return 0; +} + +// CHECK-IR-DAG: @OBJC_EHTYPE_id = external dllimport global %struct._objc_typeinfo +// CHECK-IR-DAG: @"OBJC_EHTYPE_$_I" = weak global %struct._objc_typeinfo +// CHECK-IR-DAG: @"OBJC_EHTYPE_$_K" = weak global %struct._objc_typeinfo +// CHECK-IR-DAG: @"OBJC_EHTYPE_$_L" = weak global %struct._objc_typeinfo +// CHECK-IR-DAG: @"OBJC_EHTYPE_$_M" = weak global %struct._objc_typeinfo + |