as: tunit: change exprs to be symbol+offset

This commit is contained in:
Mikael Pettersson 2020-01-11 18:11:17 +01:00
parent e1fda8a177
commit 1f89281c1e
4 changed files with 13 additions and 17 deletions

View File

@ -162,10 +162,10 @@ exprs_values([Expr | Exprs], Tunit, Acc) ->
expr_value(Expr, Tunit) ->
case Expr of
#e_integer{value = Value} -> {ok, Value};
#e_symbol{name = Name} ->
#expr{symbol = false, offset = Value} -> {ok, Value};
#expr{symbol = Name, offset = Offset} ->
case tunit:get_symbol(Tunit, Name) of
#symbol{st_value = Value} when Value =/= false -> {ok, Value};
#symbol{st_value = Value} when Value =/= false -> {ok, Value + Offset};
_ -> {error, {?MODULE, {undefined_symbol, Name}}}
end
end.

View File

@ -625,7 +625,7 @@ insn_fixup(Tunit, Insn) ->
expr_fixup(Tunit, Expr) ->
case Expr of
#e_local_label{number = Number, direction = Direction} ->
#expr{symbol = {Number, Direction}} ->
LabelSerial = local_label_serial(Tunit, Number),
ReferenceSerial =
case Direction of
@ -633,7 +633,7 @@ expr_fixup(Tunit, Expr) ->
$f -> LabelSerial + 1
end,
Name = local_label_name(Number, ReferenceSerial),
#e_symbol{name = Name};
Expr#expr{symbol = Name};
_ -> Expr
end.

View File

@ -656,10 +656,9 @@ do_expr(First) ->
badtok("invalid start of expr", First)
end.
mk_integer_expr(Value) -> #e_integer{value = Value}.
mk_local_label_expr(Number, Direction) ->
#e_local_label{number = Number, direction = Direction}.
mk_symbol_expr(Symbol) -> #e_symbol{name = Symbol}.
mk_integer_expr(Value) -> #expr{symbol = false, offset = Value}.
mk_local_label_expr(Number, Direction) -> mk_symbol_expr({Number, Direction}).
mk_symbol_expr(Symbol) -> #expr{symbol = Symbol, offset = 0}.
%% String Lists ----------------------------------------------------------------

View File

@ -23,14 +23,11 @@
%% An expression occurring in a statement. (TODO: extend)
-record(e_integer, {value :: integer()}).
-record(e_local_label, {number :: non_neg_integer(), direction :: $b | $f}).
-record(e_symbol, {name :: string()}).
-type expr() :: #e_integer{}
| #e_local_label{}
| #e_symbol{}
.
-record(expr,
{ symbol :: false | string() | {non_neg_integer(), $b | $f}
, offset :: integer()
}).
-type expr() :: #expr{}.
%% A directive, label, or instruction is parsed to a statement, which is
%% either interpreted immediately or appended to the representation of the