+Wed Dec 2 15:11:38 1998 Michael Snyder <msnyder@cleaver.cygnus.com>
+
+ * tracepoint.c: Move default definition of
+ TARGET_VIRTUAL_FRAME_POINTER from here to target.h.
+ * target.h: Add default definition of TARGET_VIRTUAL_FRAME_POINTER.
+ * ax-gdb.c (gen_frame_args_address, gen_frame_locals_address):
+ use TARGET_VIRTUAL_FRAME_POINTER to determine frame pointer.
+ (gen_trace_for_expr): new argument, address of tracepoint,
+ gets passed to new_agent_expr and added to struct agent_expr.
+ (is_nontrivial_conversion): call to new_agent_expr now requires
+ a dummy argument. (agent_command): use get_current_frame() to
+ get current PC scope; pass it to gen_trace_for_expr.
+ * ax-general.c (new_agent_expr): new argument, address of
+ tracepoint; store it in new field of struct agent_expr.
+ * ax.h (struct agent_expr): add new field for tracepoint address.
+ * ax-gdb.h: change prototypes to match above changes.
+
+Tue Dec 1 10:59:00 1998 Andrew Cagney <cagney@b1.cygnus.com>
+
+ * ocd.c (remote_timeout), (BDM_BREAKPOINT), monitor.c (readchar),
+ remote.c: Cleanup closing of open comments.
+
Mon Nov 30 16:04:03 1998 Doug Evans <devans@canuck.cygnus.com>
* config/fr30/tm-fr30.h (INNER_THAN): Add parameters.
#include "expression.h"
#include "command.h"
#include "gdbcmd.h"
+#include "frame.h"
#include "ax.h"
#include "ax-gdb.h"
\f
-/* Static forward declarations */
+/* Prototypes for local functions. */
/* There's a standard order to the arguments of these functions:
union exp_element ** --- pointer into expression
static void gen_left_shift PARAMS ((struct agent_expr *, int));
-static void gen_frame_args_address PARAMS ((struct agent_expr *));
+static void gen_frame_args_address PARAMS ((struct agent_expr *));
static void gen_frame_locals_address PARAMS ((struct agent_expr *));
static void gen_offset PARAMS ((struct agent_expr *ax, int offset));
static void gen_sym_offset PARAMS ((struct agent_expr *, struct symbol *));
static void gen_expr PARAMS ((union exp_element **pc,
struct agent_expr *ax,
struct axs_value *value));
+
static void print_axs_value PARAMS ((GDB_FILE *f, struct axs_value *value));
static void agent_command PARAMS ((char *exp, int from_tty));
gen_frame_args_address (ax)
struct agent_expr *ax;
{
- /* FIXME: I'm sure this is wrong for processors other than the 68k. */
- ax_reg (ax, FP_REGNUM);
+ long frame_reg, frame_offset;
+
+ TARGET_VIRTUAL_FRAME_POINTER (ax->scope, &frame_reg, &frame_offset);
+ ax_reg (ax, frame_reg);
+ gen_offset (ax, frame_offset);
}
gen_frame_locals_address (ax)
struct agent_expr *ax;
{
- /* FIXME: I'm sure this is wrong for processors other than the 68k. */
- ax_reg (ax, FP_REGNUM);
+ long frame_reg, frame_offset;
+
+ TARGET_VIRTUAL_FRAME_POINTER (ax->scope, &frame_reg, &frame_offset);
+ ax_reg (ax, frame_reg);
+ gen_offset (ax, frame_offset);
}
is_nontrivial_conversion (from, to)
struct type *from, *to;
{
- struct agent_expr *ax = new_agent_expr ();
+ struct agent_expr *ax = new_agent_expr (0);
int nontrivial;
/* Actually generate the code, and see if anything came out. At the
\f
+#if 0 /* not used */
/* Generating bytecode from GDB expressions: driver */
/* Given a GDB expression EXPR, produce a string of agent bytecode
return ax;
}
-
+#endif /* 0 */
/* Given a GDB expression EXPR, return bytecode to trace its value.
The result will use the `trace' and `trace_quick' bytecodes to
caller can then use the ax_reqs function to discover which
registers it relies upon. */
struct agent_expr *
-gen_trace_for_expr (expr)
+gen_trace_for_expr (scope, expr)
+ CORE_ADDR scope;
struct expression *expr;
{
struct cleanup *old_chain = 0;
- struct agent_expr *ax = new_agent_expr ();
+ struct agent_expr *ax = new_agent_expr (scope);
union exp_element *pc;
struct axs_value value;
struct expression *expr;
struct agent_expr *agent;
struct agent_reqs reqs;
+ struct frame_info *fi = get_current_frame (); /* need current scope */
/* We don't deal with overlay debugging at the moment. We need to
think more carefully about this. If you copy this code into
expr = parse_expression (exp);
old_chain = make_cleanup ((make_cleanup_func) free_current_contents, &expr);
- agent = gen_trace_for_expr (expr);
+ agent = gen_trace_for_expr (fi->pc, expr);
make_cleanup ((make_cleanup_func) free_agent_expr, agent);
ax_print (gdb_stdout, agent);
ax_reqs (agent, &reqs);
/* we have something to collect, make sure that the expr to
bytecode translator can handle it and that it's not too long */
- aexpr = gen_trace_for_expr(exp);
+ aexpr = gen_trace_for_expr (t->address, exp);
(void) make_cleanup ((make_cleanup_func) free_agent_expr, aexpr);
if (aexpr->len > MAX_AGENT_EXPR_LEN)
free(actions_list);
}
-#ifndef TARGET_VIRTUAL_FRAME_POINTER
-/* If anybody else ever uses this macro, then move this
- default definition into some global header file such as defs.h.
-
- FIXME: GDB's whole scheme for dealing with "frames" and
- "frame pointers" needs a serious shakedown.
- */
-
-#define TARGET_VIRTUAL_FRAME_POINTER(ADDR, REGP, OFFP) \
- do { *(REGP) = FP_REGNUM; *(OFFP) = 0; } while (0)
-#endif
-
/* render all actions into gdb protocol */
static void
encode_actions (t, tdp_actions, stepping_actions)
break;
default: /* full-fledged expression */
- aexpr = gen_trace_for_expr (exp);
+ aexpr = gen_trace_for_expr (t->address, exp);
old_chain1 = make_cleanup ((make_cleanup_func)
free_agent_expr, aexpr);
struct minimal_symbol *msym;
struct block *block;
char **canonical, *symname, *save_args = args;
- int i, nsyms, count = 0;
+ int i, j, nsyms, count = 0;
if (args == 0 || *args == 0)
error ("requires an argument (function, line or *addr) to define a scope");
case LOC_CONST_BYTES:
printf_filtered ("constant bytes: ");
if (SYMBOL_TYPE (sym))
- for (i = 0; i < TYPE_LENGTH (SYMBOL_TYPE (sym)); i++)
+ for (j = 0; j < TYPE_LENGTH (SYMBOL_TYPE (sym)); j++)
fprintf_filtered (gdb_stdout, " %02x",
- (unsigned) SYMBOL_VALUE_BYTES (sym) [i]);
+ (unsigned) SYMBOL_VALUE_BYTES (sym) [j]);
break;
case LOC_STATIC:
printf_filtered ("in static storage at address ");