library: vary unsafety in bootstrapping for SEH

This commit is contained in:
Jubilee Young 2024-05-31 18:28:03 -07:00
parent 3fdd8d5ef3
commit bf454afcaa

View File

@ -157,7 +157,10 @@ pub fn new(ptr: *mut u8) -> Self {
// going to be cross-lang LTOed anyway. However, using expose is shorter and // going to be cross-lang LTOed anyway. However, using expose is shorter and
// requires less unsafe. // requires less unsafe.
let addr: usize = ptr.expose_provenance(); let addr: usize = ptr.expose_provenance();
#[cfg(bootstrap)]
let image_base = unsafe { addr_of!(__ImageBase) }.addr(); let image_base = unsafe { addr_of!(__ImageBase) }.addr();
#[cfg(not(bootstrap))]
let image_base = addr_of!(__ImageBase).addr();
let offset: usize = addr - image_base; let offset: usize = addr - image_base;
Self(offset as u32) Self(offset as u32)
} }
@ -250,7 +253,10 @@ pub struct _TypeDescriptor {
// This is fine since the MSVC runtime uses string comparison on the type name // This is fine since the MSVC runtime uses string comparison on the type name
// to match TypeDescriptors rather than pointer equality. // to match TypeDescriptors rather than pointer equality.
static mut TYPE_DESCRIPTOR: _TypeDescriptor = _TypeDescriptor { static mut TYPE_DESCRIPTOR: _TypeDescriptor = _TypeDescriptor {
#[cfg(bootstrap)]
pVFTable: unsafe { addr_of!(TYPE_INFO_VTABLE) } as *const _, pVFTable: unsafe { addr_of!(TYPE_INFO_VTABLE) } as *const _,
#[cfg(not(bootstrap))]
pVFTable: addr_of!(TYPE_INFO_VTABLE) as *const _,
spare: core::ptr::null_mut(), spare: core::ptr::null_mut(),
name: TYPE_NAME, name: TYPE_NAME,
}; };