34 (*this)(goto_model, replacement_map);
55 (*this)(goto_program, goto_functions, ns, replacement_map);
83 "Called functions need to be present");
85 replacement_mapt::const_iterator r_it = replacement_map.find(
id);
87 if(r_it == replacement_map.end())
90 const irep_idt &new_id = r_it->second;
96 if(
to_code_type(
function.type()).return_type().
id() != ID_empty)
99 if(next_it != goto_program.
instructions.end() && next_it->is_assign())
101 const exprt &rhs = next_it->assign_rhs();
105 "returns must not be removed before replacing calls");
120 for(
const std::string &s : replacement_list)
122 std::string original;
123 std::string replacement;
128 replacement_map.insert(std::make_pair(original, replacement));
133 "conflicting replacement for function " + original,
"--replace-calls");
137 return replacement_map;
145 for(
const auto &p : replacement_map)
147 if(replacement_map.find(p.second) != replacement_map.end())
150 " cannot both be replaced and be a replacement",
157 "replacement function " +
id2string(p.second) +
" needs to be present",
163 if(ns.
lookup(it1->first).type != ns.
lookup(it2->first).type)
166 " are not type-compatible",
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
Base class for all expressions.
typet & type()
Return the type of the expression.
A collection of goto functions.
function_mapt function_map
::goto_functiont goto_functiont
symbol_tablet symbol_table
Symbol table.
goto_functionst goto_functions
GOTO functions.
This class represents an instruction in the GOTO intermediate representation.
const exprt & call_function() const
Get the function that is called for FUNCTION_CALL.
bool is_function_call() const
A generic container class for the GOTO intermediate representation of one function.
instructionst instructions
The list of instructions in the goto program.
instructionst::const_iterator const_targett
Thrown when users pass incorrect command line arguments, for example passing no files to analysis or ...
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
bool lookup(const irep_idt &name, const symbolt *&symbol) const override
See documentation for namespace_baset::lookup().
std::list< std::string > replacement_listt
replacement_mapt parse_replacement_list(const replacement_listt &replacement_list) const
void check_replacement_map(const replacement_mapt &replacement_map, const goto_functionst &goto_functions, const namespacet &ns) const
std::map< irep_idt, irep_idt > replacement_mapt
void operator()(goto_modelt &goto_model, const replacement_listt &replacement_list) const
Replace function calls with calls to other functions.
Expression to hold a symbol (variable)
void set_identifier(const irep_idt &identifier)
const irep_idt & get_identifier() const
#define Forall_goto_program_instructions(it, program)
const std::string & id2string(const irep_idt &d)
symbol_exprt return_value_symbol(const irep_idt &identifier, const namespacet &ns)
produces the symbol that is used to store the return value of the function with the given identifier
Replace function returns by assignments to global variables.
Replace calls to given functions with calls to other given functions.
#define DATA_INVARIANT(CONDITION, REASON)
This condition should be used to document that assumptions that are made on goto_functions,...
#define PRECONDITION(CONDITION)
const symbol_exprt & to_symbol_expr(const exprt &expr)
Cast an exprt to a symbol_exprt.
const code_typet & to_code_type(const typet &type)
Cast a typet to a code_typet.
void split_string(const std::string &s, char delim, std::vector< std::string > &result, bool strip, bool remove_empty)