2005-05-22 Andrew Cagney <cagney@gnu.org>
[deliverable/binutils-gdb.git] / gdb / dwarf2loc.c
CommitLineData
4c2df51b 1/* DWARF 2 location expression support for GDB.
feb13ab0
AC
2
3 Copyright 2003, 2005 Free Software Foundation, Inc.
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
11 the Free Software Foundation; either version 2 of the License, or (at
12 your option) any later version.
13
14 This program is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330,
22 Boston, MA 02111-1307, USA. */
23
24#include "defs.h"
25#include "ui-out.h"
26#include "value.h"
27#include "frame.h"
28#include "gdbcore.h"
29#include "target.h"
30#include "inferior.h"
a55cc764
DJ
31#include "ax.h"
32#include "ax-gdb.h"
e4adbba9 33#include "regcache.h"
c3228f12 34#include "objfiles.h"
93ad78a7 35#include "exceptions.h"
4c2df51b
DJ
36
37#include "elf/dwarf2.h"
38#include "dwarf2expr.h"
39#include "dwarf2loc.h"
40
41#include "gdb_string.h"
42
43#ifndef DWARF2_REG_TO_REGNUM
44#define DWARF2_REG_TO_REGNUM(REG) (REG)
45#endif
46
0d53c4c4
DJ
47/* A helper function for dealing with location lists. Given a
48 symbol baton (BATON) and a pc value (PC), find the appropriate
49 location expression, set *LOCEXPR_LENGTH, and return a pointer
50 to the beginning of the expression. Returns NULL on failure.
51
52 For now, only return the first matching location expression; there
53 can be more than one in the list. */
54
55static char *
56find_location_expression (struct dwarf2_loclist_baton *baton,
b6b08ebf 57 size_t *locexpr_length, CORE_ADDR pc)
0d53c4c4 58{
0d53c4c4
DJ
59 CORE_ADDR low, high;
60 char *loc_ptr, *buf_end;
61 unsigned int addr_size = TARGET_ADDR_BIT / TARGET_CHAR_BIT, length;
62 CORE_ADDR base_mask = ~(~(CORE_ADDR)1 << (addr_size * 8 - 1));
8edfa926
BM
63 /* Adjust base_address for relocatable objects. */
64 CORE_ADDR base_offset = ANOFFSET (baton->objfile->section_offsets,
65 SECT_OFF_TEXT (baton->objfile));
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 {
73 low = dwarf2_read_address (loc_ptr, buf_end, &length);
74 loc_ptr += length;
75 high = dwarf2_read_address (loc_ptr, buf_end, &length);
76 loc_ptr += length;
77
78 /* An end-of-list entry. */
79 if (low == 0 && high == 0)
80 return NULL;
81
82 /* A base-address-selection entry. */
83 if ((low & base_mask) == base_mask)
84 {
85 base_address = high;
86 continue;
87 }
88
89 /* Otherwise, a location expression entry. */
90 low += base_address;
91 high += base_address;
92
93 length = extract_unsigned_integer (loc_ptr, 2);
94 loc_ptr += 2;
95
96 if (pc >= low && pc < high)
97 {
98 *locexpr_length = length;
99 return loc_ptr;
100 }
101
102 loc_ptr += length;
103 }
104}
105
4c2df51b
DJ
106/* This is the baton used when performing dwarf2 expression
107 evaluation. */
108struct dwarf_expr_baton
109{
110 struct frame_info *frame;
111 struct objfile *objfile;
112};
113
114/* Helper functions for dwarf2_evaluate_loc_desc. */
115
116/* Using the frame specified in BATON, read register REGNUM. The lval
117 type will be returned in LVALP, and for lval_memory the register
118 save address will be returned in ADDRP. */
119static CORE_ADDR
61fbb938 120dwarf_expr_read_reg (void *baton, int dwarf_regnum)
4c2df51b 121{
4c2df51b 122 struct dwarf_expr_baton *debaton = (struct dwarf_expr_baton *) baton;
61fbb938
DJ
123 CORE_ADDR result, save_addr;
124 enum lval_type lval_type;
e4adbba9
DJ
125 char *buf;
126 int optimized, regnum, realnum, regsize;
127
128 regnum = DWARF2_REG_TO_REGNUM (dwarf_regnum);
129 regsize = register_size (current_gdbarch, regnum);
130 buf = (char *) alloca (regsize);
4c2df51b 131
61fbb938
DJ
132 frame_register (debaton->frame, regnum, &optimized, &lval_type, &save_addr,
133 &realnum, buf);
af1342ab
AC
134 /* NOTE: cagney/2003-05-22: This extract is assuming that a DWARF 2
135 address is always unsigned. That may or may not be true. */
136 result = extract_unsigned_integer (buf, regsize);
4c2df51b
DJ
137
138 return result;
139}
140
141/* Read memory at ADDR (length LEN) into BUF. */
142
143static void
144dwarf_expr_read_mem (void *baton, char *buf, CORE_ADDR addr, size_t len)
145{
146 read_memory (addr, buf, len);
147}
148
149/* Using the frame specified in BATON, find the location expression
150 describing the frame base. Return a pointer to it in START and
151 its length in LENGTH. */
152static void
153dwarf_expr_frame_base (void *baton, unsigned char **start, size_t * length)
154{
da62e633
AC
155 /* FIXME: cagney/2003-03-26: This code should be using
156 get_frame_base_address(), and then implement a dwarf2 specific
157 this_base method. */
4c2df51b 158 struct symbol *framefunc;
4c2df51b 159 struct dwarf_expr_baton *debaton = (struct dwarf_expr_baton *) baton;
0d53c4c4 160
4c2df51b 161 framefunc = get_frame_function (debaton->frame);
0d53c4c4 162
a67af2b9 163 if (SYMBOL_OPS (framefunc) == &dwarf2_loclist_funcs)
0d53c4c4
DJ
164 {
165 struct dwarf2_loclist_baton *symbaton;
166 symbaton = SYMBOL_LOCATION_BATON (framefunc);
167 *start = find_location_expression (symbaton, length,
168 get_frame_pc (debaton->frame));
169 }
170 else
171 {
172 struct dwarf2_locexpr_baton *symbaton;
173 symbaton = SYMBOL_LOCATION_BATON (framefunc);
174 *length = symbaton->size;
175 *start = symbaton->data;
176 }
177
178 if (*start == NULL)
8a3fe4f8 179 error (_("Could not find the frame base for \"%s\"."),
0d53c4c4 180 SYMBOL_NATURAL_NAME (framefunc));
4c2df51b
DJ
181}
182
183/* Using the objfile specified in BATON, find the address for the
184 current thread's thread-local storage with offset OFFSET. */
185static CORE_ADDR
186dwarf_expr_tls_address (void *baton, CORE_ADDR offset)
187{
188 struct dwarf_expr_baton *debaton = (struct dwarf_expr_baton *) baton;
4dd04433 189 volatile CORE_ADDR addr = 0;
4c2df51b 190
b2756930
KB
191 if (target_get_thread_local_address_p ()
192 && gdbarch_fetch_tls_load_module_address_p (current_gdbarch))
93ad78a7
KB
193 {
194 ptid_t ptid = inferior_ptid;
195 struct objfile *objfile = debaton->objfile;
71fff37b 196 volatile struct gdb_exception ex;
93ad78a7
KB
197
198 TRY_CATCH (ex, RETURN_MASK_ALL)
199 {
b2756930
KB
200 CORE_ADDR lm_addr;
201
202 /* Fetch the load module address for this objfile. */
203 lm_addr = gdbarch_fetch_tls_load_module_address (current_gdbarch,
204 objfile);
205 /* If it's 0, throw the appropriate exception. */
206 if (lm_addr == 0)
109c3e39
AC
207 throw_error (TLS_LOAD_MODULE_NOT_FOUND_ERROR,
208 _("TLS load module not found"));
b2756930
KB
209
210 addr = target_get_thread_local_address (ptid, lm_addr, offset);
93ad78a7
KB
211 }
212 /* If an error occurred, print TLS related messages here. Otherwise,
213 throw the error to some higher catcher. */
214 if (ex.reason < 0)
215 {
216 int objfile_is_library = (objfile->flags & OBJF_SHARED);
217
218 switch (ex.error)
219 {
220 case TLS_NO_LIBRARY_SUPPORT_ERROR:
221 error (_("Cannot find thread-local variables in this thread library."));
222 break;
223 case TLS_LOAD_MODULE_NOT_FOUND_ERROR:
224 if (objfile_is_library)
225 error (_("Cannot find shared library `%s' in dynamic"
226 " linker's load module list"), objfile->name);
227 else
228 error (_("Cannot find executable file `%s' in dynamic"
229 " linker's load module list"), objfile->name);
230 break;
231 case TLS_NOT_ALLOCATED_YET_ERROR:
232 if (objfile_is_library)
233 error (_("The inferior has not yet allocated storage for"
234 " thread-local variables in\n"
235 "the shared library `%s'\n"
236 "for %s"),
237 objfile->name, target_pid_to_str (ptid));
238 else
239 error (_("The inferior has not yet allocated storage for"
240 " thread-local variables in\n"
241 "the executable `%s'\n"
242 "for %s"),
243 objfile->name, target_pid_to_str (ptid));
244 break;
245 case TLS_GENERIC_ERROR:
246 if (objfile_is_library)
247 error (_("Cannot find thread-local storage for %s, "
248 "shared library %s:\n%s"),
249 target_pid_to_str (ptid),
250 objfile->name, ex.message);
251 else
252 error (_("Cannot find thread-local storage for %s, "
253 "executable file %s:\n%s"),
254 target_pid_to_str (ptid),
255 objfile->name, ex.message);
256 break;
257 default:
258 throw_exception (ex);
259 break;
260 }
261 }
262 }
c3228f12
EZ
263 /* It wouldn't be wrong here to try a gdbarch method, too; finding
264 TLS is an ABI-specific thing. But we don't do that yet. */
4c2df51b 265 else
8a3fe4f8 266 error (_("Cannot find thread-local variables on this target"));
4c2df51b
DJ
267
268 return addr;
269}
270
271/* Evaluate a location description, starting at DATA and with length
272 SIZE, to find the current location of variable VAR in the context
273 of FRAME. */
274static struct value *
275dwarf2_evaluate_loc_desc (struct symbol *var, struct frame_info *frame,
276 unsigned char *data, unsigned short size,
277 struct objfile *objfile)
278{
87808bd6 279 struct gdbarch *arch = get_frame_arch (frame);
4c2df51b
DJ
280 struct value *retval;
281 struct dwarf_expr_baton baton;
282 struct dwarf_expr_context *ctx;
283
0d53c4c4
DJ
284 if (size == 0)
285 {
286 retval = allocate_value (SYMBOL_TYPE (var));
287 VALUE_LVAL (retval) = not_lval;
feb13ab0 288 set_value_optimized_out (retval, 1);
0d53c4c4
DJ
289 }
290
4c2df51b
DJ
291 baton.frame = frame;
292 baton.objfile = objfile;
293
294 ctx = new_dwarf_expr_context ();
295 ctx->baton = &baton;
296 ctx->read_reg = dwarf_expr_read_reg;
297 ctx->read_mem = dwarf_expr_read_mem;
298 ctx->get_frame_base = dwarf_expr_frame_base;
299 ctx->get_tls_address = dwarf_expr_tls_address;
300
301 dwarf_expr_eval (ctx, data, size);
87808bd6
JB
302 if (ctx->num_pieces > 0)
303 {
304 /* We haven't implemented splicing together pieces from
305 arbitrary sources yet. */
8a3fe4f8
AC
306 error (_("The value of variable '%s' is distributed across several\n"
307 "locations, and GDB cannot access its value.\n"),
87808bd6
JB
308 SYMBOL_NATURAL_NAME (var));
309 }
310 else if (ctx->in_reg)
051caad9 311 {
5ca2e327
JB
312 CORE_ADDR dwarf_regnum = dwarf_expr_fetch (ctx, 0);
313 int gdb_regnum = DWARF2_REG_TO_REGNUM (dwarf_regnum);
314 retval = value_from_register (SYMBOL_TYPE (var), gdb_regnum, frame);
051caad9 315 }
4c2df51b
DJ
316 else
317 {
5ca2e327
JB
318 CORE_ADDR address = dwarf_expr_fetch (ctx, 0);
319
61fbb938 320 retval = allocate_value (SYMBOL_TYPE (var));
4c2df51b 321 VALUE_LVAL (retval) = lval_memory;
dfa52d88 322 set_value_lazy (retval, 1);
5ca2e327 323 VALUE_ADDRESS (retval) = address;
4c2df51b
DJ
324 }
325
326 free_dwarf_expr_context (ctx);
327
328 return retval;
329}
330
331
332
333
334\f
335/* Helper functions and baton for dwarf2_loc_desc_needs_frame. */
336
337struct needs_frame_baton
338{
339 int needs_frame;
340};
341
342/* Reads from registers do require a frame. */
343static CORE_ADDR
61fbb938 344needs_frame_read_reg (void *baton, int regnum)
4c2df51b
DJ
345{
346 struct needs_frame_baton *nf_baton = baton;
347 nf_baton->needs_frame = 1;
348 return 1;
349}
350
351/* Reads from memory do not require a frame. */
352static void
353needs_frame_read_mem (void *baton, char *buf, CORE_ADDR addr, size_t len)
354{
355 memset (buf, 0, len);
356}
357
358/* Frame-relative accesses do require a frame. */
359static void
360needs_frame_frame_base (void *baton, unsigned char **start, size_t * length)
361{
362 static char lit0 = DW_OP_lit0;
363 struct needs_frame_baton *nf_baton = baton;
364
365 *start = &lit0;
366 *length = 1;
367
368 nf_baton->needs_frame = 1;
369}
370
371/* Thread-local accesses do require a frame. */
372static CORE_ADDR
373needs_frame_tls_address (void *baton, CORE_ADDR offset)
374{
375 struct needs_frame_baton *nf_baton = baton;
376 nf_baton->needs_frame = 1;
377 return 1;
378}
379
380/* Return non-zero iff the location expression at DATA (length SIZE)
381 requires a frame to evaluate. */
382
383static int
384dwarf2_loc_desc_needs_frame (unsigned char *data, unsigned short size)
385{
386 struct needs_frame_baton baton;
387 struct dwarf_expr_context *ctx;
f630a401 388 int in_reg;
4c2df51b
DJ
389
390 baton.needs_frame = 0;
391
392 ctx = new_dwarf_expr_context ();
393 ctx->baton = &baton;
394 ctx->read_reg = needs_frame_read_reg;
395 ctx->read_mem = needs_frame_read_mem;
396 ctx->get_frame_base = needs_frame_frame_base;
397 ctx->get_tls_address = needs_frame_tls_address;
398
399 dwarf_expr_eval (ctx, data, size);
400
f630a401
DJ
401 in_reg = ctx->in_reg;
402
87808bd6
JB
403 if (ctx->num_pieces > 0)
404 {
405 int i;
406
407 /* If the location has several pieces, and any of them are in
408 registers, then we will need a frame to fetch them from. */
409 for (i = 0; i < ctx->num_pieces; i++)
410 if (ctx->pieces[i].in_reg)
411 in_reg = 1;
412 }
413
4c2df51b
DJ
414 free_dwarf_expr_context (ctx);
415
f630a401 416 return baton.needs_frame || in_reg;
4c2df51b
DJ
417}
418
0d53c4c4
DJ
419static void
420dwarf2_tracepoint_var_ref (struct symbol * symbol, struct agent_expr * ax,
421 struct axs_value * value, unsigned char *data,
422 int size)
423{
424 if (size == 0)
8a3fe4f8 425 error (_("Symbol \"%s\" has been optimized out."),
0d53c4c4
DJ
426 SYMBOL_PRINT_NAME (symbol));
427
428 if (size == 1
429 && data[0] >= DW_OP_reg0
430 && data[0] <= DW_OP_reg31)
431 {
432 value->kind = axs_lvalue_register;
433 value->u.reg = data[0] - DW_OP_reg0;
434 }
435 else if (data[0] == DW_OP_regx)
436 {
437 ULONGEST reg;
438 read_uleb128 (data + 1, data + size, &reg);
439 value->kind = axs_lvalue_register;
440 value->u.reg = reg;
441 }
442 else if (data[0] == DW_OP_fbreg)
443 {
444 /* And this is worse than just minimal; we should honor the frame base
445 as above. */
446 int frame_reg;
447 LONGEST frame_offset;
448 unsigned char *buf_end;
449
450 buf_end = read_sleb128 (data + 1, data + size, &frame_offset);
451 if (buf_end != data + size)
8a3fe4f8 452 error (_("Unexpected opcode after DW_OP_fbreg for symbol \"%s\"."),
0d53c4c4 453 SYMBOL_PRINT_NAME (symbol));
4c2df51b 454
0d53c4c4
DJ
455 TARGET_VIRTUAL_FRAME_POINTER (ax->scope, &frame_reg, &frame_offset);
456 ax_reg (ax, frame_reg);
457 ax_const_l (ax, frame_offset);
458 ax_simple (ax, aop_add);
4c2df51b 459
0d53c4c4
DJ
460 ax_const_l (ax, frame_offset);
461 ax_simple (ax, aop_add);
462 value->kind = axs_lvalue_memory;
463 }
464 else
8a3fe4f8 465 error (_("Unsupported DWARF opcode in the location of \"%s\"."),
0d53c4c4
DJ
466 SYMBOL_PRINT_NAME (symbol));
467}
4c2df51b
DJ
468\f
469/* Return the value of SYMBOL in FRAME using the DWARF-2 expression
470 evaluator to calculate the location. */
471static struct value *
472locexpr_read_variable (struct symbol *symbol, struct frame_info *frame)
473{
474 struct dwarf2_locexpr_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
475 struct value *val;
476 val = dwarf2_evaluate_loc_desc (symbol, frame, dlbaton->data, dlbaton->size,
477 dlbaton->objfile);
478
479 return val;
480}
481
482/* Return non-zero iff we need a frame to evaluate SYMBOL. */
483static int
484locexpr_read_needs_frame (struct symbol *symbol)
485{
486 struct dwarf2_locexpr_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
487 return dwarf2_loc_desc_needs_frame (dlbaton->data, dlbaton->size);
488}
489
490/* Print a natural-language description of SYMBOL to STREAM. */
491static int
492locexpr_describe_location (struct symbol *symbol, struct ui_file *stream)
493{
494 /* FIXME: be more extensive. */
495 struct dwarf2_locexpr_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
496
497 if (dlbaton->size == 1
498 && dlbaton->data[0] >= DW_OP_reg0
499 && dlbaton->data[0] <= DW_OP_reg31)
500 {
501 int regno = DWARF2_REG_TO_REGNUM (dlbaton->data[0] - DW_OP_reg0);
502 fprintf_filtered (stream,
503 "a variable in register %s", REGISTER_NAME (regno));
504 return 1;
505 }
506
c3228f12
EZ
507 /* The location expression for a TLS variable looks like this (on a
508 64-bit LE machine):
509
510 DW_AT_location : 10 byte block: 3 4 0 0 0 0 0 0 0 e0
511 (DW_OP_addr: 4; DW_OP_GNU_push_tls_address)
512
513 0x3 is the encoding for DW_OP_addr, which has an operand as long
514 as the size of an address on the target machine (here is 8
515 bytes). 0xe0 is the encoding for DW_OP_GNU_push_tls_address.
516 The operand represents the offset at which the variable is within
517 the thread local storage. */
518
519 if (dlbaton->size > 1
520 && dlbaton->data[dlbaton->size - 1] == DW_OP_GNU_push_tls_address)
521 if (dlbaton->data[0] == DW_OP_addr)
522 {
523 int bytes_read;
524 CORE_ADDR offset = dwarf2_read_address (&dlbaton->data[1],
c193f044 525 &dlbaton->data[dlbaton->size - 1],
c3228f12
EZ
526 &bytes_read);
527 fprintf_filtered (stream,
32ffcbed 528 "a thread-local variable at offset %s in the "
c3228f12
EZ
529 "thread-local storage for `%s'",
530 paddr_nz (offset), dlbaton->objfile->name);
531 return 1;
532 }
533
534
4c2df51b
DJ
535 fprintf_filtered (stream,
536 "a variable with complex or multiple locations (DWARF2)");
537 return 1;
538}
539
a55cc764
DJ
540
541/* Describe the location of SYMBOL as an agent value in VALUE, generating
542 any necessary bytecode in AX.
543
544 NOTE drow/2003-02-26: This function is extremely minimal, because
545 doing it correctly is extremely complicated and there is no
546 publicly available stub with tracepoint support for me to test
547 against. When there is one this function should be revisited. */
548
0d53c4c4 549static void
a55cc764
DJ
550locexpr_tracepoint_var_ref (struct symbol * symbol, struct agent_expr * ax,
551 struct axs_value * value)
552{
553 struct dwarf2_locexpr_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
554
0d53c4c4 555 dwarf2_tracepoint_var_ref (symbol, ax, value, dlbaton->data, dlbaton->size);
a55cc764
DJ
556}
557
4c2df51b
DJ
558/* The set of location functions used with the DWARF-2 expression
559 evaluator. */
a67af2b9 560const struct symbol_ops dwarf2_locexpr_funcs = {
4c2df51b
DJ
561 locexpr_read_variable,
562 locexpr_read_needs_frame,
563 locexpr_describe_location,
a55cc764 564 locexpr_tracepoint_var_ref
4c2df51b 565};
0d53c4c4
DJ
566
567
568/* Wrapper functions for location lists. These generally find
569 the appropriate location expression and call something above. */
570
571/* Return the value of SYMBOL in FRAME using the DWARF-2 expression
572 evaluator to calculate the location. */
573static struct value *
574loclist_read_variable (struct symbol *symbol, struct frame_info *frame)
575{
576 struct dwarf2_loclist_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
577 struct value *val;
578 unsigned char *data;
b6b08ebf 579 size_t size;
0d53c4c4
DJ
580
581 data = find_location_expression (dlbaton, &size,
582 frame ? get_frame_pc (frame) : 0);
583 if (data == NULL)
806048c6
DJ
584 {
585 val = allocate_value (SYMBOL_TYPE (symbol));
586 VALUE_LVAL (val) = not_lval;
587 set_value_optimized_out (val, 1);
588 }
589 else
590 val = dwarf2_evaluate_loc_desc (symbol, frame, data, size,
591 dlbaton->objfile);
0d53c4c4
DJ
592
593 return val;
594}
595
596/* Return non-zero iff we need a frame to evaluate SYMBOL. */
597static int
598loclist_read_needs_frame (struct symbol *symbol)
599{
600 /* If there's a location list, then assume we need to have a frame
601 to choose the appropriate location expression. With tracking of
602 global variables this is not necessarily true, but such tracking
603 is disabled in GCC at the moment until we figure out how to
604 represent it. */
605
606 return 1;
607}
608
609/* Print a natural-language description of SYMBOL to STREAM. */
610static int
611loclist_describe_location (struct symbol *symbol, struct ui_file *stream)
612{
613 /* FIXME: Could print the entire list of locations. */
614 fprintf_filtered (stream, "a variable with multiple locations");
615 return 1;
616}
617
618/* Describe the location of SYMBOL as an agent value in VALUE, generating
619 any necessary bytecode in AX. */
620static void
621loclist_tracepoint_var_ref (struct symbol * symbol, struct agent_expr * ax,
622 struct axs_value * value)
623{
624 struct dwarf2_loclist_baton *dlbaton = SYMBOL_LOCATION_BATON (symbol);
625 unsigned char *data;
b6b08ebf 626 size_t size;
0d53c4c4
DJ
627
628 data = find_location_expression (dlbaton, &size, ax->scope);
629 if (data == NULL)
8a3fe4f8 630 error (_("Variable \"%s\" is not available."), SYMBOL_NATURAL_NAME (symbol));
0d53c4c4
DJ
631
632 dwarf2_tracepoint_var_ref (symbol, ax, value, data, size);
633}
634
635/* The set of location functions used with the DWARF-2 expression
636 evaluator and location lists. */
a67af2b9 637const struct symbol_ops dwarf2_loclist_funcs = {
0d53c4c4
DJ
638 loclist_read_variable,
639 loclist_read_needs_frame,
640 loclist_describe_location,
641 loclist_tracepoint_var_ref
642};
This page took 0.240392 seconds and 4 git commands to generate.