OSDN Git Service

* config/rs6000/darwin-ldouble.c: Build file for SOFT_FLOAT.
[pf3gnuchains/gcc-fork.git] / gcc / config / rs6000 / sysv4.h
index 8fd4f45..d7c1002 100644 (file)
@@ -1,6 +1,6 @@
 /* Target definitions for GNU compiler for PowerPC running System V.4
-   Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
-   Free Software Foundation, Inc.
+   Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
+   2004, 2005, 2006 Free Software Foundation, Inc.
    Contributed by Cygnus Support.
 
    This file is part of GCC.
 
    You should have received a copy of the GNU General Public License
    along with GCC; see the file COPYING.  If not, write to the
-   Free Software Foundation, 59 Temple Place - Suite 330, Boston,
-   MA 02111-1307, USA.  */
+   Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
 
 /* Header files should be C++ aware in general.  */
+#undef  NO_IMPLICIT_EXTERN_C
 #define NO_IMPLICIT_EXTERN_C
 
 /* Yes!  We are ELF.  */
@@ -46,24 +47,6 @@ enum rs6000_sdata_type {
 
 extern enum rs6000_sdata_type rs6000_sdata;
 
-/* V.4/eabi switches.  */
-#define        MASK_NO_BITFIELD_TYPE   0x40000000      /* Set PCC_BITFIELD_TYPE_MATTERS to 0.  */
-#define        MASK_STRICT_ALIGN       0x20000000      /* Set STRICT_ALIGNMENT to 1.  */
-#define        MASK_RELOCATABLE        0x10000000      /* GOT pointers are PC relative.  */
-#define        MASK_EABI               0x08000000      /* Adhere to eabi, not System V spec.  */
-#define        MASK_LITTLE_ENDIAN      0x04000000      /* Target is little endian.  */
-#define        MASK_REGNAMES           0x02000000      /* Use alternate register names.  */
-#define        MASK_PROTOTYPE          0x01000000      /* Only prototyped fcns pass variable args.  */
-#define MASK_NO_BITFIELD_WORD  0x00800000      /* Bitfields cannot cross word boundaries */
-
-#define        TARGET_NO_BITFIELD_TYPE (target_flags & MASK_NO_BITFIELD_TYPE)
-#define        TARGET_STRICT_ALIGN     (target_flags & MASK_STRICT_ALIGN)
-#define        TARGET_RELOCATABLE      (target_flags & MASK_RELOCATABLE)
-#define        TARGET_EABI             (target_flags & MASK_EABI)
-#define        TARGET_LITTLE_ENDIAN    (target_flags & MASK_LITTLE_ENDIAN)
-#define        TARGET_REGNAMES         (target_flags & MASK_REGNAMES)
-#define        TARGET_PROTOTYPE        (target_flags & MASK_PROTOTYPE)
-#define TARGET_NO_BITFIELD_WORD        (target_flags & MASK_NO_BITFIELD_WORD)
 #define        TARGET_TOC              ((target_flags & MASK_64BIT)            \
                                 || ((target_flags & (MASK_RELOCATABLE  \
                                                      | MASK_MINIMAL_TOC)) \
@@ -76,87 +59,17 @@ extern enum rs6000_sdata_type rs6000_sdata;
 #define        TARGET_NO_TOC           (! TARGET_TOC)
 #define        TARGET_NO_EABI          (! TARGET_EABI)
 
-/* Strings provided by SUBTARGET_OPTIONS */
+#ifdef HAVE_AS_REL16
+#undef TARGET_SECURE_PLT
+#define TARGET_SECURE_PLT      secure_plt
+#endif
+
 extern const char *rs6000_abi_name;
 extern const char *rs6000_sdata_name;
-
-/* Override rs6000.h definition.  */
-#undef SUBTARGET_OPTIONS
-#define        SUBTARGET_OPTIONS                                                       \
-  { "call-",  &rs6000_abi_name, N_("Select ABI calling convention"), 0},       \
-  { "sdata=", &rs6000_sdata_name, N_("Select method for sdata handling"), 0}
-
-/* Max # of bytes for variables to automatically be put into the .sdata
-   or .sdata2 sections.  */
-extern int g_switch_value;             /* Value of the -G xx switch.  */
-extern int g_switch_set;               /* Whether -G xx was passed.  */
+extern const char *rs6000_tls_size_string; /* For -mtls-size= */
 
 #define SDATA_DEFAULT_SIZE 8
 
-/* Note, V.4 no longer uses a normal TOC, so make -mfull-toc, be just
-   the same as -mminimal-toc.  */
-/* Override rs6000.h definition.  */
-#undef SUBTARGET_SWITCHES
-#define SUBTARGET_SWITCHES                                             \
-  { "bit-align",       -MASK_NO_BITFIELD_TYPE,                         \
-    N_("Align to the base type of the bit-field") },                   \
-  { "no-bit-align",     MASK_NO_BITFIELD_TYPE,                         \
-    N_("Don't align to the base type of the bit-field") },             \
-  { "strict-align",     MASK_STRICT_ALIGN,                             \
-    N_("Don't assume that unaligned accesses are handled by the system") }, \
-  { "no-strict-align", -MASK_STRICT_ALIGN,                             \
-    N_("Assume that unaligned accesses are handled by the system") },  \
-  { "relocatable",      MASK_RELOCATABLE | MASK_MINIMAL_TOC | MASK_NO_FP_IN_TOC, \
-    N_("Produce code relocatable at runtime") },                       \
-  { "no-relocatable",  -MASK_RELOCATABLE,                              \
-    N_("Don't produce code relocatable at runtime") },                 \
-  { "relocatable-lib",  MASK_RELOCATABLE | MASK_MINIMAL_TOC | MASK_NO_FP_IN_TOC, \
-    N_("Produce code relocatable at runtime") },                       \
-  { "no-relocatable-lib", -MASK_RELOCATABLE,                           \
-    N_("Don't produce code relocatable at runtime") },                 \
-  { "little-endian",    MASK_LITTLE_ENDIAN,                            \
-    N_("Produce little endian code") },                                        \
-  { "little",           MASK_LITTLE_ENDIAN,                            \
-    N_("Produce little endian code") },                                        \
-  { "big-endian",      -MASK_LITTLE_ENDIAN,                            \
-    N_("Produce big endian code") },                                   \
-  { "big",             -MASK_LITTLE_ENDIAN,                            \
-    N_("Produce big endian code") },                                   \
-  { "no-toc",           0, N_("no description yet") },                 \
-  { "toc",              MASK_MINIMAL_TOC, N_("no description yet") },  \
-  { "full-toc",                 MASK_MINIMAL_TOC, N_("no description yet") },  \
-  { "prototype",        MASK_PROTOTYPE, N_("no description yet") },    \
-  { "no-prototype",    -MASK_PROTOTYPE, N_("no description yet") },    \
-  { "no-traceback",     0, N_("no description yet") },                 \
-  { "eabi",             MASK_EABI, N_("Use EABI") },                   \
-  { "no-eabi",         -MASK_EABI, N_("Don't use EABI") },             \
-  { "bit-word",                -MASK_NO_BITFIELD_WORD, "" },                   \
-  { "no-bit-word",      MASK_NO_BITFIELD_WORD,                         \
-    N_("Do not allow bit-fields to cross word boundaries") },          \
-  { "regnames",                  MASK_REGNAMES,                                \
-    N_("Use alternate register names") },                              \
-  { "no-regnames",      -MASK_REGNAMES,                                \
-    N_("Don't use alternate register names") },                                \
-  { "sdata",            0, N_("no description yet") },                 \
-  { "no-sdata",                 0, N_("no description yet") },                 \
-  { "sim",              0,                                             \
-    N_("Link with libsim.a, libc.a and sim-crt0.o") },                 \
-  { "ads",              0,                                             \
-    N_("Link with libads.a, libc.a and crt0.o") },                     \
-  { "yellowknife",      0,                                             \
-    N_("Link with libyk.a, libc.a and crt0.o") },                      \
-  { "mvme",             0,                                             \
-    N_("Link with libmvme.a, libc.a and crt0.o") },                    \
-  { "emb",              0,                                             \
-    N_("Set the PPC_EMB bit in the ELF flags header") },               \
-  { "windiss",           0, N_("Use the WindISS simulator") },          \
-  { "shlib",            0, N_("no description yet") },                 \
-  EXTRA_SUBTARGET_SWITCHES                                             \
-  { "newlib",           0, N_("no description yet") },
-
-/* This is meant to be redefined in the host dependent files.  */
-#define EXTRA_SUBTARGET_SWITCHES
-
 /* Sometimes certain combinations of command options do not make sense
    on a particular target machine.  You can define a macro
    `OVERRIDE_OPTIONS' to take account of this.  This macro, if
@@ -171,6 +84,9 @@ do {                                                                 \
   if (!g_switch_set)                                                   \
     g_switch_value = SDATA_DEFAULT_SIZE;                               \
                                                                        \
+  if (rs6000_abi_name == NULL)                                         \
+    rs6000_abi_name = RS6000_ABI_NAME;                                 \
+                                                                       \
   if (!strcmp (rs6000_abi_name, "sysv"))                               \
     rs6000_current_abi = ABI_V4;                                       \
   else if (!strcmp (rs6000_abi_name, "sysv-noeabi"))                   \
@@ -189,11 +105,18 @@ do {                                                                      \
   else if (!strcmp (rs6000_abi_name, "freebsd"))                       \
     rs6000_current_abi = ABI_V4;                                       \
   else if (!strcmp (rs6000_abi_name, "linux"))                         \
-    rs6000_current_abi = ABI_V4;                                       \
+    {                                                                  \
+      if (TARGET_64BIT)                                                        \
+       rs6000_current_abi = ABI_AIX;                                   \
+      else                                                             \
+       rs6000_current_abi = ABI_V4;                                    \
+    }                                                                  \
   else if (!strcmp (rs6000_abi_name, "gnu"))                           \
     rs6000_current_abi = ABI_V4;                                       \
   else if (!strcmp (rs6000_abi_name, "netbsd"))                                \
     rs6000_current_abi = ABI_V4;                                       \
+  else if (!strcmp (rs6000_abi_name, "openbsd"))                       \
+    rs6000_current_abi = ABI_V4;                                       \
   else if (!strcmp (rs6000_abi_name, "i960-old"))                      \
     {                                                                  \
       rs6000_current_abi = ABI_V4;                                     \
@@ -251,7 +174,8 @@ do {                                                                        \
             rs6000_sdata_name);                                        \
     }                                                                  \
                                                                        \
-  if (rs6000_sdata != SDATA_NONE && DEFAULT_ABI != ABI_V4)             \
+  if ((rs6000_sdata != SDATA_NONE && DEFAULT_ABI != ABI_V4)            \
+      || (rs6000_sdata == SDATA_EABI && !TARGET_EABI))                 \
     {                                                                  \
       rs6000_sdata = SDATA_NONE;                                       \
       error ("-msdata=%s and -mcall-%s are incompatible",              \
@@ -273,7 +197,7 @@ do {                                                                        \
             rs6000_abi_name);                                          \
     }                                                                  \
                                                                        \
-  if (flag_pic > 1 && rs6000_current_abi == ABI_AIX)                   \
+  if (!TARGET_64BIT && flag_pic > 1 && rs6000_current_abi == ABI_AIX)  \
     {                                                                  \
       flag_pic = 0;                                                    \
       error ("-fPIC and -mcall-%s are incompatible",                   \
@@ -286,15 +210,30 @@ do {                                                                      \
       error ("-mcall-aixdesc must be big endian");                     \
     }                                                                  \
                                                                        \
+  if (TARGET_SECURE_PLT != secure_plt)                                 \
+    {                                                                  \
+      error ("-msecure-plt not supported by your assembler");          \
+    }                                                                  \
+                                                                       \
   /* Treat -fPIC the same as -mrelocatable.  */                                \
   if (flag_pic > 1 && DEFAULT_ABI != ABI_AIX)                          \
-    target_flags |= MASK_RELOCATABLE | MASK_MINIMAL_TOC | MASK_NO_FP_IN_TOC; \
+    {                                                                  \
+      target_flags |= MASK_RELOCATABLE | MASK_MINIMAL_TOC;             \
+      TARGET_NO_FP_IN_TOC = 1;                                         \
+    }                                                                  \
                                                                        \
   else if (TARGET_RELOCATABLE)                                         \
     flag_pic = 2;                                                      \
-                                                                       \
 } while (0)
 
+#ifndef RS6000_BI_ARCH
+# define SUBSUBTARGET_OVERRIDE_OPTIONS                                 \
+do {                                                                   \
+  if ((TARGET_DEFAULT ^ target_flags) & MASK_64BIT)                    \
+    error ("-m%s not supported in this configuration",                 \
+          (target_flags & MASK_64BIT) ? "64" : "32");                  \
+} while (0)
+#endif
 
 /* Override rs6000.h definition.  */
 #undef TARGET_DEFAULT
@@ -304,16 +243,15 @@ do {                                                                      \
 #undef PROCESSOR_DEFAULT
 #define        PROCESSOR_DEFAULT PROCESSOR_PPC750
 
+/* SVR4 only defined for PowerPC, so short-circuit POWER patterns.  */
+#undef  TARGET_POWER
+#define TARGET_POWER 0
+
 #define FIXED_R2 1
 /* System V.4 uses register 13 as a pointer to the small data area,
    so it is not available to the normal user.  */
 #define FIXED_R13 1
 
-/* Size of the V.4 varargs area if needed.  */
-/* Override rs6000.h definition.  */
-#undef RS6000_VARARGS_AREA
-#define RS6000_VARARGS_AREA ((cfun->machine->sysv_varargs_p) ? RS6000_VARARGS_SIZE : 0)
-
 /* Override default big endianism definitions in rs6000.h.  */
 #undef BYTES_BIG_ENDIAN
 #undef WORDS_BIG_ENDIAN
@@ -322,7 +260,7 @@ do {                                                                        \
 
 /* Define this to set the endianness to use in libgcc2.c, which can
    not depend on target_flags.  */
-#if !defined(_LITTLE_ENDIAN) && !defined(__sun__)
+#if !defined(__LITTLE_ENDIAN__) && !defined(__sun__)
 #define LIBGCC2_WORDS_BIG_ENDIAN 1
 #else
 #define LIBGCC2_WORDS_BIG_ENDIAN 0
@@ -370,14 +308,24 @@ do {                                                                      \
 #undef STRICT_ALIGNMENT
 #define        STRICT_ALIGNMENT (TARGET_STRICT_ALIGN)
 
-/* Alignment in bits of the stack boundary.  Note, in order to allow building
-   one set of libraries with -mno-eabi instead of eabi libraries and non-eabi
-   versions, just use 64 as the stack boundary.  */
-#undef STACK_BOUNDARY
-#define        STACK_BOUNDARY  (TARGET_ALTIVEC_ABI ? 128 : 64)
+/* Define this macro if you wish to preserve a certain alignment for
+   the stack pointer, greater than what the hardware enforces.  The
+   definition is a C expression for the desired alignment (measured
+   in bits).  This macro must evaluate to a value equal to or larger
+   than STACK_BOUNDARY.
+   For the SYSV ABI and variants the alignment of the stack pointer
+   is usually controlled manually in rs6000.c. However, to maintain
+   alignment across alloca () in all circumstances,
+   PREFERRED_STACK_BOUNDARY needs to be set as well.
+   This has the additional advantage of allowing a bigger maximum
+   alignment of user objects on the stack.  */
+
+#undef PREFERRED_STACK_BOUNDARY
+#define PREFERRED_STACK_BOUNDARY 128
 
 /* Real stack boundary as mandated by the appropriate ABI.  */
-#define ABI_STACK_BOUNDARY ((TARGET_EABI && !TARGET_ALTIVEC_ABI) ? 64 : 128)
+#define ABI_STACK_BOUNDARY \
+  ((TARGET_EABI && !TARGET_ALTIVEC && !TARGET_ALTIVEC_ABI) ? 64 : 128)
 
 /* An expression for the alignment of a structure field FIELD if the
    alignment computed in the usual way is COMPUTED.  */
@@ -385,15 +333,6 @@ do {                                                                       \
        ((TARGET_ALTIVEC && TREE_CODE (TREE_TYPE (FIELD)) == VECTOR_TYPE)     \
         ? 128 : COMPUTED)
 
-/* Define this macro as an expression for the alignment of a type
-   (given by TYPE as a tree node) if the alignment computed in the
-   usual way is COMPUTED and the alignment explicitly specified was
-   SPECIFIED.  */
-#define ROUND_TYPE_ALIGN(TYPE, COMPUTED, SPECIFIED)                    \
-       ((TARGET_ALTIVEC  && TREE_CODE (TYPE) == VECTOR_TYPE)           \
-        ? MAX (MAX ((COMPUTED), (SPECIFIED)), 128)                     \
-         : MAX (COMPUTED, SPECIFIED))
-
 #undef  BIGGEST_FIELD_ALIGNMENT
 
 /* Use ELF style section commands.  */
@@ -423,126 +362,8 @@ do {                                                                      \
 #define        SDATA2_SECTION_ASM_OP "\t.section\t\".sdata2\",\"a\""
 #define        SBSS_SECTION_ASM_OP "\t.section\t\".sbss\",\"aw\",@nobits"
 
-/* Besides the usual ELF sections, we need a toc section.  */
-/* Override elfos.h definition.  */
-#undef EXTRA_SECTIONS
-#define        EXTRA_SECTIONS in_toc, in_sdata, in_sdata2, in_sbss, in_init, in_fini
-
-/* Override elfos.h definition.  */
-#undef EXTRA_SECTION_FUNCTIONS
-#define        EXTRA_SECTION_FUNCTIONS                                         \
-  TOC_SECTION_FUNCTION                                                 \
-  SDATA_SECTION_FUNCTION                                               \
-  SDATA2_SECTION_FUNCTION                                              \
-  SBSS_SECTION_FUNCTION                                                        \
-  INIT_SECTION_FUNCTION                                                        \
-  FINI_SECTION_FUNCTION
-
-#define        TOC_SECTION_FUNCTION                                            \
-void                                                                   \
-toc_section ()                                                         \
-{                                                                      \
-  if (in_section != in_toc)                                            \
-    {                                                                  \
-      in_section = in_toc;                                             \
-      if (DEFAULT_ABI == ABI_AIX                                       \
-         && TARGET_MINIMAL_TOC                                         \
-         && !TARGET_RELOCATABLE)                                       \
-       {                                                               \
-         if (! toc_initialized)                                        \
-           {                                                           \
-             toc_initialized = 1;                                      \
-             fprintf (asm_out_file, "%s\n", TOC_SECTION_ASM_OP);       \
-             (*targetm.asm_out.internal_label) (asm_out_file, "LCTOC", 0); \
-             fprintf (asm_out_file, "\t.tc ");                         \
-             ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1[TC],"); \
-             ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1"); \
-             fprintf (asm_out_file, "\n");                             \
-                                                                       \
-             fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP); \
-             ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1"); \
-             fprintf (asm_out_file, " = .+32768\n");                   \
-           }                                                           \
-         else                                                          \
-           fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP); \
-       }                                                               \
-      else if (DEFAULT_ABI == ABI_AIX && !TARGET_RELOCATABLE)          \
-       fprintf (asm_out_file, "%s\n", TOC_SECTION_ASM_OP);             \
-      else                                                             \
-       {                                                               \
-         fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);   \
-         if (! toc_initialized)                                        \
-           {                                                           \
-             ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1"); \
-             fprintf (asm_out_file, " = .+32768\n");                   \
-             toc_initialized = 1;                                      \
-           }                                                           \
-       }                                                               \
-    }                                                                  \
-}                                                                      \
-                                                                       \
-extern int in_toc_section PARAMS ((void));                             \
-int in_toc_section ()                                                  \
-{                                                                      \
-  return in_section == in_toc;                                         \
-}
-
-#define        SDATA_SECTION_FUNCTION                                          \
-void                                                                   \
-sdata_section ()                                                       \
-{                                                                      \
-  if (in_section != in_sdata)                                          \
-    {                                                                  \
-      in_section = in_sdata;                                           \
-      fprintf (asm_out_file, "%s\n", SDATA_SECTION_ASM_OP);            \
-    }                                                                  \
-}
-
-#define        SDATA2_SECTION_FUNCTION                                         \
-void                                                                   \
-sdata2_section ()                                                      \
-{                                                                      \
-  if (in_section != in_sdata2)                                         \
-    {                                                                  \
-      in_section = in_sdata2;                                          \
-      fprintf (asm_out_file, "%s\n", SDATA2_SECTION_ASM_OP);           \
-    }                                                                  \
-}
-
-#define        SBSS_SECTION_FUNCTION                                           \
-void                                                                   \
-sbss_section ()                                                                \
-{                                                                      \
-  if (in_section != in_sbss)                                           \
-    {                                                                  \
-      in_section = in_sbss;                                            \
-      fprintf (asm_out_file, "%s\n", SBSS_SECTION_ASM_OP);             \
-    }                                                                  \
-}
-
-#define        INIT_SECTION_FUNCTION                                           \
-void                                                                   \
-init_section ()                                                                \
-{                                                                      \
-  if (in_section != in_init)                                           \
-    {                                                                  \
-      in_section = in_init;                                            \
-      fprintf (asm_out_file, "%s\n", INIT_SECTION_ASM_OP);             \
-    }                                                                  \
-}
-
-#define        FINI_SECTION_FUNCTION                                           \
-void                                                                   \
-fini_section ()                                                                \
-{                                                                      \
-  if (in_section != in_fini)                                           \
-    {                                                                  \
-      in_section = in_fini;                                            \
-      fprintf (asm_out_file, "%s\n", FINI_SECTION_ASM_OP);             \
-    }                                                                  \
-}
-
 /* Override default elf definitions.  */
+#define TARGET_ASM_INIT_SECTIONS rs6000_elf_asm_init_sections
 #undef TARGET_ASM_SELECT_RTX_SECTION
 #define        TARGET_ASM_SELECT_RTX_SECTION rs6000_elf_select_rtx_section
 #undef TARGET_ASM_SELECT_SECTION
@@ -572,7 +393,7 @@ fini_section ()                                                             \
        || (!TARGET_NO_FP_IN_TOC                                                \
           && !TARGET_RELOCATABLE                                       \
           && GET_CODE (X) == CONST_DOUBLE                              \
-          && GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT               \
+          && SCALAR_FLOAT_MODE_P (GET_MODE (X))                        \
           && BITS_PER_WORD == HOST_BITS_PER_INT)))
 
 /* These macros generate the special .type and .size directives which
@@ -589,51 +410,7 @@ extern int rs6000_pic_labelno;
 /* Override elfos.h definition.  */
 #undef ASM_DECLARE_FUNCTION_NAME
 #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL)                    \
-  do {                                                                 \
-    const char *const init_ptr = (TARGET_64BIT) ? ".quad" : ".long";   \
-                                                                       \
-    if (TARGET_RELOCATABLE                                             \
-       && (get_pool_size () != 0 || current_function_profile)          \
-       && uses_TOC())                                                  \
-      {                                                                        \
-       char buf[256];                                                  \
-                                                                       \
-       (*targetm.asm_out.internal_label) (FILE, "LCL", rs6000_pic_labelno); \
-                                                                       \
-       ASM_GENERATE_INTERNAL_LABEL (buf, "LCTOC", 1);                  \
-       fprintf (FILE, "\t%s ", init_ptr);                              \
-       assemble_name (FILE, buf);                                      \
-       putc ('-', FILE);                                               \
-       ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);   \
-       assemble_name (FILE, buf);                                      \
-       putc ('\n', FILE);                                              \
-      }                                                                        \
-                                                                       \
-    ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "function");                        \
-    ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL));                     \
-                                                                       \
-    if (DEFAULT_ABI == ABI_AIX)                                                \
-      {                                                                        \
-       const char *desc_name, *orig_name;                              \
-                                                                       \
-        orig_name = (*targetm.strip_name_encoding) (NAME);             \
-        desc_name = orig_name;                                         \
-       while (*desc_name == '.')                                       \
-         desc_name++;                                                  \
-                                                                       \
-       if (TREE_PUBLIC (DECL))                                         \
-         fprintf (FILE, "\t.globl %s\n", desc_name);                   \
-                                                                       \
-       fprintf (FILE, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);             \
-       fprintf (FILE, "%s:\n", desc_name);                             \
-       fprintf (FILE, "\t%s %s\n", init_ptr, orig_name);               \
-       fprintf (FILE, "\t%s _GLOBAL_OFFSET_TABLE_\n", init_ptr);       \
-       if (DEFAULT_ABI == ABI_AIX)                                     \
-         fprintf (FILE, "\t%s 0\n", init_ptr);                         \
-       fprintf (FILE, "\t.previous\n");                                \
-      }                                                                        \
-    ASM_OUTPUT_LABEL (FILE, NAME);                                     \
-  } while (0)
+  rs6000_elf_declare_function_name ((FILE), (NAME), (DECL))
 
 /* The USER_LABEL_PREFIX stuff is affected by the -fleading-underscore
    flag.  The LOCAL_LABEL_PREFIX variable is used by dbxelf.h.  */
@@ -658,14 +435,12 @@ extern int rs6000_pic_labelno;
 
 #define        LCOMM_ASM_OP    "\t.lcomm\t"
 
-/* Override elfos.h definition.  */
-#undef ASM_OUTPUT_ALIGNED_LOCAL
-#define        ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN)               \
+/* Describe how to emit uninitialized local items.  */
+#define        ASM_OUTPUT_ALIGNED_DECL_LOCAL(FILE, DECL, NAME, SIZE, ALIGN)    \
 do {                                                                   \
-  if (rs6000_sdata != SDATA_NONE && (SIZE) > 0                         \
-      && (SIZE) <= g_switch_value)                                     \
+  if ((DECL) && rs6000_elf_in_small_data_p (DECL))                     \
     {                                                                  \
-      sbss_section ();                                                 \
+      switch_to_section (sbss_section);                                        \
       ASM_OUTPUT_ALIGN (FILE, exact_log2 (ALIGN / BITS_PER_UNIT));     \
       ASM_OUTPUT_LABEL (FILE, NAME);                                   \
       ASM_OUTPUT_SKIP (FILE, SIZE);                                    \
@@ -676,7 +451,8 @@ do {                                                                        \
     {                                                                  \
       fprintf (FILE, "%s", LCOMM_ASM_OP);                              \
       assemble_name ((FILE), (NAME));                                  \
-      fprintf ((FILE), ",%u,%u\n", (SIZE), (ALIGN) / BITS_PER_UNIT);   \
+      fprintf ((FILE), ","HOST_WIDE_INT_PRINT_UNSIGNED",%u\n",         \
+              (SIZE), (ALIGN) / BITS_PER_UNIT);                        \
     }                                                                  \
   ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "object");                    \
 } while (0)
@@ -684,7 +460,7 @@ do {                                                                        \
 /* Describe how to emit uninitialized external linkage items.  */
 #define        ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN)           \
 do {                                                                   \
-  ASM_OUTPUT_ALIGNED_LOCAL (FILE, NAME, SIZE, ALIGN);                  \
+  ASM_OUTPUT_ALIGNED_DECL_LOCAL (FILE, DECL, NAME, SIZE, ALIGN);       \
 } while (0)
 
 #ifdef HAVE_GAS_MAX_SKIP_P2ALIGN
@@ -740,16 +516,6 @@ do {                                                                       \
    || (CHAR) == 'L' || (CHAR) == 'A' || (CHAR) == 'V'                  \
    || (CHAR) == 'B' || (CHAR) == 'b' || (CHAR) == 'G')
 
-/* Output .file.  */
-/* Override elfos.h definition.  */
-#undef ASM_FILE_START
-#define        ASM_FILE_START(FILE)                                            \
-do {                                                                   \
-  output_file_directive ((FILE), main_input_filename);                 \
-  rs6000_file_start (FILE, TARGET_CPU_DEFAULT);                                \
-} while (0)
-
-
 extern int fixuplabelno;
 
 /* Handle constructors specially for -mrelocatable.  */
@@ -785,18 +551,28 @@ extern int fixuplabelno;
 #define        TARGET_VERSION fprintf (stderr, " (PowerPC System V.4)");
 #endif
 \f
+#define TARGET_OS_SYSV_CPP_BUILTINS()          \
+  do                                           \
+    {                                          \
+      if (target_flags_explicit                        \
+         & MASK_RELOCATABLE)                   \
+       builtin_define ("_RELOCATABLE");        \
+    }                                          \
+  while (0)
+
 #ifndef        TARGET_OS_CPP_BUILTINS
-#define TARGET_OS_CPP_BUILTINS()          \
-  do                                      \
-    {                                     \
-      builtin_define_std ("PPC");         \
-      builtin_define_std ("unix");        \
-      builtin_define ("__svr4__");        \
-      builtin_assert ("system=unix");     \
-      builtin_assert ("system=svr4");     \
-      builtin_assert ("cpu=powerpc");     \
-      builtin_assert ("machine=powerpc"); \
-    }                                     \
+#define TARGET_OS_CPP_BUILTINS()               \
+  do                                           \
+    {                                          \
+      builtin_define_std ("PPC");              \
+      builtin_define_std ("unix");             \
+      builtin_define ("__svr4__");             \
+      builtin_assert ("system=unix");          \
+      builtin_assert ("system=svr4");          \
+      builtin_assert ("cpu=powerpc");          \
+      builtin_assert ("machine=powerpc");      \
+      TARGET_OS_SYSV_CPP_BUILTINS ();          \
+    }                                          \
   while (0)
 #endif
 
@@ -806,13 +582,14 @@ extern int fixuplabelno;
 #define        ASM_SPEC "%(asm_cpu) \
 %{.s: %{mregnames} %{mno-regnames}} %{.S: %{mregnames} %{mno-regnames}} \
 %{v:-V} %{Qy:} %{!Qn:-Qy} %{n} %{T} %{Ym,*} %{Yd,*} %{Wa,*:%*} \
-%{mrelocatable} %{mrelocatable-lib} %{fpic:-K PIC} %{fPIC:-K PIC} \
+%{mrelocatable} %{mrelocatable-lib} %{fpic|fpie|fPIC|fPIE:-K PIC} \
 %{memb|msdata|msdata=eabi: -memb} \
 %{mlittle|mlittle-endian:-mlittle; \
   mbig|mbig-endian      :-mbig;    \
   mcall-aixdesc |                 \
   mcall-freebsd |                 \
   mcall-netbsd  |                 \
+  mcall-openbsd |                 \
   mcall-linux   |                 \
   mcall-gnu             :-mbig;    \
   mcall-i960-old        :-mlittle}"
@@ -828,6 +605,10 @@ extern int fixuplabelno;
 
 #define        CC1_ENDIAN_DEFAULT_SPEC "%(cc1_endian_big)"
 
+#ifndef CC1_SECURE_PLT_DEFAULT_SPEC
+#define CC1_SECURE_PLT_DEFAULT_SPEC ""
+#endif
+
 /* Pass -G xxx to the compiler and set correct endian mode.  */
 #define        CC1_SPEC "%{G*} \
 %{mlittle|mlittle-endian: %(cc1_endian_little);           \
@@ -835,11 +616,11 @@ extern int fixuplabelno;
   mcall-aixdesc |                                        \
   mcall-freebsd |                                        \
   mcall-netbsd  |                                        \
+  mcall-openbsd |                                        \
   mcall-linux   |                                        \
   mcall-gnu             : -mbig %(cc1_endian_big);        \
   mcall-i960-old        : -mlittle %(cc1_endian_little);  \
                         : %(cc1_endian_default)}          \
-%{mno-sdata: -msdata=none } \
 %{meabi: %{!mcall-*: -mcall-sysv }} \
 %{!meabi: %{!mno-eabi: \
     %{mrelocatable: -meabi } \
@@ -847,13 +628,15 @@ extern int fixuplabelno;
     %{mcall-i960-old: -meabi } \
     %{mcall-linux: -mno-eabi } \
     %{mcall-gnu: -mno-eabi } \
-    %{mcall-netbsd: -mno-eabi }}} \
+    %{mcall-netbsd: -mno-eabi } \
+    %{mcall-openbsd: -mno-eabi }}} \
 %{msdata: -msdata=default} \
 %{mno-sdata: -msdata=none} \
+%{!mbss-plt: %{!msecure-plt: %(cc1_secure_plt_default)}} \
 %{profile: -p}"
 
 /* Don't put -Y P,<path> for cross compilers.  */
-#ifndef CROSS_COMPILE
+#ifndef CROSS_DIRECTORY_STRUCTURE
 #define LINK_PATH_SPEC "\
 %{!R*:%{L*:-R %*}} \
 %{!nostdlib: %{!YP,*: \
@@ -880,6 +663,7 @@ extern int fixuplabelno;
   mcall-linux  : %(link_start_linux)       ; \
   mcall-gnu    : %(link_start_gnu)         ; \
   mcall-netbsd : %(link_start_netbsd)      ; \
+  mcall-openbsd: %(link_start_openbsd)     ; \
                : %(link_start_default)     }"
 
 #define LINK_START_DEFAULT_SPEC ""
@@ -937,18 +721,14 @@ extern int fixuplabelno;
   mcall-linux  : %(link_os_linux)       ; \
   mcall-gnu    : %(link_os_gnu)         ; \
   mcall-netbsd : %(link_os_netbsd)      ; \
+  mcall-openbsd: %(link_os_openbsd)     ; \
                : %(link_os_default)     }"
 
 #define LINK_OS_DEFAULT_SPEC ""
 
-#define CPP_SYSV_SPEC \
-"%{mrelocatable*: -D_RELOCATABLE} \
-%{fpic: -D__PIC__=1 -D__pic__=1} \
-%{!fpic: %{fPIC: -D__PIC__=2 -D__pic__=2}}"
-
 /* Override rs6000.h definition.  */
 #undef CPP_SPEC
-#define        CPP_SPEC "%{posix: -D_POSIX_SOURCE} %(cpp_sysv) \
+#define        CPP_SPEC "%{posix: -D_POSIX_SOURCE} \
 %{mads         : %(cpp_os_ads)         ; \
   myellowknife : %(cpp_os_yellowknife) ; \
   mmvme        : %(cpp_os_mvme)        ; \
@@ -958,6 +738,7 @@ extern int fixuplabelno;
   mcall-linux  : %(cpp_os_linux)       ; \
   mcall-gnu    : %(cpp_os_gnu)         ; \
   mcall-netbsd : %(cpp_os_netbsd)      ; \
+  mcall-openbsd: %(cpp_os_openbsd)     ; \
                : %(cpp_os_default)     }"
 
 #define        CPP_OS_DEFAULT_SPEC ""
@@ -974,6 +755,7 @@ extern int fixuplabelno;
   mcall-linux  : %(startfile_linux)       ; \
   mcall-gnu    : %(startfile_gnu)         ; \
   mcall-netbsd : %(startfile_netbsd)      ; \
+  mcall-openbsd: %(startfile_openbsd)     ; \
                : %(startfile_default)     }"
 
 #define        STARTFILE_DEFAULT_SPEC ""
@@ -990,6 +772,7 @@ extern int fixuplabelno;
   mcall-linux  : %(lib_linux)       ; \
   mcall-gnu    : %(lib_gnu)         ; \
   mcall-netbsd : %(lib_netbsd)      ; \
+  mcall-openbsd: %(lib_openbsd)     ; \
                : %(lib_default)     }"
 
 #define LIB_DEFAULT_SPEC ""
@@ -1006,6 +789,7 @@ extern int fixuplabelno;
   mcall-linux  : crtsavres.o%s        %(endfile_linux)       ; \
   mcall-gnu    : crtsavres.o%s        %(endfile_gnu)         ; \
   mcall-netbsd : crtsavres.o%s        %(endfile_netbsd)      ; \
+  mcall-openbsd: crtsavres.o%s        %(endfile_openbsd)     ; \
                : %(crtsavres_default) %(endfile_default)     }"
 
 #define CRTSAVRES_DEFAULT_SPEC "crtsavres.o%s"
@@ -1076,59 +860,64 @@ extern int fixuplabelno;
 #define LINK_START_FREEBSD_SPEC        ""
 
 #define LINK_OS_FREEBSD_SPEC "\
+  %{p:%nconsider using `-pg' instead of `-p' with gprof(1)} \
+  %{v:-V} \
+  %{assert*} %{R*} %{rpath*} %{defsym*} \
+  %{shared:-Bshareable %{h*} %{soname*}} \
+  %{!shared: \
+    %{!static: \
+      %{rdynamic: -export-dynamic} \
+      %{!dynamic-linker:-dynamic-linker %(fbsd_dynamic_linker) }} \
+    %{static:-Bstatic}} \
   %{symbolic:-Bsymbolic}"
 
 /* GNU/Linux support.  */
-#ifdef USE_GNULIBC_1
 #define LIB_LINUX_SPEC "%{mnewlib: --start-group -llinux -lc --end-group } \
-%{!mnewlib: -lc }"
-#else
-#define LIB_LINUX_SPEC "%{mnewlib: --start-group -llinux -lc --end-group } \
-%{!mnewlib: %{shared:-lc} %{!shared: %{pthread:-lpthread } \
-%{profile:-lc_p} %{!profile:-lc}}}"
-#endif
+%{!mnewlib: %{pthread:-lpthread} %{shared:-lc} \
+%{!shared: %{profile:-lc_p} %{!profile:-lc}}}"
 
-#ifdef USE_GNULIBC_1
+#ifdef HAVE_LD_PIE
 #define        STARTFILE_LINUX_SPEC "\
-%{!shared: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}} \
-%{mnewlib: ecrti.o%s} %{!mnewlib: crti.o%s} \
-%{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}"
+%{!shared: %{pg|p|profile:gcrt1.o%s;pie:Scrt1.o%s;:crt1.o%s}} \
+%{mnewlib:ecrti.o%s;:crti.o%s} \
+%{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}"
 #else
 #define        STARTFILE_LINUX_SPEC "\
-%{!shared: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}} \
-%{mnewlib: ecrti.o%s} %{!mnewlib: crti.o%s} \
-%{static:crtbeginT.o%s} \
-%{!static:%{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}}"
+%{!shared: %{pg|p|profile:gcrt1.o%s;:crt1.o%s}} \
+%{mnewlib:ecrti.o%s;:crti.o%s} \
+%{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}"
 #endif
 
-#define        ENDFILE_LINUX_SPEC "%{!shared:crtend.o%s} %{shared:crtendS.o%s} \
-%{mnewlib: ecrtn.o%s} %{!mnewlib: crtn.o%s}"
+#define        ENDFILE_LINUX_SPEC "\
+%{shared|pie:crtendS.o%s;:crtend.o%s} \
+%{mnewlib:ecrtn.o%s;:crtn.o%s}"
 
 #define LINK_START_LINUX_SPEC ""
 
+#define GLIBC_DYNAMIC_LINKER "/lib/ld.so.1"
+#define UCLIBC_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
+#if UCLIBC_DEFAULT
+#define CHOOSE_DYNAMIC_LINKER(G, U) "%{mglibc:%{muclibc:%e-mglibc and -muclibc used together}" G ";:" U "}"
+#else
+#define CHOOSE_DYNAMIC_LINKER(G, U) "%{muclibc:%{mglibc:%e-mglibc and -muclibc used together}" U ";:" G "}"
+#endif
+#define LINUX_DYNAMIC_LINKER \
+  CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER, UCLIBC_DYNAMIC_LINKER)
+
 #define LINK_OS_LINUX_SPEC "-m elf32ppclinux %{!shared: %{!static: \
   %{rdynamic:-export-dynamic} \
-  %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}}}"
+  %{!dynamic-linker:-dynamic-linker " LINUX_DYNAMIC_LINKER "}}}"
 
-#if !defined(USE_GNULIBC_1) && defined(HAVE_LD_EH_FRAME_HDR)
+#if defined(HAVE_LD_EH_FRAME_HDR)
 # define LINK_EH_SPEC "%{!static:--eh-frame-hdr} "
 #endif
 
-#ifdef USE_GNULIBC_1
-#define CPP_OS_LINUX_SPEC "-D__unix__ -D__gnu_linux__ -D__linux__ \
-%{!undef:                                                        \
-  %{!ansi:                                                       \
-    %{!std=*:-Dunix -D__unix -Dlinux -D__linux}                          \
-    %{std=gnu*:-Dunix -D__unix -Dlinux -D__linux}}}              \
--Asystem=unix -Asystem=posix"
-#else
 #define CPP_OS_LINUX_SPEC "-D__unix__ -D__gnu_linux__ -D__linux__ \
 %{!undef:                                                        \
   %{!ansi:                                                       \
     %{!std=*:-Dunix -D__unix -Dlinux -D__linux}                          \
     %{std=gnu*:-Dunix -D__unix -Dlinux -D__linux}}}              \
--Asystem=unix -Asystem=posix %{pthread:-D_REENTRANT}"
-#endif
+-Asystem=linux -Asystem=unix -Asystem=posix %{pthread:-D_REENTRANT}"
 
 /* GNU/Hurd support.  */
 #define LIB_GNU_SPEC "%{mnewlib: --start-group -lgnu -lc --end-group } \
@@ -1176,7 +965,35 @@ ncrtn.o%s"
   %{!dynamic-linker:-dynamic-linker /usr/libexec/ld.elf_so}}}"
 
 #define CPP_OS_NETBSD_SPEC "\
--D__powerpc__ -D__NetBSD__ -D__ELF__ -D__KPRINTF_ATTRIBUTE__"
+-D__powerpc__ -D__NetBSD__ -D__KPRINTF_ATTRIBUTE__"
+
+/* OpenBSD support.  */
+#ifndef        LIB_OPENBSD_SPEC
+#define LIB_OPENBSD_SPEC "%{!shared:%{pthread:-lpthread%{p:_p}%{!p:%{pg:_p}}}} %{!shared:-lc%{p:_p}%{!p:%{pg:_p}}}"
+#endif
+
+#ifndef        STARTFILE_OPENBSD_SPEC
+#define        STARTFILE_OPENBSD_SPEC "\
+%{!shared: %{pg:gcrt0.o%s} %{!pg:%{p:gcrt0.o%s} %{!p:crt0.o%s}}} \
+%{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}"
+#endif
+
+#ifndef        ENDFILE_OPENBSD_SPEC
+#define        ENDFILE_OPENBSD_SPEC "\
+%{!shared:crtend.o%s} %{shared:crtendS.o%s}"
+#endif
+
+#ifndef LINK_START_OPENBSD_SPEC
+#define LINK_START_OPENBSD_SPEC "-Ttext 0x400074"
+#endif
+
+#ifndef LINK_OS_OPENBSD_SPEC
+#define LINK_OS_OPENBSD_SPEC ""
+#endif
+
+#ifndef CPP_OS_OPENBSD_SPEC
+#define CPP_OS_OPENBSD_SPEC "%{posix:-D_POSIX_SOURCE} %{pthread:-D_POSIX_THREADS}"
+#endif
 
 /* WindISS support.  */
 
@@ -1201,8 +1018,7 @@ ncrtn.o%s"
 /* Override rs6000.h definition.  */
 #undef SUBTARGET_EXTRA_SPECS
 #define        SUBTARGET_EXTRA_SPECS                                           \
-  { "cpp_sysv",                        CPP_SYSV_SPEC },                        \
-  { "crtsavres_default",        CRTSAVRES_DEFAULT_SPEC },              \
+  { "crtsavres_default",       CRTSAVRES_DEFAULT_SPEC },               \
   { "lib_ads",                 LIB_ADS_SPEC },                         \
   { "lib_yellowknife",         LIB_YELLOWKNIFE_SPEC },                 \
   { "lib_mvme",                        LIB_MVME_SPEC },                        \
@@ -1211,7 +1027,8 @@ ncrtn.o%s"
   { "lib_gnu",                 LIB_GNU_SPEC },                         \
   { "lib_linux",               LIB_LINUX_SPEC },                       \
   { "lib_netbsd",              LIB_NETBSD_SPEC },                      \
-  { "lib_windiss",              LIB_WINDISS_SPEC },                     \
+  { "lib_openbsd",             LIB_OPENBSD_SPEC },                     \
+  { "lib_windiss",             LIB_WINDISS_SPEC },                     \
   { "lib_default",             LIB_DEFAULT_SPEC },                     \
   { "startfile_ads",           STARTFILE_ADS_SPEC },                   \
   { "startfile_yellowknife",   STARTFILE_YELLOWKNIFE_SPEC },           \
@@ -1221,7 +1038,8 @@ ncrtn.o%s"
   { "startfile_gnu",           STARTFILE_GNU_SPEC },                   \
   { "startfile_linux",         STARTFILE_LINUX_SPEC },                 \
   { "startfile_netbsd",                STARTFILE_NETBSD_SPEC },                \
-  { "startfile_windiss",        STARTFILE_WINDISS_SPEC },               \
+  { "startfile_openbsd",       STARTFILE_OPENBSD_SPEC },               \
+  { "startfile_windiss",       STARTFILE_WINDISS_SPEC },               \
   { "startfile_default",       STARTFILE_DEFAULT_SPEC },               \
   { "endfile_ads",             ENDFILE_ADS_SPEC },                     \
   { "endfile_yellowknife",     ENDFILE_YELLOWKNIFE_SPEC },             \
@@ -1231,7 +1049,8 @@ ncrtn.o%s"
   { "endfile_gnu",             ENDFILE_GNU_SPEC },                     \
   { "endfile_linux",           ENDFILE_LINUX_SPEC },                   \
   { "endfile_netbsd",          ENDFILE_NETBSD_SPEC },                  \
-  { "endfile_windiss",          ENDFILE_WINDISS_SPEC },                 \
+  { "endfile_openbsd",         ENDFILE_OPENBSD_SPEC },                 \
+  { "endfile_windiss",         ENDFILE_WINDISS_SPEC },                 \
   { "endfile_default",         ENDFILE_DEFAULT_SPEC },                 \
   { "link_path",               LINK_PATH_SPEC },                       \
   { "link_shlib",              LINK_SHLIB_SPEC },                      \
@@ -1245,6 +1064,7 @@ ncrtn.o%s"
   { "link_start_gnu",          LINK_START_GNU_SPEC },                  \
   { "link_start_linux",                LINK_START_LINUX_SPEC },                \
   { "link_start_netbsd",       LINK_START_NETBSD_SPEC },               \
+  { "link_start_openbsd",      LINK_START_OPENBSD_SPEC },              \
   { "link_start_windiss",      LINK_START_WINDISS_SPEC },              \
   { "link_start_default",      LINK_START_DEFAULT_SPEC },              \
   { "link_os",                 LINK_OS_SPEC },                         \
@@ -1256,11 +1076,13 @@ ncrtn.o%s"
   { "link_os_linux",           LINK_OS_LINUX_SPEC },                   \
   { "link_os_gnu",             LINK_OS_GNU_SPEC },                     \
   { "link_os_netbsd",          LINK_OS_NETBSD_SPEC },                  \
+  { "link_os_openbsd",         LINK_OS_OPENBSD_SPEC },                 \
   { "link_os_windiss",         LINK_OS_WINDISS_SPEC },                 \
   { "link_os_default",         LINK_OS_DEFAULT_SPEC },                 \
   { "cc1_endian_big",          CC1_ENDIAN_BIG_SPEC },                  \
   { "cc1_endian_little",       CC1_ENDIAN_LITTLE_SPEC },               \
   { "cc1_endian_default",      CC1_ENDIAN_DEFAULT_SPEC },              \
+  { "cc1_secure_plt_default",  CC1_SECURE_PLT_DEFAULT_SPEC },          \
   { "cpp_os_ads",              CPP_OS_ADS_SPEC },                      \
   { "cpp_os_yellowknife",      CPP_OS_YELLOWKNIFE_SPEC },              \
   { "cpp_os_mvme",             CPP_OS_MVME_SPEC },                     \
@@ -1269,8 +1091,13 @@ ncrtn.o%s"
   { "cpp_os_gnu",              CPP_OS_GNU_SPEC },                      \
   { "cpp_os_linux",            CPP_OS_LINUX_SPEC },                    \
   { "cpp_os_netbsd",           CPP_OS_NETBSD_SPEC },                   \
-  { "cpp_os_windiss",           CPP_OS_WINDISS_SPEC },                  \
-  { "cpp_os_default",          CPP_OS_DEFAULT_SPEC },
+  { "cpp_os_openbsd",          CPP_OS_OPENBSD_SPEC },                  \
+  { "cpp_os_windiss",          CPP_OS_WINDISS_SPEC },                  \
+  { "cpp_os_default",          CPP_OS_DEFAULT_SPEC },                  \
+  { "fbsd_dynamic_linker",     FBSD_DYNAMIC_LINKER },                  \
+  SUBSUBTARGET_EXTRA_SPECS
+
+#define        SUBSUBTARGET_EXTRA_SPECS
 
 /* Define this macro as a C expression for the initializer of an
    array of string to tell the driver program which options are
@@ -1303,63 +1130,6 @@ ncrtn.o%s"
 
 #define HANDLE_PRAGMA_PACK_PUSH_POP 1
 
-/* Define library calls for quad FP operations.  These are all part of the
-   PowerPC 32bit ABI.  */
-#define ADDTF3_LIBCALL "_q_add"
-#define DIVTF3_LIBCALL "_q_div"
-#define EXTENDDFTF2_LIBCALL "_q_dtoq"
-#define EQTF2_LIBCALL "_q_feq"
-#define GETF2_LIBCALL "_q_fge"
-#define GTTF2_LIBCALL "_q_fgt"
-#define LETF2_LIBCALL "_q_fle"
-#define LTTF2_LIBCALL "_q_flt"
-#define NETF2_LIBCALL "_q_fne"
-#define FLOATSITF2_LIBCALL "_q_itoq"
-#define MULTF3_LIBCALL "_q_mul"
-#define NEGTF2_LIBCALL "_q_neg"
-#define TRUNCTFDF2_LIBCALL "_q_qtod"
-#define FIX_TRUNCTFSI2_LIBCALL "_q_qtoi"
-#define TRUNCTFSF2_LIBCALL "_q_qtos"
-#define FIXUNS_TRUNCTFSI2_LIBCALL "_q_qtou"
-#define SQRTTF_LIBCALL "_q_sqrt"
-#define EXTENDSFTF2_LIBCALL "_q_stoq"
-#define SUBTF3_LIBCALL "_q_sub"
-#define FLOATUNSSITF2_LIBCALL "_q_utoq"
-
-#define INIT_TARGET_OPTABS                                             \
-  do {                                                                 \
-    if (TARGET_HARD_FLOAT)                                             \
-      {                                                                        \
-       add_optab->handlers[(int) TFmode].libfunc                       \
-         = init_one_libfunc (ADDTF3_LIBCALL);                          \
-       sub_optab->handlers[(int) TFmode].libfunc                       \
-         = init_one_libfunc (SUBTF3_LIBCALL);                          \
-       neg_optab->handlers[(int) TFmode].libfunc                       \
-         = init_one_libfunc (NEGTF2_LIBCALL);                          \
-       smul_optab->handlers[(int) TFmode].libfunc                      \
-         = init_one_libfunc (MULTF3_LIBCALL);                          \
-       sdiv_optab->handlers[(int) TFmode].libfunc                      \
-         = init_one_libfunc (DIVTF3_LIBCALL);                          \
-       eqtf2_libfunc = init_one_libfunc (EQTF2_LIBCALL);               \
-       netf2_libfunc = init_one_libfunc (NETF2_LIBCALL);               \
-       gttf2_libfunc = init_one_libfunc (GTTF2_LIBCALL);               \
-       getf2_libfunc = init_one_libfunc (GETF2_LIBCALL);               \
-       lttf2_libfunc = init_one_libfunc (LTTF2_LIBCALL);               \
-       letf2_libfunc = init_one_libfunc (LETF2_LIBCALL);               \
-       trunctfsf2_libfunc = init_one_libfunc (TRUNCTFSF2_LIBCALL);     \
-       trunctfdf2_libfunc = init_one_libfunc (TRUNCTFDF2_LIBCALL);     \
-       extendsftf2_libfunc = init_one_libfunc (EXTENDSFTF2_LIBCALL);   \
-       extenddftf2_libfunc = init_one_libfunc (EXTENDDFTF2_LIBCALL);   \
-       floatsitf_libfunc = init_one_libfunc (FLOATSITF2_LIBCALL);      \
-       fixtfsi_libfunc = init_one_libfunc (FIX_TRUNCTFSI2_LIBCALL);    \
-       fixunstfsi_libfunc                                              \
-         = init_one_libfunc (FIXUNS_TRUNCTFSI2_LIBCALL);               \
-       if (TARGET_PPC_GPOPT || TARGET_POWER2)                          \
-         sqrt_optab->handlers[(int) TFmode].libfunc                    \
-           = init_one_libfunc (SQRTTF_LIBCALL);                        \
-      }                                                                        \
-  } while (0)
-
 /* Select a format to encode pointers in exception handling data.  CODE
    is 0 for data, 1 for code labels, 2 for function pointers.  GLOBAL is
    true if the symbol may be affected by dynamic relocations.  */
@@ -1368,15 +1138,10 @@ ncrtn.o%s"
    ? (((GLOBAL) ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel | DW_EH_PE_sdata4) \
    : DW_EH_PE_absptr)
 
-#define TARGET_ASM_EXCEPTION_SECTION readonly_data_section
-
 #define DOUBLE_INT_ASM_OP "\t.quad\t"
 
 /* Generate entries in .fixup for relocatable addresses.  */
-#define RELOCATABLE_NEEDS_FIXUP
+#define RELOCATABLE_NEEDS_FIXUP 1
 
-/* Define target-specific symbol_ref flags, beginning with
-   SYMBOL_REF_FLAG_DEP.  */
-#define SYMBOL_FLAG_SMALL_V4  (SYMBOL_FLAG_MACH_DEP << 0)
-#define SYMBOL_REF_SMALL_V4_P(RTX) \
-  ((SYMBOL_REF_FLAGS (RTX) & SYMBOL_FLAG_SMALL_V4) != 0)
+/* This target uses the sysv4.opt file.  */
+#define TARGET_USES_SYSV4_OPT 1