Support debuginfo for custom MIR.
This commit is contained in:
parent
1accf068d8
commit
6cec91d647
9 changed files with 203 additions and 13 deletions
|
@ -1,5 +1,6 @@
|
|||
use rustc_index::IndexSlice;
|
||||
use rustc_middle::{mir::*, thir::*, ty::Ty};
|
||||
use rustc_middle::ty::{self, Ty};
|
||||
use rustc_middle::{mir::*, thir::*};
|
||||
use rustc_span::Span;
|
||||
|
||||
use super::{PResult, ParseCtxt, ParseError};
|
||||
|
@ -159,6 +160,14 @@ impl<'tcx, 'body> ParseCtxt<'tcx, 'body> {
|
|||
);
|
||||
self.parse_local_decls(local_decls.iter().copied())?;
|
||||
|
||||
let (debuginfo, rest) = parse_by_kind!(self, rest, _, "body with debuginfo",
|
||||
ExprKind::Block { block } => {
|
||||
let block = &self.thir[*block];
|
||||
(&block.stmts, block.expr.unwrap())
|
||||
},
|
||||
);
|
||||
self.parse_debuginfo(debuginfo.iter().copied())?;
|
||||
|
||||
let block_defs = parse_by_kind!(self, rest, _, "body with block defs",
|
||||
ExprKind::Block { block } => &self.thir[*block].stmts,
|
||||
);
|
||||
|
@ -195,6 +204,52 @@ impl<'tcx, 'body> ParseCtxt<'tcx, 'body> {
|
|||
Ok(())
|
||||
}
|
||||
|
||||
fn parse_debuginfo(&mut self, stmts: impl Iterator<Item = StmtId>) -> PResult<()> {
|
||||
for stmt in stmts {
|
||||
let stmt = &self.thir[stmt];
|
||||
let expr = match stmt.kind {
|
||||
StmtKind::Let { span, .. } => {
|
||||
return Err(ParseError {
|
||||
span,
|
||||
item_description: format!("{:?}", stmt),
|
||||
expected: "debuginfo".to_string(),
|
||||
});
|
||||
}
|
||||
StmtKind::Expr { expr, .. } => expr,
|
||||
};
|
||||
let span = self.thir[expr].span;
|
||||
let (name, operand) = parse_by_kind!(self, expr, _, "debuginfo",
|
||||
@call("mir_debuginfo", args) => {
|
||||
(args[0], args[1])
|
||||
},
|
||||
);
|
||||
let name = parse_by_kind!(self, name, _, "debuginfo",
|
||||
ExprKind::Literal { lit, neg: false } => lit,
|
||||
);
|
||||
let Some(name) = name.node.str() else {
|
||||
return Err(ParseError {
|
||||
span,
|
||||
item_description: format!("{:?}", name),
|
||||
expected: "string".to_string(),
|
||||
});
|
||||
};
|
||||
let operand = self.parse_operand(operand)?;
|
||||
let value = match operand {
|
||||
Operand::Constant(c) => VarDebugInfoContents::Const(*c),
|
||||
Operand::Copy(p) | Operand::Move(p) => VarDebugInfoContents::Place(p),
|
||||
};
|
||||
let dbginfo = VarDebugInfo {
|
||||
name,
|
||||
source_info: SourceInfo { span, scope: self.source_scope },
|
||||
argument_index: None,
|
||||
value,
|
||||
};
|
||||
self.body.var_debug_info.push(dbginfo);
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn parse_let_statement(&mut self, stmt_id: StmtId) -> PResult<(LocalVarId, Ty<'tcx>, Span)> {
|
||||
let pattern = match &self.thir[stmt_id].kind {
|
||||
StmtKind::Let { pattern, .. } => pattern,
|
||||
|
|
|
@ -204,7 +204,7 @@ impl<'tcx, 'body> ParseCtxt<'tcx, 'body> {
|
|||
)
|
||||
}
|
||||
|
||||
fn parse_operand(&self, expr_id: ExprId) -> PResult<Operand<'tcx>> {
|
||||
pub fn parse_operand(&self, expr_id: ExprId) -> PResult<Operand<'tcx>> {
|
||||
parse_by_kind!(self, expr_id, expr, "operand",
|
||||
@call("mir_move", args) => self.parse_place(args[0]).map(Operand::Move),
|
||||
@call("mir_static", args) => self.parse_static(args[0]),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue