Ping.

H.J.

On Fri, May 29, 2026, 4:59 AM H.J. Lu <[email protected]> wrote:

> On Fri, May 29, 2026 at 2:05 AM Jason Merrill <[email protected]> wrote:
> >
> > On 5/28/26 11:08 AM, H.J. Lu wrote:
> > > On Thu, May 28, 2026 at 9:08 PM Jason Merrill <[email protected]>
> wrote:
> > >>
> > >> On 5/27/26 6:41 PM, H.J. Lu wrote:
> > >>> default_stack_protect_guard calls
> > >>>
> > >>>     lang_hooks.types.type_for_mode (ptr_mode, 1);
> > >>>
> > >>> to get an integer type for __stack_chk_guard which is declared as a
> > >>> global symbol of type uintptr_t.  For 32-bit systems, uintptr_t may
> > >>> be either unsigned int or unsigned long int.  On 32-bit Darwin, we
> get
> > >>>
> > >>> $ cat /tmp/x.c
> > >>> __UINTPTR_TYPE__ __stack_chk_guard = 0x1000;
> > >>> $ ./xgcc -B./ -S /tmp/x.c -m32
> > >>> /tmp/x.c:1:18: error: conflicting types for ‘__stack_chk_guard’; have
> > >>> ‘long unsigned int’
> > >>>       1 | __UINTPTR_TYPE__ __stack_chk_guard = 0x1000;
> > >>>         |                  ^~~~~~~~~~~~~~~~~
> > >>> cc1: note: previous declaration of ‘__stack_chk_guard’ with type
> ‘unsigned int’
> > >>> $
> > >>>
> > >>> since lang_hooks.types.type_for_mode returns unsigned int while
> Darwin's
> > >>> uintptr_t is unsigned long int.  Update default_stack_protect_guard
> to
> > >>> check UINTPTR_TYPE to get unsigned integer type for uintptr_t
> instead.
> > >>>
> > >>> gcc/c-family/
> > >>>
> > >>> PR c/125226
> > >>> * targhooks.cc (default_stack_protect_guard): Check UINTPTR_TYPE
> > >>> to get unsigned integer type for uintptr_t.
> > >>>
> > >>> OK for mastter?
> > >>
> > >> If we're going to reuse the code from build_common_tree_nodes with a
> > >> different string macro, let's factor it out into a function in tree.cc
> > >> that gets called with SIZE_TYPE or UINTPTR_TYPE.
> > >
> > > Like this?
> >
> > Yes.  I also wonder about targets that don't define UINTPTR_TYPE; we
> > might return NULL_TREE from the new function in that case and fall back
> > to type_for_mode in default_stack_protect_guard.
> >
> > Jason
> >
>
> Fixed in v3 with:
>
>       if (UINTPTR_TYPE && targetm.stack_protect_guard_symbol_p ())
>         /* Get unsigned integer type for uintptr_t.  */
>         t = unsigned_integer_tree_node_for_type (UINTPTR_TYPE);
>       else
>         t = ptr_type_node;
>
>
> --
> H.J.
> --
> default_stack_protect_guard calls
>
>   lang_hooks.types.type_for_mode (ptr_mode, 1);
>
> to get an integer type for __stack_chk_guard which is declared as a
> global symbol of type uintptr_t.  For 32-bit systems, uintptr_t may
> be either unsigned int or unsigned long int.  On 32-bit Darwin, we get
>
> $ cat /tmp/x.c
> __UINTPTR_TYPE__ __stack_chk_guard = 0x1000;
> $ ./xgcc -B./ -S /tmp/x.c -m32
> /tmp/x.c:1:18: error: conflicting types for ‘__stack_chk_guard’; have
> ‘long unsigned int’
>     1 | __UINTPTR_TYPE__ __stack_chk_guard = 0x1000;
>       |                  ^~~~~~~~~~~~~~~~~
> cc1: note: previous declaration of ‘__stack_chk_guard’ with type ‘unsigned
> int’
> $
>
> since lang_hooks.types.type_for_mode returns unsigned int while Darwin's
> uintptr_t is unsigned long int.  Update default_stack_protect_guard to
> call unsigned_integer_tree_node_for_type with UINTPTR_TYPE to get unsigned
> integer type for uintptr_t instead.
>
> gcc/
>
> PR c/125226
> * targhooks.cc (default_stack_protect_guard): If UINTPTR_TYPE
> isn't NULL, call unsigned_integer_tree_node_for_type with
> UINTPTR_TYPE to get unsigned integer type for uintptr_t.
> * tree.cc (unsigned_integer_tree_node_for_type): New function.
> (build_common_tree_nodes): Call unsigned_integer_tree_node with
> SIZE_TYPE to get unsigned integer type for size_t.
> * tree.h (unsigned_integer_tree_node_for_type): New prototype.
>

Reply via email to