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")
Joel Brobecker
brobecker@adacore.com
Wed Feb 21 03:02:00 GMT 2018
> > 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
More information about the Gdb-patches
mailing list