public inbox for gdb-cvs@sourceware.org
help / color / mirror / Atom feed
* [binutils-gdb] [gdb/testsuite] Fix local-static.exp with g++-4.8
@ 2019-10-16 15:00 Tom de Vries
  0 siblings, 0 replies; only message in thread
From: Tom de Vries @ 2019-10-16 15:00 UTC (permalink / raw)
  To: gdb-cvs

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=03e1ab9424bd1d37da5818549067ef7a7b7ec641

commit 03e1ab9424bd1d37da5818549067ef7a7b7ec641
Author: Tom de Vries <tdevries@suse.de>
Date:   Wed Oct 16 17:00:04 2019 +0200

    [gdb/testsuite] Fix local-static.exp with g++-4.8
    
    With g++-4.8, I see:
    ...
    (gdb) PASS: gdb.cp/local-static.exp: c++: print free_inline_func(void)
    print 'S::method()'::S_M_s_var_int^M
    No symbol "S_M_s_var_int" in specified context.^M
    (gdb) FAIL: gdb.cp/local-static.exp: c++: print 'S::method()'::S_M_s_var_int
    ...
    
    The variable is declared like this (showing pruned .ii):
    ...
    void S::method ()
    {
      static int S_M_s_var_int = 4;
    }
    ...
    
    But the DWARF generated for the variable is encapsulated in an unnamed lexical
    block:
    ...
     <1><121>: Abbrev Number: 5 (DW_TAG_structure_type)
        <122>   DW_AT_name        : S
        ...
     <2><14f>: Abbrev Number: 6 (DW_TAG_subprogram)
        ...
        <150>   DW_AT_name        : (indirect string, offset: 0x599): method
        <156>   DW_AT_linkage_name: (indirect string, offset: 0x517): \
                                    _ZN1S6methodEv /* demangled: dS::method() */
        ...
     <1><3f8>: Abbrev Number: 21 (DW_TAG_subprogram)
        <3f9>   DW_AT_specification: <0x14f>
        ...
        <3fe>   DW_AT_low_pc      : 0x4004fc
        <406>   DW_AT_high_pc     : 0x2c /* 0x400528 */
        ...
     <2><418>: Abbrev Number: 17 (DW_TAG_formal_parameter)
        <419>   DW_AT_name        : (indirect string, offset: 0x68a): this
        ...
     <2><424>: Abbrev Number: 18 (DW_TAG_lexical_block)
        <425>   DW_AT_low_pc      : 0x400508
        <42d>   DW_AT_high_pc     : 0x1e /* 0x400526 */
     <3><435>: Abbrev Number: 22 (DW_TAG_variable)
        <436>   DW_AT_name        : (indirect string, offset: 0x29d): S_M_s_var_int
    ...
    which has the effect that the variable is not addressable unless the program
    counter is in the range of the lexical block.
    
    This is caused by gcc PR debug/55541, which was fixed in gcc 5.
    
    Mark in total 225 FAILs as XFAIL.
    
    Tested on x86_64-linux.
    
    gdb/testsuite/ChangeLog:
    
    2019-10-16  Tom de Vries  <tdevries@suse.de>
    
    	PR testsuite/25059
    	* gdb.cp/local-static.exp (do_test): Add xfails for gcc PR debug/55541.
    
    Change-Id: Ibe86707eecffc79f1bb474d7928ea7d0c39a00a2

Diff:
---
 gdb/testsuite/ChangeLog               |  5 +++++
 gdb/testsuite/gdb.cp/local-static.exp | 40 ++++++++++++++++++++++++++++++++---
 2 files changed, 42 insertions(+), 3 deletions(-)

diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index c9e2457..877d0de 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,5 +1,10 @@
 2019-10-16  Tom de Vries  <tdevries@suse.de>
 
+	PR testsuite/25059
+	* gdb.cp/local-static.exp (do_test): Add xfails for gcc PR debug/55541.
+
+2019-10-16  Tom de Vries  <tdevries@suse.de>
+
 	* gdb.base/jit-reader.exp: Allow non-pointer registers to be printed
 	as signed.
 
diff --git a/gdb/testsuite/gdb.cp/local-static.exp b/gdb/testsuite/gdb.cp/local-static.exp
index fe0e2dc..9905ffb 100644
--- a/gdb/testsuite/gdb.cp/local-static.exp
+++ b/gdb/testsuite/gdb.cp/local-static.exp
@@ -130,6 +130,7 @@ proc do_test {lang} {
     global cxx_scopes_list
     global vars_list
     global srcfile testfile
+    global gdb_prompt
 
     set options {debug}
 
@@ -201,12 +202,45 @@ proc do_test {lang} {
 	    set var [lindex $var_line 0]
 	    set print_re [lindex $var_line 1]
 
-	    gdb_test "print '${scope}'::${var_prefix}_${var}" $print_re
-	    gdb_test "print ${scope}::${var_prefix}_${var}" $print_re
+	    # The gcc PR debug/55541 has the effect that local statics are
+	    # wrapped in a DW_TAG_lexical_block, making them unaddressable from
+	    # outside the function.  XFAIL the relevant tests.
+	    set test "print '${scope}'::${var_prefix}_${var}"
+	    set xfail_pattern "No symbol \".*\" in specified context."
+	    gdb_test_multiple $test $test {
+		-re "\[\r\n\]*(?:$print_re)\[\r\n\]+$gdb_prompt $" {
+		    pass $test
+		}
+		-re "\[\r\n\]*(?:$xfail_pattern)\[\r\n\]+$gdb_prompt $" {
+		    xfail $test
+		}
+	    }
+	    set test "print ${scope}::${var_prefix}_${var}"
+	    gdb_test_multiple $test $test {
+		-re "\[\r\n\]*(?:$print_re)\[\r\n\]+$gdb_prompt $" {
+		    pass $test
+		}
+		-re "\[\r\n\]*(?:$xfail_pattern)\[\r\n\]+$gdb_prompt $" {
+		    xfail $test
+		}
+	    }
 
 	    set sym "${scope}::${var_prefix}_${var}"
 	    if {$lang == "c++"} {
-		gdb_test "print '${sym}'" $print_re
+		set test "print '${sym}'"
+		set xfail_pattern "No symbol .* in current context."
+		set xfail_pattern2 "has unknown type; cast it to its declared type"
+		gdb_test_multiple $test $test {
+		    -re "\[\r\n\]*(?:$print_re)\[\r\n\]+$gdb_prompt $" {
+			pass $test
+		    }
+		    -re "\[\r\n\]*(?:$xfail_pattern)\[\r\n\]+$gdb_prompt $" {
+			xfail $test
+		    }
+		    -re "\[\r\n\]*(?:$xfail_pattern2)\[\r\n\]+$gdb_prompt $" {
+			xfail $test
+		    }
+		}
 	    } else {
 		gdb_test "print '${sym}'" "No symbol \"$sym\" in current context\\."
 	    }


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2019-10-16 15:00 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-10-16 15:00 [binutils-gdb] [gdb/testsuite] Fix local-static.exp with g++-4.8 Tom de Vries

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).