%% %% %CopyrightBegin% %% %% Copyright Ericsson AB 2018. All Rights Reserved. %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% %% %CopyrightEnd% %% -record(b_module, {anno=#{} :: beam_ssa:anno(), name :: module(), exports :: [{atom(),arity()}], attributes :: list(), body :: [beam_ssa:b_function()]}). -record(b_function, {anno=#{} :: beam_ssa:anno(), args :: [beam_ssa:b_var()], bs :: #{beam_ssa:label():=beam_ssa:b_blk()}, cnt :: beam_ssa:label()}). -record(b_blk, {anno=#{} :: beam_ssa:anno(), is :: [beam_ssa:b_set()], last :: beam_ssa:terminator()}). -record(b_set, {anno=#{} :: beam_ssa:anno(), dst=none :: 'none'|beam_ssa:b_var(), op :: beam_ssa:op(), args=[] :: [beam_ssa:argument()]}). %% Terminators. -record(b_ret, {anno=#{} :: beam_ssa:anno(), arg :: beam_ssa:value()}). -record(b_br, {anno=#{}, bool :: beam_ssa:value(), succ :: beam_ssa:label(), fail :: beam_ssa:label()}). -record(b_switch, {anno=#{} :: beam_ssa:anno(), arg :: beam_ssa:value(), fail :: beam_ssa:label(), list :: [{beam_ssa:b_literal(),beam_ssa:label()}]}). %% Values. -record(b_var, {name :: beam_ssa:var_name()}). -record(b_literal, {val :: beam_ssa:literal_value()}). -record(b_remote, {mod :: beam_ssa:value(), name :: beam_ssa:value(), arity :: non_neg_integer()}). -record(b_local, {name :: beam_ssa:b_literal(), arity :: non_neg_integer()}). %% This is a psuedo-block used to express that certain instructions and BIFs %% throw exceptions on failure. The code generator rewrites all branches to %% this block to {f,0} which causes the instruction to throw an exception %% instead of branching. %% %% Since this is not an ordinary block, it's illegal to merge it with other %% blocks, and jumps are only valid when we know that an exception will be %% thrown by the operation that branches here; the *block itself* does not %% throw an exception. -define(EXCEPTION_BLOCK, 1).