OSDN Git Service

PR tree-optimization/40550
[pf3gnuchains/gcc-fork.git] / gcc / xcoffout.h
index 597d8e1..124c106 100644 (file)
@@ -1,13 +1,13 @@
 /* XCOFF definitions.  These are needed in dbxout.c, final.c,
    and xcoffout.h.
-   Copyright (C) 1998, 2000, 2002, 2003, 2004
+   Copyright (C) 1998, 2000, 2002, 2003, 2004, 2007, 2008
    Free Software Foundation, Inc.
 
 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 option) any later
+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 ANY
@@ -16,13 +16,10 @@ FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 for more details.
 
 You should have received a copy of the GNU General Public License
-along with 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/>.  */
 
 
-#define ASM_STABS_OP "\t.stabx\t"
-
 /* Tags and typedefs are C_DECL in XCOFF, not C_LSYM.  */
 
 #define DBX_TYPE_DECL_STABS_CODE N_DECL
@@ -70,32 +67,40 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 /* Define our own finish symbol function, since xcoff stabs have their
    own different format.  */
 
-#define DBX_FINISH_SYMBOL(ASMFILE,SYM)                         \
-{                                                              \
-  if (current_sym_addr && current_sym_code == N_FUN)           \
-    fprintf ((ASMFILE), "\",.");                               \
-  else                                                         \
-    fprintf ((ASMFILE), "\",");                                        \
-  /* If we are writing a function name, we must ensure that    \
-     there is no storage-class suffix on the name.  */         \
-  if (current_sym_addr && current_sym_code == N_FUN            \
-      && GET_CODE (current_sym_addr) == SYMBOL_REF)            \
-    {                                                          \
-      const char *_p = XSTR (current_sym_addr, 0);             \
-      if (*_p == '*')                                          \
-       fprintf ((ASMFILE), "%s", _p+1);                        \
-      else                                                     \
-       for (; *_p != '[' && *_p; _p++)                         \
-         fprintf ((ASMFILE), "%c", *_p);                       \
-    }                                                          \
-  else if (current_sym_addr)                                   \
-    output_addr_const ((ASMFILE), current_sym_addr);           \
-  else if (current_sym_code == N_GSYM)                         \
-    assemble_name ((ASMFILE), XSTR (XEXP (DECL_RTL (SYM), 0), 0)); \
-  else                                                         \
-    fprintf ((ASMFILE), "%d", current_sym_value);              \
-  fprintf ((ASMFILE), ",%d,0\n", stab_to_sclass (current_sym_code)); \
-}
+#define DBX_FINISH_STABS(SYM, CODE, LINE, ADDR, LABEL, NUMBER) do {    \
+  if (ADDR)                                                            \
+    {                                                                  \
+      /* If we are writing a function name, we must emit a dot in      \
+        order to refer to the function code, not its descriptor.  */   \
+      if (CODE == N_FUN)                                               \
+       putc ('.', asm_out_file);                                       \
+                                                                       \
+      /* If we are writing a function name, we must ensure that                \
+        there is no storage-class suffix on the name.  */              \
+      if (CODE == N_FUN && GET_CODE (ADDR) == SYMBOL_REF)              \
+       {                                                               \
+         const char *_p = XSTR (ADDR, 0);                              \
+         if (*_p == '*')                                               \
+           fputs (_p+1, asm_out_file);                                 \
+         else                                                          \
+           for (; *_p != '[' && *_p; _p++)                             \
+             putc (*_p != '$' ? *_p : '_', asm_out_file);              \
+       }                                                               \
+      else                                                             \
+       output_addr_const (asm_out_file, ADDR);                         \
+    }                                                                  \
+  /* Another special case: N_GSYM always gets the symbol name,         \
+     whether or not LABEL or NUMBER are set.  */                       \
+  else if (CODE == N_GSYM)                                             \
+    assemble_name (asm_out_file, XSTR (XEXP (DECL_RTL (SYM), 0), 0));  \
+  else if (LABEL)                                                      \
+    assemble_name (asm_out_file, LABEL);                               \
+  else                                                                 \
+    dbxout_int (NUMBER);                                               \
+  putc (',', asm_out_file);                                            \
+  dbxout_int (stab_to_sclass (CODE));                                  \
+  fputs (",0\n", asm_out_file);                                                \
+} while (0)
 
 /* These are IBM XCOFF extensions we need to reference in dbxout.c
    and xcoffout.c.  */
@@ -128,7 +133,7 @@ extern char *xcoff_read_only_section_name;
 extern const char *xcoff_lastfile;
 
 /* Don't write out path name for main source file.  */
-#define DBX_OUTPUT_MAIN_SOURCE_DIRECTORY(FILE,FILENAME)
+#define NO_DBX_MAIN_SOURCE_DIRECTORY 1
 
 /* Write out main source file name using ".file" rather than ".stabs".
    We don't actually do this here, because the assembler gets confused if there
@@ -140,7 +145,7 @@ extern const char *xcoff_lastfile;
 
 /* If we are still in an include file, its end must be marked.  */
 #define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME)        \
-{                                                      \
+do {                                                   \
   if (xcoff_current_include_file)                      \
     {                                                  \
       fputs ("\t.ei\t", (FILE));                       \
@@ -148,16 +153,10 @@ extern const char *xcoff_lastfile;
       putc ('\n', (FILE));                             \
       xcoff_current_include_file = NULL;               \
     }                                                  \
-}
+} while (0)
 
-/* .stabx has the type in a different place.  */
-#if 0  /* Do not emit any marker for XCOFF until assembler allows XFT_CV.  */
-#define DBX_OUTPUT_GCC_MARKER(FILE) \
-  fprintf ((FILE), "%s\"gcc2_compiled.\",0,%d,0\n", ASM_STABS_OP, \
-          stab_to_sclass (N_GSYM))
-#else
-#define DBX_OUTPUT_GCC_MARKER(FILE)
-#endif
+/* Do not emit any marker for XCOFF until assembler allows XFT_CV.  */
+#define NO_DBX_GCC_MARKER
 
 /* Do not break .stabs pseudos into continuations.  */
 #define DBX_CONTIN_LENGTH 0
@@ -183,4 +182,4 @@ extern void xcoffout_end_function (unsigned int);
 extern void xcoffout_end_block (unsigned, unsigned);
 extern int xcoff_assign_fundamental_type_number (tree);
 extern void xcoffout_declare_function (FILE *, tree, const char *);
-extern void xcoffout_source_line (unsigned int, const char *);
+extern void xcoffout_source_line (unsigned int, const char *, int, bool);