[gcc(refs/vendors/ibm/heads/gcc-9-branch)] doc: Clarify __builtin_return_address [PR94891]

Peter Bergner bergner@gcc.gnu.org
Fri Sep 4 19:23:54 GMT 2020


https://gcc.gnu.org/g:a6a2935076b192109171310db5159183e5ab059b

commit a6a2935076b192109171310db5159183e5ab059b
Author: Szabolcs Nagy <szabolcs.nagy@arm.com>
Date:   Thu May 28 10:28:30 2020 +0100

    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)

Diff:
---
 gcc/doc/extend.texi | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
index a581e9d959b..7dbe400f99e 100644
--- a/gcc/doc/extend.texi
+++ b/gcc/doc/extend.texi
@@ -10920,18 +10920,31 @@ The @var{level} argument must be a constant integer.
 
 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
-of the stack has been reached, this function returns @code{0} or a
-random value.  In addition, @code{__builtin_frame_address} may be used
+of the stack has been reached, this function returns an unspecified
+value.  In addition, @code{__builtin_frame_address} may be used
 to determine if the top of the stack has been reached.
 
 Additional post-processing of the returned value may be needed, see
 @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
 effects, including crashing the calling program.  As a result, calls
 that are considered unsafe are diagnosed when the @option{-Wframe-address}
 option is in effect.  Such calls should only be made in debugging
 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
 
 @deftypefn {Built-in Function} {void *} __builtin_extract_return_addr (void *@var{addr})


More information about the Gcc-cvs mailing list