diff options
Diffstat (limited to 'gcc/dbxout.c')
-rw-r--r-- | gcc/dbxout.c | 79 |
1 files changed, 76 insertions, 3 deletions
diff --git a/gcc/dbxout.c b/gcc/dbxout.c index 2db1f3a9fe2..bd7f9a7881e 100644 --- a/gcc/dbxout.c +++ b/gcc/dbxout.c @@ -294,6 +294,7 @@ static void dbxout_finish PARAMS ((const char *)); static void dbxout_start_source_file PARAMS ((unsigned, const char *)); static void dbxout_end_source_file PARAMS ((unsigned)); static void dbxout_typedefs PARAMS ((tree)); +static void dbxout_fptype_value PARAMS ((tree)); static void dbxout_type_index PARAMS ((tree)); #if DBX_CONTIN_LENGTH > 0 static void dbxout_continue PARAMS ((void)); @@ -396,11 +397,15 @@ dbxout_function_end () /* By convention, GCC will mark the end of a function with an N_FUN symbol and an empty string. */ +#ifdef DBX_OUTPUT_NFUN + DBX_OUTPUT_NFUN (asmfile, lscope_label_name, current_function_decl); +#else fprintf (asmfile, "%s\"\",%d,0,0,", ASM_STABS_OP, N_FUN); assemble_name (asmfile, lscope_label_name); putc ('-', asmfile); assemble_name (asmfile, XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0)); fprintf (asmfile, "\n"); +#endif } #endif /* DBX_DEBUGGING_INFO */ @@ -684,6 +689,61 @@ dbxout_finish (filename) #endif /* DBX_OUTPUT_MAIN_SOURCE_FILE_END */ } +/* Output floating point type values used by the 'R' stab letter. + These numbers come from include/aout/stab_gnu.h in binutils/gdb. + + There are only 3 real/complex types defined, and we need 7/6. + We use NF_SINGLE as a generic float type, and NF_COMPLEX as a generic + complex type. Since we have the type size anyways, we don't really need + to distinguish between different FP types, we only need to distinguish + between float and complex. This works fine with gdb. + + We only use this for complex types, to avoid breaking backwards + compatibility for real types. complex types aren't in ISO C90, so it is + OK if old debuggers don't understand the debug info we emit for them. */ + +/* ??? These are supposed to be IEEE types, but we don't check for that. + We could perhaps add additional numbers for non-IEEE types if we need + them. */ + +static void +dbxout_fptype_value (type) + tree type; +{ + char value = '0'; + enum machine_mode mode = TYPE_MODE (type); + + if (TREE_CODE (type) == REAL_TYPE) + { + if (mode == SFmode) + value = '1'; + else if (mode == DFmode) + value = '2'; + else if (mode == TFmode || mode == XFmode) + value = '6'; + else + /* Use NF_SINGLE as a generic real type for other sizes. */ + value = '1'; + } + else if (TREE_CODE (type) == COMPLEX_TYPE) + { + if (mode == SCmode) + value = '3'; + else if (mode == DCmode) + value = '4'; + else if (mode == TCmode || mode == XCmode) + value = '5'; + else + /* Use NF_COMPLEX as a generic complex type for other sizes. */ + value = '3'; + } + else + abort (); + + putc (value, asmfile); + CHARS (1); +} + /* Output the index of a type. */ static void @@ -1219,7 +1279,20 @@ dbxout_type (type, full) write it as a subtype. */ else if (TREE_TYPE (type) != 0 && TREE_CODE (TREE_TYPE (type)) == INTEGER_TYPE) - dbxout_range_type (type); + { + /* If the size is non-standard, say what it is if we can use + GDB extensions. */ + + if (use_gnu_debug_info_extensions + && TYPE_PRECISION (type) != TYPE_PRECISION (integer_type_node)) + { + have_used_extensions = 1; + fprintf (asmfile, "@s%d;", TYPE_PRECISION (type)); + CHARS (5); + } + + dbxout_range_type (type); + } else { @@ -1342,9 +1415,9 @@ dbxout_type (type, full) if (TREE_CODE (TREE_TYPE (type)) == REAL_TYPE) { - fprintf (asmfile, "r"); + putc ('R', asmfile); CHARS (1); - dbxout_type_index (type); + dbxout_fptype_value (type); putc (';', asmfile); CHARS (1); print_wide_int (2 * int_size_in_bytes (TREE_TYPE (type))); |