7 # include "lclintMacros.nf"
10 # include "cgrammar_tokens.h"
12 # include "exprChecks.h"
13 # include "aliasChecks.h"
14 # include "exprNodeSList.h"
17 # include "exprData.i"
18 # include "exprDataQuite.i"
25 /*@access exprNode @*/
27 static /*@only@*/ constraintExpr constraintExpr_makeBinaryOpConstraintExprIntLiteral (/*@only@*/constraintExpr expr, int literal);
29 /*@only@*/ static constraintExpr
30 doSRefFixConstraintParamTerm (/*@only@*/ constraintExpr e, exprNodeList arglist) /*@modifies e@*/;
33 doFixResultTerm (constraintExpr e, exprNode fcnCall) /*@modifies e@*/;
36 /*@special@*/ static constraintExpr constraintExpr_makeBinaryOp (void) /*@allocates result->data @*/ /*@sets result->kind @*/;
38 //constraintExpr constraintExpr_makeMaxSetConstraintExpr (constraintExpr c);
40 void constraintExpr_free (/*@only@*/ constraintExpr expr)
42 if (constraintExpr_isDefined(expr) )
47 constraintExprData_freeUnaryExpr(expr->data);
50 constraintExprData_freeBinaryExpr(expr->data);
53 constraintExprData_freeTerm(expr->data);
64 llcontbug(message("attempted to free null pointer in constraintExpr_free"));
68 bool constraintExpr_isLit (constraintExpr expr)
70 llassert (expr != NULL);
72 if (expr->kind == term)
74 constraintTerm term = constraintExprData_termGetTerm (expr->data);
75 if (constraintTerm_isIntLiteral (term) )
85 /*@only@*/ constraintExpr constraintExpr_propagateConstants (/*@only@*/ constraintExpr expr,
86 /*@out@*/ bool * propagate,
87 /*@out@*/ int *literal)
91 bool propagate1, propagate2;
92 int literal1, literal2;
93 constraintExprBinaryOpKind op;
104 llassert (expr != NULL);
106 // we simplify unaryExpr else where
107 if (expr->kind != binaryexpr)
110 op = constraintExprData_binaryExprGetOp (expr->data);
112 DPRINTF( (message("constraintExpr_propagateConstants: binaryexpr: %s", constraintExpr_unparse(expr) ) ) );
114 expr1 = constraintExprData_binaryExprGetExpr1(expr->data);
115 expr2 = constraintExprData_binaryExprGetExpr2(expr->data);
117 expr1 = constraintExpr_copy(expr1);
118 expr2 = constraintExpr_copy(expr2);
120 expr1 = constraintExpr_propagateConstants (expr1, &propagate1, &literal1);
121 expr2 = constraintExpr_propagateConstants (expr2, &propagate2, &literal2);
123 *propagate = propagate1 || propagate2;
124 *literal = literal1 + literal2;
126 if ( constraintExpr_isLit (expr1) && constraintExpr_isLit (expr2) )
129 t1 = constraintExpr_getValue (expr1);
130 t2 = constraintExpr_getValue (expr2);
133 constraintExpr_free (expr);
134 constraintExpr_free (expr1);
135 constraintExpr_free (expr2);
138 return (constraintExpr_makeIntLiteral ( (t1+t2) ));
139 else if (op == MINUS)
140 return (constraintExpr_makeIntLiteral ( (t1-t2) ));
148 if (constraintExpr_isLit (expr1) )
153 *literal += constraintExpr_getValue (expr1);
155 *literal -= constraintExpr_getValue (expr1);
157 constraintExpr_free(expr1);
158 constraintExpr_free(expr);
162 if (constraintExpr_isLit (expr2) )
167 *literal += constraintExpr_getValue (expr2);
169 *literal -= constraintExpr_getValue (expr2);
171 constraintExpr_free(expr2);
172 constraintExpr_free(expr);
176 DPRINTF( (message("constraintExpr_propagateConstants returning: %s", constraintExpr_unparse(expr) ) ) );
178 expr->data = constraintExprData_binaryExprSetExpr1 (expr->data, expr1);
179 expr->data = constraintExprData_binaryExprSetExpr2 (expr->data, expr2);
184 // constraintExpr constraintExpr_propagateConstantsBak (constraintExpr expr,
185 // /*@out@*/ bool * propagate,
186 // /*@out@*/ int *literal)
188 // constraintExpr expr1;
189 // constraintExpr expr2;
190 // bool propagate1, propagate2;
191 // int literal1, literal2;
193 // propagate1 = FALSE;
194 // propagate2 = FALSE;
199 // *propagate = FALSE;
202 // llassert (expr != NULL);
204 // // we simplify unaryExpr else where
205 // if (expr->kind == unaryExpr)
208 // if (expr->kind == term)
211 // if (constraintExpr_isLit (expr) )
214 // DPRINTF( (message("constraintExpr_propagateConstants: binaryexpr: %s", constraintExpr_unparse(expr) ) ) );
216 // expr1 = constraintExprData_binaryExprGetExpr1(expr->data);
217 // expr2 = constraintExprData_binaryExprGetExpr2(expr->data);
219 // expr1 = constraintExpr_propagateConstants (expr1, &propagate1, &literal1);
220 // expr2 = constraintExpr_propagateConstants (expr2, &propagate2, &literal2);
222 // expr->data = constraintExprData_binaryExprSetExpr1 (expr->data, expr1);
223 // expr->data = constraintExprData_binaryExprSetExpr2 (expr->data, expr2);
225 // *propagate = propagate1 || propagate2;
226 // *literal = literal1 + literal2;
228 // if ( constraintExpr_isLit (expr1) && constraintExpr_isLit (expr2) )
231 // t1 = constraintExpr_getValue (expr1);
232 // t2 = constraintExpr_getValue (expr2);
233 // *propagate = FALSE;
235 // if (constraintExprData_binaryExprGetOp (expr->data) == PLUS )
236 // return (constraintExpr_makeIntLiteral ( (t1+t2) ));
237 // else if (constraintExprData_binaryExprGetOp (expr->data) == MINUS)
238 // return (constraintExpr_makeIntLiteral ( (t1-t2) ));
243 // if (constraintExpr_isLit (expr1) )
246 // /*handle MINUS case right */
247 // *propagate = TRUE;
248 // *literal += constraintExpr_getValue (expr1);
255 // if (constraintExpr_isLit (expr2) )
257 // *propagate = TRUE;
259 // if (constraintExprData_binaryExprGetOp (expr->data) == PLUS )
260 // *literal += constraintExpr_getValue (expr2);
262 // *literal -= constraintExpr_getValue (expr2);
269 // DPRINTF( (message("constraintExpr_propagateConstants returning: %s", constraintExpr_unparse(expr) ) ) );
275 /*@only@*/ static constraintExpr constraintExpr_combineConstants (/*@only@*/ constraintExpr expr ) /*@modifies expr@*/
280 DPRINTF ( (message ("Before combine %s", constraintExpr_unparse(expr) ) ) );
281 expr = constraintExpr_propagateConstants (expr, &propagate, &literal);
290 ret = constraintExpr_makeBinaryOpConstraintExprIntLiteral (expr, literal);
294 DPRINTF ( (message ("After combine %s", constraintExpr_unparse(expr) ) ) );
299 static constraintExpr constraintExpr_alloc (void) /*@post:isnull result->data@*/
302 ret = dmalloc (sizeof (*ret) );
308 /*@only@*/ static constraintExprData copyExprData (constraintExprData data, constraintExprKind kind)
310 constraintExprData ret;
311 llassert(constraintExprData_isDefined(data));
316 ret = constraintExprData_copyBinaryExpr(data);
319 ret = constraintExprData_copyUnaryExpr(data);
322 ret = constraintExprData_copyTerm(data);
330 constraintExpr constraintExpr_copy (constraintExpr expr)
333 ret = constraintExpr_alloc();
334 ret->kind = expr->kind;
336 ret->data = copyExprData (expr->data, expr->kind);
341 /*@only@*/ static constraintExpr oldconstraintExpr_makeTermExprNode (exprNode e)
345 ret = constraintExpr_alloc();
347 ret->data = dmalloc (sizeof *(ret->data) );
348 t = constraintTerm_makeExprNode (e);
349 ret->data = constraintExprData_termSetTerm (ret->data, t);
353 constraintExpr constraintExpr_makeExprNode (exprNode e)
356 constraintExpr ret, ce1, ce2;
362 llassert (e != NULL);
369 t = exprData_getSingle (data);
370 s = exprNode_getSref (t);
371 if (sRef_isFixedArray(s) )
375 size = (int) sRef_getArraySize(s);
376 ret = constraintExpr_makeIntLiteral (size);
380 DPRINTF ((message ("could not determine the size of %s", exprNode_unparse (e) ) ) );
381 ret = oldconstraintExpr_makeTermExprNode (e);
386 DPRINTF ((message ("Examining operation %s", exprNode_unparse (e) ) ) );
387 t1 = exprData_getOpA (data);
388 t2 = exprData_getOpB (data);
389 tok = exprData_getOpTok (data);
391 if (lltok_isPlus_Op (tok) || lltok_isMinus_Op (tok) )
393 ce1 = constraintExpr_makeExprNode (t1);
394 ce2 = constraintExpr_makeExprNode (t2);
395 ret = constraintExpr_parseMakeBinaryOp (ce1, tok, ce2);
399 ret = oldconstraintExpr_makeTermExprNode (e);
403 t = exprData_getUopNode (data);
404 ret = constraintExpr_makeExprNode (t);
408 t = exprData_getUopNode (data);
409 tok = exprData_getUopTok (data);
410 if (lltok_isInc_Op (tok) )
413 temp = constraintExpr_makeExprNode(t);
414 ret = constraintExpr_makeIncConstraintExpr(temp);
416 else if (lltok_isDec_Op (tok) )
419 temp = constraintExpr_makeExprNode(t);
420 ret = constraintExpr_makeDecConstraintExpr(temp);
423 ret = oldconstraintExpr_makeTermExprNode (e);
427 t = exprData_getUopNode (data);
428 ret = constraintExpr_makeExprNode (t);
431 t = exprData_getCastNode (data);
432 ret = constraintExpr_makeExprNode (t);
435 t = exprData_getPairA(data);
436 ret = constraintExpr_makeExprNode(t);
437 /*@i3434*/ /*I'm not sure if this is right. I'm adding a break to quite LCLint*/
440 ret = oldconstraintExpr_makeTermExprNode (e);
447 /*@only@*/ static constraintExpr constraintExpr_makeTermExprNode (exprNode e)
449 return oldconstraintExpr_makeTermExprNode(e); //constraintExpr_makeExprNode (e);
453 constraintExpr constraintExpr_makeTermsRef (/*@only@*/ sRef s)
457 ret = constraintExpr_alloc();
459 ret->data = dmalloc (sizeof *(ret->data) );
460 t = constraintTerm_makesRef (s);
461 ret->data = constraintExprData_termSetTerm (ret->data, t);
465 /*@special@*/ static constraintExpr constraintExpr_makeUnaryOp (void) /*@allocates result->data@*/ /*@defines result->kind@*/
468 ret = constraintExpr_alloc();
469 ret->kind = unaryExpr;
470 ret->data = dmalloc ( sizeof *(ret->data) );
474 /*@only@*/ static constraintExpr constraintExpr_makeUnaryOpConstraintExpr (/*@only@*/ constraintExpr cexpr)
477 ret = constraintExpr_makeUnaryOp();
481 ret->data = constraintExprData_unaryExprSetExpr (ret->data, cexpr);
482 ret->data = constraintExprData_unaryExprSetOp (ret->data, UNARYOP_UNDEFINED);
491 static constraintExpr constraintExpr_makeMaxSetConstraintExpr (/*@only@*/ constraintExpr c)
494 ret = constraintExpr_makeUnaryOpConstraintExpr (c);
495 ret->data = constraintExprData_unaryExprSetOp (ret->data, MAXSET);
500 static constraintExpr constraintExpr_makeUnaryOpExprNode (exprNode expr)
504 sub = constraintExpr_makeExprNode (expr);
505 ret = constraintExpr_makeUnaryOpConstraintExpr(sub);
513 static constraintExpr constraintExpr_makeSRefUnaryOp (/*@only@*/ sRef s, constraintExprUnaryOpKind op)
518 t = constraintExpr_makeTermsRef (s);
519 ret = constraintExpr_makeUnaryOpConstraintExpr (t);
520 ret->data = constraintExprData_unaryExprSetOp (ret->data, op);
526 constraintExpr constraintExpr_makeSRefMaxRead(/*@only@*/ sRef s)
528 return (constraintExpr_makeSRefUnaryOp (s, MAXREAD) );
532 constraintExpr constraintExpr_makeSRefMaxset (/*@only@*/ sRef s)
534 return (constraintExpr_makeSRefUnaryOp (s, MAXSET) );
538 constraintExpr constraintExpr_parseMakeUnaryOp (lltok op, constraintExpr cexpr)
541 ret = constraintExpr_makeUnaryOpConstraintExpr ( cexpr);
546 ret->data = constraintExprData_unaryExprSetOp (ret->data, MAXSET);
549 ret->data = constraintExprData_unaryExprSetOp (ret->data, MAXREAD);
552 llfatalbug(message("Unhandled Operation in Constraint") );
558 constraintExpr constraintExpr_makeMaxSetExpr (exprNode expr)
561 ret = constraintExpr_makeExprNode (expr);
563 ret = constraintExpr_makeMaxSetConstraintExpr (ret);
565 llassert (ret != NULL);
570 constraintExpr constraintExpr_makeMaxReadExpr (exprNode expr)
573 ret = constraintExpr_makeUnaryOpExprNode(expr);
574 ret->data = constraintExprData_unaryExprSetOp (ret->data, MAXREAD);
579 /*@unused@*/ constraintExpr constraintExpr_makeMinSetExpr (exprNode expr)
582 ret = constraintExpr_makeUnaryOpExprNode(expr);
583 ret->data = constraintExprData_unaryExprSetOp (ret->data, MINSET);
588 /*@unused@*/ constraintExpr constraintExpr_makeMinReadExpr (exprNode expr)
591 ret = constraintExpr_makeUnaryOpExprNode(expr);
592 ret->data = constraintExprData_unaryExprSetOp (ret->data, MINREAD);
598 constraintExpr constraintExpr_makeValueExpr (exprNode expr)
601 ret = constraintExpr_makeExprNode (expr);
606 constraintExpr constraintExpr_makeIntLiteral (int i)
610 ret = constraintExpr_alloc();
612 ret->data = dmalloc (sizeof *(ret->data) );
613 t = constraintTerm_makeIntLiteral (i);
614 ret->data = constraintExprData_termSetTerm (ret->data, t);
619 constraintExpr constraintExpr_makeValueInt (int i)
621 return constraintExpr_makeIntLiteral (i);
626 /*@special@*/ static constraintExpr constraintExpr_makeBinaryOp (void) /*@allocates result->data @*/ /*@sets result->kind @*/
629 ret = constraintExpr_alloc();
630 ret->kind = binaryexpr;
631 ret->data = dmalloc ( sizeof *(ret->data) );
632 ret->data = constraintExprData_binaryExprSetOp (ret->data, BINARYOP_UNDEFINED);
637 static /*@only@*/ constraintExpr constraintExpr_makeBinaryOpConstraintExpr (/*@only@*/constraintExpr expr1, /*@only@*/ constraintExpr expr2)
642 ret = constraintExpr_makeBinaryOp();
643 ret->data = constraintExprData_binaryExprSetExpr1 (ret->data, expr1);
644 ret->data = constraintExprData_binaryExprSetExpr2 (ret->data, expr2);
645 ret->data = constraintExprData_binaryExprSetOp (ret->data, BINARYOP_UNDEFINED);
650 constraintExpr constraintExpr_parseMakeBinaryOp (/*@only@*/ constraintExpr expr1, lltok op,/*@only@*/ constraintExpr expr2)
653 ret = constraintExpr_makeBinaryOpConstraintExpr (expr1, expr2);
655 ret->data = constraintExprData_binaryExprSetOp(ret->data, PLUS);
656 else if (op.tok == TMINUS)
657 ret->data = constraintExprData_binaryExprSetOp(ret->data, MINUS);
666 /*@unused@*/ constraintExpr constraintExpr_makeBinaryOpExprNode (exprNode expr1, exprNode expr2)
669 constraintExpr sub1, sub2;
670 sub1 = constraintExpr_makeTermExprNode (expr1);
671 sub2 = constraintExpr_makeTermExprNode (expr2);
672 ret = constraintExpr_makeBinaryOpConstraintExpr(sub1, sub2);
677 constraintExpr constraintExpr_makeBinaryOpConstraintExprIntLiteral (/*@only@*/ constraintExpr expr, int literal)
680 constraintExpr constExpr;
682 constExpr = constraintExpr_makeIntLiteral (literal);
683 ret = constraintExpr_makeBinaryOpConstraintExpr (expr, constExpr);
684 ret->data = constraintExprData_binaryExprSetOp(ret->data, PLUS);
689 constraintExpr constraintExpr_makeDecConstraintExpr (/*@only@*/constraintExpr expr)
694 inc = constraintExpr_makeIntLiteral (1);
695 ret = constraintExpr_makeBinaryOpConstraintExpr (expr, inc);
696 ret->data = constraintExprData_binaryExprSetOp(ret->data, MINUS);
701 constraintExpr constraintExpr_makeAddConstraintExpr (/*@only@*/
702 constraintExpr expr, /*@only@*/
707 ret = constraintExpr_makeBinaryOpConstraintExpr (expr, add);
709 ret->data = constraintExprData_binaryExprSetOp(ret->data, PLUS);
715 constraintExpr constraintExpr_makeIncConstraintExpr (/*@only@*/ constraintExpr expr)
720 inc = constraintExpr_makeIntLiteral (1);
721 ret = constraintExpr_makeBinaryOpConstraintExpr (expr, inc);
722 ret->data = constraintExprData_binaryExprSetOp(ret->data, PLUS);
727 static cstring constraintExprUnaryOpKind_print (constraintExprUnaryOpKind op)
732 return message("MAXSET");
734 return message("MINSET");
736 return message("MAXREAD");
738 return message("MINREAD");
741 return message ("<(Unary OP OTHER>");
747 static cstring constraintExprBinaryOpKind_print (constraintExprBinaryOpKind op)
759 return message ("<binary OP Unknown>");
763 bool constraintExpr_similar (constraintExpr expr1, constraintExpr expr2)
765 constraintExprKind kind;
767 llassert (expr1 != NULL);
768 llassert (expr2 != NULL);
769 if (expr1->kind != expr2->kind)
777 return constraintTerm_similar (constraintExprData_termGetTerm(expr1->data),
778 constraintExprData_termGetTerm(expr2->data) );
779 /*@notreached@*/ break;
782 if (constraintExprData_unaryExprGetOp (expr1->data) != constraintExprData_unaryExprGetOp (expr2->data) )
785 return (constraintExpr_similar (
786 constraintExprData_unaryExprGetExpr (expr1->data),
787 constraintExprData_unaryExprGetExpr (expr2->data)
791 if (constraintExprData_binaryExprGetOp (expr1->data) != constraintExprData_binaryExprGetOp (expr2->data) )
794 if (! constraintExpr_similar (constraintExprData_binaryExprGetExpr1 (expr1->data),
795 constraintExprData_binaryExprGetExpr1 (expr2->data)) )
798 if (! constraintExpr_similar (constraintExprData_binaryExprGetExpr2 (expr1->data),
799 constraintExprData_binaryExprGetExpr2 (expr2->data)) )
814 bool constraintExpr_same (constraintExpr expr1, constraintExpr expr2)
816 constraintExprKind kind;
818 llassert (expr1 != NULL);
819 llassert (expr2 != NULL);
820 if (expr1->kind != expr2->kind)
828 return constraintTerm_similar (constraintExprData_termGetTerm(expr1->data),
829 constraintExprData_termGetTerm(expr2->data) );
830 /*@notreached@*/ break;
833 if (constraintExprData_unaryExprGetOp (expr1->data) != constraintExprData_unaryExprGetOp (expr2->data) )
836 return (constraintExpr_same (
837 constraintExprData_unaryExprGetExpr (expr1->data),
838 constraintExprData_unaryExprGetExpr (expr2->data)
843 if (constraintExprData_binaryExprGetOp (expr1->data) != constraintExprData_binaryExprGetOp (expr2->data) )
846 if (! constraintExpr_same (constraintExprData_binaryExprGetExpr1 (expr1->data),
847 constraintExprData_binaryExprGetExpr1 (expr2->data)) )
850 if (! constraintExpr_same (constraintExprData_binaryExprGetExpr2 (expr1->data),
851 constraintExprData_binaryExprGetExpr2 (expr2->data)) )
855 /*@notreached@*/ break;
866 bool constraintExpr_search (/*@observer@*/ constraintExpr c, /*@observer@*/ constraintExpr old)
869 constraintExprKind kind;
872 if ( constraintExpr_similar (c, old) )
874 DPRINTF((message ("Found %q",
875 constraintExpr_unparse(old)
887 temp = constraintExprData_unaryExprGetExpr (c->data);
888 ret = ret || constraintExpr_search (temp, old);
892 temp = constraintExprData_binaryExprGetExpr1 (c->data);
893 ret = ret || constraintExpr_search(temp, old);
895 temp = constraintExprData_binaryExprGetExpr2 (c->data);
896 ret = ret || constraintExpr_search(temp, old);
906 /*@only@*/ constraintExpr constraintExpr_searchandreplace (/*@only@*/ /*@unique@*/ constraintExpr c, constraintExpr old, constraintExpr new )
908 constraintExprKind kind;
911 if ( constraintExpr_similar (c, old) )
914 DPRINTF((message ("Replacing %s with %s",
915 constraintExpr_unparse(old), constraintExpr_unparse(new)
917 constraintExpr_free(c);
918 return constraintExpr_copy (new);
928 temp = constraintExprData_unaryExprGetExpr (c->data);
929 temp = constraintExpr_copy(temp);
930 temp = constraintExpr_searchandreplace (temp, old, new);
931 c->data = constraintExprData_unaryExprSetExpr (c->data, temp);
935 temp = constraintExprData_binaryExprGetExpr1 (c->data);
936 temp = constraintExpr_copy(temp);
937 temp = constraintExpr_searchandreplace (temp, old, new);
938 c->data = constraintExprData_binaryExprSetExpr1 (c->data, temp);
940 temp = constraintExprData_binaryExprGetExpr2 (c->data);
941 temp = constraintExpr_copy(temp);
942 temp = constraintExpr_searchandreplace (temp, old, new);
943 c->data = constraintExprData_binaryExprSetExpr2 (c->data, temp);
952 static constraintExpr constraintExpr_simplifyChildren (/*@returned@*/ constraintExpr c)
954 constraintExprKind kind;
964 temp = constraintExprData_unaryExprGetExpr (c->data);
965 temp = constraintExpr_copy(temp);
966 temp = constraintExpr_simplify (temp);
967 c->data = constraintExprData_unaryExprSetExpr (c->data, temp);
970 DPRINTF((message("constraintExpr_simplfiyChildren: simplify binary expression: %s",constraintExpr_unparse(c) ) ) );
971 temp = constraintExprData_binaryExprGetExpr1 (c->data);
972 temp = constraintExpr_copy(temp);
973 temp = constraintExpr_simplify (temp);
975 c->data = constraintExprData_binaryExprSetExpr1 (c->data, temp);
977 temp = constraintExprData_binaryExprGetExpr2 (c->data);
978 temp = constraintExpr_copy(temp);
979 temp = constraintExpr_simplify (temp);
981 c->data = constraintExprData_binaryExprSetExpr2 (c->data, temp);
991 constraintExpr constraintExpr_setFileloc (/*@returned@*/ constraintExpr c, fileloc loc) /*@modifies c->data @*/
1001 t = constraintExprData_termGetTerm (c->data);
1002 t = constraintTerm_copy(t);
1003 t = constraintTerm_setFileloc (t, loc);
1004 c->data = constraintExprData_termSetTerm (c->data, t);
1008 temp = constraintExprData_binaryExprGetExpr1 (c->data);
1009 temp = constraintExpr_copy(temp);
1010 temp = constraintExpr_setFileloc (temp, loc);
1011 c->data = constraintExprData_binaryExprSetExpr1 (c->data, temp);
1013 temp = constraintExprData_binaryExprGetExpr2 (c->data);
1014 temp = constraintExpr_copy(temp);
1015 temp = constraintExpr_setFileloc (temp, loc);
1016 c->data = constraintExprData_binaryExprSetExpr2 (c->data, temp);
1019 temp = constraintExprData_unaryExprGetExpr (c->data);
1020 temp = constraintExpr_copy(temp);
1021 temp = constraintExpr_setFileloc (temp, loc);
1022 c->data = constraintExprData_unaryExprSetExpr (c->data, temp);
1028 static /*@only@*/ constraintExpr constraintExpr_simplifybinaryExpr (/*@only@*/constraintExpr c)
1030 constraintExpr e1, e2;
1032 e1 = constraintExprData_binaryExprGetExpr1 (c->data);
1033 e2 = constraintExprData_binaryExprGetExpr2 (c->data);
1035 if (constraintExpr_canGetValue (e1) && constraintExpr_canGetValue(e2) )
1039 i = constraintExpr_getValue(e1) + constraintExpr_getValue (e2);
1040 constraintExpr_free(c);
1041 c = constraintExpr_makeIntLiteral (i);
1048 /*@only@*/ static constraintExpr constraintExpr_subtractExpr (/*@only@*/ constraintExpr expr, /*@only@*/ constraintExpr addent)
1052 DPRINTF ( (message ("Doing subtraceTerm simplification") ) );
1054 new = constraintExpr_makeBinaryOpConstraintExpr (expr, addent);
1055 new->data = constraintExprData_binaryExprSetOp (new->data, MINUS);
1060 static constraintExpr constraintExpr_addExpr (/*@only@*/
1061 constraintExpr expr, /*@only@*/
1062 constraintExpr addent)
1066 DPRINTF ( (message ("Doing addTerm simplification") ) );
1068 new = constraintExpr_makeBinaryOpConstraintExpr (expr, addent);
1069 new->data = constraintExprData_binaryExprSetOp (new->data, PLUS);
1074 this thing takes the lexpr and expr of a constraint and modifies lexpr
1075 and returns a (possiblly new) value for expr
1077 /* 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 */
1079 /* the approach is a little Kludgy but seems to work. I should probably use something cleaner at some point ... */
1082 /*@only@*/ constraintExpr constraintExpr_solveBinaryExpr (constraintExpr lexpr, /*@only@*/ constraintExpr expr)
1084 constraintExpr expr1, expr2;
1085 constraintExprBinaryOpKind op;
1087 if (lexpr->kind != binaryexpr)
1090 expr2 = constraintExprData_binaryExprGetExpr2 (lexpr->data);
1091 expr1 = constraintExprData_binaryExprGetExpr1 (lexpr->data);
1093 op = constraintExprData_binaryExprGetOp (lexpr->data);
1095 expr1 = constraintExpr_copy(expr1);
1096 expr2 = constraintExpr_copy(expr2);
1098 #warning make sure this works
1100 lexpr->kind = expr1->kind;
1103 lexpr->data = copyExprData (expr1->data, expr1->kind);
1107 expr = constraintExpr_subtractExpr (expr, expr2);
1108 else if (op == MINUS)
1109 expr = constraintExpr_addExpr (expr, expr2);
1117 #warning this needs to be checked
1118 expr = constraintExpr_solveBinaryExpr (expr1, expr);
1120 expr = constraintExpr_solveBinaryExpr (expr2, expr);
1125 static /*@only@*/ constraintExpr constraintExpr_simplifyunaryExpr (/*@only@*/ constraintExpr c)
1129 llassert (c->kind == unaryExpr);
1131 DPRINTF ( (message ("Doing constraintExpr_simplifyunaryExpr:%s", constraintExpr_unparse (c) ) ) );
1133 if ( (constraintExprData_unaryExprGetOp (c->data) != MAXSET) &&
1134 (constraintExprData_unaryExprGetOp (c->data) != MAXREAD) )
1138 // pattern mxr ( var + const) = mxr(var) - const
1140 exp = constraintExprData_unaryExprGetExpr (c->data);
1142 if (exp->kind == term)
1144 constraintTerm cterm;
1146 cterm = constraintExprData_termGetTerm (exp->data);
1148 if (constraintTerm_isStringLiteral(cterm) )
1151 val = constraintTerm_getStringLiteral (cterm);
1152 if (constraintExprData_unaryExprGetOp (c->data) == MAXSET)
1154 constraintExpr temp;
1156 temp = constraintExpr_makeIntLiteral ((int)strlen (val) );
1158 constraintExpr_free(c);
1161 if (constraintExprData_unaryExprGetOp (c->data) == MAXREAD)
1163 constraintExpr temp;
1165 temp = constraintExpr_makeIntLiteral ((int)strlen (val) );
1167 constraintExpr_free(c);
1175 if (exp->kind != binaryexpr)
1178 if (constraintExprData_binaryExprGetOp (exp->data) == PLUS )
1181 // if (constraintExpr_canGetValue (constraintExprData_binaryExprGetExpr2 (exp->data) ) )
1184 constraintExpr temp, temp2, new;
1186 DPRINTF ( (message ("Doing fancy simplification") ) );
1188 temp = constraintExprData_binaryExprGetExpr2 (exp->data);
1190 temp2 = constraintExprData_binaryExprGetExpr1 (exp->data);
1192 temp2 = constraintExpr_copy(temp2);
1193 c->data = constraintExprData_unaryExprSetExpr (c->data, temp2);
1196 temp = constraintExpr_copy (temp);
1198 new = constraintExpr_subtractExpr (c, temp);
1200 DPRINTF ( (message ("Done fancy simplification:%s", constraintExpr_unparse (new) ) ) );
1205 DPRINTF ( (message ("Done simplification:%s", constraintExpr_unparse (c) ) ) );
1210 /*@only@*/ constraintExpr constraintExpr_simplify (/*@only@*/ constraintExpr c)
1212 constraintExprKind kind;
1216 DPRINTF ( (message ("Doing constraintExpr_simplify:%s", constraintExpr_unparse (c) ) ) );
1221 /*I think this is an LCLint bug */
1223 ret = constraintExpr_copy(c);
1225 constraintExpr_free(c);
1227 ret = constraintExpr_simplifyChildren (ret);
1229 ret = constraintExpr_combineConstants (ret);
1231 ret = constraintExpr_simplifyChildren (ret);
1239 t = constraintExprData_termGetTerm (ret->data);
1240 t = constraintTerm_copy(t);
1241 t = constraintTerm_simplify (t);
1242 ret->data = constraintExprData_termSetTerm (ret->data, t);
1245 ret = constraintExpr_simplifyunaryExpr (ret);
1248 ret = constraintExpr_simplifybinaryExpr (ret);
1254 DPRINTF ( (message ("constraintExpr_simplify returning :%s", constraintExpr_unparse (ret) ) ) );
1260 cstring constraintExpr_unparse (/*@observer@*/ constraintExpr ex) /*@*/
1263 constraintExprKind kind;
1265 llassert (ex != NULL);
1272 st = message ("(%q) ", constraintTerm_print (constraintExprData_termGetTerm(ex->data) ) );
1275 st = message ("%q (%q)",
1276 constraintExprUnaryOpKind_print (constraintExprData_unaryExprGetOp (ex->data)
1278 constraintExpr_unparse (constraintExprData_unaryExprGetExpr (ex->data) )
1282 st = message ("(%q) %q (%q)",
1283 constraintExpr_unparse (constraintExprData_binaryExprGetExpr1 (ex->data) ),
1284 constraintExprBinaryOpKind_print (constraintExprData_binaryExprGetOp (ex->data)
1286 constraintExpr_unparse (constraintExprData_binaryExprGetExpr2 (ex->data) )
1291 st = message ("error");
1295 DPRINTF((message ("constraintExpr_unparse: '%s'",st) ) );
1299 constraintExpr constraintExpr_doSRefFixBaseParam (/*@returned@*/ constraintExpr expr, exprNodeList arglist)
1301 constraintTerm Term;
1302 constraintExprKind kind;
1303 constraintExpr expr1, expr2;
1304 constraintExprData data;
1305 llassert (expr != NULL);
1314 Term = constraintExprData_termGetTerm(data);
1315 Term = constraintTerm_copy(Term);
1317 Term = constraintTerm_doSRefFixBaseParam (Term, arglist);
1318 data = constraintExprData_termSetTerm(data, Term);
1321 expr1 = constraintExprData_unaryExprGetExpr (data);
1322 expr1 = constraintExpr_copy(expr1);
1324 expr1 = constraintExpr_doSRefFixBaseParam (expr1, arglist);
1325 data = constraintExprData_unaryExprSetExpr (data, expr1);
1328 expr1 = constraintExprData_binaryExprGetExpr1 (data);
1329 expr2 = constraintExprData_binaryExprGetExpr2 (data);
1331 expr1 = constraintExpr_copy(expr1);
1332 expr2 = constraintExpr_copy(expr2);
1334 expr1 = constraintExpr_doSRefFixBaseParam (expr1, arglist);
1335 data = constraintExprData_binaryExprSetExpr1 (data, expr1);
1336 expr2 = constraintExpr_doSRefFixBaseParam (expr2, arglist);
1337 data = constraintExprData_binaryExprSetExpr2 (data, expr2);
1347 /*@only@*/ constraintExpr constraintExpr_doSRefFixConstraintParam (/*@only@*/ constraintExpr expr, exprNodeList arglist) /*@modifies expr@*/
1349 constraintExprKind kind;
1350 constraintExpr expr1, expr2;
1351 constraintExprData data;
1352 llassert (expr != NULL);
1361 expr = doSRefFixConstraintParamTerm (expr, arglist);
1364 expr1 = constraintExprData_unaryExprGetExpr (data);
1365 expr1 = constraintExpr_copy(expr1);
1366 expr1 = constraintExpr_doSRefFixConstraintParam (expr1, arglist);
1367 data = constraintExprData_unaryExprSetExpr (data, expr1);
1370 expr1 = constraintExprData_binaryExprGetExpr1 (data);
1371 expr2 = constraintExprData_binaryExprGetExpr2 (data);
1373 expr1 = constraintExpr_copy(expr1);
1374 expr2 = constraintExpr_copy(expr2);
1376 expr1 = constraintExpr_doSRefFixConstraintParam (expr1, arglist);
1377 data = constraintExprData_binaryExprSetExpr1 (data, expr1);
1378 expr2 = constraintExpr_doSRefFixConstraintParam (expr2, arglist);
1379 data = constraintExprData_binaryExprSetExpr2 (data, expr2);
1389 constraintExpr constraintExpr_doFixResult (/*@returned@*/ constraintExpr expr, exprNode fcnCall)
1391 constraintExprKind kind;
1392 constraintExpr expr1, expr2;
1393 constraintExprData data;
1394 llassert (expr != NULL);
1403 expr = doFixResultTerm (expr, fcnCall);
1406 expr1 = constraintExprData_unaryExprGetExpr (data);
1407 expr1 = constraintExpr_copy(expr1);
1409 expr1 = constraintExpr_doFixResult (expr1, fcnCall);
1410 data = constraintExprData_unaryExprSetExpr (data, expr1);
1413 expr1 = constraintExprData_binaryExprGetExpr1 (data);
1414 expr2 = constraintExprData_binaryExprGetExpr2 (data);
1416 expr1 = constraintExpr_copy(expr1);
1417 expr2 = constraintExpr_copy(expr2);
1419 expr1 = constraintExpr_doFixResult (expr1, fcnCall);
1420 data = constraintExprData_binaryExprSetExpr1 (data, expr1);
1421 expr2 = constraintExpr_doFixResult (expr2, fcnCall);
1422 data = constraintExprData_binaryExprSetExpr2 (data, expr2);
1432 cstring constraintExpr_print (constraintExpr expr) /*@*/
1434 return constraintExpr_unparse(expr);
1437 bool constraintExpr_hasMaxSet (constraintExpr expr) /*@*/
1441 t = constraintExpr_unparse(expr);
1443 if (strstr (t, "MAXSET") != NULL )
1457 /*returns 1 0 -1 like strcmp
1462 int constraintExpr_compare (constraintExpr expr1, constraintExpr expr2)
1466 if (constraintExpr_similar (expr1, expr2) )
1470 value1 = constraintExpr_getValue(expr1);
1471 value2 = constraintExpr_getValue(expr2);
1473 if (value1 > value2)
1476 if (value1 == value2)
1483 int constraintExpr_getValue (constraintExpr expr)
1485 llassert (expr->kind == term);
1486 return (constraintTerm_getValue (constraintExprData_termGetTerm (expr->data) ) );
1489 bool constraintExpr_canGetValue (constraintExpr expr)
1494 return constraintTerm_canGetValue (constraintExprData_termGetTerm (expr->data) );
1503 fileloc constraintExpr_getFileloc (constraintExpr expr)
1507 constraintExprKind kind;
1514 t = constraintExprData_termGetTerm (expr->data);
1515 return (constraintTerm_getFileloc (t) );
1519 e = constraintExprData_unaryExprGetExpr (expr->data);
1520 return (constraintExpr_getFileloc (e) );
1524 e = constraintExprData_binaryExprGetExpr1 (expr->data);
1525 return (constraintExpr_getFileloc (e) );
1530 return (fileloc_undefined);
1533 /*drl moved from constriantTerm.c 5/20/001*/
1534 static constraintExpr
1535 doFixResultTerm (constraintExpr e, exprNode fcnCall)
1539 /*maybe this should move to cosntraintExpr.c -drl7x 5/18/01*/
1540 /*@i22*/ constraintExprData data = e->data;
1542 /*@i22*/constraintExprKind kind = e->kind;
1546 llassert(kind == term);
1548 t = constraintExprData_termGetTerm (data);
1549 llassert (t != NULL);
1552 switch (constraintTerm_getKind(t) )
1560 s = constraintTerm_getSRef(t);
1561 if (sRef_isResult (s))
1563 ret = constraintExpr_makeExprNode(fcnCall);
1574 /*drl moved from constriantTerm.c 5/20/001*/
1575 /*@only@*/ static constraintExpr
1576 doSRefFixConstraintParamTerm (/*@only@*/ constraintExpr e, exprNodeList arglist)
1580 constraintExprData data = e->data;
1582 constraintExprKind kind = e->kind;
1586 llassert(kind == term);
1588 t = constraintExprData_termGetTerm (data);
1589 llassert (t != NULL);
1592 /*@i1*/ switch (t->kind)
1595 DPRINTF((message ("%q @ %q ", constraintTerm_print(t),
1596 fileloc_unparse (constraintTerm_getFileloc(t) ) ) ));
1599 DPRINTF((message (" %q ", constraintTerm_print (t)) ));
1603 DPRINTF (( message("Doing sRef_fixConstraintParam for %q ",
1604 constraintTerm_print (t) ) ));
1605 ret = sRef_fixConstraintParam (t->value.sref, arglist);
1607 constraintExpr_free(e);
1609 DPRINTF (( message("After Doing sRef_fixConstraintParam constraintExpr is %q ",
1610 constraintExpr_print (ret) ) ));
1620 /* bool constraintExpr_includesTerm (constraintExpr expr, constraintTerm term) */
1622 /* if (constraintTerm_hasTerm (expr->term, term) ) */
1625 /* if ( (expr->expr) != NULL) */
1627 /* return ( constraintExpr_includesTerm (expr->expr, term) ); */
1633 /*drl added 6/11/01 */
1634 bool constraintExpr_isBinaryExpr (/*@observer@*/ constraintExpr c)
1636 if (c->kind == binaryexpr)