1// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fobjc-dispatch-method=mixed -emit-llvm -o %t %s 2 3// RUN: grep '@"OBJC_CLASS_$_A" = global' %t 4// RUN: grep '@"OBJC_CLASS_$_B" = external global' %t 5// RUN: grep '@"OBJC_IVAR_$_A._ivar" = global .* section "__DATA, __objc_ivar", align 8' %t 6// RUN: grep '@"OBJC_METACLASS_$_A" = global .* section "__DATA, __objc_data", align 8' %t 7// RUN: grep '@"\\01L_OBJC_CLASSLIST_REFERENCES_$_[0-9]*" = internal global .* section "__DATA, __objc_classrefs, regular, no_dead_strip", align 8' %t 8// RUN: grep '@"\\01L_OBJC_CLASSLIST_SUP_REFS_$_[0-9]*" = internal global .* section "__DATA, __objc_superrefs, regular, no_dead_strip", align 8' %t | count 2 9// RUN: grep '@"\\01L_OBJC_CLASS_NAME_[0-9]*" = internal global .* section "__TEXT,__objc_classname,cstring_literals", align 1' %t 10// RUN: grep '@"\\01L_OBJC_LABEL_CATEGORY_$" = internal global .* section "__DATA, __objc_catlist, regular, no_dead_strip", align 8' %t 11// RUN: grep '@"\\01L_OBJC_LABEL_CLASS_$" = internal global .* section "__DATA, __objc_classlist, regular, no_dead_strip", align 8' %t 12// RUN: grep '@"\\01L_OBJC_METH_VAR_NAME_[0-9]*" = internal global .* section "__TEXT,__objc_methname,cstring_literals", align 1' %t 13// RUN: grep '@"\\01L_OBJC_METH_VAR_TYPE_[0-9]*" = internal global .* section "__TEXT,__objc_methtype,cstring_literals", align 1' %t 14// RUN: grep '@"\\01L_OBJC_PROP_NAME_ATTR_[0-9]*" = internal global .* section "__TEXT,__cstring,cstring_literals", align 1' %t 15// RUN: grep '@"\\01L_OBJC_SELECTOR_REFERENCES_*" = internal externally_initialized global .* section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"' %t 16// RUN: grep '@"\\01l_OBJC_$_CATEGORY_A_$_Cat" = internal global .* section "__DATA, __objc_const", align 8' %t 17// RUN: grep '@"\\01l_OBJC_$_CATEGORY_CLASS_METHODS_A_$_Cat" = internal global .* section "__DATA, __objc_const", align 8' %t 18// RUN: grep '@"\\01l_OBJC_$_CATEGORY_INSTANCE_METHODS_A_$_Cat" = internal global .* section "__DATA, __objc_const", align 8' %t 19// RUN: grep '@"\\01l_OBJC_$_CLASS_METHODS_A" = internal global .* section "__DATA, __objc_const", align 8' %t 20// RUN: grep '@"\\01l_OBJC_$_INSTANCE_METHODS_A" = internal global .* section "__DATA, __objc_const", align 8' %t 21// RUN: grep '@"\\01l_OBJC_$_INSTANCE_VARIABLES_A" = internal global .* section "__DATA, __objc_const", align 8' %t 22// RUN: grep '@"\\01l_OBJC_$_PROP_LIST_A" = internal global .* section "__DATA, __objc_const", align 8' %t 23// RUN: grep '@"\\01l_OBJC_$_PROTOCOL_CLASS_METHODS_P" = internal global .* section "__DATA, __objc_const", align 8' %t 24// RUN: grep '@"\\01l_OBJC_$_PROTOCOL_INSTANCE_METHODS_P" = internal global .* section "__DATA, __objc_const", align 8' %t 25// RUN: grep '@"\\01l_OBJC_CLASS_PROTOCOLS_$_A" = internal global .* section "__DATA, __objc_const", align 8' %t 26// RUN: grep '@"\\01l_OBJC_CLASS_RO_$_A" = internal global .* section "__DATA, __objc_const", align 8' %t 27// RUN: grep '@"\\01l_OBJC_LABEL_PROTOCOL_$_P" = weak hidden global .* section "__DATA, __objc_protolist, coalesced, no_dead_strip", align 8' %t 28// RUN: grep '@"\\01l_OBJC_METACLASS_RO_$_A" = internal global .* section "__DATA, __objc_const", align 8' %t 29// RUN: grep '@"\\01l_OBJC_PROTOCOL_$_P" = weak hidden global .* section "__DATA,__datacoal_nt,coalesced", align 8' %t 30// RUN: grep '@"\\01l_objc_msgSend_fixup_alloc" = weak hidden global .* section "__DATA, __objc_msgrefs, coalesced", align 16' %t 31// RUN: grep '@_objc_empty_cache = external global' %t 32// RUN: grep '@_objc_empty_vtable = external global' %t 33// RUN: grep '@objc_msgSend_fixup(' %t 34// RUN: grep '@objc_msgSend_fpret(' %t 35 36 37/* 38 39Here is a handy command for looking at llvm-gcc's output: 40llvm-gcc -m64 -emit-llvm -S -o - metadata-symbols-64.m | \ 41 grep '=.*global' | \ 42 sed -e 's#global.*, section#global ... section#' | \ 43 sort 44 45*/ 46 47@interface B 48@end 49@interface C 50@end 51 52@protocol P 53+(void) fm0; 54-(void) im0; 55@end 56 57@interface A<P> { 58 int _ivar; 59} 60 61@property (assign) int ivar; 62 63+(void) fm0; 64-(void) im0; 65@end 66 67@implementation A 68@synthesize ivar = _ivar; 69+(void) fm0 { 70} 71-(void) im0 { 72} 73@end 74 75@implementation A (Cat) 76+(void) fm1 { 77} 78-(void) im1 { 79} 80@end 81 82@interface D : A 83@end 84 85@implementation D 86+(void) fm2 { 87 [super fm1]; 88} 89-(void) im2 { 90 [super im1]; 91} 92@end 93 94// Test for FP dispatch method APIs 95@interface Example 96@end 97 98float FLOAT; 99double DOUBLE; 100long double LONGDOUBLE; 101id ID; 102 103@implementation Example 104 - (double) RET_DOUBLE 105 { 106 return DOUBLE; 107 } 108 - (float) RET_FLOAT 109 { 110 return FLOAT; 111 } 112 - (long double) RET_LONGDOUBLE 113 { 114 return LONGDOUBLE; 115 } 116@end 117 118void *f0(id x) { 119 Example* pe; 120 double dd = [pe RET_DOUBLE]; 121 dd = [pe RET_FLOAT]; 122 dd = [pe RET_LONGDOUBLE]; 123 124 [B im0]; 125 [C im1]; 126 [D alloc]; 127} 128 129