]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
[gdb/testsuite] Add gdb.dwarf2/dw-form-strx.exp
authorTom de Vries <tdevries@suse.de>
Fri, 2 May 2025 20:21:36 +0000 (22:21 +0200)
committerTom de Vries <tdevries@suse.de>
Fri, 2 May 2025 20:21:36 +0000 (22:21 +0200)
Add a test-case using DW_FORM_strx.

Tested on x86_64-linux.

Approved-By: Tom Tromey <tom@tromey.com>
gdb/testsuite/gdb.dwarf2/dw-form-strx.exp [new file with mode: 0644]
gdb/testsuite/gdb.dwarf2/dw-form-strx.exp.tcl [new file with mode: 0644]
gdb/testsuite/lib/dwarf.exp

diff --git a/gdb/testsuite/gdb.dwarf2/dw-form-strx.exp b/gdb/testsuite/gdb.dwarf2/dw-form-strx.exp
new file mode 100644 (file)
index 0000000..9b62edf
--- /dev/null
@@ -0,0 +1,23 @@
+# Copyright 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
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# Check that DW_FORM_strx works.
+
+# Correct index.
+set int_str_idx 0
+
+source $srcdir/$subdir/dw-form-strx.exp.tcl
+
+gdb_test "ptype global_var" "type = int"
diff --git a/gdb/testsuite/gdb.dwarf2/dw-form-strx.exp.tcl b/gdb/testsuite/gdb.dwarf2/dw-form-strx.exp.tcl
new file mode 100644 (file)
index 0000000..15cfe27
--- /dev/null
@@ -0,0 +1,60 @@
+# Copyright 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
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+load_lib dwarf.exp
+
+# This test can only be run on targets which support DWARF-2 and use gas.
+require dwarf2_support
+
+standard_testfile main.c -dw.S
+
+set asm_file [standard_output_file $srcfile2]
+
+# Debug info in the main file.
+Dwarf::assemble $asm_file {
+    declare_labels base_offset
+
+    debug_str_offsets base_offset int
+
+    cu {
+       version 5
+    } {
+       DW_TAG_compile_unit {
+           {DW_AT_str_offsets_base $base_offset sec_offset}
+       } {
+           declare_labels int4_type
+
+           int4_type: DW_TAG_base_type {
+               {DW_AT_byte_size 4 DW_FORM_sdata}
+               {DW_AT_encoding  @DW_ATE_signed}
+               {DW_AT_name      $::int_str_idx DW_FORM_strx_id}
+           }
+
+           DW_TAG_variable {
+               {DW_AT_name global_var}
+               {DW_AT_type :$int4_type}
+               {DW_AT_location {
+                   DW_OP_const1u 12
+                   DW_OP_stack_value
+               } SPECIAL_expr}
+           }
+       }
+    }
+}
+
+if { [prepare_for_testing "failed to prepare" ${testfile} \
+         [list $srcfile $asm_file] {nodebug}] } {
+    return -1
+}
index 7e8778aa1ad7a4389a81d8ecf9c592ec0e2991f2..b347437e9faf03087b47c142f59dd433371163f9 100644 (file)
@@ -678,6 +678,11 @@ namespace eval Dwarf {
            }
        }
        close $fd
+
+       variable _constants
+
+       # Add DW_FORM_strx_id as alias of DW_FORM_strx.
+       _process_one_constant DW_FORM_strx_id $_constants(DW_FORM_strx)
     }
 
     proc _quote {string} {
@@ -823,6 +828,12 @@ namespace eval Dwarf {
            DW_FORM_indirect -
            DW_FORM_exprloc -
 
+           # Generate a DW_FORM_str index, but assume generation of .debug_str and
+           # .debug_str_offsets is taken care of elsewhere.
+           DW_FORM_strx_id {
+               _op .uleb128 $value
+           }
+
            DW_FORM_strx -
            DW_FORM_strx1 -
            DW_FORM_strx2 -
@@ -3385,6 +3396,37 @@ namespace eval Dwarf {
        debug_names_end:
     }
 
+    # Add the strings in ARGS to the .debug_str section, and create a
+    # .debug_str_offsets section pointing to those strings.
+    # BASE_OFFSET is the label for DW_AT_str_offsets_base.
+    proc debug_str_offsets { base_offset args } {
+       _section .debug_str
+       set num 0
+       foreach arg $args {
+           set str_label [_compute_label "str_${num}"]
+           define_label $str_label
+           _op .asciz \"$arg\" ".debug_str_offsets string $num"
+           incr num
+       }
+
+       declare_labels debug_str_offsets_start debug_str_offsets_end
+       set initial_length "$debug_str_offsets_end - $debug_str_offsets_start"
+
+       _section .debug_str_offsets
+       _op .4byte $initial_length "Initial_length"
+       debug_str_offsets_start:
+       _op .2byte 0x5 "version"
+       _op .2byte 0x0 "padding"
+       $base_offset:
+       set num 0
+       foreach arg $args {
+           set str_label [_compute_label "str_${num}"]
+           _op .4byte $str_label "string $num"
+           incr num
+       }
+       debug_str_offsets_end:
+    }
+
     # The top-level interface to the DWARF assembler.
     # OPTIONS is a list with an even number of elements containing
     # option-name and option-value pairs.