*** empty log message ***
[deliverable/binutils-gdb.git] / gdb / dwarf2loc.c
1 /* DWARF 2 location expression support for GDB.
2
3 Copyright (C) 2003, 2005, 2007, 2008, 2009, 2010
4 Free Software Foundation, Inc.
5
6 Contributed by Daniel Jacobowitz, MontaVista Software, Inc.
7
8 This file is part of GDB.
9
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 3 of the License, or
13 (at your option) any later version.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program. If not, see <http://www.gnu.org/licenses/>. */
22
23 #include "defs.h"
24 #include "ui-out.h"
25 #include "value.h"
26 #include "frame.h"
27 #include "gdbcore.h"
28 #include "target.h"
29 #include "inferior.h"
30 #include "ax.h"
31 #include "ax-gdb.h"
32 #include "regcache.h"
33 #include "objfiles.h"
34 #include "exceptions.h"
35 #include "block.h"
36
37 #include "dwarf2.h"
38 #include "dwarf2expr.h"
39 #include "dwarf2loc.h"
40 #include "dwarf2-frame.h"
41
42 #include "gdb_string.h"
43 #include "gdb_assert.h"
44
45 static void
46 dwarf_expr_frame_base_1 (struct symbol *framefunc, CORE_ADDR pc,
47 gdb_byte **start, size_t *length);
48
49 /* A helper function for dealing with location lists. Given a
50 symbol baton (BATON) and a pc value (PC), find the appropriate
51 location expression, set *LOCEXPR_LENGTH, and return a pointer
52 to the beginning of the expression. Returns NULL on failure.
53
54 For now, only return the first matching location expression; there
55 can be more than one in the list. */
56
57 static gdb_byte *
58 find_location_expression (struct dwarf2_loclist_baton *baton,
59 size_t *locexpr_length, CORE_ADDR pc)
60 {
61 CORE_ADDR low, high;
62 gdb_byte *loc_ptr, *buf_end;
63 int length;
64 struct objfile *objfile = dwarf2_per_cu_objfile (baton->per_cu);
65 struct gdbarch *gdbarch = get_objfile_arch (objfile);
66 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
67 unsigned int addr_size = dwarf2_per_cu_addr_size (baton->per_cu);
68 CORE_ADDR base_mask = ~(~(CORE_ADDR)1 << (addr_size * 8 - 1));
69 /* Adjust base_address for relocatable objects. */
70 CORE_ADDR base_offset = ANOFFSET (objfile->section_offsets,
71 SECT_OFF_TEXT (objfile));
72 CORE_ADDR base_address = baton->base_address + base_offset;
73
74 loc_ptr = baton->data;
75 buf_end = baton->data + baton->size;
76
77 while (1)
78 {
79 if (buf_end - loc_ptr < 2 * addr_size)
80 error (_("find_location_expression: Corrupted DWARF expression."));
81
82 low = extract_unsigned_integer (loc_ptr, addr_size, byte_order);
83 loc_ptr += addr_size;
84
85 /* A base-address-selection entry. */
86 if (low == base_mask)
87 {
88 base_address = dwarf2_read_address (gdbarch,
89 loc_ptr, buf_end, addr_size);
90 loc_ptr += addr_size;
91 continue;
92 }
93
94 high = extract_unsigned_integer (loc_ptr, addr_size, byte_order);
95 loc_ptr += addr_size;
96
97 /* An end-of-list entry. */
98 if (low == 0 && high == 0)
99 return NULL;
100
101 /* Otherwise, a location expression entry. */
102 low += base_address;
103 high += base_address;
104
105 length = extract_unsigned_integer (loc_ptr, 2, byte_order);
106 loc_ptr += 2;
107
108 if (pc >= low && pc < high)
109 {
110 *locexpr_length = length;
111 return loc_ptr;
112 }
113
114 loc_ptr += length;
115 }
116 }
117
118 /* This is the baton used when performing dwarf2 expression
119 evaluation. */
120 struct dwarf_expr_baton
121 {
122 struct frame_info *frame;
123 struct objfile *objfile;
124 };
125
126 /* Helper functions for dwarf2_evaluate_loc_desc. */
127
128 /* Using the frame specified in BATON, return the value of register
129 REGNUM, treated as a pointer. */
130 static CORE_ADDR
131 dwarf_expr_read_reg (void *baton, int dwarf_regnum)
132 {
133 struct dwarf_expr_baton *debaton = (struct dwarf_expr_baton *) baton;
134 struct gdbarch *gdbarch = get_frame_arch (debaton->frame);
135 CORE_ADDR result;
136 int regnum;
137
138 regnum = gdbarch_dwarf2_reg_to_regnum (gdbarch, dwarf_regnum);
139 result = address_from_register (builtin_type (gdbarch)->builtin_data_ptr,
140 regnum, debaton->frame);
141 return result;
142 }
143
144 /* Read memory at ADDR (length LEN) into BUF. */
145
146 static void
147 dwarf_expr_read_mem (void *baton, gdb_byte *buf, CORE_ADDR addr, size_t len)
148 {
149 read_memory (addr, buf, len);
150 }
151
152 /* Using the frame specified in BATON, find the location expression
153 describing the frame base. Return a pointer to it in START and
154 its length in LENGTH. */
155 static void
156 dwarf_expr_frame_base (void *baton, gdb_byte **start, size_t * length)
157 {
158 /* FIXME: cagney/2003-03-26: This code should be using
159 get_frame_base_address(), and then implement a dwarf2 specific
160 this_base method. */
161 struct symbol *framefunc;
162 struct dwarf_expr_baton *debaton = (struct dwarf_expr_baton *) baton;
163
164 /* Use block_linkage_function, which returns a real (not inlined)
165 function, instead of get_frame_function, which may return an
166 inlined function. */
167 framefunc = block_linkage_function (get_frame_block (debaton->frame, NULL));
168
169 /* If we found a frame-relative symbol then it was certainly within
170 some function associated with a frame. If we can't find the frame,
171 something has gone wrong. */
172 gdb_assert (framefunc != NULL);
173
174 dwarf_expr_frame_base_1 (framefunc,
175 get_frame_address_in_block (debaton->frame),
176 start, length);
177 }
178
179 static void
180 dwarf_expr_frame_base_1 (struct symbol *framefunc, CORE_ADDR pc,
181 gdb_byte **start, size_t *length)
182 {
183 if (SYMBOL_LOCATION_BATON (framefunc) == NULL)
184 *start = NULL;
185 else if (SYMBOL_COMPUTED_OPS (framefunc) == &dwarf2_loclist_funcs)
186 {
187 struct dwarf2_loclist_baton *symbaton;
188
189 symbaton = SYMBOL_LOCATION_BATON (framefunc);
190 *start = find_location_expression (symbaton, length, pc);
191 }
192 else
193 {
194 struct dwarf2_locexpr_baton *symbaton;
195 symbaton = SYMBOL_LOCATION_BATON (framefunc);
196 if (symbaton != NULL)
197 {
198 *length = symbaton->size;
199 *start = symbaton->data;
200 }
201 else
202 *start = NULL;
203 }
204
205 if (*start == NULL)
206 error (_("Could not find the frame base for \"%s\"."),
207 SYMBOL_NATURAL_NAME (framefunc));
208 }
209
210 /* Helper function for dwarf2_evaluate_loc_desc. Computes the CFA for
211 the frame in BATON. */
212
213 static CORE_ADDR
214 dwarf_expr_frame_cfa (void *baton)
215 {
216 struct dwarf_expr_baton *debaton = (struct dwarf_expr_baton *) baton;
217 return dwarf2_frame_cfa (debaton->frame);
218 }
219
220 /* Using the objfile specified in BATON, find the address for the
221 current thread's thread-local storage with offset OFFSET. */
222 static CORE_ADDR
223 dwarf_expr_tls_address (void *baton, CORE_ADDR offset)
224 {
225 struct dwarf_expr_baton *debaton = (struct dwarf_expr_baton *) baton;
226
227 return target_translate_tls_address (debaton->objfile, offset);
228 }
229
230 struct piece_closure
231 {
232 /* The number of pieces used to describe this variable. */
233 int n_pieces;
234
235 /* The target address size, used only for DWARF_VALUE_STACK. */
236 int addr_size;
237
238 /* The pieces themselves. */
239 struct dwarf_expr_piece *pieces;
240 };
241
242 /* Allocate a closure for a value formed from separately-described
243 PIECES. */
244
245 static struct piece_closure *
246 allocate_piece_closure (int n_pieces, struct dwarf_expr_piece *pieces,
247 int addr_size)
248 {
249 struct piece_closure *c = XZALLOC (struct piece_closure);
250
251 c->n_pieces = n_pieces;
252 c->addr_size = addr_size;
253 c->pieces = XCALLOC (n_pieces, struct dwarf_expr_piece);
254
255 memcpy (c->pieces, pieces, n_pieces * sizeof (struct dwarf_expr_piece));
256
257 return c;
258 }
259
260 static void
261 read_pieced_value (struct value *v)
262 {
263 int i;
264 long offset = 0;
265 gdb_byte *contents;
266 struct piece_closure *c = (struct piece_closure *) value_computed_closure (v);
267 struct frame_info *frame = frame_find_by_id (VALUE_FRAME_ID (v));
268
269 contents = value_contents_raw (v);
270 for (i = 0; i < c->n_pieces; i++)
271 {
272 struct dwarf_expr_piece *p = &c->pieces[i];
273 switch (p->location)
274 {
275 case DWARF_VALUE_REGISTER:
276 {
277 struct gdbarch *arch = get_frame_arch (frame);
278 int gdb_regnum = gdbarch_dwarf2_reg_to_regnum (arch,
279 p->v.expr.value);
280 int reg_offset = 0;
281
282 if (gdbarch_byte_order (arch) == BFD_ENDIAN_BIG
283 && p->size < register_size (arch, gdb_regnum))
284 /* Big-endian, and we want less than full size. */
285 reg_offset = register_size (arch, gdb_regnum) - p->size;
286
287 get_frame_register_bytes (frame, gdb_regnum, reg_offset, p->size,
288 contents + offset);
289 }
290 break;
291
292 case DWARF_VALUE_MEMORY:
293 if (p->v.expr.in_stack_memory)
294 read_stack (p->v.expr.value, contents + offset, p->size);
295 else
296 read_memory (p->v.expr.value, contents + offset, p->size);
297 break;
298
299 case DWARF_VALUE_STACK:
300 {
301 struct gdbarch *gdbarch = get_type_arch (value_type (v));
302 size_t n = p->size;
303 if (n > c->addr_size)
304 n = c->addr_size;
305 store_unsigned_integer (contents + offset, n,
306 gdbarch_byte_order (gdbarch),
307 p->v.expr.value);
308 }
309 break;
310
311 case DWARF_VALUE_LITERAL:
312 {
313 size_t n = p->size;
314 if (n > p->v.literal.length)
315 n = p->v.literal.length;
316 memcpy (contents + offset, p->v.literal.data, n);
317 }
318 break;
319
320 default:
321 internal_error (__FILE__, __LINE__, _("invalid location type"));
322 }
323 offset += p->size;
324 }
325 }
326
327 static void
328 write_pieced_value (struct value *to, struct value *from)
329 {
330 int i;
331 long offset = 0;
332 gdb_byte *contents;
333 struct piece_closure *c = (struct piece_closure *) value_computed_closure (to);
334 struct frame_info *frame = frame_find_by_id (VALUE_FRAME_ID (to));
335
336 if (frame == NULL)
337 {
338 set_value_optimized_out (to, 1);
339 return;
340 }
341
342 contents = value_contents_raw (from);
343 for (i = 0; i < c->n_pieces; i++)
344 {
345 struct dwarf_expr_piece *p = &c->pieces[i];
346 switch (p->location)
347 {
348 case DWARF_VALUE_REGISTER:
349 {
350 struct gdbarch *arch = get_frame_arch (frame);
351 int gdb_regnum = gdbarch_dwarf2_reg_to_regnum (arch, p->v.expr.value);
352 int reg_offset = 0;
353
354 if (gdbarch_byte_order (arch) == BFD_ENDIAN_BIG
355 && p->size < register_size (arch, gdb_regnum))
356 /* Big-endian, and we want less than full size. */
357 reg_offset = register_size (arch, gdb_regnum) - p->size;
358
359 put_frame_register_bytes (frame, gdb_regnum, reg_offset, p->size,
360 contents + offset);
361 }
362 break;
363 case DWARF_VALUE_MEMORY:
364 write_memory (p->v.expr.value, contents + offset, p->size);
365 break;
366 default:
367 set_value_optimized_out (to, 1);
368 return;
369 }
370 offset += p->size;
371 }
372 }
373
374 static void *
375 copy_pieced_value_closure (struct value *v)
376 {
377 struct piece_closure *c = (struct piece_closure *) value_computed_closure (v);
378
379 return allocate_piece_closure (c->n_pieces, c->pieces, c->addr_size);
380 }
381
382 static void
383 free_pieced_value_closure (struct value *v)
384 {
385 struct piece_closure *c = (struct piece_closure *) value_computed_closure (v);
386
387 xfree (c->pieces);
388 xfree (c);
389 }
390
391 /* Functions for accessing a variable described by DW_OP_piece. */
392 static struct lval_funcs pieced_value_funcs = {
393 read_pieced_value,
394 write_pieced_value,
395 copy_pieced_value_closure,
396 free_pieced_value_closure
397 };
398
399 /* Evaluate a location description, starting at DATA and with length
400 SIZE, to find the current location of variable VAR in the context
401 of FRAME. */
402 static struct value *
403 dwarf2_evaluate_loc_desc (struct symbol *var, struct frame_info *frame,
404 gdb_byte *data, unsigned short size,
405 struct dwarf2_per_cu_data *per_cu)
406 {
407 struct value *retval;
408 struct dwarf_expr_baton baton;
409 struct dwarf_expr_context *ctx;
410 struct cleanup *old_chain;
411
412 if (size == 0)
413 {
414 retval = allocate_value (SYMBOL_TYPE (var));
415 VALUE_LVAL (retval) = not_lval;
416 set_value_optimized_out (retval, 1);
417 return retval;
418 }
419
420 baton.frame = frame;
421 baton.objfile = dwarf2_per_cu_objfile (per_cu);
422
423 ctx = new_dwarf_expr_context ();
424 old_chain = make_cleanup_free_dwarf_expr_context (ctx);
425
426 ctx->gdbarch = get_objfile_arch (baton.objfile);
427 ctx->addr_size = dwarf2_per_cu_addr_size (per_cu);
428 ctx->baton = &baton;
429 ctx->read_reg = dwarf_expr_read_reg;
430 ctx->read_mem = dwarf_expr_read_mem;
431 ctx->get_frame_base = dwarf_expr_frame_base;
432 ctx->get_frame_cfa = dwarf_expr_frame_cfa;
433 ctx->get_tls_address = dwarf_expr_tls_address;
434
435 dwarf_expr_eval (ctx, data, size);
436 if (ctx->num_pieces > 0)
437 {
438 struct piece_closure *c;
439 struct frame_id frame_id = get_frame_id (frame);
440
441 c = allocate_piece_closure (ctx->num_pieces, ctx->pieces,
442 ctx->addr_size);
443 retval = allocate_computed_value (SYMBOL_TYPE (var),
444 &pieced_value_funcs,
445 c);
446 VALUE_FRAME_ID (retval) = frame_id;
447 }
448 else
449 {
450 switch (ctx->location)
451 {
452 case DWARF_VALUE_REGISTER:
453 {
454 struct gdbarch *arch = get_frame_arch (frame);
455 CORE_ADDR dwarf_regnum = dwarf_expr_fetch (ctx, 0);
456 int gdb_regnum = gdbarch_dwarf2_reg_to_regnum (arch, dwarf_regnum);
457 retval = value_from_register (SYMBOL_TYPE (var), gdb_regnum, frame);
458 }
459 break;
460
461 case DWARF_VALUE_MEMORY:
462 {
463 CORE_ADDR address = dwarf_expr_fetch (ctx, 0);
464 int in_stack_memory = dwarf_expr_fetch_in_stack_memory (ctx, 0);
465
466 retval = allocate_value (SYMBOL_TYPE (var));
467 VALUE_LVAL (retval) = lval_memory;
468 set_value_lazy (retval, 1);
469 if (in_stack_memory)
470 set_value_stack (retval, 1);
471 set_value_address (retval, address);
472 }
473 break;
474
475 case DWARF_VALUE_STACK:
476 {
477 ULONGEST value = (ULONGEST) dwarf_expr_fetch (ctx, 0);
478 bfd_byte *contents;
479 size_t n = ctx->addr_size;
480
481 retval = allocate_value (SYMBOL_TYPE (var));
482 contents = value_contents_raw (retval);
483 if (n > TYPE_LENGTH (SYMBOL_TYPE (var)))
484 n = TYPE_LENGTH (SYMBOL_TYPE (var));
485 store_unsigned_integer (contents, n,
486 gdbarch_byte_order (ctx->gdbarch),
487 value);
488 }
489 break;
490
491 case DWARF_VALUE_LITERAL:
492 {
493 bfd_byte *contents;
494 size_t n = ctx->len;
495
496 retval = allocate_value (SYMBOL_TYPE (var));
497 contents = value_contents_raw (retval);
498 if (n > TYPE_LENGTH (SYMBOL_TYPE (var)))
499 n = TYPE_LENGTH (SYMBOL_TYPE (var));
500 memcpy (contents, ctx->data, n);
501 }
502 break;
503
504 default:
505 internal_error (__FILE__, __LINE__, _("invalid location type"));
506 }
507 }
508
509 set_value_initialized (retval, ctx->initialized);
510
511 do_cleanups (old_chain);
512
513 return retval;
514 }
515 \f
516 /* Helper functions and baton for dwarf2_loc_desc_needs_frame. */
517
518 struct needs_frame_baton
519 {
520 int needs_frame;
521 };
522
523 /* Reads from registers do require a frame. */
524 static CORE_ADDR
525 needs_frame_read_reg (void *baton, int regnum)
526 {
527 struct needs_frame_baton *nf_baton = baton;
528 nf_baton->needs_frame = 1;
529 return 1;
530 }
531
532 /* Reads from memory do not require a frame. */
533 static void
534 needs_frame_read_mem (void *baton, gdb_byte *buf, CORE_ADDR addr, size_t len)
535 {
536 memset (buf, 0, len);
537 }
538
539 /* Frame-relative accesses do require a frame. */
540 static void
541 needs_frame_frame_base (void *baton, gdb_byte **start, size_t * length)
542 {
543 static gdb_byte lit0 = DW_OP_lit0;
544 struct needs_frame_baton *nf_baton = baton;
545
546 *start = &lit0;
547 *length = 1;
548
549 nf_baton->needs_frame = 1;
550 }
551
552 /* CFA accesses require a frame. */
553
554 static CORE_ADDR
555 needs_frame_frame_cfa (void *baton)
556 {
557 struct needs_frame_baton *nf_baton = baton;
558 nf_baton->needs_frame = 1;
559 return 1;
560 }
561
562 /* Thread-local accesses do require a frame. */
563 static CORE_ADDR
564 needs_frame_tls_address (void *baton, CORE_ADDR offset)
565 {
566 struct needs_frame_baton *nf_baton = baton;
567 nf_baton->needs_frame = 1;
568 return 1;
569 }
570
571 /* Return non-zero iff the location expression at DATA (length SIZE)
572 requires a frame to evaluate. */
573
574 static int
575 dwarf2_loc_desc_needs_frame (gdb_byte *data, unsigned short size,
576 struct dwarf2_per_cu_data *per_cu)
577 {
578 struct needs_frame_baton baton;
579 struct dwarf_expr_context *ctx;
580 int in_reg;
581 struct cleanup *old_chain;
582
583 baton.needs_frame = 0;
584
585 ctx = new_dwarf_expr_context ();
586 old_chain = make_cleanup_free_dwarf_expr_context (ctx);
587
588 ctx->gdbarch = get_objfile_arch (dwarf2_per_cu_objfile (per_cu));
589 ctx->addr_size = dwarf2_per_cu_addr_size (per_cu);
590 ctx->baton = &baton;
591 ctx->read_reg = needs_frame_read_reg;
592 ctx->read_mem = needs_frame_read_mem;
593 ctx->get_frame_base = needs_frame_frame_base;
594 ctx->get_frame_cfa = needs_frame_frame_cfa;
595 ctx->get_tls_address = needs_frame_tls_address;
596
597 dwarf_expr_eval (ctx, data, size);
598
599 in_reg = ctx->location == DWARF_VALUE_REGISTER;
600
601 if (ctx->num_pieces > 0)
602 {
603 int i;
604
605 /* If the location has several pieces, and any of them are in
606 registers, then we will need a frame to fetch them from. */
607 for (i = 0; i < ctx->num_pieces; i++)
608 if (ctx->pieces[i].location == DWARF_VALUE_REGISTER)
609 in_reg = 1;
610 }
611
612 do_cleanups (old_chain);
613
614 return baton.needs_frame || in_reg;
615 }
616
617 static void
618 dwarf2_tracepoint_var_ref (struct symbol *symbol, struct gdbarch *gdbarch,
619 struct agent_expr *ax, struct axs_value *value,
620 gdb_byte *data, int size)
621 {
622 if (!data || size == 0)
623 {
624 value->optimized_out = 1;
625 }
626 else if (size == 1
627 && data[0] >= DW_OP_reg0
628 && data[0] <= DW_OP_reg31)
629 {
630 value->kind = axs_lvalue_register;
631 value->u.reg = data[0] - DW_OP_reg0;
632 }
633 else if (data[0] == DW_OP_regx)
634 {
635 ULONGEST reg;
636 read_uleb128 (data + 1, data + size, &reg);
637 value->kind = axs_lvalue_register;
638 value->u.reg = reg;
639 }
640 else if (data[0] == DW_OP_fbreg)
641 {
642 struct block *b;
643 struct symbol *framefunc;
644 int frame_reg = 0;
645 LONGEST frame_offset;
646 gdb_byte *buf_end;
647 gdb_byte *base_data;
648 size_t base_size;
649 LONGEST base_offset = 0;
650
651 b = block_for_pc (ax->scope);
652
653 if (!b)
654 error (_("No block found for address"));
655
656 framefunc = block_linkage_function (b);
657
658 if (!framefunc)
659 error (_("No function found for block"));
660
661 dwarf_expr_frame_base_1 (framefunc, ax->scope,
662 &base_data, &base_size);
663
664 if (base_data[0] >= DW_OP_breg0
665 && base_data[0] <= DW_OP_breg31)
666 {
667 frame_reg = base_data[0] - DW_OP_breg0;
668 buf_end = read_sleb128 (base_data + 1, base_data + base_size, &base_offset);
669 if (buf_end != base_data + base_size)
670 error (_("Unexpected opcode after DW_OP_breg%u for symbol \"%s\"."),
671 frame_reg, SYMBOL_PRINT_NAME (symbol));
672 }
673 else
674 {
675 /* We don't know what to do with the frame base expression,
676 so we can't trace this variable; give up. */
677 error (_("Cannot generate expression to collect symbol \"%s\"; DWARF 2 encoding not handled"),
678 SYMBOL_PRINT_NAME (symbol));
679 }
680
681 buf_end = read_sleb128 (data + 1, data + size, &frame_offset);
682 if (buf_end != data + size)
683 error (_("Unexpected opcode after DW_OP_fbreg for symbol \"%s\"."),
684 SYMBOL_PRINT_NAME (symbol));
685
686 ax_reg (ax, frame_reg);
687 ax_const_l (ax, base_offset + frame_offset);
688 ax_simple (ax, aop_add);
689
690 value->kind = axs_lvalue_memory;
691 }
692 else if (data[0] >= DW_OP_breg0
693 && data[0] <= DW_OP_breg31)
694 {
695 unsigned int reg;
696 LONGEST offset;
697 gdb_byte *buf_end;
698
699 reg = data[0] - DW_OP_breg0;
700 buf_end = read_sleb128 (data + 1, data + size, &offset);
701 if (buf_end != data + size)
702 error (_("Unexpected opcode after DW_OP_breg%u for symbol \"%s\"."),
703 reg, SYMBOL_PRINT_NAME (symbol));
704
705 ax_reg (ax, reg);
706 ax_const_l (ax, offset);
707 ax_simple (ax, aop_add);
708
709 value->kind = axs_lvalue_memory;
710 }
711 else
712 error (_("Unsupported DWARF opcode 0x%x in the location of \"%s\"."),
713 data[0], SYMBOL_PRINT_NAME (symbol));
714 }
715 \f
716 /* Return the value of SYMBOL in FRAME using the DWARF-2 expression
717 evaluator to calculate the location. */
718 static struct value *
719 locexpr_read_variable (struct symbol *symbol, struct frame_info *frame)
720 {
721 struct dwarf2_locexpr_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
722 struct value *val;
723 val = dwarf2_evaluate_loc_desc (symbol, frame, dlbaton->data, dlbaton->size,
724 dlbaton->per_cu);
725
726 return val;
727 }
728
729 /* Return non-zero iff we need a frame to evaluate SYMBOL. */
730 static int
731 locexpr_read_needs_frame (struct symbol *symbol)
732 {
733 struct dwarf2_locexpr_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
734 return dwarf2_loc_desc_needs_frame (dlbaton->data, dlbaton->size,
735 dlbaton->per_cu);
736 }
737
738 /* Print a natural-language description of SYMBOL to STREAM. */
739 static int
740 locexpr_describe_location (struct symbol *symbol, struct ui_file *stream)
741 {
742 /* FIXME: be more extensive. */
743 struct dwarf2_locexpr_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
744 int addr_size = dwarf2_per_cu_addr_size (dlbaton->per_cu);
745
746 if (dlbaton->size == 1
747 && dlbaton->data[0] >= DW_OP_reg0
748 && dlbaton->data[0] <= DW_OP_reg31)
749 {
750 struct objfile *objfile = dwarf2_per_cu_objfile (dlbaton->per_cu);
751 struct gdbarch *gdbarch = get_objfile_arch (objfile);
752 int regno = gdbarch_dwarf2_reg_to_regnum (gdbarch,
753 dlbaton->data[0] - DW_OP_reg0);
754 fprintf_filtered (stream,
755 "a variable in register %s",
756 gdbarch_register_name (gdbarch, regno));
757 return 1;
758 }
759
760 /* The location expression for a TLS variable looks like this (on a
761 64-bit LE machine):
762
763 DW_AT_location : 10 byte block: 3 4 0 0 0 0 0 0 0 e0
764 (DW_OP_addr: 4; DW_OP_GNU_push_tls_address)
765
766 0x3 is the encoding for DW_OP_addr, which has an operand as long
767 as the size of an address on the target machine (here is 8
768 bytes). 0xe0 is the encoding for DW_OP_GNU_push_tls_address.
769 The operand represents the offset at which the variable is within
770 the thread local storage. */
771
772 if (dlbaton->size > 1
773 && dlbaton->data[dlbaton->size - 1] == DW_OP_GNU_push_tls_address)
774 if (dlbaton->data[0] == DW_OP_addr)
775 {
776 struct objfile *objfile = dwarf2_per_cu_objfile (dlbaton->per_cu);
777 struct gdbarch *gdbarch = get_objfile_arch (objfile);
778 CORE_ADDR offset = dwarf2_read_address (gdbarch,
779 &dlbaton->data[1],
780 &dlbaton->data[dlbaton->size - 1],
781 addr_size);
782 fprintf_filtered (stream,
783 "a thread-local variable at offset %s in the "
784 "thread-local storage for `%s'",
785 paddress (gdbarch, offset), objfile->name);
786 return 1;
787 }
788
789
790 fprintf_filtered (stream,
791 "a variable with complex or multiple locations (DWARF2)");
792 return 1;
793 }
794
795
796 /* Describe the location of SYMBOL as an agent value in VALUE, generating
797 any necessary bytecode in AX.
798
799 NOTE drow/2003-02-26: This function is extremely minimal, because
800 doing it correctly is extremely complicated and there is no
801 publicly available stub with tracepoint support for me to test
802 against. When there is one this function should be revisited. */
803
804 static void
805 locexpr_tracepoint_var_ref (struct symbol *symbol, struct gdbarch *gdbarch,
806 struct agent_expr *ax, struct axs_value *value)
807 {
808 struct dwarf2_locexpr_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
809
810 dwarf2_tracepoint_var_ref (symbol, gdbarch, ax, value,
811 dlbaton->data, dlbaton->size);
812 }
813
814 /* The set of location functions used with the DWARF-2 expression
815 evaluator. */
816 const struct symbol_computed_ops dwarf2_locexpr_funcs = {
817 locexpr_read_variable,
818 locexpr_read_needs_frame,
819 locexpr_describe_location,
820 locexpr_tracepoint_var_ref
821 };
822
823
824 /* Wrapper functions for location lists. These generally find
825 the appropriate location expression and call something above. */
826
827 /* Return the value of SYMBOL in FRAME using the DWARF-2 expression
828 evaluator to calculate the location. */
829 static struct value *
830 loclist_read_variable (struct symbol *symbol, struct frame_info *frame)
831 {
832 struct dwarf2_loclist_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
833 struct value *val;
834 gdb_byte *data;
835 size_t size;
836
837 data = find_location_expression (dlbaton, &size,
838 frame ? get_frame_address_in_block (frame)
839 : 0);
840 if (data == NULL)
841 {
842 val = allocate_value (SYMBOL_TYPE (symbol));
843 VALUE_LVAL (val) = not_lval;
844 set_value_optimized_out (val, 1);
845 }
846 else
847 val = dwarf2_evaluate_loc_desc (symbol, frame, data, size,
848 dlbaton->per_cu);
849
850 return val;
851 }
852
853 /* Return non-zero iff we need a frame to evaluate SYMBOL. */
854 static int
855 loclist_read_needs_frame (struct symbol *symbol)
856 {
857 /* If there's a location list, then assume we need to have a frame
858 to choose the appropriate location expression. With tracking of
859 global variables this is not necessarily true, but such tracking
860 is disabled in GCC at the moment until we figure out how to
861 represent it. */
862
863 return 1;
864 }
865
866 /* Print a natural-language description of SYMBOL to STREAM. */
867 static int
868 loclist_describe_location (struct symbol *symbol, struct ui_file *stream)
869 {
870 /* FIXME: Could print the entire list of locations. */
871 fprintf_filtered (stream, "a variable with multiple locations");
872 return 1;
873 }
874
875 /* Describe the location of SYMBOL as an agent value in VALUE, generating
876 any necessary bytecode in AX. */
877 static void
878 loclist_tracepoint_var_ref (struct symbol *symbol, struct gdbarch *gdbarch,
879 struct agent_expr *ax, struct axs_value *value)
880 {
881 struct dwarf2_loclist_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
882 gdb_byte *data;
883 size_t size;
884
885 data = find_location_expression (dlbaton, &size, ax->scope);
886
887 dwarf2_tracepoint_var_ref (symbol, gdbarch, ax, value, data, size);
888 }
889
890 /* The set of location functions used with the DWARF-2 expression
891 evaluator and location lists. */
892 const struct symbol_computed_ops dwarf2_loclist_funcs = {
893 loclist_read_variable,
894 loclist_read_needs_frame,
895 loclist_describe_location,
896 loclist_tracepoint_var_ref
897 };
This page took 0.061889 seconds and 4 git commands to generate.