]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/62038 (Out of range branch target in thunk)
authorJohn David Anglin <danglin@gcc.gnu.org>
Sat, 23 Aug 2014 15:56:07 +0000 (15:56 +0000)
committerJohn David Anglin <danglin@gcc.gnu.org>
Sat, 23 Aug 2014 15:56:07 +0000 (15:56 +0000)
PR target/62038
* config/pa/pa.c (pa_output_function_epilogue): Don't set
last_address when the current function is a thunk.
(pa_asm_output_mi_thunk): When we don't have named sections or they
are not being used, check that thunk can reach the stub table with a
short branch.

From-SVN: r214397

gcc/ChangeLog
gcc/config/pa/pa.c

index cf2e6b82a0319c3e37f818016cc70ea3d0b07f64..d01509ab4507432a160f248be6290b1ce38d2234 100644 (file)
@@ -1,3 +1,12 @@
+2014-08-23  John David Anglin  <danglin@gcc.gnu.org>
+
+       PR target/62038
+       * config/pa/pa.c (pa_output_function_epilogue): Don't set
+       last_address when the current function is a thunk.
+       (pa_asm_output_mi_thunk): When we don't have named sections or they
+       are not being used, check that thunk can reach the stub table with a
+       short branch.
+
 2014-08-23  David Malcolm  <dmalcolm@redhat.com>
 
        * web.c (union_match_dups): Strengthen param "insn" from rtx to
index d47d5c832c55acce608f1c90cef143ad72329b9a..ad0cca34f71818fe7b8cece5ef6823c1dbcf674f 100644 (file)
@@ -4137,8 +4137,7 @@ static void
 pa_output_function_epilogue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
 {
   rtx insn = get_last_insn ();
-
-  last_address = 0;
+  bool extra_nop;
 
   /* pa_expand_epilogue does the dirty work now.  We just need
      to output the assembler directives which denote the end
@@ -4162,8 +4161,10 @@ pa_output_function_epilogue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
   if (insn && CALL_P (insn))
     {
       fputs ("\tnop\n", file);
-      last_address += 4;
+      extra_nop = true;
     }
+  else
+    extra_nop = false;
 
   fputs ("\t.EXIT\n\t.PROCEND\n", file);
 
@@ -4176,12 +4177,13 @@ pa_output_function_epilogue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
       cfun->machine->in_nsubspa = 2;
     }
 
-  /* Thunks do their own accounting.  */
+  /* Thunks do their own insn accounting.  */
   if (cfun->is_thunk)
     return;
 
   if (INSN_ADDRESSES_SET_P ())
     {
+      last_address = extra_nop ? 4 : 0;
       insn = get_last_nonnote_insn ();
       last_address += INSN_ADDRESSES (INSN_UID (insn));
       if (INSN_P (insn))
@@ -8275,12 +8277,16 @@ pa_asm_output_mi_thunk (FILE *file, tree thunk_fndecl, HOST_WIDE_INT delta,
                   || ((DECL_SECTION_NAME (thunk_fndecl)
                        == DECL_SECTION_NAME (function))
                       && last_address < 262132)))
+             /* In this case, we need to be able to reach the start of
+                the stub table even though the function is likely closer
+                and can be jumped to directly.  */
              || (targetm_common.have_named_sections
                  && DECL_SECTION_NAME (thunk_fndecl) == NULL
                  && DECL_SECTION_NAME (function) == NULL
-                 && last_address < 262132)
+                 && total_code_bytes < MAX_PCREL17F_OFFSET)
+             /* Likewise.  */
              || (!targetm_common.have_named_sections
-                 && last_address < 262132))))
+                 && total_code_bytes < MAX_PCREL17F_OFFSET))))
     {
       if (!val_14)
        output_asm_insn ("addil L'%2,%%r26", xoperands);