summaryrefslogtreecommitdiff
path: root/gcc/xcoffout.c
diff options
context:
space:
mode:
authorzack <zack@138bc75d-0d04-0410-961f-82ee72b054a4>2004-02-12 21:42:28 +0000
committerzack <zack@138bc75d-0d04-0410-961f-82ee72b054a4>2004-02-12 21:42:28 +0000
commit73ae3ef72f8c419fc963cd401e8cc2ef53d9434b (patch)
treecfa7bbb13d0bfc85e73ea5724b507a1d241d14d5 /gcc/xcoffout.c
parentcdfbccf4aec52c4f8777f857e7b34e5f0fd24627 (diff)
downloadgcc-73ae3ef72f8c419fc963cd401e8cc2ef53d9434b.tar.gz
* debug.h (struct gcc_debug_hooks): Add type_decl field.
(debug_nothing_tree_int): Prototype. (dwarf_debug_hooks): Delete, unused. * debug.c (do_nothing_debug_hooks): Update. (debug_nothing_tree_int): New function. * langhooks.h (struct lang_hooks_for_decls): Remove builtin_type_decls field. * langhooks-def.h (LANG_HOOKS_BUILTIN_TYPE_DECLS): Delete. (LANG_HOOKS_DECLS): Update. * toplev.c (rest_of_decl_compilation, rest_of_type_compilation): Use debug_hooks->type_decl. * dbxout.c (preinit_symbols): New static. (dbx_debug_hooks, xcoff_debug_hooks): Update. (dbxout_init): Don't call DBX_OUTPUT_STANDARD_TYPES or lang_hooks.decls.builtin_type_decls. Do scan preinit_symbols for symbols to output. (dbxout_type_decl): New function. (dbxout_symbol): If called before dbxout_init has run, queue the symbol for later. Apply DBX_ASSIGN_FUNDAMENTAL_TYPE_NUMBER to TYPE_DECLs before emitting them. * xcoffout.c (assign_type_number): Delete. (xcoff_type_numbers): New static table. (xcoff_assign_fundamental_type_number): New function. * xcoffout.h: Define DBX_ASSIGN_FUNDAMENTAL_TYPE_NUMBER, not DBX_OUTPUT_STANDARD_TYPES. Remove unnecessary #ifdefs. * sdbout.c: Include varray.h. (deferred_global_decls): New static. (sdb_debug_hooks): Update. (sdbout_global_decl): If we can't emit something right now, remember it in deferred_global_decls. (sdbout_finish): Just scan deferred_global_decls; don't call getdecls. (sdbout_init): Initialize deferred_global_decls. * Makefile.in: Update dependencies of sdbout.o. * dwarf2out.c (dwarf2out_type_decl): New function. (dwarf2_debug_hooks): Update. * vmsdbgout.c (vmsdbg_debug_hooks): Update. * c-decl.c (getdecls): Just return 0. (check_for_loop_decls): Don't use getdecls. (record_builtin_type): Call debug_hooks->type_decl on the TYPE_DECL. * c-objc-common.c (c_objc_common_finish_file): Don't use getdecls. cp: * cp-lang.c: Don't define LANG_HOOKS_BUILTIN_TYPE_DECLS. * cp-tree.h: Don't declare cxx_builtin_type_decls. * decl.c (builtin_type_decls, cxx_builtin_type_decls): Delete. (record_builtin_type): Call debug_hooks->type_decl on the TYPE_DECL. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@77730 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/xcoffout.c')
-rw-r--r--gcc/xcoffout.c94
1 files changed, 53 insertions, 41 deletions
diff --git a/gcc/xcoffout.c b/gcc/xcoffout.c
index 324c5d5fa5b..447da746ac4 100644
--- a/gcc/xcoffout.c
+++ b/gcc/xcoffout.c
@@ -112,59 +112,71 @@ const char *xcoff_lastfile;
#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);
/* 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)
+struct xcoff_type_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)
-{
- /* 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 = IDENTIFIER_POINTER (DECL_NAME (decl));
+ size_t i;
+
+ /* Do not waste time searching the list for non-intrinsic types. */
+ if (DECL_SOURCE_LINE (decl) > 0)
+ return 0;
+
+ /* 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. */