[PATCH] Fix ptype and print commands for namelist variables(a fortran feature)

Kumar N, Bhuvanendra Bhuvanendra.KumarN@amd.com
Thu Oct 7 21:05:08 GMT 2021


[AMD Official Use Only]

Hi Andrew,

Thanks again for your review comments. I have now introduced a new type(TYPE_CODE_NAMELIST) for namelist type as you suggested, could you please review the revised changes. Updated patch is attached and also inlined with this email. There are no regressions found during testing.

thanks,
bhuvan

PATCH inlined:

>From 89b7f847042ccea44633f714db07400fa6dd3617 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E2=80=9Cbhkumarn=E2=80=9D?= <Bhuvanendra.KumarN@amd.com>
Date: Fri, 8 Oct 2021 02:01:18 +0530
Subject: [PATCH] gdb/fortran: Fix ptype and print commands for namelist
 variables.

GCC/gfortran support namelist(a fortran feature), it emits DW_TAG_namelist
and DW_TAG_namelist_item dies. But gdb does not process these dies and
support namelist variables during print and ptype commands. When tried to
print, it bails out with the error message as shown below.
(gdb) print nml
No symbol "nml" in current context.
This commit is to make the print and ptype commands work for namelist
variables and its items. Sample output of these commands is shared below,
with fixed gdb.
(gdb) ptype nml
type = Type nml
    integer(kind=4) :: a
    integer(kind=4) :: b
End Type nml
(gdb) print nml
$1 = ( a = 10, b = 20 )
---
 gdb/dwarf2/read.c                      | 43 ++++++++++++++++++----
 gdb/f-typeprint.c                      |  6 +++-
 gdb/f-valprint.c                       | 11 ++++++
 gdb/gdbtypes.h                         |  2 ++
 gdb/testsuite/gdb.fortran/namelist.exp | 49 ++++++++++++++++++++++++++
 gdb/testsuite/gdb.fortran/namelist.f90 | 27 ++++++++++++++
 include/dwarf2.def                     |  2 +-
 7 files changed, 132 insertions(+), 8 deletions(-)
 create mode 100644 gdb/testsuite/gdb.fortran/namelist.exp
 create mode 100644 gdb/testsuite/gdb.fortran/namelist.f90

diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
index cbd9a3012eb..e6cd8ed48f0 100644
--- a/gdb/dwarf2/read.c
+++ b/gdb/dwarf2/read.c
@@ -9705,6 +9705,7 @@ process_die (struct die_info *die, struct dwarf2_cu *cu)
     case DW_TAG_interface_type:
     case DW_TAG_structure_type:
     case DW_TAG_union_type:
+    case DW_TAG_namelist:
       process_structure_scope (die, cu);
       break;
     case DW_TAG_enumeration_type:
@@ -14562,8 +14563,20 @@ dwarf2_add_field (struct field_info *fip, struct die_info *die,
 
   fp = &new_field->field;
 
-  if (die->tag == DW_TAG_member && ! die_is_declaration (die, cu))
-    {
+  if ((die->tag == DW_TAG_member || die->tag == DW_TAG_namelist_item)
+            && ! die_is_declaration (die, cu))
+    {
+      /* For the DW_TAG_namelist_item die, use the referenced die.  */
+      if (die->tag == DW_TAG_namelist_item)
+        {
+          struct attribute *attr1 = dwarf2_attr (die, DW_AT_namelist_item, cu);
+          struct die_info *item_die = nullptr;
+          struct dwarf2_cu *item_cu = cu;
+          if (attr1->form_is_ref ())
+            item_die = follow_die_ref (die, attr1, &item_cu);
+          if (item_die != nullptr)
+            die = item_die;
+        }
       /* Data member other than a C++ static data member.  */
 
       /* Get type of field.  */
@@ -15621,6 +15634,10 @@ read_structure_type (struct die_info *die, struct dwarf2_cu *cu)
     {
       type->set_code (TYPE_CODE_UNION);
     }
+  else if (die->tag == DW_TAG_namelist)
+    {
+      type->set_code (TYPE_CODE_NAMELIST);
+    }
   else
     {
       type->set_code (TYPE_CODE_STRUCT);
@@ -15823,7 +15840,8 @@ handle_struct_member_die (struct die_info *child_die, struct type *type,
 			  struct dwarf2_cu *cu)
 {
   if (child_die->tag == DW_TAG_member
-      || child_die->tag == DW_TAG_variable)
+      || child_die->tag == DW_TAG_variable
+      || child_die->tag == DW_TAG_namelist_item)
     {
       /* NOTE: carlton/2002-11-05: A C++ static data member
 	 should be a DW_TAG_member that is a declaration, but
@@ -15867,7 +15885,9 @@ handle_struct_member_die (struct die_info *child_die, struct type *type,
 }
 
 /* Finish creating a structure or union type, including filling in
-   its members and creating a symbol for it.  */
+   its members and creating a symbol for it. This function also
+   handles Fortran namelist variable, its items or members and
+   creating a symbol for it.  */
 
 static void
 process_structure_scope (struct die_info *die, struct dwarf2_cu *cu)
@@ -21971,8 +21991,17 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu,
 	case DW_TAG_union_type:
 	case DW_TAG_set_type:
 	case DW_TAG_enumeration_type:
-	  SYMBOL_ACLASS_INDEX (sym) = LOC_TYPEDEF;
-	  SYMBOL_DOMAIN (sym) = STRUCT_DOMAIN;
+	case DW_TAG_namelist:
+	  if (die->tag == DW_TAG_namelist)
+            {
+	      SYMBOL_ACLASS_INDEX (sym) = LOC_STATIC;
+	      SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
+            }
+	  else
+            {
+	      SYMBOL_ACLASS_INDEX (sym) = LOC_TYPEDEF;
+	      SYMBOL_DOMAIN (sym) = STRUCT_DOMAIN;
+            }
 
 	  {
 	    /* NOTE: carlton/2003-11-10: C++ class symbols shouldn't
@@ -22909,6 +22938,7 @@ dwarf2_name (struct die_info *die, struct dwarf2_cu *cu)
       && die->tag != DW_TAG_class_type
       && die->tag != DW_TAG_interface_type
       && die->tag != DW_TAG_structure_type
+      && die->tag != DW_TAG_namelist
       && die->tag != DW_TAG_union_type)
     return NULL;
 
@@ -22933,6 +22963,7 @@ dwarf2_name (struct die_info *die, struct dwarf2_cu *cu)
     case DW_TAG_interface_type:
     case DW_TAG_structure_type:
     case DW_TAG_union_type:
+    case DW_TAG_namelist:
       /* Some GCC versions emit spurious DW_AT_name attributes for unnamed
 	 structures or unions.  These were of the form "._%d" in GCC 4.1,
 	 or simply "<anonymous struct>" or "<anonymous union>" in GCC 4.3
diff --git a/gdb/f-typeprint.c b/gdb/f-typeprint.c
index 1791cb29451..5b34622dacb 100644
--- a/gdb/f-typeprint.c
+++ b/gdb/f-typeprint.c
@@ -121,6 +121,7 @@ f_language::f_type_print_varspec_prefix (struct type *type,
     case TYPE_CODE_UNDEF:
     case TYPE_CODE_STRUCT:
     case TYPE_CODE_UNION:
+    case TYPE_CODE_NAMELIST:
     case TYPE_CODE_ENUM:
     case TYPE_CODE_INT:
     case TYPE_CODE_FLT:
@@ -261,6 +262,7 @@ f_language::f_type_print_varspec_suffix (struct type *type,
     case TYPE_CODE_UNDEF:
     case TYPE_CODE_STRUCT:
     case TYPE_CODE_UNION:
+    case TYPE_CODE_NAMELIST:
     case TYPE_CODE_ENUM:
     case TYPE_CODE_INT:
     case TYPE_CODE_FLT:
@@ -305,7 +307,8 @@ f_language::f_type_print_base (struct type *type, struct ui_file *stream,
       const char *prefix = "";
       if (type->code () == TYPE_CODE_UNION)
 	prefix = "Type, C_Union :: ";
-      else if (type->code () == TYPE_CODE_STRUCT)
+      else if (type->code () == TYPE_CODE_STRUCT
+               || type->code () == TYPE_CODE_NAMELIST)
 	prefix = "Type ";
       fprintf_filtered (stream, "%*s%s%s", level, "", prefix, type->name ());
       return;
@@ -391,6 +394,7 @@ f_language::f_type_print_base (struct type *type, struct ui_file *stream,
 
     case TYPE_CODE_STRUCT:
     case TYPE_CODE_UNION:
+    case TYPE_CODE_NAMELIST:
       if (type->code () == TYPE_CODE_UNION)
 	fprintf_filtered (stream, "%*sType, C_Union :: ", level, "");
       else
diff --git a/gdb/f-valprint.c b/gdb/f-valprint.c
index 27d9a730978..6f80b5a12ff 100644
--- a/gdb/f-valprint.c
+++ b/gdb/f-valprint.c
@@ -295,6 +295,7 @@ f_language::value_print_inner (struct value *val, struct ui_file *stream,
 
     case TYPE_CODE_STRUCT:
     case TYPE_CODE_UNION:
+    case TYPE_CODE_NAMELIST:
       /* Starting from the Fortran 90 standard, Fortran supports derived
 	 types.  */
       fprintf_filtered (stream, "( ");
@@ -320,6 +321,16 @@ f_language::value_print_inner (struct value *val, struct ui_file *stream,
 		  fputs_filtered (" = ", stream);
 		}
 
+	      /* While printing namelist items, fetch the appropriate value
+	         field before printing its value.  */
+	      if (type->code () == TYPE_CODE_NAMELIST)
+	        {
+	          struct block_symbol symni = lookup_symbol (field_name,
+			get_selected_block (0), VAR_DOMAIN, nullptr);
+	          if (symni.symbol != nullptr)
+	            field = value_of_variable (symni.symbol, symni.block);
+	        }
+
 	      common_val_print (field, stream, recurse + 1,
 				options, current_language);
 
diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h
index dc575c42996..ba8a61987db 100644
--- a/gdb/gdbtypes.h
+++ b/gdb/gdbtypes.h
@@ -195,6 +195,8 @@ enum type_code
 
     /* * Fixed Point type.  */
     TYPE_CODE_FIXED_POINT,
+
+    TYPE_CODE_NAMELIST,         /**< Fortran namelist.  */
   };
 
 /* * Some bits for the type's instance_flags word.  See the macros
diff --git a/gdb/testsuite/gdb.fortran/namelist.exp b/gdb/testsuite/gdb.fortran/namelist.exp
new file mode 100644
index 00000000000..90762928455
--- /dev/null
+++ b/gdb/testsuite/gdb.fortran/namelist.exp
@@ -0,0 +1,49 @@
+# Copyright (C) 2021 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 contains tests for fortran
+# namelist.
+
+if { [skip_fortran_tests] } { return -1 }
+
+standard_testfile .f90
+load_lib "fortran.exp"
+
+if {[prepare_for_testing "failed to prepare" $testfile $srcfile {debug f90}]} {
+    return -1
+}
+
+if ![fortran_runto_main] then {
+    perror "couldn't run to main"
+    continue
+}
+
+# Depending on the compiler being used, the type names can be printed differently.
+set int [fortran_int4]
+
+gdb_breakpoint [gdb_get_line_number "Display namelist"]
+gdb_continue_to_breakpoint "Display namelist"
+
+if {[test_compiler_info {gcc-*}]} {
+    gdb_test "ptype nml" \
+        "type = Type nml\r\n *$int :: a\r\n *$int :: b\r\n *End Type nml"
+    gdb_test "print nml" \
+        "\\$\[0-9\]+ = \\( a = 10, b = 20 \\)"
+} else {
+    gdb_test "ptype nml" \
+        "No symbol \"nml\" in current context\\."
+    gdb_test "print nml" \
+        "No symbol \"nml\" in current context\\."
+}
diff --git a/gdb/testsuite/gdb.fortran/namelist.f90 b/gdb/testsuite/gdb.fortran/namelist.f90
new file mode 100644
index 00000000000..fb36690d765
--- /dev/null
+++ b/gdb/testsuite/gdb.fortran/namelist.f90
@@ -0,0 +1,27 @@
+! Copyright (C) 2021 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 the Fortran source file for namelist.exp.
+
+program main
+
+  integer :: a, b
+  namelist /nml/ a, b
+
+  a = 10
+  b = 20
+  Write(*,nml) ! Display namelist
+
+end program main
diff --git a/include/dwarf2.def b/include/dwarf2.def
index 1ae6e1df298..6b8be1f6a16 100644
--- a/include/dwarf2.def
+++ b/include/dwarf2.def
@@ -289,7 +289,7 @@ DW_AT (DW_AT_frame_base, 0x40)
 DW_AT (DW_AT_friend, 0x41)
 DW_AT (DW_AT_identifier_case, 0x42)
 DW_AT (DW_AT_macro_info, 0x43)
-DW_AT (DW_AT_namelist_items, 0x44)
+DW_AT (DW_AT_namelist_item, 0x44)
 DW_AT (DW_AT_priority, 0x45)
 DW_AT (DW_AT_segment, 0x46)
 DW_AT (DW_AT_specification, 0x47)
-- 
2.17.1


-----Original Message-----
From: Andrew Burgess <andrew.burgess@embecosm.com> 
Sent: Wednesday, October 6, 2021 9:22 PM
To: Kumar N, Bhuvanendra <Bhuvanendra.KumarN@amd.com>
Cc: gdb-patches@sourceware.org; George, Jini Susan <JiniSusan.George@amd.com>; Achra, Nitika <Nitika.Achra@amd.com>; Sharma, Alok Kumar <AlokKumar.Sharma@amd.com>; E, Nagajyothi <Nagajyothi.E@amd.com>
Subject: Re: [PATCH] Fix ptype and print commands for namelist variables(a fortran feature)

[CAUTION: External Email]

* Kumar N, Bhuvanendra <Bhuvanendra.KumarN@amd.com> [2021-09-22 12:38:20 +0000]:

> [AMD Official Use Only]
>
> Hi Andrew,
>
> Thanks a lot for your review comments, I have addressed all the review comments and tested. Updated patch is attached and also inlined with this email.
>
> >I'm a little uncomfortable with this if condition.  This feels like a bit of a hack.  Is there precedent anywhere else in GDB for using the type specific field like this?
> >Wouldn't adding a TYPE_CODE_NAMELIST be more in keeping with how GDB currently does things, though I understand this is likely to make the patch slightly bigger.  Did you consider this approach?
>
> Regarding your major comment, I did considered introducing a new type 
> specific field for namelist earlier, instead of using any of those 
> existing. Reason I did not included in my earlier patch was, 
> type_specific_kind is declared with 3 bits in struct main_type and 
> already there were 8 values, hence deferred expanding 
> type_specific_kind etc.... But now I have done that, thanks for the 
> suggestion.

Except that wasn't quite what I suggested; I actually asked whether namelist's should become their own type altogether, notice I suggested TYPE_CODE_NAMELIST.

Though what you have here is nice in its simplicity, but I can't shake the feeling that its not the right solution.

I'll need to think about this some more - maybe others have an opinion?

Thanks,
Andrew





>
> Regards,
> bhuvan
>
> PATH inlined:
>
> From 59053daf1018c3e4bcae8cd342d46b00f4f03648 Mon Sep 17 00:00:00 2001
> From: =?UTF-8?q?=E2=80=9Cbhkumarn=E2=80=9D?= 
> <Bhuvanendra.KumarN@amd.com>
> Date: Wed, 22 Sep 2021 17:52:15 +0530
> Subject: [PATCH] Fix ptype and print commands for namelist variables(a 
> fortran  feature).
>
> GCC/gfortran support namelist(a fortran feature), it emits 
> DW_TAG_namelist and DW_TAG_namelist_item dies. But gdb does not 
> process these dies and support namelist variables during print and 
> ptype commands. When tried to print, it bails out with the error message as shown below.
> (gdb) print nml
> No symbol "nml" in current context.
> This commit is to make the print and ptype commands work for namelist 
> variables and its items. Sample output of these commands is shared 
> below, with fixed gdb.
> (gdb) ptype nml
> type = Type nml
>     integer(kind=4) :: a
>     integer(kind=4) :: b
> End Type nml
> (gdb) print nml
> $1 = ( a = 10, b = 20 )
> ---
>  gdb/ChangeLog                          | 11 ++++++
>  gdb/dwarf2/read.c                      | 44 +++++++++++++++++++----
>  gdb/f-valprint.c                       | 10 ++++++
>  gdb/gdbtypes.h                         |  3 +-
>  gdb/testsuite/ChangeLog                |  5 +++
>  gdb/testsuite/gdb.fortran/namelist.exp | 49 
> ++++++++++++++++++++++++++
>  gdb/testsuite/gdb.fortran/namelist.f90 | 27 ++++++++++++++
>  include/dwarf2.def                     |  2 +-
>  8 files changed, 142 insertions(+), 9 deletions(-)  create mode 
> 100644 gdb/testsuite/gdb.fortran/namelist.exp
>  create mode 100644 gdb/testsuite/gdb.fortran/namelist.f90
>
> diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 
> 36cb4c9e7e9..ec01c2957e9 100644
> --- a/gdb/ChangeLog
> +++ b/gdb/ChangeLog
> @@ -1,3 +1,14 @@
> +2021-08-23  Bhuvanendra Kumar N  <Bhuvanendra.KumarN@amd.com>
> +
> +     * dwarf2/read.c (process_die): Add new case for namelist.
> +     (dwarf2_add_field): Process DW_TAG_namelist_item die.
> +     (read_structure_type, handle_struct_member_die, new_symbol)
> +     (dwarf2_name): Update.
> +     * f-valprint.c (f_language::value_print_inner): Add support for
> +     printing namelist items.
> +     * include/dwarf2.def: (DW_AT_namelist_items): Renamed to ...
> +     (DW_AT_namelist_item): ... this. As per dwarf standard.
> +
>  2021-06-08  Lancelot Six  <lsix@lancelotsix.com>
>
>       * python/lib/gdb/FrameDecorator.py (FrameDecorator): Use 'is None'
> diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index 
> 96009f1418f..88db06ec9e7 100644
> --- a/gdb/dwarf2/read.c
> +++ b/gdb/dwarf2/read.c
> @@ -9570,6 +9570,7 @@ process_die (struct die_info *die, struct dwarf2_cu *cu)
>      case DW_TAG_interface_type:
>      case DW_TAG_structure_type:
>      case DW_TAG_union_type:
> +    case DW_TAG_namelist:
>        process_structure_scope (die, cu);
>        break;
>      case DW_TAG_enumeration_type:
> @@ -14417,8 +14418,20 @@ dwarf2_add_field (struct field_info *fip, 
> struct die_info *die,
>
>    fp = &new_field->field;
>
> -  if (die->tag == DW_TAG_member && ! die_is_declaration (die, cu))
> -    {
> +  if ((die->tag == DW_TAG_member || die->tag == DW_TAG_namelist_item)
> +            && ! die_is_declaration (die, cu))
> +    {
> +      /* For the DW_TAG_namelist_item die, use the referenced die.  */
> +      if (die->tag == DW_TAG_namelist_item)
> +        {
> +          struct attribute *attr1 = dwarf2_attr (die, DW_AT_namelist_item, cu);
> +          struct die_info *item_die = nullptr;
> +          struct dwarf2_cu *item_cu = cu;
> +          if (attr1->form_is_ref ())
> +            item_die = follow_die_ref (die, attr1, &item_cu);
> +          if (item_die != nullptr)
> +            die = item_die;
> +        }
>        /* Data member other than a C++ static data member.  */
>
>        /* Get type of field.  */
> @@ -15448,7 +15461,10 @@ read_structure_type (struct die_info *die, struct dwarf2_cu *cu)
>      }
>
>    type = alloc_type (objfile);
> -  INIT_CPLUS_SPECIFIC (type);
> +  if (die->tag == DW_TAG_namelist)
> +    TYPE_SPECIFIC_FIELD (type) = TYPE_SPECIFIC_NAMELIST;  else
> +    INIT_CPLUS_SPECIFIC (type);
>
>    name = dwarf2_name (die, cu);
>    if (name != NULL)
> @@ -15684,7 +15700,8 @@ handle_struct_member_die (struct die_info *child_die, struct type *type,
>                         struct dwarf2_cu *cu)  {
>    if (child_die->tag == DW_TAG_member
> -      || child_die->tag == DW_TAG_variable)
> +      || child_die->tag == DW_TAG_variable
> +      || child_die->tag == DW_TAG_namelist_item)
>      {
>        /* NOTE: carlton/2002-11-05: A C++ static data member
>        should be a DW_TAG_member that is a declaration, but @@ 
> -15728,7 +15745,9 @@ handle_struct_member_die (struct die_info 
> *child_die, struct type *type,  }
>
>  /* Finish creating a structure or union type, including filling in
> -   its members and creating a symbol for it.  */
> +   its members and creating a symbol for it. This function also
> +   handles Fortran namelist variable, its items or members and
> +   creating a symbol for it.  */
>
>  static void
>  process_structure_scope (struct die_info *die, struct dwarf2_cu *cu) 
> @@ -21807,8 +21826,17 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu,
>       case DW_TAG_union_type:
>       case DW_TAG_set_type:
>       case DW_TAG_enumeration_type:
> -       SYMBOL_ACLASS_INDEX (sym) = LOC_TYPEDEF;
> -       SYMBOL_DOMAIN (sym) = STRUCT_DOMAIN;
> +     case DW_TAG_namelist:
> +       if (die->tag == DW_TAG_namelist)
> +            {
> +           SYMBOL_ACLASS_INDEX (sym) = LOC_STATIC;
> +           SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
> +            }
> +       else
> +            {
> +           SYMBOL_ACLASS_INDEX (sym) = LOC_TYPEDEF;
> +           SYMBOL_DOMAIN (sym) = STRUCT_DOMAIN;
> +            }
>
>         {
>           /* NOTE: carlton/2003-11-10: C++ class symbols shouldn't @@ 
> -22744,6 +22772,7 @@ dwarf2_name (struct die_info *die, struct dwarf2_cu *cu)
>        && die->tag != DW_TAG_class_type
>        && die->tag != DW_TAG_interface_type
>        && die->tag != DW_TAG_structure_type
> +      && die->tag != DW_TAG_namelist
>        && die->tag != DW_TAG_union_type)
>      return NULL;
>
> @@ -22768,6 +22797,7 @@ dwarf2_name (struct die_info *die, struct dwarf2_cu *cu)
>      case DW_TAG_interface_type:
>      case DW_TAG_structure_type:
>      case DW_TAG_union_type:
> +    case DW_TAG_namelist:
>        /* Some GCC versions emit spurious DW_AT_name attributes for unnamed
>        structures or unions.  These were of the form "._%d" in GCC 4.1,
>        or simply "<anonymous struct>" or "<anonymous union>" in GCC 
> 4.3 diff --git a/gdb/f-valprint.c b/gdb/f-valprint.c index 
> 240daaf34f9..aa86fbc901e 100644
> --- a/gdb/f-valprint.c
> +++ b/gdb/f-valprint.c
> @@ -320,6 +320,16 @@ f_language::value_print_inner (struct value *val, struct ui_file *stream,
>                 fputs_filtered (" = ", stream);
>               }
>
> +           /* While printing namelist items, fetch the appropriate value
> +              field before printing its value.  */
> +           if (TYPE_SPECIFIC_FIELD (type) == TYPE_SPECIFIC_NAMELIST)
> +             {
> +               struct block_symbol symni = lookup_symbol (field_name,
> +                     get_selected_block (0), VAR_DOMAIN, nullptr);
> +               if (symni.symbol != nullptr)
> +                 field = value_of_variable (symni.symbol, symni.block);
> +             }
> +
>             common_val_print (field, stream, recurse + 1,
>                               options, current_language);
>
> diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h index 
> 0cc00e74a20..124282c3d53 100644
> --- a/gdb/gdbtypes.h
> +++ b/gdb/gdbtypes.h
> @@ -607,6 +607,7 @@ enum type_specific_kind
>    TYPE_SPECIFIC_SELF_TYPE,
>    TYPE_SPECIFIC_INT,
>    TYPE_SPECIFIC_FIXED_POINT,
> +  TYPE_SPECIFIC_NAMELIST,
>  };
>
>  union type_owner
> @@ -833,7 +834,7 @@ struct main_type
>    /* * A discriminant telling us which field of the type_specific
>       union is being used for this type, if any.  */
>
> -  ENUM_BITFIELD(type_specific_kind) type_specific_field : 3;
> +  ENUM_BITFIELD(type_specific_kind) type_specific_field : 4;
>
>    /* * Number of fields described for this type.  This field appears
>       at this location because it packs nicely here.  */ diff --git 
> a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 
> 87cf3e2a061..33f60c29b3c 100644
> --- a/gdb/testsuite/ChangeLog
> +++ b/gdb/testsuite/ChangeLog
> @@ -1,3 +1,8 @@
> +2021-07-26  Bhuvanendra Kumar N  <Bhuvanendra.KumarN@amd.com>
> +
> +     * gdb.fortran/namelist.exp: New file.
> +     * gdb.fortran/namelist.f90: New file.
> +
>  2021-06-10  Bhuvanendra Kumar N  <Bhuvanendra.KumarN@amd.com>
>
>       * gdb.fortran/ptype-on-functions.exp: Add type info of formal 
> diff --git a/gdb/testsuite/gdb.fortran/namelist.exp 
> b/gdb/testsuite/gdb.fortran/namelist.exp
> new file mode 100644
> index 00000000000..90762928455
> --- /dev/null
> +++ b/gdb/testsuite/gdb.fortran/namelist.exp
> @@ -0,0 +1,49 @@
> +# Copyright (C) 2021 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 <https://nam11.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww.gnu.org%2Flicenses%2F&data=04%7C01%7CBhuvanendra.KumarN%40amd.com%7C1b602ae2197248e5a9a008d988e12ef7%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637691323019155507%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&sdata=MOunn7GZCinobEL44IujJYFEaB83wh9TWkuufnnjbQ8%3D&reserved=0>.
> +
> +# This file is part of the gdb testsuite.  It contains tests for 
> +fortran # namelist.
> +
> +if { [skip_fortran_tests] } { return -1 }
> +
> +standard_testfile .f90
> +load_lib "fortran.exp"
> +
> +if {[prepare_for_testing "failed to prepare" $testfile $srcfile {debug f90}]} {
> +    return -1
> +}
> +
> +if ![fortran_runto_main] then {
> +    perror "couldn't run to main"
> +    continue
> +}
> +
> +# Depending on the compiler being used, the type names can be printed differently.
> +set int [fortran_int4]
> +
> +gdb_breakpoint [gdb_get_line_number "Display namelist"] 
> +gdb_continue_to_breakpoint "Display namelist"
> +
> +if {[test_compiler_info {gcc-*}]} {
> +    gdb_test "ptype nml" \
> +        "type = Type nml\r\n *$int :: a\r\n *$int :: b\r\n *End Type nml"
> +    gdb_test "print nml" \
> +        "\\$\[0-9\]+ = \\( a = 10, b = 20 \\)"
> +} else {
> +    gdb_test "ptype nml" \
> +        "No symbol \"nml\" in current context\\."
> +    gdb_test "print nml" \
> +        "No symbol \"nml\" in current context\\."
> +}
> diff --git a/gdb/testsuite/gdb.fortran/namelist.f90 
> b/gdb/testsuite/gdb.fortran/namelist.f90
> new file mode 100644
> index 00000000000..fb36690d765
> --- /dev/null
> +++ b/gdb/testsuite/gdb.fortran/namelist.f90
> @@ -0,0 +1,27 @@
> +! Copyright (C) 2021 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 <https://nam11.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww.gnu.org%2Flicenses%2F&data=04%7C01%7CBhuvanendra.KumarN%40amd.com%7C1b602ae2197248e5a9a008d988e12ef7%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637691323019155507%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&sdata=MOunn7GZCinobEL44IujJYFEaB83wh9TWkuufnnjbQ8%3D&reserved=0>.
> +!
> +! This file is the Fortran source file for namelist.exp.
> +
> +program main
> +
> +  integer :: a, b
> +  namelist /nml/ a, b
> +
> +  a = 10
> +  b = 20
> +  Write(*,nml) ! Display namelist
> +
> +end program main
> diff --git a/include/dwarf2.def b/include/dwarf2.def index 
> 1ae6e1df298..6b8be1f6a16 100644
> --- a/include/dwarf2.def
> +++ b/include/dwarf2.def
> @@ -289,7 +289,7 @@ DW_AT (DW_AT_frame_base, 0x40)  DW_AT 
> (DW_AT_friend, 0x41)  DW_AT (DW_AT_identifier_case, 0x42)  DW_AT 
> (DW_AT_macro_info, 0x43) -DW_AT (DW_AT_namelist_items, 0x44)
> +DW_AT (DW_AT_namelist_item, 0x44)
>  DW_AT (DW_AT_priority, 0x45)
>  DW_AT (DW_AT_segment, 0x46)
>  DW_AT (DW_AT_specification, 0x47)
> --
> 2.17.1
>
>
> -----Original Message-----
> From: Andrew Burgess <andrew.burgess@embecosm.com>
> Sent: Monday, September 20, 2021 3:11 PM
> To: Kumar N, Bhuvanendra <Bhuvanendra.KumarN@amd.com>
> Cc: gdb-patches@sourceware.org; George, Jini Susan 
> <JiniSusan.George@amd.com>; Achra, Nitika <Nitika.Achra@amd.com>; 
> Sharma, Alok Kumar <AlokKumar.Sharma@amd.com>; E, Nagajyothi 
> <Nagajyothi.E@amd.com>
> Subject: Re: [PATCH] Fix ptype and print commands for namelist 
> variables(a fortran feature)
>
> [CAUTION: External Email]
>
> * Kumar N, Bhuvanendra via Gdb-patches <gdb-patches@sourceware.org> [2021-08-24 09:16:19 +0000]:
>
> > [AMD Official Use Only]
> >
> > Hi all,
> >
> > Requesting code review for this GDB patch. Required patch is attached and also inlined below with this email.
> >
> > Problem description/summary:
> >
> > GCC/gfortran support namelist(a fortran feature), it emits DW_TAG_namelist and DW_TAG_namelist_item dies. But gdb does not process these dies and support namelist variables during print and ptype commands. When tried to print, it bails out with the error message as shown below.
> > (gdb) print nml
> > No symbol "nml" in current context.
> >
> > Fix details:
> >
> > This fix is to make the print and ptype commands work for namelist variables and its items. Sample output of these commands is shared below, with fixed gdb.
> >
> > (gdb) ptype nml
> > type = Type nml
> >     integer(kind=4) :: a
> >     integer(kind=4) :: b
> > End Type nml
> > (gdb) print nml
> > $1 = ( a = 10, b = 20 )
>
> bhuvan,
>
> Thanks for working on this.  I have some small style issues, but I have a bigger question which you'll find inline.
>
> Thanks,
> Andrew
>
>
> >
> > gdb/ChangeLog:
> >
> >        * dwarf2/read.c (process_die): Add new case for namelist.
> >        (dwarf2_add_field): Process DW_TAG_namelist_item die.
> >        (read_structure_type, handle_struct_member_die, new_symbol)
> >        (dwarf2_name): Update.
> >        * f-valprint.c (f_language::value_print_inner): Add support for
> >       printing namelist items.
> >        * include/dwarf2.def: (DW_AT_namelist_items): Renamed to ...
> >        (DW_AT_namelist_item): ... this. As per dwarf standard.
> >
> > gdb/testsuite/ChangeLog:
> >
> >        * gdb.fortran/namelist.exp: New file.
> >        * gdb.fortran/namelist.f90: New file.
> >
> > NOTE: Similarly renaming DW_AT_namelist_items to DW_AT_namelist_item as per DWARF standard naming convention in GCC/gfortran repo (https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fgcc-mirror%2Fgcc&data=04%7C01%7CBhuvanendra.KumarN%40amd.com%7C1b602ae2197248e5a9a008d988e12ef7%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637691323019155507%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&sdata=K8mncjSuCt9BEaGJTnlJ9qp0%2FpFSVvfkVxbe%2FNFrej0%3D&reserved=0) will be handled in separate PATCH. I will raise separate patch for this.
> >
> > regards,
> > bhuvan
> >
> > Patch inlined:
> >
> > From 0775cbf3716bae9480c3f1f1d9d8860ac561929e Mon Sep 17 00:00:00 
> > 2001
> > From: =?UTF-8?q?=E2=80=9Cbhkumarn=E2=80=9D?=
> > Bhuvanendra.KumarN@amd.com<mailto:Bhuvanendra.KumarN@amd.com>
> > Date: Mon, 24 Aug 2021 11:49:14 +0530
> > Subject: [PATCH] Fix ptype and print commands for namelist 
> > variables(a fortran feature).
> >
> > GCC/gfortran support namelist(a fortran feature), it emits 
> > DW_TAG_namelist and DW_TAG_namelist_item dies. But gdb does not 
> > process these dies and support namelist variables during print and 
> > ptype commands. When tried to print, it bails out with the error message as shown below.
> > (gdb) print nml
> > No symbol "nml" in current context.
> > This commit is to make the print and ptype commands work for 
> > namelist variables and its items. Sample output of these commands is 
> > shared below, with fixed gdb.
> > (gdb) ptype nml
> > type = Type nml
> >     integer(kind=4) :: a
> >     integer(kind=4) :: b
> > End Type nml
> > (gdb) print nml
> > $1 = ( a = 10, b = 20 )
> > ---
> > gdb/ChangeLog                          | 11 +++++++
> > gdb/dwarf2/read.c                      | 41 +++++++++++++++++++----
> > gdb/f-valprint.c                       | 10 ++++++
> > gdb/testsuite/ChangeLog                |  5 +++
> > gdb/testsuite/gdb.fortran/namelist.exp | 45 
> > ++++++++++++++++++++++++++
> > gdb/testsuite/gdb.fortran/namelist.f90 | 27 ++++++++++++++++
> > include/dwarf2.def                     |  2 +-
> > 7 files changed, 134 insertions(+), 7 deletions(-) create mode 
> > 100644 gdb/testsuite/gdb.fortran/namelist.exp
> > create mode 100644 gdb/testsuite/gdb.fortran/namelist.f90
> >
> > diff --git a/gdb/ChangeLog b/gdb/ChangeLog index
> > 36cb4c9e7e9..ec01c2957e9 100644
> > --- a/gdb/ChangeLog
> > +++ b/gdb/ChangeLog
> > @@ -1,3 +1,14 @@
> > +2021-08-23  Bhuvanendra Kumar N
> > +Bhuvanendra.KumarN@amd.com<mailto:Bhuvanendra.KumarN@amd.com>
> > +
> > +     * dwarf2/read.c (process_die): Add new case for namelist.
> > +     (dwarf2_add_field): Process DW_TAG_namelist_item die.
> > +     (read_structure_type, handle_struct_member_die, new_symbol)
> > +     (dwarf2_name): Update.
> > +     * f-valprint.c (f_language::value_print_inner): Add support for
> > +     printing namelist items.
> > +     * include/dwarf2.def: (DW_AT_namelist_items): Renamed to ...
> > +     (DW_AT_namelist_item): ... this. As per dwarf standard.
> > +
> > 2021-06-08  Lancelot Six  lsix@lancelotsix.com<mailto:lsix@lancelotsix.com>
> >       * python/lib/gdb/FrameDecorator.py (FrameDecorator): Use 'is None'
> > diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index
> > 96009f1418f..54528d67498 100644
> > --- a/gdb/dwarf2/read.c
> > +++ b/gdb/dwarf2/read.c
> > @@ -9570,6 +9570,7 @@ process_die (struct die_info *die, struct dwarf2_cu *cu)
> >      case DW_TAG_interface_type:
> >      case DW_TAG_structure_type:
> >      case DW_TAG_union_type:
> > +    case DW_TAG_namelist:
> >        process_structure_scope (die, cu);
> >        break;
> >      case DW_TAG_enumeration_type:
> > @@ -14417,8 +14418,20 @@ dwarf2_add_field (struct field_info *fip, struct die_info *die,
> >    fp = &new_field->field;
> > -  if (die->tag == DW_TAG_member && ! die_is_declaration (die, cu))
> > -    {
> > +  if ((die->tag == DW_TAG_member || die->tag == DW_TAG_namelist_item) &&
> > +            ! die_is_declaration (die, cu))
>
> The '&&' operator should start the line.
>
> > +    {
> > +      /* For the DW_TAG_namelist_item die, use the referenced die.  */
> > +      if (die->tag == DW_TAG_namelist_item)
> > +        {
> > +          struct attribute *attr1 = dwarf2_attr (die, DW_AT_namelist_item, cu);
> > +          struct die_info *item_die = NULL;
>
> Throughout this patch, please use nullptr instead of NULL.
>
> > +          struct dwarf2_cu *item_cu = cu;
> > +          if (attr1->form_is_ref ())
> > +            item_die = follow_die_ref (die, attr1, &item_cu);
> > +          if (item_die != NULL)
> > +            die = item_die;
> > +        }
> >        /* Data member other than a C++ static data member.  */
> >        /* Get type of field.  */
> > @@ -15449,6 +15462,8 @@ read_structure_type (struct die_info *die, struct dwarf2_cu *cu)
> >    type = alloc_type (objfile);
> >    INIT_CPLUS_SPECIFIC (type);
> > +  if (die->tag == DW_TAG_namelist)
> > +    INIT_NONE_SPECIFIC (type);
>
> I think you should use if/then/else and place INIT_CPLUS_SPECIFIC in the else block.
>
> >    name = dwarf2_name (die, cu);
> >    if (name != NULL)
> > @@ -15684,7 +15699,8 @@ handle_struct_member_die (struct die_info *child_die, struct type *type,
> >                   struct dwarf2_cu *cu) {
> >    if (child_die->tag == DW_TAG_member
> > -      || child_die->tag == DW_TAG_variable)
> > +      || child_die->tag == DW_TAG_variable
> > +      || child_die->tag == DW_TAG_namelist_item)
> >      {
> >        /* NOTE: carlton/2002-11-05: A C++ static data member
> >       should be a DW_TAG_member that is a declaration, but @@ 
> > -15728,7
> > +15744,9 @@ handle_struct_member_die (struct die_info *child_die,
> > struct type *type, }
> >  /* Finish creating a structure or union type, including filling in
> > -   its members and creating a symbol for it.  */
> > +   its members and creating a symbol for it. This function also
> > +   handles Fortran namelist variable, its items or members and
> > +   creating a symbol for it.  */
> >  static void
> > process_structure_scope (struct die_info *die, struct dwarf2_cu *cu) 
> > @@ -21807,8 +21825,17 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu,
> >      case DW_TAG_union_type:
> >      case DW_TAG_set_type:
> >      case DW_TAG_enumeration_type:
> > -       SYMBOL_ACLASS_INDEX (sym) = LOC_TYPEDEF;
> > -       SYMBOL_DOMAIN (sym) = STRUCT_DOMAIN;
> > +     case DW_TAG_namelist:
> > +       if (die->tag == DW_TAG_namelist)
> > +            {
> > +           SYMBOL_ACLASS_INDEX (sym) = LOC_STATIC;
> > +           SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
> > +         }
> > +       else
> > +            {
> > +           SYMBOL_ACLASS_INDEX (sym) = LOC_TYPEDEF;
> > +           SYMBOL_DOMAIN (sym) = STRUCT_DOMAIN;
> > +            }
> >         {
> >          /* NOTE: carlton/2003-11-10: C++ class symbols shouldn't @@
> > -22744,6 +22771,7 @@ dwarf2_name (struct die_info *die, struct dwarf2_cu *cu)
> >        && die->tag != DW_TAG_class_type
> >       && die->tag != DW_TAG_interface_type
> >        && die->tag != DW_TAG_structure_type
> > +      && die->tag != DW_TAG_namelist
> >        && die->tag != DW_TAG_union_type)
> >      return NULL;
> > @@ -22768,6 +22796,7 @@ dwarf2_name (struct die_info *die, struct dwarf2_cu *cu)
> >      case DW_TAG_interface_type:
> >      case DW_TAG_structure_type:
> >      case DW_TAG_union_type:
> > +    case DW_TAG_namelist:
> >        /* Some GCC versions emit spurious DW_AT_name attributes for unnamed
> >       structures or unions.  These were of the form "._%d" in GCC 4.1,
> >       or simply "<anonymous struct>" or "<anonymous union>" in GCC 
> > 4.3 diff --git a/gdb/f-valprint.c b/gdb/f-valprint.c index 
> > 240daaf34f9..8ed35e2fb1f 100644
> > --- a/gdb/f-valprint.c
> > +++ b/gdb/f-valprint.c
> > @@ -320,6 +320,16 @@ f_language::value_print_inner (struct value *val, struct ui_file *stream,
> >             fputs_filtered (" = ", stream);
> >           }
> > +           /* While printing namelist items, fetch the appropriate value
> > +              field before printing its value.  */
> > +           if (TYPE_SPECIFIC_FIELD (type) == TYPE_SPECIFIC_NONE)
>
> I'm a little uncomfortable with this if condition.  This feels like a bit of a hack.  Is there precedent anywhere else in GDB for using the type specific field like this?
>
> Wouldn't adding a TYPE_CODE_NAMELIST be more in keeping with how GDB currently does things, though I understand this is likely to make the patch slightly bigger.  Did you consider this approach?
>
>
>
>
> > +             {
> > +               struct block_symbol symni = lookup_symbol(field_name,
> > +                get_selected_block (0), VAR_DOMAIN, nullptr);
>
> There's a missing space before '(' here, and two lines below.
>
> > +               if (symni.symbol != NULL)
> > +                 field = value_of_variable(symni.symbol, symni.block);
> > +             }
> > +
> >            common_val_print (field, stream, recurse + 1,
> >                      options, current_language); diff --git 
> > a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 
> > 87cf3e2a061..33f60c29b3c 100644
> > --- a/gdb/testsuite/ChangeLog
> > +++ b/gdb/testsuite/ChangeLog
> > @@ -1,3 +1,8 @@
> > +2021-07-26  Bhuvanendra Kumar N
> > +Bhuvanendra.KumarN@amd.com<mailto:Bhuvanendra.KumarN@amd.com>
> > +
> > +     * gdb.fortran/namelist.exp: New file.
> > +     * gdb.fortran/namelist.f90: New file.
> > +
> > 2021-06-10  Bhuvanendra Kumar N  Bhuvanendra.KumarN@amd.com<mailto:Bhuvanendra.KumarN@amd.com>
> >       * gdb.fortran/ptype-on-functions.exp: Add type info of formal 
> > diff --git a/gdb/testsuite/gdb.fortran/namelist.exp
> > b/gdb/testsuite/gdb.fortran/namelist.exp
> > new file mode 100644
> > index 00000000000..e4df8c7debb
> > --- /dev/null
> > +++ b/gdb/testsuite/gdb.fortran/namelist.exp
> > @@ -0,0 +1,45 @@
> > +# Copyright 2020-2021 Free Software Foundation, Inc.
>
> The '2020' date is only needed if the patch was original posted in 2020, or if this file is copied/based on some other in-tree file that is copyright 2020+.
>
> > +
> > +# 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 https://nam11.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww.gnu.org%2Flicenses%2F&data=04%7C01%7CBhuvanendra.KumarN%40amd.com%7C1b602ae2197248e5a9a008d988e12ef7%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637691323019160499%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&sdata=KoXo6%2BRQEYSwRQ6VV%2Batjx0FoVfnufps0RJnK88k2y0%3D&reserved=0.
> > +
> > +# This file is part of the gdb testsuite.  It contains tests for 
> > +fortran # namelist.
> > +
> > +if { [skip_fortran_tests] } { return -1 }
> > +
> > +standard_testfile .f90
> > +load_lib "fortran.exp"
> > +
> > +if {[prepare_for_testing "failed to prepare" $testfile $srcfile {debug f90}]} {
> > +    return -1
> > +}
> > +
> > +if ![fortran_runto_main] then {
> > +    perror "couldn't run to main"
> > +    continue
> > +}
> > +
> > +# Depending on the compiler being used, the type names can be printed differently.
> > +set int [fortran_int4]
> > +
> > +gdb_breakpoint [gdb_get_line_number "Display namelist"] 
> > +gdb_continue_to_breakpoint "Display namelist"
> > +
> > +if {[test_compiler_info {gcc-*}]} {
> > +    gdb_test "ptype nml" "type = Type nml\r\n *$int :: a\r\n *$int :: b\r\n *End Type nml"
> > +    gdb_test "print nml" \\$\[0-9\]+ = \\( a = 10, b = 20 
> > +\\)<file://$/%5b0-9/%5d+%20=%20/(%20a%20=%2010,%20b%20=%2020%20/)>
>
> The pattern should be wrapped onto the newline.
>
> Thanks,
> Andrew
>
> > +} else {
> > +    gdb_test "ptype nml" "No symbol \"nml\" in current context\\."
> > +    gdb_test "print nml" "No symbol \"nml\" in current context\\."
> > +}
> > diff --git a/gdb/testsuite/gdb.fortran/namelist.f90
> > b/gdb/testsuite/gdb.fortran/namelist.f90
> > new file mode 100644
> > index 00000000000..00704eddf27
> > --- /dev/null
> > +++ b/gdb/testsuite/gdb.fortran/namelist.f90
> > @@ -0,0 +1,27 @@
> > +! Copyright 2020-2021 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 https://nam11.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww.gnu.org%2Flicenses%2F&data=04%7C01%7CBhuvanendra.KumarN%40amd.com%7C1b602ae2197248e5a9a008d988e12ef7%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637691323019160499%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&sdata=KoXo6%2BRQEYSwRQ6VV%2Batjx0FoVfnufps0RJnK88k2y0%3D&reserved=0.
> > +!
> > +! This file is the Fortran source file for namelist.exp.
> > +
> > +program main
> > +
> > +  integer :: a, b
> > +  namelist /nml/ a, b
> > +
> > +  a = 10
> > +  b = 20
> > +  Write(*,nml) ! Display namelist
> > +
> > +end program main
> > diff --git a/include/dwarf2.def b/include/dwarf2.def index
> > 1ae6e1df298..6b8be1f6a16 100644
> > --- a/include/dwarf2.def
> > +++ b/include/dwarf2.def
> > @@ -289,7 +289,7 @@ DW_AT (DW_AT_frame_base, 0x40) DW_AT 
> > (DW_AT_friend, 0x41) DW_AT (DW_AT_identifier_case, 0x42) DW_AT 
> > (DW_AT_macro_info, 0x43) -DW_AT (DW_AT_namelist_items, 0x44)
> > +DW_AT (DW_AT_namelist_item, 0x44)
> > DW_AT (DW_AT_priority, 0x45)
> > DW_AT (DW_AT_segment, 0x46)
> > DW_AT (DW_AT_specification, 0x47)
> > --
> > 2.17.1
> >
> >
> >
>

-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-gdb-fortran-Fix-ptype-and-print-commands-for-namelis.patch
Type: application/octet-stream
Size: 11751 bytes
Desc: 0001-gdb-fortran-Fix-ptype-and-print-commands-for-namelis.patch
URL: <https://sourceware.org/pipermail/gdb-patches/attachments/20211007/ad50f794/attachment-0001.obj>


More information about the Gdb-patches mailing list