aboutsummaryrefslogtreecommitdiffstats
path: root/toolchain/gcc/patches/4.9-linaro/020-no-plt-backport.patch
blob: 10cf323c0808e12406155ebcf58d9c5d23d33ab4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
--- a/gcc/calls.c
+++ b/gcc/calls.c
@@ -184,6 +184,12 @@ prepare_call_address (tree fndecl, rtx f
 	       && 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
+	   && TREE_CODE (fndecl) == FUNCTION_DECL
+	   && !targetm.binds_local_p (fndecl))
+    {
+      funexp = force_reg (Pmode, funexp);
+    }
   else if (! sibcallp)
     {
 #ifndef NO_FUNCTION_CSE
--- a/gcc/common.opt
+++ b/gcc/common.opt
@@ -1659,6 +1659,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)
+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