linux-sparse.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/3] improve cast_value()
@ 2022-05-31 19:32 Luc Van Oostenryck
  2022-05-31 19:32 ` [PATCH 1/2] cast_value: assign the new type Luc Van Oostenryck
  2022-05-31 19:32 ` [PATCH 2/2] cast_value: remove error-prone redundant argument Luc Van Oostenryck
  0 siblings, 2 replies; 3+ messages in thread
From: Luc Van Oostenryck @ 2022-05-31 19:32 UTC (permalink / raw)
  To: linux-sparse; +Cc: Luc Van Oostenryck

From: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>

This series contains 2 small improvements to the cast_value() function.

Luc Van Oostenryck (2):
  cast_value: assign the new type
  cast_value: remove error-prone redundant argument

 expand.c     | 10 +++++++---
 expression.c |  3 +--
 expression.h |  3 +--
 parse.c      |  3 +--
 4 files changed, 10 insertions(+), 9 deletions(-)

-- 
2.36.1


^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH 1/2] cast_value: assign the new type
  2022-05-31 19:32 [PATCH 0/3] improve cast_value() Luc Van Oostenryck
@ 2022-05-31 19:32 ` Luc Van Oostenryck
  2022-05-31 19:32 ` [PATCH 2/2] cast_value: remove error-prone redundant argument Luc Van Oostenryck
  1 sibling, 0 replies; 3+ messages in thread
From: Luc Van Oostenryck @ 2022-05-31 19:32 UTC (permalink / raw)
  To: linux-sparse; +Cc: Luc Van Oostenryck

From: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>

The first two arguments of cast_value() are the new expression and the
type wanted for it. This type is then used to calculate the new value.

But the type of the expression must be assigned separately (usually
after the cast because the old and the new expression can refer to
the same object).

To avoid any possible inconsistencies, assign the new type during the
casting itself.

Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
---
 expand.c     | 4 ++++
 expression.c | 1 -
 parse.c      | 1 -
 3 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/expand.c b/expand.c
index c4f806dee1ba..fb11d77aecbc 100644
--- a/expand.c
+++ b/expand.c
@@ -110,11 +110,13 @@ void cast_value(struct expression *expr, struct symbol *newtype,
 	expr->taint = old->taint;
 	if (old_size == new_size) {
 		expr->value = old->value;
+		expr->ctype = newtype;
 		return;
 	}
 
 	// expand it to the full "long long" value
 	value = get_longlong(old);
+	expr->ctype = newtype;
 
 Int:
 	// _Bool requires a zero test rather than truncation.
@@ -153,6 +155,7 @@ Float:
 		value = (long long)old->fvalue;
 		expr->type = EXPR_VALUE;
 		expr->taint = 0;
+		expr->ctype = newtype;
 		goto Int;
 	}
 
@@ -168,6 +171,7 @@ Float:
 			expr->fvalue = (float)expr->fvalue;
 	}
 	expr->type = EXPR_FVALUE;
+	expr->ctype = newtype;
 }
 
 /* Return true if constant shift size is valid */
diff --git a/expression.c b/expression.c
index efdaa36782c7..bead007f9bda 100644
--- a/expression.c
+++ b/expression.c
@@ -433,7 +433,6 @@ struct token *primary_expression(struct token *token, struct expression **tree)
 		if (token_type(token) < TOKEN_WIDE_CHAR) {
 			expr->ctype = &char_ctype;
 			cast_value(expr, &int_ctype, expr, expr->ctype);
-			expr->ctype = &int_ctype;
 		} else {
 			expr->ctype = wchar_ctype;
 		}
diff --git a/parse.c b/parse.c
index bc1c0602fcb4..0e51b3a33e53 100644
--- a/parse.c
+++ b/parse.c
@@ -904,7 +904,6 @@ static void cast_enum_list(struct symbol_list *list, struct symbol *base_type)
 			continue;
 		}
 		cast_value(expr, base_type, expr, ctype);
-		expr->ctype = base_type;
 	} END_FOR_EACH_PTR(sym);
 }
 
-- 
2.36.1


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [PATCH 2/2] cast_value: remove error-prone redundant argument
  2022-05-31 19:32 [PATCH 0/3] improve cast_value() Luc Van Oostenryck
  2022-05-31 19:32 ` [PATCH 1/2] cast_value: assign the new type Luc Van Oostenryck
@ 2022-05-31 19:32 ` Luc Van Oostenryck
  1 sibling, 0 replies; 3+ messages in thread
From: Luc Van Oostenryck @ 2022-05-31 19:32 UTC (permalink / raw)
  To: linux-sparse; +Cc: Luc Van Oostenryck

From: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>

The last two arguments of cast_value() are the old expression and
the oldtype which suggest that this oldtype can be distinct from the
type of the old expression.

But this is not the case because internally the type used to retrieve
the value of the expression is the type of the expression itself (old->ctype)
the type which is used and the two types must be the same (or at least
be equivalent).

So, remove the error-prone last argument and always us the type of the
expression itself.

Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
---
 expand.c     | 6 +++---
 expression.c | 2 +-
 expression.h | 3 +--
 parse.c      | 2 +-
 4 files changed, 6 insertions(+), 7 deletions(-)

diff --git a/expand.c b/expand.c
index fb11d77aecbc..f14e718187bc 100644
--- a/expand.c
+++ b/expand.c
@@ -94,9 +94,9 @@ static long long get_longlong(struct expression *expr)
 	return (value & andmask) | ormask;
 }
 
-void cast_value(struct expression *expr, struct symbol *newtype,
-		struct expression *old, struct symbol *oldtype)
+void cast_value(struct expression *expr, struct symbol *newtype, struct expression *old)
 {
+	struct symbol *oldtype = old->ctype;
 	int old_size = oldtype->bit_size;
 	int new_size = newtype->bit_size;
 	long long value, mask, signmask;
@@ -876,7 +876,7 @@ static int expand_cast(struct expression *expr)
 
 	/* Simplify normal integer casts.. */
 	if (target->type == EXPR_VALUE || target->type == EXPR_FVALUE) {
-		cast_value(expr, expr->ctype, target, target->ctype);
+		cast_value(expr, expr->ctype, target);
 		return 0;
 	}
 	return cost + 1;
diff --git a/expression.c b/expression.c
index bead007f9bda..727e7056e460 100644
--- a/expression.c
+++ b/expression.c
@@ -432,7 +432,7 @@ struct token *primary_expression(struct token *token, struct expression **tree)
 		// TODO: handle 'u8', 'u' & 'U' prefixes.
 		if (token_type(token) < TOKEN_WIDE_CHAR) {
 			expr->ctype = &char_ctype;
-			cast_value(expr, &int_ctype, expr, expr->ctype);
+			cast_value(expr, &int_ctype, expr);
 		} else {
 			expr->ctype = wchar_ctype;
 		}
diff --git a/expression.h b/expression.h
index f733c07697c8..8bf40d32e10b 100644
--- a/expression.h
+++ b/expression.h
@@ -337,7 +337,6 @@ struct token *compound_statement(struct token *, struct statement *);
 #define constant_expression(token,tree) conditional_expression(token, tree)
 
 /* Cast folding of constant values.. */
-void cast_value(struct expression *expr, struct symbol *newtype,
-	struct expression *old, struct symbol *oldtype);
+void cast_value(struct expression *expr, struct symbol *newtype, struct expression *old);
 
 #endif
diff --git a/parse.c b/parse.c
index 0e51b3a33e53..53342c78c108 100644
--- a/parse.c
+++ b/parse.c
@@ -903,7 +903,7 @@ static void cast_enum_list(struct symbol_list *list, struct symbol *base_type)
 			expr->ctype = &int_ctype;
 			continue;
 		}
-		cast_value(expr, base_type, expr, ctype);
+		cast_value(expr, base_type, expr);
 	} END_FOR_EACH_PTR(sym);
 }
 
-- 
2.36.1


^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2022-05-31 19:32 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-31 19:32 [PATCH 0/3] improve cast_value() Luc Van Oostenryck
2022-05-31 19:32 ` [PATCH 1/2] cast_value: assign the new type Luc Van Oostenryck
2022-05-31 19:32 ` [PATCH 2/2] cast_value: remove error-prone redundant argument Luc Van Oostenryck

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).