Rollup merge of #122405 - celinval:smir-new-const, r=oli-obk
Add methods to create StableMIR constant I've been experimenting with transforming the StableMIR to instrument the code with potential UB checks. The modified body will only be used by our analysis tool, however, constants in StableMIR must be backed by rustc constants. Thus, I'm adding a few functions to build constants, such as building string and other primitives. One question I have is whether we should create a global allocation instead for strings. r? ``````@oli-obk``````
This commit is contained in:
commit
bd53d1eee3
4 changed files with 237 additions and 12 deletions
|
@ -14,7 +14,7 @@ use crate::ty::{
|
|||
AdtDef, AdtKind, Allocation, ClosureDef, ClosureKind, Const, FieldDef, FnDef, ForeignDef,
|
||||
ForeignItemKind, ForeignModule, ForeignModuleDef, GenericArgs, GenericPredicates, Generics,
|
||||
ImplDef, ImplTrait, LineInfo, PolyFnSig, RigidTy, Span, TraitDecl, TraitDef, Ty, TyKind,
|
||||
VariantDef,
|
||||
UintTy, VariantDef,
|
||||
};
|
||||
use crate::{
|
||||
mir, Crate, CrateItem, CrateItems, CrateNum, DefId, Error, Filename, ImplTraitDecls, ItemKind,
|
||||
|
@ -101,8 +101,17 @@ pub trait Context {
|
|||
/// Evaluate constant as a target usize.
|
||||
fn eval_target_usize(&self, cnst: &Const) -> Result<u64, Error>;
|
||||
|
||||
/// Create a target usize constant for the given value.
|
||||
fn usize_to_const(&self, val: u64) -> Result<Const, Error>;
|
||||
/// Create a new zero-sized constant.
|
||||
fn try_new_const_zst(&self, ty: Ty) -> Result<Const, Error>;
|
||||
|
||||
/// Create a new constant that represents the given string value.
|
||||
fn new_const_str(&self, value: &str) -> Const;
|
||||
|
||||
/// Create a new constant that represents the given boolean value.
|
||||
fn new_const_bool(&self, value: bool) -> Const;
|
||||
|
||||
/// Create a new constant that represents the given value.
|
||||
fn try_new_const_uint(&self, value: u128, uint_ty: UintTy) -> Result<Const, Error>;
|
||||
|
||||
/// Create a new type from the given kind.
|
||||
fn new_rigid_ty(&self, kind: RigidTy) -> Ty;
|
||||
|
@ -200,7 +209,7 @@ pub trait Context {
|
|||
|
||||
// A thread local variable that stores a pointer to the tables mapping between TyCtxt
|
||||
// datastructures and stable MIR datastructures
|
||||
scoped_thread_local! (static TLV: Cell<*const ()>);
|
||||
scoped_thread_local!(static TLV: Cell<*const ()>);
|
||||
|
||||
pub fn run<F, T>(context: &dyn Context, f: F) -> Result<T, Error>
|
||||
where
|
||||
|
|
|
@ -128,13 +128,38 @@ impl Const {
|
|||
|
||||
/// Creates an interned usize constant.
|
||||
fn try_from_target_usize(val: u64) -> Result<Self, Error> {
|
||||
with(|cx| cx.usize_to_const(val))
|
||||
with(|cx| cx.try_new_const_uint(val.into(), UintTy::Usize))
|
||||
}
|
||||
|
||||
/// Try to evaluate to a target `usize`.
|
||||
pub fn eval_target_usize(&self) -> Result<u64, Error> {
|
||||
with(|cx| cx.eval_target_usize(self))
|
||||
}
|
||||
|
||||
/// Create a constant that represents a new zero-sized constant of type T.
|
||||
/// Fails if the type is not a ZST or if it doesn't have a known size.
|
||||
pub fn try_new_zero_sized(ty: Ty) -> Result<Const, Error> {
|
||||
with(|cx| cx.try_new_const_zst(ty))
|
||||
}
|
||||
|
||||
/// Build a new constant that represents the given string.
|
||||
///
|
||||
/// Note that there is no guarantee today about duplication of the same constant.
|
||||
/// I.e.: Calling this function multiple times with the same argument may or may not return
|
||||
/// the same allocation.
|
||||
pub fn from_str(value: &str) -> Const {
|
||||
with(|cx| cx.new_const_str(value))
|
||||
}
|
||||
|
||||
/// Build a new constant that represents the given boolean value.
|
||||
pub fn from_bool(value: bool) -> Const {
|
||||
with(|cx| cx.new_const_bool(value))
|
||||
}
|
||||
|
||||
/// Build a new constant that represents the given unsigned integer.
|
||||
pub fn try_from_uint(value: u128, uint_ty: UintTy) -> Result<Const, Error> {
|
||||
with(|cx| cx.try_new_const_uint(value, uint_ty))
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue