1// RUN: %clang_cc1 -triple x86_64-unknown-windows-msvc -fdeclspec -fobjc-runtime=ios -fobjc-exceptions -emit-llvm -o - %s | FileCheck -allow-deprecated-dag-overlap -check-prefix CHECK-IR %s 2// RUN: %clang_cc1 -triple x86_64-unknown-windows-msvc -fdeclspec -fobjc-runtime=gnustep-2.0 -fobjc-exceptions -emit-llvm -o - %s | FileCheck -allow-deprecated-dag-overlap -check-prefix CHECK-NF %s 3// RUN: %clang_cc1 -triple i686-windows-itanium -fms-extensions -fobjc-runtime=macosx -fdeclspec -fobjc-exceptions -emit-llvm -o - %s | FileCheck -allow-deprecated-dag-overlap -check-prefix CHECK-IR %s 4// RUN: %clang_cc1 -triple i686-windows-itanium -fms-extensions -fobjc-runtime=objfw -fdeclspec -fobjc-exceptions -emit-llvm -o - %s | FileCheck -allow-deprecated-dag-overlap -check-prefix CHECK-FW %s 5 6// CHECK-IR-DAG: @_objc_empty_cache = external dllimport global %struct._objc_cache 7 8__declspec(dllimport) 9@interface I 10+ (instancetype) new; 11@end 12 13// CHECK-IR-DAG: @"OBJC_METACLASS_$_I" = external dllimport global %struct._class_t 14// CHECK-IR-DAG: @"OBJC_CLASS_$_I" = external dllimport global %struct._class_t 15 16// CHECK-NF-DAG: @"$_OBJC_CLASS_I" = external dllimport global ptr 17 18__declspec(dllexport) 19@interface J : I 20@end 21 22// CHECK-IR-DAG: @"OBJC_METACLASS_$_J" = dso_local dllexport global %struct._class_t 23// CHECK-IR-DAG: @"OBJC_CLASS_$_J" = dso_local dllexport global %struct._class_t 24 25// CHECK-FW-DAG: @_OBJC_METACLASS_J = dso_local dllexport global 26// CHECK-FW-DAG: @_OBJC_CLASS_J = dso_local dllexport global 27 28// CHECK-NF-DAG: @"$_OBJC_METACLASS_J" = internal global 29// CHECK-NF-DAG: @"$_OBJC_CLASS_J" = dllexport global 30 31@implementation J { 32 id _ivar; 33} 34@end 35 36// CHECK-IR-DAG: @"OBJC_IVAR_$_J._ivar" = global i32 37 38// CHECK-NF-DAG: @"__objc_ivar_offset_J._ivar.@" = hidden global i32 39 40@interface K : J 41@end 42 43// CHECK-IR-DAG: @"OBJC_METACLASS_$_K" = dso_local global %struct._class_t 44// CHECK-IR-DAG: @"OBJC_CLASS_$_K" = dso_local global %struct._class_t 45 46// CHECK-FW-DAG: @_OBJC_METACLASS_K = dso_local global 47// CHECK-FW-DAG: @_OBJC_CLASS_K = dso_local global 48 49// CHECK-NF-DAG: @"$_OBJC_METACLASS_K" = internal global 50// CHECK-NF-DAG: @"$_OBJC_CLASS_K" = global 51 52@implementation K { 53 id _ivar; 54} 55@end 56 57// CHECK-IR-DAG: @"OBJC_IVAR_$_K._ivar" = global i32 58 59// CHECK-NF-DAG: @"__objc_ivar_offset_K._ivar.@" = hidden global i32 60 61__declspec(dllexport) 62@interface L : K 63@end 64 65// CHECK-IR-DAG: @"OBJC_METACLASS_$_L" = dso_local dllexport global %struct._class_t 66// CHECK-IR-DAG: @"OBJC_CLASS_$_L" = dso_local dllexport global %struct._class_t 67 68// CHECK-FW-DAG: @_OBJC_METACLASS_L = dso_local dllexport global 69// CHECK-FW-DAG: @_OBJC_CLASS_L = dso_local dllexport global 70 71// CHECK-NF-DAG: @"$_OBJC_METACLASS_L" = internal global 72// CHECK-NF-DAG: @"$_OBJC_CLASS_L" = dllexport global 73 74@implementation L { 75 id _none; 76 77 @public 78 id _public; 79 80 @protected 81 id _protected; 82 83 @package 84 id _package; 85 86 @private 87 id _private; 88} 89@end 90 91// CHECK-IR-DAG: @"OBJC_IVAR_$_L._none" = global i32 92// CHECK-IR-DAG: @"OBJC_IVAR_$_L._public" = dllexport global i32 93// CHECK-IR-DAG: @"OBJC_IVAR_$_L._protected" = dllexport global i32 94// CHECK-IR-DAG: @"OBJC_IVAR_$_L._package" = global i32 95// CHECK-IR-DAG: @"OBJC_IVAR_$_L._private" = global i32 96 97// CHECK-NF-DAG: @"__objc_ivar_offset_L._none.@" = hidden global i32 98// CHECK-NF-DAG: @"__objc_ivar_offset_L._public.@" = dso_local dllexport global i32 99// CHECK-NF-DAG: @"__objc_ivar_offset_L._protected.@" = dso_local dllexport global i32 100// CHECK-NF-DAG: @"__objc_ivar_offset_L._package.@" = hidden global i32 101// CHECK-NF-DAG: @"__objc_ivar_offset_L._private.@" = hidden global i32 102 103__declspec(dllimport) 104@interface M : I { 105 @public 106 id _ivar; 107} 108@end 109 110// CHECK-FW-DAG: @_OBJC_CLASS_M = external dllimport global i32 111 112// CHECK-IR-DAG: @"OBJC_IVAR_$_M._ivar" = external dllimport global i32 113 114// CHECK-NF-DAG: @"$_OBJC_REF_CLASS_M" = external dllimport global ptr 115// CHECK-NF-DAG: @"__objc_ivar_offset_M._ivar.@" = external dllimport global i32 116 117__declspec(dllexport) 118__attribute__((__objc_exception__)) 119@interface N : I 120@end 121 122// CHECK-FW-DAG: @_OBJC_METACLASS_N = dso_local dllexport global 123// CHECK-FW-DAG: @_OBJC_CLASS_N = dso_local dllexport global 124 125// CHECK-NF-DAG: @"$_OBJC_CLASS_N" = dllexport global 126 127@implementation N : I 128@end 129 130// CHECK-IR-DAG: @"OBJC_EHTYPE_$_N" = dso_local dllexport global %struct._objc_typeinfo 131 132__declspec(dllimport) 133__attribute__((__objc_exception__)) 134@interface O : I 135@end 136 137// CHECK-IR-DAG: @"OBJC_EHTYPE_$_O" = external dllimport global %struct._objc_typeinfo 138 139__attribute__((__objc_exception__)) 140@interface P : I 141@end 142 143// CHECK-IR-DAG: @"OBJC_EHTYPE_$_P" = external dso_local global %struct._objc_typeinfo 144 145@interface Q : M 146@end 147 148id f(Q *q) { 149 return q->_ivar; 150} 151 152// CHECK-IR-DAG: @"OBJC_IVAR_$_M._ivar" = external dllimport global i32 153 154// CHECK-NF-DAG: @"__objc_ivar_offset_M._ivar.@" = external dllimport global i32 155 156int g(void) { 157 @autoreleasepool { 158 M *mi = [M new]; 159 @try { 160 mi->_ivar = (void *)0; 161 @throw(@"CFConstantString"); 162 } @catch (id) { 163 return 1; 164 } @catch (I *) { 165 return 2; 166 } @catch (J *) { 167 return 3; 168 } @catch (K *) { 169 return 4; 170 } @catch (L *) { 171 return 5; 172 } @catch (M *) { 173 return 6; 174 } @catch (N *) { 175 return 7; 176 } @catch (O *) { 177 return 8; 178 } @catch (P *) { 179 return 9; 180 } 181 } 182 return 0; 183} 184 185// CHECK-IR-DAG: @OBJC_EHTYPE_id = external dllimport global %struct._objc_typeinfo 186// CHECK-IR-DAG: @"OBJC_EHTYPE_$_I" = weak global %struct._objc_typeinfo 187// CHECK-IR-DAG: @"OBJC_EHTYPE_$_K" = weak global %struct._objc_typeinfo 188// CHECK-IR-DAG: @"OBJC_EHTYPE_$_L" = weak global %struct._objc_typeinfo 189// CHECK-IR-DAG: @"OBJC_EHTYPE_$_M" = weak global %struct._objc_typeinfo 190 191