On Sun, 2 Mar 2014, Ian Lepore wrote:

Log:
 Add __attribute__((used)) so that the delay implementation doesn't get
 optimized away as unreferenced, causing linker errors when trying to
 resolve the weak reference to the missing function.

Why not use the standard FreeBSD macro __used?  Hard-coded
__attribute__(())s are not only unportable; they are gross style bugs.
They were all replaced by FreeBSD macros in old versions of FreeBSD.

Modified: head/sys/arm/arm/mpcore_timer.c
==============================================================================
--- head/sys/arm/arm/mpcore_timer.c     Sun Mar  2 19:46:03 2014        
(r262695)
+++ head/sys/arm/arm/mpcore_timer.c     Sun Mar  2 21:25:32 2014        
(r262696)
@@ -370,6 +370,7 @@ DRIVER_MODULE(mp_tmr, simplebus, arm_tmr
 *      nothing
 */
static void
+__attribute__((used)) /* Must emit function code for the weak ref below. */
arm_tmr_DELAY(int usec)
{
        int32_t counts_per_usec;

The bug was really in the weak reference macro.  It is hard-coded in the
same unportable asm for all arches and compilers (so the unportable gccism's
in it are much larger than for __attribute__(())).  Thus the compiler cannot
see it.  It is missing C parts that declare the referred-to identifier as
__used.

The __weak_reference() macro has dubious support for __STDC__ (it doesn't
really suoport !__STDC__, but only cpp -traditional).

Some macros in sys/cdefs.h has been broken to pretend to support lint.
This actually breaks lint, by defining away the macros so that lint
can't detect their unportabilities.  One of these is __unused.  But the
support for lint is so broken that __unused is not one of these.  Neither
is __weak_reference() or __attribute__().  The last is intentional.  All
of the simpler macros like __used and __unused are just aliases for
__attribute__(()).  These should be defined away for lint if and only if
they are just optimization hints or other hints not related to the
correctness of the program, e.g., __pure2.  The others, and __attribute__()
itself, should be left undefined so that lint barfs on them if they are
are ever used.

lint has a -g flag that supports some gcc extensions.  These don't include
__attribute__(), so -g was almost useless in practice in 1993.  It is more
useless now.  lint even has a hint about unconditionally defining away
__attribute__().  It has a line of source to do this, but this line is
ifdefed out in FreeBSD.

Bruce
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to