aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
authorLinus Torvalds <torvalds@penguin.transmeta.com>2003-04-04 18:07:53 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-07 21:00:12 -0700
commit6b4b251f9ad41e96d88f92b57930c4d01c7eddd4 (patch)
tree3be9cafab6dfe22abf7569c4905958d914bef036
parent9aac322fe706341b6fcccedc8c21075ee7c65940 (diff)
downloadsparse-dev-6b4b251f9ad41e96d88f92b57930c4d01c7eddd4.tar.gz
Clean up and factor out offset add from member dereference.
-rw-r--r--evaluate.c32
1 files changed, 21 insertions, 11 deletions
diff --git a/evaluate.c b/evaluate.c
index 09822294..0b08290e 100644
--- a/evaluate.c
+++ b/evaluate.c
@@ -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) {