X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fdefs.h;h=75325480808073bed10d94f289da5d0ea3584025;hb=eb16c04c8c232558f68b424bcb62b285fd2d9002;hp=4791f3abd05e6d48c2a295691e0957b866e914d4;hpb=84d598611e42de0248b0e7689e4ebe062e1699b6;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/defs.h b/gdb/defs.h index 4791f3abd0..7532548080 100644 --- a/gdb/defs.h +++ b/gdb/defs.h @@ -1,5 +1,6 @@ /* Basic, host-specific, and target-specific definitions for GDB. - Copyright (C) 1986, 1989, 1991 Free Software Foundation, Inc. + Copyright (C) 1986, 1989, 1991, 1992, 1993, 1994, 1995, 1996 + Free Software Foundation, Inc. This file is part of GDB. @@ -15,23 +16,63 @@ 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#if !defined (DEFS_H) -#define DEFS_H 1 +#ifndef DEFS_H +#define DEFS_H +#include "config.h" /* Generated by configure */ #include +#include /* System call error return status */ + +/* Just in case they're not defined in stdio.h. */ + +#ifndef SEEK_SET +#define SEEK_SET 0 +#endif +#ifndef SEEK_CUR +#define SEEK_CUR 1 +#endif /* First include ansidecl.h so we can use the various macro definitions here and in all subsequent file inclusions. */ #include "ansidecl.h" -/* An address in the program being debugged. Host byte order. */ -typedef unsigned int CORE_ADDR; +#ifdef ANSI_PROTOTYPES +#include +#else +#include +#endif + +#include "libiberty.h" + +/* libiberty.h can't declare this one, but evidently we can. */ +extern char *strsignal PARAMS ((int)); + +#include "progress.h" + +#ifndef NO_MMALLOC +#include "mmalloc.h" +#endif + +/* For BFD64 and bfd_vma. */ +#include "bfd.h" + +/* An address in the program being debugged. Host byte order. Rather + than duplicate all the logic in BFD which figures out what type + this is (long, long long, etc.) and whether it needs to be 64 + bits (the host/target interactions are subtle), we just use + bfd_vma. */ +typedef bfd_vma CORE_ADDR; + +#ifndef min #define min(a, b) ((a) < (b) ? (a) : (b)) +#endif +#ifndef max #define max(a, b) ((a) > (b) ? (a) : (b)) +#endif /* Gdb does *lots* of string compares. Use macros to speed them up by avoiding function calls if the first characters are not the same. */ @@ -44,16 +85,26 @@ typedef unsigned int CORE_ADDR; the program's identifiers (such as $this and $$vptr). */ #define CPLUS_MARKER '$' /* May be overridden to '.' for SysV */ -#include /* System call error return status */ +/* Check if a character is one of the commonly used C++ marker characters. */ +extern int is_cplus_marker PARAMS ((int)); extern int quit_flag; extern int immediate_quit; extern int sevenbit_strings; -extern void -quit PARAMS ((void)); +extern void quit PARAMS ((void)); -#define QUIT { if (quit_flag) quit (); } +#ifdef QUIT +/* do twice to force compiler warning */ +#define QUIT_FIXME "FIXME" +#define QUIT_FIXME "ignoring redefinition of QUIT" +#else +#define QUIT { \ + if (quit_flag) quit (); \ + if (interactive_hook) interactive_hook (); \ + PROGRESS (1); \ +} +#endif /* Command classes are top-level categories into which commands are broken down for "help" purposes. @@ -83,8 +134,12 @@ enum language language_auto, /* Placeholder for automatic setting */ language_c, /* C */ language_cplus, /* C++ */ + language_java, /* Java */ language_chill, /* Chill */ - language_m2 /* Modula-2 */ + language_fortran, /* Fortran */ + language_m2, /* Modula-2 */ + language_asm, /* Assembly language */ + language_scm /* Scheme / Guile */ }; /* the cleanup list records things that have to be undone @@ -104,75 +159,84 @@ struct cleanup PTR arg; }; -/* From blockframe.c */ - -extern int -inside_entry_func PARAMS ((CORE_ADDR)); - -extern int -inside_entry_file PARAMS ((CORE_ADDR addr)); -extern int -inside_main_func PARAMS ((CORE_ADDR pc)); +/* The ability to declare that a function never returns is useful, but + not really required to compile GDB successfully, so the NORETURN and + ATTR_NORETURN macros normally expand into nothing. */ -/* From ch-lang.c, for the moment. (FIXME) */ +/* If compiling with older versions of GCC, a function may be declared + "volatile" to indicate that it does not return. */ -extern char * -chill_demangle PARAMS ((const char *)); +#ifndef NORETURN +# if defined(__GNUC__) \ + && (__GNUC__ == 1 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)) +# define NORETURN volatile +# else +# define NORETURN /* nothing */ +# endif +#endif -/* From libiberty.a */ +/* GCC 2.5 and later versions define a function attribute "noreturn", + which is the preferred way to declare that a function never returns. + However GCC 2.7 appears to be the first version in which this fully + works everywhere we use it. */ -extern char * -cplus_demangle PARAMS ((const char *, int)); +#ifndef ATTR_NORETURN +# if defined(__GNUC__) && __GNUC__ >= 2 && __GNUC_MINOR__ >= 7 +# define ATTR_NORETURN __attribute__ ((noreturn)) +# else +# define ATTR_NORETURN /* nothing */ +# endif +#endif -extern char * -cplus_mangle_opname PARAMS ((char *, int)); +#ifndef ATTR_FORMAT +# if defined(__GNUC__) && __GNUC__ >= 2 && __GNUC_MINOR__ >= 4 && defined (__ANSI_PROTOTYPES) +# define ATTR_FORMAT(type, x, y) __attribute__ ((format(type, x, y))) +# else +# define ATTR_FORMAT(type, x, y) /* nothing */ +# endif +#endif -/* From libmmalloc.a (memory mapped malloc library) */ +/* Needed for various prototypes */ -extern PTR -mmalloc_attach PARAMS ((int, PTR)); +#ifdef __STDC__ +struct symtab; +struct breakpoint; +#endif -extern PTR -mmalloc_detach PARAMS ((PTR)); +/* From blockframe.c */ -extern PTR -mmalloc PARAMS ((PTR, long)); +extern int inside_entry_func PARAMS ((CORE_ADDR)); -extern PTR -mrealloc PARAMS ((PTR, PTR, long)); +extern int inside_entry_file PARAMS ((CORE_ADDR addr)); -extern void -mfree PARAMS ((PTR, PTR)); +extern int inside_main_func PARAMS ((CORE_ADDR pc)); -extern int -mmalloc_setkey PARAMS ((PTR, int, PTR)); +/* From ch-lang.c, for the moment. (FIXME) */ -extern PTR -mmalloc_getkey PARAMS ((PTR, int)); +extern char *chill_demangle PARAMS ((const char *)); /* From utils.c */ -extern int -strcmp_iw PARAMS ((const char *, const char *)); +extern void notice_quit PARAMS ((void)); + +extern int strcmp_iw PARAMS ((const char *, const char *)); -extern char * -safe_strerror PARAMS ((int)); +extern char *safe_strerror PARAMS ((int)); -extern char * -safe_strsignal PARAMS ((int)); +extern char *safe_strsignal PARAMS ((int)); -extern void -init_malloc PARAMS ((void *)); +extern void init_malloc PARAMS ((void *)); -extern void -request_quit PARAMS ((int)); +extern void request_quit PARAMS ((int)); -extern void -do_cleanups PARAMS ((struct cleanup *)); +extern void do_cleanups PARAMS ((struct cleanup *)); +extern void do_final_cleanups PARAMS ((struct cleanup *)); +extern void do_my_cleanups PARAMS ((struct cleanup **, struct cleanup *)); -extern void -discard_cleanups PARAMS ((struct cleanup *)); +extern void discard_cleanups PARAMS ((struct cleanup *)); +extern void discard_final_cleanups PARAMS ((struct cleanup *)); +extern void discard_my_cleanups PARAMS ((struct cleanup **, struct cleanup *)); /* The bare make_cleanup function is one of those rare beasts that takes almost any type of function as the first arg and anything that @@ -187,148 +251,195 @@ make_cleanup PARAMS ((void (*function) (void *), void *)); since the type actually passed when the function is called would be wrong. */ +extern struct cleanup *make_cleanup (); extern struct cleanup * -make_cleanup (); - +make_final_cleanup PARAMS ((void (*function) (void *), void *)); extern struct cleanup * -save_cleanups PARAMS ((void)); +make_my_cleanup PARAMS ((struct cleanup **, void (*function) (void *), void *)); -extern void -restore_cleanups PARAMS ((struct cleanup *)); +extern struct cleanup *save_cleanups PARAMS ((void)); +extern struct cleanup *save_final_cleanups PARAMS ((void)); +extern struct cleanup *save_my_cleanups PARAMS ((struct cleanup **)); -extern void -free_current_contents PARAMS ((char **)); +extern void restore_cleanups PARAMS ((struct cleanup *)); +extern void restore_final_cleanups PARAMS ((struct cleanup *)); +extern void restore_my_cleanups PARAMS ((struct cleanup **, struct cleanup *)); -extern void -null_cleanup PARAMS ((char **)); +extern void free_current_contents PARAMS ((char **)); -extern int -myread PARAMS ((int, char *, int)); +extern void null_cleanup PARAMS ((PTR)); -extern int -query (); +extern int myread PARAMS ((int, char *, int)); -extern void -begin_line PARAMS ((void)); +extern int query PARAMS((char *, ...)) + ATTR_FORMAT(printf, 1, 2); -extern void -wrap_here PARAMS ((char *)); +/* From demangle.c */ -extern void -reinitialize_more_filter PARAMS ((void)); +extern void set_demangling_style PARAMS ((char *)); -extern int -print_insn PARAMS ((CORE_ADDR, FILE *)); + +/* Annotation stuff. */ + +extern int annotation_level; /* in stack.c */ + +extern void begin_line PARAMS ((void)); + +extern void wrap_here PARAMS ((char *)); + +extern void reinitialize_more_filter PARAMS ((void)); + +typedef FILE GDB_FILE; +#define gdb_stdout stdout +#define gdb_stderr stderr + +extern void gdb_flush PARAMS ((GDB_FILE *)); + +extern GDB_FILE *gdb_fopen PARAMS ((char * name, char * mode)); + +extern void fputs_filtered PARAMS ((const char *, GDB_FILE *)); + +extern void fputs_unfiltered PARAMS ((const char *, GDB_FILE *)); + +extern int fputc_unfiltered PARAMS ((int c, GDB_FILE *)); + +extern int putchar_unfiltered PARAMS ((int c)); + +extern void puts_filtered PARAMS ((const char *)); + +extern void puts_unfiltered PARAMS ((const char *)); + +extern void vprintf_filtered PARAMS ((const char *, va_list)) + ATTR_FORMAT(printf, 1, 0); + +extern void vfprintf_filtered PARAMS ((FILE *, const char *, va_list)) + ATTR_FORMAT(printf, 2, 0); + +extern void fprintf_filtered PARAMS ((FILE *, const char *, ...)) + ATTR_FORMAT(printf, 2, 3); + +extern void fprintfi_filtered PARAMS ((int, FILE *, const char *, ...)) + ATTR_FORMAT(printf, 3, 4); -extern void -fputs_filtered PARAMS ((const char *, FILE *)); +extern void printf_filtered PARAMS ((const char *, ...)) + ATTR_FORMAT(printf, 1, 2); -extern void -puts_filtered PARAMS ((char *)); +extern void printfi_filtered PARAMS ((int, const char *, ...)) + ATTR_FORMAT(printf, 2, 3); -extern void -vprintf_filtered (); +extern void vprintf_unfiltered PARAMS ((const char *, va_list)) + ATTR_FORMAT(printf, 1, 0); -extern void -vfprintf_filtered (); +extern void vfprintf_unfiltered PARAMS ((FILE *, const char *, va_list)) + ATTR_FORMAT(printf, 2, 0); -extern void -fprintf_filtered (); +extern void fprintf_unfiltered PARAMS ((FILE *, const char *, ...)) + ATTR_FORMAT(printf, 2, 3); -extern void -fprintfi_filtered (); +extern void printf_unfiltered PARAMS ((const char *, ...)) + ATTR_FORMAT(printf, 1, 2); -extern void -printf_filtered (); +extern void print_spaces PARAMS ((int, GDB_FILE *)); -extern void -printfi_filtered (); +extern void print_spaces_filtered PARAMS ((int, GDB_FILE *)); -extern void -print_spaces PARAMS ((int, FILE *)); +extern char *n_spaces PARAMS ((int)); -extern void -print_spaces_filtered PARAMS ((int, FILE *)); +extern void gdb_printchar PARAMS ((int, GDB_FILE *, int)); -extern char * -n_spaces PARAMS ((int)); +extern void gdb_print_address PARAMS ((void *, GDB_FILE *)); -extern void -gdb_printchar PARAMS ((int, FILE *, int)); +typedef bfd_vma t_addr; +typedef bfd_vma t_reg; +extern char* paddr PARAMS ((t_addr addr)); -extern void -fprintf_symbol_filtered PARAMS ((FILE *, char *, enum language, int)); +extern char* preg PARAMS ((t_reg reg)); -extern void -perror_with_name PARAMS ((char *)); +extern char* paddr_nz PARAMS ((t_addr addr)); -extern void -print_sys_errmsg PARAMS ((char *, int)); +extern char* preg_nz PARAMS ((t_reg reg)); -/* From regex.c */ +extern void fprintf_symbol_filtered PARAMS ((GDB_FILE *, char *, + enum language, int)); -extern char * -re_comp PARAMS ((char *)); +extern NORETURN void perror_with_name PARAMS ((char *)) ATTR_NORETURN; + +extern void print_sys_errmsg PARAMS ((char *, int)); + +/* From regex.c or libc. BSD 4.4 declares this with the argument type as + "const char *" in unistd.h, so we can't declare the argument + as "char *". */ + +extern char *re_comp PARAMS ((const char *)); /* From symfile.c */ -extern void -symbol_file_command PARAMS ((char *, int)); +extern void symbol_file_command PARAMS ((char *, int)); -/* From main.c */ +/* From top.c */ -extern char * -skip_quoted PARAMS ((char *)); +extern char *skip_quoted PARAMS ((char *)); -extern char * -gdb_readline PARAMS ((char *)); +extern char *gdb_readline PARAMS ((char *)); -extern char * -command_line_input PARAMS ((char *, int)); +extern char *command_line_input PARAMS ((char *, int, char *)); -extern void -print_prompt PARAMS ((void)); +extern void print_prompt PARAMS ((void)); -extern int -batch_mode PARAMS ((void)); +extern int input_from_terminal_p PARAMS ((void)); -extern int -input_from_terminal_p PARAMS ((void)); +extern int info_verbose; /* From printcmd.c */ -extern void -set_next_address PARAMS ((CORE_ADDR)); +extern void set_next_address PARAMS ((CORE_ADDR)); + +extern void print_address_symbolic PARAMS ((CORE_ADDR, GDB_FILE *, int, + char *)); -extern void -print_address_symbolic PARAMS ((CORE_ADDR, FILE *, int, char *)); +extern void print_address_numeric PARAMS ((CORE_ADDR, int, GDB_FILE *)); -extern void -print_address PARAMS ((CORE_ADDR, FILE *)); +extern void print_address PARAMS ((CORE_ADDR, GDB_FILE *)); /* From source.c */ -extern int -openp PARAMS ((char *, int, char *, int, int, char **)); +extern int openp PARAMS ((char *, int, char *, int, int, char **)); + +extern void mod_path PARAMS ((char *, char **)); -extern void -mod_path PARAMS ((char *, char **)); +extern void directory_command PARAMS ((char *, int)); -extern void -directory_command PARAMS ((char *, int)); +extern void init_source_path PARAMS ((void)); -extern void -init_source_path PARAMS ((void)); +extern char *symtab_to_filename PARAMS ((struct symtab *)); /* From findvar.c */ -extern int -read_relative_register_raw_bytes PARAMS ((int, char *)); +extern int read_relative_register_raw_bytes PARAMS ((int, char *)); /* From readline (but not in any readline .h files). */ -extern char * -tilde_expand PARAMS ((char *)); +extern char *tilde_expand PARAMS ((char *)); + +/* Control types for commands */ + +enum misc_command_type +{ + ok_command, + end_command, + else_command, + nop_command +}; + +enum command_control_type +{ + simple_control, + break_control, + continue_control, + while_control, + if_control, + invalid_control +}; /* Structure for saved commands lines (for breakpoints, defined commands, etc). */ @@ -337,13 +448,14 @@ struct command_line { struct command_line *next; char *line; + enum command_control_type control_type; + int body_count; + struct command_line **body_list; }; -extern struct command_line * -read_command_lines PARAMS ((void)); +extern struct command_line *read_command_lines PARAMS ((char *, int)); -extern void -free_command_lines PARAMS ((struct command_line **)); +extern void free_command_lines PARAMS ((struct command_line **)); /* String containing the current directory (what getwd would return). */ @@ -378,6 +490,11 @@ enum val_prettyprint #include "nm.h" +/* Target machine definition. This will be a symlink to one of the + tm-*.h files, built by the `configure' script. */ + +#include "tm.h" + /* If the xm.h file did not define the mode string used to open the files, assume that binary files are opened the same way as text files */ @@ -385,23 +502,21 @@ enum val_prettyprint #include "fopen-same.h" #endif +/* Microsoft C can't deal with const pointers */ + +#ifdef _MSC_VER +#define CONST_PTR +#else +#define CONST_PTR const +#endif + /* - * Allow things in gdb to be declared "const". If compiling ANSI, it - * just works. If compiling with gcc but non-ansi, redefine to __const__. - * If non-ansi, non-gcc, then eliminate "const" entirely, making those + * Allow things in gdb to be declared "volatile". If compiling ANSI, it + * just works. If compiling with gcc but non-ansi, redefine to __volatile__. + * If non-ansi, non-gcc, then eliminate "volatile" entirely, making those * objects be read-write rather than read-only. */ -#ifndef const -#ifndef __STDC__ -# ifdef __GNUC__ -# define const __const__ -# else -# define const /*nothing*/ -# endif /* GNUC */ -#endif /* STDC */ -#endif /* const */ - #ifndef volatile #ifndef __STDC__ # ifdef __GNUC__ @@ -412,33 +527,8 @@ enum val_prettyprint #endif /* STDC */ #endif /* volatile */ -#if 1 -#define NORETURN /*nothing*/ -#else /* not 1 */ -/* FIXME: This is bogus. Having "volatile void" mean a function doesn't - return is a gcc extension and should be based on #ifdef __GNUC__. - Also, as of Sep 93 I'm told gcc is changing the syntax for ansi - reasons (so declaring exit here as "volatile void" and as "void" in - a system header loses). Using the new "__attributes__ ((noreturn));" - syntax would lose for old versions of gcc; using - typedef void exit_fn_type PARAMS ((int)); - volatile exit_fn_type exit; - would win. */ -/* Some compilers (many AT&T SVR4 compilers for instance), do not accept - declarations of functions that never return (exit for instance) as - "volatile void". For such compilers "NORETURN" can be defined away - to keep them happy */ - -#ifndef NORETURN -# ifdef __lucid -# define NORETURN /*nothing*/ -# else -# define NORETURN volatile -# endif -#endif -#endif /* not 1 */ - -/* Defaults for system-wide constants (if not defined by xm.h, we fake it). */ +/* Defaults for system-wide constants (if not defined by xm.h, we fake it). + FIXME: Assumes 2's complement arithmetic */ #if !defined (UINT_MAX) #define UINT_MAX ((unsigned int)(~0)) /* 0xFFFFFFFF for 32-bits */ @@ -449,7 +539,7 @@ enum val_prettyprint #endif #if !defined (INT_MIN) -#define INT_MIN (-INT_MAX - 1) /* 0x80000000 for 32-bits */ +#define INT_MIN ((int)((int) ~0 ^ INT_MAX)) /* 0x80000000 for 32-bits */ #endif #if !defined (ULONG_MAX) @@ -460,178 +550,86 @@ enum val_prettyprint #define LONG_MAX ((long)(ULONG_MAX >> 1)) /* 0x7FFFFFFF for 32-bits */ #endif -/* Number of bits in a char or unsigned char for the target machine. - Just like CHAR_BIT in but describes the target machine. */ -#if !defined (TARGET_CHAR_BIT) -#define TARGET_CHAR_BIT 8 -#endif - -/* Number of bits in a short or unsigned short for the target machine. */ -#if !defined (TARGET_SHORT_BIT) -#define TARGET_SHORT_BIT (sizeof (short) * TARGET_CHAR_BIT) -#endif - -/* Number of bits in an int or unsigned int for the target machine. */ -#if !defined (TARGET_INT_BIT) -#define TARGET_INT_BIT (sizeof (int) * TARGET_CHAR_BIT) -#endif - -/* Number of bits in a long or unsigned long for the target machine. */ -#if !defined (TARGET_LONG_BIT) -#define TARGET_LONG_BIT (sizeof (long) * TARGET_CHAR_BIT) -#endif - -/* Number of bits in a long long or unsigned long long for the target machine. */ -#if !defined (TARGET_LONG_LONG_BIT) -#define TARGET_LONG_LONG_BIT (2 * TARGET_LONG_BIT) -#endif - -/* Number of bits in a float for the target machine. */ -#if !defined (TARGET_FLOAT_BIT) -#define TARGET_FLOAT_BIT (sizeof (float) * TARGET_CHAR_BIT) -#endif - -/* Number of bits in a double for the target machine. */ -#if !defined (TARGET_DOUBLE_BIT) -#define TARGET_DOUBLE_BIT (sizeof (double) * TARGET_CHAR_BIT) -#endif - -/* Number of bits in a long double for the target machine. */ -#if !defined (TARGET_LONG_DOUBLE_BIT) -#define TARGET_LONG_DOUBLE_BIT (2 * TARGET_DOUBLE_BIT) -#endif - -/* Number of bits in a "complex" for the target machine. */ -#if !defined (TARGET_COMPLEX_BIT) -#define TARGET_COMPLEX_BIT (2 * TARGET_FLOAT_BIT) -#endif - -/* Number of bits in a "double complex" for the target machine. */ -#if !defined (TARGET_DOUBLE_COMPLEX_BIT) -#define TARGET_DOUBLE_COMPLEX_BIT (2 * TARGET_DOUBLE_BIT) -#endif +#ifndef LONGEST -/* Number of bits in a pointer for the target machine */ -#if !defined (TARGET_PTR_BIT) -#define TARGET_PTR_BIT TARGET_INT_BIT -#endif +#ifdef BFD64 -/* Default to support for "long long" if the host compiler being used is gcc. - Config files must define CC_HAS_LONG_LONG to use other host compilers - that are capable of supporting "long long", and to cause gdb to use that - support. Not defining CC_HAS_LONG_LONG will suppress use of "long long" - regardless of what compiler is used. +/* This is to make sure that LONGEST is at least as big as CORE_ADDR. */ - FIXME: For now, automatic selection of "long long" as the default when - gcc is used is disabled, pending further testing. Concerns include the - impact on gdb performance and the universality of bugfree long long - support on platforms that do have gcc. Compiling with FORCE_LONG_LONG - will select "long long" use for testing purposes. -fnf */ +#define LONGEST BFD_HOST_64_BIT +#define ULONGEST BFD_HOST_U_64_BIT -#ifndef CC_HAS_LONG_LONG -# if defined (__GNUC__) && defined (FORCE_LONG_LONG) /* See FIXME above */ -# define CC_HAS_LONG_LONG 1 -# endif -#endif - -/* LONGEST should not be a typedef, because "unsigned LONGEST" needs to work. - CC_HAS_LONG_LONG is defined if the host compiler supports "long long" - variables and we wish to make use of that support. */ +#else /* No BFD64 */ -#ifndef LONGEST # ifdef CC_HAS_LONG_LONG # define LONGEST long long +# define ULONGEST unsigned long long # else -# define LONGEST long +/* BFD_HOST_64_BIT is defined for some hosts that don't have long long + (e.g. i386-windows) so try it. */ +# ifdef BFD_HOST_64_BIT +# define LONGEST BFD_HOST_64_BIT +# define ULONGEST BFD_HOST_U_64_BIT +# else +# define LONGEST long +# define ULONGEST unsigned long +# endif # endif -#endif + +#endif /* No BFD64 */ + +#endif /* ! LONGEST */ /* Convert a LONGEST to an int. This is used in contexts (e.g. number of arguments to a function, number in a value history, register number, etc.) where the value must not be larger than can fit in an int. */ -#ifndef longest_to_int -# ifdef CC_HAS_LONG_LONG -# define longest_to_int(x) (((x) > INT_MAX || (x) < INT_MIN) \ - ? (error ("Value out of range."),0) : (int) (x)) -# else - /* Assume sizeof (int) == sizeof (long). */ -# define longest_to_int(x) ((int) (x)) -# endif -#endif - -/* If we picked up a copy of CHAR_BIT from a configuration file - (which may get it by including ) then use it to set - the number of bits in a host char. If not, use the same size - as the target. */ - -#if defined (CHAR_BIT) -#define HOST_CHAR_BIT CHAR_BIT -#else -#define HOST_CHAR_BIT TARGET_CHAR_BIT -#endif +extern int longest_to_int PARAMS ((LONGEST)); /* Assorted functions we can declare, now that const and volatile are defined. */ -extern char * -savestring PARAMS ((const char *, int)); - -extern char * -msavestring PARAMS ((void *, const char *, int)); +extern char *savestring PARAMS ((const char *, int)); -extern char * -strsave PARAMS ((const char *)); +extern char *msavestring PARAMS ((void *, const char *, int)); -extern char * -mstrsave PARAMS ((void *, const char *)); +extern char *strsave PARAMS ((const char *)); -extern char * -concat PARAMS ((char *, ...)); +extern char *mstrsave PARAMS ((void *, const char *)); -extern PTR -xmalloc PARAMS ((long)); +#ifdef _MSC_VER /* FIXME; was long, but this causes compile errors in msvc if already defined */ +extern PTR xmmalloc PARAMS ((PTR, size_t)); -extern PTR -xrealloc PARAMS ((PTR, long)); +extern PTR xmrealloc PARAMS ((PTR, PTR, size_t)); +#else +extern PTR xmmalloc PARAMS ((PTR, long)); -extern PTR -xmmalloc PARAMS ((PTR, long)); +extern PTR xmrealloc PARAMS ((PTR, PTR, long)); +#endif -extern PTR -xmrealloc PARAMS ((PTR, PTR, long)); +extern int parse_escape PARAMS ((char **)); -extern PTR -mmalloc PARAMS ((PTR, long)); +extern char *reg_names[]; -extern PTR -mrealloc PARAMS ((PTR, PTR, long)); +/* Message to be printed before the error message, when an error occurs. */ -extern void -mfree PARAMS ((PTR, PTR)); +extern char *error_pre_print; -extern int -mmcheck PARAMS ((PTR, void (*) (void))); +/* Message to be printed before the error message, when an error occurs. */ -extern int -mmtrace PARAMS ((void)); +extern char *quit_pre_print; -extern int -parse_escape PARAMS ((char **)); +/* Message to be printed before the warning message, when a warning occurs. */ -extern const char * const reg_names[]; +extern char *warning_pre_print; -extern NORETURN void /* Does not return to the caller. */ -error (); +extern NORETURN void error PARAMS((const char *, ...)) ATTR_NORETURN; -extern NORETURN void /* Does not return to the caller. */ -fatal (); +extern void error_begin PARAMS ((void)); -extern NORETURN void /* Not specified as volatile in ... */ -exit PARAMS ((int)); /* 4.10.4.3 */ +extern NORETURN void fatal PARAMS((char *, ...)) ATTR_NORETURN; -extern NORETURN void /* Does not return to the caller. */ -nomem PARAMS ((long)); +extern NORETURN void nomem PARAMS ((long)) ATTR_NORETURN; /* Reasons for calling return_to_top_level. */ enum return_reason { @@ -647,150 +645,101 @@ enum return_reason { #define RETURN_MASK_ALL (RETURN_MASK_QUIT | RETURN_MASK_ERROR) typedef int return_mask; -extern NORETURN void /* Does not return to the caller. */ -return_to_top_level PARAMS ((enum return_reason)); - -extern int catch_errors PARAMS ((int (*) (char *), void *, char *, - return_mask)); - -extern void -warning_setup PARAMS ((void)); - -extern void -warning (); - -/* Global functions from other, non-gdb GNU thingies (libiberty for - instance) */ - -extern char * -basename PARAMS ((char *)); - -extern char * -getenv PARAMS ((const char *)); - -extern char ** -buildargv PARAMS ((char *)); - -extern void -freeargv PARAMS ((char **)); - -extern char * -strerrno PARAMS ((int)); - -extern char * -strsigno PARAMS ((int)); +extern NORETURN void +return_to_top_level PARAMS ((enum return_reason)) ATTR_NORETURN; extern int -errno_max PARAMS ((void)); +catch_errors PARAMS ((int (*) (char *), void *, char *, return_mask)); -extern int -signo_max PARAMS ((void)); +extern void warning_begin PARAMS ((void)); -extern int -strtoerrno PARAMS ((char *)); +extern void warning PARAMS ((const char *, ...)) + ATTR_FORMAT(printf, 1, 2); -extern int -strtosigno PARAMS ((char *)); +/* Global functions from other, non-gdb GNU thingies. + Libiberty thingies are no longer declared here. We include libiberty.h + above, instead. */ -extern char * -strsignal PARAMS ((int)); +#ifndef GETENV_PROVIDED +extern char *getenv PARAMS ((const char *)); +#endif /* From other system libraries */ -#ifndef PSIGNAL_IN_SIGNAL_H -extern void -psignal PARAMS ((unsigned, const char *)); +#ifdef HAVE_STDDEF_H +#include #endif -/* For now, we can't include because it conflicts with - "../include/getopt.h". (FIXME) - - However, if a function is defined in the ANSI C standard and a prototype - for that function is defined and visible in any header file in an ANSI - conforming environment, then that prototype must match the definition in - the ANSI standard. So we can just duplicate them here without conflict, - since they must be the same in all conforming ANSI environments. If - these cause problems, then the environment is not ANSI conformant. */ - -#ifdef __STDC__ -#include +#ifdef HAVE_STDLIB_H +#if defined(_MSC_VER) && !defined(__cplusplus) +/* msvc defines these in stdlib.h for c code */ +#undef min +#undef max +#endif +#include +#endif +#ifndef min +#define min(a, b) ((a) < (b) ? (a) : (b)) +#endif +#ifndef max +#define max(a, b) ((a) > (b) ? (a) : (b)) #endif -extern int -fclose PARAMS ((FILE *stream)); /* 4.9.5.1 */ -extern void -perror PARAMS ((const char *)); /* 4.9.10.4 */ +/* We take the address of fclose later, but some stdio's forget + to declare this. We can't always declare it since there's + no way to declare the parameters without upsetting some compiler + somewhere. */ -extern double -atof PARAMS ((const char *nptr)); /* 4.10.1.1 */ +#ifndef FCLOSE_PROVIDED +extern int fclose PARAMS ((FILE *)); +#endif -extern int -atoi PARAMS ((const char *)); /* 4.10.1.2 */ +#ifndef atof +extern double atof PARAMS ((const char *)); /* X3.159-1989 4.10.1.1 */ +#endif #ifndef MALLOC_INCOMPATIBLE -extern PTR -malloc PARAMS ((size_t size)); /* 4.10.3.3 */ - -extern PTR -realloc PARAMS ((void *ptr, size_t size)); /* 4.10.3.4 */ - -extern void -free PARAMS ((void *)); /* 4.10.3.2 */ - -#endif /* MALLOC_INCOMPATIBLE */ - -extern void -qsort PARAMS ((void *base, size_t nmemb, /* 4.10.5.2 */ - size_t size, - int (*comp)(const void *, const void *))); - -#ifndef MEM_FNS_DECLARED /* Some non-ANSI use void *, not char *. */ -extern PTR -memcpy PARAMS ((void *, const void *, size_t)); /* 4.11.2.1 */ - -extern int -memcmp PARAMS ((const void *, const void *, size_t)); /* 4.11.4.1 */ +#ifdef NEED_DECLARATION_MALLOC +extern PTR malloc (); #endif -extern char * -strchr PARAMS ((const char *, int)); /* 4.11.5.2 */ - -extern char * -strrchr PARAMS ((const char *, int)); /* 4.11.5.5 */ - -extern char * -strstr PARAMS ((const char *, const char *)); /* 4.11.5.7 */ - -extern char * -strtok PARAMS ((char *, const char *)); /* 4.11.5.8 */ +#ifdef NEED_DECLARATION_REALLOC +extern PTR realloc (); +#endif -#ifndef MEM_FNS_DECLARED /* Some non-ANSI use void *, not char *. */ -extern PTR -memset PARAMS ((void *, int, size_t)); /* 4.11.6.1 */ +#ifdef NEED_DECLARATION_FREE +extern void free (); #endif -extern char * -strerror PARAMS ((int)); /* 4.11.6.2 */ +#endif /* MALLOC_INCOMPATIBLE */ /* Various possibilities for alloca. */ #ifndef alloca # ifdef __GNUC__ # define alloca __builtin_alloca -# else +# else /* Not GNU C */ # ifdef sparc # include /* NOTE: Doesn't declare alloca() */ # endif -# ifdef __STDC__ - extern void *alloca (size_t); -# else /* __STDC__ */ + +/* We need to be careful not to declare this in a way which conflicts with + bison. Bison never declares it as char *, but under various circumstances + (like __hpux) we need to use void *. */ +# if defined (__STDC__) || defined (__hpux) + extern void *alloca (); +# else /* Don't use void *. */ extern char *alloca (); -# endif -# endif -#endif +# endif /* Don't use void *. */ +# endif /* Not GNU C */ +#endif /* alloca not defined */ -/* TARGET_BYTE_ORDER and HOST_BYTE_ORDER must be defined to one of these. */ +/* HOST_BYTE_ORDER must be defined to one of these. */ + +#ifdef HAVE_ENDIAN_H +#include +#endif #if !defined (BIG_ENDIAN) #define BIG_ENDIAN 4321 @@ -802,16 +751,92 @@ strerror PARAMS ((int)); /* 4.11.6.2 */ /* Target-system-dependent parameters for GDB. */ -/* Target machine definition. This will be a symlink to one of the - tm-*.h files, built by the `configure' script. */ +#ifdef TARGET_BYTE_ORDER_SELECTABLE +/* The target endianness is selectable at runtime. Define + TARGET_BYTE_ORDER to be a variable. The user can use the `set + endian' command to change it. */ +#undef TARGET_BYTE_ORDER +#define TARGET_BYTE_ORDER target_byte_order +extern int target_byte_order; +/* Nonzero when target_byte_order auto-detected */ +extern int target_byte_order_auto; +#endif -#include "tm.h" +extern void set_endian_from_file PARAMS ((bfd *)); + +/* The target architecture can be set at run-time. */ +extern int target_architecture_auto; +extern const bfd_arch_info_type *target_architecture; +extern void set_architecture_from_file PARAMS ((bfd *)); +/* Notify target of a change to the selected architecture. Zero return + status indicates that the target did not like the change. */ +extern int (*target_architecture_hook) PARAMS ((const bfd_arch_info_type *ap)); +extern void set_architecture PARAMS ((char *arg, int from_tty)); + +/* Number of bits in a char or unsigned char for the target machine. + Just like CHAR_BIT in but describes the target machine. */ +#if !defined (TARGET_CHAR_BIT) +#define TARGET_CHAR_BIT 8 +#endif + +/* Number of bits in a short or unsigned short for the target machine. */ +#if !defined (TARGET_SHORT_BIT) +#define TARGET_SHORT_BIT (2 * TARGET_CHAR_BIT) +#endif + +/* Number of bits in an int or unsigned int for the target machine. */ +#if !defined (TARGET_INT_BIT) +#define TARGET_INT_BIT (4 * TARGET_CHAR_BIT) +#endif + +/* Number of bits in a long or unsigned long for the target machine. */ +#if !defined (TARGET_LONG_BIT) +#define TARGET_LONG_BIT (4 * TARGET_CHAR_BIT) +#endif + +/* Number of bits in a long long or unsigned long long for the target machine. */ +#if !defined (TARGET_LONG_LONG_BIT) +#define TARGET_LONG_LONG_BIT (2 * TARGET_LONG_BIT) +#endif + +/* Number of bits in a float for the target machine. */ +#if !defined (TARGET_FLOAT_BIT) +#define TARGET_FLOAT_BIT (4 * TARGET_CHAR_BIT) +#endif + +/* Number of bits in a double for the target machine. */ +#if !defined (TARGET_DOUBLE_BIT) +#define TARGET_DOUBLE_BIT (8 * TARGET_CHAR_BIT) +#endif + +/* Number of bits in a long double for the target machine. */ +#if !defined (TARGET_LONG_DOUBLE_BIT) +#define TARGET_LONG_DOUBLE_BIT (2 * TARGET_DOUBLE_BIT) +#endif + +/* Number of bits in a pointer for the target machine */ +#if !defined (TARGET_PTR_BIT) +#define TARGET_PTR_BIT TARGET_INT_BIT +#endif + +/* If we picked up a copy of CHAR_BIT from a configuration file + (which may get it by including ) then use it to set + the number of bits in a host char. If not, use the same size + as the target. */ + +#if defined (CHAR_BIT) +#define HOST_CHAR_BIT CHAR_BIT +#else +#define HOST_CHAR_BIT TARGET_CHAR_BIT +#endif /* The bit byte-order has to do just with numbering of bits in debugging symbols and such. Conceptually, it's quite separate from byte/word byte order. */ #if !defined (BITS_BIG_ENDIAN) +#ifndef TARGET_BYTE_ORDER_SELECTABLE + #if TARGET_BYTE_ORDER == BIG_ENDIAN #define BITS_BIG_ENDIAN 1 #endif /* Big endian. */ @@ -819,64 +844,136 @@ strerror PARAMS ((int)); /* 4.11.6.2 */ #if TARGET_BYTE_ORDER == LITTLE_ENDIAN #define BITS_BIG_ENDIAN 0 #endif /* Little endian. */ -#endif /* BITS_BIG_ENDIAN not defined. */ -/* Swap LEN bytes at BUFFER between target and host byte-order. This is - the wrong way to do byte-swapping because it assumes that you have a way - to have a host variable of exactly the right size. - extract_* are the right way. */ -#if TARGET_BYTE_ORDER == HOST_BYTE_ORDER -#define SWAP_TARGET_AND_HOST(buffer,len) -#else /* Target and host byte order differ. */ -#define SWAP_TARGET_AND_HOST(buffer,len) \ - { \ - char tmp; \ - char *p = (char *)(buffer); \ - char *q = ((char *)(buffer)) + len - 1; \ - for (; p < q; p++, q--) \ - { \ - tmp = *q; \ - *q = *p; \ - *p = tmp; \ - } \ - } -#endif /* Target and host byte order differ. */ +#else /* defined (TARGET_BYTE_ORDER_SELECTABLE) */ + +#define BITS_BIG_ENDIAN (TARGET_BYTE_ORDER == BIG_ENDIAN) + +#endif /* defined (TARGET_BYTE_ORDER_SELECTABLE) */ +#endif /* BITS_BIG_ENDIAN not defined. */ /* In findvar.c. */ -LONGEST extract_signed_integer PARAMS ((void *, int)); -unsigned LONGEST extract_unsigned_integer PARAMS ((void *, int)); -CORE_ADDR extract_address PARAMS ((void *, int)); -void store_signed_integer PARAMS ((void *, int, LONGEST)); -void store_unsigned_integer PARAMS ((void *, int, unsigned LONGEST)); -void store_address PARAMS ((void *, int, CORE_ADDR)); +extern LONGEST extract_signed_integer PARAMS ((void *, int)); + +extern ULONGEST extract_unsigned_integer PARAMS ((void *, int)); + +extern int extract_long_unsigned_integer PARAMS ((void *, int, LONGEST *)); + +extern CORE_ADDR extract_address PARAMS ((void *, int)); + +extern void store_signed_integer PARAMS ((void *, int, LONGEST)); + +extern void store_unsigned_integer PARAMS ((void *, int, ULONGEST)); + +extern void store_address PARAMS ((void *, int, CORE_ADDR)); + +/* Setup definitions for host and target floating point formats. We need to + consider the format for `float', `double', and `long double' for both target + and host. We need to do this so that we know what kind of conversions need + to be done when converting target numbers to and from the hosts DOUBLEST + data type. */ + +/* This is used to indicate that we don't know the format of the floating point + number. Typically, this is useful for native ports, where the actual format + is irrelevant, since no conversions will be taking place. */ + +extern const struct floatformat floatformat_unknown; + +#if HOST_BYTE_ORDER == BIG_ENDIAN +# ifndef HOST_FLOAT_FORMAT +# define HOST_FLOAT_FORMAT &floatformat_ieee_single_big +# endif +# ifndef HOST_DOUBLE_FORMAT +# define HOST_DOUBLE_FORMAT &floatformat_ieee_double_big +# endif +#else /* LITTLE_ENDIAN */ +# ifndef HOST_FLOAT_FORMAT +# define HOST_FLOAT_FORMAT &floatformat_ieee_single_little +# endif +# ifndef HOST_DOUBLE_FORMAT +# define HOST_DOUBLE_FORMAT &floatformat_ieee_double_little +# endif +#endif + +#ifndef HOST_LONG_DOUBLE_FORMAT +#define HOST_LONG_DOUBLE_FORMAT &floatformat_unknown +#endif + +#ifndef TARGET_BYTE_ORDER_SELECTABLE +# if TARGET_BYTE_ORDER == BIG_ENDIAN +# ifndef TARGET_FLOAT_FORMAT +# define TARGET_FLOAT_FORMAT &floatformat_ieee_single_big +# endif +# ifndef TARGET_DOUBLE_FORMAT +# define TARGET_DOUBLE_FORMAT &floatformat_ieee_double_big +# endif +# else /* LITTLE_ENDIAN */ +# ifndef TARGET_FLOAT_FORMAT +# define TARGET_FLOAT_FORMAT &floatformat_ieee_single_little +# endif +# ifndef TARGET_DOUBLE_FORMAT +# define TARGET_DOUBLE_FORMAT &floatformat_ieee_double_little +# endif +# endif +#else /* TARGET_BYTE_ORDER_SELECTABLE */ +# ifndef TARGET_FLOAT_FORMAT +# define TARGET_FLOAT_FORMAT (target_byte_order == BIG_ENDIAN \ + ? &floatformat_ieee_single_big \ + : &floatformat_ieee_single_little) +# endif +# ifndef TARGET_DOUBLE_FORMAT +# define TARGET_DOUBLE_FORMAT (target_byte_order == BIG_ENDIAN \ + ? &floatformat_ieee_double_big \ + : &floatformat_ieee_double_little) +# endif +#endif + +#ifndef TARGET_LONG_DOUBLE_FORMAT +# define TARGET_LONG_DOUBLE_FORMAT &floatformat_unknown +#endif + +/* Use `long double' if the host compiler supports it. (Note that this is not + necessarily any longer than `double'. On SunOS/gcc, it's the same as + double.) This is necessary because GDB internally converts all floating + point values to the widest type supported by the host. + + There are problems however, when the target `long double' is longer than the + host's `long double'. In general, we'll probably reduce the precision of + any such values and print a warning. */ + +#ifdef HAVE_LONG_DOUBLE +typedef long double DOUBLEST; +#else +typedef double DOUBLEST; +#endif + +extern void floatformat_to_doublest PARAMS ((const struct floatformat *, + char *, DOUBLEST *)); +extern void floatformat_from_doublest PARAMS ((const struct floatformat *, + DOUBLEST *, char *)); +extern DOUBLEST extract_floating PARAMS ((void *, int)); + +extern void store_floating PARAMS ((void *, int, DOUBLEST)); /* On some machines there are bits in addresses which are not really part of the address, but are used by the kernel, the hardware, etc. for special purposes. ADDR_BITS_REMOVE takes out any such bits so we get a "real" address such as one would find in a symbol - table. ADDR_BITS_SET sets those bits the way the system wants - them. This is used only for addresses of instructions, and even then + table. This is used only for addresses of instructions, and even then I'm not sure it's used in all contexts. It exists to deal with there being a few stray bits in the PC which would mislead us, not as some sort - of generic thing to handle alignment or segmentation. */ + of generic thing to handle alignment or segmentation (it's possible it + should be in TARGET_READ_PC instead). */ #if !defined (ADDR_BITS_REMOVE) #define ADDR_BITS_REMOVE(addr) (addr) -#define ADDR_BITS_SET(addr) (addr) #endif /* No ADDR_BITS_REMOVE. */ /* From valops.c */ -extern CORE_ADDR -push_bytes PARAMS ((CORE_ADDR, char *, int)); +extern CORE_ADDR push_bytes PARAMS ((CORE_ADDR, char *, int)); -/* In some modules, we don't have a definition of REGISTER_TYPE yet, so we - must avoid prototyping this function for now. FIXME. Should be: -extern CORE_ADDR -push_word PARAMS ((CORE_ADDR, REGISTER_TYPE)); - */ -extern CORE_ADDR -push_word (); +extern CORE_ADDR push_word PARAMS ((CORE_ADDR, ULONGEST)); /* Some parts of gdb might be considered optional, in the sense that they are not essential for being able to build a working, usable debugger @@ -893,4 +990,107 @@ push_word (); #define MAINTENANCE_CMDS 1 #endif -#endif /* !defined (DEFS_H) */ +#ifdef MAINTENANCE_CMDS +extern int watchdog; +#endif + +#include "dis-asm.h" /* Get defs for disassemble_info */ + +extern int dis_asm_read_memory PARAMS ((bfd_vma memaddr, bfd_byte *myaddr, + int len, disassemble_info *info)); + +extern void dis_asm_memory_error PARAMS ((int status, bfd_vma memaddr, + disassemble_info *info)); + +extern void dis_asm_print_address PARAMS ((bfd_vma addr, + disassemble_info *info)); + +extern int (*tm_print_insn) PARAMS ((bfd_vma, disassemble_info*)); +extern disassemble_info tm_print_insn_info; + +/* Hooks for alternate command interfaces. */ + +#ifdef __STDC__ +struct target_waitstatus; +struct cmd_list_element; +#endif + +extern void (*init_ui_hook) PARAMS ((char *argv0)); +extern void (*command_loop_hook) PARAMS ((void)); +extern void (*fputs_unfiltered_hook) PARAMS ((const char *linebuffer, + FILE *stream)); +extern void (*print_frame_info_listing_hook) PARAMS ((struct symtab *s, + int line, int stopline, + int noerror)); +extern int (*query_hook) PARAMS ((const char *, va_list)); +extern void (*flush_hook) PARAMS ((FILE *stream)); +extern void (*create_breakpoint_hook) PARAMS ((struct breakpoint *b)); +extern void (*delete_breakpoint_hook) PARAMS ((struct breakpoint *bpt)); +extern void (*modify_breakpoint_hook) PARAMS ((struct breakpoint *bpt)); +extern void (*target_output_hook) PARAMS ((char *)); +extern void (*interactive_hook) PARAMS ((void)); +extern void (*registers_changed_hook) PARAMS ((void)); +extern void (*readline_begin_hook) PARAMS ((char *, ...)); +extern char * (*readline_hook) PARAMS ((char *)); +extern void (*readline_end_hook) PARAMS ((void)); + +extern int (*target_wait_hook) PARAMS ((int pid, + struct target_waitstatus *status)); + +extern void (*call_command_hook) PARAMS ((struct cmd_list_element *c, + char *cmd, int from_tty)); + +extern NORETURN void (*error_hook) PARAMS ((void)) ATTR_NORETURN; + + + +/* Inhibit window interface if non-zero. */ + +extern int use_windows; + +/* Symbolic definitions of filename-related things. */ +/* FIXME, this doesn't work very well if host and executable + filesystems conventions are different. */ + +#ifndef DIRNAME_SEPARATOR +#define DIRNAME_SEPARATOR ':' +#endif + +#ifndef SLASH_P +#if defined(__GO32__)||defined(_WIN32) +#define SLASH_P(X) ((X)=='\\') +#else +#define SLASH_P(X) ((X)=='/') +#endif +#endif + +#ifndef SLASH_CHAR +#if defined(__GO32__)||defined(_WIN32) +#define SLASH_CHAR '\\' +#else +#define SLASH_CHAR '/' +#endif +#endif + +#ifndef SLASH_STRING +#if defined(__GO32__)||defined(_WIN32) +#define SLASH_STRING "\\" +#else +#define SLASH_STRING "/" +#endif +#endif + +#ifndef ROOTED_P +#define ROOTED_P(X) (SLASH_P((X)[0])) +#endif + +/* On some systems, PIDGET is defined to extract the inferior pid from + an internal pid that has the thread id and pid in seperate bit + fields. If not defined, then just use the entire internal pid as + the actual pid. */ + +#ifndef PIDGET +#define PIDGET(pid) (pid) +#endif + +#endif /* #ifndef DEFS_H */