Commit b2de4950 by Carlos O'Donell Committed by Carlos O'Donell

Cleanup and expand on the 'leaf' function attribute documentation.

Describe the problems that a user might face with indirect functions
and ELF symbol interposition.

gcc/ChangeLog:

2016-03-16  Carlos O'Donell  <carlos@redhat.com>
	    Sandra Loosemore  <sandra@codesourcery.com>

	* doc/extend.texi (Common Function Attributes): Describe ifunc impact
	on leaf attribute. Mention ELF interposition problems.


Co-Authored-By: Sandra Loosemore <sandra@codesourcery.com>

From-SVN: r234247
parent ab1caa6e
2016-03-16 Carlos O'Donell <carlos@redhat.com>
Sandra Loosemore <sandra@codesourcery.com>
* doc/extend.texi (Common Function Attributes): Describe ifunc impact
on leaf attribute. Mention ELF interposition problems.
2016-03-16 Alan Modra <amodra@gmail.com> 2016-03-16 Alan Modra <amodra@gmail.com>
PR rtl-optimization/69195 PR rtl-optimization/69195
......
...@@ -2772,29 +2772,40 @@ refer to the following subsections for details. ...@@ -2772,29 +2772,40 @@ refer to the following subsections for details.
@item leaf @item leaf
@cindex @code{leaf} function attribute @cindex @code{leaf} function attribute
Calls to external functions with this attribute must return to the current Calls to external functions with this attribute must return to the
compilation unit only by return or by exception handling. In particular, leaf current compilation unit only by return or by exception handling. In
functions are not allowed to call callback function passed to it from the current particular, a leaf function is not allowed to invoke callback functions
compilation unit or directly call functions exported by the unit or longjmp passed to it from the current compilation unit, directly call functions
into the unit. Leaf function might still call functions from other compilation exported by the unit, or @code{longjmp} into the unit. Leaf functions
units and thus they are not necessarily leaf in the sense that they contain no might still call functions from other compilation units and thus they
function calls at all. are not necessarily leaf in the sense that they contain no function
calls at all.
The attribute is intended for library functions to improve dataflow analysis.
The compiler takes the hint that any data not escaping the current compilation unit can The attribute is intended for library functions to improve dataflow
not be used or modified by the leaf function. For example, the @code{sin} function analysis. The compiler takes the hint that any data not escaping the
is a leaf function, but @code{qsort} is not. current compilation unit cannot be used or modified by the leaf
function. For example, the @code{sin} function is a leaf function, but
Note that leaf functions might invoke signals and signal handlers might be @code{qsort} is not.
defined in the current compilation unit and use static variables. The only
compliant way to write such a signal handler is to declare such variables Note that leaf functions might indirectly run a signal handler defined
@code{volatile}. in the current compilation unit that uses static variables. Similarly,
when lazy symbol resolution is in effect, leaf functions might invoke
The attribute has no effect on functions defined within the current compilation indirect functions whose resolver function or implementation function is
unit. This is to allow easy merging of multiple compilation units into one, defined in the current compilation unit and uses static variables. There
for example, by using the link-time optimization. For this reason the is no standard-compliant way to write such a signal handler, resolver
attribute is not allowed on types to annotate indirect calls. function, or implementation function, and the best that you can do is to
remove the @code{leaf} attribute or mark all such static variables
@code{volatile}. Lastly, for ELF-based systems that support symbol
interposition, care should be taken that functions defined in the
current compilation unit do not unexpectedly interpose other symbols
based on the defined standards mode and defined feature test macros;
otherwise an inadvertent callback would be added.
The attribute has no effect on functions defined within the current
compilation unit. This is to allow easy merging of multiple compilation
units into one, for example, by using the link-time optimization. For
this reason the attribute is not allowed on types to annotate indirect
calls.
@item malloc @item malloc
@cindex @code{malloc} function attribute @cindex @code{malloc} function attribute
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment