calls.c (prepare_call_address): Transform PLT call to GOT lookup and indirect call by forcing address into a...

* calls.c (prepare_call_address): Transform PLT call to GOT lookup and
	indirect call by forcing address into a pseudo with -fno-plt.
	* common.opt (flag_plt): New option.
	* doc/invoke.texi (Code Generation Options): Add -fno-plt.
	([-fno-plt]): Document.

From-SVN: r223003
This commit is contained in:
Alexander Monakov 2015-05-11 16:20:57 +03:00 committed by Alexander Monakov
parent 9e4b3dd6bc
commit b91fd3c76a
4 changed files with 29 additions and 1 deletions

View File

@ -1,3 +1,11 @@
2015-05-11 Alexander Monakov <amonakov@ispras.ru>
* calls.c (prepare_call_address): Transform PLT call to GOT lookup and
indirect call by forcing address into a pseudo with -fno-plt.
* common.opt (flag_plt): New option.
* doc/invoke.texi (Code Generation Options): Add -fno-plt.
([-fno-plt]): Document.
2015-05-11 Markus Trippelsdorf <markus@trippelsdorf.de>
PR bootstrap/66105

View File

@ -225,6 +225,12 @@ prepare_call_address (tree fndecl_or_type, rtx funexp, rtx static_chain_value,
&& targetm.small_register_classes_for_mode_p (FUNCTION_MODE))
? force_not_mem (memory_address (FUNCTION_MODE, funexp))
: memory_address (FUNCTION_MODE, funexp));
else if (flag_pic && !flag_plt && fndecl_or_type
&& TREE_CODE (fndecl_or_type) == FUNCTION_DECL
&& !targetm.binds_local_p (fndecl_or_type))
{
funexp = force_reg (Pmode, funexp);
}
else if (! sibcallp)
{
if (!NO_FUNCTION_CSE && optimize && ! flag_no_function_cse)

View File

@ -1781,6 +1781,10 @@ fpie
Common Report Var(flag_pie,1) Negative(fPIC)
Generate position-independent code for executables if possible (small mode)
fplt
Common Report Var(flag_plt) Init(1) Optimization
Use PLT for PIC calls (-fno-plt: load the address from GOT at call site)
fplugin=
Common Joined RejectNegative Var(common_deferred_options) Defer
Specify a plugin to load

View File

@ -1128,7 +1128,7 @@ See S/390 and zSeries Options.
-finstrument-functions-exclude-function-list=@var{sym},@var{sym},@dots{} @gol
-finstrument-functions-exclude-file-list=@var{file},@var{file},@dots{} @gol
-fno-common -fno-ident @gol
-fpcc-struct-return -fpic -fPIC -fpie -fPIE @gol
-fpcc-struct-return -fpic -fPIC -fpie -fPIE -fno-plt @gol
-fno-jump-tables @gol
-frecord-gcc-switches @gol
-freg-struct-return -fshort-enums @gol
@ -23782,6 +23782,16 @@ used during linking.
@code{__pie__} and @code{__PIE__}. The macros have the value 1
for @option{-fpie} and 2 for @option{-fPIE}.
@item -fno-plt
@opindex fno-plt
Do not use PLT for external function calls in position-independent code.
Instead, load callee address at call site from GOT and branch to it.
This leads to more efficient code by eliminating PLT stubs and exposing
GOT load to optimizations. On architectures such as 32-bit x86 where
PLT stubs expect GOT pointer in a specific register, this gives more
register allocation freedom to the compiler. Lazy binding requires PLT:
with @option{-fno-plt} all external symbols are resolved at load time.
@item -fno-jump-tables
@opindex fno-jump-tables
Do not use jump tables for switch statements even where it would be