ead100324d5596fd9ea3163987a4bbea5137698c
[deliverable/binutils-gdb.git] / gdb / compile / compile-loc2c.c
1 /* Convert a DWARF location expression to C
2
3 Copyright (C) 2014-2017 Free Software Foundation, Inc.
4
5 This file is part of GDB.
6
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
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
11
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.
16
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19
20 #include "defs.h"
21 #include "dwarf2.h"
22 #include "dwarf2expr.h"
23 #include "dwarf2loc.h"
24 #include "ui-file.h"
25 #include "utils.h"
26 #include "compile-internal.h"
27 #include "compile.h"
28 #include "block.h"
29 #include "dwarf2-frame.h"
30 #include "gdb_vecs.h"
31 #include "value.h"
32
33 \f
34
35 /* Information about a given instruction. */
36
37 struct insn_info
38 {
39 /* Stack depth at entry. */
40
41 unsigned int depth;
42
43 /* Whether this instruction has been visited. */
44
45 unsigned int visited : 1;
46
47 /* Whether this instruction needs a label. */
48
49 unsigned int label : 1;
50
51 /* Whether this instruction is DW_OP_GNU_push_tls_address or
52 DW_OP_form_tls_address. This is a hack until we can add a
53 feature to glibc to let us properly generate code for TLS. */
54
55 unsigned int is_tls : 1;
56 };
57
58 /* A helper function for compute_stack_depth that does the work. This
59 examines the DWARF expression starting from START and computes
60 stack effects.
61
62 NEED_TEMPVAR is an out parameter which is set if this expression
63 needs a special temporary variable to be emitted (see the code
64 generator).
65 INFO is an array of insn_info objects, indexed by offset from the
66 start of the DWARF expression.
67 TO_DO is a list of bytecodes which must be examined; it may be
68 added to by this function.
69 BYTE_ORDER and ADDR_SIZE describe this bytecode in the obvious way.
70 OP_PTR and OP_END are the bounds of the DWARF expression. */
71
72 static void
73 compute_stack_depth_worker (int start, int *need_tempvar,
74 struct insn_info *info,
75 std::vector<int> *to_do,
76 enum bfd_endian byte_order, unsigned int addr_size,
77 const gdb_byte *op_ptr, const gdb_byte *op_end)
78 {
79 const gdb_byte * const base = op_ptr;
80 int stack_depth;
81
82 op_ptr += start;
83 gdb_assert (info[start].visited);
84 stack_depth = info[start].depth;
85
86 while (op_ptr < op_end)
87 {
88 enum dwarf_location_atom op = (enum dwarf_location_atom) *op_ptr;
89 uint64_t reg;
90 int64_t offset;
91 int ndx = op_ptr - base;
92
93 #define SET_CHECK_DEPTH(WHERE) \
94 if (info[WHERE].visited) \
95 { \
96 if (info[WHERE].depth != stack_depth) \
97 error (_("inconsistent stack depths")); \
98 } \
99 else \
100 { \
101 /* Stack depth not set, so set it. */ \
102 info[WHERE].visited = 1; \
103 info[WHERE].depth = stack_depth; \
104 }
105
106 SET_CHECK_DEPTH (ndx);
107
108 ++op_ptr;
109
110 switch (op)
111 {
112 case DW_OP_lit0:
113 case DW_OP_lit1:
114 case DW_OP_lit2:
115 case DW_OP_lit3:
116 case DW_OP_lit4:
117 case DW_OP_lit5:
118 case DW_OP_lit6:
119 case DW_OP_lit7:
120 case DW_OP_lit8:
121 case DW_OP_lit9:
122 case DW_OP_lit10:
123 case DW_OP_lit11:
124 case DW_OP_lit12:
125 case DW_OP_lit13:
126 case DW_OP_lit14:
127 case DW_OP_lit15:
128 case DW_OP_lit16:
129 case DW_OP_lit17:
130 case DW_OP_lit18:
131 case DW_OP_lit19:
132 case DW_OP_lit20:
133 case DW_OP_lit21:
134 case DW_OP_lit22:
135 case DW_OP_lit23:
136 case DW_OP_lit24:
137 case DW_OP_lit25:
138 case DW_OP_lit26:
139 case DW_OP_lit27:
140 case DW_OP_lit28:
141 case DW_OP_lit29:
142 case DW_OP_lit30:
143 case DW_OP_lit31:
144 ++stack_depth;
145 break;
146
147 case DW_OP_addr:
148 op_ptr += addr_size;
149 ++stack_depth;
150 break;
151
152 case DW_OP_const1u:
153 case DW_OP_const1s:
154 op_ptr += 1;
155 ++stack_depth;
156 break;
157 case DW_OP_const2u:
158 case DW_OP_const2s:
159 op_ptr += 2;
160 ++stack_depth;
161 break;
162 case DW_OP_const4u:
163 case DW_OP_const4s:
164 op_ptr += 4;
165 ++stack_depth;
166 break;
167 case DW_OP_const8u:
168 case DW_OP_const8s:
169 op_ptr += 8;
170 ++stack_depth;
171 break;
172 case DW_OP_constu:
173 case DW_OP_consts:
174 op_ptr = safe_read_sleb128 (op_ptr, op_end, &offset);
175 ++stack_depth;
176 break;
177
178 case DW_OP_reg0:
179 case DW_OP_reg1:
180 case DW_OP_reg2:
181 case DW_OP_reg3:
182 case DW_OP_reg4:
183 case DW_OP_reg5:
184 case DW_OP_reg6:
185 case DW_OP_reg7:
186 case DW_OP_reg8:
187 case DW_OP_reg9:
188 case DW_OP_reg10:
189 case DW_OP_reg11:
190 case DW_OP_reg12:
191 case DW_OP_reg13:
192 case DW_OP_reg14:
193 case DW_OP_reg15:
194 case DW_OP_reg16:
195 case DW_OP_reg17:
196 case DW_OP_reg18:
197 case DW_OP_reg19:
198 case DW_OP_reg20:
199 case DW_OP_reg21:
200 case DW_OP_reg22:
201 case DW_OP_reg23:
202 case DW_OP_reg24:
203 case DW_OP_reg25:
204 case DW_OP_reg26:
205 case DW_OP_reg27:
206 case DW_OP_reg28:
207 case DW_OP_reg29:
208 case DW_OP_reg30:
209 case DW_OP_reg31:
210 ++stack_depth;
211 break;
212
213 case DW_OP_regx:
214 op_ptr = safe_read_uleb128 (op_ptr, op_end, &reg);
215 ++stack_depth;
216 break;
217
218 case DW_OP_breg0:
219 case DW_OP_breg1:
220 case DW_OP_breg2:
221 case DW_OP_breg3:
222 case DW_OP_breg4:
223 case DW_OP_breg5:
224 case DW_OP_breg6:
225 case DW_OP_breg7:
226 case DW_OP_breg8:
227 case DW_OP_breg9:
228 case DW_OP_breg10:
229 case DW_OP_breg11:
230 case DW_OP_breg12:
231 case DW_OP_breg13:
232 case DW_OP_breg14:
233 case DW_OP_breg15:
234 case DW_OP_breg16:
235 case DW_OP_breg17:
236 case DW_OP_breg18:
237 case DW_OP_breg19:
238 case DW_OP_breg20:
239 case DW_OP_breg21:
240 case DW_OP_breg22:
241 case DW_OP_breg23:
242 case DW_OP_breg24:
243 case DW_OP_breg25:
244 case DW_OP_breg26:
245 case DW_OP_breg27:
246 case DW_OP_breg28:
247 case DW_OP_breg29:
248 case DW_OP_breg30:
249 case DW_OP_breg31:
250 op_ptr = safe_read_sleb128 (op_ptr, op_end, &offset);
251 ++stack_depth;
252 break;
253 case DW_OP_bregx:
254 {
255 op_ptr = safe_read_uleb128 (op_ptr, op_end, &reg);
256 op_ptr = safe_read_sleb128 (op_ptr, op_end, &offset);
257 ++stack_depth;
258 }
259 break;
260 case DW_OP_fbreg:
261 op_ptr = safe_read_sleb128 (op_ptr, op_end, &offset);
262 ++stack_depth;
263 break;
264
265 case DW_OP_dup:
266 ++stack_depth;
267 break;
268
269 case DW_OP_drop:
270 --stack_depth;
271 break;
272
273 case DW_OP_pick:
274 ++op_ptr;
275 ++stack_depth;
276 break;
277
278 case DW_OP_rot:
279 case DW_OP_swap:
280 *need_tempvar = 1;
281 break;
282
283 case DW_OP_over:
284 ++stack_depth;
285 break;
286
287 case DW_OP_abs:
288 case DW_OP_neg:
289 case DW_OP_not:
290 case DW_OP_deref:
291 break;
292
293 case DW_OP_deref_size:
294 ++op_ptr;
295 break;
296
297 case DW_OP_plus_uconst:
298 op_ptr = safe_read_uleb128 (op_ptr, op_end, &reg);
299 break;
300
301 case DW_OP_div:
302 case DW_OP_shra:
303 case DW_OP_and:
304 case DW_OP_minus:
305 case DW_OP_mod:
306 case DW_OP_mul:
307 case DW_OP_or:
308 case DW_OP_plus:
309 case DW_OP_shl:
310 case DW_OP_shr:
311 case DW_OP_xor:
312 case DW_OP_le:
313 case DW_OP_ge:
314 case DW_OP_eq:
315 case DW_OP_lt:
316 case DW_OP_gt:
317 case DW_OP_ne:
318 --stack_depth;
319 break;
320
321 case DW_OP_call_frame_cfa:
322 ++stack_depth;
323 break;
324
325 case DW_OP_GNU_push_tls_address:
326 case DW_OP_form_tls_address:
327 info[ndx].is_tls = 1;
328 break;
329
330 case DW_OP_skip:
331 offset = extract_signed_integer (op_ptr, 2, byte_order);
332 op_ptr += 2;
333 offset = op_ptr + offset - base;
334 /* If the destination has not been seen yet, add it to the
335 to-do list. */
336 if (!info[offset].visited)
337 to_do->push_back (offset);
338 SET_CHECK_DEPTH (offset);
339 info[offset].label = 1;
340 /* We're done with this line of code. */
341 return;
342
343 case DW_OP_bra:
344 offset = extract_signed_integer (op_ptr, 2, byte_order);
345 op_ptr += 2;
346 offset = op_ptr + offset - base;
347 --stack_depth;
348 /* If the destination has not been seen yet, add it to the
349 to-do list. */
350 if (!info[offset].visited)
351 to_do->push_back (offset);
352 SET_CHECK_DEPTH (offset);
353 info[offset].label = 1;
354 break;
355
356 case DW_OP_nop:
357 break;
358
359 default:
360 error (_("unhandled DWARF op: %s"), get_DW_OP_name (op));
361 }
362 }
363
364 gdb_assert (op_ptr == op_end);
365
366 #undef SET_CHECK_DEPTH
367 }
368
369 /* Compute the maximum needed stack depth of a DWARF expression, and
370 some other information as well.
371
372 BYTE_ORDER and ADDR_SIZE describe this bytecode in the obvious way.
373 NEED_TEMPVAR is an out parameter which is set if this expression
374 needs a special temporary variable to be emitted (see the code
375 generator).
376 IS_TLS is an out parameter which is set if this expression refers
377 to a TLS variable.
378 OP_PTR and OP_END are the bounds of the DWARF expression.
379 INITIAL_DEPTH is the initial depth of the DWARF expression stack.
380 INFO is an array of insn_info objects, indexed by offset from the
381 start of the DWARF expression.
382
383 This returns the maximum stack depth. */
384
385 static int
386 compute_stack_depth (enum bfd_endian byte_order, unsigned int addr_size,
387 int *need_tempvar, int *is_tls,
388 const gdb_byte *op_ptr, const gdb_byte *op_end,
389 int initial_depth,
390 struct insn_info **info)
391 {
392 unsigned char *set;
393 struct cleanup *outer_cleanup;
394 std::vector<int> to_do;
395 int stack_depth, i;
396
397 *info = XCNEWVEC (struct insn_info, op_end - op_ptr);
398 outer_cleanup = make_cleanup (xfree, *info);
399
400 to_do.push_back (0);
401 (*info)[0].depth = initial_depth;
402 (*info)[0].visited = 1;
403
404 while (!to_do.empty ())
405 {
406 int ndx = to_do.back ();
407 to_do.pop_back ();
408
409 compute_stack_depth_worker (ndx, need_tempvar, *info, &to_do,
410 byte_order, addr_size,
411 op_ptr, op_end);
412 }
413
414 stack_depth = 0;
415 *is_tls = 0;
416 for (i = 0; i < op_end - op_ptr; ++i)
417 {
418 if ((*info)[i].depth > stack_depth)
419 stack_depth = (*info)[i].depth;
420 if ((*info)[i].is_tls)
421 *is_tls = 1;
422 }
423
424 discard_cleanups (outer_cleanup);
425 return stack_depth + 1;
426 }
427
428 \f
429
430 #define GCC_UINTPTR "__gdb_uintptr"
431 #define GCC_INTPTR "__gdb_intptr"
432
433 /* Emit code to push a constant. */
434
435 static void
436 push (int indent, string_file &stream, ULONGEST l)
437 {
438 fprintfi_filtered (indent, &stream,
439 "__gdb_stack[++__gdb_tos] = (" GCC_UINTPTR ") %s;\n",
440 hex_string (l));
441 }
442
443 /* Emit code to push an arbitrary expression. This works like
444 printf. */
445
446 static void pushf (int indent, string_file &stream, const char *format, ...)
447 ATTRIBUTE_PRINTF (3, 4);
448
449 static void
450 pushf (int indent, string_file &stream, const char *format, ...)
451 {
452 va_list args;
453
454 fprintfi_filtered (indent, &stream, "__gdb_stack[__gdb_tos + 1] = ");
455 va_start (args, format);
456 stream.vprintf (format, args);
457 va_end (args);
458 stream.puts (";\n");
459
460 fprintfi_filtered (indent, &stream, "++__gdb_tos;\n");
461 }
462
463 /* Emit code for a unary expression -- one which operates in-place on
464 the top-of-stack. This works like printf. */
465
466 static void unary (int indent, string_file &stream, const char *format, ...)
467 ATTRIBUTE_PRINTF (3, 4);
468
469 static void
470 unary (int indent, string_file &stream, const char *format, ...)
471 {
472 va_list args;
473
474 fprintfi_filtered (indent, &stream, "__gdb_stack[__gdb_tos] = ");
475 va_start (args, format);
476 stream.vprintf (format, args);
477 va_end (args);
478 stream.puts (";\n");
479 }
480
481 /* Emit code for a unary expression -- one which uses the top two
482 stack items, popping the topmost one. This works like printf. */
483 static void binary (int indent, string_file &stream, const char *format, ...)
484 ATTRIBUTE_PRINTF (3, 4);
485
486 static void
487 binary (int indent, string_file &stream, const char *format, ...)
488 {
489 va_list args;
490
491 fprintfi_filtered (indent, &stream, "__gdb_stack[__gdb_tos - 1] = ");
492 va_start (args, format);
493 stream.vprintf (format, args);
494 va_end (args);
495 stream.puts (";\n");
496 fprintfi_filtered (indent, &stream, "--__gdb_tos;\n");
497 }
498
499 /* Print the name of a label given its "SCOPE", an arbitrary integer
500 used for uniqueness, and its TARGET, the bytecode offset
501 corresponding to the label's point of definition. */
502
503 static void
504 print_label (string_file &stream, unsigned int scope, int target)
505 {
506 stream.printf ("__label_%u_%s", scope, pulongest (target));
507 }
508
509 /* Emit code that pushes a register's address on the stack.
510 REGISTERS_USED is an out parameter which is updated to note which
511 register was needed by this expression. */
512
513 static void
514 pushf_register_address (int indent, string_file &stream,
515 unsigned char *registers_used,
516 struct gdbarch *gdbarch, int regnum)
517 {
518 char *regname = compile_register_name_mangled (gdbarch, regnum);
519 struct cleanup *cleanups = make_cleanup (xfree, regname);
520
521 registers_used[regnum] = 1;
522 pushf (indent, stream,
523 "(" GCC_UINTPTR ") &" COMPILE_I_SIMPLE_REGISTER_ARG_NAME "->%s",
524 regname);
525
526 do_cleanups (cleanups);
527 }
528
529 /* Emit code that pushes a register's value on the stack.
530 REGISTERS_USED is an out parameter which is updated to note which
531 register was needed by this expression. OFFSET is added to the
532 register's value before it is pushed. */
533
534 static void
535 pushf_register (int indent, string_file &stream,
536 unsigned char *registers_used,
537 struct gdbarch *gdbarch, int regnum, uint64_t offset)
538 {
539 char *regname = compile_register_name_mangled (gdbarch, regnum);
540 struct cleanup *cleanups = make_cleanup (xfree, regname);
541
542 registers_used[regnum] = 1;
543 if (offset == 0)
544 pushf (indent, stream, COMPILE_I_SIMPLE_REGISTER_ARG_NAME "->%s",
545 regname);
546 else
547 pushf (indent, stream,
548 COMPILE_I_SIMPLE_REGISTER_ARG_NAME "->%s + (" GCC_UINTPTR ") %s",
549 regname, hex_string (offset));
550
551 do_cleanups (cleanups);
552 }
553
554 /* Compile a DWARF expression to C code.
555
556 INDENT is the indentation level to use.
557 STREAM is the stream where the code should be written.
558
559 TYPE_NAME names the type of the result of the DWARF expression.
560 For locations this is "void *" but for array bounds it will be an
561 integer type.
562
563 RESULT_NAME is the name of a variable in the resulting C code. The
564 result of the expression will be assigned to this variable.
565
566 SYM is the symbol corresponding to this expression.
567 PC is the location at which the expression is being evaluated.
568 ARCH is the architecture to use.
569
570 REGISTERS_USED is an out parameter which is updated to note which
571 registers were needed by this expression.
572
573 ADDR_SIZE is the DWARF address size to use.
574
575 OPT_PTR and OP_END are the bounds of the DWARF expression.
576
577 If non-NULL, INITIAL points to an initial value to write to the
578 stack. If NULL, no initial value is written.
579
580 PER_CU is the per-CU object used for looking up various other
581 things. */
582
583 static void
584 do_compile_dwarf_expr_to_c (int indent, string_file &stream,
585 const char *type_name,
586 const char *result_name,
587 struct symbol *sym, CORE_ADDR pc,
588 struct gdbarch *arch,
589 unsigned char *registers_used,
590 unsigned int addr_size,
591 const gdb_byte *op_ptr, const gdb_byte *op_end,
592 CORE_ADDR *initial,
593 struct dwarf2_per_cu_data *per_cu)
594 {
595 /* We keep a counter so that labels and other objects we create have
596 unique names. */
597 static unsigned int scope;
598
599 enum bfd_endian byte_order = gdbarch_byte_order (arch);
600 const gdb_byte * const base = op_ptr;
601 int need_tempvar = 0;
602 int is_tls = 0;
603 struct cleanup *cleanup;
604 struct insn_info *info;
605 int stack_depth;
606
607 ++scope;
608
609 fprintfi_filtered (indent, &stream, "__attribute__ ((unused)) %s %s;\n",
610 type_name, result_name);
611 fprintfi_filtered (indent, &stream, "{\n");
612 indent += 2;
613
614 stack_depth = compute_stack_depth (byte_order, addr_size,
615 &need_tempvar, &is_tls,
616 op_ptr, op_end, initial != NULL,
617 &info);
618 cleanup = make_cleanup (xfree, info);
619
620 /* This is a hack until we can add a feature to glibc to let us
621 properly generate code for TLS. You might think we could emit
622 the address in the ordinary course of translating
623 DW_OP_GNU_push_tls_address, but since the operand appears on the
624 stack, it is relatively hard to find, and the idea of calling
625 target_translate_tls_address with OFFSET==0 and then adding the
626 offset by hand seemed too hackish. */
627 if (is_tls)
628 {
629 struct frame_info *frame = get_selected_frame (NULL);
630 struct value *val;
631
632 if (frame == NULL)
633 error (_("Symbol \"%s\" cannot be used because "
634 "there is no selected frame"),
635 SYMBOL_PRINT_NAME (sym));
636
637 val = read_var_value (sym, NULL, frame);
638 if (VALUE_LVAL (val) != lval_memory)
639 error (_("Symbol \"%s\" cannot be used for compilation evaluation "
640 "as its address has not been found."),
641 SYMBOL_PRINT_NAME (sym));
642
643 warning (_("Symbol \"%s\" is thread-local and currently can only "
644 "be referenced from the current thread in "
645 "compiled code."),
646 SYMBOL_PRINT_NAME (sym));
647
648 fprintfi_filtered (indent, &stream, "%s = %s;\n",
649 result_name,
650 core_addr_to_string (value_address (val)));
651 fprintfi_filtered (indent - 2, &stream, "}\n");
652 do_cleanups (cleanup);
653 return;
654 }
655
656 fprintfi_filtered (indent, &stream, GCC_UINTPTR " __gdb_stack[%d];\n",
657 stack_depth);
658
659 if (need_tempvar)
660 fprintfi_filtered (indent, &stream, GCC_UINTPTR " __gdb_tmp;\n");
661 fprintfi_filtered (indent, &stream, "int __gdb_tos = -1;\n");
662
663 if (initial != NULL)
664 pushf (indent, stream, "%s", core_addr_to_string (*initial));
665
666 while (op_ptr < op_end)
667 {
668 enum dwarf_location_atom op = (enum dwarf_location_atom) *op_ptr;
669 uint64_t uoffset, reg;
670 int64_t offset;
671
672 print_spaces (indent - 2, &stream);
673 if (info[op_ptr - base].label)
674 {
675 print_label (stream, scope, op_ptr - base);
676 stream.puts (":;");
677 }
678 stream.printf ("/* %s */\n", get_DW_OP_name (op));
679
680 /* This is handy for debugging the generated code:
681 fprintf_filtered (stream, "if (__gdb_tos != %d) abort ();\n",
682 (int) info[op_ptr - base].depth - 1);
683 */
684
685 ++op_ptr;
686
687 switch (op)
688 {
689 case DW_OP_lit0:
690 case DW_OP_lit1:
691 case DW_OP_lit2:
692 case DW_OP_lit3:
693 case DW_OP_lit4:
694 case DW_OP_lit5:
695 case DW_OP_lit6:
696 case DW_OP_lit7:
697 case DW_OP_lit8:
698 case DW_OP_lit9:
699 case DW_OP_lit10:
700 case DW_OP_lit11:
701 case DW_OP_lit12:
702 case DW_OP_lit13:
703 case DW_OP_lit14:
704 case DW_OP_lit15:
705 case DW_OP_lit16:
706 case DW_OP_lit17:
707 case DW_OP_lit18:
708 case DW_OP_lit19:
709 case DW_OP_lit20:
710 case DW_OP_lit21:
711 case DW_OP_lit22:
712 case DW_OP_lit23:
713 case DW_OP_lit24:
714 case DW_OP_lit25:
715 case DW_OP_lit26:
716 case DW_OP_lit27:
717 case DW_OP_lit28:
718 case DW_OP_lit29:
719 case DW_OP_lit30:
720 case DW_OP_lit31:
721 push (indent, stream, op - DW_OP_lit0);
722 break;
723
724 case DW_OP_addr:
725 uoffset = extract_unsigned_integer (op_ptr, addr_size, byte_order);
726 op_ptr += addr_size;
727 /* Some versions of GCC emit DW_OP_addr before
728 DW_OP_GNU_push_tls_address. In this case the value is an
729 index, not an address. We don't support things like
730 branching between the address and the TLS op. */
731 if (op_ptr >= op_end || *op_ptr != DW_OP_GNU_push_tls_address)
732 uoffset += dwarf2_per_cu_text_offset (per_cu);
733 push (indent, stream, uoffset);
734 break;
735
736 case DW_OP_const1u:
737 push (indent, stream,
738 extract_unsigned_integer (op_ptr, 1, byte_order));
739 op_ptr += 1;
740 break;
741 case DW_OP_const1s:
742 push (indent, stream,
743 extract_signed_integer (op_ptr, 1, byte_order));
744 op_ptr += 1;
745 break;
746 case DW_OP_const2u:
747 push (indent, stream,
748 extract_unsigned_integer (op_ptr, 2, byte_order));
749 op_ptr += 2;
750 break;
751 case DW_OP_const2s:
752 push (indent, stream,
753 extract_signed_integer (op_ptr, 2, byte_order));
754 op_ptr += 2;
755 break;
756 case DW_OP_const4u:
757 push (indent, stream,
758 extract_unsigned_integer (op_ptr, 4, byte_order));
759 op_ptr += 4;
760 break;
761 case DW_OP_const4s:
762 push (indent, stream,
763 extract_signed_integer (op_ptr, 4, byte_order));
764 op_ptr += 4;
765 break;
766 case DW_OP_const8u:
767 push (indent, stream,
768 extract_unsigned_integer (op_ptr, 8, byte_order));
769 op_ptr += 8;
770 break;
771 case DW_OP_const8s:
772 push (indent, stream,
773 extract_signed_integer (op_ptr, 8, byte_order));
774 op_ptr += 8;
775 break;
776 case DW_OP_constu:
777 op_ptr = safe_read_uleb128 (op_ptr, op_end, &uoffset);
778 push (indent, stream, uoffset);
779 break;
780 case DW_OP_consts:
781 op_ptr = safe_read_sleb128 (op_ptr, op_end, &offset);
782 push (indent, stream, offset);
783 break;
784
785 case DW_OP_reg0:
786 case DW_OP_reg1:
787 case DW_OP_reg2:
788 case DW_OP_reg3:
789 case DW_OP_reg4:
790 case DW_OP_reg5:
791 case DW_OP_reg6:
792 case DW_OP_reg7:
793 case DW_OP_reg8:
794 case DW_OP_reg9:
795 case DW_OP_reg10:
796 case DW_OP_reg11:
797 case DW_OP_reg12:
798 case DW_OP_reg13:
799 case DW_OP_reg14:
800 case DW_OP_reg15:
801 case DW_OP_reg16:
802 case DW_OP_reg17:
803 case DW_OP_reg18:
804 case DW_OP_reg19:
805 case DW_OP_reg20:
806 case DW_OP_reg21:
807 case DW_OP_reg22:
808 case DW_OP_reg23:
809 case DW_OP_reg24:
810 case DW_OP_reg25:
811 case DW_OP_reg26:
812 case DW_OP_reg27:
813 case DW_OP_reg28:
814 case DW_OP_reg29:
815 case DW_OP_reg30:
816 case DW_OP_reg31:
817 dwarf_expr_require_composition (op_ptr, op_end, "DW_OP_regx");
818 pushf_register_address (indent, stream, registers_used, arch,
819 dwarf_reg_to_regnum_or_error
820 (arch, op - DW_OP_reg0));
821 break;
822
823 case DW_OP_regx:
824 op_ptr = safe_read_uleb128 (op_ptr, op_end, &reg);
825 dwarf_expr_require_composition (op_ptr, op_end, "DW_OP_regx");
826 pushf_register_address (indent, stream, registers_used, arch,
827 dwarf_reg_to_regnum_or_error (arch, reg));
828 break;
829
830 case DW_OP_breg0:
831 case DW_OP_breg1:
832 case DW_OP_breg2:
833 case DW_OP_breg3:
834 case DW_OP_breg4:
835 case DW_OP_breg5:
836 case DW_OP_breg6:
837 case DW_OP_breg7:
838 case DW_OP_breg8:
839 case DW_OP_breg9:
840 case DW_OP_breg10:
841 case DW_OP_breg11:
842 case DW_OP_breg12:
843 case DW_OP_breg13:
844 case DW_OP_breg14:
845 case DW_OP_breg15:
846 case DW_OP_breg16:
847 case DW_OP_breg17:
848 case DW_OP_breg18:
849 case DW_OP_breg19:
850 case DW_OP_breg20:
851 case DW_OP_breg21:
852 case DW_OP_breg22:
853 case DW_OP_breg23:
854 case DW_OP_breg24:
855 case DW_OP_breg25:
856 case DW_OP_breg26:
857 case DW_OP_breg27:
858 case DW_OP_breg28:
859 case DW_OP_breg29:
860 case DW_OP_breg30:
861 case DW_OP_breg31:
862 op_ptr = safe_read_sleb128 (op_ptr, op_end, &offset);
863 pushf_register (indent, stream, registers_used, arch,
864 dwarf_reg_to_regnum_or_error (arch,
865 op - DW_OP_breg0),
866 offset);
867 break;
868 case DW_OP_bregx:
869 {
870 op_ptr = safe_read_uleb128 (op_ptr, op_end, &reg);
871 op_ptr = safe_read_sleb128 (op_ptr, op_end, &offset);
872 pushf_register (indent, stream, registers_used, arch,
873 dwarf_reg_to_regnum_or_error (arch, reg), offset);
874 }
875 break;
876 case DW_OP_fbreg:
877 {
878 const gdb_byte *datastart;
879 size_t datalen;
880 const struct block *b;
881 struct symbol *framefunc;
882 char fb_name[50];
883
884 b = block_for_pc (pc);
885
886 if (!b)
887 error (_("No block found for address"));
888
889 framefunc = block_linkage_function (b);
890
891 if (!framefunc)
892 error (_("No function found for block"));
893
894 func_get_frame_base_dwarf_block (framefunc, pc,
895 &datastart, &datalen);
896
897 op_ptr = safe_read_sleb128 (op_ptr, op_end, &offset);
898
899 /* Generate a unique-enough name, in case the frame base
900 is computed multiple times in this expression. */
901 xsnprintf (fb_name, sizeof (fb_name), "__frame_base_%ld",
902 (long) (op_ptr - base));
903
904 do_compile_dwarf_expr_to_c (indent, stream,
905 GCC_UINTPTR, fb_name,
906 sym, pc,
907 arch, registers_used, addr_size,
908 datastart, datastart + datalen,
909 NULL, per_cu);
910
911 pushf (indent, stream, "%s + %s", fb_name, hex_string (offset));
912 }
913 break;
914
915 case DW_OP_dup:
916 pushf (indent, stream, "__gdb_stack[__gdb_tos]");
917 break;
918
919 case DW_OP_drop:
920 fprintfi_filtered (indent, &stream, "--__gdb_tos;\n");
921 break;
922
923 case DW_OP_pick:
924 offset = *op_ptr++;
925 pushf (indent, stream, "__gdb_stack[__gdb_tos - %s]",
926 plongest (offset));
927 break;
928
929 case DW_OP_swap:
930 fprintfi_filtered (indent, &stream,
931 "__gdb_tmp = __gdb_stack[__gdb_tos - 1];\n");
932 fprintfi_filtered (indent, &stream,
933 "__gdb_stack[__gdb_tos - 1] = "
934 "__gdb_stack[__gdb_tos];\n");
935 fprintfi_filtered (indent, &stream, ("__gdb_stack[__gdb_tos] = "
936 "__gdb_tmp;\n"));
937 break;
938
939 case DW_OP_over:
940 pushf (indent, stream, "__gdb_stack[__gdb_tos - 1]");
941 break;
942
943 case DW_OP_rot:
944 fprintfi_filtered (indent, &stream, ("__gdb_tmp = "
945 "__gdb_stack[__gdb_tos];\n"));
946 fprintfi_filtered (indent, &stream,
947 "__gdb_stack[__gdb_tos] = "
948 "__gdb_stack[__gdb_tos - 1];\n");
949 fprintfi_filtered (indent, &stream,
950 "__gdb_stack[__gdb_tos - 1] = "
951 "__gdb_stack[__gdb_tos -2];\n");
952 fprintfi_filtered (indent, &stream, "__gdb_stack[__gdb_tos - 2] = "
953 "__gdb_tmp;\n");
954 break;
955
956 case DW_OP_deref:
957 case DW_OP_deref_size:
958 {
959 int size;
960 const char *mode;
961
962 if (op == DW_OP_deref_size)
963 size = *op_ptr++;
964 else
965 size = addr_size;
966
967 mode = c_get_mode_for_size (size);
968 if (mode == NULL)
969 error (_("Unsupported size %d in %s"),
970 size, get_DW_OP_name (op));
971
972 /* Cast to a pointer of the desired type, then
973 dereference. */
974 fprintfi_filtered (indent, &stream,
975 "__gdb_stack[__gdb_tos] = "
976 "*((__gdb_int_%s *) "
977 "__gdb_stack[__gdb_tos]);\n",
978 mode);
979 }
980 break;
981
982 case DW_OP_abs:
983 unary (indent, stream,
984 "((" GCC_INTPTR ") __gdb_stack[__gdb_tos]) < 0 ? "
985 "-__gdb_stack[__gdb_tos] : __gdb_stack[__gdb_tos]");
986 break;
987
988 case DW_OP_neg:
989 unary (indent, stream, "-__gdb_stack[__gdb_tos]");
990 break;
991
992 case DW_OP_not:
993 unary (indent, stream, "~__gdb_stack[__gdb_tos]");
994 break;
995
996 case DW_OP_plus_uconst:
997 op_ptr = safe_read_uleb128 (op_ptr, op_end, &reg);
998 unary (indent, stream, "__gdb_stack[__gdb_tos] + %s",
999 hex_string (reg));
1000 break;
1001
1002 case DW_OP_div:
1003 binary (indent, stream, ("((" GCC_INTPTR
1004 ") __gdb_stack[__gdb_tos-1]) / (("
1005 GCC_INTPTR ") __gdb_stack[__gdb_tos])"));
1006 break;
1007
1008 case DW_OP_shra:
1009 binary (indent, stream,
1010 "((" GCC_INTPTR ") __gdb_stack[__gdb_tos-1]) >> "
1011 "__gdb_stack[__gdb_tos]");
1012 break;
1013
1014 #define BINARY(OP) \
1015 binary (indent, stream, "%s", "__gdb_stack[__gdb_tos-1] " #OP \
1016 " __gdb_stack[__gdb_tos]"); \
1017 break
1018
1019 case DW_OP_and:
1020 BINARY (&);
1021 case DW_OP_minus:
1022 BINARY (-);
1023 case DW_OP_mod:
1024 BINARY (%);
1025 case DW_OP_mul:
1026 BINARY (*);
1027 case DW_OP_or:
1028 BINARY (|);
1029 case DW_OP_plus:
1030 BINARY (+);
1031 case DW_OP_shl:
1032 BINARY (<<);
1033 case DW_OP_shr:
1034 BINARY (>>);
1035 case DW_OP_xor:
1036 BINARY (^);
1037 #undef BINARY
1038
1039 #define COMPARE(OP) \
1040 binary (indent, stream, \
1041 "(((" GCC_INTPTR ") __gdb_stack[__gdb_tos-1]) " #OP \
1042 " ((" GCC_INTPTR \
1043 ") __gdb_stack[__gdb_tos]))"); \
1044 break
1045
1046 case DW_OP_le:
1047 COMPARE (<=);
1048 case DW_OP_ge:
1049 COMPARE (>=);
1050 case DW_OP_eq:
1051 COMPARE (==);
1052 case DW_OP_lt:
1053 COMPARE (<);
1054 case DW_OP_gt:
1055 COMPARE (>);
1056 case DW_OP_ne:
1057 COMPARE (!=);
1058 #undef COMPARE
1059
1060 case DW_OP_call_frame_cfa:
1061 {
1062 int regnum;
1063 CORE_ADDR text_offset;
1064 LONGEST off;
1065 const gdb_byte *cfa_start, *cfa_end;
1066
1067 if (dwarf2_fetch_cfa_info (arch, pc, per_cu,
1068 &regnum, &off,
1069 &text_offset, &cfa_start, &cfa_end))
1070 {
1071 /* Register. */
1072 pushf_register (indent, stream, registers_used, arch, regnum,
1073 off);
1074 }
1075 else
1076 {
1077 /* Another expression. */
1078 char cfa_name[50];
1079
1080 /* Generate a unique-enough name, in case the CFA is
1081 computed multiple times in this expression. */
1082 xsnprintf (cfa_name, sizeof (cfa_name),
1083 "__cfa_%ld", (long) (op_ptr - base));
1084
1085 do_compile_dwarf_expr_to_c (indent, stream,
1086 GCC_UINTPTR, cfa_name,
1087 sym, pc, arch, registers_used,
1088 addr_size,
1089 cfa_start, cfa_end,
1090 &text_offset, per_cu);
1091 pushf (indent, stream, "%s", cfa_name);
1092 }
1093 }
1094
1095 break;
1096
1097 case DW_OP_skip:
1098 offset = extract_signed_integer (op_ptr, 2, byte_order);
1099 op_ptr += 2;
1100 fprintfi_filtered (indent, &stream, "goto ");
1101 print_label (stream, scope, op_ptr + offset - base);
1102 stream.puts (";\n");
1103 break;
1104
1105 case DW_OP_bra:
1106 offset = extract_signed_integer (op_ptr, 2, byte_order);
1107 op_ptr += 2;
1108 fprintfi_filtered (indent, &stream,
1109 "if ((( " GCC_INTPTR
1110 ") __gdb_stack[__gdb_tos--]) != 0) goto ");
1111 print_label (stream, scope, op_ptr + offset - base);
1112 stream.puts (";\n");
1113 break;
1114
1115 case DW_OP_nop:
1116 break;
1117
1118 default:
1119 error (_("unhandled DWARF op: %s"), get_DW_OP_name (op));
1120 }
1121 }
1122
1123 fprintfi_filtered (indent, &stream, "%s = __gdb_stack[__gdb_tos];\n",
1124 result_name);
1125 fprintfi_filtered (indent - 2, &stream, "}\n");
1126
1127 do_cleanups (cleanup);
1128 }
1129
1130 /* See compile.h. */
1131
1132 void
1133 compile_dwarf_expr_to_c (string_file &stream, const char *result_name,
1134 struct symbol *sym, CORE_ADDR pc,
1135 struct gdbarch *arch, unsigned char *registers_used,
1136 unsigned int addr_size,
1137 const gdb_byte *op_ptr, const gdb_byte *op_end,
1138 struct dwarf2_per_cu_data *per_cu)
1139 {
1140 do_compile_dwarf_expr_to_c (2, stream, GCC_UINTPTR, result_name, sym, pc,
1141 arch, registers_used, addr_size, op_ptr, op_end,
1142 NULL, per_cu);
1143 }
1144
1145 /* See compile.h. */
1146
1147 void
1148 compile_dwarf_bounds_to_c (string_file &stream,
1149 const char *result_name,
1150 const struct dynamic_prop *prop,
1151 struct symbol *sym, CORE_ADDR pc,
1152 struct gdbarch *arch, unsigned char *registers_used,
1153 unsigned int addr_size,
1154 const gdb_byte *op_ptr, const gdb_byte *op_end,
1155 struct dwarf2_per_cu_data *per_cu)
1156 {
1157 do_compile_dwarf_expr_to_c (2, stream, "unsigned long ", result_name,
1158 sym, pc, arch, registers_used,
1159 addr_size, op_ptr, op_end, NULL, per_cu);
1160 }
This page took 0.052086 seconds and 4 git commands to generate.