From ebcc5fb83fb0c6e98db2501c5868ba8cee6dd1f8 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Fri, 7 Jun 2019 22:45:09 +0100 Subject: string_field --- gdb/breakpoint.c | 14 ++++++-------- gdb/infrun.c | 19 +++++++------------ gdb/ui-out.c | 18 ++++++++++++++++-- gdb/ui-out.h | 37 ++++++++++++++++++++++++++++++++++++- 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 -- cgit v1.2.1