calls.c (prepare_call_address): Transform PLT call to GOT lookup and indirect call...
authorAlexander Monakov <amonakov@ispras.ru>
Mon, 11 May 2015 13:20:57 +0000 (16:20 +0300)
committerAlexander Monakov <amonakov@gcc.gnu.org>
Mon, 11 May 2015 13:20:57 +0000 (16:20 +0300)
* 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

gcc/ChangeLog
gcc/calls.c
gcc/common.opt
gcc/doc/invoke.texi

index 534f6ddbb9e34647b5b7c58fc8d641c3f5f6c954..38f929bd19dbcc37110ee26222a48468dbc03360 100644 (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
index aaac1ad701e25c8493c81100cc01ca317c7cc41b..51b896ef25cd7983b3cdbe365dcccf99012d8f9a 100644 (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)
index 51833c17e49cd1378bae1759c877b7ca69edd451..6753fd31b6225005ca4905b983e5e0a0159465d3 100644 (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
index c332f884b92fe8c74e67eeb4ca8b9d2f80c90ece..b5721c9f242dc01efe895f49b55e3977809d46b8 100644 (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