I have no idea what this is all about, but it works and Bruce hasn't
complained so it cannot be entirely bad :-) I include the email that probably explains it for people who already know: > >Compiling with -O3 inlines functions. However the function that is being > >inlined in makeinfo.c (add_word_args()) is a vararg function and must not be > >inlined. > > > >The code in question is K&R style, and AFIK, there is no way for the compiler > >to determine that the function uses vararg. Either change the code to use > >prototypes, or use stdarg, or add a directive to prevent inlining. > > Not declaring a varargs function as varargs before it is used gives > undefined behaviour. > > However, in practice the bug is probably in FreeBSD's <varargs.h>, which > doesn't use gcc's __builtin_next_arg(). gcc should notice that it is > used and not inline functions that have it. <stdarg.h.> uses it, but I > think there's another gcc builtin that it should be using. Patch attached. The ellipsis causes gcc to flag this as a varargs function, and the name "__builtin_va_alist" is special cased in gcc to hide the last argument in the arglist. Reviewed by: bde & phk Submitted by: jlemon@americantv.com (Jonathan Lemon)
This commit is contained in:
parent
9a969423ea
commit
b7a652ab84
@ -44,7 +44,12 @@
|
||||
|
||||
typedef char *va_list;
|
||||
|
||||
#define va_dcl int va_alist;
|
||||
#ifdef __GNUC__
|
||||
#define va_alist __builtin_va_alist
|
||||
#define va_dcl int va_alist; ...
|
||||
#else /* !__GNUC__ */
|
||||
#define va_dcl int va_alist;
|
||||
#endif
|
||||
|
||||
#define va_start(ap) \
|
||||
ap = (char *)&va_alist
|
||||
|
@ -44,7 +44,12 @@
|
||||
|
||||
typedef char *va_list;
|
||||
|
||||
#define va_dcl int va_alist;
|
||||
#ifdef __GNUC__
|
||||
#define va_alist __builtin_va_alist
|
||||
#define va_dcl int va_alist; ...
|
||||
#else /* !__GNUC__ */
|
||||
#define va_dcl int va_alist;
|
||||
#endif
|
||||
|
||||
#define va_start(ap) \
|
||||
ap = (char *)&va_alist
|
||||
|
Loading…
Reference in New Issue
Block a user