From: Doug Evans Date: Mon, 20 May 2013 22:11:37 +0000 (+0000) Subject: * lib/dwarf.exp (Dwarf): New variable _abbrev_section. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=6c9e2db469f1c0783213045c6d7680078575f641;p=binutils-gdb.git * lib/dwarf.exp (Dwarf): New variable _abbrev_section. (_handle_DW_TAG): Use it. (cu, tu): Replace parameters is_64, version, addr_size with options. All callers updated. Add Fission support. * gdb.dwarf2/implptrconst.exp: Update callers of "cu". * gdb.dwarf2/method-ptr.exp: Ditto. * gdb.dwarf2/nostaticblock.exp: Ditto. * gdb.dwarf2/subrange.exp: Ditto. * gdb.dwarf2/missing-sig-type.exp: Update callers of "cu", "tu". --- diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 0aa2086f1bc..3af60673cc9 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,15 @@ +2013-05-20 Doug Evans + + * lib/dwarf.exp (Dwarf): New variable _abbrev_section. + (_handle_DW_TAG): Use it. + (cu, tu): Replace parameters is_64, version, addr_size with options. + All callers updated. Add Fission support. + * gdb.dwarf2/implptrconst.exp: Update callers of "cu". + * gdb.dwarf2/method-ptr.exp: Ditto. + * gdb.dwarf2/nostaticblock.exp: Ditto. + * gdb.dwarf2/subrange.exp: Ditto. + * gdb.dwarf2/missing-sig-type.exp: Update callers of "cu", "tu". + 2013-05-20 Tom Tromey * gdb.gdb/python-selftest.exp: New file. diff --git a/gdb/testsuite/gdb.dwarf2/implptrconst.exp b/gdb/testsuite/gdb.dwarf2/implptrconst.exp index 7eca600d3cd..1c89c43002e 100644 --- a/gdb/testsuite/gdb.dwarf2/implptrconst.exp +++ b/gdb/testsuite/gdb.dwarf2/implptrconst.exp @@ -29,7 +29,7 @@ set asm_file [standard_output_file $srcfile2] Dwarf::assemble $asm_file { # Creating a CU with 4-byte addresses lets this test link on both # 32- and 64-bit machines. - cu 0 2 4 { + cu { addr_size 4 } { compile_unit {} { declare_labels byte_label size_type_label array_label declare_labels var_label ptr_label diff --git a/gdb/testsuite/gdb.dwarf2/method-ptr.exp b/gdb/testsuite/gdb.dwarf2/method-ptr.exp index d76d63ec2f5..846a0ed30f6 100644 --- a/gdb/testsuite/gdb.dwarf2/method-ptr.exp +++ b/gdb/testsuite/gdb.dwarf2/method-ptr.exp @@ -29,7 +29,7 @@ Dwarf::assemble $asm_file { declare_labels int_label float_label struct_label declare_labels ptr_label subr_label memptr_label - cu 0 2 8 { + cu {} { compile_unit {{language @DW_LANG_C_plus_plus}} { int_label: base_type { {name int} diff --git a/gdb/testsuite/gdb.dwarf2/missing-sig-type.exp b/gdb/testsuite/gdb.dwarf2/missing-sig-type.exp index 32a0843cd44..e6049b0cfc5 100644 --- a/gdb/testsuite/gdb.dwarf2/missing-sig-type.exp +++ b/gdb/testsuite/gdb.dwarf2/missing-sig-type.exp @@ -26,7 +26,7 @@ standard_testfile main.c missing-sig-type-dw4.S # Make some DWARF for the test. set asm_file [standard_output_file $srcfile2] Dwarf::assemble $asm_file { - cu 0 4 8 { + cu {} { compile_unit {} { declare_labels typedef_label @@ -38,7 +38,7 @@ Dwarf::assemble $asm_file { } } - tu 0 4 8 0x1122334455667788 the_type { + tu {} 0x1122334455667788 the_type { type_unit {} { the_type: base_type { {name int} diff --git a/gdb/testsuite/gdb.dwarf2/nostaticblock.exp b/gdb/testsuite/gdb.dwarf2/nostaticblock.exp index 69e4c609274..9db1f263e90 100644 --- a/gdb/testsuite/gdb.dwarf2/nostaticblock.exp +++ b/gdb/testsuite/gdb.dwarf2/nostaticblock.exp @@ -26,7 +26,7 @@ standard_testfile main.c .S # Make some DWARF for the test. set asm_file [standard_output_file $srcfile2] Dwarf::assemble $asm_file { - cu 0 2 8 { + cu {} { compile_unit { {low_pc 0x104320 DW_FORM_addr} {high_pc 0x1045ed DW_FORM_addr} diff --git a/gdb/testsuite/gdb.dwarf2/subrange.exp b/gdb/testsuite/gdb.dwarf2/subrange.exp index 51db92e0dc9..e9b273baa60 100644 --- a/gdb/testsuite/gdb.dwarf2/subrange.exp +++ b/gdb/testsuite/gdb.dwarf2/subrange.exp @@ -26,7 +26,7 @@ standard_testfile method-ptr.cc subrange-dw.S # Make some DWARF for the test. set asm_file [standard_output_file $srcfile2] Dwarf::assemble $asm_file { - cu 0 2 8 { + cu {} { compile_unit {{language @DW_LANG_Pascal83}} { declare_labels byte_label typedef_label array_label diff --git a/gdb/testsuite/lib/dwarf.exp b/gdb/testsuite/lib/dwarf.exp index 2e5a3f74431..7efaacac907 100644 --- a/gdb/testsuite/lib/dwarf.exp +++ b/gdb/testsuite/lib/dwarf.exp @@ -137,6 +137,10 @@ namespace eval Dwarf { # Otherwise, this is the name of a section to write to. variable _defer + # The abbrev section. Typically .debug_abbrev but can be .debug_abbrev.dwo + # for Fission. + variable _abbrev_section + # The next available abbrev number in the current CU's abbrev # table. variable _abbrev_num @@ -401,6 +405,7 @@ namespace eval Dwarf { } proc _handle_DW_TAG {tag_name {attrs {}} {children {}}} { + variable _abbrev_section variable _abbrev_num variable _constants @@ -409,7 +414,7 @@ namespace eval Dwarf { # We somewhat wastefully emit a new abbrev entry for each tag. # There's no reason for this other than laziness. - _defer_output .debug_abbrev { + _defer_output $_abbrev_section { _op .uleb128 $my_abbrev "Abbrev start" _op .uleb128 $_constants($tag_name) $tag_name _op .byte $has_children "has_children" @@ -429,13 +434,13 @@ namespace eval Dwarf { _handle_DW_FORM $attr_form $attr_value - _defer_output .debug_abbrev { + _defer_output $_abbrev_section { _op .uleb128 $_constants($attr_name) $attr_name _op .uleb128 $_constants($attr_form) $attr_form } } - _defer_output .debug_abbrev { + _defer_output $_abbrev_section { # Terminator. _op .byte 0x0 Terminator _op .byte 0x0 Terminator @@ -667,29 +672,52 @@ namespace eval Dwarf { } # Emit a DWARF CU. - # IS_64 is a boolean which is true if you want to emit 64-bit - # DWARF, and false for 32-bit DWARF. - # VERSION is the DWARF version number to emit. - # ADDR_SIZE is the size of addresses in bytes. + # OPTIONS is a list with an even number of elements containing + # option-name and option-value pairs. + # Current options are: + # is_64 0|1 - boolean indicating if you want to emit 64-bit DWARF + # default = 0 (32-bit) + # version n - DWARF version number to emit + # default = 4 + # addr_size n - the size of addresses, 32 or 64 + # default = 64 + # fission 0|1 - boolean indicating if generating Fission debug info + # default = 0 # BODY is Tcl code that emits the DIEs which make up the body of # the CU. It is evaluated in the caller's context. - proc cu {is_64 version addr_size body} { + proc cu {options body} { variable _cu_count + variable _abbrev_section variable _abbrev_num variable _cu_label variable _cu_version variable _cu_addr_size variable _cu_offset_size - set _cu_version $version - if {$is_64} { - set _cu_offset_size 8 - } else { - set _cu_offset_size 4 + # Establish the defaults. + set is_64 0 + set _cu_version 4 + set _cu_addr_size 8 + set fission 0 + set section ".debug_info" + set _abbrev_section ".debug_abbrev" + + foreach { name value } $options { + switch -exact -- $name { + is_64 { set is_64 $value } + version { set _cu_version $value } + addr_size { set _cu_addr_size $value } + fission { set fission $value } + default { error "unknown option $name" } + } + } + set _cu_offset_size [expr { $is_64 ? 8 : 4 }] + if { $fission } { + set section ".debug_info.dwo" + set _abbrev_section ".debug_abbrev.dwo" } - set _cu_addr_size $addr_size - _section .debug_info + _section $section set cu_num [incr _cu_count] set my_abbrevs [_compute_label "abbrev${cu_num}_begin"] @@ -707,17 +735,17 @@ namespace eval Dwarf { _op .4byte "$end_label - $start_label" } define_label $start_label - _op .2byte $version Version + _op .2byte $_cu_version Version _op .4byte $my_abbrevs Abbrevs - _op .byte $addr_size "Pointer size" + _op .byte $_cu_addr_size "Pointer size" - _defer_output .debug_abbrev { + _defer_output $_abbrev_section { define_label $my_abbrevs } uplevel $body - _defer_output .debug_abbrev { + _defer_output $_abbrev_section { # Emit the terminator. _op .byte 0x0 Terminator _op .byte 0x0 Terminator @@ -727,31 +755,55 @@ namespace eval Dwarf { } # Emit a DWARF TU. - # IS_64 is a boolean which is true if you want to emit 64-bit - # DWARF, and false for 32-bit DWARF. - # VERSION is the DWARF version number to emit. - # ADDR_SIZE is the size of addresses in bytes. + # OPTIONS is a list with an even number of elements containing + # option-name and option-value pairs. + # Current options are: + # is_64 0|1 - boolean indicating if you want to emit 64-bit DWARF + # default = 0 (32-bit) + # version n - DWARF version number to emit + # default = 4 + # addr_size n - the size of addresses, 32 or 64 + # default = 64 + # fission 0|1 - boolean indicating if generating Fission debug info + # default = 0 # SIGNATURE is the 64-bit signature of the type. - # TYPE_LABEL is the label of the type defined by this TU. + # TYPE_LABEL is the label of the type defined by this TU, + # or "" if there is no type (i.e., type stubs in Fission). # BODY is Tcl code that emits the DIEs which make up the body of - # the CU. It is evaluated in the caller's context. - proc tu {is_64 version addr_size signature type_label body} { + # the TU. It is evaluated in the caller's context. + proc tu {options signature type_label body} { variable _cu_count + variable _abbrev_section variable _abbrev_num variable _cu_label variable _cu_version variable _cu_addr_size variable _cu_offset_size - set _cu_version $version - if {$is_64} { - set _cu_offset_size 8 - } else { - set _cu_offset_size 4 + # Establish the defaults. + set is_64 0 + set _cu_version 4 + set _cu_addr_size 8 + set fission 0 + set section ".debug_types" + set _abbrev_section ".debug_abbrev" + + foreach { name value } $options { + switch -exact -- $name { + is_64 { set is_64 $value } + version { set _cu_version $value } + addr_size { set _cu_addr_size $value } + fission { set fission $value } + default { error "unknown option $name" } + } + } + set _cu_offset_size [expr { $is_64 ? 8 : 4 }] + if { $fission } { + set section ".debug_types.dwo" + set _abbrev_section ".debug_abbrev.dwo" } - set _cu_addr_size $addr_size - _section .debug_types + _section $section set cu_num [incr _cu_count] set my_abbrevs [_compute_label "abbrev${cu_num}_begin"] @@ -769,25 +821,33 @@ namespace eval Dwarf { _op .4byte "$end_label - $start_label" } define_label $start_label - _op .2byte $version Version + _op .2byte $_cu_version Version _op .4byte $my_abbrevs Abbrevs - _op .byte $addr_size "Pointer size" + _op .byte $_cu_addr_size "Pointer size" _op .8byte $signature Signature - uplevel declare_labels $type_label - upvar $type_label my_type_label - if {$is_64} { - _op .8byte "$my_type_label - $_cu_label" + if { $type_label != "" } { + uplevel declare_labels $type_label + upvar $type_label my_type_label + if {$is_64} { + _op .8byte "$my_type_label - $_cu_label" + } else { + _op .4byte "$my_type_label - $_cu_label" + } } else { - _op .4byte "$my_type_label - $_cu_label" + if {$is_64} { + _op .8byte 0 + } else { + _op .4byte 0 + } } - _defer_output .debug_abbrev { + _defer_output $_abbrev_section { define_label $my_abbrevs } uplevel $body - _defer_output .debug_abbrev { + _defer_output $_abbrev_section { # Emit the terminator. _op .byte 0x0 Terminator _op .byte 0x0 Terminator