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
This commit is contained in:
parent
5e0231c231
commit
5dba876931
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue