@@ -551,9 +551,7 @@ impl<'ll> CodegenCx<'ll, '_> {
551551 }
552552
553553 fn define_objc_classname ( & self , classname : & str ) -> & ' ll Value {
554- // 32-bit x86 macOS only.
555- assert_eq ! ( self . tcx. sess. target. arch, "x86" ) ;
556- assert_eq ! ( self . tcx. sess. target. os, "macos" ) ;
554+ assert_eq ! ( self . objc_abi_version( ) , 1 ) ;
557555
558556 let llval = self . null_terminate_const_bytes ( classname. as_bytes ( ) ) ;
559557 let llty = self . val_ty ( llval) ;
@@ -577,9 +575,7 @@ impl<'ll> CodegenCx<'ll, '_> {
577575 return class_t;
578576 }
579577
580- // Darwin-like targets other than 32-bit x86 macOS.
581- assert ! ( self . tcx. sess. target. is_like_darwin) ;
582- assert ! ( self . tcx. sess. target. arch != "x86" || self . tcx. sess. target. os != "macos" ) ;
578+ assert_eq ! ( self . objc_abi_version( ) , 2 ) ;
583579
584580 let class_t = self . type_named_struct ( "struct._class_t" ) ;
585581 let els = [ self . type_ptr ( ) ; 5 ] ;
@@ -600,39 +596,41 @@ impl<'ll> CodegenCx<'ll, '_> {
600596 return classref;
601597 }
602598
603- let g = if self . tcx . sess . target . arch == "x86" && self . tcx . sess . target . os == "macos" {
604- // 32-bit x86 macOS.
605- let llval = self . define_objc_classname ( classname. as_str ( ) ) ;
606- let llty = self . type_ptr ( ) ;
607- let sym = self . generate_local_symbol_name ( "OBJC_CLASS_REFERENCES_" ) ;
608- let g = self . define_global ( & sym, llty) . unwrap_or_else ( || {
609- bug ! ( "symbol `{}` is already defined" , sym) ;
610- } ) ;
611- set_global_alignment ( self , g, self . tcx . data_layout . pointer_align ( ) . abi ) ;
612- llvm:: set_initializer ( g, llval) ;
613- llvm:: set_linkage ( g, llvm:: Linkage :: PrivateLinkage ) ;
614- llvm:: set_section ( g, c"__OBJC,__cls_refs,literal_pointers,no_dead_strip" ) ;
615- self . add_compiler_used_global ( g) ;
616- g
617- } else {
618- // Darwin-like targets other than 32-bit x86 macOS.
619- assert ! ( self . tcx. sess. target. is_like_darwin) ;
620- let llval = {
621- let extern_sym = format ! ( "OBJC_CLASS_$_{}" , classname. as_str( ) ) ;
622- let extern_llty = self . get_objc_class_t ( ) ;
623- self . declare_global ( & extern_sym, extern_llty)
624- } ;
625- let llty = self . type_ptr ( ) ;
626- let sym = self . generate_local_symbol_name ( "OBJC_CLASSLIST_REFERENCES_$_" ) ;
627- let g = self . define_global ( & sym, llty) . unwrap_or_else ( || {
628- bug ! ( "symbol `{}` is already defined" , sym) ;
629- } ) ;
630- set_global_alignment ( self , g, self . tcx . data_layout . pointer_align ( ) . abi ) ;
631- llvm:: set_initializer ( g, llval) ;
632- llvm:: set_linkage ( g, llvm:: Linkage :: InternalLinkage ) ;
633- llvm:: set_section ( g, c"__DATA,__objc_classrefs,regular,no_dead_strip" ) ;
634- self . add_compiler_used_global ( g) ;
635- g
599+ let g = match self . objc_abi_version ( ) {
600+ 1 => {
601+ let llval = self . define_objc_classname ( classname. as_str ( ) ) ;
602+ let llty = self . type_ptr ( ) ;
603+ let sym = self . generate_local_symbol_name ( "OBJC_CLASS_REFERENCES_" ) ;
604+ let g = self . define_global ( & sym, llty) . unwrap_or_else ( || {
605+ bug ! ( "symbol `{}` is already defined" , sym) ;
606+ } ) ;
607+ set_global_alignment ( self , g, self . tcx . data_layout . pointer_align ( ) . abi ) ;
608+ llvm:: set_initializer ( g, llval) ;
609+ llvm:: set_linkage ( g, llvm:: Linkage :: PrivateLinkage ) ;
610+ llvm:: set_section ( g, c"__OBJC,__cls_refs,literal_pointers,no_dead_strip" ) ;
611+ self . add_compiler_used_global ( g) ;
612+ g
613+ }
614+ 2 => {
615+ assert ! ( self . tcx. sess. target. is_like_darwin) ;
616+ let llval = {
617+ let extern_sym = format ! ( "OBJC_CLASS_$_{}" , classname. as_str( ) ) ;
618+ let extern_llty = self . get_objc_class_t ( ) ;
619+ self . declare_global ( & extern_sym, extern_llty)
620+ } ;
621+ let llty = self . type_ptr ( ) ;
622+ let sym = self . generate_local_symbol_name ( "OBJC_CLASSLIST_REFERENCES_$_" ) ;
623+ let g = self . define_global ( & sym, llty) . unwrap_or_else ( || {
624+ bug ! ( "symbol `{}` is already defined" , sym) ;
625+ } ) ;
626+ set_global_alignment ( self , g, self . tcx . data_layout . pointer_align ( ) . abi ) ;
627+ llvm:: set_initializer ( g, llval) ;
628+ llvm:: set_linkage ( g, llvm:: Linkage :: InternalLinkage ) ;
629+ llvm:: set_section ( g, c"__DATA,__objc_classrefs,regular,no_dead_strip" ) ;
630+ self . add_compiler_used_global ( g) ;
631+ g
632+ }
633+ _ => unreachable ! ( ) ,
636634 } ;
637635
638636 classrefs. insert ( classname, g) ;
@@ -649,10 +647,7 @@ impl<'ll> CodegenCx<'ll, '_> {
649647 return selref;
650648 }
651649
652- // Darwin-like targets only.
653- assert ! ( self . tcx. sess. target. is_like_darwin) ;
654- let is_x86_32_macos =
655- self . tcx . sess . target . arch == "x86" && self . tcx . sess . target . os == "macos" ;
650+ let abi_version = self . objc_abi_version ( ) ;
656651
657652 let methname_llval = self . null_terminate_const_bytes ( methname. as_str ( ) . as_bytes ( ) ) ;
658653 let methname_llty = self . val_ty ( methname_llval) ;
@@ -663,11 +658,14 @@ impl<'ll> CodegenCx<'ll, '_> {
663658 set_global_alignment ( self , methname_g, self . tcx . data_layout . i8_align . abi ) ;
664659 llvm:: set_initializer ( methname_g, methname_llval) ;
665660 llvm:: set_linkage ( methname_g, llvm:: Linkage :: PrivateLinkage ) ;
666- if is_x86_32_macos {
667- llvm:: set_section ( methname_g, c"__TEXT,__cstring,cstring_literals" ) ;
668- } else {
669- llvm:: set_section ( methname_g, c"__TEXT,__objc_methname,cstring_literals" ) ;
670- }
661+ llvm:: set_section (
662+ methname_g,
663+ match abi_version {
664+ 1 => c"__TEXT,__cstring,cstring_literals" ,
665+ 2 => c"__TEXT,__objc_methname,cstring_literals" ,
666+ _ => unreachable ! ( ) ,
667+ } ,
668+ ) ;
671669 llvm:: LLVMSetGlobalConstant ( methname_g, llvm:: True ) ;
672670 llvm:: LLVMSetUnnamedAddress ( methname_g, llvm:: UnnamedAddr :: Global ) ;
673671 self . add_compiler_used_global ( methname_g) ;
@@ -681,23 +679,30 @@ impl<'ll> CodegenCx<'ll, '_> {
681679 set_global_alignment ( self , selref_g, self . tcx . data_layout . pointer_align ( ) . abi ) ;
682680 llvm:: set_initializer ( selref_g, selref_llval) ;
683681 llvm:: set_externally_initialized ( selref_g, true ) ;
684- if is_x86_32_macos {
685- llvm:: set_linkage ( selref_g, llvm:: Linkage :: PrivateLinkage ) ;
686- llvm:: set_section ( selref_g, c"__OBJC,__message_refs,literal_pointers,no_dead_strip" ) ;
687- } else {
688- llvm:: set_linkage ( selref_g, llvm:: Linkage :: InternalLinkage ) ;
689- llvm:: set_section ( selref_g, c"__DATA,__objc_selrefs,literal_pointers,no_dead_strip" ) ;
690- }
682+ llvm:: set_linkage (
683+ selref_g,
684+ match abi_version {
685+ 1 => llvm:: Linkage :: PrivateLinkage ,
686+ 2 => llvm:: Linkage :: InternalLinkage ,
687+ _ => unreachable ! ( ) ,
688+ } ,
689+ ) ;
690+ llvm:: set_section (
691+ selref_g,
692+ match abi_version {
693+ 1 => c"__OBJC,__message_refs,literal_pointers,no_dead_strip" ,
694+ 2 => c"__DATA,__objc_selrefs,literal_pointers,no_dead_strip" ,
695+ _ => unreachable ! ( ) ,
696+ } ,
697+ ) ;
691698 self . add_compiler_used_global ( selref_g) ;
692699
693700 selrefs. insert ( methname, selref_g) ;
694701 selref_g
695702 }
696703
697704 pub ( crate ) fn define_objc_module_info ( & mut self ) {
698- // 32-bit x86 macOS only.
699- assert_eq ! ( self . tcx. sess. target. arch, "x86" ) ;
700- assert_eq ! ( self . tcx. sess. target. os, "macos" ) ;
705+ assert_eq ! ( self . objc_abi_version( ) , 1 ) ;
701706
702707 // struct _objc_module {
703708 // long version; // Hardcoded to 7 in Clang.
0 commit comments