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