/* Base configuration file for all NetBSD targets.
|
/* Base configuration file for all NetBSD targets.
|
Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
|
Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
|
2007 Free Software Foundation, Inc.
|
2007 Free Software Foundation, Inc.
|
|
|
This file is part of GCC.
|
This file is part of GCC.
|
|
|
GCC is free software; you can redistribute it and/or modify
|
GCC is free software; you can redistribute it and/or modify
|
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
the Free Software Foundation; either version 3, or (at your option)
|
the Free Software Foundation; either version 3, or (at your option)
|
any later version.
|
any later version.
|
|
|
GCC is distributed in the hope that it will be useful,
|
GCC is distributed in the hope that it will be useful,
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
GNU General Public License for more details.
|
GNU General Public License for more details.
|
|
|
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
along with GCC; see the file COPYING3. If not see
|
along with GCC; see the file COPYING3. If not see
|
<http://www.gnu.org/licenses/>. */
|
<http://www.gnu.org/licenses/>. */
|
|
|
/* TARGET_OS_CPP_BUILTINS() common to all NetBSD targets. */
|
/* TARGET_OS_CPP_BUILTINS() common to all NetBSD targets. */
|
#define NETBSD_OS_CPP_BUILTINS_COMMON() \
|
#define NETBSD_OS_CPP_BUILTINS_COMMON() \
|
do \
|
do \
|
{ \
|
{ \
|
builtin_define ("__NetBSD__"); \
|
builtin_define ("__NetBSD__"); \
|
builtin_define ("__unix__"); \
|
builtin_define ("__unix__"); \
|
builtin_assert ("system=bsd"); \
|
builtin_assert ("system=bsd"); \
|
builtin_assert ("system=unix"); \
|
builtin_assert ("system=unix"); \
|
builtin_assert ("system=NetBSD"); \
|
builtin_assert ("system=NetBSD"); \
|
} \
|
} \
|
while (0)
|
while (0)
|
|
|
/* CPP_SPEC parts common to all NetBSD targets. */
|
/* CPP_SPEC parts common to all NetBSD targets. */
|
#define NETBSD_CPP_SPEC \
|
#define NETBSD_CPP_SPEC \
|
"%{posix:-D_POSIX_SOURCE} \
|
"%{posix:-D_POSIX_SOURCE} \
|
%{pthread:-D_REENTRANT -D_PTHREADS}"
|
%{pthread:-D_REENTRANT -D_PTHREADS}"
|
|
|
/* NETBSD_NATIVE is defined when gcc is integrated into the NetBSD
|
/* NETBSD_NATIVE is defined when gcc is integrated into the NetBSD
|
source tree so it can be configured appropriately without using
|
source tree so it can be configured appropriately without using
|
the GNU configure/build mechanism. */
|
the GNU configure/build mechanism. */
|
|
|
#ifdef NETBSD_NATIVE
|
#ifdef NETBSD_NATIVE
|
|
|
/* Look for the include files in the system-defined places. */
|
/* Look for the include files in the system-defined places. */
|
|
|
#undef GPLUSPLUS_INCLUDE_DIR
|
#undef GPLUSPLUS_INCLUDE_DIR
|
#define GPLUSPLUS_INCLUDE_DIR "/usr/include/g++"
|
#define GPLUSPLUS_INCLUDE_DIR "/usr/include/g++"
|
|
|
#undef GCC_INCLUDE_DIR
|
#undef GCC_INCLUDE_DIR
|
#define GCC_INCLUDE_DIR "/usr/include"
|
#define GCC_INCLUDE_DIR "/usr/include"
|
|
|
#undef INCLUDE_DEFAULTS
|
#undef INCLUDE_DEFAULTS
|
#define INCLUDE_DEFAULTS \
|
#define INCLUDE_DEFAULTS \
|
{ \
|
{ \
|
{ GPLUSPLUS_INCLUDE_DIR, "G++", 1, 1 }, \
|
{ GPLUSPLUS_INCLUDE_DIR, "G++", 1, 1 }, \
|
{ GCC_INCLUDE_DIR, "GCC", 0, 0 }, \
|
{ GCC_INCLUDE_DIR, "GCC", 0, 0 }, \
|
{ 0, 0, 0, 0 } \
|
{ 0, 0, 0, 0 } \
|
}
|
}
|
|
|
/* Under NetBSD, the normal location of the compiler back ends is the
|
/* Under NetBSD, the normal location of the compiler back ends is the
|
/usr/libexec directory. */
|
/usr/libexec directory. */
|
|
|
#undef STANDARD_EXEC_PREFIX
|
#undef STANDARD_EXEC_PREFIX
|
#define STANDARD_EXEC_PREFIX "/usr/libexec/"
|
#define STANDARD_EXEC_PREFIX "/usr/libexec/"
|
|
|
/* Under NetBSD, the normal location of the various *crt*.o files is the
|
/* Under NetBSD, the normal location of the various *crt*.o files is the
|
/usr/lib directory. */
|
/usr/lib directory. */
|
|
|
#undef STANDARD_STARTFILE_PREFIX
|
#undef STANDARD_STARTFILE_PREFIX
|
#define STANDARD_STARTFILE_PREFIX "/usr/lib/"
|
#define STANDARD_STARTFILE_PREFIX "/usr/lib/"
|
|
|
#endif /* NETBSD_NATIVE */
|
#endif /* NETBSD_NATIVE */
|
|
|
|
|
/* Provide a LIB_SPEC appropriate for NetBSD. Here we:
|
/* Provide a LIB_SPEC appropriate for NetBSD. Here we:
|
|
|
1. Select the appropriate set of libs, depending on whether we're
|
1. Select the appropriate set of libs, depending on whether we're
|
profiling.
|
profiling.
|
|
|
2. Include the pthread library if -pthread is specified (only
|
2. Include the pthread library if -pthread is specified (only
|
if threads are enabled).
|
if threads are enabled).
|
|
|
3. Include the posix library if -posix is specified.
|
3. Include the posix library if -posix is specified.
|
|
|
FIXME: Could eliminate the duplication here if we were allowed to
|
FIXME: Could eliminate the duplication here if we were allowed to
|
use string concatenation. */
|
use string concatenation. */
|
|
|
#ifdef NETBSD_ENABLE_PTHREADS
|
#ifdef NETBSD_ENABLE_PTHREADS
|
#define NETBSD_LIB_SPEC \
|
#define NETBSD_LIB_SPEC \
|
"%{pthread: \
|
"%{pthread: \
|
%{!p: \
|
%{!p: \
|
%{!pg:-lpthread}} \
|
%{!pg:-lpthread}} \
|
%{p:-lpthread_p} \
|
%{p:-lpthread_p} \
|
%{pg:-lpthread_p}} \
|
%{pg:-lpthread_p}} \
|
%{posix: \
|
%{posix: \
|
%{!p: \
|
%{!p: \
|
%{!pg:-lposix}} \
|
%{!pg:-lposix}} \
|
%{p:-lposix_p} \
|
%{p:-lposix_p} \
|
%{pg:-lposix_p}} \
|
%{pg:-lposix_p}} \
|
%{!shared: \
|
%{!shared: \
|
%{!symbolic: \
|
%{!symbolic: \
|
%{!p: \
|
%{!p: \
|
%{!pg:-lc}} \
|
%{!pg:-lc}} \
|
%{p:-lc_p} \
|
%{p:-lc_p} \
|
%{pg:-lc_p}}}"
|
%{pg:-lc_p}}}"
|
#else
|
#else
|
#define NETBSD_LIB_SPEC \
|
#define NETBSD_LIB_SPEC \
|
"%{posix: \
|
"%{posix: \
|
%{!p: \
|
%{!p: \
|
%{!pg:-lposix}} \
|
%{!pg:-lposix}} \
|
%{p:-lposix_p} \
|
%{p:-lposix_p} \
|
%{pg:-lposix_p}} \
|
%{pg:-lposix_p}} \
|
%{!shared: \
|
%{!shared: \
|
%{!symbolic: \
|
%{!symbolic: \
|
%{!p: \
|
%{!p: \
|
%{!pg:-lc}} \
|
%{!pg:-lc}} \
|
%{p:-lc_p} \
|
%{p:-lc_p} \
|
%{pg:-lc_p}}}"
|
%{pg:-lc_p}}}"
|
#endif
|
#endif
|
|
|
#undef LIB_SPEC
|
#undef LIB_SPEC
|
#define LIB_SPEC NETBSD_LIB_SPEC
|
#define LIB_SPEC NETBSD_LIB_SPEC
|
|
|
/* Provide a LIBGCC_SPEC appropriate for NetBSD. We also want to exclude
|
/* Provide a LIBGCC_SPEC appropriate for NetBSD. We also want to exclude
|
libgcc with -symbolic. */
|
libgcc with -symbolic. */
|
|
|
#ifdef NETBSD_NATIVE
|
#ifdef NETBSD_NATIVE
|
#define NETBSD_LIBGCC_SPEC \
|
#define NETBSD_LIBGCC_SPEC \
|
"%{!symbolic: \
|
"%{!symbolic: \
|
%{!shared: \
|
%{!shared: \
|
%{!p: \
|
%{!p: \
|
%{!pg: -lgcc}}} \
|
%{!pg: -lgcc}}} \
|
%{shared: -lgcc_pic} \
|
%{shared: -lgcc_pic} \
|
%{p: -lgcc_p} \
|
%{p: -lgcc_p} \
|
%{pg: -lgcc_p}}"
|
%{pg: -lgcc_p}}"
|
#else
|
#else
|
#define NETBSD_LIBGCC_SPEC "%{!shared:%{!symbolic: -lgcc}}"
|
#define NETBSD_LIBGCC_SPEC "%{!shared:%{!symbolic: -lgcc}}"
|
#endif
|
#endif
|
|
|
#undef LIBGCC_SPEC
|
#undef LIBGCC_SPEC
|
#define LIBGCC_SPEC NETBSD_LIBGCC_SPEC
|
#define LIBGCC_SPEC NETBSD_LIBGCC_SPEC
|
|
|
/* When building shared libraries, the initialization and finalization
|
/* When building shared libraries, the initialization and finalization
|
functions for the library are .init and .fini respectively. */
|
functions for the library are .init and .fini respectively. */
|
|
|
#define COLLECT_SHARED_INIT_FUNC(STREAM,FUNC) \
|
#define COLLECT_SHARED_INIT_FUNC(STREAM,FUNC) \
|
do { \
|
do { \
|
fprintf ((STREAM), "void __init() __asm__ (\".init\");"); \
|
fprintf ((STREAM), "void __init() __asm__ (\".init\");"); \
|
fprintf ((STREAM), "void __init() {\n\t%s();\n}\n", (FUNC)); \
|
fprintf ((STREAM), "void __init() {\n\t%s();\n}\n", (FUNC)); \
|
} while (0)
|
} while (0)
|
|
|
#define COLLECT_SHARED_FINI_FUNC(STREAM,FUNC) \
|
#define COLLECT_SHARED_FINI_FUNC(STREAM,FUNC) \
|
do { \
|
do { \
|
fprintf ((STREAM), "void __fini() __asm__ (\".fini\");"); \
|
fprintf ((STREAM), "void __fini() __asm__ (\".fini\");"); \
|
fprintf ((STREAM), "void __fini() {\n\t%s();\n}\n", (FUNC)); \
|
fprintf ((STREAM), "void __fini() {\n\t%s();\n}\n", (FUNC)); \
|
} while (0)
|
} while (0)
|
|
|
#undef TARGET_POSIX_IO
|
#undef TARGET_POSIX_IO
|
#define TARGET_POSIX_IO
|
#define TARGET_POSIX_IO
|
|
|
/* Handle #pragma weak and #pragma pack. */
|
/* Handle #pragma weak and #pragma pack. */
|
|
|
#define HANDLE_SYSV_PRAGMA 1
|
#define HANDLE_SYSV_PRAGMA 1
|
|
|
/* Don't assume anything about the header files. */
|
/* Don't assume anything about the header files. */
|
#undef NO_IMPLICIT_EXTERN_C
|
#undef NO_IMPLICIT_EXTERN_C
|
#define NO_IMPLICIT_EXTERN_C 1
|
#define NO_IMPLICIT_EXTERN_C 1
|
|
|
/* Define some types that are the same on all NetBSD platforms,
|
/* Define some types that are the same on all NetBSD platforms,
|
making them agree with <machine/ansi.h>. */
|
making them agree with <machine/ansi.h>. */
|
|
|
#undef WCHAR_TYPE
|
#undef WCHAR_TYPE
|
#define WCHAR_TYPE "int"
|
#define WCHAR_TYPE "int"
|
|
|
#undef WCHAR_TYPE_SIZE
|
#undef WCHAR_TYPE_SIZE
|
#define WCHAR_TYPE_SIZE 32
|
#define WCHAR_TYPE_SIZE 32
|
|
|
#undef WINT_TYPE
|
#undef WINT_TYPE
|
#define WINT_TYPE "int"
|
#define WINT_TYPE "int"
|
|
|
|
|
/* Attempt to turn on execute permission for the stack. This may be
|
/* Attempt to turn on execute permission for the stack. This may be
|
used by INITIALIZE_TRAMPOLINE of the target needs it (that is,
|
used by INITIALIZE_TRAMPOLINE of the target needs it (that is,
|
if the target machine can change execute permissions on a page).
|
if the target machine can change execute permissions on a page).
|
|
|
There is no way to query the execute permission of the stack, so
|
There is no way to query the execute permission of the stack, so
|
we always issue the mprotect() call.
|
we always issue the mprotect() call.
|
|
|
Note that we go out of our way to use namespace-non-invasive calls
|
Note that we go out of our way to use namespace-non-invasive calls
|
here. Unfortunately, there is no libc-internal name for mprotect().
|
here. Unfortunately, there is no libc-internal name for mprotect().
|
|
|
Also note that no errors should be emitted by this code; it is considered
|
Also note that no errors should be emitted by this code; it is considered
|
dangerous for library calls to send messages to stdout/stderr. */
|
dangerous for library calls to send messages to stdout/stderr. */
|
|
|
#define NETBSD_ENABLE_EXECUTE_STACK \
|
#define NETBSD_ENABLE_EXECUTE_STACK \
|
extern void __enable_execute_stack (void *); \
|
extern void __enable_execute_stack (void *); \
|
void \
|
void \
|
__enable_execute_stack (void *addr) \
|
__enable_execute_stack (void *addr) \
|
{ \
|
{ \
|
extern int mprotect (void *, size_t, int); \
|
extern int mprotect (void *, size_t, int); \
|
extern int __sysctl (int *, unsigned int, void *, size_t *, \
|
extern int __sysctl (int *, unsigned int, void *, size_t *, \
|
void *, size_t); \
|
void *, size_t); \
|
\
|
\
|
static int size; \
|
static int size; \
|
static long mask; \
|
static long mask; \
|
\
|
\
|
char *page, *end; \
|
char *page, *end; \
|
\
|
\
|
if (size == 0) \
|
if (size == 0) \
|
{ \
|
{ \
|
int mib[2]; \
|
int mib[2]; \
|
size_t len; \
|
size_t len; \
|
\
|
\
|
mib[0] = 6; /* CTL_HW */ \
|
mib[0] = 6; /* CTL_HW */ \
|
mib[1] = 7; /* HW_PAGESIZE */ \
|
mib[1] = 7; /* HW_PAGESIZE */ \
|
len = sizeof (size); \
|
len = sizeof (size); \
|
(void) __sysctl (mib, 2, &size, &len, NULL, 0); \
|
(void) __sysctl (mib, 2, &size, &len, NULL, 0); \
|
mask = ~((long) size - 1); \
|
mask = ~((long) size - 1); \
|
} \
|
} \
|
\
|
\
|
page = (char *) (((long) addr) & mask); \
|
page = (char *) (((long) addr) & mask); \
|
end = (char *) ((((long) (addr + TRAMPOLINE_SIZE)) & mask) + size); \
|
end = (char *) ((((long) (addr + TRAMPOLINE_SIZE)) & mask) + size); \
|
\
|
\
|
/* 7 == PROT_READ | PROT_WRITE | PROT_EXEC */ \
|
/* 7 == PROT_READ | PROT_WRITE | PROT_EXEC */ \
|
(void) mprotect (page, end - page, 7); \
|
(void) mprotect (page, end - page, 7); \
|
}
|
}
|
|
|