7 # include "lclintMacros.nf"
10 # include "cgrammar_tokens.h"
12 # include "exprChecks.h"
13 # include "aliasChecks.h"
14 # include "exprNodeSList.h"
16 //# include "constraintExpr.h"
23 /*@access exprNode @*/
26 static /*@only@*/ constraintExpr constraintExpr_makeBinaryOpConstraintExprIntLiteral (/*@only@*/constraintExpr expr, int literal);
29 /*@only@*/ static constraintExpr
30 doSRefFixConstraintParamTerm (/*@only@*/ constraintExpr e, /*@temp@*/ /*@observer@*/ exprNodeList arglist) /*@modifies e@*/;
32 static /*@only@*/ constraintExpr
33 doFixResultTerm (/*@only@*/ constraintExpr e, /*@exposed@*/ exprNode fcnCall)
37 /*@special@*/ static constraintExpr constraintExpr_makeBinaryOp (void) /*@allocates result->data @*/ /*@sets result->kind @*/;
39 //constraintExpr constraintExpr_makeMaxSetConstraintExpr (constraintExpr c);
41 void constraintExpr_free (/*@only@*/ constraintExpr expr)
43 if (constraintExpr_isDefined(expr) )
48 constraintExprData_freeUnaryExpr(expr->data);
51 constraintExprData_freeBinaryExpr(expr->data);
54 constraintExprData_freeTerm(expr->data);
65 llcontbug(message("attempted to free null pointer in constraintExpr_free"));
69 bool constraintExpr_isLit (constraintExpr expr)
71 llassert (expr != NULL);
73 if (expr->kind == term)
75 constraintTerm term = constraintExprData_termGetTerm (expr->data);
76 if (constraintTerm_isIntLiteral (term) )
86 /*@only@*/ constraintExpr constraintExpr_propagateConstants (/*@only@*/ constraintExpr expr,
87 /*@out@*/ bool * propagate,
88 /*@out@*/ int *literal)
92 bool propagate1, propagate2;
93 int literal1, literal2;
94 constraintExprBinaryOpKind op;
105 llassert (expr != NULL);
107 // we simplify unaryExpr else where
108 if (expr->kind != binaryexpr)
111 op = constraintExprData_binaryExprGetOp (expr->data);
113 DPRINTF( (message("constraintExpr_propagateConstants: binaryexpr: %s", constraintExpr_unparse(expr) ) ) );
115 expr1 = constraintExprData_binaryExprGetExpr1(expr->data);
116 expr2 = constraintExprData_binaryExprGetExpr2(expr->data);
118 expr1 = constraintExpr_copy(expr1);
119 expr2 = constraintExpr_copy(expr2);
121 expr1 = constraintExpr_propagateConstants (expr1, &propagate1, &literal1);
122 expr2 = constraintExpr_propagateConstants (expr2, &propagate2, &literal2);
124 *propagate = propagate1 || propagate2;
125 *literal = literal1 + literal2;
127 if ( constraintExpr_isLit (expr1) && constraintExpr_isLit (expr2) )
130 t1 = constraintExpr_getValue (expr1);
131 t2 = constraintExpr_getValue (expr2);
134 constraintExpr_free (expr);
135 constraintExpr_free (expr1);
136 constraintExpr_free (expr2);
139 return (constraintExpr_makeIntLiteral ( (t1+t2) ));
140 else if (op == MINUS)
141 return (constraintExpr_makeIntLiteral ( (t1-t2) ));
149 if (constraintExpr_isLit (expr1) )
154 *literal += constraintExpr_getValue (expr1);
156 *literal -= constraintExpr_getValue (expr1);
158 constraintExpr_free(expr1);
159 constraintExpr_free(expr);
163 if (constraintExpr_isLit (expr2) )
168 *literal += constraintExpr_getValue (expr2);
170 *literal -= constraintExpr_getValue (expr2);
172 constraintExpr_free(expr2);
173 constraintExpr_free(expr);
177 DPRINTF( (message("constraintExpr_propagateConstants returning: %s", constraintExpr_unparse(expr) ) ) );
179 expr->data = constraintExprData_binaryExprSetExpr1 (expr->data, expr1);
180 expr->data = constraintExprData_binaryExprSetExpr2 (expr->data, expr2);
185 // constraintExpr constraintExpr_propagateConstantsBak (constraintExpr expr,
186 // /*@out@*/ bool * propagate,
187 // /*@out@*/ int *literal)
189 // constraintExpr expr1;
190 // constraintExpr expr2;
191 // bool propagate1, propagate2;
192 // int literal1, literal2;
194 // propagate1 = FALSE;
195 // propagate2 = FALSE;
200 // *propagate = FALSE;
203 // llassert (expr != NULL);
205 // // we simplify unaryExpr else where
206 // if (expr->kind == unaryExpr)
209 // if (expr->kind == term)
212 // if (constraintExpr_isLit (expr) )
215 // DPRINTF( (message("constraintExpr_propagateConstants: binaryexpr: %s", constraintExpr_unparse(expr) ) ) );
217 // expr1 = constraintExprData_binaryExprGetExpr1(expr->data);
218 // expr2 = constraintExprData_binaryExprGetExpr2(expr->data);
220 // expr1 = constraintExpr_propagateConstants (expr1, &propagate1, &literal1);
221 // expr2 = constraintExpr_propagateConstants (expr2, &propagate2, &literal2);
223 // expr->data = constraintExprData_binaryExprSetExpr1 (expr->data, expr1);
224 // expr->data = constraintExprData_binaryExprSetExpr2 (expr->data, expr2);
226 // *propagate = propagate1 || propagate2;
227 // *literal = literal1 + literal2;
229 // if ( constraintExpr_isLit (expr1) && constraintExpr_isLit (expr2) )
232 // t1 = constraintExpr_getValue (expr1);
233 // t2 = constraintExpr_getValue (expr2);
234 // *propagate = FALSE;
236 // if (constraintExprData_binaryExprGetOp (expr->data) == PLUS )
237 // return (constraintExpr_makeIntLiteral ( (t1+t2) ));
238 // else if (constraintExprData_binaryExprGetOp (expr->data) == MINUS)
239 // return (constraintExpr_makeIntLiteral ( (t1-t2) ));
244 // if (constraintExpr_isLit (expr1) )
247 // /*handle MINUS case right */
248 // *propagate = TRUE;
249 // *literal += constraintExpr_getValue (expr1);
256 // if (constraintExpr_isLit (expr2) )
258 // *propagate = TRUE;
260 // if (constraintExprData_binaryExprGetOp (expr->data) == PLUS )
261 // *literal += constraintExpr_getValue (expr2);
263 // *literal -= constraintExpr_getValue (expr2);
270 // DPRINTF( (message("constraintExpr_propagateConstants returning: %s", constraintExpr_unparse(expr) ) ) );
276 /*@only@*/ static constraintExpr constraintExpr_combineConstants (/*@only@*/ constraintExpr expr ) /*@modifies expr@*/
281 DPRINTF ( (message ("Before combine %s", constraintExpr_unparse(expr) ) ) );
282 expr = constraintExpr_propagateConstants (expr, &propagate, &literal);
291 ret = constraintExpr_makeBinaryOpConstraintExprIntLiteral (expr, literal);
295 DPRINTF ( (message ("After combine %s", constraintExpr_unparse(expr) ) ) );
300 static constraintExpr constraintExpr_alloc (void) /*@post:isnull result->data@*/
303 ret = dmalloc (sizeof (*ret) );
309 /*@only@*/ static constraintExprData copyExprData (/*@observer@*/ constraintExprData data, constraintExprKind kind)
311 constraintExprData ret;
312 llassert(constraintExprData_isDefined(data));
317 ret = constraintExprData_copyBinaryExpr(data);
320 ret = constraintExprData_copyUnaryExpr(data);
323 ret = constraintExprData_copyTerm(data);
331 constraintExpr constraintExpr_copy (constraintExpr expr)
334 ret = constraintExpr_alloc();
335 ret->kind = expr->kind;
337 ret->data = copyExprData (expr->data, expr->kind);
342 /*@only@*/ static constraintExpr oldconstraintExpr_makeTermExprNode (/*@exposed@*/ exprNode e)
346 ret = constraintExpr_alloc();
348 ret->data = dmalloc (sizeof *(ret->data) );
349 t = constraintTerm_makeExprNode (e);
350 ret->data = constraintExprData_termSetTerm (ret->data, t);
354 constraintExpr constraintExpr_makeExprNode (/*@exposed@*/ exprNode e)
357 constraintExpr ret, ce1, ce2;
363 llassert (e != NULL);
370 t = exprData_getSingle (data);
371 s = exprNode_getSref (t);
372 if (sRef_isFixedArray(s) )
376 size = (int) sRef_getArraySize(s);
377 ret = constraintExpr_makeIntLiteral (size);
381 DPRINTF ((message ("could not determine the size of %s", exprNode_unparse (e) ) ) );
382 ret = oldconstraintExpr_makeTermExprNode (e);
387 DPRINTF ((message ("Examining operation %s", exprNode_unparse (e) ) ) );
388 t1 = exprData_getOpA (data);
389 t2 = exprData_getOpB (data);
390 tok = exprData_getOpTok (data);
392 if (lltok_isPlus_Op (tok) || lltok_isMinus_Op (tok) )
394 ce1 = constraintExpr_makeExprNode (t1);
395 ce2 = constraintExpr_makeExprNode (t2);
396 ret = constraintExpr_parseMakeBinaryOp (ce1, tok, ce2);
400 ret = oldconstraintExpr_makeTermExprNode (e);
404 t = exprData_getUopNode (data);
405 ret = constraintExpr_makeExprNode (t);
409 t = exprData_getUopNode (data);
410 tok = exprData_getUopTok (data);
411 if (lltok_isInc_Op (tok) )
414 temp = constraintExpr_makeExprNode(t);
415 ret = constraintExpr_makeIncConstraintExpr(temp);
417 else if (lltok_isDec_Op (tok) )
420 temp = constraintExpr_makeExprNode(t);
421 ret = constraintExpr_makeDecConstraintExpr(temp);
424 ret = oldconstraintExpr_makeTermExprNode (e);
428 t = exprData_getUopNode (data);
429 ret = constraintExpr_makeExprNode (t);
432 t = exprData_getCastNode (data);
433 ret = constraintExpr_makeExprNode (t);
436 t = exprData_getPairA(data);
437 ret = constraintExpr_makeExprNode(t);
438 /*@i3434*/ /*I'm not sure if this is right. I'm adding a break to quite LCLint*/
441 ret = oldconstraintExpr_makeTermExprNode (e);
448 /*@only@*/ static constraintExpr constraintExpr_makeTermExprNode (/*@exposed@*/ exprNode e)
450 return oldconstraintExpr_makeTermExprNode(e); //constraintExpr_makeExprNode (e);
453 constraintExpr constraintExpr_makeTerm (/*@only@*/ constraintTerm t)
457 ret = constraintExpr_alloc();
459 ret->data = dmalloc (sizeof *(ret->data) );
460 ret->data = constraintExprData_termSetTerm (ret->data, t);
465 constraintExpr constraintExpr_makeTermsRef ( sRef s)
469 ret = constraintExpr_alloc();
471 ret->data = dmalloc (sizeof *(ret->data) );
472 t = constraintTerm_makesRef (s);
473 ret->data = constraintExprData_termSetTerm (ret->data, t);
477 /*@special@*/ static constraintExpr makeUnaryOpGeneric (void) /*@allocates result->data@*/ /*@defines result->kind@*/
480 ret = constraintExpr_alloc();
481 ret->kind = unaryExpr;
482 ret->data = dmalloc ( sizeof *(ret->data) );
486 /*@only@*/ static constraintExpr constraintExpr_makeUnaryOpConstraintExpr (/*@only@*/ constraintExpr cexpr)
489 ret = makeUnaryOpGeneric();
493 ret->data = constraintExprData_unaryExprSetExpr (ret->data, cexpr);
494 ret->data = constraintExprData_unaryExprSetOp (ret->data, UNARYOP_UNDEFINED);
503 /*@only@*/ static constraintExpr constraintExpr_makeUnaryOp (/*@only@*/ constraintExpr cexpr, constraintExprUnaryOpKind Op )
506 ret = makeUnaryOpGeneric();
508 ret->data = constraintExprData_unaryExprSetExpr (ret->data, cexpr);
509 ret->data = constraintExprData_unaryExprSetOp (ret->data, Op);
515 static constraintExpr constraintExpr_makeMaxSetConstraintExpr (/*@only@*/ constraintExpr c)
518 ret = constraintExpr_makeUnaryOp (c, MAXSET);
523 static constraintExpr constraintExpr_makeUnaryOpExprNode (/*@exposed@*/ exprNode expr)
527 sub = constraintExpr_makeExprNode (expr);
528 ret = constraintExpr_makeUnaryOpConstraintExpr(sub);
536 static constraintExpr constraintExpr_makeSRefUnaryOp (/*@exposed@*/ sRef s, constraintExprUnaryOpKind op)
541 t = constraintExpr_makeTermsRef (s);
542 ret = constraintExpr_makeUnaryOpConstraintExpr (t);
543 ret->data = constraintExprData_unaryExprSetOp (ret->data, op);
549 constraintExpr constraintExpr_makeSRefMaxRead(/*@exposed@*/ sRef s)
551 return (constraintExpr_makeSRefUnaryOp (s, MAXREAD) );
555 constraintExpr constraintExpr_makeSRefMaxset (/*@exposed@*/ sRef s)
557 return (constraintExpr_makeSRefUnaryOp (s, MAXSET) );
561 constraintExpr constraintExpr_parseMakeUnaryOp (lltok op, constraintExpr cexpr)
564 ret = constraintExpr_makeUnaryOpConstraintExpr ( cexpr);
569 ret->data = constraintExprData_unaryExprSetOp (ret->data, MAXSET);
572 ret->data = constraintExprData_unaryExprSetOp (ret->data, MAXREAD);
575 llfatalbug(message("Unhandled Operation in Constraint") );
581 constraintExpr constraintExpr_makeMaxSetExpr (/*@exposed@*/ exprNode expr)
584 ret = constraintExpr_makeExprNode (expr);
586 ret = constraintExpr_makeMaxSetConstraintExpr (ret);
588 llassert (ret != NULL);
593 constraintExpr constraintExpr_makeMaxReadExpr (exprNode expr)
596 ret = constraintExpr_makeUnaryOpExprNode(expr);
597 ret->data = constraintExprData_unaryExprSetOp (ret->data, MAXREAD);
602 /*@unused@*/ constraintExpr constraintExpr_makeMinSetExpr (/*@exposed@*/ exprNode expr)
605 ret = constraintExpr_makeUnaryOpExprNode(expr);
606 ret->data = constraintExprData_unaryExprSetOp (ret->data, MINSET);
611 /*@unused@*/ constraintExpr constraintExpr_makeMinReadExpr (/*@exposed@*/ exprNode expr)
614 ret = constraintExpr_makeUnaryOpExprNode(expr);
615 ret->data = constraintExprData_unaryExprSetOp (ret->data, MINREAD);
621 constraintExpr constraintExpr_makeValueExpr (/*@exposed@*/ exprNode expr)
624 ret = constraintExpr_makeExprNode (expr);
629 constraintExpr constraintExpr_makeIntLiteral (int i)
633 ret = constraintExpr_alloc();
635 ret->data = dmalloc (sizeof *(ret->data) );
636 t = constraintTerm_makeIntLiteral (i);
637 ret->data = constraintExprData_termSetTerm (ret->data, t);
642 constraintExpr constraintExpr_makeValueInt (int i)
644 return constraintExpr_makeIntLiteral (i);
649 /*@special@*/ static constraintExpr constraintExpr_makeBinaryOp (void) /*@allocates result->data @*/ /*@sets result->kind @*/
652 ret = constraintExpr_alloc();
653 ret->kind = binaryexpr;
654 ret->data = dmalloc ( sizeof *(ret->data) );
655 ret->data = constraintExprData_binaryExprSetOp (ret->data, BINARYOP_UNDEFINED);
660 static /*@only@*/ constraintExpr constraintExpr_makeBinaryOpConstraintExpr (/*@only@*/constraintExpr expr1, /*@only@*/ constraintExpr expr2)
665 ret = constraintExpr_makeBinaryOp();
666 ret->data = constraintExprData_binaryExprSetExpr1 (ret->data, expr1);
667 ret->data = constraintExprData_binaryExprSetExpr2 (ret->data, expr2);
668 ret->data = constraintExprData_binaryExprSetOp (ret->data, BINARYOP_UNDEFINED);
673 constraintExpr constraintExpr_parseMakeBinaryOp (/*@only@*/ constraintExpr expr1, lltok op,/*@only@*/ constraintExpr expr2)
676 ret = constraintExpr_makeBinaryOpConstraintExpr (expr1, expr2);
678 ret->data = constraintExprData_binaryExprSetOp(ret->data, PLUS);
679 else if (op.tok == TMINUS)
680 ret->data = constraintExprData_binaryExprSetOp(ret->data, MINUS);
689 /*@unused@*/ constraintExpr constraintExpr_makeBinaryOpExprNode (/*@exposed@*/ exprNode expr1, /*@exposed@*/ exprNode expr2)
692 constraintExpr sub1, sub2;
693 sub1 = constraintExpr_makeTermExprNode (expr1);
694 sub2 = constraintExpr_makeTermExprNode (expr2);
695 ret = constraintExpr_makeBinaryOpConstraintExpr(sub1, sub2);
700 constraintExpr constraintExpr_makeBinaryOpConstraintExprIntLiteral (/*@only@*/ constraintExpr expr, int literal)
703 constraintExpr constExpr;
705 constExpr = constraintExpr_makeIntLiteral (literal);
706 ret = constraintExpr_makeBinaryOpConstraintExpr (expr, constExpr);
707 ret->data = constraintExprData_binaryExprSetOp(ret->data, PLUS);
712 constraintExpr constraintExpr_makeDecConstraintExpr (/*@only@*/constraintExpr expr)
717 inc = constraintExpr_makeIntLiteral (1);
718 ret = constraintExpr_makeBinaryOpConstraintExpr (expr, inc);
719 ret->data = constraintExprData_binaryExprSetOp(ret->data, MINUS);
724 /*@only@*/ constraintExpr constraintExpr_makeSubtractExpr (/*@only@*/ constraintExpr expr, /*@only@*/ constraintExpr addent)
728 DPRINTF ( (message ("Making subtract expression") ) );
730 new = constraintExpr_makeBinaryOpConstraintExpr (expr, addent);
731 new->data = constraintExprData_binaryExprSetOp (new->data, MINUS);
736 constraintExpr constraintExpr_makeAddExpr (/*@only@*/
737 constraintExpr expr, /*@only@*/
738 constraintExpr addent)
742 DPRINTF ( (message ("Doing addTerm simplification") ) );
744 new = constraintExpr_makeBinaryOpConstraintExpr (expr, addent);
745 new->data = constraintExprData_binaryExprSetOp (new->data, PLUS);
751 constraintExpr constraintExpr_makeIncConstraintExpr (/*@only@*/ constraintExpr expr)
756 inc = constraintExpr_makeIntLiteral (1);
757 ret = constraintExpr_makeBinaryOpConstraintExpr (expr, inc);
758 ret->data = constraintExprData_binaryExprSetOp(ret->data, PLUS);
763 static cstring constraintExprUnaryOpKind_print (constraintExprUnaryOpKind op)
768 return message("MAXSET");
770 return message("MINSET");
772 return message("MAXREAD");
774 return message("MINREAD");
777 return message ("<(Unary OP OTHER>");
783 static cstring constraintExprBinaryOpKind_print (constraintExprBinaryOpKind op)
795 return message ("<binary OP Unknown>");
799 bool constraintExpr_similar (constraintExpr expr1, constraintExpr expr2)
801 constraintExprKind kind;
803 llassert (expr1 != NULL);
804 llassert (expr2 != NULL);
805 if (expr1->kind != expr2->kind)
813 return constraintTerm_similar (constraintExprData_termGetTerm(expr1->data),
814 constraintExprData_termGetTerm(expr2->data) );
815 /*@notreached@*/ break;
818 if (constraintExprData_unaryExprGetOp (expr1->data) != constraintExprData_unaryExprGetOp (expr2->data) )
821 return (constraintExpr_similar (
822 constraintExprData_unaryExprGetExpr (expr1->data),
823 constraintExprData_unaryExprGetExpr (expr2->data)
827 if (constraintExprData_binaryExprGetOp (expr1->data) != constraintExprData_binaryExprGetOp (expr2->data) )
830 if (! constraintExpr_similar (constraintExprData_binaryExprGetExpr1 (expr1->data),
831 constraintExprData_binaryExprGetExpr1 (expr2->data)) )
834 if (! constraintExpr_similar (constraintExprData_binaryExprGetExpr2 (expr1->data),
835 constraintExprData_binaryExprGetExpr2 (expr2->data)) )
850 bool constraintExpr_same (constraintExpr expr1, constraintExpr expr2)
852 constraintExprKind kind;
854 llassert (expr1 != NULL);
855 llassert (expr2 != NULL);
856 if (expr1->kind != expr2->kind)
864 return constraintTerm_similar (constraintExprData_termGetTerm(expr1->data),
865 constraintExprData_termGetTerm(expr2->data) );
866 /*@notreached@*/ break;
869 if (constraintExprData_unaryExprGetOp (expr1->data) != constraintExprData_unaryExprGetOp (expr2->data) )
872 return (constraintExpr_same (
873 constraintExprData_unaryExprGetExpr (expr1->data),
874 constraintExprData_unaryExprGetExpr (expr2->data)
879 if (constraintExprData_binaryExprGetOp (expr1->data) != constraintExprData_binaryExprGetOp (expr2->data) )
882 if (! constraintExpr_same (constraintExprData_binaryExprGetExpr1 (expr1->data),
883 constraintExprData_binaryExprGetExpr1 (expr2->data)) )
886 if (! constraintExpr_same (constraintExprData_binaryExprGetExpr2 (expr1->data),
887 constraintExprData_binaryExprGetExpr2 (expr2->data)) )
891 /*@notreached@*/ break;
902 bool constraintExpr_search (/*@observer@*/ constraintExpr c, /*@observer@*/ constraintExpr old)
905 constraintExprKind kind;
908 if ( constraintExpr_similar (c, old) )
910 DPRINTF((message ("Found %q",
911 constraintExpr_unparse(old)
923 temp = constraintExprData_unaryExprGetExpr (c->data);
924 ret = ret || constraintExpr_search (temp, old);
928 temp = constraintExprData_binaryExprGetExpr1 (c->data);
929 ret = ret || constraintExpr_search(temp, old);
931 temp = constraintExprData_binaryExprGetExpr2 (c->data);
932 ret = ret || constraintExpr_search(temp, old);
942 /*@only@*/ constraintExpr constraintExpr_searchandreplace (/*@only@*/ /*@unique@*/ constraintExpr c, constraintExpr old, constraintExpr new )
944 constraintExprKind kind;
947 if ( constraintExpr_similar (c, old) )
950 DPRINTF((message ("Replacing %s with %s",
951 constraintExpr_unparse(old), constraintExpr_unparse(new)
953 constraintExpr_free(c);
954 return constraintExpr_copy (new);
964 temp = constraintExprData_unaryExprGetExpr (c->data);
965 temp = constraintExpr_copy(temp);
966 temp = constraintExpr_searchandreplace (temp, old, new);
967 c->data = constraintExprData_unaryExprSetExpr (c->data, temp);
971 temp = constraintExprData_binaryExprGetExpr1 (c->data);
972 temp = constraintExpr_copy(temp);
973 temp = constraintExpr_searchandreplace (temp, old, new);
974 c->data = constraintExprData_binaryExprSetExpr1 (c->data, temp);
976 temp = constraintExprData_binaryExprGetExpr2 (c->data);
977 temp = constraintExpr_copy(temp);
978 temp = constraintExpr_searchandreplace (temp, old, new);
979 c->data = constraintExprData_binaryExprSetExpr2 (c->data, temp);
988 static constraintExpr constraintExpr_simplifyChildren (/*@returned@*/ constraintExpr c)
990 constraintExprKind kind;
1000 temp = constraintExprData_unaryExprGetExpr (c->data);
1001 temp = constraintExpr_copy(temp);
1002 temp = constraintExpr_simplify (temp);
1003 c->data = constraintExprData_unaryExprSetExpr (c->data, temp);
1006 DPRINTF((message("constraintExpr_simplfiyChildren: simplify binary expression: %s",constraintExpr_unparse(c) ) ) );
1007 temp = constraintExprData_binaryExprGetExpr1 (c->data);
1008 temp = constraintExpr_copy(temp);
1009 temp = constraintExpr_simplify (temp);
1011 c->data = constraintExprData_binaryExprSetExpr1 (c->data, temp);
1013 temp = constraintExprData_binaryExprGetExpr2 (c->data);
1014 temp = constraintExpr_copy(temp);
1015 temp = constraintExpr_simplify (temp);
1017 c->data = constraintExprData_binaryExprSetExpr2 (c->data, temp);
1027 constraintExpr constraintExpr_setFileloc (/*@returned@*/ constraintExpr c, fileloc loc) /*@modifies c->data @*/
1030 constraintExpr temp;
1032 llassert(c != NULL);
1037 t = constraintExprData_termGetTerm (c->data);
1038 t = constraintTerm_copy(t);
1039 t = constraintTerm_setFileloc (t, loc);
1040 c->data = constraintExprData_termSetTerm (c->data, t);
1044 temp = constraintExprData_binaryExprGetExpr1 (c->data);
1045 temp = constraintExpr_copy(temp);
1046 temp = constraintExpr_setFileloc (temp, loc);
1047 c->data = constraintExprData_binaryExprSetExpr1 (c->data, temp);
1049 temp = constraintExprData_binaryExprGetExpr2 (c->data);
1050 temp = constraintExpr_copy(temp);
1051 temp = constraintExpr_setFileloc (temp, loc);
1052 c->data = constraintExprData_binaryExprSetExpr2 (c->data, temp);
1055 temp = constraintExprData_unaryExprGetExpr (c->data);
1056 temp = constraintExpr_copy(temp);
1057 temp = constraintExpr_setFileloc (temp, loc);
1058 c->data = constraintExprData_unaryExprSetExpr (c->data, temp);
1064 static /*@only@*/ constraintExpr constraintExpr_simplifybinaryExpr (/*@only@*/constraintExpr c)
1066 constraintExpr e1, e2;
1068 e1 = constraintExprData_binaryExprGetExpr1 (c->data);
1069 e2 = constraintExprData_binaryExprGetExpr2 (c->data);
1071 if (constraintExpr_canGetValue (e1) && constraintExpr_canGetValue(e2) )
1075 i = constraintExpr_getValue(e1) + constraintExpr_getValue (e2);
1076 constraintExpr_free(c);
1077 c = constraintExpr_makeIntLiteral (i);
1084 this thing takes the lexpr and expr of a constraint and modifies lexpr
1085 and returns a (possiblly new) value for expr
1087 /* if lexpr is a binary express say x + y, we set lexpr to x and return a value for expr such as expr_old - y */
1089 /* the approach is a little Kludgy but seems to work. I should probably use something cleaner at some point ... */
1092 /*@only@*/ constraintExpr constraintExpr_solveBinaryExpr (constraintExpr lexpr, /*@only@*/ constraintExpr expr)
1094 constraintExpr expr1, expr2;
1095 constraintExprBinaryOpKind op;
1097 if (lexpr->kind != binaryexpr)
1100 expr2 = constraintExprData_binaryExprGetExpr2 (lexpr->data);
1101 expr1 = constraintExprData_binaryExprGetExpr1 (lexpr->data);
1103 op = constraintExprData_binaryExprGetOp (lexpr->data);
1105 expr1 = constraintExpr_copy(expr1);
1106 expr2 = constraintExpr_copy(expr2);
1108 #warning make sure this works
1110 lexpr->kind = expr1->kind;
1113 lexpr->data = copyExprData (expr1->data, expr1->kind);
1117 expr = constraintExpr_makeSubtractExpr (expr, expr2);
1118 else if (op == MINUS)
1119 expr = constraintExpr_makeAddExpr (expr, expr2);
1127 #warning this needs to be checked
1128 expr = constraintExpr_solveBinaryExpr (expr1, expr);
1130 expr = constraintExpr_solveBinaryExpr (expr2, expr);
1135 static /*@only@*/ constraintExpr constraintExpr_simplifyunaryExpr (/*@only@*/ constraintExpr c)
1139 llassert (c->kind == unaryExpr);
1141 DPRINTF ( (message ("Doing constraintExpr_simplifyunaryExpr:%s", constraintExpr_unparse (c) ) ) );
1143 if ( (constraintExprData_unaryExprGetOp (c->data) != MAXSET) &&
1144 (constraintExprData_unaryExprGetOp (c->data) != MAXREAD) )
1148 // pattern mxr ( var + const) = mxr(var) - const
1150 exp = constraintExprData_unaryExprGetExpr (c->data);
1152 if (exp->kind == term)
1154 constraintTerm cterm;
1156 cterm = constraintExprData_termGetTerm (exp->data);
1158 if (constraintTerm_isStringLiteral(cterm) )
1161 val = constraintTerm_getStringLiteral (cterm);
1162 if (constraintExprData_unaryExprGetOp (c->data) == MAXSET)
1164 constraintExpr temp;
1166 temp = constraintExpr_makeIntLiteral ((int)strlen (val) );
1168 constraintExpr_free(c);
1171 if (constraintExprData_unaryExprGetOp (c->data) == MAXREAD)
1173 constraintExpr temp;
1175 temp = constraintExpr_makeIntLiteral ((int)strlen (val) );
1177 constraintExpr_free(c);
1185 if (exp->kind != binaryexpr)
1188 if (constraintExprData_binaryExprGetOp (exp->data) == PLUS )
1191 // if (constraintExpr_canGetValue (constraintExprData_binaryExprGetExpr2 (exp->data) ) )
1194 constraintExpr temp, temp2;
1196 DPRINTF ( (message ("Doing fancy simplification") ) );
1198 temp = constraintExprData_binaryExprGetExpr2 (exp->data);
1200 temp2 = constraintExprData_binaryExprGetExpr1 (exp->data);
1202 temp2 = constraintExpr_copy(temp2);
1203 c->data = constraintExprData_unaryExprSetExpr (c->data, temp2);
1206 temp = constraintExpr_copy (temp);
1208 c = constraintExpr_makeSubtractExpr (c, temp);
1210 DPRINTF ( (message ("Done fancy simplification:%s", constraintExpr_unparse (c) ) ) );
1214 DPRINTF ( (message ("Done simplification:%s", constraintExpr_unparse (c) ) ) );
1219 /*@only@*/ constraintExpr constraintExpr_simplify (/*@only@*/ constraintExpr c)
1221 constraintExprKind kind;
1225 DPRINTF ( (message ("Doing constraintExpr_simplify:%s", constraintExpr_unparse (c) ) ) );
1230 /*I think this is an LCLint bug */
1232 ret = constraintExpr_copy(c);
1234 constraintExpr_free(c);
1236 ret = constraintExpr_simplifyChildren (ret);
1238 ret = constraintExpr_combineConstants (ret);
1240 ret = constraintExpr_simplifyChildren (ret);
1248 t = constraintExprData_termGetTerm (ret->data);
1249 t = constraintTerm_copy(t);
1250 t = constraintTerm_simplify (t);
1251 ret->data = constraintExprData_termSetTerm (ret->data, t);
1254 ret = constraintExpr_simplifyunaryExpr (ret);
1257 ret = constraintExpr_simplifybinaryExpr (ret);
1263 DPRINTF ( (message ("constraintExpr_simplify returning :%s", constraintExpr_unparse (ret) ) ) );
1269 cstring constraintExpr_unparse (/*@temp@*/ /*@observer@*/ constraintExpr ex) /*@*/
1272 constraintExprKind kind;
1274 llassert (ex != NULL);
1281 st = message ("(%q) ", constraintTerm_print (constraintExprData_termGetTerm(ex->data) ) );
1284 st = message ("%q (%q)",
1285 constraintExprUnaryOpKind_print (constraintExprData_unaryExprGetOp (ex->data)
1287 constraintExpr_unparse (constraintExprData_unaryExprGetExpr (ex->data) )
1291 st = message ("(%q) %q (%q)",
1292 constraintExpr_unparse (constraintExprData_binaryExprGetExpr1 (ex->data) ),
1293 constraintExprBinaryOpKind_print (constraintExprData_binaryExprGetOp (ex->data)
1295 constraintExpr_unparse (constraintExprData_binaryExprGetExpr2 (ex->data) )
1300 st = message ("error");
1304 DPRINTF((message ("constraintExpr_unparse: '%s'",st) ) );
1308 constraintExpr constraintExpr_doSRefFixBaseParam (/*@returned@*/ constraintExpr expr, exprNodeList arglist)
1310 constraintTerm Term;
1311 constraintExprKind kind;
1312 constraintExpr expr1, expr2;
1313 constraintExprData data;
1314 llassert (expr != NULL);
1323 Term = constraintExprData_termGetTerm(data);
1324 Term = constraintTerm_copy(Term);
1326 Term = constraintTerm_doSRefFixBaseParam (Term, arglist);
1327 data = constraintExprData_termSetTerm(data, Term);
1330 expr1 = constraintExprData_unaryExprGetExpr (data);
1331 expr1 = constraintExpr_copy(expr1);
1333 expr1 = constraintExpr_doSRefFixBaseParam (expr1, arglist);
1334 data = constraintExprData_unaryExprSetExpr (data, expr1);
1337 expr1 = constraintExprData_binaryExprGetExpr1 (data);
1338 expr2 = constraintExprData_binaryExprGetExpr2 (data);
1340 expr1 = constraintExpr_copy(expr1);
1341 expr2 = constraintExpr_copy(expr2);
1343 expr1 = constraintExpr_doSRefFixBaseParam (expr1, arglist);
1344 data = constraintExprData_binaryExprSetExpr1 (data, expr1);
1345 expr2 = constraintExpr_doSRefFixBaseParam (expr2, arglist);
1346 data = constraintExprData_binaryExprSetExpr2 (data, expr2);
1356 /*@only@*/ constraintExpr constraintExpr_doSRefFixConstraintParam (/*@only@*/ constraintExpr expr, exprNodeList arglist) /*@modifies expr@*/
1358 constraintExprKind kind;
1359 constraintExpr expr1, expr2;
1360 constraintExprData data;
1361 llassert (expr != NULL);
1370 expr = doSRefFixConstraintParamTerm (expr, arglist);
1373 expr1 = constraintExprData_unaryExprGetExpr (data);
1374 expr1 = constraintExpr_copy(expr1);
1375 expr1 = constraintExpr_doSRefFixConstraintParam (expr1, arglist);
1376 data = constraintExprData_unaryExprSetExpr (data, expr1);
1379 expr1 = constraintExprData_binaryExprGetExpr1 (data);
1380 expr2 = constraintExprData_binaryExprGetExpr2 (data);
1382 expr1 = constraintExpr_copy(expr1);
1383 expr2 = constraintExpr_copy(expr2);
1385 expr1 = constraintExpr_doSRefFixConstraintParam (expr1, arglist);
1386 data = constraintExprData_binaryExprSetExpr1 (data, expr1);
1387 expr2 = constraintExpr_doSRefFixConstraintParam (expr2, arglist);
1388 data = constraintExprData_binaryExprSetExpr2 (data, expr2);
1398 /*@only@*/ constraintExpr constraintExpr_doFixResult (/*@only@*/ constraintExpr expr, exprNode fcnCall)
1400 constraintExprKind kind;
1401 constraintExpr expr1, expr2;
1402 constraintExprData data;
1403 llassert (expr != NULL);
1412 expr = doFixResultTerm (expr, fcnCall);
1415 expr1 = constraintExprData_unaryExprGetExpr (data);
1416 expr1 = constraintExpr_copy(expr1);
1418 expr1 = constraintExpr_doFixResult (expr1, fcnCall);
1419 data = constraintExprData_unaryExprSetExpr (data, expr1);
1422 expr1 = constraintExprData_binaryExprGetExpr1 (data);
1423 expr2 = constraintExprData_binaryExprGetExpr2 (data);
1425 expr1 = constraintExpr_copy(expr1);
1426 expr2 = constraintExpr_copy(expr2);
1428 expr1 = constraintExpr_doFixResult (expr1, fcnCall);
1429 data = constraintExprData_binaryExprSetExpr1 (data, expr1);
1430 expr2 = constraintExpr_doFixResult (expr2, fcnCall);
1431 data = constraintExprData_binaryExprSetExpr2 (data, expr2);
1441 cstring constraintExpr_print (constraintExpr expr) /*@*/
1443 return constraintExpr_unparse(expr);
1446 bool constraintExpr_hasMaxSet (constraintExpr expr) /*@*/
1450 t = constraintExpr_unparse(expr);
1452 if (strstr (t, "MAXSET") != NULL )
1466 /*returns 1 0 -1 like strcmp
1471 int constraintExpr_compare (constraintExpr expr1, constraintExpr expr2)
1475 if (constraintExpr_similar (expr1, expr2) )
1479 value1 = constraintExpr_getValue(expr1);
1480 value2 = constraintExpr_getValue(expr2);
1482 if (value1 > value2)
1485 if (value1 == value2)
1492 int constraintExpr_getValue (constraintExpr expr)
1494 llassert (expr->kind == term);
1495 return (constraintTerm_getValue (constraintExprData_termGetTerm (expr->data) ) );
1498 bool constraintExpr_canGetValue (constraintExpr expr)
1503 return constraintTerm_canGetValue (constraintExprData_termGetTerm (expr->data) );
1512 fileloc constraintExpr_getFileloc (constraintExpr expr)
1516 constraintExprKind kind;
1523 t = constraintExprData_termGetTerm (expr->data);
1524 return (constraintTerm_getFileloc (t) );
1528 e = constraintExprData_unaryExprGetExpr (expr->data);
1529 return (constraintExpr_getFileloc (e) );
1533 e = constraintExprData_binaryExprGetExpr1 (expr->data);
1534 return (constraintExpr_getFileloc (e) );
1539 return (fileloc_undefined);
1542 /*drl moved from constriantTerm.c 5/20/001*/
1543 static /*@only@*/ constraintExpr
1544 doFixResultTerm (/*@only@*/ constraintExpr e, /*@exposed@*/ exprNode fcnCall)
1548 /*maybe this should move to cosntraintExpr.c -drl7x 5/18/01*/
1549 /*@i22*/ constraintExprData data = e->data;
1551 /*@i22*/constraintExprKind kind = e->kind;
1555 llassert(kind == term);
1557 t = constraintExprData_termGetTerm (data);
1558 llassert (t != NULL);
1561 switch (constraintTerm_getKind(t) )
1569 s = constraintTerm_getSRef(t);
1570 if (sRef_isResult (s))
1572 ret = constraintExpr_makeExprNode(fcnCall);
1573 constraintExpr_free(e);
1589 /*drl moved from constriantTerm.c 5/20/001*/
1590 /*@only@*/ static constraintExpr
1591 doSRefFixConstraintParamTerm (/*@only@*/ constraintExpr e, /*@observer@*/ /*@temp@*/ exprNodeList arglist)
1595 constraintExprData data = e->data;
1597 constraintExprKind kind = e->kind;
1601 llassert(kind == term);
1603 t = constraintExprData_termGetTerm (data);
1604 llassert (t != NULL);
1607 /*@i1*/ switch (t->kind)
1610 DPRINTF((message ("%q @ %q ", constraintTerm_print(t),
1611 fileloc_unparse (constraintTerm_getFileloc(t) ) ) ));
1614 DPRINTF((message (" %q ", constraintTerm_print (t)) ));
1618 DPRINTF (( message("Doing sRef_fixConstraintParam for %q ",
1619 constraintTerm_print (t) ) ));
1620 ret = sRef_fixConstraintParam (t->value.sref, arglist);
1622 constraintExpr_free(e);
1624 DPRINTF (( message("After Doing sRef_fixConstraintParam constraintExpr is %q ",
1625 constraintExpr_print (ret) ) ));
1635 /* bool constraintExpr_includesTerm (constraintExpr expr, constraintTerm term) */
1637 /* if (constraintTerm_hasTerm (expr->term, term) ) */
1640 /* if ( (expr->expr) != NULL) */
1642 /* return ( constraintExpr_includesTerm (expr->expr, term) ); */
1648 /*drl added 6/11/01 */
1649 bool constraintExpr_isBinaryExpr (/*@observer@*/ constraintExpr c)
1651 if (c->kind == binaryexpr)
1658 static void binaryExpr_dump (/*@observer@*/ constraintExprData data, FILE *f)
1660 constraintExpr expr1;
1661 constraintExprBinaryOpKind binaryOp;
1662 constraintExpr expr2;
1665 binaryOp = constraintExprData_binaryExprGetOp (data);
1667 fprintf(f, "%d\n", (int) binaryOp);
1669 expr1 = constraintExprData_binaryExprGetExpr1 (data);
1670 expr2 = constraintExprData_binaryExprGetExpr2 (data);
1674 constraintExpr_dump(expr1, f);
1677 constraintExpr_dump(expr2, f);
1681 static constraintExpr binaryExpr_undump (FILE *f)
1683 constraintExpr expr1;
1684 constraintExprBinaryOpKind binaryOp;
1685 constraintExpr expr2;
1694 str = mstring_create (MAX_DUMP_LINE_LENGTH);
1696 str = fgets(os, MAX_DUMP_LINE_LENGTH, f);
1699 binaryOp = (constraintExprBinaryOpKind) getInt(&str);
1701 str = fgets(os, MAX_DUMP_LINE_LENGTH, f);
1703 checkChar (&str, 'e');
1704 checkChar (&str, '1');
1706 expr1 = constraintExpr_undump (f);
1708 str = fgets(os, MAX_DUMP_LINE_LENGTH, f);
1710 checkChar (&str, 'e');
1711 checkChar (&str, '2');
1713 expr2 = constraintExpr_undump (f);
1715 ret = constraintExpr_makeBinaryOpConstraintExpr (expr1, expr2);
1716 ret->data = constraintExprData_binaryExprSetOp(ret->data, binaryOp);
1724 static void unaryExpr_dump (/*@observer@*/ constraintExprData data, FILE *f)
1727 constraintExpr expr;
1728 constraintExprUnaryOpKind unaryOp;
1730 unaryOp = constraintExprData_unaryExprGetOp (data);
1732 fprintf(f, "%d\n", (int) unaryOp);
1734 expr = constraintExprData_unaryExprGetExpr (data);
1736 constraintExpr_dump(expr, f);
1739 static constraintExpr unaryExpr_undump ( FILE *f)
1742 constraintExpr expr;
1743 constraintExprUnaryOpKind unaryOp;
1749 str = mstring_create (MAX_DUMP_LINE_LENGTH);
1751 str = fgets(os, MAX_DUMP_LINE_LENGTH, f);
1753 unaryOp = (constraintExprUnaryOpKind) getInt(&str);
1755 expr = constraintExpr_undump (f);
1757 ret = constraintExpr_makeUnaryOp (expr, unaryOp);
1764 void constraintExpr_dump (/*@observer@*/ constraintExpr expr, FILE *f)
1766 constraintExprKind kind;
1772 fprintf(f,"%d\n", (int) kind);
1777 t = constraintExprData_termGetTerm (expr->data);
1778 constraintTerm_dump (t, f);
1781 unaryExpr_dump (expr->data, f);
1784 binaryExpr_dump (expr->data, f);
1789 /*@only@*/ constraintExpr constraintExpr_undump (FILE *f)
1791 constraintExprKind kind;
1798 s = mstring_create (MAX_DUMP_LINE_LENGTH);
1802 s = fgets(os, MAX_DUMP_LINE_LENGTH, f);
1804 kind = (constraintExprKind) getInt(&s);
1811 t = constraintTerm_undump (f);
1812 ret = constraintExpr_makeTerm(t);
1815 ret = unaryExpr_undump (f);
1818 ret = binaryExpr_undump (f);