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);
106 if (constraintExprData_binaryExprGetOp (expr->data) == PLUS )
107 return (constraintExpr_makeIntLiteral ( (t1+t2) ));
108 else if (constraintExprData_binaryExprGetOp (expr->data) == MINUS)
109 return (constraintExpr_makeIntLiteral ( (t1-t2) ));
115 if (constraintExpr_isLit (expr1) )
118 /*handle MINUS case right */
120 *literal += constraintExpr_getValue (expr1);
127 if (constraintExpr_isLit (expr2) )
131 if (constraintExprData_binaryExprGetOp (expr->data) == PLUS )
132 *literal += constraintExpr_getValue (expr2);
134 *literal -= constraintExpr_getValue (expr2);
141 DPRINTF( (message("constraintExpr_propagateConstants returning: %s", constraintExpr_unparse(expr) ) ) );
147 static constraintExpr constraintExpr_combineConstants ( constraintExpr expr ) /*@modifies@*/
152 DPRINTF ( (message ("Before combine %s", constraintExpr_unparse(expr) ) ) );
153 expr = constraintExpr_propagateConstants (expr, &propagate, &literal);
162 ret = constraintExpr_makeBinaryOpConstraintExprIntLiteral (expr, literal);
166 DPRINTF ( (message ("After combine %s", constraintExpr_unparse(expr) ) ) );
171 static constraintExpr constraintExpr_alloc (void) /*@post:isnull result->data@*/
174 ret = dmalloc (sizeof (*ret) );
180 static constraintExprData copyExprData (constraintExprData data, constraintExprKind kind)
182 constraintExprData ret;
183 llassert(constraintExprData_isDefined(data));
188 ret = constraintExprData_copyBinaryExpr(data);
191 ret = constraintExprData_copyUnaryExpr(data);
194 ret = constraintExprData_copyTerm(data);
202 constraintExpr constraintExpr_copy (constraintExpr expr)
205 ret = constraintExpr_alloc();
206 ret->kind = expr->kind;
208 ret->data = copyExprData (expr->data, expr->kind);
213 constraintExpr oldconstraintExpr_makeTermExprNode (exprNode e)
217 ret = constraintExpr_alloc();
219 ret->data = dmalloc (sizeof *(ret->data) );
220 t = constraintTerm_makeExprNode (e);
221 ret->data = constraintExprData_termSetTerm (ret->data, t);
225 constraintExpr constraintExpr_makeExprNode (exprNode e)
228 constraintExpr ret, ce1, ce2;
234 llassert (e != NULL);
241 t = exprData_getSingle (data);
242 s = exprNode_getSref (t);
243 if (sRef_isFixedArray(s) )
247 size = (int) sRef_getArraySize(s);
248 ret = constraintExpr_makeIntLiteral (size);
252 DPRINTF ((message ("could not determine the size of %s", exprNode_unparse (e) ) ) );
253 ret = oldconstraintExpr_makeTermExprNode (e);
258 DPRINTF ((message ("Examining operation %s", exprNode_unparse (e) ) ) );
259 t1 = exprData_getOpA (data);
260 t2 = exprData_getOpB (data);
261 tok = exprData_getOpTok (data);
263 if (lltok_isPlus_Op (tok) || lltok_isMinus_Op (tok) )
265 ce1 = constraintExpr_makeExprNode (t1);
266 ce2 = constraintExpr_makeExprNode (t2);
267 ret = constraintExpr_parseMakeBinaryOp (ce1, tok, ce2);
271 ret = oldconstraintExpr_makeTermExprNode (e);
275 t = exprData_getUopNode (data);
276 ret = constraintExpr_makeExprNode (t);
280 t = exprData_getUopNode (data);
281 tok = exprData_getUopTok (data);
282 if (lltok_isInc_Op (tok) )
285 temp = constraintExpr_makeExprNode(t);
286 ret = constraintExpr_makeIncConstraintExpr(temp);
288 else if (lltok_isDec_Op (tok) )
291 temp = constraintExpr_makeExprNode(t);
292 ret = constraintExpr_makeDecConstraintExpr(temp);
295 ret = oldconstraintExpr_makeTermExprNode (e);
299 t = exprData_getUopNode (data);
300 ret = constraintExpr_makeExprNode (t);
303 t = exprData_getCastNode (data);
304 ret = constraintExpr_makeExprNode (t);
307 t = exprData_getPairA(data);
308 ret = constraintExpr_makeExprNode(t);
309 /*@i3434*/ /*I'm not sure if this is right. I'm adding a break to quite LCLint*/
312 ret = oldconstraintExpr_makeTermExprNode (e);
319 constraintExpr constraintExpr_makeTermExprNode (exprNode e)
321 return oldconstraintExpr_makeTermExprNode(e); //constraintExpr_makeExprNode (e);
325 constraintExpr constraintExpr_makeTermsRef (sRef s)
329 ret = constraintExpr_alloc();
331 ret->data = dmalloc (sizeof *(ret->data) );
332 t = constraintTerm_makesRef (s);
333 ret->data = constraintExprData_termSetTerm (ret->data, t);
337 /*@special@*/ static constraintExpr constraintExpr_makeUnaryOp (void) /*@allocates result->data@*/ /*@defines result->kind@*/
340 ret = constraintExpr_alloc();
341 ret->kind = unaryExpr;
342 ret->data = dmalloc ( sizeof *(ret->data) );
346 static constraintExpr constraintExpr_makeUnaryOpConstraintExpr (constraintExpr cexpr)
349 ret = constraintExpr_makeUnaryOp();
353 ret->data = constraintExprData_unaryExprSetExpr (ret->data, cexpr);
354 ret->data = constraintExprData_unaryExprSetOp (ret->data, UNARYOP_UNDEFINED);
362 constraintExpr constraintExpr_makeMaxSetConstraintExpr (constraintExpr c)
365 ret = constraintExpr_makeUnaryOpConstraintExpr (c);
366 ret->data = constraintExprData_unaryExprSetOp (ret->data, MAXSET);
370 constraintExpr constraintExpr_makeUnaryOpExprNode (exprNode expr)
374 sub = constraintExpr_makeExprNode (expr);
375 ret = constraintExpr_makeUnaryOpConstraintExpr(sub);
381 constraintExpr constraintExpr_makeSRefUnaryOp (sRef s, constraintExprUnaryOpKind op)
386 t = constraintExpr_makeTermsRef (s);
387 ret = constraintExpr_makeUnaryOpConstraintExpr (t);
388 ret->data = constraintExprData_unaryExprSetOp (ret->data, op);
392 constraintExpr constraintExpr_makeSRefMaxRead(sRef s)
394 return (constraintExpr_makeSRefUnaryOp (s, MAXREAD) );
397 constraintExpr constraintExpr_makeSRefMaxset (sRef s)
399 return (constraintExpr_makeSRefUnaryOp (s, MAXSET) );
402 constraintExpr constraintExpr_parseMakeUnaryOp (lltok op, constraintExpr cexpr)
405 ret = constraintExpr_makeUnaryOpConstraintExpr ( cexpr);
410 ret->data = constraintExprData_unaryExprSetOp (ret->data, MAXSET);
413 ret->data = constraintExprData_unaryExprSetOp (ret->data, MAXREAD);
416 llfatalbug(message("Unhandled Operation in Constraint") );
421 constraintExpr constraintExpr_makeMaxSetExpr (exprNode expr)
424 ret = constraintExpr_makeExprNode (expr);
426 ret = constraintExpr_makeMaxSetConstraintExpr (ret);
428 llassert (ret != NULL);
432 constraintExpr constraintExpr_makeMaxReadExpr (exprNode expr)
435 ret = constraintExpr_makeUnaryOpExprNode(expr);
436 ret->data = constraintExprData_unaryExprSetOp (ret->data, MAXREAD);
440 constraintExpr constraintExpr_makeMinSetExpr (exprNode expr)
443 ret = constraintExpr_makeUnaryOpExprNode(expr);
444 ret->data = constraintExprData_unaryExprSetOp (ret->data, MINSET);
448 constraintExpr constraintExpr_makeMinReadExpr (exprNode expr)
451 ret = constraintExpr_makeUnaryOpExprNode(expr);
452 ret->data = constraintExprData_unaryExprSetOp (ret->data, MINREAD);
457 constraintExpr constraintExpr_makeValueExpr (exprNode expr)
460 ret = constraintExpr_makeExprNode (expr);
464 constraintExpr constraintExpr_makeIntLiteral (int i)
468 ret = constraintExpr_alloc();
470 ret->data = dmalloc (sizeof *(ret->data) );
471 t = constraintTerm_makeIntLiteral (i);
472 ret->data = constraintExprData_termSetTerm (ret->data, t);
477 constraintExpr constraintExpr_makeValueInt (int i)
479 return constraintExpr_makeIntLiteral (i);
483 /*@special@*/ static constraintExpr constraintExpr_makeBinaryOp (void) /*@defines result->kind, result->data->binaryOp.binaryOp@*/
486 ret = constraintExpr_alloc();
487 ret->kind = binaryexpr;
488 ret->data = dmalloc ( sizeof *(ret->data) );
489 ret->data = constraintExprData_binaryExprSetOp (ret->data, PLUS);
494 constraintExpr constraintExpr_makeBinaryOpConstraintExpr (constraintExpr expr1,constraintExpr expr2)
498 ret = constraintExpr_makeBinaryOp();
499 ret->data = constraintExprData_binaryExprSetExpr1 (ret->data, expr1);
500 ret->data = constraintExprData_binaryExprSetExpr2 (ret->data, expr2);
504 constraintExpr constraintExpr_parseMakeBinaryOp (constraintExpr expr1, lltok op, constraintExpr expr2)
507 ret = constraintExpr_makeBinaryOpConstraintExpr (expr1, expr2);
509 ret->data = constraintExprData_binaryExprSetOp(ret->data, PLUS);
510 else if (op.tok == TMINUS)
511 ret->data = constraintExprData_binaryExprSetOp(ret->data, MINUS);
519 constraintExpr constraintExpr_makeBinaryOpExprNode (exprNode expr1, exprNode expr2)
522 constraintExpr sub1, sub2;
523 sub1 = constraintExpr_makeTermExprNode (expr1);
524 sub2 = constraintExpr_makeTermExprNode (expr2);
525 ret = constraintExpr_makeBinaryOpConstraintExpr(sub1, sub2);
529 constraintExpr constraintExpr_makeBinaryOpConstraintExprIntLiteral (constraintExpr expr, int literal)
532 constraintExpr constExpr;
534 constExpr = constraintExpr_makeIntLiteral (literal);
535 ret = constraintExpr_makeBinaryOpConstraintExpr (expr, constExpr);
536 ret->data = constraintExprData_binaryExprSetOp(ret->data, PLUS);
540 constraintExpr constraintExpr_makeDecConstraintExpr (constraintExpr expr)
545 inc = constraintExpr_makeIntLiteral (1);
546 ret = constraintExpr_makeBinaryOpConstraintExpr (expr, inc);
547 ret->data = constraintExprData_binaryExprSetOp(ret->data, MINUS);
551 constraintExpr constraintExpr_makeAddConstraintExpr (constraintExpr expr, constraintExpr add)
555 ret = constraintExpr_makeBinaryOpConstraintExpr (expr, add);
557 ret->data = constraintExprData_binaryExprSetOp(ret->data, PLUS);
562 constraintExpr constraintExpr_makeIncConstraintExpr (constraintExpr expr)
567 inc = constraintExpr_makeIntLiteral (1);
568 ret = constraintExpr_makeBinaryOpConstraintExpr (expr, inc);
569 ret->data = constraintExprData_binaryExprSetOp(ret->data, PLUS);
573 cstring constraintExprUnaryOpKind_print (constraintExprUnaryOpKind op)
578 return message("MAXSET");
580 return message("MINSET");
582 return message("MAXREAD");
584 return message("MINREAD");
587 return message ("<(Unary OP OTHER>");
592 cstring constraintExprBinaryOpKind_print (constraintExprBinaryOpKind op)
604 return message ("<binary OP Unknown>");
608 bool constraintExpr_similar (constraintExpr expr1, constraintExpr expr2)
610 constraintExprKind kind;
612 llassert (expr1 != NULL);
613 llassert (expr2 != NULL);
614 if (expr1->kind != expr2->kind)
622 return constraintTerm_similar (constraintExprData_termGetTerm(expr1->data),
623 constraintExprData_termGetTerm(expr2->data) );
624 /*@notreached@*/ break;
627 if (constraintExprData_unaryExprGetOp (expr1->data) != constraintExprData_unaryExprGetOp (expr2->data) )
630 return (constraintExpr_similar (
631 constraintExprData_unaryExprGetExpr (expr1->data),
632 constraintExprData_unaryExprGetExpr (expr2->data)
636 if (constraintExprData_binaryExprGetOp (expr1->data) != constraintExprData_binaryExprGetOp (expr2->data) )
639 if (! constraintExpr_similar (constraintExprData_binaryExprGetExpr1 (expr1->data),
640 constraintExprData_binaryExprGetExpr1 (expr2->data)) )
643 if (! constraintExpr_similar (constraintExprData_binaryExprGetExpr2 (expr1->data),
644 constraintExprData_binaryExprGetExpr2 (expr2->data)) )
659 bool constraintExpr_same (constraintExpr expr1, constraintExpr expr2)
661 constraintExprKind kind;
663 llassert (expr1 != NULL);
664 llassert (expr2 != NULL);
665 if (expr1->kind != expr2->kind)
673 return constraintTerm_similar (constraintExprData_termGetTerm(expr1->data),
674 constraintExprData_termGetTerm(expr2->data) );
675 /*@notreached@*/ break;
678 if (constraintExprData_unaryExprGetOp (expr1->data) != constraintExprData_unaryExprGetOp (expr2->data) )
681 return (constraintExpr_same (
682 constraintExprData_unaryExprGetExpr (expr1->data),
683 constraintExprData_unaryExprGetExpr (expr2->data)
688 if (constraintExprData_binaryExprGetOp (expr1->data) != constraintExprData_binaryExprGetOp (expr2->data) )
691 if (! constraintExpr_same (constraintExprData_binaryExprGetExpr1 (expr1->data),
692 constraintExprData_binaryExprGetExpr1 (expr2->data)) )
695 if (! constraintExpr_same (constraintExprData_binaryExprGetExpr2 (expr1->data),
696 constraintExprData_binaryExprGetExpr2 (expr2->data)) )
700 /*@notreached@*/ break;
711 bool constraintExpr_search (constraintExpr c, constraintExpr old)
714 constraintExprKind kind;
717 if ( constraintExpr_similar (c, old) )
720 DPRINTF((message ("Found %s",
721 constraintExpr_unparse(old)
733 temp = constraintExprData_unaryExprGetExpr (c->data);
734 ret = ret || constraintExpr_search (temp, old);
738 temp = constraintExprData_binaryExprGetExpr1 (c->data);
739 ret = ret || constraintExpr_search(temp, old);
741 temp = constraintExprData_binaryExprGetExpr2 (c->data);
742 ret = ret || constraintExpr_search(temp, old);
752 constraintExpr constraintExpr_searchandreplace (constraintExpr c, constraintExpr old, constraintExpr new )
754 constraintExprKind kind;
757 if ( constraintExpr_similar (c, old) )
760 DPRINTF((message ("Replacing %s with %s",
761 constraintExpr_unparse(old), constraintExpr_unparse(new)
763 return constraintExpr_copy (new);
773 temp = constraintExprData_unaryExprGetExpr (c->data);
774 temp = constraintExpr_searchandreplace (temp, old, new);
775 c->data = constraintExprData_unaryExprSetExpr (c->data, temp);
779 temp = constraintExprData_binaryExprGetExpr1 (c->data);
780 temp = constraintExpr_searchandreplace (temp, old, new);
781 c->data = constraintExprData_binaryExprSetExpr1 (c->data, temp);
783 temp = constraintExprData_binaryExprGetExpr2 (c->data);
784 temp = constraintExpr_searchandreplace (temp, old, new);
785 c->data = constraintExprData_binaryExprSetExpr2 (c->data, temp);
794 constraintExpr constraintExpr_simplifyChildren (constraintExpr c)
796 constraintExprKind kind;
806 temp = constraintExprData_unaryExprGetExpr (c->data);
807 temp = constraintExpr_simplify (temp);
808 c->data = constraintExprData_unaryExprSetExpr (c->data, temp);
811 DPRINTF((message("constraintExpr_simplfiyChildren: simplify binary expression: %s",constraintExpr_unparse(c) ) ) );
812 temp = constraintExprData_binaryExprGetExpr1 (c->data);
813 temp = constraintExpr_simplify (temp);
815 c->data = constraintExprData_binaryExprSetExpr1 (c->data, temp);
817 temp = constraintExprData_binaryExprGetExpr2 (c->data);
818 temp = constraintExpr_simplify (temp);
820 c->data = constraintExprData_binaryExprSetExpr2 (c->data, temp);
830 constraintExpr constraintExpr_setFileloc (constraintExpr c, fileloc loc)
840 t = constraintExprData_termGetTerm (c->data);
841 t = constraintTerm_setFileloc (t, loc);
842 c->data = constraintExprData_termSetTerm (c->data, t);
846 temp = constraintExprData_binaryExprGetExpr1 (c->data);
847 temp = constraintExpr_setFileloc (temp, loc);
848 c->data = constraintExprData_binaryExprSetExpr1 (c->data, temp);
850 temp = constraintExprData_binaryExprGetExpr2 (c->data);
851 temp = constraintExpr_setFileloc (temp, loc);
852 c->data = constraintExprData_binaryExprSetExpr2 (c->data, temp);
855 temp = constraintExprData_unaryExprGetExpr (c->data);
856 temp = constraintExpr_setFileloc (temp, loc);
857 c->data = constraintExprData_unaryExprSetExpr (c->data, temp);
863 constraintExpr constraintExpr_simplifybinaryExpr (constraintExpr c)
865 constraintExpr e1, e2;
867 e1 = constraintExprData_binaryExprGetExpr1 (c->data);
868 e2 = constraintExprData_binaryExprGetExpr2 (c->data);
870 if (constraintExpr_canGetValue (e1) && constraintExpr_canGetValue(e2) )
874 i = constraintExpr_getValue(e1) + constraintExpr_getValue (e2);
876 c = constraintExpr_makeIntLiteral (i);
883 constraintExpr constraintExpr_subtractExpr (constraintExpr expr, constraintExpr addent)
887 DPRINTF ( (message ("Doing subtraceTerm simplification") ) );
889 new = constraintExpr_makeBinaryOpConstraintExpr (expr, addent);
890 new->data = constraintExprData_binaryExprSetOp (new->data, MINUS);
894 constraintExpr constraintExpr_addExpr (constraintExpr expr, constraintExpr addent)
898 DPRINTF ( (message ("Doing addTerm simplification") ) );
900 new = constraintExpr_makeBinaryOpConstraintExpr (expr, addent);
901 new->data = constraintExprData_binaryExprSetOp (new->data, PLUS);
905 constraintExpr constraintExpr_solveBinaryExpr (constraintExpr lexpr, constraintExpr expr)
907 constraintExpr expr1, expr2;
908 constraintExprBinaryOpKind op;
910 if (lexpr->kind != binaryexpr)
913 expr2 = constraintExprData_binaryExprGetExpr2 (lexpr->data);
914 expr1 = constraintExprData_binaryExprGetExpr1 (lexpr->data);
915 op = constraintExprData_binaryExprGetOp (lexpr->data);
919 #warning make sure this works
921 lexpr->kind = expr1->kind;
922 lexpr->data = copyExprData (expr1->data, expr1->kind);
926 expr = constraintExpr_subtractExpr (expr, expr2);
928 expr = constraintExpr_addExpr (expr, expr2);
933 #warning this needs to be checked
934 expr = constraintExpr_solveBinaryExpr (expr1, expr);
936 expr = constraintExpr_solveBinaryExpr (expr2, expr);
941 constraintExpr constraintExpr_simplifyunaryExpr (constraintExpr c)
945 llassert (c->kind == unaryExpr);
947 DPRINTF ( (message ("Doing constraintExpr_simplifyunaryExpr:%s", constraintExpr_unparse (c) ) ) );
949 if ( (constraintExprData_unaryExprGetOp (c->data) != MAXSET) &&
950 (constraintExprData_unaryExprGetOp (c->data) != MAXREAD) )
954 // pattern mxr ( var + const) = mxr(var) - const
956 exp = constraintExprData_unaryExprGetExpr (c->data);
958 if (exp->kind == term)
960 constraintTerm cterm;
962 cterm = constraintExprData_termGetTerm (exp->data);
964 if (constraintTerm_isStringLiteral(cterm) )
967 val = constraintTerm_getStringLiteral (cterm);
968 if (constraintExprData_unaryExprGetOp (c->data) == MAXSET)
970 return constraintExpr_makeIntLiteral ((int)strlen (val) );
972 if (constraintExprData_unaryExprGetOp (c->data) == MAXREAD)
974 return constraintExpr_makeIntLiteral ((int)strlen (val) );
981 if (exp->kind != binaryexpr)
984 if (constraintExprData_binaryExprGetOp (exp->data) == PLUS )
987 // if (constraintExpr_canGetValue (constraintExprData_binaryExprGetExpr2 (exp->data) ) )
990 constraintExpr temp, temp2, new;
992 DPRINTF ( (message ("Doing fancy simplification") ) );
994 temp = constraintExprData_binaryExprGetExpr2 (exp->data);
996 temp2 = constraintExprData_binaryExprGetExpr1 (exp->data);
997 c->data = constraintExprData_unaryExprSetExpr (c->data, temp2);
1001 new = constraintExpr_subtractExpr (c, temp);
1003 DPRINTF ( (message ("Done fancy simplification:%s", constraintExpr_unparse (new) ) ) );
1009 DPRINTF ( (message ("Done simplification:%s", constraintExpr_unparse (c) ) ) );
1014 constraintExpr constraintExpr_simplify (constraintExpr c)
1016 constraintExprKind kind;
1020 DPRINTF ( (message ("Doing constraintExpr_simplify:%s", constraintExpr_unparse (c) ) ) );
1022 c = constraintExpr_simplifyChildren (c);
1023 c = constraintExpr_combineConstants (c);
1024 c = constraintExpr_simplifyChildren (c);
1031 t = constraintExprData_termGetTerm (c->data);
1032 t = constraintTerm_simplify (t);
1033 c->data = constraintExprData_termSetTerm (c->data, t);
1036 c = constraintExpr_simplifyunaryExpr (c);
1039 c = constraintExpr_simplifybinaryExpr (c);
1048 cstring constraintExpr_unparse (constraintExpr ex)
1051 constraintExprKind kind;
1053 llassert (ex != NULL);
1060 st = message ("(%s) ", constraintTerm_print (constraintExprData_termGetTerm(ex->data) ) );
1063 st = message ("%s (%s)",
1064 constraintExprUnaryOpKind_print (constraintExprData_unaryExprGetOp (ex->data)
1066 constraintExpr_unparse (constraintExprData_unaryExprGetExpr (ex->data) )
1070 st = message ("(%s) %s (%s)",
1071 constraintExpr_unparse (constraintExprData_binaryExprGetExpr1 (ex->data) ),
1072 constraintExprBinaryOpKind_print (constraintExprData_binaryExprGetOp (ex->data)
1074 constraintExpr_unparse (constraintExprData_binaryExprGetExpr2 (ex->data) )
1079 st = message ("error");
1083 DPRINTF((message ("constraintExpr_unparse: '%s'",st) ) );
1087 constraintExpr constraintExpr_doSRefFixBaseParam (/*@returned@*/ constraintExpr expr, exprNodeList arglist)
1089 constraintTerm Term;
1090 constraintExprKind kind;
1091 constraintExpr expr1, expr2;
1092 constraintExprData data;
1093 llassert (expr != NULL);
1102 Term = constraintExprData_termGetTerm(data);
1103 Term = constraintTerm_doSRefFixBaseParam (Term, arglist);
1104 data = constraintExprData_termSetTerm(data, Term);
1107 expr1 = constraintExprData_unaryExprGetExpr (data);
1108 expr1 = constraintExpr_doSRefFixBaseParam (expr1, arglist);
1109 data = constraintExprData_unaryExprSetExpr (data, expr1);
1112 expr1 = constraintExprData_binaryExprGetExpr1 (data);
1113 expr2 = constraintExprData_binaryExprGetExpr2 (data);
1115 expr1 = constraintExpr_doSRefFixBaseParam (expr1, arglist);
1116 data = constraintExprData_binaryExprSetExpr1 (data, expr1);
1117 expr2 = constraintExpr_doSRefFixBaseParam (expr2, arglist);
1118 data = constraintExprData_binaryExprSetExpr2 (data, expr2);
1128 constraintExpr constraintExpr_doSRefFixConstraintParam (/*@returned@*/ constraintExpr expr, exprNodeList arglist) /*@modifies@*/
1130 constraintExprKind kind;
1131 constraintExpr expr1, expr2;
1132 constraintExprData data;
1133 llassert (expr != NULL);
1142 expr = doSRefFixConstraintParamTerm (expr, arglist);
1145 expr1 = constraintExprData_unaryExprGetExpr (data);
1146 expr1 = constraintExpr_doSRefFixConstraintParam (expr1, arglist);
1147 data = constraintExprData_unaryExprSetExpr (data, expr1);
1150 expr1 = constraintExprData_binaryExprGetExpr1 (data);
1151 expr2 = constraintExprData_binaryExprGetExpr2 (data);
1153 expr1 = constraintExpr_doSRefFixConstraintParam (expr1, arglist);
1154 data = constraintExprData_binaryExprSetExpr1 (data, expr1);
1155 expr2 = constraintExpr_doSRefFixConstraintParam (expr2, arglist);
1156 data = constraintExprData_binaryExprSetExpr2 (data, expr2);
1166 constraintExpr constraintExpr_doFixResult (/*@returned@*/ constraintExpr expr, exprNode fcnCall)
1168 constraintExprKind kind;
1169 constraintExpr expr1, expr2;
1170 constraintExprData data;
1171 llassert (expr != NULL);
1180 expr = doFixResultTerm (expr, fcnCall);
1183 expr1 = constraintExprData_unaryExprGetExpr (data);
1184 expr1 = constraintExpr_doFixResult (expr1, fcnCall);
1185 data = constraintExprData_unaryExprSetExpr (data, expr1);
1188 expr1 = constraintExprData_binaryExprGetExpr1 (data);
1189 expr2 = constraintExprData_binaryExprGetExpr2 (data);
1191 expr1 = constraintExpr_doFixResult (expr1, fcnCall);
1192 data = constraintExprData_binaryExprSetExpr1 (data, expr1);
1193 expr2 = constraintExpr_doFixResult (expr2, fcnCall);
1194 data = constraintExprData_binaryExprSetExpr2 (data, expr2);
1204 cstring constraintExpr_print (constraintExpr expr) /*@*/
1206 return constraintExpr_unparse(expr);
1209 bool constraintExpr_hasMaxSet (constraintExpr expr) /*@*/
1213 t = constraintExpr_unparse(expr);
1215 if (strstr (t, "MAXSET") != NULL )
1223 /*returns 1 0 -1 like strcmp
1228 int constraintExpr_compare (constraintExpr expr1, constraintExpr expr2)
1232 if (constraintExpr_similar (expr1, expr2) )
1236 value1 = constraintExpr_getValue(expr1);
1237 value2 = constraintExpr_getValue(expr2);
1239 if (value1 > value2)
1242 if (value1 == value2)
1249 int constraintExpr_getValue (constraintExpr expr)
1251 llassert (expr->kind == term);
1252 return (constraintTerm_getValue (constraintExprData_termGetTerm (expr->data) ) );
1255 bool constraintExpr_canGetValue (constraintExpr expr)
1260 return constraintTerm_canGetValue (constraintExprData_termGetTerm (expr->data) );
1269 bool constraintExpr_canCompare (constraintExpr expr1, constraintExpr expr2)
1272 llassert(expr1 && expr2);
1273 return ( constraintExpr_canGetValue(expr1) &&
1274 constraintExpr_canGetValue(expr2)
1279 fileloc constraintExpr_getFileloc (constraintExpr expr)
1283 constraintExprKind kind;
1290 t = constraintExprData_termGetTerm (expr->data);
1291 return (constraintTerm_getFileloc (t) );
1295 e = constraintExprData_unaryExprGetExpr (expr->data);
1296 return (constraintExpr_getFileloc (e) );
1300 e = constraintExprData_binaryExprGetExpr1 (expr->data);
1301 return (constraintExpr_getFileloc (e) );
1306 // llfatalbug("Code should be reached");
1307 return (fileloc_undefined);
1310 /*drl moved from constriantTerm.c 5/20/001*/
1311 static constraintExpr
1312 doFixResultTerm (constraintExpr e, exprNode fcnCall)
1316 /*maybe this should move to cosntraintExpr.c -drl7x 5/18/01*/
1317 /*@i22*/ constraintExprData data = e->data;
1319 /*@i22*/constraintExprKind kind = e->kind;
1323 llassert(kind == term);
1325 t = constraintExprData_termGetTerm (data);
1326 llassert (t != NULL);
1329 switch (constraintTerm_getKind(t) )
1337 s = constraintTerm_getSRef(t);
1338 if (sRef_isResult (s))
1340 ret = constraintExpr_makeExprNode(fcnCall);
1351 /*drl moved from constriantTerm.c 5/20/001*/
1352 static constraintExpr
1353 doSRefFixConstraintParamTerm (constraintExpr e, exprNodeList arglist)
1357 /*maybe this should move to cosntraintExpr.c -drl7x 5/18/01*/
1359 /*@i22*/ constraintExprData data = e->data;
1361 /*@i22*/ constraintExprKind kind = e->kind;
1365 llassert(kind == term);
1367 t = constraintExprData_termGetTerm (data);
1368 llassert (t != NULL);
1375 // s = message ("%s @ %s ", exprNode_unparse (term->value.expr),
1376 // fileloc_unparse (term->loc) );
1379 // s = message (" %d ", term->value.intlit);
1383 ret = sRef_fixConstraintParam (t->value.sref, arglist);
1385 // s = message ("%s ", sRef_unparse (term->value.sref) );
1396 /* bool constraintExpr_includesTerm (constraintExpr expr, constraintTerm term) */
1398 /* if (constraintTerm_hasTerm (expr->term, term) ) */
1401 /* if ( (expr->expr) != NULL) */
1403 /* return ( constraintExpr_includesTerm (expr->expr, term) ); */