]> andersk Git - splint.git/blame - src/constraintExpr.c
Added check of user specified post conditions.
[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
4ab867d6 30doSRefFixConstraintParamTerm (/*@only@*/ constraintExpr e, /*@temp@*/ /*@observer@*/ exprNodeList arglist) /*@modifies e@*/;
c3e695ff 31
4ab867d6 32static /*@only@*/ constraintExpr
33doFixResultTerm (/*@only@*/ constraintExpr e, /*@exposed@*/ exprNode fcnCall)
34 /*@modifies e@*/;
c3e695ff 35
d46ce6a4 36
37/*@special@*/ static constraintExpr constraintExpr_makeBinaryOp (void) /*@allocates result->data @*/ /*@sets result->kind @*/;
c3e695ff 38
39//constraintExpr constraintExpr_makeMaxSetConstraintExpr (constraintExpr c);
3aaedf88 40
d46ce6a4 41void constraintExpr_free (/*@only@*/ constraintExpr expr)
42{
43 if (constraintExpr_isDefined(expr) )
44 {
45 switch (expr->kind)
46 {
47 case unaryExpr:
48 constraintExprData_freeUnaryExpr(expr->data);
49 break;
50 case binaryexpr:
51 constraintExprData_freeBinaryExpr(expr->data);
52 break;
53 case term:
54 constraintExprData_freeTerm(expr->data);
55 break;
56 default:
57 BADEXIT;
58 }
bb25bea6 59
60 expr->data = NULL;
d46ce6a4 61 free (expr);
62 }
63 else
64 {
65 llcontbug(message("attempted to free null pointer in constraintExpr_free"));
66 }
67}
68
3aaedf88 69bool constraintExpr_isLit (constraintExpr expr)
70{
dc92450f 71 llassert (expr != NULL);
3aaedf88 72
73 if (expr->kind == term)
74 {
75 constraintTerm term = constraintExprData_termGetTerm (expr->data);
76 if (constraintTerm_isIntLiteral (term) )
77 {
78 return TRUE;
79 }
80
81 }
82 return FALSE;
83}
84
85
d46ce6a4 86/*@only@*/ constraintExpr constraintExpr_propagateConstants (/*@only@*/ constraintExpr expr,
3aaedf88 87 /*@out@*/ bool * propagate,
88 /*@out@*/ int *literal)
89{
90 constraintExpr expr1;
91 constraintExpr expr2;
92 bool propagate1, propagate2;
93 int literal1, literal2;
d46ce6a4 94 constraintExprBinaryOpKind op;
3aaedf88 95
96 propagate1 = FALSE;
97 propagate2 = FALSE;
98
99 literal1 = 0;
100 literal2 = 0;
101
102 *propagate = FALSE;
103 *literal = 0;
104
dc92450f 105 llassert (expr != NULL);
3aaedf88 106
107 // we simplify unaryExpr else where
d46ce6a4 108 if (expr->kind != binaryexpr)
3aaedf88 109 return expr;
110
d46ce6a4 111 op = constraintExprData_binaryExprGetOp (expr->data);
3aaedf88 112
c3e695ff 113 DPRINTF( (message("constraintExpr_propagateConstants: binaryexpr: %s", constraintExpr_unparse(expr) ) ) );
3aaedf88 114
115 expr1 = constraintExprData_binaryExprGetExpr1(expr->data);
116 expr2 = constraintExprData_binaryExprGetExpr2(expr->data);
117
d46ce6a4 118 expr1 = constraintExpr_copy(expr1);
119 expr2 = constraintExpr_copy(expr2);
120
3aaedf88 121 expr1 = constraintExpr_propagateConstants (expr1, &propagate1, &literal1);
122 expr2 = constraintExpr_propagateConstants (expr2, &propagate2, &literal2);
123
3aaedf88 124 *propagate = propagate1 || propagate2;
125 *literal = literal1 + literal2;
126
127 if ( constraintExpr_isLit (expr1) && constraintExpr_isLit (expr2) )
128 {
129 int t1, t2;
130 t1 = constraintExpr_getValue (expr1);
131 t2 = constraintExpr_getValue (expr2);
132 *propagate = FALSE;
a8e557d3 133
d46ce6a4 134 constraintExpr_free (expr);
135 constraintExpr_free (expr1);
136 constraintExpr_free (expr2);
137
138 if (op == PLUS )
3aaedf88 139 return (constraintExpr_makeIntLiteral ( (t1+t2) ));
d46ce6a4 140 else if (op == MINUS)
3aaedf88 141 return (constraintExpr_makeIntLiteral ( (t1-t2) ));
142 else
d46ce6a4 143 BADEXIT;
3aaedf88 144 }
d46ce6a4 145
146
147
3aaedf88 148
149 if (constraintExpr_isLit (expr1) )
150 {
3aaedf88 151 *propagate = TRUE;
d46ce6a4 152
153 if (op == PLUS )
154 *literal += constraintExpr_getValue (expr1);
155 else
156 *literal -= constraintExpr_getValue (expr1);
157
158 constraintExpr_free(expr1);
159 constraintExpr_free(expr);
3aaedf88 160 return expr2;
161 }
162
3aaedf88 163 if (constraintExpr_isLit (expr2) )
164 {
165 *propagate = TRUE;
a8e557d3 166
d46ce6a4 167 if ( op == PLUS )
3aaedf88 168 *literal += constraintExpr_getValue (expr2);
169 else
170 *literal -= constraintExpr_getValue (expr2);
d46ce6a4 171
172 constraintExpr_free(expr2);
173 constraintExpr_free(expr);
3aaedf88 174 return expr1;
175 }
3aaedf88 176
c3e695ff 177 DPRINTF( (message("constraintExpr_propagateConstants returning: %s", constraintExpr_unparse(expr) ) ) );
3aaedf88 178
d46ce6a4 179 expr->data = constraintExprData_binaryExprSetExpr1 (expr->data, expr1);
180 expr->data = constraintExprData_binaryExprSetExpr2 (expr->data, expr2);
181
3aaedf88 182 return expr;
183}
184
d46ce6a4 185// constraintExpr constraintExpr_propagateConstantsBak (constraintExpr expr,
186// /*@out@*/ bool * propagate,
187// /*@out@*/ int *literal)
188// {
189// constraintExpr expr1;
190// constraintExpr expr2;
191// bool propagate1, propagate2;
192// int literal1, literal2;
193
194// propagate1 = FALSE;
195// propagate2 = FALSE;
196
197// literal1 = 0;
198// literal2 = 0;
199
200// *propagate = FALSE;
201// *literal = 0;
202
203// llassert (expr != NULL);
204
205// // we simplify unaryExpr else where
206// if (expr->kind == unaryExpr)
207// return expr;
208
209// if (expr->kind == term)
210// return expr;
211
212// if (constraintExpr_isLit (expr) )
213// return expr;
214
215// DPRINTF( (message("constraintExpr_propagateConstants: binaryexpr: %s", constraintExpr_unparse(expr) ) ) );
216
217// expr1 = constraintExprData_binaryExprGetExpr1(expr->data);
218// expr2 = constraintExprData_binaryExprGetExpr2(expr->data);
219
220// expr1 = constraintExpr_propagateConstants (expr1, &propagate1, &literal1);
221// expr2 = constraintExpr_propagateConstants (expr2, &propagate2, &literal2);
222
223// expr->data = constraintExprData_binaryExprSetExpr1 (expr->data, expr1);
224// expr->data = constraintExprData_binaryExprSetExpr2 (expr->data, expr2);
225
226// *propagate = propagate1 || propagate2;
227// *literal = literal1 + literal2;
228
229// if ( constraintExpr_isLit (expr1) && constraintExpr_isLit (expr2) )
230// {
231// int t1, t2;
232// t1 = constraintExpr_getValue (expr1);
233// t2 = constraintExpr_getValue (expr2);
234// *propagate = FALSE;
235
236// if (constraintExprData_binaryExprGetOp (expr->data) == PLUS )
237// return (constraintExpr_makeIntLiteral ( (t1+t2) ));
238// else if (constraintExprData_binaryExprGetOp (expr->data) == MINUS)
239// return (constraintExpr_makeIntLiteral ( (t1-t2) ));
240// else
241// llassert(FALSE);
242// }
243
244// if (constraintExpr_isLit (expr1) )
245// {
246// /*@i334*/
247// /*handle MINUS case right */
248// *propagate = TRUE;
249// *literal += constraintExpr_getValue (expr1);
250// /*@-compdef@*/
251// return expr2;
252// /*@=compdef@*/
253// }
254
255// /*@-compdef@*/
256// if (constraintExpr_isLit (expr2) )
257// {
258// *propagate = TRUE;
259
260// if (constraintExprData_binaryExprGetOp (expr->data) == PLUS )
261// *literal += constraintExpr_getValue (expr2);
262// else
263// *literal -= constraintExpr_getValue (expr2);
264// return expr1;
265// }
266
267
268
269
270// DPRINTF( (message("constraintExpr_propagateConstants returning: %s", constraintExpr_unparse(expr) ) ) );
271
272// return expr;
273// /*@=compdef@*/
274// }
275
bb25bea6 276/*@only@*/ static constraintExpr constraintExpr_combineConstants (/*@only@*/ constraintExpr expr ) /*@modifies expr@*/
3aaedf88 277{
278 bool propagate;
279 int literal;
280
c3e695ff 281 DPRINTF ( (message ("Before combine %s", constraintExpr_unparse(expr) ) ) );
3aaedf88 282 expr = constraintExpr_propagateConstants (expr, &propagate, &literal);
283
284
285 if (propagate)
286 {
287 constraintExpr ret;
288
289 if (literal != 0)
290 {
291 ret = constraintExpr_makeBinaryOpConstraintExprIntLiteral (expr, literal);
292 expr = ret;
293 }
294 }
c3e695ff 295 DPRINTF ( (message ("After combine %s", constraintExpr_unparse(expr) ) ) );
3aaedf88 296 return expr;
297}
c3e695ff 298
dc92450f 299/*@special@*/
c3e695ff 300static constraintExpr constraintExpr_alloc (void) /*@post:isnull result->data@*/
3aaedf88 301{
302 constraintExpr ret;
303 ret = dmalloc (sizeof (*ret) );
304 ret->kind = term;
305 ret->data = NULL;
306 return ret;
307}
308
4ab867d6 309/*@only@*/ static constraintExprData copyExprData (/*@observer@*/ constraintExprData data, constraintExprKind kind)
c3e695ff 310{
311 constraintExprData ret;
312 llassert(constraintExprData_isDefined(data));
313
314 switch (kind)
315 {
316 case binaryexpr:
317 ret = constraintExprData_copyBinaryExpr(data);
318 break;
319 case unaryExpr:
320 ret = constraintExprData_copyUnaryExpr(data);
321 break;
322 case term:
323 ret = constraintExprData_copyTerm(data);
324 break;
325 default:
326 BADEXIT;
327 }
328 return ret;
329}
3aaedf88 330
331constraintExpr constraintExpr_copy (constraintExpr expr)
332{
333 constraintExpr ret;
334 ret = constraintExpr_alloc();
335 ret->kind = expr->kind;
c3e695ff 336
337 ret->data = copyExprData (expr->data, expr->kind);
3aaedf88 338 return ret;
339}
340
341
4ab867d6 342/*@only@*/ static constraintExpr oldconstraintExpr_makeTermExprNode (/*@exposed@*/ exprNode e)
3aaedf88 343{
344 constraintExpr ret;
345 constraintTerm t;
346 ret = constraintExpr_alloc();
347 ret->kind = term;
348 ret->data = dmalloc (sizeof *(ret->data) );
349 t = constraintTerm_makeExprNode (e);
350 ret->data = constraintExprData_termSetTerm (ret->data, t);
351 return ret;
352}
353
4ab867d6 354constraintExpr constraintExpr_makeExprNode (/*@exposed@*/ exprNode e)
3aaedf88 355{
356 sRef s;
357 constraintExpr ret, ce1, ce2;
358 exprData data;
359 exprNode t, t1, t2;
360 lltok tok;
361
362
dc92450f 363 llassert (e != NULL);
3aaedf88 364
365 data = e->edata;
366
367 switch (e->kind)
368 {
369 case XPR_SIZEOF:
370 t = exprData_getSingle (data);
371 s = exprNode_getSref (t);
372 if (sRef_isFixedArray(s) )
373 {
374 int size;
375
dc92450f 376 size = (int) sRef_getArraySize(s);
3aaedf88 377 ret = constraintExpr_makeIntLiteral (size);
378 }
379 else
380 {
c3e695ff 381 DPRINTF ((message ("could not determine the size of %s", exprNode_unparse (e) ) ) );
3aaedf88 382 ret = oldconstraintExpr_makeTermExprNode (e);
383 }
384 break;
385
386 case XPR_OP:
c3e695ff 387 DPRINTF ((message ("Examining operation %s", exprNode_unparse (e) ) ) );
3aaedf88 388 t1 = exprData_getOpA (data);
389 t2 = exprData_getOpB (data);
390 tok = exprData_getOpTok (data);
391
392 if (lltok_isPlus_Op (tok) || lltok_isMinus_Op (tok) )
393 {
394 ce1 = constraintExpr_makeExprNode (t1);
395 ce2 = constraintExpr_makeExprNode (t2);
396 ret = constraintExpr_parseMakeBinaryOp (ce1, tok, ce2);
397 }
398 else
399 {
400 ret = oldconstraintExpr_makeTermExprNode (e);
401 }
402 break;
403 case XPR_PARENS:
404 t = exprData_getUopNode (data);
405 ret = constraintExpr_makeExprNode (t);
406 break;
407
408 case XPR_PREOP:
409 t = exprData_getUopNode (data);
410 tok = exprData_getUopTok (data);
411 if (lltok_isInc_Op (tok) )
412 {
413 constraintExpr temp;
414 temp = constraintExpr_makeExprNode(t);
415 ret = constraintExpr_makeIncConstraintExpr(temp);
416 }
417 else if (lltok_isDec_Op (tok) )
418 {
419 constraintExpr temp;
420 temp = constraintExpr_makeExprNode(t);
421 ret = constraintExpr_makeDecConstraintExpr(temp);
422 }
423 else
424 ret = oldconstraintExpr_makeTermExprNode (e);
425 break;
426
427 case XPR_POSTOP:
428 t = exprData_getUopNode (data);
429 ret = constraintExpr_makeExprNode (t);
430 break;
470b7798 431 case XPR_CAST:
432 t = exprData_getCastNode (data);
433 ret = constraintExpr_makeExprNode (t);
434 break;
435 case XPR_COMMA:
436 t = exprData_getPairA(data);
c3e695ff 437 ret = constraintExpr_makeExprNode(t);
438 /*@i3434*/ /*I'm not sure if this is right. I'm adding a break to quite LCLint*/
439 break;
3aaedf88 440 default:
441 ret = oldconstraintExpr_makeTermExprNode (e);
442
443 }
444 return ret;
445}
446
447
4ab867d6 448/*@only@*/ static constraintExpr constraintExpr_makeTermExprNode (/*@exposed@*/ exprNode e)
3aaedf88 449{
450 return oldconstraintExpr_makeTermExprNode(e); //constraintExpr_makeExprNode (e);
451}
452
453
4ab867d6 454constraintExpr constraintExpr_makeTermsRef ( sRef s)
3aaedf88 455{
456 constraintExpr ret;
457 constraintTerm t;
458 ret = constraintExpr_alloc();
459 ret->kind = term;
460 ret->data = dmalloc (sizeof *(ret->data) );
461 t = constraintTerm_makesRef (s);
462 ret->data = constraintExprData_termSetTerm (ret->data, t);
463 return ret;
464}
465
c3e695ff 466/*@special@*/ static constraintExpr constraintExpr_makeUnaryOp (void) /*@allocates result->data@*/ /*@defines result->kind@*/
3aaedf88 467{
468 constraintExpr ret;
469 ret = constraintExpr_alloc();
470 ret->kind = unaryExpr;
471 ret->data = dmalloc ( sizeof *(ret->data) );
472 return ret;
473}
474
bb25bea6 475/*@only@*/ static constraintExpr constraintExpr_makeUnaryOpConstraintExpr (/*@only@*/ constraintExpr cexpr)
3aaedf88 476{
477 constraintExpr ret;
478 ret = constraintExpr_makeUnaryOp();
a8e557d3 479
480 /*@-uniondef@*/
481 /*@-compdef@*/
482 ret->data = constraintExprData_unaryExprSetExpr (ret->data, cexpr);
483 ret->data = constraintExprData_unaryExprSetOp (ret->data, UNARYOP_UNDEFINED);
484
3aaedf88 485 return ret;
a8e557d3 486
487 /*@=compdef@*/
c3e695ff 488 /*@=uniondef@*/
3aaedf88 489}
490
bb25bea6 491/*@only@*/
492static constraintExpr constraintExpr_makeMaxSetConstraintExpr (/*@only@*/ constraintExpr c)
3aaedf88 493{
494 constraintExpr ret;
495 ret = constraintExpr_makeUnaryOpConstraintExpr (c);
496 ret->data = constraintExprData_unaryExprSetOp (ret->data, MAXSET);
497 return ret;
498}
499
bb25bea6 500/*@only@*/
4ab867d6 501static constraintExpr constraintExpr_makeUnaryOpExprNode (/*@exposed@*/ exprNode expr)
3aaedf88 502{
503 constraintExpr ret;
504 constraintExpr sub;
505 sub = constraintExpr_makeExprNode (expr);
506 ret = constraintExpr_makeUnaryOpConstraintExpr(sub);
d46ce6a4 507
3aaedf88 508 return ret;
509}
510
511
512
bb25bea6 513/*@only@*/
4ab867d6 514static constraintExpr constraintExpr_makeSRefUnaryOp (/*@exposed@*/ sRef s, constraintExprUnaryOpKind op)
3aaedf88 515{
516 constraintExpr ret;
517 constraintExpr t;
518
519 t = constraintExpr_makeTermsRef (s);
520 ret = constraintExpr_makeUnaryOpConstraintExpr (t);
521 ret->data = constraintExprData_unaryExprSetOp (ret->data, op);
d46ce6a4 522
3aaedf88 523 return ret;
524}
525
bb25bea6 526/*@only@*/
4ab867d6 527constraintExpr constraintExpr_makeSRefMaxRead(/*@exposed@*/ sRef s)
470b7798 528{
529 return (constraintExpr_makeSRefUnaryOp (s, MAXREAD) );
530}
531
bb25bea6 532/*@only@*/
4ab867d6 533constraintExpr constraintExpr_makeSRefMaxset (/*@exposed@*/ sRef s)
3aaedf88 534{
535 return (constraintExpr_makeSRefUnaryOp (s, MAXSET) );
536}
537
bb25bea6 538/*@only@*/
3aaedf88 539constraintExpr constraintExpr_parseMakeUnaryOp (lltok op, constraintExpr cexpr)
540{
541 constraintExpr ret;
542 ret = constraintExpr_makeUnaryOpConstraintExpr ( cexpr);
543
544 switch (op.tok)
545 {
546 case QMAXSET:
547 ret->data = constraintExprData_unaryExprSetOp (ret->data, MAXSET);
548 break;
549 case QMAXREAD:
550 ret->data = constraintExprData_unaryExprSetOp (ret->data, MAXREAD);
551 break;
552 default:
dc92450f 553 llfatalbug(message("Unhandled Operation in Constraint") );
3aaedf88 554 }
555 return ret;
556}
557
bb25bea6 558/*@only@*/
4ab867d6 559constraintExpr constraintExpr_makeMaxSetExpr (/*@exposed@*/ exprNode expr)
3aaedf88 560{
561 constraintExpr ret;
562 ret = constraintExpr_makeExprNode (expr);
563
564 ret = constraintExpr_makeMaxSetConstraintExpr (ret);
565
dc92450f 566 llassert (ret != NULL);
3aaedf88 567 return ret;
568}
569
bb25bea6 570/*@only@*/
3aaedf88 571constraintExpr constraintExpr_makeMaxReadExpr (exprNode expr)
572{
573 constraintExpr ret;
574 ret = constraintExpr_makeUnaryOpExprNode(expr);
575 ret->data = constraintExprData_unaryExprSetOp (ret->data, MAXREAD);
576 return ret;
577}
578
bb25bea6 579/*@only@*/
4ab867d6 580/*@unused@*/ constraintExpr constraintExpr_makeMinSetExpr (/*@exposed@*/ exprNode expr)
3aaedf88 581{
582 constraintExpr ret;
583 ret = constraintExpr_makeUnaryOpExprNode(expr);
584 ret->data = constraintExprData_unaryExprSetOp (ret->data, MINSET);
585 return ret;
586}
587
bb25bea6 588/*@only@*/
4ab867d6 589/*@unused@*/ constraintExpr constraintExpr_makeMinReadExpr (/*@exposed@*/ exprNode expr)
3aaedf88 590{
591 constraintExpr ret;
592 ret = constraintExpr_makeUnaryOpExprNode(expr);
593 ret->data = constraintExprData_unaryExprSetOp (ret->data, MINREAD);
594 return ret;
595}
596
597
bb25bea6 598/*@only@*/
4ab867d6 599constraintExpr constraintExpr_makeValueExpr (/*@exposed@*/ exprNode expr)
3aaedf88 600{
601 constraintExpr ret;
602 ret = constraintExpr_makeExprNode (expr);
603 return ret;
604}
605
bb25bea6 606/*@only@*/
3aaedf88 607constraintExpr constraintExpr_makeIntLiteral (int i)
608{
609 constraintExpr ret;
610 constraintTerm t;
611 ret = constraintExpr_alloc();
612 ret->kind = term;
613 ret->data = dmalloc (sizeof *(ret->data) );
614 t = constraintTerm_makeIntLiteral (i);
615 ret->data = constraintExprData_termSetTerm (ret->data, t);
616 return ret;
617}
618
c3e695ff 619/*
3aaedf88 620constraintExpr constraintExpr_makeValueInt (int i)
621{
622 return constraintExpr_makeIntLiteral (i);
623}
c3e695ff 624*/
3aaedf88 625
bb25bea6 626/*@only@*/
d46ce6a4 627 /*@special@*/ static constraintExpr constraintExpr_makeBinaryOp (void) /*@allocates result->data @*/ /*@sets result->kind @*/
3aaedf88 628{
629 constraintExpr ret;
630 ret = constraintExpr_alloc();
631 ret->kind = binaryexpr;
632 ret->data = dmalloc ( sizeof *(ret->data) );
84c9ffbf 633 ret->data = constraintExprData_binaryExprSetOp (ret->data, BINARYOP_UNDEFINED);
3aaedf88 634 return ret;
635}
636
637
bb25bea6 638static /*@only@*/ constraintExpr constraintExpr_makeBinaryOpConstraintExpr (/*@only@*/constraintExpr expr1, /*@only@*/ constraintExpr expr2)
3aaedf88 639
640{
641 constraintExpr ret;
d46ce6a4 642
3aaedf88 643 ret = constraintExpr_makeBinaryOp();
644 ret->data = constraintExprData_binaryExprSetExpr1 (ret->data, expr1);
645 ret->data = constraintExprData_binaryExprSetExpr2 (ret->data, expr2);
84c9ffbf 646 ret->data = constraintExprData_binaryExprSetOp (ret->data, BINARYOP_UNDEFINED);
3aaedf88 647 return ret;
648}
649
bb25bea6 650/*@only@*/
d46ce6a4 651constraintExpr constraintExpr_parseMakeBinaryOp (/*@only@*/ constraintExpr expr1, lltok op,/*@only@*/ constraintExpr expr2)
3aaedf88 652{
653 constraintExpr ret;
654 ret = constraintExpr_makeBinaryOpConstraintExpr (expr1, expr2);
655 if (op.tok == TPLUS)
656 ret->data = constraintExprData_binaryExprSetOp(ret->data, PLUS);
657 else if (op.tok == TMINUS)
658 ret->data = constraintExprData_binaryExprSetOp(ret->data, MINUS);
659 else
660 {
661 llassert(FALSE);
662 }
663 return ret;
664}
665
bb25bea6 666/*@only@*/
4ab867d6 667/*@unused@*/ constraintExpr constraintExpr_makeBinaryOpExprNode (/*@exposed@*/ exprNode expr1, /*@exposed@*/ exprNode expr2)
3aaedf88 668{
669 constraintExpr ret;
670 constraintExpr sub1, sub2;
671 sub1 = constraintExpr_makeTermExprNode (expr1);
672 sub2 = constraintExpr_makeTermExprNode (expr2);
673 ret = constraintExpr_makeBinaryOpConstraintExpr(sub1, sub2);
674 return ret;
675}
676
bb25bea6 677/*@only@*/
d46ce6a4 678constraintExpr constraintExpr_makeBinaryOpConstraintExprIntLiteral (/*@only@*/ constraintExpr expr, int literal)
3aaedf88 679{
680 constraintExpr ret;
681 constraintExpr constExpr;
682
683 constExpr = constraintExpr_makeIntLiteral (literal);
684 ret = constraintExpr_makeBinaryOpConstraintExpr (expr, constExpr);
685 ret->data = constraintExprData_binaryExprSetOp(ret->data, PLUS);
686 return ret;
687}
688
bb25bea6 689/*@only@*/
d46ce6a4 690constraintExpr constraintExpr_makeDecConstraintExpr (/*@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, MINUS);
698 return ret;
699}
700
bb25bea6 701/*@only@*/
702constraintExpr constraintExpr_makeAddConstraintExpr (/*@only@*/
703constraintExpr expr, /*@only@*/
704constraintExpr add)
3aaedf88 705{
706 constraintExpr ret;
707
708 ret = constraintExpr_makeBinaryOpConstraintExpr (expr, add);
709
710 ret->data = constraintExprData_binaryExprSetOp(ret->data, PLUS);
711
712 return ret;
713}
714
bb25bea6 715/*@only@*/
d46ce6a4 716constraintExpr constraintExpr_makeIncConstraintExpr (/*@only@*/ constraintExpr expr)
3aaedf88 717{
718 constraintExpr ret;
719 constraintExpr inc;
720
721 inc = constraintExpr_makeIntLiteral (1);
722 ret = constraintExpr_makeBinaryOpConstraintExpr (expr, inc);
723 ret->data = constraintExprData_binaryExprSetOp(ret->data, PLUS);
724 return ret;
725}
726
bb25bea6 727/*@only@*/
728static cstring constraintExprUnaryOpKind_print (constraintExprUnaryOpKind op)
3aaedf88 729{
730 switch (op)
731 {
732 case MAXSET:
733 return message("MAXSET");
734 case MINSET:
735 return message("MINSET");
736 case MAXREAD:
737 return message("MAXREAD");
738 case MINREAD:
739 return message("MINREAD");
740 default:
741 llassert(FALSE);
742 return message ("<(Unary OP OTHER>");
743 }
744}
745
746
bb25bea6 747/*@only@*/
748static cstring constraintExprBinaryOpKind_print (constraintExprBinaryOpKind op)
3aaedf88 749{
750
751 switch (op)
752 {
753 case PLUS:
754 return message("+");
755 case MINUS:
756 return message("-");
dc92450f 757
758 default:
759 llassert(FALSE);
760 return message ("<binary OP Unknown>");
3aaedf88 761 }
3aaedf88 762}
763
764bool constraintExpr_similar (constraintExpr expr1, constraintExpr expr2)
765{
766 constraintExprKind kind;
767
768 llassert (expr1 != NULL);
769 llassert (expr2 != NULL);
770 if (expr1->kind != expr2->kind)
771 return FALSE;
772
773 kind = expr1->kind;
774
775 switch (kind)
776 {
777 case term:
778 return constraintTerm_similar (constraintExprData_termGetTerm(expr1->data),
779 constraintExprData_termGetTerm(expr2->data) );
c3e695ff 780 /*@notreached@*/ break;
3aaedf88 781
782 case unaryExpr:
783 if (constraintExprData_unaryExprGetOp (expr1->data) != constraintExprData_unaryExprGetOp (expr2->data) )
784 return FALSE;
785
786 return (constraintExpr_similar (
787 constraintExprData_unaryExprGetExpr (expr1->data),
788 constraintExprData_unaryExprGetExpr (expr2->data)
789 ));
790
791 case binaryexpr:
792 if (constraintExprData_binaryExprGetOp (expr1->data) != constraintExprData_binaryExprGetOp (expr2->data) )
793 return FALSE;
794
795 if (! constraintExpr_similar (constraintExprData_binaryExprGetExpr1 (expr1->data),
796 constraintExprData_binaryExprGetExpr1 (expr2->data)) )
797 return FALSE;
798
799 if (! constraintExpr_similar (constraintExprData_binaryExprGetExpr2 (expr1->data),
800 constraintExprData_binaryExprGetExpr2 (expr2->data)) )
801 return FALSE;
802 else
803 return TRUE;
804 /*@notreached@*/
805 break;
806
807 default:
808 llassert(FALSE);
809 return FALSE;
810 }
811 /*@notreached@*/
812 return FALSE;
813}
814
815bool constraintExpr_same (constraintExpr expr1, constraintExpr expr2)
816{
817 constraintExprKind kind;
818
819 llassert (expr1 != NULL);
820 llassert (expr2 != NULL);
821 if (expr1->kind != expr2->kind)
822 return FALSE;
823
824 kind = expr1->kind;
825
826 switch (kind)
827 {
828 case term:
829 return constraintTerm_similar (constraintExprData_termGetTerm(expr1->data),
830 constraintExprData_termGetTerm(expr2->data) );
dc92450f 831 /*@notreached@*/ break;
3aaedf88 832
833 case unaryExpr:
834 if (constraintExprData_unaryExprGetOp (expr1->data) != constraintExprData_unaryExprGetOp (expr2->data) )
835 return FALSE;
836
837 return (constraintExpr_same (
838 constraintExprData_unaryExprGetExpr (expr1->data),
839 constraintExprData_unaryExprGetExpr (expr2->data)
840 ));
841
842
843 case binaryexpr:
844 if (constraintExprData_binaryExprGetOp (expr1->data) != constraintExprData_binaryExprGetOp (expr2->data) )
845 return FALSE;
846
847 if (! constraintExpr_same (constraintExprData_binaryExprGetExpr1 (expr1->data),
848 constraintExprData_binaryExprGetExpr1 (expr2->data)) )
849 return FALSE;
850
851 if (! constraintExpr_same (constraintExprData_binaryExprGetExpr2 (expr1->data),
852 constraintExprData_binaryExprGetExpr2 (expr2->data)) )
853 return FALSE;
854 else
855 return TRUE;
dc92450f 856 /*@notreached@*/ break;
3aaedf88 857
858 default:
859 llassert(FALSE);
860 return FALSE;
861 }
862
863 /*@notreached@*/
864 BADEXIT;
865}
866
bb25bea6 867bool constraintExpr_search (/*@observer@*/ constraintExpr c, /*@observer@*/ constraintExpr old)
3aaedf88 868{
869 bool ret = FALSE;
870 constraintExprKind kind;
871 constraintExpr temp;
872
873 if ( constraintExpr_similar (c, old) )
874 {
bb25bea6 875 DPRINTF((message ("Found %q",
3aaedf88 876 constraintExpr_unparse(old)
877 )));
878 return TRUE;
879 }
880
881 kind = c->kind;
882
883 switch (kind)
884 {
885 case term:
886 break;
887 case unaryExpr:
888 temp = constraintExprData_unaryExprGetExpr (c->data);
889 ret = ret || constraintExpr_search (temp, old);
890 break;
891 case binaryexpr:
892
893 temp = constraintExprData_binaryExprGetExpr1 (c->data);
894 ret = ret || constraintExpr_search(temp, old);
895
896 temp = constraintExprData_binaryExprGetExpr2 (c->data);
897 ret = ret || constraintExpr_search(temp, old);
898 break;
899 default:
900 llassert(FALSE);
901 }
902 return ret;
903
904}
905
906
bb25bea6 907/*@only@*/ constraintExpr constraintExpr_searchandreplace (/*@only@*/ /*@unique@*/ constraintExpr c, constraintExpr old, constraintExpr new )
3aaedf88 908{
909 constraintExprKind kind;
910 constraintExpr temp;
911
912 if ( constraintExpr_similar (c, old) )
913 {
bb25bea6 914
470b7798 915 DPRINTF((message ("Replacing %s with %s",
3aaedf88 916 constraintExpr_unparse(old), constraintExpr_unparse(new)
917 )));
bb25bea6 918 constraintExpr_free(c);
3aaedf88 919 return constraintExpr_copy (new);
920 }
921
922 kind = c->kind;
923
924 switch (kind)
925 {
926 case term:
927 break;
928 case unaryExpr:
929 temp = constraintExprData_unaryExprGetExpr (c->data);
d46ce6a4 930 temp = constraintExpr_copy(temp);
3aaedf88 931 temp = constraintExpr_searchandreplace (temp, old, new);
932 c->data = constraintExprData_unaryExprSetExpr (c->data, temp);
933 break;
934 case binaryexpr:
935
936 temp = constraintExprData_binaryExprGetExpr1 (c->data);
d46ce6a4 937 temp = constraintExpr_copy(temp);
3aaedf88 938 temp = constraintExpr_searchandreplace (temp, old, new);
939 c->data = constraintExprData_binaryExprSetExpr1 (c->data, temp);
940
941 temp = constraintExprData_binaryExprGetExpr2 (c->data);
d46ce6a4 942 temp = constraintExpr_copy(temp);
3aaedf88 943 temp = constraintExpr_searchandreplace (temp, old, new);
944 c->data = constraintExprData_binaryExprSetExpr2 (c->data, temp);
945 break;
946 default:
947 llassert(FALSE);
948 }
949 return c;
950
951}
952
bb25bea6 953static constraintExpr constraintExpr_simplifyChildren (/*@returned@*/ constraintExpr c)
3aaedf88 954{
955 constraintExprKind kind;
956 constraintExpr temp;
957
958 kind = c->kind;
959
960 switch (kind)
961 {
962 case term:
963 break;
964 case unaryExpr:
965 temp = constraintExprData_unaryExprGetExpr (c->data);
d46ce6a4 966 temp = constraintExpr_copy(temp);
3aaedf88 967 temp = constraintExpr_simplify (temp);
968 c->data = constraintExprData_unaryExprSetExpr (c->data, temp);
969 break;
970 case binaryexpr:
c3e695ff 971 DPRINTF((message("constraintExpr_simplfiyChildren: simplify binary expression: %s",constraintExpr_unparse(c) ) ) );
3aaedf88 972 temp = constraintExprData_binaryExprGetExpr1 (c->data);
d46ce6a4 973 temp = constraintExpr_copy(temp);
3aaedf88 974 temp = constraintExpr_simplify (temp);
975
976 c->data = constraintExprData_binaryExprSetExpr1 (c->data, temp);
977
978 temp = constraintExprData_binaryExprGetExpr2 (c->data);
d46ce6a4 979 temp = constraintExpr_copy(temp);
3aaedf88 980 temp = constraintExpr_simplify (temp);
981
982 c->data = constraintExprData_binaryExprSetExpr2 (c->data, temp);
983 break;
984 default:
985 llassert(FALSE);
986 }
987 return c;
988
989}
990
991
d46ce6a4 992constraintExpr constraintExpr_setFileloc (/*@returned@*/ constraintExpr c, fileloc loc) /*@modifies c->data @*/
3aaedf88 993{
994 constraintTerm t;
995 constraintExpr temp;
996
dc92450f 997 llassert(c != NULL);
3aaedf88 998
999 switch (c->kind)
1000 {
1001 case term:
1002 t = constraintExprData_termGetTerm (c->data);
d46ce6a4 1003 t = constraintTerm_copy(t);
3aaedf88 1004 t = constraintTerm_setFileloc (t, loc);
1005 c->data = constraintExprData_termSetTerm (c->data, t);
1006 break;
1007 case binaryexpr:
1008
1009 temp = constraintExprData_binaryExprGetExpr1 (c->data);
d46ce6a4 1010 temp = constraintExpr_copy(temp);
3aaedf88 1011 temp = constraintExpr_setFileloc (temp, loc);
1012 c->data = constraintExprData_binaryExprSetExpr1 (c->data, temp);
1013
1014 temp = constraintExprData_binaryExprGetExpr2 (c->data);
d46ce6a4 1015 temp = constraintExpr_copy(temp);
3aaedf88 1016 temp = constraintExpr_setFileloc (temp, loc);
1017 c->data = constraintExprData_binaryExprSetExpr2 (c->data, temp);
1018 break;
1019 case unaryExpr:
1020 temp = constraintExprData_unaryExprGetExpr (c->data);
d46ce6a4 1021 temp = constraintExpr_copy(temp);
3aaedf88 1022 temp = constraintExpr_setFileloc (temp, loc);
1023 c->data = constraintExprData_unaryExprSetExpr (c->data, temp);
1024 break;
1025 }
1026 return c;
1027}
1028
bb25bea6 1029static /*@only@*/ constraintExpr constraintExpr_simplifybinaryExpr (/*@only@*/constraintExpr c)
3aaedf88 1030{
1031 constraintExpr e1, e2;
1032
1033 e1 = constraintExprData_binaryExprGetExpr1 (c->data);
1034 e2 = constraintExprData_binaryExprGetExpr2 (c->data);
1035
1036 if (constraintExpr_canGetValue (e1) && constraintExpr_canGetValue(e2) )
1037 {
1038 int i;
1039
1040 i = constraintExpr_getValue(e1) + constraintExpr_getValue (e2);
d46ce6a4 1041 constraintExpr_free(c);
3aaedf88 1042 c = constraintExpr_makeIntLiteral (i);
1043
1044 }
1045 return c;
1046}
1047
1048
4ab867d6 1049static /*@only@*/ constraintExpr constraintExpr_subtractExpr (/*@only@*/ constraintExpr expr, /*@only@*/ constraintExpr addent)
3aaedf88 1050{
1051 constraintExpr new;
1052
c3e695ff 1053 DPRINTF ( (message ("Doing subtraceTerm simplification") ) );
3aaedf88 1054
1055 new = constraintExpr_makeBinaryOpConstraintExpr (expr, addent);
1056 new->data = constraintExprData_binaryExprSetOp (new->data, MINUS);
1057 return new;
1058}
1059
bb25bea6 1060/*@only@*/
1061static constraintExpr constraintExpr_addExpr (/*@only@*/
1062constraintExpr expr, /*@only@*/
1063constraintExpr addent)
3aaedf88 1064{
1065 constraintExpr new;
1066
c3e695ff 1067 DPRINTF ( (message ("Doing addTerm simplification") ) );
3aaedf88 1068
1069 new = constraintExpr_makeBinaryOpConstraintExpr (expr, addent);
1070 new->data = constraintExprData_binaryExprSetOp (new->data, PLUS);
1071 return new;
1072}
1073
bb25bea6 1074/*
1075 this thing takes the lexpr and expr of a constraint and modifies lexpr
1076 and returns a (possiblly new) value for expr
1077*/
1078/* 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 */
1079
1080/* the approach is a little Kludgy but seems to work. I should probably use something cleaner at some point ... */
1081
1082
1083/*@only@*/ constraintExpr constraintExpr_solveBinaryExpr (constraintExpr lexpr, /*@only@*/ constraintExpr expr)
3aaedf88 1084{
1085 constraintExpr expr1, expr2;
1086 constraintExprBinaryOpKind op;
1087
1088 if (lexpr->kind != binaryexpr)
1089 return expr;
1090
1091 expr2 = constraintExprData_binaryExprGetExpr2 (lexpr->data);
1092 expr1 = constraintExprData_binaryExprGetExpr1 (lexpr->data);
bb25bea6 1093
3aaedf88 1094 op = constraintExprData_binaryExprGetOp (lexpr->data);
1095
bb25bea6 1096 expr1 = constraintExpr_copy(expr1);
1097 expr2 = constraintExpr_copy(expr2);
1098
c3e695ff 1099#warning make sure this works
1100
1101 lexpr->kind = expr1->kind;
d46ce6a4 1102 free (lexpr->data);
1103
c3e695ff 1104 lexpr->data = copyExprData (expr1->data, expr1->kind);
bb25bea6 1105 free(expr1);
c3e695ff 1106
1107 if (op == PLUS)
1108 expr = constraintExpr_subtractExpr (expr, expr2);
bb25bea6 1109 else if (op == MINUS)
c3e695ff 1110 expr = constraintExpr_addExpr (expr, expr2);
bb25bea6 1111 else
1112 BADEXIT;
1113
c3e695ff 1114
1115 return expr;
bb25bea6 1116
c3e695ff 1117 /*
1118 #warning this needs to be checked
1119 expr = constraintExpr_solveBinaryExpr (expr1, expr);
1120
1121 expr = constraintExpr_solveBinaryExpr (expr2, expr);
1122 return expr;
1123 */
3aaedf88 1124}
1125
bb25bea6 1126static /*@only@*/ constraintExpr constraintExpr_simplifyunaryExpr (/*@only@*/ constraintExpr c)
3aaedf88 1127{
1128 constraintExpr exp;
1129
1130 llassert (c->kind == unaryExpr);
1131
c3e695ff 1132 DPRINTF ( (message ("Doing constraintExpr_simplifyunaryExpr:%s", constraintExpr_unparse (c) ) ) );
3aaedf88 1133
1134 if ( (constraintExprData_unaryExprGetOp (c->data) != MAXSET) &&
1135 (constraintExprData_unaryExprGetOp (c->data) != MAXREAD) )
1136 {
1137 return c;
1138 }
1139 // pattern mxr ( var + const) = mxr(var) - const
1140
1141 exp = constraintExprData_unaryExprGetExpr (c->data);
1142
1143 if (exp->kind == term)
1144 {
1145 constraintTerm cterm;
1146
1147 cterm = constraintExprData_termGetTerm (exp->data);
1148
1149 if (constraintTerm_isStringLiteral(cterm) )
1150 {
1151 cstring val;
1152 val = constraintTerm_getStringLiteral (cterm);
1153 if (constraintExprData_unaryExprGetOp (c->data) == MAXSET)
1154 {
d46ce6a4 1155 constraintExpr temp;
1156
1157 temp = constraintExpr_makeIntLiteral ((int)strlen (val) );
1158 cstring_free(val);
1159 constraintExpr_free(c);
1160 return temp;
3aaedf88 1161 }
1162 if (constraintExprData_unaryExprGetOp (c->data) == MAXREAD)
1163 {
d46ce6a4 1164 constraintExpr temp;
1165
1166 temp = constraintExpr_makeIntLiteral ((int)strlen (val) );
1167 cstring_free(val);
1168 constraintExpr_free(c);
1169 return temp;
3aaedf88 1170 }
1171 BADEXIT;
1172 }
1173 return c;
1174 }
1175
1176 if (exp->kind != binaryexpr)
1177 return c;
1178
1179 if (constraintExprData_binaryExprGetOp (exp->data) == PLUS )
1180 {
1181
1182 // if (constraintExpr_canGetValue (constraintExprData_binaryExprGetExpr2 (exp->data) ) )
1183 {
1184
4ab867d6 1185 constraintExpr temp, temp2;
3aaedf88 1186
1187 DPRINTF ( (message ("Doing fancy simplification") ) );
1188
1189 temp = constraintExprData_binaryExprGetExpr2 (exp->data);
1190
1191 temp2 = constraintExprData_binaryExprGetExpr1 (exp->data);
d46ce6a4 1192
1193 temp2 = constraintExpr_copy(temp2);
3aaedf88 1194 c->data = constraintExprData_unaryExprSetExpr (c->data, temp2);
1195
1196
bb25bea6 1197 temp = constraintExpr_copy (temp);
1198
4ab867d6 1199 c = constraintExpr_subtractExpr (c, temp);
3aaedf88 1200
4ab867d6 1201 DPRINTF ( (message ("Done fancy simplification:%s", constraintExpr_unparse (c) ) ) );
3aaedf88 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@*/
4ab867d6 1260cstring constraintExpr_unparse (/*@temp@*/ /*@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
4ab867d6 1389/*@only@*/ constraintExpr constraintExpr_doFixResult (/*@only@*/ constraintExpr expr, exprNode fcnCall)
3aaedf88 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*/
4ab867d6 1534static /*@only@*/ constraintExpr
1535doFixResultTerm (/*@only@*/ constraintExpr e, /*@exposed@*/ exprNode fcnCall)
c3e695ff 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);
4ab867d6 1564 constraintExpr_free(e);
1565 e = NULL;
1566 }
1567 else
1568 {
1569 e = NULL;
c3e695ff 1570 }
1571 break;
1572 default:
1573 BADEXIT;
1574 }
1575
1576 return ret;
1577
1578}
1579
1580/*drl moved from constriantTerm.c 5/20/001*/
d46ce6a4 1581/*@only@*/ static constraintExpr
4ab867d6 1582doSRefFixConstraintParamTerm (/*@only@*/ constraintExpr e, /*@observer@*/ /*@temp@*/ exprNodeList arglist)
c3e695ff 1583{
1584 constraintTerm t;
1585
d46ce6a4 1586 constraintExprData data = e->data;
c3e695ff 1587
d46ce6a4 1588 constraintExprKind kind = e->kind;
c3e695ff 1589
1590 constraintExpr ret;
1591
1592 llassert(kind == term);
1593
1594 t = constraintExprData_termGetTerm (data);
1595 llassert (t != NULL);
1596
1597 ret = e;
84c9ffbf 1598 /*@i1*/ switch (t->kind)
c3e695ff 1599 {
1600 case EXPRNODE:
bb25bea6 1601 DPRINTF((message ("%q @ %q ", constraintTerm_print(t),
1602 fileloc_unparse (constraintTerm_getFileloc(t) ) ) ));
c3e695ff 1603 break;
1604 case INTLITERAL:
bb25bea6 1605 DPRINTF((message (" %q ", constraintTerm_print (t)) ));
d46ce6a4 1606 break;
c3e695ff 1607
1608 case SREF:
bb25bea6 1609 DPRINTF (( message("Doing sRef_fixConstraintParam for %q ",
1610 constraintTerm_print (t) ) ));
d46ce6a4 1611 ret = sRef_fixConstraintParam (t->value.sref, arglist);
c3e695ff 1612
d46ce6a4 1613 constraintExpr_free(e);
1614
bb25bea6 1615 DPRINTF (( message("After Doing sRef_fixConstraintParam constraintExpr is %q ",
1616 constraintExpr_print (ret) ) ));
c3e695ff 1617 break;
1618 default:
1619 BADEXIT;
1620 }
1621 return ret;
1622
1623}
3aaedf88 1624
1625
1626/* bool constraintExpr_includesTerm (constraintExpr expr, constraintTerm term) */
1627/* { */
1628/* if (constraintTerm_hasTerm (expr->term, term) ) */
1629/* return TRUE; */
1630
1631/* if ( (expr->expr) != NULL) */
1632/* { */
1633/* return ( constraintExpr_includesTerm (expr->expr, term) ); */
1634/* } */
1635/* return FALSE; */
1636
1637/* } */
1638
bb25bea6 1639/*drl added 6/11/01 */
1640bool constraintExpr_isBinaryExpr (/*@observer@*/ constraintExpr c)
1641{
1642 if (c->kind == binaryexpr)
1643 return TRUE;
3aaedf88 1644
bb25bea6 1645 else
1646 return FALSE;
1647}
3aaedf88 1648
1649
This page took 0.310134 seconds and 5 git commands to generate.