1 |
From 2946828fcb8e2e68a16839dfcf4319bf119f8acd Mon Sep 17 00:00:00 2001 |
2 |
From: Josh Stone <jistone@redhat.com> |
3 |
Date: Tue, 20 Sep 2022 13:03:43 -0700 |
4 |
Subject: [PATCH] rustc_transmute: fix big-endian discriminants |
5 |
|
6 |
(cherry picked from commit a72666ed56ec5f1b6d254c7020cf86143edc6dbd) |
7 |
--- |
8 |
compiler/rustc_transmute/src/layout/tree.rs | 22 +++++++++++++++------ |
9 |
1 file changed, 16 insertions(+), 6 deletions(-) |
10 |
|
11 |
diff --git a/compiler/rustc_transmute/src/layout/tree.rs b/compiler/rustc_transmute/src/layout/tree.rs |
12 |
index 70b3ba02b05b..e4fcde35ed37 100644 |
13 |
--- a/compiler/rustc_transmute/src/layout/tree.rs |
14 |
+++ b/compiler/rustc_transmute/src/layout/tree.rs |
15 |
@@ -402,7 +402,7 @@ fn from_repr_c_variant( |
16 |
.unwrap(); |
17 |
tracing::trace!(?discr_layout, "computed discriminant layout"); |
18 |
variant_layout = variant_layout.extend(discr_layout).unwrap().0; |
19 |
- tree = tree.then(Self::from_disr(discr, tcx, layout_summary.discriminant_size)); |
20 |
+ tree = tree.then(Self::from_discr(discr, tcx, layout_summary.discriminant_size)); |
21 |
} |
22 |
|
23 |
// Next come fields. |
24 |
@@ -442,11 +442,21 @@ fn from_repr_c_variant( |
25 |
Ok(tree) |
26 |
} |
27 |
|
28 |
- pub fn from_disr(discr: Discr<'tcx>, tcx: TyCtxt<'tcx>, size: usize) -> Self { |
29 |
- // FIXME(@jswrenn): I'm certain this is missing needed endian nuance. |
30 |
- let bytes = discr.val.to_ne_bytes(); |
31 |
- let bytes = &bytes[..size]; |
32 |
- Self::Seq(bytes.into_iter().copied().map(|b| Self::from_bits(b)).collect()) |
33 |
+ pub fn from_discr(discr: Discr<'tcx>, tcx: TyCtxt<'tcx>, size: usize) -> Self { |
34 |
+ use rustc_target::abi::Endian; |
35 |
+ |
36 |
+ let bytes: [u8; 16]; |
37 |
+ let bytes = match tcx.data_layout.endian { |
38 |
+ Endian::Little => { |
39 |
+ bytes = discr.val.to_le_bytes(); |
40 |
+ &bytes[..size] |
41 |
+ } |
42 |
+ Endian::Big => { |
43 |
+ bytes = discr.val.to_be_bytes(); |
44 |
+ &bytes[bytes.len() - size..] |
45 |
+ } |
46 |
+ }; |
47 |
+ Self::Seq(bytes.iter().map(|&b| Self::from_bits(b)).collect()) |
48 |
} |
49 |
} |
50 |
|
51 |
-- |
52 |
2.37.3 |
53 |
|