Print this page
new smatch
*** 30,40 ****
--- 30,43 ----
#include "allocate.h"
#include "token.h"
#include "parse.h"
#include "symbol.h"
#include "expression.h"
+ #include "evaluate.h"
+ static void copy_statement(struct statement *src, struct statement *dst);
+
static struct expression * dup_expression(struct expression *expr)
{
struct expression *dup = alloc_expression(expr->pos, expr->type);
*dup = *expr;
return dup;
*** 176,193 ****
/* Conditional expression */
case EXPR_SELECT:
case EXPR_CONDITIONAL: {
struct expression *cond = copy_expression(expr->conditional);
! struct expression *true = copy_expression(expr->cond_true);
! struct expression *false = copy_expression(expr->cond_false);
! if (cond == expr->conditional && true == expr->cond_true && false == expr->cond_false)
break;
expr = dup_expression(expr);
expr->conditional = cond;
! expr->cond_true = true;
! expr->cond_false = false;
break;
}
/* Statement expression */
case EXPR_STATEMENT: {
--- 179,196 ----
/* Conditional expression */
case EXPR_SELECT:
case EXPR_CONDITIONAL: {
struct expression *cond = copy_expression(expr->conditional);
! struct expression *valt = copy_expression(expr->cond_true);
! struct expression *valf = copy_expression(expr->cond_false);
! if (cond == expr->conditional && valt == expr->cond_true && valf == expr->cond_false)
break;
expr = dup_expression(expr);
expr->conditional = cond;
! expr->cond_true = valt;
! expr->cond_false = valf;
break;
}
/* Statement expression */
case EXPR_STATEMENT: {
*** 269,278 ****
--- 272,287 ----
expr->index = idx;
}
}
break;
}
+ case EXPR_ASM_OPERAND: {
+ expr = dup_expression(expr);
+ expr->constraint = copy_expression(expr->constraint);
+ expr->expr = copy_expression(expr->expr);
+ break;
+ }
default:
warning(expr->pos, "trying to copy expression type %d", expr->type);
}
return expr;
}
*** 279,302 ****
static struct expression_list *copy_asm_constraints(struct expression_list *in)
{
struct expression_list *out = NULL;
struct expression *expr;
- int state = 0;
FOR_EACH_PTR(in, expr) {
- switch (state) {
- case 0: /* identifier */
- case 1: /* constraint */
- state++;
- add_expression(&out, expr);
- continue;
- case 2: /* expression */
- state = 0;
add_expression(&out, copy_expression(expr));
- continue;
- }
} END_FOR_EACH_PTR(expr);
return out;
}
static void set_replace(struct symbol *old, struct symbol *new)
--- 288,300 ----
*** 367,390 ****
stmt = new;
break;
}
case STMT_IF: {
struct expression *cond = stmt->if_conditional;
! struct statement *true = stmt->if_true;
! struct statement *false = stmt->if_false;
cond = copy_expression(cond);
! true = copy_one_statement(true);
! false = copy_one_statement(false);
if (stmt->if_conditional == cond &&
! stmt->if_true == true &&
! stmt->if_false == false)
break;
stmt = dup_statement(stmt);
stmt->if_conditional = cond;
! stmt->if_true = true;
! stmt->if_false = false;
break;
}
case STMT_RETURN: {
struct expression *retval = copy_expression(stmt->ret_value);
struct symbol *sym = copy_symbol(stmt->pos, stmt->ret_target);
--- 365,388 ----
stmt = new;
break;
}
case STMT_IF: {
struct expression *cond = stmt->if_conditional;
! struct statement *valt = stmt->if_true;
! struct statement *valf = stmt->if_false;
cond = copy_expression(cond);
! valt = copy_one_statement(valt);
! valf = copy_one_statement(valf);
if (stmt->if_conditional == cond &&
! stmt->if_true == valt &&
! stmt->if_false == valf)
break;
stmt = dup_statement(stmt);
stmt->if_conditional = cond;
! stmt->if_true = valt;
! stmt->if_false = valf;
break;
}
case STMT_RETURN: {
struct expression *retval = copy_expression(stmt->ret_value);
struct symbol *sym = copy_symbol(stmt->pos, stmt->ret_target);
*** 466,476 ****
* We do this for the tree-level inliner.
*
* This doesn't do the symbol replacement right: it's not
* re-entrant.
*/
! void copy_statement(struct statement *src, struct statement *dst)
{
struct statement *stmt;
FOR_EACH_PTR(src->stmts, stmt) {
add_statement(&dst->stmts, copy_one_statement(stmt));
--- 464,474 ----
* We do this for the tree-level inliner.
*
* This doesn't do the symbol replacement right: it's not
* re-entrant.
*/
! static void copy_statement(struct statement *src, struct statement *dst)
{
struct statement *stmt;
FOR_EACH_PTR(src->stmts, stmt) {
add_statement(&dst->stmts, copy_one_statement(stmt));