Commit 5dba8769 by John David Anglin

re PR target/62038 (Out of range branch target in thunk)

	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
parent 5e0231c2
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> 2014-08-23 David Malcolm <dmalcolm@redhat.com>
* web.c (union_match_dups): Strengthen param "insn" from rtx to * web.c (union_match_dups): Strengthen param "insn" from rtx to
......
...@@ -4137,8 +4137,7 @@ static void ...@@ -4137,8 +4137,7 @@ static void
pa_output_function_epilogue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED) pa_output_function_epilogue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
{ {
rtx insn = get_last_insn (); rtx insn = get_last_insn ();
bool extra_nop;
last_address = 0;
/* pa_expand_epilogue does the dirty work now. We just need /* pa_expand_epilogue does the dirty work now. We just need
to output the assembler directives which denote the end 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) ...@@ -4162,8 +4161,10 @@ pa_output_function_epilogue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
if (insn && CALL_P (insn)) if (insn && CALL_P (insn))
{ {
fputs ("\tnop\n", file); fputs ("\tnop\n", file);
last_address += 4; extra_nop = true;
} }
else
extra_nop = false;
fputs ("\t.EXIT\n\t.PROCEND\n", file); fputs ("\t.EXIT\n\t.PROCEND\n", file);
...@@ -4176,12 +4177,13 @@ pa_output_function_epilogue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED) ...@@ -4176,12 +4177,13 @@ pa_output_function_epilogue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
cfun->machine->in_nsubspa = 2; cfun->machine->in_nsubspa = 2;
} }
/* Thunks do their own accounting. */ /* Thunks do their own insn accounting. */
if (cfun->is_thunk) if (cfun->is_thunk)
return; return;
if (INSN_ADDRESSES_SET_P ()) if (INSN_ADDRESSES_SET_P ())
{ {
last_address = extra_nop ? 4 : 0;
insn = get_last_nonnote_insn (); insn = get_last_nonnote_insn ();
last_address += INSN_ADDRESSES (INSN_UID (insn)); last_address += INSN_ADDRESSES (INSN_UID (insn));
if (INSN_P (insn)) if (INSN_P (insn))
...@@ -8275,12 +8277,16 @@ pa_asm_output_mi_thunk (FILE *file, tree thunk_fndecl, HOST_WIDE_INT delta, ...@@ -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 (thunk_fndecl)
== DECL_SECTION_NAME (function)) == DECL_SECTION_NAME (function))
&& last_address < 262132))) && 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 || (targetm_common.have_named_sections
&& DECL_SECTION_NAME (thunk_fndecl) == NULL && DECL_SECTION_NAME (thunk_fndecl) == NULL
&& DECL_SECTION_NAME (function) == NULL && DECL_SECTION_NAME (function) == NULL
&& last_address < 262132) && total_code_bytes < MAX_PCREL17F_OFFSET)
/* Likewise. */
|| (!targetm_common.have_named_sections || (!targetm_common.have_named_sections
&& last_address < 262132)))) && total_code_bytes < MAX_PCREL17F_OFFSET))))
{ {
if (!val_14) if (!val_14)
output_asm_insn ("addil L'%2,%%r26", xoperands); output_asm_insn ("addil L'%2,%%r26", xoperands);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment