dwarf2out.c (output_compilation_unit_header): For -gdwarf-4 use version 4 instead of version 3.

* dwarf2out.c (output_compilation_unit_header): For
	-gdwarf-4 use version 4 instead of version 3.
	(output_line_info): For version 4 and above emit additional
	maximum ops per insn header field.
	(DWARF_LINE_DEFAULT_MAX_OPS_PER_INSN): Define.

	* dwarf2out.c (is_c_family, is_java): Remove.
	(lower_bound_default): New function.
	(add_bound_info, gen_descr_array_type_die): Use it.

From-SVN: r157930
This commit is contained in:
Jakub Jelinek 2010-04-01 21:45:02 +02:00 committed by Jakub Jelinek
parent 777351a5fd
commit 2f43d500a6
2 changed files with 65 additions and 42 deletions

View File

@ -1,3 +1,15 @@
2010-04-01 Jakub Jelinek <jakub@redhat.com>
* dwarf2out.c (output_compilation_unit_header): For
-gdwarf-4 use version 4 instead of version 3.
(output_line_info): For version 4 and above emit additional
maximum ops per insn header field.
(DWARF_LINE_DEFAULT_MAX_OPS_PER_INSN): Define.
* dwarf2out.c (is_c_family, is_java): Remove.
(lower_bound_default): New function.
(add_bound_info, gen_descr_array_type_die): Use it.
2010-04-01 Dodji Seketeli <dodji@redhat.com>
PR debug/43325

View File

@ -5689,6 +5689,11 @@ skeleton_chain_node;
is not made available by the GCC front-end. */
#define DWARF_LINE_DEFAULT_IS_STMT_START 1
/* Maximum number of operations per instruction bundle. */
#ifndef DWARF_LINE_DEFAULT_MAX_OPS_PER_INSN
#define DWARF_LINE_DEFAULT_MAX_OPS_PER_INSN 1
#endif
#ifdef DWARF2_DEBUGGING_INFO
/* This location is used by calc_die_sizes() to keep track
the offset of each DIE within the .debug_info section. */
@ -5964,9 +5969,7 @@ static const char *get_AT_string (dw_die_ref, enum dwarf_attribute);
static int get_AT_flag (dw_die_ref, enum dwarf_attribute);
static unsigned get_AT_unsigned (dw_die_ref, enum dwarf_attribute);
static inline dw_die_ref get_AT_ref (dw_die_ref, enum dwarf_attribute);
static bool is_c_family (void);
static bool is_cxx (void);
static bool is_java (void);
static bool is_fortran (void);
static bool is_ada (void);
static void remove_AT (dw_die_ref, enum dwarf_attribute);
@ -7443,18 +7446,6 @@ get_AT_file (dw_die_ref die, enum dwarf_attribute attr_kind)
return a ? AT_file (a) : NULL;
}
/* Return TRUE if the language is C or C++. */
static inline bool
is_c_family (void)
{
unsigned int lang = get_AT_unsigned (comp_unit_die, DW_AT_language);
return (lang == DW_LANG_C || lang == DW_LANG_C89 || lang == DW_LANG_ObjC
|| lang == DW_LANG_C99
|| lang == DW_LANG_C_plus_plus || lang == DW_LANG_ObjC_plus_plus);
}
/* Return TRUE if the language is C++. */
static inline bool
@ -7477,16 +7468,6 @@ is_fortran (void)
|| lang == DW_LANG_Fortran95);
}
/* Return TRUE if the language is Java. */
static inline bool
is_java (void)
{
unsigned int lang = get_AT_unsigned (comp_unit_die, DW_AT_language);
return lang == DW_LANG_Java;
}
/* Return TRUE if the language is Ada. */
static inline bool
@ -10687,11 +10668,6 @@ output_compilation_unit_header (void)
{
int ver = dwarf_version;
/* Don't mark the output as DWARF-4 until we make full use of the
version 4 extensions, and gdb supports them. For now, -gdwarf-4
selects only a few extensions from the DWARF-4 spec. */
if (ver > 3)
ver = 3;
if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4)
dw2_asm_output_data (4, 0xffffffff,
"Initial length escape value indicating 64-bit DWARF extension");
@ -11538,12 +11514,6 @@ output_line_info (void)
unsigned long function;
int ver = dwarf_version;
/* Don't mark the output as DWARF-4 until we make full use of the
version 4 extensions, and gdb supports them. For now, -gdwarf-4
selects only a few extensions from the DWARF-4 spec. */
if (ver > 3)
ver = 3;
ASM_GENERATE_INTERNAL_LABEL (l1, LINE_NUMBER_BEGIN_LABEL, 0);
ASM_GENERATE_INTERNAL_LABEL (l2, LINE_NUMBER_END_LABEL, 0);
ASM_GENERATE_INTERNAL_LABEL (p1, LN_PROLOG_AS_LABEL, 0);
@ -11571,6 +11541,9 @@ output_line_info (void)
dw2_asm_output_data (1, 1,
"Minimum Instruction Length");
if (ver >= 4)
dw2_asm_output_data (1, DWARF_LINE_DEFAULT_MAX_OPS_PER_INSN,
"Maximum Operations Per Instruction");
dw2_asm_output_data (1, DWARF_LINE_DEFAULT_IS_STMT_START,
"Default is_stmt_start flag");
dw2_asm_output_data (1, DWARF_LINE_BASE,
@ -16339,6 +16312,42 @@ add_comp_dir_attribute (dw_die_ref die)
add_AT_string (die, DW_AT_comp_dir, remap_debug_filename (wd));
}
/* Return the default for DW_AT_lower_bound, or -1 if there is not any
default. */
static int
lower_bound_default (void)
{
switch (get_AT_unsigned (comp_unit_die, DW_AT_language))
{
case DW_LANG_C:
case DW_LANG_C89:
case DW_LANG_C99:
case DW_LANG_C_plus_plus:
case DW_LANG_ObjC:
case DW_LANG_ObjC_plus_plus:
case DW_LANG_Java:
return 0;
case DW_LANG_Fortran77:
case DW_LANG_Fortran90:
case DW_LANG_Fortran95:
return 1;
case DW_LANG_UPC:
case DW_LANG_D:
return dwarf_version >= 4 ? 0 : -1;
case DW_LANG_Ada95:
case DW_LANG_Ada83:
case DW_LANG_Cobol74:
case DW_LANG_Cobol85:
case DW_LANG_Pascal83:
case DW_LANG_Modula2:
case DW_LANG_PLI:
return dwarf_version >= 4 ? 1 : -1;
default:
return -1;
}
}
/* Given a tree node describing an array bound (either lower or upper) output
a representation for that bound. */
@ -16356,11 +16365,13 @@ add_bound_info (dw_die_ref subrange_die, enum dwarf_attribute bound_attr, tree b
case INTEGER_CST:
{
unsigned int prec = simple_type_size_in_bits (TREE_TYPE (bound));
int dflt;
/* Use the default if possible. */
if (bound_attr == DW_AT_lower_bound
&& (((is_c_family () || is_java ()) && integer_zerop (bound))
|| (is_fortran () && integer_onep (bound))))
&& host_integerp (bound, 0)
&& (dflt = lower_bound_default ()) != -1
&& tree_low_cst (bound, 0) == dflt)
;
/* Otherwise represent the bound as an unsigned value with the
@ -17261,11 +17272,11 @@ gen_descr_array_type_die (tree type, struct array_descr_info *info,
if (info->dimen[dim].lower_bound)
{
/* If it is the default value, omit it. */
if ((is_c_family () || is_java ())
&& integer_zerop (info->dimen[dim].lower_bound))
;
else if (is_fortran ()
&& integer_onep (info->dimen[dim].lower_bound))
int dflt;
if (host_integerp (info->dimen[dim].lower_bound, 0)
&& (dflt = lower_bound_default ()) != -1
&& tree_low_cst (info->dimen[dim].lower_bound, 0) == dflt)
;
else
add_descr_info_field (subrange_die, DW_AT_lower_bound,