Re: poudriere-devel-3.3.99.20211015 fails to build in my aarch64&armv7 environments (built on amd64 just fine)

From: Bryan Drewery <bdrewery_at_FreeBSD.org>
Date: Mon, 18 Oct 2021 02:53:25 UTC
On 10/17/2021 3:45 PM, Bryan Drewery wrote:
> On 10/17/2021 3:06 PM, Mark Millard wrote:
>> On 2021-Oct-17, at 11:19, Mark Millard <marklmi@yahoo.com> wrote:
>>
>>> On 2021-Oct-16, at 23:41, Mark Millard <marklmi at yahoo.com> wrote:
>>>
>>> On 2021-Oct-16, at 19:20, Mark Millard via freebsd-toolchain 
>>> <freebsd-toolchain@freebsd.org> wrote:
>>>>
>>>>
>>>>> [00:00:45] [06] [00:00:18] Saving ports-mgmt/poudriere-devel | 
>>>>> poudriere-devel-3.3.99.20211015 wrkdir
>>>>> [00:00:49] [06] [00:00:22] Saved ports-mgmt/poudriere-devel | 
>>>>> poudriere-devel-3.3.99.20211015 wrkdir to: 
>>>>> /usr/local/poudriere/data/wrkdirs/13_0R-CA72-default/default/poudriere-devel-3.3.99.20211015.tbz 
>>>>>
>>>>>
>>>>> Log:
>>>>>
>>>>> . . .
>>>>> --- src/libexec/poudriere/pwait/sh-pwait.o ---
>>>>> cc -DHAVE_CONFIG_H -I. -I./src   -mcpu=cortex-a72 -Wall -pipe -O2   
>>>>> -Wno-extra -DSHELL -std=gnu99 -DVTABSIZE=1000  -DNO_HISTORY 
>>>>> -Wno-unused-const-variable -include  ./external/sh_compat/compat.h 
>>>>> -I./s
>>>>> rc  -I./external/sh -I./src/poudriere-sh  -I./src/poudriere-sh -O2 
>>>>> -pipe -mcpu=cortex-a72  -g -fstack-protector-strong 
>>>>> -fno-strict-aliasing -MT src/libexec/poudriere/pwait/sh-pwait.o -MD 
>>>>> -MP -MF src/l
>>>>> ibexec/poudriere/pwait/.deps/sh-pwait.Tpo -c -o 
>>>>> src/libexec/poudriere/pwait/sh-pwait.o `test -f 
>>>>> 'src/libexec/poudriere/pwait/pwait.c' || echo 
>>>>> './'`src/libexec/poudriere/pwait/pwait.c
>>>>> . . .
>>>>> --- src/libexec/poudriere/pwait/sh-pwait.o ---
>>>>> src/libexec/poudriere/pwait/pwait.c:62:2: error: passing 'void *' 
>>>>> to parameter of incompatible type 'va_list' (aka '__builtin_va_list')
>>>>>       exit(EX_USAGE);
>>>>>       ^~~~~~~~~~~~~~
>>>>> ./src/poudriere-sh/helpers.h:106:20: note: expanded from macro 'exit'
>>>>> #define exit(...)               exit_(_, ##__VA_ARGS__)
>>>>>                               ^~~~~~~~~~~~~~~~~~~~~~~
>>>>> ./src/poudriere-sh/helpers.h:107:21: note: expanded from macro 'exit_'
>>>>> #define exit_(...)              exit_X(__VA_ARGS__, _1, 
>>>>> _0)(__VA_ARGS__)
>>>>>                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>>>> ./src/poudriere-sh/helpers.h:108:32: note: expanded from macro 
>>>>> 'exit_X'
>>>>> #define exit_X(_0, _1, X, ...)  exit ## X
>>>>>                               ^
>>>>> <scratch space>:40:1: note: expanded from here
>>>>> exit_1
>>>>> ^
>>>>> ./src/poudriere-sh/helpers.h:110:58: note: expanded from macro 
>>>>> 'exit_1'
>>>>> #define exit_1(_, status)       verrorwithstatus(status, NULL, NULL)
>>>>>                                                              ^~~~
>>>>> /usr/include/sys/_null.h:34:14: note: expanded from macro 'NULL'
>>>>> #define NULL    ((void *)0)
>>>>>               ^~~~~~~~~~~
>>>>> ./src/poudriere-sh/helpers.h:104:49: note: passing argument to 
>>>>> parameter here
>>>>> void verrorwithstatus(int, const char *, va_list) __printf0like(2, 
>>>>> 0) __dead2;
>>>>>                                               ^
>>>>> src/libexec/poudriere/pwait/pwait.c:205:5: error: passing 'void *' 
>>>>> to parameter of incompatible type 'va_list' (aka '__builtin_va_list')
>>>>>                               exit(EX_OK);
>>>>>                               ^~~~~~~~~~~
>>>>> ./src/poudriere-sh/helpers.h:106:20: note: expanded from macro 'exit'
>>>>> #define exit(...)               exit_(_, ##__VA_ARGS__)
>>>>>                               ^~~~~~~~~~~~~~~~~~~~~~~
>>>>> ./src/poudriere-sh/helpers.h:107:21: note: expanded from macro 'exit_'
>>>>> #define exit_(...)              exit_X(__VA_ARGS__, _1, 
>>>>> _0)(__VA_ARGS__)
>>>>>                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>>>> ./src/poudriere-sh/helpers.h:108:32: note: expanded from macro 
>>>>> 'exit_X'
>>>>> #define exit_X(_0, _1, X, ...)  exit ## X
>>>>>                               ^
>>>>> <scratch space>:41:1: note: expanded from here
>>>>> exit_1
>>>>> ^
>>>>> ./src/poudriere-sh/helpers.h:110:58: note: expanded from macro 
>>>>> 'exit_1'
>>>>> #define exit_1(_, status)       verrorwithstatus(status, NULL, NULL)
>>>>>                                                              ^~~~
>>>>> /usr/include/sys/_null.h:34:14: note: expanded from macro 'NULL'
>>>>> #define NULL    ((void *)0)
>>>>>               ^~~~~~~~~~~
>>>>> ./src/poudriere-sh/helpers.h:104:49: note: passing argument to 
>>>>> parameter here
>>>>> void verrorwithstatus(int, const char *, va_list) __printf0like(2, 
>>>>> 0) __dead2;
>>>>>                                               ^
>>>>> src/libexec/poudriere/pwait/pwait.c:275:5: error: passing 'void *' 
>>>>> to parameter of incompatible type 'va_list' (aka '__builtin_va_list')
>>>>>                               exit(124);
>>>>>                               ^~~~~~~~~
>>>>> ./src/poudriere-sh/helpers.h:106:20: note: expanded from macro 'exit'
>>>>> #define exit(...)               exit_(_, ##__VA_ARGS__)
>>>>>                               ^~~~~~~~~~~~~~~~~~~~~~~
>>>>> ./src/poudriere-sh/helpers.h:107:21: note: expanded from macro 'exit_'
>>>>> #define exit_(...)              exit_X(__VA_ARGS__, _1, 
>>>>> _0)(__VA_ARGS__)
>>>>>                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>>>> ./src/poudriere-sh/helpers.h:108:32: note: expanded from macro 
>>>>> 'exit_X'
>>>>> #define exit_X(_0, _1, X, ...)  exit ## X
>>>>>                               ^
>>>>> <scratch space>:42:1: note: expanded from here
>>>>> exit_1
>>>>> ^
>>>>> ./src/poudriere-sh/helpers.h:110:58: note: expanded from macro 
>>>>> 'exit_1'
>>>>> #define exit_1(_, status)       verrorwithstatus(status, NULL, NULL)
>>>>>                                                              ^~~~
>>>>> /usr/include/sys/_null.h:34:14: note: expanded from macro 'NULL'
>>>>> #define NULL    ((void *)0)
>>>>>               ^~~~~~~~~~~
>>>>> ./src/poudriere-sh/helpers.h:104:49: note: passing argument to 
>>>>> parameter here
>>>>> void verrorwithstatus(int, const char *, va_list) __printf0like(2, 
>>>>> 0) __dead2;
>>>>>                                               ^
>>>>> src/libexec/poudriere/pwait/pwait.c:303:5: error: passing 'void *' 
>>>>> to parameter of incompatible type 'va_list' (aka '__builtin_va_list')
>>>>>                               exit(EX_OK);
>>>>>                               ^~~~~~~~~~~
>>>>> ./src/poudriere-sh/helpers.h:106:20: note: expanded from macro 'exit'
>>>>> #define exit(...)               exit_(_, ##__VA_ARGS__)
>>>>>                               ^~~~~~~~~~~~~~~~~~~~~~~
>>>>> ./src/poudriere-sh/helpers.h:107:21: note: expanded from macro 'exit_'
>>>>> #define exit_(...)              exit_X(__VA_ARGS__, _1, 
>>>>> _0)(__VA_ARGS__)
>>>>>                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>>>> ./src/poudriere-sh/helpers.h:108:32: note: expanded from macro 
>>>>> 'exit_X'
>>>>> #define exit_X(_0, _1, X, ...)  exit ## X
>>>>>                               ^
>>>>> <scratch space>:43:1: note: expanded from here
>>>>> exit_1
>>>>> ^
>>>>> ./src/poudriere-sh/helpers.h:110:58: note: expanded from macro 
>>>>> 'exit_1'
>>>>> #define exit_1(_, status)       verrorwithstatus(status, NULL, NULL)
>>>>>                                                              ^~~~
>>>>> /usr/include/sys/_null.h:34:14: note: expanded from macro 'NULL'
>>>>> #define NULL    ((void *)0)
>>>>>               ^~~~~~~~~~~
>>>>> ./src/poudriere-sh/helpers.h:104:49: note: passing argument to 
>>>>> parameter here
>>>>> void verrorwithstatus(int, const char *, va_list) __printf0like(2, 
>>>>> 0) __dead2;
>>>>>                                               ^
>>>>> src/libexec/poudriere/pwait/pwait.c:319:2: error: passing 'void *' 
>>>>> to parameter of incompatible type 'va_list' (aka '__builtin_va_list')
>>>>>       exit(EX_OK);
>>>>>       ^~~~~~~~~~~
>>>>> ./src/poudriere-sh/helpers.h:106:20: note: expanded from macro 'exit'
>>>>> #define exit(...)               exit_(_, ##__VA_ARGS__)
>>>>>                               ^~~~~~~~~~~~~~~~~~~~~~~
>>>>> ./src/poudriere-sh/helpers.h:107:21: note: expanded from macro 'exit_'
>>>>> #define exit_(...)              exit_X(__VA_ARGS__, _1, 
>>>>> _0)(__VA_ARGS__)
>>>>>                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>>>> ./src/poudriere-sh/helpers.h:108:32: note: expanded from macro 
>>>>> 'exit_X'
>>>>> #define exit_X(_0, _1, X, ...)  exit ## X
>>>>>                               ^
>>>>> <scratch space>:44:1: note: expanded from here
>>>>> exit_1
>>>>> ^
>>>>> ./src/poudriere-sh/helpers.h:110:58: note: expanded from macro 
>>>>> 'exit_1'
>>>>> #define exit_1(_, status)       verrorwithstatus(status, NULL, NULL)
>>>>>                                                              ^~~~
>>>>> . . .
>>>>>
>>>>>
>>>>> --- src/poudriere-sh/sh-mkdir.o ---
>>>>> cc -DHAVE_CONFIG_H -I. -I./src   -mcpu=cortex-a72 -Wall -pipe -O2   
>>>>> -Wno-extra -DSHELL -std=gnu99 -DVTABSIZE=1000  -DNO_HISTORY 
>>>>> -Wno-unused-const-variable -include  ./external/sh_compat/compat.h 
>>>>> -I./src  -I./external/sh -I./src/poudriere-sh  -I./src/poudriere-sh 
>>>>> -O2 -pipe -mcpu=cortex-a72  -g -fstack-protector-strong 
>>>>> -fno-strict-aliasing -MT src/poudriere-sh/sh-mkdir.o -MD -MP -MF 
>>>>> src/poudriere-sh/.deps/sh-mkdir.Tpo -c -o 
>>>>> src/poudriere-sh/sh-mkdir.o `test -f 'src/poudriere-sh/mkdir.c' || 
>>>>> echo './'`src/poudriere-sh/mkdir.c
>>>>> . . .
>>>>> --- src/poudriere-sh/sh-mkdir.o ---
>>>>> src/poudriere-sh/mkdir.c:139:2: error: passing 'void *' to 
>>>>> parameter of incompatible type 'va_list' (aka '__builtin_va_list')
>>>>>       exit(exitval);
>>>>>       ^~~~~~~~~~~~~
>>>>> ./src/poudriere-sh/helpers.h:106:20: note: expanded from macro 'exit'
>>>>> #define exit(...)               exit_(_, ##__VA_ARGS__)
>>>>>                               ^~~~~~~~~~~~~~~~~~~~~~~
>>>>> ./src/poudriere-sh/helpers.h:107:21: note: expanded from macro 'exit_'
>>>>> #define exit_(...)              exit_X(__VA_ARGS__, _1, 
>>>>> _0)(__VA_ARGS__)
>>>>>                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>>>> ./src/poudriere-sh/helpers.h:108:32: note: expanded from macro 
>>>>> 'exit_X'
>>>>> #define exit_X(_0, _1, X, ...)  exit ## X
>>>>>                               ^
>>>>> <scratch space>:46:1: note: expanded from here
>>>>> exit_1
>>>>> ^
>>>>> ./src/poudriere-sh/helpers.h:110:58: note: expanded from macro 
>>>>> 'exit_1'
>>>>> #define exit_1(_, status)       verrorwithstatus(status, NULL, NULL)
>>>>>                                                              ^~~~
>>>>> /usr/include/sys/_null.h:34:14: note: expanded from macro 'NULL'
>>>>> #define NULL    ((void *)0)
>>>>>               ^~~~~~~~~~~
>>>>> ./src/poudriere-sh/helpers.h:104:49: note: passing argument to 
>>>>> parameter here
>>>>> void verrorwithstatus(int, const char *, va_list) __printf0like(2, 
>>>>> 0) __dead2;
>>>>>                                               ^
>>>>> src/poudriere-sh/mkdir.c:226:2: error: passing 'void *' to 
>>>>> parameter of incompatible type 'va_list' (aka '__builtin_va_list')
>>>>>       exit (EX_USAGE);
>>>>>       ^~~~~~~~~~~~~~~
>>>>> ./src/poudriere-sh/helpers.h:106:20: note: expanded from macro 'exit'
>>>>> #define exit(...)               exit_(_, ##__VA_ARGS__)
>>>>>                               ^~~~~~~~~~~~~~~~~~~~~~~
>>>>> ./src/poudriere-sh/helpers.h:107:21: note: expanded from macro 'exit_'
>>>>> #define exit_(...)              exit_X(__VA_ARGS__, _1, 
>>>>> _0)(__VA_ARGS__)
>>>>>                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>>>> ./src/poudriere-sh/helpers.h:108:32: note: expanded from macro 
>>>>> 'exit_X'
>>>>> #define exit_X(_0, _1, X, ...)  exit ## X
>>>>>                               ^
>>>>> <scratch space>:47:1: note: expanded from here
>>>>> exit_1
>>>>> . . .
>>>>>
>>>>> I'll not list the rest.
>>>>
>>>> I'll note that https://developer.arm.com/documentation/ihi0055/d/ 
>>>> reports
>>>> that va_list is based on:
>>>>
>>>> struct __va_list {
>>>> void *__stack;
>>>>   void *__gr_top;
>>>>   void *__vr_top;
>>>>   int   __gr_offs;
>>>>   int   __vr_offs;
>>>> }
>>>>
>>>> so NULL is not type compatible for aarch64.
>>>>
>>>> My guess is an empty va_list needs to be created and used
>>>> instead of NULL, following the normal va_list protocol. This
>>>> should avoid presumptions about aspects that the language
>>>> standard does not specify.
>>>>
>>>
>>>
>>> My armv7 contexts fail similarly.
>>>
>>> https://developer.arm.com/documentation/ihi0042/latest
>>>
>>> indicates that the va_list typedef is for:
>>>
>>> struct __va_list {void *__ap;}
>>>
>>> So, again, NULL it not type compatible.
>>>
>>
>> [Bryan has seen a variation of this material via comments
>> on github.]
>>
>> poudriere-devel was later updated to avoid the type compatibility.
>> But the update does not follow the va_list protocol in that it
>> does initialization of a va_list via ={} to supposedly form an
>> empty va_list. The ={} is not guaranteed by the language (C99+,
>> say) to assign the same va_list content as va_start would for an
>> empty match to a routine's ... in its parameter list.
>>
>> It looks to be that va_start is the only langauge-definition
>> supported form of initialization of a va_list (and that va_end
>> is required to close out such an initialized va_list).
>>
>> So the likes of:
>>
>> git: 14e5e1370ddb - main - ports-mgmt/poudriere-devel: Update to 
>> 3.3.0-1020-g59a87677c Bryan Drewery
>> and:
>> git: 4116dc2f1f63 - main - ports-mgmt/poudriere-devel: Update to 
>> 3.3.0-1022-g964cf327f Bryan Drewery
>>
>> may not prove sufficient in general, although it may well "work"
>> for amd64 where NULL happened to be compatible with va_list
>> as far as types go. I do not claim a known operational failure
>> elsewhere, just going outside what the langauge guarantees for
>> source code to be guaranteed work for a correct language
>> implementation.
>>
> 
> If it builds I don't think it will matter beyond that. The va_list is 
> only used if the msg param is non-NULL, which it always is in this case.
> 

I mean it is always _NULL_ in this case so not a problem.

> See external/sh/error.c verrorwithstatus().
> 


-- 
Bryan Drewery