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