Lines Matching refs:expr

66 static void split_conditions(struct expression *expr);
68 static int is_logical_and(struct expression *expr) in is_logical_and() argument
70 if (expr->op == SPECIAL_LOGICAL_AND) in is_logical_and()
75 static int handle_zero_comparisons(struct expression *expr) in handle_zero_comparisons() argument
81 if (expr_is_zero(expr->left)) { in handle_zero_comparisons()
82 zero = strip_expr(expr->left); in handle_zero_comparisons()
84 __split_expr(expr->left); in handle_zero_comparisons()
85 tmp = expr->right; in handle_zero_comparisons()
86 } else if (expr_is_zero(expr->right)) { in handle_zero_comparisons()
87 zero = strip_expr(expr->left); in handle_zero_comparisons()
89 __split_expr(expr->right); in handle_zero_comparisons()
90 tmp = expr->left; in handle_zero_comparisons()
96 if (expr->op == SPECIAL_NOTEQUAL) { in handle_zero_comparisons()
102 if (expr->op == SPECIAL_EQUAL) { in handle_zero_comparisons()
115 static int ignore_builtin_expect(struct expression *expr) in ignore_builtin_expect() argument
117 if (sym_name_is("__builtin_expect", expr->fn)) { in ignore_builtin_expect()
118 split_conditions(first_ptr_list((struct ptr_list *) expr->args)); in ignore_builtin_expect()
130 struct expression *expr = NULL; in handle_compound_stmt() local
138 expr = last->label_statement->expression; in handle_compound_stmt()
144 expr = last->expression; in handle_compound_stmt()
153 split_conditions(expr); in handle_compound_stmt()
156 static int handle_preop(struct expression *expr) in handle_preop() argument
160 if (expr->op == '!') { in handle_preop()
161 split_conditions(expr->unop); in handle_preop()
165 stmt = get_expression_statement(expr); in handle_preop()
173 static void handle_logical(struct expression *expr) in handle_logical() argument
190 split_conditions(expr->left); in handle_logical()
192 if (is_logical_and(expr)) in handle_logical()
200 split_conditions(expr->right); in handle_logical()
203 if (is_logical_and(expr)) in handle_logical()
234 static void handle_select(struct expression *expr) in handle_select() argument
277 split_conditions(expr->conditional); in handle_select()
286 split_conditions(expr->cond_true); in handle_select()
296 split_conditions(expr->cond_false); in handle_select()
305 if (implied_condition_true(expr->cond_true)) { in handle_select()
311 if (implied_condition_false(expr->cond_true)) { in handle_select()
317 if (implied_condition_true(expr->cond_false)) { in handle_select()
323 if (implied_condition_false(expr->cond_false)) { in handle_select()
357 static void handle_comma(struct expression *expr) in handle_comma() argument
359 __split_expr(expr->left); in handle_comma()
360 split_conditions(expr->right); in handle_comma()
378 static void hackup_unsigned_compares(struct expression *expr) in hackup_unsigned_compares() argument
380 if (expr->type != EXPR_COMPARE) in hackup_unsigned_compares()
383 if (type_unsigned(get_type(expr))) in hackup_unsigned_compares()
384 expr->op = make_op_unsigned(expr->op); in hackup_unsigned_compares()
387 static void do_condition(struct expression *expr) in do_condition() argument
391 __pass_to_client(expr, CONDITION_HOOK); in do_condition()
395 static void split_conditions(struct expression *expr) in split_conditions() argument
398 char *cond = expr_to_str(expr); in split_conditions()
404 expr = strip_expr_set_parent(expr); in split_conditions()
405 if (!expr) { in split_conditions()
422 if (expr->type == EXPR_BINOP && expr->op == '|') { in split_conditions()
423 expr_set_parent_expr(expr->left, expr); in split_conditions()
424 expr_set_parent_expr(expr->right, expr); in split_conditions()
425 handle_logical(expr); in split_conditions()
429 switch (expr->type) { in split_conditions()
431 expr_set_parent_expr(expr->left, expr); in split_conditions()
432 expr_set_parent_expr(expr->right, expr); in split_conditions()
433 __pass_to_client(expr, LOGIC_HOOK); in split_conditions()
434 handle_logical(expr); in split_conditions()
437 expr_set_parent_expr(expr->left, expr); in split_conditions()
438 expr_set_parent_expr(expr->right, expr); in split_conditions()
439 hackup_unsigned_compares(expr); in split_conditions()
440 if (handle_zero_comparisons(expr)) in split_conditions()
444 if (ignore_builtin_expect(expr)) in split_conditions()
448 expr_set_parent_expr(expr->unop, expr); in split_conditions()
449 if (handle_preop(expr)) in split_conditions()
454 expr_set_parent_expr(expr->conditional, expr); in split_conditions()
455 expr_set_parent_expr(expr->cond_true, expr); in split_conditions()
456 expr_set_parent_expr(expr->cond_false, expr); in split_conditions()
457 handle_select(expr); in split_conditions()
460 expr_set_parent_expr(expr->left, expr); in split_conditions()
461 expr_set_parent_expr(expr->right, expr); in split_conditions()
462 handle_comma(expr); in split_conditions()
471 push_expression(&big_expression_stack, expr); in split_conditions()
472 push_expression(&big_condition_stack, expr); in split_conditions()
474 if (expr->type == EXPR_COMPARE) { in split_conditions()
475 if (expr->left->type != EXPR_POSTOP) in split_conditions()
476 __split_expr(expr->left); in split_conditions()
477 if (expr->right->type != EXPR_POSTOP) in split_conditions()
478 __split_expr(expr->right); in split_conditions()
479 } else if (expr->type != EXPR_POSTOP) { in split_conditions()
480 __split_expr(expr); in split_conditions()
482 do_condition(expr); in split_conditions()
483 if (expr->type == EXPR_COMPARE) { in split_conditions()
484 if (expr->left->type == EXPR_POSTOP) in split_conditions()
485 __split_expr(expr->left); in split_conditions()
486 if (expr->right->type == EXPR_POSTOP) in split_conditions()
487 __split_expr(expr->right); in split_conditions()
488 } else if (expr->type == EXPR_POSTOP) { in split_conditions()
489 __split_expr(expr); in split_conditions()
499 void __split_whole_condition(struct expression *expr) in __split_whole_condition() argument
507 push_expression(&big_expression_stack, expr); in __split_whole_condition()
508 split_conditions(expr); in __split_whole_condition()
510 __pass_to_client(expr, WHOLE_CONDITION_HOOK); in __split_whole_condition()
516 void __handle_logic(struct expression *expr) in __handle_logic() argument
524 push_expression(&big_expression_stack, expr); in __handle_logic()
525 if (expr) in __handle_logic()
526 split_conditions(expr); in __handle_logic()
528 __pass_to_client(expr, WHOLE_CONDITION_HOOK); in __handle_logic()
535 int is_condition(struct expression *expr) in is_condition() argument
538 expr = strip_expr(expr); in is_condition()
539 if (!expr) in is_condition()
542 switch (expr->type) { in is_condition()
547 if (expr->op == '!') in is_condition()
553 int __handle_condition_assigns(struct expression *expr) in __handle_condition_assigns() argument
559 if (expr->op != '=') in __handle_condition_assigns()
561 right = strip_expr(expr->right); in __handle_condition_assigns()
562 if (!is_condition(expr->right)) in __handle_condition_assigns()
577 set_extra_expr_mod(expr->left, alloc_estate_sval(sval_type_val(get_type(expr->left), 1))); in __handle_condition_assigns()
593 set_extra_expr_mod(expr->left, alloc_estate_sval(sval_type_val(get_type(expr->left), 0))); in __handle_condition_assigns()
608 __pass_to_client(expr, ASSIGNMENT_HOOK); in __handle_condition_assigns()
613 static int is_select_assign(struct expression *expr) in is_select_assign() argument
617 if (expr->op != '=') in is_select_assign()
619 right = strip_expr(expr->right); in is_select_assign()
627 int __handle_select_assigns(struct expression *expr) in __handle_select_assigns() argument
635 if (!is_select_assign(expr)) in __handle_select_assigns()
638 right = strip_expr(expr->right); in __handle_select_assigns()
652 fake_expr = assign_expression(expr->left, expr->op, right->cond_true); in __handle_select_assigns()
654 fake_expr = assign_expression(expr->left, expr->op, right->conditional); in __handle_select_assigns()
663 fake_expr = assign_expression(expr->left, expr->op, right->cond_false); in __handle_select_assigns()
704 int __handle_expr_statement_assigns(struct expression *expr) in __handle_expr_statement_assigns() argument
709 right = expr->right; in __handle_expr_statement_assigns()
733 fake_assign = assign_expression(expr->left, expr->op, &fake_expr_stmt); in __handle_expr_statement_assigns()
741 fake_assign = assign_expression(expr->left, expr->op, stmt->expression); in __handle_expr_statement_assigns()