Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* [PATCH] gdb.dwarf2: Define and use gdb_target_symbol_prefix for symbol prefixes
@ 2015-10-30 11:06 Kevin Buettner
  2015-10-30 12:06 ` Kevin Buettner
  2015-10-30 15:51 ` Pedro Alves
  0 siblings, 2 replies; 13+ messages in thread
From: Kevin Buettner @ 2015-10-30 11:06 UTC (permalink / raw)
  To: gdb-patches

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.

gdb/testsuite/ChangeLog:
    
    	* lib/gdb.exp (gdb_target_symbol_prefix): New proc.
    	* gdb.dwarf2/atomic-type.exp (Dwarf::assemble): Fetch
    	linker symbol prefix and prepend it to f.
    	* gdb.dwarf2/data-loc.exp (Dwarf::assemble): Fetch linker
    	symbol prefix and prepend it to table_1 and table_2.
    	* gdb.dwarf2/dw2-bad-mips-linkage-name.exp (Dwarf::assemble): Fetch
    	linker symbol prefix and prepend it to f and g.
    	* gdb.dwarf2/dw2-ifort-parameter.exp (Dwarf::assemble): Fetch
    	linker symbol prefix and prepend it to ptr.
    	* gdb.dwarf2/dw2-regno-invalid.exp (Dwarf::assemble): Fetch linker
    	symbol prefix and prepend it to main.
    	* gdb.dwarf2/dynarr-ptr.exp (Dwarf::assemble): Fetch linker symbol
    	prefix and prepend it to table_1_ptr and table_2_ptr.
---
 gdb/testsuite/gdb.dwarf2/atomic-type.exp           |  4 ++-
 gdb/testsuite/gdb.dwarf2/data-loc.exp              | 10 +++---
 .../gdb.dwarf2/dw2-bad-mips-linkage-name.exp       |  6 ++--
 gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.exp   |  3 +-
 gdb/testsuite/gdb.dwarf2/dw2-regno-invalid.exp     | 10 +++---
 gdb/testsuite/gdb.dwarf2/dynarr-ptr.exp            | 10 +++---
 gdb/testsuite/lib/gdb.exp                          | 39 ++++++++++++++++++++++
 7 files changed, 66 insertions(+), 16 deletions(-)

diff --git a/gdb/testsuite/gdb.dwarf2/atomic-type.exp b/gdb/testsuite/gdb.dwarf2/atomic-type.exp
index fb315e3..43e28c8 100644
--- a/gdb/testsuite/gdb.dwarf2/atomic-type.exp
+++ b/gdb/testsuite/gdb.dwarf2/atomic-type.exp
@@ -25,6 +25,8 @@ standard_testfile atomic.c atomic-type-dw.S
 
 set asm_file [standard_output_file $srcfile2]
 Dwarf::assemble $asm_file {
+    set prefix [gdb_target_symbol_prefix]
+
     cu {} {
 	DW_TAG_compile_unit {
                 {DW_AT_language @DW_LANG_C11}
@@ -68,7 +70,7 @@ Dwarf::assemble $asm_file {
 
             DW_TAG_subprogram {
                 {name f}
-                {low_pc f addr}
+                {low_pc ${prefix}f addr}
                 {high_pc f_end_lbl addr}
                 {type :$i_l}
             } {
diff --git a/gdb/testsuite/gdb.dwarf2/data-loc.exp b/gdb/testsuite/gdb.dwarf2/data-loc.exp
index e9e702c..4802a0a 100644
--- a/gdb/testsuite/gdb.dwarf2/data-loc.exp
+++ b/gdb/testsuite/gdb.dwarf2/data-loc.exp
@@ -36,6 +36,8 @@ if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile}] } {
 # Make some DWARF for the test.
 set asm_file [standard_output_file $srcfile2]
 Dwarf::assemble $asm_file {
+    set prefix [gdb_target_symbol_prefix]
+
     cu {} {
  	DW_TAG_compile_unit {
                 {DW_AT_language @DW_LANG_Ada95}
@@ -84,7 +86,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 ${prefix}table_1
                 } SPECIAL_expr}
                 {external 1 flag}
             }
@@ -92,7 +94,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 ${prefix}table_1
                 } SPECIAL_expr}
                 {external 1 flag}
             }
@@ -100,7 +102,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 ${prefix}table_2
                 } SPECIAL_expr}
                 {external 1 flag}
             }
@@ -108,7 +110,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 ${prefix}table_2
                 } SPECIAL_expr}
                 {external 1 flag}
             }
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-bad-mips-linkage-name.exp b/gdb/testsuite/gdb.dwarf2/dw2-bad-mips-linkage-name.exp
index 77f6175..decd531 100644
--- a/gdb/testsuite/gdb.dwarf2/dw2-bad-mips-linkage-name.exp
+++ b/gdb/testsuite/gdb.dwarf2/dw2-bad-mips-linkage-name.exp
@@ -26,6 +26,8 @@ standard_testfile dw2-bad-mips-linkage-name.c dw2-bad-mips-linkage-name.S
 
 set asm_file [standard_output_file $srcfile2]
 Dwarf::assemble $asm_file {
+    set prefix [gdb_target_symbol_prefix]
+
     cu {} {
 	DW_TAG_compile_unit {
                 {DW_AT_language @DW_LANG_C}
@@ -42,14 +44,14 @@ Dwarf::assemble $asm_file {
 	    }
             DW_TAG_subprogram {
                 {name f}
-                {low_pc f addr}
+                {low_pc ${prefix}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 ${prefix}g addr}
                 {high_pc g_end_lbl addr}
                 {type :$b_l}
 		{DW_AT_MIPS_linkage_name 42 DW_FORM_data1}
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.exp b/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.exp
index c71103d..d55fd43 100644
--- a/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.exp
+++ b/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.exp
@@ -27,6 +27,7 @@ standard_testfile .c dw2-ifort-parameter-dw.S
 # Make some DWARF for the test.
 set asm_file [standard_output_file $srcfile2]
 Dwarf::assemble $asm_file {
+    set prefix [gdb_target_symbol_prefix]
     declare_labels int_label
 
     extern func_start func_end ptr
@@ -53,7 +54,7 @@ Dwarf::assemble $asm_file {
 		    {variable_parameter 1 flag}
 		    {type :$int_label}
 		    {location {
-			addr ptr
+			addr ${prefix}ptr
 			deref
 		    } SPECIAL_expr}
 		}
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-regno-invalid.exp b/gdb/testsuite/gdb.dwarf2/dw2-regno-invalid.exp
index a7d77c5..620d438 100644
--- a/gdb/testsuite/gdb.dwarf2/dw2-regno-invalid.exp
+++ b/gdb/testsuite/gdb.dwarf2/dw2-regno-invalid.exp
@@ -27,10 +27,12 @@ standard_testfile .S main.c
 # Make some DWARF for the test.
 set asm_file [standard_output_file $srcfile]
 Dwarf::assemble $asm_file {
+    set prefix [gdb_target_symbol_prefix]
+
     cu {} {
 	compile_unit {
-	    {low_pc main DW_FORM_addr}
-	    {high_pc main+0x10000 DW_FORM_addr}
+	    {low_pc ${prefix}main DW_FORM_addr}
+	    {high_pc ${prefix}main+0x10000 DW_FORM_addr}
 	} {
 	    declare_labels integer_label
 
@@ -43,8 +45,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 ${prefix}main DW_FORM_addr}
+		{high_pc ${prefix}main+0x10000 DW_FORM_addr}
 	    } {
 		DW_TAG_variable {
 		    {DW_AT_name bregx}
diff --git a/gdb/testsuite/gdb.dwarf2/dynarr-ptr.exp b/gdb/testsuite/gdb.dwarf2/dynarr-ptr.exp
index 3dcb3d7..d0a74be 100644
--- a/gdb/testsuite/gdb.dwarf2/dynarr-ptr.exp
+++ b/gdb/testsuite/gdb.dwarf2/dynarr-ptr.exp
@@ -36,6 +36,8 @@ if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile}] } {
 # Make some DWARF for the test.
 set asm_file [standard_output_file $srcfile2]
 Dwarf::assemble $asm_file {
+    set prefix [gdb_target_symbol_prefix]
+
     cu {} {
  	DW_TAG_compile_unit {
                 {DW_AT_language @DW_LANG_Ada95}
@@ -85,7 +87,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 ${prefix}table_1_ptr
                 } SPECIAL_expr}
                 {external 1 flag}
             }
@@ -93,7 +95,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 ${prefix}table_1_ptr
                 } SPECIAL_expr}
                 {external 1 flag}
             }
@@ -101,7 +103,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 ${prefix}table_2_ptr
                 } SPECIAL_expr}
                 {external 1 flag}
             }
@@ -109,7 +111,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 ${prefix}table_2_ptr
                 } SPECIAL_expr}
                 {external 1 flag}
             }
diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
index 048070b..f8e35ac 100644
--- a/gdb/testsuite/lib/gdb.exp
+++ b/gdb/testsuite/lib/gdb.exp
@@ -5521,6 +5521,45 @@ proc core_find {binfile {deletefiles {}} {arg ""}} {
     return $destcore
 }
 
+# gdb_target_symbol_prefix compiles a test program and uses readelf
+# to determine the prefix (such as underscore) for linker symbol
+# prefixes.
+
+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 readelf_program [gdb_find_readelf]
+	set result [catch "exec $readelf_program --syms $exe" output]
+
+	if { $result == 0 \
+	     && ![regexp { ([^ a-zA-Z0-9]*)main$} $output dummy prefix] } {
+	    verbose "gdb_target_symbol_prefix: Could not find main in readelf output; returning null prefix" 2
+	}
+    }
+
+    file delete $src
+    file delete $exe
+
+    return $prefix
+}
+
 # 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


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] gdb.dwarf2: Define and use gdb_target_symbol_prefix for symbol prefixes
  2015-10-30 11:06 [PATCH] gdb.dwarf2: Define and use gdb_target_symbol_prefix for symbol prefixes Kevin Buettner
@ 2015-10-30 12:06 ` Kevin Buettner
  2015-10-30 15:53   ` Pedro Alves
  2015-10-30 15:51 ` Pedro Alves
  1 sibling, 1 reply; 13+ messages in thread
From: Kevin Buettner @ 2015-10-30 12:06 UTC (permalink / raw)
  To: gdb-patches

On Thu, 29 Oct 2015 21:25:09 -0700
Kevin Buettner <kevinb@redhat.com> wrote:

> 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.

Several of the .S files in gdb.dwarf2 have the same problem.  E.g.
when linking the test case for gdb.dwarf2/method-ptr.exp, I see a
linker error "undefined reference to `main'".  It appears that crt0
is generating a reference to _main, but the .S file only provides a
reference to main.

Any thoughts on what to do about this?

(It occurs to me that I could define both _main and main in the .S
file, but this doesn't solve the problem should some other prefix be
used instead.)

Kevin


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] gdb.dwarf2: Define and use gdb_target_symbol_prefix for symbol prefixes
  2015-10-30 11:06 [PATCH] gdb.dwarf2: Define and use gdb_target_symbol_prefix for symbol prefixes Kevin Buettner
  2015-10-30 12:06 ` Kevin Buettner
@ 2015-10-30 15:51 ` Pedro Alves
  2015-11-04 21:49   ` Kevin Buettner
  1 sibling, 1 reply; 13+ messages in thread
From: Pedro Alves @ 2015-10-30 15:51 UTC (permalink / raw)
  To: Kevin Buettner, gdb-patches

On 10/30/2015 04:25 AM, Kevin Buettner wrote:

> diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
> index 048070b..f8e35ac 100644
> --- a/gdb/testsuite/lib/gdb.exp
> +++ b/gdb/testsuite/lib/gdb.exp
> @@ -5521,6 +5521,45 @@ proc core_find {binfile {deletefiles {}} {arg ""}} {
>      return $destcore
>  }
>  
> +# gdb_target_symbol_prefix compiles a test program and uses readelf
> +# to determine the prefix (such as underscore) for linker symbol
> +# prefixes.
> +
> +proc gdb_target_symbol_prefix {} {

Shouldn't this be gdb_caching_proc ?

Then T wonder whether something like:

-                    DW_OP_addr table_2_ptr
+                    DW_OP_addr [gdb_symbol table_2_ptr]

instead of prepending the $prefix variable results in clearer
test code.

> +	set readelf_program [gdb_find_readelf]
> +	set result [catch "exec $readelf_program --syms $exe" output]
> +
> +	if { $result == 0 \
> +	     && ![regexp { ([^ a-zA-Z0-9]*)main$} $output dummy prefix] } {
> +	    verbose "gdb_target_symbol_prefix: Could not find main in readelf output; returning null prefix" 2
> +	}

I'm wondering about using a method that would work for mingw/cygwin
as well.  The only existing use of the target symbol prefix in the
tree is for those targets, which are coff/pe, not elf.  See
gdb_target_symbol_prefix_flags.  Maybe just use objdump instead?

Thanks,
Pedro Alves


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] gdb.dwarf2: Define and use gdb_target_symbol_prefix for symbol prefixes
  2015-10-30 12:06 ` Kevin Buettner
@ 2015-10-30 15:53   ` Pedro Alves
  2015-11-05  6:39     ` Kevin Buettner
  0 siblings, 1 reply; 13+ messages in thread
From: Pedro Alves @ 2015-10-30 15:53 UTC (permalink / raw)
  To: Kevin Buettner, gdb-patches

On 10/30/2015 05:25 AM, Kevin Buettner wrote:
> On Thu, 29 Oct 2015 21:25:09 -0700
> Kevin Buettner <kevinb@redhat.com> wrote:
> 
>> 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.
> 
> Several of the .S files in gdb.dwarf2 have the same problem.  E.g.
> when linking the test case for gdb.dwarf2/method-ptr.exp, I see a
> linker error "undefined reference to `main'".  It appears that crt0
> is generating a reference to _main, but the .S file only provides a
> reference to main.
> 
> Any thoughts on what to do about this?

Isn't this being addressed by gdb_target_symbol_prefix_flags in
the existing tests that use it?  E.g., gdb.arch/i386-bp_permanent.c:

#ifdef SYMBOL_PREFIX
#define SYMBOL(str)     SYMBOL_PREFIX #str
#else
#define SYMBOL(str)     #str
#endif

...

#ifdef __x86_64__
asm(".text\n"
    "    .align 8\n"
    SYMBOL (standard) ":\n"

Thanks,
Pedro Alves


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] gdb.dwarf2: Define and use gdb_target_symbol_prefix for symbol prefixes
  2015-10-30 15:51 ` Pedro Alves
@ 2015-11-04 21:49   ` Kevin Buettner
  2015-11-05 10:14     ` Pedro Alves
  0 siblings, 1 reply; 13+ messages in thread
From: Kevin Buettner @ 2015-11-04 21:49 UTC (permalink / raw)
  To: gdb-patches; +Cc: Pedro Alves

On Fri, 30 Oct 2015 11:06:09 +0000
Pedro Alves <palves@redhat.com> wrote:

> On 10/30/2015 04:25 AM, Kevin Buettner wrote:
> 
> > +# gdb_target_symbol_prefix compiles a test program and uses readelf
> > +# to determine the prefix (such as underscore) for linker symbol
> > +# prefixes.
> > +
> > +proc gdb_target_symbol_prefix {} {
> 
> Shouldn't this be gdb_caching_proc ?

Yes, it should. I've fixed this in my new patch.

> Then T wonder whether something like:
> 
> -                    DW_OP_addr table_2_ptr
> +                    DW_OP_addr [gdb_symbol table_2_ptr]
> 
> instead of prepending the $prefix variable results in clearer
> test code.

I like this idea too. I used the name 'gdb_target_symbol' for this.

Defining the obvious proc (for gdb_target_symbol) worked out of the
box for all cases except gdb.dwarf2/atomic-type.exp.  For that I
needed to make a change to lib/dwarf.exp (and learned a bit more about
tcl in the process).  If you know of a cleaner way to code it, let me
know - I couldn't think of a way to do it without adding the if-else
statement.

> > +	set readelf_program [gdb_find_readelf]
> > +	set result [catch "exec $readelf_program --syms $exe" output]
> > +
> > +	if { $result == 0 \
> > +	     && ![regexp { ([^ a-zA-Z0-9]*)main$} $output dummy prefix] } {
> > +	    verbose "gdb_target_symbol_prefix: Could not find main in readelf output; returning null prefix" 2
> > +	}
> 
> I'm wondering about using a method that would work for mingw/cygwin
> as well.  The only existing use of the target symbol prefix in the
> tree is for those targets, which are coff/pe, not elf.  See
> gdb_target_symbol_prefix_flags.  Maybe just use objdump instead?

I've adjusted my patch to use objdump instead.  This, in turn, helped
me to find a bug with the regexp command that I was using. (By
default, $ doesn't match an end of line, only the end of string.)

With regard to gdb_target_symbol_prefix_flags, I think I'll change
it to call the new gdb_target_symbol_prefix.  That seems preferable
to hardcoding a bunch of targets.  If it all works out, I'll submit a
separate patch.

The new patch is below...

    gdb.dwarf2: Define and use gdb_target_symbol for symbol prefixes
    
    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.  The change to atomic-type.exp was the only change which
    required 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/gdb.dwarf2/atomic-type.exp           |  2 +-
 gdb/testsuite/gdb.dwarf2/data-loc.exp              |  8 ++--
 .../gdb.dwarf2/dw2-bad-mips-linkage-name.exp       |  4 +-
 gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.exp   |  2 +-
 gdb/testsuite/gdb.dwarf2/dw2-regno-invalid.exp     |  8 ++--
 gdb/testsuite/gdb.dwarf2/dynarr-ptr.exp            |  8 ++--
 gdb/testsuite/lib/dwarf.exp                        | 15 ++++++-
 gdb/testsuite/lib/gdb.exp                          | 48 ++++++++++++++++++++++
 8 files changed, 77 insertions(+), 18 deletions(-)

diff --git a/gdb/testsuite/gdb.dwarf2/atomic-type.exp b/gdb/testsuite/gdb.dwarf2/atomic-type.exp
index fb315e3..e2a3447 100644
--- a/gdb/testsuite/gdb.dwarf2/atomic-type.exp
+++ b/gdb/testsuite/gdb.dwarf2/atomic-type.exp
@@ -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}
             } {
diff --git a/gdb/testsuite/gdb.dwarf2/data-loc.exp b/gdb/testsuite/gdb.dwarf2/data-loc.exp
index e9e702c..a1fb772 100644
--- a/gdb/testsuite/gdb.dwarf2/data-loc.exp
+++ b/gdb/testsuite/gdb.dwarf2/data-loc.exp
@@ -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}
             }
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-bad-mips-linkage-name.exp b/gdb/testsuite/gdb.dwarf2/dw2-bad-mips-linkage-name.exp
index 77f6175..dfb9567 100644
--- a/gdb/testsuite/gdb.dwarf2/dw2-bad-mips-linkage-name.exp
+++ b/gdb/testsuite/gdb.dwarf2/dw2-bad-mips-linkage-name.exp
@@ -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}
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.exp b/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.exp
index c71103d..4f07b50 100644
--- a/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.exp
+++ b/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.exp
@@ -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}
 		}
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-regno-invalid.exp b/gdb/testsuite/gdb.dwarf2/dw2-regno-invalid.exp
index a7d77c5..53897bd 100644
--- a/gdb/testsuite/gdb.dwarf2/dw2-regno-invalid.exp
+++ b/gdb/testsuite/gdb.dwarf2/dw2-regno-invalid.exp
@@ -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}
diff --git a/gdb/testsuite/gdb.dwarf2/dynarr-ptr.exp b/gdb/testsuite/gdb.dwarf2/dynarr-ptr.exp
index 3dcb3d7..0a612fe 100644
--- a/gdb/testsuite/gdb.dwarf2/dynarr-ptr.exp
+++ b/gdb/testsuite/gdb.dwarf2/dynarr-ptr.exp
@@ -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}
             }
diff --git a/gdb/testsuite/lib/dwarf.exp b/gdb/testsuite/lib/dwarf.exp
index 888ba94..eb2e59c 100644
--- a/gdb/testsuite/lib/dwarf.exp
+++ b/gdb/testsuite/lib/dwarf.exp
@@ -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]]]]
+	    } {
+	        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] {
diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
index 048070b..e1c9839 100644
--- a/gdb/testsuite/lib/gdb.exp
+++ b/gdb/testsuite/lib/gdb.exp
@@ -5521,6 +5521,54 @@ proc core_find {binfile {deletefiles {}} {arg ""}} {
     return $destcore
 }
 
+# gdb_target_symbol_prefix compiles a test program and uses readelf 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


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] gdb.dwarf2: Define and use gdb_target_symbol_prefix for symbol prefixes
  2015-10-30 15:53   ` Pedro Alves
@ 2015-11-05  6:39     ` Kevin Buettner
  2015-11-05 10:46       ` Pedro Alves
  0 siblings, 1 reply; 13+ messages in thread
From: Kevin Buettner @ 2015-11-05  6:39 UTC (permalink / raw)
  To: gdb-patches; +Cc: Pedro Alves

On Fri, 30 Oct 2015 11:11:33 +0000
Pedro Alves <palves@redhat.com> wrote:

> On 10/30/2015 05:25 AM, Kevin Buettner wrote:
> > On Thu, 29 Oct 2015 21:25:09 -0700
> > Kevin Buettner <kevinb@redhat.com> wrote:
> > 
> >> 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.
> > 
> > Several of the .S files in gdb.dwarf2 have the same problem.  E.g.
> > when linking the test case for gdb.dwarf2/method-ptr.exp, I see a
> > linker error "undefined reference to `main'".  It appears that crt0
> > is generating a reference to _main, but the .S file only provides a
> > reference to main.
> > 
> > Any thoughts on what to do about this?
> 
> Isn't this being addressed by gdb_target_symbol_prefix_flags in
> the existing tests that use it?  E.g., gdb.arch/i386-bp_permanent.c:
> 
> #ifdef SYMBOL_PREFIX
> #define SYMBOL(str)     SYMBOL_PREFIX #str
> #else
> #define SYMBOL(str)     #str
> #endif
> 
> ...
> 
> #ifdef __x86_64__
> asm(".text\n"
>     "    .align 8\n"
>     SYMBOL (standard) ":\n"

This seems like the right general approach, but it appears to me that
the current mechanism is broken for assembly files.

For targets which need an _ prefix, gdb_target_symbol_prefix_flags
returns this:

additional_flags=-DSYMBOL_PREFIX="_"

(The code in question escapes the double quotes. I don't show that here.)

When the compiler is invoked, the relevant part of the command line
looks something like this:

rx-elf-gcc   -DSYMBOL_PREFIX="_" ...

This is invoked via tcl and not via bash or similar shell.  Therefore, the
value of SYMBOL_PREFIX is actually "_" (with the quotes).

(For a while, I was puzzled about why things worked in when I pasted,
into bash, the exact command from log output that showed an error.  It
turns out that bash was eliminating the quotes as part of its argument
processing.  When I pasted the command into tclsh instead, I was able
to reproduce the error.)

Anyway, with those quotes in place, the macro defining SYMBOL will work
just fine for inline assembler in C/C++.

But for a .S file, we need to do something like this (as shown in
gdb.arch/i386-float.S):

#define CONCAT1(a, b) CONCAT2(a, b)
#define CONCAT2(a, b) a ## b

#ifdef SYMBOL_PREFIX
# define SYMBOL(str)     CONCAT1(SYMBOL_PREFIX, str)
#else
# define SYMBOL(str)     str
#endif

	.text
	.globl SYMBOL(main)
SYMBOL(main):

I don't understand the reason for both CONCAT1 and CONCAT2, but when
I use this code in one of the files that I'm working on, I end
up seeing an error due to the double quotes.  Here's the source:

#define CONCAT1(a, b) CONCAT2(a, b)
#define CONCAT2(a, b) a ## b

#ifdef SYMBOL_PREFIX
# define SYMBOL(str)     CONCAT1(SYMBOL_PREFIX, str)
#else
# define SYMBOL(str)     str
#endif

	.text
SYMBOL(main):	.globl SYMBOL(main)

...

And this is what it translates to:

 .text
"_"main: .globl "_"main

I don't think there's any way to, within the C preprocessor, strip
the quotes from the _.

It seems to me that the way to fix this is to make
gdb_target_symbol_prefix_flags return an unquoted prefix.  I.e.
it should return:

additional_flags=-DSYMBOL_PREFIX=_

instead of:

additional_flags=-DSYMBOL_PREFIX="_"

Then, within C files, SYMBOL is defined as follows:

#ifdef SYMBOL_PREFIX
#define SYMBOL(str)     #SYMBOL_PREFIX #str
#else
#define SYMBOL(str)     #str
#endif

Note that this is the same as before, except that I added a # to
the front of SYMBOL_PREFIX.  It's possible that this won't work -
we might end up with "SYMBOL_PREFIX" instead of "_" for the prefix.
If that's the case, then some layering is needed, perhaps something
like this:

#define STRCAT1(a,b) #a #b
#ifdef SYMBOL_PREFIX
#define SYMBOL(str)     STRCAT1(SYMBOL_PREFIX,str)
#else
#define SYMBOL(str)     #str
#endif

I'm willing to make these changes, but I want to first be sure that
I'm not missing an easier fix.

Kevin


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] gdb.dwarf2: Define and use gdb_target_symbol_prefix for symbol prefixes
  2015-11-04 21:49   ` Kevin Buettner
@ 2015-11-05 10:14     ` Pedro Alves
  2015-11-05 20:01       ` Kevin Buettner
  0 siblings, 1 reply; 13+ messages in thread
From: Pedro Alves @ 2015-11-05 10:14 UTC (permalink / raw)
  To: Kevin Buettner, gdb-patches

On 11/04/2015 09:49 PM, Kevin Buettner wrote:
> On Fri, 30 Oct 2015 11:06:09 +0000
> Pedro Alves <palves@redhat.com> wrote:
> 
>> On 10/30/2015 04:25 AM, Kevin Buettner wrote:
>>
>>> +# gdb_target_symbol_prefix compiles a test program and uses readelf
>>> +# to determine the prefix (such as underscore) for linker symbol
>>> +# prefixes.
>>> +
>>> +proc gdb_target_symbol_prefix {} {
>>
>> Shouldn't this be gdb_caching_proc ?
> 
> Yes, it should. I've fixed this in my new patch.

Thanks Kevin.  This version generally looks good to me.  Some comments
below.

> 
>> Then T wonder whether something like:
>>
>> -                    DW_OP_addr table_2_ptr
>> +                    DW_OP_addr [gdb_symbol table_2_ptr]
>>
>> instead of prepending the $prefix variable results in clearer
>> test code.
> 
> I like this idea too. I used the name 'gdb_target_symbol' for this.
> 
> Defining the obvious proc (for gdb_target_symbol) worked out of the
> box for all cases except gdb.dwarf2/atomic-type.exp.  For that I
> needed to make a change to lib/dwarf.exp (and learned a bit more about
> tcl in the process).  If you know of a cleaner way to code it, let me
> know - I couldn't think of a way to do it without adding the if-else
> statement.

Not sure I see what makes gdb.dwarf2/atomic-type.exp different?
E.g., the gdb.dwarf2/dw2-bad-mips-linkage-name.exp hunk looks quite
similar.  What makes gdb.dwarf2/atomic-type.exp special?

> With regard to gdb_target_symbol_prefix_flags, I think I'll change
> it to call the new gdb_target_symbol_prefix.  That seems preferable
> to hardcoding a bunch of targets.  If it all works out, I'll submit a
> separate patch.

Yes, please, that's the idea.  :-)

> diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
> index 048070b..e1c9839 100644
> --- a/gdb/testsuite/lib/gdb.exp
> +++ b/gdb/testsuite/lib/gdb.exp
> @@ -5521,6 +5521,54 @@ proc core_find {binfile {deletefiles {}} {arg ""}} {
>      return $destcore
>  }
>  
> +# gdb_target_symbol_prefix compiles a test program and uses readelf to

s/readelf/objdump/

> +# 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...

Thanks,
Pedro Alves


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] gdb.dwarf2: Define and use gdb_target_symbol_prefix for symbol prefixes
  2015-11-05  6:39     ` Kevin Buettner
@ 2015-11-05 10:46       ` Pedro Alves
  2015-11-05 10:55         ` Pedro Alves
  0 siblings, 1 reply; 13+ messages in thread
From: Pedro Alves @ 2015-11-05 10:46 UTC (permalink / raw)
  To: Kevin Buettner, gdb-patches

On 11/05/2015 06:39 AM, Kevin Buettner wrote:
> On Fri, 30 Oct 2015 11:11:33 +0000
> Pedro Alves <palves@redhat.com> wrote:


> But for a .S file, we need to do something like this (as shown in
> gdb.arch/i386-float.S):
> 
> #define CONCAT1(a, b) CONCAT2(a, b)
> #define CONCAT2(a, b) a ## b
> 
> #ifdef SYMBOL_PREFIX
> # define SYMBOL(str)     CONCAT1(SYMBOL_PREFIX, str)
> #else
> # define SYMBOL(str)     str
> #endif
> 
> 	.text
> 	.globl SYMBOL(main)
> SYMBOL(main):
> 
> I don't understand the reason for both CONCAT1 and CONCAT2,

You need two levels in order to first expand SYMBOL_PREFIX, and
then concat the result.  Otherwise SYMBOL(main) expands to
literally "SYMBOL_PREFIXmain" (minus quotes).

> It seems to me that the way to fix this is to make
> gdb_target_symbol_prefix_flags return an unquoted prefix.  I.e.
> it should return:
> 
> additional_flags=-DSYMBOL_PREFIX=_
> 
> instead of:
> 
> additional_flags=-DSYMBOL_PREFIX="_"

Yup.

> 
> Then, within C files, SYMBOL is defined as follows:
> 
> #ifdef SYMBOL_PREFIX
> #define SYMBOL(str)     #SYMBOL_PREFIX #str
> #else
> #define SYMBOL(str)     #str
> #endif
> 
> Note that this is the same as before, except that I added a # to
> the front of SYMBOL_PREFIX.  It's possible that this won't work -

It wont.  # can only be used with a macro parameter.

> we might end up with "SYMBOL_PREFIX" instead of "_" for the prefix.
> If that's the case, then some layering is needed, perhaps something
> like this:
> 
> #define STRCAT1(a,b) #a #b
> #ifdef SYMBOL_PREFIX
> #define SYMBOL(str)     STRCAT1(SYMBOL_PREFIX,str)
> #else
> #define SYMBOL(str)     #str
> #endif
> 

That still needs double expansion.

> I'm willing to make these changes, but I want to first be sure that
> I'm not missing an easier fix.

IMO, it's clearer to separate the concerns -- concatenation
and final stringification.

Start with the usual concatenation:

#define CONCAT1(a, b) CONCAT2(a, b)
#define CONCAT2(a, b) a ## b

#ifdef SYMBOL_PREFIX
# define SYMBOL1(str)     CONCAT1(SYMBOL_PREFIX, str)
#else
# define SYMBOL1(str)     str
#endif


Then add a stringification layer:

#define STR1(s) #s
#define STR(s) STR1(s)

#define SYMBOL(str)     STR(SYMBOL1(str))


This way you have these expansions:

 SYMBOL1(main) -> _main
 SYMBOL(main) -> "_main"

Thanks,
Pedro Alves


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] gdb.dwarf2: Define and use gdb_target_symbol_prefix for symbol prefixes
  2015-11-05 10:46       ` Pedro Alves
@ 2015-11-05 10:55         ` Pedro Alves
  2015-11-06  5:33           ` Kevin Buettner
  0 siblings, 1 reply; 13+ messages in thread
From: Pedro Alves @ 2015-11-05 10:55 UTC (permalink / raw)
  To: Kevin Buettner, gdb-patches

On 11/05/2015 10:46 AM, Pedro Alves wrote:
>> > I'm willing to make these changes, but I want to first be sure that
>> > I'm not missing an easier fix.

BTW, an alternative to the below would be to have two tcl procedures,
one for asm, and another for C/C++/etc, like
gdb_target_symbol_prefix_flags_asm / gdb_target_symbol_prefix_flags.
The C version would just call the asm version and add the double
quotes.

Thanks,
Pedro Alves

> IMO, it's clearer to separate the concerns -- concatenation
> and final stringification.
> 
> Start with the usual concatenation:
> 
> #define CONCAT1(a, b) CONCAT2(a, b)
> #define CONCAT2(a, b) a ## b
> 
> #ifdef SYMBOL_PREFIX
> # define SYMBOL1(str)     CONCAT1(SYMBOL_PREFIX, str)
> #else
> # define SYMBOL1(str)     str
> #endif
> 
> 
> Then add a stringification layer:
> 
> #define STR1(s) #s
> #define STR(s) STR1(s)
> 
> #define SYMBOL(str)     STR(SYMBOL1(str))
> 
> 
> This way you have these expansions:
> 
>  SYMBOL1(main) -> _main
>  SYMBOL(main) -> "_main"


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] gdb.dwarf2: Define and use gdb_target_symbol_prefix for symbol prefixes
  2015-11-05 10:14     ` Pedro Alves
@ 2015-11-05 20:01       ` Kevin Buettner
  2015-11-05 21:19         ` Pedro Alves
  0 siblings, 1 reply; 13+ messages in thread
From: Kevin Buettner @ 2015-11-05 20:01 UTC (permalink / raw)
  To: gdb-patches; +Cc: Pedro Alves

On Thu, 05 Nov 2015 10:14:09 +0000
Pedro Alves <palves@redhat.com> wrote:

> > Defining the obvious proc (for gdb_target_symbol) worked out of the
> > box for all cases except gdb.dwarf2/atomic-type.exp.  For that I
> > needed to make a change to lib/dwarf.exp (and learned a bit more about
> > tcl in the process).  If you know of a cleaner way to code it, let me
> > know - I couldn't think of a way to do it without adding the if-else
> > statement.
> 
> Not sure I see what makes gdb.dwarf2/atomic-type.exp different?
> E.g., the gdb.dwarf2/dw2-bad-mips-linkage-name.exp hunk looks quite
> similar.  What makes gdb.dwarf2/atomic-type.exp special?

I was mistaken.  Both of these tests - dw2-bad-mips-linkage-name.exp
and atomic-type.exp - have problems due to the fact that the call to
gdb_target_symbol appears within a DW_TAG_ construct.  The proc
_handle_DW_TAG performs command and variable expansion within a DW_TAG_
construct.  (It does other things too.)

When I remove my change to dwarf.exp, this what I see in the log
file:

ERROR: tcl error sourcing /ironwood1/sourceware-git/mesquite-native/bld/../../binutils-gdb/gdb/testsuite/gdb.dwarf2/dw2-bad-mips-linkage-name.exp.
ERROR: missing close-bracket
    while executing
"subst {[gdb_target_symbol}"
    ("uplevel" body line 1)
    invoked from within
"uplevel 2 [list subst [lindex $attr 1]]"
    (procedure "_handle_DW_TAG" line 31)
    invoked from within
"_handle_DW_TAG DW_TAG_subprogram $attrs $children"
    (procedure "DW_TAG_subprogram" line 1)
    invoked from within
"DW_TAG_subprogram {
                {name f}
                {low_pc [gdb_target_symbol f] addr}
                {high_pc f_end_lbl addr}
            ..."
    ("uplevel" body line 9)
    invoked from within
"uplevel 2 $children"
    (procedure "_handle_DW_TAG" line 61)
    invoked from within
"_handle_DW_TAG DW_TAG_compile_unit $attrs $children"
    (procedure "DW_TAG_compile_unit" line 1)
    invoked from within
"DW_TAG_compile_unit {
                {DW_AT_language @DW_LANG_C}
                {DW_AT_name     dw2-bad-mips-linkage-name.c}
                {DW_AT_..."
    ("uplevel" body line 2)
    invoked from within
"uplevel $body"
    (procedure "cu" line 66)
    invoked from within
"cu {} {
	DW_TAG_compile_unit {
                {DW_AT_language @DW_LANG_C}
                {DW_AT_name     dw2-bad-mips-linkage-name.c}
              ..."
    ("eval" body line 2)
    invoked from within
"eval $body"
    (procedure "Dwarf::assemble" line 30)
    invoked from within
"Dwarf::assemble $asm_file {
    cu {} {
	DW_TAG_compile_unit {
                {DW_AT_language @DW_LANG_C}
                {DW_AT_name     dw2-bad-mip..."


The reason for this is that '[gdb_target_symbol' is one list element
and 'f]' is another.  The code, as it was originally written, invoked
subst on just a single element.  When invoked on (just) '[gdb_target_symbol'
it rightly complains about the "missing close-bracket".

My change joins the list elements together and then invokes subst on
them:

	    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]]]
	    }

versus just this line, originally:

	    set attr_value [uplevel 2 [list subst [lindex $attr 1]]]

I was hoping to write this somewhat more compactly, but we need to
accomodate the case where a form is not provided. The original statement,
in the else clause, still handles this.

Thanks again for your comments.

Kevin

> > diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
> > index 048070b..e1c9839 100644
> > --- a/gdb/testsuite/lib/gdb.exp
> > +++ b/gdb/testsuite/lib/gdb.exp
> > @@ -5521,6 +5521,54 @@ proc core_find {binfile {deletefiles {}} {arg ""}} {
> >      return $destcore
> >  }
> >  
> > +# gdb_target_symbol_prefix compiles a test program and uses readelf to
> 
> s/readelf/objdump/

Fixed in the new version...

    gdb.dwarf2: Define and use gdb_target_symbol for symbol prefixes
    
    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/gdb.dwarf2/atomic-type.exp           |  2 +-
 gdb/testsuite/gdb.dwarf2/data-loc.exp              |  8 ++--
 .../gdb.dwarf2/dw2-bad-mips-linkage-name.exp       |  4 +-
 gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.exp   |  2 +-
 gdb/testsuite/gdb.dwarf2/dw2-regno-invalid.exp     |  8 ++--
 gdb/testsuite/gdb.dwarf2/dynarr-ptr.exp            |  8 ++--
 gdb/testsuite/lib/dwarf.exp                        | 15 ++++++-
 gdb/testsuite/lib/gdb.exp                          | 48 ++++++++++++++++++++++
 8 files changed, 77 insertions(+), 18 deletions(-)

diff --git a/gdb/testsuite/gdb.dwarf2/atomic-type.exp b/gdb/testsuite/gdb.dwarf2/atomic-type.exp
index fb315e3..e2a3447 100644
--- a/gdb/testsuite/gdb.dwarf2/atomic-type.exp
+++ b/gdb/testsuite/gdb.dwarf2/atomic-type.exp
@@ -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}
             } {
diff --git a/gdb/testsuite/gdb.dwarf2/data-loc.exp b/gdb/testsuite/gdb.dwarf2/data-loc.exp
index e9e702c..a1fb772 100644
--- a/gdb/testsuite/gdb.dwarf2/data-loc.exp
+++ b/gdb/testsuite/gdb.dwarf2/data-loc.exp
@@ -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}
             }
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-bad-mips-linkage-name.exp b/gdb/testsuite/gdb.dwarf2/dw2-bad-mips-linkage-name.exp
index 77f6175..dfb9567 100644
--- a/gdb/testsuite/gdb.dwarf2/dw2-bad-mips-linkage-name.exp
+++ b/gdb/testsuite/gdb.dwarf2/dw2-bad-mips-linkage-name.exp
@@ -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}
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.exp b/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.exp
index c71103d..4f07b50 100644
--- a/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.exp
+++ b/gdb/testsuite/gdb.dwarf2/dw2-ifort-parameter.exp
@@ -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}
 		}
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-regno-invalid.exp b/gdb/testsuite/gdb.dwarf2/dw2-regno-invalid.exp
index a7d77c5..53897bd 100644
--- a/gdb/testsuite/gdb.dwarf2/dw2-regno-invalid.exp
+++ b/gdb/testsuite/gdb.dwarf2/dw2-regno-invalid.exp
@@ -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}
diff --git a/gdb/testsuite/gdb.dwarf2/dynarr-ptr.exp b/gdb/testsuite/gdb.dwarf2/dynarr-ptr.exp
index 3dcb3d7..0a612fe 100644
--- a/gdb/testsuite/gdb.dwarf2/dynarr-ptr.exp
+++ b/gdb/testsuite/gdb.dwarf2/dynarr-ptr.exp
@@ -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}
             }
diff --git a/gdb/testsuite/lib/dwarf.exp b/gdb/testsuite/lib/dwarf.exp
index 888ba94..383f8f5 100644
--- a/gdb/testsuite/lib/dwarf.exp
+++ b/gdb/testsuite/lib/dwarf.exp
@@ -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] {
diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
index 048070b..f11609b 100644
--- a/gdb/testsuite/lib/gdb.exp
+++ b/gdb/testsuite/lib/gdb.exp
@@ -5521,6 +5521,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


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] gdb.dwarf2: Define and use gdb_target_symbol_prefix for symbol prefixes
  2015-11-05 20:01       ` Kevin Buettner
@ 2015-11-05 21:19         ` Pedro Alves
  2015-11-05 22:26           ` Kevin Buettner
  0 siblings, 1 reply; 13+ messages in thread
From: Pedro Alves @ 2015-11-05 21:19 UTC (permalink / raw)
  To: Kevin Buettner, gdb-patches

On 11/05/2015 08:01 PM, Kevin Buettner wrote:
> On Thu, 05 Nov 2015 10:14:09 +0000
> Pedro Alves <palves@redhat.com> wrote:

>> > Not sure I see what makes gdb.dwarf2/atomic-type.exp different?
>> > E.g., the gdb.dwarf2/dw2-bad-mips-linkage-name.exp hunk looks quite
>> > similar.  What makes gdb.dwarf2/atomic-type.exp special?
> I was mistaken.  Both of these tests - dw2-bad-mips-linkage-name.exp
> and atomic-type.exp - have problems due to the fact that the call to
> gdb_target_symbol appears within a DW_TAG_ construct.  The proc
> _handle_DW_TAG performs command and variable expansion within a DW_TAG_
> construct.  (It does other things too.)

...

> --- a/gdb/testsuite/gdb.dwarf2/dw2-regno-invalid.exp
> +++ b/gdb/testsuite/gdb.dwarf2/dw2-regno-invalid.exp
...
>  	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}

Aren't these above more instances that needed the "join"?  I believe
so, but if not, I'd like to understand why not.
The patch looks good to me otherwise.

BTW, OOC, it seems to be that "main+0x10000" were written
without spaces before to make it a single element.  Looks like
that requirement is gone now and we could write:

	{high_pc [gdb_target_symbol main] + 0x10000 DW_FORM_addr}

(not saying you should do that, just it's just an OOC.)

Thanks,
Pedro Alves


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] gdb.dwarf2: Define and use gdb_target_symbol_prefix for symbol prefixes
  2015-11-05 21:19         ` Pedro Alves
@ 2015-11-05 22:26           ` Kevin Buettner
  0 siblings, 0 replies; 13+ messages in thread
From: Kevin Buettner @ 2015-11-05 22:26 UTC (permalink / raw)
  To: gdb-patches

On Thu, 05 Nov 2015 21:19:05 +0000
Pedro Alves <palves@redhat.com> wrote:

> On 11/05/2015 08:01 PM, Kevin Buettner wrote:
> > On Thu, 05 Nov 2015 10:14:09 +0000
> > Pedro Alves <palves@redhat.com> wrote:
> 
> >> > Not sure I see what makes gdb.dwarf2/atomic-type.exp different?
> >> > E.g., the gdb.dwarf2/dw2-bad-mips-linkage-name.exp hunk looks quite
> >> > similar.  What makes gdb.dwarf2/atomic-type.exp special?
> > I was mistaken.  Both of these tests - dw2-bad-mips-linkage-name.exp
> > and atomic-type.exp - have problems due to the fact that the call to
> > gdb_target_symbol appears within a DW_TAG_ construct.  The proc
> > _handle_DW_TAG performs command and variable expansion within a DW_TAG_
> > construct.  (It does other things too.)
> 
> ...
> 
> > --- a/gdb/testsuite/gdb.dwarf2/dw2-regno-invalid.exp
> > +++ b/gdb/testsuite/gdb.dwarf2/dw2-regno-invalid.exp
> ...
> >  	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}
> 
> Aren't these above more instances that needed the "join"?  I believe
> so, but if not, I'd like to understand why not.

You're right; they did.

> The patch looks good to me otherwise.

Thanks again for your review.

I've pushed it.

Kevin


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] gdb.dwarf2: Define and use gdb_target_symbol_prefix for symbol prefixes
  2015-11-05 10:55         ` Pedro Alves
@ 2015-11-06  5:33           ` Kevin Buettner
  0 siblings, 0 replies; 13+ messages in thread
From: Kevin Buettner @ 2015-11-06  5:33 UTC (permalink / raw)
  To: gdb-patches

On Thu, 05 Nov 2015 10:54:56 +0000
Pedro Alves <palves@redhat.com> wrote:

> On 11/05/2015 10:46 AM, Pedro Alves wrote:
> >> > I'm willing to make these changes, but I want to first be sure that
> >> > I'm not missing an easier fix.
> 
> BTW, an alternative to the below would be to have two tcl procedures,
> one for asm, and another for C/C++/etc, like
> gdb_target_symbol_prefix_flags_asm / gdb_target_symbol_prefix_flags.
> The C version would just call the asm version and add the double
> quotes.

This is a really good idea.  It means that I don't need to touch
already working test cases contained in .c files.  Also, the SYMBOL
macros contained therein stay simpler and (presumably) easier to
maintain.

I've just posted a patch implementing this idea.  See:

https://sourceware.org/ml/gdb-patches/2015-11/msg00192.html

Thanks!

Kevin


^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2015-11-06  5:33 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-10-30 11:06 [PATCH] gdb.dwarf2: Define and use gdb_target_symbol_prefix for symbol prefixes Kevin Buettner
2015-10-30 12:06 ` Kevin Buettner
2015-10-30 15:53   ` Pedro Alves
2015-11-05  6:39     ` Kevin Buettner
2015-11-05 10:46       ` Pedro Alves
2015-11-05 10:55         ` Pedro Alves
2015-11-06  5:33           ` Kevin Buettner
2015-10-30 15:51 ` Pedro Alves
2015-11-04 21:49   ` Kevin Buettner
2015-11-05 10:14     ` Pedro Alves
2015-11-05 20:01       ` Kevin Buettner
2015-11-05 21:19         ` Pedro Alves
2015-11-05 22:26           ` Kevin Buettner

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox