customasm/asm/resolver/
label.rs

1use 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            // On the final iteration, unstable guesses become errors
34            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}