Skip to content

Commit

Permalink
1) Created a class dedicated to Parameters, and give it in/out attrib…
Browse files Browse the repository at this point in the history
…ute.

2) Moved all parameter generation/output/configuration logic to class Parameter.
3) Made validate_test_suite.pl more robust and more debuggable.
4) Updated test suite baseline (they are generated with a 32-bit csmith.exe)
5) Code cleaning.
  • Loading branch information
jxyang committed Jun 28, 2015
1 parent d504dc0 commit 19bae2a
Show file tree
Hide file tree
Showing 50 changed files with 30,718 additions and 32,379 deletions.
21 changes: 16 additions & 5 deletions scripts/validate_test_suite.pl
@@ -1,6 +1,6 @@
#!/usr/bin/perl -w
##
## Copyright (c) 2015 Xuejun Yang
## Copyright (c) 2015-2016 Xuejun Yang
## All rights reserved.
##
## This file is part of `csmith', a random generator of C programs.
Expand Down Expand Up @@ -96,8 +96,18 @@ ($)
}

for (my $j=$header_len; $j< scalar(@lines2); $j++) {
if ($lines[$j] =~ /statistics/) {
last;
}

# convert to unix-style line ending
$lines[$j] =~ s/\r\n$/\n/;
$lines2[$j] =~ s/\r\n$/\n/;

if ($lines[$j] ne $lines2[$j]) {
print "Generated program has wrong content with $cmd\n";
print "line $j in base: <$lines[$j]>\n";
print "line $j in generated: <$lines2[$j]>\n";
return 0;
}
}
Expand All @@ -114,15 +124,16 @@ ()
print $file . "\n";
$cnt++;
if (!validate_test($file)) {
$fail++;
if ($UPDATE) {
copy("tmp.c", $file);
}
$fail++;
last;
} else {
last;
}
}
}
unlink("tmp.c");
print "$fail out of $cnt test cases in the suite ". $UPDATE ? "updated" : "failed" . "\n";
print "$fail out of $cnt test cases in the suite ". ($UPDATE ? "updated" : "failed") . "\n";
}

########################### main ##################################
Expand Down
13 changes: 0 additions & 13 deletions src/AbsExtension.cpp
Expand Up @@ -75,19 +75,6 @@ AbsExtension::MakeFuncInvocation(Function *func, std::vector<ExtensionValue *> &
return fi;
}

void
AbsExtension::GenerateFirstParameterList(Function &curFunc, std::vector<ExtensionValue *> &values)
{
vector<ExtensionValue *>::iterator i;
for (i = values.begin(); i != values.end(); ++i) {
assert(*i);
CVQualifiers qfer = (*i)->get_qfer();
Variable * v = VariableSelector::GenerateParameterVariable((*i)->get_type(), &qfer);
assert(v);
curFunc.param.push_back(v);
}
}

void
AbsExtension::default_output_definitions(ostream &out, std::vector<ExtensionValue *> &values, bool init_flag)
{
Expand Down
2 changes: 0 additions & 2 deletions src/AbsExtension.h
Expand Up @@ -58,8 +58,6 @@ class AbsExtension {

void Initialize(unsigned int num, std::vector<ExtensionValue *> &values);

void GenerateFirstParameterList(Function &curfunc, std::vector<ExtensionValue *> &values);

FunctionInvocation *MakeFuncInvocation(Function *func, std::vector<ExtensionValue *> &values);

protected:
Expand Down
5 changes: 3 additions & 2 deletions src/Block.cpp
Expand Up @@ -57,6 +57,7 @@
#include "CFGEdge.h"
#include "Expression.h"
#include "VectorFilter.h"
#include "Parameter.h"

using namespace std;

Expand Down Expand Up @@ -461,8 +462,8 @@ bool
Block::is_var_on_stack(const Variable* var) const
{
size_t i;
for (i=0; i<func->param.size(); i++) {
if (func->param[i]->match(var)) {
for (i=0; i<func->params.size(); i++) {
if (func->params[i]->match(var)) {
return true;
}
}
Expand Down
52 changes: 31 additions & 21 deletions src/Bookkeeper.cpp
Expand Up @@ -181,27 +181,29 @@ Bookkeeper::output_stmts_statistics(std::ostream &out)
void
Bookkeeper::output_statistics(std::ostream &out)
{
output_struct_union_statistics(out);
out << endl;
output_expr_statistics(out);
out << endl;
output_pointer_statistics(out);
out << endl;
output_volatile_access_statistics(out);
out << endl;
output_jump_statistics(out);
out << endl;
output_stmts_statistics(out);
out << endl;
output_var_freshness(out);
if (rely_on_int_size) {
out << "FYI: the random generator makes assumptions about the integer size. See ";
out << PLATFORM_CONFIG_FILE << " for more details." << endl;
}
if (rely_on_ptr_size) {
out << "FYI: the random generator makes assumptions about the pointer size. See ";
out << PLATFORM_CONFIG_FILE << " for more details." << endl;
}
output_struct_union_statistics(out);
out << endl;
output_expr_statistics(out);
out << endl;
output_pointer_statistics(out);
out << endl;
output_volatile_access_statistics(out);
out << endl;
output_jump_statistics(out);
out << endl;
output_stmts_statistics(out);
out << endl;
output_var_freshness(out);
if (rely_on_int_size) {
out << "FYI: the random generator makes assumptions about the integer size. See ";
out << PLATFORM_CONFIG_FILE << " for more details." << endl;
}
if (rely_on_ptr_size) {
out << "FYI: the random generator makes assumptions about the pointer size. See ";
out << PLATFORM_CONFIG_FILE << " for more details." << endl;
}
// TODO: dump random sequence for easier debugging
//output_random_sequence(out);
}

void
Expand Down Expand Up @@ -537,6 +539,14 @@ Bookkeeper::output_counters(std::ostream &out, const char* prefix_msg,
}
}

void
Bookkeeper::output_random_sequence(std::ostream &out)
{
string seq;
get_sequence(seq);
out << "random sequence used by this generation: " + seq;
}

void incr_counter(std::vector<int>& counters, int pos)
{
size_t len = counters.size();
Expand Down
2 changes: 2 additions & 0 deletions src/Bookkeeper.h
Expand Up @@ -86,6 +86,8 @@ class Bookkeeper

static void output_var_freshness(std::ostream &out);

static void output_random_sequence(std::ostream &out);

static void stat_expr_depths_for_stmt(const Statement* s);
static void stat_expr_depths(void);

Expand Down
4 changes: 2 additions & 2 deletions src/CGContext.cpp
Expand Up @@ -485,8 +485,8 @@ CGContext::find_variable_scope(const Variable* var) const
assert(func);

int i;
for (i=0; i<(int)func->param.size(); i++) {
if (func->param[i]->match(var)) {
for (i=0; i<(int)func->params.size(); i++) {
if (func->params[i]->match(var)) {
return 0;
}
}
Expand Down
4 changes: 2 additions & 2 deletions src/ExpressionVariable.cpp
Expand Up @@ -73,12 +73,12 @@ ExpressionVariable::make_random(CGContext &cg_context, const Type* type, const C
continue;
// forbid a parameter to take the address of an argument
// this is to simplify the path shortcutting delta
if (as_param && var->is_argument() && var->type->is_dereferenced_from(type)) {
if (as_param && var->is_param() && var->type->is_dereferenced_from(type)) {
continue;
}
if (!CGOptions::addr_taken_of_locals()
&& var->type->is_dereferenced_from(type)
&& (var->is_argument() || var->is_local())) {
&& (var->is_param() || var->is_local())) {
continue;
}

Expand Down
3 changes: 2 additions & 1 deletion src/ExtensionMgr.cpp
Expand Up @@ -37,6 +37,7 @@
#include "CoverageTestExtension.h"
#include "ExtensionValue.h"
#include "Function.h"
#include "Parameter.h"
#include "FunctionInvocation.h"
#include "CGContext.h"

Expand Down Expand Up @@ -88,7 +89,7 @@ ExtensionMgr::GenerateFirstParameterList(Function &curFunc)
if (ExtensionMgr::extension_ == NULL)
return;
std::vector<ExtensionValue *> &values = ExtensionMgr::extension_->get_values();
ExtensionMgr::extension_->GenerateFirstParameterList(curFunc, values);
Parameter::GenerateParametersFromValues(curFunc, values);
}

void
Expand Down
9 changes: 5 additions & 4 deletions src/FactMgr.cpp
Expand Up @@ -58,6 +58,7 @@
#include "ExpressionVariable.h"
#include "Lhs.h"
#include "CFGEdge.h"
#include "Parameter.h"

using namespace std;

Expand Down Expand Up @@ -104,8 +105,8 @@ FactMgr::add_new_var_fact_and_update_inout_maps(const Block* blk, const Variable
void
FactMgr::add_param_facts(const vector<const Expression*>& param_values, FactVec& facts)
{
for (size_t i=0; i<func->param.size(); i++) {
const Variable* var = func->param[i];
for (size_t i=0; i<func->params.size(); i++) {
const Variable* var = func->params[i];
const Expression* value = param_values[i];
Lhs lhs(*var);
FactMgr::update_fact_for_assign(&lhs, value, facts);
Expand Down Expand Up @@ -329,7 +330,7 @@ FactMgr::caller_to_callee_handover(const FunctionInvocationUser* fiu, std::vecto
// move global facts and parameter facts to a separate "keep" list
for (i=0; i<len; i++) {
const Variable* v = inputs[i]->get_var();
if (v->is_global() || find_variable_in_set(func->param, v) >=0) {
if (v->is_global() || find_variable_in_set(func->params, v) >=0) {
keep_facts.push_back(inputs[i]);
inputs.erase(inputs.begin() + i);
i--;
Expand Down Expand Up @@ -743,7 +744,7 @@ FactMgr::sanity_check_map() const
const Variable* v = facts[i]->get_var();
if (!v->is_visible(stm->parent)) {
// exception: the input facts to a function body could include the parameter facts
if (stm->parent == 0 && find_variable_in_set(func->param, v) != -1) {
if (stm->parent == 0 && find_variable_in_set(func->params, v) != -1) {
continue;
}
//assert(0);
Expand Down
79 changes: 17 additions & 62 deletions src/Function.cpp
Expand Up @@ -60,6 +60,7 @@
#include "VectorFilter.h"
#include "ExtensionMgr.h"
#include "OutputMgr.h"
#include "Parameter.h"

using namespace std;

Expand Down Expand Up @@ -128,7 +129,7 @@ find_blk_for_var(const Variable* v)
for (i=0; i<FuncList.size(); i++) {
const Function* func = FuncList[i];
// for a parameter of a function, pretend it's a variable belongs to the top block
if (v->is_argument() && find_variable_in_set(func->param, v) != -1) {
if (v->is_param() && find_variable_in_set(func->params, v) != -1) {
return func->body;
}
for (j=0; j<func->blocks.size(); j++) {
Expand All @@ -145,8 +146,8 @@ bool
Function::is_var_on_stack(const Variable* var, const Statement* stm) const
{
size_t i;
for (i=0; i<param.size(); i++) {
if (param[i]->match(var)) {
for (i=0; i<params.size(); i++) {
if (params[i]->match(var)) {
return true;
}
}
Expand Down Expand Up @@ -321,56 +322,7 @@ Function::choose_func(vector<Function *> funcs,
f = Function::get_one_function(ok_funcs);
}
return f;
}

/*
*
*/
static unsigned int
ParamListProbability()
{
return rnd_upto(CGOptions::max_params());
}

static void
GenerateParameterListFromString(Function &currFunc, const string &params_string)
{
vector<string> vs;
StringUtils::split_string(params_string, vs, ",");
int params_cnt = vs.size();
assert((params_cnt > 0) && "Invalid params_string!");
if ((params_cnt == 1) && (vs[0] == "Void")) {
return;
}
for (int i = 0; i < params_cnt; i++) {
assert((vs[i] != "Void") && "Invalid parameter type!");
CVQualifiers qfer;
qfer.add_qualifiers(false, false);
const Type *ty = Type::get_type_from_string(vs[0]);
Variable *v = VariableSelector::GenerateParameterVariable(ty, &qfer);
assert(v);
currFunc.param.push_back(v);
}
}

/*
*
*/
static void
GenerateParameterList(Function &curFunc)
{
unsigned int max = ParamListProbability();

for (unsigned int i =0; i <= max; i++) {
// With some probability, choose a new random variable, or one from
// parentParams, parentLocals, or the globals list.
//
// Also, build the parent's link structure for this invocation and push
// it onto the back.
//
VariableSelector::GenerateParameterVariable(curFunc);
}
}
}

/*
*
Expand Down Expand Up @@ -416,7 +368,7 @@ Function::make_random_signature(const CGContext& cg_context, const Type* type, c
CVQualifiers ret_qfer = qfer==0 ? CVQualifiers::random_qualifiers(type, Effect::READ, cg_context, true)
: qfer->random_qualifiers(true, Effect::READ, cg_context);
f->rv = Variable::CreateVariable(rvname, type, NULL, &ret_qfer);
GenerateParameterList(*f);
Parameter::GenerateParameterList(*f);
FMList.push_back(new FactMgr(f));
if (CGOptions::inline_function() && rnd_flipcoin(InlineFunctionProb))
f->is_inlined = true;
Expand Down Expand Up @@ -495,13 +447,13 @@ OutputFormalParam(Variable *var, std::ostream *pOut)
void
Function::OutputFormalParamList(std::ostream &out)
{
if (param.size() == 0) {
if (params.size() == 0) {
assert(Type::void_type);
Type::void_type->Output(out);
} else {
param_first = true;
for_each(param.begin(),
param.end(),
for_each(params.begin(),
params.end(),
std::bind2nd(std::ptr_fun(OutputFormalParam), &out));
}
}
Expand Down Expand Up @@ -622,9 +574,9 @@ Function::GenerateBody(const CGContext &prev_context)
CGContext cg_context(this, prev_context.get_effect_context(), &effect_accum);
cg_context.extend_call_chain(prev_context);
FactMgr* fm = get_fact_mgr_for_func(this);
for (size_t i=0; i<param.size(); i++) {
if (param[i]->type->ptr_type != 0) {
fm->global_facts.push_back(FactPointTo::make_fact(param[i], FactPointTo::tbd_ptr));
for (size_t i=0; i<params.size(); i++) {
if (params[i]->type->ptr_type != 0) {
fm->global_facts.push_back(FactPointTo::make_fact(params[i], FactPointTo::tbd_ptr));
}
}
// Fill in the Function body.
Expand Down Expand Up @@ -747,7 +699,7 @@ Function::make_builtin_function(const string &function_string)
FactMgr* fm = new FactMgr(f);
FMList.push_back(fm);

GenerateParameterListFromString(*f, StringUtils::get_substring(v[2], '(', ')'));
Parameter::GenerateParametersFromString(*f, StringUtils::get_substring(v[2], '(', ')'));
f->GenerateBody(CGContext::get_empty_context());

// update global facts to merged facts at all possible function exits
Expand Down Expand Up @@ -879,7 +831,10 @@ Function::doFinalization(void)

Function::~Function()
{
param.clear();
for (size_t i=0; i<params.size(); i++)
delete params[i];

params.clear();

assert(stack.empty());

Expand Down

0 comments on commit 19bae2a

Please sign in to comment.