]> andersk Git - splint.git/blame - src/constraintExpr.c
Lots of changes. Code is mostly annotated. Still lots of breaken stuff though.
[splint.git] / src / constraintExpr.c
CommitLineData
3aaedf88 1/*
2** constraintExpr.c
3*/
4
5//#define DEBUGPRINT 1
6
7# include "lclintMacros.nf"
8# include "basic.h"
9# include "cgrammar.h"
10# include "cgrammar_tokens.h"
11
12# include "exprChecks.h"
13# include "aliasChecks.h"
14# include "exprNodeSList.h"
15
16
17# include "exprData.i"
18# include "exprDataQuite.i"
19
20
21/*@-czechfcns@*/
22
3aaedf88 23
24
c3e695ff 25/*@access exprNode @*/
3aaedf88 26
d46ce6a4 27/*@only@*/ static constraintExpr
28doSRefFixConstraintParamTerm (/*@only@*/ constraintExpr e, exprNodeList arglist) /*@modifies e@*/;
c3e695ff 29
30static constraintExpr
31doFixResultTerm (constraintExpr e, exprNode fcnCall) /*@modifies e@*/;
32
d46ce6a4 33
34/*@special@*/ static constraintExpr constraintExpr_makeBinaryOp (void) /*@allocates result->data @*/ /*@sets result->kind @*/;
c3e695ff 35
36//constraintExpr constraintExpr_makeMaxSetConstraintExpr (constraintExpr c);
3aaedf88 37
d46ce6a4 38void constraintExpr_free (/*@only@*/ constraintExpr expr)
39{
40 if (constraintExpr_isDefined(expr) )
41 {
42 switch (expr->kind)
43 {
44 case unaryExpr:
45 constraintExprData_freeUnaryExpr(expr->data);
46 break;
47 case binaryexpr:
48 constraintExprData_freeBinaryExpr(expr->data);
49 break;
50 case term:
51 constraintExprData_freeTerm(expr->data);
52 break;
53 default:
54 BADEXIT;
55 }
56 free (expr);
57 }
58 else
59 {
60 llcontbug(message("attempted to free null pointer in constraintExpr_free"));
61 }
62}
63
3aaedf88 64bool constraintExpr_isLit (constraintExpr expr)
65{
dc92450f 66 llassert (expr != NULL);
3aaedf88 67
68 if (expr->kind == term)
69 {
70 constraintTerm term = constraintExprData_termGetTerm (expr->data);
71 if (constraintTerm_isIntLiteral (term) )
72 {
73 return TRUE;
74 }
75
76 }
77 return FALSE;
78}
79
80
d46ce6a4 81/*@only@*/ constraintExpr constraintExpr_propagateConstants (/*@only@*/ constraintExpr expr,
3aaedf88 82 /*@out@*/ bool * propagate,
83 /*@out@*/ int *literal)
84{
85 constraintExpr expr1;
86 constraintExpr expr2;
87 bool propagate1, propagate2;
88 int literal1, literal2;
d46ce6a4 89 constraintExprBinaryOpKind op;
3aaedf88 90
91 propagate1 = FALSE;
92 propagate2 = FALSE;
93
94 literal1 = 0;
95 literal2 = 0;
96
97 *propagate = FALSE;
98 *literal = 0;
99
dc92450f 100 llassert (expr != NULL);
3aaedf88 101
102 // we simplify unaryExpr else where
d46ce6a4 103 if (expr->kind != binaryexpr)
3aaedf88 104 return expr;
105
d46ce6a4 106 op = constraintExprData_binaryExprGetOp (expr->data);
3aaedf88 107
c3e695ff 108 DPRINTF( (message("constraintExpr_propagateConstants: binaryexpr: %s", constraintExpr_unparse(expr) ) ) );
3aaedf88 109
110 expr1 = constraintExprData_binaryExprGetExpr1(expr->data);
111 expr2 = constraintExprData_binaryExprGetExpr2(expr->data);
112
d46ce6a4 113 expr1 = constraintExpr_copy(expr1);
114 expr2 = constraintExpr_copy(expr2);
115
3aaedf88 116 expr1 = constraintExpr_propagateConstants (expr1, &propagate1, &literal1);
117 expr2 = constraintExpr_propagateConstants (expr2, &propagate2, &literal2);
118
3aaedf88 119 *propagate = propagate1 || propagate2;
120 *literal = literal1 + literal2;
121
122 if ( constraintExpr_isLit (expr1) && constraintExpr_isLit (expr2) )
123 {
124 int t1, t2;
125 t1 = constraintExpr_getValue (expr1);
126 t2 = constraintExpr_getValue (expr2);
127 *propagate = FALSE;
a8e557d3 128
d46ce6a4 129 constraintExpr_free (expr);
130 constraintExpr_free (expr1);
131 constraintExpr_free (expr2);
132
133 if (op == PLUS )
3aaedf88 134 return (constraintExpr_makeIntLiteral ( (t1+t2) ));
d46ce6a4 135 else if (op == MINUS)
3aaedf88 136 return (constraintExpr_makeIntLiteral ( (t1-t2) ));
137 else
d46ce6a4 138 BADEXIT;
3aaedf88 139 }
d46ce6a4 140
141
142
3aaedf88 143
144 if (constraintExpr_isLit (expr1) )
145 {
3aaedf88 146 *propagate = TRUE;
d46ce6a4 147
148 if (op == PLUS )
149 *literal += constraintExpr_getValue (expr1);
150 else
151 *literal -= constraintExpr_getValue (expr1);
152
153 constraintExpr_free(expr1);
154 constraintExpr_free(expr);
3aaedf88 155 return expr2;
156 }
157
3aaedf88 158 if (constraintExpr_isLit (expr2) )
159 {
160 *propagate = TRUE;
a8e557d3 161
d46ce6a4 162 if ( op == PLUS )
3aaedf88 163 *literal += constraintExpr_getValue (expr2);
164 else
165 *literal -= constraintExpr_getValue (expr2);
d46ce6a4 166
167 constraintExpr_free(expr2);
168 constraintExpr_free(expr);
3aaedf88 169 return expr1;
170 }
3aaedf88 171
c3e695ff 172 DPRINTF( (message("constraintExpr_propagateConstants returning: %s", constraintExpr_unparse(expr) ) ) );
3aaedf88 173
d46ce6a4 174 expr->data = constraintExprData_binaryExprSetExpr1 (expr->data, expr1);
175 expr->data = constraintExprData_binaryExprSetExpr2 (expr->data, expr2);
176
3aaedf88 177 return expr;
178}
179
d46ce6a4 180// constraintExpr constraintExpr_propagateConstantsBak (constraintExpr expr,
181// /*@out@*/ bool * propagate,
182// /*@out@*/ int *literal)
183// {
184// constraintExpr expr1;
185// constraintExpr expr2;
186// bool propagate1, propagate2;
187// int literal1, literal2;
188
189// propagate1 = FALSE;
190// propagate2 = FALSE;
191
192// literal1 = 0;
193// literal2 = 0;
194
195// *propagate = FALSE;
196// *literal = 0;
197
198// llassert (expr != NULL);
199
200// // we simplify unaryExpr else where
201// if (expr->kind == unaryExpr)
202// return expr;
203
204// if (expr->kind == term)
205// return expr;
206
207// if (constraintExpr_isLit (expr) )
208// return expr;
209
210// DPRINTF( (message("constraintExpr_propagateConstants: binaryexpr: %s", constraintExpr_unparse(expr) ) ) );
211
212// expr1 = constraintExprData_binaryExprGetExpr1(expr->data);
213// expr2 = constraintExprData_binaryExprGetExpr2(expr->data);
214
215// expr1 = constraintExpr_propagateConstants (expr1, &propagate1, &literal1);
216// expr2 = constraintExpr_propagateConstants (expr2, &propagate2, &literal2);
217
218// expr->data = constraintExprData_binaryExprSetExpr1 (expr->data, expr1);
219// expr->data = constraintExprData_binaryExprSetExpr2 (expr->data, expr2);
220
221// *propagate = propagate1 || propagate2;
222// *literal = literal1 + literal2;
223
224// if ( constraintExpr_isLit (expr1) && constraintExpr_isLit (expr2) )
225// {
226// int t1, t2;
227// t1 = constraintExpr_getValue (expr1);
228// t2 = constraintExpr_getValue (expr2);
229// *propagate = FALSE;
230
231// if (constraintExprData_binaryExprGetOp (expr->data) == PLUS )
232// return (constraintExpr_makeIntLiteral ( (t1+t2) ));
233// else if (constraintExprData_binaryExprGetOp (expr->data) == MINUS)
234// return (constraintExpr_makeIntLiteral ( (t1-t2) ));
235// else
236// llassert(FALSE);
237// }
238
239// if (constraintExpr_isLit (expr1) )
240// {
241// /*@i334*/
242// /*handle MINUS case right */
243// *propagate = TRUE;
244// *literal += constraintExpr_getValue (expr1);
245// /*@-compdef@*/
246// return expr2;
247// /*@=compdef@*/
248// }
249
250// /*@-compdef@*/
251// if (constraintExpr_isLit (expr2) )
252// {
253// *propagate = TRUE;
254
255// if (constraintExprData_binaryExprGetOp (expr->data) == PLUS )
256// *literal += constraintExpr_getValue (expr2);
257// else
258// *literal -= constraintExpr_getValue (expr2);
259// return expr1;
260// }
261
262
263
264
265// DPRINTF( (message("constraintExpr_propagateConstants returning: %s", constraintExpr_unparse(expr) ) ) );
266
267// return expr;
268// /*@=compdef@*/
269// }
270
271static constraintExpr constraintExpr_combineConstants (/*@only@*/ constraintExpr expr ) /*@modifies@*/
3aaedf88 272{
273 bool propagate;
274 int literal;
275
c3e695ff 276 DPRINTF ( (message ("Before combine %s", constraintExpr_unparse(expr) ) ) );
3aaedf88 277 expr = constraintExpr_propagateConstants (expr, &propagate, &literal);
278
279
280 if (propagate)
281 {
282 constraintExpr ret;
283
284 if (literal != 0)
285 {
286 ret = constraintExpr_makeBinaryOpConstraintExprIntLiteral (expr, literal);
287 expr = ret;
288 }
289 }
c3e695ff 290 DPRINTF ( (message ("After combine %s", constraintExpr_unparse(expr) ) ) );
3aaedf88 291 return expr;
292}
c3e695ff 293
dc92450f 294/*@special@*/
c3e695ff 295static constraintExpr constraintExpr_alloc (void) /*@post:isnull result->data@*/
3aaedf88 296{
297 constraintExpr ret;
298 ret = dmalloc (sizeof (*ret) );
299 ret->kind = term;
300 ret->data = NULL;
301 return ret;
302}
303
c3e695ff 304static constraintExprData copyExprData (constraintExprData data, constraintExprKind kind)
305{
306 constraintExprData ret;
307 llassert(constraintExprData_isDefined(data));
308
309 switch (kind)
310 {
311 case binaryexpr:
312 ret = constraintExprData_copyBinaryExpr(data);
313 break;
314 case unaryExpr:
315 ret = constraintExprData_copyUnaryExpr(data);
316 break;
317 case term:
318 ret = constraintExprData_copyTerm(data);
319 break;
320 default:
321 BADEXIT;
322 }
323 return ret;
324}
3aaedf88 325
326constraintExpr constraintExpr_copy (constraintExpr expr)
327{
328 constraintExpr ret;
329 ret = constraintExpr_alloc();
330 ret->kind = expr->kind;
c3e695ff 331
332 ret->data = copyExprData (expr->data, expr->kind);
3aaedf88 333 return ret;
334}
335
336
337constraintExpr oldconstraintExpr_makeTermExprNode (exprNode e)
338{
339 constraintExpr ret;
340 constraintTerm t;
341 ret = constraintExpr_alloc();
342 ret->kind = term;
343 ret->data = dmalloc (sizeof *(ret->data) );
344 t = constraintTerm_makeExprNode (e);
345 ret->data = constraintExprData_termSetTerm (ret->data, t);
346 return ret;
347}
348
349constraintExpr constraintExpr_makeExprNode (exprNode e)
350{
351 sRef s;
352 constraintExpr ret, ce1, ce2;
353 exprData data;
354 exprNode t, t1, t2;
355 lltok tok;
356
357
dc92450f 358 llassert (e != NULL);
3aaedf88 359
360 data = e->edata;
361
362 switch (e->kind)
363 {
364 case XPR_SIZEOF:
365 t = exprData_getSingle (data);
366 s = exprNode_getSref (t);
367 if (sRef_isFixedArray(s) )
368 {
369 int size;
370
dc92450f 371 size = (int) sRef_getArraySize(s);
3aaedf88 372 ret = constraintExpr_makeIntLiteral (size);
373 }
374 else
375 {
c3e695ff 376 DPRINTF ((message ("could not determine the size of %s", exprNode_unparse (e) ) ) );
3aaedf88 377 ret = oldconstraintExpr_makeTermExprNode (e);
378 }
379 break;
380
381 case XPR_OP:
c3e695ff 382 DPRINTF ((message ("Examining operation %s", exprNode_unparse (e) ) ) );
3aaedf88 383 t1 = exprData_getOpA (data);
384 t2 = exprData_getOpB (data);
385 tok = exprData_getOpTok (data);
386
387 if (lltok_isPlus_Op (tok) || lltok_isMinus_Op (tok) )
388 {
389 ce1 = constraintExpr_makeExprNode (t1);
390 ce2 = constraintExpr_makeExprNode (t2);
391 ret = constraintExpr_parseMakeBinaryOp (ce1, tok, ce2);
392 }
393 else
394 {
395 ret = oldconstraintExpr_makeTermExprNode (e);
396 }
397 break;
398 case XPR_PARENS:
399 t = exprData_getUopNode (data);
400 ret = constraintExpr_makeExprNode (t);
401 break;
402
403 case XPR_PREOP:
404 t = exprData_getUopNode (data);
405 tok = exprData_getUopTok (data);
406 if (lltok_isInc_Op (tok) )
407 {
408 constraintExpr temp;
409 temp = constraintExpr_makeExprNode(t);
410 ret = constraintExpr_makeIncConstraintExpr(temp);
411 }
412 else if (lltok_isDec_Op (tok) )
413 {
414 constraintExpr temp;
415 temp = constraintExpr_makeExprNode(t);
416 ret = constraintExpr_makeDecConstraintExpr(temp);
417 }
418 else
419 ret = oldconstraintExpr_makeTermExprNode (e);
420 break;
421
422 case XPR_POSTOP:
423 t = exprData_getUopNode (data);
424 ret = constraintExpr_makeExprNode (t);
425 break;
470b7798 426 case XPR_CAST:
427 t = exprData_getCastNode (data);
428 ret = constraintExpr_makeExprNode (t);
429 break;
430 case XPR_COMMA:
431 t = exprData_getPairA(data);
c3e695ff 432 ret = constraintExpr_makeExprNode(t);
433 /*@i3434*/ /*I'm not sure if this is right. I'm adding a break to quite LCLint*/
434 break;
3aaedf88 435 default:
436 ret = oldconstraintExpr_makeTermExprNode (e);
437
438 }
439 return ret;
440}
441
442
443constraintExpr constraintExpr_makeTermExprNode (exprNode e)
444{
445 return oldconstraintExpr_makeTermExprNode(e); //constraintExpr_makeExprNode (e);
446}
447
448
d46ce6a4 449constraintExpr constraintExpr_makeTermsRef (/*@only@*/ sRef s)
3aaedf88 450{
451 constraintExpr ret;
452 constraintTerm t;
453 ret = constraintExpr_alloc();
454 ret->kind = term;
455 ret->data = dmalloc (sizeof *(ret->data) );
456 t = constraintTerm_makesRef (s);
457 ret->data = constraintExprData_termSetTerm (ret->data, t);
458 return ret;
459}
460
c3e695ff 461/*@special@*/ static constraintExpr constraintExpr_makeUnaryOp (void) /*@allocates result->data@*/ /*@defines result->kind@*/
3aaedf88 462{
463 constraintExpr ret;
464 ret = constraintExpr_alloc();
465 ret->kind = unaryExpr;
466 ret->data = dmalloc ( sizeof *(ret->data) );
467 return ret;
468}
469
d46ce6a4 470static constraintExpr constraintExpr_makeUnaryOpConstraintExpr (/*@only@*/ constraintExpr cexpr)
3aaedf88 471{
472 constraintExpr ret;
473 ret = constraintExpr_makeUnaryOp();
a8e557d3 474
475 /*@-uniondef@*/
476 /*@-compdef@*/
477 ret->data = constraintExprData_unaryExprSetExpr (ret->data, cexpr);
478 ret->data = constraintExprData_unaryExprSetOp (ret->data, UNARYOP_UNDEFINED);
479
3aaedf88 480 return ret;
a8e557d3 481
482 /*@=compdef@*/
c3e695ff 483 /*@=uniondef@*/
3aaedf88 484}
485
d46ce6a4 486constraintExpr constraintExpr_makeMaxSetConstraintExpr (/*@only@*/ constraintExpr c)
3aaedf88 487{
488 constraintExpr ret;
489 ret = constraintExpr_makeUnaryOpConstraintExpr (c);
490 ret->data = constraintExprData_unaryExprSetOp (ret->data, MAXSET);
491 return ret;
492}
493
494constraintExpr constraintExpr_makeUnaryOpExprNode (exprNode expr)
495{
496 constraintExpr ret;
497 constraintExpr sub;
498 sub = constraintExpr_makeExprNode (expr);
499 ret = constraintExpr_makeUnaryOpConstraintExpr(sub);
d46ce6a4 500
3aaedf88 501 return ret;
502}
503
504
505
d46ce6a4 506constraintExpr constraintExpr_makeSRefUnaryOp (/*@only@*/ sRef s, constraintExprUnaryOpKind op)
3aaedf88 507{
508 constraintExpr ret;
509 constraintExpr t;
510
511 t = constraintExpr_makeTermsRef (s);
512 ret = constraintExpr_makeUnaryOpConstraintExpr (t);
513 ret->data = constraintExprData_unaryExprSetOp (ret->data, op);
d46ce6a4 514
3aaedf88 515 return ret;
516}
517
d46ce6a4 518constraintExpr constraintExpr_makeSRefMaxRead(/*@only@*/ sRef s)
470b7798 519{
520 return (constraintExpr_makeSRefUnaryOp (s, MAXREAD) );
521}
522
d46ce6a4 523constraintExpr constraintExpr_makeSRefMaxset (/*@only@*/ sRef s)
3aaedf88 524{
525 return (constraintExpr_makeSRefUnaryOp (s, MAXSET) );
526}
527
528constraintExpr constraintExpr_parseMakeUnaryOp (lltok op, constraintExpr cexpr)
529{
530 constraintExpr ret;
531 ret = constraintExpr_makeUnaryOpConstraintExpr ( cexpr);
532
533 switch (op.tok)
534 {
535 case QMAXSET:
536 ret->data = constraintExprData_unaryExprSetOp (ret->data, MAXSET);
537 break;
538 case QMAXREAD:
539 ret->data = constraintExprData_unaryExprSetOp (ret->data, MAXREAD);
540 break;
541 default:
dc92450f 542 llfatalbug(message("Unhandled Operation in Constraint") );
3aaedf88 543 }
544 return ret;
545}
546
547constraintExpr constraintExpr_makeMaxSetExpr (exprNode expr)
548{
549 constraintExpr ret;
550 ret = constraintExpr_makeExprNode (expr);
551
552 ret = constraintExpr_makeMaxSetConstraintExpr (ret);
553
dc92450f 554 llassert (ret != NULL);
3aaedf88 555 return ret;
556}
557
558constraintExpr constraintExpr_makeMaxReadExpr (exprNode expr)
559{
560 constraintExpr ret;
561 ret = constraintExpr_makeUnaryOpExprNode(expr);
562 ret->data = constraintExprData_unaryExprSetOp (ret->data, MAXREAD);
563 return ret;
564}
565
566constraintExpr constraintExpr_makeMinSetExpr (exprNode expr)
567{
568 constraintExpr ret;
569 ret = constraintExpr_makeUnaryOpExprNode(expr);
570 ret->data = constraintExprData_unaryExprSetOp (ret->data, MINSET);
571 return ret;
572}
573
574constraintExpr constraintExpr_makeMinReadExpr (exprNode expr)
575{
576 constraintExpr ret;
577 ret = constraintExpr_makeUnaryOpExprNode(expr);
578 ret->data = constraintExprData_unaryExprSetOp (ret->data, MINREAD);
579 return ret;
580}
581
582
583constraintExpr constraintExpr_makeValueExpr (exprNode expr)
584{
585 constraintExpr ret;
586 ret = constraintExpr_makeExprNode (expr);
587 return ret;
588}
589
590constraintExpr constraintExpr_makeIntLiteral (int i)
591{
592 constraintExpr ret;
593 constraintTerm t;
594 ret = constraintExpr_alloc();
595 ret->kind = term;
596 ret->data = dmalloc (sizeof *(ret->data) );
597 t = constraintTerm_makeIntLiteral (i);
598 ret->data = constraintExprData_termSetTerm (ret->data, t);
599 return ret;
600}
601
c3e695ff 602/*
3aaedf88 603constraintExpr constraintExpr_makeValueInt (int i)
604{
605 return constraintExpr_makeIntLiteral (i);
606}
c3e695ff 607*/
3aaedf88 608
d46ce6a4 609 /*@special@*/ static constraintExpr constraintExpr_makeBinaryOp (void) /*@allocates result->data @*/ /*@sets result->kind @*/
3aaedf88 610{
611 constraintExpr ret;
612 ret = constraintExpr_alloc();
613 ret->kind = binaryexpr;
614 ret->data = dmalloc ( sizeof *(ret->data) );
84c9ffbf 615 ret->data = constraintExprData_binaryExprSetOp (ret->data, BINARYOP_UNDEFINED);
3aaedf88 616 return ret;
617}
618
619
d46ce6a4 620/*@only@*/ constraintExpr constraintExpr_makeBinaryOpConstraintExpr (/*@only@*/constraintExpr expr1, /*@only@*/ constraintExpr expr2)
3aaedf88 621
622{
623 constraintExpr ret;
d46ce6a4 624
3aaedf88 625 ret = constraintExpr_makeBinaryOp();
626 ret->data = constraintExprData_binaryExprSetExpr1 (ret->data, expr1);
627 ret->data = constraintExprData_binaryExprSetExpr2 (ret->data, expr2);
84c9ffbf 628 ret->data = constraintExprData_binaryExprSetOp (ret->data, BINARYOP_UNDEFINED);
3aaedf88 629 return ret;
630}
631
d46ce6a4 632constraintExpr constraintExpr_parseMakeBinaryOp (/*@only@*/ constraintExpr expr1, lltok op,/*@only@*/ constraintExpr expr2)
3aaedf88 633{
634 constraintExpr ret;
635 ret = constraintExpr_makeBinaryOpConstraintExpr (expr1, expr2);
636 if (op.tok == TPLUS)
637 ret->data = constraintExprData_binaryExprSetOp(ret->data, PLUS);
638 else if (op.tok == TMINUS)
639 ret->data = constraintExprData_binaryExprSetOp(ret->data, MINUS);
640 else
641 {
642 llassert(FALSE);
643 }
644 return ret;
645}
646
647constraintExpr constraintExpr_makeBinaryOpExprNode (exprNode expr1, exprNode expr2)
648{
649 constraintExpr ret;
650 constraintExpr sub1, sub2;
651 sub1 = constraintExpr_makeTermExprNode (expr1);
652 sub2 = constraintExpr_makeTermExprNode (expr2);
653 ret = constraintExpr_makeBinaryOpConstraintExpr(sub1, sub2);
654 return ret;
655}
656
d46ce6a4 657constraintExpr constraintExpr_makeBinaryOpConstraintExprIntLiteral (/*@only@*/ constraintExpr expr, int literal)
3aaedf88 658{
659 constraintExpr ret;
660 constraintExpr constExpr;
661
662 constExpr = constraintExpr_makeIntLiteral (literal);
663 ret = constraintExpr_makeBinaryOpConstraintExpr (expr, constExpr);
664 ret->data = constraintExprData_binaryExprSetOp(ret->data, PLUS);
665 return ret;
666}
667
d46ce6a4 668constraintExpr constraintExpr_makeDecConstraintExpr (/*@only@*/constraintExpr expr)
3aaedf88 669{
670 constraintExpr ret;
671 constraintExpr inc;
672
673 inc = constraintExpr_makeIntLiteral (1);
674 ret = constraintExpr_makeBinaryOpConstraintExpr (expr, inc);
675 ret->data = constraintExprData_binaryExprSetOp(ret->data, MINUS);
676 return ret;
677}
678
679constraintExpr constraintExpr_makeAddConstraintExpr (constraintExpr expr, constraintExpr add)
680{
681 constraintExpr ret;
682
683 ret = constraintExpr_makeBinaryOpConstraintExpr (expr, add);
684
685 ret->data = constraintExprData_binaryExprSetOp(ret->data, PLUS);
686
687 return ret;
688}
689
d46ce6a4 690constraintExpr constraintExpr_makeIncConstraintExpr (/*@only@*/ constraintExpr expr)
3aaedf88 691{
692 constraintExpr ret;
693 constraintExpr inc;
694
695 inc = constraintExpr_makeIntLiteral (1);
696 ret = constraintExpr_makeBinaryOpConstraintExpr (expr, inc);
697 ret->data = constraintExprData_binaryExprSetOp(ret->data, PLUS);
698 return ret;
699}
700
701cstring constraintExprUnaryOpKind_print (constraintExprUnaryOpKind op)
702{
703 switch (op)
704 {
705 case MAXSET:
706 return message("MAXSET");
707 case MINSET:
708 return message("MINSET");
709 case MAXREAD:
710 return message("MAXREAD");
711 case MINREAD:
712 return message("MINREAD");
713 default:
714 llassert(FALSE);
715 return message ("<(Unary OP OTHER>");
716 }
717}
718
719
720cstring constraintExprBinaryOpKind_print (constraintExprBinaryOpKind op)
721{
722
723 switch (op)
724 {
725 case PLUS:
726 return message("+");
727 case MINUS:
728 return message("-");
dc92450f 729
730 default:
731 llassert(FALSE);
732 return message ("<binary OP Unknown>");
3aaedf88 733 }
3aaedf88 734}
735
736bool constraintExpr_similar (constraintExpr expr1, constraintExpr expr2)
737{
738 constraintExprKind kind;
739
740 llassert (expr1 != NULL);
741 llassert (expr2 != NULL);
742 if (expr1->kind != expr2->kind)
743 return FALSE;
744
745 kind = expr1->kind;
746
747 switch (kind)
748 {
749 case term:
750 return constraintTerm_similar (constraintExprData_termGetTerm(expr1->data),
751 constraintExprData_termGetTerm(expr2->data) );
c3e695ff 752 /*@notreached@*/ break;
3aaedf88 753
754 case unaryExpr:
755 if (constraintExprData_unaryExprGetOp (expr1->data) != constraintExprData_unaryExprGetOp (expr2->data) )
756 return FALSE;
757
758 return (constraintExpr_similar (
759 constraintExprData_unaryExprGetExpr (expr1->data),
760 constraintExprData_unaryExprGetExpr (expr2->data)
761 ));
762
763 case binaryexpr:
764 if (constraintExprData_binaryExprGetOp (expr1->data) != constraintExprData_binaryExprGetOp (expr2->data) )
765 return FALSE;
766
767 if (! constraintExpr_similar (constraintExprData_binaryExprGetExpr1 (expr1->data),
768 constraintExprData_binaryExprGetExpr1 (expr2->data)) )
769 return FALSE;
770
771 if (! constraintExpr_similar (constraintExprData_binaryExprGetExpr2 (expr1->data),
772 constraintExprData_binaryExprGetExpr2 (expr2->data)) )
773 return FALSE;
774 else
775 return TRUE;
776 /*@notreached@*/
777 break;
778
779 default:
780 llassert(FALSE);
781 return FALSE;
782 }
783 /*@notreached@*/
784 return FALSE;
785}
786
787bool constraintExpr_same (constraintExpr expr1, constraintExpr expr2)
788{
789 constraintExprKind kind;
790
791 llassert (expr1 != NULL);
792 llassert (expr2 != NULL);
793 if (expr1->kind != expr2->kind)
794 return FALSE;
795
796 kind = expr1->kind;
797
798 switch (kind)
799 {
800 case term:
801 return constraintTerm_similar (constraintExprData_termGetTerm(expr1->data),
802 constraintExprData_termGetTerm(expr2->data) );
dc92450f 803 /*@notreached@*/ break;
3aaedf88 804
805 case unaryExpr:
806 if (constraintExprData_unaryExprGetOp (expr1->data) != constraintExprData_unaryExprGetOp (expr2->data) )
807 return FALSE;
808
809 return (constraintExpr_same (
810 constraintExprData_unaryExprGetExpr (expr1->data),
811 constraintExprData_unaryExprGetExpr (expr2->data)
812 ));
813
814
815 case binaryexpr:
816 if (constraintExprData_binaryExprGetOp (expr1->data) != constraintExprData_binaryExprGetOp (expr2->data) )
817 return FALSE;
818
819 if (! constraintExpr_same (constraintExprData_binaryExprGetExpr1 (expr1->data),
820 constraintExprData_binaryExprGetExpr1 (expr2->data)) )
821 return FALSE;
822
823 if (! constraintExpr_same (constraintExprData_binaryExprGetExpr2 (expr1->data),
824 constraintExprData_binaryExprGetExpr2 (expr2->data)) )
825 return FALSE;
826 else
827 return TRUE;
dc92450f 828 /*@notreached@*/ break;
3aaedf88 829
830 default:
831 llassert(FALSE);
832 return FALSE;
833 }
834
835 /*@notreached@*/
836 BADEXIT;
837}
838
839bool constraintExpr_search (constraintExpr c, constraintExpr old)
840{
841 bool ret = FALSE;
842 constraintExprKind kind;
843 constraintExpr temp;
844
845 if ( constraintExpr_similar (c, old) )
846 {
847 #warning mem leak
848 DPRINTF((message ("Found %s",
849 constraintExpr_unparse(old)
850 )));
851 return TRUE;
852 }
853
854 kind = c->kind;
855
856 switch (kind)
857 {
858 case term:
859 break;
860 case unaryExpr:
861 temp = constraintExprData_unaryExprGetExpr (c->data);
862 ret = ret || constraintExpr_search (temp, old);
863 break;
864 case binaryexpr:
865
866 temp = constraintExprData_binaryExprGetExpr1 (c->data);
867 ret = ret || constraintExpr_search(temp, old);
868
869 temp = constraintExprData_binaryExprGetExpr2 (c->data);
870 ret = ret || constraintExpr_search(temp, old);
871 break;
872 default:
873 llassert(FALSE);
874 }
875 return ret;
876
877}
878
879
d46ce6a4 880 constraintExpr constraintExpr_searchandreplace (/*@returned@*/ constraintExpr c, constraintExpr old, constraintExpr new )
3aaedf88 881{
882 constraintExprKind kind;
883 constraintExpr temp;
884
885 if ( constraintExpr_similar (c, old) )
886 {
887 #warning mem leak
470b7798 888 DPRINTF((message ("Replacing %s with %s",
3aaedf88 889 constraintExpr_unparse(old), constraintExpr_unparse(new)
890 )));
891 return constraintExpr_copy (new);
892 }
893
894 kind = c->kind;
895
896 switch (kind)
897 {
898 case term:
899 break;
900 case unaryExpr:
901 temp = constraintExprData_unaryExprGetExpr (c->data);
d46ce6a4 902 temp = constraintExpr_copy(temp);
3aaedf88 903 temp = constraintExpr_searchandreplace (temp, old, new);
904 c->data = constraintExprData_unaryExprSetExpr (c->data, temp);
905 break;
906 case binaryexpr:
907
908 temp = constraintExprData_binaryExprGetExpr1 (c->data);
d46ce6a4 909 temp = constraintExpr_copy(temp);
3aaedf88 910 temp = constraintExpr_searchandreplace (temp, old, new);
911 c->data = constraintExprData_binaryExprSetExpr1 (c->data, temp);
912
913 temp = constraintExprData_binaryExprGetExpr2 (c->data);
d46ce6a4 914 temp = constraintExpr_copy(temp);
3aaedf88 915 temp = constraintExpr_searchandreplace (temp, old, new);
916 c->data = constraintExprData_binaryExprSetExpr2 (c->data, temp);
917 break;
918 default:
919 llassert(FALSE);
920 }
921 return c;
922
923}
924
d46ce6a4 925constraintExpr constraintExpr_simplifyChildren (/*@returned@*/ constraintExpr c)
3aaedf88 926{
927 constraintExprKind kind;
928 constraintExpr temp;
929
930 kind = c->kind;
931
932 switch (kind)
933 {
934 case term:
935 break;
936 case unaryExpr:
937 temp = constraintExprData_unaryExprGetExpr (c->data);
d46ce6a4 938 temp = constraintExpr_copy(temp);
3aaedf88 939 temp = constraintExpr_simplify (temp);
940 c->data = constraintExprData_unaryExprSetExpr (c->data, temp);
941 break;
942 case binaryexpr:
c3e695ff 943 DPRINTF((message("constraintExpr_simplfiyChildren: simplify binary expression: %s",constraintExpr_unparse(c) ) ) );
3aaedf88 944 temp = constraintExprData_binaryExprGetExpr1 (c->data);
d46ce6a4 945 temp = constraintExpr_copy(temp);
3aaedf88 946 temp = constraintExpr_simplify (temp);
947
948 c->data = constraintExprData_binaryExprSetExpr1 (c->data, temp);
949
950 temp = constraintExprData_binaryExprGetExpr2 (c->data);
d46ce6a4 951 temp = constraintExpr_copy(temp);
3aaedf88 952 temp = constraintExpr_simplify (temp);
953
954 c->data = constraintExprData_binaryExprSetExpr2 (c->data, temp);
955 break;
956 default:
957 llassert(FALSE);
958 }
959 return c;
960
961}
962
963
d46ce6a4 964constraintExpr constraintExpr_setFileloc (/*@returned@*/ constraintExpr c, fileloc loc) /*@modifies c->data @*/
3aaedf88 965{
966 constraintTerm t;
967 constraintExpr temp;
968
dc92450f 969 llassert(c != NULL);
3aaedf88 970
971 switch (c->kind)
972 {
973 case term:
974 t = constraintExprData_termGetTerm (c->data);
d46ce6a4 975 t = constraintTerm_copy(t);
3aaedf88 976 t = constraintTerm_setFileloc (t, loc);
977 c->data = constraintExprData_termSetTerm (c->data, t);
978 break;
979 case binaryexpr:
980
981 temp = constraintExprData_binaryExprGetExpr1 (c->data);
d46ce6a4 982 temp = constraintExpr_copy(temp);
3aaedf88 983 temp = constraintExpr_setFileloc (temp, loc);
984 c->data = constraintExprData_binaryExprSetExpr1 (c->data, temp);
985
986 temp = constraintExprData_binaryExprGetExpr2 (c->data);
d46ce6a4 987 temp = constraintExpr_copy(temp);
3aaedf88 988 temp = constraintExpr_setFileloc (temp, loc);
989 c->data = constraintExprData_binaryExprSetExpr2 (c->data, temp);
990 break;
991 case unaryExpr:
992 temp = constraintExprData_unaryExprGetExpr (c->data);
d46ce6a4 993 temp = constraintExpr_copy(temp);
3aaedf88 994 temp = constraintExpr_setFileloc (temp, loc);
995 c->data = constraintExprData_unaryExprSetExpr (c->data, temp);
996 break;
997 }
998 return c;
999}
1000
d46ce6a4 1001/*@only@*/ constraintExpr constraintExpr_simplifybinaryExpr (/*@only@*/constraintExpr c)
3aaedf88 1002{
1003 constraintExpr e1, e2;
1004
1005 e1 = constraintExprData_binaryExprGetExpr1 (c->data);
1006 e2 = constraintExprData_binaryExprGetExpr2 (c->data);
1007
1008 if (constraintExpr_canGetValue (e1) && constraintExpr_canGetValue(e2) )
1009 {
1010 int i;
1011
1012 i = constraintExpr_getValue(e1) + constraintExpr_getValue (e2);
d46ce6a4 1013 constraintExpr_free(c);
3aaedf88 1014 c = constraintExpr_makeIntLiteral (i);
1015
1016 }
1017 return c;
1018}
1019
1020
1021constraintExpr constraintExpr_subtractExpr (constraintExpr expr, constraintExpr addent)
1022{
1023 constraintExpr new;
1024
c3e695ff 1025 DPRINTF ( (message ("Doing subtraceTerm simplification") ) );
3aaedf88 1026
1027 new = constraintExpr_makeBinaryOpConstraintExpr (expr, addent);
1028 new->data = constraintExprData_binaryExprSetOp (new->data, MINUS);
1029 return new;
1030}
1031
1032constraintExpr constraintExpr_addExpr (constraintExpr expr, constraintExpr addent)
1033{
1034 constraintExpr new;
1035
c3e695ff 1036 DPRINTF ( (message ("Doing addTerm simplification") ) );
3aaedf88 1037
1038 new = constraintExpr_makeBinaryOpConstraintExpr (expr, addent);
1039 new->data = constraintExprData_binaryExprSetOp (new->data, PLUS);
1040 return new;
1041}
1042
d46ce6a4 1043/*@only@*/ constraintExpr constraintExpr_solveBinaryExpr (constraintExpr lexpr, constraintExpr expr)
3aaedf88 1044{
1045 constraintExpr expr1, expr2;
1046 constraintExprBinaryOpKind op;
1047
1048 if (lexpr->kind != binaryexpr)
1049 return expr;
1050
1051 expr2 = constraintExprData_binaryExprGetExpr2 (lexpr->data);
1052 expr1 = constraintExprData_binaryExprGetExpr1 (lexpr->data);
1053 op = constraintExprData_binaryExprGetOp (lexpr->data);
1054
1055
c3e695ff 1056 {
1057#warning make sure this works
1058
1059 lexpr->kind = expr1->kind;
d46ce6a4 1060 free (lexpr->data);
1061
c3e695ff 1062 lexpr->data = copyExprData (expr1->data, expr1->kind);
1063
1064
1065 if (op == PLUS)
1066 expr = constraintExpr_subtractExpr (expr, expr2);
1067 else
1068 expr = constraintExpr_addExpr (expr, expr2);
1069
1070 return expr;
1071 }
1072 /*
1073 #warning this needs to be checked
1074 expr = constraintExpr_solveBinaryExpr (expr1, expr);
1075
1076 expr = constraintExpr_solveBinaryExpr (expr2, expr);
1077 return expr;
1078 */
3aaedf88 1079}
1080
d46ce6a4 1081/*@only@*/ constraintExpr constraintExpr_simplifyunaryExpr (/*@only@*/ constraintExpr c)
3aaedf88 1082{
1083 constraintExpr exp;
1084
1085 llassert (c->kind == unaryExpr);
1086
c3e695ff 1087 DPRINTF ( (message ("Doing constraintExpr_simplifyunaryExpr:%s", constraintExpr_unparse (c) ) ) );
3aaedf88 1088
1089 if ( (constraintExprData_unaryExprGetOp (c->data) != MAXSET) &&
1090 (constraintExprData_unaryExprGetOp (c->data) != MAXREAD) )
1091 {
1092 return c;
1093 }
1094 // pattern mxr ( var + const) = mxr(var) - const
1095
1096 exp = constraintExprData_unaryExprGetExpr (c->data);
1097
1098 if (exp->kind == term)
1099 {
1100 constraintTerm cterm;
1101
1102 cterm = constraintExprData_termGetTerm (exp->data);
1103
1104 if (constraintTerm_isStringLiteral(cterm) )
1105 {
1106 cstring val;
1107 val = constraintTerm_getStringLiteral (cterm);
1108 if (constraintExprData_unaryExprGetOp (c->data) == MAXSET)
1109 {
d46ce6a4 1110 constraintExpr temp;
1111
1112 temp = constraintExpr_makeIntLiteral ((int)strlen (val) );
1113 cstring_free(val);
1114 constraintExpr_free(c);
1115 return temp;
3aaedf88 1116 }
1117 if (constraintExprData_unaryExprGetOp (c->data) == MAXREAD)
1118 {
d46ce6a4 1119 constraintExpr temp;
1120
1121 temp = constraintExpr_makeIntLiteral ((int)strlen (val) );
1122 cstring_free(val);
1123 constraintExpr_free(c);
1124 return temp;
3aaedf88 1125 }
1126 BADEXIT;
1127 }
1128 return c;
1129 }
1130
1131 if (exp->kind != binaryexpr)
1132 return c;
1133
1134 if (constraintExprData_binaryExprGetOp (exp->data) == PLUS )
1135 {
1136
1137 // if (constraintExpr_canGetValue (constraintExprData_binaryExprGetExpr2 (exp->data) ) )
1138 {
1139
1140 constraintExpr temp, temp2, new;
1141
1142 DPRINTF ( (message ("Doing fancy simplification") ) );
1143
1144 temp = constraintExprData_binaryExprGetExpr2 (exp->data);
1145
1146 temp2 = constraintExprData_binaryExprGetExpr1 (exp->data);
d46ce6a4 1147
1148 temp2 = constraintExpr_copy(temp2);
3aaedf88 1149 c->data = constraintExprData_unaryExprSetExpr (c->data, temp2);
1150
1151
1152
1153 new = constraintExpr_subtractExpr (c, temp);
1154
1155 DPRINTF ( (message ("Done fancy simplification:%s", constraintExpr_unparse (new) ) ) );
d46ce6a4 1156 constraintExpr_free(c);
3aaedf88 1157 c = new;
1158 }
1159 }
1160
1161 DPRINTF ( (message ("Done simplification:%s", constraintExpr_unparse (c) ) ) );
1162 return c;
1163}
1164
1165
d46ce6a4 1166/*@only@*/ constraintExpr constraintExpr_simplify ( constraintExpr c)
3aaedf88 1167{
1168 constraintExprKind kind;
1169 constraintTerm t;
1170
1171
c3e695ff 1172 DPRINTF ( (message ("Doing constraintExpr_simplify:%s", constraintExpr_unparse (c) ) ) );
3aaedf88 1173
1174 c = constraintExpr_simplifyChildren (c);
1175 c = constraintExpr_combineConstants (c);
1176 c = constraintExpr_simplifyChildren (c);
1177
1178 kind = c->kind;
1179
1180 switch (kind)
1181 {
1182 case term:
1183 t = constraintExprData_termGetTerm (c->data);
d46ce6a4 1184 t = constraintTerm_copy(t);
3aaedf88 1185 t = constraintTerm_simplify (t);
1186 c->data = constraintExprData_termSetTerm (c->data, t);
1187 break;
1188 case unaryExpr:
1189 c = constraintExpr_simplifyunaryExpr (c);
1190 break;
1191 case binaryexpr:
1192 c = constraintExpr_simplifybinaryExpr (c);
1193 break;
1194 default:
1195 llassert(FALSE);
1196 }
1197 return c;
1198
1199}
1200
1201cstring constraintExpr_unparse (constraintExpr ex)
1202{
1203 cstring st;
1204 constraintExprKind kind;
1205
1206 llassert (ex != NULL);
1207
1208 kind = ex->kind;
1209
1210 switch (kind)
1211 {
1212 case term:
d46ce6a4 1213 st = message ("(%q) ", constraintTerm_print (constraintExprData_termGetTerm(ex->data) ) );
3aaedf88 1214 break;
1215 case unaryExpr:
d46ce6a4 1216 st = message ("%q (%q)",
3aaedf88 1217 constraintExprUnaryOpKind_print (constraintExprData_unaryExprGetOp (ex->data)
1218 ),
1219 constraintExpr_unparse (constraintExprData_unaryExprGetExpr (ex->data) )
1220 );
1221 break;
1222 case binaryexpr:
d46ce6a4 1223 st = message ("(%q) %q (%q)",
3aaedf88 1224 constraintExpr_unparse (constraintExprData_binaryExprGetExpr1 (ex->data) ),
1225 constraintExprBinaryOpKind_print (constraintExprData_binaryExprGetOp (ex->data)
1226 ),
1227 constraintExpr_unparse (constraintExprData_binaryExprGetExpr2 (ex->data) )
1228 );
1229 break;
1230 default:
1231 llassert(FALSE);
1232 st = message ("error");
1233
1234 }
1235
1236 DPRINTF((message ("constraintExpr_unparse: '%s'",st) ) );
1237 return st;
1238}
1239
1240constraintExpr constraintExpr_doSRefFixBaseParam (/*@returned@*/ constraintExpr expr, exprNodeList arglist)
1241{
1242 constraintTerm Term;
1243 constraintExprKind kind;
1244 constraintExpr expr1, expr2;
1245 constraintExprData data;
1246 llassert (expr != NULL);
1247
1248 data = expr->data;
1249
1250 kind = expr->kind;
1251
1252 switch (kind)
1253 {
1254 case term:
1255 Term = constraintExprData_termGetTerm(data);
d46ce6a4 1256 Term = constraintTerm_copy(Term);
1257
3aaedf88 1258 Term = constraintTerm_doSRefFixBaseParam (Term, arglist);
1259 data = constraintExprData_termSetTerm(data, Term);
1260 break;
1261 case unaryExpr:
1262 expr1 = constraintExprData_unaryExprGetExpr (data);
d46ce6a4 1263 expr1 = constraintExpr_copy(expr1);
1264
3aaedf88 1265 expr1 = constraintExpr_doSRefFixBaseParam (expr1, arglist);
1266 data = constraintExprData_unaryExprSetExpr (data, expr1);
1267 break;
1268 case binaryexpr:
1269 expr1 = constraintExprData_binaryExprGetExpr1 (data);
1270 expr2 = constraintExprData_binaryExprGetExpr2 (data);
1271
d46ce6a4 1272 expr1 = constraintExpr_copy(expr1);
1273 expr2 = constraintExpr_copy(expr2);
1274
3aaedf88 1275 expr1 = constraintExpr_doSRefFixBaseParam (expr1, arglist);
1276 data = constraintExprData_binaryExprSetExpr1 (data, expr1);
1277 expr2 = constraintExpr_doSRefFixBaseParam (expr2, arglist);
1278 data = constraintExprData_binaryExprSetExpr2 (data, expr2);
1279
1280 break;
1281 default:
1282 llassert(FALSE);
1283 data = NULL;
1284 }
1285 return expr;
1286}
1287
d46ce6a4 1288/*@only@*/ constraintExpr constraintExpr_doSRefFixConstraintParam (/*@only@*/ constraintExpr expr, exprNodeList arglist) /*@modifies expr@*/
3aaedf88 1289{
1290 constraintExprKind kind;
1291 constraintExpr expr1, expr2;
1292 constraintExprData data;
1293 llassert (expr != NULL);
1294
1295 data = expr->data;
1296
1297 kind = expr->kind;
1298
1299 switch (kind)
1300 {
1301 case term:
c3e695ff 1302 expr = doSRefFixConstraintParamTerm (expr, arglist);
3aaedf88 1303 break;
1304 case unaryExpr:
1305 expr1 = constraintExprData_unaryExprGetExpr (data);
d46ce6a4 1306 expr1 = constraintExpr_copy(expr1);
3aaedf88 1307 expr1 = constraintExpr_doSRefFixConstraintParam (expr1, arglist);
1308 data = constraintExprData_unaryExprSetExpr (data, expr1);
1309 break;
1310 case binaryexpr:
1311 expr1 = constraintExprData_binaryExprGetExpr1 (data);
1312 expr2 = constraintExprData_binaryExprGetExpr2 (data);
1313
d46ce6a4 1314 expr1 = constraintExpr_copy(expr1);
1315 expr2 = constraintExpr_copy(expr2);
1316
3aaedf88 1317 expr1 = constraintExpr_doSRefFixConstraintParam (expr1, arglist);
1318 data = constraintExprData_binaryExprSetExpr1 (data, expr1);
1319 expr2 = constraintExpr_doSRefFixConstraintParam (expr2, arglist);
1320 data = constraintExprData_binaryExprSetExpr2 (data, expr2);
1321
1322 break;
1323 default:
1324 llassert(FALSE);
1325 data = NULL;
1326 }
1327 return expr;
1328}
1329
1330constraintExpr constraintExpr_doFixResult (/*@returned@*/ constraintExpr expr, exprNode fcnCall)
1331{
1332 constraintExprKind kind;
1333 constraintExpr expr1, expr2;
1334 constraintExprData data;
1335 llassert (expr != NULL);
1336
1337 data = expr->data;
1338
1339 kind = expr->kind;
1340
1341 switch (kind)
1342 {
1343 case term:
c3e695ff 1344 expr = doFixResultTerm (expr, fcnCall);
3aaedf88 1345 break;
1346 case unaryExpr:
1347 expr1 = constraintExprData_unaryExprGetExpr (data);
d46ce6a4 1348 expr1 = constraintExpr_copy(expr1);
1349
3aaedf88 1350 expr1 = constraintExpr_doFixResult (expr1, fcnCall);
1351 data = constraintExprData_unaryExprSetExpr (data, expr1);
1352 break;
1353 case binaryexpr:
1354 expr1 = constraintExprData_binaryExprGetExpr1 (data);
1355 expr2 = constraintExprData_binaryExprGetExpr2 (data);
1356
d46ce6a4 1357 expr1 = constraintExpr_copy(expr1);
1358 expr2 = constraintExpr_copy(expr2);
1359
3aaedf88 1360 expr1 = constraintExpr_doFixResult (expr1, fcnCall);
1361 data = constraintExprData_binaryExprSetExpr1 (data, expr1);
1362 expr2 = constraintExpr_doFixResult (expr2, fcnCall);
1363 data = constraintExprData_binaryExprSetExpr2 (data, expr2);
1364
1365 break;
1366 default:
1367 llassert(FALSE);
1368 data = NULL;
1369 }
1370 return expr;
1371}
1372
dc92450f 1373cstring constraintExpr_print (constraintExpr expr) /*@*/
3aaedf88 1374{
1375 return constraintExpr_unparse(expr);
1376}
1377
dc92450f 1378bool constraintExpr_hasMaxSet (constraintExpr expr) /*@*/
3aaedf88 1379{
1380 cstring t;
1381
1382 t = constraintExpr_unparse(expr);
1383
c3e695ff 1384 if (strstr (t, "MAXSET") != NULL )
d46ce6a4 1385 {
1386 cstring_free(t);
1387 return (TRUE);
1388 }
c3e695ff 1389 else
d46ce6a4 1390 {
1391 cstring_free(t);
1392 return FALSE;
1393 }
3aaedf88 1394}
1395
1396
1397
1398 /*returns 1 0 -1 like strcmp
1399 1 => expr1 > expr2
1400 0 => expr1 == expr2
1401 -1 => expr1 < expr2
1402 */
1403int constraintExpr_compare (constraintExpr expr1, constraintExpr expr2)
1404{
1405 int value1, value2;
1406
1407 if (constraintExpr_similar (expr1, expr2) )
1408 {
1409 return 0;
1410 }
1411 value1 = constraintExpr_getValue(expr1);
1412 value2 = constraintExpr_getValue(expr2);
1413
1414 if (value1 > value2)
1415 return 1;
1416
1417 if (value1 == value2)
1418 return 0;
1419
1420 else
1421 return -1;
1422}
1423
1424int constraintExpr_getValue (constraintExpr expr)
1425{
1426 llassert (expr->kind == term);
1427 return (constraintTerm_getValue (constraintExprData_termGetTerm (expr->data) ) );
1428}
1429
1430bool constraintExpr_canGetValue (constraintExpr expr)
1431{
1432 switch (expr->kind)
1433 {
1434 case term:
1435 return constraintTerm_canGetValue (constraintExprData_termGetTerm (expr->data) );
1436 default:
1437 return FALSE;
1438
1439 }
c3e695ff 1440
1441 BADEXIT;
3aaedf88 1442}
1443
1444bool constraintExpr_canCompare (constraintExpr expr1, constraintExpr expr2)
1445{
1446
1447 llassert(expr1 && expr2);
1448 return ( constraintExpr_canGetValue(expr1) &&
1449 constraintExpr_canGetValue(expr2)
1450 );
1451}
1452
1453
1454fileloc constraintExpr_getFileloc (constraintExpr expr)
1455{
1456 constraintExpr e;
1457constraintTerm t;
1458 constraintExprKind kind;
1459
1460 kind = expr->kind;
1461
1462 switch (kind)
1463 {
1464 case term:
1465 t = constraintExprData_termGetTerm (expr->data);
1466 return (constraintTerm_getFileloc (t) );
c3e695ff 1467 /*@notreached@*/
3aaedf88 1468 break;
1469 case unaryExpr:
1470 e = constraintExprData_unaryExprGetExpr (expr->data);
1471 return (constraintExpr_getFileloc (e) );
c3e695ff 1472 /*@notreached@*/
3aaedf88 1473 break;
1474 case binaryexpr:
1475 e = constraintExprData_binaryExprGetExpr1 (expr->data);
1476 return (constraintExpr_getFileloc (e) );
c3e695ff 1477 /*@notreached@*/
1478 break;
3aaedf88 1479 }
1480 llassert (FALSE);
3aaedf88 1481 return (fileloc_undefined);
1482}
1483
c3e695ff 1484/*drl moved from constriantTerm.c 5/20/001*/
1485static constraintExpr
1486doFixResultTerm (constraintExpr e, exprNode fcnCall)
1487{
1488 constraintTerm t;
1489 sRef s;
1490 /*maybe this should move to cosntraintExpr.c -drl7x 5/18/01*/
1491 /*@i22*/ constraintExprData data = e->data;
1492
1493 /*@i22*/constraintExprKind kind = e->kind;
1494
1495 constraintExpr ret;
1496
1497 llassert(kind == term);
1498
1499 t = constraintExprData_termGetTerm (data);
1500 llassert (t != NULL);
1501
1502 ret = e;
a8e557d3 1503 switch (constraintTerm_getKind(t) )
c3e695ff 1504 {
1505 case EXPRNODE:
1506 break;
1507 case INTLITERAL:
1508 break;
1509
1510 case SREF:
a8e557d3 1511 s = constraintTerm_getSRef(t);
c3e695ff 1512 if (sRef_isResult (s))
1513 {
1514 ret = constraintExpr_makeExprNode(fcnCall);
1515 }
1516 break;
1517 default:
1518 BADEXIT;
1519 }
1520
1521 return ret;
1522
1523}
1524
1525/*drl moved from constriantTerm.c 5/20/001*/
d46ce6a4 1526/*@only@*/ static constraintExpr
1527doSRefFixConstraintParamTerm (/*@only@*/ constraintExpr e, exprNodeList arglist)
c3e695ff 1528{
1529 constraintTerm t;
1530
d46ce6a4 1531 constraintExprData data = e->data;
c3e695ff 1532
d46ce6a4 1533 constraintExprKind kind = e->kind;
c3e695ff 1534
1535 constraintExpr ret;
1536
1537 llassert(kind == term);
1538
1539 t = constraintExprData_termGetTerm (data);
1540 llassert (t != NULL);
1541
1542 ret = e;
84c9ffbf 1543 /*@i1*/ switch (t->kind)
c3e695ff 1544 {
1545 case EXPRNODE:
d46ce6a4 1546 DPRINTF((message ("%s @ %q ", exprNode_unparse (term->value.expr),
1547 fileloc_unparse (term->loc) ) ));
c3e695ff 1548 break;
1549 case INTLITERAL:
d46ce6a4 1550 DPRINTF((message (" %d ", term->value.intlit)));
1551 break;
c3e695ff 1552
1553 case SREF:
d46ce6a4 1554 ret = sRef_fixConstraintParam (t->value.sref, arglist);
c3e695ff 1555
d46ce6a4 1556 constraintExpr_free(e);
1557
1558 DPRINTF((message ("%s ", sRef_unparse (term->value.sref) ) ));
c3e695ff 1559
1560 break;
1561 default:
1562 BADEXIT;
1563 }
1564 return ret;
1565
1566}
3aaedf88 1567
1568
1569/* bool constraintExpr_includesTerm (constraintExpr expr, constraintTerm term) */
1570/* { */
1571/* if (constraintTerm_hasTerm (expr->term, term) ) */
1572/* return TRUE; */
1573
1574/* if ( (expr->expr) != NULL) */
1575/* { */
1576/* return ( constraintExpr_includesTerm (expr->expr, term) ); */
1577/* } */
1578/* return FALSE; */
1579
1580/* } */
1581
1582
1583
1584
This page took 0.262043 seconds and 5 git commands to generate.