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