Skip to main content

flux_rustc_bridge/
const_eval.rs

1use 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}