devel/arm-none-eabi-newlib headers inconsistencies (not functional) or am I misusing something?

José Pérez <[email protected]>
Newsgroups gmane.os.freebsd.devel.arm
Message-ID <[email protected]>
Hi,
a source as simple as this does not compile with 
devel/arm-none-eabi-newlib installed

#include <stdio.h>

int main(int argc, char *argv[]) {
   return 0;
}

% arm-none-eabi-gcc break_arm.c
In file included from break_arm.c:1:
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:59:26: 
error: expected ';' before 'typedef'
    59 | __NULLABILITY_PRAGMA_PUSH
       |                          ^
       |                          ;
    60 |
    61 | typedef __off_t         fpos_t;
       | ~~~~~~~
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:61:9: 
error: unknown type name '__off_t'
    61 | typedef __off_t         fpos_t;
       |         ^~~~~~~
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:76:9: 
error: unknown type name '__off_t'
    76 | typedef __off_t         off_t;
       |         ^~~~~~~
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:80:9: 
error: unknown type name '__ssize_t'
    80 | typedef __ssize_t       ssize_t;
       |         ^~~~~~~~~
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:86:9: 
error: unknown type name '__off64_t'
    86 | typedef __off64_t       off64_t;
       |         ^~~~~~~~~
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:91:9: 
error: unknown type name '__va_list'
    91 | typedef __va_list __not_va_list__;
       |         ^~~~~~~~~
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:149:29: 
error: expected ')' before '_close'
   149 |         int     (* _Nullable _close)(void *);
       |                             ^~~~~~~
       |                             )
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:150:29: 
error: expected ')' before '_read'
   150 |         int     (* _Nullable _read)(void *, char *, int);
       |                             ^~~~~~
       |                             )
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:151:29: 
error: expected ')' before '_seek'
   151 |         fpos_t  (* _Nullable _seek)(void *, fpos_t, int);
       |                             ^~~~~~
       |                             )
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:152:29: 
error: expected ')' before '_write'
   152 |         int     (* _Nullable _write)(void *, const char *, int);
       |                             ^~~~~~~
       |                             )
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:174:9: 
error: unknown type name '__mbstate_t'
   174 |         __mbstate_t _mbstate;   /* multibyte conversion state */
       |         ^~~~~~~~~~~
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:373:25: 
error: unknown type name '__off_t'; did you mean '_off_t'?
   373 | int      fseeko(FILE *, __off_t, int);
       |                         ^~~~~~~
       |                         _off_t
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:374:1: 
error: unknown type name '__off_t'; did you mean '_off_t'?
   374 | __off_t  ftello(FILE *);
       | ^~~~~~~
       | _off_t
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:427:20: 
error: conflicting types for '_Nullable'; have 'int (*)(void *, const 
char *, int)'
   427 |             int (* _Nullable)(void *, const char *, int),
       |             ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:426:20: 
note: previous definition of '_Nullable' with type 'int (*)(void *, char 
*, int)'
   426 |             int (* _Nullable)(void *, char *, int),
       |             ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:428:23: 
error: conflicting types for '_Nullable'; have 'fpos_t (*)(void *, 
fpos_t,  int)' {aka 'int (*)(void *, int,  int)'}
   428 |             fpos_t (* _Nullable)(void *, fpos_t, int),
       |             ~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:427:20: 
note: previous definition of '_Nullable' with type 'int (*)(void *, 
const char *, int)'
   427 |             int (* _Nullable)(void *, const char *, int),
       |             ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:429:20: 
error: conflicting types for '_Nullable'; have 'int (*)(void *)'
   429 |             int (* _Nullable)(void *));
       |             ~~~~~~~^~~~~~~~~~~~~~~~~~
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:428:23: 
note: previous definition of '_Nullable' with type 'fpos_t (*)(void *, 
fpos_t,  int)' {aka 'int (*)(void *, int,  int)'}
   428 |             fpos_t (* _Nullable)(void *, fpos_t, int),
       |             ~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:433:9: 
error: unknown type name '__ssize_t'
   433 | typedef __ssize_t cookie_read_function_t(void *, char *, 
size_t);
       |         ^~~~~~~~~
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:434:9: 
error: unknown type name '__ssize_t'
   434 | typedef __ssize_t cookie_write_function_t(void *, const char *, 
size_t);
       |         ^~~~~~~~~
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:450:25: 
error: unknown type name '__off_t'; did you mean '_off_t'?
   450 | int      ftruncate(int, __off_t);
       |                         ^~~~~~~
       |                         _off_t
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:454:1: 
error: unknown type name '__off_t'; did you mean '_off_t'?
   454 | __off_t  lseek(int, __off_t, int);
       | ^~~~~~~
       | _off_t
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:454:21: 
error: unknown type name '__off_t'; did you mean '_off_t'?
   454 | __off_t  lseek(int, __off_t, int);
       |                     ^~~~~~~
       |                     _off_t
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:458:46: 
error: unknown type name '__off_t'; did you mean '_off_t'?
   458 | void    *mmap(void *, size_t, int, int, int, __off_t);
       |                                              ^~~~~~~
       |                                              _off_t
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:462:33: 
error: unknown type name '__off_t'; did you mean '_off_t'?
   462 | int      truncate(const char *, __off_t);
       |                                 ^~~~~~~
       |                                 _off_t
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:546:25: 
error: expected ';' before 'int'
   546 | __NULLABILITY_PRAGMA_POP
       |                         ^
       |                         ;


Regarding the first error it seems that __NULLABILITY_PRAGMA_PUSH is not 
defined in the headers of devel/arm-none-eabi-*. I managed to work the 
issue around by copying and pasting this from /usr/include/sys/cdefs.h 
at the end of /usr/local/arm-none-eabi/include/sys/cdefs.h
/*
  * Nullability qualifiers: currently only supported by Clang.
  */
#if !(defined(__clang__) && __has_feature(nullability))
#define _Nonnull
#define _Nullable
#define _Null_unspecified
#define __NULLABILITY_PRAGMA_PUSH
#define __NULLABILITY_PRAGMA_POP
#else
#define __NULLABILITY_PRAGMA_PUSH _Pragma("clang diagnostic push")      
\
         _Pragma("clang diagnostic ignored 
\"-Wnullability-completeness\"")
#define __NULLABILITY_PRAGMA_POP _Pragma("clang diagnostic pop")
#endif

But this workaround looks quite odd to me because, as the comment itself 
mentions, this is a clang only thing and we are on gcc, so maybe we 
shall instead remove all the __NULLABILITY_PRAGMA_PUSHes and 
__NULLABILITY_PRAGMA_POPs from the arm-none-eabi-* ports headers?


Regarding the typedef errors, I am unsure on how to proceed: for example 
__off_t is defined here 
/usr/local/arm-none-eabi/include/machine/types.h:19 typedef long int 
__off_t; but this header is not included by stdio.h.

If I force the inclusion, i.e.
#include <machine/types.h>
#include <stdio.h>
...

the corresponding error goes away, but the following errors remain:
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:80:9: 
error: unknown type name '__ssize_t'
    80 | typedef __ssize_t       ssize_t;
       |         ^~~~~~~~~
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:86:9: 
error: unknown type name '__off64_t'
    86 | typedef __off64_t       off64_t;
       |         ^~~~~~~~~
...
(others similar follow)

__ssize_t nor __off64_t are not typedef'd anywhere in 
/usr/local/arm-none-eabi (devel/arm-none-eabi-newlib) nor 
/usr/local/lib/gcc/arm-none-eabi/11.3.0 (devel/arm-none-eabi-gcc). They 
are typedef'd in default /usr/include/sys/_types.h which is not in the 
search path, so it seems that the arm-none-eabi-* ports are not self 
sufficient. Maybe there is a missing dependency?

Any suggestion?

BR,

-- 
José Pérez
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.