[committed] middle-end: Avoid calling targetm.c.bitint_type_info inside of gcc_assert [PR102989]

Message ID ZPmWasamz75b66t1@tucnak
State Unresolved
Headers
Series [committed] middle-end: Avoid calling targetm.c.bitint_type_info inside of gcc_assert [PR102989] |

Checks

Context Check Description
snail/gcc-patch-check warning Git am fail log

Commit Message

Jakub Jelinek Sept. 7, 2023, 9:22 a.m. UTC
  On Thu, Sep 07, 2023 at 10:36:02AM +0200, Thomas Schwinge wrote:
> Minor comment/question: are we doing away with the property that
> 'assert'-like "calls" must not have side effects?  Per 'gcc/system.h',
> this is "OK" for 'gcc_assert' for '#if ENABLE_ASSERT_CHECKING' or
> '#elif (GCC_VERSION >= 4005)' -- that is, GCC 4.5, which is always-true,
> thus the "offending" '#else' is never active.  However, it's different
> for standard 'assert' and 'gcc_checking_assert', so I'm not sure if
> that's a good property for 'gcc_assert' only?  For example, see also
> <https://gcc.gnu.org/PR6906> "warn about asserts with side effects", or
> recent <https://gcc.gnu.org/PR111144>
> "RFE: could -fanalyzer warn about assertions that have side effects?".

You're right, the
  #define gcc_assert(EXPR) ((void)(0 && (EXPR)))
fallback definition is incompatible with the way I've used it, so for
--disable-checking built by non-GCC it would not work properly.

Fixed thusly, committed to trunk as obvious.

2023-09-07  Jakub Jelinek  <jakub@redhat.com>

	PR c/102989
	* expr.cc (expand_expr_real_1): Don't call targetm.c.bitint_type_info
	inside gcc_assert, as later code relies on it filling info variable.
	* gimple-fold.cc (clear_padding_bitint_needs_padding_p,
	clear_padding_type): Likewise.
	* varasm.cc (output_constant): Likewise.
	* fold-const.cc (native_encode_int, native_interpret_int): Likewise.
	* stor-layout.cc (finish_bitfield_representative, layout_type):
	Likewise.
	* gimple-lower-bitint.cc (bitint_precision_kind): Likewise.



	Jakub
  

Patch

--- gcc/expr.cc.jj	2023-09-06 17:28:24.216977643 +0200
+++ gcc/expr.cc	2023-09-07 11:11:57.761912944 +0200
@@ -11039,7 +11039,8 @@  expand_expr_real_1 (tree exp, rtx target
 	  {
 	    unsigned int prec = TYPE_PRECISION (type);
 	    struct bitint_info info;
-	    gcc_assert (targetm.c.bitint_type_info (prec, &info));
+	    bool ok = targetm.c.bitint_type_info (prec, &info);
+	    gcc_assert (ok);
 	    scalar_int_mode limb_mode
 	      = as_a <scalar_int_mode> (info.limb_mode);
 	    unsigned int limb_prec = GET_MODE_PRECISION (limb_mode);
--- gcc/gimple-fold.cc.jj	2023-09-06 17:28:24.221977578 +0200
+++ gcc/gimple-fold.cc	2023-09-07 11:11:57.765912888 +0200
@@ -4602,7 +4602,8 @@  static bool
 clear_padding_bitint_needs_padding_p (tree type)
 {
   struct bitint_info info;
-  gcc_assert (targetm.c.bitint_type_info (TYPE_PRECISION (type), &info));
+  bool ok = targetm.c.bitint_type_info (TYPE_PRECISION (type), &info);
+  gcc_assert (ok);
   if (info.extended)
     return false;
   scalar_int_mode limb_mode = as_a <scalar_int_mode> (info.limb_mode);
@@ -4880,7 +4881,8 @@  clear_padding_type (clear_padding_struct
     case BITINT_TYPE:
       {
 	struct bitint_info info;
-	gcc_assert (targetm.c.bitint_type_info (TYPE_PRECISION (type), &info));
+	bool ok = targetm.c.bitint_type_info (TYPE_PRECISION (type), &info);
+	gcc_assert (ok);
 	scalar_int_mode limb_mode = as_a <scalar_int_mode> (info.limb_mode);
 	if (TYPE_PRECISION (type) <= GET_MODE_PRECISION (limb_mode))
 	  {
--- gcc/varasm.cc.jj	2023-09-06 17:28:24.239977342 +0200
+++ gcc/varasm.cc	2023-09-07 11:11:57.769912832 +0200
@@ -5289,8 +5289,8 @@  output_constant (tree exp, unsigned HOST
 	{
 	  struct bitint_info info;
 	  tree type = TREE_TYPE (exp);
-	  gcc_assert (targetm.c.bitint_type_info (TYPE_PRECISION (type),
-						  &info));
+	  bool ok = targetm.c.bitint_type_info (TYPE_PRECISION (type), &info);
+	  gcc_assert (ok);
 	  scalar_int_mode limb_mode = as_a <scalar_int_mode> (info.limb_mode);
 	  if (TYPE_PRECISION (type) <= GET_MODE_PRECISION (limb_mode))
 	    {
--- gcc/fold-const.cc.jj	2023-09-06 17:28:24.219977604 +0200
+++ gcc/fold-const.cc	2023-09-07 11:11:57.772912790 +0200
@@ -7731,8 +7731,8 @@  native_encode_int (const_tree expr, unsi
   if (TREE_CODE (type) == BITINT_TYPE)
     {
       struct bitint_info info;
-      gcc_assert (targetm.c.bitint_type_info (TYPE_PRECISION (type),
-					      &info));
+      bool ok = targetm.c.bitint_type_info (TYPE_PRECISION (type), &info);
+      gcc_assert (ok);
       scalar_int_mode limb_mode = as_a <scalar_int_mode> (info.limb_mode);
       if (TYPE_PRECISION (type) > GET_MODE_PRECISION (limb_mode))
 	{
@@ -8661,8 +8661,8 @@  native_interpret_int (tree type, const u
   if (TREE_CODE (type) == BITINT_TYPE)
     {
       struct bitint_info info;
-      gcc_assert (targetm.c.bitint_type_info (TYPE_PRECISION (type),
-					      &info));
+      bool ok = targetm.c.bitint_type_info (TYPE_PRECISION (type), &info);
+      gcc_assert (ok);
       scalar_int_mode limb_mode = as_a <scalar_int_mode> (info.limb_mode);
       if (TYPE_PRECISION (type) > GET_MODE_PRECISION (limb_mode))
 	{
--- gcc/stor-layout.cc.jj	2023-09-06 17:28:24.226977512 +0200
+++ gcc/stor-layout.cc	2023-09-07 11:11:57.775912748 +0200
@@ -2152,7 +2152,8 @@  finish_bitfield_representative (tree rep
 	{
 	  struct bitint_info info;
 	  unsigned prec = TYPE_PRECISION (TREE_TYPE (field));
-	  gcc_assert (targetm.c.bitint_type_info (prec, &info));
+	  bool ok = targetm.c.bitint_type_info (prec, &info);
+	  gcc_assert (ok);
 	  scalar_int_mode limb_mode = as_a <scalar_int_mode> (info.limb_mode);
 	  unsigned lprec = GET_MODE_PRECISION (limb_mode);
 	  if (prec > lprec)
@@ -2413,7 +2414,8 @@  layout_type (tree type)
       {
 	struct bitint_info info;
 	int cnt;
-	gcc_assert (targetm.c.bitint_type_info (TYPE_PRECISION (type), &info));
+	bool ok = targetm.c.bitint_type_info (TYPE_PRECISION (type), &info);
+	gcc_assert (ok);
 	scalar_int_mode limb_mode = as_a <scalar_int_mode> (info.limb_mode);
 	if (TYPE_PRECISION (type) <= GET_MODE_PRECISION (limb_mode))
 	  {
--- gcc/gimple-lower-bitint.cc.jj	2023-09-06 17:49:21.945490318 +0200
+++ gcc/gimple-lower-bitint.cc	2023-09-07 11:11:57.778912706 +0200
@@ -92,7 +92,8 @@  bitint_precision_kind (int prec)
     return bitint_prec_middle;
 
   struct bitint_info info;
-  gcc_assert (targetm.c.bitint_type_info (prec, &info));
+  bool ok = targetm.c.bitint_type_info (prec, &info);
+  gcc_assert (ok);
   scalar_int_mode limb_mode = as_a <scalar_int_mode> (info.limb_mode);
   if (prec <= GET_MODE_PRECISION (limb_mode))
     {