RE: [EXTERNAL]: Re: Why int32_t is long int on 32 Bit Intel?

"panda.trooper" <[email protected]>
Newsgroups gmane.comp.lib.newlib
Message-ID <mbDd8IERY7M0G1lBn5FywuMKfPvSzWZhqLa1QfC7m5sX0T93-Ck-kM_OD2atJdTl8PMxOiRfuwo_JIspF53B4Fj4wqHz-qINH6bYBV-wzN8=@protonmail.com>
Hi Jon,

you are right, in recent GCC/newlib combinations it is GCC who decides by means of setting __INT32_TYPE__, and newlib takes whatever is defined in __INT32_TYPE__. However, in older newlib versions this was not the case. In the good old days the decision was made like this (newlib/libc/include/stdint.h in newlib version 1.18):

/* Check if "long" is 64bit or 32bit wide */
#if __STDINT_EXP(LONG_MAX) > 0x7fffffff
#define __have_long64 1
#elif __STDINT_EXP(LONG_MAX) == 0x7fffffff && !defined(__SPU__)
#define __have_long32 1
#endif
[...]
#if __have_long32
typedef signed long int32_t;
typedef unsigned long uint32_t;
#define __int32_t_defined 1
#elif __STDINT_EXP(INT_MAX) == 0x7fffffffL
typedef signed int int32_t;
typedef unsigned int uint32_t;
#define __int32_t_defined 1
[...]

Please notice "&& !defined(__SPU__)", which is an very interesting exception from the default case. In gcc/config/newlib-stdint.h you find references to this in form of the comment (just from before your excerpt):

/* newlib uses 32-bit long in certain cases for all non-SPU
   targets.  */
#ifndef STDINT_LONG32
#define STDINT_LONG32 (LONG_TYPE_SIZE == 32)
#endif

So the roots of this decision are in the history of newlib. I also assumed that those people who created gcc/config/newlib-stdint.h have quite some stakes in newlib (or the other way around). That's why I asked in this community.

Your explanation with Turbo C is also plausible. Thanks for that interesting insight.

One final question: do you know what "SPU" means in this context and why it is an exceptional case?

Cheers,
Zoltan

------- Original Message -------
On Friday, July 28th, 2023 at 22:23, Jon Beniston <[email protected]> wrote:


> > So again, just out of curiosity: what is the reason using long as int32_t on an architecture where int is suitable, too?
> 
> 
> Long ago, there were 32-bit x86 compilers where int was 16-bit (E.g. Turbo C).
> 
> Also, are you sure it isn't gcc that's determining the type of int32_t rather than Newlib? I've not used i686-elf-gcc, but for some targets newlib defines int32_t based on INT32_TYPE which is defined by gcc:
> 
> In gcc/config/newlib-stdint.h
> 
> #ifndef STDINT_LONG32
> #define STDINT_LONG32 (LONG_TYPE_SIZE == 32)
> #endif
> ...
> #define INT32_TYPE (STDINT_LONG32 ? "long int" : INT_TYPE_SIZE == 32 ? "int" : SHORT_TYPE_SIZE == 32 ? "short int" : CHAR_TYPE_SIZE == 32 ? "signed char" : 0)
> 
> Cheers,
> Jon
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.