diff options
| author | Linus Torvalds <torvalds@penguin.transmeta.com> | 2003-04-04 18:07:53 -0700 |
|---|---|---|
| committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-07 21:00:12 -0700 |
| commit | 6b4b251f9ad41e96d88f92b57930c4d01c7eddd4 (patch) | |
| tree | 3be9cafab6dfe22abf7569c4905958d914bef036 | |
| parent | 9aac322fe706341b6fcccedc8c21075ee7c65940 (diff) | |
| download | sparse-dev-6b4b251f9ad41e96d88f92b57930c4d01c7eddd4.tar.gz | |
Clean up and factor out offset add from member dereference.
| -rw-r--r-- | evaluate.c | 32 |
1 files changed, 21 insertions, 11 deletions
@@ -922,6 +922,26 @@ struct symbol *find_identifier(struct ident *ident, struct symbol_list *_list, i return NULL; } +static struct expression *evaluate_offset(struct expression *expr, unsigned long offset) +{ + struct expression *add; + + if (!offset) + return expr; + + /* Create a new add-expression */ + add = alloc_expression(expr->pos, EXPR_BINOP); + add->op = '+'; + add->ctype = &ptr_ctype; + add->left = expr; + add->right = alloc_expression(expr->pos, EXPR_VALUE); + add->right->ctype = &int_ctype; + add->right->value = offset; + + simplify_int_binop(add, &ptr_ctype); + return add; +} + /* structure/union dereference */ static struct symbol *evaluate_member_dereference(struct expression *expr) { @@ -977,17 +997,7 @@ static struct symbol *evaluate_member_dereference(struct expression *expr) return NULL; } - add = deref; - if (offset != 0) { - add = alloc_expression(expr->pos, EXPR_BINOP); - add->op = '+'; - add->ctype = &ptr_ctype; - add->left = deref; - add->right = alloc_expression(expr->pos, EXPR_VALUE); - add->right->ctype = &int_ctype; - add->right->value = offset; - simplify_int_binop(add, &ptr_ctype); - } + add = evaluate_offset(deref, offset); ctype = member->ctype.base_type; if (ctype->type == SYM_BITFIELD) { |
