* ax-gdb.c (gen_exp_binop_rest) [BINOP_SUBSCRIPT]: Error out if
[binutils-gdb.git] / gdb / dwarf2loc.c
blob6679d74bd3ad5bfd8fc08843e8eb087821135441
1 /* DWARF 2 location expression support for GDB.
3 Copyright (C) 2003, 2005, 2007, 2008, 2009, 2010
4 Free Software Foundation, Inc.
6 Contributed by Daniel Jacobowitz, MontaVista Software, Inc.
8 This file is part of GDB.
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.
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.
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/>. */
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"
37 #include "dwarf2.h"
38 #include "dwarf2expr.h"
39 #include "dwarf2loc.h"
40 #include "dwarf2-frame.h"
42 #include "gdb_string.h"
43 #include "gdb_assert.h"
45 static void
46 dwarf_expr_frame_base_1 (struct symbol *framefunc, CORE_ADDR pc,
47 gdb_byte **start, size_t *length);
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.
54 For now, only return the first matching location expression; there
55 can be more than one in the list. */
57 static gdb_byte *
58 find_location_expression (struct dwarf2_loclist_baton *baton,
59 size_t *locexpr_length, CORE_ADDR pc)
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;
74 loc_ptr = baton->data;
75 buf_end = baton->data + baton->size;
77 while (1)
79 if (buf_end - loc_ptr < 2 * addr_size)
80 error (_("find_location_expression: Corrupted DWARF expression."));
82 low = extract_unsigned_integer (loc_ptr, addr_size, byte_order);
83 loc_ptr += addr_size;
85 /* A base-address-selection entry. */
86 if (low == base_mask)
88 base_address = dwarf2_read_address (gdbarch,
89 loc_ptr, buf_end, addr_size);
90 loc_ptr += addr_size;
91 continue;
94 high = extract_unsigned_integer (loc_ptr, addr_size, byte_order);
95 loc_ptr += addr_size;
97 /* An end-of-list entry. */
98 if (low == 0 && high == 0)
99 return NULL;
101 /* Otherwise, a location expression entry. */
102 low += base_address;
103 high += base_address;
105 length = extract_unsigned_integer (loc_ptr, 2, byte_order);
106 loc_ptr += 2;
108 if (pc >= low && pc < high)
110 *locexpr_length = length;
111 return loc_ptr;
114 loc_ptr += length;
118 /* This is the baton used when performing dwarf2 expression
119 evaluation. */
120 struct dwarf_expr_baton
122 struct frame_info *frame;
123 struct objfile *objfile;
126 /* Helper functions for dwarf2_evaluate_loc_desc. */
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)
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;
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;
144 /* Read memory at ADDR (length LEN) into BUF. */
146 static void
147 dwarf_expr_read_mem (void *baton, gdb_byte *buf, CORE_ADDR addr, size_t len)
149 read_memory (addr, buf, len);
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)
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;
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));
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);
174 dwarf_expr_frame_base_1 (framefunc,
175 get_frame_address_in_block (debaton->frame),
176 start, length);
179 static void
180 dwarf_expr_frame_base_1 (struct symbol *framefunc, CORE_ADDR pc,
181 gdb_byte **start, size_t *length)
183 if (SYMBOL_LOCATION_BATON (framefunc) == NULL)
184 *start = NULL;
185 else if (SYMBOL_COMPUTED_OPS (framefunc) == &dwarf2_loclist_funcs)
187 struct dwarf2_loclist_baton *symbaton;
189 symbaton = SYMBOL_LOCATION_BATON (framefunc);
190 *start = find_location_expression (symbaton, length, pc);
192 else
194 struct dwarf2_locexpr_baton *symbaton;
195 symbaton = SYMBOL_LOCATION_BATON (framefunc);
196 if (symbaton != NULL)
198 *length = symbaton->size;
199 *start = symbaton->data;
201 else
202 *start = NULL;
205 if (*start == NULL)
206 error (_("Could not find the frame base for \"%s\"."),
207 SYMBOL_NATURAL_NAME (framefunc));
210 /* Helper function for dwarf2_evaluate_loc_desc. Computes the CFA for
211 the frame in BATON. */
213 static CORE_ADDR
214 dwarf_expr_frame_cfa (void *baton)
216 struct dwarf_expr_baton *debaton = (struct dwarf_expr_baton *) baton;
217 return dwarf2_frame_cfa (debaton->frame);
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)
225 struct dwarf_expr_baton *debaton = (struct dwarf_expr_baton *) baton;
227 return target_translate_tls_address (debaton->objfile, offset);
230 struct piece_closure
232 /* The number of pieces used to describe this variable. */
233 int n_pieces;
235 /* The architecture, used only for DWARF_VALUE_STACK. */
236 struct gdbarch *arch;
238 /* The pieces themselves. */
239 struct dwarf_expr_piece *pieces;
242 /* Allocate a closure for a value formed from separately-described
243 PIECES. */
245 static struct piece_closure *
246 allocate_piece_closure (int n_pieces, struct dwarf_expr_piece *pieces,
247 struct gdbarch *arch)
249 struct piece_closure *c = XZALLOC (struct piece_closure);
251 c->n_pieces = n_pieces;
252 c->arch = arch;
253 c->pieces = XCALLOC (n_pieces, struct dwarf_expr_piece);
255 memcpy (c->pieces, pieces, n_pieces * sizeof (struct dwarf_expr_piece));
257 return c;
260 static void
261 read_pieced_value (struct value *v)
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));
269 contents = value_contents_raw (v);
270 for (i = 0; i < c->n_pieces; i++)
272 struct dwarf_expr_piece *p = &c->pieces[i];
273 switch (p->location)
275 case DWARF_VALUE_REGISTER:
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;
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;
287 get_frame_register_bytes (frame, gdb_regnum, reg_offset, p->size,
288 contents + offset);
290 break;
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;
299 case DWARF_VALUE_STACK:
301 gdb_byte bytes[sizeof (ULONGEST)];
302 size_t n;
303 int addr_size = gdbarch_addr_bit (c->arch) / 8;
304 store_unsigned_integer (bytes, addr_size,
305 gdbarch_byte_order (c->arch),
306 p->v.expr.value);
307 n = p->size;
308 if (n > addr_size)
309 n = addr_size;
310 memcpy (contents + offset, bytes, n);
312 break;
314 case DWARF_VALUE_LITERAL:
316 size_t n = p->size;
317 if (n > p->v.literal.length)
318 n = p->v.literal.length;
319 memcpy (contents + offset, p->v.literal.data, n);
321 break;
323 default:
324 internal_error (__FILE__, __LINE__, _("invalid location type"));
326 offset += p->size;
330 static void
331 write_pieced_value (struct value *to, struct value *from)
333 int i;
334 long offset = 0;
335 gdb_byte *contents;
336 struct piece_closure *c = (struct piece_closure *) value_computed_closure (to);
337 struct frame_info *frame = frame_find_by_id (VALUE_FRAME_ID (to));
339 if (frame == NULL)
341 set_value_optimized_out (to, 1);
342 return;
345 contents = value_contents_raw (from);
346 for (i = 0; i < c->n_pieces; i++)
348 struct dwarf_expr_piece *p = &c->pieces[i];
349 switch (p->location)
351 case DWARF_VALUE_REGISTER:
353 struct gdbarch *arch = get_frame_arch (frame);
354 int gdb_regnum = gdbarch_dwarf2_reg_to_regnum (arch, p->v.expr.value);
355 int reg_offset = 0;
357 if (gdbarch_byte_order (arch) == BFD_ENDIAN_BIG
358 && p->size < register_size (arch, gdb_regnum))
359 /* Big-endian, and we want less than full size. */
360 reg_offset = register_size (arch, gdb_regnum) - p->size;
362 put_frame_register_bytes (frame, gdb_regnum, reg_offset, p->size,
363 contents + offset);
365 break;
366 case DWARF_VALUE_MEMORY:
367 write_memory (p->v.expr.value, contents + offset, p->size);
368 break;
369 default:
370 set_value_optimized_out (to, 1);
371 return;
373 offset += p->size;
377 static void *
378 copy_pieced_value_closure (struct value *v)
380 struct piece_closure *c = (struct piece_closure *) value_computed_closure (v);
382 return allocate_piece_closure (c->n_pieces, c->pieces, c->arch);
385 static void
386 free_pieced_value_closure (struct value *v)
388 struct piece_closure *c = (struct piece_closure *) value_computed_closure (v);
390 xfree (c->pieces);
391 xfree (c);
394 /* Functions for accessing a variable described by DW_OP_piece. */
395 static struct lval_funcs pieced_value_funcs = {
396 read_pieced_value,
397 write_pieced_value,
398 copy_pieced_value_closure,
399 free_pieced_value_closure
402 /* Evaluate a location description, starting at DATA and with length
403 SIZE, to find the current location of variable VAR in the context
404 of FRAME. */
405 static struct value *
406 dwarf2_evaluate_loc_desc (struct symbol *var, struct frame_info *frame,
407 gdb_byte *data, unsigned short size,
408 struct dwarf2_per_cu_data *per_cu)
410 struct value *retval;
411 struct dwarf_expr_baton baton;
412 struct dwarf_expr_context *ctx;
413 struct cleanup *old_chain;
415 if (size == 0)
417 retval = allocate_value (SYMBOL_TYPE (var));
418 VALUE_LVAL (retval) = not_lval;
419 set_value_optimized_out (retval, 1);
420 return retval;
423 baton.frame = frame;
424 baton.objfile = dwarf2_per_cu_objfile (per_cu);
426 ctx = new_dwarf_expr_context ();
427 old_chain = make_cleanup_free_dwarf_expr_context (ctx);
429 ctx->gdbarch = get_objfile_arch (baton.objfile);
430 ctx->addr_size = dwarf2_per_cu_addr_size (per_cu);
431 ctx->baton = &baton;
432 ctx->read_reg = dwarf_expr_read_reg;
433 ctx->read_mem = dwarf_expr_read_mem;
434 ctx->get_frame_base = dwarf_expr_frame_base;
435 ctx->get_frame_cfa = dwarf_expr_frame_cfa;
436 ctx->get_tls_address = dwarf_expr_tls_address;
438 dwarf_expr_eval (ctx, data, size);
439 if (ctx->num_pieces > 0)
441 struct piece_closure *c;
442 struct frame_id frame_id = get_frame_id (frame);
444 c = allocate_piece_closure (ctx->num_pieces, ctx->pieces, ctx->gdbarch);
445 retval = allocate_computed_value (SYMBOL_TYPE (var),
446 &pieced_value_funcs,
448 VALUE_FRAME_ID (retval) = frame_id;
450 else
452 switch (ctx->location)
454 case DWARF_VALUE_REGISTER:
456 struct gdbarch *arch = get_frame_arch (frame);
457 CORE_ADDR dwarf_regnum = dwarf_expr_fetch (ctx, 0);
458 int gdb_regnum = gdbarch_dwarf2_reg_to_regnum (arch, dwarf_regnum);
459 retval = value_from_register (SYMBOL_TYPE (var), gdb_regnum, frame);
461 break;
463 case DWARF_VALUE_MEMORY:
465 CORE_ADDR address = dwarf_expr_fetch (ctx, 0);
466 int in_stack_memory = dwarf_expr_fetch_in_stack_memory (ctx, 0);
468 retval = allocate_value (SYMBOL_TYPE (var));
469 VALUE_LVAL (retval) = lval_memory;
470 set_value_lazy (retval, 1);
471 if (in_stack_memory)
472 set_value_stack (retval, 1);
473 set_value_address (retval, address);
475 break;
477 case DWARF_VALUE_STACK:
479 gdb_byte bytes[sizeof (ULONGEST)];
480 ULONGEST value = (ULONGEST) dwarf_expr_fetch (ctx, 0);
481 bfd_byte *contents;
482 size_t n = ctx->addr_size;
484 store_unsigned_integer (bytes, ctx->addr_size,
485 gdbarch_byte_order (ctx->gdbarch),
486 value);
487 retval = allocate_value (SYMBOL_TYPE (var));
488 contents = value_contents_raw (retval);
489 if (n > TYPE_LENGTH (SYMBOL_TYPE (var)))
490 n = TYPE_LENGTH (SYMBOL_TYPE (var));
491 memcpy (contents, bytes, n);
493 break;
495 case DWARF_VALUE_LITERAL:
497 bfd_byte *contents;
498 size_t n = ctx->len;
500 retval = allocate_value (SYMBOL_TYPE (var));
501 contents = value_contents_raw (retval);
502 if (n > TYPE_LENGTH (SYMBOL_TYPE (var)))
503 n = TYPE_LENGTH (SYMBOL_TYPE (var));
504 memcpy (contents, ctx->data, n);
506 break;
508 default:
509 internal_error (__FILE__, __LINE__, _("invalid location type"));
513 set_value_initialized (retval, ctx->initialized);
515 do_cleanups (old_chain);
517 return retval;
520 /* Helper functions and baton for dwarf2_loc_desc_needs_frame. */
522 struct needs_frame_baton
524 int needs_frame;
527 /* Reads from registers do require a frame. */
528 static CORE_ADDR
529 needs_frame_read_reg (void *baton, int regnum)
531 struct needs_frame_baton *nf_baton = baton;
532 nf_baton->needs_frame = 1;
533 return 1;
536 /* Reads from memory do not require a frame. */
537 static void
538 needs_frame_read_mem (void *baton, gdb_byte *buf, CORE_ADDR addr, size_t len)
540 memset (buf, 0, len);
543 /* Frame-relative accesses do require a frame. */
544 static void
545 needs_frame_frame_base (void *baton, gdb_byte **start, size_t * length)
547 static gdb_byte lit0 = DW_OP_lit0;
548 struct needs_frame_baton *nf_baton = baton;
550 *start = &lit0;
551 *length = 1;
553 nf_baton->needs_frame = 1;
556 /* CFA accesses require a frame. */
558 static CORE_ADDR
559 needs_frame_frame_cfa (void *baton)
561 struct needs_frame_baton *nf_baton = baton;
562 nf_baton->needs_frame = 1;
563 return 1;
566 /* Thread-local accesses do require a frame. */
567 static CORE_ADDR
568 needs_frame_tls_address (void *baton, CORE_ADDR offset)
570 struct needs_frame_baton *nf_baton = baton;
571 nf_baton->needs_frame = 1;
572 return 1;
575 /* Return non-zero iff the location expression at DATA (length SIZE)
576 requires a frame to evaluate. */
578 static int
579 dwarf2_loc_desc_needs_frame (gdb_byte *data, unsigned short size,
580 struct dwarf2_per_cu_data *per_cu)
582 struct needs_frame_baton baton;
583 struct dwarf_expr_context *ctx;
584 int in_reg;
585 struct cleanup *old_chain;
587 baton.needs_frame = 0;
589 ctx = new_dwarf_expr_context ();
590 old_chain = make_cleanup_free_dwarf_expr_context (ctx);
592 ctx->gdbarch = get_objfile_arch (dwarf2_per_cu_objfile (per_cu));
593 ctx->addr_size = dwarf2_per_cu_addr_size (per_cu);
594 ctx->baton = &baton;
595 ctx->read_reg = needs_frame_read_reg;
596 ctx->read_mem = needs_frame_read_mem;
597 ctx->get_frame_base = needs_frame_frame_base;
598 ctx->get_frame_cfa = needs_frame_frame_cfa;
599 ctx->get_tls_address = needs_frame_tls_address;
601 dwarf_expr_eval (ctx, data, size);
603 in_reg = ctx->location == DWARF_VALUE_REGISTER;
605 if (ctx->num_pieces > 0)
607 int i;
609 /* If the location has several pieces, and any of them are in
610 registers, then we will need a frame to fetch them from. */
611 for (i = 0; i < ctx->num_pieces; i++)
612 if (ctx->pieces[i].location == DWARF_VALUE_REGISTER)
613 in_reg = 1;
616 do_cleanups (old_chain);
618 return baton.needs_frame || in_reg;
621 static void
622 dwarf2_tracepoint_var_ref (struct symbol *symbol, struct gdbarch *gdbarch,
623 struct agent_expr *ax, struct axs_value *value,
624 gdb_byte *data, int size)
626 if (size == 0)
627 error (_("Symbol \"%s\" has been optimized out."),
628 SYMBOL_PRINT_NAME (symbol));
630 if (size == 1
631 && data[0] >= DW_OP_reg0
632 && data[0] <= DW_OP_reg31)
634 value->kind = axs_lvalue_register;
635 value->u.reg = data[0] - DW_OP_reg0;
637 else if (data[0] == DW_OP_regx)
639 ULONGEST reg;
640 read_uleb128 (data + 1, data + size, &reg);
641 value->kind = axs_lvalue_register;
642 value->u.reg = reg;
644 else if (data[0] == DW_OP_fbreg)
646 struct block *b;
647 struct symbol *framefunc;
648 int frame_reg = 0;
649 LONGEST frame_offset;
650 gdb_byte *buf_end;
651 gdb_byte *base_data;
652 size_t base_size;
653 LONGEST base_offset = 0;
655 b = block_for_pc (ax->scope);
657 if (!b)
658 error (_("No block found for address"));
660 framefunc = block_linkage_function (b);
662 if (!framefunc)
663 error (_("No function found for block"));
665 dwarf_expr_frame_base_1 (framefunc, ax->scope,
666 &base_data, &base_size);
668 if (base_data[0] >= DW_OP_breg0
669 && base_data[0] <= DW_OP_breg31)
671 frame_reg = base_data[0] - DW_OP_breg0;
672 buf_end = read_sleb128 (base_data + 1, base_data + base_size, &base_offset);
673 if (buf_end != base_data + base_size)
674 error (_("Unexpected opcode after DW_OP_breg%u for symbol \"%s\"."),
675 frame_reg, SYMBOL_PRINT_NAME (symbol));
677 else
679 /* We don't know what to do with the frame base expression,
680 so we can't trace this variable; give up. */
681 error (_("Cannot generate expression to collect symbol \"%s\"; DWARF 2 encoding not handled"),
682 SYMBOL_PRINT_NAME (symbol));
685 buf_end = read_sleb128 (data + 1, data + size, &frame_offset);
686 if (buf_end != data + size)
687 error (_("Unexpected opcode after DW_OP_fbreg for symbol \"%s\"."),
688 SYMBOL_PRINT_NAME (symbol));
690 ax_reg (ax, frame_reg);
691 ax_const_l (ax, base_offset + frame_offset);
692 ax_simple (ax, aop_add);
694 value->kind = axs_lvalue_memory;
696 else if (data[0] >= DW_OP_breg0
697 && data[0] <= DW_OP_breg31)
699 unsigned int reg;
700 LONGEST offset;
701 gdb_byte *buf_end;
703 reg = data[0] - DW_OP_breg0;
704 buf_end = read_sleb128 (data + 1, data + size, &offset);
705 if (buf_end != data + size)
706 error (_("Unexpected opcode after DW_OP_breg%u for symbol \"%s\"."),
707 reg, SYMBOL_PRINT_NAME (symbol));
709 ax_reg (ax, reg);
710 ax_const_l (ax, offset);
711 ax_simple (ax, aop_add);
713 value->kind = axs_lvalue_memory;
715 else
716 error (_("Unsupported DWARF opcode 0x%x in the location of \"%s\"."),
717 data[0], SYMBOL_PRINT_NAME (symbol));
720 /* Return the value of SYMBOL in FRAME using the DWARF-2 expression
721 evaluator to calculate the location. */
722 static struct value *
723 locexpr_read_variable (struct symbol *symbol, struct frame_info *frame)
725 struct dwarf2_locexpr_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
726 struct value *val;
727 val = dwarf2_evaluate_loc_desc (symbol, frame, dlbaton->data, dlbaton->size,
728 dlbaton->per_cu);
730 return val;
733 /* Return non-zero iff we need a frame to evaluate SYMBOL. */
734 static int
735 locexpr_read_needs_frame (struct symbol *symbol)
737 struct dwarf2_locexpr_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
738 return dwarf2_loc_desc_needs_frame (dlbaton->data, dlbaton->size,
739 dlbaton->per_cu);
742 /* Print a natural-language description of SYMBOL to STREAM. */
743 static int
744 locexpr_describe_location (struct symbol *symbol, struct ui_file *stream)
746 /* FIXME: be more extensive. */
747 struct dwarf2_locexpr_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
748 int addr_size = dwarf2_per_cu_addr_size (dlbaton->per_cu);
750 if (dlbaton->size == 1
751 && dlbaton->data[0] >= DW_OP_reg0
752 && dlbaton->data[0] <= DW_OP_reg31)
754 struct objfile *objfile = dwarf2_per_cu_objfile (dlbaton->per_cu);
755 struct gdbarch *gdbarch = get_objfile_arch (objfile);
756 int regno = gdbarch_dwarf2_reg_to_regnum (gdbarch,
757 dlbaton->data[0] - DW_OP_reg0);
758 fprintf_filtered (stream,
759 "a variable in register %s",
760 gdbarch_register_name (gdbarch, regno));
761 return 1;
764 /* The location expression for a TLS variable looks like this (on a
765 64-bit LE machine):
767 DW_AT_location : 10 byte block: 3 4 0 0 0 0 0 0 0 e0
768 (DW_OP_addr: 4; DW_OP_GNU_push_tls_address)
770 0x3 is the encoding for DW_OP_addr, which has an operand as long
771 as the size of an address on the target machine (here is 8
772 bytes). 0xe0 is the encoding for DW_OP_GNU_push_tls_address.
773 The operand represents the offset at which the variable is within
774 the thread local storage. */
776 if (dlbaton->size > 1
777 && dlbaton->data[dlbaton->size - 1] == DW_OP_GNU_push_tls_address)
778 if (dlbaton->data[0] == DW_OP_addr)
780 struct objfile *objfile = dwarf2_per_cu_objfile (dlbaton->per_cu);
781 struct gdbarch *gdbarch = get_objfile_arch (objfile);
782 CORE_ADDR offset = dwarf2_read_address (gdbarch,
783 &dlbaton->data[1],
784 &dlbaton->data[dlbaton->size - 1],
785 addr_size);
786 fprintf_filtered (stream,
787 "a thread-local variable at offset %s in the "
788 "thread-local storage for `%s'",
789 paddress (gdbarch, offset), objfile->name);
790 return 1;
794 fprintf_filtered (stream,
795 "a variable with complex or multiple locations (DWARF2)");
796 return 1;
800 /* Describe the location of SYMBOL as an agent value in VALUE, generating
801 any necessary bytecode in AX.
803 NOTE drow/2003-02-26: This function is extremely minimal, because
804 doing it correctly is extremely complicated and there is no
805 publicly available stub with tracepoint support for me to test
806 against. When there is one this function should be revisited. */
808 static void
809 locexpr_tracepoint_var_ref (struct symbol *symbol, struct gdbarch *gdbarch,
810 struct agent_expr *ax, struct axs_value *value)
812 struct dwarf2_locexpr_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
814 dwarf2_tracepoint_var_ref (symbol, gdbarch, ax, value,
815 dlbaton->data, dlbaton->size);
818 /* The set of location functions used with the DWARF-2 expression
819 evaluator. */
820 const struct symbol_computed_ops dwarf2_locexpr_funcs = {
821 locexpr_read_variable,
822 locexpr_read_needs_frame,
823 locexpr_describe_location,
824 locexpr_tracepoint_var_ref
828 /* Wrapper functions for location lists. These generally find
829 the appropriate location expression and call something above. */
831 /* Return the value of SYMBOL in FRAME using the DWARF-2 expression
832 evaluator to calculate the location. */
833 static struct value *
834 loclist_read_variable (struct symbol *symbol, struct frame_info *frame)
836 struct dwarf2_loclist_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
837 struct value *val;
838 gdb_byte *data;
839 size_t size;
841 data = find_location_expression (dlbaton, &size,
842 frame ? get_frame_address_in_block (frame)
843 : 0);
844 if (data == NULL)
846 val = allocate_value (SYMBOL_TYPE (symbol));
847 VALUE_LVAL (val) = not_lval;
848 set_value_optimized_out (val, 1);
850 else
851 val = dwarf2_evaluate_loc_desc (symbol, frame, data, size,
852 dlbaton->per_cu);
854 return val;
857 /* Return non-zero iff we need a frame to evaluate SYMBOL. */
858 static int
859 loclist_read_needs_frame (struct symbol *symbol)
861 /* If there's a location list, then assume we need to have a frame
862 to choose the appropriate location expression. With tracking of
863 global variables this is not necessarily true, but such tracking
864 is disabled in GCC at the moment until we figure out how to
865 represent it. */
867 return 1;
870 /* Print a natural-language description of SYMBOL to STREAM. */
871 static int
872 loclist_describe_location (struct symbol *symbol, struct ui_file *stream)
874 /* FIXME: Could print the entire list of locations. */
875 fprintf_filtered (stream, "a variable with multiple locations");
876 return 1;
879 /* Describe the location of SYMBOL as an agent value in VALUE, generating
880 any necessary bytecode in AX. */
881 static void
882 loclist_tracepoint_var_ref (struct symbol *symbol, struct gdbarch *gdbarch,
883 struct agent_expr *ax, struct axs_value *value)
885 struct dwarf2_loclist_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
886 gdb_byte *data;
887 size_t size;
889 data = find_location_expression (dlbaton, &size, ax->scope);
890 if (data == NULL)
891 error (_("Variable \"%s\" is not available."), SYMBOL_NATURAL_NAME (symbol));
893 dwarf2_tracepoint_var_ref (symbol, gdbarch, ax, value, data, size);
896 /* The set of location functions used with the DWARF-2 expression
897 evaluator and location lists. */
898 const struct symbol_computed_ops dwarf2_loclist_funcs = {
899 loclist_read_variable,
900 loclist_read_needs_frame,
901 loclist_describe_location,
902 loclist_tracepoint_var_ref