Age | Commit message (Collapse) | Author |
|
If the Core Erlang optimization were turned off (using no_copt),
the optimization passes for Beam assembly could generate unsafe
code that did not initialize all Y registers before (for example)
a call instruction.
To fix this, beam_dead should not attempt to remove stores to Y
registers. That is not safe if there is an exception-generating
instruction inside a try...catch block.
|
|
beam_validator wrongly complained that the following was
not safe because it didn't know that is_bitstring/1 is safe:
food(Curriculum) ->
[try
is_bitstring(functions)
catch _ ->
0
end, Curriculum].
While we are it, also add a new bif_SUITE test suite to cover some
more code in beam_validator.
|
|
The raise/3 instruction is specially handled, thus there is no need
for bif_type/3 to handle raise/3 (also, the number of arguments was
incorrect, so it could never have matched).
|
|
The 'is_bitstr' and 'is_function2' tests are pure. The corresponding BIFs
have different names; thus the default call to erl_internal:new_type_test/2
is not sufficient.
|
|
Y registers are killed by the deallocate/1 instruction, so there is no
need to handle Y register in the return/1 instruction in
check_liveness/3.
There is also no need to keep check_liveness_live_ret/3 since it
is only used in one place.
|
|
In complicated code with many indirect jumps to the func_info label,
a label could get lost.
|
|
A negative allocation could be calculated if a block had multiple
allocations. Make sure to process the block in the right order
so that the correct allocation is processed. Also add an assertion.
This bug was often not noticed because beam_type usually silently
recalculates the allocation amount in test_heap/2 instructions.
|
|
Generate code that not only is safe, but can easily be seen by
beam_validator to be safe.
|
|
Sometimes v3_codegen would generate unsafe code when there was
a call to error/1 in a guard.
|
|
|
|
* bjorn/compiler/misc:
beam_bool_SUITE: Cover one more line
beam_utils_SUITE: Cover more lines in beam_utils
beam_reorder: Don't confuse beam_validator
beam_bool: Reject potentially unsafe optimization
v3_core: Don't depend on sys_core_fold for cleaning up
beam_type: Eliminate crash
beam_type: Correct handling of setelement/3
beam_validator: Handle cons literals better
beam_validator: Keep better track of tuple literals
|
|
* richcarl/eunit/debug-val-depth/PR-1061/OTP-13612:
Replace suggested debugValAll/1 macro with debugVal/2
|
|
|
|
By first adding a call to error/1 to each uncovered line,
QuickCheck could find test cases that would cover the lines.
|
|
Make sure we don't optimize code such as:
is_tuple Fail Src
test_arity Fail Src Arity
get_tuple_element Src Pos Dst
is_map Fail Src
If we would reorder the instructions like this:
is_tuple Fail Src
test_arity Fail Src Arity
is_map Fail Src
get_tuple_element Src Pos Dst
beam_validator would complain that the type for Src is a map
instead of a tuple. Since the code has problems to begin with,
there is no need to do the optimization.
|
|
When calculating the sets of registers that must be killed or
unused, registers set in a {protected,_,_,_} block were not
considered. That could result in a crash in the
assertion in beam_utils:live_opt_block/4.
|
|
a3ec2644f5 attempted to teach v3_core not to generate code with
unbound variables. The approach taken in that commit is to
discard all expressions following a badmatch. That does not
work if the badmatch is nested:
{[V] = [] = foo,V},
V
That would be rewritten to:
{error({badmatch,foo})},
V
where V is unbound.
If we were to follow the same approach, the tuple construction
code would have to look out for a badmatch. As would list construction,
begin...end, and so on.
Therefore, as it is impractical to discard all expressions that
follow a badmatch, the only other solution is to ensure that the
variables that the pattern binds will somehow be bound. That can
be arranged by rewriting the pattern to a pattern that binds the
same variables. Thus:
error({badmatch,foo}),
E = foo,
case E of
{[V],[]} ->
V;
Other ->
error({badmatch,Other}
end
|
|
The following code:
simple() ->
case try 0 after [] end of
0 -> college;
1 -> 0
end.
would crash the compiler like this:
crash reason: {case_clause,
{'EXIT',
{function_clause,
[{beam_type,simplify_select_val_int,
[{select,select_val,
{x,0},
{f,7},
[{integer,1},{f,9},{integer,0},{f,8}]},
0],
[{file,"beam_type.erl"},{line,169}]},
{beam_type,simplify_basic_1,3,
[{file,"beam_type.erl"},{line,155}]},
{beam_type,opt,3,[{file,"beam_type.erl"},{line,57}]},
{beam_type,function,1,[{file,"beam_type.erl"},{line,36}]},
{beam_type,'-module/2-lc$^0/1-0-',1,
[{file,"beam_type.erl"},{line,30}]},
{beam_type,module,2,[{file,"beam_type.erl"},{line,30}]},
{compile,'-select_passes/2-anonymous-2-',2,
[{file,"compile.erl"},{line,521}]},
{compile,'-internal_comp/4-anonymous-1-',2,
[{file,"compile.erl"},{line,306}]}]}}}
The root cause is that the type representation is not well-defined.
Integers could be represented in three different ways:
integer
{integer,{1,10}}
{integer,0}
However, only the first two forms were handled.
To avoid similar problems in the future:
* Make the type representation stricter. Make sure that integers are
only represented as 'integer' or {integer,{Min,Max}}.
* Call verify_type/1 whenever a new type is added (not only when
merging types) to ensure that only the supported types are added
to the type database).
(ERL-150)
|
|
|
|
|
|
* binarin/fix-absolute-paths/PR-1056/OTP-13617:
Fix program paths used in build process
|
|
* kostis/compiler/cerl-arity/PR-1059:
Use arity() consistently
|
|
We must be careful how we treat the type info for the result of:
setelement(Index, Tuple, NewValue)
If Tuple had type information, the result of setelement/3 (in x(0))
would be assigned the same type information. But that is not safe
for:
setelement(1, Tuple, NewValue)
since the type for the first element will be changed.
Therefore, we must take care to remove the type information for
the first element of the tuple if might have been modified by
setelement/3.
|
|
As a preparation for better optimizations in beam_type, a list
literal must be accepted as a 'cons'.
|
|
As a preparation for upcoming better optimizations in beam_type,
we will need to keep better track of tuple literals so that
beam_validator will not falsely reject safe code.
|
|
* dgud/observer/process-display-binary:
observer: sync close to avoid process crash reports
Test cuddling
observer: Align system info boxes
Change binary debug tuple to size and refc info
|
|
* dgud/tools/emacs-xref/PR-1051:
Add xref support in erlang.el
Conflicts:
lib/tools/emacs/erlang.el
|
|
Also make the default depth for debugVal/1 possible to override
by defining the macro EUNIT_DEBUG_VAL_DEPTH.
|
|
In GNU Emacs 25 xref will be introduced. It is a framework for cross
referencing commands, in particular commands for finding definitions.
It does not replace etags. It rather resides on top of it and
provides user-friendly commands. The idea is that the user commands
should be the same regardless of what back-end does the actual finding
of definitions.
Add to the xref commands awareness of the module:tag syntax in a
similar way that is already done for the old etags commands.
Xref completion support is not included in this commit.
Remove all compilation warnings for GNU Emacs 24.5 and current 25
(4ffec91).
Remove XEmacs incompatibility in
erlang-font-lock-exported-function-name-face.
Add file erlang-test.el with a single unit test.
Add TAGS to .gitignore.
|
|
* ingela/ssl/gen-statem-setopts/ERL-147:
ssl: Setopts should be allowed in all states
|
|
* mururu/eunit/debugvalall/PR-1024/OTP-13612:
eunit: Add ?debugValAll macro
|
|
|
|
* egil/odbc/fix-unmatched_return/OTP-13595:
odbc: Fix unmatched return warnings
|
|
Specs of various *_arity functions in this module used different types
(integer(), non_neg_integer(), byte()) to refer to the type arity().
|
|
|
|
|
|
|
|
* egil/xmerl/fix-unmatched_return/OTP-13595:
xmerl: Fix unmatched return warnings
|
|
* egil/percept/fix-unmatched_return/OTP-13595:
egd: Fix unmatched return warnings
egd: Small code style refactoring
percept: Fix unmatched return warnings
percept: Small code style refactoring
|
|
* dgud/tools/emacs/PR-1054/OTP-13610:
Fix line-initial commas' indentation in type specs
|
|
Inside type specs, line-initial commas shall align with open curly
braces. This also applies to record definitions with type specs for
the fields.
For example:
-type foo() :: { a :: integer()
, b :: integer()
}.
For type specs for functions, the commas shall align with the opening
parenthese. So do a closing parenthese when put on a new line.
For example:
-spec foo( X :: integer()
, Y :: integer()
) -> integer().
This does not affect coding styles that don't put commas at the
beginning of lines.
|
|
* hasse/erl_docgen/datatype_anchors/OTP-13600/ERL-141:
kernel: Remove no longer needed anchors in documentation
stdlib: Remove no longer needed anchors in documentation
erts: Remove no longer needed anchors in documentation
erl_docgen: Add anchors to datatypes without name attribute
|
|
* bjorn/handle-bad-path/ERL-142:
Tolerate bad directories in the code path
|
|
implicit declaration of function 'EXIT_WITH'
Move code chunk up a bit to #define EXIT_WITH
before it's used.
|
|
|
|
|
|
Second merge of this branch to master
with some more docs
|
|
|
|
Followup to https://github.com/erlang/otp/pull/1023
- make/make_emakefile is fixed because otherwise './otp_build tests'
fails early.
- And grep showed that there is only one other file that also should be
fixed - lib/public_key/priv/generate
|
|
* dgud/wx/cmd-queue-bug:
Fix compilation warning
wx: Fix generated defines in gl.hrl
wx: Fix driver command queue
|