/* 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.
#ifndef TARGET_WAITSTATUS_H
#define TARGET_WAITSTATUS_H
+#include "diagnostics.h"
#include "gdbsupport/gdb_signals.h"
/* Stuff for target_wait. */
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. */
/* 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. */
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 ()
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 */