OSDN Git Service

* config/rs6000/x-rs6000: New file.
[pf3gnuchains/gcc-fork.git] / gcc / config / rs6000 / sysv4.h
index d91dd3d..6e04bee 100644 (file)
@@ -1,13 +1,13 @@
 /* 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, 2007 Free Software Foundation, Inc.
    Contributed by Cygnus Support.
 
    This file is part of GCC.
 
    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 2, or (at your
+   by the Free Software Foundation; either version 3, or (at your
    option) any later version.
 
    GCC is distributed in the hope that it will be useful, but WITHOUT
    License for more details.
 
    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.  */
+   along with GCC; see the file COPYING3.  If not see
+   <http://www.gnu.org/licenses/>.  */
 
 /* Header files should be C++ aware in general.  */
+#undef  NO_IMPLICIT_EXTERN_C
 #define NO_IMPLICIT_EXTERN_C
 
 /* Yes!  We are ELF.  */
@@ -46,24 +46,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,85 +58,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;
 extern const char *rs6000_tls_size_string; /* For -mtls-size= */
 
-/* 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},  \
-  { "tls-size=", &rs6000_tls_size_string,                                      \
-   N_("Specify bit size of immediate TLS offsets"), 0 }
-
 #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
@@ -166,12 +80,12 @@ extern const char *rs6000_tls_size_string; /* For -mtls-size= */
 
 #define SUBTARGET_OVERRIDE_OPTIONS                                     \
 do {                                                                   \
-  extern unsigned HOST_WIDE_INT g_switch_value;                                \
-  extern int g_switch_set;                                             \
-                                                                       \
   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"))                   \
@@ -190,11 +104,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;                                     \
@@ -252,7 +173,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",              \
@@ -274,7 +196,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",                   \
@@ -287,15 +209,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
@@ -305,16 +242,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
@@ -371,14 +307,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.  */
@@ -386,15 +332,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.  */
@@ -424,131 +361,12 @@ 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_RELOC_RW_MASK
+#define TARGET_ASM_RELOC_RW_MASK rs6000_elf_reloc_rw_mask
 #undef TARGET_ASM_SELECT_RTX_SECTION
 #define        TARGET_ASM_SELECT_RTX_SECTION rs6000_elf_select_rtx_section
-#undef TARGET_ASM_SELECT_SECTION
-#define        TARGET_ASM_SELECT_SECTION  rs6000_elf_select_section
-#define TARGET_ASM_UNIQUE_SECTION  rs6000_elf_unique_section
 
 /* Return nonzero if this entry is to be written into the constant pool
    in a special way.  We do so if this is a SYMBOL_REF, LABEL_REF or a CONST
@@ -573,7 +391,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
@@ -590,51 +408,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.  */
@@ -659,16 +433,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 {                                                                   \
-  extern unsigned HOST_WIDE_INT g_switch_value;                                \
-                                                                       \
-  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);                                    \
@@ -688,7 +458,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
@@ -744,16 +514,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.  */
@@ -771,7 +531,6 @@ extern int fixuplabelno;
 
 #define TARGET_ENCODE_SECTION_INFO  rs6000_elf_encode_section_info
 #define TARGET_IN_SMALL_DATA_P  rs6000_elf_in_small_data_p
-#define TARGET_SECTION_TYPE_FLAGS  rs6000_elf_section_type_flags
 
 /* The ELF version doesn't encode [DS] or whatever at the end of symbols.  */
 
@@ -789,18 +548,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
 
@@ -808,7 +577,7 @@ extern int fixuplabelno;
 /* Override svr4.h definition.  */
 #undef ASM_SPEC
 #define        ASM_SPEC "%(asm_cpu) \
-%{.s: %{mregnames} %{mno-regnames}} %{.S: %{mregnames} %{mno-regnames}} \
+%{,assembler|,assembler-with-cpp: %{mregnames} %{mno-regnames}} \
 %{v:-V} %{Qy:} %{!Qn:-Qy} %{n} %{T} %{Ym,*} %{Yd,*} %{Wa,*:%*} \
 %{mrelocatable} %{mrelocatable-lib} %{fpic|fpie|fPIC|fPIE:-K PIC} \
 %{memb|msdata|msdata=eabi: -memb} \
@@ -817,6 +586,7 @@ extern int fixuplabelno;
   mcall-aixdesc |                 \
   mcall-freebsd |                 \
   mcall-netbsd  |                 \
+  mcall-openbsd |                 \
   mcall-linux   |                 \
   mcall-gnu             :-mbig;    \
   mcall-i960-old        :-mlittle}"
@@ -832,18 +602,22 @@ 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*} \
+#define        CC1_SPEC "%{G*} %(cc1_cpu) \
 %{mlittle|mlittle-endian: %(cc1_endian_little);           \
   mbig   |mbig-endian   : %(cc1_endian_big);              \
   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 } \
@@ -851,13 +625,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,*: \
@@ -884,6 +660,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 ""
@@ -941,18 +718,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|fpie: -D__PIC__=1 -D__pic__=1} \
-%{!fpic: %{fPIC|fPIE: -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)        ; \
@@ -962,6 +735,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 ""
@@ -978,9 +752,10 @@ 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 ""
+#define        STARTFILE_DEFAULT_SPEC "ecrti.o%s crtbegin.o%s"
 
 /* Override svr4.h definition.  */
 #undef LIB_SPEC
@@ -994,9 +769,10 @@ 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 ""
+#define LIB_DEFAULT_SPEC "-lc"
 
 /* Override svr4.h definition.  */
 #undef ENDFILE_SPEC
@@ -1010,11 +786,12 @@ 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"
 
-#define        ENDFILE_DEFAULT_SPEC ""
+#define        ENDFILE_DEFAULT_SPEC "crtend.o%s ecrtn.o%s"
 
 /* Motorola ADS support.  */
 #define LIB_ADS_SPEC "--start-group -lads -lc --end-group"
@@ -1080,73 +857,64 @@ extern int fixuplabelno;
 #define LINK_START_FREEBSD_SPEC        ""
 
 #define LINK_OS_FREEBSD_SPEC "\
-  %{p:%e`-p' not supported; use `-pg' and gprof(1)} \
-    %{Wl,*:%*} \
-    %{v:-V} \
-    %{assert*} %{R*} %{rpath*} %{defsym*} \
-    %{shared:-Bshareable %{h*} %{soname*}} \
-    %{!shared: \
-      %{!static: \
-       %{rdynamic: -export-dynamic} \
-       %{!dynamic-linker: -dynamic-linker /usr/libexec/ld-elf.so.1}} \
-      %{static:-Bstatic}} \
-    %{symbolic:-Bsymbolic}"
+  %{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
-#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}"
-#elif defined HAVE_LD_PIE
+#ifdef HAVE_LD_PIE
 #define        STARTFILE_LINUX_SPEC "\
-%{!shared: %{pg|p:gcrt1.o%s;pie:Scrt1.o%s;:crt1.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|p:gcrt1.o%s;:crt1.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 } \
@@ -1196,6 +964,34 @@ ncrtn.o%s"
 #define CPP_OS_NETBSD_SPEC "\
 -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.  */
 
 #define LIB_WINDISS_SPEC "--start-group -li -lcfp -lwindiss -lram -limpl -limpfp --end-group"
@@ -1219,8 +1015,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 },                        \
@@ -1229,7 +1024,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 },           \
@@ -1239,7 +1035,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 },             \
@@ -1249,7 +1046,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 },                      \
@@ -1263,6 +1061,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 },                         \
@@ -1274,11 +1073,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 },                     \
@@ -1287,8 +1088,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
@@ -1321,63 +1127,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.  */
@@ -1386,9 +1135,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
+
+/* This target uses the sysv4.opt file.  */
+#define TARGET_USES_SYSV4_OPT 1