aboutsummaryrefslogtreecommitdiff
path: root/gdb/macrotab.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/macrotab.c')
-rw-r--r--gdb/macrotab.c98
1 files changed, 66 insertions, 32 deletions
diff --git a/gdb/macrotab.c b/gdb/macrotab.c
index 31ca830..2e5592b 100644
--- a/gdb/macrotab.c
+++ b/gdb/macrotab.c
@@ -48,6 +48,10 @@ struct macro_table
#inclusion tree; everything else is #included from here. */
struct macro_source_file *main_source;
+ /* Compilation directory for all files of this macro table. It is allocated
+ on objfile's obstack. */
+ const char *comp_dir;
+
/* True if macros in this table can be redefined without issuing an
error. */
int redef_ok;
@@ -463,6 +467,8 @@ macro_include (struct macro_source_file *source,
the new one? */
if (*link && line == (*link)->included_at_line)
{
+ char *link_fullname, *source_fullname;
+
/* This means the compiler is emitting bogus debug info. (GCC
circa March 2002 did this.) It also means that the splay
tree ordering function, macro_tree_compare, will abort,
@@ -470,9 +476,14 @@ macro_include (struct macro_source_file *source,
should tolerate bad debug info. So:
First, squawk. */
+
+ link_fullname = macro_source_fullname (*link);
+ source_fullname = macro_source_fullname (source);
complaint (&symfile_complaints,
_("both `%s' and `%s' allegedly #included at %s:%d"),
- included, (*link)->filename, source->filename, line);
+ included, link_fullname, source_fullname, line);
+ xfree (source_fullname);
+ xfree (link_fullname);
/* Now, choose a new, unoccupied line number for this
#inclusion, after the alleged #inclusion line. */
@@ -504,22 +515,6 @@ macro_lookup_inclusion (struct macro_source_file *source, const char *name)
if (filename_cmp (name, source->filename) == 0)
return source;
- /* The filename in the source structure is probably a full path, but
- NAME could be just the final component of the name. */
- {
- int name_len = strlen (name);
- int src_name_len = strlen (source->filename);
-
- /* We do mean < here, and not <=; if the lengths are the same,
- then the filename_cmp above should have triggered, and we need to
- check for a slash here. */
- if (name_len < src_name_len
- && IS_DIR_SEPARATOR (source->filename[src_name_len - name_len - 1])
- && filename_cmp (name,
- source->filename + src_name_len - name_len) == 0)
- return source;
- }
-
/* It's not us. Try all our children, and return the lowest. */
{
struct macro_source_file *child;
@@ -730,11 +725,17 @@ check_for_redefinition (struct macro_source_file *source, int line,
if (! same)
{
+ char *source_fullname, *found_key_fullname;
+
+ source_fullname = macro_source_fullname (source);
+ found_key_fullname = macro_source_fullname (found_key->start_file);
complaint (&symfile_complaints,
_("macro `%s' redefined at %s:%d; "
"original definition at %s:%d"),
- name, source->filename, line,
- found_key->start_file->filename, found_key->start_line);
+ name, source_fullname, line, found_key_fullname,
+ found_key->start_line);
+ xfree (found_key_fullname);
+ xfree (source_fullname);
}
return found_key;
@@ -853,12 +854,17 @@ macro_undef (struct macro_source_file *source, int line,
#definition. */
if (key->end_file)
{
+ char *source_fullname, *key_fullname;
+
+ source_fullname = macro_source_fullname (source);
+ key_fullname = macro_source_fullname (key->end_file);
complaint (&symfile_complaints,
_("macro '%s' is #undefined twice,"
" at %s:%d and %s:%d"),
- name,
- source->filename, line,
- key->end_file->filename, key->end_line);
+ name, source_fullname, line, key_fullname,
+ key->end_line);
+ xfree (key_fullname);
+ xfree (source_fullname);
}
/* Whether or not we've seen a prior #undefinition, wipe out
@@ -918,8 +924,16 @@ macro_lookup_definition (struct macro_source_file *source,
splay_tree_node n = find_definition (name, source, line);
if (n)
- return fixup_definition (source->filename, line,
- (struct macro_definition *) n->value);
+ {
+ struct macro_definition *retval;
+ char *source_fullname;
+
+ source_fullname = macro_source_fullname (source);
+ retval = fixup_definition (source_fullname, line,
+ (struct macro_definition *) n->value);
+ xfree (source_fullname);
+ return retval;
+ }
else
return 0;
}
@@ -962,9 +976,13 @@ foreach_macro (splay_tree_node node, void *arg)
{
struct macro_for_each_data *datum = (struct macro_for_each_data *) arg;
struct macro_key *key = (struct macro_key *) node->key;
- struct macro_definition *def
- = fixup_definition (key->start_file->filename, key->start_line,
- (struct macro_definition *) node->value);
+ struct macro_definition *def;
+ char *key_fullname;
+
+ key_fullname = macro_source_fullname (key->start_file);
+ def = fixup_definition (key_fullname, key->start_line,
+ (struct macro_definition *) node->value);
+ xfree (key_fullname);
(*datum->fn) (key->name, def, key->start_file, key->start_line,
datum->user_data);
@@ -990,9 +1008,13 @@ foreach_macro_in_scope (splay_tree_node node, void *info)
{
struct macro_for_each_data *datum = (struct macro_for_each_data *) info;
struct macro_key *key = (struct macro_key *) node->key;
- struct macro_definition *def
- = fixup_definition (datum->file->filename, datum->line,
- (struct macro_definition *) node->value);
+ struct macro_definition *def;
+ char *datum_fullname;
+
+ datum_fullname = macro_source_fullname (datum->file);
+ def = fixup_definition (datum_fullname, datum->line,
+ (struct macro_definition *) node->value);
+ xfree (datum_fullname);
/* See if this macro is defined before the passed-in line, and
extends past that line. */
@@ -1027,8 +1049,8 @@ macro_for_each_in_scope (struct macro_source_file *file, int line,
struct macro_table *
-new_macro_table (struct obstack *obstack,
- struct bcache *b)
+new_macro_table (struct obstack *obstack, struct bcache *b,
+ const char *comp_dir)
{
struct macro_table *t;
@@ -1042,6 +1064,7 @@ new_macro_table (struct obstack *obstack,
t->obstack = obstack;
t->bcache = b;
t->main_source = NULL;
+ t->comp_dir = comp_dir;
t->redef_ok = 0;
t->definitions = (splay_tree_new_with_allocator
(macro_tree_compare,
@@ -1064,3 +1087,14 @@ free_macro_table (struct macro_table *table)
/* Free the table of macro definitions. */
splay_tree_delete (table->definitions);
}
+
+/* See macrotab.h for the comment. */
+
+char *
+macro_source_fullname (struct macro_source_file *file)
+{
+ if (file->table->comp_dir == NULL || IS_ABSOLUTE_PATH (file->filename))
+ return xstrdup (file->filename);
+
+ return concat (file->table->comp_dir, SLASH_STRING, file->filename, NULL);
+}