customasm/asm/resolver/
label.rs1use crate::*;
2
3
4pub fn resolve_label(
5 report: &mut diagn::Report,
6 opts: &asm::AssemblyOptions,
7 ast_symbol: &asm::AstSymbol,
8 _decls: &asm::ItemDecls,
9 defs: &mut asm::ItemDefs,
10 ctx: &asm::ResolverContext)
11 -> Result<asm::ResolutionState, ()>
12{
13 let item_ref = ast_symbol.item_ref.unwrap();
14
15 if let asm::AstSymbolKind::Label = ast_symbol.kind
16 {
17 let value = ctx.eval_address(
18 report,
19 ast_symbol.decl_span,
20 defs,
21 ctx.can_guess())?;
22
23
24 let symbol = defs.symbols.get_mut(item_ref);
25 let prev_value = symbol.value.clone();
26 symbol.value = expr::Value::make_integer(value);
27 symbol.value.get_mut_metadata().symbol_ref = Some(item_ref);
28 symbol.bankdef_ref = Some(ctx.bank_ref);
29
30
31 if symbol.value != prev_value
32 {
33 if ctx.is_last_iteration
35 {
36 report.error_span(
37 "label address did not converge",
38 ast_symbol.decl_span);
39 }
40
41 if opts.debug_iterations
42 {
43 println!("label: {} = {:?}",
44 ast_symbol.name,
45 symbol.value);
46 }
47
48 return Ok(asm::ResolutionState::Unresolved);
49 }
50
51
52 Ok(asm::ResolutionState::Resolved)
53 }
54 else
55 {
56 unreachable!()
57 }
58}