Go to the documentation of this file.
12 #ifndef CPROVER_JAVA_BYTECODE_JAVA_BYTECODE_CONVERT_METHOD_CLASS_H
13 #define CPROVER_JAVA_BYTECODE_JAVA_BYTECODE_CONVERT_METHOD_CLASS_H
40 size_t _max_array_length,
47 :
log(_message_handler),
73 convert(class_symbol, method, method_context);
121 typedef std::vector<local_variable_with_holest>
135 std::size_t _start_pc,
143 std::size_t _start_pc,
155 std::size_t _start_pc,
158 std::vector<holet> &&_holes)
163 holes(std::move(_holes))
226 const instructionst::const_iterator &it,
253 local_variable_table_with_holest::iterator firstvar,
254 local_variable_table_with_holest::iterator varlimit,
286 block_tree_nodet &tree,
293 block_tree_nodet &tree,
299 bool allow_merge =
true);
317 const irep_idt &mangled_method_name)
const;
349 const std::vector<method_offsett> &jsr_ret_targets,
351 std::vector<java_bytecode_parse_treet::instructiont>::const_iterator>
352 &ret_instructions)
const;
356 std::size_t instruction_address,
387 const std::vector<method_offsett> &jsr_ret_targets,
446 bool is_assertions_disabled_field,
480 const std::set<method_offsett> &working_set,
Class that provides messages with a built-in verbosity 'level'.
methodt::instructionst instructionst
void convert_invoke(source_locationt location, const irep_idt &statement, class_method_descriptor_exprt &class_method_descriptor, codet &c, exprt::operandst &results)
codet convert_pop(const irep_idt &statement, const exprt::operandst &op)
bool is_parameter(const local_variablet &v)
Returns true iff the slot index of the local variable of a method (coming from the LVT) is a paramete...
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
A codet representing sequential composition of program statements.
const bool threading_support
exprt convert_load(const exprt &index, char type_char, size_t address)
Load reference from local variable.
Non-graph-based representation of the class hierarchy.
irep_idt current_method
A copy of method_id :/.
irep_idt method_id
Fully qualified name of the method under translation.
void setup_local_variables(const methodt &m, const address_mapt &amap)
See find_initializers_for_slot above for more detail.
Provides filtering of strings vai inclusion/exclusion lists of prefixes.
code_ifthenelset convert_if_cmp(const java_bytecode_convert_methodt::address_mapt &address_map, const u1 bytecode, const exprt::operandst &op, const mp_integer &number, const source_locationt &location) const
void convert_dup2(exprt::operandst &op, exprt::operandst &results)
java_bytecode_convert_methodt(symbol_table_baset &symbol_table, message_handlert &_message_handler, size_t _max_array_length, bool throw_assertion_error, optionalt< ci_lazy_methods_neededt > needed_lazy_methods, java_string_library_preprocesst &_string_preprocess, const class_hierarchyt &class_hierarchy, bool threading_support, bool assert_no_exceptions_thrown)
The type of an expression, extends irept.
std::vector< instructiont > instructionst
std::vector< method_offsett > try_catch_handler(method_offsett address, const java_bytecode_parse_treet::methodt::exception_tablet &exception_table) const
optionalt< ci_lazy_methods_neededt > needed_lazy_methods
Represents the argument of an instruction that uses a CONSTANT_Fieldref This is used for example as a...
static irep_idt label(const irep_idt &address)
void find_initializers(local_variable_table_with_holest &vars, const address_mapt &amap, const java_cfg_dominatorst &doms)
See find_initializers_for_slot above for more detail.
exprt variable(const exprt &arg, char type_char, size_t address)
Returns an expression indicating a local variable suitable to load/store from a bytecode at address a...
const class_hierarchyt & class_hierarchy
code_blockt convert_iinc(const exprt &arg0, const exprt &arg1, const source_locationt &location, method_offsett address)
Base class for all expressions.
std::vector< holet > holes
code_ifthenelset convert_ifnonull(const java_bytecode_convert_methodt::address_mapt &address_map, const exprt::operandst &op, const mp_integer &number, const source_locationt &location) const
variablet(const symbol_exprt &_symbol_expr, std::size_t _start_pc, std::size_t _length)
std::vector< block_tree_nodet > branch
exprt::operandst & convert_shl(const irep_idt &statement, const exprt::operandst &op, exprt::operandst &results) const
code_blockt convert_multianewarray(const source_locationt &location, const exprt &arg0, const exprt::operandst &op, exprt::operandst &results)
code_blockt convert_newarray(const source_locationt &location, const irep_idt &statement, const exprt &arg0, const exprt::operandst &op, exprt::operandst &results)
code_blockt convert_ret(const std::vector< method_offsett > &jsr_ret_targets, const exprt &arg0, const source_locationt &location, const method_offsett address)
methodt::local_variable_tablet local_variable_tablet
Expression to hold a symbol (variable)
expanding_vectort< variablest > variables
exprt::operandst & convert_cmp2(const irep_idt &statement, const exprt::operandst &op, exprt::operandst &results) const
java_bytecode_parse_treet::methodt methodt
exprt::operandst & convert_cmp(const exprt::operandst &op, exprt::operandst &results) const
codet representation of an if-then-else statement.
variablet(const symbol_exprt &_symbol_expr, std::size_t _start_pc, std::size_t _length, bool _is_parameter)
code_blockt convert_instructions(const methodt &)
static block_tree_nodet get_leaf()
An expression describing a method on a class.
std::list< method_offsett > successors
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
void convert_new(const source_locationt &location, const exprt &arg0, codet &c, exprt::operandst &results)
code_switcht convert_switch(const exprt::operandst &op, const java_bytecode_parse_treet::instructiont::argst &args, const source_locationt &location)
codet get_clinit_call(const irep_idt &classname)
Each static access to classname should be prefixed with a check for necessary static init; this retur...
code_ifthenelset convert_if(const java_bytecode_convert_methodt::address_mapt &address_map, const exprt::operandst &op, const irep_idt &id, const mp_integer &number, const source_locationt &location) const
typet method_return_type
Return type of the method under conversion.
const size_t max_array_length
std::list< symbol_exprt > tmp_vars
irep_idt get_static_field(const irep_idt &class_identifier, const irep_idt &component_name) const
Get static field identifier referred to by class_identifier.component_name Note this may be inherited...
code_blockt & get_or_create_block_for_pcrange(block_tree_nodet &tree, code_blockt &this_block, method_offsett address_start, method_offsett address_limit, method_offsett next_block_start_address, const address_mapt &amap, bool allow_merge=true)
As above, but this version can additionally create a new branch in the block_tree-node and code_block...
const bool throw_assertion_error
java_bytecode_convert_methodt::address_mapt address_mapt
const bool assert_no_exceptions_thrown
The symbol table base class interface.
converted_instructiont(const instructionst::const_iterator &it, const codet &_code)
std::vector< local_variable_with_holest > local_variable_table_with_holest
const variablet & find_variable_for_slot(size_t address, variablest &var_list)
See above.
std::map< irep_idt, bool > class_has_clinit_method
std::vector< method_offsett > branch_addresses
method_offsett slots_for_parameters
Number of local variable slots used by the JVM to pass parameters upon invocation of the method under...
variablet(const symbol_exprt &_symbol_expr, std::size_t _start_pc, std::size_t _length, bool _is_parameter, std::vector< holet > &&_holes)
cfg_dominators_templatet< method_with_amapt, method_offsett, false > java_cfg_dominatorst
void convert_dup2_x1(exprt::operandst &op, exprt::operandst &results)
code_blockt convert_putstatic(const source_locationt &location, const exprt &arg0, const exprt::operandst &op, const symbol_exprt &symbol_expr)
exprt::operandst & convert_ushr(const irep_idt &statement, const exprt::operandst &op, exprt::operandst &results) const
void convert_getstatic(const source_locationt &source_location, const exprt &arg0, const symbol_exprt &symbol_expr, bool is_assertions_disabled_field, codet &c, exprt::operandst &results)
std::vector< exprt > operandst
std::vector< holet > holes
void convert_checkcast(const exprt &arg0, const exprt::operandst &op, codet &c, exprt::operandst &results) const
code_blockt & get_block_for_pcrange(block_tree_nodet &tree, code_blockt &this_block, method_offsett address_start, method_offsett address_limit, method_offsett next_block_start_address)
'tree' describes a tree of code_blockt objects; this_block is the corresponding block (thus they are ...
nonstd::optional< T > optionalt
std::set< method_offsett > predecessors
methodt::local_variablet local_variablet
std::vector< exceptiont > exception_tablet
code_blockt convert_putfield(const fieldref_exprt &arg0, const exprt::operandst &op)
exprt::operandst & convert_const(const irep_idt &statement, const constant_exprt &arg0, exprt::operandst &results) const
java_string_library_preprocesst & string_preprocess
codet & do_exception_handling(const methodt &method, const std::set< method_offsett > &working_set, method_offsett cur_pc, codet &c)
instructionst::const_iterator source
void create_stack_tmp_var(const std::string &, const typet &, code_blockt &, exprt &)
actually create a temporary variable to hold the value of a stack entry
std::vector< local_variablet > local_variable_tablet
std::vector< exprt > argst
void find_initializers_for_slot(local_variable_table_with_holest::iterator firstvar, local_variable_table_with_holest::iterator varlimit, const address_mapt &amap, const java_cfg_dominatorst &doms)
Given a sequence of users of the same local variable slot, this figures out which ones are related by...
code_ifthenelset convert_ifnull(const java_bytecode_convert_methodt::address_mapt &address_map, const exprt::operandst &op, const mp_integer &number, const source_locationt &location) const
exprt::operandst pop(std::size_t n)
std::set< symbol_exprt > used_local_names
codet representing a switch statement.
java_bytecode_parse_treet::instructiont instructiont
std::map< method_offsett, converted_instructiont > address_mapt
std::map< irep_idt, bool > any_superclass_has_clinit_method
void push(const exprt::operandst &o)
std::vector< exprt > stackt
codet convert_monitorenterexit(const irep_idt &statement, const exprt::operandst &op, const source_locationt &source_location)
code_blockt convert_parameter_annotations(const methodt &method, const java_method_typet &method_type)
friend class java_bytecode_convert_method_unit_testt
void draw_edges_from_ret_to_jsr(address_mapt &address_map, const std::vector< method_offsett > &jsr_ret_targets, const std::vector< std::vector< java_bytecode_parse_treet::instructiont >::const_iterator > &ret_instructions) const
symbol_exprt tmp_variable(const std::string &prefix, const typet &type)
code_blockt convert_astore(const irep_idt &statement, const exprt::operandst &op, const source_locationt &location)
std::vector< variablet > variablest
void convert(const symbolt &class_symbol, const methodt &, const optionalt< prefix_filtert > &method_context)
void operator()(const symbolt &class_symbol, const methodt &method, const optionalt< prefix_filtert > &method_context)
void convert_dup2_x2(exprt::operandst &op, exprt::operandst &results)
void pop_residue(std::size_t n)
removes minimum(n, stack.size()) elements from the stack
optionalt< exprt > convert_invoke_dynamic(const source_locationt &location, std::size_t instruction_address, const exprt &arg0, codet &result_code)
A constant literal expression.
void convert_athrow(const source_locationt &location, const exprt::operandst &op, codet &c, exprt::operandst &results) const
std::pair< const methodt &, const address_mapt & > method_with_amapt
codet & replace_call_to_cprover_assume(source_locationt location, codet &c)
bool is_method_inherited(const irep_idt &classname, const irep_idt &mangled_method_name) const
Returns true iff method methodid from class classname is a method inherited from a class or interface...
static void replace_goto_target(codet &repl, const irep_idt &old_label, const irep_idt &new_label)
Find all goto statements in 'repl' that target 'old_label' and redirect them to 'new_label'.
symbol_table_baset & symbol_table
static exprt convert_aload(const irep_idt &statement, const exprt::operandst &op)
Data structure for representing an arbitrary statement in a program.
code_blockt convert_store(const irep_idt &statement, const exprt &arg0, const exprt::operandst &op, const method_offsett address, const source_locationt &location)
void save_stack_entries(const std::string &, code_blockt &, const bytecode_write_typet, const irep_idt &)
Create temporary variables if a write instruction can have undesired side- effects.