f5bf4afaf1
rust-analyzer now obsoletes rls.
53 lines
2.1 KiB
Diff
53 lines
2.1 KiB
Diff
From a72666ed56ec5f1b6d254c7020cf86143edc6dbd Mon Sep 17 00:00:00 2001
|
|
From: Josh Stone <jistone@redhat.com>
|
|
Date: Tue, 20 Sep 2022 13:03:43 -0700
|
|
Subject: [PATCH] rustc_transmute: fix big-endian discriminants
|
|
|
|
---
|
|
compiler/rustc_transmute/src/layout/tree.rs | 22 +++++++++++++++------
|
|
1 file changed, 16 insertions(+), 6 deletions(-)
|
|
|
|
diff --git a/compiler/rustc_transmute/src/layout/tree.rs b/compiler/rustc_transmute/src/layout/tree.rs
|
|
index 211c813b8001..acd4fa63d782 100644
|
|
--- a/compiler/rustc_transmute/src/layout/tree.rs
|
|
+++ b/compiler/rustc_transmute/src/layout/tree.rs
|
|
@@ -404,7 +404,7 @@ fn from_repr_c_variant(
|
|
.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.
|
|
@@ -444,11 +444,21 @@ fn from_repr_c_variant(
|
|
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())
|
|
}
|
|
}
|
|
|
|
--
|
|
2.37.3
|
|
|