Skip to content

Commit 272733b

Browse files
committed
comments linking to Clang's CGObjCMac.cpp
1 parent 1d4b866 commit 272733b

File tree

2 files changed

+37
-4
lines changed

2 files changed

+37
-4
lines changed

compiler/rustc_codegen_llvm/src/consts.rs

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

compiler/rustc_codegen_llvm/src/context.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -690,17 +690,22 @@ impl<'ll, 'tcx> CodegenCx<'ll, 'tcx> {
690690

691691
pub(crate) fn objc_abi_version(&self) -> u32 {
692692
if self.tcx.sess.target.arch == "x86" && self.tcx.sess.target.os == "macos" {
693-
// 32-bit x86 macOS uses ABI version 1.
693+
// 32-bit x86 macOS uses ABI version 1 (a.k.a. the "fragile ABI").
694694
1
695695
} else {
696-
// All other Darwin-like targets we support use ABI version 2.
696+
// All other Darwin-like targets we support use ABI version 2
697+
// (a.k.a the "non-fragile ABI").
697698
assert!(self.tcx.sess.target.is_like_darwin);
698699
2
699700
}
700701
}
701702

703+
// We do our best here to match what Clang does when compiling Objective-C natively.
704+
// See Clang's `CGObjCCommonMac::EmitImageInfo`:
705+
// https://github.com/llvm/llvm-project/blob/llvmorg-20.1.8/clang/lib/CodeGen/CGObjCMac.cpp#L5085
702706
pub(crate) fn add_objc_module_flags(&self) {
703707
let abi_version = self.objc_abi_version();
708+
704709
llvm::add_module_flag_u32(
705710
self.llmod,
706711
llvm::ModuleFlagMergeBehavior::Error,

0 commit comments

Comments
 (0)