Skip to content

Commit 320e4f4

Browse files
committed
Add module info on macOS 32-bit
1 parent dd97696 commit 320e4f4

File tree

3 files changed

+146
-2
lines changed

3 files changed

+146
-2
lines changed

objc2/src/__macro_helpers.rs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,35 @@ pub const fn in_selector_family(mut selector: &[u8], mut family: &[u8]) -> bool
211211
}
212212
}
213213

214+
/// Helper struct for emitting the module info that macOS 32-bit requires.
215+
///
216+
/// <https://github.com/llvm/llvm-project/blob/release/13.x/clang/lib/CodeGen/CGObjCMac.cpp#L5211-L5234>
217+
#[repr(C)]
218+
pub struct ModuleInfo {
219+
version: usize,
220+
size: usize,
221+
name: *const u8,
222+
symtab: *const (),
223+
}
224+
225+
// SAFETY: ModuleInfo is immutable.
226+
unsafe impl Sync for ModuleInfo {}
227+
228+
impl ModuleInfo {
229+
/// This is hardcoded in clang as 7.
230+
const VERSION: usize = 7;
231+
232+
pub const fn new(name: *const u8) -> Self {
233+
Self {
234+
version: Self::VERSION,
235+
size: core::mem::size_of::<Self>(),
236+
name,
237+
// We don't expose any symbols
238+
symtab: core::ptr::null(),
239+
}
240+
}
241+
}
242+
214243
#[cfg(test)]
215244
mod tests {
216245
use super::*;
@@ -441,4 +470,13 @@ mod tests {
441470
// to be different!
442471
assert_eq!(ident1, ident2);
443472
}
473+
474+
#[test]
475+
#[cfg_attr(
476+
not(all(feature = "apple", target_os = "macos", target_arch = "x86")),
477+
ignore = "Only relevant on macOS 32-bit"
478+
)]
479+
fn ensure_size_of_module_info() {
480+
assert_eq!(core::mem::size_of::<ModuleInfo>(), 16);
481+
}
444482
}

objc2/src/macros.rs

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,32 @@ macro_rules! __inner_statics_apple_generic {
242242
#[used] // Make sure this reaches the linker
243243
static _IMAGE_INFO: $crate::ffi::__ImageInfo = $crate::ffi::__ImageInfo::system();
244244
};
245+
{
246+
@module_info;
247+
$($idents:ident)+
248+
} => {
249+
#[link_section = "__TEXT,__cstring,cstring_literals"]
250+
#[export_name = $crate::__macro_helpers::concat!(
251+
"\x01L_OBJC_CLASS_NAME_",
252+
$crate::__macro_helpers::__hash_idents!($($idents)+),
253+
"_MODULE_INFO"
254+
)]
255+
static MODULE_INFO_NAME: [$crate::__macro_helpers::u8; 1] = [0];
256+
257+
/// Emit module info.
258+
///
259+
/// This is similar to image info, and must be present in the final
260+
/// binary on macOS 32-bit.
261+
#[link_section = "__OBJC,__module_info,regular,no_dead_strip"]
262+
#[export_name = $crate::__macro_helpers::concat!(
263+
"\x01L_OBJC_MODULES_",
264+
$crate::__macro_helpers::__hash_idents!($($idents)+)
265+
)]
266+
#[used] // Make sure this reaches the linker
267+
static _MODULE_INFO: $crate::__macro_helpers::ModuleInfo = $crate::__macro_helpers::ModuleInfo::new(
268+
MODULE_INFO_NAME.as_ptr()
269+
);
270+
};
245271
{
246272
@sel;
247273
$var_name_section:literal;
@@ -372,8 +398,6 @@ macro_rules! __inner_statics_apple_generic {
372398
let ptr: *const Class = NAME_DATA.as_ptr().cast();
373399
UnsafeCell::new(&*ptr)
374400
};
375-
376-
// TODO: module info?
377401
}
378402
}
379403

@@ -432,6 +456,10 @@ macro_rules! __inner_statics {
432456
@class_old;
433457
$($args)*
434458
}
459+
$crate::__inner_statics_apple_generic! {
460+
@module_info;
461+
$($args)*
462+
}
435463
};
436464
}
437465

test-assembly/crates/test_static_class/expected/apple-old-x86.s

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,19 @@ L_OBJC_CLASS_NAME_9657804a2a54ab6f:
108108
L_OBJC_CLASS_REFERENCES_9657804a2a54ab6f:
109109
.long L_OBJC_CLASS_NAME_9657804a2a54ab6f
110110

111+
.section __TEXT,__cstring,cstring_literals
112+
.globl L_OBJC_CLASS_NAME_9657804a2a54ab6f_MODULE_INFO
113+
L_OBJC_CLASS_NAME_9657804a2a54ab6f_MODULE_INFO:
114+
.space 1
115+
116+
.section __OBJC,__module_info,regular,no_dead_strip
117+
.globl L_OBJC_MODULES_9657804a2a54ab6f
118+
.p2align 2
119+
L_OBJC_MODULES_9657804a2a54ab6f:
120+
.asciz "\007\000\000\000\020\000\000"
121+
.long L_OBJC_CLASS_NAME_9657804a2a54ab6f_MODULE_INFO
122+
.space 4
123+
111124
.section __OBJC,__image_info
112125
.globl L_OBJC_IMAGE_INFO_e897a41b218dcf79
113126
.p2align 2
@@ -125,6 +138,19 @@ L_OBJC_CLASS_NAME_e897a41b218dcf79:
125138
L_OBJC_CLASS_REFERENCES_e897a41b218dcf79:
126139
.long L_OBJC_CLASS_NAME_e897a41b218dcf79
127140

141+
.section __TEXT,__cstring,cstring_literals
142+
.globl L_OBJC_CLASS_NAME_e897a41b218dcf79_MODULE_INFO
143+
L_OBJC_CLASS_NAME_e897a41b218dcf79_MODULE_INFO:
144+
.space 1
145+
146+
.section __OBJC,__module_info,regular,no_dead_strip
147+
.globl L_OBJC_MODULES_e897a41b218dcf79
148+
.p2align 2
149+
L_OBJC_MODULES_e897a41b218dcf79:
150+
.asciz "\007\000\000\000\020\000\000"
151+
.long L_OBJC_CLASS_NAME_e897a41b218dcf79_MODULE_INFO
152+
.space 4
153+
128154
.section __OBJC,__image_info
129155
.globl L_OBJC_IMAGE_INFO_3b7780b4dcfcb9d4
130156
.p2align 2
@@ -142,6 +168,19 @@ L_OBJC_CLASS_NAME_3b7780b4dcfcb9d4:
142168
L_OBJC_CLASS_REFERENCES_3b7780b4dcfcb9d4:
143169
.long L_OBJC_CLASS_NAME_3b7780b4dcfcb9d4
144170

171+
.section __TEXT,__cstring,cstring_literals
172+
.globl L_OBJC_CLASS_NAME_3b7780b4dcfcb9d4_MODULE_INFO
173+
L_OBJC_CLASS_NAME_3b7780b4dcfcb9d4_MODULE_INFO:
174+
.space 1
175+
176+
.section __OBJC,__module_info,regular,no_dead_strip
177+
.globl L_OBJC_MODULES_3b7780b4dcfcb9d4
178+
.p2align 2
179+
L_OBJC_MODULES_3b7780b4dcfcb9d4:
180+
.asciz "\007\000\000\000\020\000\000"
181+
.long L_OBJC_CLASS_NAME_3b7780b4dcfcb9d4_MODULE_INFO
182+
.space 4
183+
145184
.section __OBJC,__image_info
146185
.globl L_OBJC_IMAGE_INFO_f2fb7c579d3c0a74
147186
.p2align 2
@@ -159,6 +198,19 @@ L_OBJC_CLASS_NAME_f2fb7c579d3c0a74:
159198
L_OBJC_CLASS_REFERENCES_f2fb7c579d3c0a74:
160199
.long L_OBJC_CLASS_NAME_f2fb7c579d3c0a74
161200

201+
.section __TEXT,__cstring,cstring_literals
202+
.globl L_OBJC_CLASS_NAME_f2fb7c579d3c0a74_MODULE_INFO
203+
L_OBJC_CLASS_NAME_f2fb7c579d3c0a74_MODULE_INFO:
204+
.space 1
205+
206+
.section __OBJC,__module_info,regular,no_dead_strip
207+
.globl L_OBJC_MODULES_f2fb7c579d3c0a74
208+
.p2align 2
209+
L_OBJC_MODULES_f2fb7c579d3c0a74:
210+
.asciz "\007\000\000\000\020\000\000"
211+
.long L_OBJC_CLASS_NAME_f2fb7c579d3c0a74_MODULE_INFO
212+
.space 4
213+
162214
.section __OBJC,__image_info
163215
.globl L_OBJC_IMAGE_INFO_2f45d8445f72bd9b
164216
.p2align 2
@@ -176,6 +228,19 @@ L_OBJC_CLASS_NAME_2f45d8445f72bd9b:
176228
L_OBJC_CLASS_REFERENCES_2f45d8445f72bd9b:
177229
.long L_OBJC_CLASS_NAME_2f45d8445f72bd9b
178230

231+
.section __TEXT,__cstring,cstring_literals
232+
.globl L_OBJC_CLASS_NAME_2f45d8445f72bd9b_MODULE_INFO
233+
L_OBJC_CLASS_NAME_2f45d8445f72bd9b_MODULE_INFO:
234+
.space 1
235+
236+
.section __OBJC,__module_info,regular,no_dead_strip
237+
.globl L_OBJC_MODULES_2f45d8445f72bd9b
238+
.p2align 2
239+
L_OBJC_MODULES_2f45d8445f72bd9b:
240+
.asciz "\007\000\000\000\020\000\000"
241+
.long L_OBJC_CLASS_NAME_2f45d8445f72bd9b_MODULE_INFO
242+
.space 4
243+
179244
.section __OBJC,__image_info
180245
.globl L_OBJC_IMAGE_INFO_3bf610c78df2b6bb
181246
.p2align 2
@@ -193,4 +258,17 @@ L_OBJC_CLASS_NAME_3bf610c78df2b6bb:
193258
L_OBJC_CLASS_REFERENCES_3bf610c78df2b6bb:
194259
.long L_OBJC_CLASS_NAME_3bf610c78df2b6bb
195260

261+
.section __TEXT,__cstring,cstring_literals
262+
.globl L_OBJC_CLASS_NAME_3bf610c78df2b6bb_MODULE_INFO
263+
L_OBJC_CLASS_NAME_3bf610c78df2b6bb_MODULE_INFO:
264+
.space 1
265+
266+
.section __OBJC,__module_info,regular,no_dead_strip
267+
.globl L_OBJC_MODULES_3bf610c78df2b6bb
268+
.p2align 2
269+
L_OBJC_MODULES_3bf610c78df2b6bb:
270+
.asciz "\007\000\000\000\020\000\000"
271+
.long L_OBJC_CLASS_NAME_3bf610c78df2b6bb_MODULE_INFO
272+
.space 4
273+
196274
.subsections_via_symbols

0 commit comments

Comments
 (0)