diff options
Diffstat (limited to 'gdb/testsuite/lib/dwarf.exp')
-rw-r--r-- | gdb/testsuite/lib/dwarf.exp | 72 |
1 files changed, 67 insertions, 5 deletions
diff --git a/gdb/testsuite/lib/dwarf.exp b/gdb/testsuite/lib/dwarf.exp index 7dcf13f..46b39a1 100644 --- a/gdb/testsuite/lib/dwarf.exp +++ b/gdb/testsuite/lib/dwarf.exp @@ -1,4 +1,4 @@ -# Copyright 2010-2024 Free Software Foundation, Inc. +# Copyright 2010-2025 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -1244,7 +1244,6 @@ namespace eval Dwarf { # used, as indicated in the header of the section where the location # description is found. # - # (FIXME should use 'info complete' here.) # Each list's first element is the opcode, either short or long # forms are accepted. # FIXME argument handling @@ -1252,9 +1251,18 @@ namespace eval Dwarf { proc _location { body dwarf_version addr_size offset_size } { variable _constants + set collected_lines "" foreach line [split $body \n] { # Ignore blank lines, and allow embedded comments. - if {[lindex $line 0] == "" || [regexp -- {^[ \t]*#} $line]} { + if { [regexp -- {^[ \t]*$} $line] || [regexp -- {^[ \t]*#} $line] } { + continue + } + if { $collected_lines != "" } { + set line "$collected_lines\n$line" + set collected_lines "" + } + if { ! [info complete $line] } { + set collected_lines $line continue } set opcode [_map_name [lindex $line 0] _OP] @@ -1340,6 +1348,17 @@ namespace eval Dwarf { _op .2byte $argvec(label) } + DW_OP_entry_value { + _get_args $line $opcode body + set l1 [new_label "expr_start"] + set l2 [new_label "expr_end"] + _op .uleb128 "$l2 - $l1" "expression" + define_label $l1 + _location $argvec(body) $dwarf_version $addr_size \ + $offset_size + define_label $l2 + } + DW_OP_implicit_value { set l1 [new_label "value_start"] set l2 [new_label "value_end"] @@ -1441,6 +1460,17 @@ namespace eval Dwarf { # default = default # fission 0|1 - boolean indicating if generating Fission debug info # default = 0 + # dwo_id - The value to use as the dwo_id field of skeleton and + # split_compile unit headers. May only be used with DWARF + # version 5. + # + # If a dwo_id value is specified (is non-zero), this unit is + # assumed to be part of a skeleton/split_unit pair. The unit + # type will be chosen according to the `fission` value. + # + # When using DWARF version 5 and fission is non-zero, it is + # mandatory to provide a non-zero dwo_id value. + # default = 0 # label <label> # - string indicating label to be defined at the start # of the CU header. @@ -1463,6 +1493,7 @@ namespace eval Dwarf { set _cu_version 4 set _cu_addr_size default set _cu_is_fission 0 + set dwo_id 0 set section ".debug_info" set _abbrev_section ".debug_abbrev" set label "" @@ -1474,6 +1505,7 @@ namespace eval Dwarf { version { set _cu_version $value } addr_size { set _cu_addr_size $value } fission { set _cu_is_fission $value } + dwo_id { set dwo_id $value } label { set label $value } default { error "unknown option $name" } } @@ -1524,12 +1556,42 @@ namespace eval Dwarf { # The CU header for DWARF 4 and 5 are slightly different. if { $_cu_version == 5 } { - _op .byte 0x1 "DW_UT_compile" + # The presence of a DWO_ID indicates that we generate a skeleton + # or split_compile unit. + if { $dwo_id != 0 } { + if { $_cu_is_fission } { + set unit_type_name "DW_UT_split_compile" + } else { + set unit_type_name "DW_UT_skeleton" + } + } else { + set unit_type_name "DW_UT_compile" + } + + _op .byte $_constants($unit_type_name) $unit_type_name _op .byte $_cu_addr_size "Pointer size" _op_offset $_cu_offset_size $my_abbrevs Abbrevs + + # Output DWO ID, if specified. + if { $dwo_id != 0 } { + _op .8byte $dwo_id "DWO_ID" + } else { + # To help catch user errors: if the caller asked to put this + # unit in the DWO file but didn't provide a DWO ID, it is likely + # an error. + if { $_cu_is_fission } { + error "DWO ID not specified for DWARF 5 split compile" + } + } } else { _op_offset $_cu_offset_size $my_abbrevs Abbrevs _op .byte $_cu_addr_size "Pointer size" + + # For DWARF versions < 5, the DWO ID is not in the unit header, + # so it makes not sense to specify one. + if { $dwo_id != 0 } { + error "DWO ID specified for DWARF < 5 unit" + } } _defer_output $_abbrev_section { @@ -1606,7 +1668,7 @@ namespace eval Dwarf { } if { $_cu_is_fission } { set section "$section.dwo" - set _abbrev_section "$section.dwo" + set _abbrev_section "$_abbrev_section.dwo" } _section $section |