public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH][Preprocessor]patch to fix PR 90581
@ 2019-05-30 16:26 Qing Zhao
  2019-05-30 19:20 ` Bernhard Reutner-Fischer
                   ` (2 more replies)
  0 siblings, 3 replies; 13+ messages in thread
From: Qing Zhao @ 2019-05-30 16:26 UTC (permalink / raw)
  To: David Malcolm; +Cc: gcc Patches, bernhard Reutner-Fischer

[-- Attachment #1: Type: text/plain, Size: 1569 bytes --]

Hi,

PR 90581 (provide an option to adjust the maximum depth of nested #include)
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90581

is to add a new cpp option -fmax-inlcude-depth to set the maximum depth of nested #include.

'-fmax-include-depth=DEPTH'
     Set the maximum depth of the nested include.  The default value is
     200.

Please check the attached patch.
I have done bootstrap and regression test on X86, no any issue.

thanks a lot.

Qing.



gcc/ChangeLog:

2019-05-30  qing zhao  <qing.zhao@oracle.com>

        * doc/cppopts.texi: Add document for -fmax-include-depth.
        * doc/invoke.texi (Preprocessor Options): List -fmax-include-depth.

libcpp/ChangeLog:

2019-05-30  qing zhao  <qing.zhao@oracle.com>

        * directives.c (do_include_common): Replace CPP_STACK_MAX with
        CPP_OPTION (pfile, max_include_depth).
        * include/cpplib.h (struct cpp_options): Add new field
        max_include_depth.
        * init.c (cpp_create_reader): Initiate new field max_include_depth.
        * internal.h: Delete CPP_STACK_MAX.

gcc/c-family/ChangeLog:

2019-05-30  qing zhao  <qing.zhao@oracle.com>

        * c-opts.c (c_common_handle_option): Handle -fmax-include-depth.
        * c.opt: Add new option -fmax-include-depth.

gcc/testsuite/ChangeLog:

2019-05-30  qing zhao  <qing.zhao@oracle.com>

        * c-c++-common/cpp/fmax-include-depth-1a.h: New test.
        * c-c++-common/cpp/fmax-include-depth-1b.h: New test.
        * c-c++-common/cpp/fmax-include-depth.c: New test.


[-- Attachment #2: 0001-PR-preprocessor-90581.patch --]
[-- Type: application/octet-stream, Size: 6698 bytes --]

From 3ec276f1fe32f8adf495676586441e7d51d1e524 Mon Sep 17 00:00:00 2001
From: qing zhao <qing.zhao@oracle.com>
Date: Thu, 30 May 2019 11:10:59 -0400
Subject: [PATCH] PR preprocessor/90581 provide an option to adjust the maximum
 depth of nested #include

Add a cpp option -fmax-include-depth to set the maximum depth
of nested #include.
---
 gcc/c-family/c-opts.c                                  | 4 ++++
 gcc/c-family/c.opt                                     | 4 ++++
 gcc/doc/cppopts.texi                                   | 4 ++++
 gcc/doc/invoke.texi                                    | 1 +
 gcc/testsuite/c-c++-common/cpp/fmax-include-depth-1a.h | 1 +
 gcc/testsuite/c-c++-common/cpp/fmax-include-depth-1b.h | 1 +
 gcc/testsuite/c-c++-common/cpp/fmax-include-depth.c    | 4 ++++
 libcpp/directives.c                                    | 2 +-
 libcpp/include/cpplib.h                                | 3 +++
 libcpp/init.c                                          | 1 +
 libcpp/internal.h                                      | 4 ----
 11 files changed, 24 insertions(+), 5 deletions(-)
 create mode 100644 gcc/testsuite/c-c++-common/cpp/fmax-include-depth-1a.h
 create mode 100644 gcc/testsuite/c-c++-common/cpp/fmax-include-depth-1b.h
 create mode 100644 gcc/testsuite/c-c++-common/cpp/fmax-include-depth.c

diff --git a/gcc/c-family/c-opts.c b/gcc/c-family/c-opts.c
index 954b6a4..188da43 100644
--- a/gcc/c-family/c-opts.c
+++ b/gcc/c-family/c-opts.c
@@ -460,6 +460,10 @@ c_common_handle_option (size_t scode, const char *arg, HOST_WIDE_INT value,
       cpp_opts->extended_identifiers = value;
       break;
 
+    case OPT_fmax_include_depth_:
+	cpp_opts->max_include_depth = value;
+      break;
+
     case OPT_foperator_names:
       cpp_opts->operator_names = value;
       break;
diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt
index 046d489..071eed2 100644
--- a/gcc/c-family/c.opt
+++ b/gcc/c-family/c.opt
@@ -1563,6 +1563,10 @@ flax-vector-conversions
 C ObjC C++ ObjC++ Var(flag_lax_vector_conversions)
 Allow implicit conversions between vectors with differing numbers of subparts and/or differing element types.
 
+fmax-include-depth=
+C ObjC C++ ObjC++ Joined RejectNegative UInteger
+fmax-include-depth=<number> Set the maximum number of depth of nested #include.
+
 fms-extensions
 C ObjC C++ ObjC++ Var(flag_ms_extensions)
 Don't warn about uses of Microsoft extensions.
diff --git a/gcc/doc/cppopts.texi b/gcc/doc/cppopts.texi
index 48c574f..53c9fbd 100644
--- a/gcc/doc/cppopts.texi
+++ b/gcc/doc/cppopts.texi
@@ -261,6 +261,10 @@ enabled by default for C99 (and later C standard versions) and C++.
 @opindex fno-canonical-system-headers
 When preprocessing, do not shorten system header paths with canonicalization.
 
+@item -fmax-include-depth=@var{depth}
+@opindex fmax-include-depth
+Set the maximum depth of the nested include. The default value is 200. 
+
 @item -ftabstop=@var{width}
 @opindex ftabstop
 Set the distance between tab stops.  This helps the preprocessor report
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 3e4f012..6f94c8b 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -515,6 +515,7 @@ Objective-C and Objective-C++ Dialects}.
 -fdebug-cpp  -fdirectives-only  -fdollars-in-identifiers  @gol
 -fexec-charset=@var{charset}  -fextended-identifiers  @gol
 -finput-charset=@var{charset}  -fmacro-prefix-map=@var{old}=@var{new}  @gol
+-fmax-include-depth=@var{depth} @gol
 -fno-canonical-system-headers  -fpch-deps  -fpch-preprocess  @gol
 -fpreprocessed  -ftabstop=@var{width}  -ftrack-macro-expansion  @gol
 -fwide-exec-charset=@var{charset}  -fworking-directory @gol
diff --git a/gcc/testsuite/c-c++-common/cpp/fmax-include-depth-1a.h b/gcc/testsuite/c-c++-common/cpp/fmax-include-depth-1a.h
new file mode 100644
index 0000000..4e610c0
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/cpp/fmax-include-depth-1a.h
@@ -0,0 +1 @@
+int a;
diff --git a/gcc/testsuite/c-c++-common/cpp/fmax-include-depth-1b.h b/gcc/testsuite/c-c++-common/cpp/fmax-include-depth-1b.h
new file mode 100644
index 0000000..c167587
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/cpp/fmax-include-depth-1b.h
@@ -0,0 +1 @@
+#include "fmax-include-depth-1a.h"
diff --git a/gcc/testsuite/c-c++-common/cpp/fmax-include-depth.c b/gcc/testsuite/c-c++-common/cpp/fmax-include-depth.c
new file mode 100644
index 0000000..bf7b9de
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/cpp/fmax-include-depth.c
@@ -0,0 +1,4 @@
+/* { dg-do preprocess} */
+/* { dg-options "-fmax-include-depth=1" } */
+
+#include "fmax-include-depth-1b.h" /* { dg-error ".include nested too deeply" } */
diff --git a/libcpp/directives.c b/libcpp/directives.c
index 3ee8bc4..480c282 100644
--- a/libcpp/directives.c
+++ b/libcpp/directives.c
@@ -831,7 +831,7 @@ do_include_common (cpp_reader *pfile, enum include_type type)
     }
 
   /* Prevent #include recursion.  */
-  if (pfile->line_table->depth >= CPP_STACK_MAX)
+  if (pfile->line_table->depth >= CPP_OPTION (pfile, max_include_depth))
     cpp_error (pfile, CPP_DL_ERROR, "#include nested too deeply");
   else
     {
diff --git a/libcpp/include/cpplib.h b/libcpp/include/cpplib.h
index 3edb93d..44d6327 100644
--- a/libcpp/include/cpplib.h
+++ b/libcpp/include/cpplib.h
@@ -550,6 +550,9 @@ struct cpp_options
 
   /* True enables canonicalization of system header file paths. */
   bool canonical_system_headers;
+
+  /* the maximum depths for nested #include.  */
+  unsigned int max_include_depth;
 };
 
 /* Diagnostic levels.  To get a diagnostic without associating a
diff --git a/libcpp/init.c b/libcpp/init.c
index c0c9020..d06f95e 100644
--- a/libcpp/init.c
+++ b/libcpp/init.c
@@ -185,6 +185,7 @@ cpp_create_reader (enum c_lang lang, cpp_hash_table *table,
   CPP_OPTION (pfile, warn_multichar) = 1;
   CPP_OPTION (pfile, discard_comments) = 1;
   CPP_OPTION (pfile, discard_comments_in_macro_exp) = 1;
+  CPP_OPTION (pfile, max_include_depth) = 200;
   CPP_OPTION (pfile, tabstop) = 8;
   CPP_OPTION (pfile, operator_names) = 1;
   CPP_OPTION (pfile, warn_trigraphs) = 2;
diff --git a/libcpp/internal.h b/libcpp/internal.h
index 5b9c389..0ab4470 100644
--- a/libcpp/internal.h
+++ b/libcpp/internal.h
@@ -74,10 +74,6 @@ struct cset_converter
     linemap_line_start (PFILE->line_table, line + 1, COLS_HINT); \
   } while (0)
 
-/* Maximum nesting of cpp_buffers.  We use a static limit, partly for
-   efficiency, and partly to limit runaway recursion.  */
-#define CPP_STACK_MAX 200
-
 /* Host alignment handling.  */
 struct dummy
 {
-- 
1.8.3.1


^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2019-06-07  8:26 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-05-30 16:26 [PATCH][Preprocessor]patch to fix PR 90581 Qing Zhao
2019-05-30 19:20 ` Bernhard Reutner-Fischer
2019-05-30 20:35   ` Qing Zhao
2019-05-30 20:42     ` David Malcolm
2019-05-30 20:46       ` Qing Zhao
2019-05-30 20:49 ` David Malcolm
2019-05-30 21:05   ` Qing Zhao
2019-05-31  9:01   ` Richard Biener
2019-06-03 14:49 ` [PATCH][Preprocessor][Version 2]patch " Qing Zhao
2019-06-03 15:03   ` Paolo Carlini
2019-06-03 16:42     ` [PATCH][Preprocessor][Version 3]patch " Qing Zhao
2019-06-03 16:46   ` Qing Zhao
2019-06-07  8:26     ` Richard Biener

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).