Re: Build failure due to block_abi.h

From: David Chisnall <theraven_at_FreeBSD.org>
Date: Sat, 5 Apr 2014 00:13:05 +0100
It turns out that tomorrow happened 12 minutes after this email...

The attached diff lets it build with -Werror for me with FreeBSD clang and gcc (with -fblocks and -fno-blocks) and with ports gcc 4.7.3 and doesn't clutter the code.  Please can you test it with Juniper's gcc?

David

Index: stdlib/atexit.c
===================================================================
--- stdlib/atexit.c	(revision 264068)
+++ stdlib/atexit.c	(working copy)
_at__at_ -80,6 +80,7 _at__at_
 };
 
 static struct atexit *__atexit;		/* points to head of LIFO stack */
+typedef DECLARE_BLOCK(void, atexit_block, void);
 
 /*
  * Register the function described by 'fptr' to be called at application
_at__at_ -141,7 +142,7 _at__at_
  * Register a block to be performed at exit.
  */
 int
-atexit_b(DECLARE_BLOCK(void, func, void))
+atexit_b(atexit_block func)
 {
 	struct atexit_fn fn;
 	int error;
Index: stdlib/heapsort.c
===================================================================
--- stdlib/heapsort.c	(revision 264068)
+++ stdlib/heapsort.c	(working copy)
_at__at_ -45,6 +45,7 _at__at_
 #ifdef I_AM_HEAPSORT_B
 #include "block_abi.h"
 #define COMPAR(x, y) CALL_BLOCK(compar, x, y)
+typedef DECLARE_BLOCK(int, heapsort_block, const void *, const void *);
 #else
 #define COMPAR(x, y) compar(x, y)
 #endif
_at__at_ -149,7 +150,7 _at__at_
 heapsort_b(vbase, nmemb, size, compar)
 	void *vbase;
 	size_t nmemb, size;
-	DECLARE_BLOCK(int, compar, const void *, const void *);
+	heapsort_block compar;
 #else
 int
 heapsort(vbase, nmemb, size, compar)
Index: stdlib/qsort_r.c
===================================================================
--- stdlib/qsort_r.c	(revision 264068)
+++ stdlib/qsort_r.c	(working copy)
_at__at_ -8,9 +8,10 _at__at_
 #define I_AM_QSORT_R
 #include "qsort.c"
 
+typedef DECLARE_BLOCK(int, qsort_block, const void *, const void *);
+
 void
-qsort_b(void *base, size_t nel, size_t width,
-	DECLARE_BLOCK(int, compar, const void *, const void *))
+qsort_b(void *base, size_t nel, size_t width, qsort_block compar)
 {
 	qsort_r(base, nel, width, compar,
 		(int (*)(void *, const void *, const void *))


On 4 Apr 2014, at 23:48, David Chisnall <theraven_at_FreeBSD.org> wrote:

> Hi Marcel,
> 
> This error is a warning for me with gcc 4.7.3 when I try.  With 4.2.1 in the tree, it appears to be silenced by something (or possibly we're using the native blocks code path with gcc and clang doesn't emit that warning in non-blocks mode).  We could pull out the structure definitions - this is what I've done in the GNUstep versions of these macros, which provide separate macros for declaring the type.  It will clutter the code a bit, but if it's not possible to silence the warnings with your compiler then I can make that change.
> 
> Unfortunately, the warning actually is spurious here - the structure really is expected to be only for the scope of the function, because any compiler that can actually generate those structure in a useful way will give the type a different internal name.  
> 
> I'll try to send you a patch to test tomorrow - in the meantime, removing the -Werror should make it build.  Unfortunately, gcc (especially 4.2) doesn't provide very fine-grained control over warnings and it doesn't seem to be possible (or, at least, not documented) to disable the ones that are part of their default set.  
> 
> David
> 
> On 4 Apr 2014, at 18:42, Marcel Moolenaar <marcel_at_xcllnt.net> wrote:
> 
>> David,
>> 
>> The definition of DECLARE_BLOCK seems to trip over GCC 4.2.1 here
>> at Juniper. This is how we run the compiler:
>> 
>> /volume/fwtools/gcc/jnpr/4.2.1/amd64-juniper-junos.5/bin/amd64-juniper-junos-gcc  -O2 -pipe   -I/b/marcelm/fbsd-head/src/lib/libc/include -I/b/marcelm/fbsd-head/src/lib/libc/../../include -I/b/marcelm/fbsd-head/src/lib/libc/amd64 -DNLS  -D__DBINTERFACE_PRIVATE -I/b/marcelm/fbsd-head/src/lib/libc/../../contrib/gdtoa -I/b/marcelm/fbsd-head/src/lib/libc/../../contrib/libc-vis -DINET6 -I/b/marcelm/fbsd-head/obj/amd64/lib/libc -I/b/marcelm/fbsd-head/src/lib/libc/resolv -D_ACL_PRIVATE -DPOSIX_MISTAKE -I/b/marcelm/fbsd-head/src/lib/libc/../../contrib/jemalloc/include -I/b/marcelm/fbsd-head/src/lib/libc/../../contrib/tzcode/stdtime -I/b/marcelm/fbsd-head/src/lib/libc/stdtime  -I/b/marcelm/fbsd-head/src/lib/libc/locale -DBROKEN_DES -DPORTMAP -DDES_BUILTIN -I/b/marcelm/fbsd-head/src/lib/libc/rpc -DNS_CACHING -DSYMBOL_VERSIONING -D__ELF__  -Dunix  -D__unix  -D__unix__    -D__FreeBSD__=9  --sysroot /volume/sisyphus/occam/sysroot/projects_tp5/20131031.611483/amd64  -fno-builtin-printf   -g -nos
> tdinc -isystem/b/marcelm/fbsd-head/obj/stage/amd64/usr/include -isystem/b/marcelm/fbsd-head/obj/stage/amd64/include  -std=gnu99  -Wsystem-headers -Werror -Wall -Wno-format-y2k -Wno-uninitialized -Wno-pointer-sign -I/b/marcelm/fbsd-head/src/lib/libutil -I/b/marcelm/fbsd-head/src/lib/msun/src -I/b/marcelm/fbsd-head/src/lib/msun/x86 -c /b/marcelm/fbsd-head/src/lib/libc/stdlib/atexit.c -o atexit.o
>> whatever set of flags we use here at Juniper:
>> 
>> This is the error:
>> 
>> Building /b/marcelm/fbsd-head/obj/amd64/lib/libc/atexit.o
>> cc1: warnings being treated as errors
>> /b/marcelm/fbsd-head/src/lib/libc/stdlib/atexit.c:144: warning: anonymous struct declared inside parameter list
>> /b/marcelm/fbsd-head/src/lib/libc/stdlib/atexit.c:144: warning: its scope is only this definition or declaration, which is probably not what you want
>> *** Error code 1
>> 
>> This hurdle is a bit higher than the hurdles I normally run into
>> when syncing with ^/head, so I could use your expertise.
>> 
>> We need to continue to be able to build the sources with compilers
>> outside of the tree as much as possible and I haven't found a way
>> yet (one I don't dislike to be precise) to get this blocks stuff
>> to compile. It's a huge blocker right now.
>> 
>> Thanks,
>> 
>> -- 
>> Marcel Moolenaar
>> marcel_at_xcllnt.net
>> 
>> 
> 
> _______________________________________________
> freebsd-current_at_freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-current
> To unsubscribe, send any mail to "freebsd-current-unsubscribe_at_freebsd.org"
Received on Fri Apr 04 2014 - 21:13:15 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:40:48 UTC