cpplib: Macro use location and comparison

Our macro use hook passes a location, but doesn't recieve it from the
using location.  This patch adds the extra location_t parameter and
passes it though.

A second cleanup is breaking out the macro comparison code from the
redefinition warning.  That;ll turn out useful for modules.

Finally, there's a filename comparison needed for the location
optimization of rewinding from line 2 (occurs during the emission of
builtin macros).

	libcpp/
	* internal.h (_cpp_notify_macro_use): Add location parm.
	(_cpp_maybe_notify_macro_use): Likewise.
	* directives.c (_cpp_do_file_change): Check we've not changed file
	when optimizing a rewind.
	(do_ifdef): Pass location to _cpp_maybe_notify_macro_use.
	(do_ifndef): Likewise.  Delete obsolete comment about powerpc.
	* expr.c (parse_defined): Pass location to
	_cpp_maybe_notify_macro_use.
	* macro.c (enter_macro_context): Likewise.
	(warn_of_redefinition): Break out helper function.  Call it.
	(compare_macros): New function broken out of warn_of_redefinition.
	(_cpp_new_macro): Zero all fields.
	(_cpp_notify_macro_use): Add location parameter.
This commit is contained in:
Nathan Sidwell 2020-11-02 08:29:58 -08:00
parent 1c689b827c
commit e9a2e208dd
4 changed files with 30 additions and 15 deletions

View file

@ -1134,6 +1134,7 @@ _cpp_do_file_change (cpp_reader *pfile, enum lc_reason reason,
preprocessed source. */
line_map_ordinary *last = LINEMAPS_LAST_ORDINARY_MAP (pfile->line_table);
if (!ORDINARY_MAP_STARTING_LINE_NUMBER (last)
&& 0 == filename_cmp (to_file, ORDINARY_MAP_FILE_NAME (last))
&& SOURCE_LINE (last, pfile->line_table->highest_line) == 2)
{
ord_map = last;
@ -1981,7 +1982,7 @@ do_ifdef (cpp_reader *pfile)
{
skip = !_cpp_defined_macro_p (node);
_cpp_mark_macro_used (node);
_cpp_maybe_notify_macro_use (pfile, node);
_cpp_maybe_notify_macro_use (pfile, node, pfile->directive_line);
if (pfile->cb.used)
pfile->cb.used (pfile, pfile->directive_line, node);
check_eol (pfile, false);
@ -2004,13 +2005,9 @@ do_ifndef (cpp_reader *pfile)
if (node)
{
/* Do not treat conditional macros as being defined. This is due to
the powerpc port using conditional macros for 'vector', 'bool',
and 'pixel' to act as conditional keywords. This messes up tests
like #ifndef bool. */
skip = _cpp_defined_macro_p (node);
_cpp_mark_macro_used (node);
_cpp_maybe_notify_macro_use (pfile, node);
_cpp_maybe_notify_macro_use (pfile, node, pfile->directive_line);
if (pfile->cb.used)
pfile->cb.used (pfile, pfile->directive_line, node);
check_eol (pfile, false);

View file

@ -1070,7 +1070,7 @@ parse_defined (cpp_reader *pfile)
"this use of \"defined\" may not be portable");
_cpp_mark_macro_used (node);
_cpp_maybe_notify_macro_use (pfile, node);
_cpp_maybe_notify_macro_use (pfile, node, token->src_loc);
/* A possible controlling macro of the form #if !defined ().
_cpp_parse_expr checks there was no other junk on the line. */

View file

@ -649,11 +649,13 @@ inline bool _cpp_defined_macro_p (cpp_hashnode *node)
}
/* In macro.c */
extern void _cpp_notify_macro_use (cpp_reader *pfile, cpp_hashnode *node);
inline void _cpp_maybe_notify_macro_use (cpp_reader *pfile, cpp_hashnode *node)
extern void _cpp_notify_macro_use (cpp_reader *pfile, cpp_hashnode *node,
location_t loc);
inline void _cpp_maybe_notify_macro_use (cpp_reader *pfile, cpp_hashnode *node,
location_t loc)
{
if (!(node->flags & NODE_USED))
_cpp_notify_macro_use (pfile, node);
_cpp_notify_macro_use (pfile, node, loc);
}
extern cpp_macro *_cpp_new_macro (cpp_reader *, cpp_macro_kind, void *);
extern void _cpp_free_definition (cpp_hashnode *);

View file

@ -340,6 +340,8 @@ static cpp_macro *create_iso_definition (cpp_reader *);
static cpp_macro *lex_expansion_token (cpp_reader *, cpp_macro *);
static bool warn_of_redefinition (cpp_reader *, cpp_hashnode *,
const cpp_macro *);
static bool compare_macros (const cpp_macro *, const cpp_macro *);
static bool parse_params (cpp_reader *, unsigned *, bool *);
static void check_trad_stringification (cpp_reader *, const cpp_macro *,
const cpp_string *);
@ -1433,7 +1435,7 @@ enter_macro_context (cpp_reader *pfile, cpp_hashnode *node,
/* Laziness can only affect the expansion tokens of the macro,
not its fun-likeness or parameters. */
_cpp_maybe_notify_macro_use (pfile, node);
_cpp_maybe_notify_macro_use (pfile, node, location);
if (pfile->cb.used)
pfile->cb.used (pfile, location, node);
@ -3111,6 +3113,14 @@ warn_of_redefinition (cpp_reader *pfile, cpp_hashnode *node,
macro1->lazy = 0;
}
return compare_macros (macro1, macro2);
}
/* Return TRUE if MACRO1 and MACRO2 differ. */
static bool
compare_macros (const cpp_macro *macro1, const cpp_macro *macro2)
{
/* Redefinition of a macro is allowed if and only if the old and new
definitions are the same. (6.10.3 paragraph 2). */
@ -3579,6 +3589,10 @@ _cpp_new_macro (cpp_reader *pfile, cpp_macro_kind kind, void *placement)
{
cpp_macro *macro = (cpp_macro *) placement;
/* Zero init all the fields. This'll tell the compiler know all the
following inits are writing a virgin object. */
memset (macro, 0, offsetof (cpp_macro, exp));
macro->line = pfile->directive_line;
macro->parm.params = 0;
macro->lazy = 0;
@ -3665,10 +3679,12 @@ cpp_define_lazily (cpp_reader *pfile, cpp_hashnode *node, unsigned num)
}
/* Notify the use of NODE in a macro-aware context (i.e. expanding it,
or testing its existance). Also applies any lazy definition. */
or testing its existance). Also applies any lazy definition.
Return FALSE if the macro isn't really there. */
extern void
_cpp_notify_macro_use (cpp_reader *pfile, cpp_hashnode *node)
_cpp_notify_macro_use (cpp_reader *pfile, cpp_hashnode *node,
location_t loc)
{
node->flags |= NODE_USED;
switch (node->type)
@ -3686,12 +3702,12 @@ _cpp_notify_macro_use (cpp_reader *pfile, cpp_hashnode *node)
case NT_BUILTIN_MACRO:
if (pfile->cb.used_define)
pfile->cb.used_define (pfile, pfile->directive_line, node);
pfile->cb.used_define (pfile, loc, node);
break;
case NT_VOID:
if (pfile->cb.used_undef)
pfile->cb.used_undef (pfile, pfile->directive_line, node);
pfile->cb.used_undef (pfile, loc, node);
break;
default: