along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
-/* $Id$ */
-
#include "defs.h"
#include "symtab.h"
#include "symfile.h"
#include "expression.h"
#include "command.h"
#include "gdbcmd.h"
+#include "frame.h"
+#include "target.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);
\f
/* Initialization code. */
+void _initialize_ax_gdb PARAMS ((void));
+void
_initialize_ax_gdb ()
{
struct cmd_list_element *c;