* hppa-tdep.c (_initialize_hppa_tdep): Add declaration.
[binutils-gdb.git] / gdb / dwarf2loc.c
blob4cd77304b9f105f9b2677e5792136eb707eea1dc
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/>. */
22 #include "defs.h"
23 #include "ui-out.h"
24 #include "value.h"
25 #include "frame.h"
26 #include "gdbcore.h"
27 #include "target.h"
28 #include "inferior.h"
29 #include "ax.h"
30 #include "ax-gdb.h"
31 #include "regcache.h"
32 #include "objfiles.h"
33 #include "exceptions.h"
35 #include "elf/dwarf2.h"
36 #include "dwarf2expr.h"
37 #include "dwarf2loc.h"
39 #include "gdb_string.h"
40 #include "gdb_assert.h"
42 /* A helper function for dealing with location lists. Given a
43 symbol baton (BATON) and a pc value (PC), find the appropriate
44 location expression, set *LOCEXPR_LENGTH, and return a pointer
45 to the beginning of the expression. Returns NULL on failure.
47 For now, only return the first matching location expression; there
48 can be more than one in the list. */
50 static gdb_byte *
51 find_location_expression (struct dwarf2_loclist_baton *baton,
52 size_t *locexpr_length, CORE_ADDR pc)
54 CORE_ADDR low, high;
55 gdb_byte *loc_ptr, *buf_end;
56 int length;
57 struct objfile *objfile = dwarf2_per_cu_objfile (baton->per_cu);
58 struct gdbarch *gdbarch = get_objfile_arch (objfile);
59 unsigned int addr_size = dwarf2_per_cu_addr_size (baton->per_cu);
60 CORE_ADDR base_mask = ~(~(CORE_ADDR)1 << (addr_size * 8 - 1));
61 /* Adjust base_address for relocatable objects. */
62 CORE_ADDR base_offset = ANOFFSET (objfile->section_offsets,
63 SECT_OFF_TEXT (objfile));
64 CORE_ADDR base_address = baton->base_address + base_offset;
66 loc_ptr = baton->data;
67 buf_end = baton->data + baton->size;
69 while (1)
71 low = dwarf2_read_address (gdbarch, loc_ptr, buf_end, addr_size);
72 loc_ptr += addr_size;
73 high = dwarf2_read_address (gdbarch, loc_ptr, buf_end, addr_size);
74 loc_ptr += addr_size;
76 /* An end-of-list entry. */
77 if (low == 0 && high == 0)
78 return NULL;
80 /* A base-address-selection entry. */
81 if ((low & base_mask) == base_mask)
83 base_address = high;
84 continue;
87 /* Otherwise, a location expression entry. */
88 low += base_address;
89 high += base_address;
91 length = extract_unsigned_integer (loc_ptr, 2);
92 loc_ptr += 2;
94 if (pc >= low && pc < high)
96 *locexpr_length = length;
97 return loc_ptr;
100 loc_ptr += length;
104 /* This is the baton used when performing dwarf2 expression
105 evaluation. */
106 struct dwarf_expr_baton
108 struct frame_info *frame;
109 struct objfile *objfile;
112 /* Helper functions for dwarf2_evaluate_loc_desc. */
114 /* Using the frame specified in BATON, return the value of register
115 REGNUM, treated as a pointer. */
116 static CORE_ADDR
117 dwarf_expr_read_reg (void *baton, int dwarf_regnum)
119 struct dwarf_expr_baton *debaton = (struct dwarf_expr_baton *) baton;
120 struct gdbarch *gdbarch = get_frame_arch (debaton->frame);
121 CORE_ADDR result;
122 int regnum;
124 regnum = gdbarch_dwarf2_reg_to_regnum (gdbarch, dwarf_regnum);
125 result = address_from_register (builtin_type (gdbarch)->builtin_data_ptr,
126 regnum, debaton->frame);
127 return result;
130 /* Read memory at ADDR (length LEN) into BUF. */
132 static void
133 dwarf_expr_read_mem (void *baton, gdb_byte *buf, CORE_ADDR addr, size_t len)
135 read_memory (addr, buf, len);
138 /* Using the frame specified in BATON, find the location expression
139 describing the frame base. Return a pointer to it in START and
140 its length in LENGTH. */
141 static void
142 dwarf_expr_frame_base (void *baton, gdb_byte **start, size_t * length)
144 /* FIXME: cagney/2003-03-26: This code should be using
145 get_frame_base_address(), and then implement a dwarf2 specific
146 this_base method. */
147 struct symbol *framefunc;
148 struct dwarf_expr_baton *debaton = (struct dwarf_expr_baton *) baton;
150 framefunc = get_frame_function (debaton->frame);
152 /* If we found a frame-relative symbol then it was certainly within
153 some function associated with a frame. If we can't find the frame,
154 something has gone wrong. */
155 gdb_assert (framefunc != NULL);
157 if (SYMBOL_COMPUTED_OPS (framefunc) == &dwarf2_loclist_funcs)
159 struct dwarf2_loclist_baton *symbaton;
160 struct frame_info *frame = debaton->frame;
162 symbaton = SYMBOL_LOCATION_BATON (framefunc);
163 *start = find_location_expression (symbaton, length,
164 get_frame_address_in_block (frame));
166 else
168 struct dwarf2_locexpr_baton *symbaton;
169 symbaton = SYMBOL_LOCATION_BATON (framefunc);
170 if (symbaton != NULL)
172 *length = symbaton->size;
173 *start = symbaton->data;
175 else
176 *start = NULL;
179 if (*start == NULL)
180 error (_("Could not find the frame base for \"%s\"."),
181 SYMBOL_NATURAL_NAME (framefunc));
184 /* Using the objfile specified in BATON, find the address for the
185 current thread's thread-local storage with offset OFFSET. */
186 static CORE_ADDR
187 dwarf_expr_tls_address (void *baton, CORE_ADDR offset)
189 struct dwarf_expr_baton *debaton = (struct dwarf_expr_baton *) baton;
191 return target_translate_tls_address (debaton->objfile, offset);
194 /* Evaluate a location description, starting at DATA and with length
195 SIZE, to find the current location of variable VAR in the context
196 of FRAME. */
197 static struct value *
198 dwarf2_evaluate_loc_desc (struct symbol *var, struct frame_info *frame,
199 gdb_byte *data, unsigned short size,
200 struct dwarf2_per_cu_data *per_cu)
202 struct value *retval;
203 struct dwarf_expr_baton baton;
204 struct dwarf_expr_context *ctx;
206 if (size == 0)
208 retval = allocate_value (SYMBOL_TYPE (var));
209 VALUE_LVAL (retval) = not_lval;
210 set_value_optimized_out (retval, 1);
211 return retval;
214 baton.frame = frame;
215 baton.objfile = dwarf2_per_cu_objfile (per_cu);
217 ctx = new_dwarf_expr_context ();
218 ctx->gdbarch = get_objfile_arch (baton.objfile);
219 ctx->addr_size = dwarf2_per_cu_addr_size (per_cu);
220 ctx->baton = &baton;
221 ctx->read_reg = dwarf_expr_read_reg;
222 ctx->read_mem = dwarf_expr_read_mem;
223 ctx->get_frame_base = dwarf_expr_frame_base;
224 ctx->get_tls_address = dwarf_expr_tls_address;
226 dwarf_expr_eval (ctx, data, size);
227 if (ctx->num_pieces > 0)
229 int i;
230 long offset = 0;
231 bfd_byte *contents;
233 retval = allocate_value (SYMBOL_TYPE (var));
234 contents = value_contents_raw (retval);
235 for (i = 0; i < ctx->num_pieces; i++)
237 struct dwarf_expr_piece *p = &ctx->pieces[i];
238 if (p->in_reg)
240 struct gdbarch *arch = get_frame_arch (frame);
241 bfd_byte regval[MAX_REGISTER_SIZE];
242 int gdb_regnum = gdbarch_dwarf2_reg_to_regnum (arch, p->value);
243 get_frame_register (frame, gdb_regnum, regval);
244 memcpy (contents + offset, regval, p->size);
246 else /* In memory? */
248 read_memory (p->value, contents + offset, p->size);
250 offset += p->size;
253 else if (ctx->in_reg)
255 struct gdbarch *arch = get_frame_arch (frame);
256 CORE_ADDR dwarf_regnum = dwarf_expr_fetch (ctx, 0);
257 int gdb_regnum = gdbarch_dwarf2_reg_to_regnum (arch, dwarf_regnum);
258 retval = value_from_register (SYMBOL_TYPE (var), gdb_regnum, frame);
260 else
262 CORE_ADDR address = dwarf_expr_fetch (ctx, 0);
264 retval = allocate_value (SYMBOL_TYPE (var));
265 VALUE_LVAL (retval) = lval_memory;
266 set_value_lazy (retval, 1);
267 set_value_address (retval, address);
270 set_value_initialized (retval, ctx->initialized);
272 free_dwarf_expr_context (ctx);
274 return retval;
281 /* Helper functions and baton for dwarf2_loc_desc_needs_frame. */
283 struct needs_frame_baton
285 int needs_frame;
288 /* Reads from registers do require a frame. */
289 static CORE_ADDR
290 needs_frame_read_reg (void *baton, int regnum)
292 struct needs_frame_baton *nf_baton = baton;
293 nf_baton->needs_frame = 1;
294 return 1;
297 /* Reads from memory do not require a frame. */
298 static void
299 needs_frame_read_mem (void *baton, gdb_byte *buf, CORE_ADDR addr, size_t len)
301 memset (buf, 0, len);
304 /* Frame-relative accesses do require a frame. */
305 static void
306 needs_frame_frame_base (void *baton, gdb_byte **start, size_t * length)
308 static gdb_byte lit0 = DW_OP_lit0;
309 struct needs_frame_baton *nf_baton = baton;
311 *start = &lit0;
312 *length = 1;
314 nf_baton->needs_frame = 1;
317 /* Thread-local accesses do require a frame. */
318 static CORE_ADDR
319 needs_frame_tls_address (void *baton, CORE_ADDR offset)
321 struct needs_frame_baton *nf_baton = baton;
322 nf_baton->needs_frame = 1;
323 return 1;
326 /* Return non-zero iff the location expression at DATA (length SIZE)
327 requires a frame to evaluate. */
329 static int
330 dwarf2_loc_desc_needs_frame (gdb_byte *data, unsigned short size,
331 struct dwarf2_per_cu_data *per_cu)
333 struct needs_frame_baton baton;
334 struct dwarf_expr_context *ctx;
335 int in_reg;
337 baton.needs_frame = 0;
339 ctx = new_dwarf_expr_context ();
340 ctx->gdbarch = get_objfile_arch (dwarf2_per_cu_objfile (per_cu));
341 ctx->addr_size = dwarf2_per_cu_addr_size (per_cu);
342 ctx->baton = &baton;
343 ctx->read_reg = needs_frame_read_reg;
344 ctx->read_mem = needs_frame_read_mem;
345 ctx->get_frame_base = needs_frame_frame_base;
346 ctx->get_tls_address = needs_frame_tls_address;
348 dwarf_expr_eval (ctx, data, size);
350 in_reg = ctx->in_reg;
352 if (ctx->num_pieces > 0)
354 int i;
356 /* If the location has several pieces, and any of them are in
357 registers, then we will need a frame to fetch them from. */
358 for (i = 0; i < ctx->num_pieces; i++)
359 if (ctx->pieces[i].in_reg)
360 in_reg = 1;
363 free_dwarf_expr_context (ctx);
365 return baton.needs_frame || in_reg;
368 static void
369 dwarf2_tracepoint_var_ref (struct symbol *symbol, struct agent_expr *ax,
370 struct axs_value *value, gdb_byte *data,
371 int size)
373 if (size == 0)
374 error (_("Symbol \"%s\" has been optimized out."),
375 SYMBOL_PRINT_NAME (symbol));
377 if (size == 1
378 && data[0] >= DW_OP_reg0
379 && data[0] <= DW_OP_reg31)
381 value->kind = axs_lvalue_register;
382 value->u.reg = data[0] - DW_OP_reg0;
384 else if (data[0] == DW_OP_regx)
386 ULONGEST reg;
387 read_uleb128 (data + 1, data + size, &reg);
388 value->kind = axs_lvalue_register;
389 value->u.reg = reg;
391 else if (data[0] == DW_OP_fbreg)
393 /* And this is worse than just minimal; we should honor the frame base
394 as above. */
395 int frame_reg;
396 LONGEST frame_offset;
397 gdb_byte *buf_end;
399 buf_end = read_sleb128 (data + 1, data + size, &frame_offset);
400 if (buf_end != data + size)
401 error (_("Unexpected opcode after DW_OP_fbreg for symbol \"%s\"."),
402 SYMBOL_PRINT_NAME (symbol));
404 gdbarch_virtual_frame_pointer (current_gdbarch,
405 ax->scope, &frame_reg, &frame_offset);
406 ax_reg (ax, frame_reg);
407 ax_const_l (ax, frame_offset);
408 ax_simple (ax, aop_add);
410 value->kind = axs_lvalue_memory;
412 else if (data[0] >= DW_OP_breg0
413 && data[0] <= DW_OP_breg31)
415 unsigned int reg;
416 LONGEST offset;
417 gdb_byte *buf_end;
419 reg = data[0] - DW_OP_breg0;
420 buf_end = read_sleb128 (data + 1, data + size, &offset);
421 if (buf_end != data + size)
422 error (_("Unexpected opcode after DW_OP_breg%u for symbol \"%s\"."),
423 reg, SYMBOL_PRINT_NAME (symbol));
425 ax_reg (ax, reg);
426 ax_const_l (ax, offset);
427 ax_simple (ax, aop_add);
429 value->kind = axs_lvalue_memory;
431 else
432 error (_("Unsupported DWARF opcode 0x%x in the location of \"%s\"."),
433 data[0], SYMBOL_PRINT_NAME (symbol));
436 /* Return the value of SYMBOL in FRAME using the DWARF-2 expression
437 evaluator to calculate the location. */
438 static struct value *
439 locexpr_read_variable (struct symbol *symbol, struct frame_info *frame)
441 struct dwarf2_locexpr_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
442 struct value *val;
443 val = dwarf2_evaluate_loc_desc (symbol, frame, dlbaton->data, dlbaton->size,
444 dlbaton->per_cu);
446 return val;
449 /* Return non-zero iff we need a frame to evaluate SYMBOL. */
450 static int
451 locexpr_read_needs_frame (struct symbol *symbol)
453 struct dwarf2_locexpr_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
454 return dwarf2_loc_desc_needs_frame (dlbaton->data, dlbaton->size,
455 dlbaton->per_cu);
458 /* Print a natural-language description of SYMBOL to STREAM. */
459 static int
460 locexpr_describe_location (struct symbol *symbol, struct ui_file *stream)
462 /* FIXME: be more extensive. */
463 struct dwarf2_locexpr_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
464 int addr_size = dwarf2_per_cu_addr_size (dlbaton->per_cu);
466 if (dlbaton->size == 1
467 && dlbaton->data[0] >= DW_OP_reg0
468 && dlbaton->data[0] <= DW_OP_reg31)
470 struct objfile *objfile = dwarf2_per_cu_objfile (dlbaton->per_cu);
471 struct gdbarch *gdbarch = get_objfile_arch (objfile);
472 int regno = gdbarch_dwarf2_reg_to_regnum (gdbarch,
473 dlbaton->data[0] - DW_OP_reg0);
474 fprintf_filtered (stream,
475 "a variable in register %s",
476 gdbarch_register_name (gdbarch, regno));
477 return 1;
480 /* The location expression for a TLS variable looks like this (on a
481 64-bit LE machine):
483 DW_AT_location : 10 byte block: 3 4 0 0 0 0 0 0 0 e0
484 (DW_OP_addr: 4; DW_OP_GNU_push_tls_address)
486 0x3 is the encoding for DW_OP_addr, which has an operand as long
487 as the size of an address on the target machine (here is 8
488 bytes). 0xe0 is the encoding for DW_OP_GNU_push_tls_address.
489 The operand represents the offset at which the variable is within
490 the thread local storage. */
492 if (dlbaton->size > 1
493 && dlbaton->data[dlbaton->size - 1] == DW_OP_GNU_push_tls_address)
494 if (dlbaton->data[0] == DW_OP_addr)
496 struct objfile *objfile = dwarf2_per_cu_objfile (dlbaton->per_cu);
497 struct gdbarch *gdbarch = get_objfile_arch (objfile);
498 CORE_ADDR offset = dwarf2_read_address (gdbarch,
499 &dlbaton->data[1],
500 &dlbaton->data[dlbaton->size - 1],
501 addr_size);
502 fprintf_filtered (stream,
503 "a thread-local variable at offset %s in the "
504 "thread-local storage for `%s'",
505 paddr_nz (offset), objfile->name);
506 return 1;
510 fprintf_filtered (stream,
511 "a variable with complex or multiple locations (DWARF2)");
512 return 1;
516 /* Describe the location of SYMBOL as an agent value in VALUE, generating
517 any necessary bytecode in AX.
519 NOTE drow/2003-02-26: This function is extremely minimal, because
520 doing it correctly is extremely complicated and there is no
521 publicly available stub with tracepoint support for me to test
522 against. When there is one this function should be revisited. */
524 static void
525 locexpr_tracepoint_var_ref (struct symbol * symbol, struct agent_expr * ax,
526 struct axs_value * value)
528 struct dwarf2_locexpr_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
530 dwarf2_tracepoint_var_ref (symbol, ax, value, dlbaton->data, dlbaton->size);
533 /* The set of location functions used with the DWARF-2 expression
534 evaluator. */
535 const struct symbol_computed_ops dwarf2_locexpr_funcs = {
536 locexpr_read_variable,
537 locexpr_read_needs_frame,
538 locexpr_describe_location,
539 locexpr_tracepoint_var_ref
543 /* Wrapper functions for location lists. These generally find
544 the appropriate location expression and call something above. */
546 /* Return the value of SYMBOL in FRAME using the DWARF-2 expression
547 evaluator to calculate the location. */
548 static struct value *
549 loclist_read_variable (struct symbol *symbol, struct frame_info *frame)
551 struct dwarf2_loclist_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
552 struct value *val;
553 gdb_byte *data;
554 size_t size;
556 data = find_location_expression (dlbaton, &size,
557 frame ? get_frame_address_in_block (frame)
558 : 0);
559 if (data == NULL)
561 val = allocate_value (SYMBOL_TYPE (symbol));
562 VALUE_LVAL (val) = not_lval;
563 set_value_optimized_out (val, 1);
565 else
566 val = dwarf2_evaluate_loc_desc (symbol, frame, data, size,
567 dlbaton->per_cu);
569 return val;
572 /* Return non-zero iff we need a frame to evaluate SYMBOL. */
573 static int
574 loclist_read_needs_frame (struct symbol *symbol)
576 /* If there's a location list, then assume we need to have a frame
577 to choose the appropriate location expression. With tracking of
578 global variables this is not necessarily true, but such tracking
579 is disabled in GCC at the moment until we figure out how to
580 represent it. */
582 return 1;
585 /* Print a natural-language description of SYMBOL to STREAM. */
586 static int
587 loclist_describe_location (struct symbol *symbol, struct ui_file *stream)
589 /* FIXME: Could print the entire list of locations. */
590 fprintf_filtered (stream, "a variable with multiple locations");
591 return 1;
594 /* Describe the location of SYMBOL as an agent value in VALUE, generating
595 any necessary bytecode in AX. */
596 static void
597 loclist_tracepoint_var_ref (struct symbol * symbol, struct agent_expr * ax,
598 struct axs_value * value)
600 struct dwarf2_loclist_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
601 gdb_byte *data;
602 size_t size;
604 data = find_location_expression (dlbaton, &size, ax->scope);
605 if (data == NULL)
606 error (_("Variable \"%s\" is not available."), SYMBOL_NATURAL_NAME (symbol));
608 dwarf2_tracepoint_var_ref (symbol, ax, value, data, size);
611 /* The set of location functions used with the DWARF-2 expression
612 evaluator and location lists. */
613 const struct symbol_computed_ops dwarf2_loclist_funcs = {
614 loclist_read_variable,
615 loclist_read_needs_frame,
616 loclist_describe_location,
617 loclist_tracepoint_var_ref