[PR93306] Short-circuit has_include
the preprocessor evaluator has a skip_eval counter, but we weren't checking it after parsing has_include(foo), but before looking for foo. Resulting in unnecessary io for 'FALSE_COND && has_include <foo>' PR preprocessor/93306 * expr.c (parse_has_include): Refactor. Check skip_eval before looking.
This commit is contained in:
parent
5f0303833d
commit
bf09d886a4
@ -1,3 +1,9 @@
|
|||||||
|
2020-01-17 Nathan Sidwell <nathan@acm.org>
|
||||||
|
|
||||||
|
PR preprocessor/93306
|
||||||
|
* expr.c (parse_has_include): Refactor. Check skip_eval before
|
||||||
|
looking.
|
||||||
|
|
||||||
2020-01-10 David Malcolm <dmalcolm@redhat.com>
|
2020-01-10 David Malcolm <dmalcolm@redhat.com>
|
||||||
|
|
||||||
* include/line-map.h (class diagnostic_path): New forward decl.
|
* include/line-map.h (class diagnostic_path): New forward decl.
|
||||||
|
@ -2195,11 +2195,6 @@ static cpp_num
|
|||||||
parse_has_include (cpp_reader *pfile, enum include_type type)
|
parse_has_include (cpp_reader *pfile, enum include_type type)
|
||||||
{
|
{
|
||||||
cpp_num result;
|
cpp_num result;
|
||||||
bool paren = false;
|
|
||||||
cpp_hashnode *node = 0;
|
|
||||||
const cpp_token *token;
|
|
||||||
bool bracket = false;
|
|
||||||
char *fname = 0;
|
|
||||||
|
|
||||||
result.unsignedp = false;
|
result.unsignedp = false;
|
||||||
result.high = 0;
|
result.high = 0;
|
||||||
@ -2208,39 +2203,34 @@ parse_has_include (cpp_reader *pfile, enum include_type type)
|
|||||||
|
|
||||||
pfile->state.in__has_include__++;
|
pfile->state.in__has_include__++;
|
||||||
|
|
||||||
token = cpp_get_token (pfile);
|
const cpp_token *token = cpp_get_token (pfile);
|
||||||
if (token->type == CPP_OPEN_PAREN)
|
bool paren = token->type == CPP_OPEN_PAREN;
|
||||||
{
|
if (paren)
|
||||||
paren = true;
|
token = cpp_get_token (pfile);
|
||||||
token = cpp_get_token (pfile);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
bool bracket = token->type != CPP_STRING;
|
||||||
|
cpp_hashnode *node = NULL;
|
||||||
|
char *fname = NULL;
|
||||||
if (token->type == CPP_STRING || token->type == CPP_HEADER_NAME)
|
if (token->type == CPP_STRING || token->type == CPP_HEADER_NAME)
|
||||||
{
|
{
|
||||||
if (token->type == CPP_HEADER_NAME)
|
|
||||||
bracket = true;
|
|
||||||
fname = XNEWVEC (char, token->val.str.len - 1);
|
fname = XNEWVEC (char, token->val.str.len - 1);
|
||||||
memcpy (fname, token->val.str.text + 1, token->val.str.len - 2);
|
memcpy (fname, token->val.str.text + 1, token->val.str.len - 2);
|
||||||
fname[token->val.str.len - 2] = '\0';
|
fname[token->val.str.len - 2] = '\0';
|
||||||
node = token->val.node.node;
|
node = token->val.node.node;
|
||||||
}
|
}
|
||||||
else if (token->type == CPP_LESS)
|
else if (token->type == CPP_LESS)
|
||||||
{
|
fname = _cpp_bracket_include (pfile);
|
||||||
bracket = true;
|
|
||||||
fname = _cpp_bracket_include (pfile);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
cpp_error (pfile, CPP_DL_ERROR,
|
cpp_error (pfile, CPP_DL_ERROR,
|
||||||
"operator \"__has_include__\" requires a header string");
|
"operator \"__has_include__\" requires a header string");
|
||||||
|
|
||||||
if (fname)
|
if (fname)
|
||||||
{
|
{
|
||||||
int angle_brackets = (bracket ? 1 : 0);
|
/* Do not do the lookup if we're skipping, that's unnecessary
|
||||||
|
IO. */
|
||||||
if (_cpp_has_header (pfile, fname, angle_brackets, type))
|
if (!pfile->state.skip_eval
|
||||||
|
&& _cpp_has_header (pfile, fname, bracket, type))
|
||||||
result.low = 1;
|
result.low = 1;
|
||||||
else
|
|
||||||
result.low = 0;
|
|
||||||
|
|
||||||
XDELETEVEC (fname);
|
XDELETEVEC (fname);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user