]> git.proxmox.com Git - rustc.git/blame - library/rtstartup/rsbegin.rs
New upstream version 1.50.0+dfsg1
[rustc.git] / library / rtstartup / rsbegin.rs
CommitLineData
92a42be0
SL
1// rsbegin.o and rsend.o are the so called "compiler runtime startup objects".
2// They contain code needed to correctly initialize the compiler runtime.
3//
4// When an executable or dylib image is linked, all user code and libraries are
5// "sandwiched" between these two object files, so code or data from rsbegin.o
6// become first in the respective sections of the image, whereas code and data
abe05a73 7// from rsend.o become the last ones. This effect can be used to place symbols
92a42be0
SL
8// at the beginning or at the end of a section, as well as to insert any required
9// headers or footers.
10//
11// Note that the actual module entry point is located in the C runtime startup
fc512014 12// object (usually called `crtX.o`), which then invokes initialization callbacks
92a42be0
SL
13// of other runtime components (registered via yet another special image section).
14
fc512014
XL
15#![feature(no_core)]
16#![feature(lang_items)]
17#![cfg_attr(bootstrap, feature(optin_builtin_traits))]
18#![cfg_attr(not(bootstrap), feature(auto_traits))]
94b46f34 19#![crate_type = "rlib"]
9e0c209e 20#![no_core]
92a42be0
SL
21#![allow(non_camel_case_types)]
22
9e0c209e
SL
23#[lang = "sized"]
24trait Sized {}
25#[lang = "sync"]
2c00a5a8 26auto trait Sync {}
9e0c209e
SL
27#[lang = "copy"]
28trait Copy {}
7cac9316 29#[lang = "freeze"]
2c00a5a8 30auto trait Freeze {}
9e0c209e 31
ea8adc8c 32#[lang = "drop_in_place"]
7cac9316
XL
33#[inline]
34#[allow(unconditional_recursion)]
35pub unsafe fn drop_in_place<T: ?Sized>(to_drop: *mut T) {
36 drop_in_place(to_drop);
37}
38
94b46f34 39#[cfg(all(target_os = "windows", target_arch = "x86", target_env = "gnu"))]
3157f602 40pub mod eh_frames {
92a42be0
SL
41 #[no_mangle]
42 #[link_section = ".eh_frame"]
43 // Marks beginning of the stack frame unwind info section
44 pub static __EH_FRAME_BEGIN__: [u8; 0] = [];
45
46 // Scratch space for unwinder's internal book-keeping.
47 // This is defined as `struct object` in $GCC/libgcc/unwind-dw2-fde.h.
c30ab7b3 48 static mut OBJ: [isize; 6] = [0; 6];
92a42be0 49
94b46f34
XL
50 macro_rules! impl_copy {
51 ($($t:ty)*) => {
52 $(
53 impl ::Copy for $t {}
54 )*
55 }
56 }
57
58 impl_copy! {
59 usize u8 u16 u32 u64 u128
60 isize i8 i16 i32 i64 i128
61 f32 f64
62 bool char
63 }
64
92a42be0 65 // Unwind info registration/deregistration routines.
ba9703b0 66 // See the docs of libpanic_unwind.
3157f602 67 extern "C" {
92a42be0
SL
68 fn rust_eh_register_frames(eh_frame_begin: *const u8, object: *mut u8);
69 fn rust_eh_unregister_frames(eh_frame_begin: *const u8, object: *mut u8);
70 }
71
ba9703b0 72 unsafe extern "C" fn init() {
92a42be0 73 // register unwind info on module startup
dfeec247 74 rust_eh_register_frames(&__EH_FRAME_BEGIN__ as *const u8, &mut OBJ as *mut _ as *mut u8);
92a42be0
SL
75 }
76
ba9703b0 77 unsafe extern "C" fn uninit() {
92a42be0 78 // unregister on shutdown
dfeec247 79 rust_eh_unregister_frames(&__EH_FRAME_BEGIN__ as *const u8, &mut OBJ as *mut _ as *mut u8);
92a42be0
SL
80 }
81
ba9703b0
XL
82 // MinGW-specific init/uninit routine registration
83 pub mod mingw_init {
84 // MinGW's startup objects (crt0.o / dllcrt0.o) will invoke global constructors in the
85 // .ctors and .dtors sections on startup and exit. In the case of DLLs, this is done when
86 // the DLL is loaded and unloaded.
87 //
88 // The linker will sort the sections, which ensures that our callbacks are located at the
89 // end of the list. Since constructors are run in reverse order, this ensures that our
90 // callbacks are the first and last ones executed.
92a42be0 91
ba9703b0
XL
92 #[link_section = ".ctors.65535"] // .ctors.* : C initialization callbacks
93 pub static P_INIT: unsafe extern "C" fn() = super::init;
92a42be0 94
ba9703b0
XL
95 #[link_section = ".dtors.65535"] // .dtors.* : C termination callbacks
96 pub static P_UNINIT: unsafe extern "C" fn() = super::uninit;
92a42be0
SL
97 }
98}