* dwarf2loc.c (dwarf2_evaluate_loc_desc): Make a cleanup.
[deliverable/binutils-gdb.git] / gdb / dwarf2loc.c
CommitLineData
4c2df51b 1/* DWARF 2 location expression support for GDB.
feb13ab0 2
0fb0cc75 3 Copyright (C) 2003, 2005, 2007, 2008, 2009 Free Software Foundation, Inc.
feb13ab0 4
4c2df51b
DJ
5 Contributed by Daniel Jacobowitz, MontaVista Software, Inc.
6
7 This file is part of GDB.
8
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
a9762ec7
JB
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
4c2df51b 13
a9762ec7
JB
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.
4c2df51b
DJ
18
19 You should have received a copy of the GNU General Public License
a9762ec7 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
4c2df51b
DJ
21
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"
a55cc764
DJ
29#include "ax.h"
30#include "ax-gdb.h"
e4adbba9 31#include "regcache.h"
c3228f12 32#include "objfiles.h"
93ad78a7 33#include "exceptions.h"
edb3359d 34#include "block.h"
4c2df51b 35
fa8f86ff 36#include "dwarf2.h"
4c2df51b
DJ
37#include "dwarf2expr.h"
38#include "dwarf2loc.h"
39
40#include "gdb_string.h"
eff4f95e 41#include "gdb_assert.h"
4c2df51b 42
0d53c4c4
DJ
43/* A helper function for dealing with location lists. Given a
44 symbol baton (BATON) and a pc value (PC), find the appropriate
45 location expression, set *LOCEXPR_LENGTH, and return a pointer
46 to the beginning of the expression. Returns NULL on failure.
47
48 For now, only return the first matching location expression; there
49 can be more than one in the list. */
50
852483bc 51static gdb_byte *
0d53c4c4 52find_location_expression (struct dwarf2_loclist_baton *baton,
b6b08ebf 53 size_t *locexpr_length, CORE_ADDR pc)
0d53c4c4 54{
0d53c4c4 55 CORE_ADDR low, high;
852483bc
MK
56 gdb_byte *loc_ptr, *buf_end;
57 int length;
ae0d2f24 58 struct objfile *objfile = dwarf2_per_cu_objfile (baton->per_cu);
f7fd4728 59 struct gdbarch *gdbarch = get_objfile_arch (objfile);
e17a4113 60 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
ae0d2f24 61 unsigned int addr_size = dwarf2_per_cu_addr_size (baton->per_cu);
0d53c4c4 62 CORE_ADDR base_mask = ~(~(CORE_ADDR)1 << (addr_size * 8 - 1));
8edfa926 63 /* Adjust base_address for relocatable objects. */
ae0d2f24
UW
64 CORE_ADDR base_offset = ANOFFSET (objfile->section_offsets,
65 SECT_OFF_TEXT (objfile));
8edfa926 66 CORE_ADDR base_address = baton->base_address + base_offset;
0d53c4c4
DJ
67
68 loc_ptr = baton->data;
69 buf_end = baton->data + baton->size;
70
71 while (1)
72 {
b5758fe4
UW
73 if (buf_end - loc_ptr < 2 * addr_size)
74 error (_("find_location_expression: Corrupted DWARF expression."));
0d53c4c4 75
b5758fe4
UW
76 low = extract_unsigned_integer (loc_ptr, addr_size, byte_order);
77 loc_ptr += addr_size;
0d53c4c4
DJ
78
79 /* A base-address-selection entry. */
b5758fe4 80 if (low == base_mask)
0d53c4c4 81 {
b5758fe4
UW
82 base_address = dwarf2_read_address (gdbarch,
83 loc_ptr, buf_end, addr_size);
84 loc_ptr += addr_size;
0d53c4c4
DJ
85 continue;
86 }
87
b5758fe4
UW
88 high = extract_unsigned_integer (loc_ptr, addr_size, byte_order);
89 loc_ptr += addr_size;
90
91 /* An end-of-list entry. */
92 if (low == 0 && high == 0)
93 return NULL;
94
0d53c4c4
DJ
95 /* Otherwise, a location expression entry. */
96 low += base_address;
97 high += base_address;
98
e17a4113 99 length = extract_unsigned_integer (loc_ptr, 2, byte_order);
0d53c4c4
DJ
100 loc_ptr += 2;
101
102 if (pc >= low && pc < high)
103 {
104 *locexpr_length = length;
105 return loc_ptr;
106 }
107
108 loc_ptr += length;
109 }
110}
111
4c2df51b
DJ
112/* This is the baton used when performing dwarf2 expression
113 evaluation. */
114struct dwarf_expr_baton
115{
116 struct frame_info *frame;
117 struct objfile *objfile;
118};
119
120/* Helper functions for dwarf2_evaluate_loc_desc. */
121
4bc9efe1 122/* Using the frame specified in BATON, return the value of register
0b2b0195 123 REGNUM, treated as a pointer. */
4c2df51b 124static CORE_ADDR
61fbb938 125dwarf_expr_read_reg (void *baton, int dwarf_regnum)
4c2df51b 126{
4c2df51b 127 struct dwarf_expr_baton *debaton = (struct dwarf_expr_baton *) baton;
5e2b427d 128 struct gdbarch *gdbarch = get_frame_arch (debaton->frame);
e5192dd8 129 CORE_ADDR result;
0b2b0195 130 int regnum;
e4adbba9 131
5e2b427d
UW
132 regnum = gdbarch_dwarf2_reg_to_regnum (gdbarch, dwarf_regnum);
133 result = address_from_register (builtin_type (gdbarch)->builtin_data_ptr,
0b2b0195 134 regnum, debaton->frame);
4c2df51b
DJ
135 return result;
136}
137
138/* Read memory at ADDR (length LEN) into BUF. */
139
140static void
852483bc 141dwarf_expr_read_mem (void *baton, gdb_byte *buf, CORE_ADDR addr, size_t len)
4c2df51b
DJ
142{
143 read_memory (addr, buf, len);
144}
145
146/* Using the frame specified in BATON, find the location expression
147 describing the frame base. Return a pointer to it in START and
148 its length in LENGTH. */
149static void
852483bc 150dwarf_expr_frame_base (void *baton, gdb_byte **start, size_t * length)
4c2df51b 151{
da62e633
AC
152 /* FIXME: cagney/2003-03-26: This code should be using
153 get_frame_base_address(), and then implement a dwarf2 specific
154 this_base method. */
4c2df51b 155 struct symbol *framefunc;
4c2df51b 156 struct dwarf_expr_baton *debaton = (struct dwarf_expr_baton *) baton;
0d53c4c4 157
edb3359d
DJ
158 /* Use block_linkage_function, which returns a real (not inlined)
159 function, instead of get_frame_function, which may return an
160 inlined function. */
161 framefunc = block_linkage_function (get_frame_block (debaton->frame, NULL));
0d53c4c4 162
eff4f95e
JG
163 /* If we found a frame-relative symbol then it was certainly within
164 some function associated with a frame. If we can't find the frame,
165 something has gone wrong. */
166 gdb_assert (framefunc != NULL);
167
edb3359d
DJ
168 if (SYMBOL_LOCATION_BATON (framefunc) == NULL)
169 *start = NULL;
170 else if (SYMBOL_COMPUTED_OPS (framefunc) == &dwarf2_loclist_funcs)
0d53c4c4
DJ
171 {
172 struct dwarf2_loclist_baton *symbaton;
22c6caba
JW
173 struct frame_info *frame = debaton->frame;
174
0d53c4c4
DJ
175 symbaton = SYMBOL_LOCATION_BATON (framefunc);
176 *start = find_location_expression (symbaton, length,
22c6caba 177 get_frame_address_in_block (frame));
0d53c4c4
DJ
178 }
179 else
180 {
181 struct dwarf2_locexpr_baton *symbaton;
182 symbaton = SYMBOL_LOCATION_BATON (framefunc);
ebd3bcc1
JK
183 if (symbaton != NULL)
184 {
185 *length = symbaton->size;
186 *start = symbaton->data;
187 }
188 else
189 *start = NULL;
0d53c4c4
DJ
190 }
191
192 if (*start == NULL)
8a3fe4f8 193 error (_("Could not find the frame base for \"%s\"."),
0d53c4c4 194 SYMBOL_NATURAL_NAME (framefunc));
4c2df51b
DJ
195}
196
197/* Using the objfile specified in BATON, find the address for the
198 current thread's thread-local storage with offset OFFSET. */
199static CORE_ADDR
200dwarf_expr_tls_address (void *baton, CORE_ADDR offset)
201{
202 struct dwarf_expr_baton *debaton = (struct dwarf_expr_baton *) baton;
4c2df51b 203
9e35dae4 204 return target_translate_tls_address (debaton->objfile, offset);
4c2df51b
DJ
205}
206
207/* Evaluate a location description, starting at DATA and with length
208 SIZE, to find the current location of variable VAR in the context
209 of FRAME. */
210static struct value *
211dwarf2_evaluate_loc_desc (struct symbol *var, struct frame_info *frame,
852483bc 212 gdb_byte *data, unsigned short size,
ae0d2f24 213 struct dwarf2_per_cu_data *per_cu)
4c2df51b 214{
4c2df51b
DJ
215 struct value *retval;
216 struct dwarf_expr_baton baton;
217 struct dwarf_expr_context *ctx;
4a227398 218 struct cleanup *old_chain;
4c2df51b 219
0d53c4c4
DJ
220 if (size == 0)
221 {
222 retval = allocate_value (SYMBOL_TYPE (var));
223 VALUE_LVAL (retval) = not_lval;
feb13ab0 224 set_value_optimized_out (retval, 1);
10fb19b6 225 return retval;
0d53c4c4
DJ
226 }
227
4c2df51b 228 baton.frame = frame;
ae0d2f24 229 baton.objfile = dwarf2_per_cu_objfile (per_cu);
4c2df51b
DJ
230
231 ctx = new_dwarf_expr_context ();
4a227398
TT
232 old_chain = make_cleanup_free_dwarf_expr_context (ctx);
233
f7fd4728 234 ctx->gdbarch = get_objfile_arch (baton.objfile);
ae0d2f24 235 ctx->addr_size = dwarf2_per_cu_addr_size (per_cu);
4c2df51b
DJ
236 ctx->baton = &baton;
237 ctx->read_reg = dwarf_expr_read_reg;
238 ctx->read_mem = dwarf_expr_read_mem;
239 ctx->get_frame_base = dwarf_expr_frame_base;
240 ctx->get_tls_address = dwarf_expr_tls_address;
241
242 dwarf_expr_eval (ctx, data, size);
87808bd6
JB
243 if (ctx->num_pieces > 0)
244 {
23572eca
EZ
245 int i;
246 long offset = 0;
247 bfd_byte *contents;
248
249 retval = allocate_value (SYMBOL_TYPE (var));
250 contents = value_contents_raw (retval);
251 for (i = 0; i < ctx->num_pieces; i++)
252 {
253 struct dwarf_expr_piece *p = &ctx->pieces[i];
254 if (p->in_reg)
255 {
77a732d9 256 struct gdbarch *arch = get_frame_arch (frame);
23572eca 257 bfd_byte regval[MAX_REGISTER_SIZE];
77a732d9 258 int gdb_regnum = gdbarch_dwarf2_reg_to_regnum (arch, p->value);
23572eca
EZ
259 get_frame_register (frame, gdb_regnum, regval);
260 memcpy (contents + offset, regval, p->size);
261 }
262 else /* In memory? */
263 {
264 read_memory (p->value, contents + offset, p->size);
265 }
266 offset += p->size;
267 }
87808bd6
JB
268 }
269 else if (ctx->in_reg)
051caad9 270 {
77a732d9 271 struct gdbarch *arch = get_frame_arch (frame);
5ca2e327 272 CORE_ADDR dwarf_regnum = dwarf_expr_fetch (ctx, 0);
77a732d9 273 int gdb_regnum = gdbarch_dwarf2_reg_to_regnum (arch, dwarf_regnum);
5ca2e327 274 retval = value_from_register (SYMBOL_TYPE (var), gdb_regnum, frame);
051caad9 275 }
4c2df51b
DJ
276 else
277 {
5ca2e327
JB
278 CORE_ADDR address = dwarf_expr_fetch (ctx, 0);
279
61fbb938 280 retval = allocate_value (SYMBOL_TYPE (var));
4c2df51b 281 VALUE_LVAL (retval) = lval_memory;
dfa52d88 282 set_value_lazy (retval, 1);
42ae5230 283 set_value_address (retval, address);
4c2df51b
DJ
284 }
285
42be36b3
CT
286 set_value_initialized (retval, ctx->initialized);
287
4a227398 288 do_cleanups (old_chain);
4c2df51b
DJ
289
290 return retval;
291}
292
293
294
295
296\f
297/* Helper functions and baton for dwarf2_loc_desc_needs_frame. */
298
299struct needs_frame_baton
300{
301 int needs_frame;
302};
303
304/* Reads from registers do require a frame. */
305static CORE_ADDR
61fbb938 306needs_frame_read_reg (void *baton, int regnum)
4c2df51b
DJ
307{
308 struct needs_frame_baton *nf_baton = baton;
309 nf_baton->needs_frame = 1;
310 return 1;
311}
312
313/* Reads from memory do not require a frame. */
314static void
852483bc 315needs_frame_read_mem (void *baton, gdb_byte *buf, CORE_ADDR addr, size_t len)
4c2df51b
DJ
316{
317 memset (buf, 0, len);
318}
319
320/* Frame-relative accesses do require a frame. */
321static void
852483bc 322needs_frame_frame_base (void *baton, gdb_byte **start, size_t * length)
4c2df51b 323{
852483bc 324 static gdb_byte lit0 = DW_OP_lit0;
4c2df51b
DJ
325 struct needs_frame_baton *nf_baton = baton;
326
327 *start = &lit0;
328 *length = 1;
329
330 nf_baton->needs_frame = 1;
331}
332
333/* Thread-local accesses do require a frame. */
334static CORE_ADDR
335needs_frame_tls_address (void *baton, CORE_ADDR offset)
336{
337 struct needs_frame_baton *nf_baton = baton;
338 nf_baton->needs_frame = 1;
339 return 1;
340}
341
342/* Return non-zero iff the location expression at DATA (length SIZE)
343 requires a frame to evaluate. */
344
345static int
ae0d2f24
UW
346dwarf2_loc_desc_needs_frame (gdb_byte *data, unsigned short size,
347 struct dwarf2_per_cu_data *per_cu)
4c2df51b
DJ
348{
349 struct needs_frame_baton baton;
350 struct dwarf_expr_context *ctx;
f630a401 351 int in_reg;
4a227398 352 struct cleanup *old_chain;
4c2df51b
DJ
353
354 baton.needs_frame = 0;
355
356 ctx = new_dwarf_expr_context ();
4a227398
TT
357 old_chain = make_cleanup_free_dwarf_expr_context (ctx);
358
f7fd4728 359 ctx->gdbarch = get_objfile_arch (dwarf2_per_cu_objfile (per_cu));
ae0d2f24 360 ctx->addr_size = dwarf2_per_cu_addr_size (per_cu);
4c2df51b
DJ
361 ctx->baton = &baton;
362 ctx->read_reg = needs_frame_read_reg;
363 ctx->read_mem = needs_frame_read_mem;
364 ctx->get_frame_base = needs_frame_frame_base;
365 ctx->get_tls_address = needs_frame_tls_address;
366
367 dwarf_expr_eval (ctx, data, size);
368
f630a401
DJ
369 in_reg = ctx->in_reg;
370
87808bd6
JB
371 if (ctx->num_pieces > 0)
372 {
373 int i;
374
375 /* If the location has several pieces, and any of them are in
376 registers, then we will need a frame to fetch them from. */
377 for (i = 0; i < ctx->num_pieces; i++)
378 if (ctx->pieces[i].in_reg)
379 in_reg = 1;
380 }
381
4a227398 382 do_cleanups (old_chain);
4c2df51b 383
f630a401 384 return baton.needs_frame || in_reg;
4c2df51b
DJ
385}
386
0d53c4c4 387static void
505e835d
UW
388dwarf2_tracepoint_var_ref (struct symbol *symbol, struct gdbarch *gdbarch,
389 struct agent_expr *ax, struct axs_value *value,
390 gdb_byte *data, int size)
0d53c4c4
DJ
391{
392 if (size == 0)
8a3fe4f8 393 error (_("Symbol \"%s\" has been optimized out."),
0d53c4c4
DJ
394 SYMBOL_PRINT_NAME (symbol));
395
396 if (size == 1
397 && data[0] >= DW_OP_reg0
398 && data[0] <= DW_OP_reg31)
399 {
400 value->kind = axs_lvalue_register;
401 value->u.reg = data[0] - DW_OP_reg0;
402 }
403 else if (data[0] == DW_OP_regx)
404 {
405 ULONGEST reg;
406 read_uleb128 (data + 1, data + size, &reg);
407 value->kind = axs_lvalue_register;
408 value->u.reg = reg;
409 }
410 else if (data[0] == DW_OP_fbreg)
411 {
412 /* And this is worse than just minimal; we should honor the frame base
413 as above. */
414 int frame_reg;
415 LONGEST frame_offset;
852483bc 416 gdb_byte *buf_end;
0d53c4c4
DJ
417
418 buf_end = read_sleb128 (data + 1, data + size, &frame_offset);
419 if (buf_end != data + size)
8a3fe4f8 420 error (_("Unexpected opcode after DW_OP_fbreg for symbol \"%s\"."),
0d53c4c4 421 SYMBOL_PRINT_NAME (symbol));
4c2df51b 422
505e835d 423 gdbarch_virtual_frame_pointer (gdbarch,
c7bb205c 424 ax->scope, &frame_reg, &frame_offset);
0d53c4c4
DJ
425 ax_reg (ax, frame_reg);
426 ax_const_l (ax, frame_offset);
427 ax_simple (ax, aop_add);
4c2df51b 428
9c238357
RC
429 value->kind = axs_lvalue_memory;
430 }
431 else if (data[0] >= DW_OP_breg0
432 && data[0] <= DW_OP_breg31)
433 {
434 unsigned int reg;
435 LONGEST offset;
436 gdb_byte *buf_end;
437
438 reg = data[0] - DW_OP_breg0;
439 buf_end = read_sleb128 (data + 1, data + size, &offset);
440 if (buf_end != data + size)
441 error (_("Unexpected opcode after DW_OP_breg%u for symbol \"%s\"."),
442 reg, SYMBOL_PRINT_NAME (symbol));
443
444 ax_reg (ax, reg);
445 ax_const_l (ax, offset);
0d53c4c4 446 ax_simple (ax, aop_add);
9c238357 447
0d53c4c4
DJ
448 value->kind = axs_lvalue_memory;
449 }
450 else
9c238357
RC
451 error (_("Unsupported DWARF opcode 0x%x in the location of \"%s\"."),
452 data[0], SYMBOL_PRINT_NAME (symbol));
0d53c4c4 453}
4c2df51b
DJ
454\f
455/* Return the value of SYMBOL in FRAME using the DWARF-2 expression
456 evaluator to calculate the location. */
457static struct value *
458locexpr_read_variable (struct symbol *symbol, struct frame_info *frame)
459{
460 struct dwarf2_locexpr_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
461 struct value *val;
462 val = dwarf2_evaluate_loc_desc (symbol, frame, dlbaton->data, dlbaton->size,
ae0d2f24 463 dlbaton->per_cu);
4c2df51b
DJ
464
465 return val;
466}
467
468/* Return non-zero iff we need a frame to evaluate SYMBOL. */
469static int
470locexpr_read_needs_frame (struct symbol *symbol)
471{
472 struct dwarf2_locexpr_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
ae0d2f24
UW
473 return dwarf2_loc_desc_needs_frame (dlbaton->data, dlbaton->size,
474 dlbaton->per_cu);
4c2df51b
DJ
475}
476
477/* Print a natural-language description of SYMBOL to STREAM. */
478static int
479locexpr_describe_location (struct symbol *symbol, struct ui_file *stream)
480{
481 /* FIXME: be more extensive. */
482 struct dwarf2_locexpr_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
ae0d2f24 483 int addr_size = dwarf2_per_cu_addr_size (dlbaton->per_cu);
4c2df51b
DJ
484
485 if (dlbaton->size == 1
486 && dlbaton->data[0] >= DW_OP_reg0
487 && dlbaton->data[0] <= DW_OP_reg31)
488 {
5e2b427d
UW
489 struct objfile *objfile = dwarf2_per_cu_objfile (dlbaton->per_cu);
490 struct gdbarch *gdbarch = get_objfile_arch (objfile);
491 int regno = gdbarch_dwarf2_reg_to_regnum (gdbarch,
492 dlbaton->data[0] - DW_OP_reg0);
4c2df51b 493 fprintf_filtered (stream,
c9f4d572 494 "a variable in register %s",
5e2b427d 495 gdbarch_register_name (gdbarch, regno));
4c2df51b
DJ
496 return 1;
497 }
498
c3228f12
EZ
499 /* The location expression for a TLS variable looks like this (on a
500 64-bit LE machine):
501
502 DW_AT_location : 10 byte block: 3 4 0 0 0 0 0 0 0 e0
503 (DW_OP_addr: 4; DW_OP_GNU_push_tls_address)
504
505 0x3 is the encoding for DW_OP_addr, which has an operand as long
506 as the size of an address on the target machine (here is 8
507 bytes). 0xe0 is the encoding for DW_OP_GNU_push_tls_address.
508 The operand represents the offset at which the variable is within
509 the thread local storage. */
510
511 if (dlbaton->size > 1
512 && dlbaton->data[dlbaton->size - 1] == DW_OP_GNU_push_tls_address)
513 if (dlbaton->data[0] == DW_OP_addr)
514 {
ae0d2f24 515 struct objfile *objfile = dwarf2_per_cu_objfile (dlbaton->per_cu);
f7fd4728
UW
516 struct gdbarch *gdbarch = get_objfile_arch (objfile);
517 CORE_ADDR offset = dwarf2_read_address (gdbarch,
518 &dlbaton->data[1],
c193f044 519 &dlbaton->data[dlbaton->size - 1],
ae0d2f24 520 addr_size);
c3228f12 521 fprintf_filtered (stream,
32ffcbed 522 "a thread-local variable at offset %s in the "
c3228f12 523 "thread-local storage for `%s'",
5af949e3 524 paddress (gdbarch, offset), objfile->name);
c3228f12
EZ
525 return 1;
526 }
527
528
4c2df51b
DJ
529 fprintf_filtered (stream,
530 "a variable with complex or multiple locations (DWARF2)");
531 return 1;
532}
533
a55cc764
DJ
534
535/* Describe the location of SYMBOL as an agent value in VALUE, generating
536 any necessary bytecode in AX.
537
538 NOTE drow/2003-02-26: This function is extremely minimal, because
539 doing it correctly is extremely complicated and there is no
540 publicly available stub with tracepoint support for me to test
541 against. When there is one this function should be revisited. */
542
0d53c4c4 543static void
505e835d
UW
544locexpr_tracepoint_var_ref (struct symbol *symbol, struct gdbarch *gdbarch,
545 struct agent_expr *ax, struct axs_value *value)
a55cc764
DJ
546{
547 struct dwarf2_locexpr_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
548
505e835d
UW
549 dwarf2_tracepoint_var_ref (symbol, gdbarch, ax, value,
550 dlbaton->data, dlbaton->size);
a55cc764
DJ
551}
552
4c2df51b
DJ
553/* The set of location functions used with the DWARF-2 expression
554 evaluator. */
768a979c 555const struct symbol_computed_ops dwarf2_locexpr_funcs = {
4c2df51b
DJ
556 locexpr_read_variable,
557 locexpr_read_needs_frame,
558 locexpr_describe_location,
a55cc764 559 locexpr_tracepoint_var_ref
4c2df51b 560};
0d53c4c4
DJ
561
562
563/* Wrapper functions for location lists. These generally find
564 the appropriate location expression and call something above. */
565
566/* Return the value of SYMBOL in FRAME using the DWARF-2 expression
567 evaluator to calculate the location. */
568static struct value *
569loclist_read_variable (struct symbol *symbol, struct frame_info *frame)
570{
571 struct dwarf2_loclist_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
572 struct value *val;
852483bc 573 gdb_byte *data;
b6b08ebf 574 size_t size;
0d53c4c4
DJ
575
576 data = find_location_expression (dlbaton, &size,
22c6caba
JW
577 frame ? get_frame_address_in_block (frame)
578 : 0);
0d53c4c4 579 if (data == NULL)
806048c6
DJ
580 {
581 val = allocate_value (SYMBOL_TYPE (symbol));
582 VALUE_LVAL (val) = not_lval;
583 set_value_optimized_out (val, 1);
584 }
585 else
586 val = dwarf2_evaluate_loc_desc (symbol, frame, data, size,
ae0d2f24 587 dlbaton->per_cu);
0d53c4c4
DJ
588
589 return val;
590}
591
592/* Return non-zero iff we need a frame to evaluate SYMBOL. */
593static int
594loclist_read_needs_frame (struct symbol *symbol)
595{
596 /* If there's a location list, then assume we need to have a frame
597 to choose the appropriate location expression. With tracking of
598 global variables this is not necessarily true, but such tracking
599 is disabled in GCC at the moment until we figure out how to
600 represent it. */
601
602 return 1;
603}
604
605/* Print a natural-language description of SYMBOL to STREAM. */
606static int
607loclist_describe_location (struct symbol *symbol, struct ui_file *stream)
608{
609 /* FIXME: Could print the entire list of locations. */
610 fprintf_filtered (stream, "a variable with multiple locations");
611 return 1;
612}
613
614/* Describe the location of SYMBOL as an agent value in VALUE, generating
615 any necessary bytecode in AX. */
616static void
505e835d
UW
617loclist_tracepoint_var_ref (struct symbol *symbol, struct gdbarch *gdbarch,
618 struct agent_expr *ax, struct axs_value *value)
0d53c4c4
DJ
619{
620 struct dwarf2_loclist_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
852483bc 621 gdb_byte *data;
b6b08ebf 622 size_t size;
0d53c4c4
DJ
623
624 data = find_location_expression (dlbaton, &size, ax->scope);
625 if (data == NULL)
8a3fe4f8 626 error (_("Variable \"%s\" is not available."), SYMBOL_NATURAL_NAME (symbol));
0d53c4c4 627
505e835d 628 dwarf2_tracepoint_var_ref (symbol, gdbarch, ax, value, data, size);
0d53c4c4
DJ
629}
630
631/* The set of location functions used with the DWARF-2 expression
632 evaluator and location lists. */
768a979c 633const struct symbol_computed_ops dwarf2_loclist_funcs = {
0d53c4c4
DJ
634 loclist_read_variable,
635 loclist_read_needs_frame,
636 loclist_describe_location,
637 loclist_tracepoint_var_ref
638};
This page took 0.510657 seconds and 4 git commands to generate.