diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 39ff86ae0..4a5dcaeb5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -378,6 +378,13 @@ jobs: # Not using --all-features because that would enable e.g. gnustep args: ${{ env.ARGS }} ${{ env.TESTARGS }} --features ${{ env.FEATURES }},${{ env.UNSTABLE_FEATURES }} + - name: Test static selectors + if: ${{ !matrix.dinghy && (matrix.runtime || 'apple') == 'apple' }} + uses: actions-rs/cargo@v1 + with: + command: test + args: ${{ env.ARGS }} ${{ env.TESTARGS }} --features unstable-static-sel + - name: Run assembly tests # Not run on GNUStep yet since a lot of function labels are mangled and # not inlined (and hence quite hard to match on, at some point we'll diff --git a/objc-sys/build.rs b/objc-sys/build.rs index 814afdfd0..9255d0664 100644 --- a/objc-sys/build.rs +++ b/objc-sys/build.rs @@ -58,11 +58,27 @@ fn main() { // The script doesn't depend on our code println!("cargo:rerun-if-changed=build.rs"); + let target = env::var("TARGET").unwrap(); + // Used to figure out when BOOL should be i8 vs. bool - if env::var("TARGET").unwrap().ends_with("macabi") { + // Matches: + // aarch64-apple-ios-macabi + // x86_64-apple-ios-macabi + if target.ends_with("macabi") { println!("cargo:rustc-cfg=target_abi_macabi"); } + // Used to set correct image info in `objc2` + // Matches: + // aarch64-apple-ios-sim + // aarch64-apple-watchos-sim + // x86_64-apple-watchos-sim + // i386-apple-ios + // x86_64-apple-ios + if target.ends_with("sim") || target == "i386-apple-ios" || target == "x86_64-apple-ios" { + println!("cargo:rustc-cfg=target_simulator"); + } + // TODO: Figure out when to enable this // println!("cargo:rustc-cfg=libobjc2_strict_apple_compat"); diff --git a/objc-sys/src/image_info.rs b/objc-sys/src/image_info.rs new file mode 100644 index 000000000..aac24c3f4 --- /dev/null +++ b/objc-sys/src/image_info.rs @@ -0,0 +1,45 @@ +#[repr(C)] +#[doc(hidden)] // Private for now +pub struct __ImageInfo { + // These are not actually `unsigned int`, even though the docs say so + /// The version of the image info struct. + version: u32, + flags: u32, +} + +#[allow(unused)] +impl __ImageInfo { + /// Unused + const FIX_AND_CONTINUE: u32 = 1 << 0; + const SUPPORTS_GARBAGE_COLLECTED: u32 = 1 << 1; + const REQUIRES_GARBAGE_COLLECTION: u32 = 1 << 2; + const OPTIMIZED_BY_DYLD: u32 = 1 << 3; // TODO + /// Unused + const CORRECTED_SYNTHESIZE: u32 = 1 << 4; + /// Whether we're compiling this to run on a simulator. + const IMAGE_IS_SIMULATED: u32 = 1 << 5; + /// Whether we are generating class properties. + const CLASS_PROPERTIES: u32 = 1 << 6; + const DYLD_PREOPTIMIZED: u32 = 1 << 7; + + const SWIFT_ABI_VERSION_SHIFT: u32 = 8; + const SWIFT_ABI_VERSION_MASK: u32 = 0xff << Self::SWIFT_ABI_VERSION_SHIFT; + const SWIFT_MINOR_VERSION_SHIFT: u32 = 16; + const SWIFT_MINOR_VERSION_MASK: u32 = 0xff << Self::SWIFT_MINOR_VERSION_SHIFT; + const SWIFT_MAJOR_VERSION_SHIFT: u32 = 24; + const SWIFT_MAJOR_VERSION_MASK: u32 = 0xff << Self::SWIFT_MAJOR_VERSION_SHIFT; + + /// Fetches the image info for the current runtime + target combination + #[inline] + pub const fn system() -> Self { + // We don't currently do anything relating to class properties, but + // let's just mimic what Clang does! + let mut flags = Self::CLASS_PROPERTIES; + + if cfg!(target_simulator) { + flags |= Self::IMAGE_IS_SIMULATED; + } + + Self { version: 0, flags } + } +} diff --git a/objc-sys/src/lib.rs b/objc-sys/src/lib.rs index dfa90880d..16dab4b6b 100644 --- a/objc-sys/src/lib.rs +++ b/objc-sys/src/lib.rs @@ -100,6 +100,7 @@ mod class; mod constants; mod exception; +mod image_info; mod message; mod method; mod object; @@ -113,6 +114,7 @@ mod various; pub use class::*; pub use constants::*; pub use exception::*; +pub use image_info::*; pub use message::*; pub use method::*; pub use object::*; diff --git a/objc2-proc-macros/Cargo.toml b/objc2-proc-macros/Cargo.toml index 2e017b637..345c243ea 100644 --- a/objc2-proc-macros/Cargo.toml +++ b/objc2-proc-macros/Cargo.toml @@ -2,7 +2,7 @@ name = "objc2-proc-macros" # Remember to update html_root_url in lib.rs version = "0.0.0" -authors = ["Mads Marquart "] +authors = ["Mads Marquart ", "Calvin Watford"] edition = "2021" description = "Procedural macros for the objc2 project" diff --git a/objc2-proc-macros/src/lib.rs b/objc2-proc-macros/src/lib.rs index d31452f14..ee49dcc47 100644 --- a/objc2-proc-macros/src/lib.rs +++ b/objc2-proc-macros/src/lib.rs @@ -16,3 +16,67 @@ #[cfg(doctest)] #[doc = include_str!("../README.md")] extern "C" {} + +use core::hash::{Hash, Hasher}; + +use proc_macro::Ident; +use proc_macro::Literal; +use proc_macro::TokenStream; +use proc_macro::TokenTree; + +/// Quick n' dirty way to extract the idents given by the `sel!` macro. +fn get_idents(input: TokenStream) -> impl Iterator { + input.into_iter().flat_map(|token| { + if let TokenTree::Group(group) = token { + group + .stream() + .into_iter() + .map(|token| { + if let TokenTree::Ident(ident) = token { + ident + } else { + panic!("Expected ident, got {:?}", token) + } + }) + .collect::>() + .into_iter() + } else if let TokenTree::Ident(ident) = token { + vec![ident].into_iter() + } else { + panic!("Expected group or ident, got {:?}", token) + } + }) +} + +/// Creates a hash from the input and source code locations in the provided +/// idents. +/// +/// This hash is not guaranteed to be stable across compiler versions. +/// +/// Tests are in [`objc2::__macro_helpers`]. +#[proc_macro] +#[doc(hidden)] +pub fn __hash_idents(input: TokenStream) -> TokenStream { + // Create the hasher + let mut hasher = std::collections::hash_map::DefaultHasher::new(); + + // Hash each ident + for ident in get_idents(input) { + ident.to_string().hash(&mut hasher); + + // Hash the source code location of the ident + // + // HACK: the only somewhat-reasonable way to get "unique" data in a + // proc macro right now is from the `Debug` formatter for spans which + // includes the source code location... so just hash the whole `Debug` + // format output of the span + // + // Prior art in the `defmt` crate, see here: + // https://github.com/knurling-rs/defmt/blob/defmt-v0.3.1/macros/src/construct.rs + format!("{:?}", ident.span()).hash(&mut hasher); + } + + // Get the hash from the hasher and return it as 16 hexadecimal characters + let s = format!("{:016x}", hasher.finish()); + TokenTree::Literal(Literal::string(&s)).into() +} diff --git a/objc2/CHANGELOG.md b/objc2/CHANGELOG.md index de3d37767..0e65eb023 100644 --- a/objc2/CHANGELOG.md +++ b/objc2/CHANGELOG.md @@ -25,6 +25,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). msg_send_id![msg_send_id![Self::class(), alloc], new].unwrap() }; ``` +* Added the `"unstable-static-sel"` and `"unstable-static-sel-inlined"` + feature flags to make the `sel!` macro (and by extension, the `msg_send!` + macros) faster. ## 0.3.0-beta.0 - 2022-06-13 diff --git a/objc2/Cargo.toml b/objc2/Cargo.toml index 49c10ad14..16bf53df8 100644 --- a/objc2/Cargo.toml +++ b/objc2/Cargo.toml @@ -37,6 +37,17 @@ verify_message = ["malloc"] # TODO: Remove malloc feature here # increases compilation time. malloc = ["malloc_buf"] +# Make the `sel!` macro look up the selector statically. +# +# The plan is to enable this by default, but right now we are uncertain of +# it's stability, and it might need significant changes before being fully +# ready! +# +# Please test it, and report any issues you may find: +# https://github.com/madsmtm/objc2/issues/new +unstable-static-sel = ["objc2-proc-macros"] +unstable-static-sel-inlined = ["unstable-static-sel"] + # Uses nightly features to make AutoreleasePool zero-cost even in debug mode unstable-autoreleasesafe = [] @@ -52,6 +63,7 @@ gnustep-2-1 = ["gnustep-2-0", "objc-sys/gnustep-2-1"] malloc_buf = { version = "1.0", optional = true } objc-sys = { path = "../objc-sys", version = "=0.2.0-beta.0", default-features = false } objc2-encode = { path = "../objc2-encode", version = "=2.0.0-pre.0", default-features = false } +objc2-proc-macros = { path = "../objc2-proc-macros", optional = true } [dev-dependencies] iai = { version = "0.1", git = "https://github.com/madsmtm/iai", branch = "callgrind" } diff --git a/objc2/src/__macro_helpers.rs b/objc2/src/__macro_helpers.rs index e8a25c457..9b032aacb 100644 --- a/objc2/src/__macro_helpers.rs +++ b/objc2/src/__macro_helpers.rs @@ -2,8 +2,10 @@ use crate::rc::{Id, Ownership}; use crate::runtime::{Class, Sel}; use crate::{Message, MessageArguments, MessageError, MessageReceiver}; -#[doc(hidden)] +pub use core::cell::UnsafeCell; pub use core::compile_error; +#[cfg(feature = "unstable-static-sel")] +pub use objc2_proc_macros::__hash_idents; /// Helper for specifying the retain semantics for a given selector family. /// @@ -28,7 +30,6 @@ pub use core::compile_error; /// ARC though! /// /// -#[doc(hidden)] pub struct RetainSemantics< // `new` family const NEW: bool, @@ -40,7 +41,6 @@ pub struct RetainSemantics< const COPY_OR_MUT_COPY: bool, > {} -#[doc(hidden)] pub trait MsgSendId { unsafe fn send_message_id( obj: T, @@ -131,7 +131,6 @@ impl MsgSendId> /// Checks whether a given selector is said to be in a given selector family. /// /// -#[doc(hidden)] pub const fn in_selector_family(mut selector: &[u8], mut family: &[u8]) -> bool { // Skip leading underscores from selector loop { @@ -373,4 +372,31 @@ mod tests { let _obj: Id = unsafe { msg_send_id![cls, new].unwrap() }; } } + + #[test] + #[cfg(feature = "objc2-proc-macros")] + fn hash_idents_different() { + assert_ne!(__hash_idents!(abc), __hash_idents!(def)); + } + + #[test] + #[cfg(feature = "objc2-proc-macros")] + fn hash_idents_same_no_equal() { + assert_ne!(__hash_idents!(abc), __hash_idents!(abc)); + assert_ne!(__hash_idents!(abc def ghi), __hash_idents!(abc def ghi)); + } + + #[test] + #[cfg(feature = "objc2-proc-macros")] + fn hash_idents_exact_same_ident() { + macro_rules! x { + ($x:ident) => { + (__hash_idents!($x), __hash_idents!($x)) + }; + } + let (ident1, ident2) = x!(abc); + // This is a limitation of `__hash_idents`, ideally we'd like these + // to be different! + assert_eq!(ident1, ident2); + } } diff --git a/objc2/src/macros.rs b/objc2/src/macros.rs index 86509da17..709664db4 100644 --- a/objc2/src/macros.rs +++ b/objc2/src/macros.rs @@ -29,27 +29,291 @@ macro_rules! class { }}; } -/// Registers a selector with the Objective-C runtime. +/// Register a selector with the Objective-C runtime. /// -/// Returns a [`Sel`]. +/// Returns the [`Sel`] corresponding to the specified selector. /// /// [`Sel`]: crate::runtime::Sel /// +/// +/// # Specification +/// +/// This has similar syntax and functionality as the `@selector` directive in +/// Objective-C. This calls [`Sel::register`] internally. The result is cached +/// for efficiency. +/// +/// Non-ascii identifiers are ill-tested, if supported at all. +/// +/// [`Sel::register`]: crate::runtime::Sel::register +/// +/// +/// # Features +/// +/// If the experimental `"unstable-static-sel"` feature is enabled, this will +/// emit special statics that will be replaced by the dynamic linker (dyld) +/// when the program starts up - in exactly the same manner as normal +/// Objective-C code does. +/// This should be significantly faster (and allow better native debugging), +/// however due to the Rust compilation model, and since we don't have +/// low-level control over it, it is currently unlikely that this will work +/// correctly in all cases. +/// See the source code and [rust-lang/rust#53929] for more info. +/// +/// Concretely, this may fail at: +/// - link-time (likely) +/// - dynamic link-time/just before the program is run (fairly likely) +/// - runtime, causing UB (unlikely) +/// +/// The `"unstable-static-sel-inlined"` feature is the even more extreme +/// version - it yields the best performance and is closest to real +/// Objective-C code, but probably won't work unless your code and its +/// inlining is written in a very certain way. +/// +/// Enabling LTO greatly increases the chance that these features work. +/// +/// [rust-lang/rust#53929]: https://github.com/rust-lang/rust/issues/53929 +/// +/// /// # Examples /// +/// Get a few different selectors: +/// +/// ```rust +/// use objc2::sel; +/// let sel = sel!(alloc); +/// let sel = sel!(description); +/// let sel = sel!(_privateMethod); +/// let sel = sel!(storyboardWithName:bundle:); +/// let sel = sel!( +/// otherEventWithType: +/// location: +/// modifierFlags: +/// timestamp: +/// windowNumber: +/// context: +/// subtype: +/// data1: +/// data2: +/// ); +/// ``` +/// +/// Whitespace is ignored: +/// /// ``` /// # use objc2::sel; -/// let sel = sel!(description); -/// let sel = sel!(setObject:forKey:); +/// let sel1 = sel!(setObject:forKey:); +/// let sel2 = sel!( setObject : +/// +/// forKey : ); +/// assert_eq!(sel1, sel2); +/// ``` +/// +/// Invalid selector: +/// +/// ```compile_fail +/// # use objc2::sel; +/// let sel = sel!(aSelector:withoutTrailingColon); +/// ``` +/// +/// Unsupported usage that you may run into when using macros - fails to +/// compile when the `"unstable-static-sel"` feature is enabled. +/// +/// Instead, define a wrapper function that retrieves the selector. +/// +#[cfg_attr(not(feature = "unstable-static-sel"), doc = "```no_run")] +#[cfg_attr(feature = "unstable-static-sel", doc = "```compile_fail")] +/// use objc2::sel; +/// macro_rules! x { +/// ($x:ident) => { +/// // One of these is fine +/// sel!($x); +/// // But using the identifier again in the same way is not! +/// sel!($x); +/// }; +/// } +/// // Identifier `abc` +/// x!(abc); /// ``` #[macro_export] macro_rules! sel { ($first:ident $(: $($rest:ident :)*)?) => ({ + const SELECTOR_DATA: &str = concat!(stringify!($first), $(':', $(stringify!($rest), ':',)*)? '\0'); + $crate::__sel_inner!(SELECTOR_DATA, $first $($($rest)*)?) + }); +} + +#[doc(hidden)] +#[macro_export] +#[cfg(not(feature = "unstable-static-sel"))] +macro_rules! __sel_inner { + ($data:ident, $($idents:ident)+) => {{ static SEL: $crate::__CachedSel = $crate::__CachedSel::new(); - let name = concat!(stringify!($first), $(':', $(stringify!($rest), ':',)*)? '\0'); #[allow(unused_unsafe)] - unsafe { SEL.get(name) } - }); + unsafe { + SEL.get($data) + } + }}; +} + +#[doc(hidden)] +#[macro_export] +macro_rules! __sel_inner_statics_apple_generic { + { + $image_info_section:literal; + $var_name_section:literal; + $selector_ref_section:literal; + $data:ident, + $($idents:ident)+ + } => { + /// We always emit the image info tag, since we need it to: + /// - End up in the same codegen unit as the other statics below. + /// - End up in the final binary so it can be read by dyld. + /// + /// Unfortunately however, this leads to duplicated tags - the linker + /// reports `__DATA/__objc_imageinfo has unexpectedly large size XXX`, + /// but things still seems to work. + #[link_section = $image_info_section] + #[export_name = concat!("\x01L_OBJC_IMAGE_INFO_", $crate::__macro_helpers::__hash_idents!($($idents)+))] + #[used] // Make sure this reaches the linker + static _IMAGE_INFO: $crate::ffi::__ImageInfo = $crate::ffi::__ImageInfo::system(); + + const X: &[u8] = $data.as_bytes(); + + /// Clang marks this with LLVM's `unnamed_addr`. + /// See rust-lang/rust#18297 + /// Should only be an optimization (?) + #[link_section = $var_name_section] + #[export_name = concat!("\x01L_OBJC_METH_VAR_NAME_", $crate::__macro_helpers::__hash_idents!($($idents)+))] + static NAME_DATA: [u8; X.len()] = { + // Convert the `&[u8]` slice to an array with known length, so + // that we can place that directly in a static. + let mut res: [u8; X.len()] = [0; X.len()]; + let mut i = 0; + while i < X.len() { + res[i] = X[i]; + i += 1; + } + res + }; + + /// Place the constant value in the correct section. + /// + /// We use `UnsafeCell` because this somewhat resembles internal + /// mutation - this pointer will be changed by dyld at startup, so we + /// _must_ prevent Rust/LLVM from trying to "peek inside" it and just + /// use a pointer to `NAME_DATA` directly. + /// + /// Clang does this by marking `REF` with LLVM's + /// `externally_initialized`. + /// + /// `static mut` is used so that we don't need to wrap the + /// `UnsafeCell` in something that implements `Sync`. + /// + /// Clang uses `no_dead_strip` in the link section for some reason, + /// which other tools (notably some LLVM tools) now assume is present, + /// so we have to add it as well. + /// + /// + /// # Safety + /// + /// I'm quite uncertain of how safe this is, since the Rust abstract + /// machine has no concept of a static that is initialized outside of + /// it - perhaps it would be better to use `read_volatile` instead of + /// relying on `UnsafeCell`? Or perhaps `MaybeUninit` would help? + /// + /// See the [`ctor`](https://crates.io/crates/ctor) crate for more + /// info on "life before main". + #[link_section = $selector_ref_section] + #[export_name = concat!("\x01L_OBJC_SELECTOR_REFERENCES_", $crate::__macro_helpers::__hash_idents!($($idents)+))] + static mut REF: $crate::__macro_helpers::UnsafeCell<$crate::runtime::Sel> = unsafe { + $crate::__macro_helpers::UnsafeCell::new($crate::runtime::Sel::from_ptr(NAME_DATA.as_ptr().cast())) + }; + }; +} + +#[doc(hidden)] +#[macro_export] +#[cfg(all(feature = "apple", not(all(target_os = "macos", target_arch = "x86"))))] +macro_rules! __sel_inner_statics { + ($($args:tt)*) => { + // Found by reading clang/LLVM sources + $crate::__sel_inner_statics_apple_generic! { + "__DATA,__objc_imageinfo,regular,no_dead_strip"; + "__TEXT,__objc_methname,cstring_literals"; + "__DATA,__objc_selrefs,literal_pointers,no_dead_strip"; + $($args)* + } + }; +} + +#[doc(hidden)] +#[macro_export] +#[cfg(all(feature = "apple", target_os = "macos", target_arch = "x86"))] +macro_rules! __sel_inner_statics { + ($($args:tt)*) => { + $crate::__sel_inner_statics_apple_generic! { + "__OBJC,__image_info,regular"; + "__TEXT,__cstring,cstring_literals"; + "__OBJC,__message_refs,literal_pointers,no_dead_strip"; + $($args)* + } + }; +} + +#[doc(hidden)] +#[macro_export] +#[cfg(not(feature = "apple"))] +macro_rules! __sel_inner_statics { + ($($args:tt)*) => { + // TODO + $crate::__macro_helpers::compile_error!( + "The `\"unstable-static-sel\"` feature is not yet supported on GNUStep!" + ) + }; +} + +#[doc(hidden)] +#[macro_export] +#[cfg(all( + feature = "unstable-static-sel", + not(feature = "unstable-static-sel-inlined") +))] +macro_rules! __sel_inner { + ($($args:tt)*) => {{ + $crate::__sel_inner_statics!($($args)*); + + /// HACK: Wrap the access in a non-generic, `#[inline(never)]` + /// function to make the compiler group it into the same codegen unit + /// as the statics. + /// + /// See the following link for details on how the compiler decides + /// to partition code into codegen units: + /// + #[inline(never)] + fn objc_static_workaround() -> $crate::runtime::Sel { + // SAFETY: The actual selector is replaced by dyld when the + // program is loaded. + // + // This is similar to a volatile read, except it can be stripped + // if unused. + unsafe { *REF.get() } + } + + objc_static_workaround() + }}; +} + +#[doc(hidden)] +#[macro_export] +#[cfg(all(feature = "unstable-static-sel-inlined"))] +macro_rules! __sel_inner { + ($($args:tt)*) => {{ + $crate::__sel_inner_statics!($($args)*); + + #[allow(unused_unsafe)] + // SAFETY: See above + unsafe { *REF.get() } + }}; } /// Send a message to an object or class. diff --git a/objc2/src/runtime.rs b/objc2/src/runtime.rs index d2eb3d66e..87cc2f960 100644 --- a/objc2/src/runtime.rs +++ b/objc2/src/runtime.rs @@ -33,6 +33,12 @@ pub const YES: ffi::BOOL = ffi::YES; pub const NO: ffi::BOOL = ffi::NO; /// A type that represents a method selector. +/// +/// The main reason the Objective-C runtime uses a custom types for selectors +/// is to support efficient comparison - a selector is effectively just an +/// [interned string], so this makes that very easy! +/// +/// [interned string]: https://en.wikipedia.org/wiki/String_interning #[repr(transparent)] // ffi::sel_isEqual is just pointer comparison, so just generate PartialEq #[derive(Copy, Clone, PartialEq, Eq, Hash)] @@ -118,7 +124,7 @@ impl Sel { /// /// This is almost never what you want; use [`Sel::register`] instead. #[inline] - pub unsafe fn from_ptr(ptr: *const c_void) -> Self { + pub const unsafe fn from_ptr(ptr: *const c_void) -> Self { Self { ptr: ptr.cast() } } diff --git a/tests/assembly/test_msg_send_id/Cargo.toml b/tests/assembly/test_msg_send_id/Cargo.toml index 387607d2a..ba21465fc 100644 --- a/tests/assembly/test_msg_send_id/Cargo.toml +++ b/tests/assembly/test_msg_send_id/Cargo.toml @@ -19,3 +19,6 @@ gnustep-1-8 = ["gnustep-1-7", "objc2/gnustep-1-8"] gnustep-1-9 = ["gnustep-1-8", "objc2/gnustep-1-9"] gnustep-2-0 = ["gnustep-1-9", "objc2/gnustep-2-0"] gnustep-2-1 = ["gnustep-2-0", "objc2/gnustep-2-1"] + +# Hack +assembly-features = [] diff --git a/tests/assembly/test_msg_send_id/expected/apple-old-x86.s b/tests/assembly/test_msg_send_id/expected/apple-old-x86.s new file mode 100644 index 000000000..b42d5f569 --- /dev/null +++ b/tests/assembly/test_msg_send_id/expected/apple-old-x86.s @@ -0,0 +1,110 @@ + .section __TEXT,__text,regular,pure_instructions + .intel_syntax noprefix + .globl _handle_alloc + .p2align 4, 0x90 +_handle_alloc: + push ebp + mov ebp, esp + pop ebp + jmp _objc_msgSend + + .globl _handle_init + .p2align 4, 0x90 +_handle_init: + push ebp + mov ebp, esp + pop ebp + jmp _objc_msgSend + + .globl _handle_alloc_init + .p2align 4, 0x90 +_handle_alloc_init: + push ebp + mov ebp, esp + push esi + push eax + mov esi, dword ptr [ebp + 16] + sub esp, 8 + push dword ptr [ebp + 12] + push dword ptr [ebp + 8] + call _objc_msgSend + add esp, 8 + push esi + push eax + call _objc_msgSend + add esp, 20 + pop esi + pop ebp + ret + + .globl _handle_alloc_release + .p2align 4, 0x90 +_handle_alloc_release: + push ebp + mov ebp, esp + sub esp, 8 + mov eax, dword ptr [ebp + 8] + mov ecx, dword ptr [ebp + 12] + mov dword ptr [esp + 4], ecx + mov dword ptr [esp], eax + call _objc_msgSend + mov dword ptr [esp], eax + call _objc_release + add esp, 8 + pop ebp + ret + + .globl _handle_alloc_init_release + .p2align 4, 0x90 +_handle_alloc_init_release: + push ebp + mov ebp, esp + push esi + sub esp, 20 + mov esi, dword ptr [ebp + 16] + mov eax, dword ptr [ebp + 8] + mov ecx, dword ptr [ebp + 12] + mov dword ptr [esp + 4], ecx + mov dword ptr [esp], eax + call _objc_msgSend + mov dword ptr [esp + 4], esi + mov dword ptr [esp], eax + call _objc_msgSend + mov dword ptr [esp], eax + call _objc_release + add esp, 20 + pop esi + pop ebp + ret + + .globl _handle_copy + .p2align 4, 0x90 +_handle_copy: + push ebp + mov ebp, esp + pop ebp + jmp _objc_msgSend + + .globl _handle_autoreleased + .p2align 4, 0x90 +_handle_autoreleased: + push ebp + mov ebp, esp + sub esp, 8 + mov eax, dword ptr [ebp + 8] + mov ecx, dword ptr [ebp + 12] + mov dword ptr [esp + 4], ecx + mov dword ptr [esp], eax + call _objc_msgSend + ## InlineAsm Start + + mov ebp, ebp + + ## InlineAsm End + mov dword ptr [esp], eax + call _objc_retainAutoreleasedReturnValue + add esp, 8 + pop ebp + ret + +.subsections_via_symbols diff --git a/tests/assembly/test_msg_send_static_sel/Cargo.toml b/tests/assembly/test_msg_send_static_sel/Cargo.toml new file mode 100644 index 000000000..d9cbb59bf --- /dev/null +++ b/tests/assembly/test_msg_send_static_sel/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "test_msg_send_static_sel" +version = "0.1.0" +edition = "2021" +publish = false + +[lib] +path = "lib.rs" + +[dependencies] +objc2 = { path = "../../../objc2", default-features = false } + +[features] +default = ["apple"] +# Runtime +apple = ["objc2/apple"] +gnustep-1-7 = ["objc2/gnustep-1-7"] +gnustep-1-8 = ["gnustep-1-7", "objc2/gnustep-1-8"] +gnustep-1-9 = ["gnustep-1-8", "objc2/gnustep-1-9"] +gnustep-2-0 = ["gnustep-1-9", "objc2/gnustep-2-0"] +gnustep-2-1 = ["gnustep-2-0", "objc2/gnustep-2-1"] + +# Hack to prevent the feature flag from being enabled in the entire project +assembly-features = ["objc2/unstable-static-sel-inlined"] diff --git a/tests/assembly/test_msg_send_static_sel/expected/apple-aarch64.s b/tests/assembly/test_msg_send_static_sel/expected/apple-aarch64.s new file mode 100644 index 000000000..1cec95fa6 --- /dev/null +++ b/tests/assembly/test_msg_send_static_sel/expected/apple-aarch64.s @@ -0,0 +1,188 @@ + .section __TEXT,__text,regular,pure_instructions + .globl _handle_with_sel + .p2align 2 +_handle_with_sel: +Lloh0: + adrp x8, L_OBJC_SELECTOR_REFERENCES_40f5b12005284286@PAGE +Lloh1: + ldr x1, [x8, L_OBJC_SELECTOR_REFERENCES_40f5b12005284286@PAGEOFF] + b _objc_msgSend + .loh AdrpLdr Lloh0, Lloh1 + + .globl _handle_alloc_init + .p2align 2 +_handle_alloc_init: + stp x20, x19, [sp, #-32]! + stp x29, x30, [sp, #16] + add x29, sp, #16 +Lloh2: + adrp x8, L_OBJC_SELECTOR_REFERENCES_904c14aa63c4eec9@PAGE +Lloh3: + ldr x19, [x8, L_OBJC_SELECTOR_REFERENCES_904c14aa63c4eec9@PAGEOFF] +Lloh4: + adrp x8, L_OBJC_SELECTOR_REFERENCES_b1ab35d3713395f9@PAGE +Lloh5: + ldr x1, [x8, L_OBJC_SELECTOR_REFERENCES_b1ab35d3713395f9@PAGEOFF] + bl _objc_msgSend + mov x1, x19 + ldp x29, x30, [sp, #16] + ldp x20, x19, [sp], #32 + b _objc_msgSend + .loh AdrpLdr Lloh4, Lloh5 + .loh AdrpAdrp Lloh2, Lloh4 + .loh AdrpLdr Lloh2, Lloh3 + + .globl _use_generic + .p2align 2 +_use_generic: + stp x20, x19, [sp, #-32]! + stp x29, x30, [sp, #16] + add x29, sp, #16 + mov x19, x0 +Lloh6: + adrp x8, L_OBJC_SELECTOR_REFERENCES_cdfe92d39025fdf4@PAGE +Lloh7: + ldr x1, [x8, L_OBJC_SELECTOR_REFERENCES_cdfe92d39025fdf4@PAGEOFF] + adrp x20, L_OBJC_SELECTOR_REFERENCES_31f63858e271db32@PAGE + ldr x2, [x20, L_OBJC_SELECTOR_REFERENCES_31f63858e271db32@PAGEOFF] + bl _objc_msgSend +Lloh8: + adrp x8, L_OBJC_SELECTOR_REFERENCES_79bd65c86d46fbf1@PAGE +Lloh9: + ldr x1, [x8, L_OBJC_SELECTOR_REFERENCES_79bd65c86d46fbf1@PAGEOFF] + ldr x2, [x20, L_OBJC_SELECTOR_REFERENCES_31f63858e271db32@PAGEOFF] + mov x0, x19 + bl _objc_msgSend +Lloh10: + adrp x8, L_OBJC_SELECTOR_REFERENCES_8e0840c6b39b7720@PAGE +Lloh11: + ldr x1, [x8, L_OBJC_SELECTOR_REFERENCES_8e0840c6b39b7720@PAGEOFF] + ldr x2, [x20, L_OBJC_SELECTOR_REFERENCES_31f63858e271db32@PAGEOFF] + mov x0, x19 + ldp x29, x30, [sp, #16] + ldp x20, x19, [sp], #32 + b _objc_msgSend + .loh AdrpLdr Lloh10, Lloh11 + .loh AdrpLdr Lloh8, Lloh9 + .loh AdrpLdr Lloh6, Lloh7 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_40f5b12005284286 + .p2align 2 +L_OBJC_IMAGE_INFO_40f5b12005284286: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_40f5b12005284286 +L_OBJC_METH_VAR_NAME_40f5b12005284286: + .asciz "someSelector" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_40f5b12005284286 + .p2align 3 +L_OBJC_SELECTOR_REFERENCES_40f5b12005284286: + .quad L_OBJC_METH_VAR_NAME_40f5b12005284286 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_904c14aa63c4eec9 + .p2align 2 +L_OBJC_IMAGE_INFO_904c14aa63c4eec9: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_904c14aa63c4eec9 +L_OBJC_METH_VAR_NAME_904c14aa63c4eec9: + .asciz "init" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_904c14aa63c4eec9 + .p2align 3 +L_OBJC_SELECTOR_REFERENCES_904c14aa63c4eec9: + .quad L_OBJC_METH_VAR_NAME_904c14aa63c4eec9 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_b1ab35d3713395f9 + .p2align 2 +L_OBJC_IMAGE_INFO_b1ab35d3713395f9: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_b1ab35d3713395f9 +L_OBJC_METH_VAR_NAME_b1ab35d3713395f9: + .asciz "alloc" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_b1ab35d3713395f9 + .p2align 3 +L_OBJC_SELECTOR_REFERENCES_b1ab35d3713395f9: + .quad L_OBJC_METH_VAR_NAME_b1ab35d3713395f9 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_31f63858e271db32 + .p2align 2 +L_OBJC_IMAGE_INFO_31f63858e271db32: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_31f63858e271db32 +L_OBJC_METH_VAR_NAME_31f63858e271db32: + .asciz "generic:selector:" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_31f63858e271db32 + .p2align 3 +L_OBJC_SELECTOR_REFERENCES_31f63858e271db32: + .quad L_OBJC_METH_VAR_NAME_31f63858e271db32 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_cdfe92d39025fdf4 + .p2align 2 +L_OBJC_IMAGE_INFO_cdfe92d39025fdf4: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_cdfe92d39025fdf4 +L_OBJC_METH_VAR_NAME_cdfe92d39025fdf4: + .asciz "performSelector:" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_cdfe92d39025fdf4 + .p2align 3 +L_OBJC_SELECTOR_REFERENCES_cdfe92d39025fdf4: + .quad L_OBJC_METH_VAR_NAME_cdfe92d39025fdf4 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_79bd65c86d46fbf1 + .p2align 2 +L_OBJC_IMAGE_INFO_79bd65c86d46fbf1: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_79bd65c86d46fbf1 +L_OBJC_METH_VAR_NAME_79bd65c86d46fbf1: + .asciz "performSelector:" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_79bd65c86d46fbf1 + .p2align 3 +L_OBJC_SELECTOR_REFERENCES_79bd65c86d46fbf1: + .quad L_OBJC_METH_VAR_NAME_79bd65c86d46fbf1 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_8e0840c6b39b7720 + .p2align 2 +L_OBJC_IMAGE_INFO_8e0840c6b39b7720: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_8e0840c6b39b7720 +L_OBJC_METH_VAR_NAME_8e0840c6b39b7720: + .asciz "performSelector:" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_8e0840c6b39b7720 + .p2align 3 +L_OBJC_SELECTOR_REFERENCES_8e0840c6b39b7720: + .quad L_OBJC_METH_VAR_NAME_8e0840c6b39b7720 + +.subsections_via_symbols diff --git a/tests/assembly/test_msg_send_static_sel/expected/apple-armv7.s b/tests/assembly/test_msg_send_static_sel/expected/apple-armv7.s new file mode 100644 index 000000000..36112fd79 --- /dev/null +++ b/tests/assembly/test_msg_send_static_sel/expected/apple-armv7.s @@ -0,0 +1,189 @@ + .section __TEXT,__text,regular,pure_instructions + .syntax unified + .globl _handle_with_sel + .p2align 2 + .code 32 +_handle_with_sel: + movw r1, :lower16:(L_OBJC_SELECTOR_REFERENCES_40f5b12005284286-(LPC0_0+8)) + movt r1, :upper16:(L_OBJC_SELECTOR_REFERENCES_40f5b12005284286-(LPC0_0+8)) +LPC0_0: + ldr r1, [pc, r1] + b _objc_msgSend + + .globl _handle_alloc_init + .p2align 2 + .code 32 +_handle_alloc_init: + push {r4, r7, lr} + add r7, sp, #4 + movw r1, :lower16:(L_OBJC_SELECTOR_REFERENCES_b1ab35d3713395f9-(LPC1_0+8)) + movt r1, :upper16:(L_OBJC_SELECTOR_REFERENCES_b1ab35d3713395f9-(LPC1_0+8)) +LPC1_0: + ldr r1, [pc, r1] + movw r4, :lower16:(L_OBJC_SELECTOR_REFERENCES_904c14aa63c4eec9-(LPC1_1+8)) + movt r4, :upper16:(L_OBJC_SELECTOR_REFERENCES_904c14aa63c4eec9-(LPC1_1+8)) +LPC1_1: + ldr r4, [pc, r4] + bl _objc_msgSend + mov r1, r4 + pop {r4, r7, lr} + b _objc_msgSend + + .globl _use_generic + .p2align 2 + .code 32 +_use_generic: + push {r4, r7, lr} + add r7, sp, #4 + movw r2, :lower16:(L_OBJC_SELECTOR_REFERENCES_31f63858e271db32-(LPC2_0+8)) + mov r4, r0 + movt r2, :upper16:(L_OBJC_SELECTOR_REFERENCES_31f63858e271db32-(LPC2_0+8)) +LPC2_0: + ldr r2, [pc, r2] + movw r1, :lower16:(L_OBJC_SELECTOR_REFERENCES_cdfe92d39025fdf4-(LPC2_1+8)) + movt r1, :upper16:(L_OBJC_SELECTOR_REFERENCES_cdfe92d39025fdf4-(LPC2_1+8)) +LPC2_1: + ldr r1, [pc, r1] + bl _objc_msgSend + movw r2, :lower16:(L_OBJC_SELECTOR_REFERENCES_31f63858e271db32-(LPC2_2+8)) + mov r0, r4 + movt r2, :upper16:(L_OBJC_SELECTOR_REFERENCES_31f63858e271db32-(LPC2_2+8)) +LPC2_2: + ldr r2, [pc, r2] + movw r1, :lower16:(L_OBJC_SELECTOR_REFERENCES_79bd65c86d46fbf1-(LPC2_3+8)) + movt r1, :upper16:(L_OBJC_SELECTOR_REFERENCES_79bd65c86d46fbf1-(LPC2_3+8)) +LPC2_3: + ldr r1, [pc, r1] + bl _objc_msgSend + movw r2, :lower16:(L_OBJC_SELECTOR_REFERENCES_31f63858e271db32-(LPC2_4+8)) + mov r0, r4 + movt r2, :upper16:(L_OBJC_SELECTOR_REFERENCES_31f63858e271db32-(LPC2_4+8)) +LPC2_4: + ldr r2, [pc, r2] + movw r1, :lower16:(L_OBJC_SELECTOR_REFERENCES_8e0840c6b39b7720-(LPC2_5+8)) + movt r1, :upper16:(L_OBJC_SELECTOR_REFERENCES_8e0840c6b39b7720-(LPC2_5+8)) +LPC2_5: + ldr r1, [pc, r1] + pop {r4, r7, lr} + b _objc_msgSend + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_40f5b12005284286 + .p2align 2 +L_OBJC_IMAGE_INFO_40f5b12005284286: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_40f5b12005284286 +L_OBJC_METH_VAR_NAME_40f5b12005284286: + .asciz "someSelector" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_40f5b12005284286 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_40f5b12005284286: + .long L_OBJC_METH_VAR_NAME_40f5b12005284286 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_904c14aa63c4eec9 + .p2align 2 +L_OBJC_IMAGE_INFO_904c14aa63c4eec9: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_904c14aa63c4eec9 +L_OBJC_METH_VAR_NAME_904c14aa63c4eec9: + .asciz "init" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_904c14aa63c4eec9 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_904c14aa63c4eec9: + .long L_OBJC_METH_VAR_NAME_904c14aa63c4eec9 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_b1ab35d3713395f9 + .p2align 2 +L_OBJC_IMAGE_INFO_b1ab35d3713395f9: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_b1ab35d3713395f9 +L_OBJC_METH_VAR_NAME_b1ab35d3713395f9: + .asciz "alloc" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_b1ab35d3713395f9 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_b1ab35d3713395f9: + .long L_OBJC_METH_VAR_NAME_b1ab35d3713395f9 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_31f63858e271db32 + .p2align 2 +L_OBJC_IMAGE_INFO_31f63858e271db32: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_31f63858e271db32 +L_OBJC_METH_VAR_NAME_31f63858e271db32: + .asciz "generic:selector:" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_31f63858e271db32 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_31f63858e271db32: + .long L_OBJC_METH_VAR_NAME_31f63858e271db32 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_cdfe92d39025fdf4 + .p2align 2 +L_OBJC_IMAGE_INFO_cdfe92d39025fdf4: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_cdfe92d39025fdf4 +L_OBJC_METH_VAR_NAME_cdfe92d39025fdf4: + .asciz "performSelector:" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_cdfe92d39025fdf4 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_cdfe92d39025fdf4: + .long L_OBJC_METH_VAR_NAME_cdfe92d39025fdf4 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_79bd65c86d46fbf1 + .p2align 2 +L_OBJC_IMAGE_INFO_79bd65c86d46fbf1: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_79bd65c86d46fbf1 +L_OBJC_METH_VAR_NAME_79bd65c86d46fbf1: + .asciz "performSelector:" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_79bd65c86d46fbf1 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_79bd65c86d46fbf1: + .long L_OBJC_METH_VAR_NAME_79bd65c86d46fbf1 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_8e0840c6b39b7720 + .p2align 2 +L_OBJC_IMAGE_INFO_8e0840c6b39b7720: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_8e0840c6b39b7720 +L_OBJC_METH_VAR_NAME_8e0840c6b39b7720: + .asciz "performSelector:" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_8e0840c6b39b7720 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_8e0840c6b39b7720: + .long L_OBJC_METH_VAR_NAME_8e0840c6b39b7720 + +.subsections_via_symbols diff --git a/tests/assembly/test_msg_send_static_sel/expected/apple-armv7s.s b/tests/assembly/test_msg_send_static_sel/expected/apple-armv7s.s new file mode 100644 index 000000000..6540a3cda --- /dev/null +++ b/tests/assembly/test_msg_send_static_sel/expected/apple-armv7s.s @@ -0,0 +1,192 @@ + .section __TEXT,__text,regular,pure_instructions + .syntax unified + .globl _handle_with_sel + .p2align 2 + .code 32 +_handle_with_sel: + push {r7, lr} + mov r7, sp + movw r1, :lower16:(L_OBJC_SELECTOR_REFERENCES_40f5b12005284286-(LPC0_0+8)) + movt r1, :upper16:(L_OBJC_SELECTOR_REFERENCES_40f5b12005284286-(LPC0_0+8)) +LPC0_0: + ldr r1, [pc, r1] + bl _objc_msgSend + pop {r7, pc} + + .globl _handle_alloc_init + .p2align 2 + .code 32 +_handle_alloc_init: + push {r4, r7, lr} + add r7, sp, #4 + movw r1, :lower16:(L_OBJC_SELECTOR_REFERENCES_b1ab35d3713395f9-(LPC1_0+8)) + movt r1, :upper16:(L_OBJC_SELECTOR_REFERENCES_b1ab35d3713395f9-(LPC1_0+8)) +LPC1_0: + ldr r1, [pc, r1] + movw r4, :lower16:(L_OBJC_SELECTOR_REFERENCES_904c14aa63c4eec9-(LPC1_1+8)) + movt r4, :upper16:(L_OBJC_SELECTOR_REFERENCES_904c14aa63c4eec9-(LPC1_1+8)) +LPC1_1: + ldr r4, [pc, r4] + bl _objc_msgSend + mov r1, r4 + bl _objc_msgSend + pop {r4, r7, pc} + + .globl _use_generic + .p2align 2 + .code 32 +_use_generic: + push {r4, r7, lr} + add r7, sp, #4 + movw r2, :lower16:(L_OBJC_SELECTOR_REFERENCES_31f63858e271db32-(LPC2_0+8)) + mov r4, r0 + movt r2, :upper16:(L_OBJC_SELECTOR_REFERENCES_31f63858e271db32-(LPC2_0+8)) +LPC2_0: + ldr r2, [pc, r2] + movw r1, :lower16:(L_OBJC_SELECTOR_REFERENCES_cdfe92d39025fdf4-(LPC2_1+8)) + movt r1, :upper16:(L_OBJC_SELECTOR_REFERENCES_cdfe92d39025fdf4-(LPC2_1+8)) +LPC2_1: + ldr r1, [pc, r1] + bl _objc_msgSend + movw r2, :lower16:(L_OBJC_SELECTOR_REFERENCES_31f63858e271db32-(LPC2_2+8)) + mov r0, r4 + movt r2, :upper16:(L_OBJC_SELECTOR_REFERENCES_31f63858e271db32-(LPC2_2+8)) +LPC2_2: + ldr r2, [pc, r2] + movw r1, :lower16:(L_OBJC_SELECTOR_REFERENCES_79bd65c86d46fbf1-(LPC2_3+8)) + movt r1, :upper16:(L_OBJC_SELECTOR_REFERENCES_79bd65c86d46fbf1-(LPC2_3+8)) +LPC2_3: + ldr r1, [pc, r1] + bl _objc_msgSend + movw r2, :lower16:(L_OBJC_SELECTOR_REFERENCES_31f63858e271db32-(LPC2_4+8)) + mov r0, r4 + movt r2, :upper16:(L_OBJC_SELECTOR_REFERENCES_31f63858e271db32-(LPC2_4+8)) +LPC2_4: + ldr r2, [pc, r2] + movw r1, :lower16:(L_OBJC_SELECTOR_REFERENCES_8e0840c6b39b7720-(LPC2_5+8)) + movt r1, :upper16:(L_OBJC_SELECTOR_REFERENCES_8e0840c6b39b7720-(LPC2_5+8)) +LPC2_5: + ldr r1, [pc, r1] + bl _objc_msgSend + pop {r4, r7, pc} + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_40f5b12005284286 + .p2align 2 +L_OBJC_IMAGE_INFO_40f5b12005284286: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_40f5b12005284286 +L_OBJC_METH_VAR_NAME_40f5b12005284286: + .asciz "someSelector" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_40f5b12005284286 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_40f5b12005284286: + .long L_OBJC_METH_VAR_NAME_40f5b12005284286 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_904c14aa63c4eec9 + .p2align 2 +L_OBJC_IMAGE_INFO_904c14aa63c4eec9: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_904c14aa63c4eec9 +L_OBJC_METH_VAR_NAME_904c14aa63c4eec9: + .asciz "init" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_904c14aa63c4eec9 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_904c14aa63c4eec9: + .long L_OBJC_METH_VAR_NAME_904c14aa63c4eec9 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_b1ab35d3713395f9 + .p2align 2 +L_OBJC_IMAGE_INFO_b1ab35d3713395f9: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_b1ab35d3713395f9 +L_OBJC_METH_VAR_NAME_b1ab35d3713395f9: + .asciz "alloc" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_b1ab35d3713395f9 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_b1ab35d3713395f9: + .long L_OBJC_METH_VAR_NAME_b1ab35d3713395f9 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_31f63858e271db32 + .p2align 2 +L_OBJC_IMAGE_INFO_31f63858e271db32: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_31f63858e271db32 +L_OBJC_METH_VAR_NAME_31f63858e271db32: + .asciz "generic:selector:" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_31f63858e271db32 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_31f63858e271db32: + .long L_OBJC_METH_VAR_NAME_31f63858e271db32 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_cdfe92d39025fdf4 + .p2align 2 +L_OBJC_IMAGE_INFO_cdfe92d39025fdf4: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_cdfe92d39025fdf4 +L_OBJC_METH_VAR_NAME_cdfe92d39025fdf4: + .asciz "performSelector:" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_cdfe92d39025fdf4 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_cdfe92d39025fdf4: + .long L_OBJC_METH_VAR_NAME_cdfe92d39025fdf4 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_79bd65c86d46fbf1 + .p2align 2 +L_OBJC_IMAGE_INFO_79bd65c86d46fbf1: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_79bd65c86d46fbf1 +L_OBJC_METH_VAR_NAME_79bd65c86d46fbf1: + .asciz "performSelector:" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_79bd65c86d46fbf1 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_79bd65c86d46fbf1: + .long L_OBJC_METH_VAR_NAME_79bd65c86d46fbf1 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_8e0840c6b39b7720 + .p2align 2 +L_OBJC_IMAGE_INFO_8e0840c6b39b7720: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_8e0840c6b39b7720 +L_OBJC_METH_VAR_NAME_8e0840c6b39b7720: + .asciz "performSelector:" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_8e0840c6b39b7720 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_8e0840c6b39b7720: + .long L_OBJC_METH_VAR_NAME_8e0840c6b39b7720 + +.subsections_via_symbols diff --git a/tests/assembly/test_msg_send_static_sel/expected/apple-old-x86.s b/tests/assembly/test_msg_send_static_sel/expected/apple-old-x86.s new file mode 100644 index 000000000..09b496a01 --- /dev/null +++ b/tests/assembly/test_msg_send_static_sel/expected/apple-old-x86.s @@ -0,0 +1,195 @@ + .section __TEXT,__text,regular,pure_instructions + .intel_syntax noprefix + .globl _handle_with_sel + .p2align 4, 0x90 +_handle_with_sel: + push ebp + mov ebp, esp + sub esp, 8 + call L0$pb +L0$pb: + pop eax + sub esp, 8 + push dword ptr [eax + L_OBJC_SELECTOR_REFERENCES_40f5b12005284286-L0$pb] + push dword ptr [ebp + 8] + call _objc_msgSend + add esp, 24 + pop ebp + ret + + .globl _handle_alloc_init + .p2align 4, 0x90 +_handle_alloc_init: + push ebp + mov ebp, esp + push esi + push eax + call L1$pb +L1$pb: + pop eax + mov esi, dword ptr [eax + L_OBJC_SELECTOR_REFERENCES_904c14aa63c4eec9-L1$pb] + sub esp, 8 + push dword ptr [eax + L_OBJC_SELECTOR_REFERENCES_b1ab35d3713395f9-L1$pb] + push dword ptr [ebp + 8] + call _objc_msgSend + add esp, 8 + push esi + push eax + call _objc_msgSend + add esp, 20 + pop esi + pop ebp + ret + + .globl _use_generic + .p2align 4, 0x90 +_use_generic: + push ebp + mov ebp, esp + push edi + push esi + call L2$pb +L2$pb: + pop esi + mov edi, dword ptr [ebp + 8] + sub esp, 4 + push dword ptr [esi + L_OBJC_SELECTOR_REFERENCES_31f63858e271db32-L2$pb] + push dword ptr [esi + L_OBJC_SELECTOR_REFERENCES_cdfe92d39025fdf4-L2$pb] + push edi + call _objc_msgSend + add esp, 12 + push dword ptr [esi + L_OBJC_SELECTOR_REFERENCES_31f63858e271db32-L2$pb] + push dword ptr [esi + L_OBJC_SELECTOR_REFERENCES_79bd65c86d46fbf1-L2$pb] + push edi + call _objc_msgSend + add esp, 12 + push dword ptr [esi + L_OBJC_SELECTOR_REFERENCES_31f63858e271db32-L2$pb] + push dword ptr [esi + L_OBJC_SELECTOR_REFERENCES_8e0840c6b39b7720-L2$pb] + push edi + call _objc_msgSend + add esp, 16 + pop esi + pop edi + pop ebp + ret + + .section __OBJC,__image_info + .globl L_OBJC_IMAGE_INFO_40f5b12005284286 + .p2align 2 +L_OBJC_IMAGE_INFO_40f5b12005284286: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__cstring,cstring_literals + .globl L_OBJC_METH_VAR_NAME_40f5b12005284286 +L_OBJC_METH_VAR_NAME_40f5b12005284286: + .asciz "someSelector" + + .section __OBJC,__message_refs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_40f5b12005284286 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_40f5b12005284286: + .long L_OBJC_METH_VAR_NAME_40f5b12005284286 + + .section __OBJC,__image_info + .globl L_OBJC_IMAGE_INFO_904c14aa63c4eec9 + .p2align 2 +L_OBJC_IMAGE_INFO_904c14aa63c4eec9: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__cstring,cstring_literals + .globl L_OBJC_METH_VAR_NAME_904c14aa63c4eec9 +L_OBJC_METH_VAR_NAME_904c14aa63c4eec9: + .asciz "init" + + .section __OBJC,__message_refs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_904c14aa63c4eec9 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_904c14aa63c4eec9: + .long L_OBJC_METH_VAR_NAME_904c14aa63c4eec9 + + .section __OBJC,__image_info + .globl L_OBJC_IMAGE_INFO_b1ab35d3713395f9 + .p2align 2 +L_OBJC_IMAGE_INFO_b1ab35d3713395f9: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__cstring,cstring_literals + .globl L_OBJC_METH_VAR_NAME_b1ab35d3713395f9 +L_OBJC_METH_VAR_NAME_b1ab35d3713395f9: + .asciz "alloc" + + .section __OBJC,__message_refs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_b1ab35d3713395f9 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_b1ab35d3713395f9: + .long L_OBJC_METH_VAR_NAME_b1ab35d3713395f9 + + .section __OBJC,__image_info + .globl L_OBJC_IMAGE_INFO_31f63858e271db32 + .p2align 2 +L_OBJC_IMAGE_INFO_31f63858e271db32: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__cstring,cstring_literals + .globl L_OBJC_METH_VAR_NAME_31f63858e271db32 +L_OBJC_METH_VAR_NAME_31f63858e271db32: + .asciz "generic:selector:" + + .section __OBJC,__message_refs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_31f63858e271db32 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_31f63858e271db32: + .long L_OBJC_METH_VAR_NAME_31f63858e271db32 + + .section __OBJC,__image_info + .globl L_OBJC_IMAGE_INFO_cdfe92d39025fdf4 + .p2align 2 +L_OBJC_IMAGE_INFO_cdfe92d39025fdf4: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__cstring,cstring_literals + .globl L_OBJC_METH_VAR_NAME_cdfe92d39025fdf4 +L_OBJC_METH_VAR_NAME_cdfe92d39025fdf4: + .asciz "performSelector:" + + .section __OBJC,__message_refs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_cdfe92d39025fdf4 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_cdfe92d39025fdf4: + .long L_OBJC_METH_VAR_NAME_cdfe92d39025fdf4 + + .section __OBJC,__image_info + .globl L_OBJC_IMAGE_INFO_79bd65c86d46fbf1 + .p2align 2 +L_OBJC_IMAGE_INFO_79bd65c86d46fbf1: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__cstring,cstring_literals + .globl L_OBJC_METH_VAR_NAME_79bd65c86d46fbf1 +L_OBJC_METH_VAR_NAME_79bd65c86d46fbf1: + .asciz "performSelector:" + + .section __OBJC,__message_refs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_79bd65c86d46fbf1 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_79bd65c86d46fbf1: + .long L_OBJC_METH_VAR_NAME_79bd65c86d46fbf1 + + .section __OBJC,__image_info + .globl L_OBJC_IMAGE_INFO_8e0840c6b39b7720 + .p2align 2 +L_OBJC_IMAGE_INFO_8e0840c6b39b7720: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__cstring,cstring_literals + .globl L_OBJC_METH_VAR_NAME_8e0840c6b39b7720 +L_OBJC_METH_VAR_NAME_8e0840c6b39b7720: + .asciz "performSelector:" + + .section __OBJC,__message_refs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_8e0840c6b39b7720 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_8e0840c6b39b7720: + .long L_OBJC_METH_VAR_NAME_8e0840c6b39b7720 + +.subsections_via_symbols diff --git a/tests/assembly/test_msg_send_static_sel/expected/apple-x86.s b/tests/assembly/test_msg_send_static_sel/expected/apple-x86.s new file mode 100644 index 000000000..bb9869903 --- /dev/null +++ b/tests/assembly/test_msg_send_static_sel/expected/apple-x86.s @@ -0,0 +1,195 @@ + .section __TEXT,__text,regular,pure_instructions + .intel_syntax noprefix + .globl _handle_with_sel + .p2align 4, 0x90 +_handle_with_sel: + push ebp + mov ebp, esp + sub esp, 8 + call L0$pb +L0$pb: + pop eax + sub esp, 8 + push dword ptr [eax + L_OBJC_SELECTOR_REFERENCES_40f5b12005284286-L0$pb] + push dword ptr [ebp + 8] + call _objc_msgSend + add esp, 24 + pop ebp + ret + + .globl _handle_alloc_init + .p2align 4, 0x90 +_handle_alloc_init: + push ebp + mov ebp, esp + push esi + push eax + call L1$pb +L1$pb: + pop eax + mov esi, dword ptr [eax + L_OBJC_SELECTOR_REFERENCES_904c14aa63c4eec9-L1$pb] + sub esp, 8 + push dword ptr [eax + L_OBJC_SELECTOR_REFERENCES_b1ab35d3713395f9-L1$pb] + push dword ptr [ebp + 8] + call _objc_msgSend + add esp, 8 + push esi + push eax + call _objc_msgSend + add esp, 20 + pop esi + pop ebp + ret + + .globl _use_generic + .p2align 4, 0x90 +_use_generic: + push ebp + mov ebp, esp + push edi + push esi + call L2$pb +L2$pb: + pop esi + mov edi, dword ptr [ebp + 8] + sub esp, 4 + push dword ptr [esi + L_OBJC_SELECTOR_REFERENCES_31f63858e271db32-L2$pb] + push dword ptr [esi + L_OBJC_SELECTOR_REFERENCES_cdfe92d39025fdf4-L2$pb] + push edi + call _objc_msgSend + add esp, 12 + push dword ptr [esi + L_OBJC_SELECTOR_REFERENCES_31f63858e271db32-L2$pb] + push dword ptr [esi + L_OBJC_SELECTOR_REFERENCES_79bd65c86d46fbf1-L2$pb] + push edi + call _objc_msgSend + add esp, 12 + push dword ptr [esi + L_OBJC_SELECTOR_REFERENCES_31f63858e271db32-L2$pb] + push dword ptr [esi + L_OBJC_SELECTOR_REFERENCES_8e0840c6b39b7720-L2$pb] + push edi + call _objc_msgSend + add esp, 16 + pop esi + pop edi + pop ebp + ret + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_40f5b12005284286 + .p2align 2 +L_OBJC_IMAGE_INFO_40f5b12005284286: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_40f5b12005284286 +L_OBJC_METH_VAR_NAME_40f5b12005284286: + .asciz "someSelector" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_40f5b12005284286 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_40f5b12005284286: + .long L_OBJC_METH_VAR_NAME_40f5b12005284286 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_904c14aa63c4eec9 + .p2align 2 +L_OBJC_IMAGE_INFO_904c14aa63c4eec9: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_904c14aa63c4eec9 +L_OBJC_METH_VAR_NAME_904c14aa63c4eec9: + .asciz "init" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_904c14aa63c4eec9 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_904c14aa63c4eec9: + .long L_OBJC_METH_VAR_NAME_904c14aa63c4eec9 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_b1ab35d3713395f9 + .p2align 2 +L_OBJC_IMAGE_INFO_b1ab35d3713395f9: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_b1ab35d3713395f9 +L_OBJC_METH_VAR_NAME_b1ab35d3713395f9: + .asciz "alloc" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_b1ab35d3713395f9 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_b1ab35d3713395f9: + .long L_OBJC_METH_VAR_NAME_b1ab35d3713395f9 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_31f63858e271db32 + .p2align 2 +L_OBJC_IMAGE_INFO_31f63858e271db32: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_31f63858e271db32 +L_OBJC_METH_VAR_NAME_31f63858e271db32: + .asciz "generic:selector:" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_31f63858e271db32 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_31f63858e271db32: + .long L_OBJC_METH_VAR_NAME_31f63858e271db32 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_cdfe92d39025fdf4 + .p2align 2 +L_OBJC_IMAGE_INFO_cdfe92d39025fdf4: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_cdfe92d39025fdf4 +L_OBJC_METH_VAR_NAME_cdfe92d39025fdf4: + .asciz "performSelector:" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_cdfe92d39025fdf4 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_cdfe92d39025fdf4: + .long L_OBJC_METH_VAR_NAME_cdfe92d39025fdf4 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_79bd65c86d46fbf1 + .p2align 2 +L_OBJC_IMAGE_INFO_79bd65c86d46fbf1: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_79bd65c86d46fbf1 +L_OBJC_METH_VAR_NAME_79bd65c86d46fbf1: + .asciz "performSelector:" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_79bd65c86d46fbf1 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_79bd65c86d46fbf1: + .long L_OBJC_METH_VAR_NAME_79bd65c86d46fbf1 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_8e0840c6b39b7720 + .p2align 2 +L_OBJC_IMAGE_INFO_8e0840c6b39b7720: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_8e0840c6b39b7720 +L_OBJC_METH_VAR_NAME_8e0840c6b39b7720: + .asciz "performSelector:" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_8e0840c6b39b7720 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_8e0840c6b39b7720: + .long L_OBJC_METH_VAR_NAME_8e0840c6b39b7720 + +.subsections_via_symbols diff --git a/tests/assembly/test_msg_send_static_sel/expected/apple-x86_64.s b/tests/assembly/test_msg_send_static_sel/expected/apple-x86_64.s new file mode 100644 index 000000000..429887c29 --- /dev/null +++ b/tests/assembly/test_msg_send_static_sel/expected/apple-x86_64.s @@ -0,0 +1,171 @@ + .section __TEXT,__text,regular,pure_instructions + .intel_syntax noprefix + .globl _handle_with_sel + .p2align 4, 0x90 +_handle_with_sel: + push rbp + mov rbp, rsp + mov rsi, qword ptr [rip + L_OBJC_SELECTOR_REFERENCES_40f5b12005284286] + pop rbp + jmp _objc_msgSend + + .globl _handle_alloc_init + .p2align 4, 0x90 +_handle_alloc_init: + push rbp + mov rbp, rsp + push rbx + push rax + mov rbx, qword ptr [rip + L_OBJC_SELECTOR_REFERENCES_904c14aa63c4eec9] + mov rsi, qword ptr [rip + L_OBJC_SELECTOR_REFERENCES_b1ab35d3713395f9] + call _objc_msgSend + mov rdi, rax + mov rsi, rbx + add rsp, 8 + pop rbx + pop rbp + jmp _objc_msgSend + + .globl _use_generic + .p2align 4, 0x90 +_use_generic: + push rbp + mov rbp, rsp + push rbx + push rax + mov rbx, rdi + mov rsi, qword ptr [rip + L_OBJC_SELECTOR_REFERENCES_cdfe92d39025fdf4] + mov rdx, qword ptr [rip + L_OBJC_SELECTOR_REFERENCES_31f63858e271db32] + call _objc_msgSend + mov rsi, qword ptr [rip + L_OBJC_SELECTOR_REFERENCES_79bd65c86d46fbf1] + mov rdx, qword ptr [rip + L_OBJC_SELECTOR_REFERENCES_31f63858e271db32] + mov rdi, rbx + call _objc_msgSend + mov rsi, qword ptr [rip + L_OBJC_SELECTOR_REFERENCES_8e0840c6b39b7720] + mov rdx, qword ptr [rip + L_OBJC_SELECTOR_REFERENCES_31f63858e271db32] + mov rdi, rbx + add rsp, 8 + pop rbx + pop rbp + jmp _objc_msgSend + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_40f5b12005284286 + .p2align 2 +L_OBJC_IMAGE_INFO_40f5b12005284286: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_40f5b12005284286 +L_OBJC_METH_VAR_NAME_40f5b12005284286: + .asciz "someSelector" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_40f5b12005284286 + .p2align 3 +L_OBJC_SELECTOR_REFERENCES_40f5b12005284286: + .quad L_OBJC_METH_VAR_NAME_40f5b12005284286 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_904c14aa63c4eec9 + .p2align 2 +L_OBJC_IMAGE_INFO_904c14aa63c4eec9: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_904c14aa63c4eec9 +L_OBJC_METH_VAR_NAME_904c14aa63c4eec9: + .asciz "init" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_904c14aa63c4eec9 + .p2align 3 +L_OBJC_SELECTOR_REFERENCES_904c14aa63c4eec9: + .quad L_OBJC_METH_VAR_NAME_904c14aa63c4eec9 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_b1ab35d3713395f9 + .p2align 2 +L_OBJC_IMAGE_INFO_b1ab35d3713395f9: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_b1ab35d3713395f9 +L_OBJC_METH_VAR_NAME_b1ab35d3713395f9: + .asciz "alloc" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_b1ab35d3713395f9 + .p2align 3 +L_OBJC_SELECTOR_REFERENCES_b1ab35d3713395f9: + .quad L_OBJC_METH_VAR_NAME_b1ab35d3713395f9 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_31f63858e271db32 + .p2align 2 +L_OBJC_IMAGE_INFO_31f63858e271db32: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_31f63858e271db32 +L_OBJC_METH_VAR_NAME_31f63858e271db32: + .asciz "generic:selector:" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_31f63858e271db32 + .p2align 3 +L_OBJC_SELECTOR_REFERENCES_31f63858e271db32: + .quad L_OBJC_METH_VAR_NAME_31f63858e271db32 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_cdfe92d39025fdf4 + .p2align 2 +L_OBJC_IMAGE_INFO_cdfe92d39025fdf4: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_cdfe92d39025fdf4 +L_OBJC_METH_VAR_NAME_cdfe92d39025fdf4: + .asciz "performSelector:" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_cdfe92d39025fdf4 + .p2align 3 +L_OBJC_SELECTOR_REFERENCES_cdfe92d39025fdf4: + .quad L_OBJC_METH_VAR_NAME_cdfe92d39025fdf4 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_79bd65c86d46fbf1 + .p2align 2 +L_OBJC_IMAGE_INFO_79bd65c86d46fbf1: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_79bd65c86d46fbf1 +L_OBJC_METH_VAR_NAME_79bd65c86d46fbf1: + .asciz "performSelector:" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_79bd65c86d46fbf1 + .p2align 3 +L_OBJC_SELECTOR_REFERENCES_79bd65c86d46fbf1: + .quad L_OBJC_METH_VAR_NAME_79bd65c86d46fbf1 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_8e0840c6b39b7720 + .p2align 2 +L_OBJC_IMAGE_INFO_8e0840c6b39b7720: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_8e0840c6b39b7720 +L_OBJC_METH_VAR_NAME_8e0840c6b39b7720: + .asciz "performSelector:" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_8e0840c6b39b7720 + .p2align 3 +L_OBJC_SELECTOR_REFERENCES_8e0840c6b39b7720: + .quad L_OBJC_METH_VAR_NAME_8e0840c6b39b7720 + +.subsections_via_symbols diff --git a/tests/assembly/test_msg_send_static_sel/lib.rs b/tests/assembly/test_msg_send_static_sel/lib.rs new file mode 100644 index 000000000..dc17ab031 --- /dev/null +++ b/tests/assembly/test_msg_send_static_sel/lib.rs @@ -0,0 +1,25 @@ +//! Test how static selectors work in relation to `msg_send!` and `msg_send_id!` +use objc2::rc::{Id, Shared}; +use objc2::runtime::{Class, Object, Sel}; +use objc2::{msg_send, msg_send_id, sel}; + +#[no_mangle] +unsafe fn handle_with_sel(obj: &Object) -> *mut Object { + msg_send![obj, someSelector] +} + +#[no_mangle] +unsafe fn handle_alloc_init(cls: &Class) -> Option> { + msg_send_id![msg_send_id![cls, alloc], init] +} + +fn generic() -> Sel { + sel!(generic:selector:) +} + +#[no_mangle] +unsafe fn use_generic(obj: &Object) { + let _: () = msg_send![obj, performSelector: generic::()]; + let _: () = msg_send![obj, performSelector: generic::()]; + let _: () = msg_send![obj, performSelector: generic::()]; +} diff --git a/tests/assembly/test_msg_send_zero_cost/Cargo.toml b/tests/assembly/test_msg_send_zero_cost/Cargo.toml index b806be27f..a5c249957 100644 --- a/tests/assembly/test_msg_send_zero_cost/Cargo.toml +++ b/tests/assembly/test_msg_send_zero_cost/Cargo.toml @@ -19,3 +19,6 @@ gnustep-1-8 = ["gnustep-1-7", "objc2/gnustep-1-8"] gnustep-1-9 = ["gnustep-1-8", "objc2/gnustep-1-9"] gnustep-2-0 = ["gnustep-1-9", "objc2/gnustep-2-0"] gnustep-2-1 = ["gnustep-2-0", "objc2/gnustep-2-1"] + +# Hack +assembly-features = [] diff --git a/tests/assembly/test_msg_send_zero_cost/expected/apple-old-x86.s b/tests/assembly/test_msg_send_zero_cost/expected/apple-old-x86.s new file mode 100644 index 000000000..abb608b6c --- /dev/null +++ b/tests/assembly/test_msg_send_zero_cost/expected/apple-old-x86.s @@ -0,0 +1,39 @@ + .section __TEXT,__text,regular,pure_instructions + .intel_syntax noprefix + .globl _handle + .p2align 4, 0x90 +_handle: + push ebp + mov ebp, esp + pop ebp + jmp _objc_msgSend + + .globl _handle_with_sel + .p2align 4, 0x90 +_handle_with_sel: + push ebp + mov ebp, esp + sub esp, 8 + call L1$pb +L1$pb: + pop eax + sub esp, 8 + push dword ptr [eax + _SEL_REF-L1$pb] + push dword ptr [ebp + 8] + call _objc_msgSend + add esp, 24 + pop ebp + ret + + .section __TEXT,__const + .globl _SEL +_SEL: + .asciz "someSelector" + + .section __DATA,__const + .globl _SEL_REF + .p2align 2 +_SEL_REF: + .long _SEL + +.subsections_via_symbols diff --git a/tests/assembly/test_msg_send_zero_cost/lib.rs b/tests/assembly/test_msg_send_zero_cost/lib.rs index b175345d7..0902a382d 100644 --- a/tests/assembly/test_msg_send_zero_cost/lib.rs +++ b/tests/assembly/test_msg_send_zero_cost/lib.rs @@ -6,8 +6,8 @@ use objc2::runtime::{Object, Sel}; use objc2::MessageReceiver; #[no_mangle] -pub fn handle(obj: &Object, sel: Sel) -> *mut Object { - unsafe { MessageReceiver::send_message(obj, sel, ()).unwrap() } +unsafe fn handle(obj: &Object, sel: Sel) -> *mut Object { + MessageReceiver::send_message(obj, sel, ()).unwrap() } // This will definitely not work, but is useful for making the assembly look @@ -22,6 +22,6 @@ fn selector() -> Sel { } #[no_mangle] -pub fn handle_with_sel(obj: &Object) -> *mut Object { - unsafe { MessageReceiver::send_message(obj, selector(), ()).unwrap() } +unsafe fn handle_with_sel(obj: &Object) -> *mut Object { + MessageReceiver::send_message(obj, selector(), ()).unwrap() } diff --git a/tests/assembly/test_retain_autoreleased/Cargo.toml b/tests/assembly/test_retain_autoreleased/Cargo.toml index 60842d60e..26dbb656d 100644 --- a/tests/assembly/test_retain_autoreleased/Cargo.toml +++ b/tests/assembly/test_retain_autoreleased/Cargo.toml @@ -19,3 +19,6 @@ gnustep-1-8 = ["gnustep-1-7", "objc2/gnustep-1-8"] gnustep-1-9 = ["gnustep-1-8", "objc2/gnustep-1-9"] gnustep-2-0 = ["gnustep-1-9", "objc2/gnustep-2-0"] gnustep-2-1 = ["gnustep-2-0", "objc2/gnustep-2-1"] + +# Hack +assembly-features = [] diff --git a/tests/assembly/test_retain_autoreleased/expected/apple-old-x86.s b/tests/assembly/test_retain_autoreleased/expected/apple-old-x86.s new file mode 100644 index 000000000..b2ebee241 --- /dev/null +++ b/tests/assembly/test_retain_autoreleased/expected/apple-old-x86.s @@ -0,0 +1,25 @@ + .section __TEXT,__text,regular,pure_instructions + .intel_syntax noprefix + .globl _handle + .p2align 4, 0x90 +_handle: + push ebp + mov ebp, esp + sub esp, 8 + mov eax, dword ptr [ebp + 8] + mov ecx, dword ptr [ebp + 12] + mov dword ptr [esp + 4], ecx + mov dword ptr [esp], eax + call _objc_msgSend + ## InlineAsm Start + + mov ebp, ebp + + ## InlineAsm End + mov dword ptr [esp], eax + call _objc_retainAutoreleasedReturnValue + add esp, 8 + pop ebp + ret + +.subsections_via_symbols diff --git a/tests/assembly/test_retain_autoreleased/lib.rs b/tests/assembly/test_retain_autoreleased/lib.rs index ca1de6623..7526e9882 100644 --- a/tests/assembly/test_retain_autoreleased/lib.rs +++ b/tests/assembly/test_retain_autoreleased/lib.rs @@ -5,7 +5,7 @@ use objc2::runtime::{Object, Sel}; use objc2::MessageReceiver; #[no_mangle] -pub fn handle(obj: &Object, sel: Sel) -> Option> { - let ptr: *mut Object = unsafe { MessageReceiver::send_message(obj, sel, ()).unwrap() }; - unsafe { Id::retain_autoreleased(ptr) } +unsafe fn handle(obj: &Object, sel: Sel) -> Option> { + let ptr: *mut Object = MessageReceiver::send_message(obj, sel, ()).unwrap(); + Id::retain_autoreleased(ptr) } diff --git a/tests/assembly/test_static_sel/Cargo.toml b/tests/assembly/test_static_sel/Cargo.toml new file mode 100644 index 000000000..506e12d57 --- /dev/null +++ b/tests/assembly/test_static_sel/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "test_static_sel" +version = "0.1.0" +edition = "2021" +publish = false + +[lib] +path = "lib.rs" + +[dependencies] +objc2 = { path = "../../../objc2", default-features = false } + +[features] +default = ["apple"] +# Runtime +apple = ["objc2/apple"] +gnustep-1-7 = ["objc2/gnustep-1-7"] +gnustep-1-8 = ["gnustep-1-7", "objc2/gnustep-1-8"] +gnustep-1-9 = ["gnustep-1-8", "objc2/gnustep-1-9"] +gnustep-2-0 = ["gnustep-1-9", "objc2/gnustep-2-0"] +gnustep-2-1 = ["gnustep-2-0", "objc2/gnustep-2-1"] + +# Hack to prevent the feature flag from being enabled in the entire project +assembly-features = ["objc2/unstable-static-sel-inlined"] diff --git a/tests/assembly/test_static_sel/expected/apple-aarch64.s b/tests/assembly/test_static_sel/expected/apple-aarch64.s new file mode 100644 index 000000000..d2e9de2e9 --- /dev/null +++ b/tests/assembly/test_static_sel/expected/apple-aarch64.s @@ -0,0 +1,232 @@ + .section __TEXT,__text,regular,pure_instructions + .globl _get_sel + .p2align 2 +_get_sel: +Lloh0: + adrp x8, L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9@PAGE +Lloh1: + ldr x0, [x8, L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9@PAGEOFF] + ret + .loh AdrpLdr Lloh0, Lloh1 + + .globl _get_same_sel + .p2align 2 +_get_same_sel: +Lloh2: + adrp x8, L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35@PAGE +Lloh3: + ldr x0, [x8, L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35@PAGEOFF] + ret + .loh AdrpLdr Lloh2, Lloh3 + + .globl _get_common_twice + .p2align 2 +_get_common_twice: +Lloh4: + adrp x8, L_OBJC_SELECTOR_REFERENCES_e4a45d49bfea5d77@PAGE +Lloh5: + ldr x0, [x8, L_OBJC_SELECTOR_REFERENCES_e4a45d49bfea5d77@PAGEOFF] +Lloh6: + adrp x8, L_OBJC_SELECTOR_REFERENCES_33db9f67352fe9a7@PAGE +Lloh7: + ldr x1, [x8, L_OBJC_SELECTOR_REFERENCES_33db9f67352fe9a7@PAGEOFF] + ret + .loh AdrpLdr Lloh6, Lloh7 + .loh AdrpAdrp Lloh4, Lloh6 + .loh AdrpLdr Lloh4, Lloh5 + + .globl _get_different_sel + .p2align 2 +_get_different_sel: +Lloh8: + adrp x8, L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0@PAGE +Lloh9: + ldr x0, [x8, L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0@PAGEOFF] + ret + .loh AdrpLdr Lloh8, Lloh9 + + .globl _unused_sel + .p2align 2 +_unused_sel: + ret + + .globl _use_fns + .p2align 2 +_use_fns: +Lloh10: + adrp x9, L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9@PAGE +Lloh11: + ldr x9, [x9, L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9@PAGEOFF] +Lloh12: + adrp x10, L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35@PAGE +Lloh13: + ldr x10, [x10, L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35@PAGEOFF] +Lloh14: + adrp x11, L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0@PAGE +Lloh15: + ldr x11, [x11, L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0@PAGEOFF] +Lloh16: + adrp x12, L_OBJC_SELECTOR_REFERENCES_5419c3f7fc0a6f99@PAGE +Lloh17: + ldr x12, [x12, L_OBJC_SELECTOR_REFERENCES_5419c3f7fc0a6f99@PAGEOFF] + stp x9, x10, [x8] + stp x11, x12, [x8, #16] + ret + .loh AdrpLdr Lloh16, Lloh17 + .loh AdrpLdr Lloh14, Lloh15 + .loh AdrpLdr Lloh12, Lloh13 + .loh AdrpLdr Lloh10, Lloh11 + + .globl _use_same_twice + .p2align 2 +_use_same_twice: +Lloh18: + adrp x9, L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9@PAGE +Lloh19: + ldr x9, [x9, L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9@PAGEOFF] + stp x9, x9, [x8] + ret + .loh AdrpLdr Lloh18, Lloh19 + + .globl _use_in_loop + .p2align 2 +_use_in_loop: + ret + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_68381ba894e318e9 + .p2align 2 +L_OBJC_IMAGE_INFO_68381ba894e318e9: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_68381ba894e318e9 +L_OBJC_METH_VAR_NAME_68381ba894e318e9: + .asciz "simple" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9 + .p2align 3 +L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9: + .quad L_OBJC_METH_VAR_NAME_68381ba894e318e9 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_cd2fd6e7d2adcc35 + .p2align 2 +L_OBJC_IMAGE_INFO_cd2fd6e7d2adcc35: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_cd2fd6e7d2adcc35 +L_OBJC_METH_VAR_NAME_cd2fd6e7d2adcc35: + .asciz "simple" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35 + .p2align 3 +L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35: + .quad L_OBJC_METH_VAR_NAME_cd2fd6e7d2adcc35 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_e4a45d49bfea5d77 + .p2align 2 +L_OBJC_IMAGE_INFO_e4a45d49bfea5d77: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_e4a45d49bfea5d77 +L_OBJC_METH_VAR_NAME_e4a45d49bfea5d77: + .asciz "alloc" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_e4a45d49bfea5d77 + .p2align 3 +L_OBJC_SELECTOR_REFERENCES_e4a45d49bfea5d77: + .quad L_OBJC_METH_VAR_NAME_e4a45d49bfea5d77 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_33db9f67352fe9a7 + .p2align 2 +L_OBJC_IMAGE_INFO_33db9f67352fe9a7: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_33db9f67352fe9a7 +L_OBJC_METH_VAR_NAME_33db9f67352fe9a7: + .asciz "alloc" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_33db9f67352fe9a7 + .p2align 3 +L_OBJC_SELECTOR_REFERENCES_33db9f67352fe9a7: + .quad L_OBJC_METH_VAR_NAME_33db9f67352fe9a7 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_bb37877368f0b7a0 + .p2align 2 +L_OBJC_IMAGE_INFO_bb37877368f0b7a0: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_bb37877368f0b7a0 +L_OBJC_METH_VAR_NAME_bb37877368f0b7a0: + .asciz "i:am:different:" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0 + .p2align 3 +L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0: + .quad L_OBJC_METH_VAR_NAME_bb37877368f0b7a0 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_2c505e110d181b25 + .p2align 2 +L_OBJC_IMAGE_INFO_2c505e110d181b25: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_2c505e110d181b25 +L_OBJC_METH_VAR_NAME_2c505e110d181b25: + .asciz "unused" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_2c505e110d181b25 + .p2align 3 +L_OBJC_SELECTOR_REFERENCES_2c505e110d181b25: + .quad L_OBJC_METH_VAR_NAME_2c505e110d181b25 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_5419c3f7fc0a6f99 + .p2align 2 +L_OBJC_IMAGE_INFO_5419c3f7fc0a6f99: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_5419c3f7fc0a6f99 +L_OBJC_METH_VAR_NAME_5419c3f7fc0a6f99: + .asciz "fourthSel" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_5419c3f7fc0a6f99 + .p2align 3 +L_OBJC_SELECTOR_REFERENCES_5419c3f7fc0a6f99: + .quad L_OBJC_METH_VAR_NAME_5419c3f7fc0a6f99 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_f46908e864c86c6b + .p2align 2 +L_OBJC_IMAGE_INFO_f46908e864c86c6b: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_f46908e864c86c6b +L_OBJC_METH_VAR_NAME_f46908e864c86c6b: + .asciz "loopedSelector" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_f46908e864c86c6b + .p2align 3 +L_OBJC_SELECTOR_REFERENCES_f46908e864c86c6b: + .quad L_OBJC_METH_VAR_NAME_f46908e864c86c6b + +.subsections_via_symbols diff --git a/tests/assembly/test_static_sel/expected/apple-armv7.s b/tests/assembly/test_static_sel/expected/apple-armv7.s new file mode 100644 index 000000000..e2bd0d6dc --- /dev/null +++ b/tests/assembly/test_static_sel/expected/apple-armv7.s @@ -0,0 +1,232 @@ + .section __TEXT,__text,regular,pure_instructions + .syntax unified + .globl _get_sel + .p2align 2 + .code 32 +_get_sel: + movw r0, :lower16:(L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9-(LPC0_0+8)) + movt r0, :upper16:(L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9-(LPC0_0+8)) +LPC0_0: + ldr r0, [pc, r0] + bx lr + + .globl _get_same_sel + .p2align 2 + .code 32 +_get_same_sel: + movw r0, :lower16:(L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35-(LPC1_0+8)) + movt r0, :upper16:(L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35-(LPC1_0+8)) +LPC1_0: + ldr r0, [pc, r0] + bx lr + + .globl _get_common_twice + .p2align 2 + .code 32 +_get_common_twice: + movw r0, :lower16:(L_OBJC_SELECTOR_REFERENCES_e4a45d49bfea5d77-(LPC2_0+8)) + movt r0, :upper16:(L_OBJC_SELECTOR_REFERENCES_e4a45d49bfea5d77-(LPC2_0+8)) +LPC2_0: + ldr r0, [pc, r0] + movw r1, :lower16:(L_OBJC_SELECTOR_REFERENCES_33db9f67352fe9a7-(LPC2_1+8)) + movt r1, :upper16:(L_OBJC_SELECTOR_REFERENCES_33db9f67352fe9a7-(LPC2_1+8)) +LPC2_1: + ldr r1, [pc, r1] + bx lr + + .globl _get_different_sel + .p2align 2 + .code 32 +_get_different_sel: + movw r0, :lower16:(L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0-(LPC3_0+8)) + movt r0, :upper16:(L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0-(LPC3_0+8)) +LPC3_0: + ldr r0, [pc, r0] + bx lr + + .globl _unused_sel + .p2align 2 + .code 32 +_unused_sel: + bx lr + + .globl _use_fns + .p2align 2 + .code 32 +_use_fns: + movw r9, :lower16:(L_OBJC_SELECTOR_REFERENCES_5419c3f7fc0a6f99-(LPC5_0+8)) + movt r9, :upper16:(L_OBJC_SELECTOR_REFERENCES_5419c3f7fc0a6f99-(LPC5_0+8)) +LPC5_0: + ldr r9, [pc, r9] + movw r2, :lower16:(L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0-(LPC5_1+8)) + movt r2, :upper16:(L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0-(LPC5_1+8)) +LPC5_1: + ldr r2, [pc, r2] + movw r3, :lower16:(L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35-(LPC5_2+8)) + movt r3, :upper16:(L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35-(LPC5_2+8)) +LPC5_2: + ldr r3, [pc, r3] + movw r1, :lower16:(L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9-(LPC5_3+8)) + movt r1, :upper16:(L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9-(LPC5_3+8)) + str r2, [r0, #8] +LPC5_3: + ldr r1, [pc, r1] + str r9, [r0, #12] + stm r0, {r1, r3} + bx lr + + .globl _use_same_twice + .p2align 2 + .code 32 +_use_same_twice: + movw r1, :lower16:(L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9-(LPC6_0+8)) + movt r1, :upper16:(L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9-(LPC6_0+8)) +LPC6_0: + ldr r1, [pc, r1] + str r1, [r0] + str r1, [r0, #4] + bx lr + + .globl _use_in_loop + .p2align 2 + .code 32 +_use_in_loop: + bx lr + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_68381ba894e318e9 + .p2align 2 +L_OBJC_IMAGE_INFO_68381ba894e318e9: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_68381ba894e318e9 +L_OBJC_METH_VAR_NAME_68381ba894e318e9: + .asciz "simple" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9: + .long L_OBJC_METH_VAR_NAME_68381ba894e318e9 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_cd2fd6e7d2adcc35 + .p2align 2 +L_OBJC_IMAGE_INFO_cd2fd6e7d2adcc35: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_cd2fd6e7d2adcc35 +L_OBJC_METH_VAR_NAME_cd2fd6e7d2adcc35: + .asciz "simple" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35: + .long L_OBJC_METH_VAR_NAME_cd2fd6e7d2adcc35 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_e4a45d49bfea5d77 + .p2align 2 +L_OBJC_IMAGE_INFO_e4a45d49bfea5d77: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_e4a45d49bfea5d77 +L_OBJC_METH_VAR_NAME_e4a45d49bfea5d77: + .asciz "alloc" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_e4a45d49bfea5d77 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_e4a45d49bfea5d77: + .long L_OBJC_METH_VAR_NAME_e4a45d49bfea5d77 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_33db9f67352fe9a7 + .p2align 2 +L_OBJC_IMAGE_INFO_33db9f67352fe9a7: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_33db9f67352fe9a7 +L_OBJC_METH_VAR_NAME_33db9f67352fe9a7: + .asciz "alloc" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_33db9f67352fe9a7 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_33db9f67352fe9a7: + .long L_OBJC_METH_VAR_NAME_33db9f67352fe9a7 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_bb37877368f0b7a0 + .p2align 2 +L_OBJC_IMAGE_INFO_bb37877368f0b7a0: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_bb37877368f0b7a0 +L_OBJC_METH_VAR_NAME_bb37877368f0b7a0: + .asciz "i:am:different:" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0: + .long L_OBJC_METH_VAR_NAME_bb37877368f0b7a0 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_2c505e110d181b25 + .p2align 2 +L_OBJC_IMAGE_INFO_2c505e110d181b25: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_2c505e110d181b25 +L_OBJC_METH_VAR_NAME_2c505e110d181b25: + .asciz "unused" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_2c505e110d181b25 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_2c505e110d181b25: + .long L_OBJC_METH_VAR_NAME_2c505e110d181b25 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_5419c3f7fc0a6f99 + .p2align 2 +L_OBJC_IMAGE_INFO_5419c3f7fc0a6f99: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_5419c3f7fc0a6f99 +L_OBJC_METH_VAR_NAME_5419c3f7fc0a6f99: + .asciz "fourthSel" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_5419c3f7fc0a6f99 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_5419c3f7fc0a6f99: + .long L_OBJC_METH_VAR_NAME_5419c3f7fc0a6f99 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_f46908e864c86c6b + .p2align 2 +L_OBJC_IMAGE_INFO_f46908e864c86c6b: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_f46908e864c86c6b +L_OBJC_METH_VAR_NAME_f46908e864c86c6b: + .asciz "loopedSelector" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_f46908e864c86c6b + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_f46908e864c86c6b: + .long L_OBJC_METH_VAR_NAME_f46908e864c86c6b + +.subsections_via_symbols diff --git a/tests/assembly/test_static_sel/expected/apple-armv7s.s b/tests/assembly/test_static_sel/expected/apple-armv7s.s new file mode 100644 index 000000000..e2bd0d6dc --- /dev/null +++ b/tests/assembly/test_static_sel/expected/apple-armv7s.s @@ -0,0 +1,232 @@ + .section __TEXT,__text,regular,pure_instructions + .syntax unified + .globl _get_sel + .p2align 2 + .code 32 +_get_sel: + movw r0, :lower16:(L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9-(LPC0_0+8)) + movt r0, :upper16:(L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9-(LPC0_0+8)) +LPC0_0: + ldr r0, [pc, r0] + bx lr + + .globl _get_same_sel + .p2align 2 + .code 32 +_get_same_sel: + movw r0, :lower16:(L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35-(LPC1_0+8)) + movt r0, :upper16:(L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35-(LPC1_0+8)) +LPC1_0: + ldr r0, [pc, r0] + bx lr + + .globl _get_common_twice + .p2align 2 + .code 32 +_get_common_twice: + movw r0, :lower16:(L_OBJC_SELECTOR_REFERENCES_e4a45d49bfea5d77-(LPC2_0+8)) + movt r0, :upper16:(L_OBJC_SELECTOR_REFERENCES_e4a45d49bfea5d77-(LPC2_0+8)) +LPC2_0: + ldr r0, [pc, r0] + movw r1, :lower16:(L_OBJC_SELECTOR_REFERENCES_33db9f67352fe9a7-(LPC2_1+8)) + movt r1, :upper16:(L_OBJC_SELECTOR_REFERENCES_33db9f67352fe9a7-(LPC2_1+8)) +LPC2_1: + ldr r1, [pc, r1] + bx lr + + .globl _get_different_sel + .p2align 2 + .code 32 +_get_different_sel: + movw r0, :lower16:(L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0-(LPC3_0+8)) + movt r0, :upper16:(L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0-(LPC3_0+8)) +LPC3_0: + ldr r0, [pc, r0] + bx lr + + .globl _unused_sel + .p2align 2 + .code 32 +_unused_sel: + bx lr + + .globl _use_fns + .p2align 2 + .code 32 +_use_fns: + movw r9, :lower16:(L_OBJC_SELECTOR_REFERENCES_5419c3f7fc0a6f99-(LPC5_0+8)) + movt r9, :upper16:(L_OBJC_SELECTOR_REFERENCES_5419c3f7fc0a6f99-(LPC5_0+8)) +LPC5_0: + ldr r9, [pc, r9] + movw r2, :lower16:(L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0-(LPC5_1+8)) + movt r2, :upper16:(L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0-(LPC5_1+8)) +LPC5_1: + ldr r2, [pc, r2] + movw r3, :lower16:(L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35-(LPC5_2+8)) + movt r3, :upper16:(L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35-(LPC5_2+8)) +LPC5_2: + ldr r3, [pc, r3] + movw r1, :lower16:(L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9-(LPC5_3+8)) + movt r1, :upper16:(L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9-(LPC5_3+8)) + str r2, [r0, #8] +LPC5_3: + ldr r1, [pc, r1] + str r9, [r0, #12] + stm r0, {r1, r3} + bx lr + + .globl _use_same_twice + .p2align 2 + .code 32 +_use_same_twice: + movw r1, :lower16:(L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9-(LPC6_0+8)) + movt r1, :upper16:(L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9-(LPC6_0+8)) +LPC6_0: + ldr r1, [pc, r1] + str r1, [r0] + str r1, [r0, #4] + bx lr + + .globl _use_in_loop + .p2align 2 + .code 32 +_use_in_loop: + bx lr + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_68381ba894e318e9 + .p2align 2 +L_OBJC_IMAGE_INFO_68381ba894e318e9: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_68381ba894e318e9 +L_OBJC_METH_VAR_NAME_68381ba894e318e9: + .asciz "simple" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9: + .long L_OBJC_METH_VAR_NAME_68381ba894e318e9 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_cd2fd6e7d2adcc35 + .p2align 2 +L_OBJC_IMAGE_INFO_cd2fd6e7d2adcc35: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_cd2fd6e7d2adcc35 +L_OBJC_METH_VAR_NAME_cd2fd6e7d2adcc35: + .asciz "simple" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35: + .long L_OBJC_METH_VAR_NAME_cd2fd6e7d2adcc35 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_e4a45d49bfea5d77 + .p2align 2 +L_OBJC_IMAGE_INFO_e4a45d49bfea5d77: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_e4a45d49bfea5d77 +L_OBJC_METH_VAR_NAME_e4a45d49bfea5d77: + .asciz "alloc" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_e4a45d49bfea5d77 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_e4a45d49bfea5d77: + .long L_OBJC_METH_VAR_NAME_e4a45d49bfea5d77 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_33db9f67352fe9a7 + .p2align 2 +L_OBJC_IMAGE_INFO_33db9f67352fe9a7: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_33db9f67352fe9a7 +L_OBJC_METH_VAR_NAME_33db9f67352fe9a7: + .asciz "alloc" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_33db9f67352fe9a7 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_33db9f67352fe9a7: + .long L_OBJC_METH_VAR_NAME_33db9f67352fe9a7 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_bb37877368f0b7a0 + .p2align 2 +L_OBJC_IMAGE_INFO_bb37877368f0b7a0: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_bb37877368f0b7a0 +L_OBJC_METH_VAR_NAME_bb37877368f0b7a0: + .asciz "i:am:different:" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0: + .long L_OBJC_METH_VAR_NAME_bb37877368f0b7a0 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_2c505e110d181b25 + .p2align 2 +L_OBJC_IMAGE_INFO_2c505e110d181b25: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_2c505e110d181b25 +L_OBJC_METH_VAR_NAME_2c505e110d181b25: + .asciz "unused" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_2c505e110d181b25 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_2c505e110d181b25: + .long L_OBJC_METH_VAR_NAME_2c505e110d181b25 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_5419c3f7fc0a6f99 + .p2align 2 +L_OBJC_IMAGE_INFO_5419c3f7fc0a6f99: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_5419c3f7fc0a6f99 +L_OBJC_METH_VAR_NAME_5419c3f7fc0a6f99: + .asciz "fourthSel" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_5419c3f7fc0a6f99 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_5419c3f7fc0a6f99: + .long L_OBJC_METH_VAR_NAME_5419c3f7fc0a6f99 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_f46908e864c86c6b + .p2align 2 +L_OBJC_IMAGE_INFO_f46908e864c86c6b: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_f46908e864c86c6b +L_OBJC_METH_VAR_NAME_f46908e864c86c6b: + .asciz "loopedSelector" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_f46908e864c86c6b + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_f46908e864c86c6b: + .long L_OBJC_METH_VAR_NAME_f46908e864c86c6b + +.subsections_via_symbols diff --git a/tests/assembly/test_static_sel/expected/apple-old-x86.s b/tests/assembly/test_static_sel/expected/apple-old-x86.s new file mode 100644 index 000000000..2b7e444d1 --- /dev/null +++ b/tests/assembly/test_static_sel/expected/apple-old-x86.s @@ -0,0 +1,243 @@ + .section __TEXT,__text,regular,pure_instructions + .intel_syntax noprefix + .globl _get_sel + .p2align 4, 0x90 +_get_sel: + push ebp + mov ebp, esp + call L0$pb +L0$pb: + pop eax + mov eax, dword ptr [eax + L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9-L0$pb] + pop ebp + ret + + .globl _get_same_sel + .p2align 4, 0x90 +_get_same_sel: + push ebp + mov ebp, esp + call L1$pb +L1$pb: + pop eax + mov eax, dword ptr [eax + L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35-L1$pb] + pop ebp + ret + + .globl _get_common_twice + .p2align 4, 0x90 +_get_common_twice: + push ebp + mov ebp, esp + call L2$pb +L2$pb: + pop ecx + mov eax, dword ptr [ecx + L_OBJC_SELECTOR_REFERENCES_e4a45d49bfea5d77-L2$pb] + mov edx, dword ptr [ecx + L_OBJC_SELECTOR_REFERENCES_33db9f67352fe9a7-L2$pb] + pop ebp + ret + + .globl _get_different_sel + .p2align 4, 0x90 +_get_different_sel: + push ebp + mov ebp, esp + call L3$pb +L3$pb: + pop eax + mov eax, dword ptr [eax + L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0-L3$pb] + pop ebp + ret + + .globl _unused_sel + .p2align 4, 0x90 +_unused_sel: + push ebp + mov ebp, esp + pop ebp + ret + + .globl _use_fns + .p2align 4, 0x90 +_use_fns: + push ebp + mov ebp, esp + push edi + push esi + call L5$pb +L5$pb: + pop ecx + mov eax, dword ptr [ebp + 8] + mov edx, dword ptr [ecx + L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9-L5$pb] + mov esi, dword ptr [ecx + L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35-L5$pb] + mov edi, dword ptr [ecx + L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0-L5$pb] + mov ecx, dword ptr [ecx + L_OBJC_SELECTOR_REFERENCES_5419c3f7fc0a6f99-L5$pb] + mov dword ptr [eax], edx + mov dword ptr [eax + 4], esi + mov dword ptr [eax + 8], edi + mov dword ptr [eax + 12], ecx + pop esi + pop edi + pop ebp + ret 4 + + .globl _use_same_twice + .p2align 4, 0x90 +_use_same_twice: + push ebp + mov ebp, esp + call L6$pb +L6$pb: + pop ecx + mov eax, dword ptr [ebp + 8] + mov ecx, dword ptr [ecx + L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9-L6$pb] + mov dword ptr [eax], ecx + mov dword ptr [eax + 4], ecx + pop ebp + ret 4 + + .globl _use_in_loop + .p2align 4, 0x90 +_use_in_loop: + push ebp + mov ebp, esp + pop ebp + ret + + .section __OBJC,__image_info + .globl L_OBJC_IMAGE_INFO_68381ba894e318e9 + .p2align 2 +L_OBJC_IMAGE_INFO_68381ba894e318e9: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__cstring,cstring_literals + .globl L_OBJC_METH_VAR_NAME_68381ba894e318e9 +L_OBJC_METH_VAR_NAME_68381ba894e318e9: + .asciz "simple" + + .section __OBJC,__message_refs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9: + .long L_OBJC_METH_VAR_NAME_68381ba894e318e9 + + .section __OBJC,__image_info + .globl L_OBJC_IMAGE_INFO_cd2fd6e7d2adcc35 + .p2align 2 +L_OBJC_IMAGE_INFO_cd2fd6e7d2adcc35: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__cstring,cstring_literals + .globl L_OBJC_METH_VAR_NAME_cd2fd6e7d2adcc35 +L_OBJC_METH_VAR_NAME_cd2fd6e7d2adcc35: + .asciz "simple" + + .section __OBJC,__message_refs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35: + .long L_OBJC_METH_VAR_NAME_cd2fd6e7d2adcc35 + + .section __OBJC,__image_info + .globl L_OBJC_IMAGE_INFO_e4a45d49bfea5d77 + .p2align 2 +L_OBJC_IMAGE_INFO_e4a45d49bfea5d77: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__cstring,cstring_literals + .globl L_OBJC_METH_VAR_NAME_e4a45d49bfea5d77 +L_OBJC_METH_VAR_NAME_e4a45d49bfea5d77: + .asciz "alloc" + + .section __OBJC,__message_refs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_e4a45d49bfea5d77 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_e4a45d49bfea5d77: + .long L_OBJC_METH_VAR_NAME_e4a45d49bfea5d77 + + .section __OBJC,__image_info + .globl L_OBJC_IMAGE_INFO_33db9f67352fe9a7 + .p2align 2 +L_OBJC_IMAGE_INFO_33db9f67352fe9a7: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__cstring,cstring_literals + .globl L_OBJC_METH_VAR_NAME_33db9f67352fe9a7 +L_OBJC_METH_VAR_NAME_33db9f67352fe9a7: + .asciz "alloc" + + .section __OBJC,__message_refs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_33db9f67352fe9a7 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_33db9f67352fe9a7: + .long L_OBJC_METH_VAR_NAME_33db9f67352fe9a7 + + .section __OBJC,__image_info + .globl L_OBJC_IMAGE_INFO_bb37877368f0b7a0 + .p2align 2 +L_OBJC_IMAGE_INFO_bb37877368f0b7a0: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__cstring,cstring_literals + .globl L_OBJC_METH_VAR_NAME_bb37877368f0b7a0 +L_OBJC_METH_VAR_NAME_bb37877368f0b7a0: + .asciz "i:am:different:" + + .section __OBJC,__message_refs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0: + .long L_OBJC_METH_VAR_NAME_bb37877368f0b7a0 + + .section __OBJC,__image_info + .globl L_OBJC_IMAGE_INFO_2c505e110d181b25 + .p2align 2 +L_OBJC_IMAGE_INFO_2c505e110d181b25: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__cstring,cstring_literals + .globl L_OBJC_METH_VAR_NAME_2c505e110d181b25 +L_OBJC_METH_VAR_NAME_2c505e110d181b25: + .asciz "unused" + + .section __OBJC,__message_refs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_2c505e110d181b25 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_2c505e110d181b25: + .long L_OBJC_METH_VAR_NAME_2c505e110d181b25 + + .section __OBJC,__image_info + .globl L_OBJC_IMAGE_INFO_5419c3f7fc0a6f99 + .p2align 2 +L_OBJC_IMAGE_INFO_5419c3f7fc0a6f99: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__cstring,cstring_literals + .globl L_OBJC_METH_VAR_NAME_5419c3f7fc0a6f99 +L_OBJC_METH_VAR_NAME_5419c3f7fc0a6f99: + .asciz "fourthSel" + + .section __OBJC,__message_refs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_5419c3f7fc0a6f99 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_5419c3f7fc0a6f99: + .long L_OBJC_METH_VAR_NAME_5419c3f7fc0a6f99 + + .section __OBJC,__image_info + .globl L_OBJC_IMAGE_INFO_f46908e864c86c6b + .p2align 2 +L_OBJC_IMAGE_INFO_f46908e864c86c6b: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__cstring,cstring_literals + .globl L_OBJC_METH_VAR_NAME_f46908e864c86c6b +L_OBJC_METH_VAR_NAME_f46908e864c86c6b: + .asciz "loopedSelector" + + .section __OBJC,__message_refs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_f46908e864c86c6b + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_f46908e864c86c6b: + .long L_OBJC_METH_VAR_NAME_f46908e864c86c6b + +.subsections_via_symbols diff --git a/tests/assembly/test_static_sel/expected/apple-x86.s b/tests/assembly/test_static_sel/expected/apple-x86.s new file mode 100644 index 000000000..71cd6cc7c --- /dev/null +++ b/tests/assembly/test_static_sel/expected/apple-x86.s @@ -0,0 +1,243 @@ + .section __TEXT,__text,regular,pure_instructions + .intel_syntax noprefix + .globl _get_sel + .p2align 4, 0x90 +_get_sel: + push ebp + mov ebp, esp + call L0$pb +L0$pb: + pop eax + mov eax, dword ptr [eax + L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9-L0$pb] + pop ebp + ret + + .globl _get_same_sel + .p2align 4, 0x90 +_get_same_sel: + push ebp + mov ebp, esp + call L1$pb +L1$pb: + pop eax + mov eax, dword ptr [eax + L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35-L1$pb] + pop ebp + ret + + .globl _get_common_twice + .p2align 4, 0x90 +_get_common_twice: + push ebp + mov ebp, esp + call L2$pb +L2$pb: + pop ecx + mov eax, dword ptr [ecx + L_OBJC_SELECTOR_REFERENCES_e4a45d49bfea5d77-L2$pb] + mov edx, dword ptr [ecx + L_OBJC_SELECTOR_REFERENCES_33db9f67352fe9a7-L2$pb] + pop ebp + ret + + .globl _get_different_sel + .p2align 4, 0x90 +_get_different_sel: + push ebp + mov ebp, esp + call L3$pb +L3$pb: + pop eax + mov eax, dword ptr [eax + L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0-L3$pb] + pop ebp + ret + + .globl _unused_sel + .p2align 4, 0x90 +_unused_sel: + push ebp + mov ebp, esp + pop ebp + ret + + .globl _use_fns + .p2align 4, 0x90 +_use_fns: + push ebp + mov ebp, esp + push edi + push esi + call L5$pb +L5$pb: + pop ecx + mov eax, dword ptr [ebp + 8] + mov edx, dword ptr [ecx + L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9-L5$pb] + mov esi, dword ptr [ecx + L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35-L5$pb] + mov edi, dword ptr [ecx + L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0-L5$pb] + mov ecx, dword ptr [ecx + L_OBJC_SELECTOR_REFERENCES_5419c3f7fc0a6f99-L5$pb] + mov dword ptr [eax], edx + mov dword ptr [eax + 4], esi + mov dword ptr [eax + 8], edi + mov dword ptr [eax + 12], ecx + pop esi + pop edi + pop ebp + ret 4 + + .globl _use_same_twice + .p2align 4, 0x90 +_use_same_twice: + push ebp + mov ebp, esp + call L6$pb +L6$pb: + pop ecx + mov eax, dword ptr [ebp + 8] + mov ecx, dword ptr [ecx + L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9-L6$pb] + mov dword ptr [eax], ecx + mov dword ptr [eax + 4], ecx + pop ebp + ret 4 + + .globl _use_in_loop + .p2align 4, 0x90 +_use_in_loop: + push ebp + mov ebp, esp + pop ebp + ret + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_68381ba894e318e9 + .p2align 2 +L_OBJC_IMAGE_INFO_68381ba894e318e9: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_68381ba894e318e9 +L_OBJC_METH_VAR_NAME_68381ba894e318e9: + .asciz "simple" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9: + .long L_OBJC_METH_VAR_NAME_68381ba894e318e9 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_cd2fd6e7d2adcc35 + .p2align 2 +L_OBJC_IMAGE_INFO_cd2fd6e7d2adcc35: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_cd2fd6e7d2adcc35 +L_OBJC_METH_VAR_NAME_cd2fd6e7d2adcc35: + .asciz "simple" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35: + .long L_OBJC_METH_VAR_NAME_cd2fd6e7d2adcc35 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_e4a45d49bfea5d77 + .p2align 2 +L_OBJC_IMAGE_INFO_e4a45d49bfea5d77: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_e4a45d49bfea5d77 +L_OBJC_METH_VAR_NAME_e4a45d49bfea5d77: + .asciz "alloc" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_e4a45d49bfea5d77 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_e4a45d49bfea5d77: + .long L_OBJC_METH_VAR_NAME_e4a45d49bfea5d77 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_33db9f67352fe9a7 + .p2align 2 +L_OBJC_IMAGE_INFO_33db9f67352fe9a7: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_33db9f67352fe9a7 +L_OBJC_METH_VAR_NAME_33db9f67352fe9a7: + .asciz "alloc" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_33db9f67352fe9a7 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_33db9f67352fe9a7: + .long L_OBJC_METH_VAR_NAME_33db9f67352fe9a7 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_bb37877368f0b7a0 + .p2align 2 +L_OBJC_IMAGE_INFO_bb37877368f0b7a0: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_bb37877368f0b7a0 +L_OBJC_METH_VAR_NAME_bb37877368f0b7a0: + .asciz "i:am:different:" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0: + .long L_OBJC_METH_VAR_NAME_bb37877368f0b7a0 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_2c505e110d181b25 + .p2align 2 +L_OBJC_IMAGE_INFO_2c505e110d181b25: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_2c505e110d181b25 +L_OBJC_METH_VAR_NAME_2c505e110d181b25: + .asciz "unused" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_2c505e110d181b25 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_2c505e110d181b25: + .long L_OBJC_METH_VAR_NAME_2c505e110d181b25 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_5419c3f7fc0a6f99 + .p2align 2 +L_OBJC_IMAGE_INFO_5419c3f7fc0a6f99: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_5419c3f7fc0a6f99 +L_OBJC_METH_VAR_NAME_5419c3f7fc0a6f99: + .asciz "fourthSel" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_5419c3f7fc0a6f99 + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_5419c3f7fc0a6f99: + .long L_OBJC_METH_VAR_NAME_5419c3f7fc0a6f99 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_f46908e864c86c6b + .p2align 2 +L_OBJC_IMAGE_INFO_f46908e864c86c6b: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_f46908e864c86c6b +L_OBJC_METH_VAR_NAME_f46908e864c86c6b: + .asciz "loopedSelector" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_f46908e864c86c6b + .p2align 2 +L_OBJC_SELECTOR_REFERENCES_f46908e864c86c6b: + .long L_OBJC_METH_VAR_NAME_f46908e864c86c6b + +.subsections_via_symbols diff --git a/tests/assembly/test_static_sel/expected/apple-x86_64.s b/tests/assembly/test_static_sel/expected/apple-x86_64.s new file mode 100644 index 000000000..61117fae6 --- /dev/null +++ b/tests/assembly/test_static_sel/expected/apple-x86_64.s @@ -0,0 +1,221 @@ + .section __TEXT,__text,regular,pure_instructions + .intel_syntax noprefix + .globl _get_sel + .p2align 4, 0x90 +_get_sel: + push rbp + mov rbp, rsp + mov rax, qword ptr [rip + L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9] + pop rbp + ret + + .globl _get_same_sel + .p2align 4, 0x90 +_get_same_sel: + push rbp + mov rbp, rsp + mov rax, qword ptr [rip + L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35] + pop rbp + ret + + .globl _get_common_twice + .p2align 4, 0x90 +_get_common_twice: + push rbp + mov rbp, rsp + mov rax, qword ptr [rip + L_OBJC_SELECTOR_REFERENCES_e4a45d49bfea5d77] + mov rdx, qword ptr [rip + L_OBJC_SELECTOR_REFERENCES_33db9f67352fe9a7] + pop rbp + ret + + .globl _get_different_sel + .p2align 4, 0x90 +_get_different_sel: + push rbp + mov rbp, rsp + mov rax, qword ptr [rip + L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0] + pop rbp + ret + + .globl _unused_sel + .p2align 4, 0x90 +_unused_sel: + push rbp + mov rbp, rsp + pop rbp + ret + + .globl _use_fns + .p2align 4, 0x90 +_use_fns: + push rbp + mov rbp, rsp + mov rax, rdi + mov rcx, qword ptr [rip + L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9] + mov rdx, qword ptr [rip + L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35] + mov rsi, qword ptr [rip + L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0] + mov rdi, qword ptr [rip + L_OBJC_SELECTOR_REFERENCES_5419c3f7fc0a6f99] + mov qword ptr [rax], rcx + mov qword ptr [rax + 8], rdx + mov qword ptr [rax + 16], rsi + mov qword ptr [rax + 24], rdi + pop rbp + ret + + .globl _use_same_twice + .p2align 4, 0x90 +_use_same_twice: + push rbp + mov rbp, rsp + mov rax, rdi + mov rcx, qword ptr [rip + L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9] + mov qword ptr [rdi], rcx + mov qword ptr [rdi + 8], rcx + pop rbp + ret + + .globl _use_in_loop + .p2align 4, 0x90 +_use_in_loop: + push rbp + mov rbp, rsp + pop rbp + ret + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_68381ba894e318e9 + .p2align 2 +L_OBJC_IMAGE_INFO_68381ba894e318e9: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_68381ba894e318e9 +L_OBJC_METH_VAR_NAME_68381ba894e318e9: + .asciz "simple" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9 + .p2align 3 +L_OBJC_SELECTOR_REFERENCES_68381ba894e318e9: + .quad L_OBJC_METH_VAR_NAME_68381ba894e318e9 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_cd2fd6e7d2adcc35 + .p2align 2 +L_OBJC_IMAGE_INFO_cd2fd6e7d2adcc35: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_cd2fd6e7d2adcc35 +L_OBJC_METH_VAR_NAME_cd2fd6e7d2adcc35: + .asciz "simple" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35 + .p2align 3 +L_OBJC_SELECTOR_REFERENCES_cd2fd6e7d2adcc35: + .quad L_OBJC_METH_VAR_NAME_cd2fd6e7d2adcc35 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_e4a45d49bfea5d77 + .p2align 2 +L_OBJC_IMAGE_INFO_e4a45d49bfea5d77: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_e4a45d49bfea5d77 +L_OBJC_METH_VAR_NAME_e4a45d49bfea5d77: + .asciz "alloc" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_e4a45d49bfea5d77 + .p2align 3 +L_OBJC_SELECTOR_REFERENCES_e4a45d49bfea5d77: + .quad L_OBJC_METH_VAR_NAME_e4a45d49bfea5d77 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_33db9f67352fe9a7 + .p2align 2 +L_OBJC_IMAGE_INFO_33db9f67352fe9a7: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_33db9f67352fe9a7 +L_OBJC_METH_VAR_NAME_33db9f67352fe9a7: + .asciz "alloc" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_33db9f67352fe9a7 + .p2align 3 +L_OBJC_SELECTOR_REFERENCES_33db9f67352fe9a7: + .quad L_OBJC_METH_VAR_NAME_33db9f67352fe9a7 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_bb37877368f0b7a0 + .p2align 2 +L_OBJC_IMAGE_INFO_bb37877368f0b7a0: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_bb37877368f0b7a0 +L_OBJC_METH_VAR_NAME_bb37877368f0b7a0: + .asciz "i:am:different:" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0 + .p2align 3 +L_OBJC_SELECTOR_REFERENCES_bb37877368f0b7a0: + .quad L_OBJC_METH_VAR_NAME_bb37877368f0b7a0 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_2c505e110d181b25 + .p2align 2 +L_OBJC_IMAGE_INFO_2c505e110d181b25: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_2c505e110d181b25 +L_OBJC_METH_VAR_NAME_2c505e110d181b25: + .asciz "unused" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_2c505e110d181b25 + .p2align 3 +L_OBJC_SELECTOR_REFERENCES_2c505e110d181b25: + .quad L_OBJC_METH_VAR_NAME_2c505e110d181b25 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_5419c3f7fc0a6f99 + .p2align 2 +L_OBJC_IMAGE_INFO_5419c3f7fc0a6f99: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_5419c3f7fc0a6f99 +L_OBJC_METH_VAR_NAME_5419c3f7fc0a6f99: + .asciz "fourthSel" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_5419c3f7fc0a6f99 + .p2align 3 +L_OBJC_SELECTOR_REFERENCES_5419c3f7fc0a6f99: + .quad L_OBJC_METH_VAR_NAME_5419c3f7fc0a6f99 + + .section __DATA,__objc_imageinfo,regular,no_dead_strip + .globl L_OBJC_IMAGE_INFO_f46908e864c86c6b + .p2align 2 +L_OBJC_IMAGE_INFO_f46908e864c86c6b: + .asciz "\000\000\000\000@\000\000" + + .section __TEXT,__objc_methname,cstring_literals + .globl L_OBJC_METH_VAR_NAME_f46908e864c86c6b +L_OBJC_METH_VAR_NAME_f46908e864c86c6b: + .asciz "loopedSelector" + + .section __DATA,__objc_selrefs,literal_pointers,no_dead_strip + .globl L_OBJC_SELECTOR_REFERENCES_f46908e864c86c6b + .p2align 3 +L_OBJC_SELECTOR_REFERENCES_f46908e864c86c6b: + .quad L_OBJC_METH_VAR_NAME_f46908e864c86c6b + +.subsections_via_symbols diff --git a/tests/assembly/test_static_sel/lib.rs b/tests/assembly/test_static_sel/lib.rs new file mode 100644 index 000000000..97b4d67c6 --- /dev/null +++ b/tests/assembly/test_static_sel/lib.rs @@ -0,0 +1,51 @@ +//! Test the output of the `sel!` macro. +use objc2::runtime::Sel; +use objc2::sel; + +#[no_mangle] +fn get_sel() -> Sel { + sel!(simple) +} + +#[no_mangle] +fn get_same_sel() -> Sel { + sel!(simple) +} + +#[no_mangle] +fn get_common_twice() -> (Sel, Sel) { + (sel!(alloc), sel!(alloc)) +} + +#[no_mangle] +fn get_different_sel() -> Sel { + sel!(i: am: different:) +} + +#[no_mangle] +fn unused_sel() { + let _ = sel!(unused); +} + +#[no_mangle] +fn use_fns() -> [Sel; 4] { + let s1 = get_sel(); + let s2 = get_same_sel(); + let s3 = get_different_sel(); + let s4 = sel!(fourthSel); + [s1, s2, s3, s4] +} + +#[no_mangle] +fn use_same_twice() -> [Sel; 2] { + // Should not need to load twice + [get_sel(), get_sel()] +} + +#[no_mangle] +fn use_in_loop(n: usize) { + for _i in 0..n { + // Should be a noop + let _ = sel!(loopedSelector); + } +} diff --git a/tests/src/bin/test_assembly.rs b/tests/src/bin/test_assembly.rs index 66d8032a7..b9040e5d1 100644 --- a/tests/src/bin/test_assembly.rs +++ b/tests/src/bin/test_assembly.rs @@ -1,6 +1,9 @@ //! A helper script for testing the assembly output. //! //! Similar to `trybuild` and `compiletest`, except specialized to our setup! +//! +//! Very limited currently, for example we can't stably test things that emits +//! mangled symbols, nor things that are emitted in different crates. use cargo_metadata::Message; use std::env; @@ -50,6 +53,12 @@ fn read_assembly>(path: P) -> io::Result { .to_str() .unwrap(); let s = s.replace(workspace_dir, "$WORKSPACE"); + // HACK: Replace Objective-C image info for simulator targets + let s = s.replace( + ".asciz\t\"\\000\\000\\000\\000`\\000\\000\"", + ".asciz\t\"\\000\\000\\000\\000@\\000\\000\"", + ); + // Strip various uninteresting directives let s = strip_lines(&s, ".cfi_"); let s = strip_lines(&s, ".macosx_version_"); let s = strip_lines(&s, ".ios_version_"); @@ -85,10 +94,12 @@ fn main() { .args(args().skip(2)) .arg("--release") .arg("--message-format=json-render-diagnostics") + .arg("--features=assembly-features") .arg("--") .arg("--emit=asm") // .arg("-Zplt=no") .arg("-Cllvm-args=--x86-asm-syntax=intel") + .arg("-Csymbol-mangling-version=v0") .stdout(Stdio::piped()) .stderr(Stdio::inherit()) .output() @@ -123,12 +134,14 @@ fn main() { .unwrap_or(host); println!("Target {target}."); - let architecture = target.split_once("-").unwrap().0; - let architecture = if matches!(architecture, "i386" | "i686") { - "x86" - } else { - architecture + let mut architecture = target.split_once("-").unwrap().0; + if matches!(architecture, "i386" | "i686") { + architecture = "x86"; }; + if target == "i686-apple-darwin" { + // Old ABI, we frequently have to do things differently there + architecture = "old-x86"; + } println!("Architecture {architecture}."); let expected_file = package_path