aboutsummaryrefslogtreecommitdiff
path: root/gdb/target
diff options
context:
space:
mode:
authorSimon Marchi <simon.marchi@efficios.com>2021-11-22 11:27:30 -0500
committerSimon Marchi <simon.marchi@polymtl.ca>2021-11-22 13:57:49 -0500
commit06de25b7af21eb1173d7b86c5c0f37aae5ec2674 (patch)
tree257ca777e7e7c96de2844956bb61256f1ed5e111 /gdb/target
parent7dca2ea7ff4c2c786119e13e81a5e6b0c1bf1d2d (diff)
downloadbinutils-06de25b7af21eb1173d7b86c5c0f37aae5ec2674.zip
binutils-06de25b7af21eb1173d7b86c5c0f37aae5ec2674.tar.gz
binutils-06de25b7af21eb1173d7b86c5c0f37aae5ec2674.tar.bz2
gdb: introduce target_waitkind_str, use it in target_waitstatus::to_string
I would like to print target_waitkind values in debug messages, so I think that a target_waitkind-to-string function would be useful. While at it, use it in target_waitstatus::to_string. This changes the output of target_waitstatus::to_string a bit, but I think it is for the better. The debug messages will show a string matching exactly the target_waitkind enumerator (minus the TARGET_WAITKIND prefix). As a convenience, make string_appendf return the same reference to string it got as a parameter. This allows doing this: return string_appendf (str, "foo"); ... keeping the code concise. Change-Id: I383dffc9c78614e7d0668b1516073905e798eef7
Diffstat (limited to 'gdb/target')
-rw-r--r--gdb/target/waitstatus.c66
-rw-r--r--gdb/target/waitstatus.h49
2 files changed, 71 insertions, 44 deletions
diff --git a/gdb/target/waitstatus.c b/gdb/target/waitstatus.c
index 2293d83..a7209e3 100644
--- a/gdb/target/waitstatus.c
+++ b/gdb/target/waitstatus.c
@@ -20,73 +20,51 @@
#include "gdbsupport/common-defs.h"
#include "waitstatus.h"
-/* Return a pretty printed form of target_waitstatus. */
+/* See waitstatus.h. */
std::string
target_waitstatus::to_string () const
{
- const char *kind_str = "status->kind = ";
+ std::string str = string_printf
+ ("status->kind = %s", target_waitkind_str (this->kind ()));
+/* Make sure the compiler warns if a new TARGET_WAITKIND enumerator is added
+ but not handled here. */
+#pragma GCC diagnostic push
+#pragma GCC diagnostic error "-Wswitch"
switch (this->kind ())
{
case TARGET_WAITKIND_EXITED:
- return string_printf ("%sexited, status = %d",
- kind_str, this->exit_status ());
+ case TARGET_WAITKIND_THREAD_EXITED:
+ return string_appendf (str, ", exit_status = %d", this->exit_status ());
case TARGET_WAITKIND_STOPPED:
- return string_printf ("%sstopped, signal = %s",
- kind_str,
- gdb_signal_to_symbol_string (this->sig ()));
-
case TARGET_WAITKIND_SIGNALLED:
- return string_printf ("%ssignalled, signal = %s",
- kind_str,
- gdb_signal_to_symbol_string (this->sig ()));
-
- case TARGET_WAITKIND_LOADED:
- return string_printf ("%sloaded", kind_str);
+ return string_appendf (str, ", sig = %s",
+ gdb_signal_to_symbol_string (this->sig ()));
case TARGET_WAITKIND_FORKED:
- return string_printf ("%sforked, child_ptid = %s", kind_str,
- this->child_ptid ().to_string ().c_str ());
-
case TARGET_WAITKIND_VFORKED:
- return string_printf ("%svforked, child_ptid = %s", kind_str,
- this->child_ptid ().to_string ().c_str ());
+ return string_appendf (str, ", child_ptid = %s",
+ this->child_ptid ().to_string ().c_str ());
case TARGET_WAITKIND_EXECD:
- return string_printf ("%sexecd, execd_pathname = %s", kind_str,
- this->execd_pathname ());
+ return string_appendf (str, ", execd_pathname = %s",
+ this->execd_pathname ());
+ case TARGET_WAITKIND_LOADED:
case TARGET_WAITKIND_VFORK_DONE:
- return string_printf ("%svfork-done", kind_str);
-
+ case TARGET_WAITKIND_SPURIOUS:
case TARGET_WAITKIND_SYSCALL_ENTRY:
- return string_printf ("%sentered syscall", kind_str);
-
case TARGET_WAITKIND_SYSCALL_RETURN:
- return string_printf ("%sexited syscall", kind_str);
-
- case TARGET_WAITKIND_SPURIOUS:
- return string_printf ("%sspurious", kind_str);
-
case TARGET_WAITKIND_IGNORE:
- return string_printf ("%signore", kind_str);
-
case TARGET_WAITKIND_NO_HISTORY:
- return string_printf ("%sno-history", kind_str);
-
case TARGET_WAITKIND_NO_RESUMED:
- return string_printf ("%sno-resumed", kind_str);
-
case TARGET_WAITKIND_THREAD_CREATED:
- return string_printf ("%sthread created", kind_str);
-
- case TARGET_WAITKIND_THREAD_EXITED:
- return string_printf ("%sthread exited, status = %d",
- kind_str, this->exit_status ());
-
- default:
- return string_printf ("%sunknown???", kind_str);
+ return str;
}
+#pragma GCC diagnostic pop
+
+ gdb_assert_not_reached ("invalid target_waitkind value: %d",
+ (int) this->kind ());
}
diff --git a/gdb/target/waitstatus.h b/gdb/target/waitstatus.h
index f5b050b..48405d2 100644
--- a/gdb/target/waitstatus.h
+++ b/gdb/target/waitstatus.h
@@ -101,6 +101,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. */
+#pragma GCC diagnostic push
+#pragma GCC diagnostic error "-Wswitch"
+ 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";
+ };
+#pragma GCC diagnostic pop
+
+ gdb_assert_not_reached ("invalid target_waitkind value: %d\n", (int) kind);
+}
+
struct target_waitstatus
{
/* Default constructor. */