xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/compile/compile-loc2c.c (revision 8ecbf5f02b752fcb7debe1a8fab1dc82602bc760)
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 
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 
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 	  op_ptr += addr_size;
726 	  /* Some versions of GCC emit DW_OP_addr before
727 	     DW_OP_GNU_push_tls_address.  In this case the value is an
728 	     index, not an address.  We don't support things like
729 	     branching between the address and the TLS op.  */
730 	  if (op_ptr >= op_end || *op_ptr != DW_OP_GNU_push_tls_address)
731 	    uoffset += dwarf2_per_cu_text_offset (per_cu);
732 	  push (indent, stream, uoffset);
733 	  break;
734 
735 	case DW_OP_const1u:
736 	  push (indent, stream,
737 		extract_unsigned_integer (op_ptr, 1, byte_order));
738 	  op_ptr += 1;
739 	  break;
740 	case DW_OP_const1s:
741 	  push (indent, stream,
742 		extract_signed_integer (op_ptr, 1, byte_order));
743 	  op_ptr += 1;
744 	  break;
745 	case DW_OP_const2u:
746 	  push (indent, stream,
747 		extract_unsigned_integer (op_ptr, 2, byte_order));
748 	  op_ptr += 2;
749 	  break;
750 	case DW_OP_const2s:
751 	  push (indent, stream,
752 		extract_signed_integer (op_ptr, 2, byte_order));
753 	  op_ptr += 2;
754 	  break;
755 	case DW_OP_const4u:
756 	  push (indent, stream,
757 		extract_unsigned_integer (op_ptr, 4, byte_order));
758 	  op_ptr += 4;
759 	  break;
760 	case DW_OP_const4s:
761 	  push (indent, stream,
762 		extract_signed_integer (op_ptr, 4, byte_order));
763 	  op_ptr += 4;
764 	  break;
765 	case DW_OP_const8u:
766 	  push (indent, stream,
767 		extract_unsigned_integer (op_ptr, 8, byte_order));
768 	  op_ptr += 8;
769 	  break;
770 	case DW_OP_const8s:
771 	  push (indent, stream,
772 		extract_signed_integer (op_ptr, 8, byte_order));
773 	  op_ptr += 8;
774 	  break;
775 	case DW_OP_constu:
776 	  op_ptr = safe_read_uleb128 (op_ptr, op_end, &uoffset);
777 	  push (indent, stream, uoffset);
778 	  break;
779 	case DW_OP_consts:
780 	  op_ptr = safe_read_sleb128 (op_ptr, op_end, &offset);
781 	  push (indent, stream, offset);
782 	  break;
783 
784 	case DW_OP_reg0:
785 	case DW_OP_reg1:
786 	case DW_OP_reg2:
787 	case DW_OP_reg3:
788 	case DW_OP_reg4:
789 	case DW_OP_reg5:
790 	case DW_OP_reg6:
791 	case DW_OP_reg7:
792 	case DW_OP_reg8:
793 	case DW_OP_reg9:
794 	case DW_OP_reg10:
795 	case DW_OP_reg11:
796 	case DW_OP_reg12:
797 	case DW_OP_reg13:
798 	case DW_OP_reg14:
799 	case DW_OP_reg15:
800 	case DW_OP_reg16:
801 	case DW_OP_reg17:
802 	case DW_OP_reg18:
803 	case DW_OP_reg19:
804 	case DW_OP_reg20:
805 	case DW_OP_reg21:
806 	case DW_OP_reg22:
807 	case DW_OP_reg23:
808 	case DW_OP_reg24:
809 	case DW_OP_reg25:
810 	case DW_OP_reg26:
811 	case DW_OP_reg27:
812 	case DW_OP_reg28:
813 	case DW_OP_reg29:
814 	case DW_OP_reg30:
815 	case DW_OP_reg31:
816 	  dwarf_expr_require_composition (op_ptr, op_end, "DW_OP_regx");
817 	  pushf_register_address (indent, stream, registers_used, arch,
818 				  dwarf_reg_to_regnum_or_error
819 				    (arch, op - DW_OP_reg0));
820 	  break;
821 
822 	case DW_OP_regx:
823 	  op_ptr = safe_read_uleb128 (op_ptr, op_end, &reg);
824 	  dwarf_expr_require_composition (op_ptr, op_end, "DW_OP_regx");
825 	  pushf_register_address (indent, stream, registers_used, arch,
826 				  dwarf_reg_to_regnum_or_error (arch, reg));
827 	  break;
828 
829 	case DW_OP_breg0:
830 	case DW_OP_breg1:
831 	case DW_OP_breg2:
832 	case DW_OP_breg3:
833 	case DW_OP_breg4:
834 	case DW_OP_breg5:
835 	case DW_OP_breg6:
836 	case DW_OP_breg7:
837 	case DW_OP_breg8:
838 	case DW_OP_breg9:
839 	case DW_OP_breg10:
840 	case DW_OP_breg11:
841 	case DW_OP_breg12:
842 	case DW_OP_breg13:
843 	case DW_OP_breg14:
844 	case DW_OP_breg15:
845 	case DW_OP_breg16:
846 	case DW_OP_breg17:
847 	case DW_OP_breg18:
848 	case DW_OP_breg19:
849 	case DW_OP_breg20:
850 	case DW_OP_breg21:
851 	case DW_OP_breg22:
852 	case DW_OP_breg23:
853 	case DW_OP_breg24:
854 	case DW_OP_breg25:
855 	case DW_OP_breg26:
856 	case DW_OP_breg27:
857 	case DW_OP_breg28:
858 	case DW_OP_breg29:
859 	case DW_OP_breg30:
860 	case DW_OP_breg31:
861 	  op_ptr = safe_read_sleb128 (op_ptr, op_end, &offset);
862 	  pushf_register (indent, stream, registers_used, arch,
863 			  dwarf_reg_to_regnum_or_error (arch,
864 							op - DW_OP_breg0),
865 			  offset);
866 	  break;
867 	case DW_OP_bregx:
868 	  {
869 	    op_ptr = safe_read_uleb128 (op_ptr, op_end, &reg);
870 	    op_ptr = safe_read_sleb128 (op_ptr, op_end, &offset);
871 	    pushf_register (indent, stream, registers_used, arch,
872 			    dwarf_reg_to_regnum_or_error (arch, reg), offset);
873 	  }
874 	  break;
875 	case DW_OP_fbreg:
876 	  {
877 	    const gdb_byte *datastart;
878 	    size_t datalen;
879 	    const struct block *b;
880 	    struct symbol *framefunc;
881 	    char fb_name[50];
882 
883 	    b = block_for_pc (pc);
884 
885 	    if (!b)
886 	      error (_("No block found for address"));
887 
888 	    framefunc = block_linkage_function (b);
889 
890 	    if (!framefunc)
891 	      error (_("No function found for block"));
892 
893 	    func_get_frame_base_dwarf_block (framefunc, pc,
894 					     &datastart, &datalen);
895 
896 	    op_ptr = safe_read_sleb128 (op_ptr, op_end, &offset);
897 
898 	    /* Generate a unique-enough name, in case the frame base
899 	       is computed multiple times in this expression.  */
900 	    xsnprintf (fb_name, sizeof (fb_name), "__frame_base_%ld",
901 		       (long) (op_ptr - base));
902 
903 	    do_compile_dwarf_expr_to_c (indent, stream,
904 					GCC_UINTPTR, fb_name,
905 					sym, pc,
906 					arch, registers_used, addr_size,
907 					datastart, datastart + datalen,
908 					NULL, per_cu);
909 
910 	    pushf (indent, stream, "%s + %s", fb_name, hex_string (offset));
911 	  }
912 	  break;
913 
914 	case DW_OP_dup:
915 	  pushf (indent, stream, "__gdb_stack[__gdb_tos]");
916 	  break;
917 
918 	case DW_OP_drop:
919 	  fprintfi_filtered (indent, &stream, "--__gdb_tos;\n");
920 	  break;
921 
922 	case DW_OP_pick:
923 	  offset = *op_ptr++;
924 	  pushf (indent, stream, "__gdb_stack[__gdb_tos - %s]",
925 		 plongest (offset));
926 	  break;
927 
928 	case DW_OP_swap:
929 	  fprintfi_filtered (indent, &stream,
930 			     "__gdb_tmp = __gdb_stack[__gdb_tos - 1];\n");
931 	  fprintfi_filtered (indent, &stream,
932 			     "__gdb_stack[__gdb_tos - 1] = "
933 			     "__gdb_stack[__gdb_tos];\n");
934 	  fprintfi_filtered (indent, &stream, ("__gdb_stack[__gdb_tos] = "
935 					       "__gdb_tmp;\n"));
936 	  break;
937 
938 	case DW_OP_over:
939 	  pushf (indent, stream, "__gdb_stack[__gdb_tos - 1]");
940 	  break;
941 
942 	case DW_OP_rot:
943 	  fprintfi_filtered (indent, &stream, ("__gdb_tmp = "
944 					       "__gdb_stack[__gdb_tos];\n"));
945 	  fprintfi_filtered (indent, &stream,
946 			     "__gdb_stack[__gdb_tos] = "
947 			     "__gdb_stack[__gdb_tos - 1];\n");
948 	  fprintfi_filtered (indent, &stream,
949 			     "__gdb_stack[__gdb_tos - 1] = "
950 			     "__gdb_stack[__gdb_tos -2];\n");
951 	  fprintfi_filtered (indent, &stream, "__gdb_stack[__gdb_tos - 2] = "
952 			     "__gdb_tmp;\n");
953 	  break;
954 
955 	case DW_OP_deref:
956 	case DW_OP_deref_size:
957 	  {
958 	    int size;
959 	    const char *mode;
960 
961 	    if (op == DW_OP_deref_size)
962 	      size = *op_ptr++;
963 	    else
964 	      size = addr_size;
965 
966 	    mode = c_get_mode_for_size (size);
967 	    if (mode == NULL)
968 	      error (_("Unsupported size %d in %s"),
969 		     size, get_DW_OP_name (op));
970 
971 	    /* Cast to a pointer of the desired type, then
972 	       dereference.  */
973 	    fprintfi_filtered (indent, &stream,
974 			       "__gdb_stack[__gdb_tos] = "
975 			       "*((__gdb_int_%s *) "
976 			       "__gdb_stack[__gdb_tos]);\n",
977 			       mode);
978 	  }
979 	  break;
980 
981 	case DW_OP_abs:
982 	  unary (indent, stream,
983 		 "((" GCC_INTPTR ") __gdb_stack[__gdb_tos]) < 0 ? "
984 		 "-__gdb_stack[__gdb_tos] : __gdb_stack[__gdb_tos]");
985 	  break;
986 
987 	case DW_OP_neg:
988 	  unary (indent, stream, "-__gdb_stack[__gdb_tos]");
989 	  break;
990 
991 	case DW_OP_not:
992 	  unary (indent, stream, "~__gdb_stack[__gdb_tos]");
993 	  break;
994 
995 	case DW_OP_plus_uconst:
996 	  op_ptr = safe_read_uleb128 (op_ptr, op_end, &reg);
997 	  unary (indent, stream, "__gdb_stack[__gdb_tos] + %s",
998 		 hex_string (reg));
999 	  break;
1000 
1001 	case DW_OP_div:
1002 	  binary (indent, stream, ("((" GCC_INTPTR
1003 				   ") __gdb_stack[__gdb_tos-1]) / (("
1004 				   GCC_INTPTR ") __gdb_stack[__gdb_tos])"));
1005 	  break;
1006 
1007 	case DW_OP_shra:
1008 	  binary (indent, stream,
1009 		  "((" GCC_INTPTR ") __gdb_stack[__gdb_tos-1]) >> "
1010 		  "__gdb_stack[__gdb_tos]");
1011 	  break;
1012 
1013 #define BINARY(OP)							\
1014 	  binary (indent, stream, "%s", "__gdb_stack[__gdb_tos-1] " #OP \
1015 				   " __gdb_stack[__gdb_tos]");	\
1016 	  break
1017 
1018 	case DW_OP_and:
1019 	  BINARY (&);
1020 	case DW_OP_minus:
1021 	  BINARY (-);
1022 	case DW_OP_mod:
1023 	  BINARY (%);
1024 	case DW_OP_mul:
1025 	  BINARY (*);
1026 	case DW_OP_or:
1027 	  BINARY (|);
1028 	case DW_OP_plus:
1029 	  BINARY (+);
1030 	case DW_OP_shl:
1031 	  BINARY (<<);
1032 	case DW_OP_shr:
1033 	  BINARY (>>);
1034 	case DW_OP_xor:
1035 	  BINARY (^);
1036 #undef BINARY
1037 
1038 #define COMPARE(OP)							\
1039 	  binary (indent, stream,					\
1040 		  "(((" GCC_INTPTR ") __gdb_stack[__gdb_tos-1]) " #OP	\
1041 		  " ((" GCC_INTPTR					\
1042 		  ") __gdb_stack[__gdb_tos]))");			\
1043 	  break
1044 
1045 	case DW_OP_le:
1046 	  COMPARE (<=);
1047 	case DW_OP_ge:
1048 	  COMPARE (>=);
1049 	case DW_OP_eq:
1050 	  COMPARE (==);
1051 	case DW_OP_lt:
1052 	  COMPARE (<);
1053 	case DW_OP_gt:
1054 	  COMPARE (>);
1055 	case DW_OP_ne:
1056 	  COMPARE (!=);
1057 #undef COMPARE
1058 
1059 	case DW_OP_call_frame_cfa:
1060 	  {
1061 	    int regnum;
1062 	    CORE_ADDR text_offset;
1063 	    LONGEST off;
1064 	    const gdb_byte *cfa_start, *cfa_end;
1065 
1066 	    if (dwarf2_fetch_cfa_info (arch, pc, per_cu,
1067 				       &regnum, &off,
1068 				       &text_offset, &cfa_start, &cfa_end))
1069 	      {
1070 		/* Register.  */
1071 		pushf_register (indent, stream, registers_used, arch, regnum,
1072 				off);
1073 	      }
1074 	    else
1075 	      {
1076 		/* Another expression.  */
1077 		char cfa_name[50];
1078 
1079 		/* Generate a unique-enough name, in case the CFA is
1080 		   computed multiple times in this expression.  */
1081 		xsnprintf (cfa_name, sizeof (cfa_name),
1082 			   "__cfa_%ld", (long) (op_ptr - base));
1083 
1084 		do_compile_dwarf_expr_to_c (indent, stream,
1085 					    GCC_UINTPTR, cfa_name,
1086 					    sym, pc, arch, registers_used,
1087 					    addr_size,
1088 					    cfa_start, cfa_end,
1089 					    &text_offset, per_cu);
1090 		pushf (indent, stream, "%s", cfa_name);
1091 	      }
1092 	  }
1093 
1094 	  break;
1095 
1096 	case DW_OP_skip:
1097 	  offset = extract_signed_integer (op_ptr, 2, byte_order);
1098 	  op_ptr += 2;
1099 	  fprintfi_filtered (indent, &stream, "goto ");
1100 	  print_label (stream, scope, op_ptr + offset - base);
1101 	  stream.puts (";\n");
1102 	  break;
1103 
1104 	case DW_OP_bra:
1105 	  offset = extract_signed_integer (op_ptr, 2, byte_order);
1106 	  op_ptr += 2;
1107 	  fprintfi_filtered (indent, &stream,
1108 			     "if ((( " GCC_INTPTR
1109 			     ") __gdb_stack[__gdb_tos--]) != 0) goto ");
1110 	  print_label (stream, scope, op_ptr + offset - base);
1111 	  stream.puts (";\n");
1112 	  break;
1113 
1114 	case DW_OP_nop:
1115 	  break;
1116 
1117 	default:
1118 	  error (_("unhandled DWARF op: %s"), get_DW_OP_name (op));
1119 	}
1120     }
1121 
1122   fprintfi_filtered (indent, &stream, "%s = __gdb_stack[__gdb_tos];\n",
1123 		     result_name);
1124   fprintfi_filtered (indent - 2, &stream, "}\n");
1125 
1126   do_cleanups (cleanup);
1127 }
1128 
1129 /* See compile.h.  */
1130 
1131 void
1132 compile_dwarf_expr_to_c (string_file &stream, const char *result_name,
1133 			 struct symbol *sym, CORE_ADDR pc,
1134 			 struct gdbarch *arch, unsigned char *registers_used,
1135 			 unsigned int addr_size,
1136 			 const gdb_byte *op_ptr, const gdb_byte *op_end,
1137 			 struct dwarf2_per_cu_data *per_cu)
1138 {
1139   do_compile_dwarf_expr_to_c (2, stream, GCC_UINTPTR, result_name, sym, pc,
1140 			      arch, registers_used, addr_size, op_ptr, op_end,
1141 			      NULL, per_cu);
1142 }
1143 
1144 /* See compile.h.  */
1145 
1146 void
1147 compile_dwarf_bounds_to_c (string_file &stream,
1148 			   const char *result_name,
1149 			   const struct dynamic_prop *prop,
1150 			   struct symbol *sym, CORE_ADDR pc,
1151 			   struct gdbarch *arch, unsigned char *registers_used,
1152 			   unsigned int addr_size,
1153 			   const gdb_byte *op_ptr, const gdb_byte *op_end,
1154 			   struct dwarf2_per_cu_data *per_cu)
1155 {
1156   do_compile_dwarf_expr_to_c (2, stream, "unsigned long ", result_name,
1157 			      sym, pc, arch, registers_used,
1158 			      addr_size, op_ptr, op_end, NULL, per_cu);
1159 }
1160