This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[RFA] Make cu/tu functions in dwarf.exp take a list of options


Hi.
I needed to add another parameter to the cu/tu functions in dwarf.exp.
And if I need to add one I may need to add another.
This patch changes the existing set of options to be a list.

The testcase that uses this is a separate patch, but it may be awhile
in coming, sigh.
I'd like to get this in now so that any new tests that get written
don't also have to be updated when this goes in.

Note: I made the defaults 64 bit addresses and dwarf version 4.
Seems reasonable these days.  It does change the dwarf version from 2 to 4
for some of the existing tests, but I didn't find an issue with this.

Ok to check in?
Regression tested on amd64-linux.

2013-05-17  Doug Evans  <dje@google.com>

	* lib/dwarf.exp (Dwarf): New variable _abbrev_section.
	(_handle_DW_TAG): Use it.
	(cu): Replace parameters is_64, version, addr_size with options.
	All callers updated.  Add Fission support.

Index: testsuite/gdb.dwarf2/implptrconst.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.dwarf2/implptrconst.exp,v
retrieving revision 1.2
diff -u -p -r1.2 implptrconst.exp
--- testsuite/gdb.dwarf2/implptrconst.exp	13 May 2013 19:32:17 -0000	1.2
+++ testsuite/gdb.dwarf2/implptrconst.exp	17 May 2013 17:03:47 -0000
@@ -29,7 +29,7 @@ set asm_file [standard_output_file $srcf
 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
Index: testsuite/gdb.dwarf2/method-ptr.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.dwarf2/method-ptr.exp,v
retrieving revision 1.3
diff -u -p -r1.3 method-ptr.exp
--- testsuite/gdb.dwarf2/method-ptr.exp	1 Feb 2013 19:33:47 -0000	1.3
+++ testsuite/gdb.dwarf2/method-ptr.exp	17 May 2013 17:03:47 -0000
@@ -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}
Index: testsuite/gdb.dwarf2/missing-sig-type.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.dwarf2/missing-sig-type.exp,v
retrieving revision 1.1
diff -u -p -r1.1 missing-sig-type.exp
--- testsuite/gdb.dwarf2/missing-sig-type.exp	17 Apr 2013 21:07:09 -0000	1.1
+++ testsuite/gdb.dwarf2/missing-sig-type.exp	17 May 2013 17:03:47 -0000
@@ -26,7 +26,7 @@ standard_testfile main.c missing-sig-typ
 # 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}
Index: testsuite/gdb.dwarf2/nostaticblock.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.dwarf2/nostaticblock.exp,v
retrieving revision 1.1
diff -u -p -r1.1 nostaticblock.exp
--- testsuite/gdb.dwarf2/nostaticblock.exp	25 Apr 2013 16:25:37 -0000	1.1
+++ testsuite/gdb.dwarf2/nostaticblock.exp	17 May 2013 17:03:47 -0000
@@ -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}
Index: testsuite/gdb.dwarf2/subrange.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.dwarf2/subrange.exp,v
retrieving revision 1.1
diff -u -p -r1.1 subrange.exp
--- testsuite/gdb.dwarf2/subrange.exp	18 Feb 2013 21:04:28 -0000	1.1
+++ testsuite/gdb.dwarf2/subrange.exp	17 May 2013 17:03:47 -0000
@@ -26,7 +26,7 @@ standard_testfile method-ptr.cc subrange
 # 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
 
Index: testsuite/lib/dwarf.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/lib/dwarf.exp,v
retrieving revision 1.8
diff -u -p -r1.8 dwarf.exp
--- testsuite/lib/dwarf.exp	6 May 2013 19:44:04 -0000	1.8
+++ testsuite/lib/dwarf.exp	17 May 2013 17:03:47 -0000
@@ -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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]