gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gdb / ax-general.c
CommitLineData
c906108c 1/* Functions for manipulating expressions designed to be executed on the agent
b811d2c2 2 Copyright (C) 1998-2020 Free Software Foundation, Inc.
c906108c 3
c5aa993b 4 This file is part of GDB.
c906108c 5
c5aa993b
JM
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
a9762ec7 8 the Free Software Foundation; either version 3 of the License, or
c5aa993b 9 (at your option) any later version.
c906108c 10
c5aa993b
JM
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
c906108c 15
c5aa993b 16 You should have received a copy of the GNU General Public License
a9762ec7 17 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c 18
c906108c
SS
19/* Despite what the above comment says about this file being part of
20 GDB, we would like to keep these functions free of GDB
21 dependencies, since we want to be able to use them in contexts
22 outside of GDB (test suites, the stub, etc.) */
23
24#include "defs.h"
d55e5aa6 25#include "ax.h"
0d12e84c 26#include "gdbarch.h"
4de283e4 27
d55e5aa6 28#include "value.h"
4de283e4 29#include "user-regs.h"
175ff332 30
a14ed312 31static void grow_expr (struct agent_expr *x, int n);
392a587b 32
a14ed312 33static void append_const (struct agent_expr *x, LONGEST val, int n);
392a587b 34
a14ed312 35static LONGEST read_const (struct agent_expr *x, int o, int n);
392a587b 36
a14ed312 37static void generic_ext (struct agent_expr *x, enum agent_op op, int n);
c906108c
SS
38\f
39/* Functions for building expressions. */
40
833177a4 41agent_expr::agent_expr (struct gdbarch *gdbarch, CORE_ADDR scope)
c906108c 42{
833177a4
PA
43 this->len = 0;
44 this->size = 1; /* Change this to a larger value once
c906108c 45 reallocation code is tested. */
833177a4 46 this->buf = (unsigned char *) xmalloc (this->size);
35c9c7ba 47
833177a4
PA
48 this->gdbarch = gdbarch;
49 this->scope = scope;
c906108c 50
35c9c7ba 51 /* Bit vector for registers used. */
833177a4
PA
52 this->reg_mask_len = 1;
53 this->reg_mask = XCNEWVEC (unsigned char, this->reg_mask_len);
92bc6a20 54
833177a4
PA
55 this->tracing = 0;
56 this->trace_string = 0;
c906108c
SS
57}
58
833177a4 59agent_expr::~agent_expr ()
f23d52e0 60{
833177a4
PA
61 xfree (this->buf);
62 xfree (this->reg_mask);
f23d52e0
AC
63}
64
c906108c
SS
65/* Make sure that X has room for at least N more bytes. This doesn't
66 affect the length, just the allocated size. */
67static void
fba45db2 68grow_expr (struct agent_expr *x, int n)
c906108c
SS
69{
70 if (x->len + n > x->size)
71 {
72 x->size *= 2;
73 if (x->size < x->len + n)
74 x->size = x->len + n + 10;
224c3ddb 75 x->buf = (unsigned char *) xrealloc (x->buf, x->size);
c906108c
SS
76 }
77}
78
79
80/* Append the low N bytes of VAL as an N-byte integer to the
81 expression X, in big-endian order. */
82static void
fba45db2 83append_const (struct agent_expr *x, LONGEST val, int n)
c906108c
SS
84{
85 int i;
86
87 grow_expr (x, n);
88 for (i = n - 1; i >= 0; i--)
89 {
90 x->buf[x->len + i] = val & 0xff;
91 val >>= 8;
92 }
93 x->len += n;
94}
95
96
97/* Extract an N-byte big-endian unsigned integer from expression X at
98 offset O. */
99static LONGEST
fba45db2 100read_const (struct agent_expr *x, int o, int n)
c906108c
SS
101{
102 int i;
103 LONGEST accum = 0;
104
105 /* Make sure we're not reading off the end of the expression. */
106 if (o + n > x->len)
3d263c1d 107 error (_("GDB bug: ax-general.c (read_const): incomplete constant"));
c906108c
SS
108
109 for (i = 0; i < n; i++)
110 accum = (accum << 8) | x->buf[o + i];
c5aa993b 111
c906108c
SS
112 return accum;
113}
114
70b8286a
SM
115/* See ax.h. */
116
117void
118ax_raw_byte (struct agent_expr *x, gdb_byte byte)
119{
120 grow_expr (x, 1);
121 x->buf[x->len++] = byte;
122}
c906108c
SS
123
124/* Append a simple operator OP to EXPR. */
125void
fba45db2 126ax_simple (struct agent_expr *x, enum agent_op op)
c906108c 127{
70b8286a 128 ax_raw_byte (x, op);
c906108c
SS
129}
130
c7f96d2b
TT
131/* Append a pick operator to EXPR. DEPTH is the stack item to pick,
132 with 0 being top of stack. */
2b52013f 133
c7f96d2b
TT
134void
135ax_pick (struct agent_expr *x, int depth)
136{
137 if (depth < 0 || depth > 255)
138 error (_("GDB bug: ax-general.c (ax_pick): stack depth out of range"));
139 ax_simple (x, aop_pick);
140 append_const (x, 1, depth);
141}
142
c906108c
SS
143
144/* Append a sign-extension or zero-extension instruction to EXPR, to
145 extend an N-bit value. */
146static void
fba45db2 147generic_ext (struct agent_expr *x, enum agent_op op, int n)
c906108c
SS
148{
149 /* N must fit in a byte. */
150 if (n < 0 || n > 255)
3d263c1d 151 error (_("GDB bug: ax-general.c (generic_ext): bit count out of range"));
c906108c
SS
152 /* That had better be enough range. */
153 if (sizeof (LONGEST) * 8 > 255)
3e43a32a
MS
154 error (_("GDB bug: ax-general.c (generic_ext): "
155 "opcode has inadequate range"));
c906108c
SS
156
157 grow_expr (x, 2);
158 x->buf[x->len++] = op;
159 x->buf[x->len++] = n;
160}
161
162
163/* Append a sign-extension instruction to EXPR, to extend an N-bit value. */
164void
fba45db2 165ax_ext (struct agent_expr *x, int n)
c906108c
SS
166{
167 generic_ext (x, aop_ext, n);
168}
169
170
171/* Append a zero-extension instruction to EXPR, to extend an N-bit value. */
172void
fba45db2 173ax_zero_ext (struct agent_expr *x, int n)
c906108c
SS
174{
175 generic_ext (x, aop_zero_ext, n);
176}
177
178
179/* Append a trace_quick instruction to EXPR, to record N bytes. */
180void
fba45db2 181ax_trace_quick (struct agent_expr *x, int n)
c906108c
SS
182{
183 /* N must fit in a byte. */
184 if (n < 0 || n > 255)
3e43a32a
MS
185 error (_("GDB bug: ax-general.c (ax_trace_quick): "
186 "size out of range for trace_quick"));
c906108c
SS
187
188 grow_expr (x, 2);
189 x->buf[x->len++] = aop_trace_quick;
190 x->buf[x->len++] = n;
191}
192
193
194/* Append a goto op to EXPR. OP is the actual op (must be aop_goto or
195 aop_if_goto). We assume we don't know the target offset yet,
196 because it's probably a forward branch, so we leave space in EXPR
197 for the target, and return the offset in EXPR of that space, so we
198 can backpatch it once we do know the target offset. Use ax_label
199 to do the backpatching. */
c5aa993b 200int
fba45db2 201ax_goto (struct agent_expr *x, enum agent_op op)
c906108c
SS
202{
203 grow_expr (x, 3);
204 x->buf[x->len + 0] = op;
205 x->buf[x->len + 1] = 0xff;
206 x->buf[x->len + 2] = 0xff;
207 x->len += 3;
208 return x->len - 2;
209}
210
211/* Suppose a given call to ax_goto returns some value PATCH. When you
212 know the offset TARGET that goto should jump to, call
c5aa993b 213 ax_label (EXPR, PATCH, TARGET)
c906108c
SS
214 to patch TARGET into the ax_goto instruction. */
215void
fba45db2 216ax_label (struct agent_expr *x, int patch, int target)
c906108c
SS
217{
218 /* Make sure the value is in range. Don't accept 0xffff as an
219 offset; that's our magic sentinel value for unpatched branches. */
220 if (target < 0 || target >= 0xffff)
3d263c1d 221 error (_("GDB bug: ax-general.c (ax_label): label target out of range"));
c5aa993b 222
c906108c
SS
223 x->buf[patch] = (target >> 8) & 0xff;
224 x->buf[patch + 1] = target & 0xff;
225}
226
227
228/* Assemble code to push a constant on the stack. */
229void
fba45db2 230ax_const_l (struct agent_expr *x, LONGEST l)
c906108c
SS
231{
232 static enum agent_op ops[]
c5aa993b
JM
233 =
234 {aop_const8, aop_const16, aop_const32, aop_const64};
c906108c
SS
235 int size;
236 int op;
237
238 /* How big is the number? 'op' keeps track of which opcode to use.
239 Notice that we don't really care whether the original number was
240 signed or unsigned; we always reproduce the value exactly, and
241 use the shortest representation. */
242 for (op = 0, size = 8; size < 64; size *= 2, op++)
44a81774 243 {
cf3e25ca 244 LONGEST lim = ((LONGEST) 1) << (size - 1);
44a81774
JB
245
246 if (-lim <= l && l <= lim - 1)
247 break;
248 }
c906108c 249
0e2de366 250 /* Emit the right opcode... */
c906108c
SS
251 ax_simple (x, ops[op]);
252
253 /* Emit the low SIZE bytes as an unsigned number. We know that
254 sign-extending this will yield l. */
255 append_const (x, l, size / 8);
256
257 /* Now, if it was negative, and not full-sized, sign-extend it. */
258 if (l < 0 && size < 64)
259 ax_ext (x, size);
260}
261
262
263void
fba45db2 264ax_const_d (struct agent_expr *x, LONGEST d)
c906108c
SS
265{
266 /* FIXME: floating-point support not present yet. */
3e43a32a
MS
267 error (_("GDB bug: ax-general.c (ax_const_d): "
268 "floating point not supported yet"));
c906108c
SS
269}
270
271
272/* Assemble code to push the value of register number REG on the
273 stack. */
c5aa993b 274void
fba45db2 275ax_reg (struct agent_expr *x, int reg)
c906108c 276{
175ff332
HZ
277 if (reg >= gdbarch_num_regs (x->gdbarch))
278 {
279 /* This is a pseudo-register. */
280 if (!gdbarch_ax_pseudo_register_push_stack_p (x->gdbarch))
281 error (_("'%s' is a pseudo-register; "
282 "GDB cannot yet trace its contents."),
283 user_reg_map_regnum_to_name (x->gdbarch, reg));
284 if (gdbarch_ax_pseudo_register_push_stack (x->gdbarch, x, reg))
285 error (_("Trace '%s' failed."),
286 user_reg_map_regnum_to_name (x->gdbarch, reg));
287 }
288 else
289 {
1eb7c2d8
AT
290 /* Get the remote register number. */
291 reg = gdbarch_remote_register_number (x->gdbarch, reg);
292
175ff332
HZ
293 /* Make sure the register number is in range. */
294 if (reg < 0 || reg > 0xffff)
3e43a32a
MS
295 error (_("GDB bug: ax-general.c (ax_reg): "
296 "register number out of range"));
175ff332
HZ
297 grow_expr (x, 3);
298 x->buf[x->len] = aop_reg;
299 x->buf[x->len + 1] = (reg >> 8) & 0xff;
300 x->buf[x->len + 2] = (reg) & 0xff;
301 x->len += 3;
302 }
c906108c 303}
f61e138d
SS
304
305/* Assemble code to operate on a trace state variable. */
306
307void
308ax_tsv (struct agent_expr *x, enum agent_op op, int num)
309{
310 /* Make sure the tsv number is in range. */
311 if (num < 0 || num > 0xffff)
3e43a32a
MS
312 internal_error (__FILE__, __LINE__,
313 _("ax-general.c (ax_tsv): variable "
314 "number is %d, out of range"), num);
f61e138d
SS
315
316 grow_expr (x, 3);
317 x->buf[x->len] = op;
318 x->buf[x->len + 1] = (num >> 8) & 0xff;
319 x->buf[x->len + 2] = (num) & 0xff;
320 x->len += 3;
321}
d3ce09f5
SS
322
323/* Append a string to the expression. Note that the string is going
324 into the bytecodes directly, not on the stack. As a precaution,
325 include both length as prefix, and terminate with a NUL. (The NUL
326 is counted in the length.) */
327
328void
741d92cf 329ax_string (struct agent_expr *x, const char *str, int slen)
d3ce09f5
SS
330{
331 int i;
332
333 /* Make sure the string length is reasonable. */
334 if (slen < 0 || slen > 0xffff)
335 internal_error (__FILE__, __LINE__,
336 _("ax-general.c (ax_string): string "
337 "length is %d, out of allowed range"), slen);
338
339 grow_expr (x, 2 + slen + 1);
340 x->buf[x->len++] = ((slen + 1) >> 8) & 0xff;
341 x->buf[x->len++] = (slen + 1) & 0xff;
342 for (i = 0; i < slen; ++i)
343 x->buf[x->len++] = str[i];
344 x->buf[x->len++] = '\0';
345}
c5aa993b 346\f
c906108c
SS
347
348
c906108c
SS
349/* Functions for disassembling agent expressions, and otherwise
350 debugging the expression compiler. */
351
c5aa993b
JM
352struct aop_map aop_map[] =
353{
94d5e490
TT
354 {0, 0, 0, 0, 0}
355#define DEFOP(NAME, SIZE, DATA_SIZE, CONSUMED, PRODUCED, VALUE) \
356 , { # NAME, SIZE, DATA_SIZE, CONSUMED, PRODUCED }
268a13a5 357#include "gdbsupport/ax.def"
94d5e490 358#undef DEFOP
c906108c
SS
359};
360
361
362/* Disassemble the expression EXPR, writing to F. */
363void
fba45db2 364ax_print (struct ui_file *f, struct agent_expr *x)
c906108c
SS
365{
366 int i;
c906108c 367
35c9c7ba
SS
368 fprintf_filtered (f, _("Scope: %s\n"), paddress (x->gdbarch, x->scope));
369 fprintf_filtered (f, _("Reg mask:"));
370 for (i = 0; i < x->reg_mask_len; ++i)
371 fprintf_filtered (f, _(" %02x"), x->reg_mask[i]);
372 fprintf_filtered (f, _("\n"));
373
c906108c
SS
374 /* Check the size of the name array against the number of entries in
375 the enum, to catch additions that people didn't sync. */
376 if ((sizeof (aop_map) / sizeof (aop_map[0]))
377 != aop_last)
3d263c1d 378 error (_("GDB bug: ax-general.c (ax_print): opcode map out of sync"));
c5aa993b
JM
379
380 for (i = 0; i < x->len;)
c906108c 381 {
aead7601 382 enum agent_op op = (enum agent_op) x->buf[i];
c906108c
SS
383
384 if (op >= (sizeof (aop_map) / sizeof (aop_map[0]))
c5aa993b 385 || !aop_map[op].name)
c906108c 386 {
3d263c1d 387 fprintf_filtered (f, _("%3d <bad opcode %02x>\n"), i, op);
c906108c
SS
388 i++;
389 continue;
390 }
a04b0428 391 if (i + 1 + aop_map[op].op_size > x->len)
c906108c 392 {
3d263c1d 393 fprintf_filtered (f, _("%3d <incomplete opcode %s>\n"),
c906108c
SS
394 i, aop_map[op].name);
395 break;
396 }
397
398 fprintf_filtered (f, "%3d %s", i, aop_map[op].name);
a04b0428 399 if (aop_map[op].op_size > 0)
c906108c
SS
400 {
401 fputs_filtered (" ", f);
c5aa993b 402
c906108c 403 print_longest (f, 'd', 0,
a04b0428 404 read_const (x, i + 1, aop_map[op].op_size));
c906108c 405 }
d3ce09f5
SS
406 /* Handle the complicated printf arguments specially. */
407 else if (op == aop_printf)
408 {
409 int slen, nargs;
410
411 i++;
412 nargs = x->buf[i++];
413 slen = x->buf[i++];
414 slen = slen * 256 + x->buf[i++];
415 fprintf_filtered (f, _(" \"%s\", %d args"),
416 &(x->buf[i]), nargs);
417 i += slen - 1;
418 }
c906108c 419 fprintf_filtered (f, "\n");
a04b0428 420 i += 1 + aop_map[op].op_size;
c906108c
SS
421 }
422}
423
35c9c7ba
SS
424/* Add register REG to the register mask for expression AX. */
425void
426ax_reg_mask (struct agent_expr *ax, int reg)
427{
175ff332 428 if (reg >= gdbarch_num_regs (ax->gdbarch))
35c9c7ba 429 {
175ff332
HZ
430 /* This is a pseudo-register. */
431 if (!gdbarch_ax_pseudo_register_collect_p (ax->gdbarch))
432 error (_("'%s' is a pseudo-register; "
433 "GDB cannot yet trace its contents."),
434 user_reg_map_regnum_to_name (ax->gdbarch, reg));
435 if (gdbarch_ax_pseudo_register_collect (ax->gdbarch, ax, reg))
436 error (_("Trace '%s' failed."),
437 user_reg_map_regnum_to_name (ax->gdbarch, reg));
438 }
439 else
440 {
1eb7c2d8
AT
441 int byte;
442
443 /* Get the remote register number. */
444 reg = gdbarch_remote_register_number (ax->gdbarch, reg);
445 byte = reg / 8;
175ff332
HZ
446
447 /* Grow the bit mask if necessary. */
448 if (byte >= ax->reg_mask_len)
449 {
450 /* It's not appropriate to double here. This isn't a
451 string buffer. */
452 int new_len = byte + 1;
224c3ddb
SM
453 unsigned char *new_reg_mask
454 = XRESIZEVEC (unsigned char, ax->reg_mask, new_len);
455
175ff332
HZ
456 memset (new_reg_mask + ax->reg_mask_len, 0,
457 (new_len - ax->reg_mask_len) * sizeof (ax->reg_mask[0]));
458 ax->reg_mask_len = new_len;
459 ax->reg_mask = new_reg_mask;
460 }
461
462 ax->reg_mask[byte] |= 1 << (reg % 8);
35c9c7ba 463 }
35c9c7ba
SS
464}
465
466/* Given an agent expression AX, fill in requirements and other descriptive
467 bits. */
c906108c 468void
35c9c7ba 469ax_reqs (struct agent_expr *ax)
c906108c
SS
470{
471 int i;
472 int height;
473
3d269a59
JB
474 /* Jump target table. targets[i] is non-zero iff we have found a
475 jump to offset i. */
c906108c
SS
476 char *targets = (char *) alloca (ax->len * sizeof (targets[0]));
477
3d269a59
JB
478 /* Instruction boundary table. boundary[i] is non-zero iff our scan
479 has reached an instruction starting at offset i. */
c906108c
SS
480 char *boundary = (char *) alloca (ax->len * sizeof (boundary[0]));
481
3d269a59 482 /* Stack height record. If either targets[i] or boundary[i] is
c906108c
SS
483 non-zero, heights[i] is the height the stack should have before
484 executing the bytecode at that point. */
485 int *heights = (int *) alloca (ax->len * sizeof (heights[0]));
486
487 /* Pointer to a description of the present op. */
488 struct aop_map *op;
489
c906108c
SS
490 memset (targets, 0, ax->len * sizeof (targets[0]));
491 memset (boundary, 0, ax->len * sizeof (boundary[0]));
492
35c9c7ba
SS
493 ax->max_height = ax->min_height = height = 0;
494 ax->flaw = agent_flaw_none;
495 ax->max_data_size = 0;
c906108c 496
a04b0428 497 for (i = 0; i < ax->len; i += 1 + op->op_size)
c906108c
SS
498 {
499 if (ax->buf[i] > (sizeof (aop_map) / sizeof (aop_map[0])))
500 {
35c9c7ba 501 ax->flaw = agent_flaw_bad_instruction;
c906108c
SS
502 return;
503 }
504
505 op = &aop_map[ax->buf[i]];
506
c5aa993b 507 if (!op->name)
c906108c 508 {
35c9c7ba 509 ax->flaw = agent_flaw_bad_instruction;
c906108c
SS
510 return;
511 }
c5aa993b 512
a04b0428 513 if (i + 1 + op->op_size > ax->len)
c906108c 514 {
35c9c7ba 515 ax->flaw = agent_flaw_incomplete_instruction;
c906108c
SS
516 return;
517 }
518
3d269a59
JB
519 /* If this instruction is a forward jump target, does the
520 current stack height match the stack height at the jump
521 source? */
c906108c
SS
522 if (targets[i] && (heights[i] != height))
523 {
35c9c7ba 524 ax->flaw = agent_flaw_height_mismatch;
c906108c
SS
525 return;
526 }
527
528 boundary[i] = 1;
529 heights[i] = height;
530
a04b0428 531 height -= op->consumed;
35c9c7ba
SS
532 if (height < ax->min_height)
533 ax->min_height = height;
c906108c 534 height += op->produced;
35c9c7ba
SS
535 if (height > ax->max_height)
536 ax->max_height = height;
c906108c 537
35c9c7ba
SS
538 if (op->data_size > ax->max_data_size)
539 ax->max_data_size = op->data_size;
c906108c
SS
540
541 /* For jump instructions, check that the target is a valid
c5aa993b
JM
542 offset. If it is, record the fact that that location is a
543 jump target, and record the height we expect there. */
c906108c
SS
544 if (aop_goto == op - aop_map
545 || aop_if_goto == op - aop_map)
546 {
547 int target = read_const (ax, i + 1, 2);
548 if (target < 0 || target >= ax->len)
549 {
35c9c7ba 550 ax->flaw = agent_flaw_bad_jump;
c906108c
SS
551 return;
552 }
3d269a59
JB
553
554 /* Do we have any information about what the stack height
555 should be at the target? */
556 if (targets[target] || boundary[target])
c906108c 557 {
3d269a59 558 if (heights[target] != height)
c906108c 559 {
35c9c7ba 560 ax->flaw = agent_flaw_height_mismatch;
c906108c
SS
561 return;
562 }
563 }
3d269a59
JB
564
565 /* Record the target, along with the stack height we expect. */
566 targets[target] = 1;
567 heights[target] = height;
c906108c 568 }
c5aa993b 569
c906108c
SS
570 /* For unconditional jumps with a successor, check that the
571 successor is a target, and pick up its stack height. */
572 if (aop_goto == op - aop_map
573 && i + 3 < ax->len)
574 {
c5aa993b 575 if (!targets[i + 3])
c906108c 576 {
35c9c7ba 577 ax->flaw = agent_flaw_hole;
c906108c
SS
578 return;
579 }
580
581 height = heights[i + 3];
582 }
583
584 /* For reg instructions, record the register in the bit mask. */
585 if (aop_reg == op - aop_map)
586 {
587 int reg = read_const (ax, i + 1, 2);
c906108c 588
35c9c7ba 589 ax_reg_mask (ax, reg);
c906108c
SS
590 }
591 }
592
593 /* Check that all the targets are on boundaries. */
594 for (i = 0; i < ax->len; i++)
595 if (targets[i] && !boundary[i])
596 {
35c9c7ba 597 ax->flaw = agent_flaw_bad_jump;
c906108c
SS
598 return;
599 }
600
35c9c7ba 601 ax->final_height = height;
c906108c 602}
This page took 1.290966 seconds and 4 git commands to generate.