diff options
author | Björn Gustavsson <[email protected]> | 2011-02-26 11:11:27 +0100 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2011-08-16 08:58:49 +0200 |
commit | 0befcf588ae4fe9ea686ea81727114a8dc5c0cac (patch) | |
tree | 42776c505002c3753307349afb8486e5be98c741 /erts/emulator/beam | |
parent | 29d734adaec35052ce153b05621babf9333bc651 (diff) | |
download | otp-0befcf588ae4fe9ea686ea81727114a8dc5c0cac.tar.gz otp-0befcf588ae4fe9ea686ea81727114a8dc5c0cac.tar.bz2 otp-0befcf588ae4fe9ea686ea81727114a8dc5c0cac.zip |
compiler, emulator: Introduce the line/1 instruction
Introduce the line/1 instruction in the compiler and the BEAM
virtual machine. It will not yet be generated by the compiler and
will not actually carry any information.
Diffstat (limited to 'erts/emulator/beam')
-rw-r--r-- | erts/emulator/beam/beam_emu.c | 1 | ||||
-rw-r--r-- | erts/emulator/beam/beam_load.c | 4 | ||||
-rw-r--r-- | erts/emulator/beam/ops.tab | 19 |
3 files changed, 24 insertions, 0 deletions
diff --git a/erts/emulator/beam/beam_emu.c b/erts/emulator/beam/beam_emu.c index 937b3d9e53..ef992487be 100644 --- a/erts/emulator/beam/beam_emu.c +++ b/erts/emulator/beam/beam_emu.c @@ -5270,6 +5270,7 @@ void process_main(void) OpCase(label_L): OpCase(too_old_compiler): OpCase(on_load): + OpCase(line_I): erl_exit(1, "meta op\n"); /* diff --git a/erts/emulator/beam/beam_load.c b/erts/emulator/beam/beam_load.c index eb10ae59a8..3cfba5e827 100644 --- a/erts/emulator/beam/beam_load.c +++ b/erts/emulator/beam/beam_load.c @@ -2104,6 +2104,10 @@ load_code(LoaderState* stp) stp->catches = ci-3; break; + case op_line_I: + ci -= 2; /* Get rid of the instruction */ + break; + /* * End of code found. */ diff --git a/erts/emulator/beam/ops.tab b/erts/emulator/beam/ops.tab index 304ce22ef2..3fb408e821 100644 --- a/erts/emulator/beam/ops.tab +++ b/erts/emulator/beam/ops.tab @@ -94,6 +94,25 @@ i_global_copy return +# +# To ensure that a "move Src x(0)" instruction can be combined +# with the following call instruction, we need to make sure that +# there is no line/1 instruction between the move and the call. +# + +move S r | line Loc | call_ext Ar Func => \ + line Loc | move S r | call_ext Ar Func +move S r | line Loc | call_ext_last Ar Func D => \ + line Loc | move S r | call_ext_last Ar Func D +move S r | line Loc | call_ext_only Ar Func => \ + line Loc | move S r | call_ext_only Ar Func + +move S r | line Loc | call Ar Func => \ + line Loc | move S r | call Ar Func + +line I + + %macro: allocate Allocate -pack %macro: allocate_zero AllocateZero -pack %macro: allocate_heap AllocateHeap -pack |