Go to the documentation of this file.
12 #ifndef CPROVER_GOTO_PROGRAMS_GOTO_PROGRAM_H
13 #define CPROVER_GOTO_PROGRAMS_GOTO_PROGRAM_H
238 auto &decl = expr_checked_cast<code_declt>(
_code);
239 return decl.symbol();
246 auto &decl = expr_checked_cast<code_declt>(
_code);
247 return decl.symbol();
331 _code = std::move(c);
388 typedef std::list<instructiont>::iterator
targett;
504 :
_code(std::move(__code)),
507 guard(std::move(_guard)),
526 std::numeric_limits<unsigned>::max();
555 std::ostringstream instruction_id_builder;
556 instruction_id_builder <<
_type;
557 return instruction_id_builder.str();
577 void apply(std::function<
void(
const exprt &)>)
const;
580 std::ostream &
output(std::ostream &)
const;
607 template <
typename Target>
616 const auto next=std::next(target);
641 target->swap(instruction);
654 auto next=std::next(target);
734 std::ostream &out)
const
740 std::ostream &
output(std::ostream &out)
const;
750 return instruction.output(out);
762 nr != std::numeric_limits<unsigned>::max(),
763 "Too many location numbers assigned");
764 i.location_number=nr++;
823 "goto program ends on END_FUNCTION");
834 "goto program ends on END_FUNCTION");
861 ins.validate(ns, vm);
1116 template <
typename Target>
1118 Target target)
const
1121 return std::list<Target>();
1123 const auto next=std::next(target);
1129 std::list<Target> successors(i.
targets.begin(), i.
targets.end());
1132 successors.push_back(next);
1139 std::list<Target> successors(i.
targets.begin(), i.
targets.end());
1142 successors.push_back(next);
1150 return std::list<Target>();
1156 return std::list<Target>();
1162 ? std::list<Target>{next}
1163 : std::list<Target>();
1168 return std::list<Target>{next};
1171 return std::list<Target>();
1189 using hash_typet = decltype(&(*t));
1190 return std::hash<hash_typet>{}(&(*t));
1198 template <
class A,
class B>
1201 return &(*a) == &(*b);
1205 template <
typename GotoFunctionT,
typename PredicateT,
typename HandlerT>
1207 GotoFunctionT &&goto_function,
1208 PredicateT predicate,
1211 auto &&instructions = goto_function.body.instructions;
1212 for(
auto it = instructions.begin(); it != instructions.end(); ++it)
1221 template <
typename GotoFunctionT,
typename HandlerT>
1224 using iterator_t = decltype(goto_function.body.instructions.begin());
1226 goto_function, [](
const iterator_t &) {
return true; }, handler);
1229 #define forall_goto_program_instructions(it, program) \
1230 for(goto_programt::instructionst::const_iterator \
1231 it=(program).instructions.begin(); \
1232 it!=(program).instructions.end(); it++)
1234 #define Forall_goto_program_instructions(it, program) \
1235 for(goto_programt::instructionst::iterator \
1236 it=(program).instructions.begin(); \
1237 it!=(program).instructions.end(); it++)
1250 return &(*i1)<&(*i2);
1264 #endif // CPROVER_GOTO_PROGRAMS_GOTO_PROGRAM_H
static instructiont make_other(const goto_instruction_codet &_code, const source_locationt &l=source_locationt::nil())
exprt::operandst & call_arguments()
Get the arguments of a FUNCTION_CALL.
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
bool operator<(const goto_programt::const_targett &i1, const goto_programt::const_targett &i2)
const code_function_callt & to_code_function_call(const goto_instruction_codet &code)
std::list< irep_idt > labelst
Goto target labels.
void complete_goto(targett _target)
const goto_instruction_codet & code() const
Get the code represented by this instruction.
void clear(goto_program_instruction_typet __type)
Clear the node.
targett insert_after(const_targett target, const instructiont &i)
Insertion after the instruction pointed-to by the given instruction iterator target.
static instructiont make_dead(const symbol_exprt &symbol, const source_locationt &l=source_locationt::nil())
std::ostream & output(std::ostream &) const
Output this instruction to the given stream.
std::string to_string() const
const goto_instruction_codet & get_other() const
Get the statement for OTHER.
source_locationt & source_location_nonconst()
void swap(instructiont &instruction)
Swap two instructions.
const_targett const_cast_target(const_targett t) const
Dummy for templates with possible const contexts.
static instructiont make_set_return_value(exprt return_value, const source_locationt &l=source_locationt::nil())
void compute_loop_numbers()
Compute loop numbers.
std::list< const_targett > const_targetst
const code_deadt & to_code_dead(const goto_instruction_codet &code)
std::list< instructiont > instructionst
void for_each_instruction_if(GotoFunctionT &&goto_function, PredicateT predicate, HandlerT handler)
exprt & assign_lhs_nonconst()
Get the lhs of the assignment for ASSIGN.
static const source_locationt & nil()
std::list< exprt > expressions_read(const goto_programt::instructiont &)
symbol_exprt & decl_symbol()
Get the declared symbol for DECL.
void update()
Update all indices.
goto_instruction_codet _code
Do not read or modify directly – use code() and code_nonconst() instead.
void copy_from(const goto_programt &src)
Copy a full goto program, preserving targets.
void apply(std::function< void(const exprt &)>) const
Apply given function to all expressions.
A goto_instruction_codet representing the declaration of a local variable.
instructiont(goto_instruction_codet __code, source_locationt __source_location, goto_program_instruction_typet __type, exprt _guard, targetst _targets)
Constructor that can set all members, passed by value.
static instructiont make_end_function(const source_locationt &l=source_locationt::nil())
targett add(instructiont &&instruction)
Adds a given instruction at the end.
void transform(std::function< optionalt< exprt >(exprt)>)
Apply given transformer to all expressions; no return value means no change needed.
bool empty() const
Is the program empty?
Base class for all expressions.
Functor to check whether iterators from different collections point at the same object.
void insert_before_swap(targett target, goto_programt &p)
Insertion that preserves jumps to "target".
void get_decl_identifiers(decl_identifierst &decl_identifiers) const
get the variables in decl statements
std::list< exprt > objects_written(const goto_programt::instructiont &)
bool has_assertion() const
Does the goto program have an assertion?
std::string to_string(const string_not_contains_constraintt &expr)
Used for debug printing.
targetst targets
The list of successor instructions.
bool is_incomplete_goto() const
std::list< Target > get_successors(Target target) const
Get control-flow successors of a given instruction.
bool is_true() const
Return whether the expression is a constant representing true.
exprt & condition_nonconst()
Get the condition of gotos, assume, assert.
void insert_before_swap(targett target, instructiont &instruction)
Insertion that preserves jumps to "target".
bool is_end_thread() const
goto_instruction_codet & code_nonconst()
Set the code represented by this instruction.
Expression to hold a symbol (variable)
static instructiont make_decl(const symbol_exprt &symbol, const source_locationt &l=source_locationt::nil())
const symbol_exprt & decl_symbol() const
Get the declared symbol for DECL.
bool is_atomic_end() const
const exprt::operandst & call_arguments() const
Get the arguments of a FUNCTION_CALL.
std::list< exprt > objects_read(const goto_programt::instructiont &)
const_targett get_end_function() const
Get an instruction iterator pointing to the END_FUNCTION instruction of the goto program.
static instructiont make_assignment(const code_assignt &_code, const source_locationt &l=source_locationt::nil())
Create an assignment instruction.
static instructiont make_goto(targett _target, const source_locationt &l=source_locationt::nil())
bool is_false() const
Return whether the expression is a constant representing false.
std::list< instructiont >::const_iterator const_targett
static irep_idt loop_id(const irep_idt &function_id, const instructiont &instruction)
Human-readable loop name.
bool is_atomic_begin() const
std::list< targett > targetst
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
static instructiont make_function_call(const code_function_callt &_code, const source_locationt &l=source_locationt::nil())
Create a function call instruction.
targett add_instruction()
Adds an instruction at the end.
typet & type()
Return the type of the expression.
goto_instruction_codet representation of a function call statement.
static instructiont make_function_call(exprt lhs, exprt function, code_function_callt::argumentst arguments, const source_locationt &l=source_locationt::nil())
Create a function call instruction.
targett insert_before(const_targett target)
Insertion before the instruction pointed-to by the given instruction iterator target.
bool equals(const goto_programt &other) const
Syntactic equality: two goto_programt are equal if, and only if, they have the same number of instruc...
void validate(const namespacet &ns, const validation_modet vm) const
Check that the instruction is well-formed.
void turn_into_skip()
Transforms an existing instruction into a skip, retaining the source_location.
static instructiont make_assertion(const exprt &g, const source_locationt &l=source_locationt::nil())
void compute_target_numbers()
Compute the target numbers.
goto_program_instruction_typet type() const
What kind of instruction?
const goto_instruction_codet & get_code() const
Get the code represented by this instruction.
static instructiont make_decl(const code_declt &_code, const source_locationt &l=source_locationt::nil())
#define DATA_INVARIANT(CONDITION, REASON)
This condition should be used to document that assumptions that are made on goto_functions,...
void destructive_insert(const_targett target, goto_programt &p)
Inserts the given program p before target.
const symbol_exprt & dead_symbol() const
Get the symbol for DEAD.
const std::string & id2string(const irep_idt &d)
goto_programt(goto_programt &&other)
const source_locationt & source_location() const
exprt & call_function()
Get the function that is called for FUNCTION_CALL.
std::list< instructiont >::iterator targett
The target for gotos and for start_thread nodes.
static instructiont make_skip(const source_locationt &l=source_locationt::nil())
instructiont(goto_program_instruction_typet __type)
codet representation of a goto statement.
#define PRECONDITION(CONDITION)
void compute_location_numbers(unsigned &nr)
Compute location numbers.
goto_program_instruction_typet _type
bool is_backwards_goto() const
Returns true if the instruction is a backwards branch.
bool operator()(const A &a, const B &b) const
source_locationt _source_location
The location of the instruction in the source file.
bool equals(const instructiont &other) const
Syntactic equality: two instructiont are equal if they have the same type, code, guard,...
std::list< exprt > expressions_written(const goto_programt::instructiont &)
std::ostream & output(const namespacet &ns, const irep_idt &identifier, std::ostream &out) const
Output goto program to given stream.
bool has_condition() const
Does this instruction have a condition?
bool is_set_return_value() const
static instructiont make_atomic_begin(const source_locationt &l=source_locationt::nil())
goto_programt()
Constructor.
const irep_idt & id() const
bool is_end_function() const
void validate(const namespacet &ns, const validation_modet vm) const
Check that the goto program is well-formed.
std::vector< exprt > operandst
exprt::operandst argumentst
targett add_instruction(goto_program_instruction_typet type)
Adds an instruction of given type at the end.
const exprt & call_lhs() const
Get the lhs of a FUNCTION_CALL (may be nil)
const exprt & assign_rhs() const
Get the rhs of the assignment for ASSIGN.
A goto_instruction_codet representing the removal of a local variable going out of scope.
void set_target(targett t)
Sets the first (and only) successor for the usual case of a single target.
#define SINCE(year, month, day, msg)
exprt & return_value()
Get the return value of a SET_RETURN_VALUE instruction.
void compute_incoming_edges()
Compute for each instruction the set of instructions it is a successor of.
nonstd::optional< T > optionalt
void turn_into_assume()
Transforms either an assertion or a GOTO instruction into an assumption, with the same condition.
std::list< targett > targetst
void clear()
Clear the goto program.
const exprt & return_value() const
Get the return value of a SET_RETURN_VALUE instruction.
void destructive_append(goto_programt &p)
Appends the given program p to *this. p is destroyed.
goto_program_instruction_typet
The type of an instruction in a GOTO program.
targett get_end_function()
Get an instruction iterator pointing to the END_FUNCTION instruction of the goto program.
void compute_location_numbers()
Compute location numbers.
static instructiont make_goto(targett _target, const exprt &g, const source_locationt &l=source_locationt::nil())
instructionst instructions
The list of instructions in the goto program.
unsigned target_number
A number to identify branch targets.
goto_programt & operator=(goto_programt &&other)
goto_instruction_codet representation of a "return from a function" statement.
std::set< targett > incoming_edges
const exprt & assign_lhs() const
Get the lhs of the assignment for ASSIGN.
unsigned location_number
A globally unique number to identify a program location.
targett insert_before(const_targett target, const instructiont &i)
Insertion before the instruction pointed-to by the given instruction iterator target.
targett const_cast_target(const_targett t)
Convert a const_targett to a targett - use with care and avoid whenever possible.
std::string as_string(const namespacet &ns, const irep_idt &function, const goto_programt::instructiont &)
symbol_exprt & dead_symbol()
Get the symbol for DEAD.
exprt & call_lhs()
Get the lhs of a FUNCTION_CALL (may be nil)
exprt & assign_rhs_nonconst()
Get the rhs of the assignment for ASSIGN.
static instructiont make_incomplete_goto(const source_locationt &l=source_locationt::nil())
exprt guard
Guard for gotos, assume, assert Use condition() method to access.
bool order_const_target(const goto_programt::const_targett i1, const goto_programt::const_targett i2)
unsigned loop_number
Number unique per function to identify loops.
A generic container class for the GOTO intermediate representation of one function.
std::ostream & operator<<(std::ostream &, goto_program_instruction_typet)
Outputs a string representation of a goto_program_instruction_typet
targett insert_after(const_targett target)
Insertion after the instruction pointed-to by the given instruction iterator target.
instructionst::const_iterator const_targett
const irept & get_nil_irep()
const exprt & condition() const
Get the condition of gotos, assume, assert.
static instructiont make_assumption(const exprt &g, const source_locationt &l=source_locationt::nil())
std::list< const_targett > const_targetst
goto_programt & operator=(const goto_programt &)=delete
std::ostream & output_instruction(const namespacet &ns, const irep_idt &identifier, std::ostream &out, const instructionst::value_type &instruction) const
Output a single instruction.
void insert_before_swap(targett target)
Insertion that preserves jumps to "target".
void set_other(goto_instruction_codet &c)
Set the statement for OTHER.
static instructiont make_throw(const source_locationt &l=source_locationt::nil())
void for_each_instruction(GotoFunctionT &&goto_function, HandlerT handler)
const exprt & return_value() const
A goto_instruction_codet representing an assignment in the program.
bool is_start_thread() const
The Boolean constant true.
bool is_function_call() const
std::set< irep_idt > decl_identifierst
This class represents an instruction in the GOTO intermediate representation.
bool is_target() const
Is this node a branch target?
const code_returnt & to_code_return(const goto_instruction_codet &code)
static const unsigned nil_target
Uniquely identify an invalid target or location.
static instructiont make_location(const source_locationt &l)
const exprt & call_function() const
Get the function that is called for FUNCTION_CALL.
targett get_target() const
Returns the first (and only) successor for the usual case of a single target.
void swap(goto_programt &program)
Swap the goto program.
static instructiont make_assignment(exprt lhs, exprt rhs, const source_locationt &l=source_locationt::nil())
Create an assignment instruction.
instructionst::iterator targett
static instructiont make_incomplete_goto(const exprt &_cond, const source_locationt &l=source_locationt::nil())
const code_assignt & to_code_assign(const goto_instruction_codet &code)
std::size_t operator()(const goto_programt::const_targett t) const
static instructiont make_catch(const source_locationt &l=source_locationt::nil())
static instructiont make_atomic_end(const source_locationt &l=source_locationt::nil())
Data structure for representing an arbitrary statement in a program.