Skip to content

Commit

Permalink
Merge branch 'master' of github.com:csmith-project/csmith
Browse files Browse the repository at this point in the history
  • Loading branch information
regehr committed Oct 24, 2011
2 parents f1d7bfc + e3529f9 commit 85df3bc
Show file tree
Hide file tree
Showing 10 changed files with 41 additions and 4 deletions.
3 changes: 3 additions & 0 deletions src/Constant.h
Expand Up @@ -34,6 +34,7 @@

#include <ostream>
#include <string>
#include <vector>

#include "Expression.h"
#include "Type.h"
Expand Down Expand Up @@ -63,6 +64,8 @@ class Constant : public Expression

CVQualifiers get_qualifiers(void) const { return CVQualifiers(true, false);}

virtual void get_eval_to_subexps(vector<const Expression*>& subs) const {subs.push_back(this);}

Constant(const Type *t, const std::string &v);
explicit Constant(const Constant &c);
virtual ~Constant(void);
Expand Down
2 changes: 2 additions & 0 deletions src/Expression.h
Expand Up @@ -112,6 +112,8 @@ class Expression

virtual CVQualifiers get_qualifiers(void) const = 0;

virtual void get_eval_to_subexps(vector<const Expression*>& subs) const = 0;

virtual void get_called_funcs(std::vector<const FunctionInvocationUser*>& /*funcs*/ ) const {};

virtual const FunctionInvocation* get_invoke(void) const {return NULL;};
Expand Down
8 changes: 8 additions & 0 deletions src/ExpressionAssign.cpp
Expand Up @@ -112,6 +112,14 @@ ExpressionAssign::is_0_or_1(void) const
return assign->is_simple_assign() && assign->get_expr()->is_0_or_1();
}

void
ExpressionAssign::get_eval_to_subexps(vector<const Expression*>& subs) const
{
vector<const Expression*> exps;
get_lhs()->get_eval_to_subexps(exps);
subs.insert(subs.end(), exps.begin(), exps.end());
}

bool
ExpressionAssign::visit_facts(vector<const Fact*>& inputs, CGContext& cg_context) const
{
Expand Down
2 changes: 2 additions & 0 deletions src/ExpressionAssign.h
Expand Up @@ -55,6 +55,8 @@ class ExpressionAssign : public Expression

virtual CVQualifiers get_qualifiers(void) const;

virtual void get_eval_to_subexps(vector<const Expression*>& subs) const;

virtual const Type &get_type(void) const { return assign->get_lhs()->get_type();}

virtual void get_called_funcs(std::vector<const FunctionInvocationUser*>& funcs) const { assign->get_called_funcs(funcs);}
Expand Down
8 changes: 8 additions & 0 deletions src/ExpressionComma.cpp
Expand Up @@ -92,6 +92,14 @@ ExpressionComma::get_dereferenced_ptrs(void) const
return ptrs1;
}

void
ExpressionComma::get_eval_to_subexps(vector<const Expression*>& subs) const
{
vector<const Expression*> exps;
get_rhs()->get_eval_to_subexps(exps);
subs.insert(subs.end(), exps.begin(), exps.end());
}

void
ExpressionComma::Output(std::ostream &out) const
{
Expand Down
2 changes: 2 additions & 0 deletions src/ExpressionComma.h
Expand Up @@ -49,6 +49,8 @@ class ExpressionComma : public Expression

virtual CVQualifiers get_qualifiers(void) const { return rhs.get_qualifiers();}

virtual void get_eval_to_subexps(vector<const Expression*>& subs) const;

virtual const Type &get_type(void) const { return rhs.get_type();}

virtual void get_called_funcs(std::vector<const FunctionInvocationUser*>& funcs) const { lhs.get_called_funcs(funcs); rhs.get_called_funcs(funcs);}
Expand Down
2 changes: 2 additions & 0 deletions src/ExpressionFuncall.h
Expand Up @@ -58,6 +58,8 @@ class ExpressionFuncall : public Expression

virtual CVQualifiers get_qualifiers(void) const;

virtual void get_eval_to_subexps(vector<const Expression*>& subs) const {subs.push_back(this);}

virtual const FunctionInvocation* get_invoke(void) const { return &invoke; };

virtual const Type &get_type(void) const;
Expand Down
2 changes: 2 additions & 0 deletions src/ExpressionVariable.h
Expand Up @@ -59,6 +59,8 @@ class ExpressionVariable : public Expression

virtual CVQualifiers get_qualifiers(void) const;

virtual void get_eval_to_subexps(vector<const Expression*>& subs) const {subs.push_back(this);}

int get_indirect_level(void) const;

const Variable* get_var(void) const {return &var;};
Expand Down
14 changes: 10 additions & 4 deletions src/Lhs.cpp
Expand Up @@ -328,10 +328,16 @@ Lhs::visit_facts(vector<const Fact*>& inputs, CGContext& cg_context) const
if (!visit_indices(inputs, cg_context)) {
return false;
}
// avoid a.x = a.y where x and y are partially overlapping fields
if (cg_context.curr_rhs && cg_context.curr_rhs->term_type == eVariable) {
if (have_overlapping_fields(cg_context.curr_rhs, this, inputs)) {
return false;
// avoid a.x = a.y (or any RHS that evaluates to a.y) where x and y are partially overlapping fields
if (cg_context.curr_rhs) {
vector<const Expression*> subs;
cg_context.curr_rhs->get_eval_to_subexps(subs);
for (size_t i=0; i<subs.size(); i++) {
if (subs[i]->term_type == eVariable || subs[i]->term_type == eLhs) {
if (have_overlapping_fields(subs[i], this, inputs)) {
return false;
}
}
}
}

Expand Down
2 changes: 2 additions & 0 deletions src/Lhs.h
Expand Up @@ -59,6 +59,8 @@ class Lhs : public Expression

virtual CVQualifiers get_qualifiers(void) const;

virtual void get_eval_to_subexps(vector<const Expression*>& subs) const {subs.push_back(this);}

int get_indirect_level(void) const;

void get_lvars(const vector<const Fact*>& facts, vector<const Variable*>& vars) const;
Expand Down

0 comments on commit 85df3bc

Please sign in to comment.