aboutsummaryrefslogtreecommitdiffstats
path: root/erts
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2011-02-26 11:11:27 +0100
committerBjörn Gustavsson <[email protected]>2011-08-16 08:58:49 +0200
commit0befcf588ae4fe9ea686ea81727114a8dc5c0cac (patch)
tree42776c505002c3753307349afb8486e5be98c741 /erts
parent29d734adaec35052ce153b05621babf9333bc651 (diff)
downloadotp-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')
-rw-r--r--erts/emulator/beam/beam_emu.c1
-rw-r--r--erts/emulator/beam/beam_load.c4
-rw-r--r--erts/emulator/beam/ops.tab19
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