public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: Joel Brobecker <brobecker@adacore.com>
To: gdb-patches@sourceware.org
Subject: PING: [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")
Date: Wed, 21 Feb 2018 03:02:00 -0000	[thread overview]
Message-ID: <20180221030210.xzthyal2cysn5s72@adacore.com> (raw)
In-Reply-To: <20180209090919.lmwjll72hccopjsk@adacore.com>

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

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

  reply	other threads:[~2018-02-21  3:02 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-12-13 10:37 [RFC] regresssion(internal-error) printing subprogram argument Joel Brobecker
2017-12-14 19:02 ` Pedro Alves
2017-12-14 19:41   ` Pedro Alves
2017-12-15  9:48     ` Joel Brobecker
2017-12-15 11:02       ` Pedro Alves
2017-12-15 18:57         ` Pedro Alves
2018-01-03  4:33           ` Joel Brobecker
2018-01-04  9:48             ` Joel Brobecker
2018-01-04 12:39               ` Pedro Alves
2018-01-05 16:28             ` Pedro Alves
2018-01-16 11:54               ` Pedro Alves
2018-01-17  9:13                 ` Joel Brobecker
2018-01-26  3:51                   ` Joel Brobecker
2018-01-26 11:28                     ` Pedro Alves
2018-01-29 10:38                       ` Joel Brobecker
2018-01-29 15:33                         ` Pedro Alves
2018-01-29 15:52                           ` Joel Brobecker
2018-01-30  3:56                           ` Joel Brobecker
2018-02-05  9:57                             ` Joel Brobecker
2018-02-09  9:09                               ` [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
2018-02-21  3:02                                 ` Joel Brobecker [this message]
2018-03-19 21:22                                   ` PING^2: " Joel Brobecker
2018-03-26 14:26                                     ` PING^2: [RFA/RFC] fix PR gdb/22670 (pb looking up some symbols when they have a linkage name) Pedro Alves
2018-03-27 14:02                                       ` Joel Brobecker
2018-01-26  4:50                   ` [RFC] regresssion(internal-error) printing subprogram argument Joel Brobecker
2017-12-15 18:31       ` Pedro Alves
2017-12-15  7:54   ` Joel Brobecker

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180221030210.xzthyal2cysn5s72@adacore.com \
    --to=brobecker@adacore.com \
    --cc=gdb-patches@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).