Commit 31abac07 by Eric Christopher Committed by Eric Christopher

darwin.h (ENABLE_STACK_EXECUTE): Define.

2006-02-28  Eric Christopher  <echristo@apple.com>

        * config/rs6000/darwin.h (ENABLE_STACK_EXECUTE): Define.
        Set up IN_LIBGCC definition of TARGET_64BIT.
        * config/i386/darwin.h (ENABLE_STACK_EXECUTE): Define.

From-SVN: r111584
parent b295c471
2006-02-28 Eric Christopher <echristo@apple.com>
* config/rs6000/darwin.h (ENABLE_STACK_EXECUTE): Define.
Set up IN_LIBGCC definition of TARGET_64BIT.
* config/i386/darwin.h (ENABLE_STACK_EXECUTE): Define.
2006-02-28 Roger Sayle <roger@eyesopen.com> 2006-02-28 Roger Sayle <roger@eyesopen.com>
PR middle-end/14752 PR middle-end/14752
......
...@@ -170,3 +170,50 @@ extern void darwin_x86_file_end (void); ...@@ -170,3 +170,50 @@ extern void darwin_x86_file_end (void);
: (n) == 4 ? 5 \ : (n) == 4 ? 5 \
: (n) >= 11 && (n) <= 18 ? (n) + 1 \ : (n) >= 11 && (n) <= 18 ? (n) + 1 \
: (n)) : (n))
/* Attempt to turn on execute permission for the stack. This may be
used by INITIALIZE_TRAMPOLINE of the target needs it (that is,
if the target machine can change execute permissions on a page).
There is no way to query the execute permission of the stack, so
we always issue the mprotect() call.
Note that we go out of our way to use namespace-non-invasive calls
here. Unfortunately, there is no libc-internal name for mprotect().
Also note that no errors should be emitted by this code; it is
considered dangerous for library calls to send messages to
stdout/stderr. */
#define ENABLE_EXECUTE_STACK \
extern void __enable_execute_stack (void *); \
void \
__enable_execute_stack (void *addr) \
{ \
extern int mprotect (void *, size_t, int); \
extern int __sysctl (int *, unsigned int, void *, size_t *, \
void *, size_t); \
\
static int size; \
static long mask; \
\
char *page, *end; \
\
if (size == 0) \
{ \
int mib[2]; \
size_t len; \
\
mib[0] = 6; /* CTL_HW */ \
mib[1] = 7; /* HW_PAGESIZE */ \
len = sizeof (size); \
(void) __sysctl (mib, 2, &size, &len, NULL, 0); \
mask = ~((long) size - 1); \
} \
\
page = (char *) (((long) addr) & mask); \
end = (char *) ((((long) (addr + TRAMPOLINE_SIZE)) & mask) + size); \
\
/* 7 == PROT_READ | PROT_WRITE | PROT_EXEC */ \
(void) mprotect (page, end - page, 7); \
}
...@@ -27,6 +27,15 @@ ...@@ -27,6 +27,15 @@
#define DEFAULT_ABI ABI_DARWIN #define DEFAULT_ABI ABI_DARWIN
#ifdef IN_LIBGCC2
#undef TARGET_64BIT
#ifdef __powerpc64__
#define TARGET_64BIT 1
#else
#define TARGET_64BIT 0
#endif
#endif
/* The object file format is Mach-O. */ /* The object file format is Mach-O. */
#define TARGET_OBJECT_FORMAT OBJECT_MACHO #define TARGET_OBJECT_FORMAT OBJECT_MACHO
...@@ -338,11 +347,11 @@ do { \ ...@@ -338,11 +347,11 @@ do { \
#undef DEFAULT_SIGNED_CHAR #undef DEFAULT_SIGNED_CHAR
#define DEFAULT_SIGNED_CHAR (1) #define DEFAULT_SIGNED_CHAR (1)
/* Given an rtx X being reloaded into a reg required to be /* Given an rtx X being reloaded into a reg required to be
in class CLASS, return the class of reg to actually use. in class CLASS, return the class of reg to actually use.
In general this is just CLASS; but on some machines In general this is just CLASS; but on some machines
in some cases it is preferable to use a more restrictive class. in some cases it is preferable to use a more restrictive class.
On the RS/6000, we have to return NO_REGS when we want to reload a On the RS/6000, we have to return NO_REGS when we want to reload a
floating-point CONST_DOUBLE to force it to be copied to memory. floating-point CONST_DOUBLE to force it to be copied to memory.
...@@ -439,3 +448,50 @@ do { \ ...@@ -439,3 +448,50 @@ do { \
(TARGET_64BIT \ (TARGET_64BIT \
|| (darwin_macosx_version_min \ || (darwin_macosx_version_min \
&& strverscmp (darwin_macosx_version_min, "10.3") >= 0)) && strverscmp (darwin_macosx_version_min, "10.3") >= 0))
/* Attempt to turn on execute permission for the stack. This may be
used by INITIALIZE_TRAMPOLINE of the target needs it (that is,
if the target machine can change execute permissions on a page).
There is no way to query the execute permission of the stack, so
we always issue the mprotect() call.
Note that we go out of our way to use namespace-non-invasive calls
here. Unfortunately, there is no libc-internal name for mprotect().
Also note that no errors should be emitted by this code; it is
considered dangerous for library calls to send messages to
stdout/stderr. */
#define ENABLE_EXECUTE_STACK \
extern void __enable_execute_stack (void *); \
void \
__enable_execute_stack (void *addr) \
{ \
extern int mprotect (void *, size_t, int); \
extern int __sysctl (int *, unsigned int, void *, size_t *, \
void *, size_t); \
\
static int size; \
static long mask; \
\
char *page, *end; \
\
if (size == 0) \
{ \
int mib[2]; \
size_t len; \
\
mib[0] = 6; /* CTL_HW */ \
mib[1] = 7; /* HW_PAGESIZE */ \
len = sizeof (size); \
(void) __sysctl (mib, 2, &size, &len, NULL, 0); \
mask = ~((long) size - 1); \
} \
\
page = (char *) (((long) addr) & mask); \
end = (char *) ((((long) (addr + (TARGET_64BIT ? 48 : 40))) & mask) + size); \
\
/* 7 == PROT_READ | PROT_WRITE | PROT_EXEC */ \
(void) mprotect (page, end - page, 7); \
}
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