midenc-dialect-ub 0.4.0

Miden IR Undefined Behavior Dialect
Documentation
use midenc_hir::{
    dialects::builtin::FunctionBuilder, Builder, BuilderExt, OpBuilder, SourceSpan, Type,
    UnsafeIntrusiveEntityRef, ValueRef,
};

use crate::*;

pub trait UndefinedBehaviorOpBuilder<'f, B: ?Sized + Builder> {
    fn poison(&mut self, ty: Type, span: SourceSpan) -> ValueRef {
        let op_builder = self.builder_mut().create::<Poison, _>(span);
        let op = op_builder(PoisonAttr::new(ty)).expect("invalid poison attribute");
        op.borrow().result().as_value_ref()
    }

    fn unreachable(&mut self, span: SourceSpan) -> UnsafeIntrusiveEntityRef<Unreachable> {
        let op_builder = self.builder_mut().create::<Unreachable, _>(span);
        op_builder().unwrap()
    }

    fn builder(&self) -> &B;
    fn builder_mut(&mut self) -> &mut B;
}

impl<'f, B: ?Sized + Builder> UndefinedBehaviorOpBuilder<'f, B> for FunctionBuilder<'f, B> {
    #[inline(always)]
    fn builder(&self) -> &B {
        FunctionBuilder::builder(self)
    }

    #[inline(always)]
    fn builder_mut(&mut self) -> &mut B {
        FunctionBuilder::builder_mut(self)
    }
}

impl<'f> UndefinedBehaviorOpBuilder<'f, OpBuilder> for &'f mut OpBuilder {
    #[inline(always)]
    fn builder(&self) -> &OpBuilder {
        self
    }

    #[inline(always)]
    fn builder_mut(&mut self) -> &mut OpBuilder {
        self
    }
}

impl<B: ?Sized + Builder> UndefinedBehaviorOpBuilder<'_, B> for B {
    #[inline(always)]
    fn builder(&self) -> &B {
        self
    }

    #[inline(always)]
    fn builder_mut(&mut self) -> &mut B {
        self
    }
}