2005-01-19 Andrew Cagney <cagney@gnu.org>
[deliverable/binutils-gdb.git] / gdb / macroscope.c
index 08ff6ebff58d14c5bae88cc4b6617bbad435322f..19557d7dc082296c243f510b32e02080706af636 100644 (file)
 
 #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,17 +43,37 @@ 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;
 }
@@ -65,8 +87,8 @@ default_macro_scope (void)
   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 (void)
          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.024985 seconds and 4 git commands to generate.