public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: "Natarajan, Kavitha" <Kavitha.Natarajan@amd.com>
To: Bruno Larsen <blarsen@redhat.com>,
	"Natarajan, Kavitha via Gdb-patches" <gdb-patches@sourceware.org>
Cc: "George, Jini Susan" <JiniSusan.George@amd.com>,
	"Parasuraman, Hariharan" <Hariharan.Parasuraman@amd.com>
Subject: RE: [PATCH] Debug support for global alias variable
Date: Tue, 5 Apr 2022 06:26:30 +0000	[thread overview]
Message-ID: <DM4PR12MB57962F282DA7F106C55609B1F7E49@DM4PR12MB5796.namprd12.prod.outlook.com> (raw)
In-Reply-To: <DM4PR12MB57969D23A55E9423C120064AF71F9@DM4PR12MB5796.namprd12.prod.outlook.com>

[AMD Official Use Only]

Hi Bruno,

Can you please review the changes that you suggested?

It would be much appreciated if you or someone from gdb community approve the patch
if everything is fine. It will help in progressing the clang patch that generate these debug
information for alias variable.

Thanks,
Kavitha

> -----Original Message-----
> From: Natarajan, Kavitha
> Sent: Wednesday, March 30, 2022 5:56 PM
> To: 'Bruno Larsen' <blarsen@redhat.com>; 'Natarajan, Kavitha via Gdb-
> patches' <gdb-patches@sourceware.org>
> Cc: George, Jini Susan <JiniSusan.George@amd.com>; Parasuraman,
> Hariharan <Hariharan.Parasuraman@amd.com>
> Subject: RE: [PATCH] Debug support for global alias variable
>
> Sorry, I missed to send the new patch. Please find it below:
>
> ---------------------------------------------------------------------
> When clang emits the dwarf information of global alias variable as
> DW_TAG_imported_declaration, gdb does not handle it. GDB reads this tag
> as C++/fortran imported declaration (type alias, namespace alias and fortran
> module). Added support to handle this tag as alias variable.
>
> This change fixes the failure in gdb.base/symbol-alias.exp testcase.
> This testcase is also updated to test nested (recursive) alias.
> ---
>  gdb/dwarf2/read.c                       | 75 +++++++++++++++++--------
>  gdb/testsuite/gdb.base/symbol-alias.exp | 63 ++++++++++++++++++++-
> gdb/testsuite/gdb.base/symbol-alias2.c  | 16 ++++++
>  3 files changed, 128 insertions(+), 26 deletions(-)
>
> diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index
> f9c942d91d3..12d66378f79 100644
> --- a/gdb/dwarf2/read.c
> +++ b/gdb/dwarf2/read.c
> @@ -1132,6 +1132,10 @@ static void add_partial_subprogram (struct
> partial_die_info *pdi,
>                                   CORE_ADDR *lowpc, CORE_ADDR *highpc,
>                                   int need_pc, struct dwarf2_cu *cu);
>
> +static void var_decode_location (struct attribute *attr,
> +                              struct symbol *sym,
> +                              struct dwarf2_cu *cu);
> +
>  static unsigned int peek_abbrev_code (bfd *, const gdb_byte *);
>
>  static struct partial_die_info *load_partial_dies @@ -1332,7 +1336,7 @@
> static struct using_direct **using_directives (struct dwarf2_cu *cu);
>
>  static void read_import_statement (struct die_info *die, struct dwarf2_cu
> *);
>
> -static int read_namespace_alias (struct die_info *die, struct dwarf2_cu *cu);
> +static bool read_alias (struct die_info *die, struct dwarf2_cu *cu);
>
>  static struct type *read_module_type (struct die_info *die,
>                                     struct dwarf2_cu *cu);
> @@ -9741,10 +9745,14 @@ process_die (struct die_info *die, struct
> dwarf2_cu *cu)
>        read_module (die, cu);
>        break;
>      case DW_TAG_imported_declaration:
> +      /* If the imported declaration is for global variable alias,
> +         this flag is set to false in read_alias function.  */
>        cu->processing_has_namespace_info = true;
> -      if (read_namespace_alias (die, cu))
> +      if (((cu->per_cu->lang == language_c)
> +        || (cu->per_cu->lang == language_cplus))
> +       && read_alias (die, cu))
>       break;
> -      /* The declaration is not a global namespace alias.  */
> +      /* The declaration is not a global namespace or variable alias.
> + */
>        /* Fall through.  */
>      case DW_TAG_imported_module:
>        cu->processing_has_namespace_info = true; @@ -10212,18 +10220,21
> @@ dwarf2_physname (const char *name, struct die_info *die, struct
> dwarf2_cu *cu)
>    return retval;
>  }
>
> -/* Inspect DIE in CU for a namespace alias.  If one exists, record
> -   a new symbol for it.
> +#define MAX_NESTED_IMPORTED_DECLARATIONS 100
>
> -   Returns 1 if a namespace alias was recorded, 0 otherwise.  */
> +/* Inspect DIE in CU for a namespace alias or a variable
> +   with alias attribute. If one exists, record a new symbol
> +   for it.
>
> -static int
> -read_namespace_alias (struct die_info *die, struct dwarf2_cu *cu)
> +   Returns "true" if an alias was recorded, "false" otherwise.  */
> +
> +static bool
> +read_alias (struct die_info *die, struct dwarf2_cu *cu)
>  {
>    struct attribute *attr;
>
> -  /* If the die does not have a name, this is not a namespace
> -     alias.  */
> +  /* If the die does not have a name, this is not a namespace alias
> +     or variable alias.  */
>    attr = dwarf2_attr (die, DW_AT_name, cu);
>    if (attr != NULL)
>      {
> @@ -10232,13 +10243,12 @@ read_namespace_alias (struct die_info *die,
> struct dwarf2_cu *cu)
>        struct dwarf2_cu *imported_cu = cu;
>
>        /* If the compiler has nested DW_AT_imported_declaration DIEs,
> -      keep inspecting DIEs until we hit the underlying import.  */
> -#define MAX_NESTED_IMPORTED_DECLARATIONS 100
> +         keep inspecting DIEs until we hit the underlying import.  */
>        for (num = 0; num  < MAX_NESTED_IMPORTED_DECLARATIONS; ++num)
>       {
>         attr = dwarf2_attr (d, DW_AT_import, cu);
>         if (attr == NULL)
> -         break;
> +         return false;
>
>         d = follow_die_ref (d, attr, &imported_cu);
>         if (d->tag != DW_TAG_imported_declaration) @@ -10249,26
> +10259,43 @@ read_namespace_alias (struct die_info *die, struct dwarf2_cu
> *cu)
>       {
>         complaint (_("DIE at %s has too many recursively imported "
>                      "declarations"), sect_offset_str (d->sect_off));
> -       return 0;
> +       return false;
>       }
>
>        if (attr != NULL)
>       {
>         struct type *type;
> -       sect_offset sect_off = attr->get_ref_die_offset ();
> -
> -       type = get_die_type_at_offset (sect_off, cu->per_cu, cu-
> >per_objfile);
> -       if (type != NULL && type->code () == TYPE_CODE_NAMESPACE)
> +       if (d->tag == DW_TAG_variable)
>           {
> -           /* This declaration is a global namespace alias.  Add
> -              a symbol for it whose type is the aliased namespace.  */
> -           new_symbol (die, type, cu);
> -           return 1;
> +           /* This declaration is a global variable alias. Add
> +              a symbol for it whose type is same as aliased variable.  */
> +           type = die_type (d, imported_cu);
> +           struct symbol *sym = new_symbol (die, type, cu);
> +           attr = dwarf2_attr (d, DW_AT_location, imported_cu);
> +           sym->set_aclass_index (LOC_UNRESOLVED);
> +           if (attr != nullptr)
> +             {
> +               var_decode_location (attr, sym, cu);
> +             }
> +           /* Reset the flag as it is not a namespace alias.  */
> +           cu->processing_has_namespace_info = false;
> +           return true;
> +         }
> +       else
> +         {
> +           sect_offset sect_off = attr->get_ref_die_offset ();
> +           type = get_die_type_at_offset (sect_off, cu->per_cu, cu-
> >per_objfile);
> +           if (type != NULL && type->code () == TYPE_CODE_NAMESPACE)
> +             {
> +               /* This declaration is a global namespace alias. Add
> +                  a symbol for it whose type is the aliased namespace.  */
> +               new_symbol (die, type, cu);
> +               return true;
> +             }
>           }
>       }
>      }
> -
> -  return 0;
> +  return false;
>  }
>
>  /* Return the using directives repository (global or local?) to use in the diff --
> git a/gdb/testsuite/gdb.base/symbol-alias.exp
> b/gdb/testsuite/gdb.base/symbol-alias.exp
> index 2b53cc31053..a9487b25f4d 100644
> --- a/gdb/testsuite/gdb.base/symbol-alias.exp
> +++ b/gdb/testsuite/gdb.base/symbol-alias.exp
> @@ -15,6 +15,9 @@
>  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
>
>  standard_testfile symbol-alias.c symbol-alias2.c
> +set using_clang [test_compiler_info clang-*] set old_clang [expr
> +[test_compiler_info {clang-1[0-3]-*-*}] \
> +              || [test_compiler_info {clang-[1-9]-*}]]
>
>  if { [prepare_for_testing "failed to prepare" ${testfile} [list $srcfile $srcfile2]]
> } {
>      return -1
> @@ -31,6 +34,62 @@ foreach f {"func" "func_alias"} {  }
>
>  # Variables.
> -foreach v {"g_var_s" "g_var_s_alias"} {
> -    gdb_test "p $v" "= {field1 = 1, field2 = 2}"
> +gdb_test "p g_var_s" "= {field1 = 1, field2 = 2}"
> +foreach v {"g_var_s_alias" "g_var_s_alias2"} {
> +    gdb_test_multiple "p $v" "p $v" {
> +     -re  " = {field1 = 1, field2 = 2}.*$gdb_prompt $" {
> +         pass "print alias of variable $v"
> +     }
> +     -re  ".*has unknown type; cast it to its declared type.*$gdb_prompt
> $" {
> +         if { $old_clang } {
> +             xfail "print alias variable $v"
> +         } else {
> +             fail "print alias variable $v"
> +         }
> +     }
> +    }
> +}
> +
> +# Static Variable.
> +gdb_test "p g_var" " = 1"
> +gdb_test_multiple "p g_var_alias" "p g_var_alias" {
> +    -re  " = 1.*$gdb_prompt $" {
> +     pass "print alias of static variable"
> +    }
> +    -re  ".*has unknown type; cast it to its declared type.*$gdb_prompt $" {
> +     if { $old_clang } {
> +       xfail "print alias of static variable"
> +     } else {
> +       fail "print alias of static variable"
> +     }
> +    }
> +}
> +
> +# Deferred Variable.
> +gdb_test "p g_def_var" " = 2"
> +gdb_test_multiple "p g_def_var_alias" "p g_def_var_alias" {
> +    -re  " = 2.*$gdb_prompt $" {
> +     pass "print alias of deferred variable"
> +    }
> +    -re  ".*has unknown type; cast it to its declared type.*$gdb_prompt $" {
> +     if { $using_clang } {
> +       xfail "print alias of deferred variable"
> +     } else {
> +       fail "print alias of deferred variable"
> +     }
> +    }
> +}
> +
> +# Alias of deferred Variable alias.
> +gdb_test_multiple "p g_def_var2_alias2" "p g_def_var2_alias2" {
> +    -re  " = 3.*$gdb_prompt $" {
> +     pass "print alias of alias of deferred variable"
> +    }
> +    -re  ".*has unknown type; cast it to its declared type.*$gdb_prompt $" {
> +     if { $old_clang } {
> +       xfail "print alias of alias of deferred variable"
> +     } else {
> +       fail "print alias of alias of deferred variable"
> +     }
> +    }
>  }
> diff --git a/gdb/testsuite/gdb.base/symbol-alias2.c
> b/gdb/testsuite/gdb.base/symbol-alias2.c
> index 34f4e121e25..41d4b6a53e5 100644
> --- a/gdb/testsuite/gdb.base/symbol-alias2.c
> +++ b/gdb/testsuite/gdb.base/symbol-alias2.c
> @@ -23,6 +23,8 @@ struct S
>
>  struct S g_var_s = { 1, 2 };
>
> +static int g_var = 1;
> +
>  #ifdef __cplusplus
>  /* So that the alias attribute below work without having to figure out
>     this function's mangled name.  */
> @@ -38,3 +40,17 @@ func (void)
>  struct S *func_alias (void) __attribute__ ((alias ("func")));
>
>  extern struct S g_var_s_alias __attribute__ ((alias ("g_var_s")));
> +
> +extern struct S g_var_s_alias2 __attribute__ ((alias
> +("g_var_s_alias")));
> +
> +extern int g_var_alias __attribute__ ((alias ("g_var")));
> +
> +extern int g_def_var_alias __attribute__ ((alias ("g_def_var")));
> +
> +int g_def_var = 2;
> +
> +extern int g_def_var2_alias __attribute__ ((alias ("g_def_var2")));
> +
> +int g_def_var2 = 3;
> +
> +extern int g_def_var2_alias2 __attribute__ ((alias
> +("g_def_var2_alias")));
> --
>
> Regards,
> Kavitha

  reply	other threads:[~2022-04-05  6:26 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-03-04 13:44 Natarajan, Kavitha
2022-03-14 11:15 ` Natarajan, Kavitha
2022-03-24  6:36   ` Natarajan, Kavitha
2022-03-24 13:53 ` Bruno Larsen
2022-03-28 15:14   ` Natarajan, Kavitha
2022-03-29 14:02     ` Bruno Larsen
2022-03-30 11:30       ` Natarajan, Kavitha
2022-03-30 12:25         ` Natarajan, Kavitha
2022-04-05  6:26           ` Natarajan, Kavitha [this message]
2022-04-05 13:33           ` Bruno Larsen
2022-04-05 14:02             ` Natarajan, Kavitha
2022-04-12  8:38             ` Natarajan, Kavitha
2022-04-15 16:06           ` Tom Tromey
2022-04-18 11:04             ` Natarajan, Kavitha
2022-04-18 15:03               ` Tom Tromey
2022-04-19 12:45                 ` Natarajan, Kavitha
2022-04-19 22:59                   ` Tom Tromey
2022-04-20  6:00                     ` Natarajan, Kavitha
2022-04-20 10:33                       ` Pedro Alves
2022-04-20 12:17                         ` Natarajan, Kavitha
2022-04-25 13:10                           ` Natarajan, Kavitha
2022-05-05  9:53                           ` Natarajan, Kavitha
2022-06-07  9:08                           ` Natarajan, Kavitha
2022-06-08 16:29                             ` Pedro Alves
2022-06-09 11:36                               ` Pedro Alves
2022-06-13 11:11                                 ` Natarajan, Kavitha
2022-06-13 13:54                                   ` Pedro Alves
2022-06-13 17:28                                     ` Natarajan, Kavitha

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=DM4PR12MB57962F282DA7F106C55609B1F7E49@DM4PR12MB5796.namprd12.prod.outlook.com \
    --to=kavitha.natarajan@amd.com \
    --cc=Hariharan.Parasuraman@amd.com \
    --cc=JiniSusan.George@amd.com \
    --cc=blarsen@redhat.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).