OSDN Git Service

* target.h (asm_out.byte_op, asm_out.aligned_op, asm_out.unaligned_op,
[pf3gnuchains/gcc-fork.git] / gcc / config / elfos.h
index 7962a34..d09bdbc 100644 (file)
@@ -1,6 +1,7 @@
 /* elfos.h  --  operating system specific defines to be used when
    targeting GCC for some generic ELF system
-   Copyright (C) 1991, 1994, 1995, 1999, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1991, 1994, 1995, 1999, 2000, 2001
+   Free Software Foundation, Inc.
    Based on svr4.h contributed by Ron Guilmette (rfg@netcom.com).
 
 This file is part of GNU CC.
@@ -20,6 +21,11 @@ along with GNU CC; see the file COPYING.  If not, write to
 the Free Software Foundation, 59 Temple Place - Suite 330,
 Boston, MA 02111-1307, USA.  */
 
+
+/* Define a symbol indicating that we are using elfos.h.
+   Some CPU specific configuration files use this.  */
+#define USING_ELFOS_H
+
 /* The prefix to add to user-visible assembler symbols.
 
    For ELF systems the convention is *not* to prepend a leading
@@ -36,15 +42,6 @@ Boston, MA 02111-1307, USA.  */
 #define MAX_OFILE_ALIGNMENT (32768 * 8)
 #endif
 
-#undef  ENDFILE_SPEC
-#define ENDFILE_SPEC "crtend.o%s"
-
-#undef STARTFILE_SPEC
-#define STARTFILE_SPEC "%{!shared: \
-                        %{!symbolic: \
-                         %{pg:gcrt0.o%s}%{!pg:%{p:mcrt0.o%s}%{!p:crt0.o%s}}}}\
-                       crtbegin.o%s"
-
 /* Use periods rather than dollar signs in special g++ assembler names.  */
 
 #define NO_DOLLAR_IN_LABEL
@@ -73,10 +70,6 @@ Boston, MA 02111-1307, USA.  */
 #define DWARF2_DEBUGGING_INFO 1
 #endif
 
-/* Also allow them to support STABS debugging.  */
-
-#include "dbxelf.h"
-
 /* The GNU tools operate better with stabs.  Since we don't have
    any native tools to be compatible with, default to stabs.  */
 
@@ -91,29 +84,12 @@ Boston, MA 02111-1307, USA.  */
 /* Output #ident as a .ident.  */
 
 #define ASM_OUTPUT_IDENT(FILE, NAME) \
-  fprintf (FILE, "\t%s\t\"%s\"\n", IDENT_ASM_OP, NAME);
-
-/* Attach a special .ident directive to the end of the file to identify
-   the version of GCC which compiled this code.  The format of the
-   .ident string is patterned after the ones produced by native svr4
-   C compilers.  */
+  fprintf (FILE, "%s\"%s\"\n", IDENT_ASM_OP, NAME);
 
-#define IDENT_ASM_OP ".ident"
-
-#define ASM_FILE_END(FILE)                             \
-  do                                                   \
-    {                                                  \
-      if (!flag_no_ident)                              \
-       fprintf ((FILE), "\t%s\t\"GCC: (GNU) %s\"\n",   \
-                IDENT_ASM_OP, version_string);         \
-    }                                                  \
-  while (0)
-
-#undef  ASM_BYTE_OP
-#define ASM_BYTE_OP    ".byte"
+#define IDENT_ASM_OP "\t.ident\t"
 
 #undef  SET_ASM_OP
-#define SET_ASM_OP     ".set"
+#define SET_ASM_OP     "\t.set\t"
 
 /* This is how to begin an assembly language file.  Most svr4 assemblers want
    at least a .file directive to come first, and some want to see a .version
@@ -129,11 +105,11 @@ Boston, MA 02111-1307, USA.  */
 /* This is how to allocate empty space in some section.  The .zero
    pseudo-op is used for this on most svr4 assemblers.  */
 
-#define SKIP_ASM_OP    ".zero"
+#define SKIP_ASM_OP    "\t.zero\t"
 
 #undef  ASM_OUTPUT_SKIP
 #define ASM_OUTPUT_SKIP(FILE, SIZE) \
-  fprintf (FILE, "\t%s\t%u\n", SKIP_ASM_OP, (SIZE))
+  fprintf (FILE, "%s%u\n", SKIP_ASM_OP, (SIZE))
 
 /* This is how to output an internal numbered label where
    PREFIX is the class of label and NUM is the number within the class.
@@ -142,11 +118,11 @@ Boston, MA 02111-1307, USA.  */
    with a period is not put into the linker symbol table by the assembler.  */
 
 #undef  ASM_OUTPUT_INTERNAL_LABEL
-#define ASM_OUTPUT_INTERNAL_LABEL(FILE, PREFIX, NUM)   \
-  do                                                   \
-    {                                                  \
-      fprintf (FILE, ".%s%d:\n", PREFIX, NUM);         \
-    }                                                  \
+#define ASM_OUTPUT_INTERNAL_LABEL(FILE, PREFIX, NUM)           \
+  do                                                           \
+    {                                                          \
+      fprintf (FILE, ".%s%u:\n", PREFIX, (unsigned) (NUM));    \
+    }                                                          \
   while (0)
 
 /* This is how to store into the string LABEL
@@ -173,7 +149,8 @@ Boston, MA 02111-1307, USA.  */
    make sure that the location counter for the .rodata section gets pro-
    perly re-aligned prior to the actual beginning of the jump table.  */
 
-#define ALIGN_ASM_OP ".align"
+#undef ALIGN_ASM_OP
+#define ALIGN_ASM_OP "\t.align\t"
 
 #ifndef ASM_OUTPUT_BEFORE_CASE_LABEL
 #define ASM_OUTPUT_BEFORE_CASE_LABEL(FILE, PREFIX, NUM, TABLE) \
@@ -201,13 +178,13 @@ Boston, MA 02111-1307, USA.  */
    the linker seems to want the alignment of data objects
    to depend on their types.  We do exactly that here.  */
 
-#define COMMON_ASM_OP  ".comm"
+#define COMMON_ASM_OP  "\t.comm\t"
 
 #undef  ASM_OUTPUT_ALIGNED_COMMON
 #define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN)             \
   do                                                                   \
     {                                                                  \
-      fprintf ((FILE), "\t%s\t", COMMON_ASM_OP);                       \
+      fprintf ((FILE), "%s", COMMON_ASM_OP);                           \
       assemble_name ((FILE), (NAME));                                  \
       fprintf ((FILE), ",%u,%u\n", (SIZE), (ALIGN) / BITS_PER_UNIT);   \
     }                                                                  \
@@ -218,31 +195,25 @@ Boston, MA 02111-1307, USA.  */
    the linker seems to want the alignment of data objects
    to depend on their types.  We do exactly that here.  */
 
-#define LOCAL_ASM_OP   ".local"
+#define LOCAL_ASM_OP   "\t.local\t"
 
 #undef  ASM_OUTPUT_ALIGNED_LOCAL
 #define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN)      \
   do                                                           \
     {                                                          \
-      fprintf ((FILE), "\t%s\t", LOCAL_ASM_OP);                        \
+      fprintf ((FILE), "%s", LOCAL_ASM_OP);                    \
       assemble_name ((FILE), (NAME));                          \
       fprintf ((FILE), "\n");                                  \
       ASM_OUTPUT_ALIGNED_COMMON (FILE, NAME, SIZE, ALIGN);     \
     }                                                          \
   while (0)
 
-/* This is the pseudo-op used to generate a 32-bit word of data with a
-   specific value in some section.  This is the same for all known svr4
-   assemblers.  */
-
-#define INT_ASM_OP             ".long"
-
 /* This is the pseudo-op used to generate a contiguous sequence of byte
    values from a double-quoted string WITHOUT HAVING A TERMINATING NUL
    AUTOMATICALLY APPENDED.  This is the same for most svr4 assemblers.  */
 
 #undef  ASCII_DATA_ASM_OP
-#define ASCII_DATA_ASM_OP      ".ascii"
+#define ASCII_DATA_ASM_OP      "\t.ascii\t"
 
 /* Support const sections and the ctors and dtors sections for g++.
    Note that there appears to be two different ways to support const
@@ -256,24 +227,6 @@ Boston, MA 02111-1307, USA.  */
 
 #define CONST_SECTION_ASM_OP   "\t.section\t.rodata"
 
-/* Define the pseudo-ops used to switch to the .ctors and .dtors sections.
-
-   Note that we want to give these sections the SHF_WRITE attribute
-   because these sections will actually contain data (i.e. tables of
-   addresses of functions in the current root executable or shared library
-   file) and, in the case of a shared library, the relocatable addresses
-   will have to be properly resolved/relocated (and then written into) by
-   the dynamic linker when it actually attaches the given shared library
-   to the executing process.  (Note that on SVR4, you may wish to use the
-   `-z text' option to the ELF linker, when building a shared library, as
-   an additional check that you are doing everything right.  But if you do
-   use the `-z text' option when building a shared library, you will get
-   errors unless the .ctors and .dtors sections are marked as writable
-   via the SHF_WRITE attribute.)  */
-
-#define CTORS_SECTION_ASM_OP   "\t.section\t.ctors,\"aw\""
-#define DTORS_SECTION_ASM_OP   "\t.section\t.dtors,\"aw\""
-
 /* On svr4, we *do* have support for the .init and .fini sections, and we
    can put stuff in there to be executed before and after `main'.  We let
    crtstuff.c and other files know this by defining the following symbols.
@@ -283,13 +236,23 @@ Boston, MA 02111-1307, USA.  */
 #define INIT_SECTION_ASM_OP    "\t.section\t.init"
 #define FINI_SECTION_ASM_OP    "\t.section\t.fini"
 
+#ifdef HAVE_GAS_SUBSECTION_ORDERING
+
+#define ASM_SECTION_START_OP   "\t.subsection\t-1"
+
+/* Output assembly directive to move to the beginning of current section.  */
+#define ASM_OUTPUT_SECTION_START(FILE) \
+  fprintf ((FILE), "%s\n", ASM_SECTION_START_OP)
+
+#endif
+
 /* A default list of other sections which we might be "in" at any given
    time.  For targets that use additional sections (e.g. .tdesc) you
    should override this definition in the target-specific file which
    includes this file.  */
 
 #undef  EXTRA_SECTIONS
-#define EXTRA_SECTIONS in_const, in_ctors, in_dtors
+#define EXTRA_SECTIONS in_const
 
 /* A default list of extra section function definitions.  For targets
    that use additional sections (e.g. .tdesc) you should override this
@@ -297,9 +260,7 @@ Boston, MA 02111-1307, USA.  */
 
 #undef  EXTRA_SECTION_FUNCTIONS
 #define EXTRA_SECTION_FUNCTIONS                \
-  CONST_SECTION_FUNCTION               \
-  CTORS_SECTION_FUNCTION               \
-  DTORS_SECTION_FUNCTION
+  CONST_SECTION_FUNCTION
 
 #define READONLY_DATA_SECTION() const_section ()
 
@@ -311,37 +272,13 @@ const_section ()                                          \
     text_section ();                                           \
   else if (in_section != in_const)                             \
     {                                                          \
-      fprintf (asm_out_file, "\t%s\n", CONST_SECTION_ASM_OP);  \
+      fprintf (asm_out_file, "%s\n", CONST_SECTION_ASM_OP);    \
       in_section = in_const;                                   \
     }                                                          \
 }
 
-#define CTORS_SECTION_FUNCTION                                 \
-void                                                           \
-ctors_section ()                                               \
-{                                                              \
-  if (in_section != in_ctors)                                  \
-    {                                                          \
-      fprintf (asm_out_file, "\t%s\n", CTORS_SECTION_ASM_OP);  \
-      in_section = in_ctors;                                   \
-    }                                                          \
-}
-
-#define DTORS_SECTION_FUNCTION                                 \
-void                                                           \
-dtors_section ()                                               \
-{                                                              \
-  if (in_section != in_dtors)                                  \
-    {                                                          \
-      fprintf (asm_out_file, "\t%s\n", DTORS_SECTION_ASM_OP);  \
-      in_section = in_dtors;                                   \
-    }                                                          \
-}
-
 #define MAKE_DECL_ONE_ONLY(DECL) (DECL_WEAK (DECL) = 1)
 
-#define UNIQUE_SECTION_P(DECL)   (DECL_ONE_ONLY (DECL))
-
 #define UNIQUE_SECTION(DECL, RELOC)                            \
   do                                                           \
     {                                                          \
@@ -350,28 +287,27 @@ dtors_section ()                                          \
       const char *name;                                                \
       char *string;                                            \
       const char *prefix;                                      \
-      static const char *prefixes[/*4*/3][2] =                 \
+      static const char *const prefixes[4][2] =                        \
       {                                                                \
        { ".text.",   ".gnu.linkonce.t." },                     \
        { ".rodata.", ".gnu.linkonce.r." },                     \
-       { ".data.",   ".gnu.linkonce.d." }                      \
-       /* Do not generate unique sections for uninitialised    \
-          data since we do not have support for this in the    \
-          linker scripts yet...                                \
-        ,{ ".bss.",    ".gnu.linkonce.b." }  */                        \
+       { ".data.",   ".gnu.linkonce.d." },                     \
+       { ".bss.",    ".gnu.linkonce.b." }                      \
       };                                                       \
                                                                \
       if (TREE_CODE (DECL) == FUNCTION_DECL)                   \
        sec = 0;                                                \
-  /*  else if (DECL_INITIAL (DECL) == 0                                \
+      else if (DECL_INITIAL (DECL) == 0                                \
               || DECL_INITIAL (DECL) == error_mark_node)       \
-        sec =  3; */                                           \
+        sec =  3;                                              \
       else if (DECL_READONLY_SECTION (DECL, RELOC))            \
        sec = 1;                                                \
       else                                                     \
        sec = 2;                                                \
                                                                \
       name   = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (DECL));        \
+      /* Strip off any encoding in name.  */                   \
+      STRIP_NAME_ENCODING (name, name);                                \
       prefix = prefixes[sec][DECL_ONE_ONLY(DECL)];             \
       len    = strlen (name) + strlen (prefix);                        \
       string = alloca (len + 1);                               \
@@ -382,123 +318,86 @@ dtors_section ()                                         \
     }                                                          \
   while (0)
      
-/* A C statement (sans semicolon) to output an
-   element in the table of global constructors.  */
-#define ASM_OUTPUT_CONSTRUCTOR(FILE, NAME)                     \
-  do                                                           \
-    {                                                          \
-      ctors_section ();                                                \
-      fprintf (FILE, "\t%s\t ", INT_ASM_OP);                   \
-      assemble_name (FILE, NAME);                              \
-      fprintf (FILE, "\n");                                    \
-    }                                                          \
-  while (0)
-
-/* A C statement (sans semicolon) to output an
-   element in the table of global destructors.  */
-#define ASM_OUTPUT_DESTRUCTOR(FILE,NAME)                               \
-  do                                                           \
-    {                                                          \
-      dtors_section ();                                        \
-      fprintf (FILE, "\t%s\t ", INT_ASM_OP);                   \
-      assemble_name (FILE, NAME);                                      \
-      fprintf (FILE, "\n");                                    \
-    }                                                          \
-  while (0)
-
-/* Switch into a generic section.
-   We make the section read-only and executable for a function decl,
-   read-only for a const data decl, and writable for a non-const data decl.
-   If the section has already been defined, we must not
-   emit the attributes here. The SVR4 assembler does not
-   recognize section redefinitions.
-   If DECL is NULL, no attributes are emitted.  */
-
-#define ASM_OUTPUT_SECTION_NAME(FILE, DECL, NAME, RELOC)               \
-  do                                                                   \
-    {                                                                  \
-      static struct section_info                                       \
-      {                                                                        \
-       struct section_info *next;                                      \
-       char *name;                                                     \
-       enum sect_enum {SECT_RW, SECT_RO, SECT_EXEC} type;              \
-      } *sections;                                                     \
-      struct section_info *s;                                          \
-      const char *mode;                                                        \
-      enum sect_enum type;                                             \
-                                                                       \
-      for (s = sections; s; s = s->next)                               \
-       if (!strcmp (NAME, s->name))                                    \
-         break;                                                        \
-                                                                       \
-      if (DECL && TREE_CODE (DECL) == FUNCTION_DECL)                   \
-       type = SECT_EXEC, mode = "ax";                                  \
-      else if (DECL && DECL_READONLY_SECTION (DECL, RELOC))            \
-       type = SECT_RO, mode = "a";                                     \
-      else                                                             \
-       type = SECT_RW, mode = "aw";                                    \
-                                                                       \
-      if (s == 0)                                                      \
-       {                                                               \
-         s = (struct section_info *) xmalloc (sizeof (* s));           \
-         s->name = xmalloc ((strlen (NAME) + 1) * sizeof (* NAME));    \
-         strcpy (s->name, NAME);                                       \
-         s->type = type;                                               \
-         s->next = sections;                                           \
-         sections = s;                                                 \
-         fprintf (FILE, "\t.section\t%s,\"%s\",@progbits\n",           \
-                  NAME, mode);                                         \
-       }                                                               \
-      else                                                             \
-       {                                                               \
-         if (DECL && s->type != type)                                  \
-           error_with_decl (DECL, "%s causes a section type conflict");\
-                                                                       \
-         fprintf (FILE, "\t.section\t%s\n", NAME);                     \
-       }                                                               \
-    }                                                                  \
-  while (0)
+/* Switch into a generic section.  */
+#define TARGET_ASM_NAMED_SECTION  default_elf_asm_named_section
 
 /* A C statement or statements to switch to the appropriate
    section for output of RTX in mode MODE.  RTX is some kind
    of constant in RTL.  The argument MODE is redundant except
-   in the case of a `const_int' rtx.  Currently, these always
-   go into the const section.  */
+   in the case of a `const_int' rtx.
+   If assembler supports SHF_MERGE sections, put it into
+   a .rodata.cstN section where N is size of the constant,
+   otherwise into const section.  */
 
 #undef  SELECT_RTX_SECTION
-#define SELECT_RTX_SECTION(MODE, RTX) const_section ()
+#define SELECT_RTX_SECTION(MODE, RTX, ALIGN)   \
+  mergeable_constant_section ((MODE), (ALIGN), 0)
 
 /* A C statement or statements to switch to the appropriate
    section for output of DECL.  DECL is either a `VAR_DECL' node
    or a constant of some sort.  RELOC indicates whether forming
-   the initial value of DECL requires link-time relocations.  */
-
-#define SELECT_SECTION(DECL, RELOC)                            \
+   the initial value of DECL requires link-time relocations.  
+   To optimize loading of shared programs, define following subsections
+   of data section by attaching:
+
+   .rel
+     Section with this string in name contains data that do have
+     relocations, so they get grouped together and dynamic linker
+     will visit fewer pages in memory.
+   .ro
+     Marks data read only otherwise.  This is useful with prelinking
+     as most of relocations won't be dynamically linked and thus
+     stay read only.
+   .local
+     Marks data containing relocations only to local objects.  These
+     relocation will get fully resolved by prelinking.
+ */
+
+#undef SELECT_SECTION
+#define SELECT_SECTION(DECL, RELOC, ALIGN)                     \
 {                                                              \
   if (TREE_CODE (DECL) == STRING_CST)                          \
     {                                                          \
       if (! flag_writable_strings)                             \
-       const_section ();                                       \
+       mergeable_string_section ((DECL), (ALIGN), 0);          \
       else                                                     \
        data_section ();                                        \
     }                                                          \
   else if (TREE_CODE (DECL) == VAR_DECL)                       \
     {                                                          \
-      if ((flag_pic && RELOC)                                  \
-         || !TREE_READONLY (DECL) || TREE_SIDE_EFFECTS (DECL)  \
+      if (!TREE_READONLY (DECL) || TREE_SIDE_EFFECTS (DECL)    \
          || !DECL_INITIAL (DECL)                               \
          || (DECL_INITIAL (DECL) != error_mark_node            \
              && !TREE_CONSTANT (DECL_INITIAL (DECL))))         \
-       data_section ();                                        \
-      else                                                     \
+       {                                                       \
+         if (flag_pic && ((RELOC) & 2))                        \
+           named_section (NULL_TREE, ".data.rel", RELOC);      \
+         else if (flag_pic && (RELOC))                         \
+           named_section (NULL_TREE, ".data.rel.local", RELOC);\
+         else                                                  \
+           data_section ();                                    \
+       }                                                       \
+      else if (flag_pic && ((RELOC) & 2))                      \
+       named_section (NULL_TREE, ".data.rel.ro", RELOC);       \
+      else if (flag_pic && (RELOC))                            \
+       named_section (NULL_TREE, ".data.rel.ro.local", RELOC); \
+      else if (flag_merge_constants < 2)                       \
+       /* C and C++ don't allow different variables to share   \
+          the same location.  -fmerge-all-constants allows     \
+          even that (at the expense of not conforming).  */    \
        const_section ();                                       \
+      else if (TREE_CODE (DECL_INITIAL (DECL)) == STRING_CST)  \
+       mergeable_string_section (DECL_INITIAL (DECL), (ALIGN), \
+                                 0);                           \
+      else                                                     \
+       mergeable_constant_section (DECL_MODE (DECL), (ALIGN),  \
+                                   0);                         \
     }                                                          \
   else if (TREE_CODE (DECL) == CONSTRUCTOR)                    \
     {                                                          \
       if ((flag_pic && RELOC)                                  \
-         || !TREE_READONLY (DECL) || TREE_SIDE_EFFECTS (DECL)  \
+         || TREE_SIDE_EFFECTS (DECL)                           \
          || ! TREE_CONSTANT (DECL))                            \
        data_section ();                                        \
       else                                                     \
@@ -514,8 +413,8 @@ dtors_section ()                                            \
    different pseudo-op names for these, they may be overridden in the
    file which includes this one.  */
 
-#define TYPE_ASM_OP    ".type"
-#define SIZE_ASM_OP    ".size"
+#define TYPE_ASM_OP    "\t.type\t"
+#define SIZE_ASM_OP    "\t.size\t"
 
 /* This is how we tell the assembler that a symbol is weak.  */
 
@@ -557,7 +456,7 @@ dtors_section ()                                            \
 #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL)    \
   do                                                   \
     {                                                  \
-      fprintf (FILE, "\t%s\t ", TYPE_ASM_OP);          \
+      fprintf (FILE, "%s", TYPE_ASM_OP);               \
       assemble_name (FILE, NAME);                      \
       putc (',', FILE);                                        \
       fprintf (FILE, TYPE_OPERAND_FMT, "function");    \
@@ -574,7 +473,7 @@ dtors_section ()                                            \
 #define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL)              \
   do                                                           \
     {                                                          \
-      fprintf (FILE, "\t%s\t ", TYPE_ASM_OP);                  \
+      fprintf (FILE, "%s", TYPE_ASM_OP);                       \
       assemble_name (FILE, NAME);                              \
       putc (',', FILE);                                                \
       fprintf (FILE, TYPE_OPERAND_FMT, "object");              \
@@ -582,10 +481,11 @@ dtors_section ()                                          \
                                                                \
       size_directive_output = 0;                               \
                                                                \
-      if (!flag_inhibit_size_directive && DECL_SIZE (DECL))    \
+      if (!flag_inhibit_size_directive                         \
+         && (DECL) && DECL_SIZE (DECL))                        \
        {                                                       \
          size_directive_output = 1;                            \
-         fprintf (FILE, "\t%s\t ", SIZE_ASM_OP);               \
+         fprintf (FILE, "%s", SIZE_ASM_OP);                    \
          assemble_name (FILE, NAME);                           \
          putc (',', FILE);                                     \
          fprintf (FILE, HOST_WIDE_INT_PRINT_DEC,               \
@@ -615,7 +515,7 @@ dtors_section ()                                            \
          && !size_directive_output)                            \
        {                                                       \
          size_directive_output = 1;                            \
-         fprintf (FILE, "\t%s\t ", SIZE_ASM_OP);               \
+         fprintf (FILE, "%s", SIZE_ASM_OP);                    \
          assemble_name (FILE, name);                           \
          putc (',', FILE);                                     \
          fprintf (FILE, HOST_WIDE_INT_PRINT_DEC,               \
@@ -640,7 +540,7 @@ dtors_section ()                                            \
          ASM_GENERATE_INTERNAL_LABEL (label, "Lfe", labelno);  \
          ASM_OUTPUT_INTERNAL_LABEL (FILE, "Lfe", labelno);     \
                                                                \
-         fprintf (FILE, "\t%s\t ", SIZE_ASM_OP);               \
+         fprintf (FILE, "%s", SIZE_ASM_OP);                    \
          assemble_name (FILE, (FNAME));                        \
          fprintf (FILE, ",");                                  \
          assemble_name (FILE, label);                          \
@@ -690,7 +590,7 @@ dtors_section ()                                            \
 
 #define STRING_LIMIT   ((unsigned) 256)
 
-#define STRING_ASM_OP  ".string"
+#define STRING_ASM_OP  "\t.string\t"
 
 /* The routine used to output NUL terminated strings.  We use a special
    version of this for most svr4 targets because doing so makes the
@@ -706,7 +606,7 @@ dtors_section ()                                            \
        (const unsigned char *) (STR);                  \
       register unsigned ch;                            \
                                                        \
-      fprintf ((FILE), "\t%s\t\"", STRING_ASM_OP);     \
+      fprintf ((FILE), "%s\"", STRING_ASM_OP);         \
                                                        \
       for (; (ch = *_limited_str); _limited_str++)     \
         {                                              \
@@ -777,7 +677,7 @@ dtors_section ()                                            \
              register unsigned ch;                                     \
                                                                        \
              if (bytes_in_chunk == 0)                                  \
-               fprintf ((FILE), "\t%s\t\"", ASCII_DATA_ASM_OP);        \
+               fprintf ((FILE), "%s\"", ASCII_DATA_ASM_OP);            \
                                                                        \
              switch (escape = ESCAPES[ch = *_ascii_bytes])             \
                {                                                       \