1; REQUIRES: system-darwin 2; RUN: env ASAN_OPTIONS=detect_leaks=0 lli -jit-kind=orc-lazy %s 3; 4; Sanity check MachO Platform support: Call a no-op method (returning int 0) on 5; an ObjC object. This test checks that we correctly auto-identify this as a 6; MachO target, configure MachOPlatform support, and correctly register the 7; class metadata and method selector with the Objective-C runtime. 8 9source_filename = "objc-minimal.mm" 10target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" 11target triple = "x86_64-apple-macosx10.14.0" 12 13%0 = type opaque 14%struct._objc_cache = type opaque 15%struct._class_t = type { %struct._class_t*, %struct._class_t*, %struct._objc_cache*, i8* (i8*, i8*)**, %struct._class_ro_t* } 16%struct._class_ro_t = type { i32, i32, i32, i8*, i8*, %struct.__method_list_t*, %struct._objc_protocol_list*, %struct._ivar_list_t*, i8*, %struct._prop_list_t* } 17%struct.__method_list_t = type { i32, i32, [0 x %struct._objc_method] } 18%struct._objc_method = type { i8*, i8*, i8* } 19%struct._objc_protocol_list = type { i64, [0 x %struct._protocol_t*] } 20%struct._protocol_t = type { i8*, i8*, %struct._objc_protocol_list*, %struct.__method_list_t*, %struct.__method_list_t*, %struct.__method_list_t*, %struct.__method_list_t*, %struct._prop_list_t*, i32, i32, i8**, i8*, %struct._prop_list_t* } 21%struct._ivar_list_t = type { i32, i32, [0 x %struct._ivar_t] } 22%struct._ivar_t = type { i64*, i8*, i8*, i32, i32 } 23%struct._prop_list_t = type { i32, i32, [0 x %struct._prop_t] } 24%struct._prop_t = type { i8*, i8* } 25 26@_objc_empty_cache = external global %struct._objc_cache 27@"OBJC_METACLASS_$_NSObject" = external global %struct._class_t 28@OBJC_CLASS_NAME_ = private unnamed_addr constant [4 x i8] c"Foo\00", section "__TEXT,__objc_classname,cstring_literals", align 1 29@"\01l_OBJC_METACLASS_RO_$_Foo" = private global %struct._class_ro_t { i32 1, i32 40, i32 40, i8* null, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @OBJC_CLASS_NAME_, i32 0, i32 0), %struct.__method_list_t* null, %struct._objc_protocol_list* null, %struct._ivar_list_t* null, i8* null, %struct._prop_list_t* null }, section "__DATA, __objc_const", align 8 30@"OBJC_METACLASS_$_Foo" = global %struct._class_t { %struct._class_t* @"OBJC_METACLASS_$_NSObject", %struct._class_t* @"OBJC_METACLASS_$_NSObject", %struct._objc_cache* @_objc_empty_cache, i8* (i8*, i8*)** null, %struct._class_ro_t* @"\01l_OBJC_METACLASS_RO_$_Foo" }, section "__DATA, __objc_data", align 8 31@"OBJC_CLASS_$_NSObject" = external global %struct._class_t 32@OBJC_METH_VAR_NAME_ = private unnamed_addr constant [4 x i8] c"foo\00", section "__TEXT,__objc_methname,cstring_literals", align 1 33@OBJC_METH_VAR_TYPE_ = private unnamed_addr constant [8 x i8] c"i16@0:8\00", section "__TEXT,__objc_methtype,cstring_literals", align 1 34@"\01l_OBJC_$_INSTANCE_METHODS_Foo" = private global { i32, i32, [1 x %struct._objc_method] } { i32 24, i32 1, [1 x %struct._objc_method] [%struct._objc_method { i8* getelementptr inbounds ([4 x i8], [4 x i8]* @OBJC_METH_VAR_NAME_, i32 0, i32 0), i8* getelementptr inbounds ([8 x i8], [8 x i8]* @OBJC_METH_VAR_TYPE_, i32 0, i32 0), i8* bitcast (i32 (%0*, i8*)* @"\01-[Foo foo]" to i8*) }] }, section "__DATA, __objc_const", align 8 35@"\01l_OBJC_CLASS_RO_$_Foo" = private global %struct._class_ro_t { i32 0, i32 8, i32 8, i8* null, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @OBJC_CLASS_NAME_, i32 0, i32 0), %struct.__method_list_t* bitcast ({ i32, i32, [1 x %struct._objc_method] }* @"\01l_OBJC_$_INSTANCE_METHODS_Foo" to %struct.__method_list_t*), %struct._objc_protocol_list* null, %struct._ivar_list_t* null, i8* null, %struct._prop_list_t* null }, section "__DATA, __objc_const", align 8 36@"OBJC_CLASS_$_Foo" = global %struct._class_t { %struct._class_t* @"OBJC_METACLASS_$_Foo", %struct._class_t* @"OBJC_CLASS_$_NSObject", %struct._objc_cache* @_objc_empty_cache, i8* (i8*, i8*)** null, %struct._class_ro_t* @"\01l_OBJC_CLASS_RO_$_Foo" }, section "__DATA, __objc_data", align 8 37@"OBJC_CLASSLIST_REFERENCES_$_" = private global %struct._class_t* @"OBJC_CLASS_$_Foo", section "__DATA,__objc_classrefs,regular,no_dead_strip", align 8 38@OBJC_METH_VAR_NAME_.1 = private unnamed_addr constant [5 x i8] c"init\00", section "__TEXT,__objc_methname,cstring_literals", align 1 39@OBJC_SELECTOR_REFERENCES_ = private externally_initialized global i8* getelementptr inbounds ([5 x i8], [5 x i8]* @OBJC_METH_VAR_NAME_.1, i64 0, i64 0), section "__DATA,__objc_selrefs,literal_pointers,no_dead_strip", align 8 40@OBJC_SELECTOR_REFERENCES_.2 = private externally_initialized global i8* getelementptr inbounds ([4 x i8], [4 x i8]* @OBJC_METH_VAR_NAME_, i64 0, i64 0), section "__DATA,__objc_selrefs,literal_pointers,no_dead_strip", align 8 41@"OBJC_LABEL_CLASS_$" = private global [1 x i8*] [i8* bitcast (%struct._class_t* @"OBJC_CLASS_$_Foo" to i8*)], section "__DATA,__objc_classlist,regular,no_dead_strip", align 8 42@llvm.compiler.used = appending global [9 x i8*] [i8* bitcast ({ i32, i32, [1 x %struct._objc_method] }* @"\01l_OBJC_$_INSTANCE_METHODS_Foo" to i8*), i8* bitcast (%struct._class_t** @"OBJC_CLASSLIST_REFERENCES_$_" to i8*), i8* getelementptr inbounds ([4 x i8], [4 x i8]* @OBJC_CLASS_NAME_, i32 0, i32 0), i8* bitcast ([1 x i8*]* @"OBJC_LABEL_CLASS_$" to i8*), i8* getelementptr inbounds ([4 x i8], [4 x i8]* @OBJC_METH_VAR_NAME_, i32 0, i32 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @OBJC_METH_VAR_NAME_.1, i32 0, i32 0), i8* getelementptr inbounds ([8 x i8], [8 x i8]* @OBJC_METH_VAR_TYPE_, i32 0, i32 0), i8* bitcast (i8** @OBJC_SELECTOR_REFERENCES_ to i8*), i8* bitcast (i8** @OBJC_SELECTOR_REFERENCES_.2 to i8*)], section "llvm.metadata" 43 44; Function Attrs: noinline norecurse nounwind readnone ssp uwtable 45define internal i32 @"\01-[Foo foo]"(%0* nocapture readnone, i8* nocapture readnone) { 46 ret i32 0 47} 48 49; Function Attrs: noinline norecurse ssp uwtable 50define i32 @main(i32, i8** nocapture readnone) local_unnamed_addr { 51 %3 = load i8*, i8** bitcast (%struct._class_t** @"OBJC_CLASSLIST_REFERENCES_$_" to i8**), align 8 52 %4 = tail call i8* @objc_alloc(i8* %3) 53 %5 = load i8*, i8** @OBJC_SELECTOR_REFERENCES_, align 8 54 %6 = tail call i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*)*)(i8* %4, i8* %5) 55 %7 = load i8*, i8** @OBJC_SELECTOR_REFERENCES_.2, align 8 56 %8 = tail call i32 bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i32 (i8*, i8*)*)(i8* %6, i8* %7) 57 ret i32 %8 58} 59 60declare i8* @objc_alloc(i8*) local_unnamed_addr 61 62; Function Attrs: nonlazybind 63declare i8* @objc_msgSend(i8*, i8*, ...) local_unnamed_addr 64 65!llvm.module.flags = !{!0, !1, !2, !3, !4, !5, !6 } 66 67!0 = !{i32 2, !"SDK Version", [2 x i32] [i32 10, i32 15]} 68!1 = !{i32 1, !"Objective-C Version", i32 2} 69!2 = !{i32 1, !"Objective-C Image Info Version", i32 0} 70!3 = !{i32 1, !"Objective-C Image Info Section", !"__DATA,__objc_imageinfo,regular,no_dead_strip"} 71!4 = !{i32 4, !"Objective-C Garbage Collection", i32 0} 72!5 = !{i32 1, !"Objective-C Class Properties", i32 64} 73!6 = !{i32 1, !"wchar_size", i32 4} 74