Commit 7e5bb3ce by Szabolcs Nagy

doc: Clarify __builtin_return_address [PR94891]

The expected semantics and valid usage of __builtin_return_address is
not clear since it exposes implementation internals that are normally
not meaningful to portable c code.

This documentation change tries to clarify the semantics in case the
return address is stored in a mangled form. This affects AArch64 when
pointer authentication is used for the return address signing (i.e.
-mbranch-protection=pac-ret).

2020-07-13  Szabolcs Nagy  <szabolcs.nagy@arm.com>

gcc/ChangeLog:

	PR target/94891
	* doc/extend.texi: Update the text for  __builtin_return_address.

(cherry picked from commit 6a391e06f953c3390b14020d8cacb6d55f81b2b9)
parent c24e8063
...@@ -11061,18 +11061,31 @@ The @var{level} argument must be a constant integer. ...@@ -11061,18 +11061,31 @@ The @var{level} argument must be a constant integer.
On some machines it may be impossible to determine the return address of On some machines it may be impossible to determine the return address of
any function other than the current one; in such cases, or when the top any function other than the current one; in such cases, or when the top
of the stack has been reached, this function returns @code{0} or a of the stack has been reached, this function returns an unspecified
random value. In addition, @code{__builtin_frame_address} may be used value. In addition, @code{__builtin_frame_address} may be used
to determine if the top of the stack has been reached. to determine if the top of the stack has been reached.
Additional post-processing of the returned value may be needed, see Additional post-processing of the returned value may be needed, see
@code{__builtin_extract_return_addr}. @code{__builtin_extract_return_addr}.
The stored representation of the return address in memory may be different
from the address returned by @code{__builtin_return_address}. For example,
on AArch64 the stored address may be mangled with return address signing
whereas the address returned by @code{__builtin_return_address} is not.
Calling this function with a nonzero argument can have unpredictable Calling this function with a nonzero argument can have unpredictable
effects, including crashing the calling program. As a result, calls effects, including crashing the calling program. As a result, calls
that are considered unsafe are diagnosed when the @option{-Wframe-address} that are considered unsafe are diagnosed when the @option{-Wframe-address}
option is in effect. Such calls should only be made in debugging option is in effect. Such calls should only be made in debugging
situations. situations.
On targets where code addresses are representable as @code{void *},
@smallexample
void *addr = __builtin_extract_return_addr (__builtin_return_address (0));
@end smallexample
gives the code address where the current function would return. For example,
such an address may be used with @code{dladdr} or other interfaces that work
with code addresses.
@end deftypefn @end deftypefn
@deftypefn {Built-in Function} {void *} __builtin_extract_return_addr (void *@var{addr}) @deftypefn {Built-in Function} {void *} __builtin_extract_return_addr (void *@var{addr})
......
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