diff mbox

dissect: teach do_expression() to handle EXPR_OFFSETOF

Message ID 20160208132657.GA19007@redhat.com (mailing list archive)
State Mainlined, archived
Headers show

Commit Message

Oleg Nesterov Feb. 8, 2016, 1:26 p.m. UTC
Starting from a194f3e0 "implement __builtin_offsetof()" sparse handles
offsetof() internally but dissect.c wasn't updated.

Test case:

	struct S { int m; };

	void func(void)
	{
		__builtin_offsetof(struct S, m);
	}

before this patch:

	3:6   g def  func                             void ( ... )
	T.c:5:38: warning: bad expr->type: 30

after:

	3:6   g def  func                             void ( ... )
	1:8   s def  S
	5:38  s ---  S.m                              int

While at it, update my email.

Signed-off-by: Oleg Nesterov <oleg@redhat.com>
---
 dissect.c | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

Comments

Lance Richardson Sept. 26, 2016, 5:52 p.m. UTC | #1
+++ Oleg Nesterov [08/02/16 14:26 +0100]:
>Starting from a194f3e0 "implement __builtin_offsetof()" sparse handles
>offsetof() internally but dissect.c wasn't updated.
>
>Test case:
>
>	struct S { int m; };
>
>	void func(void)
>	{
>		__builtin_offsetof(struct S, m);
>	}
>
>before this patch:
>
>	3:6   g def  func                             void ( ... )
>	T.c:5:38: warning: bad expr->type: 30
>
>after:
>
>	3:6   g def  func                             void ( ... )
>	1:8   s def  S
>	5:38  s ---  S.m                              int
>
>While at it, update my email.
>
>Signed-off-by: Oleg Nesterov <oleg@redhat.com>

LGTM, builds and test case works as expected.
Acked-by: Lance Richardson <lrichard@redhat.com>
--
To unsubscribe from this list: send the line "unsubscribe linux-sparse" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Luc Van Oostenryck Nov. 2, 2016, 2:21 p.m. UTC | #2
On Mon, Feb 08, 2016 at 02:26:57PM +0100, Oleg Nesterov wrote:
> Starting from a194f3e0 "implement __builtin_offsetof()" sparse handles
> offsetof() internally but dissect.c wasn't updated.
> 

LGTM

Reviewed-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
--
To unsubscribe from this list: send the line "unsubscribe linux-sparse" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/dissect.c b/dissect.c
index d211bca..19f3276 100644
--- a/dissect.c
+++ b/dissect.c
@@ -1,7 +1,7 @@ 
 /*
  * sparse/dissect.c
  *
- * Started by Oleg Nesterov <oleg@tv-sign.ru>
+ * Started by Oleg Nesterov <oleg@redhat.com>
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to deal
@@ -429,6 +429,20 @@  again:
 			lookup_member(p_type, expr->member, NULL));
 	}
 
+	break; case EXPR_OFFSETOF: {
+		struct symbol *in = base_type(expr->in);
+
+		do {
+			if (expr->op == '.') {
+				in = report_member(U_VOID, &expr->pos, in,
+					lookup_member(in, expr->ident, NULL));
+			} else {
+				do_expression(U_R_VAL, expr->index);
+				in = in->ctype.base_type;
+			}
+		} while ((expr = expr->down));
+	}
+
 	break; case EXPR_SYMBOL:
 		ret = report_symbol(mode, expr);
 	}