@@ -550,6 +550,9 @@ impl<'ll> CodegenCx<'ll, '_> {
550550 self . compiler_used_statics . borrow_mut ( ) . push ( global) ;
551551 }
552552
553+ // We do our best here to match what Clang does when compiling Objective-C natively.
554+ // See Clang's `CGObjCCommonMac::CreateCStringLiteral`:
555+ // https://github.com/llvm/llvm-project/blob/llvmorg-20.1.8/clang/lib/CodeGen/CGObjCMac.cpp#L4134
553556 fn define_objc_classname ( & self , classname : & str ) -> & ' ll Value {
554557 assert_eq ! ( self . objc_abi_version( ) , 1 ) ;
555558
@@ -570,13 +573,24 @@ impl<'ll> CodegenCx<'ll, '_> {
570573 g
571574 }
572575
576+ // We do our best here to match what Clang does when compiling Objective-C natively.
577+ // See Clang's `ObjCNonFragileABITypesHelper`:
578+ // https://github.com/llvm/llvm-project/blob/llvmorg-20.1.8/clang/lib/CodeGen/CGObjCMac.cpp#L6052
573579 fn get_objc_class_t ( & self ) -> & ' ll Type {
574580 if let Some ( class_t) = self . objc_class_t . get ( ) {
575581 return class_t;
576582 }
577583
578584 assert_eq ! ( self . objc_abi_version( ) , 2 ) ;
579585
586+ // struct _class_t {
587+ // struct _class_t* isa;
588+ // struct _class_t* const superclass;
589+ // void* cache;
590+ // IMP* vtable;
591+ // struct class_ro_t* ro;
592+ // }
593+
580594 let class_t = self . type_named_struct ( "struct._class_t" ) ;
581595 let els = [ self . type_ptr ( ) ; 5 ] ;
582596 let packed = false ;
@@ -598,6 +612,8 @@ impl<'ll> CodegenCx<'ll, '_> {
598612
599613 let g = match self . objc_abi_version ( ) {
600614 1 => {
615+ // See Clang's `CGObjCMac::EmitClassRefFromId`:
616+ // https://github.com/llvm/llvm-project/blob/llvmorg-20.1.8/clang/lib/CodeGen/CGObjCMac.cpp#L5205
601617 let llval = self . define_objc_classname ( classname. as_str ( ) ) ;
602618 let llty = self . type_ptr ( ) ;
603619 let sym = self . generate_local_symbol_name ( "OBJC_CLASS_REFERENCES_" ) ;
@@ -612,7 +628,8 @@ impl<'ll> CodegenCx<'ll, '_> {
612628 g
613629 }
614630 2 => {
615- assert ! ( self . tcx. sess. target. is_like_darwin) ;
631+ // See Clang's `CGObjCNonFragileABIMac::EmitClassRefFromId`:
632+ // https://github.com/llvm/llvm-project/blob/llvmorg-20.1.8/clang/lib/CodeGen/CGObjCMac.cpp#L7423
616633 let llval = {
617634 let extern_sym = format ! ( "OBJC_CLASS_$_{}" , classname. as_str( ) ) ;
618635 let extern_llty = self . get_objc_class_t ( ) ;
@@ -649,6 +666,8 @@ impl<'ll> CodegenCx<'ll, '_> {
649666
650667 let abi_version = self . objc_abi_version ( ) ;
651668
669+ // See Clang's `CGObjCCommonMac::CreateCStringLiteral`:
670+ // https://github.com/llvm/llvm-project/blob/llvmorg-20.1.8/clang/lib/CodeGen/CGObjCMac.cpp#L4134
652671 let methname_llval = self . null_terminate_const_bytes ( methname. as_str ( ) . as_bytes ( ) ) ;
653672 let methname_llty = self . val_ty ( methname_llval) ;
654673 let methname_sym = self . generate_local_symbol_name ( "OBJC_METH_VAR_NAME_" ) ;
@@ -670,6 +689,10 @@ impl<'ll> CodegenCx<'ll, '_> {
670689 llvm:: LLVMSetUnnamedAddress ( methname_g, llvm:: UnnamedAddr :: Global ) ;
671690 self . add_compiler_used_global ( methname_g) ;
672691
692+ // See Clang's `CGObjCMac::EmitSelectorAddr`:
693+ // https://github.com/llvm/llvm-project/blob/llvmorg-20.1.8/clang/lib/CodeGen/CGObjCMac.cpp#L5243
694+ // And Clang's `CGObjCNonFragileABIMac::EmitSelectorAddr`:
695+ // https://github.com/llvm/llvm-project/blob/llvmorg-20.1.8/clang/lib/CodeGen/CGObjCMac.cpp#L7586
673696 let selref_llval = methname_g;
674697 let selref_llty = self . type_ptr ( ) ;
675698 let selref_sym = self . generate_local_symbol_name ( "OBJC_SELECTOR_REFERENCES_" ) ;
@@ -701,13 +724,18 @@ impl<'ll> CodegenCx<'ll, '_> {
701724 selref_g
702725 }
703726
727+ // We do our best here to match what Clang does when compiling Objective-C natively.
728+ // See Clang's `ObjCTypesHelper`:
729+ // https://github.com/llvm/llvm-project/blob/llvmorg-20.1.8/clang/lib/CodeGen/CGObjCMac.cpp#L5936
730+ // And Clang's `CGObjCMac::EmitModuleInfo`:
731+ // https://github.com/llvm/llvm-project/blob/llvmorg-20.1.8/clang/lib/CodeGen/CGObjCMac.cpp#L5151
704732 pub ( crate ) fn define_objc_module_info ( & mut self ) {
705733 assert_eq ! ( self . objc_abi_version( ) , 1 ) ;
706734
707735 // struct _objc_module {
708736 // long version; // Hardcoded to 7 in Clang.
709737 // long size; // sizeof(struct _objc_module)
710- // char * name; // Hardcoded to classname "" in Clang.
738+ // char* name; // Hardcoded to classname "" in Clang.
711739 // struct _objc_symtab* symtab; // Null without class or category definitions.
712740 // }
713741
0 commit comments