X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fmacrotab.h;h=a10351a23b9ba2265c2f335c2e2b10ff367f15ae;hb=25289eb274bff1f2052ecea034171ff2b6970c94;hp=df32977967ef5d206e131ee52437bcaf40a75810;hpb=aa84d1bb9b0104984e3766ae44d51190333c4ddc;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/macrotab.h b/gdb/macrotab.h index df32977967..a10351a23b 100644 --- a/gdb/macrotab.h +++ b/gdb/macrotab.h @@ -1,12 +1,13 @@ /* Interface to C preprocessor macro tables for GDB. - Copyright 2002 Free Software Foundation, Inc. + Copyright (C) 2002, 2007, 2008, 2009, 2010, 2011 + Free Software Foundation, Inc. Contributed by Red Hat, Inc. This file is part of GDB. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -15,9 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ + along with this program. If not, see . */ #ifndef MACROTAB_H #define MACROTAB_H @@ -74,6 +73,8 @@ struct bcache; /* A table of all the macro definitions for a given compilation unit. */ struct macro_table; +/* The definition of a single macro. */ +struct macro_definition; /* A source file that participated in a compilation unit --- either a main file, or an #included file. If a file is #included more than @@ -83,6 +84,15 @@ struct macro_table; tree mapping the #inclusions that contributed to the compilation unit, with the main source file as its root. + Beware --- not every source file mentioned in a compilation unit's + symtab structures will appear in the #inclusion tree! As of Oct + 2002, GCC does record the effect of #line directives in the source + line info, but not in macro info. This means that GDB's symtabs + (built from the former, among other things) may mention filenames + that the #inclusion tree (built from the latter) doesn't have any + record of. See macroscope.c:sal_macro_scope for how to accomodate + this. + It's worth noting that libcpp has a simpler way of representing all this, which we should consider switching to. It might even be suitable for ordinary non-macro line number info. @@ -145,15 +155,15 @@ struct macro_source_file amongst compilation units in an executable file; if BCACHE is zero, don't cache these things. - Note that, if either OBSTACK or BCACHE are non-zero, then you - should only ever add information the macro table --- you should - never remove things from it. You'll get an error if you try. At - the moment, since we only provide obstacks and bcaches for macro - tables for symtabs, this restriction makes a nice sanity check. - Obstacks and bcaches are pretty much grow-only structures anyway. - However, if we find that it's occasionally useful to delete things - even from the symtab's tables, and the storage leak isn't a - problem, this restriction could be lifted. */ + Note that, if either OBSTACK or BCACHE are non-zero, then removing + information from the table may leak memory. Neither obstacks nor + bcaches really allow you to remove information, so although we can + update the data structure to record the change, we can't free the + old data. At the moment, since we only provide obstacks and + bcaches for macro tables for symtabs, this isn't a problem; only + odd debugging information makes a definition and then deletes it at + the same source location (although 'gcc -DFOO -UFOO -DFOO=2' does + do that in GCC 4.1.2.). */ struct macro_table *new_macro_table (struct obstack *obstack, struct bcache *bcache); @@ -182,6 +192,11 @@ struct macro_source_file *macro_set_main (struct macro_table *table, /* Return the main source file of the macro table TABLE. */ struct macro_source_file *macro_main (struct macro_table *table); +/* Mark the macro table TABLE so that macros defined in this table can + be redefined without error. Note that it invalid to call this if + TABLE is allocated on an obstack. */ +void macro_allow_redefinitions (struct macro_table *table); + /* Record a #inclusion. Record in SOURCE's macro table that, at line number LINE in SOURCE, @@ -240,7 +255,6 @@ void macro_define_function (struct macro_source_file *source, int line, void macro_undef (struct macro_source_file *source, int line, const char *name); - /* Different kinds of macro definitions. */ enum macro_kind { @@ -256,12 +270,12 @@ struct macro_definition struct macro_table *table; /* What kind of macro it is. */ - enum macro_kind kind; + ENUM_BITFIELD (macro_kind) kind : 1; /* If `kind' is `macro_function_like', the number of arguments it takes, and their names. The names, and the array of pointers to them, are in the table's bcache, if it has one. */ - int argc; + int argc : 31; const char * const *argv; /* The replacement string (body) of the macro. This is in the @@ -291,5 +305,28 @@ struct macro_source_file *(macro_definition_location const char *name, int *definition_line)); +/* Callback function when walking a macro table. NAME is the name of + the macro, and DEFINITION is the definition. SOURCE is the file at the + start of the include path, and LINE is the line number of the SOURCE file + where the macro was defined. USER_DATA is an arbitrary pointer which is + passed by the caller to macro_for_each or macro_for_each_in_scope. */ +typedef void (*macro_callback_fn) (const char *name, + const struct macro_definition *definition, + struct macro_source_file *source, + int line, + void *user_data); + +/* Call the function FN for each macro in the macro table TABLE. + USER_DATA is passed, untranslated, to FN. */ +void macro_for_each (struct macro_table *table, macro_callback_fn fn, + void *user_data); + +/* Call the function FN for each macro that is visible in a given + scope. The scope is represented by FILE and LINE. USER_DATA is + passed, untranslated, to FN. */ +void macro_for_each_in_scope (struct macro_source_file *file, int line, + macro_callback_fn fn, + void *user_data); + #endif /* MACROTAB_H */