diff options
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/infcmd.c | 104 | ||||
-rw-r--r-- | gdb/inflow.c | 5 | ||||
-rw-r--r-- | gdb/infptrace.c | 11 | ||||
-rw-r--r-- | gdb/main.c | 117 | ||||
-rw-r--r-- | gdb/solib.c | 21 |
5 files changed, 139 insertions, 119 deletions
diff --git a/gdb/infcmd.c b/gdb/infcmd.c index f387ba0..7f35a2b 100644 --- a/gdb/infcmd.c +++ b/gdb/infcmd.c @@ -1,28 +1,27 @@ -/* Memory-access and commands for inferior process, for GDB. - Copyright (C) 1986, 1987, 1988, 1989 Free Software Foundation, Inc. +/* Memory-access and commands for "inferior" (child) process, for GDB. + Copyright 1986, 1987, 1988, 1989, 1991, 1992 Free Software Foundation, Inc. This file is part of GDB. -GDB is free software; you can redistribute it and/or modify +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 1, or (at your option) -any later version. +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. -GDB is distributed in the hope that it will be useful, +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 GDB; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ +along with this program; if not, write to the Free Software +Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include <stdio.h> #include <signal.h> #include <sys/param.h> #include <string.h> #include "defs.h" -#include "param.h" #include "symtab.h" #include "frame.h" #include "inferior.h" @@ -149,7 +148,7 @@ run_command (args, from_tty) !query ("The program being debugged has been started already.\n\ Start it from the beginning? ")) error ("Program not restarted."); - target_kill ((char *)0, 0); + target_kill (); } exec_file = (char *) get_exec_file (0); @@ -161,7 +160,7 @@ Start it from the beginning? ")) if (args) { char *cmd; - cmd = concat ("set args ", args, ""); + cmd = concat ("set args ", args, NULL); make_cleanup (free, cmd); execute_command (cmd, from_tty); } @@ -356,8 +355,7 @@ jump_command (arg, from_tty) if (sal.symtab == 0 && sal.pc == 0) error ("No source file has been specified."); - if (sal.pc == 0) - sal.pc = find_line_pc (sal.symtab, sal.line); + resolve_sal_pc (&sal); /* May error out */ { struct symbol *fn = get_frame_function (get_current_frame ()); @@ -368,13 +366,10 @@ jump_command (arg, from_tty) error ("Not confirmed."); } - if (sal.pc == 0) - error ("No line %d in file \"%s\".", sal.line, sal.symtab->filename); - addr = ADDR_BITS_SET (sal.pc); if (from_tty) - printf ("Continuing at 0x%x.\n", addr); + printf ("Continuing at %s.\n", local_hex_string(addr)); clear_proceed_status (); proceed (addr, 0, 0); @@ -419,7 +414,7 @@ signal_command (signum_exp, from_tty) returns to its caller with that frame already gone. Otherwise, the caller never gets returned to. */ -/* 4 => return instead of letting the stack dummy run. */ +/* DEBUG HOOK: 4 => return instead of letting the stack dummy run. */ static int stack_dummy_testing = 0; @@ -554,10 +549,12 @@ finish_command (arg, from_tty) fi = get_frame_info (selected_frame); function = find_pc_function (fi->pc); + /* Print info on the selected frame, including level number + but not source. */ if (from_tty) { - printf ("Run till exit from "); - print_selected_frame (); + printf_filtered ("Run till exit from "); + print_stack_frame (selected_frame, selected_frame_level, 0); } proceed_to_finish = 1; /* We want stop_registers, please... */ @@ -584,9 +581,9 @@ finish_command (arg, from_tty) value_type, BLOCK_GCC_COMPILED (SYMBOL_BLOCK_VALUE (function)))); - printf ("Value returned is $%d = ", record_latest_value (val)); + printf_filtered ("Value returned is $%d = ", record_latest_value (val)); value_print (val, stdout, 0, Val_no_prettyprint); - putchar ('\n'); + printf_filtered ("\n"); } } @@ -606,7 +603,7 @@ program_info (args, from_tty) } target_files_info (); - printf ("Program stopped at 0x%x.\n", stop_pc); + printf ("Program stopped at %s.\n", local_hex_string(stop_pc)); if (stop_step) printf ("It stopped after being stepped.\n"); else if (num != 0) @@ -787,31 +784,38 @@ write_pc (val) char *reg_names[] = REGISTER_NAMES; /* Print out the machine register regnum. If regnum is -1, - print all registers. + print all registers (fpregs == 1) or all non-float registers + (fpregs == 0). + For most machines, having all_registers_info() print the register(s) one per line is good enough. If a different format - is required, (eg, for SPARC or Pyramid 90x, which both have + is required, (eg, for MIPS or Pyramid 90x, which both have lots of regs), or there is an existing convention for showing - all the registers, define the macro DO_REGISTERS_INFO(regnum) + all the registers, define the macro DO_REGISTERS_INFO(regnum, fp) to provide that format. */ + #if !defined (DO_REGISTERS_INFO) -#define DO_REGISTERS_INFO(regnum) do_registers_info(regnum) -static void do_registers_info (regnum) +#define DO_REGISTERS_INFO(regnum, fp) do_registers_info(regnum, fp) +static void +do_registers_info (regnum, fpregs) int regnum; + int fpregs; { register int i; - if (regnum == -1) - printf_filtered ( - "Register Contents (relative to selected stack frame)\n\n"); - for (i = 0; i < NUM_REGS; i++) { char raw_buffer[MAX_REGISTER_RAW_SIZE]; char virtual_buffer[MAX_REGISTER_VIRTUAL_SIZE]; - if (regnum != -1 && i != regnum) - continue; + /* Decide between printing all regs, nonfloat regs, or specific reg. */ + if (regnum == -1) { + if (TYPE_CODE (REGISTER_VIRTUAL_TYPE (i)) == TYPE_CODE_FLT && !fpregs) + continue; + } else { + if (i != regnum) + continue; + } fputs_filtered (reg_names[i], stdout); print_spaces_filtered (15 - strlen (reg_names[i]), stdout); @@ -873,8 +877,9 @@ static void do_registers_info (regnum) #endif /* no DO_REGISTERS_INFO. */ static void -registers_info (addr_exp) +registers_info (addr_exp, fpregs) char *addr_exp; + int fpregs; { int regnum; @@ -900,7 +905,21 @@ registers_info (addr_exp) else regnum = -1; - DO_REGISTERS_INFO(regnum); + DO_REGISTERS_INFO(regnum, fpregs); +} + +static void +all_registers_info (addr_exp) + char *addr_exp; +{ + registers_info (addr_exp, 1); +} + +static void +nofp_registers_info (addr_exp) + char *addr_exp; +{ + registers_info (addr_exp, 0); } /* @@ -1022,12 +1041,13 @@ This path is equivalent to the $PATH shell variable. It is a list of\n\ directories, separated by colons. These directories are searched to find\n\ fully linked executable files and separately compiled object files as needed."); - add_info ("path", path_info, + c = add_cmd ("paths", no_class, path_info, "Current search path for finding object files.\n\ $cwd in the path means the current working directory.\n\ This path is equivalent to the $PATH shell variable. It is a list of\n\ directories, separated by colons. These directories are searched to find\n\ -fully linked executable files and separately compiled object files as needed."); +fully linked executable files and separately compiled object files as needed.", &showlist); + c->completer = noop_completer; add_com ("attach", class_run, attach_command, "Attach to a process or file outside of GDB.\n\ @@ -1100,8 +1120,12 @@ To cancel previous arguments and run with no arguments,\n\ use \"set args\" without arguments."); add_com_alias ("r", "run", class_run, 1); - add_info ("registers", registers_info, - "List of registers and their contents, for selected stack frame.\n\ + add_info ("registers", nofp_registers_info, + "List of integer registers and their contents, for selected stack frame.\n\ +Register name as argument means describe only that register."); + + add_info ("all-registers", all_registers_info, +"List of all registers and their contents, for selected stack frame.\n\ Register name as argument means describe only that register."); add_info ("program", program_info, diff --git a/gdb/inflow.c b/gdb/inflow.c index 332584c..22b4968 100644 --- a/gdb/inflow.c +++ b/gdb/inflow.c @@ -1,5 +1,5 @@ /* Low level interface to ptrace, for GDB when running under Unix. - Copyright (C) 1986, 1987, 1989, 1991 Free Software Foundation, Inc. + Copyright 1986, 1987, 1989, 1991, 1992 Free Software Foundation, Inc. This file is part of GDB. @@ -35,7 +35,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include <fcntl.h> #include <sys/param.h> -#include <sys/dir.h> #include <signal.h> extern char *strerror(); /* strings corresponding to errno */ @@ -418,7 +417,7 @@ kill_command (arg, from_tty) error ("The program is not being run."); if (!query ("Kill the inferior process? ")) error ("Not confirmed."); - target_kill (arg, from_tty); + target_kill (); /* Killing off the inferior can leave us with a core file. If so, print the state we are left in. */ diff --git a/gdb/infptrace.c b/gdb/infptrace.c index f7f1f4f..3c26c87 100644 --- a/gdb/infptrace.c +++ b/gdb/infptrace.c @@ -1,5 +1,5 @@ /* Low level Unix child interface to ptrace, for GDB when running under Unix. - Copyright (C) 1988, 1989, 1990, 1991 Free Software Foundation, Inc. + Copyright 1988, 1989, 1990, 1991, 1992 Free Software Foundation, Inc. This file is part of GDB. @@ -55,7 +55,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #endif #include "gdbcore.h" +#ifndef NO_SYS_FILE #include <sys/file.h> +#endif #include <sys/stat.h> #if !defined (FETCH_INFERIOR_REGISTERS) @@ -93,9 +95,7 @@ kill_inferior_fast () } void -kill_inferior (args, from_tty) - char *args; - int from_tty; +kill_inferior () { kill_inferior_fast (); target_mourn_inferior (); @@ -166,7 +166,6 @@ detach (signal) #if defined (KERNEL_U_ADDR_BSD) /* Get kernel_u_addr using BSD-style nlist(). */ CORE_ADDR kernel_u_addr; -#include <a.out.h> /* For struct nlist */ void _initialize_kernel_u_addr () @@ -357,7 +356,7 @@ child_xfer_memory (memaddr, myaddr, len, write, target) char *myaddr; int len; int write; - struct target_ops target; /* ignored */ + struct target_ops *target; /* ignored */ { register int i; /* Round starting address down to longword boundary. */ @@ -1,5 +1,5 @@ /* Top level `main' program for GDB, the GNU debugger. - Copyright 1986, 1987, 1988, 1989, 1990, 1991 Free Software Foundation, Inc. + Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992 Free Software Foundation, Inc. This file is part of GDB. @@ -43,7 +43,9 @@ int fclose (); #endif #include <string.h> +#ifndef NO_SYS_FILE #include <sys/file.h> +#endif #include <setjmp.h> #include <sys/param.h> #include <sys/stat.h> @@ -82,6 +84,10 @@ extern char *error_pre_print; extern char lang_frame_mismatch_warn[]; /* language.c */ +/* Whether GDB's stdin is on a terminal. */ + +extern int gdb_has_a_terminal; /* inflow.c */ + /* Flag for whether we want all the "from_tty" gubbish printed. */ int caution = 1; /* Default is yes, sigh. */ @@ -383,33 +389,40 @@ main (argc, argv) with no equivalent). */ static struct option long_options[] = { - {"quiet", 0, &quiet, 1}, - {"nx", 0, &inhibit_gdbinit, 1}, - {"batch", 0, &batch, 1}, - {"epoch", 0, &epoch_interface, 1}, - {"fullname", 0, &frame_file_full_name, 1}, - {"help", 0, &print_help, 1}, - {"se", 1, 0, 10}, - {"symbols", 1, 0, 's'}, - {"s", 1, 0, 's'}, - {"exec", 1, 0, 'e'}, - {"core", 1, 0, 'c'}, - {"c", 1, 0, 'c'}, - {"command", 1, 0, 'x'}, - {"x", 1, 0, 'x'}, - {"directory", 1, 0, 'd'}, - {"cd", 1, 0, 11}, - {"tty", 1, 0, 't'}, - {"b", 1, 0, 'b'}, + {"quiet", no_argument, &quiet, 1}, + {"q", no_argument, &quiet, 1}, + {"nx", no_argument, &inhibit_gdbinit, 1}, + {"n", no_argument, &inhibit_gdbinit, 1}, + {"batch", no_argument, &batch, 1}, + {"epoch", no_argument, &epoch_interface, 1}, + {"fullname", no_argument, &frame_file_full_name, 1}, + {"f", no_argument, &frame_file_full_name, 1}, + {"help", no_argument, &print_help, 1}, + {"se", required_argument, 0, 10}, + {"symbols", required_argument, 0, 's'}, + {"s", required_argument, 0, 's'}, + {"exec", required_argument, 0, 'e'}, + {"e", required_argument, 0, 'e'}, + {"core", required_argument, 0, 'c'}, + {"c", required_argument, 0, 'c'}, + {"command", required_argument, 0, 'x'}, + {"x", required_argument, 0, 'x'}, + {"directory", required_argument, 0, 'd'}, + {"cd", required_argument, 0, 11}, + {"tty", required_argument, 0, 't'}, + {"baud", required_argument, 0, 'b'}, + {"b", required_argument, 0, 'b'}, /* Allow machine descriptions to add more options... */ #ifdef ADDITIONAL_OPTIONS ADDITIONAL_OPTIONS #endif - {0, 0, 0, 0}, + {0, no_argument, 0, 0}, }; while (1) { + int option_index; + c = getopt_long_only (argc, argv, "", long_options, &option_index); if (c == EOF) @@ -739,7 +752,7 @@ execute_command (p, from_tty) register struct cmd_list_element *c; register struct command_line *cmdlines; register enum language flang; - static struct language_defn *saved_language = 0; + static const struct language_defn *saved_language = 0; static int warned = 0; free_all_values (); @@ -791,7 +804,7 @@ execute_command (p, from_tty) { if (language_mode == language_mode_auto) { if (saved_language) - language_info (); + language_info (1); /* Print what changed. */ } saved_language = current_language; warned = 0; @@ -1613,7 +1626,7 @@ static void print_gdb_version () { printf_filtered ("\ -GDB %s, Copyright 1991 Free Software Foundation, Inc.", +GDB %s, Copyright 1992 Free Software Foundation, Inc.", version); } @@ -1648,7 +1661,7 @@ quit_command (args, from_tty) { if (query ("The program is running. Quit anyway? ")) { - target_kill (args, from_tty); + target_kill (); } else error ("Not confirmed."); @@ -1659,10 +1672,13 @@ quit_command (args, from_tty) exit (0); } +/* Returns whether GDB is running on a terminal and whether the user + desires that questions be asked of them on that terminal. */ + int input_from_terminal_p () { - return (instream == stdin) & caution; + return gdb_has_a_terminal && (instream == stdin) & caution; } /* ARGSUSED */ @@ -1699,6 +1715,9 @@ cd_command (dir, from_tty) dir = tilde_expand (dir); make_cleanup (free, dir); + if (chdir (dir) < 0) + perror_with_name (dir); + len = strlen (dir); dir = savestring (dir, len - (len > 1 && dir[len-1] == '/')); if (dir[0] == '/') @@ -1738,9 +1757,6 @@ cd_command (dir, from_tty) } } - if (chdir (dir) < 0) - perror_with_name (dir); - forget_cached_source_info (); if (from_tty) @@ -1843,21 +1859,6 @@ show_commands (args, from_tty) struct _hist_entry *history_get(); extern int history_base; -#if 0 - /* This is all reported by individual "show" commands. */ - printf_filtered ("Interactive command editing is %s.\n", - command_editing_p ? "on" : "off"); - - printf_filtered ("History expansion of command input is %s.\n", - history_expansion_p ? "on" : "off"); - printf_filtered ("Writing of a history record upon exit is %s.\n", - write_history_p ? "enabled" : "disabled"); - printf_filtered ("The size of the history list (number of stored commands) is %d.\n", - history_size); - printf_filtered ("The name of the history record is \"%s\".\n\n", - history_filename ? history_filename : ""); -#endif /* 0 */ - /* Print out some of the commands from the command history. */ /* First determine the length of the history list. */ hist_len = history_size; @@ -1879,7 +1880,7 @@ show_commands (args, from_tty) /* "info editing <exp>" should print around command number <exp>. */ num = (parse_and_eval_address (args) - history_base) - Hist_print / 2; } - /* "info editing" means print the last Hist_print commands. */ + /* "show commands" means print the last Hist_print commands. */ else { num = hist_len - Hist_print; @@ -1897,14 +1898,6 @@ show_commands (args, from_tty) num = 0; } -#if 0 - /* No need for a header now that "info editing" only prints one thing. */ - if (num == hist_len - Hist_print) - printf_filtered ("The list of the last %d commands is:\n\n", Hist_print); - else - printf_filtered ("Some of the stored commands are:\n\n"); -#endif /* 0 */ - for (offset = num; offset < num + Hist_print && offset < hist_len; offset++) { printf_filtered ("%5d %s\n", history_base + offset, @@ -1916,8 +1909,8 @@ show_commands (args, from_tty) num += Hist_print; /* If the user repeats this command with return, it should do what - "info editing +" does. This is unnecessary if arg is null, - because "info editing +" is not useful after "info editing". */ + "show commands +" does. This is unnecessary if arg is null, + because "show commands +" is not useful after "show commands". */ if (from_tty && args) { args[0] = '+'; @@ -2153,9 +2146,10 @@ when gdb is started."); add_show_from_set (add_set_cmd ("editing", class_support, var_boolean, (char *)&command_editing_p, - "Set command line editing.\n\ + "Set editing of command lines as they are typed.\n\ Use \"on\" to enable to enable the editing, and \"off\" to disable it.\n\ -Without an argument, command line editing is enabled.", &setlist), +Without an argument, command line editing is enabled. To edit, use\n\ +EMACS-like or VI-like commands like control-P or ESC.", &setlist), &showlist); add_prefix_cmd ("history", class_support, set_history, @@ -2198,19 +2192,22 @@ ie. the number of previous commands to keep a record of.", &sethistlist); &showlist); add_prefix_cmd ("info", class_info, info_command, - "Generic command for printing status.", + "Generic command for showing things about the program being debugged.", &infolist, "info ", 0, &cmdlist); add_com_alias ("i", "info", class_info, 1); add_prefix_cmd ("show", class_info, show_command, - "Generic command for showing things set with \"set\".", + "Generic command for showing things about the debugger.", &showlist, "show ", 0, &cmdlist); /* Another way to get at the same thing. */ add_info ("set", show_command, "Show all GDB settings."); - add_cmd ("commands", no_class, show_commands, "Status of command editor.", + add_cmd ("commands", no_class, show_commands, + "Show the the history of commands you typed.\n\ +You can supply a command number to start with, or a `+' to start after\n\ +the previous command number shown.", &showlist); add_cmd ("version", no_class, show_version, - "Report what version of GDB this is.", &showlist); + "Show what version of GDB this is.", &showlist); } diff --git a/gdb/solib.c b/gdb/solib.c index 276a5b8..e9bd549 100644 --- a/gdb/solib.c +++ b/gdb/solib.c @@ -1,5 +1,5 @@ /* Handle SunOS and SVR4 shared libraries for GDB, the GNU Debugger. - Copyright 1990, 1991 Free Software Foundation, Inc. + Copyright 1990, 1991, 1992 Free Software Foundation, Inc. This file is part of GDB. @@ -573,8 +573,9 @@ find_solib (so_list_ptr) (for the inferior executable) since it is not a shared object. */ if (LM_NAME (new) != 0) { - (void) target_read_string((CORE_ADDR) LM_NAME (new), new -> so_name, - MAX_PATH_SIZE - 1); + if (!target_read_string((CORE_ADDR) LM_NAME (new), new -> so_name, + MAX_PATH_SIZE - 1)) + error ("find_solib: Can't read pathname for load map\n"); new -> so_name[MAX_PATH_SIZE - 1] = 0; solib_map_sections (new); } @@ -669,20 +670,20 @@ solib_add (arg_string, from_tty, target) if (count) { /* Reallocate the target's section table including the new size. */ - if (target -> sections) + if (target -> to_sections) { - old = target -> sections_end - target -> sections; - target -> sections = (struct section_table *) - realloc ((char *)target -> sections, + old = target -> to_sections_end - target -> to_sections; + target -> to_sections = (struct section_table *) + realloc ((char *)target -> to_sections, (sizeof (struct section_table)) * (count + old)); } else { old = 0; - target -> sections = (struct section_table *) + target -> to_sections = (struct section_table *) malloc ((sizeof (struct section_table)) * count); } - target -> sections_end = target -> sections + (count + old); + target -> to_sections_end = target -> to_sections + (count + old); /* Add these section table entries to the target's table. */ while ((so = find_solib (so)) != NULL) @@ -690,7 +691,7 @@ solib_add (arg_string, from_tty, target) if (so -> so_name[0]) { count = so -> sections_end - so -> sections; - bcopy (so -> sections, (char *)(target -> sections + old), + bcopy (so -> sections, (char *)(target -> to_sections + old), (sizeof (struct section_table)) * count); old += count; } |