about function attributes for functions returning a pointer
Ian Lance Taylor
iant@google.com
Mon Oct 4 18:24:00 GMT 2010
Uwe Kleine-König <u.kleine-koenig@pengutronix.de> writes:
> in the linux kernel I defined a function as follows:
>
> static struct platform_device *__init __maybe_unused imx_add_imx_dma(void)
> {
> ...
> }
>
> and the only used was #ifdefed out.
>
> With the following defines:
>
> #define __section(S) __attribute__ ((__section__(#S)))
> #define __cold __attribute__((__cold__))
> #define notrace __attribute__((no_instrument_function))
> #define __init __section(.init.text) __cold notrace
> #define __maybe_unused __attribute__((unused))
>
> this still generated the "defined but unused" warning.
>
> Then after changing the definition to
>
> static struct platform_device __init __maybe_unused *imx_add_imx_dma(void)
>
> (i.e. move the * after the attribute stuff) the warning is gone. In
> both cases (and when the function was used) it is put in the
> ".init.text" section though. That is in the first case __init worked,
> but __maybe_unused did not. Is this intended? Do I something wrong?
> What is the most correct position for function attributes for functions
> returning a pointer?
>
> (I'm using gcc 4.3.2 for arm, OSELAS.Toolchain-1.99.3.6 here. Could not
> reproduce with Debian's gcc 4.4.5 for x86 using a minimal example.)
This message is not appropriate for the mailing list gcc@gcc.gnu.org.
It would be appropriate for gcc-help@gcc.gnu.org. Please take any
followups to gcc-help. Thanks.
The syntax for attributes is documented at
http://gcc.gnu.org/onlinedocs/gcc-4.5.1/gcc/Attribute-Syntax.html .
I think the differences you are seeing are because some attributes can
apply to types and some can only apply to declarations. Moving the
location of the __attribute__ affects which type it applies to. In
particular __attribute__ ((unused)) may be used with a type, but
__attribute__ ((section (...))) may only be used with a declaration.
Ian
More information about the Gcc
mailing list