Sync from rust fb898629a2
This commit is contained in:
commit
8bc15fb2da
@ -1,4 +1,13 @@
|
|||||||
#![feature(no_core, lang_items, never_type, linkage, extern_types, thread_local, repr_simd)]
|
#![feature(
|
||||||
|
no_core,
|
||||||
|
lang_items,
|
||||||
|
never_type,
|
||||||
|
linkage,
|
||||||
|
extern_types,
|
||||||
|
thread_local,
|
||||||
|
repr_simd,
|
||||||
|
raw_ref_op
|
||||||
|
)]
|
||||||
#![no_core]
|
#![no_core]
|
||||||
#![allow(dead_code, non_camel_case_types, internal_features)]
|
#![allow(dead_code, non_camel_case_types, internal_features)]
|
||||||
|
|
||||||
@ -112,9 +121,7 @@ fn start<T: Termination + 'static>(
|
|||||||
|
|
||||||
static mut NUM: u8 = 6 * 7;
|
static mut NUM: u8 = 6 * 7;
|
||||||
|
|
||||||
// FIXME: Use `SyncUnsafeCell` instead of allowing `static_mut_refs` lint
|
static NUM_REF: &'static u8 = unsafe { &*&raw const NUM };
|
||||||
#[allow(static_mut_refs)]
|
|
||||||
static NUM_REF: &'static u8 = unsafe { &NUM };
|
|
||||||
|
|
||||||
unsafe fn zeroed<T>() -> T {
|
unsafe fn zeroed<T>() -> T {
|
||||||
let mut uninit = MaybeUninit { uninit: () };
|
let mut uninit = MaybeUninit { uninit: () };
|
||||||
|
13
src/base.rs
13
src/base.rs
@ -815,6 +815,19 @@ fn is_fat_ptr<'tcx>(fx: &FunctionCx<'_, '_, 'tcx>, ty: Ty<'tcx>) -> bool {
|
|||||||
);
|
);
|
||||||
lval.write_cvalue(fx, val);
|
lval.write_cvalue(fx, val);
|
||||||
}
|
}
|
||||||
|
Rvalue::Aggregate(ref kind, ref operands)
|
||||||
|
if matches!(**kind, AggregateKind::RawPtr(..)) =>
|
||||||
|
{
|
||||||
|
let ty = to_place_and_rval.1.ty(&fx.mir.local_decls, fx.tcx);
|
||||||
|
let layout = fx.layout_of(fx.monomorphize(ty));
|
||||||
|
let [data, meta] = &*operands.raw else {
|
||||||
|
bug!("RawPtr fields: {operands:?}");
|
||||||
|
};
|
||||||
|
let data = codegen_operand(fx, data);
|
||||||
|
let meta = codegen_operand(fx, meta);
|
||||||
|
let ptr_val = CValue::pointer_from_data_and_meta(data, meta, layout);
|
||||||
|
lval.write_cvalue(fx, ptr_val);
|
||||||
|
}
|
||||||
Rvalue::Aggregate(ref kind, ref operands) => {
|
Rvalue::Aggregate(ref kind, ref operands) => {
|
||||||
let (variant_index, variant_dest, active_field_index) = match **kind {
|
let (variant_index, variant_dest, active_field_index) = match **kind {
|
||||||
mir::AggregateKind::Adt(_, variant_index, _, _, active_field_index) => {
|
mir::AggregateKind::Adt(_, variant_index, _, _, active_field_index) => {
|
||||||
|
@ -95,6 +95,23 @@ pub(crate) fn by_val_pair(
|
|||||||
CValue(CValueInner::ByValPair(value, extra), layout)
|
CValue(CValueInner::ByValPair(value, extra), layout)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// For `AggregateKind::RawPtr`, create a pointer from its parts.
|
||||||
|
///
|
||||||
|
/// Panics if the `layout` is not a raw pointer.
|
||||||
|
pub(crate) fn pointer_from_data_and_meta(
|
||||||
|
data: CValue<'tcx>,
|
||||||
|
meta: CValue<'tcx>,
|
||||||
|
layout: TyAndLayout<'tcx>,
|
||||||
|
) -> CValue<'tcx> {
|
||||||
|
assert!(layout.ty.is_unsafe_ptr());
|
||||||
|
let inner = match (data.0, meta.0) {
|
||||||
|
(CValueInner::ByVal(p), CValueInner::ByVal(m)) => CValueInner::ByValPair(p, m),
|
||||||
|
(p @ CValueInner::ByVal(_), CValueInner::ByRef(..)) if meta.1.is_zst() => p,
|
||||||
|
_ => bug!("RawPtr operands {data:?} {meta:?}"),
|
||||||
|
};
|
||||||
|
CValue(inner, layout)
|
||||||
|
}
|
||||||
|
|
||||||
pub(crate) fn layout(&self) -> TyAndLayout<'tcx> {
|
pub(crate) fn layout(&self) -> TyAndLayout<'tcx> {
|
||||||
self.1
|
self.1
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user