diff options
Diffstat (limited to 'gdb/gdbtk-wrapper.c')
-rw-r--r-- | gdb/gdbtk-wrapper.c | 475 |
1 files changed, 475 insertions, 0 deletions
diff --git a/gdb/gdbtk-wrapper.c b/gdb/gdbtk-wrapper.c new file mode 100644 index 0000000..9d9a263 --- /dev/null +++ b/gdb/gdbtk-wrapper.c @@ -0,0 +1,475 @@ +/* longjmp-free interface between gdb and gdbtk. + Copyright (C) 1999 Free Software Foundation, Inc. + +This file is part of GDB. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#include "defs.h" +#include "frame.h" +#include "value.h" +#include "gdbtk-wrapper.h" + +/* + * Wrapper functions exported to the world + */ + +gdb_result GDB_value_fetch_lazy PARAMS ((value_ptr)); + +gdb_result GDB_evaluate_expression PARAMS ((struct expression *, value_ptr *)); + +gdb_result GDB_type_print PARAMS ((value_ptr, char *, GDB_FILE *, int)); + +gdb_result GDB_val_print PARAMS ((struct type *type, char *valaddr, + CORE_ADDR address, GDB_FILE *stream, + int format, int deref_ref, int recurse, + enum val_prettyprint pretty)); + +gdb_result GDB_select_frame PARAMS ((struct frame_info *, int)); + +gdb_result GDB_value_equal PARAMS ((value_ptr, value_ptr, int *)); + +gdb_result GDB_parse_exp_1 PARAMS ((char **stringptr, struct block *block, int comma, + struct expression **result)); + +gdb_result GDB_evaluate_type PARAMS ((struct expression *exp, value_ptr *result)); + +gdb_result GDB_block_for_pc PARAMS ((CORE_ADDR pc, struct block **result)); + +gdb_result GDB_block_innermost_frame PARAMS ((struct block *block, + struct frame_info **result)); + +gdb_result GDB_reinit_frame_cache PARAMS ((void)); + +gdb_result GDB_find_frame_addr_in_frame_chain PARAMS ((CORE_ADDR addr, + struct frame_info **result)); + +/* + * Private functions for this file + */ +static gdb_result call_wrapped_function PARAMS ((catch_errors_ftype *, + struct gdb_wrapper_arguments *)); + +static int wrap_type_print PARAMS ((char *)); + +static int wrap_evaluate_expression PARAMS ((char *)); + +static int wrap_value_fetch_lazy PARAMS ((char *)); + +static int wrap_val_print PARAMS ((char*)); + +static int wrap_select_frame PARAMS ((char *)); + +static int wrap_value_equal PARAMS ((char *)); + +static int wrap_parse_exp_1 PARAMS ((char *opaque_arg)); + +static int wrap_evaluate_type PARAMS ((char *opaque_arg)); + +static int wrap_block_for_pc PARAMS ((char *opaque_arg)); + +static int wrap_block_innermost_frame PARAMS ((char *opaque_arg)); + +static int wrap_reinit_frame_cache PARAMS ((char *opaque_arg)); + +static int wrap_find_frame_addr_in_frame_chain PARAMS ((char *opaque_arg)); + +static gdb_result +call_wrapped_function (fn, arg) + catch_errors_ftype *fn; + struct gdb_wrapper_arguments *arg; +{ + if (!catch_errors (fn, (char *) &arg, "", RETURN_MASK_ERROR)) + { + /* An error occurred */ + return GDB_ERROR; + } + + return GDB_OK; +} + +gdb_result +GDB_type_print (val, varstring, stream, show) + value_ptr val; + char *varstring; + GDB_FILE *stream; + int show; +{ + struct gdb_wrapper_arguments args; + + args.args[0] = (char *) val; + args.args[1] = varstring; + args.args[2] = (char *) stream; + args.args[3] = (char *) show; + return call_wrapped_function ((catch_errors_ftype *) wrap_type_print, &args); +} + +static int +wrap_type_print (a) + char *a; +{ + struct gdb_wrapper_arguments **args = (struct gdb_wrapper_arguments **) a; + value_ptr val = (value_ptr) (*args)->args[0]; + char *varstring = (*args)->args[1]; + GDB_FILE *stream = (GDB_FILE *) (*args)->args[2]; + int show = (int) (*args)->args[3]; + type_print (VALUE_TYPE (val), varstring, stream, show); + return 1; +} + +gdb_result +GDB_val_print (type, valaddr, address, stream, format, deref_ref, + recurse, pretty) + struct type *type; + char *valaddr; + CORE_ADDR address; + GDB_FILE *stream; + int format; + int deref_ref; + int recurse; + enum val_prettyprint pretty; +{ + struct gdb_wrapper_arguments args; + + args.args[0] = (char *) type; + args.args[1] = (char *) valaddr; + args.args[2] = (char *) address; + args.args[3] = (char *) stream; + args.args[4] = (char *) format; + args.args[5] = (char *) deref_ref; + args.args[6] = (char *) recurse; + args.args[7] = (char *) pretty; + + return call_wrapped_function ((catch_errors_ftype *) wrap_val_print, &args); +} + +static int +wrap_val_print (a) + char *a; +{ + struct gdb_wrapper_arguments **args = (struct gdb_wrapper_arguments **) a; + struct type *type; + char *valaddr; + CORE_ADDR address; + GDB_FILE *stream; + int format; + int deref_ref; + int recurse; + enum val_prettyprint pretty; + + type = (struct type *) (*args)->args[0]; + valaddr = (char *) (*args)->args[1]; + address = (CORE_ADDR) (*args)->args[2]; + stream = (GDB_FILE *) (*args)->args[3]; + format = (int) (*args)->args[4]; + deref_ref = (int) (*args)->args[5]; + recurse = (int) (*args)->args[6]; + pretty = (enum val_prettyprint) (*args)->args[7]; + + val_print (type, valaddr, 0, address, stream, format, deref_ref, + recurse, pretty); + return 1; +} + +gdb_result +GDB_value_fetch_lazy (value) + value_ptr value; +{ + struct gdb_wrapper_arguments args; + + args.args[0] = (char *) value; + return call_wrapped_function ((catch_errors_ftype *) wrap_value_fetch_lazy, &args); +} + +static int +wrap_value_fetch_lazy (a) + char *a; +{ + struct gdb_wrapper_arguments **args = (struct gdb_wrapper_arguments **) a; + + value_fetch_lazy ((value_ptr) (*args)->args[0]); + return 1; +} + +gdb_result +GDB_evaluate_expression (exp, value) + struct expression *exp; + value_ptr *value; +{ + struct gdb_wrapper_arguments args; + gdb_result result; + args.args[0] = (char *) exp; + + result = call_wrapped_function ((catch_errors_ftype *) wrap_evaluate_expression, &args); + if (result != GDB_OK) + return result; + + *value = (value_ptr) args.result; + return GDB_OK; +} + +static int +wrap_evaluate_expression (a) + char *a; +{ + struct gdb_wrapper_arguments **args = (struct gdb_wrapper_arguments **) a; + + (*args)->result = + (char *) evaluate_expression ((struct expression *) (*args)->args[0]); + return 1; +} + +gdb_result +GDB_select_frame (fi, level) + struct frame_info *fi; + int level; +{ + struct gdb_wrapper_arguments args; + + args.args[0] = (char *) fi; + args.args[1] = (char *) &level; + + return call_wrapped_function ((catch_errors_ftype *) wrap_select_frame, &args); +} + +static int +wrap_select_frame (a) + char *a; +{ + struct gdb_wrapper_arguments **args = (struct gdb_wrapper_arguments **) a; + int level = * (int *) (*args)->args[1]; + struct frame_info *fi = (struct frame_info *) (*args)->args[0]; + + select_frame (fi, level); + return 1; +} + +gdb_result +GDB_value_equal (val1, val2, result) + value_ptr val1; + value_ptr val2; + int *result; +{ + struct gdb_wrapper_arguments args; + gdb_result r; + + args.args[0] = (char *) val1; + args.args[1] = (char *) val2; + + r = call_wrapped_function ((catch_errors_ftype *) wrap_value_equal, &args); + if (r != GDB_OK) + return r; + + *result = (int) args.result; + return GDB_OK; +} + +static int +wrap_value_equal (a) + char *a; +{ + struct gdb_wrapper_arguments **args = (struct gdb_wrapper_arguments **) a; + value_ptr val1, val2; + + val1 = (value_ptr) (*args)->args[0]; + val2 = (value_ptr) (*args)->args[1]; + + (*args)->result = (char *) value_equal (val1, val2); + return 1; +} + +gdb_result +GDB_parse_exp_1 (stringptr, block, comma, result) + char **stringptr; + struct block *block; + int comma; + struct expression **result; +{ + struct gdb_wrapper_arguments args; + gdb_result r; + + args.args[0] = (char *) stringptr; + args.args[1] = (char *) block; + args.args[2] = (char *) comma; + + r = call_wrapped_function ((catch_errors_ftype *) wrap_parse_exp_1, &args); + if (r != GDB_OK) + return r; + + *result = (struct expression *) args.result; + return GDB_OK; +} + +static int +wrap_parse_exp_1 (opaque_arg) + char *opaque_arg; +{ + struct gdb_wrapper_arguments **args = (struct gdb_wrapper_arguments **) opaque_arg; + struct block *block; + char **stringptr; + int comma; + + stringptr = (char **) (*args)->args[0]; + block = (struct block *) (*args)->args[1]; + comma = (int) (*args)->args[2]; + + (*args)->result = (char *) parse_exp_1 (stringptr, block, comma); + return 1; +} + +gdb_result +GDB_evaluate_type (exp, result) + struct expression *exp; + value_ptr *result; +{ + struct gdb_wrapper_arguments args; + gdb_result r; + + args.args[0] = (char *) exp; + + r = call_wrapped_function ((catch_errors_ftype *) wrap_evaluate_type, &args); + if (r != GDB_OK) + return r; + + *result = (value_ptr) args.result; + return GDB_OK; +} + +static int +wrap_evaluate_type (opaque_arg) + char *opaque_arg; +{ + struct gdb_wrapper_arguments **args = (struct gdb_wrapper_arguments **) opaque_arg; + struct expression *exp; + + exp = (struct expression *) (*args)->args[0]; + (*args)->result = (char *) evaluate_type (exp); + return 1; +} + +gdb_result +GDB_block_for_pc (pc, result) + CORE_ADDR pc; + struct block **result; +{ + struct gdb_wrapper_arguments args; + gdb_result r; + + args.args[0] = (char *) pc; + + r = call_wrapped_function ((catch_errors_ftype *) wrap_block_for_pc, &args); + if (r != GDB_OK) + return r; + + *result = (struct block *) args.result; + return GDB_OK; +} + +static int +wrap_block_for_pc (opaque_arg) + char *opaque_arg; +{ + struct gdb_wrapper_arguments **args = (struct gdb_wrapper_arguments **) opaque_arg; + CORE_ADDR pc; + + pc = (CORE_ADDR) (*args)->args[0]; + (*args)->result = (char *) block_for_pc (pc); + return 1; +} + +gdb_result +GDB_block_innermost_frame (block, result) + struct block *block; + struct frame_info **result; +{ + struct gdb_wrapper_arguments args; + gdb_result r; + + args.args[0] = (char *) block; + + r = call_wrapped_function ((catch_errors_ftype *) wrap_block_innermost_frame, &args); + if (r != GDB_OK) + return r; + + *result = (struct frame_info *) args.result; + return GDB_OK; +} + +static int +wrap_block_innermost_frame (opaque_arg) + char *opaque_arg; +{ + struct gdb_wrapper_arguments **args = (struct gdb_wrapper_arguments **) opaque_arg; + struct block *block; + + block = (struct block *) (*args)->args[0]; + (*args)->result = (char *) block_innermost_frame (block); + return 1; +} + +gdb_result +GDB_reinit_frame_cache () +{ + gdb_result r; + + r = call_wrapped_function ((catch_errors_ftype *) wrap_reinit_frame_cache, NULL); + if (r != GDB_OK) + return r; + + return GDB_OK; +} + +static int +wrap_reinit_frame_cache (opaque_arg) + char *opaque_arg; +{ + reinit_frame_cache (); + return 1; +} + +gdb_result +GDB_find_frame_addr_in_frame_chain (addr, result) + CORE_ADDR addr; + struct frame_info **result; +{ + struct gdb_wrapper_arguments args; + gdb_result r; + + args.args[0] = (char *) addr; + + r = call_wrapped_function ((catch_errors_ftype *) wrap_find_frame_addr_in_frame_chain, &args); + if (r != GDB_OK) + return r; + + *result = (struct frame_info *) args.result; + return GDB_OK; +} + +static int +wrap_find_frame_addr_in_frame_chain (opaque_arg) + char *opaque_arg; +{ + struct gdb_wrapper_arguments **args = (struct gdb_wrapper_arguments **) opaque_arg; + CORE_ADDR addr; + + addr = (CORE_ADDR) (*args)->args[0]; + (*args)->result = (char *) find_frame_addr_in_frame_chain (addr); + return 1; +} + + +/* Local variables: */ +/* change-log-default-name: "ChangeLog-gdbtk" */ +/* End: */ |