flux_rustc_bridge/
const_eval.rs

1use rustc_middle::ty::{self as rustc_ty, ParamEnv, TyCtxt, TypingEnv, TypingMode};
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) -> Option<u128> {
9    let typing_env =
10        TypingEnv { param_env: ParamEnv::empty(), typing_mode: TypingMode::non_body_analysis() };
11    let size = tcx.layout_of(typing_env.as_query_input(ty)).unwrap().size;
12    scalar.try_to_bits(size).ok()
13}
14
15pub fn scalar_to_int(tcx: TyCtxt, scalar: rustc_ty::ScalarInt, int_ty: IntTy) -> i128 {
16    scalar.to_int(size_of_int_ty(tcx, int_ty))
17}
18
19pub fn scalar_to_uint(tcx: TyCtxt<'_>, scalar: rustc_ty::ScalarInt, uint_ty: UintTy) -> u128 {
20    scalar.to_uint(size_of_uint_ty(tcx, uint_ty))
21}
22
23fn size_of_int_ty(tcx: TyCtxt, int_ty: IntTy) -> rustc_abi::Size {
24    match int_ty {
25        IntTy::I8 => rustc_abi::Size::from_bits(8),
26        IntTy::I16 => rustc_abi::Size::from_bits(16),
27        IntTy::I32 => rustc_abi::Size::from_bits(32),
28        IntTy::I64 => rustc_abi::Size::from_bits(64),
29        IntTy::I128 => rustc_abi::Size::from_bits(128),
30        IntTy::Isize => tcx.data_layout.pointer_size,
31    }
32}
33
34fn size_of_uint_ty(tcx: TyCtxt, uint_ty: UintTy) -> rustc_abi::Size {
35    match uint_ty {
36        UintTy::U8 => rustc_abi::Size::from_bits(8),
37        UintTy::U16 => rustc_abi::Size::from_bits(16),
38        UintTy::U32 => rustc_abi::Size::from_bits(32),
39        UintTy::U64 => rustc_abi::Size::from_bits(64),
40        UintTy::U128 => rustc_abi::Size::from_bits(128),
41        UintTy::Usize => tcx.data_layout.pointer_size,
42    }
43}