This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] [C++] remote.c: Avoid enum arithmetic


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=915ef8b18e28e6418216a582067b9fbdd6395e6a

commit 915ef8b18e28e6418216a582067b9fbdd6395e6a
Author: Pedro Alves <palves@redhat.com>
Date:   Thu Nov 19 14:32:53 2015 +0000

    [C++] remote.c: Avoid enum arithmetic
    
    Fixes:
    
      src/gdb/remote.c: In function â??void remote_unpush_target()â??:
      src/gdb/remote.c:4610:45: error: invalid conversion from â??intâ?? to â??strataâ?? [-fpermissive]
         pop_all_targets_above (process_stratum - 1);
    					       ^
      In file included from src/gdb/inferior.h:38:0,
    		   from src/gdb/remote.c:25:
      src/gdb/target.h:2299:13: error:   initializing argument 1 of â??void pop_all_targets_above(strata)â?? [-fpermissive]
       extern void pop_all_targets_above (enum strata above_stratum);
    	       ^
    
    I used to carry a patch in the C++ branch that just did:
    
     -  pop_all_targets_above (process_stratum - 1);
     +  pop_all_targets_above ((enum strata) (process_stratum - 1));
    
    But then thought that maybe adding a routine that does exactly what we
    need results in clearer code.  This is the result.
    
    gdb/ChangeLog:
    2015-11-19  Pedro Alves  <palves@redhat.com>
    
    	* remote.c (remote_unpush_target): Use
    	pop_all_targets_at_and_above instead of pop_all_targets_above.
    	* target.c (unpush_target_and_assert): New function, factored out
    	from ...
    	(pop_all_targets_above): ... here.
    	(pop_all_targets_at_and_above): New function.
    	* target.h (pop_all_targets_at_and_above): Declare.

Diff:
---
 gdb/ChangeLog | 10 ++++++++++
 gdb/remote.c  |  2 +-
 gdb/target.c  | 36 +++++++++++++++++++++++++-----------
 gdb/target.h  |  4 ++++
 4 files changed, 40 insertions(+), 12 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index d1b40b8..e6d7aac 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,13 @@
+2015-11-19  Pedro Alves  <palves@redhat.com>
+
+	* remote.c (remote_unpush_target): Use
+	pop_all_targets_at_and_above instead of pop_all_targets_above.
+	* target.c (unpush_target_and_assert): New function, factored out
+	from ...
+	(pop_all_targets_above): ... here.
+	(pop_all_targets_at_and_above): New function.
+	* target.h (pop_all_targets_at_and_above): Declare.
+
 2015-11-18  Simon Marchi  <simon.marchi@ericsson.com>
 
 	* valops.c (value_string): Constify 'ptr' parameter.
diff --git a/gdb/remote.c b/gdb/remote.c
index fed397af..6c86ab2 100644
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -4607,7 +4607,7 @@ remote_query_supported (void)
 static void
 remote_unpush_target (void)
 {
-  pop_all_targets_above (process_stratum - 1);
+  pop_all_targets_at_and_above (process_stratum);
 }
 
 static void
diff --git a/gdb/target.c b/gdb/target.c
index 93786c3..0ae6708 100644
--- a/gdb/target.c
+++ b/gdb/target.c
@@ -746,21 +746,35 @@ unpush_target (struct target_ops *t)
   return 1;
 }
 
+/* Unpush TARGET and assert that it worked.  */
+
+static void
+unpush_target_and_assert (struct target_ops *target)
+{
+  if (!unpush_target (target))
+    {
+      fprintf_unfiltered (gdb_stderr,
+			  "pop_all_targets couldn't find target %s\n",
+			  target->to_shortname);
+      internal_error (__FILE__, __LINE__,
+		      _("failed internal consistency check"));
+    }
+}
+
 void
 pop_all_targets_above (enum strata above_stratum)
 {
   while ((int) (current_target.to_stratum) > (int) above_stratum)
-    {
-      if (!unpush_target (target_stack))
-	{
-	  fprintf_unfiltered (gdb_stderr,
-			      "pop_all_targets couldn't find target %s\n",
-			      target_stack->to_shortname);
-	  internal_error (__FILE__, __LINE__,
-			  _("failed internal consistency check"));
-	  break;
-	}
-    }
+    unpush_target_and_assert (target_stack);
+}
+
+/* See target.h.  */
+
+void
+pop_all_targets_at_and_above (enum strata stratum)
+{
+  while ((int) (current_target.to_stratum) >= (int) stratum)
+    unpush_target_and_assert (target_stack);
 }
 
 void
diff --git a/gdb/target.h b/gdb/target.h
index 0105db2..e80bee5 100644
--- a/gdb/target.h
+++ b/gdb/target.h
@@ -2294,6 +2294,10 @@ extern void target_preopen (int);
 /* Does whatever cleanup is required to get rid of all pushed targets.  */
 extern void pop_all_targets (void);
 
+/* Like pop_all_targets, but pops only targets whose stratum is at or
+   above STRATUM.  */
+extern void pop_all_targets_at_and_above (enum strata stratum);
+
 /* Like pop_all_targets, but pops only targets whose stratum is
    strictly above ABOVE_STRATUM.  */
 extern void pop_all_targets_above (enum strata above_stratum);


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]