Index: gdb/ax-general.c |
diff --git a/gdb/ax-general.c b/gdb/ax-general.c |
index 4f1ea207af35173f2f9eb670412207e6d53f960d..6ea6f145566384903815381a5133cfd3c4a2c6aa 100644 |
--- a/gdb/ax-general.c |
+++ b/gdb/ax-general.c |
@@ -330,6 +330,30 @@ ax_tsv (struct agent_expr *x, enum agent_op op, int num) |
x->buf[x->len + 2] = (num) & 0xff; |
x->len += 3; |
} |
+ |
+/* Append a string to the expression. Note that the string is going |
+ into the bytecodes directly, not on the stack. As a precaution, |
+ include both length as prefix, and terminate with a NUL. (The NUL |
+ is counted in the length.) */ |
+ |
+void |
+ax_string (struct agent_expr *x, char *str, int slen) |
+{ |
+ int i; |
+ |
+ /* Make sure the string length is reasonable. */ |
+ if (slen < 0 || slen > 0xffff) |
+ internal_error (__FILE__, __LINE__, |
+ _("ax-general.c (ax_string): string " |
+ "length is %d, out of allowed range"), slen); |
+ |
+ grow_expr (x, 2 + slen + 1); |
+ x->buf[x->len++] = ((slen + 1) >> 8) & 0xff; |
+ x->buf[x->len++] = (slen + 1) & 0xff; |
+ for (i = 0; i < slen; ++i) |
+ x->buf[x->len++] = str[i]; |
+ x->buf[x->len++] = '\0'; |
+} |
@@ -391,6 +415,19 @@ ax_print (struct ui_file *f, struct agent_expr *x) |
print_longest (f, 'd', 0, |
read_const (x, i + 1, aop_map[op].op_size)); |
} |
+ /* Handle the complicated printf arguments specially. */ |
+ else if (op == aop_printf) |
+ { |
+ int slen, nargs; |
+ |
+ i++; |
+ nargs = x->buf[i++]; |
+ slen = x->buf[i++]; |
+ slen = slen * 256 + x->buf[i++]; |
+ fprintf_filtered (f, _(" \"%s\", %d args"), |
+ &(x->buf[i]), nargs); |
+ i += slen - 1; |
+ } |
fprintf_filtered (f, "\n"); |
i += 1 + aop_map[op].op_size; |