* gdb.base/help.exp: Allow Win32 child process.
[deliverable/binutils-gdb.git] / gdb / macroscope.c
index 083dc1f4e4a818e15b5730e6285abdeaf87a3299..19557d7dc082296c243f510b32e02080706af636 100644 (file)
 #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
@@ -42,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;
 }
@@ -66,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.  */
This page took 0.02709 seconds and 4 git commands to generate.