1 /* DWARF 2 location expression support for GDB.
3 Copyright (C) 2003, 2005, 2007, 2008, 2009 Free Software Foundation, Inc.
5 Contributed by Daniel Jacobowitz, MontaVista Software, Inc.
7 This file is part of GDB.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
33 #include "exceptions.h"
37 #include "dwarf2expr.h"
38 #include "dwarf2loc.h"
39 #include "dwarf2-frame.h"
41 #include "gdb_string.h"
42 #include "gdb_assert.h"
44 /* A helper function for dealing with location lists. Given a
45 symbol baton (BATON) and a pc value (PC), find the appropriate
46 location expression, set *LOCEXPR_LENGTH, and return a pointer
47 to the beginning of the expression. Returns NULL on failure.
49 For now, only return the first matching location expression; there
50 can be more than one in the list. */
53 find_location_expression (struct dwarf2_loclist_baton *baton,
54 size_t *locexpr_length, CORE_ADDR pc)
57 gdb_byte *loc_ptr, *buf_end;
59 struct objfile *objfile = dwarf2_per_cu_objfile (baton->per_cu);
60 struct gdbarch *gdbarch = get_objfile_arch (objfile);
61 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
62 unsigned int addr_size = dwarf2_per_cu_addr_size (baton->per_cu);
63 CORE_ADDR base_mask = ~(~(CORE_ADDR)1 << (addr_size * 8 - 1));
64 /* Adjust base_address for relocatable objects. */
65 CORE_ADDR base_offset = ANOFFSET (objfile->section_offsets,
66 SECT_OFF_TEXT (objfile));
67 CORE_ADDR base_address = baton->base_address + base_offset;
69 loc_ptr = baton->data;
70 buf_end = baton->data + baton->size;
74 if (buf_end - loc_ptr < 2 * addr_size)
75 error (_("find_location_expression: Corrupted DWARF expression."));
77 low = extract_unsigned_integer (loc_ptr, addr_size, byte_order);
80 /* A base-address-selection entry. */
83 base_address = dwarf2_read_address (gdbarch,
84 loc_ptr, buf_end, addr_size);
89 high = extract_unsigned_integer (loc_ptr, addr_size, byte_order);
92 /* An end-of-list entry. */
93 if (low == 0 && high == 0)
96 /* Otherwise, a location expression entry. */
100 length = extract_unsigned_integer (loc_ptr, 2, byte_order);
103 if (pc >= low && pc < high)
105 *locexpr_length = length;
113 /* This is the baton used when performing dwarf2 expression
115 struct dwarf_expr_baton
117 struct frame_info *frame;
118 struct objfile *objfile;
121 /* Helper functions for dwarf2_evaluate_loc_desc. */
123 /* Using the frame specified in BATON, return the value of register
124 REGNUM, treated as a pointer. */
126 dwarf_expr_read_reg (void *baton, int dwarf_regnum)
128 struct dwarf_expr_baton *debaton = (struct dwarf_expr_baton *) baton;
129 struct gdbarch *gdbarch = get_frame_arch (debaton->frame);
133 regnum = gdbarch_dwarf2_reg_to_regnum (gdbarch, dwarf_regnum);
134 result = address_from_register (builtin_type (gdbarch)->builtin_data_ptr,
135 regnum, debaton->frame);
139 /* Read memory at ADDR (length LEN) into BUF. */
142 dwarf_expr_read_mem (void *baton, gdb_byte *buf, CORE_ADDR addr, size_t len)
144 read_memory (addr, buf, len);
147 /* Using the frame specified in BATON, find the location expression
148 describing the frame base. Return a pointer to it in START and
149 its length in LENGTH. */
151 dwarf_expr_frame_base (void *baton, gdb_byte **start, size_t * length)
153 /* FIXME: cagney/2003-03-26: This code should be using
154 get_frame_base_address(), and then implement a dwarf2 specific
156 struct symbol *framefunc;
157 struct dwarf_expr_baton *debaton = (struct dwarf_expr_baton *) baton;
159 /* Use block_linkage_function, which returns a real (not inlined)
160 function, instead of get_frame_function, which may return an
162 framefunc = block_linkage_function (get_frame_block (debaton->frame, NULL));
164 /* If we found a frame-relative symbol then it was certainly within
165 some function associated with a frame. If we can't find the frame,
166 something has gone wrong. */
167 gdb_assert (framefunc != NULL);
169 if (SYMBOL_LOCATION_BATON (framefunc) == NULL)
171 else if (SYMBOL_COMPUTED_OPS (framefunc) == &dwarf2_loclist_funcs)
173 struct dwarf2_loclist_baton *symbaton;
174 struct frame_info *frame = debaton->frame;
176 symbaton = SYMBOL_LOCATION_BATON (framefunc);
177 *start = find_location_expression (symbaton, length,
178 get_frame_address_in_block (frame));
182 struct dwarf2_locexpr_baton *symbaton;
183 symbaton = SYMBOL_LOCATION_BATON (framefunc);
184 if (symbaton != NULL)
186 *length = symbaton->size;
187 *start = symbaton->data;
194 error (_("Could not find the frame base for \"%s\"."),
195 SYMBOL_NATURAL_NAME (framefunc));
198 /* Helper function for dwarf2_evaluate_loc_desc. Computes the CFA for
199 the frame in BATON. */
202 dwarf_expr_frame_cfa (void *baton)
204 struct dwarf_expr_baton *debaton = (struct dwarf_expr_baton *) baton;
205 return dwarf2_frame_cfa (debaton->frame);
208 /* Using the objfile specified in BATON, find the address for the
209 current thread's thread-local storage with offset OFFSET. */
211 dwarf_expr_tls_address (void *baton, CORE_ADDR offset)
213 struct dwarf_expr_baton *debaton = (struct dwarf_expr_baton *) baton;
215 return target_translate_tls_address (debaton->objfile, offset);
220 /* The number of pieces used to describe this variable. */
223 /* The architecture, used only for DWARF_VALUE_STACK. */
224 struct gdbarch *arch;
226 /* The pieces themselves. */
227 struct dwarf_expr_piece *pieces;
230 /* Allocate a closure for a value formed from separately-described
233 static struct piece_closure *
234 allocate_piece_closure (int n_pieces, struct dwarf_expr_piece *pieces,
235 struct gdbarch *arch)
237 struct piece_closure *c = XZALLOC (struct piece_closure);
239 c->n_pieces = n_pieces;
241 c->pieces = XCALLOC (n_pieces, struct dwarf_expr_piece);
243 memcpy (c->pieces, pieces, n_pieces * sizeof (struct dwarf_expr_piece));
249 read_pieced_value (struct value *v)
254 struct piece_closure *c = (struct piece_closure *) value_computed_closure (v);
255 struct frame_info *frame = frame_find_by_id (VALUE_FRAME_ID (v));
257 contents = value_contents_raw (v);
258 for (i = 0; i < c->n_pieces; i++)
260 struct dwarf_expr_piece *p = &c->pieces[i];
263 case DWARF_VALUE_REGISTER:
265 struct gdbarch *arch = get_frame_arch (frame);
266 bfd_byte regval[MAX_REGISTER_SIZE];
267 int gdb_regnum = gdbarch_dwarf2_reg_to_regnum (arch,
269 get_frame_register (frame, gdb_regnum, regval);
270 memcpy (contents + offset, regval, p->size);
274 case DWARF_VALUE_MEMORY:
275 read_memory (p->v.value, contents + offset, p->size);
278 case DWARF_VALUE_STACK:
280 gdb_byte bytes[sizeof (ULONGEST)];
282 int addr_size = gdbarch_addr_bit (c->arch) / 8;
283 store_unsigned_integer (bytes, addr_size,
284 gdbarch_byte_order (c->arch),
289 memcpy (contents + offset, bytes, n);
293 case DWARF_VALUE_LITERAL:
296 if (n > p->v.literal.length)
297 n = p->v.literal.length;
298 memcpy (contents + offset, p->v.literal.data, n);
303 internal_error (__FILE__, __LINE__, _("invalid location type"));
310 write_pieced_value (struct value *to, struct value *from)
315 struct piece_closure *c = (struct piece_closure *) value_computed_closure (to);
316 struct frame_info *frame = frame_find_by_id (VALUE_FRAME_ID (to));
320 set_value_optimized_out (to, 1);
324 contents = value_contents_raw (from);
325 for (i = 0; i < c->n_pieces; i++)
327 struct dwarf_expr_piece *p = &c->pieces[i];
330 case DWARF_VALUE_REGISTER:
332 struct gdbarch *arch = get_frame_arch (frame);
333 int gdb_regnum = gdbarch_dwarf2_reg_to_regnum (arch, p->v.value);
334 put_frame_register (frame, gdb_regnum, contents + offset);
337 case DWARF_VALUE_MEMORY:
338 write_memory (p->v.value, contents + offset, p->size);
341 set_value_optimized_out (to, 1);
349 copy_pieced_value_closure (struct value *v)
351 struct piece_closure *c = (struct piece_closure *) value_computed_closure (v);
353 return allocate_piece_closure (c->n_pieces, c->pieces, c->arch);
357 free_pieced_value_closure (struct value *v)
359 struct piece_closure *c = (struct piece_closure *) value_computed_closure (v);
365 /* Functions for accessing a variable described by DW_OP_piece. */
366 static struct lval_funcs pieced_value_funcs = {
369 copy_pieced_value_closure,
370 free_pieced_value_closure
373 /* Evaluate a location description, starting at DATA and with length
374 SIZE, to find the current location of variable VAR in the context
376 static struct value *
377 dwarf2_evaluate_loc_desc (struct symbol *var, struct frame_info *frame,
378 gdb_byte *data, unsigned short size,
379 struct dwarf2_per_cu_data *per_cu)
381 struct value *retval;
382 struct dwarf_expr_baton baton;
383 struct dwarf_expr_context *ctx;
384 struct cleanup *old_chain;
388 retval = allocate_value (SYMBOL_TYPE (var));
389 VALUE_LVAL (retval) = not_lval;
390 set_value_optimized_out (retval, 1);
395 baton.objfile = dwarf2_per_cu_objfile (per_cu);
397 ctx = new_dwarf_expr_context ();
398 old_chain = make_cleanup_free_dwarf_expr_context (ctx);
400 ctx->gdbarch = get_objfile_arch (baton.objfile);
401 ctx->addr_size = dwarf2_per_cu_addr_size (per_cu);
403 ctx->read_reg = dwarf_expr_read_reg;
404 ctx->read_mem = dwarf_expr_read_mem;
405 ctx->get_frame_base = dwarf_expr_frame_base;
406 ctx->get_frame_cfa = dwarf_expr_frame_cfa;
407 ctx->get_tls_address = dwarf_expr_tls_address;
409 dwarf_expr_eval (ctx, data, size);
410 if (ctx->num_pieces > 0)
412 struct piece_closure *c;
413 struct frame_id frame_id = get_frame_id (frame);
415 c = allocate_piece_closure (ctx->num_pieces, ctx->pieces, ctx->gdbarch);
416 retval = allocate_computed_value (SYMBOL_TYPE (var),
419 VALUE_FRAME_ID (retval) = frame_id;
423 switch (ctx->location)
425 case DWARF_VALUE_REGISTER:
427 struct gdbarch *arch = get_frame_arch (frame);
428 CORE_ADDR dwarf_regnum = dwarf_expr_fetch (ctx, 0);
429 int gdb_regnum = gdbarch_dwarf2_reg_to_regnum (arch, dwarf_regnum);
430 retval = value_from_register (SYMBOL_TYPE (var), gdb_regnum, frame);
434 case DWARF_VALUE_MEMORY:
436 CORE_ADDR address = dwarf_expr_fetch (ctx, 0);
438 retval = allocate_value (SYMBOL_TYPE (var));
439 VALUE_LVAL (retval) = lval_memory;
440 set_value_lazy (retval, 1);
441 set_value_stack (retval, 1);
442 set_value_address (retval, address);
446 case DWARF_VALUE_STACK:
448 gdb_byte bytes[sizeof (ULONGEST)];
449 ULONGEST value = (ULONGEST) dwarf_expr_fetch (ctx, 0);
451 size_t n = ctx->addr_size;
453 store_unsigned_integer (bytes, ctx->addr_size,
454 gdbarch_byte_order (ctx->gdbarch),
456 retval = allocate_value (SYMBOL_TYPE (var));
457 contents = value_contents_raw (retval);
458 if (n > TYPE_LENGTH (SYMBOL_TYPE (var)))
459 n = TYPE_LENGTH (SYMBOL_TYPE (var));
460 memcpy (contents, bytes, n);
464 case DWARF_VALUE_LITERAL:
469 retval = allocate_value (SYMBOL_TYPE (var));
470 contents = value_contents_raw (retval);
471 if (n > TYPE_LENGTH (SYMBOL_TYPE (var)))
472 n = TYPE_LENGTH (SYMBOL_TYPE (var));
473 memcpy (contents, ctx->data, n);
478 internal_error (__FILE__, __LINE__, _("invalid location type"));
482 set_value_initialized (retval, ctx->initialized);
484 do_cleanups (old_chain);
493 /* Helper functions and baton for dwarf2_loc_desc_needs_frame. */
495 struct needs_frame_baton
500 /* Reads from registers do require a frame. */
502 needs_frame_read_reg (void *baton, int regnum)
504 struct needs_frame_baton *nf_baton = baton;
505 nf_baton->needs_frame = 1;
509 /* Reads from memory do not require a frame. */
511 needs_frame_read_mem (void *baton, gdb_byte *buf, CORE_ADDR addr, size_t len)
513 memset (buf, 0, len);
516 /* Frame-relative accesses do require a frame. */
518 needs_frame_frame_base (void *baton, gdb_byte **start, size_t * length)
520 static gdb_byte lit0 = DW_OP_lit0;
521 struct needs_frame_baton *nf_baton = baton;
526 nf_baton->needs_frame = 1;
529 /* CFA accesses require a frame. */
532 needs_frame_frame_cfa (void *baton)
534 struct needs_frame_baton *nf_baton = baton;
535 nf_baton->needs_frame = 1;
539 /* Thread-local accesses do require a frame. */
541 needs_frame_tls_address (void *baton, CORE_ADDR offset)
543 struct needs_frame_baton *nf_baton = baton;
544 nf_baton->needs_frame = 1;
548 /* Return non-zero iff the location expression at DATA (length SIZE)
549 requires a frame to evaluate. */
552 dwarf2_loc_desc_needs_frame (gdb_byte *data, unsigned short size,
553 struct dwarf2_per_cu_data *per_cu)
555 struct needs_frame_baton baton;
556 struct dwarf_expr_context *ctx;
558 struct cleanup *old_chain;
560 baton.needs_frame = 0;
562 ctx = new_dwarf_expr_context ();
563 old_chain = make_cleanup_free_dwarf_expr_context (ctx);
565 ctx->gdbarch = get_objfile_arch (dwarf2_per_cu_objfile (per_cu));
566 ctx->addr_size = dwarf2_per_cu_addr_size (per_cu);
568 ctx->read_reg = needs_frame_read_reg;
569 ctx->read_mem = needs_frame_read_mem;
570 ctx->get_frame_base = needs_frame_frame_base;
571 ctx->get_frame_cfa = needs_frame_frame_cfa;
572 ctx->get_tls_address = needs_frame_tls_address;
574 dwarf_expr_eval (ctx, data, size);
576 in_reg = ctx->location == DWARF_VALUE_REGISTER;
578 if (ctx->num_pieces > 0)
582 /* If the location has several pieces, and any of them are in
583 registers, then we will need a frame to fetch them from. */
584 for (i = 0; i < ctx->num_pieces; i++)
585 if (ctx->pieces[i].location == DWARF_VALUE_REGISTER)
589 do_cleanups (old_chain);
591 return baton.needs_frame || in_reg;
595 dwarf2_tracepoint_var_ref (struct symbol *symbol, struct gdbarch *gdbarch,
596 struct agent_expr *ax, struct axs_value *value,
597 gdb_byte *data, int size)
600 error (_("Symbol \"%s\" has been optimized out."),
601 SYMBOL_PRINT_NAME (symbol));
604 && data[0] >= DW_OP_reg0
605 && data[0] <= DW_OP_reg31)
607 value->kind = axs_lvalue_register;
608 value->u.reg = data[0] - DW_OP_reg0;
610 else if (data[0] == DW_OP_regx)
613 read_uleb128 (data + 1, data + size, ®);
614 value->kind = axs_lvalue_register;
617 else if (data[0] == DW_OP_fbreg)
619 /* And this is worse than just minimal; we should honor the frame base
622 LONGEST frame_offset;
625 buf_end = read_sleb128 (data + 1, data + size, &frame_offset);
626 if (buf_end != data + size)
627 error (_("Unexpected opcode after DW_OP_fbreg for symbol \"%s\"."),
628 SYMBOL_PRINT_NAME (symbol));
630 gdbarch_virtual_frame_pointer (gdbarch,
631 ax->scope, &frame_reg, &frame_offset);
632 ax_reg (ax, frame_reg);
633 ax_const_l (ax, frame_offset);
634 ax_simple (ax, aop_add);
636 value->kind = axs_lvalue_memory;
638 else if (data[0] >= DW_OP_breg0
639 && data[0] <= DW_OP_breg31)
645 reg = data[0] - DW_OP_breg0;
646 buf_end = read_sleb128 (data + 1, data + size, &offset);
647 if (buf_end != data + size)
648 error (_("Unexpected opcode after DW_OP_breg%u for symbol \"%s\"."),
649 reg, SYMBOL_PRINT_NAME (symbol));
652 ax_const_l (ax, offset);
653 ax_simple (ax, aop_add);
655 value->kind = axs_lvalue_memory;
658 error (_("Unsupported DWARF opcode 0x%x in the location of \"%s\"."),
659 data[0], SYMBOL_PRINT_NAME (symbol));
662 /* Return the value of SYMBOL in FRAME using the DWARF-2 expression
663 evaluator to calculate the location. */
664 static struct value *
665 locexpr_read_variable (struct symbol *symbol, struct frame_info *frame)
667 struct dwarf2_locexpr_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
669 val = dwarf2_evaluate_loc_desc (symbol, frame, dlbaton->data, dlbaton->size,
675 /* Return non-zero iff we need a frame to evaluate SYMBOL. */
677 locexpr_read_needs_frame (struct symbol *symbol)
679 struct dwarf2_locexpr_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
680 return dwarf2_loc_desc_needs_frame (dlbaton->data, dlbaton->size,
684 /* Print a natural-language description of SYMBOL to STREAM. */
686 locexpr_describe_location (struct symbol *symbol, struct ui_file *stream)
688 /* FIXME: be more extensive. */
689 struct dwarf2_locexpr_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
690 int addr_size = dwarf2_per_cu_addr_size (dlbaton->per_cu);
692 if (dlbaton->size == 1
693 && dlbaton->data[0] >= DW_OP_reg0
694 && dlbaton->data[0] <= DW_OP_reg31)
696 struct objfile *objfile = dwarf2_per_cu_objfile (dlbaton->per_cu);
697 struct gdbarch *gdbarch = get_objfile_arch (objfile);
698 int regno = gdbarch_dwarf2_reg_to_regnum (gdbarch,
699 dlbaton->data[0] - DW_OP_reg0);
700 fprintf_filtered (stream,
701 "a variable in register %s",
702 gdbarch_register_name (gdbarch, regno));
706 /* The location expression for a TLS variable looks like this (on a
709 DW_AT_location : 10 byte block: 3 4 0 0 0 0 0 0 0 e0
710 (DW_OP_addr: 4; DW_OP_GNU_push_tls_address)
712 0x3 is the encoding for DW_OP_addr, which has an operand as long
713 as the size of an address on the target machine (here is 8
714 bytes). 0xe0 is the encoding for DW_OP_GNU_push_tls_address.
715 The operand represents the offset at which the variable is within
716 the thread local storage. */
718 if (dlbaton->size > 1
719 && dlbaton->data[dlbaton->size - 1] == DW_OP_GNU_push_tls_address)
720 if (dlbaton->data[0] == DW_OP_addr)
722 struct objfile *objfile = dwarf2_per_cu_objfile (dlbaton->per_cu);
723 struct gdbarch *gdbarch = get_objfile_arch (objfile);
724 CORE_ADDR offset = dwarf2_read_address (gdbarch,
726 &dlbaton->data[dlbaton->size - 1],
728 fprintf_filtered (stream,
729 "a thread-local variable at offset %s in the "
730 "thread-local storage for `%s'",
731 paddress (gdbarch, offset), objfile->name);
736 fprintf_filtered (stream,
737 "a variable with complex or multiple locations (DWARF2)");
742 /* Describe the location of SYMBOL as an agent value in VALUE, generating
743 any necessary bytecode in AX.
745 NOTE drow/2003-02-26: This function is extremely minimal, because
746 doing it correctly is extremely complicated and there is no
747 publicly available stub with tracepoint support for me to test
748 against. When there is one this function should be revisited. */
751 locexpr_tracepoint_var_ref (struct symbol *symbol, struct gdbarch *gdbarch,
752 struct agent_expr *ax, struct axs_value *value)
754 struct dwarf2_locexpr_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
756 dwarf2_tracepoint_var_ref (symbol, gdbarch, ax, value,
757 dlbaton->data, dlbaton->size);
760 /* The set of location functions used with the DWARF-2 expression
762 const struct symbol_computed_ops dwarf2_locexpr_funcs = {
763 locexpr_read_variable,
764 locexpr_read_needs_frame,
765 locexpr_describe_location,
766 locexpr_tracepoint_var_ref
770 /* Wrapper functions for location lists. These generally find
771 the appropriate location expression and call something above. */
773 /* Return the value of SYMBOL in FRAME using the DWARF-2 expression
774 evaluator to calculate the location. */
775 static struct value *
776 loclist_read_variable (struct symbol *symbol, struct frame_info *frame)
778 struct dwarf2_loclist_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
783 data = find_location_expression (dlbaton, &size,
784 frame ? get_frame_address_in_block (frame)
788 val = allocate_value (SYMBOL_TYPE (symbol));
789 VALUE_LVAL (val) = not_lval;
790 set_value_optimized_out (val, 1);
793 val = dwarf2_evaluate_loc_desc (symbol, frame, data, size,
799 /* Return non-zero iff we need a frame to evaluate SYMBOL. */
801 loclist_read_needs_frame (struct symbol *symbol)
803 /* If there's a location list, then assume we need to have a frame
804 to choose the appropriate location expression. With tracking of
805 global variables this is not necessarily true, but such tracking
806 is disabled in GCC at the moment until we figure out how to
812 /* Print a natural-language description of SYMBOL to STREAM. */
814 loclist_describe_location (struct symbol *symbol, struct ui_file *stream)
816 /* FIXME: Could print the entire list of locations. */
817 fprintf_filtered (stream, "a variable with multiple locations");
821 /* Describe the location of SYMBOL as an agent value in VALUE, generating
822 any necessary bytecode in AX. */
824 loclist_tracepoint_var_ref (struct symbol *symbol, struct gdbarch *gdbarch,
825 struct agent_expr *ax, struct axs_value *value)
827 struct dwarf2_loclist_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
831 data = find_location_expression (dlbaton, &size, ax->scope);
833 error (_("Variable \"%s\" is not available."), SYMBOL_NATURAL_NAME (symbol));
835 dwarf2_tracepoint_var_ref (symbol, gdbarch, ax, value, data, size);
838 /* The set of location functions used with the DWARF-2 expression
839 evaluator and location lists. */
840 const struct symbol_computed_ops dwarf2_loclist_funcs = {
841 loclist_read_variable,
842 loclist_read_needs_frame,
843 loclist_describe_location,
844 loclist_tracepoint_var_ref