From 0ee31dffb8202dcd1f867b7144db9a8bd69a7499 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Thu, 8 Sep 2022 12:43:33 +0100 Subject: [PATCH] Gas generated incorrect debug info (top-level DW_TAG_unspecified_type DIE) PR 29559 * dwarf2dbg.c (out_debug_info): Place DW_TAG_unspecified_type at the end of the list of children, not at the start of the CU information. * testsuite/gas/elf/dwarf-3-func.d: Update expected output. * testsuite/gas/elf/dwarf-5-func-global.d: Likewise. * testsuite/gas/elf/dwarf-5-func-local.d: Likewise. * testsuite/gas/elf/dwarf-5-func.d: Likewise. --- gas/ChangeLog | 11 ++++++ gas/dwarf2dbg.c | 37 +++++++++++++-------- gas/testsuite/gas/elf/dwarf-3-func.d | 10 +++--- gas/testsuite/gas/elf/dwarf-5-func-global.d | 6 ++-- gas/testsuite/gas/elf/dwarf-5-func-local.d | 6 ++-- gas/testsuite/gas/elf/dwarf-5-func.d | 10 +++--- 6 files changed, 50 insertions(+), 30 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index a54e5e2c680..6bca7add8f9 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,14 @@ +2022-09-08 Nick Clifton + + PR 29559 + * dwarf2dbg.c (out_debug_info): Place DW_TAG_unspecified_type at + the end of the list of children, not at the start of the CU + information. + * testsuite/gas/elf/dwarf-3-func.d: Update expected output. + * testsuite/gas/elf/dwarf-5-func-global.d: Likewise. + * testsuite/gas/elf/dwarf-5-func-local.d: Likewise. + * testsuite/gas/elf/dwarf-5-func.d: Likewise. + 2022-08-31 Frederic Cambus * configure.tgt (aarch64*-*-openbsd*): Add target. diff --git a/gas/dwarf2dbg.c b/gas/dwarf2dbg.c index dbcf9cf7226..612d8103438 100644 --- a/gas/dwarf2dbg.c +++ b/gas/dwarf2dbg.c @@ -2817,7 +2817,6 @@ out_debug_info (segT info_seg, segT abbrev_seg, segT line_seg, segT str_seg, expressionS exp; symbolS *info_end; int sizeof_offset; - valueT no_type_die = 0; memset (&exp, 0, sizeof exp); sizeof_offset = out_header (info_seg, &exp); @@ -2846,16 +2845,6 @@ out_debug_info (segT info_seg, segT abbrev_seg, segT line_seg, segT str_seg, TC_DWARF2_EMIT_OFFSET (section_symbol (abbrev_seg), sizeof_offset); } - if (func_form && DWARF2_VERSION > 2) - { - /* PR 29517: Generate a DIE for the unspecified type abbrev. - We do it here so that the offset from the start of the - section is fixed. */ - subseg_set (info_seg, 0); - no_type_die = frag_now_fix_octets (); - out_uleb128 (GAS_ABBREV_NO_TYPE); - } - /* DW_TAG_compile_unit DIE abbrev */ out_uleb128 (GAS_ABBREV_COMP_UNIT); @@ -2908,6 +2897,12 @@ out_debug_info (segT info_seg, segT abbrev_seg, segT line_seg, segT str_seg, if (func_form) { symbolS *symp; + symbolS *no_type_tag; + + if (DWARF2_VERSION > 2) + no_type_tag = symbol_make (".Ldebug_no_type_tag"); + else + no_type_tag = NULL; for (symp = symbol_rootP; symp; symp = symbol_next (symp)) { @@ -2957,10 +2952,15 @@ out_debug_info (segT info_seg, segT abbrev_seg, segT line_seg, segT str_seg, if (func_form == DW_FORM_flag) out_byte (S_IS_EXTERNAL (symp)); - /* PR 29517: Let consumers know that we do not - have return type information for this function. */ + /* PR 29517: Let consumers know that we do not have + return type information for this function. */ if (DWARF2_VERSION > 2) - out_uleb128 (no_type_die); + { + exp.X_op = O_symbol; + exp.X_add_symbol = no_type_tag; + exp.X_add_number = 0; + emit_leb128_expr (&exp, 0); + } /* DW_AT_low_pc */ exp.X_op = O_symbol; @@ -2982,6 +2982,15 @@ out_debug_info (segT info_seg, segT abbrev_seg, segT line_seg, segT str_seg, emit_leb128_expr (symbol_get_value_expression (size.X_op_symbol), 0); } + if (DWARF2_VERSION > 2) + { + /* PR 29517: Generate a DIE for the unspecified type abbrev. + We do it here because it cannot be part of the top level DIE. */ + subseg_set (info_seg, 0); + symbol_set_value_now (no_type_tag); + out_uleb128 (GAS_ABBREV_NO_TYPE); + } + /* End of children. */ out_leb128 (0); } diff --git a/gas/testsuite/gas/elf/dwarf-3-func.d b/gas/testsuite/gas/elf/dwarf-3-func.d index d084518aba1..c92b0d311c0 100644 --- a/gas/testsuite/gas/elf/dwarf-3-func.d +++ b/gas/testsuite/gas/elf/dwarf-3-func.d @@ -10,34 +10,34 @@ Contents of the .debug_info section: +Version: +3 +Abbrev Offset: +(0x)?0 +Pointer Size: .* - <0><[0-9a-f]+>: Abbrev Number: 3 \(DW_TAG_unspecified_type\) #... <0><[0-9a-f]+>: Abbrev Number: 1 \(DW_TAG_compile_unit\) #... <1><[0-9a-f]+>: Abbrev Number: 2 \(DW_TAG_subprogram\) +<[0-9a-f]+> +DW_AT_name +: \(strp\) \(offset: (0x)?[0-9a-f]+\): efunc1 +<[0-9a-f]+> +DW_AT_external +: \(flag\) 1 - +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x.> + +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x[0-9a-f]+> +<[0-9a-f]+> +DW_AT_low_pc +: \(addr\) (0x)?0 +<[0-9a-f]+> +DW_AT_high_pc +: \(addr\) (0x)?2 <1><[0-9a-f]+>: Abbrev Number: 2 \(DW_TAG_subprogram\) +<[0-9a-f]+> +DW_AT_name +: \(strp\) \(offset: (0x)?[0-9a-f]+\): lfunc1 +<[0-9a-f]+> +DW_AT_external +: \(flag\) 0 - +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x.> + +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x[0-9a-f]+> +<[0-9a-f]+> +DW_AT_low_pc +: \(addr\) (0x)?2 +<[0-9a-f]+> +DW_AT_high_pc +: \(addr\) (0x)?13 <1><[0-9a-f]+>: Abbrev Number: 2 \(DW_TAG_subprogram\) +<[0-9a-f]+> +DW_AT_name +: \(strp\) \(offset: (0x)?[0-9a-f]+\): efunc2 +<[0-9a-f]+> +DW_AT_external +: \(flag\) 1 - +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x.> + +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x[0-9a-f]+> +<[0-9a-f]+> +DW_AT_low_pc +: \(addr\) (0x)?13 +<[0-9a-f]+> +DW_AT_high_pc +: \(addr\) (0x)?35 <1><[0-9a-f]+>: Abbrev Number: 2 \(DW_TAG_subprogram\) +<[0-9a-f]+> +DW_AT_name +: \(strp\) \(offset: (0x)?[0-9a-f]+\): lfunc2 +<[0-9a-f]+> +DW_AT_external +: \(flag\) 0 - +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x.> + +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x[0-9a-f]+> +<[0-9a-f]+> +DW_AT_low_pc +: \(addr\) (0x)?35 +<[0-9a-f]+> +DW_AT_high_pc +: \(addr\) (0x)?38 + <1><[0-9a-f]+>: Abbrev Number: 3 \(DW_TAG_unspecified_type\) <1><[0-9a-f]+>: Abbrev Number: 0 Contents of the .debug_abbrev section: diff --git a/gas/testsuite/gas/elf/dwarf-5-func-global.d b/gas/testsuite/gas/elf/dwarf-5-func-global.d index 65c2ab0f512..090b8dabce3 100644 --- a/gas/testsuite/gas/elf/dwarf-5-func-global.d +++ b/gas/testsuite/gas/elf/dwarf-5-func-global.d @@ -12,22 +12,22 @@ Contents of the .debug_info section: +Unit Type: +DW_UT_compile \(1\) +Abbrev Offset: +(0x)?0 +Pointer Size: .* - <0><[0-9a-f]+>: Abbrev Number: 3 \(DW_TAG_unspecified_type\) #... <0><[0-9a-f]+>: Abbrev Number: 1 \(DW_TAG_compile_unit\) #... <1><[0-9a-f]+>: Abbrev Number: 2 \(DW_TAG_subprogram\) +<[0-9a-f]+> +DW_AT_name +: \(strp\) \(offset: (0x)?[0-9a-f]+\): efunc1 +<[0-9a-f]+> +DW_AT_external +: \(flag_present\) 1 - +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x.> + +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x[0-9a-f]+> +<[0-9a-f]+> +DW_AT_low_pc +: \(addr\) (0x)?0 +<[0-9a-f]+> +DW_AT_high_pc +: \(udata\) 2 <1><[0-9a-f]+>: Abbrev Number: 2 \(DW_TAG_subprogram\) +<[0-9a-f]+> +DW_AT_name +: \(strp\) \(offset: (0x)?[0-9a-f]+\): efunc2 +<[0-9a-f]+> +DW_AT_external +: \(flag_present\) 1 - +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x.> + +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x[0-9a-f]+> +<[0-9a-f]+> +DW_AT_low_pc +: \(addr\) (0x)?2 +<[0-9a-f]+> +DW_AT_high_pc +: \(udata\) 34 + <1><[0-9a-f]+>: Abbrev Number: 3 \(DW_TAG_unspecified_type\) <1><[0-9a-f]+>: Abbrev Number: 0 Contents of the .debug_abbrev section: diff --git a/gas/testsuite/gas/elf/dwarf-5-func-local.d b/gas/testsuite/gas/elf/dwarf-5-func-local.d index ac666ea93e1..7580c3e66db 100644 --- a/gas/testsuite/gas/elf/dwarf-5-func-local.d +++ b/gas/testsuite/gas/elf/dwarf-5-func-local.d @@ -12,20 +12,20 @@ Contents of the .debug_info section: +Unit Type: +DW_UT_compile \(1\) +Abbrev Offset: +(0x)?0 +Pointer Size: .* - <0><[0-9a-f]+>: Abbrev Number: 3 \(DW_TAG_unspecified_type\) #... <0><[0-9a-f]+>: Abbrev Number: 1 \(DW_TAG_compile_unit\) #... <1><[0-9a-f]+>: Abbrev Number: 2 \(DW_TAG_subprogram\) +<[0-9a-f]+> +DW_AT_name +: \(strp\) \(offset: (0x)?[0-9a-f]+\): lfunc1 - +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x.> + +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x[0-9a-f]+> +<[0-9a-f]+> +DW_AT_low_pc +: \(addr\) (0x)?0 +<[0-9a-f]+> +DW_AT_high_pc +: \(udata\) 17 <1><[0-9a-f]+>: Abbrev Number: 2 \(DW_TAG_subprogram\) +<[0-9a-f]+> +DW_AT_name +: \(strp\) \(offset: (0x)?[0-9a-f]+\): lfunc2 - +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x.> + +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x[0-9a-f]+> +<[0-9a-f]+> +DW_AT_low_pc +: \(addr\) (0x)?11 +<[0-9a-f]+> +DW_AT_high_pc +: \(udata\) 3 + <1><[0-9a-f]+>: Abbrev Number: 3 \(DW_TAG_unspecified_type\) <1><[0-9a-f]+>: Abbrev Number: 0 Contents of the .debug_abbrev section: diff --git a/gas/testsuite/gas/elf/dwarf-5-func.d b/gas/testsuite/gas/elf/dwarf-5-func.d index 612c9f23b16..df5cfc7882d 100644 --- a/gas/testsuite/gas/elf/dwarf-5-func.d +++ b/gas/testsuite/gas/elf/dwarf-5-func.d @@ -12,34 +12,34 @@ Contents of the .debug_info section: +Unit Type: +DW_UT_compile \(1\) +Abbrev Offset: +(0x)?0 +Pointer Size: .* - <0><[0-9a-f]+>: Abbrev Number: 3 \(DW_TAG_unspecified_type\) #... <0><[0-9a-f]+>: Abbrev Number: 1 \(DW_TAG_compile_unit\) #... <1><[0-9a-f]+>: Abbrev Number: 2 \(DW_TAG_subprogram\) +<[0-9a-f]+> +DW_AT_name +: \(strp\) \(offset: (0x)?[0-9a-f]+\): efunc1 +<[0-9a-f]+> +DW_AT_external +: \(flag\) 1 - +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x.> + +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x[0-9a-f]+> +<[0-9a-f]+> +DW_AT_low_pc +: \(addr\) (0x)?0 +<[0-9a-f]+> +DW_AT_high_pc +: \(udata\) 2 <1><[0-9a-f]+>: Abbrev Number: 2 \(DW_TAG_subprogram\) +<[0-9a-f]+> +DW_AT_name +: \(strp\) \(offset: (0x)?[0-9a-f]+\): lfunc1 +<[0-9a-f]+> +DW_AT_external +: \(flag\) 0 - +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x.> + +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x[0-9a-f]+> +<[0-9a-f]+> +DW_AT_low_pc +: \(addr\) (0x)?2 +<[0-9a-f]+> +DW_AT_high_pc +: \(udata\) 17 <1><[0-9a-f]+>: Abbrev Number: 2 \(DW_TAG_subprogram\) +<[0-9a-f]+> +DW_AT_name +: \(strp\) \(offset: (0x)?[0-9a-f]+\): efunc2 +<[0-9a-f]+> +DW_AT_external +: \(flag\) 1 - +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x.> + +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x[0-9a-f]+> +<[0-9a-f]+> +DW_AT_low_pc +: \(addr\) (0x)?13 +<[0-9a-f]+> +DW_AT_high_pc +: \(udata\) 34 <1><[0-9a-f]+>: Abbrev Number: 2 \(DW_TAG_subprogram\) +<[0-9a-f]+> +DW_AT_name +: \(strp\) \(offset: (0x)?[0-9a-f]+\): lfunc2 +<[0-9a-f]+> +DW_AT_external +: \(flag\) 0 - +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x.> + +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x[0-9a-f]+> +<[0-9a-f]+> +DW_AT_low_pc +: \(addr\) (0x)?35 +<[0-9a-f]+> +DW_AT_high_pc +: \(udata\) 3 + <1><[0-9a-f]+>: Abbrev Number: 3 \(DW_TAG_unspecified_type\) <1><[0-9a-f]+>: Abbrev Number: 0 Contents of the .debug_abbrev section: -- 2.39.2