5 # include <ctype.h> /* for isdigit */
6 # include "lclintMacros.nf"
9 # include "cgrammar_tokens.h"
11 # include "exprChecks.h"
12 # include "aliasChecks.h"
13 # include "exprNodeSList.h"
14 # include "exprData.i"
20 constraint constraint_copy (constraint c)
23 ret = constraint_makeNew();
32 bool constraint_resolve (/*@unused@*/ constraint c)
38 /*@special@*/ constraint constraint_makeNew (void)
39 /*@post:isnull result->t1, result->e1, result->c1@*/
40 /*@defines result->ar, result->post@*/
43 ret = dmalloc(sizeof (*ret) );
53 /*@out@*/ constraintTerm new_constraintTermExpr (void)
56 ret = dmalloc (sizeof (* ret ) );
61 constraintTerm exprNode_makeConstraintTerm (/*@only@*/ exprNode e)
63 constraintTerm ret = new_constraintTermExpr();
64 ret->loc = exprNode_getfileloc(e);
71 constraintTerm intLit_makeConstraintTerm (int i)
73 constraintTerm ret = new_constraintTermExpr();
74 ret->value.intlit = i;
75 ret->kind = INTLITERAL;
76 ret->loc = fileloc_undefined;
81 /*@special@*/ constraintExpr makeConstraintExpr (/*@only@*/ /*@notnull@*/ constraintTerm term)
82 /*@post:isnull result->e1@*/
83 /*@post:notnull result->t1@*/
84 /*@defines result->e1, result->t1, result->c1@, result->op*/
87 ret = dmalloc (sizeof (*ret) );
96 constraintExpr makeConstraintExprIntlit (int i)
99 ret = dmalloc (sizeof (*ret) );
100 ret->t1 = intLit_makeConstraintTerm (i);
109 /*@null@*/ constraint constraint_makeReadSafeExprNode ( exprNode po, exprNode ind)
111 constraint ret = constraint_makeNew();
113 po = exprNode_fakeCopy(po);
114 ind = exprNode_fakeCopy(ind);
115 printf ("Requires maxr(%s) >= %s\n", cstring_toCharsSafe (exprNode_unparse (po ) ),
116 cstring_toCharsSafe ( exprNode_unparse (ind) ) );
117 ret->t1 = exprNode_makeConstraintTerm(po);
121 term = exprNode_makeConstraintTerm (ind);
123 ret->e1 = makeConstraintExpr (term);
128 constraint constraint_makeWriteSafeExprNode (exprNode po, exprNode ind)
130 constraint ret = constraint_makeNew();
132 printf ("Requires maxw(%s) >= %s\n", cstring_toCharsSafe (exprNode_unparse (po ) ),
133 cstring_toCharsSafe( exprNode_unparse (ind) ) );
134 ret->t1 = exprNode_makeConstraintTerm(po);
138 term = exprNode_makeConstraintTerm(ind);
140 ret->e1 = makeConstraintExpr (term);
146 constraint constraint_makeReadSafeInt (exprNode t1, int index)
148 constraint ret = constraint_makeNew();
150 printf ("Ensures maxr((valueof(%s)) >= %d\n", cstring_toCharsSafe (exprNode_unparse (t1 ) ),
152 t1 = exprNode_fakeCopy(t1);
153 ret->t1 = exprNode_makeConstraintTerm(t1);
157 term = intLit_makeConstraintTerm(index);
159 ret->e1 = makeConstraintExpr (term);
161 /*make this refer to element after preconditions */
162 fileloc_incColumn (ret->t1->loc);
167 constraint constraint_makeEnsureMaxReadAtLeast (exprNode t1, exprNode t2, fileloc sequencePoint)
169 constraint ret = constraint_makeNew();
172 t1 = exprNode_fakeCopy (t1);
173 t2 = exprNode_fakeCopy (t2);
175 ret->t1 = exprNode_makeConstraintTerm(t1);
177 if (ret->t1->loc != NULL)
178 fileloc_free(ret->t1->loc);
180 ret->t1->loc = fileloc_copy (sequencePoint);
184 term = exprNode_makeConstraintTerm (t2);
186 ret->e1 = makeConstraintExpr (term);
188 /*make this refer to element after preconditions */
189 fileloc_incColumn (ret->t1->loc);
193 constraint constraint_makeEnsureMinReadAtMost (exprNode po, exprNode ind, fileloc sequencePoint)
195 constraint ret = constraint_makeNew();
198 po = exprNode_fakeCopy (po);
199 ind = exprNode_fakeCopy (ind);
201 ret->t1 = exprNode_makeConstraintTerm(po);
205 term = exprNode_makeConstraintTerm (ind);
207 ret->e1 = makeConstraintExpr (term);
209 /*make this refer to element after preconditions */
210 fileloc_incColumn (ret->t1->loc);
214 constraintExpr makePostOpInc (exprNode t1)
219 t1 = exprNode_fakeCopy (t1);
220 term = exprNode_makeConstraintTerm(t1);
221 ret = makeConstraintExpr (term);
224 ret->e1 = makeConstraintExprIntlit (1);
228 constraint constraint_makeSideEffectPostIncrement (exprNode t1, fileloc sequencePoint)
230 constraint ret = constraint_makeNew();
231 //constraintTerm term;
233 t1 = exprNode_fakeCopy(t1);
234 t2 = exprNode_fakeCopy(t1);
236 ret->t1 = exprNode_makeConstraintTerm(t1);
240 ret->e1 = makePostOpInc(t2);
242 fileloc_incColumn ( ret->t1->loc);
243 fileloc_incColumn ( ret->t1->loc);
248 void constraintType_print (constraintType c1)
271 printf ("NULLTERMINATED");
274 TPRINTF(("Unhandled value for constraintType"));
278 TPRINTF(("Unhandled value for constraintType"));
282 void constraintTerm_print (constraintTerm term)
286 llassert (term != NULL);
290 s = exprNode_unparse (term->value.expr);
291 printf(" %s", cstring_toCharsSafe(s) );
292 s = fileloc_unparse (term->loc);
293 printf("@ %s", cstring_toCharsSafe(s) );
298 char * buf = malloc (15);
299 /*@i1*/snprintf (buf, 14, "intliteral(%d)", term->value.intlit);
300 /*@i1*/ printf(" %s ", buf);
305 TPRINTF( ("Not Implemented\n"));
314 void arithType_print (arithType ar)
334 printf(" NONNEGATIVE ");
337 printf(" POSITIVE ");
344 void constraintExpr_print (constraintExpr ex)
346 llassert (ex != NULL);
347 constraintType_print (ex->c1 );
348 constraintTerm_print (ex->t1);
360 constraintExpr_print (ex->e1);
366 void constraint_print (constraint c)
374 printf("requires: ");
377 constraintType_print (c->c1);
378 constraintTerm_print (c->t1);
379 arithType_print(c->ar);
380 constraintExpr_print(c->e1);