midenc-dialect-ub 0.4.0

Miden IR Undefined Behavior Dialect
Documentation
#![no_std]
#![feature(debug_closure_helpers)]
#![feature(unboxed_closures)]
#![feature(fn_traits)]
#![feature(ptr_metadata)]
#![feature(specialization)]
#![allow(incomplete_features)]
#![deny(warnings)]

extern crate alloc;

#[cfg(any(feature = "std", test))]
extern crate std;

use alloc::boxed::Box;

mod attributes;
mod builders;
mod ops;

use midenc_hir::{
    AttributeValue, Builder, BuilderExt, Dialect, DialectInfo, DialectRegistration, OperationRef,
    SourceSpan, Type,
};

pub use self::{attributes::PoisonAttr, builders::UndefinedBehaviorOpBuilder, ops::*};

#[derive(Debug)]
pub struct UndefinedBehaviorDialect {
    info: DialectInfo,
}

impl UndefinedBehaviorDialect {
    #[inline]
    pub fn num_registered(&self) -> usize {
        self.registered_ops().len()
    }
}

impl Dialect for UndefinedBehaviorDialect {
    #[inline]
    fn info(&self) -> &DialectInfo {
        &self.info
    }

    fn materialize_constant(
        &self,
        builder: &mut dyn Builder,
        attr: Box<dyn AttributeValue>,
        _ty: &Type,
        span: SourceSpan,
    ) -> Option<OperationRef> {
        if let Some(attr) = attr.downcast_ref::<PoisonAttr>() {
            let op_builder = builder.create::<Poison, _>(span);
            return op_builder(attr.clone()).ok().map(|op| op.as_operation_ref());
        }
        None
    }
}

impl DialectRegistration for UndefinedBehaviorDialect {
    const NAMESPACE: &'static str = "ub";

    #[inline]
    fn init(info: DialectInfo) -> Self {
        Self { info }
    }

    fn register_operations(info: &mut DialectInfo) {
        info.register_operation::<ops::Poison>();
        info.register_operation::<ops::Unreachable>();
    }
}