Skip to content

Commit dd6f389

Browse files
author
kroening
committed
Adding/extending support for ssa_exprt
git-svn-id: svn+ssh://svn.cprover.org/srv/svn/cbmc/trunk@6377 6afb6bc1-c8e4-404c-8f48-9ae832c5b171
1 parent bb2f51f commit dd6f389

File tree

8 files changed

+47
-10
lines changed

8 files changed

+47
-10
lines changed

src/goto-programs/graphml_goto_trace.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@ Author: Daniel Kroening
1212
#include <util/i2string.h>
1313
#include <util/arith_tools.h>
1414
#include <util/prefix.h>
15-
16-
#include <goto-symex/ssa_expr.h>
15+
#include <util/ssa_expr.h>
1716

1817
#include "graphml_goto_trace.h"
1918

src/goto-symex/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ SRC = symex_target.cpp symex_target_equation.cpp goto_symex.cpp \
44
symex_goto.cpp symex_builtin_functions.cpp slice.cpp symex_other.cpp \
55
slice_by_trace.cpp symex_decl.cpp symex_dead.cpp rewrite_union.cpp \
66
precondition.cpp postcondition.cpp symex_clean_expr.cpp \
7-
symex_dereference_state.cpp auto_objects.cpp ssa_expr.cpp \
7+
symex_dereference_state.cpp auto_objects.cpp \
88
symex_catch.cpp symex_start_thread.cpp symex_assign.cpp \
99
symex_throw.cpp symex_atomic_section.cpp memory_model.cpp \
1010
memory_model_sc.cpp partial_order_concurrency.cpp \

src/pointer-analysis/value_set_dereference.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ Author: Daniel Kroening, [email protected]
3232
#include <util/options.h>
3333
#include <util/pointer_predicates.h>
3434
#include <util/byte_operators.h>
35+
#include <util/ssa_expr.h>
3536

3637
#include <ansi-c/c_types.h>
3738
#include <ansi-c/c_typecast.h>
@@ -651,6 +652,8 @@ void value_set_dereferencet::valid_check(
651652
else if(symbol_expr.id()==ID_symbol)
652653
{
653654
const irep_idt identifier=
655+
is_ssa_expr(symbol_expr)?
656+
to_ssa_expr(symbol_expr).get_object_name():
654657
to_symbol_expr(symbol_expr).get_identifier();
655658

656659
const symbolt &symbol=ns.lookup(identifier);

src/util/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ SRC = arith_tools.cpp base_type.cpp cmdline.cpp config.cpp symbol_table.cpp \
2121
bv_arithmetic.cpp tempdir.cpp tempfile.cpp timer.cpp unicode.cpp \
2222
irep_ids.cpp byte_operators.cpp string2int.cpp file_util.cpp \
2323
memory_info.cpp pipe_stream.cpp irep_hash.cpp endianness_map.cpp \
24-
vtable.cpp
24+
vtable.cpp ssa_expr.cpp
2525

2626
INCLUDES= -I ..
2727

src/util/array_name.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ Author: Daniel Kroening, [email protected]
1010
#include "expr.h"
1111
#include "namespace.h"
1212
#include "symbol.h"
13+
#include "ssa_expr.h"
1314

1415
/*******************************************************************\
1516
@@ -34,6 +35,12 @@ std::string array_name(
3435

3536
return array_name(ns, expr.op0())+"[]";
3637
}
38+
else if(is_ssa_expr(expr))
39+
{
40+
const symbolt &symbol=
41+
ns.lookup(to_ssa_expr(expr).get_object_name());
42+
return "array `"+id2string(symbol.base_name)+"'";
43+
}
3744
else if(expr.id()==ID_symbol)
3845
{
3946
const symbolt &symbol=ns.lookup(expr);

src/util/pointer_offset_size.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ Author: Daniel Kroening, [email protected]
1717
#include "simplify_expr.h"
1818
#include "namespace.h"
1919
#include "symbol.h"
20+
#include "ssa_expr.h"
2021

2122
#include "pointer_offset_size.h"
2223

@@ -499,7 +500,13 @@ mp_integer compute_pointer_offset(
499500
const namespacet &ns)
500501
{
501502
if(expr.id()==ID_symbol)
502-
return 0;
503+
{
504+
if(is_ssa_expr(expr))
505+
return compute_pointer_offset(
506+
to_ssa_expr(expr).get_original_expr(), ns);
507+
else
508+
return 0;
509+
}
503510
else if(expr.id()==ID_index)
504511
{
505512
assert(expr.operands().size()==2);
File renamed without changes.

src/goto-symex/ssa_expr.h renamed to src/util/ssa_expr.h

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,34 @@ class ssa_exprt:public symbol_exprt
4444
return to_symbol_expr(ode.root_object()).get_identifier();
4545
}
4646

47+
inline const ssa_exprt get_l1_object() const
48+
{
49+
object_descriptor_exprt ode;
50+
ode.object()=get_original_expr();
51+
52+
ssa_exprt root(ode.root_object());
53+
root.set(ID_L0, get(ID_L0));
54+
root.set(ID_L1, get(ID_L1));
55+
root.update_identifier();
56+
57+
return root;
58+
}
59+
4760
inline const irep_idt get_l1_object_identifier() const
4861
{
49-
return build_identifier(
50-
get_original_expr(),
51-
get_level_0(),
52-
get_level_1(),
53-
irep_idt()); // intentionally blank
62+
#if 0
63+
return get_l1_object().get_identifier();
64+
#else
65+
// the above is the clean version, this is the fast one, making
66+
// use of internal knowledge about identifier names
67+
std::string l1_o_id=id2string(get_identifier());
68+
std::string::size_type fs_suffix=l1_o_id.find_first_of(".[#");
69+
70+
if(fs_suffix!=std::string::npos)
71+
l1_o_id.resize(fs_suffix);
72+
73+
return l1_o_id;
74+
#endif
5475
}
5576

5677
inline const irep_idt get_original_name() const

0 commit comments

Comments
 (0)