Commit 1ec0c607 by Waldek Hebisch Committed by Eric Botcazou

re PR target/12865 (`mprotect' call to make trampoline executable may fail)

	PR target/12865
	* config/sparc/sparc.c (sparc_initialize_trampoline): Call
	__enable_execute_stack only after writing onto the stack.
	(sparc64_initialize_trampoline): Likewise.

From-SVN: r73402
parent 9883226b
2003-11-10 Waldek Hebisch <hebisch@math.uni.wroc.pl>
PR target/12865
* config/sparc/sparc.c (sparc_initialize_trampoline): Call
__enable_execute_stack only after writing onto the stack.
(sparc64_initialize_trampoline): Likewise.
2003-11-09 Roger Sayle <roger@eyesopen.com> 2003-11-09 Roger Sayle <roger@eyesopen.com>
* loop.c (check_dbra_loop): Try swapping the comparison operands * loop.c (check_dbra_loop): Try swapping the comparison operands
......
...@@ -7087,7 +7087,7 @@ sparc_type_code (register tree type) ...@@ -7087,7 +7087,7 @@ sparc_type_code (register tree type)
void void
sparc_initialize_trampoline (rtx tramp, rtx fnaddr, rtx cxt) sparc_initialize_trampoline (rtx tramp, rtx fnaddr, rtx cxt)
{ {
/* SPARC 32 bit trampoline: /* SPARC 32-bit trampoline:
sethi %hi(fn), %g1 sethi %hi(fn), %g1
sethi %hi(static), %g2 sethi %hi(static), %g2
...@@ -7097,10 +7097,6 @@ sparc_initialize_trampoline (rtx tramp, rtx fnaddr, rtx cxt) ...@@ -7097,10 +7097,6 @@ sparc_initialize_trampoline (rtx tramp, rtx fnaddr, rtx cxt)
SETHI i,r = 00rr rrr1 00ii iiii iiii iiii iiii iiii SETHI i,r = 00rr rrr1 00ii iiii iiii iiii iiii iiii
JMPL r+i,d = 10dd ddd1 1100 0rrr rr1i iiii iiii iiii JMPL r+i,d = 10dd ddd1 1100 0rrr rr1i iiii iiii iiii
*/ */
#ifdef TRANSFER_FROM_TRAMPOLINE
emit_library_call (gen_rtx (SYMBOL_REF, Pmode, "__enable_execute_stack"),
LCT_NORMAL, VOIDmode, 1, tramp, Pmode);
#endif
emit_move_insn emit_move_insn
(gen_rtx_MEM (SImode, plus_constant (tramp, 0)), (gen_rtx_MEM (SImode, plus_constant (tramp, 0)),
...@@ -7139,21 +7135,25 @@ sparc_initialize_trampoline (rtx tramp, rtx fnaddr, rtx cxt) ...@@ -7139,21 +7135,25 @@ sparc_initialize_trampoline (rtx tramp, rtx fnaddr, rtx cxt)
&& sparc_cpu != PROCESSOR_ULTRASPARC3) && sparc_cpu != PROCESSOR_ULTRASPARC3)
emit_insn (gen_flush (validize_mem (gen_rtx_MEM (SImode, emit_insn (gen_flush (validize_mem (gen_rtx_MEM (SImode,
plus_constant (tramp, 8))))); plus_constant (tramp, 8)))));
/* Call __enable_execute_stack after writing onto the stack to make sure
the stack address is accessible. */
#ifdef TRANSFER_FROM_TRAMPOLINE
emit_library_call (gen_rtx (SYMBOL_REF, Pmode, "__enable_execute_stack"),
LCT_NORMAL, VOIDmode, 1, tramp, Pmode);
#endif
} }
/* The 64 bit version is simpler because it makes more sense to load the /* The 64-bit version is simpler because it makes more sense to load the
values as "immediate" data out of the trampoline. It's also easier since values as "immediate" data out of the trampoline. It's also easier since
we can read the PC without clobbering a register. */ we can read the PC without clobbering a register. */
void void
sparc64_initialize_trampoline (rtx tramp, rtx fnaddr, rtx cxt) sparc64_initialize_trampoline (rtx tramp, rtx fnaddr, rtx cxt)
{ {
#ifdef TRANSFER_FROM_TRAMPOLINE /* SPARC 64-bit trampoline:
emit_library_call (gen_rtx (SYMBOL_REF, Pmode, "__enable_execute_stack"),
LCT_NORMAL, VOIDmode, 1, tramp, Pmode);
#endif
/*
rd %pc, %g1 rd %pc, %g1
ldx [%g1+24], %g5 ldx [%g1+24], %g5
jmp %g5 jmp %g5
...@@ -7176,6 +7176,13 @@ sparc64_initialize_trampoline (rtx tramp, rtx fnaddr, rtx cxt) ...@@ -7176,6 +7176,13 @@ sparc64_initialize_trampoline (rtx tramp, rtx fnaddr, rtx cxt)
if (sparc_cpu != PROCESSOR_ULTRASPARC if (sparc_cpu != PROCESSOR_ULTRASPARC
&& sparc_cpu != PROCESSOR_ULTRASPARC3) && sparc_cpu != PROCESSOR_ULTRASPARC3)
emit_insn (gen_flushdi (validize_mem (gen_rtx_MEM (DImode, plus_constant (tramp, 8))))); emit_insn (gen_flushdi (validize_mem (gen_rtx_MEM (DImode, plus_constant (tramp, 8)))));
/* Call __enable_execute_stack after writing onto the stack to make sure
the stack address is accessible. */
#ifdef TRANSFER_FROM_TRAMPOLINE
emit_library_call (gen_rtx (SYMBOL_REF, Pmode, "__enable_execute_stack"),
LCT_NORMAL, VOIDmode, 1, tramp, Pmode);
#endif
} }
/* Subroutines to support a flat (single) register window calling /* Subroutines to support a flat (single) register window calling
......
2003-11-10 Waldek Hebisch <hebisch@math.uni.wroc.pl>
* gcc.dg/trampoline-1.c: New test.
2003-11-09 Andrew Pinski <pinskia@physics.uc.edu> 2003-11-09 Andrew Pinski <pinskia@physics.uc.edu>
* gcc.c-torture/compile/200031109-1.c: New test. * gcc.c-torture/compile/200031109-1.c: New test.
......
/* PR target/12865 */
/* Origin: Waldek Hebisch <hebisch@math.uni.wroc.pl> */
/* { dg-do run } */
/* { dg-options "-O2" } */
/* This used to fail on various versions of Solaris 2 because the
trampoline couldn't be made executable. */
extern void abort(void);
void foo (void)
{
const int correct[1100] = {1, 0, -2, 0, 1, 0, 1, -1, -10, -30, -67};
int i;
double x1 (void) {return 1; }
double x2 (void) {return -1;}
double x3 (void) {return -1;}
double x4 (void) {return 1; }
double x5 (void) {return 0; }
typedef double pfun(void);
double a (int k, pfun x1, pfun x2, pfun x3, pfun x4, pfun x5)
{
double b (void)
{
k = k - 1;
return a (k, b, x1, x2, x3, x4 );
}
if (k <= 0)
return x4 () + x5 ();
else
return b ();
}
for (i=0; i<=10; i++)
{
if (fabs(a( i, x1, x2, x3, x4, x5 ) - correct [i]) > 0.1)
abort();
}
}
int main (void)
{
foo ();
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