On 5/8/26 6:05 AM, 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.

Add LANG_HOOKS_TYPE_FOR_MODE_KIND to specify signed or unsigned integer
type for pointer and update default_stack_protect_guard to call

   lang_hooks.types.type_for_mode_kind
     (ptr_mode, 1, KIND_IS_INTEGER_FOR_POINTER);

to get unsigned integer type for pointer.

Instead of adding this additional parameter; can we just adjust the existing c_common_type_for_mode handling of pointer modes, i.e.

  if (mode == TYPE_MODE (build_pointer_type (char_type_node))
      || mode == TYPE_MODE (build_pointer_type (integer_type_node)))
    {
      unsigned int precision
        = GET_MODE_PRECISION (as_a <scalar_int_mode> (mode));
      return (unsignedp
              ? make_unsigned_type (precision)
              : make_signed_type (precision));
    }

to return [u]intptr_type_node?

Jason

Reply via email to