#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
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 *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. */
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);