OSDN Git Service

Change callers in config/a*/ to match:
[pf3gnuchains/gcc-fork.git] / gcc / config / alpha / elf.h
index d32ca41..91a7837 100644 (file)
@@ -1,5 +1,5 @@
 /* Definitions of target machine for GNU compiler, for DEC Alpha w/ELF.
-   Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
+   Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
    Contributed by Richard Henderson (rth@tamu.edu).
 
 This file is part of GNU CC.
@@ -58,33 +58,32 @@ do {                                                                \
     }                                                          \
   fprintf (FILE, "\t.set noat\n");                             \
   fprintf (FILE, "\t.set noreorder\n");                                \
-  if (TARGET_BWX | TARGET_MAX | TARGET_CIX)                    \
+  if (TARGET_BWX | TARGET_MAX | TARGET_FIX | TARGET_CIX)       \
     {                                                          \
       fprintf (FILE, "\t.arch %s\n",                           \
-               (alpha_cpu == PROCESSOR_EV6 ? "ev6"             \
+               (TARGET_CPU_EV6 ? "ev6"                         \
                 : TARGET_MAX ? "pca56" : "ev56"));             \
     }                                                          \
 } while (0)
 
-extern void output_file_directive ();
-
 /* 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.  */
 
-#define IDENT_ASM_OP ".ident"
+#define IDENT_ASM_OP "\t.ident\t"
 
 #ifdef IDENTIFY_WITH_IDENT
 #define ASM_IDENTIFY_GCC(FILE) /* nothing */
 #define ASM_IDENTIFY_LANGUAGE(FILE)                    \
- fprintf(FILE, "\t%s \"GCC (%s) %s\"\n", IDENT_ASM_OP, \
+ fprintf(FILE, "%s\"GCC (%s) %s\"\n", IDENT_ASM_OP,    \
         lang_identify(), version_string)
 #else
 #define ASM_FILE_END(FILE)                                     \
 do {                                                           \
-     fprintf ((FILE), "\t%s\t\"GCC: (GNU) %s\"\n",             \
-             IDENT_ASM_OP, version_string);                    \
+     if (!flag_no_ident)                                       \
+       fprintf ((FILE), "%s\"GCC: (GNU) %s\"\n",               \
+                IDENT_ASM_OP, version_string);                 \
    } while (0)
 #endif
 
@@ -93,16 +92,16 @@ do {                                                                \
 
 /* Output #ident as a .ident.  */
 #define ASM_OUTPUT_IDENT(FILE, NAME) \
-  fprintf (FILE, "\t%s\t\"%s\"\n", IDENT_ASM_OP, NAME);
+  fprintf (FILE, "%s\"%s\"\n", IDENT_ASM_OP, NAME);
 
 /* 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))
 
 /* Output the label which precedes a jumptable.  Note that for all svr4
    systems where we actually generate jumptables (which is to say every
@@ -112,7 +111,7 @@ do {                                                                \
    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"
+#define ALIGN_ASM_OP "\t.align\t"
 
 #ifndef ASM_OUTPUT_BEFORE_CASE_LABEL
 #define ASM_OUTPUT_BEFORE_CASE_LABEL(FILE,PREFIX,NUM,TABLE) \
@@ -138,12 +137,12 @@ do {                                                              \
    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);       \
 } while (0)
@@ -160,14 +159,14 @@ do {                                                                      \
     sbss_section();                                                    \
   else                                                                 \
     bss_section();                                                     \
-  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");                          \
   putc ('\n', FILE);                                                   \
   if (!flag_inhibit_size_directive)                                    \
     {                                                                  \
-      fprintf (FILE, "\t%s\t ", SIZE_ASM_OP);                          \
+      fprintf (FILE, "%s", SIZE_ASM_OP);                               \
       assemble_name (FILE, NAME);                                      \
       fprintf (FILE, ",%d\n", (SIZE));                                 \
     }                                                                  \
@@ -179,7 +178,7 @@ do {                                                                        \
 /* This is the pseudo-op used to generate a 64-bit word of data with a
    specific value in some section.  */
 
-#define INT_ASM_OP             ".quad"
+#define INT_ASM_OP             "\t.quad\t"
 
 /* Biggest alignment supported by the object file format of this
    machine.  Use this macro to limit the alignment which can be
@@ -198,7 +197,7 @@ do {                                                                        \
    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
@@ -210,7 +209,7 @@ do {                                                                        \
 
 #define USE_CONST_SECTION      1
 
-#define CONST_SECTION_ASM_OP   ".section\t.rodata"
+#define CONST_SECTION_ASM_OP   "\t.section\t.rodata"
 
 /* Define the pseudo-ops used to switch to the .ctors and .dtors sections.
 
@@ -227,13 +226,13 @@ do {                                                                      \
    errors unless the .ctors and .dtors sections are marked as writable
    via the SHF_WRITE attribute.)  */
 
-#define CTORS_SECTION_ASM_OP   ".section\t.ctors,\"aw\""
-#define DTORS_SECTION_ASM_OP   ".section\t.dtors,\"aw\""
+#define CTORS_SECTION_ASM_OP   "\t.section\t.ctors,\"aw\""
+#define DTORS_SECTION_ASM_OP   "\t.section\t.dtors,\"aw\""
 
 /* Handle the small data sections.  */
-#define BSS_SECTION_ASM_OP     ".section\t.bss"
-#define SBSS_SECTION_ASM_OP    ".section\t.sbss,\"aw\""
-#define SDATA_SECTION_ASM_OP   ".section\t.sdata,\"aw\""
+#define BSS_SECTION_ASM_OP     "\t.section\t.bss"
+#define SBSS_SECTION_ASM_OP    "\t.section\t.sbss,\"aw\""
+#define SDATA_SECTION_ASM_OP   "\t.section\t.sdata,\"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
@@ -241,8 +240,8 @@ do {                                                                        \
    The definitions say how to change sections to the .init and .fini
    sections.  This is the same for all known svr4 assemblers.  */
 
-#define INIT_SECTION_ASM_OP    ".section\t.init"
-#define FINI_SECTION_ASM_OP    ".section\t.fini"
+#define INIT_SECTION_ASM_OP    "\t.section\t.init"
+#define FINI_SECTION_ASM_OP    "\t.section\t.fini"
 
 /* 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
@@ -264,32 +263,35 @@ do {                                                                      \
   SECTION_FUNCTION_TEMPLATE(sbss_section, in_sbss, SBSS_SECTION_ASM_OP)        \
   SECTION_FUNCTION_TEMPLATE(sdata_section, in_sdata, SDATA_SECTION_ASM_OP)
 
+extern void ctors_section              PARAMS ((void));
+extern void dtors_section              PARAMS ((void));
+extern void sbss_section               PARAMS ((void));
+extern void sdata_section              PARAMS ((void));
+
 #undef READONLY_DATA_SECTION
 #define READONLY_DATA_SECTION() const_section ()
 
-extern void text_section ();
-
-#define CONST_SECTION_FUNCTION                                         \
-void                                                                   \
-const_section ()                                                       \
-{                                                                      \
-  if (!USE_CONST_SECTION)                                              \
-    text_section();                                                    \
-  else if (in_section != in_const)                                     \
-    {                                                                  \
-      fprintf (asm_out_file, "%s\n", CONST_SECTION_ASM_OP);            \
-      in_section = in_const;                                           \
-    }                                                                  \
+#define CONST_SECTION_FUNCTION                                 \
+void                                                           \
+const_section ()                                               \
+{                                                              \
+  if (!USE_CONST_SECTION)                                      \
+    text_section();                                            \
+  else if (in_section != in_const)                             \
+    {                                                          \
+      fprintf (asm_out_file, "%s\n", CONST_SECTION_ASM_OP);    \
+      in_section = in_const;                                   \
+    }                                                          \
 }
 
-#define SECTION_FUNCTION_TEMPLATE(FN, ENUM, OP)                                \
-void FN ()                                                             \
-{                                                                      \
-  if (in_section != ENUM)                                              \
-    {                                                                  \
-      fprintf (asm_out_file, "%s\n", OP);                              \
-      in_section = ENUM;                                               \
-    }                                                                  \
+#define SECTION_FUNCTION_TEMPLATE(FN, ENUM, OP)        \
+void FN ()                                     \
+{                                              \
+  if (in_section != ENUM)                      \
+    {                                          \
+      fprintf (asm_out_file, "%s\n", OP);      \
+      in_section = ENUM;                       \
+    }                                          \
 }
 
 
@@ -309,7 +311,7 @@ void FN ()                                                          \
 #define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME)                              \
   do {                                                                 \
     ctors_section ();                                                  \
-    fprintf (FILE, "\t%s\t ", INT_ASM_OP);                             \
+    fprintf (FILE, "%s", INT_ASM_OP);                                  \
     assemble_name (FILE, NAME);                                                \
     fprintf (FILE, "\n");                                              \
   } while (0)
@@ -319,7 +321,7 @@ void FN ()                                                          \
 #define ASM_OUTPUT_DESTRUCTOR(FILE,NAME)                                       \
   do {                                                                 \
     dtors_section ();                                                  \
-    fprintf (FILE, "\t%s\t ", INT_ASM_OP);                             \
+    fprintf (FILE, "%s", INT_ASM_OP);                                  \
     assemble_name (FILE, NAME);                                        \
     fprintf (FILE, "\n");                                              \
   } while (0)
@@ -341,8 +343,8 @@ void FN ()                                                          \
   else if (TREE_CODE (DECL) == VAR_DECL)                               \
     {                                                                  \
       if ((flag_pic && RELOC)                                          \
-         || !TREE_READONLY (DECL) || TREE_SIDE_EFFECTS (DECL)          \
-         || !DECL_INITIAL (DECL)                                       \
+         || ! TREE_READONLY (DECL) || TREE_SIDE_EFFECTS (DECL)         \
+         || ! DECL_INITIAL (DECL)                                      \
          || (DECL_INITIAL (DECL) != error_mark_node                    \
              && !TREE_CONSTANT (DECL_INITIAL (DECL))))                 \
        {                                                               \
@@ -355,6 +357,21 @@ void FN ()                                                         \
       else                                                             \
        const_section ();                                               \
     }                                                                  \
+  else if (TREE_CODE (DECL) == CONSTRUCTOR)                            \
+    {                                                                  \
+      if ((flag_pic && RELOC)                                          \
+         || ! TREE_READONLY (DECL) || TREE_SIDE_EFFECTS (DECL)         \
+         || ! TREE_CONSTANT (DECL))                                    \
+       {                                                               \
+         int size = int_size_in_bytes (TREE_TYPE (DECL));              \
+         if (size >= 0 && size <= g_switch_value)                      \
+           sdata_section ();                                           \
+         else                                                          \
+           data_section ();                                            \
+       }                                                               \
+      else                                                             \
+       const_section ();                                               \
+    }                                                                  \
   else                                                                 \
     const_section ();                                                  \
 }
@@ -374,8 +391,8 @@ void FN ()                                                          \
    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.  */
 
@@ -414,22 +431,27 @@ void FN ()                                                                \
 
 /* Write the extra assembler code needed to declare an object properly.  */
 
-#define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL)                      \
-  do {                                                                 \
-    fprintf (FILE, "\t%s\t ", TYPE_ASM_OP);                            \
-    assemble_name (FILE, NAME);                                                \
-    putc (',', FILE);                                                  \
-    fprintf (FILE, TYPE_OPERAND_FMT, "object");                                \
-    putc ('\n', FILE);                                                 \
-    size_directive_output = 0;                                         \
-    if (!flag_inhibit_size_directive && DECL_SIZE (DECL))              \
-      {                                                                        \
-       size_directive_output = 1;                                      \
-       fprintf (FILE, "\t%s\t ", SIZE_ASM_OP);                         \
-       assemble_name (FILE, NAME);                                     \
-       fprintf (FILE, ",%d\n",  int_size_in_bytes (TREE_TYPE (DECL))); \
-      }                                                                        \
-    ASM_OUTPUT_LABEL(FILE, NAME);                                      \
+#define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL)              \
+  do {                                                         \
+    HOST_WIDE_INT size;                                                \
+    fprintf (FILE, "%s", TYPE_ASM_OP);                         \
+    assemble_name (FILE, NAME);                                        \
+    putc (',', FILE);                                          \
+    fprintf (FILE, TYPE_OPERAND_FMT, "object");                        \
+    putc ('\n', FILE);                                         \
+    size_directive_output = 0;                                 \
+    if (!flag_inhibit_size_directive                           \
+       && DECL_SIZE (DECL)                                     \
+       && (size = int_size_in_bytes (TREE_TYPE (DECL))) > 0)   \
+      {                                                                \
+       size_directive_output = 1;                              \
+       fprintf (FILE, "%s", SIZE_ASM_OP);                      \
+       assemble_name (FILE, NAME);                             \
+       fputc (',', FILE);                                      \
+       fprintf (FILE, HOST_WIDE_INT_PRINT_DEC, size);          \
+       fputc ('\n', FILE);                                     \
+      }                                                                \
+    ASM_OUTPUT_LABEL(FILE, NAME);                              \
   } while (0)
 
 /* Output the size directive for a decl in rest_of_decl_compilation
@@ -439,22 +461,24 @@ void FN ()                                                                \
    by ASM_DECLARE_OBJECT_NAME when it was run for the same decl.  */
 
 #define ASM_FINISH_DECLARE_OBJECT(FILE, DECL, TOP_LEVEL, AT_END)       \
-do {                                                                   \
-  char *name = XSTR (XEXP (DECL_RTL (DECL), 0), 0);                    \
-  if (!flag_inhibit_size_directive && DECL_SIZE (DECL)                 \
-      && ! AT_END && TOP_LEVEL                                         \
-      && DECL_INITIAL (DECL) == error_mark_node                                \
-      && !size_directive_output)                                       \
-    {                                                                  \
-      size_directive_output = 1;                                       \
-      fprintf (FILE, "\t%s\t ", SIZE_ASM_OP);                          \
-      assemble_name (FILE, name);                                      \
-      putc (',', FILE);                                                        \
-      fprintf (FILE, HOST_WIDE_INT_PRINT_DEC,                          \
-              int_size_in_bytes (TREE_TYPE (DECL)));                   \
-      putc ('\n', FILE);                                               \
-    }                                                                  \
-} while (0)
+  do {                                                                 \
+    const char *name = XSTR (XEXP (DECL_RTL (DECL), 0), 0);            \
+    HOST_WIDE_INT size;                                                        \
+    if (!flag_inhibit_size_directive                                   \
+       && DECL_SIZE (DECL)                                             \
+       && ! AT_END && TOP_LEVEL                                        \
+       && DECL_INITIAL (DECL) == error_mark_node                       \
+       && !size_directive_output                                       \
+       && (size = int_size_in_bytes (TREE_TYPE (DECL))) > 0)           \
+      {                                                                        \
+       size_directive_output = 1;                                      \
+       fprintf (FILE, "%s", SIZE_ASM_OP);                              \
+       assemble_name (FILE, name);                                     \
+       fputc (',', FILE);                                              \
+       fprintf (FILE, HOST_WIDE_INT_PRINT_DEC, size);                  \
+       fputc ('\n', FILE);                                             \
+      }                                                                        \
+  } while (0)
 
 /* A table of bytes codes used by the ASM_OUTPUT_ASCII and
    ASM_OUTPUT_LIMITED_STRING macros.  Each byte in the table
@@ -492,7 +516,7 @@ do {                                                                        \
    should define this to zero.  */
 
 #define STRING_LIMIT   ((unsigned) 256)
-#define STRING_ASM_OP  ".string"
+#define STRING_ASM_OP  "\t.string\t"
 
 /* GAS is the only Alpha/ELF assembler.  */
 #undef TARGET_GAS
@@ -500,19 +524,18 @@ do {                                                                      \
 
 /* Provide a STARTFILE_SPEC appropriate for ELF.  Here we add the
    (even more) magical crtbegin.o file which provides part of the
-   support for getting C++ file-scope static object constructed before
-   entering `main'. 
+   support for getting C++ file-scope static object constructed
+   before entering `main'. 
 
-   Don't bother seeing crtstuff.c -- there is absolutely no hope of
-   getting that file to understand multiple GPs.  GNU Libc provides a
-   hand-coded version that is used on Linux; it could be copied here
-   if there is ever a need. */
+   Don't bother seeing crtstuff.c -- there is absolutely no hope
+   of getting that file to understand multiple GPs.  We provide a
+   hand-coded assembly version.  */
    
 #undef STARTFILE_SPEC
 #define STARTFILE_SPEC \
   "%{!shared: \
      %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}}\
-   crti.o%s crtbegin.o%s"
+   crti.o%s %{shared:crtbeginS.o%s}%{!shared:crtbegin.o%s}"
 
 /* Provide a ENDFILE_SPEC appropriate for ELF.  Here we tack on the
    magical crtend.o file which provides part of the support for
@@ -521,7 +544,13 @@ do {                                                                       \
 
 #undef ENDFILE_SPEC
 #define ENDFILE_SPEC \
-  "crtend.o%s crtn.o%s"
+  "%{shared:crtendS.o%s}%{!shared:crtend.o%s} crtn.o%s"
 
 /* We support #pragma.  */
 #define HANDLE_SYSV_PRAGMA
+
+/* Undo the auto-alignment stuff from alpha.h.  ELF has unaligned data
+   pseudos natively.  */
+#undef UNALIGNED_SHORT_ASM_OP
+#undef UNALIGNED_INT_ASM_OP
+#undef UNALIGNED_DOUBLE_INT_ASM_OP