]>
Commit | Line | Data |
---|---|---|
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 | 27 | static /*@only@*/ constraintExpr constraintExpr_makeBinaryOpConstraintExprIntLiteral (/*@only@*/constraintExpr expr, int literal); |
28 | ||
d46ce6a4 | 29 | /*@only@*/ static constraintExpr |
4ab867d6 | 30 | doSRefFixConstraintParamTerm (/*@only@*/ constraintExpr e, /*@temp@*/ /*@observer@*/ exprNodeList arglist) /*@modifies e@*/; |
c3e695ff | 31 | |
4ab867d6 | 32 | static /*@only@*/ constraintExpr |
33 | doFixResultTerm (/*@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 | 41 | void 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 | 69 | bool 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 | 300 | static 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 | |
331 | constraintExpr 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 | 354 | constraintExpr 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 | 454 | constraintExpr 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@*/ |
492 | static 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 | 501 | static 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 | 514 | static 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 | 527 | constraintExpr constraintExpr_makeSRefMaxRead(/*@exposed@*/ sRef s) |
470b7798 | 528 | { |
529 | return (constraintExpr_makeSRefUnaryOp (s, MAXREAD) ); | |
530 | } | |
531 | ||
bb25bea6 | 532 | /*@only@*/ |
4ab867d6 | 533 | constraintExpr constraintExpr_makeSRefMaxset (/*@exposed@*/ sRef s) |
3aaedf88 | 534 | { |
535 | return (constraintExpr_makeSRefUnaryOp (s, MAXSET) ); | |
536 | } | |
537 | ||
bb25bea6 | 538 | /*@only@*/ |
3aaedf88 | 539 | constraintExpr 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 | 559 | constraintExpr 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 | 571 | constraintExpr 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 | 599 | constraintExpr constraintExpr_makeValueExpr (/*@exposed@*/ exprNode expr) |
3aaedf88 | 600 | { |
601 | constraintExpr ret; | |
602 | ret = constraintExpr_makeExprNode (expr); | |
603 | return ret; | |
604 | } | |
605 | ||
bb25bea6 | 606 | /*@only@*/ |
3aaedf88 | 607 | constraintExpr 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 | 620 | constraintExpr 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 | 638 | static /*@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 | 651 | constraintExpr 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 | 678 | constraintExpr 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 | 690 | constraintExpr 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@*/ |
702 | constraintExpr constraintExpr_makeAddConstraintExpr (/*@only@*/ | |
703 | constraintExpr expr, /*@only@*/ | |
704 | constraintExpr 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 | 716 | constraintExpr 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@*/ |
728 | static 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@*/ |
748 | static 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 | ||
764 | bool 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 | ||
815 | bool 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 | 867 | bool 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 | 953 | static 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 | 992 | constraintExpr 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 | 1029 | static /*@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 | 1049 | static /*@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@*/ |
1061 | static constraintExpr constraintExpr_addExpr (/*@only@*/ | |
1062 | constraintExpr expr, /*@only@*/ | |
1063 | constraintExpr 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 | 1126 | static /*@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 | 1260 | cstring 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 | ||
1299 | constraintExpr 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 | 1432 | cstring constraintExpr_print (constraintExpr expr) /*@*/ |
3aaedf88 | 1433 | { |
1434 | return constraintExpr_unparse(expr); | |
1435 | } | |
1436 | ||
dc92450f | 1437 | bool 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 | */ | |
1462 | int 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 | ||
1483 | int constraintExpr_getValue (constraintExpr expr) | |
1484 | { | |
1485 | llassert (expr->kind == term); | |
1486 | return (constraintTerm_getValue (constraintExprData_termGetTerm (expr->data) ) ); | |
1487 | } | |
1488 | ||
1489 | bool 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 | 1503 | fileloc constraintExpr_getFileloc (constraintExpr expr) |
1504 | { | |
1505 | constraintExpr e; | |
1506 | constraintTerm 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 | 1534 | static /*@only@*/ constraintExpr |
1535 | doFixResultTerm (/*@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 | 1582 | doSRefFixConstraintParamTerm (/*@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 */ |
1640 | bool 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 |