#![doc = include_str!("../README.md")]
#![deny(missing_docs)]
#![feature(asm_const)]
#![feature(naked_functions)]
#![feature(link_llvm_intrinsics)]
#![feature(strict_provenance)]
#![deny(fuzzy_provenance_casts)]
#![deny(lossy_provenance_casts)]
#![no_std]
#[cfg(not(feature = "rustc-dep-of-std"))]
extern crate alloc;
pub mod sync;
mod program;
#[cfg(target_vendor = "mustang")]
mod signal;
#[cfg(feature = "threads")]
#[cfg_attr(not(target_vendor = "mustang"), path = "threads_via_pthreads.rs")]
mod threads;
#[cfg(feature = "threads")]
#[cfg(target_vendor = "mustang")]
#[cfg_attr(target_arch = "aarch64", path = "arch-aarch64.rs")]
#[cfg_attr(target_arch = "x86_64", path = "arch-x86_64.rs")]
#[cfg_attr(target_arch = "x86", path = "arch-x86.rs")]
#[cfg_attr(target_arch = "riscv64", path = "arch-riscv64.rs")]
#[cfg_attr(target_arch = "arm", path = "arch-arm.rs")]
mod arch;
pub use program::{at_exit, exit, exit_immediately};
#[cfg(target_vendor = "mustang")]
pub use signal::{sigaction, Sigaction};
#[cfg(feature = "threads")]
#[cfg(feature = "set_thread_id")]
pub use threads::set_current_thread_id_after_a_fork;
#[cfg(feature = "threads")]
pub use threads::{
at_thread_exit, create_thread, current_thread, current_thread_id, current_thread_tls_addr,
default_guard_size, default_stack_size, detach_thread, join_thread, thread_stack, Thread,
};
#[cfg(target_vendor = "mustang")]
#[naked]
#[no_mangle]
unsafe extern "C" fn _start() -> ! {
use core::arch::asm;
use program::entry;
#[cfg(target_arch = "x86_64")]
asm!(
"mov rdi, rsp", "push rbp", "jmp {entry}", entry = sym entry,
options(noreturn),
);
#[cfg(target_arch = "aarch64")]
asm!(
"mov x0, sp", "mov x30, xzr", "b {entry}", entry = sym entry,
options(noreturn),
);
#[cfg(target_arch = "arm")]
asm!(
"mov r0, sp\n", "mov lr, #0", "b {entry}", entry = sym entry,
options(noreturn),
);
#[cfg(target_arch = "riscv64")]
asm!(
"mv a0, sp", "mv ra, zero", "mv fp, zero", "tail {entry}", entry = sym entry,
options(noreturn),
);
#[cfg(target_arch = "x86")]
asm!(
"mov eax, esp", "push ebp", "push ebp", "push ebp", "push eax", "push ebp", "jmp {entry}", entry = sym entry,
options(noreturn),
);
}
#[cfg(target_vendor = "mustang")]
#[no_mangle]
static __dso_handle: UnsafeSendSyncVoidStar =
UnsafeSendSyncVoidStar(&__dso_handle as *const _ as *const _);
#[cfg(target_vendor = "mustang")]
#[repr(transparent)]
struct UnsafeSendSyncVoidStar(*const core::ffi::c_void);
#[cfg(target_vendor = "mustang")]
unsafe impl Send for UnsafeSendSyncVoidStar {}
#[cfg(target_vendor = "mustang")]
unsafe impl Sync for UnsafeSendSyncVoidStar {}
#[cfg(target_vendor = "mustang")]
#[cfg(feature = "env_logger")]
#[link_section = ".init_array.00099"]
#[used]
static INIT_ARRAY: unsafe extern "C" fn() = {
unsafe extern "C" fn function() {
env_logger::init();
#[cfg(feature = "log")]
log::trace!(target: "origin::program", "Program started");
#[cfg(all(feature = "log", feature = "threads"))]
log::trace!(target: "origin::threads", "Main Thread[{:?}] initialized", current_thread_id());
}
function
};
pub use lock_api;