Commit 694a2f6e by Eric Botcazou Committed by Eric Botcazou

ia64.c (ia64_output_function_profiler): Emit an indirect call to _mcount if the…

ia64.c (ia64_output_function_profiler): Emit an indirect call to _mcount if the function needs a static chain.

	* config/ia64/ia64.c (ia64_output_function_profiler): Emit an
	indirect call to _mcount if the function needs a static chain.

From-SVN: r105917
parent 43f237b4
2005-10-25 Eric Botcazou <ebotcazou@adacore.com>
* config/ia64/ia64.c (ia64_output_function_profiler): Emit an
indirect call to _mcount if the function needs a static chain.
2005-10-25 Eric Botcazou <ebotcazou@libertysurf.fr> 2005-10-25 Eric Botcazou <ebotcazou@libertysurf.fr>
Caroline Tice <ctice@apple.com> Caroline Tice <ctice@apple.com>
......
...@@ -8802,9 +8802,27 @@ ia64_vector_mode_supported_p (enum machine_mode mode) ...@@ -8802,9 +8802,27 @@ ia64_vector_mode_supported_p (enum machine_mode mode)
} }
} }
/* Implement the FUNCTION_PROFILER macro. */
void void
ia64_output_function_profiler (FILE *file, int labelno) ia64_output_function_profiler (FILE *file, int labelno)
{ {
bool indirect_call;
/* If the function needs a static chain and the static chain
register is r15, we use an indirect call so as to bypass
the PLT stub in case the executable is dynamically linked,
because the stub clobbers r15 as per 5.3.6 of the psABI.
We don't need to do that in non canonical PIC mode. */
if (cfun->static_chain_decl && !TARGET_NO_PIC && !TARGET_AUTO_PIC)
{
gcc_assert (STATIC_CHAIN_REGNUM == 15);
indirect_call = true;
}
else
indirect_call = false;
if (TARGET_GNU_AS) if (TARGET_GNU_AS)
fputs ("\t.prologue 4, r40\n", file); fputs ("\t.prologue 4, r40\n", file);
else else
...@@ -8812,7 +8830,7 @@ ia64_output_function_profiler (FILE *file, int labelno) ...@@ -8812,7 +8830,7 @@ ia64_output_function_profiler (FILE *file, int labelno)
fputs ("\talloc out0 = ar.pfs, 8, 0, 4, 0\n", file); fputs ("\talloc out0 = ar.pfs, 8, 0, 4, 0\n", file);
if (NO_PROFILE_COUNTERS) if (NO_PROFILE_COUNTERS)
fputs ("\tmov out3 = r0\n\t;;\n", file); fputs ("\tmov out3 = r0\n", file);
else else
{ {
char buf[20]; char buf[20];
...@@ -8824,15 +8842,29 @@ ia64_output_function_profiler (FILE *file, int labelno) ...@@ -8824,15 +8842,29 @@ ia64_output_function_profiler (FILE *file, int labelno)
fputs ("\taddl out3 = @ltoff(", file); fputs ("\taddl out3 = @ltoff(", file);
assemble_name (file, buf); assemble_name (file, buf);
if (TARGET_AUTO_PIC) if (TARGET_AUTO_PIC)
fputs (")\n\t;;\n", file); fputs (")\n", file);
else else
fputs ("), r1\n\t;;\n", file); fputs ("), r1\n", file);
} }
if (indirect_call)
fputs ("\taddl r14 = @ltoff(@fptr(_mcount)), r1\n", file);
fputs ("\t;;\n", file);
fputs ("\t.save rp, r42\n", file); fputs ("\t.save rp, r42\n", file);
fputs ("\tmov out2 = b0\n", file); fputs ("\tmov out2 = b0\n", file);
if (indirect_call)
fputs ("\tld8 r14 = [r14]\n\t;;\n", file);
fputs ("\t.body\n", file); fputs ("\t.body\n", file);
fputs ("\tmov out1 = r1\n", file); fputs ("\tmov out1 = r1\n", file);
if (indirect_call)
{
fputs ("\tld8 r16 = [r14], 8\n\t;;\n", file);
fputs ("\tmov b6 = r16\n", file);
fputs ("\tld8 r1 = [r14]\n", file);
fputs ("\tbr.call.sptk.many b0 = b6\n\t;;\n", file);
}
else
fputs ("\tbr.call.sptk.many b0 = _mcount\n\t;;\n", file); fputs ("\tbr.call.sptk.many b0 = _mcount\n\t;;\n", file);
} }
......
2005-10-25 Eric Botcazou <ebotcazou@adacore.com>
* gcc.dg/nested-func-4.c: New test.
2005-10-26 Paul Thomas <pault@gcc.gnu.org> 2005-10-26 Paul Thomas <pault@gcc.gnu.org>
PR fortran/24158 PR fortran/24158
/* { dg-do run } */
/* { dg-options "-pg" } */
extern void abort(void);
void foo(int i)
{
void bar(void)
{
if (i != 2)
abort ();
}
bar();
}
int main(void)
{
foo (2);
return 0;
}
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