*** empty log message ***
[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"
e7802207 39#include "dwarf2-frame.h"
4c2df51b
DJ
40
41#include "gdb_string.h"
eff4f95e 42#include "gdb_assert.h"
4c2df51b 43
0d53c4c4
DJ
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.
48
49 For now, only return the first matching location expression; there
50 can be more than one in the list. */
51
852483bc 52static gdb_byte *
0d53c4c4 53find_location_expression (struct dwarf2_loclist_baton *baton,
b6b08ebf 54 size_t *locexpr_length, CORE_ADDR pc)
0d53c4c4 55{
0d53c4c4 56 CORE_ADDR low, high;
852483bc
MK
57 gdb_byte *loc_ptr, *buf_end;
58 int length;
ae0d2f24 59 struct objfile *objfile = dwarf2_per_cu_objfile (baton->per_cu);
f7fd4728 60 struct gdbarch *gdbarch = get_objfile_arch (objfile);
e17a4113 61 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
ae0d2f24 62 unsigned int addr_size = dwarf2_per_cu_addr_size (baton->per_cu);
0d53c4c4 63 CORE_ADDR base_mask = ~(~(CORE_ADDR)1 << (addr_size * 8 - 1));
8edfa926 64 /* Adjust base_address for relocatable objects. */
ae0d2f24
UW
65 CORE_ADDR base_offset = ANOFFSET (objfile->section_offsets,
66 SECT_OFF_TEXT (objfile));
8edfa926 67 CORE_ADDR base_address = baton->base_address + base_offset;
0d53c4c4
DJ
68
69 loc_ptr = baton->data;
70 buf_end = baton->data + baton->size;
71
72 while (1)
73 {
b5758fe4
UW
74 if (buf_end - loc_ptr < 2 * addr_size)
75 error (_("find_location_expression: Corrupted DWARF expression."));
0d53c4c4 76
b5758fe4
UW
77 low = extract_unsigned_integer (loc_ptr, addr_size, byte_order);
78 loc_ptr += addr_size;
0d53c4c4
DJ
79
80 /* A base-address-selection entry. */
b5758fe4 81 if (low == base_mask)
0d53c4c4 82 {
b5758fe4
UW
83 base_address = dwarf2_read_address (gdbarch,
84 loc_ptr, buf_end, addr_size);
85 loc_ptr += addr_size;
0d53c4c4
DJ
86 continue;
87 }
88
b5758fe4
UW
89 high = extract_unsigned_integer (loc_ptr, addr_size, byte_order);
90 loc_ptr += addr_size;
91
92 /* An end-of-list entry. */
93 if (low == 0 && high == 0)
94 return NULL;
95
0d53c4c4
DJ
96 /* Otherwise, a location expression entry. */
97 low += base_address;
98 high += base_address;
99
e17a4113 100 length = extract_unsigned_integer (loc_ptr, 2, byte_order);
0d53c4c4
DJ
101 loc_ptr += 2;
102
103 if (pc >= low && pc < high)
104 {
105 *locexpr_length = length;
106 return loc_ptr;
107 }
108
109 loc_ptr += length;
110 }
111}
112
4c2df51b
DJ
113/* This is the baton used when performing dwarf2 expression
114 evaluation. */
115struct dwarf_expr_baton
116{
117 struct frame_info *frame;
118 struct objfile *objfile;
119};
120
121/* Helper functions for dwarf2_evaluate_loc_desc. */
122
4bc9efe1 123/* Using the frame specified in BATON, return the value of register
0b2b0195 124 REGNUM, treated as a pointer. */
4c2df51b 125static CORE_ADDR
61fbb938 126dwarf_expr_read_reg (void *baton, int dwarf_regnum)
4c2df51b 127{
4c2df51b 128 struct dwarf_expr_baton *debaton = (struct dwarf_expr_baton *) baton;
5e2b427d 129 struct gdbarch *gdbarch = get_frame_arch (debaton->frame);
e5192dd8 130 CORE_ADDR result;
0b2b0195 131 int regnum;
e4adbba9 132
5e2b427d
UW
133 regnum = gdbarch_dwarf2_reg_to_regnum (gdbarch, dwarf_regnum);
134 result = address_from_register (builtin_type (gdbarch)->builtin_data_ptr,
0b2b0195 135 regnum, debaton->frame);
4c2df51b
DJ
136 return result;
137}
138
139/* Read memory at ADDR (length LEN) into BUF. */
140
141static void
852483bc 142dwarf_expr_read_mem (void *baton, gdb_byte *buf, CORE_ADDR addr, size_t len)
4c2df51b
DJ
143{
144 read_memory (addr, buf, len);
145}
146
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. */
150static void
852483bc 151dwarf_expr_frame_base (void *baton, gdb_byte **start, size_t * length)
4c2df51b 152{
da62e633
AC
153 /* FIXME: cagney/2003-03-26: This code should be using
154 get_frame_base_address(), and then implement a dwarf2 specific
155 this_base method. */
4c2df51b 156 struct symbol *framefunc;
4c2df51b 157 struct dwarf_expr_baton *debaton = (struct dwarf_expr_baton *) baton;
0d53c4c4 158
edb3359d
DJ
159 /* Use block_linkage_function, which returns a real (not inlined)
160 function, instead of get_frame_function, which may return an
161 inlined function. */
162 framefunc = block_linkage_function (get_frame_block (debaton->frame, NULL));
0d53c4c4 163
eff4f95e
JG
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);
168
edb3359d
DJ
169 if (SYMBOL_LOCATION_BATON (framefunc) == NULL)
170 *start = NULL;
171 else if (SYMBOL_COMPUTED_OPS (framefunc) == &dwarf2_loclist_funcs)
0d53c4c4
DJ
172 {
173 struct dwarf2_loclist_baton *symbaton;
22c6caba
JW
174 struct frame_info *frame = debaton->frame;
175
0d53c4c4
DJ
176 symbaton = SYMBOL_LOCATION_BATON (framefunc);
177 *start = find_location_expression (symbaton, length,
22c6caba 178 get_frame_address_in_block (frame));
0d53c4c4
DJ
179 }
180 else
181 {
182 struct dwarf2_locexpr_baton *symbaton;
183 symbaton = SYMBOL_LOCATION_BATON (framefunc);
ebd3bcc1
JK
184 if (symbaton != NULL)
185 {
186 *length = symbaton->size;
187 *start = symbaton->data;
188 }
189 else
190 *start = NULL;
0d53c4c4
DJ
191 }
192
193 if (*start == NULL)
8a3fe4f8 194 error (_("Could not find the frame base for \"%s\"."),
0d53c4c4 195 SYMBOL_NATURAL_NAME (framefunc));
4c2df51b
DJ
196}
197
e7802207
TT
198/* Helper function for dwarf2_evaluate_loc_desc. Computes the CFA for
199 the frame in BATON. */
200
201static CORE_ADDR
202dwarf_expr_frame_cfa (void *baton)
203{
204 struct dwarf_expr_baton *debaton = (struct dwarf_expr_baton *) baton;
205 return dwarf2_frame_cfa (debaton->frame);
206}
207
4c2df51b
DJ
208/* Using the objfile specified in BATON, find the address for the
209 current thread's thread-local storage with offset OFFSET. */
210static CORE_ADDR
211dwarf_expr_tls_address (void *baton, CORE_ADDR offset)
212{
213 struct dwarf_expr_baton *debaton = (struct dwarf_expr_baton *) baton;
4c2df51b 214
9e35dae4 215 return target_translate_tls_address (debaton->objfile, offset);
4c2df51b
DJ
216}
217
052b9502
NF
218struct piece_closure
219{
220 /* The number of pieces used to describe this variable. */
221 int n_pieces;
222
cec03d70
TT
223 /* The architecture, used only for DWARF_VALUE_STACK. */
224 struct gdbarch *arch;
225
052b9502
NF
226 /* The pieces themselves. */
227 struct dwarf_expr_piece *pieces;
228};
229
230/* Allocate a closure for a value formed from separately-described
231 PIECES. */
232
233static struct piece_closure *
cec03d70
TT
234allocate_piece_closure (int n_pieces, struct dwarf_expr_piece *pieces,
235 struct gdbarch *arch)
052b9502
NF
236{
237 struct piece_closure *c = XZALLOC (struct piece_closure);
238
239 c->n_pieces = n_pieces;
cec03d70 240 c->arch = arch;
052b9502
NF
241 c->pieces = XCALLOC (n_pieces, struct dwarf_expr_piece);
242
243 memcpy (c->pieces, pieces, n_pieces * sizeof (struct dwarf_expr_piece));
244
245 return c;
246}
247
248static void
249read_pieced_value (struct value *v)
250{
251 int i;
252 long offset = 0;
253 gdb_byte *contents;
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));
256
257 contents = value_contents_raw (v);
258 for (i = 0; i < c->n_pieces; i++)
259 {
260 struct dwarf_expr_piece *p = &c->pieces[i];
cec03d70 261 switch (p->location)
052b9502 262 {
cec03d70
TT
263 case DWARF_VALUE_REGISTER:
264 {
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,
44353522 268 p->v.expr.value);
cec03d70
TT
269 get_frame_register (frame, gdb_regnum, regval);
270 memcpy (contents + offset, regval, p->size);
271 }
272 break;
273
274 case DWARF_VALUE_MEMORY:
44353522
DE
275 if (p->v.expr.in_stack_memory)
276 read_stack (p->v.expr.value, contents + offset, p->size);
277 else
278 read_memory (p->v.expr.value, contents + offset, p->size);
cec03d70
TT
279 break;
280
281 case DWARF_VALUE_STACK:
282 {
283 gdb_byte bytes[sizeof (ULONGEST)];
284 size_t n;
285 int addr_size = gdbarch_addr_bit (c->arch) / 8;
286 store_unsigned_integer (bytes, addr_size,
287 gdbarch_byte_order (c->arch),
44353522 288 p->v.expr.value);
cec03d70
TT
289 n = p->size;
290 if (n > addr_size)
291 n = addr_size;
292 memcpy (contents + offset, bytes, n);
293 }
294 break;
295
296 case DWARF_VALUE_LITERAL:
297 {
298 size_t n = p->size;
299 if (n > p->v.literal.length)
300 n = p->v.literal.length;
301 memcpy (contents + offset, p->v.literal.data, n);
302 }
303 break;
304
305 default:
306 internal_error (__FILE__, __LINE__, _("invalid location type"));
052b9502
NF
307 }
308 offset += p->size;
309 }
310}
311
312static void
313write_pieced_value (struct value *to, struct value *from)
314{
315 int i;
316 long offset = 0;
317 gdb_byte *contents;
318 struct piece_closure *c = (struct piece_closure *) value_computed_closure (to);
319 struct frame_info *frame = frame_find_by_id (VALUE_FRAME_ID (to));
320
321 if (frame == NULL)
322 {
323 set_value_optimized_out (to, 1);
324 return;
325 }
326
327 contents = value_contents_raw (from);
328 for (i = 0; i < c->n_pieces; i++)
329 {
330 struct dwarf_expr_piece *p = &c->pieces[i];
cec03d70 331 switch (p->location)
052b9502 332 {
cec03d70
TT
333 case DWARF_VALUE_REGISTER:
334 {
335 struct gdbarch *arch = get_frame_arch (frame);
44353522 336 int gdb_regnum = gdbarch_dwarf2_reg_to_regnum (arch, p->v.expr.value);
cec03d70
TT
337 put_frame_register (frame, gdb_regnum, contents + offset);
338 }
339 break;
340 case DWARF_VALUE_MEMORY:
44353522 341 write_memory (p->v.expr.value, contents + offset, p->size);
cec03d70
TT
342 break;
343 default:
344 set_value_optimized_out (to, 1);
345 return;
052b9502
NF
346 }
347 offset += p->size;
348 }
349}
350
351static void *
352copy_pieced_value_closure (struct value *v)
353{
354 struct piece_closure *c = (struct piece_closure *) value_computed_closure (v);
355
cec03d70 356 return allocate_piece_closure (c->n_pieces, c->pieces, c->arch);
052b9502
NF
357}
358
359static void
360free_pieced_value_closure (struct value *v)
361{
362 struct piece_closure *c = (struct piece_closure *) value_computed_closure (v);
363
364 xfree (c->pieces);
365 xfree (c);
366}
367
368/* Functions for accessing a variable described by DW_OP_piece. */
369static struct lval_funcs pieced_value_funcs = {
370 read_pieced_value,
371 write_pieced_value,
372 copy_pieced_value_closure,
373 free_pieced_value_closure
374};
375
4c2df51b
DJ
376/* Evaluate a location description, starting at DATA and with length
377 SIZE, to find the current location of variable VAR in the context
378 of FRAME. */
379static struct value *
380dwarf2_evaluate_loc_desc (struct symbol *var, struct frame_info *frame,
852483bc 381 gdb_byte *data, unsigned short size,
ae0d2f24 382 struct dwarf2_per_cu_data *per_cu)
4c2df51b 383{
4c2df51b
DJ
384 struct value *retval;
385 struct dwarf_expr_baton baton;
386 struct dwarf_expr_context *ctx;
4a227398 387 struct cleanup *old_chain;
4c2df51b 388
0d53c4c4
DJ
389 if (size == 0)
390 {
391 retval = allocate_value (SYMBOL_TYPE (var));
392 VALUE_LVAL (retval) = not_lval;
feb13ab0 393 set_value_optimized_out (retval, 1);
10fb19b6 394 return retval;
0d53c4c4
DJ
395 }
396
4c2df51b 397 baton.frame = frame;
ae0d2f24 398 baton.objfile = dwarf2_per_cu_objfile (per_cu);
4c2df51b
DJ
399
400 ctx = new_dwarf_expr_context ();
4a227398
TT
401 old_chain = make_cleanup_free_dwarf_expr_context (ctx);
402
f7fd4728 403 ctx->gdbarch = get_objfile_arch (baton.objfile);
ae0d2f24 404 ctx->addr_size = dwarf2_per_cu_addr_size (per_cu);
4c2df51b
DJ
405 ctx->baton = &baton;
406 ctx->read_reg = dwarf_expr_read_reg;
407 ctx->read_mem = dwarf_expr_read_mem;
408 ctx->get_frame_base = dwarf_expr_frame_base;
e7802207 409 ctx->get_frame_cfa = dwarf_expr_frame_cfa;
4c2df51b
DJ
410 ctx->get_tls_address = dwarf_expr_tls_address;
411
412 dwarf_expr_eval (ctx, data, size);
87808bd6
JB
413 if (ctx->num_pieces > 0)
414 {
052b9502
NF
415 struct piece_closure *c;
416 struct frame_id frame_id = get_frame_id (frame);
417
cec03d70 418 c = allocate_piece_closure (ctx->num_pieces, ctx->pieces, ctx->gdbarch);
052b9502
NF
419 retval = allocate_computed_value (SYMBOL_TYPE (var),
420 &pieced_value_funcs,
421 c);
422 VALUE_FRAME_ID (retval) = frame_id;
87808bd6 423 }
4c2df51b
DJ
424 else
425 {
cec03d70
TT
426 switch (ctx->location)
427 {
428 case DWARF_VALUE_REGISTER:
429 {
430 struct gdbarch *arch = get_frame_arch (frame);
431 CORE_ADDR dwarf_regnum = dwarf_expr_fetch (ctx, 0);
432 int gdb_regnum = gdbarch_dwarf2_reg_to_regnum (arch, dwarf_regnum);
433 retval = value_from_register (SYMBOL_TYPE (var), gdb_regnum, frame);
434 }
435 break;
436
437 case DWARF_VALUE_MEMORY:
438 {
439 CORE_ADDR address = dwarf_expr_fetch (ctx, 0);
44353522 440 int in_stack_memory = dwarf_expr_fetch_in_stack_memory (ctx, 0);
cec03d70
TT
441
442 retval = allocate_value (SYMBOL_TYPE (var));
443 VALUE_LVAL (retval) = lval_memory;
444 set_value_lazy (retval, 1);
44353522
DE
445 if (in_stack_memory)
446 set_value_stack (retval, 1);
cec03d70
TT
447 set_value_address (retval, address);
448 }
449 break;
450
451 case DWARF_VALUE_STACK:
452 {
453 gdb_byte bytes[sizeof (ULONGEST)];
454 ULONGEST value = (ULONGEST) dwarf_expr_fetch (ctx, 0);
455 bfd_byte *contents;
456 size_t n = ctx->addr_size;
457
458 store_unsigned_integer (bytes, ctx->addr_size,
459 gdbarch_byte_order (ctx->gdbarch),
460 value);
461 retval = allocate_value (SYMBOL_TYPE (var));
462 contents = value_contents_raw (retval);
463 if (n > TYPE_LENGTH (SYMBOL_TYPE (var)))
464 n = TYPE_LENGTH (SYMBOL_TYPE (var));
465 memcpy (contents, bytes, n);
466 }
467 break;
468
469 case DWARF_VALUE_LITERAL:
470 {
471 bfd_byte *contents;
472 size_t n = ctx->len;
473
474 retval = allocate_value (SYMBOL_TYPE (var));
475 contents = value_contents_raw (retval);
476 if (n > TYPE_LENGTH (SYMBOL_TYPE (var)))
477 n = TYPE_LENGTH (SYMBOL_TYPE (var));
478 memcpy (contents, ctx->data, n);
479 }
480 break;
481
482 default:
483 internal_error (__FILE__, __LINE__, _("invalid location type"));
484 }
4c2df51b
DJ
485 }
486
42be36b3
CT
487 set_value_initialized (retval, ctx->initialized);
488
4a227398 489 do_cleanups (old_chain);
4c2df51b
DJ
490
491 return retval;
492}
4c2df51b
DJ
493\f
494/* Helper functions and baton for dwarf2_loc_desc_needs_frame. */
495
496struct needs_frame_baton
497{
498 int needs_frame;
499};
500
501/* Reads from registers do require a frame. */
502static CORE_ADDR
61fbb938 503needs_frame_read_reg (void *baton, int regnum)
4c2df51b
DJ
504{
505 struct needs_frame_baton *nf_baton = baton;
506 nf_baton->needs_frame = 1;
507 return 1;
508}
509
510/* Reads from memory do not require a frame. */
511static void
852483bc 512needs_frame_read_mem (void *baton, gdb_byte *buf, CORE_ADDR addr, size_t len)
4c2df51b
DJ
513{
514 memset (buf, 0, len);
515}
516
517/* Frame-relative accesses do require a frame. */
518static void
852483bc 519needs_frame_frame_base (void *baton, gdb_byte **start, size_t * length)
4c2df51b 520{
852483bc 521 static gdb_byte lit0 = DW_OP_lit0;
4c2df51b
DJ
522 struct needs_frame_baton *nf_baton = baton;
523
524 *start = &lit0;
525 *length = 1;
526
527 nf_baton->needs_frame = 1;
528}
529
e7802207
TT
530/* CFA accesses require a frame. */
531
532static CORE_ADDR
533needs_frame_frame_cfa (void *baton)
534{
535 struct needs_frame_baton *nf_baton = baton;
536 nf_baton->needs_frame = 1;
537 return 1;
538}
539
4c2df51b
DJ
540/* Thread-local accesses do require a frame. */
541static CORE_ADDR
542needs_frame_tls_address (void *baton, CORE_ADDR offset)
543{
544 struct needs_frame_baton *nf_baton = baton;
545 nf_baton->needs_frame = 1;
546 return 1;
547}
548
549/* Return non-zero iff the location expression at DATA (length SIZE)
550 requires a frame to evaluate. */
551
552static int
ae0d2f24
UW
553dwarf2_loc_desc_needs_frame (gdb_byte *data, unsigned short size,
554 struct dwarf2_per_cu_data *per_cu)
4c2df51b
DJ
555{
556 struct needs_frame_baton baton;
557 struct dwarf_expr_context *ctx;
f630a401 558 int in_reg;
4a227398 559 struct cleanup *old_chain;
4c2df51b
DJ
560
561 baton.needs_frame = 0;
562
563 ctx = new_dwarf_expr_context ();
4a227398
TT
564 old_chain = make_cleanup_free_dwarf_expr_context (ctx);
565
f7fd4728 566 ctx->gdbarch = get_objfile_arch (dwarf2_per_cu_objfile (per_cu));
ae0d2f24 567 ctx->addr_size = dwarf2_per_cu_addr_size (per_cu);
4c2df51b
DJ
568 ctx->baton = &baton;
569 ctx->read_reg = needs_frame_read_reg;
570 ctx->read_mem = needs_frame_read_mem;
571 ctx->get_frame_base = needs_frame_frame_base;
e7802207 572 ctx->get_frame_cfa = needs_frame_frame_cfa;
4c2df51b
DJ
573 ctx->get_tls_address = needs_frame_tls_address;
574
575 dwarf_expr_eval (ctx, data, size);
576
cec03d70 577 in_reg = ctx->location == DWARF_VALUE_REGISTER;
f630a401 578
87808bd6
JB
579 if (ctx->num_pieces > 0)
580 {
581 int i;
582
583 /* If the location has several pieces, and any of them are in
584 registers, then we will need a frame to fetch them from. */
585 for (i = 0; i < ctx->num_pieces; i++)
cec03d70 586 if (ctx->pieces[i].location == DWARF_VALUE_REGISTER)
87808bd6
JB
587 in_reg = 1;
588 }
589
4a227398 590 do_cleanups (old_chain);
4c2df51b 591
f630a401 592 return baton.needs_frame || in_reg;
4c2df51b
DJ
593}
594
0d53c4c4 595static void
505e835d
UW
596dwarf2_tracepoint_var_ref (struct symbol *symbol, struct gdbarch *gdbarch,
597 struct agent_expr *ax, struct axs_value *value,
598 gdb_byte *data, int size)
0d53c4c4
DJ
599{
600 if (size == 0)
8a3fe4f8 601 error (_("Symbol \"%s\" has been optimized out."),
0d53c4c4
DJ
602 SYMBOL_PRINT_NAME (symbol));
603
604 if (size == 1
605 && data[0] >= DW_OP_reg0
606 && data[0] <= DW_OP_reg31)
607 {
608 value->kind = axs_lvalue_register;
609 value->u.reg = data[0] - DW_OP_reg0;
610 }
611 else if (data[0] == DW_OP_regx)
612 {
613 ULONGEST reg;
614 read_uleb128 (data + 1, data + size, &reg);
615 value->kind = axs_lvalue_register;
616 value->u.reg = reg;
617 }
618 else if (data[0] == DW_OP_fbreg)
619 {
620 /* And this is worse than just minimal; we should honor the frame base
621 as above. */
622 int frame_reg;
623 LONGEST frame_offset;
852483bc 624 gdb_byte *buf_end;
0d53c4c4
DJ
625
626 buf_end = read_sleb128 (data + 1, data + size, &frame_offset);
627 if (buf_end != data + size)
8a3fe4f8 628 error (_("Unexpected opcode after DW_OP_fbreg for symbol \"%s\"."),
0d53c4c4 629 SYMBOL_PRINT_NAME (symbol));
4c2df51b 630
505e835d 631 gdbarch_virtual_frame_pointer (gdbarch,
c7bb205c 632 ax->scope, &frame_reg, &frame_offset);
0d53c4c4
DJ
633 ax_reg (ax, frame_reg);
634 ax_const_l (ax, frame_offset);
635 ax_simple (ax, aop_add);
4c2df51b 636
9c238357
RC
637 value->kind = axs_lvalue_memory;
638 }
639 else if (data[0] >= DW_OP_breg0
640 && data[0] <= DW_OP_breg31)
641 {
642 unsigned int reg;
643 LONGEST offset;
644 gdb_byte *buf_end;
645
646 reg = data[0] - DW_OP_breg0;
647 buf_end = read_sleb128 (data + 1, data + size, &offset);
648 if (buf_end != data + size)
649 error (_("Unexpected opcode after DW_OP_breg%u for symbol \"%s\"."),
650 reg, SYMBOL_PRINT_NAME (symbol));
651
652 ax_reg (ax, reg);
653 ax_const_l (ax, offset);
0d53c4c4 654 ax_simple (ax, aop_add);
9c238357 655
0d53c4c4
DJ
656 value->kind = axs_lvalue_memory;
657 }
658 else
9c238357
RC
659 error (_("Unsupported DWARF opcode 0x%x in the location of \"%s\"."),
660 data[0], SYMBOL_PRINT_NAME (symbol));
0d53c4c4 661}
4c2df51b
DJ
662\f
663/* Return the value of SYMBOL in FRAME using the DWARF-2 expression
664 evaluator to calculate the location. */
665static struct value *
666locexpr_read_variable (struct symbol *symbol, struct frame_info *frame)
667{
668 struct dwarf2_locexpr_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
669 struct value *val;
670 val = dwarf2_evaluate_loc_desc (symbol, frame, dlbaton->data, dlbaton->size,
ae0d2f24 671 dlbaton->per_cu);
4c2df51b
DJ
672
673 return val;
674}
675
676/* Return non-zero iff we need a frame to evaluate SYMBOL. */
677static int
678locexpr_read_needs_frame (struct symbol *symbol)
679{
680 struct dwarf2_locexpr_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
ae0d2f24
UW
681 return dwarf2_loc_desc_needs_frame (dlbaton->data, dlbaton->size,
682 dlbaton->per_cu);
4c2df51b
DJ
683}
684
685/* Print a natural-language description of SYMBOL to STREAM. */
686static int
687locexpr_describe_location (struct symbol *symbol, struct ui_file *stream)
688{
689 /* FIXME: be more extensive. */
690 struct dwarf2_locexpr_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
ae0d2f24 691 int addr_size = dwarf2_per_cu_addr_size (dlbaton->per_cu);
4c2df51b
DJ
692
693 if (dlbaton->size == 1
694 && dlbaton->data[0] >= DW_OP_reg0
695 && dlbaton->data[0] <= DW_OP_reg31)
696 {
5e2b427d
UW
697 struct objfile *objfile = dwarf2_per_cu_objfile (dlbaton->per_cu);
698 struct gdbarch *gdbarch = get_objfile_arch (objfile);
699 int regno = gdbarch_dwarf2_reg_to_regnum (gdbarch,
700 dlbaton->data[0] - DW_OP_reg0);
4c2df51b 701 fprintf_filtered (stream,
c9f4d572 702 "a variable in register %s",
5e2b427d 703 gdbarch_register_name (gdbarch, regno));
4c2df51b
DJ
704 return 1;
705 }
706
c3228f12
EZ
707 /* The location expression for a TLS variable looks like this (on a
708 64-bit LE machine):
709
710 DW_AT_location : 10 byte block: 3 4 0 0 0 0 0 0 0 e0
711 (DW_OP_addr: 4; DW_OP_GNU_push_tls_address)
712
713 0x3 is the encoding for DW_OP_addr, which has an operand as long
714 as the size of an address on the target machine (here is 8
715 bytes). 0xe0 is the encoding for DW_OP_GNU_push_tls_address.
716 The operand represents the offset at which the variable is within
717 the thread local storage. */
718
719 if (dlbaton->size > 1
720 && dlbaton->data[dlbaton->size - 1] == DW_OP_GNU_push_tls_address)
721 if (dlbaton->data[0] == DW_OP_addr)
722 {
ae0d2f24 723 struct objfile *objfile = dwarf2_per_cu_objfile (dlbaton->per_cu);
f7fd4728
UW
724 struct gdbarch *gdbarch = get_objfile_arch (objfile);
725 CORE_ADDR offset = dwarf2_read_address (gdbarch,
726 &dlbaton->data[1],
c193f044 727 &dlbaton->data[dlbaton->size - 1],
ae0d2f24 728 addr_size);
c3228f12 729 fprintf_filtered (stream,
32ffcbed 730 "a thread-local variable at offset %s in the "
c3228f12 731 "thread-local storage for `%s'",
5af949e3 732 paddress (gdbarch, offset), objfile->name);
c3228f12
EZ
733 return 1;
734 }
735
736
4c2df51b
DJ
737 fprintf_filtered (stream,
738 "a variable with complex or multiple locations (DWARF2)");
739 return 1;
740}
741
a55cc764
DJ
742
743/* Describe the location of SYMBOL as an agent value in VALUE, generating
744 any necessary bytecode in AX.
745
746 NOTE drow/2003-02-26: This function is extremely minimal, because
747 doing it correctly is extremely complicated and there is no
748 publicly available stub with tracepoint support for me to test
749 against. When there is one this function should be revisited. */
750
0d53c4c4 751static void
505e835d
UW
752locexpr_tracepoint_var_ref (struct symbol *symbol, struct gdbarch *gdbarch,
753 struct agent_expr *ax, struct axs_value *value)
a55cc764
DJ
754{
755 struct dwarf2_locexpr_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
756
505e835d
UW
757 dwarf2_tracepoint_var_ref (symbol, gdbarch, ax, value,
758 dlbaton->data, dlbaton->size);
a55cc764
DJ
759}
760
4c2df51b
DJ
761/* The set of location functions used with the DWARF-2 expression
762 evaluator. */
768a979c 763const struct symbol_computed_ops dwarf2_locexpr_funcs = {
4c2df51b
DJ
764 locexpr_read_variable,
765 locexpr_read_needs_frame,
766 locexpr_describe_location,
a55cc764 767 locexpr_tracepoint_var_ref
4c2df51b 768};
0d53c4c4
DJ
769
770
771/* Wrapper functions for location lists. These generally find
772 the appropriate location expression and call something above. */
773
774/* Return the value of SYMBOL in FRAME using the DWARF-2 expression
775 evaluator to calculate the location. */
776static struct value *
777loclist_read_variable (struct symbol *symbol, struct frame_info *frame)
778{
779 struct dwarf2_loclist_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
780 struct value *val;
852483bc 781 gdb_byte *data;
b6b08ebf 782 size_t size;
0d53c4c4
DJ
783
784 data = find_location_expression (dlbaton, &size,
22c6caba
JW
785 frame ? get_frame_address_in_block (frame)
786 : 0);
0d53c4c4 787 if (data == NULL)
806048c6
DJ
788 {
789 val = allocate_value (SYMBOL_TYPE (symbol));
790 VALUE_LVAL (val) = not_lval;
791 set_value_optimized_out (val, 1);
792 }
793 else
794 val = dwarf2_evaluate_loc_desc (symbol, frame, data, size,
ae0d2f24 795 dlbaton->per_cu);
0d53c4c4
DJ
796
797 return val;
798}
799
800/* Return non-zero iff we need a frame to evaluate SYMBOL. */
801static int
802loclist_read_needs_frame (struct symbol *symbol)
803{
804 /* If there's a location list, then assume we need to have a frame
805 to choose the appropriate location expression. With tracking of
806 global variables this is not necessarily true, but such tracking
807 is disabled in GCC at the moment until we figure out how to
808 represent it. */
809
810 return 1;
811}
812
813/* Print a natural-language description of SYMBOL to STREAM. */
814static int
815loclist_describe_location (struct symbol *symbol, struct ui_file *stream)
816{
817 /* FIXME: Could print the entire list of locations. */
818 fprintf_filtered (stream, "a variable with multiple locations");
819 return 1;
820}
821
822/* Describe the location of SYMBOL as an agent value in VALUE, generating
823 any necessary bytecode in AX. */
824static void
505e835d
UW
825loclist_tracepoint_var_ref (struct symbol *symbol, struct gdbarch *gdbarch,
826 struct agent_expr *ax, struct axs_value *value)
0d53c4c4
DJ
827{
828 struct dwarf2_loclist_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
852483bc 829 gdb_byte *data;
b6b08ebf 830 size_t size;
0d53c4c4
DJ
831
832 data = find_location_expression (dlbaton, &size, ax->scope);
833 if (data == NULL)
8a3fe4f8 834 error (_("Variable \"%s\" is not available."), SYMBOL_NATURAL_NAME (symbol));
0d53c4c4 835
505e835d 836 dwarf2_tracepoint_var_ref (symbol, gdbarch, ax, value, data, size);
0d53c4c4
DJ
837}
838
839/* The set of location functions used with the DWARF-2 expression
840 evaluator and location lists. */
768a979c 841const struct symbol_computed_ops dwarf2_loclist_funcs = {
0d53c4c4
DJ
842 loclist_read_variable,
843 loclist_read_needs_frame,
844 loclist_describe_location,
845 loclist_tracepoint_var_ref
846};
This page took 0.50647 seconds and 4 git commands to generate.