Add casts for legitimate integer to enum conversions
[external/binutils.git] / gdb / compile / compile-loc2c.c
1 /* Convert a DWARF location expression to C
2
3    Copyright (C) 2014-2015 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.  This is
52      a hack until we can add a feature to glibc to let us properly
53      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                             VEC (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           info[ndx].is_tls = 1;
327           break;
328
329         case DW_OP_skip:
330           offset = extract_signed_integer (op_ptr, 2, byte_order);
331           op_ptr += 2;
332           offset = op_ptr + offset - base;
333           /* If the destination has not been seen yet, add it to the
334              to-do list.  */
335           if (!info[offset].visited)
336             VEC_safe_push (int, *to_do, offset);
337           SET_CHECK_DEPTH (offset);
338           info[offset].label = 1;
339           /* We're done with this line of code.  */
340           return;
341
342         case DW_OP_bra:
343           offset = extract_signed_integer (op_ptr, 2, byte_order);
344           op_ptr += 2;
345           offset = op_ptr + offset - base;
346           --stack_depth;
347           /* If the destination has not been seen yet, add it to the
348              to-do list.  */
349           if (!info[offset].visited)
350             VEC_safe_push (int, *to_do, offset);
351           SET_CHECK_DEPTH (offset);
352           info[offset].label = 1;
353           break;
354
355         case DW_OP_nop:
356           break;
357
358         default:
359           error (_("unhandled DWARF op: %s"), get_DW_OP_name (op));
360         }
361     }
362
363   gdb_assert (op_ptr == op_end);
364
365 #undef SET_CHECK_DEPTH
366 }
367
368 /* Compute the maximum needed stack depth of a DWARF expression, and
369    some other information as well.
370
371    BYTE_ORDER and ADDR_SIZE describe this bytecode in the obvious way.
372    NEED_TEMPVAR is an out parameter which is set if this expression
373    needs a special temporary variable to be emitted (see the code
374    generator).
375    IS_TLS is an out parameter which is set if this expression refers
376    to a TLS variable.
377    OP_PTR and OP_END are the bounds of the DWARF expression.
378    INITIAL_DEPTH is the initial depth of the DWARF expression stack.
379    INFO is an array of insn_info objects, indexed by offset from the
380    start of the DWARF expression.
381
382    This returns the maximum stack depth.  */
383
384 static int
385 compute_stack_depth (enum bfd_endian byte_order, unsigned int addr_size,
386                      int *need_tempvar, int *is_tls,
387                      const gdb_byte *op_ptr, const gdb_byte *op_end,
388                      int initial_depth,
389                      struct insn_info **info)
390 {
391   unsigned char *set;
392   struct cleanup *outer_cleanup, *cleanup;
393   VEC (int) *to_do = NULL;
394   int stack_depth, i;
395
396   *info = XCNEWVEC (struct insn_info, op_end - op_ptr);
397   outer_cleanup = make_cleanup (xfree, *info);
398
399   cleanup = make_cleanup (VEC_cleanup (int), &to_do);
400
401   VEC_safe_push (int, to_do, 0);
402   (*info)[0].depth = initial_depth;
403   (*info)[0].visited = 1;
404
405   while (!VEC_empty (int, to_do))
406     {
407       int ndx = VEC_pop (int, to_do);
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   do_cleanups (cleanup);
425   discard_cleanups (outer_cleanup);
426   return stack_depth + 1;
427 }
428
429 \f
430
431 #define GCC_UINTPTR "__gdb_uintptr"
432 #define GCC_INTPTR "__gdb_intptr"
433
434 /* Emit code to push a constant.  */
435
436 static void
437 push (int indent, struct ui_file *stream, ULONGEST l)
438 {
439   fprintfi_filtered (indent, stream,
440                      "__gdb_stack[++__gdb_tos] = (" GCC_UINTPTR ") %s;\n",
441                      hex_string (l));
442 }
443
444 /* Emit code to push an arbitrary expression.  This works like
445    printf.  */
446
447 static void pushf (int indent, struct ui_file *stream, const char *format, ...)
448   ATTRIBUTE_PRINTF (3, 4);
449
450 static void
451 pushf (int indent, struct ui_file *stream, const char *format, ...)
452 {
453   va_list args;
454
455   fprintfi_filtered (indent, stream, "__gdb_stack[__gdb_tos + 1] = ");
456   va_start (args, format);
457   vfprintf_filtered (stream, format, args);
458   va_end (args);
459   fprintf_filtered (stream, ";\n");
460
461   fprintfi_filtered (indent, stream, "++__gdb_tos;\n");
462 }
463
464 /* Emit code for a unary expression -- one which operates in-place on
465    the top-of-stack.  This works like printf.  */
466
467 static void unary (int indent, struct ui_file *stream, const char *format, ...)
468   ATTRIBUTE_PRINTF (3, 4);
469
470 static void
471 unary (int indent, struct ui_file *stream, const char *format, ...)
472 {
473   va_list args;
474
475   fprintfi_filtered (indent, stream, "__gdb_stack[__gdb_tos] = ");
476   va_start (args, format);
477   vfprintf_filtered (stream, format, args);
478   va_end (args);
479   fprintf_filtered (stream, ";\n");
480 }
481
482 /* Emit code for a unary expression -- one which uses the top two
483    stack items, popping the topmost one.  This works like printf.  */
484 static void binary (int indent, struct ui_file *stream, const char *format, ...)
485   ATTRIBUTE_PRINTF (3, 4);
486
487 static void
488 binary (int indent, struct ui_file *stream, const char *format, ...)
489 {
490   va_list args;
491
492   fprintfi_filtered (indent, stream, "__gdb_stack[__gdb_tos - 1] = ");
493   va_start (args, format);
494   vfprintf_filtered (stream, format, args);
495   va_end (args);
496   fprintf_filtered (stream, ";\n");
497   fprintfi_filtered (indent, stream, "--__gdb_tos;\n");
498 }
499
500 /* Print the name of a label given its "SCOPE", an arbitrary integer
501    used for uniqueness, and its TARGET, the bytecode offset
502    corresponding to the label's point of definition.  */
503
504 static void
505 print_label (struct ui_file *stream, unsigned int scope, int target)
506 {
507   fprintf_filtered (stream, "__label_%u_%s",
508                     scope, pulongest (target));
509 }
510
511 /* Emit code that pushes a register's address on the stack.
512    REGISTERS_USED is an out parameter which is updated to note which
513    register was needed by this expression.  */
514
515 static void
516 pushf_register_address (int indent, struct ui_file *stream,
517                         unsigned char *registers_used,
518                         struct gdbarch *gdbarch, int regnum)
519 {
520   char *regname = compile_register_name_mangled (gdbarch, regnum);
521   struct cleanup *cleanups = make_cleanup (xfree, regname);
522
523   registers_used[regnum] = 1;
524   pushf (indent, stream,
525          "(" GCC_UINTPTR ") &" COMPILE_I_SIMPLE_REGISTER_ARG_NAME "->%s",
526          regname);
527
528   do_cleanups (cleanups);
529 }
530
531 /* Emit code that pushes a register's value on the stack.
532    REGISTERS_USED is an out parameter which is updated to note which
533    register was needed by this expression.  OFFSET is added to the
534    register's value before it is pushed.  */
535
536 static void
537 pushf_register (int indent, struct ui_file *stream,
538                 unsigned char *registers_used,
539                 struct gdbarch *gdbarch, int regnum, uint64_t offset)
540 {
541   char *regname = compile_register_name_mangled (gdbarch, regnum);
542   struct cleanup *cleanups = make_cleanup (xfree, regname);
543
544   registers_used[regnum] = 1;
545   if (offset == 0)
546     pushf (indent, stream, COMPILE_I_SIMPLE_REGISTER_ARG_NAME "->%s",
547            regname);
548   else
549     pushf (indent, stream,
550            COMPILE_I_SIMPLE_REGISTER_ARG_NAME "->%s + (" GCC_UINTPTR ") %s",
551            regname, hex_string (offset));
552
553   do_cleanups (cleanups);
554 }
555
556 /* Compile a DWARF expression to C code.
557
558    INDENT is the indentation level to use.
559    STREAM is the stream where the code should be written.
560
561    TYPE_NAME names the type of the result of the DWARF expression.
562    For locations this is "void *" but for array bounds it will be an
563    integer type.
564
565    RESULT_NAME is the name of a variable in the resulting C code.  The
566    result of the expression will be assigned to this variable.
567
568    SYM is the symbol corresponding to this expression.
569    PC is the location at which the expression is being evaluated.
570    ARCH is the architecture to use.
571
572    REGISTERS_USED is an out parameter which is updated to note which
573    registers were needed by this expression.
574
575    ADDR_SIZE is the DWARF address size to use.
576
577    OPT_PTR and OP_END are the bounds of the DWARF expression.
578
579    If non-NULL, INITIAL points to an initial value to write to the
580    stack.  If NULL, no initial value is written.
581
582    PER_CU is the per-CU object used for looking up various other
583    things.  */
584
585 static void
586 do_compile_dwarf_expr_to_c (int indent, struct ui_file *stream,
587                             const char *type_name,
588                             const char *result_name,
589                             struct symbol *sym, CORE_ADDR pc,
590                             struct gdbarch *arch,
591                             unsigned char *registers_used,
592                             unsigned int addr_size,
593                             const gdb_byte *op_ptr, const gdb_byte *op_end,
594                             CORE_ADDR *initial,
595                             struct dwarf2_per_cu_data *per_cu)
596 {
597   /* We keep a counter so that labels and other objects we create have
598      unique names.  */
599   static unsigned int scope;
600
601   enum bfd_endian byte_order = gdbarch_byte_order (arch);
602   const gdb_byte * const base = op_ptr;
603   int need_tempvar = 0;
604   int is_tls = 0;
605   struct cleanup *cleanup;
606   struct insn_info *info;
607   int stack_depth;
608
609   ++scope;
610
611   fprintfi_filtered (indent, stream, "__attribute__ ((unused)) %s %s;\n",
612                      type_name, result_name);
613   fprintfi_filtered (indent, stream, "{\n");
614   indent += 2;
615
616   stack_depth = compute_stack_depth (byte_order, addr_size,
617                                      &need_tempvar, &is_tls,
618                                      op_ptr, op_end, initial != NULL,
619                                      &info);
620   cleanup = make_cleanup (xfree, info);
621
622   /* This is a hack until we can add a feature to glibc to let us
623      properly generate code for TLS.  You might think we could emit
624      the address in the ordinary course of translating
625      DW_OP_GNU_push_tls_address, but since the operand appears on the
626      stack, it is relatively hard to find, and the idea of calling
627      target_translate_tls_address with OFFSET==0 and then adding the
628      offset by hand seemed too hackish.  */
629   if (is_tls)
630     {
631       struct frame_info *frame = get_selected_frame (NULL);
632       struct value *val;
633
634       if (frame == NULL)
635         error (_("Symbol \"%s\" cannot be used because "
636                  "there is no selected frame"),
637                SYMBOL_PRINT_NAME (sym));
638
639       val = read_var_value (sym, frame);
640       if (VALUE_LVAL (val) != lval_memory)
641         error (_("Symbol \"%s\" cannot be used for compilation evaluation "
642                  "as its address has not been found."),
643                SYMBOL_PRINT_NAME (sym));
644
645       warning (_("Symbol \"%s\" is thread-local and currently can only "
646                  "be referenced from the current thread in "
647                  "compiled code."),
648                SYMBOL_PRINT_NAME (sym));
649
650       fprintfi_filtered (indent, stream, "%s = %s;\n",
651                          result_name,
652                          core_addr_to_string (value_address (val)));
653       fprintfi_filtered (indent - 2, stream, "}\n");
654       do_cleanups (cleanup);
655       return;
656     }
657
658   fprintfi_filtered (indent, stream, GCC_UINTPTR " __gdb_stack[%d];\n",
659                      stack_depth);
660
661   if (need_tempvar)
662     fprintfi_filtered (indent, stream, GCC_UINTPTR " __gdb_tmp;\n");
663   fprintfi_filtered (indent, stream, "int __gdb_tos = -1;\n");
664
665   if (initial != NULL)
666     pushf (indent, stream, "%s", core_addr_to_string (*initial));
667
668   while (op_ptr < op_end)
669     {
670       enum dwarf_location_atom op = (enum dwarf_location_atom) *op_ptr;
671       uint64_t uoffset, reg;
672       int64_t offset;
673
674       print_spaces (indent - 2, stream);
675       if (info[op_ptr - base].label)
676         {
677           print_label (stream, scope, op_ptr - base);
678           fprintf_filtered (stream, ":;");
679         }
680       fprintf_filtered (stream, "/* %s */\n", get_DW_OP_name (op));
681
682       /* This is handy for debugging the generated code:
683       fprintf_filtered (stream, "if (__gdb_tos != %d) abort ();\n",
684                         (int) info[op_ptr - base].depth - 1);
685       */
686
687       ++op_ptr;
688
689       switch (op)
690         {
691         case DW_OP_lit0:
692         case DW_OP_lit1:
693         case DW_OP_lit2:
694         case DW_OP_lit3:
695         case DW_OP_lit4:
696         case DW_OP_lit5:
697         case DW_OP_lit6:
698         case DW_OP_lit7:
699         case DW_OP_lit8:
700         case DW_OP_lit9:
701         case DW_OP_lit10:
702         case DW_OP_lit11:
703         case DW_OP_lit12:
704         case DW_OP_lit13:
705         case DW_OP_lit14:
706         case DW_OP_lit15:
707         case DW_OP_lit16:
708         case DW_OP_lit17:
709         case DW_OP_lit18:
710         case DW_OP_lit19:
711         case DW_OP_lit20:
712         case DW_OP_lit21:
713         case DW_OP_lit22:
714         case DW_OP_lit23:
715         case DW_OP_lit24:
716         case DW_OP_lit25:
717         case DW_OP_lit26:
718         case DW_OP_lit27:
719         case DW_OP_lit28:
720         case DW_OP_lit29:
721         case DW_OP_lit30:
722         case DW_OP_lit31:
723           push (indent, stream, op - DW_OP_lit0);
724           break;
725
726         case DW_OP_addr:
727           op_ptr += addr_size;
728           /* Some versions of GCC emit DW_OP_addr before
729              DW_OP_GNU_push_tls_address.  In this case the value is an
730              index, not an address.  We don't support things like
731              branching between the address and the TLS op.  */
732           if (op_ptr >= op_end || *op_ptr != DW_OP_GNU_push_tls_address)
733             uoffset += dwarf2_per_cu_text_offset (per_cu);
734           push (indent, stream, uoffset);
735           break;
736
737         case DW_OP_const1u:
738           push (indent, stream,
739                 extract_unsigned_integer (op_ptr, 1, byte_order));
740           op_ptr += 1;
741           break;
742         case DW_OP_const1s:
743           push (indent, stream,
744                 extract_signed_integer (op_ptr, 1, byte_order));
745           op_ptr += 1;
746           break;
747         case DW_OP_const2u:
748           push (indent, stream,
749                 extract_unsigned_integer (op_ptr, 2, byte_order));
750           op_ptr += 2;
751           break;
752         case DW_OP_const2s:
753           push (indent, stream,
754                 extract_signed_integer (op_ptr, 2, byte_order));
755           op_ptr += 2;
756           break;
757         case DW_OP_const4u:
758           push (indent, stream,
759                 extract_unsigned_integer (op_ptr, 4, byte_order));
760           op_ptr += 4;
761           break;
762         case DW_OP_const4s:
763           push (indent, stream,
764                 extract_signed_integer (op_ptr, 4, byte_order));
765           op_ptr += 4;
766           break;
767         case DW_OP_const8u:
768           push (indent, stream,
769                 extract_unsigned_integer (op_ptr, 8, byte_order));
770           op_ptr += 8;
771           break;
772         case DW_OP_const8s:
773           push (indent, stream,
774                 extract_signed_integer (op_ptr, 8, byte_order));
775           op_ptr += 8;
776           break;
777         case DW_OP_constu:
778           op_ptr = safe_read_uleb128 (op_ptr, op_end, &uoffset);
779           push (indent, stream, uoffset);
780           break;
781         case DW_OP_consts:
782           op_ptr = safe_read_sleb128 (op_ptr, op_end, &offset);
783           push (indent, stream, offset);
784           break;
785
786         case DW_OP_reg0:
787         case DW_OP_reg1:
788         case DW_OP_reg2:
789         case DW_OP_reg3:
790         case DW_OP_reg4:
791         case DW_OP_reg5:
792         case DW_OP_reg6:
793         case DW_OP_reg7:
794         case DW_OP_reg8:
795         case DW_OP_reg9:
796         case DW_OP_reg10:
797         case DW_OP_reg11:
798         case DW_OP_reg12:
799         case DW_OP_reg13:
800         case DW_OP_reg14:
801         case DW_OP_reg15:
802         case DW_OP_reg16:
803         case DW_OP_reg17:
804         case DW_OP_reg18:
805         case DW_OP_reg19:
806         case DW_OP_reg20:
807         case DW_OP_reg21:
808         case DW_OP_reg22:
809         case DW_OP_reg23:
810         case DW_OP_reg24:
811         case DW_OP_reg25:
812         case DW_OP_reg26:
813         case DW_OP_reg27:
814         case DW_OP_reg28:
815         case DW_OP_reg29:
816         case DW_OP_reg30:
817         case DW_OP_reg31:
818           dwarf_expr_require_composition (op_ptr, op_end, "DW_OP_regx");
819           pushf_register_address (indent, stream, registers_used, arch,
820                                   dwarf2_reg_to_regnum_or_error (arch,
821                                                               op - DW_OP_reg0));
822           break;
823
824         case DW_OP_regx:
825           op_ptr = safe_read_uleb128 (op_ptr, op_end, &reg);
826           dwarf_expr_require_composition (op_ptr, op_end, "DW_OP_regx");
827           pushf_register_address (indent, stream, registers_used, arch,
828                                   dwarf2_reg_to_regnum_or_error (arch, reg));
829           break;
830
831         case DW_OP_breg0:
832         case DW_OP_breg1:
833         case DW_OP_breg2:
834         case DW_OP_breg3:
835         case DW_OP_breg4:
836         case DW_OP_breg5:
837         case DW_OP_breg6:
838         case DW_OP_breg7:
839         case DW_OP_breg8:
840         case DW_OP_breg9:
841         case DW_OP_breg10:
842         case DW_OP_breg11:
843         case DW_OP_breg12:
844         case DW_OP_breg13:
845         case DW_OP_breg14:
846         case DW_OP_breg15:
847         case DW_OP_breg16:
848         case DW_OP_breg17:
849         case DW_OP_breg18:
850         case DW_OP_breg19:
851         case DW_OP_breg20:
852         case DW_OP_breg21:
853         case DW_OP_breg22:
854         case DW_OP_breg23:
855         case DW_OP_breg24:
856         case DW_OP_breg25:
857         case DW_OP_breg26:
858         case DW_OP_breg27:
859         case DW_OP_breg28:
860         case DW_OP_breg29:
861         case DW_OP_breg30:
862         case DW_OP_breg31:
863           op_ptr = safe_read_sleb128 (op_ptr, op_end, &offset);
864           pushf_register (indent, stream, registers_used, arch,
865                           dwarf2_reg_to_regnum_or_error (arch,
866                                                          op - DW_OP_breg0),
867                           offset);
868           break;
869         case DW_OP_bregx:
870           {
871             op_ptr = safe_read_uleb128 (op_ptr, op_end, &reg);
872             op_ptr = safe_read_sleb128 (op_ptr, op_end, &offset);
873             pushf_register (indent, stream, registers_used, arch,
874                             dwarf2_reg_to_regnum_or_error (arch, reg), offset);
875           }
876           break;
877         case DW_OP_fbreg:
878           {
879             const gdb_byte *datastart;
880             size_t datalen;
881             const struct block *b;
882             struct symbol *framefunc;
883             char fb_name[50];
884
885             b = block_for_pc (pc);
886
887             if (!b)
888               error (_("No block found for address"));
889
890             framefunc = block_linkage_function (b);
891
892             if (!framefunc)
893               error (_("No function found for block"));
894
895             func_get_frame_base_dwarf_block (framefunc, pc,
896                                              &datastart, &datalen);
897
898             op_ptr = safe_read_sleb128 (op_ptr, op_end, &offset);
899
900             /* Generate a unique-enough name, in case the frame base
901                is computed multiple times in this expression.  */
902             xsnprintf (fb_name, sizeof (fb_name), "__frame_base_%ld",
903                        (long) (op_ptr - base));
904
905             do_compile_dwarf_expr_to_c (indent, stream,
906                                         GCC_UINTPTR, fb_name,
907                                         sym, pc,
908                                         arch, registers_used, addr_size,
909                                         datastart, datastart + datalen,
910                                         NULL, per_cu);
911
912             pushf (indent, stream, "%s + %s", fb_name, hex_string (offset));
913           }
914           break;
915
916         case DW_OP_dup:
917           pushf (indent, stream, "__gdb_stack[__gdb_tos]");
918           break;
919
920         case DW_OP_drop:
921           fprintfi_filtered (indent, stream, "--__gdb_tos;\n");
922           break;
923
924         case DW_OP_pick:
925           offset = *op_ptr++;
926           pushf (indent, stream, "__gdb_stack[__gdb_tos - %s]",
927                  plongest (offset));
928           break;
929
930         case DW_OP_swap:
931           fprintfi_filtered (indent, stream,
932                              "__gdb_tmp = __gdb_stack[__gdb_tos - 1];\n");
933           fprintfi_filtered (indent, stream,
934                              "__gdb_stack[__gdb_tos - 1] = "
935                              "__gdb_stack[__gdb_tos];\n");
936           fprintfi_filtered (indent, stream, ("__gdb_stack[__gdb_tos] = "
937                                               "__gdb_tmp;\n"));
938           break;
939
940         case DW_OP_over:
941           pushf (indent, stream, "__gdb_stack[__gdb_tos - 1]");
942           break;
943
944         case DW_OP_rot:
945           fprintfi_filtered (indent, stream, ("__gdb_tmp = "
946                                               "__gdb_stack[__gdb_tos];\n"));
947           fprintfi_filtered (indent, stream,
948                              "__gdb_stack[__gdb_tos] = "
949                              "__gdb_stack[__gdb_tos - 1];\n");
950           fprintfi_filtered (indent, stream,
951                              "__gdb_stack[__gdb_tos - 1] = "
952                              "__gdb_stack[__gdb_tos -2];\n");
953           fprintfi_filtered (indent, stream, "__gdb_stack[__gdb_tos - 2] = "
954                              "__gdb_tmp;\n");
955           break;
956
957         case DW_OP_deref:
958         case DW_OP_deref_size:
959           {
960             int size;
961             const char *mode;
962
963             if (op == DW_OP_deref_size)
964               size = *op_ptr++;
965             else
966               size = addr_size;
967
968             mode = c_get_mode_for_size (size);
969             if (mode == NULL)
970               error (_("Unsupported size %d in %s"),
971                      size, get_DW_OP_name (op));
972
973             /* Cast to a pointer of the desired type, then
974                dereference.  */
975             fprintfi_filtered (indent, stream,
976                                "__gdb_stack[__gdb_tos] = "
977                                "*((__gdb_int_%s *) "
978                                "__gdb_stack[__gdb_tos]);\n",
979                                mode);
980           }
981           break;
982
983         case DW_OP_abs:
984           unary (indent, stream,
985                  "((" GCC_INTPTR ") __gdb_stack[__gdb_tos]) < 0 ? "
986                  "-__gdb_stack[__gdb_tos] : __gdb_stack[__gdb_tos]");
987           break;
988
989         case DW_OP_neg:
990           unary (indent, stream, "-__gdb_stack[__gdb_tos]");
991           break;
992
993         case DW_OP_not:
994           unary (indent, stream, "~__gdb_stack[__gdb_tos]");
995           break;
996
997         case DW_OP_plus_uconst:
998           op_ptr = safe_read_uleb128 (op_ptr, op_end, &reg);
999           unary (indent, stream, "__gdb_stack[__gdb_tos] + %s",
1000                  hex_string (reg));
1001           break;
1002
1003         case DW_OP_div:
1004           binary (indent, stream, ("((" GCC_INTPTR
1005                                    ") __gdb_stack[__gdb_tos-1]) / (("
1006                                    GCC_INTPTR ") __gdb_stack[__gdb_tos])"));
1007           break;
1008
1009         case DW_OP_shra:
1010           binary (indent, stream,
1011                   "((" GCC_INTPTR ") __gdb_stack[__gdb_tos-1]) >> "
1012                   "__gdb_stack[__gdb_tos]");
1013           break;
1014
1015 #define BINARY(OP)                                                      \
1016           binary (indent, stream, "%s", "__gdb_stack[__gdb_tos-1] " #OP \
1017                                    " __gdb_stack[__gdb_tos]");  \
1018           break
1019
1020         case DW_OP_and:
1021           BINARY (&);
1022         case DW_OP_minus:
1023           BINARY (-);
1024         case DW_OP_mod:
1025           BINARY (%);
1026         case DW_OP_mul:
1027           BINARY (*);
1028         case DW_OP_or:
1029           BINARY (|);
1030         case DW_OP_plus:
1031           BINARY (+);
1032         case DW_OP_shl:
1033           BINARY (<<);
1034         case DW_OP_shr:
1035           BINARY (>>);
1036         case DW_OP_xor:
1037           BINARY (^);
1038 #undef BINARY
1039
1040 #define COMPARE(OP)                                                     \
1041           binary (indent, stream,                                       \
1042                   "(((" GCC_INTPTR ") __gdb_stack[__gdb_tos-1]) " #OP   \
1043                   " ((" GCC_INTPTR                                      \
1044                   ") __gdb_stack[__gdb_tos]))");                        \
1045           break
1046
1047         case DW_OP_le:
1048           COMPARE (<=);
1049         case DW_OP_ge:
1050           COMPARE (>=);
1051         case DW_OP_eq:
1052           COMPARE (==);
1053         case DW_OP_lt:
1054           COMPARE (<);
1055         case DW_OP_gt:
1056           COMPARE (>);
1057         case DW_OP_ne:
1058           COMPARE (!=);
1059 #undef COMPARE
1060
1061         case DW_OP_call_frame_cfa:
1062           {
1063             int regnum;
1064             CORE_ADDR text_offset;
1065             LONGEST off;
1066             const gdb_byte *cfa_start, *cfa_end;
1067
1068             if (dwarf2_fetch_cfa_info (arch, pc, per_cu,
1069                                        &regnum, &off,
1070                                        &text_offset, &cfa_start, &cfa_end))
1071               {
1072                 /* Register.  */
1073                 pushf_register (indent, stream, registers_used, arch, regnum,
1074                                 off);
1075               }
1076             else
1077               {
1078                 /* Another expression.  */
1079                 char cfa_name[50];
1080
1081                 /* Generate a unique-enough name, in case the CFA is
1082                    computed multiple times in this expression.  */
1083                 xsnprintf (cfa_name, sizeof (cfa_name),
1084                            "__cfa_%ld", (long) (op_ptr - base));
1085
1086                 do_compile_dwarf_expr_to_c (indent, stream,
1087                                             GCC_UINTPTR, cfa_name,
1088                                             sym, pc, arch, registers_used,
1089                                             addr_size,
1090                                             cfa_start, cfa_end,
1091                                             &text_offset, per_cu);
1092                 pushf (indent, stream, "%s", cfa_name);
1093               }
1094           }
1095
1096           break;
1097
1098         case DW_OP_skip:
1099           offset = extract_signed_integer (op_ptr, 2, byte_order);
1100           op_ptr += 2;
1101           fprintfi_filtered (indent, stream, "goto ");
1102           print_label (stream, scope, op_ptr + offset - base);
1103           fprintf_filtered (stream, ";\n");
1104           break;
1105
1106         case DW_OP_bra:
1107           offset = extract_signed_integer (op_ptr, 2, byte_order);
1108           op_ptr += 2;
1109           fprintfi_filtered (indent, stream,
1110                              "if ((( " GCC_INTPTR
1111                              ") __gdb_stack[__gdb_tos--]) != 0) goto ");
1112           print_label (stream, scope, op_ptr + offset - base);
1113           fprintf_filtered (stream, ";\n");
1114           break;
1115
1116         case DW_OP_nop:
1117           break;
1118
1119         default:
1120           error (_("unhandled DWARF op: %s"), get_DW_OP_name (op));
1121         }
1122     }
1123
1124   fprintfi_filtered (indent, stream, "%s = __gdb_stack[__gdb_tos];\n",
1125                      result_name);
1126   fprintfi_filtered (indent - 2, stream, "}\n");
1127
1128   do_cleanups (cleanup);
1129 }
1130
1131 /* See compile.h.  */
1132
1133 void
1134 compile_dwarf_expr_to_c (struct ui_file *stream, const char *result_name,
1135                          struct symbol *sym, CORE_ADDR pc,
1136                          struct gdbarch *arch, unsigned char *registers_used,
1137                          unsigned int addr_size,
1138                          const gdb_byte *op_ptr, const gdb_byte *op_end,
1139                          struct dwarf2_per_cu_data *per_cu)
1140 {
1141   do_compile_dwarf_expr_to_c (2, stream, GCC_UINTPTR, result_name, sym, pc,
1142                               arch, registers_used, addr_size, op_ptr, op_end,
1143                               NULL, per_cu);
1144 }
1145
1146 /* See compile.h.  */
1147
1148 void
1149 compile_dwarf_bounds_to_c (struct ui_file *stream,
1150                            const char *result_name,
1151                            const struct dynamic_prop *prop,
1152                            struct symbol *sym, CORE_ADDR pc,
1153                            struct gdbarch *arch, unsigned char *registers_used,
1154                            unsigned int addr_size,
1155                            const gdb_byte *op_ptr, const gdb_byte *op_end,
1156                            struct dwarf2_per_cu_data *per_cu)
1157 {
1158   do_compile_dwarf_expr_to_c (2, stream, "unsigned long ", result_name,
1159                               sym, pc, arch, registers_used,
1160                               addr_size, op_ptr, op_end, NULL, per_cu);
1161 }