PING^2: [RFA/RFC] fix PR gdb/22670 (pb looking up some symbols when they have a linkage name) (was: "Re: [RFC] regresssion(internal-error) printing subprogram argument")

Joel Brobecker brobecker@adacore.com
Mon Mar 19 21:22:00 GMT 2018


On Wed, Feb 21, 2018 at 07:02:11AM +0400, Joel Brobecker wrote:
> > > All in all, I think a better solution would be to put that information
> > > directly in the language_defn itself, via a new "attribute".
> > > Something like a...
> > 
> > I ended up choosing this approach. lookup names is still a bit
> > foggy for me, so the comments I wrote and/or the name of the
> > new language_defn attribute might be a bit off. As always, I am
> > grateful for suggestions :).
> > 
> > gdb/ChangeLog:
> > 
> >         PR gdb/22670
> >         * dwarf2read.c (dwarf2_physname): Do not return the demangled
> >         symbol name is the CU's language stores symbol names in linkage
> >         format.
> >         * language.h (struct language_defn)
> >         <la_store_sym_names_in_linkage_form_p>: New field.  Adjust
> >         all instances of this struct.
> > 
> > gdb/testsuite/ChangeLog:
> > 
> >         * gdb.ada/maint_with_ada.exp: Remove PR gdb/22670 setup_kfail.
> > 
> >         * gdb.ada/notcplusplus: New testcase.
> > 
> >         * gdb.base/c-linkage-name.c: New file.
> >         * gdb.base/c-linkage-name.exp: New testcase.
> > 
> > Tested on x86_64-linux.
> > This also passes AdaCore's internal GDB testsuite.

I'm thinking of pushing this patch at some point, since it has been
waiting for a review for a quite a while, now. If it's lack of time
and you'd like a little more time before I push, please let me know!

> Any comment on this patch?
> 
> Thanks!
> 
> > >From c22aef84cc86097d6d8b654b0586a3fbc1ff6af3 Mon Sep 17 00:00:00 2001
> > From: Joel Brobecker <brobecker@adacore.com>
> > Date: Fri, 9 Feb 2018 02:13:34 -0500
> > Subject: [PATCH] problem looking up some symbols when they have a linkage name
> > 
> > This patch fixes a known failure in gdb.ada/maint_with_ada.exp
> > (maintenance check-psymtabs). Another way to witness the same
> > issue is by considering the following Ada declarations...
> > 
> >    type Wrapper is record
> >       A : Integer;
> >    end record;
> >    u00045 : constant Wrapper := (A => 16#060287af#);
> >    pragma Export (C, u00045, "symada__cS");
> > 
> > ... which declares a variable name "u00045" but with a linkage
> > name which is "symada__cS". This variable is a record with one
> > component, the Ada equivalent of a struct with one field in C.
> > Trying to print that variable's value currently yields:
> > 
> >     (gdb) p /x <symada__cS>
> >     'symada(char, signed)' has unknown type; cast it to its declared type
> > 
> > This indicates that GDB was only able to find the minimal symbol,
> > but not the full symbol. The expected output is:
> > 
> >     (gdb) print /x <symada__cS>
> >     $1 = (a => 0x60287af)
> > 
> > The error message gives a hint about what's happening: We processed
> > the symbol through gdb_demangle, which in the case of this particular
> > symbol name, ends up matching the C++ naming scheme. As a result,
> > the demangler transforms our symbol name into 'symada(char, signed)',
> > thus breaking Ada lookups.
> > 
> > This patch fixes the issue by first introducing a new language_defn
> > attribute called la_store_sym_names_in_linkage_form_p, which is a boolean
> > to be set to true for the few languages that do not want their symbols
> > to have their names stored in demangled form, and false otherwise.
> > We then use this language attribute to skip the call to gdb_demangle
> > for all languages whose la_store_sym_names_in_linkage_form_p is true.
> > 
> > In terms of the selection of languages for which the new attribute
> > is set to true, the selection errs on the side of preserving the
> > existing behavior, and only changes the behavior for the languages
> > where we are certain storing symbol names in demangling form is not
> > needed. It is conceivable that other languages might be in the same
> > situation, but I not knowing in detail the symbol name enconding
> > strategy, I decided to play it safe and let other language maintainers
> > potentially adjust their language if it makes sense to do so.
> > 
> > gdb/ChangeLog:
> > 
> >         PR gdb/22670
> >         * dwarf2read.c (dwarf2_physname): Do not return the demangled
> >         symbol name is the CU's language stores symbol names in linkage
> >         format.
> >         * language.h (struct language_defn)
> >         <la_store_sym_names_in_linkage_form_p>: New field.  Adjust
> >         all instances of this struct.
> > 
> > gdb/testsuite/ChangeLog:
> > 
> >         * gdb.ada/maint_with_ada.exp: Remove PR gdb/22670 setup_kfail.
> > 
> >         * gdb.ada/notcplusplus: New testcase.
> > 
> >         * gdb.base/c-linkage-name.c: New file.
> >         * gdb.base/c-linkage-name.exp: New testcase.
> > 
> > Tested on x86_64-linux.
> > This also passes AdaCore's internal GDB testsuite.
> > ---
> >  gdb/ada-lang.c                             |  1 +
> >  gdb/c-lang.c                               |  4 +++
> >  gdb/d-lang.c                               |  1 +
> >  gdb/dwarf2read.c                           |  6 +++-
> >  gdb/f-lang.c                               |  1 +
> >  gdb/go-lang.c                              |  1 +
> >  gdb/language.c                             |  2 ++
> >  gdb/language.h                             | 20 +++++++++++++
> >  gdb/m2-lang.c                              |  1 +
> >  gdb/objc-lang.c                            |  1 +
> >  gdb/opencl-lang.c                          |  1 +
> >  gdb/p-lang.c                               |  1 +
> >  gdb/rust-lang.c                            |  1 +
> >  gdb/testsuite/gdb.ada/maint_with_ada.exp   |  1 -
> >  gdb/testsuite/gdb.ada/notcplusplus.exp     | 45 ++++++++++++++++++++++++++++
> >  gdb/testsuite/gdb.ada/notcplusplus/foo.adb | 21 +++++++++++++
> >  gdb/testsuite/gdb.ada/notcplusplus/pck.adb | 21 +++++++++++++
> >  gdb/testsuite/gdb.ada/notcplusplus/pck.ads | 19 ++++++++++++
> >  gdb/testsuite/gdb.ada/notcplusplus/ver.ads | 22 ++++++++++++++
> >  gdb/testsuite/gdb.base/c-linkage-name.c    | 44 ++++++++++++++++++++++++++++
> >  gdb/testsuite/gdb.base/c-linkage-name.exp  | 47 ++++++++++++++++++++++++++++++
> >  21 files changed, 259 insertions(+), 2 deletions(-)
> >  create mode 100644 gdb/testsuite/gdb.ada/notcplusplus.exp
> >  create mode 100644 gdb/testsuite/gdb.ada/notcplusplus/foo.adb
> >  create mode 100644 gdb/testsuite/gdb.ada/notcplusplus/pck.adb
> >  create mode 100644 gdb/testsuite/gdb.ada/notcplusplus/pck.ads
> >  create mode 100644 gdb/testsuite/gdb.ada/notcplusplus/ver.ads
> >  create mode 100644 gdb/testsuite/gdb.base/c-linkage-name.c
> >  create mode 100644 gdb/testsuite/gdb.base/c-linkage-name.exp
> > 
> > diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
> > index 0da58d9..7f99a2e 100644
> > --- a/gdb/ada-lang.c
> > +++ b/gdb/ada-lang.c
> > @@ -14521,6 +14521,7 @@ extern const struct language_defn ada_language_defn = {
> >    ada_read_var_value,		/* la_read_var_value */
> >    NULL,                         /* Language specific skip_trampoline */
> >    NULL,                         /* name_of_this */
> > +  true,                         /* la_store_sym_names_in_linkage_form_p */
> >    ada_lookup_symbol_nonlocal,   /* Looking up non-local symbols.  */
> >    basic_lookup_transparent_type,        /* lookup_transparent_type */
> >    ada_la_decode,                /* Language specific symbol demangler */
> > diff --git a/gdb/c-lang.c b/gdb/c-lang.c
> > index a0b553e..658c7f7 100644
> > --- a/gdb/c-lang.c
> > +++ b/gdb/c-lang.c
> > @@ -853,6 +853,7 @@ extern const struct language_defn c_language_defn =
> >    default_read_var_value,	/* la_read_var_value */
> >    NULL,				/* Language specific skip_trampoline */
> >    NULL,				/* name_of_this */
> > +  true,				/* la_store_sym_names_in_linkage_form_p */
> >    basic_lookup_symbol_nonlocal,	/* lookup_symbol_nonlocal */
> >    basic_lookup_transparent_type,/* lookup_transparent_type */
> >    NULL,				/* Language specific symbol demangler */
> > @@ -998,6 +999,7 @@ extern const struct language_defn cplus_language_defn =
> >    default_read_var_value,	/* la_read_var_value */
> >    cplus_skip_trampoline,	/* Language specific skip_trampoline */
> >    "this",                       /* name_of_this */
> > +  false,			/* la_store_sym_names_in_linkage_form_p */
> >    cp_lookup_symbol_nonlocal,	/* lookup_symbol_nonlocal */
> >    cp_lookup_transparent_type,   /* lookup_transparent_type */
> >    gdb_demangle,			/* Language specific symbol demangler */
> > @@ -1052,6 +1054,7 @@ extern const struct language_defn asm_language_defn =
> >    default_read_var_value,	/* la_read_var_value */
> >    NULL,				/* Language specific skip_trampoline */
> >    NULL,				/* name_of_this */
> > +  true,				/* la_store_sym_names_in_linkage_form_p */
> >    basic_lookup_symbol_nonlocal,	/* lookup_symbol_nonlocal */
> >    basic_lookup_transparent_type,/* lookup_transparent_type */
> >    NULL,				/* Language specific symbol demangler */
> > @@ -1106,6 +1109,7 @@ extern const struct language_defn minimal_language_defn =
> >    default_read_var_value,	/* la_read_var_value */
> >    NULL,				/* Language specific skip_trampoline */
> >    NULL,				/* name_of_this */
> > +  true,				/* la_store_sym_names_in_linkage_form_p */
> >    basic_lookup_symbol_nonlocal,	/* lookup_symbol_nonlocal */
> >    basic_lookup_transparent_type,/* lookup_transparent_type */
> >    NULL,				/* Language specific symbol demangler */
> > diff --git a/gdb/d-lang.c b/gdb/d-lang.c
> > index e0afe48..688ae98 100644
> > --- a/gdb/d-lang.c
> > +++ b/gdb/d-lang.c
> > @@ -229,6 +229,7 @@ extern const struct language_defn d_language_defn =
> >    default_read_var_value,	/* la_read_var_value */
> >    NULL,				/* Language specific skip_trampoline.  */
> >    "this",
> > +  false,			/* la_store_sym_names_in_linkage_form_p */
> >    d_lookup_symbol_nonlocal,
> >    basic_lookup_transparent_type,
> >    d_demangle,			/* Language specific symbol demangler.  */
> > diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
> > index d651725..b4c087f 100644
> > --- a/gdb/dwarf2read.c
> > +++ b/gdb/dwarf2read.c
> > @@ -11142,7 +11142,11 @@ dwarf2_physname (const char *name, struct die_info *die, struct dwarf2_cu *cu)
> >    if (mangled != NULL)
> >      {
> >  
> > -      if (cu->language == language_go)
> > +      if (language_def (cu->language)->la_store_sym_names_in_linkage_form_p)
> > +	{
> > +	  /* Do nothing (do not demangle the symbol name).  */
> > +	}
> > +      else if (cu->language == language_go)
> >  	{
> >  	  /* This is a lie, but we already lie to the caller new_symbol.
> >  	     new_symbol assumes we return the mangled name.
> > diff --git a/gdb/f-lang.c b/gdb/f-lang.c
> > index 74f5622..81922f7 100644
> > --- a/gdb/f-lang.c
> > +++ b/gdb/f-lang.c
> > @@ -269,6 +269,7 @@ extern const struct language_defn f_language_defn =
> >    default_read_var_value,	/* la_read_var_value */
> >    NULL,				/* Language specific skip_trampoline */
> >    NULL,                    	/* name_of_this */
> > +  false,			/* la_store_sym_names_in_linkage_form_p */
> >    cp_lookup_symbol_nonlocal,	/* lookup_symbol_nonlocal */
> >    basic_lookup_transparent_type,/* lookup_transparent_type */
> >  
> > diff --git a/gdb/go-lang.c b/gdb/go-lang.c
> > index 022b8de..e9cba77 100644
> > --- a/gdb/go-lang.c
> > +++ b/gdb/go-lang.c
> > @@ -590,6 +590,7 @@ extern const struct language_defn go_language_defn =
> >    default_read_var_value,	/* la_read_var_value */
> >    NULL,				/* Language specific skip_trampoline.  */
> >    NULL,				/* name_of_this */
> > +  false,			/* la_store_sym_names_in_linkage_form_p */
> >    basic_lookup_symbol_nonlocal, 
> >    basic_lookup_transparent_type,
> >    go_demangle,			/* Language specific symbol demangler.  */
> > diff --git a/gdb/language.c b/gdb/language.c
> > index 0d8604b..22199e0 100644
> > --- a/gdb/language.c
> > +++ b/gdb/language.c
> > @@ -864,6 +864,7 @@ const struct language_defn unknown_language_defn =
> >    default_read_var_value,	/* la_read_var_value */
> >    unk_lang_trampoline,		/* Language specific skip_trampoline */
> >    "this",        	    	/* name_of_this */
> > +  true,				/* store_sym_names_in_linkage_form_p */
> >    basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */
> >    basic_lookup_transparent_type,/* lookup_transparent_type */
> >    unk_lang_demangle,		/* Language specific symbol demangler */
> > @@ -915,6 +916,7 @@ const struct language_defn auto_language_defn =
> >    default_read_var_value,	/* la_read_var_value */
> >    unk_lang_trampoline,		/* Language specific skip_trampoline */
> >    "this",		        /* name_of_this */
> > +  false,			/* store_sym_names_in_linkage_form_p */
> >    basic_lookup_symbol_nonlocal,	/* lookup_symbol_nonlocal */
> >    basic_lookup_transparent_type,/* lookup_transparent_type */
> >    unk_lang_demangle,		/* Language specific symbol demangler */
> > diff --git a/gdb/language.h b/gdb/language.h
> > index 06b42ae..029de4a 100644
> > --- a/gdb/language.h
> > +++ b/gdb/language.h
> > @@ -264,6 +264,26 @@ struct language_defn
> >  
> >      const char *la_name_of_this;
> >  
> > +    /* True if the symbols names should be stored in GDB's data structures
> > +       for minimal/partial/full symbols using their linkage (aka mangled)
> > +       form; false if the symbol names should be demangled first.
> > +
> > +       Most languages implement symbol lookup by comparing the demangled
> > +       names, in which case it is advantageous to store that information
> > +       already demangled, and so would set this field to false.
> > +
> > +       On the other hand, some languages have opted for doing symbol
> > +       lookups by comparing mangled names instead, for reasons usually
> > +       specific to the language.  Those languages should set this field
> > +       to true.
> > +
> > +       And finally, other languages such as C or Asm do not have
> > +       the concept of mangled vs demangled name, so those languages
> > +       should set this field to true as well, to prevent any accidental
> > +       demangling through an unrelated language's demangler.  */
> > +
> > +    const bool la_store_sym_names_in_linkage_form_p;
> > +
> >      /* This is a function that lookup_symbol will call when it gets to
> >         the part of symbol lookup where C looks up static and global
> >         variables.  */
> > diff --git a/gdb/m2-lang.c b/gdb/m2-lang.c
> > index 11ccab3..6e6434b 100644
> > --- a/gdb/m2-lang.c
> > +++ b/gdb/m2-lang.c
> > @@ -377,6 +377,7 @@ extern const struct language_defn m2_language_defn =
> >    default_read_var_value,	/* la_read_var_value */
> >    NULL,				/* Language specific skip_trampoline */
> >    NULL,		                /* name_of_this */
> > +  false,			/* la_store_sym_names_in_linkage_form_p */
> >    basic_lookup_symbol_nonlocal,	/* lookup_symbol_nonlocal */
> >    basic_lookup_transparent_type,/* lookup_transparent_type */
> >    NULL,				/* Language specific symbol demangler */
> > diff --git a/gdb/objc-lang.c b/gdb/objc-lang.c
> > index c714ec3..4f7dc36 100644
> > --- a/gdb/objc-lang.c
> > +++ b/gdb/objc-lang.c
> > @@ -389,6 +389,7 @@ extern const struct language_defn objc_language_defn = {
> >    default_read_var_value,	/* la_read_var_value */
> >    objc_skip_trampoline, 	/* Language specific skip_trampoline */
> >    "self",		        /* name_of_this */
> > +  false,			/* la_store_sym_names_in_linkage_form_p */
> >    basic_lookup_symbol_nonlocal,	/* lookup_symbol_nonlocal */
> >    basic_lookup_transparent_type,/* lookup_transparent_type */
> >    objc_demangle,		/* Language specific symbol demangler */
> > diff --git a/gdb/opencl-lang.c b/gdb/opencl-lang.c
> > index 268c3c5..9c5b90c 100644
> > --- a/gdb/opencl-lang.c
> > +++ b/gdb/opencl-lang.c
> > @@ -1065,6 +1065,7 @@ extern const struct language_defn opencl_language_defn =
> >    default_read_var_value,	/* la_read_var_value */
> >    NULL,				/* Language specific skip_trampoline */
> >    NULL,                         /* name_of_this */
> > +  false,			/* la_store_sym_names_in_linkage_form_p */
> >    basic_lookup_symbol_nonlocal,	/* lookup_symbol_nonlocal */
> >    basic_lookup_transparent_type,/* lookup_transparent_type */
> >    NULL,				/* Language specific symbol demangler */
> > diff --git a/gdb/p-lang.c b/gdb/p-lang.c
> > index 03db2df..3ff7f56 100644
> > --- a/gdb/p-lang.c
> > +++ b/gdb/p-lang.c
> > @@ -439,6 +439,7 @@ extern const struct language_defn pascal_language_defn =
> >    default_read_var_value,	/* la_read_var_value */
> >    NULL,				/* Language specific skip_trampoline */
> >    "this",		        /* name_of_this */
> > +  false,			/* la_store_sym_names_in_linkage_form_p */
> >    basic_lookup_symbol_nonlocal,	/* lookup_symbol_nonlocal */
> >    basic_lookup_transparent_type,/* lookup_transparent_type */
> >    NULL,				/* Language specific symbol demangler */
> > diff --git a/gdb/rust-lang.c b/gdb/rust-lang.c
> > index 5ff80b2..2d7c1f7 100644
> > --- a/gdb/rust-lang.c
> > +++ b/gdb/rust-lang.c
> > @@ -2290,6 +2290,7 @@ extern const struct language_defn rust_language_defn =
> >    default_read_var_value,	/* la_read_var_value */
> >    NULL,				/* Language specific skip_trampoline */
> >    NULL,				/* name_of_this */
> > +  false,			/* la_store_sym_names_in_linkage_form_p */
> >    rust_lookup_symbol_nonlocal,	/* lookup_symbol_nonlocal */
> >    basic_lookup_transparent_type,/* lookup_transparent_type */
> >    gdb_demangle,			/* Language specific symbol demangler */
> > diff --git a/gdb/testsuite/gdb.ada/maint_with_ada.exp b/gdb/testsuite/gdb.ada/maint_with_ada.exp
> > index 73da613..9ede035 100644
> > --- a/gdb/testsuite/gdb.ada/maint_with_ada.exp
> > +++ b/gdb/testsuite/gdb.ada/maint_with_ada.exp
> > @@ -32,7 +32,6 @@ gdb_breakpoint "adainit"
> >  gdb_breakpoint "Var_Arr_Typedef"
> >  gdb_breakpoint "Do_Nothing"
> >  
> > -setup_kfail gdb/22670 "*-*-*"
> >  gdb_test_no_output "maintenance check-psymtabs"
> >  
> >  gdb_test_no_output "maintenance check-symtabs"
> > diff --git a/gdb/testsuite/gdb.ada/notcplusplus.exp b/gdb/testsuite/gdb.ada/notcplusplus.exp
> > new file mode 100644
> > index 0000000..b2a24e8
> > --- /dev/null
> > +++ b/gdb/testsuite/gdb.ada/notcplusplus.exp
> > @@ -0,0 +1,45 @@
> > +# Copyright 2018 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 "ada.exp"
> > +
> > +if { [skip_ada_tests] } { return -1 }
> > +
> > +standard_ada_testfile foo
> > +
> > +if {[gdb_compile_ada "${srcfile}" "${binfile}" executable {debug}] != ""} {
> > +    return -1
> > +}
> > +
> > +clean_restart ${testfile}
> > +
> > +gdb_test "print /x <symada__cS>" \
> > +         "= \\(a => 0x60287af\\)" \
> > +         "print <symada__cS> before loading symbols from ver.ads"
> > +
> > +# Force the partial symbosl from ver.ads to be expanded into full symbols.
> > +
> > +gdb_test \
> > +     "list ver.ads:16" \
> > +     [multi_line ".*" \
> > +                 "16\\s+package Ver is" \
> > +                 "17\\s+type Wrapper is record" \
> > +                 "18\\s+A : Integer;" \
> > +                 "19\\s+end record;" \
> > +                 "20\\s+u00045 : constant Wrapper := \\(A => 16#060287af#\\);"]
> > +
> > +gdb_test "print /x <symada__cS>" \
> > +         "= \\(a => 0x60287af\\)" \
> > +         "print <symada__cS> after loading symbols from ver.ads"
> > diff --git a/gdb/testsuite/gdb.ada/notcplusplus/foo.adb b/gdb/testsuite/gdb.ada/notcplusplus/foo.adb
> > new file mode 100644
> > index 0000000..89e42f9
> > --- /dev/null
> > +++ b/gdb/testsuite/gdb.ada/notcplusplus/foo.adb
> > @@ -0,0 +1,21 @@
> > +--  Copyright 2018 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/>.
> > +
> > +with Pck; use Pck;
> > +with Ver; use Ver;
> > +procedure Foo is
> > +begin
> > +   Do_Nothing (u00045'Address);
> > +end Foo;
> > diff --git a/gdb/testsuite/gdb.ada/notcplusplus/pck.adb b/gdb/testsuite/gdb.ada/notcplusplus/pck.adb
> > new file mode 100644
> > index 0000000..dcfb306
> > --- /dev/null
> > +++ b/gdb/testsuite/gdb.ada/notcplusplus/pck.adb
> > @@ -0,0 +1,21 @@
> > +--  Copyright 2018 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/>.
> > +
> > +package body Pck is
> > +   procedure Do_Nothing (A : System.Address) is
> > +   begin
> > +      null;
> > +   end Do_Nothing;
> > +end Pck;
> > diff --git a/gdb/testsuite/gdb.ada/notcplusplus/pck.ads b/gdb/testsuite/gdb.ada/notcplusplus/pck.ads
> > new file mode 100644
> > index 0000000..33e369e
> > --- /dev/null
> > +++ b/gdb/testsuite/gdb.ada/notcplusplus/pck.ads
> > @@ -0,0 +1,19 @@
> > +--  Copyright 2018 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/>.
> > +
> > +with System;
> > +package Pck is
> > +   procedure Do_Nothing (A : System.Address);
> > +end Pck;
> > diff --git a/gdb/testsuite/gdb.ada/notcplusplus/ver.ads b/gdb/testsuite/gdb.ada/notcplusplus/ver.ads
> > new file mode 100644
> > index 0000000..8f264d0
> > --- /dev/null
> > +++ b/gdb/testsuite/gdb.ada/notcplusplus/ver.ads
> > @@ -0,0 +1,22 @@
> > +--  Copyright 2018 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/>.
> > +
> > +package Ver is
> > +   type Wrapper is record
> > +      A : Integer;
> > +   end record;
> > +   u00045 : constant Wrapper := (A => 16#060287af#);
> > +   pragma Export (C, u00045, "symada__cS");
> > +end Ver;
> > diff --git a/gdb/testsuite/gdb.base/c-linkage-name.c b/gdb/testsuite/gdb.base/c-linkage-name.c
> > new file mode 100644
> > index 0000000..925004c
> > --- /dev/null
> > +++ b/gdb/testsuite/gdb.base/c-linkage-name.c
> > @@ -0,0 +1,44 @@
> > +/* This testcase is part of GDB, the GNU debugger.
> > +
> > +   Copyright 2018 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/>.  */
> > +
> > +struct wrapper
> > +{
> > +  int a;
> > +};
> > +
> > +/* Create a global variable whose name in the assembly code
> > +   (aka the "linkage name") is different from the name in
> > +   the source code.  The goal is to create a symbol described
> > +   in DWARF using a DW_AT_linkage_name attribute, with a name
> > +   which follows the C++ mangling.
> > +
> > +   In this particular case, we chose "symada__cS" which, if it were
> > +   demangled, would translate to "symada (char, signed)".  */
> > +struct wrapper mundane asm ("symada__cS") = {0x060287af};
> > +
> > +void
> > +do_something (struct wrapper *w)
> > +{
> > +  w->a++;
> > +}
> > +
> > +int
> > +main (void)
> > +{
> > +  do_something (&mundane);
> > +  return 0;
> > +}
> > diff --git a/gdb/testsuite/gdb.base/c-linkage-name.exp b/gdb/testsuite/gdb.base/c-linkage-name.exp
> > new file mode 100644
> > index 0000000..c80a530
> > --- /dev/null
> > +++ b/gdb/testsuite/gdb.base/c-linkage-name.exp
> > @@ -0,0 +1,47 @@
> > +# Copyright 2018 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/>.
> > +
> > +# This file is part of the gdb testsuite.  It is intended to test that
> > +# gdb can correctly print arrays with indexes for each element of the
> > +# array.
> > +
> > +standard_testfile .c
> > +
> > +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
> > +    untested "failed to compile"
> > +    return -1
> > +}
> > +
> > +clean_restart ${binfile}
> > +
> > +# Try to print MUNDANE, but using its linkage name.
> > +
> > +gdb_test "print symada__cS" \
> > +         " = {a = 100829103}" \
> > +         "print symada__cS before partial symtab expansion"
> > +
> > +# Force the symbols to be expanded for the unit that contains
> > +# our symada__cS symbol by, e.g. inserting a breakpoint on one
> > +# of the founction also provided by the same using.
> > +
> > +gdb_test "break main" \
> > +         "Breakpoint $decimal at $hex: file .*$srcfile, line $decimal\\."
> > +
> > +# Try to print MUNDANE using its linkage name again, after partial
> > +# symtab expansion.
> > +
> > +gdb_test "print symada__cS" \
> > +         " = {a = 100829103}" \
> > +         "print symada__cS after partial symtab expansion"
> > -- 
> > 2.1.4
> > 
> 
> 
> -- 
> Joel

-- 
Joel



More information about the Gdb-patches mailing list