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