* breakpoint.c, core.c, exec.c, language.c, main.c, printcmd.c,
authorStu Grossman <grossman@cygnus>
Tue, 15 Sep 1992 06:27:18 +0000 (06:27 +0000)
committerStu Grossman <grossman@cygnus>
Tue, 15 Sep 1992 06:27:18 +0000 (06:27 +0000)
symfile.c, target.c, valprint.c:  Use _filtered form of *printf.
defs.h, utils.c:  Make vfprintf_filtered global.

gdb/ChangeLog
gdb/breakpoint.c
gdb/core.c
gdb/defs.h
gdb/exec.c
gdb/language.c
gdb/main.c
gdb/symfile.c
gdb/target.c
gdb/utils.c

index f849f44..8cf1319 100644 (file)
@@ -1,5 +1,9 @@
 Mon Sep 14 19:20:43 1992  Stu Grossman  (grossman at cygnus.com)
 
+       * breakpoint.c, core.c, exec.c, language.c, main.c, printcmd.c,
+       symfile.c, target.c, valprint.c:  Use _filtered form of *printf.
+       defs.h, utils.c:  Make vfprintf_filtered global.
+
        * energize.c (send_location):  New routine to consolidate all
        places where we must notify kernel of where the given pc is.
        (cplus_demangle):  Put single-quotes around demangled names.
index 6ae795b..95e2604 100644 (file)
@@ -445,8 +445,8 @@ insert_breakpoints ()
                b->enable = disabled;
                if (!disabled_breaks)
                  {
-                   fprintf (stderr,
-                        "Cannot insert breakpoint %d:\n", b->number);
+                   fprintf_filtered (stderr, "Cannot insert breakpoint %d:\n",
+                                     b->number);
                    printf_filtered ("Disabling shared library breakpoints:\n");
                  }
                disabled_breaks = 1;
@@ -455,10 +455,11 @@ insert_breakpoints ()
            else
 #endif
              {
-               fprintf (stderr, "Cannot insert breakpoint %d:\n", b->number);
+               fprintf_filtered (stderr, "Cannot insert breakpoint %d:\n",
+                                 b->number);
 #ifdef ONE_PROCESS_WRITETEXT
-               fprintf (stderr,
-                 "The same program may be running in another process.\n");
+               fprintf_filtered (stderr,
+                                 "The same program may be running in another process.\n");
 #endif
                memory_error (val, b->address); /* which bombs us out */
              }
@@ -478,7 +479,7 @@ remove_breakpoints ()
   int val;
 
 #ifdef BREAKPOINT_DEBUG
-  printf ("Removing breakpoints.\n");
+  printf_filtered ("Removing breakpoints.\n");
 #endif /* BREAKPOINT_DEBUG */
 
   ALL_BREAKPOINTS (b)
@@ -489,12 +490,12 @@ remove_breakpoints ()
          return val;
        b->inserted = 0;
 #ifdef BREAKPOINT_DEBUG
-       printf ("Removed breakpoint at %s",
-               local_hex_string(b->address));
-       printf (", shadow %s",
-               local_hex_string(b->shadow_contents[0]));
-       printf (", %s.\n",
-               local_hex_string(b->shadow_contents[1]));
+       printf_filtered ("Removed breakpoint at %s",
+                        local_hex_string(b->address));
+       printf_filtered (", shadow %s",
+                        local_hex_string(b->shadow_contents[0]));
+       printf_filtered (", %s.\n",
+                        local_hex_string(b->shadow_contents[1]));
 #endif /* BREAKPOINT_DEBUG */
       }
 
@@ -1141,17 +1142,18 @@ describe_other_breakpoints (pc)
       others++;
   if (others > 0)
     {
-      printf ("Note: breakpoint%s ", (others > 1) ? "s" : "");
+      printf_filtered ("Note: breakpoint%s ", (others > 1) ? "s" : "");
       ALL_BREAKPOINTS (b)
        if (b->address == pc)
          {
            others--;
-           printf ("%d%s%s ",
-                   b->number,
-                   (b->enable == disabled) ? " (disabled)" : "",
-                   (others > 1) ? "," : ((others == 1) ? " and" : ""));
+           printf_filtered ("%d%s%s ",
+                            b->number,
+                            (b->enable == disabled) ? " (disabled)" : "",
+                            (others > 1) ? "," :
+                              ((others == 1) ? " and" : ""));
          }
-      printf ("also set at pc %s.\n", local_hex_string(pc));
+      printf_filtered ("also set at pc %s.\n", local_hex_string(pc));
     }
 }
 \f
@@ -1550,8 +1552,8 @@ break_command_1 (arg, tempflag, from_tty)
 
   if (sals.nelts > 1)
     {
-      printf ("Multiple breakpoints were set.\n");
-      printf ("Use the \"delete\" command to delete unwanted breakpoints.\n");
+      printf_filtered ("Multiple breakpoints were set.\n");
+      printf_filtered ("Use the \"delete\" command to delete unwanted breakpoints.\n");
     }
   free ((PTR)sals.sals);
 }
@@ -1769,7 +1771,7 @@ map_catch_names (args, function)
          goto win;
        }
 #endif
-      printf ("No catch clause for exception %s.\n", p);
+      printf_filtered ("No catch clause for exception %s.\n", p);
 #if 0
     win:
 #endif
@@ -1970,16 +1972,18 @@ catch_command_1 (arg, tempflag, from_tty)
       b->enable = enabled;
       b->disposition = tempflag ? delete : donttouch;
 
-      printf ("Breakpoint %d at %s", b->number, local_hex_string(b->address));
+      printf_filtered ("Breakpoint %d at %s", b->number,
+                      local_hex_string(b->address));
       if (b->symtab)
-       printf (": file %s, line %d.", b->symtab->filename, b->line_number);
-      printf ("\n");
+       printf_filtered (": file %s, line %d.",
+                        b->symtab->filename, b->line_number);
+      printf_filtered ("\n");
     }
 
   if (sals.nelts > 1)
     {
-      printf ("Multiple breakpoints were set.\n");
-      printf ("Use the \"delete\" command to delete unwanted breakpoints.\n");
+      printf_filtered ("Multiple breakpoints were set.\n");
+      printf_filtered ("Use the \"delete\" command to delete unwanted breakpoints.\n");
     }
   free ((PTR)sals.sals);
 }
@@ -2086,10 +2090,11 @@ clear_command (arg, from_tty)
        }
 
       if (found->next) from_tty = 1; /* Always report if deleted more than one */
-      if (from_tty) printf ("Deleted breakpoint%s ", found->next ? "s" : "");
+      if (from_tty) printf_filtered ("Deleted breakpoint%s ",
+                                    found->next ? "s" : "");
       while (found)
        {
-         if (from_tty) printf ("%d ", found->number);
+         if (from_tty) printf_filtered ("%d ", found->number);
          b1 = found->next;
          delete_breakpoint (found);
          found = b1;
@@ -2144,7 +2149,7 @@ delete_breakpoint (bpt)
     free ((PTR)bpt->addr_string);
 
   if (xgdb_verbose && bpt->type == bp_breakpoint)
-    printf ("breakpoint #%d deleted\n", bpt->number);
+    printf_filtered ("breakpoint #%d deleted\n", bpt->number);
 
   /* Be sure no bpstat's are pointing at it after it's been freed.  */
   /* FIXME, how can we find all bpstat's?  We just check stop_bpstat for now. */
@@ -2257,19 +2262,14 @@ breakpoint_re_set ()
   
   /* If we have no current source symtab, and we have any breakpoints,
      go through the work of making a source context.  */
-  if (current_source_symtab == NULL)
+  if (current_source_symtab == NULL && breakpoint_chain != 0)
     {
-      ALL_BREAKPOINTS (b)
-      {
-       select_source_symtab (NULL);
-       break;                          /* We only care if there are any, and
-                                          don't need to do it N times.  */
-      }
+      select_source_symtab (NULL);
     }
 
   ALL_BREAKPOINTS_SAFE (b, temp)
     {
-      sprintf (message, message1, b->number);  /* Format possible error msg */
+      printf_filtered (message, message1, b->number);  /* Format possible error msg */
       catch_errors (breakpoint_re_set_one, (char *) b, message);
     }
 
@@ -2382,7 +2382,7 @@ map_breakpoint_numbers (args, function)
            function (b);
            goto win;
          }
-      printf ("No breakpoint number %d.\n", num);
+      printf_filtered ("No breakpoint number %d.\n", num);
     win:
       p = p1;
     }
@@ -2395,7 +2395,7 @@ enable_breakpoint (bpt)
   bpt->enable = enabled;
 
   if (xgdb_verbose && bpt->type == bp_breakpoint)
-    printf ("breakpoint #%d enabled\n", bpt->number);
+    printf_filtered ("breakpoint #%d enabled\n", bpt->number);
 
   check_duplicates (bpt->address);
   if (bpt->type == bp_watchpoint)
index 9c7d27e..032ddb9 100644 (file)
@@ -167,11 +167,11 @@ core_open (filename, from_tty)
 
   p = bfd_core_file_failing_command (core_bfd);
   if (p)
-    printf ("Core was generated by `%s'.\n", p);
+    printf_filtered ("Core was generated by `%s'.\n", p);
 
   siggy = bfd_core_file_failing_signal (core_bfd);
   if (siggy > 0)
-    printf ("Program terminated with signal %d, %s.\n", siggy,
+    printf_filtered ("Program terminated with signal %d, %s.\n", siggy,
            safe_strsignal (siggy));
 
   if (ontop) {
@@ -204,7 +204,7 @@ core_detach (args, from_tty)
     error ("Too many arguments");
   unpush_target (&core_ops);
   if (from_tty)
-    printf ("No core file now.\n");
+    printf_filtered ("No core file now.\n");
 }
 
 /* Backward compatability with old way of specifying core files.  */
@@ -405,7 +405,7 @@ get_core_registers (regno)
   else
     {
 cant:
-      fprintf (stderr, "Couldn't fetch registers from core file: %s\n",
+      fprintf_filtered (stderr, "Couldn't fetch registers from core file: %s\n",
               bfd_errmsg (bfd_error));
     }
 
@@ -422,7 +422,7 @@ cant:
       }
     else
       {
-       fprintf (stderr, "Couldn't fetch register set 2 from core file: %s\n",
+       fprintf_filtered (stderr, "Couldn't fetch register set 2 from core file: %s\n",
                 bfd_errmsg (bfd_error));
       }
   }
index d093646..a685675 100644 (file)
@@ -195,12 +195,21 @@ extern void
 puts_filtered PARAMS ((char *));
 
 extern void
+vfprintf_filtered PARAMS ((FILE *, char *, va_list));
+
+extern void
 fprintf_filtered ();
 
 extern void
+fprintfi_filtered ();
+
+extern void
 printf_filtered ();
 
 extern void
+printfi_filtered ();
+
+extern void
 print_spaces PARAMS ((int, FILE *));
 
 extern void
@@ -584,7 +593,7 @@ extern char *
 basename PARAMS ((char *));
 
 extern char *
-getenv PARAMS ((CONST char *));
+getenv PARAMS ((const char *));
 
 extern char **
 buildargv PARAMS ((char *));
index eb6a85a..79b07e4 100644 (file)
@@ -35,6 +35,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 #include <ctype.h>
 #include <sys/stat.h>
+#ifndef O_BINARY
+#define O_BINARY 0
+#endif
 
 /* Prototypes for local functions */
 
@@ -135,7 +138,7 @@ exec_file_command (args, from_tty)
       make_cleanup (free, filename);
       
       scratch_chan = openp (getenv ("PATH"), 1, filename, 
-                           write_files? O_RDWR: O_RDONLY, 0,
+                           write_files? O_RDWR|O_BINARY: O_RDONLY|O_BINARY, 0,
                            &scratch_pathname);
       if (scratch_chan < 0)
        perror_with_name (filename);
@@ -177,7 +180,7 @@ exec_file_command (args, from_tty)
        (*exec_file_display_hook) (filename);
     }
   else if (from_tty)
-    printf ("No exec file now.\n");
+    printf_filtered ("No exec file now.\n");
 }
 
 /* Set both the exec file and the symbol file, in one command.  
@@ -233,8 +236,6 @@ build_section_table (some_bfd, start, end)
   unsigned count;
 
   count = bfd_count_sections (some_bfd);
-  if (count == 0)
-    abort();   /* return 1? */
   if (*start)
     free ((PTR)*start);
   *start = (struct section_table *) xmalloc (count * sizeof (**start));
index 2ecb150..32ed779 100644 (file)
@@ -156,7 +156,7 @@ set_language_command (ignore, from_tty)
 
   /* FIXME -- do this from the list, with HELP.  */
   if (!language || !language[0]) {
-    printf("The currently understood settings are:\n\n\
+    printf_filtered ("The currently understood settings are:\n\n\
 local or auto    Automatic setting based on source file\n\
 c                Use the C language\n\
 c++              Use the C++ language\n\
@@ -204,7 +204,7 @@ show_type_command(ignore, from_tty)
    int from_tty;
 {
    if (type_check != current_language->la_type_check)
-      printf(
+      printf_filtered(
 "Warning: the current type check setting does not match the language.\n");
 }
 
@@ -250,7 +250,7 @@ show_range_command(ignore, from_tty)
 {
 
    if (range_check != current_language->la_range_check)
-      printf(
+      printf_filtered(
 "Warning: the current range check setting does not match the language.\n");
 }
 
@@ -399,11 +399,11 @@ language_info (quietly)
      int quietly;
 {
   /* FIXME:  quietly is ignored at the moment.  */
-   printf("Current Language:  %s\n",language);
+   printf_filtered("Current Language:  %s\n",language);
    show_language_command((char *)0, 1);
-   printf("Type checking:     %s\n",type);
+   printf_filtered("Type checking:     %s\n",type);
    show_type_command((char *)0, 1);
-   printf("Range checking:    %s\n",range);
+   printf_filtered("Range checking:    %s\n",range);
    show_range_command((char *)0, 1);
 }
 \f
@@ -929,14 +929,14 @@ type_error (va_alist)
    char *string;
 
    if (type_check==type_check_warn)
-      fprintf(stderr,warning_pre_print);
+      fprintf_filtered(stderr,warning_pre_print);
    else
       target_terminal_ours();
 
    va_start (args);
    string = va_arg (args, char *);
-   vfprintf (stderr, string, args);
-   fprintf (stderr, "\n");
+   vfprintf_filtered (stderr, string, args);
+   fprintf_filtered (stderr, "\n");
    va_end (args);
    if (type_check==type_check_on)
       return_to_top_level();
@@ -950,14 +950,14 @@ range_error (va_alist)
    char *string;
 
    if (range_check==range_check_warn)
-      fprintf(stderr,warning_pre_print);
+      fprintf_filtered(stderr,warning_pre_print);
    else
       target_terminal_ours();
 
    va_start (args);
    string = va_arg (args, char *);
-   vfprintf (stderr, string, args);
-   fprintf (stderr, "\n");
+   vfprintf_filtered (stderr, string, args);
+   fprintf_filtered (stderr, "\n");
    va_end (args);
    if (range_check==range_check_on)
       return_to_top_level();
@@ -986,7 +986,7 @@ set_check (ignore, from_tty)
    char *ignore;
    int from_tty;
 {
-   printf(
+   printf_filtered(
 "\"set check\" must be followed by the name of a check subcommand.\n");
    help_list(setchecklist, "set check ", -1, stdout);
 }
@@ -1007,7 +1007,7 @@ add_language (lang)
 {
   if (lang->la_magic != LANG_MAGIC)
     {
-      fprintf(stderr, "Magic number of %s language struct wrong\n",
+      fprintf_filtered(stderr, "Magic number of %s language struct wrong\n",
        lang->la_name);
       abort();
     }
index 0eb254f..5433249 100644 (file)
@@ -256,6 +256,12 @@ struct cmd_list_element *maintenancelist;
 struct cmd_list_element *maintenanceinfolist;
 #endif
 
+/* Chain containing all defined "maintenance print" subcommands. */
+
+#if MAINTENANCE_CMDS
+struct cmd_list_element *maintenanceprintlist;
+#endif
+
 struct cmd_list_element *setprintlist;
 
 struct cmd_list_element *showprintlist;
@@ -590,7 +596,7 @@ main (argc, argv)
          ADDITIONAL_OPTION_CASES
 #endif
          case '?':
-           fprintf (stderr,
+           fprintf_filtered (stderr,
                     "Use `%s +help' for a complete list of options.\n",
                     argv[0]);
            exit (1);
@@ -647,7 +653,7 @@ GDB manual (available as on-line info or a printed manual).\n", stderr);
          corearg = argv[optind];
          break;
        case 3:
-         fprintf (stderr,
+         fprintf_filtered (stderr,
                   "Excess command line arguments ignored. (%s%s)\n",
                   argv[optind], (optind == argc - 1) ? "" : " ...");
          break;
@@ -1004,7 +1010,7 @@ gdb_readline (prrompt)
 
   if (prrompt)
     {
-      printf (prrompt);
+      printf_filtered (prrompt);
       fflush (stdout);
     }
   
@@ -1048,7 +1054,16 @@ static char *history_filename;
 
 /* Variables which are necessary for fancy command line editing.  */
 char *gdb_completer_word_break_characters =
-  " \t\n!@#$%^&*()-+=|~`}{[]\"';:?/>.<,";
+  " \t\n!@#$%^&*()+=|~`}{[]\"';:?/>.<,-";
+
+/* When completing on command names, we remove '-' from the list of
+   word break characters, since we use it in command names.  If the
+   readline library sees one in any of the current completion strings,
+   it thinks that the string needs to be quoted and automatically supplies
+   a leading quote. */
+char *gdb_completer_command_word_break_characters =
+  " \t\n!@#$%^&*()+=|~`}{[]\"';:?/>.<,";
+
 /* Characters that can be used to quote completion strings.  Note that we
    can't include '"' because the gdb C parser treats such quoted sequences
    as strings. */
@@ -1112,6 +1127,16 @@ symbol_completion_function (text, matches)
       list = 0;
       index = 0;
 
+      /* Choose the default set of word break characters to break completions.
+        If we later find out that we are doing completions on command strings
+        (as opposed to strings supplied by the individual command completer
+        functions, which can be any string) then we will switch to the
+        special word break set for command strings, which leaves out the
+        '-' character used in some commands. */
+
+      rl_completer_word_break_characters =
+         gdb_completer_word_break_characters;
+
       /* Decide whether to complete on a list of gdb commands or on symbols. */
       tmp_command = (char *) alloca (rl_point + 1);
       p = tmp_command;
@@ -1146,26 +1171,17 @@ symbol_completion_function (text, matches)
        {
          /* If we didn't recognize everything up to the thing that
             needs completing, and we don't know what command it is
-            yet, we are in trouble.  Part of the trouble might be
-            that the list of delimiters used by readline includes
-            '-', which we use in commands.  Check for this.  */
+            yet, we are in trouble. */
 
          if (p + strlen(text) != tmp_command + rl_point)
            {
-             if (tmp_command[rl_point - strlen(text) - 1] == '-')
-               {
-                 text = p;
-               }
-             else
-               {
-                 /* This really should not produce an error.  Better would
-                    be to pretend to hit RETURN here; this would produce a
-                    response like "Ambiguous command: foo, foobar, etc",
-                    and leave the line available for re-entry with ^P.
-                    Instead, this error blows away the user's typed input
-                    without any way to get it back.  */
-                 error ("  Unrecognized command.");
-               }
+             /* This really should not produce an error.  Better would
+                be to pretend to hit RETURN here; this would produce a
+                response like "Ambiguous command: foo, foobar, etc",
+                and leave the line available for re-entry with ^P.
+                Instead, this error blows away the user's typed input
+                without any way to get it back.  */
+             error ("  Unrecognized command.");
            }
          
          /* He's typed something ambiguous.  This is easier.  */
@@ -1177,6 +1193,8 @@ symbol_completion_function (text, matches)
            {
              list = complete_on_cmdlist (cmdlist, text);
            }
+         rl_completer_word_break_characters =
+             gdb_completer_command_word_break_characters;
        }
       else
        {
@@ -1193,12 +1211,16 @@ symbol_completion_function (text, matches)
            {
              /* Always (might be longer versions of thie command).  */
              list = complete_on_cmdlist (result_list, text);
+             rl_completer_word_break_characters =
+                 gdb_completer_command_word_break_characters;
            }
          else if (!*p && !*text)
            {
              if (c->prefixlist)
                {
                  list = complete_on_cmdlist (*c->prefixlist, "");
+                 rl_completer_word_break_characters =
+                     gdb_completer_command_word_break_characters;
                }
              else
                {
@@ -1289,7 +1311,7 @@ int signo;
 #else
   signal (STOP_SIGNAL, stop_sig);
 #endif
-  printf ("%s", prompt);
+  printf_filtered ("%s", prompt);
   fflush (stdout);
 
   /* Forget about any previous command -- null line now will do nothing.  */
@@ -1435,7 +1457,7 @@ command_line_input (prrompt, repeat)
       if (expanded)
        {
          /* Print the changes.  */
-         printf ("%s\n", history_value);
+         printf_filtered ("%s\n", history_value);
 
          /* If there was an error, call this function again.  */
          if (expanded < 0)
@@ -1633,7 +1655,7 @@ info_command (arg, from_tty)
      char *arg;
      int from_tty;
 {
-  printf ("\"info\" must be followed by the name of an info command.\n");
+  printf_filtered ("\"info\" must be followed by the name of an info command.\n");
   help_list (infolist, "info ", -1, stdout);
 }
 
@@ -1749,7 +1771,7 @@ define_command (comname, from_tty)
 
   if (from_tty)
     {
-      printf ("Type commands for definition of \"%s\".\n\
+      printf_filtered ("Type commands for definition of \"%s\".\n\
 End with a line saying just \"end\".\n", comname);
       fflush (stdout);
     }
@@ -1782,7 +1804,7 @@ document_command (comname, from_tty)
     error ("Command \"%s\" is built-in.", comname);
 
   if (from_tty)
-    printf ("Type documentation for \"%s\".\n\
+    printf_filtered ("Type documentation for \"%s\".\n\
 End with a line saying just \"end\".\n", comname);
 
   doclines = read_command_lines ();
@@ -1813,7 +1835,7 @@ End with a line saying just \"end\".\n", comname);
 static void
 print_gnu_advertisement()
 {
-    printf ("\
+    printf_filtered ("\
 GDB is free software and you are welcome to distribute copies of it\n\
  under certain conditions; type \"show copying\" to see the conditions.\n\
 There is absolutely no warranty for GDB; type \"show warranty\" for details.\n\
@@ -1846,7 +1868,7 @@ show_version (args, from_tty)
 void
 print_prompt ()
 {
-  printf ("%s", prompt);
+  printf_filtered ("%s", prompt);
   fflush (stdout);
 }
 \f
@@ -1889,10 +1911,10 @@ pwd_command (args, from_tty)
   getcwd (dirbuf, sizeof (dirbuf));
 
   if (strcmp (dirbuf, current_directory))
-    printf ("Working directory %s\n (canonically %s).\n",
+    printf_filtered ("Working directory %s\n (canonically %s).\n",
            current_directory, dirbuf);
   else
-    printf ("Working directory %s.\n", current_directory);
+    printf_filtered ("Working directory %s.\n", current_directory);
 }
 
 static void
@@ -2129,7 +2151,7 @@ set_history (args, from_tty)
      char *args;
      int from_tty;
 {
-  printf ("\"set history\" must be followed by the name of a history subcommand.\n");
+  printf_filtered ("\"set history\" must be followed by the name of a history subcommand.\n");
   help_list (sethistlist, "set history ", -1, stdout);
 }
 
@@ -2204,6 +2226,7 @@ initialize_cmd_lists ()
 #if MAINTENANCE_CMDS
   maintenancelist = NULL;
   maintenanceinfolist = NULL;
+  maintenanceprintlist = NULL;
 #endif
   setprintlist = NULL;
   showprintlist = NULL;
index 740c4c1..21ead48 100644 (file)
@@ -332,6 +332,27 @@ init_entry_point_info (objfile)
     }
 }
 
+/* Remember the lowest-addressed loadable section we've seen.  
+   This function is called via bfd_map_over_sections.  */
+
+#if 0  /* Not used yet */
+static void
+find_lowest_section (abfd, sect, obj)
+     bfd *abfd;
+     asection *sect;
+     PTR obj;
+{
+  asection **lowest = (asection **)obj;
+
+  if (0 == (bfd_get_section_flags (abfd, sect) & SEC_LOAD))
+    return;
+  if (!*lowest)
+    *lowest = sect;            /* First loadable section */
+  else if (bfd_section_vma (abfd, *lowest) >= bfd_section_vma (abfd, sect))
+    *lowest = sect;            /* A lower loadable section */
+}
+#endif 
+
 /* Process a symbol file, as either the main file or as a dynamically
    loaded file.
 
@@ -351,7 +372,8 @@ syms_from_objfile (objfile, addr, mainline, verbo)
      int mainline;
      int verbo;
 {
-  asection *text_sect;
+  struct section_offsets *section_offsets;
+  asection *lowest_sect;
 
   /* There is a distinction between having no symbol table
      (we refuse to read the file, leaving the old set of symbols around)
@@ -382,12 +404,40 @@ syms_from_objfile (objfile, addr, mainline, verbo)
        }
 
       (*objfile -> sf -> sym_new_init) (objfile);
+    }
 
-      /* For mainline, caller didn't know the specified address of the
-         text section.  We fix that here.  */
+  /* Convert addr into an offset rather than an absolute address.
+     We find the lowest address of a loaded segment in the objfile,
+     and assume that <addr> is where that got loaded.  Due to historical
+     precedent, we warn if that doesn't happen to be the ".text"
+     segment.  */
 
-      text_sect = bfd_get_section_by_name (objfile -> obfd, ".text");
-      addr = bfd_section_vma (objfile -> obfd, text_sect);
+  if (mainline)
+    {
+      addr = 0;                /* No offset from objfile addresses.  */
+    }
+  else
+    {
+      lowest_sect = bfd_get_section_by_name (objfile->obfd, ".text");
+#if 0
+      lowest_sect = 0;
+      bfd_map_over_sections (objfile->obfd, find_lowest_section,
+                            (PTR) &lowest_sect);
+#endif
+
+      if (lowest_sect == 0)
+       warning ("no loadable sections found in added symbol-file %s",
+                objfile->name);
+      else if (0 == bfd_get_section_name (objfile->obfd, lowest_sect)
+              || 0 != strcmp(".text",
+                             bfd_get_section_name (objfile->obfd, lowest_sect)))
+       warning ("Lowest section in %s is %s at 0x%x",
+                objfile->name,
+                bfd_section_name (objfile->obfd, lowest_sect),
+                bfd_section_vma (objfile->obfd, lowest_sect));
+
+      if (lowest_sect)
+       addr -= bfd_section_vma (objfile->obfd, lowest_sect);
     }
 
   /* Initialize symbol reading routines for this objfile, allow complaints to
@@ -396,7 +446,8 @@ syms_from_objfile (objfile, addr, mainline, verbo)
 
   (*objfile -> sf -> sym_init) (objfile);
   clear_complaints (1, verbo);
-  (*objfile -> sf -> sym_read) (objfile, addr, mainline);
+  section_offsets = (*objfile -> sf -> sym_offsets) (objfile, addr);
+  (*objfile -> sf -> sym_read) (objfile, section_offsets, mainline);
 
   /* Don't allow char * to have a typename (else would get caddr_t.)  */
   /* Ditto void *.  FIXME should do this for all the builtin types.  */
@@ -491,6 +542,11 @@ symbol_file_add (name, from_tty, addr, mainline, mapped, readnow)
       && !query ("Load new symbol table from \"%s\"? ", name))
       error ("Not confirmed.");
       
+  /* Getting new symbols may change our opinion about what is
+     frameless.  */
+
+  reinit_frame_cache ();
+
   objfile = allocate_objfile (abfd, mapped);
 
   /* If the objfile uses a mapped symbol file, and we have a psymtab for
@@ -583,9 +639,11 @@ symbol_file_command (args, from_tty)
        error ("Not confirmed.");
       free_all_objfiles ();
       symfile_objfile = NULL;
+      current_source_symtab = NULL;
+      current_source_line = 0;
       if (from_tty)
        {
-         printf ("No symbol file now.\n");
+         printf_filtered ("No symbol file now.\n");
        }
     }
   else
@@ -622,9 +680,6 @@ symbol_file_command (args, from_tty)
        }
       else
        {
-         /* Getting new symbols may change our opinion about what is
-            frameless.  */
-         reinit_frame_cache ();
          symbol_file_add (name, from_tty, (CORE_ADDR)0, 1, mapped, readnow);
        }
       do_cleanups (cleanups);
@@ -798,11 +853,6 @@ add_symbol_file_command (args, from_tty)
              name, local_hex_string (text_addr)))
     error ("Not confirmed.");
 
-  /* Getting new symbols may change our opinion about what is
-     frameless.  */
-
-  reinit_frame_cache ();
-
   symbol_file_add (name, 0, text_addr, 0, mapped, readnow);
 }
 \f
@@ -1078,7 +1128,7 @@ clear_symtab_users_once ()
     return;
   clear_symtab_users_done = clear_symtab_users_queued;
 
-  printf ("Resetting debugger state after updating old symbol tables\n");
+  printf_filtered ("Resetting debugger state after updating old symbol tables\n");
 
   /* Someday, we should do better than this, by only blowing away
      the things that really need to be blown.  */
@@ -1252,10 +1302,10 @@ again2:
 
 
 struct partial_symtab *
-start_psymtab_common (objfile, addr,
+start_psymtab_common (objfile, section_offsets,
                      filename, textlow, global_syms, static_syms)
      struct objfile *objfile;
-     CORE_ADDR addr;
+     struct section_offsets *section_offsets;
      char *filename;
      CORE_ADDR textlow;
      struct partial_symbol *global_syms;
@@ -1264,7 +1314,7 @@ start_psymtab_common (objfile, addr,
   struct partial_symtab *psymtab;
 
   psymtab = allocate_psymtab (filename, objfile);
-  psymtab -> addr = addr;
+  psymtab -> section_offsets = section_offsets;
   psymtab -> textlow = textlow;
   psymtab -> texthigh = psymtab -> textlow;  /* default */
   psymtab -> globals_offset = global_syms - objfile -> global_psymbols.list;
index d253623..93bb64e 100644 (file)
@@ -123,7 +123,7 @@ add_target (t)
 {
   if (t->to_magic != OPS_MAGIC)
     {
-      fprintf(stderr, "Magic number of %s target struct wrong\n", 
+      fprintf_filtered(stderr, "Magic number of %s target struct wrong\n", 
        t->to_shortname);
       abort();
     }
@@ -202,7 +202,7 @@ default_terminal_info (args, from_tty)
      char *args;
      int from_tty;
 {
-  printf("No saved terminal information.\n");
+  printf_filtered("No saved terminal information.\n");
 }
 
 #if 0
@@ -245,7 +245,7 @@ kill_or_be_killed (from_tty)
 {
   if (target_has_execution)
     {
-      printf ("You are already running a program:\n");
+      printf_filtered ("You are already running a program:\n");
       target_files_info ();
       if (query ("Kill it? ")) {
        target_kill ();
@@ -290,7 +290,7 @@ cleanup_target (t)
      the struct definition, but not all the places that initialize one.  */
   if (t->to_magic != OPS_MAGIC)
     {
-      fprintf(stderr, "Magic number of %s target struct wrong\n", 
+      fprintf_filtered(stderr, "Magic number of %s target struct wrong\n", 
        t->to_shortname);
       abort();
     }
@@ -522,7 +522,7 @@ target_xfer_memory (memaddr, myaddr, len, write)
          /* If this address is for nonexistent memory,
             read zeros if reading, or do nothing if writing.  Return error. */
          if (!write)
-           (void) memset (myaddr, 0, len);
+           memset (myaddr, 0, len);
          if (errno == 0)
            return EIO;
          else
@@ -547,7 +547,7 @@ target_info (args, from_tty)
   int has_all_mem = 0;
   
   if (symfile_objfile != NULL)
-    printf ("Symbols from \"%s\".\n", symfile_objfile->name);
+    printf_filtered ("Symbols from \"%s\".\n", symfile_objfile->name);
 
 #ifdef FILES_INFO_HOOK
   if (FILES_INFO_HOOK ())
@@ -561,8 +561,8 @@ target_info (args, from_tty)
       if ((int)(t->to_stratum) <= (int)dummy_stratum)
        continue;
       if (has_all_mem)
-       printf("\tWhile running this, gdb does not access memory from...\n");
-      printf("%s:\n", t->to_longname);
+       printf_filtered("\tWhile running this, gdb does not access memory from...\n");
+      printf_filtered("%s:\n", t->to_longname);
       (t->to_files_info)(t);
       has_all_mem = t->to_has_all_memory;
     }
index b99e4f9..e61b3d6 100644 (file)
@@ -52,9 +52,6 @@ prompt_for_continue PARAMS ((void));
 static void 
 set_width_command PARAMS ((char *, int, struct cmd_list_element *));
 
-static void
-vfprintf_filtered PARAMS ((FILE *, char *, va_list));
-
 /* If this definition isn't overridden by the header files, assume
    that isatty and fileno exist on this system.  */
 #ifndef ISATTY
@@ -1175,7 +1172,7 @@ fputs_demangled (linebuffer, stream, arg_mode)
    (since prompt_for_continue may do so) so this routine should not be
    called when cleanups are not in place.  */
 
-static void
+void
 vfprintf_filtered (stream, format, args)
      FILE *stream;
      char *format;