X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fmacrotab.h;h=83a7dfad23a63e628e65577c42abaa0818895c09;hb=98f9338a584c5f68595fc97e692e83f700c8da3d;hp=df32977967ef5d206e131ee52437bcaf40a75810;hpb=aa84d1bb9b0104984e3766ae44d51190333c4ddc;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/macrotab.h b/gdb/macrotab.h index df32977967..83a7dfad23 100644 --- a/gdb/macrotab.h +++ b/gdb/macrotab.h @@ -1,12 +1,12 @@ /* Interface to C preprocessor macro tables for GDB. - Copyright 2002 Free Software Foundation, Inc. + Copyright (C) 2002-2019 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,15 +15,19 @@ 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 +#include "gdbsupport/function-view.h" + struct obstack; +struct compunit_symtab; + +namespace gdb { struct bcache; +} /* How do we represent a source location? I mean, how should we represent them within GDB; the user wants to use all sorts of @@ -74,6 +78,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 +89,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. @@ -116,7 +131,9 @@ struct macro_source_file a part of. */ struct macro_table *table; - /* A source file --- possibly a header file. */ + /* A source file --- possibly a header file. This filename is relative to + the compilation directory (table->comp_dir), it exactly matches the + symtab->filename content. */ const char *filename; /* The location we were #included from, or zero if we are the @@ -143,19 +160,21 @@ struct macro_source_file xmalloc if OBSTACK is zero. Use BCACHE to store all macro names, arguments, definitions, and anything else that might be the same 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. */ + don't cache these things. CUST is a pointer to the containing + compilation unit, or NULL if there isn't one. + + 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); + gdb::bcache *bcache, + struct compunit_symtab *cust); /* Free TABLE, and any macro definitions, source file structures, @@ -182,6 +201,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, @@ -198,6 +222,10 @@ struct macro_source_file *macro_include (struct macro_source_file *source, int line, const char *included); +/* Define any special macros, like __FILE__ or __LINE__. This should + be called once, on the main source file. */ + +void macro_define_special (struct macro_table *table); /* Find any source file structure for a file named NAME, either included into SOURCE, or SOURCE itself. Return zero if we have @@ -205,9 +233,9 @@ struct macro_source_file *macro_include (struct macro_source_file *source, path. e.g., `stdio.h', not `/usr/include/stdio.h'. If NAME appears more than once in the inclusion tree, return the least-nested inclusion --- the one closest to the main source file. */ -struct macro_source_file *(macro_lookup_inclusion - (struct macro_source_file *source, - const char *name)); +struct macro_source_file *macro_lookup_inclusion + (struct macro_source_file *source, + const char *name); /* Record an object-like #definition (i.e., one with no parameter list). @@ -240,7 +268,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 { @@ -248,6 +275,17 @@ enum macro_kind macro_function_like }; +/* Different kinds of special macros. */ + +enum macro_special_kind +{ + /* Ordinary. */ + macro_ordinary, + /* The special macro __FILE__. */ + macro_FILE, + /* The special macro __LINE__. */ + macro_LINE +}; /* A preprocessor symbol definition. */ struct macro_definition @@ -256,16 +294,21 @@ 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; + them, are in the table's bcache, if it has one. If `kind' is + `macro_object_like', then this is actually a `macro_special_kind' + describing the macro. */ + int argc : 30; const char * const *argv; - /* The replacement string (body) of the macro. This is in the - table's bcache, if it has one. */ + /* The replacement string (body) of the macro. For ordinary macros, + this is in the table's bcache, if it has one. For special macros + like __FILE__, this value is only valid until the next use of any + special macro definition; that is, it is reset each time any + special macro is looked up or iterated over. */ const char *replacement; }; @@ -275,9 +318,9 @@ struct macro_definition effect at the end of the file. The macro table owns the structure; the caller need not free it. Return zero if NAME is not #defined at that point. */ -struct macro_definition *(macro_lookup_definition - (struct macro_source_file *source, - int line, const char *name)); +struct macro_definition *macro_lookup_definition + (struct macro_source_file *source, + int line, const char *name); /* Return the source location of the definition for NAME in scope at @@ -285,11 +328,37 @@ struct macro_definition *(macro_lookup_definition number of the definition, and return a source file structure for the file. Return zero if NAME has no definition in scope at that point, and leave *DEFINITION_LINE unchanged. */ -struct macro_source_file *(macro_definition_location - (struct macro_source_file *source, - int line, - const char *name, - int *definition_line)); - +struct macro_source_file *macro_definition_location + (struct macro_source_file *source, + int line, + const char *name, + int *definition_line); + +/* Prototype for a callback callable 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. */ +typedef void (macro_callback_fn) (const char *name, + const struct macro_definition *definition, + struct macro_source_file *source, + int line); + +/* Call the callable FN for each macro in the macro table TABLE. */ +void macro_for_each (struct macro_table *table, + gdb::function_view fn); + +/* Call FN for each macro that is visible in a given scope. The scope + is represented by FILE and LINE. */ +void macro_for_each_in_scope (struct macro_source_file *file, int line, + gdb::function_view fn); + +/* Return FILE->filename with possibly prepended compilation directory name. + This is raw concatenation without the "set substitute-path" and gdb_realpath + applications done by symtab_to_fullname. + + THis function ignores the "set filename-display" setting. Its default + setting is "relative" which is backward compatible but the former behavior + of macro filenames printing was "absolute". */ +extern std::string macro_source_fullname (struct macro_source_file *file); #endif /* MACROTAB_H */