gdb
[deliverable/binutils-gdb.git] / gdb / dwarf2loc.c
CommitLineData
4c2df51b 1/* DWARF 2 location expression support for GDB.
feb13ab0 2
4c38e0a4
JB
3 Copyright (C) 2003, 2005, 2007, 2008, 2009, 2010
4 Free Software Foundation, Inc.
feb13ab0 5
4c2df51b
DJ
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
a9762ec7
JB
12 the Free Software Foundation; either version 3 of the License, or
13 (at your option) any later version.
4c2df51b 14
a9762ec7
JB
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.
4c2df51b
DJ
19
20 You should have received a copy of the GNU General Public License
a9762ec7 21 along with this program. If not, see <http://www.gnu.org/licenses/>. */
4c2df51b
DJ
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"
a55cc764
DJ
30#include "ax.h"
31#include "ax-gdb.h"
e4adbba9 32#include "regcache.h"
c3228f12 33#include "objfiles.h"
93ad78a7 34#include "exceptions.h"
edb3359d 35#include "block.h"
4c2df51b 36
fa8f86ff 37#include "dwarf2.h"
4c2df51b
DJ
38#include "dwarf2expr.h"
39#include "dwarf2loc.h"
e7802207 40#include "dwarf2-frame.h"
4c2df51b
DJ
41
42#include "gdb_string.h"
eff4f95e 43#include "gdb_assert.h"
4c2df51b 44
0936ad1d
SS
45static void
46dwarf_expr_frame_base_1 (struct symbol *framefunc, CORE_ADDR pc,
47 gdb_byte **start, size_t *length);
48
0d53c4c4
DJ
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
852483bc 57static gdb_byte *
0d53c4c4 58find_location_expression (struct dwarf2_loclist_baton *baton,
b6b08ebf 59 size_t *locexpr_length, CORE_ADDR pc)
0d53c4c4 60{
0d53c4c4 61 CORE_ADDR low, high;
852483bc
MK
62 gdb_byte *loc_ptr, *buf_end;
63 int length;
ae0d2f24 64 struct objfile *objfile = dwarf2_per_cu_objfile (baton->per_cu);
f7fd4728 65 struct gdbarch *gdbarch = get_objfile_arch (objfile);
e17a4113 66 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
ae0d2f24 67 unsigned int addr_size = dwarf2_per_cu_addr_size (baton->per_cu);
0d53c4c4 68 CORE_ADDR base_mask = ~(~(CORE_ADDR)1 << (addr_size * 8 - 1));
8edfa926 69 /* Adjust base_address for relocatable objects. */
ae0d2f24
UW
70 CORE_ADDR base_offset = ANOFFSET (objfile->section_offsets,
71 SECT_OFF_TEXT (objfile));
8edfa926 72 CORE_ADDR base_address = baton->base_address + base_offset;
0d53c4c4
DJ
73
74 loc_ptr = baton->data;
75 buf_end = baton->data + baton->size;
76
77 while (1)
78 {
b5758fe4
UW
79 if (buf_end - loc_ptr < 2 * addr_size)
80 error (_("find_location_expression: Corrupted DWARF expression."));
0d53c4c4 81
b5758fe4
UW
82 low = extract_unsigned_integer (loc_ptr, addr_size, byte_order);
83 loc_ptr += addr_size;
0d53c4c4
DJ
84
85 /* A base-address-selection entry. */
b5758fe4 86 if (low == base_mask)
0d53c4c4 87 {
b5758fe4
UW
88 base_address = dwarf2_read_address (gdbarch,
89 loc_ptr, buf_end, addr_size);
90 loc_ptr += addr_size;
0d53c4c4
DJ
91 continue;
92 }
93
b5758fe4
UW
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
0d53c4c4
DJ
101 /* Otherwise, a location expression entry. */
102 low += base_address;
103 high += base_address;
104
e17a4113 105 length = extract_unsigned_integer (loc_ptr, 2, byte_order);
0d53c4c4
DJ
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
4c2df51b
DJ
118/* This is the baton used when performing dwarf2 expression
119 evaluation. */
120struct dwarf_expr_baton
121{
122 struct frame_info *frame;
123 struct objfile *objfile;
124};
125
126/* Helper functions for dwarf2_evaluate_loc_desc. */
127
4bc9efe1 128/* Using the frame specified in BATON, return the value of register
0b2b0195 129 REGNUM, treated as a pointer. */
4c2df51b 130static CORE_ADDR
61fbb938 131dwarf_expr_read_reg (void *baton, int dwarf_regnum)
4c2df51b 132{
4c2df51b 133 struct dwarf_expr_baton *debaton = (struct dwarf_expr_baton *) baton;
5e2b427d 134 struct gdbarch *gdbarch = get_frame_arch (debaton->frame);
e5192dd8 135 CORE_ADDR result;
0b2b0195 136 int regnum;
e4adbba9 137
5e2b427d
UW
138 regnum = gdbarch_dwarf2_reg_to_regnum (gdbarch, dwarf_regnum);
139 result = address_from_register (builtin_type (gdbarch)->builtin_data_ptr,
0b2b0195 140 regnum, debaton->frame);
4c2df51b
DJ
141 return result;
142}
143
144/* Read memory at ADDR (length LEN) into BUF. */
145
146static void
852483bc 147dwarf_expr_read_mem (void *baton, gdb_byte *buf, CORE_ADDR addr, size_t len)
4c2df51b
DJ
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. */
155static void
852483bc 156dwarf_expr_frame_base (void *baton, gdb_byte **start, size_t * length)
4c2df51b 157{
da62e633
AC
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. */
4c2df51b 161 struct symbol *framefunc;
4c2df51b 162 struct dwarf_expr_baton *debaton = (struct dwarf_expr_baton *) baton;
0d53c4c4 163
edb3359d
DJ
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));
0d53c4c4 168
eff4f95e
JG
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
0936ad1d
SS
174 dwarf_expr_frame_base_1 (framefunc,
175 get_frame_address_in_block (debaton->frame),
176 start, length);
177}
178
179static void
180dwarf_expr_frame_base_1 (struct symbol *framefunc, CORE_ADDR pc,
181 gdb_byte **start, size_t *length)
182{
edb3359d
DJ
183 if (SYMBOL_LOCATION_BATON (framefunc) == NULL)
184 *start = NULL;
185 else if (SYMBOL_COMPUTED_OPS (framefunc) == &dwarf2_loclist_funcs)
0d53c4c4
DJ
186 {
187 struct dwarf2_loclist_baton *symbaton;
22c6caba 188
0d53c4c4 189 symbaton = SYMBOL_LOCATION_BATON (framefunc);
0936ad1d 190 *start = find_location_expression (symbaton, length, pc);
0d53c4c4
DJ
191 }
192 else
193 {
194 struct dwarf2_locexpr_baton *symbaton;
9a619af0 195
0d53c4c4 196 symbaton = SYMBOL_LOCATION_BATON (framefunc);
ebd3bcc1
JK
197 if (symbaton != NULL)
198 {
199 *length = symbaton->size;
200 *start = symbaton->data;
201 }
202 else
203 *start = NULL;
0d53c4c4
DJ
204 }
205
206 if (*start == NULL)
8a3fe4f8 207 error (_("Could not find the frame base for \"%s\"."),
0d53c4c4 208 SYMBOL_NATURAL_NAME (framefunc));
4c2df51b
DJ
209}
210
e7802207
TT
211/* Helper function for dwarf2_evaluate_loc_desc. Computes the CFA for
212 the frame in BATON. */
213
214static CORE_ADDR
215dwarf_expr_frame_cfa (void *baton)
216{
217 struct dwarf_expr_baton *debaton = (struct dwarf_expr_baton *) baton;
9a619af0 218
e7802207
TT
219 return dwarf2_frame_cfa (debaton->frame);
220}
221
4c2df51b
DJ
222/* Using the objfile specified in BATON, find the address for the
223 current thread's thread-local storage with offset OFFSET. */
224static CORE_ADDR
225dwarf_expr_tls_address (void *baton, CORE_ADDR offset)
226{
227 struct dwarf_expr_baton *debaton = (struct dwarf_expr_baton *) baton;
4c2df51b 228
9e35dae4 229 return target_translate_tls_address (debaton->objfile, offset);
4c2df51b
DJ
230}
231
052b9502
NF
232struct piece_closure
233{
234 /* The number of pieces used to describe this variable. */
235 int n_pieces;
236
6063c216
UW
237 /* The target address size, used only for DWARF_VALUE_STACK. */
238 int addr_size;
cec03d70 239
052b9502
NF
240 /* The pieces themselves. */
241 struct dwarf_expr_piece *pieces;
242};
243
244/* Allocate a closure for a value formed from separately-described
245 PIECES. */
246
247static struct piece_closure *
cec03d70 248allocate_piece_closure (int n_pieces, struct dwarf_expr_piece *pieces,
6063c216 249 int addr_size)
052b9502
NF
250{
251 struct piece_closure *c = XZALLOC (struct piece_closure);
252
253 c->n_pieces = n_pieces;
6063c216 254 c->addr_size = addr_size;
052b9502
NF
255 c->pieces = XCALLOC (n_pieces, struct dwarf_expr_piece);
256
257 memcpy (c->pieces, pieces, n_pieces * sizeof (struct dwarf_expr_piece));
258
259 return c;
260}
261
262static void
263read_pieced_value (struct value *v)
264{
265 int i;
266 long offset = 0;
afd74c5f 267 ULONGEST bytes_to_skip;
052b9502
NF
268 gdb_byte *contents;
269 struct piece_closure *c = (struct piece_closure *) value_computed_closure (v);
270 struct frame_info *frame = frame_find_by_id (VALUE_FRAME_ID (v));
afd74c5f
TT
271 size_t type_len;
272
273 if (value_type (v) != value_enclosing_type (v))
274 internal_error (__FILE__, __LINE__,
275 _("Should not be able to create a lazy value with "
276 "an enclosing type"));
052b9502
NF
277
278 contents = value_contents_raw (v);
afd74c5f
TT
279 bytes_to_skip = value_offset (v);
280 type_len = TYPE_LENGTH (value_type (v));
281 for (i = 0; i < c->n_pieces && offset < type_len; i++)
052b9502
NF
282 {
283 struct dwarf_expr_piece *p = &c->pieces[i];
afd74c5f
TT
284 size_t this_size;
285 long dest_offset, source_offset;
286
287 if (bytes_to_skip > 0 && bytes_to_skip >= p->size)
288 {
289 bytes_to_skip -= p->size;
290 continue;
291 }
292 this_size = p->size;
293 if (this_size > type_len - offset)
294 this_size = type_len - offset;
295 if (bytes_to_skip > 0)
296 {
297 dest_offset = 0;
298 source_offset = bytes_to_skip;
299 this_size -= bytes_to_skip;
300 bytes_to_skip = 0;
301 }
302 else
303 {
304 dest_offset = offset;
305 source_offset = 0;
306 }
9a619af0 307
cec03d70 308 switch (p->location)
052b9502 309 {
cec03d70
TT
310 case DWARF_VALUE_REGISTER:
311 {
312 struct gdbarch *arch = get_frame_arch (frame);
cec03d70 313 int gdb_regnum = gdbarch_dwarf2_reg_to_regnum (arch,
44353522 314 p->v.expr.value);
afd74c5f 315 int reg_offset = source_offset;
dcbf108f
UW
316
317 if (gdbarch_byte_order (arch) == BFD_ENDIAN_BIG
afd74c5f 318 && this_size < register_size (arch, gdb_regnum))
dcbf108f 319 /* Big-endian, and we want less than full size. */
afd74c5f 320 reg_offset = register_size (arch, gdb_regnum) - this_size;
dcbf108f 321
63b4f126
MGD
322 if (gdb_regnum != -1)
323 {
324 get_frame_register_bytes (frame, gdb_regnum, reg_offset,
afd74c5f 325 this_size, contents + dest_offset);
63b4f126
MGD
326 }
327 else
328 {
329 error (_("Unable to access DWARF register number %s"),
330 paddress (arch, p->v.expr.value));
331 }
cec03d70
TT
332 }
333 break;
334
335 case DWARF_VALUE_MEMORY:
44353522 336 if (p->v.expr.in_stack_memory)
afd74c5f
TT
337 read_stack (p->v.expr.value + source_offset,
338 contents + dest_offset, this_size);
44353522 339 else
afd74c5f
TT
340 read_memory (p->v.expr.value + source_offset,
341 contents + dest_offset, this_size);
cec03d70
TT
342 break;
343
344 case DWARF_VALUE_STACK:
345 {
6063c216 346 struct gdbarch *gdbarch = get_type_arch (value_type (v));
afd74c5f 347 size_t n = this_size;
9a619af0 348
afd74c5f
TT
349 if (n > c->addr_size - source_offset)
350 n = (c->addr_size >= source_offset
351 ? c->addr_size - source_offset
352 : 0);
353 if (n == 0)
354 {
355 /* Nothing. */
356 }
357 else if (source_offset == 0)
358 store_unsigned_integer (contents + dest_offset, n,
359 gdbarch_byte_order (gdbarch),
360 p->v.expr.value);
361 else
362 {
363 gdb_byte bytes[sizeof (ULONGEST)];
364
365 store_unsigned_integer (bytes, n + source_offset,
366 gdbarch_byte_order (gdbarch),
367 p->v.expr.value);
368 memcpy (contents + dest_offset, bytes + source_offset, n);
369 }
cec03d70
TT
370 }
371 break;
372
373 case DWARF_VALUE_LITERAL:
374 {
afd74c5f
TT
375 size_t n = this_size;
376
377 if (n > p->v.literal.length - source_offset)
378 n = (p->v.literal.length >= source_offset
379 ? p->v.literal.length - source_offset
380 : 0);
381 if (n != 0)
382 memcpy (contents + dest_offset,
383 p->v.literal.data + source_offset, n);
cec03d70
TT
384 }
385 break;
386
cb826367
TT
387 case DWARF_VALUE_OPTIMIZED_OUT:
388 /* We just leave the bits empty for now. This is not ideal
389 but gdb currently does not have a nice way to represent
390 optimized-out pieces. */
391 warning (_("bytes %ld-%ld in computed object were optimized out; "
392 "replacing with zeroes"),
393 offset,
394 offset + (long) this_size);
395 break;
396
cec03d70
TT
397 default:
398 internal_error (__FILE__, __LINE__, _("invalid location type"));
052b9502 399 }
afd74c5f 400 offset += this_size;
052b9502
NF
401 }
402}
403
404static void
405write_pieced_value (struct value *to, struct value *from)
406{
407 int i;
408 long offset = 0;
afd74c5f
TT
409 ULONGEST bytes_to_skip;
410 const gdb_byte *contents;
052b9502
NF
411 struct piece_closure *c = (struct piece_closure *) value_computed_closure (to);
412 struct frame_info *frame = frame_find_by_id (VALUE_FRAME_ID (to));
afd74c5f 413 size_t type_len;
052b9502
NF
414
415 if (frame == NULL)
416 {
417 set_value_optimized_out (to, 1);
418 return;
419 }
420
afd74c5f
TT
421 contents = value_contents (from);
422 bytes_to_skip = value_offset (to);
423 type_len = TYPE_LENGTH (value_type (to));
424 for (i = 0; i < c->n_pieces && offset < type_len; i++)
052b9502
NF
425 {
426 struct dwarf_expr_piece *p = &c->pieces[i];
afd74c5f
TT
427 size_t this_size;
428 long dest_offset, source_offset;
429
430 if (bytes_to_skip > 0 && bytes_to_skip >= p->size)
431 {
432 bytes_to_skip -= p->size;
433 continue;
434 }
435 this_size = p->size;
436 if (this_size > type_len - offset)
437 this_size = type_len - offset;
438 if (bytes_to_skip > 0)
439 {
440 dest_offset = bytes_to_skip;
441 source_offset = 0;
442 this_size -= bytes_to_skip;
443 bytes_to_skip = 0;
444 }
445 else
446 {
447 dest_offset = 0;
448 source_offset = offset;
449 }
9a619af0 450
cec03d70 451 switch (p->location)
052b9502 452 {
cec03d70
TT
453 case DWARF_VALUE_REGISTER:
454 {
455 struct gdbarch *arch = get_frame_arch (frame);
44353522 456 int gdb_regnum = gdbarch_dwarf2_reg_to_regnum (arch, p->v.expr.value);
afd74c5f 457 int reg_offset = dest_offset;
dcbf108f
UW
458
459 if (gdbarch_byte_order (arch) == BFD_ENDIAN_BIG
afd74c5f 460 && this_size <= register_size (arch, gdb_regnum))
dcbf108f 461 /* Big-endian, and we want less than full size. */
afd74c5f 462 reg_offset = register_size (arch, gdb_regnum) - this_size;
dcbf108f 463
63b4f126
MGD
464 if (gdb_regnum != -1)
465 {
466 put_frame_register_bytes (frame, gdb_regnum, reg_offset,
afd74c5f 467 this_size, contents + source_offset);
63b4f126
MGD
468 }
469 else
470 {
471 error (_("Unable to write to DWARF register number %s"),
472 paddress (arch, p->v.expr.value));
473 }
cec03d70
TT
474 }
475 break;
476 case DWARF_VALUE_MEMORY:
afd74c5f
TT
477 write_memory (p->v.expr.value + dest_offset,
478 contents + source_offset, this_size);
cec03d70
TT
479 break;
480 default:
481 set_value_optimized_out (to, 1);
482 return;
052b9502 483 }
afd74c5f 484 offset += this_size;
052b9502
NF
485 }
486}
487
488static void *
489copy_pieced_value_closure (struct value *v)
490{
491 struct piece_closure *c = (struct piece_closure *) value_computed_closure (v);
492
6063c216 493 return allocate_piece_closure (c->n_pieces, c->pieces, c->addr_size);
052b9502
NF
494}
495
496static void
497free_pieced_value_closure (struct value *v)
498{
499 struct piece_closure *c = (struct piece_closure *) value_computed_closure (v);
500
501 xfree (c->pieces);
502 xfree (c);
503}
504
505/* Functions for accessing a variable described by DW_OP_piece. */
506static struct lval_funcs pieced_value_funcs = {
507 read_pieced_value,
508 write_pieced_value,
509 copy_pieced_value_closure,
510 free_pieced_value_closure
511};
512
4c2df51b 513/* Evaluate a location description, starting at DATA and with length
a2d33775 514 SIZE, to find the current location of variable of TYPE in the context
4c2df51b 515 of FRAME. */
a2d33775 516
4c2df51b 517static struct value *
a2d33775 518dwarf2_evaluate_loc_desc (struct type *type, struct frame_info *frame,
852483bc 519 gdb_byte *data, unsigned short size,
ae0d2f24 520 struct dwarf2_per_cu_data *per_cu)
4c2df51b 521{
4c2df51b
DJ
522 struct value *retval;
523 struct dwarf_expr_baton baton;
524 struct dwarf_expr_context *ctx;
4a227398 525 struct cleanup *old_chain;
4c2df51b 526
0d53c4c4
DJ
527 if (size == 0)
528 {
a2d33775 529 retval = allocate_value (type);
0d53c4c4 530 VALUE_LVAL (retval) = not_lval;
feb13ab0 531 set_value_optimized_out (retval, 1);
10fb19b6 532 return retval;
0d53c4c4
DJ
533 }
534
4c2df51b 535 baton.frame = frame;
ae0d2f24 536 baton.objfile = dwarf2_per_cu_objfile (per_cu);
4c2df51b
DJ
537
538 ctx = new_dwarf_expr_context ();
4a227398
TT
539 old_chain = make_cleanup_free_dwarf_expr_context (ctx);
540
f7fd4728 541 ctx->gdbarch = get_objfile_arch (baton.objfile);
ae0d2f24 542 ctx->addr_size = dwarf2_per_cu_addr_size (per_cu);
4c2df51b
DJ
543 ctx->baton = &baton;
544 ctx->read_reg = dwarf_expr_read_reg;
545 ctx->read_mem = dwarf_expr_read_mem;
546 ctx->get_frame_base = dwarf_expr_frame_base;
e7802207 547 ctx->get_frame_cfa = dwarf_expr_frame_cfa;
4c2df51b
DJ
548 ctx->get_tls_address = dwarf_expr_tls_address;
549
550 dwarf_expr_eval (ctx, data, size);
87808bd6
JB
551 if (ctx->num_pieces > 0)
552 {
052b9502
NF
553 struct piece_closure *c;
554 struct frame_id frame_id = get_frame_id (frame);
555
6063c216
UW
556 c = allocate_piece_closure (ctx->num_pieces, ctx->pieces,
557 ctx->addr_size);
a2d33775 558 retval = allocate_computed_value (type, &pieced_value_funcs, c);
052b9502 559 VALUE_FRAME_ID (retval) = frame_id;
87808bd6 560 }
4c2df51b
DJ
561 else
562 {
cec03d70
TT
563 switch (ctx->location)
564 {
565 case DWARF_VALUE_REGISTER:
566 {
567 struct gdbarch *arch = get_frame_arch (frame);
568 CORE_ADDR dwarf_regnum = dwarf_expr_fetch (ctx, 0);
569 int gdb_regnum = gdbarch_dwarf2_reg_to_regnum (arch, dwarf_regnum);
9a619af0 570
63b4f126 571 if (gdb_regnum != -1)
a2d33775 572 retval = value_from_register (type, gdb_regnum, frame);
63b4f126 573 else
a2d33775
JK
574 error (_("Unable to access DWARF register number %s"),
575 paddress (arch, dwarf_regnum));
cec03d70
TT
576 }
577 break;
578
579 case DWARF_VALUE_MEMORY:
580 {
581 CORE_ADDR address = dwarf_expr_fetch (ctx, 0);
44353522 582 int in_stack_memory = dwarf_expr_fetch_in_stack_memory (ctx, 0);
cec03d70 583
a2d33775 584 retval = allocate_value (type);
cec03d70
TT
585 VALUE_LVAL (retval) = lval_memory;
586 set_value_lazy (retval, 1);
44353522
DE
587 if (in_stack_memory)
588 set_value_stack (retval, 1);
cec03d70
TT
589 set_value_address (retval, address);
590 }
591 break;
592
593 case DWARF_VALUE_STACK:
594 {
cec03d70
TT
595 ULONGEST value = (ULONGEST) dwarf_expr_fetch (ctx, 0);
596 bfd_byte *contents;
597 size_t n = ctx->addr_size;
598
a2d33775 599 retval = allocate_value (type);
cec03d70 600 contents = value_contents_raw (retval);
a2d33775
JK
601 if (n > TYPE_LENGTH (type))
602 n = TYPE_LENGTH (type);
05566b3b
TT
603 store_unsigned_integer (contents, n,
604 gdbarch_byte_order (ctx->gdbarch),
605 value);
cec03d70
TT
606 }
607 break;
608
609 case DWARF_VALUE_LITERAL:
610 {
611 bfd_byte *contents;
612 size_t n = ctx->len;
613
a2d33775 614 retval = allocate_value (type);
cec03d70 615 contents = value_contents_raw (retval);
a2d33775
JK
616 if (n > TYPE_LENGTH (type))
617 n = TYPE_LENGTH (type);
cec03d70
TT
618 memcpy (contents, ctx->data, n);
619 }
620 break;
621
cb826367
TT
622 /* DWARF_VALUE_OPTIMIZED_OUT can't occur in this context --
623 it can only be encountered when making a piece. */
624 case DWARF_VALUE_OPTIMIZED_OUT:
cec03d70
TT
625 default:
626 internal_error (__FILE__, __LINE__, _("invalid location type"));
627 }
4c2df51b
DJ
628 }
629
42be36b3
CT
630 set_value_initialized (retval, ctx->initialized);
631
4a227398 632 do_cleanups (old_chain);
4c2df51b
DJ
633
634 return retval;
635}
4c2df51b
DJ
636\f
637/* Helper functions and baton for dwarf2_loc_desc_needs_frame. */
638
639struct needs_frame_baton
640{
641 int needs_frame;
642};
643
644/* Reads from registers do require a frame. */
645static CORE_ADDR
61fbb938 646needs_frame_read_reg (void *baton, int regnum)
4c2df51b
DJ
647{
648 struct needs_frame_baton *nf_baton = baton;
9a619af0 649
4c2df51b
DJ
650 nf_baton->needs_frame = 1;
651 return 1;
652}
653
654/* Reads from memory do not require a frame. */
655static void
852483bc 656needs_frame_read_mem (void *baton, gdb_byte *buf, CORE_ADDR addr, size_t len)
4c2df51b
DJ
657{
658 memset (buf, 0, len);
659}
660
661/* Frame-relative accesses do require a frame. */
662static void
852483bc 663needs_frame_frame_base (void *baton, gdb_byte **start, size_t * length)
4c2df51b 664{
852483bc 665 static gdb_byte lit0 = DW_OP_lit0;
4c2df51b
DJ
666 struct needs_frame_baton *nf_baton = baton;
667
668 *start = &lit0;
669 *length = 1;
670
671 nf_baton->needs_frame = 1;
672}
673
e7802207
TT
674/* CFA accesses require a frame. */
675
676static CORE_ADDR
677needs_frame_frame_cfa (void *baton)
678{
679 struct needs_frame_baton *nf_baton = baton;
9a619af0 680
e7802207
TT
681 nf_baton->needs_frame = 1;
682 return 1;
683}
684
4c2df51b
DJ
685/* Thread-local accesses do require a frame. */
686static CORE_ADDR
687needs_frame_tls_address (void *baton, CORE_ADDR offset)
688{
689 struct needs_frame_baton *nf_baton = baton;
9a619af0 690
4c2df51b
DJ
691 nf_baton->needs_frame = 1;
692 return 1;
693}
694
695/* Return non-zero iff the location expression at DATA (length SIZE)
696 requires a frame to evaluate. */
697
698static int
ae0d2f24
UW
699dwarf2_loc_desc_needs_frame (gdb_byte *data, unsigned short size,
700 struct dwarf2_per_cu_data *per_cu)
4c2df51b
DJ
701{
702 struct needs_frame_baton baton;
703 struct dwarf_expr_context *ctx;
f630a401 704 int in_reg;
4a227398 705 struct cleanup *old_chain;
4c2df51b
DJ
706
707 baton.needs_frame = 0;
708
709 ctx = new_dwarf_expr_context ();
4a227398
TT
710 old_chain = make_cleanup_free_dwarf_expr_context (ctx);
711
f7fd4728 712 ctx->gdbarch = get_objfile_arch (dwarf2_per_cu_objfile (per_cu));
ae0d2f24 713 ctx->addr_size = dwarf2_per_cu_addr_size (per_cu);
4c2df51b
DJ
714 ctx->baton = &baton;
715 ctx->read_reg = needs_frame_read_reg;
716 ctx->read_mem = needs_frame_read_mem;
717 ctx->get_frame_base = needs_frame_frame_base;
e7802207 718 ctx->get_frame_cfa = needs_frame_frame_cfa;
4c2df51b
DJ
719 ctx->get_tls_address = needs_frame_tls_address;
720
721 dwarf_expr_eval (ctx, data, size);
722
cec03d70 723 in_reg = ctx->location == DWARF_VALUE_REGISTER;
f630a401 724
87808bd6
JB
725 if (ctx->num_pieces > 0)
726 {
727 int i;
728
729 /* If the location has several pieces, and any of them are in
730 registers, then we will need a frame to fetch them from. */
731 for (i = 0; i < ctx->num_pieces; i++)
cec03d70 732 if (ctx->pieces[i].location == DWARF_VALUE_REGISTER)
87808bd6
JB
733 in_reg = 1;
734 }
735
4a227398 736 do_cleanups (old_chain);
4c2df51b 737
f630a401 738 return baton.needs_frame || in_reg;
4c2df51b
DJ
739}
740
08922a10
SS
741/* This struct keeps track of the pieces that make up a multi-location
742 object, for use in agent expression generation. It is
743 superficially similar to struct dwarf_expr_piece, but
744 dwarf_expr_piece is designed for use in immediate evaluation, and
745 does not, for example, have a way to record both base register and
746 offset. */
747
748struct axs_var_loc
0d53c4c4 749{
08922a10
SS
750 /* Memory vs register, etc */
751 enum axs_lvalue_kind kind;
752
753 /* If non-zero, number of bytes in this fragment */
754 unsigned bytes;
755
756 /* (GDB-numbered) reg, or base reg if >= 0 */
757 int reg;
758
759 /* offset from reg */
760 LONGEST offset;
761};
762
763static gdb_byte *
764dwarf2_tracepoint_var_loc (struct symbol *symbol,
765 struct agent_expr *ax,
766 struct axs_var_loc *loc,
767 struct gdbarch *gdbarch,
768 gdb_byte *data, gdb_byte *end)
769{
770 if (data[0] >= DW_OP_reg0 && data[0] <= DW_OP_reg31)
0d53c4c4 771 {
08922a10
SS
772 loc->kind = axs_lvalue_register;
773 loc->reg = gdbarch_dwarf2_reg_to_regnum (gdbarch, data[0] - DW_OP_reg0);
774 data += 1;
0d53c4c4
DJ
775 }
776 else if (data[0] == DW_OP_regx)
777 {
778 ULONGEST reg;
9a619af0 779
08922a10
SS
780 data = read_uleb128 (data + 1, end, &reg);
781 loc->kind = axs_lvalue_register;
782 loc->reg = gdbarch_dwarf2_reg_to_regnum (gdbarch, reg);
0d53c4c4
DJ
783 }
784 else if (data[0] == DW_OP_fbreg)
785 {
0936ad1d
SS
786 struct block *b;
787 struct symbol *framefunc;
788 int frame_reg = 0;
0d53c4c4 789 LONGEST frame_offset;
0936ad1d
SS
790 gdb_byte *base_data;
791 size_t base_size;
792 LONGEST base_offset = 0;
793
794 b = block_for_pc (ax->scope);
795
796 if (!b)
797 error (_("No block found for address"));
798
799 framefunc = block_linkage_function (b);
800
801 if (!framefunc)
802 error (_("No function found for block"));
803
804 dwarf_expr_frame_base_1 (framefunc, ax->scope,
805 &base_data, &base_size);
806
08922a10 807 if (base_data[0] >= DW_OP_breg0 && base_data[0] <= DW_OP_breg31)
0936ad1d 808 {
08922a10
SS
809 gdb_byte *buf_end;
810
0936ad1d 811 frame_reg = base_data[0] - DW_OP_breg0;
08922a10
SS
812 buf_end = read_sleb128 (base_data + 1,
813 base_data + base_size, &base_offset);
0936ad1d
SS
814 if (buf_end != base_data + base_size)
815 error (_("Unexpected opcode after DW_OP_breg%u for symbol \"%s\"."),
816 frame_reg, SYMBOL_PRINT_NAME (symbol));
817 }
08922a10
SS
818 else if (base_data[0] >= DW_OP_reg0 && base_data[0] <= DW_OP_reg31)
819 {
820 /* The frame base is just the register, with no offset. */
821 frame_reg = base_data[0] - DW_OP_reg0;
822 base_offset = 0;
823 }
0936ad1d
SS
824 else
825 {
826 /* We don't know what to do with the frame base expression,
827 so we can't trace this variable; give up. */
08922a10
SS
828 error (_("Cannot generate expression to collect symbol \"%s\"; DWARF 2 encoding not handled, first opcode in base data is 0x%x."),
829 SYMBOL_PRINT_NAME (symbol), base_data[0]);
0936ad1d 830 }
0d53c4c4 831
08922a10 832 data = read_sleb128 (data + 1, end, &frame_offset);
4c2df51b 833
08922a10
SS
834 loc->kind = axs_lvalue_memory;
835 loc->reg = gdbarch_dwarf2_reg_to_regnum (gdbarch, frame_reg);
836 loc->offset = base_offset + frame_offset;
9c238357 837 }
08922a10 838 else if (data[0] >= DW_OP_breg0 && data[0] <= DW_OP_breg31)
9c238357
RC
839 {
840 unsigned int reg;
841 LONGEST offset;
9c238357
RC
842
843 reg = data[0] - DW_OP_breg0;
08922a10 844 data = read_sleb128 (data + 1, end, &offset);
9c238357 845
08922a10
SS
846 loc->kind = axs_lvalue_memory;
847 loc->reg = gdbarch_dwarf2_reg_to_regnum (gdbarch, reg);
848 loc->offset = offset;
0d53c4c4
DJ
849 }
850 else
9c238357
RC
851 error (_("Unsupported DWARF opcode 0x%x in the location of \"%s\"."),
852 data[0], SYMBOL_PRINT_NAME (symbol));
08922a10
SS
853
854 return data;
0d53c4c4 855}
08922a10
SS
856
857/* Given the location of a piece, issue bytecodes that will access it. */
858
859static void
860dwarf2_tracepoint_var_access (struct agent_expr *ax,
861 struct axs_value *value,
862 struct axs_var_loc *loc)
863{
864 value->kind = loc->kind;
865
866 switch (loc->kind)
867 {
868 case axs_lvalue_register:
869 value->u.reg = loc->reg;
870 break;
871
872 case axs_lvalue_memory:
873 ax_reg (ax, loc->reg);
874 if (loc->offset)
875 {
876 ax_const_l (ax, loc->offset);
877 ax_simple (ax, aop_add);
878 }
879 break;
880
881 default:
882 internal_error (__FILE__, __LINE__, _("Unhandled value kind in dwarf2_tracepoint_var_access"));
883 }
884}
885
886static void
887dwarf2_tracepoint_var_ref (struct symbol *symbol, struct gdbarch *gdbarch,
888 struct agent_expr *ax, struct axs_value *value,
889 gdb_byte *data, int size)
890{
891 gdb_byte *end = data + size;
892 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
893 /* In practice, a variable is not going to be spread across
894 dozens of registers or memory locations. If someone comes up
895 with a real-world example, revisit this. */
896#define MAX_FRAGS 16
897 struct axs_var_loc fragments[MAX_FRAGS];
898 int nfrags = 0, frag;
899 int length = 0;
900 int piece_ok = 0;
901 int bad = 0;
902 int first = 1;
903
904 if (!data || size == 0)
905 {
906 value->optimized_out = 1;
907 return;
908 }
909
910 while (data < end)
911 {
912 if (!piece_ok)
913 {
914 if (nfrags == MAX_FRAGS)
915 error (_("Too many pieces in location for \"%s\"."),
916 SYMBOL_PRINT_NAME (symbol));
917
918 fragments[nfrags].bytes = 0;
919 data = dwarf2_tracepoint_var_loc (symbol, ax, &fragments[nfrags],
920 gdbarch, data, end);
921 nfrags++;
922 piece_ok = 1;
923 }
924 else if (data[0] == DW_OP_piece)
925 {
926 ULONGEST bytes;
927
928 data = read_uleb128 (data + 1, end, &bytes);
929 /* Only deal with 4 byte fragments for now. */
930 if (bytes != 4)
931 error (_("DW_OP_piece %s not supported in location for \"%s\"."),
932 pulongest (bytes), SYMBOL_PRINT_NAME (symbol));
933 fragments[nfrags - 1].bytes = bytes;
934 length += bytes;
935 piece_ok = 0;
936 }
937 else
938 {
939 bad = 1;
940 break;
941 }
942 }
943
944 if (bad || data > end)
945 error (_("Corrupted DWARF expression for \"%s\"."),
946 SYMBOL_PRINT_NAME (symbol));
947
948 /* If single expression, no pieces, convert to external format. */
949 if (length == 0)
950 {
951 dwarf2_tracepoint_var_access (ax, value, &fragments[0]);
952 return;
953 }
954
955 if (length != TYPE_LENGTH (value->type))
956 error (_("Inconsistent piece information for \"%s\"."),
957 SYMBOL_PRINT_NAME (symbol));
958
959 /* Emit bytecodes to assemble the pieces into a single stack entry. */
960
961 for ((frag = (byte_order == BFD_ENDIAN_BIG ? 0 : nfrags - 1));
962 nfrags--;
963 (frag += (byte_order == BFD_ENDIAN_BIG ? 1 : -1)))
964 {
965 if (!first)
966 {
967 /* shift the previous fragment up 32 bits */
968 ax_const_l (ax, 32);
969 ax_simple (ax, aop_lsh);
970 }
971
972 dwarf2_tracepoint_var_access (ax, value, &fragments[frag]);
973
974 switch (value->kind)
975 {
976 case axs_lvalue_register:
977 ax_reg (ax, value->u.reg);
978 break;
979
980 case axs_lvalue_memory:
981 {
982 extern int trace_kludge; /* Ugh. */
983
984 gdb_assert (fragments[frag].bytes == 4);
985 if (trace_kludge)
986 ax_trace_quick (ax, 4);
987 ax_simple (ax, aop_ref32);
988 }
989 break;
990 }
991
992 if (!first)
993 {
994 /* or the new fragment into the previous */
995 ax_zero_ext (ax, 32);
996 ax_simple (ax, aop_bit_or);
997 }
998 first = 0;
999 }
1000 value->kind = axs_rvalue;
1001}
1002
4c2df51b
DJ
1003\f
1004/* Return the value of SYMBOL in FRAME using the DWARF-2 expression
1005 evaluator to calculate the location. */
1006static struct value *
1007locexpr_read_variable (struct symbol *symbol, struct frame_info *frame)
1008{
1009 struct dwarf2_locexpr_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
1010 struct value *val;
9a619af0 1011
a2d33775
JK
1012 val = dwarf2_evaluate_loc_desc (SYMBOL_TYPE (symbol), frame, dlbaton->data,
1013 dlbaton->size, dlbaton->per_cu);
4c2df51b
DJ
1014
1015 return val;
1016}
1017
1018/* Return non-zero iff we need a frame to evaluate SYMBOL. */
1019static int
1020locexpr_read_needs_frame (struct symbol *symbol)
1021{
1022 struct dwarf2_locexpr_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
9a619af0 1023
ae0d2f24
UW
1024 return dwarf2_loc_desc_needs_frame (dlbaton->data, dlbaton->size,
1025 dlbaton->per_cu);
4c2df51b
DJ
1026}
1027
08922a10
SS
1028/* Describe a single piece of a location, returning an updated
1029 position in the bytecode sequence. */
1030
1031static gdb_byte *
1032locexpr_describe_location_piece (struct symbol *symbol, struct ui_file *stream,
1033 CORE_ADDR addr, struct objfile *objfile,
1034 gdb_byte *data, int size, unsigned int addr_size)
4c2df51b 1035{
08922a10
SS
1036 struct gdbarch *gdbarch = get_objfile_arch (objfile);
1037 int regno;
1038
1039 if (data[0] >= DW_OP_reg0 && data[0] <= DW_OP_reg31)
1040 {
1041 regno = gdbarch_dwarf2_reg_to_regnum (gdbarch, data[0] - DW_OP_reg0);
1042 fprintf_filtered (stream, _("a variable in $%s"),
1043 gdbarch_register_name (gdbarch, regno));
1044 data += 1;
1045 }
1046 else if (data[0] == DW_OP_regx)
1047 {
1048 ULONGEST reg;
4c2df51b 1049
08922a10
SS
1050 data = read_uleb128 (data + 1, data + size, &reg);
1051 regno = gdbarch_dwarf2_reg_to_regnum (gdbarch, reg);
1052 fprintf_filtered (stream, _("a variable in $%s"),
1053 gdbarch_register_name (gdbarch, regno));
1054 }
1055 else if (data[0] == DW_OP_fbreg)
4c2df51b 1056 {
08922a10
SS
1057 struct block *b;
1058 struct symbol *framefunc;
1059 int frame_reg = 0;
1060 LONGEST frame_offset;
1061 gdb_byte *base_data;
1062 size_t base_size;
1063 LONGEST base_offset = 0;
1064
1065 b = block_for_pc (addr);
1066
1067 if (!b)
1068 error (_("No block found for address for symbol \"%s\"."),
1069 SYMBOL_PRINT_NAME (symbol));
1070
1071 framefunc = block_linkage_function (b);
1072
1073 if (!framefunc)
1074 error (_("No function found for block for symbol \"%s\"."),
1075 SYMBOL_PRINT_NAME (symbol));
1076
1077 dwarf_expr_frame_base_1 (framefunc, addr, &base_data, &base_size);
1078
1079 if (base_data[0] >= DW_OP_breg0 && base_data[0] <= DW_OP_breg31)
1080 {
1081 gdb_byte *buf_end;
1082
1083 frame_reg = base_data[0] - DW_OP_breg0;
1084 buf_end = read_sleb128 (base_data + 1,
1085 base_data + base_size, &base_offset);
1086 if (buf_end != base_data + base_size)
1087 error (_("Unexpected opcode after DW_OP_breg%u for symbol \"%s\"."),
1088 frame_reg, SYMBOL_PRINT_NAME (symbol));
1089 }
1090 else if (base_data[0] >= DW_OP_reg0 && base_data[0] <= DW_OP_reg31)
1091 {
1092 /* The frame base is just the register, with no offset. */
1093 frame_reg = base_data[0] - DW_OP_reg0;
1094 base_offset = 0;
1095 }
1096 else
1097 {
1098 /* We don't know what to do with the frame base expression,
1099 so we can't trace this variable; give up. */
1100 error (_("Cannot describe location of symbol \"%s\"; "
1101 "DWARF 2 encoding not handled, "
1102 "first opcode in base data is 0x%x."),
1103 SYMBOL_PRINT_NAME (symbol), base_data[0]);
1104 }
1105
1106 regno = gdbarch_dwarf2_reg_to_regnum (gdbarch, frame_reg);
1107
1108 data = read_sleb128 (data + 1, data + size, &frame_offset);
1109
1110 fprintf_filtered (stream, _("a variable at frame base reg $%s offset %s+%s"),
1111 gdbarch_register_name (gdbarch, regno),
1112 plongest (base_offset), plongest (frame_offset));
1113 }
1114 else if (data[0] >= DW_OP_breg0 && data[0] <= DW_OP_breg31)
1115 {
1116 LONGEST offset;
1117
1118 regno = gdbarch_dwarf2_reg_to_regnum (gdbarch, data[0] - DW_OP_breg0);
1119
1120 data = read_sleb128 (data + 1, data + size, &offset);
1121
4c2df51b 1122 fprintf_filtered (stream,
08922a10
SS
1123 _("a variable at offset %s from base reg $%s"),
1124 plongest (offset),
5e2b427d 1125 gdbarch_register_name (gdbarch, regno));
4c2df51b
DJ
1126 }
1127
c3228f12
EZ
1128 /* The location expression for a TLS variable looks like this (on a
1129 64-bit LE machine):
1130
1131 DW_AT_location : 10 byte block: 3 4 0 0 0 0 0 0 0 e0
1132 (DW_OP_addr: 4; DW_OP_GNU_push_tls_address)
1133
1134 0x3 is the encoding for DW_OP_addr, which has an operand as long
1135 as the size of an address on the target machine (here is 8
1136 bytes). 0xe0 is the encoding for DW_OP_GNU_push_tls_address.
1137 The operand represents the offset at which the variable is within
1138 the thread local storage. */
1139
08922a10
SS
1140 else if (size > 1
1141 && data[size - 1] == DW_OP_GNU_push_tls_address
1142 && data[0] == DW_OP_addr)
1143 {
1144 CORE_ADDR offset = dwarf2_read_address (gdbarch,
1145 data + 1,
1146 data + size - 1,
1147 addr_size);
9a619af0 1148
08922a10
SS
1149 fprintf_filtered (stream,
1150 _("a thread-local variable at offset %s "
1151 "in the thread-local storage for `%s'"),
1152 paddress (gdbarch, offset), objfile->name);
1153
1154 data += 1 + addr_size + 1;
1155 }
1156 else
1157 fprintf_filtered (stream,
1158 _("a variable with complex or multiple locations (DWARF2)"));
c3228f12 1159
08922a10 1160 return data;
4c2df51b
DJ
1161}
1162
08922a10
SS
1163/* Describe a single location, which may in turn consist of multiple
1164 pieces. */
a55cc764 1165
08922a10
SS
1166static void
1167locexpr_describe_location_1 (struct symbol *symbol, CORE_ADDR addr,
1168 struct ui_file *stream, gdb_byte *data, int size,
1169 struct objfile *objfile, unsigned int addr_size)
1170{
1171 gdb_byte *end = data + size;
1172 int piece_done = 0, first_piece = 1, bad = 0;
1173
1174 /* A multi-piece description consists of multiple sequences of bytes
1175 each followed by DW_OP_piece + length of piece. */
1176 while (data < end)
1177 {
1178 if (!piece_done)
1179 {
1180 if (first_piece)
1181 first_piece = 0;
1182 else
1183 fprintf_filtered (stream, _(", and "));
1184
1185 data = locexpr_describe_location_piece (symbol, stream, addr, objfile,
1186 data, size, addr_size);
1187 piece_done = 1;
1188 }
1189 else if (data[0] == DW_OP_piece)
1190 {
1191 ULONGEST bytes;
1192
1193 data = read_uleb128 (data + 1, end, &bytes);
1194
1195 fprintf_filtered (stream, _(" [%s-byte piece]"), pulongest (bytes));
1196
1197 piece_done = 0;
1198 }
1199 else
1200 {
1201 bad = 1;
1202 break;
1203 }
1204 }
1205
1206 if (bad || data > end)
1207 error (_("Corrupted DWARF2 expression for \"%s\"."),
1208 SYMBOL_PRINT_NAME (symbol));
1209}
1210
1211/* Print a natural-language description of SYMBOL to STREAM. This
1212 version is for a symbol with a single location. */
a55cc764 1213
08922a10
SS
1214static void
1215locexpr_describe_location (struct symbol *symbol, CORE_ADDR addr,
1216 struct ui_file *stream)
1217{
1218 struct dwarf2_locexpr_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
1219 struct objfile *objfile = dwarf2_per_cu_objfile (dlbaton->per_cu);
1220 unsigned int addr_size = dwarf2_per_cu_addr_size (dlbaton->per_cu);
1221
1222 locexpr_describe_location_1 (symbol, addr, stream, dlbaton->data, dlbaton->size,
1223 objfile, addr_size);
1224}
1225
1226/* Describe the location of SYMBOL as an agent value in VALUE, generating
1227 any necessary bytecode in AX. */
a55cc764 1228
0d53c4c4 1229static void
505e835d
UW
1230locexpr_tracepoint_var_ref (struct symbol *symbol, struct gdbarch *gdbarch,
1231 struct agent_expr *ax, struct axs_value *value)
a55cc764
DJ
1232{
1233 struct dwarf2_locexpr_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
1234
505e835d
UW
1235 dwarf2_tracepoint_var_ref (symbol, gdbarch, ax, value,
1236 dlbaton->data, dlbaton->size);
a55cc764
DJ
1237}
1238
4c2df51b
DJ
1239/* The set of location functions used with the DWARF-2 expression
1240 evaluator. */
768a979c 1241const struct symbol_computed_ops dwarf2_locexpr_funcs = {
4c2df51b
DJ
1242 locexpr_read_variable,
1243 locexpr_read_needs_frame,
1244 locexpr_describe_location,
a55cc764 1245 locexpr_tracepoint_var_ref
4c2df51b 1246};
0d53c4c4
DJ
1247
1248
1249/* Wrapper functions for location lists. These generally find
1250 the appropriate location expression and call something above. */
1251
1252/* Return the value of SYMBOL in FRAME using the DWARF-2 expression
1253 evaluator to calculate the location. */
1254static struct value *
1255loclist_read_variable (struct symbol *symbol, struct frame_info *frame)
1256{
1257 struct dwarf2_loclist_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
1258 struct value *val;
852483bc 1259 gdb_byte *data;
b6b08ebf 1260 size_t size;
0d53c4c4
DJ
1261
1262 data = find_location_expression (dlbaton, &size,
22c6caba
JW
1263 frame ? get_frame_address_in_block (frame)
1264 : 0);
0d53c4c4 1265 if (data == NULL)
806048c6
DJ
1266 {
1267 val = allocate_value (SYMBOL_TYPE (symbol));
1268 VALUE_LVAL (val) = not_lval;
1269 set_value_optimized_out (val, 1);
1270 }
1271 else
a2d33775 1272 val = dwarf2_evaluate_loc_desc (SYMBOL_TYPE (symbol), frame, data, size,
ae0d2f24 1273 dlbaton->per_cu);
0d53c4c4
DJ
1274
1275 return val;
1276}
1277
1278/* Return non-zero iff we need a frame to evaluate SYMBOL. */
1279static int
1280loclist_read_needs_frame (struct symbol *symbol)
1281{
1282 /* If there's a location list, then assume we need to have a frame
1283 to choose the appropriate location expression. With tracking of
1284 global variables this is not necessarily true, but such tracking
1285 is disabled in GCC at the moment until we figure out how to
1286 represent it. */
1287
1288 return 1;
1289}
1290
08922a10
SS
1291/* Print a natural-language description of SYMBOL to STREAM. This
1292 version applies when there is a list of different locations, each
1293 with a specified address range. */
1294
1295static void
1296loclist_describe_location (struct symbol *symbol, CORE_ADDR addr,
1297 struct ui_file *stream)
0d53c4c4 1298{
08922a10
SS
1299 struct dwarf2_loclist_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
1300 CORE_ADDR low, high;
1301 gdb_byte *loc_ptr, *buf_end;
1302 int length, first = 1;
1303 struct objfile *objfile = dwarf2_per_cu_objfile (dlbaton->per_cu);
1304 struct gdbarch *gdbarch = get_objfile_arch (objfile);
1305 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1306 unsigned int addr_size = dwarf2_per_cu_addr_size (dlbaton->per_cu);
1307 CORE_ADDR base_mask = ~(~(CORE_ADDR)1 << (addr_size * 8 - 1));
1308 /* Adjust base_address for relocatable objects. */
1309 CORE_ADDR base_offset = ANOFFSET (objfile->section_offsets,
1310 SECT_OFF_TEXT (objfile));
1311 CORE_ADDR base_address = dlbaton->base_address + base_offset;
1312
1313 loc_ptr = dlbaton->data;
1314 buf_end = dlbaton->data + dlbaton->size;
1315
1316 fprintf_filtered (stream, _("multi-location ("));
1317
1318 /* Iterate through locations until we run out. */
1319 while (1)
1320 {
1321 if (buf_end - loc_ptr < 2 * addr_size)
1322 error (_("Corrupted DWARF expression for symbol \"%s\"."),
1323 SYMBOL_PRINT_NAME (symbol));
1324
1325 low = extract_unsigned_integer (loc_ptr, addr_size, byte_order);
1326 loc_ptr += addr_size;
1327
1328 /* A base-address-selection entry. */
1329 if (low == base_mask)
1330 {
1331 base_address = dwarf2_read_address (gdbarch,
1332 loc_ptr, buf_end, addr_size);
1333 fprintf_filtered (stream, _("[base address %s]"),
1334 paddress (gdbarch, base_address));
1335 loc_ptr += addr_size;
1336 continue;
1337 }
1338
1339 high = extract_unsigned_integer (loc_ptr, addr_size, byte_order);
1340 loc_ptr += addr_size;
1341
1342 /* An end-of-list entry. */
1343 if (low == 0 && high == 0)
1344 {
1345 /* Indicate the end of the list, for readability. */
1346 fprintf_filtered (stream, _(")"));
1347 return;
1348 }
1349
1350 /* Otherwise, a location expression entry. */
1351 low += base_address;
1352 high += base_address;
1353
1354 length = extract_unsigned_integer (loc_ptr, 2, byte_order);
1355 loc_ptr += 2;
1356
1357 /* Separate the different locations with a semicolon. */
1358 if (first)
1359 first = 0;
1360 else
1361 fprintf_filtered (stream, _("; "));
1362
1363 /* (It would improve readability to print only the minimum
1364 necessary digits of the second number of the range.) */
1365 fprintf_filtered (stream, _("range %s-%s, "),
1366 paddress (gdbarch, low), paddress (gdbarch, high));
1367
1368 /* Now describe this particular location. */
1369 locexpr_describe_location_1 (symbol, low, stream, loc_ptr, length,
1370 objfile, addr_size);
1371
1372 loc_ptr += length;
1373 }
0d53c4c4
DJ
1374}
1375
1376/* Describe the location of SYMBOL as an agent value in VALUE, generating
1377 any necessary bytecode in AX. */
1378static void
505e835d
UW
1379loclist_tracepoint_var_ref (struct symbol *symbol, struct gdbarch *gdbarch,
1380 struct agent_expr *ax, struct axs_value *value)
0d53c4c4
DJ
1381{
1382 struct dwarf2_loclist_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
852483bc 1383 gdb_byte *data;
b6b08ebf 1384 size_t size;
0d53c4c4
DJ
1385
1386 data = find_location_expression (dlbaton, &size, ax->scope);
0d53c4c4 1387
505e835d 1388 dwarf2_tracepoint_var_ref (symbol, gdbarch, ax, value, data, size);
0d53c4c4
DJ
1389}
1390
1391/* The set of location functions used with the DWARF-2 expression
1392 evaluator and location lists. */
768a979c 1393const struct symbol_computed_ops dwarf2_loclist_funcs = {
0d53c4c4
DJ
1394 loclist_read_variable,
1395 loclist_read_needs_frame,
1396 loclist_describe_location,
1397 loclist_tracepoint_var_ref
1398};
This page took 0.53863 seconds and 4 git commands to generate.