public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH/RFC 0/4] C/C++/diagnostics: various UX improvements
@ 2023-11-02 13:19 David Malcolm
  2023-11-02 13:19 ` [PATCH 1/4] c/c++: rework pragma parsing David Malcolm
                   ` (3 more replies)
  0 siblings, 4 replies; 6+ messages in thread
From: David Malcolm @ 2023-11-02 13:19 UTC (permalink / raw)
  To: gcc-patches; +Cc: David Malcolm

The following patch kit implements the:
  #pragma GCC show_layout (struct foo)
idea I mentioned in my Cauldron talk (in patch 2),  and the other
patches implement various related user experience changes I came
across when implementing it.

Patch 1 reworks how c-pragma.cc parses pragmas, and experiments with
adding links to documentation to the diagnostics messages (on a
suitably capable terminal).

Patch 2 implements the new "show_layout" pragma

Patch 3 adds a new mechanism to the diagnostics subsytem for
automatically adding documentation links to messages, with enough
data to handle the pragmas from patch 1.

Patch 4 attempts to automatically populate the URL data for our docs by
parsing the results of "make html".

Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu.

I'd like to go ahead with patch 1 and patch 3; patch 2 and patch 4 may
need more work, but posting here for feedback.

Thoughts?

David Malcolm (4):
  c/c++: rework pragma parsing
  c: add #pragma GCC show_layout
  diagnostics: add automatic URL-ification within messages
  RFC: add contrib/regenerate-index-urls.py

 contrib/regenerate-index-urls.py              |  245 ++
 gcc/Makefile.in                               |    3 +-
 gcc/analyzer/record-layout.cc                 |  235 ++
 gcc/analyzer/record-layout.h                  |    4 +
 gcc/c-family/c-pragma.cc                      |  641 ++++-
 gcc/c-family/c-pragma.h                       |    5 +-
 gcc/diagnostic.cc                             |    8 +-
 gcc/diagnostic.h                              |    4 +
 gcc/doc/extend.texi                           |   49 +
 gcc/gcc-urlifier.cc                           |  159 ++
 gcc/gcc-urlifier.def                          | 2532 +++++++++++++++++
 gcc/gcc-urlifier.h                            |   26 +
 gcc/gcc.cc                                    |    2 +
 gcc/pretty-print-urlifier.h                   |   33 +
 gcc/pretty-print.cc                           |  242 +-
 gcc/pretty-print.h                            |    5 +-
 gcc/selftest-run-tests.cc                     |    1 +
 gcc/selftest.h                                |    1 +
 gcc/stor-layout.h                             |    3 +
 .../c-c++-common/pragma-message-parsing.c     |   21 +
 .../c-c++-common/pragma-optimize-parsing.c    |   16 +
 .../c-c++-common/pragma-pack-parsing-1.c      |   19 +
 .../c-c++-common/pragma-pack-parsing-2.c      |    4 +
 .../pragma-redefine_extname-parsing.c         |    9 +
 .../c-c++-common/pragma-target-parsing.c      |   14 +
 .../c-c++-common/pragma-visibility-parsing.c  |   13 +
 .../c-c++-common/pragma-weak-parsing.c        |   24 +
 gcc/testsuite/gcc.dg/bad-pragma-locations.c   |   22 +-
 .../gcc.dg/parsing-pragma-show_layout.c       |   15 +
 .../pragma-scalar_storate_order-parsing.c     |    8 +
 gcc/testsuite/gcc.dg/pragma-show_layout-1.c   |   12 +
 gcc/testsuite/gcc.dg/pragma-show_layout-2.c   |  184 ++
 ...agma-show_layout-infoleak-CVE-2017-18550.c |  175 ++
 gcc/testsuite/gcc.dg/sso-6.c                  |    2 +-
 gcc/toplev.cc                                 |    2 +
 35 files changed, 4589 insertions(+), 149 deletions(-)
 create mode 100755 contrib/regenerate-index-urls.py
 create mode 100644 gcc/gcc-urlifier.cc
 create mode 100644 gcc/gcc-urlifier.def
 create mode 100644 gcc/gcc-urlifier.h
 create mode 100644 gcc/pretty-print-urlifier.h
 create mode 100644 gcc/testsuite/c-c++-common/pragma-message-parsing.c
 create mode 100644 gcc/testsuite/c-c++-common/pragma-optimize-parsing.c
 create mode 100644 gcc/testsuite/c-c++-common/pragma-pack-parsing-1.c
 create mode 100644 gcc/testsuite/c-c++-common/pragma-pack-parsing-2.c
 create mode 100644 gcc/testsuite/c-c++-common/pragma-redefine_extname-parsing.c
 create mode 100644 gcc/testsuite/c-c++-common/pragma-target-parsing.c
 create mode 100644 gcc/testsuite/c-c++-common/pragma-visibility-parsing.c
 create mode 100644 gcc/testsuite/c-c++-common/pragma-weak-parsing.c
 create mode 100644 gcc/testsuite/gcc.dg/parsing-pragma-show_layout.c
 create mode 100644 gcc/testsuite/gcc.dg/pragma-scalar_storate_order-parsing.c
 create mode 100644 gcc/testsuite/gcc.dg/pragma-show_layout-1.c
 create mode 100644 gcc/testsuite/gcc.dg/pragma-show_layout-2.c
 create mode 100644 gcc/testsuite/gcc.dg/pragma-show_layout-infoleak-CVE-2017-18550.c

-- 
2.26.3


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

* [PATCH 1/4] c/c++: rework pragma parsing
  2023-11-02 13:19 [PATCH/RFC 0/4] C/C++/diagnostics: various UX improvements David Malcolm
@ 2023-11-02 13:19 ` David Malcolm
  2023-11-02 13:19 ` [PATCH 2/4] c: add #pragma GCC show_layout David Malcolm
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 6+ messages in thread
From: David Malcolm @ 2023-11-02 13:19 UTC (permalink / raw)
  To: gcc-patches; +Cc: David Malcolm

This patch reworks pragma parsing in c-pragma.cc, with the
following improvements:

- it replaces the GCC_BAD* macros (that contained "return") in favor
of helper classes and functions for emitting diagnostics, making control
flow more explicit

- the -Wpragmas diagnostics are reworded from the form e.g.:
  DESCRIPTION OF PROBLEM; ignored
to:
  ignoring malformed '#pragma FOO': DESCRIPTION OF PROBLEM

- the locations of the warnings are fixed to more accurately
reflect the location of the problem

- the names of the pragmas are URLified into links to the
documentation for the pragma.  For example, in:

  warning: ignoring malformed '#pragma weak': expected name [-Wpragmas]

in a suitable terminal, the "#pragma weak" within quotes is a link
to https://gcc.gnu.org/onlinedocs/gcc/Weak-Pragmas.html; similarly with

  warning: '#pragma pack' has no effect with '-fpack-struct' - ignored [-Wpragmas]

the "#pragma pack" text is linkified to
  https://gcc.gnu.org/onlinedocs/gcc/Structure-Layout-Pragmas.html
and the "-fpack-struct" text is linkified to:
  https://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html#index-fpack-struct

I have a more general and maintainable approach to adding URLs to
diagnostics which is in a followup.

gcc/c-family/ChangeLog:
	* c-pragma.cc (GCC_BAD): Delete.
	(GCC_BAD2): Delete.
	(GCC_BAD_AT): Delete.
	(GCC_BAD2_AT): Delete.
	(get_doc_url): New.
	(class pragma_parser): New.
	(handle_pragma_pack): Delete redundant forward decl.
	(pop_alignment): Add param "p" and use it to get doc urls.
	(enum class pack_action): Move here from within
	handle_pragma_pack.
	(class pragma_pack_parser): New.
	(handle_pragma_pack): Rewrite using pragma_pack_parser
	and enum class pack_action, eliminating uses of GCC_BAD*,
	rewording diagnostics.
	(handle_pragma_weak): Rewrite using pragma_parser, eliminating
	uses of GCC_BAD*, rewording diagnostics.
	(class pragma_scalar_storage_order_parser): New.
	(handle_pragma_scalar_storage_order): Rewrite using above,
	eliminating uses of GCC_BAD*, rewording diagnostics.
	(handle_pragma_redefine_extname): Rewrite using pragma_parser,
	eliminating uses of GCC_BAD*, rewording diagnostics.  Fix overlong
	line.
	(handle_pragma_visibility): Remove redundant forward decl.
	(push_visibility): Add "const pragma_parser *" param.  Rewrite to
	eliminate uses of GCC_BAD*.  Add note that warning was ignored.
	(handle_pragma_visibility): Rewrite using pragma_parser,
	eliminating uses of GCC_BAD*, rewording diagnostics.
	(handle_pragma_target): Fix name of pragma in "error".  Eliminate
	uses of GCC_BAD*.
	(handle_pragma_optimize): Eliminate uses of GCC_BAD.
	(handle_pragma_message): Rewrite using pragma_parser, eliminating
	uses of GCC_BAD*, rewording diagnostics.
	* c-pragma.h (class pragma_parser): New forward decl.
	(push_visibility): Add optional "const pragma_parser *" param.

gcc/testsuite/ChangeLog:
	* c-c++-common/pragma-message-parsing.c: New test.
	* c-c++-common/pragma-optimize-parsing.c: New test.
	* c-c++-common/pragma-pack-parsing-1.c: New test.
	* c-c++-common/pragma-pack-parsing-2.c: New test.
	* c-c++-common/pragma-redefine_extname-parsing.c: New test.
	* c-c++-common/pragma-target-parsing.c: New test.
	* c-c++-common/pragma-visibility-parsing.c: New test.
	* c-c++-common/pragma-weak-parsing.c: New test.
	* gcc.dg/bad-pragma-locations.c: Update for changes to wording and
	location of -Wpragmas.
	* gcc.dg/pragma-scalar_storate_order-parsing.c: New test.
	* gcc.dg/sso-6.c: Update for changes to wording of -Wpragmas.
---
 gcc/c-family/c-pragma.cc                      | 569 ++++++++++++++----
 gcc/c-family/c-pragma.h                       |   5 +-
 .../c-c++-common/pragma-message-parsing.c     |  21 +
 .../c-c++-common/pragma-optimize-parsing.c    |  16 +
 .../c-c++-common/pragma-pack-parsing-1.c      |  19 +
 .../c-c++-common/pragma-pack-parsing-2.c      |   4 +
 .../pragma-redefine_extname-parsing.c         |   9 +
 .../c-c++-common/pragma-target-parsing.c      |  14 +
 .../c-c++-common/pragma-visibility-parsing.c  |  13 +
 .../c-c++-common/pragma-weak-parsing.c        |  24 +
 gcc/testsuite/gcc.dg/bad-pragma-locations.c   |  22 +-
 .../pragma-scalar_storate_order-parsing.c     |   8 +
 gcc/testsuite/gcc.dg/sso-6.c                  |   2 +-
 13 files changed, 588 insertions(+), 138 deletions(-)
 create mode 100644 gcc/testsuite/c-c++-common/pragma-message-parsing.c
 create mode 100644 gcc/testsuite/c-c++-common/pragma-optimize-parsing.c
 create mode 100644 gcc/testsuite/c-c++-common/pragma-pack-parsing-1.c
 create mode 100644 gcc/testsuite/c-c++-common/pragma-pack-parsing-2.c
 create mode 100644 gcc/testsuite/c-c++-common/pragma-redefine_extname-parsing.c
 create mode 100644 gcc/testsuite/c-c++-common/pragma-target-parsing.c
 create mode 100644 gcc/testsuite/c-c++-common/pragma-visibility-parsing.c
 create mode 100644 gcc/testsuite/c-c++-common/pragma-weak-parsing.c
 create mode 100644 gcc/testsuite/gcc.dg/pragma-scalar_storate_order-parsing.c

diff --git a/gcc/c-family/c-pragma.cc b/gcc/c-family/c-pragma.cc
index df3e3e6b3b0..6df8683af77 100644
--- a/gcc/c-family/c-pragma.cc
+++ b/gcc/c-family/c-pragma.cc
@@ -35,14 +35,161 @@ along with GCC; see the file COPYING3.  If not see
 #include "plugin.h"
 #include "opt-suggestions.h"
 
-#define GCC_BAD(gmsgid) \
-  do { warning (OPT_Wpragmas, gmsgid); return; } while (0)
-#define GCC_BAD2(gmsgid, arg) \
-  do { warning (OPT_Wpragmas, gmsgid, arg); return; } while (0)
-#define GCC_BAD_AT(loc, gmsgid)					\
-  do { warning_at (loc, OPT_Wpragmas, gmsgid); return; } while (0)
-#define GCC_BAD2_AT(loc, gmsgid, arg)			\
-  do { warning_at (loc, OPT_Wpragmas, gmsgid, arg); return; } while (0)
+label_text
+get_doc_url (const char *doc_url_suffix)
+{
+  if (!doc_url_suffix)
+    return label_text ();
+  return label_text::take (concat (DOCUMENTATION_ROOT_URL,
+				   doc_url_suffix,
+				   nullptr));
+}
+
+/* A class for implementing parsing within pragma-handling callbacks.
+   Provides various wrappers around pragma_lex.  */
+
+class pragma_parser
+{
+public:
+  pragma_parser (const char *space, const char *name,
+		 const char *doc_url_suffix)
+  : m_start_loc (input_location),
+    m_space (space),
+    m_name (name),
+    m_doc_url_suffix (doc_url_suffix),
+    m_last_loc (m_start_loc)
+  {
+    // SPACE can be null.
+    gcc_assert (name);
+    // DOC_URL_SUFFIX can be null
+  }
+
+  location_t
+  get_last_location () const
+  {
+    return m_last_loc;
+  }
+
+  bool
+  require_token (enum cpp_ttype required_ttype, const char *desc)
+  {
+    tree x = NULL_TREE;
+
+    enum cpp_ttype ttype = pragma_lex (&x, &m_last_loc);
+    if (ttype != required_ttype)
+      {
+	label_text doc_url (get_doc_url ());
+	if (m_space)
+	  warning_at (m_last_loc, OPT_Wpragmas,
+		      "ignoring malformed %<%{#pragma %s %s%}%>:"
+		      " expected %qs",
+		      doc_url.get (), m_space, m_name,
+		      desc);
+	else
+	  warning_at (m_last_loc, OPT_Wpragmas,
+		      "ignoring malformed %<%{#pragma %s%}%>:"
+		      " expected %qs",
+		      doc_url.get (), m_name,
+		      desc);
+	return false;
+      }
+    return true;
+  }
+
+  bool
+  require_open_paren ()
+  {
+    return require_token (CPP_OPEN_PAREN, "(");
+  }
+
+  bool
+  require_close_paren ()
+  {
+    return require_token (CPP_CLOSE_PAREN, ")");
+  }
+
+  tree require_name ()
+  {
+    tree x = NULL_TREE;
+
+    enum cpp_ttype ttype = pragma_lex (&x, &m_last_loc);
+    if (ttype != CPP_NAME)
+      {
+	label_text doc_url (get_doc_url ());
+	if (m_space)
+	  warning_at (m_last_loc, OPT_Wpragmas,
+		      "ignoring malformed %<%{#pragma %s %s%}%>:"
+		      "expected name",
+		      doc_url.get (), m_space, m_name);
+	else
+	  warning_at (m_last_loc, OPT_Wpragmas,
+		      "ignoring malformed %<%{#pragma %s%}%>:"
+		      " expected name",
+		      doc_url.get (), m_name);
+	return NULL_TREE;
+      }
+
+    return x;
+  }
+
+  tree require_symbol_name ()
+  {
+    tree x = NULL_TREE;
+
+    enum cpp_ttype ttype = pragma_lex (&x, &m_last_loc);
+    if (ttype != CPP_NAME)
+      {
+	label_text doc_url (get_doc_url ());
+	if (m_space)
+	  warning_at (m_last_loc, OPT_Wpragmas,
+		      "ignoring malformed %<%{#pragma %s %s%}%>:"
+		      " expected symbol name",
+		      doc_url.get (), m_space, m_name);
+	else
+	  warning_at (m_last_loc, OPT_Wpragmas,
+		      "ignoring malformed %<%{#pragma %s%}%>:"
+		      " expected symbol name",
+		      doc_url.get (), m_name);
+	return NULL_TREE;
+      }
+
+    return x;
+  }
+
+  void
+  check_for_trailing_junk ()
+  {
+    tree x = NULL_TREE;
+    enum cpp_ttype t = pragma_lex (&x, &m_last_loc);
+    warn_about_any_trailing_junk (t, m_last_loc);
+  }
+
+  void
+  warn_about_any_trailing_junk (enum cpp_ttype t, location_t loc) const
+  {
+    if (t == CPP_EOF)
+      return;
+    label_text doc_url (get_doc_url ());
+    if (m_space)
+      warning_at (loc, OPT_Wpragmas, "junk at end of %<%{#pragma %s %s%}%>",
+		  doc_url.get (), m_space, m_name);
+    else
+      warning_at (loc, OPT_Wpragmas, "junk at end of %<%{#pragma %s%}%>",
+		  doc_url.get (), m_name);
+  }
+
+  label_text
+  get_doc_url () const
+  {
+    return ::get_doc_url (m_doc_url_suffix);
+  }
+
+  const location_t m_start_loc;
+  const char *const m_space;
+  const char *const m_name;
+  const char *m_doc_url_suffix;
+  location_t m_last_loc;
+};
 
 struct GTY(()) align_stack {
   int		       alignment;
@@ -52,8 +199,6 @@ struct GTY(()) align_stack {
 
 static GTY(()) struct align_stack * alignment_stack;
 
-static void handle_pragma_pack (cpp_reader *);
-
 /* If we have a "global" #pragma pack(<n>) in effect when the first
    #pragma pack(push,<n>) is encountered, this stores the value of
    maximum_field_alignment in effect.  When the final pop_alignment()
@@ -65,7 +210,7 @@ static int default_alignment;
 	: &alignment_stack->alignment) = (ALIGN))
 
 static void push_alignment (int, tree);
-static void pop_alignment (tree);
+static void pop_alignment (tree, const pragma_parser &p);
 
 /* Push an alignment value onto the stack.  */
 static void
@@ -90,13 +235,19 @@ push_alignment (int alignment, tree id)
 
 /* Undo a push of an alignment onto the stack.  */
 static void
-pop_alignment (tree id)
+pop_alignment (tree id, const pragma_parser &p)
 {
   align_stack * entry;
 
   if (alignment_stack == NULL)
-    GCC_BAD ("%<#pragma pack (pop)%> encountered without matching "
-	     "%<#pragma pack (push)%>");
+    {
+      label_text doc_url (p.get_doc_url ());
+      warning (OPT_Wpragmas,
+	       "%<%{#pragma pack (pop)%}%> encountered without matching "
+	       "%<%{#pragma pack (push)%}%>",
+	       doc_url.get (), doc_url.get ());
+      return;
+    }
 
   /* If we got an identifier, strip away everything above the target
      entry so that the next step will restore the state just below it.  */
@@ -109,10 +260,12 @@ pop_alignment (tree id)
 	    break;
 	  }
       if (entry == NULL)
-	warning (OPT_Wpragmas,
-		 "%<#pragma pack(pop, %E)%> encountered without matching "
-		 "%<#pragma pack(push, %E)%>"
-		 , id, id);
+	{
+	  warning (OPT_Wpragmas,
+		   "%<#pragma pack(pop, %E)%> encountered without matching "
+		   "%<#pragma pack(push, %E)%>",
+		   id, id);
+	}
     }
 
   entry = alignment_stack->prev;
@@ -122,6 +275,41 @@ pop_alignment (tree id)
   alignment_stack = entry;
 }
 
+enum class pack_action { set, push, pop };
+
+class pragma_pack_parser : public pragma_parser
+{
+public:
+  pragma_pack_parser ()
+  : pragma_parser (nullptr, "pack", "gcc/Structure-Layout-Pragmas.html")
+  {
+  }
+
+  bool require_integer (tree x, location_t loc) const
+  {
+    if (TREE_CODE (x) == INTEGER_CST)
+      return true;
+
+    label_text doc_url (get_doc_url ());
+    warning_at (loc, OPT_Wpragmas,
+		"ignoring malformed %<%{#pragma pack%}%>:"
+		" invalid constant",
+		doc_url.get ());
+    return false;
+  }
+
+  void complain_about_malformed_action (pack_action action) const
+  {
+    label_text doc_url (get_doc_url ());
+    if (action != pack_action::pop)
+      warning_at (m_last_loc, OPT_Wpragmas,
+		  "ignoring malformed %<#pragma pack(push[, id][, <n>])%>");
+    else
+      warning_at (m_last_loc, OPT_Wpragmas,
+		  "ignoring malformed %<#pragma pack(pop[, id])%>");
+  }
+};
+
 /* #pragma pack ()
    #pragma pack (N)
 
@@ -134,46 +322,50 @@ pop_alignment (tree id)
 static void
 handle_pragma_pack (cpp_reader *)
 {
+  pragma_pack_parser p;
+
   location_t loc;
   tree x, id = 0;
   int align = -1;
+  location_t align_loc = input_location;
   enum cpp_ttype token;
-  enum { set, push, pop } action;
+  enum pack_action action;
 
-  if (pragma_lex (&x) != CPP_OPEN_PAREN)
-    GCC_BAD ("missing %<(%> after %<#pragma pack%> - ignored");
+  if (!p.require_open_paren ())
+    return;
 
   token = pragma_lex (&x, &loc);
   if (token == CPP_CLOSE_PAREN)
     {
-      action = set;
+      action = pack_action::set;
       align = initial_max_fld_align;
     }
   else if (token == CPP_NUMBER)
     {
-      if (TREE_CODE (x) != INTEGER_CST)
-	GCC_BAD_AT (loc, "invalid constant in %<#pragma pack%> - ignored");
+      if (!p.require_integer (x, loc))
+	return;
       align = TREE_INT_CST_LOW (x);
-      action = set;
-      if (pragma_lex (&x) != CPP_CLOSE_PAREN)
-	GCC_BAD ("malformed %<#pragma pack%> - ignored");
+      align_loc = loc;
+      action = pack_action::set;
+      if (!p.require_close_paren ())
+	return;
     }
   else if (token == CPP_NAME)
     {
-#define GCC_BAD_ACTION do { if (action != pop) \
-	  GCC_BAD ("malformed %<#pragma pack(push[, id][, <n>])%> - ignored"); \
-	else \
-	  GCC_BAD ("malformed %<#pragma pack(pop[, id])%> - ignored"); \
-	} while (0)
-
       const char *op = IDENTIFIER_POINTER (x);
       if (!strcmp (op, "push"))
-	action = push;
+	action = pack_action::push;
       else if (!strcmp (op, "pop"))
-	action = pop;
+	action = pack_action::pop;
       else
-	GCC_BAD2_AT (loc, "unknown action %qE for %<#pragma pack%> - ignored",
-		     x);
+	{
+	  label_text doc_url (p.get_doc_url ());
+	  warning_at (loc, OPT_Wpragmas,
+		      "ignoring malformed %<%{#pragma pack%}%>:"
+		      " unknown action %qE",
+		      doc_url.get (), x);
+	  return;
+	}
 
       while ((token = pragma_lex (&x)) == CPP_COMMA)
 	{
@@ -182,33 +374,56 @@ handle_pragma_pack (cpp_reader *)
 	    {
 	      id = x;
 	    }
-	  else if (token == CPP_NUMBER && action == push && align == -1)
+	  else if (token == CPP_NUMBER
+		   && action == pack_action::push
+		   && align == -1)
 	    {
-	      if (TREE_CODE (x) != INTEGER_CST)
-		GCC_BAD_AT (loc,
-			    "invalid constant in %<#pragma pack%> - ignored");
+	      if (!p.require_integer (x, loc))
+		return;
 	      align = TREE_INT_CST_LOW (x);
+	      align_loc = loc;
 	      if (align == -1)
-		action = set;
+		action = pack_action::set;
 	    }
 	  else
-	    GCC_BAD_ACTION;
+	    {
+	      p.complain_about_malformed_action (action);
+	      return;
+	    }
 	}
 
       if (token != CPP_CLOSE_PAREN)
-	GCC_BAD_ACTION;
-#undef GCC_BAD_ACTION
+	{
+	  p.complain_about_malformed_action (action);
+	  return;
+	}
     }
   else
-    GCC_BAD ("malformed %<#pragma pack%> - ignored");
+    {
+      label_text doc_url (p.get_doc_url ());
+      warning_at (loc, OPT_Wpragmas,
+		  "ignoring malformed %<%{#pragma pack%}%>:"
+		  " expected %<)%>, integer, %<push%>, or %<pop%>",
+		  doc_url.get ());
+      return;
+    }
 
   if (pragma_lex (&x, &loc) != CPP_EOF)
     warning_at (loc, OPT_Wpragmas, "junk at end of %<#pragma pack%>");
 
   if (flag_pack_struct)
-    GCC_BAD ("%<#pragma pack%> has no effect with %<-fpack-struct%> - ignored");
+    {
+      label_text pragma_doc_url (p.get_doc_url ());
+      label_text option_doc_url
+	(get_doc_url ("gcc/Code-Gen-Options.html#index-fpack-struct"));
+      warning (OPT_Wpragmas,
+	       "%<%{#pragma pack%}%> has no effect with %<%{-fpack-struct%}%>"
+	       " - ignored",
+	       pragma_doc_url.get (), option_doc_url.get ());
+      return;
+    }
 
-  if (action != pop)
+  if (action != pack_action::pop)
     switch (align)
       {
       case 0:
@@ -220,21 +435,28 @@ handle_pragma_pack (cpp_reader *)
 	align *= BITS_PER_UNIT;
 	break;
       case -1:
-	if (action == push)
+	if (action == pack_action::push)
 	  {
 	    align = maximum_field_alignment;
 	    break;
 	  }
 	/* FALLTHRU */
       default:
-	GCC_BAD2 ("alignment must be a small power of two, not %d", align);
+	{
+	  label_text doc_url (p.get_doc_url ());
+	  warning_at (align_loc, OPT_Wpragmas,
+		      "ignoring malformed %<%{#pragma pack%}%>:"
+		      " alignment must be a small power of two, not %d",
+		      doc_url.get (), align);
+	  return;
+	}
       }
 
   switch (action)
     {
-    case set:   SET_GLOBAL_ALIGNMENT (align);  break;
-    case push:  push_alignment (align, id);    break;
-    case pop:   pop_alignment (id);	       break;
+    case pack_action::set:   SET_GLOBAL_ALIGNMENT (align);  break;
+    case pack_action::push:  push_alignment (align, id);    break;
+    case pack_action::pop:   pop_alignment (id, p);	       break;
     }
 }
 
@@ -357,29 +579,46 @@ maybe_apply_pending_pragma_weaks (void)
 static void
 handle_pragma_weak (cpp_reader *)
 {
-  tree name, value, x, decl;
+  pragma_parser p (nullptr, "weak", "gcc/Weak-Pragmas.html");
+
+  tree x, decl;
   enum cpp_ttype t;
+  location_t loc;
+  location_t name_loc;
 
-  value = 0;
+  tree name = p.require_name ();
+  if (!name)
+    return;
+  name_loc = p.get_last_location ();
 
-  if (pragma_lex (&name) != CPP_NAME)
-    GCC_BAD ("malformed %<#pragma weak%>, ignored");
-  t = pragma_lex (&x);
+  tree value = NULL_TREE;
+  t = pragma_lex (&x, &loc);
   if (t == CPP_EQ)
     {
-      if (pragma_lex (&value) != CPP_NAME)
-	GCC_BAD ("malformed %<#pragma weak%>, ignored");
-      t = pragma_lex (&x);
+      value = p.require_name ();
+      if (!value)
+	return;
+      t = pragma_lex (&x, &loc);
     }
-  if (t != CPP_EOF)
-    warning (OPT_Wpragmas, "junk at end of %<#pragma weak%>");
+  p.warn_about_any_trailing_junk (t, loc);
 
   decl = identifier_global_value (name);
   if (decl && DECL_P (decl))
     {
       if (!VAR_OR_FUNCTION_DECL_P (decl))
-	GCC_BAD2 ("%<#pragma weak%> declaration of %q+D not allowed,"
-		  " ignored", decl);
+	{
+	  auto_diagnostic_group d;
+	  label_text doc_url (p.get_doc_url ());
+	  if (warning_at (name_loc, OPT_Wpragmas,
+			  "%<%{#pragma weak%}%> declaration of %qD not allowed,"
+			  " ignored",
+			  doc_url.get (), decl))
+	    if (DECL_SOURCE_LOCATION (decl) != UNKNOWN_LOCATION)
+	      inform (DECL_SOURCE_LOCATION (decl),
+		      "%qD is not a variable or function",
+		      decl);
+	  return;
+	}
       apply_pragma_weak (decl, value);
       if (value)
 	{
@@ -417,12 +656,29 @@ maybe_apply_pragma_scalar_storage_order (tree type)
     gcc_unreachable ();
 }
 
+class pragma_scalar_storage_order_parser : public pragma_parser
+{
+public:
+  pragma_scalar_storage_order_parser ()
+   : pragma_parser (nullptr, "scalar_storage_order",
+		    "gcc/Structure-Layout-Pragmas.html")
+  {
+  }
+
+  void complain_about_arg (location_t arg_loc) const
+  {
+    label_text doc_url (get_doc_url ());
+    warning_at (arg_loc, OPT_Wpragmas,
+		"ignoring malformed %<%{#pragma scalar_storage_order%}%>:"
+		" expected %<big-endian%>, %<little-endian%>, or %<default%>",
+		doc_url.get ());
+  }
+};
+
 static void
 handle_pragma_scalar_storage_order (cpp_reader *)
 {
-  const char *kind_string;
-  enum cpp_ttype token;
-  tree x;
+  pragma_scalar_storage_order_parser p;
 
   if (BYTES_BIG_ENDIAN != WORDS_BIG_ENDIAN)
     {
@@ -439,11 +695,15 @@ handle_pragma_scalar_storage_order (cpp_reader *)
       return;
     }
 
-  token = pragma_lex (&x);
+  tree x;
+  location_t arg_loc;
+  enum cpp_ttype token = pragma_lex (&x, &arg_loc);
   if (token != CPP_NAME)
-    GCC_BAD ("missing %<big-endian%>, %<little-endian%>, or %<default%> after "
-	     "%<#pragma scalar_storage_order%>");
-  kind_string = IDENTIFIER_POINTER (x);
+    {
+      p.complain_about_arg (arg_loc);
+      return;
+    }
+  const char *kind_string = IDENTIFIER_POINTER (x);
   if (strcmp (kind_string, "default") == 0)
     global_sso = default_sso;
   else if (strcmp (kind_string, "big") == 0)
@@ -451,8 +711,7 @@ handle_pragma_scalar_storage_order (cpp_reader *)
   else if (strcmp (kind_string, "little") == 0)
     global_sso = SSO_LITTLE_ENDIAN;
   else
-    GCC_BAD ("expected %<big-endian%>, %<little-endian%>, or %<default%> after "
-	     "%<#pragma scalar_storage_order%>");
+    p.complain_about_arg (arg_loc);
 }
 
 /* GCC supports two #pragma directives for renaming the external
@@ -501,20 +760,19 @@ static void handle_pragma_redefine_extname (cpp_reader *);
 static void
 handle_pragma_redefine_extname (cpp_reader *)
 {
-  tree oldname, newname, decls, x;
-  enum cpp_ttype t;
-  bool found;
-
-  if (pragma_lex (&oldname) != CPP_NAME)
-    GCC_BAD ("malformed %<#pragma redefine_extname%>, ignored");
-  if (pragma_lex (&newname) != CPP_NAME)
-    GCC_BAD ("malformed %<#pragma redefine_extname%>, ignored");
-  t = pragma_lex (&x);
-  if (t != CPP_EOF)
-    warning (OPT_Wpragmas, "junk at end of %<#pragma redefine_extname%>");
-
-  found = false;
-  for (decls = c_linkage_bindings (oldname);
+  pragma_parser p (nullptr, "redefine_extname",
+		   "gcc/Symbol-Renaming-Pragmas.html");
+
+  tree oldname = p.require_symbol_name ();
+  if (!oldname)
+    return;
+  tree newname = p.require_symbol_name ();
+  if (!newname)
+    return;
+  p.check_for_trailing_junk ();
+
+  bool found = false;
+  for (tree decls = c_linkage_bindings (oldname);
        decls; )
     {
       tree decl;
@@ -535,7 +793,8 @@ handle_pragma_redefine_extname (cpp_reader *)
 	  found = true;
 	  if (DECL_ASSEMBLER_NAME_SET_P (decl))
 	    {
-	      const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
+	      const char *name
+		= IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
 	      name = targetm.strip_name_encoding (name);
 
 	      if (!id_equal (newname, name))
@@ -671,8 +930,6 @@ maybe_apply_renaming_pragma (tree decl, tree asmname)
 }
 
 
-static void handle_pragma_visibility (cpp_reader *);
-
 static vec<int> visstack;
 
 /* Push the visibility indicated by STR onto the top of the #pragma
@@ -683,7 +940,7 @@ static vec<int> visstack;
    KIND and pop using a different one.  */
 
 void
-push_visibility (const char *str, int kind)
+push_visibility (const char *str, int kind, const pragma_parser *p)
 {
   visstack.safe_push (((int) default_visibility) | (kind << 8));
   if (!strcmp (str, "default"))
@@ -695,8 +952,23 @@ push_visibility (const char *str, int kind)
   else if (!strcmp (str, "protected"))
     default_visibility = VISIBILITY_PROTECTED;
   else
-    GCC_BAD ("%<#pragma GCC visibility push()%> must specify %<default%>, "
-	     "%<internal%>, %<hidden%> or %<protected%>");
+    {
+      auto_diagnostic_group d;
+      location_t loc = p ? p->get_last_location () : input_location;
+      if (warning_at (loc,
+		      OPT_Wpragmas,
+		      "%<#pragma GCC visibility push()%> must specify"
+		      " %<default%>, %<internal%>, %<hidden%>"
+		      " or %<protected%>"))
+	if (p)
+	  {
+	    label_text doc_url (p->get_doc_url ());
+	    inform (loc,
+		    "ignoring malformed %<%{#pragma GCC visibility%}%>",
+		    doc_url.get ());
+	  }
+      return;
+    }
   visibility_options.inpragma = 1;
 }
 
@@ -723,6 +995,8 @@ pop_visibility (int kind)
 static void
 handle_pragma_visibility (cpp_reader *)
 {
+  pragma_parser p ("GCC", "visibility", "gcc/Visibility-Pragmas.html");
+
   /* Form is #pragma GCC visibility push(hidden)|pop */
   tree x;
   enum cpp_ttype token;
@@ -738,30 +1012,41 @@ handle_pragma_visibility (cpp_reader *)
 	action = pop;
     }
   if (bad == action)
-    GCC_BAD ("%<#pragma GCC visibility%> must be followed by %<push%> "
-	     "or %<pop%>");
+    {
+      label_text doc_url (p.get_doc_url ());
+      warning (OPT_Wpragmas,
+	       "%<%{#pragma GCC visibility%}%> must be followed by %<push%> "
+	       "or %<pop%>",
+	       doc_url.get ());
+      return;
+    }
   else
     {
       if (pop == action)
 	{
 	  if (! pop_visibility (0))
-	    GCC_BAD ("no matching push for %<#pragma GCC visibility pop%>");
+	    {
+	      label_text doc_url (p.get_doc_url ());
+	      warning (OPT_Wpragmas,
+		       "no matching push for"
+		       " %<%{#pragma GCC visibility pop%}%>",
+		       doc_url.get ());
+	      return;
+	    }
 	}
       else
 	{
-	  if (pragma_lex (&x) != CPP_OPEN_PAREN)
-	    GCC_BAD ("missing %<(%> after %<#pragma GCC visibility push%> - ignored");
-	  token = pragma_lex (&x);
-	  if (token != CPP_NAME)
-	    GCC_BAD ("malformed %<#pragma GCC visibility push%>");
-	  else
-	    push_visibility (IDENTIFIER_POINTER (x), 0);
-	  if (pragma_lex (&x) != CPP_CLOSE_PAREN)
-	    GCC_BAD ("missing %<(%> after %<#pragma GCC visibility push%> - ignored");
+	  if (!p.require_open_paren ())
+	    return;
+	  x = p.require_name ();
+	  if (!x)
+	    return;
+	  push_visibility (IDENTIFIER_POINTER (x), 0, &p);
+	  if (!p.require_close_paren ())
+	    return;
 	}
     }
-  if (pragma_lex (&x) != CPP_EOF)
-    warning (OPT_Wpragmas, "junk at end of %<#pragma GCC visibility%>");
+  p.check_for_trailing_junk ();
 }
 
 /* Helper routines for parsing #pragma GCC diagnostic.  */
@@ -1051,7 +1336,7 @@ handle_pragma_target(cpp_reader *)
 
   if (cfun)
     {
-      error ("%<#pragma GCC option%> is not allowed inside functions");
+      error ("%<#pragma GCC target option%> is not allowed inside functions");
       return;
     }
 
@@ -1063,7 +1348,12 @@ handle_pragma_target(cpp_reader *)
     }
 
   if (token != CPP_STRING)
-    GCC_BAD_AT (loc, "%<#pragma GCC option%> is not a string");
+    {
+      warning_at (loc, OPT_Wpragmas,
+		  "ignoring malformed %<#pragma GCC target%>:"
+		  " expected a string option");
+      return;
+    }
 
   /* Strings are user options.  */
   else
@@ -1088,8 +1378,12 @@ handle_pragma_target(cpp_reader *)
 	  if (token == CPP_CLOSE_PAREN)
 	    token = pragma_lex (&x);
 	  else
-	    GCC_BAD ("%<#pragma GCC target (string [,string]...)%> does "
-		     "not have a final %<)%>");
+	    {
+	      warning (OPT_Wpragmas,
+		       "%<#pragma GCC target (string [,string]...)%> does "
+		       "not have a final %<)%>");
+	      return;
+	    }
 	}
 
       if (token != CPP_EOF)
@@ -1135,7 +1429,11 @@ handle_pragma_optimize (cpp_reader *)
     }
 
   if (token != CPP_STRING && token != CPP_NUMBER)
-    GCC_BAD ("%<#pragma GCC optimize%> is not a string or number");
+    {
+      warning (OPT_Wpragmas,
+	       "%<#pragma GCC optimize%> is not a string or number");
+      return;
+    }
 
   /* Strings/numbers are user options.  */
   else
@@ -1159,8 +1457,12 @@ handle_pragma_optimize (cpp_reader *)
 	  if (token == CPP_CLOSE_PAREN)
 	    token = pragma_lex (&x);
 	  else
-	    GCC_BAD ("%<#pragma GCC optimize (string [,string]...)%> does "
-		     "not have a final %<)%>");
+	    {
+	      warning (OPT_Wpragmas,
+		       "%<#pragma GCC optimize (string [,string]...)%> does "
+		       "not have a final %<)%>");
+	      return;
+	    }
 	}
 
       if (token != CPP_EOF)
@@ -1336,33 +1638,50 @@ handle_pragma_reset_options (cpp_reader *)
 static void
 handle_pragma_message (cpp_reader *)
 {
+  pragma_parser p (nullptr, "message", "gcc/Diagnostic-Pragmas.html");
+
   location_t loc;
   enum cpp_ttype token;
   tree x, message = 0;
 
-  token = pragma_lex (&x);
+  token = pragma_lex (&x, &loc);
   if (token == CPP_OPEN_PAREN)
     {
-      token = pragma_lex (&x);
+      token = pragma_lex (&x, &loc);
       if (token == CPP_STRING)
         message = x;
       else
-        GCC_BAD ("expected a string after %<#pragma message%>");
-      if (pragma_lex (&x) != CPP_CLOSE_PAREN)
-        GCC_BAD ("malformed %<#pragma message%>, ignored");
+	{
+	  label_text doc_url (p.get_doc_url ());
+	  warning_at (loc, OPT_Wpragmas,
+		      "expected a string after %<%{#pragma message%}%>",
+		      doc_url.get ());
+	  return;
+	}
+      if (!p.require_close_paren ())
+	return;
     }
   else if (token == CPP_STRING)
     message = x;
   else if (token == CPP_STRING_USERDEF)
-    GCC_BAD ("string literal with user-defined suffix is invalid in this "
-	     "context");
+    {
+      warning_at (loc, OPT_Wpragmas,
+		  "string literal with user-defined suffix is invalid in this "
+		  "context");
+      return;
+    }
   else
-    GCC_BAD ("expected a string after %<#pragma message%>");
+    {
+      label_text doc_url (p.get_doc_url ());
+      warning_at (loc, OPT_Wpragmas,
+		  "expected a string after %<%{#pragma message%}%>",
+		  doc_url.get ());
+      return;
+    }
 
   gcc_assert (message);
 
-  if (pragma_lex (&x, &loc) != CPP_EOF)
-    warning_at (loc, OPT_Wpragmas, "junk at end of %<#pragma message%>");
+  p.check_for_trailing_junk ();
 
   if (TREE_STRING_LENGTH (message) > 1)
     inform (input_location, "%<#pragma message: %s%>",
diff --git a/gcc/c-family/c-pragma.h b/gcc/c-family/c-pragma.h
index 682157a4517..abaf897d84d 100644
--- a/gcc/c-family/c-pragma.h
+++ b/gcc/c-family/c-pragma.h
@@ -203,10 +203,13 @@ enum pragma_omp_clause {
 
 extern struct cpp_reader* parse_in;
 
+class pragma_parser;
+
 /* It's safe to always leave visibility pragma enabled as if
    visibility is not supported on the host OS platform the
    statements are ignored.  */
-extern void push_visibility (const char *, int);
+extern void push_visibility (const char *, int,
+			     const pragma_parser *p = nullptr);
 extern bool pop_visibility (int);
 
 extern void init_pragma (void);
diff --git a/gcc/testsuite/c-c++-common/pragma-message-parsing.c b/gcc/testsuite/c-c++-common/pragma-message-parsing.c
new file mode 100644
index 00000000000..4acb9d16c51
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/pragma-message-parsing.c
@@ -0,0 +1,21 @@
+/* Test that we provide good warnings for malformed '#pragma message'.  */
+
+#pragma message  /* { dg-line no_arg } */
+/* { dg-warning "expected a string after '#pragma message'" "" { target *-*-* } no_arg } */
+
+#pragma message 1066  /* { dg-line bad_arg } */
+/* { dg-warning "17: expected a string after '#pragma message'" "" { target *-*-* } bad_arg } */
+
+#pragma message "foo" /* { dg-message "#pragma message: foo" } */
+
+#pragma message(1066)  /* { dg-line parens_bad_arg } */
+/* { dg-warning "17: expected a string after '#pragma message'" "" { target *-*-* } parens_bad_arg } */
+
+#pragma message("bar") /* { dg-message "#pragma message: bar" } */
+
+#pragma message("foo") bar  /* { dg-warning "24: junk at end of '#pragma message'" } */
+
+#if defined(__cplusplus) && __cplusplus >= 201103L
+unsigned operator ""_w(const char*);
+#pragma message "foo"_w /* { dg-message "17: string literal with user-defined suffix is invalid in this context" "" { target { c++11 } } } */
+#endif
diff --git a/gcc/testsuite/c-c++-common/pragma-optimize-parsing.c b/gcc/testsuite/c-c++-common/pragma-optimize-parsing.c
new file mode 100644
index 00000000000..4808ce3992a
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/pragma-optimize-parsing.c
@@ -0,0 +1,16 @@
+/* Test that we provide good warnings for malformed '#pragma GCC optimize'.  */
+
+#pragma GCC optimize /* { dg-warning "'#pragma GCC optimize' is not a string or number" } */
+#pragma GCC optimize 3
+#pragma GCC optimize(  /* { dg-warning "'#pragma GCC optimize' is not a string or number" } */
+#pragma GCC optimize() /* { dg-warning "'#pragma GCC optimize' is not a string or number" } */
+#pragma GCC optimize(3, )
+#pragma GCC optimize("-O3", )
+#pragma GCC optimize(3, /* { dg-warning "'#pragma GCC optimize \\(string \\\[,string\\\]...\\)' does not have a final '\\)'" } */
+
+void foo ()
+{
+#pragma GCC optimize /* { dg-error "#pragma GCC optimize' is not allowed inside functions" } */ 
+}
+
+#pragma GCC optimize("-Ofan-noise", ) /* { dg-error "argument to '-O' should be a non-negative integer, 'g', 's', 'z' or 'fast'" } */
diff --git a/gcc/testsuite/c-c++-common/pragma-pack-parsing-1.c b/gcc/testsuite/c-c++-common/pragma-pack-parsing-1.c
new file mode 100644
index 00000000000..0e3d806388a
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/pragma-pack-parsing-1.c
@@ -0,0 +1,19 @@
+/* Test that we provide good warnings for malformed '#pragma pack'.  */
+
+#pragma pack  /* { dg-warning "ignoring malformed '#pragma pack': expected '\\('" } */
+
+#pragma pack 42  /* { dg-warning "14: ignoring malformed '#pragma pack': expected '\\('" } */
+
+#pragma pack(3.141)  /* { dg-warning "14: ignoring malformed '#pragma pack': invalid constant" } */
+
+#pragma pack((  /* { dg-warning "14: ignoring malformed '#pragma pack': expected '\\)', integer, 'push', or 'pop'" }  */
+
+#pragma pack(42  /* { dg-warning "ignoring malformed '#pragma pack': expected '\\)'" } */
+
+#pragma pack(42)  /* { dg-warning "14: ignoring malformed '#pragma pack': alignment must be a small power of two, not 42" }  */
+
+#pragma pack(foo  /* { dg-warning "14: ignoring malformed '#pragma pack': unknown action 'foo'" } */
+
+#pragma pack(push, 3.141  /* { dg-warning "20: ignoring malformed '#pragma pack': invalid constant" }  */
+
+#pragma pack(push, 42)  /* { dg-warning "20: ignoring malformed '#pragma pack': alignment must be a small power of two, not 42" }  */
diff --git a/gcc/testsuite/c-c++-common/pragma-pack-parsing-2.c b/gcc/testsuite/c-c++-common/pragma-pack-parsing-2.c
new file mode 100644
index 00000000000..efca44e8734
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/pragma-pack-parsing-2.c
@@ -0,0 +1,4 @@
+/* Test that we provide good warnings for malformed '#pragma pack'.  */
+/* { dg-options "-fpack-struct" } */
+
+#pragma pack(16) /* { dg-warning "'#pragma pack' has no effect with '-fpack-struct' - ignored" } */
diff --git a/gcc/testsuite/c-c++-common/pragma-redefine_extname-parsing.c b/gcc/testsuite/c-c++-common/pragma-redefine_extname-parsing.c
new file mode 100644
index 00000000000..19f4f1b766e
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/pragma-redefine_extname-parsing.c
@@ -0,0 +1,9 @@
+/* Test that we provide good warnings for malformed '#pragma redefine_extname'.  */
+
+/* Missing old name.  */
+#pragma redefine_extname /* { dg-warning "ignoring malformed '#pragma redefine_extname': expected symbol name" } */
+#pragma redefine_extname 42 /* { dg-warning "26: ignoring malformed '#pragma redefine_extname': expected symbol name" } */
+
+/* Missing new name.  */
+#pragma redefine_extname foo /* { dg-warning "ignoring malformed '#pragma redefine_extname': expected symbol name" } */
+#pragma redefine_extname foo 42 /* { dg-warning "30: ignoring malformed '#pragma redefine_extname': expected symbol name" } */
diff --git a/gcc/testsuite/c-c++-common/pragma-target-parsing.c b/gcc/testsuite/c-c++-common/pragma-target-parsing.c
new file mode 100644
index 00000000000..37e331626e9
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/pragma-target-parsing.c
@@ -0,0 +1,14 @@
+/* Test that we provide good warnings for malformed '#pragma target'.  */
+
+#pragma GCC target /* { dg-warning "ignoring malformed '#pragma GCC target': expected a string option" } */
+#pragma GCC target 1066 /* { dg-warning "ignoring malformed '#pragma GCC target': expected a string option" } */
+#pragma GCC target( /* { dg-warning "ignoring malformed '#pragma GCC target': expected a string option" } */
+#pragma GCC target() /* { dg-warning "ignoring malformed '#pragma GCC target': expected a string option" } */
+#pragma GCC target("", )
+#pragma GCC target("",  /* { dg-warning "'#pragma GCC target \\(string \\\[,string\\\]...\\)' does not have a final '\\)'" } */
+
+void foo ()
+{
+#pragma GCC target /* { dg-error "#pragma GCC target option' is not allowed inside functions" } */
+  /* { dg-warning "ignoring malformed '#pragma GCC target': expected a string option" "" { target c++ } .-1 } */
+}
diff --git a/gcc/testsuite/c-c++-common/pragma-visibility-parsing.c b/gcc/testsuite/c-c++-common/pragma-visibility-parsing.c
new file mode 100644
index 00000000000..19ad6758b8c
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/pragma-visibility-parsing.c
@@ -0,0 +1,13 @@
+/* Test that we provide good warnings for malformed '#pragma GCC visibility'.  */
+
+#pragma GCC visibility /* { dg-line no_action } */
+/* { dg-warning "'#pragma GCC visibility' must be followed by 'push' or 'pop'" "" { target *-*-* } no_action } */
+
+#pragma GCC visibility push 1066  /* { dg-warning "29: ignoring malformed '#pragma GCC visibility': expected '\\('" } */
+
+#pragma GCC visibility push(foo) /* { dg-line bad_push_arg } */
+/* { dg-warning "29: '#pragma GCC visibility push\\(\\)' must specify 'default', 'internal', 'hidden' or 'protected'" "" { target *-*-* } bad_push_arg }
+   { dg-message "ignoring malformed '#pragma GCC visibility'" "" { target *-*-* } bad_push_arg } */
+
+#pragma GCC visibility push(default)
+#pragma GCC visibility pop 1066  /* { dg-warning "28: junk at end of '#pragma GCC visibility'" } */
diff --git a/gcc/testsuite/c-c++-common/pragma-weak-parsing.c b/gcc/testsuite/c-c++-common/pragma-weak-parsing.c
new file mode 100644
index 00000000000..902044a2b20
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/pragma-weak-parsing.c
@@ -0,0 +1,24 @@
+/* Test that we provide good warnings for malformed '#pragma weak'.  */
+
+int bar;
+
+#pragma weak  /* { dg-warning "ignoring malformed '#pragma weak': expected name" } */
+
+#pragma weak 42  /* { dg-warning "14: ignoring malformed '#pragma weak': expected name" } */
+
+/* This should be OK.  */
+#pragma weak foo
+
+#pragma weak foo 1066  /* { dg-warning "18: junk at end of '#pragma weak'" } */
+
+#pragma weak foo =  /* { dg-warning "ignoring malformed '#pragma weak': expected name" } */
+
+#pragma weak foo = 1066  /* { dg-warning "20: ignoring malformed '#pragma weak': expected name" } */
+
+/* This should be OK.  */
+#pragma weak foo = bar
+
+#pragma weak foo = bar baz /* { dg-warning "24: junk at end of '#pragma weak'" } */
+
+typedef int foo_t; /* { dg-message "13: 'foo_t' is not a variable or function" } */
+#pragma weak foo_t /* { dg-warning "14: '#pragma weak' declaration of 'foo_t' not allowed, ignored" } */
diff --git a/gcc/testsuite/gcc.dg/bad-pragma-locations.c b/gcc/testsuite/gcc.dg/bad-pragma-locations.c
index 8068839881d..6bf821d8e2a 100644
--- a/gcc/testsuite/gcc.dg/bad-pragma-locations.c
+++ b/gcc/testsuite/gcc.dg/bad-pragma-locations.c
@@ -7,42 +7,42 @@
 /* pack ****************************************************************************/
 
 #pragma pack
-/* { dg-warning "missing '\\(' after '#pragma pack' - ignored" "" { target *-*-* } .-1 }
+/* { dg-warning "ignoring malformed '#pragma pack': expected '\\('" "" { target *-*-* } .-1 }
    { dg-begin-multiline-output "" }
  #pragma pack
-         ^~~~
+             ^
    { dg-end-multiline-output "" }  */
 
 #pragma pack (
-/* { dg-warning "malformed '#pragma pack' - ignored" "" { target *-*-* } .-1 }
+/* { dg-warning "ignoring malformed '#pragma pack': expected '\\)', integer, 'push', or 'pop'" "" { target *-*-* } .-1 }
    { dg-begin-multiline-output "" }
  #pragma pack (
-         ^~~~
+               ^
    { dg-end-multiline-output "" }  */
 
 #pragma pack (32
-/* { dg-warning "malformed '#pragma pack' - ignored" "" { target *-*-* } .-1 }
+/* { dg-warning "ignoring malformed '#pragma pack': expected '\\)'" "" { target *-*-* } .-1 }
    { dg-begin-multiline-output "" }
  #pragma pack (32
-         ^~~~
+                 ^
    { dg-end-multiline-output "" }  */
 
 #pragma pack (3.14159
-/* { dg-warning "invalid constant in '#pragma pack' - ignored" "" { target *-*-* } .-1 }
+/* { dg-warning "ignoring malformed '#pragma pack': invalid constant" "" { target *-*-* } .-1 }
    { dg-begin-multiline-output "" }
  #pragma pack (3.14159
                ^~~~~~~
    { dg-end-multiline-output "" }  */
 
 #pragma pack (push, 3.14159
-/* { dg-warning "invalid constant in '#pragma pack' - ignored" "" { target *-*-* } .-1 }
+/* { dg-warning "ignoring malformed '#pragma pack': invalid constant" "" { target *-*-* } .-1 }
    { dg-begin-multiline-output "" }
  #pragma pack (push, 3.14159
                      ^~~~~~~
    { dg-end-multiline-output "" }  */
 
 #pragma pack (toothbrush
-/* { dg-warning "unknown action 'toothbrush' for '#pragma pack' - ignored" "" { target *-*-* } .-1 }
+/* { dg-warning "ignoring malformed '#pragma pack': unknown action 'toothbrush'" "" { target *-*-* } .-1 }
    { dg-begin-multiline-output "" }
  #pragma pack (toothbrush
                ^~~~~~~~~~
@@ -58,14 +58,14 @@
 /* target ****************************************************************************/
 
 #pragma GCC target 42
-/* { dg-warning "#pragma GCC option' is not a string" "" { target *-*-* } .-1 }
+/* { dg-warning "ignoring malformed '#pragma GCC target': expected a string option" "" { target *-*-* } .-1 }
    { dg-begin-multiline-output "" }
  #pragma GCC target 42
                     ^~
    { dg-end-multiline-output "" }  */
 
 #pragma GCC target ( 1776
-/* { dg-warning "#pragma GCC option' is not a string" "" { target *-*-* } .-1 }
+/* { dg-warning "ignoring malformed '#pragma GCC target': expected a string option" "" { target *-*-* } .-1 }
    { dg-begin-multiline-output "" }
  #pragma GCC target ( 1776
                       ^~~~
diff --git a/gcc/testsuite/gcc.dg/pragma-scalar_storate_order-parsing.c b/gcc/testsuite/gcc.dg/pragma-scalar_storate_order-parsing.c
new file mode 100644
index 00000000000..b20f41caba8
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pragma-scalar_storate_order-parsing.c
@@ -0,0 +1,8 @@
+/* Test that we provide good warnings for malformed '#pragma scalar_storage_order'.  */
+
+#pragma scalar_storage_order /* { dg-warning "ignoring malformed '#pragma scalar_storage_order': expected 'big-endian', 'little-endian', or 'default'" } */
+#pragma scalar_storage_order 1066 /* { dg-warning "ignoring malformed '#pragma scalar_storage_order': expected 'big-endian', 'little-endian', or 'default'" } */
+#pragma scalar_storage_order foo /* { dg-warning "ignoring malformed '#pragma scalar_storage_order': expected 'big-endian', 'little-endian', or 'default'" } */
+#pragma scalar_storage_order little-endian
+#pragma scalar_storage_order big-endian
+#pragma scalar_storage_order default
diff --git a/gcc/testsuite/gcc.dg/sso-6.c b/gcc/testsuite/gcc.dg/sso-6.c
index 559253293b5..3654ffcb847 100644
--- a/gcc/testsuite/gcc.dg/sso-6.c
+++ b/gcc/testsuite/gcc.dg/sso-6.c
@@ -3,7 +3,7 @@
 /* { dg-do run } */
 /* { dg-require-effective-target int32plus } */
 
-#pragma scalar_storage_order /* { dg-warning "missing .big-endian., .little-endian., or .default." } */
+#pragma scalar_storage_order /* { dg-warning "expected .big-endian., .little-endian., or .default." } */
 
 #pragma scalar_storage_order big-endian
 
-- 
2.26.3


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

* [PATCH 2/4] c: add #pragma GCC show_layout
  2023-11-02 13:19 [PATCH/RFC 0/4] C/C++/diagnostics: various UX improvements David Malcolm
  2023-11-02 13:19 ` [PATCH 1/4] c/c++: rework pragma parsing David Malcolm
@ 2023-11-02 13:19 ` David Malcolm
  2023-11-02 13:19 ` [PATCH 3/4] diagnostics: add automatic URL-ification within messages David Malcolm
  2023-11-02 13:19 ` [PATCH 4/4] RFC: add contrib/regenerate-index-urls.py David Malcolm
  3 siblings, 0 replies; 6+ messages in thread
From: David Malcolm @ 2023-11-02 13:19 UTC (permalink / raw)
  To: gcc-patches; +Cc: David Malcolm

This patch adds a new pragma to the C frontend that will
make it emit a human-readable diagram of a struct's layout.

For example, given this contrived usage:

struct example {
  char foo : 7;
  char bar;
  char visible : 1;
  char active  : 1;
};

the compiler will emit output similar to the following:

note: 'sizeof(struct example)' == 3; layout:

  ┌───────┬────┬───────────────┬─────────────────────┬─────────────────────────┬───────────────────────┐
  │Offsets│Byte│       0       │          1          │            2            │           3           │
  ├───────┼────┼─┬─┬─┬─┬─┬─┬─┬─┼─┬─┬──┬──┬──┬──┬──┬──┼───┬───┬──┬──┬──┬──┬──┬──┼──┬──┬──┬──┬──┬──┬──┬──┤
  │ Byte  │Bit │0│1│2│3│4│5│6│7│8│9│10│11│12│13│14│15│16 │17 │18│19│20│21│22│23│24│25│26│27│28│29│30│31│
  ├───────┼────┼─┴─┴─┴─┴─┴─┴─┼─┼─┴─┴──┴──┴──┴──┴──┴──┼───┼───┼──┴──┴──┴──┴──┴──┼──┴──┴──┴──┴──┴──┴──┴──┘
  │   0   │ 0  │    'foo'    │*│        'bar'        │(1)│(2)│     padding     │
  └───────┴────┴─────────────┴─┴─────────────────────┴───┴───┴─────────────────┘
  *: padding
  (1): 'visible'
  (2): 'active'

The output is intended for humans, rather than scripts, and is
subject to change.

One wart is that it uses some analyzer internals, and thus requires
GCC to have been configured without disabling the analyzer.

Caveat: only tested on x86_64, and probably has some endianness and
packing assumptions in the testcases.

Thoughts?

gcc/analyzer/ChangeLog:
	* record-layout.cc: Define INCLUDE_ALGORITHM and
	INCLUDE_VECTOR.  Include "intl.h", "text-art/table.h",
	"text-art/widget.h", and "diagnostic-diagram.h".
	(class layout_diagram): New.
	(layout_diagram::layout_diagram): New.
	(layout_diagram::bit_to_table_coord): New.
	(layout_diagram::ensure_table_rows): New.
	(layout_diagram::get_string_for_item): New.
	(impl_show_record_layout): New.
	(show_record_layout): New.
	* record-layout.h (class layout_diagram): New forward decl.
	(class record_layout): Add friend class layout_diagram.

gcc/c-family/ChangeLog:
	* c-pragma.cc: Include "stor-layout.h".
	(class pragma_parser_show_layout): New.
	(handle_pragma_show_layout): New.
	(init_pragma): Register it.

gcc/ChangeLog:
	* doc/extend.texi (Other Pragmas): New subsection,
	with '#pragma GCC show_layout'.
	* stor-layout.h (show_record_layout): New decl.

gcc/testsuite/ChangeLog:
	* gcc.dg/parsing-pragma-show_layout.c: New test.
	* gcc.dg/pragma-show_layout-1.c: New test.
	* gcc.dg/pragma-show_layout-2.c: New test.
	* gcc.dg/pragma-show_layout-infoleak-CVE-2017-18550.c: New test.
---
 gcc/analyzer/record-layout.cc                 | 235 ++++++++++++++++++
 gcc/analyzer/record-layout.h                  |   4 +
 gcc/c-family/c-pragma.cc                      |  95 +++++++
 gcc/doc/extend.texi                           |  49 ++++
 gcc/stor-layout.h                             |   3 +
 .../gcc.dg/parsing-pragma-show_layout.c       |  15 ++
 gcc/testsuite/gcc.dg/pragma-show_layout-1.c   |  12 +
 gcc/testsuite/gcc.dg/pragma-show_layout-2.c   | 184 ++++++++++++++
 ...agma-show_layout-infoleak-CVE-2017-18550.c | 175 +++++++++++++
 9 files changed, 772 insertions(+)
 create mode 100644 gcc/testsuite/gcc.dg/parsing-pragma-show_layout.c
 create mode 100644 gcc/testsuite/gcc.dg/pragma-show_layout-1.c
 create mode 100644 gcc/testsuite/gcc.dg/pragma-show_layout-2.c
 create mode 100644 gcc/testsuite/gcc.dg/pragma-show_layout-infoleak-CVE-2017-18550.c

diff --git a/gcc/analyzer/record-layout.cc b/gcc/analyzer/record-layout.cc
index 1369bfb5eff..242a9895309 100644
--- a/gcc/analyzer/record-layout.cc
+++ b/gcc/analyzer/record-layout.cc
@@ -19,7 +19,9 @@ along with GCC; see the file COPYING3.  If not see
 <http://www.gnu.org/licenses/>.  */
 
 #include "config.h"
+#define INCLUDE_ALGORITHM
 #define INCLUDE_MEMORY
+#define INCLUDE_VECTOR
 #include "system.h"
 #include "coretypes.h"
 #include "tree.h"
@@ -28,8 +30,13 @@ along with GCC; see the file COPYING3.  If not see
 #include "gimple.h"
 #include "diagnostic.h"
 #include "tree-diagnostic.h"
+#include "intl.h"
+#include "make-unique.h"
 #include "analyzer/analyzer.h"
 #include "analyzer/record-layout.h"
+#include "text-art/table.h"
+#include "text-art/widget.h"
+#include "diagnostic-diagram.h"
 
 #if ENABLE_ANALYZER
 
@@ -120,6 +127,234 @@ record_layout::maybe_pad_to (bit_offset_t next_offset)
     }
 }
 
+class layout_diagram : public text_art::vbox_widget
+{
+public:
+  layout_diagram (const ana::record_layout &layout,
+		  text_art::style_manager &sm,
+		  const text_art::theme &theme);
+
+private:
+  text_art::table::coord_t bit_to_table_coord (ana::bit_offset_t bit);
+
+  void ensure_table_rows (text_art::style_manager &sm,
+			  text_art::table &table,
+			  int table_y);
+
+  text_art::styled_string
+  get_string_for_item (const ana::record_layout::item &item,
+		       text_art::style_manager &sm);
+
+  std::vector<tree> m_footnote_fields;
+  bool m_has_short_padding;
+};
+
+layout_diagram::layout_diagram (const ana::record_layout &layout,
+				text_art::style_manager &sm,
+				const text_art::theme &theme)
+: m_has_short_padding (false)
+{
+  using namespace text_art;
+
+  table table (table::size_t (34, 2));
+  table.set_cell (table::coord_t (0, 0), styled_string (sm, _("Offsets")));
+  table.set_cell (table::coord_t (1, 0), styled_string (sm, _("Byte")));
+  table.set_cell (table::coord_t (0, 1), styled_string (sm, _("Byte")));
+  for (int octet = 0; octet < 4; octet++)
+    table.set_cell_span (table::rect_t (table::coord_t (2 + (octet * 8), 0),
+					table::size_t (8, 1)),
+			 styled_string::from_fmt (sm, nullptr, "%i", octet));
+  table.set_cell (table::coord_t (1, 1), styled_string (sm, _("Bit")));
+  for (int bit = 0; bit < 32; bit++)
+    table.set_cell (table::coord_t (bit + 2, 1),
+		    styled_string::from_fmt (sm, nullptr, "%i", bit));
+
+  for (auto &item : layout.m_items)
+    {
+      table::coord_t start_coord
+	= bit_to_table_coord (item.get_start_bit_offset ());
+      table::coord_t max_coord
+	= bit_to_table_coord (item.get_next_bit_offset () - 1);
+      gcc_assert (start_coord.y <= max_coord.y);
+      ensure_table_rows (sm, table, max_coord.y);
+      styled_string content (get_string_for_item (item, sm));
+      if (start_coord.y == max_coord.y)
+	{
+	  table.set_cell_span
+	    (table::rect_t (start_coord,
+			    table::size_t (max_coord.x + 1 - start_coord.x,
+					   1)),
+	     std::move (content));
+	}
+      else
+	{
+	  /* Item is split between multiple rows.  */
+	  table::range_t full_rows (start_coord.y, max_coord.y + 1);
+	  // Initial row
+	  if (start_coord.x > 2)
+	    {
+	      table.set_cell_span
+		(table::rect_t (start_coord,
+				table::size_t (34 - start_coord.x, 1)),
+		 get_string_for_item (item, sm));
+	      full_rows.start++;
+	    }
+
+	  // Final row
+	  if (max_coord.x < 33)
+	    {
+	      table.set_cell_span
+		(table::rect_t (table::coord_t (2, max_coord.y),
+				table::size_t (33 - max_coord.x, 1)),
+		 get_string_for_item (item, sm));
+	      full_rows.next--;
+	    }
+
+	  // Middle rows
+	  if (full_rows.get_size () > 0)
+	    table.set_cell_span
+	      (table::rect_t (table::range_t (2, 34),
+			      full_rows),
+	       std::move (content));
+	}
+    }
+
+  /* Add a child widget for the table.  */
+  text_art::canvas canvas (table.to_canvas (theme, sm));
+  add_child (::make_unique <canvas_widget> (std::move (canvas)));
+
+  /* Add text child widgets for any lines with showing footnotes.  */
+  if (m_has_short_padding)
+    {
+      styled_string s
+	(styled_string::from_fmt (sm, default_tree_printer,
+				  "*: %s", _("padding")));
+      add_child (::make_unique <text_widget> (std::move (s)));
+    }
+  for (int i = 0; i < (int)m_footnote_fields.size (); i++)
+    {
+      tree field = m_footnote_fields[i];
+      styled_string s (styled_string::from_fmt (sm, default_tree_printer,
+						"(%i): %qE",
+						i + 1, field));
+      add_child (::make_unique <text_widget> (std::move (s)));
+    }
+}
+
+text_art::table::coord_t
+layout_diagram::bit_to_table_coord (bit_offset_t bit)
+{
+  return text_art::table::coord_t ((bit % 32).to_shwi () + 2,
+				   (bit / 32).to_shwi () + 2);
+}
+
+void
+layout_diagram::ensure_table_rows (text_art::style_manager &sm,
+				   text_art::table &table,
+				   int table_y)
+{
+  using namespace text_art;
+
+  while (table_y >= table.get_size ().h)
+    {
+      const int word = table.get_size ().h - 2;
+      table.add_row ();
+      table.set_cell (table::coord_t (0, word + 2),
+		      styled_string::from_fmt (sm, nullptr,
+					       "%i", word * 4));
+      table.set_cell (table::coord_t (1, word + 2),
+		      styled_string::from_fmt (sm, nullptr,
+					       "%i", word * 32));
+    }
+}
+
+text_art::styled_string
+layout_diagram::get_string_for_item (const ana::record_layout::item &item,
+				     text_art::style_manager &sm)
+{
+  if (item.m_bit_range.m_size_in_bits > 1)
+    {
+      if (item.m_is_padding)
+	return text_art::styled_string (sm, _("padding"));
+      else
+	return text_art::styled_string::from_fmt
+	  (sm, default_tree_printer,
+	   "%qE", item.m_field);
+    }
+  else
+    {
+      /* To avoid bloating the table, for 1-bit items, add footnotes of the
+	 form "(1)", "(2)", ... for fields, and "*" for padding.  */
+      if (item.m_is_padding)
+	{
+	  m_has_short_padding = true;
+	  return text_art::styled_string ('*');
+	}
+      else
+	{
+	  m_footnote_fields.push_back (item.m_field);
+	  return text_art::styled_string::from_fmt
+	    (sm, nullptr, "(%i)",
+	     (int)m_footnote_fields.size ());
+	}
+    }
+}
+
+static void
+impl_show_record_layout (location_t loc,
+			 tree type,
+			 tree size)
+{
+  gcc_assert (TREE_CODE (type) == RECORD_TYPE);
+  gcc_assert (size == error_mark_node
+	      || TREE_CODE (size) == INTEGER_CST);
+
+  const text_art::theme *theme = global_dc->m_diagrams.m_theme;
+  if (!theme)
+    {
+      inform (loc, "not showing layout of %qT; %qs is %qs",
+	      type,
+	      "-fdiagnostics-text-art-charset", "none");
+      return;
+    }
+
+  /* Generate canvas.  */
+  ana::record_layout layout (type);
+  text_art::style_manager sm;
+  ana::layout_diagram diagram (layout, sm, *theme);
+  text_art::canvas canvas (diagram.to_canvas (sm));
+
+  /* Generate alt-text.  */
+  pretty_printer pp;
+  pp_format_decoder (&pp) = default_tree_printer;
+  pp_show_color (&pp) = pp_show_color (global_dc->printer);
+  pp_printf (&pp, "Diagram showing layout of %qT", type);
+
+  auto_diagnostic_group d;
+  if (size != error_mark_node)
+    inform (loc, "%<sizeof(%T)%> == %E; layout:",
+	    type, size);
+  else
+    inform (loc, "layout of %qT", type);
+  diagnostic_emit_diagram (global_dc,
+			   diagnostic_diagram (canvas,
+					       pp_formatted_text (&pp)));
+}
+
 } // namespace ana
 
 #endif /* #if ENABLE_ANALYZER  */
+
+void
+show_record_layout (location_t loc ATTRIBUTE_UNUSED,
+		    tree type ATTRIBUTE_UNUSED,
+		    tree size ATTRIBUTE_UNUSED)
+{
+  gcc_assert (TREE_CODE (type) == RECORD_TYPE);
+
+#if ENABLE_ANALYZER
+  ana::impl_show_record_layout (loc, type, size);
+#else
+  sorry_no_analyzer ();
+#endif /* #if ENABLE_ANALYZER  */
+}
diff --git a/gcc/analyzer/record-layout.h b/gcc/analyzer/record-layout.h
index b63e7b00e48..de5426dd23c 100644
--- a/gcc/analyzer/record-layout.h
+++ b/gcc/analyzer/record-layout.h
@@ -25,12 +25,16 @@ along with GCC; see the file COPYING3.  If not see
 
 namespace ana {
 
+class layout_diagram;
+
 /* Information of the layout of a RECORD_TYPE, capturing it as a vector
    of items, where each item is either a field or padding.  */
 
 class record_layout
 {
 public:
+  friend class layout_diagram;
+
   /* An item within a record; either a field, or padding after a field.  */
   struct item
   {
diff --git a/gcc/c-family/c-pragma.cc b/gcc/c-family/c-pragma.cc
index 6df8683af77..904a1fcd55d 100644
--- a/gcc/c-family/c-pragma.cc
+++ b/gcc/c-family/c-pragma.cc
@@ -34,6 +34,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "opts.h"
 #include "plugin.h"
 #include "opt-suggestions.h"
+#include "stor-layout.h"
 
 label_text
 get_doc_url (const char *doc_url_suffix)
@@ -1688,6 +1689,98 @@ handle_pragma_message (cpp_reader *)
 	    TREE_STRING_POINTER (message));
 }
 
+/* Subclass of pragma_parser for use when parsing '#pragma GCC show_layout'.  */
+
+class pragma_parser_show_layout : public pragma_parser
+{
+public:
+  pragma_parser_show_layout ()
+  : pragma_parser ("GCC", "show_layout", nullptr)
+  {
+  }
+
+  bool require_id (const char *str)
+  {
+    location_t loc = UNKNOWN_LOCATION;
+    tree x = NULL_TREE;
+
+    enum cpp_ttype ttype = pragma_lex (&x, &loc);
+    if (ttype != CPP_NAME
+	|| strcmp (IDENTIFIER_POINTER (x), str))
+      {
+	warning_at (loc, OPT_Wpragmas,
+		    "ignoring malformed %<#pragma GCC show_layout%>:"
+		    " expected %qs", str);
+	return false;
+      }
+    return true;
+  }
+
+  tree require_struct_tag ()
+  {
+    location_t loc = UNKNOWN_LOCATION;
+    tree tag = NULL_TREE;
+
+    enum cpp_ttype ttype = pragma_lex (&tag, &loc);
+    if (ttype != CPP_NAME)
+      {
+	warning_at (loc, OPT_Wpragmas,
+		    "ignoring malformed %<#pragma GCC show_layout%>:"
+		    " expected struct tag");
+	return NULL_TREE;
+      }
+
+    tree type = identifier_global_tag (tag);
+    if (type == NULL_TREE)
+      {
+	warning_at (loc, OPT_Wpragmas,
+		    "ignoring malformed %<#pragma GCC show_layout%>:"
+		    " unknown struct tag %qs",
+		    IDENTIFIER_POINTER (tag));
+	return NULL_TREE;
+      }
+    if (TREE_CODE (type) != RECORD_TYPE)
+      {
+	warning_at (loc, OPT_Wpragmas,
+		    "ignoring malformed %<#pragma GCC show_layout%>:"
+		    " expected struct tag");
+	return NULL_TREE;
+      }
+
+    return type;
+  }
+};
+
+/* Handler for '#pragma GCC show_layout'.  */
+
+static void
+handle_pragma_show_layout (cpp_reader *)
+{
+  pragma_parser_show_layout p;
+
+  if (c_dialect_cxx ())
+    {
+      if (warn_unknown_pragmas > in_system_header_at (input_location))
+	warning (OPT_Wunknown_pragmas,
+		 "%<#pragma GCC show_layout%> is not supported for C++");
+      return;
+    }
+
+  if (!p.require_open_paren ())
+    return;
+  if (!p.require_id ("struct"))
+    return;
+  tree type = p.require_struct_tag ();
+  if (!type)
+    return;
+  if (!p.require_close_paren ())
+    return;
+  gcc_assert (TREE_CODE (type) == RECORD_TYPE);
+
+  tree size = c_sizeof_or_alignof_type (input_location, type, true, false, 0);
+  show_record_layout (input_location, type, size);
+}
+
 /* Ignore a no-op pragma that GCC recognizes, but which has no effect.  */
 static void
 handle_pragma_ignore (cpp_reader *)
@@ -2201,6 +2294,8 @@ init_pragma (void)
   c_register_pragma (0, "scalar_storage_order", 
 		     handle_pragma_scalar_storage_order);
 
+  c_register_pragma ("GCC", "show_layout", handle_pragma_show_layout);
+
   /* Allow plugins to register their own pragmas. */
   invoke_plugin_callbacks (PLUGIN_PRAGMAS, NULL);
 }
diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
index cf0d0c63cce..ea499951caf 100644
--- a/gcc/doc/extend.texi
+++ b/gcc/doc/extend.texi
@@ -24376,6 +24376,7 @@ information.
 * Push/Pop Macro Pragmas::
 * Function Specific Option Pragmas::
 * Loop-Specific Pragmas::
+* Other Pragmas::
 @end menu
 
 @node AArch64 Pragmas
@@ -25001,6 +25002,54 @@ The values of @math{0} and @math{1} block any unrolling of the loop.
 
 @end table
 
+@node Other Pragmas
+@subsection Other Pragmas
+
+@table @code
+@cindex pragma GCC show_layout
+@item #pragma GCC show_layout
+
+With this pragma, the compiler will emit a diagram showing the in-memory
+layout of a particular @code{struct}, with the relative locations and sizes
+of fields and of padding.
+
+For example, given this contrived usage:
+
+@smallexample
+struct example @{
+  char foo : 7;
+  char bar;
+  char visible : 1;
+  char active  : 1;
+@};
+#pragma GCC show_layout(struct example)
+@end smallexample
+
+the compiler will emit output similar to the following:
+
+@smallexample
+note: 'sizeof(struct example)' == 3; layout:
+
+  ┌───────┬────┬───────────────┬─────────────────────┬─────────────────────────┬───────────────────────┐
+  │Offsets│Byte│       0       │          1          │            2            │           3           │
+  ├───────┼────┼─┬─┬─┬─┬─┬─┬─┬─┼─┬─┬──┬──┬──┬──┬──┬──┼───┬───┬──┬──┬──┬──┬──┬──┼──┬──┬──┬──┬──┬──┬──┬──┤
+  │ Byte  │Bit │0│1│2│3│4│5│6│7│8│9│10│11│12│13│14│15│16 │17 │18│19│20│21│22│23│24│25│26│27│28│29│30│31│
+  ├───────┼────┼─┴─┴─┴─┴─┴─┴─┼─┼─┴─┴──┴──┴──┴──┴──┴──┼───┼───┼──┴──┴──┴──┴──┴──┼──┴──┴──┴──┴──┴──┴──┴──┘
+  │   0   │ 0  │    'foo'    │*│        'bar'        │(1)│(2)│     padding     │
+  └───────┴────┴─────────────┴─┴─────────────────────┴───┴───┴─────────────────┘
+  *: padding
+  (1): 'visible'
+  (2): 'active'
+@end smallexample
+
+The output is intended for humans, rather than scripts, and is
+subject to change.
+
+This pragma is not available from C++.  It is also not available when GCC
+has been configured without support for the analyzer.
+
+@end table
+
 @node Unnamed Fields
 @section Unnamed Structure and Union Fields
 @cindex @code{struct}
diff --git a/gcc/stor-layout.h b/gcc/stor-layout.h
index 589ce33c950..8d8e324409f 100644
--- a/gcc/stor-layout.h
+++ b/gcc/stor-layout.h
@@ -113,4 +113,7 @@ extern void relayout_decl (tree);
    belongs to a function parameter.  */
 extern tree variable_size (tree);
 
+/* Implemented in analyzer/record-layout.cc  */
+extern void show_record_layout (location_t loc, tree type, tree size);
+
 #endif  // GCC_STOR_LAYOUT_H
diff --git a/gcc/testsuite/gcc.dg/parsing-pragma-show_layout.c b/gcc/testsuite/gcc.dg/parsing-pragma-show_layout.c
new file mode 100644
index 00000000000..564cd8ed3f9
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/parsing-pragma-show_layout.c
@@ -0,0 +1,15 @@
+/* Test that we provide good warnings for malformed '#pragma show_layout'.  */
+
+/* { dg-do compile } */
+
+#pragma GCC show_layout  /* { dg-warning "ignoring malformed '#pragma GCC show_layout': expected '\\('" } */
+
+#pragma GCC show_layout(  /* { dg-warning "ignoring malformed '#pragma GCC show_layout': expected 'struct'" } */
+
+#pragma GCC show_layout(struct  /* { dg-warning "ignoring malformed '#pragma GCC show_layout': expected struct tag" } */
+
+#pragma GCC show_layout(struct foo  /* { dg-warning "32: ignoring malformed '#pragma GCC show_layout': unknown struct tag 'foo'" } */
+
+union not_a_struct { int placeholder; };
+
+#pragma GCC show_layout(struct not_a_struct  /* { dg-warning "32: ignoring malformed '#pragma GCC show_layout': expected struct tag" } */
diff --git a/gcc/testsuite/gcc.dg/pragma-show_layout-1.c b/gcc/testsuite/gcc.dg/pragma-show_layout-1.c
new file mode 100644
index 00000000000..db161547e9b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pragma-show_layout-1.c
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+
+#include <stdint.h>
+
+struct foo
+{
+  int32_t i;
+  int16_t j;
+  int32_t k;
+};
+
+#pragma GCC show_layout(struct foo) /* { dg-message "not showing layout of 'struct foo'; '-fdiagnostics-text-art-charset' is 'none'" } */
diff --git a/gcc/testsuite/gcc.dg/pragma-show_layout-2.c b/gcc/testsuite/gcc.dg/pragma-show_layout-2.c
new file mode 100644
index 00000000000..d673d4a8f83
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pragma-show_layout-2.c
@@ -0,0 +1,184 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target analyzer } */
+/* { dg-options "-fdiagnostics-text-art-charset=unicode" } */
+
+#include <stdint.h>
+
+struct empty {};
+#pragma GCC show_layout(struct empty) /* { dg-message "sizeof\\(struct empty\\)' == 0; layout:" } */
+ /* { dg-begin-multiline-output "" }
+
+  ┌───────┬────┬───────────────┬─────────────────────┬───────────────────────┬───────────────────────┐
+  │Offsets│Byte│       0       │          1          │           2           │           3           │
+  ├───────┼────┼─┬─┬─┬─┬─┬─┬─┬─┼─┬─┬──┬──┬──┬──┬──┬──┼──┬──┬──┬──┬──┬──┬──┬──┼──┬──┬──┬──┬──┬──┬──┬──┤
+  │ Byte  │Bit │0│1│2│3│4│5│6│7│8│9│10│11│12│13│14│15│16│17│18│19│20│21│22│23│24│25│26│27│28│29│30│31│
+  └───────┴────┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘
+
+    { dg-end-multiline-output "" } */
+
+
+struct st_1
+{
+  int32_t i;
+  int16_t j;
+  int32_t k;
+};
+#pragma GCC show_layout(struct st_1) /* { dg-message "sizeof\\(struct st_1\\)' == 12; layout:" } */
+ /* { dg-begin-multiline-output "" }
+
+  ┌───────┬────┬───────────────┬─────────────────────┬───────────────────────┬───────────────────────┐
+  │Offsets│Byte│       0       │          1          │           2           │           3           │
+  ├───────┼────┼─┬─┬─┬─┬─┬─┬─┬─┼─┬─┬──┬──┬──┬──┬──┬──┼──┬──┬──┬──┬──┬──┬──┬──┼──┬──┬──┬──┬──┬──┬──┬──┤
+  │ Byte  │Bit │0│1│2│3│4│5│6│7│8│9│10│11│12│13│14│15│16│17│18│19│20│21│22│23│24│25│26│27│28│29│30│31│
+  ├───────┼────┼─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┤
+  │   0   │ 0  │                                         'i'                                         │
+  ├───────┼────┼─────────────────────────────────────┬───────────────────────────────────────────────┤
+  │   4   │ 32 │                 'j'                 │                    padding                    │
+  ├───────┼────┼─────────────────────────────────────┴───────────────────────────────────────────────┤
+  │   8   │ 64 │                                         'k'                                         │
+  └───────┴────┴─────────────────────────────────────────────────────────────────────────────────────┘
+
+    { dg-end-multiline-output "" } */
+
+
+struct st_2
+{
+  int16_t a;
+  char buf[40];
+};
+#pragma GCC show_layout(struct st_2) /* { dg-message "sizeof\\(struct st_2\\)' == 42; layout:" } */
+ /* { dg-begin-multiline-output "" }
+
+  ┌───────┬────┬───────────────┬─────────────────────┬───────────────────────┬───────────────────────┐
+  │Offsets│Byte│       0       │          1          │           2           │           3           │
+  ├───────┼────┼─┬─┬─┬─┬─┬─┬─┬─┼─┬─┬──┬──┬──┬──┬──┬──┼──┬──┬──┬──┬──┬──┬──┬──┼──┬──┬──┬──┬──┬──┬──┬──┤
+  │ Byte  │Bit │0│1│2│3│4│5│6│7│8│9│10│11│12│13│14│15│16│17│18│19│20│21│22│23│24│25│26│27│28│29│30│31│
+  ├───────┼────┼─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴──┴──┴──┴──┴──┴──┼──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┤
+  │   0   │ 0  │                 'a'                 │                     'buf'                     │
+  ├───────┼────┼─────────────────────────────────────┴───────────────────────────────────────────────┤
+  │   4   │ 32 │                                                                                     │
+  ├───────┼────┤                                                                                     │
+  │   8   │ 64 │                                                                                     │
+  ├───────┼────┤                                                                                     │
+  │  12   │ 96 │                                                                                     │
+  ├───────┼────┤                                                                                     │
+  │  16   │128 │                                                                                     │
+  ├───────┼────┤                                                                                     │
+  │  20   │160 │                                        'buf'                                        │
+  ├───────┼────┤                                                                                     │
+  │  24   │192 │                                                                                     │
+  ├───────┼────┤                                                                                     │
+  │  28   │224 │                                                                                     │
+  ├───────┼────┤                                                                                     │
+  │  32   │256 │                                                                                     │
+  ├───────┼────┤                                                                                     │
+  │  36   │288 │                                                                                     │
+  ├───────┼────┼─────────────────────────────────────┬───────────────────────────────────────────────┘
+  │  40   │320 │                'buf'                │
+  └───────┴────┴─────────────────────────────────────┘
+
+    { dg-end-multiline-output "" } */
+
+
+struct st_3
+{
+  int foo : 1;
+  int bar : 2;
+};
+#pragma GCC show_layout(struct st_3) /* { dg-message "sizeof\\(struct st_3\\)' == 4; layout:" } */
+ /* { dg-begin-multiline-output "" }
+
+  ┌───────┬────┬───────────────────┬─────────────────────┬───────────────────────┬───────────────────────┐
+  │Offsets│Byte│         0         │          1          │           2           │           3           │
+  ├───────┼────┼───┬──┬──┬─┬─┬─┬─┬─┼─┬─┬──┬──┬──┬──┬──┬──┼──┬──┬──┬──┬──┬──┬──┬──┼──┬──┬──┬──┬──┬──┬──┬──┤
+  │ Byte  │Bit │ 0 │1 │2 │3│4│5│6│7│8│9│10│11│12│13│14│15│16│17│18│19│20│21│22│23│24│25│26│27│28│29│30│31│
+  ├───────┼────┼───┼──┴──┼─┴─┴─┴─┴─┴─┴─┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┤
+  │   0   │ 0  │(1)│'bar'│                                    padding                                    │
+  └───────┴────┴───┴─────┴───────────────────────────────────────────────────────────────────────────────┘
+  (1): 'foo'
+
+    { dg-end-multiline-output "" } */
+
+
+struct st_4
+{
+  char ch;
+};
+#pragma GCC show_layout(struct st_4) /* { dg-message "sizeof\\(struct st_4\\)' == 1; layout:" } */
+ /* { dg-begin-multiline-output "" }
+
+  ┌───────┬────┬───────────────┬─────────────────────┬───────────────────────┬───────────────────────┐
+  │Offsets│Byte│       0       │          1          │           2           │           3           │
+  ├───────┼────┼─┬─┬─┬─┬─┬─┬─┬─┼─┬─┬──┬──┬──┬──┬──┬──┼──┬──┬──┬──┬──┬──┬──┬──┼──┬──┬──┬──┬──┬──┬──┬──┤
+  │ Byte  │Bit │0│1│2│3│4│5│6│7│8│9│10│11│12│13│14│15│16│17│18│19│20│21│22│23│24│25│26│27│28│29│30│31│
+  ├───────┼────┼─┴─┴─┴─┴─┴─┴─┴─┼─┴─┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘
+  │   0   │ 0  │     'ch'      │
+  └───────┴────┴───────────────┘
+
+    { dg-end-multiline-output "" } */
+
+
+struct st_5
+{
+  int foo : 7;
+  char bar;
+};
+#pragma GCC show_layout(struct st_5) /* { dg-message "sizeof\\(struct st_5\\)' == 4; layout:" } */
+ /* { dg-begin-multiline-output "" }
+
+  ┌───────┬────┬───────────────┬─────────────────────┬───────────────────────┬───────────────────────┐
+  │Offsets│Byte│       0       │          1          │           2           │           3           │
+  ├───────┼────┼─┬─┬─┬─┬─┬─┬─┬─┼─┬─┬──┬──┬──┬──┬──┬──┼──┬──┬──┬──┬──┬──┬──┬──┼──┬──┬──┬──┬──┬──┬──┬──┤
+  │ Byte  │Bit │0│1│2│3│4│5│6│7│8│9│10│11│12│13│14│15│16│17│18│19│20│21│22│23│24│25│26│27│28│29│30│31│
+  ├───────┼────┼─┴─┴─┴─┴─┴─┴─┼─┼─┴─┴──┴──┴──┴──┴──┴──┼──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┤
+  │   0   │ 0  │    'foo'    │*│        'bar'        │                    padding                    │
+  └───────┴────┴─────────────┴─┴─────────────────────┴───────────────────────────────────────────────┘
+  *: padding
+
+    { dg-end-multiline-output "" } */
+
+
+struct st_5a
+{
+  char foo : 7;
+  char bar;
+};
+#pragma GCC show_layout(struct st_5a) /* { dg-message "sizeof\\(struct st_5a\\)' == 2; layout:" } */
+ /* { dg-begin-multiline-output "" }
+
+  ┌───────┬────┬───────────────┬─────────────────────┬───────────────────────┬───────────────────────┐
+  │Offsets│Byte│       0       │          1          │           2           │           3           │
+  ├───────┼────┼─┬─┬─┬─┬─┬─┬─┬─┼─┬─┬──┬──┬──┬──┬──┬──┼──┬──┬──┬──┬──┬──┬──┬──┼──┬──┬──┬──┬──┬──┬──┬──┤
+  │ Byte  │Bit │0│1│2│3│4│5│6│7│8│9│10│11│12│13│14│15│16│17│18│19│20│21│22│23│24│25│26│27│28│29│30│31│
+  ├───────┼────┼─┴─┴─┴─┴─┴─┴─┼─┼─┴─┴──┴──┴──┴──┴──┴──┼──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘
+  │   0   │ 0  │    'foo'    │*│        'bar'        │
+  └───────┴────┴─────────────┴─┴─────────────────────┘
+  *: padding
+
+    { dg-end-multiline-output "" } */
+
+
+/* Example from docs.  */
+
+struct example
+{
+  char foo : 7;
+  char bar;
+  char visible : 1;
+  char active  : 1;
+};
+#pragma GCC show_layout(struct example) /* { dg-message "sizeof\\(struct example\\)' == 3; layout:" } */
+ /* { dg-begin-multiline-output "" }
+
+  ┌───────┬────┬───────────────┬─────────────────────┬─────────────────────────┬───────────────────────┐
+  │Offsets│Byte│       0       │          1          │            2            │           3           │
+  ├───────┼────┼─┬─┬─┬─┬─┬─┬─┬─┼─┬─┬──┬──┬──┬──┬──┬──┼───┬───┬──┬──┬──┬──┬──┬──┼──┬──┬──┬──┬──┬──┬──┬──┤
+  │ Byte  │Bit │0│1│2│3│4│5│6│7│8│9│10│11│12│13│14│15│16 │17 │18│19│20│21│22│23│24│25│26│27│28│29│30│31│
+  ├───────┼────┼─┴─┴─┴─┴─┴─┴─┼─┼─┴─┴──┴──┴──┴──┴──┴──┼───┼───┼──┴──┴──┴──┴──┴──┼──┴──┴──┴──┴──┴──┴──┴──┘
+  │   0   │ 0  │    'foo'    │*│        'bar'        │(1)│(2)│     padding     │
+  └───────┴────┴─────────────┴─┴─────────────────────┴───┴───┴─────────────────┘
+  *: padding
+  (1): 'visible'
+  (2): 'active'
+
+    { dg-end-multiline-output "" } */
diff --git a/gcc/testsuite/gcc.dg/pragma-show_layout-infoleak-CVE-2017-18550.c b/gcc/testsuite/gcc.dg/pragma-show_layout-infoleak-CVE-2017-18550.c
new file mode 100644
index 00000000000..a8434ff2fce
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pragma-show_layout-infoleak-CVE-2017-18550.c
@@ -0,0 +1,175 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target analyzer } */
+/* { dg-options "-fdiagnostics-text-art-charset=unicode" } */
+
+typedef unsigned int __u32;
+typedef unsigned int u32;
+typedef unsigned char u8;
+
+/* Adapted from Linux: drivers/scsi/aacraid/aacraid.h  */
+
+struct aac_hba_info {
+
+	u8	driver_name[50];
+	u8	adapter_number;
+	u8	system_io_bus_number;
+	u8	device_number;
+	u32	function_number;
+	u32	vendor_id;
+	u32	device_id;
+	u32	sub_vendor_id;
+	u32	sub_system_id;
+	u32	mapped_base_address_size;
+	u32	base_physical_address_high_part;
+	u32	base_physical_address_low_part;
+
+	u32	max_command_size;
+	u32	max_fib_size;
+	u32	max_scatter_gather_from_os;
+	u32	max_scatter_gather_to_fw;
+	u32	max_outstanding_fibs;
+
+	u32	queue_start_threshold;
+	u32	queue_dump_threshold;
+	u32	max_io_size_queued;
+	u32	outstanding_io;
+
+	u32	firmware_build_number;
+	u32	bios_build_number;
+	u32	driver_build_number;
+	u32	serial_number_high_part;
+	u32	serial_number_low_part;
+	u32	supported_options;
+	u32	feature_bits;
+	u32	currentnumber_ports;
+
+	u8	new_comm_interface:1;
+	u8	new_commands_supported:1;
+	u8	disable_passthrough:1;
+	u8	expose_non_dasd:1;
+	u8	queue_allowed:1;
+	u8	bled_check_enabled:1;
+	u8	reserved1:1;
+	u8	reserted2:1;
+
+	u32	reserved3[10];
+};
+
+#pragma GCC show_layout(struct aac_hba_info)  /* { dg-message "sizeof\\(struct aac_hba_info\\)' == 200; layout:" }
+ /* { dg-begin-multiline-output "" }
+
+  ┌───────┬────┬───────────────────────────────┬─────────────────────┬───────────────────────┬───────────────────────┐
+  │Offsets│Byte│               0               │          1          │           2           │           3           │
+  ├───────┼────┼───┬───┬───┬───┬───┬───┬───┬───┼─┬─┬──┬──┬──┬──┬──┬──┼──┬──┬──┬──┬──┬──┬──┬──┼──┬──┬──┬──┬──┬──┬──┬──┤
+  │ Byte  │Bit │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │8│9│10│11│12│13│14│15│16│17│18│19│20│21│22│23│24│25│26│27│28│29│30│31│
+  ├───────┼────┼───┴───┴───┴───┴───┴───┴───┴───┴─┴─┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┤
+  │   0   │ 0  │                                                                                                     │
+  ├───────┼────┤                                                                                                     │
+  │   4   │ 32 │                                                                                                     │
+  ├───────┼────┤                                                                                                     │
+  │   8   │ 64 │                                                                                                     │
+  ├───────┼────┤                                                                                                     │
+  │  12   │ 96 │                                                                                                     │
+  ├───────┼────┤                                                                                                     │
+  │  16   │128 │                                                                                                     │
+  ├───────┼────┤                                                                                                     │
+  │  20   │160 │                                                                                                     │
+  ├───────┼────┤                                            'driver_name'                                            │
+  │  24   │192 │                                                                                                     │
+  ├───────┼────┤                                                                                                     │
+  │  28   │224 │                                                                                                     │
+  ├───────┼────┤                                                                                                     │
+  │  32   │256 │                                                                                                     │
+  ├───────┼────┤                                                                                                     │
+  │  36   │288 │                                                                                                     │
+  ├───────┼────┤                                                                                                     │
+  │  40   │320 │                                                                                                     │
+  ├───────┼────┤                                                                                                     │
+  │  44   │352 │                                                                                                     │
+  ├───────┼────┼─────────────────────────────────────────────────────┬───────────────────────┬───────────────────────┤
+  │  48   │384 │                    'driver_name'                    │   'adapter_number'    │'system_io_bus_number' │
+  ├───────┼────┼───────────────────────────────┬─────────────────────┴───────────────────────┴───────────────────────┤
+  │  52   │416 │        'device_number'        │                               padding                               │
+  ├───────┼────┼───────────────────────────────┴─────────────────────────────────────────────────────────────────────┤
+  │  56   │448 │                                          'function_number'                                          │
+  ├───────┼────┼─────────────────────────────────────────────────────────────────────────────────────────────────────┤
+  │  60   │480 │                                             'vendor_id'                                             │
+  ├───────┼────┼─────────────────────────────────────────────────────────────────────────────────────────────────────┤
+  │  64   │512 │                                             'device_id'                                             │
+  ├───────┼────┼─────────────────────────────────────────────────────────────────────────────────────────────────────┤
+  │  68   │544 │                                           'sub_vendor_id'                                           │
+  ├───────┼────┼─────────────────────────────────────────────────────────────────────────────────────────────────────┤
+  │  72   │576 │                                           'sub_system_id'                                           │
+  ├───────┼────┼─────────────────────────────────────────────────────────────────────────────────────────────────────┤
+  │  76   │608 │                                     'mapped_base_address_size'                                      │
+  ├───────┼────┼─────────────────────────────────────────────────────────────────────────────────────────────────────┤
+  │  80   │640 │                                  'base_physical_address_high_part'                                  │
+  ├───────┼────┼─────────────────────────────────────────────────────────────────────────────────────────────────────┤
+  │  84   │672 │                                  'base_physical_address_low_part'                                   │
+  ├───────┼────┼─────────────────────────────────────────────────────────────────────────────────────────────────────┤
+  │  88   │704 │                                         'max_command_size'                                          │
+  ├───────┼────┼─────────────────────────────────────────────────────────────────────────────────────────────────────┤
+  │  92   │736 │                                           'max_fib_size'                                            │
+  ├───────┼────┼─────────────────────────────────────────────────────────────────────────────────────────────────────┤
+  │  96   │768 │                                    'max_scatter_gather_from_os'                                     │
+  ├───────┼────┼─────────────────────────────────────────────────────────────────────────────────────────────────────┤
+  │  100  │800 │                                     'max_scatter_gather_to_fw'                                      │
+  ├───────┼────┼─────────────────────────────────────────────────────────────────────────────────────────────────────┤
+  │  104  │832 │                                       'max_outstanding_fibs'                                        │
+  ├───────┼────┼─────────────────────────────────────────────────────────────────────────────────────────────────────┤
+  │  108  │864 │                                       'queue_start_threshold'                                       │
+  ├───────┼────┼─────────────────────────────────────────────────────────────────────────────────────────────────────┤
+  │  112  │896 │                                       'queue_dump_threshold'                                        │
+  ├───────┼────┼─────────────────────────────────────────────────────────────────────────────────────────────────────┤
+  │  116  │928 │                                        'max_io_size_queued'                                         │
+  ├───────┼────┼─────────────────────────────────────────────────────────────────────────────────────────────────────┤
+  │  120  │960 │                                          'outstanding_io'                                           │
+  ├───────┼────┼─────────────────────────────────────────────────────────────────────────────────────────────────────┤
+  │  124  │992 │                                       'firmware_build_number'                                       │
+  ├───────┼────┼─────────────────────────────────────────────────────────────────────────────────────────────────────┤
+  │  128  │1024│                                         'bios_build_number'                                         │
+  ├───────┼────┼─────────────────────────────────────────────────────────────────────────────────────────────────────┤
+  │  132  │1056│                                        'driver_build_number'                                        │
+  ├───────┼────┼─────────────────────────────────────────────────────────────────────────────────────────────────────┤
+  │  136  │1088│                                      'serial_number_high_part'                                      │
+  ├───────┼────┼─────────────────────────────────────────────────────────────────────────────────────────────────────┤
+  │  140  │1120│                                      'serial_number_low_part'                                       │
+  ├───────┼────┼─────────────────────────────────────────────────────────────────────────────────────────────────────┤
+  │  144  │1152│                                         'supported_options'                                         │
+  ├───────┼────┼─────────────────────────────────────────────────────────────────────────────────────────────────────┤
+  │  148  │1184│                                           'feature_bits'                                            │
+  ├───────┼────┼─────────────────────────────────────────────────────────────────────────────────────────────────────┤
+  │  152  │1216│                                        'currentnumber_ports'                                        │
+  ├───────┼────┼───┬───┬───┬───┬───┬───┬───┬───┬─────────────────────────────────────────────────────────────────────┤
+  │  156  │1248│(1)│(2)│(3)│(4)│(5)│(6)│(7)│(8)│                               padding                               │
+  ├───────┼────┼───┴───┴───┴───┴───┴───┴───┴───┴─────────────────────────────────────────────────────────────────────┤
+  │  160  │1280│                                                                                                     │
+  ├───────┼────┤                                                                                                     │
+  │  164  │1312│                                                                                                     │
+  ├───────┼────┤                                                                                                     │
+  │  168  │1344│                                                                                                     │
+  ├───────┼────┤                                                                                                     │
+  │  172  │1376│                                                                                                     │
+  ├───────┼────┤                                                                                                     │
+  │  176  │1408│                                                                                                     │
+  ├───────┼────┤                                             'reserved3'                                             │
+  │  180  │1440│                                                                                                     │
+  ├───────┼────┤                                                                                                     │
+  │  184  │1472│                                                                                                     │
+  ├───────┼────┤                                                                                                     │
+  │  188  │1504│                                                                                                     │
+  ├───────┼────┤                                                                                                     │
+  │  192  │1536│                                                                                                     │
+  ├───────┼────┤                                                                                                     │
+  │  196  │1568│                                                                                                     │
+  └───────┴────┴─────────────────────────────────────────────────────────────────────────────────────────────────────┘
+  (1): 'new_comm_interface'
+  (2): 'new_commands_supported'
+  (3): 'disable_passthrough'
+  (4): 'expose_non_dasd'
+  (5): 'queue_allowed'
+  (6): 'bled_check_enabled'
+  (7): 'reserved1'
+  (8): 'reserted2'
+
+    { dg-end-multiline-output "" } */
-- 
2.26.3


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

* [PATCH 3/4] diagnostics: add automatic URL-ification within messages
  2023-11-02 13:19 [PATCH/RFC 0/4] C/C++/diagnostics: various UX improvements David Malcolm
  2023-11-02 13:19 ` [PATCH 1/4] c/c++: rework pragma parsing David Malcolm
  2023-11-02 13:19 ` [PATCH 2/4] c: add #pragma GCC show_layout David Malcolm
@ 2023-11-02 13:19 ` David Malcolm
  2023-11-04  1:59   ` [pushed] " David Malcolm
  2023-11-02 13:19 ` [PATCH 4/4] RFC: add contrib/regenerate-index-urls.py David Malcolm
  3 siblings, 1 reply; 6+ messages in thread
From: David Malcolm @ 2023-11-02 13:19 UTC (permalink / raw)
  To: gcc-patches; +Cc: David Malcolm

In r10-3781-gd26082357676a3 GCC's pretty-print framework gained
the ability to emit embedding URLs via escape sequences
for marking up text output..

In r10-3783-gb4c7ca2ef3915a GCC started using this for the
[-Wname-of-option] emitted at the end of each diagnostic so that it
becomes a hyperlink to the documentation for that option on the GCC
website.

This makes it much more convenient for the user to locate pertinent
documentation when a diagnostic is emitted.

The above involved special-casing in one specific place, but there is
plenty of quoted text throughout GCC's diagnostic messages that could
usefully have a documentation URL: references to options, pragmas, etc

This patch adds a new optional "urlifier" parameter to pp_format.
The idea is that a urlifier object has responsibility for mapping from
quoted strings in diagnostic messages to URLs, and pp_format has the
ability to automatically add URL escapes for strings that the urlifier
gives it URLs for.

For example, given the format string:

  "%<#pragma pack%> has no effect with %<-fpack-struct%>"

with this patch GCC is able to automatically linkify the "#pragma pack"
text to
  https://gcc.gnu.org/onlinedocs/gcc/Structure-Layout-Pragmas.html
and the "-fpack-struct" text to:
  https://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html#index-fpack-struct

and we don't have to modify the format string itself.

This is only done for the pp_format within diagnostic_report_diagnostic
i.e. just for the primary message in each diagnostics, and not for other
places within GCC that use pp_format internally.

"urlifier" is an abstract base class, with a GCC-specific subclass
implementing the logic for generating URLs into GCC's HTML
documentation via binary search in a data table.  This patch implements
the gcc_urlifier with a small table generated by hand; the data table in
this patch only covers enough pragmas and options to allow undoing some
of the hardcoding from the previous pragma-parsing patch.

I have a followup patch that scripts the creation of this data by
directly scraping the output of "make html", thus automating all this,
and (I hope) minimizing the work of ensuring that documentation URLs
emitted by GCC match the generated documentation.

gcc/ChangeLog:
	* Makefile.in (GCC_OBJS): Add gcc-urlifier.o.
	(OBJS): Likewise.

gcc/c-family/ChangeLog:
	* c-pragma.cc:: Eliminate uses of %{ and %} and get_doc_url
	in all places where it's just the name of the pragma (or of an
	option).
	(handle_pragma_push_options): Fix missing "GCC" in name of pragma
	in "junk" message.
	(handle_pragma_pop_options): Likewise.

gcc/ChangeLog:
	* diagnostic.cc: Include "pretty-print-urlifier.h".
	(diagnostic_initialize): Initialize m_urlifier.
	(diagnostic_finish): Clean up m_urlifier
	(diagnostic_report_diagnostic): Pass context->m_urlifier to
	pp_format.
	* diagnostic.h (diagnostic_context::m_urlifier): New field.
	* gcc-urlifier.cc: New file.
	* gcc-urlifier.def: New file.
	* gcc-urlifier.h: New file.
	* gcc.cc: Include "gcc-urlifier.h".
	(driver::global_initializations): Initialize global_dc->m_urlifier.
	* pretty-print-urlifier.h: New file.
	* pretty-print.cc: Include "pretty-print-urlifier.h".
	(obstack_append_string): New.
	(urlify_quoted_string): New.
	(pp_format): Add "urlifier" param and use it to implement optional
	urlification of quoted text strings.
	(pp_output_formatted_text): Make buffer a const pointer.
	(selftest::pp_printf_with_urlifier): New.
	(selftest::test_urlification): New.
	(selftest::pretty_print_cc_tests): Call it.
	* pretty-print.h (class urlifier): New forward declaration.
	(pp_format): Add optional urlifier param.
	* selftest-run-tests.cc (selftest::run_tests): Call
	selftest::gcc_urlifier_cc_tests .
	* selftest.h (selftest::gcc_urlifier_cc_tests): New decl.
	* toplev.cc: Include "gcc-urlifier.h".
	(general_init): Initialize global_dc->m_urlifier.
---
 gcc/Makefile.in             |   3 +-
 gcc/c-family/c-pragma.cc    |  73 ++++-------
 gcc/diagnostic.cc           |   8 +-
 gcc/diagnostic.h            |   4 +
 gcc/gcc-urlifier.cc         | 159 +++++++++++++++++++++++
 gcc/gcc-urlifier.def        |  20 +++
 gcc/gcc-urlifier.h          |  26 ++++
 gcc/gcc.cc                  |   2 +
 gcc/pretty-print-urlifier.h |  33 +++++
 gcc/pretty-print.cc         | 242 +++++++++++++++++++++++++++++++++++-
 gcc/pretty-print.h          |   5 +-
 gcc/selftest-run-tests.cc   |   1 +
 gcc/selftest.h              |   1 +
 gcc/toplev.cc               |   2 +
 14 files changed, 520 insertions(+), 59 deletions(-)
 create mode 100644 gcc/gcc-urlifier.cc
 create mode 100644 gcc/gcc-urlifier.def
 create mode 100644 gcc/gcc-urlifier.h
 create mode 100644 gcc/pretty-print-urlifier.h

diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index 41ed8163cd8..ff77d3cdc64 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -1279,7 +1279,7 @@ FORTRAN_TARGET_OBJS=@fortran_target_objs@
 RUST_TARGET_OBJS=@rust_target_objs@
 
 # Object files for gcc many-languages driver.
-GCC_OBJS = gcc.o gcc-main.o ggc-none.o
+GCC_OBJS = gcc.o gcc-main.o ggc-none.o gcc-urlifier.o
 
 c-family-warn = $(STRICT_WARN)
 
@@ -1452,6 +1452,7 @@ OBJS = \
 	function-tests.o \
 	fwprop.o \
 	gcc-rich-location.o \
+	gcc-urlifier.o \
 	gcse.o \
 	gcse-common.o \
 	ggc-common.o \
diff --git a/gcc/c-family/c-pragma.cc b/gcc/c-family/c-pragma.cc
index 904a1fcd55d..d762fa68285 100644
--- a/gcc/c-family/c-pragma.cc
+++ b/gcc/c-family/c-pragma.cc
@@ -291,17 +291,14 @@ public:
     if (TREE_CODE (x) == INTEGER_CST)
       return true;
 
-    label_text doc_url (get_doc_url ());
     warning_at (loc, OPT_Wpragmas,
-		"ignoring malformed %<%{#pragma pack%}%>:"
-		" invalid constant",
-		doc_url.get ());
+		"ignoring malformed %<#pragma pack%>:"
+		" invalid constant");
     return false;
   }
 
   void complain_about_malformed_action (pack_action action) const
   {
-    label_text doc_url (get_doc_url ());
     if (action != pack_action::pop)
       warning_at (m_last_loc, OPT_Wpragmas,
 		  "ignoring malformed %<#pragma pack(push[, id][, <n>])%>");
@@ -360,11 +357,10 @@ handle_pragma_pack (cpp_reader *)
 	action = pack_action::pop;
       else
 	{
-	  label_text doc_url (p.get_doc_url ());
 	  warning_at (loc, OPT_Wpragmas,
-		      "ignoring malformed %<%{#pragma pack%}%>:"
+		      "ignoring malformed %<#pragma pack%>:"
 		      " unknown action %qE",
-		      doc_url.get (), x);
+		      x);
 	  return;
 	}
 
@@ -401,11 +397,9 @@ handle_pragma_pack (cpp_reader *)
     }
   else
     {
-      label_text doc_url (p.get_doc_url ());
       warning_at (loc, OPT_Wpragmas,
-		  "ignoring malformed %<%{#pragma pack%}%>:"
-		  " expected %<)%>, integer, %<push%>, or %<pop%>",
-		  doc_url.get ());
+		  "ignoring malformed %<#pragma pack%>:"
+		  " expected %<)%>, integer, %<push%>, or %<pop%>");
       return;
     }
 
@@ -414,13 +408,9 @@ handle_pragma_pack (cpp_reader *)
 
   if (flag_pack_struct)
     {
-      label_text pragma_doc_url (p.get_doc_url ());
-      label_text option_doc_url
-	(get_doc_url ("gcc/Code-Gen-Options.html#index-fpack-struct"));
       warning (OPT_Wpragmas,
-	       "%<%{#pragma pack%}%> has no effect with %<%{-fpack-struct%}%>"
-	       " - ignored",
-	       pragma_doc_url.get (), option_doc_url.get ());
+	       "%<#pragma pack%> has no effect with %<-fpack-struct%>"
+	       " - ignored");
       return;
     }
 
@@ -444,11 +434,10 @@ handle_pragma_pack (cpp_reader *)
 	/* FALLTHRU */
       default:
 	{
-	  label_text doc_url (p.get_doc_url ());
 	  warning_at (align_loc, OPT_Wpragmas,
-		      "ignoring malformed %<%{#pragma pack%}%>:"
+		      "ignoring malformed %<#pragma pack%>:"
 		      " alignment must be a small power of two, not %d",
-		      doc_url.get (), align);
+		      align);
 	  return;
 	}
       }
@@ -609,11 +598,10 @@ handle_pragma_weak (cpp_reader *)
       if (!VAR_OR_FUNCTION_DECL_P (decl))
 	{
 	  auto_diagnostic_group d;
-	  label_text doc_url (p.get_doc_url ());
 	  if (warning_at (name_loc, OPT_Wpragmas,
-			  "%<%{#pragma weak%}%> declaration of %qD not allowed,"
+			  "%<#pragma weak%> declaration of %qD not allowed,"
 			  " ignored",
-			  doc_url.get (), decl))
+			  decl))
 	    if (DECL_SOURCE_LOCATION (decl) != UNKNOWN_LOCATION)
 	      inform (DECL_SOURCE_LOCATION (decl),
 		      "%qD is not a variable or function",
@@ -668,11 +656,9 @@ public:
 
   void complain_about_arg (location_t arg_loc) const
   {
-    label_text doc_url (get_doc_url ());
     warning_at (arg_loc, OPT_Wpragmas,
-		"ignoring malformed %<%{#pragma scalar_storage_order%}%>:"
-		" expected %<big-endian%>, %<little-endian%>, or %<default%>",
-		doc_url.get ());
+		"ignoring malformed %<#pragma scalar_storage_order%>:"
+		" expected %<big-endian%>, %<little-endian%>, or %<default%>");
   }
 };
 
@@ -962,12 +948,8 @@ push_visibility (const char *str, int kind, const pragma_parser *p)
 		      " %<default%>, %<internal%>, %<hidden%>"
 		      " or %<protected%>"))
 	if (p)
-	  {
-	    label_text doc_url (p->get_doc_url ());
-	    inform (loc,
-		    "ignoring malformed %<%{#pragma GCC visibility%}%>",
-		    doc_url.get ());
-	  }
+	  inform (loc,
+		  "ignoring malformed %<#pragma GCC visibility%>");
       return;
     }
   visibility_options.inpragma = 1;
@@ -1014,11 +996,9 @@ handle_pragma_visibility (cpp_reader *)
     }
   if (bad == action)
     {
-      label_text doc_url (p.get_doc_url ());
       warning (OPT_Wpragmas,
-	       "%<%{#pragma GCC visibility%}%> must be followed by %<push%> "
-	       "or %<pop%>",
-	       doc_url.get ());
+	       "%<#pragma GCC visibility%> must be followed by %<push%> "
+	       "or %<pop%>");
       return;
     }
   else
@@ -1027,11 +1007,8 @@ handle_pragma_visibility (cpp_reader *)
 	{
 	  if (! pop_visibility (0))
 	    {
-	      label_text doc_url (p.get_doc_url ());
 	      warning (OPT_Wpragmas,
-		       "no matching push for"
-		       " %<%{#pragma GCC visibility pop%}%>",
-		       doc_url.get ());
+		       "no matching push for %<#pragma GCC visibility pop%>");
 	      return;
 	    }
 	}
@@ -1511,7 +1488,7 @@ handle_pragma_push_options (cpp_reader *)
   token = pragma_lex (&x);
   if (token != CPP_EOF)
     {
-      warning (OPT_Wpragmas, "junk at end of %<#pragma push_options%>");
+      warning (OPT_Wpragmas, "junk at end of %<#pragma GCC push_options%>");
       return;
     }
 
@@ -1548,7 +1525,7 @@ handle_pragma_pop_options (cpp_reader *)
   token = pragma_lex (&x);
   if (token != CPP_EOF)
     {
-      warning (OPT_Wpragmas, "junk at end of %<#pragma pop_options%>");
+      warning (OPT_Wpragmas, "junk at end of %<#pragma GCC pop_options%>");
       return;
     }
 
@@ -1653,10 +1630,8 @@ handle_pragma_message (cpp_reader *)
         message = x;
       else
 	{
-	  label_text doc_url (p.get_doc_url ());
 	  warning_at (loc, OPT_Wpragmas,
-		      "expected a string after %<%{#pragma message%}%>",
-		      doc_url.get ());
+		      "expected a string after %<#pragma message%>");
 	  return;
 	}
       if (!p.require_close_paren ())
@@ -1673,10 +1648,8 @@ handle_pragma_message (cpp_reader *)
     }
   else
     {
-      label_text doc_url (p.get_doc_url ());
       warning_at (loc, OPT_Wpragmas,
-		  "expected a string after %<%{#pragma message%}%>",
-		  doc_url.get ());
+		  "expected a string after %<#pragma message%>");
       return;
     }
 
diff --git a/gcc/diagnostic.cc b/gcc/diagnostic.cc
index 0f392358aef..e3c440a9e8d 100644
--- a/gcc/diagnostic.cc
+++ b/gcc/diagnostic.cc
@@ -44,6 +44,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "opts.h"
 #include "cpplib.h"
 #include "text-art/theme.h"
+#include "pretty-print-urlifier.h"
 
 #ifdef HAVE_TERMIOS_H
 # include <termios.h>
@@ -193,6 +194,7 @@ diagnostic_initialize (diagnostic_context *context, int n_opts)
   context->option_state = NULL;
   context->option_name = NULL;
   context->get_option_url = NULL;
+  context->m_urlifier = nullptr;
   context->last_location = UNKNOWN_LOCATION;
   context->last_module = 0;
   context->x_data = NULL;
@@ -347,6 +349,9 @@ diagnostic_finish (diagnostic_context *context)
       delete context->m_client_data_hooks;
       context->m_client_data_hooks = NULL;
     }
+
+  delete context->m_urlifier;
+  context->m_urlifier = nullptr;
 }
 
 /* Initialize DIAGNOSTIC, where the message MSG has already been
@@ -1574,7 +1579,8 @@ diagnostic_report_diagnostic (diagnostic_context *context,
     context->m_output_format->on_begin_group ();
   context->diagnostic_group_emission_count++;
 
-  pp_format (context->printer, &diagnostic->message);
+  pp_format (context->printer, &diagnostic->message,
+	     context->m_urlifier);
   context->m_output_format->on_begin_diagnostic (diagnostic);
   pp_output_formatted_text (context->printer);
   if (context->show_cwe)
diff --git a/gcc/diagnostic.h b/gcc/diagnostic.h
index a2c8740cbd0..d79369289bc 100644
--- a/gcc/diagnostic.h
+++ b/gcc/diagnostic.h
@@ -354,6 +354,10 @@ struct diagnostic_context
      particular option.  */
   char *(*get_option_url) (diagnostic_context *, int);
 
+  /* An optional hook for adding URLs to quoted text strings in
+     diagnostics.  Only used for the main diagnostic message.  */
+  urlifier *m_urlifier;
+
   void (*print_path) (diagnostic_context *, const diagnostic_path *);
   json::value *(*make_json_for_path) (diagnostic_context *, const diagnostic_path *);
 
diff --git a/gcc/gcc-urlifier.cc b/gcc/gcc-urlifier.cc
new file mode 100644
index 00000000000..269246bc703
--- /dev/null
+++ b/gcc/gcc-urlifier.cc
@@ -0,0 +1,159 @@
+/* Automatic generation of links into GCC's documentation.
+   Copyright (C) 2023 Free Software Foundation, Inc.
+   Contributed by David Malcolm <dmalcolm@redhat.com>.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 3, or (at your option) any later
+version.
+
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
+
+#include "config.h"
+#include "system.h"
+#include "coretypes.h"
+#include "pretty-print.h"
+#include "pretty-print-urlifier.h"
+#include "gcc-urlifier.h"
+#include "selftest.h"
+
+namespace {
+
+/* Concrete subclass of urlifier for generating links into
+   GCC's HTML documentation.  */
+
+class gcc_urlifier : public urlifier
+{
+public:
+  char *get_url_for_quoted_text (const char *p, size_t sz) const final override;
+
+  const char *get_url_suffix_for_quoted_text (const char *p, size_t sz) const;
+  const char *get_url_suffix_for_quoted_text (const char *p) const;
+
+private:
+  static char *
+  make_doc_url (const char *doc_url_suffix);
+};
+
+/* class gcc_urlifier : public urlifier.  */
+
+#define DOC_URL(QUOTED_TEXT, URL_SUFFIX) \
+  { (QUOTED_TEXT), (URL_SUFFIX) }
+
+const struct
+{
+  const char *quoted_text;
+  const char *url_suffix;
+} doc_urls[] = {
+
+#include "gcc-urlifier.def"
+
+};
+
+char *
+gcc_urlifier::get_url_for_quoted_text (const char *p, size_t sz) const
+{
+  if (const char *url_suffix = get_url_suffix_for_quoted_text (p, sz))
+    return make_doc_url (url_suffix);
+  return nullptr;
+}
+
+const char *
+gcc_urlifier::get_url_suffix_for_quoted_text (const char *p, size_t sz) const
+{
+  /* Binary search.  This assumes that the quoted_text fields of doc_urls
+     are in sorted order.  */
+  int min = 0;
+  int max = ARRAY_SIZE (doc_urls) - 1;
+  while (true)
+    {
+      if (min > max)
+	return nullptr;
+      int midpoint = (min + max) / 2;
+      gcc_assert ((size_t)midpoint < ARRAY_SIZE (doc_urls));
+      int cmp = strncmp (p, doc_urls[midpoint].quoted_text, sz);
+      if (cmp == 0)
+	{
+	  if (doc_urls[midpoint].quoted_text[sz] == '\0')
+	    return doc_urls[midpoint].url_suffix;
+	  else
+	    max = midpoint - 1;
+	}
+      else if (cmp < 0)
+	max = midpoint - 1;
+      else
+	min = midpoint + 1;
+    }
+  return nullptr;
+}
+
+const char *
+gcc_urlifier::get_url_suffix_for_quoted_text (const char *p) const
+{
+  return get_url_suffix_for_quoted_text (p, strlen (p));
+}
+
+char *
+gcc_urlifier::make_doc_url (const char *doc_url_suffix)
+{
+  if (!doc_url_suffix)
+    return nullptr;
+
+  return concat (DOCUMENTATION_ROOT_URL, doc_url_suffix, nullptr);
+}
+
+} // anonymous namespace
+
+urlifier *
+make_gcc_urlifier ()
+{
+  return new gcc_urlifier ();
+}
+
+#if CHECKING_P
+
+namespace selftest {
+
+/* Selftests.  */
+
+/* Run all of the selftests within this file.  */
+
+void
+gcc_urlifier_cc_tests ()
+{
+  /* Check that doc_urls.quoted_text is sorted.  */
+  for (size_t idx = 1; idx < ARRAY_SIZE (doc_urls); idx++)
+    gcc_assert (strcmp (doc_urls[idx - 1].quoted_text,
+			doc_urls[idx].quoted_text)
+		< 0);
+
+  gcc_urlifier u;
+
+  ASSERT_EQ (u.get_url_suffix_for_quoted_text (""), nullptr);
+  ASSERT_EQ (u.get_url_suffix_for_quoted_text (")"), nullptr);
+
+  ASSERT_STREQ (u.get_url_suffix_for_quoted_text ("#pragma message"),
+		"gcc/Diagnostic-Pragmas.html");
+
+  // Incomplete prefix of a quoted_text
+  ASSERT_EQ (u.get_url_suffix_for_quoted_text ("#pragma mess"), nullptr);
+
+  /* Check that every element is findable.  */
+  for (size_t idx = 0; idx < ARRAY_SIZE (doc_urls); idx++)
+    ASSERT_STREQ
+      (u.get_url_suffix_for_quoted_text (doc_urls[idx].quoted_text),
+       doc_urls[idx].url_suffix);
+}
+
+} // namespace selftest
+
+#endif /* #if CHECKING_P */
diff --git a/gcc/gcc-urlifier.def b/gcc/gcc-urlifier.def
new file mode 100644
index 00000000000..360de930e9e
--- /dev/null
+++ b/gcc/gcc-urlifier.def
@@ -0,0 +1,20 @@
+/* Keep this file sorted.  */
+DOC_URL ("#pragma GCC diagnostic", "gcc/Diagnostic-Pragmas.html"),
+DOC_URL ("#pragma GCC diagnostic ignored_attributes", "gcc/Diagnostic-Pragmas.html"),
+DOC_URL ("#pragma GCC ivdep", "gcc/Loop-Specific-Pragmas.html#index-pragma-GCC-ivdep"),
+DOC_URL ("#pragma GCC novector", "gcc/Loop-Specific-Pragmas.html#index-pragma-GCC-novector"),
+DOC_URL ("#pragma GCC optimize", "gcc/Function-Specific-Option-Pragmas.html#index-pragma-GCC-optimize"),
+DOC_URL ("#pragma GCC pop_options", "gcc/Push_002fPop-Macro-Pragmas.html"),
+DOC_URL ("#pragma GCC push_options", "gcc/Push_002fPop-Macro-Pragmas.html"),
+DOC_URL ("#pragma GCC reset_options", "gcc/Function-Specific-Option-Pragmas.html#index-pragma-GCC-reset_005foptions"),
+DOC_URL ("#pragma GCC target", "gcc/Function-Specific-Option-Pragmas.html#index-pragma-GCC-target"),
+DOC_URL ("#pragma GCC unroll", "gcc/Loop-Specific-Pragmas.html#index-pragma-GCC-unroll-n"),
+DOC_URL ("#pragma GCC visibility", "gcc/Visibility-Pragmas.html"),
+DOC_URL ("#pragma GCC visibility pop", "gcc/Visibility-Pragmas.html"),
+DOC_URL ("#pragma message", "gcc/Diagnostic-Pragmas.html"),
+DOC_URL ("#pragma pack", "gcc/Structure-Layout-Pragmas.html"),
+DOC_URL ("#pragma redefine_extname", "gcc/Symbol-Renaming-Pragmas.html"),
+DOC_URL ("#pragma scalar_storage_order", "gcc/Structure-Layout-Pragmas.html"),
+DOC_URL ("#pragma weak", "gcc/Weak-Pragmas.html"),
+DOC_URL ("--version", "gcc/Overall-Options.html#index-version"),
+DOC_URL ("-fpack-struct", "gcc/Code-Gen-Options.html#index-fpack-struct"),
diff --git a/gcc/gcc-urlifier.h b/gcc/gcc-urlifier.h
new file mode 100644
index 00000000000..614e1c64b94
--- /dev/null
+++ b/gcc/gcc-urlifier.h
@@ -0,0 +1,26 @@
+/* Automatic generation of links into GCC's documentation.
+   Copyright (C) 2023 Free Software Foundation, Inc.
+   Contributed by David Malcolm <dmalcolm@redhat.com>.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 3, or (at your option)
+any later version.
+
+GCC is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
+
+#ifndef GCC_GCC_URLIFIER_H
+#define GCC_GCC_URLIFIER_H
+
+extern urlifier *make_gcc_urlifier ();
+
+#endif /* GCC_GCC_URLIFIER_H */
diff --git a/gcc/gcc.cc b/gcc/gcc.cc
index 884284e66b4..2bc2fc0e72d 100644
--- a/gcc/gcc.cc
+++ b/gcc/gcc.cc
@@ -47,6 +47,7 @@ compilation is specified by a string called a "spec".  */
 #include "opts-jobserver.h"
 #include "common/common-target.h"
 #include "diagnostic-text-art.h"
+#include "gcc-urlifier.h"
 
 #ifndef MATH_LIBRARY
 #define MATH_LIBRARY "m"
@@ -8293,6 +8294,7 @@ driver::global_initializations ()
   diagnostic_initialize (global_dc, 0);
   diagnostic_color_init (global_dc);
   diagnostic_urls_init (global_dc);
+  global_dc->m_urlifier = make_gcc_urlifier ();
 
 #ifdef GCC_DRIVER_HOST_INITIALIZATION
   /* Perform host dependent initialization when needed.  */
diff --git a/gcc/pretty-print-urlifier.h b/gcc/pretty-print-urlifier.h
new file mode 100644
index 00000000000..bdb7fca00d4
--- /dev/null
+++ b/gcc/pretty-print-urlifier.h
@@ -0,0 +1,33 @@
+/* Copyright (C) 2023 Free Software Foundation, Inc.
+   Contributed by David Malcolm <dmalcolm@redhat.com>
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 3, or (at your option) any later
+version.
+
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
+
+#ifndef GCC_PRETTY_PRINT_URLIFIER_H
+#define GCC_PRETTY_PRINT_URLIFIER_H
+
+/* Abstract base class for optional use in pp_format for adding URLs
+   to quoted text strings.  */
+
+class urlifier
+{
+public:
+  virtual ~urlifier () {}
+  virtual char *get_url_for_quoted_text (const char *p, size_t sz) const = 0;
+};
+
+#endif /* GCC_PRETTY_PRINT_URLIFIER_H */
diff --git a/gcc/pretty-print.cc b/gcc/pretty-print.cc
index 80780cfd7b8..9a4827622dc 100644
--- a/gcc/pretty-print.cc
+++ b/gcc/pretty-print.cc
@@ -23,6 +23,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "coretypes.h"
 #include "intl.h"
 #include "pretty-print.h"
+#include "pretty-print-urlifier.h"
 #include "diagnostic-color.h"
 #include "diagnostic-event-id.h"
 #include "selftest.h"
@@ -1022,6 +1023,95 @@ pp_indent (pretty_printer *pp)
 
 static const char *get_end_url_string (pretty_printer *);
 
+/* Append STR to OSTACK, without a null-terminator.  */
+
+static void
+obstack_append_string (obstack *ostack, const char *str)
+{
+  obstack_grow (ostack, str, strlen (str));
+}
+
+/* Given quoted text starting at QUOTED_TEXT_START_IDX within PP's buffer,
+   potentially use URLIFIER (if non-null) to see if there's a URL for the
+   quoted text.
+
+   If so, replace the quoted part of the text in the buffer with a URLified
+   version of the text, using PP's settings.
+
+   For example, given this is the buffer:
+     "this is a test `hello world"
+     .................^~~~~~~~~~~
+   with the quoted text starting at the 'h' of "hello world", the buffer
+   becomes:
+     "this is a test `BEGIN_URL(URL)hello worldEND(URL)"
+     .................^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+     .................-----------replacement-----------
+*/
+
+static void
+urlify_quoted_string (pretty_printer *pp,
+		      const urlifier *urlifier,
+		      size_t quoted_text_start_idx)
+{
+  if (pp->url_format == URL_FORMAT_NONE)
+    return;
+  if (!urlifier)
+    return;
+
+  output_buffer * const buffer = pp_buffer (pp);
+
+  /* Get end of quoted string.  */
+  const size_t close_quote_idx
+    = obstack_object_size (&buffer->chunk_obstack);
+  gcc_assert (close_quote_idx >= quoted_text_start_idx);
+  if (close_quote_idx == quoted_text_start_idx)
+    /* Empty quoted string; do nothing.  */
+    return;
+  const size_t len = close_quote_idx - quoted_text_start_idx;
+  const char *start = (buffer->chunk_obstack.object_base
+		       + quoted_text_start_idx);
+  char *url = urlifier->get_url_for_quoted_text (start, len);
+  if (!url)
+    /* No URL for this quoted text; do nothing.  */
+    return;
+
+  /* Stash a copy of the quoted text.  */
+  char *text = xstrndup (start, len);
+
+  /* Replace quoted text...  */
+  buffer->chunk_obstack.next_free -= len;
+
+  /*  ...with URLified version of the text.  */
+  /* Begin URL.  */
+  switch (pp->url_format)
+    {
+    default:
+    case URL_FORMAT_NONE:
+      gcc_unreachable ();
+    case URL_FORMAT_ST:
+      obstack_append_string (&buffer->chunk_obstack,
+			     "\33]8;;");
+      obstack_append_string (&buffer->chunk_obstack, url);
+      obstack_append_string (&buffer->chunk_obstack,
+			     "\33\\");
+      break;
+    case URL_FORMAT_BEL:
+      obstack_append_string (&buffer->chunk_obstack,
+			     "\33]8;;");
+      obstack_append_string (&buffer->chunk_obstack, url);
+      obstack_append_string (&buffer->chunk_obstack,
+			     "\a");
+      break;
+    }
+  /* Add the text back.  */
+  obstack_append_string (&buffer->chunk_obstack, text);
+  /* End URL.  */
+  obstack_append_string (&buffer->chunk_obstack,
+			 get_end_url_string (pp));
+  free (text);
+  free (url);
+}
+
 /* The following format specifiers are recognized as being client independent:
    %d, %i: (signed) integer in base ten.
    %u: unsigned integer in base ten.
@@ -1064,12 +1154,25 @@ static const char *get_end_url_string (pretty_printer *);
 
 /* Formatting phases 1 and 2: render TEXT->format_spec plus
    text->m_args_ptr into a series of chunks in pp_buffer (PP)->args[].
-   Phase 3 is in pp_output_formatted_text.  */
+   Phase 3 is in pp_output_formatted_text.
+
+   If URLIFIER is non-NULL, then use it to add URLs for quoted
+   strings, so that e.g.
+     "before %<quoted%> after"
+   with a URLIFIER that has a URL for "quoted" might be emitted as:
+     "before `BEGIN_URL(http://example.com)quotedEND_URL' after"
+   This only works for message fragments that are:
+   - quoted entirely in phase 1 (e.g. "%<this is quoted%>"), or
+   - quoted entirely in phase 2 (e.g. "%qs"),
+   but *not* in strings that use a mixture of both phases
+   (e.g. "%<this is a mixture: %s %>").   */
 
 void
-pp_format (pretty_printer *pp, text_info *text)
+pp_format (pretty_printer *pp,
+	   text_info *text,
+	   const urlifier *urlifier)
 {
-  output_buffer *buffer = pp_buffer (pp);
+  output_buffer * const buffer = pp_buffer (pp);
   const char *p;
   const char **args;
   struct chunk_info *new_chunk_array;
@@ -1079,6 +1182,9 @@ pp_format (pretty_printer *pp, text_info *text)
   bool any_unnumbered = false, any_numbered = false;
   const char **formatters[PP_NL_ARGMAX];
 
+  /* Keep track of location of last "%", if any.  */
+  size_t quoted_text_start_idx = 0;
+
   /* Allocate a new chunk structure.  */
   new_chunk_array = XOBNEW (&buffer->chunk_obstack, struct chunk_info);
   new_chunk_array->prev = buffer->cur_chunk_array;
@@ -1122,11 +1228,21 @@ pp_format (pretty_printer *pp, text_info *text)
 	      = colorize_start (pp_show_color (pp), "quote");
 	    obstack_grow (&buffer->chunk_obstack, colorstr, strlen (colorstr));
 	    p++;
+
+	    /* Stash offset of start of quoted string.  */
+	    quoted_text_start_idx
+	      = obstack_object_size (&buffer->chunk_obstack);
+
 	    continue;
 	  }
 
 	case '>':
 	  {
+	    if (quoted_text_start_idx)
+	      {
+		urlify_quoted_string (pp, urlifier, quoted_text_start_idx);
+		quoted_text_start_idx = 0;
+	      }
 	    const char *colorstr = colorize_stop (pp_show_color (pp));
 	    obstack_grow (&buffer->chunk_obstack, colorstr, strlen (colorstr));
 	  }
@@ -1168,6 +1284,12 @@ pp_format (pretty_printer *pp, text_info *text)
 	  obstack_1grow (&buffer->chunk_obstack, '\0');
 	  gcc_assert (chunk < PP_NL_ARGMAX * 2);
 	  args[chunk++] = XOBFINISH (&buffer->chunk_obstack, const char *);
+	  /* We can't yet handle urlifying quoted strings that use
+	     a combination of phase 1 and phase 2 e.g.
+	     "did you mean %<-%s%>".
+	     Stop any phase 1 quoted text if there are going to be any
+	     phase 2 quoted chunks.  */
+	  quoted_text_start_idx = 0;
 	  break;
 	}
 
@@ -1270,6 +1392,7 @@ pp_format (pretty_printer *pp, text_info *text)
       bool plus = false;
       bool hash = false;
       bool quote = false;
+      quoted_text_start_idx = 0;
 
       /* We do not attempt to enforce any ordering on the modifier
 	 characters.  */
@@ -1310,7 +1433,11 @@ pp_format (pretty_printer *pp, text_info *text)
       gcc_assert (!wide || precision == 0);
 
       if (quote)
-	pp_begin_quote (pp, pp_show_color (pp));
+	{
+	  pp_begin_quote (pp, pp_show_color (pp));
+	  quoted_text_start_idx
+	    = obstack_object_size (&buffer->chunk_obstack);
+	}
 
       switch (*p)
 	{
@@ -1480,7 +1607,14 @@ pp_format (pretty_printer *pp, text_info *text)
 	}
 
       if (quote)
-	pp_end_quote (pp, pp_show_color (pp));
+	{
+	  if (quoted_text_start_idx)
+	    {
+	      urlify_quoted_string (pp, urlifier, quoted_text_start_idx);
+	      quoted_text_start_idx = 0;
+	    }
+	  pp_end_quote (pp, pp_show_color (pp));
+	}
 
       obstack_1grow (&buffer->chunk_obstack, '\0');
       *formatters[argno] = XOBFINISH (&buffer->chunk_obstack, const char *);
@@ -1507,7 +1641,7 @@ void
 pp_output_formatted_text (pretty_printer *pp)
 {
   unsigned int chunk;
-  output_buffer *buffer = pp_buffer (pp);
+  output_buffer * const buffer = pp_buffer (pp);
   struct chunk_info *chunk_array = buffer->cur_chunk_array;
   const char **args = chunk_array->args;
 
@@ -2640,6 +2774,101 @@ test_null_urls ()
   }
 }
 
+/* Verify that URLification works as expected.  */
+
+static void
+pp_printf_with_urlifier (pretty_printer *pp,
+			 const urlifier *urlifier,
+			 const char *msg, ...)
+{
+  va_list ap;
+
+  va_start (ap, msg);
+  text_info text (msg, &ap, errno);
+  pp_format (pp, &text, urlifier);
+  pp_output_formatted_text (pp);
+  va_end (ap);
+}
+
+
+void
+test_urlification ()
+{
+  class test_urlifier : public urlifier
+  {
+  public:
+    char *
+    get_url_for_quoted_text (const char *p, size_t sz) const final override
+    {
+      if (!strncmp (p, "-foption", sz))
+	return xstrdup ("http://example.com");
+      return nullptr;
+    }
+  };
+
+  auto_fix_quotes fix_quotes;
+  const test_urlifier urlifier;
+
+  /* Uses of "%<" and "%>".  */
+  {
+    {
+      pretty_printer pp;
+      pp.url_format = URL_FORMAT_NONE;
+      pp_printf_with_urlifier (&pp, &urlifier,
+			       "foo %<-foption%> %<unrecognized%> bar");
+      ASSERT_STREQ ("foo `-foption' `unrecognized' bar",
+		    pp_formatted_text (&pp));
+    }
+    {
+      pretty_printer pp;
+      pp.url_format = URL_FORMAT_ST;
+      pp_printf_with_urlifier (&pp, &urlifier,
+			       "foo %<-foption%> %<unrecognized%> bar");
+      ASSERT_STREQ
+	("foo `\33]8;;http://example.com\33\\-foption\33]8;;\33\\'"
+	 " `unrecognized' bar",
+	 pp_formatted_text (&pp));
+    }
+    {
+      pretty_printer pp;
+      pp.url_format = URL_FORMAT_BEL;
+      pp_printf_with_urlifier (&pp, &urlifier,
+			       "foo %<-foption%> %<unrecognized%> bar");
+      ASSERT_STREQ
+	("foo `\33]8;;http://example.com\a-foption\33]8;;\a'"
+	 " `unrecognized' bar",
+	 pp_formatted_text (&pp));
+    }
+  }
+
+  /* Use of "%qs".  */
+  {
+    pretty_printer pp;
+    pp.url_format = URL_FORMAT_ST;
+    pp_printf_with_urlifier (&pp, &urlifier,
+			     "foo %qs %qs bar",
+			     "-foption", "unrecognized");
+    ASSERT_STREQ
+      ("foo `\33]8;;http://example.com\33\\-foption\33]8;;\33\\'"
+       " `unrecognized' bar",
+       pp_formatted_text (&pp));
+  }
+
+  /* Mixed usage of %< and %s, where the quoted string is built between
+     a mixture of phase 1 and phase 2.  */
+  {
+    pretty_printer pp;
+    pp.url_format = URL_FORMAT_ST;
+    pp_printf_with_urlifier (&pp, &urlifier,
+			     "foo %<-f%s%> bar",
+			     "option");
+    /* We don't support this, but make sure we don't crash.  */
+    ASSERT_STREQ
+      ("foo `-foption' bar",
+       pp_formatted_text (&pp));
+  }
+}
+
 /* Test multibyte awareness.  */
 static void test_utf8 ()
 {
@@ -2690,6 +2919,7 @@ pretty_print_cc_tests ()
   test_prefixes_and_wrapping ();
   test_urls ();
   test_null_urls ();
+  test_urlification ();
   test_utf8 ();
 }
 
diff --git a/gcc/pretty-print.h b/gcc/pretty-print.h
index 8759f0def38..9ba2c0a406e 100644
--- a/gcc/pretty-print.h
+++ b/gcc/pretty-print.h
@@ -228,6 +228,8 @@ class format_postprocessor
 /* True if colors should be shown.  */
 #define pp_show_color(PP) (PP)->show_color
 
+class urlifier;
+
 /* The data structure that contains the bare minimum required to do
    proper pretty-printing.  Clients may derived from this structure
    and add additional fields they need.  */
@@ -404,7 +406,8 @@ extern void pp_verbatim (pretty_printer *, const char *, ...)
      ATTRIBUTE_GCC_PPDIAG(2,3);
 extern void pp_flush (pretty_printer *);
 extern void pp_really_flush (pretty_printer *);
-extern void pp_format (pretty_printer *, text_info *);
+extern void pp_format (pretty_printer *, text_info *,
+		       const urlifier * = nullptr);
 extern void pp_output_formatted_text (pretty_printer *);
 extern void pp_format_verbatim (pretty_printer *, text_info *);
 
diff --git a/gcc/selftest-run-tests.cc b/gcc/selftest-run-tests.cc
index e2fc8f84b1b..cb53e90ebaf 100644
--- a/gcc/selftest-run-tests.cc
+++ b/gcc/selftest-run-tests.cc
@@ -120,6 +120,7 @@ selftest::run_tests ()
   lang_hooks.run_lang_selftests ();
 
   text_art_tests ();
+  gcc_urlifier_cc_tests ();
 
   /* Run the analyzer selftests (if enabled).  */
   ana::selftest::run_analyzer_selftests ();
diff --git a/gcc/selftest.h b/gcc/selftest.h
index 20d522afda4..b0a4142fe34 100644
--- a/gcc/selftest.h
+++ b/gcc/selftest.h
@@ -231,6 +231,7 @@ extern void et_forest_cc_tests ();
 extern void fibonacci_heap_cc_tests ();
 extern void fold_const_cc_tests ();
 extern void function_tests_cc_tests ();
+extern void gcc_urlifier_cc_tests ();
 extern void ggc_tests_cc_tests ();
 extern void gimple_cc_tests ();
 extern void hash_map_tests_cc_tests ();
diff --git a/gcc/toplev.cc b/gcc/toplev.cc
index 9a734890a18..6ca25c6f909 100644
--- a/gcc/toplev.cc
+++ b/gcc/toplev.cc
@@ -88,6 +88,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "ipa-modref.h"
 #include "ipa-param-manipulation.h"
 #include "dbgcnt.h"
+#include "gcc-urlifier.h"
 
 #include "selftest.h"
 
@@ -1049,6 +1050,7 @@ general_init (const char *argv0, bool init_signals)
   global_dc->option_state = &global_options;
   global_dc->option_name = option_name;
   global_dc->get_option_url = get_option_url;
+  global_dc->m_urlifier = make_gcc_urlifier ();
 
   if (init_signals)
     {
-- 
2.26.3


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

* [PATCH 4/4] RFC: add contrib/regenerate-index-urls.py
  2023-11-02 13:19 [PATCH/RFC 0/4] C/C++/diagnostics: various UX improvements David Malcolm
                   ` (2 preceding siblings ...)
  2023-11-02 13:19 ` [PATCH 3/4] diagnostics: add automatic URL-ification within messages David Malcolm
@ 2023-11-02 13:19 ` David Malcolm
  3 siblings, 0 replies; 6+ messages in thread
From: David Malcolm @ 2023-11-02 13:19 UTC (permalink / raw)
  To: gcc-patches; +Cc: David Malcolm

This patch adds a script for regenerating gcc/gcc-urlifier.def
from the result of "make html", and uses it to regenerate the file.

It works, but perhaps we should be instead capturing the URLs and
merging it with the data from the .opt files so that the URLifier
is reusing the option-parsing logic.

contrib/ChangeLog:
	* regenerate-index-urls.py: New file.

gcc/ChangeLog:
	* gcc-urlifier.def: Regenerate.
---
 contrib/regenerate-index-urls.py |  245 +++
 gcc/gcc-urlifier.def             | 2516 +++++++++++++++++++++++++++++-
 2 files changed, 2759 insertions(+), 2 deletions(-)
 create mode 100755 contrib/regenerate-index-urls.py

diff --git a/contrib/regenerate-index-urls.py b/contrib/regenerate-index-urls.py
new file mode 100755
index 00000000000..d405e90b587
--- /dev/null
+++ b/contrib/regenerate-index-urls.py
@@ -0,0 +1,245 @@
+#!/usr/bin/env python3
+
+# Copyright (C) 2023 Free Software Foundation, Inc.
+#
+# Script to regenerate gcc/gcc-urlifier.def
+#
+# This file is part of GCC.
+#
+# GCC is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free
+# Software Foundation; either version 3, or (at your option) any later
+# version.
+#
+# GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.  */
+
+
+import argparse
+from collections import namedtuple
+from pathlib import Path
+import sys
+import re
+import unittest
+
+
+class Index:
+    def __init__(self):
+        self.entries = {}
+        self.duplicates = set()
+
+    def add_entry(self, matched_text, url_suffix, verbose=False):
+        if matched_text in self.duplicates:
+            return
+        if matched_text in self.entries:
+            if url_suffix != self.entries[matched_text]:
+                if verbose:
+                    print(f'duplicate: {matched_text=}: {url_suffix} != {self.entries[matched_text]}')
+                del self.entries[matched_text]
+                self.duplicates.add(matched_text)
+                return
+        self.entries[matched_text] = url_suffix
+
+    def add_hardcoded_entries(self, hardcoded_entries):
+        for text, url_suffix in hardcoded_entries:
+            self.add_entry(text, url_suffix)
+
+    def get_url_suffix(self, text):
+        return self.entries.get(text)
+
+    def parse_option_index(self, input_filename, verbose=False):
+        with open(input_filename) as f:
+            for line in f:
+                self.parse_html_line_option_index(line, verbose)
+
+    def parse_html_line_option_index(self, line, verbose=False):
+        if verbose:
+            print(repr(line))
+
+        # Update for this in the GCC website's bin/preprocess process_html_file:
+        #   | sed -e 's/_002d/-/g' -e 's/_002a/*/g' \
+        line = line.replace('_002d', '-')
+        line = line.replace('_002a', '*')
+
+        # e.g. <a href="Optimize-Options.html#index-fmodulo_002dsched"><code>fmodulo-sched</code></a>
+        m = re.search(r'<a href="([\S]+)"><code>([\S]+)</code></a>', line)
+        if not m:
+            return
+        if verbose:
+            print(m.groups())
+        url_suffix, index_text = m.groups()
+        #print(f'{url_suffix=} {index_text=}')
+        # FIXME: assume we need to add a leading dash...
+        option = '-' + index_text
+        url_suffix = 'gcc/' + url_suffix
+        self.add_entry(option, url_suffix, verbose)
+
+        # Also detect the "no-" prefixes from options, and add the
+        # positive form
+        # TODO: are these all valid?
+        # Do we need to parse the .opt files, or look at the
+        # option data?
+        if option[:5] == '-Wno-':
+            self.add_entry('-W' + option[5:], url_suffix, verbose)
+        if option[:5] == '-fno-':
+            self.add_entry('-f' + option[5:], url_suffix, verbose)
+
+
+def get_str_as_c(s):
+    # For now, we don't handle escaping
+    return '"%s"' % s
+
+class Entry(namedtuple('NamedTuple', ['matched_text', 'url_suffix'])):
+    def write_as_c(self, outfile):
+        outfile.write('DOC_URL (%s, %s),\n'
+                      % (get_str_as_c(self.matched_text),
+                         get_str_as_c(self.url_suffix)))
+
+
+class DataTable:
+    def __init__(self, index):
+        self.entries = []
+        for text, url_suffix in sorted(index.entries.items()):
+            self.entries.append(Entry(text, url_suffix))
+
+    def write_as_c(self, outfile):
+        for entry in self.entries:
+            entry.write_as_c(outfile)
+
+# TODO: options:
+# - path to BUILDDIR/gcc
+# - path to SRCDIR/gcc ?
+
+# FIXME: what about duplicates?
+# FIXME: also, per-target duplicates
+# FIXME: what about "no-" prefix?
+# FIXME: but some are "-", some are "--", some are "--f"...
+# FIXME: should we also parse the common.opt etc?
+
+# The index ought to have pragmas, and perhaps attributes.
+# Ideally we'd get this from 'gcc/Concept-and-Symbol-Index.html'
+# Unfortunately the wordings don't quite match, so for now, we
+# hardcode these.
+DOC_URL = Entry
+HARDCODED_ENTRIES = [
+DOC_URL ("#pragma GCC diagnostic", "gcc/Diagnostic-Pragmas.html"),
+DOC_URL ("#pragma GCC diagnostic ignored_attributes", "gcc/Diagnostic-Pragmas.html"),
+DOC_URL ("#pragma GCC ivdep", "gcc/Loop-Specific-Pragmas.html#index-pragma-GCC-ivdep"),
+DOC_URL ("#pragma GCC novector", "gcc/Loop-Specific-Pragmas.html#index-pragma-GCC-novector"),
+DOC_URL ("#pragma GCC optimize", "gcc/Function-Specific-Option-Pragmas.html#index-pragma-GCC-optimize"),
+DOC_URL ("#pragma GCC pop_options", "gcc/Push_002fPop-Macro-Pragmas.html"),
+DOC_URL ("#pragma GCC push_options", "gcc/Push_002fPop-Macro-Pragmas.html"),
+DOC_URL ("#pragma GCC reset_options", "gcc/Function-Specific-Option-Pragmas.html#index-pragma-GCC-reset_005foptions"),
+DOC_URL ("#pragma GCC target", "gcc/Function-Specific-Option-Pragmas.html#index-pragma-GCC-target"),
+DOC_URL ("#pragma GCC unroll", "gcc/Loop-Specific-Pragmas.html#index-pragma-GCC-unroll-n"),
+DOC_URL ("#pragma GCC visibility", "gcc/Visibility-Pragmas.html"),
+DOC_URL ("#pragma GCC visibility pop", "gcc/Visibility-Pragmas.html"),
+DOC_URL ("#pragma message", "gcc/Diagnostic-Pragmas.html"),
+DOC_URL ("#pragma pack", "gcc/Structure-Layout-Pragmas.html"),
+DOC_URL ("#pragma redefine_extname", "gcc/Symbol-Renaming-Pragmas.html"),
+DOC_URL ("#pragma scalar_storage_order", "gcc/Structure-Layout-Pragmas.html"),
+DOC_URL ("#pragma weak", "gcc/Weak-Pragmas.html"),
+]
+
+# Unit-testing: run this from "BUILDDIR/gcc", with --unit-test
+INPUT_HTML_PATH = Path('HTML/gcc-14.0.0') # FIXME: version
+
+class TestParsingIndex(unittest.TestCase):
+    def test_parse_line(self):
+        index = Index()
+        index.parse_html_line_option_index('<a href="Optimize-Options.html#index-fmodulo_002dsched"><code>fmodulo-sched</code></a>')
+        self.assertEqual(index.get_url_suffix('-fmodulo-sched'),
+                         'gcc/Optimize-Options.html#index-fmodulo-sched')
+
+    def test_negated_flag(self):
+        index = Index()
+        index.parse_html_line_option_index('<tr><td></td><td valign="top"><a href="Static-Analyzer-Options.html#index-fno_002danalyzer"><code>fno-analyzer</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="Static-Analyzer-Options.html">Static Analyzer Options</a></td></tr>\n')
+        print(index.entries)
+        self.assertEqual(index.get_url_suffix('-fno-analyzer'),
+                         'gcc/Static-Analyzer-Options.html#index-fno-analyzer')
+        self.assertEqual(index.get_url_suffix('-fanalyzer'),
+                         'gcc/Static-Analyzer-Options.html#index-fno-analyzer')
+
+    def test_negated_warning(self):
+        index = Index()
+        index.parse_html_line_option_index('<tr><td></td><td valign="top"><a href="Warning-Options.html#index-Wno_002dalloca"><code>Wno-alloca</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="Warning-Options.html">Warning Options</a></td></tr>\n')
+        print(index.entries)
+        self.assertEqual(index.get_url_suffix('-Wno-alloca'),
+                         'gcc/Warning-Options.html#index-Wno-alloca')
+        self.assertEqual(index.get_url_suffix('-Walloca'),
+                         'gcc/Warning-Options.html#index-Wno-alloca')
+
+    def test_parse_option_index(self):
+        index = Index()
+        index.parse_option_index(INPUT_HTML_PATH / 'gcc/Option-Index.html')
+        self.assertEqual(index.get_url_suffix('-fmodulo-sched'),
+                         'gcc/Optimize-Options.html#index-fmodulo-sched')
+        self.assertEqual(index.get_url_suffix('-O'),
+                         'gcc/Optimize-Options.html#index-O')
+        self.assertEqual(index.get_url_suffix('-O0'),
+                         'gcc/Optimize-Options.html#index-O0')
+
+        self.assertEqual(index.get_url_suffix('-Wframe-larger-than='),
+                         'gcc/Warning-Options.html#index-Wframe-larger-than_003d')
+
+        # For now, we skip duplicates, rather than trying to have
+        # target-specific URLs.
+        self.assertEqual(index.get_url_suffix('-march'), None)
+        self.assertIn('-march', index.duplicates)
+
+    def test_hardcoded_entries(self):
+        index = Index()
+        index.add_hardcoded_entries(HARDCODED_ENTRIES)
+        self.assertEqual(index.get_url_suffix('#pragma GCC diagnostic'),
+                         'gcc/Diagnostic-Pragmas.html')
+
+class TestDataTable(unittest.TestCase):
+    def test_table(self):
+        index = Index()
+        index.add_hardcoded_entries(HARDCODED_ENTRIES)
+        index.parse_option_index(INPUT_HTML_PATH / 'gcc/Option-Index.html')
+
+        # Test some hardcoded entries
+        self.assertEqual(index.get_url_suffix('#pragma GCC diagnostic'),
+                         'gcc/Diagnostic-Pragmas.html')
+        self.assertEqual(index.get_url_suffix('#pragma weak'),
+                         'gcc/Weak-Pragmas.html')
+
+        # Test some parsed entries:
+        # TODO: this comes out as "-version", rather than "--version"
+        if 0:
+            self.assertEqual(index.get_url_suffix('--version'),
+                             'gcc/Overall-Options.html#index-version')
+        self.assertEqual(index.get_url_suffix('-fpack-struct'),
+                         'gcc/Code-Gen-Options.html#index-fpack-struct')
+
+        table = DataTable(index)
+        if 0:
+            table.write(sys.stdout)
+        self.assertEqual(table.entries[0],
+                         Entry('#pragma GCC diagnostic',
+                               'gcc/Diagnostic-Pragmas.html'))
+        self.assertEqual(table.entries[-1],
+                         Entry('-z', 'gcc/Link-Options.html#index-z'))
+
+
+if __name__ == '__main__':
+    parser = argparse.ArgumentParser()
+    parser.add_argument('base_html_dir', type=Path)
+    parser.add_argument('--unit-test', action='store_true')
+    args = parser.parse_args()
+
+    if args.unit_test:
+        unittest.main(argv=[sys.argv[0], '-v'])
+    else:
+        index = Index()
+        index.add_hardcoded_entries(HARDCODED_ENTRIES)
+        index.parse_option_index(args.base_html_dir / 'gcc/Option-Index.html')
+        table = DataTable(index)
+        table.write_as_c(sys.stdout)
diff --git a/gcc/gcc-urlifier.def b/gcc/gcc-urlifier.def
index 360de930e9e..18e296d2e0c 100644
--- a/gcc/gcc-urlifier.def
+++ b/gcc/gcc-urlifier.def
@@ -1,4 +1,3 @@
-/* Keep this file sorted.  */
 DOC_URL ("#pragma GCC diagnostic", "gcc/Diagnostic-Pragmas.html"),
 DOC_URL ("#pragma GCC diagnostic ignored_attributes", "gcc/Diagnostic-Pragmas.html"),
 DOC_URL ("#pragma GCC ivdep", "gcc/Loop-Specific-Pragmas.html#index-pragma-GCC-ivdep"),
@@ -16,5 +15,2518 @@ DOC_URL ("#pragma pack", "gcc/Structure-Layout-Pragmas.html"),
 DOC_URL ("#pragma redefine_extname", "gcc/Symbol-Renaming-Pragmas.html"),
 DOC_URL ("#pragma scalar_storage_order", "gcc/Structure-Layout-Pragmas.html"),
 DOC_URL ("#pragma weak", "gcc/Weak-Pragmas.html"),
-DOC_URL ("--version", "gcc/Overall-Options.html#index-version"),
+DOC_URL ("-###", "gcc/Overall-Options.html#index-_0023_0023_0023"),
+DOC_URL ("-A", "gcc/Preprocessor-Options.html#index-A"),
+DOC_URL ("-B", "gcc/Directory-Options.html#index-B"),
+DOC_URL ("-Bdynamic", "gcc/VxWorks-Options.html#index-Bdynamic"),
+DOC_URL ("-Bstatic", "gcc/VxWorks-Options.html#index-Bstatic"),
+DOC_URL ("-C", "gcc/Preprocessor-Options.html#index-C"),
+DOC_URL ("-CC", "gcc/Preprocessor-Options.html#index-CC"),
+DOC_URL ("-D", "gcc/Preprocessor-Options.html#index-D-1"),
+DOC_URL ("-F", "gcc/Darwin-Options.html#index-F"),
+DOC_URL ("-H", "gcc/Preprocessor-Options.html#index-H"),
+DOC_URL ("-I", "gcc/Directory-Options.html#index-I"),
+DOC_URL ("-I-", "gcc/Directory-Options.html#index-I-"),
+DOC_URL ("-L", "gcc/Directory-Options.html#index-L"),
+DOC_URL ("-M", "gcc/Preprocessor-Options.html#index-M"),
+DOC_URL ("-MD", "gcc/Preprocessor-Options.html#index-MD"),
+DOC_URL ("-MF", "gcc/Preprocessor-Options.html#index-MF"),
+DOC_URL ("-MG", "gcc/Preprocessor-Options.html#index-MG"),
+DOC_URL ("-MM", "gcc/Preprocessor-Options.html#index-MM"),
+DOC_URL ("-MMD", "gcc/Preprocessor-Options.html#index-MMD"),
+DOC_URL ("-MP", "gcc/Preprocessor-Options.html#index-MP"),
+DOC_URL ("-MQ", "gcc/Preprocessor-Options.html#index-MQ"),
+DOC_URL ("-MT", "gcc/Preprocessor-Options.html#index-MT"),
+DOC_URL ("-Mno-modules", "gcc/Preprocessor-Options.html#index-Mno-modules"),
+DOC_URL ("-O", "gcc/Optimize-Options.html#index-O"),
+DOC_URL ("-O0", "gcc/Optimize-Options.html#index-O0"),
+DOC_URL ("-O1", "gcc/Optimize-Options.html#index-O1"),
+DOC_URL ("-O2", "gcc/Optimize-Options.html#index-O2"),
+DOC_URL ("-O3", "gcc/Optimize-Options.html#index-O3"),
+DOC_URL ("-Ofast", "gcc/Optimize-Options.html#index-Ofast"),
+DOC_URL ("-Og", "gcc/Optimize-Options.html#index-Og"),
+DOC_URL ("-Os", "gcc/Optimize-Options.html#index-Os"),
+DOC_URL ("-Oz", "gcc/Optimize-Options.html#index-Oz"),
+DOC_URL ("-P", "gcc/Preprocessor-Options.html#index-P"),
+DOC_URL ("-Q", "gcc/Developer-Options.html#index-Q"),
+DOC_URL ("-Qn", "gcc/System-V-Options.html#index-Qn"),
+DOC_URL ("-Qy", "gcc/System-V-Options.html#index-Qy"),
+DOC_URL ("-T", "gcc/Link-Options.html#index-T"),
+DOC_URL ("-U", "gcc/Preprocessor-Options.html#index-U"),
+DOC_URL ("-Wa", "gcc/Assembler-Options.html#index-Wa"),
+DOC_URL ("-Wabi-tag", "gcc/C_002b_002b-Dialect-Options.html#index-Wabi-tag"),
+DOC_URL ("-Walloc-size-larger-than=", "gcc/Warning-Options.html#index-Walloc-size-larger-than_003d"),
+DOC_URL ("-Walloca-larger-than=", "gcc/Warning-Options.html#index-Walloca-larger-than_003d"),
+DOC_URL ("-Warray-parameter", "gcc/Warning-Options.html#index-Wno-array-parameter"),
+DOC_URL ("-Wbidi-chars=", "gcc/Warning-Options.html#index-Wbidi-chars_003d"),
+DOC_URL ("-Wcast-align=strict", "gcc/Warning-Options.html#index-Wcast-align_003dstrict"),
+DOC_URL ("-Wcomment", "gcc/Warning-Options.html#index-Wcomment"),
+DOC_URL ("-Wcomments", "gcc/Warning-Options.html#index-Wcomments"),
+DOC_URL ("-Wcompare-distinct-pointer-types", "gcc/Warning-Options.html#index-Wcompare-distinct-pointer-types"),
+DOC_URL ("-Wexpansion-to-defined", "gcc/Warning-Options.html#index-Wexpansion-to-defined"),
+DOC_URL ("-Wformat=", "gcc/Warning-Options.html#index-Wformat_003d"),
+DOC_URL ("-Wformat=1", "gcc/Warning-Options.html#index-Wformat_003d1"),
+DOC_URL ("-Wformat=2", "gcc/Warning-Options.html#index-Wformat_003d2"),
+DOC_URL ("-Wframe-larger-than=", "gcc/Warning-Options.html#index-Wframe-larger-than_003d"),
+DOC_URL ("-Wimplicit-fallthrough=", "gcc/Warning-Options.html#index-Wimplicit-fallthrough_003d"),
+DOC_URL ("-Winterference-size", "gcc/Warning-Options.html#index-Winterference-size"),
+DOC_URL ("-Wl", "gcc/Link-Options.html#index-Wl"),
+DOC_URL ("-Wlarger-than", "gcc/Warning-Options.html#index-Wno-larger-than"),
+DOC_URL ("-Wlarger-than-<var>byte-size</var>", "gcc/Warning-Options.html#index-Wlarger-than-byte-size"),
+DOC_URL ("-Wlarger-than=", "gcc/Warning-Options.html#index-Wlarger-than_003d"),
+DOC_URL ("-Wno-abi", "gcc/Warning-Options.html#index-Wno-abi"),
+DOC_URL ("-Wno-absolute-value", "gcc/Warning-Options.html#index-Wno-absolute-value"),
+DOC_URL ("-Wno-addr-space-convert", "gcc/AVR-Options.html#index-Wno-addr-space-convert"),
+DOC_URL ("-Wno-address", "gcc/Warning-Options.html#index-Wno-address"),
+DOC_URL ("-Wno-address-of-packed-member", "gcc/Warning-Options.html#index-Wno-address-of-packed-member"),
+DOC_URL ("-Wno-aggregate-return", "gcc/Warning-Options.html#index-Wno-aggregate-return"),
+DOC_URL ("-Wno-aggressive-loop-optimizations", "gcc/Warning-Options.html#index-Wno-aggressive-loop-optimizations"),
+DOC_URL ("-Wno-aligned-new", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-aligned-new"),
+DOC_URL ("-Wno-all", "gcc/Warning-Options.html#index-Wno-all"),
+DOC_URL ("-Wno-alloc-zero", "gcc/Warning-Options.html#index-Wno-alloc-zero"),
+DOC_URL ("-Wno-alloca", "gcc/Warning-Options.html#index-Wno-alloca"),
+DOC_URL ("-Wno-analyzer-allocation-size", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-allocation-size"),
+DOC_URL ("-Wno-analyzer-deref-before-check", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-deref-before-check"),
+DOC_URL ("-Wno-analyzer-double-fclose", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-double-fclose"),
+DOC_URL ("-Wno-analyzer-double-free", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-double-free"),
+DOC_URL ("-Wno-analyzer-exposure-through-output-file", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-exposure-through-output-file"),
+DOC_URL ("-Wno-analyzer-exposure-through-uninit-copy", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-exposure-through-uninit-copy"),
+DOC_URL ("-Wno-analyzer-fd-access-mode-mismatch", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-fd-access-mode-mismatch"),
+DOC_URL ("-Wno-analyzer-fd-double-close", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-fd-double-close"),
+DOC_URL ("-Wno-analyzer-fd-leak", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-fd-leak"),
+DOC_URL ("-Wno-analyzer-fd-phase-mismatch", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-fd-phase-mismatch"),
+DOC_URL ("-Wno-analyzer-fd-type-mismatch", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-fd-type-mismatch"),
+DOC_URL ("-Wno-analyzer-fd-use-after-close", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-fd-use-after-close"),
+DOC_URL ("-Wno-analyzer-fd-use-without-check", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-fd-use-without-check"),
+DOC_URL ("-Wno-analyzer-file-leak", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-file-leak"),
+DOC_URL ("-Wno-analyzer-free-of-non-heap", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-free-of-non-heap"),
+DOC_URL ("-Wno-analyzer-imprecise-fp-arithmetic", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-imprecise-fp-arithmetic"),
+DOC_URL ("-Wno-analyzer-infinite-recursion", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-infinite-recursion"),
+DOC_URL ("-Wno-analyzer-jump-through-null", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-jump-through-null"),
+DOC_URL ("-Wno-analyzer-malloc-leak", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-malloc-leak"),
+DOC_URL ("-Wno-analyzer-mismatching-deallocation", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-mismatching-deallocation"),
+DOC_URL ("-Wno-analyzer-null-argument", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-null-argument"),
+DOC_URL ("-Wno-analyzer-null-dereference", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-null-dereference"),
+DOC_URL ("-Wno-analyzer-out-of-bounds", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-out-of-bounds"),
+DOC_URL ("-Wno-analyzer-overlapping-buffers", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-overlapping-buffers"),
+DOC_URL ("-Wno-analyzer-possible-null-argument", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-possible-null-argument"),
+DOC_URL ("-Wno-analyzer-possible-null-dereference", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-possible-null-dereference"),
+DOC_URL ("-Wno-analyzer-putenv-of-auto-var", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-putenv-of-auto-var"),
+DOC_URL ("-Wno-analyzer-shift-count-negative", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-shift-count-negative"),
+DOC_URL ("-Wno-analyzer-shift-count-overflow", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-shift-count-overflow"),
+DOC_URL ("-Wno-analyzer-stale-setjmp-buffer", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-stale-setjmp-buffer"),
+DOC_URL ("-Wno-analyzer-tainted-allocation-size", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-tainted-allocation-size"),
+DOC_URL ("-Wno-analyzer-tainted-array-index", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-tainted-array-index"),
+DOC_URL ("-Wno-analyzer-tainted-assertion", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-tainted-assertion"),
+DOC_URL ("-Wno-analyzer-tainted-divisor", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-tainted-divisor"),
+DOC_URL ("-Wno-analyzer-tainted-offset", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-tainted-offset"),
+DOC_URL ("-Wno-analyzer-tainted-size", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-tainted-size"),
+DOC_URL ("-Wno-analyzer-too-complex", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-too-complex"),
+DOC_URL ("-Wno-analyzer-unsafe-call-within-signal-handler", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-unsafe-call-within-signal-handler"),
+DOC_URL ("-Wno-analyzer-use-after-free", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-use-after-free"),
+DOC_URL ("-Wno-analyzer-use-of-pointer-in-stale-stack-frame", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-use-of-pointer-in-stale-stack-frame"),
+DOC_URL ("-Wno-analyzer-use-of-uninitialized-value", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-use-of-uninitialized-value"),
+DOC_URL ("-Wno-analyzer-va-arg-type-mismatch", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-va-arg-type-mismatch"),
+DOC_URL ("-Wno-analyzer-va-list-exhausted", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-va-list-exhausted"),
+DOC_URL ("-Wno-analyzer-va-list-leak", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-va-list-leak"),
+DOC_URL ("-Wno-analyzer-va-list-use-after-va-end", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-va-list-use-after-va-end"),
+DOC_URL ("-Wno-analyzer-write-to-const", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-write-to-const"),
+DOC_URL ("-Wno-analyzer-write-to-string-literal", "gcc/Static-Analyzer-Options.html#index-Wno-analyzer-write-to-string-literal"),
+DOC_URL ("-Wno-arith-conversion", "gcc/Warning-Options.html#index-Wno-arith-conversion"),
+DOC_URL ("-Wno-array-bounds", "gcc/Warning-Options.html#index-Wno-array-bounds"),
+DOC_URL ("-Wno-array-compare", "gcc/Warning-Options.html#index-Wno-array-compare"),
+DOC_URL ("-Wno-array-parameter", "gcc/Warning-Options.html#index-Wno-array-parameter"),
+DOC_URL ("-Wno-assign-intercept", "gcc/Objective-C-and-Objective-C_002b_002b-Dialect-Options.html#index-Wno-assign-intercept"),
+DOC_URL ("-Wno-attribute-alias", "gcc/Warning-Options.html#index-Wno-attribute-alias"),
+DOC_URL ("-Wno-attribute-warning", "gcc/Warning-Options.html#index-Wno-attribute-warning"),
+DOC_URL ("-Wno-attributes", "gcc/Warning-Options.html#index-Wno-attributes"),
+DOC_URL ("-Wno-bad-function-cast", "gcc/Warning-Options.html#index-Wno-bad-function-cast"),
+DOC_URL ("-Wno-bidi-chars", "gcc/Warning-Options.html#index-Wno-bidi-chars"),
+DOC_URL ("-Wno-bool-compare", "gcc/Warning-Options.html#index-Wno-bool-compare"),
+DOC_URL ("-Wno-bool-operation", "gcc/Warning-Options.html#index-Wno-bool-operation"),
+DOC_URL ("-Wno-builtin-declaration-mismatch", "gcc/Warning-Options.html#index-Wno-builtin-declaration-mismatch"),
+DOC_URL ("-Wno-builtin-macro-redefined", "gcc/Warning-Options.html#index-Wno-builtin-macro-redefined"),
+DOC_URL ("-Wno-c++-compat", "gcc/Warning-Options.html#index-Wno-c_002b_002b-compat"),
+DOC_URL ("-Wno-c++11-compat", "gcc/Warning-Options.html#index-Wno-c_002b_002b11-compat"),
+DOC_URL ("-Wno-c++11-extensions", "gcc/Warning-Options.html#index-Wno-c_002b_002b11-extensions"),
+DOC_URL ("-Wno-c++14-compat", "gcc/Warning-Options.html#index-Wno-c_002b_002b14-compat"),
+DOC_URL ("-Wno-c++14-extensions", "gcc/Warning-Options.html#index-Wno-c_002b_002b14-extensions"),
+DOC_URL ("-Wno-c++17-compat", "gcc/Warning-Options.html#index-Wno-c_002b_002b17-compat"),
+DOC_URL ("-Wno-c++17-extensions", "gcc/Warning-Options.html#index-Wno-c_002b_002b17-extensions"),
+DOC_URL ("-Wno-c++20-compat", "gcc/Warning-Options.html#index-Wno-c_002b_002b20-compat"),
+DOC_URL ("-Wno-c++20-extensions", "gcc/Warning-Options.html#index-Wno-c_002b_002b20-extensions"),
+DOC_URL ("-Wno-c++23-extensions", "gcc/Warning-Options.html#index-Wno-c_002b_002b23-extensions"),
+DOC_URL ("-Wno-c11-c2x-compat", "gcc/Warning-Options.html#index-Wno-c11-c2x-compat"),
+DOC_URL ("-Wno-c90-c99-compat", "gcc/Warning-Options.html#index-Wno-c90-c99-compat"),
+DOC_URL ("-Wno-c99-c11-compat", "gcc/Warning-Options.html#index-Wno-c99-c11-compat"),
+DOC_URL ("-Wno-cast-align", "gcc/Warning-Options.html#index-Wno-cast-align"),
+DOC_URL ("-Wno-cast-function-type", "gcc/Warning-Options.html#index-Wno-cast-function-type"),
+DOC_URL ("-Wno-cast-qual", "gcc/Warning-Options.html#index-Wno-cast-qual"),
+DOC_URL ("-Wno-catch-value", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-catch-value"),
+DOC_URL ("-Wno-char-subscripts", "gcc/Warning-Options.html#index-Wno-char-subscripts"),
+DOC_URL ("-Wno-class-conversion", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-class-conversion"),
+DOC_URL ("-Wno-class-memaccess", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-class-memaccess"),
+DOC_URL ("-Wno-clobbered", "gcc/Warning-Options.html#index-Wno-clobbered"),
+DOC_URL ("-Wno-comma-subscript", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-comma-subscript"),
+DOC_URL ("-Wno-complain-wrong-lang", "gcc/Warning-Options.html#index-Wno-complain-wrong-lang"),
+DOC_URL ("-Wno-conditionally-supported", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-conditionally-supported"),
+DOC_URL ("-Wno-conversion", "gcc/Warning-Options.html#index-Wno-conversion"),
+DOC_URL ("-Wno-conversion-null", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-conversion-null"),
+DOC_URL ("-Wno-coverage-invalid-line-number", "gcc/Warning-Options.html#index-Wno-coverage-invalid-line-number"),
+DOC_URL ("-Wno-coverage-mismatch", "gcc/Warning-Options.html#index-Wno-coverage-mismatch"),
+DOC_URL ("-Wno-cpp", "gcc/Warning-Options.html#index-Wno-cpp"),
+DOC_URL ("-Wno-ctad-maybe-unsupported", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-ctad-maybe-unsupported"),
+DOC_URL ("-Wno-ctor-dtor-privacy", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-ctor-dtor-privacy"),
+DOC_URL ("-Wno-dangling-else", "gcc/Warning-Options.html#index-Wno-dangling-else"),
+DOC_URL ("-Wno-dangling-pointer", "gcc/Warning-Options.html#index-Wno-dangling-pointer"),
+DOC_URL ("-Wno-dangling-reference", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-dangling-reference"),
+DOC_URL ("-Wno-date-time", "gcc/Warning-Options.html#index-Wno-date-time"),
+DOC_URL ("-Wno-declaration-after-statement", "gcc/Warning-Options.html#index-Wno-declaration-after-statement"),
+DOC_URL ("-Wno-delete-incomplete", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-delete-incomplete"),
+DOC_URL ("-Wno-delete-non-virtual-dtor", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-delete-non-virtual-dtor"),
+DOC_URL ("-Wno-deprecated", "gcc/Warning-Options.html#index-Wno-deprecated"),
+DOC_URL ("-Wno-deprecated-copy", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-deprecated-copy"),
+DOC_URL ("-Wno-deprecated-declarations", "gcc/Warning-Options.html#index-Wno-deprecated-declarations"),
+DOC_URL ("-Wno-deprecated-enum-enum-conversion", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-deprecated-enum-enum-conversion"),
+DOC_URL ("-Wno-deprecated-enum-float-conversion", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-deprecated-enum-float-conversion"),
+DOC_URL ("-Wno-designated-init", "gcc/Warning-Options.html#index-Wno-designated-init"),
+DOC_URL ("-Wno-disabled-optimization", "gcc/Warning-Options.html#index-Wno-disabled-optimization"),
+DOC_URL ("-Wno-discarded-array-qualifiers", "gcc/Warning-Options.html#index-Wno-discarded-array-qualifiers"),
+DOC_URL ("-Wno-discarded-qualifiers", "gcc/Warning-Options.html#index-Wno-discarded-qualifiers"),
+DOC_URL ("-Wno-div-by-zero", "gcc/Warning-Options.html#index-Wno-div-by-zero"),
+DOC_URL ("-Wno-double-promotion", "gcc/Warning-Options.html#index-Wno-double-promotion"),
+DOC_URL ("-Wno-duplicate-decl-specifier", "gcc/Warning-Options.html#index-Wno-duplicate-decl-specifier"),
+DOC_URL ("-Wno-duplicated-branches", "gcc/Warning-Options.html#index-Wno-duplicated-branches"),
+DOC_URL ("-Wno-duplicated-cond", "gcc/Warning-Options.html#index-Wno-duplicated-cond"),
+DOC_URL ("-Wno-effc++", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-effc_002b_002b"),
+DOC_URL ("-Wno-elaborated-enum-base", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-elaborated-enum-base"),
+DOC_URL ("-Wno-empty-body", "gcc/Warning-Options.html#index-Wno-empty-body"),
+DOC_URL ("-Wno-enum-compare", "gcc/Warning-Options.html#index-Wno-enum-compare"),
+DOC_URL ("-Wno-enum-conversion", "gcc/Warning-Options.html#index-Wno-enum-conversion"),
+DOC_URL ("-Wno-enum-int-mismatch", "gcc/Warning-Options.html#index-Wno-enum-int-mismatch"),
+DOC_URL ("-Wno-error", "gcc/Warning-Options.html#index-Wno-error"),
+DOC_URL ("-Wno-error=", "gcc/Warning-Options.html#index-Wno-error_003d"),
+DOC_URL ("-Wno-exceptions", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-exceptions"),
+DOC_URL ("-Wno-extra-semi", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-extra-semi"),
+DOC_URL ("-Wno-fatal-errors", "gcc/Warning-Options.html#index-Wno-fatal-errors"),
+DOC_URL ("-Wno-flex-array-member-not-at-end", "gcc/Warning-Options.html#index-Wno-flex-array-member-not-at-end"),
+DOC_URL ("-Wno-float-conversion", "gcc/Warning-Options.html#index-Wno-float-conversion"),
+DOC_URL ("-Wno-float-equal", "gcc/Warning-Options.html#index-Wno-float-equal"),
+DOC_URL ("-Wno-format-contains-nul", "gcc/Warning-Options.html#index-Wno-format-contains-nul"),
+DOC_URL ("-Wno-format-extra-args", "gcc/Warning-Options.html#index-Wno-format-extra-args"),
+DOC_URL ("-Wno-format-nonliteral", "gcc/Warning-Options.html#index-Wno-format-nonliteral"),
+DOC_URL ("-Wno-format-security", "gcc/Warning-Options.html#index-Wno-format-security"),
+DOC_URL ("-Wno-format-signedness", "gcc/Warning-Options.html#index-Wno-format-signedness"),
+DOC_URL ("-Wno-format-y2k", "gcc/Warning-Options.html#index-Wno-format-y2k"),
+DOC_URL ("-Wno-format-zero-length", "gcc/Warning-Options.html#index-Wno-format-zero-length"),
+DOC_URL ("-Wno-frame-address", "gcc/Warning-Options.html#index-Wno-frame-address"),
+DOC_URL ("-Wno-free-nonheap-object", "gcc/Warning-Options.html#index-Wno-free-nonheap-object"),
+DOC_URL ("-Wno-if-not-aligned", "gcc/Warning-Options.html#index-Wno-if-not-aligned"),
+DOC_URL ("-Wno-ignored-attributes", "gcc/Warning-Options.html#index-Wno-ignored-attributes"),
+DOC_URL ("-Wno-ignored-qualifiers", "gcc/Warning-Options.html#index-Wno-ignored-qualifiers"),
+DOC_URL ("-Wno-implicit", "gcc/Warning-Options.html#index-Wno-implicit"),
+DOC_URL ("-Wno-implicit-fallthrough", "gcc/Warning-Options.html#index-Wno-implicit-fallthrough"),
+DOC_URL ("-Wno-implicit-function-declaration", "gcc/Warning-Options.html#index-Wno-implicit-function-declaration"),
+DOC_URL ("-Wno-implicit-int", "gcc/Warning-Options.html#index-Wno-implicit-int"),
+DOC_URL ("-Wno-inaccessible-base", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-inaccessible-base"),
+DOC_URL ("-Wno-incompatible-pointer-types", "gcc/Warning-Options.html#index-Wno-incompatible-pointer-types"),
+DOC_URL ("-Wno-infinite-recursion", "gcc/Warning-Options.html#index-Wno-infinite-recursion"),
+DOC_URL ("-Wno-inherited-variadic-ctor", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-inherited-variadic-ctor"),
+DOC_URL ("-Wno-init-list-lifetime", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-init-list-lifetime"),
+DOC_URL ("-Wno-init-self", "gcc/Warning-Options.html#index-Wno-init-self"),
+DOC_URL ("-Wno-inline", "gcc/Warning-Options.html#index-Wno-inline"),
+DOC_URL ("-Wno-int-conversion", "gcc/Warning-Options.html#index-Wno-int-conversion"),
+DOC_URL ("-Wno-int-in-bool-context", "gcc/Warning-Options.html#index-Wno-int-in-bool-context"),
+DOC_URL ("-Wno-int-to-pointer-cast", "gcc/Warning-Options.html#index-Wno-int-to-pointer-cast"),
+DOC_URL ("-Wno-invalid-constexpr", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-invalid-constexpr"),
+DOC_URL ("-Wno-invalid-imported-macros", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-invalid-imported-macros"),
+DOC_URL ("-Wno-invalid-memory-model", "gcc/Warning-Options.html#index-Wno-invalid-memory-model"),
+DOC_URL ("-Wno-invalid-offsetof", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-invalid-offsetof"),
+DOC_URL ("-Wno-invalid-pch", "gcc/Warning-Options.html#index-Wno-invalid-pch"),
+DOC_URL ("-Wno-invalid-utf8", "gcc/Warning-Options.html#index-Wno-invalid-utf8"),
+DOC_URL ("-Wno-jump-misses-init", "gcc/Warning-Options.html#index-Wno-jump-misses-init"),
+DOC_URL ("-Wno-larger-than", "gcc/Warning-Options.html#index-Wno-larger-than"),
+DOC_URL ("-Wno-literal-suffix", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-literal-suffix"),
+DOC_URL ("-Wno-logical-not-parentheses", "gcc/Warning-Options.html#index-Wno-logical-not-parentheses"),
+DOC_URL ("-Wno-logical-op", "gcc/Warning-Options.html#index-Wno-logical-op"),
+DOC_URL ("-Wno-long-long", "gcc/Warning-Options.html#index-Wno-long-long"),
+DOC_URL ("-Wno-lto-type-mismatch", "gcc/Warning-Options.html#index-Wno-lto-type-mismatch"),
+DOC_URL ("-Wno-main", "gcc/Warning-Options.html#index-Wno-main"),
+DOC_URL ("-Wno-maybe-uninitialized", "gcc/Warning-Options.html#index-Wno-maybe-uninitialized"),
+DOC_URL ("-Wno-memset-elt-size", "gcc/Warning-Options.html#index-Wno-memset-elt-size"),
+DOC_URL ("-Wno-memset-transposed-args", "gcc/Warning-Options.html#index-Wno-memset-transposed-args"),
+DOC_URL ("-Wno-misleading-indentation", "gcc/Warning-Options.html#index-Wno-misleading-indentation"),
+DOC_URL ("-Wno-mismatched-dealloc", "gcc/Warning-Options.html#index-Wno-mismatched-dealloc"),
+DOC_URL ("-Wno-mismatched-new-delete", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-mismatched-new-delete"),
+DOC_URL ("-Wno-mismatched-tags", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-mismatched-tags"),
+DOC_URL ("-Wno-missing-attributes", "gcc/Warning-Options.html#index-Wno-missing-attributes"),
+DOC_URL ("-Wno-missing-braces", "gcc/Warning-Options.html#index-Wno-missing-braces"),
+DOC_URL ("-Wno-missing-declarations", "gcc/Warning-Options.html#index-Wno-missing-declarations"),
+DOC_URL ("-Wno-missing-field-initializers", "gcc/Warning-Options.html#index-Wno-missing-field-initializers"),
+DOC_URL ("-Wno-missing-format-attribute", "gcc/Warning-Options.html#index-Wno-missing-format-attribute"),
+DOC_URL ("-Wno-missing-include-dirs", "gcc/Warning-Options.html#index-Wno-missing-include-dirs"),
+DOC_URL ("-Wno-missing-noreturn", "gcc/Warning-Options.html#index-Wno-missing-noreturn"),
+DOC_URL ("-Wno-missing-parameter-type", "gcc/Warning-Options.html#index-Wno-missing-parameter-type"),
+DOC_URL ("-Wno-missing-profile", "gcc/Warning-Options.html#index-Wno-missing-profile"),
+DOC_URL ("-Wno-missing-prototypes", "gcc/Warning-Options.html#index-Wno-missing-prototypes"),
+DOC_URL ("-Wno-missing-requires", "gcc/Warning-Options.html#index-Wno-missing-requires"),
+DOC_URL ("-Wno-missing-template-keyword", "gcc/Warning-Options.html#index-Wno-missing-template-keyword"),
+DOC_URL ("-Wno-missing-variable-declarations", "gcc/Warning-Options.html#index-Wno-missing-variable-declarations"),
+DOC_URL ("-Wno-misspelled-isr", "gcc/AVR-Options.html#index-Wno-misspelled-isr"),
+DOC_URL ("-Wno-multichar", "gcc/Warning-Options.html#index-Wno-multichar"),
+DOC_URL ("-Wno-multiple-inheritance", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-multiple-inheritance"),
+DOC_URL ("-Wno-multistatement-macros", "gcc/Warning-Options.html#index-Wno-multistatement-macros"),
+DOC_URL ("-Wno-namespaces", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-namespaces"),
+DOC_URL ("-Wno-narrowing", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-narrowing"),
+DOC_URL ("-Wno-nested-externs", "gcc/Warning-Options.html#index-Wno-nested-externs"),
+DOC_URL ("-Wno-noexcept", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-noexcept"),
+DOC_URL ("-Wno-noexcept-type", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-noexcept-type"),
+DOC_URL ("-Wno-non-template-friend", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-non-template-friend"),
+DOC_URL ("-Wno-non-virtual-dtor", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-non-virtual-dtor"),
+DOC_URL ("-Wno-nonnull", "gcc/Warning-Options.html#index-Wno-nonnull"),
+DOC_URL ("-Wno-nonnull-compare", "gcc/Warning-Options.html#index-Wno-nonnull-compare"),
+DOC_URL ("-Wno-normalized", "gcc/Warning-Options.html#index-Wno-normalized"),
+DOC_URL ("-Wno-nrvo", "gcc/Warning-Options.html#index-Wno-nrvo"),
+DOC_URL ("-Wno-null-dereference", "gcc/Warning-Options.html#index-Wno-null-dereference"),
+DOC_URL ("-Wno-odr", "gcc/Warning-Options.html#index-Wno-odr"),
+DOC_URL ("-Wno-old-style-cast", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-old-style-cast"),
+DOC_URL ("-Wno-old-style-declaration", "gcc/Warning-Options.html#index-Wno-old-style-declaration"),
+DOC_URL ("-Wno-old-style-definition", "gcc/Warning-Options.html#index-Wno-old-style-definition"),
+DOC_URL ("-Wno-openacc-parallelism", "gcc/Warning-Options.html#index-Wno-openacc-parallelism"),
+DOC_URL ("-Wno-openmp-simd", "gcc/Warning-Options.html#index-Wno-openmp-simd"),
+DOC_URL ("-Wno-overflow", "gcc/Warning-Options.html#index-Wno-overflow"),
+DOC_URL ("-Wno-overlength-strings", "gcc/Warning-Options.html#index-Wno-overlength-strings"),
+DOC_URL ("-Wno-overloaded-virtual", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-overloaded-virtual"),
+DOC_URL ("-Wno-override-init", "gcc/Warning-Options.html#index-Wno-override-init"),
+DOC_URL ("-Wno-override-init-side-effects", "gcc/Warning-Options.html#index-Wno-override-init-side-effects"),
+DOC_URL ("-Wno-packed", "gcc/Warning-Options.html#index-Wno-packed"),
+DOC_URL ("-Wno-packed-bitfield-compat", "gcc/Warning-Options.html#index-Wno-packed-bitfield-compat"),
+DOC_URL ("-Wno-packed-not-aligned", "gcc/Warning-Options.html#index-Wno-packed-not-aligned"),
+DOC_URL ("-Wno-padded", "gcc/Warning-Options.html#index-Wno-padded"),
+DOC_URL ("-Wno-parentheses", "gcc/Warning-Options.html#index-Wno-parentheses"),
+DOC_URL ("-Wno-pedantic", "gcc/Warning-Options.html#index-Wno-pedantic"),
+DOC_URL ("-Wno-pedantic-ms-format", "gcc/Warning-Options.html#index-Wno-pedantic-ms-format"),
+DOC_URL ("-Wno-pessimizing-move", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-pessimizing-move"),
+DOC_URL ("-Wno-placement-new", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-placement-new"),
+DOC_URL ("-Wno-pointer-arith", "gcc/Warning-Options.html#index-Wno-pointer-arith"),
+DOC_URL ("-Wno-pointer-compare", "gcc/Warning-Options.html#index-Wno-pointer-compare"),
+DOC_URL ("-Wno-pointer-sign", "gcc/Warning-Options.html#index-Wno-pointer-sign"),
+DOC_URL ("-Wno-pointer-to-int-cast", "gcc/Warning-Options.html#index-Wno-pointer-to-int-cast"),
+DOC_URL ("-Wno-pragmas", "gcc/Warning-Options.html#index-Wno-pragmas"),
+DOC_URL ("-Wno-prio-ctor-dtor", "gcc/Warning-Options.html#index-Wno-prio-ctor-dtor"),
+DOC_URL ("-Wno-property-assign-default", "gcc/Objective-C-and-Objective-C_002b_002b-Dialect-Options.html#index-Wno-property-assign-default"),
+DOC_URL ("-Wno-protocol", "gcc/Objective-C-and-Objective-C_002b_002b-Dialect-Options.html#index-Wno-protocol"),
+DOC_URL ("-Wno-range-loop-construct", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-range-loop-construct"),
+DOC_URL ("-Wno-redundant-decls", "gcc/Warning-Options.html#index-Wno-redundant-decls"),
+DOC_URL ("-Wno-redundant-move", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-redundant-move"),
+DOC_URL ("-Wno-redundant-tags", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-redundant-tags"),
+DOC_URL ("-Wno-register", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-register"),
+DOC_URL ("-Wno-reorder", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-reorder"),
+DOC_URL ("-Wno-restrict", "gcc/Warning-Options.html#index-Wno-restrict"),
+DOC_URL ("-Wno-return-local-addr", "gcc/Warning-Options.html#index-Wno-return-local-addr"),
+DOC_URL ("-Wno-return-type", "gcc/Warning-Options.html#index-Wno-return-type"),
+DOC_URL ("-Wno-scalar-storage-order", "gcc/Warning-Options.html#index-Wno-scalar-storage-order"),
+DOC_URL ("-Wno-selector", "gcc/Objective-C-and-Objective-C_002b_002b-Dialect-Options.html#index-Wno-selector"),
+DOC_URL ("-Wno-self-move", "gcc/Warning-Options.html#index-Wno-self-move"),
+DOC_URL ("-Wno-sequence-point", "gcc/Warning-Options.html#index-Wno-sequence-point"),
+DOC_URL ("-Wno-shadow", "gcc/Warning-Options.html#index-Wno-shadow"),
+DOC_URL ("-Wno-shadow-ivar", "gcc/Warning-Options.html#index-Wno-shadow-ivar"),
+DOC_URL ("-Wno-shift-count-negative", "gcc/Warning-Options.html#index-Wno-shift-count-negative"),
+DOC_URL ("-Wno-shift-count-overflow", "gcc/Warning-Options.html#index-Wno-shift-count-overflow"),
+DOC_URL ("-Wno-shift-negative-value", "gcc/Warning-Options.html#index-Wno-shift-negative-value"),
+DOC_URL ("-Wno-shift-overflow", "gcc/Warning-Options.html#index-Wno-shift-overflow"),
+DOC_URL ("-Wno-sign-compare", "gcc/Warning-Options.html#index-Wno-sign-compare"),
+DOC_URL ("-Wno-sign-conversion", "gcc/Warning-Options.html#index-Wno-sign-conversion"),
+DOC_URL ("-Wno-sign-promo", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-sign-promo"),
+DOC_URL ("-Wno-sized-deallocation", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-sized-deallocation"),
+DOC_URL ("-Wno-sizeof-array-argument", "gcc/Warning-Options.html#index-Wno-sizeof-array-argument"),
+DOC_URL ("-Wno-sizeof-array-div", "gcc/Warning-Options.html#index-Wno-sizeof-array-div"),
+DOC_URL ("-Wno-sizeof-pointer-div", "gcc/Warning-Options.html#index-Wno-sizeof-pointer-div"),
+DOC_URL ("-Wno-sizeof-pointer-memaccess", "gcc/Warning-Options.html#index-Wno-sizeof-pointer-memaccess"),
+DOC_URL ("-Wno-stack-protector", "gcc/Warning-Options.html#index-Wno-stack-protector"),
+DOC_URL ("-Wno-strict-aliasing", "gcc/Warning-Options.html#index-Wno-strict-aliasing"),
+DOC_URL ("-Wno-strict-flex-arrays", "gcc/Warning-Options.html#index-Wno-strict-flex-arrays"),
+DOC_URL ("-Wno-strict-null-sentinel", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-strict-null-sentinel"),
+DOC_URL ("-Wno-strict-overflow", "gcc/Warning-Options.html#index-Wno-strict-overflow"),
+DOC_URL ("-Wno-strict-prototypes", "gcc/Warning-Options.html#index-Wno-strict-prototypes"),
+DOC_URL ("-Wno-strict-selector-match", "gcc/Objective-C-and-Objective-C_002b_002b-Dialect-Options.html#index-Wno-strict-selector-match"),
+DOC_URL ("-Wno-string-compare", "gcc/Warning-Options.html#index-Wno-string-compare"),
+DOC_URL ("-Wno-stringop-overread", "gcc/Warning-Options.html#index-Wno-stringop-overread"),
+DOC_URL ("-Wno-stringop-truncation", "gcc/Warning-Options.html#index-Wno-stringop-truncation"),
+DOC_URL ("-Wno-subobject-linkage", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-subobject-linkage"),
+DOC_URL ("-Wno-suggest-attribute=", "gcc/Warning-Options.html#index-Wno-suggest-attribute_003d"),
+DOC_URL ("-Wno-suggest-attribute=cold", "gcc/Warning-Options.html#index-Wno-suggest-attribute_003dcold"),
+DOC_URL ("-Wno-suggest-attribute=const", "gcc/Warning-Options.html#index-Wno-suggest-attribute_003dconst"),
+DOC_URL ("-Wno-suggest-attribute=format", "gcc/Warning-Options.html#index-Wno-suggest-attribute_003dformat"),
+DOC_URL ("-Wno-suggest-attribute=malloc", "gcc/Warning-Options.html#index-Wno-suggest-attribute_003dmalloc"),
+DOC_URL ("-Wno-suggest-attribute=noreturn", "gcc/Warning-Options.html#index-Wno-suggest-attribute_003dnoreturn"),
+DOC_URL ("-Wno-suggest-attribute=pure", "gcc/Warning-Options.html#index-Wno-suggest-attribute_003dpure"),
+DOC_URL ("-Wno-suggest-final-methods", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-suggest-final-methods"),
+DOC_URL ("-Wno-suggest-final-types", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-suggest-final-types"),
+DOC_URL ("-Wno-suggest-override", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-suggest-override"),
+DOC_URL ("-Wno-switch", "gcc/Warning-Options.html#index-Wno-switch"),
+DOC_URL ("-Wno-switch-bool", "gcc/Warning-Options.html#index-Wno-switch-bool"),
+DOC_URL ("-Wno-switch-default", "gcc/Warning-Options.html#index-Wno-switch-default"),
+DOC_URL ("-Wno-switch-enum", "gcc/Warning-Options.html#index-Wno-switch-enum"),
+DOC_URL ("-Wno-switch-outside-range", "gcc/Warning-Options.html#index-Wno-switch-outside-range"),
+DOC_URL ("-Wno-switch-unreachable", "gcc/Warning-Options.html#index-Wno-switch-unreachable"),
+DOC_URL ("-Wno-sync-nand", "gcc/Warning-Options.html#index-Wno-sync-nand"),
+DOC_URL ("-Wno-system-headers", "gcc/Warning-Options.html#index-Wno-system-headers"),
+DOC_URL ("-Wno-tautological-compare", "gcc/Warning-Options.html#index-Wno-tautological-compare"),
+DOC_URL ("-Wno-templates", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-templates"),
+DOC_URL ("-Wno-terminate", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-terminate"),
+DOC_URL ("-Wno-traditional", "gcc/Warning-Options.html#index-Wno-traditional"),
+DOC_URL ("-Wno-traditional-conversion", "gcc/Warning-Options.html#index-Wno-traditional-conversion"),
+DOC_URL ("-Wno-trampolines", "gcc/Warning-Options.html#index-Wno-trampolines"),
+DOC_URL ("-Wno-trivial-auto-var-init", "gcc/Warning-Options.html#index-Wno-trivial-auto-var-init"),
+DOC_URL ("-Wno-tsan", "gcc/Warning-Options.html#index-Wno-tsan"),
+DOC_URL ("-Wno-type-limits", "gcc/Warning-Options.html#index-Wno-type-limits"),
+DOC_URL ("-Wno-undeclared-selector", "gcc/Objective-C-and-Objective-C_002b_002b-Dialect-Options.html#index-Wno-undeclared-selector"),
+DOC_URL ("-Wno-undef", "gcc/Warning-Options.html#index-Wno-undef"),
+DOC_URL ("-Wno-unicode", "gcc/Warning-Options.html#index-Wno-unicode"),
+DOC_URL ("-Wno-uninitialized", "gcc/Warning-Options.html#index-Wno-uninitialized"),
+DOC_URL ("-Wno-unknown-pragmas", "gcc/Warning-Options.html#index-Wno-unknown-pragmas"),
+DOC_URL ("-Wno-unsafe-loop-optimizations", "gcc/Warning-Options.html#index-Wno-unsafe-loop-optimizations"),
+DOC_URL ("-Wno-unsuffixed-float-constants", "gcc/Warning-Options.html#index-Wno-unsuffixed-float-constants"),
+DOC_URL ("-Wno-unused", "gcc/Warning-Options.html#index-Wno-unused"),
+DOC_URL ("-Wno-unused-but-set-parameter", "gcc/Warning-Options.html#index-Wno-unused-but-set-parameter"),
+DOC_URL ("-Wno-unused-but-set-variable", "gcc/Warning-Options.html#index-Wno-unused-but-set-variable"),
+DOC_URL ("-Wno-unused-const-variable", "gcc/Warning-Options.html#index-Wno-unused-const-variable"),
+DOC_URL ("-Wno-unused-function", "gcc/Warning-Options.html#index-Wno-unused-function"),
+DOC_URL ("-Wno-unused-label", "gcc/Warning-Options.html#index-Wno-unused-label"),
+DOC_URL ("-Wno-unused-local-typedefs", "gcc/Warning-Options.html#index-Wno-unused-local-typedefs"),
+DOC_URL ("-Wno-unused-parameter", "gcc/Warning-Options.html#index-Wno-unused-parameter"),
+DOC_URL ("-Wno-unused-result", "gcc/Warning-Options.html#index-Wno-unused-result"),
+DOC_URL ("-Wno-unused-value", "gcc/Warning-Options.html#index-Wno-unused-value"),
+DOC_URL ("-Wno-unused-variable", "gcc/Warning-Options.html#index-Wno-unused-variable"),
+DOC_URL ("-Wno-use-after-free", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-use-after-free"),
+DOC_URL ("-Wno-useless-cast", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-useless-cast"),
+DOC_URL ("-Wno-varargs", "gcc/Warning-Options.html#index-Wno-varargs"),
+DOC_URL ("-Wno-variadic-macros", "gcc/Warning-Options.html#index-Wno-variadic-macros"),
+DOC_URL ("-Wno-vector-operation-performance", "gcc/Warning-Options.html#index-Wno-vector-operation-performance"),
+DOC_URL ("-Wno-vexing-parse", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-vexing-parse"),
+DOC_URL ("-Wno-virtual-inheritance", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-virtual-inheritance"),
+DOC_URL ("-Wno-virtual-move-assign", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-virtual-move-assign"),
+DOC_URL ("-Wno-vla", "gcc/Warning-Options.html#index-Wno-vla"),
+DOC_URL ("-Wno-vla-parameter", "gcc/Warning-Options.html#index-Wno-vla-parameter"),
+DOC_URL ("-Wno-volatile", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-volatile"),
+DOC_URL ("-Wno-volatile-register-var", "gcc/Warning-Options.html#index-Wno-volatile-register-var"),
+DOC_URL ("-Wno-write-strings", "gcc/Warning-Options.html#index-Wno-write-strings"),
+DOC_URL ("-Wno-xor-used-as-pow", "gcc/Warning-Options.html#index-Wno-xor-used-as-pow"),
+DOC_URL ("-Wno-zero-as-null-pointer-constant", "gcc/C_002b_002b-Dialect-Options.html#index-Wno-zero-as-null-pointer-constant"),
+DOC_URL ("-Wnormalized=", "gcc/Warning-Options.html#index-Wnormalized_003d"),
+DOC_URL ("-Wobjc-root-class", "gcc/Objective-C-and-Objective-C_002b_002b-Dialect-Options.html#index-Wobjc-root-class"),
+DOC_URL ("-Wp", "gcc/Preprocessor-Options.html#index-Wp"),
+DOC_URL ("-Wshadow=compatible-local", "gcc/Warning-Options.html#index-Wshadow_003dcompatible-local"),
+DOC_URL ("-Wshadow=global", "gcc/Warning-Options.html#index-Wshadow_003dglobal"),
+DOC_URL ("-Wshadow=local", "gcc/Warning-Options.html#index-Wshadow_003dlocal"),
+DOC_URL ("-Wstrict-aliasing=n", "gcc/Warning-Options.html#index-Wstrict-aliasing_003dn"),
+DOC_URL ("-Wtrigraphs", "gcc/Warning-Options.html#index-Wtrigraphs"),
+DOC_URL ("-Wunused-macros", "gcc/Warning-Options.html#index-Wunused-macros"),
+DOC_URL ("-Wvla-larger-than=", "gcc/Warning-Options.html#index-Wvla-larger-than_003d"),
+DOC_URL ("-Wvla-parameter", "gcc/Warning-Options.html#index-Wno-vla-parameter"),
+DOC_URL ("-Xassembler", "gcc/Assembler-Options.html#index-Xassembler"),
+DOC_URL ("-Xbind-lazy", "gcc/VxWorks-Options.html#index-Xbind-lazy"),
+DOC_URL ("-Xbind-now", "gcc/VxWorks-Options.html#index-Xbind-now"),
+DOC_URL ("-Xlinker", "gcc/Link-Options.html#index-Xlinker"),
+DOC_URL ("-Xpreprocessor", "gcc/Preprocessor-Options.html#index-Xpreprocessor"),
+DOC_URL ("-YP", "gcc/System-V-Options.html#index-YP"),
+DOC_URL ("-Ym", "gcc/System-V-Options.html#index-Ym"),
+DOC_URL ("-all_load", "gcc/Darwin-Options.html#index-all_005fload"),
+DOC_URL ("-allowable_client", "gcc/Darwin-Options.html#index-allowable_005fclient"),
+DOC_URL ("-analyzer", "gcc/Static-Analyzer-Options.html#index-analyzer"),
+DOC_URL ("-arch_errors_fatal", "gcc/Darwin-Options.html#index-arch_005ferrors_005ffatal"),
+DOC_URL ("-aux-info", "gcc/C-Dialect-Options.html#index-aux-info"),
+DOC_URL ("-bind_at_load", "gcc/Darwin-Options.html#index-bind_005fat_005fload"),
+DOC_URL ("-block-ops-unaligned-vsx", "gcc/RS_002f6000-and-PowerPC-Options.html#index-block-ops-unaligned-vsx"),
+DOC_URL ("-bundle", "gcc/Darwin-Options.html#index-bundle"),
+DOC_URL ("-bundle_loader", "gcc/Darwin-Options.html#index-bundle_005floader"),
+DOC_URL ("-client_name", "gcc/Darwin-Options.html#index-client_005fname"),
+DOC_URL ("-compatibility_version", "gcc/Darwin-Options.html#index-compatibility_005fversion"),
+DOC_URL ("-coverage", "gcc/Instrumentation-Options.html#index-coverage"),
+DOC_URL ("-current_version", "gcc/Darwin-Options.html#index-current_005fversion"),
+DOC_URL ("-dA", "gcc/Developer-Options.html#index-dA"),
+DOC_URL ("-dH", "gcc/Developer-Options.html#index-dH"),
+DOC_URL ("-dI", "gcc/Preprocessor-Options.html#index-dI"),
+DOC_URL ("-dM", "gcc/Preprocessor-Options.html#index-dM"),
+DOC_URL ("-dN", "gcc/Preprocessor-Options.html#index-dN"),
+DOC_URL ("-dP", "gcc/Developer-Options.html#index-dP"),
+DOC_URL ("-dU", "gcc/Preprocessor-Options.html#index-dU"),
+DOC_URL ("-da", "gcc/Developer-Options.html#index-da"),
+DOC_URL ("-dead_strip", "gcc/Darwin-Options.html#index-dead_005fstrip"),
+DOC_URL ("-dependency-file", "gcc/Darwin-Options.html#index-dependency-file"),
+DOC_URL ("-dp", "gcc/Developer-Options.html#index-dp"),
+DOC_URL ("-dump-analyzer-exploded-nodes", "gcc/Static-Analyzer-Options.html#index-dump-analyzer-exploded-nodes"),
+DOC_URL ("-dump-analyzer-exploded-nodes-2", "gcc/Static-Analyzer-Options.html#index-dump-analyzer-exploded-nodes-2"),
+DOC_URL ("-dump-analyzer-exploded-nodes-3", "gcc/Static-Analyzer-Options.html#index-dump-analyzer-exploded-nodes-3"),
+DOC_URL ("-dump-analyzer-feasibility", "gcc/Static-Analyzer-Options.html#index-dump-analyzer-feasibility"),
+DOC_URL ("-dumpbase", "gcc/Overall-Options.html#index-dumpbase"),
+DOC_URL ("-dumpbase-ext", "gcc/Overall-Options.html#index-dumpbase-ext"),
+DOC_URL ("-dumpdir", "gcc/Overall-Options.html#index-dumpdir"),
+DOC_URL ("-dumpfullversion", "gcc/Developer-Options.html#index-dumpfullversion"),
+DOC_URL ("-dumpmachine", "gcc/Developer-Options.html#index-dumpmachine"),
+DOC_URL ("-dumpspecs", "gcc/Developer-Options.html#index-dumpspecs"),
+DOC_URL ("-dumpversion", "gcc/Developer-Options.html#index-dumpversion"),
+DOC_URL ("-dx", "gcc/Developer-Options.html#index-dx"),
+DOC_URL ("-dylib_file", "gcc/Darwin-Options.html#index-dylib_005ffile"),
+DOC_URL ("-dylinker_install_name", "gcc/Darwin-Options.html#index-dylinker_005finstall_005fname"),
+DOC_URL ("-dynamic", "gcc/Darwin-Options.html#index-dynamic"),
+DOC_URL ("-dynamiclib", "gcc/Darwin-Options.html#index-dynamiclib"),
+DOC_URL ("-e", "gcc/Link-Options.html#index-e"),
+DOC_URL ("-entry", "gcc/Link-Options.html#index-entry"),
+DOC_URL ("-exported_symbols_list", "gcc/Darwin-Options.html#index-exported_005fsymbols_005flist"),
+DOC_URL ("-fPIC", "gcc/Code-Gen-Options.html#index-fPIC"),
+DOC_URL ("-fPIE", "gcc/Code-Gen-Options.html#index-fPIE"),
+DOC_URL ("-fabi-compat-version", "gcc/C_002b_002b-Dialect-Options.html#index-fabi-compat-version"),
+DOC_URL ("-fabi-version", "gcc/C_002b_002b-Dialect-Options.html#index-fabi-version"),
+DOC_URL ("-fada-spec-parent", "gcc/Overall-Options.html#index-fada-spec-parent"),
+DOC_URL ("-faggressive-loop-optimizations", "gcc/Optimize-Options.html#index-faggressive-loop-optimizations"),
+DOC_URL ("-falign-functions", "gcc/Optimize-Options.html#index-falign-functions"),
+DOC_URL ("-falign-jumps", "gcc/Optimize-Options.html#index-falign-jumps"),
+DOC_URL ("-falign-labels", "gcc/Optimize-Options.html#index-falign-labels"),
+DOC_URL ("-falign-loops", "gcc/Optimize-Options.html#index-falign-loops"),
+DOC_URL ("-faligned-new", "gcc/C_002b_002b-Dialect-Options.html#index-faligned-new"),
+DOC_URL ("-fallocation-dce", "gcc/Optimize-Options.html#index-fno-allocation-dce"),
+DOC_URL ("-fallow-store-data-races", "gcc/Optimize-Options.html#index-fallow-store-data-races"),
+DOC_URL ("-fanalyzer-checker", "gcc/Static-Analyzer-Options.html#index-fanalyzer-checker"),
+DOC_URL ("-fasan-shadow-offset", "gcc/Instrumentation-Options.html#index-fasan-shadow-offset"),
+DOC_URL ("-fassociative-math", "gcc/Optimize-Options.html#index-fassociative-math"),
+DOC_URL ("-fasynchronous-unwind-tables", "gcc/Code-Gen-Options.html#index-fasynchronous-unwind-tables"),
+DOC_URL ("-fauto-inc-dec", "gcc/Optimize-Options.html#index-fauto-inc-dec"),
+DOC_URL ("-fauto-profile", "gcc/Optimize-Options.html#index-fauto-profile"),
+DOC_URL ("-fbranch-probabilities", "gcc/Optimize-Options.html#index-fbranch-probabilities"),
+DOC_URL ("-fcall-saved", "gcc/Code-Gen-Options.html#index-fcall-saved"),
+DOC_URL ("-fcall-used", "gcc/Code-Gen-Options.html#index-fcall-used"),
+DOC_URL ("-fcaller-saves", "gcc/Optimize-Options.html#index-fcaller-saves"),
+DOC_URL ("-fcallgraph-info", "gcc/Developer-Options.html#index-fcallgraph-info"),
+DOC_URL ("-fcanon-prefix-map", "gcc/Overall-Options.html#index-fcanon-prefix-map"),
+DOC_URL ("-fcanonical-system-headers", "gcc/Preprocessor-Options.html#index-fno-canonical-system-headers"),
+DOC_URL ("-fcf-protection", "gcc/Instrumentation-Options.html#index-fcf-protection"),
+DOC_URL ("-fcheck-new", "gcc/C_002b_002b-Dialect-Options.html#index-fcheck-new"),
+DOC_URL ("-fcode-hoisting", "gcc/Optimize-Options.html#index-fcode-hoisting"),
+DOC_URL ("-fcombine-stack-adjustments", "gcc/Optimize-Options.html#index-fcombine-stack-adjustments"),
+DOC_URL ("-fcompare-debug-second", "gcc/Developer-Options.html#index-fcompare-debug-second"),
+DOC_URL ("-fcompare-elim", "gcc/Optimize-Options.html#index-fcompare-elim"),
+DOC_URL ("-fconcepts", "gcc/C_002b_002b-Dialect-Options.html#index-fconcepts"),
+DOC_URL ("-fconcepts-ts", "gcc/C_002b_002b-Dialect-Options.html#index-fconcepts-ts"),
+DOC_URL ("-fcond-mismatch", "gcc/C-Dialect-Options.html#index-fcond-mismatch"),
+DOC_URL ("-fconserve-stack", "gcc/Optimize-Options.html#index-fconserve-stack"),
+DOC_URL ("-fconstant-cfstrings", "gcc/Darwin-Options.html#index-fconstant-cfstrings"),
+DOC_URL ("-fconstant-string-class", "gcc/Objective-C-and-Objective-C_002b_002b-Dialect-Options.html#index-fconstant-string-class"),
+DOC_URL ("-fconstexpr-cache-depth", "gcc/C_002b_002b-Dialect-Options.html#index-fconstexpr-cache-depth"),
+DOC_URL ("-fconstexpr-depth", "gcc/C_002b_002b-Dialect-Options.html#index-fconstexpr-depth"),
+DOC_URL ("-fconstexpr-fp-except", "gcc/C_002b_002b-Dialect-Options.html#index-fconstexpr-fp-except"),
+DOC_URL ("-fconstexpr-loop-limit", "gcc/C_002b_002b-Dialect-Options.html#index-fconstexpr-loop-limit"),
+DOC_URL ("-fconstexpr-ops-limit", "gcc/C_002b_002b-Dialect-Options.html#index-fconstexpr-ops-limit"),
+DOC_URL ("-fcontract-assumption-mode", "gcc/C_002b_002b-Dialect-Options.html#index-fcontract-assumption-mode"),
+DOC_URL ("-fcontract-build-level", "gcc/C_002b_002b-Dialect-Options.html#index-fcontract-build-level"),
+DOC_URL ("-fcontract-continuation-mode", "gcc/C_002b_002b-Dialect-Options.html#index-fcontract-continuation-mode"),
+DOC_URL ("-fcontract-mode", "gcc/C_002b_002b-Dialect-Options.html#index-fcontract-mode"),
+DOC_URL ("-fcontract-role", "gcc/C_002b_002b-Dialect-Options.html#index-fcontract-role"),
+DOC_URL ("-fcontract-strict-declarations", "gcc/C_002b_002b-Dialect-Options.html#index-fcontract-strict-declarations"),
+DOC_URL ("-fcontracts", "gcc/C_002b_002b-Dialect-Options.html#index-fcontracts"),
+DOC_URL ("-fcoroutines", "gcc/C_002b_002b-Dialect-Options.html#index-fcoroutines"),
+DOC_URL ("-fcprop-registers", "gcc/Optimize-Options.html#index-fcprop-registers"),
+DOC_URL ("-fcrossjumping", "gcc/Optimize-Options.html#index-fcrossjumping"),
+DOC_URL ("-fcse-follow-jumps", "gcc/Optimize-Options.html#index-fcse-follow-jumps"),
+DOC_URL ("-fcse-skip-blocks", "gcc/Optimize-Options.html#index-fcse-skip-blocks"),
+DOC_URL ("-fcx-fortran-rules", "gcc/Optimize-Options.html#index-fcx-fortran-rules"),
+DOC_URL ("-fcx-limited-range", "gcc/Optimize-Options.html#index-fcx-limited-range"),
+DOC_URL ("-fdata-sections", "gcc/Optimize-Options.html#index-fdata-sections"),
+DOC_URL ("-fdbg-cnt", "gcc/Developer-Options.html#index-fdbg-cnt"),
+DOC_URL ("-fdbg-cnt-list", "gcc/Developer-Options.html#index-fdbg-cnt-list"),
+DOC_URL ("-fdce", "gcc/Optimize-Options.html#index-fdce"),
+DOC_URL ("-fdebug-cpp", "gcc/Preprocessor-Options.html#index-fdebug-cpp"),
+DOC_URL ("-fdebug-prefix-map", "gcc/Debugging-Options.html#index-fdebug-prefix-map"),
+DOC_URL ("-fdeclone-ctor-dtor", "gcc/Optimize-Options.html#index-fdeclone-ctor-dtor"),
+DOC_URL ("-fdefault-inline", "gcc/Inline.html#index-fno-default-inline"),
+DOC_URL ("-fdelayed-branch", "gcc/Optimize-Options.html#index-fdelayed-branch"),
+DOC_URL ("-fdelete-dead-exceptions", "gcc/Code-Gen-Options.html#index-fdelete-dead-exceptions"),
+DOC_URL ("-fdelete-null-pointer-checks", "gcc/Optimize-Options.html#index-fdelete-null-pointer-checks"),
+DOC_URL ("-fdeps-", "gcc/C-Dialect-Options.html#index-fdeps-"),
+DOC_URL ("-fdeps-file", "gcc/C-Dialect-Options.html#index-fdeps-file"),
+DOC_URL ("-fdeps-format", "gcc/C-Dialect-Options.html#index-fdeps-format"),
+DOC_URL ("-fdeps-target", "gcc/C-Dialect-Options.html#index-fdeps-target"),
+DOC_URL ("-fdevirtualize", "gcc/Optimize-Options.html#index-fdevirtualize"),
+DOC_URL ("-fdevirtualize-at-ltrans", "gcc/Optimize-Options.html#index-fdevirtualize-at-ltrans"),
+DOC_URL ("-fdevirtualize-speculatively", "gcc/Optimize-Options.html#index-fdevirtualize-speculatively"),
+DOC_URL ("-fdiagnostics-color", "gcc/Diagnostic-Message-Formatting-Options.html#index-fdiagnostics-color"),
+DOC_URL ("-fdiagnostics-column-origin", "gcc/Diagnostic-Message-Formatting-Options.html#index-fdiagnostics-column-origin"),
+DOC_URL ("-fdiagnostics-column-unit", "gcc/Diagnostic-Message-Formatting-Options.html#index-fdiagnostics-column-unit"),
+DOC_URL ("-fdiagnostics-escape-format", "gcc/Diagnostic-Message-Formatting-Options.html#index-fdiagnostics-escape-format"),
+DOC_URL ("-fdiagnostics-format", "gcc/Diagnostic-Message-Formatting-Options.html#index-fdiagnostics-format"),
+DOC_URL ("-fdiagnostics-generate-patch", "gcc/Diagnostic-Message-Formatting-Options.html#index-fdiagnostics-generate-patch"),
+DOC_URL ("-fdiagnostics-minimum-margin-width", "gcc/Diagnostic-Message-Formatting-Options.html#index-fdiagnostics-minimum-margin-width"),
+DOC_URL ("-fdiagnostics-parseable-fixits", "gcc/Diagnostic-Message-Formatting-Options.html#index-fdiagnostics-parseable-fixits"),
+DOC_URL ("-fdiagnostics-path-format", "gcc/Diagnostic-Message-Formatting-Options.html#index-fdiagnostics-path-format"),
+DOC_URL ("-fdiagnostics-show-location", "gcc/Diagnostic-Message-Formatting-Options.html#index-fdiagnostics-show-location"),
+DOC_URL ("-fdiagnostics-show-path-depths", "gcc/Diagnostic-Message-Formatting-Options.html#index-fdiagnostics-show-path-depths"),
+DOC_URL ("-fdiagnostics-show-template-tree", "gcc/Diagnostic-Message-Formatting-Options.html#index-fdiagnostics-show-template-tree"),
+DOC_URL ("-fdiagnostics-text-art-charset", "gcc/Diagnostic-Message-Formatting-Options.html#index-fdiagnostics-text-art-charset"),
+DOC_URL ("-fdiagnostics-urls", "gcc/Diagnostic-Message-Formatting-Options.html#index-fdiagnostics-urls"),
+DOC_URL ("-fdirectives-only", "gcc/Preprocessor-Options.html#index-fdirectives-only"),
+DOC_URL ("-fdisable-", "gcc/Developer-Options.html#index-fdisable-"),
+DOC_URL ("-fdpic", "gcc/SH-Options.html#index-fdpic"),
+DOC_URL ("-fdse", "gcc/Optimize-Options.html#index-fdse"),
+DOC_URL ("-fdump-ada-spec", "gcc/Overall-Options.html#index-fdump-ada-spec"),
+DOC_URL ("-fdump-analyzer", "gcc/Static-Analyzer-Options.html#index-fdump-analyzer"),
+DOC_URL ("-fdump-analyzer-callgraph", "gcc/Static-Analyzer-Options.html#index-fdump-analyzer-callgraph"),
+DOC_URL ("-fdump-analyzer-exploded-graph", "gcc/Static-Analyzer-Options.html#index-fdump-analyzer-exploded-graph"),
+DOC_URL ("-fdump-analyzer-exploded-paths", "gcc/Static-Analyzer-Options.html#index-fdump-analyzer-exploded-paths"),
+DOC_URL ("-fdump-analyzer-json", "gcc/Static-Analyzer-Options.html#index-fdump-analyzer-json"),
+DOC_URL ("-fdump-analyzer-state-purge", "gcc/Static-Analyzer-Options.html#index-fdump-analyzer-state-purge"),
+DOC_URL ("-fdump-analyzer-stderr", "gcc/Static-Analyzer-Options.html#index-fdump-analyzer-stderr"),
+DOC_URL ("-fdump-analyzer-supergraph", "gcc/Static-Analyzer-Options.html#index-fdump-analyzer-supergraph"),
+DOC_URL ("-fdump-analyzer-untracked", "gcc/Static-Analyzer-Options.html#index-fdump-analyzer-untracked"),
+DOC_URL ("-fdump-debug", "gcc/Developer-Options.html#index-fdump-debug"),
+DOC_URL ("-fdump-earlydebug", "gcc/Developer-Options.html#index-fdump-earlydebug"),
+DOC_URL ("-fdump-final-insns", "gcc/Developer-Options.html#index-fdump-final-insns"),
+DOC_URL ("-fdump-go-spec", "gcc/Overall-Options.html#index-fdump-go-spec"),
+DOC_URL ("-fdump-ipa", "gcc/Developer-Options.html#index-fdump-ipa"),
+DOC_URL ("-fdump-lang-all", "gcc/Developer-Options.html#index-fdump-lang-all"),
+DOC_URL ("-fdump-noaddr", "gcc/Developer-Options.html#index-fdump-noaddr"),
+DOC_URL ("-fdump-passes", "gcc/Developer-Options.html#index-fdump-passes"),
+DOC_URL ("-fdump-rtl-<var>pass</var>", "gcc/Developer-Options.html#index-fdump-rtl-pass"),
+DOC_URL ("-fdump-rtl-alignments", "gcc/Developer-Options.html#index-fdump-rtl-alignments"),
+DOC_URL ("-fdump-rtl-all", "gcc/Developer-Options.html#index-fdump-rtl-all"),
+DOC_URL ("-fdump-rtl-asmcons", "gcc/Developer-Options.html#index-fdump-rtl-asmcons"),
+DOC_URL ("-fdump-rtl-auto_inc_dec", "gcc/Developer-Options.html#index-fdump-rtl-auto_005finc_005fdec"),
+DOC_URL ("-fdump-rtl-barriers", "gcc/Developer-Options.html#index-fdump-rtl-barriers"),
+DOC_URL ("-fdump-rtl-bbpart", "gcc/Developer-Options.html#index-fdump-rtl-bbpart"),
+DOC_URL ("-fdump-rtl-bbro", "gcc/Developer-Options.html#index-fdump-rtl-bbro"),
+DOC_URL ("-fdump-rtl-bypass", "gcc/Developer-Options.html#index-fdump-rtl-bypass"),
+DOC_URL ("-fdump-rtl-ce1", "gcc/Developer-Options.html#index-fdump-rtl-ce1"),
+DOC_URL ("-fdump-rtl-ce2", "gcc/Developer-Options.html#index-fdump-rtl-ce2"),
+DOC_URL ("-fdump-rtl-ce3", "gcc/Developer-Options.html#index-fdump-rtl-ce3"),
+DOC_URL ("-fdump-rtl-combine", "gcc/Developer-Options.html#index-fdump-rtl-combine"),
+DOC_URL ("-fdump-rtl-compgotos", "gcc/Developer-Options.html#index-fdump-rtl-compgotos"),
+DOC_URL ("-fdump-rtl-cprop_hardreg", "gcc/Developer-Options.html#index-fdump-rtl-cprop_005fhardreg"),
+DOC_URL ("-fdump-rtl-csa", "gcc/Developer-Options.html#index-fdump-rtl-csa"),
+DOC_URL ("-fdump-rtl-cse1", "gcc/Developer-Options.html#index-fdump-rtl-cse1"),
+DOC_URL ("-fdump-rtl-cse2", "gcc/Developer-Options.html#index-fdump-rtl-cse2"),
+DOC_URL ("-fdump-rtl-dbr", "gcc/Developer-Options.html#index-fdump-rtl-dbr"),
+DOC_URL ("-fdump-rtl-dce", "gcc/Developer-Options.html#index-fdump-rtl-dce"),
+DOC_URL ("-fdump-rtl-dce1", "gcc/Developer-Options.html#index-fdump-rtl-dce1"),
+DOC_URL ("-fdump-rtl-dce2", "gcc/Developer-Options.html#index-fdump-rtl-dce2"),
+DOC_URL ("-fdump-rtl-dfinish", "gcc/Developer-Options.html#index-fdump-rtl-dfinish"),
+DOC_URL ("-fdump-rtl-dfinit", "gcc/Developer-Options.html#index-fdump-rtl-dfinit"),
+DOC_URL ("-fdump-rtl-eh", "gcc/Developer-Options.html#index-fdump-rtl-eh"),
+DOC_URL ("-fdump-rtl-eh_ranges", "gcc/Developer-Options.html#index-fdump-rtl-eh_005franges"),
+DOC_URL ("-fdump-rtl-expand", "gcc/Developer-Options.html#index-fdump-rtl-expand"),
+DOC_URL ("-fdump-rtl-fwprop1", "gcc/Developer-Options.html#index-fdump-rtl-fwprop1"),
+DOC_URL ("-fdump-rtl-fwprop2", "gcc/Developer-Options.html#index-fdump-rtl-fwprop2"),
+DOC_URL ("-fdump-rtl-gcse1", "gcc/Developer-Options.html#index-fdump-rtl-gcse1"),
+DOC_URL ("-fdump-rtl-gcse2", "gcc/Developer-Options.html#index-fdump-rtl-gcse2"),
+DOC_URL ("-fdump-rtl-init-regs", "gcc/Developer-Options.html#index-fdump-rtl-init-regs"),
+DOC_URL ("-fdump-rtl-initvals", "gcc/Developer-Options.html#index-fdump-rtl-initvals"),
+DOC_URL ("-fdump-rtl-into_cfglayout", "gcc/Developer-Options.html#index-fdump-rtl-into_005fcfglayout"),
+DOC_URL ("-fdump-rtl-ira", "gcc/Developer-Options.html#index-fdump-rtl-ira"),
+DOC_URL ("-fdump-rtl-jump", "gcc/Developer-Options.html#index-fdump-rtl-jump"),
+DOC_URL ("-fdump-rtl-loop2", "gcc/Developer-Options.html#index-fdump-rtl-loop2"),
+DOC_URL ("-fdump-rtl-mach", "gcc/Developer-Options.html#index-fdump-rtl-mach"),
+DOC_URL ("-fdump-rtl-mode_sw", "gcc/Developer-Options.html#index-fdump-rtl-mode_005fsw"),
+DOC_URL ("-fdump-rtl-outof_cfglayout", "gcc/Developer-Options.html#index-fdump-rtl-outof_005fcfglayout"),
+DOC_URL ("-fdump-rtl-peephole2", "gcc/Developer-Options.html#index-fdump-rtl-peephole2"),
+DOC_URL ("-fdump-rtl-postreload", "gcc/Developer-Options.html#index-fdump-rtl-postreload"),
+DOC_URL ("-fdump-rtl-pro_and_epilogue", "gcc/Developer-Options.html#index-fdump-rtl-pro_005fand_005fepilogue"),
+DOC_URL ("-fdump-rtl-ree", "gcc/Developer-Options.html#index-fdump-rtl-ree"),
+DOC_URL ("-fdump-rtl-regclass", "gcc/Developer-Options.html#index-fdump-rtl-regclass"),
+DOC_URL ("-fdump-rtl-rnreg", "gcc/Developer-Options.html#index-fdump-rtl-rnreg"),
+DOC_URL ("-fdump-rtl-sched1", "gcc/Developer-Options.html#index-fdump-rtl-sched1"),
+DOC_URL ("-fdump-rtl-sched2", "gcc/Developer-Options.html#index-fdump-rtl-sched2"),
+DOC_URL ("-fdump-rtl-seqabstr", "gcc/Developer-Options.html#index-fdump-rtl-seqabstr"),
+DOC_URL ("-fdump-rtl-shorten", "gcc/Developer-Options.html#index-fdump-rtl-shorten"),
+DOC_URL ("-fdump-rtl-sibling", "gcc/Developer-Options.html#index-fdump-rtl-sibling"),
+DOC_URL ("-fdump-rtl-sms", "gcc/Developer-Options.html#index-fdump-rtl-sms"),
+DOC_URL ("-fdump-rtl-split1", "gcc/Developer-Options.html#index-fdump-rtl-split1"),
+DOC_URL ("-fdump-rtl-split2", "gcc/Developer-Options.html#index-fdump-rtl-split2"),
+DOC_URL ("-fdump-rtl-split3", "gcc/Developer-Options.html#index-fdump-rtl-split3"),
+DOC_URL ("-fdump-rtl-split4", "gcc/Developer-Options.html#index-fdump-rtl-split4"),
+DOC_URL ("-fdump-rtl-split5", "gcc/Developer-Options.html#index-fdump-rtl-split5"),
+DOC_URL ("-fdump-rtl-stack", "gcc/Developer-Options.html#index-fdump-rtl-stack"),
+DOC_URL ("-fdump-rtl-subreg1", "gcc/Developer-Options.html#index-fdump-rtl-subreg1"),
+DOC_URL ("-fdump-rtl-subreg2", "gcc/Developer-Options.html#index-fdump-rtl-subreg2"),
+DOC_URL ("-fdump-rtl-subregs_of_mode_finish", "gcc/Developer-Options.html#index-fdump-rtl-subregs_005fof_005fmode_005ffinish"),
+DOC_URL ("-fdump-rtl-subregs_of_mode_init", "gcc/Developer-Options.html#index-fdump-rtl-subregs_005fof_005fmode_005finit"),
+DOC_URL ("-fdump-rtl-unshare", "gcc/Developer-Options.html#index-fdump-rtl-unshare"),
+DOC_URL ("-fdump-rtl-vartrack", "gcc/Developer-Options.html#index-fdump-rtl-vartrack"),
+DOC_URL ("-fdump-rtl-vregs", "gcc/Developer-Options.html#index-fdump-rtl-vregs"),
+DOC_URL ("-fdump-rtl-web", "gcc/Developer-Options.html#index-fdump-rtl-web"),
+DOC_URL ("-fdump-statistics", "gcc/Developer-Options.html#index-fdump-statistics"),
+DOC_URL ("-fdump-tree", "gcc/Developer-Options.html#index-fdump-tree"),
+DOC_URL ("-fdump-tree-all", "gcc/Developer-Options.html#index-fdump-tree-all"),
+DOC_URL ("-fdump-unnumbered", "gcc/Developer-Options.html#index-fdump-unnumbered"),
+DOC_URL ("-fdump-unnumbered-links", "gcc/Developer-Options.html#index-fdump-unnumbered-links"),
+DOC_URL ("-fearly-inlining", "gcc/Optimize-Options.html#index-fearly-inlining"),
+DOC_URL ("-femit-class-debug-always", "gcc/Debugging-Options.html#index-femit-class-debug-always"),
+DOC_URL ("-femit-struct-debug-baseonly", "gcc/Debugging-Options.html#index-femit-struct-debug-baseonly"),
+DOC_URL ("-femit-struct-debug-detailed", "gcc/Debugging-Options.html#index-femit-struct-debug-detailed"),
+DOC_URL ("-femit-struct-debug-reduced", "gcc/Debugging-Options.html#index-femit-struct-debug-reduced"),
+DOC_URL ("-fenable-", "gcc/Developer-Options.html#index-fenable-"),
+DOC_URL ("-fexceptions", "gcc/Code-Gen-Options.html#index-fexceptions"),
+DOC_URL ("-fexcess-precision", "gcc/Optimize-Options.html#index-fexcess-precision"),
+DOC_URL ("-fexec-charset", "gcc/Preprocessor-Options.html#index-fexec-charset"),
+DOC_URL ("-fexpensive-optimizations", "gcc/Optimize-Options.html#index-fexpensive-optimizations"),
+DOC_URL ("-fextended-identifiers", "gcc/Preprocessor-Options.html#index-fextended-identifiers"),
+DOC_URL ("-ffast-math", "gcc/Optimize-Options.html#index-ffast-math"),
+DOC_URL ("-ffat-lto-objects", "gcc/Optimize-Options.html#index-ffat-lto-objects"),
+DOC_URL ("-ffile-prefix-map", "gcc/Overall-Options.html#index-ffile-prefix-map"),
+DOC_URL ("-ffinite-math-only", "gcc/Optimize-Options.html#index-ffinite-math-only"),
+DOC_URL ("-ffix-and-continue", "gcc/Darwin-Options.html#index-ffix-and-continue"),
+DOC_URL ("-ffixed", "gcc/Code-Gen-Options.html#index-ffixed"),
+DOC_URL ("-ffold-mem-offsets", "gcc/Optimize-Options.html#index-ffold-mem-offsets"),
+DOC_URL ("-fforward-propagate", "gcc/Optimize-Options.html#index-fforward-propagate"),
+DOC_URL ("-ffp-contract", "gcc/Optimize-Options.html#index-ffp-contract"),
+DOC_URL ("-ffunction-sections", "gcc/Optimize-Options.html#index-ffunction-sections"),
+DOC_URL ("-fgcse", "gcc/Optimize-Options.html#index-fgcse"),
+DOC_URL ("-fgcse-after-reload", "gcc/Optimize-Options.html#index-fgcse-after-reload"),
+DOC_URL ("-fgcse-las", "gcc/Optimize-Options.html#index-fgcse-las"),
+DOC_URL ("-fgcse-lm", "gcc/Optimize-Options.html#index-fgcse-lm"),
+DOC_URL ("-fgcse-sm", "gcc/Optimize-Options.html#index-fgcse-sm"),
+DOC_URL ("-fgimple", "gcc/C-Dialect-Options.html#index-fgimple"),
+DOC_URL ("-fgnu-runtime", "gcc/Objective-C-and-Objective-C_002b_002b-Dialect-Options.html#index-fgnu-runtime"),
+DOC_URL ("-fgnu-tm", "gcc/C-Dialect-Options.html#index-fgnu-tm"),
+DOC_URL ("-fgnu89-inline", "gcc/C-Dialect-Options.html#index-fgnu89-inline"),
+DOC_URL ("-fgraphite-identity", "gcc/Optimize-Options.html#index-fgraphite-identity"),
+DOC_URL ("-fhardcfr-check-noreturn-calls", "gcc/Instrumentation-Options.html#index-fhardcfr-check-noreturn-calls"),
+DOC_URL ("-fhardcfr-skip-leaf", "gcc/Instrumentation-Options.html#index-fhardcfr-skip-leaf"),
+DOC_URL ("-fharden-compares", "gcc/Instrumentation-Options.html#index-fharden-compares"),
+DOC_URL ("-fharden-conditional-branches", "gcc/Instrumentation-Options.html#index-fharden-conditional-branches"),
+DOC_URL ("-fharden-control-flow-redundancy", "gcc/Instrumentation-Options.html#index-fharden-control-flow-redundancy"),
+DOC_URL ("-fhoist-adjacent-loads", "gcc/Optimize-Options.html#index-fhoist-adjacent-loads"),
+DOC_URL ("-fhosted", "gcc/C-Dialect-Options.html#index-fhosted"),
+DOC_URL ("-fif-conversion", "gcc/Optimize-Options.html#index-fif-conversion"),
+DOC_URL ("-fif-conversion2", "gcc/Optimize-Options.html#index-fif-conversion2"),
+DOC_URL ("-filelist", "gcc/Darwin-Options.html#index-filelist"),
+DOC_URL ("-fimplicit-constexpr", "gcc/C_002b_002b-Dialect-Options.html#index-fimplicit-constexpr"),
+DOC_URL ("-findirect-data", "gcc/Darwin-Options.html#index-findirect-data"),
+DOC_URL ("-findirect-inlining", "gcc/Optimize-Options.html#index-findirect-inlining"),
+DOC_URL ("-finhibit-size-directive", "gcc/Code-Gen-Options.html#index-finhibit-size-directive"),
+DOC_URL ("-finline-functions", "gcc/Optimize-Options.html#index-finline-functions"),
+DOC_URL ("-finline-functions-called-once", "gcc/Optimize-Options.html#index-finline-functions-called-once"),
+DOC_URL ("-finline-limit", "gcc/Optimize-Options.html#index-finline-limit"),
+DOC_URL ("-finline-small-functions", "gcc/Optimize-Options.html#index-finline-small-functions"),
+DOC_URL ("-finput-charset", "gcc/Preprocessor-Options.html#index-finput-charset"),
+DOC_URL ("-finstrument-functions-exclude-file-list", "gcc/Instrumentation-Options.html#index-finstrument-functions-exclude-file-list"),
+DOC_URL ("-finstrument-functions-exclude-function-list", "gcc/Instrumentation-Options.html#index-finstrument-functions-exclude-function-list"),
+DOC_URL ("-finstrument-functions-once", "gcc/Instrumentation-Options.html#index-finstrument-functions-once"),
+DOC_URL ("-fipa-bit-cp", "gcc/Optimize-Options.html#index-fipa-bit-cp"),
+DOC_URL ("-fipa-cp", "gcc/Optimize-Options.html#index-fipa-cp"),
+DOC_URL ("-fipa-cp-clone", "gcc/Optimize-Options.html#index-fipa-cp-clone"),
+DOC_URL ("-fipa-icf", "gcc/Optimize-Options.html#index-fipa-icf"),
+DOC_URL ("-fipa-modref", "gcc/Optimize-Options.html#index-fipa-modref"),
+DOC_URL ("-fipa-profile", "gcc/Optimize-Options.html#index-fipa-profile"),
+DOC_URL ("-fipa-pta", "gcc/Optimize-Options.html#index-fipa-pta"),
+DOC_URL ("-fipa-pure-const", "gcc/Optimize-Options.html#index-fipa-pure-const"),
+DOC_URL ("-fipa-ra", "gcc/Optimize-Options.html#index-fipa-ra"),
+DOC_URL ("-fipa-reference", "gcc/Optimize-Options.html#index-fipa-reference"),
+DOC_URL ("-fipa-reference-addressable", "gcc/Optimize-Options.html#index-fipa-reference-addressable"),
+DOC_URL ("-fipa-sra", "gcc/Optimize-Options.html#index-fipa-sra"),
+DOC_URL ("-fipa-stack-alignment", "gcc/Optimize-Options.html#index-fipa-stack-alignment"),
+DOC_URL ("-fipa-strict-aliasing", "gcc/Optimize-Options.html#index-fipa-strict-aliasing"),
+DOC_URL ("-fipa-vrp", "gcc/Optimize-Options.html#index-fipa-vrp"),
+DOC_URL ("-fira-algorithm", "gcc/Optimize-Options.html#index-fira-algorithm"),
+DOC_URL ("-fira-hoist-pressure", "gcc/Optimize-Options.html#index-fira-hoist-pressure"),
+DOC_URL ("-fira-loop-pressure", "gcc/Optimize-Options.html#index-fira-loop-pressure"),
+DOC_URL ("-fira-region", "gcc/Optimize-Options.html#index-fira-region"),
+DOC_URL ("-fira-verbose", "gcc/Developer-Options.html#index-fira-verbose"),
+DOC_URL ("-fisolate-erroneous-paths-attribute", "gcc/Optimize-Options.html#index-fisolate-erroneous-paths-attribute"),
+DOC_URL ("-fisolate-erroneous-paths-dereference", "gcc/Optimize-Options.html#index-fisolate-erroneous-paths-dereference"),
+DOC_URL ("-fivar-visibility", "gcc/Objective-C-and-Objective-C_002b_002b-Dialect-Options.html#index-fivar-visibility"),
+DOC_URL ("-fivopts", "gcc/Optimize-Options.html#index-fivopts"),
+DOC_URL ("-fkeep-static-consts", "gcc/Optimize-Options.html#index-fkeep-static-consts"),
+DOC_URL ("-fkeep-static-functions", "gcc/Optimize-Options.html#index-fkeep-static-functions"),
+DOC_URL ("-flang-info-include-translate", "gcc/C_002b_002b-Dialect-Options.html#index-flang-info-include-translate"),
+DOC_URL ("-flang-info-include-translate-not", "gcc/C_002b_002b-Dialect-Options.html#index-flang-info-include-translate-not"),
+DOC_URL ("-flang-info-module-cmi", "gcc/C_002b_002b-Dialect-Options.html#index-flang-info-module-cmi"),
+DOC_URL ("-flarge-source-files", "gcc/Preprocessor-Options.html#index-flarge-source-files"),
+DOC_URL ("-flat_namespace", "gcc/Darwin-Options.html#index-flat_005fnamespace"),
+DOC_URL ("-flax-vector-conversions", "gcc/C-Dialect-Options.html#index-flax-vector-conversions"),
+DOC_URL ("-fleading-underscore", "gcc/Code-Gen-Options.html#index-fleading-underscore"),
+DOC_URL ("-flinker-output", "gcc/Link-Options.html#index-flinker-output"),
+DOC_URL ("-flive-patching", "gcc/Optimize-Options.html#index-flive-patching"),
+DOC_URL ("-flive-range-shrinkage", "gcc/Optimize-Options.html#index-flive-range-shrinkage"),
+DOC_URL ("-floop-block", "gcc/Optimize-Options.html#index-floop-block"),
+DOC_URL ("-floop-interchange", "gcc/Optimize-Options.html#index-floop-interchange"),
+DOC_URL ("-floop-nest-optimize", "gcc/Optimize-Options.html#index-floop-nest-optimize"),
+DOC_URL ("-floop-parallelize-all", "gcc/Optimize-Options.html#index-floop-parallelize-all"),
+DOC_URL ("-floop-strip-mine", "gcc/Optimize-Options.html#index-floop-strip-mine"),
+DOC_URL ("-floop-unroll-and-jam", "gcc/Optimize-Options.html#index-floop-unroll-and-jam"),
+DOC_URL ("-flra-remat", "gcc/Optimize-Options.html#index-flra-remat"),
+DOC_URL ("-flto", "gcc/Optimize-Options.html#index-flto"),
+DOC_URL ("-flto-compression-level", "gcc/Optimize-Options.html#index-flto-compression-level"),
+DOC_URL ("-flto-partition", "gcc/Optimize-Options.html#index-flto-partition"),
+DOC_URL ("-flto-report", "gcc/Developer-Options.html#index-flto-report"),
+DOC_URL ("-flto-report-wpa", "gcc/Developer-Options.html#index-flto-report-wpa"),
+DOC_URL ("-fmacro-prefix-map", "gcc/Preprocessor-Options.html#index-fmacro-prefix-map"),
+DOC_URL ("-fmax-errors", "gcc/Warning-Options.html#index-fmax-errors"),
+DOC_URL ("-fmax-include-depth", "gcc/Preprocessor-Options.html#index-fmax-include-depth"),
+DOC_URL ("-fmem-report", "gcc/Developer-Options.html#index-fmem-report"),
+DOC_URL ("-fmem-report-wpa", "gcc/Developer-Options.html#index-fmem-report-wpa"),
+DOC_URL ("-fmerge-all-constants", "gcc/Optimize-Options.html#index-fmerge-all-constants"),
+DOC_URL ("-fmerge-constants", "gcc/Optimize-Options.html#index-fmerge-constants"),
+DOC_URL ("-fmessage-length", "gcc/Diagnostic-Message-Formatting-Options.html#index-fmessage-length"),
+DOC_URL ("-fmodule-header", "gcc/C_002b_002b-Dialect-Options.html#index-fmodule-header"),
+DOC_URL ("-fmodule-implicit-inline", "gcc/C_002b_002b-Dialect-Options.html#index-fmodule-implicit-inline"),
+DOC_URL ("-fmodule-mapper", "gcc/C_002b_002b-Dialect-Options.html#index-fmodule-mapper"),
+DOC_URL ("-fmodule-only", "gcc/C_002b_002b-Dialect-Options.html#index-fmodule-only"),
+DOC_URL ("-fmodulo-sched", "gcc/Optimize-Options.html#index-fmodulo-sched"),
+DOC_URL ("-fmodulo-sched-allow-regmoves", "gcc/Optimize-Options.html#index-fmodulo-sched-allow-regmoves"),
+DOC_URL ("-fmove-loop-invariants", "gcc/Optimize-Options.html#index-fmove-loop-invariants"),
+DOC_URL ("-fmove-loop-stores", "gcc/Optimize-Options.html#index-fmove-loop-stores"),
+DOC_URL ("-fmultiflags", "gcc/Developer-Options.html#index-fmultiflags"),
+DOC_URL ("-fnew-inheriting-ctors", "gcc/C_002b_002b-Dialect-Options.html#index-fnew-inheriting-ctors"),
+DOC_URL ("-fnew-ttp-matching", "gcc/C_002b_002b-Dialect-Options.html#index-fnew-ttp-matching"),
+DOC_URL ("-fnext-runtime", "gcc/Objective-C-and-Objective-C_002b_002b-Dialect-Options.html#index-fnext-runtime"),
+DOC_URL ("-fno-access-control", "gcc/C_002b_002b-Dialect-Options.html#index-fno-access-control"),
+DOC_URL ("-fno-allocation-dce", "gcc/Optimize-Options.html#index-fno-allocation-dce"),
+DOC_URL ("-fno-analyzer", "gcc/Static-Analyzer-Options.html#index-fno-analyzer"),
+DOC_URL ("-fno-analyzer-call-summaries", "gcc/Static-Analyzer-Options.html#index-fno-analyzer-call-summaries"),
+DOC_URL ("-fno-analyzer-debug-text-art", "gcc/Static-Analyzer-Options.html#index-fno-analyzer-debug-text-art"),
+DOC_URL ("-fno-analyzer-feasibility", "gcc/Static-Analyzer-Options.html#index-fno-analyzer-feasibility"),
+DOC_URL ("-fno-analyzer-fine-grained", "gcc/Static-Analyzer-Options.html#index-fno-analyzer-fine-grained"),
+DOC_URL ("-fno-analyzer-show-duplicate-count", "gcc/Static-Analyzer-Options.html#index-fno-analyzer-show-duplicate-count"),
+DOC_URL ("-fno-analyzer-show-events-in-system-headers", "gcc/Static-Analyzer-Options.html#index-fno-analyzer-show-events-in-system-headers"),
+DOC_URL ("-fno-analyzer-state-merge", "gcc/Static-Analyzer-Options.html#index-fno-analyzer-state-merge"),
+DOC_URL ("-fno-analyzer-state-purge", "gcc/Static-Analyzer-Options.html#index-fno-analyzer-state-purge"),
+DOC_URL ("-fno-analyzer-suppress-followups", "gcc/Static-Analyzer-Options.html#index-fno-analyzer-suppress-followups"),
+DOC_URL ("-fno-analyzer-transitivity", "gcc/Static-Analyzer-Options.html#index-fno-analyzer-transitivity"),
+DOC_URL ("-fno-analyzer-undo-inlining", "gcc/Static-Analyzer-Options.html#index-fno-analyzer-undo-inlining"),
+DOC_URL ("-fno-asm", "gcc/C-Dialect-Options.html#index-fno-asm"),
+DOC_URL ("-fno-bit-tests", "gcc/Code-Gen-Options.html#index-fno-bit-tests"),
+DOC_URL ("-fno-branch-count-reg", "gcc/Optimize-Options.html#index-fno-branch-count-reg"),
+DOC_URL ("-fno-canonical-system-headers", "gcc/Preprocessor-Options.html#index-fno-canonical-system-headers"),
+DOC_URL ("-fno-char8_t", "gcc/C_002b_002b-Dialect-Options.html#index-fno-char8_005ft"),
+DOC_URL ("-fno-checking", "gcc/Developer-Options.html#index-fno-checking"),
+DOC_URL ("-fno-compare-debug", "gcc/Developer-Options.html#index-fno-compare-debug"),
+DOC_URL ("-fno-debug-types-section", "gcc/Debugging-Options.html#index-fno-debug-types-section"),
+DOC_URL ("-fno-default-inline", "gcc/Inline.html#index-fno-default-inline"),
+DOC_URL ("-fno-defer-pop", "gcc/Optimize-Options.html#index-fno-defer-pop"),
+DOC_URL ("-fno-diagnostics-show-caret", "gcc/Diagnostic-Message-Formatting-Options.html#index-fno-diagnostics-show-caret"),
+DOC_URL ("-fno-diagnostics-show-cwe", "gcc/Diagnostic-Message-Formatting-Options.html#index-fno-diagnostics-show-cwe"),
+DOC_URL ("-fno-diagnostics-show-labels", "gcc/Diagnostic-Message-Formatting-Options.html#index-fno-diagnostics-show-labels"),
+DOC_URL ("-fno-diagnostics-show-line-numbers", "gcc/Diagnostic-Message-Formatting-Options.html#index-fno-diagnostics-show-line-numbers"),
+DOC_URL ("-fno-diagnostics-show-option", "gcc/Diagnostic-Message-Formatting-Options.html#index-fno-diagnostics-show-option"),
+DOC_URL ("-fno-diagnostics-show-rules", "gcc/Diagnostic-Message-Formatting-Options.html#index-fno-diagnostics-show-rules"),
+DOC_URL ("-fno-dwarf2-cfi-asm", "gcc/Debugging-Options.html#index-fno-dwarf2-cfi-asm"),
+DOC_URL ("-fno-elide-constructors", "gcc/C_002b_002b-Dialect-Options.html#index-fno-elide-constructors"),
+DOC_URL ("-fno-elide-type", "gcc/Diagnostic-Message-Formatting-Options.html#index-fno-elide-type"),
+DOC_URL ("-fno-eliminate-unused-debug-symbols", "gcc/Debugging-Options.html#index-fno-eliminate-unused-debug-symbols"),
+DOC_URL ("-fno-eliminate-unused-debug-types", "gcc/Debugging-Options.html#index-fno-eliminate-unused-debug-types"),
+DOC_URL ("-fno-enforce-eh-specs", "gcc/C_002b_002b-Dialect-Options.html#index-fno-enforce-eh-specs"),
+DOC_URL ("-fno-ext-numeric-literals", "gcc/C_002b_002b-Dialect-Options.html#index-fno-ext-numeric-literals"),
+DOC_URL ("-fno-extern-tls-init", "gcc/C_002b_002b-Dialect-Options.html#index-fno-extern-tls-init"),
+DOC_URL ("-fno-finite-loops", "gcc/Optimize-Options.html#index-fno-finite-loops"),
+DOC_URL ("-fno-fold-simple-inlines", "gcc/C_002b_002b-Dialect-Options.html#index-fno-fold-simple-inlines"),
+DOC_URL ("-fno-fp-int-builtin-inexact", "gcc/Optimize-Options.html#index-fno-fp-int-builtin-inexact"),
+DOC_URL ("-fno-function-cse", "gcc/Optimize-Options.html#index-fno-function-cse"),
+DOC_URL ("-fno-gnu-keywords", "gcc/C_002b_002b-Dialect-Options.html#index-fno-gnu-keywords"),
+DOC_URL ("-fno-gnu-unique", "gcc/Code-Gen-Options.html#index-fno-gnu-unique"),
+DOC_URL ("-fno-guess-branch-probability", "gcc/Optimize-Options.html#index-fno-guess-branch-probability"),
+DOC_URL ("-fno-hardcfr-check-exceptions", "gcc/Instrumentation-Options.html#index-fno-hardcfr-check-exceptions"),
+DOC_URL ("-fno-hardcfr-check-returning-calls", "gcc/Instrumentation-Options.html#index-fno-hardcfr-check-returning-calls"),
+DOC_URL ("-fno-ident", "gcc/Code-Gen-Options.html#index-fno-ident"),
+DOC_URL ("-fno-implicit-inline-templates", "gcc/C_002b_002b-Dialect-Options.html#index-fno-implicit-inline-templates"),
+DOC_URL ("-fno-inline", "gcc/Optimize-Options.html#index-fno-inline"),
+DOC_URL ("-fno-ira-share-save-slots", "gcc/Optimize-Options.html#index-fno-ira-share-save-slots"),
+DOC_URL ("-fno-ira-share-spill-slots", "gcc/Optimize-Options.html#index-fno-ira-share-spill-slots"),
+DOC_URL ("-fno-jump-tables", "gcc/Code-Gen-Options.html#index-fno-jump-tables"),
+DOC_URL ("-fno-keep-inline-dllexport", "gcc/Optimize-Options.html#index-fno-keep-inline-dllexport"),
+DOC_URL ("-fno-lifetime-dse", "gcc/Optimize-Options.html#index-fno-lifetime-dse"),
+DOC_URL ("-fno-local-ivars", "gcc/Objective-C-and-Objective-C_002b_002b-Dialect-Options.html#index-fno-local-ivars"),
+DOC_URL ("-fno-math-errno", "gcc/Optimize-Options.html#index-fno-math-errno"),
+DOC_URL ("-fno-merge-debug-strings", "gcc/Debugging-Options.html#index-fno-merge-debug-strings"),
+DOC_URL ("-fno-module-lazy", "gcc/C_002b_002b-Dialect-Options.html#index-fno-module-lazy"),
+DOC_URL ("-fno-modules-ts", "gcc/C_002b_002b-Dialect-Options.html#index-fno-modules-ts"),
+DOC_URL ("-fno-nil-receivers", "gcc/Objective-C-and-Objective-C_002b_002b-Dialect-Options.html#index-fno-nil-receivers"),
+DOC_URL ("-fno-nonansi-builtins", "gcc/C_002b_002b-Dialect-Options.html#index-fno-nonansi-builtins"),
+DOC_URL ("-fno-operator-names", "gcc/C_002b_002b-Dialect-Options.html#index-fno-operator-names"),
+DOC_URL ("-fno-optional-diags", "gcc/C_002b_002b-Dialect-Options.html#index-fno-optional-diags"),
+DOC_URL ("-fno-peephole", "gcc/Optimize-Options.html#index-fno-peephole"),
+DOC_URL ("-fno-peephole2", "gcc/Optimize-Options.html#index-fno-peephole2"),
+DOC_URL ("-fno-plt", "gcc/Code-Gen-Options.html#index-fno-plt"),
+DOC_URL ("-fno-pretty-templates", "gcc/C_002b_002b-Dialect-Options.html#index-fno-pretty-templates"),
+DOC_URL ("-fno-printf-return-value", "gcc/Optimize-Options.html#index-fno-printf-return-value"),
+DOC_URL ("-fno-rtti", "gcc/C_002b_002b-Dialect-Options.html#index-fno-rtti"),
+DOC_URL ("-fno-sanitize-recover", "gcc/Instrumentation-Options.html#index-fno-sanitize-recover"),
+DOC_URL ("-fno-sanitize-trap", "gcc/Instrumentation-Options.html#index-fno-sanitize-trap"),
+DOC_URL ("-fno-sanitize=all", "gcc/Instrumentation-Options.html#index-fno-sanitize_003dall"),
+DOC_URL ("-fno-sched-interblock", "gcc/Optimize-Options.html#index-fno-sched-interblock"),
+DOC_URL ("-fno-sched-spec", "gcc/Optimize-Options.html#index-fno-sched-spec"),
+DOC_URL ("-fno-set-stack-executable", "gcc/x86-Windows-Options.html#index-fno-set-stack-executable"),
+DOC_URL ("-fno-show-column", "gcc/Diagnostic-Message-Formatting-Options.html#index-fno-show-column"),
+DOC_URL ("-fno-signed-bitfields", "gcc/C-Dialect-Options.html#index-fno-signed-bitfields"),
+DOC_URL ("-fno-signed-zeros", "gcc/Optimize-Options.html#index-fno-signed-zeros"),
+DOC_URL ("-fno-stack-limit", "gcc/Instrumentation-Options.html#index-fno-stack-limit"),
+DOC_URL ("-fno-strict-flex-arrays", "gcc/C-Dialect-Options.html#index-fno-strict-flex-arrays"),
+DOC_URL ("-fno-threadsafe-statics", "gcc/C_002b_002b-Dialect-Options.html#index-fno-threadsafe-statics"),
+DOC_URL ("-fno-toplevel-reorder", "gcc/Optimize-Options.html#index-fno-toplevel-reorder"),
+DOC_URL ("-fno-trapping-math", "gcc/Optimize-Options.html#index-fno-trapping-math"),
+DOC_URL ("-fno-unsigned-bitfields", "gcc/C-Dialect-Options.html#index-fno-unsigned-bitfields"),
+DOC_URL ("-fno-use-cxa-get-exception-ptr", "gcc/C_002b_002b-Dialect-Options.html#index-fno-use-cxa-get-exception-ptr"),
+DOC_URL ("-fno-var-tracking-assignments", "gcc/Debugging-Options.html#index-fno-var-tracking-assignments"),
+DOC_URL ("-fno-var-tracking-assignments-toggle", "gcc/Developer-Options.html#index-fno-var-tracking-assignments-toggle"),
+DOC_URL ("-fno-weak", "gcc/C_002b_002b-Dialect-Options.html#index-fno-weak"),
+DOC_URL ("-fno-working-directory", "gcc/Preprocessor-Options.html#index-fno-working-directory"),
+DOC_URL ("-fno-writable-relocated-rdata", "gcc/x86-Windows-Options.html#index-fno-writable-relocated-rdata"),
+DOC_URL ("-fno-zero-initialized-in-bss", "gcc/Optimize-Options.html#index-fno-zero-initialized-in-bss"),
+DOC_URL ("-fnon-call-exceptions", "gcc/Code-Gen-Options.html#index-fnon-call-exceptions"),
+DOC_URL ("-fnothrow-opt", "gcc/C_002b_002b-Dialect-Options.html#index-fnothrow-opt"),
+DOC_URL ("-fobjc-abi-version", "gcc/Objective-C-and-Objective-C_002b_002b-Dialect-Options.html#index-fobjc-abi-version"),
+DOC_URL ("-fobjc-call-cxx-cdtors", "gcc/Objective-C-and-Objective-C_002b_002b-Dialect-Options.html#index-fobjc-call-cxx-cdtors"),
+DOC_URL ("-fobjc-direct-dispatch", "gcc/Objective-C-and-Objective-C_002b_002b-Dialect-Options.html#index-fobjc-direct-dispatch"),
+DOC_URL ("-fobjc-exceptions", "gcc/Objective-C-and-Objective-C_002b_002b-Dialect-Options.html#index-fobjc-exceptions"),
+DOC_URL ("-fobjc-gc", "gcc/Objective-C-and-Objective-C_002b_002b-Dialect-Options.html#index-fobjc-gc"),
+DOC_URL ("-fobjc-nilcheck", "gcc/Objective-C-and-Objective-C_002b_002b-Dialect-Options.html#index-fobjc-nilcheck"),
+DOC_URL ("-fobjc-std", "gcc/Objective-C-and-Objective-C_002b_002b-Dialect-Options.html#index-fobjc-std"),
+DOC_URL ("-foffload", "gcc/C-Dialect-Options.html#index-foffload"),
+DOC_URL ("-foffload-options", "gcc/C-Dialect-Options.html#index-foffload-options"),
+DOC_URL ("-fomit-frame-pointer", "gcc/Optimize-Options.html#index-fomit-frame-pointer"),
+DOC_URL ("-fopenacc", "gcc/C-Dialect-Options.html#index-fopenacc"),
+DOC_URL ("-fopenacc-dim", "gcc/C-Dialect-Options.html#index-fopenacc-dim"),
+DOC_URL ("-fopenmp", "gcc/C-Dialect-Options.html#index-fopenmp"),
+DOC_URL ("-fopenmp-simd", "gcc/C-Dialect-Options.html#index-fopenmp-simd"),
+DOC_URL ("-fopenmp-target-simd-clone", "gcc/C-Dialect-Options.html#index-fopenmp-target-simd-clone"),
+DOC_URL ("-fopt-info", "gcc/Developer-Options.html#index-fopt-info"),
+DOC_URL ("-foptimize-sibling-calls", "gcc/Optimize-Options.html#index-foptimize-sibling-calls"),
+DOC_URL ("-foptimize-strlen", "gcc/Optimize-Options.html#index-foptimize-strlen"),
+DOC_URL ("-force_cpusubtype_ALL", "gcc/Darwin-Options.html#index-force_005fcpusubtype_005fALL"),
+DOC_URL ("-force_flat_namespace", "gcc/Darwin-Options.html#index-force_005fflat_005fnamespace"),
 DOC_URL ("-fpack-struct", "gcc/Code-Gen-Options.html#index-fpack-struct"),
+DOC_URL ("-fpartial-inlining", "gcc/Optimize-Options.html#index-fpartial-inlining"),
+DOC_URL ("-fpatchable-function-entry", "gcc/Instrumentation-Options.html#index-fpatchable-function-entry"),
+DOC_URL ("-fpch-deps", "gcc/Preprocessor-Options.html#index-fpch-deps"),
+DOC_URL ("-fpch-preprocess", "gcc/Preprocessor-Options.html#index-fpch-preprocess"),
+DOC_URL ("-fpeel-loops", "gcc/Optimize-Options.html#index-fpeel-loops"),
+DOC_URL ("-fpermissive", "gcc/Warning-Options.html#index-fpermissive"),
+DOC_URL ("-fpermitted-flt-eval-methods", "gcc/C-Dialect-Options.html#index-fpermitted-flt-eval-methods"),
+DOC_URL ("-fpermitted-flt-eval-methods=c11", "gcc/C-Dialect-Options.html#index-fpermitted-flt-eval-methods_003dc11"),
+DOC_URL ("-fpermitted-flt-eval-methods=ts-18661-3", "gcc/C-Dialect-Options.html#index-fpermitted-flt-eval-methods_003dts-18661-3"),
+DOC_URL ("-fpic", "gcc/Code-Gen-Options.html#index-fpic"),
+DOC_URL ("-fpie", "gcc/Code-Gen-Options.html#index-fpie"),
+DOC_URL ("-fplugin", "gcc/Overall-Options.html#index-fplugin"),
+DOC_URL ("-fplugin-arg", "gcc/Overall-Options.html#index-fplugin-arg"),
+DOC_URL ("-fpost-ipa-mem-report", "gcc/Developer-Options.html#index-fpost-ipa-mem-report"),
+DOC_URL ("-fpre-ipa-mem-report", "gcc/Developer-Options.html#index-fpre-ipa-mem-report"),
+DOC_URL ("-fpredictive-commoning", "gcc/Optimize-Options.html#index-fpredictive-commoning"),
+DOC_URL ("-fprefetch-loop-arrays", "gcc/Optimize-Options.html#index-fprefetch-loop-arrays"),
+DOC_URL ("-fpreprocessed", "gcc/Preprocessor-Options.html#index-fpreprocessed"),
+DOC_URL ("-fprofile-abs-path", "gcc/Instrumentation-Options.html#index-fprofile-abs-path"),
+DOC_URL ("-fprofile-correction", "gcc/Optimize-Options.html#index-fprofile-correction"),
+DOC_URL ("-fprofile-dir", "gcc/Instrumentation-Options.html#index-fprofile-dir"),
+DOC_URL ("-fprofile-exclude-files", "gcc/Instrumentation-Options.html#index-fprofile-exclude-files"),
+DOC_URL ("-fprofile-filter-files", "gcc/Instrumentation-Options.html#index-fprofile-filter-files"),
+DOC_URL ("-fprofile-generate", "gcc/Instrumentation-Options.html#index-fprofile-generate"),
+DOC_URL ("-fprofile-info-section", "gcc/Instrumentation-Options.html#index-fprofile-info-section"),
+DOC_URL ("-fprofile-note", "gcc/Instrumentation-Options.html#index-fprofile-note"),
+DOC_URL ("-fprofile-partial-training", "gcc/Optimize-Options.html#index-fprofile-partial-training"),
+DOC_URL ("-fprofile-prefix-map", "gcc/Instrumentation-Options.html#index-fprofile-prefix-map"),
+DOC_URL ("-fprofile-prefix-path", "gcc/Instrumentation-Options.html#index-fprofile-prefix-path"),
+DOC_URL ("-fprofile-reorder-functions", "gcc/Optimize-Options.html#index-fprofile-reorder-functions"),
+DOC_URL ("-fprofile-report", "gcc/Developer-Options.html#index-fprofile-report"),
+DOC_URL ("-fprofile-reproducible", "gcc/Instrumentation-Options.html#index-fprofile-reproducible"),
+DOC_URL ("-fprofile-update", "gcc/Instrumentation-Options.html#index-fprofile-update"),
+DOC_URL ("-fprofile-use", "gcc/Optimize-Options.html#index-fprofile-use"),
+DOC_URL ("-fprofile-values", "gcc/Optimize-Options.html#index-fprofile-values"),
+DOC_URL ("-fpu", "gcc/RX-Options.html#index-fpu"),
+DOC_URL ("-frandom-seed", "gcc/Developer-Options.html#index-frandom-seed"),
+DOC_URL ("-freciprocal-math", "gcc/Optimize-Options.html#index-freciprocal-math"),
+DOC_URL ("-frecord-gcc-switches", "gcc/Code-Gen-Options.html#index-frecord-gcc-switches"),
+DOC_URL ("-free", "gcc/Optimize-Options.html#index-free-1"),
+DOC_URL ("-freg-struct-return", "gcc/Code-Gen-Options.html#index-freg-struct-return"),
+DOC_URL ("-frename-registers", "gcc/Optimize-Options.html#index-frename-registers"),
+DOC_URL ("-freorder-blocks", "gcc/Optimize-Options.html#index-freorder-blocks"),
+DOC_URL ("-freorder-blocks-algorithm", "gcc/Optimize-Options.html#index-freorder-blocks-algorithm"),
+DOC_URL ("-freorder-blocks-and-partition", "gcc/Optimize-Options.html#index-freorder-blocks-and-partition"),
+DOC_URL ("-freorder-functions", "gcc/Optimize-Options.html#index-freorder-functions"),
+DOC_URL ("-freplace-objc-classes", "gcc/Objective-C-and-Objective-C_002b_002b-Dialect-Options.html#index-freplace-objc-classes"),
+DOC_URL ("-freport-bug", "gcc/Developer-Options.html#index-freport-bug"),
+DOC_URL ("-frerun-cse-after-loop", "gcc/Optimize-Options.html#index-frerun-cse-after-loop"),
+DOC_URL ("-freschedule-modulo-scheduled-loops", "gcc/Optimize-Options.html#index-freschedule-modulo-scheduled-loops"),
+DOC_URL ("-frounding-math", "gcc/Optimize-Options.html#index-frounding-math"),
+DOC_URL ("-fsanitize-address-use-after-scope", "gcc/Instrumentation-Options.html#index-fsanitize-address-use-after-scope"),
+DOC_URL ("-fsanitize-coverage=trace-cmp", "gcc/Instrumentation-Options.html#index-fsanitize-coverage_003dtrace-cmp"),
+DOC_URL ("-fsanitize-coverage=trace-pc", "gcc/Instrumentation-Options.html#index-fsanitize-coverage_003dtrace-pc"),
+DOC_URL ("-fsanitize-sections", "gcc/Instrumentation-Options.html#index-fsanitize-sections"),
+DOC_URL ("-fsanitize-undefined-trap-on-error", "gcc/Instrumentation-Options.html#index-fsanitize-undefined-trap-on-error"),
+DOC_URL ("-fsanitize=address", "gcc/Instrumentation-Options.html#index-fsanitize_003daddress"),
+DOC_URL ("-fsanitize=alignment", "gcc/Instrumentation-Options.html#index-fsanitize_003dalignment"),
+DOC_URL ("-fsanitize=all", "gcc/Instrumentation-Options.html#index-fno-sanitize_003dall"),
+DOC_URL ("-fsanitize=bool", "gcc/Instrumentation-Options.html#index-fsanitize_003dbool"),
+DOC_URL ("-fsanitize=bounds", "gcc/Instrumentation-Options.html#index-fsanitize_003dbounds"),
+DOC_URL ("-fsanitize=bounds-strict", "gcc/Instrumentation-Options.html#index-fsanitize_003dbounds-strict"),
+DOC_URL ("-fsanitize=builtin", "gcc/Instrumentation-Options.html#index-fsanitize_003dbuiltin"),
+DOC_URL ("-fsanitize=enum", "gcc/Instrumentation-Options.html#index-fsanitize_003denum"),
+DOC_URL ("-fsanitize=float-cast-overflow", "gcc/Instrumentation-Options.html#index-fsanitize_003dfloat-cast-overflow"),
+DOC_URL ("-fsanitize=float-divide-by-zero", "gcc/Instrumentation-Options.html#index-fsanitize_003dfloat-divide-by-zero"),
+DOC_URL ("-fsanitize=hwaddress", "gcc/Instrumentation-Options.html#index-fsanitize_003dhwaddress"),
+DOC_URL ("-fsanitize=integer-divide-by-zero", "gcc/Instrumentation-Options.html#index-fsanitize_003dinteger-divide-by-zero"),
+DOC_URL ("-fsanitize=kernel-address", "gcc/Instrumentation-Options.html#index-fsanitize_003dkernel-address"),
+DOC_URL ("-fsanitize=kernel-hwaddress", "gcc/Instrumentation-Options.html#index-fsanitize_003dkernel-hwaddress"),
+DOC_URL ("-fsanitize=leak", "gcc/Instrumentation-Options.html#index-fsanitize_003dleak"),
+DOC_URL ("-fsanitize=nonnull-attribute", "gcc/Instrumentation-Options.html#index-fsanitize_003dnonnull-attribute"),
+DOC_URL ("-fsanitize=null", "gcc/Instrumentation-Options.html#index-fsanitize_003dnull"),
+DOC_URL ("-fsanitize=object-size", "gcc/Instrumentation-Options.html#index-fsanitize_003dobject-size"),
+DOC_URL ("-fsanitize=pointer-compare", "gcc/Instrumentation-Options.html#index-fsanitize_003dpointer-compare"),
+DOC_URL ("-fsanitize=pointer-overflow", "gcc/Instrumentation-Options.html#index-fsanitize_003dpointer-overflow"),
+DOC_URL ("-fsanitize=pointer-subtract", "gcc/Instrumentation-Options.html#index-fsanitize_003dpointer-subtract"),
+DOC_URL ("-fsanitize=return", "gcc/Instrumentation-Options.html#index-fsanitize_003dreturn"),
+DOC_URL ("-fsanitize=returns-nonnull-attribute", "gcc/Instrumentation-Options.html#index-fsanitize_003dreturns-nonnull-attribute"),
+DOC_URL ("-fsanitize=shadow-call-stack", "gcc/Instrumentation-Options.html#index-fsanitize_003dshadow-call-stack"),
+DOC_URL ("-fsanitize=shift", "gcc/Instrumentation-Options.html#index-fsanitize_003dshift"),
+DOC_URL ("-fsanitize=shift-base", "gcc/Instrumentation-Options.html#index-fsanitize_003dshift-base"),
+DOC_URL ("-fsanitize=shift-exponent", "gcc/Instrumentation-Options.html#index-fsanitize_003dshift-exponent"),
+DOC_URL ("-fsanitize=signed-integer-overflow", "gcc/Instrumentation-Options.html#index-fsanitize_003dsigned-integer-overflow"),
+DOC_URL ("-fsanitize=thread", "gcc/Instrumentation-Options.html#index-fsanitize_003dthread"),
+DOC_URL ("-fsanitize=undefined", "gcc/Instrumentation-Options.html#index-fsanitize_003dundefined"),
+DOC_URL ("-fsanitize=unreachable", "gcc/Instrumentation-Options.html#index-fsanitize_003dunreachable"),
+DOC_URL ("-fsanitize=vla-bound", "gcc/Instrumentation-Options.html#index-fsanitize_003dvla-bound"),
+DOC_URL ("-fsanitize=vptr", "gcc/Instrumentation-Options.html#index-fsanitize_003dvptr"),
+DOC_URL ("-fsave-optimization-record", "gcc/Developer-Options.html#index-fsave-optimization-record"),
+DOC_URL ("-fsched-critical-path-heuristic", "gcc/Optimize-Options.html#index-fsched-critical-path-heuristic"),
+DOC_URL ("-fsched-dep-count-heuristic", "gcc/Optimize-Options.html#index-fsched-dep-count-heuristic"),
+DOC_URL ("-fsched-group-heuristic", "gcc/Optimize-Options.html#index-fsched-group-heuristic"),
+DOC_URL ("-fsched-last-insn-heuristic", "gcc/Optimize-Options.html#index-fsched-last-insn-heuristic"),
+DOC_URL ("-fsched-pressure", "gcc/Optimize-Options.html#index-fsched-pressure"),
+DOC_URL ("-fsched-rank-heuristic", "gcc/Optimize-Options.html#index-fsched-rank-heuristic"),
+DOC_URL ("-fsched-spec-insn-heuristic", "gcc/Optimize-Options.html#index-fsched-spec-insn-heuristic"),
+DOC_URL ("-fsched-spec-load", "gcc/Optimize-Options.html#index-fsched-spec-load"),
+DOC_URL ("-fsched-spec-load-dangerous", "gcc/Optimize-Options.html#index-fsched-spec-load-dangerous"),
+DOC_URL ("-fsched-stalled-insns", "gcc/Optimize-Options.html#index-fsched-stalled-insns"),
+DOC_URL ("-fsched-stalled-insns-dep", "gcc/Optimize-Options.html#index-fsched-stalled-insns-dep"),
+DOC_URL ("-fsched-verbose", "gcc/Developer-Options.html#index-fsched-verbose"),
+DOC_URL ("-fsched2-use-superblocks", "gcc/Optimize-Options.html#index-fsched2-use-superblocks"),
+DOC_URL ("-fschedule-fusion", "gcc/Optimize-Options.html#index-fschedule-fusion"),
+DOC_URL ("-fschedule-insns", "gcc/Optimize-Options.html#index-fschedule-insns"),
+DOC_URL ("-fschedule-insns2", "gcc/Optimize-Options.html#index-fschedule-insns2"),
+DOC_URL ("-fsection-anchors", "gcc/Optimize-Options.html#index-fsection-anchors"),
+DOC_URL ("-fsel-sched-pipelining", "gcc/Optimize-Options.html#index-fsel-sched-pipelining"),
+DOC_URL ("-fsel-sched-pipelining-outer-loops", "gcc/Optimize-Options.html#index-fsel-sched-pipelining-outer-loops"),
+DOC_URL ("-fselective-scheduling", "gcc/Optimize-Options.html#index-fselective-scheduling"),
+DOC_URL ("-fselective-scheduling2", "gcc/Optimize-Options.html#index-fselective-scheduling2"),
+DOC_URL ("-fsemantic-interposition", "gcc/Optimize-Options.html#index-fsemantic-interposition"),
+DOC_URL ("-fshort-wchar", "gcc/Code-Gen-Options.html#index-fshort-wchar"),
+DOC_URL ("-fshrink-wrap", "gcc/Optimize-Options.html#index-fshrink-wrap"),
+DOC_URL ("-fshrink-wrap-separate", "gcc/Optimize-Options.html#index-fshrink-wrap-separate"),
+DOC_URL ("-fsignaling-nans", "gcc/Optimize-Options.html#index-fsignaling-nans"),
+DOC_URL ("-fsimd-cost-model", "gcc/Optimize-Options.html#index-fsimd-cost-model"),
+DOC_URL ("-fsingle-precision-constant", "gcc/Optimize-Options.html#index-fsingle-precision-constant"),
+DOC_URL ("-fsized-deallocation", "gcc/C_002b_002b-Dialect-Options.html#index-fsized-deallocation"),
+DOC_URL ("-fsplit-ivs-in-unroller", "gcc/Optimize-Options.html#index-fsplit-ivs-in-unroller"),
+DOC_URL ("-fsplit-loops", "gcc/Optimize-Options.html#index-fsplit-loops"),
+DOC_URL ("-fsplit-paths", "gcc/Optimize-Options.html#index-fsplit-paths"),
+DOC_URL ("-fsplit-wide-types", "gcc/Optimize-Options.html#index-fsplit-wide-types"),
+DOC_URL ("-fsplit-wide-types-early", "gcc/Optimize-Options.html#index-fsplit-wide-types-early"),
+DOC_URL ("-fssa-backprop", "gcc/Optimize-Options.html#index-fssa-backprop"),
+DOC_URL ("-fssa-phiopt", "gcc/Optimize-Options.html#index-fssa-phiopt"),
+DOC_URL ("-fsso-struct", "gcc/C-Dialect-Options.html#index-fsso-struct"),
+DOC_URL ("-fstack-check", "gcc/Instrumentation-Options.html#index-fstack-check"),
+DOC_URL ("-fstack-clash-protection", "gcc/Instrumentation-Options.html#index-fstack-clash-protection"),
+DOC_URL ("-fstack-limit", "gcc/Instrumentation-Options.html#index-fno-stack-limit"),
+DOC_URL ("-fstack-limit-register", "gcc/Instrumentation-Options.html#index-fstack-limit-register"),
+DOC_URL ("-fstack-limit-symbol", "gcc/Instrumentation-Options.html#index-fstack-limit-symbol"),
+DOC_URL ("-fstack-protector", "gcc/Instrumentation-Options.html#index-fstack-protector"),
+DOC_URL ("-fstack-protector-all", "gcc/Instrumentation-Options.html#index-fstack-protector-all"),
+DOC_URL ("-fstack-protector-explicit", "gcc/Instrumentation-Options.html#index-fstack-protector-explicit"),
+DOC_URL ("-fstack-protector-strong", "gcc/Instrumentation-Options.html#index-fstack-protector-strong"),
+DOC_URL ("-fstack-usage", "gcc/Developer-Options.html#index-fstack-usage"),
+DOC_URL ("-fstack_reuse", "gcc/Code-Gen-Options.html#index-fstack_005freuse"),
+DOC_URL ("-fstats", "gcc/Developer-Options.html#index-fstats"),
+DOC_URL ("-fstdarg-opt", "gcc/Optimize-Options.html#index-fstdarg-opt"),
+DOC_URL ("-fstore-merging", "gcc/Optimize-Options.html#index-fstore-merging"),
+DOC_URL ("-fstrict-aliasing", "gcc/Optimize-Options.html#index-fstrict-aliasing"),
+DOC_URL ("-fstrict-enums", "gcc/C_002b_002b-Dialect-Options.html#index-fstrict-enums"),
+DOC_URL ("-fstrict-flex-arrays=<var>level</var>", "gcc/C-Dialect-Options.html#index-fstrict-flex-arrays_003dlevel"),
+DOC_URL ("-fstrict-overflow", "gcc/Code-Gen-Options.html#index-fstrict-overflow"),
+DOC_URL ("-fstrict-volatile-bitfields", "gcc/Code-Gen-Options.html#index-fstrict-volatile-bitfields"),
+DOC_URL ("-fstrong-eval-order", "gcc/C_002b_002b-Dialect-Options.html#index-fstrong-eval-order"),
+DOC_URL ("-fsync-libcalls", "gcc/Code-Gen-Options.html#index-fsync-libcalls"),
+DOC_URL ("-fsyntax-only", "gcc/Warning-Options.html#index-fsyntax-only"),
+DOC_URL ("-ftabstop", "gcc/Preprocessor-Options.html#index-ftabstop"),
+DOC_URL ("-ftemplate-backtrace-limit", "gcc/C_002b_002b-Dialect-Options.html#index-ftemplate-backtrace-limit"),
+DOC_URL ("-ftemplate-depth", "gcc/C_002b_002b-Dialect-Options.html#index-ftemplate-depth"),
+DOC_URL ("-ftest-coverage", "gcc/Instrumentation-Options.html#index-ftest-coverage"),
+DOC_URL ("-fthread-jumps", "gcc/Optimize-Options.html#index-fthread-jumps"),
+DOC_URL ("-ftime-report", "gcc/Developer-Options.html#index-ftime-report"),
+DOC_URL ("-ftime-report-details", "gcc/Developer-Options.html#index-ftime-report-details"),
+DOC_URL ("-ftls-model", "gcc/Code-Gen-Options.html#index-ftls-model"),
+DOC_URL ("-ftracer", "gcc/Optimize-Options.html#index-ftracer"),
+DOC_URL ("-ftrack-macro-expansion", "gcc/Preprocessor-Options.html#index-ftrack-macro-expansion"),
+DOC_URL ("-ftrampoline-impl", "gcc/Code-Gen-Options.html#index-ftrampoline-impl"),
+DOC_URL ("-ftrampolines", "gcc/Code-Gen-Options.html#index-ftrampolines"),
+DOC_URL ("-ftrapv", "gcc/Code-Gen-Options.html#index-ftrapv"),
+DOC_URL ("-ftree-bit-ccp", "gcc/Optimize-Options.html#index-ftree-bit-ccp"),
+DOC_URL ("-ftree-builtin-call-dce", "gcc/Optimize-Options.html#index-ftree-builtin-call-dce"),
+DOC_URL ("-ftree-ccp", "gcc/Optimize-Options.html#index-ftree-ccp"),
+DOC_URL ("-ftree-ch", "gcc/Optimize-Options.html#index-ftree-ch"),
+DOC_URL ("-ftree-coalesce-vars", "gcc/Optimize-Options.html#index-ftree-coalesce-vars"),
+DOC_URL ("-ftree-copy-prop", "gcc/Optimize-Options.html#index-ftree-copy-prop"),
+DOC_URL ("-ftree-dce", "gcc/Optimize-Options.html#index-ftree-dce"),
+DOC_URL ("-ftree-dominator-opts", "gcc/Optimize-Options.html#index-ftree-dominator-opts"),
+DOC_URL ("-ftree-dse", "gcc/Optimize-Options.html#index-ftree-dse"),
+DOC_URL ("-ftree-forwprop", "gcc/Optimize-Options.html#index-ftree-forwprop"),
+DOC_URL ("-ftree-fre", "gcc/Optimize-Options.html#index-ftree-fre"),
+DOC_URL ("-ftree-loop-distribute-patterns", "gcc/Optimize-Options.html#index-ftree-loop-distribute-patterns"),
+DOC_URL ("-ftree-loop-distribution", "gcc/Optimize-Options.html#index-ftree-loop-distribution"),
+DOC_URL ("-ftree-loop-if-convert", "gcc/Optimize-Options.html#index-ftree-loop-if-convert"),
+DOC_URL ("-ftree-loop-im", "gcc/Optimize-Options.html#index-ftree-loop-im"),
+DOC_URL ("-ftree-loop-ivcanon", "gcc/Optimize-Options.html#index-ftree-loop-ivcanon"),
+DOC_URL ("-ftree-loop-linear", "gcc/Optimize-Options.html#index-ftree-loop-linear"),
+DOC_URL ("-ftree-loop-optimize", "gcc/Optimize-Options.html#index-ftree-loop-optimize"),
+DOC_URL ("-ftree-loop-vectorize", "gcc/Optimize-Options.html#index-ftree-loop-vectorize"),
+DOC_URL ("-ftree-parallelize-loops", "gcc/Optimize-Options.html#index-ftree-parallelize-loops"),
+DOC_URL ("-ftree-partial-pre", "gcc/Optimize-Options.html#index-ftree-partial-pre"),
+DOC_URL ("-ftree-phiprop", "gcc/Optimize-Options.html#index-ftree-phiprop"),
+DOC_URL ("-ftree-pre", "gcc/Optimize-Options.html#index-ftree-pre"),
+DOC_URL ("-ftree-pta", "gcc/Optimize-Options.html#index-ftree-pta"),
+DOC_URL ("-ftree-reassoc", "gcc/Optimize-Options.html#index-ftree-reassoc"),
+DOC_URL ("-ftree-scev-cprop", "gcc/Optimize-Options.html#index-ftree-scev-cprop"),
+DOC_URL ("-ftree-sink", "gcc/Optimize-Options.html#index-ftree-sink"),
+DOC_URL ("-ftree-slp-vectorize", "gcc/Optimize-Options.html#index-ftree-slp-vectorize"),
+DOC_URL ("-ftree-slsr", "gcc/Optimize-Options.html#index-ftree-slsr"),
+DOC_URL ("-ftree-sra", "gcc/Optimize-Options.html#index-ftree-sra"),
+DOC_URL ("-ftree-switch-conversion", "gcc/Optimize-Options.html#index-ftree-switch-conversion"),
+DOC_URL ("-ftree-tail-merge", "gcc/Optimize-Options.html#index-ftree-tail-merge"),
+DOC_URL ("-ftree-ter", "gcc/Optimize-Options.html#index-ftree-ter"),
+DOC_URL ("-ftree-vectorize", "gcc/Optimize-Options.html#index-ftree-vectorize"),
+DOC_URL ("-ftree-vrp", "gcc/Optimize-Options.html#index-ftree-vrp"),
+DOC_URL ("-ftrivial-auto-var-init", "gcc/Optimize-Options.html#index-ftrivial-auto-var-init"),
+DOC_URL ("-funconstrained-commons", "gcc/Optimize-Options.html#index-funconstrained-commons"),
+DOC_URL ("-funit-at-a-time", "gcc/Optimize-Options.html#index-funit-at-a-time"),
+DOC_URL ("-funreachable-traps", "gcc/Optimize-Options.html#index-funreachable-traps"),
+DOC_URL ("-funroll-all-loops", "gcc/Optimize-Options.html#index-funroll-all-loops"),
+DOC_URL ("-funroll-loops", "gcc/Optimize-Options.html#index-funroll-loops"),
+DOC_URL ("-funsafe-math-optimizations", "gcc/Optimize-Options.html#index-funsafe-math-optimizations"),
+DOC_URL ("-funswitch-loops", "gcc/Optimize-Options.html#index-funswitch-loops"),
+DOC_URL ("-funwind-tables", "gcc/Code-Gen-Options.html#index-funwind-tables"),
+DOC_URL ("-fuse-cxa-atexit", "gcc/C_002b_002b-Dialect-Options.html#index-fuse-cxa-atexit"),
+DOC_URL ("-fuse-ld=bfd", "gcc/Link-Options.html#index-fuse-ld_003dbfd"),
+DOC_URL ("-fuse-ld=gold", "gcc/Link-Options.html#index-fuse-ld_003dgold"),
+DOC_URL ("-fuse-ld=lld", "gcc/Link-Options.html#index-fuse-ld_003dlld"),
+DOC_URL ("-fuse-ld=mold", "gcc/Link-Options.html#index-fuse-ld_003dmold"),
+DOC_URL ("-fuse-linker-plugin", "gcc/Optimize-Options.html#index-fuse-linker-plugin"),
+DOC_URL ("-fvar-tracking", "gcc/Debugging-Options.html#index-fvar-tracking"),
+DOC_URL ("-fvariable-expansion-in-unroller", "gcc/Optimize-Options.html#index-fvariable-expansion-in-unroller"),
+DOC_URL ("-fvect-cost-model", "gcc/Optimize-Options.html#index-fvect-cost-model"),
+DOC_URL ("-fverbose-asm", "gcc/Code-Gen-Options.html#index-fverbose-asm"),
+DOC_URL ("-fversion-loops-for-strides", "gcc/Optimize-Options.html#index-fversion-loops-for-strides"),
+DOC_URL ("-fvisibility", "gcc/Code-Gen-Options.html#index-fvisibility"),
+DOC_URL ("-fvisibility-inlines-hidden", "gcc/C_002b_002b-Dialect-Options.html#index-fvisibility-inlines-hidden"),
+DOC_URL ("-fvisibility-ms-compat", "gcc/C_002b_002b-Dialect-Options.html#index-fvisibility-ms-compat"),
+DOC_URL ("-fvpt", "gcc/Optimize-Options.html#index-fvpt"),
+DOC_URL ("-fvtable-verify", "gcc/Instrumentation-Options.html#index-fvtable-verify"),
+DOC_URL ("-fvtv-counts", "gcc/Instrumentation-Options.html#index-fvtv-counts"),
+DOC_URL ("-fvtv-debug", "gcc/Instrumentation-Options.html#index-fvtv-debug"),
+DOC_URL ("-fweb", "gcc/Optimize-Options.html#index-fweb"),
+DOC_URL ("-fwhole-program", "gcc/Optimize-Options.html#index-fwhole-program"),
+DOC_URL ("-fwide-exec-charset", "gcc/Preprocessor-Options.html#index-fwide-exec-charset"),
+DOC_URL ("-fwrapv", "gcc/Code-Gen-Options.html#index-fwrapv"),
+DOC_URL ("-fwrapv-pointer", "gcc/Code-Gen-Options.html#index-fwrapv-pointer"),
+DOC_URL ("-fzero-call-used-regs", "gcc/Optimize-Options.html#index-fzero-call-used-regs"),
+DOC_URL ("-fzero-link", "gcc/Objective-C-and-Objective-C_002b_002b-Dialect-Options.html#index-fzero-link"),
+DOC_URL ("-g", "gcc/Debugging-Options.html#index-g"),
+DOC_URL ("-gas-loc-support", "gcc/Debugging-Options.html#index-gas-loc-support"),
+DOC_URL ("-gas-locview-support", "gcc/Debugging-Options.html#index-gas-locview-support"),
+DOC_URL ("-gbtf", "gcc/Debugging-Options.html#index-gbtf"),
+DOC_URL ("-gcodeview", "gcc/Debugging-Options.html#index-gcodeview"),
+DOC_URL ("-gcolumn-info", "gcc/Debugging-Options.html#index-gcolumn-info"),
+DOC_URL ("-gctf", "gcc/Debugging-Options.html#index-gctf"),
+DOC_URL ("-gdescribe-dies", "gcc/Debugging-Options.html#index-gdescribe-dies"),
+DOC_URL ("-gdwarf", "gcc/Debugging-Options.html#index-gdwarf"),
+DOC_URL ("-gdwarf32", "gcc/Debugging-Options.html#index-gdwarf32"),
+DOC_URL ("-gdwarf64", "gcc/Debugging-Options.html#index-gdwarf64"),
+DOC_URL ("-gen-decls", "gcc/Objective-C-and-Objective-C_002b_002b-Dialect-Options.html#index-gen-decls"),
+DOC_URL ("-gfull", "gcc/Darwin-Options.html#index-gfull"),
+DOC_URL ("-ggdb", "gcc/Debugging-Options.html#index-ggdb"),
+DOC_URL ("-ggnu-pubnames", "gcc/Debugging-Options.html#index-ggnu-pubnames"),
+DOC_URL ("-ginline-points", "gcc/Debugging-Options.html#index-ginline-points"),
+DOC_URL ("-ginternal-reset-location-views", "gcc/Debugging-Options.html#index-ginternal-reset-location-views"),
+DOC_URL ("-gno-as-loc-support", "gcc/Debugging-Options.html#index-gno-as-loc-support"),
+DOC_URL ("-gno-column-info", "gcc/Debugging-Options.html#index-gno-column-info"),
+DOC_URL ("-gno-inline-points", "gcc/Debugging-Options.html#index-gno-inline-points"),
+DOC_URL ("-gno-internal-reset-location-views", "gcc/Debugging-Options.html#index-gno-internal-reset-location-views"),
+DOC_URL ("-gno-record-gcc-switches", "gcc/Debugging-Options.html#index-gno-record-gcc-switches"),
+DOC_URL ("-gno-statement-frontiers", "gcc/Debugging-Options.html#index-gno-statement-frontiers"),
+DOC_URL ("-gno-strict-dwarf", "gcc/Debugging-Options.html#index-gno-strict-dwarf"),
+DOC_URL ("-gno-variable-location-views", "gcc/Debugging-Options.html#index-gno-variable-location-views"),
+DOC_URL ("-gpubnames", "gcc/Debugging-Options.html#index-gpubnames"),
+DOC_URL ("-grecord-gcc-switches", "gcc/Debugging-Options.html#index-grecord-gcc-switches"),
+DOC_URL ("-gsplit-dwarf", "gcc/Debugging-Options.html#index-gsplit-dwarf"),
+DOC_URL ("-gstatement-frontiers", "gcc/Debugging-Options.html#index-gstatement-frontiers"),
+DOC_URL ("-gstrict-dwarf", "gcc/Debugging-Options.html#index-gstrict-dwarf"),
+DOC_URL ("-gtoggle", "gcc/Developer-Options.html#index-gtoggle"),
+DOC_URL ("-gused", "gcc/Darwin-Options.html#index-gused"),
+DOC_URL ("-gvariable-location-views", "gcc/Debugging-Options.html#index-gvariable-location-views"),
+DOC_URL ("-gvariable-location-views=incompat5", "gcc/Debugging-Options.html#index-gvariable-location-views_003dincompat5"),
+DOC_URL ("-gvms", "gcc/Debugging-Options.html#index-gvms"),
+DOC_URL ("-gz", "gcc/Debugging-Options.html#index-gz"),
+DOC_URL ("-headerpad_max_install_names", "gcc/Darwin-Options.html#index-headerpad_005fmax_005finstall_005fnames"),
+DOC_URL ("-help", "gcc/Overall-Options.html#index-help"),
+DOC_URL ("-idirafter", "gcc/Directory-Options.html#index-idirafter"),
+DOC_URL ("-iframework", "gcc/Darwin-Options.html#index-iframework"),
+DOC_URL ("-imacros", "gcc/Preprocessor-Options.html#index-imacros"),
+DOC_URL ("-image_base", "gcc/Darwin-Options.html#index-image_005fbase"),
+DOC_URL ("-imultilib", "gcc/Directory-Options.html#index-imultilib"),
+DOC_URL ("-include", "gcc/Preprocessor-Options.html#index-include"),
+DOC_URL ("-init", "gcc/Darwin-Options.html#index-init"),
+DOC_URL ("-install_name", "gcc/Darwin-Options.html#index-install_005fname"),
+DOC_URL ("-iplugindir=", "gcc/Directory-Options.html#index-iplugindir_003d"),
+DOC_URL ("-iprefix", "gcc/Directory-Options.html#index-iprefix"),
+DOC_URL ("-iquote", "gcc/Directory-Options.html#index-iquote"),
+DOC_URL ("-isysroot", "gcc/Directory-Options.html#index-isysroot"),
+DOC_URL ("-isystem", "gcc/Directory-Options.html#index-isystem"),
+DOC_URL ("-iwithprefix", "gcc/Directory-Options.html#index-iwithprefix"),
+DOC_URL ("-iwithprefixbefore", "gcc/Directory-Options.html#index-iwithprefixbefore"),
+DOC_URL ("-keep_private_externs", "gcc/Darwin-Options.html#index-keep_005fprivate_005fexterns"),
+DOC_URL ("-l", "gcc/Link-Options.html#index-l"),
+DOC_URL ("-lobjc", "gcc/Link-Options.html#index-lobjc"),
+DOC_URL ("-m1", "gcc/SH-Options.html#index-m1"),
+DOC_URL ("-m10", "gcc/PDP-11-Options.html#index-m10"),
+DOC_URL ("-m128bit-long-double", "gcc/x86-Options.html#index-m128bit-long-double"),
+DOC_URL ("-m16", "gcc/x86-Options.html#index-m16"),
+DOC_URL ("-m1reg-", "gcc/Adapteva-Epiphany-Options.html#index-m1reg-"),
+DOC_URL ("-m2", "gcc/SH-Options.html#index-m2"),
+DOC_URL ("-m210", "gcc/MCore-Options.html#index-m210"),
+DOC_URL ("-m2a", "gcc/SH-Options.html#index-m2a"),
+DOC_URL ("-m2a-nofpu", "gcc/SH-Options.html#index-m2a-nofpu"),
+DOC_URL ("-m2a-single", "gcc/SH-Options.html#index-m2a-single"),
+DOC_URL ("-m2a-single-only", "gcc/SH-Options.html#index-m2a-single-only"),
+DOC_URL ("-m3", "gcc/SH-Options.html#index-m3"),
+DOC_URL ("-m31", "gcc/S_002f390-and-zSeries-Options.html#index-m31"),
+DOC_URL ("-m32-bit", "gcc/CRIS-Options.html#index-m32-bit"),
+DOC_URL ("-m32r", "gcc/M32R_002fD-Options.html#index-m32r"),
+DOC_URL ("-m32r2", "gcc/M32R_002fD-Options.html#index-m32r2"),
+DOC_URL ("-m32rx", "gcc/M32R_002fD-Options.html#index-m32rx"),
+DOC_URL ("-m340", "gcc/MCore-Options.html#index-m340"),
+DOC_URL ("-m3dnow", "gcc/x86-Options.html#index-m3dnow"),
+DOC_URL ("-m3dnowa", "gcc/x86-Options.html#index-m3dnowa"),
+DOC_URL ("-m3e", "gcc/SH-Options.html#index-m3e"),
+DOC_URL ("-m4", "gcc/SH-Options.html#index-m4"),
+DOC_URL ("-m4-100", "gcc/SH-Options.html#index-m4-100"),
+DOC_URL ("-m4-100-nofpu", "gcc/SH-Options.html#index-m4-100-nofpu"),
+DOC_URL ("-m4-100-single", "gcc/SH-Options.html#index-m4-100-single"),
+DOC_URL ("-m4-100-single-only", "gcc/SH-Options.html#index-m4-100-single-only"),
+DOC_URL ("-m4-200", "gcc/SH-Options.html#index-m4-200"),
+DOC_URL ("-m4-200-nofpu", "gcc/SH-Options.html#index-m4-200-nofpu"),
+DOC_URL ("-m4-200-single", "gcc/SH-Options.html#index-m4-200-single"),
+DOC_URL ("-m4-200-single-only", "gcc/SH-Options.html#index-m4-200-single-only"),
+DOC_URL ("-m4-300", "gcc/SH-Options.html#index-m4-300"),
+DOC_URL ("-m4-300-nofpu", "gcc/SH-Options.html#index-m4-300-nofpu"),
+DOC_URL ("-m4-300-single", "gcc/SH-Options.html#index-m4-300-single"),
+DOC_URL ("-m4-300-single-only", "gcc/SH-Options.html#index-m4-300-single-only"),
+DOC_URL ("-m4-340", "gcc/SH-Options.html#index-m4-340"),
+DOC_URL ("-m4-500", "gcc/SH-Options.html#index-m4-500"),
+DOC_URL ("-m4-nofpu", "gcc/SH-Options.html#index-m4-nofpu"),
+DOC_URL ("-m4-single", "gcc/SH-Options.html#index-m4-single"),
+DOC_URL ("-m4-single-only", "gcc/SH-Options.html#index-m4-single-only"),
+DOC_URL ("-m40", "gcc/PDP-11-Options.html#index-m40"),
+DOC_URL ("-m45", "gcc/PDP-11-Options.html#index-m45"),
+DOC_URL ("-m4a", "gcc/SH-Options.html#index-m4a"),
+DOC_URL ("-m4a-nofpu", "gcc/SH-Options.html#index-m4a-nofpu"),
+DOC_URL ("-m4a-single", "gcc/SH-Options.html#index-m4a-single"),
+DOC_URL ("-m4a-single-only", "gcc/SH-Options.html#index-m4a-single-only"),
+DOC_URL ("-m4al", "gcc/SH-Options.html#index-m4al"),
+DOC_URL ("-m4byte-functions", "gcc/MCore-Options.html#index-m4byte-functions"),
+DOC_URL ("-m5200", "gcc/M680x0-Options.html#index-m5200"),
+DOC_URL ("-m5206e", "gcc/M680x0-Options.html#index-m5206e"),
+DOC_URL ("-m528x", "gcc/M680x0-Options.html#index-m528x"),
+DOC_URL ("-m5307", "gcc/M680x0-Options.html#index-m5307"),
+DOC_URL ("-m5407", "gcc/M680x0-Options.html#index-m5407"),
+DOC_URL ("-m68000", "gcc/M680x0-Options.html#index-m68000"),
+DOC_URL ("-m68010", "gcc/M680x0-Options.html#index-m68010"),
+DOC_URL ("-m68020", "gcc/M680x0-Options.html#index-m68020"),
+DOC_URL ("-m68020-40", "gcc/M680x0-Options.html#index-m68020-40"),
+DOC_URL ("-m68020-60", "gcc/M680x0-Options.html#index-m68020-60"),
+DOC_URL ("-m68030", "gcc/M680x0-Options.html#index-m68030"),
+DOC_URL ("-m68040", "gcc/M680x0-Options.html#index-m68040"),
+DOC_URL ("-m68060", "gcc/M680x0-Options.html#index-m68060"),
+DOC_URL ("-m68881", "gcc/M680x0-Options.html#index-m68881"),
+DOC_URL ("-m8-bit", "gcc/CRIS-Options.html#index-m8-bit"),
+DOC_URL ("-m80387", "gcc/x86-Options.html#index-m80387"),
+DOC_URL ("-m8bit-idiv", "gcc/x86-Options.html#index-m8bit-idiv"),
+DOC_URL ("-m8byte-align", "gcc/V850-Options.html#index-m8byte-align"),
+DOC_URL ("-m96bit-long-double", "gcc/x86-Options.html#index-m96bit-long-double"),
+DOC_URL ("-mA6", "gcc/ARC-Options.html#index-mA6"),
+DOC_URL ("-mA7", "gcc/ARC-Options.html#index-mA7"),
+DOC_URL ("-mARC600", "gcc/ARC-Options.html#index-mARC600"),
+DOC_URL ("-mARC601", "gcc/ARC-Options.html#index-mARC601"),
+DOC_URL ("-mARC700", "gcc/ARC-Options.html#index-mARC700"),
+DOC_URL ("-mEA", "gcc/ARC-Options.html#index-mEA"),
+DOC_URL ("-mRcq", "gcc/ARC-Options.html#index-mRcq"),
+DOC_URL ("-mRcw", "gcc/ARC-Options.html#index-mRcw"),
+DOC_URL ("-mTLS", "gcc/FRV-Options.html#index-mTLS"),
+DOC_URL ("-mabi=32", "gcc/MIPS-Options.html#index-mabi_003d32"),
+DOC_URL ("-mabi=64", "gcc/MIPS-Options.html#index-mabi_003d64"),
+DOC_URL ("-mabi=call0", "gcc/Xtensa-Options.html#index-mabi_003dcall0"),
+DOC_URL ("-mabi=eabi", "gcc/MIPS-Options.html#index-mabi_003deabi"),
+DOC_URL ("-mabi=elfv1", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mabi_003delfv1"),
+DOC_URL ("-mabi=elfv2", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mabi_003delfv2"),
+DOC_URL ("-mabi=gnu", "gcc/MMIX-Options.html#index-mabi_003dgnu"),
+DOC_URL ("-mabi=ibmlongdouble", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mabi_003dibmlongdouble"),
+DOC_URL ("-mabi=ieeelongdouble", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mabi_003dieeelongdouble"),
+DOC_URL ("-mabi=mmixware", "gcc/MMIX-Options.html#index-mabi_003dmmixware"),
+DOC_URL ("-mabi=n32", "gcc/MIPS-Options.html#index-mabi_003dn32"),
+DOC_URL ("-mabi=o64", "gcc/MIPS-Options.html#index-mabi_003do64"),
+DOC_URL ("-mabi=windowed", "gcc/Xtensa-Options.html#index-mabi_003dwindowed"),
+DOC_URL ("-mabicalls", "gcc/MIPS-Options.html#index-mabicalls"),
+DOC_URL ("-mabm", "gcc/x86-Options.html#index-mabm"),
+DOC_URL ("-mabort-on-noreturn", "gcc/ARM-Options.html#index-mabort-on-noreturn"),
+DOC_URL ("-mabs=2008", "gcc/MIPS-Options.html#index-mabs_003d2008"),
+DOC_URL ("-mabs=legacy", "gcc/MIPS-Options.html#index-mabs_003dlegacy"),
+DOC_URL ("-mabsdata", "gcc/AVR-Options.html#index-mabsdata"),
+DOC_URL ("-mac0", "gcc/PDP-11-Options.html#index-mac0"),
+DOC_URL ("-macc-4", "gcc/FRV-Options.html#index-macc-4"),
+DOC_URL ("-macc-8", "gcc/FRV-Options.html#index-macc-8"),
+DOC_URL ("-maccumulate-args", "gcc/AVR-Options.html#index-maccumulate-args"),
+DOC_URL ("-maddress-mode=long", "gcc/x86-Options.html#index-maddress-mode_003dlong"),
+DOC_URL ("-maddress-mode=short", "gcc/x86-Options.html#index-maddress-mode_003dshort"),
+DOC_URL ("-mads", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mads"),
+DOC_URL ("-madx", "gcc/x86-Options.html#index-madx"),
+DOC_URL ("-maes", "gcc/x86-Options.html#index-maes"),
+DOC_URL ("-maix-struct-return", "gcc/RS_002f6000-and-PowerPC-Options.html#index-maix-struct-return"),
+DOC_URL ("-maix32", "gcc/RS_002f6000-and-PowerPC-Options.html#index-maix32"),
+DOC_URL ("-maix64", "gcc/RS_002f6000-and-PowerPC-Options.html#index-maix64"),
+DOC_URL ("-malign-300", "gcc/H8_002f300-Options.html#index-malign-300"),
+DOC_URL ("-malign-call", "gcc/ARC-Options.html#index-malign-call"),
+DOC_URL ("-malign-double", "gcc/x86-Options.html#index-malign-double"),
+DOC_URL ("-malign-int", "gcc/M680x0-Options.html#index-malign-int"),
+DOC_URL ("-malign-labels", "gcc/FRV-Options.html#index-malign-labels"),
+DOC_URL ("-malign-loops", "gcc/M32R_002fD-Options.html#index-malign-loops"),
+DOC_URL ("-malign-natural", "gcc/RS_002f6000-and-PowerPC-Options.html#index-malign-natural"),
+DOC_URL ("-malign-power", "gcc/RS_002f6000-and-PowerPC-Options.html#index-malign-power"),
+DOC_URL ("-malign-stringops", "gcc/x86-Options.html#index-malign-stringops"),
+DOC_URL ("-malloc-cc", "gcc/FRV-Options.html#index-malloc-cc"),
+DOC_URL ("-mallow-string-insns", "gcc/RX-Options.html#index-mallow-string-insns"),
+DOC_URL ("-mallregs", "gcc/RL78-Options.html#index-mallregs"),
+DOC_URL ("-maltivec", "gcc/RS_002f6000-and-PowerPC-Options.html#index-maltivec"),
+DOC_URL ("-malu32", "gcc/eBPF-Options.html#index-malu32"),
+DOC_URL ("-mam33", "gcc/MN10300-Options.html#index-mam33"),
+DOC_URL ("-mam33-2", "gcc/MN10300-Options.html#index-mam33-2"),
+DOC_URL ("-mam34", "gcc/MN10300-Options.html#index-mam34"),
+DOC_URL ("-mamx-bf16", "gcc/x86-Options.html#index-mamx-bf16"),
+DOC_URL ("-mamx-complex", "gcc/x86-Options.html#index-mamx-complex"),
+DOC_URL ("-mamx-fp16", "gcc/x86-Options.html#index-mamx-fp16"),
+DOC_URL ("-mamx-int8", "gcc/x86-Options.html#index-mamx-int8"),
+DOC_URL ("-mamx-tile", "gcc/x86-Options.html#index-mamx-tile"),
+DOC_URL ("-manchor", "gcc/C-SKY-Options.html#index-manchor"),
+DOC_URL ("-mandroid", "gcc/GNU_002fLinux-Options.html#index-mandroid"),
+DOC_URL ("-mannotate-align", "gcc/ARC-Options.html#index-mannotate-align"),
+DOC_URL ("-mapcs", "gcc/ARM-Options.html#index-mapcs"),
+DOC_URL ("-mapcs-frame", "gcc/ARM-Options.html#index-mapcs-frame"),
+DOC_URL ("-mapxf", "gcc/x86-Options.html#index-mapxf"),
+DOC_URL ("-march=", "gcc/C-SKY-Options.html#index-march_003d"),
+DOC_URL ("-marclinux", "gcc/ARC-Options.html#index-marclinux"),
+DOC_URL ("-marclinux_prof", "gcc/ARC-Options.html#index-marclinux_005fprof"),
+DOC_URL ("-margonaut", "gcc/ARC-Options.html#index-margonaut"),
+DOC_URL ("-marm", "gcc/ARM-Options.html#index-marm"),
+DOC_URL ("-mas100-syntax", "gcc/RX-Options.html#index-mas100-syntax"),
+DOC_URL ("-masm-hex", "gcc/MSP430-Options.html#index-masm-hex"),
+DOC_URL ("-masm-syntax-unified", "gcc/ARM-Options.html#index-masm-syntax-unified"),
+DOC_URL ("-matomic", "gcc/ARC-Options.html#index-matomic"),
+DOC_URL ("-matomic-libcalls", "gcc/HPPA-Options.html#index-matomic-libcalls"),
+DOC_URL ("-matomic-model=<var>model</var>", "gcc/SH-Options.html#index-matomic-model_003dmodel"),
+DOC_URL ("-mauto-litpools", "gcc/Xtensa-Options.html#index-mauto-litpools"),
+DOC_URL ("-mauto-modify-reg", "gcc/ARC-Options.html#index-mauto-modify-reg"),
+DOC_URL ("-mauto-pic", "gcc/IA-64-Options.html#index-mauto-pic"),
+DOC_URL ("-mavoid-indexed-addresses", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mavoid-indexed-addresses"),
+DOC_URL ("-mavx", "gcc/x86-Options.html#index-mavx"),
+DOC_URL ("-mavx2", "gcc/x86-Options.html#index-mavx2"),
+DOC_URL ("-mavx256-split-unaligned-load", "gcc/x86-Options.html#index-mavx256-split-unaligned-load"),
+DOC_URL ("-mavx256-split-unaligned-store", "gcc/x86-Options.html#index-mavx256-split-unaligned-store"),
+DOC_URL ("-mavx5124fmaps", "gcc/x86-Options.html#index-mavx5124fmaps"),
+DOC_URL ("-mavx5124vnniw", "gcc/x86-Options.html#index-mavx5124vnniw"),
+DOC_URL ("-mavx512bf16", "gcc/x86-Options.html#index-mavx512bf16"),
+DOC_URL ("-mavx512bitalg", "gcc/x86-Options.html#index-mavx512bitalg"),
+DOC_URL ("-mavx512bw", "gcc/x86-Options.html#index-mavx512bw"),
+DOC_URL ("-mavx512cd", "gcc/x86-Options.html#index-mavx512cd"),
+DOC_URL ("-mavx512dq", "gcc/x86-Options.html#index-mavx512dq"),
+DOC_URL ("-mavx512er", "gcc/x86-Options.html#index-mavx512er"),
+DOC_URL ("-mavx512f", "gcc/x86-Options.html#index-mavx512f"),
+DOC_URL ("-mavx512fp16", "gcc/x86-Options.html#index-mavx512fp16"),
+DOC_URL ("-mavx512ifma", "gcc/x86-Options.html#index-mavx512ifma"),
+DOC_URL ("-mavx512pf", "gcc/x86-Options.html#index-mavx512pf"),
+DOC_URL ("-mavx512vbmi", "gcc/x86-Options.html#index-mavx512vbmi"),
+DOC_URL ("-mavx512vbmi2", "gcc/x86-Options.html#index-mavx512vbmi2"),
+DOC_URL ("-mavx512vl", "gcc/x86-Options.html#index-mavx512vl"),
+DOC_URL ("-mavx512vnni", "gcc/x86-Options.html#index-mavx512vnni"),
+DOC_URL ("-mavx512vp2intersect", "gcc/x86-Options.html#index-mavx512vp2intersect"),
+DOC_URL ("-mavx512vpopcntdq", "gcc/x86-Options.html#index-mavx512vpopcntdq"),
+DOC_URL ("-mavxifma", "gcc/x86-Options.html#index-mavxifma"),
+DOC_URL ("-mavxneconvert", "gcc/x86-Options.html#index-mavxneconvert"),
+DOC_URL ("-mavxvnni", "gcc/x86-Options.html#index-mavxvnni"),
+DOC_URL ("-mavxvnniint16", "gcc/x86-Options.html#index-mavxvnniint16"),
+DOC_URL ("-mavxvnniint8", "gcc/x86-Options.html#index-mavxvnniint8"),
+DOC_URL ("-max-vect-align", "gcc/Adapteva-Epiphany-Options.html#index-max-vect-align"),
+DOC_URL ("-mb", "gcc/SH-Options.html#index-mb"),
+DOC_URL ("-mbackchain", "gcc/S_002f390-and-zSeries-Options.html#index-mbackchain"),
+DOC_URL ("-mbarrel-shift-enabled", "gcc/LM32-Options.html#index-mbarrel-shift-enabled"),
+DOC_URL ("-mbarrel-shifter", "gcc/ARC-Options.html#index-mbarrel-shifter"),
+DOC_URL ("-mbarrel_shifter", "gcc/ARC-Options.html#index-mbarrel_005fshifter"),
+DOC_URL ("-mbase-addresses", "gcc/MMIX-Options.html#index-mbase-addresses"),
+DOC_URL ("-mbbit-peephole", "gcc/ARC-Options.html#index-mbbit-peephole"),
+DOC_URL ("-mbe8", "gcc/ARM-Options.html#index-mbe8"),
+DOC_URL ("-mbig", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mbig"),
+DOC_URL ("-mbig-endian-data", "gcc/RX-Options.html#index-mbig-endian-data"),
+DOC_URL ("-mbigtable", "gcc/SH-Options.html#index-mbigtable"),
+DOC_URL ("-mbionic", "gcc/GNU_002fLinux-Options.html#index-mbionic"),
+DOC_URL ("-mbit-align", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mbit-align"),
+DOC_URL ("-mbitfield", "gcc/M680x0-Options.html#index-mbitfield"),
+DOC_URL ("-mbitops", "gcc/SH-Options.html#index-mbitops"),
+DOC_URL ("-mblock-compare-inline-limit", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mblock-compare-inline-limit"),
+DOC_URL ("-mblock-compare-inline-loop-limit", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mblock-compare-inline-loop-limit"),
+DOC_URL ("-mblock-move-inline-limit", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mblock-move-inline-limit"),
+DOC_URL ("-mbmi", "gcc/x86-Options.html#index-mbmi"),
+DOC_URL ("-mbmi2", "gcc/x86-Options.html#index-mbmi2"),
+DOC_URL ("-mboard", "gcc/OpenRISC-Options.html#index-mboard"),
+DOC_URL ("-mbranch-cost=", "gcc/C-SKY-Options.html#index-mbranch-cost_003d"),
+DOC_URL ("-mbranch-cost=<var>num</var>", "gcc/SH-Options.html#index-mbranch-cost_003dnum"),
+DOC_URL ("-mbranch-cost=<var>number</var>", "gcc/M32R_002fD-Options.html#index-mbranch-cost_003dnumber"),
+DOC_URL ("-mbranch-index", "gcc/ARC-Options.html#index-mbranch-index"),
+DOC_URL ("-mbranch-likely", "gcc/MIPS-Options.html#index-mbranch-likely"),
+DOC_URL ("-mbranch-predict", "gcc/MMIX-Options.html#index-mbranch-predict"),
+DOC_URL ("-mbss-plt", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mbss-plt"),
+DOC_URL ("-mbswap", "gcc/eBPF-Options.html#index-mbswap"),
+DOC_URL ("-mbuild-constants", "gcc/DEC-Alpha-Options.html#index-mbuild-constants"),
+DOC_URL ("-mbwx", "gcc/DEC-Alpha-Options.html#index-mbwx"),
+DOC_URL ("-mbypass-cache", "gcc/Nios-II-Options.html#index-mbypass-cache"),
+DOC_URL ("-mc68000", "gcc/M680x0-Options.html#index-mc68000"),
+DOC_URL ("-mc68020", "gcc/M680x0-Options.html#index-mc68020"),
+DOC_URL ("-mcache", "gcc/C-SKY-Options.html#index-mcache"),
+DOC_URL ("-mcache-block-size", "gcc/NDS32-Options.html#index-mcache-block-size"),
+DOC_URL ("-mcache-volatile", "gcc/Nios-II-Options.html#index-mcache-volatile"),
+DOC_URL ("-mcall-aixdesc", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mcall-aixdesc"),
+DOC_URL ("-mcall-eabi", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mcall-eabi"),
+DOC_URL ("-mcall-freebsd", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mcall-freebsd"),
+DOC_URL ("-mcall-linux", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mcall-linux"),
+DOC_URL ("-mcall-ms2sysv-xlogues", "gcc/x86-Options.html#index-mcall-ms2sysv-xlogues"),
+DOC_URL ("-mcall-netbsd", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mcall-netbsd"),
+DOC_URL ("-mcall-openbsd", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mcall-openbsd"),
+DOC_URL ("-mcall-prologues", "gcc/AVR-Options.html#index-mcall-prologues"),
+DOC_URL ("-mcall-sysv", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mcall-sysv"),
+DOC_URL ("-mcall-sysv-eabi", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mcall-sysv-eabi"),
+DOC_URL ("-mcall-sysv-noeabi", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mcall-sysv-noeabi"),
+DOC_URL ("-mcallee-super-interworking", "gcc/ARM-Options.html#index-mcallee-super-interworking"),
+DOC_URL ("-mcaller-copies", "gcc/HPPA-Options.html#index-mcaller-copies"),
+DOC_URL ("-mcaller-super-interworking", "gcc/ARM-Options.html#index-mcaller-super-interworking"),
+DOC_URL ("-mcallgraph-data", "gcc/MCore-Options.html#index-mcallgraph-data"),
+DOC_URL ("-mcase-vector-pcrel", "gcc/ARC-Options.html#index-mcase-vector-pcrel"),
+DOC_URL ("-mcbcond", "gcc/SPARC-Options.html#index-mcbcond"),
+DOC_URL ("-mcbranch-force-delay-slot", "gcc/SH-Options.html#index-mcbranch-force-delay-slot"),
+DOC_URL ("-mcc-init", "gcc/CRIS-Options.html#index-mcc-init"),
+DOC_URL ("-mccrt", "gcc/C-SKY-Options.html#index-mccrt"),
+DOC_URL ("-mcet-switch", "gcc/x86-Options.html#index-mcet-switch"),
+DOC_URL ("-mcfv4e", "gcc/M680x0-Options.html#index-mcfv4e"),
+DOC_URL ("-mcix", "gcc/DEC-Alpha-Options.html#index-mcix"),
+DOC_URL ("-mcld", "gcc/x86-Options.html#index-mcld"),
+DOC_URL ("-mcldemote", "gcc/x86-Options.html#index-mcldemote"),
+DOC_URL ("-mclear-hwcap", "gcc/Solaris-2-Options.html#index-mclear-hwcap"),
+DOC_URL ("-mclflushopt", "gcc/x86-Options.html#index-mclflushopt"),
+DOC_URL ("-mclwb", "gcc/x86-Options.html#index-mclwb"),
+DOC_URL ("-mclzero", "gcc/x86-Options.html#index-mclzero"),
+DOC_URL ("-mcmodel=kernel", "gcc/x86-Options.html#index-mcmodel_003dkernel"),
+DOC_URL ("-mcmodel=medany", "gcc/RISC-V-Options.html#index-mcmodel_003dmedany"),
+DOC_URL ("-mcmodel=medlow", "gcc/RISC-V-Options.html#index-mcmodel_003dmedlow"),
+DOC_URL ("-mcmodel=tiny", "gcc/AArch64-Options.html#index-mcmodel_003dtiny"),
+DOC_URL ("-mcmove", "gcc/Adapteva-Epiphany-Options.html#index-mcmove"),
+DOC_URL ("-mcmpb", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mcmpb"),
+DOC_URL ("-mcmpccxadd", "gcc/x86-Options.html#index-mcmpccxadd"),
+DOC_URL ("-mcmse", "gcc/ARM-Options.html#index-mcmse"),
+DOC_URL ("-mco-re", "gcc/eBPF-Options.html#index-mco-re"),
+DOC_URL ("-mcode-density", "gcc/ARC-Options.html#index-mcode-density"),
+DOC_URL ("-mcode-density-frame", "gcc/ARC-Options.html#index-mcode-density-frame"),
+DOC_URL ("-mcode-readable", "gcc/MIPS-Options.html#index-mcode-readable"),
+DOC_URL ("-mcode-region", "gcc/MSP430-Options.html#index-mcode-region"),
+DOC_URL ("-mcoherent-ldcw", "gcc/HPPA-Options.html#index-mcoherent-ldcw"),
+DOC_URL ("-mcompact-branches=always", "gcc/MIPS-Options.html#index-mcompact-branches_003dalways"),
+DOC_URL ("-mcompact-branches=never", "gcc/MIPS-Options.html#index-mcompact-branches_003dnever"),
+DOC_URL ("-mcompact-branches=optimal", "gcc/MIPS-Options.html#index-mcompact-branches_003doptimal"),
+DOC_URL ("-mcompact-casesi", "gcc/ARC-Options.html#index-mcompact-casesi"),
+DOC_URL ("-mcompat-align-parm", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mcompat-align-parm"),
+DOC_URL ("-mcompress", "gcc/FT32-Options.html#index-mcompress"),
+DOC_URL ("-mcond-exec", "gcc/FRV-Options.html#index-mcond-exec"),
+DOC_URL ("-mcond-move", "gcc/FRV-Options.html#index-mcond-move"),
+DOC_URL ("-mcond-move-float", "gcc/LoongArch-Options.html#index-mcond-move-float"),
+DOC_URL ("-mcond-move-int", "gcc/LoongArch-Options.html#index-mcond-move-int"),
+DOC_URL ("-mconsole", "gcc/x86-Windows-Options.html#index-mconsole"),
+DOC_URL ("-mconst-align", "gcc/CRIS-Options.html#index-mconst-align"),
+DOC_URL ("-mconst16", "gcc/Xtensa-Options.html#index-mconst16"),
+DOC_URL ("-mconstant-cfstrings", "gcc/Darwin-Options.html#index-mconstant-cfstrings"),
+DOC_URL ("-mconstant-gp", "gcc/IA-64-Options.html#index-mconstant-gp"),
+DOC_URL ("-mconstpool", "gcc/C-SKY-Options.html#index-mconstpool"),
+DOC_URL ("-mcorea", "gcc/Blackfin-Options.html#index-mcorea"),
+DOC_URL ("-mcoreb", "gcc/Blackfin-Options.html#index-mcoreb"),
+DOC_URL ("-mcp", "gcc/C-SKY-Options.html#index-mcp"),
+DOC_URL ("-mcpu32", "gcc/M680x0-Options.html#index-mcpu32"),
+DOC_URL ("-mcrc", "gcc/MIPS-Options.html#index-mcrc"),
+DOC_URL ("-mcrc32", "gcc/x86-Options.html#index-mcrc32"),
+DOC_URL ("-mcrtdll", "gcc/x86-Windows-Options.html#index-mcrtdll"),
+DOC_URL ("-mcrypto", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mcrypto"),
+DOC_URL ("-mcsr-check", "gcc/RISC-V-Options.html#index-mcsr-check"),
+DOC_URL ("-mctor-dtor", "gcc/NDS32-Options.html#index-mctor-dtor"),
+DOC_URL ("-mcustom-<var>insn</var>", "gcc/Nios-II-Options.html#index-mcustom-insn"),
+DOC_URL ("-mcustom-fpu-cfg", "gcc/Nios-II-Options.html#index-mcustom-fpu-cfg"),
+DOC_URL ("-mcx16", "gcc/x86-Options.html#index-mcx16"),
+DOC_URL ("-mdalign", "gcc/SH-Options.html#index-mdalign"),
+DOC_URL ("-mdata-align", "gcc/CRIS-Options.html#index-mdata-align"),
+DOC_URL ("-mdata-region", "gcc/MSP430-Options.html#index-mdata-region"),
+DOC_URL ("-mdaz-ftz", "gcc/x86-Options.html#index-mdaz-ftz"),
+DOC_URL ("-mdebug-main=<var>prefix</var>", "gcc/VMS-Options.html#index-mdebug-main_003dprefix"),
+DOC_URL ("-mdec-asm", "gcc/PDP-11-Options.html#index-mdec-asm"),
+DOC_URL ("-mdisable-callt", "gcc/V850-Options.html#index-mdisable-callt"),
+DOC_URL ("-mdisable-fpregs", "gcc/HPPA-Options.html#index-mdisable-fpregs"),
+DOC_URL ("-mdisable-indexing", "gcc/HPPA-Options.html#index-mdisable-indexing"),
+DOC_URL ("-mdiv-rem", "gcc/ARC-Options.html#index-mdiv-rem"),
+DOC_URL ("-mdiv=<var>strategy</var>", "gcc/SH-Options.html#index-mdiv_003dstrategy"),
+DOC_URL ("-mdivide-breaks", "gcc/MIPS-Options.html#index-mdivide-breaks"),
+DOC_URL ("-mdivide-enabled", "gcc/LM32-Options.html#index-mdivide-enabled"),
+DOC_URL ("-mdivide-traps", "gcc/MIPS-Options.html#index-mdivide-traps"),
+DOC_URL ("-mdivsi3_libfunc=<var>name</var>", "gcc/SH-Options.html#index-mdivsi3_005flibfunc_003dname"),
+DOC_URL ("-mdll", "gcc/x86-Windows-Options.html#index-mdll"),
+DOC_URL ("-mdlmzb", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mdlmzb"),
+DOC_URL ("-mdmx", "gcc/MIPS-Options.html#index-mdmx"),
+DOC_URL ("-mdpfp", "gcc/ARC-Options.html#index-mdpfp"),
+DOC_URL ("-mdpfp-compact", "gcc/ARC-Options.html#index-mdpfp-compact"),
+DOC_URL ("-mdpfp-fast", "gcc/ARC-Options.html#index-mdpfp-fast"),
+DOC_URL ("-mdpfp_compact", "gcc/ARC-Options.html#index-mdpfp_005fcompact"),
+DOC_URL ("-mdpfp_fast", "gcc/ARC-Options.html#index-mdpfp_005ffast"),
+DOC_URL ("-mdsp-packa", "gcc/ARC-Options.html#index-mdsp-packa"),
+DOC_URL ("-mdsp_packa", "gcc/ARC-Options.html#index-mdsp_005fpacka"),
+DOC_URL ("-mdspr2", "gcc/MIPS-Options.html#index-mdspr2"),
+DOC_URL ("-mdump-tune-features", "gcc/x86-Options.html#index-mdump-tune-features"),
+DOC_URL ("-mdvbf", "gcc/ARC-Options.html#index-mdvbf"),
+DOC_URL ("-mdwarf2-asm", "gcc/IA-64-Options.html#index-mdwarf2-asm"),
+DOC_URL ("-mdynamic-no-pic", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mdynamic-no-pic"),
+DOC_URL ("-mea", "gcc/ARC-Options.html#index-mea"),
+DOC_URL ("-meabi", "gcc/RS_002f6000-and-PowerPC-Options.html#index-meabi"),
+DOC_URL ("-mearly-cbranchsi", "gcc/ARC-Options.html#index-mearly-cbranchsi"),
+DOC_URL ("-mearly-stop-bits", "gcc/IA-64-Options.html#index-mearly-stop-bits"),
+DOC_URL ("-medsp", "gcc/C-SKY-Options.html#index-medsp"),
+DOC_URL ("-melrw", "gcc/C-SKY-Options.html#index-melrw"),
+DOC_URL ("-memb", "gcc/RS_002f6000-and-PowerPC-Options.html#index-memb"),
+DOC_URL ("-membedded-data", "gcc/MIPS-Options.html#index-membedded-data"),
+DOC_URL ("-memregs=", "gcc/M32C-Options.html#index-memregs_003d"),
+DOC_URL ("-menqcmd", "gcc/x86-Options.html#index-menqcmd"),
+DOC_URL ("-mep", "gcc/V850-Options.html#index-mep"),
+DOC_URL ("-mepsilon", "gcc/MMIX-Options.html#index-mepsilon"),
+DOC_URL ("-mesa", "gcc/S_002f390-and-zSeries-Options.html#index-mesa"),
+DOC_URL ("-metrax100", "gcc/CRIS-Options.html#index-metrax100"),
+DOC_URL ("-metrax4", "gcc/CRIS-Options.html#index-metrax4"),
+DOC_URL ("-meva", "gcc/MIPS-Options.html#index-meva"),
+DOC_URL ("-mexpand-adddi", "gcc/ARC-Options.html#index-mexpand-adddi"),
+DOC_URL ("-mext-perf", "gcc/NDS32-Options.html#index-mext-perf"),
+DOC_URL ("-mext-perf2", "gcc/NDS32-Options.html#index-mext-perf2"),
+DOC_URL ("-mext-string", "gcc/NDS32-Options.html#index-mext-string"),
+DOC_URL ("-mextern-sdata", "gcc/MIPS-Options.html#index-mextern-sdata"),
+DOC_URL ("-mextra-l32r-costs", "gcc/Xtensa-Options.html#index-mextra-l32r-costs"),
+DOC_URL ("-mf16c", "gcc/x86-Options.html#index-mf16c"),
+DOC_URL ("-mfancy-math-387", "gcc/x86-Options.html#index-mfancy-math-387"),
+DOC_URL ("-mfast-fp", "gcc/Blackfin-Options.html#index-mfast-fp"),
+DOC_URL ("-mfast-indirect-calls", "gcc/HPPA-Options.html#index-mfast-indirect-calls"),
+DOC_URL ("-mfast-sw-div", "gcc/Nios-II-Options.html#index-mfast-sw-div"),
+DOC_URL ("-mfaster-structs", "gcc/SPARC-Options.html#index-mfaster-structs"),
+DOC_URL ("-mfdiv", "gcc/RISC-V-Options.html#index-mfdiv"),
+DOC_URL ("-mfdivdu", "gcc/C-SKY-Options.html#index-mfdivdu"),
+DOC_URL ("-mfentry", "gcc/x86-Options.html#index-mfentry"),
+DOC_URL ("-mfentry-name", "gcc/x86-Options.html#index-mfentry-name"),
+DOC_URL ("-mfentry-section", "gcc/x86-Options.html#index-mfentry-section"),
+DOC_URL ("-mfix", "gcc/DEC-Alpha-Options.html#index-mfix"),
+DOC_URL ("-mfix-24k", "gcc/MIPS-Options.html#index-mfix-24k"),
+DOC_URL ("-mfix-and-continue", "gcc/Darwin-Options.html#index-mfix-and-continue"),
+DOC_URL ("-mfix-at697f", "gcc/SPARC-Options.html#index-mfix-at697f"),
+DOC_URL ("-mfix-cmse-cve-2021-35465", "gcc/ARM-Options.html#index-mfix-cmse-cve-2021-35465"),
+DOC_URL ("-mfix-cortex-a53-835769", "gcc/AArch64-Options.html#index-mfix-cortex-a53-835769"),
+DOC_URL ("-mfix-cortex-a53-843419", "gcc/AArch64-Options.html#index-mfix-cortex-a53-843419"),
+DOC_URL ("-mfix-cortex-m3-ldrd", "gcc/ARM-Options.html#index-mfix-cortex-m3-ldrd"),
+DOC_URL ("-mfix-gr712rc", "gcc/SPARC-Options.html#index-mfix-gr712rc"),
+DOC_URL ("-mfix-r10000", "gcc/MIPS-Options.html#index-mfix-r10000"),
+DOC_URL ("-mfix-r4000", "gcc/MIPS-Options.html#index-mfix-r4000"),
+DOC_URL ("-mfix-r4400", "gcc/MIPS-Options.html#index-mfix-r4400"),
+DOC_URL ("-mfix-r5900", "gcc/MIPS-Options.html#index-mfix-r5900"),
+DOC_URL ("-mfix-rm7000", "gcc/MIPS-Options.html#index-mfix-rm7000"),
+DOC_URL ("-mfix-sb1", "gcc/MIPS-Options.html#index-mfix-sb1"),
+DOC_URL ("-mfix-ut699", "gcc/SPARC-Options.html#index-mfix-ut699"),
+DOC_URL ("-mfix-ut700", "gcc/SPARC-Options.html#index-mfix-ut700"),
+DOC_URL ("-mfix-vr4120", "gcc/MIPS-Options.html#index-mfix-vr4120"),
+DOC_URL ("-mfix-vr4130", "gcc/MIPS-Options.html#index-mfix-vr4130"),
+DOC_URL ("-mfixed-cc", "gcc/FRV-Options.html#index-mfixed-cc"),
+DOC_URL ("-mflat", "gcc/SPARC-Options.html#index-mflat"),
+DOC_URL ("-mflip-mips16", "gcc/MIPS-Options.html#index-mflip-mips16"),
+DOC_URL ("-mflip-thumb", "gcc/ARM-Options.html#index-mflip-thumb"),
+DOC_URL ("-mfloat-ieee", "gcc/DEC-Alpha-Options.html#index-mfloat-ieee"),
+DOC_URL ("-mfloat-vax", "gcc/DEC-Alpha-Options.html#index-mfloat-vax"),
+DOC_URL ("-mfloat128", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mfloat128"),
+DOC_URL ("-mfloat128-hardware", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mfloat128-hardware"),
+DOC_URL ("-mflush-func", "gcc/MIPS-Options.html#index-mflush-func"),
+DOC_URL ("-mflush-func=<var>name</var>", "gcc/M32R_002fD-Options.html#index-mflush-func_003dname"),
+DOC_URL ("-mflush-trap=<var>number</var>", "gcc/M32R_002fD-Options.html#index-mflush-trap_003dnumber"),
+DOC_URL ("-mfma", "gcc/x86-Options.html#index-mfma"),
+DOC_URL ("-mfma4", "gcc/x86-Options.html#index-mfma4"),
+DOC_URL ("-mfmaf", "gcc/SPARC-Options.html#index-mfmaf"),
+DOC_URL ("-mfmovd", "gcc/SH-Options.html#index-mfmovd"),
+DOC_URL ("-mforce-indirect-call", "gcc/x86-Options.html#index-mforce-indirect-call"),
+DOC_URL ("-mforce-no-pic", "gcc/Xtensa-Options.html#index-mforce-no-pic"),
+DOC_URL ("-mfp-exceptions", "gcc/MIPS-Options.html#index-mfp-exceptions"),
+DOC_URL ("-mfp-mode", "gcc/Adapteva-Epiphany-Options.html#index-mfp-mode"),
+DOC_URL ("-mfp-reg", "gcc/DEC-Alpha-Options.html#index-mfp-reg"),
+DOC_URL ("-mfp-ret-in-387", "gcc/x86-Options.html#index-mfp-ret-in-387"),
+DOC_URL ("-mfp-rounding-mode", "gcc/DEC-Alpha-Options.html#index-mfp-rounding-mode"),
+DOC_URL ("-mfp-trap-mode", "gcc/DEC-Alpha-Options.html#index-mfp-trap-mode"),
+DOC_URL ("-mfp16-format", "gcc/ARM-Options.html#index-mfp16-format"),
+DOC_URL ("-mfp32", "gcc/MIPS-Options.html#index-mfp32"),
+DOC_URL ("-mfp64", "gcc/MIPS-Options.html#index-mfp64"),
+DOC_URL ("-mfpr-32", "gcc/FRV-Options.html#index-mfpr-32"),
+DOC_URL ("-mfpr-64", "gcc/FRV-Options.html#index-mfpr-64"),
+DOC_URL ("-mfprnd", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mfprnd"),
+DOC_URL ("-mfpu=", "gcc/C-SKY-Options.html#index-mfpu_003d"),
+DOC_URL ("-mfpxx", "gcc/MIPS-Options.html#index-mfpxx"),
+DOC_URL ("-mfract-convert-truncate", "gcc/AVR-Options.html#index-mfract-convert-truncate"),
+DOC_URL ("-mframe-header-opt", "gcc/MIPS-Options.html#index-mframe-header-opt"),
+DOC_URL ("-mfriz", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mfriz"),
+DOC_URL ("-mfsca", "gcc/SH-Options.html#index-mfsca"),
+DOC_URL ("-mfsgsbase", "gcc/x86-Options.html#index-mfsgsbase"),
+DOC_URL ("-mfsmuld", "gcc/SPARC-Options.html#index-mfsmuld"),
+DOC_URL ("-mfsrra", "gcc/SH-Options.html#index-mfsrra"),
+DOC_URL ("-mft32b", "gcc/FT32-Options.html#index-mft32b"),
+DOC_URL ("-mfull-regs", "gcc/NDS32-Options.html#index-mfull-regs"),
+DOC_URL ("-mfull-toc", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mfull-toc"),
+DOC_URL ("-mfunction-return", "gcc/x86-Options.html#index-mfunction-return"),
+DOC_URL ("-mfxsr", "gcc/x86-Options.html#index-mfxsr"),
+DOC_URL ("-mg", "gcc/VAX-Options.html#index-mg"),
+DOC_URL ("-mg10", "gcc/RL78-Options.html#index-mg10"),
+DOC_URL ("-mg13", "gcc/RL78-Options.html#index-mg13"),
+DOC_URL ("-mg14", "gcc/RL78-Options.html#index-mg14"),
+DOC_URL ("-mgas", "gcc/HPPA-Options.html#index-mgas"),
+DOC_URL ("-mgas-isr-prologues", "gcc/AVR-Options.html#index-mgas-isr-prologues"),
+DOC_URL ("-mgcc-abi", "gcc/V850-Options.html#index-mgcc-abi"),
+DOC_URL ("-mgfni", "gcc/x86-Options.html#index-mgfni"),
+DOC_URL ("-mghs", "gcc/V850-Options.html#index-mghs"),
+DOC_URL ("-mginv", "gcc/MIPS-Options.html#index-mginv"),
+DOC_URL ("-mglibc", "gcc/GNU_002fLinux-Options.html#index-mglibc"),
+DOC_URL ("-mgnu", "gcc/VAX-Options.html#index-mgnu"),
+DOC_URL ("-mgnu-as", "gcc/IA-64-Options.html#index-mgnu-as"),
+DOC_URL ("-mgnu-asm", "gcc/PDP-11-Options.html#index-mgnu-asm"),
+DOC_URL ("-mgnu-attribute", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mgnu-attribute"),
+DOC_URL ("-mgomp", "gcc/Nvidia-PTX-Options.html#index-mgomp"),
+DOC_URL ("-mgp32", "gcc/MIPS-Options.html#index-mgp32"),
+DOC_URL ("-mgp64", "gcc/MIPS-Options.html#index-mgp64"),
+DOC_URL ("-mgpr-32", "gcc/FRV-Options.html#index-mgpr-32"),
+DOC_URL ("-mgpr-64", "gcc/FRV-Options.html#index-mgpr-64"),
+DOC_URL ("-mgprel-ro", "gcc/FRV-Options.html#index-mgprel-ro"),
+DOC_URL ("-mgprel-sec", "gcc/Nios-II-Options.html#index-mgprel-sec"),
+DOC_URL ("-mh", "gcc/H8_002f300-Options.html#index-mh"),
+DOC_URL ("-mhal", "gcc/Nios-II-Options.html#index-mhal"),
+DOC_URL ("-mhalf-reg-file", "gcc/Adapteva-Epiphany-Options.html#index-mhalf-reg-file"),
+DOC_URL ("-mhard-div", "gcc/OpenRISC-Options.html#index-mhard-div"),
+DOC_URL ("-mhard-mul", "gcc/OpenRISC-Options.html#index-mhard-mul"),
+DOC_URL ("-mhard-quad-float", "gcc/SPARC-Options.html#index-mhard-quad-float"),
+DOC_URL ("-mhardlit", "gcc/MCore-Options.html#index-mhardlit"),
+DOC_URL ("-mhigh-registers", "gcc/C-SKY-Options.html#index-mhigh-registers"),
+DOC_URL ("-mhle", "gcc/x86-Options.html#index-mhle"),
+DOC_URL ("-mhotpatch", "gcc/S_002f390-and-zSeries-Options.html#index-mhotpatch"),
+DOC_URL ("-mhp-ld", "gcc/HPPA-Options.html#index-mhp-ld"),
+DOC_URL ("-mhreset", "gcc/x86-Options.html#index-mhreset"),
+DOC_URL ("-mhw-div", "gcc/Nios-II-Options.html#index-mhw-div"),
+DOC_URL ("-mhw-mul", "gcc/Nios-II-Options.html#index-mhw-mul"),
+DOC_URL ("-mhw-mulx", "gcc/Nios-II-Options.html#index-mhw-mulx"),
+DOC_URL ("-mhwmult=", "gcc/MSP430-Options.html#index-mhwmult_003d"),
+DOC_URL ("-miamcu", "gcc/x86-Options.html#index-miamcu"),
+DOC_URL ("-micplb", "gcc/Blackfin-Options.html#index-micplb"),
+DOC_URL ("-mieee-conformant", "gcc/DEC-Alpha-Options.html#index-mieee-conformant"),
+DOC_URL ("-mieee-fp", "gcc/x86-Options.html#index-mieee-fp"),
+DOC_URL ("-mieee-with-inexact", "gcc/DEC-Alpha-Options.html#index-mieee-with-inexact"),
+DOC_URL ("-milp32", "gcc/IA-64-Options.html#index-milp32"),
+DOC_URL ("-mimadd", "gcc/MIPS-Options.html#index-mimadd"),
+DOC_URL ("-mimpure-text", "gcc/Solaris-2-Options.html#index-mimpure-text"),
+DOC_URL ("-mincoming-stack-boundary", "gcc/x86-Options.html#index-mincoming-stack-boundary"),
+DOC_URL ("-mindexed-loads", "gcc/ARC-Options.html#index-mindexed-loads"),
+DOC_URL ("-mindirect-branch", "gcc/x86-Options.html#index-mindirect-branch"),
+DOC_URL ("-mindirect-branch-cs-prefix", "gcc/x86-Options.html#index-mindirect-branch-cs-prefix"),
+DOC_URL ("-mindirect-branch-register", "gcc/x86-Options.html#index-mindirect-branch-register"),
+DOC_URL ("-minline-all-stringops", "gcc/x86-Options.html#index-minline-all-stringops"),
+DOC_URL ("-minline-atomics", "gcc/RISC-V-Options.html#index-minline-atomics"),
+DOC_URL ("-minline-float-divide-max-throughput", "gcc/IA-64-Options.html#index-minline-float-divide-max-throughput"),
+DOC_URL ("-minline-float-divide-min-latency", "gcc/IA-64-Options.html#index-minline-float-divide-min-latency"),
+DOC_URL ("-minline-ic_invalidate", "gcc/SH-Options.html#index-minline-ic_005finvalidate"),
+DOC_URL ("-minline-int-divide", "gcc/IA-64-Options.html#index-minline-int-divide"),
+DOC_URL ("-minline-int-divide-max-throughput", "gcc/IA-64-Options.html#index-minline-int-divide-max-throughput"),
+DOC_URL ("-minline-int-divide-min-latency", "gcc/IA-64-Options.html#index-minline-int-divide-min-latency"),
+DOC_URL ("-minline-sqrt-max-throughput", "gcc/IA-64-Options.html#index-minline-sqrt-max-throughput"),
+DOC_URL ("-minline-sqrt-min-latency", "gcc/IA-64-Options.html#index-minline-sqrt-min-latency"),
+DOC_URL ("-minline-strcmp", "gcc/RISC-V-Options.html#index-minline-strcmp"),
+DOC_URL ("-minline-stringops-dynamically", "gcc/x86-Options.html#index-minline-stringops-dynamically"),
+DOC_URL ("-minline-strlen", "gcc/RISC-V-Options.html#index-minline-strlen"),
+DOC_URL ("-minline-strncmp", "gcc/RISC-V-Options.html#index-minline-strncmp"),
+DOC_URL ("-minsert-sched-nops", "gcc/RS_002f6000-and-PowerPC-Options.html#index-minsert-sched-nops"),
+DOC_URL ("-minstrument-return", "gcc/x86-Options.html#index-minstrument-return"),
+DOC_URL ("-mint-register", "gcc/RX-Options.html#index-mint-register"),
+DOC_URL ("-mint16", "gcc/PDP-11-Options.html#index-mint16"),
+DOC_URL ("-mint8", "gcc/AVR-Options.html#index-mint8"),
+DOC_URL ("-minterlink-compressed", "gcc/MIPS-Options.html#index-minterlink-compressed"),
+DOC_URL ("-minterlink-mips16", "gcc/MIPS-Options.html#index-minterlink-mips16"),
+DOC_URL ("-mips1", "gcc/MIPS-Options.html#index-mips1"),
+DOC_URL ("-mips16", "gcc/MIPS-Options.html#index-mips16"),
+DOC_URL ("-mips2", "gcc/MIPS-Options.html#index-mips2"),
+DOC_URL ("-mips3", "gcc/MIPS-Options.html#index-mips3"),
+DOC_URL ("-mips32", "gcc/MIPS-Options.html#index-mips32"),
+DOC_URL ("-mips32r3", "gcc/MIPS-Options.html#index-mips32r3"),
+DOC_URL ("-mips32r5", "gcc/MIPS-Options.html#index-mips32r5"),
+DOC_URL ("-mips32r6", "gcc/MIPS-Options.html#index-mips32r6"),
+DOC_URL ("-mips3d", "gcc/MIPS-Options.html#index-mips3d"),
+DOC_URL ("-mips4", "gcc/MIPS-Options.html#index-mips4"),
+DOC_URL ("-mips64", "gcc/MIPS-Options.html#index-mips64"),
+DOC_URL ("-mips64r2", "gcc/MIPS-Options.html#index-mips64r2"),
+DOC_URL ("-mips64r3", "gcc/MIPS-Options.html#index-mips64r3"),
+DOC_URL ("-mips64r5", "gcc/MIPS-Options.html#index-mips64r5"),
+DOC_URL ("-mips64r6", "gcc/MIPS-Options.html#index-mips64r6"),
+DOC_URL ("-mirq-ctrl-saved", "gcc/ARC-Options.html#index-mirq-ctrl-saved"),
+DOC_URL ("-misa", "gcc/Nvidia-PTX-Options.html#index-misa"),
+DOC_URL ("-misa-spec", "gcc/RISC-V-Options.html#index-misa-spec"),
+DOC_URL ("-misel", "gcc/RS_002f6000-and-PowerPC-Options.html#index-misel"),
+DOC_URL ("-misr-vector-size", "gcc/NDS32-Options.html#index-misr-vector-size"),
+DOC_URL ("-missue-rate=<var>number</var>", "gcc/M32R_002fD-Options.html#index-missue-rate_003dnumber"),
+DOC_URL ("-mistack", "gcc/C-SKY-Options.html#index-mistack"),
+DOC_URL ("-mjli-always", "gcc/ARC-Options.html#index-mjli-always"),
+DOC_URL ("-mjmp32", "gcc/eBPF-Options.html#index-mjmp32"),
+DOC_URL ("-mjmpext", "gcc/eBPF-Options.html#index-mjmpext"),
+DOC_URL ("-mjsr", "gcc/RX-Options.html#index-mjsr"),
+DOC_URL ("-mjump-in-delay", "gcc/HPPA-Options.html#index-mjump-in-delay"),
+DOC_URL ("-mkernel", "gcc/Darwin-Options.html#index-mkernel"),
+DOC_URL ("-mkl", "gcc/x86-Options.html#index-mkl"),
+DOC_URL ("-mknuthdiv", "gcc/MMIX-Options.html#index-mknuthdiv"),
+DOC_URL ("-ml", "gcc/SH-Options.html#index-ml"),
+DOC_URL ("-ml[a]sx", "gcc/LoongArch-Options.html#index-ml_005ba_005dsx"),
+DOC_URL ("-mlam", "gcc/x86-Options.html#index-mlam"),
+DOC_URL ("-mlarge", "gcc/MSP430-Options.html#index-mlarge"),
+DOC_URL ("-mlarge-data", "gcc/DEC-Alpha-Options.html#index-mlarge-data"),
+DOC_URL ("-mlarge-data-threshold", "gcc/x86-Options.html#index-mlarge-data-threshold"),
+DOC_URL ("-mlarge-text", "gcc/DEC-Alpha-Options.html#index-mlarge-text"),
+DOC_URL ("-mlibfuncs", "gcc/MMIX-Options.html#index-mlibfuncs"),
+DOC_URL ("-mlibrary-pic", "gcc/FRV-Options.html#index-mlibrary-pic"),
+DOC_URL ("-mlinked-fp", "gcc/FRV-Options.html#index-mlinked-fp"),
+DOC_URL ("-mlinker-opt", "gcc/HPPA-Options.html#index-mlinker-opt"),
+DOC_URL ("-mlittle", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mlittle"),
+DOC_URL ("-mlittle-endian-data", "gcc/RX-Options.html#index-mlittle-endian-data"),
+DOC_URL ("-mliw", "gcc/MN10300-Options.html#index-mliw"),
+DOC_URL ("-mll64", "gcc/ARC-Options.html#index-mll64"),
+DOC_URL ("-mllsc", "gcc/MIPS-Options.html#index-mllsc"),
+DOC_URL ("-mload-store-pairs", "gcc/MIPS-Options.html#index-mload-store-pairs"),
+DOC_URL ("-mlocal-sdata", "gcc/MIPS-Options.html#index-mlocal-sdata"),
+DOC_URL ("-mlock", "gcc/ARC-Options.html#index-mlock"),
+DOC_URL ("-mlong-double", "gcc/AVR-Options.html#index-mlong-double"),
+DOC_URL ("-mlong-double-80", "gcc/x86-Options.html#index-mlong-double-80"),
+DOC_URL ("-mlong-jump-table-offsets", "gcc/M680x0-Options.html#index-mlong-jump-table-offsets"),
+DOC_URL ("-mlong-jumps", "gcc/V850-Options.html#index-mlong-jumps"),
+DOC_URL ("-mlong-load-store", "gcc/HPPA-Options.html#index-mlong-load-store"),
+DOC_URL ("-mlong32", "gcc/MIPS-Options.html#index-mlong32"),
+DOC_URL ("-mlong64", "gcc/MIPS-Options.html#index-mlong64"),
+DOC_URL ("-mlongcall", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mlongcall"),
+DOC_URL ("-mlongcalls", "gcc/Xtensa-Options.html#index-mlongcalls"),
+DOC_URL ("-mloongson-ext", "gcc/MIPS-Options.html#index-mloongson-ext"),
+DOC_URL ("-mloongson-ext2", "gcc/MIPS-Options.html#index-mloongson-ext2"),
+DOC_URL ("-mloongson-mmi", "gcc/MIPS-Options.html#index-mloongson-mmi"),
+DOC_URL ("-mlow-precision-div", "gcc/AArch64-Options.html#index-mlow-precision-div"),
+DOC_URL ("-mlow-precision-recip-sqrt", "gcc/AArch64-Options.html#index-mlow-precision-recip-sqrt"),
+DOC_URL ("-mlow-precision-sqrt", "gcc/AArch64-Options.html#index-mlow-precision-sqrt"),
+DOC_URL ("-mlow64k", "gcc/Blackfin-Options.html#index-mlow64k"),
+DOC_URL ("-mlp64", "gcc/IA-64-Options.html#index-mlp64"),
+DOC_URL ("-mlpc-width", "gcc/ARC-Options.html#index-mlpc-width"),
+DOC_URL ("-mlra-priority-compact", "gcc/ARC-Options.html#index-mlra-priority-compact"),
+DOC_URL ("-mlra-priority-noncompact", "gcc/ARC-Options.html#index-mlra-priority-noncompact"),
+DOC_URL ("-mlra-priority-none", "gcc/ARC-Options.html#index-mlra-priority-none"),
+DOC_URL ("-mlwp", "gcc/x86-Options.html#index-mlwp"),
+DOC_URL ("-mlxc1-sxc1", "gcc/MIPS-Options.html#index-mlxc1-sxc1"),
+DOC_URL ("-mlzcnt", "gcc/x86-Options.html#index-mlzcnt"),
+DOC_URL ("-mmac-24", "gcc/ARC-Options.html#index-mmac-24"),
+DOC_URL ("-mmac-d16", "gcc/ARC-Options.html#index-mmac-d16"),
+DOC_URL ("-mmac_24", "gcc/ARC-Options.html#index-mmac_005f24"),
+DOC_URL ("-mmac_d16", "gcc/ARC-Options.html#index-mmac_005fd16"),
+DOC_URL ("-mmacosx-version-min", "gcc/Darwin-Options.html#index-mmacosx-version-min"),
+DOC_URL ("-mmad", "gcc/MIPS-Options.html#index-mmad"),
+DOC_URL ("-mmadd4", "gcc/MIPS-Options.html#index-mmadd4"),
+DOC_URL ("-mmain-is-OS_task", "gcc/AVR-Options.html#index-mmain-is-OS_005ftask"),
+DOC_URL ("-mmainkernel", "gcc/Nvidia-PTX-Options.html#index-mmainkernel"),
+DOC_URL ("-mmalloc64", "gcc/VMS-Options.html#index-mmalloc64"),
+DOC_URL ("-mmanual-endbr", "gcc/x86-Options.html#index-mmanual-endbr"),
+DOC_URL ("-mmax", "gcc/DEC-Alpha-Options.html#index-mmax"),
+DOC_URL ("-mmax-constant-size", "gcc/RX-Options.html#index-mmax-constant-size"),
+DOC_URL ("-mmax-inline-memcpy-size", "gcc/LoongArch-Options.html#index-mmax-inline-memcpy-size"),
+DOC_URL ("-mmax-inline-shift=", "gcc/MSP430-Options.html#index-mmax-inline-shift_003d"),
+DOC_URL ("-mmax-stack-frame", "gcc/CRIS-Options.html#index-mmax-stack-frame"),
+DOC_URL ("-mmcount-ra-address", "gcc/MIPS-Options.html#index-mmcount-ra-address"),
+DOC_URL ("-mmcu=", "gcc/MSP430-Options.html#index-mmcu_003d"),
+DOC_URL ("-mmedia", "gcc/FRV-Options.html#index-mmedia"),
+DOC_URL ("-mmedium-calls", "gcc/ARC-Options.html#index-mmedium-calls"),
+DOC_URL ("-mmemcpy-strategy=<var>strategy</var>", "gcc/x86-Options.html#index-mmemcpy-strategy_003dstrategy"),
+DOC_URL ("-mmemory-latency", "gcc/DEC-Alpha-Options.html#index-mmemory-latency"),
+DOC_URL ("-mmemory-model", "gcc/SPARC-Options.html#index-mmemory-model"),
+DOC_URL ("-mmemset-strategy=<var>strategy</var>", "gcc/x86-Options.html#index-mmemset-strategy_003dstrategy"),
+DOC_URL ("-mmfcrf", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mmfcrf"),
+DOC_URL ("-mmicromips", "gcc/MIPS-Options.html#index-mmicromips"),
+DOC_URL ("-mmillicode", "gcc/ARC-Options.html#index-mmillicode"),
+DOC_URL ("-mminimal-toc", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mminimal-toc"),
+DOC_URL ("-mmips16e2", "gcc/MIPS-Options.html#index-mmips16e2"),
+DOC_URL ("-mmixed-code", "gcc/ARC-Options.html#index-mmixed-code"),
+DOC_URL ("-mmma", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mmma"),
+DOC_URL ("-mmmx", "gcc/x86-Options.html#index-mmmx"),
+DOC_URL ("-mmodel=large", "gcc/M32R_002fD-Options.html#index-mmodel_003dlarge"),
+DOC_URL ("-mmodel=medium", "gcc/M32R_002fD-Options.html#index-mmodel_003dmedium"),
+DOC_URL ("-mmodel=small", "gcc/M32R_002fD-Options.html#index-mmodel_003dsmall"),
+DOC_URL ("-mmovbe", "gcc/x86-Options.html#index-mmovbe"),
+DOC_URL ("-mmovdir64b", "gcc/x86-Options.html#index-mmovdir64b"),
+DOC_URL ("-mmovdiri", "gcc/x86-Options.html#index-mmovdiri"),
+DOC_URL ("-mmove-max", "gcc/x86-Options.html#index-mmove-max"),
+DOC_URL ("-mmp", "gcc/C-SKY-Options.html#index-mmp"),
+DOC_URL ("-mmpy", "gcc/ARC-Options.html#index-mmpy"),
+DOC_URL ("-mmpy-option", "gcc/ARC-Options.html#index-mmpy-option"),
+DOC_URL ("-mms-bitfields", "gcc/x86-Options.html#index-mms-bitfields"),
+DOC_URL ("-mmt", "gcc/MIPS-Options.html#index-mmt"),
+DOC_URL ("-mmul", "gcc/RL78-Options.html#index-mmul"),
+DOC_URL ("-mmul-bug-workaround", "gcc/CRIS-Options.html#index-mmul-bug-workaround"),
+DOC_URL ("-mmul.x", "gcc/Moxie-Options.html#index-mmul_002ex"),
+DOC_URL ("-mmul32x16", "gcc/ARC-Options.html#index-mmul32x16"),
+DOC_URL ("-mmul64", "gcc/ARC-Options.html#index-mmul64"),
+DOC_URL ("-mmuladd", "gcc/FRV-Options.html#index-mmuladd"),
+DOC_URL ("-mmulhw", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mmulhw"),
+DOC_URL ("-mmult-bug", "gcc/MN10300-Options.html#index-mmult-bug"),
+DOC_URL ("-mmultcost", "gcc/ARC-Options.html#index-mmultcost"),
+DOC_URL ("-mmulti-cond-exec", "gcc/FRV-Options.html#index-mmulti-cond-exec"),
+DOC_URL ("-mmulticore", "gcc/Blackfin-Options.html#index-mmulticore"),
+DOC_URL ("-mmultiple", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mmultiple"),
+DOC_URL ("-mmultiple-stld", "gcc/C-SKY-Options.html#index-mmultiple-stld"),
+DOC_URL ("-mmusl", "gcc/GNU_002fLinux-Options.html#index-mmusl"),
+DOC_URL ("-mmvcle", "gcc/S_002f390-and-zSeries-Options.html#index-mmvcle"),
+DOC_URL ("-mmvme", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mmvme"),
+DOC_URL ("-mmwait", "gcc/x86-Options.html#index-mmwait"),
+DOC_URL ("-mmwaitx", "gcc/x86-Options.html#index-mmwaitx"),
+DOC_URL ("-mn", "gcc/H8_002f300-Options.html#index-mn"),
+DOC_URL ("-mn-flash", "gcc/AVR-Options.html#index-mn-flash"),
+DOC_URL ("-mnan=2008", "gcc/MIPS-Options.html#index-mnan_003d2008"),
+DOC_URL ("-mnan=legacy", "gcc/MIPS-Options.html#index-mnan_003dlegacy"),
+DOC_URL ("-mneeded", "gcc/x86-Options.html#index-mneeded"),
+DOC_URL ("-mneon-for-64bits", "gcc/ARM-Options.html#index-mneon-for-64bits"),
+DOC_URL ("-mnested-cond-exec", "gcc/FRV-Options.html#index-mnested-cond-exec"),
+DOC_URL ("-mnewlib", "gcc/OpenRISC-Options.html#index-mnewlib"),
+DOC_URL ("-mno-16-bit", "gcc/NDS32-Options.html#index-mno-16-bit"),
+DOC_URL ("-mno-4byte-functions", "gcc/MCore-Options.html#index-mno-4byte-functions"),
+DOC_URL ("-mno-8byte-align", "gcc/V850-Options.html#index-mno-8byte-align"),
+DOC_URL ("-mno-abicalls", "gcc/MIPS-Options.html#index-mno-abicalls"),
+DOC_URL ("-mno-ac0", "gcc/PDP-11-Options.html#index-mno-ac0"),
+DOC_URL ("-mno-align-double", "gcc/x86-Options.html#index-mno-align-double"),
+DOC_URL ("-mno-align-int", "gcc/M680x0-Options.html#index-mno-align-int"),
+DOC_URL ("-mno-align-loops", "gcc/M32R_002fD-Options.html#index-mno-align-loops"),
+DOC_URL ("-mno-align-stringops", "gcc/x86-Options.html#index-mno-align-stringops"),
+DOC_URL ("-mno-allow-string-insns", "gcc/RX-Options.html#index-mno-allow-string-insns"),
+DOC_URL ("-mno-altivec", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-altivec"),
+DOC_URL ("-mno-am33", "gcc/MN10300-Options.html#index-mno-am33"),
+DOC_URL ("-mno-as100-syntax", "gcc/RX-Options.html#index-mno-as100-syntax"),
+DOC_URL ("-mno-atomic-libcalls", "gcc/HPPA-Options.html#index-mno-atomic-libcalls"),
+DOC_URL ("-mno-auto-litpools", "gcc/Xtensa-Options.html#index-mno-auto-litpools"),
+DOC_URL ("-mno-avoid-indexed-addresses", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-avoid-indexed-addresses"),
+DOC_URL ("-mno-backchain", "gcc/S_002f390-and-zSeries-Options.html#index-mno-backchain"),
+DOC_URL ("-mno-base-addresses", "gcc/MMIX-Options.html#index-mno-base-addresses"),
+DOC_URL ("-mno-bit-align", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-bit-align"),
+DOC_URL ("-mno-bitfield", "gcc/M680x0-Options.html#index-mno-bitfield"),
+DOC_URL ("-mno-branch-likely", "gcc/MIPS-Options.html#index-mno-branch-likely"),
+DOC_URL ("-mno-branch-predict", "gcc/MMIX-Options.html#index-mno-branch-predict"),
+DOC_URL ("-mno-brcc", "gcc/ARC-Options.html#index-mno-brcc"),
+DOC_URL ("-mno-bwx", "gcc/DEC-Alpha-Options.html#index-mno-bwx"),
+DOC_URL ("-mno-bypass-cache", "gcc/Nios-II-Options.html#index-mno-bypass-cache"),
+DOC_URL ("-mno-cache-volatile", "gcc/Nios-II-Options.html#index-mno-cache-volatile"),
+DOC_URL ("-mno-call-ms2sysv-xlogues", "gcc/x86-Options.html#index-mno-call-ms2sysv-xlogues"),
+DOC_URL ("-mno-callgraph-data", "gcc/MCore-Options.html#index-mno-callgraph-data"),
+DOC_URL ("-mno-cbcond", "gcc/SPARC-Options.html#index-mno-cbcond"),
+DOC_URL ("-mno-check-zero-division", "gcc/MIPS-Options.html#index-mno-check-zero-division"),
+DOC_URL ("-mno-cix", "gcc/DEC-Alpha-Options.html#index-mno-cix"),
+DOC_URL ("-mno-clearbss", "gcc/MicroBlaze-Options.html#index-mno-clearbss"),
+DOC_URL ("-mno-cmov", "gcc/NDS32-Options.html#index-mno-cmov"),
+DOC_URL ("-mno-cmpb", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-cmpb"),
+DOC_URL ("-mno-co-re", "gcc/eBPF-Options.html#index-mno-co-re"),
+DOC_URL ("-mno-cond-move", "gcc/FRV-Options.html#index-mno-cond-move"),
+DOC_URL ("-mno-const-align", "gcc/CRIS-Options.html#index-mno-const-align"),
+DOC_URL ("-mno-const16", "gcc/Xtensa-Options.html#index-mno-const16"),
+DOC_URL ("-mno-crc", "gcc/MIPS-Options.html#index-mno-crc"),
+DOC_URL ("-mno-crypto", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-crypto"),
+DOC_URL ("-mno-csync-anomaly", "gcc/Blackfin-Options.html#index-mno-csync-anomaly"),
+DOC_URL ("-mno-custom-<var>insn</var>", "gcc/Nios-II-Options.html#index-mno-custom-insn"),
+DOC_URL ("-mno-data-align", "gcc/CRIS-Options.html#index-mno-data-align"),
+DOC_URL ("-mno-debug", "gcc/S_002f390-and-zSeries-Options.html#index-mno-debug"),
+DOC_URL ("-mno-default", "gcc/x86-Options.html#index-mno-default"),
+DOC_URL ("-mno-disable-callt", "gcc/V850-Options.html#index-mno-disable-callt"),
+DOC_URL ("-mno-dlmzb", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-dlmzb"),
+DOC_URL ("-mno-double", "gcc/FRV-Options.html#index-mno-double"),
+DOC_URL ("-mno-dpfp-lrsr", "gcc/ARC-Options.html#index-mno-dpfp-lrsr"),
+DOC_URL ("-mno-dsp", "gcc/MIPS-Options.html#index-mno-dsp"),
+DOC_URL ("-mno-dspr2", "gcc/MIPS-Options.html#index-mno-dspr2"),
+DOC_URL ("-mno-dwarf2-asm", "gcc/IA-64-Options.html#index-mno-dwarf2-asm"),
+DOC_URL ("-mno-dword", "gcc/FRV-Options.html#index-mno-dword"),
+DOC_URL ("-mno-eabi", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-eabi"),
+DOC_URL ("-mno-early-stop-bits", "gcc/IA-64-Options.html#index-mno-early-stop-bits"),
+DOC_URL ("-mno-eflags", "gcc/FRV-Options.html#index-mno-eflags"),
+DOC_URL ("-mno-embedded-data", "gcc/MIPS-Options.html#index-mno-embedded-data"),
+DOC_URL ("-mno-ep", "gcc/V850-Options.html#index-mno-ep"),
+DOC_URL ("-mno-epsilon", "gcc/MMIX-Options.html#index-mno-epsilon"),
+DOC_URL ("-mno-eva", "gcc/MIPS-Options.html#index-mno-eva"),
+DOC_URL ("-mno-exr", "gcc/H8_002f300-Options.html#index-mno-exr"),
+DOC_URL ("-mno-ext-perf", "gcc/NDS32-Options.html#index-mno-ext-perf"),
+DOC_URL ("-mno-ext-perf2", "gcc/NDS32-Options.html#index-mno-ext-perf2"),
+DOC_URL ("-mno-ext-string", "gcc/NDS32-Options.html#index-mno-ext-string"),
+DOC_URL ("-mno-extern-sdata", "gcc/MIPS-Options.html#index-mno-extern-sdata"),
+DOC_URL ("-mno-fancy-math-387", "gcc/x86-Options.html#index-mno-fancy-math-387"),
+DOC_URL ("-mno-fast-sw-div", "gcc/Nios-II-Options.html#index-mno-fast-sw-div"),
+DOC_URL ("-mno-faster-structs", "gcc/SPARC-Options.html#index-mno-faster-structs"),
+DOC_URL ("-mno-fdpic", "gcc/ARM-Options.html#index-mno-fdpic"),
+DOC_URL ("-mno-fix", "gcc/DEC-Alpha-Options.html#index-mno-fix"),
+DOC_URL ("-mno-fix-24k", "gcc/MIPS-Options.html#index-mno-fix-24k"),
+DOC_URL ("-mno-fix-cortex-a53-835769", "gcc/AArch64-Options.html#index-mno-fix-cortex-a53-835769"),
+DOC_URL ("-mno-fix-cortex-a53-843419", "gcc/AArch64-Options.html#index-mno-fix-cortex-a53-843419"),
+DOC_URL ("-mno-fix-r10000", "gcc/MIPS-Options.html#index-mno-fix-r10000"),
+DOC_URL ("-mno-fix-r4000", "gcc/MIPS-Options.html#index-mno-fix-r4000"),
+DOC_URL ("-mno-fix-r4400", "gcc/MIPS-Options.html#index-mno-fix-r4400"),
+DOC_URL ("-mno-flat", "gcc/SPARC-Options.html#index-mno-flat"),
+DOC_URL ("-mno-float", "gcc/MIPS-Options.html#index-mno-float"),
+DOC_URL ("-mno-float128", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-float128"),
+DOC_URL ("-mno-float128-hardware", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-float128-hardware"),
+DOC_URL ("-mno-flush-func", "gcc/M32R_002fD-Options.html#index-mno-flush-func"),
+DOC_URL ("-mno-flush-trap", "gcc/M32R_002fD-Options.html#index-mno-flush-trap"),
+DOC_URL ("-mno-fmaf", "gcc/SPARC-Options.html#index-mno-fmaf"),
+DOC_URL ("-mno-fp-in-toc", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-fp-in-toc"),
+DOC_URL ("-mno-fp-regs", "gcc/DEC-Alpha-Options.html#index-mno-fp-regs"),
+DOC_URL ("-mno-fp-ret-in-387", "gcc/x86-Options.html#index-mno-fp-ret-in-387"),
+DOC_URL ("-mno-fprnd", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-fprnd"),
+DOC_URL ("-mno-fsca", "gcc/SH-Options.html#index-mno-fsca"),
+DOC_URL ("-mno-fsmuld", "gcc/SPARC-Options.html#index-mno-fsmuld"),
+DOC_URL ("-mno-fsrra", "gcc/SH-Options.html#index-mno-fsrra"),
+DOC_URL ("-mno-ginv", "gcc/MIPS-Options.html#index-mno-ginv"),
+DOC_URL ("-mno-gnu-as", "gcc/IA-64-Options.html#index-mno-gnu-as"),
+DOC_URL ("-mno-gnu-attribute", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-gnu-attribute"),
+DOC_URL ("-mno-gnu-ld", "gcc/IA-64-Options.html#index-mno-gnu-ld"),
+DOC_URL ("-mno-hardlit", "gcc/MCore-Options.html#index-mno-hardlit"),
+DOC_URL ("-mno-hw-div", "gcc/Nios-II-Options.html#index-mno-hw-div"),
+DOC_URL ("-mno-hw-mul", "gcc/Nios-II-Options.html#index-mno-hw-mul"),
+DOC_URL ("-mno-hw-mulx", "gcc/Nios-II-Options.html#index-mno-hw-mulx"),
+DOC_URL ("-mno-id-shared-library", "gcc/Blackfin-Options.html#index-mno-id-shared-library"),
+DOC_URL ("-mno-ieee", "gcc/SH-Options.html#index-mno-ieee"),
+DOC_URL ("-mno-ieee-fp", "gcc/x86-Options.html#index-mno-ieee-fp"),
+DOC_URL ("-mno-imadd", "gcc/MIPS-Options.html#index-mno-imadd"),
+DOC_URL ("-mno-inline-float-divide", "gcc/IA-64-Options.html#index-mno-inline-float-divide"),
+DOC_URL ("-mno-inline-int-divide", "gcc/IA-64-Options.html#index-mno-inline-int-divide"),
+DOC_URL ("-mno-inline-sqrt", "gcc/IA-64-Options.html#index-mno-inline-sqrt"),
+DOC_URL ("-mno-int16", "gcc/PDP-11-Options.html#index-mno-int16"),
+DOC_URL ("-mno-int32", "gcc/PDP-11-Options.html#index-mno-int32"),
+DOC_URL ("-mno-interlink-compressed", "gcc/MIPS-Options.html#index-mno-interlink-compressed"),
+DOC_URL ("-mno-interlink-mips16", "gcc/MIPS-Options.html#index-mno-interlink-mips16"),
+DOC_URL ("-mno-interrupts", "gcc/AVR-Options.html#index-mno-interrupts"),
+DOC_URL ("-mno-isel", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-isel"),
+DOC_URL ("-mno-jsr", "gcc/RX-Options.html#index-mno-jsr"),
+DOC_URL ("-mno-knuthdiv", "gcc/MMIX-Options.html#index-mno-knuthdiv"),
+DOC_URL ("-mno-leaf-id-shared-library", "gcc/Blackfin-Options.html#index-mno-leaf-id-shared-library"),
+DOC_URL ("-mno-libfuncs", "gcc/MMIX-Options.html#index-mno-libfuncs"),
+DOC_URL ("-mno-liw", "gcc/MN10300-Options.html#index-mno-liw"),
+DOC_URL ("-mno-llsc", "gcc/MIPS-Options.html#index-mno-llsc"),
+DOC_URL ("-mno-load-store-pairs", "gcc/MIPS-Options.html#index-mno-load-store-pairs"),
+DOC_URL ("-mno-local-sdata", "gcc/MIPS-Options.html#index-mno-local-sdata"),
+DOC_URL ("-mno-long-jumps", "gcc/V850-Options.html#index-mno-long-jumps"),
+DOC_URL ("-mno-longcall", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-longcall"),
+DOC_URL ("-mno-longcalls", "gcc/Xtensa-Options.html#index-mno-longcalls"),
+DOC_URL ("-mno-loongson-ext", "gcc/MIPS-Options.html#index-mno-loongson-ext"),
+DOC_URL ("-mno-loongson-ext2", "gcc/MIPS-Options.html#index-mno-loongson-ext2"),
+DOC_URL ("-mno-loongson-mmi", "gcc/MIPS-Options.html#index-mno-loongson-mmi"),
+DOC_URL ("-mno-low-precision-div", "gcc/AArch64-Options.html#index-mno-low-precision-div"),
+DOC_URL ("-mno-low-precision-recip-sqrt", "gcc/AArch64-Options.html#index-mno-low-precision-recip-sqrt"),
+DOC_URL ("-mno-low-precision-sqrt", "gcc/AArch64-Options.html#index-mno-low-precision-sqrt"),
+DOC_URL ("-mno-low64k", "gcc/Blackfin-Options.html#index-mno-low64k"),
+DOC_URL ("-mno-mad", "gcc/MIPS-Options.html#index-mno-mad"),
+DOC_URL ("-mno-max", "gcc/DEC-Alpha-Options.html#index-mno-max"),
+DOC_URL ("-mno-mcount-ra-address", "gcc/MIPS-Options.html#index-mno-mcount-ra-address"),
+DOC_URL ("-mno-mcu", "gcc/MIPS-Options.html#index-mno-mcu"),
+DOC_URL ("-mno-mdmx", "gcc/MIPS-Options.html#index-mno-mdmx"),
+DOC_URL ("-mno-media", "gcc/FRV-Options.html#index-mno-media"),
+DOC_URL ("-mno-memcpy", "gcc/MIPS-Options.html#index-mno-memcpy"),
+DOC_URL ("-mno-mfcrf", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-mfcrf"),
+DOC_URL ("-mno-mips16", "gcc/MIPS-Options.html#index-mno-mips16"),
+DOC_URL ("-mno-mips16e2", "gcc/MIPS-Options.html#index-mno-mips16e2"),
+DOC_URL ("-mno-mips3d", "gcc/MIPS-Options.html#index-mno-mips3d"),
+DOC_URL ("-mno-mma", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-mma"),
+DOC_URL ("-mno-mmicromips", "gcc/MIPS-Options.html#index-mno-mmicromips"),
+DOC_URL ("-mno-mpy", "gcc/ARC-Options.html#index-mno-mpy"),
+DOC_URL ("-mno-ms-bitfields", "gcc/x86-Options.html#index-mno-ms-bitfields"),
+DOC_URL ("-mno-mt", "gcc/MIPS-Options.html#index-mno-mt"),
+DOC_URL ("-mno-mul-bug-workaround", "gcc/CRIS-Options.html#index-mno-mul-bug-workaround"),
+DOC_URL ("-mno-muladd", "gcc/FRV-Options.html#index-mno-muladd"),
+DOC_URL ("-mno-mulhw", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-mulhw"),
+DOC_URL ("-mno-mult-bug", "gcc/MN10300-Options.html#index-mno-mult-bug"),
+DOC_URL ("-mno-multi-cond-exec", "gcc/FRV-Options.html#index-mno-multi-cond-exec"),
+DOC_URL ("-mno-multiple", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-multiple"),
+DOC_URL ("-mno-mvcle", "gcc/S_002f390-and-zSeries-Options.html#index-mno-mvcle"),
+DOC_URL ("-mno-nested-cond-exec", "gcc/FRV-Options.html#index-mno-nested-cond-exec"),
+DOC_URL ("-mno-odd-spreg", "gcc/MIPS-Options.html#index-mno-odd-spreg"),
+DOC_URL ("-mno-omit-leaf-frame-pointer", "gcc/AArch64-Options.html#index-mno-omit-leaf-frame-pointer"),
+DOC_URL ("-mno-optimize-membar", "gcc/FRV-Options.html#index-mno-optimize-membar"),
+DOC_URL ("-mno-pack", "gcc/FRV-Options.html#index-mno-pack"),
+DOC_URL ("-mno-packed-stack", "gcc/S_002f390-and-zSeries-Options.html#index-mno-packed-stack"),
+DOC_URL ("-mno-paired-single", "gcc/MIPS-Options.html#index-mno-paired-single"),
+DOC_URL ("-mno-pc-relative-literal-loads", "gcc/AArch64-Options.html#index-mno-pc-relative-literal-loads"),
+DOC_URL ("-mno-pcrel", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-pcrel"),
+DOC_URL ("-mno-pic", "gcc/IA-64-Options.html#index-mno-pic"),
+DOC_URL ("-mno-pid", "gcc/RX-Options.html#index-mno-pid"),
+DOC_URL ("-mno-plt", "gcc/MIPS-Options.html#index-mno-plt"),
+DOC_URL ("-mno-pltseq", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-pltseq"),
+DOC_URL ("-mno-popc", "gcc/SPARC-Options.html#index-mno-popc"),
+DOC_URL ("-mno-popcntb", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-popcntb"),
+DOC_URL ("-mno-popcntd", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-popcntd"),
+DOC_URL ("-mno-postinc", "gcc/Adapteva-Epiphany-Options.html#index-mno-postinc"),
+DOC_URL ("-mno-postmodify", "gcc/Adapteva-Epiphany-Options.html#index-mno-postmodify"),
+DOC_URL ("-mno-power8-fusion", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-power8-fusion"),
+DOC_URL ("-mno-power8-vector", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-power8-vector"),
+DOC_URL ("-mno-powerpc-gfxopt", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-powerpc-gfxopt"),
+DOC_URL ("-mno-powerpc-gpopt", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-powerpc-gpopt"),
+DOC_URL ("-mno-powerpc64", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-powerpc64"),
+DOC_URL ("-mno-prefixed", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-prefixed"),
+DOC_URL ("-mno-privileged", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-privileged"),
+DOC_URL ("-mno-prolog-function", "gcc/V850-Options.html#index-mno-prolog-function"),
+DOC_URL ("-mno-prologue-epilogue", "gcc/CRIS-Options.html#index-mno-prologue-epilogue"),
+DOC_URL ("-mno-prototype", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-prototype"),
+DOC_URL ("-mno-push-args", "gcc/x86-Options.html#index-mno-push-args"),
+DOC_URL ("-mno-quad-memory", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-quad-memory"),
+DOC_URL ("-mno-quad-memory-atomic", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-quad-memory-atomic"),
+DOC_URL ("-mno-readonly-in-sdata", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-readonly-in-sdata"),
+DOC_URL ("-mno-red-zone", "gcc/x86-Options.html#index-mno-red-zone"),
+DOC_URL ("-mno-register-names", "gcc/IA-64-Options.html#index-mno-register-names"),
+DOC_URL ("-mno-regnames", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-regnames"),
+DOC_URL ("-mno-relax-immediate", "gcc/MCore-Options.html#index-mno-relax-immediate"),
+DOC_URL ("-mno-relocatable", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-relocatable"),
+DOC_URL ("-mno-relocatable-lib", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-relocatable-lib"),
+DOC_URL ("-mno-renesas", "gcc/SH-Options.html#index-mno-renesas"),
+DOC_URL ("-mno-rop-protect", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-rop-protect"),
+DOC_URL ("-mno-round-nearest", "gcc/Adapteva-Epiphany-Options.html#index-mno-round-nearest"),
+DOC_URL ("-mno-save-mduc-in-interrupts", "gcc/RL78-Options.html#index-mno-save-mduc-in-interrupts"),
+DOC_URL ("-mno-scc", "gcc/FRV-Options.html#index-mno-scc"),
+DOC_URL ("-mno-sched-ar-data-spec", "gcc/IA-64-Options.html#index-mno-sched-ar-data-spec"),
+DOC_URL ("-mno-sched-ar-in-data-spec", "gcc/IA-64-Options.html#index-mno-sched-ar-in-data-spec"),
+DOC_URL ("-mno-sched-br-data-spec", "gcc/IA-64-Options.html#index-mno-sched-br-data-spec"),
+DOC_URL ("-mno-sched-br-in-data-spec", "gcc/IA-64-Options.html#index-mno-sched-br-in-data-spec"),
+DOC_URL ("-mno-sched-control-spec", "gcc/IA-64-Options.html#index-mno-sched-control-spec"),
+DOC_URL ("-mno-sched-count-spec-in-critical-path", "gcc/IA-64-Options.html#index-mno-sched-count-spec-in-critical-path"),
+DOC_URL ("-mno-sched-in-control-spec", "gcc/IA-64-Options.html#index-mno-sched-in-control-spec"),
+DOC_URL ("-mno-sched-prefer-non-control-spec-insns", "gcc/IA-64-Options.html#index-mno-sched-prefer-non-control-spec-insns"),
+DOC_URL ("-mno-sched-prefer-non-data-spec-insns", "gcc/IA-64-Options.html#index-mno-sched-prefer-non-data-spec-insns"),
+DOC_URL ("-mno-sched-prolog", "gcc/ARM-Options.html#index-mno-sched-prolog"),
+DOC_URL ("-mno-sep-data", "gcc/Blackfin-Options.html#index-mno-sep-data"),
+DOC_URL ("-mno-serialize-volatile", "gcc/Xtensa-Options.html#index-mno-serialize-volatile"),
+DOC_URL ("-mno-setlb", "gcc/MN10300-Options.html#index-mno-setlb"),
+DOC_URL ("-mno-short", "gcc/M680x0-Options.html#index-mno-short"),
+DOC_URL ("-mno-side-effects", "gcc/CRIS-Options.html#index-mno-side-effects"),
+DOC_URL ("-mno-sim", "gcc/RX-Options.html#index-mno-sim"),
+DOC_URL ("-mno-single-exit", "gcc/MMIX-Options.html#index-mno-single-exit"),
+DOC_URL ("-mno-slow-bytes", "gcc/MCore-Options.html#index-mno-slow-bytes"),
+DOC_URL ("-mno-small-exec", "gcc/S_002f390-and-zSeries-Options.html#index-mno-small-exec"),
+DOC_URL ("-mno-smartmips", "gcc/MIPS-Options.html#index-mno-smartmips"),
+DOC_URL ("-mno-soft-cmpsf", "gcc/Adapteva-Epiphany-Options.html#index-mno-soft-cmpsf"),
+DOC_URL ("-mno-soft-float", "gcc/DEC-Alpha-Options.html#index-mno-soft-float"),
+DOC_URL ("-mno-space-regs", "gcc/HPPA-Options.html#index-mno-space-regs"),
+DOC_URL ("-mno-specld-anomaly", "gcc/Blackfin-Options.html#index-mno-specld-anomaly"),
+DOC_URL ("-mno-split-addresses", "gcc/MIPS-Options.html#index-mno-split-addresses"),
+DOC_URL ("-mno-split-lohi", "gcc/Adapteva-Epiphany-Options.html#index-mno-split-lohi"),
+DOC_URL ("-mno-stack-align", "gcc/CRIS-Options.html#index-mno-stack-align"),
+DOC_URL ("-mno-stack-bias", "gcc/SPARC-Options.html#index-mno-stack-bias"),
+DOC_URL ("-mno-std-struct-return", "gcc/SPARC-Options.html#index-mno-std-struct-return"),
+DOC_URL ("-mno-subxc", "gcc/SPARC-Options.html#index-mno-subxc"),
+DOC_URL ("-mno-sum-in-toc", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-sum-in-toc"),
+DOC_URL ("-mno-sym32", "gcc/MIPS-Options.html#index-mno-sym32"),
+DOC_URL ("-mno-target-align", "gcc/Xtensa-Options.html#index-mno-target-align"),
+DOC_URL ("-mno-text-section-literals", "gcc/Xtensa-Options.html#index-mno-text-section-literals"),
+DOC_URL ("-mno-tls-markers", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-tls-markers"),
+DOC_URL ("-mno-toc", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-toc"),
+DOC_URL ("-mno-toplevel-symbols", "gcc/MMIX-Options.html#index-mno-toplevel-symbols"),
+DOC_URL ("-mno-tpf-trace", "gcc/S_002f390-and-zSeries-Options.html#index-mno-tpf-trace"),
+DOC_URL ("-mno-tpf-trace-skip", "gcc/S_002f390-and-zSeries-Options.html#index-mno-tpf-trace-skip"),
+DOC_URL ("-mno-unaligned-doubles", "gcc/SPARC-Options.html#index-mno-unaligned-doubles"),
+DOC_URL ("-mno-uninit-const-in-rodata", "gcc/MIPS-Options.html#index-mno-uninit-const-in-rodata"),
+DOC_URL ("-mno-unroll-only-small-loops", "gcc/x86-Options.html#index-mno-unroll-only-small-loops"),
+DOC_URL ("-mno-update", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-update"),
+DOC_URL ("-mno-user-mode", "gcc/SPARC-Options.html#index-mno-user-mode"),
+DOC_URL ("-mno-usermode", "gcc/SH-Options.html#index-mno-usermode"),
+DOC_URL ("-mno-v3push", "gcc/NDS32-Options.html#index-mno-v3push"),
+DOC_URL ("-mno-v8plus", "gcc/SPARC-Options.html#index-mno-v8plus"),
+DOC_URL ("-mno-vect-double", "gcc/Adapteva-Epiphany-Options.html#index-mno-vect-double"),
+DOC_URL ("-mno-virt", "gcc/MIPS-Options.html#index-mno-virt"),
+DOC_URL ("-mno-vis", "gcc/SPARC-Options.html#index-mno-vis"),
+DOC_URL ("-mno-vis2", "gcc/SPARC-Options.html#index-mno-vis2"),
+DOC_URL ("-mno-vis3", "gcc/SPARC-Options.html#index-mno-vis3"),
+DOC_URL ("-mno-vis4", "gcc/SPARC-Options.html#index-mno-vis4"),
+DOC_URL ("-mno-vis4b", "gcc/SPARC-Options.html#index-mno-vis4b"),
+DOC_URL ("-mno-vliw-branch", "gcc/FRV-Options.html#index-mno-vliw-branch"),
+DOC_URL ("-mno-volatile-asm-stop", "gcc/IA-64-Options.html#index-mno-volatile-asm-stop"),
+DOC_URL ("-mno-volatile-cache", "gcc/ARC-Options.html#index-mno-volatile-cache"),
+DOC_URL ("-mno-vrsave", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-vrsave"),
+DOC_URL ("-mno-vsx", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-vsx"),
+DOC_URL ("-mno-vx", "gcc/S_002f390-and-zSeries-Options.html#index-mno-vx"),
+DOC_URL ("-mno-warn-devices-csv", "gcc/MSP430-Options.html#index-mno-warn-devices-csv"),
+DOC_URL ("-mno-warn-mcu", "gcc/MSP430-Options.html#index-mno-warn-mcu"),
+DOC_URL ("-mno-warn-multiple-fast-interrupts", "gcc/RX-Options.html#index-mno-warn-multiple-fast-interrupts"),
+DOC_URL ("-mno-wide-bitfields", "gcc/MCore-Options.html#index-mno-wide-bitfields"),
+DOC_URL ("-mno-xl-compat", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-xl-compat"),
+DOC_URL ("-mno-xpa", "gcc/MIPS-Options.html#index-mno-xpa"),
+DOC_URL ("-mno-zdcbranch", "gcc/SH-Options.html#index-mno-zdcbranch"),
+DOC_URL ("-mno-zero-extend", "gcc/MMIX-Options.html#index-mno-zero-extend"),
+DOC_URL ("-mno-zvector", "gcc/S_002f390-and-zSeries-Options.html#index-mno-zvector"),
+DOC_URL ("-mnobitfield", "gcc/M680x0-Options.html#index-mnobitfield"),
+DOC_URL ("-mnodiv", "gcc/FT32-Options.html#index-mnodiv"),
+DOC_URL ("-mnomacsave", "gcc/SH-Options.html#index-mnomacsave"),
+DOC_URL ("-mnop-fun-dllimport", "gcc/x86-Windows-Options.html#index-mnop-fun-dllimport"),
+DOC_URL ("-mnop-mcount", "gcc/x86-Options.html#index-mnop-mcount"),
+DOC_URL ("-mnopm", "gcc/FT32-Options.html#index-mnopm"),
+DOC_URL ("-mnops", "gcc/Adapteva-Epiphany-Options.html#index-mnops"),
+DOC_URL ("-mnorm", "gcc/ARC-Options.html#index-mnorm"),
+DOC_URL ("-modd-spreg", "gcc/MIPS-Options.html#index-modd-spreg"),
+DOC_URL ("-mone-byte-bool", "gcc/Darwin-Options.html#index-mone-byte-bool"),
+DOC_URL ("-moptimize", "gcc/Nvidia-PTX-Options.html#index-moptimize"),
+DOC_URL ("-mordered", "gcc/HPPA-Options.html#index-mordered"),
+DOC_URL ("-moverride", "gcc/AArch64-Options.html#index-moverride"),
+DOC_URL ("-mpa-risc-1-0", "gcc/HPPA-Options.html#index-mpa-risc-1-0"),
+DOC_URL ("-mpa-risc-1-1", "gcc/HPPA-Options.html#index-mpa-risc-1-1"),
+DOC_URL ("-mpa-risc-2-0", "gcc/HPPA-Options.html#index-mpa-risc-2-0"),
+DOC_URL ("-mpack", "gcc/FRV-Options.html#index-mpack"),
+DOC_URL ("-mpacked-stack", "gcc/S_002f390-and-zSeries-Options.html#index-mpacked-stack"),
+DOC_URL ("-mpadstruct", "gcc/SH-Options.html#index-mpadstruct"),
+DOC_URL ("-mpaired-single", "gcc/MIPS-Options.html#index-mpaired-single"),
+DOC_URL ("-mpartial-vector-fp-math", "gcc/x86-Options.html#index-mpartial-vector-fp-math"),
+DOC_URL ("-mpc-relative-literal-loads", "gcc/AArch64-Options.html#index-mpc-relative-literal-loads"),
+DOC_URL ("-mpc32", "gcc/x86-Options.html#index-mpc32"),
+DOC_URL ("-mpc64", "gcc/x86-Options.html#index-mpc64"),
+DOC_URL ("-mpc80", "gcc/x86-Options.html#index-mpc80"),
+DOC_URL ("-mpclmul", "gcc/x86-Options.html#index-mpclmul"),
+DOC_URL ("-mpconfig", "gcc/x86-Options.html#index-mpconfig"),
+DOC_URL ("-mpdebug", "gcc/CRIS-Options.html#index-mpdebug"),
+DOC_URL ("-mpe", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mpe"),
+DOC_URL ("-mpe-aligned-commons", "gcc/x86-Windows-Options.html#index-mpe-aligned-commons"),
+DOC_URL ("-mpic-register", "gcc/ARM-Options.html#index-mpic-register"),
+DOC_URL ("-mpid", "gcc/RX-Options.html#index-mpid"),
+DOC_URL ("-mpku", "gcc/x86-Options.html#index-mpku"),
+DOC_URL ("-mplt", "gcc/MIPS-Options.html#index-mplt"),
+DOC_URL ("-mpltseq", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mpltseq"),
+DOC_URL ("-mpointer-size=<var>size</var>", "gcc/VMS-Options.html#index-mpointer-size_003dsize"),
+DOC_URL ("-mpointers-to-nested-functions", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mpointers-to-nested-functions"),
+DOC_URL ("-mpoke-function-name", "gcc/ARM-Options.html#index-mpoke-function-name"),
+DOC_URL ("-mpopc", "gcc/SPARC-Options.html#index-mpopc"),
+DOC_URL ("-mpopcnt", "gcc/x86-Options.html#index-mpopcnt"),
+DOC_URL ("-mpopcntb", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mpopcntb"),
+DOC_URL ("-mpopcntd", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mpopcntd"),
+DOC_URL ("-mportable-runtime", "gcc/HPPA-Options.html#index-mportable-runtime"),
+DOC_URL ("-mpostinc", "gcc/Adapteva-Epiphany-Options.html#index-mpostinc"),
+DOC_URL ("-mpostmodify", "gcc/Adapteva-Epiphany-Options.html#index-mpostmodify"),
+DOC_URL ("-mpower8-fusion", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mpower8-fusion"),
+DOC_URL ("-mpower8-vector", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mpower8-vector"),
+DOC_URL ("-mpowerpc-gfxopt", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mpowerpc-gfxopt"),
+DOC_URL ("-mpowerpc-gpopt", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mpowerpc-gpopt"),
+DOC_URL ("-mpowerpc64", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mpowerpc64"),
+DOC_URL ("-mprefer-avx128", "gcc/x86-Options.html#index-mprefer-avx128"),
+DOC_URL ("-mprefer-short-insn-regs", "gcc/Adapteva-Epiphany-Options.html#index-mprefer-short-insn-regs"),
+DOC_URL ("-mprefer-vector-width", "gcc/x86-Options.html#index-mprefer-vector-width"),
+DOC_URL ("-mprefergot", "gcc/SH-Options.html#index-mprefergot"),
+DOC_URL ("-mprefetchi", "gcc/x86-Options.html#index-mprefetchi"),
+DOC_URL ("-mprefetchwt1", "gcc/x86-Options.html#index-mprefetchwt1"),
+DOC_URL ("-mprefixed", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mprefixed"),
+DOC_URL ("-mpretend-cmove", "gcc/SH-Options.html#index-mpretend-cmove"),
+DOC_URL ("-mprfchw", "gcc/x86-Options.html#index-mprfchw"),
+DOC_URL ("-mprint-tune-info", "gcc/ARM-Options.html#index-mprint-tune-info"),
+DOC_URL ("-mprioritize-restricted-insns", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mprioritize-restricted-insns"),
+DOC_URL ("-mprivileged", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mprivileged"),
+DOC_URL ("-mprolog-function", "gcc/V850-Options.html#index-mprolog-function"),
+DOC_URL ("-mprologue-epilogue", "gcc/CRIS-Options.html#index-mprologue-epilogue"),
+DOC_URL ("-mprototype", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mprototype"),
+DOC_URL ("-mptwrite", "gcc/x86-Options.html#index-mptwrite"),
+DOC_URL ("-mptx", "gcc/Nvidia-PTX-Options.html#index-mptx"),
+DOC_URL ("-mpure-code", "gcc/ARM-Options.html#index-mpure-code"),
+DOC_URL ("-mpush-args", "gcc/x86-Options.html#index-mpush-args"),
+DOC_URL ("-mpushpop", "gcc/C-SKY-Options.html#index-mpushpop"),
+DOC_URL ("-mq-class", "gcc/ARC-Options.html#index-mq-class"),
+DOC_URL ("-mquad-memory", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mquad-memory"),
+DOC_URL ("-mquad-memory-atomic", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mquad-memory-atomic"),
+DOC_URL ("-mr0rel-sec", "gcc/Nios-II-Options.html#index-mr0rel-sec"),
+DOC_URL ("-mr10k-cache-barrier", "gcc/MIPS-Options.html#index-mr10k-cache-barrier"),
+DOC_URL ("-mraoint", "gcc/x86-Options.html#index-mraoint"),
+DOC_URL ("-mrdpid", "gcc/x86-Options.html#index-mrdpid"),
+DOC_URL ("-mrdrnd", "gcc/x86-Options.html#index-mrdrnd"),
+DOC_URL ("-mrdseed", "gcc/x86-Options.html#index-mrdseed"),
+DOC_URL ("-mreadonly-in-sdata", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mreadonly-in-sdata"),
+DOC_URL ("-mrecip-precision", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mrecip-precision"),
+DOC_URL ("-mrecord-mcount", "gcc/x86-Options.html#index-mrecord-mcount"),
+DOC_URL ("-mrecord-return", "gcc/x86-Options.html#index-mrecord-return"),
+DOC_URL ("-mred-zone", "gcc/x86-Options.html#index-mred-zone"),
+DOC_URL ("-mreduced-regs", "gcc/NDS32-Options.html#index-mreduced-regs"),
+DOC_URL ("-mregister-names", "gcc/IA-64-Options.html#index-mregister-names"),
+DOC_URL ("-mregnames", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mregnames"),
+DOC_URL ("-mregparm", "gcc/x86-Options.html#index-mregparm"),
+DOC_URL ("-mrelax-cmpxchg-loop", "gcc/x86-Options.html#index-mrelax-cmpxchg-loop"),
+DOC_URL ("-mrelax-immediate", "gcc/MCore-Options.html#index-mrelax-immediate"),
+DOC_URL ("-mrelax-pic-calls", "gcc/MIPS-Options.html#index-mrelax-pic-calls"),
+DOC_URL ("-mrelocatable", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mrelocatable"),
+DOC_URL ("-mrelocatable-lib", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mrelocatable-lib"),
+DOC_URL ("-mrenesas", "gcc/SH-Options.html#index-mrenesas"),
+DOC_URL ("-mrestrict-it", "gcc/ARM-Options.html#index-mrestrict-it"),
+DOC_URL ("-mreturn-pointer-on-d0", "gcc/MN10300-Options.html#index-mreturn-pointer-on-d0"),
+DOC_URL ("-mrf16", "gcc/ARC-Options.html#index-mrf16"),
+DOC_URL ("-mrgf-banked-regs", "gcc/ARC-Options.html#index-mrgf-banked-regs"),
+DOC_URL ("-mrh850-abi", "gcc/V850-Options.html#index-mrh850-abi"),
+DOC_URL ("-mriscv-attribute", "gcc/RISC-V-Options.html#index-mriscv-attribute"),
+DOC_URL ("-mrl78", "gcc/RL78-Options.html#index-mrl78"),
+DOC_URL ("-mrmw", "gcc/AVR-Options.html#index-mrmw"),
+DOC_URL ("-mrop-protect", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mrop-protect"),
+DOC_URL ("-mror", "gcc/OpenRISC-Options.html#index-mror"),
+DOC_URL ("-mrori", "gcc/OpenRISC-Options.html#index-mrori"),
+DOC_URL ("-mround-nearest", "gcc/Adapteva-Epiphany-Options.html#index-mround-nearest"),
+DOC_URL ("-mrtm", "gcc/x86-Options.html#index-mrtm"),
+DOC_URL ("-mrtp", "gcc/VxWorks-Options.html#index-mrtp"),
+DOC_URL ("-mrtsc", "gcc/ARC-Options.html#index-mrtsc"),
+DOC_URL ("-ms", "gcc/H8_002f300-Options.html#index-ms"),
+DOC_URL ("-ms2600", "gcc/H8_002f300-Options.html#index-ms2600"),
+DOC_URL ("-msahf", "gcc/x86-Options.html#index-msahf"),
+DOC_URL ("-msave-acc-in-interrupts", "gcc/RX-Options.html#index-msave-acc-in-interrupts"),
+DOC_URL ("-msave-mduc-in-interrupts", "gcc/RL78-Options.html#index-msave-mduc-in-interrupts"),
+DOC_URL ("-msave-restore", "gcc/RISC-V-Options.html#index-msave-restore"),
+DOC_URL ("-msave-toc-indirect", "gcc/RS_002f6000-and-PowerPC-Options.html#index-msave-toc-indirect"),
+DOC_URL ("-mscc", "gcc/FRV-Options.html#index-mscc"),
+DOC_URL ("-msched-ar-data-spec", "gcc/IA-64-Options.html#index-msched-ar-data-spec"),
+DOC_URL ("-msched-ar-in-data-spec", "gcc/IA-64-Options.html#index-msched-ar-in-data-spec"),
+DOC_URL ("-msched-br-data-spec", "gcc/IA-64-Options.html#index-msched-br-data-spec"),
+DOC_URL ("-msched-br-in-data-spec", "gcc/IA-64-Options.html#index-msched-br-in-data-spec"),
+DOC_URL ("-msched-control-spec", "gcc/IA-64-Options.html#index-msched-control-spec"),
+DOC_URL ("-msched-costly-dep", "gcc/RS_002f6000-and-PowerPC-Options.html#index-msched-costly-dep"),
+DOC_URL ("-msched-count-spec-in-critical-path", "gcc/IA-64-Options.html#index-msched-count-spec-in-critical-path"),
+DOC_URL ("-msched-fp-mem-deps-zero-cost", "gcc/IA-64-Options.html#index-msched-fp-mem-deps-zero-cost"),
+DOC_URL ("-msched-in-control-spec", "gcc/IA-64-Options.html#index-msched-in-control-spec"),
+DOC_URL ("-msched-max-memory-insns", "gcc/IA-64-Options.html#index-msched-max-memory-insns"),
+DOC_URL ("-msched-max-memory-insns-hard-limit", "gcc/IA-64-Options.html#index-msched-max-memory-insns-hard-limit"),
+DOC_URL ("-msched-prefer-non-control-spec-insns", "gcc/IA-64-Options.html#index-msched-prefer-non-control-spec-insns"),
+DOC_URL ("-msched-prefer-non-data-spec-insns", "gcc/IA-64-Options.html#index-msched-prefer-non-data-spec-insns"),
+DOC_URL ("-msched-stop-bits-after-every-cycle", "gcc/IA-64-Options.html#index-msched-stop-bits-after-every-cycle"),
+DOC_URL ("-mschedule", "gcc/HPPA-Options.html#index-mschedule"),
+DOC_URL ("-msda", "gcc/V850-Options.html#index-msda"),
+DOC_URL ("-msdata=all", "gcc/C6X-Options.html#index-msdata_003dall"),
+DOC_URL ("-msdata=data", "gcc/RS_002f6000-and-PowerPC-Options.html#index-msdata_003ddata"),
+DOC_URL ("-msdata=eabi", "gcc/RS_002f6000-and-PowerPC-Options.html#index-msdata_003deabi"),
+DOC_URL ("-msdata=sdata", "gcc/M32R_002fD-Options.html#index-msdata_003dsdata"),
+DOC_URL ("-msdata=sysv", "gcc/RS_002f6000-and-PowerPC-Options.html#index-msdata_003dsysv"),
+DOC_URL ("-msdata=use", "gcc/M32R_002fD-Options.html#index-msdata_003duse"),
+DOC_URL ("-msdiv", "gcc/eBPF-Options.html#index-msdiv"),
+DOC_URL ("-msdram", "gcc/Blackfin-Options.html#index-msdram"),
+DOC_URL ("-msecure-plt", "gcc/RS_002f6000-and-PowerPC-Options.html#index-msecure-plt"),
+DOC_URL ("-msecurity", "gcc/C-SKY-Options.html#index-msecurity"),
+DOC_URL ("-msel-sched-dont-check-control-spec", "gcc/IA-64-Options.html#index-msel-sched-dont-check-control-spec"),
+DOC_URL ("-mserialize", "gcc/x86-Options.html#index-mserialize"),
+DOC_URL ("-mserialize-volatile", "gcc/Xtensa-Options.html#index-mserialize-volatile"),
+DOC_URL ("-msetlb", "gcc/MN10300-Options.html#index-msetlb"),
+DOC_URL ("-msext", "gcc/OpenRISC-Options.html#index-msext"),
+DOC_URL ("-msfimm", "gcc/OpenRISC-Options.html#index-msfimm"),
+DOC_URL ("-msgx", "gcc/x86-Options.html#index-msgx"),
+DOC_URL ("-msha", "gcc/x86-Options.html#index-msha"),
+DOC_URL ("-msha512", "gcc/x86-Options.html#index-msha512"),
+DOC_URL ("-mshared-library-id", "gcc/Blackfin-Options.html#index-mshared-library-id"),
+DOC_URL ("-mshftimm", "gcc/OpenRISC-Options.html#index-mshftimm"),
+DOC_URL ("-mshort", "gcc/M680x0-Options.html#index-mshort"),
+DOC_URL ("-mshort-calls", "gcc/AVR-Options.html#index-mshort-calls"),
+DOC_URL ("-mshorten-memrefs", "gcc/RISC-V-Options.html#index-mshorten-memrefs"),
+DOC_URL ("-mshstk", "gcc/x86-Options.html#index-mshstk"),
+DOC_URL ("-mside-effects", "gcc/CRIS-Options.html#index-mside-effects"),
+DOC_URL ("-msign-extend-enabled", "gcc/LM32-Options.html#index-msign-extend-enabled"),
+DOC_URL ("-msign-return-address", "gcc/AArch64-Options.html#index-msign-return-address"),
+DOC_URL ("-msilicon-errata", "gcc/MSP430-Options.html#index-msilicon-errata"),
+DOC_URL ("-msilicon-errata-warn", "gcc/MSP430-Options.html#index-msilicon-errata-warn"),
+DOC_URL ("-msingle-exit", "gcc/MMIX-Options.html#index-msingle-exit"),
+DOC_URL ("-msio", "gcc/HPPA-Options.html#index-msio"),
+DOC_URL ("-msize-level", "gcc/ARC-Options.html#index-msize-level"),
+DOC_URL ("-mskip-rax-setup", "gcc/x86-Options.html#index-mskip-rax-setup"),
+DOC_URL ("-mslow-bytes", "gcc/MCore-Options.html#index-mslow-bytes"),
+DOC_URL ("-mslow-flash-data", "gcc/ARM-Options.html#index-mslow-flash-data"),
+DOC_URL ("-msm3", "gcc/x86-Options.html#index-msm3"),
+DOC_URL ("-msm4", "gcc/x86-Options.html#index-msm4"),
+DOC_URL ("-msmall", "gcc/MSP430-Options.html#index-msmall"),
+DOC_URL ("-msmall-data", "gcc/DEC-Alpha-Options.html#index-msmall-data"),
+DOC_URL ("-msmall-divides", "gcc/MicroBlaze-Options.html#index-msmall-divides"),
+DOC_URL ("-msmall-exec", "gcc/S_002f390-and-zSeries-Options.html#index-msmall-exec"),
+DOC_URL ("-msmall-model", "gcc/FR30-Options.html#index-msmall-model"),
+DOC_URL ("-msmall-text", "gcc/DEC-Alpha-Options.html#index-msmall-text"),
+DOC_URL ("-msmall16", "gcc/Adapteva-Epiphany-Options.html#index-msmall16"),
+DOC_URL ("-msmallc", "gcc/Nios-II-Options.html#index-msmallc"),
+DOC_URL ("-msmart", "gcc/C-SKY-Options.html#index-msmart"),
+DOC_URL ("-msmartmips", "gcc/MIPS-Options.html#index-msmartmips"),
+DOC_URL ("-msmov", "gcc/eBPF-Options.html#index-msmov"),
+DOC_URL ("-msmp", "gcc/VxWorks-Options.html#index-msmp"),
+DOC_URL ("-msoft-cmpsf", "gcc/Adapteva-Epiphany-Options.html#index-msoft-cmpsf"),
+DOC_URL ("-msoft-div", "gcc/OpenRISC-Options.html#index-msoft-div"),
+DOC_URL ("-msoft-mul", "gcc/OpenRISC-Options.html#index-msoft-mul"),
+DOC_URL ("-msoft-mult", "gcc/HPPA-Options.html#index-msoft-mult"),
+DOC_URL ("-msoft-quad-float", "gcc/SPARC-Options.html#index-msoft-quad-float"),
+DOC_URL ("-msoft-stack", "gcc/Nvidia-PTX-Options.html#index-msoft-stack"),
+DOC_URL ("-msp8", "gcc/AVR-Options.html#index-msp8"),
+DOC_URL ("-mspace", "gcc/V850-Options.html#index-mspace"),
+DOC_URL ("-mspace-regs", "gcc/HPPA-Options.html#index-mspace-regs"),
+DOC_URL ("-mspfp", "gcc/ARC-Options.html#index-mspfp"),
+DOC_URL ("-mspfp-compact", "gcc/ARC-Options.html#index-mspfp-compact"),
+DOC_URL ("-mspfp-fast", "gcc/ARC-Options.html#index-mspfp-fast"),
+DOC_URL ("-mspfp_compact", "gcc/ARC-Options.html#index-mspfp_005fcompact"),
+DOC_URL ("-mspfp_fast", "gcc/ARC-Options.html#index-mspfp_005ffast"),
+DOC_URL ("-msplit", "gcc/PDP-11-Options.html#index-msplit"),
+DOC_URL ("-msplit-addresses", "gcc/MIPS-Options.html#index-msplit-addresses"),
+DOC_URL ("-msplit-lohi", "gcc/Adapteva-Epiphany-Options.html#index-msplit-lohi"),
+DOC_URL ("-msplit-vecmove-early", "gcc/Adapteva-Epiphany-Options.html#index-msplit-vecmove-early"),
+DOC_URL ("-msram-ecc", "gcc/AMD-GCN-Options.html#index-msram-ecc"),
+DOC_URL ("-msse", "gcc/x86-Options.html#index-msse"),
+DOC_URL ("-msse2", "gcc/x86-Options.html#index-msse2"),
+DOC_URL ("-msse2avx", "gcc/x86-Options.html#index-msse2avx"),
+DOC_URL ("-msse3", "gcc/x86-Options.html#index-msse3"),
+DOC_URL ("-msse4", "gcc/x86-Options.html#index-msse4"),
+DOC_URL ("-msse4.1", "gcc/x86-Options.html#index-msse4_002e1"),
+DOC_URL ("-msse4.2", "gcc/x86-Options.html#index-msse4_002e2"),
+DOC_URL ("-msse4a", "gcc/x86-Options.html#index-msse4a"),
+DOC_URL ("-msseregparm", "gcc/x86-Options.html#index-msseregparm"),
+DOC_URL ("-mssse3", "gcc/x86-Options.html#index-mssse3"),
+DOC_URL ("-mstack-align", "gcc/CRIS-Options.html#index-mstack-align"),
+DOC_URL ("-mstack-bias", "gcc/SPARC-Options.html#index-mstack-bias"),
+DOC_URL ("-mstack-check-l1", "gcc/Blackfin-Options.html#index-mstack-check-l1"),
+DOC_URL ("-mstack-guard", "gcc/S_002f390-and-zSeries-Options.html#index-mstack-guard"),
+DOC_URL ("-mstack-increment", "gcc/MCore-Options.html#index-mstack-increment"),
+DOC_URL ("-mstack-offset", "gcc/Adapteva-Epiphany-Options.html#index-mstack-offset"),
+DOC_URL ("-mstack-protector-guard-symbol", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mstack-protector-guard-symbol"),
+DOC_URL ("-mstackrealign", "gcc/x86-Options.html#index-mstackrealign"),
+DOC_URL ("-mstd-struct-return", "gcc/SPARC-Options.html#index-mstd-struct-return"),
+DOC_URL ("-mstore-max", "gcc/x86-Options.html#index-mstore-max"),
+DOC_URL ("-mstrict-X", "gcc/AVR-Options.html#index-mstrict-X"),
+DOC_URL ("-mstring-compare-inline-limit", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mstring-compare-inline-limit"),
+DOC_URL ("-mstringop-strategy=<var>alg</var>", "gcc/x86-Options.html#index-mstringop-strategy_003dalg"),
+DOC_URL ("-mstructure-size-boundary", "gcc/ARM-Options.html#index-mstructure-size-boundary"),
+DOC_URL ("-msubxc", "gcc/SPARC-Options.html#index-msubxc"),
+DOC_URL ("-msv-mode", "gcc/Visium-Options.html#index-msv-mode"),
+DOC_URL ("-msve-vector-bits", "gcc/AArch64-Options.html#index-msve-vector-bits"),
+DOC_URL ("-msvr4-struct-return", "gcc/RS_002f6000-and-PowerPC-Options.html#index-msvr4-struct-return"),
+DOC_URL ("-mswap", "gcc/ARC-Options.html#index-mswap"),
+DOC_URL ("-mswape", "gcc/ARC-Options.html#index-mswape"),
+DOC_URL ("-msym32", "gcc/MIPS-Options.html#index-msym32"),
+DOC_URL ("-msynci", "gcc/MIPS-Options.html#index-msynci"),
+DOC_URL ("-msys-crt0", "gcc/Nios-II-Options.html#index-msys-crt0"),
+DOC_URL ("-msys-lib", "gcc/Nios-II-Options.html#index-msys-lib"),
+DOC_URL ("-mtarget-align", "gcc/Xtensa-Options.html#index-mtarget-align"),
+DOC_URL ("-mtas", "gcc/SH-Options.html#index-mtas"),
+DOC_URL ("-mtbm", "gcc/x86-Options.html#index-mtbm"),
+DOC_URL ("-mtda", "gcc/V850-Options.html#index-mtda"),
+DOC_URL ("-mtelephony", "gcc/ARC-Options.html#index-mtelephony"),
+DOC_URL ("-mtext-section-literals", "gcc/Xtensa-Options.html#index-mtext-section-literals"),
+DOC_URL ("-mthumb", "gcc/ARM-Options.html#index-mthumb"),
+DOC_URL ("-mthumb-interwork", "gcc/ARM-Options.html#index-mthumb-interwork"),
+DOC_URL ("-mtiny-printf", "gcc/MSP430-Options.html#index-mtiny-printf"),
+DOC_URL ("-mtiny-stack", "gcc/AVR-Options.html#index-mtiny-stack"),
+DOC_URL ("-mtls", "gcc/FRV-Options.html#index-mtls"),
+DOC_URL ("-mtls-dialect=desc", "gcc/AArch64-Options.html#index-mtls-dialect_003ddesc"),
+DOC_URL ("-mtls-dialect=traditional", "gcc/AArch64-Options.html#index-mtls-dialect_003dtraditional"),
+DOC_URL ("-mtls-direct-seg-refs", "gcc/x86-Options.html#index-mtls-direct-seg-refs"),
+DOC_URL ("-mtls-markers", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mtls-markers"),
+DOC_URL ("-mtoc", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mtoc"),
+DOC_URL ("-mtomcat-stats", "gcc/FRV-Options.html#index-mtomcat-stats"),
+DOC_URL ("-mtoplevel-symbols", "gcc/MMIX-Options.html#index-mtoplevel-symbols"),
+DOC_URL ("-mtp-regno", "gcc/ARC-Options.html#index-mtp-regno"),
+DOC_URL ("-mtpcs-frame", "gcc/ARM-Options.html#index-mtpcs-frame"),
+DOC_URL ("-mtpcs-leaf-frame", "gcc/ARM-Options.html#index-mtpcs-leaf-frame"),
+DOC_URL ("-mtpf-trace", "gcc/S_002f390-and-zSeries-Options.html#index-mtpf-trace"),
+DOC_URL ("-mtpf-trace-skip", "gcc/S_002f390-and-zSeries-Options.html#index-mtpf-trace-skip"),
+DOC_URL ("-mtraceback", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mtraceback"),
+DOC_URL ("-mtrap-precision", "gcc/DEC-Alpha-Options.html#index-mtrap-precision"),
+DOC_URL ("-mtrust", "gcc/C-SKY-Options.html#index-mtrust"),
+DOC_URL ("-mtsxldtrk", "gcc/x86-Options.html#index-mtsxldtrk"),
+DOC_URL ("-mtune-ctrl=<var>feature-list</var>", "gcc/x86-Options.html#index-mtune-ctrl_003dfeature-list"),
+DOC_URL ("-muclibc", "gcc/GNU_002fLinux-Options.html#index-muclibc"),
+DOC_URL ("-muintr", "gcc/x86-Options.html#index-muintr"),
+DOC_URL ("-multcost", "gcc/ARC-Options.html#index-multcost"),
+DOC_URL ("-multcost=<var>number</var>", "gcc/SH-Options.html#index-multcost_003dnumber"),
+DOC_URL ("-multi_module", "gcc/Darwin-Options.html#index-multi_005fmodule"),
+DOC_URL ("-multilib-library-pic", "gcc/FRV-Options.html#index-multilib-library-pic"),
+DOC_URL ("-multiply-enabled", "gcc/LM32-Options.html#index-multiply-enabled"),
+DOC_URL ("-multiply_defined", "gcc/Darwin-Options.html#index-multiply_005fdefined"),
+DOC_URL ("-multiply_defined_unused", "gcc/Darwin-Options.html#index-multiply_005fdefined_005funused"),
+DOC_URL ("-munalign-prob-threshold", "gcc/ARC-Options.html#index-munalign-prob-threshold"),
+DOC_URL ("-munaligned-doubles", "gcc/SPARC-Options.html#index-munaligned-doubles"),
+DOC_URL ("-municode", "gcc/x86-Windows-Options.html#index-municode"),
+DOC_URL ("-muniform-simt", "gcc/Nvidia-PTX-Options.html#index-muniform-simt"),
+DOC_URL ("-muninit-const-in-rodata", "gcc/MIPS-Options.html#index-muninit-const-in-rodata"),
+DOC_URL ("-munix", "gcc/VAX-Options.html#index-munix"),
+DOC_URL ("-munix-asm", "gcc/PDP-11-Options.html#index-munix-asm"),
+DOC_URL ("-munordered-float", "gcc/OpenRISC-Options.html#index-munordered-float"),
+DOC_URL ("-munroll-only-small-loops", "gcc/x86-Options.html#index-munroll-only-small-loops"),
+DOC_URL ("-mupdate", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mupdate"),
+DOC_URL ("-muser-enabled", "gcc/LM32-Options.html#index-muser-enabled"),
+DOC_URL ("-musermode", "gcc/SH-Options.html#index-musermode"),
+DOC_URL ("-musermsr", "gcc/x86-Options.html#index-musermsr"),
+DOC_URL ("-mv3-atomics", "gcc/eBPF-Options.html#index-mv3-atomics"),
+DOC_URL ("-mv3push", "gcc/NDS32-Options.html#index-mv3push"),
+DOC_URL ("-mv850", "gcc/V850-Options.html#index-mv850"),
+DOC_URL ("-mv850e", "gcc/V850-Options.html#index-mv850e"),
+DOC_URL ("-mv850e1", "gcc/V850-Options.html#index-mv850e1"),
+DOC_URL ("-mv850e2", "gcc/V850-Options.html#index-mv850e2"),
+DOC_URL ("-mv850e2v3", "gcc/V850-Options.html#index-mv850e2v3"),
+DOC_URL ("-mv850e2v4", "gcc/V850-Options.html#index-mv850e2v4"),
+DOC_URL ("-mv850e3v5", "gcc/V850-Options.html#index-mv850e3v5"),
+DOC_URL ("-mv850es", "gcc/V850-Options.html#index-mv850es"),
+DOC_URL ("-mv8plus", "gcc/SPARC-Options.html#index-mv8plus"),
+DOC_URL ("-mvaes", "gcc/x86-Options.html#index-mvaes"),
+DOC_URL ("-mvdsp", "gcc/C-SKY-Options.html#index-mvdsp"),
+DOC_URL ("-mvect-double", "gcc/Adapteva-Epiphany-Options.html#index-mvect-double"),
+DOC_URL ("-mvect8-ret-in-mem", "gcc/x86-Options.html#index-mvect8-ret-in-mem"),
+DOC_URL ("-mvirt", "gcc/MIPS-Options.html#index-mvirt"),
+DOC_URL ("-mvis", "gcc/SPARC-Options.html#index-mvis"),
+DOC_URL ("-mvis2", "gcc/SPARC-Options.html#index-mvis2"),
+DOC_URL ("-mvis3", "gcc/SPARC-Options.html#index-mvis3"),
+DOC_URL ("-mvis4", "gcc/SPARC-Options.html#index-mvis4"),
+DOC_URL ("-mvis4b", "gcc/SPARC-Options.html#index-mvis4b"),
+DOC_URL ("-mvliw-branch", "gcc/FRV-Options.html#index-mvliw-branch"),
+DOC_URL ("-mvms-return-codes", "gcc/VMS-Options.html#index-mvms-return-codes"),
+DOC_URL ("-mvolatile-asm-stop", "gcc/IA-64-Options.html#index-mvolatile-asm-stop"),
+DOC_URL ("-mvpclmulqdq", "gcc/x86-Options.html#index-mvpclmulqdq"),
+DOC_URL ("-mvr4130-align", "gcc/MIPS-Options.html#index-mvr4130-align"),
+DOC_URL ("-mvrsave", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mvrsave"),
+DOC_URL ("-mvsx", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mvsx"),
+DOC_URL ("-mvx", "gcc/S_002f390-and-zSeries-Options.html#index-mvx"),
+DOC_URL ("-mvxworks", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mvxworks"),
+DOC_URL ("-mvzeroupper", "gcc/x86-Options.html#index-mvzeroupper"),
+DOC_URL ("-mwaitpkg", "gcc/x86-Options.html#index-mwaitpkg"),
+DOC_URL ("-mwarn-devices-csv", "gcc/MSP430-Options.html#index-mwarn-devices-csv"),
+DOC_URL ("-mwarn-dynamicstack", "gcc/S_002f390-and-zSeries-Options.html#index-mwarn-dynamicstack"),
+DOC_URL ("-mwarn-framesize", "gcc/S_002f390-and-zSeries-Options.html#index-mwarn-framesize"),
+DOC_URL ("-mwarn-mcu", "gcc/MSP430-Options.html#index-mwarn-mcu"),
+DOC_URL ("-mwarn-multiple-fast-interrupts", "gcc/RX-Options.html#index-mwarn-multiple-fast-interrupts"),
+DOC_URL ("-mwbnoinvd", "gcc/x86-Options.html#index-mwbnoinvd"),
+DOC_URL ("-mwide-bitfields", "gcc/MCore-Options.html#index-mwide-bitfields"),
+DOC_URL ("-mwidekl", "gcc/x86-Options.html#index-mwidekl"),
+DOC_URL ("-mwin32", "gcc/x86-Windows-Options.html#index-mwin32"),
+DOC_URL ("-mwindows", "gcc/x86-Windows-Options.html#index-mwindows"),
+DOC_URL ("-mword-relocations", "gcc/ARM-Options.html#index-mword-relocations"),
+DOC_URL ("-mx32", "gcc/x86-Options.html#index-mx32"),
+DOC_URL ("-mxl-barrel-shift", "gcc/MicroBlaze-Options.html#index-mxl-barrel-shift"),
+DOC_URL ("-mxl-compat", "gcc/RS_002f6000-and-PowerPC-Options.html#index-mxl-compat"),
+DOC_URL ("-mxl-float-convert", "gcc/MicroBlaze-Options.html#index-mxl-float-convert"),
+DOC_URL ("-mxl-float-sqrt", "gcc/MicroBlaze-Options.html#index-mxl-float-sqrt"),
+DOC_URL ("-mxl-gp-opt", "gcc/MicroBlaze-Options.html#index-mxl-gp-opt"),
+DOC_URL ("-mxl-multiply-high", "gcc/MicroBlaze-Options.html#index-mxl-multiply-high"),
+DOC_URL ("-mxl-pattern-compare", "gcc/MicroBlaze-Options.html#index-mxl-pattern-compare"),
+DOC_URL ("-mxl-reorder", "gcc/MicroBlaze-Options.html#index-mxl-reorder"),
+DOC_URL ("-mxl-soft-div", "gcc/MicroBlaze-Options.html#index-mxl-soft-div"),
+DOC_URL ("-mxl-soft-mul", "gcc/MicroBlaze-Options.html#index-mxl-soft-mul"),
+DOC_URL ("-mxl-stack-check", "gcc/MicroBlaze-Options.html#index-mxl-stack-check"),
+DOC_URL ("-mxnack", "gcc/AMD-GCN-Options.html#index-mxnack"),
+DOC_URL ("-mxop", "gcc/x86-Options.html#index-mxop"),
+DOC_URL ("-mxpa", "gcc/MIPS-Options.html#index-mxpa"),
+DOC_URL ("-mxsave", "gcc/x86-Options.html#index-mxsave"),
+DOC_URL ("-mxsavec", "gcc/x86-Options.html#index-mxsavec"),
+DOC_URL ("-mxsaveopt", "gcc/x86-Options.html#index-mxsaveopt"),
+DOC_URL ("-mxsaves", "gcc/x86-Options.html#index-mxsaves"),
+DOC_URL ("-mxy", "gcc/ARC-Options.html#index-mxy"),
+DOC_URL ("-myellowknife", "gcc/RS_002f6000-and-PowerPC-Options.html#index-myellowknife"),
+DOC_URL ("-mzarch", "gcc/S_002f390-and-zSeries-Options.html#index-mzarch"),
+DOC_URL ("-mzda", "gcc/V850-Options.html#index-mzda"),
+DOC_URL ("-mzdcbranch", "gcc/SH-Options.html#index-mzdcbranch"),
+DOC_URL ("-mzero-extend", "gcc/MMIX-Options.html#index-mzero-extend"),
+DOC_URL ("-mzvector", "gcc/S_002f390-and-zSeries-Options.html#index-mzvector"),
+DOC_URL ("-no-80387", "gcc/x86-Options.html#index-no-80387"),
+DOC_URL ("-no-block-ops-unaligned-vsx", "gcc/RS_002f6000-and-PowerPC-Options.html#index-no-block-ops-unaligned-vsx"),
+DOC_URL ("-no-canonical-prefixes", "gcc/Directory-Options.html#index-no-canonical-prefixes"),
+DOC_URL ("-no-integrated-cpp", "gcc/Preprocessor-Options.html#index-no-integrated-cpp"),
+DOC_URL ("-no-pie", "gcc/Link-Options.html#index-no-pie"),
+DOC_URL ("-no-sysroot-suffix", "gcc/Directory-Options.html#index-no-sysroot-suffix"),
+DOC_URL ("-no_dead_strip_inits_and_terms", "gcc/Darwin-Options.html#index-no_005fdead_005fstrip_005finits_005fand_005fterms"),
+DOC_URL ("-noall_load", "gcc/Darwin-Options.html#index-noall_005fload"),
+DOC_URL ("-nocpp", "gcc/MIPS-Options.html#index-nocpp"),
+DOC_URL ("-nodefaultlibs", "gcc/Link-Options.html#index-nodefaultlibs"),
+DOC_URL ("-nodefaultrpaths", "gcc/Darwin-Options.html#index-nodefaultrpaths"),
+DOC_URL ("-nodevicelib", "gcc/AVR-Options.html#index-nodevicelib"),
+DOC_URL ("-nodevicespecs", "gcc/AVR-Options.html#index-nodevicespecs"),
+DOC_URL ("-nofixprebinding", "gcc/Darwin-Options.html#index-nofixprebinding"),
+DOC_URL ("-nofpu", "gcc/RX-Options.html#index-nofpu"),
+DOC_URL ("-nolibc", "gcc/Link-Options.html#index-nolibc"),
+DOC_URL ("-nolibdld", "gcc/HPPA-Options.html#index-nolibdld"),
+DOC_URL ("-nomultidefs", "gcc/Darwin-Options.html#index-nomultidefs"),
+DOC_URL ("-non-static", "gcc/VxWorks-Options.html#index-non-static"),
+DOC_URL ("-noprebind", "gcc/Darwin-Options.html#index-noprebind"),
+DOC_URL ("-noseglinkedit", "gcc/Darwin-Options.html#index-noseglinkedit"),
+DOC_URL ("-nostartfiles", "gcc/Link-Options.html#index-nostartfiles"),
+DOC_URL ("-nostdinc", "gcc/Directory-Options.html#index-nostdinc"),
+DOC_URL ("-nostdlib", "gcc/Link-Options.html#index-nostdlib"),
+DOC_URL ("-nostdlib++", "gcc/Link-Options.html#index-nostdlib_002b_002b"),
+DOC_URL ("-o", "gcc/Overall-Options.html#index-o"),
+DOC_URL ("-pagezero_size", "gcc/Darwin-Options.html#index-pagezero_005fsize"),
+DOC_URL ("-param", "gcc/Optimize-Options.html#index-param"),
+DOC_URL ("-pass-exit-codes", "gcc/Overall-Options.html#index-pass-exit-codes"),
+DOC_URL ("-pie", "gcc/Link-Options.html#index-pie"),
+DOC_URL ("-pipe", "gcc/Overall-Options.html#index-pipe"),
+DOC_URL ("-plt", "gcc/RISC-V-Options.html#index-plt"),
+DOC_URL ("-prebind", "gcc/Darwin-Options.html#index-prebind"),
+DOC_URL ("-prebind_all_twolevel_modules", "gcc/Darwin-Options.html#index-prebind_005fall_005ftwolevel_005fmodules"),
+DOC_URL ("-print-file-name", "gcc/Developer-Options.html#index-print-file-name"),
+DOC_URL ("-print-libgcc-file-name", "gcc/Developer-Options.html#index-print-libgcc-file-name"),
+DOC_URL ("-print-multi-directory", "gcc/Developer-Options.html#index-print-multi-directory"),
+DOC_URL ("-print-multi-lib", "gcc/Developer-Options.html#index-print-multi-lib"),
+DOC_URL ("-print-multi-os-directory", "gcc/Developer-Options.html#index-print-multi-os-directory"),
+DOC_URL ("-print-multiarch", "gcc/Developer-Options.html#index-print-multiarch"),
+DOC_URL ("-print-objc-runtime-info", "gcc/Objective-C-and-Objective-C_002b_002b-Dialect-Options.html#index-print-objc-runtime-info"),
+DOC_URL ("-print-prog-name", "gcc/Developer-Options.html#index-print-prog-name"),
+DOC_URL ("-print-search-dirs", "gcc/Developer-Options.html#index-print-search-dirs"),
+DOC_URL ("-print-sysroot", "gcc/Developer-Options.html#index-print-sysroot"),
+DOC_URL ("-print-sysroot-headers-suffix", "gcc/Developer-Options.html#index-print-sysroot-headers-suffix"),
+DOC_URL ("-private_bundle", "gcc/Darwin-Options.html#index-private_005fbundle"),
+DOC_URL ("-pthreads", "gcc/Solaris-2-Options.html#index-pthreads"),
+DOC_URL ("-r", "gcc/Link-Options.html#index-r"),
+DOC_URL ("-rdynamic", "gcc/Link-Options.html#index-rdynamic"),
+DOC_URL ("-read_only_relocs", "gcc/Darwin-Options.html#index-read_005fonly_005frelocs"),
+DOC_URL ("-remap", "gcc/Preprocessor-Options.html#index-remap"),
+DOC_URL ("-s", "gcc/Link-Options.html#index-s"),
+DOC_URL ("-save-temps", "gcc/Developer-Options.html#index-save-temps"),
+DOC_URL ("-save-temps=cwd", "gcc/Developer-Options.html#index-save-temps_003dcwd"),
+DOC_URL ("-save-temps=obj", "gcc/Developer-Options.html#index-save-temps_003dobj"),
+DOC_URL ("-sectalign", "gcc/Darwin-Options.html#index-sectalign"),
+DOC_URL ("-sectcreate", "gcc/Darwin-Options.html#index-sectcreate"),
+DOC_URL ("-sectorder", "gcc/Darwin-Options.html#index-sectorder"),
+DOC_URL ("-seg1addr", "gcc/Darwin-Options.html#index-seg1addr"),
+DOC_URL ("-seg_addr_table", "gcc/Darwin-Options.html#index-seg_005faddr_005ftable"),
+DOC_URL ("-seg_addr_table_filename", "gcc/Darwin-Options.html#index-seg_005faddr_005ftable_005ffilename"),
+DOC_URL ("-segaddr", "gcc/Darwin-Options.html#index-segaddr"),
+DOC_URL ("-seglinkedit", "gcc/Darwin-Options.html#index-seglinkedit"),
+DOC_URL ("-segprot", "gcc/Darwin-Options.html#index-segprot"),
+DOC_URL ("-shared", "gcc/Link-Options.html#index-shared"),
+DOC_URL ("-shared-libgcc", "gcc/Link-Options.html#index-shared-libgcc"),
+DOC_URL ("-short-calls", "gcc/Adapteva-Epiphany-Options.html#index-short-calls"),
+DOC_URL ("-sim", "gcc/CRIS-Options.html#index-sim"),
+DOC_URL ("-sim2", "gcc/CRIS-Options.html#index-sim2"),
+DOC_URL ("-single_module", "gcc/Darwin-Options.html#index-single_005fmodule"),
+DOC_URL ("-specs", "gcc/Overall-Options.html#index-specs"),
+DOC_URL ("-static-libasan", "gcc/Link-Options.html#index-static-libasan"),
+DOC_URL ("-static-libgcc", "gcc/Link-Options.html#index-static-libgcc"),
+DOC_URL ("-static-liblsan", "gcc/Link-Options.html#index-static-liblsan"),
+DOC_URL ("-static-libstdc++", "gcc/Link-Options.html#index-static-libstdc_002b_002b"),
+DOC_URL ("-static-libtsan", "gcc/Link-Options.html#index-static-libtsan"),
+DOC_URL ("-static-libubsan", "gcc/Link-Options.html#index-static-libubsan"),
+DOC_URL ("-static-pie", "gcc/Link-Options.html#index-static-pie"),
+DOC_URL ("-stdlib", "gcc/C_002b_002b-Dialect-Options.html#index-stdlib"),
+DOC_URL ("-sub_library", "gcc/Darwin-Options.html#index-sub_005flibrary"),
+DOC_URL ("-sub_umbrella", "gcc/Darwin-Options.html#index-sub_005fumbrella"),
+DOC_URL ("-symbolic", "gcc/Link-Options.html#index-symbolic"),
+DOC_URL ("-sysroot", "gcc/Directory-Options.html#index-sysroot"),
+DOC_URL ("-target-help", "gcc/Overall-Options.html#index-target-help"),
+DOC_URL ("-threads", "gcc/HPPA-Options.html#index-threads"),
+DOC_URL ("-time", "gcc/Developer-Options.html#index-time"),
+DOC_URL ("-tno-android-cc", "gcc/GNU_002fLinux-Options.html#index-tno-android-cc"),
+DOC_URL ("-tno-android-ld", "gcc/GNU_002fLinux-Options.html#index-tno-android-ld"),
+DOC_URL ("-traditional-cpp", "gcc/Preprocessor-Options.html#index-traditional-cpp"),
+DOC_URL ("-trigraphs", "gcc/Preprocessor-Options.html#index-trigraphs"),
+DOC_URL ("-twolevel_namespace", "gcc/Darwin-Options.html#index-twolevel_005fnamespace"),
+DOC_URL ("-u", "gcc/Link-Options.html#index-u"),
+DOC_URL ("-umbrella", "gcc/Darwin-Options.html#index-umbrella"),
+DOC_URL ("-undef", "gcc/Preprocessor-Options.html#index-undef"),
+DOC_URL ("-undefined", "gcc/Darwin-Options.html#index-undefined"),
+DOC_URL ("-unexported_symbols_list", "gcc/Darwin-Options.html#index-unexported_005fsymbols_005flist"),
+DOC_URL ("-v", "gcc/Overall-Options.html#index-v"),
+DOC_URL ("-version", "gcc/Overall-Options.html#index-version"),
+DOC_URL ("-w", "gcc/Warning-Options.html#index-w"),
+DOC_URL ("-weak_reference_mismatches", "gcc/Darwin-Options.html#index-weak_005freference_005fmismatches"),
+DOC_URL ("-whatsloaded", "gcc/Darwin-Options.html#index-whatsloaded"),
+DOC_URL ("-whyload", "gcc/Darwin-Options.html#index-whyload"),
+DOC_URL ("-wrapper", "gcc/Overall-Options.html#index-wrapper"),
+DOC_URL ("-x", "gcc/Overall-Options.html#index-x"),
+DOC_URL ("-z", "gcc/Link-Options.html#index-z"),
-- 
2.26.3


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

* [pushed] diagnostics: add automatic URL-ification within messages
  2023-11-02 13:19 ` [PATCH 3/4] diagnostics: add automatic URL-ification within messages David Malcolm
@ 2023-11-04  1:59   ` David Malcolm
  0 siblings, 0 replies; 6+ messages in thread
From: David Malcolm @ 2023-11-04  1:59 UTC (permalink / raw)
  To: gcc-patches; +Cc: David Malcolm

On Thu, 2023-11-02 at 09:19 -0400, David Malcolm wrote:

[...snip...]

I eliminated the dependency on the c-pragma.cc changes from this patch,
updated it for diagnostic_context becoming a class, and pushed it to
trunk as r14-5118-gc5db4d8ba5f3de (after re-testing it).

For reference, here's what I pushed:

In r10-3781-gd26082357676a3 GCC's pretty-print framework gained
the ability to emit embedding URLs via escape sequences
for marking up text output..

In r10-3783-gb4c7ca2ef3915a GCC started using this for the
[-Wname-of-option] emitted at the end of each diagnostic so that it
becomes a hyperlink to the documentation for that option on the GCC
website.

This makes it much more convenient for the user to locate pertinent
documentation when a diagnostic is emitted.

The above involved special-casing in one specific place, but there is
plenty of quoted text throughout GCC's diagnostic messages that could
usefully have a documentation URL: references to options, pragmas, etc

This patch adds a new optional "urlifier" parameter to pp_format.
The idea is that a urlifier object has responsibility for mapping from
quoted strings in diagnostic messages to URLs, and pp_format has the
ability to automatically add URL escapes for strings that the urlifier
gives it URLs for.

For example, given the format string:

  "%<#pragma pack%> has no effect with %<-fpack-struct%>"

with this patch GCC is able to automatically linkify the "#pragma pack"
text to
  https://gcc.gnu.org/onlinedocs/gcc/Structure-Layout-Pragmas.html
and the "-fpack-struct" text to:
  https://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html#index-fpack-struct

and we don't have to modify the format string itself.

This is only done for the pp_format within
diagnostic_context::report_diagnostic i.e. just for the primary message
in each diagnostics, and not for other places within GCC that use pp
format internally.

"urlifier" is an abstract base class, with a GCC-specific subclass
implementing the logic for generating URLs into GCC's HTML
documentation via binary search in a data table.  This patch implements
the gcc_urlifier with a small table generated by hand; the data table in
this patch only covers various pragmas and the option referenced by the
above pragma message.

I have a followup patch that scripts the creation of this data by
directly scraping the output of "make html", thus automating all this,
and (I hope) minimizing the work of ensuring that documentation URLs
emitted by GCC match the generated documentation.

gcc/ChangeLog:
	* Makefile.in (GCC_OBJS): Add gcc-urlifier.o.
	(OBJS): Likewise.

gcc/c-family/ChangeLog:
	* c-pragma.cc:: (handle_pragma_push_options): Fix missing "GCC" in
	name of pragma in "junk" message.
	(handle_pragma_pop_options): Likewise.

gcc/ChangeLog:
	* diagnostic.cc: Include "pretty-print-urlifier.h".
	(diagnostic_context::initialize): Initialize m_urlifier.
	(diagnostic_context::finish): Clean up m_urlifier
	(diagnostic_report::diagnostic): m_urlifier to pp_format.
	* diagnostic.h (diagnostic_context::m_urlifier): New field.
	* gcc-urlifier.cc: New file.
	* gcc-urlifier.def: New file.
	* gcc-urlifier.h: New file.
	* gcc.cc: Include "gcc-urlifier.h".
	(driver::global_initializations): Initialize global_dc->m_urlifier.
	* pretty-print-urlifier.h: New file.
	* pretty-print.cc: Include "pretty-print-urlifier.h".
	(obstack_append_string): New.
	(urlify_quoted_string): New.
	(pp_format): Add "urlifier" param and use it to implement optional
	urlification of quoted text strings.
	(pp_output_formatted_text): Make buffer a const pointer.
	(selftest::pp_printf_with_urlifier): New.
	(selftest::test_urlification): New.
	(selftest::pretty_print_cc_tests): Call it.
	* pretty-print.h (class urlifier): New forward declaration.
	(pp_format): Add optional urlifier param.
	* selftest-run-tests.cc (selftest::run_tests): Call
	selftest::gcc_urlifier_cc_tests .
	* selftest.h (selftest::gcc_urlifier_cc_tests): New decl.
	* toplev.cc: Include "gcc-urlifier.h".
	(general_init): Initialize global_dc->m_urlifier.
---
 gcc/Makefile.in             |   3 +-
 gcc/c-family/c-pragma.cc    |   4 +-
 gcc/diagnostic.cc           |   7 +-
 gcc/diagnostic.h            |   4 +
 gcc/gcc-urlifier.cc         | 159 +++++++++++++++++++++++
 gcc/gcc-urlifier.def        |  20 +++
 gcc/gcc-urlifier.h          |  26 ++++
 gcc/gcc.cc                  |   2 +
 gcc/pretty-print-urlifier.h |  33 +++++
 gcc/pretty-print.cc         | 242 +++++++++++++++++++++++++++++++++++-
 gcc/pretty-print.h          |   5 +-
 gcc/selftest-run-tests.cc   |   1 +
 gcc/selftest.h              |   1 +
 gcc/toplev.cc               |   2 +
 14 files changed, 498 insertions(+), 11 deletions(-)
 create mode 100644 gcc/gcc-urlifier.cc
 create mode 100644 gcc/gcc-urlifier.def
 create mode 100644 gcc/gcc-urlifier.h
 create mode 100644 gcc/pretty-print-urlifier.h

diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index 41ed8163cd8..ff77d3cdc64 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -1279,7 +1279,7 @@ FORTRAN_TARGET_OBJS=@fortran_target_objs@
 RUST_TARGET_OBJS=@rust_target_objs@
 
 # Object files for gcc many-languages driver.
-GCC_OBJS = gcc.o gcc-main.o ggc-none.o
+GCC_OBJS = gcc.o gcc-main.o ggc-none.o gcc-urlifier.o
 
 c-family-warn = $(STRICT_WARN)
 
@@ -1452,6 +1452,7 @@ OBJS = \
 	function-tests.o \
 	fwprop.o \
 	gcc-rich-location.o \
+	gcc-urlifier.o \
 	gcse.o \
 	gcse-common.o \
 	ggc-common.o \
diff --git a/gcc/c-family/c-pragma.cc b/gcc/c-family/c-pragma.cc
index df3e3e6b3b0..849f8ac8c8b 100644
--- a/gcc/c-family/c-pragma.cc
+++ b/gcc/c-family/c-pragma.cc
@@ -1208,7 +1208,7 @@ handle_pragma_push_options (cpp_reader *)
   token = pragma_lex (&x);
   if (token != CPP_EOF)
     {
-      warning (OPT_Wpragmas, "junk at end of %<#pragma push_options%>");
+      warning (OPT_Wpragmas, "junk at end of %<#pragma GCC push_options%>");
       return;
     }
 
@@ -1245,7 +1245,7 @@ handle_pragma_pop_options (cpp_reader *)
   token = pragma_lex (&x);
   if (token != CPP_EOF)
     {
-      warning (OPT_Wpragmas, "junk at end of %<#pragma pop_options%>");
+      warning (OPT_Wpragmas, "junk at end of %<#pragma GCC pop_options%>");
       return;
     }
 
diff --git a/gcc/diagnostic.cc b/gcc/diagnostic.cc
index 4b92f5461be..e917e6ce4ac 100644
--- a/gcc/diagnostic.cc
+++ b/gcc/diagnostic.cc
@@ -43,6 +43,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "opts.h"
 #include "cpplib.h"
 #include "text-art/theme.h"
+#include "pretty-print-urlifier.h"
 
 #ifdef HAVE_TERMIOS_H
 # include <termios.h>
@@ -193,6 +194,7 @@ diagnostic_context::initialize (int n_opts)
   m_option_state = nullptr;
   m_option_name = nullptr;
   m_get_option_url = nullptr;
+  m_urlifier = nullptr;
   m_last_location = UNKNOWN_LOCATION;
   m_last_module = nullptr;
   m_client_aux_data = nullptr;
@@ -350,6 +352,9 @@ diagnostic_context::finish ()
       delete m_client_data_hooks;
       m_client_data_hooks = nullptr;
     }
+
+  delete m_urlifier;
+  m_urlifier = nullptr;
 }
 
 void
@@ -1567,7 +1572,7 @@ diagnostic_context::report_diagnostic (diagnostic_info *diagnostic)
     m_output_format->on_begin_group ();
   m_diagnostic_groups.m_emission_count++;
 
-  pp_format (this->printer, &diagnostic->message);
+  pp_format (this->printer, &diagnostic->message, m_urlifier);
   m_output_format->on_begin_diagnostic (diagnostic);
   pp_output_formatted_text (this->printer);
   if (m_show_cwe)
diff --git a/gcc/diagnostic.h b/gcc/diagnostic.h
index 2def7bddce9..cf21558c7b2 100644
--- a/gcc/diagnostic.h
+++ b/gcc/diagnostic.h
@@ -518,6 +518,10 @@ public:
      particular option.  */
   char *(*m_get_option_url) (diagnostic_context *, int);
 
+  /* An optional hook for adding URLs to quoted text strings in
+     diagnostics.  Only used for the main diagnostic message.  */
+  urlifier *m_urlifier;
+
   void (*m_print_path) (diagnostic_context *, const diagnostic_path *);
   json::value *(*m_make_json_for_path) (diagnostic_context *,
 					const diagnostic_path *);
diff --git a/gcc/gcc-urlifier.cc b/gcc/gcc-urlifier.cc
new file mode 100644
index 00000000000..269246bc703
--- /dev/null
+++ b/gcc/gcc-urlifier.cc
@@ -0,0 +1,159 @@
+/* Automatic generation of links into GCC's documentation.
+   Copyright (C) 2023 Free Software Foundation, Inc.
+   Contributed by David Malcolm <dmalcolm@redhat.com>.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 3, or (at your option) any later
+version.
+
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
+
+#include "config.h"
+#include "system.h"
+#include "coretypes.h"
+#include "pretty-print.h"
+#include "pretty-print-urlifier.h"
+#include "gcc-urlifier.h"
+#include "selftest.h"
+
+namespace {
+
+/* Concrete subclass of urlifier for generating links into
+   GCC's HTML documentation.  */
+
+class gcc_urlifier : public urlifier
+{
+public:
+  char *get_url_for_quoted_text (const char *p, size_t sz) const final override;
+
+  const char *get_url_suffix_for_quoted_text (const char *p, size_t sz) const;
+  const char *get_url_suffix_for_quoted_text (const char *p) const;
+
+private:
+  static char *
+  make_doc_url (const char *doc_url_suffix);
+};
+
+/* class gcc_urlifier : public urlifier.  */
+
+#define DOC_URL(QUOTED_TEXT, URL_SUFFIX) \
+  { (QUOTED_TEXT), (URL_SUFFIX) }
+
+const struct
+{
+  const char *quoted_text;
+  const char *url_suffix;
+} doc_urls[] = {
+
+#include "gcc-urlifier.def"
+
+};
+
+char *
+gcc_urlifier::get_url_for_quoted_text (const char *p, size_t sz) const
+{
+  if (const char *url_suffix = get_url_suffix_for_quoted_text (p, sz))
+    return make_doc_url (url_suffix);
+  return nullptr;
+}
+
+const char *
+gcc_urlifier::get_url_suffix_for_quoted_text (const char *p, size_t sz) const
+{
+  /* Binary search.  This assumes that the quoted_text fields of doc_urls
+     are in sorted order.  */
+  int min = 0;
+  int max = ARRAY_SIZE (doc_urls) - 1;
+  while (true)
+    {
+      if (min > max)
+	return nullptr;
+      int midpoint = (min + max) / 2;
+      gcc_assert ((size_t)midpoint < ARRAY_SIZE (doc_urls));
+      int cmp = strncmp (p, doc_urls[midpoint].quoted_text, sz);
+      if (cmp == 0)
+	{
+	  if (doc_urls[midpoint].quoted_text[sz] == '\0')
+	    return doc_urls[midpoint].url_suffix;
+	  else
+	    max = midpoint - 1;
+	}
+      else if (cmp < 0)
+	max = midpoint - 1;
+      else
+	min = midpoint + 1;
+    }
+  return nullptr;
+}
+
+const char *
+gcc_urlifier::get_url_suffix_for_quoted_text (const char *p) const
+{
+  return get_url_suffix_for_quoted_text (p, strlen (p));
+}
+
+char *
+gcc_urlifier::make_doc_url (const char *doc_url_suffix)
+{
+  if (!doc_url_suffix)
+    return nullptr;
+
+  return concat (DOCUMENTATION_ROOT_URL, doc_url_suffix, nullptr);
+}
+
+} // anonymous namespace
+
+urlifier *
+make_gcc_urlifier ()
+{
+  return new gcc_urlifier ();
+}
+
+#if CHECKING_P
+
+namespace selftest {
+
+/* Selftests.  */
+
+/* Run all of the selftests within this file.  */
+
+void
+gcc_urlifier_cc_tests ()
+{
+  /* Check that doc_urls.quoted_text is sorted.  */
+  for (size_t idx = 1; idx < ARRAY_SIZE (doc_urls); idx++)
+    gcc_assert (strcmp (doc_urls[idx - 1].quoted_text,
+			doc_urls[idx].quoted_text)
+		< 0);
+
+  gcc_urlifier u;
+
+  ASSERT_EQ (u.get_url_suffix_for_quoted_text (""), nullptr);
+  ASSERT_EQ (u.get_url_suffix_for_quoted_text (")"), nullptr);
+
+  ASSERT_STREQ (u.get_url_suffix_for_quoted_text ("#pragma message"),
+		"gcc/Diagnostic-Pragmas.html");
+
+  // Incomplete prefix of a quoted_text
+  ASSERT_EQ (u.get_url_suffix_for_quoted_text ("#pragma mess"), nullptr);
+
+  /* Check that every element is findable.  */
+  for (size_t idx = 0; idx < ARRAY_SIZE (doc_urls); idx++)
+    ASSERT_STREQ
+      (u.get_url_suffix_for_quoted_text (doc_urls[idx].quoted_text),
+       doc_urls[idx].url_suffix);
+}
+
+} // namespace selftest
+
+#endif /* #if CHECKING_P */
diff --git a/gcc/gcc-urlifier.def b/gcc/gcc-urlifier.def
new file mode 100644
index 00000000000..360de930e9e
--- /dev/null
+++ b/gcc/gcc-urlifier.def
@@ -0,0 +1,20 @@
+/* Keep this file sorted.  */
+DOC_URL ("#pragma GCC diagnostic", "gcc/Diagnostic-Pragmas.html"),
+DOC_URL ("#pragma GCC diagnostic ignored_attributes", "gcc/Diagnostic-Pragmas.html"),
+DOC_URL ("#pragma GCC ivdep", "gcc/Loop-Specific-Pragmas.html#index-pragma-GCC-ivdep"),
+DOC_URL ("#pragma GCC novector", "gcc/Loop-Specific-Pragmas.html#index-pragma-GCC-novector"),
+DOC_URL ("#pragma GCC optimize", "gcc/Function-Specific-Option-Pragmas.html#index-pragma-GCC-optimize"),
+DOC_URL ("#pragma GCC pop_options", "gcc/Push_002fPop-Macro-Pragmas.html"),
+DOC_URL ("#pragma GCC push_options", "gcc/Push_002fPop-Macro-Pragmas.html"),
+DOC_URL ("#pragma GCC reset_options", "gcc/Function-Specific-Option-Pragmas.html#index-pragma-GCC-reset_005foptions"),
+DOC_URL ("#pragma GCC target", "gcc/Function-Specific-Option-Pragmas.html#index-pragma-GCC-target"),
+DOC_URL ("#pragma GCC unroll", "gcc/Loop-Specific-Pragmas.html#index-pragma-GCC-unroll-n"),
+DOC_URL ("#pragma GCC visibility", "gcc/Visibility-Pragmas.html"),
+DOC_URL ("#pragma GCC visibility pop", "gcc/Visibility-Pragmas.html"),
+DOC_URL ("#pragma message", "gcc/Diagnostic-Pragmas.html"),
+DOC_URL ("#pragma pack", "gcc/Structure-Layout-Pragmas.html"),
+DOC_URL ("#pragma redefine_extname", "gcc/Symbol-Renaming-Pragmas.html"),
+DOC_URL ("#pragma scalar_storage_order", "gcc/Structure-Layout-Pragmas.html"),
+DOC_URL ("#pragma weak", "gcc/Weak-Pragmas.html"),
+DOC_URL ("--version", "gcc/Overall-Options.html#index-version"),
+DOC_URL ("-fpack-struct", "gcc/Code-Gen-Options.html#index-fpack-struct"),
diff --git a/gcc/gcc-urlifier.h b/gcc/gcc-urlifier.h
new file mode 100644
index 00000000000..614e1c64b94
--- /dev/null
+++ b/gcc/gcc-urlifier.h
@@ -0,0 +1,26 @@
+/* Automatic generation of links into GCC's documentation.
+   Copyright (C) 2023 Free Software Foundation, Inc.
+   Contributed by David Malcolm <dmalcolm@redhat.com>.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 3, or (at your option)
+any later version.
+
+GCC is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
+
+#ifndef GCC_GCC_URLIFIER_H
+#define GCC_GCC_URLIFIER_H
+
+extern urlifier *make_gcc_urlifier ();
+
+#endif /* GCC_GCC_URLIFIER_H */
diff --git a/gcc/gcc.cc b/gcc/gcc.cc
index 0b7e07872cd..02464958f36 100644
--- a/gcc/gcc.cc
+++ b/gcc/gcc.cc
@@ -46,6 +46,7 @@ compilation is specified by a string called a "spec".  */
 #include "spellcheck.h"
 #include "opts-jobserver.h"
 #include "common/common-target.h"
+#include "gcc-urlifier.h"
 
 #ifndef MATH_LIBRARY
 #define MATH_LIBRARY "m"
@@ -8291,6 +8292,7 @@ driver::global_initializations ()
   diagnostic_initialize (global_dc, 0);
   diagnostic_color_init (global_dc);
   diagnostic_urls_init (global_dc);
+  global_dc->m_urlifier = make_gcc_urlifier ();
 
 #ifdef GCC_DRIVER_HOST_INITIALIZATION
   /* Perform host dependent initialization when needed.  */
diff --git a/gcc/pretty-print-urlifier.h b/gcc/pretty-print-urlifier.h
new file mode 100644
index 00000000000..bdb7fca00d4
--- /dev/null
+++ b/gcc/pretty-print-urlifier.h
@@ -0,0 +1,33 @@
+/* Copyright (C) 2023 Free Software Foundation, Inc.
+   Contributed by David Malcolm <dmalcolm@redhat.com>
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 3, or (at your option) any later
+version.
+
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
+
+#ifndef GCC_PRETTY_PRINT_URLIFIER_H
+#define GCC_PRETTY_PRINT_URLIFIER_H
+
+/* Abstract base class for optional use in pp_format for adding URLs
+   to quoted text strings.  */
+
+class urlifier
+{
+public:
+  virtual ~urlifier () {}
+  virtual char *get_url_for_quoted_text (const char *p, size_t sz) const = 0;
+};
+
+#endif /* GCC_PRETTY_PRINT_URLIFIER_H */
diff --git a/gcc/pretty-print.cc b/gcc/pretty-print.cc
index 80780cfd7b8..9a4827622dc 100644
--- a/gcc/pretty-print.cc
+++ b/gcc/pretty-print.cc
@@ -23,6 +23,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "coretypes.h"
 #include "intl.h"
 #include "pretty-print.h"
+#include "pretty-print-urlifier.h"
 #include "diagnostic-color.h"
 #include "diagnostic-event-id.h"
 #include "selftest.h"
@@ -1022,6 +1023,95 @@ pp_indent (pretty_printer *pp)
 
 static const char *get_end_url_string (pretty_printer *);
 
+/* Append STR to OSTACK, without a null-terminator.  */
+
+static void
+obstack_append_string (obstack *ostack, const char *str)
+{
+  obstack_grow (ostack, str, strlen (str));
+}
+
+/* Given quoted text starting at QUOTED_TEXT_START_IDX within PP's buffer,
+   potentially use URLIFIER (if non-null) to see if there's a URL for the
+   quoted text.
+
+   If so, replace the quoted part of the text in the buffer with a URLified
+   version of the text, using PP's settings.
+
+   For example, given this is the buffer:
+     "this is a test `hello world"
+     .................^~~~~~~~~~~
+   with the quoted text starting at the 'h' of "hello world", the buffer
+   becomes:
+     "this is a test `BEGIN_URL(URL)hello worldEND(URL)"
+     .................^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+     .................-----------replacement-----------
+*/
+
+static void
+urlify_quoted_string (pretty_printer *pp,
+		      const urlifier *urlifier,
+		      size_t quoted_text_start_idx)
+{
+  if (pp->url_format == URL_FORMAT_NONE)
+    return;
+  if (!urlifier)
+    return;
+
+  output_buffer * const buffer = pp_buffer (pp);
+
+  /* Get end of quoted string.  */
+  const size_t close_quote_idx
+    = obstack_object_size (&buffer->chunk_obstack);
+  gcc_assert (close_quote_idx >= quoted_text_start_idx);
+  if (close_quote_idx == quoted_text_start_idx)
+    /* Empty quoted string; do nothing.  */
+    return;
+  const size_t len = close_quote_idx - quoted_text_start_idx;
+  const char *start = (buffer->chunk_obstack.object_base
+		       + quoted_text_start_idx);
+  char *url = urlifier->get_url_for_quoted_text (start, len);
+  if (!url)
+    /* No URL for this quoted text; do nothing.  */
+    return;
+
+  /* Stash a copy of the quoted text.  */
+  char *text = xstrndup (start, len);
+
+  /* Replace quoted text...  */
+  buffer->chunk_obstack.next_free -= len;
+
+  /*  ...with URLified version of the text.  */
+  /* Begin URL.  */
+  switch (pp->url_format)
+    {
+    default:
+    case URL_FORMAT_NONE:
+      gcc_unreachable ();
+    case URL_FORMAT_ST:
+      obstack_append_string (&buffer->chunk_obstack,
+			     "\33]8;;");
+      obstack_append_string (&buffer->chunk_obstack, url);
+      obstack_append_string (&buffer->chunk_obstack,
+			     "\33\\");
+      break;
+    case URL_FORMAT_BEL:
+      obstack_append_string (&buffer->chunk_obstack,
+			     "\33]8;;");
+      obstack_append_string (&buffer->chunk_obstack, url);
+      obstack_append_string (&buffer->chunk_obstack,
+			     "\a");
+      break;
+    }
+  /* Add the text back.  */
+  obstack_append_string (&buffer->chunk_obstack, text);
+  /* End URL.  */
+  obstack_append_string (&buffer->chunk_obstack,
+			 get_end_url_string (pp));
+  free (text);
+  free (url);
+}
+
 /* The following format specifiers are recognized as being client independent:
    %d, %i: (signed) integer in base ten.
    %u: unsigned integer in base ten.
@@ -1064,12 +1154,25 @@ static const char *get_end_url_string (pretty_printer *);
 
 /* Formatting phases 1 and 2: render TEXT->format_spec plus
    text->m_args_ptr into a series of chunks in pp_buffer (PP)->args[].
-   Phase 3 is in pp_output_formatted_text.  */
+   Phase 3 is in pp_output_formatted_text.
+
+   If URLIFIER is non-NULL, then use it to add URLs for quoted
+   strings, so that e.g.
+     "before %<quoted%> after"
+   with a URLIFIER that has a URL for "quoted" might be emitted as:
+     "before `BEGIN_URL(http://example.com)quotedEND_URL' after"
+   This only works for message fragments that are:
+   - quoted entirely in phase 1 (e.g. "%<this is quoted%>"), or
+   - quoted entirely in phase 2 (e.g. "%qs"),
+   but *not* in strings that use a mixture of both phases
+   (e.g. "%<this is a mixture: %s %>").   */
 
 void
-pp_format (pretty_printer *pp, text_info *text)
+pp_format (pretty_printer *pp,
+	   text_info *text,
+	   const urlifier *urlifier)
 {
-  output_buffer *buffer = pp_buffer (pp);
+  output_buffer * const buffer = pp_buffer (pp);
   const char *p;
   const char **args;
   struct chunk_info *new_chunk_array;
@@ -1079,6 +1182,9 @@ pp_format (pretty_printer *pp, text_info *text)
   bool any_unnumbered = false, any_numbered = false;
   const char **formatters[PP_NL_ARGMAX];
 
+  /* Keep track of location of last "%", if any.  */
+  size_t quoted_text_start_idx = 0;
+
   /* Allocate a new chunk structure.  */
   new_chunk_array = XOBNEW (&buffer->chunk_obstack, struct chunk_info);
   new_chunk_array->prev = buffer->cur_chunk_array;
@@ -1122,11 +1228,21 @@ pp_format (pretty_printer *pp, text_info *text)
 	      = colorize_start (pp_show_color (pp), "quote");
 	    obstack_grow (&buffer->chunk_obstack, colorstr, strlen (colorstr));
 	    p++;
+
+	    /* Stash offset of start of quoted string.  */
+	    quoted_text_start_idx
+	      = obstack_object_size (&buffer->chunk_obstack);
+
 	    continue;
 	  }
 
 	case '>':
 	  {
+	    if (quoted_text_start_idx)
+	      {
+		urlify_quoted_string (pp, urlifier, quoted_text_start_idx);
+		quoted_text_start_idx = 0;
+	      }
 	    const char *colorstr = colorize_stop (pp_show_color (pp));
 	    obstack_grow (&buffer->chunk_obstack, colorstr, strlen (colorstr));
 	  }
@@ -1168,6 +1284,12 @@ pp_format (pretty_printer *pp, text_info *text)
 	  obstack_1grow (&buffer->chunk_obstack, '\0');
 	  gcc_assert (chunk < PP_NL_ARGMAX * 2);
 	  args[chunk++] = XOBFINISH (&buffer->chunk_obstack, const char *);
+	  /* We can't yet handle urlifying quoted strings that use
+	     a combination of phase 1 and phase 2 e.g.
+	     "did you mean %<-%s%>".
+	     Stop any phase 1 quoted text if there are going to be any
+	     phase 2 quoted chunks.  */
+	  quoted_text_start_idx = 0;
 	  break;
 	}
 
@@ -1270,6 +1392,7 @@ pp_format (pretty_printer *pp, text_info *text)
       bool plus = false;
       bool hash = false;
       bool quote = false;
+      quoted_text_start_idx = 0;
 
       /* We do not attempt to enforce any ordering on the modifier
 	 characters.  */
@@ -1310,7 +1433,11 @@ pp_format (pretty_printer *pp, text_info *text)
       gcc_assert (!wide || precision == 0);
 
       if (quote)
-	pp_begin_quote (pp, pp_show_color (pp));
+	{
+	  pp_begin_quote (pp, pp_show_color (pp));
+	  quoted_text_start_idx
+	    = obstack_object_size (&buffer->chunk_obstack);
+	}
 
       switch (*p)
 	{
@@ -1480,7 +1607,14 @@ pp_format (pretty_printer *pp, text_info *text)
 	}
 
       if (quote)
-	pp_end_quote (pp, pp_show_color (pp));
+	{
+	  if (quoted_text_start_idx)
+	    {
+	      urlify_quoted_string (pp, urlifier, quoted_text_start_idx);
+	      quoted_text_start_idx = 0;
+	    }
+	  pp_end_quote (pp, pp_show_color (pp));
+	}
 
       obstack_1grow (&buffer->chunk_obstack, '\0');
       *formatters[argno] = XOBFINISH (&buffer->chunk_obstack, const char *);
@@ -1507,7 +1641,7 @@ void
 pp_output_formatted_text (pretty_printer *pp)
 {
   unsigned int chunk;
-  output_buffer *buffer = pp_buffer (pp);
+  output_buffer * const buffer = pp_buffer (pp);
   struct chunk_info *chunk_array = buffer->cur_chunk_array;
   const char **args = chunk_array->args;
 
@@ -2640,6 +2774,101 @@ test_null_urls ()
   }
 }
 
+/* Verify that URLification works as expected.  */
+
+static void
+pp_printf_with_urlifier (pretty_printer *pp,
+			 const urlifier *urlifier,
+			 const char *msg, ...)
+{
+  va_list ap;
+
+  va_start (ap, msg);
+  text_info text (msg, &ap, errno);
+  pp_format (pp, &text, urlifier);
+  pp_output_formatted_text (pp);
+  va_end (ap);
+}
+
+
+void
+test_urlification ()
+{
+  class test_urlifier : public urlifier
+  {
+  public:
+    char *
+    get_url_for_quoted_text (const char *p, size_t sz) const final override
+    {
+      if (!strncmp (p, "-foption", sz))
+	return xstrdup ("http://example.com");
+      return nullptr;
+    }
+  };
+
+  auto_fix_quotes fix_quotes;
+  const test_urlifier urlifier;
+
+  /* Uses of "%<" and "%>".  */
+  {
+    {
+      pretty_printer pp;
+      pp.url_format = URL_FORMAT_NONE;
+      pp_printf_with_urlifier (&pp, &urlifier,
+			       "foo %<-foption%> %<unrecognized%> bar");
+      ASSERT_STREQ ("foo `-foption' `unrecognized' bar",
+		    pp_formatted_text (&pp));
+    }
+    {
+      pretty_printer pp;
+      pp.url_format = URL_FORMAT_ST;
+      pp_printf_with_urlifier (&pp, &urlifier,
+			       "foo %<-foption%> %<unrecognized%> bar");
+      ASSERT_STREQ
+	("foo `\33]8;;http://example.com\33\\-foption\33]8;;\33\\'"
+	 " `unrecognized' bar",
+	 pp_formatted_text (&pp));
+    }
+    {
+      pretty_printer pp;
+      pp.url_format = URL_FORMAT_BEL;
+      pp_printf_with_urlifier (&pp, &urlifier,
+			       "foo %<-foption%> %<unrecognized%> bar");
+      ASSERT_STREQ
+	("foo `\33]8;;http://example.com\a-foption\33]8;;\a'"
+	 " `unrecognized' bar",
+	 pp_formatted_text (&pp));
+    }
+  }
+
+  /* Use of "%qs".  */
+  {
+    pretty_printer pp;
+    pp.url_format = URL_FORMAT_ST;
+    pp_printf_with_urlifier (&pp, &urlifier,
+			     "foo %qs %qs bar",
+			     "-foption", "unrecognized");
+    ASSERT_STREQ
+      ("foo `\33]8;;http://example.com\33\\-foption\33]8;;\33\\'"
+       " `unrecognized' bar",
+       pp_formatted_text (&pp));
+  }
+
+  /* Mixed usage of %< and %s, where the quoted string is built between
+     a mixture of phase 1 and phase 2.  */
+  {
+    pretty_printer pp;
+    pp.url_format = URL_FORMAT_ST;
+    pp_printf_with_urlifier (&pp, &urlifier,
+			     "foo %<-f%s%> bar",
+			     "option");
+    /* We don't support this, but make sure we don't crash.  */
+    ASSERT_STREQ
+      ("foo `-foption' bar",
+       pp_formatted_text (&pp));
+  }
+}
+
 /* Test multibyte awareness.  */
 static void test_utf8 ()
 {
@@ -2690,6 +2919,7 @@ pretty_print_cc_tests ()
   test_prefixes_and_wrapping ();
   test_urls ();
   test_null_urls ();
+  test_urlification ();
   test_utf8 ();
 }
 
diff --git a/gcc/pretty-print.h b/gcc/pretty-print.h
index 8759f0def38..9ba2c0a406e 100644
--- a/gcc/pretty-print.h
+++ b/gcc/pretty-print.h
@@ -228,6 +228,8 @@ class format_postprocessor
 /* True if colors should be shown.  */
 #define pp_show_color(PP) (PP)->show_color
 
+class urlifier;
+
 /* The data structure that contains the bare minimum required to do
    proper pretty-printing.  Clients may derived from this structure
    and add additional fields they need.  */
@@ -404,7 +406,8 @@ extern void pp_verbatim (pretty_printer *, const char *, ...)
      ATTRIBUTE_GCC_PPDIAG(2,3);
 extern void pp_flush (pretty_printer *);
 extern void pp_really_flush (pretty_printer *);
-extern void pp_format (pretty_printer *, text_info *);
+extern void pp_format (pretty_printer *, text_info *,
+		       const urlifier * = nullptr);
 extern void pp_output_formatted_text (pretty_printer *);
 extern void pp_format_verbatim (pretty_printer *, text_info *);
 
diff --git a/gcc/selftest-run-tests.cc b/gcc/selftest-run-tests.cc
index e2fc8f84b1b..cb53e90ebaf 100644
--- a/gcc/selftest-run-tests.cc
+++ b/gcc/selftest-run-tests.cc
@@ -120,6 +120,7 @@ selftest::run_tests ()
   lang_hooks.run_lang_selftests ();
 
   text_art_tests ();
+  gcc_urlifier_cc_tests ();
 
   /* Run the analyzer selftests (if enabled).  */
   ana::selftest::run_analyzer_selftests ();
diff --git a/gcc/selftest.h b/gcc/selftest.h
index 20d522afda4..b0a4142fe34 100644
--- a/gcc/selftest.h
+++ b/gcc/selftest.h
@@ -231,6 +231,7 @@ extern void et_forest_cc_tests ();
 extern void fibonacci_heap_cc_tests ();
 extern void fold_const_cc_tests ();
 extern void function_tests_cc_tests ();
+extern void gcc_urlifier_cc_tests ();
 extern void ggc_tests_cc_tests ();
 extern void gimple_cc_tests ();
 extern void hash_map_tests_cc_tests ();
diff --git a/gcc/toplev.cc b/gcc/toplev.cc
index d098a7c72a0..e39162a3e49 100644
--- a/gcc/toplev.cc
+++ b/gcc/toplev.cc
@@ -88,6 +88,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "ipa-modref.h"
 #include "ipa-param-manipulation.h"
 #include "dbgcnt.h"
+#include "gcc-urlifier.h"
 
 #include "selftest.h"
 
@@ -1048,6 +1049,7 @@ general_init (const char *argv0, bool init_signals)
   global_dc->m_option_state = &global_options;
   global_dc->m_option_name = option_name;
   global_dc->m_get_option_url = get_option_url;
+  global_dc->m_urlifier = make_gcc_urlifier ();
 
   if (init_signals)
     {
-- 
2.26.3


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

end of thread, other threads:[~2023-11-04  2:00 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-11-02 13:19 [PATCH/RFC 0/4] C/C++/diagnostics: various UX improvements David Malcolm
2023-11-02 13:19 ` [PATCH 1/4] c/c++: rework pragma parsing David Malcolm
2023-11-02 13:19 ` [PATCH 2/4] c: add #pragma GCC show_layout David Malcolm
2023-11-02 13:19 ` [PATCH 3/4] diagnostics: add automatic URL-ification within messages David Malcolm
2023-11-04  1:59   ` [pushed] " David Malcolm
2023-11-02 13:19 ` [PATCH 4/4] RFC: add contrib/regenerate-index-urls.py David Malcolm

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).