Skip to content

Commit

Permalink
Rollup merge of rust-lang#102076 - cuviper:transmute-discr-endian, r=…
Browse files Browse the repository at this point in the history
…jackh726

rustc_transmute: fix big-endian discriminants

I noticed that some new tests were failing in Fedora on s390x only, which usually means there's a problem with big-endian, and sure enough there's a FIXME(`@jswrenn)` for that in `rustc_transmute`. This patch implements the appropriate consideration for target endianness, rather than using native (host) endian.
  • Loading branch information
Dylan-DPC authored Sep 22, 2022
2 parents 2d7dd56 + a72666e commit 81c0f61
Showing 1 changed file with 16 additions and 6 deletions.
22 changes: 16 additions & 6 deletions compiler/rustc_transmute/src/layout/tree.rs
Original file line number Diff line number Diff line change
Expand Up @@ -404,7 +404,7 @@ pub(crate) mod rustc {
.unwrap();
trace!(?discr_layout, "computed discriminant layout");
variant_layout = variant_layout.extend(discr_layout).unwrap().0;
tree = tree.then(Self::from_disr(discr, tcx, layout_summary.discriminant_size));
tree = tree.then(Self::from_discr(discr, tcx, layout_summary.discriminant_size));
}

// Next come fields.
Expand Down Expand Up @@ -444,11 +444,21 @@ pub(crate) mod rustc {
Ok(tree)
}

pub fn from_disr(discr: Discr<'tcx>, tcx: TyCtxt<'tcx>, size: usize) -> Self {
// FIXME(@jswrenn): I'm certain this is missing needed endian nuance.
let bytes = discr.val.to_ne_bytes();
let bytes = &bytes[..size];
Self::Seq(bytes.into_iter().copied().map(|b| Self::from_bits(b)).collect())
pub fn from_discr(discr: Discr<'tcx>, tcx: TyCtxt<'tcx>, size: usize) -> Self {
use rustc_target::abi::Endian;

let bytes: [u8; 16];
let bytes = match tcx.data_layout.endian {
Endian::Little => {
bytes = discr.val.to_le_bytes();
&bytes[..size]
}
Endian::Big => {
bytes = discr.val.to_be_bytes();
&bytes[bytes.len() - size..]
}
};
Self::Seq(bytes.iter().map(|&b| Self::from_bits(b)).collect())
}
}

Expand Down

0 comments on commit 81c0f61

Please sign in to comment.