* remote.c (remote_write_bytes): Take a const buffer argument.
[deliverable/binutils-gdb.git] / gdb / macroscope.c
index 4441be3103f2cce2c4dcc69efe19576384de9734..748ac53600843ca17d506df60578186197685ef1 100644 (file)
@@ -1,5 +1,5 @@
 /* Functions for deciding which macros are currently in scope.
-   Copyright 2002 Free Software Foundation, Inc.
+   Copyright (C) 2002 Free Software Foundation, Inc.
    Contributed by Red Hat, Inc.
 
    This file is part of GDB.
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
 
 #include "defs.h"
 
 #include "macroscope.h"
 #include "symtab.h"
+#include "source.h"
 #include "target.h"
 #include "frame.h"
 #include "inferior.h"
+#include "complaints.h"
 
 
 struct macro_scope *
 sal_macro_scope (struct symtab_and_line sal)
 {
-  struct macro_source_file *main;
+  struct macro_source_file *main, *inclusion;
   struct macro_scope *ms;
 
   if (! sal.symtab
@@ -41,32 +43,52 @@ sal_macro_scope (struct symtab_and_line sal)
   ms = (struct macro_scope *) xmalloc (sizeof (*ms));
 
   main = macro_main (sal.symtab->macro_table);
-  ms->file = macro_lookup_inclusion (main, sal.symtab->filename);
-
-  if (! ms->file)
-    internal_error
-      (__FILE__, __LINE__,
-       "\n"
-       "the symtab `%s' refers to a preprocessor macro table which doesn't\n"
-       "have any record of processing a file by that name.\n",
-       sal.symtab->filename);
+  inclusion = macro_lookup_inclusion (main, sal.symtab->filename);
 
-  ms->line = sal.line;
+  if (inclusion)
+    {
+      ms->file = inclusion;
+      ms->line = sal.line;
+    }
+  else
+    {
+      /* There are, unfortunately, cases where a compilation unit can
+         have a symtab for a source file that doesn't appear in the
+         macro table.  For example, at the moment, Dwarf doesn't have
+         any way in the .debug_macinfo section to describe the effect
+         of #line directives, so if you debug a YACC parser you'll get
+         a macro table which only mentions the .c files generated by
+         YACC, but symtabs that mention the .y files consumed by YACC.
+
+         In the long run, we should extend the Dwarf macro info
+         representation to handle #line directives, and get GCC to
+         emit it.
+
+         For the time being, though, we'll just treat these as
+         occurring at the end of the main source file.  */
+      ms->file = main;
+      ms->line = -1;
+
+      complaint (&symfile_complaints,
+                 _("symtab found for `%s', but that file\n"
+                 "is not covered in the compilation unit's macro information"),
+                 sal.symtab->filename);
+    }
 
   return ms;
 }
 
 
 struct macro_scope *
-default_macro_scope ()
+default_macro_scope (void)
 {
   struct symtab_and_line sal;
   struct macro_source_file *main;
   struct macro_scope *ms;
 
   /* If there's a selected frame, use its PC.  */ 
-  if (selected_frame)
-    sal = find_pc_line (selected_frame->pc, 0);
+  if (deprecated_selected_frame)
+    sal = find_pc_line (get_frame_pc (deprecated_selected_frame), 0);
   
   /* If the target has any registers at all, then use its PC.  Why we
      would have registers but no stack, I'm not sure.  */
@@ -84,11 +106,14 @@ default_macro_scope ()
          evaluator to evaluate their numeric arguments.  If the
          current language is C, then that may call this function to
          choose a scope for macro expansion.  If you don't have any
-         symbol files loaded, then select_source_symtab will raise an
+         symbol files loaded, then get_current_or_default would raise an
          error.  But `set width' shouldn't raise an error just because
          it can't decide which scope to macro-expand its argument in.  */
-      sal.symtab = current_source_symtab;
-      sal.line = current_source_line;
+      struct symtab_and_line cursal = 
+                       get_current_source_symtab_and_line ();
+      
+      sal.symtab = cursal.symtab;
+      sal.line = cursal.line;
     }
 
   return sal_macro_scope (sal);
This page took 0.033424 seconds and 4 git commands to generate.