/* Output xcoff-format symbol table information from GNU compiler.
- Copyright (C) 1992, 1994, 1995, 1997, 1998, 1999, 2000, 2002, 2003
+ Copyright (C) 1992, 1994, 1995, 1997, 1998, 1999, 2000, 2002, 2003, 2004
Free Software Foundation, Inc.
This file is part of GCC.
You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING. If not, write to the Free
-Software Foundation, 59 Temple Place - Suite 330, Boston, MA
-02111-1307, USA. */
+Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301, USA. */
/* Output xcoff-format symbol table data. The main functionality is contained
in dbxout.c. This file implements the sdbout-like parts of the xcoff
#ifdef XCOFF_DEBUGGING_INFO
/* This defines the C_* storage classes. */
-#include "dbxstclass.h"
+#include "xcoff.h"
#include "xcoffout.h"
#include "dbxout.h"
#include "gstab.h"
#define ABS_OR_RELATIVE_LINENO(LINENO) \
((xcoff_inlining) ? (LINENO) : (LINENO) - xcoff_begin_function_line)
-/* Output source line numbers via ".line" rather than ".stabd". */
-#define ASM_OUTPUT_SOURCE_LINE(FILE,LINENUM,COUNTER) \
+/* Output source line numbers via ".line". */
+#define ASM_OUTPUT_LINE(FILE,LINENUM) \
do \
{ \
if (xcoff_begin_function_line >= 0) \
#define ASM_OUTPUT_LBE(FILE,LINENUM,BLOCKNUM) \
fprintf (FILE, "\t.eb\t%d\n", ABS_OR_RELATIVE_LINENO (LINENUM))
-static void assign_type_number (tree, const char *, int);
static void xcoffout_block (tree, int, tree);
static void xcoffout_source_file (FILE *, const char *, int);
\f
/* Support routines for XCOFF debugging info. */
-/* Assign NUMBER as the stabx type number for the type described by NAME.
- Search all decls in the list SYMS to find the type NAME. */
-
-static void
-assign_type_number (tree syms, const char *name, int number)
-{
- tree decl;
-
- for (decl = syms; decl; decl = TREE_CHAIN (decl))
- if (DECL_NAME (decl)
- && strcmp (IDENTIFIER_POINTER (DECL_NAME (decl)), name) == 0)
- {
- TREE_ASM_WRITTEN (decl) = 1;
- TYPE_SYMTAB_ADDRESS (TREE_TYPE (decl)) = number;
- }
-}
-
-/* Setup gcc primitive types to use the XCOFF built-in type numbers where
- possible. */
-
-void
-xcoff_output_standard_types (tree syms)
+struct xcoff_type_number
{
- /* Handle built-in C types here. */
-
- assign_type_number (syms, "int", -1);
- assign_type_number (syms, "char", -2);
- assign_type_number (syms, "short int", -3);
- assign_type_number (syms, "long int", (TARGET_64BIT ? -31 : -4));
- assign_type_number (syms, "unsigned char", -5);
- assign_type_number (syms, "signed char", -6);
- assign_type_number (syms, "short unsigned int", -7);
- assign_type_number (syms, "unsigned int", -8);
+ const char *name;
+ int number;
+};
+static const struct xcoff_type_number xcoff_type_numbers[] = {
+ { "int", -1 },
+ { "char", -2 },
+ { "short int", -3 },
+ { "long int", -4 }, /* fiddled to -31 if 64 bits */
+ { "unsigned char", -5 },
+ { "signed char", -6 },
+ { "short unsigned int", -7 },
+ { "unsigned int", -8 },
/* No such type "unsigned". */
- assign_type_number (syms, "long unsigned int", (TARGET_64BIT ? -32 : -10));
- assign_type_number (syms, "void", -11);
- assign_type_number (syms, "float", -12);
- assign_type_number (syms, "double", -13);
- assign_type_number (syms, "long double", -14);
+ { "long unsigned int", -10 }, /* fiddled to -32 if 64 bits */
+ { "void", -11 },
+ { "float", -12 },
+ { "double", -13 },
+ { "long double", -14 },
/* Pascal and Fortran types run from -15 to -29. */
- assign_type_number (syms, "wchar", -30);
- assign_type_number (syms, "long long int", -31);
- assign_type_number (syms, "long long unsigned int", -32);
+ { "wchar", -30 }, /* XXX Should be "wchar_t" ? */
+ { "long long int", -31 },
+ { "long long unsigned int", -32 },
/* Additional Fortran types run from -33 to -37. */
/* ??? Should also handle built-in C++ and Obj-C types. There perhaps
aren't any that C doesn't already have. */
+};
+
+/* Returns an XCOFF fundamental type number for DECL (assumed to be a
+ TYPE_DECL), or 0 if dbxout.c should assign a type number normally. */
+int
+xcoff_assign_fundamental_type_number (tree decl)
+{
+ const char *name;
+ size_t i;
+
+ /* Do not waste time searching the list for non-intrinsic types. */
+ if (DECL_NAME (decl) == 0 || ! DECL_IS_BUILTIN (decl))
+ return 0;
+
+ name = IDENTIFIER_POINTER (DECL_NAME (decl));
+
+ /* Linear search, blech, but the list is too small to bother
+ doing anything else. */
+ for (i = 0; i < ARRAY_SIZE (xcoff_type_numbers); i++)
+ if (!strcmp (xcoff_type_numbers[i].name, name))
+ goto found;
+ return 0;
+
+ found:
+ /* -4 and -10 should be replaced with -31 and -32, respectively,
+ when used for a 64-bit type. */
+ if (int_size_in_bytes (TREE_TYPE (decl)) == 8)
+ {
+ if (xcoff_type_numbers[i].number == -4)
+ return -31;
+ if (xcoff_type_numbers[i].number == -10)
+ return -32;
+ }
+ return xcoff_type_numbers[i].number;
}
/* Print an error message for unrecognized stab codes. */
#define UNKNOWN_STAB(STR) \
- internal_error ("no sclass for %s stab (0x%x)\n", STR, stab)
+ internal_error ("no sclass for %s stab (0x%x)", STR, stab)
/* Conversion routine from BSD stabs to AIX storage classes. */
xcoffout_source_file (asm_out_file, filename, inline_p);
- ASM_OUTPUT_SOURCE_LINE (asm_out_file, line, 0);
+ ASM_OUTPUT_LINE (asm_out_file, line);
}
\f
/* Output the symbols defined in block number DO_BLOCK.
void
xcoffout_declare_function (FILE *file, tree decl, const char *name)
{
- int i;
+ size_t len;
if (*name == '*')
name++;
- else
- for (i = 0; name[i]; ++i)
- {
- if (name[i] == '[')
- {
- char *n = alloca (i + 1);
- strncpy (n, name, i);
- n[i] = '\0';
- name = n;
- break;
- }
- }
+ len = strlen (name);
+ if (name[len - 1] == ']')
+ {
+ char *n = alloca (len - 3);
+ memcpy (n, name, len - 4);
+ n[len - 4] = '\0';
+ name = n;
+ }
/* Any pending .bi or .ei must occur before the .function pseudo op.
Otherwise debuggers will think that the function is in the previous
xcoffout_block (DECL_INITIAL (current_function_decl), 0,
DECL_ARGUMENTS (current_function_decl));
- ASM_OUTPUT_SOURCE_LINE (asm_out_file, line, 0);
+ ASM_OUTPUT_LINE (asm_out_file, line);
}
/* Called at end of function (before epilogue).