gdb/linux-tdep.c: Add Perms to the 'info proc mappings' output
[binutils-gdb.git] / gdb / target / waitstatus.h
index 333863e6d6e5599626d74ea21ee0936642fe5764..7b5faed83c757f7f9a611f3729061a3fed987d3a 100644 (file)
@@ -1,6 +1,6 @@
 /* Target waitstatus definitions and prototypes.
 
-   Copyright (C) 1990-2021 Free Software Foundation, Inc.
+   Copyright (C) 1990-2022 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -20,6 +20,7 @@
 #ifndef TARGET_WAITSTATUS_H
 #define TARGET_WAITSTATUS_H
 
+#include "diagnostics.h"
 #include "gdbsupport/gdb_signals.h"
 
 /* Stuff for target_wait.  */
@@ -101,6 +102,55 @@ enum target_waitkind
   TARGET_WAITKIND_THREAD_EXITED,
 };
 
+/* Return KIND as a string.  */
+
+static inline const char *
+target_waitkind_str (target_waitkind kind)
+{
+/* Make sure the compiler warns if a new TARGET_WAITKIND enumerator is added
+   but not handled here.  */
+DIAGNOSTIC_PUSH
+DIAGNOSTIC_ERROR_SWITCH
+  switch (kind)
+  {
+    case TARGET_WAITKIND_EXITED:
+      return "EXITED";
+    case TARGET_WAITKIND_STOPPED:
+      return "STOPPED";
+    case TARGET_WAITKIND_SIGNALLED:
+      return "SIGNALLED";
+    case TARGET_WAITKIND_LOADED:
+      return "LOADED";
+    case TARGET_WAITKIND_FORKED:
+      return "FORKED";
+    case TARGET_WAITKIND_VFORKED:
+      return "VFORKED";
+    case TARGET_WAITKIND_EXECD:
+      return "EXECD";
+    case TARGET_WAITKIND_VFORK_DONE:
+      return "VFORK_DONE";
+    case TARGET_WAITKIND_SYSCALL_ENTRY:
+      return "SYSCALL_ENTRY";
+    case TARGET_WAITKIND_SYSCALL_RETURN:
+      return "SYSCALL_RETURN";
+    case TARGET_WAITKIND_SPURIOUS:
+      return "SPURIOUS";
+    case TARGET_WAITKIND_IGNORE:
+      return "IGNORE";
+    case TARGET_WAITKIND_NO_HISTORY:
+      return "NO_HISTORY";
+    case TARGET_WAITKIND_NO_RESUMED:
+      return "NO_RESUMED";
+    case TARGET_WAITKIND_THREAD_CREATED:
+      return "THREAD_CREATED";
+    case TARGET_WAITKIND_THREAD_EXITED:
+      return "THREAD_EXITED";
+  };
+DIAGNOSTIC_POP
+
+  gdb_assert_not_reached ("invalid target_waitkind value: %d\n", (int) kind);
+}
+
 struct target_waitstatus
 {
   /* Default constructor.  */
@@ -169,109 +219,125 @@ struct target_waitstatus
 
   /* Setters: set the wait status kind plus any associated data.  */
 
-  void set_exited (int exit_status)
+  target_waitstatus &set_exited (int exit_status)
   {
     this->reset ();
     m_kind = TARGET_WAITKIND_EXITED;
     m_value.exit_status = exit_status;
+    return *this;
   }
 
-  void set_stopped (gdb_signal sig)
+  target_waitstatus &set_stopped (gdb_signal sig)
   {
     this->reset ();
     m_kind = TARGET_WAITKIND_STOPPED;
     m_value.sig = sig;
+    return *this;
   }
 
-  void set_signalled (gdb_signal sig)
+  target_waitstatus &set_signalled (gdb_signal sig)
   {
     this->reset ();
     m_kind = TARGET_WAITKIND_SIGNALLED;
     m_value.sig = sig;
+    return *this;
   }
 
-  void set_loaded ()
+  target_waitstatus &set_loaded ()
   {
     this->reset ();
     m_kind = TARGET_WAITKIND_LOADED;
+    return *this;
   }
 
-  void set_forked (ptid_t child_ptid)
+  target_waitstatus &set_forked (ptid_t child_ptid)
   {
     this->reset ();
     m_kind = TARGET_WAITKIND_FORKED;
     m_value.child_ptid = child_ptid;
+    return *this;
   }
 
-  void set_vforked (ptid_t child_ptid)
+  target_waitstatus &set_vforked (ptid_t child_ptid)
   {
     this->reset ();
     m_kind = TARGET_WAITKIND_VFORKED;
     m_value.child_ptid = child_ptid;
+    return *this;
   }
 
-  void set_execd (gdb::unique_xmalloc_ptr<char> execd_pathname)
+  target_waitstatus &set_execd (gdb::unique_xmalloc_ptr<char> execd_pathname)
   {
     this->reset ();
     m_kind = TARGET_WAITKIND_EXECD;
     m_value.execd_pathname = execd_pathname.release ();
+    return *this;
   }
 
-  void set_vfork_done ()
+  target_waitstatus &set_vfork_done ()
   {
     this->reset ();
     m_kind = TARGET_WAITKIND_VFORK_DONE;
+    return *this;
   }
 
-  void set_syscall_entry (int syscall_number)
+  target_waitstatus &set_syscall_entry (int syscall_number)
   {
     this->reset ();
     m_kind = TARGET_WAITKIND_SYSCALL_ENTRY;
     m_value.syscall_number = syscall_number;
+    return *this;
   }
 
-  void set_syscall_return (int syscall_number)
+  target_waitstatus &set_syscall_return (int syscall_number)
   {
     this->reset ();
     m_kind = TARGET_WAITKIND_SYSCALL_RETURN;
     m_value.syscall_number = syscall_number;
+    return *this;
   }
 
-  void set_spurious ()
+  target_waitstatus &set_spurious ()
   {
     this->reset ();
     m_kind = TARGET_WAITKIND_SPURIOUS;
+    return *this;
   }
 
-  void set_ignore ()
+  target_waitstatus &set_ignore ()
   {
     this->reset ();
     m_kind = TARGET_WAITKIND_IGNORE;
+    return *this;
   }
 
-  void set_no_history ()
+  target_waitstatus &set_no_history ()
   {
     this->reset ();
     m_kind = TARGET_WAITKIND_NO_HISTORY;
+    return *this;
   }
 
-  void set_no_resumed ()
+  target_waitstatus &set_no_resumed ()
   {
     this->reset ();
     m_kind = TARGET_WAITKIND_NO_RESUMED;
+    return *this;
   }
 
-  void set_thread_created ()
+  target_waitstatus &set_thread_created ()
   {
     this->reset ();
     m_kind = TARGET_WAITKIND_THREAD_CREATED;
+    return *this;
   }
 
-  void set_thread_exited (int exit_status)
+  target_waitstatus &set_thread_exited (int exit_status)
   {
     this->reset ();
     m_kind = TARGET_WAITKIND_THREAD_EXITED;
     m_value.exit_status = exit_status;
+    return *this;
   }
 
   /* Get the kind of this wait status.  */
@@ -321,6 +387,12 @@ struct target_waitstatus
     return m_value.syscall_number;
   }
 
+  /* Return a pretty printed form of target_waitstatus.
+
+     This is only meant to be used in debug messages, not for user-visible
+     messages.  */
+  std::string to_string () const;
+
 private:
   /* Reset the wait status to its original state.  */
   void reset ()
@@ -371,9 +443,4 @@ enum target_stop_reason
   TARGET_STOPPED_BY_SINGLE_STEP
 };
 
-/* Prototypes */
-
-/* Return a pretty printed form of target_waitstatus.  */
-std::string target_waitstatus_to_string (const struct target_waitstatus *);
-
 #endif /* TARGET_WAITSTATUS_H */