[PR93306] Short-circuit has_include
authorNathan Sidwell <nathan@acm.org>
Fri, 17 Jan 2020 13:39:47 +0000 (05:39 -0800)
committerNathan Sidwell <nathan@acm.org>
Fri, 17 Jan 2020 13:44:30 +0000 (05:44 -0800)
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.

libcpp/ChangeLog
libcpp/expr.c

index fc22011c7d22b1a9a6dd61324c5fc3b848618f7c..3249b93fe8840442594c06c6bb2628649499860a 100644 (file)
@@ -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.
index 1078c0722f64c5141c3a6391b20b18c77615fff1..317faf50208e853a26746424b9b894d26926813d 100644 (file)
@@ -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);
     }