use core::mem::{size_of, transmute};
#[macro_export]
macro_rules! ctor {
(fn $name:ident() { $($body:tt)* }) => {
#[used]
#[link_section = ".ctors"]
#[allow(non_upper_case_globals)]
static $name: fn() = || {
$($body)*
};
};
}
#[macro_export]
macro_rules! dtor {
(fn $name:ident() { $($body:tt)* }) => {
#[used]
#[link_section = ".dtors"]
#[allow(non_upper_case_globals)]
static $name: fn() = || {
$($body)*
};
};
}
#[cfg(feature = "loadable_exe")]
type RtReturn = ();
#[cfg(not(feature = "loadable_exe"))]
type RtReturn = !;
#[no_mangle]
extern "C" fn __start() -> RtReturn {
unsafe {
#[cfg(not(test))]
extern "Rust" {
fn main();
}
extern "C" {
static __ctors_start: usize;
static __ctors_end: usize;
static __dtors_start: usize;
static __dtors_end: usize;
}
let start = &__ctors_start as *const usize as usize;
let end = &__ctors_end as *const usize as usize;
let ctors_range = end - start;
let num_ctors = ctors_range / size_of::<usize>();
for n in 0..num_ctors {
let ctor_ptr = start + (n * size_of::<usize>());
let fn_addr = *(ctor_ptr as *const usize);
let ctor = transmute::<usize, fn()>(fn_addr);
ctor();
}
#[cfg(not(test))]
main();
#[cfg(test)]
crate::main();
let start = &__dtors_start as *const usize as usize;
let end = &__dtors_end as *const usize as usize;
let dtors_range = end - start;
let num_dtors = dtors_range / size_of::<usize>();
for n in 0..num_dtors {
let dtor_ptr = start + (n * size_of::<usize>());
let fn_addr = *(dtor_ptr as *const usize);
let dtor = transmute::<usize, fn()>(fn_addr);
dtor();
}
}
#[cfg(not(feature = "loadable_exe"))]
panic!("`main` should not return")
}
#[cfg(any(
feature = "NA_region",
feature = "EU_region",
feature = "J_region",
test
))]
macro_rules! as_array {
($msg:literal) => {
unsafe { *($msg.as_ptr() as *const _) }
};
}
#[cfg(any(feature = "NA_region", test))]
#[used]
#[no_mangle]
#[doc(hidden)]
#[link_section = ".region"]
pub static _REGION: [u8; 55] = as_array!("Sony Computer Entertainment Inc. for North America area");
#[cfg(feature = "EU_region")]
#[used]
#[no_mangle]
#[doc(hidden)]
#[link_section = ".region"]
pub static _REGION: [u8; 48] = as_array!("Sony Computer Entertainment Inc. for Europe area");
#[cfg(feature = "J_region")]
#[used]
#[no_mangle]
#[doc(hidden)]
#[link_section = ".region"]
pub static _REGION: [u8; 47] = as_array!("Sony Computer Entertainment Inc. for Japan area");