Skip to content

Commit a9521e4

Browse files
committed
add CodegenCx::objc_abi_version() to replace scattered target checks
1 parent 8de88a2 commit a9521e4

File tree

5 files changed

+81
-69
lines changed

5 files changed

+81
-69
lines changed

compiler/rustc_codegen_llvm/src/base.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ pub(crate) fn compile_codegen_unit(
116116
// magic. We could theoretically do it unconditionally, but at a slight cost to linker
117117
// performance in the common case where it's unnecessary.
118118
if !cx.objc_classrefs.borrow().is_empty() || !cx.objc_selrefs.borrow().is_empty() {
119-
if cx.tcx.sess.target.arch == "x86" && cx.tcx.sess.target.os == "macos" {
119+
if cx.objc_abi_version() == 1 {
120120
cx.define_objc_module_info();
121121
}
122122
cx.add_objc_module_flags();

compiler/rustc_codegen_llvm/src/consts.rs

Lines changed: 63 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -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.

compiler/rustc_codegen_llvm/src/context.rs

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -688,17 +688,24 @@ impl<'ll, 'tcx> CodegenCx<'ll, 'tcx> {
688688
llvm::set_section(g, c"llvm.metadata");
689689
}
690690

691-
pub(crate) fn add_objc_module_flags(&self) {
692-
// Darwin-like targets only.
693-
assert!(self.tcx.sess.target.is_like_darwin);
694-
let is_x86_32_macos =
695-
self.tcx.sess.target.arch == "x86" && self.tcx.sess.target.os == "macos";
691+
pub(crate) fn objc_abi_version(&self) -> u32 {
692+
if self.tcx.sess.target.arch == "x86" && self.tcx.sess.target.os == "macos" {
693+
// 32-bit x86 macOS uses ABI version 1.
694+
1
695+
} else {
696+
// All other Darwin-like targets we support use ABI version 2.
697+
assert!(self.tcx.sess.target.is_like_darwin);
698+
2
699+
}
700+
}
696701

702+
pub(crate) fn add_objc_module_flags(&self) {
703+
let abi_version = self.objc_abi_version();
697704
llvm::add_module_flag_u32(
698705
self.llmod,
699706
llvm::ModuleFlagMergeBehavior::Error,
700707
"Objective-C Version",
701-
if is_x86_32_macos { 1 } else { 2 },
708+
abi_version,
702709
);
703710

704711
llvm::add_module_flag_u32(
@@ -712,10 +719,10 @@ impl<'ll, 'tcx> CodegenCx<'ll, 'tcx> {
712719
self.llmod,
713720
llvm::ModuleFlagMergeBehavior::Error,
714721
"Objective-C Image Info Section",
715-
if is_x86_32_macos {
716-
"__OBJC,__image_info,regular"
717-
} else {
718-
"__DATA,__objc_imageinfo,regular,no_dead_strip"
722+
match abi_version {
723+
1 => "__OBJC,__image_info,regular",
724+
2 => "__DATA,__objc_imageinfo,regular,no_dead_strip",
725+
_ => unreachable!(),
719726
},
720727
);
721728

File renamed without changes.

0 commit comments

Comments
 (0)