void sh_shadform_fprint (FILE* stream, ap_environment_t* env, sh_shadform_t* f) { fprintf (stream, "\tor {\n"); if (f) { size_t i; ap_environment_t* nnenv; fprintf (stream, "\t\tnodes "); sh_env_fprint (stream, f->nodes); nnenv = ap_environment_alloc (env->var_of_dim, env->intdim, f->nodes->var_of_dim, f->nodes->realdim); fprintf (stream, "\t\tedges "); sh_edgeform_fprint (stream, f->nodes, f->eform, f->length_eform); fprintf (stream, ";\n"); fprintf (stream, "\t\tlabels "); sh_labelform_fprint (stream, env, f->nodes, f->pform, f->length_pform); fprintf (stream, ";\n"); fprintf (stream, "\t\tdata \t"); sh_dataform_fprint (stream, nnenv, f->dform, f->length_dform); fprintf (stream, ";\n"); fprintf (stream, "\t\twords "); sh_univform_fprint (stream, nnenv, f->uform, f->length_uform); fprintf (stream, ";\n"); } fprintf (stream, "\t};\n"); fflush (stream); }
void init(clang::Decl *D) { clang::FunctionDecl *FD = clang::dyn_cast<clang::FunctionDecl>(D); for (clang::FunctionDecl::param_iterator P = FD->param_begin(); P != FD->param_end(); ++P) { clang::ParmVarDecl *Parm = *P; const char *varName = Parm->getNameAsString().c_str(); clang::QualType ty = Parm->getType(); if (ty->isScalarType()) { char *s = strdup_e(varName); numerics.insert(s); printf("Tracking numeric paramater variable %s\n", s); } } dc = clang::cast<clang::DeclContext>(D); for (clang::DeclContext::specific_decl_iterator<clang::VarDecl> I(dc->decls_begin()), E(dc->decls_end()); I != E; ++I) { const clang::VarDecl *vd = *I; if (!isTrackedVar(vd)) continue; const char *varName = vd->getNameAsString().c_str(); clang::QualType ty = vd->getType(); if (ty->isScalarType()) { char *name = strdup_e(varName); numerics.insert(name); printf("Tracking numeric variable %s\n", name); } else if (ty->isArrayType()) { const clang::ArrayType *at = ty->getAsArrayTypeUnsafe(); const clang::ConstantArrayType *cat; if (!(cat = clang::dyn_cast<const clang::ConstantArrayType>(at))) { printf("Can't handle non-constant arrays (%s). Aborting\n", varName); exit(1); } char *name = strdup_e(varName); const unsigned long size = *cat->getSize().getRawData(); array2size[name] = size; printf("Tracking array variable %s\n", name); } } ap_var_t temp_ap_var_array[numerics.size()]; int i = 0; for (std::set<char *>::iterator it = numerics.begin(); it != numerics.end(); ++it) { temp_ap_var_array[i++] = (ap_var_t)(*it); } // Assuming integers only. The allocation copies the content of // temp_ap_var_array so its OK its local env = ap_environment_alloc(temp_ap_var_array, numerics.size(), NULL, 0); }
static void loop_example(void) { /* One integer vars, none real */ ap_var_t name_of_dim[] = { (ap_var_t)"x" }; env = ap_environment_alloc(&name_of_dim[0], 1, NULL,0); /* Set all as bottom because there are 'joins' before assignments */ ap_abstract1_t R[7], abs_temp; init_abstract_array(R, 7); int x; printf("Library %s, version %s\n", man->library, man->version); /* concrete: R[0] = {x ∈ Z} */ /* abstract: R[0] = Top */ R[0] = ap_abstract1_top(man, env); x = 7; /* R[1] = [x := 7]#R[0] = x ∈ [7, 7] */ R[1] = assign_const(R[0], "x", 7); fprintf(stdout, "R[1] (x := 7):\n"); ap_abstract1_fprint(stdout, man, &R[1]); Label0: /* R[2] = R[1] U R[4] */ R[2] = ap_abstract1_join(man, false, &R[1], &R[4]); // fprintf(stdout, "R[2] (join of R[1] and R[4]):\n"); // ap_abstract1_fprint(stdout, man, &R[2]); /* while (x < 1000) */ if (!(x < 1000)) goto Label1; /* Concrete: R[3] = intersect(R[2], {s | s(x) < 1000}) */ /* Abstract: R[3] = meet(R[2], [-inf, 999]) */ abs_temp = create_constraint1(); R[3] = ap_abstract1_meet(man, false, &R[2], &abs_temp); // fprintf(stdout,"Abstract value R[3] (meet of R[2] and x<1000):\n"); // ap_abstract1_fprint(stdout, man, &R[3]); ++x; /* Concrete: R[4] = [x := x+1]R[3] */ /* abstract: R[4] = R[3] + [1, 1] */ R[4] = assign_bin_exp(R[3], "x", "x", 1); /* End of while scope */ goto Label0; Label1: fprintf(stdout, "R[4] ([x:=x+1]R[3]):\n"); ap_abstract1_fprint(stdout, man, &R[4]); fprintf(stdout, "R[2] (join of R[1] and R[4]):\n"); ap_abstract1_fprint(stdout, man, &R[2]); /* Concrete: R[5] = intersect(R[2], {s | s(x) >= 1000}) */ /* Abstract: R[5] = meet(R[2], [1000, inf]) */ abs_temp = create_constraint2(); R[5] = ap_abstract1_meet(man, false, &R[2], &abs_temp); fprintf(stdout, "R[5]: meet(R[2], x >= 1000):\n"); ap_abstract1_fprint(stdout, man, &R[5]); if (!(x == 1000)) { /* Concrete: R[6] = intersect(R[5], x != 1000) */ /* Concrete: R[6] = intersect(R[5],x<=999) U intersect(R[5],x>=1001) */ /* Abstract: R[6] = Join(Meet(R[5],[-inf,999]),Meet(R[5],[1001,inf])) */ abs_temp = create_constraint3(); R[6] = ap_abstract1_meet(man, false, &R[5], &abs_temp); fprintf(stdout, "R[6]: Abstract value:\n"); ap_abstract1_fprint(stdout, man, &R[6]); printf("Unable to prove x == 1000!\n"); } }