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