aboutsummaryrefslogtreecommitdiff
path: root/libcpp
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@acm.org>2020-01-17 05:39:47 -0800
committerNathan Sidwell <nathan@acm.org>2020-01-17 05:44:30 -0800
commitbf09d886a4be1031f7003073115af6cbc5575353 (patch)
treeeef353351a64157dbc3f1637cc0222db4d3cb17f /libcpp
parent5f0303833d542b273da33e4b149974e739d350e5 (diff)
downloadgcc-bf09d886a4be1031f7003073115af6cbc5575353.zip
gcc-bf09d886a4be1031f7003073115af6cbc5575353.tar.gz
gcc-bf09d886a4be1031f7003073115af6cbc5575353.tar.bz2
[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.
Diffstat (limited to 'libcpp')
-rw-r--r--libcpp/ChangeLog6
-rw-r--r--libcpp/expr.c34
2 files changed, 18 insertions, 22 deletions
diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog
index fc22011..3249b93 100644
--- a/libcpp/ChangeLog
+++ b/libcpp/ChangeLog
@@ -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>
* include/line-map.h (class diagnostic_path): New forward decl.
diff --git a/libcpp/expr.c b/libcpp/expr.c
index 1078c07..317faf5 100644
--- a/libcpp/expr.c
+++ b/libcpp/expr.c
@@ -2195,11 +2195,6 @@ static cpp_num
parse_has_include (cpp_reader *pfile, enum include_type type)
{
cpp_num result;
- bool paren = false;
- cpp_hashnode *node = 0;
- const cpp_token *token;
- bool bracket = false;
- char *fname = 0;
result.unsignedp = false;
result.high = 0;
@@ -2208,39 +2203,34 @@ parse_has_include (cpp_reader *pfile, enum include_type type)
pfile->state.in__has_include__++;
- token = cpp_get_token (pfile);
- if (token->type == CPP_OPEN_PAREN)
- {
- paren = true;
- token = cpp_get_token (pfile);
- }
+ const cpp_token *token = cpp_get_token (pfile);
+ bool paren = token->type == CPP_OPEN_PAREN;
+ if (paren)
+ 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_HEADER_NAME)
- bracket = true;
fname = XNEWVEC (char, token->val.str.len - 1);
memcpy (fname, token->val.str.text + 1, token->val.str.len - 2);
fname[token->val.str.len - 2] = '\0';
node = token->val.node.node;
}
else if (token->type == CPP_LESS)
- {
- bracket = true;
- fname = _cpp_bracket_include (pfile);
- }
+ fname = _cpp_bracket_include (pfile);
else
cpp_error (pfile, CPP_DL_ERROR,
"operator \"__has_include__\" requires a header string");
if (fname)
{
- int angle_brackets = (bracket ? 1 : 0);
-
- if (_cpp_has_header (pfile, fname, angle_brackets, type))
+ /* Do not do the lookup if we're skipping, that's unnecessary
+ IO. */
+ if (!pfile->state.skip_eval
+ && _cpp_has_header (pfile, fname, bracket, type))
result.low = 1;
- else
- result.low = 0;
XDELETEVEC (fname);
}