public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] In MI mode -var-create --language not working.
@ 2014-09-30  7:36 Walfred Tedeschi
  2014-11-12 15:03 ` Pedro Alves
  0 siblings, 1 reply; 3+ messages in thread
From: Walfred Tedeschi @ 2014-09-30  7:36 UTC (permalink / raw)
  To: palves, mark.kettenis; +Cc: gdb-patches, Walfred Tedeschi

Trying to use --language to create a variable showed that --language was
not always working.  In some cases GDB understands that the language is automatic
and cannot parse the language set while executing the command.
In order to fix this just before executing the command language mode
should be set to manual.  In this way GDB can parse the expression using
the language given in the command.
To do so mode has temporarily to be changed to manual expressing that any
evaluation done using the language parameter has priority over the automatic
one.
Tests are also included doing evaluations when the default language is c/c++
and when default language is Fortran.

2014-07-25  Walfred Tedeschi  <walfred.tedeschi@intel.com>

	* utils.c (saved_language_and_mode): new struct to accommodate
	the language mode and the current language for cleanup.
	(do_restore_current_language): Add the language and mode
	to be restored.  (make_cleanup_restore_current_language):
	pass the mode and language to the do_restore_current_language.

gdb/mi
	* mi-main.c (mi_cmd_execute): Set to manual the language mode
	to execute an mi command when --language is present.

gdb/testsuite:

	* gdb.mi/mi-language1.cc: New file.
	* gdb.mi/mi-language2.cc: New file.
	* gdb.mi/mi-language1.exp: New file.
	* gdb.mi/mi-language2.exp: New file.

---
 gdb/mi/mi-main.c                      |  1 +
 gdb/testsuite/gdb.mi/mi-language1.cc  | 36 +++++++++++++++++++++
 gdb/testsuite/gdb.mi/mi-language1.exp | 60 +++++++++++++++++++++++++++++++++++
 gdb/testsuite/gdb.mi/mi-language2.exp | 54 +++++++++++++++++++++++++++++++
 gdb/testsuite/gdb.mi/mi-language2.f90 | 40 +++++++++++++++++++++++
 gdb/utils.c                           | 24 +++++++++++---
 6 files changed, 210 insertions(+), 5 deletions(-)
 create mode 100644 gdb/testsuite/gdb.mi/mi-language1.cc
 create mode 100644 gdb/testsuite/gdb.mi/mi-language1.exp
 create mode 100644 gdb/testsuite/gdb.mi/mi-language2.exp
 create mode 100644 gdb/testsuite/gdb.mi/mi-language2.f90

diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c
index 59717ca..0198981 100644
--- a/gdb/mi/mi-main.c
+++ b/gdb/mi/mi-main.c
@@ -2236,6 +2236,7 @@ mi_cmd_execute (struct mi_parse *parse)
   if (parse->language != language_unknown)
     {
       make_cleanup_restore_current_language ();
+      language_mode = language_mode_manual;
       set_language (parse->language);
     }
 
diff --git a/gdb/testsuite/gdb.mi/mi-language1.cc b/gdb/testsuite/gdb.mi/mi-language1.cc
new file mode 100644
index 0000000..0c8bd42
--- /dev/null
+++ b/gdb/testsuite/gdb.mi/mi-language1.cc
@@ -0,0 +1,36 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2014 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 A
+{
+  virtual ~A ();
+  int a1;
+};
+
+A::~A ()
+{
+  a1 = 800;
+}
+
+int
+main (void)
+{
+  A alpha;
+  alpha.a1 = 100;
+
+  return alpha.a1; /* only bp.  */
+}
diff --git a/gdb/testsuite/gdb.mi/mi-language1.exp b/gdb/testsuite/gdb.mi/mi-language1.exp
new file mode 100644
index 0000000..a8df370
--- /dev/null
+++ b/gdb/testsuite/gdb.mi/mi-language1.exp
@@ -0,0 +1,60 @@
+# Copyright 2014 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/>.
+
+if { [skip_cplus_tests] } { continue }
+
+load_lib mi-support.exp
+set MIFLAGS "-i=mi"
+
+gdb_exit
+if [mi_gdb_start] {
+    continue
+}
+
+standard_testfile .cc
+
+if [get_compiler_info "c++"] {
+    return -1
+}
+
+if {[gdb_compile $srcdir/$subdir/$srcfile $binfile executable {debug c++}] != ""} {
+  untested $testfile.exp
+  return -1
+}
+
+mi_gdb_load ${binfile}
+
+if ![mi_run_to_main] {
+    untested "could not run to main"
+    return -1
+}
+
+set lineno [gdb_get_line_number "only bp."]
+
+mi_create_breakpoint "$srcfile:$lineno" "add mi-language1 bp" keep {main\(\)} \
+                     ".*mi-language1.cc" $lineno $hex "break in main"
+
+mi_execute_to "exec-continue" "breakpoint-hit" \
+              "main" "" ".*" ".*" {"" "disp=\"keep\""} \
+              "continue to mi-language1 bp"
+
+mi_gdb_test "-var-create --language fortran alpha_1 * (alpha%a1)" \
+            "\\^done,name=\"alpha_1\",numchild=\"0\",value=\"100\",type=\"int\",thread-id=\"\[0-9\]+\",has_more=\"0\"" \
+            "-var-create from c using fortran language"
+
+mi_gdb_test "-var-create alpha_2 * (alpha.a1)" \
+            "\\^done,name=\"alpha_2\",numchild=\"0\",value=\"100\",type=\"int\",thread-id=\"\[0-9\]+\",has_more=\"0\"" \
+            "-var-create from c using default language"
+gdb_exit
\ No newline at end of file
diff --git a/gdb/testsuite/gdb.mi/mi-language2.exp b/gdb/testsuite/gdb.mi/mi-language2.exp
new file mode 100644
index 0000000..76474e6
--- /dev/null
+++ b/gdb/testsuite/gdb.mi/mi-language2.exp
@@ -0,0 +1,54 @@
+# Copyright 2014 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 mi-support.exp
+set MIFLAGS "-i=mi"
+
+gdb_exit
+if [mi_gdb_start] {
+    continue
+}
+
+standard_testfile mi-language2.f90
+
+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable \
+     {debug f90}] != "" } {
+     untested mi-language2.exp
+     return -1
+}
+
+mi_delete_breakpoints
+mi_gdb_reinitialize_dir $srcdir/$subdir
+mi_gdb_load ${binfile}
+
+set bp_lineno [gdb_get_line_number "only bp"]
+
+mi_create_breakpoint "-t mi-language2.f90:$bp_lineno" "add mi-language2 bp"\
+  "del" "struct_test" ".*mi-language2.f90" $bp_lineno $hex \
+  "MI-language2 insert breakpoint at line $bp_lineno (only bp)"
+
+mi_run_cmd
+
+mi_expect_stop "breakpoint-hit" "struct_test" "" ".*mi-language2.f90" \
+               "$bp_lineno" { "" "disp=\"del\"" } "mi-language2 run to breakpoint at line $bp_lineno"
+
+mi_gdb_test "-var-create --language c alpha_1 * (p.c)" \
+            "\\^done,name=\"alpha_1\",numchild=\"0\",value=\"1\",type=\"integer\\(kind=4\\)\",thread-id=\"\[0-9\]+\",has_more=\"0\"" \
+            "-var-create from fortran using fortran language"
+
+mi_gdb_test "-var-create alpha_2 * (p%c)" \
+            "\\^done,name=\"alpha_2\",numchild=\"0\",value=\"1\",type=\"integer\\(kind=4\\)\",thread-id=\"\[0-9\]+\",has_more=\"0\"" \
+            "-var-create from fortran using default language"
+gdb_exit
\ No newline at end of file
diff --git a/gdb/testsuite/gdb.mi/mi-language2.f90 b/gdb/testsuite/gdb.mi/mi-language2.f90
new file mode 100644
index 0000000..ec49f2b
--- /dev/null
+++ b/gdb/testsuite/gdb.mi/mi-language2.f90
@@ -0,0 +1,40 @@
+! Copyright 2014 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/>.
+!
+! Ihis file is the Fortran source file for derived-type.exp.  It was written
+! by Wu Zhou. (woodzltc@cn.ibm.com)
+
+program struct_test
+
+  type bar
+    integer :: c
+    real :: d
+  end type
+  type foo
+    real :: a
+    type(bar) :: x
+    character*7 :: b
+  end type foo
+  type(foo) :: q
+  type(bar) :: p
+
+  p = bar(1, 2.375)
+  q%a = 3.125
+  q%b = "abcdefg"
+  q%x%c = 1
+  q%x%d = 2.375
+  print *,p,q                     ! only bp
+
+end program struct_test
diff --git a/gdb/utils.c b/gdb/utils.c
index 4da9501..96a87ca 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -444,24 +444,38 @@ make_cleanup_free_so (struct so_list *so)
 
 /* Helper for make_cleanup_restore_current_language.  */
 
+struct saved_language_and_mode
+{
+  enum language lang;
+  enum language_mode mode;
+};
+
 static void
 do_restore_current_language (void *p)
 {
-  enum language saved_lang = (uintptr_t) p;
+  struct saved_language_and_mode *lang_and_mode =
+      (struct saved_language_and_mode*) p;
+  enum language saved_lang = lang_and_mode->lang;
+  language_mode = lang_and_mode->mode;
 
+  xfree (p);
   set_language (saved_lang);
 }
 
-/* Remember the current value of CURRENT_LANGUAGE and make it restored when
-   the cleanup is run.  */
+/* Remember the current value of CURRENT_LANGUAGE and
+   LANGUAGE_MODE restoring them when the cleanup is run.  */
 
 struct cleanup *
 make_cleanup_restore_current_language (void)
 {
-  enum language saved_lang = current_language->la_language;
+  struct saved_language_and_mode *lang_and_mode
+		= XNEW (struct saved_language_and_mode);
+
+  lang_and_mode->lang = current_language->la_language;
+  lang_and_mode->mode = language_mode;
 
   return make_cleanup (do_restore_current_language,
-		       (void *) (uintptr_t) saved_lang);
+		       (void *) lang_and_mode);
 }
 
 /* Helper function for make_cleanup_clear_parser_state.  */
-- 
1.9.1

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] In MI mode -var-create --language not working.
  2014-09-30  7:36 [PATCH] In MI mode -var-create --language not working Walfred Tedeschi
@ 2014-11-12 15:03 ` Pedro Alves
  2014-11-12 15:15   ` Tedeschi, Walfred
  0 siblings, 1 reply; 3+ messages in thread
From: Pedro Alves @ 2014-11-12 15:03 UTC (permalink / raw)
  To: Walfred Tedeschi, mark.kettenis; +Cc: gdb-patches

Hi Walfred,

On 09/30/2014 08:29 AM, Walfred Tedeschi wrote:
> Trying to use --language to create a variable showed that --language was
> not always working.  In some cases GDB understands that the language is automatic
> and cannot parse the language set while executing the command.
> In order to fix this just before executing the command language mode
> should be set to manual.  In this way GDB can parse the expression using
> the language given in the command.
> To do so mode has temporarily to be changed to manual expressing that any
> evaluation done using the language parameter has priority over the automatic
> one.
> Tests are also included doing evaluations when the default language is c/c++
> and when default language is Fortran.
> 
> 2014-07-25  Walfred Tedeschi  <walfred.tedeschi@intel.com>
> 
> 	* utils.c (saved_language_and_mode): new struct to accommodate
> 	the language mode and the current language for cleanup.
> 	(do_restore_current_language): Add the language and mode
> 	to be restored.  (make_cleanup_restore_current_language):
> 	pass the mode and language to the do_restore_current_language.

Start sentences with uppercase.  Don't explain what the struct is for
here.  Line break before "(make_...".  "to the do_restore_current_language"
sounds a little strange.  I suggest this:

	* utils.c (struct saved_language_and_mode): New.
	(do_restore_current_language): Add the language and mode
	to be restored.
	(make_cleanup_restore_current_language): Pass the mode and
	language to do_restore_current_language.

> 
> gdb/mi
> 	* mi-main.c (mi_cmd_execute): Set to manual the language mode
> 	to execute an mi command when --language is present.

	* mi-main.c (mi_cmd_execute): When --language is present, set
	the language mode to manual.

> diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c
> index 59717ca..0198981 100644
> --- a/gdb/mi/mi-main.c
> +++ b/gdb/mi/mi-main.c
> @@ -2236,6 +2236,7 @@ mi_cmd_execute (struct mi_parse *parse)
>    if (parse->language != language_unknown)
>      {
>        make_cleanup_restore_current_language ();
> +      language_mode = language_mode_manual;
>        set_language (parse->language);
>      }
>  

Did you audit all set_language callers, to see what other
callers might need the same fix?  It might be better to add a
variant of set_language that does the forcing of language_mode
to manual.  Say, something like set_language_manual, or
override_language, or some such, and call that in all places
that might need this.

> +set lineno [gdb_get_line_number "only bp."]
> +
> +mi_create_breakpoint "$srcfile:$lineno" "add mi-language1 bp" keep {main\(\)} \
> +                     ".*mi-language1.cc" $lineno $hex "break in main"

Use $srcfile instead of "mi-language1.cc".  "break in main" seems stale?

> +
> +mi_execute_to "exec-continue" "breakpoint-hit" \
> +              "main" "" ".*" ".*" {"" "disp=\"keep\""} \
> +              "continue to mi-language1 bp"

No need to say "mi-language1" here.  The test messages are
always prefixed with the test file name.

> +
> +gdb_exit
> \ No newline at end of file

Please make sure new files end with a new line.

> diff --git a/gdb/testsuite/gdb.mi/mi-language2.exp b/gdb/testsuite/gdb.mi/mi-language2.exp

How about renaming these to mi-language-c.exp, mi-language-fortran.exp ?
mi-language1.exp and mi-language2.exp seem a bit arbitrary.

> +set bp_lineno [gdb_get_line_number "only bp"]
> +
> +mi_create_breakpoint "-t mi-language2.f90:$bp_lineno" "add mi-language2 bp"\
> +  "del" "struct_test" ".*mi-language2.f90" $bp_lineno $hex \
> +  "MI-language2 insert breakpoint at line $bp_lineno (only bp)"
> +

No need for this "MI-language2" prefix.  Please don't put line numbers
in the test message, as those will change when we add something
to the test source.  Write instead:

  "insert breakpoint at only bp"

or some such.


> +mi_run_cmd
> +
> +mi_expect_stop "breakpoint-hit" "struct_test" "" ".*mi-language2.f90" \
> +               "$bp_lineno" { "" "disp=\"del\"" } "mi-language2 run to breakpoint at line $bp_lineno"
> +
> +mi_gdb_test "-var-create --language c alpha_1 * (p.c)" \
> +            "\\^done,name=\"alpha_1\",numchild=\"0\",value=\"1\",type=\"integer\\(kind=4\\)\",thread-id=\"\[0-9\]+\",has_more=\"0\"" \
> +            "-var-create from fortran using fortran language"
> +
> +mi_gdb_test "-var-create alpha_2 * (p%c)" \
> +            "\\^done,name=\"alpha_2\",numchild=\"0\",value=\"1\",type=\"integer\\(kind=4\\)\",thread-id=\"\[0-9\]+\",has_more=\"0\"" \
> +            "-var-create from fortran using default language"
> +gdb_exit
> \ No newline at end of file

Add a newline.

> diff --git a/gdb/testsuite/gdb.mi/mi-language2.f90 b/gdb/testsuite/gdb.mi/mi-language2.f90
> new file mode 100644
> index 0000000..ec49f2b
> --- /dev/null
> +++ b/gdb/testsuite/gdb.mi/mi-language2.f90
> @@ -0,0 +1,40 @@
> +! Copyright 2014 Free Software Foundation, Inc.
...
> +!
> +! Ihis file is the Fortran source file for derived-type.exp.  It was written
> +! by Wu Zhou. (woodzltc@cn.ibm.com)

This reference to derived-type.exp is confusing now.  I think it's best to
just remove the whole paragraph.  Also, if this file is mostly copied from
another, please preserve the copyright years of the original file.

> diff --git a/gdb/utils.c b/gdb/utils.c
> index 4da9501..96a87ca 100644
> --- a/gdb/utils.c
> +++ b/gdb/utils.c
> @@ -444,24 +444,38 @@ make_cleanup_free_so (struct so_list *so)
>  
>  /* Helper for make_cleanup_restore_current_language.  */
>  
> +struct saved_language_and_mode
> +{
> +  enum language lang;
> +  enum language_mode mode;
> +};
> +
>  static void
>  do_restore_current_language (void *p)
>  {
> -  enum language saved_lang = (uintptr_t) p;
> +  struct saved_language_and_mode *lang_and_mode =
> +      (struct saved_language_and_mode*) p;

  struct saved_language_and_mode *lang_and_mode
    = (struct saved_language_and_mode*) p;

Though in C you don't really need the cast.

> +  enum language saved_lang = lang_and_mode->lang;
> +  language_mode = lang_and_mode->mode;
>  
> +  xfree (p);

This xfree should be done in the cleanup's destructor, so
that we don't leak p when discard_cleanups is called.  That is,
use make_cleanup_dtor instead of make_cleanup in
make_cleanup_restore_current_language.

>    set_language (saved_lang);
>  }
>  
> -/* Remember the current value of CURRENT_LANGUAGE and make it restored when
> -   the cleanup is run.  */
> +/* Remember the current value of CURRENT_LANGUAGE and
> +   LANGUAGE_MODE restoring them when the cleanup is run.  */
>  
>  struct cleanup *
>  make_cleanup_restore_current_language (void)
>  {
> -  enum language saved_lang = current_language->la_language;
> +  struct saved_language_and_mode *lang_and_mode
> +		= XNEW (struct saved_language_and_mode);

Indentation:

  struct saved_language_and_mode *lang_and_mode
    = XNEW (struct saved_language_and_mode);

Thanks,
Pedro Alves

^ permalink raw reply	[flat|nested] 3+ messages in thread

* RE: [PATCH] In MI mode -var-create --language not working.
  2014-11-12 15:03 ` Pedro Alves
@ 2014-11-12 15:15   ` Tedeschi, Walfred
  0 siblings, 0 replies; 3+ messages in thread
From: Tedeschi, Walfred @ 2014-11-12 15:15 UTC (permalink / raw)
  To: Pedro Alves; +Cc: gdb-patches

Hi Pedro,

Thanks a lot for your review!!!

I will address all the comments and send to another round.

Thanks and regards,
-Fred

-----Original Message-----
From: Pedro Alves [mailto:palves@redhat.com] 
Sent: Wednesday, November 12, 2014 4:03 PM
To: Tedeschi, Walfred; mark.kettenis@xs4all.nl
Cc: gdb-patches@sourceware.org
Subject: Re: [PATCH] In MI mode -var-create --language not working.

Hi Walfred,

On 09/30/2014 08:29 AM, Walfred Tedeschi wrote:
> Trying to use --language to create a variable showed that --language 
> was not always working.  In some cases GDB understands that the 
> language is automatic and cannot parse the language set while executing the command.
> In order to fix this just before executing the command language mode 
> should be set to manual.  In this way GDB can parse the expression 
> using the language given in the command.
> To do so mode has temporarily to be changed to manual expressing that 
> any evaluation done using the language parameter has priority over the 
> automatic one.
> Tests are also included doing evaluations when the default language is 
> c/c++ and when default language is Fortran.
> 
> 2014-07-25  Walfred Tedeschi  <walfred.tedeschi@intel.com>
> 
> 	* utils.c (saved_language_and_mode): new struct to accommodate
> 	the language mode and the current language for cleanup.
> 	(do_restore_current_language): Add the language and mode
> 	to be restored.  (make_cleanup_restore_current_language):
> 	pass the mode and language to the do_restore_current_language.

Start sentences with uppercase.  Don't explain what the struct is for here.  Line break before "(make_...".  "to the do_restore_current_language"
sounds a little strange.  I suggest this:

	* utils.c (struct saved_language_and_mode): New.
	(do_restore_current_language): Add the language and mode
	to be restored.
	(make_cleanup_restore_current_language): Pass the mode and
	language to do_restore_current_language.

> 
> gdb/mi
> 	* mi-main.c (mi_cmd_execute): Set to manual the language mode
> 	to execute an mi command when --language is present.

	* mi-main.c (mi_cmd_execute): When --language is present, set
	the language mode to manual.

> diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c index 
> 59717ca..0198981 100644
> --- a/gdb/mi/mi-main.c
> +++ b/gdb/mi/mi-main.c
> @@ -2236,6 +2236,7 @@ mi_cmd_execute (struct mi_parse *parse)
>    if (parse->language != language_unknown)
>      {
>        make_cleanup_restore_current_language ();
> +      language_mode = language_mode_manual;
>        set_language (parse->language);
>      }
>  

Did you audit all set_language callers, to see what other callers might need the same fix?  It might be better to add a variant of set_language that does the forcing of language_mode to manual.  Say, something like set_language_manual, or override_language, or some such, and call that in all places that might need this.

> +set lineno [gdb_get_line_number "only bp."]
> +
> +mi_create_breakpoint "$srcfile:$lineno" "add mi-language1 bp" keep {main\(\)} \
> +                     ".*mi-language1.cc" $lineno $hex "break in main"

Use $srcfile instead of "mi-language1.cc".  "break in main" seems stale?

> +
> +mi_execute_to "exec-continue" "breakpoint-hit" \
> +              "main" "" ".*" ".*" {"" "disp=\"keep\""} \
> +              "continue to mi-language1 bp"

No need to say "mi-language1" here.  The test messages are always prefixed with the test file name.

> +
> +gdb_exit
> \ No newline at end of file

Please make sure new files end with a new line.

> diff --git a/gdb/testsuite/gdb.mi/mi-language2.exp 
> b/gdb/testsuite/gdb.mi/mi-language2.exp

How about renaming these to mi-language-c.exp, mi-language-fortran.exp ?
mi-language1.exp and mi-language2.exp seem a bit arbitrary.

> +set bp_lineno [gdb_get_line_number "only bp"]
> +
> +mi_create_breakpoint "-t mi-language2.f90:$bp_lineno" "add 
> +mi-language2 bp"\
> +  "del" "struct_test" ".*mi-language2.f90" $bp_lineno $hex \
> +  "MI-language2 insert breakpoint at line $bp_lineno (only bp)"
> +

No need for this "MI-language2" prefix.  Please don't put line numbers in the test message, as those will change when we add something to the test source.  Write instead:

  "insert breakpoint at only bp"

or some such.


> +mi_run_cmd
> +
> +mi_expect_stop "breakpoint-hit" "struct_test" "" ".*mi-language2.f90" \
> +               "$bp_lineno" { "" "disp=\"del\"" } "mi-language2 run to breakpoint at line $bp_lineno"
> +
> +mi_gdb_test "-var-create --language c alpha_1 * (p.c)" \
> +            "\\^done,name=\"alpha_1\",numchild=\"0\",value=\"1\",type=\"integer\\(kind=4\\)\",thread-id=\"\[0-9\]+\",has_more=\"0\"" \
> +            "-var-create from fortran using fortran language"
> +
> +mi_gdb_test "-var-create alpha_2 * (p%c)" \
> +            "\\^done,name=\"alpha_2\",numchild=\"0\",value=\"1\",type=\"integer\\(kind=4\\)\",thread-id=\"\[0-9\]+\",has_more=\"0\"" \
> +            "-var-create from fortran using default language"
> +gdb_exit
> \ No newline at end of file

Add a newline.

> diff --git a/gdb/testsuite/gdb.mi/mi-language2.f90 
> b/gdb/testsuite/gdb.mi/mi-language2.f90
> new file mode 100644
> index 0000000..ec49f2b
> --- /dev/null
> +++ b/gdb/testsuite/gdb.mi/mi-language2.f90
> @@ -0,0 +1,40 @@
> +! Copyright 2014 Free Software Foundation, Inc.
...
> +!
> +! Ihis file is the Fortran source file for derived-type.exp.  It was 
> +written ! by Wu Zhou. (woodzltc@cn.ibm.com)

This reference to derived-type.exp is confusing now.  I think it's best to just remove the whole paragraph.  Also, if this file is mostly copied from another, please preserve the copyright years of the original file.

> diff --git a/gdb/utils.c b/gdb/utils.c index 4da9501..96a87ca 100644
> --- a/gdb/utils.c
> +++ b/gdb/utils.c
> @@ -444,24 +444,38 @@ make_cleanup_free_so (struct so_list *so)
>  
>  /* Helper for make_cleanup_restore_current_language.  */
>  
> +struct saved_language_and_mode
> +{
> +  enum language lang;
> +  enum language_mode mode;
> +};
> +
>  static void
>  do_restore_current_language (void *p)  {
> -  enum language saved_lang = (uintptr_t) p;
> +  struct saved_language_and_mode *lang_and_mode =
> +      (struct saved_language_and_mode*) p;

  struct saved_language_and_mode *lang_and_mode
    = (struct saved_language_and_mode*) p;

Though in C you don't really need the cast.

> +  enum language saved_lang = lang_and_mode->lang;  language_mode = 
> + lang_and_mode->mode;
>  
> +  xfree (p);

This xfree should be done in the cleanup's destructor, so that we don't leak p when discard_cleanups is called.  That is, use make_cleanup_dtor instead of make_cleanup in make_cleanup_restore_current_language.

>    set_language (saved_lang);
>  }
>  
> -/* Remember the current value of CURRENT_LANGUAGE and make it restored when
> -   the cleanup is run.  */
> +/* Remember the current value of CURRENT_LANGUAGE and
> +   LANGUAGE_MODE restoring them when the cleanup is run.  */
>  
>  struct cleanup *
>  make_cleanup_restore_current_language (void)  {
> -  enum language saved_lang = current_language->la_language;
> +  struct saved_language_and_mode *lang_and_mode
> +		= XNEW (struct saved_language_and_mode);

Indentation:

  struct saved_language_and_mode *lang_and_mode
    = XNEW (struct saved_language_and_mode);

Thanks,
Pedro Alves

Intel GmbH
Dornacher Strasse 1
85622 Feldkirchen/Muenchen, Deutschland
Sitz der Gesellschaft: Feldkirchen bei Muenchen
Geschaeftsfuehrer: Christian Lamprechter, Hannes Schwaderer, Douglas Lusk
Registergericht: Muenchen HRB 47456
Ust.-IdNr./VAT Registration No.: DE129385895
Citibank Frankfurt a.M. (BLZ 502 109 00) 600119052

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2014-11-12 15:15 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-09-30  7:36 [PATCH] In MI mode -var-create --language not working Walfred Tedeschi
2014-11-12 15:03 ` Pedro Alves
2014-11-12 15:15   ` Tedeschi, Walfred

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