]> oss.titaniummirror.com Git - msp430-gcc.git/blobdiff - gcc/config/rs6000/linux.h
Imported gcc-4.4.3
[msp430-gcc.git] / gcc / config / rs6000 / linux.h
index f5cbd7a663eb2bdae71b38f4556c523b4d161a2e..4831273c50d76a42fe1a0c7c186a5a500e10abe7 100644 (file)
@@ -1,35 +1,54 @@
 /* Definitions of target machine for GNU compiler,
-   for powerpc machines running Linux.
-   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003
-   Free Software Foundation, Inc.
+   for PowerPC machines running Linux.
+   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
+   2004, 2005, 2006, 2007 Free Software Foundation, Inc.
    Contributed by Michael Meissner (meissner@cygnus.com).
 
-This file is part of GNU CC.
+   This file is part of GCC.
 
-GNU CC is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
+   GCC is free software; you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published
+   by the Free Software Foundation; either version 3, or (at your
+   option) any later version.
 
-GNU CC is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+   GCC is distributed in the hope that it will be useful, but WITHOUT
+   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
+   License for more details.
 
-You should have received a copy of the GNU General Public License
-along with GNU CC; see the file COPYING.  If not, write to
-the Free Software Foundation, 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-/* Don't assume anything about the header files.  */
-#define NO_IMPLICIT_EXTERN_C
+   You should have received a copy of the GNU General Public License
+   along with GCC; see the file COPYING3.  If not see
+   <http://www.gnu.org/licenses/>.  */
 
 #undef MD_EXEC_PREFIX
 #undef MD_STARTFILE_PREFIX
 
-#undef CPP_PREDEFINES
-#define CPP_PREDEFINES \
- "-DPPC -D__ELF__ -Dpowerpc -Acpu=powerpc -Amachine=powerpc"
+/* Linux doesn't support saving and restoring 64-bit regs in a 32-bit
+   process.  */
+#define OS_MISSING_POWERPC64 1
+
+/* We use glibc _mcount for profiling.  */
+#define NO_PROFILE_COUNTERS 1
+
+/* glibc has float and long double forms of math functions.  */
+#undef  TARGET_C99_FUNCTIONS
+#define TARGET_C99_FUNCTIONS (OPTION_GLIBC)
+
+/* Whether we have sincos that follows the GNU extension.  */
+#undef  TARGET_HAS_SINCOS
+#define TARGET_HAS_SINCOS (OPTION_GLIBC)
+
+#undef  TARGET_OS_CPP_BUILTINS
+#define TARGET_OS_CPP_BUILTINS()               \
+  do                                           \
+    {                                          \
+      builtin_define_std ("PPC");              \
+      builtin_define_std ("powerpc");          \
+      builtin_assert ("cpu=powerpc");          \
+      builtin_assert ("machine=powerpc");      \
+      TARGET_OS_SYSV_CPP_BUILTINS ();          \
+    }                                          \
+  while (0)
 
 #undef CPP_OS_DEFAULT_SPEC
 #define CPP_OS_DEFAULT_SPEC "%(cpp_os_linux)"
@@ -37,10 +56,10 @@ Boston, MA 02111-1307, USA.  */
 /* The GNU C++ standard library currently requires _GNU_SOURCE being
    defined on glibc-based systems. This temporary hack accomplishes this,
    it should go away as soon as libstdc++-v3 has a real fix.  */
-#undef CPLUSPLUS_CPP_SPEC
+#undef  CPLUSPLUS_CPP_SPEC
 #define CPLUSPLUS_CPP_SPEC "-D_GNU_SOURCE %(cpp)"
 
-#undef LINK_SHLIB_SPEC
+#undef  LINK_SHLIB_SPEC
 #define LINK_SHLIB_SPEC "%{shared:-shared} %{!shared: %{static:-static}}"
 
 #undef LIB_DEFAULT_SPEC
@@ -58,97 +77,54 @@ Boston, MA 02111-1307, USA.  */
 #undef LINK_OS_DEFAULT_SPEC
 #define LINK_OS_DEFAULT_SPEC "%(link_os_linux)"
 
-#undef TARGET_VERSION
+#define LINK_GCC_C_SEQUENCE_SPEC \
+  "%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}"
+
+/* Use --as-needed -lgcc_s for eh support.  */
+#ifdef HAVE_LD_AS_NEEDED
+#define USE_LD_AS_NEEDED 1
+#endif
+
+#undef  TARGET_VERSION
 #define TARGET_VERSION fprintf (stderr, " (PowerPC GNU/Linux)");
 
 /* Override rs6000.h definition.  */
-#undef ASM_APP_ON
+#undef  ASM_APP_ON
 #define ASM_APP_ON "#APP\n"
 
 /* Override rs6000.h definition.  */
-#undef ASM_APP_OFF
+#undef  ASM_APP_OFF
 #define ASM_APP_OFF "#NO_APP\n"
 
 /* For backward compatibility, we must continue to use the AIX
    structure return convention.  */
-#undef DRAFT_V4_STRUCT_RET
+#undef  DRAFT_V4_STRUCT_RET
 #define DRAFT_V4_STRUCT_RET 1
 
-/* Do code reading to identify a signal frame, and set the frame
-   state data appropriately.  See unwind-dw2.c for the structs.  */
+/* We are 32-bit all the time, so optimize a little.  */
+#undef TARGET_64BIT
+#define TARGET_64BIT 0
+/* We don't need to generate entries in .fixup, except when
+   -mrelocatable or -mrelocatable-lib is given.  */
+#undef RELOCATABLE_NEEDS_FIXUP
+#define RELOCATABLE_NEEDS_FIXUP \
+  (target_flags & target_flags_explicit & MASK_RELOCATABLE)
 
-#ifdef IN_LIBGCC2
-#include <signal.h>
-#include <sys/ucontext.h>
+#define TARGET_ASM_FILE_END file_end_indicate_exec_stack
 
-enum { SIGNAL_FRAMESIZE = 64 };
+#define TARGET_POSIX_IO
+
+#define MD_UNWIND_SUPPORT "config/rs6000/linux-unwind.h"
+
+#ifdef TARGET_LIBC_PROVIDES_SSP
+/* ppc32 glibc provides __stack_chk_guard in -0x7008(2).  */
+#define TARGET_THREAD_SSP_OFFSET       -0x7008
 #endif
 
-#define MD_FALLBACK_FRAME_STATE_FOR(CONTEXT, FS, SUCCESS)              \
-  do {                                                                 \
-    unsigned char *pc_ = (CONTEXT)->ra;                                        \
-    struct sigcontext *sc_;                                            \
-    long new_cfa_;                                                     \
-    int i_;                                                            \
-                                                                       \
-    /* li r0, 0x7777; sc  (sigreturn old)  */                          \
-    /* li r0, 0x0077; sc  (sigreturn new)  */                          \
-    /* li r0, 0x6666; sc  (rt_sigreturn old)  */                       \
-    /* li r0, 0x00AC; sc  (rt_sigreturn new)  */                       \
-    if (*(unsigned int *) (pc_+4) != 0x44000002)                       \
-      break;                                                           \
-    if (*(unsigned int *) (pc_+0) == 0x38007777                                \
-       || *(unsigned int *) (pc_+0) == 0x38000077)                     \
-      {                                                                        \
-       struct sigframe {                                               \
-         char gap[SIGNAL_FRAMESIZE];                                   \
-         struct sigcontext sigctx;                                     \
-       } *rt_ = (CONTEXT)->cfa;                                        \
-       sc_ = &rt_->sigctx;                                             \
-      }                                                                        \
-    else if (*(unsigned int *) (pc_+0) == 0x38006666                   \
-            || *(unsigned int *) (pc_+0) == 0x380000AC)                \
-      {                                                                        \
-       struct rt_sigframe {                                            \
-         char gap[SIGNAL_FRAMESIZE];                                   \
-         unsigned long _unused[2];                                     \
-         struct siginfo *pinfo;                                        \
-         void *puc;                                                    \
-         struct siginfo info;                                          \
-         struct ucontext uc;                                           \
-       } *rt_ = (CONTEXT)->cfa;                                        \
-       sc_ = &rt_->uc.uc_mcontext;                                     \
-      }                                                                        \
-    else                                                               \
-      break;                                                           \
-                                                                       \
-    new_cfa_ = sc_->regs->gpr[STACK_POINTER_REGNUM];                   \
-    (FS)->cfa_how = CFA_REG_OFFSET;                                    \
-    (FS)->cfa_reg = STACK_POINTER_REGNUM;                              \
-    (FS)->cfa_offset = new_cfa_ - (long) (CONTEXT)->cfa;               \
-                                                                       \
-    for (i_ = 0; i_ < 32; i_++)                                                \
-      if (i_ != STACK_POINTER_REGNUM)                                  \
-       {                                                               \
-         (FS)->regs.reg[i_].how = REG_SAVED_OFFSET;                    \
-         (FS)->regs.reg[i_].loc.offset                                 \
-           = (long)&(sc_->regs->gpr[i_]) - new_cfa_;                   \
-       }                                                               \
-                                                                       \
-    (FS)->regs.reg[LINK_REGISTER_REGNUM].how = REG_SAVED_OFFSET;       \
-    (FS)->regs.reg[LINK_REGISTER_REGNUM].loc.offset                    \
-      = (long)&(sc_->regs->link) - new_cfa_;                           \
-                                                                       \
-    /* The unwinder expects the IP to point to the following insn,     \
-       whereas the kernel returns the address of the actual            \
-       faulting insn. We store NIP+4 in an unused register slot to     \
-       get the same result for multiple evaluation of the same signal  \
-       frame.  */                                                      \
-    sc_->regs->gpr[47] = sc_->regs->nip + 4;                           \
-    (FS)->regs.reg[CR0_REGNO].how = REG_SAVED_OFFSET;                  \
-    (FS)->regs.reg[CR0_REGNO].loc.offset                               \
-      = (long)&(sc_->regs->gpr[47]) - new_cfa_;                                \
-    (FS)->retaddr_column = CR0_REGNO;                                  \
-    goto SUCCESS;                                                      \
-  } while (0)
+#define POWERPC_LINUX
 
+/* ppc linux has 128-bit long double support in glibc 2.4 and later.  */
+#ifdef TARGET_DEFAULT_LONG_DOUBLE_128
+#define RS6000_DEFAULT_LONG_DOUBLE_SIZE 128
+#endif