30 static struct statement *get_cur_stmt(void)
31 {
32 return last_ptr_list((struct ptr_list *)big_statement_stack);
33 }
34
35 static void set_modified(struct sm_state *sm, struct expression *mod_expr)
36 {
37 set_state(my_id, sm->name, sm->sym, &modified);
38 }
39
40 static struct expression *strip_condition(struct expression *expr)
41 {
42 expr = strip_expr(expr);
43
44 if (expr->type == EXPR_PREOP && expr->op == '!')
45 return strip_condition(expr->unop);
46
47 if (expr->type == EXPR_COMPARE &&
48 (expr->op == SPECIAL_EQUAL ||
49 expr->op == SPECIAL_NOTEQUAL)) {
50 if (is_zero(expr->left))
51 return strip_condition(expr->right);
52 if (is_zero(expr->right))
53 return strip_condition(expr->left);
54 }
55
56 return expr;
57 }
58
59 static int conditions_match(struct expression *cond, struct expression *prev)
60 {
61 prev = strip_condition(prev);
62
63 if (prev == cond)
64 return 1;
65
66 if (prev->type == EXPR_LOGICAL) {
67 if (conditions_match(cond, prev->left) ||
68 conditions_match(cond, prev->right))
69 return 1;
70 }
71
72 return 0;
114 if (strcasestr(name, "delay"))
115 return 1;
116 if (strcasestr(name, "schedule"))
117 return 1;
118 if (strcmp(name, "smp_rmb") == 0)
119 return 1;
120 if (strcmp(name, "mb") == 0)
121 return 1;
122 if (strcmp(name, "barrier") == 0)
123 return 1;
124 return 0;
125 }
126
127 static int previous_statement_was_synchronize(void)
128 {
129 struct statement *stmt;
130 struct position pos;
131 struct position prev_pos;
132 char *ident;
133
134 if (__prev_stmt) {
135 prev_pos = __prev_stmt->pos;
136 prev_pos.line -= 3;
137 } else {
138 prev_pos = __cur_stmt->pos;
139 prev_pos.line -= 5;
140 }
141
142 FOR_EACH_PTR_REVERSE(big_statement_stack, stmt) {
143 if (stmt->pos.line < prev_pos.line)
144 return 0;
145 pos = stmt->pos;
146 ident = get_macro_name(pos);
147 if (name_means_synchronize(ident))
148 return 1;
149 ident = pos_ident(pos);
150 if (!ident)
151 continue;
152 if (strcmp(ident, "if") == 0) {
153 pos.pos += 4;
|
30 static struct statement *get_cur_stmt(void)
31 {
32 return last_ptr_list((struct ptr_list *)big_statement_stack);
33 }
34
35 static void set_modified(struct sm_state *sm, struct expression *mod_expr)
36 {
37 set_state(my_id, sm->name, sm->sym, &modified);
38 }
39
40 static struct expression *strip_condition(struct expression *expr)
41 {
42 expr = strip_expr(expr);
43
44 if (expr->type == EXPR_PREOP && expr->op == '!')
45 return strip_condition(expr->unop);
46
47 if (expr->type == EXPR_COMPARE &&
48 (expr->op == SPECIAL_EQUAL ||
49 expr->op == SPECIAL_NOTEQUAL)) {
50 if (expr_is_zero(expr->left))
51 return strip_condition(expr->right);
52 if (expr_is_zero(expr->right))
53 return strip_condition(expr->left);
54 }
55
56 return expr;
57 }
58
59 static int conditions_match(struct expression *cond, struct expression *prev)
60 {
61 prev = strip_condition(prev);
62
63 if (prev == cond)
64 return 1;
65
66 if (prev->type == EXPR_LOGICAL) {
67 if (conditions_match(cond, prev->left) ||
68 conditions_match(cond, prev->right))
69 return 1;
70 }
71
72 return 0;
114 if (strcasestr(name, "delay"))
115 return 1;
116 if (strcasestr(name, "schedule"))
117 return 1;
118 if (strcmp(name, "smp_rmb") == 0)
119 return 1;
120 if (strcmp(name, "mb") == 0)
121 return 1;
122 if (strcmp(name, "barrier") == 0)
123 return 1;
124 return 0;
125 }
126
127 static int previous_statement_was_synchronize(void)
128 {
129 struct statement *stmt;
130 struct position pos;
131 struct position prev_pos;
132 char *ident;
133
134 if (!__cur_stmt)
135 return 0;
136
137 if (__prev_stmt) {
138 prev_pos = __prev_stmt->pos;
139 prev_pos.line -= 3;
140 } else {
141 prev_pos = __cur_stmt->pos;
142 prev_pos.line -= 5;
143 }
144
145 FOR_EACH_PTR_REVERSE(big_statement_stack, stmt) {
146 if (stmt->pos.line < prev_pos.line)
147 return 0;
148 pos = stmt->pos;
149 ident = get_macro_name(pos);
150 if (name_means_synchronize(ident))
151 return 1;
152 ident = pos_ident(pos);
153 if (!ident)
154 continue;
155 if (strcmp(ident, "if") == 0) {
156 pos.pos += 4;
|