On Tue, Apr 22, 2025 at 5:22 PM Qing Zhao <qing.z...@oracle.com> wrote:
>
> Hi,
>
> I have met the following issue when I tried to implement the following into 
> tree-object-size.cc:
> (And this took me quite some time, still don’t know what’s the best solution)
>
> > On Apr 16, 2025, at 10:46, Qing Zhao <qing.z...@oracle.com> wrote:
> >
> > 3. When generating the reference to the field member in tree-object-size, 
> > we should guard this reference with a checking
> >    on the pointer to the structure is valid. i.e:
> >
> > struct annotated {
> >  size_t count;
> >  char array[] __attribute__((counted_by (count)));
> > };
> >
> > static size_t __attribute__((__noinline__)) size_of (struct annotated * obj)
> > {
> >   return __builtin_dynamic_object_size (obj, 1);
> > }
> >
> > When we try to generate the reference to obj->count when evaluating 
> > __builtin_dynamic_object_size (obj, 1),
> > We should generate the following:
> >
> >   If (obj != NULL)
> >     * (&obj->count)
> >
> > To make sure that the pointer to the structure object is valid first.
> >
>
> Then as I generate the following size_expr in tree-object-size.cc:
>
> Breakpoint 1, gimplify_size_expressions (osi=0xffffffffdf30)
>     at ../../latest-gcc-write/gcc/tree-object-size.cc:1178
> 1178       force_gimple_operand (size_expr, &seq, true, NULL);
> (gdb) call debug_generic_expr(size_expr)
> _4 = obj_2(D) != 0B ? (sizetype) (int) MAX_EXPR <(sizetype) MAX_EXPR <MEM 
> <int> [(void *)&*obj_2(D)], 0> + 4, 4> : 18446744073709551615
>
> When calling “force_gimple_operand” for the above size_expr, I got the 
> following ICE in gimplify_modify_expr, at gimplify.cc:7505:

You shouldn't really force_gimple_operand to a MODIFY_EXPR but instead
only to its RHS.

> (gdb) c
> Continuing.
> during GIMPLE pass: objsz
> dump file: a-t.c.110t.objsz1
> In function ‘size_of’:
> cc1: internal compiler error: in gimplify_modify_expr, at gimplify.cc:7505
> 0x36feb67 internal_error(char const*, ...)
> ../../latest-gcc-write/gcc/diagnostic-global-context.cc:517
> 0x36ccd67 fancy_abort(char const*, int, char const*)
> ../../latest-gcc-write/gcc/diagnostic.cc:1749
> 0x14fa8ab gimplify_modify_expr
> ../../latest-gcc-write/gcc/gimplify.cc:7505
> 0x15354c3 gimplify_expr(tree_node**, gimple**, gimple**, bool 
> (*)(tree_node*), int)
> ../../latest-gcc-write/gcc/gimplify.cc:19530
> 0x14fe1b3 gimplify_stmt(tree_node**, gimple**)
> ../../latest-gcc-write/gcc/gimplify.cc:8458
> ….
> 0x1b07757 gimplify_size_expressions
> ../../latest-gcc-write/gcc/tree-object-size.cc:1178
>
> I debugged into this a little bit, and found that the following are the 
> reason for the assertion failure in the routine “gimplify_modify_expr” of 
> gimplify.cc:
>
> 1. The assertion failure is:
>
>  7502   if (gimplify_ctxp->into_ssa && is_gimple_reg (*to_p))
>  7503     {
>  7504       /* We should have got an SSA name from the start.  */
>  7505       gcc_assert (TREE_CODE (*to_p) == SSA_NAME
>  7506                   || ! gimple_in_ssa_p (cfun));
>  7507     }
>
> 2. The above assertion failure is issued for the following temporary tree:
>
> (gdb) call debug_generic_expr(*to_p)
> iftmp.2
> (gdb) call debug_generic_expr(*expr_p)
> iftmp.2 = (sizetype) _10
>
> In the above, the temporary variable “iftmp.2” triggered the assertion since 
> it’s NOT a SSA_NAME but the gimple_in_ssa_p (cfun) is TRUE.
>
> 3. As I checked, this temporary variable “iftmp.2” was generated at line 5498 
> in the routine “gimplify_cond_expr” of gimplify.cc:
>
>  5477   /* If this COND_EXPR has a value, copy the values into a temporary 
> within
>  5478      the arms.  */
>  5479   if (!VOID_TYPE_P (type))
>  5480     {
> …..
>  5498           tmp = create_tmp_var (type, "iftmp”);
> ...
>  5537     }
>
> 4. And then later, this temporary created here “iftmp.2” triggered the 
> assertion failure.
>
> Right now, I have the following questions:
>
> 1. Can I generate a size_expr as complicate as the following in 
> tree-object-size.cc:
>
> _4 = obj_2(D) != 0B ? (sizetype) (int) MAX_EXPR <(sizetype) MAX_EXPR <MEM 
> <int> [(void *)&*obj_2(D)], 0> + 4, 4> : 18446744073709551615
>
> 2. If Yes to 1, is this a bug in “gimplify_cond_expr”? Shall we call 
> “make_ssa_name” after the call to “create_tmp_var” if “gimple_in_ssa_p(cfun)” 
> is TRUE?
>
> 3. If No to 1, how can we check whether the pointer is zero before 
> dereference from it to access its field?
>
> Thanks a lot for any hints.
>
> Qing

Reply via email to