flux_rustc_bridge/
const_eval.rs1use rustc_middle::ty::{self as rustc_ty, TyCtxt, TypingEnv};
2use rustc_type_ir::{IntTy, UintTy};
3
4pub fn scalar_to_bits<'tcx>(
5 tcx: TyCtxt<'tcx>,
6 scalar: rustc_ty::ScalarInt,
7 ty: rustc_middle::ty::Ty<'tcx>,
8) -> u128 {
9 let typing_env = TypingEnv::fully_monomorphized();
10 let size = tcx.layout_of(typing_env.as_query_input(ty)).unwrap().size;
11 scalar.to_bits(size)
12}
13
14pub fn scalar_to_int(tcx: TyCtxt, scalar: rustc_ty::ScalarInt, int_ty: IntTy) -> i128 {
15 scalar.to_int(size_of_int_ty(tcx, int_ty))
16}
17
18pub fn scalar_to_uint(tcx: TyCtxt<'_>, scalar: rustc_ty::ScalarInt, uint_ty: UintTy) -> u128 {
19 scalar.to_uint(size_of_uint_ty(tcx, uint_ty))
20}
21
22fn size_of_int_ty(tcx: TyCtxt, int_ty: IntTy) -> rustc_abi::Size {
23 match int_ty {
24 IntTy::I8 => rustc_abi::Size::from_bits(8),
25 IntTy::I16 => rustc_abi::Size::from_bits(16),
26 IntTy::I32 => rustc_abi::Size::from_bits(32),
27 IntTy::I64 => rustc_abi::Size::from_bits(64),
28 IntTy::I128 => rustc_abi::Size::from_bits(128),
29 IntTy::Isize => tcx.data_layout.pointer_size(),
30 }
31}
32
33fn size_of_uint_ty(tcx: TyCtxt, uint_ty: UintTy) -> rustc_abi::Size {
34 match uint_ty {
35 UintTy::U8 => rustc_abi::Size::from_bits(8),
36 UintTy::U16 => rustc_abi::Size::from_bits(16),
37 UintTy::U32 => rustc_abi::Size::from_bits(32),
38 UintTy::U64 => rustc_abi::Size::from_bits(64),
39 UintTy::U128 => rustc_abi::Size::from_bits(128),
40 UintTy::Usize => tcx.data_layout.pointer_size(),
41 }
42}