aboutsummaryrefslogtreecommitdiffstats
AgeCommit message (Collapse)Author
2012-10-10Rewrite select_val and select_tuple_arity to a select instructionBjörn Gustavsson
Eliminate some code bloat.
2012-10-09Rewrite binary creation instructions to bs_init instructionsBjörn Gustavsson
Rewrite the five binary creation instructions to a bs_init instruction, in order to somewhat reduce code bloat.
2012-10-09Rewrite bs_add, bs_utf*_size to BIF instructions in optimizationsBjörn Gustavsson
We can remove some code bloat by handling the special instructions as BIF instructions in the optimization passes. Also note that bs_utf*_size was not handled by beam_utils:check_liveness/3 (meaning the conservative answer instead of the correct answer would be returned).
2012-10-09Rewrite bs_put* instructions to a generic bs_put instructionBjörn Gustavsson
Seven bs_put_* instructions can be combined into one generic bs_put instruction to avoid some code bloat. That will also improve some optimizations (such as beam_trim) that did not handle all bs_put* variants.
2012-10-09Refactor removal of unused labelsBjörn Gustavsson
Since we always want to remove unused labels directly after code generation (whether we'll run the optimization passes or not), we can simplify the code by doing it in beam_a.
2012-10-09Introduce the mandatory beam_a and beam_z passesBjörn Gustavsson
Introduce the mandary beam_a pass that will be run directly after code generation, and the mandatory beam_z pass that will be run just before beam_asm. Since these passes surround the optimizations, beam_a can (for example) do instruction renaming to simplify the optimization passes and beam_z can undo those renamings.
2012-10-09compile: Fix bug in selection of passesBjörn Gustavsson
2012-10-09beam_receive: Optimize receives using refs created by spawn_monitor/{1,3}Björn Gustavsson
2012-10-09compile: Give a friendler error message if a parse transform cannot be foundBjörn Gustavsson
Don't throw the parse tree in the face of the user. OTP-8707
2012-10-09beam_jump: Don't move a block which can be entered via a fallthroughBjörn Gustavsson
beam_jump moves short code sequences ending in an instruction that causes an exception to the end of the function, in the hope that a jump around the moved blocked can be replaced with a fallthrough. Therefore, moving a block that is entered via a fallthrough defeats the purpose of the optimization. Also add two more test cases for the beam_receive module to ensure that all lines are still covered.
2012-10-09beam_jump: Fix broken optimizationBjörn Gustavsson
A test instruction with the same target label as jump immediately followed it was supposed to be removed, but it was kept anyway. Fix that optimization, but also make sure that the test instruction is kept if the test instruction may have side effects (such as a bit syntax matching instruction). While at it, make the code cleaner by breaking it up into two clauses and don't remove the jump instruction if it is redudant (removal of redundant jump instructions is already handled in another place).
2012-10-09v3_kernel: Fix match code for matched out segment size in multiple clausesBjörn Gustavsson
When matched variable is used as a size field in multiple clauses, as in: foo(<<L:8,A:L>>) -> A; foo(<<L:8,A:L,B:8>>) -> {A,B}. the match tree would branch out before the segment that used the matched-out variable (in this example, the tree would branch out before the matching of A:L). That happens because the pattern matching compilator did not take variable substitutions into account when grouping clauses that match the same value. That is, the generated code would work similarly to this code: foo(<<L:8,T/binary>>) -> case T of <<A:L>> -> A; _ -> case T of <<A:L,B:8>> -> %% A matched out again! {A,B} end end. We would like the matching to work more like: foo(<<L,A:L,T/binary>>) -> case T of <<>> -> A; <<B:8>> -> {A,B} end. Fix the problem by taking the substitutions into account when grouping clauses that match out the same value.
2012-10-09Improve binary matching of literalsBjörn Gustavsson
The bs_match_string instruction is used to speed up matching of binary literals. For example, given this source code: foo1(<<1,2,3>>) -> ok. The matching part of the code will look like: {test,bs_start_match2,{f,1},1,[{x,0},0],{x,0}}. {test,bs_match_string,{f,3},[{x,0},24,{string,[1,2,3]}]}. {test,bs_test_tail2,{f,3},[{x,0},0]}. Nice. However, if we do a simple change to the source code: foo2(<<1,2,3>>) -> ok; foo2(<<>>) -> error. the resulting matching code will look like (sligthly simplified): {test,bs_start_match2,{f,4},1,[{x,0},0],{x,0}}. {test,bs_get_integer2,{f,7},1,[{x,0},{integer,8},1,Flags],{x,1}}. {test,is_eq_exact,{f,8},[{x,1},{integer,1}]}. {test,bs_match_string,{f,6},[{x,0},16,{string,[2,3]}]}. {test,bs_test_tail2,{f,6},[{x,0},0]}. {move,{atom,ok},{x,0}}. return. {label,6}. {bs_restore2,{x,0},{atom,start}}. {label,7}. {test,bs_test_tail2,{f,8},[{x,0},0]}. That is, matching of the first byte is not combined into the bs_match_string instruction that follows. Fix this problem by allowing a bs_match_string instruction to be used if all clauses will match either the same integer literal or the empty binary.
2012-10-09v3_codegen: Combine adjacent bs_match_string instructionsBjörn Gustavsson
In modules with huge functions with many bs_match_string instructions, we can speed up the compilation by combining adjacent bs_match_strings instruction in v3_codegen (as opposed to in beam_block where we used to do it). For instance, on my computer the v3_codegen became more than twice as fast when compiling the re_testoutput1_split_test module in the STDLIB test suites.
2012-10-09beam_bool: Recognize more safe optimizationsBjörn Gustavsson
The optimizer of boolean expressions can often reject optimizations that it does not recognize as safe. For instance, if a boolean expression was preceded by 'move' instructions that saved x registers into y registers, it would almost certainly reject the optimization because it required the y register not be used in the code that follows. Fix this problem by allowing identical 'move' instructions that assing to y registers at the beginning of the old and the optimized code. While at it, correct the spelling of "preceding".
2012-10-09beam_utils: Correct usage calculations for GC BIFs in blocksBjörn Gustavsson
The usage calculation only looked at the allocation in GC BIFs, not at the source and destination registers. Also, if there is a failure label, make sure that we test whether the register can be used there.
2012-10-09beam_utils:live_opt/1: Correct liveness calculation for 'try'Björn Gustavsson
The liveness at the failure label should be ignored, because if there is an exception, all x registers will be killed.
2012-10-09beam_utils: Extend live_opt/1 to recalculate live registers in allocsBjörn Gustavsson
The code generator uses conservative liveness information. Therefore the number of live registers in allocation instructions (such as test_heap/2) may be too high. Use the actual liveness information to lower the number of live register if it's too high. The main reason we want to do this is to enable more optimizations that depend on liveness analysis, such as the beam_bool and beam_dead passes.
2012-10-09beam_utils: Check liveness in catches and try/catch blocksBjörn Gustavsson
Less conservative liveness analysis allows more optimizations to be applied (such as the ones in beam_bool).
2012-10-09v3_codegen: Clarify code generation for binary constructionBjörn Gustavsson
Add some comments to make the code generation for binary construction somewhat clearer. Also get rid of the cg_bo_newregs/2 function that serves no useful purpose. (It was probably intended to undo the effect of cg_live/2, but note that the value passed to cg_bo_newregs/2 has not passed through cg_live/2.)
2012-10-09v3_codegen: Clean up comments and remove out-commented codeBjörn Gustavsson
2012-10-09v3_codegen: Don't duplicate the functionality of cg_reg_arg/2Björn Gustavsson
2012-10-08Merge branch 'sze/improve-interoperability-SSH-clients'Henrik Nord
* sze/improve-interoperability-SSH-clients: Improve interoperability with SSH clients OTP-10475
2012-10-08Merge branch 'jn/ets-match-pattern-export-type'Henrik Nord
* jn/ets-match-pattern-export-type: Export ets:match_pattern/0 type Conflicts: lib/stdlib/src/ets.erl OTP-10472
2012-10-08Merge branch 'hb/stdlib/opaque_warnings/OTP-10436'Hans Bolinder
* hb/stdlib/opaque_warnings/OTP-10436: Fix Dialyzer warnings
2012-10-05Merge branch 'sverk/code-load-refactor-later-op'Sverker Eriksson
* sverk/code-load-refactor-later-op: erts: Fix faulty lock check assert erts: Refactor naming regarding code_write_permission erts: Refactor tracing to use erts_schedule_thr_prgr_later_op erts: Allow thr_prgr_later_op to reschedule erts: Refactor code loading to use erts_schedule_thr_prgr_later_op erts: Remove some compiler warnings
2012-10-05Merge branch 'ia/ssl/controlling-process-on-listen-socket/OTP-10447'Ingela Anderton Andin
* ia/ssl/controlling-process-on-listen-socket/OTP-10447: ssl: Improve #sslsocket{} API ssl: It is now possible to call controlling_process on a listen socket, same as in gen_tcp.
2012-10-05Improve interoperability with SSH clientsStefan Zegenhagen
This patch fixes a few problems of the SSH shell server that affect the interoperability with SSH clients in widespread use. First problem is that, whenever a channel_request message is received with want_reply=true, the reply ends up being sent to the servers channel id, not the clients channel id. This causes the client to terminate the connection. The easiest solution to the problem appears to be a new function in ssh_connection_manager.erl that translates the servers channel id before sending the reply (in the same manner as other functions do it). Second problem is in ssh_cli.erl. When an SSH client sends a window_change request between PTY allocation and starting the shell (which appears to happen with some clients), ssh_cli.erl crashes because #state.buf is yet 'undefined'. Allocating an empty buffer at PTY allocation time solves the problem. Affected SSH clients: - all clients based on SSH-2.0-TrileadSSH2Java_213 (problem #1) - SSH Term Pro (problem #2)
2012-10-05ts_run: Always turn on timetrap scaling when starting common_testBjörn Gustavsson
Scaling timetraps depending on cover, debug-compiled emulator and so on is built-in to the test_server. Therefore, {multiply_timetraps,Scale} should not be set (it would multiply the timeout value twice). Only {scale_timetraps,true} needs to be set, and it must be set unconditionally as the feature tests in test_server:timetrap_scale_factor() may not return the correct scale factor until the test_server node and test cases have been started (for example, there is no cover server running).
2012-10-05Fix Dialyzer warningsHans Bolinder
Opaque types need to be exported.
2012-10-04Merge branch 'ia/ssh/sending-large-data-and-eof/OTP-10467'Ingela Anderton Andin
* ia/ssh/sending-large-data-and-eof/OTP-10467: ssh: Make test case platform independant ssh: ssh_connection:channel_data() and send_eof() now return {error, closed} for closed or invalid channels. ssh: Ensure that all data is sent before ssh:send returns. ssh: add test suite for testing channel send/receive behavior.
2012-10-04Merge branch 'ia/ssl/sslv2-test'Ingela Anderton Andin
* ia/ssl/sslv2-test: ssl: Better test to determine if sslv2 is supported by openssl
2012-10-03ssh: Make test case platform independantIngela Anderton Andin
The test case interrupted_send did not work on all platforms. Also ct-ify the test suite
2012-10-03ssh: ssh_connection:channel_data() and send_eof() now return {error, closed} ↵Daniel Goertzen
for closed or invalid channels. ssh_connection:handle_msg(#ssh_msg_channel_close...) will now cause any send() that was in progress to immediately return {error,closed}.
2012-10-03ssh: Ensure that all data is sent before ssh:send returns.Daniel Goertzen
2012-10-03ssh: add test suite for testing channel send/receive behavior.Daniel Goertzen
2012-10-03Merge branch 'gp/make_erlang_mode_elpa_friendly'Henrik Nord
* gp/make_erlang_mode_elpa_friendly: Make erlang-mode more compatible with package.el OTP-10465
2012-10-03Merge branch 'maint'Henrik Nord
2012-10-03Merge branch 'sa/dialyzer-fix-r15b02' into maintHenrik Nord
* sa/dialyzer-fix-r15b02: Fix a crash in race condition detection Remove old untested experimental extension Respect {plt_check,false} option when using dialyzer:run/1 Fix handling of tuple set remote types appearing in tuple sets OTP-10464
2012-10-03Merge branch 'bjorn/test_server/fix-test-cases'Björn Gustavsson
* bjorn/test_server/fix-test-cases: Provided better information when the test cases fail Remove the useless test_server_line_SUITE test suite test_server_SUITE: Remove the undefined_functions/1 test case
2012-10-02Merge branch 'egil/fix-doc-vxworks'Björn-Egil Dahlberg
* egil/fix-doc-vxworks: doc: Remove forgotten vxworks reference
2012-10-02Merge branch 'raimo/inets/https-proxy/OTP-10256'Raimo Niskanen
* raimo/inets/https-proxy/OTP-10256: inets httpc: Document that RFC 2817 is not supported inets: Dialyzer fixes inets httpc: TLS via proxy inets: Remove obsolete testcases that are now in the proxy suite inets: Add tests using external proxy running on localhost
2012-10-02inets httpc: Document that RFC 2817 is not supportedIngela Anderton Andin
2012-10-02inets: Dialyzer fixesIngela Anderton Andin
2012-10-02inets httpc: TLS via proxyIngela Anderton Andin
Introduces new option htts_proxy so that it is possible to have different proxies for http and https. The new option defaults to the old proxy option. Implements HTTP-1.1 extension method CONNECT to establish SSL/TLS tunnel We choose not to implement "TLS upgrade" as defined by RFC 2817 as this method of upgrade is vulnerable to man in the middle attacks, can be easily broken by proxies and does not seem to be widely adopted.
2012-10-02inets: Remove obsolete testcases that are now in the proxy suiteRaimo Niskanen
2012-10-02inets: Add tests using external proxy running on localhostRaimo Niskanen
2012-10-01doc: Remove forgotten vxworks referenceBjörn-Egil Dahlberg
2012-10-01ssl: Better test to determine if sslv2 is supported by opensslIngela Anderton Andin
2012-10-01ssl: Improve #sslsocket{} APIIngela Anderton Andin
A #sslsocket{} contains the fsm pid and value that was previously set to old_ssl or new_ssl to make the transition period smoother. Now that old ssl is not supported any more we use this field to store the inet socket reference instead. This enables some API functions to return quicker as they do not need to communicate with the fsm-process.