]>
Commit | Line | Data |
---|---|---|
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"] |
24 | trait Sized {} | |
25 | #[lang = "sync"] | |
2c00a5a8 | 26 | auto trait Sync {} |
9e0c209e SL |
27 | #[lang = "copy"] |
28 | trait Copy {} | |
7cac9316 | 29 | #[lang = "freeze"] |
2c00a5a8 | 30 | auto trait Freeze {} |
9e0c209e | 31 | |
ea8adc8c | 32 | #[lang = "drop_in_place"] |
7cac9316 XL |
33 | #[inline] |
34 | #[allow(unconditional_recursion)] | |
35 | pub 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 | 40 | pub 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 | } |