gdb.dwarf2: Define and use gdb_target_symbol for symbol prefixes
authorKevin Buettner <kevinb@redhat.com>
Wed, 28 Oct 2015 18:36:06 +0000 (11:36 -0700)
committerKevin Buettner <kevinb@redhat.com>
Thu, 5 Nov 2015 22:22:51 +0000 (15:22 -0700)
Some of the tests in gdb.dwarf2 which use Dwarf::assemble refer to
(minimal/linker) symbols created in the course of building a small
test program.  Some targets use a prefix such as underscore ("_") on
these symbols.  Many of the tests in gdb.dwarf2 do not take this into
account.  As a consequence, these tests fail to build, resulting
either in failures or untested testcases.

Here is an example from gdb.dwarf2/dw2-regno-invalid.exp:

    Dwarf::assemble $asm_file {
        cu {} {
            compile_unit {
                {low_pc main DW_FORM_addr}
                {high_pc main+0x10000 DW_FORM_addr}
            } {
            ...
            }

For targets which require an underscore prefix on linker symbols,
the two occurrences of "main" would have to have a prepended underscore,
i.e. _main instead of main.

For the above case, a call to the new proc gdb_target_symbol is used
prepend the correct prefix to the symbol.  I.e. the above code is
rewritten (as shown in the patch) as follows:

    Dwarf::assemble $asm_file {
        cu {} {
            compile_unit {
                {low_pc [gdb_target_symbol main] DW_FORM_addr}
                {high_pc [gdb_target_symbol main]+0x10000 DW_FORM_addr}
            } {
            ...
            }

I also found it necessary to make an adjustment to lib/dwarf.exp so that
expressions of more than just one list element can be used in DW_TAG_...
constructs.  Both atomic-type.exp and dw2-bad-mips-linkage-name.exp require
this new functionality.

gdb/testsuite/ChangeLog:

* lib/gdb.exp (gdb_target_symbol_prefix, gdb_target_symbol):
New procs.
* lib/dwarf.exp (_handle_DW_TAG): Handle attribute values,
representing expressions, of more than one list element.
* gdb.dwarf2/atomic-type.exp (Dwarf::assemble): Use gdb_target_symbol
to prepend linker symbol prefix to f.
* gdb.dwarf2/data-loc.exp (Dwarf::assemble): Likewise, for
table_1 and table_2.
* gdb.dwarf2/dw2-bad-mips-linkage-name.exp (Dwarf::assemble):
Likewise, for f and g.
* gdb.dwarf2/dw2-ifort-parameter.exp (Dwarf::assemble): Likewise,
for ptr.
* gdb.dwarf2/dw2-regno-invalid.exp (Dwarf::assemble): Likewise,
for main.
* gdb.dwarf2/dynarr-ptr.exp (Dwarf::assemble): Likewise, for
table_1_ptr and table_2_ptr.

gdb/testsuite/ChangeLog
gdb/testsuite/gdb.dwarf2/atomic-type.exp
gdb/testsuite/gdb.dwarf2/data-loc.exp
gdb/testsuite/gdb.dwarf2/dw2-bad-mips-linkage-name.exp
gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.exp
gdb/testsuite/gdb.dwarf2/dw2-regno-invalid.exp
gdb/testsuite/gdb.dwarf2/dynarr-ptr.exp
gdb/testsuite/lib/dwarf.exp
gdb/testsuite/lib/gdb.exp

index 3476c86..8acc39e 100644 (file)
@@ -1,3 +1,22 @@
+2015-11-05  Kevin Buettner  <kevinb@redhat.com>
+
+       * lib/gdb.exp (gdb_target_symbol_prefix, gdb_target_symbol):
+       New procs.
+       * lib/dwarf.exp (_handle_DW_TAG): Handle attribute values,
+       representing expressions, of more than one list element.
+       * gdb.dwarf2/atomic-type.exp (Dwarf::assemble): Use gdb_target_symbol
+       to prepend linker symbol prefix to f.
+       * gdb.dwarf2/data-loc.exp (Dwarf::assemble): Likewise, for
+       table_1 and table_2.
+       * gdb.dwarf2/dw2-bad-mips-linkage-name.exp (Dwarf::assemble):
+       Likewise, for f and g.
+       * gdb.dwarf2/dw2-ifort-parameter.exp (Dwarf::assemble): Likewise,
+       for ptr.
+       * gdb.dwarf2/dw2-regno-invalid.exp (Dwarf::assemble): Likewise,
+       for main.
+       * gdb.dwarf2/dynarr-ptr.exp (Dwarf::assemble): Likewise, for
+       table_1_ptr and table_2_ptr.
+
 2015-11-03  Jan Kratochvil  <jan.kratochvil@redhat.com>
            Joel Brobecker  <brobecker@adacore.com>
 
index fb315e3..e2a3447 100644 (file)
@@ -68,7 +68,7 @@ Dwarf::assemble $asm_file {
 
             DW_TAG_subprogram {
                 {name f}
-                {low_pc f addr}
+                {low_pc [gdb_target_symbol f] addr}
                 {high_pc f_end_lbl addr}
                 {type :$i_l}
             } {
index e9e702c..a1fb772 100644 (file)
@@ -84,7 +84,7 @@ Dwarf::assemble $asm_file {
                 {DW_AT_name foo__three}
                 {DW_AT_type :$array_label}
                 {DW_AT_location {
-                    DW_OP_addr table_1
+                    DW_OP_addr [gdb_target_symbol table_1]
                 } SPECIAL_expr}
                 {external 1 flag}
             }
@@ -92,7 +92,7 @@ Dwarf::assemble $asm_file {
                 {DW_AT_name foo__three_tdef}
                 {DW_AT_type :$array_ptr_label}
                 {DW_AT_location {
-                    DW_OP_addr table_1
+                    DW_OP_addr [gdb_target_symbol table_1]
                 } SPECIAL_expr}
                 {external 1 flag}
             }
@@ -100,7 +100,7 @@ Dwarf::assemble $asm_file {
                 {DW_AT_name foo__five}
                 {DW_AT_type :$array_label}
                 {DW_AT_location {
-                    DW_OP_addr table_2
+                    DW_OP_addr [gdb_target_symbol table_2]
                 } SPECIAL_expr}
                 {external 1 flag}
             }
@@ -108,7 +108,7 @@ Dwarf::assemble $asm_file {
                 {DW_AT_name foo__five_tdef}
                 {DW_AT_type :$array_ptr_label}
                 {DW_AT_location {
-                    DW_OP_addr table_2
+                    DW_OP_addr [gdb_target_symbol table_2]
                 } SPECIAL_expr}
                 {external 1 flag}
             }
index 77f6175..dfb9567 100644 (file)
@@ -42,14 +42,14 @@ Dwarf::assemble $asm_file {
            }
             DW_TAG_subprogram {
                 {name f}
-                {low_pc f addr}
+                {low_pc [gdb_target_symbol f] addr}
                 {high_pc f_end_lbl addr}
                 {type :$b_l}
                {DW_AT_MIPS_linkage_name _Z1fv}
            }
             DW_TAG_subprogram {
                 {name g}
-                {low_pc g addr}
+                {low_pc [gdb_target_symbol g] addr}
                 {high_pc g_end_lbl addr}
                 {type :$b_l}
                {DW_AT_MIPS_linkage_name 42 DW_FORM_data1}
index c71103d..4f07b50 100644 (file)
@@ -53,7 +53,7 @@ Dwarf::assemble $asm_file {
                    {variable_parameter 1 flag}
                    {type :$int_label}
                    {location {
-                       addr ptr
+                       addr [gdb_target_symbol ptr]
                        deref
                    } SPECIAL_expr}
                }
index a7d77c5..53897bd 100644 (file)
@@ -29,8 +29,8 @@ set asm_file [standard_output_file $srcfile]
 Dwarf::assemble $asm_file {
     cu {} {
        compile_unit {
-           {low_pc main DW_FORM_addr}
-           {high_pc main+0x10000 DW_FORM_addr}
+           {low_pc [gdb_target_symbol main] DW_FORM_addr}
+           {high_pc [gdb_target_symbol main]+0x10000 DW_FORM_addr}
        } {
            declare_labels integer_label
 
@@ -43,8 +43,8 @@ Dwarf::assemble $asm_file {
            DW_TAG_subprogram {
                {name main}
                {DW_AT_external 1 flag}
-               {low_pc main DW_FORM_addr}
-               {high_pc main+0x10000 DW_FORM_addr}
+               {low_pc [gdb_target_symbol main] DW_FORM_addr}
+               {high_pc [gdb_target_symbol main]+0x10000 DW_FORM_addr}
            } {
                DW_TAG_variable {
                    {DW_AT_name bregx}
index 3dcb3d7..0a612fe 100644 (file)
@@ -85,7 +85,7 @@ Dwarf::assemble $asm_file {
                 {DW_AT_name foo__three_ptr}
                 {DW_AT_type :$array_ptr_label}
                 {DW_AT_location {
-                    DW_OP_addr table_1_ptr
+                    DW_OP_addr [gdb_target_symbol table_1_ptr]
                 } SPECIAL_expr}
                 {external 1 flag}
             }
@@ -93,7 +93,7 @@ Dwarf::assemble $asm_file {
                 {DW_AT_name foo__three_ptr_tdef}
                 {DW_AT_type :$array_typedef_label}
                 {DW_AT_location {
-                    DW_OP_addr table_1_ptr
+                    DW_OP_addr [gdb_target_symbol table_1_ptr]
                 } SPECIAL_expr}
                 {external 1 flag}
             }
@@ -101,7 +101,7 @@ Dwarf::assemble $asm_file {
                 {DW_AT_name foo__five_ptr}
                 {DW_AT_type :$array_ptr_label}
                 {DW_AT_location {
-                    DW_OP_addr table_2_ptr
+                    DW_OP_addr [gdb_target_symbol table_2_ptr]
                 } SPECIAL_expr}
                 {external 1 flag}
             }
@@ -109,7 +109,7 @@ Dwarf::assemble $asm_file {
                 {DW_AT_name foo__five_ptr_tdef}
                 {DW_AT_type :$array_typedef_label}
                 {DW_AT_location {
-                    DW_OP_addr table_2_ptr
+                    DW_OP_addr [gdb_target_symbol table_2_ptr]
                 } SPECIAL_expr}
                 {external 1 flag}
             }
index 5dc7ea8..9716795 100644 (file)
@@ -621,7 +621,18 @@ namespace eval Dwarf {
 
        foreach attr $attrs {
            set attr_name [_map_name [lindex $attr 0] _AT]
-           set attr_value [uplevel 2 [list subst [lindex $attr 1]]]
+
+           # When the length of ATTR is greater than 2, the last
+           # element of the list must be a form.  The second through
+           # the penultimate elements are joined together and
+           # evaluated using subst.  This allows constructs such as
+           # [gdb_target_symbol foo] to be used.
+
+           if {[llength $attr] > 2} {
+               set attr_value [uplevel 2 [list subst [join [lrange $attr 1 end-1]]]]
+           } else {
+               set attr_value [uplevel 2 [list subst [lindex $attr 1]]]
+           }
 
            if { [string equal "MACRO_AT_func" $attr_name] } {
                _handle_macro_at_func $attr_value
@@ -629,7 +640,7 @@ namespace eval Dwarf {
                _handle_macro_at_range $attr_value
            } else {
                if {[llength $attr] > 2} {
-                   set attr_form [lindex $attr 2]
+                   set attr_form [lindex $attr end]
                } else {
                    # If the value looks like an integer, a form is required.
                    if [string is integer $attr_value] {
index 6681a49..83dd0a2 100644 (file)
@@ -5523,6 +5523,54 @@ proc core_find {binfile {deletefiles {}} {arg ""}} {
     return $destcore
 }
 
+# gdb_target_symbol_prefix compiles a test program and then examines
+# the output from objdump to determine the prefix (such as underscore)
+# for linker symbol prefixes.
+
+gdb_caching_proc gdb_target_symbol_prefix {
+    # Set up and compile a simple test program...
+    set src [standard_temp_file main[pid].c]
+    set exe [standard_temp_file main[pid].x]
+
+    gdb_produce_source $src {
+       int main() {
+           return 0;
+       }
+    }
+
+    verbose "compiling testfile $src" 2
+    set compile_flags {debug nowarnings quiet}
+    set lines [gdb_compile $src $exe executable $compile_flags]
+
+    set prefix ""
+
+    if ![string match "" $lines] then {
+        verbose "gdb_target_symbol_prefix: testfile compilation failed, returning null prefix" 2
+    } else {
+       set objdump_program [gdb_find_objdump]
+       set result [catch "exec $objdump_program --syms $exe" output]
+
+       if { $result == 0 \
+            && ![regexp -lineanchor \
+                 { ([^ a-zA-Z0-9]*)main$} $output dummy prefix] } {
+           verbose "gdb_target_symbol_prefix: Could not find main in objdump output; returning null prefix" 2
+       }
+    }
+
+    file delete $src
+    file delete $exe
+
+    return $prefix
+}
+
+# gdb_target_symbol returns the provided symbol with the correct prefix
+# prepended.  (See gdb_target_symbol_prefix, above.)
+
+proc gdb_target_symbol { symbol } {
+  set prefix [gdb_target_symbol_prefix]
+  return "${prefix}${symbol}"
+}
+
 # gdb_target_symbol_prefix_flags returns a string that can be added
 # to gdb_compile options to define SYMBOL_PREFIX macro value
 # symbol_prefix_flags returns a string that can be added