summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPedro Alves <palves@redhat.com>2019-06-07 22:45:09 +0100
committerPedro Alves <palves@redhat.com>2019-07-01 14:07:58 +0100
commitebcc5fb83fb0c6e98db2501c5868ba8cee6dd1f8 (patch)
tree87214c30bd185cb519d7aef6d14471608577581e
parentfd5bce2ea4716552ce9c3f9fdac7628cbf5a5cd2 (diff)
downloadbinutils-gdb-users/palves/format_strings-experiment.tar.gz
-rw-r--r--gdb/breakpoint.c14
-rw-r--r--gdb/infrun.c19
-rw-r--r--gdb/ui-out.c18
-rw-r--r--gdb/ui-out.h37
4 files changed, 65 insertions, 23 deletions
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index 77f416eb9ca..e2adb18a9fa 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -6193,10 +6193,9 @@ print_one_breakpoint_location (struct breakpoint *b,
&& breakpoint_condition_evaluation_mode ()
== condition_evaluation_target)
{
- uiout->text (" (");
- uiout->field_string ("evaluated-by",
- bp_condition_evaluator (b));
- uiout->text (" evals)");
+ uiout->message (" (%pF evals)",
+ string_field ("evaluated-by",
+ bp_condition_evaluator (b)));
}
uiout->text ("\n");
}
@@ -12752,10 +12751,9 @@ tracepoint_print_one_detail (const struct breakpoint *self,
{
gdb_assert (self->type == bp_static_tracepoint);
- uiout->text ("\tmarker id is ");
- uiout->field_string ("static-tracepoint-marker-string-id",
- tp->static_trace_marker_id);
- uiout->text ("\n");
+ uiout->message ("\tmarker id is %pF\n",
+ string_field ("static-tracepoint-marker-string-id",
+ tp->static_trace_marker_id));
}
}
diff --git a/gdb/infrun.c b/gdb/infrun.c
index 4fd92f1bac2..604015e1ef8 100644
--- a/gdb/infrun.c
+++ b/gdb/infrun.c
@@ -7641,24 +7641,19 @@ print_exited_reason (struct ui_out *uiout, int exitstatus)
{
if (uiout->is_mi_like_p ())
uiout->field_string ("reason", async_reason_lookup (EXEC_ASYNC_EXITED));
- uiout->text ("[Inferior ");
- uiout->text (plongest (inf->num));
- uiout->text (" (");
- uiout->text (pidstr.c_str ());
- uiout->text (") exited with code ");
- uiout->field_fmt ("exit-code", "0%o", (unsigned int) exitstatus);
- uiout->text ("]\n");
+ std::string exit_code_str
+ = string_printf ("0%o", (unsigned int) exitstatus);
+ uiout->message ("[Inferior %s (%s) exited with code %pF]\n",
+ plongest (inf->num), pidstr.c_str (),
+ string_field ("exit-code", exit_code_str.c_str ()));
}
else
{
if (uiout->is_mi_like_p ())
uiout->field_string
("reason", async_reason_lookup (EXEC_ASYNC_EXITED_NORMALLY));
- uiout->text ("[Inferior ");
- uiout->text (plongest (inf->num));
- uiout->text (" (");
- uiout->text (pidstr.c_str ());
- uiout->text (") exited normally]\n");
+ uiout->message ("[Inferior %s (%s) exited normally]\n",
+ plongest (inf->num), pidstr.c_str ());
}
}
diff --git a/gdb/ui-out.c b/gdb/ui-out.c
index 92e461f850e..86bb2f5289a 100644
--- a/gdb/ui-out.c
+++ b/gdb/ui-out.c
@@ -607,8 +607,22 @@ ui_out::vmessage (const char *format, va_list args)
{
case 'F':
{
- int_field_s *field = va_arg (args, int_field_s *);
- field_int (field->name, field->val);
+ base_field_s *bf = va_arg (args, base_field_s *);
+ switch (bf->kind)
+ {
+ case field_kind::INT:
+ {
+ auto *f = (int_field_s *) bf;
+ field_int (f->name, f->val);
+ }
+ break;
+ case field_kind::STRING:
+ {
+ auto *f = (string_field_s *) bf;
+ field_string (f->name, f->str);
+ }
+ break;
+ }
}
break;
case 's':
diff --git a/gdb/ui-out.h b/gdb/ui-out.h
index fbf9c9bd326..e682d44383e 100644
--- a/gdb/ui-out.h
+++ b/gdb/ui-out.h
@@ -68,11 +68,24 @@ enum ui_out_type
ui_out_type_list
};
+enum class field_kind
+ {
+ INT,
+ STRING,
+ };
+
/* An int field, to be passed to %pF in format strings. */
-struct int_field_s
+struct base_field_s
{
const char *name;
+ field_kind kind;
+};
+
+/* An int field, to be passed to %pF in format strings. */
+
+struct int_field_s : base_field_s
+{
int val;
};
@@ -85,10 +98,32 @@ int_field (const char *name, int val,
int_field_s &&tmp = {})
{
tmp.name = name;
+ tmp.kind = field_kind::INT;
tmp.val = val;
return &tmp;
}
+/* A string field, to be passed to %pF in format strings. */
+
+struct string_field_s : base_field_s
+{
+ const char *str;
+};
+
+/* Construct a temporary string_field_s on the caller's stack and
+ return a pointer to the constructed object. We use this because
+ it's not possible to pass a reference via va_args. */
+
+static inline string_field_s *
+string_field (const char *name, const char *str,
+ string_field_s &&tmp = {})
+{
+ tmp.name = name;
+ tmp.kind = field_kind::STRING;
+ tmp.str = str;
+ return &tmp;
+}
+
/* A styled string. */
struct styled_string_s