1b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm/* libunwind - a platform-independent unwind library
2d9e100753f5694ebb14769048373e8171f336127hp.com!davidm   Copyright (c) 2003, 2005 Hewlett-Packard Development Company, L.P.
3b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
4b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
5b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidmThis file is part of libunwind.
6b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
7b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidmPermission is hereby granted, free of charge, to any person obtaining
8b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidma copy of this software and associated documentation files (the
9b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm"Software"), to deal in the Software without restriction, including
10b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidmwithout limitation the rights to use, copy, modify, merge, publish,
11b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidmdistribute, sublicense, and/or sell copies of the Software, and to
12b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidmpermit persons to whom the Software is furnished to do so, subject to
13b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidmthe following conditions:
14b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
15b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidmThe above copyright notice and this permission notice shall be
16b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidmincluded in all copies or substantial portions of the Software.
17b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
18b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidmTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidmEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidmMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidmNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
22b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidmLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidmOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidmWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
25b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
26b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm#include "dwarf_i.h"
27d9e100753f5694ebb14769048373e8171f336127hp.com!davidm#include "libunwind_i.h"
28b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
29b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm/* The "pick" operator provides an index range of 0..255 indicating
30b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm   that the stack could at least have a depth of up to 256 elements,
31b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm   but the GCC unwinder restricts the depth to 64, which seems
32b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm   reasonable so we use the same value here.  */
33b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm#define MAX_EXPR_STACK_SIZE	64
34b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
35b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm#define NUM_OPERANDS(signature)	(((signature) >> 6) & 0x3)
36b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm#define OPND1_TYPE(signature)	(((signature) >> 3) & 0x7)
37b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm#define OPND2_TYPE(signature)	(((signature) >> 0) & 0x7)
38b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
39b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm#define OPND_SIGNATURE(n, t1, t2) (((n) << 6) | ((t1) << 3) | ((t2) << 0))
40b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm#define OPND1(t1)		OPND_SIGNATURE(1, t1, 0)
41b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm#define OPND2(t1, t2)		OPND_SIGNATURE(2, t1, t2)
42b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
43b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm#define VAL8	0x0
44b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm#define VAL16	0x1
45b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm#define VAL32	0x2
46b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm#define VAL64	0x3
47b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm#define ULEB128	0x4
48b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm#define SLEB128	0x5
49b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm#define OFFSET	0x6	/* 32-bit offset for 32-bit DWARF, 64-bit otherwise */
503842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#define ADDR	0x7	/* Machine address.  */
51b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
52088ac537752a09246da443bff1f893773d4b84d2Tommi Rantalastatic const uint8_t operands[256] =
53b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm  {
543842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    [DW_OP_addr] =		OPND1 (ADDR),
55b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_const1u] =		OPND1 (VAL8),
56b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_const1s] =		OPND1 (VAL8),
57b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_const2u] =		OPND1 (VAL16),
58b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_const2s] =		OPND1 (VAL16),
59b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_const4u] =		OPND1 (VAL32),
60b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_const4s] =		OPND1 (VAL32),
61b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_const8u] =		OPND1 (VAL64),
62b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_const8s] =		OPND1 (VAL64),
63b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_pick] =		OPND1 (VAL8),
64b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_plus_uconst] =	OPND1 (ULEB128),
65b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_skip] =		OPND1 (VAL16),
66b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_bra] =		OPND1 (VAL16),
67b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_breg0 +  0] =	OPND1 (SLEB128),
68b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_breg0 +  1] =	OPND1 (SLEB128),
69b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_breg0 +  2] =	OPND1 (SLEB128),
70b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_breg0 +  3] =	OPND1 (SLEB128),
71b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_breg0 +  4] =	OPND1 (SLEB128),
72b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_breg0 +  5] =	OPND1 (SLEB128),
73b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_breg0 +  6] =	OPND1 (SLEB128),
74b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_breg0 +  7] =	OPND1 (SLEB128),
75b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_breg0 +  8] =	OPND1 (SLEB128),
76b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_breg0 +  9] =	OPND1 (SLEB128),
77b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_breg0 + 10] =	OPND1 (SLEB128),
78b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_breg0 + 11] =	OPND1 (SLEB128),
79b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_breg0 + 12] =	OPND1 (SLEB128),
80b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_breg0 + 13] =	OPND1 (SLEB128),
81b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_breg0 + 14] =	OPND1 (SLEB128),
82b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_breg0 + 15] =	OPND1 (SLEB128),
83b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_breg0 + 16] =	OPND1 (SLEB128),
84b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_breg0 + 17] =	OPND1 (SLEB128),
85b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_breg0 + 18] =	OPND1 (SLEB128),
86b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_breg0 + 19] =	OPND1 (SLEB128),
87b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_breg0 + 20] =	OPND1 (SLEB128),
88b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_breg0 + 21] =	OPND1 (SLEB128),
89b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_breg0 + 22] =	OPND1 (SLEB128),
90b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_breg0 + 23] =	OPND1 (SLEB128),
91b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_breg0 + 24] =	OPND1 (SLEB128),
92b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_breg0 + 25] =	OPND1 (SLEB128),
93b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_breg0 + 26] =	OPND1 (SLEB128),
94b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_breg0 + 27] =	OPND1 (SLEB128),
95b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_breg0 + 28] =	OPND1 (SLEB128),
96b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_breg0 + 29] =	OPND1 (SLEB128),
97b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_breg0 + 30] =	OPND1 (SLEB128),
98b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_breg0 + 31] =	OPND1 (SLEB128),
99b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_regx] =		OPND1 (ULEB128),
100b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_fbreg] =		OPND1 (SLEB128),
101b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_bregx] =		OPND2 (ULEB128, SLEB128),
102b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_piece] =		OPND1 (ULEB128),
103b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_deref_size] =	OPND1 (VAL8),
104b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_xderef_size] =	OPND1 (VAL8),
105b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_call2] =		OPND1 (VAL16),
106b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_call4] =		OPND1 (VAL32),
107b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    [DW_OP_call_ref] =		OPND1 (OFFSET)
108b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm  };
109b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
1103842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzstatic inline unw_sword_t
1113842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzsword (unw_addr_space_t as, unw_word_t val)
1123842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz{
1133842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  switch (dwarf_addr_size (as))
1143842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    {
1153842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    case 1: return (int8_t) val;
1163842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    case 2: return (int16_t) val;
1173842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    case 4: return (int32_t) val;
1183842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    case 8: return (int64_t) val;
1193842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    default: abort ();
1203842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    }
1213842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz}
122b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
123b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidmstatic inline unw_word_t
124b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidmread_operand (unw_addr_space_t as, unw_accessors_t *a,
125b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	      unw_word_t *addr, int operand_type, unw_word_t *val, void *arg)
126b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm{
127b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm  uint8_t u8;
128b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm  uint16_t u16;
129b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm  uint32_t u32;
130b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm  uint64_t u64;
131b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm  int ret;
132b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
1333842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  if (operand_type == ADDR)
1343842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    switch (dwarf_addr_size (as))
1353842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz      {
1363842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz      case 1: operand_type = VAL8; break;
1373842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz      case 2: operand_type = VAL16; break;
1383842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz      case 4: operand_type = VAL32; break;
1393842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz      case 8: operand_type = VAL64; break;
1403842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz      default: abort ();
1413842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz      }
1423842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
143b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm  switch (operand_type)
144b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    {
145b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    case VAL8:
146b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm      ret = dwarf_readu8 (as, a, addr, &u8, arg);
1473842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz      if (ret < 0)
1483842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz	return ret;
149b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm      *val = u8;
150b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm      break;
151b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
152b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    case VAL16:
153b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm      ret = dwarf_readu16 (as, a, addr, &u16, arg);
1543842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz      if (ret < 0)
1553842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz	return ret;
156b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm      *val = u16;
157b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm      break;
158b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
159b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    case VAL32:
160b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm      ret = dwarf_readu32 (as, a, addr, &u32, arg);
1613842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz      if (ret < 0)
1623842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz	return ret;
163b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm      *val = u32;
164b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm      break;
165b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
166b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    case VAL64:
167b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm      ret = dwarf_readu64 (as, a, addr, &u64, arg);
1683842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz      if (ret < 0)
1693842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz	return ret;
170b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm      *val = u64;
171b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm      break;
172b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
173b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    case ULEB128:
174b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm      ret = dwarf_read_uleb128 (as, a, addr, val, arg);
175b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm      break;
176b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
177b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    case SLEB128:
178b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm      ret = dwarf_read_sleb128 (as, a, addr, val, arg);
179b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm      break;
180b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
181b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    case OFFSET: /* only used by DW_OP_call_ref, which we don't implement */
182b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    default:
183670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm      Debug (1, "Unexpected operand type %d\n", operand_type);
184b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm      ret = -UNW_EINVAL;
185b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    }
186b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm  return ret;
187b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm}
188b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
189b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidmHIDDEN int
190b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidmdwarf_eval_expr (struct dwarf_cursor *c, unw_word_t *addr, unw_word_t len,
191b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm		 unw_word_t *valp, int *is_register)
192b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm{
193b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm  unw_word_t operand1 = 0, operand2 = 0, tmp1, tmp2, tmp3, end_addr;
194b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm  uint8_t opcode, operands_signature, u8;
195b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm  unw_addr_space_t as;
196b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm  unw_accessors_t *a;
197b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm  void *arg;
198b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm  unw_word_t stack[MAX_EXPR_STACK_SIZE];
199b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm  unsigned int tos = 0;
200b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm  uint16_t u16;
201b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm  uint32_t u32;
202b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm  uint64_t u64;
203b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm  int ret;
204b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm# define pop()					\
205b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm({						\
206670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm  if ((tos - 1) >= MAX_EXPR_STACK_SIZE)		\
207b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    {						\
208b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm      Debug (1, "Stack underflow\n");		\
209b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm      return -UNW_EINVAL;			\
210b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    }						\
211670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm  stack[--tos];					\
212b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm})
213b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm# define push(x)				\
214b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidmdo {						\
215b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm  if (tos >= MAX_EXPR_STACK_SIZE)		\
216b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    {						\
217b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm      Debug (1, "Stack overflow\n");		\
218b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm      return -UNW_EINVAL;			\
219b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    }						\
220b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm  stack[tos++] = (x);				\
221b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm} while (0)
222b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm# define pick(n)				\
223b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm({						\
224670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm  unsigned int _index = tos - 1 - (n);		\
225b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm  if (_index >= MAX_EXPR_STACK_SIZE)		\
226b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    {						\
227b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm      Debug (1, "Out-of-stack pick\n");		\
228b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm      return -UNW_EINVAL;			\
229b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    }						\
230b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm  stack[_index];				\
231b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm})
232b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
233b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm  as = c->as;
234b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm  arg = c->as_arg;
235b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm  a = unw_get_accessors (as);
236b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm  end_addr = *addr + len;
237670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm  *is_register = 0;
238670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm
239670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm  Debug (14, "len=%lu, pushing cfa=0x%lx\n",
240670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm	 (unsigned long) len, (unsigned long) c->cfa);
241b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
242b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm  push (c->cfa);	/* push current CFA as required by DWARF spec */
243b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
244670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm  while (*addr < end_addr)
245b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    {
246b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm      if ((ret = dwarf_readu8 (as, a, addr, &opcode, arg)) < 0)
247b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	return ret;
248b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
249b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm      operands_signature = operands[opcode];
250b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
251b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm      if (unlikely (NUM_OPERANDS (operands_signature) > 0))
252b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	{
253b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  if ((ret = read_operand (as, a, addr,
254b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm				   OPND1_TYPE (operands_signature),
255b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm				   &operand1, arg)) < 0)
256b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	    return ret;
25722aff2cc1fc1f0bdf8eb8dc2338c4b957ddacaf9Tommi Rantala	  if (NUM_OPERANDS (operands_signature) > 1)
258b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	    if ((ret = read_operand (as, a, addr,
259b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm				     OPND2_TYPE (operands_signature),
260b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm				     &operand2, arg)) < 0)
261b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	      return ret;
262b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	}
263b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
264b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm      switch ((dwarf_expr_op_t) opcode)
265b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	{
266b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_lit0:  case DW_OP_lit1:  case DW_OP_lit2:
267b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_lit3:  case DW_OP_lit4:  case DW_OP_lit5:
268b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_lit6:  case DW_OP_lit7:  case DW_OP_lit8:
269b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_lit9:  case DW_OP_lit10: case DW_OP_lit11:
270b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_lit12: case DW_OP_lit13: case DW_OP_lit14:
271b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_lit15: case DW_OP_lit16: case DW_OP_lit17:
272b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_lit18: case DW_OP_lit19: case DW_OP_lit20:
273b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_lit21: case DW_OP_lit22: case DW_OP_lit23:
274b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_lit24: case DW_OP_lit25: case DW_OP_lit26:
275b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_lit27: case DW_OP_lit28: case DW_OP_lit29:
276b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_lit30: case DW_OP_lit31:
277670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm	  Debug (15, "OP_lit(%d)\n", (int) opcode - DW_OP_lit0);
278670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm	  push (opcode - DW_OP_lit0);
279b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  break;
280b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
281b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_breg0:  case DW_OP_breg1:  case DW_OP_breg2:
282b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_breg3:  case DW_OP_breg4:  case DW_OP_breg5:
283b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_breg6:  case DW_OP_breg7:  case DW_OP_breg8:
284b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_breg9:  case DW_OP_breg10: case DW_OP_breg11:
285b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_breg12: case DW_OP_breg13: case DW_OP_breg14:
286b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_breg15: case DW_OP_breg16: case DW_OP_breg17:
287b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_breg18: case DW_OP_breg19: case DW_OP_breg20:
288b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_breg21: case DW_OP_breg22: case DW_OP_breg23:
289b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_breg24: case DW_OP_breg25: case DW_OP_breg26:
290b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_breg27: case DW_OP_breg28: case DW_OP_breg29:
291b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_breg30: case DW_OP_breg31:
292670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm	  Debug (15, "OP_breg(r%d,0x%lx)\n",
293670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm		 (int) opcode - DW_OP_breg0, (unsigned long) operand1);
294b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  if ((ret = unw_get_reg (dwarf_to_cursor (c),
295b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm				  dwarf_to_unw_regnum (opcode - DW_OP_breg0),
296b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm				  &tmp1)) < 0)
297b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	    return ret;
298b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  push (tmp1 + operand1);
299b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  break;
300b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
301b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_bregx:
302670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm	  Debug (15, "OP_bregx(r%d,0x%lx)\n",
303670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm		 (int) operand1, (unsigned long) operand2);
304b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  if ((ret = unw_get_reg (dwarf_to_cursor (c),
305b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm				  dwarf_to_unw_regnum (operand1), &tmp1)) < 0)
306b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	    return ret;
307b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  push (tmp1 + operand2);
308b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  break;
309b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
310b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_reg0:  case DW_OP_reg1:  case DW_OP_reg2:
311b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_reg3:  case DW_OP_reg4:  case DW_OP_reg5:
312b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_reg6:  case DW_OP_reg7:  case DW_OP_reg8:
313b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_reg9:  case DW_OP_reg10: case DW_OP_reg11:
314b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_reg12: case DW_OP_reg13: case DW_OP_reg14:
315b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_reg15: case DW_OP_reg16: case DW_OP_reg17:
316b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_reg18: case DW_OP_reg19: case DW_OP_reg20:
317b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_reg21: case DW_OP_reg22: case DW_OP_reg23:
318b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_reg24: case DW_OP_reg25: case DW_OP_reg26:
319b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_reg27: case DW_OP_reg28: case DW_OP_reg29:
320b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_reg30: case DW_OP_reg31:
321670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm	  Debug (15, "OP_reg(r%d)\n", (int) opcode - DW_OP_reg0);
322b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  *valp = dwarf_to_unw_regnum (opcode - DW_OP_reg0);
323b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  *is_register = 1;
324b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  return 0;
325b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
326b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_regx:
327670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm	  Debug (15, "OP_regx(r%d)\n", (int) operand1);
328b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  *valp = dwarf_to_unw_regnum (operand1);
329b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  *is_register = 1;
330b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  return 0;
331b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
332b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_addr:
333b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_const1u:
334b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_const2u:
335b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_const4u:
336b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_const8u:
337b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_constu:
338b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_const8s:
339b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_consts:
340670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm	  Debug (15, "OP_const(0x%lx)\n", (unsigned long) operand1);
341b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  push (operand1);
342b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  break;
343b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
344b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_const1s:
345b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  if (operand1 & 0x80)
346b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	    operand1 |= ((unw_word_t) -1) << 8;
347670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm	  Debug (15, "OP_const1s(%ld)\n", (long) operand1);
348b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  push (operand1);
349b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  break;
350b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
351b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_const2s:
352b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  if (operand1 & 0x8000)
353b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	    operand1 |= ((unw_word_t) -1) << 16;
354670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm	  Debug (15, "OP_const2s(%ld)\n", (long) operand1);
355b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  push (operand1);
356b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  break;
357b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
358b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_const4s:
359b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  if (operand1 & 0x80000000)
360b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	    operand1 |= (((unw_word_t) -1) << 16) << 16;
361670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm	  Debug (15, "OP_const4s(%ld)\n", (long) operand1);
362b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  push (operand1);
363b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  break;
364b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
365b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_deref:
366670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm	  Debug (15, "OP_deref\n");
367b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp1 = pop ();
368b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  if ((ret = dwarf_readw (as, a, &tmp1, &tmp2, arg)) < 0)
369b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	    return ret;
370b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  push (tmp2);
371b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  break;
372b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
373b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_deref_size:
374670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm	  Debug (15, "OP_deref_size(%d)\n", (int) operand1);
375b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp1 = pop ();
376b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  switch (operand1)
377b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	    {
3783842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz	    default:
3793842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz	      Debug (1, "Unexpected DW_OP_deref_size size %d\n",
3803842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz		     (int) operand1);
3813842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz	      return -UNW_EINVAL;
382b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
383b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	    case 1:
384b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	      if ((ret = dwarf_readu8 (as, a, &tmp1, &u8, arg)) < 0)
385b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm		return ret;
386b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	      tmp2 = u8;
387b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	      break;
388b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
389b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	    case 2:
390b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	      if ((ret = dwarf_readu16 (as, a, &tmp1, &u16, arg)) < 0)
391b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm		return ret;
392b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	      tmp2 = u16;
393b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	      break;
394b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
395b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	    case 3:
396b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	    case 4:
397b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	      if ((ret = dwarf_readu32 (as, a, &tmp1, &u32, arg)) < 0)
398b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm		return ret;
399b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	      tmp2 = u32;
400b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	      if (operand1 == 3)
401b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm		{
402b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm		  if (dwarf_is_big_endian (as))
403b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm		    tmp2 >>= 8;
404b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm		  else
405b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm		    tmp2 &= 0xffffff;
406b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm		}
407b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	      break;
408b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	    case 5:
409b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	    case 6:
410b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	    case 7:
411b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	    case 8:
412b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	      if ((ret = dwarf_readu64 (as, a, &tmp1, &u64, arg)) < 0)
413b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm		return ret;
4143842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz	      tmp2 = u64;
415b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	      if (operand1 != 8)
416b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm		{
417b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm		  if (dwarf_is_big_endian (as))
418b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm		    tmp2 >>= 64 - 8 * operand1;
419b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm		  else
420b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm		    tmp2 &= (~ (unw_word_t) 0) << (8 * operand1);
421b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm		}
422b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	      break;
423b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	    }
424b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  push (tmp2);
425b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  break;
426b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
427b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_dup:
428670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm	  Debug (15, "OP_dup\n");
429b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  push (pick (0));
430b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  break;
431b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
432b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_drop:
433670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm	  Debug (15, "OP_drop\n");
434f93e1e93be521a757fa7a1c7c3fedc5520318325Tommi Rantala	  (void) pop ();
435b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  break;
436b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
437b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_pick:
438670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm	  Debug (15, "OP_pick(%d)\n", (int) operand1);
439b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  push (pick (operand1));
440b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  break;
441b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
442b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_over:
443670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm	  Debug (15, "OP_over\n");
444b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  push (pick (1));
445b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  break;
446b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
447b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_swap:
448670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm	  Debug (15, "OP_swap\n");
449b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp1 = pop ();
450b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp2 = pop ();
451b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  push (tmp1);
452b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  push (tmp2);
453b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  break;
454b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
455b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_rot:
456670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm	  Debug (15, "OP_rot\n");
457b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp1 = pop ();
458b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp2 = pop ();
459b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp3 = pop ();
460b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  push (tmp1);
461b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  push (tmp3);
462b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  push (tmp2);
463b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  break;
464b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
465b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_abs:
466670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm	  Debug (15, "OP_abs\n");
467b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp1 = pop ();
4683842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz	  if (tmp1 & ((unw_word_t) 1 << (8 * dwarf_addr_size (as) - 1)))
469b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	    tmp1 = -tmp1;
470b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  push (tmp1);
471b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  break;
472b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
473b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_and:
474670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm	  Debug (15, "OP_and\n");
475b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp1 = pop ();
476b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp2 = pop ();
477b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  push (tmp1 & tmp2);
478b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  break;
479b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
480b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_div:
481670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm	  Debug (15, "OP_div\n");
482b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp1 = pop ();
483b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp2 = pop ();
484b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  if (tmp1)
4853842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz	    tmp1 = sword (as, tmp2) / sword (as, tmp1);
486b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  push (tmp1);
487b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  break;
488b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
489b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_minus:
490670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm	  Debug (15, "OP_minus\n");
491b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp1 = pop ();
492b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp2 = pop ();
493b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp1 = tmp2 - tmp1;
494b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  push (tmp1);
495b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  break;
496b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
497b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_mod:
498670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm	  Debug (15, "OP_mod\n");
499b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp1 = pop ();
500b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp2 = pop ();
501b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  if (tmp1)
502b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	    tmp1 = tmp2 % tmp1;
503b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  push (tmp1);
504b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  break;
505b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
506b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_mul:
507670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm	  Debug (15, "OP_mul\n");
508b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp1 = pop ();
509b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp2 = pop ();
510b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  if (tmp1)
511b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	    tmp1 = tmp2 * tmp1;
512b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  push (tmp1);
513b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  break;
514b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
515b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_neg:
516670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm	  Debug (15, "OP_neg\n");
517b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  push (-pop ());
518b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  break;
519b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
520b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_not:
521670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm	  Debug (15, "OP_not\n");
522b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  push (~pop ());
523b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  break;
524b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
525b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_or:
526670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm	  Debug (15, "OP_or\n");
527b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp1 = pop ();
528b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp2 = pop ();
529b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  push (tmp1 | tmp2);
530b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  break;
531b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
532b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_plus:
533670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm	  Debug (15, "OP_plus\n");
534b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp1 = pop ();
535b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp2 = pop ();
536b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  push (tmp1 + tmp2);
537b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  break;
538b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
539b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_plus_uconst:
540670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm	  Debug (15, "OP_plus_uconst(%lu)\n", (unsigned long) operand1);
541b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp1 = pop ();
542b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  push (tmp1 + operand1);
543b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  break;
544b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
545b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_shl:
546670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm	  Debug (15, "OP_shl\n");
547b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp1 = pop ();
548b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp2 = pop ();
549b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  push (tmp2 << tmp1);
550b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  break;
551b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
552b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_shr:
553670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm	  Debug (15, "OP_shr\n");
554b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp1 = pop ();
555b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp2 = pop ();
556b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  push (tmp2 >> tmp1);
557b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  break;
558b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
559b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_shra:
560670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm	  Debug (15, "OP_shra\n");
561b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp1 = pop ();
562b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp2 = pop ();
5633842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz	  push (sword (as, tmp2) >> tmp1);
564b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  break;
565b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
566b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_xor:
567670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm	  Debug (15, "OP_xor\n");
568b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp1 = pop ();
569b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp2 = pop ();
570b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  push (tmp1 ^ tmp2);
571b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  break;
572b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
573b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_le:
574670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm	  Debug (15, "OP_le\n");
575b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp1 = pop ();
576b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp2 = pop ();
577679b65cd221efa7df42b6a369c7b1ebe9d8b5c3eChris January	  push (sword (as, tmp2) <= sword (as, tmp1));
578b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  break;
579b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
580b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_ge:
581670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm	  Debug (15, "OP_ge\n");
582b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp1 = pop ();
583b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp2 = pop ();
584679b65cd221efa7df42b6a369c7b1ebe9d8b5c3eChris January	  push (sword (as, tmp2) >= sword (as, tmp1));
585b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  break;
586b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
587b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_eq:
588670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm	  Debug (15, "OP_eq\n");
589b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp1 = pop ();
590b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp2 = pop ();
591679b65cd221efa7df42b6a369c7b1ebe9d8b5c3eChris January	  push (sword (as, tmp2) == sword (as, tmp1));
592b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  break;
593b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
594b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_lt:
595670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm	  Debug (15, "OP_lt\n");
596b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp1 = pop ();
597b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp2 = pop ();
598679b65cd221efa7df42b6a369c7b1ebe9d8b5c3eChris January	  push (sword (as, tmp2) < sword (as, tmp1));
599b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  break;
600b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
601b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_gt:
602670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm	  Debug (15, "OP_gt\n");
603b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp1 = pop ();
604b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp2 = pop ();
605679b65cd221efa7df42b6a369c7b1ebe9d8b5c3eChris January	  push (sword (as, tmp2) > sword (as, tmp1));
606b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  break;
607b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
608b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_ne:
609670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm	  Debug (15, "OP_ne\n");
610b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp1 = pop ();
611b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp2 = pop ();
612679b65cd221efa7df42b6a369c7b1ebe9d8b5c3eChris January	  push (sword (as, tmp2) != sword (as, tmp1));
613b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  break;
614b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
615b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_skip:
616670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm	  Debug (15, "OP_skip(%d)\n", (int16_t) operand1);
617b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  *addr += (int16_t) operand1;
618b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  break;
619b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
620b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_bra:
621670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm	  Debug (15, "OP_skip(%d)\n", (int16_t) operand1);
622b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  tmp1 = pop ();
623b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  if (tmp1)
624b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	    *addr += (int16_t) operand1;
625b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  break;
626b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
627b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_nop:
628670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm	  Debug (15, "OP_nop\n");
629b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  break;
630b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm
631b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_call2:
632b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_call4:
633b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_call_ref:
634b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_fbreg:
635b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_piece:
636b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_push_object_address:
637b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_xderef:
638b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	case DW_OP_xderef_size:
639b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	default:
640b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  Debug (1, "Unexpected opcode 0x%x\n", opcode);
641b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	  return -UNW_EINVAL;
642b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm	}
643b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm    }
644b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm  *valp = pop ();
645670399d35752ccd5914b5dae192e3b5a36946c90homeip.net!davidm  Debug (14, "final value = 0x%lx\n", (unsigned long) *valp);
646b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm  return 0;
647b79f7d142429515e3bb0b57f02890584e7eca979homeip.net!davidm}
648