| 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);
|
| +}
|
|
|