Date: Thu, 7 Dec 1995 05:58:15 +1100 From: Bruce Evans <bde@zeta.org.au> To: bde@zeta.org.au, phk@critter.tfs.com Cc: current@freebsd.org, imb@scgt.oz.au, julian@ref.tfs.com, terry@lambert.org Subject: Re: changes in -current..TEST please Message-ID: <199512061858.FAA31752@godzilla.zeta.org.au>
next in thread | raw e-mail | index | archive | help
>> >If you used up to date source, you would know that the above macro now >> >looks like this: >> >> > #define MAKE_SET(set, sym, type) \ >> > static void *const __set_##set##_sym_##sym = \ >> > (&__set_##set##_sym_##sym, &sym, 0); \ >> > asm(".stabs \"_" #set "\", " #type ", 0, 0, _" #sym) >> >> >and that it (according to the gcc manual) ensures that the compiler will >> >not remove your static and "secretly" referenced Symbols. >> >> The macro only tells the compiler about `sym'. `type' is only referenced >> in the stab. >type isn't an endangered species I think... Oops. The manual only seems to say that the above stops the warning. gcc-2.7 has a better method: static void dummy_cleanup(void) __attribute__((__unused__)); This stops the warning but doesn't stop dummy_cleanup() going away with -O3 any better than MAKE_SET() (it goes away because it becomes static inline. static inlines _should_ go away). Why not initialize a pointer to the function? Then the function address _is_ used provided the pointer doesn't go away. Why does the comma expression end with an 0 anyway? The following seems to work right (except it wastes a pointer): static void (*const foo)(void) = dummy_cleanup; Bruce
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199512061858.FAA31752>