Skip to content

Commit 95cfeb5

Browse files
author
thk123
committed
Three way merge initial checkin
1 parent 4d2b065 commit 95cfeb5

File tree

4 files changed

+74
-27
lines changed

4 files changed

+74
-27
lines changed

src/analyses/ai.cpp

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -460,7 +460,7 @@ bool ai_baset::do_function_call(
460460
const statet &end_state=get_state(l_end);
461461

462462
locationt l_begin=goto_function.body.instructions.begin();
463-
const statet &start_state=get_state(l_begin);
463+
//const statet &start_state=get_state(l_begin);
464464

465465
if(end_state.is_bottom())
466466
return false; // function exit point not reachable
@@ -476,18 +476,40 @@ bool ai_baset::do_function_call(
476476

477477

478478
// Propagate those
479-
any_changes|=merge(get_state(l_call), l_end, l_return);
479+
//any_changes|=merge(get_state(l_call), l_end, l_return);
480480

481+
#if 0
481482
std::cout << "Function call " << f_it->first << " complete, modified symbols:" << std::endl;
482-
const auto &modified_symbols=get_modified_symbols(start_state, *tmp_state);
483+
#endif
484+
//const auto &modified_symbols=get_modified_symbols(start_state, *tmp_state);
483485

486+
#if 0
484487
for(const auto &modified_symbol:modified_symbols)
485488
{
486489
std::cout << "\t" << modified_symbol.get_identifier() << "\n";
487490
}
488491
std::cout << std::endl;
492+
#endif
493+
494+
// ------------
495+
// END_FUNCTION
496+
// ------------
497+
498+
// 3 way merge normally has BASE, LOCAL and REMOTE
499+
// We take the changes applied between BASE and REMOTE and re-apply them to
500+
// local
501+
// This would look like:
502+
// BASE: function_begin
503+
// REMOTE: function_end
504+
// LOCAL: function_call
505+
506+
507+
std::unique_ptr<statet> tmp_return_state(make_temporary_state(get_state(l_call)));
508+
tmp_return_state->merge_three_way_function_return(
509+
get_state(l_begin), get_state(l_end), ns);
489510

490-
restore_domain(modified_symbols, *tmp_state, get_state(l_return), ns);
511+
any_changes|=merge(*tmp_return_state, l_end, l_return);
512+
//restore_domain(modified_symbols, *tmp_state, get_state(l_return), ns);
491513
}
492514

493515
return any_changes;

src/analyses/ai.h

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,16 @@ class ai_domain_baset
105105
virtual bool ai_simplify_lhs(
106106
exprt &condition,
107107
const namespacet &ns) const;
108+
109+
virtual void merge_three_way_function_return(
110+
const ai_domain_baset &function_start,
111+
const ai_domain_baset &function_end,
112+
const namespacet &ns)
113+
{
114+
// Do nothing - the result of the merge is to take
115+
// all the changes in the "remote" version
116+
}
117+
108118
};
109119

110120
// don't use me -- I am just a base class
@@ -328,8 +338,6 @@ class ai_baset
328338

329339
virtual bool merge(const statet &src, locationt from, locationt to)=0;
330340

331-
virtual std::vector<symbol_exprt> get_modified_symbols(const statet &src, const statet &other)=0;
332-
virtual void restore_domain(std::vector<symbol_exprt> modified_symbols, const statet &source_domain, statet &target_domain, const namespacet ns)=0;
333341
// for concurrent fixedpoint
334342
virtual bool merge_shared(
335343
const statet &src,
@@ -416,18 +424,6 @@ class ait:public ai_baset
416424
static_cast<const domainT &>(src), from, to);
417425
}
418426

419-
std::vector<symbol_exprt> get_modified_symbols(const statet &src, const statet &other) override
420-
{
421-
return static_cast<const domainT &>(src).get_modified_symbols(
422-
static_cast<const domainT &>(other));
423-
}
424-
425-
void restore_domain(std::vector<symbol_exprt> modified_symbols, const statet &source_domain, statet &target_domain, const namespacet ns) override
426-
{
427-
static_cast<const domainT &>(source_domain).restore_domain(
428-
modified_symbols, static_cast<domainT &>(target_domain), ns);
429-
}
430-
431427
statet *make_temporary_state(const statet &s) override
432428
{
433429
return new domainT(static_cast<const domainT &>(s));

src/analyses/variable-sensitivity/variable_sensitivity_domain.cpp

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -529,16 +529,37 @@ bool variable_sensitivity_domaint::ignore_function_call_transform(
529529
};
530530

531531
return ignored_internal_function.find(function_id)!=
532-
ignored_internal_function.cend();
532+
ignored_internal_function.cend();
533533
}
534534

535-
void variable_sensitivity_domaint::restore_domain(std::vector<symbol_exprt> modified_symbols,
536-
variable_sensitivity_domaint &target,
537-
const namespacet &ns) const
535+
void variable_sensitivity_domaint::merge_three_way_function_return(
536+
const ai_domain_baset &function_start,
537+
const ai_domain_baset &function_end,
538+
const namespacet &ns)
539+
{
540+
// const variable_sensitivity_domaint &cast_function_call_site=
541+
// static_cast<const variable_sensitivity_domaint &>(function_call_site);
542+
543+
const variable_sensitivity_domaint &cast_function_start=
544+
static_cast<const variable_sensitivity_domaint &>(function_start);
545+
546+
const variable_sensitivity_domaint &cast_function_end=
547+
static_cast<const variable_sensitivity_domaint &>(function_end);
548+
549+
const std::vector<symbol_exprt> &modified_symbols=
550+
cast_function_start.get_modified_symbols(cast_function_end);
551+
552+
apply_domain(modified_symbols, cast_function_end, ns);
553+
}
554+
555+
void variable_sensitivity_domaint::apply_domain(
556+
std::vector<symbol_exprt> modified_symbols,
557+
const variable_sensitivity_domaint &source,
558+
const namespacet &ns)
538559
{
539560
for (const auto &symbol : modified_symbols)
540561
{
541-
auto value = abstract_state.eval(symbol, ns);
542-
target.abstract_state.assign(symbol, value, ns);
562+
auto value = source.abstract_state.eval(symbol, ns);
563+
this->abstract_state.assign(symbol, value, ns);
543564
}
544565
}

src/analyses/variable-sensitivity/variable_sensitivity_domain.h

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,20 +99,28 @@ class variable_sensitivity_domaint:public ai_domain_baset
9999
locationt from,
100100
locationt to);
101101

102+
void merge_three_way_function_return(
103+
const ai_domain_baset &function_start,
104+
const ai_domain_baset &function_end,
105+
const namespacet &ns) override;
106+
102107
bool ai_simplify(
103108
exprt &condition,
104109
const namespacet &ns) const override;
105110

106111
bool is_bottom() const override;
107112
bool is_top() const override;
108113

109-
virtual std::vector<symbol_exprt> get_modified_symbols(const variable_sensitivity_domaint &other) const
114+
std::vector<symbol_exprt> get_modified_symbols(const variable_sensitivity_domaint &other) const
110115
{
111116
return abstract_environmentt::modified_symbols(abstract_state, other.abstract_state);
112117
}
113118

114-
virtual void restore_domain(std::vector<symbol_exprt> modified_symbols,
115-
variable_sensitivity_domaint &target, const namespacet &ns) const;
119+
120+
virtual void apply_domain(
121+
std::vector<symbol_exprt> modified_symbols,
122+
const variable_sensitivity_domaint &target,
123+
const namespacet &ns);
116124

117125
private:
118126
void transform_function_call(

0 commit comments

Comments
 (0)