Use DW_FORM_exprloc in testsuite Dwarf Assembler for DWARF version 4+.
authorMark Wielaard <mark@klomp.org>
Mon, 14 Dec 2020 16:38:09 +0000 (17:38 +0100)
committerMark Wielaard <mark@klomp.org>
Mon, 14 Dec 2020 19:16:33 +0000 (20:16 +0100)
Since DWARF version 4 expressions are represented by DW_FORM_exprloc
instead of a block form. Support this in the testsuite Dwarf Assembler
by setting the SPECIAL_expr form once we know the CU version.

This doesn't change any testsuite results, it just makes the produced
DWARF valid. gdb also accepts expressions in block form for DWARF
version 4 and above, but this is technically incorrect.

gdb/testsuite/ChangeLog:

* lib/dwarf.exp (Dwarf::_read_constants): Don't set
_constants(SPECIAL_expr) here, but set it...
(Dwarf::cu): ...here based on _cu_version.

gdb/testsuite/ChangeLog
gdb/testsuite/lib/dwarf.exp

index 1c522e83193ed4fcf4264b6c35f03b38d35288c6..ab03f0745dabf9c7744d327e8e93a9d1f5c4c682 100644 (file)
@@ -1,3 +1,9 @@
+2020-12-14  Mark Wielaard  <mark@klomp.org>
+
+       * lib/dwarf.exp (Dwarf::_read_constants): Don't set
+       _constants(SPECIAL_expr) here, but set it...
+       (Dwarf::cu): ...here based on _cu_version.
+
 2020-12-14  Tom de Vries  <tdevries@suse.de>
 
        * lib/gdb.exp (gdb_compile_shlib): Make sure it's not necessary to
index ecd438b205ec0cf8233c0464f0520bb5bacbe088..43ae29697cdf1bce2343d0100dffe33871a2e2d7 100644 (file)
@@ -234,8 +234,9 @@ proc get_func_info { name {options {debug}} } {
 # section automatically.
 #
 # If FORM is 'SPECIAL_expr', then VALUE is treated as a location
-# expression.  The effective form is then DW_FORM_block, and VALUE
-# is passed to the (internal) '_location' proc to be translated.
+# expression.  The effective form is then DW_FORM_block or DW_FORM_exprloc
+# for DWARF version >= 4, and VALUE is passed to the (internal)
+# '_location' proc to be translated.
 # This proc implements a miniature DW_OP_ assembler.
 #
 # If FORM is not given, it is guessed:
@@ -389,7 +390,6 @@ namespace eval Dwarf {
 
     proc _read_constants {} {
        global srcdir hex decimal
-       variable _constants
 
        # DWARF name-matching regexp.
        set dwrx "DW_\[a-zA-Z0-9_\]+"
@@ -416,8 +416,6 @@ namespace eval Dwarf {
            }
        }
        close $fd
-
-       set _constants(SPECIAL_expr) $_constants(DW_FORM_block)
     }
 
     proc _quote {string} {
@@ -1042,6 +1040,7 @@ namespace eval Dwarf {
     # 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 {options body} {
+       variable _constants
        variable _cu_count
        variable _abbrev_section
        variable _abbrev_num
@@ -1081,6 +1080,12 @@ namespace eval Dwarf {
            set _abbrev_section ".debug_abbrev.dwo"
        }
 
+       if {$_cu_version < 4} {
+           set _constants(SPECIAL_expr) $_constants(DW_FORM_block)
+       } else {
+           set _constants(SPECIAL_expr) $_constants(DW_FORM_exprloc)
+       }
+
        _section $section
 
        set cu_num [incr _cu_count]