Index: gdb/macrotab.c |
diff --git a/gdb/macrotab.c b/gdb/macrotab.c |
index e65e5dc842525c081bd327dfa61c82d88daaf4a2..2e5592ba0676017863c808e5e0897c48d5ba4a10 100644 |
--- a/gdb/macrotab.c |
+++ b/gdb/macrotab.c |
@@ -1,5 +1,5 @@ |
/* C preprocessor macro tables for GDB. |
- Copyright (C) 2002, 2007-2012 Free Software Foundation, Inc. |
+ Copyright (C) 2002-2013 Free Software Foundation, Inc. |
Contributed by Red Hat, Inc. |
This file is part of GDB. |
@@ -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; |
@@ -128,7 +132,7 @@ macro_bcache (struct macro_table *t, const void *addr, int len) |
static const char * |
macro_bcache_str (struct macro_table *t, const char *s) |
{ |
- return (char *) macro_bcache (t, s, strlen (s) + 1); |
+ return macro_bcache (t, s, strlen (s) + 1); |
} |
@@ -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); |
+} |