static void dwarf2_tracepoint_var_ref (struct symbol * symbol, struct agent_expr * ax, struct axs_value * value, unsigned char *data, int size) { if (size == 0) error ("Symbol \"%s\" has been optimized out.", SYMBOL_PRINT_NAME (symbol)); if (size == 1 && data[0] >= DW_OP_reg0 && data[0] <= DW_OP_reg31) { value->kind = axs_lvalue_register; value->u.reg = data[0] - DW_OP_reg0; } else if (data[0] == DW_OP_regx) { ULONGEST reg; read_uleb128 (data + 1, data + size, ®); value->kind = axs_lvalue_register; value->u.reg = reg; } else if (data[0] == DW_OP_fbreg) { /* And this is worse than just minimal; we should honor the frame base as above. */ int frame_reg; LONGEST frame_offset; unsigned char *buf_end; buf_end = read_sleb128 (data + 1, data + size, &frame_offset); if (buf_end != data + size) error ("Unexpected opcode after DW_OP_fbreg for symbol \"%s\".", SYMBOL_PRINT_NAME (symbol)); TARGET_VIRTUAL_FRAME_POINTER (ax->scope, &frame_reg, &frame_offset); ax_reg (ax, frame_reg); ax_const_l (ax, frame_offset); ax_simple (ax, aop_add); ax_const_l (ax, frame_offset); ax_simple (ax, aop_add); value->kind = axs_lvalue_memory; } else error ("Unsupported DWARF opcode in the location of \"%s\".", SYMBOL_PRINT_NAME (symbol)); }
/* Assemble code to push a constant on the stack. */ void ax_const_l (struct agent_expr *x, LONGEST l) { static enum agent_op ops[] = {aop_const8, aop_const16, aop_const32, aop_const64}; int size; int op; /* How big is the number? 'op' keeps track of which opcode to use. Notice that we don't really care whether the original number was signed or unsigned; we always reproduce the value exactly, and use the shortest representation. */ for (op = 0, size = 8; size < 64; size *= 2, op++) { LONGEST lim = ((LONGEST) 1) << (size - 1); if (-lim <= l && l <= lim - 1) break; } /* Emit the right opcode... */ ax_simple (x, ops[op]); /* Emit the low SIZE bytes as an unsigned number. We know that sign-extending this will yield l. */ append_const (x, l, size / 8); /* Now, if it was negative, and not full-sized, sign-extend it. */ if (l < 0 && size < 64) ax_ext (x, size); }
void ax_pick (struct agent_expr *x, int depth) { if (depth < 0 || depth > 255) error (_("GDB bug: ax-general.c (ax_pick): stack depth out of range")); ax_simple (x, aop_pick); append_const (x, 1, depth); }
static void dwarf2_tracepoint_var_ref (struct symbol *symbol, struct agent_expr *ax, struct axs_value *value, gdb_byte *data, int size) { if (size == 0) error (_("Symbol \"%s\" has been optimized out."), SYMBOL_PRINT_NAME (symbol)); if (size == 1 && data[0] >= DW_OP_reg0 && data[0] <= DW_OP_reg31) { value->kind = axs_lvalue_register; value->u.reg = data[0] - DW_OP_reg0; } else if (data[0] == DW_OP_regx) { ULONGEST reg; read_uleb128 (data + 1, data + size, ®); value->kind = axs_lvalue_register; value->u.reg = reg; } else if (data[0] == DW_OP_fbreg) { /* And this is worse than just minimal; we should honor the frame base as above. */ int frame_reg; LONGEST frame_offset; gdb_byte *buf_end; buf_end = read_sleb128 (data + 1, data + size, &frame_offset); if (buf_end != data + size) error (_("Unexpected opcode after DW_OP_fbreg for symbol \"%s\"."), SYMBOL_PRINT_NAME (symbol)); gdbarch_virtual_frame_pointer (current_gdbarch, ax->scope, &frame_reg, &frame_offset); ax_reg (ax, frame_reg); ax_const_l (ax, frame_offset); ax_simple (ax, aop_add); value->kind = axs_lvalue_memory; } else if (data[0] >= DW_OP_breg0 && data[0] <= DW_OP_breg31) { unsigned int reg; LONGEST offset; gdb_byte *buf_end; reg = data[0] - DW_OP_breg0; buf_end = read_sleb128 (data + 1, data + size, &offset); if (buf_end != data + size) error (_("Unexpected opcode after DW_OP_breg%u for symbol \"%s\"."), reg, SYMBOL_PRINT_NAME (symbol)); ax_reg (ax, reg); ax_const_l (ax, offset); ax_simple (ax, aop_add); value->kind = axs_lvalue_memory; } else error (_("Unsupported DWARF opcode 0x%x in the location of \"%s\"."), data[0], SYMBOL_PRINT_NAME (symbol)); }