Skip to content

Commit 766b031

Browse files
authored
Merge pull request diffblue#4675 from romainbrenguier/refactor/byte_update_exprt
Document byte_update_exprt and rename non-const functions
2 parents 3fbbbea + 635ad8b commit 766b031

File tree

3 files changed

+41
-19
lines changed

3 files changed

+41
-19
lines changed

src/solvers/lowering/byte_operators.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1801,7 +1801,7 @@ static exprt lower_byte_update_struct(
18011801
array_typet{bv_typet{8}, src_size_opt.value()}};
18021802

18031803
byte_update_exprt bu = src;
1804-
bu.op() = lower_byte_extract(byte_extract_expr, ns);
1804+
bu.set_op(lower_byte_extract(byte_extract_expr, ns));
18051805

18061806
return lower_byte_extract(
18071807
byte_extract_exprt{
@@ -1919,7 +1919,7 @@ static exprt lower_byte_update_union(
19191919
"lower_byte_update of union of unknown size is not supported");
19201920

19211921
byte_update_exprt bu = src;
1922-
bu.op() = member_exprt{src.op(), max_comp_name, max_comp_type};
1922+
bu.set_op(member_exprt{src.op(), max_comp_name, max_comp_type});
19231923
bu.type() = max_comp_type;
19241924

19251925
return union_exprt{

src/util/byte_operators.h

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,11 @@ Author: Daniel Kroening, [email protected]
2020
#include "invariant.h"
2121
#include "std_expr.h"
2222

23-
/*! \brief TO_BE_DOCUMENTED
24-
*/
23+
/// Expression of type \c type extracted from some object \c op starting at
24+
/// position \c offset (given in number of bytes).
25+
/// The object can either be interpreted in big endian or little endian, which
26+
/// is reflected by the \c id of the expression which is either
27+
/// \c ID_byte_extract_big_endian or \c ID_byte_extract_little_endian
2528
class byte_extract_exprt:public binary_exprt
2629
{
2730
public:
@@ -69,8 +72,9 @@ inline byte_extract_exprt &to_byte_extract_expr(exprt &expr)
6972
irep_idt byte_extract_id();
7073
irep_idt byte_update_id();
7174

72-
/*! \brief TO_BE_DOCUMENTED
73-
*/
75+
/// Expression corresponding to \c op() where the bytes starting at
76+
/// position \c offset (given in number of bytes) have been updated with
77+
/// \c value.
7478
class byte_update_exprt : public ternary_exprt
7579
{
7680
public:
@@ -83,10 +87,26 @@ class byte_update_exprt : public ternary_exprt
8387
{
8488
}
8589

90+
DEPRECATED(SINCE(2019, 5, 21, "use set_op or as_const instead"))
8691
exprt &op() { return op0(); }
92+
DEPRECATED(SINCE(2019, 5, 21, "use set_offset or as_const instead"))
8793
exprt &offset() { return op1(); }
94+
DEPRECATED(SINCE(2019, 5, 21, "use set_value or as_const instead"))
8895
exprt &value() { return op2(); }
8996

97+
void set_op(exprt e)
98+
{
99+
op0() = std::move(e);
100+
}
101+
void set_offset(exprt e)
102+
{
103+
op1() = std::move(e);
104+
}
105+
void set_value(exprt e)
106+
{
107+
op2() = std::move(e);
108+
}
109+
90110
const exprt &op() const { return op0(); }
91111
const exprt &offset() const { return op1(); }
92112
const exprt &value() const { return op2(); }

src/util/simplify_expr.cpp

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1902,7 +1902,7 @@ bool simplify_exprt::simplify_byte_extract(byte_extract_exprt &expr)
19021902
expr.op().id() == ID_byte_update_big_endian) ||
19031903
(expr.id() == ID_byte_extract_little_endian &&
19041904
expr.op().id() == ID_byte_update_little_endian)) &&
1905-
expr.offset() == to_byte_update_expr(expr.op()).offset())
1905+
expr.offset() == to_byte_update_expr(as_const(expr).op()).offset())
19061906
{
19071907
const auto &op_byte_update = to_byte_update_expr(expr.op());
19081908

@@ -2057,20 +2057,22 @@ bool simplify_exprt::simplify_byte_extract(byte_extract_exprt &expr)
20572057

20582058
bool simplify_exprt::simplify_byte_update(byte_update_exprt &expr)
20592059
{
2060+
const byte_update_exprt &expr_const = expr;
20602061
// byte_update(byte_update(root, offset, value), offset, value2) =>
20612062
// byte_update(root, offset, value2)
20622063
if(
2063-
expr.id() == expr.op().id() &&
2064-
expr.offset() == to_byte_update_expr(expr.op()).offset() &&
2065-
expr.value().type() == to_byte_update_expr(expr.op()).value().type())
2064+
expr_const.id() == expr_const.op().id() &&
2065+
expr_const.offset() == to_byte_update_expr(expr_const.op()).offset() &&
2066+
expr_const.value().type() ==
2067+
to_byte_update_expr(expr_const.op()).value().type())
20662068
{
2067-
expr.op()=expr.op().op0();
2069+
expr.set_op(expr_const.op().op0());
20682070
return false;
20692071
}
20702072

2071-
const exprt &root=expr.op();
2072-
const exprt &offset=expr.offset();
2073-
const exprt &value=expr.value();
2073+
const exprt &root = expr_const.op();
2074+
const exprt &offset = expr_const.offset();
2075+
const exprt &value = expr_const.value();
20742076
const auto val_size = pointer_offset_bits(value.type(), ns);
20752077
const auto root_size = pointer_offset_bits(root.type(), ns);
20762078

@@ -2140,8 +2142,8 @@ bool simplify_exprt::simplify_byte_update(byte_update_exprt &expr)
21402142
plus_exprt new_offset(offset, compo_offset);
21412143
simplify_node(new_offset);
21422144
exprt new_value(with.new_value());
2143-
expr.offset().swap(new_offset);
2144-
expr.value().swap(new_value);
2145+
expr.set_offset(std::move(new_offset));
2146+
expr.set_value(std::move(new_value));
21452147
simplify_byte_update(expr); // do this recursively
21462148
return false;
21472149
}
@@ -2167,8 +2169,8 @@ bool simplify_exprt::simplify_byte_update(byte_update_exprt &expr)
21672169
plus_exprt new_offset(offset, index_offset);
21682170
simplify_node(new_offset);
21692171
exprt new_value(with.new_value());
2170-
expr.offset().swap(new_offset);
2171-
expr.value().swap(new_value);
2172+
expr.set_offset(std::move(new_offset));
2173+
expr.set_value(std::move(new_value));
21722174
simplify_byte_update(expr); // do this recursively
21732175
return false;
21742176
}
@@ -2235,7 +2237,7 @@ bool simplify_exprt::simplify_byte_update(byte_update_exprt &expr)
22352237
}
22362238

22372239
if(result_expr.is_nil())
2238-
result_expr=expr.op();
2240+
result_expr = as_const(expr).op();
22392241

22402242
exprt member_name(ID_member_name);
22412243
member_name.set(ID_component_name, component.get_name());

0 commit comments

Comments
 (0)