flux_rustc_bridge/
const_eval.rs1use 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}