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 /*@out@*/ static constraintExpr constraintExpr_makeBinaryOp (void);
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 /*@out@*/ static constraintExpr constraintExpr_makeBinaryOp (void)
486 ret = constraintExpr_alloc();
487 ret->kind = binaryexpr;
488 ret->data = dmalloc ( sizeof *(ret->data) );
489 ret->data = constraintExprData_binaryExprSetOp (ret->data, BINARYOP_UNDEFINED);
494 constraintExpr constraintExpr_makeBinaryOpConstraintExpr (constraintExpr expr1,constraintExpr expr2)
499 ret = constraintExpr_makeBinaryOp();
500 ret->data = constraintExprData_binaryExprSetExpr1 (ret->data, expr1);
501 ret->data = constraintExprData_binaryExprSetExpr2 (ret->data, expr2);
502 ret->data = constraintExprData_binaryExprSetOp (ret->data, BINARYOP_UNDEFINED);
509 constraintExpr constraintExpr_parseMakeBinaryOp (constraintExpr expr1, lltok op, constraintExpr expr2)
512 ret = constraintExpr_makeBinaryOpConstraintExpr (expr1, expr2);
514 ret->data = constraintExprData_binaryExprSetOp(ret->data, PLUS);
515 else if (op.tok == TMINUS)
516 ret->data = constraintExprData_binaryExprSetOp(ret->data, MINUS);
524 constraintExpr constraintExpr_makeBinaryOpExprNode (exprNode expr1, exprNode expr2)
527 constraintExpr sub1, sub2;
528 sub1 = constraintExpr_makeTermExprNode (expr1);
529 sub2 = constraintExpr_makeTermExprNode (expr2);
530 ret = constraintExpr_makeBinaryOpConstraintExpr(sub1, sub2);
534 constraintExpr constraintExpr_makeBinaryOpConstraintExprIntLiteral (constraintExpr expr, int literal)
537 constraintExpr constExpr;
539 constExpr = constraintExpr_makeIntLiteral (literal);
540 ret = constraintExpr_makeBinaryOpConstraintExpr (expr, constExpr);
541 ret->data = constraintExprData_binaryExprSetOp(ret->data, PLUS);
545 constraintExpr constraintExpr_makeDecConstraintExpr (constraintExpr expr)
550 inc = constraintExpr_makeIntLiteral (1);
551 ret = constraintExpr_makeBinaryOpConstraintExpr (expr, inc);
552 ret->data = constraintExprData_binaryExprSetOp(ret->data, MINUS);
556 constraintExpr constraintExpr_makeAddConstraintExpr (constraintExpr expr, constraintExpr add)
560 ret = constraintExpr_makeBinaryOpConstraintExpr (expr, add);
562 ret->data = constraintExprData_binaryExprSetOp(ret->data, PLUS);
567 constraintExpr constraintExpr_makeIncConstraintExpr (constraintExpr expr)
572 inc = constraintExpr_makeIntLiteral (1);
573 ret = constraintExpr_makeBinaryOpConstraintExpr (expr, inc);
574 ret->data = constraintExprData_binaryExprSetOp(ret->data, PLUS);
578 cstring constraintExprUnaryOpKind_print (constraintExprUnaryOpKind op)
583 return message("MAXSET");
585 return message("MINSET");
587 return message("MAXREAD");
589 return message("MINREAD");
592 return message ("<(Unary OP OTHER>");
597 cstring constraintExprBinaryOpKind_print (constraintExprBinaryOpKind op)
609 return message ("<binary OP Unknown>");
613 bool constraintExpr_similar (constraintExpr expr1, constraintExpr expr2)
615 constraintExprKind kind;
617 llassert (expr1 != NULL);
618 llassert (expr2 != NULL);
619 if (expr1->kind != expr2->kind)
627 return constraintTerm_similar (constraintExprData_termGetTerm(expr1->data),
628 constraintExprData_termGetTerm(expr2->data) );
629 /*@notreached@*/ break;
632 if (constraintExprData_unaryExprGetOp (expr1->data) != constraintExprData_unaryExprGetOp (expr2->data) )
635 return (constraintExpr_similar (
636 constraintExprData_unaryExprGetExpr (expr1->data),
637 constraintExprData_unaryExprGetExpr (expr2->data)
641 if (constraintExprData_binaryExprGetOp (expr1->data) != constraintExprData_binaryExprGetOp (expr2->data) )
644 if (! constraintExpr_similar (constraintExprData_binaryExprGetExpr1 (expr1->data),
645 constraintExprData_binaryExprGetExpr1 (expr2->data)) )
648 if (! constraintExpr_similar (constraintExprData_binaryExprGetExpr2 (expr1->data),
649 constraintExprData_binaryExprGetExpr2 (expr2->data)) )
664 bool constraintExpr_same (constraintExpr expr1, constraintExpr expr2)
666 constraintExprKind kind;
668 llassert (expr1 != NULL);
669 llassert (expr2 != NULL);
670 if (expr1->kind != expr2->kind)
678 return constraintTerm_similar (constraintExprData_termGetTerm(expr1->data),
679 constraintExprData_termGetTerm(expr2->data) );
680 /*@notreached@*/ break;
683 if (constraintExprData_unaryExprGetOp (expr1->data) != constraintExprData_unaryExprGetOp (expr2->data) )
686 return (constraintExpr_same (
687 constraintExprData_unaryExprGetExpr (expr1->data),
688 constraintExprData_unaryExprGetExpr (expr2->data)
693 if (constraintExprData_binaryExprGetOp (expr1->data) != constraintExprData_binaryExprGetOp (expr2->data) )
696 if (! constraintExpr_same (constraintExprData_binaryExprGetExpr1 (expr1->data),
697 constraintExprData_binaryExprGetExpr1 (expr2->data)) )
700 if (! constraintExpr_same (constraintExprData_binaryExprGetExpr2 (expr1->data),
701 constraintExprData_binaryExprGetExpr2 (expr2->data)) )
705 /*@notreached@*/ break;
716 bool constraintExpr_search (constraintExpr c, constraintExpr old)
719 constraintExprKind kind;
722 if ( constraintExpr_similar (c, old) )
725 DPRINTF((message ("Found %s",
726 constraintExpr_unparse(old)
738 temp = constraintExprData_unaryExprGetExpr (c->data);
739 ret = ret || constraintExpr_search (temp, old);
743 temp = constraintExprData_binaryExprGetExpr1 (c->data);
744 ret = ret || constraintExpr_search(temp, old);
746 temp = constraintExprData_binaryExprGetExpr2 (c->data);
747 ret = ret || constraintExpr_search(temp, old);
757 constraintExpr constraintExpr_searchandreplace (constraintExpr c, constraintExpr old, constraintExpr new )
759 constraintExprKind kind;
762 if ( constraintExpr_similar (c, old) )
765 DPRINTF((message ("Replacing %s with %s",
766 constraintExpr_unparse(old), constraintExpr_unparse(new)
768 return constraintExpr_copy (new);
778 temp = constraintExprData_unaryExprGetExpr (c->data);
779 temp = constraintExpr_searchandreplace (temp, old, new);
780 c->data = constraintExprData_unaryExprSetExpr (c->data, temp);
784 temp = constraintExprData_binaryExprGetExpr1 (c->data);
785 temp = constraintExpr_searchandreplace (temp, old, new);
786 c->data = constraintExprData_binaryExprSetExpr1 (c->data, temp);
788 temp = constraintExprData_binaryExprGetExpr2 (c->data);
789 temp = constraintExpr_searchandreplace (temp, old, new);
790 c->data = constraintExprData_binaryExprSetExpr2 (c->data, temp);
799 constraintExpr constraintExpr_simplifyChildren (constraintExpr c)
801 constraintExprKind kind;
811 temp = constraintExprData_unaryExprGetExpr (c->data);
812 temp = constraintExpr_simplify (temp);
813 c->data = constraintExprData_unaryExprSetExpr (c->data, temp);
816 DPRINTF((message("constraintExpr_simplfiyChildren: simplify binary expression: %s",constraintExpr_unparse(c) ) ) );
817 temp = constraintExprData_binaryExprGetExpr1 (c->data);
818 temp = constraintExpr_simplify (temp);
820 c->data = constraintExprData_binaryExprSetExpr1 (c->data, temp);
822 temp = constraintExprData_binaryExprGetExpr2 (c->data);
823 temp = constraintExpr_simplify (temp);
825 c->data = constraintExprData_binaryExprSetExpr2 (c->data, temp);
835 constraintExpr constraintExpr_setFileloc (constraintExpr c, fileloc loc)
845 t = constraintExprData_termGetTerm (c->data);
846 t = constraintTerm_setFileloc (t, loc);
847 c->data = constraintExprData_termSetTerm (c->data, t);
851 temp = constraintExprData_binaryExprGetExpr1 (c->data);
852 temp = constraintExpr_setFileloc (temp, loc);
853 c->data = constraintExprData_binaryExprSetExpr1 (c->data, temp);
855 temp = constraintExprData_binaryExprGetExpr2 (c->data);
856 temp = constraintExpr_setFileloc (temp, loc);
857 c->data = constraintExprData_binaryExprSetExpr2 (c->data, temp);
860 temp = constraintExprData_unaryExprGetExpr (c->data);
861 temp = constraintExpr_setFileloc (temp, loc);
862 c->data = constraintExprData_unaryExprSetExpr (c->data, temp);
868 constraintExpr constraintExpr_simplifybinaryExpr (constraintExpr c)
870 constraintExpr e1, e2;
872 e1 = constraintExprData_binaryExprGetExpr1 (c->data);
873 e2 = constraintExprData_binaryExprGetExpr2 (c->data);
875 if (constraintExpr_canGetValue (e1) && constraintExpr_canGetValue(e2) )
879 i = constraintExpr_getValue(e1) + constraintExpr_getValue (e2);
881 c = constraintExpr_makeIntLiteral (i);
888 constraintExpr constraintExpr_subtractExpr (constraintExpr expr, constraintExpr addent)
892 DPRINTF ( (message ("Doing subtraceTerm simplification") ) );
894 new = constraintExpr_makeBinaryOpConstraintExpr (expr, addent);
895 new->data = constraintExprData_binaryExprSetOp (new->data, MINUS);
899 constraintExpr constraintExpr_addExpr (constraintExpr expr, constraintExpr addent)
903 DPRINTF ( (message ("Doing addTerm simplification") ) );
905 new = constraintExpr_makeBinaryOpConstraintExpr (expr, addent);
906 new->data = constraintExprData_binaryExprSetOp (new->data, PLUS);
910 constraintExpr constraintExpr_solveBinaryExpr (constraintExpr lexpr, constraintExpr expr)
912 constraintExpr expr1, expr2;
913 constraintExprBinaryOpKind op;
915 if (lexpr->kind != binaryexpr)
918 expr2 = constraintExprData_binaryExprGetExpr2 (lexpr->data);
919 expr1 = constraintExprData_binaryExprGetExpr1 (lexpr->data);
920 op = constraintExprData_binaryExprGetOp (lexpr->data);
924 #warning make sure this works
926 lexpr->kind = expr1->kind;
927 lexpr->data = copyExprData (expr1->data, expr1->kind);
931 expr = constraintExpr_subtractExpr (expr, expr2);
933 expr = constraintExpr_addExpr (expr, expr2);
938 #warning this needs to be checked
939 expr = constraintExpr_solveBinaryExpr (expr1, expr);
941 expr = constraintExpr_solveBinaryExpr (expr2, expr);
946 constraintExpr constraintExpr_simplifyunaryExpr (constraintExpr c)
950 llassert (c->kind == unaryExpr);
952 DPRINTF ( (message ("Doing constraintExpr_simplifyunaryExpr:%s", constraintExpr_unparse (c) ) ) );
954 if ( (constraintExprData_unaryExprGetOp (c->data) != MAXSET) &&
955 (constraintExprData_unaryExprGetOp (c->data) != MAXREAD) )
959 // pattern mxr ( var + const) = mxr(var) - const
961 exp = constraintExprData_unaryExprGetExpr (c->data);
963 if (exp->kind == term)
965 constraintTerm cterm;
967 cterm = constraintExprData_termGetTerm (exp->data);
969 if (constraintTerm_isStringLiteral(cterm) )
972 val = constraintTerm_getStringLiteral (cterm);
973 if (constraintExprData_unaryExprGetOp (c->data) == MAXSET)
975 return constraintExpr_makeIntLiteral ((int)strlen (val) );
977 if (constraintExprData_unaryExprGetOp (c->data) == MAXREAD)
979 return constraintExpr_makeIntLiteral ((int)strlen (val) );
986 if (exp->kind != binaryexpr)
989 if (constraintExprData_binaryExprGetOp (exp->data) == PLUS )
992 // if (constraintExpr_canGetValue (constraintExprData_binaryExprGetExpr2 (exp->data) ) )
995 constraintExpr temp, temp2, new;
997 DPRINTF ( (message ("Doing fancy simplification") ) );
999 temp = constraintExprData_binaryExprGetExpr2 (exp->data);
1001 temp2 = constraintExprData_binaryExprGetExpr1 (exp->data);
1002 c->data = constraintExprData_unaryExprSetExpr (c->data, temp2);
1006 new = constraintExpr_subtractExpr (c, temp);
1008 DPRINTF ( (message ("Done fancy simplification:%s", constraintExpr_unparse (new) ) ) );
1014 DPRINTF ( (message ("Done simplification:%s", constraintExpr_unparse (c) ) ) );
1019 constraintExpr constraintExpr_simplify (constraintExpr c)
1021 constraintExprKind kind;
1025 DPRINTF ( (message ("Doing constraintExpr_simplify:%s", constraintExpr_unparse (c) ) ) );
1027 c = constraintExpr_simplifyChildren (c);
1028 c = constraintExpr_combineConstants (c);
1029 c = constraintExpr_simplifyChildren (c);
1036 t = constraintExprData_termGetTerm (c->data);
1037 t = constraintTerm_simplify (t);
1038 c->data = constraintExprData_termSetTerm (c->data, t);
1041 c = constraintExpr_simplifyunaryExpr (c);
1044 c = constraintExpr_simplifybinaryExpr (c);
1053 cstring constraintExpr_unparse (constraintExpr ex)
1056 constraintExprKind kind;
1058 llassert (ex != NULL);
1065 st = message ("(%s) ", constraintTerm_print (constraintExprData_termGetTerm(ex->data) ) );
1068 st = message ("%s (%s)",
1069 constraintExprUnaryOpKind_print (constraintExprData_unaryExprGetOp (ex->data)
1071 constraintExpr_unparse (constraintExprData_unaryExprGetExpr (ex->data) )
1075 st = message ("(%s) %s (%s)",
1076 constraintExpr_unparse (constraintExprData_binaryExprGetExpr1 (ex->data) ),
1077 constraintExprBinaryOpKind_print (constraintExprData_binaryExprGetOp (ex->data)
1079 constraintExpr_unparse (constraintExprData_binaryExprGetExpr2 (ex->data) )
1084 st = message ("error");
1088 DPRINTF((message ("constraintExpr_unparse: '%s'",st) ) );
1092 constraintExpr constraintExpr_doSRefFixBaseParam (/*@returned@*/ constraintExpr expr, exprNodeList arglist)
1094 constraintTerm Term;
1095 constraintExprKind kind;
1096 constraintExpr expr1, expr2;
1097 constraintExprData data;
1098 llassert (expr != NULL);
1107 Term = constraintExprData_termGetTerm(data);
1108 Term = constraintTerm_doSRefFixBaseParam (Term, arglist);
1109 data = constraintExprData_termSetTerm(data, Term);
1112 expr1 = constraintExprData_unaryExprGetExpr (data);
1113 expr1 = constraintExpr_doSRefFixBaseParam (expr1, arglist);
1114 data = constraintExprData_unaryExprSetExpr (data, expr1);
1117 expr1 = constraintExprData_binaryExprGetExpr1 (data);
1118 expr2 = constraintExprData_binaryExprGetExpr2 (data);
1120 expr1 = constraintExpr_doSRefFixBaseParam (expr1, arglist);
1121 data = constraintExprData_binaryExprSetExpr1 (data, expr1);
1122 expr2 = constraintExpr_doSRefFixBaseParam (expr2, arglist);
1123 data = constraintExprData_binaryExprSetExpr2 (data, expr2);
1133 constraintExpr constraintExpr_doSRefFixConstraintParam (/*@returned@*/ constraintExpr expr, exprNodeList arglist) /*@modifies@*/
1135 constraintExprKind kind;
1136 constraintExpr expr1, expr2;
1137 constraintExprData data;
1138 llassert (expr != NULL);
1147 expr = doSRefFixConstraintParamTerm (expr, arglist);
1150 expr1 = constraintExprData_unaryExprGetExpr (data);
1151 expr1 = constraintExpr_doSRefFixConstraintParam (expr1, arglist);
1152 data = constraintExprData_unaryExprSetExpr (data, expr1);
1155 expr1 = constraintExprData_binaryExprGetExpr1 (data);
1156 expr2 = constraintExprData_binaryExprGetExpr2 (data);
1158 expr1 = constraintExpr_doSRefFixConstraintParam (expr1, arglist);
1159 data = constraintExprData_binaryExprSetExpr1 (data, expr1);
1160 expr2 = constraintExpr_doSRefFixConstraintParam (expr2, arglist);
1161 data = constraintExprData_binaryExprSetExpr2 (data, expr2);
1171 constraintExpr constraintExpr_doFixResult (/*@returned@*/ constraintExpr expr, exprNode fcnCall)
1173 constraintExprKind kind;
1174 constraintExpr expr1, expr2;
1175 constraintExprData data;
1176 llassert (expr != NULL);
1185 expr = doFixResultTerm (expr, fcnCall);
1188 expr1 = constraintExprData_unaryExprGetExpr (data);
1189 expr1 = constraintExpr_doFixResult (expr1, fcnCall);
1190 data = constraintExprData_unaryExprSetExpr (data, expr1);
1193 expr1 = constraintExprData_binaryExprGetExpr1 (data);
1194 expr2 = constraintExprData_binaryExprGetExpr2 (data);
1196 expr1 = constraintExpr_doFixResult (expr1, fcnCall);
1197 data = constraintExprData_binaryExprSetExpr1 (data, expr1);
1198 expr2 = constraintExpr_doFixResult (expr2, fcnCall);
1199 data = constraintExprData_binaryExprSetExpr2 (data, expr2);
1209 cstring constraintExpr_print (constraintExpr expr) /*@*/
1211 return constraintExpr_unparse(expr);
1214 bool constraintExpr_hasMaxSet (constraintExpr expr) /*@*/
1218 t = constraintExpr_unparse(expr);
1220 if (strstr (t, "MAXSET") != NULL )
1228 /*returns 1 0 -1 like strcmp
1233 int constraintExpr_compare (constraintExpr expr1, constraintExpr expr2)
1237 if (constraintExpr_similar (expr1, expr2) )
1241 value1 = constraintExpr_getValue(expr1);
1242 value2 = constraintExpr_getValue(expr2);
1244 if (value1 > value2)
1247 if (value1 == value2)
1254 int constraintExpr_getValue (constraintExpr expr)
1256 llassert (expr->kind == term);
1257 return (constraintTerm_getValue (constraintExprData_termGetTerm (expr->data) ) );
1260 bool constraintExpr_canGetValue (constraintExpr expr)
1265 return constraintTerm_canGetValue (constraintExprData_termGetTerm (expr->data) );
1274 bool constraintExpr_canCompare (constraintExpr expr1, constraintExpr expr2)
1277 llassert(expr1 && expr2);
1278 return ( constraintExpr_canGetValue(expr1) &&
1279 constraintExpr_canGetValue(expr2)
1284 fileloc constraintExpr_getFileloc (constraintExpr expr)
1288 constraintExprKind kind;
1295 t = constraintExprData_termGetTerm (expr->data);
1296 return (constraintTerm_getFileloc (t) );
1300 e = constraintExprData_unaryExprGetExpr (expr->data);
1301 return (constraintExpr_getFileloc (e) );
1305 e = constraintExprData_binaryExprGetExpr1 (expr->data);
1306 return (constraintExpr_getFileloc (e) );
1311 // llfatalbug("Code should be reached");
1312 return (fileloc_undefined);
1315 /*drl moved from constriantTerm.c 5/20/001*/
1316 static constraintExpr
1317 doFixResultTerm (constraintExpr e, exprNode fcnCall)
1321 /*maybe this should move to cosntraintExpr.c -drl7x 5/18/01*/
1322 /*@i22*/ constraintExprData data = e->data;
1324 /*@i22*/constraintExprKind kind = e->kind;
1328 llassert(kind == term);
1330 t = constraintExprData_termGetTerm (data);
1331 llassert (t != NULL);
1334 switch (constraintTerm_getKind(t) )
1342 s = constraintTerm_getSRef(t);
1343 if (sRef_isResult (s))
1345 ret = constraintExpr_makeExprNode(fcnCall);
1356 /*drl moved from constriantTerm.c 5/20/001*/
1357 static constraintExpr
1358 doSRefFixConstraintParamTerm (constraintExpr e, exprNodeList arglist)
1362 /*maybe this should move to cosntraintExpr.c -drl7x 5/18/01*/
1364 /*@i22*/ constraintExprData data = e->data;
1366 /*@i22*/ constraintExprKind kind = e->kind;
1370 llassert(kind == term);
1372 t = constraintExprData_termGetTerm (data);
1373 llassert (t != NULL);
1376 /*@i1*/ switch (t->kind)
1380 // s = message ("%s @ %s ", exprNode_unparse (term->value.expr),
1381 // fileloc_unparse (term->loc) );
1384 // s = message (" %d ", term->value.intlit);
1388 /*@i1*/ ret = sRef_fixConstraintParam (t->value.sref, arglist);
1390 // s = message ("%s ", sRef_unparse (term->value.sref) );
1401 /* bool constraintExpr_includesTerm (constraintExpr expr, constraintTerm term) */
1403 /* if (constraintTerm_hasTerm (expr->term, term) ) */
1406 /* if ( (expr->expr) != NULL) */
1408 /* return ( constraintExpr_includesTerm (expr->expr, term) ); */