On Tue, 1 Dec 2020, Jakub Jelinek wrote: > Hi! > > The following patch makes the choice between 32-bit and 64-bit DWARF formats > selectable by command line switch, rather than being hardcoded through > DWARF_OFFSET_SIZE macro. > > The options themselves don't turn on debug info themselves, so one needs > to use -g -gdwarf64 or similar. > > Ok for trunk if it passes bootstrap/regtest?
OK. Note there's /* Various DIE's use offsets relative to the beginning of the .debug_info section to refer to each other. */ typedef long int dw_offset; which on L32 hosts means we might not support dwarf64 generation for CUs that do not fit in 31bits? Should we change that to int64_t? Or should we sorry() for -gdwarf64 on 32bit hosts? There's also unsigned long die_abbrev; and other uses of '[unsigned] long' in dwarf2out.c. > I've tried it on a few smaller and larger testcases and readelf -wi was > happy about the output. Do dwarf32 and dwarf64 objects inter-operate just fine (as long as the linker can resolve all relocations w/o truncating)? Richard. > 2020-12-01 Jakub Jelinek <ja...@redhat.com> > > * common.opt (-gdwarf32, -gdwarf64): New options. > * config/rs6000/rs6000.c (rs6000_option_override_internal): Default > dwarf_offset_size to 8 if not overridden from the command line. > * dwarf2out.c: Change all occurrences of DWARF_OFFSET_SIZE to > dwarf_offset_size. > * doc/invoke.texi (-gdwarf32, -gdwarf64): Document. > > --- gcc/common.opt.jj 2020-11-26 01:14:47.444082913 +0100 > +++ gcc/common.opt 2020-12-01 11:07:33.088093473 +0100 > @@ -3178,6 +3178,14 @@ gdwarf- > Common Driver Joined UInteger Var(dwarf_version) Init(4) Negative(gstabs) > Generate debug information in DWARF v2 (or later) format. > > +gdwarf32 > +Common Driver Var(dwarf_offset_size,4) Init(4) RejectNegative > +Use 32-bit DWARF format when emitting DWARF debug information. > + > +gdwarf64 > +Common Driver Var(dwarf_offset_size,8) RejectNegative > +Use 64-bit DWARF format when emitting DWARF debug information. > + > ggdb > Common Driver JoinedOrMissing > Generate debug information in default extended format. > --- gcc/config/rs6000/rs6000.c.jj 2020-11-27 11:20:53.484334843 +0100 > +++ gcc/config/rs6000/rs6000.c 2020-12-01 11:12:31.618731395 +0100 > @@ -3863,6 +3863,12 @@ rs6000_option_override_internal (bool gl > if (TARGET_DEBUG_REG || TARGET_DEBUG_TARGET) > rs6000_print_isa_options (stderr, 0, "before defaults", > rs6000_isa_flags); > > +#ifdef XCOFF_DEBUGGING_INFO > + /* For AIX default to 64-bit DWARF. */ > + if (!global_options_set.x_dwarf_offset_size) > + dwarf_offset_size = 8; > +#endif > + > /* Handle explicit -mno-{altivec,vsx,power8-vector,power9-vector} and turn > off all of the options that depend on those flags. */ > ignore_masks = rs6000_disable_incompatible_switches (); > --- gcc/dwarf2out.c.jj 2020-12-01 09:41:07.223490914 +0100 > +++ gcc/dwarf2out.c 2020-12-01 11:03:04.692115667 +0100 > @@ -182,14 +182,14 @@ static GTY(()) section *debug_frame_sect > bytes. > > However, the SGI/MIPS ABI uses an initial length which is equal to > - DWARF_OFFSET_SIZE. It is defined (elsewhere) accordingly. */ > + dwarf_offset_size. It is defined (elsewhere) accordingly. */ > > #ifndef DWARF_INITIAL_LENGTH_SIZE > -#define DWARF_INITIAL_LENGTH_SIZE (DWARF_OFFSET_SIZE == 4 ? 4 : 12) > +#define DWARF_INITIAL_LENGTH_SIZE (dwarf_offset_size == 4 ? 4 : 12) > #endif > > #ifndef DWARF_INITIAL_LENGTH_SIZE_STR > -#define DWARF_INITIAL_LENGTH_SIZE_STR (DWARF_OFFSET_SIZE == 4 ? "-4" : "-12") > +#define DWARF_INITIAL_LENGTH_SIZE_STR (dwarf_offset_size == 4 ? "-4" : "-12") > #endif > > /* Round SIZE up to the nearest BOUNDARY. */ > @@ -199,7 +199,7 @@ static GTY(()) section *debug_frame_sect > /* CIE identifier. */ > #if HOST_BITS_PER_WIDE_INT >= 64 > #define DWARF_CIE_ID \ > - (unsigned HOST_WIDE_INT) (DWARF_OFFSET_SIZE == 4 ? DW_CIE_ID : DW64_CIE_ID) > + (unsigned HOST_WIDE_INT) (dwarf_offset_size == 4 ? DW_CIE_ID : DW64_CIE_ID) > #else > #define DWARF_CIE_ID DW_CIE_ID > #endif > @@ -287,8 +287,8 @@ static GTY(()) bool do_eh_frame = false; > static unsigned int rnglist_idx; > > /* Data and reference forms for relocatable data. */ > -#define DW_FORM_data (DWARF_OFFSET_SIZE == 8 ? DW_FORM_data8 : DW_FORM_data4) > -#define DW_FORM_ref (DWARF_OFFSET_SIZE == 8 ? DW_FORM_ref8 : DW_FORM_ref4) > +#define DW_FORM_data (dwarf_offset_size == 8 ? DW_FORM_data8 : DW_FORM_data4) > +#define DW_FORM_ref (dwarf_offset_size == 8 ? DW_FORM_ref8 : DW_FORM_ref4) > > #ifndef DEBUG_FRAME_SECTION > #define DEBUG_FRAME_SECTION ".debug_frame" > @@ -602,10 +602,10 @@ output_fde (dw_fde_ref fde, bool for_eh, > ASM_GENERATE_INTERNAL_LABEL (l2, FDE_END_LABEL, for_eh + j); > if (!XCOFF_DEBUGGING_INFO || for_eh) > { > - if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4 && !for_eh) > + if (DWARF_INITIAL_LENGTH_SIZE - dwarf_offset_size == 4 && !for_eh) > dw2_asm_output_data (4, 0xffffffff, "Initial length escape value" > " indicating 64-bit DWARF extension"); > - dw2_asm_output_delta (for_eh ? 4 : DWARF_OFFSET_SIZE, l2, l1, > + dw2_asm_output_delta (for_eh ? 4 : dwarf_offset_size, l2, l1, > "FDE Length"); > } > ASM_OUTPUT_LABEL (asm_out_file, l1); > @@ -613,7 +613,7 @@ output_fde (dw_fde_ref fde, bool for_eh, > if (for_eh) > dw2_asm_output_delta (4, l1, section_start_label, "FDE CIE offset"); > else > - dw2_asm_output_offset (DWARF_OFFSET_SIZE, section_start_label, > + dw2_asm_output_offset (dwarf_offset_size, section_start_label, > debug_frame_section, "FDE CIE offset"); > > begin = second ? fde->dw_fde_second_begin : fde->dw_fde_begin; > @@ -806,17 +806,17 @@ output_call_frame_info (int for_eh) > ASM_GENERATE_INTERNAL_LABEL (l2, CIE_END_LABEL, for_eh); > if (!XCOFF_DEBUGGING_INFO || for_eh) > { > - if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4 && !for_eh) > + if (DWARF_INITIAL_LENGTH_SIZE - dwarf_offset_size == 4 && !for_eh) > dw2_asm_output_data (4, 0xffffffff, > "Initial length escape value indicating 64-bit DWARF extension"); > - dw2_asm_output_delta (for_eh ? 4 : DWARF_OFFSET_SIZE, l2, l1, > + dw2_asm_output_delta (for_eh ? 4 : dwarf_offset_size, l2, l1, > "Length of Common Information Entry"); > } > ASM_OUTPUT_LABEL (asm_out_file, l1); > > /* Now that the CIE pointer is PC-relative for EH, > use 0 to identify the CIE. */ > - dw2_asm_output_data ((for_eh ? 4 : DWARF_OFFSET_SIZE), > + dw2_asm_output_data ((for_eh ? 4 : dwarf_offset_size), > (for_eh ? 0 : DWARF_CIE_ID), > "CIE Identifier Tag"); > > @@ -1623,7 +1623,7 @@ loc_list_plus_const (dw_loc_list_ref lis > } > > #define DWARF_REF_SIZE \ > - (dwarf_version == 2 ? DWARF2_ADDR_SIZE : DWARF_OFFSET_SIZE) > + (dwarf_version == 2 ? DWARF2_ADDR_SIZE : dwarf_offset_size) > > /* The number of bits that can be encoded by largest DW_FORM_dataN. > In DWARF4 and earlier it is DW_FORM_data8 with 64 bits, in DWARF5 > @@ -3229,33 +3229,33 @@ skeleton_chain_node; > > /* Fixed size portion of the DWARF compilation unit header. */ > #define DWARF_COMPILE_UNIT_HEADER_SIZE \ > - (DWARF_INITIAL_LENGTH_SIZE + DWARF_OFFSET_SIZE \ > + (DWARF_INITIAL_LENGTH_SIZE + dwarf_offset_size \ > + (dwarf_version >= 5 ? 4 : 3)) > > /* Fixed size portion of the DWARF comdat type unit header. */ > #define DWARF_COMDAT_TYPE_UNIT_HEADER_SIZE \ > (DWARF_COMPILE_UNIT_HEADER_SIZE \ > - + DWARF_TYPE_SIGNATURE_SIZE + DWARF_OFFSET_SIZE) > + + DWARF_TYPE_SIGNATURE_SIZE + dwarf_offset_size) > > /* Fixed size portion of the DWARF skeleton compilation unit header. */ > #define DWARF_COMPILE_UNIT_SKELETON_HEADER_SIZE \ > (DWARF_COMPILE_UNIT_HEADER_SIZE + (dwarf_version >= 5 ? 8 : 0)) > > /* Fixed size portion of public names info. */ > -#define DWARF_PUBNAMES_HEADER_SIZE (2 * DWARF_OFFSET_SIZE + 2) > +#define DWARF_PUBNAMES_HEADER_SIZE (2 * dwarf_offset_size + 2) > > /* Fixed size portion of the address range info. */ > #define DWARF_ARANGES_HEADER_SIZE \ > - (DWARF_ROUND (DWARF_INITIAL_LENGTH_SIZE + DWARF_OFFSET_SIZE + 4, \ > + (DWARF_ROUND (DWARF_INITIAL_LENGTH_SIZE + dwarf_offset_size + 4, \ > DWARF2_ADDR_SIZE * 2) \ > - DWARF_INITIAL_LENGTH_SIZE) > > /* Size of padding portion in the address range info. It must be > aligned to twice the pointer size. */ > #define DWARF_ARANGES_PAD_SIZE \ > - (DWARF_ROUND (DWARF_INITIAL_LENGTH_SIZE + DWARF_OFFSET_SIZE + 4, \ > + (DWARF_ROUND (DWARF_INITIAL_LENGTH_SIZE + dwarf_offset_size + 4, \ > DWARF2_ADDR_SIZE * 2) \ > - - (DWARF_INITIAL_LENGTH_SIZE + DWARF_OFFSET_SIZE + 4)) > + - (DWARF_INITIAL_LENGTH_SIZE + dwarf_offset_size + 4)) > > /* Use assembler line directives if available. */ > #ifndef DWARF2_ASM_LINE_DEBUG_INFO > @@ -4787,7 +4787,7 @@ find_string_form (struct indirect_string > > /* If the string is shorter or equal to the size of the reference, it is > always better to put it inline. */ > - if (len <= DWARF_OFFSET_SIZE || node->refcount == 0) > + if (len <= (unsigned) dwarf_offset_size || node->refcount == 0) > return node->form = DW_FORM_string; > > /* If we cannot expect the linker to merge strings in .debug_str > @@ -4795,7 +4795,7 @@ find_string_form (struct indirect_string > single module. */ > if (DWARF2_INDIRECT_STRING_SUPPORT_MISSING_ON_TARGET > || ((debug_str_section->common.flags & SECTION_MERGE) == 0 > - && (len - DWARF_OFFSET_SIZE) * node->refcount <= len)) > + && (len - dwarf_offset_size) * node->refcount <= len)) > return node->form = DW_FORM_string; > > set_indirect_string (node); > @@ -8892,7 +8892,7 @@ output_loclists_offsets (dw_die_ref die) > dw_loc_list_ref l = AT_loc_list (a); > if (l->offset_emitted) > continue; > - dw2_asm_output_delta (DWARF_OFFSET_SIZE, l->ll_symbol, > + dw2_asm_output_delta (dwarf_offset_size, l->ll_symbol, > loc_section_label, NULL); > gcc_assert (l->hash == loc_list_idx); > loc_list_idx++; > @@ -9400,7 +9400,7 @@ size_of_die (dw_die_ref die) > size += DWARF2_ADDR_SIZE; > break; > case dw_val_class_offset: > - size += DWARF_OFFSET_SIZE; > + size += dwarf_offset_size; > break; > case dw_val_class_loc: > { > @@ -9421,10 +9421,10 @@ size_of_die (dw_die_ref die) > size += size_of_uleb128 (AT_loc_list (a)->hash); > } > else > - size += DWARF_OFFSET_SIZE; > + size += dwarf_offset_size; > break; > case dw_val_class_view_list: > - size += DWARF_OFFSET_SIZE; > + size += dwarf_offset_size; > break; > case dw_val_class_range_list: > if (value_format (a) == DW_FORM_rnglistx) > @@ -9434,7 +9434,7 @@ size_of_die (dw_die_ref die) > size += size_of_uleb128 (r->idx); > } > else > - size += DWARF_OFFSET_SIZE; > + size += dwarf_offset_size; > break; > case dw_val_class_const: > size += size_of_sleb128 (AT_int (a)); > @@ -9508,13 +9508,13 @@ size_of_die (dw_die_ref die) > else if (dwarf_version == 2) > size += DWARF2_ADDR_SIZE; > else > - size += DWARF_OFFSET_SIZE; > + size += dwarf_offset_size; > } > else > - size += DWARF_OFFSET_SIZE; > + size += dwarf_offset_size; > break; > case dw_val_class_fde_ref: > - size += DWARF_OFFSET_SIZE; > + size += dwarf_offset_size; > break; > case dw_val_class_lbl_id: > if (dwarf_split_debug_info && AT_index (a) != NOT_INDEXED) > @@ -9528,12 +9528,12 @@ size_of_die (dw_die_ref die) > case dw_val_class_lineptr: > case dw_val_class_macptr: > case dw_val_class_loclistsptr: > - size += DWARF_OFFSET_SIZE; > + size += dwarf_offset_size; > break; > case dw_val_class_str: > form = AT_string_form (a); > if (form == DW_FORM_strp || form == DW_FORM_line_strp) > - size += DWARF_OFFSET_SIZE; > + size += dwarf_offset_size; > else if (form == dwarf_FORM (DW_FORM_strx)) > size += size_of_uleb128 (AT_index (a)); > else > @@ -9546,7 +9546,7 @@ size_of_die (dw_die_ref die) > size += 8; > break; > case dw_val_class_vms_delta: > - size += DWARF_OFFSET_SIZE; > + size += dwarf_offset_size; > break; > case dw_val_class_high_pc: > size += DWARF2_ADDR_SIZE; > @@ -9724,9 +9724,9 @@ size_of_pubnames (vec<pubname_entry, va_ > size = DWARF_PUBNAMES_HEADER_SIZE; > FOR_EACH_VEC_ELT (*names, i, p) > if (include_pubname_in_output (names, p)) > - size += strlen (p->name) + DWARF_OFFSET_SIZE + 1 + space_for_flags; > + size += strlen (p->name) + dwarf_offset_size + 1 + space_for_flags; > > - size += DWARF_OFFSET_SIZE; > + size += dwarf_offset_size; > return size; > } > > @@ -9823,7 +9823,7 @@ value_format (dw_attr_node *a) > /* FALLTHRU */ > case dw_val_class_vms_delta: > case dw_val_class_offset: > - switch (DWARF_OFFSET_SIZE) > + switch (dwarf_offset_size) > { > case 4: > return DW_FORM_data4; > @@ -10525,7 +10525,7 @@ output_range_list_offset (dw_attr_node * > if (dwarf_version >= 5) > { > dw_ranges *r = &(*ranges_table)[a->dw_attr_val.v.val_offset]; > - dw2_asm_output_offset (DWARF_OFFSET_SIZE, r->label, > + dw2_asm_output_offset (dwarf_offset_size, r->label, > debug_ranges_section, "%s", name); > } > else > @@ -10533,7 +10533,7 @@ output_range_list_offset (dw_attr_node * > char *p = strchr (ranges_section_label, '\0'); > sprintf (p, "+" HOST_WIDE_INT_PRINT_HEX, > a->dw_attr_val.v.val_offset * 2 * DWARF2_ADDR_SIZE); > - dw2_asm_output_offset (DWARF_OFFSET_SIZE, ranges_section_label, > + dw2_asm_output_offset (dwarf_offset_size, ranges_section_label, > debug_ranges_section, "%s", name); > *p = '\0'; > } > @@ -10545,7 +10545,7 @@ output_range_list_offset (dw_attr_node * > dw2_asm_output_data_uleb128 (r->idx, "%s", name); > } > else > - dw2_asm_output_data (DWARF_OFFSET_SIZE, > + dw2_asm_output_data (dwarf_offset_size, > a->dw_attr_val.v.val_offset * 2 * DWARF2_ADDR_SIZE, > "%s (offset from %s)", name, ranges_section_label); > } > @@ -10559,7 +10559,7 @@ output_loc_list_offset (dw_attr_node *a) > > gcc_assert (sym); > if (!dwarf_split_debug_info) > - dw2_asm_output_offset (DWARF_OFFSET_SIZE, sym, debug_loc_section, > + dw2_asm_output_offset (dwarf_offset_size, sym, debug_loc_section, > "%s", dwarf_attr_name (a->dw_attr)); > else if (dwarf_version >= 5) > { > @@ -10569,7 +10569,7 @@ output_loc_list_offset (dw_attr_node *a) > sym); > } > else > - dw2_asm_output_delta (DWARF_OFFSET_SIZE, sym, loc_section_label, > + dw2_asm_output_delta (dwarf_offset_size, sym, loc_section_label, > "%s", dwarf_attr_name (a->dw_attr)); > } > > @@ -10582,10 +10582,10 @@ output_view_list_offset (dw_attr_node *a > > gcc_assert (sym); > if (dwarf_split_debug_info) > - dw2_asm_output_delta (DWARF_OFFSET_SIZE, sym, loc_section_label, > + dw2_asm_output_delta (dwarf_offset_size, sym, loc_section_label, > "%s", dwarf_attr_name (a->dw_attr)); > else > - dw2_asm_output_offset (DWARF_OFFSET_SIZE, sym, debug_loc_section, > + dw2_asm_output_offset (dwarf_offset_size, sym, debug_loc_section, > "%s", dwarf_attr_name (a->dw_attr)); > } > > @@ -10663,7 +10663,7 @@ output_die (dw_die_ref die) > break; > > case dw_val_class_offset: > - dw2_asm_output_data (DWARF_OFFSET_SIZE, a->dw_attr_val.v.val_offset, > + dw2_asm_output_data (dwarf_offset_size, a->dw_attr_val.v.val_offset, > "%s", name); > break; > > @@ -10857,7 +10857,7 @@ output_die (dw_die_ref die) > if (dwarf_version == 2) > size = DWARF2_ADDR_SIZE; > else > - size = DWARF_OFFSET_SIZE; > + size = dwarf_offset_size; > /* ??? We cannot unconditionally output die_offset if > non-zero - others might create references to those > DIEs via symbols. > @@ -10877,7 +10877,7 @@ output_die (dw_die_ref die) > else > { > gcc_assert (AT_ref (a)->die_offset); > - dw2_asm_output_data (DWARF_OFFSET_SIZE, AT_ref (a)->die_offset, > + dw2_asm_output_data (dwarf_offset_size, AT_ref (a)->die_offset, > "%s", name); > } > break; > @@ -10888,18 +10888,18 @@ output_die (dw_die_ref die) > > ASM_GENERATE_INTERNAL_LABEL (l1, FDE_LABEL, > a->dw_attr_val.v.val_fde_index * 2); > - dw2_asm_output_offset (DWARF_OFFSET_SIZE, l1, debug_frame_section, > + dw2_asm_output_offset (dwarf_offset_size, l1, debug_frame_section, > "%s", name); > } > break; > > case dw_val_class_vms_delta: > #ifdef ASM_OUTPUT_DWARF_VMS_DELTA > - dw2_asm_output_vms_delta (DWARF_OFFSET_SIZE, > + dw2_asm_output_vms_delta (dwarf_offset_size, > AT_vms_delta2 (a), AT_vms_delta1 (a), > "%s", name); > #else > - dw2_asm_output_delta (DWARF_OFFSET_SIZE, > + dw2_asm_output_delta (dwarf_offset_size, > AT_vms_delta2 (a), AT_vms_delta1 (a), > "%s", name); > #endif > @@ -10910,28 +10910,28 @@ output_die (dw_die_ref die) > break; > > case dw_val_class_lineptr: > - dw2_asm_output_offset (DWARF_OFFSET_SIZE, AT_lbl (a), > + dw2_asm_output_offset (dwarf_offset_size, AT_lbl (a), > debug_line_section, "%s", name); > break; > > case dw_val_class_macptr: > - dw2_asm_output_offset (DWARF_OFFSET_SIZE, AT_lbl (a), > + dw2_asm_output_offset (dwarf_offset_size, AT_lbl (a), > debug_macinfo_section, "%s", name); > break; > > case dw_val_class_loclistsptr: > - dw2_asm_output_offset (DWARF_OFFSET_SIZE, AT_lbl (a), > + dw2_asm_output_offset (dwarf_offset_size, AT_lbl (a), > debug_loc_section, "%s", name); > break; > > case dw_val_class_str: > if (a->dw_attr_val.v.val_str->form == DW_FORM_strp) > - dw2_asm_output_offset (DWARF_OFFSET_SIZE, > + dw2_asm_output_offset (dwarf_offset_size, > a->dw_attr_val.v.val_str->label, > debug_str_section, > "%s: \"%s\"", name, AT_string (a)); > else if (a->dw_attr_val.v.val_str->form == DW_FORM_line_strp) > - dw2_asm_output_offset (DWARF_OFFSET_SIZE, > + dw2_asm_output_offset (dwarf_offset_size, > a->dw_attr_val.v.val_str->label, > debug_line_str_section, > "%s: \"%s\"", name, AT_string (a)); > @@ -11048,10 +11048,10 @@ output_compilation_unit_header (enum dwa > { > if (!XCOFF_DEBUGGING_INFO) > { > - if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4) > + if (DWARF_INITIAL_LENGTH_SIZE - dwarf_offset_size == 4) > dw2_asm_output_data (4, 0xffffffff, > "Initial length escape value indicating 64-bit DWARF extension"); > - dw2_asm_output_data (DWARF_OFFSET_SIZE, > + dw2_asm_output_data (dwarf_offset_size, > next_die_offset - DWARF_INITIAL_LENGTH_SIZE, > "Length of Compilation Unit Info"); > } > @@ -11071,7 +11071,7 @@ output_compilation_unit_header (enum dwa > dw2_asm_output_data (1, ut, "%s", name); > dw2_asm_output_data (1, DWARF2_ADDR_SIZE, "Pointer Size (in bytes)"); > } > - dw2_asm_output_offset (DWARF_OFFSET_SIZE, abbrev_section_label, > + dw2_asm_output_offset (dwarf_offset_size, abbrev_section_label, > debug_abbrev_section, > "Offset Into Abbrev. Section"); > if (dwarf_version < 5) > @@ -11261,12 +11261,12 @@ output_skeleton_debug_sections (dw_die_r > /* Produce the skeleton compilation-unit header. This one differs enough > from > a normal CU header that it's better not to call output_compilation_unit > header. */ > - if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4) > + if (DWARF_INITIAL_LENGTH_SIZE - dwarf_offset_size == 4) > dw2_asm_output_data (4, 0xffffffff, > "Initial length escape value indicating 64-bit " > "DWARF extension"); > > - dw2_asm_output_data (DWARF_OFFSET_SIZE, > + dw2_asm_output_data (dwarf_offset_size, > DWARF_COMPILE_UNIT_SKELETON_HEADER_SIZE > - DWARF_INITIAL_LENGTH_SIZE > + size_of_die (comp_unit), > @@ -11277,7 +11277,7 @@ output_skeleton_debug_sections (dw_die_r > dw2_asm_output_data (1, DW_UT_skeleton, "DW_UT_skeleton"); > dw2_asm_output_data (1, DWARF2_ADDR_SIZE, "Pointer Size (in bytes)"); > } > - dw2_asm_output_offset (DWARF_OFFSET_SIZE, > debug_skeleton_abbrev_section_label, > + dw2_asm_output_offset (dwarf_offset_size, > debug_skeleton_abbrev_section_label, > debug_skeleton_abbrev_section, > "Offset Into Abbrev. Section"); > if (dwarf_version < 5) > @@ -11362,7 +11362,7 @@ output_comdat_type_unit (comdat_type_nod > output_compilation_unit_header (dwarf_split_debug_info > ? DW_UT_split_type : DW_UT_type); > output_signature (node->signature, "Type Signature"); > - dw2_asm_output_data (DWARF_OFFSET_SIZE, node->type_die->die_offset, > + dw2_asm_output_data (dwarf_offset_size, node->type_die->die_offset, > "Offset to Type DIE"); > output_die (node->root_die); > > @@ -11491,7 +11491,7 @@ output_pubname (dw_offset die_offset, pu > dw_die_ref die = entry->die; > int is_static = get_AT_flag (die, DW_AT_external) ? 0 : 1; > > - dw2_asm_output_data (DWARF_OFFSET_SIZE, die_offset, "DIE offset"); > + dw2_asm_output_data (dwarf_offset_size, die_offset, "DIE offset"); > > if (debug_generate_pub_sections == 2) > { > @@ -11565,10 +11565,10 @@ output_pubnames (vec<pubname_entry, va_g > > if (!XCOFF_DEBUGGING_INFO) > { > - if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4) > + if (DWARF_INITIAL_LENGTH_SIZE - dwarf_offset_size == 4) > dw2_asm_output_data (4, 0xffffffff, > "Initial length escape value indicating 64-bit DWARF extension"); > - dw2_asm_output_data (DWARF_OFFSET_SIZE, pubnames_length, > + dw2_asm_output_data (dwarf_offset_size, pubnames_length, > "Pub Info Length"); > } > > @@ -11576,14 +11576,14 @@ output_pubnames (vec<pubname_entry, va_g > dw2_asm_output_data (2, 2, "DWARF pubnames/pubtypes version"); > > if (dwarf_split_debug_info) > - dw2_asm_output_offset (DWARF_OFFSET_SIZE, > debug_skeleton_info_section_label, > + dw2_asm_output_offset (dwarf_offset_size, > debug_skeleton_info_section_label, > debug_skeleton_info_section, > "Offset of Compilation Unit Info"); > else > - dw2_asm_output_offset (DWARF_OFFSET_SIZE, debug_info_section_label, > + dw2_asm_output_offset (dwarf_offset_size, debug_info_section_label, > debug_info_section, > "Offset of Compilation Unit Info"); > - dw2_asm_output_data (DWARF_OFFSET_SIZE, next_die_offset, > + dw2_asm_output_data (dwarf_offset_size, next_die_offset, > "Compilation Unit Length"); > > FOR_EACH_VEC_ELT (*names, i, pub) > @@ -11614,7 +11614,7 @@ output_pubnames (vec<pubname_entry, va_g > } > } > > - dw2_asm_output_data (DWARF_OFFSET_SIZE, 0, NULL); > + dw2_asm_output_data (dwarf_offset_size, 0, NULL); > } > > /* Output public names and types tables if necessary. */ > @@ -11647,21 +11647,21 @@ output_aranges (void) > > if (!XCOFF_DEBUGGING_INFO) > { > - if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4) > + if (DWARF_INITIAL_LENGTH_SIZE - dwarf_offset_size == 4) > dw2_asm_output_data (4, 0xffffffff, > "Initial length escape value indicating 64-bit DWARF extension"); > - dw2_asm_output_data (DWARF_OFFSET_SIZE, aranges_length, > + dw2_asm_output_data (dwarf_offset_size, aranges_length, > "Length of Address Ranges Info"); > } > > /* Version number for aranges is still 2, even up to DWARF5. */ > dw2_asm_output_data (2, 2, "DWARF aranges version"); > if (dwarf_split_debug_info) > - dw2_asm_output_offset (DWARF_OFFSET_SIZE, > debug_skeleton_info_section_label, > + dw2_asm_output_offset (dwarf_offset_size, > debug_skeleton_info_section_label, > debug_skeleton_info_section, > "Offset of Compilation Unit Info"); > else > - dw2_asm_output_offset (DWARF_OFFSET_SIZE, debug_info_section_label, > + dw2_asm_output_offset (dwarf_offset_size, debug_info_section_label, > debug_info_section, > "Offset of Compilation Unit Info"); > dw2_asm_output_data (1, DWARF2_ADDR_SIZE, "Size of Address"); > @@ -11936,11 +11936,11 @@ output_rnglists (unsigned generation) > 2 + generation * 4); > ASM_GENERATE_INTERNAL_LABEL (l2, DEBUG_RANGES_SECTION_LABEL, > 3 + generation * 4); > - if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4) > + if (DWARF_INITIAL_LENGTH_SIZE - dwarf_offset_size == 4) > dw2_asm_output_data (4, 0xffffffff, > "Initial length escape value indicating " > "64-bit DWARF extension"); > - dw2_asm_output_delta (DWARF_OFFSET_SIZE, l2, l1, > + dw2_asm_output_delta (dwarf_offset_size, l2, l1, > "Length of Range Lists"); > ASM_OUTPUT_LABEL (asm_out_file, l1); > output_dwarf_version (); > @@ -11959,7 +11959,7 @@ output_rnglists (unsigned generation) > ASM_OUTPUT_LABEL (asm_out_file, ranges_base_label); > FOR_EACH_VEC_SAFE_ELT (ranges_table, i, r) > if (r->label) > - dw2_asm_output_delta (DWARF_OFFSET_SIZE, r->label, > + dw2_asm_output_delta (dwarf_offset_size, r->label, > ranges_base_label, NULL); > } > > @@ -12219,7 +12219,7 @@ output_line_string (enum dwarf_form form > node = find_AT_string_in_table (str, debug_line_str_hash); > set_indirect_string (node); > node->form = form; > - dw2_asm_output_offset (DWARF_OFFSET_SIZE, node->label, > + dw2_asm_output_offset (dwarf_offset_size, node->label, > debug_line_str_section, "%s: %#x: \"%s\"", > entry_kind, 0, node->str); > break; > @@ -12728,10 +12728,10 @@ output_line_info (bool prologue_only) > > if (!XCOFF_DEBUGGING_INFO) > { > - if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4) > + if (DWARF_INITIAL_LENGTH_SIZE - dwarf_offset_size == 4) > dw2_asm_output_data (4, 0xffffffff, > "Initial length escape value indicating 64-bit DWARF extension"); > - dw2_asm_output_delta (DWARF_OFFSET_SIZE, l2, l1, > + dw2_asm_output_delta (dwarf_offset_size, l2, l1, > "Length of Source Line Info"); > } > > @@ -12743,7 +12743,7 @@ output_line_info (bool prologue_only) > dw2_asm_output_data (1, DWARF2_ADDR_SIZE, "Address Size"); > dw2_asm_output_data (1, 0, "Segment Size"); > } > - dw2_asm_output_delta (DWARF_OFFSET_SIZE, p2, p1, "Prolog Length"); > + dw2_asm_output_delta (dwarf_offset_size, p2, p1, "Prolog Length"); > ASM_OUTPUT_LABEL (asm_out_file, p1); > > /* Define the architecture-dependent minimum instruction length (in bytes). > @@ -28306,7 +28306,7 @@ output_macinfo_op (macinfo_entry *ref) > case DW_MACINFO_undef: > len = strlen (ref->info) + 1; > if (!dwarf_strict > - && len > DWARF_OFFSET_SIZE > + && len > (size_t) dwarf_offset_size > && !DWARF2_INDIRECT_STRING_SUPPORT_MISSING_ON_TARGET > && (debug_str_section->common.flags & SECTION_MERGE) != 0) > { > @@ -28347,7 +28347,7 @@ output_macinfo_op (macinfo_entry *ref) > dw2_asm_output_data_uleb128 (ref->lineno, "At line number %lu", > (unsigned long) ref->lineno); > if (node->form == DW_FORM_strp) > - dw2_asm_output_offset (DWARF_OFFSET_SIZE, node->label, > + dw2_asm_output_offset (dwarf_offset_size, node->label, > debug_str_section, "The macro: \"%s\"", > ref->info); > else > @@ -28359,7 +28359,7 @@ output_macinfo_op (macinfo_entry *ref) > ASM_GENERATE_INTERNAL_LABEL (label, > DEBUG_MACRO_SECTION_LABEL, > ref->lineno + macinfo_label_base); > - dw2_asm_output_offset (DWARF_OFFSET_SIZE, label, NULL, NULL); > + dw2_asm_output_offset (dwarf_offset_size, label, NULL, NULL); > break; > default: > fprintf (asm_out_file, "%s unrecognized macinfo code %lu\n", > @@ -28443,7 +28443,7 @@ optimize_macinfo_range (unsigned int idx > /* The group name format is: wmN.[<encoded filename>.]<lineno>.<md5sum> */ > grp_name = XALLOCAVEC (char, 4 + encoded_filename_len + linebuf_len + 1 > + 16 * 2 + 1); > - memcpy (grp_name, DWARF_OFFSET_SIZE == 4 ? "wm4." : "wm8.", 4); > + memcpy (grp_name, dwarf_offset_size == 4 ? "wm4." : "wm8.", 4); > tail = grp_name + 4; > if (encoded_filename_len) > { > @@ -28514,7 +28514,7 @@ save_macinfo_strings (void) > case DW_MACINFO_undef: > len = strlen (ref->info) + 1; > if (!dwarf_strict > - && len > DWARF_OFFSET_SIZE > + && len > (unsigned) dwarf_offset_size > && !DWARF2_INDIRECT_STRING_SUPPORT_MISSING_ON_TARGET > && (debug_str_section->common.flags & SECTION_MERGE) != 0) > set_indirect_string (find_AT_string (ref->info)); > @@ -28567,11 +28567,11 @@ output_macinfo (const char *debug_line_l > { > dw2_asm_output_data (2, dwarf_version >= 5 ? 5 : 4, > "DWARF macro version number"); > - if (DWARF_OFFSET_SIZE == 8) > + if (dwarf_offset_size == 8) > dw2_asm_output_data (1, 3, "Flags: 64-bit, lineptr present"); > else > dw2_asm_output_data (1, 2, "Flags: 32-bit, lineptr present"); > - dw2_asm_output_offset (DWARF_OFFSET_SIZE, debug_line_label, > + dw2_asm_output_offset (dwarf_offset_size, debug_line_label, > debug_line_section, NULL); > } > > @@ -28660,7 +28660,7 @@ output_macinfo (const char *debug_line_l > ref->info = NULL; > dw2_asm_output_data (2, dwarf_version >= 5 ? 5 : 4, > "DWARF macro version number"); > - if (DWARF_OFFSET_SIZE == 8) > + if (dwarf_offset_size == 8) > dw2_asm_output_data (1, 1, "Flags: 64-bit"); > else > dw2_asm_output_data (1, 0, "Flags: 32-bit"); > @@ -28997,7 +28997,7 @@ output_index_string_offset (indirect_str > /* Assert that this node has been assigned an index. */ > gcc_assert (node->index != NO_INDEX_ASSIGNED > && node->index != NOT_INDEXED); > - dw2_asm_output_data (DWARF_OFFSET_SIZE, *offset, > + dw2_asm_output_data (dwarf_offset_size, *offset, > "indexed string 0x%x: %s", node->index, > node->str); > *offset += strlen (node->str) + 1; > } > @@ -29091,11 +29091,11 @@ output_indirect_strings (void) > > debug_str_hash->traverse_noresize > <unsigned int *, count_index_strings> (&last_idx); > - str_offsets_length = last_idx * DWARF_OFFSET_SIZE + 4; > - if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4) > + str_offsets_length = last_idx * dwarf_offset_size + 4; > + if (DWARF_INITIAL_LENGTH_SIZE - dwarf_offset_size == 4) > dw2_asm_output_data (4, 0xffffffff, > "Escape value for 64-bit DWARF extension"); > - dw2_asm_output_data (DWARF_OFFSET_SIZE, str_offsets_length, > + dw2_asm_output_data (dwarf_offset_size, str_offsets_length, > "Length of string offsets unit"); > dw2_asm_output_data (2, 5, "DWARF string offsets version"); > dw2_asm_output_data (2, 0, "Header zero padding"); > @@ -29185,10 +29185,10 @@ output_addr_table (void) > <unsigned int *, count_index_addrs> (&last_idx); > addrs_length = last_idx * DWARF2_ADDR_SIZE + 4; > > - if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4) > + if (DWARF_INITIAL_LENGTH_SIZE - dwarf_offset_size == 4) > dw2_asm_output_data (4, 0xffffffff, > "Escape value for 64-bit DWARF extension"); > - dw2_asm_output_data (DWARF_OFFSET_SIZE, addrs_length, > + dw2_asm_output_data (dwarf_offset_size, addrs_length, > "Length of Address Unit"); > dw2_asm_output_data (2, 5, "DWARF addr version"); > dw2_asm_output_data (1, DWARF2_ADDR_SIZE, "Size of Address"); > @@ -31747,11 +31747,11 @@ dwarf2out_finish (const char *filename) > { > ASM_GENERATE_INTERNAL_LABEL (l1, DEBUG_LOC_SECTION_LABEL, 2); > ASM_GENERATE_INTERNAL_LABEL (l2, DEBUG_LOC_SECTION_LABEL, 3); > - if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4) > + if (DWARF_INITIAL_LENGTH_SIZE - dwarf_offset_size == 4) > dw2_asm_output_data (4, 0xffffffff, > "Initial length escape value indicating " > "64-bit DWARF extension"); > - dw2_asm_output_delta (DWARF_OFFSET_SIZE, l2, l1, > + dw2_asm_output_delta (dwarf_offset_size, l2, l1, > "Length of Location Lists"); > ASM_OUTPUT_LABEL (asm_out_file, l1); > output_dwarf_version (); > --- gcc/doc/invoke.texi.jj 2020-11-27 11:20:53.509334560 +0100 > +++ gcc/doc/invoke.texi 2020-12-01 11:23:01.743634441 +0100 > @@ -452,7 +452,7 @@ Objective-C and Objective-C++ Dialects}. > -gstabs -gstabs+ -gstrict-dwarf -gno-strict-dwarf @gol > -gas-loc-support -gno-as-loc-support @gol > -gas-locview-support -gno-as-locview-support @gol > --gcolumn-info -gno-column-info @gol > +-gcolumn-info -gno-column-info -gdwarf32 -gdwarf64 @gol > -gstatement-frontiers -gno-statement-frontiers @gol > -gvariable-location-views -gno-variable-location-views @gol > -ginternal-reset-location-views -gno-internal-reset-location-views @gol > @@ -9569,6 +9569,18 @@ information as possible into a separate > debug information. To be useful, this option requires a debugger capable of > reading @file{.dwo} files. > > +@item -gdwarf32 > +@itemx -gdwarf64 > +@opindex gdwarf32 > +@opindex gdwarf64 > +If DWARF debugging information is enabled, the @option{-gdwarf32} selects > +the 32-bit DWARF format and the @option{-gdwarf64} selects the 64-bit > +DWARF format. The default is target specific, on most targets it is > +@option{-gdwarf32} though. The 32-bit DWARF format is smaller, but > +can't support more than 2GiB of debug information in any of the DWARF > +debug information sections. The 64-bit DWARF format allows larger debug > +information and might not be well supported by all consumers yet. > + > @item -gdescribe-dies > @opindex gdescribe-dies > Add description attributes to some DWARF DIEs that have no name attribute, > > Jakub > > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg, Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)