STANNIX Community


Manual: g++-15

GCC(1)							     GNU						      GCC(1)

NAME
       gcc - GNU project C and C++ compiler

SYNOPSIS
       gcc [-c|-S|-E] [-std=standard]
	   [-g] [-pg] [-Olevel]
	   [-Wwarn...] [-Wpedantic]
	   [-Idir...] [-Ldir...]
	   [-Dmacro[=defn]...] [-Umacro]
	   [-foption...] [-mmachine-option...]
	   [-o outfile] [@file] infile...

       Only the most useful options are listed here; see below for the remainder.  g++ accepts mostly the same options as
       gcc.

DESCRIPTION
       When you invoke GCC, it normally does preprocessing, compilation, assembly and linking.	The "overall options" allow
       you to stop this process at an intermediate stage.  For example, the -c option says not to run the linker.  Then the
       output consists of object files output by the assembler.

       Other options are passed on to one or more stages of processing.	 Some options control the preprocessor and others
       the compiler itself.  Yet other options control the assembler and linker; most of these are not documented here,
       since you rarely need to use any of them.

       Most of the command-line options that you can use with GCC are useful for C programs; when an option is only useful
       with another language (usually C++), the explanation says so explicitly.	 If the description for a particular option
       does not mention a source language, you can use that option with all supported languages.

       The usual way to run GCC is to run the executable called gcc, or machine-gcc when cross-compiling, or
       machine-gcc-version to run a specific version of GCC.  When you compile C++ programs, you should invoke GCC as g++
       instead.

       The gcc program accepts options and file names as operands.  Many options have multi-letter names; therefore multiple
       single-letter options may not be grouped: -dv is very different from -d -v.

       You can mix options and other arguments.	 For the most part, the order you use doesn't matter.  Order does matter
       when you use several options of the same kind; for example, if you specify -L more than once, the directories are
       searched in the order specified.	 Also, the placement of the -l option is significant.

       Many options have long names starting with -f or with -W---for example, -fmove-loop-invariants, -Wformat and so on.
       Most of these have both positive and negative forms; the negative form of -ffoo is -fno-foo.  This manual documents
       only one of these two forms, whichever one is not the default.

       Some options take one or more arguments typically separated either by a space or by the equals sign (=) from the
       option name.  Unless documented otherwise, an argument can be either numeric or a string.  Numeric arguments must
       typically be small unsigned decimal or hexadecimal integers.  Hexadecimal arguments must begin with the 0x prefix.
       Arguments to options that specify a size threshold of some sort may be arbitrarily large decimal or hexadecimal
       integers followed by a byte size suffix designating a multiple of bytes such as "kB" and "KiB" for kilobyte and
       kibibyte, respectively, "MB" and "MiB" for megabyte and mebibyte, "GB" and "GiB" for gigabyte and gigibyte, and so
       on.  Such arguments are designated by byte-size in the following text.  Refer to the NIST, IEC, and other relevant
       national and international standards for the full listing and explanation of the binary and decimal byte size
       prefixes.

OPTIONS
   Option Summary
       Here is a summary of all the options, grouped by type.  Explanations are in the following sections.

       Overall Options
	   -c	-S   -E	  -o  file  -dumpbase  dumpbase	  -dumpbase-ext	 auxdropsuf  -dumpdir  dumppfx	-x language -v	-###
	   --help[=class[,...]]	   --target-help    --version	-pass-exit-codes    -pipe    -specs=file    -wrapper   @file
	   -ffile-prefix-map=old=new	-fcanon-prefix-map   -fplugin=file    -fplugin-arg-name=arg   -fdump-ada-spec[-slim]
	   -fada-spec-parent=unit  -fdump-go-spec=file

       C Language Options
	   -ansi   -std=standard   -aux-info  filename	 -fno-asm   -fno-builtin    -fno-builtin-function    -fcond-mismatch
	   -ffreestanding    -fgimple	 -fgnu-tm    -fgnu89-inline    -fhosted	  -flax-vector-conversions   -fms-extensions
	   -fpermitted-flt-eval-methods=standard -fplan9-extensions  -fsigned-bitfields	 -funsigned-bitfields  -fsigned-char
	   -funsigned-char  -fstrict-flex-arrays[=n] -fsso-struct=endianness

       C++ Language Options
	   -fabi-version=n     -fno-access-control    -faligned-new=n	  -fno-assume-sane-operators-new-delete	   -fchar8_t
	   -fcheck-new	   -fconcepts	   -fconstexpr-depth=n	     -fconstexpr-cache-depth=n	    -fconstexpr-loop-limit=n
	   -fconstexpr-ops-limit=n -fno-elide-constructors -fno-enforce-eh-specs -fno-gnu-keywords -fno-immediate-escalation
	   -fno-implicit-templates	-fno-implicit-inline-templates	   -fno-implement-inlines     -fmodule-header[=kind]
	   -fmodule-only     -fmodules	   -fmodule-implicit-inline	 -fno-module-lazy      -fmodule-mapper=specification
	   -fmodule-version-ignore    -fms-extensions	 -fnew-inheriting-ctors	  -fnew-ttp-matching   -fno-nonansi-builtins
	   -fnothrow-opt  -fno-operator-names  -fno-optional-diags  -fno-pretty-templates   -frange-for-ext-temps  -fno-rtti
	   -fsized-deallocation	      -fstrong-eval-order[=kind]       -ftemplate-backtrace-limit=n	  -ftemplate-depth=n
	   -fno-threadsafe-statics	 -fuse-cxa-atexit      -fno-weak       -nostdinc++	 -fvisibility-inlines-hidden
	   -fvisibility-ms-compat		 -fext-numeric-literals		      -flang-info-include-translate[=header]
	   -flang-info-include-translate-not	 -flang-info-module-cmi[=module]     -stdlib=libstdc++,libc++	   -Wabi-tag
	   -Wcatch-value	-Wcatch-value=n	      -Wno-class-conversion	   -Wclass-memaccess	   -Wcomma-subscript
	   -Wconditionally-supported	    -Wno-conversion-null	 -Wctad-maybe-unsupported	 -Wctor-dtor-privacy
	   -Wdangling-reference	    -Wno-defaulted-function-deleted	-Wno-delete-incomplete	   -Wdelete-non-virtual-dtor
	   -Wno-deprecated-array-compare   -Wdeprecated-copy   -Wdeprecated-copy-dtor	-Wno-deprecated-enum-enum-conversion
	   -Wno-deprecated-enum-float-conversion    -Weffc++	-Wno-elaborated-enum-base    -Wno-exceptions	-Wextra-semi
	   -Wno-global-module	    -Wno-inaccessible-base	 -Wno-inherited-variadic-ctor	     -Wno-init-list-lifetime
	   -Winvalid-constexpr	-Winvalid-imported-macros -Wno-invalid-offsetof	 -Wno-literal-suffix -Wmismatched-new-delete
	   -Wmismatched-tags	-Wmultiple-inheritance	   -Wnamespaces	     -Wnarrowing     -Wnoexcept	     -Wnoexcept-type
	   -Wnon-virtual-dtor	  -Wpessimizing-move	  -Wno-placement-new	 -Wplacement-new=n    -Wrange-loop-construct
	   -Wredundant-move   -Wredundant-tags	 -Wreorder    -Wregister   -Wstrict-null-sentinel     -Wno-subobject-linkage
	   -Wtemplates	-Wno-non-template-friend   -Wold-style-cast  -Woverloaded-virtual   -Wno-pmf-conversions -Wself-move
	   -Wsign-promo	   -Wsized-deallocation	    -Wsuggest-final-methods    -Wsuggest-final-types	  -Wsuggest-override
	   -Wno-template-body	 -Wno-template-id-cdtor	    -Wtemplate-names-tu-local	 -Wno-terminate	   -Wno-vexing-parse
	   -Wvirtual-inheritance -Wno-virtual-move-assign  -Wvolatile

       Objective-C and Objective-C++ Language Options
	   -fconstant-string-class=class-name	-fgnu-runtime	 -fnext-runtime	  -fno-nil-receivers	-fobjc-abi-version=n
	   -fobjc-call-cxx-cdtors   -fobjc-direct-dispatch   -fobjc-exceptions	-fobjc-gc  -fobjc-nilcheck  -fobjc-std=objc1
	   -fno-local-ivars    -fivar-visibility=[public|protected|private|package]    -freplace-objc-classes	 -fzero-link
	   -gen-decls	 -Wassign-intercept    -Wno-property-assign-default   -Wno-protocol   -Wobjc-root-class	  -Wselector
	   -Wstrict-selector-match -Wundeclared-selector

       OpenMP and OpenACC Options
	   -foffload=arg      -foffload-options=arg	-fopenacc	-fopenacc-dim=geom	-fopenmp       -fopenmp-simd
	   -fopenmp-target-simd-clone[=device-type]

       Diagnostic Message Formatting Options
	   -fmessage-length=n		 -fdiagnostics-plain-output	       -fdiagnostics-show-location=[once|every-line]
	   -fdiagnostics-color=[auto|never|always] -fdiagnostics-urls=[auto|never|always]  -fdiagnostics-format=[text|sarif-
	   stderr|sarif-file|json|json-stderr|json-file]		    -fdiagnostics-add-output=DIAGNOSTICS-OUTPUT-SPEC
	   -fdiagnostics-set-output=DIAGNOSTICS-OUTPUT-SPEC  -fno-diagnostics-json-formatting	-fno-diagnostics-show-option
	   -fno-diagnostics-show-caret		   -fno-diagnostics-show-event-links		-fno-diagnostics-show-labels
	   -fno-diagnostics-show-line-numbers		  -fno-diagnostics-show-cwe		 -fno-diagnostics-show-rules
	   -fno-diagnostics-show-highlight-colors   -fdiagnostics-minimum-margin-width=width  -fdiagnostics-parseable-fixits
	   -fdiagnostics-generate-patch			 -fdiagnostics-show-template-tree		     -fno-elide-type
	   -fdiagnostics-path-format=[none|separate-events|inline-events]   -fdiagnostics-show-path-depths  -fno-show-column
	   -fdiagnostics-column-unit=[display|byte]					  -fdiagnostics-column-origin=origin
	   -fdiagnostics-escape-format=[unicode|bytes] -fdiagnostics-text-art-charset=[none|ascii|unicode|emoji]

       Warning Options
	   -fsyntax-only   -fmax-errors=n   -Wpedantic	-pedantic-errors  -fpermissive -w  -Wextra  -Wall  -Wabi=n -Waddress
	   -Wno-address-of-packed-member  -Waggregate-return -Walloc-size  -Walloc-size-larger-than=byte-size	-Walloc-zero
	   -Walloca   -Walloca-larger-than=byte-size  -Wno-aggressive-loop-optimizations  -Warith-conversion  -Warray-bounds
	   -Warray-bounds=n  -Warray-compare  -Warray-parameter	  -Warray-parameter=n  -Wno-attributes	 -Wattribute-alias=n
	   -Wno-attribute-alias -Wno-attribute-warning -Wbidi-chars=[none|unpaired|any|ucn] -Wbool-compare  -Wbool-operation
	   -Wno-builtin-declaration-mismatch	  -Wno-builtin-macro-redefined	     -Wc90-c99-compat	    -Wc99-c11-compat
	   -Wc11-c23-compat  -Wc23-c2y-compat -Wc++-compat  -Wc++11-compat   -Wc++14-compat   -Wc++17-compat  -Wc++20-compat
	   -Wno-c++11-extensions   -Wno-c++14-extensions  -Wno-c++17-extensions -Wno-c++20-extensions  -Wno-c++23-extensions
	   -Wcalloc-transposed-args -Wcast-align  -Wcast-align=strict  -Wcast-function-type   -Wcast-qual  -Wchar-subscripts
	   -Wclobbered	     -Wcomment	    -Wcompare-distinct-pointer-types	  -Wno-complain-wrong-lang	-Wconversion
	   -Wno-coverage-mismatch    -Wno-cpp	-Wdangling-else	   -Wdangling-pointer	 -Wdangling-pointer=n	 -Wdate-time
	   -Wno-deprecated	    -Wno-deprecated-declarations	 -Wno-designated-init	     -Wdisabled-optimization
	   -Wno-discarded-array-qualifiers	  -Wno-discarded-qualifiers	  -Wno-div-by-zero	  -Wdouble-promotion
	   -Wduplicated-branches    -Wduplicated-cond  -Wempty-body   -Wno-endif-labels	  -Wenum-compare   -Wenum-conversion
	   -Wenum-int-mismatch -Werror	 -Werror=*   -Wexpansion-to-defined   -Wfatal-errors  -Wflex-array-member-not-at-end
	   -Wfloat-conversion	 -Wfloat-equal	  -Wformat    -Wformat=2   -Wno-format-contains-nul   -Wno-format-extra-args
	   -Wformat-nonliteral	  -Wformat-overflow=n	 -Wformat-security     -Wformat-signedness     -Wformat-truncation=n
	   -Wformat-y2k	     -Wframe-address	-Wframe-larger-than=byte-size	  -Wno-free-nonheap-object    -Wheader-guard
	   -Wno-if-not-aligned	-Wno-ignored-attributes	 -Wignored-qualifiers	-Wno-incompatible-pointer-types	  -Whardened
	   -Wimplicit	     -Wimplicit-fallthrough	   -Wimplicit-fallthrough=n	  -Wno-implicit-function-declaration
	   -Wno-implicit-int  -Winfinite-recursion   -Winit-self    -Winline	-Wno-int-conversion    -Wint-in-bool-context
	   -Wno-int-to-pointer-cast	  -Wno-invalid-memory-model	 -Winvalid-pch	    -Winvalid-utf8	-Wno-unicode
	   -Wjump-misses-init  -Wlarger-than=byte-size	 -Wleading-whitespace=kind  -Wlogical-not-parentheses	-Wlogical-op
	   -Wlong-long	 -Wno-lto-type-mismatch	 -Wmain	  -Wmaybe-uninitialized	 -Wmemset-elt-size  -Wmemset-transposed-args
	   -Wmisleading-indentation	   -Wmissing-attributes		-Wmissing-braces	-Wmissing-field-initializers
	   -Wmissing-format-attribute	     -Wmissing-include-dirs	    -Wmissing-noreturn	       -Wmusttail-local-addr
	   -Wmaybe-musttail-local-addr	   -Wno-missing-profile	   -Wno-multichar     -Wmultistatement-macros	   -Wnonnull
	   -Wnonnull-compare  -Wnormalized=[none|id|nfc|nfkc]  -Wnull-dereference   -Wno-odr  -Wopenacc-parallelism -Wopenmp
	   -Wopenmp-simd      -Wno-overflow	  -Woverlength-strings	      -Wno-override-init-side-effects	    -Wpacked
	   -Wno-packed-bitfield-compat	    -Wpacked-not-aligned      -Wpadded	   -Wparentheses     -Wno-pedantic-ms-format
	   -Wpointer-arith   -Wno-pointer-compare   -Wno-pointer-to-int-cast  -Wno-pragmas   -Wno-pragma-once-outside-header
	   -Wno-prio-ctor-dtor	  -Wno-psabi	-Wredundant-decls     -Wrestrict    -Wno-return-local-addr     -Wreturn-type
	   -Wno-scalar-storage-order  -Wsequence-point -Wshadow	 -Wshadow=global  -Wshadow=local   -Wshadow=compatible-local
	   -Wno-shadow-ivar -Wno-shift-count-negative  -Wno-shift-count-overflow  -Wshift-negative-value -Wno-shift-overflow
	   -Wshift-overflow=n	  -Wsign-compare      -Wsign-conversion	    -Wno-sizeof-array-argument	  -Wsizeof-array-div
	   -Wsizeof-pointer-div	 -Wsizeof-pointer-memaccess  -Wstack-protector	 -Wstack-usage=byte-size   -Wstrict-aliasing
	   -Wstrict-aliasing=n	    -Wstrict-overflow	   -Wstrict-overflow=n	  -Wstring-compare    -Wno-stringop-overflow
	   -Wno-stringop-overread -Wno-stringop-truncation  -Wstrict-flex-arrays -Wsuggest-attribute=attribute-name -Wswitch
	   -Wno-switch-bool  -Wswitch-default  -Wswitch-enum -Wno-switch-outside-range	-Wno-switch-unreachable	 -Wsync-nand
	   -Wsystem-headers    -Wtautological-compare	 -Wtrailing-whitespace	 -Wtrailing-whitespace=kind    -Wtrampolines
	   -Wtrigraphs	 -Wtrivial-auto-var-init    -Wno-tsan	-Wtype-limits	-Wundef	 -Wuninitialized   -Wunknown-pragmas
	   -Wunsuffixed-float-constants	    -Wunterminated-string-initialization     -Wunused	  -Wunused-but-set-parameter
	   -Wunused-but-set-variable  -Wunused-const-variable	-Wunused-const-variable=n  -Wunused-function  -Wunused-label
	   -Wunused-local-typedefs -Wunused-macros -Wunused-parameter  -Wno-unused-result -Wunused-value   -Wunused-variable
	   -Wuse-after-free	     -Wuse-after-free=n		-Wuseless-cast	      -Wno-varargs	   -Wvariadic-macros
	   -Wvector-operation-performance -Wvla	 -Wvla-larger-than=byte-size   -Wno-vla-larger-than  -Wvolatile-register-var
	   -Wwrite-strings -Wno-xor-used-as-pow -Wzero-as-null-pointer-constant -Wzero-length-bounds

       Static Analyzer Options
	   -fanalyzer  -fanalyzer-call-summaries  -fanalyzer-checker=name  -fno-analyzer-feasibility -fanalyzer-fine-grained
	   -fanalyzer-show-events-in-system-headers	      -fno-analyzer-state-merge		   -fno-analyzer-state-purge
	   -fno-analyzer-suppress-followups   -fanalyzer-transitivity  -fno-analyzer-undo-inlining  -fanalyzer-verbose-edges
	   -fanalyzer-verbose-state-changes	-fanalyzer-verbosity=level     -fdump-analyzer	   -fdump-analyzer-callgraph
	   -fdump-analyzer-exploded-graph	    -fdump-analyzer-exploded-nodes	    -fdump-analyzer-exploded-nodes-2
	   -fdump-analyzer-exploded-nodes-3	       -fdump-analyzer-exploded-paths		 -fdump-analyzer-feasibility
	   -fdump-analyzer-infinite-loop     -fdump-analyzer-json     -fdump-analyzer-state-purge     -fdump-analyzer-stderr
	   -fdump-analyzer-supergraph	-fdump-analyzer-untracked   -Wno-analyzer-double-fclose	   -Wno-analyzer-double-free
	   -Wno-analyzer-exposure-through-output-file				  -Wno-analyzer-exposure-through-uninit-copy
	   -Wno-analyzer-fd-access-mode-mismatch	     -Wno-analyzer-fd-double-close	       -Wno-analyzer-fd-leak
	   -Wno-analyzer-fd-phase-mismatch	    -Wno-analyzer-fd-type-mismatch	    -Wno-analyzer-fd-use-after-close
	   -Wno-analyzer-fd-use-without-check		  -Wno-analyzer-file-leak	      -Wno-analyzer-free-of-non-heap
	   -Wno-analyzer-imprecise-fp-arithmetic	 -Wno-analyzer-infinite-loop	    -Wno-analyzer-infinite-recursion
	   -Wno-analyzer-jump-through-null	   -Wno-analyzer-malloc-leak	      -Wno-analyzer-mismatching-deallocation
	   -Wno-analyzer-null-argument		     -Wno-analyzer-null-dereference		 -Wno-analyzer-out-of-bounds
	   -Wno-analyzer-overlapping-buffers  -Wno-analyzer-possible-null-argument   -Wno-analyzer-possible-null-dereference
	   -Wno-analyzer-putenv-of-auto-var	  -Wno-analyzer-shift-count-negative	  -Wno-analyzer-shift-count-overflow
	   -Wno-analyzer-stale-setjmp-buffer	  -Wno-analyzer-tainted-allocation-size	     -Wno-analyzer-tainted-assertion
	   -Wno-analyzer-tainted-array-index		-Wno-analyzer-tainted-divisor		-Wno-analyzer-tainted-offset
	   -Wno-analyzer-tainted-size		       -Wanalyzer-symbol-too-complex		      -Wanalyzer-too-complex
	   -Wno-analyzer-undefined-behavior-ptrdiff				     -Wno-analyzer-undefined-behavior-strtok
	   -Wno-analyzer-unsafe-call-within-signal-handler					-Wno-analyzer-use-after-free
	   -Wno-analyzer-use-of-pointer-in-stale-stack-frame			    -Wno-analyzer-use-of-uninitialized-value
	   -Wno-analyzer-va-arg-type-mismatch		-Wno-analyzer-va-list-exhausted		  -Wno-analyzer-va-list-leak
	   -Wno-analyzer-va-list-use-after-va-end -Wno-analyzer-write-to-const -Wno-analyzer-write-to-string-literal

       C and Objective-C-only Warning Options
	   -Wbad-function-cast	 -Wdeprecated-non-prototype  -Wfree-labels  -Wmissing-declarations  -Wmissing-parameter-name
	   -Wmissing-parameter-type		   -Wdeclaration-missing-parameter-type			-Wmissing-prototypes
	   -Wmissing-variable-declarations	 -Wnested-externs	-Wold-style-declaration	      -Wold-style-definition
	   -Wstrict-prototypes -Wtraditional -Wtraditional-conversion -Wdeclaration-after-statement -Wpointer-sign

       Debugging Options
	   -g	 -glevel    -gdwarf    -gdwarf-version	 -gbtf	 -gctf	  -gctflevel   -gprune-btf   -gno-prune-btf    -ggdb
	   -grecord-gcc-switches      -gno-record-gcc-switches	   -gstrict-dwarf      -gno-strict-dwarf    -gas-loc-support
	   -gno-as-loc-support	-gas-locview-support   -gno-as-locview-support	-gcodeview  -gcolumn-info   -gno-column-info
	   -gdwarf32	   -gdwarf64	  -gstatement-frontiers	      -gno-statement-frontiers	   -gvariable-location-views
	   -gno-variable-location-views -ginternal-reset-location-views	 -gno-internal-reset-location-views  -ginline-points
	   -gno-inline-points -gvms -gz[=type] -gsplit-dwarf  -gdescribe-dies  -gno-describe-dies -fdebug-prefix-map=old=new
	   -fdebug-types-section -fno-eliminate-unused-debug-types -femit-struct-debug-baseonly	 -femit-struct-debug-reduced
	   -femit-struct-debug-detailed[=spec-list]	 -fno-eliminate-unused-debug-symbols	   -femit-class-debug-always
	   -fno-merge-debug-strings  -fno-dwarf2-cfi-asm -fvar-tracking	 -fvar-tracking-assignments

       Optimization Options
	   -faggressive-loop-optimizations	  -falign-functions[=n[:m:[n2[:m2]]]]	     -falign-jumps[=n[:m:[n2[:m2]]]]
	   -falign-labels[=n[:m:[n2[:m2]]]] -falign-loops[=n[:m:[n2[:m2]]]] -fmin-function-alignment=[n] -fno-allocation-dce
	   -fallow-store-data-races	-fassociative-math	-fauto-profile	    -fauto-profile[=path]     -fauto-inc-dec
	   -fbranch-probabilities   -fcaller-saves    -fcombine-stack-adjustments     -fconserve-stack	  -ffold-mem-offsets
	   -fcompare-elim    -fcprop-registers	 -fcrossjumping	 -fcse-follow-jumps   -fcse-skip-blocks	  -fcx-fortran-rules
	   -fcx-limited-range  -fdata-sections	  -fdce	   -fdelayed-branch   -fdelete-null-pointer-checks    -fdevirtualize
	   -fdevirtualize-speculatively	       -fdevirtualize-at-ltrans	       -fdse	   -fearly-inlining	   -fipa-sra
	   -fexpensive-optimizations	   -ffat-lto-objects	  -ffast-math	     -ffinite-math-only	       -ffloat-store
	   -fexcess-precision=style  -ffinite-loops  -fforward-propagate   -ffp-contract=style	 -ffunction-sections  -fgcse
	   -fgcse-after-reload	   -fgcse-las	  -fgcse-lm	-fgraphite-identity    -fgcse-sm      -fhoist-adjacent-loads
	   -fif-conversion	-fif-conversion2      -findirect-inlining     -finline-stringops[=fn]	  -finline-functions
	   -finline-functions-called-once  -finline-limit=n -finline-small-functions -fipa-modref  -fipa-cp   -fipa-cp-clone
	   -fipa-bit-cp	  -fipa-vrp  -fipa-pta	-fipa-profile  -fipa-pure-const -fipa-reference	 -fipa-reference-addressable
	   -fipa-reorder-for-locality	       -fipa-stack-alignment	       -fipa-icf	   -fira-algorithm=algorithm
	   -flate-combine-instructions	 -flifetime-dse	  -flive-patching=level	  -fira-region=region	-fira-hoist-pressure
	   -fira-loop-pressure	-fno-ira-share-save-slots  -fno-ira-share-spill-slots  -fisolate-erroneous-paths-dereference
	   -fisolate-erroneous-paths-attribute	      -fivopts	      -fkeep-inline-functions	     -fkeep-static-functions
	   -fkeep-static-consts	   -flimit-function-alignment	 -flive-range-shrinkage	  -floop-block	  -floop-interchange
	   -floop-strip-mine   -floop-unroll-and-jam	-floop-nest-optimize   -floop-parallelize-all	 -flra-remat   -flto
	   -flto-compression-level -flto-partition=alg	-flto-incremental=path	-flto-incremental-cache-size=n	-fmalloc-dce
	   -fmerge-all-constants  -fmerge-constants   -fmodulo-sched   -fmodulo-sched-allow-regmoves  -fmove-loop-invariants
	   -fmove-loop-stores	 -fno-branch-count-reg	 -fno-defer-pop	   -fno-fp-int-builtin-inexact	   -fno-function-cse
	   -fno-guess-branch-probability	-fno-inline	   -fno-math-errno	  -fno-peephole	      -fno-peephole2
	   -fno-printf-return-value    -fno-sched-interblock   -fno-sched-spec	  -fno-signed-zeros    -fno-toplevel-reorder
	   -fno-trapping-math	-fno-zero-initialized-in-bss  -fomit-frame-pointer  -foptimize-crc  -foptimize-sibling-calls
	   -fpartial-inlining	  -fpeel-loops	   -fpredictive-commoning    -fprefetch-loop-arrays	-fprofile-correction
	   -fprofile-use    -fprofile-use=path	 -fprofile-partial-training   -fprofile-values	 -fprofile-reorder-functions
	   -freciprocal-math	 -free	   -frename-registers	   -freorder-blocks	-freorder-blocks-algorithm=algorithm
	   -freorder-blocks-and-partition   -freorder-functions	 -frerun-cse-after-loop	 -freschedule-modulo-scheduled-loops
	   -frounding-math    -fsave-optimization-record   -fsched2-use-superblocks    -fsched-pressure	   -fsched-spec-load
	   -fsched-spec-load-dangerous	 -fsched-stalled-insns-dep[=n]	  -fsched-stalled-insns[=n]  -fsched-group-heuristic
	   -fsched-critical-path-heuristic -fsched-spec-insn-heuristic	 -fsched-rank-heuristic	 -fsched-last-insn-heuristic
	   -fsched-dep-count-heuristic	   -fschedule-fusion	-fschedule-insns     -fschedule-insns2	   -fsection-anchors
	   -fselective-scheduling    -fselective-scheduling2   -fsel-sched-pipelining	  -fsel-sched-pipelining-outer-loops
	   -fsemantic-interposition    -fshrink-wrap   -fshrink-wrap-separate  -fsignaling-nans	 -fsingle-precision-constant
	   -fsplit-ivs-in-unroller  -fsplit-loops -fsplit-paths -fsplit-wide-types  -fsplit-wide-types-early  -fssa-backprop
	   -fssa-phiopt -fstdarg-opt   -fstore-merging	 -fstrict-aliasing  -fipa-strict-aliasing  -fthread-jumps   -ftracer
	   -ftree-bit-ccp    -ftree-builtin-call-dce	 -ftree-ccp	-ftree-ch    -ftree-coalesce-vars   -ftree-copy-prop
	   -ftree-cselim   -ftree-dce	-ftree-dominator-opts  -ftree-dse   -ftree-forwprop    -ftree-fre    -fcode-hoisting
	   -ftree-loop-if-convert   -ftree-loop-im -ftree-phiprop  -ftree-loop-distribution  -ftree-loop-distribute-patterns
	   -ftree-loop-ivcanon	-ftree-loop-linear   -ftree-loop-optimize  -ftree-loop-vectorize  -ftree-parallelize-loops=n
	   -ftree-pre	 -ftree-partial-pre    -ftree-pta   -ftree-reassoc    -ftree-scev-cprop	   -ftree-sink	 -ftree-slsr
	   -ftree-sra	 -ftree-switch-conversion     -ftree-tail-merge	    -ftree-ter	    -ftree-vectorize	  -ftree-vrp
	   -ftrivial-auto-var-init     -funconstrained-commons	   -funit-at-a-time	-funroll-all-loops    -funroll-loops
	   -funsafe-math-optimizations	 -funswitch-loops  -fipa-ra    -fvariable-expansion-in-unroller	   -fvect-cost-model
	   -fvpt  -fweb	  -fwhole-program   -fwpa  -fuse-linker-plugin -fzero-call-used-regs --param name=value -O  -O0	 -O1
	   -O2	-O3  -Os  -Ofast  -Og  -Oz

       Program Instrumentation Options
	   -p  -pg  -fprofile-arcs   --coverage	  -ftest-coverage  -fcondition-coverage	 -fpath-coverage  -fprofile-abs-path
	   -fprofile-dir=path		-fprofile-generate	     -fprofile-generate=path	      -fprofile-info-section
	   -fprofile-info-section=name	    -fprofile-note=path	     -fprofile-prefix-path=path	     -fprofile-update=method
	   -fprofile-filter-files=regex	    -fprofile-exclude-files=regex    -fprofile-reproducible=[multithreaded|parallel-
	   runs|serial]	     -fsanitize=style	    -fsanitize-recover	      -fsanitize-recover=style	     -fsanitize-trap
	   -fsanitize-trap=style		  -fasan-shadow-offset=number		       -fsanitize-sections=s1,s2,...
	   -fsanitize-undefined-trap-on-error			      -fbounds-check			     -fcf-protection
	   -fcf-protection=[full|branch|return|none|check]   -fharden-compares	 -fharden-conditional-branches	  -fhardened
	   -fharden-control-flow-redundancy  -fhardcfr-skip-leaf -fhardcfr-check-exceptions  -fhardcfr-check-returning-calls
	   -fhardcfr-check-noreturn-calls=[always|no-xthrow|nothrow|never]     -fstack-protector       -fstack-protector-all
	   -fstack-protector-strong	   -fstack-protector-explicit	      -fstack-check	  -fstack-limit-register=reg
	   -fstack-limit-symbol=sym  -fno-stack-limit	-fsplit-stack	-fstrub=disable	   -fstrub=strict    -fstrub=relaxed
	   -fstrub=all	 -fstrub=at-calls   -fstrub=internal  -fvtable-verify=[std|preinit|none]  -fvtv-counts	 -fvtv-debug
	   -finstrument-functions    -finstrument-functions-once    -finstrument-functions-exclude-function-list=sym,sym,...
	   -finstrument-functions-exclude-file-list=file,file,...				-fprofile-prefix-map=old=new
	   -fpatchable-function-entry=N[,M]

       Preprocessor Options
	   -Aquestion=answer  -A-question[=answer]  -C	 -CC   -Dmacro[=defn]  -dD    -dI    -dM    -dN	   -dU	 -fdebug-cpp
	   -fdirectives-only	      -fdollars-in-identifiers	       -fexec-charset=charset	      -fextended-identifiers
	   -finput-charset=charset   -fmacro-prefix-map=old=new	  -fmax-include-depth=depth    -fno-canonical-system-headers
	   -fpch-deps  -fpch-preprocess -fpreprocessed	-ftabstop=width	 -ftrack-macro-expansion -fwide-exec-charset=charset
	   -fworking-directory	-H   -imacros  file   -include file -M	-MD  -MF  -MG  -MM  -MMD  -MP  -MQ  -MT -Mno-modules
	   -no-integrated-cpp  -P  -pthread  -remap -traditional  -traditional-cpp  -trigraphs	-Umacro	  -undef  -Wp,option
	   -Xpreprocessor option

       Assembler Options
	   -Wa,option  -Xassembler option

       Linker Options
	   object-file-name   -fuse-ld=linker	-llibrary  -nostartfiles  -nodefaultlibs  -nolibc  -nostdlib  -nostdlib++ -e
	   entry  --entry=entry -pie  -pthread	-r  -rdynamic -s  -static   -static-pie	  -static-libgcc   -static-libstdc++
	   -static-libasan   -static-libtsan  -static-liblsan  -static-libubsan -shared	 -shared-libgcc	 -symbolic -T script
	   -Wl,option  -Xlinker option -u symbol  -z keyword

       Directory Options
	   -Bprefix  -Idir  -I- -idirafter dir -imacros file  -imultilib dir  -iplugindir=dir	-iprefix  file	-iquote	 dir
	   -isysroot	dir	-isystem    dir	   -iwithprefix	   dir	  -iwithprefixbefore   dir   --embed-dir=dir   -Ldir
	   -no-canonical-prefixes  --no-sysroot-suffix -nostdinc  -nostdinc++  --sysroot=dir

       Code Generation Options
	   -fcall-saved-reg   -fcall-used-reg  -ffixed-reg   -fexceptions  -fnon-call-exceptions    -fdelete-dead-exceptions
	   -funwind-tables   -fasynchronous-unwind-tables  -fno-gnu-unique  -finhibit-size-directive   -fcommon	  -fno-ident
	   -fpcc-struct-return	-fpic  -fPIC  -fpie  -fPIE  -fno-plt -fno-jump-tables  -fno-bit-tests  -frecord-gcc-switches
	   -freg-struct-return	  -fshort-enums	   -fshort-wchar   -fverbose-asm    -fpack-struct[=n]	-fleading-underscore
	   -ftls-model=model  -fstack-reuse=reuse_level	 -ftrampolines	 -ftrampoline-impl=[stack|heap]	  -ftrapv    -fwrapv
	   -fvisibility=[default|internal|hidden|protected]	      -fstrict-volatile-bitfields	     -fsync-libcalls
	   -fzero-init-padding-bits=value

       Developer Options
	   -dletters   -dumpspecs   -dumpmachine    -dumpversion   -dumpfullversion    -fcallgraph-info[=su,da]	  -fchecking
	   -fchecking=n	  -fdbg-cnt-list    -fdbg-cnt=counter-value-list   -fdisable-ipa-pass_name   -fdisable-rtl-pass_name
	   -fdisable-rtl-pass-name=range-list  -fdisable-tree-pass_name	  -fdisable-tree-pass-name=range-list	-fdump-debug
	   -fdump-earlydebug	-fdump-noaddr	  -fdump-unnumbered	-fdump-unnumbered-links	   -fdump-final-insns[=file]
	   -fdump-ipa-all	 -fdump-ipa-cgraph	  -fdump-ipa-inline	   -fdump-lang-all	  -fdump-lang-switch
	   -fdump-lang-switch-options	     -fdump-lang-switch-options=filename	-fdump-passes	     -fdump-rtl-pass
	   -fdump-rtl-pass=filename   -fdump-statistics	  -fdump-tree-all   -fdump-tree-switch	  -fdump-tree-switch-options
	   -fdump-tree-switch-options=filename	   -fcompare-debug[=opts]      -fcompare-debug-second	  -fenable-kind-pass
	   -fenable-kind-pass=range-list  -fira-verbose=n  -flto-report	  -flto-report-wpa   -fmem-report-wpa	-fmem-report
	   -fpre-ipa-mem-report	  -fpost-ipa-mem-report -fopt-info  -fopt-info-options[=file] -fmultiflags  -fprofile-report
	   -frandom-seed=string	 -fsched-verbose=n -fsel-sched-verbose	-fsel-sched-dump-cfg  -fsel-sched-pipelining-verbose
	   -fstats   -fstack-usage    -ftime-report    -ftime-report-details   -fvar-tracking-assignments-toggle    -gtoggle
	   -print-file-name=library	     -print-libgcc-file-name	     -print-multi-directory	    -print-multi-lib
	   -print-multi-os-directory	   -print-prog-name=program	   -print-search-dirs	     -Q	      -print-sysroot
	   -print-sysroot-headers-suffix -save-temps  -save-temps=cwd  -save-temps=obj	-time[=file]

       Machine-Dependent Options
	   AArch64  Options  (AArch64  Options)	 -mabi=name  -mbig-endian  -mlittle-endian -mgeneral-regs-only -mcmodel=tiny
	   -mcmodel=small  -mcmodel=large  -mstrict-align   -mno-strict-align  -momit-leaf-frame-pointer  -mtls-dialect=desc
	   -mtls-dialect=traditional	     -mtls-size=size	     -mfix-cortex-a53-835769	     -mfix-cortex-a53-843419
	   -mlow-precision-recip-sqrt	    -mlow-precision-sqrt       -mlow-precision-div	 -mpc-relative-literal-loads
	   -msign-return-address=scope	 -mbranch-protection=none|standard|pac-ret[+leaf  +b-key]|bti|gcs  -mharden-sls=opts
	   -march=name	 -mcpu=name   -mtune=name   -moverride=string	 -mverbose-cost-dump   -mstack-protector-guard=guard
	   -mstack-protector-guard-reg=sysreg  -mstack-protector-guard-offset=offset  -mtrack-speculation  -moutline-atomics
	   -mearly-ldp-fusion -mlate-ldp-fusion -Wexperimental-fmv-target

	   Adapteva Epiphany Options (Adapteva Epiphany Options) -mhalf-reg-file  -mprefer-short-insn-regs -mbranch-cost=num
	   -mcmove  -mnops=num	-msoft-cmpsf -msplit-lohi   -mpost-inc	 -mpost-modify	 -mstack-offset=num  -mround-nearest
	   -mlong-calls	  -mshort-calls	  -msmall16 -mfp-mode=mode  -mvect-double  -max-vect-align=num -msplit-vecmove-early
	   -m1reg-reg

	   AMD GCN Options (AMD GCN Options) -march=gpu -mtune=gpu -mstack-size=bytes

	   ARC Options (ARC Options)  -mbarrel-shifter	 -mjli-always  -mcpu=cpu   -mA6	  -mARC600   -mA7   -mARC700  -mdpfp
	   -mdpfp-compact   -mdpfp-fast	  -mno-dpfp-lrsr  -mea	 -mno-mpy   -mmul32x16	 -mmul64   -matomic  -mnorm   -mspfp
	   -mspfp-compact  -mspfp-fast	-msimd	-msoft-float  -mswap -mcrc  -mdsp-packa	 -mdvbf	 -mlock	 -mmac-d16  -mmac-24
	   -mrtsc   -mswape  -mtelephony   -mxy	  -misize   -mannotate-align	-marclinux    -marclinux_prof	-mlong-calls
	   -mmedium-calls    -msdata	-mirq-ctrl-saved   -mrgf-banked-regs   -mlpc-width=width   -G  num  -mvolatile-cache
	   -mtp-regno=regno    -malign-call	-mauto-modify-reg     -mbbit-peephole	   -mno-brcc	 -mcase-vector-pcrel
	   -mcompact-casesi   -mno-cond-exec   -mearly-cbranchsi -mexpand-adddi	 -mindexed-loads  -mlra	 -mlra-priority-none
	   -mlra-priority-compact   -mlra-priority-noncompact	 -mmillicode   -mmixed-code    -mq-class     -mRcq     -mRcw
	   -msize-level=level	 -mtune=cpu    -mmultcost=num	 -mcode-density-frame	-munalign-prob-threshold=probability
	   -mmpy-option=multo -mdiv-rem	 -mcode-density	 -mll64	 -mfpu=fpu  -mrf16  -mbranch-index

	   ARM Options (ARM Options)  -mapcs-frame   -mno-apcs-frame  -mabi=name  -mapcs-stack-check   -mno-apcs-stack-check
	   -mapcs-reentrant    -mno-apcs-reentrant  -mgeneral-regs-only	 -msched-prolog	  -mno-sched-prolog  -mlittle-endian
	   -mbig-endian -mbe8  -mbe32 -mfloat-abi=name -mfp16-format=name -mthumb-interwork  -mno-thumb-interwork -mcpu=name
	   -march=name	  -mfpu=name   -mtune=name    -mprint-tune-info	  -mstructure-size-boundary=n	 -mabort-on-noreturn
	   -mlong-calls	  -mno-long-calls  -msingle-pic-base   -mno-single-pic-base  -mpic-register=reg	 -mnop-fun-dllimport
	   -mpoke-function-name -mthumb	 -marm	 -mflip-thumb  -mtpcs-frame   -mtpcs-leaf-frame	 -mcaller-super-interworking
	   -mcallee-super-interworking	   -mtp=name	 -mtls-dialect=dialect	  -mword-relocations	-mfix-cortex-m3-ldrd
	   -mfix-cortex-a57-aes-1742098 -mfix-cortex-a72-aes-1655431 -munaligned-access -mneon-for-64bits  -mslow-flash-data
	   -masm-syntax-unified	   -mrestrict-it    -mverbose-cost-dump	   -mpure-code	  -mcmse   -mfix-cmse-cve-2021-35465
	   -mstack-protector-guard=guard		    -mstack-protector-guard-offset=offset		     -mfdpic
	   -mbranch-protection=none|standard|pac-ret[+leaf] [+bti]|bti[+pac-ret[+leaf]]

	   AVR	Options	 (AVR  Options)	 -mmcu=mcu  -mabsdata  -maccumulate-args  -mcvt -mbranch-cost=cost  -mfuse-add=level
	   -mfuse-move=level   -mfuse-move2    -mcall-prologues	   -mgas-isr-prologues	  -mint8    -mflmap    -mdouble=bits
	   -mlong-double=bits	-mno-call-main	-mn_flash=size	 -mfract-convert-truncate  -mno-interrupts -mmain-is-OS_task
	   -mrelax   -mrmw   -mstrict-X	  -mtiny-stack	-mrodata-in-ram	  -msplit-bit-shift    -msplit-ldst    -mshort-calls
	   -mskip-bug  -muse-nonzero-bits  -nodevicelib	 -nodevicespecs -Waddr-space-convert  -Wmisspelled-isr

	   Blackfin	Options	    (Blackfin	  Options)     -mcpu=cpu[-sirevision]	 -msim	   -momit-leaf-frame-pointer
	   -mno-omit-leaf-frame-pointer -mspecld-anomaly  -mno-specld-anomaly  -mcsync-anomaly	-mno-csync-anomaly -mlow-64k
	   -mno-low64k	    -mstack-check-l1	  -mid-shared-library	  -mno-id-shared-library       -mshared-library-id=n
	   -mleaf-id-shared-library   -mno-leaf-id-shared-library  -msep-data	-mno-sep-data  -mlong-calls  -mno-long-calls
	   -mfast-fp  -minline-plt  -mmulticore	 -mcorea  -mcoreb  -msdram -micplb

	   C6X Options (C6X Options) -mbig-endian  -mlittle-endian  -march=cpu -msim  -msdata=sdata-type

	   CRIS Options (CRIS Options) -mcpu=cpu  -march=cpu -mtune=cpu -mmax-stack-frame=n -metrax4   -metrax100   -mpdebug
	   -mcc-init	-mno-side-effects   -mstack-align    -mdata-align    -mconst-align   -m32-bit	 -m16-bit    -m8-bit
	   -mno-prologue-epilogue -melf	 -maout	 -sim  -sim2 -mmul-bug-workaround  -mno-mul-bug-workaround

	   C-SKY Options (C-SKY	 Options)  -march=arch	 -mcpu=cpu  -mbig-endian   -EB	 -mlittle-endian   -EL	-mhard-float
	   -msoft-float	  -mfpu=fpu   -mdouble-float   -mfdivdu	 -mfloat-abi=name  -melrw   -mistack   -mmp   -mcp   -mcache
	   -msecurity  -mtrust -mdsp  -medsp  -mvdsp -mdiv  -msmart  -mhigh-registers  -manchor	 -mpushpop   -mmultiple-stld
	   -mconstpool	-mstack-size  -mccrt -mbranch-cost=n  -mcse-cc	-msched-prolog -msim

	   Cygwin  and	MinGW  Options	(Cygwin	 and  MinGW  Options) -mconsole	 -mcrtdll=library  -mdll -mnop-fun-dllimport
	   -mthread -municode  -mwin32	-mwindows  -fno-set-stack-executable

	   Darwin Options (Darwin Options) -all_load  -allowable_client	 -arch	-arch_errors_fatal -arch_only  -bind_at_load
	   -bundle   -bundle_loader  -client_name   -compatibility_version   -current_version  -dead_strip  -dependency-file
	   -dylib_file	 -dylinker_install_name	 -dynamic   -dynamiclib	  -exported_symbols_list  -filelist  -flat_namespace
	   -force_cpusubtype_ALL  -force_flat_namespace	   -headerpad_max_install_names	  -iframework	-image_base    -init
	   -install_name    -keep_private_externs  -multi_module   -multiply_defined   -multiply_defined_unused	 -noall_load
	   -no_dead_strip_inits_and_terms  -nodefaultrpaths  -nofixprebinding	-nomultidefs	-noprebind    -noseglinkedit
	   -pagezero_size     -prebind	  -prebind_all_twolevel_modules	  -private_bundle    -read_only_relocs	  -sectalign
	   -sectobjectsymbols	  -whyload     -seg1addr    -sectcreate	     -sectobjectsymbols	     -sectorder	    -segaddr
	   -segs_read_only_addr	  -segs_read_write_addr	 -seg_addr_table   -seg_addr_table_filename   -seglinkedit  -segprot
	   -segs_read_only_addr	    -segs_read_write_addr    -single_module	-static	     -sub_library      -sub_umbrella
	   -twolevel_namespace	 -umbrella  -undefined -unexported_symbols_list	 -weak_reference_mismatches -whatsloaded  -F
	   -gused  -gfull  -mmacosx-version-min=version -mkernel  -mone-byte-bool

	   DEC Alpha Options (DEC Alpha Options) -mno-fp-regs  -msoft-float -mieee   -mieee-with-inexact   -mieee-conformant
	   -mfp-trap-mode=mode	-mfp-rounding-mode=mode -mtrap-precision=mode  -mbuild-constants -mcpu=cpu-type	 -mtune=cpu-
	   type	  -mbwx	   -mmax   -mfix   -mcix  -msafe-bwa   -msafe-partial  -mfloat-vax   -mfloat-ieee  -mexplicit-relocs
	   -msmall-data	 -mlarge-data -msmall-text  -mlarge-text -mmemory-latency=time

	   eBPF Options (eBPF Options) -mbig-endian -mlittle-endian -mframe-limit=bytes -mxbpf -mco-re	-mno-co-re  -mjmpext
	   -mjmp32 -malu32 -mv3-atomics -mbswap -msdiv -msmov -mcpu=version -masm=dialect -minline-memops-threshold=bytes

	   FR30 Options (FR30 Options) -msmall-model  -mno-lsim

	   FT32 Options (FT32 Options) -msim  -mlra  -mnodiv  -mft32b  -mcompress  -mnopm

	   FRV	 Options  (FRV	Options)  -mgpr-32   -mgpr-64	-mfpr-32   -mfpr-64  -mhard-float   -msoft-float  -malloc-cc
	   -mfixed-cc	-mdword	  -mno-dword  -mdouble	 -mno-double  -mmedia	-mno-media   -mmuladd	-mno-muladd  -mfdpic
	   -minline-plt	  -mgprel-ro  -multilib-library-pic -mlinked-fp	 -mlong-calls  -malign-labels -mlibrary-pic  -macc-4
	   -macc-8 -mpack  -mno-pack  -mno-eflags  -mcond-move	-mno-cond-move -moptimize-membar  -mno-optimize-membar -mscc
	   -mno-scc  -mcond-exec  -mno-cond-exec  -mvliw-branch	  -mno-vliw-branch  -mmulti-cond-exec	-mno-multi-cond-exec
	   -mnested-cond-exec -mno-nested-cond-exec  -mtomcat-stats -mTLS  -mtls -mcpu=cpu

	   GNU/Linux   Options	 (GNU/Linux   Options)	 -mglibc   -muclibc   -mmusl   -mbionic	  -mandroid  -tno-android-cc
	   -tno-android-ld

	   H8/300 Options (H8/300 Options) -mrelax  -mh	 -ms  -mn  -mexr  -mno-exr  -mint32  -malign-300

	   HPPA	 Options   (HPPA   Options)   -march=architecture-type	 -matomic-libcalls    -mbig-switch   -mcaller-copies
	   -mdisable-fpregs	-mdisable-indexing    -mordered	    -mfast-indirect-calls     -mgas	-mgnu-ld     -mhp-ld
	   -mfixed-range=register-range	 -mcoherent-ldcw  -mjump-in-delay   -mlinker-opt    -mlong-calls   -mlong-load-store
	   -mno-atomic-libcalls	     -mno-disable-fpregs     -mno-disable-indexing     -mno-fast-indirect-calls	    -mno-gas
	   -mno-jump-in-delay  -mno-long-load-store  -mno-portable-runtime   -mno-soft-float  -mno-space-regs	-msoft-float
	   -mpa-risc-1-0  -mpa-risc-1-1	  -mpa-risc-2-0	  -mportable-runtime  -mschedule=cpu-type  -mspace-regs	 -msoft-mult
	   -msio  -mwsio -munix=unix-std  -nolibdld  -static  -threads

	   IA-64 Options (IA-64 Options) -mbig-endian  -mlittle-endian	 -mgnu-as   -mgnu-ld   -mno-pic	 -mvolatile-asm-stop
	   -mregister-names   -msdata	-mno-sdata -mconstant-gp  -mauto-pic  -mfused-madd -minline-float-divide-min-latency
	   -minline-float-divide-max-throughput		  -mno-inline-float-divide	     -minline-int-divide-min-latency
	   -minline-int-divide-max-throughput -mno-inline-int-divide -minline-sqrt-min-latency	-minline-sqrt-max-throughput
	   -mno-inline-sqrt  -mdwarf2-asm   -mearly-stop-bits  -mfixed-range=register-range  -mtls-size=tls-size -mtune=cpu-
	   type	 -milp32  -mlp64 -msched-br-data-spec	-msched-ar-data-spec   -msched-control-spec  -msched-br-in-data-spec
	   -msched-ar-in-data-spec	    -msched-in-control-spec	   -msched-spec-ldc	    -msched-spec-control-ldc
	   -msched-prefer-non-data-spec-insns	 -msched-prefer-non-control-spec-insns	 -msched-stop-bits-after-every-cycle
	   -msched-count-spec-in-critical-path	     -msel-sched-dont-check-control-spec       -msched-fp-mem-deps-zero-cost
	   -msched-max-memory-insns-hard-limit	-msched-max-memory-insns=max-insns

	   LM32 Options (LM32 Options) -mbarrel-shift-enabled	-mdivide-enabled   -mmultiply-enabled  -msign-extend-enabled
	   -muser-enabled

	   LoongArch  Options  (LoongArch  Options)  -march=arch-type	-mtune=tune-type  -mabi=base-abi-type -mfpu=fpu-type
	   -msimd=simd-type -msoft-float -msingle-float	 -mdouble-float	 -mlsx	-mno-lsx  -mlasx  -mno-lasx  -mbranch-cost=n
	   -maddr-reg-reg-cost=n    -mcheck-zero-division   -mno-check-zero-division   -mcond-move-int	  -mno-cond-move-int
	   -mcond-move-float   -mno-cond-move-float   -memcpy	 -mno-memcpy   -mstrict-align	-mno-strict-align   -G	 num
	   -mmax-inline-memcpy-size=n  -mexplicit-relocs=style -mexplicit-relocs -mno-explicit-relocs -mdirect-extern-access
	   -mno-direct-extern-access  -mcmodel=code-model  -mrelax  -mpass-mrelax-to-as	  -mrecip    -mrecip=opt   -mfrecipe
	   -mno-frecipe	  -mdiv32   -mno-div32	 -mlam-bh   -mno-lam-bh	  -mlamcas  -mno-lamcas	 -mld-seq-sa  -mno-ld-seq-sa
	   -mtls-dialect=opt -mannotate-tablejump -mno-annotate-tablejump

	   M32C Options (M32C Options) -mcpu=cpu  -msim	 -memregs=number

	   M32R/D Options (M32R/D Options) -m32r2  -m32rx  -m32r -mdebug -malign-loops	-mno-align-loops -missue-rate=number
	   -mbranch-cost=number	  -mmodel=code-size-model-type	 -msdata=sdata-type    -mno-flush-func	   -mflush-func=name
	   -mno-flush-trap  -mflush-trap=number -G num

	   M680x0  Options  (M680x0  Options)  -march=arch   -mcpu=cpu	-mtune=tune -m68000  -m68020  -m68020-40  -m68020-60
	   -m68030  -m68040 -m68060  -mcpu32  -m5200  -m5206e  -m528x  -m5307	-m5407	-mcfv4e	  -mbitfield   -mno-bitfield
	   -mc68000   -mc68020	-mnobitfield   -mrtd   -mno-rtd	  -mdiv	 -mno-div  -mshort -mno-short  -mhard-float  -m68881
	   -msoft-float	   -mpcrel   -malign-int    -mstrict-align     -msep-data     -mno-sep-data    -mshared-library-id=n
	   -mid-shared-library	-mno-id-shared-library -mxgot  -mno-xgot  -mlong-jump-table-offsets

	   MCore  Options (MCore Options) -mhardlit  -mno-hardlit  -mdiv  -mno-div  -mrelax-immediates -mno-relax-immediates
	   -mwide-bitfields	 -mno-wide-bitfields	 -m4byte-functions	 -mno-4byte-functions	    -mcallgraph-data
	   -mno-callgraph-data	  -mslow-bytes	 -mno-slow-bytes   -mno-lsim  -mlittle-endian	-mbig-endian   -m210   -m340
	   -mstack-increment

	   MicroBlaze  Options	(MicroBlaze  Options)  -msoft-float   -mhard-float   -msmall-divides	-mcpu=cpu   -mmemcpy
	   -mxl-soft-mul     -mxl-soft-div     -mxl-barrel-shift    -mxl-pattern-compare     -mxl-stack-check	 -mxl-gp-opt
	   -mno-clearbss -mxl-multiply-high  -mxl-float-convert	 -mxl-float-sqrt -mbig-endian  -mlittle-endian	-mxl-reorder
	   -mxl-mode-app-model -mpic-data-is-text-relative

	   MIPS Options (MIPS Options) -EL  -EB	 -march=arch  -mtune=arch -mips1  -mips2  -mips3  -mips4  -mips32  -mips32r2
	   -mips32r3   -mips32r5  -mips32r6   -mips64	-mips64r2   -mips64r3	-mips64r5   -mips64r6  -mips16	 -mno-mips16
	   -mflip-mips16   -minterlink-compressed    -mno-interlink-compressed	 -minterlink-mips16    -mno-interlink-mips16
	   -mabi=abi  -mabicalls  -mno-abicalls -mshared  -mno-shared  -mplt  -mno-plt	 -mxgot	  -mno-xgot  -mgp32   -mgp64
	   -mfp32   -mfpxx   -mfp64   -mhard-float   -msoft-float  -mno-float	-msingle-float	 -mdouble-float	 -modd-spreg
	   -mno-odd-spreg -mabs=mode  -mnan=encoding -mdsp  -mno-dsp  -mdspr2  -mno-dspr2 -mmcu	 -mmno-mcu  -meva   -mno-eva
	   -mvirt   -mno-virt  -mxpa  -mno-xpa -mcrc  -mno-crc -mginv  -mno-ginv -mmicromips  -mno-micromips -mmsa  -mno-msa
	   -mloongson-mmi    -mno-loongson-mmi	 -mloongson-ext	   -mno-loongson-ext   -mloongson-ext2	  -mno-loongson-ext2
	   -mfpu=fpu-type   -msmartmips	   -mno-smartmips  -mpaired-single   -mno-paired-single	  -mdmx	  -mno-mdmx  -mips3d
	   -mno-mips3d	-mmt  -mno-mt  -mllsc	-mno-llsc  -mlong64   -mlong32	 -msym32   -mno-sym32  -Gnum   -mlocal-sdata
	   -mno-local-sdata   -mextern-sdata   -mno-extern-sdata   -mgpopt   -mno-gopt	-membedded-data	  -mno-embedded-data
	   -muninit-const-in-rodata	   -mno-uninit-const-in-rodata	     -mcode-readable=setting	   -msplit-addresses
	   -mno-split-addresses	  -mexplicit-relocs   -mno-explicit-relocs  -mexplicit-relocs=release  -mcheck-zero-division
	   -mno-check-zero-division -mdivide-traps  -mdivide-breaks -mload-store-pairs	-mno-load-store-pairs -mstrict-align
	   -mno-strict-align -mno-unaligned-access  -munaligned-access -mmemcpy	 -mno-memcpy  -mlong-calls   -mno-long-calls
	   -mmad   -mno-mad   -mimadd  -mno-imadd  -mfused-madd	 -mno-fused-madd  -nocpp -mfix-24k  -mno-fix-24k -mfix-r4000
	   -mno-fix-r4000    -mfix-r4400    -mno-fix-r4400   -mfix-r5900    -mno-fix-r5900   -mfix-r10000    -mno-fix-r10000
	   -mfix-rm7000	    -mno-fix-rm7000   -mfix-vr4120    -mno-fix-vr4120	-mfix-vr4130	-mno-fix-vr4130	   -mfix-sb1
	   -mno-fix-sb1	  -mflush-func=func    -mno-flush-func	 -mbranch-cost=num    -mbranch-likely	  -mno-branch-likely
	   -mcompact-branches=policy   -mfp-exceptions	  -mno-fp-exceptions   -mvr4130-align	 -mno-vr4130-align   -msynci
	   -mno-synci	-mlxc1-sxc1    -mno-lxc1-sxc1	 -mmadd4    -mno-madd4	  -mrelax-pic-calls	-mno-relax-pic-calls
	   -mmcount-ra-address -mframe-header-opt  -mno-frame-header-opt

	   MMIX	 Options  (MMIX	 Options)  -mlibfuncs	-mno-libfuncs	-mepsilon   -mno-epsilon   -mabi=gnu  -mabi=mmixware
	   -mzero-extend  -mknuthdiv   -mtoplevel-symbols  -melf   -mbranch-predict   -mno-branch-predict   -mbase-addresses
	   -mno-base-addresses	-msingle-exit  -mno-single-exit

	   MN10300  Options  (MN10300 Options) -mmult-bug  -mno-mult-bug -mno-am33  -mam33  -mam33-2  -mam34 -mtune=cpu-type
	   -mreturn-pointer-on-d0 -mno-crt0  -mrelax  -mliw  -msetlb

	   Moxie Options (Moxie Options) -meb  -mel  -mmul.x  -mno-crt0

	   MSP430  Options  (MSP430  Options)  -msim   -masm-hex   -mmcu=   -mcpu=   -mlarge   -msmall	 -mrelax  -mwarn-mcu
	   -mcode-region=    -mdata-region=   -msilicon-errata=	  -msilicon-errata-warn=  -mhwmult=   -minrt   -mtiny-printf
	   -mmax-inline-shift=

	   NDS32 Options  (NDS32  Options)  -mbig-endian   -mlittle-endian  -mreduced-regs   -mfull-regs  -mcmov   -mno-cmov
	   -mext-perf  -mno-ext-perf -mext-perf2  -mno-ext-perf2 -mext-string  -mno-ext-string -mv3push	 -mno-v3push -m16bit
	   -mno-16bit -misr-vector-size=num -mcache-block-size=num -march=arch -mcmodel=code-model -mctor-dtor	-mrelax

	   Nvidia PTX Options (Nvidia PTX Options) -m64	 -mmainkernel  -moptimize

	   OpenRISC  Options  (OpenRISC	 Options)  -mboard=name	  -mnewlib   -mhard-mul	  -mhard-div  -msoft-mul  -msoft-div
	   -msoft-float	 -mhard-float  -mdouble-float -munordered-float -mcmov	-mror  -mrori	-msext	 -msfimm   -mshftimm
	   -mcmodel=code-model

	   PDP-11  Options  (PDP-11  Options)  -mfpu   -msoft-float   -mac0   -mno-ac0	-m40  -m45  -m10 -mint32  -mno-int16
	   -mint16  -mno-int32 -msplit	-munix-asm  -mdec-asm  -mgnu-asm  -mlra

	   PowerPC Options See RS/6000 and PowerPC Options.

	   PRU Options (PRU Options) -mmcu=mcu	-minrt	-mno-relax  -mloop -mabi=variant

	   RISC-V Options (RISC-V Options) -mbranch-cost=N-instruction -mplt  -mno-plt	-mabi=ABI-string  -mfdiv   -mno-fdiv
	   -mfence-tso	 -mno-fence-tso -mdiv  -mno-div -misa-spec=ISA-spec-string -march=ISA-string -mtune=processor-string
	   -mpreferred-stack-boundary=num  -msmall-data-limit=N-bytes  -msave-restore	-mno-save-restore  -mshorten-memrefs
	   -mno-shorten-memrefs	   -mstrict-align    -mno-strict-align	 -mcmodel=medlow    -mcmodel=medany   -mcmodel=large
	   -mexplicit-relocs	-mno-explicit-relocs	-mrelax	    -mno-relax	  -mriscv-attribute	-mno-riscv-attribute
	   -malign-data=type  -mbig-endian   -mlittle-endian  -mstack-protector-guard=guard  -mstack-protector-guard-reg=reg
	   -mstack-protector-guard-offset=offset   -mcsr-check	 -mno-csr-check	  -mmovcc     -mno-movcc    -minline-atomics
	   -mno-inline-atomics	-minline-strlen	  -mno-inline-strlen  -minline-strcmp	-mno-inline-strcmp  -minline-strncmp
	   -mno-inline-strncmp -mtls-dialect=desc  -mtls-dialect=trad

	   RL78 Options (RL78 Options) -msim  -mmul=none  -mmul=g13  -mmul=g14	-mallregs  -mcpu=g10   -mcpu=g13   -mcpu=g14
	   -mg10  -mg13	 -mg14 -m64bit-doubles	-m32bit-doubles	 -msave-mduc-in-interrupts

	   RS/6000  and	 PowerPC  Options  (RS/6000  and PowerPC Options) -mcpu=cpu-type -mtune=cpu-type -mcmodel=code-model
	   -mpowerpc64 -maltivec  -mno-altivec	-mpowerpc-gpopt	  -mno-powerpc-gpopt  -mpowerpc-gfxopt	 -mno-powerpc-gfxopt
	   -mmfcrf   -mno-mfcrf	  -mpopcntb   -mno-popcntb   -mpopcntd	 -mno-popcntd  -mfprnd	-mno-fprnd -mcmpb  -mno-cmpb
	   -mhard-dfp  -mno-hard-dfp -mfull-toc	  -mminimal-toc	 -mno-fp-in-toc	  -mno-sum-in-toc  -m64	  -m32	 -mxl-compat
	   -mno-xl-compat    -mpe  -malign-power   -malign-natural  -msoft-float   -mhard-float	  -mmultiple   -mno-multiple
	   -mupdate   -mno-update  -mavoid-indexed-addresses   -mno-avoid-indexed-addresses  -mfused-madd    -mno-fused-madd
	   -mbit-align	 -mno-bit-align -mstrict-align	-mno-strict-align  -mrelocatable -mno-relocatable  -mrelocatable-lib
	   -mno-relocatable-lib -mtoc  -mno-toc	 -mlittle  -mlittle-endian  -mbig   -mbig-endian  -mdynamic-no-pic   -mswdiv
	   -msingle-pic-base		-mprioritize-restricted-insns=priority		  -msched-costly-dep=dependence_type
	   -minsert-sched-nops=scheme	 -mcall-aixdesc	    -mcall-eabi	    -mcall-freebsd    -mcall-linux     -mcall-netbsd
	   -mcall-openbsd  -mcall-sysv	 -mcall-sysv-eabi  -mcall-sysv-noeabi -mtraceback=traceback_type -maix-struct-return
	   -msvr4-struct-return	 -mabi=abi-type	  -msecure-plt	 -mbss-plt  -msplit-patch-nops	 -mlongcall    -mno-longcall
	   -mpltseq	       -mno-pltseq	     -mblock-move-inline-limit=num	    -mblock-compare-inline-limit=num
	   -mblock-compare-inline-loop-limit=num   -mno-block-ops-unaligned-vsx	  -mstring-compare-inline-limit=num   -misel
	   -mno-isel -mvrsave  -mno-vrsave -mmulhw  -mno-mulhw -mdlmzb	-mno-dlmzb -mprototype	-mno-prototype -msim  -mmvme
	   -mads   -myellowknife   -memb   -msdata  -msdata=opt	 -mreadonly-in-sdata  -mvxworks	 -G num -mrecip	 -mrecip=opt
	   -mno-recip	    -mrecip-precision	   -mno-recip-precision	     -mveclibabi=type	     -mfriz	   -mno-friz
	   -mpointers-to-nested-functions    -mno-pointers-to-nested-functions	-msave-toc-indirect   -mno-save-toc-indirect
	   -mpower8-fusion  -mno-mpower8-fusion	 -mcrypto   -mno-crypto	  -mhtm	  -mno-htm  -mquad-memory   -mno-quad-memory
	   -mquad-memory-atomic	     -mno-quad-memory-atomic	-mcompat-align-parm	-mno-compat-align-parm	  -mfloat128
	   -mno-float128      -mfloat128-hardware	-mno-float128-hardware	    -mgnu-attribute	  -mno-gnu-attribute
	   -mstack-protector-guard=guard  -mstack-protector-guard-reg=reg  -mstack-protector-guard-offset=offset  -mprefixed
	   -mno-prefixed -mpcrel -mno-pcrel -mmma -mno-mmma -mrop-protect -mno-rop-protect -mprivileged -mno-privileged

	   RX	Options	  (RX	Options)   -m64bit-doubles    -m32bit-doubles	 -fpu	 -nofpu	  -mcpu=   -mbig-endian-data
	   -mlittle-endian-data	 -msmall-data -msim  -mno-sim -mas100-syntax  -mno-as100-syntax -mrelax -mmax-constant-size=
	   -mint-register=  -mpid  -mallow-string-insns	  -mno-allow-string-insns  -mjsr  -mno-warn-multiple-fast-interrupts
	   -msave-acc-in-interrupts

	   S/390 and zSeries Options (S/390 and zSeries Options) -mtune=cpu-type  -march=cpu-type -mhard-float	-msoft-float
	   -mhard-dfp	 -mno-hard-dfp	 -mlong-double-64   -mlong-double-128  -mbackchain   -mno-backchain   -mpacked-stack
	   -mno-packed-stack -msmall-exec  -mno-small-exec  -mmvcle   -mno-mvcle  -m64	 -m31	-mdebug	  -mno-debug   -mesa
	   -mzarch  -mhtm   -mvx   -mzvector -mtpf-trace  -mno-tpf-trace  -mtpf-trace-skip  -mno-tpf-trace-skip -mfused-madd
	   -mno-fused-madd -mwarn-framesize  -mwarn-dynamicstack  -mstack-size	-mstack-guard -mhotpatch=halfwords,halfwords

	   SH Options (SH Options) -m1	-m2  -m2e  -m2a-nofpu	-m2a-single-only   -m2a-single	 -m2a  -m3   -m3e  -m4-nofpu
	   -m4-single-only   -m4-single	  -m4  -m4a-nofpu   -m4a-single-only   -m4a-single   -m4a   -m4al -mb  -ml  -mdalign
	   -mrelax  -mbigtable	 -mfmovd   -mrenesas   -mno-renesas   -mnomacsave  -mieee   -mno-ieee	 -mbitops    -misize
	   -minline-ic_invalidate      -mpadstruct     -mprefergot	-musermode	-multcost=number      -mdiv=strategy
	   -mdivsi3_libfunc=name    -mfixed-range=register-range   -maccumulate-outgoing-args	 -matomic-model=atomic-model
	   -mbranch-cost=num   -mzdcbranch   -mno-zdcbranch -mcbranch-force-delay-slot -mfused-madd  -mno-fused-madd  -mfsca
	   -mno-fsca  -mfsrra  -mno-fsrra -mpretend-cmove  -mtas

	   Solaris 2 Options (Solaris 2 Options) -mclear-hwcap	-mno-clear-hwcap  -mimpure-text	 -mno-impure-text -pthreads

	   SPARC Options (SPARC Options) -mcpu=cpu-type -mtune=cpu-type	 -mcmodel=code-model  -mmemory-model=mem-model	-m32
	   -m64	   -mapp-regs	-mno-app-regs  -mfaster-structs	  -mno-faster-structs	-mflat	 -mno-flat  -mfpu   -mno-fpu
	   -mhard-float	 -msoft-float -mhard-quad-float	 -msoft-quad-float -mstack-bias	 -mno-stack-bias -mstd-struct-return
	   -mno-std-struct-return   -munaligned-doubles	   -mno-unaligned-doubles   -muser-mode	   -mno-user-mode   -mv8plus
	   -mno-v8plus	 -mvis	-mno-vis -mvis2	 -mno-vis2 -mvis3  -mno-vis3  -mvis3b  -mno-vis3b -mvis4  -mno-vis4  -mvis4b
	   -mno-vis4b -mcbcond	-mno-cbcond  -mfmaf  -mno-fmaf	-mfsmuld  -mno-fsmuld -mpopc  -mno-popc	 -msubxc  -mno-subxc
	   -mfix-at697f	 -mfix-ut699  -mfix-ut700  -mfix-gr712rc

	   System V Options (System V Options) -Qy  -Qn	 -YP,paths  -Ym,dir

	   V850 Options (V850 Options) -mlong-calls  -mno-long-calls  -mep  -mno-ep -mprolog-function	-mno-prolog-function
	   -mspace  -mtda=n   -msda=n	-mzda=n	 -mapp-regs   -mno-app-regs  -mdisable-callt   -mno-disable-callt -mv850e2v3
	   -mv850e2  -mv850e1  -mv850es -mv850e	 -mv850	 -mv850e3v5 -mloop -mrelax  -mlong-jumps  -msoft-float	-mhard-float
	   -mgcc-abi -mrh850-abi -mbig-switch

	   VAX Options (VAX Options) -munix  -mgnu  -md	 -md-float  -mg	 -mg-float  -mlra

	   Visium  Options  (Visium  Options)  -mdebug	 -msim	 -mfpu	 -mno-fpu  -mhard-float	 -msoft-float -mcpu=cpu-type
	   -mtune=cpu-type  -msv-mode  -muser-mode

	   VMS Options (VMS Options) -mvms-return-codes	 -mdebug-main=prefix  -mmalloc64 -mpointer-size=size

	   VxWorks Options (VxWorks Options) -mrtp  -msmp  -non-static	-Bstatic  -Bdynamic -Xbind-lazy	 -Xbind-now

	   x86	Options	 (x86  Options)	 -mtune=cpu-type   -march=cpu-type  -mtune-ctrl=feature-list	-mdump-tune-features
	   -mno-default	  -mfpmath=unit	  -masm=dialect	   -mno-fancy-math-387	 -mno-fp-ret-in-387   -m80387	-mhard-float
	   -msoft-float	       -mno-wide-multiply	  -mrtd		-malign-double	      -mpreferred-stack-boundary=num
	   -mincoming-stack-boundary=num  -mcld	  -mcx16  -msahf  -mmovbe  -mcrc32 -mmwait -mrecip  -mrecip=opt -mvzeroupper
	   -mprefer-avx128     -mprefer-vector-width=opt    -mpartial-vector-fp-math	-mmove-max=bits	    -mstore-max=bits
	   -mnoreturn-no-callee-saved-registers	 -mmmx	 -msse	 -msse2	  -msse3  -mssse3  -msse4.1  -msse4.2  -msse4  -mavx
	   -mavx2  -mavx512f  -mavx512cd   -mavx512vl  -mavx512bw   -mavx512dq	 -mavx512ifma	-mavx512vbmi   -msha   -maes
	   -mpclmul   -mfsgsbase   -mrdrnd   -mf16c   -mfma  -mpconfig	-mwbnoinvd -mptwrite  -mclflushopt  -mclwb  -mxsavec
	   -mxsaves -msse4a  -m3dnow  -m3dnowa	-mpopcnt  -mabm	 -mbmi	-mtbm  -mfma4  -mxop -madx  -mlzcnt  -mbmi2   -mfxsr
	   -mxsave   -mxsaveopt	 -mrtm	-mhle  -mlwp -mmwaitx  -mclzero	 -mpku	-mthreads  -mgfni  -mvaes  -mwaitpkg -mshstk
	   -mmanual-endbr   -mcet-switch   -mforce-indirect-call   -mavx512vbmi2    -mavx512bf16    -menqcmd	-mvpclmulqdq
	   -mavx512bitalg   -mmovdiri	-mmovdir64b   -mavx512vpopcntdq	 -mavx512vnni	-mprfchw   -mrdpid  -mrdseed   -msgx
	   -mavx512vp2intersect	 -mserialize  -mtsxldtrk  -mamx-tile   -mamx-int8   -mamx-bf16	-muintr	 -mhreset  -mavxvnni
	   -mamx-fp8  -mavx512fp16  -mavxifma  -mavxvnniint8  -mavxneconvert  -mcmpccxadd  -mamx-fp16  -mprefetchi  -mraoint
	   -mamx-complex  -mavxvnniint16  -msm3	 -msha512  -msm4  -mapxf  -musermsr  -mavx10.1	-mavx10.1-256  -mavx10.1-512
	   -mevex512  -mavx10.2	 -mamx-avx512  -mamx-tf32  -mamx-transpose  -mmovrs  -mamx-movrs  -mcldemote  -mms-bitfields
	   -mno-align-stringops	   -minline-all-stringops   -minline-stringops-dynamically    -mstringop-strategy=alg	-mkl
	   -mwidekl    -mmemcpy-strategy=strategy     -mmemset-strategy=strategy   -mpush-args	  -maccumulate-outgoing-args
	   -m128bit-long-double -m96bit-long-double   -mlong-double-64	 -mlong-double-80   -mlong-double-128  -mregparm=num
	   -msseregparm	   -mveclibabi=type    -mvect8-ret-in-mem   -mpc32    -mpc64	-mpc80	  -mdaz-ftz   -mstackrealign
	   -momit-leaf-frame-pointer	 -mno-red-zone	    -mno-tls-direct-seg-refs	 -mcmodel=code-model	  -mabi=name
	   -maddress-mode=mode	 -m32	 -m64	 -mx32	  -m16	  -miamcu   -mlarge-data-threshold=num	-msse2avx   -mfentry
	   -mrecord-mcount   -mnop-mcount   -m8bit-idiv	 -minstrument-return=type  -mfentry-name=name  -mfentry-section=name
	   -mavx256-split-unaligned-load   -mavx256-split-unaligned-store  -malign-data=type   -mstack-protector-guard=guard
	   -mstack-protector-guard-reg=reg    -mstack-protector-guard-offset=offset    -mstack-protector-guard-symbol=symbol
	   -mgeneral-regs-only		-mcall-ms2sysv-xlogues	       -mrelax-cmpxchg-loop	    -mindirect-branch=choice
	   -mfunction-return=choice  -mindirect-branch-register	 -mharden-sls=choice  -mindirect-branch-cs-prefix   -mneeded
	   -mno-direct-extern-access -munroll-only-small-loops -mlam=choice

	   x86 Windows Options See Cygwin and MinGW Options.

	   Xstormy16 Options (Xstormy16 Options) -msim

	   Xtensa   Options   (Xtensa	Options)   -mconst16	-mno-const16  -mfused-madd   -mno-fused-madd  -mforce-no-pic
	   -mserialize-volatile	 -mno-serialize-volatile -mtext-section-literals  -mno-text-section-literals -mauto-litpools
	   -mno-auto-litpools	 -mtarget-align	    -mno-target-align	  -mlongcalls	   -mno-longcalls     -mabi=abi-type
	   -mextra-l32r-costs=cycles -mstrict-align  -mno-strict-align

	   zSeries Options See S/390 and zSeries Options.

   Options Controlling the Kind of Output
       Compilation  can	 involve  up to four stages: preprocessing, compilation proper, assembly and linking, always in that
       order.  GCC is capable of preprocessing and compiling several files either into several	assembler  input  files,  or
       into  one  assembler input file; then each assembler input file produces an object file, and linking combines all the
       object files (those newly compiled, and those specified as input) into an executable file.

       For any given input file, the file name suffix determines what kind of compilation is done:

       file.c
	   C source code that must be preprocessed.

       file.i
	   C source code that should not be preprocessed.

       file.ii
	   C++ source code that should not be preprocessed.

       file.m
	   Objective-C source code.  Note that you must link with the libobjc library to make an Objective-C program work.

       file.mi
	   Objective-C source code that should not be preprocessed.

       file.mm
       file.M
	   Objective-C++ source code.  Note that you must link with the libobjc library to  make  an  Objective-C++  program
	   work.  Note that .M refers to a literal capital M.

       file.mii
	   Objective-C++ source code that should not be preprocessed.

       file.h
	   C,  C++,  Objective-C  or  Objective-C++  header file to be turned into a precompiled header (default), or C, C++
	   header file to be turned into an Ada spec (via the -fdump-ada-spec switch).

       file.cc
       file.cp
       file.cxx
       file.cpp
       file.CPP
       file.c++
       file.C
	   C++ source code that must be preprocessed.  Note that in .cxx, the last two letters must  both  be  literally  x.
	   Likewise, .C refers to a literal capital C.

       file.mm
       file.M
	   Objective-C++ source code that must be preprocessed.

       file.mii
	   Objective-C++ source code that should not be preprocessed.

       file.hh
       file.H
       file.hp
       file.hxx
       file.hpp
       file.HPP
       file.h++
       file.tcc
	   C++ header file to be turned into a precompiled header or Ada spec.

       file.f
       file.for
       file.ftn
       file.fi
	   Fixed form Fortran source code that should not be preprocessed.

       file.F
       file.FOR
       file.fpp
       file.FPP
       file.FTN
	   Fixed form Fortran source code that must be preprocessed (with the traditional preprocessor).

       file.f90
       file.f95
       file.f03
       file.f08
       file.fii
	   Free form Fortran source code that should not be preprocessed.

       file.F90
       file.F95
       file.F03
       file.F08
	   Free form Fortran source code that must be preprocessed (with the traditional preprocessor).

       file.cob
       file.COB
       file.cbl
       file.CBL
	   COBOL source code.

       file.go
	   Go source code.

       file.d
	   D source code.

       file.di
	   D interface file.

       file.dd
	   D documentation code (Ddoc).

       file.ads
	   Ada	source	code  file  that  contains  a  library	unit declaration (a declaration of a package, subprogram, or
	   generic, or a generic instantiation), or a library unit renaming declaration (a package, generic,  or  subprogram
	   renaming declaration).  Such files are also called specs.

       file.adb
	   Ada	source	code file containing a library unit body (a subprogram or package body).  Such files are also called
	   bodies.

       file.s
	   Assembler code.

       file.S
       file.sx
	   Assembler code that must be preprocessed.

       other
	   An object file to be fed straight into linking.  Any file name with no recognized suffix is treated this way.

       You can specify the input language explicitly with the -x option:

       -x language
	   Specify explicitly the language for the following input files (rather than letting the compiler choose a  default
	   based  on  the  file	 name  suffix).	  This option applies to all following input files until the next -x option.
	   Possible values for language are:

		   c  c-header	cpp-output
		   c++	c++-header  c++-system-header c++-user-header c++-cpp-output
		   objective-c	objective-c-header  objective-c-cpp-output  objc-cpp-output
		   objective-c++  objective-c++-header	objective-c++-cpp-output
		   objc++-cpp-output
		   assembler  assembler-with-cpp
		   ada	adascil	 adawhy
		   cobol
		   d
		   f77	f77-cpp-input  f95  f95-cpp-input
		   go
		   modula-2  modula-2-cpp-output
		   rust
		   lto

	   Note that -x does not imply a particular language standard.	For example -x f77 may also require -std=legacy	 for
	   some older source codes.

       -x none
	   Turn	 off  any  specification  of  a	 language, so that subsequent files are handled according to their file name
	   suffixes (as if -x has not been used at all).

       If you only want some of the stages of compilation, you can use -x (or filename suffixes) to tell gcc where to start,
       and one of the options -c, -S, or -E to say where gcc is to stop.  Note that some combinations (for example, -x	cpp-
       output -E) instruct gcc to do nothing at all.

       -c  Compile  or	assemble  the  source  files,  but do not link.	 The linking stage simply is not done.	The ultimate
	   output is in the form of an object file for each source file.

	   By default, the object file name for a source file is made by replacing the suffix .c, .i, .s, etc., with .o.

	   Unrecognized input files, not requiring compilation or assembly, are ignored.

       -S  Stop after the stage of compilation proper; do not assemble.	 The output is in the form of an assembler code file
	   for each non-assembler input file specified.

	   By default, the assembler file name for a source file is made by replacing the suffix .c, .i, etc., with .s.

	   Input files that don't require compilation are ignored.

       -E  Stop after the preprocessing stage; do not run the compiler proper.	The output is in the  form  of	preprocessed
	   source code, which is sent to the standard output.

	   Input files that don't require preprocessing are ignored.

       -o file
	   Place  the primary output in file file.  This applies to whatever sort of output is being produced, whether it be
	   an executable file, an object file, an assembler file or preprocessed C code.

	   If -o is not specified, the default is to put an executable file in a.out, the object file for  source.suffix  in
	   source.o,  its assembler file in source.s, a precompiled header file in source.suffix.gch, and all preprocessed C
	   source on standard output.

	   Though -o names only the primary output, it also affects the naming of  auxiliary  and  dump	 outputs.   See	 the
	   examples  below.   Unless overridden, both auxiliary outputs and dump outputs are placed in the same directory as
	   the primary output.	In auxiliary outputs, the suffix of the input file is replaced with that  of  the  auxiliary
	   output  file	 type;	in  dump  outputs,  the	 suffix	 of  the dump file is appended to the input file suffix.  In
	   compilation commands, the base name of both auxiliary and dump outputs is that of the primary output; in  compile
	   and	link  commands,	 the primary output name, minus the executable suffix, is combined with the input file name.
	   If both share the same base name, disregarding the suffix, the result of  the  combination  is  that	 base  name,
	   otherwise, they are concatenated, separated by a dash.

		   gcc -c foo.c ...

	   will	 use  foo.o  as	 the  primary output, and place aux outputs and dumps next to it, e.g., aux file foo.dwo for
	   -gsplit-dwarf, and dump file foo.c.???r.final for -fdump-rtl-final.

	   If a non-linker output file is explicitly specified, aux and dump files by default take the same base name:

		   gcc -c foo.c -o dir/foobar.o ...

	   will name aux outputs dir/foobar.* and dump outputs dir/foobar.c.*.

	   A linker output will instead prefix aux and dump outputs:

		   gcc foo.c bar.c -o dir/foobar ...

	   will generally name aux outputs dir/foobar-foo.* and dir/foobar-bar.*, and dump  outputs  dir/foobar-foo.c.*	 and
	   dir/foobar-bar.c.*.

	   The one exception to the above is when the executable shares the base name with the single input:

		   gcc foo.c -o dir/foo ...

	   in which case aux outputs are named dir/foo.* and dump outputs named dir/foo.c.*.

	   The location and the names of auxiliary and dump outputs can be adjusted by the options -dumpbase, -dumpbase-ext,
	   -dumpdir, -save-temps=cwd, and -save-temps=obj.

       -dumpbase dumpbase
	   This	 option	 sets the base name for auxiliary and dump output files.  It does not affect the name of the primary
	   output file.	 Intermediate outputs, when preserved, are  not	 regarded  as  primary	outputs,  but  as  auxiliary
	   outputs:

		   gcc -save-temps -S foo.c

	   saves the (no longer) temporary preprocessed file in foo.i, and then compiles to the (implied) output file foo.s,
	   whereas:

		   gcc -save-temps -dumpbase save-foo -c foo.c

	   preprocesses	 to  in	 save-foo.i,  compiles	to save-foo.s (now an intermediate, thus auxiliary output), and then
	   assembles to the (implied) output file foo.o.

	   Absent this option, dump and aux files take their names from the input file,	 or  from  the	(non-linker)  output
	   file, if one is explicitly specified: dump output files (e.g. those requested by -fdump-* options) with the input
	   name	  suffix,   and	  aux  output  files  (those  requested	 by  other  non-dump  options,	e.g.  "-save-temps",
	   "-gsplit-dwarf", "-fcallgraph-info") without it.

	   Similar suffix  differentiation  of	dump  and  aux	outputs	 can  be  attained  for	 explicitly-given  -dumpbase
	   basename.suf by also specifying -dumpbase-ext .suf.

	   If  dumpbase	 is  explicitly	 specified with any directory component, any dumppfx specification (e.g. -dumpdir or
	   -save-temps=*) is ignored, and instead of appending to it, dumpbase fully overrides it:

		   gcc foo.c -c -o dir/foo.o -dumpbase alt/foo \
		     -dumpdir pfx- -save-temps=cwd ...

	   creates auxiliary and dump  outputs	named  alt/foo.*,  disregarding	 dir/  in  -o,	the  ./	 prefix	 implied  by
	   -save-temps=cwd, and pfx- in -dumpdir.

	   When	 -dumpbase  is specified in a command that compiles multiple inputs, or that compiles and then links, it may
	   be combined with dumppfx, as specified under -dumpdir.  Then, each input file  is  compiled	using  the  combined
	   dumppfx, and default values for dumpbase and auxdropsuf are computed for each input file:

		   gcc foo.c bar.c -c -dumpbase main ...

	   creates  foo.o  and	bar.o as primary outputs, and avoids overwriting the auxiliary and dump outputs by using the
	   dumpbase as a prefix, creating auxiliary and dump outputs named main-foo.*  and main-bar.*.

	   An empty string specified as dumpbase avoids the influence of the output basename in the naming of auxiliary	 and
	   dump outputs during compilation, computing default values :

		   gcc -c foo.c -o dir/foobar.o -dumpbase " ...

	   will	 name aux outputs dir/foo.* and dump outputs dir/foo.c.*.  Note how their basenames are taken from the input
	   name, but the directory still defaults to that of the output.

	   The empty-string dumpbase does not prevent the use of the output basename for outputs during linking:

		   gcc foo.c bar.c -o dir/foobar -dumpbase " -flto ...

	   The compilation of the source files will name  auxiliary  outputs  dir/foo.*	 and  dir/bar.*,  and  dump  outputs
	   dir/foo.c.*	and  dir/bar.c.*.  LTO recompilation during linking will use dir/foobar. as the prefix for dumps and
	   auxiliary files.

       -dumpbase-ext auxdropsuf
	   When forming the name of an auxiliary (but not a dump) output file, drop trailing auxdropsuf from dumpbase before
	   appending any suffixes.  If not specified, this option defaults to the suffix of a default  dumpbase,  i.e.,	 the
	   suffix of the input file when -dumpbase is not present in the command line, or dumpbase is combined with dumppfx.

		   gcc foo.c -c -o dir/foo.o -dumpbase x-foo.c -dumpbase-ext .c ...

	   creates  dir/foo.o as the main output, and generates auxiliary outputs in dir/x-foo.*, taking the location of the
	   primary output, and dropping the .c suffix from the dumpbase.  Dump outputs retain the suffix: dir/x-foo.c.*.

	   This option is disregarded if it does not match the suffix of a specified dumpbase, except as an  alternative  to
	   the executable suffix when appending the linker output base name to dumppfx, as specified below:

		   gcc foo.c bar.c -o main.out -dumpbase-ext .out ...

	   creates  main.out  as  the  primary	output,	 and  avoids overwriting the auxiliary and dump outputs by using the
	   executable name minus auxdropsuf as a prefix, creating auxiliary outputs named main-foo.* and main-bar.* and dump
	   outputs named main-foo.c.* and main-bar.c.*.

       -dumpdir dumppfx
	   When forming the name of an auxiliary or dump output file, use dumppfx as a prefix:

		   gcc -dumpdir pfx- -c foo.c ...

	   creates foo.o as the primary output, and auxiliary outputs named pfx-foo.*, combining the given dumppfx with	 the
	   default dumpbase derived from the default primary output, derived in turn from the input name.  Dump outputs also
	   take the input name suffix: pfx-foo.c.*.

	   If dumppfx is to be used as a directory name, it must end with a directory separator:

		   gcc -dumpdir dir/ -c foo.c -o obj/bar.o ...

	   creates  obj/bar.o as the primary output, and auxiliary outputs named dir/bar.*, combining the given dumppfx with
	   the default dumpbase derived from the primary output name.	Dump  outputs  also  take  the	input  name  suffix:
	   dir/bar.c.*.

	   It  defaults	 to  the  location  of	the  output file, unless the output file is a special file like "/dev/null".
	   Options -save-temps=cwd and -save-temps=obj override this default, just like an  explicit  -dumpdir	option.	  In
	   case multiple such options are given, the last one prevails:

		   gcc -dumpdir pfx- -c foo.c -save-temps=obj ...

	   outputs  foo.o,  with  auxiliary  outputs  named  foo.*  because -save-temps=* overrides the dumppfx given by the
	   earlier -dumpdir option.  It does not matter that =obj is the  default  for	-save-temps,  nor  that	 the  output
	   directory is implicitly the current directory.  Dump outputs are named foo.c.*.

	   When	 compiling  from multiple input files, if -dumpbase is specified, dumpbase, minus a auxdropsuf suffix, and a
	   dash are appended to (or override, if containing any directory components) an explicit or defaulted	dumppfx,  so
	   that each of the multiple compilations gets differently-named aux and dump outputs.

		   gcc foo.c bar.c -c -dumpdir dir/pfx- -dumpbase main ...

	   outputs  auxiliary  dumps  to  dir/pfx-main-foo.*  and  dir/pfx-main-bar.*, appending dumpbase- to dumppfx.	Dump
	   outputs retain the input file suffix: dir/pfx-main-foo.c.*	and  dir/pfx-main-bar.c.*,  respectively.   Contrast
	   with the single-input compilation:

		   gcc foo.c -c -dumpdir dir/pfx- -dumpbase main ...

	   that, applying -dumpbase to a single source, does not compute and append a separate dumpbase per input file.	 Its
	   auxiliary and dump outputs go in dir/pfx-main.*.

	   When	 compiling  and	 then  linking	from  multiple input files, a defaulted or explicitly specified dumppfx also
	   undergoes the dumpbase- transformation above (e.g. the compilation of foo.c and bar.c above, but without -c).  If
	   neither -dumpdir nor -dumpbase are given, the linker output base name, minus auxdropsuf,  if	 specified,  or	 the
	   executable  suffix otherwise, plus a dash is appended to the default dumppfx instead.  Note, however, that unlike
	   earlier cases of linking:

		   gcc foo.c bar.c -dumpdir dir/pfx- -o main ...

	   does not append the output name main to dumppfx, because -dumpdir is explicitly specified.  The goal is that	 the
	   explicitly-specified	 dumppfx  may  contain	the specified output name as part of the prefix, if desired; only an
	   explicitly-specified -dumpbase would be combined with it, in	 order	to  avoid  simply  discarding  a  meaningful
	   option.

	   When	 compiling  and	 then linking from a single input file, the linker output base name will only be appended to
	   the default dumppfx as above if it does not share the base name with the single input file name.  This  has	been
	   covered  in	single-input  linking  cases above, but not with an explicit -dumpdir that inhibits the combination,
	   even if overridden by -save-temps=*:

		   gcc foo.c -dumpdir alt/pfx- -o dir/main.exe -save-temps=cwd ...

	   Auxiliary outputs are named foo.*, and dump outputs foo.c.*, in  the	 current  working  directory  as  ultimately
	   requested by -save-temps=cwd.

	   Summing  it all up for an intuitive though slightly imprecise data flow: the primary output name is broken into a
	   directory part and a basename part; dumppfx is set to the former, unless overridden by -dumpdir or -save-temps=*,
	   and dumpbase is set to the latter, unless overriden by -dumpbase.  If there are multiple inputs or linking,	this
	   dumpbase  may be combined with dumppfx and taken from each input file.  Auxiliary output names for each input are
	   formed by combining dumppfx, dumpbase minus suffix, and the auxiliary output suffix; dump output names  are	only
	   different in that the suffix from dumpbase is retained.

	   When	 it  comes  to	auxiliary  and	dump  outputs created during LTO recompilation, a combination of dumppfx and
	   dumpbase, as given or as derived from the linker output name but not from inputs, even in  cases  in	 which	this
	   combination	would  not  otherwise be used as such, is passed down with a trailing period replacing the compiler-
	   added dash, if any, as a -dumpdir option to lto-wrapper;  being  involved  in  linking,  this  program  does	 not
	   normally get any -dumpbase and -dumpbase-ext, and it ignores them.

	   When	 running  sub-compilers,  lto-wrapper appends LTO stage names to the received dumppfx, ensures it contains a
	   directory component so that it overrides any -dumpdir, and passes that as -dumpbase to sub-compilers.

       -v  Print (on standard error output) the commands executed to run the stages of compilation.  Also print the  version
	   number of the compiler driver program and of the preprocessor and the compiler proper.

       -###
	   Like	 -v  except  the  commands  are	 not executed and arguments are quoted unless they contain only alphanumeric
	   characters or "./-_".  This is useful for shell scripts to capture the driver-generated command lines.

       --help
	   Print (on the standard output) a description of the command-line options understood by gcc.	If the -v option  is
	   also	 specified  then  --help is also passed on to the various processes invoked by gcc, so that they can display
	   the command-line options they accept.  If the -Wextra option	 has  also  been  specified  (prior  to	 the  --help
	   option), then command-line options that have no documentation associated with them are also displayed.

       --target-help
	   Print  (on  the  standard  output) a description of target-specific command-line options for each tool.  For some
	   targets extra target-specific information may also be printed.

       --help={class|[^]qualifier}[,...]
	   Print (on the standard output) a description of the command-line options understood by the compiler that fit into
	   all specified classes and qualifiers.  These are the supported classes:

	   optimizers
	       Display all of the optimization options supported by the compiler.

	   warnings
	       Display all of the options controlling warning messages produced by the compiler.

	   target
	       Display target-specific options.	 Unlike the --target-help option however,  target-specific  options  of	 the
	       linker  and  assembler  are not displayed.  This is because those tools do not currently support the extended
	       --help= syntax.

	   params
	       Display the values recognized by the --param option.

	   language
	       Display the options supported for language, where language is the name of one of the languages  supported  in
	       this version of GCC.  If an option is supported by all languages, one needs to select common class.

	   common
	       Display the options that are common to all languages.

	   These are the supported qualifiers:

	   undocumented
	       Display only those options that are undocumented.

	   joined
	       Display	options	 taking	 an  argument that appears after an equal sign in the same continuous piece of text,
	       such as: --help=target.

	   separate
	       Display options taking an argument that appears as a separate word following the original option, such as: -o
	       output-file.

	   Thus for example to display all the undocumented target-specific switches supported by the compiler, use:

		   --help=target,undocumented

	   The sense of a qualifier can be inverted by prefixing it with the ^ character, so  for  example  to	display	 all
	   binary  warning  options  (i.e.,  ones  that	 are  either on or off and that do not take an argument) that have a
	   description, use:

		   --help=warnings,^joined,^undocumented

	   The argument to --help= should not consist solely of inverted qualifiers.

	   Combining several classes is possible, although this usually restricts the output so much that there	 is  nothing
	   to display.	One case where it does work, however, is when one of the classes is target.  For example, to display
	   all the target-specific optimization options, use:

		   --help=target,optimizers

	   The	--help=	 option	 can  be  repeated on the command line.	 Each successive use displays its requested class of
	   options, skipping those that have already been displayed.  If --help is also specified anywhere  on	the  command
	   line then this takes precedence over any --help= option.

	   If  the  -Q	option appears on the command line before the --help= option, then the descriptive text displayed by
	   --help= is changed.	Instead of describing the displayed options, an indication is given as to whether the option
	   is enabled, disabled or set to a specific value (assuming that the compiler knows this at  the  point  where	 the
	   --help= option is used).

	   Here is a truncated example from the ARM port of gcc:

		     % gcc -Q -mabi=2 --help=target -c
		     The following options are target specific:
		     -mabi=				   2
		     -mabort-on-noreturn		   [disabled]
		     -mapcs				   [disabled]

	   The	output	is  sensitive to the effects of previous command-line options, so for example it is possible to find
	   out which optimizations are enabled at -O2 by using:

		   -Q -O2 --help=optimizers

	   Alternatively you can discover which binary optimizations are enabled by -O3 by using:

		   gcc -c -Q -O3 --help=optimizers > /tmp/O3-opts
		   gcc -c -Q -O2 --help=optimizers > /tmp/O2-opts
		   diff /tmp/O2-opts /tmp/O3-opts | grep enabled

       --version
	   Display the version number and copyrights of the invoked GCC.

       -pass-exit-codes
	   Normally the gcc program exits with the code of 1 if any phase of the compiler returns a non-success return code.
	   If you specify -pass-exit-codes, the gcc program instead returns with the numerically highest error	produced  by
	   any	phase  returning  an  error indication.	 The C, C++, and Fortran front ends return 4 if an internal compiler
	   error is encountered.

       -pipe
	   Use pipes rather than temporary files for communication between the various stages of compilation.  This fails to
	   work on some systems where the assembler is unable to read from a pipe; but the GNU assembler has no trouble.

       -specs=file
	   Process file after the compiler reads in the standard specs file, in order to override the defaults which the gcc
	   driver program uses when determining what switches to  pass	to  cc1,  cc1plus,  as,	 ld,  etc.   More  than	 one
	   -specs=file can be specified on the command line, and they are processed in order, from left to right.

       -wrapper
	   Invoke all subcommands under a wrapper program.  The name of the wrapper program and its parameters are passed as
	   a comma separated list.

		   gcc -c t.c -wrapper gdb,--args

	   This invokes all subprograms of gcc under gdb --args, thus the invocation of cc1 is gdb --args cc1 ....

       -ffile-prefix-map=old=new
	   When compiling files residing in directory old, record any references to them in the result of the compilation as
	   if  the  files  resided  in	directory  new	instead.  Specifying this option is equivalent to specifying all the
	   individual -f*-prefix-map options.  This can be used to make reproducible builds that are  location	independent.
	   Directories	referenced  by	directives  are	 not  affected	by  these  options.   See  also	 -fmacro-prefix-map,
	   -fdebug-prefix-map, -fprofile-prefix-map and -fcanon-prefix-map.

       -fcanon-prefix-map
	   For the -f*-prefix-map options normally comparison of old prefix against the	 filename  that	 would	be  normally
	   referenced  in  the	result	of  the	 compilation  is  done using textual comparison of the prefixes, or ignoring
	   character case for case insensitive filesystems and considering slashes and backslashes as  equal  on  DOS  based
	   filesystems.	  The  -fcanon-prefix-map  causes  such comparisons to be done on canonicalized paths of old and the
	   referenced filename.

       -fplugin=name.so
	   Load the plugin code in file name.so, assumed to be a shared object to be dlopen'd by  the  compiler.   The	base
	   name	 of  the  shared  object  file	is  used  to  identify	the plugin for the purposes of argument parsing (See
	   -fplugin-arg-name-key=value below).	Each plugin should define the callback functions specified  in	the  Plugins
	   API.

       -fplugin-arg-name-key=value
	   Define an argument called key with a value of value for the plugin called name.

       -fdump-ada-spec[-slim]
	   For C and C++ source and include files, generate corresponding Ada specs.

       -fada-spec-parent=unit
	   In conjunction with -fdump-ada-spec[-slim] above, generate Ada specs as child units of parent unit.

       -fdump-go-spec=file
	   For	input  files  in  any  language, generate corresponding Go declarations in file.  This generates Go "const",
	   "type", "var", and "func" declarations which may be a useful way to start writing a Go interface to code  written
	   in some other language.

       @file
	   Read	 command-line  options	from file.  The options read are inserted in place of the original @file option.  If
	   file does not exist, or cannot be read, then the option will be treated literally, and not removed.

	   Options in file are separated by whitespace.	 A whitespace character may be included in an option by	 surrounding
	   the	entire	option	in either single or double quotes.  Any character (including a backslash) may be included by
	   prefixing the character to be included with a backslash.  The file may itself contain additional  @file  options;
	   any such options will be processed recursively.

   Compiling C++ Programs
       C++  source  files  conventionally  use one of the suffixes .C, .cc, .cpp, .CPP, .c++, .cp, or .cxx; C++ header files
       often use .hh, .hpp, .H, or (for shared template code) .tcc; preprocessed C++ files use the  suffix  .ii;  and  C++20
       module interface units sometimes use .ixx, .cppm, .cxxm, .c++m, or .ccm.

       GCC recognizes files with these names and compiles them as C++ programs even if you call the compiler the same way as
       for compiling C programs (usually with the name gcc).

       However,	 the  use  of gcc does not add the C++ library.	 g++ is a program that calls GCC and automatically specifies
       linking against the C++ library.	 It treats .c, .h and .i files as C++ source files instead of C source files  unless
       -x  is  used.   This  program  is  also	useful	when precompiling a C header file with a .h extension for use in C++
       compilations.  On many systems, g++ is also installed with the name c++.

       When you compile C++ programs, you may specify many of the same command-line  options  that  you	 use  for  compiling
       programs	 in  any  language;  or	 command-line  options	meaningful  for C and related languages; or options that are
       meaningful only for C++ programs.

   Options Controlling C Dialect
       The following options control the dialect  of  C	 (or  languages	 derived  from	C,  such  as  C++,  Objective-C	 and
       Objective-C++) that the compiler accepts:

       -ansi
	   In C mode, this is equivalent to -std=c90. In C++ mode, it is equivalent to -std=c++98.

       -std=
	   Determine the language standard.   This option is currently only supported when compiling C or C++.

	   The	compiler  can accept several base standards, such as c90 or c++98, and GNU dialects of those standards, such
	   as gnu90 or gnu++98.	 When a base standard is  specified,  the  compiler  accepts  all  programs  following	that
	   standard  plus  those  using	 GNU  extensions that do not contradict it.  For example, -std=c90 turns off certain
	   features of GCC that are incompatible with ISO C90, such as the "asm" and "typeof" keywords, but  not  other	 GNU
	   extensions  that  do not have a meaning in ISO C90, such as omitting the middle term of a "?:" expression. On the
	   other hand, when a GNU dialect of a standard is specified, all features supported by the  compiler  are  enabled,
	   even	 when  those features change the meaning of the base standard.	As a result, some strict-conforming programs
	   may be rejected.  The particular standard is used by -Wpedantic to identify which  features	are  GNU  extensions
	   given  that	version	 of the standard. For example -std=gnu90 -Wpedantic warns about C++ style // comments, while
	   -std=gnu99 -Wpedantic does not.

	   A value for this option must be provided; possible values are

	   c90
	   c89
	   iso9899:1990
	       Support all ISO C90 programs (certain GNU extensions that conflict with ISO C90 are disabled). Same as  -ansi
	       for C code.

	   iso9899:199409
	       ISO C90 as modified in amendment 1.

	   c99
	   c9x
	   iso9899:1999
	   iso9899:199x
	       ISO  C99.  This standard is substantially completely supported, modulo bugs and floating-point issues (mainly
	       but   not   entirely   relating	 to   optional	 C99   features	  from	  Annexes    F	  and	 G).	 See
	        for more information.  The names c9x and iso9899:199x are deprecated.

	   c11
	   c1x
	   iso9899:2011
	       ISO  C11,  the  2011  revision  of  the ISO C standard.	This standard is substantially completely supported,
	       modulo bugs, floating-point issues (mainly but not entirely relating to optional C11 features from Annexes  F
	       and  G)	and  the  optional  Annexes  K	(Bounds-checking interfaces) and L (Analyzability).  The name c1x is
	       deprecated.

	   c17
	   c18
	   iso9899:2017
	   iso9899:2018
	       ISO C17, the 2017 revision of the ISO C standard (published in 2018).  This standard is same  as	 C11  except
	       for   corrections   of  defects	(all  of  which	 are  also  applied  with  -std=c11)  and  a  new  value  of
	       "__STDC_VERSION__", and so is supported to the same extent as C11.

	   c23
	   c2x
	   iso9899:2024
	       ISO C23, the 2023 revision of the ISO C standard (published in 2024).  The name c2x is deprecated.

	   c2y The next version of the	ISO  C	standard,  still  under	 development.	The  support  for  this	 version  is
	       experimental and incomplete.

	   gnu90
	   gnu89
	       GNU dialect of ISO C90 (including some C99 features).

	   gnu99
	   gnu9x
	       GNU dialect of ISO C99.	The name gnu9x is deprecated.

	   gnu11
	   gnu1x
	       GNU dialect of ISO C11.	The name gnu1x is deprecated.

	   gnu17
	   gnu18
	       GNU dialect of ISO C17.

	   gnu23
	   gnu2x
	       GNU dialect of ISO C23.	This is the default for C code.	 The name gnu2x is deprecated.

	   gnu2y
	       The  next  version of the ISO C standard, still under development, plus GNU extensions.	The support for this
	       version is experimental and incomplete.	The name gnu2x is deprecated.

	   c++98
	   c++03
	       The 1998 ISO C++ standard plus the 2003 technical corrigendum and some additional  defect  reports.  Same  as
	       -ansi for C++ code.

	   gnu++98
	   gnu++03
	       GNU dialect of -std=c++98.

	   c++11
	   c++0x
	       The 2011 ISO C++ standard plus amendments.  The name c++0x is deprecated.

	   gnu++11
	   gnu++0x
	       GNU dialect of -std=c++11.  The name gnu++0x is deprecated.

	   c++14
	   c++1y
	       The 2014 ISO C++ standard plus amendments.  The name c++1y is deprecated.

	   gnu++14
	   gnu++1y
	       GNU dialect of -std=c++14.  The name gnu++1y is deprecated.

	   c++17
	   c++1z
	       The 2017 ISO C++ standard plus amendments.  The name c++1z is deprecated.

	   gnu++17
	   gnu++1z
	       GNU dialect of -std=c++17.  This is the default for C++ code.  The name gnu++1z is deprecated.

	   c++20
	   c++2a
	       The 2020 ISO C++ standard plus amendments.  Support is experimental, and could change in incompatible ways in
	       future releases.	 The name c++2a is deprecated.

	   gnu++20
	   gnu++2a
	       GNU  dialect  of	 -std=c++20.   Support	is  experimental,  and	could  change in incompatible ways in future
	       releases.  The name gnu++2a is deprecated.

	   c++23
	   c++2b
	       The 2023 ISO C++ standard plus amendments (published in 2024).  Support is experimental, and could change  in
	       incompatible ways in future releases.  The name c++2b is deprecated.

	   gnu++23
	   gnu++2b
	       GNU  dialect  of	 -std=c++23.   Support	is  experimental,  and	could  change in incompatible ways in future
	       releases.  The name gnu++2b is deprecated.

	   c++2c
	   c++26
	       The next revision of the ISO C++ standard, planned for 2026.  Support is highly experimental, and will almost
	       certainly change in incompatible ways in future releases.

	   gnu++2c
	   gnu++26
	       GNU dialect of -std=c++2c.  Support is highly experimental, and will almost certainly change in	incompatible
	       ways in future releases.

       -aux-info filename
	   Output  to  the given filename prototyped declarations for all functions declared and/or defined in a translation
	   unit, including those in header files.  This option is silently ignored in any language other than C.

	   Besides declarations, the file indicates, in comments, the origin of each declaration  (source  file	 and  line),
	   whether the declaration was implicit, prototyped or unprototyped (I, N for new or O for old, respectively, in the
	   first  character  after the line number and the colon), and whether it came from a declaration or a definition (C
	   or F, respectively, in the following character).  In the case  of  function	definitions,  a	 K&R-style  list  of
	   arguments followed by their declarations is also provided, inside comments, after the declaration.

       -fno-asm
	   Do  not recognize "asm", "inline" or "typeof" as a keyword, so that code can use these words as identifiers.	 You
	   can use the keywords "__asm__", "__inline__" and "__typeof__" instead.  In C, -ansi implies -fno-asm.

	   In C++, "inline" is a standard  keyword  and	 is  not  affected  by	this  switch.	You  may  want	to  use	 the
	   -fno-gnu-keywords  flag  instead,  which  disables "typeof" but not "asm" and "inline".  In C99 mode (-std=c99 or
	   -std=gnu99), this switch only affects the "asm" and "typeof" keywords, since "inline" is a  standard	 keyword  in
	   ISO	C99.   In C23 mode (-std=c23 or -std=gnu23), this switch only affects the "asm" keyword, since "typeof" is a
	   standard keyword in ISO C23.

       -fno-builtin
       -fno-builtin-function
	   Don't recognize built-in functions that do not begin with __builtin_ as prefix.

	   GCC normally generates special code to handle certain built-in functions more efficiently; for instance, calls to
	   "alloca" may become single instructions which adjust the stack directly, and calls to "memcpy" may become  inline
	   copy	 loops.	  The resulting code is often both smaller and faster, but since the function calls no longer appear
	   as such, you cannot set a breakpoint on those calls, nor can you change the behavior of the functions by  linking
	   with	 a  different  library.	  In  addition,	 when  a  function is recognized as a built-in function, GCC may use
	   information about that function to warn about problems with calls to that function, or to generate more efficient
	   code, even if the resulting code still contains calls to that function.  For example,  warnings  are	 given	with
	   -Wformat for bad calls to "printf" when "printf" is built in and "strlen" is known not to modify global memory.

	   With	 the  -fno-builtin-function option only the built-in function function is disabled.  function must not begin
	   with __builtin_.  If a function is named that is not built-in in this version of GCC,  this	option	is  ignored.
	   There  is  no  corresponding -fbuiltin-function option; if you wish to enable built-in functions selectively when
	   using -fno-builtin or -ffreestanding, you may define macros such as:

		   #define abs(n)	   __builtin_abs ((n))
		   #define strcpy(d, s)	   __builtin_strcpy ((d), (s))

       -fcond-mismatch
	   Allow conditional expressions with mismatched types in the second and third arguments.   The	 value	of  such  an
	   expression is void.	This option is not supported for C++.

       -ffreestanding
	   Assert  that	 compilation  targets  a  freestanding	environment.   This  implies  -fno-builtin.   A freestanding
	   environment is one in which the standard library may not exist, and program startup may  not	 necessarily  be  at
	   "main".  The most obvious example is an OS kernel.  This is equivalent to -fno-hosted.

       -fgimple
	   Enable  parsing of function definitions marked with "__GIMPLE".  This is an experimental feature that allows unit
	   testing of GIMPLE passes.

       -fgnu-tm
	   When the option -fgnu-tm is specified, the compiler generates code for  the	Linux  variant	of  Intel's  current
	   Transactional  Memory  ABI  specification  document	(Revision 1.1, May 6 2009).  This is an experimental feature
	   whose interface may change in future versions of GCC, as the official specification changes.	  Please  note	that
	   not all architectures are supported for this feature.

	   For more information on GCC's support for transactional memory,

	   Note that the transactional memory feature is not supported with non-call exceptions (-fnon-call-exceptions).

       -fgnu89-inline
	   The option -fgnu89-inline tells GCC to use the traditional GNU semantics for "inline" functions when in C99 mode.

	   Using this option is roughly equivalent to adding the "gnu_inline" function attribute to all inline functions.

	   The option -fno-gnu89-inline explicitly tells GCC to use the C99 semantics for "inline" when in C99 or gnu99 mode
	   (i.e., it specifies the default behavior).  This option is not supported in -std=c90 or -std=gnu90 mode.

	   The preprocessor macros "__GNUC_GNU_INLINE__" and "__GNUC_STDC_INLINE__" may be used to check which semantics are
	   in effect for "inline" functions.

       -fhosted
	   Assert  that	 compilation  targets a hosted environment.  This implies -fbuiltin.  A hosted environment is one in
	   which the entire standard library is available, and in which "main" has a return type  of  "int".   Examples	 are
	   nearly everything except a kernel.  This is equivalent to -fno-freestanding.

       -flax-vector-conversions
	   Allow  implicit conversions between vectors with differing numbers of elements and/or incompatible element types.
	   This option should not be used for new code.

       -fms-extensions
	   Accept some non-standard constructs used in Microsoft header files.

	   In C++ code, this allows member names in structures to be similar to previous types declarations.

		   typedef int UOW;
		   struct ABC {
		     UOW UOW;
		   };

	   Some cases of unnamed fields in structures and unions are only accepted with this option.

	   Note that this option is off for all targets except for x86 targets using ms-abi.

       -fpermitted-flt-eval-methods=style
	   ISO/IEC TS 18661-3 defines new permissible  values  for  "FLT_EVAL_METHOD"  that  indicate  that  operations	 and
	   constants with a semantic type that is an interchange or extended format should be evaluated to the precision and
	   range of that type.	These new values are a superset of those permitted under C99/C11, which does not specify the
	   meaning of other positive values of "FLT_EVAL_METHOD".  As such, code conforming to C11 may not have been written
	   expecting the possibility of the new values.

	   -fpermitted-flt-eval-methods	 specifies  whether  the  compiler should allow only the values of "FLT_EVAL_METHOD"
	   specified in C99/C11, or the extended set of values specified in ISO/IEC TS 18661-3.

	   style is either "c11" or "ts-18661-3" as appropriate.

	   The default when in a standards compliant mode (-std=c11 or similar)	 is  -fpermitted-flt-eval-methods=c11.	 The
	   default when in a GNU dialect (-std=gnu11 or similar) is -fpermitted-flt-eval-methods=ts-18661-3.

	   The	-fdeps-*  options  are	used  to  extract  structured  dependency  information	for a source.  This involves
	   determining what resources provided by other source files will be required to compile the source as well as	what
	   resources  are  provided  by	 the  source.	This  information  can	be used to add required dependencies between
	   compilation rules of dependent sources based	 on  their  contents  rather  than  requiring  such  information  be
	   reflected within the build tools as well.

       -fdeps-file=file
	   Where to write structured dependency information.

       -fdeps-format=format
	   The	format	to  use for structured dependency information. p1689r5 is the only supported format right now.	Note
	   that when this argument is specified, the output of -MF is stripped of some information (namely C++	modules)  so
	   that it does not use extended makefile syntax not understood by most tools.

       -fdeps-target=file
	   Analogous to -MT but for structured dependency information.	This indicates the target which will ultimately need
	   any required resources and provide any resources extracted from the source that may be required by other sources.

       -fplan9-extensions
	   Accept some non-standard constructs used in Plan 9 code.

	   This	 enables  -fms-extensions,  permits  passing  pointers to structures with anonymous fields to functions that
	   expect pointers to elements of the type of the field, and permits referring to anonymous fields declared using  a
	   typedef.    This is only supported for C, not C++.

       -fsigned-bitfields
       -funsigned-bitfields
       -fno-signed-bitfields
       -fno-unsigned-bitfields
	   These  options  control  whether  a	bit-field  is  signed  or unsigned, when the declaration does not use either
	   "signed" or "unsigned".  By default, such a bit-field is signed, because this is consistent:	 the  basic  integer
	   types such as "int" are signed types.

       -fsigned-char
	   Let the type "char" be signed, like "signed char".

	   Note that this is equivalent to -fno-unsigned-char, which is the negative form of -funsigned-char.  Likewise, the
	   option -fno-signed-char is equivalent to -funsigned-char.

       -funsigned-char
	   Let the type "char" be unsigned, like "unsigned char".

	   Each	 kind  of  machine has a default for what "char" should be.  It is either like "unsigned char" by default or
	   like "signed char" by default.

	   Ideally, a portable program should always use "signed char" or "unsigned char" when it depends on the  signedness
	   of  an  object.  But many programs have been written to use plain "char" and expect it to be signed, or expect it
	   to be unsigned, depending on the machines they were written for.  This option, and its inverse, let you make such
	   a program work with the opposite default.

	   The type "char" is always a distinct type from each of "signed char" or "unsigned char", even though its behavior
	   is always just like one of those two.

       -fstrict-flex-arrays (C and C++ only)
       -fstrict-flex-arrays=level (C and C++ only)
	   Control when to treat the trailing array of a structure as a flexible array member for the purpose  of  accessing
	   the elements of such an array.  The value of level controls the level of strictness.

	   -fstrict-flex-arrays is equivalent to -fstrict-flex-arrays=3, which is the strictest; a trailing array is treated
	   as a flexible array member only when it is declared as a flexible array member per C99 standard onwards.

	   The negative form -fno-strict-flex-arrays is equivalent to -fstrict-flex-arrays=0, which is the least strict.  In
	   this case all trailing arrays of structures are treated as flexible array members.

	   There  are  two  more levels in between 0 and 3, which are provided to support older code that uses the GCC zero-
	   length array extension ([0]) or one-element array as flexible array members ([1]).  When level is 1, the trailing
	   array is treated as a flexible array member when it is declared as either [], [0], or [1].  When level is 2,	 the
	   trailing array is treated as a flexible array member when it is declared as either [], or [0].

	   You	can control this behavior for a specific trailing array field of a structure by using the variable attribute
	   "strict_flex_array" attribute.

	   The -fstrict_flex_arrays option interacts with the -Wstrict-flex-arrays option.

       -fsso-struct=endianness
	   Set the default scalar storage order of structures and unions to the specified endianness.  The  accepted  values
	   are	big-endian,  little-endian and native for the native endianness of the target (the default).  This option is
	   not supported for C++.

	   Warning: the -fsso-struct switch causes GCC to generate code that is not binary compatible  with  code  generated
	   without it if the specified endianness is not the native endianness of the target.

   Options Controlling C++ Dialect
       This  section describes the command-line options that are only meaningful for C++ programs.  You can also use most of
       the GNU compiler options regardless of what language your program is in.	 For  example,	you  might  compile  a	file
       firstClass.C like this:

	       g++ -g -fstrict-enums -O -c firstClass.C

       In this example, only -fstrict-enums is an option meant only for C++ programs; you can use the other options with any
       language supported by GCC.

       Some options for compiling C programs, such as -std, are also relevant for C++ programs.

       Here is a list of options that are only for compiling C++ programs:

       -fabi-version=n
	   Use version n of the C++ ABI.  The default is version 0.

	   Version  0  refers  to  the	version	 conforming  most  closely to the C++ ABI specification.  Therefore, the ABI
	   obtained using version 0 will change in different versions of G++ as ABI bugs are fixed.

	   Version 1 is the version of the C++ ABI that first appeared in G++ 3.2.

	   Version 2 is the version of the C++ ABI that first appeared in G++ 3.4, and was the default through G++ 4.9.

	   Version 3 corrects an error in mangling a constant address as a template argument.

	   Version 4, which first appeared in G++ 4.5, implements a standard mangling for vector types.

	   Version 5, which first appeared in G++ 4.6, corrects the mangling of attribute const/volatile on function pointer
	   types, decltype of a plain decl, and use of a function parameter in the declaration of another parameter.

	   Version 6, which first appeared in G++ 4.7, corrects the  promotion	behavior  of  C++11  scoped  enums  and	 the
	   mangling  of	 template  argument packs, const/static_cast, prefix ++ and --, and a class scope function used as a
	   template argument.

	   Version 7, which first appeared in G++ 4.8, that treats nullptr_t as a builtin type and corrects the mangling  of
	   lambdas in default argument scope.

	   Version  8,	which first appeared in G++ 4.9, corrects the substitution behavior of function types with function-
	   cv-qualifiers.

	   Version 9, which first appeared in G++ 5.2, corrects the alignment of "nullptr_t".

	   Version 10, which first appeared in G++ 6.1, adds mangling of attributes that affect type identity, such as	ia32
	   calling convention attributes (e.g. stdcall).

	   Version  11,	 which	first  appeared in G++ 7, corrects the mangling of sizeof... expressions and operator names.
	   For multiple entities with the same name within a function, that are declared in different scopes,  the  mangling
	   now changes starting with the twelfth occurrence.  It also implies -fnew-inheriting-ctors.

	   Version  12,	 which	first  appeared	 in  G++ 8, corrects the calling conventions for empty classes on the x86_64
	   target and for classes with only deleted copy/move constructors.  It accidentally changes the calling  convention
	   for classes with a deleted copy constructor and a trivial move constructor.

	   Version 13, which first appeared in G++ 8.2, fixes the accidental change in version 12.

	   Version 14, which first appeared in G++ 10, corrects the mangling of the nullptr expression.

	   Version 15, which first appeared in G++ 10.3, corrects G++ 10 ABI tag regression.

	   Version  16,	 which	first  appeared in G++ 11, changes the mangling of "__alignof__" to be distinct from that of
	   "alignof", and dependent operator names.

	   Version 17, which first appeared in G++ 12, fixes layout of classes that  inherit  from  aggregate  classes	with
	   default member initializers in C++14 and up.

	   Version 18, which first appeared in G++ 13, fixes manglings of lambdas that have additional context.

	   Version 19, which first appeared in G++ 14, fixes manglings of structured bindings to include ABI tags.

	   Version 20, which first appeared in G++ 15, fixes manglings of lambdas in static data member initializers.

	   See also -Wabi.

       -fabi-compat-version=n
	   On  targets	that support strong aliases, G++ works around mangling changes by creating an alias with the correct
	   mangled name when defining a symbol with an incorrect mangled name.	This switch specifies which ABI	 version  to
	   use for the alias.

	   With	 -fabi-version=0  (the	default),  this	 defaults  to 13 (GCC 8.2 compatibility).  If another ABI version is
	   explicitly  selected,  this	defaults  to  0.   For	compatibility  with  GCC  versions  3.2	 through  4.9,	 use
	   -fabi-compat-version=2.

	   If this option is not provided but -Wabi=n is, that version is used for compatibility aliases.  If this option is
	   provided along with -Wabi (without the version), the version from this option is used for the warning.

       -fno-access-control
	   Turn off all access checking.  This switch is mainly useful for working around bugs in the access control code.

       -faligned-new
	   Enable  support  for	 C++17	"new"  of types that require more alignment than "void* ::operator new(std::size_t)"
	   provides.  A numeric argument such as "-faligned-new=32" can be used to specify how much alignment (in bytes)  is
	   provided by that function, but few users will need to override the default of alignof(std::max_align_t).

	   This flag is enabled by default for -std=c++17.

       -fno-assume-sane-operators-new
	   The	C++  standard allows replacing the global "new", "new[]", "delete" and "delete[]" operators, though a lot of
	   C++ programs don't replace them and just use the implementation provided version.  Furthermore, the C++  standard
	   allows omitting those calls if they are made from new or delete expressions (and by extension the same is assumed
	   if  "__builtin_operator_new" or "__builtin_operator_delete" functions are used).  This option allows control over
	   some optimizations around calls to those operators.	With  "-fassume-sane-operators-new-delete"  option  GCC	 may
	   assume   that   calls   to	the   replaceable   global   operators	from  new  or  delete  expressions  or	from
	   "__builtin_operator_new" or "__builtin_operator_delete" calls don't	read  or  modify  any  global  variables  or
	   variables whose address could escape to the operators (global state; except for "errno" for the "new" and "new[]"
	   operators).	 This allows most optimizations across those calls and is something that the implementation provided
	   operators satisfy unless "malloc" implementation details are observable in the code or unless "malloc" hooks	 are
	   used,  but  might  not  be satisfied if a program replaces those operators.	This behavior is enabled by default.
	   With "-fno-assume-sane-operators-new-delete" option GCC must assume all these calls (whether from new  or  delete
	   expressions	or called directly) may read and write global state unless proven otherwise (e.g.  when GCC compiles
	   their implementation).  Use this option if those operators are or may be replaced and code needs to	expect	such
	   behavior.

       -fchar8_t
       -fno-char8_t
	   Enable  support  for	 "char8_t"  as adopted for C++20.  This includes the addition of a new "char8_t" fundamental
	   type, changes to the types of UTF-8 string and character literals,  new  signatures	for  user-defined  literals,
	   associated standard library updates, and new "__cpp_char8_t" and "__cpp_lib_char8_t" feature test macros.

	   This option enables functions to be overloaded for ordinary and UTF-8 strings:

		   int f(const char *);	   // #1
		   int f(const char8_t *); // #2
		   int v1 = f("text");	   // Calls #1
		   int v2 = f(u8"text");   // Calls #2

	   and introduces new signatures for user-defined literals:

		   int operator""_udl1(char8_t);
		   int v3 = u8'x'_udl1;
		   int operator""_udl2(const char8_t*, std::size_t);
		   int v4 = u8"text"_udl2;
		   template int operator""_udl3();
		   int v5 = u8"text"_udl3;

	   The	change	to  the types of UTF-8 string and character literals introduces incompatibilities with ISO C++11 and
	   later standards.  For example, the following code  is  well-formed  under  ISO  C++11,  but	is  ill-formed	when
	   -fchar8_t is specified.

		   const char *cp = u8"xx";// error: invalid conversion from
					   //	     `const char8_t*' to `const char*'
		   int f(const char*);
		   auto v = f(u8"xx");	   // error: invalid conversion from
					   //	     `const char8_t*' to `const char*'
		   std::string s{u8"xx"};  // error: no matching function for call to
					   //	     `std::basic_string::basic_string()'
		   using namespace std::literals;
		   s = u8"xx"s;		   // error: conversion from
					   //	     `basic_string' to non-scalar
					   //	     type `basic_string' requested

       -fcheck-new
	   Check  that the pointer returned by "operator new" is non-null before attempting to modify the storage allocated.
	   This check is normally unnecessary because the C++ standard specifies that "operator new" only returns 0 if it is
	   declared throw(), in which case the compiler always checks the return value even without  this  option.   In	 all
	   other  cases,  when	"operator  new"	 has  a non-empty exception specification, memory exhaustion is signalled by
	   throwing "std::bad_alloc".  See also new (nothrow).

       -fconcepts
	   Enable support for the C++ Concepts feature for constraining template  arguments.   With  -std=c++20	 and  above,
	   Concepts are part of the language standard, so -fconcepts defaults to on.

	   Some	 constructs  that were allowed by the earlier C++ Extensions for Concepts Technical Specification, ISO 19217
	   (2015), but didn't make it into the standard,  could	 additionally  be  enabled  by	-fconcepts-ts.	 The  option
	   -fconcepts-ts  was  deprecated in GCC 14 and removed in GCC 15; users are expected to convert their code to C++20
	   concepts.

       -fconstexpr-depth=n
	   Set the maximum nested evaluation depth for C++11 constexpr functions to n.	A limit is needed to detect  endless
	   recursion during constant expression evaluation.  The minimum specified by the standard is 512.

       -fconstexpr-cache-depth=n
	   Set the maximum level of nested evaluation depth for C++11 constexpr functions that will be cached to n.  This is
	   a  heuristic	 that  trades  off  compilation	 speed	(when the cache avoids repeated calculations) against memory
	   consumption (when the cache grows very large from highly recursive evaluations).  The default  is  8.   Very	 few
	   users  are  likely  to  want	 to  adjust it, but if your code does heavy constexpr calculations you might want to
	   experiment to find which value works best for you.

       -fconstexpr-fp-except
	   Annex F of the C standard specifies that IEC559 floating point exceptions encountered at compile time should	 not
	   stop	 compilation.	C++  compilers have historically not followed this guidance, instead treating floating point
	   division by zero as non-constant even though it has a well defined value.  This flag tells the compiler  to	give
	   Annex F priority over other rules saying that a particular operation is undefined.

		   constexpr float inf = 1./0.; // OK with -fconstexpr-fp-except

       -fconstexpr-loop-limit=n
	   Set	the  maximum number of iterations for a loop in C++14 constexpr functions to n.	 A limit is needed to detect
	   infinite loops during constant expression evaluation.  The default is 262144 (1<<18).

       -fconstexpr-ops-limit=n
	   Set the maximum number of operations during a single constexpr evaluation.  Even when number of iterations  of  a
	   single  loop	 is  limited  with  the	 above	limit,	if  there are several nested loops and each of them has many
	   iterations but still smaller than the above limit, or if in a body of some loop or even outside  of	a  loop	 too
	   many	 expressions  need  to be evaluated, the resulting constexpr evaluation might take too long.  The default is
	   33554432 (1<<25).

       -fcontracts
	   Enable experimental support for the C++ Contracts feature, as briefly added to and then removed  from  the  C++20
	   working  paper  (N4820).   The  implementation  also includes proposed enhancements from papers P1290, P1332, and
	   P1429.  This functionality is intended mostly for  those  interested	 in  experimentation  towards  refining	 the
	   feature to get it into shape for a future C++ standard.

	   On  violation of a checked contract, the violation handler is called.  Users can replace the violation handler by
	   defining

		   void
		   handle_contract_violation (const std::experimental::contract_violation&);

	   There are different sets of additional flags that can be used together to specify which contracts will be checked
	   and how, for N4820 contracts, P1332 contracts, or P1429 contracts; these sets cannot be used together.

	   -fcontract-mode=[on|off]
	       Control whether any contracts have any semantics at all.	 Defaults to on.

	   -fcontract-assumption-mode=[on|off]
	       [N4820] Control whether contracts with level axiom should have the assume semantic.  Defaults to on.

	   -fcontract-build-level=[off|default|audit]
	       [N4820] Specify which level of contracts to generate checks for.	 Defaults to default.

	   -fcontract-continuation-mode=[on|off]
	       [N4820] Control whether to allow the program to continue executing after a contract violation.  That  is,  do
	       checked contracts have the maybe semantic described below rather than the never semantic.  Defaults to off.

	   -fcontract-role=:,,
	       [P1332] Specify the concrete semantics for each contract level of a particular contract role.

	   -fcontract-semantic=[default|audit|axiom]:
	       [P1429] Specify the concrete semantic for a particular contract level.

	   -fcontract-strict-declarations=[on|off]
	       Control whether to reject adding contracts to a function after its first declaration.  Defaults to off.

	   The possible concrete semantics for that can be specified with -fcontract-role or -fcontract-semantic are:

	   "ignore"
	       This contract has no effect.

	   "assume"
	       This contract is treated like C++23 "[[assume]]".

	   "check_never_continue"
	   "never"
	   "abort"
	       This  contract  is  checked.   If  it  fails,  the  violation  handler  is  called.   If the handler returns,
	       "std::terminate" is called.

	   "check_maybe_continue"
	   "maybe"
	       This contract is checked.  If it fails, the violation handler is called.	 If the handler	 returns,  execution
	       continues normally.

       -fcoroutines
	   Enable support for the C++ coroutines extension (experimental).

       -fdiagnostics-all-candidates
	   Permit  the	C++  front  end	 to note all candidates during overload resolution failure, including when a deleted
	   function is selected.

       -fno-elide-constructors
	   The C++ standard allows an implementation to omit creating a temporary that is only used  to	 initialize  another
	   object  of  the  same  type.	  Specifying this option disables that optimization, and forces G++ to call the copy
	   constructor in all cases.  This option also causes G++ to call trivial member functions which otherwise would  be
	   expanded inline.

	   In  C++17,  the  compiler  is  required  to	omit these temporaries, but this option still affects trivial member
	   functions.

       -fno-enforce-eh-specs
	   Don't generate code to check for violation of exception specifications at run time.	This option violates the C++
	   standard, but may be useful for reducing code size in production builds, much like defining "NDEBUG".  This	does
	   not	give  user  code  permission  to throw exceptions in violation of the exception specifications; the compiler
	   still optimizes based on the specifications, so throwing an unexpected exception results in undefined behavior at
	   run time.

       -fextern-tls-init
       -fno-extern-tls-init
	   The C++11 and OpenMP standards allow "thread_local" and  "threadprivate"  variables	to  have  dynamic  (runtime)
	   initialization.   To	 support  this, any use of such a variable goes through a wrapper function that performs any
	   necessary initialization.  When the use and definition of the variable are in the  same  translation	 unit,	this
	   overhead can be optimized away, but when the use is in a different translation unit there is significant overhead
	   even	 if the variable doesn't actually need dynamic initialization.	If the programmer can be sure that no use of
	   the variable in a non-defining TU needs to  trigger	dynamic	 initialization	 (either  because  the	variable  is
	   statically  initialized,  or a use of the variable in the defining TU will be executed before any uses in another
	   TU), they can avoid this overhead with the -fno-extern-tls-init option.

	   On targets that support symbol aliases, the default is -fextern-tls-init.  On targets that do not support  symbol
	   aliases, the default is -fno-extern-tls-init.

       -ffold-simple-inlines
       -fno-fold-simple-inlines
	   Permit  the	C++ frontend to fold calls to "std::move", "std::forward", "std::addressof" and "std::as_const".  In
	   contrast to inlining, this means no debug information will be generated for such calls.   Since  these  functions
	   are rarely interesting to debug, this flag is enabled by default unless -fno-inline is active.

       -fno-gnu-keywords
	   Do not recognize "typeof" as a keyword, so that code can use this word as an identifier.  You can use the keyword
	   "__typeof__" instead.  This option is implied by the strict ISO C++ dialects: -ansi, -std=c++98, -std=c++11, etc.

       -fno-immediate-escalation
	   Do  not enable immediate function escalation whereby certain functions can be promoted to consteval, as specified
	   in P2564R3.	For example:

		   consteval int id(int i) { return i; }

		   constexpr int f(auto t)
		   {
		     return t + id(t); // id causes f to be promoted to consteval
		   }

		   void g(int i)
		   {
		     f (3);
		   }

	   compiles in C++20: "f" is an immediate-escalating function (due to the "auto" it is a function  template  and  is
	   declared  "constexpr")  and	id(t)  is  an  immediate-escalating  expression,  so "f" is promoted to "consteval".
	   Consequently, the call to id(t) is in an immediate context, so doesn't have to produce a constant  (that  is	 the
	   mechanism allowing consteval function composition).	However, with -fno-immediate-escalation, "f" is not promoted
	   to "consteval", and since the call to consteval function id(t) is not a constant expression, the compiler rejects
	   the code.

	   This option is turned on by default; it is only effective in C++20 mode or later.

       -fimplicit-constexpr
	   Make	 inline	 functions  implicitly	constexpr,  if they satisfy the requirements for a constexpr function.	This
	   option can be used in C++14 mode or later.  This can result in initialization changing from dynamic to static and
	   other optimizations.

       -fno-implicit-templates
	   Never emit code for non-inline templates that are instantiated implicitly (i.e.  by	use);  only  emit  code	 for
	   explicit  instantiations.   If  you use this option, you must take care to structure your code to include all the
	   necessary explicit instantiations to avoid getting undefined symbols at link time.

       -fno-implicit-inline-templates
	   Don't emit code for implicit instantiations of inline templates,  either.   The  default  is	 to  handle  inlines
	   differently so that compiles with and without optimization need the same set of explicit instantiations.

       -fno-implement-inlines
	   To  save  space, do not emit out-of-line copies of inline functions controlled by "#pragma implementation".	This
	   causes linker errors if these functions are not inlined everywhere they are called.

       -fmodules
       -fno-modules
	   Enable support for C++20 modules.  The -fno-modules is usually not needed, as that is the default.	Even  though
	   this is a C++20 feature, it is not currently implicitly enabled by selecting that standard version.

       -fmodule-header
       -fmodule-header=user
       -fmodule-header=system
	   Compile a header file to create an importable header unit.

       -fmodule-implicit-inline
	   Member  functions  defined  in  their  class	 definitions  are  not	implicitly inline for modular code.  This is
	   different to traditional C++ behavior, for good reasons.  However, it may result  in	 a  difficulty	during	code
	   porting.   This  option  makes  such	 function  definitions	implicitly  inline.  It does however generate an ABI
	   incompatibility, so you must use it everywhere or nowhere.  (Such definitions outside of a  named  module  remain
	   implicitly inline, regardless.)

       -fno-module-lazy
	   Disable lazy module importing and module mapper creation.

       -fmodule-mapper=[hostname]:port[?ident]
       -fmodule-mapper=|program[?ident] args...
       -fmodule-mapper==socket[?ident]
       -fmodule-mapper=<>[inout][?ident]
       -fmodule-mapper=out[?ident]
       -fmodule-mapper=file[?ident]
	   An  oracle  to  query  for  module  name  to filename mappings.  If unspecified the CXX_MODULE_MAPPER environment
	   variable is used, and if that is unset, an in-process default is provided.

       -fmodule-only
	   Only emit the Compiled Module Interface, inhibiting any object file.

       -fms-extensions
	   Disable Wpedantic warnings about constructs used in MFC, such as implicit int and getting  a	 pointer  to  member
	   function via non-standard syntax.

       -fnew-inheriting-ctors
	   Enable  the	P0136  adjustment to the semantics of C++11 constructor inheritance.  This is part of C++17 but also
	   considered  to  be  a  Defect  Report  against  C++11  and  C++14.	This  flag  is	enabled	 by  default  unless
	   -fabi-version=10 or lower is specified.

       -fnew-ttp-matching
	   Enable  the P0522 resolution to Core issue 150, template template parameters and default arguments: this allows a
	   template with default template arguments as an argument for a template template  parameter  with  fewer  template
	   parameters.	This flag is enabled by default for -std=c++17.

       -fno-nonansi-builtins
	   Disable  built-in  declarations of functions that are not mandated by ANSI/ISO C.  These include "ffs", "alloca",
	   "_exit", "index", "bzero", "conjf", and other related functions.

       -fnothrow-opt
	   Treat a throw() exception specification as if it were a "noexcept" specification to reduce or eliminate the	text
	   size	 overhead  relative  to	 a function with no exception specification.  If the function has local variables of
	   types with non-trivial destructors, the exception specification actually makes the function smaller	because	 the
	   EH  cleanups for those variables can be optimized away.  The semantic effect is that an exception thrown out of a
	   function with such an exception specification results in a call to "terminate" rather than "unexpected".

       -fno-operator-names
	   Do not treat the operator name keywords "and", "bitand", "bitor", "compl", "not", "or" and "xor" as	synonyms  as
	   keywords.

       -fno-optional-diags
	   Disable  diagnostics	 that  the  standard  says  a  compiler	 does  not  need to issue.  Currently, the only such
	   diagnostic issued by G++ is the one for a name having multiple meanings within a class.

       -fno-pretty-templates
	   When an error message refers to a specialization of	a  function  template,	the  compiler  normally	 prints	 the
	   signature of the template followed by the template arguments and any typedefs or typenames in the signature (e.g.
	   "void  f(T)	[with  T  = int]" rather than "void f(int)") so that it's clear which template is involved.  When an
	   error message refers to a specialization of a class template, the compiler  omits  any  template  arguments	that
	   match  the  default	template  arguments  for  that	template.   If	either	of these behaviors make it harder to
	   understand the error message rather than easier, you can use -fno-pretty-templates to disable them.

       -frange-for-ext-temps
	   Enable lifetime extension of C++ range based for temporaries.  With -std=c++23 and above  this  is  part  of	 the
	   language  standard, so lifetime of the temporaries is extended until the end of the loop by default.	 This option
	   allows enabling that behavior also in earlier versions of the standard.

       -fno-rtti
	   Disable generation of information about every class with virtual functions for  use	by  the	 C++  run-time	type
	   identification  features  ("dynamic_cast"  and  "typeid").  If you don't use those parts of the language, you can
	   save some space by using this flag.	Note that exception handling uses the same information, but G++ generates it
	   as needed. The "dynamic_cast" operator can still be used for casts that do not require run-time type information,
	   i.e. casts to "void *" or to unambiguous base classes.

	   Mixing code compiled with -frtti with that compiled with -fno-rtti may not work.  For example, programs may	fail
	   to link if a class compiled with -fno-rtti is used as a base for a class compiled with -frtti.

       -fsized-deallocation
	   Enable the built-in global declarations

		   void operator delete (void *, std::size_t) noexcept;
		   void operator delete[] (void *, std::size_t) noexcept;

	   as  introduced  in  C++14.  This is useful for user-defined replacement deallocation functions that, for example,
	   use the size of the object to make deallocation faster.  Enabled by default under -std=c++14 and above.  The flag
	   -Wsized-deallocation warns about places that might want to add a definition.

       -fstrict-enums
	   Allow the compiler to optimize using the assumption that a value of enumerated type can only be one of the values
	   of the enumeration (as defined in the C++ standard; basically, a value that can be  represented  in	the  minimum
	   number  of bits needed to represent all the enumerators).  This assumption may not be valid if the program uses a
	   cast to convert an arbitrary integer value to the enumerated type.  This option has no effect for an	 enumeration
	   type with a fixed underlying type.

       -fstrong-eval-order
       -fstrong-eval-order=kind
	   Evaluate member access, array subscripting, and shift expressions in left-to-right order, and evaluate assignment
	   in  right-to-left order, as adopted for C++17.  -fstrong-eval-order is equivalent to -fstrong-eval-order=all, and
	   is enabled by default with -std=c++17 or later.

	   -fstrong-eval-order=some enables just the ordering of member access and shift expressions, and is the default for
	   C++ dialects prior to C++17.

	   -fstrong-eval-order=none is equivalent to -fno-strong-eval-order.

       -ftemplate-backtrace-limit=n
	   Set the maximum number of template instantiation notes for a single warning or error to n.  The default value  is
	   10.

       -ftemplate-depth=n
	   Set	the  maximum  instantiation depth for template classes to n.  A limit on the template instantiation depth is
	   needed to detect endless recursions during template class instantiation.  ANSI/ISO C++ conforming  programs	must
	   not	rely  on  a  maximum  depth  greater  than  17 (changed to 1024 in C++11).  The default value is 900, as the
	   compiler can run out of stack space before hitting 1024 in some situations.

       -fno-threadsafe-statics
	   Do not emit the extra code to use the routines specified in the C++ ABI for thread-safe initialization  of  local
	   statics.  You can use this option to reduce code size slightly in code that doesn't need to be thread-safe.

       -fuse-cxa-atexit
	   Register  destructors  for  objects with static storage duration with the "__cxa_atexit" function rather than the
	   "atexit" function.  This option is required for fully standards-compliant handling  of  static  destructors,	 but
	   only works if your C library supports "__cxa_atexit".

       -fno-use-cxa-get-exception-ptr
	   Don't  use the "__cxa_get_exception_ptr" runtime routine.  This causes "std::uncaught_exception" to be incorrect,
	   but is necessary if the runtime routine is not available.

       -fvisibility-inlines-hidden
	   This switch declares that the user does not attempt to compare pointers to inline functions or methods where	 the
	   addresses of the two functions are taken in different shared objects.

	   The	effect	of  this  is  that  GCC	 may,  effectively,  mark  inline  methods  with "__attribute__ ((visibility
	   ("hidden")))" so that they do not appear in the export table of a DSO and do not require a PLT  indirection	when
	   used	 within	 the  DSO.   Enabling  this  option can have a dramatic effect on load and link times of a DSO as it
	   massively reduces the size of the dynamic export table when the library makes heavy use of templates.

	   The behavior of this switch is not quite the same as marking the methods as hidden directly, because it does	 not
	   affect  static  variables  local  to the function or cause the compiler to deduce that the function is defined in
	   only one shared object.

	   You may mark a method as having a visibility explicitly to negate the effect of the switch for that method.	 For
	   example,  if	 you  do want to compare pointers to a particular inline method, you might mark it as having default
	   visibility.	Marking the enclosing class with explicit visibility has no effect.

	   Explicitly instantiated inline methods are unaffected by this option as their linkage  might	 otherwise  cross  a
	   shared library boundary.

       -fvisibility-ms-compat
	   This	 flag  attempts to use visibility settings to make GCC's C++ linkage model compatible with that of Microsoft
	   Visual Studio.

	   The flag makes these changes to GCC's linkage model:

	   1.  It sets the default visibility to "hidden", like -fvisibility=hidden.

	   2.  Types, but not their members, are not hidden by default.

	   3.  The One Definition Rule is relaxed for types without explicit visibility specifications that are	 defined  in
	       more  than  one shared object: those declarations are permitted if they are permitted when this option is not
	       used.

	   In new code it is better to use -fvisibility=hidden and export those classes that are intended to  be  externally
	   visible.  Unfortunately it is possible for code to rely, perhaps accidentally, on the Visual Studio behavior.

	   Among  the  consequences  of	 these	changes are that static data members of the same type with the same name but
	   defined in different shared objects are different, so changing one does not change the other; and  that  pointers
	   to  function members defined in different shared objects may not compare equal.  When this flag is given, it is a
	   violation of the ODR to define types with the same name differently.

       -fno-weak
	   Do not use weak symbol support, even if it is provided by the linker.  By default, G++ uses weak symbols if	they
	   are	available.  This option exists only for testing, and should not be used by end-users; it results in inferior
	   code and has no benefits.  This option may be removed in a future release of G++.

       -fext-numeric-literals (C++ and Objective-C++ only)
	   Accept imaginary, fixed-point, or machine-defined literal number suffixes as GNU extensions.	 When this option is
	   turned off these suffixes are treated as C++11 user-defined literal numeric suffixes.  This is on by default	 for
	   all	pre-C++11  dialects and all GNU dialects: -std=c++98, -std=gnu++98, -std=gnu++11, -std=gnu++14.	 This option
	   is off by default for ISO C++11 onwards (-std=c++11, ...).

       -nostdinc++
	   Do not search for header files in the standard directories specific	to  C++,  but  do  still  search  the  other
	   standard directories.  (This option is used when building the C++ library.)

       -flang-info-include-translate
       -flang-info-include-translate-not
       -flang-info-include-translate=header
	   Inform  of  include	translation events.  The first will note accepted include translations, the second will note
	   declined include translations.  The header form will inform of include translations	relating  to  that  specific
	   header.   If	 header	 is of the form "user" or "" it will be resolved to a specific user or system header
	   using the include path.

       -flang-info-module-cmi
       -flang-info-module-cmi=module
	   Inform of Compiled Module Interface pathnames.  The first will note all read CMI pathnames.	The module form will
	   not reading a specific module's CMI.	 module may be a named module or a  header-unit	 (the  latter  indicated  by
	   either being a pathname containing directory separators or enclosed in "<>" or "").

       -stdlib=libstdc++,libc++
	   When	 G++  is configured to support this option, it allows specification of alternate C++ runtime libraries.	 Two
	   options are available: libstdc++ (the default, native C++ runtime for G++) and libc++ which is  the	C++  runtime
	   installed on some operating systems (e.g. Darwin versions from Darwin11 onwards).  The option switches G++ to use
	   the	headers	 from  the  specified  library and to emit "-lstdc++" or "-lc++" respectively, when a C++ runtime is
	   required for linking.

       In addition, these warning options have meanings only for C++ programs:

       -Wabi-tag (C++ and Objective-C++ only)
	   Warn when a type with an ABI tag is used in a context that does not have that ABI tag.  See	C++  Attributes	 for
	   more information about ABI tags.

       -Wcomma-subscript (C++ and Objective-C++ only)
	   Warn	 about	uses of a comma expression within a subscripting expression.  This usage was deprecated in C++20 and
	   is going to be removed in C++23.  However, a comma expression wrapped in "( )" is not deprecated.  Example:

		   void f(int *a, int b, int c) {
		       a[b,c];	   // deprecated in C++20, invalid in C++23
		       a[(b,c)];   // OK
		   }

	   In C++23 it is valid to have comma separated expressions in a subscript when an overloaded subscript operator  is
	   found  and  supports the right number and types of arguments.  G++ will accept the formerly valid syntax for code
	   that is not valid in C++23 but used to be valid but deprecated in C++20 with	 a  pedantic  warning  that  can  be
	   disabled with -Wno-comma-subscript.

	   Enabled  by	default	 with -std=c++20 unless -Wno-deprecated, and after -std=c++23 regardless of -Wno-deprecated.
	   Before -std=c++20, enabled with explicit -Wdeprecated.

	   This warning is upgraded to an error by -pedantic-errors in C++23 mode or later.

       -Wctad-maybe-unsupported (C++ and Objective-C++ only)
	   Warn when performing class template argument deduction (CTAD) on a type  with  no  explicitly  written  deduction
	   guides.   This  warning  will  point	 out  cases  where  CTAD succeeded only because the compiler synthesized the
	   implicit deduction guides, which might not be what the programmer intended.	Certain style guides allow CTAD only
	   on types that specifically "opt-in"; i.e., on types that are designed to  support  CTAD.   This  warning  can  be
	   suppressed with the following pattern:

		   struct allow_ctad_t; // any name works
		   template  struct S {
		     S(T) { }
		   };
		   // Guide with incomplete parameter type will never be considered.
		   S(allow_ctad_t) -> S;

       -Wctor-dtor-privacy (C++ and Objective-C++ only)
	   Warn	 when  a  class seems unusable because all the constructors or destructors in that class are private, and it
	   has neither friends nor public static member functions.  Also warn if  there	 are  no  non-private  methods,	 and
	   there's at least one private member function that isn't a constructor or destructor.

       -Wdangling-reference (C++ and Objective-C++ only)
	   Warn when a reference is bound to a temporary whose lifetime has ended.  For example:

		   int n = 1;
		   const int& r = std::max(n - 1, n + 1); // r is dangling

	   In  the  example  above,  two  temporaries  are  created,  one  for	each argument, and a reference to one of the
	   temporaries is returned.  However, both temporaries are destroyed at the end	 of  the  full	expression,  so	 the
	   reference "r" is dangling.  This warning also detects dangling references in member initializer lists:

		   const int& f(const int& i) { return i; }
		   struct S {
		     const int &r; // r is dangling
		     S() : r(f(10)) { }
		   };

	   Member functions are checked as well, but only their object argument:

		   struct S {
		      const S& self () { return *this; }
		   };
		   const S& s = S().self(); // s is dangling

	   Certain  functions  are safe in this respect, for example "std::use_facet": they take and return a reference, but
	   they don't return one of its arguments, which can fool the warning.	Such functions	can  be	 excluded  from	 the
	   warning by wrapping them in a "#pragma":

		   #pragma GCC diagnostic push
		   #pragma GCC diagnostic ignored "-Wdangling-reference"
		   const T& foo (const T&) { ... }
		   #pragma GCC diagnostic pop

	   The	"#pragma"  can	also  surround	the  class;  in	 that  case, the warning will be disabled for all the member
	   functions.

	   -Wdangling-reference also warns about code like

		   auto p = std::minmax(1, 2);

	   where "std::minmax" returns "std::pair", and both references dangle after the end of	 the
	   full expression that contains the call to "std::minmax".

	   The warning does not warn for "std::span"-like classes.  We consider classes of the form:

		   template
		   struct Span {
		     T* data_;
		     std::size len_;
		   };

	   as  "std::span"-like;  that	is,  the  class	 is  a	non-union class that has a pointer data member and a trivial
	   destructor.

	   The warning can be disabled by using the "gnu::no_dangling" attribute.

	   This warning is enabled by -Wextra.

       -Wdelete-non-virtual-dtor (C++ and Objective-C++ only)
	   Warn when "delete" is used to destroy an  instance  of  a  class  that  has	virtual	 functions  and	 non-virtual
	   destructor.	It  is unsafe to delete an instance of a derived class through a pointer to a base class if the base
	   class does not have a virtual destructor.  This warning is enabled by -Wall.

       -Wdeprecated-copy (C++ and Objective-C++ only)
	   Warn that the implicit declaration of a copy constructor or copy assignment operator is deprecated if  the  class
	   has	a  user-provided  copy constructor or copy assignment operator, in C++11 and up.  This warning is enabled by
	   -Wextra.  With -Wdeprecated-copy-dtor, also deprecate if the class has a user-provided destructor.

       -Wno-deprecated-enum-enum-conversion (C++ and Objective-C++ only)
	   Disable the warning about the case when the usual arithmetic conversions are applied on operands where one is  of
	   enumeration type and the other is of a different enumeration type.  This conversion was deprecated in C++20.	 For
	   example:

		   enum E1 { e };
		   enum E2 { f };
		   int k = f - e;

	   -Wdeprecated-enum-enum-conversion is enabled by default with -std=c++20.  In pre-C++20 dialects, this warning can
	   be enabled by -Wenum-conversion or -Wdeprecated.

       -Wno-deprecated-enum-float-conversion (C++ and Objective-C++ only)
	   Disable  the warning about the case when the usual arithmetic conversions are applied on operands where one is of
	   enumeration type and the other is of a floating-point type.	 This  conversion  was	deprecated  in	C++20.	 For
	   example:

		   enum E1 { e };
		   enum E2 { f };
		   bool b = e <= 3.7;

	   -Wdeprecated-enum-float-conversion  is  enabled  by default with -std=c++20.	 In pre-C++20 dialects, this warning
	   can be enabled by -Wenum-conversion or -Wdeprecated.

       -Wdeprecated-literal-operator (C++ and Objective-C++ only)
	   Warn that the declaration of a user-defined literal operator with a space before the suffix is deprecated.	This
	   warning is enabled by default in C++23, or with explicit -Wdeprecated.

		   string operator "" _i18n(const char*, std::size_t); // deprecated
		   string operator ""_i18n(const char*, std::size_t); // preferred

       -Wdeprecated-variadic-comma-omission (C++ and Objective-C++ only)
	   Warn	 that omitting a comma before the varargs "..." at the end of a function parameter list is deprecated.	This
	   warning is enabled by default in C++26, or with explicit -Wdeprecated.

		   void f1(int...); // deprecated
		   void f1(int, ...); // preferred
		   template 
		   void f2(T...); // ok
		   template 
		   void f3(T......); // deprecated

       -Wno-elaborated-enum-base
	   For C++11 and above, warn if an (invalid) additional enum-base is used in an elaborated-type-specifier.  That is,
	   if an enum with given underlying type and no enumerator  list  is  used  in	a  declaration	other  than  just  a
	   standalone  declaration  of	the  enum.   Enabled  by  default.   This  warning  is	upgraded  to  an  error with
	   -pedantic-errors.

       -Wno-init-list-lifetime (C++ and Objective-C++ only)
	   Do not warn about uses of "std::initializer_list" that are likely to result	in  dangling  pointers.	  Since	 the
	   underlying  array  for  an  "initializer_list"  is  handled	like  a	 normal	 C++ temporary object, it is easy to
	   inadvertently keep a pointer to the array past the end of the array's lifetime.  For example:

	   *   If a function returns a temporary "initializer_list", or a local	 "initializer_list"  variable,	the  array's
	       lifetime ends at the end of the return statement, so the value returned has a dangling pointer.

	   *   If  a new-expression creates an "initializer_list", the array only lives until the end of the enclosing full-
	       expression, so the "initializer_list" in the heap has a dangling pointer.

	   *   When an "initializer_list" variable is assigned from a brace-enclosed initializer list, the  temporary  array
	       created	for the right side of the assignment only lives until the end of the full-expression, so at the next
	       statement the "initializer_list" variable has a dangling pointer.

		       // li's initial underlying array lives as long as li
		       std::initializer_list li = { 1,2,3 };
		       // assignment changes li to point to a temporary array
		       li = { 4, 5 };
		       // now the temporary is gone and li has a dangling pointer
		       int i = li.begin()[0] // undefined behavior

	   *   When a list constructor stores the "begin" pointer from the "initializer_list" argument, this doesn't  extend
	       the  lifetime  of  the  array, so if a class variable is constructed from a temporary "initializer_list", the
	       pointer is left dangling by the end of the variable declaration statement.

       -Winvalid-constexpr
	   Warn when a function never produces a constant expression.  In C++20 and earlier, for every "constexpr"  function
	   and	function  template,  there must be at least one set of function arguments in at least one instantiation such
	   that an invocation of the function or constructor  could  be	 an  evaluated	subexpression  of  a  core  constant
	   expression.	 C++23	removed	 this restriction, so it's possible to have a function or a function template marked
	   "constexpr" for which no invocation satisfies the requirements of a core constant expression.

	   This warning is enabled as a pedantic warning by default in C++20 and earlier.  In C++23, -Winvalid-constexpr can
	   be turned on, in which case it will be an ordinary warning.	For example:

		   void f (int& i);
		   constexpr void
		   g (int& i)
		   {
		     // Warns by default in C++20, in C++23 only with -Winvalid-constexpr.
		     f(i);
		   }

       -Winvalid-imported-macros
	   Verify all imported macro definitions are valid at the end of compilation.  This is not enabled by default, as it
	   requires additional processing to determine.	 It may be useful when preparing  sets	of  header-units  to  ensure
	   consistent macros.

       -Wno-literal-suffix (C++ and Objective-C++ only)
	   Do  not  warn  when	a  string  or  character  literal  is  followed	 by a ud-suffix which does not begin with an
	   underscore.	As a conforming extension, GCC treats such suffixes as separate preprocessing  tokens  in  order  to
	   maintain backwards compatibility with code that uses formatting macros from "".	For example:

		   #define __STDC_FORMAT_MACROS
		   #include 
		   #include 

		   int main() {
		     int64_t i64 = 123;
		     printf("My int64: %" PRId64"\n", i64);
		   }

	   In this case, "PRId64" is treated as a separate preprocessing token.

	   This	 option	 also  controls	 warnings  when	 a  user-defined  literal operator is declared with a literal suffix
	   identifier that doesn't begin with an underscore. Literal suffix identifiers that don't begin with an  underscore
	   are reserved for future standardization.

	   These warnings are enabled by default.

       -Wno-narrowing (C++ and Objective-C++ only)
	   For	C++11  and  later standards, narrowing conversions are diagnosed by default, as required by the standard.  A
	   narrowing conversion from a constant produces an error, and a narrowing conversion from a non-constant produces a
	   warning, but -Wno-narrowing suppresses the diagnostic.  Note that this does not affect the meaning of well-formed
	   code; narrowing conversions are still considered ill-formed in SFINAE contexts.

	   With -Wnarrowing in C++98, warn when a narrowing conversion prohibited by C++11 occurs within { }, e.g.

		   int i = { 2.2 }; // error: narrowing from double to int

	   This flag is included in -Wall and -Wc++11-compat.

       -Wnoexcept (C++ and Objective-C++ only)
	   Warn when a noexcept-expression evaluates to false because of a call to a function that  does  not  have  a	non-
	   throwing  exception	specification  (i.e.  throw()  or "noexcept") but is known by the compiler to never throw an
	   exception.

       -Wnoexcept-type (C++ and Objective-C++ only)
	   Warn if the C++17 feature making "noexcept" part of a function type changes the mangled name of a symbol relative
	   to C++14.  Enabled by -Wabi and -Wc++17-compat.

	   As an example:

		   template  void f(T t) { t(); };
		   void g() noexcept;
		   void h() { f(g); }

	   In C++14, "f" calls "f", but in C++17 it calls "f".

       -Wclass-memaccess (C++ and Objective-C++ only)
	   Warn when the destination of a call to a raw memory function such as "memset" or "memcpy" is an object  of  class
	   type,  and  when  writing  into  such an object might bypass the class non-trivial or deleted constructor or copy
	   assignment, violate const-correctness or  encapsulation,  or	 corrupt  virtual  table  pointers.   Modifying	 the
	   representation  of such objects may violate invariants maintained by member functions of the class.	For example,
	   the call to "memset" below is undefined because it  modifies	 a  non-trivial	 class	object	and  is,  therefore,
	   diagnosed.	The  safe  way	to  either  initialize or clear the storage of objects of such types is by using the
	   appropriate constructor or assignment operator, if one is available.

		   std::string str = "abc";
		   memset (&str, 0, sizeof str);

	   The -Wclass-memaccess option is enabled by -Wall.  Explicitly casting the pointer to the class object to "void *"
	   or to a type that can be safely accessed by the raw memory function suppresses the warning.

       -Wnon-virtual-dtor (C++ and Objective-C++ only)
	   Warn when a class has virtual functions and an accessible non-virtual  destructor  itself  or  in  an  accessible
	   polymorphic	base class, in which case it is possible but unsafe to delete an instance of a derived class through
	   a pointer to the class itself or base class.	 This warning is automatically enabled	if  -Weffc++  is  specified.
	   The	-Wdelete-non-virtual-dtor  option  (enabled  by -Wall) should be preferred because it warns about the unsafe
	   cases without false positives.

       -Wregister (C++ and Objective-C++ only)
	   Warn on uses of the "register" storage class specifier, except when it is  part  of	the  GNU  Explicit  Register
	   Variables  extension.   The use of the "register" keyword as storage class specifier has been deprecated in C++11
	   and removed in C++17.  Enabled by default with -std=c++17.

       -Wreorder (C++ and Objective-C++ only)
	   Warn when the order of member initializers given in the code does not match the  order  in  which  they  must  be
	   executed.  For instance:

		   struct A {
		     int i;
		     int j;
		     A(): j (0), i (1) { }
		   };

	   The	compiler  rearranges  the member initializers for "i" and "j" to match the declaration order of the members,
	   emitting a warning to that effect.  This warning is enabled by -Wall.

       -Wno-pessimizing-move (C++ and Objective-C++ only)
	   This warning warns when a call to "std::move" prevents copy elision.	 A typical scenario when  copy	elision	 can
	   occur is when returning in a function with a class return type, when the expression being returned is the name of
	   a  non-volatile  automatic  object, and is not a function parameter, and has the same type as the function return
	   type.

		   struct T {
		   ...
		   };
		   T fn()
		   {
		     T t;
		     ...
		     return std::move (t);
		   }

	   But in this example, the "std::move" call prevents copy elision.

	   This warning is enabled by -Wall.

       -Wno-redundant-move (C++ and Objective-C++ only)
	   This warning warns about redundant calls to "std::move"; that is, when a move operation would have been performed
	   even without the "std::move" call.  This happens because the compiler is forced to treat the object as if it were
	   an rvalue in certain situations such as  returning  a  local	 variable,  where  copy	 elision  isn't	 applicable.
	   Consider:

		   struct T {
		   ...
		   };
		   T fn(T t)
		   {
		     ...
		     return std::move (t);
		   }

	   Here, the "std::move" call is redundant.  Because G++ implements Core Issue 1579, another example is:

		   struct T { // convertible to U
		   ...
		   };
		   struct U {
		   ...
		   };
		   U fn()
		   {
		     T t;
		     ...
		     return std::move (t);
		   }

	   In this example, copy elision isn't applicable because the type of the expression being returned and the function
	   return type differ, yet G++ treats the return value as if it were designated by an rvalue.

	   This warning is enabled by -Wextra.

       -Wrange-loop-construct (C++ and Objective-C++ only)
	   This	 warning  warns	 when  a C++ range-based for-loop is creating an unnecessary copy.  This can happen when the
	   range declaration is not a reference, but probably should be.  For example:

		   struct S { char arr[128]; };
		   void fn () {
		     S arr[5];
		     for (const auto x : arr) { ... }
		   }

	   It does not warn when the type being copied is a trivially-copyable type whose size is less than 64 bytes.

	   This warning also warns when a loop variable in a range-based for-loop is initialized with a value of a different
	   type resulting in a copy.  For example:

		   void fn() {
		     int arr[10];
		     for (const double &x : arr) { ... }
		   }

	   In the example above, in every iteration of the loop a temporary value of type "double" is created and destroyed,
	   to which the reference "const double &" is bound.

	   This warning is enabled by -Wall.

       -Wredundant-tags (C++ and Objective-C++ only)
	   Warn about redundant class-key and enum-key in references to class types and enumerated types in  contexts  where
	   the key can be eliminated without causing an ambiguity.  For example:

		   struct foo;
		   struct foo *p;   // warn that keyword struct can be eliminated

	   On the other hand, in this example there is no warning:

		   struct foo;
		   void foo ();	  // "hides" struct foo
		   void bar (struct foo&);  // no warning, keyword struct is necessary

       -Wno-subobject-linkage (C++ and Objective-C++ only)
	   Do  not  warn  if a class type has a base or a field whose type uses the anonymous namespace or depends on a type
	   with no linkage.  If a type A depends on a  type  B	with  no  or  internal	linkage,  defining  it	in  multiple
	   translation units would be an ODR violation because the meaning of B is different in each translation unit.	If A
	   only	 appears in a single translation unit, the best way to silence the warning is to give it internal linkage by
	   putting it in an anonymous namespace as well.  The compiler doesn't give this warning for types  defined  in	 the
	   main .C file, as those are unlikely to have multiple definitions.  -Wsubobject-linkage is enabled by default.

       -Weffc++ (C++ and Objective-C++ only)
	   Warn about violations of the following style guidelines from Scott Meyers' Effective C++ series of books:

	   *   Define a copy constructor and an assignment operator for classes with dynamically-allocated memory.

	   *   Prefer initialization to assignment in constructors.

	   *   Have "operator=" return a reference to *this.

	   *   Don't try to return a reference when you must return an object.

	   *   Distinguish between prefix and postfix forms of increment and decrement operators.

	   *   Never overload "&&", "||", or ",".

	   This	 option	 also  enables -Wnon-virtual-dtor, which is also one of the effective C++ recommendations.  However,
	   the check is extended to warn about the lack of virtual destructor in accessible  non-polymorphic  bases  classes
	   too.

	   When	 selecting  this option, be aware that the standard library headers do not obey all of these guidelines; use
	   grep -v to filter out those warnings.

       -Wno-exceptions (C++ and Objective-C++ only)
	   Disable the warning about the case when an exception handler is shadowed by another handler, which can point	 out
	   a wrong ordering of exception handlers.

       -Wstrict-null-sentinel (C++ and Objective-C++ only)
	   Warn	 about the use of an uncasted "NULL" as sentinel.  When compiling only with GCC this is a valid sentinel, as
	   "NULL" is defined to "__null".  Although it is a null  pointer  constant  rather  than  a  null  pointer,  it  is
	   guaranteed to be of the same size as a pointer.  But this use is not portable across different compilers.

       -Wno-non-template-friend (C++ and Objective-C++ only)
	   Disable  warnings when non-template friend functions are declared within a template.	 In very old versions of GCC
	   that predate implementation of the ISO standard, declarations such as friend int foo(int), where the name of	 the
	   friend  is  an  unqualified-id,  could  be interpreted as a particular specialization of a template function; the
	   warning exists to diagnose compatibility problems, and is enabled by default.

       -Wold-style-cast (C++ and Objective-C++ only)
	   Warn if an old-style (C-style) cast to a non-void type is  used  within  a  C++  program.   The  new-style  casts
	   ("dynamic_cast",  "static_cast",  "reinterpret_cast", and "const_cast") are less vulnerable to unintended effects
	   and much easier to search for.

       -Woverloaded-virtual (C++ and Objective-C++ only)
       -Woverloaded-virtual=n
	   Warn when a function declaration hides virtual functions from a base class.	For example, in:

		   struct A {
		     virtual void f();
		   };

		   struct B: public A {
		     void f(int); // does not override
		   };

	   the "A" class version of "f" is hidden in "B", and code like:

		   B* b;
		   b->f();

	   fails to compile.

	   In cases where the different signatures are not an accident, the simplest solution is to add a  using-declaration
	   to the derived class to un-hide the base function, e.g. add "using A::f;" to "B".

	   The	optional  level suffix controls the behavior when all the declarations in the derived class override virtual
	   functions in the base class, even if not all of the base functions are overridden:

		   struct C {
		     virtual void f();
		     virtual void f(int);
		   };

		   struct D: public C {
		     void f(int); // does override
		   }

	   This pattern is less likely to be a mistake; if D is only used virtually, the user might have  decided  that	 the
	   base class semantics for some of the overloads are fine.

	   At level 1, this case does not warn; at level 2, it does.  -Woverloaded-virtual by itself selects level 2.  Level
	   1 is included in -Wall.

       -Wno-pmf-conversions (C++ and Objective-C++ only)
	   Disable the diagnostic for converting a bound pointer to member function to a plain pointer.

       -Wsign-promo (C++ and Objective-C++ only)
	   Warn	 when  overload	 resolution  chooses  a	 promotion from unsigned or enumerated type to a signed type, over a
	   conversion to an unsigned type of the same size.  Previous versions of G++ tried to	preserve  unsignedness,	 but
	   the standard mandates the current behavior.

       -Wtemplates (C++ and Objective-C++ only)
	   Warn	 when  a primary template declaration is encountered.  Some coding rules disallow templates, and this may be
	   used to enforce that rule.  The warning is inactive inside a system header file, such as  the  STL,	so  one	 can
	   still use the STL.  One may also instantiate or specialize templates.

       -Wmismatched-new-delete (C++ and Objective-C++ only)
	   Warn	 for  mismatches  between  calls  to  "operator	 new" or "operator delete" and the corresponding call to the
	   allocation or deallocation function.	 This includes invocations of C++ "operator delete" with  pointers  returned
	   from	 either	 mismatched  forms  of	"operator  new", or from other functions that allocate objects for which the
	   "operator delete" isn't a suitable deallocator, as well as calls to other deallocation  functions  with  pointers
	   returned from "operator new" for which the deallocation function isn't suitable.

	   For	example,  the "delete" expression in the function below is diagnosed because it doesn't match the array form
	   of the "new" expression the pointer argument was returned from.  Similarly, the call to "free" is also diagnosed.

		   void f ()
		   {
		     int *a = new int[n];
		     delete a;	 // warning: mismatch in array forms of expressions

		     char *p = new char[n];
		     free (p);	 // warning: mismatch between new and free
		   }

	   The related option -Wmismatched-dealloc diagnoses mismatches	 involving  allocation	and  deallocation  functions
	   other than "operator new" and "operator delete".

	   -Wmismatched-new-delete is included in -Wall.

       -Wmismatched-tags (C++ and Objective-C++ only)
	   Warn	 for  declarations  of structs, classes, and class templates and their specializations with a class-key that
	   does not match either the definition or the first declaration if no definition is provided.

	   For example, the declaration of "struct Object" in the argument list of "draw" triggers the	warning.   To  avoid
	   it, either remove the redundant class-key "struct" or replace it with "class" to match its definition.

		   class Object {
		   public:
		     virtual ~Object () = 0;
		   };
		   void draw (struct Object*);

	   It is not wrong to declare a class with the class-key "struct" as the example above shows.  The -Wmismatched-tags
	   option  is  intended	 to  help  achieve a consistent style of class declarations.  In code that is intended to be
	   portable to Windows-based compilers the warning helps prevent unresolved references due to the difference in	 the
	   mangling  of	 symbols  declared  with  different  class-keys.   The	option	can  be used either on its own or in
	   conjunction with -Wredundant-tags.

       -Wmultiple-inheritance (C++ and Objective-C++ only)
	   Warn when a class is defined with multiple direct base classes.  Some coding rules disallow multiple inheritance,
	   and this may be used to enforce that rule.  The warning is inactive inside a system header file, such as the STL,
	   so one can still use the STL.  One may also define classes that indirectly use multiple inheritance.

       -Wvirtual-inheritance
	   Warn when a class is defined with a virtual direct base class.  Some coding rules disallow multiple	inheritance,
	   and this may be used to enforce that rule.  The warning is inactive inside a system header file, such as the STL,
	   so one can still use the STL.  One may also define classes that indirectly use virtual inheritance.

       -Wno-virtual-move-assign
	   Suppress  warnings  about inheriting from a virtual base with a non-trivial C++11 move assignment operator.	This
	   is dangerous because if the virtual base is reachable along more than one path, it is moved multiple times, which
	   can mean both objects end up in the moved-from state.  If the move assignment operator is written to avoid moving
	   from a moved-from object, this warning can be disabled.

       -Wnamespaces
	   Warn when a namespace definition is opened.	Some coding rules disallow namespaces,	and  this  may	be  used  to
	   enforce  that  rule.	  The warning is inactive inside a system header file, such as the STL, so one can still use
	   the STL.  One may also use using directives and qualified names.

       -Wno-template-body (C++ and Objective-C++ only)
	   Disable diagnosing errors when parsing a template, and instead issue an error  only	upon  instantiation  of	 the
	   template.  This flag can also be used to downgrade such errors into warnings with Wno-error= or -fpermissive.

       -Wno-template-id-cdtor (C++ and Objective-C++ only)
	   Disable  the	 warning  about	 the  use of simple-template-id as the declarator-id of a constructor or destructor,
	   which became invalid in C++20 via DR 2237.  For example:

		   template struct S {
		     S(); // should be S();
		     ~S();  // should be ~S();
		   };

	   -Wtemplate-id-cdtor is enabled by default with -std=c++20; it is also enabled by -Wc++20-compat.

       -Wtemplate-names-tu-local
	   Warn when a template body hides an exposure of a translation-unit-local entity.  In most cases,  referring  to  a
	   translation-unit-local  entity  (such as an internal linkage declaration) within an entity that is emitted into a
	   module's CMI is an error.  However, within the initializer of  a  variable,	or  in	the  body  of  a  non-inline
	   function, this is not an exposure and no error is emitted.

	   This	 can  cause variable or function templates to accidentally become unusable if they reference such an entity,
	   because other translation units that import the template will never be able	to  instantiate	 it.   This  warning
	   attempts to detect cases where this might occur.  The presence of an explicit instantiation silences the warning.

	   This flag is enabled by -Wextra.

       -Wno-terminate (C++ and Objective-C++ only)
	   Disable the warning about a throw-expression that will immediately result in a call to "terminate".

       -Wno-vexing-parse (C++ and Objective-C++ only)
	   Warn about the most vexing parse syntactic ambiguity.  This warns about the cases when a declaration looks like a
	   variable definition, but the C++ language requires it to be interpreted as a function declaration.  For instance:

		   void f(double a) {
		     int i();	     // extern int i (void);
		     int n(int(a));  // extern int n (int);
		   }

	   Another example:

		   struct S { S(int); };
		   void f(double a) {
		     S x(int(a));   // extern struct S x (int);
		     S y(int());    // extern struct S y (int (*) (void));
		     S z();	    // extern struct S z (void);
		   }

	   The	warning	 will  suggest	options	 how  to  deal	with  such  an	ambiguity; e.g., it can suggest removing the
	   parentheses or using braces instead.

	   This warning is enabled by default.

       -Wno-class-conversion (C++ and Objective-C++ only)
	   Do not warn when a conversion function converts an object to the same type, to a base class of that type,  or  to
	   void; such a conversion function will never be called.

       -Wvolatile (C++ and Objective-C++ only)
	   Warn	 about	deprecated  uses  of  the  "volatile"  qualifier.   This  includes  postfix and prefix "++" and "--"
	   expressions	of  "volatile"-qualified  types,  using	 simple	 assignments   where   the   left   operand   is   a
	   "volatile"-qualified	 non-class  type  for  their  value,  compound	assignments  where  the	 left  operand	is a
	   "volatile"-qualified non-class type, "volatile"-qualified function return  type,  "volatile"-qualified  parameter
	   type, and structured bindings of a "volatile"-qualified type.  This usage was deprecated in C++20.

	   Enabled by default with -std=c++20.	Before -std=c++20, enabled with explicit -Wdeprecated.

       -Waligned-new
	   Warn about a new-expression of a type that requires greater alignment than the alignof(std::max_align_t) but uses
	   an allocation function without an explicit alignment parameter. This option is enabled by -Wall.

	   Normally  this  only warns about global allocation functions, but -Waligned-new=all also warns about class member
	   allocation functions.

       -Wno-placement-new
       -Wplacement-new=n
	   Warn about placement new expressions with undefined behavior, such as constructing an object in a buffer that  is
	   smaller  than  the  type  of the object.  For example, the placement new expression below is diagnosed because it
	   attempts to construct an array of 64 integers in a buffer only 64 bytes large.

		   char buf [64];
		   new (buf) int[64];

	   This warning is enabled by default.

	   -Wplacement-new=1
	       This is the default warning level of -Wplacement-new.  At this level the	 warning  is  not  issued  for	some
	       strictly undefined constructs that GCC allows as extensions for compatibility with legacy code.	For example,
	       the following "new" expression is not diagnosed at this level even though it has undefined behavior according
	       to the C++ standard because it writes past the end of the one-element array.

		       struct S { int n, a[1]; };
		       S *s = (S *)malloc (sizeof *s + 31 * sizeof s->a[0]);
		       new (s->a)int [32]();

	   -Wplacement-new=2
	       At  this	 level, in addition to diagnosing all the same constructs as at level 1, a diagnostic is also issued
	       for placement new expressions that construct an object in the last member of structure whose type is an array
	       of a single element and whose size is less than the size of the object being constructed.  While the previous
	       example would be diagnosed, the following construct makes use of the flexible member array extension to avoid
	       the warning at level 2.

		       struct S { int n, a[]; };
		       S *s = (S *)malloc (sizeof *s + 32 * sizeof s->a[0]);
		       new (s->a)int [32]();

       -Wcatch-value
       -Wcatch-value=n (C++ and Objective-C++ only)
	   Warn about catch handlers that do not catch via reference.  With -Wcatch-value=1  (or  -Wcatch-value	 for  short)
	   warn	 about	polymorphic  class  types that are caught by value.  With -Wcatch-value=2 warn about all class types
	   that are caught by value.  With  -Wcatch-value=3  warn  about  all  types  that  are	 not  caught  by  reference.
	   -Wcatch-value is enabled by -Wall.

       -Wconditionally-supported (C++ and Objective-C++ only)
	   Warn for conditionally-supported (C++11 [intro.defs]) constructs.

       -Wno-defaulted-function-deleted (C++ and Objective-C++ only)
	   Warn	 when  an  explicitly  defaulted  function  is	deleted by the compiler.  That can occur when the function's
	   declared type does not match the type of the function that would have been implicitly declared.  This warning  is
	   enabled by default.

       -Wno-delete-incomplete (C++ and Objective-C++ only)
	   Do  not  warn  when	deleting  a pointer to incomplete type, which may cause undefined behavior at runtime.	This
	   warning is enabled by default.

       -Wextra-semi (C++, Objective-C++ only)
	   Warn about redundant semicolons.  There are various contexts in which an extra semicolon can	 occur.	  One  is  a
	   semicolon after in-class function definitions, which is valid in all C++ dialects (and is never a pedwarn):

		   struct S {
		     void foo () {};
		   };

	   Another  is	an extra semicolon at namespace scope, which has been allowed since C++11 (therefore is a pedwarn in
	   C++98):

		   struct S {
		   };
		   ;

	   And yet another is an extra semicolon in class definitions, which has been allowed since C++11  (therefore  is  a
	   pedwarn in C++98):

		   struct S {
		     int a;
		     ;
		   };

       -Wno-global-module (C++ and Objective-C++ only)
	   Disable the diagnostic for when the global module fragment of a module unit does not consist only of preprocessor
	   directives.

       -Wno-inaccessible-base (C++, Objective-C++ only)
	   This option controls warnings when a base class is inaccessible in a class derived from it due to ambiguity.	 The
	   warning  is	enabled	 by  default.	Note  that the warning for ambiguous virtual bases is enabled by the -Wextra
	   option.

		   struct A { int a; };

		   struct B : A { };

		   struct C : B, A { };

       -Wno-inherited-variadic-ctor
	   Suppress warnings about use of C++11 inheriting constructors when the base class inherited from has a C  variadic
	   constructor; the warning is on by default because the ellipsis is not inherited.

       -Wno-invalid-offsetof (C++ and Objective-C++ only)
	   Suppress  warnings from applying the "offsetof" macro to a non-POD type.  According to the 2014 ISO C++ standard,
	   applying "offsetof" to a non-standard-layout type  is  undefined.   In  existing  C++  implementations,  however,
	   "offsetof"  typically  gives	 meaningful  results.	This  flag  is for users who are aware that they are writing
	   nonportable code and who have deliberately chosen to ignore the warning about it.

	   The restrictions on "offsetof" may be relaxed in a future version of the C++ standard.

       -Wsized-deallocation (C++ and Objective-C++ only)
	   Warn about a definition of an unsized deallocation function

		   void operator delete (void *) noexcept;
		   void operator delete[] (void *) noexcept;

	   without a definition of the corresponding sized deallocation function

		   void operator delete (void *, std::size_t) noexcept;
		   void operator delete[] (void *, std::size_t) noexcept;

	   or vice versa.  Enabled by -Wextra along with -fsized-deallocation.

       -Wsuggest-final-types
	   Warn about types with virtual methods where code quality would be improved if the type  were	 declared  with	 the
	   C++11  "final"  specifier,  or,  if	possible,  declared  in	 an  anonymous	namespace.  This  allows GCC to more
	   aggressively devirtualize the polymorphic calls. This warning is  more  effective  with  link-time  optimization,
	   where the information about the class hierarchy graph is more complete.

       -Wsuggest-final-methods
	   Warn	 about	virtual	 methods  where	 code  quality	would be improved if the method were declared with the C++11
	   "final" specifier, or, if possible, its type were  declared	in  an	anonymous  namespace  or  with	the  "final"
	   specifier.	This  warning  is  more effective with link-time optimization, where the information about the class
	   hierarchy graph is more complete. It is recommended to first consider suggestions  of  -Wsuggest-final-types	 and
	   then rebuild with new annotations.

       -Wsuggest-override
	   Warn about overriding virtual functions that are not marked with the "override" keyword.

       -Wno-conversion-null (C++ and Objective-C++ only)
	   Do not warn for conversions between "NULL" and non-pointer types. -Wconversion-null is enabled by default.

   Options Controlling Objective-C and Objective-C++ Dialects
       (NOTE: This manual does not describe the Objective-C and Objective-C++ languages themselves.

       This  section describes the command-line options that are only meaningful for Objective-C and Objective-C++ programs.
       You can also use most of the language-independent GNU compiler options.	 For  example,	you  might  compile  a	file
       some_class.m like this:

	       gcc -g -fgnu-runtime -O -c some_class.m

       In  this	 example,  -fgnu-runtime is an option meant only for Objective-C and Objective-C++ programs; you can use the
       other options with any language supported by GCC.

       Note that since Objective-C is an extension of the C language, Objective-C compilations may also use options specific
       to the C front-end (e.g., -Wtraditional).  Similarly, Objective-C++ compilations may use C++-specific options  (e.g.,
       -Wabi).

       Here is a list of options that are only for compiling Objective-C and Objective-C++ programs:

       -fconstant-string-class=class-name
	   Use	class-name  as	the  name  of  the  class  to  instantiate for each literal string specified with the syntax
	   "@"..."".  The default class name is "NXConstantString" if the GNU runtime is being used, and  "NSConstantString"
	   if  the NeXT runtime is being used (see below).  On Darwin / macOS platforms, the -fconstant-cfstrings option, if
	   also present, overrides the -fconstant-string-class setting and  cause  "@"...""  literals  to  be  laid  out  as
	   constant   CoreFoundation   strings.	  Note	that  -fconstant-cfstrings  is	an  alias  for	the  target-specific
	   -mconstant-cfstrings equivalent.

       -fgnu-runtime
	   Generate object code compatible with the standard GNU Objective-C runtime.  This is the default for most types of
	   systems.

       -fnext-runtime
	   Generate output compatible with the NeXT runtime.  This is the default for NeXT-based systems, including Darwin /
	   macOS.  The macro "__NEXT_RUNTIME__" is predefined if (and only if) this option is used.

       -fno-nil-receivers
	   Assume that all Objective-C message dispatches ("[receiver message:arg]") in this translation  unit	ensure	that
	   the	receiver  is not "nil".	 This allows for more efficient entry points in the runtime to be used.	 This option
	   is only available in conjunction with the NeXT runtime and ABI version 0 or 1.

       -fobjc-abi-version=n
	   Use version n of the Objective-C ABI for the selected runtime.  This option is currently supported only  for	 the
	   NeXT	 runtime.   In that case, Version 0 is the traditional (32-bit) ABI without support for properties and other
	   Objective-C 2.0 additions.  Version 1 is the traditional (32-bit) ABI  with	support	 for  properties  and  other
	   Objective-C	2.0  additions.	  Version  2  is  the  modern (64-bit) ABI.  If nothing is specified, the default is
	   Version 0 on 32-bit target machines, and Version 2 on 64-bit target machines.

       -fobjc-call-cxx-cdtors
	   For each Objective-C class, check if any of its instance variables is a C++ object  with  a	non-trivial  default
	   constructor.	  If so, synthesize a special "- (id) .cxx_construct" instance method which runs non-trivial default
	   constructors on any such instance variables, in order, and then return "self".  Similarly, check if any  instance
	   variable  is a C++ object with a non-trivial destructor, and if so, synthesize a special "- (void) .cxx_destruct"
	   method which runs all such default destructors, in reverse order.

	   The "- (id) .cxx_construct" and "- (void) .cxx_destruct"  methods  thusly  generated	 only  operate	on  instance
	   variables  declared	in  the	 current  Objective-C  class,  and not those inherited from superclasses.  It is the
	   responsibility of the Objective-C runtime to invoke all such methods in an object's inheritance  hierarchy.	 The
	   "-  (id) .cxx_construct" methods are invoked by the runtime immediately after a new object instance is allocated;
	   the "- (void) .cxx_destruct" methods are invoked immediately before the runtime deallocates an object instance.

	   As of this writing, only the NeXT runtime on Mac OS X 10.4 and  later  has  support	for  invoking  the  "-	(id)
	   .cxx_construct" and "- (void) .cxx_destruct" methods.

       -fobjc-direct-dispatch
	   Allow fast jumps to the message dispatcher.	On Darwin this is accomplished via the comm page.

       -fobjc-exceptions
	   Enable  syntactic  support  for  structured exception handling in Objective-C, similar to what is offered by C++.
	   This option is required to use the Objective-C keywords @try, @throw, @catch, @finally and  @synchronized.	This
	   option  is  available  with	both the GNU runtime and the NeXT runtime (but not available in conjunction with the
	   NeXT runtime on Mac OS X 10.2 and earlier).

       -fobjc-gc
	   Enable garbage collection (GC) in Objective-C and Objective-C++ programs.  This option is only available with the
	   NeXT runtime; the GNU runtime has a different garbage collection implementation that	 does  not  require  special
	   compiler flags.

       -fobjc-nilcheck
	   For	the  NeXT runtime with version 2 of the ABI, check for a nil receiver in method invocations before doing the
	   actual method call.	This is the default and can be disabled using -fno-objc-nilcheck.  Class methods  and  super
	   calls are never checked for nil in this way no matter what this flag is set to.  Currently this flag does nothing
	   when the GNU runtime, or an older version of the NeXT runtime ABI, is used.

       -fobjc-std=objc1
	   Conform  to	the  language  syntax of Objective-C 1.0, the language recognized by GCC 4.0.  This only affects the
	   Objective-C additions to the C/C++ language; it  does  not  affect  conformance  to	C/C++  standards,  which  is
	   controlled  by  the	separate  C/C++	 dialect  option  flags.   When	 this option is used with the Objective-C or
	   Objective-C++ compiler, any Objective-C syntax that is not recognized by GCC 4.0 is rejected.  This is useful  if
	   you need to make sure that your Objective-C code can be compiled with older versions of GCC.

       -freplace-objc-classes
	   Emit a special marker instructing ld(1) not to statically link in the resulting object file, and allow dyld(1) to
	   load	 it in at run time instead.  This is used in conjunction with the Fix-and-Continue debugging mode, where the
	   object file in question may be recompiled and dynamically reloaded in the course of	program	 execution,  without
	   the	need  to  restart  the	program	 itself.   Currently,  Fix-and-Continue	 functionality	is only available in
	   conjunction with the NeXT runtime on Mac OS X 10.3 and later.

       -fzero-link
	   When compiling for the NeXT runtime, the compiler ordinarily replaces calls	to  objc_getClass("...")  (when	 the
	   name of the class is known at compile time) with static class references that get initialized at load time, which
	   improves  run-time  performance.   Specifying  the  -fzero-link flag suppresses this behavior and causes calls to
	   objc_getClass("...")	 to be retained.  This is useful in Zero-Link debugging mode, since it allows for individual
	   class implementations to be modified during program execution.  The GNU runtime currently always retains calls to
	   objc_get_class("...")  regardless of command-line options.

       -fno-local-ivars
	   By default instance variables in Objective-C can be accessed as if they were	 local	variables  from	 within	 the
	   methods  of	the  class  they're  declared  in.   This can lead to shadowing between instance variables and other
	   variables declared either locally inside a  class  method  or  globally  with  the  same  name.   Specifying	 the
	   -fno-local-ivars flag disables this behavior thus avoiding variable shadowing issues.

       -fivar-visibility=[public|protected|private|package]
	   Set	the default instance variable visibility to the specified option so that instance variables declared outside
	   the scope of any access modifier directives default to the specified visibility.

       -gen-decls
	   Dump interface declarations for all classes seen in the source file to a file named sourcename.decl.

       -Wassign-intercept (Objective-C and Objective-C++ only)
	   Warn whenever an Objective-C assignment is being intercepted by the garbage collector.

       -Wno-property-assign-default (Objective-C and Objective-C++ only)
	   Do not warn if a property for an Objective-C object has no assign semantics specified.

       -Wno-protocol (Objective-C and Objective-C++ only)
	   If a class is declared to implement a protocol, a warning is issued for every method in the protocol that is	 not
	   implemented by the class.  The default behavior is to issue a warning for every method not explicitly implemented
	   in  the  class,  even  if a method implementation is inherited from the superclass.	If you use the -Wno-protocol
	   option, then methods inherited from the superclass are considered to be implemented, and no warning is issued for
	   them.

       -Wobjc-root-class (Objective-C and Objective-C++ only)
	   Warn if a class interface lacks a superclass. Most  classes	will  inherit  from  "NSObject"	 (or  "Object")	 for
	   example.   When  declaring  classes	intended  to be root classes, the warning can be suppressed by marking their
	   interfaces with "__attribute__((objc_root_class))".

       -Wselector (Objective-C and Objective-C++ only)
	   Warn if multiple methods of different types for the same selector are found during  compilation.   The  check  is
	   performed  on the list of methods in the final stage of compilation.	 Additionally, a check is performed for each
	   selector appearing in a @selector(...)  expression, and a corresponding method for that selector has	 been  found
	   during  compilation.	  Because  these checks scan the method table only at the end of compilation, these warnings
	   are not produced if the final stage of compilation is not reached, for example because an error is  found  during
	   compilation, or because the -fsyntax-only option is being used.

       -Wstrict-selector-match (Objective-C and Objective-C++ only)
	   Warn	 if  multiple  methods	with  differing	 argument  and/or  return  types are found for a given selector when
	   attempting to send a message using this selector to a receiver of type "id" or "Class".  When this  flag  is	 off
	   (which  is the default behavior), the compiler omits such warnings if any differences found are confined to types
	   that share the same size and alignment.

       -Wundeclared-selector (Objective-C and Objective-C++ only)
	   Warn if a @selector(...) expression referring to an undeclared selector  is	found.	 A  selector  is  considered
	   undeclared  if no method with that name has been declared before the @selector(...) expression, either explicitly
	   in an @interface or @protocol declaration, or implicitly in	an  @implementation  section.	This  option  always
	   performs its checks as soon as a @selector(...) expression is found, while -Wselector only performs its checks in
	   the	final  stage of compilation.  This also enforces the coding style convention that methods and selectors must
	   be declared before being used.

       -print-objc-runtime-info
	   Generate C header describing the largest structure that is passed by value, if any.

   Options Controlling OpenMP and OpenACC
       GCC supports OpenMP extensions to the C, C++, and Fortran languages with the  -fopenmp  option.	 Similarly,  OpenACC
       extensions are supported in all three languages with -fopenacc.

       -foffload=disable
       -foffload=default
       -foffload=target-list
	   Specify  for which OpenMP and OpenACC offload targets code should be generated.  The default behavior, equivalent
	   to -foffload=default, is to generate	 code  for  all	 supported  offload  targets.	The  -foffload=disable	form
	   generates  code  only  for  the  host fallback, while -foffload=target-list generates code only for the specified
	   comma-separated list of offload targets.

	   Offload targets are specified in GCC's internal target-triplet format. You can run the compiler with -v  to	show
	   the list of configured offload targets under "OFFLOAD_TARGET_NAMES".

       -foffload-options=options
       -foffload-options=target-triplet-list=options
	   With	 -foffload-options=options,  GCC  passes  the  specified options to the compilers for all enabled offloading
	   targets.   You  can	specify	 options  that	apply  only  to	 a  specific  target  or  targets   by	 using	 the
	   -foffload-options=target-list=options  form.	 The target-list is a comma-separated list in the same format as for
	   the -foffload= option.

	   Typical command lines are

		   -foffload-options='-fno-math-errno -ffinite-math-only' \
			   -foffload-options=nvptx-none=-latomic
		   -foffload-options=amdgcn-amdhsa=-march=gfx906

       -fopenacc
	   Enable handling of OpenACC directives #pragma acc in C/C++ and !$acc in free-form Fortran and  !$acc,  c$acc	 and
	   *$acc  in  fixed-form  Fortran.   This  option  implies -pthread, and thus is only supported on targets that have
	   support for -pthread.

       -fopenacc-dim=geom
	   Specify default compute dimensions for parallel offload regions that do not explicitly specify  them.   The	geom
	   value  is  a	 triple	 of  :-separated  sizes, in order gang, worker, and vector.  A size can be omitted, to use a
	   target-specific default value.

       -fopenmp
	   Enable  handling  of	 OpenMP	  directives   #pragma	 omp,	[[omp::directive(...)]],   [[omp::decl(...)]],	 and
	   [[omp::sequence(...)]]  in  C/C++.  In Fortran, it enables !$omp and the conditional compilation sentinel !$.  In
	   fixed source form Fortran, the sentinels can also start with c or *.

	   This option implies -pthread, and thus is only supported on targets that  have  support  for	 -pthread.  -fopenmp
	   implies -fopenmp-simd.

       -fopenmp-simd
	   Enable  handling  of OpenMP's "simd", "declare simd", "declare reduction", "assume", "ordered", "scan" and "loop"
	   directive,  and  of	combined  or  composite	 directives  with  "simd"  as  constituent   with   "#pragma   omp",
	   "[[omp::directive(...)]]", "[[omp::sequence(...)]]" and "[[omp::decl(...)]]" in C/C++ and "!$omp" in Fortran.  It
	   additionally	 enables  the  conditional  compilation	 sentinel  !$ in Fortran.  In fixed source form Fortran, the
	   sentinels can also start with c or *.  Other OpenMP directives are  ignored.	  Unless  -fopenmp  is	additionally
	   specified, the "loop" region binds to the current task region, independent of the specified "bind" clause.

       -fopenmp-target-simd-clone
       -fopenmp-target-simd-clone=device-type
	   In  addition to generating SIMD clones for functions marked with the "declare simd" directive, GCC also generates
	   clones for functions marked with the OpenMP "declare target" directive that are suitable for	 vectorization	when
	   this option is in effect.  The device-type may be one of "none", "host", "nohost", and "any", which correspond to
	   keywords  for  the  "device_type"  clause  of  the  "declare	 target"  directive;  clones  are  generated for the
	   intersection of devices specified.  -fopenmp-target-simd-clone is  equivalent  to  -fopenmp-target-simd-clone=any
	   and -fno-openmp-target-simd-clone is equivalent to -fopenmp-target-simd-clone=none.

	   At -O2 and higher (but not -Os or -Og) this optimization defaults to -fopenmp-target-simd-clone=nohost; otherwise
	   it is disabled by default.

   Options to Control Diagnostic Messages Formatting
       Traditionally,  diagnostic  messages  have been formatted irrespective of the output device's aspect (e.g. its width,
       ...).  You can use the options described below to control the formatting algorithm for diagnostic messages, e.g.	 how
       many  characters	 per  line, how often source location information should be reported.  Note that some language front
       ends may not honor these options.

       -fmessage-length=n
	   Try to format error messages so that they fit on lines of about n characters.   If  n  is  zero,  then  no  line-
	   wrapping is done; each error message appears on a single line.  This is the default for all front ends.

	   Note	 -  this  option  also	affects	 the  display  of  the #error and #warning pre-processor directives, and the
	   deprecated function/type/variable attribute.	 It does not however affect the pragma GCC warning  and	 pragma	 GCC
	   error pragmas.

       -fdiagnostics-plain-output
	   This	 option	 requests that diagnostic output look as plain as possible, which may be useful when running dejagnu
	   or other utilities that need to parse diagnostics output and	 prefer	 that  it  remain  more	 stable	 over  time.
	   -fdiagnostics-plain-output	is  currently  equivalent  to  the  following  options:	 -fno-diagnostics-show-caret
	   -fno-diagnostics-show-line-numbers		    -fdiagnostics-color=never		    -fdiagnostics-urls=never
	   -fdiagnostics-path-format=separate-events  -fdiagnostics-text-art-charset=none  -fno-diagnostics-show-event-links
	   In the future, if GCC changes the default appearance of its diagnostics, the corresponding option to disable	 the
	   new behavior will be added to this list.

       -fdiagnostics-show-location=once
	   Only	 meaningful  in	 line-wrapping	mode.	Instructs  the	diagnostic messages reporter to emit source location
	   information once; that is, in case the message is too long to fit on	 a  single  physical  line  and	 has  to  be
	   wrapped, the source location won't be emitted (as prefix) again, over and over, in subsequent continuation lines.
	   This is the default behavior.

       -fdiagnostics-show-location=every-line
	   Only	 meaningful  in	 line-wrapping	mode.	Instructs  the	diagnostic messages reporter to emit the same source
	   location information (as prefix) for physical lines that result from the process of breaking a message  which  is
	   too long to fit on a single line.

       -fdiagnostics-color[=WHEN]
       -fno-diagnostics-color
	   Use	color  in  diagnostics.	  WHEN	is never, always, or auto.  The default depends on how the compiler has been
	   configured, it can be any of the above WHEN options or  also	 never	if  GCC_COLORS	environment  variable  isn't
	   present  in	the  environment,  and	auto  otherwise.  auto makes GCC use color only when the standard error is a
	   terminal, and when not executing in an emacs shell.	The forms -fdiagnostics-color and -fno-diagnostics-color are
	   aliases for -fdiagnostics-color=always and -fdiagnostics-color=never, respectively.

	   The colors are defined by  the  environment	variable  GCC_COLORS.	Its  value  is	a  colon-separated  list  of
	   capabilities	 and  Select  Graphic  Rendition  (SGR)	 substrings. SGR commands are interpreted by the terminal or
	   terminal emulator.  (See the section in the documentation of your text terminal for permitted  values  and  their
	   meanings  as	 character  attributes.)   These  substring values are integers in decimal representation and can be
	   concatenated with semicolons.  Common values to concatenate include 1 for bold, 4 for underline, 5 for  blink,  7
	   for	inverse,  39  for  default  foreground	color,	30  to	37 for foreground colors, 90 to 97 for 16-color mode
	   foreground colors, 38;5;0 to 38;5;255 for  88-color	and  256-color	modes  foreground  colors,  49	for  default
	   background  color,  40 to 47 for background colors, 100 to 107 for 16-color mode background colors, and 48;5;0 to
	   48;5;255 for 88-color and 256-color modes background colors.

	   The default GCC_COLORS is

		   error=01;31:warning=01;35:note=01;36:range1=32:range2=34:locus=01:\
		   quote=01:path=01;36:fixit-insert=32:fixit-delete=31:\
		   diff-filename=01:diff-hunk=32:diff-delete=31:diff-insert=32:\
		   type-diff=01;32:fnname=01;32:targs=35:valid=01;31:invalid=01;32\
		   highlight-a=01;32:highlight-b=01;34

	   where 01;31 is bold red, 01;35 is bold magenta, 01;36 is bold cyan, 32 is green, 34 is blue, 01 is bold,  and  31
	   is red.  Setting GCC_COLORS to the empty string disables colors.  Supported capabilities are as follows.

	   "error="
	       SGR substring for error: markers.

	   "warning="
	       SGR substring for warning: markers.

	   "note="
	       SGR substring for note: markers.

	   "path="
	       SGR  substring for colorizing paths of control-flow events as printed via -fdiagnostics-path-format=, such as
	       the identifiers of individual events and lines indicating interprocedural calls and returns.

	   "range1="
	       SGR substring for first additional range.

	   "range2="
	       SGR substring for second additional range.

	   "locus="
	       SGR substring for location information, file:line or file:line:column etc.

	   "quote="
	       SGR substring for information printed within quotes.

	   "fnname="
	       SGR substring for names of C++ functions.

	   "targs="
	       SGR substring for C++ function template parameter bindings.

	   "fixit-insert="
	       SGR substring for fix-it hints suggesting text to be inserted or replaced.

	   "fixit-delete="
	       SGR substring for fix-it hints suggesting text to be deleted.

	   "diff-filename="
	       SGR substring for filename headers within generated patches.

	   "diff-hunk="
	       SGR substring for the starts of hunks within generated patches.

	   "diff-delete="
	       SGR substring for deleted lines within generated patches.

	   "diff-insert="
	       SGR substring for inserted lines within generated patches.

	   "type-diff="
	       SGR substring for highlighting mismatching types within template arguments in the C++ frontend.

	   "valid="
	       SGR substring for highlighting valid elements within text art diagrams.

	   "invalid="
	       SGR substring for highlighting invalid elements within text art diagrams.

	   "highlight-a="
	   "highlight-b="
	       SGR substrings for contrasting two different things within diagnostics, such as a pair of mismatching  types.
	       See -fdiagnostics-show-highlight-colors.

       -fdiagnostics-urls[=WHEN]
	   Use	escape	sequences  to  embed  URLs  in	diagnostics.  For example, when -fdiagnostics-show-option emits text
	   showing the command-line option controlling a diagnostic, embed a URL for documentation of that option.

	   WHEN is never, always, or auto.  auto makes GCC use URL escape sequences  only  when	 the  standard	error  is  a
	   terminal,  and  when	 not executing in an emacs shell or any graphical terminal which is known to be incompatible
	   with this feature, see below.

	   The default depends on how the compiler has been configured.	 It can be any of the above WHEN options.

	   GCC can also be configured (via  the	 --with-diagnostics-urls=auto-if-env  configure-time  option)  so  that	 the
	   default  is	affected by environment variables.  Under such a configuration, GCC defaults to using auto if either
	   GCC_URLS or TERM_URLS environment variables are present and non-empty in the	 environment  of  the  compiler,  or
	   never if neither are.

	   However,  even  with	 -fdiagnostics-urls=always  the	 behavior  is  dependent  on those environment variables: If
	   GCC_URLS is set to empty or no, do not embed URLs in diagnostics.  If set to st, URLs use  ST  escape  sequences.
	   If  set  to	bel, the default, URLs use BEL escape sequences.  Any other non-empty value enables the feature.  If
	   GCC_URLS is not set, use TERM_URLS as a fallback.  Note: ST is an ANSI escape sequence, string terminator ESC  \,
	   BEL is an ASCII character, CTRL-G that usually sounds like a beep.

	   At  this  time GCC tries to detect also a few terminals that are known to not implement the URL feature, and have
	   bugs or at least had bugs in some versions that are still in use, where the URL escapes are likely to  misbehave,
	   i.e.	 print	garbage	 on  the  screen.   That  list is currently xfce4-terminal, certain known to be buggy gnome-
	   terminal versions, the linux console, and mingw.  This check can be skipped with the -fdiagnostics-urls=always.

       -fno-diagnostics-show-option
	   By default, each diagnostic emitted includes text indicating the command-line option that directly  controls	 the
	   diagnostic (if such an option is known to the diagnostic machinery).	 Specifying the -fno-diagnostics-show-option
	   flag suppresses that behavior.

       -fno-diagnostics-show-caret
	   By  default, each diagnostic emitted includes the original source line and a caret ^ indicating the column.	This
	   option suppresses this information.	The source line is truncated to	 n  characters,	 if  the  -fmessage-length=n
	   option is given.  When the output is done to the terminal, the width is limited to the width given by the COLUMNS
	   environment variable or, if not set, to the terminal width.

       -fno-diagnostics-show-labels
	   By default, when printing source code (via -fdiagnostics-show-caret), diagnostics can label ranges of source code
	   with pertinent information, such as the types of expressions:

		       printf ("foo %s bar", long_i + long_j);
				    ~^	     ~~~~~~~~~~~~~~~
				     |		    |
				     char *	    long int

	   This option suppresses the printing of these labels (in the example above, the vertical bars and the "char *" and
	   "long int" text).

       -fno-diagnostics-show-event-links
	   By  default,	 when  printing	 execution paths (via -fdiagnostics-path-format=inline-events), GCC will print lines
	   connecting related events, such as the line connecting events 1 and 2 in:

		       3 |   if (p)
			 |	 ^
			 |	 |
			 |	 (1) following `false' branch (when `p' is NULL)... ->-+
			 |							       |
			 |							       |
			 |+------------------------------------------------------------+
		       4 ||    return 0;
		       5 ||  return *p;
			 ||	    ~
			 ||	    |
			 |+-------->(2) ...to here
			 |	    (3) dereference of NULL `p'

	   This option suppresses the printing of such connector lines.

       -fno-diagnostics-show-cwe
	   Diagnostic messages can optionally have an associated
	    CWE ("https://cwe.mitre.org/index.html") identifier.  GCC itself only provides such metadata  for  some  of	 the
	   -fanalyzer  diagnostics.   GCC  plugins  may	 also  provide	diagnostics with such metadata.	 By default, if this
	   information is present, it will be printed with the diagnostic.  This option	 suppresses  the  printing  of	this
	   metadata.

       -fno-diagnostics-show-rules
	   Diagnostic  messages	 can  optionally  have	rules  associated  with	 them,	such as from a coding standard, or a
	   specification.  GCC itself does not do this for any of its diagnostics, but plugins may do so.   By	default,  if
	   this information is present, it will be printed with the diagnostic.	 This option suppresses the printing of this
	   metadata.

       -fno-diagnostics-show-highlight-colors
	   GCC can use color for emphasis and contrast when printing diagnostic messages and quoting the user's source.

	   For example, in

		   demo.c: In function `test_bad_format_string_args':
		   ../../src/demo.c:25:18: warning: format `%i' expects argument of type `int', but argument 2 has type `const char *' [-Wformat=]
		      25 |   printf("hello %i", msg);
			 |		   ~^	~~~
			 |		    |	|
			 |		    int const char *
			 |		   %s

	   *   the  %i	and  "int"  in	the message and the "int" in the quoted source are colored using "highlight-a" (bold
	       green by default), and

	   *   the "const char *" in the message and in the quoted source are both colored using "highlight-b" (bold blue by
	       default).

	   The intent is to draw the reader's eyes to the relationships	 between  the  various	aspects	 of  the  diagnostic
	   message and the source, using color to group related elements and distinguish between mismatching ones.

	   This	 additional  colorization  is enabled by default if color printing is enabled (as per -fdiagnostics-color=),
	   but it can be separately disabled via -fno-diagnostics-show-highlight-colors.

       -fno-diagnostics-show-line-numbers
	   By default, when printing source code (via -fdiagnostics-show-caret), a left	 margin	 is  printed,  showing	line
	   numbers.  This option suppresses this left margin.

       -fdiagnostics-minimum-margin-width=width
	   This	 option	 controls  the	minimum	 width	of  the	 left margin printed by -fdiagnostics-show-line-numbers.  It
	   defaults to 6.

       -fdiagnostics-parseable-fixits
	   Emit fix-it hints in a machine-parseable format, suitable for consumption by IDEs.  For each fix-it, a line	will
	   be printed after the relevant diagnostic, starting with the string "fix-it:".  For example:

		   fix-it:"test.c":{45:3-45:21}:"gtk_widget_show_all"

	   The location is expressed as a half-open range, expressed as a count of bytes, starting at byte 1 for the initial
	   column.   In	 the  above  example,  bytes  3	 through 20 of line 45 of "test.c" are to be replaced with the given
	   string:

		   00000000011111111112222222222
		   12345678901234567890123456789
		     gtk_widget_showall (dlg);
		     ^^^^^^^^^^^^^^^^^^
		     gtk_widget_show_all

	   The filename and replacement string escape backslash as "\\", tab as "\t", newline  as  "\n",  double  quotes  as
	   "\"", non-printable characters as octal (e.g. vertical tab as "\013").

	   An  empty  replacement string indicates that the given range is to be removed.  An empty range (e.g. "45:3-45:3")
	   indicates that the string is to be inserted at the given position.

       -fdiagnostics-generate-patch
	   Print fix-it hints to stderr in unified diff format, after any diagnostics are printed.  For example:

		   --- test.c
		   +++ test.c
		   @ -42,5 +42,5 @

		    void show_cb(GtkDialog *dlg)
		    {
		   -  gtk_widget_showall(dlg);
		   +  gtk_widget_show_all(dlg);
		    }

	   The diff may or may not be colorized, following the same rules as for diagnostics (see -fdiagnostics-color).

       -fdiagnostics-show-template-tree
	   In the C++ frontend, when printing diagnostics showing mismatching template types, such as:

		     could not convert 'std::map >()'
		       from 'map<[...],vector>' to 'map<[...],vector>

	   the -fdiagnostics-show-template-tree flag enables printing a tree-like structure showing the common and differing
	   parts of the types, such as:

		     map<
		       [...],
		       vector<
			 [double != float]>>

	   The parts that differ are highlighted with color ("double" and "float" in this case).

       -fno-elide-type
	   By default when the C++ frontend prints diagnostics showing mismatching template types, common parts of the types
	   are printed as "[...]" to simplify the error message.  For example:

		     could not convert 'std::map >()'
		       from 'map<[...],vector>' to 'map<[...],vector>

	   Specifying the -fno-elide-type flag suppresses  that	 behavior.   This  flag	 also  affects	the  output  of	 the
	   -fdiagnostics-show-template-tree flag.

       -fdiagnostics-path-format=KIND
	   Specify how to print paths of control-flow events for diagnostics that have such a path associated with them.

	   KIND is none, separate-events, or inline-events, the default.

	   none means to not print diagnostic paths.

	   separate-events means to print a separate "note" diagnostic for each event within the diagnostic.  For example:

		   test.c:29:5: error: passing NULL as argument 1 to 'PyList_Append' which requires a non-NULL parameter
		   test.c:25:10: note: (1) when 'PyList_New' fails, returning NULL
		   test.c:27:3: note: (2) when 'i < count'
		   test.c:29:5: note: (3) when calling 'PyList_Append', passing NULL from (1) as argument 1

	   inline-events  means	 to print the events "inline" within the source code.  This view attempts to consolidate the
	   events into runs of sufficiently-close events, printing them as labelled ranges within the source.

	   For example, the same events as above might be printed as:

		     'test': events 1-3
		      25 |   list = PyList_New(0);
			 |	    ^~~~~~~~~~~~~
			 |	    |
			 |	    (1) when 'PyList_New' fails, returning NULL
		      26 |
		      27 |   for (i = 0; i < count; i++) {
			 |   ~~~
			 |   |
			 |   (2) when 'i < count'
		      28 |     item = PyLong_FromLong(random());
		      29 |     PyList_Append(list, item);
			 |     ~~~~~~~~~~~~~~~~~~~~~~~~~
			 |     |
			 |     (3) when calling 'PyList_Append', passing NULL from (1) as argument 1

	   Interprocedural control flow is shown by grouping the events by stack frame, and using indentation  to  show	 how
	   stack frames are nested, pushed, and popped.

	   For example:

		     'test': events 1-2
		       |
		       |  133 | {
		       |      | ^
		       |      | |
		       |      | (1) entering 'test'
		       |  134 |	  boxed_int *obj = make_boxed_int (i);
		       |      |			   ~~~~~~~~~~~~~~~~~~
		       |      |			   |
		       |      |			   (2) calling 'make_boxed_int'
		       |
		       +--> 'make_boxed_int': events 3-4
			      |
			      |	 120 | {
			      |	     | ^
			      |	     | |
			      |	     | (3) entering 'make_boxed_int'
			      |	 121 |	 boxed_int *result = (boxed_int *)wrapped_malloc (sizeof (boxed_int));
			      |	     |					  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
			      |	     |					  |
			      |	     |					  (4) calling 'wrapped_malloc'
			      |
			      +--> 'wrapped_malloc': events 5-6
				     |
				     |	  7 | {
				     |	    | ^
				     |	    | |
				     |	    | (5) entering 'wrapped_malloc'
				     |	  8 |	return malloc (size);
				     |	    |	       ~~~~~~~~~~~~~
				     |	    |	       |
				     |	    |	       (6) calling 'malloc'
				     |
		       <-------------+
		       |
		    'test': event 7
		       |
		       |  138 |	  free_boxed_int (obj);
		       |      |	  ^~~~~~~~~~~~~~~~~~~~
		       |      |	  |
		       |      |	  (7) calling 'free_boxed_int'
		       |
		   (etc)

       -fdiagnostics-show-path-depths
	   This option provides additional information when printing control-flow paths associated with a diagnostic.

	   If  this  is	 option	 is  provided  then  the  stack	 depth	will  be  printed  for	each  run  of  events within
	   -fdiagnostics-path-format=inline-events.  If provided with  -fdiagnostics-path-format=separate-events,  then	 the
	   stack depth and function declaration will be appended when printing each event.

	   This	 is  intended  for  use	 by  GCC  developers  and  plugin  developers when debugging diagnostics that report
	   interprocedural control flow.

       -fno-show-column
	   Do not print column numbers in diagnostics.	This may be necessary if diagnostics are being scanned by a  program
	   that does not understand the column numbers, such as dejagnu.

       -fdiagnostics-column-unit=UNIT
	   Select   the	  units	  for  the  column  number.   This  affects  traditional  diagnostics  (in  the	 absence  of
	   -fno-show-column), as well as JSON format diagnostics if requested.

	   The default UNIT, display, considers the number of display columns occupied	by  each  character.   This  may  be
	   larger  than	 the  number  of bytes required to encode the character, in the case of tab characters, or it may be
	   smaller, in the case of multibyte characters.  For example,	the  character	"GREEK	SMALL  LETTER  PI  (U+03C0)"
	   occupies  one  display  column,  and	 its UTF-8 encoding requires two bytes; the character "SLIGHTLY SMILING FACE
	   (U+1F642)" occupies two display columns, and its UTF-8 encoding requires four bytes.

	   Setting UNIT to byte changes the column number to the raw byte count in all cases, as was traditionally output by
	   GCC prior to version 11.1.0.

       -fdiagnostics-column-origin=ORIGIN
	   Select the origin for column numbers, i.e. the column number assigned to the first column.  The default value  of
	   1  corresponds to traditional GCC behavior and to the GNU style guide.  Some utilities may perform better with an
	   origin of 0; any non-negative value may be specified.

       -fdiagnostics-escape-format=FORMAT
	   When GCC prints pertinent source lines for a diagnostic it normally attempts to print the source bytes  directly.
	   However,  some  diagnostics relate to encoding issues in the source file, such as malformed UTF-8, or issues with
	   Unicode normalization.  These diagnostics are flagged so that GCC will escape bytes that are not printable  ASCII
	   when printing their pertinent source lines.

	   This option controls how such bytes should be escaped.

	   The	default	 FORMAT,  unicode displays Unicode characters that are not printable ASCII in the form , and
	   bytes that do not correspond to a Unicode  character	 validly-encoded  in  UTF-8-encoded  will  be  displayed  as
	   hexadecimal in the form .

	   For	example,  a  source line containing the string before followed by the Unicode character U+03C0 ("GREEK SMALL
	   LETTER PI", with UTF-8 encoding 0xCF 0x80) followed by the byte 0xBF (a stray UTF-8 trailing byte),	followed  by
	   the string after will be printed for such a diagnostic as:

		    beforeafter

	   Setting  FORMAT to bytes will display all non-printable-ASCII bytes in the form , thus showing the underlying
	   encoding of non-ASCII Unicode characters.  For the example above, the following will be printed:

		    before<80>after

       -fdiagnostics-text-art-charset=CHARSET
	   Some diagnostics can contain "text art" diagrams: visualizations created from text, intended to be  viewed  in  a
	   monospaced font.

	   This	 option selects which characters should be used for printing such diagrams, if any.  CHARSET is none, ascii,
	   unicode, or emoji.

	   The none value suppresses the printing of such diagrams.  The ascii value will ensure that such diagrams are pure
	   ASCII ("ASCII art").	 The unicode value will allow for conservative use of unicode drawing  characters  (such  as
	   box-drawing	characters).   The emoji value further adds the possibility of emoji in the output (such as emitting
	   U+26A0 WARNING SIGN followed by U+FE0F VARIATION SELECTOR-16 to select the emoji variant of the character).

	   The default is emoji, except when the environment variable LANG is set to C, in which case the default is ascii.

       -fdiagnostics-format=FORMAT
	   Select a different format for printing diagnostics.	FORMAT is text, sarif-stderr, sarif-file, json, json-stderr,
	   or json-file.

	   Using this option replaces any additional "output sinks" added  by  -fdiagnostics-add-output=,  or  that  set  by
	   -fdiagnostics-set-output=.

	   The default is text.

	   The sarif-stderr and sarif-file formats both emit diagnostics in SARIF Version 2.1.0 format, either to stderr, or
	   to a file named source.sarif, respectively.

	   The	various	 json,	json-stderr,  and  json-file  values  are deprecated and refer to a legacy JSON-based output
	   format.  The json format is a synonym for json-stderr.  The json-stderr  and	 json-file  formats  are  identical,
	   apart from where the JSON is emitted to.  With json-stderr, the JSON is emitted to stderr, whereas with json-file
	   it is written to source.gcc.json.

       -fdiagnostics-add-output=DIAGNOSTICS-OUTPUT-SPEC
	   Add an additional "output sink" for emitting diagnostics.

	   DIAGNOSTICS-OUTPUT-SPEC  should  specify a scheme, optionally followed by ":" and one or more KEY=VALUE pairs, in
	   this form:

		   
		   :=
		   :=,=

	   etc.

	   Schemes, keys, or values with a name prefixed "experimental" may change or be removed without notice.

	   SCHEME can be

	   text
	       Emit diagnostics to stderr using GCC's classic text output format.

	       Supported keys are:

	       color=[yes|no]
		   Override colorization settings from -fdiagnostics-color for this text output.

	       experimental-nesting=[yes|no]
		   Enable an experimental mode that  emphasizes	 hierarchical  relationships  within  diagnostics  messages,
		   displaying location information on separate lines.

	       experimental-nesting-show-locations=[yes|no]
		   If  "experimental-nesting=yes",  then  by  default  locations  are shown; set this key to "no" to disable
		   printing such locations.  This exists for use by GCC developers, for writing DejaGnu test cases.

	       experimental-nesting-show-levels=[yes|no]
		   This is a debugging option for use with "experimental-nesting=yes".	Set  this  key	to  "yes"  to  print
		   explicit nesting levels in the output.  This exists for use by GCC developers.

	   sarif
	       Emit diagnostics to a file in SARIF format.

	       Supported keys are:

	       file=FILENAME
		   Specify  the filename to write the SARIF output to, potentially with a leading absolute or relative path.
		   If not specified, it defaults to source.sarif.

	       version=[2.1|2.2-prerelease]
		   Specify the version of SARIF to use for the output.	If not specified, defaults to 2.1.  "2.2-prerelease"
		   uses	 an  unofficial	 draft	of  the	 future	 SARIF	2.2  specification  and	 should	 only  be  used	 for
		   experimentation in this release.

	   For example,

		   -fdiagnostics-add-output=sarif:version=2.1,file=foo.2.1.sarif
		   -fdiagnostics-add-output=sarif:version=2.2-prerelease,file=foo.2.2.sarif

	   would  add  a pair of outputs, each writing to a different file, using versions 2.1 and 2.2 of the SARIF standard
	   respectively.

	   In EBNF:

		    = 
						      | , ":", ;

		    = "text" | "sarif";

		    = 
					 |  "," ;

		    =  "=" ;

		    = ? string without a '=' ? ;
		    = ? string without a ',' ? ;

       -fdiagnostics-set-output=DIAGNOSTICS-OUTPUT-SPEC
	   This works in a similar way to -fdiagnostics-add-output= except that instead	 of  adding  an	 additional  "output
	   sink"   for	 diagnostics,	it   replaces  all  existing  output  sinks,  such  as	from  -fdiagnostics-format=,
	   -fdiagnostics-add-output=, or a prior call to -fdiagnostics-set-output=.

       -fno-diagnostics-json-formatting
	   By	default,   when	   JSON	   is	 emitted    for	   diagnostics	  (via	  -fdiagnostics-format=sarif-stderr,
	   -fdiagnostics-format=sarif-file,	      -fdiagnostics-format=json,	   -fdiagnostics-format=json-stderr,
	   -fdiagnostics-format=json-file), GCC will add newlines and indentation to  visually	emphasize  the	hierarchical
	   structure of the JSON.

	   Use	-fno-diagnostics-json-formatting  to suppress this whitespace.	It must be passed before the option it is to
	   affect.

	   This is intended for compatibility with tools that do not expect the output to contain  newlines,  such  as	that
	   emitted by older GCC releases.

   Options to Request or Suppress Warnings
       Warnings	 are  diagnostic  messages that report constructions that are not inherently erroneous but that are risky or
       suggest there may have been an error.

       The following language-independent options do not enable specific warnings  but	control	 the  kinds  of	 diagnostics
       produced by GCC.

       -fsyntax-only
	   Check the code for syntax errors, but don't do anything beyond that.

       -fmax-errors=n
	   Limits the maximum number of error messages to n, at which point GCC bails out rather than attempting to continue
	   processing the source code.	If n is 0 (the default), there is no limit on the number of error messages produced.
	   If -Wfatal-errors is also specified, then -Wfatal-errors takes precedence over this option.

       -w  Inhibit all warning messages.

       -Werror
	   Turn all warnings into errors.

       -Werror=
	   Turn	 the  specified	 warning into an error.	 The specifier for a warning is appended; for example -Werror=switch
	   turns the warnings controlled by -Wswitch into errors.  This switch takes a negative form, to be used  to  negate
	   -Werror  for	 specific  warnings;  for example -Wno-error=switch makes -Wswitch warnings not be errors, even when
	   -Werror is in effect.

	   The warning message for each controllable warning includes the option that controls the warning.  That option can
	   then be used with -Werror= and -Wno-error= as described above.  (Printing of the option in  the  warning  message
	   can be disabled using the -fno-diagnostics-show-option flag.)

	   Note that specifying -Werror=foo automatically implies -Wfoo.  However, -Wno-error=foo does not imply anything.

       -Wfatal-errors
	   This option causes the compiler to abort compilation on the first error occurred rather than trying to keep going
	   and printing further error messages.

       You  can	 request  many	specific  warnings  with options beginning with -W, for example -Wunused-variable to request
       warnings on declarations of variables that are never used.  Each	 of  these  specific  warning  options	also  has  a
       negative	 form  beginning with -Wno- to turn off warnings; for example, -Wno-unused-variable.  This manual lists only
       one of the two forms, whichever is not the default.  For further language-specific options also refer to C++  Dialect
       Options	and  Objective-C  and  Objective-C++  Dialect  Options.	 Additional warnings can be produced by enabling the
       static analyzer;

       Some options, such as -Wall and -Wextra, turn on other options, such as -Wunused, which may turn on further  options,
       such  as	 -Wunused-variable.  The  combined  effect of positive and negative forms is that more specific options have
       priority over less specific ones, independently of their position in the	 command  line.	 For  options  of  the	same
       specificity,  the  last	one takes effect. Options enabled or disabled via pragmas take effect as if they appeared at
       the end of the command line.

       When an unrecognized warning option is requested (e.g., -Wunknown-warning), GCC	gives  an  error  stating  that	 the
       option  is  not recognized.  However, if the -Wno- form is used, the behavior is slightly different: no diagnostic is
       produced for -Wno-unknown-warning unless other diagnostics are being produced.  This allows  the	 use  of  new  -Wno-
       options with old compilers, but if something goes wrong, the compiler warns that an unrecognized option is present.

       The effectiveness of some warnings depends on optimizations also being enabled. For example, -Wsuggest-final-types is
       more  effective	with  link-time	 optimization.	 Some other warnings may not be issued at all unless optimization is
       enabled.	 While optimization in general improves the efficacy of warnings about control and  data-flow  problems,  in
       some cases it may also cause false positives.

       -Wpedantic
       -pedantic
	   Issue all the warnings demanded by strict ISO C and ISO C++; diagnose all programs that use forbidden extensions,
	   and	some  other  programs  that  do	 not follow ISO C and ISO C++.	This follows the version of the ISO C or C++
	   standard specified by any -std option used.

	   Valid ISO C and ISO C++ programs should compile properly with or without this option (though a rare	few  require
	   -ansi  or  a	 -std  option  specifying  the	version of the standard).  However, without this option, certain GNU
	   extensions and traditional C and C++ features are supported as well.	 With this option, they	 are  diagnosed	 (or
	   rejected with -pedantic-errors).

	   -Wpedantic  does  not cause warning messages for use of the alternate keywords whose names begin and end with __.
	   This alternate format can also be used to disable warnings for non-ISO __intN  types,  i.e.	__intN__.   Pedantic
	   warnings  are  also	disabled  in the expression that follows "__extension__".  However, only system header files
	   should use these escape routes; application programs should avoid them.

	   Some warnings about non-conforming programs are controlled by options other than -Wpedantic; in many	 cases	they
	   are	 implied  by  -Wpedantic  but  can  be	disabled  separately  by  their	 specific  option,  e.g.  -Wpedantic
	   -Wno-pointer-sign.

	   Where the standard specified with -std represents a GNU extended dialect of C, such as gnu90 or gnu99, there is a
	   corresponding base standard, the version of ISO C on which the GNU extended	dialect	 is  based.   Warnings	from
	   -Wpedantic  are given where they are required by the base standard.	(It does not make sense for such warnings to
	   be given only for features not in the specified GNU C dialect, since by definition the GNU dialects of C  include
	   all features the compiler supports with the given option, and there would be nothing to warn about.)

       -pedantic-errors
	   Give	 an  error  whenever  the base standard (see -Wpedantic) requires a diagnostic, in some cases where there is
	   undefined behavior at compile-time and in some other cases that do not prevent compilation of programs  that	 are
	   valid  according to the standard. This is not equivalent to -Werror=pedantic: the latter option is unlikely to be
	   useful, as it only makes errors of the diagnostics that are controlled by -Wpedantic, whereas  this	option	also
	   affects required diagnostics that are always enabled or controlled by options other than -Wpedantic.

	   If  you  want  the required diagnostics that are warnings by default to be errors instead, but don't also want to
	   enable  the	-Wpedantic  diagnostics,  you  can  specify  -pedantic-errors  -Wno-pedantic  (or   -pedantic-errors
	   -Wno-error=pedantic to enable them but only as warnings).

	   Some	 required  diagnostics	are  errors  by	 default, but can be reduced to warnings using -fpermissive or their
	   specific warning option, e.g. -Wno-error=narrowing.

	   Some diagnostics for non-ISO practices are controlled by specific warning options other than -Wpedantic, but	 are
	   also made errors by -pedantic-errors.  For instance:

	   -Wattributes	  (for	 standard   attributes)	  -Wchanges-meaning   (C++)   -Wcomma-subscript	  (C++23  or  later)
	   -Wdeclaration-after-statement (C90 or earlier) -Welaborated-enum-base (C++11 or  later)  -Wimplicit-int  (C99  or
	   later)  -Wimplicit-function-declaration  (C99 or later) -Wincompatible-pointer-types -Wint-conversion -Wlong-long
	   (C90 or earlier) -Wmain -Wnarrowing (C++11 or later) -Wpointer-arith -Wpointer-sign	-Wincompatible-pointer-types
	   -Wregister (C++17 or later) -Wvla (C90 or earlier) -Wwrite-strings (C++11 or later)

       -fpermissive
	   Downgrade  some  required diagnostics about nonconformant code from errors to warnings.  Thus, using -fpermissive
	   allows some nonconforming code to compile.  Some C++ diagnostics are controlled only by this flag,  but  it	also
	   downgrades some C and C++ diagnostics that have their own flag:

	   -Wdeclaration-missing-parameter-type	 (C and Objective-C only) -Wimplicit-function-declaration (C and Objective-C
	   only)  -Wimplicit-int  (C  and  Objective-C	only)  -Wincompatible-pointer-types   (C   and	 Objective-C   only)
	   -Wint-conversion  (C	 and  Objective-C  only)  -Wnarrowing  (C++ and Objective-C++ only) -Wreturn-mismatch (C and
	   Objective-C only) -Wtemplate-body (C++ and Objective-C++ only)

	   The -fpermissive  option  is	 the  default  for  historic  C	 language  modes  (-std=c89,  -std=gnu89,  -std=c90,
	   -std=gnu90).

       -Wall
	   This	 enables  all  the  warnings about constructions that some users consider questionable, and that are easy to
	   avoid (or modify to prevent the warning), even in conjunction with macros.	This  also  enables  some  language-
	   specific warnings described in C++ Dialect Options and Objective-C and Objective-C++ Dialect Options.

	   -Wall turns on the following warning flags:

	   -Waddress   -Waligned-new   (C++  and  Objective-C++	 only)	-Warray-bounds=1  (only	 with  -O2)  -Warray-compare
	   -Warray-parameter=2 -Wbool-compare -Wbool-operation -Wc++11-compat  -Wc++14-compat  -Wc++17compat   -Wc++20compat
	   -Wcatch-value  (C++	and  Objective-C++  only)  -Wchar-subscripts  -Wclass-memaccess (C++ and Objective-C++ only)
	   -Wcomment  -Wdangling-else  -Wdangling-pointer=2   -Wdelete-non-virtual-dtor	  (C++	 and   Objective-C++   only)
	   -Wduplicate-decl-specifier  (C  and	Objective-C  only)  -Wenum-compare (in C/ObjC; this is on by default in C++)
	   -Wenum-int-mismatch (C and Objective-C only) -Wformat=1 -Wformat-contains-nul  -Wformat-diag	 -Wformat-extra-args
	   -Wformat-overflow=1	-Wformat-truncation=1  -Wformat-zero-length  -Wframe-address  -Wimplicit  (C and Objective-C
	   only)  -Wimplicit-function-declaration  (C  and  Objective-C	 only)	-Wimplicit-int	(C  and	 Objective-C   only)
	   -Winfinite-recursion	 -Winit-self  (C++  and	 Objective-C++ only) -Wint-in-bool-context -Wlogical-not-parentheses
	   -Wmain   (only    for    C/ObjC    and    unless    -ffreestanding)	  -Wmaybe-uninitialized	   -Wmemset-elt-size
	   -Wmemset-transposed-args  -Wmisleading-indentation  (only for C/C++) -Wmismatched-dealloc -Wmismatched-new-delete
	   (C++ and Objective-C++ only) -Wmissing-attributes  -Wmissing-braces	(only  for  C/ObjC)  -Wmultistatement-macros
	   -Wnarrowing	  (C++	 and  Objective-C++  only)  -Wnonnull  -Wnonnull-compare  -Wopenmp-simd	 (C  and  C++  only)
	   -Woverloaded-virtual=1 (C++ and Objective-C++ only) -Wpacked-not-aligned  -Wparentheses  -Wpessimizing-move	(C++
	   and	Objective-C++  only)  -Wpointer-sign  (only  for C/ObjC) -Wrange-loop-construct (C++ and Objective-C++ only)
	   -Wreorder (C++ and  Objective-C++  only)  -Wrestrict	 -Wreturn-type	-Wself-move  (C++  and	Objective-C++  only)
	   -Wsequence-point   -Wsign-compare   (C++   and   Objective-C++   only)   -Wsizeof-array-div	-Wsizeof-pointer-div
	   -Wsizeof-pointer-memaccess  -Wstrict-aliasing  -Wstrict-overflow=1  -Wswitch	 -Wtautological-compare	 -Wtrigraphs
	   -Wuninitialized  -Wunknown-pragmas -Wunused -Wunused-but-set-variable -Wunused-const-variable=1 (only for C/ObjC)
	   -Wunused-function  -Wunused-label  -Wunused-local-typedefs  -Wunused-value  -Wunused-variable  -Wuse-after-free=2
	   -Wvla-parameter -Wvolatile-register-var -Wzero-length-bounds

	   Note	 that  some  warning  flags  are  not  implied	by  -Wall.  Some of them warn about constructions that users
	   generally do not consider questionable, but which occasionally you might wish to check  for;	 others	 warn  about
	   constructions that are necessary or hard to avoid in some cases, and there is no simple way to modify the code to
	   suppress the warning. Some of them are enabled by -Wextra but many of them must be enabled individually.

       -Wextra
	   This	 enables  some	extra  warning	flags that are not enabled by -Wall. (This option used to be called -W.	 The
	   older name is still supported, but the newer name is more descriptive.)

	   -Wabsolute-value  (only  for	 C/ObjC)  -Walloc-size	-Wcalloc-transposed-args  -Wcast-function-type	 -Wclobbered
	   -Wdangling-reference	 (C++  only)  -Wdeprecated-copy	 (C++ and Objective-C++ only) -Wempty-body -Wenum-conversion
	   (only  for  C/ObjC)	-Wexpansion-to-defined	-Wignored-qualifiers   (only  for  C/C++)   -Wimplicit-fallthrough=3
	   -Wmaybe-uninitialized       -Wmissing-field-initializers	  -Wmissing-parameter-name	 (C/ObjC       only)
	   -Wmissing-parameter-type (C/ObjC  only)  -Wold-style-declaration  (C/ObjC  only)  -Woverride-init  (C/ObjC  only)
	   -Wredundant-move  (C++  and	Objective-C++  only) -Wshift-negative-value (in C++11 to C++17 and in C99 and newer)
	   -Wsign-compare (C++ and Objective-C++ only) -Wsized-deallocation (C++ and  Objective-C++  only)  -Wstring-compare
	   -Wtype-limits  -Wuninitialized  -Wunterminated-string-initialization	 -Wunused-parameter  (only  with -Wunused or
	   -Wall) -Wunused-but-set-parameter (only with -Wunused or -Wall)

	   The option -Wextra also prints warning messages for the following cases:

	   *   A pointer is compared against integer zero with "<", "<=", ">", or ">=".

	   *   (C++ only) An enumerator and a non-enumerator both appear in a conditional expression.

	   *   (C++ only) Ambiguous virtual bases.

	   *   (C++ only) Subscripting an array that has been declared "register".

	   *   (C++ only) Taking the address of a variable that has been declared "register".

	   *   (C++ only) A base class is not initialized in the copy constructor of a derived class.

       -Wabi (C, Objective-C, C++ and Objective-C++ only)
	   Warn about code affected by ABI changes.  This includes code that may not be compatible with	 the  vendor-neutral
	   C++	ABI  as	 well as the psABI for the particular target.  The latter warnings are also controlled separately by
	   -Wpsabi, which is implied by -Wabi.

	   Since G++ now defaults to updating the ABI with each major release, normally	 -Wabi	warns  only  about  C++	 ABI
	   compatibility  problems if there is a check added later in a release series for an ABI issue discovered since the
	   initial release.  -Wabi warns about more things if an older ABI version is selected (with -fabi-version=n).

	   -Wabi can also be used with an explicit version number to warn about C++  ABI  compatibility	 with  a  particular
	   -fabi-version level, e.g. -Wabi=2 to warn about changes relative to -fabi-version=2.

	   If an explicit version number is provided and -fabi-compat-version is not specified, the version number from this
	   option  is  used  for  compatibility	 aliases.   If	no explicit version number is provided with this option, but
	   -fabi-compat-version is specified, that version number is used for C++ ABI warnings.

	   Although an effort has been made to warn about all such cases, there are probably some cases that are not  warned
	   about,  even though G++ is generating incompatible code.  There may also be cases where warnings are emitted even
	   though the code that is generated is compatible.

	   You should rewrite your code to avoid these warnings if you are concerned about the fact that code  generated  by
	   G++ may not be binary compatible with code generated by other compilers.

	   Known incompatibilities in -fabi-version=2 (which was the default from GCC 3.4 to 4.9) include:

	   *   A template with a non-type template parameter of reference type was mangled incorrectly:

		       extern int N;
		       template  struct S {};
		       void n (S) {2}

	       This was fixed in -fabi-version=3.

	   *   SIMD  vector  types declared using "__attribute ((vector_size))" were mangled in a non-standard way that does
	       not allow for overloading of functions taking vectors of different sizes.

	       The mangling was changed in -fabi-version=4.

	   *   "__attribute ((const))" and "noreturn" were mangled as type qualifiers, and "decltype" of a plain declaration
	       was folded away.

	       These mangling issues were fixed in -fabi-version=5.

	   *   Scoped enumerators passed as arguments to a variadic function are promoted like unscoped enumerators, causing
	       "va_arg" to complain.  On most targets this does not actually affect the parameter passing ABI, as  there  is
	       no way to pass an argument smaller than "int".

	       Also,  the  ABI	changed	 the  mangling	of  template  argument	packs,	"const_cast",  "static_cast", prefix
	       increment/decrement, and a class scope function used as a template argument.

	       These issues were corrected in -fabi-version=6.

	   *   Lambdas in default argument scope were mangled incorrectly, and the ABI changed the mangling of "nullptr_t".

	       These issues were corrected in -fabi-version=7.

	   *   When mangling a function type with function-cv-qualifiers, the un-qualified  function  type  was	 incorrectly
	       treated as a substitution candidate.

	       This was fixed in -fabi-version=8, the default for GCC 5.1.

	   *   decltype(nullptr)  incorrectly  had an alignment of 1, leading to unaligned accesses.  Note that this did not
	       affect the ABI of a function with a "nullptr_t" parameter, as parameters have a minimum alignment.

	       This was fixed in -fabi-version=9, the default for GCC 5.2.

	   *   Target-specific attributes that affect the identity of a type, such as ia32 calling conventions on a function
	       type (stdcall, regparm, etc.), did not affect the mangled name, leading	to  name  collisions  when  function
	       pointers were used as template arguments.

	       This was fixed in -fabi-version=10, the default for GCC 6.1.

       -Wpsabi (C, Objective-C, C++ and Objective-C++ only)
	   -Wpsabi  enables  warnings about processor-specific ABI changes, such as changes in alignment requirements or how
	   function arguments are passed.  On several targets, including AArch64, ARM, x86, MIPS, RS6000/PowerPC, and S/390,
	   these details have changed between different versions of GCC and/or different versions of the C or  C++  language
	   standards  in  ways	that affect binary compatibility of compiled code.  With -Wpsabi, GCC can detect potentially
	   incompatible usages and warn you about them.

	   -Wpsabi is enabled by default, and is also implied by -Wabi.

       -Wno-changes-meaning (C++ and Objective-C++ only)
	   C++ requires that unqualified uses of a name within a class have the same meaning in the complete  scope  of	 the
	   class, so declaring the name after using it is ill-formed:

		   struct A;
		   struct B1 { A a; typedef A A; }; // warning, 'A' changes meaning
		   struct B2 { A a; struct A { }; }; // error, 'A' changes meaning

	   By  default,	 the B1 case is only a warning because the two declarations have the same type, while the B2 case is
	   an error.  Both diagnostics can be disabled with  -Wno-changes-meaning.   Alternately,  the	error  case  can  be
	   reduced to a warning with -Wno-error=changes-meaning or -fpermissive.

	   Both diagnostics are also suppressed by -fms-extensions.

       -Wchar-subscripts
	   Warn	 if  an	 array subscript has type "char".  This is a common cause of error, as programmers often forget that
	   this type is signed on some machines.  This warning is enabled by -Wall.

       -Wno-coverage-mismatch
	   Warn if feedback profiles do not match when using the -fprofile-use option.	If a source file is changed  between
	   compiling  with  -fprofile-generate and with -fprofile-use, the files with the profile feedback can fail to match
	   the source file and GCC cannot use the profile feedback information.	 By default, this warning is enabled and  is
	   treated  as	an error.  -Wno-coverage-mismatch can be used to disable the warning or -Wno-error=coverage-mismatch
	   can be used to disable the error.  Disabling the error for this warning can result in poorly optimized  code	 and
	   is  useful  only  in	 the  case  of	very  minor  changes such as bug fixes to an existing code-base.  Completely
	   disabling the warning is not recommended.

       -Wno-coverage-too-many-conditions
	   Warn if -fcondition-coverage is used and an expression have too many terms and GCC gives up	coverage.   Coverage
	   is  given  up  when	there are more terms in the conditional than there are bits in a "gcov_type_unsigned".	This
	   warning is enabled by default.

       -Wno-coverage-too-many-paths
	   Warn if -fpath-coverage is used and a function has too many paths and  GCC  gives  up  coverage.   Giving  up  is
	   controlled by -fpath-coverage-limit.	 This warning is enabled by default.

       -Wno-coverage-invalid-line-number
	   Warn	 in  case  a  function ends earlier than it begins due to an invalid linenum macros.  The warning is emitted
	   only with --coverage enabled.

	   By default, this warning is enabled and is treated as an error.  -Wno-coverage-invalid-line-number can be used to
	   disable the warning or -Wno-error=coverage-invalid-line-number can be used to disable the error.

       -Wno-cpp (C, Objective-C, C++, Objective-C++ and Fortran only)
	   Suppress warning messages emitted by "#warning" directives.

       -Wdouble-promotion (C, C++, Objective-C and Objective-C++ only)
	   Give a warning when a value of type "float" is implicitly promoted to "double".   CPUs  with	 a  32-bit  "single-
	   precision"  floating-point  unit  implement	"float"	 in  hardware,	but emulate "double" in software.  On such a
	   machine, doing computations using "double" values is much more expensive because of	the  overhead  required	 for
	   software emulation.

	   It  is  easy to accidentally do computations with "double" because floating-point literals are implicitly of type
	   "double".  For example, in:

		   float area(float radius)
		   {
		      return 3.14159 * radius * radius;
		   }

	   the compiler performs the entire computation with "double" because the floating-point literal is a "double".

       -Wduplicate-decl-specifier (C and Objective-C only)
	   Warn if a declaration has duplicate "const", "volatile", "restrict" or  "_Atomic"  specifier.   This	 warning  is
	   enabled by -Wall.

       -Wformat
       -Wformat=n
	   Check calls to "printf" and "scanf", etc., to make sure that the arguments supplied have types appropriate to the
	   format  string  specified,  and  that  the  conversions specified in the format string make sense.  This includes
	   standard functions, and others specified by format attributes, in the "printf", "scanf", "strftime" and "strfmon"
	   (an X/Open extension, not in the C standard) families (or other target-specific families).  Which  functions	 are
	   checked without format attributes having been specified depends on the standard version selected, and such checks
	   of functions without the attribute specified are disabled by -ffreestanding or -fno-builtin.

	   The formats are checked against the format features supported by GNU libc version 2.2.  These include all ISO C90
	   and	C99 features, as well as features from the Single Unix Specification and some BSD and GNU extensions.  Other
	   library implementations may not support all these features; GCC does not support warning about features  that  go
	   beyond  a  particular  library's  limitations.   However, if -Wpedantic is used with -Wformat, warnings are given
	   about format features not in the selected standard version (but not for "strfmon" formats, since those are not in
	   any version of the C standard).

	   -Wformat=1
	   -Wformat
	       Option -Wformat is equivalent to -Wformat=1, and -Wno-format is equivalent  to  -Wformat=0.   Since  -Wformat
	       also  checks  for null format arguments for several functions, -Wformat also implies -Wnonnull.	Some aspects
	       of  this	 level	of  format  checking   can   be	  disabled   by	  the	options:   -Wno-format-contains-nul,
	       -Wno-format-extra-args, and -Wno-format-zero-length.  -Wformat is enabled by -Wall.

	   -Wformat=2
	       Enable  -Wformat	 plus  additional  format  checks.   Currently	equivalent  to	-Wformat -Wformat-nonliteral
	       -Wformat-security -Wformat-y2k.

       -Wno-format-contains-nul
	   If -Wformat is specified, do not warn about format strings that contain NUL bytes.

       -Wno-format-extra-args
	   If -Wformat is specified, do not warn about excess arguments to a "printf" or "scanf"  format  function.   The  C
	   standard specifies that such arguments are ignored.

	   Where  the  unused  arguments lie between used arguments that are specified with $ operand number specifications,
	   normally warnings are still given, since the implementation could not know what type to pass to "va_arg" to	skip
	   the	unused arguments.  However, in the case of "scanf" formats, this option suppresses the warning if the unused
	   arguments are all pointers, since the Single Unix Specification says that such unused arguments are allowed.

       -Wformat-overflow
       -Wformat-overflow=level
	   Warn about calls to formatted input/output functions such as "sprintf" and "vsprintf"  that	might  overflow	 the
	   destination	buffer.	  When	the  exact  number  of	bytes  written by a format directive cannot be determined at
	   compile-time it is estimated based on heuristics that depend on the level argument and  on  optimization.   While
	   enabling  optimization  will	 in  most  cases  improve  the	accuracy of the warning, it may also result in false
	   positives.

	   -Wformat-overflow
	   -Wformat-overflow=1
	       Level 1 of -Wformat-overflow enabled by -Wformat employs a conservative approach that warns only about  calls
	       that  most  likely  overflow  the buffer.  At this level, numeric arguments to format directives with unknown
	       values are assumed to have the value of one, and strings of unknown length to be	 empty.	  Numeric  arguments
	       that  are known to be bounded to a subrange of their type, or string arguments whose output is bounded either
	       by their directive's precision or by a finite set of string literals, are assumed to take on the value within
	       the range that results in the most bytes on output.  For example, the call to "sprintf"	below  is  diagnosed
	       because	even  with both a and b equal to zero, the terminating NUL character ('\0') appended by the function
	       to the destination buffer will be written past its end.	Increasing the size of the buffer by a	single	byte
	       is sufficient to avoid the warning, though it may not be sufficient to avoid the overflow.

		       void f (int a, int b)
		       {
			 char buf [13];
			 sprintf (buf, "a = %i, b = %i\n", a, b);
		       }

	   -Wformat-overflow=2
	       Level  2	 warns	also  about calls that might overflow the destination buffer given an argument of sufficient
	       length or magnitude.  At level 2, unknown numeric arguments are assumed to  have	 the  minimum  representable
	       value  for  signed  types  with	a  precision  greater than 1, and the maximum representable value otherwise.
	       Unknown string arguments whose length cannot be assumed to be bounded either by the directive's precision, or
	       by a finite set of string literals they may evaluate to, or the	character  array  they	may  point  to,	 are
	       assumed to be 1 character long.

	       At  level 2, the call in the example above is again diagnosed, but this time because with a equal to a 32-bit
	       "INT_MIN" the first %i directive will write some of its digits beyond the end of the destination buffer.	  To
	       make  the call safe regardless of the values of the two variables, the size of the destination buffer must be
	       increased to at least 34 bytes.	GCC includes the minimum  size	of  the	 buffer	 in  an	 informational	note
	       following the warning.

	       An  alternative	to  increasing	the  size  of  the destination buffer is to constrain the range of formatted
	       values.	The maximum length of string arguments can be bounded by specifying  the  precision  in	 the  format
	       directive.   When  numeric  arguments  of  format  directives  can  be assumed to be bounded by less than the
	       precision of their type, choosing an appropriate length modifier to the	format	specifier  will	 reduce	 the
	       required buffer size.  For example, if a and b in the example above can be assumed to be within the precision
	       of the "short int" type then using either the %hi format directive or casting the argument to "short" reduces
	       the maximum required size of the buffer to 24 bytes.

		       void f (int a, int b)
		       {
			 char buf [23];
			 sprintf (buf, "a = %hi, b = %i\n", a, (short)b);
		       }

       -Wno-format-zero-length
	   If  -Wformat	 is  specified,	 do  not  warn about zero-length formats.  The C standard specifies that zero-length
	   formats are allowed.

       -Wformat-nonliteral
	   If -Wformat is specified, also warn if the format string is not a string literal and so cannot be checked, unless
	   the format function takes its format arguments as a "va_list".

       -Wformat-security
	   If -Wformat is specified, also warn about uses of format functions that represent possible security problems.  At
	   present, this warns about calls to "printf" and "scanf" functions where the format string is not a string literal
	   and there are no format arguments, as in "printf (foo);".  This may be a security hole if the format string	came
	   from	 untrusted  input and contains %n.  (This is currently a subset of what -Wformat-nonliteral warns about, but
	   in future warnings may be added to -Wformat-security that are not included in -Wformat-nonliteral.)

       -Wformat-signedness
	   If -Wformat is specified, also warn if the format string requires an unsigned argument and the argument is signed
	   and vice versa.

       -Wformat-truncation
       -Wformat-truncation=level
	   Warn about calls to formatted input/output functions such as "snprintf" and	"vsnprintf"  that  might  result  in
	   output truncation.  When the exact number of bytes written by a format directive cannot be determined at compile-
	   time	 it  is estimated based on heuristics that depend on the level argument and on optimization.  While enabling
	   optimization will in most cases improve the accuracy of the warning, it  may	 also  result  in  false  positives.
	   Except as noted otherwise, the option uses the same logic -Wformat-overflow.

	   -Wformat-truncation
	   -Wformat-truncation=1
	       Level  1	 of  -Wformat-truncation  enabled  by -Wformat employs a conservative approach that warns only about
	       calls to bounded functions whose return	value  is  unused  and	that  will  most  likely  result  in  output
	       truncation.

	   -Wformat-truncation=2
	       Level  2	 warns	also  about  calls  to bounded functions whose return value is used and that might result in
	       truncation given an argument of sufficient length or magnitude.

       -Wformat-y2k
	   If -Wformat is specified, also warn about "strftime" formats that may yield only a two-digit year.

       -Wnonnull
	   Warn about passing a null pointer for arguments marked as requiring a non-null value by  the	 "nonnull"  function
	   attribute.

	   -Wnonnull is included in -Wall and -Wformat.	 It can be disabled with the -Wno-nonnull option.

       -Wnonnull-compare
	   Warn when comparing an argument marked with the "nonnull" function attribute against null inside the function.

	   -Wnonnull-compare is included in -Wall.  It can be disabled with the -Wno-nonnull-compare option.

       -Wnull-dereference
	   Warn	 if  the  compiler  detects  paths  that trigger erroneous or undefined behavior due to dereferencing a null
	   pointer.  This  option  is  only  active  when  -fdelete-null-pointer-checks	 is  active,  which  is	 enabled  by
	   optimizations in most targets.  The precision of the warnings depends on the optimization options used.

       -Wno-musttail-local-addr
	   Do  not  warn  about	 passing  a  pointer  (or in C++, a reference) to a local variable or label to argument of a
	   "musttail" call.  Those variables go out of scope before the tail call instruction.

       -Wmaybe-musttail-local-addr
	   Warn when address of a local variable can escape to a "musttail" call, unless it goes out of scope already before
	   the "musttail" call.

		   int foo (int *);

		   int
		   bar (int *x)
		   {
		     if (x[0] == 1)
		       {
			 int a = 42;
			 foo (&a);
			 /* Without the C attribute this call would not
			    be tail called, because address of the C variable escapes
			    and the second foo call could dereference it.  With the attribute
			    the local variables are assumed to go out of scope immediately
			    before the tail call instruction and the compiler warns about
			    this.  */
			 [[gnu::musttail]] return foo (nullptr);
		       }
		     else
		       {
			 {
			   int a = 42;
			   foo (&a);
			 }
			 /* The C variable isn't already in scope, so even when it
			    escaped, even without C attribute it would be
			    undefined behavior to dereference it and the compiler could
			    turn this into a tail call.	 No warning is diagnosed here.	*/
			 [[gnu::musttail]] return foo (nullptr);
		       }
		   }

	   This warning is enabled by -Wextra.

       -Wnrvo (C++ and Objective-C++ only)
	   Warn if the compiler does not elide the copy from a local variable to the return value of a function in a context
	   where it is allowed by  [class.copy.elision].   This	 elision  is  commonly	known  as  the	Named  Return  Value
	   Optimization.   For	instance,  in  the example below the compiler cannot elide copies from both v1 and v2, so it
	   elides neither.

		   std::vector f()
		   {
		     std::vector v1, v2;
		     // ...
		     if (cond) return v1;
		     else return v2; // warning: not eliding copy
		   }

       -Winfinite-recursion
	   Warn about infinitely recursive calls.  The	warning	 is  effective	at  all	 optimization  levels  but  requires
	   optimization	 in order to detect infinite recursion in calls between two or more functions.	-Winfinite-recursion
	   is included in -Wall.

	   Compare with -Wanalyzer-infinite-recursion which provides a similar diagnostic, but is implemented in a different
	   way (as part of -fanalyzer).

       -Winit-self (C, C++, Objective-C and Objective-C++ only)
	   Warn about uninitialized variables that are initialized with themselves.  Note this option can only be used	with
	   the -Wuninitialized option.

	   For	example,  GCC  warns  about  "i" being uninitialized in the following snippet only when -Winit-self has been
	   specified:

		   int f()
		   {
		     int i = i;
		     return i;
		   }

	   This warning is enabled by -Wall in C++.

       -Wno-implicit-int (C and Objective-C only)
	   This option controls warnings when a declaration does not specify a type.  This warning is enabled by default, as
	   an error, in C99 and later dialects of C, and also by -Wall.	 The error can be  downgraded  to  a  warning  using
	   -fpermissive (along with certain other errors), or for this error alone, with -Wno-error=implicit-int.

	   This warning is upgraded to an error by -pedantic-errors.

       -Wno-implicit-function-declaration (C and Objective-C only)
	   This option controls warnings when a function is used before being declared.	 This warning is enabled by default,
	   as  an  error, in C99 and later dialects of C, and also by -Wall.  The error can be downgraded to a warning using
	   -fpermissive	   (along    with    certain	other	 errors),    or	   for	  this	   error     alone,	with
	   -Wno-error=implicit-function-declaration.

	   This warning is upgraded to an error by -pedantic-errors.

       -Wimplicit (C and Objective-C only)
	   Same as -Wimplicit-int and -Wimplicit-function-declaration.	This warning is enabled by -Wall.

       -Whardened
	   Warn	 when  -fhardened  did	not  enable  an option from its set (for which see -fhardened).	 For instance, using
	   -fhardened and -fstack-protector at the same	 time  on  the	command	 line  causes  -Whardened  to  warn  because
	   -fstack-protector-strong will not be enabled by -fhardened.

	   This warning is enabled by default and has effect only when -fhardened is enabled.

       -Wimplicit-fallthrough
	   -Wimplicit-fallthrough  is  the  same  as  -Wimplicit-fallthrough=3	and -Wno-implicit-fallthrough is the same as
	   -Wimplicit-fallthrough=0.

       -Wimplicit-fallthrough=n
	   Warn when a switch case falls through.  For example:

		   switch (cond)
		     {
		     case 1:
		       a = 1;
		       break;
		     case 2:
		       a = 2;
		     case 3:
		       a = 3;
		       break;
		     }

	   This warning does not warn when the last statement of a case cannot fall through, e.g. when	there  is  a  return
	   statement  or  a  call to function declared with the noreturn attribute.  -Wimplicit-fallthrough= also takes into
	   account control flow statements, such as ifs, and only warns when appropriate.  E.g.

		   switch (cond)
		     {
		     case 1:
		       if (i > 3) {
			 bar (5);
			 break;
		       } else if (i < 1) {
			 bar (0);
		       } else
			 return;
		     default:
		       ...
		     }

	   Since there	are  occasions	where  a  switch  case	fall  through  is  desirable,  GCC  provides  an  attribute,
	   "__attribute__  ((fallthrough))",  that  is	to be used along with a null statement to suppress this warning that
	   would normally occur:

		   switch (cond)
		     {
		     case 1:
		       bar (0);
		       __attribute__ ((fallthrough));
		     default:
		       ...
		     }

	   C++17 and C23 provide a standard way to suppress  the  -Wimplicit-fallthrough  warning  using  "[[fallthrough]];"
	   instead of the GNU attribute.  In C++11 or C++14 users can use "[[gnu::fallthrough]];", which is a GNU extension.
	   Instead  of these attributes, it is also possible to add a fallthrough comment to silence the warning.  The whole
	   body of the C or C++ style comment should match the given regular expressions listed below.	The option  argument
	   n specifies what kind of comments are accepted:

	   *<-Wimplicit-fallthrough=0 disables the warning altogether.>
	   *<-Wimplicit-fallthrough=1 matches ".*" regular>
	       expression, any comment is used as fallthrough comment.

	   *<-Wimplicit-fallthrough=2 case insensitively matches>
	       ".*falls?[ \t-]*thr(ough|u).*" regular expression.

	   *<-Wimplicit-fallthrough=3 case sensitively matches one of the>
	       following regular expressions:

	       *<"-fallthrough">
	       *<"@fallthrough@">
	       *<"lint -fallthrough[ \t]*">
	       *<"[ \t.!]*(ELSE,? |INTENTIONAL(LY)? )?FALL(S | |-)?THR(OUGH|U)[ \t.!]*(-[^\n\r]*)?">
	       *<"[ \t.!]*(Else,? |Intentional(ly)? )?Fall((s | |-)[Tt]|t)hr(ough|u)[ \t.!]*(-[^\n\r]*)?">
	       *<"[ \t.!]*([Ee]lse,? |[Ii]ntentional(ly)? )?fall(s | |-)?thr(ough|u)[ \t.!]*(-[^\n\r]*)?">
	   *<-Wimplicit-fallthrough=4 case sensitively matches one of the>
	       following regular expressions:

	       *<"-fallthrough">
	       *<"@fallthrough@">
	       *<"lint -fallthrough[ \t]*">
	       *<"[ \t]*FALLTHR(OUGH|U)[ \t]*">
	   *<-Wimplicit-fallthrough=5 doesn't recognize any comments as>
	       fallthrough comments, only attributes disable the warning.

	   The	comment needs to be followed after optional whitespace and other comments by "case" or "default" keywords or
	   by a user label that precedes some "case" or "default" label.

		   switch (cond)
		     {
		     case 1:
		       bar (0);
		       /* FALLTHRU */
		     default:
		       ...
		     }

	   The -Wimplicit-fallthrough=3 warning is enabled by -Wextra.

       -Wno-if-not-aligned (C, C++, Objective-C and Objective-C++ only)
	   Control if warnings triggered by the "warn_if_not_aligned"  attribute  should  be  issued.	These  warnings	 are
	   enabled by default.

       -Wignored-qualifiers (C and C++ only)
	   Warn	 if the return type of a function has a type qualifier such as "const".	 For ISO C such a type qualifier has
	   no effect, since the value returned by a function is not an lvalue.	For C++, the warning  is  only	emitted	 for
	   scalar  types  or  "void".  ISO C prohibits qualified "void" return types on function definitions, so such return
	   types always receive a warning even without this option.

	   This warning is also enabled by -Wextra.

       -Wno-ignored-attributes (C and C++ only)
	   This option controls warnings when an attribute is ignored.	This is different from the  -Wattributes  option  in
	   that	 it warns whenever the compiler decides to drop an attribute, not that the attribute is either unknown, used
	   in a wrong place, etc.  This warning is enabled by default.

       -Wmain
	   Warn if the type of "main" is suspicious.  "main" should be a function  with	 external  linkage,  returning	int,
	   taking  either  zero arguments, two, or three arguments of appropriate types.  This warning is enabled by default
	   in C++ and is enabled by either -Wall or -Wpedantic.

	   This warning is upgraded to an error by -pedantic-errors.

       -Wmisleading-indentation (C and C++ only)
	   Warn when the indentation of the code does not reflect the block structure.	Specifically, a	 warning  is  issued
	   for	"if",  "else",	"while", and "for" clauses with a guarded statement that does not use braces, followed by an
	   unguarded statement with the same indentation.

	   In the following example, the call to "bar"	is  misleadingly  indented  as	if  it	were  guarded  by  the	"if"
	   conditional.

		     if (some_condition ())
		       foo ();
		       bar ();	/* Gotcha: this is not guarded by the "if".  */

	   In  the case of mixed tabs and spaces, the warning uses the -ftabstop= option to determine if the statements line
	   up (defaulting to 8).

	   The warning is not issued for code involving multiline preprocessor logic such as the following example.

		     if (flagA)
		       foo (0);
		   #if SOME_CONDITION_THAT_DOES_NOT_HOLD
		     if (flagB)
		   #endif
		       foo (1);

	   The warning is not issued after a "#line" directive, since this typically indicates autogenerated  code,  and  no
	   assumptions can be made about the layout of the file that the directive references.

	   This warning is enabled by -Wall in C and C++.

       -Wmissing-attributes
	   Warn	 when a declaration of a function is missing one or more attributes that a related function is declared with
	   and whose absence may adversely affect the correctness or efficiency of generated code.  For example, the warning
	   is issued for declarations of aliases that use attributes to specify less restrictive requirements than those  of
	   their   targets.    This   typically	  represents   a  potential  optimization  opportunity.	  By  contrast,	 the
	   -Wattribute-alias=2 option controls warnings issued when the alias is more restrictive  than	 the  target,  which
	   could  lead	to  incorrect  code  generation.  Attributes considered include "alloc_align", "alloc_size", "cold",
	   "const",  "hot",  "leaf",  "malloc",	  "nonnull",   "noreturn",   "nothrow",	  "pure",   "returns_nonnull",	 and
	   "returns_twice".

	   In  C++,  the  warning  is  issued  when an explicit specialization of a primary template declared with attribute
	   "alloc_align", "alloc_size", "assume_aligned", "format", "format_arg", "malloc", or "nonnull" is declared without
	   it.	Attributes "deprecated", "error", and "warning" suppress the warning..

	   You can use the "copy" attribute to apply the same set  of  attributes  to  a  declaration  as  that	 on  another
	   declaration	without	 explicitly  enumerating  the  attributes.  This attribute can be applied to declarations of
	   functions, variables, or types.

	   -Wmissing-attributes is enabled by -Wall.

	   For example, since the declaration of the primary function template below makes use of  both	 attribute  "malloc"
	   and	"alloc_size"  the  declaration	of  the	 explicit  specialization of the template is diagnosed because it is
	   missing one of the attributes.

		   template 
		   T* __attribute__ ((malloc, alloc_size (1)))
		   allocate (size_t);

		   template <>
		   void* __attribute__ ((malloc))   // missing alloc_size
		   allocate (size_t);

       -Wmissing-braces
	   Warn if an aggregate or union initializer is not fully bracketed.  In the following example, the initializer	 for
	   "a" is not fully bracketed, but that for "b" is fully bracketed.

		   int a[2][2] = { 0, 1, 2, 3 };
		   int b[2][2] = { { 0, 1 }, { 2, 3 } };

	   This warning is enabled by -Wall.

       -Wmissing-include-dirs (C, C++, Objective-C, Objective-C++ and Fortran only)
	   Warn	 if  a	user-supplied  include	directory  does	 not  exist.  This option is disabled by default for C, C++,
	   Objective-C and Objective-C++. For Fortran, it is partially enabled by default by warning for -I and -J, only.

       -Wno-missing-profile
	   This option controls warnings if feedback profiles are missing when using the -fprofile-use option.	This  option
	   diagnoses  those  cases where a new function or a new file is added between compiling with -fprofile-generate and
	   with -fprofile-use, without regenerating the profiles.  In these cases, the profile feedback data  files  do	 not
	   contain  any	 profile  feedback information for the newly added function or file respectively.  Also, in the case
	   when profile count data (.gcda) files are removed, GCC cannot use any profile feedback information.	In all these
	   cases, warnings are issued to inform you that a profile generation step is due.  Ignoring the warning can  result
	   in  poorly  optimized code.	-Wno-missing-profile can be used to disable the warning, but this is not recommended
	   and should be done only when non-existent profile data is justified.

       -Wmismatched-dealloc
	   Warn for calls to deallocation functions with pointer arguments returned from allocation functions for which	 the
	   former  isn't  a  suitable  deallocator.   A	 pair  of  functions  can  be  associated as matching allocators and
	   deallocators by use of attribute "malloc".  Unless disabled by the -fno-builtin  option  the	 standard  functions
	   "calloc", "malloc", "realloc", and "free", as well as the corresponding forms of C++ "operator new" and "operator
	   delete"  are implicitly associated as matching allocators and deallocators.	In the following example "mydealloc"
	   is the deallocator for pointers returned from "myalloc".

		   void mydealloc (void*);

		   __attribute__ ((malloc (mydealloc, 1))) void*
		   myalloc (size_t);

		   void f (void)
		   {
		     void *p = myalloc (32);
		     // ...use p...
		     free (p);	 // warning: not a matching deallocator for myalloc
		     mydealloc (p);   // ok
		   }

	   In C++, the related option -Wmismatched-new-delete  diagnoses  mismatches  involving	 either	 "operator  new"  or
	   "operator delete".

	   Option -Wmismatched-dealloc is included in -Wall.

       -Wmultistatement-macros
	   Warn	 about	unsafe	multiple statement macros that appear to be guarded by a clause such as "if", "else", "for",
	   "switch", or "while", in which only the first statement is actually guarded after the macro is expanded.

	   For example:

		   #define DOIT x++; y++
		   if (c)
		     DOIT;

	   will increment "y" unconditionally, not just when "c" holds.	 The can usually be fixed by wrapping the macro in a
	   do-while loop:

		   #define DOIT do { x++; y++; } while (0)
		   if (c)
		     DOIT;

	   This warning is enabled by -Wall in C and C++.

       -Wparentheses
	   Warn if parentheses are omitted in certain contexts, such as when there is an assignment in	a  context  where  a
	   truth value is expected, or when operators are nested whose precedence people often get confused about.

	   Also	 warn  if  a  comparison  like	"x<=y<=z"  appears;  this is equivalent to "(x<=y ? 1 : 0) <= z", which is a
	   different interpretation from that of ordinary mathematical notation.

	   Also warn for dangerous uses of the GNU extension to "?:" with omitted middle operand. When the condition in	 the
	   "?":	 operator is a boolean expression, the omitted value is always 1.  Often programmers expect it to be a value
	   computed inside the conditional expression instead.

	   For C++ this also warns for some cases of unnecessary parentheses in declarations, which can indicate an  attempt
	   at a function call instead of a declaration:

		   {
		     // Declares a local variable called mymutex.
		     std::unique_lock (mymutex);
		     // User meant std::unique_lock lock (mymutex);
		   }

	   This warning is enabled by -Wall.

       -Wno-self-move (C++ and Objective-C++ only)
	   This warning warns when a value is moved to itself with "std::move".	 Such a "std::move" typically has no effect.

		   struct T {
		   ...
		   };
		   void fn()
		   {
		     T t;
		     ...
		     t = std::move (t);
		   }

	   This warning is enabled by -Wall.

       -Wsequence-point
	   Warn	 about code that may have undefined semantics because of violations of sequence point rules in the C and C++
	   standards.

	   The C and C++ standards define the order in which expressions in a  C/C++  program  are  evaluated  in  terms  of
	   sequence points, which represent a partial ordering between the execution of parts of the program: those executed
	   before  the	sequence  point, and those executed after it.  These occur after the evaluation of a full expression
	   (one which is not part of a larger expression), after the evaluation of the first operand of a "&&", "||", "?  :"
	   or  ","  (comma)  operator,	before	a  function  is	 called	 (but  after the evaluation of its arguments and the
	   expression denoting the called function), and in certain other places.  Other than as expressed by  the  sequence
	   point  rules,  the  order  of  evaluation  of  subexpressions of an expression is not specified.  All these rules
	   describe only a partial order rather than a total order, since, for example, if two functions are  called  within
	   one expression with no sequence point between them, the order in which the functions are called is not specified.
	   However, the standards committee have ruled that function calls do not overlap.

	   It  is  not	specified when between sequence points modifications to the values of objects take effect.  Programs
	   whose behavior depends on this have undefined behavior; the	C  and	C++  standards	specify	 that  "Between	 the
	   previous and next sequence point an object shall have its stored value modified at most once by the evaluation of
	   an  expression.   Furthermore,  the	prior  value shall be read only to determine the value to be stored.".	If a
	   program breaks these rules, the results on any particular implementation are entirely unpredictable.

	   Examples of code with undefined behavior are "a  =  a++;",  "a[n]  =	 b[n++]"  and  "a[i++]	=  i;".	  Some	more
	   complicated	cases  are not diagnosed by this option, and it may give an occasional false positive result, but in
	   general it has been found fairly effective at detecting this sort of problem in programs.

	   The C++17 standard will define the order of evaluation of operands in more cases: in particular it requires	that
	   the	right-hand side of an assignment be evaluated before the left-hand side, so the above examples are no longer
	   undefined.  But this option will still warn about them, to help people avoid writing code that is undefined in  C
	   and earlier revisions of C++.

	   The standard is worded confusingly, therefore there is some debate over the precise meaning of the sequence point
	   rules  in subtle cases.  Links to discussions of the problem, including proposed formal definitions, may be found
	   on the GCC readings page, at .

	   This warning is enabled by -Wall for C and C++.

       -Wno-return-local-addr
	   Do not warn about returning a pointer (or in C++, a reference) to a variable that goes out  of  scope  after	 the
	   function returns.

       -Wreturn-mismatch
	   Warn	 about	return statements without an expressions in functions which do not return "void".  Also warn about a
	   "return" statement with an expression in a function whose return type is "void", unless the	expression  type  is
	   also "void".	 As a GNU extension, the latter case is accepted without a warning unless -Wpedantic is used.

	   Attempting  to use the return value of a non-"void" function other than "main" that flows off the end by reaching
	   the closing curly brace that terminates the function is undefined.

	   This warning is specific to C and enabled by default.  In C99 and later language dialects, it is  treated  as  an
	   error.   It	can  be	 downgraded  to	 a  warning using -fpermissive (along with other warnings), or for just this
	   warning, with -Wno-error=return-mismatch.

       -Wreturn-type
	   Warn whenever a function is defined with a return type that defaults to "int" (unless -Wimplicit-int	 is  active,
	   which  takes precedence).  Also warn if execution may reach the end of the function body, or if the function does
	   not contain any return statement at all.

	   Attempting to use the return value of a non-"void" function other than "main" that flows off the end by  reaching
	   the closing curly brace that terminates the function is undefined.

	   Unlike in C, in C++, flowing off the end of a non-"void" function other than "main" results in undefined behavior
	   even when the value of the function is not used.

	   This warning is enabled by default in C++ and by -Wall otherwise.

       -Wno-shift-count-negative
	   Controls warnings if a shift count is negative.  This warning is enabled by default.

       -Wno-shift-count-overflow
	   Controls  warnings  if  a  shift  count  is	greater than or equal to the bit width of the type.  This warning is
	   enabled by default.

       -Wshift-negative-value
	   Warn if left shifting a negative value.  This warning is enabled by -Wextra in C99 (and newer) and C++11 to C++17
	   modes.

       -Wno-shift-overflow
       -Wshift-overflow=n
	   These options control warnings about left shift overflows.

	   -Wshift-overflow=1
	       This is the warning level of -Wshift-overflow and is enabled by default in C99 and C++11 modes  (and  newer).
	       This  warning  level does not warn about left-shifting 1 into the sign bit.  (However, in C, such an overflow
	       is still rejected in contexts where an integer constant expression is required.)	 No warning  is	 emitted  in
	       C++20 mode (and newer), as signed left shifts always wrap.

	   -Wshift-overflow=2
	       This  warning  level  also  warns  about	 left-shifting	1 into the sign bit, unless C++14 mode (or newer) is
	       active.

       -Wswitch
	   Warn whenever a "switch" statement has an index of enumerated type and lacks a "case" for  one  or  more  of	 the
	   named  codes of that enumeration.  (The presence of a "default" label prevents this warning.)  "case" labels that
	   do not correspond to enumerators also provoke warnings when this option is used, unless the enumeration is marked
	   with the "flag_enum" attribute.  This warning is enabled by -Wall.

       -Wswitch-default
	   Warn whenever a "switch" statement does not have a "default" case.

       -Wswitch-enum
	   Warn whenever a "switch" statement has an index of enumerated type and lacks a "case" for  one  or  more  of	 the
	   named  codes of that enumeration.  "case" labels that do not correspond to enumerators also provoke warnings when
	   this option is used, unless the enumeration is marked  with	the  "flag_enum"  attribute.   The  only  difference
	   between  -Wswitch  and  this option is that this option gives a warning about an omitted enumeration code even if
	   there is a "default" label.

       -Wno-switch-bool
	   Do not warn when a "switch" statement has an index of boolean type and the case values are outside the range of a
	   boolean type.  It is possible to suppress this warning by casting the controlling expression to a type other than
	   "bool".  For example:

		   switch ((int) (a == 4))
		     {
		     ...
		     }

	   This warning is enabled by default for C and C++ programs.

       -Wno-switch-outside-range
	   This option controls warnings when a "switch" case has a value that is outside  of  its  respective	type  range.
	   This warning is enabled by default for C and C++ programs.

       -Wno-switch-unreachable
	   Do  not  warn when a "switch" statement contains statements between the controlling expression and the first case
	   label, which will never be executed.	 For example:

		   switch (cond)
		     {
		      i = 15;
		     ...
		      case 5:
		     ...
		     }

	   -Wswitch-unreachable does not warn if the statement between the controlling expression and the first	 case  label
	   is just a declaration:

		   switch (cond)
		     {
		      int i;
		     ...
		      case 5:
		      i = 5;
		     ...
		     }

	   This warning is enabled by default for C and C++ programs.

       -Wsync-nand (C and C++ only)
	   Warn	 when  "__sync_fetch_and_nand"	and  "__sync_nand_and_fetch"  built-in	functions are used.  These functions
	   changed semantics in GCC 4.4.

       -Wtrivial-auto-var-init
	   Warn when "-ftrivial-auto-var-init" cannot initialize the automatic variable.  A common situation is an automatic
	   variable that is declared between the controlling expression and the first case label of a "switch" statement.

       -Wunused-but-set-parameter
	   Warn whenever a function parameter is assigned to, but otherwise unused (aside from its declaration).

	   To suppress this warning use the "unused" attribute.

	   This warning is also enabled by -Wunused together with -Wextra.

       -Wunused-but-set-variable
	   Warn whenever a local variable is assigned to, but otherwise unused (aside from its declaration).   This  warning
	   is enabled by -Wall.

	   To suppress this warning use the "unused" attribute.

	   This warning is also enabled by -Wunused, which is enabled by -Wall.

       -Wunused-function
	   Warn	 whenever  a  static  function	is declared but not defined or a non-inline static function is unused.	This
	   warning is enabled by -Wall.

       -Wunused-label
	   Warn whenever a label is declared but not used.  This warning is enabled by -Wall.

	   To suppress this warning use the "unused" attribute.

       -Wunused-local-typedefs (C, Objective-C, C++ and Objective-C++ only)
	   Warn when a typedef locally defined in a function is not used.  This warning is enabled by -Wall.

       -Wunused-parameter
	   Warn whenever a function parameter is unused	 aside	from  its  declaration.	  This	option	is  not	 enabled  by
	   "-Wunused" unless "-Wextra" is also specified.

	   To suppress this warning use the "unused" attribute.

       -Wno-unused-result
	   Do  not  warn if a caller of a function marked with attribute "warn_unused_result" does not use its return value.
	   The default is -Wunused-result.

       -Wunused-variable
	   Warn	 whenever  a  local  or	 static	 variable  is  unused  aside  from  its	 declaration.  This  option  implies
	   -Wunused-const-variable=1 for C, but not for C++. This warning is enabled by -Wall.

	   To suppress this warning use the "unused" attribute.

       -Wunused-const-variable
       -Wunused-const-variable=n
	   Warn whenever a constant static variable is unused aside from its declaration.

	   To suppress this warning use the "unused" attribute.

	   -Wunused-const-variable=1
	       Warn  about  unused  static  const variables defined in the main compilation unit, but not about static const
	       variables declared in any header included.

	       -Wunused-const-variable=1 is enabled by either -Wunused-variable or -Wunused for C, but not  for	 C++.  In  C
	       this  declares  variable	 storage,  but	in  C++ this is not an error since const variables take the place of
	       "#define"s.

	   -Wunused-const-variable=2
	       This warning level also warns for unused constant static variables in headers (excluding system headers).  It
	       is equivalent to the short form -Wunused-const-variable.	 This level must be explicitly requested in  both  C
	       and C++ because it might be hard to clean up all headers included.

       -Wunused-value
	   Warn whenever a statement computes a result that is explicitly not used. To suppress this warning cast the unused
	   expression  to  "void".  This  includes  an expression-statement or the left-hand side of a comma expression that
	   contains no side effects. For example, an expression such as "x[i,j]" causes a warning, while "x[(void)i,j]" does
	   not.

	   This warning is enabled by -Wall.

       -Wunused
	   All the above -Wunused options combined, except those documented as needing to be specified explicitly.

	   In order to get a warning about an unused function parameter, you must either specify -Wextra -Wunused (note that
	   -Wall implies -Wunused), or separately specify -Wunused-parameter and/or -Wunused-but-set-parameter.

	   -Wunused enables only -Wunused-const-variable=1 rather than -Wunused-const-variable, and only for C, not C++.

       -Wuse-after-free (C, Objective-C, C++ and Objective-C++ only)
       -Wuse-after-free=n
	   Warn about uses of pointers to dynamically allocated objects that have been rendered indeterminate by a call to a
	   deallocation function.  The warning is enabled at all optimization levels but may yield  different  results	with
	   optimization than without.

	   -Wuse-after-free=1
	       At  level  1  the  warning  attempts  to diagnose only unconditional uses of pointers made indeterminate by a
	       deallocation call or a successful call to "realloc", regardless of whether or not the  call  resulted  in  an
	       actual  reallocation  of	 memory.   This	 includes  double-"free"  calls	 as  well  as uses in arithmetic and
	       relational expressions.	Although undefined, uses of  indeterminate  pointers  in  equality  (or	 inequality)
	       expressions are not diagnosed at this level.

	   -Wuse-after-free=2
	       At  level  2, in addition to unconditional uses, the warning also diagnoses conditional uses of pointers made
	       indeterminate by a deallocation call.  As at level 2, uses in equality (or inequality)  expressions  are	 not
	       diagnosed.  For example, the second call to "free" in the following function is diagnosed at this level:

		       struct A { int refcount; void *data; };

		       void release (struct A *p)
		       {
			 int refcount = --p->refcount;
			 free (p);
			 if (refcount == 0)
			   free (p->data);   // warning: p may be used after free
		       }

	   -Wuse-after-free=3
	       At  level  3, the warning also diagnoses uses of indeterminate pointers in equality expressions.	 All uses of
	       indeterminate pointers are undefined but equality tests sometimes appear	 after	calls  to  "realloc"  as  an
	       attempt	to  determine  whether	the call resulted in relocating the object to a different address.  They are
	       diagnosed at a separate level to aid gradually transitioning legacy code to safe alternatives.  For  example,
	       the equality test in the function below is diagnosed at this level:

		       void adjust_pointers (int**, int);

		       void grow (int **p, int n)
		       {
			 int **q = (int**)realloc (p, n *= 2);
			 if (q == p)
			   return;
			 adjust_pointers ((int**)q, n);
		       }

	       To  avoid  the warning at this level, store offsets into allocated memory instead of pointers.  This approach
	       obviates needing to adjust the stored pointers after reallocation.

	   -Wuse-after-free=2 is included in -Wall.

       -Wuseless-cast (C, Objective-C, C++ and Objective-C++ only)
	   Warn when an expression is cast to its own type.  This warning does not occur when a class object is converted to
	   a non-reference type as that is a way to create a temporary:

		   struct S { };
		   void g (S&&);
		   void f (S&& arg)
		   {
		     g (S(arg)); // make arg prvalue so that it can bind to S&&
		   }

       -Wuninitialized
	   Warn if an object with automatic or allocated storage duration is used without having been initialized.  In	C++,
	   also warn if a non-static reference or non-static "const" member appears in a class without constructors.

	   In  addition,  passing  a  pointer  (or  in	C++,  a reference) to an uninitialized object to a "const"-qualified
	   argument  of	 a  built-in  function	known  to  read	 the   object	is   also   diagnosed	by   this   warning.
	   (-Wmaybe-uninitialized is issued for ordinary functions.)

	   If  you want to warn about code that uses the uninitialized value of the variable in its own initializer, use the
	   -Winit-self option.

	   These warnings occur for individual uninitialized elements of structure, union or array variables as well as	 for
	   variables  that  are	 uninitialized as a whole.  They do not occur for variables or elements declared "volatile".
	   Because these warnings depend on optimization, the exact variables or  elements  for	 which	there  are  warnings
	   depend on the precise optimization options and version of GCC used.

	   Note	 that  there  may  be  no warning about a variable that is used only to compute a value that itself is never
	   used, because such computations may be deleted by data flow analysis before the warnings are printed.

	   In C++, this warning also warns about using uninitialized objects in member-initializer-lists.  For example,	 GCC
	   warns about "b" being uninitialized in the following snippet:

		   struct A {
		     int a;
		     int b;
		     A() : a(b) { }
		   };

       -Wno-invalid-memory-model
	   This	 option	 controls warnings for invocations of __atomic Builtins, __sync Builtins, and the C11 atomic generic
	   functions with a memory consistency argument that is either invalid for the operation or  outside  the  range  of
	   values  of the "memory_order" enumeration.  For example, since the "__atomic_store" and "__atomic_store_n" built-
	   ins are only defined for the relaxed, release, and sequentially consistent memory orders the	 following  code  is
	   diagnosed:

		   void store (int *i)
		   {
		     __atomic_store_n (i, 0, memory_order_consume);
		   }

	   -Winvalid-memory-model is enabled by default.

       -Wmaybe-uninitialized
	   For	an  object with automatic or allocated storage duration, if there exists a path from the function entry to a
	   use of the object that is initialized, but there exist some other paths for which the object is not	initialized,
	   the compiler emits a warning if it cannot prove the uninitialized paths are not executed at run time.

	   In  addition,  passing  a  pointer  (or  in	C++,  a reference) to an uninitialized object to a "const"-qualified
	   function argument is also diagnosed by this warning.	 (-Wuninitialized is issued for built-in functions known  to
	   read	 the object.)  Annotating the function with attribute "access (none)" indicates that the argument isn't used
	   to access the object and avoids the warning.

	   These warnings are only possible in optimizing compilation, because otherwise GCC does  not	keep  track  of	 the
	   state of variables.

	   These  warnings  are	 made optional because GCC may not be able to determine when the code is correct in spite of
	   appearing to have an error.	Here is one example of how this can happen:

		   {
		     int x;
		     switch (y)
		       {
		       case 1: x = 1;
			 break;
		       case 2: x = 4;
			 break;
		       case 3: x = 5;
		       }
		     foo (x);
		   }

	   If the value of "y" is always 1, 2 or 3, then "x" is always initialized, but GCC doesn't know this.	To  suppress
	   the warning, you need to provide a default case with assert(0) or similar code.

	   This	 option	 also  warns  when  a  non-volatile automatic variable might be changed by a call to "longjmp".	 The
	   compiler sees only the calls to "setjmp".  It cannot know where "longjmp" will  be  called;	in  fact,  a  signal
	   handler could call it at any point in the code.  As a result, you may get a warning even when there is in fact no
	   problem because "longjmp" cannot in fact be called at the place that would cause a problem.

	   Some spurious warnings can be avoided if you declare all the functions you use that never return as "noreturn".

	   This warning is enabled by -Wall or -Wextra.

       -Wunknown-pragmas
	   Warn	 when  a  "#pragma"  directive is encountered that is not understood by GCC.  If this command-line option is
	   used, warnings are even issued for unknown pragmas in system header files.  This is not the case if the  warnings
	   are only enabled by the -Wall command-line option.

       -Wno-pragmas
	   Do not warn about misuses of pragmas, such as incorrect parameters, invalid syntax, or conflicts between pragmas.
	   See also -Wunknown-pragmas.

       -Wno-pragma-once-outside-header
	   Do not warn when "#pragma once" is used in a file that is not a header file, such as a main file.

       -Wno-prio-ctor-dtor
	   Do  not  warn  if  a	 priority  from	 0 to 100 is used for constructor or destructor.  The use of constructor and
	   destructor attributes allow you to assign a priority to  the	 constructor/destructor	 to  control  its  order  of
	   execution  before  "main"  is  called  or  after it returns.	 The priority values must be greater than 100 as the
	   compiler reserves priority values between 0--100 for the implementation.

       -Wstrict-aliasing
	   This option is only active when -fstrict-aliasing is active.	 It warns about code that  might  break	 the  strict
	   aliasing  rules  that  the  compiler	 is  using for optimization.  The warning does not catch all cases, but does
	   attempt to catch the more common pitfalls.  It is included in -Wall.	 It is equivalent to -Wstrict-aliasing=3

       -Wstrict-aliasing=n
	   This option is only active when -fstrict-aliasing is active.	 It warns about code that  might  break	 the  strict
	   aliasing  rules  that the compiler is using for optimization.  Higher levels correspond to higher accuracy (fewer
	   false positives).  Higher levels also correspond to more effort, similar to the way -O works.   -Wstrict-aliasing
	   is equivalent to -Wstrict-aliasing=3.

	   Level  1:  Most  aggressive,	 quick,	 least	accurate.   Possibly  useful  when  higher  levels  do	not warn but
	   -fstrict-aliasing still breaks the code, as it has  very  few  false	 negatives.   However,	it  has	 many  false
	   positives.	Warns  for  all pointer conversions between possibly incompatible types, even if never dereferenced.
	   Runs in the front end only.

	   Level 2: Aggressive, quick, not too precise.	 May still have many  false  positives	(not  as  many	as  level  1
	   though), and few false negatives (but possibly more than level 1).  Unlike level 1, it only warns when an address
	   is taken.  Warns about incomplete types.  Runs in the front end only.

	   Level  3 (default for -Wstrict-aliasing): Should have very few false positives and few false negatives.  Slightly
	   slower than levels 1 or 2 when optimization is enabled.  Takes care of the common pun+dereference pattern in	 the
	   front  end:	"*(int*)&some_float".  If optimization is enabled, it also runs in the back end, where it deals with
	   multiple statement cases using flow-sensitive points-to information.	 Only warns when the  converted	 pointer  is
	   dereferenced.  Does not warn about incomplete types.

       -Wstrict-overflow
       -Wstrict-overflow=n
	   This	 option is only active when signed overflow is undefined.  It warns about cases where the compiler optimizes
	   based on the assumption that signed overflow does not occur.	 Note that it does not warn about  all	cases  where
	   the	code  might  overflow: it only warns about cases where the compiler implements some optimization.  Thus this
	   warning depends on the optimization level.

	   An optimization that assumes that signed overflow does not occur is perfectly safe if the values of the variables
	   involved are such that overflow never does, in fact, occur.	Therefore this	warning	 can  easily  give  a  false
	   positive:  a	 warning  about	 code  that  is	 not actually a problem.  To help focus on important issues, several
	   warning levels are defined.	No warnings are issued for the use of undefined signed overflow when estimating	 how
	   many iterations a loop requires, in particular when determining whether a loop will be executed at all.

	   -Wstrict-overflow=1
	       Warn  about cases that are both questionable and easy to avoid.	For example the compiler simplifies "x + 1 >
	       x" to 1.	 This level of -Wstrict-overflow is enabled by -Wall; higher levels are not, and must be  explicitly
	       requested.

	   -Wstrict-overflow=2
	       Also  warn  about  other	 cases where a comparison is simplified to a constant.	For example: "abs (x) >= 0".
	       This can only be simplified when signed integer overflow is undefined, because "abs (INT_MIN)"  overflows  to
	       "INT_MIN", which is less than zero.  -Wstrict-overflow (with no level) is the same as -Wstrict-overflow=2.

	   -Wstrict-overflow=3
	       Also warn about other cases where a comparison is simplified.  For example: "x + 1 > 1" is simplified to "x >
	       0".

	   -Wstrict-overflow=4
	       Also  warn  about  other	 simplifications  not  covered	by  the above cases.  For example: "(x * 10) / 5" is
	       simplified to "x * 2".

	   -Wstrict-overflow=5
	       Also warn about cases where the compiler reduces the magnitude of a constant involved in a  comparison.	 For
	       example:	 "x  +	2  >  y"  is simplified to "x + 1 >= y".  This is reported only at the highest warning level
	       because this simplification applies to many comparisons, so this warning level gives a very large  number  of
	       false positives.

       -Wstring-compare
	   Warn	 for  calls  to "strcmp" and "strncmp" whose result is determined to be either zero or non-zero in tests for
	   such equality owing to the length of one argument being greater than the size of the array the other argument  is
	   stored  in  (or  the	 bound	in  the case of "strncmp").  Such calls could be mistakes.  For example, the call to
	   "strcmp" below is diagnosed because its result is necessarily non-zero irrespective of the contents of the  array
	   "a".

		   extern char a[4];
		   void f (char *d)
		   {
		     strcpy (d, "string");
		     ...
		     if (0 == strcmp (a, d))   // cannot be true
		       puts ("a and d are the same");
		   }

	   -Wstring-compare is enabled by -Wextra.

       -Wno-stringop-overflow
       -Wstringop-overflow
       -Wstringop-overflow=type
	   Warn	 for  code  that can be statically determined to cause buffer overflows or memory overruns, such as calls to
	   "memcpy" and "strcpy" that overflow the destination buffer.	The optional argument is one greater than  the	type
	   of Object Size Checking to perform to determine the size of the destination.	 The argument is meaningful only for
	   string functions that operate on character arrays; raw memory functions like "memcpy" always use type-zero Object
	   Size Checking.

	   The option also warns for calls that specify a size in excess of the largest possible object or at most "SIZE_MAX
	   / 2" bytes.

	   The	option	produces  the  best results with optimization enabled but can detect a small subset of simple buffer
	   overflows even without optimization	in  calls  to  the  GCC	 built-in  functions  like  "__builtin_memcpy"	that
	   correspond  to  the	standard  functions.   In any case, the option warns about just a subset of buffer overflows
	   detected by the corresponding overflow checking built-ins, such as "__builtin___memcpy_chk",	 which	can  perform
	   run-time checking if the access cannot be identified as safe at compile time.

	   For example, the option issues a warning for the "strcpy" call below because it copies at least 5 characters (the
	   string "blue" including the terminating NUL) into the buffer of size 4.

		   enum Color { blue, purple, yellow };
		   const char* f (enum Color clr)
		   {
		     static char buf [4];
		     const char *str;
		     switch (clr)
		       {
			 case blue: str = "blue"; break;
			 case purple: str = "purple"; break;
			 case yellow: str = "yellow"; break;
		       }

		     return strcpy (buf, str);	 // warning here
		   }

	   The	effect of this option is not limited to string or memory manipulation functions.  In this example, a warning
	   is diagnosed because a 1-element array is passed to a function requiring at least a 4-element array argument:

		   void f (int[static 4]);

		   void g (void)
		   {
		     int *p = (int *) malloc (1 * sizeof(int));
		     f (p);   // warning here
		   }

	   Option -Wstringop-overflow=2 is enabled by default.

	   -Wstringop-overflow
	   -Wstringop-overflow=1
	       The -Wstringop-overflow=1 option uses type-zero Object Size Checking to determine the  sizes  of	 destination
	       objects.	  At  this  setting the option does not warn for writes past the end of subobjects of larger objects
	       accessed by pointers unless the size of the largest surrounding object is known.	 When the destination may be
	       one of several objects it is assumed to be the largest one of them.  On Linux systems, when  optimization  is
	       enabled	at this setting the option warns for the same code as when the "_FORTIFY_SOURCE" macro is defined to
	       a non-zero value.

	   -Wstringop-overflow=2
	       The -Wstringop-overflow=2 option uses type-one Object Size Checking to determine	 the  sizes  of	 destination
	       objects.	  At  this  setting the option warns about overflows when writing to members of the largest complete
	       objects whose exact size is known.  However, it does not warn for excessive writes to  the  same	 members  of
	       unknown objects referenced by pointers since they may point to arrays containing unknown numbers of elements.
	       This is the default setting of the option.

	   -Wstringop-overflow=3
	       The  -Wstringop-overflow=3  option  uses	 type-two Object Size Checking to determine the sizes of destination
	       objects.	 At this setting the option warns about overflowing the smallest object or data member.	 This is the
	       most restrictive setting of the option that may result in warnings for safe code.

	   -Wstringop-overflow=4
	       The -Wstringop-overflow=4 option uses type-three Object Size Checking to determine the sizes  of	 destination
	       objects.	  At  this  setting the option warns about overflowing any data members, and when the destination is
	       one of several objects it uses the size of the largest  of  them	 to  decide  whether  to  issue	 a  warning.
	       Similarly to -Wstringop-overflow=3 this setting of the option may result in warnings for benign code.

       -Wno-stringop-overread
	   Warn	 for  calls  to string manipulation functions such as "memchr", or "strcpy" that are determined to read past
	   the end of the source sequence.

	   Option -Wstringop-overread is enabled by default.

       -Wno-stringop-truncation
	   Do not warn for calls to bounded string manipulation functions such as "strncat", "strncpy", and  "stpncpy"	that
	   may either truncate the copied string or leave the destination unchanged.

	   In  the  following  example,	 the  call to "strncat" specifies a bound that is less than the length of the source
	   string.  As a result, the copy of the source will be truncated and so  the  call  is	 diagnosed.   To  avoid	 the
	   warning use "bufsize - strlen (buf) - 1)" as the bound.

		   void append (char *buf, size_t bufsize)
		   {
		     strncat (buf, ".txt", 3);
		   }

	   As  another	example, the following call to "strncpy" results in copying to "d" just the characters preceding the
	   terminating NUL, without appending the NUL to the end.  Assuming the result of "strncpy" is	necessarily  a	NUL-
	   terminated string is a common mistake, and so the call is diagnosed.	 To avoid the warning when the result is not
	   expected to be NUL-terminated, call "memcpy" instead.

		   void copy (char *d, const char *s)
		   {
		     strncpy (d, s, strlen (s));
		   }

	   In  the  following  example, the call to "strncpy" specifies the size of the destination buffer as the bound.  If
	   the length of the source string is equal to or greater than this size the result of the copy	 will  not  be	NUL-
	   terminated.	 Therefore, the call is also diagnosed.	 To avoid the warning, specify "sizeof buf - 1" as the bound
	   and set the last element of the buffer to "NUL".

		   void copy (const char *s)
		   {
		     char buf[80];
		     strncpy (buf, s, sizeof buf);
		     ...
		   }

	   In situations where a character array is intended to store a sequence of bytes with no terminating "NUL" such  an
	   array  may be annotated with attribute "nonstring" to avoid this warning.  Such arrays, however, are not suitable
	   arguments to functions that expect "NUL"-terminated strings.	 To help detect accidental misuses  of	such  arrays
	   GCC issues warnings unless it can prove that the use is safe.

       -Wstrict-flex-arrays (C and C++ only)
	   Warn	 about	improper  usages of flexible array members according to the level of the "strict_flex_array (level)"
	   attribute attached to the trailing array field of a structure if it's available, otherwise according to the level
	   of the option -fstrict-flex-arrays=level.	"-Wstrict-flex-arrays" is effective only when level is greater	than
	   0.

	   When	 level=1,  warnings are issued for a trailing array reference of a structure that have 2 or more elements if
	   the trailing array is referenced as a flexible array member.

	   When level=2, in addition to level=1, additional warnings are issued for a trailing one-element  array  reference
	   of a structure if the array is referenced as a flexible array member.

	   When	 level=3,  in addition to level=2, additional warnings are issued for a trailing zero-length array reference
	   of a structure if the array is referenced as a flexible array member.

	   This option is more effective when -ftree-vrp is active (the default for -O2 and above) but some warnings may  be
	   diagnosed even without optimization.

       -Wsuggest-attribute=attribute-name
	   Warn	 for  cases  where adding an attribute may be beneficial. The attribute-names currently supported are listed
	   below.

	   -Wsuggest-attribute=pure
	   -Wsuggest-attribute=const
	   -Wsuggest-attribute=noreturn
	   -Wmissing-noreturn
	   -Wsuggest-attribute=malloc
	   -Wsuggest-attribute=returns_nonnull
	       Warn about functions that might be  candidates  for  attributes	"pure",	 "const",  "noreturn",	"malloc"  or
	       "returns_nonnull".   The compiler only warns for functions visible in other compilation units or (in the case
	       of "pure" and "const") if it cannot prove that the function returns normally. A function returns normally  if
	       it  doesn't  contain  an	 infinite  loop or return abnormally by throwing, calling "abort" or trapping.	This
	       analysis requires option -fipa-pure-const, which is enabled by default at -O and higher.	 Higher optimization
	       levels improve the accuracy of the analysis.

	   -Wsuggest-attribute=format
	   -Wmissing-format-attribute
	       Warn about function pointers that might be candidates for "format" attributes.  Note these are only  possible
	       candidates,  not absolute ones.	GCC guesses that function pointers with "format" attributes that are used in
	       assignment, initialization, parameter passing or return	statements  should  have  a  corresponding  "format"
	       attribute  in  the  resulting type.  I.e. the left-hand side of the assignment or initialization, the type of
	       the parameter variable, or the return type of  the  containing  function	 respectively  should  also  have  a
	       "format" attribute to avoid the warning.

	       GCC also warns about function definitions that might be candidates for "format" attributes.  Again, these are
	       only  possible  candidates.   GCC guesses that "format" attributes might be appropriate for any function that
	       calls a function like "vprintf" or "vscanf", but this might not always be the case, and	some  functions	 for
	       which "format" attributes are appropriate may not be detected.

	   -Wsuggest-attribute=cold
	       Warn  about  functions  that might be candidates for "cold" attribute.  This is based on static detection and
	       generally only warns about functions which always leads to a call to another "cold" function such as wrappers
	       of C++ "throw" or fatal error reporting functions leading to "abort".

       -Walloc-size
	   Warn about calls to allocation functions decorated with attribute "alloc_size" that specify insufficient size for
	   the target type of the pointer the result is assigned to, including those to the built-in forms of the  functions
	   "aligned_alloc", "alloca", "calloc", "malloc", and "realloc".

       -Walloc-zero
	   Warn about calls to allocation functions decorated with attribute "alloc_size" that specify zero bytes, including
	   those  to  the  built-in  forms  of	the  functions "aligned_alloc", "alloca", "calloc", "malloc", and "realloc".
	   Because the behavior of these functions when called with a zero size differs among implementations  (and  in	 the
	   case of "realloc" has been deprecated) relying on it may result in subtle portability bugs and should be avoided.

       -Wcalloc-transposed-args
	   Warn	 about	calls  to  allocation  functions decorated with attribute "alloc_size" with two arguments, which use
	   "sizeof" operator as the earlier size argument and don't use it as the later size argument.	 This  is  a  coding
	   style  warning.  The first argument to "calloc" is documented to be number of elements in array, while the second
	   argument is size of each element, so "calloc (n, sizeof (int))" is preferred over "calloc (sizeof (int), n)".  If
	   "sizeof" in the earlier argument and not the latter is intentional,	the  warning  can  be  suppressed  by  using
	   "calloc  (sizeof  (struct  S)  +  0,	 n)"  or  "calloc (1 * sizeof (struct S), 4)" or using "sizeof" in the later
	   argument as well.

       -Walloc-size-larger-than=byte-size
	   Warn about calls to functions decorated with attribute "alloc_size" that attempt to allocate objects larger	than
	   the	specified  number  of  bytes,  or  where the result of the size computation in an integer type with infinite
	   precision would exceed the value of PTRDIFF_MAX on the target.  -Walloc-size-larger-than=PTRDIFF_MAX	 is  enabled
	   by default.	Warnings controlled by the option can be disabled either by specifying byte-size of SIZE_MAX or more
	   or by -Wno-alloc-size-larger-than.

       -Wno-alloc-size-larger-than
	   Disable  -Walloc-size-larger-than=  warnings.   The	option is equivalent to -Walloc-size-larger-than=SIZE_MAX or
	   larger.

       -Walloca
	   This option warns on all uses of "alloca" in the source.

       -Walloca-larger-than=byte-size
	   This option warns on calls to "alloca" with an integer argument whose value	is  either  zero,  or  that  is	 not
	   bounded  by	a  controlling	predicate  that	 limits	 its value to at most byte-size.  It also warns for calls to
	   "alloca" where the bound value is unknown.  Arguments of non-integer types are considered unbounded even if	they
	   appear to be constrained to the expected range.

	   For example, a bounded case of "alloca" could be:

		   void func (size_t n)
		   {
		     void *p;
		     if (n <= 1000)
		       p = alloca (n);
		     else
		       p = malloc (n);
		     f (p);
		   }

	   In  the above example, passing "-Walloca-larger-than=1000" would not issue a warning because the call to "alloca"
	   is known to be at most 1000 bytes.  However, if "-Walloca-larger-than=500" were passed, the compiler would emit a
	   warning.

	   Unbounded uses, on the other hand, are uses of "alloca" with no controlling predicate  constraining	its  integer
	   argument.  For example:

		   void func ()
		   {
		     void *p = alloca (n);
		     f (p);
		   }

	   If  "-Walloca-larger-than=500"  were passed, the above would trigger a warning, but this time because of the lack
	   of bounds checking.

	   Note, that even seemingly correct code involving signed integers could cause a warning:

		   void func (signed int n)
		   {
		     if (n < 500)
		       {
			 p = alloca (n);
			 f (p);
		       }
		   }

	   In the above example, n could be negative, causing a larger than expected argument to be implicitly cast into the
	   "alloca" call.

	   This option also warns when "alloca" is used in a loop.

	   -Walloca-larger-than=PTRDIFF_MAX is enabled by default but is usually only effective	 when -ftree-vrp  is  active
	   (default for -O2 and above).

	   See also -Wvla-larger-than=byte-size.

       -Wno-alloca-larger-than
	   Disable -Walloca-larger-than= warnings.  The option is equivalent to -Walloca-larger-than=SIZE_MAX or larger.

       -Warith-conversion
	   Do  warn  about  implicit conversions from arithmetic operations even when conversion of the operands to the same
	   type	 cannot	 change	 their	values.	  This	affects	 warnings   from   -Wconversion,   -Wfloat-conversion,	 and
	   -Wsign-conversion.

		   void f (char c, int i)
		   {
		     c = c + i; // warns with B<-Wconversion>
		     c = c + 1; // only warns with B<-Warith-conversion>
		   }

       -Warray-bounds
       -Warray-bounds=n
	   Warn	 about	out  of	 bounds	 subscripts  or	 offsets into arrays.  This warning is enabled by -Wall.  It is more
	   effective when -ftree-vrp is active (the default for -O2 and above) but a subset of	instances  are	issued	even
	   without optimization.

	   By  default,	 the  trailing	array of a structure will be treated as a flexible array member by -Warray-bounds or
	   -Warray-bounds=n if it is declared as either a flexible array member per C99 standard onwards ([]), a  GCC  zero-
	   length  array  extension  ([0]),  or an one-element array ([1]). As a result, out of bounds subscripts or offsets
	   into zero-length arrays or one-element arrays are not warned by default.

	   You can add the option -fstrict-flex-arrays or  -fstrict-flex-arrays=level  to  control  how	 this  option  treat
	   trailing array of a structure as a flexible array member:

	   when level<=1, no change to the default behavior.

	   when level=2, additional warnings will be issued for out of bounds subscripts or offsets into one-element arrays;

	   when	 level=3, in addition to level=2, additional warnings will be issued for out of bounds subscripts or offsets
	   into zero-length arrays.

	   -Warray-bounds=1
	       This is the default warning level of -Warray-bounds and is enabled by -Wall; higher levels are not, and	must
	       be explicitly requested.

	   -Warray-bounds=2
	       This  warning  level  also  warns  about the intermediate results of pointer arithmetic that may yield out of
	       bounds values. This warning level may give a larger number of false positives and is deactivated by default.

       -Wunterminated-string-initialization (C and Objective-C only)
	   Warn about character arrays initialized as unterminated character sequences with a  string  literal,	 unless	 the
	   declaration being initialized has the "nonstring" attribute.	 For example:

		   char arr[3] = "foo"; /* Warning.  */
		   char arr2[3] __attribute__((nonstring)) = "bar"; /* No warning.  */

	   This	 warning  is enabled by -Wextra.  If -Wc++-compat is enabled, the warning has slightly different wording and
	   warns even if the declaration being initialized has the "nonstring" warning, as in C++ such	initializations	 are
	   an error.

       -Warray-compare
	   Warn	 about	equality  and  relational  comparisons	between	 two  operands	of  array type.	 This comparison was
	   deprecated in C++20.	 For example:

		   int arr1[5];
		   int arr2[5];
		   bool same = arr1 == arr2;

	   -Warray-compare is enabled by -Wall.

       -Warray-parameter
       -Warray-parameter=n
	   Warn about redeclarations of functions involving parameters of array or pointer types of  inconsistent  kinds  or
	   forms, and enable the detection of out-of-bounds accesses to such parameters by warnings such as -Warray-bounds.

	   If  the  first  function  declaration uses the array form for a parameter declaration, the bound specified in the
	   array is assumed to be the minimum number of elements expected to be provided in calls to the  function  and	 the
	   maximum  number  of	elements  accessed by it.  Failing to provide arguments of sufficient size or accessing more
	   than the maximum number of elements may be diagnosed by warnings such as -Warray-bounds  or	-Wstringop-overflow.
	   At  level  1,  the  warning diagnoses inconsistencies involving array parameters declared using the "T[static N]"
	   form.

	   For example, the warning triggers for the second declaration of "f"	because	 the  first  one  with	the  keyword
	   "static"  specifies that the array argument must have at least four elements, while the second allows an array of
	   any size to be passed to "f".

		   void f (int[static 4]);
		   void f (int[]);	     // warning (inconsistent array form)

		   void g (void)
		   {
		     int *p = (int *)malloc (1 * sizeof (int));
		     f (p);		     // warning (array too small)
		     ...
		   }

	   At level 2 the warning also triggers for redeclarations involving any other inconsistency  in  array	 or  pointer
	   argument  forms  denoting array sizes.  Pointers and arrays of unspecified bound are considered equivalent and do
	   not trigger a warning.

		   void g (int*);
		   void g (int[]);     // no warning
		   void g (int[8]);    // warning (inconsistent array bound)

	   -Warray-parameter=2	is  included  in  -Wall.   The	-Wvla-parameter	 option	 triggers   warnings   for   similar
	   inconsistencies involving Variable Length Array arguments.

	   The	short  form  of	 the  option  -Warray-parameter	 is  equivalent	 to  -Warray-parameter=2.  The negative form
	   -Wno-array-parameter is equivalent to -Warray-parameter=0.

       -Wattribute-alias=n
       -Wno-attribute-alias
	   Warn about declarations using the "alias" and similar attributes whose target is incompatible with  the  type  of
	   the alias.

	   -Wattribute-alias=1
	       The default warning level of the -Wattribute-alias option diagnoses incompatibilities between the type of the
	       alias declaration and that of its target.  Such incompatibilities are typically indicative of bugs.

	   -Wattribute-alias=2
	       At  this	 level -Wattribute-alias also diagnoses cases where the attributes of the alias declaration are more
	       restrictive than the attributes applied to its target.  These mismatches can potentially result in  incorrect
	       code  generation.   In  other  cases  they  may	be benign and could be resolved simply by adding the missing
	       attribute to the target.	 For comparison, see the -Wmissing-attributes  option,	which  controls	 diagnostics
	       when the alias declaration is less restrictive than the target, rather than more restrictive.

	       Attributes  considered  include	"alloc_align",	"alloc_size",  "cold",	"const",  "hot",  "leaf",  "malloc",
	       "nonnull", "noreturn", "nothrow", "pure", "returns_nonnull", and "returns_twice".

	   -Wattribute-alias is equivalent to -Wattribute-alias=1.  This is the default.  You  can  disable  these  warnings
	   with either -Wno-attribute-alias or -Wattribute-alias=0.

       -Wbidi-chars=[none|unpaired|any|ucn]
	   Warn	 about	possibly  misleading  UTF-8 bidirectional control characters in comments, string literals, character
	   constants, and identifiers.	Such characters can change left-to-right writing direction into	 right-to-left	(and
	   vice	 versa),  which	 can cause confusion between the logical order and visual order.  This may be dangerous; for
	   instance, it may seem that a piece of code is not commented out, whereas it in fact is.

	   There are three levels of warning supported by GCC.	The default  is	 -Wbidi-chars=unpaired,	 which	warns  about
	   improperly  terminated bidi contexts.  -Wbidi-chars=none turns the warning off.  -Wbidi-chars=any warns about any
	   use of bidirectional control characters.

	   By default, this warning does not warn about UCNs.  It is, however, possible to turn on such	 checking  by  using
	   -Wbidi-chars=unpaired,ucn  or  -Wbidi-chars=any,ucn.	  Using	 -Wbidi-chars=ucn  is  valid,  and  is equivalent to
	   -Wbidi-chars=unpaired,ucn, if no previous -Wbidi-chars=any was specified.

	   NOTE: In Ubuntu 25.10 and later versions, -Wbidi-chars is enabled by default for C,	C++,  ObjC,  ObjC++,  unless
	   -Wno-bidi-chars or -Wbidi-chars=none is found.

       -Wbool-compare
	   Warn	 about	boolean	 expression compared with an integer value different from "true"/"false".  For instance, the
	   following comparison is always false:

		   int n = 5;
		   ...
		   if ((n > 1) == 2) { ... }

	   This warning is enabled by -Wall.

       -Wbool-operation
	   Warn about suspicious operations on expressions of a boolean type.  For instance, bitwise negation of  a  boolean
	   is  very  likely  a	bug  in	 the  program.	 For C, this warning also warns about incrementing or decrementing a
	   boolean, which rarely makes sense.  (In C++, decrementing a boolean is always invalid.  Incrementing a boolean is
	   invalid in C++17, and deprecated otherwise.)

	   This warning is enabled by -Wall.

       -Wduplicated-branches
	   Warn when an if-else has identical branches.	 This warning detects cases like

		   if (p != NULL)
		     return 0;
		   else
		     return 0;

	   It doesn't warn when both branches contain just a  null  statement.	 This  warning	also  warn  for	 conditional
	   operators:

		     int i = x ? *p : *p;

       -Wduplicated-cond
	   Warn about duplicated conditions in an if-else-if chain.  For instance, warn for the following code:

		   if (p->q != NULL) { ... }
		   else if (p->q != NULL) { ... }

       -Wframe-address
	   Warn	 when  the  __builtin_frame_address  or	 __builtin_return_address is called with an argument greater than 0.
	   Such calls may return indeterminate values or crash the program.  The warning is included in -Wall.

       -Wno-discarded-qualifiers (C and Objective-C only)
	   Do not warn if type qualifiers on pointers are being discarded.  Typically, the compiler warns if a	"const	char
	   *"  variable is passed to a function that takes a "char *" parameter.  This option can be used to suppress such a
	   warning.

       -Wno-discarded-array-qualifiers (C and Objective-C only)
	   Do not warn if type qualifiers on arrays which are pointer targets are being discarded.  Typically, the  compiler
	   warns  if  a	 "const int (*)[]" variable is passed to a function that takes a "int (*)[]" parameter.	 This option
	   can be used to suppress such a warning.

       -Wno-incompatible-pointer-types (C and Objective-C only)
	   Do not warn when there is a conversion between pointers that have incompatible types.  This warning is for  cases
	   not	covered	 by  -Wno-pointer-sign,	 which	warns  for  pointer  argument  passing	or assignment with different
	   signedness.

	   By default, in C99 and later dialects of C, GCC treats this issue as an error.  The error can be downgraded to  a
	   warning   using   -fpermissive   (along   with   certain   other   errors),	 or   for  this	 error	alone,	with
	   -Wno-error=incompatible-pointer-types.

	   This warning is upgraded to an error by -pedantic-errors.

       -Wno-int-conversion (C and Objective-C only)
	   Do not warn about incompatible integer to pointer and pointer to integer  conversions.   This  warning  is  about
	   implicit conversions; for explicit conversions the warnings -Wno-int-to-pointer-cast and -Wno-pointer-to-int-cast
	   may be used.

	   By  default, in C99 and later dialects of C, GCC treats this issue as an error.  The error can be downgraded to a
	   warning  using  -fpermissive	 (along	 with	certain	  other	  errors),   or	  for	this   error   alone,	with
	   -Wno-error=int-conversion.

	   This warning is upgraded to an error by -pedantic-errors.

       -Wzero-as-null-pointer-constant
	   Warn when a literal 0 is used as null pointer constant.

       -Wzero-length-bounds
	   Warn about accesses to elements of zero-length array members that might overlap other members of the same object.
	   Declaring interior zero-length arrays is discouraged because accesses to them are undefined.

	   For	example,  the  first  two  stores  in  function	 "bad"	are diagnosed because the array elements overlap the
	   subsequent members "b" and "c".  The third store is diagnosed by -Warray-bounds because it is beyond	 the  bounds
	   of the enclosing object.

		   struct X { int a[0]; int b, c; };
		   struct X x;

		   void bad (void)
		   {
		     x.a[0] = 0;   // -Wzero-length-bounds
		     x.a[1] = 1;   // -Wzero-length-bounds
		     x.a[2] = 2;   // -Warray-bounds
		   }

	   Option -Wzero-length-bounds is enabled by -Warray-bounds.

       -Wno-div-by-zero
	   Do not warn about compile-time integer division by zero.  Floating-point division by zero is not warned about, as
	   it can be a legitimate way of obtaining infinities and NaNs.

       -Wsystem-headers
	   Print  warning  messages  for constructs found in system header files.  Warnings from system headers are normally
	   suppressed, on the assumption that they usually do not indicate real problems and would only	 make  the  compiler
	   output  harder to read.  Using this command-line option tells GCC to emit warnings from system headers as if they
	   occurred in user code.  However, note that using -Wall in conjunction  with	this  option  does  not	 warn  about
	   unknown pragmas in system headers---for that, -Wunknown-pragmas must also be used.

       -Wtautological-compare
	   Warn if a self-comparison always evaluates to true or false.	 This warning detects various mistakes such as:

		   int i = 1;
		   ...
		   if (i > i) { ... }

	   This warning also warns about bitwise comparisons that always evaluate to true or false, for instance:

		   if ((a & 16) == 10) { ... }

	   will always be false.

	   This warning is enabled by -Wall.

       -Wtrailing-whitespace
       -Wtrailing-whitespace=kind
	   Warn	 about	trailing  whitespace  at  the  end  of	lines,	including inside of comments, but excluding trailing
	   whitespace in raw string literals.  "-Wtrailing-whitespace" is equivalent to	 "-Wtrailing-whitespace=blanks"	 and
	   warns  just about trailing space and horizontal tab characters.  "-Wtrailing-whitespace=any" warns about those or
	   trailing form feed  or  vertical  tab  characters.	"-Wno-trailing-whitespace"  or	"-Wtrailing-whitespace=none"
	   disables the warning, which is the default.	This is a coding style warning.

       -Wleading-whitespace=kind
	   Warn about style issues in leading whitespace, but not about the amount of indentation.  Some projects use coding
	   styles  where  only	spaces	are  used  for	indentation, others use only tabs, others use zero or more tabs (for
	   multiples of "-ftabstop=n") followed by zero or fewer than n spaces.	  No  warning  is  emitted  on	lines  which
	   contain  solely  whitespace (although "-Wtrailing-whitespace=" warning might be emitted), no warnings are emitted
	   inside of raw string literals.  Warnings are also emitted for leading whitespace inside of  multi-line  comments.
	   "-Wleading-whitespace=spaces"  warns about leading whitespace other than spaces for projects which want to indent
	   just by spaces.  "-Wleading-whitespace=tabs" warns about  leading  whitespace  other	 than  horizontal  tabs	 for
	   projects  which  want  to  indent  just  by	horizontal  tabs.  "-Wleading-whitespace=blanks" warns about leading
	   whitespace other than spaces and horizontal	tabs,  or  about  horizontal  tab  after  a  space  in	the  leading
	   whitespace,	or about n or more consecutive spaces in leading whitespace (where n is argument of "-ftabstop=n", 8
	   by default).	 "-Wleading-whitespace=none" disables the warning, which is the default.  This	is  a  coding  style
	   warning.

       -Wtrampolines
	   Warn about trampolines generated for pointers to nested functions.  A trampoline is a small piece of data or code
	   that	 is created at run time on the stack when the address of a nested function is taken, and is used to call the
	   nested function indirectly.	For some targets, it is made up of data only and thus requires no special treatment.
	   But, for most targets, it is made up of code and thus requires the stack to be made executable in order  for	 the
	   program to work properly.

       -Wfloat-equal
	   Warn if floating-point values are used in equality comparisons.

	   The idea behind this is that sometimes it is convenient (for the programmer) to consider floating-point values as
	   approximations to infinitely precise real numbers.  If you are doing this, then you need to compute (by analyzing
	   the	code,  or  in some other way) the maximum or likely maximum error that the computation introduces, and allow
	   for it when performing comparisons (and when producing output, but that's a different problem).   In	 particular,
	   instead  of	testing	 for  equality, you should check to see whether the two values have ranges that overlap; and
	   this is done with the relational operators, so equality comparisons are probably mistaken.

       -Wtraditional (C and Objective-C only)
	   Warn about certain constructs that behave differently in traditional and ISO C.  Also warn about ISO C constructs
	   that have no traditional C equivalent, and/or problematic constructs that should be avoided.

	   *   Macro parameters that appear within string literals in the macro body.  In traditional  C  macro	 replacement
	       takes place within string literals, but in ISO C it does not.

	   *   In  traditional	C,  some preprocessor directives did not exist.	 Traditional preprocessors only considered a
	       line to be a directive if the # appeared in column 1  on	 the  line.   Therefore	 -Wtraditional	warns  about
	       directives that traditional C understands but ignores because the # does not appear as the first character on
	       the  line.   It also suggests you hide directives like "#pragma" not understood by traditional C by indenting
	       them.  Some traditional implementations do not  recognize  "#elif",  so	this  option  suggests	avoiding  it
	       altogether.

	   *   A function-like macro that appears without arguments.

	   *   The unary plus operator.

	   *   The  U  integer constant suffix, or the F or L floating-point constant suffixes.	 (Traditional C does support
	       the L suffix on integer constants.)  Note, these suffixes appear in macros defined in the system	 headers  of
	       most  modern  systems,  e.g.  the  _MIN/_MAX  macros in "".  Use of these macros in user code might
	       normally lead to spurious warnings, however GCC's integrated preprocessor has enough context to avoid warning
	       in these cases.

	   *   A function declared external in one block and then used after the end of the block.

	   *   A "switch" statement has an operand of type "long".

	   *   A non-"static" function declaration follows  a  "static"	 one.	This  construct	 is  not  accepted  by	some
	       traditional C compilers.

	   *   The  ISO	 type  of  an  integer constant has a different width or signedness from its traditional type.	This
	       warning is only issued if the base of the constant is ten.  I.e. hexadecimal or octal values, which typically
	       represent bit patterns, are not warned about.

	   *   Usage of ISO string concatenation is detected.

	   *   Initialization of automatic aggregates.

	   *   Identifier conflicts with labels.  Traditional C lacks a separate namespace for labels.

	   *   Initialization of unions.  If the initializer is zero, the warning  is  omitted.	  This	is  done  under	 the
	       assumption  that	 the  zero  initializer in user code appears conditioned on e.g. "__STDC__" to avoid missing
	       initializer warnings and relies on default initialization to zero in the traditional C case.

	   *   Conversions by prototypes  between  fixed/floating-point	 values	 and  vice  versa.   The  absence  of  these
	       prototypes  when	 compiling  with  traditional  C  causes serious problems.  This is a subset of the possible
	       conversion warnings; for the full set use -Wtraditional-conversion.

	   *   Use of ISO C style function definitions.	 This warning intentionally is not issued for prototype declarations
	       or variadic functions because these ISO C features appear in your code when using libiberty's  traditional  C
	       compatibility  macros,  "PARAMS"	 and  "VPARAMS".  This warning is also bypassed for nested functions because
	       that feature is already a GCC extension and thus not relevant to traditional C compatibility.

       -Wtraditional-conversion (C and Objective-C only)
	   Warn if a prototype causes a type conversion that is different from what would happen to the same argument in the
	   absence of a prototype.  This includes conversions of fixed point to floating and  vice  versa,  and	 conversions
	   changing the width or signedness of a fixed-point argument except when the same as the default promotion.

       -Wdeclaration-after-statement (C and Objective-C only)
	   Warn	 when  a  declaration is found after a statement in a block.  This construct, known from C++, was introduced
	   with ISO C99 and is by default allowed in GCC.  It is not supported by ISO C90.

	   This warning is upgraded to an error by -pedantic-errors.

       -Wshadow
	   Warn whenever a local variable or type declaration shadows another variable, parameter, type,  class	 member	 (in
	   C++),  or  instance variable (in Objective-C) or whenever a built-in function is shadowed.  Note that in C++, the
	   compiler warns if a local variable shadows an explicit typedef, but not if it shadows  a  struct/class/enum.	  If
	   this	 warning  is  enabled, it includes also all instances of local shadowing.  This means that -Wno-shadow=local
	   and -Wno-shadow=compatible-local are ignored when -Wshadow is used.	Same as -Wshadow=global.

       -Wno-shadow-ivar (Objective-C only)
	   Do not warn whenever a local variable shadows an instance variable in an Objective-C method.

       -Wshadow=global
	   Warn for any shadowing.  Same as -Wshadow.

       -Wshadow=local
	   Warn when a local variable shadows another local variable or parameter.

       -Wshadow=compatible-local
	   Warn when a local variable shadows another local variable or parameter whose type is compatible with that of	 the
	   shadowing variable.	In C++, type compatibility here means the type of the shadowing variable can be converted to
	   that	 of  the  shadowed variable.  The creation of this flag (in addition to -Wshadow=local) is based on the idea
	   that when a local variable shadows another one of incompatible type, it is most likely intentional, not a bug  or
	   typo, as shown in the following example:

		   for (SomeIterator i = SomeObj.begin(); i != SomeObj.end(); ++i)
		   {
		     for (int i = 0; i < N; ++i)
		     {
		       ...
		     }
		     ...
		   }

	   Since  the two variable "i" in the example above have incompatible types, enabling only -Wshadow=compatible-local
	   does not emit a warning.  Because their types are incompatible, if a programmer accidentally uses one in place of
	   the other, type checking is expected to catch that and emit an error or warning.  Use of  this  flag	 instead  of
	   -Wshadow=local  can	possibly  reduce  the number of warnings triggered by intentional shadowing.  Note that this
	   also means that shadowing "const char *i" by "char *i" does not emit a warning.

	   This warning is also enabled by -Wshadow=local.

       -Wlarger-than=byte-size
	   Warn whenever an object is defined  whose  size  exceeds  byte-size.	  -Wlarger-than=PTRDIFF_MAX  is	 enabled  by
	   default.  Warnings controlled by the option can be disabled either by specifying byte-size of SIZE_MAX or more or
	   by -Wno-larger-than.

	   Also	 warn  for  calls  to  bounded functions such as "memchr" or "strnlen" that specify a bound greater than the
	   largest possible object, which is PTRDIFF_MAX  bytes	 by  default.	These  warnings	 can  only  be	disabled  by
	   -Wno-larger-than.

       -Wno-larger-than
	   Disable -Wlarger-than= warnings.  The option is equivalent to -Wlarger-than=SIZE_MAX or larger.

       -Wframe-larger-than=byte-size
	   Warn	 if  the size of a function frame exceeds byte-size.  The computation done to determine the stack frame size
	   is approximate and not conservative.	 The actual requirements may be somewhat greater than byte-size even if	 you
	   do  not  get	 a  warning.   In  addition,  any  space  allocated via "alloca", variable-length arrays, or related
	   constructs  is  not	included  by  the  compiler  when  determining	whether	 or  not   to	issue	a   warning.
	   -Wframe-larger-than=PTRDIFF_MAX  is enabled by default.  Warnings controlled by the option can be disabled either
	   by specifying byte-size of SIZE_MAX or more or by -Wno-frame-larger-than.

       -Wno-frame-larger-than
	   Disable -Wframe-larger-than= warnings.  The option is equivalent to -Wframe-larger-than=SIZE_MAX or larger.

       -Wfree-nonheap-object
	   Warn when attempting to deallocate an object that was either not allocated on the heap, or  by  using  a  pointer
	   that	 was not returned from a prior call to the corresponding allocation function.  For example, because the call
	   to "stpcpy" returns a pointer to the terminating nul character and not to the beginning of the object,  the	call
	   to "free" below is diagnosed.

		   void f (char *p)
		   {
		     p = stpcpy (p, "abc");
		     // ...
		     free (p);	 // warning
		   }

	   -Wfree-nonheap-object is included in -Wall.

       -Wstack-usage=byte-size
	   Warn	 if the stack usage of a function might exceed byte-size.  The computation done to determine the stack usage
	   is conservative.  Any space allocated via "alloca", variable-length arrays, or related constructs is included  by
	   the compiler when determining whether or not to issue a warning.

	   The message is in keeping with the output of -fstack-usage.

	   *   If the stack usage is fully static but exceeds the specified amount, it's:

			 warning: stack usage is 1120 bytes

	   *   If the stack usage is (partly) dynamic but bounded, it's:

			 warning: stack usage might be 1648 bytes

	   *   If the stack usage is (partly) dynamic and not bounded, it's:

			 warning: stack usage might be unbounded

	   -Wstack-usage=PTRDIFF_MAX  is  enabled  by  default.	 Warnings controlled by the option can be disabled either by
	   specifying byte-size of SIZE_MAX or more or by -Wno-stack-usage.

       -Wno-stack-usage
	   Disable -Wstack-usage= warnings.  The option is equivalent to -Wstack-usage=SIZE_MAX or larger.

       -Wunsafe-loop-optimizations
	   Warn if the loop cannot be optimized because the compiler cannot assume  anything  on  the  bounds  of  the	loop
	   indices.  With -funsafe-loop-optimizations warn if the compiler makes such assumptions.

       -Wno-pedantic-ms-format (MinGW targets only)
	   When	 used  in  combination with -Wformat and -pedantic without GNU extensions, this option disables the warnings
	   about non-ISO "printf" / "scanf" format width specifiers "I32", "I64", and "I" used	on  Windows  targets,  which
	   depend on the MS runtime.

       -Wpointer-arith
	   Warn about anything that depends on the "size of" a function type or of "void".  GNU C assigns these types a size
	   of  1,  for convenience in calculations with "void *" pointers and pointers to functions.  In C++, warn also when
	   an arithmetic operation involves "NULL".  This warning is also enabled by -Wpedantic.

	   This warning is upgraded to an error by -pedantic-errors.

       -Wno-pointer-compare
	   Do not warn if a pointer is compared with a zero character constant.	 This usually means  that  the	pointer	 was
	   meant to be dereferenced.  For example:

		   const char *p = foo ();
		   if (p == '\0')
		     return 42;

	   Note that the code above is invalid in C++11.

	   This warning is enabled by default.

       -Wno-tsan
	   Disable warnings about unsupported features in ThreadSanitizer.

	   ThreadSanitizer does not support "std::atomic_thread_fence" and can report false positives.

       -Wtype-limits
	   Warn	 if  a	comparison is always true or always false due to the limited range of the data type, but do not warn
	   for constant expressions.  For example, warn if an unsigned variable is compared against zero with "<"  or  ">=".
	   This warning is also enabled by -Wextra.

       -Wabsolute-value (C and Objective-C only)
	   Warn	 for  calls  to	 standard  functions  that compute the absolute value of an argument when a more appropriate
	   standard function is available.  For example, calling abs(3.14) triggers  the  warning  because  the	 appropriate
	   function to call to compute the absolute value of a double argument is "fabs".  The option also triggers warnings
	   when	 the  argument	in  a  call to such a function has an unsigned type.  This warning can be suppressed with an
	   explicit type cast and it is also enabled by -Wextra.

       -Wcomment
       -Wcomments
	   Warn whenever a comment-start sequence /* appears in a /* comment, or whenever a backslash-newline appears  in  a
	   // comment.	This warning is enabled by -Wall.

       -Wtrigraphs
	   Warn	 if  any  trigraphs are encountered that might change the meaning of the program.  Trigraphs within comments
	   are not warned about, except those that would form escaped newlines.

	   This option is implied by -Wall.  If -Wall is not given, this  option  is  still  enabled  unless  trigraphs	 are
	   enabled.   To  get  trigraph	 conversion without warnings, but get the other -Wall warnings, use -trigraphs -Wall
	   -Wno-trigraphs.

       -Wundef
	   Warn if an undefined identifier is evaluated in an "#if" directive.	Such identifiers are replaced with zero.

       -Wexpansion-to-defined
	   Warn whenever defined is encountered in the expansion of a macro (including the case where the macro is  expanded
	   by an #if directive).  Such usage is not portable.  This warning is also enabled by -Wpedantic and -Wextra.

       -Wunused-macros
	   Warn	 about	macros	defined	 in  the main file that are unused.  A macro is used if it is expanded or tested for
	   existence at least once.  The preprocessor also warns if the macro has not been used at the time it is  redefined
	   or undefined.

	   Built-in macros, macros defined on the command line, and macros defined in include files are not warned about.

	   Note:  If a macro is actually used, but only used in skipped conditional blocks, then the preprocessor reports it
	   as unused.  To avoid the warning in such a case, you might improve the scope of the macro's	definition  by,	 for
	   example,  moving  it	 into  the first skipped block.	 Alternatively, you could provide a dummy use with something
	   like:

		   #if defined the_macro_causing_the_warning
		   #endif

       -Wno-endif-labels
	   Do not warn whenever an "#else" or an "#endif" are followed by text.	 This sometimes happens	 in  older  programs
	   with code of the form

		   #if FOO
		   ...
		   #else FOO
		   ...
		   #endif FOO

	   The second and third "FOO" should be in comments.  This warning is on by default.

       -Wbad-function-cast (C and Objective-C only)
	   Warn when a function call is cast to a non-matching type.  For example, warn if a call to a function returning an
	   integer type is cast to a pointer type.

       -Wc90-c99-compat (C and Objective-C only)
	   Warn	 about	features  not  present in ISO C90, but present in ISO C99.  For instance, warn about use of variable
	   length arrays, "long long" type, "bool" type, compound literals, designated initializers, and so on.	 This option
	   is independent of the standards mode.  Warnings are disabled in the expression that follows "__extension__".

       -Wc99-c11-compat (C and Objective-C only)
	   Warn about features not present in ISO C99, but present in ISO C11.	For instance, warn about  use  of  anonymous
	   structures  and  unions, "_Atomic" type qualifier, "_Thread_local" storage-class specifier, "_Alignas" specifier,
	   "Alignof" operator, "_Generic" keyword, and so on.  This option is independent of the standards  mode.   Warnings
	   are disabled in the expression that follows "__extension__".

       -Wc11-c23-compat (C and Objective-C only)
       -Wc11-c2x-compat (C and Objective-C only)
	   Warn about features not present in ISO C11, but present in ISO C23.	For instance, warn about omitting the string
	   in  "_Static_assert",  use  of  [[]] syntax for attributes, use of decimal floating-point types, and so on.	This
	   option  is  independent  of	the  standards	mode.	Warnings  are  disabled	 in  the  expression  that   follows
	   "__extension__".  The name -Wc11-c2x-compat is deprecated.

	   When not compiling in C23 mode, these warnings are upgraded to errors by -pedantic-errors.

       -Wc23-c2y-compat (C and Objective-C only)
       -Wc23-c2y-compat (C and Objective-C only)
	   Warn	 about	features  not  present	in  ISO	 C23,  but  present in ISO C2Y.	 For instance, warn about "_Generic"
	   selecting with a type name instead of an expression.	 This option is independent of the standards mode.  Warnings
	   are disabled in the expression that follows "__extension__".

	   When not compiling in C2Y mode, these warnings are upgraded to errors by -pedantic-errors.

       -Wc++-compat (C and Objective-C only)
	   Warn about ISO C constructs that are outside of the common subset of ISO C and ISO C++, e.g. request for implicit
	   conversion from "void *" to a pointer to non-"void" type.

       -Wc++11-compat (C++ and Objective-C++ only)
	   Warn about C++ constructs whose meaning differs between ISO C++ 1998 and ISO C++ 2011, e.g., identifiers  in	 ISO
	   C++ 1998 that are keywords in ISO C++ 2011.	This warning turns on -Wnarrowing and is enabled by -Wall.

       -Wc++14-compat (C++ and Objective-C++ only)
	   Warn	 about	C++ constructs whose meaning differs between ISO C++ 2011 and ISO C++ 2014.  This warning is enabled
	   by -Wall.

       -Wc++17-compat (C++ and Objective-C++ only)
	   Warn about C++ constructs whose meaning differs between ISO C++ 2014 and ISO C++ 2017.  This warning	 is  enabled
	   by -Wall.

       -Wc++20-compat (C++ and Objective-C++ only)
	   Warn	 about	C++ constructs whose meaning differs between ISO C++ 2017 and ISO C++ 2020.  This warning is enabled
	   by -Wall.

       -Wno-c++11-extensions (C++ and Objective-C++ only)
	   Do not warn about C++11 constructs in code being compiled using an older C++ standard.  Even without this option,
	   some C++11 constructs will only be diagnosed if -Wpedantic is used.

       -Wno-c++14-extensions (C++ and Objective-C++ only)
	   Do not warn about C++14 constructs in code being compiled using an older C++ standard.  Even without this option,
	   some C++14 constructs will only be diagnosed if -Wpedantic is used.

       -Wno-c++17-extensions (C++ and Objective-C++ only)
	   Do not warn about C++17 constructs in code being compiled using an older C++ standard.  Even without this option,
	   some C++17 constructs will only be diagnosed if -Wpedantic is used.

       -Wno-c++20-extensions (C++ and Objective-C++ only)
	   Do not warn about C++20 constructs in code being compiled using an older C++ standard.  Even without this option,
	   some C++20 constructs will only be diagnosed if -Wpedantic is used.

       -Wno-c++23-extensions (C++ and Objective-C++ only)
	   Do not warn about C++23 constructs in code being compiled using an older C++ standard.  Even without this option,
	   some C++23 constructs will only be diagnosed if -Wpedantic is used.

       -Wno-c++26-extensions (C++ and Objective-C++ only)
	   Do not warn about C++26 constructs in code being compiled using an older C++ standard.  Even without this option,
	   some C++26 constructs will only be diagnosed if -Wpedantic is used.

       -Wcast-qual
	   Warn whenever a pointer is cast so as to remove a type qualifier from the target type.  For example,	 warn  if  a
	   "const char *" is cast to an ordinary "char *".

	   Also	 warn  when making a cast that introduces a type qualifier in an unsafe way.  For example, casting "char **"
	   to "const char **" is unsafe, as in this example:

		     /* p is char ** value.  */
		     const char **q = (const char **) p;
		     /* Assignment of readonly string to const char * is OK.  */
		     *q = "string";
		     /* Now char** pointer points to read-only memory.	*/
		     **p = 'b';

       -Wcast-align
	   Warn whenever a pointer is cast such that the required alignment of the target is increased.	 For  example,	warn
	   if  a  "char	 *"  is	 cast  to  an  "int  *" on machines where integers can only be accessed at two- or four-byte
	   boundaries.

       -Wcast-align=strict
	   Warn whenever a pointer is cast such that the required alignment of the target is increased.	 For  example,	warn
	   if a "char *" is cast to an "int *" regardless of the target machine.

       -Wcast-function-type
	   Warn	 when  a  function  pointer is cast to an incompatible function pointer.  In a cast involving function types
	   with a variable argument list only the types	 of  initial  arguments	 that  are  provided  are  considered.	 Any
	   parameter  of pointer-type matches any other pointer-type.  Any benign differences in integral types are ignored,
	   like "int" vs. "long" on ILP32 targets.  Likewise type qualifiers are  ignored.   The  function  type  "void	 (*)
	   (void)"  is	special	 and  matches  everything,  which can be used to suppress this warning.	 In a cast involving
	   pointer to member types this warning warns whenever the type cast is changing the pointer to member	type.	This
	   warning is enabled by -Wextra.

       -Wcast-user-defined
	   Warn when a cast to reference type does not involve a user-defined conversion that the programmer might expect to
	   be called.

		   struct A { operator const int&(); } a;
		   auto r = (int&)a; // warning

	   This warning is enabled by default.

       -Wwrite-strings
	   When	 compiling  C, give string constants the type "const char[length]" so that copying the address of one into a
	   non-"const" "char *" pointer produces a warning.  These warnings help you find at compile time code that can	 try
	   to  write  into a string constant, but only if you have been very careful about using "const" in declarations and
	   prototypes.	Otherwise, it is just a nuisance. This is why we did not make -Wall request these warnings.

	   When compiling C++, warn about the deprecated conversion from string literals  to  "char  *".   This	 warning  is
	   enabled by default for C++ programs.

	   This warning is upgraded to an error by -pedantic-errors in C++11 mode or later.

       -Wclobbered
	   Warn for variables that might be changed by "longjmp" or "vfork".  This warning is also enabled by -Wextra.

       -Wno-complain-wrong-lang
	   By  default,	 language  front ends complain when a command-line option is valid, but not applicable to that front
	   end.	 This may be disabled with -Wno-complain-wrong-lang, which is mostly useful when invoking a single  compiler
	   driver for multiple source files written in different languages, for example:

		   $ g++ -fno-rtti a.cc b.f90

	   The	driver g++ invokes the C++ front end to compile a.cc and the Fortran front end to compile b.f90.  The latter
	   front end diagnoses f951: Warning: command-line option '-fno-rtti' is valid for C++/D/ObjC++ but not for Fortran,
	   which may be disabled with -Wno-complain-wrong-lang.

       -Wcompare-distinct-pointer-types (C and Objective-C only)
	   Warn if pointers of distinct types are compared without a cast.  This warning is enabled by default.

       -Wconversion
	   Warn for implicit conversions that may alter a value. This includes conversions between real	 and  integer,	like
	   "abs (x)" when "x" is "double"; conversions between signed and unsigned, like "unsigned ui = -1"; and conversions
	   to  smaller	types, like "sqrtf (M_PI)". Do not warn for explicit casts like "abs ((int) x)" and "ui = (unsigned)
	   -1", or if the value is not changed by the conversion like in "abs (2.0)".  Warnings	 about	conversions  between
	   signed and unsigned integers can be disabled by using -Wno-sign-conversion.

	   For C++, also warn for confusing overload resolution for user-defined conversions; and conversions that never use
	   a  type  conversion operator: conversions to "void", the same type, a base class or a reference to them. Warnings
	   about conversions between signed and unsigned integers are disabled by default in C++ unless -Wsign-conversion is
	   explicitly enabled.

	   Warnings  about  conversion	from  arithmetic  on  a	 small	type  back  to	that  type  are	 only	given	with
	   -Warith-conversion.

       -Wdangling-else
	   Warn	 about constructions where there may be confusion to which "if" statement an "else" branch belongs.  Here is
	   an example of such a case:

		   {
		     if (a)
		       if (b)
			 foo ();
		     else
		       bar ();
		   }

	   In C/C++, every "else" branch belongs to the innermost possible "if" statement, which  in  this  example  is	 "if
	   (b)".   This	 is  often  not what the programmer expected, as illustrated in the above example by indentation the
	   programmer chose.  When there is the potential for this confusion,  GCC  issues  a  warning	when  this  flag  is
	   specified.	To eliminate the warning, add explicit braces around the innermost "if" statement so there is no way
	   the "else" can belong to the enclosing "if".	 The resulting code looks like this:

		   {
		     if (a)
		       {
			 if (b)
			   foo ();
			 else
			   bar ();
		       }
		   }

	   This warning is enabled by -Wparentheses.

       -Wdangling-pointer
       -Wdangling-pointer=n
	   Warn about uses of pointers (or C++ references) to objects with automatic storage duration after  their  lifetime
	   has	ended.	 This  includes	 local	variables  declared  in	 nested	 blocks, compound literals and other unnamed
	   temporary objects.  In addition, warn about storing the address of such objects in escaped pointers.	 The warning
	   is enabled at all optimization levels but may yield different results with optimization than without.

	   -Wdangling-pointer=1
	       At level 1, the warning diagnoses only unconditional uses of dangling pointers.

	   -Wdangling-pointer=2
	       At level 2, in addition to unconditional uses  the  warning  also  diagnoses  conditional  uses	of  dangling
	       pointers.

	   The	short  form  -Wdangling-pointer	 is  equivalent	 to  -Wdangling-pointer=2,  while  -Wno-dangling-pointer and
	   -Wdangling-pointer=0 have the same effect of disabling the warnings.	 -Wdangling-pointer=2 is included in -Wall.

	   This example triggers the warning at level 1; the address of the unnamed temporary is unconditionally  referenced
	   outside of its scope.

		   char f (char c1, char c2, char c3)
		   {
		     char *p;
		     {
		       p = (char[]) { c1, c2, c3 };
		     }
		     // warning: using dangling pointer 'p' to an unnamed temporary
		     return *p;
		   }

	   In  the  following function the store of the address of the local variable "x" in the escaped pointer *p triggers
	   the warning at level 1.

		   void g (int **p)
		   {
		     int x = 7;
		     // warning: storing the address of local variable 'x' in '*p'
		     *p = &x;
		   }

	   In this example, the array a is out of scope when the pointer s is  used.   Since  the  code	 that  sets  "s"  is
	   conditional, the warning triggers at level 2.

		   extern void frob (const char *);
		   void h (char *s)
		   {
		     if (!s)
		       {
			 char a[12] = "tmpname";
			 s = a;
		       }
		     // warning: dangling pointer 's' to 'a' may be used
		     frob (s);
		   }

       -Wdate-time
	   Warn	 when  macros  "__TIME__",  "__DATE__"	or  "__TIMESTAMP__"  are encountered as they might prevent bit-wise-
	   identical reproducible compilations.

       -Wempty-body
	   Warn if an empty body occurs in an "if", "else" or "do  while"  statement.	This  warning  is  also	 enabled  by
	   -Wextra.

       -Wno-endif-labels
	   Do not warn about stray tokens after "#else" and "#endif".

       -Wenum-compare
	   Warn	 about	a  comparison  between	values	of different enumerated types.	In C++ enumerated type mismatches in
	   conditional expressions are also diagnosed and the warning is enabled by default.  In C this warning	 is  enabled
	   by -Wall.

       -Wenum-conversion
	   Warn	 when  a  value	 of enumerated type is implicitly converted to a different enumerated type.  This warning is
	   enabled by -Wextra in C.

       -Wenum-int-mismatch (C and Objective-C only)
	   Warn about mismatches between an enumerated type and an integer type in declarations.  For example:

		   enum E { l = -1, z = 0, g = 1 };
		   int foo(void);
		   enum E foo(void);

	   In C, an enumerated type is compatible with "char", a signed integer type, or an unsigned integer type.  However,
	   since the choice of the underlying type of an enumerated type  is  implementation-defined,  such  mismatches	 may
	   cause  portability  issues.	 In  C++,  such mismatches are an error.  In C, this warning is enabled by -Wall and
	   -Wc++-compat.

       -Wjump-misses-init (C, Objective-C only)
	   Warn if a "goto" statement or a "switch" statement jumps forward across the	initialization	of  a  variable,  or
	   jumps  backward  to	a  label  after the variable has been initialized.  This only warns about variables that are
	   initialized when they are declared.	This warning is only supported for C and Objective-C; in C++  this  sort  of
	   branch is an error in any case.

	   -Wjump-misses-init is included in -Wc++-compat.  It can be disabled with the -Wno-jump-misses-init option.

       -Wsign-compare
	   Warn when a comparison between signed and unsigned values could produce an incorrect result when the signed value
	   is converted to unsigned.  In C++, this warning is also enabled by -Wall.  In C, it is also enabled by -Wextra.

       -Wsign-conversion
	   Warn	 for  implicit	conversions  that  may	change the sign of an integer value, like assigning a signed integer
	   expression to an unsigned integer variable. An explicit cast silences the warning. In C, this option	 is  enabled
	   also by -Wconversion.

       -Wflex-array-member-not-at-end (C and C++ only)
	   Warn	 when  a  structure  containing	 a  C99 flexible array member as the last field is not at the end of another
	   structure.  This warning warns e.g. about

		   struct flex	{ int length; char data[]; };
		   struct mid_flex { int m; struct flex flex_data; int n; };

       -Wfloat-conversion
	   Warn for implicit conversions that reduce the precision of a real value.  This includes conversions from real  to
	   integer,  and  from	higher	precision  real	 to  lower  precision  real  values.  This option is also enabled by
	   -Wconversion.

       -Wno-scalar-storage-order
	   Do not warn on suspicious constructs involving reverse scalar storage order.

       -Wsizeof-array-div
	   Warn about divisions of two sizeof operators when the first one is applied to an array and the divisor  does	 not
	   equal  the  size  of the array element.  In such a case, the computation will not yield the number of elements in
	   the array, which is likely what the user intended.  This warning warns e.g. about

		   int fn ()
		   {
		     int arr[10];
		     return sizeof (arr) / sizeof (short);
		   }

	   This warning is enabled by -Wall.

       -Wsizeof-pointer-div
	   Warn for suspicious divisions of two sizeof expressions that divide the pointer size by the element	size,  which
	   is  the  usual way to compute the array size but won't work out correctly with pointers.  This warning warns e.g.
	   about "sizeof (ptr) / sizeof (ptr[0])" if "ptr" is not an array, but a  pointer.   This  warning  is	 enabled  by
	   -Wall.

       -Wsizeof-pointer-memaccess
	   Warn	 for  suspicious  length  parameters  to  certain  string and memory built-in functions if the argument uses
	   "sizeof".  This warning triggers for example for "memset (ptr, 0, sizeof (ptr));" if "ptr" is not an array, but a
	   pointer, and suggests a possible fix, or about "memcpy (&foo, ptr, sizeof (&foo));".	  -Wsizeof-pointer-memaccess
	   also	 warns	about calls to bounded string copy functions like "strncat" or "strncpy" that specify as the bound a
	   "sizeof" expression of the source array.  For example, in the following function the call to "strncat"  specifies
	   the size of the source string as the bound.	That is almost certainly a mistake and so the call is diagnosed.

		   void make_file (const char *name)
		   {
		     char path[PATH_MAX];
		     strncpy (path, name, sizeof path - 1);
		     strncat (path, ".text", sizeof ".text");
		     ...
		   }

	   The -Wsizeof-pointer-memaccess option is enabled by -Wall.

       -Wno-sizeof-array-argument
	   Do  not  warn  when	the  "sizeof"  operator is applied to a parameter that is declared as an array in a function
	   definition.	This warning is enabled by default for C and C++ programs.

       -Wmemset-elt-size
	   Warn for suspicious calls to the "memset" built-in function, if the first argument references an array,  and	 the
	   third  argument  is	a  number equal to the number of elements, but not equal to the size of the array in memory.
	   This indicates that the user has omitted a multiplication by the element size.  This warning is enabled by -Wall.

       -Wmemset-transposed-args
	   Warn for suspicious calls to the "memset" built-in function where the second argument is not zero and  the  third
	   argument  is	 zero.	 For  example,	the call "memset (buf, sizeof buf, 0)" is diagnosed because "memset (buf, 0,
	   sizeof buf)" was meant instead.  The diagnostic is only  emitted  if	 the  third  argument  is  a  literal  zero.
	   Otherwise,  if  it is an expression that is folded to zero, or a cast of zero to some type, it is far less likely
	   that the arguments have been mistakenly transposed and no warning is emitted.  This warning is enabled by -Wall.

       -Waddress
	   Warn about suspicious uses of address expressions. These include  comparing	the  address  of  a  function  or  a
	   declared object to the null pointer constant such as in

		   void f (void);
		   void g (void)
		   {
		     if (!f)   // warning: expression evaluates to false
		       abort ();
		   }

	   comparisons of a pointer to a string literal, such as in

		   void f (const char *x)
		   {
		     if (x == "abc")   // warning: expression evaluates to false
		       puts ("equal");
		   }

	   and tests of the results of pointer addition or subtraction for equality to null, such as in

		   void f (const int *p, int i)
		   {
		     return p + i == NULL;
		   }

	   Such	 uses typically indicate a programmer error: the address of most functions and objects necessarily evaluates
	   to true (the exception are weak symbols), so their use in a conditional might indicate missing parentheses  in  a
	   function call or a missing dereference in an array expression.  The subset of the warning for object pointers can
	   be  suppressed  by casting the pointer operand to an integer type such as "intptr_t" or "uintptr_t".	 Comparisons
	   against string literals result in unspecified behavior and are not portable, and suggest the intent was  to	call
	   "strcmp".   The  warning  is suppressed if the suspicious expression is the result of macro expansion.  -Waddress
	   warning is enabled by -Wall.

       -Wno-address-of-packed-member
	   Do not warn when the address of packed member of struct or union is taken, which usually results in an  unaligned
	   pointer value.  This is enabled by default.

       -Wlogical-op
	   Warn	 about	suspicious  uses  of  logical  operators  in  expressions.  This includes using logical operators in
	   contexts where a bit-wise operator is likely to be expected.	 Also warns when the operands of a logical  operator
	   are the same:

		   extern int a;
		   if (a < 0 && a < 0) { ... }

       -Wlogical-not-parentheses
	   Warn	 about	logical	 not  used  on the left hand side operand of a comparison.  This option does not warn if the
	   right operand is considered to be a boolean expression.  Its purpose	 is  to	 detect	 suspicious  code  like	 the
	   following:

		   int a;
		   ...
		   if (!a > 1) { ... }

	   It is possible to suppress the warning by wrapping the LHS into parentheses:

		   if ((!a) > 1) { ... }

	   This warning is enabled by -Wall.

       -Waggregate-return
	   Warn if any functions that return structures or unions are defined or called.  (In languages where you can return
	   an array, this also elicits a warning.)

       -Wno-aggressive-loop-optimizations
	   Do  not  warn  if  the  compiler  detects  undefined	 behavior  in  a  loop with a constant number of iterations.
	   -Waggressive-loop-optimizations is enabled by default.

       -Wno-attributes
	   Do not warn if an unexpected "__attribute__" is  used,  such	 as  unrecognized  attributes,	function  attributes
	   applied to variables, etc.  This does not stop errors for incorrect use of supported attributes.

	   Warnings about ill-formed uses of standard attributes are upgraded to errors by -pedantic-errors.

	   Additionally,  using	 -Wno-attributes=,  it	is possible to suppress warnings about unknown scoped attributes (in
	   C++11 and C23).  For example, -Wno-attributes=vendor::attr disables warning about the following declaration:

		   [[vendor::attr]] void f();

	   It is also possible to disable warning about all attributes in a namespace using  -Wno-attributes=vendor::  which
	   prevents warning about both of these declarations:

		   [[vendor::safe]] void f();
		   [[vendor::unsafe]] void f2();

	   Note that -Wno-attributes= does not imply -Wno-attributes.

       -Wno-builtin-declaration-mismatch
	   Warn	 if  a built-in function is declared with an incompatible signature or as a non-function, or when a built-in
	   function declared with a type that does not include a prototype is called with arguments whose promoted types  do
	   not	match  those  expected	by the function.  When -Wextra is specified, also warn when a built-in function that
	   takes arguments is declared without a  prototype.   The  -Wbuiltin-declaration-mismatch  warning  is	 enabled  by
	   default.   To avoid the warning include the appropriate header to bring the prototypes of built-in functions into
	   scope.

	   For example, the call to "memset" below is diagnosed by the warning because the function expects a value of	type
	   "size_t" as its argument but the type of 32 is "int".  With -Wextra, the declaration of the function is diagnosed
	   as well.

		   extern void* memset ();
		   void f (void *d)
		   {
		     memset (d, '\0', 32);
		   }

       -Wno-builtin-macro-redefined
	   Do  not  warn  if  certain  built-in	 macros	 are  redefined.   This	 suppresses  warnings  for  redefinition  of
	   "__TIMESTAMP__", "__TIME__", "__DATE__", "__FILE__", and "__BASE_FILE__".

       -Wfree-labels (C and Objective-C only)
	   Warn if a label is applied to a non-statement, or occurs at the end of a compound  statement.   Such	 labels	 are
	   allowed by C23 and later dialects of C, and are available as a GCC extension in all other dialects.

	   This	 warning is also enabled by -Wc11-c23-compat.  It is turned into an error if building for a C version before
	   C23 by -pedantic-errors.

       -Wheader-guard
	   Warn if a valid preprocessor header multiple inclusion guard has a "#define" directive right after  "#ifndef"  or
	   "#if	 !defined"  directive for the multiple inclusion guard, which defines a different macro from the guard macro
	   with a similar name, the actual multiple inclusion guard macro  isn't  defined  at  the  corresponding  "#ifndef"
	   directive  at  the  end  of	the  header,  and  the	"#define"  directive defines an object-like macro with empty
	   definition.	In such case, it often is just a misspelled guard name, either in the "#ifndef"	 or  "#if  !defined"
	   directive or in the subsequent "#define" directive.	This warning is enabled by -Wall.

       -Wstrict-prototypes (C and Objective-C only)
	   Warn	 if  a	function  is  declared	or  defined  without  specifying the argument types.  (An old-style function
	   definition is permitted without a warning if preceded by a declaration that specifies the argument types.)

       -Wold-style-declaration (C and Objective-C only)
	   Warn for obsolescent usages, according to the C Standard, in a declaration. For example,  warn  if  storage-class
	   specifiers like "static" are not the first things in a declaration.	This warning is also enabled by -Wextra.

       -Wold-style-definition (C and Objective-C only)
	   Warn	 if  an old-style function definition is used.	A warning is given even if there is a previous prototype.  A
	   definition using () is not considered an old-style definition in C23 mode, because it is equivalent to (void)  in
	   that case, but is considered an old-style definition for older standards.

       -Wdeprecated-non-prototype (C and Objective-C only)
	   Warn	 if  a	function  declared  with  an  empty  parameter list () is called with one or more arguments, or if a
	   function definition with one or more parameters is encountered after such a declaration.  Both cases	 are  errors
	   in C23 and later dialects  of C.

	   This warning is also enabled by -Wc11-c23-compat.

       -Wmissing-parameter-name (C and Objective-C only)
	   Warn	 if  a	function  definition omits a parameter name, specifying only its type.	This can be used to document
	   that a parameter is unused in the definition.  It is part of C23 and later dialects of C, and available as a	 GCC
	   extension in all other dialects.

	   This	 warning is also enabled by -Wc11-c23-compat.  It is turned into an error if building for a C version before
	   C23 by -pedantic-errors.

       -Wmissing-parameter-type (C and Objective-C only)
	   A function parameter is declared without a type specifier in K&R-style functions:

		   void foo(bar) { }

	   This warning is also enabled by -Wextra.

       -Wno-declaration-missing-parameter-type (C and Objective-C only)
	   Do not warn if a function declaration contains a parameter name without a type.  Such  function  declarations  do
	   not provide a function prototype and prevent most type checking in function calls.

	   This warning is enabled by default.	In C99 and later dialects of C, it is treated as an error.  The error can be
	   downgraded  to  a  warning  using  -fpermissive  (along with certain other errors), or for this error alone, with
	   -Wno-error=declaration-missing-parameter-type.

	   This warning is upgraded to an error by -pedantic-errors.

       -Wmissing-prototypes (C and Objective-C only)
	   Warn if a global function is defined without a previous prototype declaration.  This warning is  issued  even  if
	   the	definition  itself  provides  a	 prototype.   Use  this option to detect global functions that do not have a
	   matching prototype declaration in a header file.   This  option  is	not  valid  for	 C++  because  all  function
	   declarations	 provide prototypes and a non-matching declaration declares an overload rather than conflict with an
	   earlier declaration.	 Use -Wmissing-declarations to detect missing declarations in C++.

       -Wmissing-variable-declarations (C and Objective-C only)
	   Warn if a global variable is defined without a previous declaration.	 Use this option to detect global  variables
	   that do not have a matching extern declaration in a header file.

       -Wmissing-declarations
	   Warn	 if  a	global	function  is  defined  without	a previous declaration.	 Do so even if the definition itself
	   provides a prototype.  Use this option to detect global functions that are not declared in header files.   In  C,
	   no warnings are issued for functions with previous non-prototype declarations; use -Wmissing-prototypes to detect
	   missing  prototypes.	  In  C++,  no	warnings  are issued for function templates, or for inline functions, or for
	   functions in anonymous namespaces.

       -Wmissing-field-initializers
	   Warn if a structure's initializer has some fields missing.	For  example,  the  following  code  causes  such  a
	   warning, because "x.h" is implicitly zero:

		   struct s { int f, g, h; };
		   struct s x = { 3, 4 };

	   In  C  this	option does not warn about designated initializers, so the following modification does not trigger a
	   warning:

		   struct s { int f, g, h; };
		   struct s x = { .f = 3, .g = 4 };

	   In C this option does not warn about the universal zero initializer { 0 }:

		   struct s { int f, g, h; };
		   struct s x = { 0 };

	   Likewise, in C++ this option does not warn about the empty { } initializer, for example:

		   struct s { int f, g, h; };
		   s x = { };

	   This	 warning  is  included	in  -Wextra.   To  get	other  -Wextra	warnings  without  this	 one,  use   -Wextra
	   -Wno-missing-field-initializers.

       -Wno-missing-requires
	   By default, the compiler warns about a concept-id appearing as a C++20 simple-requirement:

		   bool satisfied = requires { C };

	   Here	 satisfied  will be true if C is a valid expression, which it is for all T.	Presumably the user meant to
	   write

		   bool satisfied = requires { requires C };

	   so satisfied is only true if concept C is satisfied for type T.

	   This warning can be disabled with -Wno-missing-requires.

       -Wno-missing-template-keyword
	   The member access tokens ., -> and :: must be followed  by  the  "template"	keyword	 if  the  parent  object  is
	   dependent and the member being named is a template.

		   template 
		   void DoStuff (X x)
		   {
		     x.template DoSomeOtherStuff(); // Good.
		     x.DoMoreStuff(); // Warning, x is dependent.
		   }

	   In  rare  cases  it	is possible to get false positives. To silence this, wrap the expression in parentheses. For
	   example, the following is treated as a template, even where m and N are integers:

		   void NotATemplate (my_class t)
		   {
		     int N = 5;

		     bool test = t.m < N > (0); // Treated as a template.
		     test = (t.m < N) > (0); // Same meaning, but not treated as a template.
		   }

	   This warning can be disabled with -Wno-missing-template-keyword.

       -Wno-multichar
	   Do not warn if a multicharacter constant ('FOOF') is used.  Usually they indicate a typo in the user's  code,  as
	   they have implementation-defined values, and should not be used in portable code.

       -Wnormalized=[none|id|nfc|nfkc]
	   In  ISO  C  and  ISO	 C++, two identifiers are different if they are different sequences of characters.  However,
	   sometimes when characters outside the basic ASCII character set are used, you can have  two	different  character
	   sequences that look the same.  To avoid confusion, the ISO 10646 standard sets out some normalization rules which
	   when applied ensure that two sequences that look the same are turned into the same sequence.	 GCC can warn you if
	   you are using identifiers that have not been normalized; this option controls that warning.

	   There  are  four  levels  of	 warning  supported  by GCC.  The default is -Wnormalized=nfc, which warns about any
	   identifier that is not in the ISO 10646 "C" normalized form, NFC.  NFC is the recommended form for most uses.  It
	   is equivalent to -Wnormalized.

	   Unfortunately, there are some characters allowed in identifiers by ISO C and ISO C++ that, when turned into	NFC,
	   are	not  allowed in identifiers.  That is, there's no way to use these symbols in portable ISO C or C++ and have
	   all your identifiers in NFC.	 -Wnormalized=id suppresses the warning for these  characters.	 It  is	 hoped	that
	   future versions of the standards involved will correct this, which is why this option is not the default.

	   You	can  switch  the warning off for all characters by writing -Wnormalized=none or -Wno-normalized.  You should
	   only do this if you are using some other normalization scheme (like "D"), because otherwise you can easily create
	   bugs that are literally impossible to see.

	   Some characters in ISO 10646 have distinct meanings but look identical in some fonts	 or  display  methodologies,
	   especially once formatting has been applied.	 For instance "\u207F", "SUPERSCRIPT LATIN SMALL LETTER N", displays
	   just	 like  a regular "n" that has been placed in a superscript.  ISO 10646 defines the NFKC normalization scheme
	   to convert all these into a standard form as well, and GCC warns  if	 your  code  is	 not  in  NFKC	if  you	 use
	   -Wnormalized=nfkc.	This  warning  is  comparable  to  warning about every identifier that contains the letter O
	   because it might be confused with the digit 0, and so is not the default, but may be useful	as  a  local  coding
	   convention if the programming environment cannot be fixed to display these characters distinctly.

       -Wno-attribute-warning
	   Do  not  warn  about	 usage of functions declared with "warning" attribute.	By default, this warning is enabled.
	   -Wno-attribute-warning can be used to disable the warning or -Wno-error=attribute-warning can be used to  disable
	   the error when compiled with -Werror flag.

       -Wno-deprecated
	   Do not warn about usage of deprecated features.

	   In C++, explicitly specifying -Wdeprecated also enables warnings about some features that are deprecated in later
	   language    standards,    specifically    -Wcomma-subscript,	   -Wvolatile,	 -Wdeprecated-enum-float-conversion,
	   -Wdeprecated-enum-enum-conversion, -Wdeprecated-literal-operator, and -Wdeprecated-variadic-comma-omission.

       -Wno-deprecated-declarations
	   Do not warn about uses of functions, variables,  and	 types	marked	as  deprecated	by  using  the	"deprecated"
	   attribute.

       -Wno-overflow
	   Do not warn about compile-time overflow in constant expressions.

       -Wno-odr
	   Warn about One Definition Rule violations during link-time optimization.  Enabled by default.

       -Wopenacc-parallelism
	   Warn about potentially suboptimal choices related to OpenACC parallelism.

       -Wno-openmp
	   Warn about suspicious OpenMP code.

       -Wopenmp-simd
	   Warn	  if   the   vectorizer	  cost	 model	 overrides   the   OpenMP   simd   directive   set   by	 user.	 The
	   -fsimd-cost-model=unlimited option can be used to relax the cost model.

       -Woverride-init (C and Objective-C only)
	   Warn if an initialized field without side effects is overridden when using designated initializers.

	   This	 warning  is  included	in  -Wextra.   To  get	other  -Wextra	warnings  without  this	 one,  use   -Wextra
	   -Wno-override-init.

       -Wno-override-init-side-effects (C and Objective-C only)
	   Do  not  warn  if  an initialized field with side effects is overridden when using designated initializers.	This
	   warning is enabled by default.

       -Wpacked
	   Warn if a structure is given the packed attribute, but the packed attribute has no effect on the layout  or	size
	   of  the  structure.	 Such  structures  may	be  mis-aligned for little benefit.  For instance, in this code, the
	   variable "f.x" in "struct bar" is misaligned even though "struct bar" does not itself have the packed attribute:

		   struct foo {
		     int x;
		     char a, b, c, d;
		   } __attribute__((packed));
		   struct bar {
		     char z;
		     struct foo f;
		   };

       -Wnopacked-bitfield-compat
	   The 4.1, 4.2 and 4.3 series of GCC ignore the "packed" attribute on bit-fields of type "char".  This was fixed in
	   GCC 4.4 but the change can lead to differences in the structure layout.  GCC informs you when the offset of	such
	   a field has changed in GCC 4.4.  For example there is no longer a 4-bit padding between field "a" and "b" in this
	   structure:

		   struct foo
		   {
		     char a:4;
		     char b:8;
		   } __attribute__ ((packed));

	   This warning is enabled by default.	Use -Wno-packed-bitfield-compat to disable this warning.

       -Wpacked-not-aligned (C, C++, Objective-C and Objective-C++ only)
	   Warn	 if  a	structure  field with explicitly specified alignment in a packed struct or union is misaligned.	 For
	   example, a warning will be issued on "struct S", like, "warning: alignment 1 of 'struct S' is less  than  8",  in
	   this code:

		   struct __attribute__ ((aligned (8))) S8 { char a[8]; };
		   struct __attribute__ ((packed)) S {
		     struct S8 s8;
		   };

	   This warning is enabled by -Wall.

       -Wpadded
	   Warn	 if  padding  is  included in a structure, either to align an element of the structure or to align the whole
	   structure.  Sometimes when this happens it is possible to rearrange the fields of the  structure  to	 reduce	 the
	   padding and so make the structure smaller.

       -Wredundant-decls
	   Warn	 if anything is declared more than once in the same scope, even in cases where multiple declaration is valid
	   and changes nothing.

       -Wrestrict
	   Warn when an object referenced  by  a  "restrict"-qualified	parameter  (or,	 in  C++,  a  "__restrict"-qualified
	   parameter) is aliased by another argument, or when copies between such objects overlap.  For example, the call to
	   the	"strcpy"  function  below  attempts to truncate the string by replacing its initial characters with the last
	   four.  However, because the call writes the terminating NUL into "a[4]", the	 copies	 overlap  and  the  call  is
	   diagnosed.

		   void foo (void)
		   {
		     char a[] = "abcd1234";
		     strcpy (a, a + 4);
		     ...
		   }

	   The	-Wrestrict  option  detects some instances of simple overlap even without optimization but works best at -O2
	   and above.  It is included in -Wall.

       -Wnested-externs (C and Objective-C only)
	   Warn if an "extern" declaration is encountered within a function.

       -Winline
	   Warn if a function that is declared as inline cannot be inlined.  Even with this option, the	 compiler  does	 not
	   warn about failures to inline functions declared in system headers.

	   The	compiler  uses	a  variety of heuristics to determine whether or not to inline a function.  For example, the
	   compiler takes into account the size of the function being inlined and the amount of inlining  that	has  already
	   been	 done  in  the current function.  Therefore, seemingly insignificant changes in the source program can cause
	   the warnings produced by -Winline to appear or disappear.

       -Winterference-size
	   Warn about use of C++17 "std::hardware_destructive_interference_size" without specifying its value  with  --param
	   destructive-interference-size.  Also warn about questionable values for that option.

	   This variable is intended to be used for controlling class layout, to avoid false sharing in concurrent code:

		   struct independent_fields {
		     alignas(std::hardware_destructive_interference_size)
		       std::atomic one;
		     alignas(std::hardware_destructive_interference_size)
		       std::atomic two;
		   };

	   Here	 one  and  two are intended to be far enough apart that stores to one won't require accesses to the other to
	   reload the cache line.

	   By default, --param destructive-interference-size and --param constructive-interference-size are set based on the
	   current -mtune option, typically to the L1 cache line size for the particular target CPU, sometimes to a range if
	   tuning for a generic target.	 So all translation units that depend on ABI compatibility  for	 the  use  of  these
	   variables must be compiled with the same -mtune (or -mcpu).

	   If  ABI  stability is important, such as if the use is in a header for a library, you should probably not use the
	   hardware interference size variables at all.	 Alternatively, you can force a particular value with --param.

	   If you are confident that your use of the variable does not affect ABI outside a single build  of  your  project,
	   you can turn off the warning with -Wno-interference-size.

       -Wint-in-bool-context
	   Warn for suspicious use of integer values where boolean values are expected, such as conditional expressions (?:)
	   using  non-boolean  integer constants in boolean context, like "if (a <= b ? 2 : 3)".  Or left shifting of signed
	   integers in boolean context, like "for (a = 0; 1 <<	a;  a++);".   Likewise	for  all  kinds	 of  multiplications
	   regardless of the data type.	 This warning is enabled by -Wall.

       -Wno-int-to-pointer-cast
	   Suppress warnings from casts to pointer type of an integer of a different size. In C++, casting to a pointer type
	   of smaller size is an error. Wint-to-pointer-cast is enabled by default.

       -Wno-pointer-to-int-cast (C and Objective-C only)
	   Suppress warnings from casts from a pointer to an integer type of a different size.

       -Winvalid-pch
	   Warn if a precompiled header is found in the search path but cannot be used.

       -Winvalid-utf8
	   Warn if an invalid UTF-8 character is found.	 This warning is on by default for C++23 if -finput-charset=UTF-8 is
	   used and turned into error with -pedantic-errors.

       -Wno-unicode
	   Don't  diagnose  invalid  forms  of	delimited  or  named  escape sequences which are treated as separate tokens.
	   Wunicode is enabled by default.

       -Wlong-long
	   Warn if "long long" type is used.  This is enabled by either -Wpedantic or -Wtraditional in	ISO  C90  and  C++98
	   modes.  To inhibit the warning messages, use -Wno-long-long.

	   This warning is upgraded to an error by -pedantic-errors.

       -Wvariadic-macros
	   Warn	 if  variadic macros are used in ISO C90 mode, or if the GNU alternate syntax is used in ISO C99 mode.	This
	   is enabled by either -Wpedantic or -Wtraditional.  To inhibit the warning messages, use -Wno-variadic-macros.

       -Wno-varargs
	   Do not warn upon questionable usage of the macros used to  handle  variable	arguments  like	 "va_start".   These
	   warnings are enabled by default.

       -Wvector-operation-performance
	   Warn	 if  vector  operation	is not implemented via SIMD capabilities of the architecture.  Mainly useful for the
	   performance tuning.	Vector operation can be implemented "piecewise", which means that the  scalar  operation  is
	   performed  on  every	 vector	 element;  "in parallel", which means that the vector operation is implemented using
	   scalars of wider type, which normally is more performance efficient; and "as a single scalar", which	 means	that
	   vector fits into a scalar type.

       -Wvla
	   Warn	 if  a variable-length array is used in the code.  -Wno-vla prevents the -Wpedantic warning of the variable-
	   length array.

	   This warning is upgraded to an error by -pedantic-errors.

       -Wvla-larger-than=byte-size
	   If this option is used, the compiler warns for declarations	of  variable-length  arrays  whose  size  is  either
	   unbounded,  or  bounded  by an argument that allows the array size to exceed byte-size bytes.  This is similar to
	   how -Walloca-larger-than=byte-size works, but with variable-length arrays.

	   Note that GCC may optimize small variable-length arrays of a known value into plain arrays, so this	warning	 may
	   not get triggered for such arrays.

	   -Wvla-larger-than=PTRDIFF_MAX  is  enabled  by  default but is typically only effective when -ftree-vrp is active
	   (default for -O2 and above).

	   See also -Walloca-larger-than=byte-size.

       -Wno-vla-larger-than
	   Disable -Wvla-larger-than= warnings.	 The option is equivalent to -Wvla-larger-than=SIZE_MAX or larger.

       -Wvla-parameter
	   Warn about redeclarations of functions involving arguments of Variable Length Array types of	 inconsistent  kinds
	   or  forms,  and  enable  the	 detection  of	out-of-bounds  accesses	 to  such  parameters  by  warnings  such as
	   -Warray-bounds.

	   If the first function declaration uses the VLA form the bound specified in the array is assumed to be the minimum
	   number of elements expected to be provided in calls to the function and the maximum number of  elements  accessed
	   by it.  Failing to provide arguments of sufficient size or accessing more than the maximum number of elements may
	   be diagnosed.

	   For	example,  the warning triggers for the following redeclarations because the first one allows an array of any
	   size to be passed to "f" while the second one specifies that the array argument must have at least "n"  elements.
	   In  addition,  calling  "f"	with the associated VLA bound parameter in excess of the actual VLA bound triggers a
	   warning as well.

		   void f (int n, int[n]);
		   // warning: argument 2 previously declared as a VLA
		   void f (int, int[]);

		   void g (int n)
		   {
		       if (n > 4)
			 return;
		       int a[n];
		       // warning: access to a by f may be out of bounds
		       f (sizeof a, a);
		     ...
		   }

	   -Wvla-parameter is included in -Wall.  The  -Warray-parameter  option  triggers  warnings  for  similar  problems
	   involving ordinary array arguments.

       -Wvolatile-register-var
	   Warn	 if a register variable is declared volatile.  The volatile modifier does not inhibit all optimizations that
	   may eliminate reads and/or writes to register variables.  This warning is enabled by -Wall.

       -Wno-xor-used-as-pow (C, C++, Objective-C and Objective-C++ only)
	   Disable warnings about uses of "^", the exclusive or operator, where it appears the	code  meant  exponentiation.
	   Specifically,  the warning occurs when the left-hand side is the decimal constant 2 or 10 and the right-hand side
	   is also a decimal constant.

	   In C and C++, "^" means exclusive or, whereas in some other languages (e.g. TeX and some versions  of  BASIC)  it
	   means exponentiation.

	   This	 warning  can  be  silenced  by	 converting  one of the operands to hexadecimal as well as by compiling with
	   -Wno-xor-used-as-pow.

       -Wdisabled-optimization
	   Warn if a requested optimization pass is disabled.  This warning  does  not	generally  indicate  that  there  is
	   anything  wrong  with  your	code;  it  merely  indicates  that  GCC's  optimizers  are unable to handle the code
	   effectively.	 Often, the problem is that your code is too big or too complex; GCC refuses  to  optimize  programs
	   when the optimization itself is likely to take inordinate amounts of time.

       -Wpointer-sign (C and Objective-C only)
	   Warn	 for  pointer argument passing or assignment with different signedness.	 This option is only supported for C
	   and Objective-C.  It is implied by -Wall and by -Wpedantic, which can be disabled with -Wno-pointer-sign.

	   This warning is upgraded to an error by -pedantic-errors.

       -Wstack-protector
	   This option is only active when -fstack-protector is active.	 It warns about functions  that	 are  not  protected
	   against stack smashing.

       -Woverlength-strings
	   Warn	 about	string	constants  that	 are  longer  than the "minimum maximum" length specified in the C standard.
	   Modern compilers generally allow string constants that are much longer than the  standard's	minimum	 limit,	 but
	   very portable programs should avoid using longer strings.

	   The	limit  applies	after string constant concatenation, and does not count the trailing NUL.  In C90, the limit
	   was 509 characters; in C99, it was raised to 4095.  C++98 does not specify a normative minimum maximum, so we  do
	   not diagnose overlength strings in C++.

	   This option is implied by -Wpedantic, and can be disabled with -Wno-overlength-strings.

       -Wunsuffixed-float-constants (C and Objective-C only)
	   Issue  a warning for any floating constant that does not have a suffix.  When used together with -Wsystem-headers
	   it warns about such constants in system header files.  This can be useful when preparing code  to  use  with	 the
	   "FLOAT_CONST_DECIMAL64" pragma from the decimal floating-point extension to C99.

       -Wno-lto-type-mismatch
	   During  the	link-time  optimization,  do  not  warn	 about type mismatches in global declarations from different
	   compilation units.  Requires -flto to be enabled.  Enabled by default.

       -Wno-designated-init (C and Objective-C only)
	   Suppress warnings when a positional initializer is used to initialize a structure that has been marked  with	 the
	   "designated_init" attribute.

   Options That Control Static Analysis
       -fanalyzer
	   This	 option	 enables  an  static  analysis	of  program flow which looks for "interesting" interprocedural paths
	   through the code, and issues warnings for problems found on them.

	   This analysis is much more expensive than other GCC warnings.

	   In technical terms, it performs coverage-guided symbolic execution of the code being	 compiled.   It	 is  neither
	   sound  nor  complete:  it  can have false positives and false negatives.  It is a bug-finding tool, rather than a
	   tool for proving program correctness.

	   The analyzer is only suitable for use on C code in this release.

	   Enabling this option effectively enables the following warnings:

	   -Wanalyzer-allocation-size	 -Wanalyzer-deref-before-check	  -Wanalyzer-double-fclose    -Wanalyzer-double-free
	   -Wanalyzer-exposure-through-output-file				     -Wanalyzer-exposure-through-uninit-copy
	   -Wanalyzer-fd-access-mode-mismatch  -Wanalyzer-fd-double-close  -Wanalyzer-fd-leak	-Wanalyzer-fd-phase-mismatch
	   -Wanalyzer-fd-type-mismatch	-Wanalyzer-fd-use-after-close  -Wanalyzer-fd-use-without-check	-Wanalyzer-file-leak
	   -Wanalyzer-free-of-non-heap		    -Wanalyzer-imprecise-fp-arithmetic		    -Wanalyzer-infinite-loop
	   -Wanalyzer-infinite-recursion		 -Wanalyzer-jump-through-null		      -Wanalyzer-malloc-leak
	   -Wanalyzer-mismatching-deallocation -Wanalyzer-null-argument -Wanalyzer-null-dereference -Wanalyzer-out-of-bounds
	   -Wanalyzer-overlapping-buffers	-Wanalyzer-possible-null-argument	-Wanalyzer-possible-null-dereference
	   -Wanalyzer-putenv-of-auto-var	   -Wanalyzer-shift-count-negative	     -Wanalyzer-shift-count-overflow
	   -Wanalyzer-stale-setjmp-buffer	  -Wanalyzer-tainted-allocation-size	      -Wanalyzer-tainted-array-index
	   -Wanalyzer-tainted-assertion	   -Wanalyzer-tainted-divisor	 -Wanalyzer-tainted-offset   -Wanalyzer-tainted-size
	   -Wanalyzer-undefined-behavior-ptrdiff					-Wanalyzer-undefined-behavior-strtok
	   -Wanalyzer-unsafe-call-within-signal-handler						   -Wanalyzer-use-after-free
	   -Wanalyzer-use-of-pointer-in-stale-stack-frame			       -Wanalyzer-use-of-uninitialized-value
	   -Wanalyzer-va-arg-type-mismatch		  -Wanalyzer-va-list-exhausted		     -Wanalyzer-va-list-leak
	   -Wanalyzer-va-list-use-after-va-end -Wanalyzer-write-to-const -Wanalyzer-write-to-string-literal

	   This option is only available if GCC was configured with analyzer support enabled.

       -Wanalyzer-symbol-too-complex
	   If -fanalyzer is enabled, the analyzer uses various heuristics to attempt to track the state of memory, but these
	   can be defeated by sufficiently complicated code.

	   By default, the analysis silently stops tracking values of expressions if they exceed the  threshold	 defined  by
	   --param analyzer-max-svalue-depth=value, and falls back to an imprecise representation for such expressions.	 The
	   -Wanalyzer-symbol-too-complex option warns if this occurs.

       -Wanalyzer-too-complex
	   If  -fanalyzer  is  enabled, the analyzer uses various heuristics to attempt to explore the control flow and data
	   flow in the program, but these can be defeated by sufficiently complicated code.

	   By default, the analysis silently stops if the code is too complicated for the analyzer to fully explore  and  it
	   reaches an internal limit.  The -Wanalyzer-too-complex option warns if this occurs.

       -Wno-analyzer-allocation-size
	   This warning requires -fanalyzer, which enables it; to disable it, use -Wno-analyzer-allocation-size.

	   This	 diagnostic warns for paths through the code in which a pointer to a buffer is assigned to point at a buffer
	   with a size that is not a multiple of "sizeof (*pointer)".

	   See	CWE-131: Incorrect Calculation of Buffer Size ("https://cwe.mitre.org/data/definitions/131.html").

       -Wno-analyzer-deref-before-check
	   This warning requires -fanalyzer, which enables it; use -Wno-analyzer-deref-before-check to disable it.

	   This diagnostic warns for paths through the code in which a pointer is checked for "NULL" *after* it has  already
	   been	 dereferenced, suggesting that the pointer could have been NULL.  Such cases suggest that the check for NULL
	   is either redundant, or that it needs to be moved to before the pointer is dereferenced.

	   This diagnostic also considers values passed to a function argument	marked	with  "__attribute__((nonnull))"  as
	   requiring  a	 non-NULL  value,  and thus will complain if such values are checked for "NULL" after returning from
	   such a function call.

	   This diagnostic is unlikely to be reported when any level of optimization is enabled, as GCC's optimization logic
	   will typically consider such checks for NULL as being redundant, and	 optimize  them	 away  before  the  analyzer
	   "sees" them.	 Hence optimization should be disabled when attempting to trigger this diagnostic.

       -Wno-analyzer-double-fclose
	   This warning requires -fanalyzer, which enables it; use -Wno-analyzer-double-fclose to disable it.

	   This	 diagnostic  warns  for	 paths through the code in which a "FILE *" can have "fclose" called on it more than
	   once.

	   See	CWE-1341: Multiple Releases of Same Resource or Handle ("https://cwe.mitre.org/data/definitions/1341.html").

       -Wno-analyzer-double-free
	   This warning requires -fanalyzer, which enables it; use -Wno-analyzer-double-free to disable it.

	   This diagnostic warns for paths through the code in which a pointer can have a deallocator called on it more than
	   once, either "free", or a deallocator referenced by attribute "malloc".

	   See	CWE-415: Double Free ("https://cwe.mitre.org/data/definitions/415.html").

       -Wno-analyzer-exposure-through-output-file
	   This warning requires -fanalyzer, which enables it; use -Wno-analyzer-exposure-through-output-file to disable it.

	   This diagnostic warns for paths through the code in which a security-sensitive value is written to an output file
	   (such as writing a password to a log file).

	   See	CWE-532: Information Exposure Through Log Files ("https://cwe.mitre.org/data/definitions/532.html").

       -Wanalyzer-exposure-through-uninit-copy
	   This warning requires both -fanalyzer and the use of a plugin to specify a function that copies across  a  "trust
	   boundary".  Use -Wno-analyzer-exposure-through-uninit-copy to disable it.

	   This	 diagnostic warns for "infoleaks" - paths through the code in which uninitialized values are copied across a
	   security boundary (such as code within an OS kernel that copies a partially-initialized struct on  the  stack  to
	   user space).

	   See	     CWE-200:	   Exposure	 of	 Sensitive	Information	to     an     Unauthorized     Actor
	   ("https://cwe.mitre.org/data/definitions/200.html").

       -Wno-analyzer-fd-access-mode-mismatch
	   This warning requires -fanalyzer, which enables it; use -Wno-analyzer-fd-access-mode-mismatch to disable it.

	   This diagnostic warns for paths through code in which a "read" on a write-only file descriptor is  attempted,  or
	   vice versa.

	   This diagnostic also warns for code paths in a which a function with attribute "fd_arg_read (N)" is called with a
	   file descriptor opened with "O_WRONLY" at referenced argument "N" or a function with attribute "fd_arg_write (N)"
	   is called with a file descriptor opened with "O_RDONLY" at referenced argument N.

       -Wno-analyzer-fd-double-close
	   This warning requires -fanalyzer, which enables it; use -Wno-analyzer-fd-double-close to disable it.

	   This diagnostic warns for paths through code in which a file descriptor can be closed more than once.

	   See	CWE-1341: Multiple Releases of Same Resource or Handle ("https://cwe.mitre.org/data/definitions/1341.html").

       -Wno-analyzer-fd-leak
	   This warning requires -fanalyzer, which enables it; use -Wno-analyzer-fd-leak to disable it.

	   This diagnostic warns for paths through code in which an open file descriptor is leaked.

	   See	   CWE-775:    Missing	  Release    of	   File	   Descriptor	 or    Handle	after	Effective   Lifetime
	   ("https://cwe.mitre.org/data/definitions/775.html").

       -Wno-analyzer-fd-phase-mismatch
	   This warning requires -fanalyzer, which enables it; use -Wno-analyzer-fd-phase-mismatch to disable it.

	   This diagnostic warns for paths through code in which an operation is attempted in the  wrong  phase	 of  a	file
	   descriptor's	 lifetime.   For  example, it will warn on attempts to call "accept" on a stream socket that has not
	   yet had "listen" successfully called on it.

	   See	     CWE-666:	   Operation	  on	   Resource	  in	   Wrong       Phase	   of	    Lifetime
	   ("https://cwe.mitre.org/data/definitions/666.html").

       -Wno-analyzer-fd-type-mismatch
	   This warning requires -fanalyzer, which enables it; use -Wno-analyzer-fd-type-mismatch to disable it.

	   This	 diagnostic  warns  for	 paths	through	 code  in  which an operation is attempted on the wrong type of file
	   descriptor.	For example, it will warn on attempts to use socket operations on a  file  descriptor  obtained	 via
	   "open", or when attempting to use a stream socket operation on a datagram socket.

       -Wno-analyzer-fd-use-after-close
	   This warning requires -fanalyzer, which enables it; use -Wno-analyzer-fd-use-after-close to disable it.

	   This diagnostic warns for paths through code in which a read or write is called on a closed file descriptor.

	   This diagnostic also warns for paths through code in which a function with attribute "fd_arg (N)" or "fd_arg_read
	   (N)" or "fd_arg_write (N)" is called with a closed file descriptor at referenced argument "N".

       -Wno-analyzer-fd-use-without-check
	   This warning requires -fanalyzer, which enables it; use -Wno-analyzer-fd-use-without-check to disable it.

	   This	 diagnostic  warns  for	 paths	through	 code  in  which a file descriptor is used without being checked for
	   validity.

	   This diagnostic also warns for paths through code in which a function with attribute "fd_arg (N)" or "fd_arg_read
	   (N)" or "fd_arg_write (N)" is called with a file descriptor, at referenced argument "N",  without  being  checked
	   for validity.

       -Wno-analyzer-file-leak
	   This warning requires -fanalyzer, which enables it; use -Wno-analyzer-file-leak to disable it.

	   This diagnostic warns for paths through the code in which a "" "FILE *" stream object is leaked.

	   See	   CWE-775:    Missing	  Release    of	   File	   Descriptor	 or    Handle	after	Effective   Lifetime
	   ("https://cwe.mitre.org/data/definitions/775.html").

       -Wno-analyzer-free-of-non-heap
	   This warning requires -fanalyzer, which enables it; use -Wno-analyzer-free-of-non-heap to disable it.

	   This diagnostic warns for paths through the code in which "free" is called on a non-heap  pointer  (e.g.  an	 on-
	   stack buffer, or a global).

	   See	CWE-590: Free of Memory not on the Heap ("https://cwe.mitre.org/data/definitions/590.html").

       -Wno-analyzer-imprecise-fp-arithmetic
	   This warning requires -fanalyzer, which enables it; use -Wno-analyzer-imprecise-fp-arithmetic to disable it.

	   This	 diagnostic  warns  for paths through the code in which floating-point arithmetic is used in locations where
	   precise computation is needed.  This	 diagnostic  only  warns  on  use  of  floating-point  operands	 inside	 the
	   calculation of an allocation size at the moment.

       -Wno-analyzer-infinite-loop
	   This warning requires -fanalyzer, which enables it; use -Wno-analyzer-infinite-loop to disable it.

	   This diagnostics warns for paths through the code which appear to lead to an infinite loop.

	   Specifically, the analyzer will issue this warning when it "sees" a loop in which:

	   *   no externally-visible work could be being done within the loop

	   *   there is no way to escape from the loop

	   *   the analyzer is sufficiently confident about the program state throughout the loop to know that the above are
	       true

	   One	way  for  this	warning to be emitted is when there is an execution path through a loop for which taking the
	   path on one iteration implies that the same path will be taken on all subsequent iterations.

	   For example, consider:

		     while (1)
		       {
			 char opcode = *cpu_state.pc;
			 switch (opcode)
			  {
			  case OPCODE_FOO:
			    handle_opcode_foo (&cpu_state);
			    break;
			  case OPCODE_BAR:
			    handle_opcode_bar (&cpu_state);
			    break;
			  }
		       }

	   The analyzer will complain for the above case because if "opcode" ever matches none of the  cases,  the  "switch"
	   will	 follow the implicit "default" case, making the body of the loop be a "no-op" with "cpu_state.pc" unchanged,
	   and thus using the same value of "opcode" on all subseqent iterations, leading to an infinite loop.

	   See	     CWE-835:	   Loop	     with	Unreachable	  Exit	     Condition	     ('Infinite	      Loop')
	   ("https://cwe.mitre.org/data/definitions/835.html").

       -Wno-analyzer-infinite-recursion
	   This warning requires -fanalyzer, which enables it; use -Wno-analyzer-infinite-recursion to disable it.

	   This diagnostics warns for paths through the code which appear to lead to infinite recursion.

	   Specifically,  when the analyzer "sees" a recursive call, it will compare the state of memory at the entry to the
	   new frame with that at the entry to the previous frame of that function on the stack.  The warning is  issued  if
	   nothing  in	memory	appears to be changing; any changes observed to parameters or globals are assumed to lead to
	   termination of the recursion and thus suppress the warning.

	   This diagnostic is likely to miss cases of infinite recursion that are convered to  iteration  by  the  optimizer
	   before  the	analyzer  "sees"  them.	  Hence	 optimization  should  be  disabled  when attempting to trigger this
	   diagnostic.

	   Compare with -Winfinite-recursion, which provides a similar diagnostic, but is implemented in a different way.

	   See	CWE-674: Uncontrolled Recursion ("https://cwe.mitre.org/data/definitions/674.html").

       -Wno-analyzer-jump-through-null
	   This warning requires -fanalyzer, which enables it; use -Wno-analyzer-jump-through-null to disable it.

	   This diagnostic warns for paths through the code in which a "NULL" function pointer is called.

       -Wno-analyzer-malloc-leak
	   This warning requires -fanalyzer, which enables it; use -Wno-analyzer-malloc-leak to disable it.

	   This diagnostic warns for paths through the code in which a pointer allocated via an allocator is leaked:  either
	   "malloc", or a function marked with attribute "malloc".

	   See	       CWE-401:	      Missing	    Release	  of	   Memory	after	    Effective	    Lifetime
	   ("https://cwe.mitre.org/data/definitions/401.html").

       -Wno-analyzer-mismatching-deallocation
	   This warning requires -fanalyzer, which enables it; use -Wno-analyzer-mismatching-deallocation to disable it.

	   This diagnostic warns for paths through the code in which the wrong deallocation function is called on a  pointer
	   value, based on which function was used to allocate the pointer value.  The diagnostic will warn about mismatches
	   between  "free",  scalar  "delete"  and  vector "delete[]", and those marked as allocator/deallocator pairs using
	   attribute "malloc".

	   See	CWE-762: Mismatched Memory Management Routines ("https://cwe.mitre.org/data/definitions/762.html").

       -Wno-analyzer-out-of-bounds
	   This warning requires -fanalyzer, which enables it; use -Wno-analyzer-out-of-bounds to disable it.

	   This diagnostic warns for paths through the code in which a buffer is definitely read or  written  out-of-bounds.
	   The	diagnostic applies for cases where the analyzer is able to determine a constant offset and for accesses past
	   the end of a buffer, also a constant capacity.  Further, the diagnostic does limited checking for  accesses	past
	   the end when the offset as well as the capacity is symbolic.

	   See	   CWE-119:    Improper	   Restriction	  of   Operations   within   the   Bounds   of	 a   Memory   Buffer
	   ("https://cwe.mitre.org/data/definitions/119.html").

	   For cases where the analyzer is able, it will emit a	 text  art  diagram  visualizing  the  spatial	relationship
	   between  the memory region that the analyzer predicts would be accessed, versus the range of memory that is valid
	   to access: whether they overlap, are touching, are close or far apart; which one is before or  after	 in  memory,
	   the	relative sizes involved, the direction of the access (read vs write), and, in some cases, the values of data
	   involved.  This diagram can be suppressed using -fdiagnostics-text-art-charset=none.

       -Wno-analyzer-overlapping-buffers
	   This warning requires -fanalyzer, which enables it; use -Wno-analyzer-overlapping-buffers to disable it.

	   This diagnostic warns for paths through the code in which overlapping buffers are passed to an API for which	 the
	   behavior on such buffers is undefined.

	   Specifically, the diagnostic occurs on calls to the following functions

	   *<"memcpy">
	   *<"strcat">
	   *<"strcpy">

	   for cases where the buffers are known to overlap.

       -Wno-analyzer-possible-null-argument
	   This warning requires -fanalyzer, which enables it; use -Wno-analyzer-possible-null-argument to disable it.

	   This	 diagnostic warns for paths through the code in which a possibly-NULL value is passed to a function argument
	   marked with "__attribute__((nonnull))" as requiring a non-NULL value.

	   See	      CWE-690:	     Unchecked	     Return	  Value	      to       NULL	  Pointer	 Dereference
	   ("https://cwe.mitre.org/data/definitions/690.html").

       -Wno-analyzer-possible-null-dereference
	   This warning requires -fanalyzer, which enables it; use -Wno-analyzer-possible-null-dereference to disable it.

	   This diagnostic warns for paths through the code in which a possibly-NULL value is dereferenced.

	   See	       CWE-690:	      Unchecked	      Return	   Value       to	NULL	   Pointer	 Dereference
	   ("https://cwe.mitre.org/data/definitions/690.html").

       -Wno-analyzer-null-argument
	   This warning requires -fanalyzer, which enables it; use -Wno-analyzer-null-argument to disable it.

	   This diagnostic warns for paths through the code in which a value known to  be  NULL	 is  passed  to	 a  function
	   argument marked with "__attribute__((nonnull))" as requiring a non-NULL value.

	   See	CWE-476: NULL Pointer Dereference ("https://cwe.mitre.org/data/definitions/476.html").

       -Wno-analyzer-null-dereference
	   This warning requires -fanalyzer, which enables it; use -Wno-analyzer-null-dereference to disable it.

	   This diagnostic warns for paths through the code in which a value known to be NULL is dereferenced.

	   See	CWE-476: NULL Pointer Dereference ("https://cwe.mitre.org/data/definitions/476.html").

       -Wno-analyzer-putenv-of-auto-var
	   This warning requires -fanalyzer, which enables it; use -Wno-analyzer-putenv-of-auto-var to disable it.

	   This	 diagnostic warns for paths through the code in which a call to "putenv" is passed a pointer to an automatic
	   variable or an on-stack buffer.

	   See	 POS34-C.  Do  not  call  putenv()  with  a   pointer	to   an	  automatic   variable	 as   the   argument
	   ("https://wiki.sei.cmu.edu/confluence/x/6NYxBQ").

       -Wno-analyzer-shift-count-negative
	   This warning requires -fanalyzer, which enables it; use -Wno-analyzer-shift-count-negative to disable it.

	   This	 diagnostic  warns  for	 paths	through the code in which a shift is attempted with a negative count.  It is
	   analogous to the -Wshift-count-negative diagnostic implemented in the C/C++ front ends, but is implemented  based
	   on  analyzing  interprocedural paths, rather than merely parsing the syntax tree.  However, the analyzer does not
	   prioritize detection of such paths, so false negatives are more likely relative to other warnings.

       -Wno-analyzer-shift-count-overflow
	   This warning requires -fanalyzer, which enables it; use -Wno-analyzer-shift-count-overflow to disable it.

	   This diagnostic warns for paths through the code in which a shift is attempted with a count greater than or equal
	   to the precision of the operand's type.  It is analogous to the -Wshift-count-overflow diagnostic implemented  in
	   the C/C++ front ends, but is implemented based on analyzing interprocedural paths, rather than merely parsing the
	   syntax  tree.   However,  the  analyzer  does not prioritize detection of such paths, so false negatives are more
	   likely relative to other warnings.

       -Wno-analyzer-stale-setjmp-buffer
	   This warning requires -fanalyzer, which enables it; use -Wno-analyzer-stale-setjmp-buffer to disable it.

	   This diagnostic warns for paths through the code in which "longjmp" is called to rewind to a	 "jmp_buf"  relating
	   to a "setjmp" call in a function that has returned.

	   When	 "setjmp" is called on a "jmp_buf" to record a rewind location, it records the stack frame.  The stack frame
	   becomes invalid when the function containing the "setjmp" call returns.  Attempting to rewind to it via "longjmp"
	   would reference a stack frame that no longer exists, and likely lead to a crash (or worse).

       -Wno-analyzer-tainted-allocation-size
	   This warning requires -fanalyzer which enables it; use -Wno-analyzer-tainted-allocation-size to disable it.

	   This diagnostic warns for paths through the code in which a value that could be under an  attacker's	 control  is
	   used	 as the size of an allocation without being sanitized, so that an attacker could inject an excessively large
	   allocation and potentially cause a denial of service attack.

	   See	CWE-789: Memory Allocation with Excessive Size Value ("https://cwe.mitre.org/data/definitions/789.html").

       -Wno-analyzer-tainted-assertion
	   This warning requires -fanalyzer which enables it; use -Wno-analyzer-tainted-assertion to disable it.

	   This diagnostic warns for paths through the code in which a value that could be under an  attacker's	 control  is
	   used	 as part of a condition without being first sanitized, and that condition guards a call to a function marked
	   with attribute "noreturn" (such as the function  "__builtin_unreachable").	Such  functions	 typically  indicate
	   abnormal termination of the program, such as for assertion failure handlers.	 For example:

		   assert (some_tainted_value < SOME_LIMIT);

	   In such cases:

	   *   when  assertion-checking	 is enabled: an attacker could trigger a denial of service by injecting an assertion
	       failure

	   *   when assertion-checking is disabled, such as by	defining  "NDEBUG",  an	 attacker  could  inject  data	that
	       subverts the process, since it presumably violates a precondition that is being assumed by the code.

	   Note	 that  when  assertion-checking is disabled, the assertions are typically removed by the preprocessor before
	   the analyzer has a chance to "see" them, so this diagnostic	can  only  generate  warnings  on  builds  in  which
	   assertion-checking is enabled.

	   For	the  purpose  of  this	warning,  any  function marked with attribute "noreturn" is considered as a possible
	   assertion failure handler, including "__builtin_unreachable".  Note that these functions are sometimes removed by
	   the optimizer before the analyzer "sees" them.  Hence optimization should be disabled when attempting to  trigger
	   this diagnostic.

	   See	CWE-617: Reachable Assertion ("https://cwe.mitre.org/data/definitions/617.html").

	   The warning can also report problematic constructions such as

		   switch (some_tainted_value) {
		   case 0:
		     /* [...etc; various valid cases omitted...] */
		     break;

		   default:
		     __builtin_unreachable (); /* BUG: attacker can trigger this  */
		   }

	   despite the above not being an assertion failure, strictly speaking.

       -Wno-analyzer-tainted-array-index
	   This warning requires -fanalyzer which enables it; use -Wno-analyzer-tainted-array-index to disable it.

	   This	 diagnostic  warns  for paths through the code in which a value that could be under an attacker's control is
	   used as the index of an array access without being sanitized, so that an attacker could inject  an  out-of-bounds
	   access.

	   See	CWE-129: Improper Validation of Array Index ("https://cwe.mitre.org/data/definitions/129.html").

       -Wno-analyzer-tainted-divisor
	   This warning requires -fanalyzer which enables it; use -Wno-analyzer-tainted-divisor to disable it.

	   This	 diagnostic  warns  for paths through the code in which a value that could be under an attacker's control is
	   used as the divisor in a division or modulus operation without being sanitized, so that an attacker could  inject
	   a division-by-zero.

	   See	CWE-369: Divide By Zero ("https://cwe.mitre.org/data/definitions/369.html").

       -Wno-analyzer-tainted-offset
	   This warning requires -fanalyzer which enables it; use -Wno-analyzer-tainted-offset to disable it.

	   This	 diagnostic  warns  for paths through the code in which a value that could be under an attacker's control is
	   used as a pointer offset without being sanitized, so that an attacker could inject an out-of-bounds access.

	   See	CWE-823: Use of Out-of-range Pointer Offset ("https://cwe.mitre.org/data/definitions/823.html").

       -Wno-analyzer-tainted-size
	   This warning requires -fanalyzer which enables it; use -Wno-analyzer-tainted-size to disable it.

	   This diagnostic warns for paths through the code in which a value that could be under an  attacker's	 control  is
	   used	 as  the  size of an operation such as "memset" without being sanitized, so that an attacker could inject an
	   out-of-bounds access.

	   See	CWE-129: Improper Validation of Array Index ("https://cwe.mitre.org/data/definitions/129.html").

       -Wno-analyzer-undefined-behavior-ptrdiff
	   This warning requires -fanalyzer, which enables it; use -Wno-analyzer-undefined-behavior-ptrdiff to disable it.

	   This diagnostic warns for paths through the code in which a pointer subtraction occurs where the  pointers  refer
	   to  different  chunks  of memory.  Such code relies on undefined behavior, as pointer subtraction is only defined
	   for cases where both pointers point to within (or just after) the same array.

	   See	CWE-469: Use of Pointer Subtraction to Determine Size ("https://cwe.mitre.org/data/definitions/469.html").

       -Wno-analyzer-undefined-behavior-strtok
	   This warning requires -fanalyzer, which enables it; use -Wno-analyzer-undefined-behavior-strtok to disable it.

	   This diagnostic warns for paths through the code in which a call is made to "strtok" with undefined behavior.

	   Specifically, passing NULL as the first parameter for the initial call to "strtok" within a process has undefined
	   behavior.

       -Wno-analyzer-unsafe-call-within-signal-handler
	   This warning requires  -fanalyzer,  which  enables  it;  use	 -Wno-analyzer-unsafe-call-within-signal-handler  to
	   disable it.

	   This	 diagnostic  warns  for	 paths through the code in which a function known to be async-signal-unsafe (such as
	   "fprintf") is called from a signal handler.

	   See	CWE-479: Signal Handler Use of a Non-reentrant Function ("https://cwe.mitre.org/data/definitions/479.html").

       -Wno-analyzer-use-after-free
	   This warning requires -fanalyzer, which enables it; use -Wno-analyzer-use-after-free to disable it.

	   This diagnostic warns for paths through the code in which a pointer is used after a deallocator is called on	 it:
	   either "free", or a deallocator referenced by attribute "malloc".

	   See	CWE-416: Use After Free ("https://cwe.mitre.org/data/definitions/416.html").

       -Wno-analyzer-use-of-pointer-in-stale-stack-frame
	   This	 warning  requires  -fanalyzer,	 which	enables it; use -Wno-analyzer-use-of-pointer-in-stale-stack-frame to
	   disable it.

	   This diagnostic warns for paths through the code in which a pointer is dereferenced that points to a variable  in
	   a stale stack frame.

       -Wno-analyzer-va-arg-type-mismatch
	   This warning requires -fanalyzer, which enables it; use -Wno-analyzer-va-arg-type-mismatch to disable it.

	   This diagnostic warns for interprocedural paths through the code for which the analyzer detects an attempt to use
	   "va_arg" to extract a value passed to a variadic call, but uses a type that does not match that of the expression
	   passed to the call.

	   See	CWE-686: Function Call With Incorrect Argument Type ("https://cwe.mitre.org/data/definitions/686.html").

       -Wno-analyzer-va-list-exhausted
	   This warning requires -fanalyzer, which enables it; use -Wno-analyzer-va-list-exhausted to disable it.

	   This diagnostic warns for interprocedural paths through the code for which the analyzer detects an attempt to use
	   "va_arg"  to access the next value passed to a variadic call, but all of the values in the "va_list" have already
	   been consumed.

	   See	      CWE-685:	     Function	    Call       With	  Incorrect	   Number	 of	   Arguments
	   ("https://cwe.mitre.org/data/definitions/685.html").

       -Wno-analyzer-va-list-leak
	   This warning requires -fanalyzer, which enables it; use -Wno-analyzer-va-list-leak to disable it.

	   This	 diagnostic  warns for interprocedural paths through the code for which the analyzer detects that "va_start"
	   or "va_copy" has been called on a "va_list" without a corresponding call to "va_end".

       -Wno-analyzer-va-list-use-after-va-end
	   This warning requires -fanalyzer, which enables it; use -Wno-analyzer-va-list-use-after-va-end to disable it.

	   This diagnostic warns for interprocedural paths through the code for which the analyzer detects an attempt to use
	   a "va_list"	after "va_end" has been called on it.  "va_list".

       -Wno-analyzer-write-to-const
	   This warning requires -fanalyzer, which enables it; use -Wno-analyzer-write-to-const to disable it.

	   This diagnostic warns for paths through the code in which the analyzer detects an  attempt  to  write  through  a
	   pointer  to	a  "const"  object.   However,	the  analyzer  does not prioritize detection of such paths, so false
	   negatives are more likely relative to other warnings.

       -Wno-analyzer-write-to-string-literal
	   This warning requires -fanalyzer, which enables it; use -Wno-analyzer-write-to-string-literal to disable it.

	   This diagnostic warns for paths through the code in which the analyzer detects an  attempt  to  write  through  a
	   pointer  to	a  string  literal.   However,	the  analyzer  does not prioritize detection of such paths, so false
	   negatives are more likely relative to other warnings.

       -Wno-analyzer-use-of-uninitialized-value
	   This warning requires -fanalyzer, which enables it; use -Wno-analyzer-use-of-uninitialized-value to disable it.

	   This diagnostic warns for paths through the code in which an uninitialized value is used.

	   See	CWE-457: Use of Uninitialized Variable ("https://cwe.mitre.org/data/definitions/457.html").

       The analyzer has hardcoded knowledge about the behavior of the following memory-management functions:

       *<"alloca">
       *
	   "__builtin_alloc_with_align", @item "__builtin_calloc", "__builtin_free", "__builtin_malloc", "__builtin_memcpy",
	   "__builtin_memcpy_chk",	   "__builtin_memset",	       "__builtin_memset_chk",		"__builtin_realloc",
	   "__builtin_stack_restore", and "__builtin_stack_save"

       *<"calloc">
       *<"free">
       *<"malloc">
       *<"memset">
       *<"operator delete">
       *<"operator delete []">
       *<"operator new">
       *<"operator new []">
       *<"realloc">
       *<"strdup">
       *<"strndup">

       of the following functions for working with file descriptors:

       *<"open">
       *<"close">
       *<"creat">
       *<"dup", "dup2" and "dup3">
       *<"isatty">
       *<"pipe", and "pipe2">
       *<"read">
       *<"write">
       *<"socket", "bind", "listen", "accept", and "connect">

       of the following functions for working with "" streams:

       *
	   "__builtin_fprintf_unlocked",       "__builtin_fputc",	"__builtin_fputc_unlocked",	  "__builtin_fputs",
	   "__builtin_fputs_unlocked",	    "__builtin_fwrite",	      "__builtin_fwrite_unlocked",	 "__builtin_printf",
	   "__builtin_printf_unlocked",	      "__builtin_putc",	     "__builtin_putchar",      "__builtin_putchar_unlocked",
	   "__builtin_putc_unlocked",	  "__builtin_puts",	"__builtin_puts_unlocked",     "__builtin_vfprintf",	 and
	   "__builtin_vprintf"

       *<"fopen">
       *<"fclose">
       *<"ferror">
       *<"fgets">
       *<"fgets_unlocked">
       *<"fileno">
       *<"fread">
       *<"getc">
       *<"getchar">
       *<"fprintf">
       *<"printf">
       *<"fwrite">

       and of the following functions:

       *
	   "__builtin_expect_with_probability",	     "__builtin_strchr",     "__builtin_strcpy",     "__builtin_strcpy_chk",
	   "__builtin_strlen", "__builtin_va_copy", and "__builtin_va_start"

       *
       *<"getpass">
       *<"longjmp">
       *<"putenv">
       *<"setjmp">
       *<"siglongjmp">
       *<"signal">
       *<"sigsetjmp">
       *<"strcat">
       *<"strchr">
       *<"strlen">

       In addition, various functions with an "__analyzer_" prefix have special meaning to the analyzer,  described  in	 the
       GCC Internals manual.

       Pertinent parameters for controlling the exploration are:

       *<--param analyzer-bb-explosion-factor=value>
       *<--param analyzer-max-enodes-per-program-point=value>
       *<--param analyzer-max-recursion-depth=value>
       *<--param analyzer-min-snodes-for-call-summary=value>

       The following options control the analyzer.

       -fanalyzer-call-summaries
	   Simplify  interprocedural  analysis	by  computing  the  effect of certain calls, rather than exploring all paths
	   through the function from callsite to each possible return.

	   If enabled, call summaries are only used for functions with more than one call site, and  that  are	sufficiently
	   complicated (as per --param analyzer-min-snodes-for-call-summary=value).

       -fanalyzer-checker=name
	   Restrict the analyzer to run just the named checker, and enable it.

       -fanalyzer-debug-text-art-headings
	   This	 option	 is  intended  for  analyzer developers.  If enabled, the analyzer will add extra annotations to any
	   diagrams it generates.

       -fno-analyzer-feasibility
	   This option is intended for analyzer developers.

	   By default the analyzer verifies that there is a feasible control flow path for each diagnostic  it	emits:	that
	   the	conditions  that  hold	are not mutually exclusive.  Diagnostics for which no feasible path can be found are
	   rejected.  This filtering can be suppressed with -fno-analyzer-feasibility, for debugging issues in this code.

       -fanalyzer-fine-grained
	   This option is intended for analyzer developers.

	   Internally the analyzer builds an "exploded graph" that combines control flow graphs with data flow information.

	   By default, an edge in this graph can contain the effects of a run of multiple statements within a  basic  block.
	   With -fanalyzer-fine-grained, each statement gets its own edge.

       -fanalyzer-show-duplicate-count
	   This	 option	 is intended for analyzer developers: if multiple diagnostics have been detected as being duplicates
	   of each other, it emits a note when reporting the best diagnostic, giving the number	 of  additional	 diagnostics
	   that were suppressed by the deduplication logic.

       -fanalyzer-show-events-in-system-headers
	   By default the analyzer emits simplified diagnostics paths by hiding events fully located within a system header.
	   With -fanalyzer-show-events-in-system-headers such events are no longer suppressed.

       -fno-analyzer-state-merge
	   This option is intended for analyzer developers.

	   By  default	the  analyzer  attempts	 to simplify analysis by merging sufficiently similar states at each program
	   point as it builds its "exploded graph".  With -fno-analyzer-state-merge this  merging  can	be  suppressed,	 for
	   debugging state-handling issues.

       -fno-analyzer-state-purge
	   This option is intended for analyzer developers.

	   By  default the analyzer attempts to simplify analysis by purging aspects of state at a program point that appear
	   to no longer be relevant e.g. the values of locals that aren't accessed later in the function  and  which  aren't
	   relevant to leak analysis.

	   With -fno-analyzer-state-purge this purging of state can be suppressed, for debugging state-handling issues.

       -fno-analyzer-suppress-followups
	   This option is intended for analyzer developers.

	   By default the analyzer will stop exploring an execution path after encountering certain diagnostics, in order to
	   avoid potentially issuing a cascade of follow-up diagnostics.

	   The diagnostics that terminate analysis along a path are:

	   *<-Wanalyzer-null-argument>
	   *<-Wanalyzer-null-dereference>
	   *<-Wanalyzer-use-after-free>
	   *<-Wanalyzer-use-of-pointer-in-stale-stack-frame>
	   *<-Wanalyzer-use-of-uninitialized-value>

	   With	 -fno-analyzer-suppress-followups  the	analyzer  will	continue  to  explore  such  paths  even  after such
	   diagnostics, which may be helpful for debugging issues in the analyzer,  or	for  microbenchmarks  for  detecting
	   undefined behavior.

       -fanalyzer-transitivity
	   This option enables transitivity of constraints within the analyzer.

       -fno-analyzer-undo-inlining
	   This option is intended for analyzer developers.

	   -fanalyzer  runs  relatively late compared to other code analysis tools, and some optimizations have already been
	   applied to the code.	 In particular function inlining may have occurred, leading to the interprocedural execution
	   paths emitted by the analyzer containing function frames that don't correspond to those in  the  original  source
	   code.

	   By  default	the  analyzer  attempts	 to reconstruct the original function frames, and to emit events showing the
	   inlined calls.

	   With -fno-analyzer-undo-inlining this attempt to reconstruct the original  frame  information  can  be  disabled,
	   which may be of help when debugging issues in the analyzer.

       -fanalyzer-verbose-edges
	   This option is intended for analyzer developers.  It enables more verbose, lower-level detail in the descriptions
	   of control flow within diagnostic paths.

       -fanalyzer-verbose-state-changes
	   This option is intended for analyzer developers.  It enables more verbose, lower-level detail in the descriptions
	   of events relating to state machines within diagnostic paths.

       -fanalyzer-verbosity=level
	   This option controls the complexity of the control flow paths that are emitted for analyzer diagnostics.

	   The level can be one of:

	   0   At  this	 level,	 interprocedural  call and return events are displayed, along with the most pertinent state-
	       change events relating to a diagnostic.	For example, for a double-"free" diagnostic, both  calls  to  "free"
	       will be shown.

	   1   As per the previous level, but also show events for the entry to each function.

	   2   As  per	the previous level, but also show events relating to control flow that are significant to triggering
	       the issue (e.g. "true path taken" at a conditional).

	       This level is the default.

	   3   As per the previous level, but show all control flow events, not just significant ones.

	   4   This level is intended for analyzer developers; it adds various	other  events  intended	 for  debugging	 the
	       analyzer.

       -fdump-analyzer
	   Dump	 internal  details  about what the analyzer is doing to file.analyzer.txt.  -fdump-analyzer-stderr overrides
	   this option.

       -fdump-analyzer-stderr
	   Dump internal details about what the analyzer is doing to stderr.  This option overrides -fdump-analyzer.

       -fdump-analyzer-callgraph
	   Dump a representation of the call graph suitable for viewing with GraphViz to file.callgraph.dot.

       -fdump-analyzer-exploded-graph
	   Dump a representation of the "exploded graph" suitable for viewing  with  GraphViz  to  file.eg.dot.	  Nodes	 are
	   color-coded based on state-machine states to emphasize state changes.

       -fdump-analyzer-exploded-nodes
	   Emit diagnostics showing where nodes in the "exploded graph" are in relation to the program source.

       -fdump-analyzer-exploded-nodes-2
	   Dump a textual representation of the "exploded graph" to file.eg.txt.

       -fdump-analyzer-exploded-nodes-3
	   Dump	 a  textual  representation  of	 the "exploded graph" to one dump file per node, to file.eg-id.txt.  This is
	   typically a large number of dump files.

       -fdump-analyzer-exploded-paths
	   Dump a textual representation of the "exploded path" for each diagnostic to file.idx.kind.epath.txt.

       -fdump-analyzer-feasibility
	   Dump internal details about the analyzer's search for feasible paths.  The details are written in a form suitable
	   for viewing with GraphViz to filenames of the form file.*.fg.dot, file.*.tg.dot, and file.*.fpath.txt.

       -fdump-analyzer-infinite-loop
	   Dump internal details about the analyzer's search for infinite loops.  The details are written in a form suitable
	   for viewing with GraphViz to filenames of the form file.*.infinite-loop.dot.

       -fdump-analyzer-json
	   Dump a compressed JSON representation of analyzer internals to  file.analyzer.json.gz.   The	 precise  format  is
	   subject to change.

       -fdump-analyzer-state-purge
	   As  per -fdump-analyzer-supergraph, dump a representation of the "supergraph" suitable for viewing with GraphViz,
	   but annotate the graph with information on what state will be purged at each	 node.	 The  graph  is	 written  to
	   file.state-purge.dot.

       -fdump-analyzer-supergraph
	   Dump	 representations  of  the  "supergraph"	 suitable  for	viewing	 with GraphViz to file.supergraph.dot and to
	   file.supergraph-eg.dot.  These show all of the control flow graphs in the program, with interprocedural edges for
	   calls and returns.  The second dump contains annotations showing nodes in the "exploded  graph"  and	 diagnostics
	   associated with them.

       -fdump-analyzer-untracked
	   Emit custom warnings with internal details intended for analyzer developers.

   Options for Debugging Your Program
       To  tell	 GCC  to  emit	extra information for use by a debugger, in almost all cases you need only to add -g to your
       other options.  Some debug formats can co-exist (like DWARF with CTF) when each of  them	 is  enabled  explicitly  by
       adding the respective command line option to your other options.

       GCC  allows  you	 to  use  -g  with  -O.	  The shortcuts taken by optimized code may occasionally be surprising: some
       variables you declared may not exist at all; flow of control may briefly move where  you	 did  not  expect  it;	some
       statements  may	not  be	 executed  because  they  compute constant results or their values are already at hand; some
       statements may execute in different places because they have been moved out of loops.  Nevertheless it is possible to
       debug optimized output.	This makes it reasonable to use the optimizer for programs that might have bugs.

       If you are not using some other optimization option, consider using -Og with -g.	 With no  -O  option  at  all,	some
       compiler	 passes	 that collect information useful for debugging do not run at all, so that -Og may result in a better
       debugging experience.

       -g  Produce debugging information in the operating system's native format (stabs, COFF, XCOFF, or  DWARF).   GDB	 can
	   work with this debugging information.

	   On  most systems that use stabs format, -g enables use of extra debugging information that only GDB can use; this
	   extra information makes debugging work better in GDB but probably makes other debuggers crash or refuse  to	read
	   the	program.   If  you  want  to  control  for certain whether to generate the extra information, use -gvms (see
	   below).

       -ggdb
	   Produce debugging information for use by GDB.  This means to use the most  expressive  format  available  (DWARF,
	   stabs, or the native format if neither of those are supported), including GDB extensions if at all possible.

       -gdwarf
       -gdwarf-version
	   Produce debugging information in DWARF format (if that is supported).  The value of version may be either 2, 3, 4
	   or  5;  the	default	 version for most targets is 5 (with the exception of VxWorks, TPF and Darwin / macOS, which
	   default to version 2, and AIX, which defaults to version 4).

	   Note that with DWARF Version 2, some ports require and always use some non-conflicting DWARF 3 extensions in	 the
	   unwind tables.

	   Version  4  may require GDB 7.0 and -fvar-tracking-assignments for maximum benefit. Version 5 requires GDB 8.0 or
	   higher.

	   GCC no longer supports DWARF Version 1,  which  is  substantially  different	 than  Version	2  and	later.	 For
	   historical  reasons,	 some  other  DWARF-related options such as -fno-dwarf2-cfi-asm) retain a reference to DWARF
	   Version 2 in their names, but apply to all currently-supported versions of DWARF.

       -gbtf
	   Request BTF debug information.  BTF is the default debugging format for the eBPF target.  On other targets,	like
	   x86, BTF debug information can be generated along with DWARF debug information when both of the debug formats are
	   enabled explicitly via their respective command line options.

       -gprune-btf
       -gno-prune-btf
	   Prune  BTF  information  before emission.  When pruning, only type information for types used by global variables
	   and file-scope functions will be emitted.  If  compiling  for  the  BPF  target  with  BPF  CO-RE  enabled,	type
	   information	will  also  be emitted for types used in BPF CO-RE relocations.	 In addition, struct and union types
	   which are only referred to via pointers from members of other struct or union types shall be pruned and  replaced
	   with BTF_KIND_FWD, as though those types were only present in the input as forward declarations.

	   This	 option substantially reduces the size of produced BTF information, but at significant loss in the amount of
	   detailed type information.  It is primarily useful when compiling for the BPF target, to minimize the size of the
	   resulting object, and to eliminate BTF information which is not immediately relevant to the BPF  program  loading
	   process.

	   This option is enabled by default for the BPF target when generating BTF information.

       -gctf
       -gctflevel
	   Request  CTF	 debug	information  and use level to specify how much CTF debug information should be produced.  If
	   -gctf is specified without a value for level, the default level of CTF debug information is 2.

	   CTF debug information can be generated along with DWARF debug information when both	of  the	 debug	formats	 are
	   enabled explicitly via their respective command line options.

	   Level 0 produces no CTF debug information at all.  Thus, -gctf0 negates -gctf.

	   Level  1  produces CTF information for tracebacks only.  This includes callsite information, but does not include
	   type information.

	   Level 2 produces type information for entities (functions, data objects  etc.)   at	file-scope  or	global-scope
	   only.

       -gvms
	   Produce debugging information in Alpha/VMS debug format (if that is supported).  This is the format used by DEBUG
	   on Alpha/VMS systems.

       -gcodeview
	   Produce  debugging  information  in	CodeView  debug	 format	 (if that is supported).  This is the format used by
	   Microsoft Visual C++ on Windows.

       -glevel
       -ggdblevel
       -gvmslevel
	   Request debugging information and also use level to specify how much information.  The default level is 2.

	   Level 0 produces no debug information at all.  Thus, -g0 negates -g.

	   Level 1 produces minimal information, enough for making backtraces in parts of the program that you don't plan to
	   debug.  This includes descriptions  of  functions  and  external  variables,	 and  line  number  tables,  but  no
	   information about local variables.

	   Level  3  includes  extra  information, such as all the macro definitions present in the program.  Some debuggers
	   support macro expansion when you use -g3.

	   If you use multiple -g options, with or without level numbers, the last such option is the one that is effective.

	   -gdwarf does not accept a concatenated debug level, to  avoid  confusion  with  -gdwarf-level.   Instead  use  an
	   additional -glevel option to change the debug level for DWARF.

       -fno-eliminate-unused-debug-symbols
	   By  default, no debug information is produced for symbols that are not actually used. Use this option if you want
	   debug information for all symbols.

       -femit-class-debug-always
	   Instead of emitting debugging information for a C++ class in only one object file, emit it in  all  object  files
	   using  the  class.  This option should be used only with debuggers that are unable to handle the way GCC normally
	   emits debugging information for classes because using this option increases the size of debugging information  by
	   as much as a factor of two.

       -fno-merge-debug-strings
	   Direct  the	linker	to  not	 merge together strings in the debugging information that are identical in different
	   object files.  Merging is not supported by all assemblers or linkers.  Merging decreases the size  of  the  debug
	   information in the output file at the cost of increasing link processing time.  Merging is enabled by default.

       -fdebug-prefix-map=old=new
	   When	 compiling  files  residing  in	 directory old, record debugging information describing them as if the files
	   resided in directory new instead.  This can be used to replace a build-time path with an install-time path in the
	   debug info.	It can also be used to change an absolute path to a relative path by using . for new.  This can give
	   more reproducible builds, which are location independent, but may require an extra command to tell GDB  where  to
	   find the source files. See also -ffile-prefix-map and -fcanon-prefix-map.

       -fvar-tracking
	   Run	variable  tracking pass.  It computes where variables are stored at each position in code.  Better debugging
	   information is then generated (if the debugging information format supports this information).

	   It is enabled by default when compiling with optimization (-Os, -O, -O2, ...), debugging information (-g) and the
	   debug info format supports it.

       -fvar-tracking-assignments
	   Annotate assignments to user variables early in the	compilation  and  attempt  to  carry  the  annotations	over
	   throughout  the  compilation all the way to the end, in an attempt to improve debug information while optimizing.
	   Use of -gdwarf-4 is recommended along with it.

	   It can be enabled even if var-tracking is disabled, in which case annotations are  created  and  maintained,	 but
	   discarded  at  the  end.   By  default,  this flag is enabled together with -fvar-tracking, except when selective
	   scheduling is enabled.

       -gsplit-dwarf
	   If DWARF debugging information is enabled, separate as much debugging information as	 possible  into	 a  separate
	   output  file	 with  the  extension  .dwo.   This option allows the build system to avoid linking files with debug
	   information.	 To be useful, this option requires a debugger capable of reading .dwo files.

       -gdwarf32
       -gdwarf64
	   If DWARF debugging information is enabled, the -gdwarf32 selects  the  32-bit  DWARF	 format	 and  the  -gdwarf64
	   selects  the	 64-bit	 DWARF format.	The default is target specific, on most targets it is -gdwarf32 though.	 The
	   32-bit DWARF format is smaller, but can't support more than 2GiB of debug information in any of the	DWARF  debug
	   information sections.  The 64-bit DWARF format allows larger debug information and might not be well supported by
	   all consumers yet.

       -gdescribe-dies
	   Add description attributes to some DWARF DIEs that have no name attribute, such as artificial variables, external
	   references and call site parameter DIEs.

       -gpubnames
	   Generate DWARF ".debug_pubnames" and ".debug_pubtypes" sections.

       -ggnu-pubnames
	   Generate  ".debug_pubnames"	and ".debug_pubtypes" sections in a format suitable for conversion into a GDB index.
	   This option is only useful with a linker that can produce GDB index version 7.

       -fdebug-types-section
	   When using DWARF Version 4 or higher, type DIEs can be put into  their  own	".debug_types"	section	 instead  of
	   making  them	 part  of  the ".debug_info" section.  It is more efficient to put them in a separate comdat section
	   since the linker can then remove duplicates.	 But not all DWARF consumers support ".debug_types" sections yet and
	   on some objects ".debug_types" produces larger instead of smaller debugging information.

       -grecord-gcc-switches
       -gno-record-gcc-switches
	   This switch causes the command-line options used to invoke the compiler that may affect  code  generation  to  be
	   appended  to	 the  DW_AT_producer  attribute	 in  DWARF debugging information.  The options are concatenated with
	   spaces separating them from each other and from the compiler version.   It  is  enabled  by	default.   See	also
	   -frecord-gcc-switches for another way of storing compiler options into the object file.

       -gstrict-dwarf
	   Disallow  using  extensions	of later DWARF standard version than selected with -gdwarf-version.  On most targets
	   using non-conflicting DWARF extensions from later standard versions is allowed.

       -gno-strict-dwarf
	   Allow using extensions of later DWARF standard version than selected with -gdwarf-version.

       -gas-loc-support
	   Inform the compiler that the assembler supports ".loc" directives.  It may then use them  for  the  assembler  to
	   generate DWARF2+ line number tables.

	   This is generally desirable, because assembler-generated line-number tables are a lot more compact than those the
	   compiler can generate itself.

	   This	 option	 will  be  enabled  by	default	 if,  at GCC configure time, the assembler was found to support such
	   directives.

       -gno-as-loc-support
	   Force GCC to generate DWARF2+ line number tables internally, if DWARF2+ line number tables are to be generated.

       -gas-locview-support
	   Inform the compiler that the assembler  supports  "view"  assignment	 and  reset  assertion	checking  in  ".loc"
	   directives.

	   This option will be enabled by default if, at GCC configure time, the assembler was found to support them.

       -gno-as-locview-support
	   Force GCC to assign view numbers internally, if -gvariable-location-views are explicitly requested.

       -gcolumn-info
       -gno-column-info
	   Emit	 location  column information into DWARF debugging information, rather than just file and line.	 This option
	   is enabled by default.

       -gstatement-frontiers
       -gno-statement-frontiers
	   This option causes GCC to create markers in the internal representation at the beginning of	statements,  and  to
	   keep	 them  roughly	in  place throughout compilation, using them to guide the output of "is_stmt" markers in the
	   line number table.  This is enabled by default when	compiling  with	 optimization  (-Os,  -O1,  -O2,  ...),	 and
	   outputting DWARF 2 debug information at the normal level.

       -gvariable-location-views
       -gvariable-location-views=incompat5
       -gno-variable-location-views
	   Augment  variable  location lists with progressive view numbers implied from the line number table.	This enables
	   debug information consumers to inspect state at certain points of the program, even if no instructions associated
	   with the corresponding source locations are present at that point.  If  the	assembler  lacks  support  for	view
	   numbers  in line number tables, this will cause the compiler to emit the line number table, which generally makes
	   them somewhat less compact.	The augmented line number tables and location lists are	 fully	backward-compatible,
	   so  they can be consumed by debug information consumers that are not aware of these augmentations, but they won't
	   derive any benefit from them either.

	   This is enabled by default when outputting DWARF 2 debug information at the normal level, as	 long  as  there  is
	   assembler  support,	-fvar-tracking-assignments  is enabled and -gstrict-dwarf is not.  When assembler support is
	   not available, this may still be enabled, but it will force GCC to output internal line  number  tables,  and  if
	   -ginternal-reset-location-views  is	not  enabled, that will most certainly lead to silently mismatching location
	   views.

	   There is a proposed representation for view numbers that is not backward compatible with the location list format
	   introduced in DWARF 5, that can be enabled with -gvariable-location-views=incompat5.	 This option may be  removed
	   in  the future, is only provided as a reference implementation of the proposed representation.  Debug information
	   consumers are not expected to support this extended format, and they would be rendered unable to decode  location
	   lists using it.

       -ginternal-reset-location-views
       -gno-internal-reset-location-views
	   Attempt  to determine location views that can be omitted from location view lists.  This requires the compiler to
	   have very accurate insn length estimates, which isn't always the case, and it may cause incorrect view  lists  to
	   be  generated silently when using an assembler that does not support location view lists.  The GNU assembler will
	   flag any such error as a "view number mismatch".  This is only enabled on ports that define a reliable estimation
	   function.

       -ginline-points
       -gno-inline-points
	   Generate extended debug information for inlined functions.	Location  view	tracking  markers  are	inserted  at
	   inlined entry points, so that address and view numbers can be computed and output in debug information.  This can
	   be  enabled	independently  of location views, in which case the view numbers won't be output, but it can only be
	   enabled along with statement frontiers, and it is only enabled by default if location views are enabled.

       -gz[=type]
	   Produce compressed debug sections in DWARF format, if that is supported.  If type is not given, the default	type
	   depends  on	the  capabilities  of  the assembler and linker used.  type may be one of none (don't compress debug
	   sections), or zlib (use zlib compression in ELF gABI format).  If the linker doesn't support	 writing  compressed
	   debug  sections,  the  option  is  rejected.	  Otherwise, if the assembler does not support them, -gz is silently
	   ignored when producing object files.

       -femit-struct-debug-baseonly
	   Emit debug information for struct-like types only when the base name of the compilation source file	matches	 the
	   base name of file in which the struct is defined.

	   This	 option	 substantially	reduces the size of debugging information, but at significant potential loss in type
	   information	to  the	 debugger.   See  -femit-struct-debug-reduced	for   a	  less	 aggressive   option.	 See
	   -femit-struct-debug-detailed for more detailed control.

	   This option works only with DWARF debug output.

       -femit-struct-debug-reduced
	   Emit	 debug	information for struct-like types only when the base name of the compilation source file matches the
	   base name of file in which the type is defined, unless the struct is a template or defined in a system header.

	   This option significantly reduces the size of debugging information, with some potential loss in type information
	   to	the   debugger.	    See	   -femit-struct-debug-baseonly	   for	  a    more    aggressive    option.	 See
	   -femit-struct-debug-detailed for more detailed control.

	   This option works only with DWARF debug output.

       -femit-struct-debug-detailed[=spec-list]
	   Specify  the	 struct-like  types  for  which	 the  compiler generates debug information.  The intent is to reduce
	   duplicate struct debug information between different object files within the same program.

	   This option is a detailed version of -femit-struct-debug-reduced and -femit-struct-debug-baseonly,  which  serves
	   for most needs.

	   A specification has the syntax[dir:|ind:][ord:|gen:](any|sys|base|none)

	   The	optional  first	 word  limits  the specification to structs that are used directly (dir:) or used indirectly
	   (ind:).  A struct type is used directly when it is the type of a variable, member.  Indirect uses  arise  through
	   pointers  to	 structs.   That  is, when use of an incomplete struct is valid, the use is indirect.  An example is
	   struct one direct; struct two * indirect;.

	   The optional second word limits the specification to ordinary structs (ord:) or generic structs (gen:).   Generic
	   structs  are	 a bit complicated to explain.	For C++, these are non-explicit specializations of template classes,
	   or	non-template   classes	 within	  the	above.	  Other	  programming	languages   have    generics,	 but
	   -femit-struct-debug-detailed does not yet implement them.

	   The third word specifies the source files for those structs for which the compiler should emit debug information.
	   The values none and any have the normal meaning.  The value base means that the base of name of the file in which
	   the	type  declaration  appears  must match the base of the name of the main compilation file.  In practice, this
	   means that when compiling foo.c, debug information is generated for types declared in that file  and	 foo.h,	 but
	   not	other  header  files.	The  value  sys	 means those types satisfying base or declared in system or compiler
	   headers.

	   You may need to experiment to determine the best settings for your application.

	   The default is -femit-struct-debug-detailed=all.

	   This option works only with DWARF debug output.

       -fno-dwarf2-cfi-asm
	   Emit DWARF unwind info as compiler generated ".eh_frame" section instead of using GAS ".cfi_*" directives.

       -fno-eliminate-unused-debug-types
	   Normally, when producing DWARF output, GCC avoids producing debug symbol output for types that are  nowhere	used
	   in  the  source file being compiled.	 Sometimes it is useful to have GCC emit debugging information for all types
	   declared in a compilation unit, regardless of whether or not they are actually used in that compilation unit, for
	   example if, in the debugger, you want to cast a value to a type that is not actually used in your program (but is
	   declared).  More often, however, this results in a significant amount of wasted space.

   Options That Control Optimization
       These options control various sorts of optimizations.

       Without any optimization option, the compiler's goal is to reduce the cost  of  compilation  and	 to  make  debugging
       produce	the  expected  results.	  Statements  are  independent:	 if  you  stop the program with a breakpoint between
       statements, you can then assign a new value to any variable or change the program counter to any other  statement  in
       the function and get exactly the results you expect from the source code.

       Turning	on  optimization flags makes the compiler attempt to improve the performance and/or code size at the expense
       of compilation time and possibly the ability to debug the program.

       The compiler performs optimization based on the knowledge it has of the program.	 Compiling multiple files at once to
       a single output file mode allows the compiler to use information gained from all of the files when compiling each  of
       them.

       Not  all	 optimizations	are  controlled	 directly by a flag.  Only optimizations that have a flag are listed in this
       section.

       Most optimizations are completely disabled at -O0 or if an -O  level  is	 not  set  on  the  command  line,  even  if
       individual optimization flags are specified.  Similarly, -Og suppresses many optimization passes.

       Depending  on the target and how GCC was configured, a slightly different set of optimizations may be enabled at each
       -O level than those listed here.	 You can invoke GCC  with  -Q  --help=optimizers  to  find  out	 the  exact  set  of
       optimizations that are enabled at each level.

       -O
       -O1 Optimize.  Optimizing compilation takes somewhat more time, and a lot more memory for a large function.

	   With	 -O,  the  compiler  tries to reduce code size and execution time, without performing any optimizations that
	   take a great deal of compilation time.

	   -O is the recommended optimization level for large machine-generated code as	 a  sensible  balance  between	time
	   taken  to  compile  and  memory  use:  higher  optimization levels perform optimizations with greater algorithmic
	   complexity than at -O.

	   -O turns on the following optimization flags:

	   -fauto-inc-dec -fbranch-count-reg -fcombine-stack-adjustments -fcompare-elim -fcprop-registers -fdce	 -fdefer-pop
	   -fdelayed-branch    -fdse   -fforward-propagate   -fguess-branch-probability	  -fif-conversion   -fif-conversion2
	   -finline-functions-called-once      -fipa-modref	  -fipa-profile	      -fipa-pure-const	     -fipa-reference
	   -fipa-reference-addressable	    -fivopts	 -fmerge-constants     -fmove-loop-invariants	  -fmove-loop-stores
	   -fomit-frame-pointer	 -freorder-blocks  -fshrink-wrap  -fshrink-wrap-separate  -fsplit-wide-types  -fssa-backprop
	   -fssa-phiopt	   -ftree-bit-ccp    -ftree-ccp	   -ftree-ch	-ftree-coalesce-vars   -ftree-copy-prop	  -ftree-dce
	   -ftree-dominator-opts  -ftree-dse  -ftree-forwprop	-ftree-fre   -ftree-phiprop   -ftree-pta   -ftree-scev-cprop
	   -ftree-sink -ftree-slsr -ftree-sra -ftree-ter -funit-at-a-time

       -O2 Optimize  even more.	 GCC performs nearly all supported optimizations that do not involve a space-speed tradeoff.
	   As compared to -O, this option increases both compilation time and the performance of the generated code.

	   -O2 turns on all optimization flags specified by -O1.  It also turns on the following optimization flags:

	   -falign-functions  -falign-jumps  -falign-labels   -falign-loops  -fcaller-saves  -fcode-hoisting  -fcrossjumping
	   -fcse-follow-jumps	-fcse-skip-blocks  -fdelete-null-pointer-checks -fdevirtualize	-fdevirtualize-speculatively
	   -fexpensive-optimizations   -ffinite-loops	-fgcse	   -fgcse-lm	-fhoist-adjacent-loads	  -finline-functions
	   -finline-small-functions  -findirect-inlining  -fipa-bit-cp	 -fipa-cp   -fipa-icf -fipa-ra	-fipa-sra  -fipa-vrp
	   -fisolate-erroneous-paths-dereference  -flra-remat  -foptimize-crc	-foptimize-sibling-calls   -foptimize-strlen
	   -fpartial-inlining -fpeephole2 -freorder-blocks-algorithm=stc -freorder-blocks-and-partition	 -freorder-functions
	   -frerun-cse-after-loop   -fschedule-insns   -fschedule-insns2  -fsched-interblock   -fsched-spec  -fstore-merging
	   -fstrict-aliasing -fthread-jumps -ftree-builtin-call-dce  -ftree-loop-vectorize  -ftree-pre	-ftree-slp-vectorize
	   -ftree-switch-conversion  -ftree-tail-merge -ftree-vrp -fvect-cost-model=very-cheap

	   Please note the warning under -fgcse about invoking -O2 on programs that use computed gotos.

	   NOTE:   In	Ubuntu	 8.10  and  later  versions,  -D_FORTIFY_SOURCE=2,  in	Ubuntu	24.04  and  later  versions,
	   -D_FORTIFY_SOURCE=3, is set by default, and is activated when -O is set to 2 or higher.  This enables  additional
	   compile-time	 and  run-time	checks	for several libc functions.  To disable, specify either -U_FORTIFY_SOURCE or
	   -D_FORTIFY_SOURCE=0.

	   NOTE: In Debian 13 and Ubuntu 24.04 and later versions, -D_TIME_BITS=64 together with  -D_FILE_OFFSET_BITS=64  is
	   set by default on the 32bit architectures armel, armhf, hppa, m68k, mips, mipsel, powerpc and sh4.

       -O3 Optimize  yet more.	-O3 turns on all optimizations specified by -O2 and also turns on the following optimization
	   flags:

	   -fgcse-after-reload -fipa-cp-clone -floop-interchange -floop-unroll-and-jam	-fpeel-loops  -fpredictive-commoning
	   -fsplit-loops	-fsplit-paths	    -ftree-loop-distribution	   -ftree-partial-pre	    -funswitch-loops
	   -fvect-cost-model=dynamic -fversion-loops-for-strides

       -O0 Reduce compilation time and make debugging produce the expected results.  This is the default.

	   At -O0, GCC completely disables most optimization passes; they are not run even if you explicitly enable them  on
	   the	command	 line,	or  are	 listed	 by  -Q	 --help=optimizers  as being enabled by default.  Many optimizations
	   performed by GCC depend on code analysis or canonicalization passes that are enabled by -O, and it would  not  be
	   useful to run individual optimization passes in isolation.

       -Os Optimize for size.  -Os enables all -O2 optimizations except those that often increase code size:

	   -falign-functions	     -falign-jumps	  -falign-labels	 -falign-loops	      -fprefetch-loop-arrays
	   -freorder-blocks-algorithm=stc

	   It also enables -finline-functions, causes the compiler to tune for code size rather than  execution	 speed,	 and
	   performs further optimizations designed to reduce code size.

       -Ofast
	   Disregard strict standards compliance.  -Ofast enables all -O3 optimizations.  It also enables optimizations that
	   are	not  valid  for	 all standard-compliant programs.  It turns on -ffast-math, -fallow-store-data-races and the
	   Fortran-specific -fstack-arrays, unless -fmax-stack-var-size is specified, and -fno-protect-parens.	It turns off
	   -fsemantic-interposition.

       -Og Optimize debugging experience.  -Og should be the optimization level of choice  for	the  standard  edit-compile-
	   debug  cycle, offering a reasonable level of optimization while maintaining fast compilation and a good debugging
	   experience.	It is a better choice than -O0 for producing debuggable	 code  because	some  compiler	passes	that
	   collect debug information are disabled at -O0.

	   Like	 -O0,  -Og  completely	disables a number of optimization passes so that individual options controlling them
	   have no effect.  Otherwise -Og enables all -O1 optimization flags  except  for  those  that	may  interfere	with
	   debugging:

	   -fbranch-count-reg	-fdelayed-branch  -fdse	  -fif-conversion   -fif-conversion2  -finline-functions-called-once
	   -fmove-loop-invariants  -fmove-loop-stores  -fssa-phiopt -ftree-bit-ccp  -ftree-dse	-ftree-pta  -ftree-sra

       -Oz Optimize aggressively for size rather than speed.  This may increase the number of instructions executed if those
	   instructions require fewer  bytes  to  encode.   -Oz	 behaves  similarly  to	 -Os  including	 enabling  most	 -O2
	   optimizations.

       If you use multiple -O options, with or without level numbers, the last such option is the one that is effective.

       Options	of the form -fflag specify machine-independent flags.  Most flags have both positive and negative forms; the
       negative form of -ffoo is -fno-foo.  In the table below, only one of the forms is listed---the one you typically use.
       You can figure out the other form by either removing no- or adding it.

       The following options control specific optimizations.  They are either activated by -O options or are related to ones
       that are.  You can use the following flags in the rare cases when "fine-tuning" of optimizations to be  performed  is
       desired.

       -fno-defer-pop
	   For	machines  that	must  pop arguments after a function call, always pop the arguments as soon as each function
	   returns.  At levels -O1 and higher, -fdefer-pop is the  default;  this  allows  the	compiler  to  let  arguments
	   accumulate on the stack for several function calls and pop them all at once.

       -fforward-propagate
	   Perform  a  forward propagation pass on RTL.	 The pass tries to combine two instructions and checks if the result
	   can be simplified.  If loop unrolling is active, two passes are performed and the second is scheduled after	loop
	   unrolling.

	   This option is enabled by default at optimization levels -O1, -O2, -O3, -Os.

       -favoid-store-forwarding
       -fno-avoid-store-forwarding
	   Many	 CPUs  will stall for many cycles when a load partially depends on previous smaller stores.  This pass tries
	   to detect such cases and avoid the penalty by changing the order of the load and store and  then  fixing  up	 the
	   loaded value.

	   Disabled by default.

       -ffp-contract=style
	   -ffp-contract=off  disables	floating-point	expression  contraction.   -ffp-contract=fast enables floating-point
	   expression contraction such as forming of fused multiply-add operations if the  target  has	native	support	 for
	   them.   -ffp-contract=on enables floating-point expression contraction if allowed by the language standard.	This
	   is implemented for C and C++, where it enables contraction  within  one  expression,	 but  not  across  different
	   statements.

	   The	default	 is  -ffp-contract=off for C in a standards compliant mode (-std=c11 or similar), -ffp-contract=fast
	   otherwise.

       -fomit-frame-pointer
	   Omit the frame pointer in functions that don't need one.  This avoids  the  instructions  to	 save,	set  up	 and
	   restore the frame pointer; on many targets it also makes an extra register available.

	   On  some targets this flag has no effect because the standard calling sequence always uses a frame pointer, so it
	   cannot be omitted.

	   Note that -fno-omit-frame-pointer doesn't guarantee the frame pointer is used in all functions.  Several  targets
	   always omit the frame pointer in leaf functions.

	   Enabled by default at -O1 and higher.

       -foptimize-crc
	   Detect loops calculating CRC (performing polynomial long division) and replace them with a faster implementation.
	   Detect  8, 16, 32, and 64 bit CRC, with a constant polynomial without the leading 1 bit, for both bit-forward and
	   bit-reversed cases.	If the target supports a CRC instruction and the polynomial used in the source code  matches
	   the	polynomial  used in the CRC instruction, generate that CRC instruction.	 Otherwise, if the target supports a
	   carry-less-multiplication instruction, generate CRC using it; otherwise generate table-based CRC.

	   Enabled by default at -O2 and higher.

       -foptimize-sibling-calls
	   Optimize sibling and tail recursive calls.

	   Enabled at levels -O2, -O3, -Os.

       -foptimize-strlen
	   Optimize various standard C string functions (e.g. "strlen", "strchr" or "strcpy")  and  their  "_FORTIFY_SOURCE"
	   counterparts into faster alternatives.

	   Enabled at levels -O2, -O3.

       -finline-stringops[=fn]
	   Expand  memory  and	string	operations  (for now, only "memset") inline, even when the length is variable or big
	   enough as to require looping.  This is most useful along with -ffreestanding and -fno-builtin.

	   In some circumstances, it enables the compiler to generate code that	 takes	advantage  of  known  alignment	 and
	   length  multipliers, but even then it may be less efficient than optimized runtime implementations, and grow code
	   size so much that even a less performant but shared implementation runs faster due to better use of code  caches.
	   This option is disabled by default.

       -fno-inline
	   Do  not  expand  any	 functions  inline  apart from those marked with the "always_inline" attribute.	 This is the
	   default when not optimizing.

	   Single functions can be exempted from inlining by marking them with the "noinline" attribute.

       -finline-small-functions
	   Integrate functions into their callers when their body is smaller than expected function call  code	(so  overall
	   size	 of program gets smaller).  The compiler heuristically decides which functions are simple enough to be worth
	   integrating in this way.  This inlining applies to all functions, even those not declared inline.

	   Enabled at levels -O2, -O3, -Os.

       -findirect-inlining
	   Inline also indirect calls that are discovered to be known at compile time thanks  to  previous  inlining.	This
	   option   has	  any	effect	 only	when   inlining	  itself   is	turned	 on  by	 the  -finline-functions  or
	   -finline-small-functions options.

	   Enabled at levels -O2, -O3, -Os.

       -finline-functions
	   Consider all functions for inlining, even if they are not declared inline.  The  compiler  heuristically  decides
	   which functions are worth integrating in this way.

	   If  all  calls  to  a  given function are integrated, and the function is declared "static", then the function is
	   normally not output as assembler code in its own right.

	   Enabled at levels -O2, -O3, -Os.  Also enabled by -fprofile-use and -fauto-profile.

       -finline-functions-called-once
	   Consider all "static" functions called once for inlining into their caller even if they are not marked  "inline".
	   If a call to a given function is integrated, then the function is not output as assembler code in its own right.

	   Enabled at levels -O1, -O2, -O3 and -Os, but not -Og.

       -fearly-inlining
	   Inline functions marked by "always_inline" and functions whose body seems smaller than the function call overhead
	   early  before  doing	 -fprofile-generate  instrumentation  and  real	 inlining  pass.   Doing  so makes profiling
	   significantly cheaper and usually inlining faster on programs having large chains of nested wrapper functions.

	   Enabled by default.

       -fipa-sra
	   Perform interprocedural scalar replacement of  aggregates,  removal	of  unused  parameters	and  replacement  of
	   parameters passed by reference by parameters passed by value.

	   Enabled at levels -O2, -O3 and -Os.

       -finline-limit=n
	   By default, GCC limits the size of functions that can be inlined.  This flag allows coarse control of this limit.
	   n is the size of functions that can be inlined in number of pseudo instructions.

	   Inlining  is	 actually controlled by a number of parameters, which may be specified individually by using --param
	   name=value.	The -finline-limit=n option sets some of these parameters as follows:

	   max-inline-insns-single
	       is set to n/2.

	   max-inline-insns-auto
	       is set to n/2.

	   See below for a documentation of the individual parameters controlling inlining and for  the	 defaults  of  these
	   parameters.

	   Note: there may be no value to -finline-limit that results in default behavior.

	   Note:  pseudo instruction represents, in this particular context, an abstract measurement of function's size.  In
	   no way does it represent a count of assembly instructions and as such its exact meaning  might  change  from	 one
	   release to an another.

       -fno-keep-inline-dllexport
	   This is a more fine-grained version of -fkeep-inline-functions, which applies only to functions that are declared
	   using the "dllexport" attribute or declspec.

       -fkeep-inline-functions
	   In  C,  emit	 "static"  functions  that are declared "inline" into the object file, even if the function has been
	   inlined into all of its callers.  This switch does not affect functions using the "extern  inline"  extension  in
	   GNU C90.  In C++, emit any and all inline functions into the object file.

       -fkeep-static-functions
	   Emit "static" functions into the object file, even if the function is never used.

       -fkeep-static-consts
	   Emit	 variables  declared  "static  const"  when  optimization  isn't  turned  on,  even  if the variables aren't
	   referenced.

	   GCC enables this option by default.	If you want to force the compiler to check  if	a  variable  is	 referenced,
	   regardless of whether or not optimization is turned on, use the -fno-keep-static-consts option.

       -fmerge-constants
	   Attempt to merge identical constants (string constants and floating-point constants) across compilation units.

	   This	  option  is  the  default  for	 optimized  compilation	 if  the  assembler  and  linker  support  it.	 Use
	   -fno-merge-constants to inhibit this behavior.

	   Enabled at levels -O1, -O2, -O3, -Os.

       -fmerge-all-constants
	   Attempt to merge identical constants and identical variables.

	   This option implies -fmerge-constants.  In addition	to  -fmerge-constants  this  considers	e.g.  even  constant
	   initialized	arrays or initialized constant variables with integral or floating-point types.	 Languages like C or
	   C++ require each variable, including multiple instances of the same variable in recursive calls, to have distinct
	   locations, so using this option results in non-conforming behavior.

       -fmodulo-sched
	   Perform swing modulo scheduling immediately before the first scheduling pass.  This pass looks at innermost loops
	   and reorders their instructions by overlapping different iterations.

       -fmodulo-sched-allow-regmoves
	   Perform more aggressive SMS-based modulo scheduling with register moves allowed.  By setting	 this  flag  certain
	   anti-dependences  edges are deleted, which triggers the generation of reg-moves based on the life-range analysis.
	   This option is effective only with -fmodulo-sched enabled.

       -fno-branch-count-reg
	   Disable the optimization pass that scans for opportunities to use "decrement and branch" instructions on a  count
	   register  instead  of  instruction  sequences that decrement a register, compare it against zero, and then branch
	   based upon the result.  This option is only meaningful on architectures that	 support  such	instructions,  which
	   include  x86,  PowerPC, IA-64 and S/390.  Note that the -fno-branch-count-reg option doesn't remove the decrement
	   and branch instructions from the generated instruction stream introduced by other optimization passes.

	   The default is -fbranch-count-reg at -O1 and higher, except for -Og.

       -fno-function-cse
	   Do not put function addresses in registers; make each instruction that calls	 a  constant  function	contain	 the
	   function's address explicitly.

	   This	 option	 results  in  less  efficient  code,  but  some strange hacks that alter the assembler output may be
	   confused by the optimizations performed when this option is not used.

	   The default is -ffunction-cse

       -fno-zero-initialized-in-bss
	   If the target supports a BSS section, GCC by default puts variables that are initialized to zero into BSS.	This
	   can save space in the resulting code.

	   This	 option	 turns	off  this  behavior  because  some  programs  explicitly rely on variables going to the data
	   section---e.g., so that the resulting executable can find the beginning of that section and/or  make	 assumptions
	   based on that.

	   The default is -fzero-initialized-in-bss except in Ada.

       -fthread-jumps
	   Perform optimizations that check to see if a jump branches to a location where another comparison subsumed by the
	   first  is found.  If so, the first branch is redirected to either the destination of the second branch or a point
	   immediately following it, depending on whether the condition is known to be true or false.

	   Enabled at levels -O1, -O2, -O3, -Os.

       -fsplit-wide-types
	   When using a type that occupies multiple registers, such as "long long" on a 32-bit system, split  the  registers
	   apart  and  allocate	 them  independently.	This  normally	generates  better code for those types, but may make
	   debugging more difficult.

	   Enabled at levels -O1, -O2, -O3, -Os.

       -fsplit-wide-types-early
	   Fully split wide types early, instead of very late.	This option  has  no  effect  unless  -fsplit-wide-types  is
	   turned on.

	   This is the default on some targets.

       -fcse-follow-jumps
	   In  common  subexpression  elimination  (CSE),  scan through jump instructions when the target of the jump is not
	   reached by any other path.  For example, when CSE encounters an "if" statement with an "else" clause, CSE follows
	   the jump when the condition tested is false.

	   Enabled at levels -O2, -O3, -Os.

       -fcse-skip-blocks
	   This is similar to -fcse-follow-jumps, but causes CSE to follow jumps that conditionally skip over blocks.	When
	   CSE	encounters  a  simple  "if"  statement	with no else clause, -fcse-skip-blocks causes CSE to follow the jump
	   around the body of the "if".

	   Enabled at levels -O2, -O3, -Os.

       -frerun-cse-after-loop
	   Re-run common subexpression elimination after loop optimizations are performed.

	   Enabled at levels -O2, -O3, -Os.

       -fgcse
	   Perform a global common subexpression elimination pass.   This  pass	 also  performs	 global	 constant  and	copy
	   propagation.

	   Note:  When compiling a program using computed gotos, a GCC extension, you may get better run-time performance if
	   you disable the global common subexpression elimination pass by adding -fno-gcse to the command line.

	   Enabled at levels -O2, -O3, -Os.

       -fgcse-lm
	   When -fgcse-lm is enabled, global common subexpression elimination attempts to move loads that are only killed by
	   stores into themselves.  This allows a loop containing a load/store sequence to be changed to a load outside	 the
	   loop, and a copy/store within the loop.

	   Enabled by default when -fgcse is enabled.

       -fgcse-sm
	   When	 -fgcse-sm  is enabled, a store motion pass is run after global common subexpression elimination.  This pass
	   attempts to move stores out of loops.  When used in conjunction with -fgcse-lm,  loops  containing  a  load/store
	   sequence can be changed to a load before the loop and a store after the loop.

	   Not enabled at any optimization level.

       -fgcse-las
	   When -fgcse-las is enabled, the global common subexpression elimination pass eliminates redundant loads that come
	   after stores to the same memory location (both partial and full redundancies).

	   Not enabled at any optimization level.

       -fgcse-after-reload
	   When -fgcse-after-reload is enabled, a redundant load elimination pass is performed after reload.  The purpose of
	   this pass is to clean up redundant spilling.

	   Enabled by -O3, -fprofile-use and -fauto-profile.

       -faggressive-loop-optimizations
	   This option tells the loop optimizer to use language constraints to derive bounds for the number of iterations of
	   a  loop.   This  assumes  that loop code does not invoke undefined behavior by for example causing signed integer
	   overflows or out-of-bound array accesses.  The bounds for the number of iterations of a loop are  used  to  guide
	   loop unrolling and peeling and loop exit test optimizations.	 This option is enabled by default.

       -funconstrained-commons
	   This	 option	 tells	the compiler that variables declared in common blocks (e.g. Fortran) may later be overridden
	   with longer trailing arrays. This prevents certain optimizations that depend on knowing the array bounds.

       -fcrossjumping
	   Perform cross-jumping transformation.  This transformation unifies equivalent code  and  saves  code	 size.	 The
	   resulting code may or may not perform better than without cross-jumping.

	   Enabled at levels -O2, -O3, -Os.

       -fauto-inc-dec
	   Combine increments or decrements of addresses with memory accesses.	This pass is always skipped on architectures
	   that	 do  not  have	instructions  to  support  this.  Enabled by default at -O1 and higher on architectures that
	   support this.

       -fdce
	   Perform dead code elimination (DCE) on RTL.	Enabled by default at -O1 and higher.

       -fdse
	   Perform dead store elimination (DSE) on RTL.	 Enabled by default at -O1 and higher.

       -fif-conversion
	   Attempt to transform conditional jumps into branch-less equivalents.	 This includes	use  of	 conditional  moves,
	   min, max, set flags and abs instructions, and some tricks doable by standard arithmetics.  The use of conditional
	   execution on chips where it is available is controlled by -fif-conversion2.

	   Enabled at levels -O1, -O2, -O3, -Os, but not with -Og.

       -fif-conversion2
	   Use conditional execution (where available) to transform conditional jumps into branch-less equivalents.

	   Enabled at levels -O1, -O2, -O3, -Os, but not with -Og.

       -fdeclone-ctor-dtor
	   The	C++ ABI requires multiple entry points for constructors and destructors: one for a base subobject, one for a
	   complete object, and one for a virtual destructor that calls operator delete afterwards.  For  a  hierarchy	with
	   virtual  bases,  the	 base  and  complete variants are clones, which means two copies of the function.  With this
	   option, the base and complete variants are changed to be thunks that call a common implementation.

	   Enabled by -Os.

       -fdelete-null-pointer-checks
	   Assume that programs cannot safely dereference null pointers, and that no code or data element resides at address
	   zero.  This option enables simple constant folding optimizations at all optimization levels.	 In addition,  other
	   optimization	 passes	 in  GCC use this flag to control global dataflow analyses that eliminate useless checks for
	   null pointers; these assume that a memory access to address zero always results in a trap, so that if  a  pointer
	   is checked after it has already been dereferenced, it cannot be null.

	   Note	 however  that	in  some  environments	this assumption is not true.  Use -fno-delete-null-pointer-checks to
	   disable this optimization for programs that depend on that behavior.

	   This option is enabled by default on most targets.  On AVR and MSP430, this option is completely disabled.

	   Passes that use the dataflow information are enabled independently at different optimization levels.

       -fdevirtualize
	   Attempt to convert calls to virtual functions to direct  calls.   This  is  done  both  within  a  procedure	 and
	   interprocedurally  as  part	of  indirect inlining (-findirect-inlining) and interprocedural constant propagation
	   (-fipa-cp).	Enabled at levels -O2, -O3, -Os.

       -fdevirtualize-speculatively
	   Attempt to convert calls to virtual functions to speculative direct calls.  Based on the  analysis  of  the	type
	   inheritance	graph, determine for a given call the set of likely targets. If the set is small, preferably of size
	   1, change the call into a conditional deciding between direct and indirect calls.  The speculative  calls  enable
	   more optimizations, such as inlining.  When they seem useless after further optimization, they are converted back
	   into original form.

       -fdevirtualize-at-ltrans
	   Stream  extra  information  needed  for aggressive devirtualization when running the link-time optimizer in local
	   transformation mode.	 This option enables more devirtualization but significantly increases the size of  streamed
	   data. For this reason it is disabled by default.

       -fexpensive-optimizations
	   Perform a number of minor optimizations that are relatively expensive.

	   Enabled at levels -O2, -O3, -Os.

       -free
	   Attempt  to	remove	redundant  extension  instructions.  This is especially helpful for the x86-64 architecture,
	   which implicitly zero-extends in 64-bit registers after writing to their lower 32-bit half.

	   Enabled for Alpha, AArch64, LoongArch, PowerPC, RISC-V, SPARC, h83000 and x86 at levels -O2, -O3, -Os.

       -fno-lifetime-dse
	   In C++ the value of an object is only affected by changes within its lifetime: when the constructor	begins,	 the
	   object  has an indeterminate value, and any changes during the lifetime of the object are dead when the object is
	   destroyed.  Normally dead store elimination will take advantage of this; if your code relies on the value of	 the
	   object  storage persisting beyond the lifetime of the object, you can use this flag to disable this optimization.
	   To preserve stores before the constructor starts (e.g. because your operator new clears the object  storage)	 but
	   still  treat	 the object as dead after the destructor, you can use -flifetime-dse=1.	 The default behavior can be
	   explicitly selected with -flifetime-dse=2.  -flifetime-dse=0 is equivalent to -fno-lifetime-dse.

       -flive-range-shrinkage
	   Attempt to decrease register pressure through register live range shrinkage.	 This is helpful for fast processors
	   with small or moderate size register sets.

       -fira-algorithm=algorithm
	   Use the specified coloring algorithm for the integrated  register  allocator.   The	algorithm  argument  can  be
	   priority,  which  specifies	Chow's	priority coloring, or CB, which specifies Chaitin-Briggs coloring.  Chaitin-
	   Briggs coloring is not implemented for all architectures, but for those targets that do support  it,	 it  is	 the
	   default because it generates better code.

       -fira-region=region
	   Use specified regions for the integrated register allocator.	 The region argument should be one of the following:

	   all Use  all	 loops	as  register  allocation  regions.  This can give the best results for machines with a small
	       and/or irregular register set.

	   mixed
	       Use all loops except for loops with small register pressure as the regions.  This  value	 usually  gives	 the
	       best  results  in  most	cases  and  for	 most  architectures,  and is enabled by default when compiling with
	       optimization for speed (-O, -O2, ...).

	   one Use all functions as a single region.  This typically results in the smallest code size, and  is	 enabled  by
	       default for -Os or -O0.

       -fira-hoist-pressure
	   Use	IRA to evaluate register pressure in the code hoisting pass for decisions to hoist expressions.	 This option
	   usually results in smaller code, but it can slow the compiler down.

	   This option is enabled at level -Os for all targets.

       -fira-loop-pressure
	   Use IRA to evaluate register pressure in loops for decisions	 to  move  loop	 invariants.   This  option  usually
	   results  in generation of faster and smaller code on machines with large register files (>= 32 registers), but it
	   can slow the compiler down.

	   This option is enabled at level -O3 for some targets.

       -fno-ira-share-save-slots
	   Disable sharing of stack slots used for saving call-used  hard  registers  living  through  a  call.	  Each	hard
	   register gets a separate stack slot, and as a result function stack frames are larger.

       -fno-ira-share-spill-slots
	   Disable  sharing  of	 stack	slots allocated for pseudo-registers.  Each pseudo-register that does not get a hard
	   register gets a separate stack slot, and as a result function stack frames are larger.

       -flra-remat
	   Enable CFG-sensitive rematerialization in LRA.  Instead of loading  values  of  spilled  pseudos,  LRA  tries  to
	   rematerialize (recalculate) values if it is profitable.

	   Enabled at levels -O2, -O3, -Os.

       -fdelayed-branch
	   If supported for the target machine, attempt to reorder instructions to exploit instruction slots available after
	   delayed branch instructions.

	   Enabled at levels -O1, -O2, -O3, -Os, but not at -Og.

       -fschedule-insns
	   If  supported  for  the  target  machine,  attempt  to  reorder instructions to eliminate execution stalls due to
	   required data being unavailable.  This helps machines that have slow floating point or memory  load	instructions
	   by  allowing	 other	instructions  to  be  issued  until  the result of the load or floating-point instruction is
	   required.

	   Conventionally enabled at optimization levels -O2 and -O3.  However, many targets override  this  behavior.	 For
	   example, on x86, it is disabled at all levels, while on AArch64, it is enabled only at -O3.

       -fschedule-insns2
	   Similar  to -fschedule-insns, but requests an additional pass of instruction scheduling after register allocation
	   has been done.  This is especially useful on machines with a relatively  small  number  of  registers  and  where
	   memory load instructions take more than one cycle.

	   Enabled at levels -O2, -O3, -Os.

       -fno-sched-interblock
	   Disable  instruction	 scheduling  across  basic blocks, which is normally enabled when scheduling before register
	   allocation, i.e.  with -fschedule-insns or at -O2 or higher.

       -fno-sched-spec
	   Disable speculative motion of non-load instructions, which is normally enabled when	scheduling  before  register
	   allocation, i.e.  with -fschedule-insns or at -O2 or higher.

       -fsched-pressure
	   Enable  register  pressure  sensitive  insn	scheduling  before  register allocation.  This only makes sense when
	   scheduling before register allocation is enabled, i.e. with -fschedule-insns or at -O2 or higher.  Usage of	this
	   option  can	improve	 the generated code and decrease its size by preventing register pressure increase above the
	   number of available hard registers and subsequent spills in register allocation.

       -fsched-spec-load
	   Allow speculative motion of some load instructions.	This  only  makes  sense  when	scheduling  before  register
	   allocation, i.e. with -fschedule-insns or at -O2 or higher.

       -fsched-spec-load-dangerous
	   Allow  speculative  motion  of  more	 load  instructions.   This only makes sense when scheduling before register
	   allocation, i.e. with -fschedule-insns or at -O2 or higher.

       -fsched-stalled-insns
       -fsched-stalled-insns=n
	   Define how many insns (if any) can be moved prematurely from the queue of  stalled  insns  into  the	 ready	list
	   during  the	second	scheduling  pass.   -fno-sched-stalled-insns  means  that  no  insns  are moved prematurely,
	   -fsched-stalled-insns=0  means  there  is  no  limit	 on  how  many	queued	insns  can  be	moved	prematurely.
	   -fsched-stalled-insns without a value is equivalent to -fsched-stalled-insns=1.

       -fsched-stalled-insns-dep
       -fsched-stalled-insns-dep=n
	   Define  how	many  insn  groups  (cycles) are examined for a dependency on a stalled insn that is a candidate for
	   premature removal from the queue of stalled insns.  This has an effect only during the  second  scheduling  pass,
	   and	  only	  if	-fsched-stalled-insns	 is    used.	 -fno-sched-stalled-insns-dep	is   equivalent	  to
	   -fsched-stalled-insns-dep=0.	    -fsched-stalled-insns-dep	 without    a	  value	    is	   equivalent	  to
	   -fsched-stalled-insns-dep=1.

       -fsched2-use-superblocks
	   When	 scheduling  after  register  allocation,  use superblock scheduling.  This allows motion across basic block
	   boundaries, resulting in faster schedules.  This option is experimental, as not all machine descriptions used  by
	   GCC model the CPU closely enough to avoid unreliable results from the algorithm.

	   This only makes sense when scheduling after register allocation, i.e. with -fschedule-insns2 or at -O2 or higher.

       -fsched-group-heuristic
	   Enable  the	group  heuristic in the scheduler.  This heuristic favors the instruction that belongs to a schedule
	   group.  This is enabled by default when scheduling is enabled, i.e. with -fschedule-insns or -fschedule-insns2 or
	   at -O2 or higher.

       -fsched-critical-path-heuristic
	   Enable the critical-path heuristic in the scheduler.	 This heuristic favors instructions on	the  critical  path.
	   This	 is enabled by default when scheduling is enabled, i.e. with -fschedule-insns or -fschedule-insns2 or at -O2
	   or higher.

       -fsched-spec-insn-heuristic
	   Enable the speculative instruction heuristic in the scheduler.  This heuristic  favors  speculative	instructions
	   with	 greater  dependency  weakness.	  This	is  enabled  by	 default  when	scheduling  is	enabled,  i.e.	with
	   -fschedule-insns or -fschedule-insns2 or at -O2 or higher.

       -fsched-rank-heuristic
	   Enable the rank heuristic in the scheduler.	This heuristic favors the instruction belonging	 to  a	basic  block
	   with	 greater  size	or  frequency.	 This  is  enabled  by	default	 when  scheduling  is  enabled,	 i.e.	with
	   -fschedule-insns or -fschedule-insns2 or at -O2 or higher.

       -fsched-last-insn-heuristic
	   Enable the last-instruction heuristic in the scheduler.  This heuristic  favors  the	 instruction  that  is	less
	   dependent  on  the  last instruction scheduled.  This is enabled by default when scheduling is enabled, i.e. with
	   -fschedule-insns or -fschedule-insns2 or at -O2 or higher.

       -fsched-dep-count-heuristic
	   Enable the dependent-count heuristic in the scheduler.  This heuristic  favors  the	instruction  that  has	more
	   instructions depending on it.  This is enabled by default when scheduling is enabled, i.e.  with -fschedule-insns
	   or -fschedule-insns2 or at -O2 or higher.

       -freschedule-modulo-scheduled-loops
	   Modulo  scheduling  is  performed before traditional scheduling.  If a loop is modulo scheduled, later scheduling
	   passes may change its schedule.  Use this option to control that behavior.

       -fselective-scheduling
	   Schedule instructions using selective scheduling algorithm.	Selective  scheduling  runs  instead  of  the  first
	   scheduler pass.

       -fselective-scheduling2
	   Schedule  instructions  using  selective  scheduling	 algorithm.  Selective scheduling runs instead of the second
	   scheduler pass.

       -fsel-sched-pipelining
	   Enable software pipelining of innermost loops during selective scheduling.  This option has no effect unless	 one
	   of -fselective-scheduling or -fselective-scheduling2 is turned on.

       -fsel-sched-pipelining-outer-loops
	   When	 pipelining  loops during selective scheduling, also pipeline outer loops.  This option has no effect unless
	   -fsel-sched-pipelining is turned on.

       -fsemantic-interposition
	   Some object formats, like ELF, allow interposing of symbols by the dynamic linker.  This means that	for  symbols
	   exported  from the DSO, the compiler cannot perform interprocedural propagation, inlining and other optimizations
	   in anticipation that the function or variable in question may change. While this feature is useful, for  example,
	   to  rewrite	memory	allocation  functions  by  a  debugging implementation, it is expensive in the terms of code
	   quality.  With -fno-semantic-interposition the compiler assumes that if interposition happens for  functions	 the
	   overwriting	function  will	have  precisely	 the  same semantics (and side effects).  Similarly if interposition
	   happens for variables, the constructor of the variable will be the same. The flag has  no  effect  for  functions
	   explicitly  declared	 inline	 (where	 it  is never allowed for interposition to change semantics) and for symbols
	   explicitly declared weak.

       -fshrink-wrap
	   Emit function prologues only before parts of the function that need it, rather than at the top of  the  function.
	   This flag is enabled by default at -O and higher.

       -fshrink-wrap-separate
	   Shrink-wrap	separate  parts	 of the prologue and epilogue separately, so that those parts are only executed when
	   needed.  This option is on by default, but has no effect unless -fshrink-wrap is also turned on  and	 the  target
	   supports this.

       -fcaller-saves
	   Enable  allocation of values to registers that are clobbered by function calls, by emitting extra instructions to
	   save and restore the registers around such calls.  Such allocation is done only when it seems to result in better
	   code.

	   This option is always enabled by default  on	 certain  machines,  usually  those  which  have  no  call-preserved
	   registers to use instead.

	   Enabled at levels -O2, -O3, -Os.

       -fcombine-stack-adjustments
	   Tracks  stack  adjustments  (pushes	and pops) and stack memory references and then tries to find ways to combine
	   them.

	   Enabled by default at -O1 and higher.

       -fipa-ra
	   Use caller save registers for allocation if those registers are not used by any called function.  In that case it
	   is not necessary to save and restore them around calls.  This is only possible if called functions  are  part  of
	   same compilation unit as current function and they are compiled before it.

	   Enabled  at	levels	-O2,  -O3,  -Os,  however  the option is disabled if generated code will be instrumented for
	   profiling (-p, or -pg) or if callee's register usage cannot be known exactly (this happens on targets that do not
	   expose prologues and epilogues in RTL).

       -fconserve-stack
	   Attempt to minimize stack usage.  The compiler attempts to use less stack space, even if that makes	the  program
	   slower.   This  option  implies  setting  the large-stack-frame parameter to 100 and the large-stack-frame-growth
	   parameter to 400.

       -ftree-reassoc
	   Perform reassociation on trees.  This flag is enabled by default at -O1 and higher.

       -fcode-hoisting
	   Perform code hoisting.  Code hoisting tries to move the evaluation of expressions executed on all  paths  to	 the
	   function  exit  as  early as possible.  This is especially useful as a code size optimization, but it often helps
	   for code speed as well.  This flag is enabled by default at -O2 and higher.

       -ftree-pre
	   Perform partial redundancy elimination (PRE) on trees.  This flag is enabled by default at -O2 and -O3.

       -ftree-partial-pre
	   Make partial redundancy elimination (PRE) more aggressive.  This flag is enabled by default at -O3.

       -ftree-forwprop
	   Perform forward propagation on trees.  This flag is enabled by default at -O1 and higher.

       -ftree-fre
	   Perform full redundancy elimination (FRE) on trees.	The  difference	 between  FRE  and  PRE	 is  that  FRE	only
	   considers  expressions  that	 are  computed	on all paths leading to the redundant computation.  This analysis is
	   faster than PRE, though it exposes fewer redundancies.  This flag is enabled by default at -O1 and higher.

       -ftree-phiprop
	   Perform hoisting of loads from conditional pointers on trees.  This pass is enabled by default at -O1 and higher.

       -fhoist-adjacent-loads
	   Speculatively hoist loads from both branches of an if-then-else if the loads are from adjacent locations  in	 the
	   same	 structure  and the target architecture has a conditional move instruction.  This flag is enabled by default
	   at -O2 and higher.

       -ftree-copy-prop
	   Perform copy propagation on trees.  This pass eliminates unnecessary copy operations.  This flag  is	 enabled  by
	   default at -O1 and higher.

       -fipa-pure-const
	   Discover which functions are pure or constant.  Enabled by default at -O1 and higher.

       -fipa-reference
	   Discover which static variables do not escape the compilation unit.	Enabled by default at -O1 and higher.

       -fipa-reference-addressable
	   Discover read-only, write-only and non-addressable static variables.	 Enabled by default at -O1 and higher.

       -fipa-reorder-for-locality
	   Group  call	chains	close  together	 in  the  binary layout to improve code locality and minimize jump distances
	   between frequently called functions.	 Unlike -freorder-functions this pass  considers  the  call  chains  between
	   functions  and  groups  them	 together,  rather  than  grouping all hot/normal/cold/never-executed functions into
	   separate sections.  Unlike -fprofile-reorder-functions it aims to improve code locality throughout the runtime of
	   the	program	 rather	 than  focusing	 on  program  startup.	 This  option  is  incompatible	 with  an   explicit
	   -flto-partition=  option  since it enforces a custom partitioning scheme.  If using this option it is recommended
	   to also use profile feedback, but this option is not enabled by default otherwise.

       -fipa-stack-alignment
	   Reduce stack alignment on call sites if possible.  Enabled by default.

       -fipa-pta
	   Perform interprocedural pointer analysis and interprocedural modification and reference  analysis.	This  option
	   can	cause  excessive  memory and compile-time usage on large compilation units.  It is not enabled by default at
	   any optimization level.

       -fipa-profile
	   Perform interprocedural profile propagation.	 The functions called only from cold functions are marked  as  cold.
	   Also	 functions  executed  once  (such as "cold", "noreturn", static constructors or destructors) are identified.
	   Cold functions and loop less parts of functions executed once are then optimized for size.  Enabled by default at
	   -O1 and higher.

       -fipa-modref
	   Perform interprocedural mod/ref analysis.  This optimization analyzes  the  side  effects  of  functions  (memory
	   locations  that  are	 modified  or referenced) and enables better optimization across the function call boundary.
	   This flag is enabled by default at -O1 and higher.

       -fipa-cp
	   Perform interprocedural constant propagation.  This optimization analyzes the program to  determine	when  values
	   passed  to  functions are constants and then optimizes accordingly.	This optimization can substantially increase
	   performance if the application has constants passed to functions.  This flag is enabled by default  at  -O2,	 -Os
	   and -O3.  It is also enabled by -fprofile-use and -fauto-profile.

       -fipa-cp-clone
	   Perform  function  cloning  to make interprocedural constant propagation stronger.  When enabled, interprocedural
	   constant propagation performs function cloning when externally visible  function  can  be  called  with  constant
	   arguments.  Because this optimization can create multiple copies of functions, it may significantly increase code
	   size	 (see  --param	ipa-cp-unit-growth=value).   This  flag is enabled by default at -O3.  It is also enabled by
	   -fprofile-use and -fauto-profile.

       -fipa-bit-cp
	   When enabled, perform interprocedural bitwise constant propagation. This flag is enabled by default at -O2 and by
	   -fprofile-use and -fauto-profile.  It requires that -fipa-cp is enabled.

       -fipa-vrp
	   When enabled, perform interprocedural propagation of value ranges. This flag is enabled by  default	at  -O2.  It
	   requires that -fipa-cp is enabled.

       -fipa-icf
	   Perform Identical Code Folding for functions and read-only variables.  The optimization reduces code size and may
	   disturb  unwind  stacks  by	replacing a function by equivalent one with a different name. The optimization works
	   more effectively with link-time optimization enabled.

	   Although the behavior is similar to the Gold Linker's ICF optimization, GCC ICF works  on  different	 levels	 and
	   thus	 the  optimizations  are not same - there are equivalences that are found only by GCC and equivalences found
	   only by Gold.

	   This flag is enabled by default at -O2 and -Os.

       -flate-combine-instructions
	   Enable two instruction combination passes that run relatively late in the compilation process.  One of the passes
	   runs before register allocation and the other after register allocation.  The  main	aim  of	 the  passes  is  to
	   substitute definitions into all uses.

	   Most targets enable this flag by default at -O2 and -Os.

       -flive-patching=level
	   Control GCC's optimizations to produce output suitable for live-patching.

	   If  the  compiler's optimization uses a function's body or information extracted from its body to optimize/change
	   another function, the latter is called an impacted function of  the	former.	  If  a	 function  is  patched,	 its
	   impacted functions should be patched too.

	   The	impacted functions are determined by the compiler's interprocedural optimizations.  For example, a caller is
	   impacted when inlining a function into its caller, cloning a function and changing its caller to  call  this	 new
	   clone, or extracting a function's pureness/constness information to optimize its direct or indirect callers, etc.

	   Usually,  the  more IPA optimizations enabled, the larger the number of impacted functions for each function.  In
	   order to control the number of impacted functions and more easily compute the  list	of  impacted  function,	 IPA
	   optimizations can be partially enabled at two different levels.

	   The level argument should be one of the following:

	   inline-clone
	       Only  enable  inlining  and  cloning  optimizations, which includes inlining, cloning, interprocedural scalar
	       replacement of aggregates and partial inlining.	As a result, when patching a function, all its	callers	 and
	       its clones' callers are impacted, therefore need to be patched as well.

	       -flive-patching=inline-clone   disables	 the   following   optimization	 flags:	 -fwhole-program   -fipa-pta
	       -fipa-reference	 -fipa-ra  -fipa-icf   -fipa-icf-functions   -fipa-icf-variables   -fipa-bit-cp	   -fipa-vrp
	       -fipa-pure-const -fipa-reference-addressable -fipa-stack-alignment -fipa-modref

	   inline-only-static
	       Only  enable inlining of static functions.  As a result, when patching a static function, all its callers are
	       impacted and so need to be patched as well.

	       In addition to all the flags that -flive-patching=inline-clone  disables,  -flive-patching=inline-only-static
	       disables the following additional optimization flags: -fipa-cp-clone  -fipa-sra	-fpartial-inlining  -fipa-cp

	   When -flive-patching is specified without any value, the default value is inline-clone.

	   This flag is disabled by default.

	   Note that -flive-patching is not supported with link-time optimization (-flto).

       -fisolate-erroneous-paths-dereference
	   Detect  paths  that	trigger	 erroneous or undefined behavior due to dereferencing a null pointer.  Isolate those
	   paths from the main control flow and turn the statement with erroneous or undefined behavior into a	trap.	This
	   flag is enabled by default at -O2 and higher and depends on -fdelete-null-pointer-checks also being enabled.

       -fisolate-erroneous-paths-attribute
	   Detect  paths that trigger erroneous or undefined behavior due to a null value being used in a way forbidden by a
	   "returns_nonnull" or "nonnull" attribute.  Isolate those paths from the main control flow and turn the  statement
	   with	 erroneous  or	undefined behavior into a trap.	 This is not currently enabled, but may be enabled by -O2 in
	   the future.

       -ftree-sink
	   Perform forward store motion on trees.  This flag is enabled by default at -O1 and higher.

       -ftree-bit-ccp
	   Perform sparse conditional bit constant propagation on trees and propagate pointer alignment	 information.	This
	   pass	 only  operates	 on  local scalar variables and is enabled by default at -O1 and higher, except for -Og.  It
	   requires that -ftree-ccp is enabled.

       -ftree-ccp
	   Perform sparse conditional constant propagation (CCP)  on  trees.   This  pass  only	 operates  on  local  scalar
	   variables and is enabled by default at -O1 and higher.

       -fssa-backprop
	   Propagate  information  about  uses of a value up the definition chain in order to simplify the definitions.	 For
	   example, this pass strips sign operations if the sign of a value never matters.  The flag is enabled	 by  default
	   at -O1 and higher.

       -fssa-phiopt
	   Perform  pattern  matching on SSA PHI nodes to optimize conditional code.  This pass is enabled by default at -O1
	   and higher, except for -Og.

       -ftree-switch-conversion
	   Perform conversion of simple initializations in a switch to initializations from a scalar array.   This  flag  is
	   enabled by default at -O2 and higher.

       -ftree-tail-merge
	   Look for identical code sequences.  When found, replace one with a jump to the other.  This optimization is known
	   as  tail  merging  or cross jumping.	 This flag is enabled by default at -O2 and higher.  The compilation time in
	   this pass can be limited using max-tail-merge-comparisons parameter and max-tail-merge-iterations parameter.

       -ftree-cselim
	   Perform conditional store elimination on trees.  This flag is enabled by default at -O1  and	 higher	 on  targets
	   that have conditional move instructions.

       -ftree-dce
	   Perform dead code elimination (DCE) on trees.  This flag is enabled by default at -O1 and higher.

       -ftree-builtin-call-dce
	   Perform  conditional	 dead  code  elimination  (DCE) for calls to built-in functions that may set "errno" but are
	   otherwise free of side effects.  This flag is enabled by default at -O2 and higher if -Os is not also specified.

       -ffinite-loops
	   Assume that a loop with an exit will eventually take the  exit  and	not  loop  indefinitely.   This	 allows	 the
	   compiler to remove loops that otherwise have no side-effects, not considering eventual endless looping as such.

	   This option is enabled by default at -O2 for C++ with -std=c++11 or higher.

       -ftree-dominator-opts
	   Perform a variety of simple scalar cleanups (constant/copy propagation, redundancy elimination, range propagation
	   and expression simplification) based on a dominator tree traversal.	This also performs jump threading (to reduce
	   jumps to jumps). This flag is enabled by default at -O1 and higher.

       -ftree-dse
	   Perform  dead  store	 elimination  (DSE)  on trees.	A dead store is a store into a memory location that is later
	   overwritten by another store without any intervening loads.	In this case the earlier store can be deleted.	This
	   flag is enabled by default at -O1 and higher.

       -ftree-ch
	   Perform loop header copying on trees.  This is  beneficial  since  it  increases  effectiveness  of	code  motion
	   optimizations.   It	also  saves one jump.  This flag is enabled by default at -O1 and higher.  It is not enabled
	   for -Os, since it usually increases code size.

       -ftree-loop-optimize
	   Perform loop optimizations on trees.	 This flag is enabled by default at -O1 and higher.

       -ftree-loop-linear
       -floop-strip-mine
       -floop-block
	   Perform loop nest optimizations.  Same as -floop-nest-optimize.  To use this code transformation, GCC has  to  be
	   configured with --with-isl to enable the Graphite loop transformation infrastructure.

       -fgraphite-identity
	   Enable  the	identity  transformation for graphite.	For every SCoP we generate the polyhedral representation and
	   transform it back to gimple.	 Using -fgraphite-identity we can check the costs  or  benefits	 of  the  GIMPLE  ->
	   GRAPHITE -> GIMPLE transformation.  Some minimal optimizations are also performed by the code generator isl, like
	   index splitting and dead code elimination in loops.

       -floop-nest-optimize
	   Enable  the isl based loop nest optimizer.  This is a generic loop nest optimizer based on the Pluto optimization
	   algorithms.	It calculates a loop  structure	 optimized  for	 data-locality	and  parallelism.   This  option  is
	   experimental.

       -floop-parallelize-all
	   Use	the Graphite data dependence analysis to identify loops that can be parallelized.  Parallelize all the loops
	   that can be analyzed to not	contain	 loop  carried	dependences  without  checking	that  it  is  profitable  to
	   parallelize the loops.

       -ftree-coalesce-vars
	   While transforming the program out of the SSA representation, attempt to reduce copying by coalescing versions of
	   different  user-defined  variables, instead of just compiler temporaries.  This may severely limit the ability to
	   debug an optimized program compiled with -fno-var-tracking-assignments.  In the negated form, this flag  prevents
	   SSA coalescing of user variables.  This option is enabled by default if optimization is enabled, and it does very
	   little otherwise.

       -ftree-loop-if-convert
	   Attempt  to	transform  conditional	jumps  in  the innermost loops to branch-less equivalents.  The intent is to
	   remove control-flow from the innermost loops in order to improve the ability of the vectorization pass to  handle
	   these loops.	 This is enabled by default if vectorization is enabled.

       -ftree-loop-distribution
	   Perform  loop  distribution.	  This	flag can improve cache performance on big loop bodies and allow further loop
	   optimizations, like parallelization or vectorization, to take place.	 For example, the loop

		   DO I = 1, N
		     A(I) = B(I) + C
		     D(I) = E(I) * F
		   ENDDO

	   is transformed to

		   DO I = 1, N
		      A(I) = B(I) + C
		   ENDDO
		   DO I = 1, N
		      D(I) = E(I) * F
		   ENDDO

	   This flag is enabled by default at -O3.  It is also enabled by -fprofile-use and -fauto-profile.

       -ftree-loop-distribute-patterns
	   Perform loop distribution of patterns that can be code generated with calls to a library.  This flag	 is  enabled
	   by default at -O2 and higher, and by -fprofile-use and -fauto-profile.

	   This pass distributes the initialization loops and generates a call to memset zero.	For example, the loop

		   DO I = 1, N
		     A(I) = 0
		     B(I) = A(I) + I
		   ENDDO

	   is transformed to

		   DO I = 1, N
		      A(I) = 0
		   ENDDO
		   DO I = 1, N
		      B(I) = A(I) + I
		   ENDDO

	   and the initialization loop is transformed into a call to memset zero.

       -floop-interchange
	   Perform  loop  interchange  outside	of graphite.  This flag can improve cache performance on loop nest and allow
	   further loop optimizations, like vectorization, to take place.  For example, the loop

		   for (int i = 0; i < N; i++)
		     for (int j = 0; j < N; j++)
		       for (int k = 0; k < N; k++)
			 c[i][j] = c[i][j] + a[i][k]*b[k][j];

	   is transformed to

		   for (int i = 0; i < N; i++)
		     for (int k = 0; k < N; k++)
		       for (int j = 0; j < N; j++)
			 c[i][j] = c[i][j] + a[i][k]*b[k][j];

	   This flag is enabled by default at -O3.  It is also enabled by -fprofile-use and -fauto-profile.

       -floop-unroll-and-jam
	   Apply unroll and jam transformations on feasible loops.  In a loop nest this	 unrolls  the  outer  loop  by	some
	   factor and fuses the resulting multiple inner loops.	 This flag is enabled by default at -O3.  It is also enabled
	   by -fprofile-use and -fauto-profile.

       -ftree-loop-im
	   Perform  loop  invariant  motion  on trees.	This pass moves only invariants that are hard to handle at RTL level
	   (function calls, operations that expand to nontrivial sequences of insns).  With -funswitch-loops it	 also  moves
	   operands of conditions that are invariant out of the loop, so that we can use just trivial invariantness analysis
	   in loop unswitching.	 The pass also includes store motion.

       -ftree-loop-ivcanon
	   Create  a canonical counter for number of iterations in loops for which determining number of iterations requires
	   complicated analysis.  Later optimizations then may determine the number easily.  Useful especially in connection
	   with unrolling.

       -ftree-scev-cprop
	   Perform final value replacement.  If a variable is modified in a loop in such a way that its value  when  exiting
	   the	loop  can  be determined using only its initial value and the number of loop iterations, replace uses of the
	   final value by such a computation, provided it is sufficiently cheap.  This reduces	data  dependencies  and	 may
	   allow further simplifications.  Enabled by default at -O1 and higher.

       -fivopts
	   Perform  induction  variable optimizations (strength reduction, induction variable merging and induction variable
	   elimination) on trees.  Enabled by default at -O1 and higher.

       -ftree-parallelize-loops=n
	   Parallelize loops, i.e., split their iteration space to run in n threads.  This is only possible for loops  whose
	   iterations  are  independent	 and  can  be  arbitrarily  reordered.	 The  optimization  is	only  profitable  on
	   multiprocessor machines, for loops that are CPU-intensive, rather than  constrained	e.g.  by  memory  bandwidth.
	   This option implies -pthread, and thus is only supported on targets that have support for -pthread.

       -ftree-pta
	   Perform  function-local  points-to  analysis on trees.  This flag is enabled by default at -O1 and higher, except
	   for -Og.

       -ftree-sra
	   Perform scalar replacement of aggregates.  This pass	 replaces  structure  references  with	scalars	 to  prevent
	   committing structures to memory too early.  This flag is enabled by default at -O1 and higher, except for -Og.

       -fstore-merging
	   Perform  merging  of	 narrow	 stores	 to  consecutive  memory  addresses.   This pass merges contiguous stores of
	   immediate values narrower than a word into fewer wider stores to reduce the	number	of  instructions.   This  is
	   enabled by default at -O2 and higher as well as -Os.

       -ftree-ter
	   Perform  temporary  expression  replacement	during the SSA->normal phase.  Single use/single def temporaries are
	   replaced at their use location with their defining expression.  This results in non-GIMPLE code,  but  gives	 the
	   expanders  much  more complex trees to work on resulting in better RTL generation.  This is enabled by default at
	   -O1 and higher.

       -ftree-slsr
	   Perform straight-line strength reduction on trees.  This recognizes related expressions involving multiplications
	   and replaces them by less expensive calculations when possible.  This is enabled by default at -O1 and higher.

       -ftree-vectorize
	   Perform vectorization  on  trees.  This  flag  enables  -ftree-loop-vectorize  and  -ftree-slp-vectorize  if	 not
	   explicitly specified.

       -ftree-loop-vectorize
	   Perform  loop  vectorization	 on  trees.  This  flag	 is  enabled  by  default  at  -O2  and by -ftree-vectorize,
	   -fprofile-use, and -fauto-profile.

       -ftree-slp-vectorize
	   Perform basic block vectorization on trees. This flag is enabled by	default	 at  -O2  and  by  -ftree-vectorize,
	   -fprofile-use, and -fauto-profile.

       -ftrivial-auto-var-init=choice
	   Initialize  automatic  variables with either a pattern or with zeroes to increase the security and predictability
	   of a program by preventing uninitialized memory disclosure and use.	GCC still considers  an	 automatic  variable
	   that	    doesn't	have	 an	explicit     initializer     as	    uninitialized,    -Wuninitialized	 and
	   -Wanalyzer-use-of-uninitialized-value will still report warning messages on	such  automatic	 variables  and	 the
	   compiler  will  perform  optimization  as  if  the  variable were uninitialized.  With this option, GCC will also
	   initialize any padding of automatic variables that have structure or union types to zeroes.	However, the current
	   implementation cannot initialize automatic variables that are declared between the controlling expression and the
	   first case of a "switch" statement.	Using -Wtrivial-auto-var-init to report all such cases.

	   The three values of choice are:

	   *   uninitialized doesn't initialize any automatic variables.  This is C and C++'s default.

	   *   pattern Initialize automatic variables with values which will likely transform logic bugs into  crashes	down
	       the  line,  are	easily	recognized in a crash dump and without being values that programmers can rely on for
	       useful program semantics.  The current value is byte-repeatable pattern with byte "0xFE".   The	values	used
	       for pattern initialization might be changed in the future.

	   *   zero Initialize automatic variables with zeroes.

	   The default is uninitialized.

	   Note	 that  the  initializer	 values, whether zero or pattern, refer to data representation (in memory or machine
	   registers), rather than to their interpretation as numerical	 values.   This	 distinction  may  be  important  in
	   languages  that  support  types  with  biases or implicit multipliers, and with such extensions as hardbool.	 For
	   example, a variable that uses 8 bits to represent (biased) quantities in the "range 160..400" will be initialized
	   with the bit patterns 0x00 or 0xFE, depending on choice, whether or not these representations stand for values in
	   that range, and even if they do, the interpretation of the value held by the variable will depend on the bias.  A
	   hardbool variable that uses say "0X5A" and 0xA5 for "false" and  "true",  respectively,  will  trap	with  either
	   choice of trivial initializer, i.e., zero initialization will not convert to the representation for "false", even
	   if  it  would  for  a  "static"  variable of the same type.	This means the initializer pattern doesn't generally
	   depend on the type of the initialized variable.  One notable exception is that (non-hardened)  boolean  variables
	   that fit in registers are initialized with "false" (zero), even when pattern is requested.

	   You can control this behavior for a specific variable by using the variable attribute "uninitialized".

       -fvect-cost-model=model
	   Alter  the  cost  model used for vectorization.  The model argument should be one of unlimited, dynamic, cheap or
	   very-cheap.	With the unlimited model the vectorized code-path is assumed to be profitable while with the dynamic
	   model a runtime check guards the vectorized code-path to enable it only for iteration  counts  that	will  likely
	   execute  faster  than  when	executing the original scalar loop.  The cheap model disables vectorization of loops
	   where doing so would be cost prohibitive for example due to	required  runtime  checks  for	data  dependence  or
	   alignment but otherwise is equal to the dynamic model.  The very-cheap model disables vectorization of loops when
	   any	runtime check for data dependence or alignment is required, it also disables vectorization of epilogue loops
	   but otherwise is equal to the cheap model.

	   The default cost model depends on other optimization flags and is either dynamic or cheap.

       -fsimd-cost-model=model
	   Alter the cost model used for vectorization of loops marked with the OpenMP simd directive.	The  model  argument
	   should  be  one  of	unlimited,  dynamic,  cheap.   All  values  of	model  have the same meaning as described in
	   -fvect-cost-model and by default a cost model defined with -fvect-cost-model is used.

       -ftree-vrp
	   Perform Value Range Propagation on trees.  This is similar to the  constant	propagation  pass,  but	 instead  of
	   values,  ranges  of	values	are  propagated.  This allows the optimizers to remove unnecessary range checks like
	   array bound checks and null pointer checks.	This is enabled by default at -O2 and higher.	Null  pointer  check
	   elimination is only done if -fdelete-null-pointer-checks is enabled.

       -fsplit-paths
	   Split  paths	 leading  to  loop  backedges.	 This  can  improve  dead  code elimination and common subexpression
	   elimination.	 This is enabled by default at -O3 and above.

       -fsplit-ivs-in-unroller
	   Enables expression of values of induction variables in later iterations of the unrolled loop using the  value  in
	   the first iteration.	 This breaks long dependency chains, thus improving efficiency of the scheduling passes.

	   A  combination  of -fweb and CSE is often sufficient to obtain the same effect.  However, that is not reliable in
	   cases where the loop body is more complicated than a single basic block.  It also does not work at  all  on	some
	   architectures due to restrictions in the CSE pass.

	   This optimization is enabled by default.

       -fvariable-expansion-in-unroller
	   With	 this  option, the compiler creates multiple copies of some local variables when unrolling a loop, which can
	   result in superior code.

	   This optimization is enabled by default for PowerPC targets, but disabled by default otherwise.

       -fpartial-inlining
	   Inline parts of functions.  This  option  has  any  effect  only  when  inlining  itself  is	 turned	 on  by	 the
	   -finline-functions or -finline-small-functions options.

	   Enabled at levels -O2, -O3, -Os.

       -fpredictive-commoning
	   Perform  predictive	commoning  optimization,  i.e.,	 reusing  computations	(especially memory loads and stores)
	   performed in previous iterations of loops.

	   This option is enabled at level -O3.	 It is also enabled by -fprofile-use and -fauto-profile.

       -fprefetch-loop-arrays
	   If supported by the target machine, generate instructions to prefetch memory to improve the performance of  loops
	   that access large arrays.

	   This	 option may generate better or worse code; results are highly dependent on the structure of loops within the
	   source code.

	   Disabled at level -Os.

       -fno-printf-return-value
	   Do not substitute constants for known return value of formatted output functions such as  "sprintf",	 "snprintf",
	   "vsprintf",	and "vsnprintf" (but not "printf" of "fprintf").  This transformation allows GCC to optimize or even
	   eliminate branches based on the known return value of these functions  called  with	arguments  that	 are  either
	   constant, or whose values are known to be in a range that makes determining the exact return value possible.	 For
	   example, when -fprintf-return-value is in effect, both the branch and the body of the "if" statement (but not the
	   call	 to  "snprint")	 can  be  optimized away when "i" is a 32-bit or smaller integer because the return value is
	   guaranteed to be at most 8.

		   char buf[9];
		   if (snprintf (buf, "%08x", i) >= sizeof buf)
		     ...

	   The -fprintf-return-value option relies on other optimizations and yields best results with -O2  and	 above.	  It
	   works  in tandem with the -Wformat-overflow and -Wformat-truncation options.	 The -fprintf-return-value option is
	   enabled by default.

       -fno-peephole
       -fno-peephole2
	   Disable any machine-specific peephole optimizations.	 The difference between -fno-peephole and -fno-peephole2  is
	   in how they are implemented in the compiler; some targets use one, some use the other, a few use both.

	   -fpeephole is enabled by default.  -fpeephole2 enabled at levels -O2, -O3, -Os.

       -fno-guess-branch-probability
	   Do not guess branch probabilities using heuristics.

	   GCC	 uses	heuristics   to	 guess	branch	probabilities  if  they	 are  not  provided  by	 profiling  feedback
	   (-fprofile-arcs).  These heuristics are based on the control	 flow  graph.	If  some  branch  probabilities	 are
	   specified  by  "__builtin_expect", then the heuristics are used to guess branch probabilities for the rest of the
	   control flow graph, taking the "__builtin_expect" info into account.	 The interactions between the heuristics and
	   "__builtin_expect" can be complex, and in some cases, it may be useful to disable  the  heuristics  so  that	 the
	   effects of "__builtin_expect" are easier to understand.

	   It  is  also	 possible to specify expected probability of the expression with "__builtin_expect_with_probability"
	   built-in function.

	   The default is -fguess-branch-probability at levels -O, -O2, -O3, -Os.

       -freorder-blocks
	   Reorder basic blocks in the compiled function in order to reduce  number  of	 taken	branches  and  improve	code
	   locality.

	   Enabled at levels -O1, -O2, -O3, -Os.

       -freorder-blocks-algorithm=algorithm
	   Use	the  specified	algorithm  for basic block reordering.	The algorithm argument can be simple, which does not
	   increase code size (except sometimes due to secondary effects like alignment), or stc, the "software trace cache"
	   algorithm, which tries to put all often executed code together, minimizing the number  of  branches	executed  by
	   making extra copies of code.

	   The default is simple at levels -O1, -Os, and stc at levels -O2, -O3.

       -freorder-blocks-and-partition
	   In  addition	 to  reordering	 basic blocks in the compiled function, in order to reduce number of taken branches,
	   partitions hot and cold basic blocks into separate sections of the assembly and .o files, to improve	 paging	 and
	   cache locality performance.

	   This	 optimization is automatically turned off in the presence of exception handling or unwind tables (on targets
	   using setjump/longjump or target specific scheme), for linkonce  sections,  for  functions  with  a	user-defined
	   section  attribute and on any architecture that does not support named sections.  When -fsplit-stack is used this
	   option is not enabled by default (to avoid linker errors), but may be enabled  explicitly  (if  using  a  working
	   linker).

	   Enabled for x86 at levels -O2, -O3, -Os.

       -freorder-functions
	   Reorder  functions  in the object file in order to improve code locality.  Unlike -fipa-reorder-for-locality this
	   option prioritises grouping all functions within a category (hot/normal/cold/never-executed) together.   This  is
	   implemented	by using special subsections ".text.hot" for most frequently executed functions and ".text.unlikely"
	   for unlikely executed functions.  Reordering is done by the linker so  object  file	format	must  support  named
	   sections and linker must place them in a reasonable way.

	   This	 option	 isn't	effective  unless  you	either	provide profile feedback (see -fprofile-arcs for details) or
	   manually annotate functions with "hot" or "cold" attributes.

	   Enabled at levels -O2, -O3, -Os.

       -fstrict-aliasing
	   Allow the compiler to assume the strictest aliasing rules applicable to the language being compiled.	 For C	(and
	   C++),  this	activates  optimizations  based on the type of expressions.  In particular, an object of one type is
	   assumed never to reside at the same address as an object of a different type, unless the  types  are	 almost	 the
	   same.   For example, an "unsigned int" can alias an "int", but not a "void*" or a "double".	A character type may
	   alias any other type.

	   Pay special attention to code like this:

		   union a_union {
		     int i;
		     double d;
		   };

		   int f() {
		     union a_union t;
		     t.d = 3.0;
		     return t.i;
		   }

	   The practice of reading from a different union member than the  one	most  recently	written	 to  (called  "type-
	   punning")  is  common.   Even  with	-fstrict-aliasing,  type-punning is allowed, provided the memory is accessed
	   through the union type.  So, the code above works as expected.    However, this code might not:

		   int f() {
		     union a_union t;
		     int* ip;
		     t.d = 3.0;
		     ip = &t.i;
		     return *ip;
		   }

	   Similarly, access by taking the address, casting the resulting pointer and dereferencing the result has undefined
	   behavior, even if the cast uses a union type, e.g.:

		   int f() {
		     double d = 3.0;
		     return ((union a_union *) &d)->i;
		   }

	   The -fstrict-aliasing option is enabled at levels -O2, -O3, -Os.

       -fipa-strict-aliasing
	   Controls whether rules of -fstrict-aliasing are applied  across  function  boundaries.   Note  that	if  multiple
	   functions  gets  inlined  into  a  single  function the memory accesses are no longer considered to be crossing a
	   function boundary.

	   The	-fipa-strict-aliasing  option  is  enabled  by	default	 and  is  effective   only   in	  combination	with
	   -fstrict-aliasing.

       -falign-functions
       -falign-functions=n
       -falign-functions=n:m
       -falign-functions=n:m:n2
       -falign-functions=n:m:n2:m2
	   Align the start of functions to the next power-of-two greater than or equal to n, skipping up to m-1 bytes.	This
	   ensures  that  at  least  the  first m bytes of the function can be fetched by the CPU without crossing an n-byte
	   alignment boundary.	This is an  optimization  of  code  performance	 and  alignment	 is  ignored  for  functions
	   considered cold.  If alignment is required for all functions, use -fmin-function-alignment.

	   If m is not specified, it defaults to n.

	   Examples:  -falign-functions=32 aligns functions to the next 32-byte boundary, -falign-functions=24 aligns to the
	   next 32-byte boundary only if this can be done by skipping 23 bytes or less, -falign-functions=32:7 aligns to the
	   next 32-byte boundary only if this can be done by skipping 6 bytes or less.

	   The second pair of n2:m2 values allows you to specify a secondary alignment:	 -falign-functions=64:7:32:3  aligns
	   to  the  next  64-byte  boundary  if	 this  can be done by skipping 6 bytes or less, otherwise aligns to the next
	   32-byte boundary if this can be done by skipping 2 bytes or less.  If m2 is not specified, it defaults to n2.

	   Some assemblers only support this flag when n is a power of two; in that case, it is rounded up.

	   -fno-align-functions and -falign-functions=1 are equivalent and mean that functions are not aligned.

	   If n is not specified or is zero, use a machine-dependent default.  The maximum allowed n option value is 65536.

	   Enabled at levels -O2, -O3.

       -flimit-function-alignment
	   If this option is enabled, the compiler tries to avoid  unnecessarily  overaligning	functions.  It	attempts  to
	   instruct the assembler to align by the amount specified by -falign-functions, but not to skip more bytes than the
	   size of the function.

       -falign-labels
       -falign-labels=n
       -falign-labels=n:m
       -falign-labels=n:m:n2
       -falign-labels=n:m:n2:m2
	   Align all branch targets to a power-of-two boundary.

	   Parameters  of this option are analogous to the -falign-functions option.  -fno-align-labels and -falign-labels=1
	   are equivalent and mean that labels are not aligned.

	   If -falign-loops or -falign-jumps are applicable and are greater than this value,  then  their  values  are	used
	   instead.

	   If  n  is  not  specified  or  is  zero, use a machine-dependent default which is very likely to be 1, meaning no
	   alignment.  The maximum allowed n option value is 65536.

	   Enabled at levels -O2, -O3.

       -falign-loops
       -falign-loops=n
       -falign-loops=n:m
       -falign-loops=n:m:n2
       -falign-loops=n:m:n2:m2
	   Align loops to a power-of-two boundary.  If the loops are executed many times, this makes up for any execution of
	   the dummy padding instructions.  This is an optimization of code performance and alignment is ignored  for  loops
	   considered cold.

	   If -falign-labels is greater than this value, then its value is used instead.

	   Parameters  of  this	 option are analogous to the -falign-functions option.	-fno-align-loops and -falign-loops=1
	   are equivalent and mean that loops are not aligned.	The maximum allowed n option value is 65536.

	   If n is not specified or is zero, use a machine-dependent default.

	   Enabled at levels -O2, -O3.

       -falign-jumps
       -falign-jumps=n
       -falign-jumps=n:m
       -falign-jumps=n:m:n2
       -falign-jumps=n:m:n2:m2
	   Align branch targets to a power-of-two boundary, for branch targets where the targets  can  only  be	 reached  by
	   jumping.   In  this	case, no dummy operations need be executed.  This is an optimization of code performance and
	   alignment is ignored for jumps considered cold.

	   If -falign-labels is greater than this value, then its value is used instead.

	   Parameters of this option are analogous to the -falign-functions option.   -fno-align-jumps	and  -falign-jumps=1
	   are equivalent and mean that loops are not aligned.

	   If n is not specified or is zero, use a machine-dependent default.  The maximum allowed n option value is 65536.

	   Enabled at levels -O2, -O3.

       -fmin-function-alignment
	   Specify  minimal  alignment	of  functions  to  the	next  power-of-two  greater  than  or  equal  to  n.  Unlike
	   -falign-functions this alignment is applied also to all functions (even those considered cold).  The alignment is
	   also not affected by -flimit-function-alignment

       -fno-allocation-dce
	   Do not remove unused C++ allocations (using operator "new" and operator "delete") in dead code elimination.

	   See also -fmalloc-dce.

       -fallow-store-data-races
	   Allow the compiler to perform optimizations that may introduce new data races on stores, without proving that the
	   variable cannot be concurrently accessed by other threads.  Does not affect optimization of local  data.   It  is
	   safe to use this option if it is known that global data will not be accessed by multiple threads.

	   Examples of optimizations enabled by -fallow-store-data-races include hoisting or if-conversions that may cause a
	   value  that	was  already  in  memory to be re-written with that same value.	 Such re-writing is safe in a single
	   threaded context but may be unsafe in a multi-threaded context.  Note that on some processors, if-conversions may
	   be required in order to enable vectorization.

	   Enabled at level -Ofast.

       -funit-at-a-time
	   This option is left for compatibility reasons. -funit-at-a-time has no effect, while -fno-unit-at-a-time  implies
	   -fno-toplevel-reorder and -fno-section-anchors.

	   Enabled by default.

       -fno-toplevel-reorder
	   Do  not  reorder  top-level	functions, variables, and "asm" statements.  Output them in the same order that they
	   appear in the input file.  When this option is used, unreferenced static variables are not removed.	This  option
	   is  intended	 to  support  existing code that relies on a particular ordering.  For new code, it is better to use
	   attributes when possible.

	   -ftoplevel-reorder is the default at -O1  and  higher,  and	also  at  -O0  if  -fsection-anchors  is  explicitly
	   requested.  Additionally -fno-toplevel-reorder implies -fno-section-anchors.

       -funreachable-traps
	   With	 this  option,	the  compiler  turns  calls to "__builtin_unreachable" into traps, instead of using them for
	   optimization.  This also affects any such calls implicitly generated by the compiler.

	   This option has the same effect as -fsanitize=unreachable -fsanitize-trap=unreachable, but does  not	 affect	 the
	   values of those options.  If -fsanitize=unreachable is enabled, that option takes priority over this one.

	   This option is enabled by default at -O0 and -Og.

       -fweb
	   Constructs webs as commonly used for register allocation purposes and assign each web individual pseudo register.
	   This	 allows	 the  register	allocation  pass  to operate on pseudos directly, but also strengthens several other
	   optimization passes, such as CSE, loop optimizer and trivial dead code remover.  It can, however, make  debugging
	   impossible, since variables no longer stay in a "home register".

	   Enabled by default with -funroll-loops.

       -fwhole-program
	   Assume  that	 the current compilation unit represents the whole program being compiled.  All public functions and
	   variables with the exception of "main" and those merged by attribute "externally_visible" become static functions
	   and in effect are optimized more aggressively by interprocedural optimizers.

	   With -flto this option has a limited use.  In most cases the precise list of symbols used or	 exported  from	 the
	   binary  is  known the resolution info passed to the link-time optimizer by the linker plugin.  It is still useful
	   if no linker plugin	is  used  or  during  incremental  link	 step  when  final  code  is  produced	(with  -flto
	   -flinker-output=nolto-rel).

       -flto[=n]
	   This	 option	 runs  the standard link-time optimizer.  When invoked with source code, it generates GIMPLE (one of
	   GCC's internal representations) and writes it to special ELF sections in the object file.  When the object  files
	   are	linked	together,  all	the function bodies are read from these ELF sections and instantiated as if they had
	   been part of the same translation unit.

	   To use the link-time optimizer, -flto and optimization options should be specified at compile time and during the
	   final link.	It is recommended that you compile all the files participating	in  the	 same  link  with  the	same
	   options and also specify those options at link time.	 For example:

		   gcc -c -O2 -flto foo.c
		   gcc -c -O2 -flto bar.c
		   gcc -o myprog -flto -O2 foo.o bar.o

	   The	first two invocations to GCC save a bytecode representation of GIMPLE into special ELF sections inside foo.o
	   and bar.o.  The final invocation reads the GIMPLE bytecode from foo.o and bar.o, merges  the	 two  files  into  a
	   single  internal  image,  and  compiles the result as usual.	 Since both foo.o and bar.o are merged into a single
	   image, this causes all the interprocedural analyses and optimizations in GCC to work across the two files  as  if
	   they	 were  a  single  one.	 This means, for example, that the inliner is able to inline functions in bar.o into
	   functions in foo.o and vice-versa.

	   Another (simpler) way to enable link-time optimization is:

		   gcc -o myprog -flto -O2 foo.c bar.c

	   The above generates bytecode for foo.c and bar.c, merges them together into a single	 GIMPLE	 representation	 and
	   optimizes them as usual to produce myprog.

	   The	important  thing to keep in mind is that to enable link-time optimizations you need to use the GCC driver to
	   perform the link step.  GCC automatically performs link-time optimization if any of	the  objects  involved	were
	   compiled  with  the	-flto  command-line  option.  You can always override the automatic decision to do link-time
	   optimization by passing -fno-lto to the link command.

	   To make whole program optimization effective, it is necessary to make certain  whole	 program  assumptions.	 The
	   compiler needs to know what functions and variables can be accessed by libraries and runtime outside of the link-
	   time	 optimized  unit.   When  supported  by	 the  linker,  the  linker  plugin  (see -fuse-linker-plugin) passes
	   information to the compiler about used and externally visible symbols.  When the linker plugin is not  available,
	   -fwhole-program  should  be	used to allow the compiler to make these assumptions, which leads to more aggressive
	   optimization decisions.

	   When a file is compiled with -flto without -fuse-linker-plugin, the	generated  object  file	 is  larger  than  a
	   regular  object file because it contains GIMPLE bytecodes and the usual final code (see -ffat-lto-objects).	This
	   means that object files with LTO information can be linked as normal object files; if -fno-lto is passed  to	 the
	   linker, no interprocedural optimizations are applied.  Note that when -fno-fat-lto-objects is enabled the compile
	   stage is faster but you cannot perform a regular, non-LTO link on them.

	   When	 producing  the final binary, GCC only applies link-time optimizations to those files that contain bytecode.
	   Therefore, you can mix and match object files and libraries with GIMPLE bytecodes and  final	 object	 code.	 GCC
	   automatically selects which files to optimize in LTO mode and which files to link without further processing.

	   Generally,  options	specified  at link time override those specified at compile time, although in some cases GCC
	   attempts to infer link-time options from the settings used to compile the input files.

	   If you do not specify an optimization level option -O at link time, then GCC uses the highest optimization  level
	   used	 when  compiling  the  object files.  Note that it is generally ineffective to specify an optimization level
	   option only at link time and not at compile	time,  for  two	 reasons.   First,  compiling  without	optimization
	   suppresses  compiler passes that gather information needed for effective optimization at link time.	Second, some
	   early optimization passes can be performed only at compile time and not at link time.

	   There are some code generation flags preserved by GCC when generating bytecodes, as they need to be	used  during
	   the	final  link.   Currently, the following options and their settings are taken from the first object file that
	   explicitly specifies them: -fcommon, -fexceptions, -fnon-call-exceptions, -fgnu-tm and all the -m target flags.

	   The following options -fPIC, -fpic, -fpie and -fPIE are combined based on the following scheme:

		   B<-fPIC> + B<-fpic> = B<-fpic>
		   B<-fPIC> + B<-fno-pic> = B<-fno-pic>
		   B<-fpic/-fPIC> + (no option) = (no option)
		   B<-fPIC> + B<-fPIE> = B<-fPIE>
		   B<-fpic> + B<-fPIE> = B<-fpie>
		   B<-fPIC/-fpic> + B<-fpie> = B<-fpie>

	   Certain ABI-changing flags are required to match in all compilation units, and trying to override  this  at	link
	   time	  with	 a   conflicting   value  is  ignored.	 This  includes	 options  such	as  -freg-struct-return	 and
	   -fpcc-struct-return.

	   Other options such as -ffp-contract, -fno-strict-overflow, -fwrapv, -fno-trapv or -fno-strict-aliasing are passed
	   through  to	the  link  stage  and  merged  conservatively  for  conflicting	 translation  units.	Specifically
	   -fno-strict-overflow,  -fwrapv and -fno-trapv take precedence; and for example -ffp-contract=off takes precedence
	   over -ffp-contract=fast.  You can override them at link time.

	   Diagnostic options such as -Wstringop-overflow are passed through to the link stage	and  their  setting  matches
	   that	 of  the  compile-step	at function granularity.  Note that this matters only for diagnostics emitted during
	   optimization.  Note that code transforms such as inlining can lead to warnings  being  enabled  or  disabled	 for
	   regions if code not consistent with the setting at compile time.

	   When	 you  need  to	pass  options  to  the	assembler  via	-Wa  or -Xassembler make sure to either compile such
	   translation units with -fno-lto or consistently use the same assembler options on all translation units.  You can
	   alternatively also specify assembler options at LTO link time.

	   To enable debug info generation you need to supply -g at compile time.  If any of the input files  at  link	time
	   were	 built with debug info generation enabled the link will enable debug info generation as well.  Any elaborate
	   debug info settings like the dwarf level -gdwarf-5 need to be explicitly repeated at the linker command line	 and
	   mixing different settings in different translation units is discouraged.

	   If  LTO  encounters	objects	 with C linkage declared with incompatible types in separate translation units to be
	   linked together (undefined behavior according to ISO C99 6.2.7), a  non-fatal  diagnostic  may  be  issued.	 The
	   behavior is still undefined at run time.  Similar diagnostics may be raised for other languages.

	   Another  feature  of	 LTO  is  that	it  is	possible  to apply interprocedural optimizations on files written in
	   different languages:

		   gcc -c -flto foo.c
		   g++ -c -flto bar.cc
		   gfortran -c -flto baz.f90
		   g++ -o myprog -flto -O3 foo.o bar.o baz.o -lgfortran

	   Notice that the final link is done with g++ to get the C++ runtime libraries and -lgfortran is added to  get	 the
	   Fortran  runtime  libraries.	 In general, when mixing languages in LTO mode, you should use the same link command
	   options as when mixing languages in a regular (non-LTO) compilation.

	   If object files containing GIMPLE bytecode are stored in a library archive,	say  libfoo.a,	it  is	possible  to
	   extract  and	 use  them in an LTO link if you are using a linker with plugin support.  To create static libraries
	   suitable for LTO, use gcc-ar and gcc-ranlib instead of ar and ranlib; to show the symbols of	 object	 files	with
	   GIMPLE  bytecode,  use  gcc-nm.   Those  commands  require  that ar, ranlib and nm have been compiled with plugin
	   support.  At link time, use the flag -fuse-linker-plugin to ensure that  the	 library  participates	in  the	 LTO
	   optimization process:

		   gcc -o myprog -O2 -flto -fuse-linker-plugin a.o b.o -lfoo

	   With	 the  linker plugin enabled, the linker extracts the needed GIMPLE files from libfoo.a and passes them on to
	   the running GCC to make them part of the aggregated GIMPLE image to be optimized.

	   If you are not using a linker with plugin support and/or do not enable the linker plugin, then the objects inside
	   libfoo.a are extracted and linked as usual, but they do not participate in  the  LTO	 optimization  process.	  In
	   order  to  make  a  static library suitable for both LTO optimization and usual linkage, compile its object files
	   with -flto -ffat-lto-objects.

	   Link-time optimizations do not require the presence of the whole program to operate.	 If  the  program  does	 not
	   require  any	 symbols  to  be  exported,  it	 is  possible  to  combine  -flto  and	-fwhole-program to allow the
	   interprocedural  optimizers	to  use	 more  aggressive  assumptions	which  may  lead  to  improved	optimization
	   opportunities.  Use of -fwhole-program is not needed when linker plugin is active (see -fuse-linker-plugin).

	   The	current implementation of LTO makes no attempt to generate bytecode that is portable between different types
	   of hosts.  The bytecode files are versioned and there is a strict version check, so bytecode files  generated  in
	   one version of GCC do not work with an older or newer version of GCC.

	   Link-time  optimization  does  not work well with generation of debugging information on systems other than those
	   using a combination of ELF and DWARF.

	   If you specify the optional n, the optimization and code generation done at link time  is  executed	in  parallel
	   using  n  parallel  jobs  by	 utilizing  an installed make program.	The environment variable MAKE may be used to
	   override the program used.

	   You can also specify -flto=jobserver to use GNU make's job server mode to determine the number of parallel  jobs.
	   This	 is  useful  when  the	Makefile  calling GCC is already executing in parallel.	 You must prepend a + to the
	   command recipe in the parent Makefile for this to work.  This option likely only works if MAKE is GNU make.	Even
	   without the option value, GCC tries to automatically detect a running GNU make's job server.

	   Use -flto=auto to use GNU make's job server, if available, or otherwise fall back to autodetection of the  number
	   of CPU threads present in your system.

       -flto-partition=alg
	   Specify  the	 partitioning  algorithm  used	by  the	 link-time optimizer.  The value is either 1to1 to specify a
	   partitioning mirroring the original source files or balanced to specify partitioning into  equally  sized  chunks
	   (whenever  possible)	 or  max  to  create new partition for every symbol where possible or cache to balance chunk
	   sizes while keeping related symbols together for better caching  in	incremental  LTO.   Specifying	none  as  an
	   algorithm  disables partitioning and streaming completely.  The default value is balanced. While 1to1 can be used
	   as an workaround for various code ordering issues, the max partitioning is intended for  internal  testing  only.
	   The	value one specifies that exactly one partition should be used while the value none bypasses partitioning and
	   executes the link-time optimization step directly from the WPA phase.

       -flto-incremental=path
	   Enable incremental LTO, with its cache in given  existing  directory.   Can	significantly  shorten	edit-compile
	   cycles with LTO.

	   When	 used  with  LTO (-flto), the output of translation units inside LTO is cached. Cached translation units are
	   likely to be encountered again when recompiling with small code changes, leading to recompile time reduction.

	   Multiple GCC instances can use the same cache in parallel.

       -flto-incremental-cache-size=n
	   Specifies number of cache entries in incremental LTO after which to prune old entries.  This	 is  a	soft  limit,
	   temporarily there may be more entries.

       -flto-compression-level=n
	   This option specifies the level of compression used for intermediate language written to LTO object files, and is
	   only meaningful in conjunction with LTO mode (-flto).  GCC currently supports two LTO compression algorithms. For
	   zstd,  valid	 values	 are 0 (no compression) to 19 (maximum compression), while zlib supports values from 0 to 9.
	   Values outside this range are clamped to either minimum or maximum of the supported values.	If the option is not
	   given, a default balanced compression setting is used.

       -fuse-linker-plugin
	   Enables the use of a linker plugin during link-time optimization.  This option relies on plugin  support  in	 the
	   linker, which is available in gold or in GNU ld 2.21 or newer.

	   This	 option	 enables  the extraction of object files with GIMPLE bytecode out of library archives. This improves
	   the quality of optimization by exposing more code to the link-time optimizer.  This	information  specifies	what
	   symbols  can	 be  accessed  externally  (by	non-LTO	 object	 or during dynamic linking).  Resulting code quality
	   improvements on binaries (and shared libraries that use hidden visibility) are similar to  -fwhole-program.	 See
	   -flto for a description of the effect of this flag and how to use it.

	   This option is enabled by default when LTO support in GCC is enabled and GCC was configured for use with a linker
	   supporting plugins (GNU ld 2.21 or newer or gold).

       -ffat-lto-objects
	   Fat LTO objects are object files that contain both the intermediate language and the object code. This makes them
	   usable  for	both  LTO linking and normal linking. This option is effective only when compiling with -flto and is
	   ignored at link time.

	   -fno-fat-lto-objects improves compilation time over plain LTO, but requires the complete toolchain to be aware of
	   LTO. It requires a linker with linker plugin support for basic functionality.  Additionally, nm,  ar	 and  ranlib
	   need	 to  support linker plugins to allow a full-featured build environment (capable of building static libraries
	   etc).  GCC provides the gcc-ar, gcc-nm, gcc-ranlib wrappers to pass the right options to these  tools.  With	 non
	   fat LTO makefiles need to be modified to use them.

	   Note	  that	 modern	  binutils   provide   plugin  auto-load  mechanism.   Installing  the	linker	plugin	into
	   $libdir/bfd-plugins has the same effect as usage of the command wrappers (gcc-ar, gcc-nm and gcc-ranlib).

	   The default is -fno-fat-lto-objects on targets with linker plugin support.

       -fcompare-elim
	   After register allocation and post-register allocation instruction splitting,  identify  arithmetic	instructions
	   that	 compute processor flags similar to a comparison operation based on that arithmetic.  If possible, eliminate
	   the explicit comparison operation.

	   This pass only applies to certain targets that  cannot  explicitly  represent  the  comparison  operation  before
	   register allocation is complete.

	   Enabled at levels -O1, -O2, -O3, -Os.

       -ffold-mem-offsets
       -fno-fold-mem-offsets
	   Try to eliminate add instructions by folding them in memory loads/stores.

	   Enabled at levels -O2, -O3.

	   NOTE: On Debian/Ubuntu this is disabled by default on m68k-linux-gnu.

       -fcprop-registers
	   After  register allocation and post-register allocation instruction splitting, perform a copy-propagation pass to
	   try to reduce scheduling dependencies and occasionally eliminate the copy.

	   Enabled at levels -O1, -O2, -O3, -Os.

       -fprofile-correction
	   Profiles collected using an instrumented binary for multi-threaded programs may be  inconsistent  due  to  missed
	   counter   updates.  When  this  option  is  specified,  GCC	uses  heuristics  to  correct  or  smooth  out	such
	   inconsistencies. By default, GCC emits an error message when an inconsistent profile is detected.

	   This option is enabled by -fauto-profile.

       -fprofile-partial-training
	   With "-fprofile-use" all portions of programs not executed during train run are optimized aggressively  for	size
	   rather  than	 speed.	  In  some  cases  it  is not practical to train all possible hot paths in the program. (For
	   example, program may contain functions specific for a given hardware and training  may  not	cover  all  hardware
	   configurations  program  is	run  on.)   With  "-fprofile-partial-training"	profile	 feedback is ignored for all
	   functions not executed during the train run, leading them to be  optimized  as  if  they  were  compiled  without
	   profile  feedback.  This  leads  to	better	performance  when  train run is not representative but also leads to
	   significantly bigger code.

       -fprofile-use
       -fprofile-use=path
	   Enable profile feedback-directed optimizations, and the following optimizations,  many  of  which  are  generally
	   profitable only with profile feedback available:

	   -fbranch-probabilities    -fprofile-values	-funroll-loops	 -fpeel-loops	-ftracer   -fvpt  -finline-functions
	   -fipa-cp	-fipa-cp-clone	    -fipa-bit-cp     -fpredictive-commoning	 -fsplit-loops	    -funswitch-loops
	   -fgcse-after-reload		-ftree-loop-vectorize	       -ftree-slp-vectorize	   -fvect-cost-model=dynamic
	   -ftree-loop-distribute-patterns -fprofile-reorder-functions

	   Before you can use this option, you must first generate profiling information.

	   By default, GCC emits an error message if the feedback profiles do not match the source code.  This error can  be
	   turned  into	 a  warning  by	 using -Wno-error=coverage-mismatch.  Note this may result in poorly optimized code.
	   Additionally, by default, GCC also  emits  a	 warning  message  if  the  feedback  profiles	do  not	 exist	(see
	   -Wmissing-profile).

	   If path is specified, GCC looks at the path to find the profile feedback data files. See -fprofile-dir.

       -fauto-profile
       -fauto-profile=path
	   Enable  sampling-based  feedback-directed  optimizations,  and  the	following  optimizations,  many of which are
	   generally profitable only with profile feedback available:

	   -fbranch-probabilities   -fprofile-values  -funroll-loops   -fpeel-loops   -ftracer	  -fvpt	  -finline-functions
	   -fipa-cp	 -fipa-cp-clone	     -fipa-bit-cp     -fpredictive-commoning	  -fsplit-loops	    -funswitch-loops
	   -fgcse-after-reload	       -ftree-loop-vectorize	      -ftree-slp-vectorize	   -fvect-cost-model=dynamic
	   -ftree-loop-distribute-patterns -fprofile-correction

	   path is the name of a file containing AutoFDO profile information.  If omitted, it defaults to fbdata.afdo in the
	   current directory.

	   Producing  an  AutoFDO  profile  data  file	requires  running  your program with the perf utility on a supported
	   GNU/Linux target system.  For more information, see .

	   E.g.

		   perf record -e br_inst_retired:near_taken -b -o perf.data \
		       -- your_program

	   Then use the create_gcov tool to convert the raw profile data to a format that can be used by GCC.  You must also
	   supply the unstripped binary for your program to this tool.	See .

	   E.g.

		   create_gcov --binary=your_program.unstripped --profile=perf.data \
		       --gcov=profile.afdo

       The following options control compiler behavior regarding floating-point arithmetic.  These options trade off between
       speed and correctness.  All must be specifically enabled.

       -fexcess-precision=style
	   This option allows control over excess precision on machines where floating-point operations occur  in  a  format
	   with	 more  precision or range than the IEEE standard and interchange floating-point types.	An example of such a
	   target is x87 floating point on x86 processors, which uses an 80-bit representation	internally  instead  of	 the
	   64-bit  IEEE	 format.   For	most  programs,	 the excess precision is harmless, but some programs may rely on the
	   requirements of the C or C++ language standards for handling IEEE values.

	   By default, -fexcess-precision=fast is in effect; this means that operations	 may  be  carried  out	in  a  wider
	   precision  than  the	 types	specified in the source if that would result in faster code, and it is unpredictable
	   when rounding  to  the  types  specified  in	 the  source  code  takes  place.   When  compiling  C	or  C++,  if
	   -fexcess-precision=standard	is specified then excess precision follows the rules specified in ISO C99 or C++; in
	   particular, both casts and assignments cause values to be rounded to their semantic types (whereas  -ffloat-store
	   only affects assignments).  This option is enabled by default for C or C++ if a strict conformance option such as
	   -std=c99  or	 -std=c++17 is used.  -ffast-math enables -fexcess-precision=fast by default regardless of whether a
	   strict conformance option is	 used.	 If  -fexcess-precision=16  is	specified,  constants  and  the	 results  of
	   expressions with types "_Float16" and "__bf16" are computed without excess precision.

	   -fexcess-precision=standard	is  not implemented for languages other than C or C++.	On the x86, it has no effect
	   if -mfpmath=sse or -mfpmath=sse+387 is specified; in	 the  former  case,  IEEE  semantics  apply  without  excess
	   precision, and in the latter, rounding is unpredictable.

       -ffloat-store
	   Do  not  store  floating-point  variables  in  registers,  and  inhibit other options that might change whether a
	   floating-point value is  taken  from	 a  register  or  memory.   This  option  has  generally  been	subsumed  by
	   -fexcess-precision=standard,	 which	is  more  general.  If you do use -ffloat-store, you may need to modify your
	   program to explicitly store intermediate computations in temporary variables since -ffloat-store handles rounding
	   to IEEE format only on assignments and not casts as -fexcess-precision=standard does.

       -ffast-math
	   Sets	 the   options	 -fno-math-errno,   -funsafe-math-optimizations,   -ffinite-math-only,	 -fno-rounding-math,
	   -fno-signaling-nans, -fcx-limited-range and -fexcess-precision=fast.

	   This option causes the preprocessor macro "__FAST_MATH__" to be defined.

	   This option is not turned on by any -O option besides -Ofast since it can result in incorrect output for programs
	   that	 depend	 on an exact implementation of IEEE or ISO rules/specifications for math functions. It may, however,
	   yield faster code for programs that do not require the guarantees of these specifications.

       -fno-math-errno
	   Do not set "errno" after calling math functions that are executed with a single  instruction,  e.g.,	 "sqrt".   A
	   program  that  relies  on  IEEE  exceptions	for  math  error  handling may want to use this flag for speed while
	   maintaining IEEE arithmetic compatibility.

	   This option is not turned on by any -O option  besides -Ofast  since	 it  can  result  in  incorrect	 output	 for
	   programs  that  depend on an exact implementation of IEEE or ISO rules/specifications for math functions. It may,
	   however, yield faster code for programs that do not require the guarantees of these specifications.

	   The default is -fmath-errno.

	   On Darwin systems, the math library never sets "errno".  There  is  therefore  no  reason  for  the	compiler  to
	   consider the possibility that it might, and -fno-math-errno is the default.

       -funsafe-math-optimizations
	   Allow  optimizations	 for  floating-point arithmetic that (a) assume that arguments and results are valid and (b)
	   may violate IEEE or ANSI standards.	When used at link time, it may	include	 libraries  or	startup	 files	that
	   change the default FPU control word or other similar optimizations.

	   This option is not turned on by any -O option besides -Ofast since it can result in incorrect output for programs
	   that	 depend	 on an exact implementation of IEEE or ISO rules/specifications for math functions. It may, however,
	   yield  faster  code	for  programs  that  do	 not  require  the  guarantees	of  these  specifications.   Enables
	   -fno-signed-zeros, -fno-trapping-math, -fassociative-math and -freciprocal-math.

	   The default is -fno-unsafe-math-optimizations.

       -fassociative-math
	   Allow  re-association  of  operands	in  series  of	floating-point	operations.  This violates the ISO C and C++
	   language standard by possibly changing computation result.  NOTE: re-ordering may change the sign of zero as well
	   as ignore NaNs and inhibit or create underflow or overflow (and thus cannot	be  used  on  code  that  relies  on
	   rounding  behavior  like  "(x + 2**52) - 2**52".  May also reorder floating-point comparisons and thus may not be
	   used	 when  ordered	comparisons  are  required.   This  option  requires   that   both   -fno-signed-zeros	 and
	   -fno-trapping-math  be  in  effect.	 Moreover,  it doesn't make much sense with -frounding-math. For Fortran the
	   option is automatically enabled when both -fno-signed-zeros and -fno-trapping-math are in effect.

	   The default is -fno-associative-math.

       -freciprocal-math
	   Allow the reciprocal of a value to be used instead of dividing by the value if this enables	optimizations.	 For
	   example  "x	/ y" can be replaced with "x * (1/y)", which is useful if "(1/y)" is subject to common subexpression
	   elimination.	 Note that this loses precision and increases the number of flops operating on the value.

	   The default is -fno-reciprocal-math.

       -ffinite-math-only
	   Allow optimizations for floating-point arithmetic that assume that arguments and results are not NaNs or +-Infs.

	   This option is not turned on by any -O option besides -Ofast since it can result in incorrect output for programs
	   that depend on an exact implementation of IEEE or ISO rules/specifications for math functions. It  may,  however,
	   yield faster code for programs that do not require the guarantees of these specifications.

	   The default is -fno-finite-math-only.

       -fno-signed-zeros
	   Allow  optimizations for floating-point arithmetic that ignore the signedness of zero.  IEEE arithmetic specifies
	   the behavior of distinct +0.0 and -0.0 values, which then prohibits simplification of expressions such  as  x+0.0
	   or 0.0*x (even with -ffinite-math-only).  This option implies that the sign of a zero result isn't significant.

	   The default is -fsigned-zeros.

       -fno-trapping-math
	   Compile  code  assuming  that  floating-point operations cannot generate user-visible traps.	 These traps include
	   division by zero, overflow,	underflow,  inexact  result  and  invalid  operation.	This  option  requires	that
	   -fno-signaling-nans	be  in	effect.	  Setting this option may allow faster code if one relies on "non-stop" IEEE
	   arithmetic, for example.

	   This option is not turned on by any -O option besides -Ofast since it can result in incorrect output for programs
	   that depend on an exact implementation of IEEE or ISO rules/specifications for math functions.

	   The default is -ftrapping-math.

	   Future versions of GCC may provide finer control of this setting using C99's "FENV_ACCESS" pragma.  This command-
	   line option will be used along with -frounding-math to specify the default state for "FENV_ACCESS".

       -frounding-math
	   Disable transformations and	optimizations  that  assume  default  floating-point  rounding	behavior  (round-to-
	   nearest).  This option should be specified for programs that change the FP rounding mode dynamically, or that may
	   be  executed	 with  a  non-default  rounding	 mode.	 This  option  disables	 constant  folding of floating-point
	   expressions at compile time (which may be affected by rounding mode)	 and  arithmetic  transformations  that	 are
	   unsafe in the presence of sign-dependent rounding modes.

	   The default is -fno-rounding-math.

	   This	 option	 is experimental and does not currently guarantee to disable all GCC optimizations that are affected
	   by rounding mode.  Future versions of GCC may provide finer control of this	setting	 using	C99's  "FENV_ACCESS"
	   pragma.   This  command-line	 option	 will  be  used	 along with -ftrapping-math to specify the default state for
	   "FENV_ACCESS".

       -fsignaling-nans
	   Compile code assuming that IEEE signaling NaNs may generate user-visible traps during floating-point	 operations.
	   Setting  this option disables optimizations that may change the number of exceptions visible with signaling NaNs.
	   This option implies -ftrapping-math.

	   This option causes the preprocessor macro "__SUPPORT_SNAN__" to be defined.

	   The default is -fno-signaling-nans.

	   This option is experimental and does not currently  guarantee  to  disable  all  GCC	 optimizations	that  affect
	   signaling NaN behavior.

       -fno-fp-int-builtin-inexact
	   Do  not  allow  the	built-in functions "ceil", "floor", "round" and "trunc", and their "float" and "long double"
	   variants, to generate code that raises the "inexact" floating-point exception for noninteger arguments.  ISO	 C99
	   and	C11  allow  these functions to raise the "inexact" exception, but ISO/IEC TS 18661-1:2014, the C bindings to
	   IEEE 754-2008, as integrated into ISO C23, does not allow these functions to do so.

	   The default is -ffp-int-builtin-inexact, allowing the exception to be raised, unless C23 or a later C standard is
	   selected.  This option does nothing unless -ftrapping-math is in effect.

	   Even if -fno-fp-int-builtin-inexact is used, if the functions generate a call to  a	library	 function  then	 the
	   "inexact" exception may be raised if the library implementation does not follow TS 18661.

       -fsingle-precision-constant
	   Treat  floating-point  constants  as	 single	 precision instead of implicitly converting them to double-precision
	   constants.

       -fcx-limited-range
	   When enabled, this option states that a range reduction step is not	needed	when  performing  complex  division.
	   Also,  there	 is no checking whether the result of a complex multiplication or division is "NaN + I*NaN", with an
	   attempt to rescue the situation  in	that  case.   The  default  is	-fno-cx-limited-range,	but  is	 enabled  by
	   -ffast-math.

	   This	 option	 controls  the	default	 setting of the ISO C99 "CX_LIMITED_RANGE" pragma.  Nevertheless, the option
	   applies to all languages.

       -fcx-fortran-rules
	   Complex multiplication and division follow Fortran rules.  Range reduction is done as part of  complex  division,
	   but	there  is  no  checking whether the result of a complex multiplication or division is "NaN + I*NaN", with an
	   attempt to rescue the situation in that case.

	   The default is -fno-cx-fortran-rules.

       The following options control optimizations that may improve performance, but are not  enabled  by  any	-O  options.
       This section includes experimental options that may produce broken code.

       -fbranch-probabilities
	   After   running   a	 program   compiled   with   -fprofile-arcs,   you  can	 compile  it  a	 second	 time  using
	   -fbranch-probabilities, to improve optimizations based on the number of times each  branch  was  taken.   When  a
	   program  compiled  with  -fprofile-arcs exits, it saves arc execution counts to a file called sourcename.gcda for
	   each source file.  The information in this data file is very dependent on the structure of the generated code, so
	   you must use the same source code and the same optimization options for both compilations.  See details about the
	   file naming in -fprofile-arcs.

	   With -fbranch-probabilities, GCC puts a REG_BR_PROB note on each JUMP_INSN and CALL_INSN.  These can be  used  to
	   improve  optimization.  Currently, they are only used in one place: in reorg.cc, instead of guessing which path a
	   branch is most likely to take, the REG_BR_PROB values are used to exactly determine	which  path  is	 taken	more
	   often.

	   Enabled by -fprofile-use and -fauto-profile.

       -fprofile-values
	   If  combined	 with  -fprofile-arcs,	it adds code so that some data about values of expressions in the program is
	   gathered.

	   With -fbranch-probabilities, it reads back the data gathered from profiling values of expressions  for  usage  in
	   optimizations.

	   Enabled by -fprofile-generate, -fprofile-use, and -fauto-profile.

       -fprofile-reorder-functions
	   Function  reordering	 based	on profile instrumentation collects first time of execution of a function and orders
	   these functions in ascending order, aiming to optimize program startup through more	efficient  loading  of	text
	   segments.

	   Enabled with -fprofile-use.

       -fvpt
	   If  combined	 with  -fprofile-arcs,	this  option  instructs the compiler to add code to gather information about
	   values of expressions.

	   With -fbranch-probabilities, it reads back the data gathered and actually performs  the  optimizations  based  on
	   them.   Currently  the  optimizations include specialization of division operations using the knowledge about the
	   value of the denominator.

	   Enabled with -fprofile-use and -fauto-profile.

       -frename-registers
	   Attempt to avoid false dependencies in scheduled code by  making  use  of  registers	 left  over  after  register
	   allocation.	 This  optimization  most  benefits  processors	 with  lots  of	 registers.   Depending on the debug
	   information format adopted by the target, however, it can make debugging impossible, since  variables  no  longer
	   stay in a "home register".

	   Enabled by default with -funroll-loops.

       -fschedule-fusion
	   Performs  a	target	dependent  pass	 over  the instruction stream to schedule instructions of same type together
	   because target machine can execute them more efficiently if they are adjacent to each other	in  the	 instruction
	   flow.

	   Enabled at levels -O2, -O3, -Os.

       -ftracer
	   Perform  tail  duplication  to  enlarge  superblock size.  This transformation simplifies the control flow of the
	   function allowing other optimizations to do a better job.

	   Enabled by -fprofile-use and -fauto-profile.

       -funroll-loops
	   Unroll loops whose number of	 iterations  can  be  determined  at  compile  time  or	 upon  entry  to  the  loop.
	   -funroll-loops  implies  -frerun-cse-after-loop,  -fweb  and	 -frename-registers.  It also turns on complete loop
	   peeling (i.e. complete removal of loops with a small constant number of  iterations).   This	 option	 makes	code
	   larger, and may or may not make it run faster.

	   Enabled by -fprofile-use and -fauto-profile.

       -funroll-all-loops
	   Unroll  all	loops, even if their number of iterations is uncertain when the loop is entered.  This usually makes
	   programs run more slowly.  -funroll-all-loops implies the same options as -funroll-loops.

       -fpeel-loops
	   Peels loops for which there is enough information that they do not roll much (from  profile	feedback  or  static
	   analysis).	It also turns on complete loop peeling (i.e. complete removal of loops with small constant number of
	   iterations).

	   Enabled by -O3, -fprofile-use, and -fauto-profile.

       -fmalloc-dce
	   Control whether "malloc" (and its variants such as "calloc" or "strdup"),  can be  optimized	 away  provided	 its
	   return value is only used as a parameter of "free" call or compared with "NULL".  If -fmalloc-dce=1 is used, only
	   calls to "free" are allowed while with -fmalloc-dce=2 also comparisons with "NULL" pointer are considered safe to
	   remove.

	   The default is -fmalloc-dce=2.  See also -fallocation-dce.

       -fmove-loop-invariants
	   Enables  the	 loop  invariant motion pass in the RTL loop optimizer.	 Enabled at level -O1 and higher, except for
	   -Og.

       -fmove-loop-stores
	   Enables the loop store motion pass in the GIMPLE loop optimizer.  This moves invariant stores to after the end of
	   the loop in exchange for carrying the stored value in a register across the iteration.  Note for this  option  to
	   have an effect -ftree-loop-im has to be enabled as well.  Enabled at level -O1 and higher, except for -Og.

       -fsplit-loops
	   Split a loop into two if it contains a condition that's always true for one side of the iteration space and false
	   for the other.

	   Enabled by -fprofile-use and -fauto-profile.

       -funswitch-loops
	   Move	 branches  with	 loop  invariant  conditions  out  of the loop, with duplicates of the loop on both branches
	   (modified according to result of the condition).

	   Enabled by -fprofile-use and -fauto-profile.

       -fversion-loops-for-strides
	   If a loop iterates over an array with a variable stride, create another version of  the  loop  that	assumes	 the
	   stride is always one.  For example:

		   for (int i = 0; i < n; ++i)
		     x[i * stride] = ...;

	   becomes:

		   if (stride == 1)
		     for (int i = 0; i < n; ++i)
		       x[i] = ...;
		   else
		     for (int i = 0; i < n; ++i)
		       x[i * stride] = ...;

	   This	 is  particularly  useful  for	assumed-shape  arrays  in  Fortran  where  (for	 example)  it  allows better
	   vectorization assuming contiguous accesses.	This flag is enabled by default at  -O3.   It  is  also	 enabled  by
	   -fprofile-use and -fauto-profile.

       -ffunction-sections
       -fdata-sections
	   Place  each	function  or  data  item  into	its  own section in the output file if the target supports arbitrary
	   sections.  The name of the function or the name of the data item determines the  section's  name  in	 the  output
	   file.

	   Use	these  options on systems where the linker can perform optimizations to improve locality of reference in the
	   instruction space.  Most systems using the ELF object format have linkers with such optimizations.  On  AIX,	 the
	   linker rearranges sections (CSECTs) based on the call graph.	 The performance impact varies.

	   Together  with  a  linker  garbage  collection  (linker  --gc-sections  option) these options may lead to smaller
	   statically-linked executables (after stripping).

	   On ELF/DWARF systems these options do not degenerate the quality of the debug information.  There could be issues
	   with other object files/debug info formats.

	   Only use these options when there are significant benefits from doing so.  When you specify	these  options,	 the
	   assembler  and  linker  create larger object and executable files and are also slower.  These options affect code
	   generation.	They prevent optimizations  by	the  compiler  and  assembler  using  relative	locations  inside  a
	   translation unit since the locations are unknown until link time.  An example of such an optimization is relaxing
	   calls to short call instructions.

       -fstdarg-opt
	   Optimize the prologue of variadic argument functions with respect to usage of those arguments.

       -fsection-anchors
	   Try	to  reduce  the	 number	 of symbolic address calculations by using shared "anchor" symbols to address nearby
	   objects.  This transformation can help to reduce the number of GOT entries and GOT accesses on some targets.

	   For example, the implementation of the following function "foo":

		   static int a, b, c;
		   int foo (void) { return a + b + c; }

	   usually calculates the addresses of all three variables,  but  if  you  compile  it	with  -fsection-anchors,  it
	   accesses  the  variables  from  a common anchor point instead.  The effect is similar to the following pseudocode
	   (which isn't valid C):

		   int foo (void)
		   {
		     register int *xr = &x;
		     return xr[&a - &x] + xr[&b - &x] + xr[&c - &x];
		   }

	   Not all targets support this option.

       -fzero-call-used-regs=choice
	   Zero call-used registers at function return to increase program security  by	 either	 mitigating  Return-Oriented
	   Programming (ROP) attacks or preventing information leakage through registers.

	   The possible values of choice are the same as for the "zero_call_used_regs" attribute.  The default is skip.

	   You can control this behavior for a specific function by using the function attribute "zero_call_used_regs".

       --param name=value
	   In  some places, GCC uses various constants to control the amount of optimization that is done.  For example, GCC
	   does not inline functions that contain more than a certain number of instructions.  You can control some of these
	   constants on the command line using the --param option.

	   The names of specific parameters, and the meaning of the values, are tied to the internals of the  compiler,	 and
	   are subject to change without notice in future releases.

	   In order to get the minimal, maximal and default values of a parameter, use the --help=param -Q options.

	   In each case, the value is an integer.  The following choices of name are recognized for all targets:

	   phiopt-factor-max-stmts-live
	       When  factoring	statements out of if/then/else, this is the max # of statements after the defining statement
	       to be allow to extend the lifetime of a name

	   predictable-branch-outcome
	       When branch is predicted to be taken with probability lower than this threshold	(in  percent),	then  it  is
	       considered well predictable.

	   max-rtl-if-conversion-insns
	       RTL  if-conversion  tries  to  remove conditional branches around a block and replace them with conditionally
	       executed instructions.  This parameter gives the maximum number of instructions in a block  which  should  be
	       considered for if-conversion.  The compiler will also use other heuristics to decide whether if-conversion is
	       likely to be profitable.

	   file-cache-files
	       Max  number  of	files in the file cache.  The file cache is used to print source lines in diagnostics and do
	       some source checks like -Wmisleading-indentation.

	   file-cache-lines
	       Max number of lines to index into file cache. When 0 this is automatically sized.  The file cache is used  to
	       print source lines in diagnostics and do some source checks like -Wmisleading-indentation.

	   max-rtl-if-conversion-predictable-cost
	       RTL  if-conversion will try to remove conditional branches around a block and replace them with conditionally
	       executed instructions.  These parameters give the maximum permissible cost for the  sequence  that  would  be
	       generated by if-conversion depending on whether the branch is statically determined to be predictable or not.
	       The  units  for this parameter are the same as those for the GCC internal seq_cost metric.  The compiler will
	       try to provide a reasonable default for this parameter using the BRANCH_COST target macro.

	   max-crossjump-edges
	       The maximum number of incoming edges to consider for cross-jumping.  The algorithm used by -fcrossjumping  is
	       O(N^2)  in  the number of edges incoming to each block.	Increasing values mean more aggressive optimization,
	       making the compilation time increase with probably small improvement in executable size.

	   min-crossjump-insns
	       The minimum number of instructions that must be matched at the end of  two  blocks  before  cross-jumping  is
	       performed  on them.  This value is ignored in the case where all instructions in the block being cross-jumped
	       from are matched.

	   max-grow-copy-bb-insns
	       The maximum code size expansion factor when copying basic  blocks  instead  of  jumping.	  The  expansion  is
	       relative to a jump instruction.

	   max-goto-duplication-insns
	       The  maximum  number  of instructions to duplicate to a block that jumps to a computed goto.  To avoid O(N^2)
	       behavior in a number of passes, GCC factors computed gotos early in the compilation  process,  and  unfactors
	       them  as	 late  as  possible.   Only  computed jumps at the end of a basic blocks with no more than max-goto-
	       duplication-insns are unfactored.

	   max-delay-slot-insn-search
	       The maximum number of instructions to consider when looking for an instruction to fill a delay slot.  If more
	       than this arbitrary number of instructions are searched, the time savings from filling  the  delay  slot	 are
	       minimal, so stop searching.  Increasing values mean more aggressive optimization, making the compilation time
	       increase with probably small improvement in execution time.

	   max-delay-slot-live-search
	       When  trying  to	 fill delay slots, the maximum number of instructions to consider when searching for a block
	       with valid live register information.   Increasing  this	 arbitrarily  chosen  value  means  more  aggressive
	       optimization,  increasing the compilation time.	This parameter should be removed when the delay slot code is
	       rewritten to maintain the control-flow graph.

	   max-gcse-memory
	       The approximate maximum amount of memory in "kB" that can be allocated in order to perform the global  common
	       subexpression  elimination  optimization.  If more memory than specified is required, the optimization is not
	       done.

	   max-gcse-insertion-ratio
	       If the ratio of expression insertions to deletions is larger than this value for any expression, then RTL PRE
	       inserts or removes the expression and thus leaves partially redundant computations in the instruction stream.

	   max-pending-list-length
	       The maximum number of pending dependencies scheduling allows before flushing the current state  and  starting
	       over.  Large functions with few branches or calls can create excessively large lists which needlessly consume
	       memory and resources.

	   max-modulo-backtrack-attempts
	       The  maximum  number  of	 backtrack attempts the scheduler should make when modulo scheduling a loop.  Larger
	       values can exponentially increase compilation time.

	   max-inline-functions-called-once-loop-depth
	       Maximal loop depth of a call considered by inline heuristics that tries to inline all functions called once.

	   max-inline-functions-called-once-insns
	       Maximal estimated size of functions produced while inlining functions called once.

	   max-inline-insns-single
	       Several parameters control the tree inliner used in GCC.	 This number sets the maximum number of instructions
	       (counted in GCC's internal representation) in a single function that the tree inliner considers for inlining.
	       This only affects functions declared inline and methods implemented in a class declaration (C++).

	   max-inline-insns-auto
	       When you use -finline-functions (included in -O3), a lot of functions that would otherwise not be  considered
	       for  inlining  by  the  compiler	 are investigated.  To those functions, a different (more restrictive) limit
	       compared to functions declared inline can be applied (--param max-inline-insns-auto).

	   max-inline-insns-small
	       This is the bound applied to calls that are considered relevant with -finline-small-functions.

	   max-inline-insns-size
	       This is the bound applied to calls that are optimized for size. Small growth may be desirable  to  anticipate
	       optimization opportunities exposed by inlining.

	   uninlined-function-insns
	       Number of instructions accounted by inliner for function overhead such as function prologue and epilogue.

	   uninlined-function-time
	       Extra  time  accounted  by inliner for function overhead such as time needed to execute function prologue and
	       epilogue.

	   inline-heuristics-hint-percent
	       The scale (in percents) applied to inline-insns-single, inline-insns-single-O2, inline-insns-auto when inline
	       heuristics hints that inlining is very profitable (will enable later optimizations).

	   uninlined-thunk-insns
	   uninlined-thunk-time
	       Same as --param uninlined-function-insns and --param uninlined-function-time but applied to function thunks.

	   inline-min-speedup
	       When estimated performance improvement of caller + callee runtime exceeds this threshold	 (in  percent),	 the
	       function	 can  be  inlined regardless of the limit on --param max-inline-insns-single and --param max-inline-
	       insns-auto.

	   large-function-insns
	       The limit specifying really large functions.  For functions larger than this limit after	 inlining,  inlining
	       is  constrained	by  --param  large-function-growth.   This  parameter  is  useful primarily to avoid extreme
	       compilation time caused by non-linear algorithms used by the back end.

	   large-function-growth
	       Specifies maximal growth of large functions caused by inlining in percents.  For example, parameter value 100
	       limits large function growth to 2.0 times the original size.

	   large-unit-insns
	       The limit specifying large translation unit.  Growth caused by inlining of units larger than  this  limit  is
	       limited	by  --param  inline-unit-growth.   For small units this might be too tight.  For example, consider a
	       unit consisting of function A that is inline and B that just calls A three times.  If B is small relative  to
	       A,  the growth of unit is 300\% and yet such inlining is very sane.  For very large units consisting of small
	       inlineable functions, however, the overall unit growth limit is needed to avoid exponential explosion of code
	       size.  Thus for smaller units, the size is increased to	--param	 large-unit-insns  before  applying  --param
	       inline-unit-growth.

	   lazy-modules
	       Maximum number of concurrently open C++ module files when lazy loading.

	   inline-unit-growth
	       Specifies maximal overall growth of the compilation unit caused by inlining.  For example, parameter value 20
	       limits  unit growth to 1.2 times the original size. Cold functions (either marked cold via an attribute or by
	       profile feedback) are not accounted into the unit size.

	   ipa-cp-unit-growth
	       Specifies maximal overall growth of the compilation unit caused by interprocedural constant propagation.	 For
	       example, parameter value 10 limits unit growth to 1.1 times the original size.

	   ipa-cp-large-unit-insns
	       The size of translation unit that IPA-CP pass considers large.

	   large-stack-frame
	       The limit specifying large stack frames.	 While inlining the algorithm is trying to not grow past this  limit
	       too much.

	   large-stack-frame-growth
	       Specifies  maximal growth of large stack frames caused by inlining in percents.	For example, parameter value
	       1000 limits large stack frame growth to 11 times the original size.

	   max-inline-insns-recursive
	   max-inline-insns-recursive-auto
	       Specifies the maximum number of instructions an out-of-line copy of a self-recursive inline function can grow
	       into by performing recursive inlining.

	       --param max-inline-insns-recursive applies to functions declared inline.	 For functions not declared  inline,
	       recursive  inlining  happens  only  when -finline-functions (included in -O3) is enabled; --param max-inline-
	       insns-recursive-auto applies instead.

	   max-inline-recursive-depth
	   max-inline-recursive-depth-auto
	       Specifies the maximum recursion depth used for recursive inlining.

	       --param max-inline-recursive-depth applies to functions declared inline.	 For functions not declared  inline,
	       recursive  inlining  happens  only  when -finline-functions (included in -O3) is enabled; --param max-inline-
	       recursive-depth-auto applies instead.

	   min-inline-recursive-probability
	       Recursive inlining is profitable only for function having deep recursion in average and can hurt for function
	       having little recursion depth by increasing the prologue	 size  or  complexity  of  function  body  to  other
	       optimizers.

	       When  profile  feedback	is available (see -fprofile-generate) the actual recursion depth can be guessed from
	       the probability that function recurses via a given call expression.  This parameter limits inlining  only  to
	       call expressions whose probability exceeds the given threshold (in percents).

	   early-inlining-insns
	       Specify	growth	that  the  early  inliner  can make.  In effect it increases the amount of inlining for code
	       having a large abstraction penalty.

	   max-early-inliner-iterations
	       Limit of iterations of the early inliner.  This basically bounds the number  of	nested	indirect  calls	 the
	       early inliner can resolve.  Deeper chains are still handled by late inlining.

	   comdat-sharing-probability
	       Probability  (in	 percent)  that	 C++  inline  function	with  comdat  visibility  are shared across multiple
	       compilation units.

	   modref-max-bases
	   modref-max-refs
	   modref-max-accesses
	       Specifies the maximal number of base pointers, references and  accesses	stored	for  a	single	function  by
	       mod/ref analysis.

	   modref-max-tests
	       Specifies  the  maxmal  number  of  tests alias oracle can perform to disambiguate memory locations using the
	       mod/ref information.  This parameter ought to be bigger than --param modref-max-bases and --param modref-max-
	       refs.

	   modref-max-depth
	       Specifies the maximum depth of DFS walk used by modref escape analysis.	Setting to 0 disables  the  analysis
	       completely.

	   modref-max-escape-points
	       Specifies the maximum number of escape points tracked by modref per SSA-name.

	   modref-max-adjustments
	       Specifies the maximum number the access range is enlarged during modref dataflow analysis.

	   profile-func-internal-id
	       A parameter to control whether to use function internal id in profile database lookup. If the value is 0, the
	       compiler	 uses an id that is based on function assembler name and filename, which makes old profile data more
	       tolerant to source changes such as function reordering etc.

	   min-vect-loop-bound
	       The minimum number of iterations under which loops are not vectorized when  -ftree-vectorize  is	 used.	 The
	       number of iterations after vectorization needs to be greater than the value specified by this option to allow
	       vectorization.

	   gcse-cost-distance-ratio
	       Scaling	factor in calculation of maximum distance an expression can be moved by GCSE optimizations.  This is
	       currently supported only in the code hoisting pass.  The bigger the ratio, the more aggressive code  hoisting
	       is  with	 simple	 expressions,  i.e.,  the  expressions	that  have  cost  less	than gcse-unrestricted-cost.
	       Specifying 0 disables hoisting of simple expressions.

	   gcse-unrestricted-cost
	       Cost, roughly measured as the cost of a single typical machine instruction, at which  GCSE  optimizations  do
	       not  constrain  the distance an expression can travel.  This is currently supported only in the code hoisting
	       pass.  The lesser the cost, the more aggressive code hoisting is.  Specifying 0	allows	all  expressions  to
	       travel unrestricted distances.

	   max-hoist-depth
	       The depth of search in the dominator tree for expressions to hoist.  This is used to avoid quadratic behavior
	       in  hoisting  algorithm.	  The value of 0 does not limit on the search, but may slow down compilation of huge
	       functions.

	   max-tail-merge-comparisons
	       The maximum amount of similar bbs to compare a bb with.	This is used to avoid  quadratic  behavior  in	tree
	       tail merging.

	   max-tail-merge-iterations
	       The  maximum  amount  of iterations of the pass over the function.  This is used to limit compilation time in
	       tree tail merging.

	   store-merging-allow-unaligned
	       Allow the store merging pass to introduce unaligned stores if it is legal to do so.

	   max-stores-to-merge
	       The maximum number of stores to attempt to merge into wider stores in the store merging pass.

	   max-store-chains-to-track
	       The maximum number of store chains to track at the same time in the attempt to merge them into  wider  stores
	       in the store merging pass.

	   max-stores-to-track
	       The  maximum  number  of stores to track at the same time in the attemt to to merge them into wider stores in
	       the store merging pass.

	   max-unrolled-insns
	       The maximum number of instructions that a loop may have	to  be	unrolled.   If	a  loop	 is  unrolled,	this
	       parameter also determines how many times the loop code is unrolled.

	   max-average-unrolled-insns
	       The  maximum  number  of	 instructions  biased by probabilities of their execution that a loop may have to be
	       unrolled.  If a loop is unrolled, this parameter also determines how many times the loop code is unrolled.

	   max-unroll-times
	       The maximum number of unrollings of a single loop.

	   max-peeled-insns
	       The maximum number of instructions that a loop may have to be peeled.  If a loop is  peeled,  this  parameter
	       also determines how many times the loop code is peeled.

	   max-peel-times
	       The maximum number of peelings of a single loop.

	   max-peel-branches
	       The maximum number of branches on the hot path through the peeled sequence.

	   max-completely-peeled-insns
	       The maximum number of insns of a completely peeled loop.

	   max-completely-peel-times
	       The maximum number of iterations of a loop to be suitable for complete peeling.

	   max-completely-peel-loop-nest-depth
	       The maximum depth of a loop nest suitable for complete peeling.

	   max-unswitch-insns
	       The maximum number of insns of an unswitched loop.

	   max-unswitch-depth
	       The maximum depth of a loop nest to be unswitched.

	   lim-expensive
	       The minimum cost of an expensive expression in the loop invariant motion.

	   min-loop-cond-split-prob
	       When  FDO  profile  information	is  available,	min-loop-cond-split-prob  specifies  minimum  threshold	 for
	       probability of semi-invariant condition statement to trigger loop split.

	   iv-consider-all-candidates-bound
	       Bound on number of candidates for induction variables, below which all candidates are considered for each use
	       in induction variable optimizations.  If there are more candidates than this, only the most relevant ones are
	       considered to avoid quadratic time complexity.

	   iv-max-considered-uses
	       The induction variable optimizations give up on loops that contain more induction variable uses.

	   iv-always-prune-cand-set-bound
	       If the number of candidates in the set is smaller than this value, always try to remove unnecessary ivs	from
	       the set when adding a new one.

	   avg-loop-niter
	       Average number of iterations of a loop.

	   dse-max-object-size
	       Maximum	size  (in bytes) of objects tracked bytewise by dead store elimination.	 Larger values may result in
	       larger compilation times.

	   dse-max-alias-queries-per-store
	       Maximum number of queries into the alias oracle per store.  Larger values result in larger compilation  times
	       and may result in more removed dead stores.

	   scev-max-expr-size
	       Bound on size of expressions used in the scalar evolutions analyzer.  Large expressions slow the analyzer.

	   scev-max-expr-complexity
	       Bound  on  the complexity of the expressions in the scalar evolutions analyzer.	Complex expressions slow the
	       analyzer.

	   max-tree-if-conversion-phi-args
	       Maximum number of arguments in a PHI supported by TREE if conversion unless the	loop  is  marked  with	simd
	       pragma.

	   vect-max-layout-candidates
	       The  maximum  number  of	 possible  vector  layouts (such as permutations) to consider when optimizing to-be-
	       vectorized code.

	   vect-max-version-for-alignment-checks
	       The maximum number of run-time checks that can be performed when doing loop versioning for alignment  in	 the
	       vectorizer.

	   vect-max-version-for-alias-checks
	       The  maximum  number  of	 run-time  checks  that can be performed when doing loop versioning for alias in the
	       vectorizer.

	   vect-max-peeling-for-alignment
	       The maximum number of loop peels to enhance access alignment for vectorizer. Value -1 means no limit.

	   max-iterations-to-track
	       The maximum number of iterations of a loop the brute-force algorithm for analysis of the number of iterations
	       of the loop tries to evaluate.

	   hot-bb-count-fraction
	       The denominator n of fraction 1/n of the maximal execution count of a basic block in the entire program	that
	       a basic block needs to at least have in order to be considered hot.  The default is 10000, which means that a
	       basic  block is considered hot if its execution count is greater than 1/10000 of the maximal execution count.
	       0 means that it is never considered hot.	 Used in non-LTO mode.

	   hot-bb-count-ws-permille
	       The number of most executed permilles, ranging from 0 to 1000,  of  the	profiled  execution  of	 the  entire
	       program	to  which  the	execution count of a basic block must be part of in order to be considered hot.	 The
	       default is 990, which means that a basic block is considered hot if its execution count	contributes  to	 the
	       upper  990  permilles,  or  99.0%, of the profiled execution of the entire program.  0 means that it is never
	       considered hot.	Used in LTO mode.

	   hot-bb-frequency-fraction
	       The denominator n of fraction 1/n of the execution frequency of the entry block of a function  that  a  basic
	       block  of  this	function  needs	 to at least have in order to be considered hot.  The default is 1000, which
	       means that a basic block is considered hot in a function if it is executed more frequently than 1/1000 of the
	       frequency of the entry block of the function.  0 means that it is never considered hot.

	   unlikely-bb-count-fraction
	       The denominator n of fraction 1/n of the number of profiled runs	 of  the  entire  program  below  which	 the
	       execution  count	 of  a	basic block must be in order for the basic block to be considered unlikely executed.
	       The default is 20, which means that a basic block is considered unlikely executed if it is executed in  fewer
	       than 1/20, or 5%, of the runs of the program.  0 means that it is always considered unlikely executed.

	   max-predicted-iterations
	       The  maximum  number  of	 loop  iterations  we  predict statically.  This is useful in cases where a function
	       contains a single loop with known bound and another loop with unknown bound.  The known number of  iterations
	       is  predicted  correctly,  while the unknown number of iterations average to roughly 10.	 This means that the
	       loop without bounds appears artificially cold relative to the other one.

	   builtin-expect-probability
	       Control the probability of the expression having the specified value. This parameter takes a percentage (i.e.
	       0 ... 100) as input.

	   builtin-string-cmp-inline-length
	       The maximum length of a constant string for a builtin string cmp call eligible for inlining.

	   align-threshold
	       Select fraction of the maximal frequency of executions of a basic block in a  function  to  align  the  basic
	       block.

	   align-loop-iterations
	       A loop expected to iterate at least the selected number of iterations is aligned.

	   tracer-dynamic-coverage
	   tracer-dynamic-coverage-feedback
	       This  value  is	used  to  limit	 superblock  formation once the given percentage of executed instructions is
	       covered.	 This limits unnecessary code size expansion.

	       The tracer-dynamic-coverage-feedback parameter is used only when profile feedback  is  available.   The	real
	       profiles (as opposed to statically estimated ones) are much less balanced allowing the threshold to be larger
	       value.

	   tracer-max-code-growth
	       Stop  tail  duplication once code growth has reached given percentage.  This is a rather artificial limit, as
	       most of the duplicates are eliminated later in cross jumping, so it may be set to much higher values than  is
	       the desired code growth.

	   tracer-min-branch-ratio
	       Stop reverse growth when the reverse probability of best edge is less than this threshold (in percent).

	   tracer-min-branch-probability
	   tracer-min-branch-probability-feedback
	       Stop forward growth if the best edge has probability lower than this threshold.

	       Similarly  to tracer-dynamic-coverage two parameters are provided.  tracer-min-branch-probability-feedback is
	       used for compilation with profile feedback and tracer-min-branch-probability compilation without.  The  value
	       for  compilation	 with  profile	feedback  needs	 to  be	 more  conservative (higher) in order to make tracer
	       effective.

	   stack-clash-protection-guard-size
	       Specify the size of the operating system provided stack guard as 2 raised to num bytes.	 Higher	 values	 may
	       reduce  the number of explicit probes, but a value larger than the operating system provided guard will leave
	       code vulnerable to stack clash style attacks.

	   stack-clash-protection-probe-interval
	       Stack clash protection involves probing stack space as it is allocated.	 This  param  controls	the  maximum
	       distance	 between  probes  into	the  stack as 2 raised to num bytes.  Higher values may reduce the number of
	       explicit probes, but a value larger than the operating system provided guard will leave	code  vulnerable  to
	       stack clash style attacks.

	   max-cse-path-length
	       The maximum number of basic blocks on path that CSE considers.

	   max-cse-insns
	       The maximum number of instructions CSE processes before flushing.

	   ggc-min-expand
	       GCC  uses  a  garbage  collector	 to  manage its own memory allocation.	This parameter specifies the minimum
	       percentage by which the garbage collector's heap should be allowed to  expand  between  collections.   Tuning
	       this may improve compilation speed; it has no effect on code generation.

	       The  default  is	 30%  +	 70%  *	 (RAM/1GB)  with  an upper bound of 100% when RAM >= 1GB.  If "getrlimit" is
	       available, the notion of "RAM" is the smallest of actual RAM and "RLIMIT_DATA" or "RLIMIT_AS".  If GCC is not
	       able to calculate RAM on a particular platform, the lower bound of 30% is used.	Setting this  parameter	 and
	       ggc-min-heapsize to zero causes a full collection to occur at every opportunity.	 This is extremely slow, but
	       can be useful for debugging.

	   ggc-min-heapsize
	       Minimum	size  of  the  garbage	collector's  heap  before it begins bothering to collect garbage.  The first
	       collection occurs after the heap expands by ggc-min-expand% beyond ggc-min-heapsize.  Again, tuning this	 may
	       improve compilation speed, and has no effect on code generation.

	       The  default  is	 the  smaller  of  RAM/8,  RLIMIT_RSS,	or  a limit that tries to ensure that RLIMIT_DATA or
	       RLIMIT_AS are not exceeded, but with a lower bound of 4096 (four megabytes) and an upper bound of 131072 (128
	       megabytes).  If GCC is not able to calculate RAM on a particular platform, the lower bound is used.   Setting
	       this parameter very large effectively disables garbage collection.  Setting this parameter and ggc-min-expand
	       to zero causes a full collection to occur at every opportunity.

	   max-reload-search-insns
	       The  maximum  number  of	 instruction reload should look backward for equivalent register.  Increasing values
	       mean more aggressive optimization, making  the  compilation  time  increase  with  probably  slightly  better
	       performance.

	   max-cselib-memory-locations
	       The  maximum  number  of	 memory	 locations  cselib  should  take  into account.	 Increasing values mean more
	       aggressive optimization, making the compilation time increase with probably slightly better performance.

	   max-sched-ready-insns
	       The maximum number of instructions ready to be issued the scheduler should consider at any given time  during
	       the  first  scheduling  pass.   Increasing  values  mean	 more thorough searches, making the compilation time
	       increase with probably little benefit.

	   max-sched-region-blocks
	       The maximum number of blocks in a region to be considered for interblock scheduling.

	   max-pipeline-region-blocks
	       The maximum number of blocks in a region to be considered for pipelining in the selective scheduler.

	   max-sched-region-insns
	       The maximum number of insns in a region to be considered for interblock scheduling.

	   max-pipeline-region-insns
	       The maximum number of insns in a region to be considered for pipelining in the selective scheduler.

	   min-spec-prob
	       The minimum probability (in percents) of reaching a source block for interblock speculative scheduling.

	   max-sched-extend-regions-iters
	       The maximum number of iterations through CFG to extend regions.	A value of 0 disables region extensions.

	   max-sched-insn-conflict-delay
	       The maximum conflict delay for an insn to be considered for speculative motion.

	   sched-spec-prob-cutoff
	       The minimal probability of speculation success (in percents), so that speculative insns are scheduled.

	   sched-state-edge-prob-cutoff
	       The minimum probability an edge must have for the scheduler to save its state across it.

	   sched-mem-true-dep-cost
	       Minimal distance (in CPU cycles) between store and load targeting same memory locations.

	   selsched-max-lookahead
	       The maximum size of the lookahead window of selective scheduling.  It is a  depth  of  search  for  available
	       instructions.

	   selsched-max-sched-times
	       The  maximum number of times that an instruction is scheduled during selective scheduling.  This is the limit
	       on the number of iterations through which the instruction may be pipelined.

	   selsched-insns-to-rename
	       The maximum number of best instructions in the ready list that are considered for renaming in  the  selective
	       scheduler.

	   sms-min-sc
	       The minimum value of stage count that swing modulo scheduler generates.

	   max-last-value-rtl
	       The  maximum  size  measured as number of RTLs that can be recorded in an expression in combiner for a pseudo
	       register as last known value of that register.

	   max-combine-insns
	       The maximum number of instructions the RTL combiner tries to combine.

	   max-combine-search-insns
	       The maximum number of instructions that the RTL combiner searches in order to find the next use	of  a  given
	       register	 definition.   If this limit is reached without finding such a use, the combiner will stop trying to
	       optimize the definition.

	       Currently this limit only applies after certain successful combination attempts, but it could be extended  to
	       other cases in future.

	   integer-share-limit
	       Small  integer constants can use a shared data structure, reducing the compiler's memory usage and increasing
	       its speed.  This sets the maximum value of a shared integer constant.

	   ssp-buffer-size
	       The minimum size of buffers (i.e. arrays) that receive stack smashing protection	 when  -fstack-protector  is
	       used.

	       This  default before Ubuntu 10.10 was "8". Currently it is "4", to increase the number of functions protected
	       by the stack protector.

	   min-size-for-stack-sharing
	       The minimum size of variables taking part in stack slot sharing when not optimizing.

	   max-jump-thread-duplication-stmts
	       Maximum number of statements allowed in a block that needs to be duplicated when threading jumps.

	   max-jump-thread-paths
	       The maximum number of paths to consider when searching for jump threading opportunities.	 When arriving at  a
	       block,  incoming	 edges	are  only  considered if the number of paths to be searched so far multiplied by the
	       number of incoming edges does not exhaust the specified maximum number of paths to consider.

	   max-fields-for-field-sensitive
	       Maximum number of fields in a structure treated in a field sensitive manner during pointer analysis.

	   prefetch-latency
	       Estimate on average number of  instructions  that  are  executed	 before	 prefetch  finishes.   The  distance
	       prefetched  ahead  is  proportional  to	this constant.	Increasing this number may also lead to less streams
	       being prefetched (see simultaneous-prefetches).

	   simultaneous-prefetches
	       Maximum number of prefetches that can run at the same time.

	   l1-cache-line-size
	       The size of cache line in L1 data cache, in bytes.

	   l1-cache-size
	       The size of L1 data cache, in kilobytes.

	   l2-cache-size
	       The size of L2 data cache, in kilobytes.

	   prefetch-dynamic-strides
	       Whether the loop array prefetch pass should issue software prefetch hints for strides that are  non-constant.
	       In  some cases this may be beneficial, though the fact the stride is non-constant may make it hard to predict
	       when there is clear benefit to issuing these hints.

	       Set to 1 if the prefetch hints should be issued for non-constant strides.  Set to 0 if prefetch hints  should
	       be issued only for strides that are known to be constant and below prefetch-minimum-stride.

	   prefetch-minimum-stride
	       Minimum	constant  stride,  in  bytes,  to  start  using prefetch hints for.  If the stride is less than this
	       threshold, prefetch hints will not be issued.

	       This setting is useful for processors that have hardware prefetchers, in which case there  may  be  conflicts
	       between	the  hardware  prefetchers and the software prefetchers.  If the hardware prefetchers have a maximum
	       stride they can handle, it should be used here to improve the use of software prefetchers.

	       A value of -1 means we don't have a threshold and therefore prefetch hints can be  issued  for  any  constant
	       stride.

	       This setting is only useful for strides that are known and constant.

	   destructive-interference-size
	   constructive-interference-size
	       The     values	  for	  the	  C++17	   variables	"std::hardware_destructive_interference_size"	 and
	       "std::hardware_constructive_interference_size".	The destructive interference size is the minimum recommended
	       offset between two independent concurrently-accessed objects;  the  constructive	 interference  size  is	 the
	       maximum	recommended  size  of contiguous memory accessed together.  Typically both will be the size of an L1
	       cache line for the target, in bytes.  For a generic target covering a range of L1 cache line sizes, typically
	       the constructive interference size will be the small end of the range and the destructive size  will  be	 the
	       large end.

	       The  destructive	 interference  size is intended to be used for layout, and thus has ABI impact.	 The default
	       value is not expected to be stable, and on some targets varies with -mtune, so use  of  this  variable  in  a
	       context where ABI stability is important, such as the public interface of a library, is strongly discouraged;
	       if it is used in that context, users can stabilize the value using this option.

	       The constructive interference size is less sensitive, as it is typically only used in a static_assert to make
	       sure that a type fits within a cache line.

	       See also -Winterference-size.

	   loop-interchange-max-num-stmts
	       The maximum number of stmts in a loop to be interchanged.

	   loop-interchange-stride-ratio
	       The minimum ratio between stride of two loops for interchange to be profitable.

	   min-insn-to-prefetch-ratio
	       The  minimum ratio between the number of instructions and the number of prefetches to enable prefetching in a
	       loop.

	   prefetch-min-insn-to-mem-ratio
	       The minimum ratio between the  number  of  instructions	and  the  number  of  memory  references  to  enable
	       prefetching in a loop.

	   use-canonical-types
	       Whether the compiler should use the "canonical" type system.  Should always be 1, which uses a more efficient
	       internal	 mechanism  for	 comparing  types  in C++ and Objective-C++.  However, if bugs in the canonical type
	       system are causing compilation failures, set this value to 0 to disable canonical types.

	   switch-conversion-max-branch-ratio
	       Switch initialization conversion refuses to create arrays that are bigger than  switch-conversion-max-branch-
	       ratio times the number of branches in the switch.

	   switch-lower-slow-alg-max-cases
	       Maximum number of cases for slow switch lowering algorithms to be used.

	   max-partial-antic-length
	       Maximum	length of the partial antic set computed during the tree partial redundancy elimination optimization
	       (-ftree-pre) when optimizing at -O3 and above.  For some sorts of source code the enhanced partial redundancy
	       elimination optimization can run away, consuming all of the memory  available  on  the  host  machine.	This
	       parameter  sets	a  limit  on  the length of the sets that are computed, which prevents the runaway behavior.
	       Setting a value of 0 for this parameter allows an unlimited set length.

	   rpo-vn-max-loop-depth
	       Maximum loop depth that is value-numbered optimistically.  When the limit hits the innermost rpo-vn-max-loop-
	       depth loops and the outermost loop in the loop nest are value-numbered optimistically and the remaining	ones
	       not.

	   sccvn-max-alias-queries-per-access
	       Maximum	number	of  alias-oracle  queries we perform when looking for redundancies for loads and stores.  If
	       this limit is hit the search is aborted and the load or store is not considered	redundant.   The  number  of
	       queries is algorithmically limited to the number of stores on all paths from the load to the function entry.

	   ira-max-loops-num
	       IRA uses regional register allocation by default.  If a function contains more loops than the number given by
	       this parameter, only at most the given number of the most frequently-executed loops form regions for regional
	       register allocation.

	   ira-max-conflict-table-size
	       Although	 IRA  uses  a  sophisticated  algorithm	 to compress the conflict table, the table can still require
	       excessive amounts of memory for huge functions.	If the conflict table for a function could be more than	 the
	       size  in MB given by this parameter, the register allocator instead uses a faster, simpler, and lower-quality
	       algorithm that does not require building a pseudo-register conflict table.

	   ira-loop-reserved-regs
	       IRA can be used to evaluate more accurate register pressure in loops for decisions to  move  loop  invariants
	       (see  -O3).   The  number of available registers reserved for some other purposes is given by this parameter.
	       Default of the parameter is the best found from numerous experiments.

	   ira-consider-dup-in-all-alts
	       Make IRA to consider matching constraint (duplicated operand number) heavily in	all  available	alternatives
	       for  preferred register class.  If it is set as zero, it means IRA only respects the matching constraint when
	       it's in the only available alternative with an appropriate register class.   Otherwise,	it  means  IRA	will
	       check  all  available  alternatives  for	 preferred  register  class even if it has found some choice with an
	       appropriate register class and respect the found qualified matching constraint.

	   ira-simple-lra-insn-threshold
	       Approximate function insn number in 1K units triggering simple local RA.

	   lra-inheritance-ebb-probability-cutoff
	       LRA tries to  reuse  values  reloaded  in  registers  in	 subsequent  insns.   This  optimization  is  called
	       inheritance.   EBB is used as a region to do this optimization.	The parameter defines a minimal fall-through
	       edge probability in percentage used to add BB to inheritance EBB in LRA.	 The default value was	chosen	from
	       numerous runs of SPEC2000 on x86-64.

	   loop-invariant-max-bbs-in-loop
	       Loop  invariant	motion	can be very expensive, both in compilation time and in amount of needed compile-time
	       memory, with very large loops.  Loops with more basic blocks than this parameter won't  have  loop  invariant
	       motion optimization performed on them.

	   loop-max-datarefs-for-datadeps
	       Building	 data  dependencies  is	 expensive  for	 very large loops.  This parameter limits the number of data
	       references in loops that are considered for data dependence analysis.  These large loops are  no	 handled  by
	       the optimizations using loop data dependencies.

	   max-vartrack-size
	       Sets  a maximum number of hash table slots to use during variable tracking dataflow analysis of any function.
	       If this limit is exceeded with variable tracking at  assignments	 enabled,  analysis  for  that	function  is
	       retried	without it, after removing all debug insns from the function.  If the limit is exceeded even without
	       debug insns, var tracking analysis is completely disabled for the function.  Setting the	 parameter  to	zero
	       makes it unlimited.

	   max-vartrack-expr-depth
	       Sets a maximum number of recursion levels when attempting to map variable names or debug temporaries to value
	       expressions.   This  trades  compilation	 time  for more complete debug information.  If this is set too low,
	       value expressions that are available and could be represented in debug information may end up not being used;
	       setting this higher may enable the compiler to find more complex debug  expressions,  but  compile  time	 and
	       memory use may grow.

	   max-debug-marker-count
	       Sets  a	threshold  on the number of debug markers (e.g. begin stmt markers) to avoid complexity explosion at
	       inlining or expanding to RTL.  If a function has more such gimple stmts than the set limit, such	 stmts	will
	       be dropped from the inlined copy of a function, and from its RTL expansion.

	   min-nondebug-insn-uid
	       Use  uids  starting  at	this  parameter	 for  nondebug	insns.	 The  range  below the parameter is reserved
	       exclusively for debug insns created by -fvar-tracking-assignments, but debug insns may get  (non-overlapping)
	       uids above it if the reserved range is exhausted.

	   ipa-sra-deref-prob-threshold
	       IPA-SRA	replaces  a  pointer  which  is	 known	not  be	 NULL  with one or more new parameters only when the
	       probability (in percent, relative to function entry) of it being dereferenced is higher than this parameter.

	   ipa-sra-ptr-growth-factor
	       IPA-SRA replaces a pointer to an aggregate with one or more new parameters only when their cumulative size is
	       less or equal to ipa-sra-ptr-growth-factor times the size of the original pointer parameter.

	   ipa-sra-ptrwrap-growth-factor
	       Additional maximum allowed growth of total size of new parameters that  ipa-sra	replaces  a  pointer  to  an
	       aggregate  with, if it points to a local variable that the caller only writes to and passes it as an argument
	       to other functions.

	   ipa-sra-max-replacements
	       Maximum pieces of an aggregate that IPA-SRA tracks.  As a consequence, it  is  also  the	 maximum  number  of
	       replacements of a formal parameter.

	   sra-max-scalarization-size-Ospeed
	   sra-max-scalarization-size-Osize
	       The  two	 Scalar	 Reduction  of Aggregates passes (SRA and IPA-SRA) aim to replace scalar parts of aggregates
	       with uses of independent scalar variables.  These parameters control the maximum size, in storage  units,  of
	       aggregate which is considered for replacement when compiling for speed (sra-max-scalarization-size-Ospeed) or
	       size (sra-max-scalarization-size-Osize) respectively.

	   sra-max-propagations
	       The  maximum  number  of	 artificial accesses that Scalar Replacement of Aggregates (SRA) will track, per one
	       local variable, in order to facilitate copy propagation.

	   tm-max-aggregate-size
	       When making copies of thread-local variables in a transaction, this parameter specifies	the  size  in  bytes
	       after  which  variables	are saved with the logging functions as opposed to save/restore code sequence pairs.
	       This option only applies when using -fgnu-tm.

	   graphite-max-nb-scop-params
	       To avoid exponential effects in the Graphite loop transforms, the number of parameters in  a  Static  Control
	       Part (SCoP) is bounded.	A value of zero can be used to lift the bound.	A variable whose value is unknown at
	       compilation time and defined outside a SCoP is a parameter of the SCoP.

	   hardcfr-max-blocks
	       Disable	-fharden-control-flow-redundancy  for  functions  with	a larger number of blocks than the specified
	       value.  Zero removes any limit.

	   hardcfr-max-inline-blocks
	       Force -fharden-control-flow-redundancy to use out-of-line checking for functions	 with  a  larger  number  of
	       basic blocks than the specified value.

	   loop-block-tile-size
	       Loop  blocking  or  strip  mining transforms, enabled with -floop-block or -floop-strip-mine, strip mine each
	       loop in the loop nest by a given number of iterations.  The strip length can be changed using the loop-block-
	       tile-size parameter.

	   ipa-jump-function-lookups
	       Specifies number of statements visited during jump function offset discovery.

	   ipa-cp-value-list-size
	       IPA-CP attempts to track all possible values and types passed to a function's parameter in order to propagate
	       them and perform devirtualization.  ipa-cp-value-list-size is the maximum  number  of  values  and  types  it
	       stores per one formal parameter of a function.

	   ipa-cp-eval-threshold
	       IPA-CP  calculates its own score of cloning profitability heuristics and performs those cloning opportunities
	       with scores that exceed ipa-cp-eval-threshold.

	   ipa-cp-max-recursive-depth
	       Maximum depth of recursive cloning for self-recursive function.

	   ipa-cp-min-recursive-probability
	       Recursive cloning only when the probability of call being executed exceeds the parameter.

	   ipa-cp-profile-count-base
	       When using -fprofile-use option, IPA-CP will consider the measured execution count of a call  graph  edge  at
	       this percentage position in their histogram as the basis for its heuristics calculation.

	   ipa-cp-recursive-freq-factor
	       The number of times interprocedural copy propagation expects recursive functions to call themselves.

	   ipa-cp-recursion-penalty
	       Percentage penalty the recursive functions will receive when they are evaluated for cloning.

	   ipa-cp-single-call-penalty
	       Percentage  penalty  functions  containing  a  single  call  to	another	 function will receive when they are
	       evaluated for cloning.

	   ipa-max-agg-items
	       IPA-CP is also capable to propagate a number of scalar  values  passed  in  an  aggregate.  ipa-max-agg-items
	       controls the maximum number of such values per one parameter.

	   ipa-cp-loop-hint-bonus
	       When  IPA-CP determines that a cloning candidate would make the number of iterations of a loop known, it adds
	       a bonus of ipa-cp-loop-hint-bonus to the profitability score of the candidate.

	   ipa-max-loop-predicates
	       The maximum number of different predicates IPA will use to describe when	 loops	in  a  function	 have  known
	       properties.

	   ipa-max-aa-steps
	       During  its analysis of function bodies, IPA-CP employs alias analysis in order to track values pointed to by
	       function parameters.  In order not spend too much time analyzing huge functions, it gives up and consider all
	       memory clobbered after examining ipa-max-aa-steps statements modifying memory.

	   ipa-max-switch-predicate-bounds
	       Maximal number of boundary endpoints of case ranges of switch statement.	 For switch  exceeding	this  limit,
	       IPA-CP will not construct cloning cost predicate, which is used to estimate cloning benefit, for default case
	       of the switch statement.

	   ipa-max-param-expr-ops
	       IPA-CP  will  analyze  conditional  statement that references some function parameter to estimate benefit for
	       cloning upon certain constant value.  But if number of operations in a parameter expression exceeds  ipa-max-
	       param-expr-ops, the expression is treated as complicated one, and is not handled by IPA analysis.

	   lto-partitions
	       Specify	desired	 number	 of  partitions	 produced during WHOPR compilation.  The number of partitions should
	       exceed the number of CPUs used for compilation.

	   lto-min-partition
	       Size of minimal partition for WHOPR (in estimated instructions).	 This prevents expenses	 of  splitting	very
	       small programs into too many partitions.

	   lto-max-partition
	       Size  of	 max partition for WHOPR (in estimated instructions).  to provide an upper bound for individual size
	       of partition.  Meant to be used only with balanced partitioning.

	   lto-partition-locality-frequency-cutoff
	       The denominator n of fraction 1/n of the execution frequency of callee to be cloned for a particular  caller.
	       Special value of 0 dictates to always clone without a cut-off.

	   lto-partition-locality-size-cutoff
	       Size cut-off for callee including inlined calls to be cloned for a particular caller.

	   lto-max-locality-partition
	       Maximal	size  of  a  locality  partition for LTO (in estimated instructions).  Value of 0 results in default
	       value being used.

	   lto-max-streaming-parallelism
	       Maximal number of parallel processes used for LTO streaming.

	   cxx-max-namespaces-for-diagnostic-help
	       The maximum number of namespaces to consult for suggestions when C++ name lookup fails for an identifier.

	   sink-frequency-threshold
	       The maximum relative execution frequency (in percents) of the target block relative to a statement's original
	       block to allow statement sinking of a statement.	 Larger numbers result in more aggressive statement sinking.
	       A small positive adjustment is applied for statements with memory operands as those are even more  profitable
	       so sink.

	   max-stores-to-sink
	       The  maximum  number  of	 conditional  store  pairs  that  can  be  sunk.   Set	to 0 if either vectorization
	       (-ftree-vectorize) or if-conversion (-ftree-loop-if-convert) is disabled.

	   case-values-threshold
	       The smallest number of different values for which it is best to	use  a	jump-table  instead  of	 a  tree  of
	       conditional branches.  If the value is 0, use the default for the machine.

	   jump-table-max-growth-ratio-for-size
	       The maximum code size growth ratio when expanding into a jump table (in percent).  The parameter is used when
	       optimizing for size.

	   jump-table-max-growth-ratio-for-speed
	       The maximum code size growth ratio when expanding into a jump table (in percent).  The parameter is used when
	       optimizing for speed.

	   tree-reassoc-width
	       Set  the	 maximum  number of instructions executed in parallel in reassociated tree. This parameter overrides
	       target dependent heuristics used by default if has non zero value.

	   sched-pressure-algorithm
	       Choose between  the  two	 available  implementations  of	 -fsched-pressure.   Algorithm	1  is  the  original
	       implementation and is the more likely to prevent instructions from being reordered.  Algorithm 2 was designed
	       to  be  a  compromise  between  the  relatively	conservative  approach	taken  by algorithm 1 and the rather
	       aggressive approach taken by the default scheduler.  It relies more heavily on having a regular register file
	       and accurate register pressure classes.	See haifa-sched.cc in the GCC sources for more details.

	       The default choice depends on the target.

	   max-slsr-cand-scan
	       Set the maximum number of existing candidates that are considered when seeking a basis for  a  new  straight-
	       line strength reduction candidate.

	   asan-globals
	       Enable  buffer  overflow	 detection for global objects.	This kind of protection is enabled by default if you
	       are using -fsanitize=address option.  To disable global objects protection use --param asan-globals=0.

	   asan-stack
	       Enable buffer overflow detection for stack objects.  This kind of protection is enabled by default when using
	       -fsanitize=address.  To disable stack protection use --param asan-stack=0 option.

	   asan-instrument-reads
	       Enable buffer overflow detection for memory reads.  This kind of protection is enabled by default when  using
	       -fsanitize=address.  To disable memory reads protection use --param asan-instrument-reads=0.

	   asan-instrument-writes
	       Enable buffer overflow detection for memory writes.  This kind of protection is enabled by default when using
	       -fsanitize=address.  To disable memory writes protection use --param asan-instrument-writes=0 option.

	   asan-memintrin
	       Enable  detection  for  built-in	 functions.   This  kind  of  protection  is  enabled  by default when using
	       -fsanitize=address.  To disable built-in functions protection use --param asan-memintrin=0.

	   asan-use-after-return
	       Enable detection of use-after-return.  This  kind  of  protection  is  enabled  by  default  when  using	 the
	       -fsanitize=address option.  To disable it use --param asan-use-after-return=0.

	       Note:  By  default the check is disabled at run time.  To enable it, add "detect_stack_use_after_return=1" to
	       the environment variable ASAN_OPTIONS.

	   asan-instrumentation-with-call-threshold
	       If number of memory accesses in function being instrumented is greater or equal to this number, use callbacks
	       instead	   of	  inline     checks.	  E.g.	   to	  disable     inline	  code	    use	     --param
	       asan-instrumentation-with-call-threshold=0.

	   asan-kernel-mem-intrinsic-prefix
	       If   nonzero,   prefix	calls	to   "memcpy",	 "memset"  and	"memmove"  with	 __asan_  or  __hwasan_	 for
	       -fsanitize=kernel-address or -fsanitize=kernel-hwaddress, respectively.

	   hwasan-instrument-stack
	       Enable hwasan instrumentation of statically sized stack-allocated variables.  This kind of instrumentation is
	       enabled	 by   default	when   using   -fsanitize=hwaddress   and   disabled   by   default    when    using
	       -fsanitize=kernel-hwaddress.   To disable stack instrumentation use --param hwasan-instrument-stack=0, and to
	       enable it use --param hwasan-instrument-stack=1.

	   hwasan-random-frame-tag
	       When using stack instrumentation, decide tags for stack variables using a deterministic sequence beginning at
	       a random tag for each frame.  With this parameter unset tags are chosen using the same sequence but beginning
	       from 1.	This is enabled by default for -fsanitize=hwaddress and unavailable for -fsanitize=kernel-hwaddress.
	       To disable it use --param hwasan-random-frame-tag=0.

	   hwasan-instrument-allocas
	       Enable hwasan instrumentation of dynamically sized stack-allocated variables.  This kind	 of  instrumentation
	       is   enabled   by   default   when   using   -fsanitize=hwaddress   and	 disabled   by	default	 when  using
	       -fsanitize=kernel-hwaddress.    To    disable	instrumentation	   of	 such	 variables    use    --param
	       hwasan-instrument-allocas=0, and to enable it use --param hwasan-instrument-allocas=1.

	   hwasan-instrument-reads
	       Enable	hwasan	checks	on  memory  reads.   Instrumentation  of  reads	 is  enabled  by  default  for	both
	       -fsanitize=hwaddress  and  -fsanitize=kernel-hwaddress.	 To  disable  checking	memory	reads  use   --param
	       hwasan-instrument-reads=0.

	   hwasan-instrument-writes
	       Enable  hwasan  checks  on  memory  writes.   Instrumentation  of  writes  is  enabled  by  default  for both
	       -fsanitize=hwaddress  and  -fsanitize=kernel-hwaddress.	 To  disable  checking	memory	writes	use  --param
	       hwasan-instrument-writes=0.

	   hwasan-instrument-mem-intrinsics
	       Enable hwasan instrumentation of builtin functions.  Instrumentation of these builtin functions is enabled by
	       default for both -fsanitize=hwaddress and -fsanitize=kernel-hwaddress.  To disable instrumentation of builtin
	       functions use --param hwasan-instrument-mem-intrinsics=0.

	   use-after-scope-direct-emission-threshold
	       If  the	size  of a local variable in bytes is smaller or equal to this number, directly poison (or unpoison)
	       shadow memory instead of using run-time callbacks.

	   tsan-distinguish-volatile
	       Emit special instrumentation for accesses to volatiles.

	   tsan-instrument-func-entry-exit
	       Emit instrumentation calls to __tsan_func_entry() and __tsan_func_exit().

	   max-fsm-thread-path-insns
	       Maximum number of instructions to copy when duplicating blocks on a finite state automaton jump thread path.

	   threader-debug
	       threader-debug=[none|all] Enables verbose dumping of the threader solver.

	   parloops-chunk-size
	       Chunk size of omp schedule for loops parallelized by parloops.

	   parloops-schedule
	       Schedule type of omp schedule for loops parallelized by parloops (static, dynamic, guided, auto, runtime).

	   parloops-min-per-thread
	       The minimum number of iterations per thread of an innermost parallelized	 loop  for  which  the	parallelized
	       variant is preferred over the single threaded one.  Note that for a parallelized loop nest the minimum number
	       of iterations of the outermost loop per thread is two.

	   max-ssa-name-query-depth
	       Maximum	depth of recursion when querying properties of SSA names in things like fold routines.	One level of
	       recursion corresponds to following a use-def chain.

	   max-speculative-devirt-maydefs
	       The maximum number of may-defs we analyze when looking for a must-def  specifying  the  dynamic	type  of  an
	       object that invokes a virtual call we may be able to devirtualize speculatively.

	   ranger-debug
	       Specifies the type of debug output to be issued for ranges.

	   unroll-jam-min-percent
	       The minimum percentage of memory references that must be optimized away for the unroll-and-jam transformation
	       to be considered profitable.

	   unroll-jam-max-unroll
	       The maximum number of times the outer loop should be unrolled by the unroll-and-jam transformation.

	   max-rtl-if-conversion-unpredictable-cost
	       Maximum	permissible cost for the sequence that would be generated by the RTL if-conversion pass for a branch
	       that is considered unpredictable.

	   max-variable-expansions-in-unroller
	       If -fvariable-expansion-in-unroller is used, the maximum number of times that an individual variable will  be
	       expanded during loop unrolling.

	   partial-inlining-entry-probability
	       Maximum probability of the entry BB of split region (in percent relative to entry BB of the function) to make
	       partial inlining happen.

	   max-tracked-strlens
	       Maximum number of strings for which strlen optimization pass will track string lengths.

	   gcse-after-reload-partial-fraction
	       The threshold ratio for performing partial redundancy elimination after reload.

	   gcse-after-reload-critical-fraction
	       The  threshold  ratio  of  critical edges execution count that permit performing redundancy elimination after
	       reload.

	   max-loop-header-insns
	       The maximum number of insns in loop header duplicated by the copy loop headers pass.

	   vect-epilogues-nomask
	       Enable loop epilogue vectorization using smaller vector size.

	   vect-partial-vector-usage
	       Controls when the loop vectorizer considers using partial vector	 loads	and  stores  as	 an  alternative  to
	       falling	back  to  scalar  code.	  0 stops the vectorizer from ever using partial vector loads and stores.  1
	       allows partial vector loads and stores if vectorization removes the need for the code to iterate.   2  allows
	       partial	vector	loads  and  stores  in	all loops.  The parameter only has an effect on targets that support
	       partial vector loads and stores.

	   vect-inner-loop-cost-factor
	       The maximum factor which the loop vectorizer applies to the cost of statements in an inner loop	relative  to
	       the  loop  being	 vectorized.  The factor applied is the maximum of the estimated number of iterations of the
	       inner loop and this parameter.  The default value of this parameter is 50.

	   vect-induction-float
	       Enable loop vectorization of floating point inductions.

	   vect-force-slp
	       Force the use of SLP when vectorizing, fail if not possible.

	   vrp-block-limit
	       Maximum number of basic blocks before VRP switches to a lower memory algorithm.

	   vrp-sparse-threshold
	       Maximum number of basic blocks before VRP uses a sparse bitmap cache.

	   vrp-switch-limit
	       Maximum number of outgoing edges in a switch before VRP will not process it.

	   vrp-vector-threshold
	       Maximum number of basic blocks for VRP to use a basic cache vector.

	   avoid-fma-max-bits
	       Maximum number of bits for which we avoid creating FMAs.

	   fully-pipelined-fma
	       Whether the target fully pipelines FMA instructions.  If non-zero, reassociation	 considers  the	 benefit  of
	       parallelizing  FMA's multiplication part and addition part, assuming FMUL and FMA use the same units that can
	       also do FADD.

	   sms-loop-average-count-threshold
	       A threshold on the average loop count considered by the swing modulo scheduler.

	   sms-dfa-history
	       The number of cycles the swing modulo scheduler considers when checking conflicts using DFA.

	   graphite-allow-codegen-errors
	       Whether codegen errors should be ICEs when -fchecking.

	   sms-max-ii-factor
	       A factor for tuning the upper bound that swing modulo scheduler uses for scheduling a loop.

	   lra-max-considered-reload-pseudos
	       The max number of reload pseudos which are considered during spilling a non-reload pseudo.

	   max-pow-sqrt-depth
	       Maximum depth of sqrt chains to use when synthesizing exponentiation by a real constant.

	   max-dse-active-local-stores
	       Maximum number of active local stores in RTL dead store elimination.

	   asan-instrument-allocas
	       Enable asan allocas/VLAs protection.

	   max-iterations-computation-cost
	       Bound on the cost of an expression to compute the number of iterations.

	   max-isl-operations
	       Maximum number of isl operations, 0 means unlimited.

	   graphite-max-arrays-per-scop
	       Maximum number of arrays per scop.

	   max-vartrack-reverse-op-size
	       Max. size of loc list for which reverse ops should be added.

	   fsm-scale-path-stmts
	       Scale factor to apply to the number of statements in a threading path crossing a loop backedge when comparing
	       to --param=max-jump-thread-duplication-stmts.

	   uninit-control-dep-attempts
	       Maximum number of nested calls to search for control dependencies during uninitialized variable analysis.

	   uninit-max-chain-len
	       Maximum number of predicates anded for each predicate ored in the normalized predicate chain.

	   uninit-max-num-chains
	       Maximum number of predicates ored in the normalized predicate chain.

	   uninit-max-prune-work
	       Maximum amount of work done to prune paths where the variable is always initialized.

	   sched-autopref-queue-depth
	       Hardware autoprefetcher scheduler model control flag.  Number of lookahead cycles the model looks into; at  '
	       ' only enable instruction sorting heuristic.

	   loop-versioning-max-inner-insns
	       The  maximum  number of instructions that an inner loop can have before the loop versioning pass considers it
	       too big to copy.

	   loop-versioning-max-outer-insns
	       The maximum number of instructions that an outer loop can have before the loop versioning pass  considers  it
	       too big to copy, discounting any instructions in inner loops that directly benefit from versioning.

	   ssa-name-def-chain-limit
	       The  maximum  number  of	 SSA_NAME  assignments to follow in determining a property of a variable such as its
	       value.  This limits the number of  iterations  or  recursive  calls  GCC	 performs  when	 optimizing  certain
	       statements or when determining their validity prior to issuing diagnostics.

	   store-merging-max-size
	       Maximum size of a single store merging region in bytes.

	   store-forwarding-max-distance
	       Maximum	number	of  instruction	 distance that a small store forwarded to a larger load may stall. Value '0'
	       disables the cost checks for the avoid-store-forwarding pass.

	   hash-table-verification-limit
	       The number of elements for which hash table verification is done for each searched element.

	   max-find-base-term-values
	       Maximum number of VALUEs handled during a single find_base_term call.

	   analyzer-max-enodes-per-program-point
	       The maximum number of exploded nodes per program point within the analyzer, before  terminating	analysis  of
	       that point.

	   analyzer-max-constraints
	       The maximum number of constraints per state.

	   analyzer-min-snodes-for-call-summary
	       The  minimum  number  of supernodes within a function for the analyzer to consider summarizing its effects at
	       call sites.

	   analyzer-max-enodes-for-full-dump
	       The maximum depth of exploded nodes that should appear in a dot dump  before  switching	to  a  less  verbose
	       format.

	   analyzer-max-recursion-depth
	       The  maximum  number  of	 times a callsite can appear in a call stack within the analyzer, before terminating
	       analysis of a call that would recurse deeper.

	   analyzer-max-svalue-depth
	       The maximum depth of a symbolic value, before approximating the value as unknown.

	   analyzer-max-infeasible-edges
	       The maximum number of infeasible edges to reject before declaring a diagnostic as infeasible.

	   gimple-fe-computed-hot-bb-threshold
	       The number of executions of a basic block which is considered hot.  The parameter is used only in GIMPLE FE.

	   analyzer-bb-explosion-factor
	       The maximum number of 'after supernode' exploded nodes within the analyzer per supernode, before	 terminating
	       analysis.

	   analyzer-text-art-string-ellipsis-threshold
	       The number of bytes at which to ellipsize string literals in analyzer text art diagrams.

	   analyzer-text-art-ideal-canvas-width
	       The ideal width in characters of text art diagrams generated by the analyzer.

	   analyzer-text-art-string-ellipsis-head-len
	       The number of literal bytes to show at the head of a string literal in text art when ellipsizing it.

	   analyzer-text-art-string-ellipsis-tail-len
	       The number of literal bytes to show at the tail of a string literal in text art when ellipsizing it.

	   ranger-logical-depth
	       Maximum depth of logical expression evaluation ranger will look through when evaluating outgoing edge ranges.

	   ranger-recompute-depth
	       Maximum depth of instruction chains to consider for recomputation in the outgoing range calculator.

	   relation-block-limit
	       Maximum number of relations the oracle will register in a basic block.

	   transitive-relations-work-bound
	       Work bound when discovering transitive relations from existing relations.

	   min-pagesize
	       Minimum page size for warning and early break vectorization purposes.

	   openacc-kernels
	       Specify	mode  of  OpenACC  `kernels'  constructs  handling.  With --param=openacc-kernels=decompose, OpenACC
	       `kernels' constructs are decomposed  into  parts,  a  sequence  of  compute  constructs,	 each  then  handled
	       individually.  This is work in progress.	 With --param=openacc-kernels=parloops, OpenACC `kernels' constructs
	       are handled by the parloops pass, en bloc.  This is the current default.

	   openacc-privatization
	       Control	 whether   the	 -fopt-info-omp-note  and  applicable  -fdump-tree-*-details  options  emit  OpenACC
	       privatization diagnostics.  With --param=openacc-privatization=quiet, don't diagnose.  This  is	the  current
	       default.	 With --param=openacc-privatization=noisy, do diagnose.

	   cycle-accurate-model
	       Specifies  whether  GCC should assume that the scheduling description is mostly a cycle-accurate model of the
	       target processor the code is intended to run on, in the absence of cache	 misses.   Nonzero  means  that	 the
	       selected	 scheduling model is accurate and likely describes an in-order processor, and that scheduling should
	       aggressively spill to try and fill any pipeline bubbles.	 This  is  the	current	 default.   Zero  means	 the
	       scheduling  description	might not be available/accurate or perhaps not applicable at all, such as for modern
	       out-of-order processors.

	   The following choices of name are available on AArch64 targets:

	   aarch64-vect-compare-costs
	       When vectorizing, consider using multiple different approaches and use the cost model to choose the  cheapest
	       one.  This includes:

	       *   Trying both SVE and Advanced SIMD, when SVE is available.

	       *   Trying  to  use  64-bit  Advanced  SIMD vectors for the smallest data elements, rather than using 128-bit
		   vectors for everything.

	       *   Trying to use "unpacked" SVE vectors for smaller elements.  This includes  storing  smaller	elements  in
		   larger containers and accessing elements with extending loads and truncating stores.

	   aarch64-float-recp-precision
	       The  number of Newton iterations for calculating the reciprocal for float type.	The precision of division is
	       proportional to this param when division approximation is enabled.  The default value is 1.

	   aarch64-double-recp-precision
	       The number of Newton iterations for calculating the reciprocal for double type.	The precision of division is
	       proportional to this param when division approximation is enabled.  The default value is 2.

	   aarch64-autovec-preference
	       Force an ISA selection strategy for auto-vectorization.

	       default
		   Use the default heuristics.

	       asimd-only
		   Use only Advanced SIMD for auto-vectorization.

	       sve-only
		   Use only SVE for auto-vectorization.

	       prefer-asimd
		   Use both Advanced SIMD and SVE.  Prefer Advanced SIMD when the costs are deemed equal.

	       prefer-sve
		   Use both Advanced SIMD and SVE.  Prefer SVE when the costs are deemed equal.

	   aarch64-ldp-policy
	       Fine-grained policy for load pairs.  With --param=aarch64-ldp-policy=default, use the policy  of	 the  tuning
	       structure.   This  is  the  current  default.  With --param=aarch64-ldp-policy=always, emit ldp regardless of
	       alignment.  With --param=aarch64-ldp-policy=never, do not emit ldp.  With --param=aarch64-ldp-policy=aligned,
	       emit ldp only if the source pointer is aligned to at least double the alignment of the type.

	   aarch64-stp-policy
	       Fine-grained policy for store pairs.  With --param=aarch64-stp-policy=default, use the policy of	 the  tuning
	       structure.   This  is  the  current  default.  With --param=aarch64-stp-policy=always, emit stp regardless of
	       alignment.  With --param=aarch64-stp-policy=never, do not emit stp.  With --param=aarch64-stp-policy=aligned,
	       emit stp only if the source pointer is aligned to at least double the alignment of the type.

	   aarch64-ldp-alias-check-limit
	       Limit on the number of alias checks performed by the AArch64 load/store pair fusion pass when  attempting  to
	       form  an	 ldp/stp.   Higher  values  make  the  pass more aggressive at re-ordering loads over stores, at the
	       expense of increased compile time.

	   aarch64-ldp-writeback
	       Param to control which writeback opportunities we try to handle in the AArch64 load/store pair  fusion  pass.
	       A  value	 of zero disables writeback handling.  One means we try to form pairs involving one or more existing
	       individual writeback accesses where possible.  A value of two means we also  try	 to  opportunistically	form
	       writeback opportunities by folding in trailing destructive updates of the base register used by a pair.

	   aarch64-loop-vect-issue-rate-niters
	       The  tuning  for	 some  AArch64	CPUs tries to take both latencies and issue rates into account when deciding
	       whether a loop should be vectorized using SVE, vectorized using Advanced SIMD, or not vectorized at all.	  If
	       this parameter is set to n, GCC will not use this heuristic for loops that are known to execute in fewer than
	       n Advanced SIMD iterations.

	   aarch64-vect-unroll-limit
	       The  vectorizer	will  use available tuning information to determine whether it would be beneficial to unroll
	       the main vectorized loop and by how much.  This parameter set's the upper bound of how  much  the  vectorizer
	       will unroll the main loop.  The default value is four.

	   The following choices of name are available on GCN targets:

	   gcn-preferred-vectorization-factor
	       Preferred vectorization factor: default, 32, 64.

	   The following choices of name are available on i386 and x86_64 targets:

	   x86-stlf-window-ninsns
	       Instructions number above which STFL stall penalty can be compensated.

	   x86-stv-max-visits
	       The maximum number of use and def visits when discovering a STV chain before the discovery is aborted.

   Program Instrumentation Options
       GCC  supports  a	 number of command-line options that control adding run-time instrumentation to the code it normally
       generates.  For example, one purpose of instrumentation is collect profiling statistics for use	in  finding  program
       hot  spots,  code  coverage  analysis,  or profile-guided optimizations.	 Another class of program instrumentation is
       adding run-time checking to detect programming errors  like  invalid  pointer  dereferences  or	out-of-bounds  array
       accesses,  as  well  as deliberately hostile attacks such as stack smashing or C++ vtable hijacking.  There is also a
       general hook which can be used to implement other forms of tracing or function-level  instrumentation  for  debug  or
       program analysis purposes.

       -p
       -pg Generate  extra  code  to write profile information suitable for the analysis program prof (for -p) or gprof (for
	   -pg).  You must use this option when compiling the source files you want data about, and you	 must  also  use  it
	   when linking.

	   You	can  use  the function attribute "no_instrument_function" to suppress profiling of individual functions when
	   compiling with these options.

       -fprofile-arcs
	   Add code so that program flow arcs are instrumented.	 During execution the program records how  many	 times	each
	   branch and call is executed and how many times it is taken or returns.  On targets that support constructors with
	   priority  support, profiling properly handles constructors, destructors and C++ constructors (and destructors) of
	   classes which are used as a type of a global variable.

	   When the compiled program exits it saves this data to a file called auxname.gcda for each source file.  The	data
	   may	be  used  for  profile-directed	 optimizations	(-fbranch-probabilities),  or  for  test  coverage  analysis
	   (-ftest-coverage).  Each object file's auxname is generated from the name  of  the  output  file,  if  explicitly
	   specified and it is not the final executable, otherwise it is the basename of the source file.  In both cases any
	   suffix  is  removed	(e.g.  foo.gcda	 for  input  file dir/foo.c, or dir/foo.gcda for output file specified as -o
	   dir/foo.o).

	   Note that if a command line directly links source files, the corresponding .gcda files will be prefixed with	 the
	   unsuffixed  name of the output file.	 E.g. "gcc a.c b.c -o binary" would generate binary-a.gcda and binary-b.gcda
	   files.

       -fcondition-coverage
	   Add code so that program conditions are instrumented.  During execution the	program	 records  what	terms  in  a
	   conditional	contributes  to	 a  decision,  which  can be used to verify that all terms in a Boolean function are
	   tested and have an independent effect on the	 outcome  of  a	 decision.   The  result  can  be  read	 with  "gcov
	   --conditions".

       -fpath-coverage
	   Add	code  so that the paths taken are tracked.  During execution the program records the prime paths taken.	 The
	   number of paths grows very fast with	 complexity,  and  to  avoid  exploding	 compile  times	 GCC  will  give  up
	   instrumentation  if	the  approximate number of paths exceeds the limit controlled by -fpath-coverage-limit.	 The
	   result can be read with "gcov --prime-paths --prime-paths-lines --prime-paths-source",

       -fpath-coverage-limit=limit
	   The threshold at which point -fpath-coverage gives up on instrumenting a function.  This limit is approximate and
	   conservative, as GCC uses a pessimistic heuristic which slightly overcounts the  running  number  of	 paths,	 and
	   gives  up  if the threshold is reached before finding all the paths.	 This option is not for fine grained control
	   over which functions to instrument - rather it is intended to limit the effect of path explosion and keep compile
	   times reasonable.  The default is 250000.

       --coverage
	   This option is used to compile and link code instrumented for coverage analysis.  The option	 is  a	synonym	 for
	   -fprofile-arcs  -ftest-coverage  (when  compiling)  and  -lgcov  (when linking).  See the documentation for those
	   options for more details.

	   *   Compile the source files with -fprofile-arcs  plus  optimization	 and  code  generation	options.   For	test
	       coverage	 analysis,  use the additional -ftest-coverage option.	You do not need to profile every source file
	       in a program.

	   *   Compile the source files additionally with -fprofile-abs-path to create absolute	 path  names  in  the  .gcno
	       files.	This  allows  gcov  to	find the correct sources in projects where compilations occur with different
	       working directories.

	   *   Link your object files with -lgcov or -fprofile-arcs (the latter implies the former).

	   *   Run the program on a representative workload to generate the arc profile information.  This may	be  repeated
	       any  number  of	times.	 You can run concurrent instances of your program, and provided that the file system
	       supports locking, the data files will be correctly updated.  Unless a strict  ISO  C  dialect  option  is  in
	       effect, "fork" calls are detected and correctly handled without double counting.

	       Moreover,  an object file can be recompiled multiple times and the corresponding .gcda file merges as long as
	       the source file and the compiler options are unchanged.

	   *   For profile-directed optimizations, compile the source files  again  with  the  same  optimization  and	code
	       generation options plus -fbranch-probabilities.

	   *   For  test  coverage  analysis, use gcov to produce human readable information from the .gcno and .gcda files.
	       Refer to the gcov documentation for further information.

	   With -fprofile-arcs, for each function of your program GCC creates a program flow graph, then  finds	 a  spanning
	   tree	 for the graph.	 Only arcs that are not on the spanning tree have to be instrumented: the compiler adds code
	   to count the number of times that these arcs are executed.  When an arc is the only exit or only  entrance  to  a
	   block,  the	instrumentation code can be added to the block; otherwise, a new basic block must be created to hold
	   the instrumentation code.

	   With -fcondition-coverage, for each conditional in your program GCC creates a bitset and  records  the  exercised
	   boolean values that have an independent effect on the outcome of that expression.

	   With	 -fpath-coverage,  GCC	finds  and enumerates and records the taken prime paths of each function, unless the
	   number of paths would exceed the limit controlled  by  -fpath-coverage-limit.   If  the  limit  is  exceeded	 the
	   function  is not instrumented as if -fpath-coverage was not used.  A prime path is the longest sequence of unique
	   blocks, except possibly the first and last, which is not a subpath of any other path.

       -ftest-coverage
	   Produce a notes file that the gcov code-coverage utility can use to show program coverage.	Each  source  file's
	   note	 file  is  called  auxname.gcno.   Refer to the -fprofile-arcs option above for a description of auxname and
	   instructions on how to generate test coverage data.	Coverage data matches the source files more closely  if	 you
	   do not optimize.

       -fprofile-abs-path
	   Automatically  convert relative source file names to absolute path names in the .gcno files.	 This allows gcov to
	   find the correct sources in projects where compilations occur with different working directories.

       -fprofile-dir=path
	   Set the directory to search for the profile data files in to path.  This option affects  only  the  profile	data
	   generated	by   -fprofile-generate,   -ftest-coverage,   -fprofile-arcs   and   used   by	 -fprofile-use	 and
	   -fbranch-probabilities and its related options.  Both absolute and relative paths can be used.  By  default,	 GCC
	   uses	 the current directory as path, thus the profile data file appears in the same directory as the object file.
	   In order to prevent the file name clashing, if the object file name is  not	an  absolute  path,  we	 mangle	 the
	   absolute  path  of  the  sourcename.gcda file and use it as the file name of a .gcda file.  See details about the
	   file naming in -fprofile-arcs.  See similar option -fprofile-note.

	   When an executable is run in a massive parallel environment, it is  recommended  to	save  profile  to  different
	   folders.  That can be done with variables in path that are exported during run-time:

	   %p  process ID.

	   %q{VAR}
	       value of environment variable VAR

       -fprofile-generate
       -fprofile-generate=path
	   Enable  options usually used for instrumenting application to produce profile useful for later recompilation with
	   profile feedback based optimization.	 You must use -fprofile-generate both when compiling and when  linking	your
	   program.

	   The following options are enabled: -fprofile-arcs, -fprofile-values, -finline-functions, and -fipa-bit-cp.

	   If path is specified, GCC looks at the path to find the profile feedback data files. See -fprofile-dir.

	   To optimize the program based on the collected profile information, use -fprofile-use.

       -fprofile-info-section
       -fprofile-info-section=name
	   Register the profile information in the specified section instead of using a constructor/destructor.	 The section
	   name	 is  name if it is specified, otherwise the section name defaults to ".gcov_info".  A pointer to the profile
	   information generated by -fprofile-arcs is placed in the specified  section	for  each  translation	unit.	This
	   option  disables  the  profile  information	registration  through  a  constructor  and  it	disables the profile
	   information processing through a destructor.	 This option is not intended to be used in hosted environments	such
	   as  GNU/Linux.   It targets freestanding environments (for example embedded systems) with limited resources which
	   do not support constructors/destructors or the C library file I/O.

	   The linker could collect the input sections in a continuous memory block and define start and end symbols.  A GNU
	   linker script example which defines a linker output section follows:

		     .gcov_info	     :
		     {
		       PROVIDE (__gcov_info_start = .);
		       KEEP (*(.gcov_info))
		       PROVIDE (__gcov_info_end = .);
		     }

	   The program could dump the profiling information registered in this linker set for example like this:

		   #include 
		   #include 
		   #include 

		   extern const struct gcov_info *const __gcov_info_start[];
		   extern const struct gcov_info *const __gcov_info_end[];

		   static void
		   dump (const void *d, unsigned n, void *arg)
		   {
		     const unsigned char *c = d;

		     for (unsigned i = 0; i < n; ++i)
		       printf ("%02x", c[i]);
		   }

		   static void
		   filename (const char *f, void *arg)
		   {
		     __gcov_filename_to_gcfn (f, dump, arg );
		   }

		   static void *
		   allocate (unsigned length, void *arg)
		   {
		     return malloc (length);
		   }

		   static void
		   dump_gcov_info (void)
		   {
		     const struct gcov_info *const *info = __gcov_info_start;
		     const struct gcov_info *const *end = __gcov_info_end;

		     /* Obfuscate variable to prevent compiler optimizations.  */
		     __asm__ ("" : "+r" (info));

		     while (info != end)
		     {
		       void *arg = NULL;
		       __gcov_info_to_gcda (*info, filename, dump, allocate, arg);
		       putchar ('\n');
		       ++info;
		     }
		   }

		   int
		   main (void)
		   {
		     dump_gcov_info ();
		     return 0;
		   }

	   The merge-stream subcommand	of  gcov-tool  may  be	used  to  deserialize  the  data  stream  generated  by	 the
	   "__gcov_filename_to_gcfn"  and "__gcov_info_to_gcda" functions and merge the profile information into .gcda files
	   on the host filesystem.

       -fprofile-note=path
	   If path is specified, GCC saves .gcno file into path location.  If you combine the option  with  multiple  source
	   files, the .gcno file will be overwritten.

       -fprofile-prefix-path=path
	   This	 option	 can  be used in combination with profile-generate=profile_dir and profile-use=profile_dir to inform
	   GCC where is the base directory of built source tree.  By default profile_dir will  contain	files  with  mangled
	   absolute  paths of all object files in the built project.  This is not desirable when directory used to build the
	   instrumented binary differs from the directory used to build the binary optimized with profile  feedback  because
	   the	profile	 data  will not be found during the optimized build.  In such setups -fprofile-prefix-path=path with
	   path pointing to the base directory of the build can be used to strip the irrelevant part of the  path  and	keep
	   all file names relative to the main build directory.

       -fprofile-prefix-map=old=new
	   When compiling files residing in directory old, record profiling information (with --coverage) describing them as
	   if the files resided in directory new instead.  See also -ffile-prefix-map and -fcanon-prefix-map.

       -fprofile-update=method
	   Alter  the  update  method  for  an application instrumented for profile feedback based optimization.  The method
	   argument should be one of single,  atomic  or  prefer-atomic.   The	first  one  is	useful	for  single-threaded
	   applications, while the second one prevents profile corruption by emitting thread-safe code.

	   Warning:  When  an application does not properly join all threads (or creates an detached thread), a profile file
	   can be still corrupted.

	   Using prefer-atomic would be transformed either to atomic, when supported by a target, or  to  single  otherwise.
	   The	GCC  driver  automatically selects prefer-atomic when -pthread is present in the command line, otherwise the
	   default method is single.

	   If atomic is selected, then the profile information is updated using atomic operations on  a	 best-effort  basis.
	   Ideally,  the  profile information is updated through atomic operations in hardware.	 If the target platform does
	   not support the required atomic operations in  hardware,  however,  libatomic  is  available,  then	the  profile
	   information	is  updated through calls to libatomic.	 If the target platform neither supports the required atomic
	   operations in hardware nor libatomic, then the profile information is not atomically updated	 and  a	 warning  is
	   issued.  In this case, the obtained profiling information may be corrupt for multi-threaded applications.

	   For	performance  reasons, if 64-bit counters are used for the profiling information and the target platform only
	   supports 32-bit atomic operations in hardware, then the performance critical profiling updates are done using two
	   32-bit atomic operations for each counter update.  If  a  signal  interrupts	 these	two  operations	 updating  a
	   counter, then the profiling information may be in an inconsistent state.

       -fprofile-filter-files=regex
	   Instrument  only  functions	from  files  whose  name  matches any of the regular expressions (separated by semi-
	   colons).

	   For example, -fprofile-filter-files=main\.c;module.*\.c will instrument only main.c and all C files starting with
	   'module'.

       -fprofile-exclude-files=regex
	   Instrument only functions from files whose name does not match any of the regular expressions (separated by semi-
	   colons).

	   For example, -fprofile-exclude-files=/usr/.* will prevent instrumentation of all files that are  located  in	 the
	   /usr/ folder.

       -fprofile-reproducible=[multithreaded|parallel-runs|serial]
	   Control  level of reproducibility of profile gathered by "-fprofile-generate".  This makes it possible to rebuild
	   program with same outcome which is useful, for example, for distribution packages.

	   With -fprofile-reproducible=serial the profile  gathered  by	 -fprofile-generate  is	 reproducible  provided	 the
	   trained  program  behaves the same at each invocation of the train run, it is not multi-threaded and profile data
	   streaming is always done in the same order.	Note that profile streaming happens at the end of  program  run	 but
	   also before "fork" function is invoked.

	   Note	 that  it  is quite common that execution counts of some part of programs depends, for example, on length of
	   temporary file names or memory space randomization (that  may  affect  hash-table  collision	 rate).	  Such	non-
	   reproducible	 part of programs may be annotated by "no_instrument_function" function attribute. gcov-dump with -l
	   can be used to dump gathered data and verify that they are indeed reproducible.

	   With -fprofile-reproducible=parallel-runs collected profile stays reproducible regardless the order of  streaming
	   of the data into gcda files.	 This setting makes it possible to run multiple instances of instrumented program in
	   parallel  (such  as	with  "make  -j").  This  reduces  quality  of gathered data, in particular of indirect call
	   profiling.

       -fsanitize=address
	   Enable AddressSanitizer, a fast memory error detector.  Memory access instructions  are  instrumented  to  detect
	   out-of-bounds   and	 use-after-free	  bugs.	   The	 option	  enables  -fsanitize-address-use-after-scope.	 See
	    for more details.   The	 run-time  behavior  can  be
	   influenced using the ASAN_OPTIONS environment variable.  When set to "help=1", the available options are shown at
	   startup		  of		    the		      instrumented		 program.		 See
	    for a list of supported options.
	   The option cannot be combined with  -fsanitize=thread  or  -fsanitize=hwaddress.   Note  that  the  only  targets
	   -fsanitize=hwaddress	 is  currently	supported  on  are x86-64 (only with "-mlam=u48" or "-mlam=u57" options) and
	   AArch64, in both cases only in ABIs with 64-bit pointers.

	   When compiling with -fsanitize=address, you should also use -g to produce more meaningful output.   To  get	more
	   accurate  stack traces, it is possible to use options such as -O0, -O1, or -Og (which, for instance, prevent most
	   function inlining), -fno-optimize-sibling-calls (which prevents optimizing sibling and tail recursive calls; this
	   option is implicit for -O0, -O1, or -Og), or -fno-ipa-icf (which disables Identical Code Folding for	 functions).
	   Using  -fno-omit-frame-pointer  also	 improves  stack  traces.   Since  multiple  runs  of  the program may yield
	   backtraces with different addresses due to ASLR (Address Space Layout Randomization), it may be desirable to turn
	   ASLR off.  On Linux, this can be achieved with setarch `uname -m` -R ./prog.

       -fsanitize=kernel-address
	   Enable AddressSanitizer for Linux kernel.  See  for more details.

       -fsanitize=hwaddress
	   Enable Hardware-assisted AddressSanitizer, which uses a hardware ability to ignore the top byte of a	 pointer  to
	   allow  the detection of memory errors with a low memory overhead.  Memory access instructions are instrumented to
	   detect out-of-bounds and  use-after-free  bugs.   The  option  enables  -fsanitize-address-use-after-scope.	 See
	      for   more   details.   The  run-time
	   behavior can be influenced using the HWASAN_OPTIONS environment variable.  When set to  "help=1",  the  available
	   options  are	 shown at startup of the instrumented program.	The option cannot be combined with -fsanitize=thread
	   or -fsanitize=address, and is currently only available on AArch64.

       -fsanitize=kernel-hwaddress
	   Enable   Hardware-assisted	AddressSanitizer   for	 compilation   of   the	  Linux	   kernel.     Similar	  to
	   -fsanitize=kernel-address  but using an alternate instrumentation method, and similar to -fsanitize=hwaddress but
	   with instrumentation differences necessary for compiling the Linux kernel.  These differences are to avoid hwasan
	   library initialization calls and to account for the stack pointer having a different value in its top byte.

	   Note: This option has different defaults to the -fsanitize=hwaddress.  Instrumenting the stack and  alloca  calls
	   are	 not   on   by	 default   but	 are   still   possible	 by  specifying	 the  command-line  options  --param
	   hwasan-instrument-stack=1 and --param hwasan-instrument-allocas=1 respectively. Using a random frame tag  is	 not
	   implemented for kernel instrumentation.

       -fsanitize=pointer-compare
	   Instrument  comparison  operation  (<, <=, >, >=) with pointer operands.  The option must be combined with either
	   -fsanitize=kernel-address or -fsanitize=address The option cannot be combined with -fsanitize=thread.   Note:  By
	   default the check is disabled at run time.  To enable it, add "detect_invalid_pointer_pairs=2" to the environment
	   variable  ASAN_OPTIONS.  Using "detect_invalid_pointer_pairs=1" detects invalid operation only when both pointers
	   are non-null.

       -fsanitize=pointer-subtract
	   Instrument subtraction with pointer operands.  The option must be combined with either  -fsanitize=kernel-address
	   or  -fsanitize=address  The	option	cannot	be  combined  with -fsanitize=thread.  Note: By default the check is
	   disabled  at	 run  time.   To  enable  it,  add  "detect_invalid_pointer_pairs=2"  to  the  environment  variable
	   ASAN_OPTIONS.  Using	 "detect_invalid_pointer_pairs=1" detects invalid operation only when both pointers are non-
	   null.

       -fsanitize=shadow-call-stack
	   Enable ShadowCallStack, a security  enhancement  mechanism  used  to	 protect  programs  against  return  address
	   overwrites  (e.g.  stack  buffer  overflows.)   It  works  by  saving a function's return address to a separately
	   allocated shadow call stack in the function prologue and restoring the return address from the shadow call  stack
	   in  the  function epilogue.	Instrumentation only occurs in functions that need to save the return address to the
	   stack.

	   Currently it only supports the aarch64 platform.  It is specifically designed for linux kernels that	 enable	 the
	   CONFIG_SHADOW_CALL_STACK  option.  For the user space programs, runtime support is not currently provided in libc
	   and libgcc.	Users who want to use this feature in user space need to provide their own support for the  runtime.
	   It should be noted that this may cause the ABI rules to be broken.

	   On  aarch64,	 the  instrumentation  makes use of the platform register "x18".  This generally means that any code
	   that may run on the same thread as code compiled with ShadowCallStack must be compiled with the flag -ffixed-x18,
	   otherwise functions compiled without -ffixed-x18 might clobber "x18" and so corrupt the shadow stack pointer.

	   Also, because there is no userspace runtime support, code compiled  with  ShadowCallStack  cannot  use  exception
	   handling.  Use -fno-exceptions to turn off exceptions.

	   See  for more details.

       -fsanitize=thread
	   Enable  ThreadSanitizer,  a	fast data race detector.  Memory access instructions are instrumented to detect data
	   race bugs.	See    for  more  details.  The  run-time
	   behavior	 can	  be	 influenced	using	  the	  TSAN_OPTIONS	   environment	   variable;	 see
	    for a list of  supported  options.	 The  option
	   cannot be combined with -fsanitize=address, -fsanitize=leak.

	   When compiling with -fsanitize=thread, you should also use -g to produce more meaningful output.

	   Note	 that sanitized atomic builtins cannot throw exceptions when operating on invalid memory addresses with non-
	   call exceptions (-fnon-call-exceptions).

       -fsanitize=leak
	   Enable LeakSanitizer, a memory leak detector.   This	 option	 only  matters	for  linking  of  executables.	 The
	   executable	is   linked  against  a	 library  that	overrides  "malloc"  and  other	 allocator  functions.	 See
	     for  more	  details.    The   run-time
	   behavior  can  be  influenced  using	 the  LSAN_OPTIONS environment variable.  The option cannot be combined with
	   -fsanitize=thread.

       -fsanitize=undefined
	   Enable UndefinedBehaviorSanitizer, a fast undefined behavior detector.  Various computations are instrumented  to
	   detect undefined behavior at runtime.  See  for more
	   details.    The  run-time  behavior	can  be	 influenced  using  the UBSAN_OPTIONS environment variable.  Current
	   suboptions are:

	   -fsanitize=shift
	       This option enables checking that the result of a shift operation is not undefined.  Note that  what  exactly
	       is  considered  undefined  differs slightly between C and C++, as well as between ISO C90 and C99, etc.	This
	       option has two suboptions, -fsanitize=shift-base and -fsanitize=shift-exponent.

	   -fsanitize=shift-exponent
	       This option enables checking that the second argument of a shift operation is not  negative  and	 is  smaller
	       than the precision of the promoted first argument.

	   -fsanitize=shift-base
	       If  the	second	argument of a shift operation is within range, check that the result of a shift operation is
	       not undefined.  Note that what exactly is considered undefined differs slightly between C and C++, as well as
	       between ISO C90 and C99, etc.

	   -fsanitize=integer-divide-by-zero
	       Detect integer division by zero.

	   -fsanitize=unreachable
	       With this option, the compiler turns  the  "__builtin_unreachable"  call	 into  a  diagnostics  message	call
	       instead.	 When reaching the "__builtin_unreachable" call, the behavior is undefined.

	   -fsanitize=vla-bound
	       This option instructs the compiler to check that the size of a variable length array is positive.

	   -fsanitize=null
	       This  option  enables  pointer checking.	 Particularly, the application built with this option turned on will
	       issue an error message when it tries to dereference a NULL pointer, or if a  reference  (possibly  an  rvalue
	       reference) is bound to a NULL pointer, or if a method is invoked on an object pointed by a NULL pointer.

	   -fsanitize=return
	       This option enables return statement checking.  Programs built with this option turned on will issue an error
	       message when the end of a non-void function is reached without actually returning a value.  This option works
	       in C++ only.

	   -fsanitize=signed-integer-overflow
	       This  option  enables signed integer overflow checking.	We check that the result of "+", "*", and both unary
	       and binary "-" does not overflow in the	signed	arithmetics.   This  also  detects  "INT_MIN  /	 -1"  signed
	       division.   Note,  integer  promotion  rules  must  be  taken into account.  That is, the following is not an
	       overflow:

		       signed char a = SCHAR_MAX;
		       a++;

	   -fsanitize=bounds
	       This option enables instrumentation of array bounds.  Various out of bounds accesses are detected.   Flexible
	       array  members,	flexible array member-like arrays, and initializers of variables with static storage are not
	       instrumented, with the exception of flexible array member-like arrays  for  which  "-fstrict-flex-arrays"  or
	       "-fstrict-flex-arrays=" options or "strict_flex_array" attributes say they shouldn't be treated like flexible
	       array member-like arrays.

	   -fsanitize=bounds-strict
	       This  option  enables  strict  instrumentation  of  array  bounds.  Most out of bounds accesses are detected,
	       including flexible array	 member-like  arrays.	Initializers  of  variables  with  static  storage  are	 not
	       instrumented.

	   -fsanitize=alignment
	       This  option  enables  checking	of  alignment of pointers when they are dereferenced, or when a reference is
	       bound to insufficiently aligned target, or when a method or constructor is invoked on insufficiently  aligned
	       object.

	   -fsanitize=object-size
	       This  option enables instrumentation of memory references using the "__builtin_dynamic_object_size" function.
	       Various out of bounds pointer accesses are detected.

	   -fsanitize=float-divide-by-zero
	       Detect floating-point division by zero.	Unlike other similar options, -fsanitize=float-divide-by-zero is not
	       enabled by -fsanitize=undefined, since floating-point division by zero can be a legitimate way  of  obtaining
	       infinities and NaNs.

	   -fsanitize=float-cast-overflow
	       This  option  enables  floating-point  type  to integer conversion checking.  We check that the result of the
	       conversion does not overflow.  Unlike other similar options, -fsanitize=float-cast-overflow is not enabled by
	       -fsanitize=undefined.  This option does not work well with "FE_INVALID" exceptions enabled.

	   -fsanitize=nonnull-attribute
	       This option enables instrumentation of calls, checking whether null values are not passed to arguments marked
	       as requiring a non-null value by the "nonnull" function attribute.

	   -fsanitize=returns-nonnull-attribute
	       This option enables instrumentation of return statements in functions marked with "returns_nonnull"  function
	       attribute, to detect returning of null values from such functions.

	   -fsanitize=bool
	       This  option  enables  instrumentation  of  loads from bool.  If a value other than 0/1 is loaded, a run-time
	       error is issued.

	   -fsanitize=enum
	       This option enables instrumentation of loads from an enum type.	If a value outside the range of	 values	 for
	       the enum type is loaded, a run-time error is issued.

	   -fsanitize=vptr
	       This  option  enables  instrumentation  of  C++	member	function calls, member accesses and some conversions
	       between pointers to base and derived classes, to verify the referenced object has the correct dynamic type.

	   -fsanitize=pointer-overflow
	       This option enables instrumentation of pointer arithmetics.  If the pointer arithmetics overflows, a run-time
	       error is issued.

	   -fsanitize=builtin
	       This option enables instrumentation of arguments to selected builtin  functions.	  If  an  invalid  value  is
	       passed  to  such arguments, a run-time error is issued.	E.g. passing 0 as the argument to "__builtin_ctz" or
	       "__builtin_clz" invokes undefined behavior and is diagnosed by this option.

	   Note that sanitizers	 tend  to  increase  the  rate	of  false  positive  warnings,	most  notably  those  around
	   -Wmaybe-uninitialized.  We recommend against combining -Werror and [the use of] sanitizers.

	   While  -ftrapv  causes traps for signed overflows to be emitted, -fsanitize=undefined gives a diagnostic message.
	   This currently works only for the C family of languages.

       -fno-sanitize=all
	   This option disables all previously enabled sanitizers.  -fsanitize=all is not allowed, as some sanitizers cannot
	   be used together.

       -fasan-shadow-offset=number
	   This option forces GCC to use custom shadow offset in AddressSanitizer checks.  It is  useful  for  experimenting
	   with different shadow memory layouts in Kernel AddressSanitizer.

       -fsanitize-sections=s1,s2,...
	   Sanitize global variables in selected user-defined sections.	 si may contain wildcards.

       -fsanitize-recover[=opts]
	   -fsanitize-recover=	controls  error	 recovery  mode	 for  sanitizers  mentioned in comma-separated list of opts.
	   Enabling this option for a sanitizer component causes it to attempt to continue running  the	 program  as  if  no
	   error happened.  This means multiple runtime errors can be reported in a single program run, and the exit code of
	   the	program	 may indicate success even when errors have been reported.  The -fno-sanitize-recover= option can be
	   used to alter this behavior: only the first detected error is reported and program then  exits  with	 a  non-zero
	   exit code.

	   Currently  this feature only works for -fsanitize=undefined (and its suboptions except for -fsanitize=unreachable
	   and	       -fsanitize=return),	   -fsanitize=float-cast-overflow,	    -fsanitize=float-divide-by-zero,
	   -fsanitize=bounds-strict,  -fsanitize=kernel-address and -fsanitize=address.	 For these sanitizers error recovery
	   is  turned  on   by	 default,   except   -fsanitize=address,   for	 which	 this	feature	  is   experimental.
	   -fsanitize-recover=all  and	-fno-sanitize-recover=all  is  also  accepted,	the  former enables recovery for all
	   sanitizers that support it, the latter disables recovery for all sanitizers that support it.

	   Even if a recovery mode is turned on the compiler side, it needs to be also enabled on the runtime library  side,
	   otherwise  the  failures  are still fatal.  The runtime library defaults to "halt_on_error=0" for ThreadSanitizer
	   and UndefinedBehaviorSanitizer, while default value	for  AddressSanitizer  is  "halt_on_error=1".  This  can  be
	   overridden through setting the "halt_on_error" flag in the corresponding environment variable.

	   Syntax without an explicit opts parameter is deprecated.  It is equivalent to specifying an opts list of:

		   undefined,float-cast-overflow,float-divide-by-zero,bounds-strict

       -fsanitize-address-use-after-scope
	   Enable sanitization of local variables to detect use-after-scope bugs.  The option sets -fstack-reuse to none.

       -fsanitize-trap[=opts]
	   The	-fsanitize-trap= option instructs the compiler to report for sanitizers mentioned in comma-separated list of
	   opts undefined behavior using "__builtin_trap" rather than a "libubsan"  library  routine.	If  this  option  is
	   enabled   for  certain  sanitizer,  it  takes  precedence  over  the	 -fsanitizer-recover=  for  that  sanitizer,
	   "__builtin_trap" will be emitted and be fatal regardless  of	 whether  recovery  is	enabled	 or  disabled  using
	   -fsanitize-recover=.

	   The	advantage  of this is that the "libubsan" library is not needed and is not linked in, so this is usable even
	   in freestanding environments.

	   Currently this  feature  works  with	 -fsanitize=undefined  (and  its  suboptions  except  for  -fsanitize=vptr),
	   -fsanitize=float-cast-overflow,	  -fsanitize=float-divide-by-zero	 and	   -fsanitize=bounds-strict.
	   "-fsanitize-trap=all"   can	 be   also   specified,	  which	  enables    it	   for	  "undefined"	 suboptions,
	   -fsanitize=float-cast-overflow,     -fsanitize=float-divide-by-zero	   and	   -fsanitize=bounds-strict.	  If
	   "-fsanitize-trap=undefined" or "-fsanitize-trap=all" is used and "-fsanitize=vptr"  is  enabled  on	the  command
	   line,  the  instrumentation	is  silently  ignored  as  the	instrumentation	 always	 needs	"libubsan"  support,
	   -fsanitize-trap=vptr is not allowed.

       -fsanitize-undefined-trap-on-error
	   The -fsanitize-undefined-trap-on-error option is deprecated equivalent of -fsanitize-trap=all.

       -fsanitize-coverage=trace-pc
	   Enable coverage-guided fuzzing code instrumentation.	 Inserts a call	 to  "__sanitizer_cov_trace_pc"	 into  every
	   basic block.

       -fsanitize-coverage=trace-cmp
	   Enable   dataflow   guided  fuzzing	code  instrumentation.	 Inserts  a  call  to  "__sanitizer_cov_trace_cmp1",
	   "__sanitizer_cov_trace_cmp2",   "__sanitizer_cov_trace_cmp4"	  or   "__sanitizer_cov_trace_cmp8"   for   integral
	   comparison with both operands variable or "__sanitizer_cov_trace_const_cmp1", "__sanitizer_cov_trace_const_cmp2",
	   "__sanitizer_cov_trace_const_cmp4" or "__sanitizer_cov_trace_const_cmp8" for integral comparison with one operand
	   constant,  "__sanitizer_cov_trace_cmpf"  or	"__sanitizer_cov_trace_cmpd"  for  float  or  double comparisons and
	   "__sanitizer_cov_trace_switch" for switch statements.

       -fcf-protection=[full|branch|return|none|check]
       -fcf-protection
	   Enable code instrumentation to increase program security  by	 checking  that	 target	 addresses  of	control-flow
	   transfer  instructions (such as indirect function call, function return, indirect jump) are valid.  This prevents
	   diverting the flow of control to an unexpected target.  This is intended  to	 protect  against  such	 threats  as
	   Return-oriented Programming (ROP), and similarly call/jmp-oriented programming (COP/JOP).

	   The -fcf-protection= keywords are interpreted as follows.

	   The	value "branch" tells the compiler to implement checking of validity of control-flow transfer at the point of
	   indirect branch instructions, i.e. call/jmp instructions.

	   The value "return" implements checking of validity at the point of returning from a function.

	   The value "full" is an alias for specifying both "branch" and "return".

	   The value "check" is used for the final link with link-time optimization (LTO).  An error is issued if LTO object
	   files are compiled with different -fcf-protection values.  The value "check" is ignored at the compile time.

	   The value "none" turns off instrumentation.

	   -fcf-protection is an alias for -fcf-protection=full.  To override  a  previous  -fcf-protection  option  on	 the
	   command line, add -fcf-protection=none and then -fcf-protection=kind.

	   The	macro  "__CET__"  is  defined  when -fcf-protection is used.  The first bit of "__CET__" is set to 1 for the
	   value "branch" and the second bit of "__CET__" is set to 1 for the "return".

	   You can also use the "nocf_check" attribute to  identify  which  functions  and  calls  should  be  skipped	from
	   instrumentation.

	   Currently  the x86 GNU/Linux target provides an implementation based on Intel Control-flow Enforcement Technology
	   (CET) which works for i686 processor or newer.

	   NOTE: In Ubuntu 19.10 and later versions, -fcf-protection is enabled by default for C, C++, ObjC, ObjC++, if none
	   of -fno-cf-protection nor -fcf-protection=* are found.

       -fharden-compares
	   For every logical test that survives gimple optimizations and is not the condition in a conditional	branch	(for
	   example,  conditions	 tested for conditional moves, or to store in boolean variables), emit extra code to compute
	   and verify the reversed condition, and  to  call  "__builtin_trap"  if  the	results	 do  not  match.   Use	with
	   -fharden-conditional-branches to cover all conditionals.

       -fharden-conditional-branches
	   For	every  non-vectorized  conditional branch that survives gimple optimizations, emit extra code to compute and
	   verify  the	reversed  condition,  and  to  call  "__builtin_trap"  if  the	result	is  unexpected.	  Use	with
	   -fharden-compares to cover all conditionals.

       -fharden-control-flow-redundancy
	   Emit	 extra	code to set booleans when entering basic blocks, and to verify and trap, at function exits, when the
	   booleans do not form an execution path that is compatible with the control flow graph.

	   Verification takes place before returns, before mandatory tail calls (see below) and, optionally, before escaping
	   exceptions with -fhardcfr-check-exceptions, before  returning  calls	 with  -fhardcfr-check-returning-calls,	 and
	   before  noreturn  calls  with  -fhardcfr-check-noreturn-calls).   Tuning  options  --param hardcfr-max-blocks and
	   --param hardcfr-max-inline-blocks are available.

	   Tail call optimization takes place too late to affect control flow redundancy, but calls annotated  as  mandatory
	   tail	 calls	by  language  front-ends,  and any calls marked early enough as potential tail calls would also have
	   verification issued before the call, but these possibilities are merely theoretical, as these conditions can only
	   be met when using custom compiler plugins.

       -fhardcfr-skip-leaf
	   Disable -fharden-control-flow-redundancy in leaf functions.

       -fhardcfr-check-exceptions
	   When -fharden-control-flow-redundancy is active, check the recorded execution path against the control flow graph
	   at exception escape points, as if the function body was wrapped with a cleanup handler that performed  the  check
	   and reraised.  This option is enabled by default; use -fno-hardcfr-check-exceptions to disable it.

       -fhardcfr-check-returning-calls
	   When -fharden-control-flow-redundancy is active, check the recorded execution path against the control flow graph
	   before  any	function call immediately followed by a return of its result, if any, so as to not prevent tail-call
	   optimization, whether or not it is ultimately optimized to a tail call.

	   This option is enabled by default whenever sibling call optimizations are enabled (see -foptimize-sibling-calls),
	   but it can be enabled (or disabled, using its negated form) explicitly, regardless of the optimizations.

       -fhardcfr-check-noreturn-calls=[always|no-xthrow|nothrow|never]
	   When -fharden-control-flow-redundancy is active, check the recorded execution path against the control flow graph
	   before "noreturn" calls, either all of them (always), those that aren't expected to return control to the  caller
	   through  an	exception  (no-xthrow,	the  default),	those  that  may not return control to the caller through an
	   exception either (nothrow), or none of them (never).

	   Checking before a "noreturn" function that may return control to  the  caller  through  an  exception  may  cause
	   checking  to	 be  performed	more  than once, if the exception is caught in the caller, whether by a handler or a
	   cleanup.  When -fhardcfr-check-exceptions is also enabled, the compiler will avoid associating a "noreturn"	call
	   with	 the implicitly-added cleanup handler, since it would be redundant with the check performed before the call,
	   but other handlers or cleanups in the function, if activated, will modify the recorded execution path  and  check
	   it again when another checkpoint is hit.  The checkpoint may even be another "noreturn" call, so checking may end
	   up performed multiple times.

	   Various  optimizers	may  cause  calls  to  be  marked as "noreturn" and/or "nothrow", even in the absence of the
	   corresponding attributes, which may affect the placement of checks before calls,  as	 well  as  the	addition  of
	   implicit  cleanup  handlers	for them.  This unpredictability, and the fact that raising and reraising exceptions
	   frequently amounts to implicitly calling "noreturn" functions, have made no-xthrow the default setting  for	this
	   option:  it excludes from the "noreturn" treatment only internal functions used to (re)raise exceptions, that are
	   not affected by these optimizations.

       -fhardened
	   Enable a set of flags for C and C++ that improve the security of the generated code without	affecting  its	ABI.
	   The precise flags enabled may change between major releases of GCC, but are currently:

	   -D_FORTIFY_SOURCE=3	 -D_GLIBCXX_ASSERTIONS	 -ftrivial-auto-var-init=zero	-fPIE	 -pie	 -Wl,-z,relro,-z,now
	   -fstack-protector-strong -fstack-clash-protection -fcf-protection=full (x86 GNU/Linux only)

	   The list of options enabled by -fhardened can be generated using the --help=hardened option.

	   When the system glibc is older than 2.35, -D_FORTIFY_SOURCE=2 is used instead.

	   This option is intended to be used in production builds, not merely in debug builds.

	   Currently, -fhardened is only supported on GNU/Linux targets.

	   -fhardened only enables a particular option if it wasn't already specified anywhere on  the	command	 line.	 For
	   instance, -fhardened -fstack-protector will only enable -fstack-protector, but not -fstack-protector-strong.

       -fstack-protector
	   Emit	 extra	code  to check for buffer overflows, such as stack smashing attacks.  This is done by adding a guard
	   variable to functions with vulnerable objects.  This includes functions that call "alloca",	and  functions	with
	   buffers  larger than or equal to 8 bytes.  The guards are initialized when a function is entered and then checked
	   when the function exits.  If a guard check fails, an error message  is  printed  and	 the  program  exits.	Only
	   variables  that  are	 actually  allocated  on  the  stack  are  considered, optimized away variables or variables
	   allocated in registers don't count.

       -fstack-protector-all
	   Like -fstack-protector except that all functions are protected.

       -fstack-protector-strong
	   Like -fstack-protector but includes additional functions  to	 be  protected	---  those  that  have	local  array
	   definitions,	 or  have  references  to  local frame addresses.  Only variables that are actually allocated on the
	   stack are considered, optimized away variables or variables allocated in registers don't count.

	   NOTE: In Ubuntu 14.10 and later versions, -fstack-protector-strong is  enabled  by  default	for  C,	 C++,  ObjC,
	   ObjC++, if none of -fno-stack-protector, -nostdlib, nor -ffreestanding are found.

       -fstack-protector-explicit
	   Like -fstack-protector but only protects those functions which have the "stack_protect" attribute.

       -fstack-check
	   Generate code to verify that you do not go beyond the boundary of the stack.	 You should specify this flag if you
	   are	running in an environment with multiple threads, but you only rarely need to specify it in a single-threaded
	   environment since stack overflow is automatically detected on nearly all systems if there is only one stack.

	   Note that this switch does not actually cause checking to be done; the operating system or the  language  runtime
	   must do that.  The switch causes generation of code to ensure that they see the stack being extended.

	   You	can  additionally specify a string parameter: no means no checking, generic means force the use of old-style
	   checking, specific means use the best checking method and is equivalent to bare -fstack-check.

	   Old-style checking is a generic mechanism that requires no specific target support in the compiler but comes with
	   the following drawbacks:

	   1.  Modified allocation strategy for large objects: they are always allocated dynamically if their size exceeds a
	       fixed threshold.	 Note this may change the semantics of some code.

	   2.  Fixed limit on the size of the static frame of functions: when it is topped by a particular  function,  stack
	       checking is not reliable and a warning is issued by the compiler.

	   3.  Inefficiency:  because  of  both	 the  modified	allocation  strategy  and  the	generic implementation, code
	       performance is hampered.

	   Note that old-style stack checking is also the fallback method for specific if no target support has	 been  added
	   in the compiler.

	   -fstack-check=  is  designed	 for  Ada's  needs to detect infinite recursion and stack overflows.  specific is an
	   excellent choice when compiling Ada code.  It is not generally sufficient to protect against stack-clash attacks.
	   To protect against those you want -fstack-clash-protection.

       -fstack-clash-protection
	   Generate code to prevent stack clash style attacks.	When this option is enabled, the compiler will only allocate
	   one page of stack space at a time and each page is accessed immediately  after  allocation.	 Thus,	it  prevents
	   allocations from jumping over any stack guard page provided by the operating system.

	   Most	 targets  do  not  fully support stack clash protection.  However, on those targets -fstack-clash-protection
	   will protect dynamic stack allocations.  -fstack-clash-protection may also provide limited protection for  static
	   stack allocations if the target supports -fstack-check=specific.

	   NOTE:  In  Ubuntu  19.10  and  later	 versions,  -fstack-clash-protection is enabled by default for C, C++, ObjC,
	   ObjC++, unless -fno-stack-clash-protection is found.

       -fstack-limit-register=reg
       -fstack-limit-symbol=sym
       -fno-stack-limit
	   Generate code to ensure that the stack does not grow beyond a certain value, either the value of  a	register  or
	   the	address	 of a symbol.  If a larger stack is required, a signal is raised at run time.  For most targets, the
	   signal is raised before the stack overruns the boundary, so it is possible to catch	the  signal  without  taking
	   special precautions.

	   For	instance,  if  the  stack  starts  at absolute address 0x80000000 and grows downwards, you can use the flags
	   -fstack-limit-symbol=__stack_limit and -Wl,--defsym,__stack_limit=0x7ffe0000 to enforce a stack limit  of  128KB.
	   Note that this may only work with the GNU linker.

	   You can locally override stack limit checking by using the "no_stack_limit" function attribute.

       -fsplit-stack
	   Generate  code  to  automatically split the stack before it overflows.  The resulting program has a discontiguous
	   stack which can only overflow if the program is unable to allocate any more memory.	This  is  most	useful	when
	   running  threaded  programs,	 as it is no longer necessary to calculate a good stack size to use for each thread.
	   This is currently only implemented for the x86 targets running GNU/Linux.

	   When code compiled with -fsplit-stack calls code compiled without -fsplit-stack, there  may	not  be	 much  stack
	   space available for the latter code to run.	If compiling all code, including library code, with -fsplit-stack is
	   not	an option, then the linker can fix up these calls so that the code compiled without -fsplit-stack always has
	   a large stack.  Support for this is implemented in the gold linker in GNU binutils release 2.21 and later.

       -fstrub=disable
	   Disable stack scrubbing entirely, ignoring any "strub" attributes.  See

       -fstrub=strict
	   Functions default to "strub" mode "disabled", and apply strictly the restriction that only  functions  associated
	   with "strub"-"callable" modes ("at-calls", "callable" and "always_inline" "internal") are "callable" by functions
	   with "strub"-enabled modes ("at-calls" and "internal").

       -fstrub=relaxed
	   Restore  the	 default  stack	 scrub	("strub")  setting,  namely,  "strub" is only enabled as required by "strub"
	   attributes associated with function and data types.	"Relaxed" means that strub contexts are only prevented	from
	   calling  functions  explicitly  associated  with "strub" mode "disabled".  This option is only useful to override
	   other -fstrub=* options that precede it in the command line.

       -fstrub=at-calls
	   Enable "at-calls" "strub" mode where viable.	 The primary use of this option is for testing.	  It  exercises	 the
	   "strub"  machinery  in  scenarios  strictly	local  to  a  translation unit.	 This "strub" mode modifies function
	   interfaces, so any function that is visible to other translation units, or that has its address taken,  will	 not
	   be  affected	 by  this  option.   Optimization  options  may	 also  affect  viability.  See the "strub" attribute
	   documentation for details on viability and eligibility requirements.

       -fstrub=internal
	   Enable "internal" "strub" mode where viable.	 The primary use of this option is  for	 testing.   This  option  is
	   intended  to exercise thoroughly parts of the "strub" machinery that implement the less efficient, but interface-
	   preserving "strub" mode.  Functions that would not be affected by this option are quite uncommon.

       -fstrub=all
	   Enable  some	 "strub"  mode	where  viable.	 When  both  strub  modes  are	viable,	 "at-calls"  is	  preferred.
	   -fdump-ipa-strubm  adds function attributes that tell which mode was selected for each function.  The primary use
	   of this option is for testing, to exercise thoroughly the "strub" machinery.

       -fvtable-verify=[std|preinit|none]
	   This option is only available when compiling C++ code.  It turns on (or off, if using  -fvtable-verify=none)	 the
	   security  feature  that  verifies  at run time, for every virtual call, that the vtable pointer through which the
	   call is made is valid for the type of the object, and has not been  corrupted  or  overwritten.   If	 an  invalid
	   vtable pointer is detected at run time, an error is reported and execution of the program is immediately halted.

	   This	 option	 causes	 run-time  data	 structures to be built at program startup, which are used for verifying the
	   vtable pointers.  The options std and preinit control the timing of when these data	structures  are	 built.	  In
	   both	 cases	the data structures are built before execution reaches "main".	Using -fvtable-verify=std causes the
	   data structures to be built after shared libraries have been	 loaded	 and  initialized.   -fvtable-verify=preinit
	   causes them to be built before shared libraries have been loaded and initialized.

	   If  this  option  appears  multiple times in the command line with different values specified, none takes highest
	   priority over both std and preinit; preinit takes priority over std.

       -fvtv-debug
	   When used in conjunction with -fvtable-verify=std  or  -fvtable-verify=preinit,  causes  debug  versions  of	 the
	   runtime  functions  for  the vtable verification feature to be called.  This flag also causes the compiler to log
	   information about which vtable pointers it finds for each class.  This information is written  to  a	 file  named
	   vtv_set_ptr_data.log	 in  the  directory named by the environment variable VTV_LOGS_DIR if that is defined or the
	   current working directory otherwise.

	   Note:  This feature appends data to the log file. If you want a fresh log file, be sure to  delete  any  existing
	   one.

       -fvtv-counts
	   This	 is  a	debugging  flag.  When used in conjunction with -fvtable-verify=std or -fvtable-verify=preinit, this
	   causes the compiler to keep track of the  total  number  of	virtual	 calls	it  encounters	and  the  number  of
	   verifications  it  inserts.	 It  also  counts  the number of calls to certain run-time library functions that it
	   inserts and logs this information for each compilation unit.	 The compiler writes  this  information	 to  a	file
	   named  vtv_count_data.log  in  the directory named by the environment variable VTV_LOGS_DIR if that is defined or
	   the current working directory otherwise.  It also counts the size of the vtable pointer sets for each class,	 and
	   writes this information to vtv_class_set_sizes.log in the same directory.

	   Note:  This feature appends data to the log files.  To get fresh log files, be sure to delete any existing ones.

       -finstrument-functions
	   Generate  instrumentation  calls  for  entry	 and  exit  to functions.  Just after function entry and just before
	   function exit, the following profiling functions are called with the address of the current function and its call
	   site.  (On some platforms, "__builtin_return_address" does not work beyond the current function, so the call site
	   information may not be available to the profiling functions otherwise.)

		   void __cyg_profile_func_enter (void *this_fn,
						  void *call_site);
		   void __cyg_profile_func_exit	 (void *this_fn,
						  void *call_site);

	   The first argument is the address of the start of the current function, which may be looked	up  exactly  in	 the
	   symbol table.

	   This instrumentation is also done for functions expanded inline in other functions.	The profiling calls indicate
	   where,  conceptually,  the  inline  function is entered and exited.	This means that addressable versions of such
	   functions must be available.	 If all your uses of a function are expanded inline, this  may	mean  an  additional
	   expansion of code size.  If you use "extern inline" in your C code, an addressable version of such functions must
	   be  provided.   (This  is  normally	the  case  anyway, but if you get lucky and the optimizer always expands the
	   functions inline, you might have gotten away without providing static copies.)

	   A function may be given the attribute "no_instrument_function", in which case this instrumentation is  not  done.
	   This	 can  be  used, for example, for the profiling functions listed above, high-priority interrupt routines, and
	   any functions from which the profiling functions cannot  safely  be	called	(perhaps  signal  handlers,  if	 the
	   profiling routines generate output or allocate memory).

       -finstrument-functions-once
	   This	 is  similar  to  -finstrument-functions,  but the profiling functions are called only once per instrumented
	   function, i.e. the first profiling function is called after the first entry into the	 instrumented  function	 and
	   the second profiling function is called before the exit corresponding to this first entry.

	   The	definition  of	"once"	for  the  purpose of this option is a little vague because the implementation is not
	   protected against data races.  As a result, the implementation only guarantees that the profiling  functions	 are
	   called at least once per process and at most once per thread, but the calls are always paired, that is to say, if
	   a thread calls the first function, then it will call the second function, unless it never reaches the exit of the
	   instrumented function.

       -finstrument-functions-exclude-file-list=file,file,...
	   Set the list of functions that are excluded from instrumentation (see the description of -finstrument-functions).
	   If the file that contains a function definition matches with one of file, then that function is not instrumented.
	   The	match is done on substrings: if the file parameter is a substring of the file name, it is considered to be a
	   match.

	   For example:

		   -finstrument-functions-exclude-file-list=/bits/stl,include/sys

	   excludes any inline function defined in files whose pathnames contain /bits/stl or include/sys.

	   If,	for  some  reason,  you	 want  to  include   letter   ,	  in   one   of	  sym,	 write	 ,.   For   example,
	   -finstrument-functions-exclude-file-list=',,tmp' (note the single quote surrounding the option).

       -finstrument-functions-exclude-function-list=sym,sym,...
	   This	 is  similar to -finstrument-functions-exclude-file-list, but this option sets the list of function names to
	   be excluded from instrumentation.  The function name to be matched is its user-visible name, such as "vector
	   blah(const vector &)", not the internal mangled name (e.g., "_Z4blahRSt6vectorIiSaIiEE").  The match is done
	   on substrings: if the sym parameter is a substring of the function name, it is considered to be a match.  For C99
	   and C++ extended identifiers, the function name must be given in UTF-8, not using universal character names.

       -fpatchable-function-entry=N[,M]
	   Generate N NOPs right at the beginning of each function, with the function entry point before the Mth NOP.  If  M
	   is  omitted,	 it  defaults  to  0  so  the  function	 entry points to the address just at the first NOP.  The NOP
	   instructions reserve extra space which can be used to patch in any desired instrumentation at run time,  provided
	   that	 the  code  segment is writable.  The amount of space is controllable indirectly via the number of NOPs; the
	   NOP instruction used corresponds to the instruction emitted by the internal	GCC  back-end  interface  "gen_nop".
	   This	 behavior  is  target-specific	and  may  also	depend	on the architecture variant and/or other compilation
	   options.

	   For run-time identification, the starting addresses of these areas, which correspond to their respective function
	   entries minus M, are additionally collected	in  the	 "__patchable_function_entries"	 section  of  the  resulting
	   binary.

	   Note	 that  the  value  of  "__attribute__ ((patchable_function_entry (N,M)))" takes precedence over command-line
	   option -fpatchable-function-entry=N,M.  This can be used to increase the area size or to remove it completely  on
	   a single function.  If "N=0", no pad location is recorded.

	   The NOP instructions are inserted at---and maybe before, depending on M---the function entry address, even before
	   the	prologue.   On	PowerPC	 with the ELFv2 ABI, for a function with dual entry points, the local entry point is
	   this function entry address by default.  See the -msplit-patch-nops option to change this.

	   The maximum value of N and M is 65535.  On PowerPC with the ELFv2 ABI, for a function with dual entry points, the
	   supported values for M are 0, 2, 6 and 14 when not using -msplit-patch-nops.

   Options Controlling the Preprocessor
       These options control the C preprocessor, which is run on each C source file before actual compilation.

       If you use the -E option, nothing is done except preprocessing.	Some of these options make sense only together	with
       -E because they cause the preprocessor output to be unsuitable for actual compilation.

       In  addition  to	 the  options  listed  here, there are a number of options to control search paths for include files
       documented in Directory Options.	 Options to control preprocessor diagnostics are listed in Warning Options.

       -D name
	   Predefine name as a macro, with definition 1.

       -D name=definition
	   The contents of definition are tokenized and processed as if they appeared during translation phase	three  in  a
	   #define directive.  In particular, the definition is truncated by embedded newline characters.

	   If  you  are invoking the preprocessor from a shell or shell-like program you may need to use the shell's quoting
	   syntax to protect characters such as spaces that have a meaning in the shell syntax.

	   If you wish to define a function-like macro on the  command	line,  write  its  argument  list  with	 surrounding
	   parentheses	before the equals sign (if any).  Parentheses are meaningful to most shells, so you should quote the
	   option.  With sh and csh, -D'name(args...)=definition' works.

	   -D and -U options are processed in the order they are given on the command line.  All -imacros file and  -include
	   file options are processed after all -D and -U options.

       -U name
	   Cancel any previous definition of name, either built in or provided with a -D option.

       -include file
	   Process  file  as if "#include "file"" appeared as the first line of the primary source file.  However, the first
	   directory searched for file is the preprocessor's working directory instead of the directory containing the	main
	   source  file.   If  not  found there, it is searched for in the remainder of the "#include "..."" search chain as
	   normal.

	   If multiple -include options are given, the files are included in the order they appear on the command line.

       -imacros file
	   Exactly like -include, except that any output produced by scanning file is thrown away.  Macros it defines remain
	   defined.  This allows you to acquire all the macros from a header without also processing its declarations.

	   All files specified by -imacros are processed before all files specified by -include.

       -undef
	   Do not predefine any system-specific or GCC-specific macros.	 The standard predefined macros remain defined.

       -pthread
	   Define additional macros required for using the POSIX threads library.  You should use this	option	consistently
	   for	both  compilation  and linking.	 This option is supported on GNU/Linux targets, most other Unix derivatives,
	   and also on x86 Cygwin and MinGW targets.

       -M  Instead of outputting the result of preprocessing, output a rule suitable for make describing the dependencies of
	   the main source file.  The preprocessor outputs one make rule containing the object file  name  for	that  source
	   file, a colon, and the names of all the included files, including those coming from -include or -imacros command-
	   line options.

	   Unless  specified explicitly (with -MT or -MQ), the object file name consists of the name of the source file with
	   any suffix replaced with object file suffix and with any leading directory parts  removed.	If  there  are	many
	   included files then the rule is split into several lines using \-newline.  The rule has no commands.

	   This	 option	 does  not suppress the preprocessor's debug output, such as -dM.  To avoid mixing such debug output
	   with the dependency rules you should	 explicitly  specify  the  dependency  output  file  with  -MF,	 or  use  an
	   environment	variable  like	DEPENDENCIES_OUTPUT.   Debug  output  is  still sent to the regular output stream as
	   normal.

	   Passing -M to the driver implies -E, and suppresses warnings with an implicit -w.

       -MM Like -M but do not mention header files that are found in system header directories, nor header  files  that	 are
	   included, directly or indirectly, from such a header.

	   This	 implies  that	the  choice  of	 angle brackets or double quotes in an #include directive does not in itself
	   determine whether that header appears in -MM dependency output.

       -MF file
	   When used with -M or -MM, specifies a file to write	the  dependencies  to.	 If  no	 -MF  switch  is  given	 the
	   preprocessor sends the rules to the same place it would send preprocessed output.

	   When used with the driver options -MD or -MMD, -MF overrides the default dependency output file.

	   If file is -, then the dependencies are written to stdout.

       -MG In  conjunction  with an option such as -M requesting dependency generation, -MG assumes missing header files are
	   generated files and adds them to the dependency list without raising an error.  The dependency filename is  taken
	   directly  from the "#include" directive without prepending any path.	 -MG also suppresses preprocessed output, as
	   a missing header file renders this useless.

	   This feature is used in automatic updating of makefiles.

       -Mno-modules
	   Disable dependency generation for compiled module interfaces.

       -MP This option instructs CPP to add a phony target for each dependency other than the main  file,  causing  each  to
	   depend  on  nothing.	 These dummy rules work around errors make gives if you remove header files without updating
	   the Makefile to match.

	   This is typical output:

		   test.o: test.c test.h

		   test.h:

       -MT target
	   Change the target of the rule emitted by dependency generation.  By default CPP takes the name of the main  input
	   file,  deletes  any	directory components and any file suffix such as .c, and appends the platform's usual object
	   suffix.  The result is the target.

	   An -MT option sets the target to be exactly the string you specify.	 If  you  want	multiple  targets,  you	 can
	   specify them as a single argument to -MT, or use multiple -MT options.

	   For example, -MT '$(objpfx)foo.o' might give

		   $(objpfx)foo.o: foo.c

       -MQ target
	   Same as -MT, but it quotes any characters which are special to Make.	 -MQ '$(objpfx)foo.o' gives

		   $$(objpfx)foo.o: foo.c

	   The default target is automatically quoted, as if it were given with -MQ.

       -MD -MD	is equivalent to -M -MF file, except that -E is not implied.  The driver determines file based on whether an
	   -o option is given.	If it is, the driver uses its argument but with a suffix of .d, otherwise it takes the	name
	   of the input file, removes any directory components and suffix, and applies a .d suffix.

	   If  -MD is used in conjunction with -E, any -o switch is understood to specify the dependency output file, but if
	   used without -E, each -o is understood to specify a target object file.

	   Since -E is not implied, -MD can be used to generate a dependency output file as a side effect of the compilation
	   process.

       -MMD
	   Like -MD except mention only user header files, not system header files.

       -fpreprocessed
	   Indicate to the preprocessor that the input file has already been  preprocessed.   This  suppresses	things	like
	   macro  expansion,  trigraph	conversion,  escaped  newline  splicing,  and  processing  of  most directives.	 The
	   preprocessor still recognizes and removes comments, so that you can pass a  file  preprocessed  with	 -C  to	 the
	   compiler  without  problems.	  In  this  mode the integrated preprocessor is little more than a tokenizer for the
	   front ends.

	   -fpreprocessed is implicit if the input file has one of the extensions .i, .ii or .mi.  These are the  extensions
	   that GCC uses for preprocessed files created by -save-temps.

       -fdirectives-only
	   When preprocessing, handle directives, but do not expand macros.

	   The option's behavior depends on the -E and -fpreprocessed options.

	   With -E, preprocessing is limited to the handling of directives such as "#define", "#ifdef", and "#error".  Other
	   preprocessor operations, such as macro expansion and trigraph conversion are not performed.	In addition, the -dD
	   option is implicitly enabled.

	   With	 -fpreprocessed,  predefinition	 of  command  line  and	 most  builtin	macros	is disabled.  Macros such as
	   "__LINE__", which are contextually dependent, are handled normally.	This enables compilation of files previously
	   preprocessed with "-E -fdirectives-only".

	   With both -E and -fpreprocessed, the rules for -fpreprocessed take precedence.  This enables	 full  preprocessing
	   of files previously preprocessed with "-E -fdirectives-only".

       -fdollars-in-identifiers
	   Accept $ in identifiers.

       -fextended-identifiers
	   Accept  universal  character names and extended characters in identifiers.  This option is enabled by default for
	   C99 (and later C standard versions) and C++.

       -fno-canonical-system-headers
	   When preprocessing, do not shorten system header paths with canonicalization.

       -fmax-include-depth=depth
	   Set the maximum depth of the nested #include. The default is 200.

       -fsearch-include-path[=kind]
	   Look for input files on the #include path, not just the current directory.	This  is  particularly	useful	with
	   C++20 modules, for which both header units and module interface units need to be compiled directly:

		   g++ -c -std=c++20 -fmodules -fsearch-include-path bits/stdc++.h bits/std.cc

	   kind	 defaults to user, which looks on the #include "..." search path; you can also explicitly specify system for
	   the "#include <...>" search path.

       -ftabstop=width
	   Set the distance between tab stops.	This helps the preprocessor report correct column  numbers  in	warnings  or
	   errors, even if tabs appear on the line.  If the value is less than 1 or greater than 100, the option is ignored.
	   The default is 8.

       -ftrack-macro-expansion[=level]
	   Track  locations of tokens across macro expansions. This allows the compiler to emit diagnostic about the current
	   macro expansion stack when a compilation error  occurs  in  a  macro	 expansion.  Using  this  option  makes	 the
	   preprocessor	 and  the  compiler  consume  more  memory.  The  level parameter can be used to choose the level of
	   precision of token location tracking thus decreasing the memory consumption if necessary. Value 0  of  level	 de-
	   activates  this  option.  Value  1  tracks  tokens  locations  in  a degraded mode for the sake of minimal memory
	   overhead. In this mode all tokens resulting from the expansion of an argument of a function-like macro  have	 the
	   same	 location.  Value  2  tracks  tokens  locations completely. This value is the most memory hungry.  When this
	   option is given no argument, the default parameter value is 2.

	   Note that "-ftrack-macro-expansion=2" is activated by default.

       -fmacro-prefix-map=old=new
	   When preprocessing files residing in directory old, expand the "__FILE__" and "__BASE_FILE__" macros	 as  if	 the
	   files  resided in directory new instead.  This can be used to change an absolute path to a relative path by using
	   . for new which can result in more reproducible builds that are location independent.  This option  also  affects
	   "__builtin_FILE()" during compilation.  See also -ffile-prefix-map and -fcanon-prefix-map.

       -fexec-charset=charset
	   Set	the execution character set, used for string and character constants.  The default is UTF-8.  charset can be
	   any encoding supported by the system's "iconv" library routine.

       -fwide-exec-charset=charset
	   Set the wide execution character set, used for wide string and  character  constants.   The	default	 is  one  of
	   UTF-32BE,  UTF-32LE, UTF-16BE, or UTF-16LE, whichever corresponds to the width of "wchar_t" and the big-endian or
	   little-endian byte order being used for code generation.  As with -fexec-charset, charset  can  be  any  encoding
	   supported by the system's "iconv" library routine; however, you will have problems with encodings that do not fit
	   exactly in "wchar_t".

       -finput-charset=charset
	   Set	the  input  character  set,  used  for	translation  from  the character set of the input file to the source
	   character set used by GCC.  If the locale does not specify, or GCC cannot get this information from	the  locale,
	   the	default	 is  UTF-8.  This can be overridden by either the locale or this command-line option.  Currently the
	   command-line option takes precedence if there's a conflict.	 charset  can  be  any	encoding  supported  by	 the
	   system's "iconv" library routine.

       -fpch-deps
	   When	 using	precompiled  headers,  this  flag causes the dependency-output flags to also list the files from the
	   precompiled header's dependencies.  If not specified, only the precompiled header are listed and  not  the  files
	   that were used to create it, because those files are not consulted when a precompiled header is used.

       -fpch-preprocess
	   This	 option	 allows	 use of a precompiled header together with -E.	It inserts a special "#pragma", "#pragma GCC
	   pch_preprocess "filename"" in the output to mark the place where  the  precompiled  header  was  found,  and	 its
	   filename.  When -fpreprocessed is in use, GCC recognizes this "#pragma" and loads the PCH.

	   This option is off by default, because the resulting preprocessed output is only really suitable as input to GCC.
	   It is switched on by -save-temps.

	   You	should	not  write  this  "#pragma" in your own code, but it is safe to edit the filename if the PCH file is
	   available in a different location.  The filename may	 be  absolute  or  it  may  be	relative  to  GCC's  current
	   directory.

       -fworking-directory
	   Enable  generation  of  linemarkers	in  the	 preprocessor  output that let the compiler know the current working
	   directory at the time of preprocessing.  When this option is enabled, the preprocessor emits, after	the  initial
	   linemarker,	a  second  linemarker  with  the  current  working directory followed by two slashes.  GCC uses this
	   directory, when it's present in the preprocessed input, as the directory emitted as the current working directory
	   in some debugging information formats.  This option is implicitly enabled if debugging  information	is  enabled,
	   but this can be inhibited with the negated form -fno-working-directory.  If the -P flag is present in the command
	   line, this option has no effect, since no "#line" directives are emitted whatsoever.

       -A predicate=answer
	   Make	 an  assertion	with the predicate predicate and answer answer.	 This form is preferred to the older form -A
	   predicate(answer), which is still supported, because it does not use shell special characters.

       -A -predicate=answer
	   Cancel an assertion with the predicate predicate and answer answer.

       -C  Do not discard comments.  All comments are passed through to the output file, except for  comments  in  processed
	   directives, which are deleted along with the directive.

	   You	should be prepared for side effects when using -C; it causes the preprocessor to treat comments as tokens in
	   their own right.  For example, comments appearing at the start of what would be a directive line have the  effect
	   of turning that line into an ordinary source line, since the first token on the line is no longer a #.

       -CC Do  not  discard  comments,	including  during  macro expansion.  This is like -C, except that comments contained
	   within macros are also passed through to the output file where the macro is expanded.

	   In addition to the side effects of the -C option, the -CC option causes all C++-style comments inside a macro  to
	   be  converted  to C-style comments.	This is to prevent later use of that macro from inadvertently commenting out
	   the remainder of the source line.

	   The -CC option is generally used to support lint comments.

       -P  Inhibit generation of linemarkers in the output from the preprocessor.  This might be  useful  when	running	 the
	   preprocessor	 on  something	that  is  not  C  code, and will be sent to a program which might be confused by the
	   linemarkers.

       -traditional
       -traditional-cpp
	   Try to imitate the behavior of pre-standard C preprocessors, as opposed to ISO C preprocessors.  See the GNU	 CPP
	   manual for details.

	   Note	 that  GCC  does  not  otherwise  attempt  to  emulate a pre-standard C compiler, and these options are only
	   supported with the -E switch, or when invoking CPP explicitly.

       -trigraphs
	   Support ISO C trigraphs.  These are three-character sequences, all starting with ??, that are defined by ISO C to
	   stand for single characters.	 For example, ??/ stands for \, so '??/n' is a character constant for a newline.

	   The nine trigraphs and their replacements are

		   Trigraph:	   ??(	??)  ??<  ??>  ??=  ??/	 ??'  ??!  ??-
		   Replacement:	     [	  ]    {    }	 #    \	   ^	|    ~

	   By default, GCC ignores trigraphs, but in standard-conforming modes it converts them.  See  the  -std  and  -ansi
	   options.

       -remap
	   Enable special code to work around file systems which only permit very short file names, such as MS-DOS.

       -H  Print  the  name of each header file used, in addition to other normal activities.  Each name is indented to show
	   how deep in the #include stack it is.  Precompiled header files are also printed, even if they are  found  to  be
	   invalid; an invalid precompiled header file is printed with ...x and a valid one with ...! .

       -dletters
	   Says	 to  make  debugging  dumps during compilation as specified by letters.	 The flags documented here are those
	   relevant to the preprocessor.  Other letters are interpreted by the	compiler  proper,  or  reserved	 for  future
	   versions  of	 GCC,  and  so are silently ignored.  If you specify letters whose behavior conflicts, the result is
	   undefined.

	   -dM Instead of the normal output, generate a list of #define directives for all the	macros	defined	 during	 the
	       execution  of  the  preprocessor,  including  predefined macros.	 This gives you a way of finding out what is
	       predefined in your version of the preprocessor.	Assuming you have no file foo.h, the command

		       touch foo.h; cpp -dM foo.h

	       shows all the predefined macros.

	       If you use -dM without the -E option, -dM is interpreted as a synonym for -fdump-rtl-mach.

	   -dD Like -dM except that it outputs both the #define directives and the result of preprocessing.  Both  kinds  of
	       output go to the standard output file.

	   -dN Like -dD, but emit only the macro names, not their expansions.

	   -dI Output #include directives in addition to the result of preprocessing.

	   -dU Like  -dD  except  that	only  macros  that  are	 expanded,  or	whose  definedness is tested in preprocessor
	       directives, are output; the output is delayed until the use or test of the macro; and #undef  directives	 are
	       also output for macros tested but undefined at the time.

       -fdebug-cpp
	   This	 option	 is  only  useful  for debugging GCC.  When used from CPP or with -E, it dumps debugging information
	   about location maps.	 Every token in the output is preceded by the dump of the map its location belongs to.

	   When used from GCC without -E, this option has no effect.

       -Wp,option
	   You can use -Wp,option to bypass the compiler driver and pass option directly through to  the  preprocessor.	  If
	   option  contains  commas,  it  is split into multiple options at the commas.	 However, many options are modified,
	   translated or interpreted by the compiler driver before being  passed  to  the  preprocessor,  and  -Wp  forcibly
	   bypasses  this  phase.   The	 preprocessor's	 direct interface is undocumented and subject to change, so whenever
	   possible you should avoid using -Wp and let the driver handle the options instead.

       -Xpreprocessor option
	   Pass option as an option to the preprocessor.  You can use this to supply  system-specific  preprocessor  options
	   that GCC does not recognize.

	   If  you want to pass an option that takes an argument, you must use -Xpreprocessor twice, once for the option and
	   once for the argument.

       -no-integrated-cpp
	   Perform preprocessing as a separate pass before compilation.	  By  default,	GCC  performs  preprocessing  as  an
	   integrated  part  of	 input tokenization and parsing.  If this option is provided, the appropriate language front
	   end (cc1, cc1plus, or cc1obj for C, C++, and Objective-C,  respectively)  is	 instead  invoked  twice,  once	 for
	   preprocessing  only	and  once  for	actual	compilation of the preprocessed input.	This option may be useful in
	   conjunction with the -B or -wrapper options to specify an alternate preprocessor or perform additional processing
	   of the program source between normal preprocessing and compilation.

   Passing Options to the Assembler
       You can pass options to the assembler.

       -Wa,option
	   Pass option as an option to the assembler.  If option contains commas, it is split into multiple options  at	 the
	   commas.

       -Xassembler option
	   Pass option as an option to the assembler.  You can use this to supply system-specific assembler options that GCC
	   does not recognize.

	   If  you  want  to  pass an option that takes an argument, you must use -Xassembler twice, once for the option and
	   once for the argument.

   Options for Linking
       These options come into play when the compiler  links  object  files  into  an  executable  output  file.   They	 are
       meaningless if the compiler is not doing a link step.

       object-file-name
	   A  file  name  that	does not end in a special recognized suffix is considered to name an object file or library.
	   (Object files are distinguished from libraries by the linker according to the  file	contents.)   If	 linking  is
	   done, these object files are used as input to the linker.

       -c
       -S
       -E  If  any  of	these  options	is  used,  then	 the  linker is not run, and object file names should not be used as
	   arguments.

       -flinker-output=type
	   This option controls code generation of the link-time optimizer.  By default the linker output  is  automatically
	   determined  by  the	linker	plugin.	 For debugging the compiler and if incremental linking with a non-LTO object
	   file is desired, it may be useful to control the type manually.

	   If type is exec, code generation produces a static binary. In this case -fpic and -fpie are both disabled.

	   If type is dyn, code generation produces a shared library.  In this case -fpic or -fPIC  is	preserved,  but	 not
	   enabled  automatically.  This allows to build shared libraries without position-independent code on architectures
	   where this is possible, i.e. on x86.

	   If type is pie, code generation produces an -fpie executable. This  results	in  similar  optimizations  as	exec
	   except that -fpie is not disabled if specified at compilation time.

	   If type is rel, the compiler assumes that incremental linking is done.  The sections containing intermediate code
	   for	link-time  optimization	 are merged, pre-optimized, and output to the resulting object file. In addition, if
	   -ffat-lto-objects is specified, binary code is produced for future non-LTO linking. The object file	produced  by
	   incremental	linking	 is  smaller  than  a  static library produced from the same object files.  At link time the
	   result of incremental linking also loads faster than a static library assuming that the majority  of	 objects  in
	   the library are used.

	   Finally nolto-rel configures the compiler for incremental linking where code generation is forced, a final binary
	   is  produced,  and the intermediate code for later link-time optimization is stripped. When multiple object files
	   are linked together the resulting code is better  optimized	than  with  link-time  optimizations  disabled	(for
	   example, cross-module inlining happens), but most of benefits of whole program optimizations are lost.

	   During the incremental link (by -r) the linker plugin defaults to rel. With current interfaces to GNU Binutils it
	   is  however	not  possible to incrementally link LTO objects and non-LTO objects into a single mixed object file.
	   If any of object files in incremental link cannot be used for link-time optimization, the linker plugin issues  a
	   warning  and	 uses nolto-rel. To maintain whole program optimization, it is recommended to link such objects into
	   static library instead. Alternatively it is possible to use H.J. Lu's binutils with support for mixed objects.

       -fuse-ld=bfd
	   Use the bfd linker instead of the default linker.

       -fuse-ld=gold
	   Use the gold linker instead of the default linker.

       -fuse-ld=lld
	   Use the LLVM lld linker instead of the default linker.

       -fuse-ld=mold
	   Use the Modern Linker (mold) instead of the default linker.

       -llibrary
       -l library
	   Search the library named library when linking.  (The second alternative with the library as a  separate  argument
	   is only for POSIX compliance and is not recommended.)

	   The	-l  option  is	passed directly to the linker by GCC.  Refer to your linker documentation for exact details.
	   The general description below applies to the GNU linker.

	   The linker searches a standard list of directories for the library.	The  directories  searched  include  several
	   standard system directories plus any that you specify with -L.

	   Static  libraries are archives of object files, and have file names like liblibrary.a.  Some targets also support
	   shared libraries, which typically have names like liblibrary.so.  If both static and shared libraries are  found,
	   the linker gives preference to linking with the shared library unless the -static option is used.

	   It makes a difference where in the command you write this option; the linker searches and processes libraries and
	   object  files  in  the  order  they are specified.  Thus, foo.o -lz bar.o searches library z after file foo.o but
	   before bar.o.  If bar.o refers to functions in z, those functions may not be loaded.

       -lobjc
	   You need this special case of the -l option in order to link an Objective-C or Objective-C++ program.

       -nostartfiles
	   Do not use the standard system startup files when linking.  The standard  system  libraries	are  used  normally,
	   unless -nostdlib, -nolibc, or -nodefaultlibs is used.

       -nodefaultlibs
	   Do  not use the standard system libraries when linking.  Only the libraries you specify are passed to the linker,
	   and options specifying linkage of the system libraries, such as -static-libgcc or  -shared-libgcc,  are  ignored.
	   The standard startup files are used normally, unless -nostartfiles is used.

	   The	compiler  may  generate	 calls	to  "memcmp",  "memset",  "memcpy" and "memmove".  These entries are usually
	   resolved by entries in libc.	 These entry points should be supplied through some other mechanism when this option
	   is specified.

       -nolibc
	   Do not use the C library or system libraries tightly coupled with it when linking.  Still link with	the  startup
	   files,  libgcc  or toolchain provided language support libraries such as libgnat, libgfortran or libstdc++ unless
	   options preventing their inclusion are used as well.	 This typically removes -lc from the link command  line,  as
	   well	 as system libraries that normally go with it and become meaningless when absence of a C library is assumed,
	   for example -lpthread or -lm in some configurations.	 This is intended  for	bare-board  targets  when  there  is
	   indeed no C library available.

       -nostdlib
	   Do  not use the standard system startup files or libraries when linking.  No startup files and only the libraries
	   you specify are passed to  the  linker,  and	 options  specifying  linkage  of  the	system	libraries,  such  as
	   -static-libgcc or -shared-libgcc, are ignored.

	   The	compiler  may  generate	 calls	to  "memcmp",  "memset",  "memcpy" and "memmove".  These entries are usually
	   resolved by entries in libc.	 These entry points should be supplied through some other mechanism when this option
	   is specified.

	   One of the standard libraries bypassed by -nostdlib	and  -nodefaultlibs  is	 libgcc.a,  a  library	of  internal
	   subroutines which GCC uses to overcome shortcomings of particular machines, or special needs for some languages.

	   In  most cases, you need libgcc.a even when you want to avoid other standard libraries.  In other words, when you
	   specify -nostdlib or -nodefaultlibs you should usually specify -lgcc as well.  This	ensures	 that  you  have  no
	   unresolved  references  to  internal	 GCC  library  subroutines.   (An  example of such an internal subroutine is
	   "__main", used to ensure C++ constructors are called.)

       -nostdlib++
	   Do not implicitly link with standard C++ libraries.

       -e entry
       --entry=entry
	   Specify that the program entry point is entry.  The argument is interpreted by the linker; the GNU linker accepts
	   either a symbol name or an address.

       -pie
	   Produce a dynamically linked position independent  executable  on  targets  that  support  it.   For	 predictable
	   results,  you  must also specify the same set of options used for compilation (-fpie, -fPIE, or model suboptions)
	   when you specify this linker option.

       -no-pie
	   Don't produce a dynamically linked position independent executable.

       -static-pie
	   Produce a static position independent executable on targets that  support  it.   A  static  position	 independent
	   executable  is  similar  to	a static executable, but can be loaded at any address without a dynamic linker.	 For
	   predictable results, you must also specify the same set of options used for compilation (-fpie, -fPIE,  or  model
	   suboptions) when you specify this linker option.

       -pthread
	   Link with the POSIX threads library.	 This option is supported on GNU/Linux targets, most other Unix derivatives,
	   and	also  on x86 Cygwin and MinGW targets.	On some targets this option also sets flags for the preprocessor, so
	   it should be used consistently for both compilation and linking.

       -r  Produce a relocatable object as output.  This is also known as partial linking.

       -rdynamic
	   Pass the flag -export-dynamic to the ELF linker, on targets that support it. This instructs the linker to add all
	   symbols, not only used ones, to the dynamic symbol table. This option is needed for some uses of "dlopen"  or  to
	   allow obtaining backtraces from within a program.

       -s  Remove all symbol table and relocation information from the executable.

       -static
	   On  systems that support dynamic linking, this overrides -pie and prevents linking with the shared libraries.  On
	   other systems, this option has no effect.

       -shared
	   Produce a shared object which can then be linked with other objects to  form	 an  executable.   Not	all  systems
	   support this option.	 For predictable results, you must also specify the same set of options used for compilation
	   (-fpic, -fPIC, or model suboptions) when you specify this linker option.[1]

       -shared-libgcc
       -static-libgcc
	   On  systems	that  provide libgcc as a shared library, these options force the use of either the shared or static
	   version, respectively.  If no shared version of libgcc was built when the compiler was configured, these  options
	   have no effect.

	   There  are several situations in which an application should use the shared libgcc instead of the static version.
	   The most common of these is when the application wishes to throw and catch  exceptions  across  different  shared
	   libraries.  In that case, each of the libraries as well as the application itself should use the shared libgcc.

	   Therefore,  the  G++	 driver	 automatically	adds  -shared-libgcc  whenever	you build a shared library or a main
	   executable, because C++ programs typically use exceptions, so this is the right thing to do.

	   If, instead, you use the GCC driver to create shared libraries, you may find that they are not always linked with
	   the shared libgcc.  If GCC finds, at its configuration time, that you have a non-GNU linker or a GNU linker	that
	   does	 not  support option --eh-frame-hdr, it links the shared version of libgcc into shared libraries by default.
	   Otherwise, it takes advantage of the linker and optimizes away the linking with the	shared	version	 of  libgcc,
	   linking  with  the  static version of libgcc by default.  This allows exceptions to propagate through such shared
	   libraries, without incurring relocation costs at library load time.

	   However, if a library or main executable is supposed to throw or catch exceptions, you must link it using the G++
	   driver, or using the option -shared-libgcc, such that it is linked with the shared libgcc.

       -static-libasan
	   When the -fsanitize=address option is used to link a program, the GCC driver automatically links against libasan.
	   If libasan is available as a shared library, and the -static option is not used,  then  this	 links	against	 the
	   shared version of libasan.  The -static-libasan option directs the GCC driver to link libasan statically, without
	   necessarily linking other libraries statically.

       -static-libtsan
	   When	 the -fsanitize=thread option is used to link a program, the GCC driver automatically links against libtsan.
	   If libtsan is available as a shared library, and the -static option is not used,  then  this	 links	against	 the
	   shared version of libtsan.  The -static-libtsan option directs the GCC driver to link libtsan statically, without
	   necessarily linking other libraries statically.

       -static-liblsan
	   When	 the  -fsanitize=leak  option is used to link a program, the GCC driver automatically links against liblsan.
	   If liblsan is available as a shared library, and the -static option is not used,  then  this	 links	against	 the
	   shared version of liblsan.  The -static-liblsan option directs the GCC driver to link liblsan statically, without
	   necessarily linking other libraries statically.

       -static-libubsan
	   When	 the  -fsanitize=undefined  option  is	used  to  link a program, the GCC driver automatically links against
	   libubsan.  If libubsan is available as a shared library, and the -static option is  not  used,  then	 this  links
	   against  the	 shared	 version  of  libubsan.	 The -static-libubsan option directs the GCC driver to link libubsan
	   statically, without necessarily linking other libraries statically.

       -static-libstdc++
	   When the g++ program is used to link a C++ program,	it  normally  automatically  links  against  libstdc++.	  If
	   libstdc++  is  available  as	 a  shared  library, and the -static option is not used, then this links against the
	   shared version of libstdc++.	 That is normally fine.	 However, it is sometimes useful to freeze  the	 version  of
	   libstdc++  used  by	the  program without going all the way to a fully static link.	The -static-libstdc++ option
	   directs the g++ driver to link libstdc++ statically, without necessarily linking other libraries statically.

       -symbolic
	   Bind references to global symbols when building a shared object.  Warn about any  unresolved	 references  (unless
	   overridden by the link editor option -Xlinker -z -Xlinker defs).  Only a few systems support this option.

       -T script
	   Use	script	as  the	 linker	 script.   This	 option	 is supported by most systems using the GNU linker.  On some
	   targets, such as bare-board targets without an operating system, the -T option may be required  when	 linking  to
	   avoid references to undefined symbols.

       -Xlinker option
	   Pass	 option as an option to the linker.  You can use this to supply system-specific linker options that GCC does
	   not recognize.

	   If you want to pass an option that takes a separate argument, you must use -Xlinker twice, once  for	 the  option
	   and	once  for  the argument.  For example, to pass -assert definitions, you must write -Xlinker -assert -Xlinker
	   definitions.	 It does not work to write -Xlinker "-assert definitions", because this passes the entire string  as
	   a single argument, which is not what the linker expects.

	   When	 using	the  GNU  linker,  it  is  usually  more  convenient  to  pass arguments to linker options using the
	   option=value syntax than as separate arguments.  For example, you can  specify  -Xlinker  -Map=output.map  rather
	   than -Xlinker -Map -Xlinker output.map.  Other linkers may not support this syntax for command-line options.

       -Wl,option
	   Pass	 option	 as  an	 option	 to the linker.	 If option contains commas, it is split into multiple options at the
	   commas.  You can use this syntax to pass an argument to the option.	For example, -Wl,-Map,output.map passes -Map
	   output.map to the linker.  When using the GNU linker, you can also get the same effect with -Wl,-Map=output.map.

	   NOTE: In Ubuntu 8.10 and later versions,  for  LDFLAGS,  the	 option	 -Wl,-z,relro  is  used.   To  disable,	 use
	   -Wl,-z,norelro.

       -u symbol
	   Pretend  the	 symbol	 symbol	 is  undefined,	 to  force  linking of library modules to define it.  You can use -u
	   multiple times with different symbols to force loading of additional library modules.

       -z keyword
	   -z is passed directly on to the linker along with the keyword keyword. See the section in  the  documentation  of
	   your linker for permitted values and their meanings.

   Options for Directory Search
       These options specify directories to search for header files, for libraries and for parts of the compiler:

       -I dir
       -iquote dir
       -isystem dir
       -idirafter dir
	   Add	the  directory	dir to the list of directories to be searched for header files during preprocessing.  If dir
	   begins with = or $SYSROOT, then the = or $SYSROOT is replaced by the sysroot prefix; see --sysroot and -isysroot.

	   Directories specified with -iquote apply only to the quote form of the directive, "#include "file"".	 Directories
	   specified with -I, -isystem, or -idirafter apply to lookup for both the "#include "file""  and  "#include "
	   directives.

	   You	can  specify  any  number  or combination of these options on the command line to search for header files in
	   several directories.	 The lookup order is as follows:

	   1.  For the quote form of the include directive, the directory of the current file is searched first.

	   2.  For the quote form of the include directive, the directories specified by -iquote  options  are	searched  in
	       left-to-right order, as they appear on the command line.

	   3.  Directories specified with -I options are scanned in left-to-right order.

	   4.  Directories specified with -isystem options are scanned in left-to-right order.

	   5.  Standard system directories are scanned.

	   6.  Directories specified with -idirafter options are scanned in left-to-right order.

	   You	can  use  -I  to  override  a system header file, substituting your own version, since these directories are
	   searched before the standard system header file directories.	 However, you should not  use  this  option  to	 add
	   directories that contain vendor-supplied system header files; use -isystem for that.

	   The	-isystem  and  -idirafter  options  also  mark the directory as a system directory, so that it gets the same
	   special treatment that is applied to the standard system directories.

	   If a standard system include directory, or a directory specified with -isystem, is also specified with -I, the -I
	   option is ignored.  The directory is still searched but as a system directory  at  its  normal  position  in	 the
	   system  include  chain.   This is to ensure that GCC's procedure to fix buggy system headers and the ordering for
	   the "#include_next" directive are not inadvertently changed.	 If you really need to change the search  order	 for
	   system directories, use the -nostdinc and/or -isystem options.

       -I- Split  the  include path.  This option has been deprecated.	Please use -iquote instead for -I directories before
	   the -I- and remove the -I- option.

	   Any	directories  specified	with  -I  options  before  -I-	are  searched  only  for  headers   requested	with
	   "#include "file"";  they are not searched for "#include ".  If additional directories are specified with -I
	   options after the -I-, those directories are searched for all #include directives.

	   In addition, -I- inhibits the use of the directory of the current file directory as the  first  search  directory
	   for "#include "file"".  There is no way to override this effect of -I-.

       -iprefix prefix
	   Specify  prefix  as	the  prefix  for subsequent -iwithprefix options.  If the prefix represents a directory, you
	   should include the final /.

       -iwithprefix dir
       -iwithprefixbefore dir
	   Append dir to the prefix specified previously with -iprefix, and add	 the  resulting	 directory  to	the  include
	   search path.	 -iwithprefixbefore puts it in the same place -I would; -iwithprefix puts it where -idirafter would.

       -isysroot dir
	   This	 option	 is like the --sysroot option, but applies only to header files (except for Darwin targets, where it
	   applies to both header files and libraries).	 See the --sysroot option for more information.

       -imultilib dir
	   Use dir as a subdirectory of the directory containing target-specific C++ headers.

       -nostdinc
	   Do not search the standard system directories for header files.  Only the directories explicitly  specified	with
	   -I,	-iquote,  -isystem,  and/or  -idirafter	 options (and the directory of the current file, if appropriate) are
	   searched.

       -nostdinc++
	   Do not search for header files in the C++-specific standard directories, but do still search the  other  standard
	   directories.	 (This option is used when building the C++ library.)

       --embed-dir=dir
	   Append  dir	directory  to the list of searched directories for "#embed" preprocessing directive or "__has_embed"
	   macro.  There are no default directories for "#embed".

	   If dir begins with = or $SYSROOT, then the = or $SYSROOT is replaced by the sysroot	prefix;	 see  --sysroot	 and
	   -isysroot.

       -iplugindir=dir
	   Set	the directory to search for plugins that are passed by -fplugin=name instead of -fplugin=path/name.so.	This
	   option is not meant to be used by the user, but only passed by the driver.

       -Ldir
	   Add directory dir to the list of directories to be searched for -l.

       -Bprefix
	   This option specifies where to find the executables, libraries, include files, and data  files  of  the  compiler
	   itself.

	   The compiler driver program runs one or more of the subprograms cpp, cc1, as and ld.	 It tries prefix as a prefix
	   for each program it tries to run, both with and without machine/version/ for the corresponding target machine and
	   compiler version.

	   For each subprogram to be run, the compiler driver first tries the -B prefix, if any.  If that name is not found,
	   or  if  -B  is  not specified, the driver tries two standard prefixes, /usr/lib/gcc/ and /usr/local/lib/gcc/.  If
	   neither of those results in a file name that is found, the unmodified program name  is  searched  for  using	 the
	   directories specified in your PATH environment variable.

	   The compiler checks to see if the path provided by -B refers to a directory, and if necessary it adds a directory
	   separator character at the end of the path.

	   -B  prefixes that effectively specify directory names also apply to libraries in the linker, because the compiler
	   translates these options into -L options for the linker.  They also apply to include files in  the  preprocessor,
	   because  the	 compiler  translates  these  options into -isystem options for the preprocessor.  In this case, the
	   compiler appends include to the prefix.

	   The runtime support file libgcc.a can also be searched for using the -B prefix, if needed.  If it  is  not  found
	   there, the two standard prefixes above are tried, and that is all.  The file is left out of the link if it is not
	   found by those means.

	   Another way to specify a prefix much like the -B prefix is to use the environment variable GCC_EXEC_PREFIX.

	   As  a  special kludge, if the path provided by -B is [dir/]stageN/, where N is a number in the range 0 to 9, then
	   it is replaced by [dir/]include.  This is to help with boot-strapping the compiler.

       -no-canonical-prefixes
	   Do not expand any symbolic links, resolve references to /../ or /./, or make the path absolute when generating  a
	   relative prefix.

       --sysroot=dir
	   Use	dir as the logical root directory for headers and libraries.  For example, if the compiler normally searches
	   for headers in /usr/include and libraries in /usr/lib, it instead searches dir/usr/include and dir/usr/lib.

	   If you use both this option and the -isysroot option, then the --sysroot option applies  to	libraries,  but	 the
	   -isysroot option applies to header files.

	   The	GNU linker (beginning with version 2.16) has the necessary support for this option.  If your linker does not
	   support this option, the header file aspect of --sysroot still works, but the library aspect does not.

       --no-sysroot-suffix
	   For some targets, a suffix is added to the root directory  specified	 with  --sysroot,  depending  on  the  other
	   options  used,  so  that  headers  may for example be found in dir/suffix/usr/include instead of dir/usr/include.
	   This option disables the addition of such a suffix.

   Options for Code Generation Conventions
       These machine-independent options control the interface conventions used in code generation.

       Most of them have both positive and negative forms; the negative form of -ffoo is -fno-foo.  In the table below, only
       one of the forms is listed---the one that is not the default.  You can figure out the other form by  either  removing
       no- or adding it.

       -fstack-reuse=reuse-level
	   This option controls stack space reuse for user declared local/auto variables and compiler generated temporaries.
	   reuse_level	can  be	 all,  named_vars, or none. all enables stack reuse for all local variables and temporaries,
	   named_vars enables the reuse only for user defined local variables with names,  and	none  disables	stack  reuse
	   completely.	The  default  value  is	 all. The option is needed when the program extends the lifetime of a scoped
	   local variable or a compiler generated temporary beyond the end point defined by the language.  When	 a  lifetime
	   of  a  variable  ends,  and if the variable lives in memory, the optimizing compiler has the freedom to reuse its
	   stack space with other temporaries or scoped local variables whose live range does not overlap  with	 it.  Legacy
	   code extending local lifetime is likely to break with the stack reuse optimization.

	   For example,

		      int *p;
		      {
			int local1;

			p = &local1;
			local1 = 10;
			....
		      }
		      {
			 int local2;
			 local2 = 20;
			 ...
		      }

		      if (*p == 10)  // out of scope use of local1
			{

			}

	   Another example:

		      struct A
		      {
			  A(int k) : i(k), j(k) { }
			  int i;
			  int j;
		      };

		      A *ap;

		      void foo(const A& ar)
		      {
			 ap = &ar;
		      }

		      void bar()
		      {
			 foo(A(10)); // temp object's lifetime ends when foo returns

			 {
			   A a(20);
			   ....
			 }
			 ap->i+= 10;  // ap references out of scope temp whose space
				      // is reused with a. What is the value of ap->i?
		      }

	   The	lifetime  of  a	 compiler  generated  temporary	 is  well  defined by the C++ standard. When a lifetime of a
	   temporary ends, and if the temporary lives in memory, the optimizing compiler has the freedom to reuse its  stack
	   space with other temporaries or scoped local variables whose live range does not overlap with it. However some of
	   the	legacy	code  relies on the behavior of older compilers in which temporaries' stack space is not reused, the
	   aggressive stack reuse can lead to runtime errors. This option is used  to  control	the  temporary	stack  reuse
	   optimization.

       -ftrapv
	   This option generates traps for signed overflow on addition, subtraction, multiplication operations.	 The options
	   -ftrapv  and	 -fwrapv  override each other, so using -ftrapv -fwrapv on the command-line results in -fwrapv being
	   effective.  Note that only active options override, so using	 -ftrapv  -fwrapv  -fno-wrapv  on  the	command-line
	   results in -ftrapv being effective.

       -fwrapv
	   This	 option	 instructs  the	 compiler  to  assume  that  signed arithmetic overflow of addition, subtraction and
	   multiplication wraps around using twos-complement representation.   This  flag  enables  some  optimizations	 and
	   disables  others.   The options -ftrapv and -fwrapv override each other, so using -ftrapv -fwrapv on the command-
	   line results in -fwrapv being effective.  Note that only  active  options  override,	 so  using  -ftrapv  -fwrapv
	   -fno-wrapv on the command-line results in -ftrapv being effective.

       -fwrapv-pointer
	   This	 option	 instructs the compiler to assume that pointer arithmetic overflow on addition and subtraction wraps
	   around using twos-complement representation.	 This flag disables some optimizations which assume pointer overflow
	   is invalid.

       -fstrict-overflow
	   This option implies -fno-wrapv -fno-wrapv-pointer and when negated implies -fwrapv -fwrapv-pointer.

       -fexceptions
	   Enable exception handling.  Generates extra code needed to propagate exceptions.  For some targets, this  implies
	   GCC	generates  frame  unwind  information  for  all functions, which can produce significant data size overhead,
	   although it does not affect execution.  If you do not  specify  this	 option,  GCC  enables	it  by	default	 for
	   languages  like  C++	 that  normally require exception handling, and disables it for languages like C that do not
	   normally require it.	 However, you may  need	 to  enable  this  option  when	 compiling  C  code  that  needs  to
	   interoperate	 properly  with	 exception handlers written in C++.  You may also wish to disable this option if you
	   are compiling older C++ programs that don't use exception handling.

       -fnon-call-exceptions
	   Generate code that allows trapping instructions to throw exceptions.	 Note that this	 requires  platform-specific
	   runtime  support  that  does	 not  exist  everywhere.   Moreover,  it  only allows trapping instructions to throw
	   exceptions, i.e. memory references or floating-point instructions.  It does not allow  exceptions  to  be  thrown
	   from arbitrary signal handlers such as "SIGALRM".  This enables -fexceptions.

       -fdelete-dead-exceptions
	   Consider  that  instructions	 that  may  throw  exceptions but don't otherwise contribute to the execution of the
	   program can be optimized away.  This does not affect calls to functions except those with the "pure"	 or  "const"
	   attributes.	 This  option  is  enabled  by	default	 for the Ada and C++ compilers, as permitted by the language
	   specifications.  Optimization passes that cause dead exceptions  to	be  removed  are  enabled  independently  at
	   different optimization levels.

       -funwind-tables
	   Similar  to -fexceptions, except that it just generates any needed static data, but does not affect the generated
	   code in any other way.  You normally do not need to enable this option; instead, a language processor that  needs
	   this handling enables it on your behalf.

       -fasynchronous-unwind-tables
	   Generate  unwind  table  in DWARF format, if supported by target machine.  The table is exact at each instruction
	   boundary, so it can be used for stack unwinding from asynchronous events (such as debugger or garbage collector).

       -fno-gnu-unique
	   On systems with recent GNU assembler and C library, the C++ compiler uses the "STB_GNU_UNIQUE"  binding  to	make
	   sure	 that  definitions of template static data members and static local variables in inline functions are unique
	   even in the presence of "RTLD_LOCAL"; this is necessary to avoid problems with a library used  by  two  different
	   "RTLD_LOCAL"	 plugins depending on a definition in one of them and therefore disagreeing with the other one about
	   the binding of the symbol.  But this causes "dlclose" to be ignored for affected DSOs; if your program relies  on
	   reinitialization of a DSO via "dlclose" and "dlopen", you can use -fno-gnu-unique.

       -fpcc-struct-return
	   Return "short" "struct" and "union" values in memory like longer ones, rather than in registers.  This convention
	   is  less  efficient,	 but  it has the advantage of allowing intercallability between GCC-compiled files and files
	   compiled with other compilers, particularly the Portable C Compiler (pcc).

	   The precise convention for returning structures in memory depends on the target configuration macros.

	   Short structures and unions are those whose size and alignment match that of some integer type.

	   Warning: code compiled with the -fpcc-struct-return switch is not binary compatible with code compiled  with	 the
	   -freg-struct-return switch.	Use it to conform to a non-default application binary interface.

       -freg-struct-return
	   Return  "struct" and "union" values in registers when possible.  This is more efficient for small structures than
	   -fpcc-struct-return.

	   If you specify neither -fpcc-struct-return nor -freg-struct-return,	GCC  defaults  to  whichever  convention  is
	   standard  for  the  target.	 If  there is no standard convention, GCC defaults to -fpcc-struct-return, except on
	   targets where GCC is the principal compiler.	 In those cases, we can choose the standard, and we chose  the	more
	   efficient register return alternative.

	   Warning:  code  compiled with the -freg-struct-return switch is not binary compatible with code compiled with the
	   -fpcc-struct-return switch.	Use it to conform to a non-default application binary interface.

       -fshort-enums
	   Allocate to an "enum" type only  as	many  bytes  as	 it  needs  for	 the  declared	range  of  possible  values.
	   Specifically,  the  "enum" type is equivalent to the smallest integer type that has enough room.  This option has
	   no effect for an enumeration type with a fixed underlying type.

	   Warning: the -fshort-enums switch causes GCC to generate code that is not binary compatible with  code  generated
	   without that switch.	 Use it to conform to a non-default application binary interface.

       -fshort-wchar
	   Override  the  underlying  type  for	 "wchar_t" to be "short unsigned int" instead of the default for the target.
	   This option is useful for building programs to run under WINE.

	   Warning: the -fshort-wchar switch causes GCC to generate code that is not binary compatible with  code  generated
	   without that switch.	 Use it to conform to a non-default application binary interface.

       -fcommon
	   In  C  code,	 this  option  controls	 the  placement of global variables defined without an initializer, known as
	   tentative definitions in the C standard.  Tentative definitions are distinct from declarations of a variable with
	   the "extern" keyword, which do not allocate storage.

	   The default is -fno-common, which specifies that the compiler places uninitialized global variables	in  the	 BSS
	   section  of	the  object  file.   This  inhibits  the merging of tentative definitions by the linker so you get a
	   multiple-definition error if the same variable is accidentally defined in more than one compilation unit.

	   The -fcommon places uninitialized global variables in a common block.  This allows  the  linker  to	resolve	 all
	   tentative  definitions  of  the  same  variable  in	different compilation units to the same object, or to a non-
	   tentative definition.  This behavior is inconsistent with C++, and on many targets implies a speed and code	size
	   penalty on global variable references.  It is mainly useful to enable legacy code to link without errors.

       -fno-ident
	   Ignore the "#ident" directive.

       -finhibit-size-directive
	   Don't output a ".size" assembler directive, or anything else that would cause trouble if the function is split in
	   the	middle,	 and the two halves are placed at locations far apart in memory.  This option is used when compiling
	   crtstuff.c; you should not need to use it for anything else.

       -fverbose-asm
	   Put extra commentary information in the generated assembly code  to	make  it  more	readable.   This  option  is
	   generally only of use to those who actually need to read the generated assembly code (perhaps while debugging the
	   compiler itself).

	   -fno-verbose-asm,  the  default,  causes  the  extra	 information  to be omitted and is useful when comparing two
	   assembler files.

	   The added comments include:

	   *   information on the compiler version and command-line options,

	   *   the source code lines associated with the assembly instructions, in the form  FILENAME:LINENUMBER:CONTENT  OF
	       LINE,

	   *   hints on which high-level expressions correspond to the various assembly instruction operands.

	   For example, given this C source file:

		   int test (int n)
		   {
		     int i;
		     int total = 0;

		     for (i = 0; i < n; i++)
		       total += i * i;

		     return total;
		   }

	   compiling to (x86_64) assembly via -S and emitting the result direct to stdout via -o -

		   gcc -S test.c -fverbose-asm -Os -o -

	   gives output similar to this:

			   .file   "test.c"
		   # GNU C11 (GCC) version 7.0.0 20160809 (experimental) (x86_64-pc-linux-gnu)
		     [...snip...]
		   # options passed:
		     [...snip...]

			   .text
			   .globl  test
			   .type   test, @function
		   test:
		   .LFB0:
			   .cfi_startproc
		   # test.c:4:	 int total = 0;
			   xorl	   %eax, %eax	   # 
		   # test.c:6:	 for (i = 0; i < n; i++)
			   xorl	   %edx, %edx	   # i
		   .L2:
		   # test.c:6:	 for (i = 0; i < n; i++)
			   cmpl	   %edi, %edx	   # n, i
			   jge	   .L5	   #,
		   # test.c:7:	   total += i * i;
			   movl	   %edx, %ecx	   # i, tmp92
			   imull   %edx, %ecx	   # i, tmp92
		   # test.c:6:	 for (i = 0; i < n; i++)
			   incl	   %edx	   # i
		   # test.c:7:	   total += i * i;
			   addl	   %ecx, %eax	   # tmp92, 
			   jmp	   .L2	   #
		   .L5:
		   # test.c:10: }
			   ret
			   .cfi_endproc
		   .LFE0:
			   .size   test, .-test
			   .ident  "GCC: (GNU) 7.0.0 20160809 (experimental)"
			   .section	   .note.GNU-stack,"",@progbits

	   The comments are intended for humans rather than machines and hence the precise format of the comments is subject
	   to change.

       -frecord-gcc-switches
	   This switch causes the command line used to invoke the compiler to be recorded into the object file that is being
	   created.   This  switch  is	only implemented on some targets and the exact format of the recording is target and
	   binary file format dependent, but it usually takes the form of a section containing ASCII text.  This  switch  is
	   related  to	the  -fverbose-asm  switch, but that switch only records information in the assembler output file as
	   comments, so it never reaches the object file.   See	 also  -grecord-gcc-switches  for  another  way	 of  storing
	   compiler options into the object file.

       -fpic
	   Generate  position-independent  code	 (PIC)	suitable  for  use  in a shared library, if supported for the target
	   machine.  Such code accesses all constant addresses through a global offset	table  (GOT).	The  dynamic  loader
	   resolves  the  GOT  entries	when  the  program  starts (the dynamic loader is not part of GCC; it is part of the
	   operating system).  If the GOT size for the linked executable exceeds a machine-specific maximum size, you get an
	   error message from the linker indicating that -fpic does not work; in that case, recompile  with  -fPIC  instead.
	   (These maximums are 8k on the SPARC, 28k on AArch64 and 32k on the m68k and RS/6000.	 The x86 has no such limit.)

	   Position-independent	 code  requires special support, and therefore works only on certain machines.	For the x86,
	   GCC supports PIC for System V but not for the Sun 386i.  Code generated for the IBM RS/6000 is  always  position-
	   independent.

	   When this flag is set, the macros "__pic__" and "__PIC__" are defined to 1.

       -fPIC
	   If  supported  for  the target machine, emit position-independent code, suitable for dynamic linking and avoiding
	   any limit on the size of the global offset table.  This option makes a difference on AArch64, m68k,	PowerPC	 and
	   SPARC.

	   Position-independent code requires special support, and therefore works only on certain machines.

	   When this flag is set, the macros "__pic__" and "__PIC__" are defined to 2.

       -fpie
       -fPIE
	   These options are similar to -fpic and -fPIC, but the generated position-independent code can be only linked into
	   executables.	 Usually these options are used to compile code that will be linked using the -pie GCC option.

	   -fpie  and -fPIE both define the macros "__pie__" and "__PIE__".  The macros have the value 1 for -fpie and 2 for
	   -fPIE.

       -fno-plt
	   Do not use the PLT for external function calls in position-independent code.	 Instead, load the callee address at
	   call sites from the GOT and branch to it.  This leads to  more  efficient  code  by	eliminating  PLT  stubs	 and
	   exposing  GOT loads to optimizations.  On architectures such as 32-bit x86 where PLT stubs expect the GOT pointer
	   in a specific register, this gives more register allocation freedom to the compiler.	 Lazy binding  requires	 use
	   of the PLT; with -fno-plt all external symbols are resolved at load time.

	   Alternatively,  the	function  attribute "noplt" can be used to avoid calls through the PLT for specific external
	   functions.

	   In position-dependent code, a few targets also convert calls to functions that are marked to not use the  PLT  to
	   use the GOT instead.

       -fno-jump-tables
	   Do  not  use	 jump  tables for switch statements even where it would be more efficient than other code generation
	   strategies.	This option is of use in conjunction with -fpic or -fPIC for building code  that  forms	 part  of  a
	   dynamic  linker  and cannot reference the address of a jump table.  On some targets, jump tables do not require a
	   GOT and this option is not needed.

       -fno-bit-tests
	   Do not use bit tests for switch statements even where it would be  more  efficient  than  other  code  generation
	   strategies.

       -ffixed-reg
	   Treat  the  register	 named reg as a fixed register; generated code should never refer to it (except perhaps as a
	   stack pointer, frame pointer or in some other fixed role).

	   reg must be the name of a register.	The register names accepted are machine-specific  and  are  defined  in	 the
	   "REGISTER_NAMES" macro in the machine description macro file.

	   This flag does not have a negative form, because it specifies a three-way choice.

       -fcall-used-reg
	   Treat  the  register named reg as an allocable register that is clobbered by function calls.	 It may be allocated
	   for temporaries or variables that do not live across a call.	 Functions compiled this way do not save and restore
	   the register reg.

	   It is an error to use this flag with the frame pointer or stack pointer.  Use of this flag  for  other  registers
	   that have fixed pervasive roles in the machine's execution model produces disastrous results.

	   This flag does not have a negative form, because it specifies a three-way choice.

       -fcall-saved-reg
	   Treat  the  register	 named	reg  as	 an  allocable	register  saved	 by functions.	It may be allocated even for
	   temporaries or variables that live across a call.  Functions compiled this way save and restore the register	 reg
	   if they use it.

	   It  is  an  error to use this flag with the frame pointer or stack pointer.	Use of this flag for other registers
	   that have fixed pervasive roles in the machine's execution model produces disastrous results.

	   A different sort of disaster results from the use of this flag for a register in which  function  values  may  be
	   returned.

	   This flag does not have a negative form, because it specifies a three-way choice.

       -fpack-struct[=n]
	   Without  a  value specified, pack all structure members together without holes.  When a value is specified (which
	   must be a small power of two), pack structure members according to this value, representing the maximum alignment
	   (that is, objects with default alignment requirements larger than this are output potentially  unaligned  at	 the
	   next fitting location.

	   Warning:  the  -fpack-struct switch causes GCC to generate code that is not binary compatible with code generated
	   without that switch.	 Additionally, it makes the code suboptimal.  Use it to conform to a non-default application
	   binary interface.

       -fleading-underscore
	   This option and its counterpart, -fno-leading-underscore, forcibly change the way C symbols	are  represented  in
	   the object file.  One use is to help link with legacy assembly code.

	   Warning:  the  -fleading-underscore	switch	causes	GCC to generate code that is not binary compatible with code
	   generated without that switch.  Use it to conform to a non-default application binary interface.  Not all targets
	   provide complete support for this switch.

       -ftls-model=model
	   Alter the thread-local storage model to be used.  The model argument should	be  one	 of  global-dynamic,  local-
	   dynamic,  initial-exec  or  local-exec.   Note that the choice is subject to optimization: the compiler may use a
	   more efficient model for symbols not visible outside of the translation unit, or if -fpic is	 not  given  on	 the
	   command line.

	   The default without -fpic is initial-exec; with -fpic the default is global-dynamic.

       -ftrampolines
	   For	targets	 that  normally	 need  trampolines  for	 nested	 functions,  always  generate  them instead of using
	   descriptors.	 Otherwise, for targets that do not need them, like for example HP-PA or IA-64, do nothing.

	   A trampoline is a small piece of code that is created at run time on the stack  when	 the  address  of  a  nested
	   function  is	 taken,	 and is used to call the nested function indirectly.  Therefore, it requires the stack to be
	   made executable in order for the program to work properly.

	   -fno-trampolines is enabled by default on a language by language basis to let the compiler avoid generating them,
	   if it computes that this is safe, and replace them with descriptors.	 Descriptors are made up of data  only,	 but
	   the	generated  code	 must  be  prepared  to	 deal with them.  As of this writing, -fno-trampolines is enabled by
	   default only for Ada.

	   Moreover, code compiled with -ftrampolines and code compiled with -fno-trampolines are not binary  compatible  if
	   nested functions are present.  This option must therefore be used on a program-wide basis and be manipulated with
	   extreme care.

	   For	languages  other  than Ada, the "-ftrampolines" and "-fno-trampolines" options currently have no effect, and
	   trampolines are always generated on platforms that need them for nested functions.

       -ftrampoline-impl=[stack|heap]
	   By default, trampolines are generated on stack.  However, certain platforms (such as the Apple M1) do not  permit
	   an executable stack.	 Compiling with -ftrampoline-impl=heap generate calls to "__gcc_nested_func_ptr_created" and
	   "__gcc_nested_func_ptr_deleted"  in	order  to  allocate  and deallocate trampoline space on the executable heap.
	   These functions are implemented in libgcc, and will only be provided on specific targets: x86_64  Darwin,  x86_64
	   and aarch64 Linux.  PLEASE NOTE: Heap trampolines are not guaranteed to be correctly deallocated if you "setjmp",
	   instantiate	nested	functions,  and	 then  "longjmp"  back	to  a  state  prior to having allocated those nested
	   functions.

       -fvisibility=[default|internal|hidden|protected]
	   Set the default ELF image symbol visibility to the specified option---all symbols are  marked  with	this  unless
	   overridden  within  the code.  Using this feature can very substantially improve linking and load times of shared
	   object libraries, produce more optimized code, provide near-perfect API export and prevent symbol clashes.  It is
	   strongly recommended that you use this in any shared objects you distribute.

	   Despite the nomenclature, default always means public; i.e., available to be	 linked	 against  from	outside	 the
	   shared  object.   protected	and  internal are pretty useless in real-world usage so the only other commonly used
	   option is hidden.  The default if -fvisibility isn't specified is default, i.e., make every symbol public.

	   A good explanation of the benefits offered by ensuring ELF symbols have the correct visibility is given  by	"How
	   To Write Shared Libraries" by Ulrich Drepper (which can be found at )---however
	   a  superior	solution made possible by this option to marking things hidden when the default is public is to make
	   the default hidden and mark things public.  This is the norm with DLLs on Windows  and  with	 -fvisibility=hidden
	   and	"__attribute__	((visibility("default")))"  instead  of	 "__declspec(dllexport)"  you  get  almost identical
	   semantics with identical syntax.  This is a great boon to those working with cross-platform projects.

	   For those adding visibility support to existing code, you may find "#pragma GCC visibility" of use.	 This  works
	   by  you  enclosing  the  declarations  you  wish to set visibility for with (for example) "#pragma GCC visibility
	   push(hidden)" and "#pragma GCC visibility pop".  Bear in mind that symbol visibility should be viewed as part  of
	   the	API  interface	contract  and thus all new code should always specify visibility when it is not the default;
	   i.e., declarations only for use within the local DSO should always be marked explicitly as hidden as so to  avoid
	   PLT	indirection  overheads---making	 this  abundantly  clear also aids readability and self-documentation of the
	   code.  Note that due to ISO C++ specification requirements, "operator new" and "operator delete" must  always  be
	   of default visibility.

	   Be  aware that headers from outside your project, in particular system headers and headers from any other library
	   you use, may not be expecting to be compiled with visibility other than the default.	 You may need to  explicitly
	   say "#pragma GCC visibility push(default)" before including any such headers.

	   "extern"   declarations   are   not	affected  by  -fvisibility,  so	 a  lot	 of  code  can	be  recompiled	with
	   -fvisibility=hidden with no modifications.  However, this means that calls to "extern" functions with no explicit
	   visibility use the PLT, so it  is  more  effective  to  use	"__attribute  ((visibility))"  and/or  "#pragma	 GCC
	   visibility" to tell the compiler which "extern" declarations should be treated as hidden.

	   Note	 that -fvisibility does affect C++ vague linkage entities. This means that, for instance, an exception class
	   that is be thrown between DSOs must be explicitly marked with default visibility so that the type_info nodes	 are
	   unified between the DSOs.

	   An overview of these techniques, their benefits and how to use them is at .

       -fstrict-volatile-bitfields
	   This	 option	 should be used if accesses to volatile bit-fields (or other structure fields, although the compiler
	   usually honors those types anyway) should use a single access of the width of the  field's  type,  aligned  to  a
	   natural  alignment  if  possible.  For example, targets with memory-mapped peripheral registers might require all
	   such accesses to be 16 bits wide; with this flag you can declare all peripheral bit-fields  as  "unsigned  short"
	   (assuming  short  is	 16  bits  on these targets) to force GCC to use 16-bit accesses instead of, perhaps, a more
	   efficient 32-bit access.

	   If this option is disabled, the compiler uses the most efficient instruction.   In  the  previous  example,	that
	   might  be  a 32-bit load instruction, even though that accesses bytes that do not contain any portion of the bit-
	   field, or memory-mapped registers unrelated to the one being updated.

	   In some cases, such as when the "packed" attribute is applied to a structure field, it may  not  be	possible  to
	   access  the field with a single read or write that is correctly aligned for the target machine.  In this case GCC
	   falls back to generating multiple accesses rather than code that will fault or truncate the result at run time.

	   Note:  Due to restrictions of the C/C++11 memory model, write accesses are not allowed  to  touch  non  bit-field
	   members.  It is therefore recommended to define all bits of the field's type as bit-field members.

	   The default value of this option is determined by the application binary interface for the target processor.

       -fsync-libcalls
	   This	 option	 controls  whether  any	 out-of-line  instance	of  the	 "__sync" family of functions may be used to
	   implement the C++11 "__atomic" family of functions.

	   The default value of this option is enabled, thus the only useful form of the option is -fno-sync-libcalls.	This
	   option is used in the implementation of the libatomic runtime library.

       -fzero-init-padding-bits=value
	   Guarantee zero initialization of padding bits in automatic variable initializers.   Certain	languages  guarantee
	   zero	 initialization of padding bits in certain cases, e.g. C23 when using empty initializers ("{}"), or C++ when
	   using zero-initialization or C guarantees that fields not specified in an initializer  have	their  padding	bits
	   zero	 initialized.	This  option  allows  to  change when padding bits in initializers are guaranteed to be zero
	   initialized.	 The default is "-fzero-init-padding-bits=standard", which makes  no  further  guarantees  than	 the
	   corresponding standard.  E.g.

		     struct A { char a; unsigned long long b; char c; };
		     union B { char a; unsigned long long b; };
		     struct A a = {}; // C23 guarantees padding bits are zero.
		     struct A b = { 1, 2, 3 }; // No guarantees.
		     union B c = {}; // C23 guarantees padding bits are zero.
		     union B d = { 1 }; // No guarantees.

	   "-fzero-init-padding-bits=unions"  guarantees  zero	initialization	of padding bits in unions on top of what the
	   standards guarantee, if the initializer of an union is empty (then all bits of the union are zero initialized) or
	   if the initialized member of the union is smaller than the size of the union (in  that  case	 guarantees  padding
	   bits	 outside  of the initialized member to be zero initialized).  This was the GCC behavior before GCC 15 and in
	   the above example guarantees zero initialization of last "sizeof (unsigned long long) - 1" bytes in the union.

	   "-fzero-init-padding-bits=all" guarantees additionally zero initialization of padding bits of  other	 aggregates,
	   so the padding in between "b.a" and "b.b" (if any) and tail padding in the structure (if any).

	   NOTE:  In  Ubuntu  25.10 and later versions, -fzero-init-padding-bits=all is enabled by default for C, C++, ObjC,
	   ObjC++, unless -fzero-init-padding-bits=standard is found.

   GCC Developer Options
       This section describes command-line options that are primarily of interest to GCC developers,  including	 options  to
       support	compiler  testing  and	investigation of compiler bugs and compile-time performance problems.  This includes
       options that produce debug dumps at various points in the compilation; that print statistics such as memory  use	 and
       execution  time;	 and that print information about GCC's configuration, such as where it searches for libraries.	 You
       should rarely need to use any of these options for ordinary compilation and linking tasks.

       Many developer options that cause GCC to dump output to a file take an optional =filename  suffix.  You	can  specify
       stdout or - to dump to standard output, and stderr for standard error.

       If  =filename  is  omitted,  a default dump file name is constructed by concatenating the base dump file name, a pass
       number, phase letter, and pass name.  The base dump file name is the name of output file produced by the compiler  if
       explicitly  specified  and not an executable; otherwise it is the source file name.  The pass number is determined by
       the order passes are registered with the compiler's pass manager.  This	is  generally  the  same  as  the  order  of
       execution, but passes registered by plugins, target-specific passes, or passes that are otherwise registered late are
       numbered	 higher	 than the pass named final, even if they are executed earlier.	The phase letter is one of i (inter-
       procedural analysis), l (language-specific), r (RTL), or t (tree).  The files are created in  the  directory  of	 the
       output file.

       -fcallgraph-info
       -fcallgraph-info=MARKERS
	   Makes  the compiler output callgraph information for the program, on a per-object-file basis.  The information is
	   generated in the common VCG format.	It can be decorated with additional, per-node and/or  per-edge	information,
	   if a list of comma-separated markers is additionally specified.  When the "su" marker is specified, the callgraph
	   is decorated with stack usage information; it is equivalent to -fstack-usage.  When the "da" marker is specified,
	   the callgraph is decorated with information about dynamically allocated objects.

	   When	 compiling  with  -flto,  no  callgraph information is output along with the object file.  At LTO link time,
	   -fcallgraph-info may generate multiple callgraph information files next to intermediate LTO output files.

       -dletters
       -fdump-rtl-pass
       -fdump-rtl-pass=filename
	   Says to make debugging dumps during compilation at times specified by letters.  This is used	 for  debugging	 the
	   RTL-based passes of the compiler.

	   Some -dletters switches have different meaning when -E is used for preprocessing.

	   Debug dumps can be enabled with a -fdump-rtl switch or some -d option letters.  Here are the possible letters for
	   use in pass and letters, and their meanings:

	   -fdump-rtl-alignments
	       Dump after branch alignments have been computed.

	   -fdump-rtl-asmcons
	       Dump after fixing rtl statements that have unsatisfied in/out constraints.

	   -fdump-rtl-auto_inc_dec
	       Dump  after  auto-inc-dec  discovery.   This pass is only run on architectures that have auto inc or auto dec
	       instructions.

	   -fdump-rtl-barriers
	       Dump after cleaning up the barrier instructions.

	   -fdump-rtl-bbpart
	       Dump after partitioning hot and cold basic blocks.

	   -fdump-rtl-bbro
	       Dump after block reordering.

	   -fdump-rtl-btl1
	   -fdump-rtl-btl2
	       -fdump-rtl-btl1 and -fdump-rtl-btl2 enable dumping after the two branch target load optimization passes.

	   -fdump-rtl-bypass
	       Dump after jump bypassing and control flow optimizations.

	   -fdump-rtl-combine
	       Dump after the RTL instruction combination pass.

	   -fdump-rtl-compgotos
	       Dump after duplicating the computed gotos.

	   -fdump-rtl-ce1
	   -fdump-rtl-ce2
	   -fdump-rtl-ce3
	       -fdump-rtl-ce1, -fdump-rtl-ce2, and -fdump-rtl-ce3 enable dumping after the three if conversion passes.

	   -fdump-rtl-cprop_hardreg
	       Dump after hard register copy propagation.

	   -fdump-rtl-csa
	       Dump after combining stack adjustments.

	   -fdump-rtl-cse1
	   -fdump-rtl-cse2
	       -fdump-rtl-cse1 and -fdump-rtl-cse2 enable dumping after the two common subexpression elimination passes.

	   -fdump-rtl-dce
	       Dump after the standalone dead code elimination passes.

	   -fdump-rtl-dbr
	       Dump after delayed branch scheduling.

	   -fdump-rtl-dce1
	   -fdump-rtl-dce2
	       -fdump-rtl-dce1 and -fdump-rtl-dce2 enable dumping after the two dead store elimination passes.

	   -fdump-rtl-eh
	       Dump after finalization of EH handling code.

	   -fdump-rtl-eh_ranges
	       Dump after conversion of EH handling range regions.

	   -fdump-rtl-expand
	       Dump after RTL generation.

	   -fdump-rtl-fwprop1
	   -fdump-rtl-fwprop2
	       -fdump-rtl-fwprop1 and -fdump-rtl-fwprop2 enable dumping after the two forward propagation passes.

	   -fdump-rtl-gcse1
	   -fdump-rtl-gcse2
	       -fdump-rtl-gcse1 and -fdump-rtl-gcse2 enable dumping after global common subexpression elimination.

	   -fdump-rtl-init-regs
	       Dump after the initialization of the registers.

	   -fdump-rtl-initvals
	       Dump after the computation of the initial value sets.

	   -fdump-rtl-into_cfglayout
	       Dump after converting to cfglayout mode.

	   -fdump-rtl-ira
	       Dump after iterated register allocation.

	   -fdump-rtl-jump
	       Dump after the second jump optimization.

	   -fdump-rtl-loop2
	       -fdump-rtl-loop2 enables dumping after the rtl loop optimization passes.

	   -fdump-rtl-mach
	       Dump after performing the machine dependent reorganization pass, if that pass exists.

	   -fdump-rtl-mode_sw
	       Dump after removing redundant mode switches.

	   -fdump-rtl-rnreg
	       Dump after register renumbering.

	   -fdump-rtl-outof_cfglayout
	       Dump after converting from cfglayout mode.

	   -fdump-rtl-peephole2
	       Dump after the peephole pass.

	   -fdump-rtl-postreload
	       Dump after post-reload optimizations.

	   -fdump-rtl-pro_and_epilogue
	       Dump after generating the function prologues and epilogues.

	   -fdump-rtl-sched1
	   -fdump-rtl-sched2
	       -fdump-rtl-sched1 and -fdump-rtl-sched2 enable dumping after the basic block scheduling passes.

	   -fdump-rtl-ree
	       Dump after sign/zero extension elimination.

	   -fdump-rtl-seqabstr
	       Dump after common sequence discovery.

	   -fdump-rtl-shorten
	       Dump after shortening branches.

	   -fdump-rtl-split1
	   -fdump-rtl-split2
	   -fdump-rtl-split3
	   -fdump-rtl-split4
	   -fdump-rtl-split5
	       These options enable dumping after five rounds of instruction splitting.

	   -fdump-rtl-sms
	       Dump after modulo scheduling.  This pass is only run on some architectures.

	   -fdump-rtl-stack
	       Dump after conversion from GCC's "flat register file" registers to the x87's stack-like registers.  This pass
	       is only run on x86 variants.

	   -fdump-rtl-subreg1
	   -fdump-rtl-subreg2
	       -fdump-rtl-subreg1 and -fdump-rtl-subreg2 enable dumping after the two subreg expansion passes.

	   -fdump-rtl-vartrack
	       Dump after variable tracking.

	   -fdump-rtl-vregs
	       Dump after converting virtual registers to hard registers.

	   -fdump-rtl-web
	       Dump after live range splitting.

	   -fdump-rtl-regclass
	   -fdump-rtl-subregs_of_mode_init
	   -fdump-rtl-subregs_of_mode_finish
	   -fdump-rtl-dfinit
	   -fdump-rtl-dfinish
	       These dumps are defined but always produce empty files.

	   -da
	   -fdump-rtl-all
	       Produce all the dumps listed above.

	   -dA Annotate the assembler output with miscellaneous debugging information.

	   -dD Dump all macro definitions, at the end of preprocessing, in addition to normal output.

	   -dH Produce a core dump whenever an error occurs.

	   -dp Annotate the assembler output with a comment indicating which pattern and alternative is	 used.	 The  length
	       and cost of each instruction are also printed.

	   -dP Dump the RTL in the assembler output as a comment before each instruction.  Also turns on -dp annotation.

	   -dx Just generate RTL for a function instead of compiling it.  Usually used with -fdump-rtl-expand.

       -fdump-debug
	   Dump debugging information generated during the debug generation phase.

       -fdump-earlydebug
	   Dump debugging information generated during the early debug generation phase.

       -fdump-noaddr
	   When	 doing debugging dumps, suppress address output.  This makes it more feasible to use diff on debugging dumps
	   for compiler invocations with different compiler binaries and/or different text / bss / data / heap / stack / dso
	   start locations.

       -freport-bug
	   Collect and dump debug information into a temporary file if an internal compiler error (ICE) occurs.

       -fdump-unnumbered
	   When doing debugging dumps, suppress instruction numbers and address output.	 This makes it more feasible to	 use
	   diff on debugging dumps for compiler invocations with different options, in particular with and without -g.

       -fdump-unnumbered-links
	   When	 doing debugging dumps (see -d option above), suppress instruction numbers for the links to the previous and
	   next instructions in a sequence.

       -fdump-ipa-switch
       -fdump-ipa-switch-options
	   Control the dumping at various stages of inter-procedural analysis language tree to a file.	 The  file  name  is
	   generated  by  appending  a	switch	specific suffix to the source file name, and the file is created in the same
	   directory as the output file.  The following dumps are possible:

	   all Enables all inter-procedural analysis dumps.

	   cgraph
	       Dumps information about call-graph optimization, unused function removal, and inlining decisions.

	   inline
	       Dump after function inlining.

	   strubm
	       Dump after selecting "strub" modes, and recording the selections as function attributes.

	   strub
	       Dump "strub" transformations: interface changes, function wrapping, and insertion of builtin calls for  stack
	       scrubbing and watermarking.

	   Additionally,  the  options	-optimized,  -missed,  -note, and -all can be provided, with the same meaning as for
	   -fopt-info, defaulting to -optimized.

	   For example, -fdump-ipa-inline-optimized-missed will emit information on callsites that were inlined, along	with
	   callsites that were not inlined.

	   By  default,	 the  dump  will contain messages about successful optimizations (equivalent to -optimized) together
	   with low-level details about the analysis.

       -fdump-ipa-clones
	   Create a dump file containing information about creation of call graph node clones and  removals  of	 call  graph
	   nodes during inter-procedural optimizations and transformations.  Its main intended use is that tools that create
	   live-patches	 can  determine the set of functions that need to be live-patched to completely replace a particular
	   function (see -flive-patching).  The file name is generated by appending suffix "ipa-clones" to the	source	file
	   name,  and the file is created in the same directory as the output file.  Each entry in the file is on a separate
	   line containing semicolon separated fields.

	   In the case of call graph clone creation, the individual fields are:

	   1.  String "Callgraph clone".

	   2.  Name of the function being cloned as it is presented to the assembler.

	   3.  A number that uniquely represents the function being cloned in the call	graph.	 Note  that  the  number  is
	       unique  only  within a compilation unit or within whole-program analysis but is likely to be different in the
	       two phases.

	   4.  The file name of the source file where the function is defined.

	   5.  The line on which the function definition is located.

	   6.  The column where the function definition is located.

	   7.  Name of the new function clone as it is presented to the assembler.

	   8.  A number that uniquely represents the new function clone in the call graph.  Note that the number  is  unique
	       only  within  a	compilation  unit  or within whole-program analysis but is likely to be different in the two
	       phases.

	   9.  The file name of the source file where the source code location of the new clone points to.

	   10. The line to which the source code location of the new clone points to.

	   11. The column to which the source code location of the new clone points to.

	   12. A string that determines the reason for cloning.

	   In the case of call graph clone removal, the individual fields are:

	   1.  String "Callgraph removal".

	   2.  Name of the function being removed as it would be presented to the assembler.

	   3.  A number that uniquely represents the function being cloned in the call	graph.	 Note  that  the  number  is
	       unique  only  within a compilation unit or within whole-program analysis but is likely to be different in the
	       two phases.

	   4.  The file name of the source file where the function is defined.

	   5.  The line on which the function definition is located.

	   6.  The column where the function definition is located.

       -fdump-lang
	   Dump language-specific information.	The file name is made by appending .lang to the source file name.

       -fdump-lang-all
       -fdump-lang-switch
       -fdump-lang-switch-options
       -fdump-lang-switch-options=filename
	   Control the dumping of language-specific information.  The options and filename portions behave as  described  in
	   the -fdump-tree option.  The following switch values are accepted:

	   all Enable all language-specific dumps.

	   class
	       Dump  class  hierarchy  information.   Virtual table information is emitted unless 'slim' is specified.	This
	       option is applicable to C++ only.

	   module
	       Dump  module  information.   Options  lineno  (locations),  graph  (reachability),  blocks  (clusters),	 uid
	       (serialization),	 alias	(mergeable),  asmname  (Elrond),  eh (mapper) & vops (macros) may provide additional
	       information.  This option is applicable to C++ only.

	   raw Dump the raw internal tree data.	 This option is applicable to C++ only.

       -fdump-passes
	   Print on stderr the list of optimization passes that are turned on and off by the current command-line options.

       -fdump-statistics-option
	   Enable and control dumping of pass statistics in a separate file.  The file name  is	 generated  by	appending  a
	   suffix ending in .statistics to the source file name, and the file is created in the same directory as the output
	   file.   If  the  -option  form is used, -stats causes counters to be summed over the whole compilation unit while
	   -details dumps every event as the passes generate them.  The default with no option is to sum counters  for	each
	   function compiled.

       -fdump-tree-all
       -fdump-tree-switch
       -fdump-tree-switch-options
       -fdump-tree-switch-options=filename
	   Control  the	 dumping  at various stages of processing the intermediate language tree to a file.  If the -options
	   form is used, options is a list of - separated options which control the details of the dump.   Not	all  options
	   are applicable to all dumps; those that are not meaningful are ignored.  The following options are available

	   address
	       Print  the  address  of each node.  Usually this is not meaningful as it changes according to the environment
	       and source file.	 Its primary use is for tying up a dump file with a debug environment.

	   asmname
	       If "DECL_ASSEMBLER_NAME" has been set for a given decl, use that in the dump  instead  of  "DECL_NAME".	 Its
	       primary use is ease of use working backward from mangled names in the assembly file.

	   slim
	       When  dumping  front-end	 intermediate  representations,	 inhibit  dumping of members of a scope or body of a
	       function merely because that scope has been reached.  Only dump such items when they are	 directly  reachable
	       by some other path.

	       When dumping pretty-printed trees, this option inhibits dumping the bodies of control structures.

	       When dumping RTL, print the RTL in slim (condensed) form instead of the default LISP-like representation.

	   raw Print a raw representation of the tree.	By default, trees are pretty-printed into a C-like representation.

	   details
	       Enable more detailed dumps (not honored by every dump option). Also include information from the optimization
	       passes.

	   stats
	       Enable dumping various statistics about the pass (not honored by every dump option).

	   blocks
	       Enable showing basic block boundaries (disabled in raw dumps).

	   graph
	       For each of the other indicated dump files (-fdump-rtl-pass), dump a representation of the control flow graph
	       suitable for viewing with GraphViz to file.passid.pass.dot.  Each function in the file is pretty-printed as a
	       subgraph, so that GraphViz can render them all in a single plot.

	       This option currently only works for RTL dumps, and the RTL is always dumped in slim form.

	   vops
	       Enable showing virtual operands for every statement.

	   lineno
	       Enable showing line numbers for statements.

	   uid Enable showing the unique ID ("DECL_UID") for each variable.

	   verbose
	       Enable showing the tree dump for each statement.

	   eh  Enable showing the EH region number holding each statement.

	   scev
	       Enable showing scalar evolution analysis details.

	   optimized
	       Enable showing optimization information (only available in certain passes).

	   missed
	       Enable showing missed optimization information (only available in certain passes).

	   note
	       Enable other detailed optimization information (only available in certain passes).

	   all Turn on all options, except raw, slim, verbose and lineno.

	   optall
	       Turn on all optimization options, i.e., optimized, missed, and note.

	   To determine what tree dumps are available or find the dump for a pass of interest follow the steps below.

	   1.  Invoke  GCC  with -fdump-passes and in the stderr output look for a code that corresponds to the pass you are
	       interested in.  For example, the codes "tree-evrp", "tree-vrp1", and  "tree-vrp2"  correspond  to  the  three
	       Value Range Propagation passes.	The number at the end distinguishes distinct invocations of the same pass.

	   2.  To  enable  the	creation  of the dump file, append the pass code to the -fdump- option prefix and invoke GCC
	       with it.	 For example, to enable the dump from the Early Value Range Propagation pass, invoke  GCC  with	 the
	       -fdump-tree-evrp	 option.   Optionally, you may specify the name of the dump file.  If you don't specify one,
	       GCC creates as described below.

	   3.  Find the pass dump in a file whose name is composed of three components separated by a period:  the  name  of
	       the  source  file  GCC  was  invoked  to compile, a numeric suffix indicating the pass number followed by the
	       letter t for tree passes (and the letter r for RTL passes), and finally the  pass  code.	  For  example,	 the
	       Early  VRP pass dump might be in a file named myfile.c.038t.evrp in the current working directory.  Note that
	       the numeric codes are not stable and may change from one version of GCC to another.

       -fopt-info
       -fopt-info-options
       -fopt-info-options=filename
	   Controls optimization dumps from various optimization passes. If the -options form is used, options is a list  of
	   - separated option keywords to select the dump details and optimizations.

	   The options can be divided into three groups:

	   1.  options describing what kinds of messages should be emitted,

	   2.  options describing the verbosity of the dump, and

	   3.  options describing which optimizations should be included.

	   The	options	 from each group can be freely mixed as they are non-overlapping. However, in case of any conflicts,
	   the later options override the earlier options on the command line.

	   The following options control which kinds of messages should be emitted:

	   optimized
	       Print information when an optimization is  successfully	applied.  It  is  up  to  a  pass  to  decide  which
	       information  is	relevant.  For	example,  the vectorizer passes print the source location of loops which are
	       successfully vectorized.

	   missed
	       Print information about missed optimizations. Individual passes control which information to include  in	 the
	       output.

	   note
	       Print  verbose information about optimizations, such as certain transformations, more detailed messages about
	       decisions etc.

	   all Print detailed optimization information. This includes optimized, missed, and note.

	   The following option controls the dump verbosity:

	   internals
	       By default, only "high-level" messages are emitted. This option enables additional, more detailed,  messages,
	       which are likely to only be of interest to GCC developers.

	   One or more of the following option keywords can be used to describe a group of optimizations:

	   ipa Enable dumps from all interprocedural optimizations.

	   loop
	       Enable dumps from all loop optimizations.

	   inline
	       Enable dumps from all inlining optimizations.

	   omp Enable dumps from all OMP (Offloading and Multi Processing) optimizations.

	   vec Enable dumps from all vectorization optimizations.

	   optall
	       Enable dumps from all optimizations. This is a superset of the optimization groups listed above.

	   If  options	is  omitted,  it  defaults  to	optimized-optall,  which  means	 to  dump  messages about successful
	   optimizations from all the passes, omitting messages that are treated as "internals".

	   If the filename is provided, then the dumps from all the  applicable	 optimizations	are  concatenated  into	 the
	   filename.  Otherwise the dump is output onto stderr. Though multiple -fopt-info options are accepted, only one of
	   them can include a filename. If other filenames are provided then all but the first such option are ignored.

	   Note	 that  the  output  filename is overwritten in case of multiple translation units. If a combined output from
	   multiple translation units is desired, stderr should be used instead.

	   In the following example, the optimization info is output to stderr:

		   gcc -O3 -fopt-info

	   This example:

		   gcc -O3 -fopt-info-missed=missed.all

	   outputs missed optimization report from all the passes into missed.all, and this one:

		   gcc -O2 -ftree-vectorize -fopt-info-vec-missed

	   prints information about missed optimization opportunities  from  vectorization  passes  on	stderr.	  Note	that
	   -fopt-info-vec-missed  is  equivalent  to  -fopt-info-missed-vec.   The order of the optimization group names and
	   message types listed after -fopt-info does not matter.

	   As another example,

		   gcc -O3 -fopt-info-inline-optimized-missed=inline.txt

	   outputs information about missed optimizations as well as optimized locations from all the inlining	passes	into
	   inline.txt.

	   Finally, consider:

		   gcc -fopt-info-vec-missed=vec.miss -fopt-info-loop-optimized=loop.opt

	   Here	 the  two  output  filenames vec.miss and loop.opt are in conflict since only one output file is allowed. In
	   this case, only the first option takes effect and the subsequent options  are  ignored.  Thus  only	vec.miss  is
	   produced which contains dumps from the vectorizer about missed opportunities.

       -fsave-optimization-record
	   Write a SRCFILE.opt-record.json.gz file detailing what optimizations were performed, for those optimizations that
	   support -fopt-info.

	   This option is experimental and the format of the data within the compressed JSON file is subject to change.

	   It is roughly equivalent to a machine-readable version of -fopt-info-all, as a collection of messages with source
	   file, line number and column number, with the following additional data for each message:

	   *   the  execution  count  of  the  code  being optimized, along with metadata about whether this was from actual
	       profile data, or just an estimate, allowing consumers to prioritize messages by code hotness,

	   *   the function name of the code being optimized, where applicable,

	   *   the "inlining chain" for the code being optimized, so that when a function is inlined into several  different
	       places (which might themselves be inlined), the reader can distinguish between the copies,

	   *   objects	identifying  those parts of the message that refer to expressions, statements or symbol-table nodes,
	       which of these categories they are, and, when available, their source code location,

	   *   the GCC pass that emitted the message, and

	   *   the location in GCC's own code from which the message was emitted

	   Additionally, some messages are logically nested within other messages, reflecting implementation details of	 the
	   optimization passes.

       -fsched-verbose=n
	   On  targets	that  use  instruction scheduling, this option controls the amount of debugging output the scheduler
	   prints to the dump files.

	   For n greater than zero, -fsched-verbose outputs the same information as -fdump-rtl-sched1 and -fdump-rtl-sched2.
	   For n greater than one, it also output basic block probabilities, detailed ready list information  and  unit/insn
	   info.   For	n  greater  than two, it includes RTL at abort point, control-flow and regions info.  And for n over
	   four, -fsched-verbose also includes dependence info.

       -fenable-kind-pass
       -fdisable-kind-pass=range-list
	   This is a set of options that are used to explicitly	 disable/enable	 optimization  passes.	 These	options	 are
	   intended  for  use  for  debugging  GCC.  Compiler users should use regular options for enabling/disabling passes
	   instead.

	   -fdisable-ipa-pass
	       Disable IPA pass pass. pass is the pass name.  If the  same  pass  is  statically  invoked  in  the  compiler
	       multiple times, the pass name should be appended with a sequential number starting from 1.

	   -fdisable-rtl-pass
	   -fdisable-rtl-pass=range-list
	       Disable	RTL  pass  pass.   pass	 is  the  pass name.  If the same pass is statically invoked in the compiler
	       multiple times, the pass name should be appended with a sequential number starting from 1.  range-list  is  a
	       comma-separated	list  of  function  ranges  or	assembler names.  Each range is a number pair separated by a
	       colon.  The range is inclusive in both ends.  If the range is trivial, the number pair can be simplified as a
	       single number.  If the function's call graph node's uid falls within one of the specified ranges, the pass is
	       disabled for that function.  The uid is shown in the function header of a dump file, and the pass  names	 can
	       be dumped by using option -fdump-passes.

	   -fdisable-tree-pass
	   -fdisable-tree-pass=range-list
	       Disable tree pass pass.	See -fdisable-rtl for the description of option arguments.

	   -fenable-ipa-pass
	       Enable  IPA  pass  pass.	  pass	is  the	 pass  name.  If the same pass is statically invoked in the compiler
	       multiple times, the pass name should be appended with a sequential number starting from 1.

	   -fenable-rtl-pass
	   -fenable-rtl-pass=range-list
	       Enable RTL pass pass.  See -fdisable-rtl for option argument description and examples.

	   -fenable-tree-pass
	   -fenable-tree-pass=range-list
	       Enable tree pass pass.  See -fdisable-rtl for the description of option arguments.

	   Here are some examples showing uses of these options.

		   # disable ccp1 for all functions
		      -fdisable-tree-ccp1
		   # disable complete unroll for function whose cgraph node uid is 1
		      -fenable-tree-cunroll=1
		   # disable gcse2 for functions at the following ranges [1,1],
		   # [300,400], and [400,1000]
		   # disable gcse2 for functions foo and foo2
		      -fdisable-rtl-gcse2=foo,foo2
		   # disable early inlining
		      -fdisable-tree-einline
		   # disable ipa inlining
		      -fdisable-ipa-inline
		   # enable tree full unroll
		      -fenable-tree-unroll

       -fchecking
       -fchecking=n
	   Enable internal consistency checking.  The default depends on the compiler configuration.   -fchecking=2  enables
	   further internal consistency checking that might affect code generation.

       -frandom-seed=string
	   This option provides a seed that GCC uses in place of random numbers in generating certain symbol names that have
	   to  be  different  in every compiled file.  It is also used to place unique stamps in coverage data files and the
	   object files that produce them.  You can use the -frandom-seed option to produce  reproducibly  identical  object
	   files.

	   The string can either be a number (decimal, octal or hex) or an arbitrary string (in which case it's converted to
	   a number by computing CRC32).

	   The string should be different for every file you compile.

       -save-temps
	   Store  the  usual  "temporary"  intermediate files permanently; name them as auxiliary output files, as specified
	   described under -dumpbase and -dumpdir.

	   When used in combination with the -x command-line option, -save-temps is sensible enough to avoid overwriting  an
	   input  source  file	with the same extension as an intermediate file.  The corresponding intermediate file may be
	   obtained by renaming the source file before using -save-temps.

       -save-temps=cwd
	   Equivalent to -save-temps -dumpdir ./.

       -save-temps=obj
	   Equivalent to -save-temps -dumpdir outdir/, where outdir/ is the directory of the output file specified after the
	   -o option, including any directory separators.  If the -o option is not used, the -save-temps=obj switch  behaves
	   like -save-temps=cwd.

       -time[=file]
	   Report  the	CPU  time  taken  by  each  subprocess in the compilation sequence.  For C source files, this is the
	   compiler proper and assembler (plus the linker if linking is done).

	   Without the specification of an output file, the output looks like this:

		   # cc1 0.12 0.01
		   # as 0.00 0.01

	   The first number on each line is the "user time", that is time spent executing the program  itself.	 The  second
	   number  is  "system time", time spent executing operating system routines on behalf of the program.	Both numbers
	   are in seconds.

	   With the specification of an output file, the output is appended to the named file, and it looks like this:

		   0.12 0.01 cc1 
		   0.00 0.01 as 

	   The "user time" and the "system time" are moved before the program name, and the options passed  to	the  program
	   are displayed, so that one can later tell what file was being compiled, and with which options.

       -fdump-final-insns[=file]
	   Dump	 the  final internal representation (RTL) to file.  If the optional argument is omitted (or if file is "."),
	   the name of the dump file is determined by appending ".gkd" to the dump base name, see -dumpbase.

       -fcompare-debug[=opts]
	   If no error occurs during compilation, run the compiler a second time, adding opts and -fcompare-debug-second  to
	   the arguments passed to the second compilation.  Dump the final internal representation in both compilations, and
	   print an error if they differ.

	   If the equal sign is omitted, the default -gtoggle is used.

	   The	 environment   variable	  GCC_COMPARE_DEBUG,   if   defined,   non-empty  and  nonzero,	 implicitly  enables
	   -fcompare-debug.  If GCC_COMPARE_DEBUG is defined to a string starting with a dash, then it	is  used  for  opts,
	   otherwise the default -gtoggle is used.

	   -fcompare-debug=,  with  the equal sign but without opts, is equivalent to -fno-compare-debug, which disables the
	   dumping of the final representation and the second compilation, preventing  even  GCC_COMPARE_DEBUG	from  taking
	   effect.

	   To	 verify	   full	   coverage    during	 -fcompare-debug    testing,	set    GCC_COMPARE_DEBUG    to	 say
	   -fcompare-debug-not-overridden, which GCC rejects as an invalid option in any  actual  compilation  (rather	than
	   preprocessing, assembly or linking).	 To get just a warning, setting GCC_COMPARE_DEBUG to -w%n-fcompare-debug not
	   overridden will do.

       -fcompare-debug-second
	   This	 option	 is implicitly passed to the compiler for the second compilation requested by -fcompare-debug, along
	   with options to silence warnings, and omitting other options that would cause the compiler to produce  output  to
	   files  or  to  standard  output  as a side effect.  Dump files and preserved temporary files are renamed so as to
	   contain the ".gk" additional extension during the second compilation, to avoid overwriting those generated by the
	   first.

	   When this option is passed to the compiler driver, it causes the first compilation to be skipped, which makes  it
	   useful for little other than debugging the compiler proper.

       -gtoggle
	   Turn	 off  generation of debug info, if leaving out this option generates it, or turn it on at level 2 otherwise.
	   The position of this argument in the command line does not matter; it takes effect after all	 other	options	 are
	   processed,  and  it	does so only once, no matter how many times it is given.  This is mainly intended to be used
	   with -fcompare-debug.

       -fvar-tracking-assignments-toggle
	   Toggle -fvar-tracking-assignments, in the same way that -gtoggle toggles -g.

       -Q  When used on the command line prior to --help=, -Q acts as a modifier to the help output.

	   Otherwise, this option makes the compiler print out each  function  name  as	 it  is	 compiled,  and	 print	some
	   statistics about each pass when it finishes.

       -ftime-report
	   Makes the compiler print some statistics to stderr about the time consumed by each pass when it finishes.

	   If	  SARIF	    output     of    diagnostics    was	   requested	via    -fdiagnostics-format=sarif-file	  or
	   -fdiagnostics-format=sarif-stderr then the -ftime-report information is instead emitted in JSON form as  part  of
	   SARIF  output.   The	 precise format of this JSON data is subject to change, and the values may not exactly match
	   those emitted to stderr due to being written out at a slightly different place within the compiler.

       -ftime-report-details
	   Record the time consumed by infrastructure parts separately for each pass.

       -fira-verbose=n
	   Control the verbosity of the dump file for the integrated register allocator.  The default value is	5.   If	 the
	   value n is greater or equal to 10, the dump output is sent to stderr using the same format as n minus 10.

       -flto-report
	   Prints  a  report  with internal details on the workings of the link-time optimizer.	 The contents of this report
	   vary from version to version.  It is meant to be useful to GCC developers when processing  object  files  in	 LTO
	   mode (via -flto).

	   Disabled by default.

       -flto-report-wpa
	   Like -flto-report, but only print for the WPA phase of link-time optimization.

       -fmem-report
	   Makes the compiler print some statistics about permanent memory allocation when it finishes.

       -fmem-report-wpa
	   Makes the compiler print some statistics about permanent memory allocation for the WPA phase only.

       -fpre-ipa-mem-report
       -fpost-ipa-mem-report
	   Makes  the  compiler	 print	some  statistics  about	 permanent memory allocation before or after interprocedural
	   optimization.

       -fmultiflags
	   This option enables multilib-aware "TFLAGS" to be used to build target  libraries  with  options  different	from
	   those the compiler is configured to use by default, through the use of specs set up by compiler internals, by the
	   target, or by builders at configure time.

	   Like	 "TFLAGS",  this  allows  the  target  libraries  to  be built for portable baseline environments, while the
	   compiler defaults to more demanding ones.  That's useful because users  can	easily	override  the  defaults	 the
	   compiler  is	 configured  to	 use  to  build	 their	own programs, if the defaults are not ideal for their target
	   environment, whereas rebuilding the runtime libraries is usually not as easy or desirable.

	   Unlike "TFLAGS", the use of specs enables different flags to be selected for different  multilibs.	The  way  to
	   accomplish that is to build with make TFLAGS=-fmultiflags, after configuring --with-specs=%{fmultiflags:...}.

	   This option is discarded by the driver once it's done processing driver self spec.

	   It  is  also	 useful	 to  check that "TFLAGS" are being used to build all target libraries, by configuring a non-
	   bootstrap  compiler	--with-specs='%{!fmultiflags:%emissing	TFLAGS}'  and  building	 the  compiler	and   target
	   libraries.

       -fprofile-report
	   Makes  the  compiler	 print some statistics about consistency of the (estimated) profile and effect of individual
	   passes.

       -fstack-usage
	   Makes the compiler output stack usage information for the program, on a per-function basis.	The filename for the
	   dump is made by appending .su to the auxname.  auxname is  generated	 from  the  name  of  the  output  file,  if
	   explicitly  specified  and it is not an executable, otherwise it is the basename of the source file.	 An entry is
	   made up of three fields:

	   *   The name of the function.

	   *   A number of bytes.

	   *   One or more qualifiers: "static", "dynamic", "bounded".

	   The qualifier "static" means that the function manipulates the stack statically: a  fixed  number  of  bytes	 are
	   allocated  for the frame on function entry and released on function exit; no stack adjustments are otherwise made
	   in the function.  The second field is this fixed number of bytes.

	   The qualifier "dynamic" means that the function manipulates the stack dynamically:  in  addition  to	 the  static
	   allocation  described  above,  stack	 adjustments  are  made in the body of the function, for example to push/pop
	   arguments around function calls.  If the qualifier "bounded" is also present, the amount of these adjustments  is
	   bounded at compile time and the second field is an upper bound of the total amount of stack used by the function.
	   If  it  is  not present, the amount of these adjustments is not bounded at compile time and the second field only
	   represents the bounded part.

       -fstats
	   Emit statistics about front-end processing at the end of the compilation.  This option is supported only  by	 the
	   C++ front end, and the information is generally only useful to the G++ development team.

       -fdbg-cnt-list
	   Print the name and the counter upper bound for all debug counters.

       -fdbg-cnt=counter-value-list
	   Set	the  internal  debug  counter  lower  and  upper  bound.   counter-value-list  is  a comma-separated list of
	   name:lower_bound1-upper_bound1 [:lower_bound2-upper_bound2...] tuples which sets the name of the counter and list
	   of closed intervals.	 The lower_bound is optional and  is  zero  initialized	 if  not  set.	 For  example,	with
	   -fdbg-cnt=dce:2-4:10-11,tail_call:10,  dbg_cnt(dce)	returns	 true  only  for  second,  third,  fourth, tenth and
	   eleventh invocation.	 For dbg_cnt(tail_call) true is returned for first 10 invocations.

       -print-file-name=library
	   Print the full absolute name of the library file library that would be used when linking---and don't do  anything
	   else.  With this option, GCC does not compile or link anything; it just prints the file name.

       -print-multi-directory
	   Print  the  directory  name	corresponding  to the multilib selected by any other switches present in the command
	   line.  This directory is supposed to exist in GCC_EXEC_PREFIX.

       -print-multi-lib
	   Print the mapping from multilib directory names to compiler switches that enable them.   The	 directory  name  is
	   separated  from  the	 switches  by  ;,  and each switch starts with an @ instead of the -, without spaces between
	   multiple switches.  This is supposed to ease shell processing.

       -print-multi-os-directory
	   Print the path to OS libraries for the selected multilib, relative to some lib subdirectory.	 If OS libraries are
	   present in the lib subdirectory and no multilibs are used, this is usually just ., if OS libraries are present in
	   libsuffix sibling directories this prints e.g. ../lib64, ../lib or ../lib32, or if OS libraries  are	 present  in
	   lib/subdir subdirectories it prints e.g. amd64, sparcv9 or ev6.

       -print-multiarch
	   Print the path to OS libraries for the selected multiarch, relative to some lib subdirectory.

       -print-prog-name=program
	   Like -print-file-name, but searches for a program such as cpp.

       -print-libgcc-file-name
	   Same as -print-file-name=libgcc.a.

	   This is useful when you use -nostdlib or -nodefaultlibs but you do want to link with libgcc.a.  You can do:

		   gcc -nostdlib ... `gcc -print-libgcc-file-name`

       -print-search-dirs
	   Print  the  name  of	 the  configured  installation	directory  and a list of program and library directories gcc
	   searches---and don't do anything else.

	   This is useful when gcc prints the error message  installation  problem,  cannot  exec  cpp0:  No  such  file  or
	   directory.	To  resolve  this you either need to put cpp0 and the other compiler components where gcc expects to
	   find them, or you can set the environment variable GCC_EXEC_PREFIX to the directory	where  you  installed  them.
	   Don't forget the trailing /.

       -print-sysroot
	   Print  the target sysroot directory that is used during compilation.	 This is the target sysroot specified either
	   at configure time or using the --sysroot option, possibly with  an  extra  suffix  that  depends  on	 compilation
	   options.  If no target sysroot is specified, the option prints nothing.

       -print-sysroot-headers-suffix
	   Print  the suffix added to the target sysroot when searching for headers, or give an error if the compiler is not
	   configured with such a suffix---and don't do anything else.

       -dumpmachine
	   Print the compiler's target machine (for example, i686-pc-linux-gnu)---and don't do anything else.

       -dumpversion
	   Print the compiler version (for example, 3.0, 6.3.0 or 7)---and don't do anything else.   This  is  the  compiler
	   version  used  in  filesystem paths and specs. Depending on how the compiler has been configured it can be just a
	   single number (major version), two numbers separated by  a  dot  (major  and	 minor	version)  or  three  numbers
	   separated by dots (major, minor and patchlevel version).

       -dumpfullversion
	   Print  the  full  compiler  version---and don't do anything else. The output is always three numbers separated by
	   dots, major, minor and patchlevel version.

       -dumpspecs
	   Print the compiler's built-in specs---and don't do anything else.  (This is used when GCC itself is being built.)

   Machine-Dependent Options
       Each target machine supported by GCC can have its own options---for example, to allow you to compile for a particular
       processor variant or ABI, or to control optimizations specific to that machine.	By convention, the names of machine-
       specific options start with -m.

       Some configurations of the compiler also support additional target-specific options, usually for	 compatibility	with
       other compilers on the same platform.

       AArch64 Options

       These options are defined for AArch64 implementations:

       -mabi=name
	   Generate  code  for	the  specified data model.  Permissible values are ilp32 for SysV-like data model where int,
	   long int and pointers are 32 bits, and lp64 for SysV-like data model where int is  32  bits,	 but  long  int	 and
	   pointers are 64 bits.

	   The	default	 depends  on  the  specific  target  configuration.  Note that the LP64 and ILP32 ABIs are not link-
	   compatible; you must compile your entire program with the same ABI, and link with a compatible set of libraries.

	   The ilp32 model is deprecated.

       -mbig-endian
	   Generate big-endian code.  This is the default when GCC is configured for an aarch64_be-*-* target.

       -mgeneral-regs-only
	   Generate code which uses only the general-purpose registers.	 This will prevent the compiler from using floating-
	   point and Advanced SIMD registers but will not impose any restrictions on the assembler.

       -mlittle-endian
	   Generate little-endian code.	 This is the  default  when  GCC  is  configured  for  an  aarch64-*-*	but  not  an
	   aarch64_be-*-* target.

       -mcmodel=tiny
	   Generate code for the tiny code model.  The program and its statically defined symbols must be within 1MB of each
	   other.  Programs can be statically or dynamically linked.

       -mcmodel=small
	   Generate  code  for	the  small code model.	The program and its statically defined symbols must be within 4GB of
	   each other.	Programs can be statically or dynamically linked.  This is the default code model.

       -mcmodel=large
	   Generate code for the large code model.  This makes	no  assumptions	 about	addresses  and	sizes  of  sections.
	   Programs  can  be  statically linked only.  The -mcmodel=large option is incompatible with -mabi=ilp32, -fpic and
	   -fPIC.

       -mtp=name
	   Specify the system register to use as a thread pointer.  The valid values are tpidr_el0, tpidrro_el0,  tpidr_el1,
	   tpidr_el2, tpidr_el3.  For backwards compatibility the aliases el0, el1, el2, el3 are also accepted.	 The default
	   setting is tpidr_el0.  It is recommended to compile all code intended to interoperate with the same value of this
	   option to avoid accessing a different thread pointer from the wrong exception level.

       -mstrict-align
       -mno-strict-align
	   Avoid  or  allow  generating memory accesses that may not be aligned on a natural object boundary as described in
	   the architecture specification.

       -momit-leaf-frame-pointer
       -mno-omit-leaf-frame-pointer
	   Omit or keep the frame pointer in leaf functions.  The former behavior is the default.

       -mstack-protector-guard=guard
       -mstack-protector-guard-reg=reg
       -mstack-protector-guard-offset=offset
	   Generate stack protection code using canary at guard.  Supported locations are global  for  a  global  canary  or
	   sysreg for a canary in an appropriate system register.

	   With	 the  latter  choice  the  options -mstack-protector-guard-reg=reg and -mstack-protector-guard-offset=offset
	   furthermore specify which system register to use as base register for reading the canary, and  from	what  offset
	   from	 that  base  register.	There  is no default register or offset as this is entirely for use within the Linux
	   kernel.

       -mtls-dialect=desc
	   Use TLS descriptors as the thread-local storage mechanism for dynamic accesses of TLS  variables.   This  is	 the
	   default.

       -mtls-dialect=traditional
	   Use traditional TLS as the thread-local storage mechanism for dynamic accesses of TLS variables.

       -mtls-size=size
	   Specify  bit size of immediate TLS offsets.	Valid values are 12, 24, 32, 48.  This option requires binutils 2.26
	   or newer.

       -mfix-cortex-a53-835769
       -mno-fix-cortex-a53-835769
	   Enable or disable the workaround for the ARM Cortex-A53 erratum number 835769.  This	 involves  inserting  a	 NOP
	   instruction	between	 memory instructions and 64-bit integer multiply-accumulate instructions.  This flag will be
	   ignored if an architecture or cpu is specified on the command line which does not need the workaround.

       -mfix-cortex-a53-843419
       -mno-fix-cortex-a53-843419
	   Enable or disable the workaround for the ARM Cortex-A53 erratum number 843419.  This erratum workaround  is	made
	   at  link  time  and	this  will  only pass the corresponding flag to the linker.  This flag will be ignored if an
	   architecture or cpu is specified on the command line which does not need the workaround.

       -mlow-precision-recip-sqrt
       -mno-low-precision-recip-sqrt
	   Enable or disable the reciprocal square root approximation.	This option only has an	 effect	 if  -ffast-math  or
	   -funsafe-math-optimizations	is  used as well.  Enabling this reduces precision of reciprocal square root results
	   to about 16 bits for single precision and to 32 bits for double precision.

       -mlow-precision-sqrt
       -mno-low-precision-sqrt
	   Enable  or  disable	the  square  root  approximation.   This  option  only	has  an	 effect	 if  -ffast-math  or
	   -funsafe-math-optimizations	is used as well.  Enabling this reduces precision of square root results to about 16
	   bits	 for   single	precision   and	  to   32   bits   for	 double	  precision.	If   enabled,	it   implies
	   -mlow-precision-recip-sqrt.

       -mlow-precision-div
       -mno-low-precision-div
	   Enable   or	 disable   the	 division  approximation.   This  option  only	has  an	 effect	 if  -ffast-math  or
	   -funsafe-math-optimizations is used as well.	 Enabling this reduces precision of division  results  to  about  16
	   bits for single precision and to 32 bits for double precision.

       -mtrack-speculation
       -mno-track-speculation
	   Enable or disable generation of additional code to track speculative execution through conditional branches.	 The
	   tracking  state  can	 then  be  used by the compiler when expanding calls to "__builtin_speculation_safe_copy" to
	   permit a more efficient code sequence to be generated.

       -moutline-atomics
       -mno-outline-atomics
	   Enable or disable calls to out-of-line helpers to implement atomic operations.  These helpers will,	at  runtime,
	   determine  if  the  LSE  instructions  from ARMv8.1-A can be used; if not, they will use the load/store-exclusive
	   instructions that are present in the base ARMv8.0 ISA.

	   This option is only applicable when compiling for the base ARMv8.0 instruction set.	If using a  later  revision,
	   e.g.	 -march=armv8.1-a  or  -march=armv8-a+lse, the ARMv8.1-Atomics instructions will be used directly.  The same
	   applies when using -mcpu= when the selected cpu supports the lse feature.  This option is on by default.

       -march=name
	   Specify the name of the target architecture and, optionally, one or more feature modifiers.	This option has	 the
	   form -march=arch{+[no]feature}*.

	   The table below summarizes the permissible values for arch and the features that they enable by default:

	   arch value : Architecture : Includes by default
	   armv8-a : Armv8-A : +fp, +simd
	   armv8.1-a : Armv8.1-A : armv8-a, +crc, +lse, +rdma
	   armv8.2-a : Armv8.2-A : armv8.1-a
	   armv8.3-a : Armv8.3-A : armv8.2-a, +pauth, +fcma, +jscvt
	   armv8.4-a : Armv8.4-A : armv8.3-a, +flagm, +fp16fml, +dotprod, +rcpc2
	   armv8.5-a : Armv8.5-A : armv8.4-a, +sb, +ssbs, +predres, +frintts, +flagm2
	   armv8.6-a : Armv8.6-A : armv8.5-a, +bf16, +i8mm
	   armv8.7-a : Armv8.7-A : armv8.6-a, +wfxt, +xs
	   armv8.8-a : Armv8.8-a : armv8.7-a, +mops
	   armv8.9-a : Armv8.9-a : armv8.8-a
	   armv9-a : Armv9-A : armv8.5-a, +sve, +sve2
	   armv9.1-a : Armv9.1-A : armv9-a, +bf16, +i8mm
	   armv9.2-a : Armv9.2-A : armv9.1-a, +wfxt, +xs
	   armv9.3-a : Armv9.3-A : armv9.2-a, +mops
	   armv9.4-a : Armv9.4-A : armv9.3-a, +sve2p1
	   armv9.5-a : Armv9.5-A : armv9.4-a, cpa, +faminmax, +lut
	   armv8-r : Armv8-R : armv8-r

	   The value native is available on native AArch64 GNU/Linux and causes the compiler to pick the architecture of the
	   host	 system.   This	 option	 has  no  effect if the compiler is unable to recognize the architecture of the host
	   system.  When -march=native is given and no other -mcpu or -mtune is given then GCC will pick the host CPU as the
	   CPU to tune for as well as select  the  architecture	 features  from.   That	 is,  -march=native  is	 treated  as
	   -mcpu=native.

	   The	permissible  values for feature are listed in the sub-section on aarch64-feature-modifiers,,-march and -mcpu
	   Feature Modifiers.  Where conflicting feature modifiers are specified, the right-most feature is used.

	   GCC uses name to determine what kind of instructions it can emit when generating assembly  code.   If  -march  is
	   specified  without  either  of  -mtune  or -mcpu also being specified, the code is tuned to perform well across a
	   range of target processors implementing the target architecture.

       -mtune=name
	   Specify the name of the target processor for which GCC should tune the  performance	of  the	 code.	 Permissible
	   values  for	this  option  are:  generic, cortex-a35, cortex-a53, cortex-a55, cortex-a57, cortex-a72, cortex-a73,
	   cortex-a75, cortex-a76, cortex-a76ae, cortex-a77, cortex-a65, cortex-a65ae, cortex-a34, cortex-a78, cortex-a78ae,
	   cortex-a78c, ares, exynos-m1, emag, falkor,	oryon-1,  neoverse-512tvb,  neoverse-e1,  neoverse-n1,	neoverse-n2,
	   neoverse-v1,	 neoverse-v2,  grace,  neoverse-v3,  neoverse-v3ae,  neoverse-n3, olympus, cortex-a725, cortex-x925,
	   qdf24xx,  saphira,  phecda,	xgene1,	 vulcan,  octeontx,  octeontx81,    octeontx83,	  octeontx2,   octeontx2t98,
	   octeontx2t96	  octeontx2t93,	  octeontx2f95,	 octeontx2f95n,	 octeontx2f95mm,  a64fx,  fujitsu-monaka,  thunderx,
	   thunderxt88,	 thunderxt88p1,	 thunderxt81,  tsv110,	hip12,	thunderxt83,  thunderx2t99,   thunderx3t110,   zeus,
	   cortex-a57.cortex-a53,	  cortex-a72.cortex-a53,	cortex-a73.cortex-a35,	      cortex-a73.cortex-a53,
	   cortex-a75.cortex-a55,  cortex-a76.cortex-a55,  cortex-r82,	cortex-r82ae,  cortex-x1,   cortex-x1c,	  cortex-x2,
	   cortex-x3,	cortex-x4,   cortex-a510,   cortex-a520,   cortex-a520ae,   cortex-a710,  cortex-a715,	cortex-a720,
	   cortex-a720ae, ampere1, ampere1a, ampere1b, cobalt-100, apple-m1, apple-m2, apple-m3 and native.

	   The	 values	  cortex-a57.cortex-a53,   cortex-a72.cortex-a53,   cortex-a73.cortex-a35,    cortex-a73.cortex-a53,
	   cortex-a75.cortex-a55, cortex-a76.cortex-a55, apple-m1, apple-m2, apple-m3, gb10 specify that GCC should tune for
	   a big.LITTLE system.

	   The value neoverse-512tvb specifies that GCC should tune for Neoverse cores that (a) implement SVE and (b) have a
	   total  vector  bandwidth  of 512 bits per cycle.  In other words, the option tells GCC to tune for Neoverse cores
	   that can execute 4 128-bit Advanced SIMD arithmetic instructions a cycle  and  that	can  execute  an  equivalent
	   number  of  SVE  arithmetic	instructions per cycle (2 for 256-bit SVE, 4 for 128-bit SVE).	This is more general
	   than tuning for a specific core like Neoverse V1 but is more specific than the default tuning described below.

	   Additionally on native AArch64 GNU/Linux systems the value native tunes performance to  the	host  system.	This
	   option has no effect if the compiler is unable to recognize the processor of the host system.

	   Where  none	of  -mtune=,  -mcpu=  or  -march= are specified, the code is tuned to perform well across a range of
	   target processors.

	   This option cannot be suffixed by feature modifiers.

       -mcpu=name
	   Specify the name of the target processor, optionally suffixed by one or more feature modifiers.  This option	 has
	   the	form  -mcpu=cpu{+[no]feature}*,	 where	the  permissible  values for cpu are the same as those available for
	   -mtune.     The    permissible    values    for    feature	 are	documented    in    the	   sub-section	  on
	   aarch64-feature-modifiers,,-march   and  -mcpu  Feature  Modifiers.	 Where	conflicting  feature  modifiers	 are
	   specified, the right-most feature is used.

	   GCC uses name to determine what kind of instructions it can emit when generating assembly code (as if by  -march)
	   and	to determine the target processor for which to tune for performance (as if by -mtune).	Where this option is
	   used in conjunction with -march or -mtune, those options take  precedence  over  the	 appropriate  part  of	this
	   option.

	   -mcpu=neoverse-512tvb is special in that it does not refer to a specific core, but instead refers to all Neoverse
	   cores  that	(a)  implement	SVE and (b) have a total vector bandwidth of 512 bits a cycle.	Unless overridden by
	   -march, -mcpu=neoverse-512tvb generates code that can run on a Neoverse V1 core, since Neoverse V1 is  the  first
	   Neoverse  core  with these properties.  Unless overridden by -mtune, -mcpu=neoverse-512tvb tunes code in the same
	   way as for -mtune=neoverse-512tvb.

       -moverride=string
	   Override tuning decisions made by the back-end in response to a  -mtune=  switch.   The  syntax,  semantics,	 and
	   accepted values for string in this option are not guaranteed to be consistent across releases.

	   This option is only intended to be useful when developing GCC.

       -mverbose-cost-dump
	   Enable  verbose  cost  model	 dumping  in the debug dump files.  This option is provided for use in debugging the
	   compiler.

       -mpc-relative-literal-loads
       -mno-pc-relative-literal-loads
	   Enable or disable PC-relative literal loads.	 With  this  option  literal  pools  are  accessed  using  a  single
	   instruction	and emitted after each function.  This limits the maximum size of functions to 1MB.  This is enabled
	   by default for -mcmodel=tiny.

       -msign-return-address=scope
	   Select the function scope on which return address signing will be applied.  Permissible values  are	none,  which
	   disables  return  address  signing,	non-leaf,  which  enables  pointer  signing for functions which are not leaf
	   functions, and all, which enables pointer signing for all functions.	 The default value is none. This option	 has
	   been deprecated by -mbranch-protection.

       -mbranch-protection=none|standard|pac-ret[+leaf+b-key]|bti|gcs
	   Select  the branch protection features to use.  none is the default and turns off all types of branch protection.
	   standard turns on all types of branch protection features.  If a feature  has  additional  tuning  options,	then
	   standard  sets  it  to its standard level.  pac-ret[+leaf] turns on return address signing to its standard level:
	   signing functions that save the return address to memory (non-leaf functions will  practically  always  do  this)
	   using  the  a-key.	The optional argument leaf can be used to extend the signing to include leaf functions.	 The
	   optional argument b-key can be used to sign the functions with the B-key instead of	the  A-key.   bti  turns  on
	   branch target identification mechanism.  gcs turns on guarded control stack compatible code generation.

       -mharden-sls=opts
	   Enable  compiler  hardening	against	 straight  line	 speculation  (SLS).   opts is a comma-separated list of the
	   following options:

	   retbr
	   blr

	   In addition, -mharden-sls=all enables all SLS hardening while -mharden-sls=none disables all SLS hardening.

       -mearly-ra=scope
	   Determine when to enable an early register allocation pass.	This pass runs	before	instruction  scheduling	 and
	   tries  to  find  a spill-free allocation of floating-point and vector code.	It also tries to make use of strided
	   multi-register instructions, such as SME2's strided LD1 and ST1.

	   The possible values of scope are: all, which runs the pass on all functions; strided,  which	 runs  the  pass  on
	   functions that have access to strided multi-register instructions; and none, which disables the pass.

	   -mearly-ra=all is the default for -O2 and above, and for -Os.  -mearly-ra=none is the default otherwise.

       -mearly-ldp-fusion
	   Enable  the	copy  of  the  AArch64 load/store pair fusion pass that runs before register allocation.  Enabled by
	   default at -O and above.

       -mlate-ldp-fusion
	   Enable the copy of the AArch64 load/store pair fusion pass that  runs  after	 register  allocation.	 Enabled  by
	   default at -O and above.

       -msve-vector-bits=bits
	   Specify the number of bits in an SVE vector register.  This option only has an effect when SVE is enabled.

	   GCC supports two forms of SVE code generation: "vector-length agnostic" output that works with any size of vector
	   register  and "vector-length specific" output that allows GCC to make assumptions about the vector length when it
	   is useful for optimization reasons.	The possible values of bits are: scalable, 128, 256,  512,  1024  and  2048.
	   Specifying  scalable	 selects  vector-length	 agnostic  output.   At present -msve-vector-bits=128 also generates
	   vector-length agnostic output for big-endian targets.  All other values  generate  vector-length  specific  code.
	   The	behavior  of these values may change in future releases and no value except scalable should be relied on for
	   producing code that is portable across different hardware SVE vector lengths.

	   The default is -msve-vector-bits=scalable, which produces vector-length agnostic code.

       -Wexperimental-fmv-target
	   Warn about use of experimental Function Multi  Versioning.	The  Arm  C  Language  Extension  specification	 for
	   Function Multi Versioning is beta and subject to change. Any usage of FMV is caveated that future behavior change
	   and incompatibility is likely.

       -march and -mcpu Feature Modifiers

       Feature modifiers used with -march and -mcpu can be any of the following and their inverses nofeature:

       crc Enable CRC extension.  This is on by default for -march=armv8.1-a.

       crypto
	   Enable Crypto extension.  This also enables Advanced SIMD and floating-point instructions.

       fp  Enable floating-point instructions.	This is on by default for all possible values for options -march and -mcpu.

       simd
	   Enable Advanced SIMD instructions.  This also enables floating-point instructions.  This is on by default for all
	   possible values for options -march and -mcpu.

       sve Enable Scalable Vector Extension instructions.  This also enables Advanced SIMD and floating-point instructions.

       lse Enable Large System Extension instructions.	This is on by default for -march=armv8.1-a.

       rdma
	   Enable Round Double Multiply Accumulate instructions.  This is on by default for -march=armv8.1-a.

       fp16
	   Enable FP16 extension.  This also enables floating-point instructions.

       fp16fml
	   Enable  FP16	 fmla  extension.  This also enables FP16 extensions and floating-point instructions. This option is
	   enabled by default for -march=armv8.4-a. Use of  this  option  with	architectures  prior  to  Armv8.2-A  is	 not
	   supported.

       rcpc
	   Enable the RCpc extension.  This enables the use of the LDAPR instructions for load-acquire atomic semantics, and
	   passes it on to the assembler, enabling inline asm statements to use instructions from the RCpc extension.

       dotprod
	   Enable the Dot Product extension.  This also enables Advanced SIMD instructions.

       aes Enable the Armv8-a aes and pmull crypto extension.  This also enables Advanced SIMD instructions.

       sha2
	   Enable the Armv8-a sha2 crypto extension.  This also enables Advanced SIMD instructions.

       sha3
	   Enable  the	sha512	and sha3 crypto extension.  This also enables Advanced SIMD instructions. Use of this option
	   with architectures prior to Armv8.2-A is not supported.

       sm4 Enable the sm3 and sm4 crypto extension.  This also enables Advanced SIMD instructions.  Use of this option	with
	   architectures prior to Armv8.2-A is not supported.

       profile
	   Enable  the	Statistical Profiling extension.  This option is only to enable the extension at the assembler level
	   and does not affect code generation.

       rng Enable the Armv8.5-a Random Number instructions.  This option is only to enable the extension  at  the  assembler
	   level and does not affect code generation.

       memtag
	   Enable  the Armv8.5-a Memory Tagging Extensions.  Use of this option with architectures prior to Armv8.5-A is not
	   supported.

       sb  Enable the Armv8-a Speculation Barrier instruction.	This option is only to enable the extension at the assembler
	   level and does not affect code generation.  This option is enabled by default for -march=armv8.5-a.

       ssbs
	   Enable the Armv8-a Speculative Store Bypass Safe instruction.  This option is only to enable the extension at the
	   assembler level and does not affect code generation.	 This option is enabled by default for -march=armv8.5-a.

       predres
	   Enable the Armv8-a Execution and Data Prediction Restriction instructions.  This option is  only  to	 enable	 the
	   extension  at  the  assembler  level	 and does not affect code generation.  This option is enabled by default for
	   -march=armv8.5-a.

       sve2
	   Enable the Armv8-a Scalable Vector Extension 2.  This also enables SVE instructions.

       sve2-bitperm
	   Enable SVE2 bitperm instructions.  This also enables SVE2 instructions.

       sve2-sm4
	   Enable SVE2 sm4 instructions.  This also enables SVE2 instructions.

       sve2-aes
	   Enable SVE2 aes instructions.  This also enables SVE2 instructions.

       sve2-sha3
	   Enable SVE2 sha3 instructions.  This also enables SVE2 instructions.

       sve2p1
	   Enable SVE2.1 instructions.	This also enables SVE2 instructions.

       tme Enable the Transactional Memory Extension.

       i8mm
	   Enable 8-bit	 Integer  Matrix  Multiply  instructions.   This  also	enables	 Advanced  SIMD	 and  floating-point
	   instructions.   This	 option	 is  enabled by default for -march=armv8.6-a.  Use of this option with architectures
	   prior to Armv8.2-A is not supported.

       f32mm
	   Enable 32-bit Floating point Matrix Multiply instructions.  This also enables  SVE  instructions.   Use  of	this
	   option with architectures prior to Armv8.2-A is not supported.

       f64mm
	   Enable  64-bit  Floating  point  Matrix  Multiply instructions.  This also enables SVE instructions.	 Use of this
	   option with architectures prior to Armv8.2-A is not supported.

       bf16
	   Enable brain half-precision floating-point instructions.  This also	enables	 Advanced  SIMD	 and  floating-point
	   instructions.   This	 option	 is  enabled by default for -march=armv8.6-a.  Use of this option with architectures
	   prior to Armv8.2-A is not supported.

       ls64
	   Enable the 64-byte atomic load and store instructions for accelerators.

       mops
	   Enable the instructions to accelerate memory operations like	 "memcpy",  "memmove",	"memset".   This  option  is
	   enabled by default for -march=armv8.8-a

       flagm
	   Enable the Flag Manipulation instructions Extension.

       flagm2
	   Enable the FlagM2 flag conversion instructions.

       pauth
	   Enable the Pointer Authentication Extension.

       cssc
	   Enable the Common Short Sequence Compression instructions.

       sme Enable the Scalable Matrix Extension.  This is only supported when SVE2 is also enabled.

       sme-i16i64
	   Enable the FEAT_SME_I16I64 extension to SME.	 This also enables SME instructions.

       sme-f64f64
	   Enable the FEAT_SME_F64F64 extension to SME.	 This also enables SME instructions.

       sme2
	   Enable the Scalable Matrix Extension 2.  This also enables SME instructions.

       sme-b16b16
	   Enable the FEAT_SME_B16B16 extension to SME.	 This also enables SME2 and SVE_B16B16 instructions.

       sme-f16f16
	   Enable the FEAT_SME_F16F16 extension to SME.	 This also enables SME2 instructions.

       sme2p1
	   Enable the Scalable Matrix Extension version 2.1.  This also enables SME2 instructions.

       fcma
	   Enable the complex number SIMD extensions.

       jscvt
	   Enable the "fjcvtzs" JavaScript conversion instruction.

       frintts
	   Enable floating-point round to integral value instructions.

       wfxt
	   Enable "wfet" and "wfit" instructions.

       xs  Enable the XS memory attribute extension.

       lse128
	   Enable the LSE128 128-bit atomic instructions extension.  This also enables LSE instructions.

       d128
	   Enable support for 128-bit system register read/write instructions.	This also enables the LSE128 extension.

       gcs Enable support for Armv9.4-a Guarded Control Stack extension.

       the Enable support for Armv8.9-a/9.4-a translation hardening extension.

       rcpc2
	   Enable the RCpc2 extension.

       rcpc3
	   Enable the RCpc3 (Release Consistency) extension.

       fp8 Enable the fp8 (8-bit floating point) extension.

       fp8fma
	   Enable the fp8 (8-bit floating point) multiply accumulate extension.

       ssve-fp8fma
	   Enable the fp8 (8-bit floating point) multiply accumulate extension in streaming mode.

       fp8dot4
	   Enable the fp8 (8-bit floating point) to single-precision 4-way dot product extension.

       ssve-fp8dot4
	   Enable the fp8 (8-bit floating point) to single-precision 4-way dot product extension in streaming mode.

       fp8dot2
	   Enable the fp8 (8-bit floating point) to half-precision 2-way dot product extension.

       ssve-fp8dot2
	   Enable the fp8 (8-bit floating point) to half-precision 2-way dot product extension in streaming mode.

       faminmax
	   Enable the Floating Point Absolute Maximum/Minimum extension.

       lut Enable the Lookup Table extension.

       cpa Enable the Checked Pointer Arithmetic instructions.

       sve-b16b16
	   Enable  the	SVE  non-widening  brain  floating-point ("bf16") extension.  This only has an effect when "sve2" or
	   "sme2" are also enabled.

       Feature crypto implies aes, sha2, and simd, which  implies  fp.	 Conversely,  nofp  implies  nosimd,  which  implies
       nocrypto, noaes and nosha2.

       Adapteva Epiphany Options

       These -m options are defined for Adapteva Epiphany:

       -mhalf-reg-file
	   Don't  allocate  any register in the range "r32"..."r63".  That allows code to run on hardware variants that lack
	   these registers.

       -mprefer-short-insn-regs
	   Preferentially allocate registers that  allow  short	 instruction  generation.   This  can  result  in  increased
	   instruction count, so this may either reduce or increase overall code size.

       -mbranch-cost=num
	   Set	the  cost  of  branches	 to  roughly  num  "simple"  instructions.  This cost is only a heuristic and is not
	   guaranteed to produce consistent results across releases.

       -mcmove
	   Enable the generation of conditional moves.

       -mnops=num
	   Emit num NOPs before every other generated instruction.

       -mno-soft-cmpsf
	   For single-precision floating-point comparisons, emit an "fsub" instruction and test the flags.  This  is  faster
	   than	 a  software  comparison, but can get incorrect results in the presence of NaNs, or when two different small
	   numbers are compared such that their difference is calculated as zero.  The default is -msoft-cmpsf,	 which	uses
	   slower, but IEEE-compliant, software comparisons.

       -mstack-offset=num
	   Set the offset between the top of the stack and the stack pointer.  E.g., a value of 8 means that the eight bytes
	   in the range "sp+0...sp+7" can be used by leaf functions without stack allocation.  Values other than 8 or 16 are
	   untested  and unlikely to work.  Note also that this option changes the ABI; compiling a program with a different
	   stack offset than the libraries have been compiled with generally does not work.  This option can  be  useful  if
	   you	want  to  evaluate  if	a different stack offset would give you better code, but to actually use a different
	   stack offset to build working programs, it is  recommended  to  configure  the  toolchain  with  the	 appropriate
	   --with-stack-offset=num option.

       -mno-round-nearest
	   Make the scheduler assume that the rounding mode has been set to truncating.	 The default is -mround-nearest.

       -mlong-calls
	   If  not  otherwise specified by an attribute, assume all calls might be beyond the offset range of the "b" / "bl"
	   instructions, and therefore load the function address into a register  before  performing  a	 (otherwise  direct)
	   call.  This is the default.

       -mshort-calls
	   If  not  otherwise  specified  by  an  attribute,  assume  all  direct  calls  are in the range of the "b" / "bl"
	   instructions, so use these instructions for direct calls.  The default is -mlong-calls.

       -msmall16
	   Assume addresses can be loaded as 16-bit unsigned values.  This does not apply to function  addresses  for  which
	   -mlong-calls semantics are in effect.

       -mfp-mode=mode
	   Set the prevailing mode of the floating-point unit.	This determines the floating-point mode that is provided and
	   expected  at	 function  call and return time.  Making this mode match the mode you predominantly need at function
	   start can make your programs smaller and faster by avoiding unnecessary mode switches.

	   mode can be set to one the following values:

	   caller
	       Any mode at function entry is valid, and retained or restored when the function returns, and  when  it  calls
	       other  functions.   This	 mode is useful for compiling libraries or other compilation units you might want to
	       incorporate into different programs with different prevailing FPU modes, and the convenience of being able to
	       use a single object file outweighs the size and speed overhead for any extra mode  switching  that  might  be
	       needed, compared with what would be needed with a more specific choice of prevailing FPU mode.

	   truncate
	       This  is	 the  mode  used  for floating-point calculations with truncating (i.e. round towards zero) rounding
	       mode.  That includes conversion from floating point to integer.

	   round-nearest
	       This is the mode used for floating-point calculations with round-to-nearest-or-even rounding mode.

	   int This is the mode used to perform integer	 calculations  in  the	FPU,  e.g.   integer  multiply,	 or  integer
	       multiply-and-accumulate.

	   The default is -mfp-mode=caller

       -mno-split-lohi
       -mno-postinc
       -mno-postmodify
	   Code	 generation  tweaks  that  disable,  respectively,  splitting  of 32-bit loads, generation of post-increment
	   addresses, and generation of post-modify addresses.	The defaults are msplit-lohi, -mpost-inc, and -mpost-modify.

       -mnovect-double
	   Change the preferred SIMD mode to SImode.  The default is -mvect-double, which  uses	 DImode	 as  preferred	SIMD
	   mode.

       -max-vect-align=num
	   The	maximum	 alignment  for SIMD vector mode types.	 num may be 4 or 8.  The default is 8.	Note that this is an
	   ABI change, even though many library function interfaces are unaffected if they don't use SIMD  vector  modes  in
	   places that affect size and/or alignment of relevant types.

       -msplit-vecmove-early
	   Split vector moves into single word moves before reload.  In theory this can give better register allocation, but
	   so far the reverse seems to be generally the case.

       -m1reg-reg
	   Specify  a  register	 to  hold the constant -1, which makes loading small negative constants and certain bitmasks
	   faster.  Allowable values for reg are r43 and r63, which specify use of that register as a  fixed  register,	 and
	   none, which means that no register is used for this purpose.	 The default is -m1reg-none.

       AMD GCN Options

       These options are defined specifically for the AMD GCN port.

       -march=gpu
       -mtune=gpu
	   Set architecture type or tuning for gpu. Supported values for gpu are

	   gfx900
	       Compile for GCN5 Vega 10 devices (gfx900).

	   gfx902
	       Compile for GCN5 Vega gfx902 devices. (Experimental)

	   gfx904
	       Compile for GCN5 Vega gfx904 devices. (Experimental)

	   gfx906
	       Compile for GCN5 Vega 20 devices (gfx906).

	   gfx908
	       Compile for CDNA1 Instinct MI100 series devices (gfx908).

	   gfx909
	       Compile for GCN5 Vega gfx909 devices. (Experimental)

	   gfx90a
	       Compile for CDNA2 Instinct MI200 series devices (gfx90a).

	   gfx90c
	       Compile for GCN5 Vega 7 devices (gfx90c).

	   gfx9-generic
	       Compile	generic	 code  for Vega devices, executable on the following subset of GFX9 devices: gfx900, gfx902,
	       gfx904, gfx906, gfx909 and gfx90c. (Experimental)

	   gfx1030
	       Compile for RDNA2 gfx1030 devices (GFX10 series).

	   gfx1031
	       Compile for RDNA2 gfx1031 devices (GFX10 series). (Experimental)

	   gfx1032
	       Compile for RDNA2 gfx1032 devices (GFX10 series). (Experimental)

	   gfx1033
	       Compile for RDNA2 gfx1033 devices (GFX10 series). (Experimental)

	   gfx1034
	       Compile for RDNA2 gfx1034 devices (GFX10 series). (Experimental)

	   gfx1035
	       Compile for RDNA2 gfx1035 devices (GFX10 series). (Experimental)

	   gfx1036
	       Compile for RDNA2 gfx1036 devices (GFX10 series).

	   gfx10-3-generic
	       Compile generic code for GFX10-3 devices, executable on gfx1030, gfx1031, gfx1032, gfx1033, gfx1034, gfx1035,
	       and gfx1036. (Experimental)

	   gfx1100
	       Compile for RDNA3 gfx1100 devices (GFX11 series).

	   gfx1101
	       Compile for RDNA3 gfx1101 devices (GFX11 series). (Experimental)

	   gfx1102
	       Compile for RDNA3 gfx1102 devices (GFX11 series). (Experimental)

	   gfx1103
	       Compile for RDNA3 gfx1103 devices (GFX11 series).

	   gfx1150
	       Compile for RDNA3 gfx1150 devices (GFX11 series). (Experimental)

	   gfx1151
	       Compile for RDNA3 gfx1151 devices (GFX11 series). (Experimental)

	   gfx1152
	       Compile for RDNA3 gfx1152 devices (GFX11 series). (Experimental)

	   gfx1153
	       Compile for RDNA3 gfx1153 devices (GFX11 series). (Experimental)

	   gfx11-generic
	       Compile generic code for GFX11 devices, executable on gfx1100, gfx1101, gfx1102, gfx1103,  gfx1150,  gfx1151,
	       gfx1152, and gfx1153. (Experimental)

       -msram-ecc=on
       -msram-ecc=off
       -msram-ecc=any
	   Compile  binaries suitable for devices with the SRAM-ECC feature enabled, disabled, or either mode.	This feature
	   can be enabled per-process on some devices.	The compiled code must match the device mode. The  default  is	any,
	   for devices that support it.

       -mstack-size=bytes
	   Specify  how many bytes of stack space will be requested for each GPU thread (wave-front).  Beware that there may
	   be many threads and limited memory available.  The size of the stack allocation may also have an impact  on	run-
	   time performance.  The default is 32KB when using OpenACC or OpenMP, and 1MB otherwise.

       -mxnack=on
       -mxnack=off
       -mxnack=any
	   Compile  binaries  suitable	for  devices with the XNACK feature enabled, disabled, or either mode.	Some devices
	   always require XNACK and some allow the user to configure XNACK.  The compiled code must match the  device  mode.
	   The default is -mxnack=any on devices that support Unified Shared Memory, and -mxnack=no otherwise.

       ARC Options

       The following options control the architecture variant for which code is being compiled:

       -mbarrel-shifter
	   Generate  instructions supported by barrel shifter.	This is the default unless -mcpu=ARC601 or -mcpu=ARCEM is in
	   effect.

       -mjli-always
	   Force to call a function using jli_s instruction.  This option is valid only for ARCv2 architecture.

       -mcpu=cpu
	   Set architecture type, register usage, and instruction scheduling parameters for cpu.  There	 are  also  shortcut
	   alias options available for backward compatibility and convenience.	Supported values for cpu are

	   arc600
	       Compile for ARC600.  Aliases: -mA6, -mARC600.

	   arc601
	       Compile for ARC601.  Alias: -mARC601.

	   arc700
	       Compile for ARC700.  Aliases: -mA7, -mARC700.  This is the default when configured with --with-cpu=arc700.

	   arcem
	       Compile for ARC EM.

	   archs
	       Compile for ARC HS.

	   em  Compile for ARC EM CPU with no hardware extensions.

	   em4 Compile for ARC EM4 CPU.

	   em4_dmips
	       Compile for ARC EM4 DMIPS CPU.

	   em4_fpus
	       Compile for ARC EM4 DMIPS CPU with the single-precision floating-point extension.

	   em4_fpuda
	       Compile for ARC EM4 DMIPS CPU with single-precision floating-point and double assist instructions.

	   hs  Compile for ARC HS CPU with no hardware extensions except the atomic instructions.

	   hs34
	       Compile for ARC HS34 CPU.

	   hs38
	       Compile for ARC HS38 CPU.

	   hs38_linux
	       Compile for ARC HS38 CPU with all hardware extensions on.

	   hs4x
	       Compile for ARC HS4x CPU.

	   hs4xd
	       Compile for ARC HS4xD CPU.

	   hs4x_rel31
	       Compile for ARC HS4x CPU release 3.10a.

	   arc600_norm
	       Compile for ARC 600 CPU with "norm" instructions enabled.

	   arc600_mul32x16
	       Compile for ARC 600 CPU with "norm" and 32x16-bit multiply instructions enabled.

	   arc600_mul64
	       Compile for ARC 600 CPU with "norm" and "mul64"-family instructions enabled.

	   arc601_norm
	       Compile for ARC 601 CPU with "norm" instructions enabled.

	   arc601_mul32x16
	       Compile for ARC 601 CPU with "norm" and 32x16-bit multiply instructions enabled.

	   arc601_mul64
	       Compile for ARC 601 CPU with "norm" and "mul64"-family instructions enabled.

	   nps400
	       Compile for ARC 700 on NPS400 chip.

	   em_mini
	       Compile for ARC EM minimalist configuration featuring reduced register set.

       -mdpfp
       -mdpfp-compact
	   Generate double-precision FPX instructions, tuned for the compact implementation.

       -mdpfp-fast
	   Generate double-precision FPX instructions, tuned for the fast implementation.

       -mno-dpfp-lrsr
	   Disable "lr" and "sr" instructions from using FPX extension aux registers.

       -mea
	   Generate  extended  arithmetic  instructions.  Currently only "divaw", "adds", "subs", and "sat16" are supported.
	   Only valid for -mcpu=ARC700.

       -mno-mpy
	   Do not generate "mpy"-family instructions for ARC700.  This option is deprecated.

       -mmul32x16
	   Generate 32x16-bit multiply and multiply-accumulate instructions.

       -mmul64
	   Generate "mul64" and "mulu64" instructions.	Only valid for -mcpu=ARC600.

       -mnorm
	   Generate "norm" instructions.  This is the default if -mcpu=ARC700 is in effect.

       -mspfp
       -mspfp-compact
	   Generate single-precision FPX instructions, tuned for the compact implementation.

       -mspfp-fast
	   Generate single-precision FPX instructions, tuned for the fast implementation.

       -msimd
	   Enable generation of ARC SIMD instructions via target-specific builtins.  Only valid for -mcpu=ARC700.

       -msoft-float
	   This option ignored; it is provided for compatibility purposes only.	 Software floating-point code is emitted  by
	   default,  and  this	default	 can  overridden  by  FPX options; -mspfp, -mspfp-compact, or -mspfp-fast for single
	   precision, and -mdpfp, -mdpfp-compact, or -mdpfp-fast for double precision.

       -mswap
	   Generate "swap" instructions.

       -matomic
	   This enables use of the locked load/store conditional extension to implement atomic	memory	built-in  functions.
	   Not available for ARC 6xx or ARC EM cores.

       -mdiv-rem
	   Enable "div" and "rem" instructions for ARCv2 cores.

       -mcode-density
	   Enable code density instructions for ARC EM.	 This option is on by default for ARC HS.

       -mll64
	   Enable double load/store operations for ARC HS cores.

       -mtp-regno=regno
	   Specify thread pointer register number.

       -mmpy-option=multo
	   Compile  ARCv2 code with a multiplier design option.	 You can specify the option using either a string or numeric
	   value for multo.  wlh1 is the default value.	 The recognized values are:

	   0
	   none
	       No multiplier available.

	   1
	   w   16x16 multiplier, fully pipelined.  The following instructions are enabled: "mpyw" and "mpyuw".

	   2
	   wlh1
	       32x32 multiplier, fully pipelined (1 stage).  The following instructions	 are  additionally  enabled:  "mpy",
	       "mpyu", "mpym", "mpymu", and "mpy_s".

	   3
	   wlh2
	       32x32  multiplier,  fully  pipelined (2 stages).	 The following instructions are additionally enabled: "mpy",
	       "mpyu", "mpym", "mpymu", and "mpy_s".

	   4
	   wlh3
	       Two 16x16 multipliers, blocking, sequential.  The following instructions	 are  additionally  enabled:  "mpy",
	       "mpyu", "mpym", "mpymu", and "mpy_s".

	   5
	   wlh4
	       One  16x16  multiplier,	blocking,  sequential.	 The following instructions are additionally enabled: "mpy",
	       "mpyu", "mpym", "mpymu", and "mpy_s".

	   6
	   wlh5
	       One 32x4 multiplier, blocking, sequential.  The	following  instructions	 are  additionally  enabled:  "mpy",
	       "mpyu", "mpym", "mpymu", and "mpy_s".

	   7
	   plus_dmpy
	       ARC HS SIMD support.

	   8
	   plus_macd
	       ARC HS SIMD support.

	   9
	   plus_qmacw
	       ARC HS SIMD support.

	   This option is only available for ARCv2 cores.

       -mfpu=fpu
	   Enables support for specific floating-point hardware extensions for ARCv2 cores.  Supported values for fpu are:

	   fpus
	       Enables support for single-precision floating-point hardware extensions.

	   fpud
	       Enables support for double-precision floating-point hardware extensions.	 The single-precision floating-point
	       extension is also enabled.  Not available for ARC EM.

	   fpuda
	       Enables	support	 for  double-precision	floating-point	hardware  extensions  using  double-precision assist
	       instructions.  The single-precision floating-point extension is also enabled.  This option is only  available
	       for ARC EM.

	   fpuda_div
	       Enables	support	 for  double-precision	floating-point	hardware  extensions  using  double-precision assist
	       instructions.  The single-precision floating-point, square-root, and  divide  extensions	 are  also  enabled.
	       This option is only available for ARC EM.

	   fpuda_fma
	       Enables	support	 for  double-precision	floating-point	hardware  extensions  using  double-precision assist
	       instructions.  The single-precision floating-point and fused multiply and add hardware  extensions  are	also
	       enabled.	 This option is only available for ARC EM.

	   fpuda_all
	       Enables	support	 for  double-precision	floating-point	hardware  extensions  using  double-precision assist
	       instructions.  All single-precision floating-point hardware extensions are also enabled.	 This option is only
	       available for ARC EM.

	   fpus_div
	       Enables support for single-precision floating-point, square-root and divide hardware extensions.

	   fpud_div
	       Enables support for double-precision floating-point, square-root and divide hardware extensions.	 This option
	       includes option fpus_div. Not available for ARC EM.

	   fpus_fma
	       Enables support for single-precision floating-point and fused multiply and add hardware extensions.

	   fpud_fma
	       Enables support for double-precision floating-point and fused multiply and  add	hardware  extensions.	This
	       option includes option fpus_fma.	 Not available for ARC EM.

	   fpus_all
	       Enables support for all single-precision floating-point hardware extensions.

	   fpud_all
	       Enables	support	 for all single- and double-precision floating-point hardware extensions.  Not available for
	       ARC EM.

       -mirq-ctrl-saved=register-range, blink, lp_count
	   Specifies general-purposes registers that the processor automatically saves/restores on interrupt entry and exit.
	   register-range is specified as two registers separated by a dash.  The register range always	 starts	 with  "r0",
	   the upper limit is "fp" register.  blink and lp_count are optional.	This option is only valid for ARC EM and ARC
	   HS cores.

       -mrgf-banked-regs=number
	   Specifies the number of registers replicated in second register bank on entry to fast interrupt.  Fast interrupts
	   are interrupts with the highest priority level P0.  These interrupts save only PC and STATUS32 registers to avoid
	   memory  transactions	 during	 interrupt  entry  and	exit  sequences.   Use	this  option when you are using fast
	   interrupts in an ARC V2 family processor.  Permitted values are 4, 8, 16, and 32.

       -mlpc-width=width
	   Specify the width of the "lp_count" register.  Valid values for width are 8, 16, 20, 24, 28	and  32	 bits.	 The
	   default  width  is  fixed  to  32 bits.  If the width is less than 32, the compiler does not attempt to transform
	   loops in your program to use the zero-delay loop mechanism unless it is known that the  "lp_count"  register	 can
	   hold	 the required loop-counter value.  Depending on the width specified, the compiler and run-time library might
	   continue to use the loop mechanism for various needs.  This option defines  macro  "__ARC_LPC_WIDTH__"  with	 the
	   value of width.

       -mrf16
	   This	 option	 instructs  the	 compiler  to  generate	 code for a 16-entry register file.  This option defines the
	   "__ARC_RF16__" preprocessor macro.

       -mbranch-index
	   Enable use of "bi" or "bih" instructions to implement jump tables.

       The following options are passed through to the assembler, and also define preprocessor macro symbols.

       -mdsp-packa
	   Passed down to the  assembler  to  enable  the  DSP	Pack  A	 extensions.   Also  sets  the	preprocessor  symbol
	   "__Xdsp_packa".  This option is deprecated.

       -mdvbf
	   Passed  down	 to the assembler to enable the dual Viterbi butterfly extension.  Also sets the preprocessor symbol
	   "__Xdvbf".  This option is deprecated.

       -mlock
	   Passed down to the assembler to enable the locked load/store conditional extension.	Also sets  the	preprocessor
	   symbol "__Xlock".

       -mmac-d16
	   Passed down to the assembler.  Also sets the preprocessor symbol "__Xxmac_d16".  This option is deprecated.

       -mmac-24
	   Passed down to the assembler.  Also sets the preprocessor symbol "__Xxmac_24".  This option is deprecated.

       -mrtsc
	   Passed  down	 to  the  assembler  to	 enable	 the 64-bit time-stamp counter extension instruction.  Also sets the
	   preprocessor symbol "__Xrtsc".  This option is deprecated.

       -mswape
	   Passed down to the assembler to enable the swap byte ordering extension instruction.	 Also sets the	preprocessor
	   symbol "__Xswape".

       -mtelephony
	   Passed  down	 to  the  assembler  to	 enable	 dual- and single-operand instructions for telephony.  Also sets the
	   preprocessor symbol "__Xtelephony".	This option is deprecated.

       -mxy
	   Passed down to the assembler to enable the XY memory extension.  Also sets the preprocessor symbol "__Xxy".

       The following options control how the assembly code is annotated:

       -misize
	   Annotate assembler instructions with estimated addresses.

       -mannotate-align
	   Does nothing.  Preserved for backward compatibility.

       The following options are passed through to the linker:

       -marclinux
	   Passed through to the linker, to specify use of the "arclinux" emulation.  This option is enabled by	 default  in
	   tool chains built for "arc-linux-uclibc" and "arceb-linux-uclibc" targets when profiling is not requested.

       -marclinux_prof
	   Passed through to the linker, to specify use of the "arclinux_prof" emulation.  This option is enabled by default
	   in tool chains built for "arc-linux-uclibc" and "arceb-linux-uclibc" targets when profiling is requested.

       The following options control the semantics of generated code:

       -mlong-calls
	   Generate calls as register indirect calls, thus providing access to the full 32-bit address range.

       -mmedium-calls
	   Don't use less than 25-bit addressing range for calls, which is the offset available for an unconditional branch-
	   and-link  instruction.   Conditional execution of function calls is suppressed, to allow use of the 25-bit range,
	   rather than the 21-bit range with conditional branch-and-link.  This is the default for  tool  chains  built	 for
	   "arc-linux-uclibc" and "arceb-linux-uclibc" targets.

       -G num
	   Put definitions of externally-visible data in a small data section if that data is no bigger than num bytes.	 The
	   default value of num is 4 for any ARC configuration, or 8 when we have double load/store operations.

       -mno-sdata
	   Do  not  generate  sdata  references.   This	 is  the  default  for	tool chains built for "arc-linux-uclibc" and
	   "arceb-linux-uclibc" targets.

       -mvolatile-cache
	   Use ordinarily cached memory accesses for volatile references.  This is the default.

       -mno-volatile-cache
	   Enable cache bypass for volatile references.

       The following options fine tune code generation:

       -malign-call
	   Does nothing.  Preserved for backward compatibility.

       -mauto-modify-reg
	   Enable the use of pre/post modify with register displacement.

       -mbbit-peephole
	   Does nothing.  Preserved for backward compatibility.

       -mno-brcc
	   This option disables a target-specific pass in arc_reorg to generate	 compare-and-branch  ("brcc")  instructions.
	   It has no effect on generation of these instructions driven by the combiner pass.

       -mcase-vector-pcrel
	   Use PC-relative switch case tables to enable case table shortening.	This is the default for -Os.

       -mcompact-casesi
	   Enable  compact  "casesi" pattern.  This is the default for -Os, and only available for ARCv1 cores.	 This option
	   is deprecated.

       -mno-cond-exec
	   Disable the ARCompact-specific pass to generate conditional execution instructions.

	   Due to delay slot scheduling and interactions between operand numbers, literal sizes,  instruction  lengths,	 and
	   the	support	 for  conditional  execution, the target-independent pass to generate conditional execution is often
	   lacking, so the ARC port has kept a special pass around that tries to find more conditional execution  generation
	   opportunities  after register allocation, branch shortening, and delay slot scheduling have been done.  This pass
	   generally, but not always, improves performance and code size, at the cost of extra compilation  time,  which  is
	   why	there is an option to switch it off.  If you have a problem with call instructions exceeding their allowable
	   offset range because they are conditionalized, you should consider using -mmedium-calls instead.

       -mearly-cbranchsi
	   Enable pre-reload use of the "cbranchsi" pattern.

       -mexpand-adddi
	   Expand "adddi3" and "subdi3" at RTL generation time into "add.f", "adc" etc.	 This option is deprecated.

       -mindexed-loads
	   Enable the use of indexed loads.  This can be problematic because some optimizers then assume that indexed stores
	   exist, which is not the case.

       -mlra
	   Does nothing.  Preserved for backward compatibility.

       -mlra-priority-none
	   Don't indicate any priority for target registers.

       -mlra-priority-compact
	   Indicate target register priority for r0..r3 / r12..r15.

       -mlra-priority-noncompact
	   Reduce target register priority for r0..r3 / r12..r15.

       -mmillicode
	   When optimizing for size (using -Os), prologues and epilogues that have to save or  restore	a  large  number  of
	   registers  are  often shortened by using call to a special function in libgcc; this is referred to as a millicode
	   call.  As these calls can pose performance issues, and/or cause linking issues when linking in a nonstandard way,
	   this option is provided to turn on or off millicode call generation.

       -mcode-density-frame
	   This option enable the compiler to emit "enter" and "leave" instructions.  These instructions are only valid	 for
	   CPUs with code-density feature.

       -mmixed-code
	   Does nothing.  Preserved for backward compatibility.

       -mq-class
	   Ths option is deprecated.  Enable q instruction alternatives.  This is the default for -Os.

       -mRcq
	   Does nothing.  Preserved for backward compatibility.

       -mRcw
	   Does nothing.  Preserved for backward compatibility.

       -msize-level=level
	   Fine-tune  size  optimization with regards to instruction lengths and alignment.  The recognized values for level
	   are:

	   0   No size optimization.  This level is deprecated and treated like 1.

	   1   Short instructions are used opportunistically.

	   2   In addition, alignment of loops and of code after barriers are dropped.

	   3   In addition, optional data alignment is dropped, and the option Os is enabled.

	   This defaults to 3 when -Os is in effect.  Otherwise, the behavior when this is not set is equivalent to level 1.

       -mtune=cpu
	   Set instruction scheduling parameters for cpu, overriding any implied by -mcpu=.

	   Supported values for cpu are

	   ARC600
	       Tune for ARC600 CPU.

	   ARC601
	       Tune for ARC601 CPU.

	   ARC700
	       Tune for ARC700 CPU with standard multiplier block.

	   ARC700-xmac
	       Tune for ARC700 CPU with XMAC block.

	   ARC725D
	       Tune for ARC725D CPU.

	   ARC750D
	       Tune for ARC750D CPU.

	   core3
	       Tune for ARCv2 core3 type CPU.  This option enable usage of "dbnz" instruction.

	   release31a
	       Tune for ARC4x release 3.10a.

       -mmultcost=num
	   Cost to assume for a multiply instruction, with 4 being equal to a normal instruction.

       -munalign-prob-threshold=probability
	   Does nothing.  Preserved for backward compatibility.

       The following options are maintained for backward compatibility, but are now deprecated and  will  be  removed  in  a
       future release:

       -margonaut
	   Obsolete FPX.

       -mbig-endian
       -EB Compile  code  for  big-endian targets.  Use of these options is now deprecated.  Big-endian code is supported by
	   configuring GCC to build "arceb-elf32" and "arceb-linux-uclibc" targets, for which big endian is the default.

       -mlittle-endian
       -EL Compile code for little-endian targets.  Use of these options is now deprecated.  Little-endian code is supported
	   by configuring GCC to build "arc-elf32" and "arc-linux-uclibc" targets, for which little endian is the default.

       -mbarrel_shifter
	   Replaced by -mbarrel-shifter.

       -mdpfp_compact
	   Replaced by -mdpfp-compact.

       -mdpfp_fast
	   Replaced by -mdpfp-fast.

       -mdsp_packa
	   Replaced by -mdsp-packa.

       -mEA
	   Replaced by -mea.

       -mmac_24
	   Replaced by -mmac-24.

       -mmac_d16
	   Replaced by -mmac-d16.

       -mspfp_compact
	   Replaced by -mspfp-compact.

       -mspfp_fast
	   Replaced by -mspfp-fast.

       -mtune=cpu
	   Values arc600, arc601, arc700 and arc700-xmac for cpu are replaced by  ARC600,  ARC601,  ARC700  and	 ARC700-xmac
	   respectively.

       -multcost=num
	   Replaced by -mmultcost.

       ARM Options

       These -m options are defined for the ARM port:

       -mabi=name
	   Generate code for the specified ABI.	 Permissible values are: apcs-gnu, atpcs, aapcs, aapcs-linux and iwmmxt.

       -mapcs-frame
	   Generate  a stack frame that is compliant with the ARM Procedure Call Standard for all functions, even if this is
	   not strictly necessary for correct execution of the	code.	Specifying  -fomit-frame-pointer  with	this  option
	   causes  the stack frames not to be generated for leaf functions.  The default is -mno-apcs-frame.  This option is
	   deprecated.

       -mapcs
	   This is a synonym for -mapcs-frame and is deprecated.

       -mthumb-interwork
	   Generate code that supports calling between the ARM and Thumb instruction sets.  Without this option,  on  pre-v5
	   architectures,  the	two  instruction  sets	cannot	be  reliably  used  inside  one	 program.   The	 default  is
	   -mno-thumb-interwork, since slightly larger code is generated when  -mthumb-interwork  is  specified.   In  AAPCS
	   configurations this option is meaningless.

       -mno-sched-prolog
	   Prevent  the	 reordering  of	 instructions in the function prologue, or the merging of those instruction with the
	   instructions in the function's body.	 This means that all functions start with a recognizable set of instructions
	   (or in fact one of a choice from a small set of different function prologues), and this information can  be	used
	   to locate the start of functions inside an executable piece of code.	 The default is -msched-prolog.

       -mfloat-abi=name
	   Specifies which floating-point ABI to use.  Permissible values are: soft, softfp and hard.

	   Specifying  soft  causes  GCC  to generate output containing library calls for floating-point operations.  softfp
	   allows the generation of code using hardware floating-point instructions, but still uses the	 soft-float  calling
	   conventions.	 hard allows generation of floating-point instructions and uses FPU-specific calling conventions.

	   The	default	 depends on the specific target configuration.	Note that the hard-float and soft-float ABIs are not
	   link-compatible; you must compile your entire program with the same ABI,  and  link	with  a	 compatible  set  of
	   libraries.

       -mgeneral-regs-only
	   Generate code which uses only the general-purpose registers.	 This will prevent the compiler from using floating-
	   point and Advanced SIMD registers but will not impose any restrictions on the assembler.

       -mlittle-endian
	   Generate  code  for	a  processor  running  in  little-endian  mode.	  This	is  the	 default  for  all  standard
	   configurations.

       -mbig-endian
	   Generate code for a processor running in big-endian mode; the default is to	compile	 code  for  a  little-endian
	   processor.

       -mbe8
       -mbe32
	   When	 linking a big-endian image select between BE8 and BE32 formats.  The option has no effect for little-endian
	   images and is ignored.  The default is dependent on the  selected  target  architecture.   For  ARMv6  and  later
	   architectures  the  default is BE8, for older architectures the default is BE32.  BE32 format has been deprecated
	   by ARM.

       -march=name[+extension...]
	   This specifies the name of the  target  ARM	architecture.	GCC  uses  this	 name  to  determine  what  kind  of
	   instructions	 it  can emit when generating assembly code.  This option can be used in conjunction with or instead
	   of the -mcpu= option.

	   Permissible names are: armv4t, armv5t, armv5te, armv6, armv6j, armv6k, armv6kz, armv6t2, armv6z, armv6zk,  armv7,
	   armv7-a,  armv7ve,  armv8-a,	 armv8.1-a, armv8.2-a, armv8.3-a, armv8.4-a, armv8.5-a, armv8.6-a, armv9-a, armv7-r,
	   armv8-r, armv6-m, armv6s-m, armv7-m, armv7e-m, armv8-m.base, armv8-m.main, armv8.1-m.main, iwmmxt and iwmmxt2.

	   Additionally, the following architectures, which lack support for the Thumb execution state, are  recognized	 but
	   support is deprecated: armv4.

	   Many	 of  the  architectures	 support extensions.  These can be added by appending +extension to the architecture
	   name.  Extension options are processed in order and capabilities accumulate.	 An extension will also	 enable	 any
	   necessary base extensions upon which it depends.  For example, the +crypto extension will always enable the +simd
	   extension.	The  exception	to  the additive construction is for extensions that are prefixed with +no...: these
	   extensions disable the specified option and any other  extensions  that  may	 depend	 on  the  presence  of	that
	   extension.

	   For	example, -march=armv7-a+simd+nofp+vfpv4 is equivalent to writing -march=armv7-a+vfpv4 since the +simd option
	   is entirely disabled by the +nofp option that follows it.

	   Most extension names are generically named, but have an effect that is dependent upon the architecture  to  which
	   it  is applied.  For example, the +simd option can be applied to both armv7-a and armv8-a architectures, but will
	   enable the original ARMv7-A Advanced SIMD (Neon) extensions for armv7-a and the ARMv8-A variant for armv8-a.

	   The table below lists the supported extensions for each architecture.  Architectures not mentioned do not support
	   any extensions.

	   armv5te
	   armv6
	   armv6j
	   armv6k
	   armv6kz
	   armv6t2
	   armv6z
	   armv6zk
	       +fp The VFPv2 floating-point instructions.  The extension +vfpv2 can be used as an alias for this extension.

	       +nofp
		   Disable the floating-point instructions.

	   armv7
	       The common subset of the ARMv7-A, ARMv7-R and ARMv7-M architectures.

	       +fp The VFPv3 floating-point instructions, with 16 double-precision registers.  The extension +vfpv3-d16	 can
		   be  used  as	 an alias for this extension.  Note that floating-point is not supported by the base ARMv7-M
		   architecture, but is compatible with both the ARMv7-A and ARMv7-R architectures.

	       +nofp
		   Disable the floating-point instructions.

	   armv7-a
	       +mp The multiprocessing extension.

	       +sec
		   The security extension.

	       +fp The VFPv3 floating-point instructions, with 16 double-precision registers.  The extension +vfpv3-d16	 can
		   be used as an alias for this extension.

	       +simd
		   The	Advanced  SIMD	(Neon)	v1  and	 the  VFPv3  floating-point  instructions.  The extensions +neon and
		   +neon-vfpv3 can be used as aliases for this extension.

	       +vfpv3
		   The VFPv3 floating-point instructions, with 32 double-precision registers.

	       +vfpv3-d16-fp16
		   The VFPv3  floating-point  instructions,  with  16  double-precision	 registers  and	 the  half-precision
		   floating-point conversion operations.

	       +vfpv3-fp16
		   The	VFPv3  floating-point  instructions,  with  32	double-precision  registers  and  the half-precision
		   floating-point conversion operations.

	       +vfpv4-d16
		   The VFPv4 floating-point instructions, with 16 double-precision registers.

	       +vfpv4
		   The VFPv4 floating-point instructions, with 32 double-precision registers.

	       +neon-fp16
		   The Advanced SIMD (Neon) v1 and the VFPv3 floating-point instructions, with the half-precision  floating-
		   point conversion operations.

	       +neon-vfpv4
		   The Advanced SIMD (Neon) v2 and the VFPv4 floating-point instructions.

	       +nosimd
		   Disable the Advanced SIMD instructions (does not disable floating point).

	       +nofp
		   Disable the floating-point and Advanced SIMD instructions.

	   armv7ve
	       The extended version of the ARMv7-A architecture with support for virtualization.

	       +fp The	VFPv4 floating-point instructions, with 16 double-precision registers.	The extension +vfpv4-d16 can
		   be used as an alias for this extension.

	       +simd
		   The Advanced SIMD (Neon) v2 and the VFPv4 floating-point instructions.  The extension +neon-vfpv4 can  be
		   used as an alias for this extension.

	       +vfpv3-d16
		   The VFPv3 floating-point instructions, with 16 double-precision registers.

	       +vfpv3
		   The VFPv3 floating-point instructions, with 32 double-precision registers.

	       +vfpv3-d16-fp16
		   The	VFPv3  floating-point  instructions,  with  16	double-precision  registers  and  the half-precision
		   floating-point conversion operations.

	       +vfpv3-fp16
		   The VFPv3  floating-point  instructions,  with  32  double-precision	 registers  and	 the  half-precision
		   floating-point conversion operations.

	       +vfpv4-d16
		   The VFPv4 floating-point instructions, with 16 double-precision registers.

	       +vfpv4
		   The VFPv4 floating-point instructions, with 32 double-precision registers.

	       +neon
		   The	Advanced SIMD (Neon) v1 and the VFPv3 floating-point instructions.  The extension +neon-vfpv3 can be
		   used as an alias for this extension.

	       +neon-fp16
		   The Advanced SIMD (Neon) v1 and the VFPv3 floating-point instructions, with the half-precision  floating-
		   point conversion operations.

	       +nosimd
		   Disable the Advanced SIMD instructions (does not disable floating point).

	       +nofp
		   Disable the floating-point and Advanced SIMD instructions.

	   armv8-a
	       +crc
		   The Cyclic Redundancy Check (CRC) instructions.

	       +simd
		   The ARMv8-A Advanced SIMD and floating-point instructions.

	       +crypto
		   The cryptographic instructions.

	       +nocrypto
		   Disable the cryptographic instructions.

	       +nofp
		   Disable the floating-point, Advanced SIMD and cryptographic instructions.

	       +sb Speculation Barrier Instruction.

	       +predres
		   Execution and Data Prediction Restriction Instructions.

	   armv8.1-a
	       +simd
		   The ARMv8.1-A Advanced SIMD and floating-point instructions.

	       +crypto
		   The cryptographic instructions.  This also enables the Advanced SIMD and floating-point instructions.

	       +nocrypto
		   Disable the cryptographic instructions.

	       +nofp
		   Disable the floating-point, Advanced SIMD and cryptographic instructions.

	       +sb Speculation Barrier Instruction.

	       +predres
		   Execution and Data Prediction Restriction Instructions.

	   armv8.2-a
	   armv8.3-a
	       +fp16
		   The	half-precision floating-point data processing instructions.  This also enables the Advanced SIMD and
		   floating-point instructions.

	       +fp16fml
		   The half-precision floating-point fmla extension.  This also enables	 the  half-precision  floating-point
		   extension and Advanced SIMD and floating-point instructions.

	       +simd
		   The ARMv8.1-A Advanced SIMD and floating-point instructions.

	       +crypto
		   The cryptographic instructions.  This also enables the Advanced SIMD and floating-point instructions.

	       +dotprod
		   Enable the Dot Product extension.  This also enables Advanced SIMD instructions.

	       +nocrypto
		   Disable the cryptographic extension.

	       +nofp
		   Disable the floating-point, Advanced SIMD and cryptographic instructions.

	       +sb Speculation Barrier Instruction.

	       +predres
		   Execution and Data Prediction Restriction Instructions.

	       +i8mm
		   8-bit  Integer  Matrix  Multiply  instructions.   This  also	 enables  Advanced  SIMD  and floating-point
		   instructions.

	       +bf16
		   Brain half-precision floating-point instructions.  This also enables	 Advanced  SIMD	 and  floating-point
		   instructions.

	   armv8.4-a
	       +fp16
		   The	half-precision floating-point data processing instructions.  This also enables the Advanced SIMD and
		   floating-point instructions as well as the Dot Product extension and	 the  half-precision  floating-point
		   fmla extension.

	       +simd
		   The ARMv8.3-A Advanced SIMD and floating-point instructions as well as the Dot Product extension.

	       +crypto
		   The	cryptographic  instructions.  This also enables the Advanced SIMD and floating-point instructions as
		   well as the Dot Product extension.

	       +nocrypto
		   Disable the cryptographic extension.

	       +nofp
		   Disable the floating-point, Advanced SIMD and cryptographic instructions.

	       +sb Speculation Barrier Instruction.

	       +predres
		   Execution and Data Prediction Restriction Instructions.

	       +i8mm
		   8-bit Integer  Matrix  Multiply  instructions.   This  also	enables	 Advanced  SIMD	 and  floating-point
		   instructions.

	       +bf16
		   Brain  half-precision  floating-point  instructions.	  This also enables Advanced SIMD and floating-point
		   instructions.

	   armv8.5-a
	       +fp16
		   The half-precision floating-point data processing instructions.  This also enables the Advanced SIMD	 and
		   floating-point  instructions	 as  well as the Dot Product extension and the half-precision floating-point
		   fmla extension.

	       +simd
		   The ARMv8.3-A Advanced SIMD and floating-point instructions as well as the Dot Product extension.

	       +crypto
		   The cryptographic instructions.  This also enables the Advanced SIMD and floating-point  instructions  as
		   well as the Dot Product extension.

	       +nocrypto
		   Disable the cryptographic extension.

	       +nofp
		   Disable the floating-point, Advanced SIMD and cryptographic instructions.

	       +i8mm
		   8-bit  Integer  Matrix  Multiply  instructions.   This  also	 enables  Advanced  SIMD  and floating-point
		   instructions.

	       +bf16
		   Brain half-precision floating-point instructions.  This also enables	 Advanced  SIMD	 and  floating-point
		   instructions.

	   armv8.6-a
	       +fp16
		   The	half-precision floating-point data processing instructions.  This also enables the Advanced SIMD and
		   floating-point instructions as well as the Dot Product extension and	 the  half-precision  floating-point
		   fmla extension.

	       +simd
		   The ARMv8.3-A Advanced SIMD and floating-point instructions as well as the Dot Product extension.

	       +crypto
		   The	cryptographic  instructions.  This also enables the Advanced SIMD and floating-point instructions as
		   well as the Dot Product extension.

	       +nocrypto
		   Disable the cryptographic extension.

	       +nofp
		   Disable the floating-point, Advanced SIMD and cryptographic instructions.

	       +i8mm
		   8-bit Integer  Matrix  Multiply  instructions.   This  also	enables	 Advanced  SIMD	 and  floating-point
		   instructions.

	       +bf16
		   Brain  half-precision  floating-point  instructions.	  This also enables Advanced SIMD and floating-point
		   instructions.

	   armv7-r
	       +fp.sp
		   The single-precision VFPv3 floating-point instructions.  The extension +vfpv3xd can be used as  an  alias
		   for this extension.

	       +fp The	VFPv3  floating-point instructions with 16 double-precision registers.	The extension +vfpv3-d16 can
		   be used as an alias for this extension.

	       +vfpv3xd-d16-fp16
		   The single-precision VFPv3 floating-point instructions with 16 double-precision registers and  the  half-
		   precision floating-point conversion operations.

	       +vfpv3-d16-fp16
		   The VFPv3 floating-point instructions with 16 double-precision registers and the half-precision floating-
		   point conversion operations.

	       +nofp
		   Disable the floating-point extension.

	       +idiv
		   The ARM-state integer division instructions.

	       +noidiv
		   Disable the ARM-state integer division extension.

	   armv7e-m
	       +fp The single-precision VFPv4 floating-point instructions.

	       +fpv5
		   The single-precision FPv5 floating-point instructions.

	       +fp.dp
		   The single- and double-precision FPv5 floating-point instructions.

	       +nofp
		   Disable the floating-point extensions.

	   armv8.1-m.main
	       +dsp
		   The DSP instructions.

	       +mve
		   The M-Profile Vector Extension (MVE) integer instructions.

	       +mve.fp
		   The M-Profile Vector Extension (MVE) integer and single precision floating-point instructions.

	       +fp The single-precision floating-point instructions.

	       +fp.dp
		   The single- and double-precision floating-point instructions.

	       +nofp
		   Disable the floating-point extension.

	       +cdecp0, +cdecp1, ... , +cdecp7
		   Enable the Custom Datapath Extension (CDE) on selected coprocessors according to the numbers given in the
		   options in the range 0 to 7.

	       +pacbti
		   Enable the Pointer Authentication and Branch Target Identification Extension.

	   armv8-m.main
	       +dsp
		   The DSP instructions.

	       +nodsp
		   Disable the DSP extension.

	       +fp The single-precision floating-point instructions.

	       +fp.dp
		   The single- and double-precision floating-point instructions.

	       +nofp
		   Disable the floating-point extension.

	       +cdecp0, +cdecp1, ... , +cdecp7
		   Enable the Custom Datapath Extension (CDE) on selected coprocessors according to the numbers given in the
		   options in the range 0 to 7.

	   armv8-r
	       +crc
		   The Cyclic Redundancy Check (CRC) instructions.

	       +fp.sp
		   The single-precision FPv5 floating-point instructions.

	       +simd
		   The ARMv8-A Advanced SIMD and floating-point instructions.

	       +crypto
		   The cryptographic instructions.

	       +nocrypto
		   Disable the cryptographic instructions.

	       +nofp
		   Disable the floating-point, Advanced SIMD and cryptographic instructions.

	   -march=native  causes  the  compiler	 to  auto-detect  the  architecture of the build computer.  At present, this
	   feature is only supported on GNU/Linux, and	not  all  architectures	 are  recognized.   If	the  auto-detect  is
	   unsuccessful the option has no effect.

	   -march=unset	 causes	 the  compiler	to ignore any -march=... options that appear earlier on the command line and
	   behave as if the option was	never  passed.	 This  is  useful  to  avoid  warnings	about  conflicting  CPU	 and
	   architecture options when the two produce different architecture specifications.

       -mtune=name
	   This option specifies the name of the target ARM processor for which GCC should tune the performance of the code.
	   For	some  ARM  implementations  better performance can be obtained by using this option.  Permissible names are:
	   arm7tdmi, arm7tdmi-s, arm710t, arm720t, arm740t, strongarm,	strongarm110,  strongarm1100,  strongarm1110,  arm8,
	   arm810,  arm9,  arm9e,  arm920, arm920t, arm922t, arm946e-s, arm966e-s, arm968e-s, arm926ej-s, arm940t, arm9tdmi,
	   arm10tdmi, arm1020t, arm1026ej-s, arm10e,  arm1020e,	 arm1022e,  arm1136j-s,	 arm1136jf-s,  mpcore,	mpcorenovfp,
	   arm1156t2-s,	  arm1156t2f-s,	  arm1176jz-s,	 arm1176jzf-s,	generic-armv7-a,  cortex-a5,  cortex-a7,  cortex-a8,
	   cortex-a9, cortex-a12,  cortex-a15,	cortex-a17,  cortex-a32,  cortex-a35,  cortex-a53,  cortex-a55,	 cortex-a57,
	   cortex-a72,	cortex-a73, cortex-a75, cortex-a76, cortex-a76ae, cortex-a77, cortex-a78, cortex-a78ae, cortex-a78c,
	   cortex-a710, ares, cortex-r4, cortex-r4f, cortex-r5, cortex-r7, cortex-r8, cortex-r52, cortex-r52plus, cortex-m0,
	   cortex-m0plus, cortex-m1, cortex-m3,	 cortex-m4,  cortex-m7,	 cortex-m23,  cortex-m33,  cortex-m35p,	 cortex-m52,
	   cortex-m55,	  cortex-m85,	 cortex-x1,    cortex-x1c,    cortex-m1.small-multiply,	   cortex-m0.small-multiply,
	   cortex-m0plus.small-multiply, exynos-m1, marvell-pj4,  neoverse-n1,	neoverse-n2,  neoverse-v1,  xscale,  iwmmxt,
	   iwmmxt2, ep9312, fa526, fa626, fa606te, fa626te, fmp626, fa726te, star-mc1, xgene1.

	   Additionally,  this	option can specify that GCC should tune the performance of the code for a big.LITTLE system.
	   Permissible names are: cortex-a15.cortex-a7, cortex-a17.cortex-a7, cortex-a57.cortex-a53,  cortex-a72.cortex-a53,
	   cortex-a72.cortex-a35, cortex-a73.cortex-a53, cortex-a75.cortex-a55, cortex-a76.cortex-a55.

	   -mtune=generic-arch	specifies that GCC should tune the performance for a blend of processors within architecture
	   arch.  The aim is to generate code that run well on	the  current  most  popular  processors,  balancing  between
	   optimizations  that benefit some CPUs in the range, and avoiding performance pitfalls of other CPUs.	 The effects
	   of this option may change in future GCC versions as CPU models come and go.

	   -mtune permits the same extension options as -mcpu, but the extension options do not affect	the  tuning  of	 the
	   generated code.

	   -mtune=native causes the compiler to auto-detect the CPU of the build computer.  At present, this feature is only
	   supported  on GNU/Linux, and not all architectures are recognized.  If the auto-detect is unsuccessful the option
	   has no effect.

       -mcpu=name[+extension...]
	   This specifies the name of the target ARM processor.	 GCC uses this name to derive the name	of  the	 target	 ARM
	   architecture	 (as  if  specified  by	 -march) and the ARM processor type for which to tune for performance (as if
	   specified by -mtune).  Where this option is used in	conjunction  with  -march  or  -mtune,	those  options	take
	   precedence over the appropriate part of this option.

	   Many	 of  the  supported  CPUs  implement  optional architectural extensions.  Where this is so the architectural
	   extensions are normally enabled by default.	If implementations that lack the extension exist, then the extension
	   syntax can be used to disable those extensions that have been omitted.   For	 floating-point	 and  Advanced	SIMD
	   (Neon)  instructions,  the  settings of the options -mfloat-abi and -mfpu must also be considered: floating-point
	   and Advanced SIMD instructions will only be used if -mfloat-abi is not set to soft;	and  any  setting  of  -mfpu
	   other than auto will override the available floating-point and SIMD extension instructions.

	   For	example, cortex-a9 can be found in three major configurations: integer only, with just a floating-point unit
	   or with floating-point and Advanced SIMD.  The default is to enable all  the	 instructions,	but  the  extensions
	   +nosimd  and	 +nofp	can  be	 used  to  disable  just  the  SIMD or both the SIMD and floating-point instructions
	   respectively.

	   Permissible names for this option are the same as those for -mtune.

	   The following extension options are common to the listed CPUs:

	   +nodsp
	       Disable the DSP instructions on cortex-m33, cortex-m35p, cortex-m52, cortex-m55 and cortex-m85.	Also disable
	       the M-Profile Vector Extension (MVE) integer and single precision floating-point instructions on	 cortex-m52,
	       cortex-m55 and cortex-m85.

	   +nopacbti
	       Disable the Pointer Authentication and Branch Target Identification Extension on cortex-m52 and cortex-m85.

	   +nomve
	       Disable	the  M-Profile	Vector	Extension  (MVE) integer and single precision floating-point instructions on
	       cortex-m52, cortex-m55 and cortex-m85.

	   +nomve.fp
	       Disable the M-Profile Vector Extension (MVE) single  precision  floating-point  instructions  on	 cortex-m52,
	       cortex-m55 and cortex-m85.

	   +cdecp0, +cdecp1, ... , +cdecp7
	       Enable  the  Custom  Datapath  Extension (CDE) on selected coprocessors according to the numbers given in the
	       options in the range 0 to 7 on cortex-m52, cortex-m55 and star-mc1.

	   +nofp
	       Disables the floating-point  instructions  on  arm9e,  arm946e-s,  arm966e-s,  arm968e-s,  arm10e,  arm1020e,
	       arm1022e,  arm926ej-s,  arm1026ej-s,  cortex-r5,	 cortex-r7,  cortex-r8,	 cortex-m4,  cortex-m7,	 cortex-m33,
	       cortex-m35p, cortex-m52, cortex-m55 and cortex-m85.  Disables the floating-point	 and  SIMD  instructions  on
	       generic-armv7-a,	  cortex-a5,   cortex-a7,   cortex-a8,	 cortex-a9,   cortex-a12,   cortex-a15,	 cortex-a17,
	       cortex-a15.cortex-a7, cortex-a17.cortex-a7, cortex-a32, cortex-a35, cortex-a53 and cortex-a55.

	   +nofp.dp
	       Disables	 the  double-precision	component  of  the  floating-point  instructions  on  cortex-r5,  cortex-r7,
	       cortex-r8, cortex-r52, cortex-r52plus and cortex-m7.

	   +nosimd
	       Disables	 the  SIMD  (but  not  floating-point)	instructions  on  generic-armv7-a,  cortex-a5, cortex-a7 and
	       cortex-a9.

	   +crypto
	       Enables the  cryptographic  instructions	 on  cortex-a32,  cortex-a35,  cortex-a53,  cortex-a55,	 cortex-a57,
	       cortex-a72,   cortex-a73,   cortex-a75,	 exynos-m1,  xgene1,  cortex-a57.cortex-a53,  cortex-a72.cortex-a53,
	       cortex-a73.cortex-a35, cortex-a73.cortex-a53 and cortex-a75.cortex-a55.

	   Additionally the generic-armv7-a pseudo target defaults to VFPv3 with 16 double-precision registers.	 It supports
	   the following extension options: mp, sec, vfpv3-d16, vfpv3, vfpv3-d16-fp16, vfpv3-fp16, vfpv4-d16,  vfpv4,  neon,
	   neon-vfpv3, neon-fp16, neon-vfpv4.  The meanings are the same as for the extensions to -march=armv7-a.

	   -mcpu=generic-arch  is  also	 permissible,  and is equivalent to -march=arch -mtune=generic-arch.  See -mtune for
	   more information.

	   -mcpu=native causes the compiler to auto-detect the CPU of the build computer.  At present, this feature is	only
	   supported  on GNU/Linux, and not all architectures are recognized.  If the auto-detect is unsuccessful the option
	   has no effect.

	   -mcpu=unset causes the compiler to ignore any -mcpu=... options that appear	earlier	 on  the  command  line	 and
	   behave  as  if  the	option	was  never  passed.   This  is	useful	to  avoid warnings about conflicting CPU and
	   architecture options when the two produce different architecture specifications.

       -mfpu=name
	   This specifies what floating-point hardware (or hardware emulation) is  available  on  the  target.	 Permissible
	   names  are:	auto,  vfpv2,  vfpv3,  vfpv3-fp16,  vfpv3-d16,	vfpv3-d16-fp16,	 vfpv3xd,  vfpv3xd-fp16, neon-vfpv3,
	   neon-fp16,  vfpv4,  vfpv4-d16,  fpv4-sp-d16,	 neon-vfpv4,  fpv5-d16,	 fpv5-sp-d16,  fp-armv8,  neon-fp-armv8	 and
	   crypto-neon-fp-armv8.  Note that neon is an alias for neon-vfpv3 and vfp is an alias for vfpv2.

	   The setting auto is the default and is special.  It causes the compiler to select the floating-point and Advanced
	   SIMD instructions based on the settings of -mcpu and -march.

	   If  the  selected floating-point hardware includes the NEON extension (e.g. -mfpu=neon), note that floating-point
	   operations are not  generated  by  GCC's  auto-vectorization	 pass  unless  -funsafe-math-optimizations  is	also
	   specified.	This  is  because  NEON	 hardware  does not fully implement the IEEE 754 standard for floating-point
	   arithmetic (in particular denormal values are treated as zero), so the use of NEON instructions  may	 lead  to  a
	   loss of precision.

	   You can also set the fpu name at function level by using the target("fpu=") function attributes or pragmas.

       -mfp16-format=name
	   Specify  the	 format	 of  the "__fp16" half-precision floating-point type.  Permissible names are none, ieee, and
	   alternative; the default is none, in which case the "__fp16" type is not defined.

       -mstructure-size-boundary=n
	   The sizes of all structures and unions are rounded up to a multiple of the number of bits  set  by  this  option.
	   Permissible	values	are 8, 32 and 64.  The default value varies for different toolchains.  For the COFF targeted
	   toolchain the default value is 8.  A value of 64 is only allowed if the underlying ABI supports it.

	   Specifying a larger number can produce faster, more efficient code,	but  can  also	increase  the  size  of	 the
	   program.   Different values are potentially incompatible.  Code compiled with one value cannot necessarily expect
	   to work with code or libraries compiled with another value, if they	exchange  information  using  structures  or
	   unions.

	   This option is deprecated.

       -mabort-on-noreturn
	   Generate  a	call  to  the  function "abort" at the end of a "noreturn" function.  It is executed if the function
	   tries to return.

       -mlong-calls
       -mno-long-calls
	   Tells the compiler to perform function calls by first loading the address of the function  into  a  register	 and
	   then performing a subroutine call on this register.	This switch is needed if the target function lies outside of
	   the 64-megabyte addressing range of the offset-based version of subroutine call instruction.

	   Even	 if this switch is enabled, not all function calls are turned into long calls.	The heuristic is that static
	   functions, functions that have the "short_call" attribute, functions that are inside	 the  scope  of	 a  "#pragma
	   no_long_calls"  directive,  and  functions  whose  definitions  have	 already  been	compiled  within the current
	   compilation unit are not turned into long calls.  The exceptions to this rule are that weak function definitions,
	   functions with the "long_call" attribute or the "section" attribute, and functions that are within the scope of a
	   "#pragma long_calls" directive are always turned into long calls.

	   This feature is not enabled by default.  Specifying	-mno-long-calls	 restores  the	default	 behavior,  as	does
	   placing the function calls within the scope of a "#pragma long_calls_off" directive.	 Note these switches have no
	   effect on how the compiler generates code to handle function calls via function pointers.

       -msingle-pic-base
	   Treat  the  register	 used  for  PIC	 addressing  as	 read-only,  rather than loading it in the prologue for each
	   function.  The runtime system is responsible for initializing this register	with  an  appropriate  value  before
	   execution begins.

       -mpic-register=reg
	   Specify  the	 register  to  be  used for PIC addressing.  For standard PIC base case, the default is any suitable
	   register determined by compiler.  For single PIC base case, the default is R9 if target is EABI based  or  stack-
	   checking is enabled, otherwise the default is R10.

       -mpic-data-is-text-relative
	   Assume that the displacement between the text and data segments is fixed at static link time.  This permits using
	   PC-relative	addressing  operations to access data known to be in the data segment.	For non-VxWorks RTP targets,
	   this option is enabled by default.  When disabled on such targets, it will enable -msingle-pic-base by default.

       -mpoke-function-name
	   Write the name of each function into the text section, directly preceding the function prologue.   The  generated
	   code is similar to this:

			t0
			    .ascii "arm_poke_function_name", 0
			    .align
			t1
			    .word 0xff000000 + (t1 - t0)
			arm_poke_function_name
			    mov	    ip, sp
			    stmfd   sp!, {fp, ip, lr, pc}
			    sub	    fp, ip, #4

	   When	 performing a stack backtrace, code can inspect the value of "pc" stored at "fp + 0".  If the trace function
	   then looks at location "pc - 12" and the top 8 bits are set, then we know that there is a function name  embedded
	   immediately preceding this location and has length "((pc[-3]) & 0xff000000)".

       -mthumb
       -marm
	   Select  between generating code that executes in ARM and Thumb states.  The default for most configurations is to
	   generate code that executes in  ARM	state,	but  the  default  can	be  changed  by	 configuring  GCC  with	 the
	   --with-mode=state configure option.

	   You	can  also  override  the ARM and Thumb mode for each function by using the target("thumb") and target("arm")
	   function attributes or pragmas.

       -mflip-thumb
	   Switch ARM/Thumb modes on alternating functions.  This  option  is  provided	 for  regression  testing  of  mixed
	   Thumb/ARM code generation, and is not intended for ordinary use in compiling code.

       -mtpcs-frame
	   Generate  a	stack frame that is compliant with the Thumb Procedure Call Standard for all non-leaf functions.  (A
	   leaf function is one that does not call any other functions.)  The default is -mno-tpcs-frame.

       -mtpcs-leaf-frame
	   Generate a stack frame that is compliant with the Thumb Procedure Call Standard for all leaf functions.  (A	leaf
	   function is one that does not call any other functions.)  The default is -mno-apcs-leaf-frame.

       -mcallee-super-interworking
	   Gives all externally visible functions in the file being compiled an ARM instruction set header which switches to
	   Thumb  mode	before	executing  the	rest  of  the  function.  This allows these functions to be called from non-
	   interworking code.  This option is not valid in AAPCS configurations because interworking is enabled by default.

       -mcaller-super-interworking
	   Allows calls via function pointers (including virtual functions) to execute correctly regardless of	whether	 the
	   target  code	 has  been  compiled  for interworking or not.	There is a small overhead in the cost of executing a
	   function pointer if this  option  is	 enabled.   This  option  is  not  valid  in  AAPCS  configurations  because
	   interworking is enabled by default.

       -mtp=name
	   Specify   the  access  model	 for  the  thread  local  storage  pointer.   The  model  soft	generates  calls  to
	   "__aeabi_read_tp".  Other accepted models are tpidrurw, tpidruro and tpidrprw which fetch the thread pointer from
	   the corresponding system register directly (supported from the  arm6k  architecture	and  later).   These  system
	   registers  are  accessed  through  the  CP15	 co-processor  interface and the argument cp15 is also accepted as a
	   convenience alias of tpidruro.  The argument auto uses the best available method for the selected processor.	 The
	   default setting is auto.

       -mtls-dialect=dialect
	   Specify the dialect to use for accessing thread local storage.  Two dialects are supported---gnu and	 gnu2.	 The
	   gnu dialect selects the original GNU scheme for supporting local and global dynamic TLS models.  The gnu2 dialect
	   selects  the	 GNU  descriptor scheme, which provides better performance for shared libraries.  The GNU descriptor
	   scheme is compatible with the original scheme, but does  require  new  assembler,  linker  and  library  support.
	   Initial and local exec TLS models are unaffected by this option and always use the original scheme.

       -mword-relocations
	   Only	 generate  absolute  relocations  on  word-sized  values  (i.e. R_ARM_ABS32).  This is enabled by default on
	   targets (uClinux, SymbianOS) where the runtime loader imposes this  restriction,  and  when	-fpic  or  -fPIC  is
	   specified. This option conflicts with -mslow-flash-data.

       -mfix-cortex-m3-ldrd
	   Some	 Cortex-M3  cores  can	cause data corruption when "ldrd" instructions with overlapping destination and base
	   registers are used.	This option avoids generating these instructions.  This option is enabled  by  default	when
	   -mcpu=cortex-m3 is specified.

       -mfix-cortex-a57-aes-1742098
       -mno-fix-cortex-a57-aes-1742098
       -mfix-cortex-a72-aes-1655431
       -mno-fix-cortex-a72-aes-1655431
	   Enable  (disable)  mitigation  for  an  erratum  on	Cortex-A57 and Cortex-A72 that affects the AES cryptographic
	   instructions.  This option is enabled by default when either -mcpu=cortex-a57 or -mcpu=cortex-a72 is specified.

       -munaligned-access
       -mno-unaligned-access
	   Enables (or disables) reading and writing of 16- and 32- bit values from addresses that are not 16-	or  32-	 bit
	   aligned.   By  default  unaligned  access  is  disabled  for	 all pre-ARMv6, all ARMv6-M and for ARMv8-M Baseline
	   architectures, and enabled for all other architectures.  If unaligned access is not enabled then words in  packed
	   data structures are accessed a byte at a time.

	   The	ARM  attribute	"Tag_CPU_unaligned_access"  is	set  in	 the  generated object file to either true or false,
	   depending upon the setting of this  option.	 If  unaligned	access	is  enabled  then  the	preprocessor  symbol
	   "__ARM_FEATURE_UNALIGNED" is also defined.

       -mneon-for-64bits
	   This option is deprecated and has no effect.

       -mslow-flash-data
	   Assume  loading  data  from	flash  is slower than fetching instruction.  Therefore literal load is minimized for
	   better performance.	This option is only supported when compiling for ARMv7 M-profile  and  off  by	default.  It
	   conflicts with -mword-relocations.

       -masm-syntax-unified
	   Assume  inline assembler is using unified asm syntax.  The default is currently off which implies divided syntax.
	   This option has no impact on Thumb2. However, this may change in future releases of GCC.  Divided  syntax  should
	   be considered deprecated.

       -mrestrict-it
	   Restricts generation of IT blocks to conform to the rules of ARMv8-A.  IT blocks can only contain a single 16-bit
	   instruction from a select set of instructions. This option is on by default for ARMv8-A Thumb mode.

       -mprint-tune-info
	   Print CPU tuning information as comment in assembler file.  This is an option used only for regression testing of
	   the compiler and not intended for ordinary use in compiling code.  This option is disabled by default.

       -mverbose-cost-dump
	   Enable  verbose  cost  model	 dumping  in the debug dump files.  This option is provided for use in debugging the
	   compiler.

       -mpure-code
	   Do not allow constant data to be placed in code sections.  Additionally, when compiling  for	 ELF  object  format
	   give	 all  text  sections  the  ELF processor-specific section attribute "SHF_ARM_PURECODE".	 This option is only
	   available when generating non-pic code for M-profile targets.

       -mcmse
	   Generate secure code as per the "ARMv8-M Security  Extensions:  Requirements	 on  Development  Tools	 Engineering
	   Specification", which can be found on .

       -mfix-cmse-cve-2021-35465
	   Mitigate  against  a	 potential  security issue with the "VLLDM" instruction in some M-profile devices when using
	   CMSE (CVE-2021-365465).  This option is enabled by default when the option  -mcpu=  is  used	 with  "cortex-m33",
	   "cortex-m35p",  "cortex-m52",  "cortex-m55",	 "cortex-m85" or "star-mc1". The option -mno-fix-cmse-cve-2021-35465
	   can be used to disable the mitigation.

       -mstack-protector-guard=guard
       -mstack-protector-guard-offset=offset
	   Generate stack protection code using canary at guard.  Supported locations are global for a global canary or	 tls
	   for	a  canary  accessible  via  the	 TLS  register.	 The  option -mstack-protector-guard-offset= is for use with
	   -fstack-protector-guard=tls and not for use in user-land code.

       -mfdpic
       -mno-fdpic
	   Select the FDPIC ABI, which uses 64-bit function descriptors	 to  represent	pointers  to  functions.   When	 the
	   compiler  is	 configured  for "arm-*-uclinuxfdpiceabi" targets, this option is on by default and implies -fPIE if
	   none of the PIC/PIE-related options is provided.  On other targets,	it  only  enables  the	FDPIC-specific	code
	   generation features, and the user should explicitly provide the PIC/PIE-related options as needed.

	   Note	 that  static  linking	is  not supported because it would still involve the dynamic linker when the program
	   self-relocates.  If such behavior is acceptable, use -static and -Wl,-dynamic-linker options.

	   The	opposite  -mno-fdpic  option  is  useful  (and	required)  to  build  the  Linux  kernel  using	  the	same
	   ("arm-*-uclinuxfdpiceabi") toolchain as the one used to build the userland programs.

       -mbranch-protection=none|standard|pac-ret[+leaf][+bti]|bti[+pac-ret[+leaf]]
	   Enable  branch protection features (armv8.1-m.main only).  none generate code without branch protection or return
	   address signing.  standard[+leaf] generate code with all branch protection features	enabled	 at  their  standard
	   level.   pac-ret[+leaf] generate code with return address signing set to its standard level, which is to sign all
	   functions that save the return address to memory.  leaf When return address signing is enabled,  also  sign	leaf
	   functions  even  if	they  do  not  write the return address to memory.  +bti Add landing-pad instructions at the
	   permitted targets of indirect branch instructions.

	   If the +pacbti architecture extension is not enabled, then all  branch  protection  and  return  address  signing
	   operations  are  constrained	 to  use only the instructions defined in the architectural-NOP space. The generated
	   code will remain backwards-compatible with earlier versions of the architecture, but the additional security	 can
	   be enabled at run time on processors that support the PACBTI extension.

	   Branch  target  enforcement	using  BTI  can	 only  be enabled at runtime if all code in the application has been
	   compiled with at least -mbranch-protection=bti.

	   Any setting other than none is supported only on armv8-m.main or later.

	   The default is to generate code without branch protection or return address signing.

       AVR Options

       These options are defined for AVR implementations:

       -mmcu=mcu
	   Specify the AVR instruction set architecture (ISA) or device type.  The default for this option is "avr2".

	   The following AVR devices and ISAs are supported.  Note: A complete	device	support	 consists  of  startup	code
	   "crtmcu.o",	  a    device	 header	   "avr/io*.h",	  a   device   library	 "libmcu.a"   and   a	device-specs
	   ("https://gcc.gnu.org/wiki/avr-gcc#spec-files") file "specs-mcu". Only the latter is	 provided  by  the  compiler
	   according	  the	  supported	"mcu"s	   below.      The     rest	is     supported     by	    AVR-LibC
	   ("https://github.com/avrdudes/avr-libc/"), or by means  of  "atpack"	 ("https://gcc.gnu.org/wiki/avr-gcc#atpack")
	   files from the hardware manufacturer.

	   "avr2"
	       "Classic"  devices  with	 up  to	 8  KiB	 of  program  memory.	mcu  =	"attiny22", "attiny26", "at90s2313",
	       "at90s2323", "at90s2333",  "at90s2343",	"at90s4414",  "at90s4433",  "at90s4434",  "at90c8534",	"at90s8515",
	       "at90s8535".

	   "avr25"
	       "Classic"  devices  with	 up  to	 8 KiB of program memory and with the "MOVW" instruction.  mcu = "attiny13",
	       "attiny13a", "attiny24", "attiny24a", "attiny25",  "attiny261",	"attiny261a",  "attiny2313",  "attiny2313a",
	       "attiny43u",   "attiny44",  "attiny44a",	 "attiny45",  "attiny48",  "attiny441",	 "attiny461",  "attiny461a",
	       "attiny4313",  "attiny84",  "attiny84a",	 "attiny85",  "attiny87",  "attiny88",	 "attiny828",	"attiny841",
	       "attiny861", "attiny861a", "ata5272", "ata6616c", "at86rf401".

	   "avr3"
	       "Classic" devices with 16 KiB up to 64 KiB of program memory.  mcu = "at76c711", "at43usb355".

	   "avr31"
	       "Classic" devices with 128 KiB of program memory.  mcu = "atmega103", "at43usb320".

	   "avr35"
	       "Classic"  devices  with	 16  KiB  up  to  64  KiB  of program memory and with the "MOVW" instruction.  mcu =
	       "attiny167", "attiny1634",  "atmega8u2",	 "atmega16u2",	"atmega32u2",  "ata5505",  "ata6617c",	"ata664251",
	       "at90usb82", "at90usb162".

	   "avr4"
	       "Enhanced"  devices  with  up  to  8  KiB  of  program  memory.	 mcu = "atmega48", "atmega48a", "atmega48p",
	       "atmega48pa",  "atmega48pb",  "atmega8",	 "atmega8a",  "atmega8hva",  "atmega88",  "atmega88a",	"atmega88p",
	       "atmega88pa",   "atmega88pb",   "atmega8515",   "atmega8535",  "ata5795",  "ata6285",  "ata6286",  "ata6289",
	       "ata6612c", "at90pwm1", "at90pwm2", "at90pwm2b", "at90pwm3", "at90pwm3b", "at90pwm81".

	   "avr5"
	       "Enhanced" devices with 16 KiB up to 64 KiB of program memory.  mcu = "atmega16", "atmega16a", "atmega16hva",
	       "atmega16hva2",	"atmega16hvb",	"atmega16hvbrevb",  "atmega16m1",  "atmega16u4",  "atmega161",	"atmega162",
	       "atmega163",    "atmega164a",   "atmega164p",   "atmega164pa",	"atmega165",   "atmega165a",   "atmega165p",
	       "atmega165pa",  "atmega168",   "atmega168a",   "atmega168p",   "atmega168pa",   "atmega168pb",	"atmega169",
	       "atmega169a",	"atmega169p",	"atmega169pa",	 "atmega32",   "atmega32a",   "atmega32c1",   "atmega32hvb",
	       "atmega32hvbrevb",  "atmega32m1",  "atmega32u4",	 "atmega32u6",	"atmega323",   "atmega324a",   "atmega324p",
	       "atmega324pa",	"atmega324pb",	 "atmega325",	"atmega325a",	"atmega325p",	"atmega325pa",	"atmega328",
	       "atmega328p",  "atmega328pb",   "atmega329",   "atmega329a",   "atmega329p",   "atmega329pa",   "atmega3250",
	       "atmega3250a",  "atmega3250p",  "atmega3250pa",	"atmega3290",  "atmega3290a", "atmega3290p", "atmega3290pa",
	       "atmega406",   "atmega64",   "atmega64a",   "atmega64c1",   "atmega64hve",   "atmega64hve2",    "atmega64m1",
	       "atmega64rfr2",	 "atmega640",	"atmega644",  "atmega644a",  "atmega644p",  "atmega644pa",  "atmega644rfr2",
	       "atmega645",   "atmega645a",   "atmega645p",   "atmega649",   "atmega649a",    "atmega649p",    "atmega6450",
	       "atmega6450a",  "atmega6450p",  "atmega6490", "atmega6490a", "atmega6490p", "ata5790", "ata5790n", "ata5791",
	       "ata6613c", "ata6614q", "ata5782", "ata5831",  "ata8210",  "ata8510",  "ata5787",  "ata5835",  "ata5700m322",
	       "ata5702m322",	 "at90pwm161",	 "at90pwm216",	 "at90pwm316",	 "at90can32",	"at90can64",   "at90scr100",
	       "at90usb646", "at90usb647", "at94k", "m3000".

	   "avr51"
	       "Enhanced" devices with 128 KiB	of  program  memory.   mcu  =  "atmega128",  "atmega128a",  "atmega128rfa1",
	       "atmega128rfr2",	 "atmega1280",	"atmega1281",  "atmega1284",  "atmega1284p", "atmega1284rfr2", "at90can128",
	       "at90usb1286", "at90usb1287".

	   "avr6"
	       "Enhanced" devices with 3-byte PC, i.e. with more than 128 KiB of program  memory.   mcu	 =  "atmega256rfr2",
	       "atmega2560", "atmega2561", "atmega2564rfr2".

	   "avrxmega2"
	       "XMEGA"	devices with more than 8 KiB and up to 64 KiB of program memory.  mcu = "atxmega8e5", "atxmega16a4",
	       "atxmega16a4u", "atxmega16c4", "atxmega16d4", "atxmega16e5",  "atxmega32a4",  "atxmega32a4u",  "atxmega32c3",
	       "atxmega32c4",	"atxmega32d3",	 "atxmega32d4",	  "atxmega32e5",   "avr64da28",	 "avr64da28s",	"avr64da32",
	       "avr64da32s", "avr64da48", "avr64da48s", "avr64da64", "avr64da64s",  "avr64db28",  "avr64db32",	"avr64db48",
	       "avr64db64",  "avr64dd14",  "avr64dd20",	 "avr64dd28",  "avr64dd32",  "avr64du28",  "avr64du32", "avr64ea28",
	       "avr64ea32", "avr64ea48", "avr64sd28", "avr64sd32", "avr64sd48".

	   "avrxmega3"
	       "XMEGA" devices with up to 64 KiB of combined program memory and RAM, and with program memory visible in	 the
	       RAM  address  space.   mcu  =  "attiny202",  "attiny204", "attiny212", "attiny214", "attiny402", "attiny404",
	       "attiny406", "attiny412", "attiny414", "attiny416", "attiny416auto", "attiny417",  "attiny424",	"attiny426",
	       "attiny427",  "attiny804",  "attiny806",	 "attiny807",  "attiny814",  "attiny816",  "attiny817", "attiny824",
	       "attiny826", "attiny827", "attiny1604", "attiny1606", "attiny1607", "attiny1614", "attiny1616", "attiny1617",
	       "attiny1624",   "attiny1626",   "attiny1627",   "attiny3214",   "attiny3216",   "attiny3217",   "attiny3224",
	       "attiny3226", "attiny3227", "atmega808", "atmega809", "atmega1608", "atmega1609", "atmega3208", "atmega3209",
	       "atmega4808",  "atmega4809",  "avr16dd14",  "avr16dd20",	 "avr16dd28", "avr16dd32", "avr16du14", "avr16du20",
	       "avr16du28", "avr16du32",  "avr16ea28",	"avr16ea32",  "avr16ea48",  "avr16eb14",  "avr16eb20",	"avr16eb28",
	       "avr16eb32",  "avr16la14",  "avr16la20",	 "avr16la28",  "avr16la32",  "avr32da28", "avr32da28s", "avr32da32",
	       "avr32da32s", "avr32da48", "avr32da48s", "avr32db28",  "avr32db32",  "avr32db48",  "avr32dd14",	"avr32dd20",
	       "avr32dd28",  "avr32dd32",  "avr32du14",	 "avr32du20",  "avr32du28",  "avr32du32",  "avr32ea28", "avr32ea32",
	       "avr32ea48", "avr32eb14",  "avr32eb20",	"avr32eb28",  "avr32eb32",  "avr32la14",  "avr32la20",	"avr32la28",
	       "avr32la32", "avr32sd20", "avr32sd28", "avr32sd32".

	   "avrxmega4"
	       "XMEGA"	devices	 with  more  than  64  KiB  and	 up  to	 128  KiB  of  program memory.	mcu = "atxmega64a3",
	       "atxmega64a3u", "atxmega64a4u", "atxmega64b1", "atxmega64b3",  "atxmega64c3",  "atxmega64d3",  "atxmega64d4",
	       "avr128da28",   "avr128da28s",	"avr128da32",	"avr128da32s",	"avr128da48",  "avr128da48s",  "avr128da64",
	       "avr128da64s", "avr128db28", "avr128db32", "avr128db48", "avr128db64".

	   "avrxmega5"
	       "XMEGA" devices with more than 64 KiB and up to 128 KiB of program memory and more than 64 KiB of RAM.  mcu =
	       "atxmega64a1", "atxmega64a1u".

	   "avrxmega6"
	       "XMEGA" devices	with  more  than  128  KiB  of	program	 memory.   mcu	=  "atxmega128a3",  "atxmega128a3u",
	       "atxmega128b1",	  "atxmega128b3",    "atxmega128c3",	"atxmega128d3",	   "atxmega128d4",   "atxmega192a3",
	       "atxmega192a3u",	  "atxmega192c3",   "atxmega192d3",   "atxmega256a3",	"atxmega256a3b",   "atxmega256a3bu",
	       "atxmega256a3u", "atxmega256c3", "atxmega256d3", "atxmega384c3", "atxmega384d3".

	   "avrxmega7"
	       "XMEGA"	devices with more than 128 KiB of program memory and more than 64 KiB of RAM.  mcu = "atxmega128a1",
	       "atxmega128a1u", "atxmega128a4u".

	   "avrtiny"
	       "Reduced Tiny" Tiny core devices with only 16 general purpose registers and 512 B up  to	 4  KiB	 of  program
	       memory.	mcu = "attiny4", "attiny5", "attiny9", "attiny10", "attiny102", "attiny104", "attiny20", "attiny40".

	   "avr1"
	       This  ISA  is  implemented  by  the  minimal  AVR  core	and supported for assembler only.  mcu = "attiny11",
	       "attiny12", "attiny15", "attiny28", "at90s1200".

       -mabsdata
	   Assume that all data in static storage can be accessed by LDS / STS instructions.  This option has only an effect
	   on reduced Tiny devices like ATtiny40.  See also the "absdata" AVR Variable Attributes,variable attribute.

       -mcvt
	   Use a compact vector table.	Some devices support a CVT with only four  entries:  0=Reset,  1=NMI,  2=Prio1	IRQ,
	   3=Prio0  IRQs.   This  option  will link startup code from "crtmcu-cvt.o" instead of the usual "crtmcu.o".  Apart
	   from providing a compact vector table, the startup code will set bit "CPUINT_CTRLA.CPUINT_CVT" which enables	 the
	   CVT on the device.

	   When	 you do not want the startup code to set "CPUINT_CTRLA.CPUINT_CVT", then you can satisfy symbol "__init_cvt"
	   so that  the	 respective  code  is  no  more	 pulled	 in  from  "libmcu.a".	 For  example,	you  can  link	with
	   "-Wl,--defsym,__init_cvt=0".

	   The CVT startup code is available since AVR-LibC v2.3 ("https://github.com/avrdudes/avr-libc/issues/1010").

       -mdouble=bits
       -mlong-double=bits
	   Set	the size (in bits) of the "double" or "long double" type, respectively.	 Possible values for bits are 32 and
	   64.	 Whether  or  not  a  specific	value  for  bits  is   allowed	 depends   on	the   "--with-double="	 and
	   "--with-long-double="  configure options ("https://gcc.gnu.org/install/configure.html#avr"), and the same applies
	   for the default values of the options.

       -mgas-isr-prologues
	   Interrupt service routines (ISRs) may use the "__gcc_isr" pseudo instruction supported by GNU Binutils.  If	this
	   option  is  on,  the	 feature  can  still  be  disabled  for	 individual  ISRs  by  means  of  the  AVR  Function
	   Attributes,,"no_gccisr" function attribute.	This feature is activated per default if optimization is on (but not
	   with -Og, @pxref{Optimize Options}), and if GNU Binutils support PR21683 ("https://sourceware.org/PR21683").

       -mint8
	   Assume "int" to be 8-bit integer.  This affects the sizes of all types: a "char" is 1 byte, an "int" is 1 byte, a
	   "long" is 2 bytes, and "long long" is 4 bytes.  Please note that this option does not conform to the C standards,
	   but it results in smaller code size.

       -mmain-is-OS_task
	   Do  not  save  registers  in	 "main".   The	effect	is  the	 same  like   attaching	  attribute   AVR   Function
	   Attributes,,"OS_task" to "main". It is activated per default if optimization is on.

       -mno-call-main
	   Don't run "main" by means of

		   XCALL  main
		   XJMP	  exit

	   Instead,		   put		      "main"		    in		      section		    ".init9"
	   ("https://avrdudes.github.io/avr-libc/avr-libc-user-manual/mem_sections.html#sec_dot_init") so that	no  call  is
	   required.  By setting this option the user asserts that "main" will not return.

	   This	 option	 can  be used for devices with very limited resources in order to save a few bytes of code and stack
	   space.  It will work as expected since AVR-LibC v2.3 ("https://github.com/avrdudes/avr-libc/issues/1012").	With
	   older versions, there will be no performance gain.

       -mno-interrupts
	   Generated code is not compatible with hardware interrupts.  Code size is smaller.

       -mrelax
	   Try	to  replace  "CALL"  resp.  "JMP" instruction by the shorter "RCALL" resp. "RJMP" instruction if applicable.
	   Setting -mrelax just adds the --mlink-relax option to the assembler's command line and the --relax option to	 the
	   linker's command line.

	   Jump	 relaxing  is  performed by the linker because jump offsets are not known before code is located. Therefore,
	   the assembler code generated by the compiler is the same, but the instructions in the executable may differ	from
	   instructions in the assembler code.

	   Relaxing must be turned on if linker stubs are needed, see the section on "EIND" and linker stubs below.

       -mrodata-in-ram
       -mno-rodata-in-ram
	   Locate  the ".rodata" sections for read-only data in RAM resp.  in program memory.  For most devices, there is no
	   choice and this option acts rather like an assertion.

	   Since v14 and for the AVR64* and AVR128* devices, ".rodata" is located in flash memory per default, provided	 the
	   required  GNU  Binutils  support  (PR31124  ("https://sourceware.org/PR31124"))  is	available.   In	 that  case,
	   -mrodata-in-ram can be used to return to the old layout with ".rodata" in RAM.

       -mtiny-stack
	   Only change the lower 8 bits of the stack pointer.

       -mfract-convert-truncate
	   Allow to use truncation instead of rounding towards zero for fractional fixed-point types.

       -nodevicelib
	   Don't link against AVR-LibC's device specific library "libmcu.a".

	   Notice that since AVR-LibC v2.3, that library contains code that is essential for the correct  functioning  of  a
	   program.	In    particular,    it	   contains    parts	of    the    startup	code	like:	 "__init_sp"
	   ("https://github.com/avrdudes/avr-libc/issues/1011") to initialize  the  stack  pointer  with  symbol  "__stack",
	   "__init_cvt"	 ("https://github.com/avrdudes/avr-libc/issues/1010") to set up the hardware to use a compact vector
	   table with -mcvt, "__call_main" ("https://github.com/avrdudes/avr-libc/issues/1012") to call "main"	and  "exit",
	   and	"__do_flmap_init"  ("https://github.com/avrdudes/avr-libc/issues/931")	to  set up FLMAP according to symbol
	   "__flmap".

       -nodevicespecs
	   Don't add -specs=device-specs/specs-mcu to the compiler driver's command line.  The user takes responsibility for
	   supplying the sub-processes like compiler proper, assembler and linker with	appropriate  command  line  options.
	   This	 means	that  the  user	 has  to supply her private device specs file by means of -specs=path-to-specs-file.
	   There is no more need for option -mmcu=mcu.

	   This option can also serve as a replacement for the older way of specifying custom device-specs files that needed
	   -B some-path to point to a directory which contains a folder named "device-specs" which  contains  a	 specs	file
	   named "specs-mcu", where mcu was specified by -mmcu=mcu.

       -Waddr-space-convert
	   Warn	 about	conversions between address spaces in the case where the resulting address space is not contained in
	   the incoming address space.

       -Wmisspelled-isr
	   Warn if the ISR is misspelled, i.e. without __vector prefix.	 Enabled by default.

       AVR Optimization Options

       The following options are pure optimization options.  Options -mgas-isr-prologues, -mmain-is-OS_task,  -mno-call-main
       and  -mrelax  from  above  are only almost optimization options, since there are rare occasions where their different
       code generation matters.

       -maccumulate-args
	   Accumulate outgoing function arguments and acquire/release the needed stack space for outgoing function arguments
	   once in function prologue/epilogue.	Without this option, outgoing arguments are pushed before calling a function
	   and popped afterwards.  See also the -fdefer-pop Optimize Options,,optimization option.

	   Popping the arguments after the function call can be expensive on AVR so that accumulating the stack space  might
	   lead to smaller executables because arguments need not be removed from the stack after such a function call.

	   This	 option	 can  lead to reduced code size for functions that perform several calls to functions that get their
	   arguments on the stack like calls to printf-like functions.

       -mbranch-cost=cost
	   Set the branch costs for conditional branch instructions to cost.  Reasonable values for  cost  are	small,	non-
	   negative integers. The default branch cost is 0.

       -mcall-prologues
	   Functions prologues/epilogues are expanded as calls to appropriate subroutines.  Code size is smaller.

       -mfuse-add
       -mno-fuse-add
       -mfuse-add=level
	   Optimize  indirect memory accesses on reduced Tiny devices.	The default uses "level=1" for optimizations -Og and
	   -O1, and "level=2" for higher optimizations.	 Valid values for level are 0, 1 and 2.

       -mfuse-move
       -mno-fuse-move
       -mfuse-move=level
	   Run a post reload optimization pass that tries to fuse move instructions and	 to  split  multi-byte	instructions
	   into 8-bit operations.  The default uses "level=3" for optimization -O1, and "level=23" for higher optimizations.
	   Valid  values for level are in the range 0 ... 23 which is a 3:2:2:2 mixed radix value.  Each digit controls some
	   aspect of the optimization.

       -mfuse-move2
	   Run a post combine optimization pass that tries to fuse move instructions.

       -mstrict-X
	   Use address register "X" in a way proposed by the hardware.	This means that "X" is only used in indirect,  post-
	   increment or pre-decrement addressing.

	   Without  this  option,  the	"X"  register  may  be	used in the same way as "Y" or "Z" which then is emulated by
	   additional instructions.  For example, loading a value with "X+const" addressing with a small non-negative "const
	   < 64" to a register Rn is performed as

		   adiw r26, const   ; X += const
		   ld	, X	       ;  = *X
		   sbiw r26, const   ; X -= const

       -msplit-bit-shift
	   Split multi-byte shifts with a constant offset into a shift with a byte offset and a residual shift with  a	non-
	   byte	 offset.   This	 optimization  is turned on per default for -O2 and higher, including -Os but excluding -Oz.
	   Splitting of shifts with a constant offset that is a multiple of 8 is controlled by -mfuse-move.

       -msplit-ldst
	   Split multi-byte loads and stores into several byte loads and stores.  This optimization is turned on per default
	   for -O2 and higher.

       -muse-nonzero-bits
	   Enable optimizations that are only possible when some bits in a register are always zero.  This  optimization  is
	   turned on per default for -O2 and higher.

       "EIND" and Devices with More Than 128 Ki Bytes of Flash

       Pointers	 in  the implementation are 16 bits wide.  The address of a function or label is represented as word address
       so that indirect jumps and calls can target any code address in the range of 64 Ki words.

       In order to facilitate indirect jump on devices with more than 128 Ki bytes of  program	memory	space,	there  is  a
       special	function  register called "EIND" that serves as most significant part of the target address when "EICALL" or
       "EIJMP" instructions are used.

       Indirect jumps and calls on these devices are handled as follows by the compiler and are subject to some limitations:

       *   The compiler never sets "EIND".

       *   The compiler uses "EIND" implicitly in "EICALL"/"EIJMP" instructions or might read "EIND" directly  in  order  to
	   emulate an indirect call/jump by means of a "RET" instruction.

       *   The	compiler assumes that "EIND" never changes during the startup code or during the application. In particular,
	   "EIND" is not saved/restored in function or interrupt service routine prologue/epilogue.

       *   For indirect calls to functions and computed goto, the linker generates stubs. Stubs are jump pads sometimes also
	   called trampolines. Thus, the indirect call/jump jumps to such a stub.  The stub contains a direct  jump  to	 the
	   desired address.

       *   Linker  relaxation  must be turned on so that the linker generates the stubs correctly in all situations. See the
	   compiler option -mrelax and the linker option --relax.  There are corner cases where the linker  is	supposed  to
	   generate stubs but aborts without relaxation and without a helpful error message.

       *   The	default	 linker	 script	 is arranged for code with "EIND = 0".	If code is supposed to work for a setup with
	   "EIND != 0", a custom linker script has to be used  in  order  to  place  the  sections  whose  name	 start	with
	   ".trampolines" into the segment where "EIND" points to.

       *   The startup code from libgcc never sets "EIND".  Notice that startup code is a blend of code from libgcc and AVR-
	   LibC.      For     the     impact	 of	AVR-LibC     on	    "EIND",	see	the	AVR-LibC user manual
	   ("https://avrdudes.github.io/avr-libc/avr-libc-user-manual/").

       *   It is legitimate for user-specific startup code to set up "EIND" early, for example by  means  of  initialization
	   code	 located  in  section  ".init3". Such code runs prior to general startup code that initializes RAM and calls
	   constructors, but after the bit of startup code from AVR-LibC that sets "EIND" to the segment  where	 the  vector
	   table is located.

		   #include 

		   static void
		   __attribute__((section(".init3"),naked,used,no_instrument_function))
		   init3_set_eind (void)
		   {
		     __asm volatile ("ldi r24,pm_hh8(__trampolines_start)\n\t"
				     "out %i0,r24" :: "n" (&EIND) : "r24","memory");
		   }

	   The "__trampolines_start" symbol is defined in the linker script.

       *   Stubs are generated automatically by the linker if the following two conditions are met:

	   -
	       (short for generate stubs) like so:

		       LDI r24, lo8(gs())
		       LDI r25, hi8(gs())

	   -
	       outside the segment where the stubs are located.

       *   The compiler emits such "gs" modifiers for code labels in the following situations:

	   -
	   -
	   -
	       command-line option.

	   -
	       tables you can specify the -fno-jump-tables command-line option.

	   -
	   -
       *   Jumping to non-symbolic addresses like so is not supported:

		   int main (void)
		   {
		       /* Call function at word address 0x2 */
		       return ((int(*)(void)) 0x2)();
		   }

	   Instead, a stub has to be set up, i.e. the function has to be called through a symbol ("func_4" in the example):

		   int main (void)
		   {
		       extern int func_4 (void);

		       /* Call function at byte address 0x4 */
		       return func_4();
		   }

	   and the application be linked with -Wl,--defsym,func_4=0x4.	Alternatively, "func_4" can be defined in the linker
	   script.

       Handling of the "RAMPD", "RAMPX", "RAMPY" and "RAMPZ" Special Function Registers

       Some  AVR devices support memories larger than the 64 KiB range that can be accessed with 16-bit pointers.  To access
       memory locations outside this 64 KiB range, the content of a "RAMP" register is used as high part of the address: The
       "X", "Y", "Z" address register is  concatenated	with  the  "RAMPX",  "RAMPY",  "RAMPZ"	special	 function  register,
       respectively, to get a wide address. Similarly, "RAMPD" is used together with direct addressing.

       *   The startup code initializes the "RAMP" special function registers with zero.

       *   If a AVR Named Address Spaces,named address space other than generic or "__flash" is used, then "RAMPZ" is set as
	   needed before the operation.

       *   If  the  device  supports  RAM  larger  than	 64  KiB  and  the compiler needs to change "RAMPZ" to accomplish an
	   operation, "RAMPZ" is reset to zero after the operation.

       *   If the device comes with a specific "RAMP" register,	 the  ISR  prologue/epilogue  saves/restores  that  SFR	 and
	   initializes it with zero in case the ISR code might (implicitly) use it.

       *   RAM	larger	than  64  KiB  is  not	supported  by GCC for AVR targets.  If you use inline assembler to read from
	   locations outside the 16-bit address range and change one of the "RAMP" registers, you  must	 reset	it  to	zero
	   after the access.

       AVR Built-in Macros

       GCC  defines  several built-in macros so that the user code can test for the presence or absence of features.  Almost
       any of the following built-in macros are deduced from device capabilities and thus triggered by the  -mmcu=  command-
       line option.

       For even more AVR-specific built-in macros see AVR Named Address Spaces and AVR Built-in Functions.

       "__AVR_ARCH__"
	   Build-in  macro  that  resolves to a decimal number that identifies the architecture and depends on the -mmcu=mcu
	   option.  Possible values are:

	   2, 25, 3, 31, 35, 4, 5, 51, 6

	   for mcu="avr2", "avr25", "avr3", "avr31", "avr35", "avr4", "avr5", "avr51", "avr6",

	   respectively and

	   100, 102, 103, 104, 105, 106, 107

	   for mcu="avrtiny", "avrxmega2", "avrxmega3", "avrxmega4", "avrxmega5",  "avrxmega6",	 "avrxmega7",  respectively.
	   If  mcu  specifies a device, this built-in macro is set accordingly. For example, with -mmcu=atmega8 the macro is
	   defined to 4.

       "__AVR_Device__"
	   Setting -mmcu=device defines this built-in macro which reflects the device's	 name.	For  example,  -mmcu=atmega8
	   defines the built-in macro "__AVR_ATmega8__", -mmcu=attiny261a defines "__AVR_ATtiny261A__", etc.

	   The	built-in  macros'  names  follow the scheme "__AVR_Device__" where Device is the device name as from the AVR
	   user manual. The difference between Device in the built-in macro and device in -mmcu=device is that the latter is
	   always lowercase.

	   If device is not a device but only a core architecture like avr51, this macro is not defined.

       "__AVR_DEVICE_NAME__"
	   Setting -mmcu=device defines this built-in macro to the device's name. For example, with -mmcu=atmega8 the  macro
	   is defined to "atmega8".

	   If device is not a device but only a core architecture like avr51, this macro is not defined.

       "__AVR_CVT__"
	   The code is being compiled with option "-mcvt" to use a compact vector table.

       "__AVR_XMEGA__"
	   The device / architecture belongs to the XMEGA family of devices.

       "__AVR_HAVE_ADIW__"
	   The device has the "ADIW" and "SBIW" instructions.

       "__AVR_HAVE_ELPM__"
	   The device has the "ELPM" instruction.

       "__AVR_HAVE_ELPMX__"
	   The device has the "ELPM Rn,Z" and "ELPM Rn,Z+" instructions.

       "__AVR_HAVE_LPMX__"
	   The device has the "LPM Rn,Z" and "LPM Rn,Z+" instructions.

       "__AVR_HAVE_MOVW__"
	   The device has the "MOVW" instruction to perform 16-bit register-register moves.

       "__AVR_HAVE_MUL__"
	   The device has a hardware multiplier.

       "__AVR_HAVE_JMP_CALL__"
	   The	device	has the "JMP" and "CALL" instructions.	This is the case for devices with more than 8 KiB of program
	   memory.

       "__AVR_HAVE_EIJMP_EICALL__"
       "__AVR_3_BYTE_PC__"
	   The device has the "EIJMP" and "EICALL" instructions.  This is the case for devices with more  than	128  KiB  of
	   program memory.  This also means that the program counter (PC) is 3 bytes wide.

       "__AVR_2_BYTE_PC__"
	   The program counter (PC) is 2 bytes wide. This is the case for devices with up to 128 KiB of program memory.

       "__AVR_HAVE_8BIT_SP__"
       "__AVR_HAVE_16BIT_SP__"
	   The stack pointer (SP) register is treated as 8-bit respectively 16-bit register by the compiler.  The definition
	   of these macros is affected by -mtiny-stack.

       "__AVR_HAVE_SPH__"
       "__AVR_SP8__"
	   The	device	has  the  SPH  (high part of stack pointer) special function register or has an 8-bit stack pointer,
	   respectively.  The definition of these macros  is  affected	by  -mmcu=  and	 in  the  cases	 of  -mmcu=avr2	 and
	   -mmcu=avr25 also by -msp8.

       "__AVR_HAVE_RAMPD__"
       "__AVR_HAVE_RAMPX__"
       "__AVR_HAVE_RAMPY__"
       "__AVR_HAVE_RAMPZ__"
	   The device has the "RAMPD", "RAMPX", "RAMPY", "RAMPZ" special function register, respectively.

       "__NO_INTERRUPTS__"
	   This macro reflects the -mno-interrupts command-line option.

       "__AVR_ERRATA_SKIP__"
       "__AVR_ERRATA_SKIP_JMP_CALL__"
	   Some	 AVR  devices  (AT90S8515, ATmega103) must not skip 32-bit instructions because of a hardware erratum.	Skip
	   instructions	 are  "SBRS",  "SBRC",	"SBIS",	 "SBIC"	 and  "CPSE".	The  second  macro  is	 only	defined	  if
	   "__AVR_HAVE_JMP_CALL__" is also set.

       "__AVR_ISA_RMW__"
	   The device has Read-Modify-Write instructions (XCH, LAC, LAS and LAT).

       "__AVR_SFR_OFFSET__=offset"
	   Instructions	 that  can  address  I/O special function registers directly like "IN", "OUT", "SBI", etc. may use a
	   different address as if addressed by an instruction to access RAM like "LD" or "STS". This offset depends on	 the
	   device architecture and has to be subtracted from the RAM address in order to get the respective I/O address.

       "__AVR_SHORT_CALLS__"
	   The -mshort-calls command line option is set.

       "__AVR_PM_BASE_ADDRESS__=addr"
	   Some	 devices  support reading from flash memory by means of "LD*" instructions.  The flash memory is seen in the
	   data address space at an offset of "__AVR_PM_BASE_ADDRESS__".  If this macro is not defined, this feature is	 not
	   available.	If  defined,  the  address  space is linear and there is no need to put ".rodata" into RAM.  This is
	   handled by the default linker description file, and is currently available for "avrtiny" and	 "avrxmega3".	Even
	   more	 convenient,  there is no need to use address spaces like "__flash" or features like attribute "progmem" and
	   "pgm_read_*".

       "__AVR_HAVE_FLMAP__"
	   This macro is defined provided the following conditions are met:

	   *
	       This applies to the AVR64* and AVR128* devices.

	   *

	   This	  implies    the    compiler	was    configured    with    GNU    Binutils	that	implement    PR31124
	   ("https://sourceware.org/PR31124").

       "__AVR_RODATA_IN_RAM__"
	   This macro is undefined when the code is compiled for a core architecture.

	   When	 the code is compiled for a device, the macro is defined to 1 when the ".rodata" sections for read-only data
	   is located in RAM; and defined to 0, otherwise.

       "__WITH_AVRLIBC__"
	   The compiler is configured to be used together with AVR-LibC.  See the --with-avrlibc configure option.

       "__HAVE_SIGNAL_N__"
	   The compiler supports the signal(num) and interrupt(num) AVR Function  Attributes,,function	attributes  with  an
	   argument num that specifies the number of the interrupt service routine.

       "__HAVE_DOUBLE_MULTILIB__"
	   Defined if -mdouble= acts as a multilib option.

       "__HAVE_DOUBLE32__"
       "__HAVE_DOUBLE64__"
	   Defined  if	the  compiler  supports 32-bit double resp. 64-bit double.  The actual layout is specified by option
	   -mdouble=.

       "__DEFAULT_DOUBLE__"
	   The size in bits of "double" if -mdouble= is not set.  To test the layout of	 "double"  in  a  program,  use	 the
	   built-in macro "__SIZEOF_DOUBLE__".

       "__HAVE_LONG_DOUBLE32__"
       "__HAVE_LONG_DOUBLE64__"
       "__HAVE_LONG_DOUBLE_MULTILIB__"
       "__DEFAULT_LONG_DOUBLE__"
	   Same as above, but for "long double" instead of "double".

       "__WITH_DOUBLE_COMPARISON__"
	   Reflects		the		"--with-double-comparison={tristate|bool|libf7}"	    configure option
	   ("https://gcc.gnu.org/install/configure.html#avr") and is defined to 2 or 3.

       "__WITH_LIBF7_LIBGCC__"
       "__WITH_LIBF7_MATH__"
       "__WITH_LIBF7_MATH_SYMBOLS__"
	   Reflects		  the		    "--with-libf7={libgcc|math|math-symbols}"		    configure option
	   ("https://gcc.gnu.org/install/configure.html#avr").

       AVR Internal Options

       The  following  options	are  used  internally  by the compiler and to communicate between device specs files and the
       compiler proper. You don't need to set these options by hand, in particular they are not optimization options.  Using
       these options in the wrong way may lead to sub-optimal or wrong code.  They are documented for completeness,  and  in
       order to get a better understanding of device specs ("https://gcc.gnu.org/wiki/avr-gcc#spec-files") files.

       -mn-flash=num
	   Assume that the flash memory has a size of num times 64 KiB.	 This determines which "__flashN" address spaces are
	   available.

       -mflmap
	   The device has the "FLMAP" bit field located in special function register "NVMCTRL_CTRLB".

       -mrmw
	   Assume that the device supports the Read-Modify-Write instructions "XCH", "LAC", "LAS" and "LAT".

       -mshort-calls
	   Assume  that	 "RJMP" and "RCALL" can target the whole program memory. This option is used for multilib generation
	   and selection for the devices from architecture "avrxmega3".

       -mskip-bug
	   Generate code without skips ("CPSE", "SBRS", "SBRC", "SBIS", "SBIC") over 32-bit instructions.

       -msp8
	   Treat the stack pointer register as an 8-bit register, i.e. assume the high byte of the stack  pointer  is  zero.
	   This	 option	 is  used by the compiler to select and build multilibs for architectures "avr2" and "avr25".  These
	   architectures mix devices with and without "SPH".

       Blackfin Options

       -mcpu=cpu[-sirevision]
	   Specifies the name of the target Blackfin processor.	 Currently, cpu can be one of bf512,  bf514,  bf516,  bf518,
	   bf522,  bf523,  bf524, bf525, bf526, bf527, bf531, bf532, bf533, bf534, bf536, bf537, bf538, bf539, bf542, bf544,
	   bf547, bf548, bf549, bf542m, bf544m, bf547m, bf548m, bf549m, bf561, bf592.

	   The optional sirevision specifies the silicon  revision  of	the  target  Blackfin  processor.   Any	 workarounds
	   available  for the targeted silicon revision are enabled.  If sirevision is none, no workarounds are enabled.  If
	   sirevision is any, all workarounds for the targeted processor are enabled.  The "__SILICON_REVISION__"  macro  is
	   defined  to	two  hexadecimal  digits  representing	the  major  and	 minor	numbers in the silicon revision.  If
	   sirevision is none, the "__SILICON_REVISION__" is not defined.  If sirevision is any, the  "__SILICON_REVISION__"
	   is  defined to be 0xffff.  If this optional sirevision is not used, GCC assumes the latest known silicon revision
	   of the targeted Blackfin processor.

	   GCC defines a preprocessor macro for the specified cpu.  For the  bfin-elf  toolchain,  this	 option	 causes	 the
	   hardware BSP provided by libgloss to be linked in if -msim is not given.

	   Without this option, bf532 is used as the processor by default.

	   Note that support for bf561 is incomplete.  For bf561, only the preprocessor macro is defined.

       -msim
	   Specifies  that  the program will be run on the simulator.  This causes the simulator BSP provided by libgloss to
	   be  linked  in.   This  option  has	effect	only  for  bfin-elf  toolchain.	  Certain  other  options,  such  as
	   -mid-shared-library and -mfdpic, imply -msim.

       -momit-leaf-frame-pointer
	   Don't  keep the frame pointer in a register for leaf functions.  This avoids the instructions to save, set up and
	   restore frame pointers and makes an extra register available in leaf functions.

       -mspecld-anomaly
	   When enabled, the compiler ensures that the	generated  code	 does  not  contain  speculative  loads	 after	jump
	   instructions. If this option is used, "__WORKAROUND_SPECULATIVE_LOADS" is defined.

       -mno-specld-anomaly
	   Don't generate extra code to prevent speculative loads from occurring.

       -mcsync-anomaly
	   When	 enabled, the compiler ensures that the generated code does not contain CSYNC or SSYNC instructions too soon
	   after conditional branches.	If this option is used, "__WORKAROUND_SPECULATIVE_SYNCS" is defined.

       -mno-csync-anomaly
	   Don't generate extra code to prevent CSYNC or SSYNC instructions from occurring  too	 soon  after  a	 conditional
	   branch.

       -mlow64k
	   When	 enabled,  the compiler is free to take advantage of the knowledge that the entire program fits into the low
	   64k of memory.

       -mno-low64k
	   Assume that the program is arbitrarily large.  This is the default.

       -mstack-check-l1
	   Do stack checking using information placed into L1 scratchpad memory by the uClinux kernel.

       -mid-shared-library
	   Generate code that supports shared libraries via the library ID method.  This allows for  execute  in  place	 and
	   shared  libraries  in an environment without virtual memory management.  This option implies -fPIC.	With a bfin-
	   elf target, this option implies -msim.

       -mno-id-shared-library
	   Generate code that doesn't assume ID-based shared libraries are being used.	This is the default.

       -mleaf-id-shared-library
	   Generate code that supports shared libraries via the	 library  ID  method,  but  assumes  that  this	 library  or
	   executable  won't  link  against  any other ID shared libraries.  That allows the compiler to use faster code for
	   jumps and calls.

       -mno-leaf-id-shared-library
	   Do not assume that the code being compiled won't link against any ID shared libraries.  Slower code is  generated
	   for jump and call insns.

       -mshared-library-id=n
	   Specifies  the  identification  number  of  the  ID-based shared library being compiled.  Specifying a value of 0
	   generates more compact code; specifying other values forces the allocation of that number to the current  library
	   but is no more space- or time-efficient than omitting this option.

       -msep-data
	   Generate  code  that	 allows	 the data segment to be located in a different area of memory from the text segment.
	   This allows for execute in place in an environment without virtual memory management by  eliminating	 relocations
	   against the text section.

       -mno-sep-data
	   Generate code that assumes that the data segment follows the text segment.  This is the default.

       -mlong-calls
       -mno-long-calls
	   Tells  the  compiler	 to  perform function calls by first loading the address of the function into a register and
	   then performing a subroutine call on this register.	This switch is needed if the target function lies outside of
	   the 24-bit addressing range of the offset-based version of subroutine call instruction.

	   This feature is not enabled by default.  Specifying -mno-long-calls restores the default  behavior.	 Note  these
	   switches have no effect on how the compiler generates code to handle function calls via function pointers.

       -mfast-fp
	   Link	 with the fast floating-point library. This library relaxes some of the IEEE floating-point standard's rules
	   for checking inputs against Not-a-Number (NAN), in the interest of performance.

       -minline-plt
	   Enable inlining of PLT entries in function calls to functions that are not known to	bind  locally.	 It  has  no
	   effect without -mfdpic.

       -mmulticore
	   Build a standalone application for multicore Blackfin processors.  This option causes proper start files and link
	   scripts  supporting	multicore  to  be  used, and defines the macro "__BFIN_MULTICORE".  It can only be used with
	   -mcpu=bf561[-sirevision].

	   This option can be used with -mcorea or -mcoreb, which selects the  one-application-per-core	 programming  model.
	   Without  -mcorea  or -mcoreb, the single-application/dual-core programming model is used. In this model, the main
	   function of Core B should be named as "coreb_main".

	   If this option is not used, the single-core application programming model is used.

       -mcorea
	   Build a standalone application for Core A of BF561 when using  the  one-application-per-core	 programming  model.
	   Proper  start  files	 and link scripts are used to support Core A, and the macro "__BFIN_COREA" is defined.	This
	   option can only be used in conjunction with -mmulticore.

       -mcoreb
	   Build a standalone application for Core B of BF561 when using  the  one-application-per-core	 programming  model.
	   Proper  start  files	 and  link scripts are used to support Core B, and the macro "__BFIN_COREB" is defined. When
	   this option is used, "coreb_main" should be used instead of "main".	This option can only be used in	 conjunction
	   with -mmulticore.

       -msdram
	   Build  a  standalone	 application  for SDRAM. Proper start files and link scripts are used to put the application
	   into SDRAM, and the macro "__BFIN_SDRAM" is defined.	 The loader  should  initialize	 SDRAM	before	loading	 the
	   application.

       -micplb
	   Assume  that	 ICPLBs	 are  enabled  at  run	time.  This has an effect on certain anomaly workarounds.  For Linux
	   targets, the default is to assume ICPLBs are enabled; for standalone applications the default is off.

       C6X Options

       -march=name
	   This specifies the name of the target architecture.	GCC uses this name to determine what kind of instructions it
	   can emit when generating assembly code.  Permissible names are: c62x, c64x, c64x+, c67x, c67x+, c674x.

       -mbig-endian
	   Generate code for a big-endian target.

       -mlittle-endian
	   Generate code for a little-endian target.  This is the default.

       -msim
	   Choose startup files and linker script suitable for the simulator.

       -msdata=default
	   Put small global and static data in the ".neardata" section, which is pointed to by register	 "B14".	  Put  small
	   uninitialized  global  and  static data in the ".bss" section, which is adjacent to the ".neardata" section.	 Put
	   small read-only data into the ".rodata" section.  The corresponding sections used for large pieces  of  data	 are
	   ".fardata", ".far" and ".const".

       -msdata=all
	   Put	all  data, not just small objects, into the sections reserved for small data, and use addressing relative to
	   the "B14" register to access them.

       -msdata=none
	   Make no use of the sections reserved for small data, and use absolute addresses to  access  all  data.   Put	 all
	   initialized	global	and static data in the ".fardata" section, and all uninitialized data in the ".far" section.
	   Put all constant data into the ".const" section.

       CRIS Options

       These options are defined specifically for the CRIS ports.

       -march=architecture-type
       -mcpu=architecture-type
	   Generate code for the specified architecture.   The	choices	 for  architecture-type	 are  v3,  v8  and  v10	 for
	   respectively ETRAX 4, ETRAX 100, and ETRAX 100 LX.  Default is v0.

       -mtune=architecture-type
	   Tune	 to  architecture-type	everything  applicable	about  the generated code, except for the ABI and the set of
	   available instructions.  The choices for architecture-type are the same as for -march=architecture-type.

       -mmax-stack-frame=n
	   Warn when the stack frame of a function exceeds n bytes.

       -metrax4
       -metrax100
	   The options -metrax4 and -metrax100 are synonyms for -march=v3 and -march=v8 respectively.

       -mmul-bug-workaround
       -mno-mul-bug-workaround
	   Work around a bug in the "muls" and "mulu" instructions for CPU models where it applies.  This option is disabled
	   by default.

       -mpdebug
	   Enable CRIS-specific verbose debug-related information in the assembly code.	 This option also has the effect  of
	   turning off the #NO_APP formatted-code indicator to the assembler at the beginning of the assembly file.

       -mcc-init
	   Do not use condition-code results from previous instruction; always emit compare and test instructions before use
	   of condition codes.

       -mno-side-effects
	   Do not emit instructions with side effects in addressing modes other than post-increment.

       -mstack-align
       -mno-stack-align
       -mdata-align
       -mno-data-align
       -mconst-align
       -mno-const-align
	   These  options  (no- options) arrange (eliminate arrangements) for the stack frame, individual data and constants
	   to be aligned for the maximum single data access size for the chosen CPU model.  The default is  to	arrange	 for
	   32-bit alignment.  ABI details such as structure layout are not affected by these options.

       -m32-bit
       -m16-bit
       -m8-bit
	   Similar  to	the stack- data- and const-align options above, these options arrange for stack frame, writable data
	   and constants to all be 32-bit, 16-bit or 8-bit aligned.  The default is 32-bit alignment.

       -mno-prologue-epilogue
       -mprologue-epilogue
	   With -mno-prologue-epilogue, the normal function prologue and epilogue which set up the stack frame	are  omitted
	   and	no  return  instructions  or return sequences are generated in the code.  Use this option only together with
	   visual inspection of the compiled code: no warnings or errors are generated when  call-saved	 registers  must  be
	   saved, or storage for local variables needs to be allocated.

       -melf
	   Legacy no-op option.

       -sim
	   This	 option	 arranges  to link with input-output functions from a simulator library.  Code, initialized data and
	   zero-initialized data are allocated consecutively.

       -sim2
	   Like -sim, but pass linker options to  locate  initialized  data  at	 0x40000000  and  zero-initialized  data  at
	   0x80000000.

       C-SKY Options

       GCC supports these options when compiling for C-SKY V2 processors.

       -march=arch
	   Specify  the	 C-SKY	target architecture.  Valid values for arch are: ck801, ck802, ck803, ck807, and ck810.	 The
	   default is ck810.

       -mcpu=cpu
	   Specify the C-SKY target processor.	Valid values for cpu are:  ck801,  ck801t,  ck802,  ck802t,  ck802j,  ck803,
	   ck803h,  ck803t,  ck803ht,  ck803f,	ck803fh,  ck803e,  ck803eh,  ck803et,  ck803eht, ck803ef, ck803efh, ck803ft,
	   ck803eft, ck803efht, ck803r1, ck803hr1, ck803tr1, ck803htr1, ck803fr1, ck803fhr1, ck803er1, ck803ehr1, ck803etr1,
	   ck803ehtr1, ck803efr1,  ck803efhr1,	ck803ftr1,  ck803eftr1,	 ck803efhtr1,  ck803s,	ck803st,  ck803se,  ck803sf,
	   ck803sef,  ck803seft,  ck807e, ck807ef, ck807, ck807f, ck810e, ck810et, ck810ef, ck810eft, ck810, ck810v, ck810f,
	   ck810t, ck810fv, ck810tv, ck810ft, and ck810ftv.

       -mbig-endian
       -EB
       -mlittle-endian
       -EL Select big- or little-endian code.  The default is little-endian.

       -mfloat-abi=name
	   Specifies which floating-point ABI to use.  Permissible values are: soft, softfp and hard.

	   Specifying soft causes GCC to generate output containing library calls  for	floating-point	operations.   softfp
	   allows  the	generation of code using hardware floating-point instructions, but still uses the soft-float calling
	   conventions.	 hard allows generation of floating-point instructions and uses FPU-specific calling conventions.

	   The default depends on the specific target configuration.  Note that the hard-float and soft-float ABIs  are	 not
	   link-compatible;  you  must	compile	 your  entire  program	with the same ABI, and link with a compatible set of
	   libraries.

       -mhard-float
       -msoft-float
	   Select hardware or software floating-point implementations.	The default is soft float.

       -mdouble-float
       -mno-double-float
	   When -mhard-float is in effect, enable generation of double-precision float instructions.  This  is	the  default
	   except when compiling for CK803.

       -mfdivdu
       -mno-fdivdu
	   When	 -mhard-float is in effect, enable generation of "frecipd", "fsqrtd", and "fdivd" instructions.	 This is the
	   default except when compiling for CK803.

       -mfpu=fpu
	   Select the floating-point processor.	 This option can only be used with -mhard-float.  Values for fpu are fpv2_sf
	   (equivalent to -mno-double-float -mno-fdivdu), fpv2 (-mdouble-float -mno-divdu),  and  fpv2_divd  (-mdouble-float
	   -mdivdu).

       -melrw
       -mno-elrw
	   Enable the extended "lrw" instruction.  This option defaults to on for CK801 and off otherwise.

       -mistack
       -mno-istack
	   Enable interrupt stack instructions; the default is off.

	   The -mistack option is required to handle the "interrupt" and "isr" function attributes.

       -mmp
	   Enable multiprocessor instructions; the default is off.

       -mcp
	   Enable coprocessor instructions; the default is off.

       -mcache
	   Enable coprocessor instructions; the default is off.

       -msecurity
	   Enable C-SKY security instructions; the default is off.

       -mtrust
	   Enable C-SKY trust instructions; the default is off.

       -mdsp
       -medsp
       -mvdsp
	   Enable C-SKY DSP, Enhanced DSP, or Vector DSP instructions, respectively.  All of these options default to off.

       -mdiv
       -mno-div
	   Generate divide instructions.  Default is off.

       -msmart
       -mno-smart
	   Generate code for Smart Mode, using only registers numbered 0-7 to allow use of 16-bit instructions.	 This option
	   is  ignored	for  CK801 where this is the required behavior, and it defaults to on for CK802.  For other targets,
	   the default is off.

       -mhigh-registers
       -mno-high-registers
	   Generate code using the high registers numbered 16-31.  This option is not supported on CK801, CK802,  or  CK803,
	   and is enabled by default for other processors.

       -manchor
       -mno-anchor
	   Generate code using global anchor symbol addresses.

       -mpushpop
       -mno-pushpop
	   Generate code using "push" and "pop" instructions.  This option defaults to on.

       -mmultiple-stld
       -mstm
       -mno-multiple-stld
       -mno-stm
	   Generate code using "stm" and "ldm" instructions.  This option isn't supported on CK801 but is enabled by default
	   on other processors.

       -mconstpool
       -mno-constpool
	   Create  constant  pools in the compiler instead of deferring it to the assembler.  This option is the default and
	   required for correct code generation on CK801 and CK802, and is optional on other processors.

       -mstack-size
       -mno-stack-size
	   Emit ".stack_size" directives for each function in the assembly output.  This option defaults to off.

       -mccrt
       -mno-ccrt
	   Generate code for the C-SKY compiler runtime instead of libgcc.  This option defaults to off.

       -mbranch-cost=n
	   Set the branch costs to roughly "n" instructions.  The default is 1.

       -msched-prolog
       -mno-sched-prolog
	   Permit scheduling of function prologue and epilogue sequences.  Using this option can result in code that is	 not
	   compliant  with the C-SKY V2 ABI prologue requirements and that cannot be debugged or backtraced.  It is disabled
	   by default.

       -msim
	   Links the library libsemi.a which is in compatible with simulator. Applicable to ELF compiler only.

       Cygwin and MinGW Options

       These additional options are available for Microsoft Windows targets:

       -mconsole
	   This option specifies that a console application is to be generated, by instructing the  linker  to	set  the  PE
	   header  subsystem  type required for console applications.  This option is available for Cygwin and MinGW targets
	   and is enabled by default on those targets.

       -mcrtdll=library
	   Preprocess, compile or link with  specified	C  RunTime  DLL	 library.   This  option  adjust  predefined  macros
	   "__CRTDLL__", "__MSVCRT__", "_UCRT" and "__MSVCRT_VERSION__" for specified CRT library, choose start file for CRT
	   library  and	 link  with CRT library.  Recognized CRT library names for proprocessor are: "crtdll*", "msvcrt10*",
	   "msvcrt20*", "msvcrt40*", "msvcr40*", "msvcrtd*", "msvcrt-os*", "msvcr70*", "msvcr71*",  "msvcr80*",	 "msvcr90*",
	   "msvcr100*",	 "msvcr110*",  "msvcr120*"  and	 "ucrt*".   If	this options is not specified then the default MinGW
	   import library "msvcrt" is used for linking and no other  adjustment	 for  preprocessor  is	done.  MinGW  import
	   library  "msvcrt"  is  just	a  symlink  to	(or  a copy of) another MinGW CRT import library chosen during MinGW
	   compilation. MinGW import library "msvcrt-os" is for Windows system CRT DLL	library	 "msvcrt.dll"  and  in	most
	   cases  is  the  default  MinGW import library.  Generally speaking, changing the CRT DLL requires recompiling the
	   entire MinGW CRT. This option is for experimental and testing purposes only.	 This option is available for  MinGW
	   targets.

       -mdll
	   This	 option is available for Cygwin and MinGW targets.  It specifies that a DLL---a dynamic link library---is to
	   be generated, enabling the selection of the required runtime startup object and entry point.

       -mnop-fun-dllimport
	   This option is available for Cygwin and MinGW targets.  It specifies that the  "dllimport"  attribute  should  be
	   ignored.

       -mthreads
	   This option is available for MinGW targets. It specifies that MinGW-specific thread support is to be used.

       -municode
	   This option is available for MinGW-w64 targets.  It causes the "UNICODE" preprocessor macro to be predefined, and
	   chooses Unicode-capable runtime startup code.

       -mwin32
	   This	 option	 is  available	for  Cygwin  and  MinGW	 targets.   It	specifies that the typical Microsoft Windows
	   predefined macros  are  to  be  set	in  the	 pre-processor,	 but  does  not	 influence  the	 choice	 of  runtime
	   library/startup code.

       -mwindows
	   This option is available for Cygwin and MinGW targets.  It specifies that a GUI application is to be generated by
	   instructing the linker to set the PE header subsystem type appropriately.

       -fno-set-stack-executable
	   This	 option	 is  available for MinGW targets. It specifies that the executable flag for the stack used by nested
	   functions isn't set. This is necessary for binaries running in kernel mode of Microsoft  Windows,  as  there	 the
	   User32 API, which is used to set executable privileges, isn't available.

       -fwritable-relocated-rdata
	   This	 option is available for MinGW and Cygwin targets.  It specifies that relocated-data in read-only section is
	   put into the ".data" section.  This is a necessary for older runtimes not  supporting  modification	of  ".rdata"
	   sections for pseudo-relocation.

       -mpe-aligned-commons
	   This option is available for Cygwin and MinGW targets.  It specifies that the GNU extension to the PE file format
	   that	 permits  the  correct	alignment of COMMON variables should be used when generating code.  It is enabled by
	   default if GCC detects that the target assembler found during configuration supports the feature.

       See also under x86 Options for standard options.

       Darwin Options

       These options are defined for all architectures running the Darwin operating system.

       FSF GCC on Darwin does not create "fat" object files; it creates an object file for the single architecture that	 GCC
       was built to target.  Apple's GCC on Darwin does create "fat" files if multiple -arch options are used; it does so by
       running the compiler or linker multiple times and joining the results together with lipo.

       The subtype of the file created (like ppc7400 or ppc970 or i686) is determined by the flags that specify the ISA that
       GCC is targeting, like -mcpu or -march.	The -force_cpusubtype_ALL option can be used to override this.

       The  Darwin  tools  vary	 in  their  behavior  when  presented with an ISA mismatch.  The assembler, as, only permits
       instructions to be used that are valid for the subtype of the file  it  is  generating,	so  you	 cannot	 put  64-bit
       instructions  in	 a ppc750 object file.	The linker for shared libraries, /usr/bin/libtool, fails and prints an error
       if asked to create a shared library with a less restrictive subtype than its input files (for instance, trying to put
       a ppc970 object file in a ppc7400 library).  The linker for executables, ld, quietly gives the  executable  the	most
       restrictive subtype of any of its input files.

       -Fdir
	   Add	the  framework	directory dir to the head of the list of directories to be searched for header files.  These
	   directories are interleaved with those specified by -I options and are scanned in a left-to-right order.

	   A framework directory is a directory with frameworks in it.	A framework is a directory  with  a  Headers  and/or
	   PrivateHeaders  directory  contained directly in it that ends in .framework.	 The name of a framework is the name
	   of this directory excluding the .framework.	Headers associated with the framework are found in one of those	 two
	   directories, with Headers being searched first.  A subframework is a framework directory that is in a framework's
	   Frameworks  directory.  Includes of subframework headers can only appear in a header of a framework that contains
	   the subframework, or in a sibling subframework header.  Two subframeworks are siblings if they occur in the	same
	   framework.  A subframework should not have the same name as a framework; a warning is issued if this is violated.
	   Currently a subframework cannot have subframeworks; in the future, the mechanism may be extended to support this.
	   The	standard  frameworks can be found in /System/Library/Frameworks and /Library/Frameworks.  An example include
	   looks like "#include ", where Framework denotes the name of the	framework  and	header.h  is
	   found in the PrivateHeaders or Headers directory.

       -iframeworkdir
	   Like	 -F  except  the directory is a treated as a system directory.	The main difference between this -iframework
	   and -F is that with -iframework the compiler does not warn about constructs contained within header	files  found
	   via dir.  This option is valid only for the C family of languages.

       -gused
	   Emit	  debugging   information   for	  symbols   that  are  used.   For  stabs  debugging  format,  this  enables
	   -feliminate-unused-debug-symbols.  This is by default ON.

       -gfull
	   Emit debugging information for all symbols and types.

       -fconstant-cfstrings
	   The -fconstant-cfstrings is an alias for -mconstant-cfstrings.

       -mconstant-cfstrings
	   When the NeXT runtime is being used (the default on these systems), override any -fconstant-string-class  setting
	   and cause "@"...""  literals to be laid out as constant CoreFoundation strings.

       -mmacosx-version-min=version
	   The	earliest  version  of  MacOS  X	 that  this executable will run on is version.	Typical values supported for
	   version include 12, 10.12, and 10.5.8.

	   If the compiler was built to use the system's headers by default, then the default for this option is the  system
	   version  on	which  the compiler is running, otherwise the default is to make choices that are compatible with as
	   many systems and code bases as possible.

       -mkernel
	   Enable  kernel  development	mode.	The  -mkernel  option  sets   -static,	 -fno-common,	-fno-use-cxa-atexit,
	   -fno-exceptions,  -fno-non-call-exceptions,	-fapple-kext,  -fno-weak  and -fno-rtti where applicable.  This mode
	   also sets -mno-altivec, -msoft-float, -fno-builtin and -mlong-branch for PowerPC targets.

       -mone-byte-bool
	   Override the defaults for "bool" so that "sizeof(bool)==1".	By default sizeof(bool)	 is  4	when  compiling	 for
	   Darwin/PowerPC and 1 when compiling for Darwin/x86, so this option has no effect on x86.

	   Warning: The -mone-byte-bool switch causes GCC to generate code that is not binary compatible with code generated
	   without  that switch.  Using this switch may require recompiling all other modules in a program, including system
	   libraries.  Use this switch to conform to a non-default data model.

       -mfix-and-continue
       -ffix-and-continue
       -findirect-data
	   Generate code suitable for fast turnaround development, such as to allow GDB to dynamically load  .o	 files	into
	   already-running programs.  -findirect-data and -ffix-and-continue are provided for backwards compatibility.

       -all_load
	   Loads all members of static archive libraries.  See man ld(1) for more information.

       -arch_errors_fatal
	   Cause the errors having to do with files that have the wrong architecture to be fatal.

       -bind_at_load
	   Causes the output file to be marked such that the dynamic linker will bind all undefined references when the file
	   is loaded or launched.

       -bundle
	   Produce a Mach-o bundle format file.	 See man ld(1) for more information.

       -bundle_loader executable
	   This	 option	 specifies the executable that will load the build output file being linked.  See man ld(1) for more
	   information.

       -dynamiclib
	   When passed this option, GCC produces a dynamic library instead of an executable when linking, using	 the  Darwin
	   libtool command.

       -force_cpusubtype_ALL
	   This causes GCC's output file to have the ALL subtype, instead of one controlled by the -mcpu or -march option.

       -nodefaultrpaths
	   Do  not  add default run paths for the compiler library directories to executables, modules or dynamic libraries.
	   On macOS 10.5 and later, the embedded runpath is added by default unless the user adds  -nodefaultrpaths  to	 the
	   link line. Run paths are needed (and therefore enforced) to build on macOS version 10.11 or later.

       -allowable_client  client_name
       -client_name
       -compatibility_version
       -current_version
       -dead_strip
       -dependency-file
       -dylib_file
       -dylinker_install_name
       -dynamic
       -exported_symbols_list
       -filelist
       -flat_namespace
       -force_flat_namespace
       -headerpad_max_install_names
       -image_base
       -init
       -install_name
       -keep_private_externs
       -multi_module
       -multiply_defined
       -multiply_defined_unused
       -noall_load
       -no_dead_strip_inits_and_terms
       -nofixprebinding
       -nomultidefs
       -noprebind
       -noseglinkedit
       -pagezero_size
       -prebind
       -prebind_all_twolevel_modules
       -private_bundle
       -read_only_relocs
       -sectalign
       -sectobjectsymbols
       -whyload
       -seg1addr
       -sectcreate
       -sectobjectsymbols
       -sectorder
       -segaddr
       -segs_read_only_addr
       -segs_read_write_addr
       -seg_addr_table
       -seg_addr_table_filename
       -seglinkedit
       -segprot
       -segs_read_only_addr
       -segs_read_write_addr
       -single_module
       -static
       -sub_library
       -sub_umbrella
       -twolevel_namespace
       -umbrella
       -undefined
       -unexported_symbols_list
       -weak_reference_mismatches
       -whatsloaded
	   These options are passed to the Darwin linker.  The Darwin linker man page describes them in detail.

       DEC Alpha Options

       These -m options are defined for the DEC Alpha implementations:

       -mno-soft-float
       -msoft-float
	   Use	(do  not  use) the hardware floating-point instructions for floating-point operations.	When -msoft-float is
	   specified, functions in libgcc.a are used to perform floating-point operations.   Unless  they  are	replaced  by
	   routines  that  emulate  the	 floating-point	 operations,  or  compiled  in such a way as to call such emulations
	   routines, these routines issue floating-point operations.   If you are compiling for an Alpha  without  floating-
	   point operations, you must ensure that the library is built so as not to call them.

	   Note that Alpha implementations without floating-point operations are required to have floating-point registers.

       -mfp-reg
       -mno-fp-regs
	   Generate  code  that uses (does not use) the floating-point register set.  -mno-fp-regs implies -msoft-float.  If
	   the floating-point register set is not used, floating-point operands are passed in integer registers as  if	they
	   were	 integers  and	floating-point	results	 are  passed  in  $0 instead of $f0.  This is a non-standard calling
	   sequence, so any function  with  a  floating-point  argument	 or  return  value  called  by	code  compiled	with
	   -mno-fp-regs must also be compiled with that option.

	   A  typical  use  of	this option is building a kernel that does not use, and hence need not save and restore, any
	   floating-point registers.

       -mieee
	   The Alpha architecture implements floating-point hardware  optimized	 for  maximum  performance.   It  is  mostly
	   compliant  with the IEEE floating-point standard.  However, for full compliance, software assistance is required.
	   This option generates code fully IEEE-compliant code except that the inexact-flag is not maintained (see  below).
	   If this option is turned on, the preprocessor macro "_IEEE_FP" is defined during compilation.  The resulting code
	   is  less efficient but is able to correctly support denormalized numbers and exceptional IEEE values such as not-
	   a-number and plus/minus infinity.  Other Alpha compilers call this option -ieee_with_no_inexact.

	   DEBIAN SPECIFIC: This option is on by default for alpha-linux-gnu, unless -ffinite-math-only (which	is  part  of
	   the	-ffast-math  set)  is  specified,  because  the	 software  functions in the GNU libc math libraries generate
	   denormalized numbers, NaNs, and infs (all of which will cause a programs to SIGFPE when it attempts	to  use	 the
	   results without -mieee).

       -mieee-with-inexact
	   This	 is  like  -mieee  except  the	generated code also maintains the IEEE inexact-flag.  Turning on this option
	   causes the generated code to implement fully-compliant IEEE math.  In addition to "_IEEE_FP", "_IEEE_FP_EXACT" is
	   defined as a preprocessor macro.  On some Alpha implementations the	resulting  code	 may  execute  significantly
	   slower than the code generated by default.  Since there is very little code that depends on the inexact-flag, you
	   should normally not specify this option.  Other Alpha compilers call this option -ieee_with_inexact.

       -mfp-trap-mode=trap-mode
	   This option controls what floating-point related traps are enabled.	Other Alpha compilers call this option -fptm
	   trap-mode.  The trap mode can be set to one of four values:

	   n   This  is	 the default (normal) setting.	The only traps that are enabled are the ones that cannot be disabled
	       in software (e.g., division by zero trap).

	   u   In addition to the traps enabled by n, underflow traps are enabled as well.

	   su  Like u, but the instructions are marked to be safe for software completion (see Alpha architecture manual for
	       details).

	   sui Like su, but inexact traps are enabled as well.

       -mfp-rounding-mode=rounding-mode
	   Selects the IEEE rounding mode.  Other Alpha compilers call this option -fprm rounding-mode.	  The  rounding-mode
	   can be one of:

	   n   Normal  IEEE rounding mode.  Floating-point numbers are rounded towards the nearest machine number or towards
	       the even machine number in case of a tie.

	   m   Round towards minus infinity.

	   c   Chopped rounding mode.  Floating-point numbers are rounded towards zero.

	   d   Dynamic rounding mode.  A field	in  the	 floating-point	 control  register  (fpcr,  see	 Alpha	architecture
	       reference manual) controls the rounding mode in effect.	The C library initializes this register for rounding
	       towards	plus  infinity.	  Thus,	 unless	 your program modifies the fpcr, d corresponds to round towards plus
	       infinity.

       -mtrap-precision=trap-precision
	   In the Alpha architecture, floating-point traps are imprecise.  This means  without	software  assistance  it  is
	   impossible  to  recover  from  a  floating  trap  and program execution normally needs to be terminated.  GCC can
	   generate code that can assist operating system trap handlers in determining the  exact  location  that  caused  a
	   floating-point  trap.   Depending  on  the  requirements of an application, different levels of precisions can be
	   selected:

	   p   Program precision.  This option is the default and means a trap	handler	 can  only  identify  which  program
	       caused a floating-point exception.

	   f   Function precision.  The trap handler can determine the function that caused a floating-point exception.

	   i   Instruction  precision.	 The  trap  handler can determine the exact instruction that caused a floating-point
	       exception.

	   Other Alpha compilers provide the equivalent options called -scope_safe and -resumption_safe.

       -mieee-conformant
	   This option marks the generated code as IEEE conformant.  You must not use this option unless  you  also  specify
	   -mtrap-precision=i  and  either  -mfp-trap-mode=su  or  -mfp-trap-mode=sui.	 Its only effect is to emit the line
	   .eflag 48 in the function prologue of the generated assembly file.

       -mbuild-constants
	   Normally GCC examines a 32- or 64-bit integer constant to see if it can construct it from  smaller  constants  in
	   two or three instructions.  If it cannot, it outputs the constant as a literal and generates code to load it from
	   the data segment at run time.

	   Use	this option to require GCC to construct all integer constants using code, even if it takes more instructions
	   (the maximum is six).

	   You typically use this option to build a shared library  dynamic  loader.   Itself  a  shared  library,  it	must
	   relocate itself in memory before it can find the variables and constants in its own data segment.

       -mbwx
       -mno-bwx
       -mcix
       -mno-cix
       -mfix
       -mno-fix
       -mmax
       -mno-max
	   Indicate  whether  GCC  should  generate  code  to  use the optional BWX, CIX, FIX and MAX instruction sets.	 The
	   default is to use the instruction sets supported by the CPU type specified via -mcpu= option or that of  the	 CPU
	   on which GCC was built if none is specified.

       -msafe-bwa
       -mno-safe-bwa
	   Indicate  whether  in the absence of the optional BWX instruction set GCC should generate multi-thread and async-
	   signal safe code for byte and aligned word memory accesses.

       -msafe-partial
       -mno-safe-partial
	   Indicate whether GCC should generate multi-thread  and  async-signal	 safe  code  for  partial  memory  accesses,
	   including  piecemeal	 accesses  to  unaligned  data	as  well  as block accesses to leading and trailing parts of
	   aggregate types or other objects in memory that do not respectively start and  end  on  an  aligned	64-bit	data
	   boundary.

       -mfloat-vax
       -mfloat-ieee
	   Generate  code  that	 uses (does not use) VAX F and G floating-point arithmetic instead of IEEE single and double
	   precision.

       -mexplicit-relocs
       -mno-explicit-relocs
	   Older Alpha assemblers provided no way to generate symbol relocations except via assembler macros.  Use of  these
	   macros does not allow optimal instruction scheduling.  GNU binutils as of version 2.12 supports a new syntax that
	   allows  the	compiler  to  explicitly  mark which relocations should apply to which instructions.  This option is
	   mostly useful for debugging, as GCC detects the capabilities of the assembler when  it  is  built  and  sets	 the
	   default accordingly.

       -msmall-data
       -mlarge-data
	   When	 -mexplicit-relocs  is in effect, static data is accessed via gp-relative relocations.	When -msmall-data is
	   used, objects 8 bytes long or smaller are placed in a small data area (the ".sdata" and ".sbss" sections) and are
	   accessed via 16-bit relocations off of the $gp register.  This limits the size of the small data  area  to  64KB,
	   but allows the variables to be directly accessed via a single instruction.

	   The default is -mlarge-data.	 With this option the data area is limited to just below 2GB.  Programs that require
	   more	 than  2GB  of data must use "malloc" or "mmap" to allocate the data in the heap instead of in the program's
	   data segment.

	   When generating code for shared libraries, -fpic implies -msmall-data and -fPIC implies -mlarge-data.

       -msmall-text
       -mlarge-text
	   When -msmall-text is used, the compiler assumes that the code of the entire program (or shared library)  fits  in
	   4MB,	 and  is  thus reachable with a branch instruction.  When -msmall-data is used, the compiler can assume that
	   all local symbols share the same $gp value, and thus reduce the number of instructions required  for	 a  function
	   call from 4 to 1.

	   The default is -mlarge-text.

       -mcpu=cpu_type
	   Set	the instruction set and instruction scheduling parameters for machine type cpu_type.  You can specify either
	   the EV style name or the corresponding chip number.	GCC supports scheduling parameters for the EV4, EV5 and	 EV6
	   family  of  processors and chooses the default values for the instruction set from the processor you specify.  If
	   you do not specify a processor type, GCC defaults to the processor on which the compiler was built.

	   Supported values for cpu_type are

	   ev4
	   ev45
	   21064
	       Schedules as an EV4 and has no instruction set extensions.

	   ev5
	   21164
	       Schedules as an EV5 and has no instruction set extensions.

	   ev56
	   21164a
	       Schedules as an EV5 and supports the BWX extension.

	   pca56
	   21164pc
	   21164PC
	       Schedules as an EV5 and supports the BWX and MAX extensions.

	   ev6
	   21264
	       Schedules as an EV6 and supports the BWX, FIX, and MAX extensions.

	   ev67
	   21264a
	       Schedules as an EV6 and supports the BWX, CIX, FIX, and MAX extensions.

	   Native toolchains also support the value native,  which  selects  the  best	architecture  option  for  the	host
	   processor.  -mcpu=native has no effect if GCC does not recognize the processor.

       -mtune=cpu_type
	   Set only the instruction scheduling parameters for machine type cpu_type.  The instruction set is not changed.

	   Native  toolchains  also  support  the  value  native,  which  selects  the best architecture option for the host
	   processor.  -mtune=native has no effect if GCC does not recognize the processor.

       -mmemory-latency=time
	   Sets the latency the scheduler should assume for typical memory references as  seen	by  the	 application.	This
	   number  is  highly  dependent  on the memory access patterns used by the application and the size of the external
	   cache on the machine.

	   Valid options for time are

	   number
	       A decimal number representing clock cycles.

	   L1
	   L2
	   L3
	   main
	       The compiler contains estimates of the number of clock cycles for "typical" EV4 & EV5 hardware for the  Level
	       1,  2  &	 3 caches (also called Dcache, Scache, and Bcache), as well as to main memory.	Note that L3 is only
	       valid for EV5.

       eBPF Options

       -mframe-limit=bytes
	   This specifies the hard limit for frame sizes, in bytes.  Currently, the value that can be  specified  should  be
	   less than or equal to 32767.	 Defaults to whatever limit is imposed by the version of the Linux kernel targeted.

       -mbig-endian
	   Generate code for a big-endian target.

       -mlittle-endian
	   Generate code for a little-endian target.  This is the default.

       -mjmpext
       -mno-jmpext
	   Enable or disable generation of extra conditional-branch instructions.  Enabled for CPU v2 and above.

       -mjmp32
       -mno-jmp32
	   Enable or disable generation of 32-bit jump instructions.  Enabled for CPU v3 and above.

       -malu32
       -mno-alu32
	   Enable or disable generation of 32-bit ALU instructions.  Enabled for CPU v3 and above.

       -mv3-atomics
       -mno-v3-atomics
	   Enable or disable instructions for general atomic operations introduced in CPU v3.  Enabled for CPU v3 and above.

       -mbswap
       -mno-bswap
	   Enable or disable byte swap instructions.  Enabled for CPU v4 and above.

       -msdiv
       -mno-sdiv
	   Enable or disable signed division and modulus instructions.	Enabled for CPU v4 and above.

       -msmov
       -mno-smov
	   Enable or disable sign-extending move and memory load instructions.	Enabled for CPU v4 and above.

       -mcpu=version
	   This	 specifies  which version of the eBPF ISA to target. Newer versions may not be supported by all kernels. The
	   default is v4.

	   Supported values for version are:

	   v1  The first stable eBPF ISA with no special features or extensions.

	   v2  Supports the jump extensions, as in -mjmpext.

	   v3  All features of v2, plus:

	       -<32-bit jump operations, as in -mjmp32>
	       -<32-bit ALU operations, as in -malu32>
	       -
	   v4  All features of v3, plus:

	       -
	       -
	       -
       -mco-re
	   Enable BPF Compile Once - Run Everywhere (CO-RE) support. Requires and is implied by -gbtf.

       -mno-co-re
	   Disable BPF Compile Once - Run Everywhere  (CO-RE)  support.	 BPF  CO-RE  support  is  enabled  by  default	when
	   generating BTF debug information for the BPF target.

       -mxbpf
	   Generate  code  for	an  expanded  version  of  BPF,	 which	relaxes	 some of the restrictions imposed by the BPF
	   architecture:

	   -
	       exit, respectively.

       -masm=dialect
	   Outputs assembly instructions using eBPF selected dialect.  The default is pseudoc.

	   Supported values for dialect are:

	   normal
	       Outputs normal assembly dialect.

	   pseudoc
	       Outputs pseudo-c assembly dialect.

       -minline-memops-threshold=bytes
	   Specifies a size threshold in bytes at or below which memmove, memcpy and memset shall always be expanded inline.
	   Operations dealing with sizes larger than this threshold would have	to  be	implemented  using  a  library	call
	   instead  of	being  expanded	 inline, but since BPF doesn't allow libcalls, exceeding this threshold results in a
	   compile-time error.	The default is 1024 bytes.

       FR30 Options

       These options are defined specifically for the FR30 port.

       -msmall-model
	   Use the small address space model.  This can produce smaller code, but it does assume that  all  symbolic  values
	   and addresses fit into a 20-bit range.

       -mno-lsim
	   Assume that runtime support has been provided and so there is no need to include the simulator library (libsim.a)
	   on the linker command line.

       FT32 Options

       These options are defined specifically for the FT32 port.

       -msim
	   Specifies that the program will be run on the simulator.  This causes an alternate runtime startup and library to
	   be  linked.	 You  must  not	 use  this  option when generating programs that will run on real hardware; you must
	   provide your own runtime library for whatever I/O functions are needed.

       -mlra
	   Does nothing.  Preserved for backward compatibility.

       -mnodiv
	   Do not use div and mod instructions.

       -mft32b
	   Enable use of the extended instructions of the FT32B processor.

       -mcompress
	   Compress all code using the Ft32B code compression scheme.

       -mnopm
	   Do not generate code that reads program memory.

       FRV Options

       -mgpr-32
	   Only use the first 32 general-purpose registers.

       -mgpr-64
	   Use all 64 general-purpose registers.

       -mfpr-32
	   Use only the first 32 floating-point registers.

       -mfpr-64
	   Use all 64 floating-point registers.

       -mhard-float
	   Use hardware instructions for floating-point operations.

       -msoft-float
	   Use library routines for floating-point operations.

       -malloc-cc
	   Dynamically allocate condition code registers.

       -mfixed-cc
	   Do not try to dynamically allocate condition code registers, only use "icc0" and "fcc0".

       -mdword
	   Change ABI to use double word insns.

       -mno-dword
	   Do not use double word instructions.

       -mdouble
	   Use floating-point double instructions.

       -mno-double
	   Do not use floating-point double instructions.

       -mmedia
	   Use media instructions.

       -mno-media
	   Do not use media instructions.

       -mmuladd
	   Use multiply and add/subtract instructions.

       -mno-muladd
	   Do not use multiply and add/subtract instructions.

       -mfdpic
	   Select the FDPIC ABI,  which	 uses  function	 descriptors  to  represent  pointers  to  functions.	Without	 any
	   PIC/PIE-related options, it implies -fPIE.  With -fpic or -fpie, it assumes GOT entries and small data are within
	   a  12-bit  range  from  the GOT base address; with -fPIC or -fPIE, GOT offsets are computed with 32 bits.  With a
	   bfin-elf target, this option implies -msim.

       -minline-plt
	   Enable inlining of PLT entries in function calls to functions that are not known to	bind  locally.	 It  has  no
	   effect  without  -mfdpic.   It's  enabled  by  default if optimizing for speed and compiling for shared libraries
	   (i.e., -fPIC or -fpic), or when an optimization option such as -O3 or above is present in the command line.

       -mTLS
	   Assume a large TLS segment when generating thread-local code.

       -mtls
	   Do not assume a large TLS segment when generating thread-local code.

       -mgprel-ro
	   Enable the use of "GPREL" relocations in the FDPIC ABI for data that is known to be in read-only sections.	It's
	   enabled  by	default, except for -fpic or -fpie: even though it may help make the global offset table smaller, it
	   trades 1 instruction for 4.	With -fPIC or -fPIE, it trades 3 instructions for 4, one of which may be  shared  by
	   multiple  symbols,  and it avoids the need for a GOT entry for the referenced symbol, so it's more likely to be a
	   win.	 If it is not, -mno-gprel-ro can be used to disable it.

       -multilib-library-pic
	   Link with the (library, not FD) pic libraries.  It's implied by -mlibrary-pic, as well  as  by  -fPIC  and  -fpic
	   without -mfdpic.  You should never have to use it explicitly.

       -mlinked-fp
	   Follow  the EABI requirement of always creating a frame pointer whenever a stack frame is allocated.	 This option
	   is enabled by default and can be disabled with -mno-linked-fp.

       -mlong-calls
	   Use indirect addressing to call functions outside the current compilation unit.  This allows the functions to  be
	   placed anywhere within the 32-bit address space.

       -malign-labels
	   Try	to  align  labels to an 8-byte boundary by inserting NOPs into the previous packet.  This option only has an
	   effect when VLIW packing is enabled.	 It doesn't create new packets; it merely adds NOPs to existing ones.

       -mlibrary-pic
	   Generate position-independent EABI code.

       -macc-4
	   Use only the first four media accumulator registers.

       -macc-8
	   Use all eight media accumulator registers.

       -mpack
	   Pack VLIW instructions.

       -mno-pack
	   Do not pack VLIW instructions.

       -mno-eflags
	   Do not mark ABI switches in e_flags.

       -mcond-move
	   Enable the use of conditional-move instructions (default).

	   This switch is mainly for debugging the compiler and will likely be removed in a future version.

       -mno-cond-move
	   Disable the use of conditional-move instructions.

	   This switch is mainly for debugging the compiler and will likely be removed in a future version.

       -mscc
	   Enable the use of conditional set instructions (default).

	   This switch is mainly for debugging the compiler and will likely be removed in a future version.

       -mno-scc
	   Disable the use of conditional set instructions.

	   This switch is mainly for debugging the compiler and will likely be removed in a future version.

       -mcond-exec
	   Enable the use of conditional execution (default).

	   This switch is mainly for debugging the compiler and will likely be removed in a future version.

       -mno-cond-exec
	   Disable the use of conditional execution.

	   This switch is mainly for debugging the compiler and will likely be removed in a future version.

       -mvliw-branch
	   Run a pass to pack branches into VLIW instructions (default).

	   This switch is mainly for debugging the compiler and will likely be removed in a future version.

       -mno-vliw-branch
	   Do not run a pass to pack branches into VLIW instructions.

	   This switch is mainly for debugging the compiler and will likely be removed in a future version.

       -mmulti-cond-exec
	   Enable optimization of "&&" and "||" in conditional execution (default).

	   This switch is mainly for debugging the compiler and will likely be removed in a future version.

       -mno-multi-cond-exec
	   Disable optimization of "&&" and "||" in conditional execution.

	   This switch is mainly for debugging the compiler and will likely be removed in a future version.

       -mnested-cond-exec
	   Enable nested conditional execution optimizations (default).

	   This switch is mainly for debugging the compiler and will likely be removed in a future version.

       -mno-nested-cond-exec
	   Disable nested conditional execution optimizations.

	   This switch is mainly for debugging the compiler and will likely be removed in a future version.

       -moptimize-membar
	   This switch removes redundant "membar" instructions from the compiler-generated code.  It is enabled by default.

       -mno-optimize-membar
	   This switch disables the automatic removal of redundant "membar" instructions from the generated code.

       -mtomcat-stats
	   Cause gas to print out tomcat statistics.

       -mcpu=cpu
	   Select the processor type for which to generate code.  Possible values are  frv,  fr550,  tomcat,  fr500,  fr450,
	   fr405, fr400, fr300 and simple.

       GNU/Linux Options

       These -m options are defined for GNU/Linux targets:

       -mglibc
	   Use	 the   GNU   C	 library.    This   is	the  default  except  on  *-*-linux-*uclibc*,  *-*-linux-*musl*	 and
	   *-*-linux-*android* targets.

       -muclibc
	   Use uClibc C library.  This is the default on *-*-linux-*uclibc* targets.

       -mmusl
	   Use the musl C library.  This is the default on *-*-linux-*musl* targets.

       -mbionic
	   Use Bionic C library.  This is the default on *-*-linux-*android* targets.

       -mandroid
	   Compile code compatible with Android platform.  This is the default on *-*-linux-*android* targets.

	   When compiling, this option enables -mbionic, -fPIC, -fno-exceptions and -fno-rtti  by  default.   When  linking,
	   this	 option	 makes	the GCC driver pass Android-specific options to the linker.  Finally, this option causes the
	   preprocessor macro "__ANDROID__" to be defined.

       -tno-android-cc
	   Disable compilation effects of -mandroid, i.e., do not enable -mbionic, -fPIC, -fno-exceptions and  -fno-rtti  by
	   default.

       -tno-android-ld
	   Disable linking effects of -mandroid, i.e., pass standard Linux linking options to the linker.

       H8/300 Options

       These -m options are defined for the H8/300 implementations:

       -mrelax
	   Shorten some address references at link time, when possible; uses the linker option -relax.

       -mh Generate code for the H8/300H.

       -ms Generate code for the H8S.

       -mn Generate code for the H8S and H8/300H in the normal mode.  This switch must be used either with -mh or -ms.

       -ms2600
	   Generate code for the H8S/2600.  This switch must be used with -ms.

       -mexr
	   Extended  registers	are  stored  on stack before execution of function with monitor attribute. Default option is
	   -mexr.  This option is valid only for H8S targets.

       -mno-exr
	   Extended registers are not stored on stack before execution of function with monitor attribute. Default option is
	   -mno-exr.  This option is valid only for H8S targets.

       -mint32
	   Make "int" data 32 bits by default.

       -malign-300
	   On the H8/300H and H8S, use the same alignment rules as for the H8/300.  The default for the H8/300H and  H8S  is
	   to  align  longs  and  floats  on 4-byte boundaries.	 -malign-300 causes them to be aligned on 2-byte boundaries.
	   This option has no effect on the H8/300.

       HPPA Options

       These -m options are defined for the HPPA family of computers:

       -march=architecture-type
	   Generate code for the specified architecture.  The choices for architecture-type are 1.0 for PA 1.0, 1.1  for  PA
	   1.1,	 and  2.0  for PA 2.0 processors.  Refer to /usr/lib/sched.models on an HP-UX system to determine the proper
	   architecture option for your machine.  Code compiled for lower numbered architectures  runs	on  higher  numbered
	   architectures, but not the other way around.

       -mpa-risc-1-0
       -mpa-risc-1-1
       -mpa-risc-2-0
	   Synonyms for -march=1.0, -march=1.1, and -march=2.0 respectively.

       -matomic-libcalls
	   Generate  libcalls  for  atomic  loads  and	stores	when  sync libcalls are disabled.  This option is enabled by
	   default.  It only affects the generation of atomic libcalls by the HPPA backend.

	   Both the sync and libatomic libcall implementations use locking.  As a result, processor stores  are	 not  atomic
	   with	 respect  to  other atomic operations.	Processor loads up to DImode are atomic with respect to other atomic
	   operations provided they are implemented as a single access.

	   The PA-RISC architecture does not support any atomic operations in hardware except for  the	"ldcw"	instruction.
	   Thus,  all  atomic  support	is implemented using sync and atomic libcalls.	Sync libcall support is in libgcc.a.
	   Atomic libcall support is in libatomic.

	   This option generates "__atomic_exchange" calls for atomic stores.  It also provides special handling for  atomic
	   DImode accesses on 32-bit targets.

       -mbig-switch
	   Does nothing.  Preserved for backward compatibility.

       -mcaller-copies
	   The	caller	copies function arguments passed by hidden reference.  This option should be used with care as it is
	   not compatible with the default 32-bit runtime.  However, only aggregates larger than eight bytes are  passed  by
	   hidden reference and the option provides better compatibility with OpenMP.

       -mcoherent-ldcw
	   Use ldcw/ldcd coherent cache-control hint.

       -mdisable-fpregs
	   Disable floating-point registers.  Equivalent to "-msoft-float".

       -mdisable-indexing
	   Prevent  the compiler from using indexing address modes.  This avoids some rather obscure problems when compiling
	   MIG generated code under MACH.

       -mfast-indirect-calls
	   Generate code that assumes calls never cross space boundaries.  This allows GCC to emit code that performs faster
	   indirect calls.

	   This option does not work in the presence of shared libraries or nested functions.

       -mfixed-range=register-range
	   Generate code treating the given register range as fixed registers.	A fixed register is one	 that  the  register
	   allocator cannot use.  This is useful when compiling kernel code.  A register range is specified as two registers
	   separated by a dash.	 Multiple register ranges can be specified separated by a comma.

       -mgas
	   Enable the use of assembler directives only GAS understands.

       -mgnu-ld
	   Use	options	 specific  to  GNU ld.	This passes -shared to ld when building a shared library.  It is the default
	   when GCC is configured, explicitly or implicitly, with the GNU linker.  This option does not affect which  ld  is
	   called;  it	only  changes  what  parameters	 are  passed to that ld.  The ld that is called is determined by the
	   --with-ld configure option, GCC's program search path, and finally by the user's PATH.  The linker  used  by	 GCC
	   can	be  printed  using  which `gcc -print-prog-name=ld`.  This option is only available on the 64-bit HP-UX GCC,
	   i.e. configured with hppa*64*-*-hpux*.

       -mhp-ld
	   Use options specific to HP ld.  This passes	-b  to	ld  when  building  a  shared  library	and  passes  +Accept
	   TypeMismatch to ld on all links.  It is the default when GCC is configured, explicitly or implicitly, with the HP
	   linker.   This  option does not affect which ld is called; it only changes what parameters are passed to that ld.
	   The ld that is called is determined by the --with-ld configure option, GCC's program search path, and finally  by
	   the	user's	PATH.	The linker used by GCC can be printed using which `gcc -print-prog-name=ld`.  This option is
	   only available on the 64-bit HP-UX GCC, i.e. configured with hppa*64*-*-hpux*.

       -mlinker-opt
	   Enable the optimization pass in the HP-UX linker.  Note this makes symbolic debugging impossible.

       -mlong-calls
	   Generate code that uses long call sequences.	 This ensures that a call is always able to reach  linker  generated
	   stubs.   The	 default is to generate long calls only when the distance from the call site to the beginning of the
	   function or translation unit, as the case may be, exceeds a predefined limit set by the branch type	being  used.
	   The	limits	for  normal  calls  are	 7,600,000  and	 240,000  bytes,  respectively	for  the  PA  2.0 and PA 1.X
	   architectures.  Sibcalls are always limited at 240,000 bytes.

	   Distances are measured from the beginning of functions when using the -ffunction-sections option, or	 when  using
	   the -mgas and -mno-portable-runtime options together under HP-UX with the SOM linker.

	   It  is  normally not desirable to use this option as it degrades performance.  However, it may be useful in large
	   applications, particularly when partial linking is used to build the application.

	   The types of long calls used depends on the capabilities of the assembler and linker, and the type of code  being
	   generated.  The impact on systems that support long absolute calls, and long pic symbol-difference or pc-relative
	   calls  should be relatively small.  However, an indirect call is used on 32-bit ELF systems in pic code and it is
	   quite long.

       -mlong-load-store
	   Generate 3-instruction load and store sequences as sometimes required by the HP-UX 10 linker.  This is equivalent
	   to the +k option to the HP compilers.

       -mjump-in-delay
	   This option is ignored and provided for compatibility purposes only.

       -mno-space-regs
	   Generate code that assumes the target has no space registers.  This allows GCC to generate faster indirect  calls
	   and use unscaled index address modes.

	   Such code is suitable for level 0 PA systems and kernels.

       -mordered
	   Assume memory references are ordered and barriers are not needed.

       -mportable-runtime
	   Use the portable calling conventions proposed by HP for ELF systems.

       -mschedule=cpu-type
	   Schedule code according to the constraints for the machine type cpu-type.  The choices for cpu-type are 700 7100,
	   7100LC,  7200,  7300	 and  8000.   Refer  to	 /usr/lib/sched.models	on  an	HP-UX system to determine the proper
	   scheduling option for your machine.	The default scheduling is 8000.

       -msio
	   Generate the predefine, "_SIO",  for	 server	 IO.   The  default  is	 -mwsio.   This	 generates  the	 predefines,
	   "__hp9000s700",  "__hp9000s700__"  and  "_WSIO", for workstation IO.	 These options are available under HP-UX and
	   HI-UX.

       -msoft-float
	   Generate output containing library calls for floating point.	 Warning: the requisite libraries are not  available
	   for	all  HPPA  targets.   Normally the facilities of the machine's usual C compiler are used, but this cannot be
	   done directly in cross-compilation.	You must make your own arrangements to provide	suitable  library  functions
	   for cross-compilation.

	   -msoft-float	 changes  the calling convention in the output file; therefore, it is only useful if you compile all
	   of a program with this option.  In particular, you need to compile libgcc.a, the library  that  comes  with	GCC,
	   with -msoft-float in order for this to work.

       -msoft-mult
	   Use software integer multiplication.

	   This disables the use of the "xmpyu" instruction.

       -munix=unix-std
	   Generate  compiler  predefines  and select a startfile for the specified UNIX standard.  The choices for unix-std
	   are 93, 95 and 98.  93 is supported on all HP-UX versions.  95 is available on HP-UX	 10.10	and  later.   98  is
	   available  on  HP-UX	 11.11	and  later.  The default values are 93 for HP-UX 10.00, 95 for HP-UX 10.10 though to
	   11.00, and 98 for HP-UX 11.11 and later.

	   -munix=93 provides the same predefines as  GCC  3.3	and  3.4.   -munix=95  provides	 additional  predefines	 for
	   "XOPEN_UNIX"	 and "_XOPEN_SOURCE_EXTENDED", and the startfile unix95.o.  -munix=98 provides additional predefines
	   for "_XOPEN_UNIX", "_XOPEN_SOURCE_EXTENDED", "_INCLUDE__STDC_A1_SOURCE" and "_INCLUDE_XOPEN_SOURCE_500", and	 the
	   startfile unix98.o.

	   It  is  important  to note that this option changes the interfaces for various library routines.  It also affects
	   the operational behavior of the C library.  Thus, extreme care is needed in using this option.

	   Library code that is intended to operate with more than one UNIX standard must test, set and restore the variable
	   "__xpg4_extended_mask" as appropriate.  Most GNU software doesn't provide this capability.

       -nolibdld
	   Suppress the generation of link options to search libdld.sl when the -static option is specified on HP-UX 10	 and
	   later.

       -static
	   The	HP-UX  implementation of setlocale in libc has a dependency on libdld.sl.  There isn't an archive version of
	   libdld.sl.  Thus, when the -static option  is  specified,  special  link  options  are  needed  to  resolve	this
	   dependency.

	   On  HP-UX  10 and later, the GCC driver adds the necessary options to link with libdld.sl when the -static option
	   is specified.  This causes the resulting binary to be dynamic.  On the 64-bit port, the linkers generate  dynamic
	   binaries  by	 default  in any case.	The -nolibdld option can be used to prevent the GCC driver from adding these
	   link options.

       -threads
	   Add support for multithreading with the dce thread library under HP-UX.  This option	 sets  flags  for  both	 the
	   preprocessor and linker.

       IA-64 Options

       These are the -m options defined for the Intel IA-64 architecture.

       -mbig-endian
	   Generate code for a big-endian target.  This is the default for HP-UX.

       -mlittle-endian
	   Generate code for a little-endian target.  This is the default for AIX5 and GNU/Linux.

       -mgnu-as
       -mno-gnu-as
	   Generate (or don't) code for the GNU assembler.  This is the default.

       -mgnu-ld
       -mno-gnu-ld
	   Generate (or don't) code for the GNU linker.	 This is the default.

       -mno-pic
	   Generate  code  that	 does  not  use a global pointer register.  The result is not position independent code, and
	   violates the IA-64 ABI.

       -mvolatile-asm-stop
       -mno-volatile-asm-stop
	   Generate (or don't) a stop bit immediately before and after volatile asm statements.

       -mregister-names
       -mno-register-names
	   Generate (or don't) in, loc, and out register names for the stacked registers.  This may  make  assembler  output
	   more readable.

       -mno-sdata
       -msdata
	   Disable  (or	 enable)  optimizations	 that  use  the	 small	data section.  This may be useful for working around
	   optimizer bugs.

       -mconstant-gp
	   Generate code that uses a single constant global pointer value.  This is useful when compiling kernel code.

       -mauto-pic
	   Generate code that is self-relocatable.  This implies -mconstant-gp.	 This  is  useful  when	 compiling  firmware
	   code.

       -minline-float-divide-min-latency
	   Generate code for inline divides of floating-point values using the minimum latency algorithm.

       -minline-float-divide-max-throughput
	   Generate code for inline divides of floating-point values using the maximum throughput algorithm.

       -mno-inline-float-divide
	   Do not generate inline code for divides of floating-point values.

       -minline-int-divide-min-latency
	   Generate code for inline divides of integer values using the minimum latency algorithm.

       -minline-int-divide-max-throughput
	   Generate code for inline divides of integer values using the maximum throughput algorithm.

       -mno-inline-int-divide
	   Do not generate inline code for divides of integer values.

       -minline-sqrt-min-latency
	   Generate code for inline square roots using the minimum latency algorithm.

       -minline-sqrt-max-throughput
	   Generate code for inline square roots using the maximum throughput algorithm.

       -mno-inline-sqrt
	   Do not generate inline code for "sqrt".

       -mfused-madd
       -mno-fused-madd
	   Do  (don't)	generate code that uses the fused multiply/add or multiply/subtract instructions.  The default is to
	   use these instructions.

       -mno-dwarf2-asm
       -mdwarf2-asm
	   Don't (or do) generate assembler code for the DWARF line number debugging info.  This  may  be  useful  when	 not
	   using the GNU assembler.

       -mearly-stop-bits
       -mno-early-stop-bits
	   Allow  stop	bits  to  be  placed earlier than immediately preceding the instruction that triggered the stop bit.
	   This can improve instruction scheduling, but does not always do so.

       -mfixed-range=register-range
	   Generate code treating the given register range as fixed registers.	A fixed register is one	 that  the  register
	   allocator cannot use.  This is useful when compiling kernel code.  A register range is specified as two registers
	   separated by a dash.	 Multiple register ranges can be specified separated by a comma.

       -mtls-size=tls-size
	   Specify bit size of immediate TLS offsets.  Valid values are 14, 22, and 64.

       -mtune=cpu-type
	   Tune	 the  instruction scheduling for a particular CPU, Valid values are itanium, itanium1, merced, itanium2, and
	   mckinley.

       -milp32
       -mlp64
	   Generate code for a 32-bit or 64-bit environment.  The 32-bit environment sets int, long and pointer to 32  bits.
	   The 64-bit environment sets int to 32 bits and long and pointer to 64 bits.	These are HP-UX specific flags.

       -mno-sched-br-data-spec
       -msched-br-data-spec
	   (Dis/En)able	 data  speculative  scheduling before reload.  This results in generation of "ld.a" instructions and
	   the corresponding check instructions ("ld.c" / "chk.a").  The default setting is disabled.

       -msched-ar-data-spec
       -mno-sched-ar-data-spec
	   (En/Dis)able data speculative scheduling after reload.  This results in generation of "ld.a" instructions and the
	   corresponding check instructions ("ld.c" / "chk.a").	 The default setting is enabled.

       -mno-sched-control-spec
       -msched-control-spec
	   (Dis/En)able control speculative scheduling.	 This feature is  available  only  during  region  scheduling  (i.e.
	   before  reload).   This results in generation of the "ld.s" instructions and the corresponding check instructions
	   "chk.s".  The default setting is disabled.

       -msched-br-in-data-spec
       -mno-sched-br-in-data-spec
	   (En/Dis)able speculative scheduling of the instructions that are dependent on the data speculative  loads  before
	   reload.  This is effective only with -msched-br-data-spec enabled.  The default setting is enabled.

       -msched-ar-in-data-spec
       -mno-sched-ar-in-data-spec
	   (En/Dis)able	 speculative  scheduling  of the instructions that are dependent on the data speculative loads after
	   reload.  This is effective only with -msched-ar-data-spec enabled.  The default setting is enabled.

       -msched-in-control-spec
       -mno-sched-in-control-spec
	   (En/Dis)able speculative scheduling of the instructions that are dependent  on  the	control	 speculative  loads.
	   This is effective only with -msched-control-spec enabled.  The default setting is enabled.

       -mno-sched-prefer-non-data-spec-insns
       -msched-prefer-non-data-spec-insns
	   If  enabled,	 data-speculative  instructions	 are  chosen  for schedule only if there are no other choices at the
	   moment.  This makes the use of the data speculation much more conservative.	The default setting is disabled.

       -mno-sched-prefer-non-control-spec-insns
       -msched-prefer-non-control-spec-insns
	   If enabled, control-speculative instructions are chosen for schedule only if there are no other  choices  at	 the
	   moment.  This makes the use of the control speculation much more conservative.  The default setting is disabled.

       -mno-sched-count-spec-in-critical-path
       -msched-count-spec-in-critical-path
	   If  enabled,	 speculative  dependencies  are	 considered during computation of the instructions priorities.	This
	   makes the use of the speculation a bit more conservative.  The default setting is disabled.

       -msched-spec-ldc
	   Use a simple data speculation check.	 This option is on by default.

       -msched-control-spec-ldc
	   Use a simple check for control speculation.	This option is on by default.

       -msched-stop-bits-after-every-cycle
	   Place a stop bit after every cycle when scheduling.	This option is on by default.

       -msched-fp-mem-deps-zero-cost
	   Assume that floating-point stores and loads are not likely  to  cause  a  conflict  when  placed  into  the	same
	   instruction group.  This option is disabled by default.

       -msel-sched-dont-check-control-spec
	   Generate checks for control speculation in selective scheduling.  This flag is disabled by default.

       -msched-max-memory-insns=max-insns
	   Limit  on  the  number  of  memory  insns per instruction group, giving lower priority to subsequent memory insns
	   attempting to schedule in the same instruction group. Frequently useful to prevent  cache  bank  conflicts.	 The
	   default value is 1.

       -msched-max-memory-insns-hard-limit
	   Makes  the  limit  specified	 by  msched-max-memory-insns  a	 hard limit, disallowing more than that number in an
	   instruction group.  Otherwise, the limit is "soft", meaning that non-memory operations  are	preferred  when	 the
	   limit is reached, but memory operations may still be scheduled.

       LM32 Options

       These -m options are defined for the LatticeMico32 architecture:

       -mbarrel-shift-enabled
	   Enable barrel-shift instructions.

       -mdivide-enabled
	   Enable divide and modulus instructions.

       -mmultiply-enabled
	   Enable multiply instructions.

       -msign-extend-enabled
	   Enable sign extend instructions.

       -muser-enabled
	   Enable user-defined instructions.

       LoongArch Options

       These command-line options are defined for LoongArch targets:

       -march=arch-type
	   Generate  instructions for the machine type arch-type.  -march=arch-type allows GCC to generate code that may not
	   run at all on processors other than the one indicated.

	   The choices for arch-type are:

	   native
	       Local processor type detected by the native compiler.

	   loongarch64
	       Generic LoongArch 64-bit processor.

	   la464
	       LoongArch LA464-based processor with LSX, LASX.

	   la664
	       LoongArch LA664-based processor with LSX, LASX and all LoongArch v1.1 instructions.

	   la64v1.0
	       LoongArch64 ISA version 1.0.

	   la64v1.1
	       LoongArch64 ISA version 1.1.

	   More	     information      about	  LoongArch	  ISA	    versions	   can	     be	      found	  at
	   .

       -mtune=tune-type
	   Optimize the generated code for the given processor target.

	   The choices for tune-type are:

	   native
	       Local processor type detected by the native compiler.

	   generic
	       Generic LoongArch processor.

	   loongarch64
	       Generic LoongArch 64-bit processor.

	   la464
	       LoongArch LA464 core.

	   la664
	       LoongArch LA664 core.

       -mabi=base-abi-type
	   Generate code for the specified calling convention.	base-abi-type can be one of:

	   lp64d
	       Uses  64-bit  general  purpose  registers and 32/64-bit floating-point registers for parameter passing.	Data
	       model is LP64, where int is 32 bits, while long int and pointers are 64 bits.

	   lp64f
	       Uses 64-bit general purpose registers and 32-bit floating-point registers for parameter passing.	 Data  model
	       is LP64, where int is 32 bits, while long int and pointers are 64 bits.

	   lp64s
	       Uses  64-bit  general purpose registers and no floating-point registers for parameter passing.  Data model is
	       LP64, where int is 32 bits, while long int and pointers are 64 bits.

       -mfpu=fpu-type
	   Generate code for the specified FPU type, which can be one of:

	   64  Allow the use of hardware floating-point instructions for 32-bit and 64-bit operations.

	   32  Allow the use of hardware floating-point instructions for 32-bit operations.

	   none
	   0   Prevent the use of hardware floating-point instructions.

       -msimd=simd-type
	   Enable generation of LoongArch SIMD instructions for vectorization and via builtin functions.  The value  can  be
	   one of:

	   lasx
	       Enable  generating  instructions	 from  the  256-bit LoongArch Advanced SIMD Extension (LASX) and the 128-bit
	       LoongArch SIMD Extension (LSX).

	   lsx Enable generating instructions from the 128-bit LoongArch SIMD Extension (LSX).

	   none
	       No LoongArch SIMD instruction may be generated.

       -msoft-float
	   Force -mfpu=none and prevents the use of floating-point registers for parameter passing.  This option may  change
	   the target ABI.

       -msingle-float
	   Force  -mfpu=32  and	 allow	the  use  of 32-bit floating-point registers for parameter passing.  This option may
	   change the target ABI.

       -mdouble-float
	   Force -mfpu=64 and allow the use of 32/64-bit floating-point registers for parameter passing.   This	 option	 may
	   change the target ABI.

       -mlasx
       -mno-lasx
       -mlsx
       -mno-lsx
	   Incrementally  adjust  the  scope of the SIMD extensions (none / LSX / LASX) that can be used by the compiler for
	   code generation.  Enabling LASX with mlasx automatically enables LSX, and diabling LSX with mno-lsx automatically
	   disables LASX.  These driver-only options act upon the final	 msimd	configuration  state  and  make	 incremental
	   changes  in	the  order  they  appear  on the GCC driver's command line, deriving the final / canonicalized msimd
	   option that is passed to the compiler proper.

       -mbranch-cost=n
	   Set the cost of branches to roughly n instructions.

       -maddr-reg-reg-cost=n
	   Set the cost of ADDRESS_REG_REG to the value calculated by n.

       -mcheck-zero-division
       -mno-check-zero-divison
	   Trap (do not trap) on integer division by zero.  The	 default  is  -mcheck-zero-division  for  -O0  or  -Og,	 and
	   -mno-check-zero-division for other optimization levels.

       -mcond-move-int
       -mno-cond-move-int
	   Conditional	moves  for  integral  data  in	general-purpose	 registers  are	 enabled (disabled).  The default is
	   -mcond-move-int.

       -mcond-move-float
       -mno-cond-move-float
	   Conditional moves for floating-point registers are enabled (disabled).  The default is -mcond-move-float.

       -mmemcpy
       -mno-memcpy
	   Force (do not force) the use of "memcpy" for non-trivial block moves.  The default is -mno-memcpy,  which  allows
	   GCC to inline most constant-sized copies.  Setting optimization level to -Os also forces the use of "memcpy", but
	   -mno-memcpy	may  override  this  behavior  if explicitly specified, regardless of the order these options on the
	   command line.

       -mstrict-align
       -mno-strict-align
	   Avoid or allow generating memory accesses that may not be aligned on a natural object boundary  as  described  in
	   the architecture specification. The default is -mno-strict-align.

       -G num
	   Put global and static data smaller than num bytes into a small data section.	 The default value is 0.

       -mmax-inline-memcpy-size=n
	   Inline  all	block  moves  (such  as	 calls	to "memcpy" or structure copies) less than or equal to n bytes.	 The
	   default value of n is 1024.

       -mcmodel=code-model
	   Set the code model to one of:

	   tiny-static (Not implemented yet)
	   tiny (Not implemented yet)
	   normal
	       The text segment must be within 128MB addressing space.	The data  segment  must	 be  within  2GB  addressing
	       space.

	   medium
	       The text segment and data segment must be within 2GB addressing space.

	   large (Not implemented yet)
	   extreme
	       This  mode  does	 not  limit  the  size of the code segment and data segment.  The -mcmodel=extreme option is
	       incompatible with -fplt and/or -mexplicit-relocs=none.

	   The default code model is "normal".

       -mexplicit-relocs=style
	   Set when to use assembler relocation operators when dealing with symbolic addresses.	 The alternative is  to	 use
	   assembler   macros	instead,  which	 may  limit  instruction  scheduling  but  allow  linker  relaxation.	with
	   -mexplicit-relocs=none the  assembler  macros  are  always  used,  with  -mexplicit-relocs=always  the  assembler
	   relocation  operators are always used, with -mexplicit-relocs=auto the compiler will use the relocation operators
	   where the linker relaxation is impossible to improve the code quality, and macros elsewhere.	 The  default  value
	   for	the  option  is	 determined  with the assembler capability detected during GCC build-time and the setting of
	   -mrelax:  -mexplicit-relocs=none  if	 the   assembler   does	  not	support	  relocation   operators   at	all,
	   -mexplicit-relocs=always   if   the	 assembler  supports  relocation  operators  but  -mrelax  is  not  enabled,
	   -mexplicit-relocs=auto if the assembler supports relocation operators and -mrelax is enabled.

       -mexplicit-relocs
	   An alias of -mexplicit-relocs=always for backward compatibility.

       -mno-explicit-relocs
	   An alias of -mexplicit-relocs=none for backward compatibility.

       -mdirect-extern-access
       -mno-direct-extern-access
	   Do not use or use GOT to access external symbols.  The default is  -mno-direct-extern-access:  GOT  is  used	 for
	   external symbols with default visibility, but not used for other external symbols.

	   With	 -mdirect-extern-access,  GOT  is not used and all external symbols are PC-relatively addressed.  It is only
	   suitable for environments where no dynamic link is performed, like firmwares, OS kernels, executables linked with
	   -static or -static-pie.  -mdirect-extern-access is not compatible with -fPIC or -fpic.

       -mrelax
       -mno-relax
	   Take (do not take) advantage of linker relaxations.	If -mpass-mrelax-to-as	is  enabled,  this  option  is	also
	   passed  to  the  assembler.	The default is determined during GCC build-time by detecting corresponding assembler
	   support: -mrelax if the assembler supports both the -mrelax option and the conditional  branch  relaxation  (it's
	   required or the ".align" directives and conditional branch instructions in the assembly code outputted by GCC may
	   be rejected by the assembler because of a relocation overflow), -mno-relax otherwise.

       -mpass-mrelax-to-as
       -mno-pass-mrelax-to-as
	   Pass	 (do  not  pass)  the  -mrelax	or -mno-relax option to the assembler.	The default is determined during GCC
	   build-time by detecting corresponding assembler  support:  -mpass-mrelax-to-as  if  the  assembler  supports	 the
	   -mrelax  option, -mno-pass-mrelax-to-as otherwise.  This option is mostly useful for debugging, or interoperation
	   with assemblers different from the build-time one.

       -mrecip
	   This option enables use of the  reciprocal  estimate	 and  reciprocal  square  root	estimate  instructions	with
	   additional  Newton-Raphson  steps  to  increase precision instead of doing a divide or square root and divide for
	   floating-point arguments.  These instructions are generated	only  when  -funsafe-math-optimizations	 is  enabled
	   together  with -ffinite-math-only and -fno-trapping-math.  This option is off by default. Before you can use this
	   option, you must sure the target CPU supports frecipe and frsqrte instructions.  Note that while  the  throughput
	   of  the  sequence  is higher than the throughput of the non-reciprocal instruction, the precision of the sequence
	   can be decreased by up to 2 ulp (i.e. the inverse of 1.0 equals 0.99999994).

       -mrecip=opt
	   This option controls which reciprocal estimate instructions may be  used.   opt  is	a  comma-separated  list  of
	   options, which may be preceded by a ! to invert the option:

	   all Enable all estimate instructions.

	   default
	       Enable the default instructions, equivalent to -mrecip.

	   none
	       Disable all estimate instructions, equivalent to -mno-recip.

	   div Enable the approximation for scalar division.

	   vec-div
	       Enable the approximation for vectorized division.

	   sqrt
	       Enable the approximation for scalar square root.

	   vec-sqrt
	       Enable the approximation for vectorized square root.

	   rsqrt
	       Enable the approximation for scalar reciprocal square root.

	   vec-rsqrt
	       Enable the approximation for vectorized reciprocal square root.

	   So, for example, -mrecip=all,!sqrt enables all of the reciprocal approximations, except for scalar square root.

       -mfrecipe
       -mno-frecipe
	   Use	(do  not use) "frecipe.{s/d}" and "frsqrte.{s/d}" instructions.	 When build with -march=la664, it is enabled
	   by default.	The default is -mno-frecipe.

       -mdiv32
       -mno-div32
	   Use (do not use)  "div.w[u]"	 and  "mod.w[u]"  instructions	with  input  not  sign-extended.   When	 build	with
	   -march=la664, it is enabled by default.  The default is -mno-div32.

       -mlam-bh
       -mno-lam-bh
	   Use (do not use) "am{swap/add}[_db].{b/h}" instructions.  When build with -march=la664, it is enabled by default.
	   The default is -mno-lam-bh.

       -mlamcas
       -mno-lamcas
	   Use	(do  not  use) "amcas[_db].{b/h/w/d}" instructions.  When build with -march=la664, it is enabled by default.
	   The default is -mno-lamcas.

       -mld-seq-sa
       -mno-ld-seq-sa
	   Whether a same-address load-load barrier ("dbar 0x700") is needed.  When build with -march=la664, it	 is  enabled
	   by default.	The default is -mno-ld-seq-sa, the load-load barrier is needed.

       -mtls-dialect=opt
	   This option controls which tls dialect may be used for general dynamic and local dynamic TLS models.

	   trad
	       Use traditional TLS. This is the default.

	   desc
	       Use TLS descriptors.

       -mannotate-tablejump
       -mno-annotate-tablejump
	   Create an annotation section ".discard.tablejump_annotate" to correlate the "jirl" instruction and the jump table
	   when	 a  jump  table is used to optimize the "switch" statement.  Some external tools, for example objtool of the
	   Linux  kernel  building  system,  need  the	annotation  to	analysis  the  control	 flow.	  The	default	  is
	   -mno-annotate-tablejump.

       --param loongarch-vect-unroll-limit=n
	   The	vectorizer  will  use available tuning information to determine whether it would be beneficial to unroll the
	   main vectorized loop and by how much.  This parameter set's the upper bound	of  how	 much  the  vectorizer	will
	   unroll the main loop.  The default value is six.

       M32C Options

       -mcpu=name
	   Select  the	CPU  for which code is generated.  name may be one of r8c for the R8C/Tiny series, m16c for the M16C
	   (up to /60) series, m32cm for the M16C/80 series, or m32c for the M32C/80 series.

       -msim
	   Specifies that the program will be run on the simulator.  This causes an alternate runtime library to  be  linked
	   in which supports, for example, file I/O.  You must not use this option when generating programs that will run on
	   real hardware; you must provide your own runtime library for whatever I/O functions are needed.

       -memregs=number
	   Specifies  the  number  of memory-based pseudo-registers GCC uses during code generation.  These pseudo-registers
	   are used like real registers, so there is a tradeoff between	 GCC's	ability	 to  fit  the  code  into  available
	   registers,  and the performance penalty of using memory instead of registers.  Note that all modules in a program
	   must be compiled with the same value for this option.  Because of that, you must not use this option	 with  GCC's
	   default runtime libraries.

       M32R/D Options

       These -m options are defined for Renesas M32R/D architectures:

       -m32r2
	   Generate code for the M32R/2.

       -m32rx
	   Generate code for the M32R/X.

       -m32r
	   Generate code for the M32R.	This is the default.

       -mmodel=small
	   Assume  all	objects	 live  in  the	lower  16MB of memory (so that their addresses can be loaded with the "ld24"
	   instruction), and assume all subroutines are reachable with the "bl" instruction.  This is the default.

	   The addressability of a particular object can be set with the "model" attribute.

       -mmodel=medium
	   Assume objects may be anywhere in the 32-bit address space (the compiler generates  "seth/add3"  instructions  to
	   load their addresses), and assume all subroutines are reachable with the "bl" instruction.

       -mmodel=large
	   Assume  objects  may	 be anywhere in the 32-bit address space (the compiler generates "seth/add3" instructions to
	   load their addresses), and assume subroutines may not be  reachable	with  the  "bl"	 instruction  (the  compiler
	   generates the much slower "seth/add3/jl" instruction sequence).

       -msdata=none
	   Disable  use	 of  the  small	 data area.  Variables are put into one of ".data", ".bss", or ".rodata" (unless the
	   "section" attribute has been specified).  This is the default.

	   The small data area consists of sections ".sdata" and ".sbss".  Objects may be explicitly put in the	 small	data
	   area with the "section" attribute using one of these sections.

       -msdata=sdata
	   Put small global and static data in the small data area, but do not generate special code to reference them.

       -msdata=use
	   Put small global and static data in the small data area, and generate special instructions to reference them.

       -G num
	   Put	global and static objects less than or equal to num bytes into the small data or BSS sections instead of the
	   normal data or BSS sections.	 The default value of num is 8.	 The -msdata option must be set to one of  sdata  or
	   use for this option to have any effect.

	   All modules should be compiled with the same -G num value.  Compiling with different values of num may or may not
	   work; if it doesn't the linker gives an error message---incorrect code is not generated.

       -mdebug
	   Makes the M32R-specific code in the compiler display some statistics that might help in debugging programs.

       -malign-loops
	   Align all loops to a 32-byte boundary.

       -mno-align-loops
	   Do not enforce a 32-byte alignment for loops.  This is the default.

       -missue-rate=number
	   Issue number instructions per cycle.	 number can only be 1 or 2.

       -mbranch-cost=number
	   number  can	only  be 1 or 2.  If it is 1 then branches are preferred over conditional code, if it is 2, then the
	   opposite applies.

       -mflush-trap=number
	   Specifies the trap number to use to flush the cache.	 The default is 12.  Valid numbers  are	 between  0  and  15
	   inclusive.

       -mno-flush-trap
	   Specifies that the cache cannot be flushed by using a trap.

       -mflush-func=name
	   Specifies the name of the operating system function to call to flush the cache.  The default is _flush_cache, but
	   a function call is only used if a trap is not available.

       -mno-flush-func
	   Indicates that there is no OS function for flushing the cache.

       M680x0 Options

       These  are  the	-m  options  defined  for  M680x0  and	ColdFire  processors.	The default settings depend on which
       architecture was selected when the compiler was configured; the defaults for the most common choices are given below.

       -march=arch
	   Generate code for a specific M680x0 or ColdFire instruction set architecture.  Permissible  values  of  arch	 for
	   M680x0  architectures  are:	68000,	68010,	68020,	68030,	68040,	68060 and cpu32.  ColdFire architectures are
	   selected according to Freescale's ISA classification and the permissible values are:	 isaa,	isaaplus,  isab	 and
	   isac.

	   GCC	defines	 a macro "__mcfarch__" whenever it is generating code for a ColdFire target.  The arch in this macro
	   is one of the -march arguments given above.

	   When used together, -march and -mtune select code that runs on  a  family  of  similar  processors  but  that  is
	   optimized for a particular microarchitecture.

       -mcpu=cpu
	   Generate  code  for	a  specific  M680x0 or ColdFire processor.  The M680x0 cpus are: 68000, 68010, 68020, 68030,
	   68040, 68060, 68302, 68332 and cpu32.  The ColdFire cpus are given by the table below, which also classifies	 the
	   CPUs into families:

	   Family : -mcpu arguments
	   51 : 51 51ac 51ag 51cn 51em 51je 51jf 51jg 51jm 51mm 51qe 51qm
	   5206 : 5202 5204 5206
	   5206e : 5206e
	   5208 : 5207 5208
	   5211a : 5210a 5211a
	   5213 : 5211 5212 5213
	   5216 : 5214 5216
	   52235 : 52230 52231 52232 52233 52234 52235
	   5225 : 5224 5225
	   52259 : 52252 52254 52255 52256 52258 52259
	   5235 : 5232 5233 5234 5235 523x
	   5249 : 5249
	   5250 : 5250
	   5271 : 5270 5271
	   5272 : 5272
	   5275 : 5274 5275
	   5282 : 5280 5281 5282 528x
	   53017 : 53011 53012 53013 53014 53015 53016 53017
	   5307 : 5307
	   5329 : 5327 5328 5329 532x
	   5373 : 5372 5373 537x
	   5407 : 5407
	   5475 : 5470 5471 5472 5473 5474 5475 547x 5480 5481 5482 5483 5484 5485

	   -mcpu=cpu  overrides	 -march=arch  if  arch	is  compatible with cpu.  Other combinations of -mcpu and -march are
	   rejected.

	   GCC	defines	 the  macro  "__mcf_cpu_cpu"  when   ColdFire	target	 cpu   is   selected.	 It   also   defines
	   "__mcf_family_family", where the value of family is given by the table above.

       -mtune=tune
	   Tune	 the  code  for	 a  particular microarchitecture within the constraints set by -march and -mcpu.  The M680x0
	   microarchitectures are: 68000, 68010, 68020, 68030, 68040, 68060 and cpu32.	The ColdFire microarchitectures are:
	   cfv1, cfv2, cfv3, cfv4 and cfv4e.

	   You can also use -mtune=68020-40 for code that needs to run relatively well on 68020, 68030	and  68040  targets.
	   -mtune=68020-60  is	similar	 but  includes	68060  targets	as  well.   These two options select the same tuning
	   decisions as -m68020-40 and -m68020-60 respectively.

	   GCC defines the macros "__mcarch" and "__mcarch__" when tuning for 680x0  architecture  arch.   It  also  defines
	   "mcarch" unless either -ansi or a non-GNU -std option is used.  If GCC is tuning for a range of architectures, as
	   selected by -mtune=68020-40 or -mtune=68020-60, it defines the macros for every architecture in the range.

	   GCC	also  defines the macro "__muarch__" when tuning for ColdFire microarchitecture uarch, where uarch is one of
	   the arguments given above.

       -m68000
       -mc68000
	   Generate output for a 68000.	 This is the default when the compiler is configured for 68000-based systems.  It is
	   equivalent to -march=68000.

	   Use this option for microcontrollers with a 68000 or EC000 core, including the 68008, 68302, 68306, 68307, 68322,
	   68328 and 68356.

       -m68010
	   Generate output for a 68010.	 This is the default when the compiler is configured for 68010-based systems.  It is
	   equivalent to -march=68010.

       -m68020
       -mc68020
	   Generate output for a 68020.	 This is the default when the compiler is configured for 68020-based systems.  It is
	   equivalent to -march=68020.

       -m68030
	   Generate output for a 68030.	 This is the default when the compiler is configured for 68030-based systems.  It is
	   equivalent to -march=68030.

       -m68040
	   Generate output for a 68040.	 This is the default when the compiler is configured for 68040-based systems.  It is
	   equivalent to -march=68040.

	   This option inhibits the use of 68881/68882 instructions that have to be emulated by software on the 68040.	 Use
	   this option if your 68040 does not have code to emulate those instructions.

       -m68060
	   Generate output for a 68060.	 This is the default when the compiler is configured for 68060-based systems.  It is
	   equivalent to -march=68060.

	   This	 option	 inhibits  the use of 68020 and 68881/68882 instructions that have to be emulated by software on the
	   68060.  Use this option if your 68060 does not have code to emulate those instructions.

       -mcpu32
	   Generate output for a CPU32.	 This is the default when the compiler is configured for CPU32-based systems.  It is
	   equivalent to -march=cpu32.

	   Use this option for microcontrollers with a CPU32 or CPU32+ core,  including	 the  68330,  68331,  68332,  68333,
	   68334, 68336, 68340, 68341, 68349 and 68360.

       -m5200
	   Generate  output  for  a  520X  ColdFire CPU.  This is the default when the compiler is configured for 520X-based
	   systems.  It is equivalent to -mcpu=5206, and is now deprecated in favor of that option.

	   Use this option for microcontroller with a 5200 core, including the MCF5202, MCF5203, MCF5204 and MCF5206.

       -m5206e
	   Generate output for a 5206e ColdFire CPU.  The option is now deprecated in favor of the equivalent -mcpu=5206e.

       -m528x
	   Generate output for a member of the ColdFire 528X  family.	The  option  is	 now  deprecated  in  favor  of	 the
	   equivalent -mcpu=528x.

       -m5307
	   Generate output for a ColdFire 5307 CPU.  The option is now deprecated in favor of the equivalent -mcpu=5307.

       -m5407
	   Generate output for a ColdFire 5407 CPU.  The option is now deprecated in favor of the equivalent -mcpu=5407.

       -mcfv4e
	   Generate  output  for  a  ColdFire V4e family CPU (e.g. 547x/548x).	This includes use of hardware floating-point
	   instructions.  The option is equivalent to -mcpu=547x, and is now deprecated in favor of that option.

       -m68020-40
	   Generate output for a 68040, without using any of the new instructions.   This  results  in	code  that  can	 run
	   relatively  efficiently  on	either	a  68020/68881 or a 68030 or a 68040.  The generated code does use the 68881
	   instructions that are emulated on the 68040.

	   The option is equivalent to -march=68020 -mtune=68020-40.

       -m68020-60
	   Generate output for a 68060, without using any of the new instructions.   This  results  in	code  that  can	 run
	   relatively  efficiently  on	either	a  68020/68881 or a 68030 or a 68040.  The generated code does use the 68881
	   instructions that are emulated on the 68060.

	   The option is equivalent to -march=68020 -mtune=68020-60.

       -mhard-float
       -m68881
	   Generate floating-point instructions.  This is the default for 68020 and above, and	for  ColdFire  devices	that
	   have an FPU.	 It defines the macro "__HAVE_68881__" on M680x0 targets and "__mcffpu__" on ColdFire targets.

       -msoft-float
	   Do  not  generate  floating-point instructions; use library calls instead.  This is the default for 68000, 68010,
	   and 68832 targets.  It is also the default for ColdFire devices that have no FPU.

       -mdiv
       -mno-div
	   Generate (do not generate) ColdFire hardware divide and remainder instructions.  If -march is used without -mcpu,
	   the default is "on" for ColdFire architectures and "off" for M680x0 architectures.	Otherwise,  the	 default  is
	   taken  from	the target CPU (either the default CPU, or the one specified by -mcpu).	 For example, the default is
	   "off" for -mcpu=5206 and "on" for -mcpu=5206e.

	   GCC defines the macro "__mcfhwdiv__" when this option is enabled.

       -mshort
	   Consider type "int" to be 16 bits wide, like "short int".  Additionally, parameters passed on the stack are	also
	   aligned to a 16-bit boundary even on targets whose API mandates promotion to 32-bit.

       -mno-short
	   Do not consider type "int" to be 16 bits wide.  This is the default.

       -mnobitfield
       -mno-bitfield
	   Do not use the bit-field instructions.  The -m68000, -mcpu32 and -m5200 options imply -mnobitfield.

       -mbitfield
	   Do  use  the	 bit-field  instructions.   The -m68020 option implies -mbitfield.  This is the default if you use a
	   configuration designed for a 68020.

       -mrtd
	   Use a different function-calling convention, in which functions that take a fixed number of arguments return with
	   the "rtd" instruction, which pops their arguments while returning.  This saves  one	instruction  in	 the  caller
	   since there is no need to pop the arguments there.

	   This	 calling  convention is incompatible with the one normally used on Unix, so you cannot use it if you need to
	   call libraries compiled with the Unix compiler.

	   Also, you must provide function prototypes for all functions that take variable numbers of  arguments  (including
	   "printf"); otherwise incorrect code is generated for calls to those functions.

	   In  addition,  seriously incorrect code results if you call a function with too many arguments.  (Normally, extra
	   arguments are harmlessly ignored.)

	   The "rtd" instruction is supported by the 68010, 68020, 68030, 68040, 68060 and CPU32 processors, but not by	 the
	   68000 or 5200.

	   The default is -mno-rtd.

       -malign-int
       -mno-align-int
	   Control whether GCC aligns "int", "long", "long long", "float", "double", and "long double" variables on a 32-bit
	   boundary  (-malign-int)  or a 16-bit boundary (-mno-align-int).  Aligning variables on 32-bit boundaries produces
	   code that runs somewhat faster on processors with 32-bit busses at the expense of more memory.

	   Warning: if you use the -malign-int switch, GCC aligns structures containing the  above  types  differently	than
	   most published application binary interface specifications for the m68k.

	   Use	the  pc-relative addressing mode of the 68000 directly, instead of using a global offset table.	 At present,
	   this option implies -fpic, allowing at most a 16-bit offset for pc-relative addressing.  -fPIC is  not  presently
	   supported with -mpcrel, though this could be supported for 68020 and higher processors.

       -mno-strict-align
       -mstrict-align
	   Do not (do) assume that unaligned memory references are handled by the system.

       -msep-data
	   Generate  code  that	 allows	 the data segment to be located in a different area of memory from the text segment.
	   This allows for execute-in-place in an environment without virtual memory management.  This option implies -fPIC.

       -mno-sep-data
	   Generate code that assumes that the data segment follows the text segment.  This is the default.

       -mid-shared-library
	   Generate code that supports shared libraries via the library ID method.  This  allows  for  execute-in-place	 and
	   shared libraries in an environment without virtual memory management.  This option implies -fPIC.

       -mno-id-shared-library
	   Generate code that doesn't assume ID-based shared libraries are being used.	This is the default.

       -mshared-library-id=n
	   Specifies  the  identification  number  of  the  ID-based shared library being compiled.  Specifying a value of 0
	   generates more compact code; specifying other values forces the allocation of that number to the current library,
	   but is no more space- or time-efficient than omitting this option.

       -mxgot
       -mno-xgot
	   When generating position-independent code for ColdFire, generate code that works if the GOT has  more  than	8192
	   entries.   This  code  is  larger and slower than code generated without this option.  On M680x0 processors, this
	   option is not needed; -fPIC suffices.

	   GCC normally uses a single instruction to load values from the GOT.	While this is relatively efficient, it	only
	   works if the GOT is smaller than about 64k.	Anything larger causes the linker to report an error such as:

		   relocation truncated to fit: R_68K_GOT16O foobar

	   If this happens, you should recompile your code with -mxgot.	 It should then work with very large GOTs.  However,
	   code	 generated  with  -mxgot  is  less  efficient,	since it takes 4 instructions to fetch the value of a global
	   symbol.

	   Note that some linkers, including newer versions of the GNU	linker,	 can  create  multiple	GOTs  and  sort	 GOT
	   entries.   If you have such a linker, you should only need to use -mxgot when compiling a single object file that
	   accesses more than 8192 GOT entries.	 Very few do.

	   These options have no effect unless GCC is generating position-independent code.

       -mlong-jump-table-offsets
	   Use 32-bit offsets in "switch" tables.  The default is to use 16-bit offsets.

       MCore Options

       These are the -m options defined for the Motorola M*Core processors.

       -mhardlit
       -mno-hardlit
	   Inline constants into the code stream if it can be done in two instructions or less.

       -mdiv
       -mno-div
	   Use the divide instruction.	(Enabled by default).

       -mrelax-immediate
       -mno-relax-immediate
	   Allow arbitrary-sized immediates in bit operations.

       -mwide-bitfields
       -mno-wide-bitfields
	   Always treat bit-fields as "int"-sized.

       -m4byte-functions
       -mno-4byte-functions
	   Force all functions to be aligned to a 4-byte boundary.

       -mcallgraph-data
       -mno-callgraph-data
	   Emit callgraph information.

       -mslow-bytes
       -mno-slow-bytes
	   Prefer word access when reading byte quantities.

       -mlittle-endian
       -mbig-endian
	   Generate code for a little-endian target.

       -m210
       -m340
	   Generate code for the 210 processor.

       -mno-lsim
	   Assume that runtime support has been provided and so omit  the  simulator  library  (libsim.a)  from	 the  linker
	   command line.

       -mstack-increment=size
	   Set	the  maximum amount for a single stack increment operation.  Large values can increase the speed of programs
	   that contain functions that need a large amount of stack space, but they can also trigger a segmentation fault if
	   the stack is extended too much.  The default value is 0x1000.

       MicroBlaze Options

       -msoft-float
	   Use software emulation for floating point (default).

       -mhard-float
	   Use hardware floating-point instructions.

       -mmemcpy
	   Do not optimize block moves, use "memcpy".

       -mno-clearbss
	   This option is deprecated.  Use -fno-zero-initialized-in-bss instead.

       -mcpu=cpu-type
	   Use features of, and schedule code for, the given CPU.  Supported values are in the format vX.YY.Z, where X is  a
	   major  version,  YY	is  the	 minor	version,  and Z is compatibility code.	Example values are v3.00.a, v4.00.b,
	   v5.00.a, v5.00.b, v6.00.a.

       -mxl-soft-mul
	   Use software multiply emulation (default).

       -mxl-soft-div
	   Use software emulation for divides (default).

       -mxl-barrel-shift
	   Use the hardware barrel shifter.

       -mxl-pattern-compare
	   Use pattern compare instructions.

       -msmall-divides
	   Use table lookup optimization for small signed integer divisions.

       -mxl-stack-check
	   This option is deprecated.  Use -fstack-check instead.

       -mxl-gp-opt
	   Use GP-relative ".sdata"/".sbss" sections.

       -mxl-multiply-high
	   Use multiply high instructions for high part of 32x32 multiply.

       -mxl-float-convert
	   Use hardware floating-point conversion instructions.

       -mxl-float-sqrt
	   Use hardware floating-point square root instruction.

       -mbig-endian
	   Generate code for a big-endian target.

       -mlittle-endian
	   Generate code for a little-endian target.

       -mxl-reorder
	   Use reorder instructions (swap and byte reversed load/store).

       -mxl-mode-app-model
	   Select application model app-model.	Valid models are

	   executable
	       normal executable (default), uses startup code crt0.o.

	   xmdstub
	       for use with Xilinx Microprocessor Debugger (XMD) based software intrusive debug agent called  xmdstub.	This
	       uses startup file crt1.o and sets the start address of the program to 0x800.

	   bootstrap
	       for  applications  that	are  loaded  using a bootloader.  This model uses startup file crt2.o which does not
	       contain a processor reset vector handler. This is suitable for transferring control on a processor  reset  to
	       the bootloader rather than the application.

	   novectors
	       for  applications  that	do  not	 require  any  of  the	MicroBlaze  vectors.  This  option may be useful for
	       applications running within a monitoring application. This model uses crt3.o as a startup file.

	   Option -xl-mode-app-model is a deprecated alias for -mxl-mode-app-model.

       -mpic-data-is-text-relative
	   Assume that the displacement between the text and data segments is fixed at static link time.  This	allows	data
	   to  be  referenced  by  offset  from	 start	of  text  address instead of GOT since PC-relative addressing is not
	   supported.

       MIPS Options

       -EB Generate big-endian code.

       -EL Generate little-endian code.	 This is the default for mips*el-*-* configurations.

       -march=arch
	   Generate code that runs on arch, which can be the name of a generic	MIPS  ISA,  or	the  name  of  a  particular
	   processor.	The  ISA  names	 are:  mips1,  mips2,  mips3, mips4, mips32, mips32r2, mips32r3, mips32r5, mips32r6,
	   mips64, mips64r2, mips64r3, mips64r5 and mips64r6.  The processor names are: 4kc, 4km,  4kp,	 4ksc,	4kec,  4kem,
	   4kep,  4ksd,	 5kc,  5kf,  20kc,  24kc, 24kf2_1, 24kf1_1, 24kec, 24kef2_1, 24kef1_1, 34kc, 34kf2_1, 34kf1_1, 34kn,
	   74kc, 74kf2_1, 74kf1_1, 74kf3_2, 1004kc, 1004kf2_1, 1004kf1_1, i6400, i6500, interaptiv, loongson2e,	 loongson2f,
	   loongson3a,	gs464,	gs464e,	 gs264e,  m4k,	m14k,  m14kc, m14ke, m14kec, m5100, m5101, octeon, octeon+, octeon2,
	   octeon3, orion, p5600, p6600, r2000, r3000, r3900, r4000,  r4400,  r4600,  r4650,  r4700,  r5900,  r6000,  r8000,
	   rm7000,  rm9000,  r10000,  r12000,  r14000, r16000, sb1, sr71000, vr4100, vr4111, vr4120, vr4130, vr4300, vr5000,
	   vr5400, vr5500, xlr and xlp.	 The special value  from-abi  selects  the  most  compatible  architecture  for	 the
	   selected ABI (that is, mips1 for 32-bit ABIs and mips3 for 64-bit ABIs).

	   The native Linux/GNU toolchain also supports the value native, which selects the best architecture option for the
	   host processor.  -march=native has no effect if GCC does not recognize the processor.

	   In processor names, a final 000 can be abbreviated as k (for example, -march=r2k).  Prefixes are optional, and vr
	   may be written r.

	   Names  of  the  form	 nf2_1 refer to processors with FPUs clocked at half the rate of the core, names of the form
	   nf1_1 refer to processors with FPUs clocked at the same rate as the core, and names of the form  nf3_2  refer  to
	   processors  with FPUs clocked a ratio of 3:2 with respect to the core.  For compatibility reasons, nf is accepted
	   as a synonym for nf2_1 while nx and bfx are accepted as synonyms for nf1_1.

	   GCC defines two macros based on the value of this option.  The first is "_MIPS_ARCH", which	gives  the  name  of
	   target  architecture,  as a string.	The second has the form "_MIPS_ARCH_foo", where foo is the capitalized value
	   of  "_MIPS_ARCH".   For  example,  -march=r2000  sets   "_MIPS_ARCH"	  to   "r2000"	 and   defines	 the   macro
	   "_MIPS_ARCH_R2000".

	   Note	 that  the  "_MIPS_ARCH" macro uses the processor names given above.  In other words, it has the full prefix
	   and does not abbreviate 000 as k.  In the case of from-abi, the macro names	the  resolved  architecture  (either
	   "mips1" or "mips3").	 It names the default architecture when no -march option is given.

       -mtune=arch
	   Optimize  for  arch.	  Among	 other	things,	 this  option  controls	 the way instructions are scheduled, and the
	   perceived cost of arithmetic operations.  The list of arch values is the same as for -march.

	   When this option is not used, GCC optimizes for the processor specified by -march.  By using	 -march	 and  -mtune
	   together,  it  is  possible	to  generate code that runs on a family of processors, but optimize the code for one
	   particular member of that family.

	   -mtune defines the macros "_MIPS_TUNE" and "_MIPS_TUNE_foo", which work in  the  same  way  as  the	-march	ones
	   described above.

       -mips1
	   Equivalent to -march=mips1.

       -mips2
	   Equivalent to -march=mips2.

       -mips3
	   Equivalent to -march=mips3.

       -mips4
	   Equivalent to -march=mips4.

       -mips32
	   Equivalent to -march=mips32.

       -mips32r3
	   Equivalent to -march=mips32r3.

       -mips32r5
	   Equivalent to -march=mips32r5.

       -mips32r6
	   Equivalent to -march=mips32r6.

       -mips64
	   Equivalent to -march=mips64.

       -mips64r2
	   Equivalent to -march=mips64r2.

       -mips64r3
	   Equivalent to -march=mips64r3.

       -mips64r5
	   Equivalent to -march=mips64r5.

       -mips64r6
	   Equivalent to -march=mips64r6.

       -mips16
       -mno-mips16
	   Generate (do not generate) MIPS16 code.  If GCC is targeting a MIPS32 or MIPS64 architecture, it makes use of the
	   MIPS16e ASE.

	   MIPS16  code	 generation  can  also	be  controlled	on  a per-function basis by means of "mips16" and "nomips16"
	   attributes.

       -mmips16e2
       -mno-mips16e2
	   Use (do not use) the MIPS16e2 ASE.  This option modifies the behavior of the -mips16 option such that it  targets
	   the MIPS16e2 ASE.

       -mflip-mips16
	   Generate  MIPS16  code  on  alternating  functions.	 This  option  is  provided  for regression testing of mixed
	   MIPS16/non-MIPS16 code generation, and is not intended for ordinary use in compiling user code.

       -minterlink-compressed
       -mno-interlink-compressed
	   Require (do not require) that code using the standard (uncompressed) MIPS ISA be link-compatible with MIPS16	 and
	   microMIPS code, and vice versa.

	   For	example,  code	using  the  standard  ISA encoding cannot jump directly to MIPS16 or microMIPS code; it must
	   either use a call or an indirect jump.  -minterlink-compressed therefore disables direct jumps unless  GCC  knows
	   that the target of the jump is not compressed.

       -minterlink-mips16
       -mno-interlink-mips16
	   Aliases of -minterlink-compressed and -mno-interlink-compressed.  These options predate the microMIPS ASE and are
	   retained for backwards compatibility.

       -mabi=32
       -mabi=o64
       -mabi=n32
       -mabi=64
       -mabi=eabi
	   Generate code for the given ABI.

	   Note	 that  the  EABI  has  a  32-bit and a 64-bit variant.	GCC normally generates 64-bit code when you select a
	   64-bit architecture, but you can use -mgp32 to get 32-bit code instead.

	   For information about the O64 ABI, see .

	   GCC supports a variant of the o32 ABI in which floating-point registers are 64 rather than 32 bits wide.  You can
	   select this combination with -mabi=32 -mfp64.  This ABI relies on the "mthc1" and  "mfhc1"  instructions  and  is
	   therefore only supported for MIPS32R2, MIPS32R3 and MIPS32R5 processors.

	   The	register  assignments  for arguments and return values remain the same, but each scalar value is passed in a
	   single 64-bit register rather than a pair of 32-bit registers.  For example,	 scalar	 floating-point	 values	 are
	   returned  in	 $f0  only,  not  a $f0/$f1 pair.  The set of call-saved registers also remains the same in that the
	   even-numbered double-precision registers are saved.

	   Two additional variants of the o32 ABI are supported to enable a transition	from  32-bit  to  64-bit  registers.
	   These  are  FPXX  (-mfpxx)  and  FP64A  (-mfp64  -mno-odd-spreg).  The FPXX extension mandates that all code must
	   execute correctly when run using 32-bit or 64-bit registers.	 The code can be interlinked  with  either  FP32  or
	   FP64,  but  not  both.   The FP64A extension is similar to the FP64 extension but forbids the use of odd-numbered
	   single-precision registers.	This can be used in conjunction with the "FRE" mode of FPUs in	MIPS32R5  processors
	   and allows both FP32 and FP64A code to interlink and run in the same process without changing FPU modes.

       -mabicalls
       -mno-abicalls
	   Generate  (do  not generate) code that is suitable for SVR4-style dynamic objects.  -mabicalls is the default for
	   SVR4-based systems.

       -mshared
       -mno-shared
	   Generate (do not generate) code that is fully position-independent, and that can therefore be linked into  shared
	   libraries.  This option only affects -mabicalls.

	   All	-mabicalls  code  has  traditionally  been position-independent, regardless of options like -fPIC and -fpic.
	   However, as an extension, the GNU toolchain allows executables  to  use  absolute  accesses	for  locally-binding
	   symbols.   It  can  also  use  shorter  GP  initialization sequences and generate direct calls to locally-defined
	   functions.  This mode is selected by -mno-shared.

	   -mno-shared depends on binutils 2.16 or higher and generates objects that can only be linked by the	GNU  linker.
	   However,  the  option  does	not  affect  the ABI of the final executable; it only affects the ABI of relocatable
	   objects.  Using -mno-shared generally makes executables both smaller and quicker.

	   -mshared is the default.

       -mplt
       -mno-plt
	   Assume (do not assume) that the static and dynamic linkers support PLTs and copy relocations.  This	option	only
	   affects -mno-shared -mabicalls.  For the n64 ABI, this option has no effect without -msym32.

	   You can make -mplt the default by configuring GCC with --with-mips-plt.  The default is -mno-plt otherwise.

       -mxgot
       -mno-xgot
	   Lift (do not lift) the usual restrictions on the size of the global offset table.

	   GCC	normally uses a single instruction to load values from the GOT.	 While this is relatively efficient, it only
	   works if the GOT is smaller than about 64k.	Anything larger causes the linker to report an error such as:

		   relocation truncated to fit: R_MIPS_GOT16 foobar

	   If this happens, you should recompile your code with -mxgot.	 This works with very large GOTs, although the	code
	   is also less efficient, since it takes three instructions to fetch the value of a global symbol.

	   Note	 that  some linkers can create multiple GOTs.  If you have such a linker, you should only need to use -mxgot
	   when a single object file accesses more than 64k's worth of GOT entries.  Very few do.

	   These options have no effect unless GCC is generating position independent code.

       -mgp32
	   Assume that general-purpose registers are 32 bits wide.

       -mgp64
	   Assume that general-purpose registers are 64 bits wide.

       -mfp32
	   Assume that floating-point registers are 32 bits wide.

       -mfp64
	   Assume that floating-point registers are 64 bits wide.

       -mfpxx
	   Do not assume the width of floating-point registers.

       -mhard-float
	   Use floating-point coprocessor instructions.

       -msoft-float
	   Do not use floating-point coprocessor instructions.	Implement floating-point calculations  using  library  calls
	   instead.

       -mno-float
	   Equivalent  to  -msoft-float,  but  additionally  asserts  that  the	 program being compiled does not perform any
	   floating-point operations.  This option is presently supported only by some bare-metal MIPS configurations, where
	   it may select a special set of libraries that lack  all  floating-point  support  (including,  for  example,	 the
	   floating-point  "printf"  formats).	 If  code  compiled  with  -mno-float  accidentally  contains floating-point
	   operations, it is likely to suffer a link-time or run-time failure.

       -msingle-float
	   Assume that the floating-point coprocessor only supports single-precision operations.

       -mdouble-float
	   Assume that the floating-point coprocessor supports double-precision operations.  This is the default.

       -modd-spreg
       -mno-odd-spreg
	   Enable the use of odd-numbered single-precision floating-point registers for the o32 ABI.  This  is	the  default
	   for	processors that are known to support these registers.  When using the o32 FPXX ABI, -mno-odd-spreg is set by
	   default.

       -mabs=2008
       -mabs=legacy
	   These options control the treatment of the special not-a-number (NaN)  IEEE	754  floating-point  data  with	 the
	   "abs.fmt" and "neg.fmt" machine instructions.

	   By  default	or  when -mabs=legacy is used the legacy treatment is selected.	 In this case these instructions are
	   considered arithmetic and avoided where correct operation is required and the input operand might be	 a  NaN.   A
	   longer  sequence  of	 instructions  that manipulate the sign bit of floating-point datum manually is used instead
	   unless the -ffinite-math-only option has also been specified.

	   The -mabs=2008 option selects the IEEE 754-2008 treatment.  In this case these instructions are  considered	non-
	   arithmetic  and  therefore operating correctly in all cases, including in particular where the input operand is a
	   NaN.	 These instructions are therefore always used for the respective operations.

       -mnan=2008
       -mnan=legacy
	   These options control the encoding of the special not-a-number (NaN) IEEE 754 floating-point data.

	   The -mnan=legacy option selects the legacy encoding.	 In this case quiet NaNs (qNaNs) are denoted  by  the  first
	   bit	of  their trailing significand field being 0, whereas signaling NaNs (sNaNs) are denoted by the first bit of
	   their trailing significand field being 1.

	   The -mnan=2008 option selects the IEEE 754-2008 encoding.  In this case qNaNs are denoted by	 the  first  bit  of
	   their  trailing  significand	 field	being  1,  whereas  sNaNs  are	denoted	 by  the first bit of their trailing
	   significand field being 0.

	   The default is -mnan=legacy unless GCC has been configured with --with-nan=2008.

       -mllsc
       -mno-llsc
	   Use (do not use) ll, sc, and sync instructions to implement	atomic	memory	built-in  functions.   When  neither
	   option is specified, GCC uses the instructions if the target architecture supports them.

	   -mllsc  is  useful  if  the	runtime	 environment  can  emulate the instructions and -mno-llsc can be useful when
	   compiling for nonstandard ISAs.  You can make either option the default by configuring GCC with  --with-llsc	 and
	   --without-llsc  respectively.   --with-llsc	is  the	 default  for  some  configurations;  see  the	installation
	   documentation for details.

       -mdsp
       -mno-dsp
	   Use (do not use) revision 1 of the MIPS DSP ASE.
	     This option defines the preprocessor macro "__mips_dsp".  It also defines "__mips_dsp_rev" to 1.

       -mdspr2
       -mno-dspr2
	   Use (do not use) revision 2 of the MIPS DSP ASE.
	     This option defines the preprocessor macros "__mips_dsp" and "__mips_dspr2".  It also defines  "__mips_dsp_rev"
	   to 2.

       -msmartmips
       -mno-smartmips
	   Use (do not use) the MIPS SmartMIPS ASE.

       -mpaired-single
       -mno-paired-single
	   Use (do not use) paired-single floating-point instructions.
	     This option requires hardware floating-point support to be enabled.

       -mdmx
       -mno-mdmx
	   Use	(do not use) MIPS Digital Media Extension instructions.	 This option can only be used when generating 64-bit
	   code and requires hardware floating-point support to be enabled.

       -mips3d
       -mno-mips3d
	   Use (do not use) the MIPS-3D ASE.  The option -mips3d implies -mpaired-single.

       -mmicromips
       -mno-micromips
	   Generate (do not generate) microMIPS code.

	   MicroMIPS code generation  can  also	 be  controlled	 on  a	per-function  basis  by	 means	of  "micromips"	 and
	   "nomicromips" attributes.

       -mmt
       -mno-mt
	   Use (do not use) MT Multithreading instructions.

       -mmcu
       -mno-mcu
	   Use (do not use) the MIPS MCU ASE instructions.

       -meva
       -mno-eva
	   Use (do not use) the MIPS Enhanced Virtual Addressing instructions.

       -mvirt
       -mno-virt
	   Use (do not use) the MIPS Virtualization (VZ) instructions.

       -mxpa
       -mno-xpa
	   Use (do not use) the MIPS eXtended Physical Address (XPA) instructions.

       -mcrc
       -mno-crc
	   Use (do not use) the MIPS Cyclic Redundancy Check (CRC) instructions.

       -mginv
       -mno-ginv
	   Use (do not use) the MIPS Global INValidate (GINV) instructions.

       -mloongson-mmi
       -mno-loongson-mmi
	   Use (do not use) the MIPS Loongson MultiMedia extensions Instructions (MMI).

       -mloongson-ext
       -mno-loongson-ext
	   Use (do not use) the MIPS Loongson EXTensions (EXT) instructions.

       -mloongson-ext2
       -mno-loongson-ext2
	   Use (do not use) the MIPS Loongson EXTensions r2 (EXT2) instructions.

       -mlong64
	   Force  "long"  types	 to  be	 64  bits wide.	 See -mlong32 for an explanation of the default and the way that the
	   pointer size is determined.

       -mlong32
	   Force "long", "int", and pointer types to be 32 bits wide.

	   The default size of "int"s, "long"s and pointers depends on the ABI.	 All the supported ABIs use  32-bit  "int"s.
	   The	n64  ABI uses 64-bit "long"s, as does the 64-bit EABI; the others use 32-bit "long"s.  Pointers are the same
	   size as "long"s, or the same size as integer registers, whichever is smaller.

       -msym32
       -mno-sym32
	   Assume (do not assume) that all symbols have 32-bit values, regardless of  the  selected  ABI.   This  option  is
	   useful  in  combination  with  -mabi=64  and	 -mno-abicalls	because it allows GCC to generate shorter and faster
	   references to symbolic addresses.

       -G num
	   Put definitions of externally-visible data in a small data section if that data is no bigger than num bytes.	 GCC
	   can then generate more efficient accesses to the data; see -mgpopt for details.

	   The default -G option depends on the configuration.

       -mlocal-sdata
       -mno-local-sdata
	   Extend (do not extend) the -G behavior to local data too, such as to static variables in C.	-mlocal-sdata is the
	   default for all configurations.

	   If the linker complains that an application is using too much small data, you might want to	try  rebuilding	 the
	   less	 performance-critical  parts  with  -mno-local-sdata.	You  might  also  want to build large libraries with
	   -mno-local-sdata, so that the libraries leave more room for the main program.

       -mextern-sdata
       -mno-extern-sdata
	   Assume (do not assume) that externally-defined data is in a small data section if the size of that data is within
	   the -G limit.  -mextern-sdata is the default for all configurations.

	   If you compile a module Mod with -mextern-sdata -G num -mgpopt, and Mod references a	 variable  Var	that  is  no
	   bigger  than	 num  bytes,  you  must	 make sure that Var is placed in a small data section.	If Var is defined by
	   another module, you must either compile that module with a high-enough -G setting or attach a "section" attribute
	   to Var's definition.	 If Var is common, you must link the application with a high-enough -G setting.

	   The easiest way of satisfying these restrictions is to compile and link every module with  the  same	 -G  option.
	   However,  you  may wish to build a library that supports several different small data limits.  You can do this by
	   compiling the library with the highest supported -G setting and additionally using -mno-extern-sdata to stop	 the
	   library from making assumptions about externally-defined data.

       -mgpopt
       -mno-gpopt
	   Use	(do  not  use)	GP-relative  accesses  for  symbols  that  are	known to be in a small data section; see -G,
	   -mlocal-sdata and -mextern-sdata.  -mgpopt is the default for all configurations.

	   -mno-gpopt is useful for cases where the $gp register might not hold the value of "_gp".   For  example,  if	 the
	   code	 is part of a library that might be used in a boot monitor, programs that call boot monitor routines pass an
	   unknown value in $gp.  (In such situations, the boot monitor itself is usually compiled with -G0.)

	   -mno-gpopt implies -mno-local-sdata and -mno-extern-sdata.

       -membedded-data
       -mno-embedded-data
	   Allocate variables to the read-only data section first if possible, then  next  in  the  small  data	 section  if
	   possible,  otherwise	 in  data.   This gives slightly slower code than the default, but reduces the amount of RAM
	   required when executing, and thus may be preferred for some embedded systems.

       -muninit-const-in-rodata
       -mno-uninit-const-in-rodata
	   Put uninitialized "const" variables in the read-only data section.  This option is only meaningful in conjunction
	   with -membedded-data.

       -mcode-readable=setting
	   Specify whether GCC may generate code that reads from executable sections.  There are three possible settings:

	   -mcode-readable=yes
	       Instructions may freely access executable sections.  This is the default setting.

	   -mcode-readable=pcrel
	       MIPS16 PC-relative load instructions can access executable sections, but other instructions must not  do	 so.
	       This  option  is	 useful on 4KSc and 4KSd processors when the code TLBs have the Read Inhibit bit set.  It is
	       also useful on processors that can be configured to have a dual instruction/data	 SRAM  interface  and  that,
	       like the M4K, automatically redirect PC-relative loads to the instruction RAM.

	   -mcode-readable=no
	       Instructions  must  not access executable sections.  This option can be useful on targets that are configured
	       to have a dual instruction/data SRAM interface but that (unlike the M4K) do not	automatically  redirect	 PC-
	       relative loads to the instruction RAM.

       -msplit-addresses
       -mno-split-addresses
	   Enable  (disable)  use of the %hi() and %lo() assembler relocation operators.  This option has been superseded by
	   -mexplicit-relocs but is retained for backwards compatibility.

       -mexplicit-relocs=none
       -mexplicit-relocs=base
       -mexplicit-relocs=pcrel
       -mexplicit-relocs
       -mno-explicit-relocs
	   These options control whether explicit relocs (such as %gp_rel) are used.   The  default  value  depends  on	 the
	   version of GAS when GCC itself was built.

	   The	"base"	explicit-relocs	 support  was  introduced into GAS in 2001.  The "pcrel" explicit-relocs support was
	   introduced into GAS in 2014, which supports %pcrel_hi and %pcrel_lo.

       -mcheck-zero-division
       -mno-check-zero-division
	   Trap (do not trap) on integer division by zero.

	   The default is -mcheck-zero-division.

       -mdivide-traps
       -mdivide-breaks
	   MIPS systems check for division by zero by generating either a conditional trap or a	 break	instruction.   Using
	   traps  results  in  smaller	code,  but is only supported on MIPS II and later.  Also, some versions of the Linux
	   kernel have a bug that prevents trap from generating the proper signal ("SIGFPE").  Use -mdivide-traps  to  allow
	   conditional traps on architectures that support them and -mdivide-breaks to force the use of breaks.

	   The	default	 is usually -mdivide-traps, but this can be overridden at configure time using --with-divide=breaks.
	   Divide-by-zero checks can be completely disabled using -mno-check-zero-division.

       -mload-store-pairs
       -mno-load-store-pairs
	   Enable (disable) an optimization that pairs consecutive load or store instructions to enable load/store  bonding.
	   This	 option	 is  enabled  by  default  but	only takes effect when the selected architecture is known to support
	   bonding.

       -mstrict-align
       -mno-strict-align
       -munaligned-access
       -mno-unaligned-access
	   Disable (enable) direct unaligned access  for  MIPS	Release	 6.   MIPSr6  requires	load/store  unaligned-access
	   support, by hardware or trap&emulate.  So -mstrict-align may be needed by kernel.  The options -munaligned-access
	   and -mno-unaligned-access are obsoleted, and only for backward-compatible.

       -mmemcpy
       -mno-memcpy
	   Force  (do  not force) the use of "memcpy" for non-trivial block moves.  The default is -mno-memcpy, which allows
	   GCC to inline most constant-sized copies.

       -mlong-calls
       -mno-long-calls
	   Disable (do not disable) use of the "jal" instruction.  Calling functions  using  "jal"  is	more  efficient	 but
	   requires the caller and callee to be in the same 256 megabyte segment.

	   This option has no effect on abicalls code.	The default is -mno-long-calls.

       -mmad
       -mno-mad
	   Enable (disable) use of the "mad", "madu" and "mul" instructions, as provided by the R4650 ISA.

       -mimadd
       -mno-imadd
	   Enable (disable) use of the "madd" and "msub" integer instructions.	The default is -mimadd on architectures that
	   support "madd" and "msub" except for the 74k architecture where it was found to generate slower code.

       -mfused-madd
       -mno-fused-madd
	   Enable  (disable)  use  of  the  floating-point  multiply-accumulate	 instructions, when they are available.	 The
	   default is -mfused-madd.

	   On the R8000 CPU when multiply-accumulate instructions are  used,  the  intermediate	 product  is  calculated  to
	   infinite  precision	and  is	 not  subject  to  the	FCSR  Flush  to	 Zero  bit.  This may be undesirable in some
	   circumstances.  On other processors the result is numerically  identical  to	 the  equivalent  computation  using
	   separate multiply, add, subtract and negate instructions.

       -nocpp
	   Tell	 the MIPS assembler to not run its preprocessor over user assembler files (with a .s suffix) when assembling
	   them.

       -mfix-24k
       -mno-fix-24k
	   Work around the 24K E48 (lost data on stores during refill) errata.	 The  workarounds  are	implemented  by	 the
	   assembler rather than by GCC.

       -mfix-r4000
       -mno-fix-r4000
	   Work around certain R4000 CPU errata:

	   -   A  double-word  or  a  variable	shift may give an incorrect result if executed immediately after starting an
	       integer division.

	   -   A double-word or a variable shift may give an incorrect result if executed while an integer multiplication is
	       in progress.

	   -   An integer division may give an incorrect result if started in a delay slot of a taken branch or a jump.

       -mfix-r4400
       -mno-fix-r4400
	   Work around certain R4400 CPU errata:

	   -   A double-word or a variable shift may give an incorrect result if  executed  immediately	 after	starting  an
	       integer division.

       -mfix-r10000
       -mno-fix-r10000
	   Work around certain R10000 errata:

	   -   "ll"/"sc"  sequences may not behave atomically on revisions prior to 3.0.  They may deadlock on revisions 2.6
	       and earlier.

	   This option can only be used if the target architecture supports branch-likely instructions.	 -mfix-r10000 is the
	   default when -march=r10000 is used; -mno-fix-r10000 is the default otherwise.

       -mfix-r5900
       -mno-fix-r5900
	   Do not attempt to schedule the preceding instruction into the delay slot of a branch instruction  placed  at	 the
	   end	of  a  short  loop  of six instructions or fewer and always schedule a "nop" instruction there instead.	 The
	   short loop bug under certain conditions causes loops to execute only once or twice, due to a hardware bug in	 the
	   R5900 chip.	The workaround is implemented by the assembler rather than by GCC.

       -mfix-rm7000
       -mno-fix-rm7000
	   Work	 around the RM7000 "dmult"/"dmultu" errata.  The workarounds are implemented by the assembler rather than by
	   GCC.

       -mfix-vr4120
       -mno-fix-vr4120
	   Work around certain VR4120 errata:

	   -   "dmultu" does not always produce the correct result.

	   -   "div" and "ddiv" do not always produce the correct result if one of the operands is negative.

	   The workarounds for the division errata rely on special functions in libgcc.a.  At present, these  functions	 are
	   only provided by the "mips64vr*-elf" configurations.

	   Other VR4120 errata require a NOP to be inserted between certain pairs of instructions.  These errata are handled
	   by the assembler, not by GCC itself.

       -mfix-vr4130
	   Work	 around	 the  VR4130  "mflo"/"mfhi" errata.  The workarounds are implemented by the assembler rather than by
	   GCC, although GCC avoids using  "mflo"  and	"mfhi"	if  the	 VR4130	 "macc",  "macchi",  "dmacc"  and  "dmacchi"
	   instructions are available instead.

       -mfix-sb1
       -mno-fix-sb1
	   Work	 around	 certain  SB-1 CPU core errata.	 (This flag currently works around the SB-1 revision 2 "F1" and "F2"
	   floating-point errata.)

       -mr10k-cache-barrier=setting
	   Specify whether GCC should insert cache barriers to avoid the side effects of speculation on R10K processors.

	   In common with many processors, the R10K tries to predict the outcome of a conditional branch  and  speculatively
	   executes  instructions  from	 the "taken" branch.  It later aborts these instructions if the predicted outcome is
	   wrong.  However, on the R10K, even aborted instructions can have side effects.

	   This problem only affects kernel  stores  and,  depending  on  the  system,	kernel	loads.	 As  an	 example,  a
	   speculatively-executed  store may load the target memory into cache and mark the cache line as dirty, even if the
	   store itself is later aborted.  If a DMA operation writes to the same area of memory before the "dirty"  line  is
	   flushed,  the  cached  data	overwrites  the	 DMA-ed data.  See the R10K processor manual for a full description,
	   including other potential problems.

	   One workaround is to insert cache barrier instructions before every memory access  that  might  be  speculatively
	   executed  and  that	might  have  side  effects  even  if  aborted.	 -mr10k-cache-barrier=setting controls GCC's
	   implementation of this workaround.  It assumes that aborted accesses to any byte in the  following  regions	does
	   not have side effects:

	   1.  the memory occupied by the current function's stack frame;

	   2.  the memory occupied by an incoming stack argument;

	   3.  the memory occupied by an object with a link-time-constant address.

	   It is the kernel's responsibility to ensure that speculative accesses to these regions are indeed safe.

	   If the input program contains a function declaration such as:

		   void foo (void);

	   then	 the implementation of "foo" must allow "j foo" and "jal foo" to be executed speculatively.  GCC honors this
	   restriction for functions it compiles itself.  It expects non-GCC functions (such as hand-written assembly  code)
	   to do the same.

	   The option has three forms:

	   -mr10k-cache-barrier=load-store
	       Insert  a  cache barrier before a load or store that might be speculatively executed and that might have side
	       effects even if aborted.

	   -mr10k-cache-barrier=store
	       Insert a cache barrier before a store that might be speculatively executed and that might have  side  effects
	       even if aborted.

	   -mr10k-cache-barrier=none
	       Disable the insertion of cache barriers.	 This is the default setting.

       -mflush-func=func
       -mno-flush-func
	   Specifies  the  function  to	 call to flush the I and D caches, or to not call any such function.  If called, the
	   function must take the same arguments as the common "_flush_func", that is, the address of the memory  range	 for
	   which  the  cache  is  being flushed, the size of the memory range, and the number 3 (to flush both caches).	 The
	   default depends on the target GCC was configured for, but commonly is either "_flush_func" or "__cpu_flush".

       -mbranch-cost=num
	   Set the cost of branches to roughly num "simple" instructions.   This  cost	is  only  a  heuristic	and  is	 not
	   guaranteed  to produce consistent results across releases.  A zero cost redundantly selects the default, which is
	   based on the -mtune setting.

       -mbranch-likely
       -mno-branch-likely
	   Enable or disable use of Branch Likely instructions, regardless of the default for the selected architecture.  By
	   default, Branch Likely instructions may be generated if they are supported  by  the	selected  architecture.	  An
	   exception  is  for  the  MIPS32  and	 MIPS64 architectures and processors that implement those architectures; for
	   those, Branch Likely instructions are not be generated by default because the  MIPS32  and  MIPS64  architectures
	   specifically deprecate their use.

       -mcompact-branches=never
       -mcompact-branches=optimal
       -mcompact-branches=always
	   These options control which form of branches will be generated.  The default is -mcompact-branches=optimal.

	   The -mcompact-branches=never option ensures that compact branch instructions will never be generated.

	   The -mcompact-branches=always option ensures that a compact branch instruction will be generated if available for
	   MIPS	 Release  6 onwards.  If a compact branch instruction is not available (or pre-R6), a delay slot form of the
	   branch will be used instead.

	   If it is used for MIPS16/microMIPS targets, it will be just ignored now.  The behavior for  MIPS16/microMIPS	 may
	   change in future, since they do have some compact branch instructions.

	   The	-mcompact-branches=optimal  option  will  cause	 a  delay  slot branch to be used if one is available in the
	   current ISA and the delay slot is successfully filled.  If the delay slot is not filled, a compact branch will be
	   chosen if one is available.

       -mfp-exceptions
       -mno-fp-exceptions
	   Specifies whether FP exceptions are enabled.	 This affects how FP instructions are scheduled for some processors.
	   The default is that FP exceptions are enabled.

	   For instance, on the SB-1, if FP exceptions are disabled, and we are emitting 64-bit code, then we can  use	both
	   FP pipes.  Otherwise, we can only use one FP pipe.

       -mvr4130-align
       -mno-vr4130-align
	   The	VR4130	pipeline  is  two-way  superscalar, but can only issue two instructions together if the first one is
	   8-byte aligned.  When this option is enabled, GCC aligns pairs of instructions that it thinks should	 execute  in
	   parallel.

	   This option only has an effect when optimizing for the VR4130.  It normally makes code faster, but at the expense
	   of making it bigger.	 It is enabled by default at optimization level -O3.

       -msynci
       -mno-synci
	   Enable  (disable)  generation of "synci" instructions on architectures that support it.  The "synci" instructions
	   (if enabled) are generated when "__builtin___clear_cache" is compiled.

	   This option defaults to -mno-synci, but the default can be overridden by configuring GCC with --with-synci.

	   When compiling code for single processor systems, it is generally safe to use "synci".  However, on	many  multi-
	   core	 (SMP)	systems,  it  does  not	 invalidate  the  instruction  caches on all cores and may lead to undefined
	   behavior.

       -mrelax-pic-calls
       -mno-relax-pic-calls
	   Try to turn PIC calls that are normally dispatched via register $25 into direct calls.  This is only possible  if
	   the linker can resolve the destination at link time and if the destination is within range for a direct call.

	   -mrelax-pic-calls is the default if GCC was configured to use an assembler and a linker that support the ".reloc"
	   assembly  directive	and  -mexplicit-relocs	is  in	effect.	 With -mno-explicit-relocs, this optimization can be
	   performed by the assembler and the linker alone without help from the compiler.

       -mmcount-ra-address
       -mno-mcount-ra-address
	   Emit (do not emit) code that allows "_mcount" to modify the calling function's  return  address.   When  enabled,
	   this	 option	 extends  the usual "_mcount" interface with a new ra-address parameter, which has type "intptr_t *"
	   and is passed in register $12.  "_mcount" can then modify the return address by doing both of the following:

	   *   Returning the new address in register $31.

	   *   Storing the new address in "*ra-address", if ra-address is nonnull.

	   The default is -mno-mcount-ra-address.

       -mframe-header-opt
       -mno-frame-header-opt
	   Enable (disable) frame header optimization in the o32 ABI.  When  using  the	 o32  ABI,  calling  functions	will
	   allocate  16	 bytes	on  the	 stack	for the called function to write out register arguments.  When enabled, this
	   optimization will suppress the allocation of the frame header if it can be determined that it is unused.

	   This optimization is off by default at all optimization levels.

       -mlxc1-sxc1
       -mno-lxc1-sxc1
	   When applicable, enable (disable) the generation of "lwxc1", "swxc1", "ldxc1", "sdxc1" instructions.	 Enabled  by
	   default.

       -mmadd4
       -mno-madd4
	   When	 applicable,  enable  (disable)	 the  generation  of  4-operand "madd.s", "madd.d" and related instructions.
	   Enabled by default.

       MMIX Options

       These options are defined for the MMIX:

       -mlibfuncs
       -mno-libfuncs
	   Specify that intrinsic library functions are being compiled, passing all values in registers, no matter the size.

       -mepsilon
       -mno-epsilon
	   Generate floating-point comparison instructions that compare with respect to the "rE" epsilon register.

       -mabi=mmixware
       -mabi=gnu
	   Generate code that passes function parameters and return values  that  (in  the  called  function)  are  seen  as
	   registers $0 and up, as opposed to the GNU ABI which uses global registers $231 and up.

       -mzero-extend
       -mno-zero-extend
	   When reading data from memory in sizes shorter than 64 bits, use (do not use) zero-extending load instructions by
	   default, rather than sign-extending ones.

       -mknuthdiv
       -mno-knuthdiv
	   Make	 the  result  of  a  division  yielding	 a  remainder  have the same sign as the divisor.  With the default,
	   -mno-knuthdiv, the sign of the remainder follows the sign of	 the  dividend.	  Both	methods	 are  arithmetically
	   valid, the latter being almost exclusively used.

       -mtoplevel-symbols
       -mno-toplevel-symbols
	   Prepend  (do	 not prepend) a : to all global symbols, so the assembly code can be used with the "PREFIX" assembly
	   directive.

       -melf
	   Generate an executable in the ELF format, rather than the default mmo format used by the mmix simulator.

       -mbranch-predict
       -mno-branch-predict
	   Use (do not use) the probable-branch instructions, when static branch prediction indicates a probable branch.

       -mbase-addresses
       -mno-base-addresses
	   Generate (do not generate) code that uses base addresses.  Using a base address automatically generates a request
	   (handled by the assembler and the linker) for a constant to be set up in a global register.	The register is used
	   for one or more base address requests within the range 0 to 255  from  the  value  held  in	the  register.	 The
	   generally  leads to short and fast code, but the number of different data items that can be addressed is limited.
	   This means that a program that uses lots of static data may require -mno-base-addresses.

       -msingle-exit
       -mno-single-exit
	   Force (do not force) generated code to have a single exit point in each function.

       MN10300 Options

       These -m options are defined for Matsushita MN10300 architectures:

       -mmult-bug
	   Generate code to avoid bugs in the multiply instructions for the MN10300 processors.	 This is the default.

       -mno-mult-bug
	   Do not generate code to avoid bugs in the multiply instructions for the MN10300 processors.

       -mam33
	   Generate code using features specific to the AM33 processor.

       -mno-am33
	   Do not generate code using features specific to the AM33 processor.	This is the default.

       -mam33-2
	   Generate code using features specific to the AM33/2.0 processor.

       -mam34
	   Generate code using features specific to the AM34 processor.

       -mtune=cpu-type
	   Use the timing characteristics of the indicated CPU type when scheduling instructions.  This does not change	 the
	   targeted processor type.  The CPU type must be one of mn10300, am33, am33-2 or am34.

       -mreturn-pointer-on-d0
	   When	 generating  a	function  that	returns a pointer, return the pointer in both "a0" and "d0".  Otherwise, the
	   pointer is returned only in "a0", and attempts to call such functions without a prototype result in errors.	Note
	   that this option is on by default; use -mno-return-pointer-on-d0 to disable it.

       -mno-crt0
	   Do not link in the C run-time initialization object file.

       -mrelax
	   Indicate to the linker that it should perform a relaxation optimization  pass  to  shorten  branches,  calls	 and
	   absolute memory addresses.  This option only has an effect when used on the command line for the final link step.

	   This option makes symbolic debugging impossible.

       -mliw
	   Allow  the  compiler	 to generate Long Instruction Word instructions if the target is the AM33 or later.  This is
	   the default.	 This option defines the preprocessor macro "__LIW__".

       -mno-liw
	   Do not allow the compiler to generate Long Instruction Word instructions.  This option defines  the	preprocessor
	   macro "__NO_LIW__".

       -msetlb
	   Allow  the  compiler	 to generate the SETLB and Lcc instructions if the target is the AM33 or later.	 This is the
	   default.  This option defines the preprocessor macro "__SETLB__".

       -mno-setlb
	   Do not allow the compiler to generate SETLB or Lcc instructions.  This  option  defines  the	 preprocessor  macro
	   "__NO_SETLB__".

       Moxie Options

       -meb
	   Generate big-endian code.  This is the default for moxie-*-* configurations.

       -mel
	   Generate little-endian code.

       -mmul.x
	   Generate mul.x and umul.x instructions.  This is the default for moxiebox-*-* configurations.

       -mno-crt0
	   Do not link in the C run-time initialization object file.

       MSP430 Options

       These options are defined for the MSP430:

       -masm-hex
	   Force  assembly output to always use hex constants.	Normally such constants are signed decimals, but this option
	   is available for testsuite and/or aesthetic purposes.

       -mmcu=
	   Select the MCU to target.  This is used to create a C preprocessor symbol based upon the MCU name,  converted  to
	   upper  case	and pre- and post-fixed with __.  This in turn is used by the msp430.h header file to select an MCU-
	   specific supplementary header file.

	   The option also sets the ISA to use.	 If the MCU name is one that is known to only support the 430 ISA then	that
	   is selected, otherwise the 430X ISA is selected.  A generic MCU name of msp430 can also be used to select the 430
	   ISA.	 Similarly the generic msp430x MCU name selects the 430X ISA.

	   In  addition an MCU-specific linker script is added to the linker command line.  The script's name is the name of
	   the MCU with .ld appended.  Thus specifying -mmcu=xxx on the gcc command line defines the C	preprocessor  symbol
	   "__XXX__" and cause the linker to search for a script called xxx.ld.

	   The	ISA  and  hardware  multiply  supported for the different MCUs is hard-coded into GCC.	However, an external
	   devices.csv file can be used to extend device support beyond those that have been hard-coded.

	   GCC searches for the devices.csv file using the following methods in the given precedence order, where the  first
	   method takes precedence over the second which takes precedence over the third.

	   Include path specified with "-I" and "-L"
	       devices.csv  is	searched for in each of the directories specified by include paths and linker library search
	       paths.

	   Path specified by the environment variable MSP430_GCC_INCLUDE_DIR
	       Define the value of the global environment variable MSP430_GCC_INCLUDE_DIR to the full path to the  directory
	       containing  devices.csv,	 and  GCC will search this directory for devices.csv.  If devices.csv is found, this
	       directory is also registered as an include path and linker library path.	 Header files and linker scripts  in
	       this directory can therefore be used without manually specifying "-I" and "-L" on the command line.

	   The msp430-elf{,bare}/include/devices directory
	       Finally,	 GCC  examines	msp430-elf{,bare}/include/devices from the toolchain root directory.  This directory
	       does not exist in a default installation, but if the user has created it and copied devices.csv	there,	then
	       the  MCU	 data  is  read.   As above, this directory is also registered as an include path and linker library
	       path.

	   If none of the above search methods find devices.csv, then the hard-coded MCU data is used.

       -mwarn-mcu
       -mno-warn-mcu
	   This option enables or disables warnings about conflicts between the MCU name specified by the -mmcu	 option	 and
	   the ISA set by the -mcpu option and/or the hardware multiply support set by the -mhwmult option.  It also toggles
	   warnings about unrecognized MCU names.  This option is on by default.

       -mcpu=
	   Specifies  the  ISA	to use.	 Accepted values are msp430, msp430x and msp430xv2.  This option is deprecated.	 The
	   -mmcu= option should be used to select the ISA.

       -msim
	   Link to the simulator runtime libraries and linker script.  Overrides any scripts that would be selected  by	 the
	   -mmcu= option.

       -mlarge
	   Use large-model addressing (20-bit pointers, 20-bit "size_t").

       -msmall
	   Use small-model addressing (16-bit pointers, 16-bit "size_t").

       -mrelax
	   This	 option	 is  passed to the assembler and linker, and allows the linker to perform certain optimizations that
	   cannot be done until the final link.

       mhwmult=
	   Describes the type of hardware multiply supported by the target.   Accepted	values	are  none  for	no  hardware
	   multiply,  16bit for the original 16-bit-only multiply supported by early MCUs.  32bit for the 16/32-bit multiply
	   supported by later MCUs and f5series for the 16/32-bit multiply supported by F5-series MCUs.	 A value of auto can
	   also be given.  This tells GCC to deduce the hardware multiply support based upon the MCU name  provided  by	 the
	   -mmcu  option.   If	no  -mmcu option is specified or if the MCU name is not recognized then no hardware multiply
	   support is assumed.	"auto" is the default setting.

	   Hardware multiplies are normally performed by calling a library routine.  This saves space in the generated code.
	   When compiling at -O3 or higher however the hardware multiplier is invoked inline.  This makes  for	bigger,	 but
	   faster code.

	   The	hardware  multiply  routines disable interrupts whilst running and restore the previous interrupt state when
	   they finish.	 This makes them safe to use inside interrupt handlers as well as in normal code.

       -minrt
	   Enable the use of a minimum runtime environment - no static initializers or constructors.  This is  intended	 for
	   memory-constrained  devices.	  The  compiler	 includes  special  symbols in some objects that tell the linker and
	   runtime which code fragments are required.

       -mtiny-printf
	   Enable reduced code size "printf" and "puts" library functions.  The tiny implementations of these functions	 are
	   not reentrant, so must be used with caution in multi-threaded applications.

	   Support  for	 streams has been removed and the string to be printed will always be sent to stdout via the "write"
	   syscall.  The string is not buffered before it is sent to write.

	   This option requires Newlib Nano IO, so GCC must be configured with --enable-newlib-nano-formatted-io.

       -mmax-inline-shift=
	   This option takes an integer between 0 and 64 inclusive, and sets the maximum number of inline shift instructions
	   which should be emitted to perform a shift operation by a constant amount.  When this value needs to be exceeded,
	   an mspabi helper function is used instead.  The default value is 4.

	   This only affects cases where a shift by multiple positions cannot be completed with a single  instruction  (e.g.
	   all shifts >1 on the 430 ISA).

	   Shifts  of  a  32-bit value are at least twice as costly, so the value passed for this option is divided by 2 and
	   the resulting value used instead.

       -mcode-region=
       -mdata-region=
	   These options tell the compiler where to place functions and data that do not have one of the  "lower",  "upper",
	   "either"  or	 "section"  attributes.	  Possible  values are "lower", "upper", "either" or "any".  The first three
	   behave like the corresponding attribute.  The fourth possible  value	 -  "any"  -  is  the  default.	  It  leaves
	   placement  entirely	up  to the linker script and how it assigns the standard sections (".text", ".data", etc) to
	   the memory regions.

       -msilicon-errata=
	   This option passes on a request to assembler to enable the fixes for the named silicon errata.

       -msilicon-errata-warn=
	   This option passes on a request to the assembler to enable warning messages when a silicon errata might  need  to
	   be applied.

       -mwarn-devices-csv
       -mno-warn-devices-csv
	   Warn if devices.csv is not found or there are problem parsing it (default: on).

       NDS32 Options

       These options are defined for NDS32 implementations:

       -mbig-endian
	   Generate code in big-endian mode.

       -mlittle-endian
	   Generate code in little-endian mode.

       -mreduced-regs
	   Use reduced-set registers for register allocation.

       -mfull-regs
	   Use full-set registers for register allocation.

       -mcmov
	   Generate conditional move instructions.

       -mno-cmov
	   Do not generate conditional move instructions.

       -mext-perf
	   Generate performance extension instructions.

       -mno-ext-perf
	   Do not generate performance extension instructions.

       -mext-perf2
	   Generate performance extension 2 instructions.

       -mno-ext-perf2
	   Do not generate performance extension 2 instructions.

       -mext-string
	   Generate string extension instructions.

       -mno-ext-string
	   Do not generate string extension instructions.

       -mv3push
	   Generate v3 push25/pop25 instructions.

       -mno-v3push
	   Do not generate v3 push25/pop25 instructions.

       -m16-bit
	   Generate 16-bit instructions.

       -mno-16-bit
	   Do not generate 16-bit instructions.

       -misr-vector-size=num
	   Specify the size of each interrupt vector, which must be 4 or 16.

       -mcache-block-size=num
	   Specify the size of each cache block, which must be a power of 2 between 4 and 512.

       -march=arch
	   Specify the name of the target architecture.

       -mcmodel=code-model
	   Set the code model to one of

	   small
	       All  the	 data  and  read-only data segments must be within 512KB addressing space.  The text segment must be
	       within 16MB addressing space.

	   medium
	       The data segment must be within 512KB while the read-only data segment can be within  4GB  addressing  space.
	       The text segment should be still within 16MB addressing space.

	   large
	       All the text and data segments can be within 4GB addressing space.

       -mctor-dtor
	   Enable constructor/destructor feature.

       -mrelax
	   Guide linker to relax instructions.

       Nvidia PTX Options

       These options are defined for Nvidia PTX:

       -m64
	   Ignored, but preserved for backward compatibility.  Only 64-bit ABI is supported.

       -march=architecture-string
	   Generate code for the specified PTX ISA target architecture.	 Valid architecture strings are sm_30, sm_35, sm_37,
	   sm_52,  sm_53,  sm_61,  sm_70,  sm_75,  sm_80,  and	sm_89.	 The  default  depends	on how the compiler has been
	   configured, see --with-arch.

	   This option sets the value of the preprocessor macro "__PTX_SM__"; for instance, for sm_35, it has the value 350.

       -misa=architecture-string
	   Alias of -march=.

       -march-map=architecture-string
	   Select the closest available -march= value that is not more capable.	 For instance, for  -march-map=sm_50  select
	   -march=sm_37, and for -march-map=sm_53 select -march=sm_53.

       -mptx=version-string
	   Generate  code  for	the specified PTX ISA version.	Valid version strings are 3.1, 4.1, 4.2, 5.0, 6.0, 6.3, 7.0,
	   7.3, and 7.8.  The default PTX ISA version is the one  that	added  support	for  the  selected  PTX	 ISA  target
	   architecture, see -march=, but at least 6.3, or 7.3 for -march=sm_52 and higher.

	   This	   option    sets    the    values    of    the	   preprocessor	  macros   "__PTX_ISA_VERSION_MAJOR__"	 and
	   "__PTX_ISA_VERSION_MINOR__"; for instance, for 3.1 the macros have the values 3 and 1, respectively.

       -mmainkernel
	   Link in code for a __main kernel.  This is for stand-alone instead of offloading execution.

       -moptimize
	   Apply partitioned execution optimizations.  This is the default when any level of optimization is selected.

       -msoft-stack
       -mno-soft-stack
	   For -mno-soft-stack (the default, unless -mgomp has been specified), use PTX "native" stacks, that  is,  generate
	   code	 that  uses  ".local"  memory  or  PTX	"alloca" directly for stack storage.  Unless -mptx=7.3 or higher and
	   -march=sm_52 or higher are active, variable-length arrays and dynamically allocating memory	on  the	 stack	with
	   "alloca" are not supported.

	   For	-msoft-stack  (implied	by -mgomp), generate code that does not use ".local" memory or PTX "alloca" directly
	   for stack storage. Instead, a per-warp stack pointer is maintained explicitly. This enables variable-length stack
	   allocation (with variable-length arrays or "alloca"), and when global memory	 is  used  for	underlying  storage,
	   makes  it  possible	to  access  automatic  variables  from other threads, or with atomic instructions. This code
	   generation variant is used for OpenMP offloading, but the option is exposed on its own for the purpose of testing
	   the compiler; to generate code suitable for linking into programs using OpenMP offloading, use option -mgomp.

       -muniform-simt
	   Switch to code generation variant that allows to execute all threads in each warp, while maintaining memory state
	   and side effects as if only one thread in each warp was active  outside  of	OpenMP	SIMD  regions.	 All  atomic
	   operations and calls to runtime (malloc, free, vprintf) are conditionally executed (iff current lane index equals
	   the master lane index), and the register being assigned is copied via a shuffle instruction from the master lane.
	   Outside of SIMD regions lane 0 is the master; inside, each thread sees itself as the master.	 Shared memory array
	   "int	 __nvptx_uni[]"	 stores	 all-zeros or all-ones bitmasks for each warp, indicating current mode (0 outside of
	   SIMD regions).  Each thread can bitwise-and the bitmask at position "tid.y" with current lane  index	 to  compute
	   the master lane index.

       -mgomp
	   Generate  code  for	use  in	 OpenMP	 offloading:  enables  -msoft-stack  and -muniform-simt options, and selects
	   corresponding multilib variant.

       OpenRISC Options

       These options are defined for OpenRISC:

       -mboard=name
	   Configure a board specific runtime.	This will be passed to the linker for newlib  board  library  linking.	 The
	   default is "or1ksim".

       -mnewlib
	   This	 option	 is  ignored;  it  is  for compatibility purposes only.	 This used to select linker and preprocessor
	   options for use with newlib.

       -msoft-div
       -mhard-div
	   Select software or hardware divide ("l.div", "l.divu") instructions.	 This default is hardware divide.

       -msoft-mul
       -mhard-mul
	   Select software or hardware multiply ("l.mul", "l.muli") instructions.  This default is hardware multiply.

       -msoft-float
       -mhard-float
	   Select software or hardware for floating point operations.  The default is software.

       -mdouble-float
	   When -mhard-float is selected, enables generation of double-precision floating point	 instructions.	 By  default
	   functions from libgcc are used to perform double-precision floating point operations.

       -munordered-float
	   When	 -mhard-float  is selected, enables generation of unordered floating point compare and set flag ("lf.sfun*")
	   instructions.  By default functions from libgcc are used to perform unordered floating point compare and set flag
	   operations.

       -mcmov
	   Enable generation of conditional move ("l.cmov") instructions.  By default the equivalent will be generated using
	   set and branch.

       -mror
	   Enable generation of rotate right ("l.ror") instructions.  By default functions from libgcc are used	 to  perform
	   rotate right operations.

       -mrori
	   Enable  generation  of rotate right with immediate ("l.rori") instructions.	By default functions from libgcc are
	   used to perform rotate right with immediate operations.

       -msext
	   Enable generation of sign extension ("l.ext*") instructions.	 By default memory loads are used  to  perform	sign
	   extension.

       -msfimm
	   Enable  generation of compare and set flag with immediate ("l.sf*i") instructions.  By default extra instructions
	   will be generated to store the immediate to a register first.

       -mshftimm
	   Enable generation of shift  with  immediate	("l.srai",  "l.srli",  "l.slli")  instructions.	  By  default  extra
	   instructions will be generated to store the immediate to a register first.

       -mcmodel=small
	   Generate OpenRISC code for the small model: The GOT is limited to 64k. This is the default model.

       -mcmodel=large
	   Generate OpenRISC code for the large model: The GOT may grow up to 4G in size.

       PDP-11 Options

       These options are defined for the PDP-11:

       -mfpu
	   Use	hardware  FPP floating point.  This is the default.  (FIS floating point on the PDP-11/40 is not supported.)
	   Implies -m45.

       -msoft-float
	   Do not use hardware floating point.

       -mac0
	   Return floating-point results in ac0 (fr0 in Unix assembler syntax).

       -mno-ac0
	   Return floating-point results in memory.  This is the default.

       -m40
	   Generate code for a PDP-11/40.  Implies -msoft-float -mno-split.

       -m45
	   Generate code for a PDP-11/45.  This is the default.

       -m10
	   Generate code for a PDP-11/10.  Implies -msoft-float -mno-split.

       -mint16
       -mno-int32
	   Use 16-bit "int".  This is the default.

       -mint32
       -mno-int16
	   Use 32-bit "int".

       -msplit
	   Target has split instruction and data space.	 Implies -m45.

       -munix-asm
	   Use Unix assembler syntax.

       -mdec-asm
	   Use DEC assembler syntax.

       -mgnu-asm
	   Use GNU assembler syntax.  This is the default.

       -mlra
	   Use the new LRA register allocator.	By default, the old "reload" allocator is used.

       PowerPC Options

       These are listed under

       PRU Options

       These command-line options are defined for PRU target:

       -minrt
	   Link with a minimum runtime environment.  This can significantly reduce the size of the  final  ELF	binary,	 but
	   some standard C runtime features are removed.

	   This	 option	 disables  support  for	 static initializers and constructors.	Beware that the compiler could still
	   generate code with static initializers and constructors.  It is up to the programmer to ensure  that	 the  source
	   program will not use those features.

	   The	minimal startup code would not pass "argc" and "argv" arguments to "main", so the latter must be declared as
	   "int main (void)".  This is already the norm for most firmware projects.

       -mmcu=mcu
	   Specify the PRU hardware variant to use.  A correspondingly named spec file would be loaded, passing	 the  memory
	   region sizes to the linker and defining hardware-specific C macros.

	   Newlib  provides  only  the	"sim" spec, intended for running regression tests using a simulator.  Specs for real
	   hardware can be obtained by installing the GnuPruMcu ("https://github.com/dinuxbg/gnuprumcu/") package.

       -mno-relax
	   Make GCC pass the --no-relax command-line option to the linker instead of the --relax option.

       -mloop
	   Allow (or do not allow) GCC to use the LOOP instruction.

       -mabi=variant
	   Specify the ABI variant to output code for.	-mabi=ti selects the unmodified TI ABI while -mabi=gnu selects a GNU
	   variant that copes more naturally with certain GCC assumptions.  These are the differences:

	   Function Pointer Size
	       TI ABI specifies that function (code) pointers are 16-bit, whereas GNU supports only  32-bit  data  and	code
	       pointers.

	   Optional Return Value Pointer
	       Function	 return values larger than 64 bits are passed by using a hidden pointer as the first argument of the
	       function.  TI ABI, though, mandates that the pointer can be NULL in case the caller is not using the returned
	       value.  GNU always passes and expects a valid return value pointer.

	   The current -mabi=ti implementation simply raises a compile error when  any	of  the	 above	code  constructs  is
	   detected.  As a consequence the standard C library cannot be built and it is omitted when linking with -mabi=ti.

	   Relaxation  is  a  GNU feature and for safety reasons is disabled when using -mabi=ti.  The TI toolchain does not
	   emit relocations for QBBx instructions, so the GNU linker cannot  adjust  them  when	 shortening  adjacent  LDI32
	   pseudo instructions.

       RISC-V Options

       These command-line options are defined for RISC-V targets:

       -mbranch-cost=n
	   Set the cost of branches to roughly n instructions.

       -mplt
       -mno-plt
	   When generating PIC code, do or don't allow the use of PLTs. Ignored for non-PIC.  The default is -mplt.

       -mabi=ABI-string
	   Specify  integer and floating-point calling convention.  ABI-string contains two parts: the size of integer types
	   and the registers used for floating-point types.  For example -march=rv64ifd	 -mabi=lp64d  means  that  long	 and
	   pointers are 64-bit (implicitly defining int to be 32-bit), and that floating-point values up to 64 bits wide are
	   passed  in  F  registers.   Contrast	 this  with  -march=rv64ifd  -mabi=lp64f, which still allows the compiler to
	   generate code that uses the F and D extensions but only allows floating-point values up to 32  bits	long  to  be
	   passed  in  registers;  or  -march=rv64ifd  -mabi=lp64,  in	which  no floating-point arguments will be passed in
	   registers.

	   The default for this argument is system dependent, users who want a specific calling	 convention  should  specify
	   one	explicitly.  The valid calling conventions are: ilp32, ilp32f, ilp32d, lp64, lp64f, and lp64d.	Some calling
	   conventions are impossible to implement on some ISAs: for example, -march=rv32if -mabi=ilp32d is invalid  because
	   the	ABI  requires 64-bit values be passed in F registers, but F registers are only 32 bits wide.  There are also
	   the ilp32e ABI that can only be used with the rv32e architecture and the lp64e ABI that can only be used with the
	   rv64e.  Those ABIs are not well specified at present, and are subject to change.

       -mfdiv
       -mno-fdiv
	   Do or don't use hardware floating-point divide and square root instructions.	 This requires the F or D extensions
	   for floating-point registers.  The default is to use them if the specified architecture has these instructions.

       -mfence-tso
       -mno-fence-tso
	   Do or don't use the fence.tso instruction, which is	unimplemented  on  some	 processors  (including	 those	from
	   T-Head).  If the fence.tso instruction is not available then a stronger fence is used instead.

       -mdiv
       -mno-div
	   Do  or  don't  use hardware instructions for integer division.  This requires the M extension.  The default is to
	   use them if the specified architecture has these instructions.

       -misa-spec=ISA-spec-string
	   Specify the version of the RISC-V Unprivileged (formerly User-Level) ISA specification to produce code conforming
	   to.	The possibilities for ISA-spec-string are:

	   2.2 Produce code conforming to version 2.2.

	   20190608
	       Produce code conforming to version 20190608.

	   20191213
	       Produce code conforming to version 20191213.

	   The default is -misa-spec=20191213 unless GCC has been configured with --with-isa-spec=  specifying	a  different
	   default version.

       -march=ISA-string
	   Generate  code  for	given  RISC-V  ISA  (e.g. rv64im).  ISA strings must be lower-case.  Examples include rv64i,
	   rv32g, rv32e, and rv32imaf. Additionally, a special value help (-march=help) is accepted to	list  all  supported
	   extensions.

	   The syntax of the ISA string is defined as follows:

	   "The string must start with rv32 or rv64, followed by"
	       i, e, or g, referred to as the base ISA.

	   "The subsequent part of the string is a list of extension names. Extension"
	       names  can be categorized as multi-letter (e.g. zba) and single-letter (e.g. v). Single-letter extensions can
	       appear consecutively, but multi-letter extensions must be separated by underscores.

	   "An underscore can appear anywhere after the base ISA. It has no specific"
	       effect but is used to improve readability and can act as a separator.

	   "Extension names may include an optional version number, following the"
	       syntax p or , (e.g. m2p1 or m2).

	   Supported extension are listed below:

	   Extension Name : Supported Version : Description
	   i   @tab 2.0, 2.1 @tab Base integer extension.

	   e   @tab 2.0 @tab Reduced base integer extension.

	   g   @tab - @tab General-purpose computing base extension, g will expand to i, m, a, f, d, zicsr and zifencei.

	   m   @tab 2.0 @tab Integer multiplication and division extension.

	   a   @tab 2.0, 2.1 @tab Atomic extension.

	   f   @tab 2.0, 2.2 @tab Single-precision floating-point extension.

	   d   @tab 2.0, 2.2 @tab Double-precision floating-point extension.

	   c   @tab 2.0 @tab Compressed extension.

	   h   @tab 1.0 @tab Hypervisor extension.

	   v   @tab 1.0 @tab Vector extension.

	   zicsr
	       @tab 2.0 @tab Control and status register access extension.

	   zifencei
	       @tab 2.0 @tab Instruction-fetch fence extension.

	   zicond
	       @tab 1.0 @tab Integer conditional operations extension.

	   za64rs
	       @tab 1.0 @tab Reservation set size of 64 bytes.

	   za128rs
	       @tab 1.0 @tab Reservation set size of 128 bytes.

	   zawrs
	       @tab 1.0 @tab Wait-on-reservation-set extension.

	   zba @tab 1.0 @tab Address calculation extension.

	   zbb @tab 1.0 @tab Basic bit manipulation extension.

	   zbc @tab 1.0 @tab Carry-less multiplication extension.

	   zbs @tab 1.0 @tab Single-bit operation extension.

	   zfinx
	       @tab 1.0 @tab Single-precision floating-point in integer registers extension.

	   zdinx
	       @tab 1.0 @tab Double-precision floating-point in integer registers extension.

	   zhinx
	       @tab 1.0 @tab Half-precision floating-point in integer registers extension.

	   zhinxmin
	       @tab 1.0 @tab Minimal half-precision floating-point in integer registers extension.

	   zbkb
	       @tab 1.0 @tab Cryptography bit-manipulation extension.

	   zbkc
	       @tab 1.0 @tab Cryptography carry-less multiply extension.

	   zbkx
	       @tab 1.0 @tab Cryptography crossbar permutation extension.

	   zkne
	       @tab 1.0 @tab AES Encryption extension.

	   zknd
	       @tab 1.0 @tab AES Decryption extension.

	   zknh
	       @tab 1.0 @tab Hash function extension.

	   zkr @tab 1.0 @tab Entropy source extension.

	   zksed
	       @tab 1.0 @tab SM4 block cipher extension.

	   zksh
	       @tab 1.0 @tab SM3 hash function extension.

	   zkt @tab 1.0 @tab Data independent execution latency extension.

	   zk  @tab 1.0 @tab Standard scalar cryptography extension.

	   zkn @tab 1.0 @tab NIST algorithm suite extension.

	   zks @tab 1.0 @tab ShangMi algorithm suite extension.

	   zihintntl
	       @tab 1.0 @tab Non-temporal locality hints extension.

	   zihintpause
	       @tab 1.0 @tab Pause hint extension.

	   zicboz
	       @tab 1.0 @tab Cache-block zero extension.

	   zicbom
	       @tab 1.0 @tab Cache-block management extension.

	   zicbop
	       @tab 1.0 @tab Cache-block prefetch extension.

	   zic64b
	       @tab 1.0 @tab Cache block size isf 64 bytes.

	   ziccamoa
	       @tab 1.0 @tab Main memory supports all atomics in A.

	   ziccif
	       @tab 1.0 @tab Main memory supports instruction fetch with atomicity requirement.

	   zicclsm
	       @tab 1.0 @tab Main memory supports misaligned loads/stores.

	   ziccrse
	       @tab 1.0 @tab Main memory supports forward progress on LR/SC sequences.

	   zicntr
	       @tab 2.0 @tab Standard extension for base counters and timers.

	   zihpm
	       @tab 2.0 @tab Standard extension for hardware performance counters.

	   ztso
	       @tab 1.0 @tab Total store ordering extension.

	   zve32x
	       @tab 1.0 @tab Vector extensions for embedded processors.

	   zve32f
	       @tab 1.0 @tab Vector extensions for embedded processors.

	   zve64x
	       @tab 1.0 @tab Vector extensions for embedded processors.

	   zve64f
	       @tab 1.0 @tab Vector extensions for embedded processors.

	   zve64d
	       @tab 1.0 @tab Vector extensions for embedded processors.

	   zvl32b
	       @tab 1.0 @tab Minimum vector length standard extensions

	   zvl64b
	       @tab 1.0 @tab Minimum vector length standard extensions

	   zvl128b
	       @tab 1.0 @tab Minimum vector length standard extensions

	   zvl256b
	       @tab 1.0 @tab Minimum vector length standard extensions

	   zvl512b
	       @tab 1.0 @tab Minimum vector length standard extensions

	   zvl1024b
	       @tab 1.0 @tab Minimum vector length standard extensions

	   zvl2048b
	       @tab 1.0 @tab Minimum vector length standard extensions

	   zvl4096b
	       @tab 1.0 @tab Minimum vector length standard extensions

	   zvbb
	       @tab 1.0 @tab Vector basic bit-manipulation extension.

	   zvbc
	       @tab 1.0 @tab Vector carryless multiplication extension.

	   zvkb
	       @tab 1.0 @tab Vector cryptography bit-manipulation extension.

	   zvkg
	       @tab 1.0 @tab Vector GCM/GMAC extension.

	   zvkned
	       @tab 1.0 @tab Vector AES block cipher extension.

	   zvknha
	       @tab 1.0 @tab Vector SHA-2 secure hash extension.

	   zvknhb
	       @tab 1.0 @tab Vector SHA-2 secure hash extension.

	   zvksed
	       @tab 1.0 @tab Vector SM4 Block Cipher extension.

	   zvksh
	       @tab 1.0 @tab Vector SM3 Secure Hash extension.

	   zvkn
	       @tab 1.0 @tab Vector NIST Algorithm Suite extension, zvkn will expand to zvkned, zvknhb, zvkb and zvkt.

	   zvknc
	       @tab 1.0 @tab Vector NIST Algorithm Suite with carryless multiply extension, zvknc will expand  to  zvkn	 and
	       zvbc.

	   zvkng
	       @tab 1.0 @tab Vector NIST Algorithm Suite with GCM extension, zvkng will expand to zvkn and zvkg.

	   zvks
	       @tab 1.0 @tab Vector ShangMi algorithm suite extension, zvks will expand to zvksed, zvksh, zvkb and zvkt.

	   zvksc
	       @tab  1.0  @tab	Vector ShangMi algorithm suite with carryless multiplication extension, zvksc will expand to
	       zvks and zvbc.

	   zvksg
	       @tab 1.0 @tab Vector ShangMi algorithm suite with GCM extension, zvksg will expand to zvks and zvkg.

	   zvkt
	       @tab 1.0 @tab Vector data independent execution latency extension.

	   zfh @tab 1.0 @tab Half-precision floating-point extension.

	   zfhmin
	       @tab 1.0 @tab Minimal half-precision floating-point extension.

	   zvfh
	       @tab 1.0 @tab Vector half-precision floating-point extension.

	   zvfhmin
	       @tab 1.0 @tab Vector minimal half-precision floating-point extension.

	   zvfbfmin
	       @tab 1.0 @tab Vector BF16 converts extension.

	   zfa @tab 1.0 @tab Additional floating-point extension.

	   zmmul
	       @tab 1.0 @tab Integer multiplication extension.

	   zca @tab 1.0 @tab Integer compressed instruction extension.

	   zcf @tab 1.0 @tab Compressed single-precision floating point loads and stores extension.

	   zcd @tab 1.0 @tab Compressed double-precision floating point loads and stores extension.

	   zcb @tab 1.0 @tab Simple compressed instruction extension.

	   zce @tab 1.0 @tab Compressed instruction extensions for embedded processors.

	   zcmp
	       @tab 1.0 @tab Compressed push pop extension.

	   zcmt
	       @tab 1.0 @tab Table jump instruction extension.

	   smaia
	       @tab 1.0 @tab Advanced interrupt architecture extension.

	   smepmp
	       @tab 1.0 @tab PMP Enhancements for memory access and execution prevention on Machine mode.

	   smstateen
	       @tab 1.0 @tab State enable extension.

	   ssaia
	       @tab 1.0 @tab Advanced interrupt architecture extension for supervisor-mode.

	   sscofpmf
	       @tab 1.0 @tab Count overflow & filtering extension.

	   ssstateen
	       @tab 1.0 @tab State-enable extension for supervisor-mode.

	   sstc
	       @tab 1.0 @tab Supervisor-mode timer interrupts extension.

	   svinval
	       @tab 1.0 @tab Fine-grained address-translation cache invalidation extension.

	   svnapot
	       @tab 1.0 @tab NAPOT translation contiguity extension.

	   svpbmt
	       @tab 1.0 @tab Page-based memory types extension.

	   xcvmac
	       @tab 1.0 @tab Core-V multiply-accumulate extension.

	   xcvalu
	       @tab 1.0 @tab Core-V miscellaneous ALU extension.

	   xcvelw
	       @tab 1.0 @tab Core-V event load word extension.

	   xtheadba
	       @tab 1.0 @tab T-head address calculation extension.

	   xtheadbb
	       @tab 1.0 @tab T-head basic bit-manipulation extension.

	   xtheadbs
	       @tab 1.0 @tab T-head single-bit instructions extension.

	   xtheadcmo
	       @tab 1.0 @tab T-head cache management operations extension.

	   xtheadcondmov
	       @tab 1.0 @tab T-head conditional move extension.

	   xtheadfmemidx
	       @tab 1.0 @tab T-head indexed memory operations for floating-point registers extension.

	   xtheadfmv
	       @tab 1.0 @tab T-head double floating-point high-bit data transmission extension.

	   xtheadint
	       @tab 1.0 @tab T-head acceleration interruption extension.

	   xtheadmac
	       @tab 1.0 @tab T-head multiply-accumulate extension.

	   xtheadmemidx
	       @tab 1.0 @tab T-head indexed memory operation extension.

	   xtheadmempair
	       @tab 1.0 @tab T-head two-GPR memory operation extension.

	   xtheadsync
	       @tab 1.0 @tab T-head multi-core synchronization extension.

	   xventanacondops
	       @tab 1.0 @tab Ventana integer conditional operations extension.

	   When -march= is not specified, use the setting from -mcpu.

	   If both -march and -mcpu= are not specified, the default for this argument is system dependent, users who want  a
	   specific architecture extensions should specify one explicitly.

	   When	 the RISC-V specifications define an extension as depending on other extensions, GCC will implicitly add the
	   dependent extensions to the enabled extension set if they weren't added explicitly.

       -mcpu=processor-string
	   Use architecture of and optimize  the  output  for  the  given  processor,  specified  by  particular  CPU  name.
	   Permissible	values	for this option are: sifive-e20, sifive-e21, sifive-e24, sifive-e31, sifive-e34, sifive-e76,
	   sifive-s21, sifive-s51, sifive-s54, sifive-s76, sifive-u54, sifive-u74, sifive-x280,	 sifive-xp450,	sifive-x670,
	   thead-c906, tt-ascalon-d8, xiangshan-nanhu.

	   Note that -mcpu does not override -march or -mtune.

       -mtune=processor-string
	   Optimize  the output for the given processor, specified by microarchitecture or particular CPU name.	 Permissible
	   values for this  option  are:  generic-ooo,	rocket,	 sifive-3-series,  sifive-5-series,  sifive-7-series,  size,
	   sifive-p400-series, sifive-p600-series, and all valid options for -mcpu=.

	   When -mtune= is not specified, use the setting from -mcpu, the default is rocket if both are not specified.

	   The	size  choice  is  not  intended for use by end-users.  This is used when -Os is specified.  It overrides the
	   instruction cost info provided by -mtune=, but does not override the pipeline info.	This helps reduce code	size
	   while still giving good performance.

       -mpreferred-stack-boundary=num
	   Attempt  to keep the stack boundary aligned to a 2 raised to num byte boundary.  If -mpreferred-stack-boundary is
	   not specified, the default is 4 (16 bytes or 128-bits).

	   Warning: If you use this switch, then you must build all modules with the same value,  including  any  libraries.
	   This includes the system libraries and startup modules.

       -msmall-data-limit=n
	   Put global and static data smaller than n bytes into a special section (on some targets).

       -msave-restore
       -mno-save-restore
	   Do  or  don't use smaller but slower prologue and epilogue code that uses library function calls.  The default is
	   to use fast inline prologues and epilogues.

       -mmovcc
       -mno-movcc
	   Do or don't produce branchless conditional-move code sequences even	with  targets  that  do	 not  have  specific
	   instructions for conditional operations.  If enabled, sequences of ALU operations are produced using base integer
	   ISA instructions where profitable.

       -minline-atomics
       -mno-inline-atomics
	   Do or don't use smaller but slower subword atomic emulation code that uses libatomic function calls.	 The default
	   is to use fast inline subword atomics that do not require libatomic.

       -minline-strlen
       -mno-inline-strlen
	   Do  or  do  not attempt to inline strlen calls if possible.	Inlining will only be done if the string is properly
	   aligned and instructions for accelerated processing are available.  The default is to not inline strlen calls.

       -minline-strcmp
       -mno-inline-strcmp
	   Do or do not attempt to inline strcmp calls if possible.  Inlining will only be done if the strings are  properly
	   aligned and instructions for accelerated processing are available.  The default is to not inline strcmp calls.

	   The	--param	 riscv-strcmp-inline-limit=n  parameter controls the maximum number of bytes compared by the inlined
	   code.  The default value is 64.

       -minline-strncmp
       -mno-inline-strncmp
	   Do or do not attempt to inline strncmp calls if possible.  Inlining will only be done if the strings are properly
	   aligned and instructions for accelerated processing are available.  The default is to not inline strncmp calls.

	   The --param riscv-strcmp-inline-limit=n parameter controls the maximum number of bytes compared  by	the  inlined
	   code.  The default value is 64.

       -mshorten-memrefs
       -mno-shorten-memrefs
	   Do  or  do  not attempt to make more use of compressed load/store instructions by replacing a load/store of 'base
	   register + large offset' with a new load/store of 'new base + small offset'.	 If the new base gets  stored  in  a
	   compressed  register,  then	the  new load/store can be compressed.	Currently targets 32-bit integer load/stores
	   only.

       -mstrict-align
       -mno-strict-align
	   Do not or do generate unaligned memory accesses.  The default is set depending on whether the  processor  we	 are
	   optimizing for supports fast unaligned access or not.

       -mscalar-strict-align
       -mno-scalar-strict-align
	   Do  not  or	do generate unaligned memory accesses.	The default is set depending on whether the processor we are
	   optimizing for supports fast unaligned access or not.  This is an alias for -mstrict-align.

       -mvector-strict-align
       -mno-vector-strict-align
	   Do not or do generate unaligned vector memory accesses.  The default is set to off unless the  processor  we	 are
	   optimizing for explicitly supports element-misaligned vector memory access.

       -mcmodel=medlow
	   Generate  code  for	the  medium-low code model. The program and its statically defined symbols must lie within a
	   single 2 GiB address range and must lie between absolute addresses -2 GiB and +2 GiB. Programs can be  statically
	   or  dynamically  linked.  This  is  the  default  code  model  unless GCC has been configured with --with-cmodel=
	   specifying a different default code model.

       -mcmodel=medany
	   Generate code for the medium-any code model. The program and its statically defined symbols must  be	 within	 any
	   single 2 GiB address range. Programs can be statically or dynamically linked.

	   The	code  generated	 by  the  medium-any  code  model is position-independent, but is not guaranteed to function
	   correctly when linked into position-independent executables or libraries.

       -mcmodel=large
	   Generate code for a large code model, which has no restrictions on size or placement of symbols.

       -mexplicit-relocs
       -mno-exlicit-relocs
	   Use or do not use assembler relocation operators when dealing with symbolic addresses.  The alternative is to use
	   assembler macros instead, which may limit optimization.

       -mrelax
       -mno-relax
	   Take advantage of linker relaxations to  reduce  the	 number	 of  instructions  required  to	 materialize  symbol
	   addresses. The default is to take advantage of linker relaxations.

       -mriscv-attribute
       -mno-riscv-attribute
	   Emit (do not emit) RISC-V attribute to record extra information into ELF objects.  This feature requires at least
	   binutils 2.32.

       -mcsr-check
       -mno-csr-check
	   Enables or disables the CSR checking.

       -malign-data=type
	   Control  how	 GCC  aligns variables and constants of array, structure, or union types.  Supported values for type
	   are xlen which uses x register width as the alignment value, and natural which uses natural alignment.   xlen  is
	   the default.

       -mbig-endian
	   Generate  big-endian	 code.	 This  is  the	default	 when GCC is configured for a riscv64be-*-* or riscv32be-*-*
	   target.

       -mlittle-endian
	   Generate little-endian code.	 This is the default when GCC is configured for a riscv64-*-* or riscv32-*-* but not
	   a riscv64be-*-* or riscv32be-*-* target.

       -mstack-protector-guard=guard
       -mstack-protector-guard-reg=reg
       -mstack-protector-guard-offset=offset
	   Generate stack protection code using canary at guard.  Supported locations are global for a global canary or	 tls
	   for per-thread canary in the TLS block.

	   With	 the  latter  choice  the  options -mstack-protector-guard-reg=reg and -mstack-protector-guard-offset=offset
	   furthermore specify which register to use as base register for reading the canary, and from what offset from that
	   base register. There is no default register or offset as this is entirely for use within the Linux kernel.

       -mtls-dialect=desc
	   Use TLS descriptors as the thread-local storage mechanism for dynamic accesses of TLS variables.

       -mtls-dialect=trad
	   Use traditional TLS as the thread-local storage mechanism for dynamic accesses of TLS  variables.   This  is	 the
	   default.

       RL78 Options

       -msim
	   Links in additional target libraries to support operation within a simulator.

       -mmul=none
       -mmul=g10
       -mmul=g13
       -mmul=g14
       -mmul=rl78
	   Specifies  the  type	 of  hardware multiplication and division support to be used.  The simplest is "none", which
	   uses software for both multiplication and division.	This is the default.  The "g13" value is  for  the  hardware
	   multiply/divide  peripheral	found  on  the	RL78/G13  (S2 core) targets.  The "g14" value selects the use of the
	   multiplication and division instructions supported by the RL78/G14 (S3 core) parts.	The value "rl78" is an alias
	   for "g14" and the value "mg10" is an alias for "none".

	   In addition a C preprocessor macro is defined, based upon the setting  of  this  option.   Possible	values	are:
	   "__RL78_MUL_NONE__", "__RL78_MUL_G13__" or "__RL78_MUL_G14__".

       -mcpu=g10
       -mcpu=g13
       -mcpu=g14
       -mcpu=rl78
	   Specifies  the RL78 core to target.	The default is the G14 core, also known as an S3 core or just RL78.  The G13
	   or S2 core does not have multiply or divide instructions,  instead  it  uses	 a  hardware  peripheral  for  these
	   operations.	The G10 or S1 core does not have register banks, so it uses a different calling convention.

	   If  this option is set it also selects the type of hardware multiply support to use, unless this is overridden by
	   an explicit -mmul=none option on the command line.  Thus specifying -mcpu=g13 enables the use of the G13 hardware
	   multiply peripheral and specifying -mcpu=g10 disables the use of hardware multiplications altogether.

	   Note, although the RL78/G14 core is the default target, specifying -mcpu=g14 or -mcpu=rl78 on  the  command	line
	   does	 change the behavior of the toolchain since it also enables G14 hardware multiply support.  If these options
	   are not specified on the command line then software multiplication routines will be used  even  though  the	code
	   targets  the	 RL78  core.   This is for backwards compatibility with older toolchains which did not have hardware
	   multiply and divide support.

	   In addition a C preprocessor macro is defined, based upon the setting  of  this  option.   Possible	values	are:
	   "__RL78_G10__", "__RL78_G13__" or "__RL78_G14__".

       -mg10
       -mg13
       -mg14
       -mrl78
	   These are aliases for the corresponding -mcpu= option.  They are provided for backwards compatibility.

       -mallregs
	   Allow  the  compiler to use all of the available registers.	By default registers "r24..r31" are reserved for use
	   in interrupt handlers.  With this option enabled these registers can be used in ordinary functions as well.

       -m64bit-doubles
       -m32bit-doubles
	   Make the "double" data type be 64 bits (-m64bit-doubles) or 32 bits (-m32bit-doubles) in size.   The	 default  is
	   -m32bit-doubles.

       -msave-mduc-in-interrupts
       -mno-save-mduc-in-interrupts
	   Specifies  that interrupt handler functions should preserve the MDUC registers.  This is only necessary if normal
	   code might use the MDUC registers, for example because it performs multiplication and division  operations.	 The
	   default  is	to  ignore  the MDUC registers as this makes the interrupt handlers faster.  The target option -mg13
	   needs to be passed for this to work as this feature is only available on the G13  target  (S2  core).   The	MDUC
	   registers will only be saved if the interrupt handler performs a multiplication or division operation or it calls
	   another function.

       IBM RS/6000 and PowerPC Options

       These -m options are defined for the IBM RS/6000 and PowerPC:

       -mpowerpc-gpopt
       -mno-powerpc-gpopt
       -mpowerpc-gfxopt
       -mno-powerpc-gfxopt
       -mpowerpc64
       -mno-powerpc64
       -mmfcrf
       -mno-mfcrf
       -mpopcntb
       -mno-popcntb
       -mpopcntd
       -mno-popcntd
       -mfprnd
       -mno-fprnd
       -mcmpb
       -mno-cmpb
       -mhard-dfp
       -mno-hard-dfp
	   You	use  these  options to specify which instructions are available on the processor you are using.	 The default
	   value of these options  is  determined  when	 configuring  GCC.   Specifying	 the  -mcpu=cpu_type  overrides	 the
	   specification  of  these  options.  We recommend you use the -mcpu=cpu_type option rather than the options listed
	   above.

	   Specifying -mpowerpc-gpopt allows GCC to use the  optional  PowerPC	architecture  instructions  in	the  General
	   Purpose  group, including floating-point square root.  Specifying -mpowerpc-gfxopt allows GCC to use the optional
	   PowerPC architecture instructions in the Graphics group, including floating-point select.

	   The -mmfcrf option allows GCC to generate the move from condition register field instruction implemented  on	 the
	   POWER4  processor  and other processors that support the PowerPC V2.01 architecture.	 The -mpopcntb option allows
	   GCC to generate the popcount and double-precision FP reciprocal estimate instruction implemented  on	 the  POWER5
	   processor  and  other processors that support the PowerPC V2.02 architecture.  The -mpopcntd option allows GCC to
	   generate the popcount instruction implemented on the POWER7 processor  and  other  processors  that	support	 the
	   PowerPC  V2.06  architecture.   The	-mfprnd	 option	 allows GCC to generate the FP round to integer instructions
	   implemented on the POWER5+ processor and other processors that  support  the	 PowerPC  V2.03	 architecture.	 The
	   -mcmpb  option allows GCC to generate the compare bytes instruction implemented on the POWER6 processor and other
	   processors that support the PowerPC V2.05 architecture.  The -mhard-dfp option allows GCC to generate the decimal
	   floating-point instructions implemented on some POWER processors.

	   The -mpowerpc64 option allows GCC to generate the additional 64-bit instructions  that  are	found  in  the	full
	   PowerPC64 architecture and to treat GPRs as 64-bit, doubleword quantities.  GCC defaults to -mno-powerpc64.

       -mcpu=cpu_type
	   Set	architecture  type,  register  usage,  and  instruction	 scheduling  parameters	 for  machine type cpu_type.
	   Supported values for cpu_type are 401, 403, 405, 405fp, 440, 440fp, 464, 464fp, 476, 476fp, 505, 601,  602,	603,
	   603e,  604,	604e,  620,  630,  740,	 7400, 7450, 750, 801, 821, 823, 860, 970, 8540, a2, e300c2, e300c3, e500mc,
	   e500mc64, e5500, e6500, ec603e, G3, G4, G5, titan, power3, power4,  power5,	power5+,  power6,  power6x,  power7,
	   power8, power9, power10, power11, powerpc, powerpc64, powerpc64le, rs64, and native.

	   -mcpu=powerpc,  -mcpu=powerpc64,  and  -mcpu=powerpc64le  specify pure 32-bit PowerPC (either endian), 64-bit big
	   endian PowerPC and 64-bit little  endian  PowerPC  architecture  machine  types,  with  an  appropriate,  generic
	   processor model assumed for scheduling purposes.

	   Specifying  native as cpu type detects and selects the architecture option that corresponds to the host processor
	   of the system performing the compilation.  -mcpu=native has no effect if GCC does not recognize the processor.

	   The other options specify a specific processor.  Code generated under those options runs best on that  processor,
	   and may not run at all on others.

	   The -mcpu options automatically enable or disable the following options:

	   -maltivec	-mfprnd	   -mhard-float	  -mmfcrf   -mmultiple	-mpopcntb   -mpopcntd	-mpowerpc64  -mpowerpc-gpopt
	   -mpowerpc-gfxopt   -mmulhw	 -mdlmzb    -mmfpgpr	-mvsx	-mcrypto    -mhtm    -mpower8-fusion   -mquad-memory
	   -mquad-memory-atomic	 -mfloat128 -mfloat128-hardware -mprefixed -mpcrel -mmma -mrop-protect

	   The	particular  options  set  for any particular CPU varies between compiler versions, depending on what setting
	   seems to produce optimal code for that CPU; it doesn't necessarily reflect the  actual  hardware's  capabilities.
	   If  you  wish  to set an individual option to a particular value, you may specify it after the -mcpu option, like
	   -mcpu=970 -mno-altivec.

	   On AIX, the -maltivec and -mpowerpc64 options are not enabled or disabled by the -mcpu option at present  because
	   AIX	does  not  have full support for these options.	 You may still enable or disable them individually if you're
	   sure it'll work in your environment.

       -mtune=cpu_type
	   Set the instruction scheduling parameters for machine type cpu_type, but do not  set	 the  architecture  type  or
	   register  usage, as -mcpu=cpu_type does.  The same values for cpu_type are used for -mtune as for -mcpu.  If both
	   are specified, the code generated uses the architecture and registers set by -mcpu, but the scheduling parameters
	   set by -mtune.

       -mcmodel=small
	   Generate PowerPC64 code for the small model: The TOC is limited to 64k.

       -mcmodel=medium
	   Generate PowerPC64 code for the medium model: The TOC and other static data may be up to a total of 4G  in  size.
	   This is the default for 64-bit Linux.

       -mcmodel=large
	   Generate  PowerPC64	code  for  the	large  model:  The TOC may be up to 4G in size.	 Other data and code is only
	   limited by the 64-bit address space.

       -maltivec
       -mno-altivec
	   Generate code that uses (does not use) AltiVec instructions, and also enable the use of built-in  functions	that
	   allow  more	direct	access to the AltiVec instruction set.	You may also need to set -mabi=altivec to adjust the
	   current ABI with AltiVec ABI enhancements.

	   When -maltivec is used, the element	order  for  AltiVec  intrinsics	 such  as  "vec_splat",	 "vec_extract",	 and
	   "vec_insert"	 match	array  element	order  corresponding to the endianness of the target.  That is, element zero
	   identifies the leftmost element in a vector register when targeting a big-endian  platform,	and  identifies	 the
	   rightmost element in a vector register when targeting a little-endian platform.

       -mvrsave
       -mno-vrsave
	   Generate VRSAVE instructions when generating AltiVec code.

       -msecure-plt
	   Generate  code  that allows ld and ld.so to build executables and shared libraries with non-executable ".plt" and
	   ".got" sections.  This is a PowerPC 32-bit SYSV ABI option.

       -mbss-plt
	   Generate code that uses a BSS ".plt" section that ld.so fills in, and requires ".plt" and  ".got"  sections	that
	   are both writable and executable.  This is a PowerPC 32-bit SYSV ABI option.

       -msplit-patch-nops
	   When	 adding	 NOPs for a patchable area via the -fpatchable-function-entry option emit the "before" NOPs in front
	   of the global entry point and the "after" NOPs after the local entry point.	This makes the sequence of NOPs	 not
	   consecutive when a global entry point is generated.	Without this option the NOPs are emitted directly before and
	   after  the  local entry point, making them consecutive but moving global and local entry point further apart.  If
	   only a single entry point is generated this option has no effect.

       -misel
       -mno-isel
	   This switch enables or disables the generation of ISEL instructions.

       -mvsx
       -mno-vsx
	   Generate code that uses (does not use) vector/scalar (VSX) instructions, and also  enable  the  use	of  built-in
	   functions that allow more direct access to the VSX instruction set.

       -mcrypto
       -mno-crypto
	   Enable  the	use  (disable)	of the built-in functions that allow direct access to the cryptographic instructions
	   that were added in version 2.07 of the PowerPC ISA.

       -mhtm
       -mno-htm
	   Enable (disable) the use of the built-in functions that allow direct access to the Hardware Transactional  Memory
	   (HTM) instructions that were added in version 2.07 of the PowerPC ISA.

       -mpower8-fusion
       -mno-power8-fusion
	   Generate  code that keeps (does not keeps) some integer operations adjacent so that the instructions can be fused
	   together on power8 and later processors.

       -mquad-memory
       -mno-quad-memory
	   Generate code that uses (does not use) the non-atomic quad word memory instructions.	  The  -mquad-memory  option
	   requires use of 64-bit mode.

       -mquad-memory-atomic
       -mno-quad-memory-atomic
	   Generate code that uses (does not use) the atomic quad word memory instructions.  The -mquad-memory-atomic option
	   requires use of 64-bit mode.

       -mfloat128
       -mno-float128
	   Enable/disable  the __float128 keyword for IEEE 128-bit floating point and use either software emulation for IEEE
	   128-bit floating point or hardware instructions.

	   The VSX instruction set (-mvsx) must be enabled to use the IEEE 128-bit floating point support.  The IEEE 128-bit
	   floating point is only supported on Linux.

	   The default for -mfloat128 is enabled on PowerPC Linux systems using the VSX instruction  set,  and	disabled  on
	   other systems.

	   If you use the ISA 3.0 instruction set (-mcpu=power9) on a 64-bit system, the IEEE 128-bit floating point support
	   will	 also  enable  the generation of ISA 3.0 IEEE 128-bit floating point instructions.  Otherwise, if you do not
	   specify to generate ISA 3.0 instructions or you are targeting a 32-bit big endian system, IEEE  128-bit  floating
	   point will be done with software emulation.

       -mfloat128-hardware
       -mno-float128-hardware
	   Enable/disable using ISA 3.0 hardware instructions to support the __float128 data type.

	   The	default	 for  -mfloat128-hardware is enabled on PowerPC Linux systems using the ISA 3.0 instruction set, and
	   disabled on other systems.

       -m32
       -m64
	   Generate code for 32-bit or 64-bit environments of Darwin and SVR4 targets  (including  GNU/Linux).	 The  32-bit
	   environment	sets  int,  long  and  pointer	to 32 bits and generates code that runs on any PowerPC variant.	 The
	   64-bit environment sets int to 32 bits and long and pointer to 64 bits, and generates code for PowerPC64, as	 for
	   -mpowerpc64.

       -mfull-toc
       -mno-fp-in-toc
       -mno-sum-in-toc
       -mminimal-toc
	   Modify  generation  of  the	TOC (Table Of Contents), which is created for every executable file.  The -mfull-toc
	   option is selected by default.  In that case, GCC allocates at least one TOC entry for each unique  non-automatic
	   variable  reference	in your program.  GCC also places floating-point constants in the TOC.	However, only 16,384
	   entries are available in the TOC.

	   If you receive a linker error message that saying you have overflowed the available TOC space, you can reduce the
	   amount of TOC space used with the -mno-fp-in-toc and -mno-sum-in-toc options.  -mno-fp-in-toc prevents  GCC	from
	   putting  floating-point constants in the TOC and -mno-sum-in-toc forces GCC to generate code to calculate the sum
	   of an address and a constant at run time instead of putting that sum into the TOC.  You may specify one  or	both
	   of  these  options.	Each causes GCC to produce very slightly slower and larger code at the expense of conserving
	   TOC space.

	   If you still run out of space in the TOC even when you specify  both	 of  these  options,  specify  -mminimal-toc
	   instead.   This  option  causes GCC to make only one TOC entry for every file.  When you specify this option, GCC
	   produces code that is slower and larger but which uses extremely little TOC space.  You  may	 wish  to  use	this
	   option only on files that contain less frequently-executed code.

       -maix64
       -maix32
	   Enable  64-bit AIX ABI and calling convention: 64-bit pointers, 64-bit "long" type, and the infrastructure needed
	   to support them.  Specifying -maix64 implies -mpowerpc64, while -maix32  disables  the  64-bit  ABI	and  implies
	   -mno-powerpc64.  GCC defaults to -maix32.

       -mxl-compat
       -mno-xl-compat
	   Produce  code  that	conforms  more	closely	 to  IBM  XL compiler semantics when using AIX-compatible ABI.	Pass
	   floating-point arguments to prototyped functions beyond the register save area (RSA) on the stack in addition  to
	   argument  FPRs.  Do not assume that most significant double in 128-bit long double value is properly rounded when
	   comparing values and converting to double.  Use XL symbol names for long double support routines.

	   The AIX calling convention was extended but not initially documented to handle an obscure K&R C case of calling a
	   function that takes the address of its arguments with fewer arguments than declared.	  IBM  XL  compilers  access
	   floating-point  arguments  that  do	not  fit  in  the  RSA	from the stack when a subroutine is compiled without
	   optimization.  Because always storing floating-point arguments on the stack is  inefficient	and  rarely  needed,
	   this option is not enabled by default and only is necessary when calling subroutines compiled by IBM XL compilers
	   without optimization.

       -mpe
	   Support  IBM	 RS/6000  SP  Parallel	Environment  (PE).   Link an application written to use message passing with
	   special startup code to enable the application to run.  The	system	must  have  PE	installed  in  the  standard
	   location  (/usr/lpp/ppe.poe/),  or  the  specs  file	 must  be  overridden with the -specs= option to specify the
	   appropriate directory location.  The Parallel Environment does not support threads, so the -mpe  option  and	 the
	   -pthread option are incompatible.

       -malign-natural
       -malign-power
	   On  AIX,  32-bit  Darwin,  and  64-bit  PowerPC  GNU/Linux,	the option -malign-natural overrides the ABI-defined
	   alignment of larger types, such as floating-point doubles, on their	natural	 size-based  boundary.	 The  option
	   -malign-power  instructs GCC to follow the ABI-specified alignment rules.  GCC defaults to the standard alignment
	   defined in the ABI.

	   On 64-bit Darwin, natural alignment is the default, and -malign-power is not supported.

       -msoft-float
       -mhard-float
	   Generate code that does not use (uses) the floating-point register set.   Software  floating-point  emulation  is
	   provided if you use the -msoft-float option, and pass the option to GCC when linking.

       -mmultiple
       -mno-multiple
	   Generate  code  that	 uses  (does  not  use)	 the  load  multiple  word  instructions and the store multiple word
	   instructions.  These instructions are generated by default  on  POWER  systems,  and	 not  generated	 on  PowerPC
	   systems.   Do  not use -mmultiple on little-endian PowerPC systems, since those instructions do not work when the
	   processor is in little-endian mode.	The exceptions are PPC740 and PPC750  which  permit  these  instructions  in
	   little-endian mode.

       -mupdate
       -mno-update
	   Generate  code  that	 uses  (does  not  use)	 the load or store instructions that update the base register to the
	   address of the calculated memory location.  These instructions are generated by default.  If you use -mno-update,
	   there is a small window between the time that the stack pointer is updated and the address of the previous  frame
	   is stored, which means code that walks the stack frame across interrupts or signals may get corrupted data.

       -mavoid-indexed-addresses
       -mno-avoid-indexed-addresses
	   Generate  code  that tries to avoid (not avoid) the use of indexed load or store instructions. These instructions
	   can incur a performance penalty on Power6 processors in certain situations, such as when stepping  through  large
	   arrays  that	 cross	a  16M	boundary.   This  option  is  enabled  by default when targeting Power6 and disabled
	   otherwise.

       -mfused-madd
       -mno-fused-madd
	   Generate code that  uses  (does  not	 use)  the  floating-point  multiply  and  accumulate  instructions.   These
	   instructions	 are  generated	 by  default if hardware floating point is used.  The machine-dependent -mfused-madd
	   option is now mapped to the machine-independent -ffp-contract=fast  option,	and  -mno-fused-madd  is  mapped  to
	   -ffp-contract=off.

       -mmulhw
       -mno-mulhw
	   Generate  code  that	 uses  (does not use) the half-word multiply and multiply-accumulate instructions on the IBM
	   405, 440, 464 and 476 processors.  These instructions are generated by default when targeting those processors.

       -mdlmzb
       -mno-dlmzb
	   Generate code that uses (does not use) the string-search dlmzb instruction on the  IBM  405,	 440,  464  and	 476
	   processors.	This instruction is generated by default when targeting those processors.

       -mno-bit-align
       -mbit-align
	   On  System V.4 and embedded PowerPC systems do not (do) force structures and unions that contain bit-fields to be
	   aligned to the base type of the bit-field.

	   For example, by default a structure containing nothing but 8 "unsigned" bit-fields of length 1 is  aligned  to  a
	   4-byte  boundary  and  has  a  size	of  4  bytes.  By using -mno-bit-align, the structure is aligned to a 1-byte
	   boundary and is 1 byte in size.

       -mno-strict-align
       -mstrict-align
	   On System V.4 and embedded PowerPC systems do not (do) assume that unaligned memory references are handled by the
	   system.

       -mrelocatable
       -mno-relocatable
	   Generate code that allows (does not allow) a static executable to be relocated to  a	 different  address  at	 run
	   time.   A  simple  embedded	PowerPC	 system	 loader	 should	 relocate  the entire contents of ".got2" and 4-byte
	   locations listed in the ".fixup" section, a table of 32-bit addresses generated by  this  option.   For  this  to
	   work,  all  objects linked together must be compiled with -mrelocatable or -mrelocatable-lib.  -mrelocatable code
	   aligns the stack to an 8-byte boundary.

       -mrelocatable-lib
       -mno-relocatable-lib
	   Like -mrelocatable, -mrelocatable-lib generates a ".fixup" section to allow static executables to be relocated at
	   run time, but -mrelocatable-lib does not use the smaller stack alignment of -mrelocatable.  Objects compiled with
	   -mrelocatable-lib may be linked with objects compiled with any combination of the -mrelocatable options.

       -mno-toc
       -mtoc
	   On System V.4 and embedded PowerPC systems do not (do) assume that register 2 contains a pointer to a global area
	   pointing to the addresses used in the program.

       -mlittle
       -mlittle-endian
	   On System V.4 and  embedded	PowerPC	 systems  compile  code	 for  the  processor  in  little-endian	 mode.	 The
	   -mlittle-endian option is the same as -mlittle.

       -mbig
       -mbig-endian
	   On  System  V.4 and embedded PowerPC systems compile code for the processor in big-endian mode.  The -mbig-endian
	   option is the same as -mbig.

       -mdynamic-no-pic
	   On Darwin / macOS systems, compile code so that it is not relocatable,  but	that  its  external  references	 are
	   relocatable.	 The resulting code is suitable for applications, but not shared libraries.

       -msingle-pic-base
	   Treat  the  register	 used  for  PIC	 addressing  as	 read-only,  rather than loading it in the prologue for each
	   function.  The runtime system is responsible for initializing this register	with  an  appropriate  value  before
	   execution begins.

       -mprioritize-restricted-insns=priority
	   This	 option	 controls  the	priority that is assigned to dispatch-slot restricted instructions during the second
	   scheduling pass.  The argument priority takes the value 0, 1, or 2  to  assign  no,	highest,  or  second-highest
	   (respectively) priority to dispatch-slot restricted instructions.

       -msched-costly-dep=dependence_type
	   This	 option	 controls  which dependences are considered costly by the target during instruction scheduling.	 The
	   argument dependence_type takes one of the following values:

	   no  No dependence is costly.

	   all All dependences are costly.

	   true_store_to_load
	       A true dependence from store to load is costly.

	   store_to_load
	       Any dependence from store to load is costly.

	   number
	       Any dependence for which the latency is greater than or equal to number is costly.

       -minsert-sched-nops=scheme
	   This option controls which NOP insertion scheme is used during the second scheduling pass.  The  argument  scheme
	   takes one of the following values:

	   no  Don't insert NOPs.

	   pad Pad with NOPs any dispatch group that has vacant issue slots, according to the scheduler's grouping.

	   regroup_exact
	       Insert  NOPs  to force costly dependent insns into separate groups.  Insert exactly as many NOPs as needed to
	       force an insn to a new group, according to the estimated processor grouping.

	   number
	       Insert NOPs to force costly dependent insns into separate groups.  Insert number NOPs to force an insn  to  a
	       new group.

       -mcall-sysv
	   On  System  V.4 and embedded PowerPC systems compile code using calling conventions that adhere to the March 1995
	   draft of the System V Application Binary Interface, PowerPC processor supplement.  This is the default unless you
	   configured GCC using powerpc-*-eabiaix.

       -mcall-sysv-eabi
       -mcall-eabi
	   Specify both -mcall-sysv and -meabi options.

       -mcall-sysv-noeabi
	   Specify both -mcall-sysv and -mno-eabi options.

       -mcall-aixdesc
	   On System V.4 and embedded PowerPC systems compile code for the AIX operating system.

       -mcall-linux
	   On System V.4 and embedded PowerPC systems compile code for the Linux-based GNU system.

       -mcall-freebsd
	   On System V.4 and embedded PowerPC systems compile code for the FreeBSD operating system.

       -mcall-netbsd
	   On System V.4 and embedded PowerPC systems compile code for the NetBSD operating system.

       -mcall-openbsd
	   On System V.4 and embedded PowerPC systems compile code for the OpenBSD operating system.

       -mtraceback=traceback_type
	   Select the type of traceback table. Valid values for traceback_type are full, part, and no.

       -maix-struct-return
	   Return all structures in memory (as specified by the AIX ABI).

       -msvr4-struct-return
	   Return structures smaller than 8 bytes in registers (as specified by the SVR4 ABI).

       -mabi=abi-type
	   Extend the current ABI with a particular extension, or remove such extension.  Valid	 values	 are:  altivec,	 no-
	   altivec, ibmlongdouble, ieeelongdouble, elfv1, elfv2, and for AIX: vec-extabi, vec-default.

       -mabi=ibmlongdouble
	   Change  the	current	 ABI  to  use IBM extended-precision long double.  This is not likely to work if your system
	   defaults to using IEEE extended-precision long double.  If you change the long double type  from  IEEE  extended-
	   precision,  the compiler issues a warning unless you use the -Wno-psabi option.  Requires -mlong-double-128 to be
	   enabled.

       -mabi=ieeelongdouble
	   Change the current ABI to use IEEE extended-precision long double.  This is not likely to  work  if	your  system
	   defaults  to	 using	IBM  extended-precision	 long double.  If you change the long double type from IBM extended-
	   precision, the compiler issues a warning unless you use the -Wno-psabi option.  Requires -mlong-double-128 to  be
	   enabled.

       -mabi=elfv1
	   Change  the	current	 ABI  to  use  the  ELFv1 ABI.	This is the default ABI for big-endian PowerPC 64-bit Linux.
	   Overriding the default ABI requires special system support and is likely to fail in spectacular ways.

       -mabi=elfv2
	   Change the current ABI to use the ELFv2 ABI.	 This is the default ABI for  little-endian  PowerPC  64-bit  Linux.
	   Overriding the default ABI requires special system support and is likely to fail in spectacular ways.

       -mgnu-attribute
       -mno-gnu-attribute
	   Emit	 .gnu_attribute	 assembly  directives  to  set tag/value pairs in a .gnu.attributes section that specify ABI
	   variations in function parameters or return values.

       -mprototype
       -mno-prototype
	   On System V.4 and embedded PowerPC systems assume that all calls to	variable  argument  functions  are  properly
	   prototyped.	 Otherwise, the compiler must insert an instruction before every non-prototyped call to set or clear
	   bit 6 of the condition code register ("CR") to indicate whether floating-point values are passed in the floating-
	   point registers in case the function takes variable	arguments.   With  -mprototype,	 only  calls  to  prototyped
	   variable argument functions set or clear the bit.

       -msim
	   On  embedded	 PowerPC  systems,  assume  that  the  startup	module	is called sim-crt0.o and that the standard C
	   libraries are libsim.a and libc.a.  This is the default for powerpc-*-eabisim configurations.

       -mmvme
	   On embedded PowerPC systems, assume that the startup module is called crt0.o and the	 standard  C  libraries	 are
	   libmvme.a and libc.a.

       -mads
	   On  embedded	 PowerPC  systems,  assume that the startup module is called crt0.o and the standard C libraries are
	   libads.a and libc.a.

       -myellowknife
	   On embedded PowerPC systems, assume that the startup module is called crt0.o and the	 standard  C  libraries	 are
	   libyk.a and libc.a.

       -mvxworks
	   On System V.4 and embedded PowerPC systems, specify that you are compiling for a VxWorks system.

       -memb
	   On  embedded	 PowerPC  systems,  set	 the  "PPC_EMB"	 bit  in the ELF flags header to indicate that eabi extended
	   relocations are used.

       -meabi
       -mno-eabi
	   On System V.4 and embedded PowerPC systems do (do not) adhere  to  the  Embedded  Applications  Binary  Interface
	   (EABI),  which is a set of modifications to the System V.4 specifications.  Selecting -meabi means that the stack
	   is aligned to an 8-byte boundary, a function "__eabi" is called from "main" to set up the EABI  environment,	 and
	   the	-msdata	 option	 can use both "r2" and "r13" to point to two separate small data areas.	 Selecting -mno-eabi
	   means that the stack is aligned to a 16-byte boundary, no EABI initialization function is called from "main", and
	   the -msdata option only uses "r13" to point to a single small data area.  The -meabi option is on by	 default  if
	   you configured GCC using one of the powerpc*-*-eabi* options.

       -msdata=eabi
	   On System V.4 and embedded PowerPC systems, put small initialized "const" global and static data in the ".sdata2"
	   section,  which  is pointed to by register "r2".  Put small initialized non-"const" global and static data in the
	   ".sdata" section, which is pointed to by register "r13".  Put small uninitialized global and static data  in	 the
	   ".sbss"  section,  which  is	 adjacent to the ".sdata" section.  The -msdata=eabi option is incompatible with the
	   -mrelocatable option.  The -msdata=eabi option also sets the -memb option.

       -msdata=sysv
	   On System V.4 and embedded PowerPC systems, put small global and static data in the ".sdata"	 section,  which  is
	   pointed  to	by  register "r13".  Put small uninitialized global and static data in the ".sbss" section, which is
	   adjacent to the ".sdata" section.  The -msdata=sysv option is incompatible with the -mrelocatable option.

       -msdata=default
       -msdata
	   On System V.4 and embedded PowerPC systems, if -meabi is used, compile code the same as  -msdata=eabi,  otherwise
	   compile code the same as -msdata=sysv.

       -msdata=data
	   On  System  V.4  and	 embedded  PowerPC  systems,  put  small  global  data	in  the ".sdata" section.  Put small
	   uninitialized global data in the ".sbss" section.  Do not use register "r13" to address small data however.	This
	   is the default behavior unless other -msdata options are used.

       -msdata=none
       -mno-sdata
	   On embedded PowerPC systems, put all initialized  global  and  static  data	in  the	 ".data"  section,  and	 all
	   uninitialized data in the ".bss" section.

       -mreadonly-in-sdata
	   Put read-only objects in the ".sdata" section as well.  This is the default.

       -mblock-move-inline-limit=num
	   Inline  all	block  moves  (such  as calls to "memcpy" or structure copies) less than or equal to num bytes.	 The
	   minimum value for num is 32 bytes on 32-bit targets and 64 bytes on 64-bit targets.	The default value is target-
	   specific.

       -mblock-compare-inline-limit=num
	   Generate non-looping inline code for all block compares (such as calls to "memcmp" or  structure  compares)	less
	   than	 or  equal to num bytes. If num is 0, all inline expansion (non-loop and loop) of block compare is disabled.
	   The default value is target-specific.

       -mblock-compare-inline-loop-limit=num
	   Generate an inline expansion using loop code for all block compares that are less than or equal to num bytes, but
	   greater than the limit for non-loop inline block compare expansion. If the block length is not constant, at	most
	   num	bytes will be compared before "memcmp" is called to compare the remainder of the block. The default value is
	   target-specific.

       -mstring-compare-inline-limit=num
	   Compare at most num string bytes with inline code.  If the difference or end of string is not found at the end of
	   the inline compare a call to "strcmp" or "strncmp" will take care of the rest of the comparison. The	 default  is
	   64 bytes.

       -G num
	   On  embedded	 PowerPC systems, put global and static items less than or equal to num bytes into the small data or
	   BSS sections instead of the normal data or BSS section.  By default, num is 8.  The -G num switch is also  passed
	   to the linker.  All modules should be compiled with the same -G num value.

       -mregnames
       -mno-regnames
	   On  System V.4 and embedded PowerPC systems do (do not) emit register names in the assembly language output using
	   symbolic forms.

       -mlongcall
       -mno-longcall
	   By default assume that all calls are far away so that a longer and more expensive calling sequence  is  required.
	   This	 is required for calls farther than 32 megabytes (33,554,432 bytes) from the current location.	A short call
	   is generated if the compiler knows the call cannot be that far away.	 This  setting	can  be	 overridden  by	 the
	   "shortcall" function attribute, or by #pragma longcall(0).

	   Some	 linkers are capable of detecting out-of-range calls and generating glue code on the fly.  On these systems,
	   long calls are unnecessary and generate slower code.	 As of this writing, the AIX linker can do this, as can	 the
	   GNU	linker	for  PowerPC/64.   It is planned to add this feature to the GNU linker for 32-bit PowerPC systems as
	   well.

	   On PowerPC64 ELFv2 and 32-bit PowerPC systems with newer GNU linkers, GCC can generate long calls using an inline
	   PLT call sequence (see -mpltseq).  PowerPC with -mbss-plt and PowerPC64 ELFv1 (big-endian) do not support  inline
	   PLT calls.

	   On  Darwin/PPC  systems,  "#pragma longcall" generates "jbsr callee, L42", plus a branch island (glue code).	 The
	   two target addresses represent the callee and the branch island.  The Darwin/PPC linker prefers the first address
	   and generates a "bl callee" if the PPC "bl" instruction  reaches  the  callee  directly;  otherwise,	 the  linker
	   generates "bl L42" to call the branch island.  The branch island is appended to the body of the calling function;
	   it computes the full 32-bit address of the callee and jumps to it.

	   On  Mach-O  (Darwin)	 systems,  this	 option directs the compiler emit to the glue for every direct call, and the
	   Darwin linker decides whether to use or discard it.

	   In the future, GCC may ignore all longcall specifications when the linker is known to generate glue.

       -mpltseq
       -mno-pltseq
	   Implement (do not implement) -fno-plt and long calls using an inline PLT call sequence that supports lazy linking
	   and long calls to functions in dlopen'd shared libraries.  Inline PLT calls are only supported on PowerPC64 ELFv2
	   and 32-bit PowerPC systems with newer GNU linkers, and are enabled by default if the	 support  is  detected	when
	   configuring GCC, and, in the case of 32-bit PowerPC, if GCC is configured with --enable-secureplt.  -mpltseq code
	   and -mbss-plt 32-bit PowerPC relocatable objects may not be linked together.

       -mtls-markers
       -mno-tls-markers
	   Mark	 (do not mark) calls to "__tls_get_addr" with a relocation specifying the function argument.  The relocation
	   allows the linker to reliably associate function call with argument	setup  instructions  for  TLS  optimization,
	   which in turn allows GCC to better schedule the sequence.

       -mrecip
       -mno-recip
	   This	 option	 enables  use  of  the	reciprocal  estimate  and  reciprocal square root estimate instructions with
	   additional Newton-Raphson steps to increase precision instead of doing a divide or square  root  and	 divide	 for
	   floating-point   arguments.	  You	should	 use  the  -ffast-math	option	when  using  -mrecip  (or  at  least
	   -funsafe-math-optimizations, -ffinite-math-only, -freciprocal-math and -fno-trapping-math).	Note that while	 the
	   throughput  of  the	sequence  is  generally	 higher	 than  the throughput of the non-reciprocal instruction, the
	   precision of the sequence can be decreased by up to 2 ulp  (i.e.  the  inverse  of  1.0  equals  0.99999994)	 for
	   reciprocal square roots.

       -mrecip=opt
	   This	 option	 controls  which  reciprocal  estimate	instructions  may be used.  opt is a comma-separated list of
	   options, which may be preceded by a "!" to invert the option:

	   all Enable all estimate instructions.

	   default
	       Enable the default instructions, equivalent to -mrecip.

	   none
	       Disable all estimate instructions, equivalent to -mno-recip.

	   div Enable the reciprocal approximation instructions for both single and double precision.

	   divf
	       Enable the single-precision reciprocal approximation instructions.

	   divd
	       Enable the double-precision reciprocal approximation instructions.

	   rsqrt
	       Enable the reciprocal square root approximation instructions for both single and double precision.

	   rsqrtf
	       Enable the single-precision reciprocal square root approximation instructions.

	   rsqrtd
	       Enable the double-precision reciprocal square root approximation instructions.

	   So, for example, -mrecip=all,!rsqrtd enables	 all  of  the  reciprocal  estimate  instructions,  except  for	 the
	   "FRSQRTE",  "XSRSQRTEDP",  and "XVRSQRTEDP" instructions which handle the double-precision reciprocal square root
	   calculations.

       -mrecip-precision
       -mno-recip-precision
	   Assume (do not assume) that the reciprocal estimate	instructions  provide  higher-precision	 estimates  than  is
	   mandated  by	 the  PowerPC  ABI.   Selecting	 -mcpu=power6,	-mcpu=power7  or  -mcpu=power8 automatically selects
	   -mrecip-precision.  The double-precision square root estimate instructions are not generated by default  on	low-
	   precision machines, since they do not provide an estimate that converges after three steps.

       -mveclibabi=type
	   Specifies  the  ABI type to use for vectorizing intrinsics using an external library.  The only type supported at
	   present is mass,  which  specifies  to  use	IBM's  Mathematical  Acceleration  Subsystem  (MASS)  libraries	 for
	   vectorizing	intrinsics  using  external  libraries.	 GCC currently emits calls to "acosd2", "acosf4", "acoshd2",
	   "acoshf4", "asind2",	 "asinf4",  "asinhd2",	"asinhf4",  "atan2d2",	"atan2f4",  "atand2",  "atanf4",  "atanhd2",
	   "atanhf4",  "cbrtd2",  "cbrtf4",  "cosd2",  "cosf4",	 "coshd2",  "coshf4",  "erfcd2", "erfcf4", "erfd2", "erff4",
	   "exp2d2", "exp2f4",	"expd2",  "expf4",  "expm1d2",	"expm1f4",  "hypotd2",	"hypotf4",  "lgammad2",	 "lgammaf4",
	   "log10d2",  "log10f4",  "log1pd2",  "log1pf4",  "log2d2",  "log2f4", "logd2", "logf4", "powd2", "powf4", "sind2",
	   "sinf4", "sinhd2", "sinhf4", "sqrtd2", "sqrtf4", "tand2", "tanf4", "tanhd2", and "tanhf4"  when  generating	code
	   for power7.	Both -ftree-vectorize and -funsafe-math-optimizations must also be enabled.  The MASS libraries must
	   be specified at link time.

       -mfriz
       -mno-friz
	   Generate (do not generate) the "friz" instruction when the -funsafe-math-optimizations option is used to optimize
	   rounding  of floating-point values to 64-bit integer and back to floating point.  The "friz" instruction does not
	   return the same value if the floating-point number is too large to fit in an integer.

       -mpointers-to-nested-functions
       -mno-pointers-to-nested-functions
	   Generate (do not generate) code to load up the static chain register ("r11") when calling through  a	 pointer  on
	   AIX	and 64-bit Linux systems where a function pointer points to a 3-word descriptor giving the function address,
	   TOC value to be loaded in  register	"r2",  and  static  chain  value  to  be  loaded  in  register	"r11".	 The
	   -mpointers-to-nested-functions  is  on  by  default.	  You  cannot  call  through pointers to nested functions or
	   pointers  to	  functions   compiled	 in   other   languages	  that	 use   the   static   chain   if   you	 use
	   -mno-pointers-to-nested-functions.

       -msave-toc-indirect
       -mno-save-toc-indirect
	   Generate  (do not generate) code to save the TOC value in the reserved stack location in the function prologue if
	   the function calls through a pointer on AIX and 64-bit Linux systems.  If the TOC  value  is	 not  saved  in	 the
	   prologue,  it  is  saved  just  before  the	call  through the pointer.  The -mno-save-toc-indirect option is the
	   default.

       -mcompat-align-parm
       -mno-compat-align-parm
	   Generate (do not generate) code  to	pass  structure	 parameters  with  a  maximum  alignment  of  64  bits,	 for
	   compatibility with older versions of GCC.

	   Older versions of GCC (prior to 4.9.0) incorrectly did not align a structure parameter on a 128-bit boundary when
	   that structure contained a member requiring 128-bit alignment.  This is corrected in more recent versions of GCC.
	   This option may be used to generate code that is compatible with functions compiled with older versions of GCC.

	   The -mno-compat-align-parm option is the default.

       -mstack-protector-guard=guard
       -mstack-protector-guard-reg=reg
       -mstack-protector-guard-offset=offset
	   Generate  stack  protection	code using canary at guard.  Supported locations are global for global canary or tls
	   for per-thread canary in the TLS block (the default with GNU libc version 2.4 or later).

	   With the latter choice  the	options	 -mstack-protector-guard-reg=reg  and  -mstack-protector-guard-offset=offset
	   furthermore specify which register to use as base register for reading the canary, and from what offset from that
	   base register. The default for those is as specified in the relevant ABI.

       -mpcrel
       -mno-pcrel
	   Generate  (do  not  generate)  pc-relative  addressing.   The  -mpcrel option requires that the medium code model
	   (-mcmodel=medium) and prefixed addressing (-mprefixed) options are enabled.

       -mprefixed
       -mno-prefixed
	   Generate (do not generate) addressing modes using prefixed load and store instructions.   The  -mprefixed  option
	   requires that the option -mcpu=power10 (or later) is enabled.

       -mmma
       -mno-mma
	   Generate  (do  not  generate)  the  MMA instructions.  The -mma option requires that the option -mcpu=power10 (or
	   later) is enabled.

       -mrop-protect
       -mno-rop-protect
	   Generate (do not generate) ROP protection instructions when the target processor supports them.   Currently	this
	   option disables the shrink-wrap optimization (-fshrink-wrap).

       -mprivileged
       -mno-privileged
	   Generate (do not generate) code that will run in privileged state.

       -mblock-ops-unaligned-vsx
       -mno-block-ops-unaligned-vsx
	   Generate (do not generate) unaligned vsx loads and stores for inline expansion of "memcpy" and "memmove".

       --param rs6000-vect-unroll-limit=
	   The	vectorizer will check with target information to determine whether it would be beneficial to unroll the main
	   vectorized loop and by how much.  This parameter sets the upper bound of how much the vectorizer will unroll	 the
	   main loop.  The default value is four.

       RX Options

       These command-line options are defined for RX targets:

       -m64bit-doubles
       -m32bit-doubles
	   Make	 the  "double"	data type be 64 bits (-m64bit-doubles) or 32 bits (-m32bit-doubles) in size.  The default is
	   -m32bit-doubles.  Note RX floating-point hardware only works on 32-bit  values,  which  is  why  the	 default  is
	   -m32bit-doubles.

       -fpu
       -nofpu
	   Enables  (-fpu) or disables (-nofpu) the use of RX floating-point hardware.	The default is enabled for the RX600
	   series and disabled for the RX200 series.

	   Floating-point instructions are only generated for 32-bit floating-point values, however, so the FPU hardware  is
	   not used for doubles if the -m64bit-doubles option is used.

	   Note	 If  the  -fpu	option	is  enabled then -funsafe-math-optimizations is also enabled automatically.  This is
	   because the RX FPU instructions are themselves unsafe.

       -mcpu=name
	   Selects the type of RX CPU to be targeted.  Currently three types are supported,  the  generic  RX600  and  RX200
	   series hardware and the specific RX610 CPU.	The default is RX600.

	   The only difference between RX600 and RX610 is that the RX610 does not support the "MVTIPL" instruction.

	   The	RX200 series does not have a hardware floating-point unit and so -nofpu is enabled by default when this type
	   is selected.

       -mbig-endian-data
       -mlittle-endian-data
	   Store data (but not code) in the big-endian format.	The default is -mlittle-endian-data, i.e. to store  data  in
	   the little-endian format.

       -msmall-data-limit=N
	   Specifies  the maximum size in bytes of global and static variables which can be placed into the small data area.
	   Using the small data area can lead to smaller and faster code, but the size of area is limited and it  is  up  to
	   the	programmer to ensure that the area does not overflow.  Also when the small data area is used one of the RX's
	   registers (usually "r13") is reserved for use pointing to this area, so it is no longer available for use by	 the
	   compiler.  This could result in slower and/or larger code if variables are pushed onto the stack instead of being
	   held in this register.

	   Note,  common  variables  (variables	 that have not been initialized) and constants are not placed into the small
	   data area as they are assigned to other sections in the output executable.

	   The default value is zero, which disables this feature.  Note, this feature is not enabled by default with higher
	   optimization levels (-O2 etc) because of the potentially detrimental effects of reserving a register.  It  is  up
	   to  the  programmer	to  experiment	and  discover  whether this feature is of benefit to their program.  See the
	   description of the -mpid option for a description of how the actual register to hold the small data area  pointer
	   is chosen.

       -msim
       -mno-sim
	   Use the simulator runtime.  The default is to use the libgloss board-specific runtime.

       -mas100-syntax
       -mno-as100-syntax
	   When generating assembler output use a syntax that is compatible with Renesas's AS100 assembler.  This syntax can
	   also be handled by the GAS assembler, but it has some restrictions so it is not generated by default.

       -mmax-constant-size=N
	   Specifies the maximum size, in bytes, of a constant that can be used as an operand in a RX instruction.  Although
	   the RX instruction set does allow constants of up to 4 bytes in length to be used in instructions, a longer value
	   equates  to	a  longer  instruction.	  Thus	in  some  circumstances it can be beneficial to restrict the size of
	   constants that are used in instructions.  Constants that are too big are instead placed into a constant pool	 and
	   referenced via register indirection.

	   The	value  N  can  be  between  0  and  4.	A value of 0 (the default) or 4 means that constants of any size are
	   allowed.

       -mrelax
	   Enable linker relaxation.  Linker relaxation is a process whereby the linker attempts to reduce  the	 size  of  a
	   program by finding shorter versions of various instructions.	 Disabled by default.

       -mint-register=N
	   Specify  the	 number	 of registers to reserve for fast interrupt handler functions.	The value N can be between 0
	   and 4.  A value of 1 means that register "r13" is reserved for the exclusive use of fast interrupt  handlers.   A
	   value  of  2	 reserves  "r13" and "r12".  A value of 3 reserves "r13", "r12" and "r11", and a value of 4 reserves
	   "r13" through "r10".	 A value of 0, the default, does not reserve any registers.

       -msave-acc-in-interrupts
	   Specifies that interrupt handler functions should preserve the accumulator register.	 This is only  necessary  if
	   normal  code	 might	use  the  accumulator register, for example because it performs 64-bit multiplications.	 The
	   default is to ignore the accumulator as this makes the interrupt handlers faster.

       -mpid
       -mno-pid
	   Enables the generation of position independent data.	 When enabled any access to constant data  is  done  via  an
	   offset from a base address held in a register.  This allows the location of constant data to be determined at run
	   time	 without  requiring  the  executable to be relocated, which is a benefit to embedded applications with tight
	   memory constraints.	Data that can be modified is not affected by this option.

	   Note, using this feature reserves a register, usually "r13", for the constant data base address.  This can result
	   in slower and/or larger code, especially in complicated functions.

	   The actual register chosen to hold the constant data base address depends  upon  whether  the  -msmall-data-limit
	   and/or  the	-mint-register	command-line  options  are  enabled.   Starting	 with  register "r13" and proceeding
	   downwards, registers are allocated first to satisfy the requirements of -mint-register, then	 -mpid	and  finally
	   -msmall-data-limit.	Thus it is possible for the small data area register to be "r8" if both -mint-register=4 and
	   -mpid are specified on the command line.

	   By default this feature is not enabled.  The default can be restored via the -mno-pid command-line option.

       -mno-warn-multiple-fast-interrupts
       -mwarn-multiple-fast-interrupts
	   Prevents GCC from issuing a warning message if it finds more than one fast interrupt handler when it is compiling
	   a  file.   The default is to issue a warning for each extra fast interrupt handler found, as the RX only supports
	   one such interrupt.

       -mallow-string-insns
       -mno-allow-string-insns
	   Enables or disables the use of the string manipulation instructions "SMOVF", "SCMPU", "SMOVB", "SMOVU",  "SUNTIL"
	   "SWHILE"  and  also	the  "RMPA"  instruction.   These instructions may prefetch data, which is not safe to do if
	   accessing an I/O register.  (See section 12.2.7 of the RX62N Group User's Manual for more information).

	   The default is to allow these instructions, but it is not possible for GCC to reliably detect  all  circumstances
	   where  a  string  instruction  might	 be  used  to  access  an  I/O	register,  so  their  use cannot be disabled
	   automatically.  Instead it is reliant upon the programmer to use  the  -mno-allow-string-insns  option  if  their
	   program accesses I/O space.

	   When the instructions are enabled GCC defines the C preprocessor symbol "__RX_ALLOW_STRING_INSNS__", otherwise it
	   defines the symbol "__RX_DISALLOW_STRING_INSNS__".

       -mjsr
       -mno-jsr
	   Use	only  (or  not only) "JSR" instructions to access functions.  This option can be used when code size exceeds
	   the range of "BSR" instructions.  Note that -mno-jsr does not mean to not use "JSR" but instead  means  that	 any
	   type of branch may be used.

       Note:  The  generic  GCC	 command-line  option -ffixed-reg has special significance to the RX port when used with the
       "interrupt" function attribute.	This attribute indicates a  function  intended	to  process  fast  interrupts.	 GCC
       ensures that it only uses the registers "r10", "r11", "r12" and/or "r13" and only provided that the normal use of the
       corresponding registers have been restricted via the -ffixed-reg or -mint-register command-line options.

       S/390 and zSeries Options

       These are the -m options defined for the S/390 and zSeries architecture.

       -mhard-float
       -msoft-float
	   Use	(do  not  use)	the  hardware floating-point instructions and registers for floating-point operations.	When
	   -msoft-float	 is  specified,	 functions  in	libgcc.a  are  used  to	 perform  floating-point  operations.	When
	   -mhard-float is specified, the compiler generates IEEE floating-point instructions.	This is the default.

       -mhard-dfp
       -mno-hard-dfp
	   Use	(do  not  use) the hardware decimal-floating-point instructions for decimal-floating-point operations.	When
	   -mno-hard-dfp is specified, functions in libgcc.a are used to perform  decimal-floating-point  operations.	When
	   -mhard-dfp  is  specified,  the  compiler  generates	 decimal-floating-point	 hardware instructions.	 This is the
	   default for -march=z9-ec or higher.

       -mlong-double-64
       -mlong-double-128
	   These switches control the size of "long double" type. A size of 64 bits makes the "long double" type  equivalent
	   to the "double" type. This is the default.

       -mbackchain
       -mno-backchain
	   Store  (do  not  store)  the address of the caller's frame as backchain pointer into the callee's stack frame.  A
	   backchain may be needed to allow debugging using tools that do not understand DWARF call frame information.	When
	   -mno-packed-stack is in effect, the backchain  pointer  is  stored  at  the	bottom	of  the	 stack	frame;	when
	   -mpacked-stack is in effect, the backchain is placed into the topmost word of the 96/160 byte register save area.

	   In  general,	 code  compiled with -mbackchain is call-compatible with code compiled with -mno-backchain; however,
	   use of the backchain for debugging purposes usually requires that the whole binary  is  built  with	-mbackchain.
	   Note	 that the combination of -mbackchain, -mpacked-stack and -mhard-float is not supported.	 In order to build a
	   linux kernel use -msoft-float.

	   The default is to not maintain the backchain.

       -mpacked-stack
       -mno-packed-stack
	   Use (do not use) the packed stack layout.  When -mno-packed-stack is specified, the compiler uses the all  fields
	   of  the  96/160  byte register save area only for their default purpose; unused fields still take up stack space.
	   When -mpacked-stack is specified, register save slots are densely packed at the top of the  register	 save  area;
	   unused  space  is  reused  for  other  purposes,  allowing  for  more efficient use of the available stack space.
	   However, when -mbackchain is also in effect, the topmost word of the save  area  is	always	used  to  store	 the
	   backchain, and the return address register is always saved two words below the backchain.

	   As long as the stack frame backchain is not used, code generated with -mpacked-stack is call-compatible with code
	   generated  with  -mno-packed-stack.	 Note  that some non-FSF releases of GCC 2.95 for S/390 or zSeries generated
	   code that uses the stack frame backchain at run time, not just for debugging purposes.  Such code  is  not  call-
	   compatible	with   code  compiled  with  -mpacked-stack.   Also,  note  that  the  combination  of	-mbackchain,
	   -mpacked-stack and -mhard-float is not supported.  In order to build a linux kernel use -msoft-float.

	   The default is to not use the packed stack layout.

       -msmall-exec
       -mno-small-exec
	   Generate (or do not generate) code using the "bras" instruction to do subroutine calls.  This only works reliably
	   if the total executable size does not exceed 64k.  The default is to use the "basr"	instruction  instead,  which
	   does not have this limitation.

       -m64
       -m31
	   When -m31 is specified, generate code compliant to the GNU/Linux for S/390 ABI.  When -m64 is specified, generate
	   code	 compliant to the GNU/Linux for zSeries ABI.  This allows GCC in particular to generate 64-bit instructions.
	   For the s390 targets, the default is -m31, while the s390x targets default to -m64.

       -mzarch
       -mesa
	   When -mzarch is specified, generate code using the instructions  available  on  z/Architecture.   When  -mesa  is
	   specified, generate code using the instructions available on ESA/390.  Note that -mesa is not possible with -m64.
	   When	 generating  code  compliant  to  the  GNU/Linux  for S/390 ABI, the default is -mesa.	When generating code
	   compliant to the GNU/Linux for zSeries ABI, the default is -mzarch.

       -mhtm
       -mno-htm
	   The -mhtm option enables a set of builtins making use of instructions available with the transactional  execution
	   facility introduced with the IBM zEnterprise EC12 machine generation S/390 System z Built-in Functions.  -mhtm is
	   enabled by default when using -march=zEC12.

       -mvx
       -mno-vx
	   When	 -mvx  is  specified,  generate	 code  using  the  instructions available with the vector extension facility
	   introduced with the IBM z13 machine generation.  This option changes the ABI for some  vector  type	values	with
	   regard  to  alignment  and  calling	conventions.   In  case vector type values are being used in an ABI-relevant
	   context a GAS .gnu_attribute command will be added to mark the resulting binary  with  the  ABI  used.   -mvx  is
	   enabled by default when using -march=z13.

       -mzvector
       -mno-zvector
	   The -mzvector option enables vector language extensions and builtins using instructions available with the vector
	   extension  facility	introduced  with  the IBM z13 machine generation.  This option adds support for vector to be
	   used as a keyword to define vector type variables and arguments.  vector is only available  when  GNU  extensions
	   are enabled.	 It will not be expanded when requesting strict standard compliance e.g. with -std=c99.	 In addition
	   to  the  GCC	 low-level  builtins  -mzvector enables a set of builtins added for compatibility with AltiVec-style
	   implementations like Power and Cell.	 In order to make use of these builtins the header file vecintrin.h needs to
	   be included.	 -mzvector is disabled by default.

       -mmvcle
       -mno-mvcle
	   Generate (or do not generate) code using the "mvcle" instruction to perform	block  moves.	When  -mno-mvcle  is
	   specified, use a "mvc" loop instead.	 This is the default unless optimizing for size.

       -mdebug
       -mno-debug
	   Print  (or  do  not	print)	additional  debug  information	when  compiling.   The default is to not print debug
	   information.

       -march=cpu-type
	   Generate code that runs on cpu-type, which is the name  of  a  system  representing	a  certain  processor  type.
	   Possible  values  for  cpu-type  are	 z900/arch5,  z990/arch6, z9-109, z9-ec/arch7, z10/arch8, z196/arch9, zEC12,
	   z13/arch11, z14/arch12, z15/arch13, z16/arch14, z17/arch15, and native.

	   The default is -march=z900.

	   Specifying native as cpu type can be used to	 select	 the  best  architecture  option  for  the  host  processor.
	   -march=native has no effect if GCC does not recognize the processor.

       -mtune=cpu-type
	   Tune	 to  cpu-type  everything  applicable  about the generated code, except for the ABI and the set of available
	   instructions.  The list of cpu-type values is the same as for -march.  The default is the value used for -march.

       -mtpf-trace
       -mno-tpf-trace
	   Generate code that adds (does not add) in TPF OS specific branches to trace routines	 in  the  operating  system.
	   This option is off by default, even when compiling for the TPF OS.

       -mtpf-trace-skip
       -mno-tpf-trace-skip
	   Generate  code  that	 changes  (does	 not  change)  the default branch targets enabled by -mtpf-trace to point to
	   specialized trace routines providing the ability of selectively skipping function trace entries for the  TPF	 OS.
	   This option is off by default, even when compiling for the TPF OS and specifying -mtpf-trace.

       -mfused-madd
       -mno-fused-madd
	   Generate  code  that	 uses  (does  not  use)	 the  floating-point  multiply	and  accumulate instructions.  These
	   instructions are generated by default if hardware floating point is used.

       -mwarn-framesize=framesize
	   Emit a warning if the current function exceeds the given frame size.	 Because this is  a  compile-time  check  it
	   doesn't need to be a real problem when the program runs.  It is intended to identify functions that most probably
	   cause a stack overflow.  It is useful to be used in an environment with limited stack size e.g. the linux kernel.

       -mwarn-dynamicstack
	   Emit	 a  warning  if	 the function calls "alloca" or uses dynamically-sized arrays.	This is generally a bad idea
	   with a limited stack size.

       -mstack-guard=stack-guard
       -mstack-size=stack-size
	   If these options are provided the S/390 back end emits additional instructions  in  the  function  prologue	that
	   trigger  a  trap  if	 the  stack size is stack-guard bytes above the stack-size (remember that the stack on S/390
	   grows downward).  If the stack-guard option is omitted the smallest power of 2 larger than the frame size of	 the
	   compiled  function  is  chosen.  These options are intended to be used to help debugging stack overflow problems.
	   The additionally emitted code causes only little overhead and hence can also be used in  production-like  systems
	   without  greater performance degradation.  The given values have to be exact powers of 2 and stack-size has to be
	   greater than stack-guard without exceeding 64k.  In order to be efficient the extra	code  makes  the  assumption
	   that the stack starts at an address aligned to the value given by stack-size.  The stack-guard option can only be
	   used in conjunction with stack-size.

       -mhotpatch=pre-halfwords,post-halfwords
	   If  the  hotpatch  option  is  enabled,  a "hot-patching" function prologue is generated for all functions in the
	   compilation unit.  The funtion label is prepended with the  given  number  of  two-byte  NOP	 instructions  (pre-
	   halfwords,  maximum 1000000).  After the label, 2 * post-halfwords bytes are appended, using the largest NOP like
	   instructions the architecture allows (maximum 1000000).

	   If both arguments are zero, hotpatching is disabled.

	   This option can be overridden for individual functions with the "hotpatch" attribute.

       SH Options

       These -m options are defined for the SH implementations:

       -m1 Generate code for the SH1.

       -m2 Generate code for the SH2.

       -m2e
	   Generate code for the SH2e.

       -m2a-nofpu
	   Generate code for the SH2a without FPU, or for a SH2a-FPU in such a way that the floating-point unit is not used.

       -m2a-single-only
	   Generate code for the SH2a-FPU, in such a way that no double-precision floating-point operations are used.

       -m2a-single
	   Generate code for the SH2a-FPU assuming the floating-point unit is in single-precision mode by default.

       -m2a
	   Generate code for the SH2a-FPU assuming the floating-point unit is in double-precision mode by default.

       -m3 Generate code for the SH3.

       -m3e
	   Generate code for the SH3e.

       -m4-nofpu
	   Generate code for the SH4 without a floating-point unit.

       -m4-single-only
	   Generate code for the SH4 with a floating-point unit that only supports single-precision arithmetic.

       -m4-single
	   Generate code for the SH4 assuming the floating-point unit is in single-precision mode by default.

       -m4 Generate code for the SH4.

       -m4-100
	   Generate code for SH4-100.

       -m4-100-nofpu
	   Generate code for SH4-100 in such a way that the floating-point unit is not used.

       -m4-100-single
	   Generate code for SH4-100 assuming the floating-point unit is in single-precision mode by default.

       -m4-100-single-only
	   Generate code for SH4-100 in such a way that no double-precision floating-point operations are used.

       -m4-200
	   Generate code for SH4-200.

       -m4-200-nofpu
	   Generate code for SH4-200 without in such a way that the floating-point unit is not used.

       -m4-200-single
	   Generate code for SH4-200 assuming the floating-point unit is in single-precision mode by default.

       -m4-200-single-only
	   Generate code for SH4-200 in such a way that no double-precision floating-point operations are used.

       -m4-300
	   Generate code for SH4-300.

       -m4-300-nofpu
	   Generate code for SH4-300 without in such a way that the floating-point unit is not used.

       -m4-300-single
	   Generate code for SH4-300 in such a way that no double-precision floating-point operations are used.

       -m4-300-single-only
	   Generate code for SH4-300 in such a way that no double-precision floating-point operations are used.

       -m4-340
	   Generate code for SH4-340 (no MMU, no FPU).

       -m4-500
	   Generate code for SH4-500 (no FPU).	Passes -isa=sh4-nofpu to the assembler.

       -m4a-nofpu
	   Generate code for the SH4al-dsp, or for a SH4a in such a way that the floating-point unit is not used.

       -m4a-single-only
	   Generate code for the SH4a, in such a way that no double-precision floating-point operations are used.

       -m4a-single
	   Generate code for the SH4a assuming the floating-point unit is in single-precision mode by default.

       -m4a
	   Generate code for the SH4a.

       -m4al
	   Same as -m4a-nofpu, except that it implicitly passes -dsp  to  the  assembler.   GCC	 doesn't  generate  any	 DSP
	   instructions at the moment.

       -mb Compile code for the processor in big-endian mode.

       -ml Compile code for the processor in little-endian mode.

       -mdalign
	   Align doubles at 64-bit boundaries.	Note that this changes the calling conventions, and thus some functions from
	   the standard C library do not work unless you recompile it first with -mdalign.

       -mrelax
	   Shorten some address references at link time, when possible; uses the linker option -relax.

       -mbigtable
	   Use 32-bit offsets in "switch" tables.  The default is to use 16-bit offsets.

       -mbitops
	   Enable the use of bit manipulation instructions on SH2A.

       -mfmovd
	   Enable the use of the instruction "fmovd".  Check -mdalign for alignment constraints.

       -mrenesas
	   Comply with the calling conventions defined by Renesas.

       -mno-renesas
	   Comply  with	 the calling conventions defined for GCC before the Renesas conventions were available.	 This option
	   is the default for all targets of the SH toolchain.

       -mnomacsave
	   Mark the "MAC" register as call-clobbered, even if -mrenesas is given.

       -mieee
       -mno-ieee
	   Control the IEEE compliance of floating-point comparisons, which affects the handling of cases where	 the  result
	   of  a  comparison  is  unordered.   By  default  -mieee  is implicitly enabled.  If -ffinite-math-only is enabled
	   -mno-ieee is implicitly set, which results in faster floating-point	greater-equal  and  less-equal	comparisons.
	   The implicit settings can be overridden by specifying either -mieee or -mno-ieee.

       -minline-ic_invalidate
	   Inline  code	 to  invalidate instruction cache entries after setting up nested function trampolines.	 This option
	   has no effect if -musermode is in effect and the selected code generation option (e.g. -m4) does  not  allow	 the
	   use	of  the	 "icbi"	 instruction.	If  the selected code generation option does not allow the use of the "icbi"
	   instruction, and -musermode is not in effect, the inlined code manipulates the instruction  cache  address  array
	   directly with an associative write.	This not only requires privileged mode at run time, but it also fails if the
	   cache line had been mapped via the TLB and has become unmapped.

       -misize
	   Dump instruction size and location in the assembly code.

       -mpadstruct
	   This option is deprecated.  It pads structures to multiple of 4 bytes, which is incompatible with the SH ABI.

       -matomic-model=model
	   Sets	 the  model  of	 atomic	 operations and additional parameters as a comma separated list.  For details on the
	   atomic built-in functions see __atomic Builtins.  The following models and parameters are supported:

	   none
	       Disable compiler generated atomic sequences and emit library  calls  for	 atomic	 operations.   This  is	 the
	       default if the target is not "sh*-*-linux*".

	   soft-gusa
	       Generate	 GNU/Linux  compatible	gUSA  software	atomic	sequences  for	the  atomic built-in functions.	 The
	       generated atomic sequences require additional support from  the	interrupt/exception  handling  code  of	 the
	       system  and  are only suitable for SH3* and SH4* single-core systems.  This option is enabled by default when
	       the target is "sh*-*-linux*" and SH3* or SH4*.  When the target is SH4A, this option also partially  utilizes
	       the  hardware  atomic  instructions  "movli.l"  and "movco.l" to create more efficient code, unless strict is
	       specified.

	   soft-tcb
	       Generate software atomic sequences that use a variable in the thread control block.  This is a  variation  of
	       the  gUSA  sequences which can also be used on SH1* and SH2* targets.  The generated atomic sequences require
	       additional support from the interrupt/exception handling code of the system and are only suitable for single-
	       core systems.  When using this model, the gbr-offset= parameter has to be specified as well.

	   soft-imask
	       Generate software atomic sequences that temporarily disable interrupts by setting "SR.IMASK  =  1111".	This
	       model  works  only  when	 the  program  runs in privileged mode and is only suitable for single-core systems.
	       Additional support from the interrupt/exception handling code of the system is not required.  This  model  is
	       enabled by default when the target is "sh*-*-linux*" and SH1* or SH2*.

	   hard-llcs
	       Generate	 hardware  atomic  sequences  using  the  "movli.l"  and  "movco.l" instructions only.	This is only
	       available on SH4A and is suitable for multi-core systems.  Since the hardware instructions  support  only  32
	       bit  atomic  variables  access to 8 or 16 bit variables is emulated with 32 bit accesses.  Code compiled with
	       this option is also compatible with other software  atomic  model  interrupt/exception  handling	 systems  if
	       executed	 on  an SH4A system.  Additional support from the interrupt/exception handling code of the system is
	       not required for this model.

	   gbr-offset=
	       This parameter specifies the offset in bytes of the variable in	the  thread  control  block  structure	that
	       should be used by the generated atomic sequences when the soft-tcb model has been selected.  For other models
	       this parameter is ignored.  The specified value must be an integer multiple of four and in the range 0-1020.

	   strict
	       This  parameter	prevents  mixed	 usage of multiple atomic models, even if they are compatible, and makes the
	       compiler generate atomic sequences of the specified model only.

       -mtas
	   Generate the "tas.b" opcode for "__atomic_test_and_set".  Notice that depending on the  particular  hardware	 and
	   software  configuration  this  can  degrade	overall	 performance  due to the operand cache line flushes that are
	   implied by the "tas.b" instruction.	On multi-core SH4A processors the "tas.b"  instruction	must  be  used	with
	   caution since it can result in data corruption for certain cache configurations.

       -mprefergot
	   When	 generating  position-independent  code,  emit	function  calls using the Global Offset Table instead of the
	   Procedure Linkage Table.

       -musermode
       -mno-usermode
	   Don't  allow	 (allow)  the  compiler	 generating  privileged	 mode  code.   Specifying  -musermode  also  implies
	   -mno-inline-ic_invalidate  if  the  inlined code would not work in user mode.  -musermode is the default when the
	   target is "sh*-*-linux*".  If the target is SH1* or SH2* -musermode has no effect, since there is no user mode.

       -multcost=number
	   Set the cost to assume for a multiply insn.

       -mdiv=strategy
	   Set the division strategy to be used for integer division operations.  strategy can be one of:

	   call-div1
	       Calls a library function that uses the single-step division instruction	"div1"	to  perform  the  operation.
	       Division	 by  zero  calculates  an unspecified result and does not trap.	 This is the default except for SH4,
	       SH2A and SHcompact.

	   call-fp
	       Calls a library function that performs the operation in double precision floating point.	  Division  by	zero
	       causes  a floating-point exception.  This is the default for SHcompact with FPU.	 Specifying this for targets
	       that do not have a double precision FPU defaults to "call-div1".

	   call-table
	       Calls a library function that uses a lookup table for small divisors and the  "div1"  instruction  with	case
	       distinction  for larger divisors.  Division by zero calculates an unspecified result and does not trap.	This
	       is the default for SH4.	Specifying this for targets that do not have dynamic shift instructions defaults  to
	       "call-div1".

	   When	 a  division  strategy	has not been specified the default strategy is selected based on the current target.
	   For SH2A the default strategy is to use the "divs" and "divu" instructions instead of library function calls.

       -maccumulate-outgoing-args
	   Reserve space once for outgoing arguments in the function prologue  rather  than  around  each  call.   Generally
	   beneficial  for  performance	 and  size.   Also  needed  for	 unwinding  to avoid changing the stack frame around
	   conditional code.

       -mdivsi3_libfunc=name
	   Set the name of the library function used for 32-bit signed division to name.  This only affects the name used in
	   the call division strategies, and the compiler still expects the same sets of input/output/clobbered registers as
	   if this option were not present.

       -mfixed-range=register-range
	   Generate code treating the given register range as fixed registers.	A fixed register is one	 that  the  register
	   allocator cannot use.  This is useful when compiling kernel code.  A register range is specified as two registers
	   separated by a dash.	 Multiple register ranges can be specified separated by a comma.

       -mbranch-cost=num
	   Assume  num	to  be	the  cost  for	a branch instruction.  Higher numbers make the compiler try to generate more
	   branch-free code if possible.  If not specified the value is selected depending on the  processor  type  that  is
	   being compiled for.

       -mzdcbranch
       -mno-zdcbranch
	   Assume  (do	not  assume)  that  zero  displacement	conditional  branch instructions "bt" and "bf" are fast.  If
	   -mzdcbranch is specified, the compiler prefers zero displacement branch  code  sequences.   This  is	 enabled  by
	   default when generating code for SH4 and SH4A.  It can be explicitly disabled by specifying -mno-zdcbranch.

       -mcbranch-force-delay-slot
	   Force  the  usage of delay slots for conditional branches, which stuffs the delay slot with a "nop" if a suitable
	   instruction cannot be found.	 By default this option is disabled.  It can be enabled to work around hardware bugs
	   as found in the original SH7055.

       -mfused-madd
       -mno-fused-madd
	   Generate code that  uses  (does  not	 use)  the  floating-point  multiply  and  accumulate  instructions.   These
	   instructions	 are  generated	 by  default if hardware floating point is used.  The machine-dependent -mfused-madd
	   option is now mapped to the machine-independent -ffp-contract=fast  option,	and  -mno-fused-madd  is  mapped  to
	   -ffp-contract=off.

       -mfsca
       -mno-fsca
	   Allow  or  disallow	the  compiler to emit the "fsca" instruction for sine and cosine approximations.  The option
	   -mfsca must be used in combination with -funsafe-math-optimizations.	 It is enabled by  default  when  generating
	   code for SH4A.  Using -mno-fsca disables sine and cosine approximations even if -funsafe-math-optimizations is in
	   effect.

       -mfsrra
       -mno-fsrra
	   Allow  or  disallow	the compiler to emit the "fsrra" instruction for reciprocal square root approximations.	 The
	   option -mfsrra must be used in  combination	with  -funsafe-math-optimizations  and	-ffinite-math-only.   It  is
	   enabled   by	 default  when	generating  code  for  SH4A.   Using  -mno-fsrra  disables  reciprocal	square	root
	   approximations even if -funsafe-math-optimizations and -ffinite-math-only are in effect.

       -mpretend-cmove
	   Prefer zero-displacement conditional branches for conditional move instruction  patterns.   This  can  result  in
	   faster code on the SH4 processor.

       -mfdpic
	   Generate code using the FDPIC ABI.

       Solaris 2 Options

       These -m options are supported on Solaris 2:

       -mclear-hwcap
	   -mclear-hwcap tells the compiler to remove the hardware capabilities generated by the Solaris assembler.  This is
	   only	 necessary  when  object files use ISA extensions not supported by the current machine, but check at runtime
	   whether or not to use them.

       -mimpure-text
	   -mimpure-text, used in addition to -shared, tells the compiler to not pass -z text to the linker when  linking  a
	   shared object.  Using this option, you can link position-dependent code into a shared object.

	   -mimpure-text  suppresses  the  "relocations	 remain	 against allocatable but non-writable sections" linker error
	   message.  However, the necessary relocations trigger copy-on-write, and the shared object is not actually  shared
	   across processes.  Instead of using -mimpure-text, you should compile all source code with -fpic or -fPIC.

       These switches are supported in addition to the above on Solaris 2:

       -pthreads
	   This is a synonym for -pthread.

       SPARC Options

       These -m options are supported on the SPARC:

       -mno-app-regs
       -mapp-regs
	   Specify  -mapp-regs	to generate output using the global registers 2 through 4, which the SPARC SVR4 ABI reserves
	   for applications.  Like the global register 1, each global register 2 through 4 is then treated as  an  allocable
	   register that is clobbered by function calls.  This is the default.

	   To  be  fully SVR4 ABI-compliant at the cost of some performance loss, specify -mno-app-regs.  You should compile
	   libraries and system software with this option.

       -mflat
       -mno-flat
	   With -mflat, the compiler does not generate save/restore instructions and uses a "flat" or single register window
	   model.  This model is compatible with the regular register window model.   The  local  registers  and  the  input
	   registers (0--5) are still treated as "call-saved" registers and are saved on the stack as needed.

	   With -mno-flat (the default), the compiler generates save/restore instructions (except for leaf functions).	This
	   is the normal operating mode.

       -mfpu
       -mhard-float
	   Generate output containing floating-point instructions.  This is the default.

       -mno-fpu
       -msoft-float
	   Generate  output containing library calls for floating point.  Warning: the requisite libraries are not available
	   for all SPARC targets.  Normally the facilities of the machine's usual C compiler are used, but  this  cannot  be
	   done	 directly  in  cross-compilation.  You must make your own arrangements to provide suitable library functions
	   for cross-compilation.  The embedded targets sparc-*-aout and sparclite-*-* do  provide  software  floating-point
	   support.

	   -msoft-float	 changes  the calling convention in the output file; therefore, it is only useful if you compile all
	   of a program with this option.  In particular, you need to compile libgcc.a, the library  that  comes  with	GCC,
	   with -msoft-float in order for this to work.

       -mhard-quad-float
	   Generate output containing quad-word (long double) floating-point instructions.

       -msoft-quad-float
	   Generate  output containing library calls for quad-word (long double) floating-point instructions.  The functions
	   called are those specified in the SPARC ABI.	 This is the default.

	   As of this writing, there are no SPARC implementations that have hardware support  for  the	quad-word  floating-
	   point  instructions.	  They	all  invoke  a trap handler for one of these instructions, and then the trap handler
	   emulates the effect of the instruction.  Because of the trap handler overhead, this is much slower  than  calling
	   the ABI library routines.  Thus the -msoft-quad-float option is the default.

       -mno-unaligned-doubles
       -munaligned-doubles
	   Assume that doubles have 8-byte alignment.  This is the default.

	   With	 -munaligned-doubles,  GCC  assumes that doubles have 8-byte alignment only if they are contained in another
	   type, or if they have an absolute address.  Otherwise, it assumes they have 4-byte  alignment.   Specifying	this
	   option  avoids  some	 rare  compatibility problems with code generated by other compilers.  It is not the default
	   because it results in a performance loss, especially for floating-point code.

       -muser-mode
       -mno-user-mode
	   Do not generate code that can only run in supervisor mode.  This is relevant	 only  for  the	 "casa"	 instruction
	   emitted for the LEON3 processor.  This is the default.

       -mfaster-structs
       -mno-faster-structs
	   With	 -mfaster-structs,  the compiler assumes that structures should have 8-byte alignment.	This enables the use
	   of pairs of "ldd" and "std" instructions for copies in structure assignment, in place of twice as many  "ld"	 and
	   "st"	 pairs.	  However,  the	 use of this changed alignment directly violates the SPARC ABI.	 Thus, it's intended
	   only for use on targets where the developer acknowledges that their resulting code is not directly in  line	with
	   the rules of the ABI.

       -mstd-struct-return
       -mno-std-struct-return
	   With	 -mstd-struct-return,  the  compiler  generates checking code in functions returning structures or unions to
	   detect size mismatches between the two sides of function calls, as per the 32-bit ABI.

	   The default is -mno-std-struct-return.  This option has no effect in 64-bit mode.

       -mcpu=cpu_type
	   Set the instruction set,  register  set,  and  instruction  scheduling  parameters  for  machine  type  cpu_type.
	   Supported  values  for  cpu_type  are  v7,  cypress,	 v8,  supersparc,  hypersparc,	leon, leon3, leon3v7, leon5,
	   sparclite, f930, f934, sparclite86x, sparclet, tsc701, v9, ultrasparc, ultrasparc3, niagara, niagara2,  niagara3,
	   niagara4, niagara7 and m8.

	   Native Solaris and GNU/Linux toolchains also support the value native, which selects the best architecture option
	   for the host processor.  -mcpu=native has no effect if GCC does not recognize the processor.

	   Default  instruction	 scheduling  parameters	 are  used  for	 values	 that  select  an  architecture	 and  not an
	   implementation.  These are v7, v8, sparclite, sparclet, v9.

	   Here is a list of each supported architecture and their supported implementations.

	   v7  cypress, leon3v7

	   v8  supersparc, hypersparc, leon, leon3, leon5

	   sparclite
	       f930, f934, sparclite86x

	   sparclet
	       tsc701

	   v9  ultrasparc, ultrasparc3, niagara, niagara2, niagara3, niagara4, niagara7, m8

	   By default (unless configured otherwise), GCC generates code for the V7 variant of the SPARC architecture.	With
	   -mcpu=cypress,   the	 compiler  additionally	 optimizes  it	for  the  Cypress  CY7C602  chip,  as  used  in	 the
	   SPARCStation/SPARCServer 3xx series.	 This is also appropriate for the older SPARCStation 1, 2, IPX etc.

	   With -mcpu=v8, GCC generates code for the V8 variant of the SPARC architecture.  The only difference from V7 code
	   is that the compiler emits the integer multiply and integer divide instructions which exist in SPARC-V8  but	 not
	   in  SPARC-V7.   With -mcpu=supersparc, the compiler additionally optimizes it for the SuperSPARC chip, as used in
	   the SPARCStation 10, 1000 and 2000 series.

	   With -mcpu=sparclite, GCC generates code for the SPARClite variant of the  SPARC  architecture.   This  adds	 the
	   integer multiply, integer divide step and scan ("ffs") instructions which exist in SPARClite but not in SPARC-V7.
	   With	 -mcpu=f930,  the  compiler  additionally  optimizes  it for the Fujitsu MB86930 chip, which is the original
	   SPARClite, with no FPU.  With -mcpu=f934, the compiler additionally optimizes it for the  Fujitsu  MB86934  chip,
	   which is the more recent SPARClite with FPU.

	   With	 -mcpu=sparclet,  GCC  generates  code	for  the  SPARClet variant of the SPARC architecture.  This adds the
	   integer multiply, multiply/accumulate, integer divide step and scan ("ffs") instructions which exist in  SPARClet
	   but not in SPARC-V7.	 With -mcpu=tsc701, the compiler additionally optimizes it for the TEMIC SPARClet chip.

	   With	 -mcpu=v9,  GCC	 generates  code for the V9 variant of the SPARC architecture.	This adds 64-bit integer and
	   floating-point move instructions, 3 additional floating-point  condition  code  registers  and  conditional	move
	   instructions.   With	 -mcpu=ultrasparc,  the	 compiler  additionally optimizes it for the Sun UltraSPARC I/II/IIi
	   chips.   With  -mcpu=ultrasparc3,   the   compiler	additionally   optimizes   it	for   the   Sun	  UltraSPARC
	   III/III+/IIIi/IIIi+/IV/IV+  chips.  With -mcpu=niagara, the compiler additionally optimizes it for Sun UltraSPARC
	   T1 chips.  With -mcpu=niagara2, the compiler	 additionally  optimizes  it  for  Sun	UltraSPARC  T2	chips.	With
	   -mcpu=niagara3,  the	 compiler  additionally	 optimizes it for Sun UltraSPARC T3 chips.  With -mcpu=niagara4, the
	   compiler additionally optimizes it for Sun UltraSPARC T4 chips.  With -mcpu=niagara7, the  compiler	additionally
	   optimizes  it  for  Oracle  SPARC  M7 chips.	 With -mcpu=m8, the compiler additionally optimizes it for Oracle M8
	   chips.

       -mtune=cpu_type
	   Set the instruction scheduling parameters for machine type cpu_type, but  do	 not  set  the	instruction  set  or
	   register set that the option -mcpu=cpu_type does.

	   The	same  values  for  -mcpu=cpu_type can be used for -mtune=cpu_type, but the only useful values are those that
	   select a particular CPU implementation.  Those are cypress, supersparc, hypersparc, leon, leon3, leon3v7,  leon5,
	   f930,  f934,	 sparclite86x,	tsc701, ultrasparc, ultrasparc3, niagara, niagara2, niagara3, niagara4, niagara7 and
	   m8.	With native Solaris and GNU/Linux toolchains, native can also be used.

       -mv8plus
       -mno-v8plus
	   With -mv8plus, GCC generates code for the SPARC-V8+ ABI.  The difference from the V8 ABI is that the	 global	 and
	   out registers are considered 64 bits wide.  This is enabled by default on Solaris in 32-bit mode for all SPARC-V9
	   processors.

       -mvis
       -mno-vis
	   With	 -mvis,	 GCC  generates	 code that takes advantage of the UltraSPARC Visual Instruction Set extensions.	 The
	   default is -mno-vis.

       -mvis2
       -mno-vis2
	   With -mvis2, GCC generates code that takes advantage of version 2.0 of  the	UltraSPARC  Visual  Instruction	 Set
	   extensions.	 The  default is -mvis2 when targeting a cpu that supports such instructions, such as UltraSPARC-III
	   and later.  Setting -mvis2 also sets -mvis.

       -mvis3
       -mno-vis3
	   With -mvis3, GCC generates code that takes advantage of version 3.0 of  the	UltraSPARC  Visual  Instruction	 Set
	   extensions.	 The  default  is -mvis3 when targeting a cpu that supports such instructions, such as niagara-3 and
	   later.  Setting -mvis3 also sets -mvis2 and -mvis.

       -mvis3b
       -mno-vis3b
	   With -mvis3b, GCC generates code that takes advantage of version 3.0 of the	UltraSPARC  Visual  Instruction	 Set
	   extensions, plus the additional VIS instructions introduced in the Oracle SPARC Architecture 2011. The default is
	   -mvis3b  when targeting a cpu that supports such instructions, such as niagara-7 and later.	Setting -mvis3b also
	   sets -mvis3, -mvis2 and -mvis.

       -mvis4
       -mno-vis4
	   With -mvis4, GCC generates code that takes advantage of version 4.0 of  the	UltraSPARC  Visual  Instruction	 Set
	   extensions.	 The  default  is -mvis4 when targeting a cpu that supports such instructions, such as niagara-7 and
	   later.  Setting -mvis4 also sets -mvis3b, -mvis3, -mvis2 and -mvis.

       -mvis4b
       -mno-vis4b
	   With -mvis4b, GCC generates code that takes advantage of version 4.0 of the	UltraSPARC  Visual  Instruction	 Set
	   extensions,	plus  the additional VIS instructions introduced in the Oracle SPARC Architecture 2017.	 The default
	   is -mvis4b when targeting a cpu that supports such instructions, such as m8 and later.  Setting -mvis4b also sets
	   -mvis4, -mvis3b, -mvis3, -mvis2 and -mvis.

       -mcbcond
       -mno-cbcond
	   With -mcbcond, GCC  generates  code	that  takes  advantage	of  the	 UltraSPARC  Compare-and-Branch-on-Condition
	   instructions.   The	default	 is -mcbcond when targeting a CPU that supports such instructions, such as Niagara-4
	   and later.

       -mfmaf
       -mno-fmaf
	   With -mfmaf, GCC generates code  that  takes	 advantage  of	the  UltraSPARC	 Fused	Multiply-Add  Floating-point
	   instructions.   The default is -mfmaf when targeting a CPU that supports such instructions, such as Niagara-3 and
	   later.

       -mfsmuld
       -mno-fsmuld
	   With -mfsmuld, GCC generates code that takes advantage of the Floating-point Multiply Single to  Double  (FsMULd)
	   instruction.	 The default is -mfsmuld when targeting a CPU supporting the architecture versions V8 or V9 with FPU
	   except -mcpu=leon.

       -mpopc
       -mno-popc
	   With -mpopc, GCC generates code that takes advantage of the UltraSPARC Population Count instruction.	 The default
	   is -mpopc when targeting a CPU that supports such an instruction, such as Niagara-2 and later.

       -msubxc
       -mno-subxc
	   With -msubxc, GCC generates code that takes advantage of the UltraSPARC Subtract-Extended-with-Carry instruction.
	   The default is -msubxc when targeting a CPU that supports such an instruction, such as Niagara-7 and later.

       -mfix-at697f
	   Enable  the	documented  workaround	for  the  single erratum of the Atmel AT697F processor (which corresponds to
	   erratum #13 of the AT697E processor).

       -mfix-ut699
	   Enable the documented workarounds for the floating-point errata and the data cache nullify errata  of  the  UT699
	   processor.

       -mfix-ut700
	   Enable the documented workaround for the back-to-back store errata of the UT699E/UT700 processor.

       -mfix-gr712rc
	   Enable the documented workaround for the back-to-back store errata of the GR712RC processor.

       These -m options are supported in addition to the above on SPARC-V9 processors in 64-bit environments:

       -m32
       -m64
	   Generate  code for a 32-bit or 64-bit environment.  The 32-bit environment sets int, long and pointer to 32 bits.
	   The 64-bit environment sets int to 32 bits and long and pointer to 64 bits.

       -mcmodel=which
	   Set the code model to one of

	   medlow
	       The Medium/Low code model: 64-bit addresses, programs must be linked in the low 32 bits of memory.   Programs
	       can be statically or dynamically linked.

	   medmid
	       The  Medium/Middle  code	 model:	 64-bit addresses, programs must be linked in the low 44 bits of memory, the
	       text and data segments must be less than 2GB in size and the data segment must be located within 2GB  of	 the
	       text segment.

	   medany
	       The  Medium/Anywhere  code  model:  64-bit addresses, programs may be linked anywhere in memory, the text and
	       data segments must be less than 2GB in size and the data segment must be	 located  within  2GB  of  the	text
	       segment.

	   embmedany
	       The  Medium/Anywhere  code  model  for embedded systems: 64-bit addresses, the text and data segments must be
	       less than 2GB in size, both starting anywhere in memory (determined at link time).  The global  register	 %g4
	       points to the base of the data segment.	Programs are statically linked and PIC is not supported.

       -mmemory-model=mem-model
	   Set the memory model in force on the processor to one of

	   default
	       The default memory model for the processor and operating system.

	   rmo Relaxed Memory Order

	   pso Partial Store Order

	   tso Total Store Order

	   sc  Sequential Consistency

	   These  memory  models  are  formally	 defined  in  Appendix	D of the SPARC-V9 architecture manual, as set in the
	   processor's "PSTATE.MM" field.

       -mstack-bias
       -mno-stack-bias
	   With -mstack-bias, GCC assumes that the stack pointer, and frame pointer if present, are offset  by	-2047  which
	   must be added back when making stack frame references.  This is the default in 64-bit mode.	Otherwise, assume no
	   such offset is present.

       Options for System V

       These additional options are available on System V Release 4 for compatibility with other compilers on those systems:

       -G  Create a shared object.  It is recommended that -symbolic or -shared be used instead.

       -Qy Identify the versions of each tool used by the compiler, in a ".ident" assembler directive in the output.

       -Qn Refrain from adding ".ident" directives to the output file (this is the default).

       -YP,dirs
	   Search the directories dirs, and no others, for libraries specified with -l.

       -Ym,dir
	   Look in the directory dir to find the M4 preprocessor.  The assembler uses this option.

       V850 Options

       These -m options are defined for V850 implementations:

       -mlong-calls
       -mno-long-calls
	   Treat  all  calls  as  being far away (near).  If calls are assumed to be far away, the compiler always loads the
	   function's address into a register, and calls indirect through the pointer.

       -mno-ep
       -mep
	   Do not optimize (do optimize) basic blocks that use the same index pointer 4 or more times to copy  pointer	into
	   the	"ep"  register,	 and  use the shorter "sld" and "sst" instructions.  The -mep option is on by default if you
	   optimize.

       -mno-prolog-function
       -mprolog-function
	   Do not use (do use) external functions to save and restore registers at the prologue and epilogue of a  function.
	   The	external  functions  are  slower, but use less code space if more than one function saves the same number of
	   registers.  The -mprolog-function option is on by default if you optimize.

       -mspace
	   Try to make the code as small as possible.  At present,  this  just	turns  on  the	-mep  and  -mprolog-function
	   options.

       -mtda=n
	   Put	static	or  global variables whose size is n bytes or less into the tiny data area that register "ep" points
	   to.	The tiny data area can hold up to 256 bytes in total (128 bytes for byte references).

       -msda=n
	   Put static or global variables whose size is n bytes or less into the small data area that register	"gp"  points
	   to.	The small data area can hold up to 64 kilobytes.

       -mzda=n
	   Put static or global variables whose size is n bytes or less into the first 32 kilobytes of memory.

       -mv850
	   Specify that the target processor is the V850.

       -mv850e3v5
	   Specify  that  the target processor is the V850E3V5.	 The preprocessor constant "__v850e3v5__" is defined if this
	   option is used.

       -mv850e2v4
	   Specify that the target processor is the V850E3V5.  This is an alias for the -mv850e3v5 option.

       -mv850e2v3
	   Specify that the target processor is the V850E2V3.  The preprocessor constant "__v850e2v3__" is defined  if	this
	   option is used.

       -mv850e2
	   Specify  that  the  target  processor  is  the V850E2.  The preprocessor constant "__v850e2__" is defined if this
	   option is used.

       -mv850e1
	   Specify that the target processor is the V850E1.  The preprocessor constants	 "__v850e1__"  and  "__v850e__"	 are
	   defined if this option is used.

       -mv850es
	   Specify that the target processor is the V850ES.  This is an alias for the -mv850e1 option.

       -mv850e
	   Specify  that the target processor is the V850E.  The preprocessor constant "__v850e__" is defined if this option
	   is used.

	   If neither -mv850 nor -mv850e nor -mv850e1 nor -mv850e2 nor -mv850e2v3 nor -mv850e3v5 are defined then a  default
	   target processor is chosen and the relevant __v850*__ preprocessor constant is defined.

	   The	preprocessor  constants "__v850" and "__v851__" are always defined, regardless of which processor variant is
	   the target.

       -mdisable-callt
       -mno-disable-callt
	   This option suppresses generation of the "CALLT" instruction for the v850e, v850e1, v850e2, v850e2v3 and v850e3v5
	   flavors of the v850 architecture.

	   This option is enabled by default when the RH850 ABI is in use (see -mrh850-abi), and disabled  by  default	when
	   the	GCC  ABI  is  in  use.	 If  "CALLT"  instructions  are	 being	generated  then	 the  C	 preprocessor symbol
	   "__V850_CALLT__" is defined.

       -mrelax
       -mno-relax
	   Pass on (or do not pass on) the -mrelax command-line option to the assembler.

       -mlong-jumps
       -mno-long-jumps
	   Disable (or re-enable) the generation of PC-relative jump instructions.

       -msoft-float
       -mhard-float
	   Disable (or re-enable) the generation of hardware floating point instructions.  This option is  only	 significant
	   when	 the target architecture is V850E2V3 or higher.	 If hardware floating point instructions are being generated
	   then the C preprocessor symbol "__FPU_OK__" is defined, otherwise the symbol "__NO_FPU__" is defined.

       -mloop
	   Enables the use of the e3v5 LOOP instruction.  The use of this instruction is not enabled  by  default  when	 the
	   e3v5 architecture is selected because its use is still experimental.

       -mrh850-abi
       -mghs
	   Enables  support  for  the RH850 version of the V850 ABI.  This is the default.  With this version of the ABI the
	   following rules apply:

	   *   Integer sized structures and unions are returned via a memory pointer rather than a register.

	   *   Large structures and unions (more than 8 bytes in size) are passed by value.

	   *   Functions are aligned to 16-bit boundaries.

	   *   The -m8byte-align command-line option is supported.

	   *   The -mdisable-callt command-line option is enabled by default.  The -mno-disable-callt command-line option is
	       not supported.

	   When this version of the ABI is enabled the C preprocessor symbol "__V850_RH850_ABI__" is defined.

       -mgcc-abi
	   Enables support for the old GCC version of the V850 ABI.  With this version of the ABI the following rules apply:

	   *   Integer sized structures and unions are returned in register "r10".

	   *   Large structures and unions (more than 8 bytes in size) are passed by reference.

	   *   Functions are aligned to 32-bit boundaries, unless optimizing for size.

	   *   The -m8byte-align command-line option is not supported.

	   *   The -mdisable-callt command-line option is supported but not enabled by default.

	   When this version of the ABI is enabled the C preprocessor symbol "__V850_GCC_ABI__" is defined.

       -m8byte-align
       -mno-8byte-align
	   Enables support for "double" and "long long" types to be  aligned  on  8-byte  boundaries.	The  default  is  to
	   restrict  the  alignment  of	 all objects to at most 4-bytes.  When -m8byte-align is in effect the C preprocessor
	   symbol "__V850_8BYTE_ALIGN__" is defined.

       -mbig-switch
	   Generate code suitable for big switch tables.  Use this option only if the assembler/linker complain about out of
	   range branches within a switch table.

       -mapp-regs
	   This option causes r2 and r5 to be used in the code generated by the compiler.  This setting is the default.

       -mno-app-regs
	   This option causes r2 and r5 to be treated as fixed registers.

       VAX Options

       These -m options are defined for the VAX:

       -munix
	   Do not output certain jump instructions ("aobleq" and so on) that the Unix assembler for the	 VAX  cannot  handle
	   across long ranges.

       -mgnu
	   Do output those jump instructions, on the assumption that the GNU assembler is being used.

       -md
       -md-float
	   Use the D_floating data format for double-precision floating-point numbers instead of G_floating.

       -mg
       -mg-float
	   Use the G_floating data format for double-precision floating-point numbers instead of D_floating.

       -mlra
       -mno-lra
	   Enable  Local  Register  Allocation.	  This	is  still  experimental for the VAX, so by default the compiler uses
	   standard reload.

       Visium Options

       -mdebug
	   A program which performs file I/O and is destined to run on an MCM target should be linked with this option.	  It
	   causes  the	libraries  libc.a  and	libdebug.a  to be linked.  The program should be run on the target under the
	   control of the GDB remote debugging stub.

       -msim
	   A program which performs file I/O and is destined to run on the simulator should be	linked	with  option.	This
	   causes libraries libc.a and libsim.a to be linked.

       -mfpu
       -mhard-float
	   Generate code containing floating-point instructions.  This is the default.

       -mno-fpu
       -msoft-float
	   Generate code containing library calls for floating-point.

	   -msoft-float	 changes  the calling convention in the output file; therefore, it is only useful if you compile all
	   of a program with this option.  In particular, you need to compile libgcc.a, the library  that  comes  with	GCC,
	   with -msoft-float in order for this to work.

       -mcpu=cpu_type
	   Set	the  instruction  set,	register  set,	and  instruction  scheduling  parameters  for machine type cpu_type.
	   Supported values for cpu_type are mcm, gr5 and gr6.

	   mcm is a synonym of gr5 present for backward compatibility.

	   By default (unless configured otherwise), GCC generates code for the GR5 variant of the Visium architecture.

	   With -mcpu=gr6, GCC generates code for the GR6 variant of the Visium architecture.  The only difference from	 GR5
	   code is that the compiler will generate block move instructions.

       -mtune=cpu_type
	   Set	the  instruction  scheduling  parameters  for  machine	type cpu_type, but do not set the instruction set or
	   register set that the option -mcpu=cpu_type would.

       -msv-mode
	   Generate code for the supervisor mode, where there are no restrictions on the access to general registers.	This
	   is the default.

       -muser-mode
	   Generate  code  for the user mode, where the access to some general registers is forbidden: on the GR5, registers
	   r24 to r31 cannot be accessed in this mode; on the GR6, only registers r29 to r31 are affected.

       VMS Options

       These -m options are defined for the VMS implementations:

       -mvms-return-codes
	   Return VMS condition codes from "main". The default is to return POSIX-style condition (e.g. error) codes.

       -mdebug-main=prefix
	   Flag the first routine whose name starts with prefix as the main routine for the debugger.

       -mmalloc64
	   Default to 64-bit memory allocation routines.

       -mpointer-size=size
	   Set the default size of pointers. Possible options for size are 32 or short for 32 bit pointers, 64 or  long	 for
	   64 bit pointers, and no for supporting only 32 bit pointers.	 The later option disables "pragma pointer_size".

       VxWorks Options

       The  options in this section are defined for all VxWorks targets.  Options specific to the target hardware are listed
       with the other options for that target.

       -mrtp
	   GCC can generate code for both VxWorks kernels and real time processes (RTPs).  This	 option	 switches  from	 the
	   former to the latter.  It also defines the preprocessor macro "__RTP__".

       -msmp
	   Select  SMP runtimes for linking.  Not available on architectures other than PowerPC, nor on VxWorks version 7 or
	   later, in which the selection is part of the VxWorks build configuration and the library paths are the  same	 for
	   either choice.

       -non-static
	   Link	 an  RTP  executable against shared libraries rather than static libraries.  The options -static and -shared
	   can also be used for RTPs; -static is the default.

       -Bstatic
       -Bdynamic
	   These options are passed down to the linker.	 They are defined for compatibility with Diab.

       -Xbind-lazy
	   Enable lazy binding of function calls.  This option is equivalent to -Wl,-z,now and is defined for  compatibility
	   with Diab.

       -Xbind-now
	   Disable lazy binding of function calls.  This option is the default and is defined for compatibility with Diab.

       x86 Options

       These -m options are defined for the x86 family of computers.

       -march=cpu-type
	   Generate  instructions  for	the  machine  type cpu-type.  In contrast to -mtune=cpu-type, which merely tunes the
	   generated code for the specified cpu-type, -march=cpu-type allows GCC to generate code that may not run at all on
	   processors other than the one indicated.  Specifying -march=cpu-type implies -mtune=cpu-type, except where  noted
	   otherwise.

	   The choices for cpu-type are:

	   native
	       This  selects  the  CPU	to  generate  code  for at compilation time by determining the processor type of the
	       compiling machine.  Using -march=native enables all instruction subsets supported by the local machine (hence
	       the result might not run on different machines).	 Using -mtune=native produces code optimized for  the  local
	       machine under the constraints of the selected instruction set.

	   x86-64
	       A generic CPU with 64-bit extensions, MMX, SSE, SSE2, and FXSR instruction set support.

	   x86-64-v2
	   x86-64-v3
	   x86-64-v4
	       These  choices for cpu-type select the corresponding micro-architecture level from the x86-64 psABI.  On ABIs
	       other than the x86-64 psABI they select the  same  CPU  features	 as  the  x86-64  psABI	 documents  for	 the
	       particular micro-architecture level.

	       Since  these  cpu-type  values  do  not	have  a corresponding -mtune setting, using -march with these values
	       enables generic tuning.	Specific tuning can be	enabled	 using	the  -mtune=other-cpu-type  option  with  an
	       appropriate other-cpu-type value.

	   i386
	       Original Intel i386 CPU.

	   i486
	       Intel i486 CPU.	(No scheduling is implemented for this chip.)

	   i586
	   pentium
	       Intel Pentium CPU with no MMX support.

	   lakemont
	       Intel Lakemont MCU, based on Intel Pentium CPU.

	   pentium-mmx
	       Intel Pentium MMX CPU, based on Pentium core with MMX instruction set support.

	   pentiumpro
	       Intel Pentium Pro CPU with no MMX support.

	   i686
	       When  used  with	 -march, the Pentium Pro instruction set is used, so the code runs on all i686 family chips.
	       When used with -mtune, it has the same meaning as generic.

	   pentium2
	       Intel Pentium II CPU, based on Pentium Pro core with MMX and FXSR instruction set support.

	   pentium3
	   pentium3m
	       Intel Pentium III CPU, based on Pentium Pro core with MMX, FXSR and SSE instruction set support.

	   pentium-m
	       Intel Pentium M; low-power version of Intel Pentium III CPU with MMX, SSE,  SSE2	 and  FXSR  instruction	 set
	       support.	 Used by Centrino notebooks.

	   pentium4
	   pentium4m
	       Intel Pentium 4 CPU with MMX, SSE, SSE2 and FXSR instruction set support.

	   prescott
	       Improved version of Intel Pentium 4 CPU with MMX, SSE, SSE2, SSE3 and FXSR instruction set support.

	   nocona
	       Improved version of Intel Pentium 4 CPU with 64-bit extensions, MMX, SSE, SSE2, SSE3 and FXSR instruction set
	       support.

	   core2
	       Intel  Core  2  CPU  with 64-bit extensions, MMX, SSE, SSE2, SSE3, SSSE3, CX16, SAHF and FXSR instruction set
	       support.

	   nehalem
	   corei7
	       Intel Nehalem CPU with 64-bit extensions, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF and
	       FXSR instruction set support.

	   westmere
	       Intel Westmere CPU with 64-bit extensions, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT,	CX16,  SAHF,
	       FXSR and PCLMUL instruction set support.

	   sandybridge
	   corei7-avx
	       Intel  Sandy  Bridge  CPU  with 64-bit extensions, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16,
	       SAHF, FXSR, AVX, XSAVE and PCLMUL instruction set support.

	   ivybridge
	   core-avx-i
	       Intel Ivy Bridge CPU with 64-bit extensions, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF,
	       FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND and F16C instruction set support.

	   haswell
	   core-avx2
	       Intel Haswell CPU with 64-bit extensions, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2,  POPCNT,	CX16,  SAHF,
	       FXSR,  AVX,  XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE and HLE instruction set
	       support.

	   broadwell
	       Intel Broadwell CPU with 64-bit extensions, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16,  SAHF,
	       FXSR,  AVX,  XSAVE,  PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX and
	       PREFETCHW instruction set support.

	   skylake
	       Intel Skylake CPU with 64-bit extensions, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2,  POPCNT,	CX16,  SAHF,
	       FXSR,  AVX,  XSAVE,  PCLMUL,  FSGSBASE,	RDRND,	F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX,
	       PREFETCHW, AES, CLFLUSHOPT, XSAVEC, XSAVES and SGX instruction set support.

	   skylake-avx512
	       Intel Skylake Server CPU with 64-bit extensions, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2,  POPCNT,  CX16,
	       SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX,
	       PREFETCHW,  AES,	 CLFLUSHOPT,  XSAVEC,  XSAVES, SGX, AVX512F, CLWB, AVX512VL, AVX512BW, AVX512DQ and AVX512CD
	       instruction set support.

	   cascadelake
	       Intel Cascade Lake CPU with 64-bit extensions, MMX, SSE, SSE2, SSE3, SSSE3,  SSE4.1,  SSE4.2,  POPCNT,  CX16,
	       SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX,
	       PREFETCHW,  AES,	 CLFLUSHOPT,  XSAVEC, XSAVES, SGX, AVX512F, CLWB, AVX512VL, AVX512BW, AVX512DQ, AVX512CD and
	       AVX512VNNI instruction set support.

	   cannonlake
	       Intel Cannon Lake Server CPU with 64-bit extensions, MMX, SSE, SSE2, SSE3,  SSSE3,  SSE4.1,  SSE4.2,  POPCNT,
	       CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED,
	       ADCX,  PREFETCHW, AES, CLFLUSHOPT, XSAVEC, XSAVES, SGX, AVX512F, AVX512VL, AVX512BW, AVX512DQ, AVX512CD, PKU,
	       AVX512VBMI, AVX512IFMA and SHA instruction set support.

	   cooperlake
	       Intel Cooper Lake CPU with 64-bit extensions, MMX, SSE, SSE2, SSE3,  SSSE3,  SSE4.1,  SSE4.2,  POPCNT,  CX16,
	       SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX,
	       PREFETCHW,  AES,	 CLFLUSHOPT,  XSAVEC,  XSAVES,	SGX,  AVX512F, CLWB, AVX512VL, AVX512BW, AVX512DQ, AVX512CD,
	       AVX512VNNI and AVX512BF16 instruction set support.

	   icelake-client
	       Intel Ice Lake Client CPU with 64-bit extensions, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT,  CX16,
	       SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX,
	       PREFETCHW,  AES,	 CLFLUSHOPT,  XSAVEC,  XSAVES,	SGX,  AVX512F,	AVX512VL, AVX512BW, AVX512DQ, AVX512CD, PKU,
	       AVX512VBMI, AVX512IFMA, SHA, AVX512VNNI, GFNI,  VAES,  AVX512VBMI2  ,  VPCLMULQDQ,  AVX512BITALG,  RDPID	 and
	       AVX512VPOPCNTDQ instruction set support.

	   icelake-server
	       Intel  Ice Lake Server CPU with 64-bit extensions, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16,
	       SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX,
	       PREFETCHW, AES, CLFLUSHOPT, XSAVEC, XSAVES,  SGX,  AVX512F,  AVX512VL,  AVX512BW,  AVX512DQ,  AVX512CD,	PKU,
	       AVX512VBMI,  AVX512IFMA,	 SHA,  AVX512VNNI,  GFNI,  VAES,  AVX512VBMI2  ,  VPCLMULQDQ,  AVX512BITALG,  RDPID,
	       AVX512VPOPCNTDQ, PCONFIG, WBNOINVD and CLWB instruction set support.

	   tigerlake
	       Intel Tiger Lake CPU with 64-bit extensions, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF,
	       FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2,  LZCNT,  FMA,	MOVBE,	HLE,  RDSEED,  ADCX,
	       PREFETCHW,  AES,	 CLFLUSHOPT,  XSAVEC,  XSAVES,	SGX,  AVX512F,	AVX512VL,  AVX512BW, AVX512DQ, AVX512CD PKU,
	       AVX512VBMI,  AVX512IFMA,	 SHA,  AVX512VNNI,  GFNI,  VAES,  AVX512VBMI2,	VPCLMULQDQ,   AVX512BITALG,   RDPID,
	       AVX512VPOPCNTDQ, MOVDIRI, MOVDIR64B, CLWB, AVX512VP2INTERSECT and KEYLOCKER instruction set support.

	   rocketlake
	       Intel  Rocket  Lake  CPU	 with  64-bit extensions, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16,
	       SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX,
	       PREFETCHW, AES, CLFLUSHOPT, XSAVEC, XSAVES, AVX512F, AVX512VL, AVX512BW, AVX512DQ, AVX512CD PKU,	 AVX512VBMI,
	       AVX512IFMA,  SHA,  AVX512VNNI,  GFNI,  VAES, AVX512VBMI2, VPCLMULQDQ, AVX512BITALG, RDPID and AVX512VPOPCNTDQ
	       instruction set support.

	   alderlake
	   raptorlake
	   meteorlake
	   gracemont
	       Intel Alder Lake/Raptor Lake/Meteor Lake/Gracemont CPU with 64-bit extensions, MOVBE, MMX, SSE,	SSE2,  SSE3,
	       SSSE3,  SSE4.1,	SSE4.2,	 POPCNT,  AES,	PREFETCHW, PCLMUL, RDRND, XSAVE, XSAVEC, XSAVES, XSAVEOPT, FSGSBASE,
	       PTWRITE, RDPID, SGX, GFNI-SSE, CLWB, MOVDIRI, MOVDIR64B, WAITPKG, ADCX, AVX,  AVX2,  BMI,  BMI2,	 F16C,	FMA,
	       LZCNT, PCONFIG, PKU, VAES, VPCLMULQDQ, SERIALIZE, HRESET, KL, WIDEKL and AVX-VNNI instruction set support.

	   arrowlake
	       Intel Arrow Lake CPU with 64-bit extensions, MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AES,
	       PREFETCHW,  PCLMUL,  RDRND,  XSAVE,  XSAVEC, XSAVES, XSAVEOPT, FSGSBASE, PTWRITE, RDPID, SGX, GFNI-SSE, CLWB,
	       MOVDIRI, MOVDIR64B, WAITPKG, ADCX, AVX, AVX2, BMI, BMI2, F16C, FMA, LZCNT, PCONFIG,  PKU,  VAES,	 VPCLMULQDQ,
	       SERIALIZE,  HRESET, KL, WIDEKL, AVX-VNNI, UINTR, AVXIFMA, AVXVNNIINT8, AVXNECONVERT and CMPCCXADD instruction
	       set support.

	   arrowlake-s
	   lunarlake
	       Intel Arrow Lake S/Lunar Lake CPU with 64-bit extensions, MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2,
	       POPCNT, AES, PREFETCHW, PCLMUL, RDRND, XSAVE, XSAVEC, XSAVES, XSAVEOPT, FSGSBASE, PTWRITE, RDPID, SGX,  GFNI-
	       SSE,  CLWB,  MOVDIRI,  MOVDIR64B,  WAITPKG, ADCX, AVX, AVX2, BMI, BMI2, F16C, FMA, LZCNT, PCONFIG, PKU, VAES,
	       VPCLMULQDQ, SERIALIZE, HRESET, KL, WIDEKL, AVX-VNNI, UINTR, AVXIFMA,  AVXVNNIINT8,  AVXNECONVERT,  CMPCCXADD,
	       AVXVNNIINT16, SHA512, SM3 and SM4 instruction set support.

	   pantherlake
	       Intel  Panther  Lake  CPU with 64-bit extensions, MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT,
	       AES, PREFETCHW, PCLMUL, RDRND, XSAVE, XSAVEC, XSAVES, XSAVEOPT,	FSGSBASE,  PTWRITE,  RDPID,  SGX,  GFNI-SSE,
	       CLWB,  MOVDIRI,	MOVDIR64B,  WAITPKG,  ADCX,  AVX,  AVX2,  BMI,	BMI2,  F16C, FMA, LZCNT, PCONFIG, PKU, VAES,
	       VPCLMULQDQ, SERIALIZE, HRESET, AVX-VNNI, UINTR, AVXIFMA, AVXVNNIINT8, AVXNECONVERT, CMPCCXADD,  AVXVNNIINT16,
	       SHA512, SM3 and SM4 instruction set support.

	   sapphirerapids
	   emeraldrapids
	       Intel Sapphire Rapids/Emerald Rapids CPU with 64-bit extensions, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2,
	       POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE,
	       RDSEED,	ADCX,  PREFETCHW,  AES,	 CLFLUSHOPT,  XSAVEC,  XSAVES,	SGX,  AVX512F, AVX512VL, AVX512BW, AVX512DQ,
	       AVX512CD, PKU, AVX512VBMI, AVX512IFMA, SHA, AVX512VNNI, GFNI, VAES,  AVX512VBMI2,  VPCLMULQDQ,  AVX512BITALG,
	       RDPID,  AVX512VPOPCNTDQ,	 PCONFIG,  WBNOINVD,  CLWB,  MOVDIRI, MOVDIR64B, ENQCMD, CLDEMOTE, PTWRITE, WAITPKG,
	       SERIALIZE, TSXLDTRK, UINTR, AMX-BF16, AMX-TILE, AMX-INT8, AVX-VNNI, AVX512-FP16	and  AVX512BF16	 instruction
	       set support.

	   graniterapids
	       Intel  Granite  Rapids CPU with 64-bit extensions, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16,
	       SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX,
	       PREFETCHW, AES, CLFLUSHOPT, XSAVEC, XSAVES,  SGX,  AVX512F,  AVX512VL,  AVX512BW,  AVX512DQ,  AVX512CD,	PKU,
	       AVX512VBMI,   AVX512IFMA,   SHA,	 AVX512VNNI,  GFNI,  VAES,  AVX512VBMI2,  VPCLMULQDQ,  AVX512BITALG,  RDPID,
	       AVX512VPOPCNTDQ, PCONFIG, WBNOINVD, CLWB, MOVDIRI, MOVDIR64B, ENQCMD, CLDEMOTE, PTWRITE, WAITPKG,  SERIALIZE,
	       TSXLDTRK,  UINTR,  AMX-BF16,  AMX-TILE,	AMX-INT8,  AVX-VNNI, AVX512-FP16, AVX512BF16, AMX-FP16 and PREFETCHI
	       instruction set support.

	   graniterapids-d
	       Intel Granite Rapids D CPU with 64-bit extensions, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, CX16,
	       SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX,
	       PREFETCHW, AES, CLFLUSHOPT, XSAVEC, XSAVES,  SGX,  AVX512F,  AVX512VL,  AVX512BW,  AVX512DQ,  AVX512CD,	PKU,
	       AVX512VBMI,   AVX512IFMA,   SHA,	 AVX512VNNI,  GFNI,  VAES,  AVX512VBMI2,  VPCLMULQDQ,  AVX512BITALG,  RDPID,
	       AVX512VPOPCNTDQ, PCONFIG, WBNOINVD, CLWB, MOVDIRI, MOVDIR64B, ENQCMD, CLDEMOTE, PTWRITE, WAITPKG,  SERIALIZE,
	       TSXLDTRK, UINTR, AMX-BF16, AMX-TILE, AMX-INT8, AVX-VNNI, AVX512FP16, AVX512BF16, AMX-FP16, PREFETCHI and AMX-
	       COMPLEX instruction set support.

	   diamondrapids
	       Intel  Diamond Rapids CPU with 64-bit extensions, MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT,
	       CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED,
	       ADCX, PREFETCHW, AES, CLFLUSHOPT, XSAVEC, XSAVES, SGX, AVX512F, AVX512VL, AVX512BW, AVX512DQ, AVX512CD,	PKU,
	       AVX512VBMI,   AVX512IFMA,   SHA,	 AVX512VNNI,  GFNI,  VAES,  AVX512VBMI2,  VPCLMULQDQ,  AVX512BITALG,  RDPID,
	       AVX512VPOPCNTDQ, PCONFIG, WBNOINVD, CLWB, MOVDIRI, MOVDIR64B, ENQCMD, CLDEMOTE, PTWRITE, WAITPKG,  SERIALIZE,
	       TSXLDTRK,  UINTR,  AMX-BF16,  AMX-TILE, AMX-INT8, AVX-VNNI, AVX512FP16, AVX512BF16, AMX-FP16, PREFETCHI, AMX-
	       COMPLEX, AVX10.1-512, AVX-IFMA, AVX-NE-CONVERT, AVX-VNNI-INT16, AVX-VNNI-INT8, CMPccXADD, SHA512,  SM3,	SM4,
	       AVX10.2-512, APX_F, AMX-AVX512, AMX-FP8, AMX-TF32, MOVRS and AMX-MOVRS instruction set support.

	   bonnell
	   atom
	       Intel Bonnell CPU with 64-bit extensions, MOVBE, MMX, SSE, SSE2, SSE3 and SSSE3 instruction set support.

	   silvermont
	   slm Intel  Silvermont  CPU  with  64-bit  extensions, MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT,
	       CX16, SAHF, FXSR, PCLMUL, PREFETCHW and RDRND instruction set support.

	   goldmont
	       Intel Goldmont CPU with 64-bit extensions, MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT,  CX16,
	       SAHF,  FXSR,  PCLMUL,  PREFETCHW,  RDRND,  AES,	SHA, RDSEED, XSAVE, XSAVEC, XSAVES, XSAVEOPT, CLFLUSHOPT and
	       FSGSBASE instruction set support.

	   goldmont-plus
	       Intel Goldmont Plus CPU with 64-bit extensions, MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1,  SSE4.2,  POPCNT,
	       CX16,  SAHF,  FXSR,  PCLMUL, PREFETCHW, RDRND, AES, SHA, RDSEED, XSAVE, XSAVEC, XSAVES, XSAVEOPT, CLFLUSHOPT,
	       FSGSBASE, PTWRITE, RDPID and SGX instruction set support.

	   tremont
	       Intel Tremont CPU with 64-bit extensions, MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2,  POPCNT,  CX16,
	       SAHF,  FXSR,  PCLMUL,  PREFETCHW,  RDRND,  AES,	SHA,  RDSEED,  XSAVE,  XSAVEC, XSAVES, XSAVEOPT, CLFLUSHOPT,
	       FSGSBASE, PTWRITE, RDPID, SGX, CLWB, GFNI-SSE, MOVDIRI,	MOVDIR64B,  CLDEMOTE  and  WAITPKG  instruction	 set
	       support.

	   sierraforest
	       Intel  Sierra  Forest CPU with 64-bit extensions, MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT,
	       AES, PREFETCHW, PCLMUL, RDRND, XSAVE, XSAVEC, XSAVES, XSAVEOPT,	FSGSBASE,  PTWRITE,  RDPID,  SGX,  GFNI-SSE,
	       CLWB,  MOVDIRI,	MOVDIR64B,  CLDEMOTE,  WAITPKG,	 ADCX, AVX, AVX2, BMI, BMI2, F16C, FMA, LZCNT, PCONFIG, PKU,
	       VAES, VPCLMULQDQ, SERIALIZE, HRESET, KL, WIDEKL, AVX-VNNI,  AVXIFMA,  AVXVNNIINT8,  AVXNECONVERT,  CMPCCXADD,
	       ENQCMD and UINTR instruction set support.

	   grandridge
	       Intel  Grand  Ridge  CPU	 with 64-bit extensions, MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT,
	       AES, PREFETCHW, PCLMUL, RDRND, XSAVE, XSAVEC, XSAVES, XSAVEOPT,	FSGSBASE,  PTWRITE,  RDPID,  SGX,  GFNI-SSE,
	       CLWB,  MOVDIRI,	MOVDIR64B,  CLDEMOTE,  WAITPKG,	 ADCX, AVX, AVX2, BMI, BMI2, F16C, FMA, LZCNT, PCONFIG, PKU,
	       VAES, VPCLMULQDQ, SERIALIZE, HRESET, KL, WIDEKL, AVX-VNNI,  AVXIFMA,  AVXVNNIINT8,  AVXNECONVERT,  CMPCCXADD,
	       ENQCMD and UINTR instruction set support.

	   clearwaterforest
	       Intel  Clearwater  Forest  CPU  with  64-bit  extensions, MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2,
	       POPCNT, AES, PREFETCHW, PCLMUL, RDRND, XSAVE, XSAVEC, XSAVES, XSAVEOPT, FSGSBASE, PTWRITE, RDPID, SGX,  GFNI-
	       SSE, CLWB, MOVDIRI, MOVDIR64B, CLDEMOTE, WAITPKG, ADCX, AVX, AVX2, BMI, BMI2, F16C, FMA, LZCNT, PCONFIG, PKU,
	       VAES,  VPCLMULQDQ, SERIALIZE, HRESET, AVX-VNNI, ENQCMD, UINTR, AVXIFMA, AVXVNNIINT8, AVXNECONVERT, CMPCCXADD,
	       AVXVNNIINT16, SHA512, SM3, SM4, USER_MSR and PREFETCHI instruction set support.

	   k6  AMD K6 CPU with MMX instruction set support.

	   k6-2
	   k6-3
	       Improved versions of AMD K6 CPU with MMX and 3DNow! instruction set support.

	   athlon
	   athlon-tbird
	       AMD Athlon CPU with MMX, 3dNOW!, enhanced 3DNow! and SSE prefetch instructions support.

	   athlon-4
	   athlon-xp
	   athlon-mp
	       Improved AMD Athlon CPU with MMX, 3DNow!, enhanced 3DNow! and full SSE instruction set support.

	   k8
	   opteron
	   athlon64
	   athlon-fx
	       Processors based on the AMD K8 core with x86-64 instruction set support, including the  AMD  Opteron,  Athlon
	       64,  and	 Athlon	 64  FX	 processors.   (This  supersets	 MMX,  SSE, SSE2, 3DNow!, enhanced 3DNow! and 64-bit
	       instruction set extensions.)

	   k8-sse3
	   opteron-sse3
	   athlon64-sse3
	       Improved versions of AMD K8 cores with SSE3 instruction set support.

	   amdfam10
	   barcelona
	       CPUs based on AMD Family 10h cores with x86-64 instruction set support.	 (This	supersets  MMX,	 SSE,  SSE2,
	       SSE3, SSE4A, 3DNow!, enhanced 3DNow!, ABM and 64-bit instruction set extensions.)

	   bdver1
	       CPUs based on AMD Family 15h cores with x86-64 instruction set support.	(This supersets FMA4, AVX, XOP, LWP,
	       AES,  PCLMUL,  CX16,  MMX,  SSE,	 SSE2,	SSE3,  SSE4A,  SSSE3, SSE4.1, SSE4.2, ABM and 64-bit instruction set
	       extensions.)

	   bdver2
	       AMD Family 15h core based CPUs with x86-64 instruction set support.  (This supersets  BMI,  TBM,	 F16C,	FMA,
	       FMA4,  AVX,  XOP,  LWP, AES, PCLMUL, CX16, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM and 64-bit
	       instruction set extensions.)

	   bdver3
	       AMD Family 15h core based CPUs with x86-64 instruction set support.  (This supersets  BMI,  TBM,	 F16C,	FMA,
	       FMA4, FSGSBASE, AVX, XOP, LWP, AES, PCLMUL, CX16, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM and
	       64-bit instruction set extensions.)

	   bdver4
	       AMD  Family  15h	 core based CPUs with x86-64 instruction set support.  (This supersets BMI, BMI2, TBM, F16C,
	       FMA, FMA4, FSGSBASE, AVX, AVX2, XOP, LWP, AES, PCLMUL, CX16, MOVBE,  MMX,  SSE,	SSE2,  SSE3,  SSE4A,  SSSE3,
	       SSE4.1, SSE4.2, ABM and 64-bit instruction set extensions.)

	   znver1
	       AMD  Family  17h	 core based CPUs with x86-64 instruction set support.  (This supersets BMI, BMI2, F16C, FMA,
	       FSGSBASE, AVX, AVX2, ADCX, RDSEED, MWAITX, SHA, CLZERO, AES, PCLMUL,  CX16,  MOVBE,  MMX,  SSE,	SSE2,  SSE3,
	       SSE4A,  SSSE3,  SSE4.1,	SSE4.2,	 ABM,  XSAVEC,	XSAVES,	 CLFLUSHOPT,  POPCNT,  and  64-bit  instruction	 set
	       extensions.)

	   znver2
	       AMD Family 17h core based CPUs with x86-64 instruction set support. (This supersets BMI,	 BMI2,	CLWB,  F16C,
	       FMA,  FSGSBASE, AVX, AVX2, ADCX, RDSEED, MWAITX, SHA, CLZERO, AES, PCLMUL, CX16, MOVBE, MMX, SSE, SSE2, SSE3,
	       SSE4A, SSSE3,  SSE4.1,  SSE4.2,	ABM,  XSAVEC,  XSAVES,	CLFLUSHOPT,  POPCNT,  RDPID,  WBNOINVD,	 and  64-bit
	       instruction set extensions.)

	   znver3
	       AMD  Family  19h	 core based CPUs with x86-64 instruction set support. (This supersets BMI, BMI2, CLWB, F16C,
	       FMA, FSGSBASE, AVX, AVX2, ADCX, RDSEED, MWAITX, SHA, CLZERO, AES, PCLMUL, CX16, MOVBE, MMX, SSE, SSE2,  SSE3,
	       SSE4A,  SSSE3,  SSE4.1,	SSE4.2,	 ABM,  XSAVEC, XSAVES, CLFLUSHOPT, POPCNT, RDPID, WBNOINVD, PKU, VPCLMULQDQ,
	       VAES, and 64-bit instruction set extensions.)

	   znver4
	       AMD Family 19h core based CPUs with x86-64 instruction set support. (This supersets BMI,	 BMI2,	CLWB,  F16C,
	       FMA,  FSGSBASE, AVX, AVX2, ADCX, RDSEED, MWAITX, SHA, CLZERO, AES, PCLMUL, CX16, MOVBE, MMX, SSE, SSE2, SSE3,
	       SSE4A, SSSE3, SSE4.1, SSE4.2, ABM, XSAVEC, XSAVES, CLFLUSHOPT,  POPCNT,	RDPID,	WBNOINVD,  PKU,	 VPCLMULQDQ,
	       VAES,  AVX512F,	AVX512DQ,  AVX512IFMA,	AVX512CD,  AVX512BW,  AVX512VL, AVX512BF16, AVX512VBMI, AVX512VBMI2,
	       AVX512VNNI, AVX512BITALG, AVX512VPOPCNTDQ, GFNI and 64-bit instruction set extensions.)

	   znver5
	       AMD Family 1ah core based CPUs with x86-64 instruction set support. (This supersets BMI,	 BMI2,	CLWB,  F16C,
	       FMA,  FSGSBASE, AVX, AVX2, ADCX, RDSEED, MWAITX, SHA, CLZERO, AES, PCLMUL, CX16, MOVBE, MMX, SSE, SSE2, SSE3,
	       SSE4A, SSSE3, SSE4.1, SSE4.2, ABM, XSAVEC, XSAVES, CLFLUSHOPT,  POPCNT,	RDPID,	WBNOINVD,  PKU,	 VPCLMULQDQ,
	       VAES,  AVX512F,	AVX512DQ,  AVX512IFMA,	AVX512CD,  AVX512BW,  AVX512VL, AVX512BF16, AVX512VBMI, AVX512VBMI2,
	       AVX512VNNI, AVX512BITALG, AVX512VPOPCNTDQ, GFNI, AVXVNNI, MOVDIRI, MOVDIR64B,  AVX512VP2INTERSECT,  PREFETCHI
	       and 64-bit instruction set extensions.)

	   btver1
	       CPUs  based  on	AMD  Family  14h cores with x86-64 instruction set support.  (This supersets MMX, SSE, SSE2,
	       SSE3, SSSE3, SSE4A, CX16, ABM and 64-bit instruction set extensions.)

	   btver2
	       CPUs based on AMD Family 16h cores with x86-64 instruction set support. This includes MOVBE, F16C, BMI,	AVX,
	       PCLMUL,	AES,  SSE4.2,  SSE4.1,	CX16,  ABM,  SSE4A,  SSSE3,  SSE3, SSE2, SSE, MMX and 64-bit instruction set
	       extensions.

	   winchip-c6
	       IDT WinChip C6 CPU, dealt in same way as i486 with additional MMX instruction set support.

	   winchip2
	       IDT WinChip 2 CPU, dealt in same way as i486 with additional MMX and 3DNow!  instruction set support.

	   c3  VIA C3 CPU with MMX and 3DNow! instruction set support.	(No scheduling is implemented for this chip.)

	   c3-2
	       VIA C3-2 (Nehemiah/C5XL) CPU with MMX and SSE instruction set support.  (No  scheduling	is  implemented	 for
	       this chip.)

	   c7  VIA  C7 (Esther) CPU with MMX, SSE, SSE2 and SSE3 instruction set support.  (No scheduling is implemented for
	       this chip.)

	   samuel-2
	       VIA Eden Samuel 2 CPU with MMX and 3DNow! instruction set support.  (No scheduling is  implemented  for	this
	       chip.)

	   nehemiah
	       VIA  Eden  Nehemiah  CPU	 with  MMX  and SSE instruction set support.  (No scheduling is implemented for this
	       chip.)

	   esther
	       VIA Eden Esther CPU with MMX, SSE, SSE2 and SSE3 instruction set support.  (No scheduling is implemented	 for
	       this chip.)

	   eden-x2
	       VIA  Eden X2 CPU with x86-64, MMX, SSE, SSE2 and SSE3 instruction set support.  (No scheduling is implemented
	       for this chip.)

	   eden-x4
	       VIA Eden X4 CPU with x86-64, MMX, SSE, SSE2, SSE3, SSSE3,  SSE4.1,  SSE4.2,  AVX	 and  AVX2  instruction	 set
	       support.	 (No scheduling is implemented for this chip.)

	   nano
	       Generic	VIA Nano CPU with x86-64, MMX, SSE, SSE2, SSE3 and SSSE3 instruction set support.  (No scheduling is
	       implemented for this chip.)

	   nano-1000
	       VIA Nano 1xxx CPU with x86-64, MMX, SSE, SSE2, SSE3 and SSSE3 instruction set  support.	 (No  scheduling  is
	       implemented for this chip.)

	   nano-2000
	       VIA  Nano  2xxx	CPU  with x86-64, MMX, SSE, SSE2, SSE3 and SSSE3 instruction set support.  (No scheduling is
	       implemented for this chip.)

	   nano-3000
	       VIA Nano 3xxx CPU with x86-64, MMX,  SSE,  SSE2,	 SSE3,	SSSE3  and  SSE4.1  instruction	 set  support.	 (No
	       scheduling is implemented for this chip.)

	   nano-x2
	       VIA  Nano  Dual	Core  CPU  with x86-64, MMX, SSE, SSE2, SSE3, SSSE3 and SSE4.1 instruction set support.	 (No
	       scheduling is implemented for this chip.)

	   nano-x4
	       VIA Nano Quad Core CPU with x86-64, MMX, SSE, SSE2, SSE3, SSSE3 and  SSE4.1  instruction	 set  support.	 (No
	       scheduling is implemented for this chip.)

	   lujiazui
	       ZHAOXIN	lujiazui  CPU  with x86-64, MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AES, PCLMUL,
	       RDRND, XSAVE, XSAVEOPT, FSGSBASE, CX16, ABM, BMI, BMI2, FXSR, RDSEED instruction set support.  While the CPUs
	       do support AVX and F16C, these aren't enabled by "-march=lujiazui" for performance reasons.

	   yongfeng
	       ZHAOXIN yongfeng CPU with x86-64, MOVBE, MMX, SSE, SSE2, SSE3,  SSSE3,  SSE4.1,	SSE4.2,	 AVX,  POPCNT,	AES,
	       PCLMUL,	RDRND,	XSAVE,	XSAVEOPT,  FSGSBASE, CX16, ABM, BMI, BMI2, F16C, FXSR, RDSEED, AVX2, FMA, SHA, LZCNT
	       instruction set support.

	   shijidadao
	       ZHAOXIN shijidadao CPU with x86-64, MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1,	SSE4.2,	 AVX,  POPCNT,	AES,
	       PCLMUL,	RDRND,	XSAVE,	XSAVEOPT,  FSGSBASE, CX16, ABM, BMI, BMI2, F16C, FXSR, RDSEED, AVX2, FMA, SHA, LZCNT
	       instruction set support.

	   geode
	       AMD Geode embedded processor with MMX and 3DNow! instruction set support.

       -mtune=cpu-type
	   Tune to cpu-type everything applicable about the generated code, except for the ABI	and  the  set  of  available
	   instructions.   While  picking  a  specific cpu-type schedules things appropriately for that particular chip, the
	   compiler does not generate any code that cannot run on the default machine type unless you use a  -march=cpu-type
	   option.   For  example,  if	GCC  is configured for i686-pc-linux-gnu then -mtune=pentium4 generates code that is
	   tuned for Pentium 4 but still runs on i686 machines.

	   The choices for cpu-type are the same as for -march.	 In addition, -mtune supports 2 extra choices for cpu-type:

	   generic
	       Produce code optimized for the most common IA32/AMD64/EM64T processors.	If you know the CPU  on	 which	your
	       code will run, then you should use the corresponding -mtune or -march option instead of -mtune=generic.	But,
	       if you do not know exactly what CPU users of your application will have, then you should use this option.

	       As  new	processors  are deployed in the marketplace, the behavior of this option will change.  Therefore, if
	       you upgrade to a newer version of GCC, code generation controlled by this option will change to	reflect	 the
	       processors that are most common at the time that version of GCC is released.

	       There  is  no  -march=generic  option  because -march indicates the instruction set the compiler can use, and
	       there is no generic instruction set  applicable	to  all	 processors.   In  contrast,  -mtune  indicates	 the
	       processor (or, in this case, collection of processors) for which the code is optimized.

	   intel
	       Produce	code  optimized	 for  the  most	 current Intel processors, which are Haswell and Silvermont for this
	       version of GCC.	If you know the CPU on which your code will run,  then	you  should  use  the  corresponding
	       -mtune  or  -march option instead of -mtune=intel.  But, if you want your application performs better on both
	       Haswell and Silvermont, then you should use this option.

	       As new Intel processors are deployed in the marketplace, the behavior of this option will change.  Therefore,
	       if you upgrade to a newer version of GCC, code generation controlled by this option will	 change	 to  reflect
	       the most current Intel processors at the time that version of GCC is released.

	       There  is no -march=intel option because -march indicates the instruction set the compiler can use, and there
	       is no common instruction set applicable to all processors.  In contrast, -mtune indicates the processor	(or,
	       in this case, collection of processors) for which the code is optimized.

       -mcpu=cpu-type
	   A deprecated synonym for -mtune.

       -mfpmath=unit
	   Generate floating-point arithmetic for selected unit unit.  The choices for unit are:

	   387 Use  the	 standard  387	floating-point	coprocessor present on the majority of chips and emulated otherwise.
	       Code compiled with this option runs  almost  everywhere.	  The  temporary  results  are	computed  in  80-bit
	       precision instead of the precision specified by the type, resulting in slightly different results compared to
	       most of other chips.  See -ffloat-store for more detailed description.

	       This is the default choice for non-Darwin x86-32 targets.

	   sse Use scalar floating-point instructions present in the SSE instruction set.  This instruction set is supported
	       by  Pentium III and newer chips, and in the AMD line by Athlon-4, Athlon XP and Athlon MP chips.	 The earlier
	       version of the SSE instruction set supports only single-precision arithmetic, thus the double  and  extended-
	       precision  arithmetic  are  still  done using 387.  A later version, present only in Pentium 4 and AMD x86-64
	       chips, supports double-precision arithmetic too.

	       For the x86-32 compiler, you must use -march=cpu-type, -msse or -msse2 switches to enable SSE extensions	 and
	       make this option effective.  For the x86-64 compiler, these extensions are enabled by default.

	       The resulting code should be considerably faster in the majority of cases and avoid the numerical instability
	       problems of 387 code, but may break some existing code that expects temporaries to be 80 bits.

	       This  is the default choice for the x86-64 compiler, Darwin x86-32 targets, and the default choice for x86-32
	       targets with the SSE2 instruction set when -ffast-math is enabled.

	   sse,387
	   sse+387
	   both
	       Attempt to utilize both instruction  sets  at  once.   This  effectively	 doubles  the  amount  of  available
	       registers,  and on chips with separate execution units for 387 and SSE the execution resources too.  Use this
	       option with care, as it is still experimental, because the GCC register allocator  does	not  model  separate
	       functional units well, resulting in unstable performance.

       -masm=dialect
	   Output  assembly  instructions  using  selected  dialect.  Also affects which dialect is used for basic "asm" and
	   extended "asm". Supported choices (in dialect order) are att or intel.  The	default	 is  att.  Darwin  does	 not
	   support intel.

       -mieee-fp
       -mno-ieee-fp
	   Control  whether or not the compiler uses IEEE floating-point comparisons.  These correctly handle the case where
	   the result of a comparison is unordered.

       -m80387
       -mhard-float
	   Generate output containing 80387 instructions for floating point.

       -mno-80387
       -msoft-float
	   Generate output containing library calls for floating point.

	   Warning: the requisite libraries are not part of GCC.  Normally the facilities of the machine's usual C  compiler
	   are	used, but this cannot be done directly in cross-compilation.  You must make your own arrangements to provide
	   suitable library functions for cross-compilation.

	   On machines where a function returns floating-point results in the  80387  register	stack,	some  floating-point
	   opcodes may be emitted even if -msoft-float is used.

       -mno-fp-ret-in-387
	   Do not use the FPU registers for return values of functions.

	   The	usual  calling convention has functions return values of types "float" and "double" in an FPU register, even
	   if there is no FPU.	The idea is that the operating system should emulate an FPU.

	   The option -mno-fp-ret-in-387 causes such values to be returned in ordinary CPU registers instead.

       -mno-fancy-math-387
	   Some 387 emulators do not support the "sin", "cos" and "sqrt" instructions for the 387.  Specify this  option  to
	   avoid  generating those instructions.  This option is overridden when -march indicates that the target CPU always
	   has an FPU and so the instruction does not need emulation.  These instructions are not generated unless you	also
	   use the -funsafe-math-optimizations switch.

       -malign-double
       -mno-align-double
	   Control  whether  GCC  aligns "double", "long double", and "long long" variables on a two-word boundary or a one-
	   word boundary.  Aligning "double" variables on a two-word boundary produces code that runs somewhat faster  on  a
	   Pentium at the expense of more memory.

	   On x86-64, -malign-double is enabled by default.

	   Warning: if you use the -malign-double switch, structures containing the above types are aligned differently than
	   the	published  application	binary	interface  specifications  for the x86-32 and are not binary compatible with
	   structures in code compiled without that switch.

       -m96bit-long-double
       -m128bit-long-double
	   These switches control the size of "long double" type.  The x86-32 application  binary  interface  specifies	 the
	   size to be 96 bits, so -m96bit-long-double is the default in 32-bit mode.

	   Modern  architectures  (Pentium  and	 newer) prefer "long double" to be aligned to an 8- or 16-byte boundary.  In
	   arrays or structures conforming to the ABI, this is not  possible.	So  specifying	-m128bit-long-double  aligns
	   "long double" to a 16-byte boundary by padding the "long double" with an additional 32-bit zero.

	   In  the  x86-64  compiler,  -m128bit-long-double is the default choice as its ABI specifies that "long double" is
	   aligned on 16-byte boundary.

	   Notice that neither of these options enable any extra precision over the x87 standard of  80	 bits  for  a  "long
	   double".

	   Warning:  if	 you  override the default value for your target ABI, this changes the size of structures and arrays
	   containing "long double" variables, as well as modifying the function calling  convention  for  functions  taking
	   "long double".  Hence they are not binary-compatible with code compiled without that switch.

       -mlong-double-64
       -mlong-double-80
       -mlong-double-128
	   These  switches control the size of "long double" type. A size of 64 bits makes the "long double" type equivalent
	   to the "double" type. This is the default for 32-bit Bionic C library.  A  size  of	128  bits  makes  the  "long
	   double" type equivalent to the "__float128" type. This is the default for 64-bit Bionic C library.

	   Warning:  if	 you  override the default value for your target ABI, this changes the size of structures and arrays
	   containing "long double" variables, as well as modifying the function calling  convention  for  functions  taking
	   "long double".  Hence they are not binary-compatible with code compiled without that switch.

       -malign-data=type
	   Control how GCC aligns variables.  Supported values for type are compat uses increased alignment value compatible
	   uses	 GCC  4.8  and	earlier,  abi  uses  alignment value as specified by the psABI, and cacheline uses increased
	   alignment value to match the cache line size.  compat is the default.

       -mlarge-data-threshold=threshold
	   When -mcmodel=medium or -mcmodel=large is specified, data objects larger than threshold are placed in large	data
	   sections.  The default is 65535.

       -mrtd
	   Use a different function-calling convention, in which functions that take a fixed number of arguments return with
	   the	"ret num" instruction, which pops their arguments while returning.  This saves one instruction in the caller
	   since there is no need to pop the arguments there.

	   You can specify that an individual function is called with this calling  sequence  with  the	 function  attribute
	   "stdcall".  You can also override the -mrtd option by using the function attribute "cdecl".

	   Warning:  this calling convention is incompatible with the one normally used on Unix, so you cannot use it if you
	   need to call libraries compiled with the Unix compiler.

	   Also, you must provide function prototypes for all functions that take variable numbers of  arguments  (including
	   "printf"); otherwise incorrect code is generated for calls to those functions.

	   In  addition,  seriously incorrect code results if you call a function with too many arguments.  (Normally, extra
	   arguments are harmlessly ignored.)

       -mregparm=num
	   Control how many registers are used to pass integer arguments.   By	default,  no  registers	 are  used  to	pass
	   arguments,  and  at most 3 registers can be used.  You can control this behavior for a specific function by using
	   the function attribute "regparm".

	   Warning: if you use this switch, and num is nonzero, then you  must	build  all  modules  with  the	same  value,
	   including any libraries.  This includes the system libraries and startup modules.

       -msseregparm
	   Use	SSE  register  passing	conventions  for float and double arguments and return values.	You can control this
	   behavior for a specific function by using the function attribute "sseregparm".

	   Warning: if you use this switch then you must build all modules with the same  value,  including  any  libraries.
	   This includes the system libraries and startup modules.

       -mvect8-ret-in-mem
	   Return 8-byte vectors in memory instead of MMX registers.  This is the default on VxWorks to match the ABI of the
	   Sun	Studio compilers until version 12.  Only use this option if you need to remain compatible with existing code
	   produced by those previous compiler versions or older versions of GCC.

       -mpc32
       -mpc64
       -mpc80
	   Set 80387 floating-point precision to 32, 64 or 80 bits.  When -mpc32 is specified, the significands	 of  results
	   of floating-point operations are rounded to 24 bits (single precision); -mpc64 rounds the significands of results
	   of  floating-point  operations  to  53  bits	 (double precision) and -mpc80 rounds the significands of results of
	   floating-point operations to 64 bits (extended double precision), which is the  default.   When  this  option  is
	   used,  floating-point operations in higher precisions are not available to the programmer without setting the FPU
	   control word explicitly.

	   Setting the rounding of floating-point operations to less than the default 80 bits can speed some programs by  2%
	   or more.  Note that some mathematical libraries assume that extended-precision (80-bit) floating-point operations
	   are	enabled	 by default; routines in such libraries could suffer significant loss of accuracy, typically through
	   so-called "catastrophic cancellation", when this option is used to  set  the	 precision  to	less  than  extended
	   precision.

       -mdaz-ftz
	   The	flush-to-zero  (FTZ)  and denormals-are-zero (DAZ) flags in the MXCSR register are used to control floating-
	   point calculations.SSE and AVX instructions including scalar and vector instructions could benefit from  enabling
	   the	FTZ  and  DAZ  flags  when  -mdaz-ftz  is specified. Don't set FTZ/DAZ flags when -mno-daz-ftz or -shared is
	   specified, -mdaz-ftz will set FTZ/DAZ flags even with -shared.

       -mstackrealign
	   Realign the stack at entry.	On the x86, the -mstackrealign option generates an alternate prologue  and  epilogue
	   that	 realigns  the	run-time  stack	 if  necessary.	  This	supports  mixing legacy codes that keep 4-byte stack
	   alignment with modern codes that keep 16-byte stack alignment for SSE  compatibility.   See	also  the  attribute
	   "force_align_arg_pointer", applicable to individual functions.

       -mpreferred-stack-boundary=num
	   Attempt  to keep the stack boundary aligned to a 2 raised to num byte boundary.  If -mpreferred-stack-boundary is
	   not specified, the default is 4 (16 bytes or 128 bits).

	   Warning:   When   generating	  code	 for   the   x86-64   architecture    with    SSE    extensions	   disabled,
	   -mpreferred-stack-boundary=3 can be used to keep the stack boundary aligned to 8 byte boundary.  Since x86-64 ABI
	   require 16 byte stack alignment, this is ABI incompatible and intended to be used in controlled environment where
	   stack  space is important limitation.  This option leads to wrong code when functions compiled with 16 byte stack
	   alignment (such as functions from a standard library) are called  with  misaligned  stack.	In  this  case,	 SSE
	   instructions may lead to misaligned memory access traps.  In addition, variable arguments are handled incorrectly
	   for	16  byte aligned objects (including x87 long double and __int128), leading to wrong results.  You must build
	   all modules with -mpreferred-stack-boundary=3, including any libraries.  This includes the system  libraries	 and
	   startup modules.

       -mincoming-stack-boundary=num
	   Assume  the	incoming  stack	 is aligned to a 2 raised to num byte boundary.	 If -mincoming-stack-boundary is not
	   specified, the one specified by -mpreferred-stack-boundary is used.

	   On Pentium and Pentium Pro, "double" and "long double" values should	 be  aligned  to  an  8-byte  boundary	(see
	   -malign-double)  or	suffer	significant  run  time	performance  penalties.	  On Pentium III, the Streaming SIMD
	   Extension (SSE) data type "__m128" may not work properly if it is not 16-byte aligned.

	   To ensure proper alignment of this values on the stack, the stack boundary must be as aligned as that required by
	   any value stored on the stack.  Further, every function must be generated such that it keeps the  stack  aligned.
	   Thus	 calling  a  function  compiled with a higher preferred stack boundary from a function compiled with a lower
	   preferred stack boundary most likely misaligns the stack.  It is recommended that libraries	that  use  callbacks
	   always use the default setting.

	   This	 extra	alignment does consume extra stack space, and generally increases code size.  Code that is sensitive
	   to stack space usage, such as embedded systems and operating system kernels, may want  to  reduce  the  preferred
	   alignment to -mpreferred-stack-boundary=2.

       -mmmx
       -msse
       -msse2
       -msse3
       -mssse3
       -msse4
       -msse4a
       -msse4.1
       -msse4.2
       -mavx
       -mavx2
       -mavx512f
       -mavx512cd
       -mavx512vl
       -mavx512bw
       -mavx512dq
       -mavx512ifma
       -mavx512vbmi
       -msha
       -maes
       -mpclmul
       -mclflushopt
       -mclwb
       -mfsgsbase
       -mptwrite
       -mrdrnd
       -mf16c
       -mfma
       -mpconfig
       -mwbnoinvd
       -mfma4
       -mprfchw
       -mrdpid
       -mrdseed
       -msgx
       -mxop
       -mlwp
       -m3dnow
       -m3dnowa
       -mpopcnt
       -mabm
       -madx
       -mbmi
       -mbmi2
       -mlzcnt
       -mfxsr
       -mxsave
       -mxsaveopt
       -mxsavec
       -mxsaves
       -mrtm
       -mhle
       -mtbm
       -mmwaitx
       -mclzero
       -mpku
       -mavx512vbmi2
       -mavx512bf16
       -mavx512fp16
       -mgfni
       -mvaes
       -mwaitpkg
       -mvpclmulqdq
       -mavx512bitalg
       -mmovdiri
       -mmovdir64b
       -menqcmd
       -muintr
       -mtsxldtrk
       -mavx512vpopcntdq
       -mavx512vp2intersect
       -mavx512vnni
       -mavxvnni
       -mcldemote
       -mserialize
       -mamx-tile
       -mamx-int8
       -mamx-bf16
       -mhreset
       -mkl
       -mwidekl
       -mavxifma
       -mavxvnniint8
       -mavxneconvert
       -mcmpccxadd
       -mamx-fp16
       -mprefetchi
       -mraoint
       -mamx-complex
       -mavxvnniint16
       -msm3
       -msha512
       -msm4
       -mapxf
       -musermsr
       -mavx10.1
       -mavx10.1-256
       -mavx10.1-512
       -mavx10.2
       -mamx-avx512
       -mamx-tf32
       -mamx-transpose
       -mamx-fp8
       -mmovrs
       -mamx-movrs
	   These  switches  enable  the	 use  of  instructions	in  the	 MMX,  SSE,  AVX512CD, AVX512VL, AVX512BW, AVX512DQ,
	   AVX512IFMA, AVX512VBMI, SHA, AES, PCLMUL,  CLFLUSHOPT,  CLWB,  FSGSBASE,  PTWRITE,  RDRND,  F16C,  FMA,  PCONFIG,
	   WBNOINVD,  FMA4,  PREFETCHW,	 RDPID, RDSEED, SGX, XOP, LWP, 3DNow!, enhanced 3DNow!, POPCNT, ABM, ADX, BMI, BMI2,
	   LZCNT, FXSR, XSAVE, XSAVEOPT, XSAVEC, XSAVES, RTM, HLE,  TBM,  MWAITX,  CLZERO,  PKU,  AVX512VBMI2,	GFNI,  VAES,
	   WAITPKG,   VPCLMULQDQ,   AVX512BITALG,  MOVDIRI,  MOVDIR64B,	 AVX512BF16,  ENQCMD,  AVX512VPOPCNTDQ,	 AVX512VNNI,
	   SERIALIZE, UINTR, HRESET, AMXTILE, AMXINT8, AMXBF16, KL,  WIDEKL,  AVXVNNI,	AVX512-FP16,  AVXIFMA,	AVXVNNIINT8,
	   AVXNECONVERT,  CMPCCXADD,  AMX-FP16,	 PREFETCHI,  RAOINT,  AMX-COMPLEX,  AVXVNNIINT16,  SM3,	 SHA512, SM4, APX_F,
	   USER_MSR, AVX10.1, AVX10.2, AMX-AVX512, AMX-TF32, AMX-TRANSPOSE, AMX-FP8, MOVRS, AMX-MOVRS or  CLDEMOTE  extended
	   instruction sets. Each has a corresponding -mno- option to disable use of these instructions.

	   These  extensions  are  also	 available  as	built-in  functions:  see x86 Built-in Functions, for details of the
	   functions enabled and disabled by these switches.

	   Note that -msse4 enables both SSE4.1 and SSE4.2 support, while -mno-sse4 turns off those features;  neither	form
	   of the option affects SSE4A support, controlled separately by -msse4a.

	   To  generate	 SSE/SSE2  instructions automatically from floating-point code (as opposed to 387 instructions), see
	   -mfpmath=sse.

	   GCC depresses SSEx instructions when -mavx is used. Instead, it generates new AVX instructions or AVX equivalence
	   for all SSEx instructions when needed.

	   These options enable GCC to use these  extended  instructions  in  generated	 code,	even  without  -mfpmath=sse.
	   Applications	 that  perform	run-time  CPU detection must compile separate files for each supported architecture,
	   using the appropriate flags.	 In particular, the file containing  the  CPU  detection  code	should	be  compiled
	   without these options.

       -mdump-tune-features
	   This	 option	 instructs  GCC	 to  dump the names of the x86 performance tuning features and default settings. The
	   names can be used in -mtune-ctrl=feature-list.

       -mtune-ctrl=feature-list
	   This option is used to do fine grain control of x86 code generation features.  feature-list is a comma  separated
	   list	 of  feature  names.  See  also	 -mdump-tune-features. When specified, the feature is turned on if it is not
	   preceded with ^, otherwise, it is turned off.  -mtune-ctrl=feature-list is intended to be used by GCC developers.
	   Using it may lead to code paths not covered by testing and can potentially result in	 compiler  ICEs	 or  runtime
	   errors.

       -mno-default
	   This	  option   instructs   GCC  to	turn  off  all	tunable	 features.  See	 also  -mtune-ctrl=feature-list	 and
	   -mdump-tune-features.

       -mcld
	   This option instructs GCC to emit a "cld" instruction in the prologue of functions that use string  instructions.
	   String  instructions	 depend on the DF flag to select between autoincrement or autodecrement mode.  While the ABI
	   specifies the DF flag to be cleared on function entry, some operating systems violate this specification  by	 not
	   clearing  the DF flag in their exception dispatchers.  The exception handler can be invoked with the DF flag set,
	   which leads to wrong direction mode when string instructions are used.  This option can be enabled by default  on
	   32-bit  x86	targets by configuring GCC with the --enable-cld configure option.  Generation of "cld" instructions
	   can be suppressed with the -mno-cld compiler option in this case.

       -mvzeroupper
	   This option instructs GCC to emit a "vzeroupper" instruction before	a  transfer  of	 control  flow	out  of	 the
	   function to minimize the AVX to SSE transition penalty as well as remove unnecessary "zeroupper" intrinsics.

       -mprefer-avx128
	   This	 option	 instructs  GCC	 to  use  128-bit  AVX instructions instead of 256-bit AVX instructions in the auto-
	   vectorizer.

       -mprefer-vector-width=opt
	   This option instructs GCC to use opt-bit vector  width  in  instructions  instead  of  default  on  the  selected
	   platform.

       -mpartial-vector-fp-math
	   This	 option enables GCC to generate floating-point operations that might affect the set of floating-point status
	   flags on partial vectors, where vector elements reside in the low part  of  the  128-bit  SSE  register.   Unless
	   -fno-trapping-math  is  specified,  the  compiler guarantees correct behavior by sanitizing all input operands to
	   have zeroes in the unused upper part of the vector register.	 Note that by using  built-in  functions  or  inline
	   assembly  with  partial  vector  arguments,	NaNs, denormal or invalid values can leak into the upper part of the
	   vector, causing possible performance issues when -fno-trapping-math is in effect.  These issues can be  mitigated
	   by  manually	 sanitizing  the  upper	 part  of  the partial vector argument register or by using -mdaz-ftz to set
	   denormals-are-zero (DAZ) flag in the MXCSR register.

	   This option is enabled by default.

       -mmove-max=bits
	   This option instructs GCC to set the maximum number of bits can be moved from memory	 to  memory  efficiently  to
	   bits.  The valid bits are 128, 256 and 512.

       -mstore-max=bits
	   This	 option	 instructs  GCC	 to set the maximum number of bits can be stored to memory efficiently to bits.	 The
	   valid bits are 128, 256 and 512.

	   none
	       No extra limitations applied to GCC other than defined by the selected platform.

	   128 Prefer 128-bit vector width for instructions.

	   256 Prefer 256-bit vector width for instructions.

	   512 Prefer 512-bit vector width for instructions.

       -mnoreturn-no-callee-saved-registers
	   This option optimizes functions with "noreturn" attribute or "_Noreturn" specifier by not saving in the  function
	   prologue  callee-saved  registers which are used in the function (except for the "BP" register).  This option can
	   interfere with debugging of the caller of the "noreturn" function or any function further up in the	call  stack,
	   so it is not enabled by default.

       -mcx16
	   This	 option	 enables  GCC to generate "CMPXCHG16B" instructions in 64-bit code to implement compare-and-exchange
	   operations on 16-byte aligned 128-bit objects.  This is useful for atomic updates of	 data  structures  exceeding
	   one	machine	 word  in  size.   The	compiler  uses	this instruction to implement __sync Builtins.	However, for
	   __atomic Builtins operating on 128-bit integers, a library call is always used.

       -msahf
	   This option enables generation of "SAHF" instructions in 64-bit code.  Early Intel Pentium 4 CPUs with  Intel  64
	   support,  prior  to	the  introduction  of  Pentium	4  G1  step  in	 December 2005, lacked the "LAHF" and "SAHF"
	   instructions which are supported by AMD64.  These are load and  store  instructions,	 respectively,	for  certain
	   status  flags.  In 64-bit mode, the "SAHF" instruction is used to optimize "fmod", "drem", and "remainder" built-
	   in functions; see Other Builtins for details.

       -mmovbe
	   This option enables use of the "movbe" instruction to optimize byte swapping of four and eight byte entities.

       -mshstk
	   The -mshstk option enables shadow stack built-in functions from x86 Control-flow Enforcement Technology (CET).

       -mcrc32
	   This	   option     enables	  built-in     functions     "__builtin_ia32_crc32qi",	   "__builtin_ia32_crc32hi",
	   "__builtin_ia32_crc32si" and "__builtin_ia32_crc32di" to generate the "crc32" machine instruction.

       -mmwait
	   This	 option	 enables  built-in  functions  "__builtin_ia32_monitor",  and "__builtin_ia32_mwait" to generate the
	   "monitor" and "mwait" machine instructions.

       -mrecip
	   This option enables use of "RCPSS"  and  "RSQRTSS"  instructions  (and  their  vectorized  variants	"RCPPS"	 and
	   "RSQRTPS")  with  an	 additional  Newton-Raphson  step to increase precision instead of "DIVSS" and "SQRTSS" (and
	   their vectorized variants) for single-precision floating-point arguments.  These instructions are generated	only
	   when	 -funsafe-math-optimizations  is enabled together with -ffinite-math-only and -fno-trapping-math.  Note that
	   while the throughput of the sequence is higher  than	 the  throughput  of  the  non-reciprocal  instruction,	 the
	   precision of the sequence can be decreased by up to 2 ulp (i.e. the inverse of 1.0 equals 0.99999994).

	   Note	 that  GCC  implements "1.0f/sqrtf(x)" in terms of "RSQRTSS" (or "RSQRTPS") already with -ffast-math (or the
	   above option combination), and doesn't need -mrecip.

	   Also note that GCC emits the above sequence with  additional	 Newton-Raphson	 step  for  vectorized	single-float
	   division  and  vectorized  sqrtf(x)	already with -ffast-math (or the above option combination), and doesn't need
	   -mrecip.

       -mrecip=opt
	   This option controls which reciprocal estimate instructions may be  used.   opt  is	a  comma-separated  list  of
	   options, which may be preceded by a ! to invert the option:

	   all Enable all estimate instructions.

	   default
	       Enable the default instructions, equivalent to -mrecip.

	   none
	       Disable all estimate instructions, equivalent to -mno-recip.

	   div Enable the approximation for scalar division.

	   vec-div
	       Enable the approximation for vectorized division.

	   sqrt
	       Enable the approximation for scalar square root.

	   vec-sqrt
	       Enable the approximation for vectorized square root.

	   So, for example, -mrecip=all,!sqrt enables all of the reciprocal approximations, except for square root.

       -mveclibabi=type
	   Specifies  the  ABI	type to use for vectorizing intrinsics using an external library.  Supported values for type
	   are svml for the Intel short vector math library, aocl for the  math	 library  (LibM)  from	AMD  Optimizing	 CPU
	   Libraries  (AOCL)  and  acml for the end-of-life AMD core math library (to which AOCL-LibM is the successor).  To
	   use this option, both -ftree-vectorize and -funsafe-math-optimizations have to be enabled, and an  SVML  or	ACML
	   ABI-compatible library must be specified at link time.

	   GCC	 currently  emits  calls  to  "vmldExp2",  "vmldLn2",  "vmldLog102",  "vmldPow2",  "vmldTanh2",	 "vmldTan2",
	   "vmldAtan2",	 "vmldAtanh2",	"vmldCbrt2",  "vmldSinh2",  "vmldSin2",	 "vmldAsinh2",	 "vmldAsin2",	"vmldCosh2",
	   "vmldCos2",	"vmldAcosh2", "vmldAcos2", "vmlsExp4", "vmlsLn4", "vmlsLog104", "vmlsPow4", "vmlsTanh4", "vmlsTan4",
	   "vmlsAtan4",	 "vmlsAtanh4",	"vmlsCbrt4",  "vmlsSinh4",  "vmlsSin4",	 "vmlsAsinh4",	 "vmlsAsin4",	"vmlsCosh4",
	   "vmlsCos4",	"vmlsAcosh4"  and  "vmlsAcos4"	for  corresponding  function  type  when  -mveclibabi=svml  is used,
	   "amd_vrs4_acosf",  "amd_vrs16_acosf",  "amd_vrd8_asin",  "amd_vrs4_asinf",  "amd_vrs8_asinf",  "amd_vrs16_asinf",
	   "amd_vrd2_atan",   "amd_vrd8_atan",	 "amd_vrs4_atanf",   "amd_vrs8_atanf",	 "amd_vrs16_atanf",  "amd_vrd2_cos",
	   "amd_vrd4_cos",   "amd_vrd8_cos",   "amd_vrs4_cosf",	  "amd_vrs8_cosf",    "amd_vrs16_cosf",	   "amd_vrs4_coshf",
	   "amd_vrs8_coshf",	"amd_vrd2_erf",	   "amd_vrd4_erf",    "amd_vrd8_erf",	 "amd_vrs4_erff",   "amd_vrs8_erff",
	   "amd_vrs16_erff",   "amd_vrd2_exp",	  "amd_vrd4_exp",    "amd_vrd8_exp",	"amd_vrs4_expf",    "amd_vrs8_expf",
	   "amd_vrs16_expf",   "amd_vrd2_exp10",   "amd_vrs4_exp10f",	"amd_vrd2_exp2",  "amd_vrd4_exp2",  "amd_vrd8_exp2",
	   "amd_vrs4_exp2f",  "amd_vrs8_exp2f",	 "amd_vrs16_exp2f",   "amd_vrs4_expm1f",   "amd_vrd2_log",   "amd_vrd4_log",
	   "amd_vrd8_log",   "amd_vrs4_logf",	"amd_vrs8_logf",   "amd_vrs16_logf",   "amd_vrd2_log10",  "amd_vrs4_log10f",
	   "amd_vrs8_log10f", "amd_vrs16_log10f",  "amd_vrd2_log1p",  "amd_vrs4_log1pf",  "amd_vrd2_log2",  "amd_vrd4_log2",
	   "amd_vrd8_log2",   "amd_vrs4_log2f",	  "amd_vrs8_log2f",   "amd_vrs16_log2f",   "amd_vrd2_pow",   "amd_vrd4_pow",
	   "amd_vrd8_pow",   "amd_vrs4_powf",	 "amd_vrs8_powf",    "amd_vrs16_powf",	  "amd_vrd2_sin",    "amd_vrd4_sin",
	   "amd_vrd8_sin",    "amd_vrs4_sinf",	  "amd_vrs8_sinf",    "amd_vrs16_sinf",	   "amd_vrd2_tan",   "amd_vrd4_tan",
	   "amd_vrd8_tan", "amd_vrs16_tanf", "amd_vrs4_tanhf", "amd_vrs8_tanhf",  "amd_vrs16_tanhf"  for  the  corresponding
	   function  type  when	 -mveclibabi=aocl  is  used,  and  "__vrd2_sin",  "__vrd2_cos",	 "__vrd2_exp", "__vrd2_log",
	   "__vrd2_log2",  "__vrd2_log10",  "__vrs4_sinf",  "__vrs4_cosf",  "__vrs4_expf",  "__vrs4_logf",   "__vrs4_log2f",
	   "__vrs4_log10f" and "__vrs4_powf" for the corresponding function type when -mveclibabi=acml is used.

       -mabi=name
	   Generate  code  for	the specified calling convention.  Permissible values are sysv for the ABI used on GNU/Linux
	   and other systems, and ms for the Microsoft ABI.  The  default  is  to  use	the  Microsoft	ABI  when  targeting
	   Microsoft Windows and the SysV ABI on all other systems.  You can control this behavior for specific functions by
	   using the function attributes "ms_abi" and "sysv_abi".

       -mforce-indirect-call
	   Force  all  calls to functions to be indirect. This is useful when using Intel Processor Trace where it generates
	   more precise timing information for function calls.

       -mmanual-endbr
	   Insert ENDBR instruction at function entry only via the "cf_check" function attribute. This is useful  when	used
	   with the option -fcf-protection=branch to control ENDBR insertion at the function entry.

       -mcet-switch
	   By  default,	 CET  instrumentation  is  turned off on switch statements that use a jump table and indirect branch
	   track is disabled.  Since jump tables are stored in read-only memory, this does not result in a  direct  loss  of
	   hardening.	But if the jump table index is attacker-controlled, the indirect jump may not be constrained by CET.
	   This option turns on CET instrumentation to enable indirect branch track for switch statements with	jump  tables
	   which leads to the jump targets reachable via any indirect jumps.

       -mcall-ms2sysv-xlogues
	   Due	to  differences	 in 64-bit ABIs, any Microsoft ABI function that calls a System V ABI function must consider
	   RSI, RDI and XMM6-15 as clobbered.  By default, the code for saving and  restoring  these  registers	 is  emitted
	   inline,  resulting  in  fairly lengthy prologues and epilogues.  Using -mcall-ms2sysv-xlogues emits prologues and
	   epilogues that use stubs in the static portion of libgcc to perform	these  saves  and  restores,  thus  reducing
	   function size at the cost of a few extra instructions.

       -mtls-dialect=type
	   Generate code to access thread-local storage using the gnu or gnu2 conventions.  gnu is the conservative default;
	   gnu2	 is  more  efficient,  but  it	may  add  compile- and run-time requirements that cannot be satisfied on all
	   systems.

       -mpush-args
       -mno-push-args
	   Use PUSH operations to store outgoing parameters.  This method is shorter and  usually  equally  fast  as  method
	   using  SUB/MOV  operations and is enabled by default.  In some cases disabling it may improve performance because
	   of improved scheduling and reduced dependencies.

       -maccumulate-outgoing-args
	   If enabled, the maximum amount of space required for outgoing arguments is computed	in  the	 function  prologue.
	   This	 is  faster on most modern CPUs because of reduced dependencies, improved scheduling and reduced stack usage
	   when the preferred stack boundary is not equal to 2.	 The drawback is a notable  increase  in  code	size.	This
	   switch implies -mno-push-args.

       -mthreads
	   Support  thread-safe	 exception  handling  on  MinGW.   Programs that rely on thread-safe exception handling must
	   compile and link all code with the -mthreads option.	 When compiling, -mthreads defines -D_MT; when	linking,  it
	   links in a special thread helper library -lmingwthrd which cleans up per-thread exception-handling data.

       -mms-bitfields
       -mno-ms-bitfields
	   Enable/disable bit-field layout compatible with the native Microsoft Windows compiler.

	   If  "packed"	 is  used  on  a structure, or if bit-fields are used, it may be that the Microsoft ABI lays out the
	   structure differently than the way GCC normally does.  Particularly when moving  packed  data  between  functions
	   compiled  with  GCC	and the native Microsoft compiler (either via function call or as data in a file), it may be
	   necessary to access either format.

	   This option is enabled by default for Microsoft Windows targets.  This behavior can also be controlled locally by
	   use of variable or type attributes.	For more information, see x86 Variable Attributes and x86 Type Attributes.

	   The Microsoft structure layout algorithm is fairly simple with the  exception  of  the  bit-field  packing.	 The
	   padding  and	 alignment of members of structures and whether a bit-field can straddle a storage-unit boundary are
	   determine by these rules:

	   1. Structure members are stored sequentially in the order in which they are
	       declared: the first member has the lowest memory address and the last member the highest.

	   2. Every data object has an alignment requirement.  The alignment requirement
	       for all data except structures, unions, and arrays is either the size of the object or  the  current  packing
	       size  (specified	 with  either  the  "aligned"  attribute  or  the  "pack"  pragma),  whichever is less.	 For
	       structures, unions, and arrays, the alignment  requirement  is  the  largest  alignment	requirement  of	 its
	       members.	 Every object is allocated an offset so that:

		       offset % alignment_requirement == 0

	   3. Adjacent bit-fields are packed into the same 1-, 2-, or 4-byte allocation
	       unit  if the integral types are the same size and if the next bit-field fits into the current allocation unit
	       without crossing the boundary imposed by the common alignment requirements of the bit-fields.

	   MSVC interprets zero-length bit-fields in the following ways:

	   1. If a zero-length bit-field is inserted between two bit-fields that
	       are normally coalesced, the bit-fields are not coalesced.

	       For example:

		       struct
			{
			  unsigned long bf_1 : 12;
			  unsigned long : 0;
			  unsigned long bf_2 : 12;
			} t1;

	       The size of "t1" is 8 bytes with the zero-length bit-field.   If	 the  zero-length  bit-field  were  removed,
	       "t1"'s size would be 4 bytes.

	   2. If a zero-length bit-field is inserted after a bit-field, "foo", and the
	       alignment of the zero-length bit-field is greater than the member that follows it, "bar", "bar" is aligned as
	       the type of the zero-length bit-field.

	       For example:

		       struct
			{
			  char foo : 4;
			  short : 0;
			  char bar;
			} t2;

		       struct
			{
			  char foo : 4;
			  short : 0;
			  double bar;
			} t3;

	       For  "t2", "bar" is placed at offset 2, rather than offset 1.  Accordingly, the size of "t2" is 4.  For "t3",
	       the zero-length bit-field does not affect the alignment of "bar" or, as a result, the size of the structure.

	       Taking this into account, it is important to note the following:

	       1. If a zero-length bit-field follows a normal bit-field, the type of the
		   zero-length bit-field may affect the alignment of the structure as whole. For example, "t2" has a size of
		   4 bytes, since the zero-length bit-field follows a normal bit-field, and is of type short.

	       2. Even if a zero-length bit-field is not followed by a normal bit-field, it may
		   still affect the alignment of the structure:

			   struct
			    {
			      char foo : 6;
			      long : 0;
			    } t4;

		   Here, "t4" takes up 4 bytes.

	   3. Zero-length bit-fields following non-bit-field members are ignored:
		       struct
			{
			  char foo;
			  long : 0;
			  char bar;
			} t5;

	       Here, "t5" takes up 2 bytes.

       -mno-align-stringops
	   Do not align the destination	 of  inlined  string  operations.   This  switch  reduces  code	 size  and  improves
	   performance in case the destination is already aligned, but GCC doesn't know about it.

       -minline-all-stringops
	   By  default	GCC  inlines  string  operations  only when the destination is known to be aligned to least a 4-byte
	   boundary.  This enables more inlining and increases code size, but may improve performance of code  that  depends
	   on fast "memcpy" and "memset" for short lengths.  The option enables inline expansion of "strlen" for all pointer
	   alignments.

       -minline-stringops-dynamically
	   For	string	operations of unknown size, use run-time checks with inline code for small blocks and a library call
	   for large blocks.

       -mstringop-strategy=alg
	   Override the internal decision heuristic for the particular algorithm to use for inlining string operations.	 The
	   allowed values for alg are:

	   rep_byte
	   rep_4byte
	   rep_8byte
	       Expand using i386 "rep" prefix of the specified size.

	   byte_loop
	   loop
	   unrolled_loop
	       Expand into an inline loop.

	   libcall
	       Always use a library call.

       -mmemcpy-strategy=strategy
	   Override the internal decision heuristic to decide if  "__builtin_memcpy"  should  be  inlined  and	what  inline
	   algorithm  to  use  when  the expected size of the copy operation is known. strategy is a comma-separated list of
	   alg:max_size:dest_align triplets.  alg is specified in -mstringop-strategy, max_size specifies the max byte	size
	   with	 which	inline algorithm alg is allowed.  For the last triplet, the max_size must be -1. The max_size of the
	   triplets in the list must be specified in increasing order.	The minimal byte size for alg is  0  for  the  first
	   triplet and "max_size + 1" of the preceding range.

       -mmemset-strategy=strategy
	   The option is similar to -mmemcpy-strategy= except that it is to control "__builtin_memset" expansion.

       -momit-leaf-frame-pointer
	   Don't keep the frame pointer in a register for leaf functions.  This avoids the instructions to save, set up, and
	   restore   frame   pointers	and   makes   an   extra   register   available	  in  leaf  functions.	 The  option
	   -fomit-leaf-frame-pointer removes the frame pointer for leaf functions, which might make debugging harder.

       -mtls-direct-seg-refs
       -mno-tls-direct-seg-refs
	   Controls whether TLS variables may be accessed with offsets from the TLS segment register (%gs  for	32-bit,	 %fs
	   for	64-bit),  or  whether  the  thread  base pointer must be added.	 Whether or not this is valid depends on the
	   operating system, and whether it maps the segment to cover the entire TLS area.

	   For systems that use the GNU C Library, the default is on.

       -msse2avx
       -mno-sse2avx
	   Specify that the assembler should encode SSE instructions with VEX prefix.  The option -mavx	 turns	this  on  by
	   default.

       -mfentry
       -mno-fentry
	   If profiling is active (-pg), put the profiling counter call before the prologue.  Note: On x86 architectures the
	   attribute "ms_hook_prologue" isn't possible at the moment for -mfentry and -pg.

       -mrecord-mcount
       -mno-record-mcount
	   If profiling is active (-pg), generate a __mcount_loc section that contains pointers to each profiling call. This
	   is useful for automatically patching and out calls.

       -mnop-mcount
       -mno-nop-mcount
	   If  profiling  is  active  (-pg), generate the calls to the profiling functions as NOPs. This is useful when they
	   should be patched in later dynamically. This is likely only useful together with -mrecord-mcount.

       -minstrument-return=type
	   Instrument function exit in -pg -mfentry instrumented functions  with  call	to  specified  function.  This	only
	   instruments	true  returns  ending  with ret, but not sibling calls ending with jump. Valid types are none to not
	   instrument, call to generate a call to __return__, or nop5 to generate a 5 byte nop.

       -mrecord-return
       -mno-record-return
	   Generate a __return_loc section pointing to all return instrumentation code.

       -mfentry-name=name
	   Set name of __fentry__ symbol called at function entry for -pg -mfentry functions.

       -mfentry-section=name
	   Set name of section to record -mrecord-mcount calls (default __mcount_loc).

       -mskip-rax-setup
       -mno-skip-rax-setup
	   When generating code for the x86-64 architecture with SSE extensions disabled, -mskip-rax-setup can	be  used  to
	   skip setting up RAX register when there are no variable arguments passed in vector registers.

	   Warning: Since RAX register is used to avoid unnecessarily saving vector registers on stack when passing variable
	   arguments,  the  impacts  of	 this  option  are callees may waste some stack space, misbehave or jump to a random
	   location.  GCC 4.4 or newer don't have those issues, regardless the RAX register value.

       -m8bit-idiv
       -mno-8bit-idiv
	   On some processors, like Intel Atom, 8-bit unsigned integer divide is  much	faster	than  32-bit/64-bit  integer
	   divide.   This  option  generates  a	 run-time check.  If both dividend and divisor are within range of 0 to 255,
	   8-bit unsigned integer divide is used instead of 32-bit/64-bit integer divide.

       -mavx256-split-unaligned-load
       -mavx256-split-unaligned-store
	   Split 32-byte AVX unaligned load and store.

       -mstack-protector-guard=guard
       -mstack-protector-guard-reg=reg
       -mstack-protector-guard-offset=offset
       -mstack-protector-guard-symbol=symbol
	   Generate stack protection code using canary at guard.  Supported locations are global for global  canary  or	 tls
	   for	per-thread  canary  in	the  TLS block (the default).  This option has effect only when -fstack-protector or
	   -fstack-protector-all is specified.

	   With the latter choice  the	options	 -mstack-protector-guard-reg=reg  and  -mstack-protector-guard-offset=offset
	   furthermore	specify which segment register (%fs or %gs) to use as base register for reading the canary, and from
	   what offset from that base register.	 The default for those is as specified in the relevant ABI.

	   -mstack-protector-guard-symbol=symbol overrides the offset with a symbol reference to a canary in the TLS block.

       -mgeneral-regs-only
	   Generate code that uses only the general-purpose registers.	This prevents  the  compiler  from  using  floating-
	   point, vector, mask and bound registers.

       -mrelax-cmpxchg-loop
	   When	 emitting  a  compare-and-swap	loop for __sync Builtins and __atomic Builtins lacking a native instruction,
	   optimize for the highly contended case by issuing an atomic load before the "CMPXCHG" instruction, and using	 the
	   "PAUSE" instruction to save CPU power when restarting the loop.

       -mindirect-branch=choice
	   Convert  indirect call and jump with choice.	 The default is keep, which keeps indirect call and jump unmodified.
	   thunk converts indirect call and jump to call and return thunk.  thunk-inline converts indirect call and jump  to
	   inlined  call  and  return thunk.  thunk-extern converts indirect call and jump to external call and return thunk
	   provided in a separate object file.	You can control this behavior for a specific function by using the  function
	   attribute "indirect_branch".

	   Note	 that  -mcmodel=large  is incompatible with -mindirect-branch=thunk and -mindirect-branch=thunk-extern since
	   the thunk function may not be reachable in the large code model.

	   Note that -mindirect-branch=thunk-extern is compatible with -fcf-protection=branch since the external  thunk	 can
	   be made to enable control-flow check.

       -mfunction-return=choice
	   Convert  function  return  with  choice.   The  default  is	keep, which keeps function return unmodified.  thunk
	   converts function return to call and return thunk.  thunk-inline converts function return  to  inlined  call	 and
	   return  thunk.   thunk-extern  converts  function return to external call and return thunk provided in a separate
	   object file.	  You  can  control  this  behavior  for  a  specific  function	 by  using  the	 function  attribute
	   "function_return".

	   Note	 that  -mindirect-return=thunk-extern is compatible with -fcf-protection=branch since the external thunk can
	   be made to enable control-flow check.

	   Note that -mcmodel=large is incompatible with -mfunction-return=thunk  and  -mfunction-return=thunk-extern  since
	   the thunk function may not be reachable in the large code model.

       -mindirect-branch-register
	   Force indirect call and jump via register.

       -mharden-sls=choice
	   Generate  code  to  mitigate	 against  straight  line  speculation  (SLS) with choice.  The default is none which
	   disables all SLS hardening.	return enables	SLS  hardening	for  function  returns.	  indirect-jmp	enables	 SLS
	   hardening for indirect jumps.  all enables all SLS hardening.

       -mindirect-branch-cs-prefix
	   Add	CS  prefix to call and jmp to indirect thunk with branch target in r8-r15 registers so that the call and jmp
	   instruction length is 6 bytes to allow them to be replaced with lfence; call *%r8-r15 or lfence; jmp *%r8-r15  at
	   run-time.

       -mapx-inline-asm-use-gpr32
	   For	inline	asm  support  with  APX,  by  default  the  EGPR  feature  was disabled to prevent potential illegal
	   instruction	with  EGPR  occurs.   To  invoke   egpr	  usage	  in   inline	asm,   use   new   compiler   option
	   -mapx-inline-asm-use-gpr32 and user should ensure the instruction supports EGPR.

       -mevex512
       -mno-evex512
	   Enables/disables 512-bit vector. It will be default on if AVX512F is enabled.

       These -m switches are supported in addition to the above on x86-64 processors in 64-bit environments.

       -m32
       -m64
       -mx32
       -m16
       -miamcu
	   Generate  code for a 16-bit, 32-bit or 64-bit environment.  The -m32 option sets "int", "long", and pointer types
	   to 32 bits, and generates code that runs in 32-bit mode.

	   The -m64 option sets "int" to 32 bits and "long" and pointer types to 64 bits, and generates code for the  x86-64
	   architecture.  For Darwin only the -m64 option also turns off the -fno-pic and -mdynamic-no-pic options.

	   The	-mx32  option  sets  "int",  "long",  and  pointer  types  to  32  bits,  and  generates code for the x86-64
	   architecture.

	   The -m16 option is the same as -m32, except for that it  outputs  the  ".code16gcc"	assembly  directive  at	 the
	   beginning of the assembly output so that the binary can run in 16-bit mode.

	   The	-miamcu	 option	 generates code which conforms to Intel MCU psABI.  It requires the -m32 option to be turned
	   on.

       -mno-red-zone
	   Do not use a so-called "red zone" for x86-64 code.  The red zone is mandated by the x86-64 ABI; it is a  128-byte
	   area	 beyond the location of the stack pointer that is not modified by signal or interrupt handlers and therefore
	   can be used for temporary data without adjusting the stack pointer.	The flag  -mno-red-zone	 disables  this	 red
	   zone.

       -mcmodel=small
	   Generate  code  for	the  small  code  model: the program and its symbols must be linked in the lower 2 GB of the
	   address space.  Pointers are 64 bits.  Programs can be statically or dynamically linked.   This  is	the  default
	   code model.

       -mcmodel=kernel
	   Generate  code for the kernel code model.  The kernel runs in the negative 2 GB of the address space.  This model
	   has to be used for Linux kernel code.

       -mcmodel=medium
	   Generate code for the medium model: the program is linked in the lower 2 GB of the address space.  Small  symbols
	   are	also  placed  there.   Symbols	with sizes larger than -mlarge-data-threshold are put into large data or BSS
	   sections and can be located above 2GB.  Programs can be statically or dynamically linked.

       -mcmodel=large
	   Generate code for the large model.  This model makes no assumptions about addresses and sizes of sections.

       -maddress-mode=long
	   Generate code for long address mode.	 This is only supported for 64-bit and x32 environments.  It is the  default
	   address mode for 64-bit environments.

       -maddress-mode=short
	   Generate code for short address mode.  This is only supported for 32-bit and x32 environments.  It is the default
	   address mode for 32-bit and x32 environments.

       -mneeded
       -mno-needed
	   Emit	 GNU_PROPERTY_X86_ISA_1_NEEDED	GNU  property  for Linux target to indicate the micro-architecture ISA level
	   required to execute the binary.

       -mno-direct-extern-access
	   Without -fpic nor -fPIC, always use the GOT pointer to access external  symbols.   With  -fpic  or  -fPIC,  treat
	   access to protected symbols as local symbols.  The default is -mdirect-extern-access.

	   Warning:    shared	libraries   compiled   with   -mno-direct-extern-access	  and	executable   compiled	with
	   -mdirect-extern-access may not be binary compatible if  protected  symbols  are  used  in  shared  libraries	 and
	   executable.

       -munroll-only-small-loops
	   Controls  conservative small loop unrolling. It is default enabled by O2, and unrolls loop with less than 4 insns
	   by 1 time. Explicit -f[no-]unroll-[all-]loops would disable this flag to avoid any unintended unrolling  behavior
	   that user does not want.

       -mlam=choice
	   LAM(linear-address masking) allows special bits in the pointer to be used for metadata. The default is none. With
	   u48,	 pointer  bits in positions 62:48 can be used for metadata; With u57, pointer bits in positions 62:57 can be
	   used for metadata.

       x86 Windows Options

       Xstormy16 Options

       These options are defined for Xstormy16:

       -msim
	   Choose startup files and linker script suitable for the simulator.

       Xtensa Options

       These options are supported for Xtensa targets:

       -mconst16
       -mno-const16
	   Enable or disable use of "CONST16" instructions for	loading	 constant  values.   The  "CONST16"  instruction  is
	   currently not a standard option from Tensilica.  When enabled, "CONST16" instructions are always used in place of
	   the	standard  "L32R" instructions.	The use of "CONST16" is enabled by default only if the "L32R" instruction is
	   not available.

       -mfused-madd
       -mno-fused-madd
	   Enable or disable use of fused multiply/add and multiply/subtract  instructions  in	the  floating-point  option.
	   This	 has  no  effect  if  the  floating-point  option  is  not  also  enabled.  Disabling fused multiply/add and
	   multiply/subtract instructions forces the compiler to use separate instructions for the multiply and add/subtract
	   operations.	This may be desirable in some cases where strict IEEE 754-compliant results are required: the  fused
	   multiply add/subtract instructions do not round the intermediate result, thereby producing results with more bits
	   of  precision  than	specified  by  the  IEEE  standard.  Disabling fused multiply add/subtract instructions also
	   ensures that the program output is not sensitive to the compiler's ability to combine multiply  and	add/subtract
	   operations.

       -mserialize-volatile
       -mno-serialize-volatile
	   When	 this  option  is  enabled, GCC inserts "MEMW" instructions before "volatile" memory references to guarantee
	   sequential consistency.  The default is -mserialize-volatile.  Use -mno-serialize-volatile  to  omit	 the  "MEMW"
	   instructions.

       -mforce-no-pic
	   For targets, like GNU/Linux, where all user-mode Xtensa code must be position-independent code (PIC), this option
	   disables PIC for compiling kernel code.

       -mtext-section-literals
       -mno-text-section-literals
	   These  options  control  the treatment of literal pools.  The default is -mno-text-section-literals, which places
	   literals in a separate section in the output file.  This allows the literal pool to be placed in a data  RAM/ROM,
	   and	it  also  allows the linker to combine literal pools from separate object files to remove redundant literals
	   and improve code size.  With -mtext-section-literals, the literals are interspersed in the text section in  order
	   to keep them as close as possible to their references.  This may be necessary for large assembly files.  Literals
	   for each function are placed right before that function.

       -mauto-litpools
       -mno-auto-litpools
	   These  options  control the treatment of literal pools.  The default is -mno-auto-litpools, which places literals
	   in a separate section in the output file  unless  -mtext-section-literals  is  used.	  With	-mauto-litpools	 the
	   literals  are  interspersed	in the text section by the assembler.  Compiler does not produce explicit ".literal"
	   directives and loads literals into registers with "MOVI" instructions instead of "L32R" to let the  assembler  do
	   relaxation  and  place  literals  as necessary.  This option allows assembler to create several literal pools per
	   function and assemble very big functions, which may not be possible with -mtext-section-literals.

       -mtarget-align
       -mno-target-align
	   When this option is enabled, GCC instructs the assembler to automatically align  instructions  to  reduce  branch
	   penalties  at  the  expense	of some code density.  The assembler attempts to widen density instructions to align
	   branch targets and the instructions following call instructions.  If there are not enough preceding safe  density
	   instructions	 to  align a target, no widening is performed.	The default is -mtarget-align.	These options do not
	   affect the treatment of auto-aligned instructions like "LOOP", which	 the  assembler	 always	 aligns,  either  by
	   widening density instructions or by inserting NOP instructions.

       -mlongcalls
       -mno-longcalls
	   When	 this  option  is enabled, GCC instructs the assembler to translate direct calls to indirect calls unless it
	   can determine that the target of a direct call is in the range allowed by the call instruction.  This translation
	   typically occurs for calls to functions in other source files.  Specifically, the assembler translates  a  direct
	   "CALL" instruction into an "L32R" followed by a "CALLX" instruction.	 The default is -mno-longcalls.	 This option
	   should  be used in programs where the call target can potentially be out of range.  This option is implemented in
	   the	assembler,  not	 the  compiler,	 so  the  assembly  code  generated  by	 GCC   still   shows   direct	call
	   instructions---look at the disassembled object code to see the actual instructions.	Note that the assembler uses
	   an indirect call for every cross-file call, not just those that really are out of range.

       -mabi=name
	   Generate  code  for	the  specified	ABI.  Permissible values are: call0, windowed.	Default ABI is chosen by the
	   Xtensa core configuration.

       -mabi=call0
	   When this option is enabled function parameters are passed  in  registers  "a2"  through  "a7",  registers  "a12"
	   through  "a15" are caller-saved, and register "a15" may be used as a frame pointer.	When this version of the ABI
	   is enabled the C preprocessor symbol "__XTENSA_CALL0_ABI__" is defined.

       -mabi=windowed
	   When this option is enabled function parameters are passed in registers "a10" through "a15", and called  function
	   rotates  register  window by 8 registers on entry so that its arguments are found in registers "a2" through "a7".
	   Register "a7" may be used as a frame pointer.  Register window is rotated 8 registers  back	upon  return.	When
	   this version of the ABI is enabled the C preprocessor symbol "__XTENSA_WINDOWED_ABI__" is defined.

       -mextra-l32r-costs=n
	   Specify an extra cost of instruction RAM/ROM access for "L32R" instructions, in clock cycles.  This affects, when
	   optimizing for speed, whether loading a constant from literal pool using "L32R" or synthesizing the constant from
	   a small one with a couple of arithmetic instructions.  The default value is 0.

       -mstrict-align
       -mno-strict-align
	   Avoid  or  allow  generating memory accesses that may not be aligned on a natural object boundary as described in
	   the architecture specification.  The default is -mno-strict-align for cores that support both unaligned loads and
	   stores in hardware and -mstrict-align for all other cores.

       zSeries Options

       These are listed under

ENVIRONMENT
       This section describes several environment variables that affect how GCC operates.  Some of them work  by  specifying
       directories  or prefixes to use when searching for various kinds of files.  Some are used to specify other aspects of
       the compilation environment.

       Note that you can also specify places to search using options such as -B, -I and	 -L.   These  take  precedence	over
       places specified using environment variables, which in turn take precedence over those specified by the configuration
       of GCC.

       LANG
       LC_CTYPE
       LC_MESSAGES
       LC_ALL
	   These  environment variables control the way that GCC uses localization information which allows GCC to work with
	   different national conventions.  GCC inspects the locale categories LC_CTYPE	 and  LC_MESSAGES  if  it  has	been
	   configured  to do so.  These locale categories can be set to any value supported by your installation.  A typical
	   value is en_GB.UTF-8 for English in the United Kingdom encoded in UTF-8.

	   The LC_CTYPE environment variable specifies character classification.  GCC uses it  to  determine  the  character
	   boundaries in a string; this is needed for some multibyte encodings that contain quote and escape characters that
	   are otherwise interpreted as a string end or escape.

	   The LC_MESSAGES environment variable specifies the language to use in diagnostic messages.

	   If  the  LC_ALL  environment	 variable  is  set,  it	 overrides the value of LC_CTYPE and LC_MESSAGES; otherwise,
	   LC_CTYPE and LC_MESSAGES default to the value of the LANG environment variable.  If none of these  variables	 are
	   set, GCC defaults to traditional C English behavior.

       TMPDIR
	   If  TMPDIR  is  set, it specifies the directory to use for temporary files.	GCC uses temporary files to hold the
	   output of one stage of compilation which is to be used as input to the next stage: for example, the output of the
	   preprocessor, which is the input to the compiler proper.

       GCC_COMPARE_DEBUG
	   Setting GCC_COMPARE_DEBUG is nearly equivalent to passing  -fcompare-debug  to  the	compiler  driver.   See	 the
	   documentation of this option for more details.

       GCC_EXEC_PREFIX
	   If GCC_EXEC_PREFIX is set, it specifies a prefix to use in the names of the subprograms executed by the compiler.
	   No  slash  is added when this prefix is combined with the name of a subprogram, but you can specify a prefix that
	   ends with a slash if you wish.

	   If GCC_EXEC_PREFIX is not set, GCC attempts to figure out an appropriate prefix to use based on the	pathname  it
	   is invoked with.

	   If  GCC  cannot  find  the  subprogram  using  the specified prefix, it tries looking in the usual places for the
	   subprogram.

	   The default value of GCC_EXEC_PREFIX is prefix/lib/gcc/ where prefix is the prefix to the installed compiler.  In
	   many cases prefix is the value of "prefix" when you ran the configure script.

	   Other prefixes specified with -B take precedence over this prefix.

	   This prefix is also used for finding files such as crt0.o that are used for linking.

	   In  addition,  the  prefix  is used in an unusual way in finding the directories to search for header files.	 For
	   each of the standard directories whose name normally begins with /usr/local/lib/gcc	(more  precisely,  with	 the
	   value  of  GCC_INCLUDE_DIR), GCC tries replacing that beginning with the specified prefix to produce an alternate
	   directory name.  Thus, with -Bfoo/,	GCC  searches  foo/bar	just  before  it  searches  the	 standard  directory
	   /usr/local/lib/bar.	 If  a	standard  directory  begins  with  the configured prefix then the value of prefix is
	   replaced by GCC_EXEC_PREFIX when looking for header files.

       COMPILER_PATH
	   The value of COMPILER_PATH is a colon-separated list of directories, much like PATH.	 GCC tries  the	 directories
	   thus specified when searching for subprograms, if it cannot find the subprograms using GCC_EXEC_PREFIX.

       LIBRARY_PATH
	   The	value of LIBRARY_PATH is a colon-separated list of directories, much like PATH.	 When configured as a native
	   compiler, GCC tries the directories thus specified when searching for special linker files,	if  it	cannot	find
	   them	 using GCC_EXEC_PREFIX.	 Linking using GCC also uses these directories when searching for ordinary libraries
	   for the -l option (but directories specified with -L come first).

       LANG
	   This variable is used to pass locale information to the compiler.  One way in which this information is  used  is
	   to  determine  the character set to be used when character literals, string literals and comments are parsed in C
	   and C++.  When the compiler is configured to allow multibyte	 characters,  the  following  values  for  LANG	 are
	   recognized:

	   C-JIS
	       Recognize JIS characters.

	   C-SJIS
	       Recognize SJIS characters.

	   C-EUCJP
	       Recognize EUCJP characters.

	   If  LANG is not defined, or if it has some other value, then the compiler uses "mblen" and "mbtowc" as defined by
	   the default locale to recognize and translate multibyte characters.

       GCC_EXTRA_DIAGNOSTIC_OUTPUT
	   If GCC_EXTRA_DIAGNOSTIC_OUTPUT is set to one of the following values, then additional text  will  be	 emitted  to
	   stderr  when fix-it hints are emitted.  -fdiagnostics-parseable-fixits and -fno-diagnostics-parseable-fixits take
	   precedence over this environment variable.

	   fixits-v1
	       Emit parseable fix-it hints,  equivalent	 to  -fdiagnostics-parseable-fixits.   In  particular,	columns	 are
	       expressed as a count of bytes, starting at byte 1 for the initial column.

	   fixits-v2
	       As "fixits-v1", but columns are expressed as display columns, as per -fdiagnostics-column-unit=display.

       Some additional environment variables affect the behavior of the preprocessor.

       CPATH
       C_INCLUDE_PATH
       CPLUS_INCLUDE_PATH
       OBJC_INCLUDE_PATH
	   Each variable's value is a list of directories separated by a special character, much like PATH, in which to look
	   for header files.  The special character, "PATH_SEPARATOR", is target-dependent and determined at GCC build time.
	   For Microsoft Windows-based targets it is a semicolon, and for almost all other targets it is a colon.

	   CPATH  specifies  a list of directories to be searched as if specified with -I, but after any paths given with -I
	   options on the command  line.   This	 environment  variable	is  used  regardless  of  which	 language  is  being
	   preprocessed.

	   The	remaining  environment	variables  apply  only	when  preprocessing the particular language indicated.	Each
	   specifies a list of directories to be searched as if specified with -isystem, but  after  any  paths	 given	with
	   -isystem options on the command line.

	   In  all  these variables, an empty element instructs the compiler to search its current working directory.  Empty
	   elements  can  appear  at  the  beginning  or  end  of  a  path.   For  instance,  if  the  value  of  CPATH	  is
	   ":/special/include", that has the same effect as -I. -I/special/include.

       DEPENDENCIES_OUTPUT
	   If  this  variable is set, its value specifies how to output dependencies for Make based on the non-system header
	   files processed by the compiler.  System header files are ignored in the dependency output.

	   The value of DEPENDENCIES_OUTPUT can be just a file name, in which case the Make rules are written to that  file,
	   guessing  the  target  name from the source file name.  Or the value can have the form file target, in which case
	   the rules are written to file file using target as the target name.

	   In other words, this environment variable is equivalent to combining the options -MM and -MF,  with	an  optional
	   -MT switch too.

       SUNPRO_DEPENDENCIES
	   This variable is the same as DEPENDENCIES_OUTPUT (see above), except that system header files are not ignored, so
	   it implies -M rather than -MM.  However, the dependence on the main input file is omitted.

       SOURCE_DATE_EPOCH
	   If  this  variable is set, its value specifies a UNIX timestamp to be used in replacement of the current date and
	   time in the "__DATE__" and "__TIME__" macros, so that the embedded timestamps become reproducible.

	   The value of SOURCE_DATE_EPOCH must be a UNIX timestamp,  defined  as  the  number  of  seconds  (excluding	leap
	   seconds)  since 01 Jan 1970 00:00:00 represented in ASCII; identical to the output of "date +%s" on GNU/Linux and
	   other systems that support the %s extension in the "date" command.

	   The value should be a known timestamp such as the last modification time of the source or package and  it  should
	   be set by the build process.

BUGS
       For instructions on reporting bugs, see .

FOOTNOTES
       1.  On  some  systems,  gcc -shared needs to build supplementary stub code for constructors to work.  On multi-libbed
	   systems, gcc -shared must select the correct support libraries to link against.  Failing to	supply	the  correct
	   flags  may  lead  to subtle defects.	 Supplying them in cases where they are not necessary is innocuous.  -shared
	   suppresses the addition of startup code to alter the floating-point environment as done with -ffast-math,  -Ofast
	   or -funsafe-math-optimizations on some targets.

SEE ALSO
       gpl(7),	gfdl(7),  fsf-funding(7),  cpp(1),  gcov(1), as(1), ld(1), gdb(1) and the Info entries for gcc, cpp, as, ld,
       binutils and gdb.

AUTHOR
       See the Info entry for gcc, or , for contributors to GCC.

COPYRIGHT
       Copyright (c) 1988-2025 Free Software Foundation, Inc.

       Permission is granted to copy, distribute and/or modify this document under the terms of the GNU	 Free  Documentation
       License,	 Version  1.3  or  any	later version published by the Free Software Foundation; with the Invariant Sections
       being "GNU General Public License" and "Funding Free Software", the Front-Cover texts being (a) (see below), and with
       the Back-Cover Texts being (b) (see below).  A copy of the license is included in the gfdl(7) man page.

       (a) The FSF's Front-Cover Text is:

	    A GNU Manual

       (b) The FSF's Back-Cover Text is:

	    You have freedom to copy and modify this GNU Manual, like GNU
	    software.  Copies published by the Free Software Foundation raise
	    funds for GNU development.

gcc-15							 2026-03-21						      GCC(1)