From 4415972f8716cbe31a2fd3cd889aa66c58093053 Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Thu, 19 Apr 2018 12:23:47 +0300 Subject: [PATCH] expressions: make assign_expression() take an op argument We currently assume that all assign operations are vanila foo = bar but it would be nice to be able to create |= assignments. Signed-off-by: Dan Carpenter --- check_kernel.c | 2 +- smatch_expressions.c | 4 ++-- smatch_extra.h | 2 +- smatch_flow.c | 22 +++++++++++----------- smatch_function_hooks.c | 2 +- smatch_struct_assignment.c | 8 ++++---- 6 files changed, 20 insertions(+), 20 deletions(-) diff --git a/check_kernel.c b/check_kernel.c index 4f7646bf..9ae7a0be 100644 --- a/check_kernel.c +++ b/check_kernel.c @@ -338,7 +338,7 @@ static void match__write_once_size(const char *fn, struct expression *call, if (!data) return; get_absolute_rl(data, &rl); - assign = assign_expression(dest, data); + assign = assign_expression(dest, '=', data); __in_fake_assign++; __split_expr(assign); diff --git a/smatch_expressions.c b/smatch_expressions.c index 031c127c..201f9910 100644 --- a/smatch_expressions.c +++ b/smatch_expressions.c @@ -82,12 +82,12 @@ struct expression *deref_expression(struct expression *expr) return preop; } -struct expression *assign_expression(struct expression *left, struct expression *right) +struct expression *assign_expression(struct expression *left, int op, struct expression *right) { struct expression *expr; expr = alloc_tmp_expression(right->pos, EXPR_ASSIGNMENT); - expr->op = '='; + expr->op = op; expr->left = left; expr->right = right; return expr; diff --git a/smatch_extra.h b/smatch_extra.h index d255973c..2480da5b 100644 --- a/smatch_extra.h +++ b/smatch_extra.h @@ -194,7 +194,7 @@ struct expression *zero_expr(); struct expression *value_expr(long long val); struct expression *member_expression(struct expression *deref, int op, struct ident *member); struct expression *deref_expression(struct expression *expr); -struct expression *assign_expression(struct expression *left, struct expression *right); +struct expression *assign_expression(struct expression *left, int op, struct expression *right); struct expression *binop_expression(struct expression *left, int op, struct expression *right); struct expression *array_element_expression(struct expression *array, struct expression *offset); struct expression *symbol_expression(struct symbol *sym); diff --git a/smatch_flow.c b/smatch_flow.c index d7ee772a..3f72d160 100644 --- a/smatch_flow.c +++ b/smatch_flow.c @@ -245,7 +245,7 @@ static int handle_comma_assigns(struct expression *expr) __split_expr(right->left); __process_post_op_stack(); - assign = assign_expression(expr->left, right->right); + assign = assign_expression(expr->left, '=', right->right); __split_expr(assign); return 1; @@ -265,7 +265,7 @@ static int handle_postop_assigns(struct expression *expr) return 0; fake_left = deref_expression(strip_expr(left->unop)); - assign = assign_expression(fake_left, expr->right); + assign = assign_expression(fake_left, '=', expr->right); __split_expr(assign); __split_expr(expr->left); @@ -1269,7 +1269,7 @@ static void set_inner_struct_members(struct expression *expr, struct symbol *mem if (!tmp->ident) continue; - assign = assign_expression(edge_member, zero_expr()); + assign = assign_expression(edge_member, '=', zero_expr()); __split_expr(assign); } END_FOR_EACH_PTR(tmp); @@ -1308,7 +1308,7 @@ static void set_unset_to_zero(struct symbol *type, struct expression *expr) if (!tmp->ident) continue; - assign = assign_expression(member, zero_expr()); + assign = assign_expression(member, '=', zero_expr()); __split_expr(assign); } END_FOR_EACH_PTR(tmp); } @@ -1363,7 +1363,7 @@ static void fake_member_assigns_helper(struct expression *symbol, struct express else fake_member_assigns_helper(deref, right->expr_list, fake_cb); } else { - assign = assign_expression(deref, right); + assign = assign_expression(deref, '=', right); fake_cb(assign); } } END_FOR_EACH_PTR(tmp); @@ -1405,7 +1405,7 @@ static void fake_element_assigns_helper(struct expression *array, struct express else fake_member_assigns_helper(binop, tmp->expr_list, fake_cb); } else { - assign = assign_expression(binop, tmp); + assign = assign_expression(binop, '=', tmp); fake_cb(assign); } next: @@ -1423,7 +1423,7 @@ static void fake_assign_expr(struct symbol *sym) struct expression *assign, *symbol; symbol = symbol_expression(sym); - assign = assign_expression(symbol, sym->initializer); + assign = assign_expression(symbol, '=', sym->initializer); __split_expr(assign); } @@ -1472,7 +1472,7 @@ static void fake_global_assign(struct symbol *sym) fake_element_assigns(sym, call_global_assign_hooks); } else if (sym->initializer) { symbol = symbol_expression(sym); - assign = assign_expression(symbol, sym->initializer); + assign = assign_expression(symbol, '=', sym->initializer); __pass_to_client(assign, GLOBAL_ASSIGNMENT_HOOK); } else { fake_element_assigns_helper(symbol_expression(sym), NULL, call_global_assign_hooks); @@ -1482,7 +1482,7 @@ static void fake_global_assign(struct symbol *sym) fake_member_assigns(sym, call_global_assign_hooks); } else if (sym->initializer) { symbol = symbol_expression(sym); - assign = assign_expression(symbol, sym->initializer); + assign = assign_expression(symbol, '=', sym->initializer); __pass_to_client(assign, GLOBAL_ASSIGNMENT_HOOK); } else { fake_member_assigns_helper(symbol_expression(sym), NULL, call_global_assign_hooks); @@ -1490,9 +1490,9 @@ static void fake_global_assign(struct symbol *sym) } else { symbol = symbol_expression(sym); if (sym->initializer) - assign = assign_expression(symbol, sym->initializer); + assign = assign_expression(symbol, '=', sym->initializer); else - assign = assign_expression(symbol, zero_expr()); + assign = assign_expression(symbol, '=', zero_expr()); __pass_to_client(assign, GLOBAL_ASSIGNMENT_HOOK); } } diff --git a/smatch_function_hooks.c b/smatch_function_hooks.c index 766012da..f6d2c0cf 100644 --- a/smatch_function_hooks.c +++ b/smatch_function_hooks.c @@ -808,7 +808,7 @@ static void fake_a_param_assignment(struct expression *expr, const char *return_ right = gen_expression_from_key(arg, buf); if (!right) /* Mostly fails for binops like [$0 + 4032] */ return; - fake_assign = assign_expression(left, right); + fake_assign = assign_expression(left, '=', right); __in_fake_assign++; __split_expr(fake_assign); __in_fake_assign--; diff --git a/smatch_struct_assignment.c b/smatch_struct_assignment.c index 393ad1ae..f9efcaec 100644 --- a/smatch_struct_assignment.c +++ b/smatch_struct_assignment.c @@ -153,7 +153,7 @@ static void handle_non_struct_assignments(struct expression *left, struct expres right = deref_expression(right); else right = unknown_value_expression(left); - assign = assign_expression(left, right); + assign = assign_expression(left, '=', right); split_fake_expr(assign); return; } @@ -162,7 +162,7 @@ static void handle_non_struct_assignments(struct expression *left, struct expres right = strip_expr(right); if (!right) right = unknown_value_expression(left); - assign = assign_expression(left, right); + assign = assign_expression(left, '=', right); split_fake_expr(assign); } @@ -211,7 +211,7 @@ static void set_inner_struct_members(int mode, struct expression *faked, struct break; } - assign = assign_expression(left_member, right_member); + assign = assign_expression(left_member, '=', right_member); split_fake_expr(assign); } END_FOR_EACH_PTR(tmp); } @@ -286,7 +286,7 @@ static void __struct_members_copy(int mode, struct expression *faked, sm_msg("internal. No right member"); continue; } - assign = assign_expression(left_member, right_member); + assign = assign_expression(left_member, '=', right_member); split_fake_expr(assign); } END_FOR_EACH_PTR(tmp); -- 2.11.4.GIT