diff options
author | Nathan Sidwell <nathan@acm.org> | 2018-08-17 16:07:19 +0000 |
---|---|---|
committer | Nathan Sidwell <nathan@gcc.gnu.org> | 2018-08-17 16:07:19 +0000 |
commit | 10f04917abbc42e3717d33d9b5079aa4f9eb9ac5 (patch) | |
tree | d1b399c099142510b8abea59d95c27a5dd4ecf58 /libcpp/traditional.c | |
parent | c5d725c0a8da3b2227d119871e881d8a6e1bf600 (diff) | |
download | gcc-10f04917abbc42e3717d33d9b5079aa4f9eb9ac5.zip gcc-10f04917abbc42e3717d33d9b5079aa4f9eb9ac5.tar.gz gcc-10f04917abbc42e3717d33d9b5079aa4f9eb9ac5.tar.bz2 |
[PATCH] Macro body is trailing array
https://gcc.gnu.org/ml/gcc-patches/2018-08/msg01037.html
* include/cpplib.h (enum cpp_macro_kind): New.
(struct cpp_macro): Make body trailing array. Add kind field,
delete traditional flag.
* internal.h (_cpp_new_macro): Declare.
(_cpp_reserve_room): New inline.
(_cpp_commit_buf): Declare.
(_cpp_create_trad_definition): Return new macro.
* lex.c (_cpp_commit_buff): New.
* macro.c (macro_real_token_count): Count backwards.
(replace_args): Pointer equality not orderedness.
(_cpp_save_parameter): Use _cpp_reserve_room.
(alloc_expansion_token): Delete.
(lex_expansion_token): Return macro pointer. Use _cpp_reserve_room.
(create_iso_definition): Allocate macro itself. Adjust for
different allocation ordering.
(_cpp_new_macro): New.
(_cpp_create_definition): Adjust for API changes.
* traditional.c (push_replacement_text): Don't set traditional
flag.
(save_replacement_text): Likewise.
(_cpp_create_trad_definition): Allocate macro itself, Adjust for
different allocation ordering.
From-SVN: r263622
Diffstat (limited to 'libcpp/traditional.c')
-rw-r--r-- | libcpp/traditional.c | 59 |
1 files changed, 30 insertions, 29 deletions
diff --git a/libcpp/traditional.c b/libcpp/traditional.c index f484236..3c3b8ac 100644 --- a/libcpp/traditional.c +++ b/libcpp/traditional.c @@ -853,7 +853,6 @@ push_replacement_text (cpp_reader *pfile, cpp_hashnode *node) cpp_macro *macro = node->value.macro; macro->used = 1; text = macro->exp.text; - macro->traditional = 1; len = macro->count; } @@ -1143,7 +1142,6 @@ save_replacement_text (cpp_reader *pfile, cpp_macro *macro, memcpy (exp, pfile->out.base, len); exp[len] = '\n'; macro->exp.text = exp; - macro->traditional = 1; macro->count = len; } else @@ -1159,7 +1157,6 @@ save_replacement_text (cpp_reader *pfile, cpp_macro *macro, exp = BUFF_FRONT (pfile->a_buff); block = (struct block *) (exp + macro->count); macro->exp.text = exp; - macro->traditional = 1; /* Write out the block information. */ block->text_len = len; @@ -1179,13 +1176,15 @@ save_replacement_text (cpp_reader *pfile, cpp_macro *macro, /* Analyze and save the replacement text of a macro. Returns true on success. */ -bool -_cpp_create_trad_definition (cpp_reader *pfile, cpp_macro *macro) +cpp_macro * +_cpp_create_trad_definition (cpp_reader *pfile) { const uchar *cur; uchar *limit; cpp_context *context = pfile->context; unsigned nparms = 0; + int fun_like = 0; + cpp_hashnode **params = NULL; /* The context has not been set up for command line defines, and CUR has not been updated for the macro name for in-file defines. */ @@ -1197,21 +1196,23 @@ _cpp_create_trad_definition (cpp_reader *pfile, cpp_macro *macro) /* Is this a function-like macro? */ if (* CUR (context) == '(') { - bool ok = scan_parameters (pfile, &nparms); - macro->paramc = nparms; + fun_like = +1; + if (scan_parameters (pfile, &nparms)) + params = (cpp_hashnode **)_cpp_commit_buff + (pfile, sizeof (cpp_hashnode *) * nparms); + else + fun_like = -1; + } - /* Remember the params so we can clear NODE_MACRO_ARG flags. */ - macro->params = (cpp_hashnode **) BUFF_FRONT (pfile->a_buff); + cpp_macro *macro = NULL; - /* Setting macro to NULL indicates an error occurred, and - prevents unnecessary work in _cpp_scan_out_logical_line. */ - if (!ok) - macro = NULL; - else - { - BUFF_FRONT (pfile->a_buff) = (uchar *) ¯o->params[macro->paramc]; - macro->fun_like = 1; - } + if (fun_like >= 0) + { + macro = _cpp_new_macro (pfile, cmk_traditional, + _cpp_aligned_alloc (pfile, sizeof (cpp_macro))); + macro->params = params; + macro->paramc = nparms; + macro->fun_like = fun_like != 0; } /* Skip leading whitespace in the replacement text. */ @@ -1225,18 +1226,18 @@ _cpp_create_trad_definition (cpp_reader *pfile, cpp_macro *macro) _cpp_unsave_parameters (pfile, nparms); - if (!macro) - return false; - - /* Skip trailing white space. */ - cur = pfile->out.base; - limit = pfile->out.cur; - while (limit > cur && is_space (limit[-1])) - limit--; - pfile->out.cur = limit; - save_replacement_text (pfile, macro, 0); + if (macro) + { + /* Skip trailing white space. */ + cur = pfile->out.base; + limit = pfile->out.cur; + while (limit > cur && is_space (limit[-1])) + limit--; + pfile->out.cur = limit; + save_replacement_text (pfile, macro, 0); + } - return true; + return macro; } /* Copy SRC of length LEN to DEST, but convert all contiguous |