cppopts.texi (-dU): Document.

gcc:
	* doc/cppopts.texi (-dU): Document.
	* c-common.h (flag_dump_macros): Update comment.
	* c-opts.c (handle_OPT_d): Handle -dU.
	* c-ppoutput.c (macro_queue, define_queue, undef_queue,
	dump_queued_macros, cb_used_define, cb_used_undef): New.
	(init_pp_output): Handle -dU.
	(cb_line_change): Call dump_queued_macros.
	* toplev.c (decode_d_option): Accept -dU as preprocessor option.

gcc/testsuite:
	* gcc.dg/cpp/cmdlne-dU-1.c, gcc.dg/cpp/cmdlne-dU-2.c,
	gcc.dg/cpp/cmdlne-dU-3.c, gcc.dg/cpp/cmdlne-dU-4.c,
	gcc.dg/cpp/cmdlne-dU-5.c, gcc.dg/cpp/cmdlne-dU-6.c,
	gcc.dg/cpp/cmdlne-dU-7.c, gcc.dg/cpp/cmdlne-dU-8.c,
	gcc.dg/cpp/cmdlne-dU-9.c, gcc.dg/cpp/cmdlne-dU-10.c,
	gcc.dg/cpp/cmdlne-dU-11.c, gcc.dg/cpp/cmdlne-dU-12.c,
	gcc.dg/cpp/cmdlne-dU-13.c, gcc.dg/cpp/cmdlne-dU-14.c,
	gcc.dg/cpp/cmdlne-dU-15.c, gcc.dg/cpp/cmdlne-dU-16.c,
	gcc.dg/cpp/cmdlne-dU-17.c, gcc.dg/cpp/cmdlne-dU-18.c,
	gcc.dg/cpp/cmdlne-dU-19.c, gcc.dg/cpp/cmdlne-dU-20.c,
	gcc.dg/cpp/cmdlne-dU-21.c, gcc.dg/cpp/cmdlne-dU-22.c: New tests.

libcpp:
	* include/cpplib.h (struct cpp_callbacks): Add used_define,
	used_undef and before_define.
	(NODE_USED): Define.
	* directives.c (do_define, do_undef, undefine_macros, do_ifdef,
	do_ifndef, cpp_pop_definition): Handle new flag and use new
	callbacks.
	* expr.c (parse_defined): Handle new flag and use new callbacks.
	* macro.c (enter_macro_context, _cpp_free_definition): Handle new
	flag and use new callbacks.

From-SVN: r133847
This commit is contained in:
Joseph Myers 2008-04-02 20:42:53 +01:00 committed by Joseph Myers
parent e6b69d0e56
commit 93d45d9eda
34 changed files with 360 additions and 6 deletions

View file

@ -559,9 +559,14 @@ do_define (cpp_reader *pfile)
pfile->state.save_comments =
! CPP_OPTION (pfile, discard_comments_in_macro_exp);
if (pfile->cb.before_define)
pfile->cb.before_define (pfile);
if (_cpp_create_definition (pfile, node))
if (pfile->cb.define)
pfile->cb.define (pfile, pfile->directive_line, node);
node->flags &= ~NODE_USED;
}
}
@ -573,6 +578,9 @@ do_undef (cpp_reader *pfile)
if (node)
{
if (pfile->cb.before_define)
pfile->cb.before_define (pfile);
if (pfile->cb.undef)
pfile->cb.undef (pfile, pfile->directive_line, node);
@ -603,7 +611,7 @@ undefine_macros (cpp_reader *pfile ATTRIBUTE_UNUSED, cpp_hashnode *h,
/* Body of _cpp_free_definition inlined here for speed.
Macros and assertions no longer have anything to free. */
h->type = NT_VOID;
h->flags &= ~(NODE_POISONED|NODE_BUILTIN|NODE_DISABLED);
h->flags &= ~(NODE_POISONED|NODE_BUILTIN|NODE_DISABLED|NODE_USED);
return 1;
}
@ -1638,12 +1646,26 @@ do_ifdef (cpp_reader *pfile)
if (! pfile->state.skipping)
{
const cpp_hashnode *node = lex_macro_node (pfile, false);
cpp_hashnode *node = lex_macro_node (pfile, false);
if (node)
{
skip = node->type != NT_MACRO;
_cpp_mark_macro_used (node);
if (!(node->flags & NODE_USED))
{
node->flags |= NODE_USED;
if (node->type == NT_MACRO)
{
if (pfile->cb.used_define)
pfile->cb.used_define (pfile, pfile->directive_line, node);
}
else
{
if (pfile->cb.used_undef)
pfile->cb.used_undef (pfile, pfile->directive_line, node);
}
}
check_eol (pfile);
}
}
@ -1656,7 +1678,7 @@ static void
do_ifndef (cpp_reader *pfile)
{
int skip = 1;
const cpp_hashnode *node = 0;
cpp_hashnode *node = 0;
if (! pfile->state.skipping)
{
@ -1666,6 +1688,20 @@ do_ifndef (cpp_reader *pfile)
{
skip = node->type == NT_MACRO;
_cpp_mark_macro_used (node);
if (!(node->flags & NODE_USED))
{
node->flags |= NODE_USED;
if (node->type == NT_MACRO)
{
if (pfile->cb.used_define)
pfile->cb.used_define (pfile, pfile->directive_line, node);
}
else
{
if (pfile->cb.used_undef)
pfile->cb.used_undef (pfile, pfile->directive_line, node);
}
}
check_eol (pfile);
}
}
@ -2145,6 +2181,9 @@ cpp_pop_definition (cpp_reader *pfile, const char *str, cpp_macro *dfn)
if (node == NULL)
return;
if (pfile->cb.before_define)
pfile->cb.before_define (pfile);
if (node->type == NT_MACRO)
{
if (pfile->cb.undef)