* dwarf2read.c (file_file_name): New function with code from
	file_full_name.
	(file_full_name): Move most of the code to file_file_name.
	(macro_start_file): Rename variable full_name to file_name and use
	file_file_name for it.  Add comp_dir parameter to new_macro_table.
	* macrocmd.c (show_pp_source_pos): New variable fullname.  Replace any
	macro_source_file->filename access by macro_source_fullname call.
	* macroscope.c (_initialize_macroscope): Update the new_macro_table
	caller.
	* macrotab.c (struct macro_table): New field comp_dir.
	(macro_include): New variables link_fullname and source_fullname.
	Replace any macro_source_file->filename access by macro_source_fullname
	call.
	(macro_lookup_inclusion): Remove the partial filenames checking code.
	(check_for_redefinition): New variables source_fullname and
	found_key_fullname.  Replace any macro_source_file->filename access by
	macro_source_fullname call.
	(macro_undef): New variables source_fullname and key_fullname.  Replace
	any macro_source_file->filename access by macro_source_fullname call.
	(macro_lookup_definition): New variables retval and source_fullname.
	Replace any macro_source_file->filename access by macro_source_fullname
	call.
	(foreach_macro): New variable key_fullname.  Replace any
	macro_source_file->filename access by macro_source_fullname call.
	(foreach_macro_in_scope): New variable datum_fullname.  Replace any
	macro_source_file->filename access by macro_source_fullname call.
	(new_macro_table): Add parameter comp_dir.  Initialize T with it.
	(macro_source_fullname): New function.
	* macrotab.h (struct macro_source_file): Extent the filename field
	comment.
	(new_macro_table): New parameter comp_dir, add a comment for it.
	(macro_source_fullname): new declaration.

gdb/testsuite/
	* gdb.linespec/base/one/header.h: New file.
	* gdb.linespec/base/two/header.h: New file.
	* gdb.linespec/macro-relative.c: New file.
	* gdb.linespec/macro-relative.exp: New file.
This commit is contained in:
Jan Kratochvil
2013-02-03 16:25:56 +00:00
parent da235a7c21
commit 233d95b548
11 changed files with 302 additions and 69 deletions

View File

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