use midenc_hir::{
Builder, BuilderExt, Report, SourceSpan, ValueRef,
dialects::debuginfo::attributes::{Expression, Variable},
};
use super::ops::*;
pub trait DIBuilder<'f, B: ?Sized + Builder> {
fn debug_value(
&mut self,
value: ValueRef,
variable: Variable,
span: SourceSpan,
) -> Result<DebugValueRef, Report> {
self.debug_value_with_expr(value, variable, None, span)
}
fn debug_value_with_expr(
&mut self,
value: ValueRef,
variable: Variable,
expression: Option<Expression>,
span: SourceSpan,
) -> Result<DebugValueRef, Report> {
let expr = expression.unwrap_or_default();
let op_builder = self.builder_mut().create::<DebugValue, (_, _, _)>(span);
op_builder(value, variable, expr)
}
fn debug_declare(
&mut self,
variable: Variable,
expression: Expression,
span: SourceSpan,
) -> Result<DebugDeclareRef, Report> {
let op_builder = self.builder_mut().create::<DebugDeclare, (_, _)>(span);
op_builder(variable, expression)
}
fn debug_kill(&mut self, variable: Variable, span: SourceSpan) -> Result<DebugKillRef, Report> {
let op_builder = self.builder_mut().create::<DebugKill, (_,)>(span);
op_builder(variable)
}
fn builder(&self) -> &B;
fn builder_mut(&mut self) -> &mut B;
}
impl<B: ?Sized + Builder> DIBuilder<'_, B> for B {
#[inline(always)]
fn builder(&self) -> &B {
self
}
#[inline(always)]
fn builder_mut(&mut self) -> &mut B {
self
}
}