aboutsummaryrefslogtreecommitdiffstats
path: root/lib/compiler/src
AgeCommit message (Collapse)Author
2017-05-23Correct handling of module name in compile:forms/1,2Björn Gustavsson
compile:forms/1,2 is documented to return: {ok,ModuleName,BinaryOrCode} However, if one of the options 'from_core', 'from_asm', or 'from_beam' is given, ModuleName will be returned as []. A worse problem is that is that if one those options are combined with the 'native' option, compilation will crash. Correct compile:forms/1,2 to pick up the module name from the forms provided (either Core Erlang, Beam assembly code, or a Beam file). Reported here: https://bugs.erlang.org/browse/ERL-417
2017-05-19genop.tab: Add an OTP 20 commentBjörn Gustavsson
Make it clear that is_tagged_tuple/4 was added in OTP 20 (not R17).
2017-05-10erl_bifs: Remove pure BIFs serving no useful purposeBjörn Gustavsson
Functions that can are known be pure can be evaluated at compile-time if the arguments are literals and if the result is expressible as a literal. list_to_ref/1 and list_to_port/1 returns terms that cannot be expressed as literals, so the optimization is not possible. The argument for port_to_list/1 is never a literal, so there is no way to evaluate it at compile-time. Therefore, marking those functions as pure serves no useful purpose. Note: list_to_pid/1 *is* marked as pure, but only so that we can test the code in sys_core_fold that rejects pure functions that evaluate to at term that is not possible to express as a literal. It is sufficient to have one pure function of that kind.
2017-05-10erl_bifs: Remove erlang:hash/2 from list of pure functionsBjörn Gustavsson
erlang:hash/2 was removed in c5d9b970fb5b3a71.
2017-05-09Merge pull request #1439 from josevalim/jv-atu8-functionBjörn Gustavsson
Add a test for utf8 function names
2017-05-08Add a test for utf8 function namesJosé Valim
The test found a bug in v3_kernel_pp which was not taking into account utf8 atoms. The bug has also been fixed.
2017-05-05Make 'slim' slim againBjörn Gustavsson
The undocumented compiler option 'slim' is used when compiling the primary bootstrap. The purpose is to make the bootstrap smaller and to avoid unnecessary churn in the git repository. That is, the BEAM file should be different only if the actual code in the file is different, and not if it has merely been re-compiled on a different computer. Two commits have fattened the 'slim' option. In 36f7087ae0f, extra chunks are included even in slim BEAM files. In dfb899c0229f7, the "Dbgi" were added as an extra chunk, causing it to be included in slim files. Make 'slim' slim again by only including the essential chunks and the attribute chunk (as was the case before the {extra,...} option was added).
2017-05-04Update copyright yearRaimo Niskanen
2017-04-26Merge pull request #1367 from josevalim/jv-dbgi-chunkBjörn Gustavsson
Introduce new "Dbgi" chunk OTP-14369
2017-04-25Merge branch 'lukas/erts/list_to_port/OTP-14348'Lukas Larsson
* lukas/erts/list_to_port/OTP-14348: erts: Add erlang:list_to_port/1 debug bif erts: Auto-import port_to_list for consistency erts: Polish off erlang:list_to_ref/1
2017-04-25erts: Add erlang:list_to_port/1 debug bifLukas Larsson
2017-04-25erts: Auto-import port_to_list for consistencyLukas Larsson
Follow the same pattern as pid_to_list
2017-04-25warnings_as_errors and outdir do not affect code generationJosé Valim
By moving to effects_code_generation/1, there is no need to explicitly remove those options when storing compile information in the DebugInfo chunk.
2017-04-25Store abstract code in the Dbgi chunkJosé Valim
The new Dbgi chunk returns data in the following format: {debug_info_v1, Backend, Data} This allows compilers to store the debug info in different formats. In order to retrieve a particular format, for instance, Erlang Abstract Format, one may invoke: Backend:debug_info(erlang_v1, Module, Data, Opts) Besides introducing the chunk above, this commit also: * Changes beam_lib:chunk(Beam, [:abstract_code]) to read from the new Dbgi chunk while keeping backwards compatibility with old .beams * Adds the {debug_info, {Backend, Data}} option to compile:file/2 and friends that are stored in the Dbgi chunk. This allows the debug info encryption mechanism to work across compilers * Improves dialyzer to work directly on Core Erlang, allowing languages that do not have the Erlang Abstract Format to be dialyzer as long as they emit the new chunk and their backend implementation is available Backwards compatibility is kept across the board except for those calling beam_lib:chunk(Beam, ["Abst"]), as the old chunk is no longer available. Note however the "Abst" chunk has always been optional. Future OTP versions may remove parsing the "Abst" chunk altogether from beam_lib once Erlang 19 and earlier is no longer supported. The current Dialyzer implementation still supports earlier .beam files and such may also be removed in future versions.
2017-04-22Make beam_validator track type formation for binary operationsMichal Muskala
Fixes https://bugs.erlang.org/browse/ERL-406 - a bug introduced in 0377592dc2238f561291be854d2ce859dd9a5fb1
2017-04-21erts: Polish off erlang:list_to_ref/1Lukas Larsson
2017-04-20compile: Remove the r12 through r15 optionsBjörn Gustavsson
The main purpose of these options is compatibility with old Erlang systems. Since it is no longer possible to communicate with R15B or earlier, we no longer need the r12 through r15 options.
2017-04-19Enhance type-driven optimisation in beam_type.erlMichal Muskala
* kill type information only for affected registers in get_map_elements * bs_get_utf* will produce integers of unicode range This optimises code created by Elixir compiler, where: <<x::utf8,_::binary>> when x in 1..10 will compile the guard to is_integer(X) andalso X >= 1 andalso X =< 10 This allows us to eliminate the is_integer check. * bs_get_float will produce a float * allow to carry type information over other bs instructions killing only the affected registers * kill only x registers after call_fun and apply instructions
2017-04-12Atoms in Core Erlang must be encoded in UTF-8Björn Gustavsson
core_scan will now support and require atoms encoded in UTF-8.
2017-03-24compiler: Add is_tagged_tuple instructionBjörn-Egil Dahlberg
Rewrite the instruction stream on tagged tuple tests. Tagged tuples means a tuple of any arity with an atom as its first element. Typically records, ok-tuples and error-tuples. from: ... {test,is_tuple,Fail,[Src]}. {test,test_arity,Fail,[Src,Sz]}. ... {get_tuple_element,Src,0,Dst}. ... {test,is_eq_exact,Fail,[Dst,Atom]}. ... to: ... {test,is_tagged_tuple,Fail,[Src,Sz,Atom]}. ...
2017-03-13beam_type: Avoid an internal consistency check failureBjörn Gustavsson
Code such as the following: -record(x, {a}). f(R, N0) -> N = N0 / 100, if element(1, R#x.a) =:= 0 -> N end. would fail to compile with the following message: m: function f/2+19: Internal consistency check failed - please report this bug. Instruction: {fmove,{fr,0},{x,1}} Error: {uninitialized_reg,{fr,0}}: This bug was introduced in 348b5e6bee2f. Basically, the beam_type pass placed the fmove instruction in the wrong place. Instructions that store to floating point registers and instructions that read from floating point registers are supposed to be in the same basic block. Fix the problem by flushing all floating points instruction before a call the pseudo-BIF is_record/3, thus making sure that the fmove instruction is placed in the correct block. Here is an annotated listing of the relevant part of the .S file (before the fix): {test_heap,{alloc,[{words,0},{floats,1}]},2}. {fconv,{x,1},{fr,0}}. {fmove,{float,100.0},{fr,1}}. fclearerror. {bif,fdiv,{f,0},[{fr,0},{fr,1}],{fr,0}}. {fcheckerror,{f,0}}. %% The instruction {fmove,{fr,0},{x,1}} should have %% been here. %% Block of instructions expanded from a call to %% the pseudo-BIF is_record/3. (Expanded in a later %% compiler pass.) {test,is_tuple,{f,3},[{x,0}]}. {test,test_arity,{f,3},[{x,0},2]}. {get_tuple_element,{x,0},0,{x,2}}. {test,is_eq_exact,{f,3},[{x,2},{atom,x}]}. {move,{atom,true},{x,2}}. {jump,{f,4}}. {label,3}. {move,{atom,false},{x,2}}. {label,4}. %% End of expansion. %% The fmove instruction that beam_validator complains %% about. {fmove,{fr,0},{x,1}}. Reported-by: Richard Carlsson
2017-02-27v3_core: Combine binary strings to larger integersBjörn Gustavsson
Binary construction that mixes long literal strings with variables will make Dialyzer slow. Example: <<"long string (thousand of characters)",T/binary>> The string literals in binary construction is translated to one binary segment per character; all those segments will slow down Dialyzer. We can speed up Dialyzer if we combine several characters (up to 256) to a signle segment in the binary. It will also slightly speed up the compiler. This optimization will make core listings file with binary strings harder to read, but they were not that easy to read before this change. ERL-308
2017-02-12Add extra_chunks option to compileJosé Valim
This allow languages such as Elixir and LFE to attach extra chunks to the .beam file without having to parse the beam file after compilation. This commit also cleans up the interface to beam_asm, allowing chunks to be passed from the compiler without a need to change beam_asm API on every new chunk.
2017-01-30Add new AtU8 beam chunkJosé Valim
The new chunk stores atoms encoded in UTF-8. beam_lib has also been modified to handle the new 'utf8_atoms' attribute while the 'atoms' attribute may be a missing chunk from now on. The binary_to_atom/2 BIF can now encode any utf8 binary with up to 255 characters. The list_to_atom/1 BIF can now accept codepoints higher than 255 with up to 255 characters (thanks to Björn Gustavsson).
2017-01-12Makefile: Warn for missings specBjörn Gustavsson
2017-01-12Add specs for the beam_*:module/2 functionsBjörn Gustavsson
2017-01-12beam_trim: Add types and specsBjörn Gustavsson
2017-01-12beam_listing: Add types and specsBjörn Gustavsson
2017-01-12beam_jump: Add types and specsBjörn Gustavsson
2017-01-12beam_except: Add types and specsBjörn Gustavsson
2017-01-12beam_dict: Add missing types and specsBjörn Gustavsson
2017-01-12beam_clean: Add types and specsBjörn Gustavsson
2017-01-12beam_bsm: Add missing types and specsBjörn Gustavsson
Also slightly refactor the code to simplify the types.
2017-01-12v3_codegen: Add missing types and specsBjörn Gustavsson
2017-01-12sys_pre_attributes: Correct and add missing types and specsBjörn Gustavsson
2017-01-12core_scan: Add missing types and specsBjörn Gustavsson
2017-01-12compile: Add missing types and specsBjörn Gustavsson
2017-01-12cerl: Add missing types and specsBjörn Gustavsson
2017-01-12v3_kernel_pp: Correct spec for format/1Björn Gustavsson
2017-01-12v3_life: Add types and specsBjörn Gustavsson
2017-01-12v3_life.hrl: Add types for all fieldsBjörn Gustavsson
2017-01-12beam_utils: Add types and specsBjörn Gustavsson
2017-01-12beam_asm: Add common types to describe operandsBjörn Gustavsson
2017-01-12sys_pre_attributes: Remove unnecessary flexibilityBjörn Gustavsson
The compiler passes always Options as list to parse_transform/2. There is no need accept a non-list. There is also no need to handle an improper Options list. The compiler itself will crash if the Options list is improper.
2017-01-12beam_dict: Simplify the internal format of the lambda tableBjörn Gustavsson
Since Index =:= OldIndex and OldUniq =:= 0, there is no need to store OldIndex and OldUniq in the internal data structure for the lambda table.
2017-01-12Merge branch 'maint'Hans Bolinder
* maint: dialyzer: Compact 'file' annotations in Core code dialyzer: Try to reduce memory usage dialyzer: Use less memory when translating contracts dialyzer: Use maps instaed of dict dialyzer: Use maps instead of dict for module contracts map dialyzer: Compress a few more ETS tables dialyzer: Optimize memory consumption dialyzer: Reduce memory consumption during 'remote' phase dialyzer: Update code for finding parallelism compiler: Do not spawn process when dialyzing dialyzer: Reduce ETS usage during the typesig phase dialyzer: Optimize graph condensation dialyzer: Do not send full PLTs as messages
2017-01-11compiler: Do not spawn process when dialyzingHans Bolinder
Memory consumption is reduced during the compilation phase by keeping the Core parse tree shared. In particular the file annotation takes a lot of memory when not shared.
2017-01-10Improve compilation speed for huge literal case expressionsBjörn Gustavsson
Code with huge literal case expressions such as the following would compile very slowly: case "Very long literal string (thousands of characters)..." of . . . end. The reason is that in the case optimization each character in the string would be handled individually. Fix this bug by handling literals all at once.
2016-12-15compile: Reduce memory consumption during compilationBjörn Gustavsson
The compiler would keep the data structures for two compiler passes in memory. That could increase the maximum amount of memory that the compiler uses, and could also have a negative impact on performance (terms that would not be used again would be copied by a garbage collection). Here is an example that shows how the previous version of the code could get captured: a_compiler_pass(Mod, St) -> case Mod:module(St#compile.code, St#compile.options) of {ok,Code} -> {ok,St#compile{code=Code}}; ... The reference to the code from the previous pass will only be released when St is updated. We can avoid the problem by passing the current version of the code as a function argument: a_compiler_pass(Mod, Code0, St) -> case Mod:module(Code0, St#compile.options) of {ok,Code} -> {ok,Code,St}; ... In practice, this change does not seem to significantly speed up the compiler, but it does not do any harm either. It should help dialyzer in situations when dialyzer compiles several large modules at the same time.
2016-12-09beam_type: Minimize number of regs in test_heap instructionsBjörn Gustavsson
The beam_type may pass move and recalculates test_heap instructions. The number of live registers are not always the lowest. Minimize the number of registers by running beam_utils:live_opt/1 one more time.