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 @*/
28 doSRefFixConstraintParamTerm (constraintExpr e, exprNodeList arglist) /*@modifies e@*/;
31 doFixResultTerm (constraintExpr e, exprNode fcnCall) /*@modifies e@*/;
33 /*@special@*/ static constraintExpr constraintExpr_makeBinaryOp (void) /*@defines result->kind, result->data->binaryOp.binaryOp@*/;
35 //constraintExpr constraintExpr_makeMaxSetConstraintExpr (constraintExpr c);
37 bool constraintExpr_isLit (constraintExpr expr)
39 llassert (expr != NULL);
41 if (expr->kind == term)
43 constraintTerm term = constraintExprData_termGetTerm (expr->data);
44 if (constraintTerm_isIntLiteral (term) )
54 constraintExpr constraintExpr_propagateConstants (constraintExpr expr,
55 /*@out@*/ bool * propagate,
56 /*@out@*/ int *literal)
60 bool propagate1, propagate2;
61 int literal1, literal2;
72 llassert (expr != NULL);
74 // we simplify unaryExpr else where
75 if (expr->kind == unaryExpr)
78 if (expr->kind == term)
81 if (constraintExpr_isLit (expr) )
84 DPRINTF( (message("constraintExpr_propagateConstants: binaryexpr: %s", constraintExpr_unparse(expr) ) ) );
86 expr1 = constraintExprData_binaryExprGetExpr1(expr->data);
87 expr2 = constraintExprData_binaryExprGetExpr2(expr->data);
89 expr1 = constraintExpr_propagateConstants (expr1, &propagate1, &literal1);
90 expr2 = constraintExpr_propagateConstants (expr2, &propagate2, &literal2);
92 expr->data = constraintExprData_binaryExprSetExpr1 (expr->data, expr1);
93 expr->data = constraintExprData_binaryExprSetExpr2 (expr->data, expr2);
95 *propagate = propagate1 || propagate2;
96 *literal = literal1 + literal2;
98 if ( constraintExpr_isLit (expr1) && constraintExpr_isLit (expr2) )
101 t1 = constraintExpr_getValue (expr1);
102 t2 = constraintExpr_getValue (expr2);
104 if (constraintExprData_binaryExprGetOp (expr->data) == PLUS )
105 return (constraintExpr_makeIntLiteral ( (t1+t2) ));
106 else if (constraintExprData_binaryExprGetOp (expr->data) == MINUS)
107 return (constraintExpr_makeIntLiteral ( (t1-t2) ));
112 if (constraintExpr_isLit (expr1) )
115 /*handle MINUS case right */
117 *literal += constraintExpr_getValue (expr1);
122 if (constraintExpr_isLit (expr2) )
126 if (constraintExprData_binaryExprGetOp (expr->data) == PLUS )
127 *literal += constraintExpr_getValue (expr2);
129 *literal -= constraintExpr_getValue (expr2);
135 DPRINTF( (message("constraintExpr_propagateConstants returning: %s", constraintExpr_unparse(expr) ) ) );
140 static constraintExpr constraintExpr_combineConstants ( constraintExpr expr ) /*@modifies@*/
145 DPRINTF ( (message ("Before combine %s", constraintExpr_unparse(expr) ) ) );
146 expr = constraintExpr_propagateConstants (expr, &propagate, &literal);
155 ret = constraintExpr_makeBinaryOpConstraintExprIntLiteral (expr, literal);
159 DPRINTF ( (message ("After combine %s", constraintExpr_unparse(expr) ) ) );
164 static constraintExpr constraintExpr_alloc (void) /*@post:isnull result->data@*/
167 ret = dmalloc (sizeof (*ret) );
173 static constraintExprData copyExprData (constraintExprData data, constraintExprKind kind)
175 constraintExprData ret;
176 llassert(constraintExprData_isDefined(data));
181 ret = constraintExprData_copyBinaryExpr(data);
184 ret = constraintExprData_copyUnaryExpr(data);
187 ret = constraintExprData_copyTerm(data);
195 constraintExpr constraintExpr_copy (constraintExpr expr)
198 ret = constraintExpr_alloc();
199 ret->kind = expr->kind;
201 ret->data = copyExprData (expr->data, expr->kind);
206 constraintExpr oldconstraintExpr_makeTermExprNode (exprNode e)
210 ret = constraintExpr_alloc();
212 ret->data = dmalloc (sizeof *(ret->data) );
213 t = constraintTerm_makeExprNode (e);
214 ret->data = constraintExprData_termSetTerm (ret->data, t);
218 constraintExpr constraintExpr_makeExprNode (exprNode e)
221 constraintExpr ret, ce1, ce2;
227 llassert (e != NULL);
234 t = exprData_getSingle (data);
235 s = exprNode_getSref (t);
236 if (sRef_isFixedArray(s) )
240 size = (int) sRef_getArraySize(s);
241 ret = constraintExpr_makeIntLiteral (size);
245 DPRINTF ((message ("could not determine the size of %s", exprNode_unparse (e) ) ) );
246 ret = oldconstraintExpr_makeTermExprNode (e);
251 DPRINTF ((message ("Examining operation %s", exprNode_unparse (e) ) ) );
252 t1 = exprData_getOpA (data);
253 t2 = exprData_getOpB (data);
254 tok = exprData_getOpTok (data);
256 if (lltok_isPlus_Op (tok) || lltok_isMinus_Op (tok) )
258 ce1 = constraintExpr_makeExprNode (t1);
259 ce2 = constraintExpr_makeExprNode (t2);
260 ret = constraintExpr_parseMakeBinaryOp (ce1, tok, ce2);
264 ret = oldconstraintExpr_makeTermExprNode (e);
268 t = exprData_getUopNode (data);
269 ret = constraintExpr_makeExprNode (t);
273 t = exprData_getUopNode (data);
274 tok = exprData_getUopTok (data);
275 if (lltok_isInc_Op (tok) )
278 temp = constraintExpr_makeExprNode(t);
279 ret = constraintExpr_makeIncConstraintExpr(temp);
281 else if (lltok_isDec_Op (tok) )
284 temp = constraintExpr_makeExprNode(t);
285 ret = constraintExpr_makeDecConstraintExpr(temp);
288 ret = oldconstraintExpr_makeTermExprNode (e);
292 t = exprData_getUopNode (data);
293 ret = constraintExpr_makeExprNode (t);
296 t = exprData_getCastNode (data);
297 ret = constraintExpr_makeExprNode (t);
300 t = exprData_getPairA(data);
301 ret = constraintExpr_makeExprNode(t);
302 /*@i3434*/ /*I'm not sure if this is right. I'm adding a break to quite LCLint*/
305 ret = oldconstraintExpr_makeTermExprNode (e);
312 constraintExpr constraintExpr_makeTermExprNode (exprNode e)
314 return oldconstraintExpr_makeTermExprNode(e); //constraintExpr_makeExprNode (e);
318 constraintExpr constraintExpr_makeTermsRef (sRef s)
322 ret = constraintExpr_alloc();
324 ret->data = dmalloc (sizeof *(ret->data) );
325 t = constraintTerm_makesRef (s);
326 ret->data = constraintExprData_termSetTerm (ret->data, t);
330 /*@special@*/ static constraintExpr constraintExpr_makeUnaryOp (void) /*@allocates result->data@*/ /*@defines result->kind@*/
333 ret = constraintExpr_alloc();
334 ret->kind = unaryExpr;
335 ret->data = dmalloc ( sizeof *(ret->data) );
339 static constraintExpr constraintExpr_makeUnaryOpConstraintExpr (constraintExpr cexpr)
342 ret = constraintExpr_makeUnaryOp();
344 ret->data = constraintExprData_unaryExprSetExpr (ret->data, cexpr);
349 constraintExpr constraintExpr_makeMaxSetConstraintExpr (constraintExpr c)
352 ret = constraintExpr_makeUnaryOpConstraintExpr (c);
353 ret->data = constraintExprData_unaryExprSetOp (ret->data, MAXSET);
357 constraintExpr constraintExpr_makeUnaryOpExprNode (exprNode expr)
361 sub = constraintExpr_makeExprNode (expr);
362 ret = constraintExpr_makeUnaryOpConstraintExpr(sub);
368 constraintExpr constraintExpr_makeSRefUnaryOp (sRef s, constraintExprUnaryOpKind op)
373 t = constraintExpr_makeTermsRef (s);
374 ret = constraintExpr_makeUnaryOpConstraintExpr (t);
375 ret->data = constraintExprData_unaryExprSetOp (ret->data, op);
379 constraintExpr constraintExpr_makeSRefMaxRead(sRef s)
381 return (constraintExpr_makeSRefUnaryOp (s, MAXREAD) );
384 constraintExpr constraintExpr_makeSRefMaxset (sRef s)
386 return (constraintExpr_makeSRefUnaryOp (s, MAXSET) );
389 constraintExpr constraintExpr_parseMakeUnaryOp (lltok op, constraintExpr cexpr)
392 ret = constraintExpr_makeUnaryOpConstraintExpr ( cexpr);
397 ret->data = constraintExprData_unaryExprSetOp (ret->data, MAXSET);
400 ret->data = constraintExprData_unaryExprSetOp (ret->data, MAXREAD);
403 llfatalbug(message("Unhandled Operation in Constraint") );
408 constraintExpr constraintExpr_makeMaxSetExpr (exprNode expr)
411 ret = constraintExpr_makeExprNode (expr);
413 ret = constraintExpr_makeMaxSetConstraintExpr (ret);
415 llassert (ret != NULL);
419 constraintExpr constraintExpr_makeMaxReadExpr (exprNode expr)
422 ret = constraintExpr_makeUnaryOpExprNode(expr);
423 ret->data = constraintExprData_unaryExprSetOp (ret->data, MAXREAD);
427 constraintExpr constraintExpr_makeMinSetExpr (exprNode expr)
430 ret = constraintExpr_makeUnaryOpExprNode(expr);
431 ret->data = constraintExprData_unaryExprSetOp (ret->data, MINSET);
435 constraintExpr constraintExpr_makeMinReadExpr (exprNode expr)
438 ret = constraintExpr_makeUnaryOpExprNode(expr);
439 ret->data = constraintExprData_unaryExprSetOp (ret->data, MINREAD);
444 constraintExpr constraintExpr_makeValueExpr (exprNode expr)
447 ret = constraintExpr_makeExprNode (expr);
451 constraintExpr constraintExpr_makeIntLiteral (int i)
455 ret = constraintExpr_alloc();
457 ret->data = dmalloc (sizeof *(ret->data) );
458 t = constraintTerm_makeIntLiteral (i);
459 ret->data = constraintExprData_termSetTerm (ret->data, t);
464 constraintExpr constraintExpr_makeValueInt (int i)
466 return constraintExpr_makeIntLiteral (i);
470 /*@special@*/ static constraintExpr constraintExpr_makeBinaryOp (void) /*@defines result->kind, result->data->binaryOp.binaryOp@*/
473 ret = constraintExpr_alloc();
474 ret->kind = binaryexpr;
475 ret->data = dmalloc ( sizeof *(ret->data) );
476 ret->data = constraintExprData_binaryExprSetOp (ret->data, PLUS);
481 constraintExpr constraintExpr_makeBinaryOpConstraintExpr (constraintExpr expr1,constraintExpr expr2)
485 ret = constraintExpr_makeBinaryOp();
486 ret->data = constraintExprData_binaryExprSetExpr1 (ret->data, expr1);
487 ret->data = constraintExprData_binaryExprSetExpr2 (ret->data, expr2);
491 constraintExpr constraintExpr_parseMakeBinaryOp (constraintExpr expr1, lltok op, constraintExpr expr2)
494 ret = constraintExpr_makeBinaryOpConstraintExpr (expr1, expr2);
496 ret->data = constraintExprData_binaryExprSetOp(ret->data, PLUS);
497 else if (op.tok == TMINUS)
498 ret->data = constraintExprData_binaryExprSetOp(ret->data, MINUS);
506 constraintExpr constraintExpr_makeBinaryOpExprNode (exprNode expr1, exprNode expr2)
509 constraintExpr sub1, sub2;
510 sub1 = constraintExpr_makeTermExprNode (expr1);
511 sub2 = constraintExpr_makeTermExprNode (expr2);
512 ret = constraintExpr_makeBinaryOpConstraintExpr(sub1, sub2);
516 constraintExpr constraintExpr_makeBinaryOpConstraintExprIntLiteral (constraintExpr expr, int literal)
519 constraintExpr constExpr;
521 constExpr = constraintExpr_makeIntLiteral (literal);
522 ret = constraintExpr_makeBinaryOpConstraintExpr (expr, constExpr);
523 ret->data = constraintExprData_binaryExprSetOp(ret->data, PLUS);
527 constraintExpr constraintExpr_makeDecConstraintExpr (constraintExpr expr)
532 inc = constraintExpr_makeIntLiteral (1);
533 ret = constraintExpr_makeBinaryOpConstraintExpr (expr, inc);
534 ret->data = constraintExprData_binaryExprSetOp(ret->data, MINUS);
538 constraintExpr constraintExpr_makeAddConstraintExpr (constraintExpr expr, constraintExpr add)
542 ret = constraintExpr_makeBinaryOpConstraintExpr (expr, add);
544 ret->data = constraintExprData_binaryExprSetOp(ret->data, PLUS);
549 constraintExpr constraintExpr_makeIncConstraintExpr (constraintExpr expr)
554 inc = constraintExpr_makeIntLiteral (1);
555 ret = constraintExpr_makeBinaryOpConstraintExpr (expr, inc);
556 ret->data = constraintExprData_binaryExprSetOp(ret->data, PLUS);
560 cstring constraintExprUnaryOpKind_print (constraintExprUnaryOpKind op)
565 return message("MAXSET");
567 return message("MINSET");
569 return message("MAXREAD");
571 return message("MINREAD");
574 return message ("<(Unary OP OTHER>");
579 cstring constraintExprBinaryOpKind_print (constraintExprBinaryOpKind op)
591 return message ("<binary OP Unknown>");
595 bool constraintExpr_similar (constraintExpr expr1, constraintExpr expr2)
597 constraintExprKind kind;
599 llassert (expr1 != NULL);
600 llassert (expr2 != NULL);
601 if (expr1->kind != expr2->kind)
609 return constraintTerm_similar (constraintExprData_termGetTerm(expr1->data),
610 constraintExprData_termGetTerm(expr2->data) );
611 /*@notreached@*/ break;
614 if (constraintExprData_unaryExprGetOp (expr1->data) != constraintExprData_unaryExprGetOp (expr2->data) )
617 return (constraintExpr_similar (
618 constraintExprData_unaryExprGetExpr (expr1->data),
619 constraintExprData_unaryExprGetExpr (expr2->data)
623 if (constraintExprData_binaryExprGetOp (expr1->data) != constraintExprData_binaryExprGetOp (expr2->data) )
626 if (! constraintExpr_similar (constraintExprData_binaryExprGetExpr1 (expr1->data),
627 constraintExprData_binaryExprGetExpr1 (expr2->data)) )
630 if (! constraintExpr_similar (constraintExprData_binaryExprGetExpr2 (expr1->data),
631 constraintExprData_binaryExprGetExpr2 (expr2->data)) )
646 bool constraintExpr_same (constraintExpr expr1, constraintExpr expr2)
648 constraintExprKind kind;
650 llassert (expr1 != NULL);
651 llassert (expr2 != NULL);
652 if (expr1->kind != expr2->kind)
660 return constraintTerm_similar (constraintExprData_termGetTerm(expr1->data),
661 constraintExprData_termGetTerm(expr2->data) );
662 /*@notreached@*/ break;
665 if (constraintExprData_unaryExprGetOp (expr1->data) != constraintExprData_unaryExprGetOp (expr2->data) )
668 return (constraintExpr_same (
669 constraintExprData_unaryExprGetExpr (expr1->data),
670 constraintExprData_unaryExprGetExpr (expr2->data)
675 if (constraintExprData_binaryExprGetOp (expr1->data) != constraintExprData_binaryExprGetOp (expr2->data) )
678 if (! constraintExpr_same (constraintExprData_binaryExprGetExpr1 (expr1->data),
679 constraintExprData_binaryExprGetExpr1 (expr2->data)) )
682 if (! constraintExpr_same (constraintExprData_binaryExprGetExpr2 (expr1->data),
683 constraintExprData_binaryExprGetExpr2 (expr2->data)) )
687 /*@notreached@*/ break;
698 bool constraintExpr_search (constraintExpr c, constraintExpr old)
701 constraintExprKind kind;
704 if ( constraintExpr_similar (c, old) )
707 DPRINTF((message ("Found %s",
708 constraintExpr_unparse(old)
720 temp = constraintExprData_unaryExprGetExpr (c->data);
721 ret = ret || constraintExpr_search (temp, old);
725 temp = constraintExprData_binaryExprGetExpr1 (c->data);
726 ret = ret || constraintExpr_search(temp, old);
728 temp = constraintExprData_binaryExprGetExpr2 (c->data);
729 ret = ret || constraintExpr_search(temp, old);
739 constraintExpr constraintExpr_searchandreplace (constraintExpr c, constraintExpr old, constraintExpr new )
741 constraintExprKind kind;
744 if ( constraintExpr_similar (c, old) )
747 DPRINTF((message ("Replacing %s with %s",
748 constraintExpr_unparse(old), constraintExpr_unparse(new)
750 return constraintExpr_copy (new);
760 temp = constraintExprData_unaryExprGetExpr (c->data);
761 temp = constraintExpr_searchandreplace (temp, old, new);
762 c->data = constraintExprData_unaryExprSetExpr (c->data, temp);
766 temp = constraintExprData_binaryExprGetExpr1 (c->data);
767 temp = constraintExpr_searchandreplace (temp, old, new);
768 c->data = constraintExprData_binaryExprSetExpr1 (c->data, temp);
770 temp = constraintExprData_binaryExprGetExpr2 (c->data);
771 temp = constraintExpr_searchandreplace (temp, old, new);
772 c->data = constraintExprData_binaryExprSetExpr2 (c->data, temp);
781 constraintExpr constraintExpr_simplifyChildren (constraintExpr c)
783 constraintExprKind kind;
793 temp = constraintExprData_unaryExprGetExpr (c->data);
794 temp = constraintExpr_simplify (temp);
795 c->data = constraintExprData_unaryExprSetExpr (c->data, temp);
798 DPRINTF((message("constraintExpr_simplfiyChildren: simplify binary expression: %s",constraintExpr_unparse(c) ) ) );
799 temp = constraintExprData_binaryExprGetExpr1 (c->data);
800 temp = constraintExpr_simplify (temp);
802 c->data = constraintExprData_binaryExprSetExpr1 (c->data, temp);
804 temp = constraintExprData_binaryExprGetExpr2 (c->data);
805 temp = constraintExpr_simplify (temp);
807 c->data = constraintExprData_binaryExprSetExpr2 (c->data, temp);
817 constraintExpr constraintExpr_setFileloc (constraintExpr c, fileloc loc)
827 t = constraintExprData_termGetTerm (c->data);
828 t = constraintTerm_setFileloc (t, loc);
829 c->data = constraintExprData_termSetTerm (c->data, t);
833 temp = constraintExprData_binaryExprGetExpr1 (c->data);
834 temp = constraintExpr_setFileloc (temp, loc);
835 c->data = constraintExprData_binaryExprSetExpr1 (c->data, temp);
837 temp = constraintExprData_binaryExprGetExpr2 (c->data);
838 temp = constraintExpr_setFileloc (temp, loc);
839 c->data = constraintExprData_binaryExprSetExpr2 (c->data, temp);
842 temp = constraintExprData_unaryExprGetExpr (c->data);
843 temp = constraintExpr_setFileloc (temp, loc);
844 c->data = constraintExprData_unaryExprSetExpr (c->data, temp);
850 constraintExpr constraintExpr_simplifybinaryExpr (constraintExpr c)
852 constraintExpr e1, e2;
854 e1 = constraintExprData_binaryExprGetExpr1 (c->data);
855 e2 = constraintExprData_binaryExprGetExpr2 (c->data);
857 if (constraintExpr_canGetValue (e1) && constraintExpr_canGetValue(e2) )
861 i = constraintExpr_getValue(e1) + constraintExpr_getValue (e2);
863 c = constraintExpr_makeIntLiteral (i);
870 constraintExpr constraintExpr_subtractExpr (constraintExpr expr, constraintExpr addent)
874 DPRINTF ( (message ("Doing subtraceTerm simplification") ) );
876 new = constraintExpr_makeBinaryOpConstraintExpr (expr, addent);
877 new->data = constraintExprData_binaryExprSetOp (new->data, MINUS);
881 constraintExpr constraintExpr_addExpr (constraintExpr expr, constraintExpr addent)
885 DPRINTF ( (message ("Doing addTerm simplification") ) );
887 new = constraintExpr_makeBinaryOpConstraintExpr (expr, addent);
888 new->data = constraintExprData_binaryExprSetOp (new->data, PLUS);
892 constraintExpr constraintExpr_solveBinaryExpr (constraintExpr lexpr, constraintExpr expr)
894 constraintExpr expr1, expr2;
895 constraintExprBinaryOpKind op;
897 if (lexpr->kind != binaryexpr)
900 expr2 = constraintExprData_binaryExprGetExpr2 (lexpr->data);
901 expr1 = constraintExprData_binaryExprGetExpr1 (lexpr->data);
902 op = constraintExprData_binaryExprGetOp (lexpr->data);
906 #warning make sure this works
908 lexpr->kind = expr1->kind;
909 lexpr->data = copyExprData (expr1->data, expr1->kind);
913 expr = constraintExpr_subtractExpr (expr, expr2);
915 expr = constraintExpr_addExpr (expr, expr2);
920 #warning this needs to be checked
921 expr = constraintExpr_solveBinaryExpr (expr1, expr);
923 expr = constraintExpr_solveBinaryExpr (expr2, expr);
928 constraintExpr constraintExpr_simplifyunaryExpr (constraintExpr c)
932 llassert (c->kind == unaryExpr);
934 DPRINTF ( (message ("Doing constraintExpr_simplifyunaryExpr:%s", constraintExpr_unparse (c) ) ) );
936 if ( (constraintExprData_unaryExprGetOp (c->data) != MAXSET) &&
937 (constraintExprData_unaryExprGetOp (c->data) != MAXREAD) )
941 // pattern mxr ( var + const) = mxr(var) - const
943 exp = constraintExprData_unaryExprGetExpr (c->data);
945 if (exp->kind == term)
947 constraintTerm cterm;
949 cterm = constraintExprData_termGetTerm (exp->data);
951 if (constraintTerm_isStringLiteral(cterm) )
954 val = constraintTerm_getStringLiteral (cterm);
955 if (constraintExprData_unaryExprGetOp (c->data) == MAXSET)
957 return constraintExpr_makeIntLiteral ((int)strlen (val) );
959 if (constraintExprData_unaryExprGetOp (c->data) == MAXREAD)
961 return constraintExpr_makeIntLiteral ((int)strlen (val) );
968 if (exp->kind != binaryexpr)
971 if (constraintExprData_binaryExprGetOp (exp->data) == PLUS )
974 // if (constraintExpr_canGetValue (constraintExprData_binaryExprGetExpr2 (exp->data) ) )
977 constraintExpr temp, temp2, new;
979 DPRINTF ( (message ("Doing fancy simplification") ) );
981 temp = constraintExprData_binaryExprGetExpr2 (exp->data);
983 temp2 = constraintExprData_binaryExprGetExpr1 (exp->data);
984 c->data = constraintExprData_unaryExprSetExpr (c->data, temp2);
988 new = constraintExpr_subtractExpr (c, temp);
990 DPRINTF ( (message ("Done fancy simplification:%s", constraintExpr_unparse (new) ) ) );
996 DPRINTF ( (message ("Done simplification:%s", constraintExpr_unparse (c) ) ) );
1001 constraintExpr constraintExpr_simplify (constraintExpr c)
1003 constraintExprKind kind;
1007 DPRINTF ( (message ("Doing constraintExpr_simplify:%s", constraintExpr_unparse (c) ) ) );
1009 c = constraintExpr_simplifyChildren (c);
1010 c = constraintExpr_combineConstants (c);
1011 c = constraintExpr_simplifyChildren (c);
1018 t = constraintExprData_termGetTerm (c->data);
1019 t = constraintTerm_simplify (t);
1020 c->data = constraintExprData_termSetTerm (c->data, t);
1023 c = constraintExpr_simplifyunaryExpr (c);
1026 c = constraintExpr_simplifybinaryExpr (c);
1035 cstring constraintExpr_unparse (constraintExpr ex)
1038 constraintExprKind kind;
1040 llassert (ex != NULL);
1047 st = message ("(%s) ", constraintTerm_print (constraintExprData_termGetTerm(ex->data) ) );
1050 st = message ("%s (%s)",
1051 constraintExprUnaryOpKind_print (constraintExprData_unaryExprGetOp (ex->data)
1053 constraintExpr_unparse (constraintExprData_unaryExprGetExpr (ex->data) )
1057 st = message ("(%s) %s (%s)",
1058 constraintExpr_unparse (constraintExprData_binaryExprGetExpr1 (ex->data) ),
1059 constraintExprBinaryOpKind_print (constraintExprData_binaryExprGetOp (ex->data)
1061 constraintExpr_unparse (constraintExprData_binaryExprGetExpr2 (ex->data) )
1066 st = message ("error");
1070 DPRINTF((message ("constraintExpr_unparse: '%s'",st) ) );
1074 constraintExpr constraintExpr_doSRefFixBaseParam (/*@returned@*/ constraintExpr expr, exprNodeList arglist)
1076 constraintTerm Term;
1077 constraintExprKind kind;
1078 constraintExpr expr1, expr2;
1079 constraintExprData data;
1080 llassert (expr != NULL);
1089 Term = constraintExprData_termGetTerm(data);
1090 Term = constraintTerm_doSRefFixBaseParam (Term, arglist);
1091 data = constraintExprData_termSetTerm(data, Term);
1094 expr1 = constraintExprData_unaryExprGetExpr (data);
1095 expr1 = constraintExpr_doSRefFixBaseParam (expr1, arglist);
1096 data = constraintExprData_unaryExprSetExpr (data, expr1);
1099 expr1 = constraintExprData_binaryExprGetExpr1 (data);
1100 expr2 = constraintExprData_binaryExprGetExpr2 (data);
1102 expr1 = constraintExpr_doSRefFixBaseParam (expr1, arglist);
1103 data = constraintExprData_binaryExprSetExpr1 (data, expr1);
1104 expr2 = constraintExpr_doSRefFixBaseParam (expr2, arglist);
1105 data = constraintExprData_binaryExprSetExpr2 (data, expr2);
1115 constraintExpr constraintExpr_doSRefFixConstraintParam (/*@returned@*/ constraintExpr expr, exprNodeList arglist) /*@modifies@*/
1117 constraintExprKind kind;
1118 constraintExpr expr1, expr2;
1119 constraintExprData data;
1120 llassert (expr != NULL);
1129 expr = doSRefFixConstraintParamTerm (expr, arglist);
1132 expr1 = constraintExprData_unaryExprGetExpr (data);
1133 expr1 = constraintExpr_doSRefFixConstraintParam (expr1, arglist);
1134 data = constraintExprData_unaryExprSetExpr (data, expr1);
1137 expr1 = constraintExprData_binaryExprGetExpr1 (data);
1138 expr2 = constraintExprData_binaryExprGetExpr2 (data);
1140 expr1 = constraintExpr_doSRefFixConstraintParam (expr1, arglist);
1141 data = constraintExprData_binaryExprSetExpr1 (data, expr1);
1142 expr2 = constraintExpr_doSRefFixConstraintParam (expr2, arglist);
1143 data = constraintExprData_binaryExprSetExpr2 (data, expr2);
1153 constraintExpr constraintExpr_doFixResult (/*@returned@*/ constraintExpr expr, exprNode fcnCall)
1155 constraintExprKind kind;
1156 constraintExpr expr1, expr2;
1157 constraintExprData data;
1158 llassert (expr != NULL);
1167 expr = doFixResultTerm (expr, fcnCall);
1170 expr1 = constraintExprData_unaryExprGetExpr (data);
1171 expr1 = constraintExpr_doFixResult (expr1, fcnCall);
1172 data = constraintExprData_unaryExprSetExpr (data, expr1);
1175 expr1 = constraintExprData_binaryExprGetExpr1 (data);
1176 expr2 = constraintExprData_binaryExprGetExpr2 (data);
1178 expr1 = constraintExpr_doFixResult (expr1, fcnCall);
1179 data = constraintExprData_binaryExprSetExpr1 (data, expr1);
1180 expr2 = constraintExpr_doFixResult (expr2, fcnCall);
1181 data = constraintExprData_binaryExprSetExpr2 (data, expr2);
1191 cstring constraintExpr_print (constraintExpr expr) /*@*/
1193 return constraintExpr_unparse(expr);
1196 bool constraintExpr_hasMaxSet (constraintExpr expr) /*@*/
1200 t = constraintExpr_unparse(expr);
1202 if (strstr (t, "MAXSET") != NULL )
1210 /*returns 1 0 -1 like strcmp
1215 int constraintExpr_compare (constraintExpr expr1, constraintExpr expr2)
1219 if (constraintExpr_similar (expr1, expr2) )
1223 value1 = constraintExpr_getValue(expr1);
1224 value2 = constraintExpr_getValue(expr2);
1226 if (value1 > value2)
1229 if (value1 == value2)
1236 int constraintExpr_getValue (constraintExpr expr)
1238 llassert (expr->kind == term);
1239 return (constraintTerm_getValue (constraintExprData_termGetTerm (expr->data) ) );
1242 bool constraintExpr_canGetValue (constraintExpr expr)
1247 return constraintTerm_canGetValue (constraintExprData_termGetTerm (expr->data) );
1256 bool constraintExpr_canCompare (constraintExpr expr1, constraintExpr expr2)
1259 llassert(expr1 && expr2);
1260 return ( constraintExpr_canGetValue(expr1) &&
1261 constraintExpr_canGetValue(expr2)
1266 fileloc constraintExpr_getFileloc (constraintExpr expr)
1270 constraintExprKind kind;
1277 t = constraintExprData_termGetTerm (expr->data);
1278 return (constraintTerm_getFileloc (t) );
1282 e = constraintExprData_unaryExprGetExpr (expr->data);
1283 return (constraintExpr_getFileloc (e) );
1287 e = constraintExprData_binaryExprGetExpr1 (expr->data);
1288 return (constraintExpr_getFileloc (e) );
1293 // llfatalbug("Code should be reached");
1294 return (fileloc_undefined);
1297 /*drl moved from constriantTerm.c 5/20/001*/
1298 static constraintExpr
1299 doFixResultTerm (constraintExpr e, exprNode fcnCall)
1303 /*maybe this should move to cosntraintExpr.c -drl7x 5/18/01*/
1304 /*@i22*/ constraintExprData data = e->data;
1306 /*@i22*/constraintExprKind kind = e->kind;
1310 llassert(kind == term);
1312 t = constraintExprData_termGetTerm (data);
1313 llassert (t != NULL);
1316 switch (constrainTerm_getKind(t) )
1324 s = t = constraintTerm_getSRef(t);
1325 if (sRef_isResult (s))
1327 ret = constraintExpr_makeExprNode(fcnCall);
1338 /*drl moved from constriantTerm.c 5/20/001*/
1339 static constraintExpr
1340 doSRefFixConstraintParamTerm (constraintExpr e, exprNodeList arglist)
1344 /*maybe this should move to cosntraintExpr.c -drl7x 5/18/01*/
1346 /*@i22*/ constraintExprData data = e->data;
1348 /*@i22*/ constraintExprKind kind = e->kind;
1352 llassert(kind == term);
1354 t = constraintExprData_termGetTerm (data);
1355 llassert (t != NULL);
1362 // s = message ("%s @ %s ", exprNode_unparse (term->value.expr),
1363 // fileloc_unparse (term->loc) );
1366 // s = message (" %d ", term->value.intlit);
1370 ret = sRef_fixConstraintParam (t->value.sref, arglist);
1372 // s = message ("%s ", sRef_unparse (term->value.sref) );
1383 /* bool constraintExpr_includesTerm (constraintExpr expr, constraintTerm term) */
1385 /* if (constraintTerm_hasTerm (expr->term, term) ) */
1388 /* if ( (expr->expr) != NULL) */
1390 /* return ( constraintExpr_includesTerm (expr->expr, term) ); */