diff options
Diffstat (limited to 'gcc/doc')
-rw-r--r-- | gcc/doc/invoke.texi | 24 | ||||
-rw-r--r-- | gcc/doc/tm.texi | 18 | ||||
-rw-r--r-- | gcc/doc/tm.texi.in | 2 |
3 files changed, 43 insertions, 1 deletions
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 0241cb5..795ad1b 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -502,7 +502,7 @@ Objective-C and Objective-C++ Dialects}. -fverbose-asm -fpack-struct[=@var{n}] @gol -fleading-underscore -ftls-model=@var{model} @gol -fstack-reuse=@var{reuse_level} @gol --ftrapv -fwrapv @gol +-ftrampolines -ftrapv -fwrapv @gol -fvisibility=@r{[}default@r{|}internal@r{|}hidden@r{|}protected@r{]} @gol -fstrict-volatile-bitfields -fsync-libcalls} @@ -12067,6 +12067,28 @@ unit, or if @option{-fpic} is not given on the command line. The default without @option{-fpic} is @samp{initial-exec}; with @option{-fpic} the default is @samp{global-dynamic}. +@item -ftrampolines +@opindex ftrampolines +For targets that normally need trampolines for nested functions, always +generate them instead of using descriptors. Otherwise, for targets that +do not need them, like for example HP-PA or IA-64, do nothing. + +A trampoline is a small piece of code that is created at run time on the +stack when the address of a nested function is taken, and is used to call +the nested function indirectly. Therefore, it requires the stack to be +made executable in order for the program to work properly. + +@option{-fno-trampolines} is enabled by default on a language by language +basis to let the compiler avoid generating them, if it computes that this +is safe, and replace them with descriptors. Descriptors are made up of data +only, but the generated code must be prepared to deal with them. As of this +writing, @option{-fno-trampolines} is enabled by default only for Ada. + +Moreover, code compiled with @option{-ftrampolines} and code compiled with +@option{-fno-trampolines} are not binary compatible if nested functions are +present. This option must therefore be used on a program-wide basis and be +manipulated with extreme care. + @item -fvisibility=@r{[}default@r{|}internal@r{|}hidden@r{|}protected@r{]} @opindex fvisibility Set the default ELF image symbol visibility to the specified option---all diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi index a4a8e49..29dc73b 100644 --- a/gcc/doc/tm.texi +++ b/gcc/doc/tm.texi @@ -5245,6 +5245,24 @@ be returned; otherwise @var{addr} should be returned unchanged. If this hook is not defined, @var{addr} will be used for function calls. @end deftypefn +@deftypevr {Target Hook} int TARGET_CUSTOM_FUNCTION_DESCRIPTORS +This hook should be defined to a power of 2 if the target will benefit +from the use of custom descriptors for nested functions instead of the +standard trampolines. Such descriptors are created at run time on the +stack and made up of data only, but they are non-standard so the generated +code must be prepared to deal with them. This hook should be defined to 0 +if the target uses function descriptors for its standard calling sequence, +like for example HP-PA or IA-64. Using descriptors for nested functions +eliminates the need for trampolines that reside on the stack and require +it to be made executable. + +The value of the macro is used to parameterize the run-time identification +scheme implemented to distinguish descriptors from function addresses: it +gives the number of bytes by which their address is misaligned compared +with function addresses. The value of 1 will generally work, unless it is +already reserved by the target for another purpose, like for example on ARM. +@end deftypevr + Implementing trampolines is difficult on many machines because they have separate instruction and data caches. Writing into a stack location fails to clear the memory in the instruction cache, so when the program diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in index 265f1be..efcd741 100644 --- a/gcc/doc/tm.texi.in +++ b/gcc/doc/tm.texi.in @@ -3971,6 +3971,8 @@ is used for aligning trampolines. @hook TARGET_TRAMPOLINE_ADJUST_ADDRESS +@hook TARGET_CUSTOM_FUNCTION_DESCRIPTORS + Implementing trampolines is difficult on many machines because they have separate instruction and data caches. Writing into a stack location fails to clear the memory in the instruction cache, so when the program |