2003-04-13 Daniel Jacobowitz <drow@mvista.com>
[external/binutils.git] / gdb / dwarf2expr.c
1 /* Dwarf2 Expression Evaluator
2    Copyright 2001, 2002, 2003 Free Software Foundation, Inc.
3    Contributed by Daniel Berlin (dan@dberlin.org)
4
5    This file is part of GDB.
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 59 Temple Place - Suite 330,
20    Boston, MA 02111-1307, USA.  */
21
22 #include "defs.h"
23 #include "symtab.h"
24 #include "gdbtypes.h"
25 #include "value.h"
26 #include "gdbcore.h"
27 #include "elf/dwarf2.h"
28 #include "dwarf2expr.h"
29
30 /* Local prototypes.  */
31
32 static void execute_stack_op (struct dwarf_expr_context *,
33                               unsigned char *, unsigned char *);
34
35 /* Create a new context for the expression evaluator.  */
36
37 struct dwarf_expr_context *
38 new_dwarf_expr_context (void)
39 {
40   struct dwarf_expr_context *retval;
41   retval = xcalloc (1, sizeof (struct dwarf_expr_context));
42   retval->stack_len = 10;
43   retval->stack = xmalloc (10 * sizeof (CORE_ADDR));
44   return retval;
45 }
46
47 /* Release the memory allocated to CTX.  */
48
49 void
50 free_dwarf_expr_context (struct dwarf_expr_context *ctx)
51 {
52   xfree (ctx->stack);
53   xfree (ctx);
54 }
55
56 /* Expand the memory allocated to CTX's stack to contain at least
57    NEED more elements than are currently used.  */
58
59 static void
60 dwarf_expr_grow_stack (struct dwarf_expr_context *ctx, size_t need)
61 {
62   if (ctx->stack_len + need > ctx->stack_allocated)
63     {
64       size_t templen = ctx->stack_len * 2;
65       while (templen < (ctx->stack_len + need))
66            templen *= 2;
67       ctx->stack = xrealloc (ctx->stack,
68                              templen * sizeof (CORE_ADDR));
69       ctx->stack_allocated = templen;
70     }
71 }
72
73 /* Push VALUE onto CTX's stack.  */
74
75 void
76 dwarf_expr_push (struct dwarf_expr_context *ctx, CORE_ADDR value)
77 {
78   dwarf_expr_grow_stack (ctx, 1);
79   ctx->stack[ctx->stack_len++] = value;
80 }
81
82 /* Pop the top item off of CTX's stack.  */
83
84 void
85 dwarf_expr_pop (struct dwarf_expr_context *ctx)
86 {
87   if (ctx->stack_len <= 0)
88     error ("dwarf expression stack underflow");
89   ctx->stack_len--;
90 }
91
92 /* Retrieve the N'th item on CTX's stack.  */
93
94 CORE_ADDR
95 dwarf_expr_fetch (struct dwarf_expr_context *ctx, int n)
96 {
97   if (ctx->stack_len < n)
98      error ("Asked for position %d of stack, stack only has %d elements on it\n",
99             n, ctx->stack_len);
100   return ctx->stack[ctx->stack_len - (1 + n)];
101
102 }
103
104 /* Evaluate the expression at ADDR (LEN bytes long) using the context
105    CTX.  */
106
107 void
108 dwarf_expr_eval (struct dwarf_expr_context *ctx, unsigned char *addr,
109                  size_t len)
110 {
111   execute_stack_op (ctx, addr, addr + len);
112 }
113
114 /* Decode the unsigned LEB128 constant at BUF into the variable pointed to
115    by R, and return the new value of BUF.  Verify that it doesn't extend
116    past BUF_END.  */
117
118 unsigned char *
119 read_uleb128 (unsigned char *buf, unsigned char *buf_end, ULONGEST * r)
120 {
121   unsigned shift = 0;
122   ULONGEST result = 0;
123   unsigned char byte;
124
125   while (1)
126     {
127       if (buf >= buf_end)
128         error ("read_uleb128: Corrupted DWARF expression.");
129
130       byte = *buf++;
131       result |= (byte & 0x7f) << shift;
132       if ((byte & 0x80) == 0)
133         break;
134       shift += 7;
135     }
136   *r = result;
137   return buf;
138 }
139
140 /* Decode the signed LEB128 constant at BUF into the variable pointed to
141    by R, and return the new value of BUF.  Verify that it doesn't extend
142    past BUF_END.  */
143
144 unsigned char *
145 read_sleb128 (unsigned char *buf, unsigned char *buf_end, LONGEST * r)
146 {
147   unsigned shift = 0;
148   LONGEST result = 0;
149   unsigned char byte;
150
151   while (1)
152     {
153       if (buf >= buf_end)
154         error ("read_sleb128: Corrupted DWARF expression.");
155
156       byte = *buf++;
157       result |= (byte & 0x7f) << shift;
158       shift += 7;
159       if ((byte & 0x80) == 0)
160         break;
161     }
162   if (shift < (sizeof (*r) * 8) && (byte & 0x40) != 0)
163     result |= -(1 << shift);
164
165   *r = result;
166   return buf;
167 }
168
169 /* Read an address from BUF, and verify that it doesn't extend past
170    BUF_END.  The address is returned, and *BYTES_READ is set to the
171    number of bytes read from BUF.  */
172
173 CORE_ADDR
174 dwarf2_read_address (unsigned char *buf, unsigned char *buf_end, int *bytes_read)
175 {
176   CORE_ADDR result;
177
178   if (buf_end - buf < TARGET_ADDR_BIT / TARGET_CHAR_BIT)
179     error ("dwarf2_read_address: Corrupted DWARF expression.");
180
181   *bytes_read = TARGET_ADDR_BIT / TARGET_CHAR_BIT;
182   result = extract_address (buf, TARGET_ADDR_BIT / TARGET_CHAR_BIT);
183   return result;
184 }
185
186 /* Return the type of an address, for unsigned arithmetic.  */
187
188 static struct type *
189 unsigned_address_type (void)
190 {
191   switch (TARGET_ADDR_BIT / TARGET_CHAR_BIT)
192     {
193     case 2:
194       return builtin_type_uint16;
195     case 4:
196       return builtin_type_uint32;
197     case 8:
198       return builtin_type_uint64;
199     default:
200       internal_error (__FILE__, __LINE__,
201                       "Unsupported address size.\n");
202     }
203 }
204
205 /* Return the type of an address, for signed arithmetic.  */
206
207 static struct type *
208 signed_address_type (void)
209 {
210   switch (TARGET_ADDR_BIT / TARGET_CHAR_BIT)
211     {
212     case 2:
213       return builtin_type_int16;
214     case 4:
215       return builtin_type_int32;
216     case 8:
217       return builtin_type_int64;
218     default:
219       internal_error (__FILE__, __LINE__,
220                       "Unsupported address size.\n");
221     }
222 }
223 \f
224 /* The engine for the expression evaluator.  Using the context in CTX,
225    evaluate the expression between OP_PTR and OP_END.  */
226
227 static void
228 execute_stack_op (struct dwarf_expr_context *ctx, unsigned char *op_ptr,
229                   unsigned char *op_end)
230 {
231   while (op_ptr < op_end)
232     {
233       enum dwarf_location_atom op = *op_ptr++;
234       CORE_ADDR result, memaddr;
235       ULONGEST uoffset, reg;
236       LONGEST offset;
237       int bytes_read;
238       enum lval_type expr_lval;
239
240       ctx->in_reg = 0;
241
242       switch (op)
243         {
244         case DW_OP_lit0:
245         case DW_OP_lit1:
246         case DW_OP_lit2:
247         case DW_OP_lit3:
248         case DW_OP_lit4:
249         case DW_OP_lit5:
250         case DW_OP_lit6:
251         case DW_OP_lit7:
252         case DW_OP_lit8:
253         case DW_OP_lit9:
254         case DW_OP_lit10:
255         case DW_OP_lit11:
256         case DW_OP_lit12:
257         case DW_OP_lit13:
258         case DW_OP_lit14:
259         case DW_OP_lit15:
260         case DW_OP_lit16:
261         case DW_OP_lit17:
262         case DW_OP_lit18:
263         case DW_OP_lit19:
264         case DW_OP_lit20:
265         case DW_OP_lit21:
266         case DW_OP_lit22:
267         case DW_OP_lit23:
268         case DW_OP_lit24:
269         case DW_OP_lit25:
270         case DW_OP_lit26:
271         case DW_OP_lit27:
272         case DW_OP_lit28:
273         case DW_OP_lit29:
274         case DW_OP_lit30:
275         case DW_OP_lit31:
276           result = op - DW_OP_lit0;
277           break;
278
279         case DW_OP_addr:
280           result = dwarf2_read_address (op_ptr, op_end, &bytes_read);
281           op_ptr += bytes_read;
282           break;
283
284         case DW_OP_const1u:
285           result = extract_unsigned_integer (op_ptr, 1);
286           op_ptr += 1;
287           break;
288         case DW_OP_const1s:
289           result = extract_signed_integer (op_ptr, 1);
290           op_ptr += 1;
291           break;
292         case DW_OP_const2u:
293           result = extract_unsigned_integer (op_ptr, 2);
294           op_ptr += 2;
295           break;
296         case DW_OP_const2s:
297           result = extract_signed_integer (op_ptr, 2);
298           op_ptr += 2;
299           break;
300         case DW_OP_const4u:
301           result = extract_unsigned_integer (op_ptr, 4);
302           op_ptr += 4;
303           break;
304         case DW_OP_const4s:
305           result = extract_signed_integer (op_ptr, 4);
306           op_ptr += 4;
307           break;
308         case DW_OP_const8u:
309           result = extract_unsigned_integer (op_ptr, 8);
310           op_ptr += 8;
311           break;
312         case DW_OP_const8s:
313           result = extract_signed_integer (op_ptr, 8);
314           op_ptr += 8;
315           break;
316         case DW_OP_constu:
317           op_ptr = read_uleb128 (op_ptr, op_end, &uoffset);
318           result = uoffset;
319           break;
320         case DW_OP_consts:
321           op_ptr = read_sleb128 (op_ptr, op_end, &offset);
322           result = offset;
323           break;
324
325         /* The DW_OP_reg operations are required to occur alone in
326            location expressions.  */
327         case DW_OP_reg0:
328         case DW_OP_reg1:
329         case DW_OP_reg2:
330         case DW_OP_reg3:
331         case DW_OP_reg4:
332         case DW_OP_reg5:
333         case DW_OP_reg6:
334         case DW_OP_reg7:
335         case DW_OP_reg8:
336         case DW_OP_reg9:
337         case DW_OP_reg10:
338         case DW_OP_reg11:
339         case DW_OP_reg12:
340         case DW_OP_reg13:
341         case DW_OP_reg14:
342         case DW_OP_reg15:
343         case DW_OP_reg16:
344         case DW_OP_reg17:
345         case DW_OP_reg18:
346         case DW_OP_reg19:
347         case DW_OP_reg20:
348         case DW_OP_reg21:
349         case DW_OP_reg22:
350         case DW_OP_reg23:
351         case DW_OP_reg24:
352         case DW_OP_reg25:
353         case DW_OP_reg26:
354         case DW_OP_reg27:
355         case DW_OP_reg28:
356         case DW_OP_reg29:
357         case DW_OP_reg30:
358         case DW_OP_reg31:
359           /* NOTE: in the presence of DW_OP_piece this check is incorrect.  */
360           if (op_ptr != op_end)
361             error ("DWARF-2 expression error: DW_OP_reg operations must be "
362                    "used alone.");
363
364           /* FIXME drow/2003-02-21: This call to read_reg could be pushed
365              into the evaluator's caller by changing the semantics for in_reg.
366              Then we wouldn't need to return an lval_type and a memaddr.  */
367           result = (ctx->read_reg) (ctx->baton, op - DW_OP_reg0, &expr_lval,
368                                     &memaddr);
369
370           if (expr_lval == lval_register)
371             {
372               ctx->regnum = op - DW_OP_reg0;
373               ctx->in_reg = 1;
374             }
375           else
376             result = memaddr;
377
378           break;
379
380         case DW_OP_regx:
381           op_ptr = read_uleb128 (op_ptr, op_end, &reg);
382           if (op_ptr != op_end)
383             error ("DWARF-2 expression error: DW_OP_reg operations must be "
384                    "used alone.");
385
386           result = (ctx->read_reg) (ctx->baton, reg, &expr_lval, &memaddr);
387
388           if (expr_lval == lval_register)
389             {
390               ctx->regnum = reg;
391               ctx->in_reg = 1;
392             }
393           else
394             result = memaddr;
395
396           break;
397
398         case DW_OP_breg0:
399         case DW_OP_breg1:
400         case DW_OP_breg2:
401         case DW_OP_breg3:
402         case DW_OP_breg4:
403         case DW_OP_breg5:
404         case DW_OP_breg6:
405         case DW_OP_breg7:
406         case DW_OP_breg8:
407         case DW_OP_breg9:
408         case DW_OP_breg10:
409         case DW_OP_breg11:
410         case DW_OP_breg12:
411         case DW_OP_breg13:
412         case DW_OP_breg14:
413         case DW_OP_breg15:
414         case DW_OP_breg16:
415         case DW_OP_breg17:
416         case DW_OP_breg18:
417         case DW_OP_breg19:
418         case DW_OP_breg20:
419         case DW_OP_breg21:
420         case DW_OP_breg22:
421         case DW_OP_breg23:
422         case DW_OP_breg24:
423         case DW_OP_breg25:
424         case DW_OP_breg26:
425         case DW_OP_breg27:
426         case DW_OP_breg28:
427         case DW_OP_breg29:
428         case DW_OP_breg30:
429         case DW_OP_breg31:
430           {
431             op_ptr = read_sleb128 (op_ptr, op_end, &offset);
432             result = (ctx->read_reg) (ctx->baton, op - DW_OP_breg0,
433                                       &expr_lval, &memaddr);
434             result += offset;
435           }
436           break;
437         case DW_OP_bregx:
438           {
439             op_ptr = read_uleb128 (op_ptr, op_end, &reg);
440             op_ptr = read_sleb128 (op_ptr, op_end, &offset);
441             result = (ctx->read_reg) (ctx->baton, reg, &expr_lval, &memaddr);
442             result += offset;
443           }
444           break;
445         case DW_OP_fbreg:
446           {
447             unsigned char *datastart;
448             size_t datalen;
449             unsigned int before_stack_len;
450
451             op_ptr = read_sleb128 (op_ptr, op_end, &offset);
452             /* Rather than create a whole new context, we simply
453                record the stack length before execution, then reset it
454                afterwards, effectively erasing whatever the recursive
455                call put there.  */
456             before_stack_len = ctx->stack_len;
457             /* FIXME: cagney/2003-03-26: This code should be using
458                get_frame_base_address(), and then implement a dwarf2
459                specific this_base method.  */
460             (ctx->get_frame_base) (ctx->baton, &datastart, &datalen);
461             dwarf_expr_eval (ctx, datastart, datalen);
462             result = dwarf_expr_fetch (ctx, 0);
463             if (! ctx->in_reg)
464               {
465                 char *buf = alloca (TARGET_ADDR_BIT / TARGET_CHAR_BIT);
466                 int bytes_read;
467
468                 (ctx->read_mem) (ctx->baton, buf, result,
469                                  TARGET_ADDR_BIT / TARGET_CHAR_BIT);
470                 result = dwarf2_read_address (buf,
471                                               buf + (TARGET_ADDR_BIT
472                                                      / TARGET_CHAR_BIT),
473                                               &bytes_read);
474               }
475             result = result + offset;
476             ctx->stack_len = before_stack_len;
477             ctx->in_reg = 0;
478           }
479           break;
480         case DW_OP_dup:
481           result = dwarf_expr_fetch (ctx, 0);
482           break;
483
484         case DW_OP_drop:
485           dwarf_expr_pop (ctx);
486           goto no_push;
487
488         case DW_OP_pick:
489           offset = *op_ptr++;
490           result = dwarf_expr_fetch (ctx, offset);
491           break;
492
493         case DW_OP_over:
494           result = dwarf_expr_fetch (ctx, 1);
495           break;
496
497         case DW_OP_rot:
498           {
499             CORE_ADDR t1, t2, t3;
500
501             if (ctx->stack_len < 3)
502                error ("Not enough elements for DW_OP_rot. Need 3, have %d\n",
503                       ctx->stack_len);
504             t1 = ctx->stack[ctx->stack_len - 1];
505             t2 = ctx->stack[ctx->stack_len - 2];
506             t3 = ctx->stack[ctx->stack_len - 3];
507             ctx->stack[ctx->stack_len - 1] = t2;
508             ctx->stack[ctx->stack_len - 2] = t3;
509             ctx->stack[ctx->stack_len - 3] = t1;
510             goto no_push;
511           }
512
513         case DW_OP_deref:
514         case DW_OP_deref_size:
515         case DW_OP_abs:
516         case DW_OP_neg:
517         case DW_OP_not:
518         case DW_OP_plus_uconst:
519           /* Unary operations.  */
520           result = dwarf_expr_fetch (ctx, 0);
521           dwarf_expr_pop (ctx);
522
523           switch (op)
524             {
525             case DW_OP_deref:
526               {
527                 char *buf = alloca (TARGET_ADDR_BIT / TARGET_CHAR_BIT);
528                 int bytes_read;
529
530                 (ctx->read_mem) (ctx->baton, buf, result,
531                                  TARGET_ADDR_BIT / TARGET_CHAR_BIT);
532                 result = dwarf2_read_address (buf,
533                                               buf + (TARGET_ADDR_BIT
534                                                      / TARGET_CHAR_BIT),
535                                               &bytes_read);
536               }
537               break;
538
539             case DW_OP_deref_size:
540               {
541                 char *buf = alloca (TARGET_ADDR_BIT / TARGET_CHAR_BIT);
542                 int bytes_read;
543
544                 (ctx->read_mem) (ctx->baton, buf, result, *op_ptr++);
545                 result = dwarf2_read_address (buf,
546                                               buf + (TARGET_ADDR_BIT
547                                                      / TARGET_CHAR_BIT),
548                                               &bytes_read);
549               }
550               break;
551
552             case DW_OP_abs:
553               if ((signed int) result < 0)
554                 result = -result;
555               break;
556             case DW_OP_neg:
557               result = -result;
558               break;
559             case DW_OP_not:
560               result = ~result;
561               break;
562             case DW_OP_plus_uconst:
563               op_ptr = read_uleb128 (op_ptr, op_end, &reg);
564               result += reg;
565               break;
566             }
567           break;
568
569         case DW_OP_and:
570         case DW_OP_div:
571         case DW_OP_minus:
572         case DW_OP_mod:
573         case DW_OP_mul:
574         case DW_OP_or:
575         case DW_OP_plus:
576         case DW_OP_shl:
577         case DW_OP_shr:
578         case DW_OP_shra:
579         case DW_OP_xor:
580         case DW_OP_le:
581         case DW_OP_ge:
582         case DW_OP_eq:
583         case DW_OP_lt:
584         case DW_OP_gt:
585         case DW_OP_ne:
586           {
587             /* Binary operations.  Use the value engine to do computations in
588                the right width.  */
589             CORE_ADDR first, second;
590             enum exp_opcode binop;
591             struct value *val1, *val2;
592
593             second = dwarf_expr_fetch (ctx, 0);
594             dwarf_expr_pop (ctx);
595
596             first = dwarf_expr_fetch (ctx, 1);
597             dwarf_expr_pop (ctx);
598
599             val1 = value_from_longest (unsigned_address_type (), first);
600             val2 = value_from_longest (unsigned_address_type (), second);
601
602             switch (op)
603               {
604               case DW_OP_and:
605                 binop = BINOP_BITWISE_AND;
606                 break;
607               case DW_OP_div:
608                 binop = BINOP_DIV;
609               case DW_OP_minus:
610                 binop = BINOP_SUB;
611                 break;
612               case DW_OP_mod:
613                 binop = BINOP_MOD;
614                 break;
615               case DW_OP_mul:
616                 binop = BINOP_MUL;
617                 break;
618               case DW_OP_or:
619                 binop = BINOP_BITWISE_IOR;
620                 break;
621               case DW_OP_plus:
622                 binop = BINOP_ADD;
623                 break;
624               case DW_OP_shl:
625                 binop = BINOP_LSH;
626                 break;
627               case DW_OP_shr:
628                 binop = BINOP_RSH;
629               case DW_OP_shra:
630                 binop = BINOP_RSH;
631                 val1 = value_from_longest (signed_address_type (), first);
632                 break;
633               case DW_OP_xor:
634                 binop = BINOP_BITWISE_XOR;
635                 break;
636               case DW_OP_le:
637                 binop = BINOP_LEQ;
638                 break;
639               case DW_OP_ge:
640                 binop = BINOP_GEQ;
641                 break;
642               case DW_OP_eq:
643                 binop = BINOP_EQUAL;
644                 break;
645               case DW_OP_lt:
646                 binop = BINOP_LESS;
647                 break;
648               case DW_OP_gt:
649                 binop = BINOP_GTR;
650                 break;
651               case DW_OP_ne:
652                 binop = BINOP_NOTEQUAL;
653                 break;
654               default:
655                 internal_error (__FILE__, __LINE__,
656                                 "Can't be reached.");
657               }
658             result = value_as_long (value_binop (val1, val2, binop));
659           }
660           break;
661
662         case DW_OP_GNU_push_tls_address:
663           result = dwarf_expr_fetch (ctx, 0);
664           dwarf_expr_pop (ctx);
665           result = (ctx->get_tls_address) (ctx->baton, result);
666           break;
667
668         case DW_OP_skip:
669           offset = extract_signed_integer (op_ptr, 2);
670           op_ptr += 2;
671           op_ptr += offset;
672           goto no_push;
673
674         case DW_OP_bra:
675           offset = extract_signed_integer (op_ptr, 2);
676           op_ptr += 2;
677           if (dwarf_expr_fetch (ctx, 0) != 0)
678             op_ptr += offset;
679           dwarf_expr_pop (ctx);
680           goto no_push;
681
682         case DW_OP_nop:
683           goto no_push;
684
685         default:
686           error ("Unhandled dwarf expression opcode");
687         }
688
689       /* Most things push a result value.  */
690       dwarf_expr_push (ctx, result);
691     no_push:;
692     }
693 }