| @c Copyright (C) 2002-2021 Free Software Foundation, Inc. |
| @c This is part of the GCC manual. |
| @c For copying conditions, see the file gcc.texi. |
| |
| @node Source Tree |
| @chapter Source Tree Structure and Build System |
| |
| This chapter describes the structure of the GCC source tree, and how |
| GCC is built. The user documentation for building and installing GCC |
| is in a separate manual (@uref{http://gcc.gnu.org/install/}), with |
| which it is presumed that you are familiar. |
| |
| @menu |
| * Configure Terms:: Configuration terminology and history. |
| * Top Level:: The top level source directory. |
| * gcc Directory:: The @file{gcc} subdirectory. |
| @end menu |
| |
| @include configterms.texi |
| |
| @node Top Level |
| @section Top Level Source Directory |
| |
| The top level source directory in a GCC distribution contains several |
| files and directories that are shared with other software |
| distributions such as that of GNU Binutils. It also contains several |
| subdirectories that contain parts of GCC and its runtime libraries: |
| |
| @table @file |
| @item boehm-gc |
| The Boehm conservative garbage collector, optionally used as part of |
| the ObjC runtime library when configured with @option{--enable-objc-gc}. |
| |
| @item config |
| Autoconf macros and Makefile fragments used throughout the tree. |
| |
| @item contrib |
| Contributed scripts that may be found useful in conjunction with GCC@. |
| One of these, @file{contrib/texi2pod.pl}, is used to generate man |
| pages from Texinfo manuals as part of the GCC build process. |
| |
| @item fixincludes |
| The support for fixing system headers to work with GCC@. See |
| @file{fixincludes/README} for more information. The headers fixed by |
| this mechanism are installed in @file{@var{libsubdir}/include-fixed}. |
| Along with those headers, @file{README-fixinc} is also installed, as |
| @file{@var{libsubdir}/include-fixed/README}. |
| |
| @item gcc |
| The main sources of GCC itself (except for runtime libraries), |
| including optimizers, support for different target architectures, |
| language front ends, and testsuites. @xref{gcc Directory, , The |
| @file{gcc} Subdirectory}, for details. |
| |
| @item gnattools |
| Support tools for GNAT. |
| |
| @item include |
| Headers for the @code{libiberty} library. |
| |
| @item intl |
| GNU @code{libintl}, from GNU @code{gettext}, for systems which do not |
| include it in @code{libc}. |
| |
| @item libada |
| The Ada runtime library. |
| |
| @item libatomic |
| The runtime support library for atomic operations (e.g.@: for @code{__sync} |
| and @code{__atomic}). |
| |
| @item libcpp |
| The C preprocessor library. |
| |
| @item libdecnumber |
| The Decimal Float support library. |
| |
| @item libffi |
| The @code{libffi} library, used as part of the Go runtime library. |
| |
| @item libgcc |
| The GCC runtime library. |
| |
| @item libgfortran |
| The Fortran runtime library. |
| |
| @item libgo |
| The Go runtime library. The bulk of this library is mirrored from the |
| @uref{https://github.com/@/golang/go, master Go repository}. |
| |
| @item libgomp |
| The GNU Offloading and Multi Processing Runtime Library. |
| |
| @item libiberty |
| The @code{libiberty} library, used for portability and for some |
| generally useful data structures and algorithms. @xref{Top, , |
| Introduction, libiberty, @sc{gnu} libiberty}, for more information |
| about this library. |
| |
| @item libitm |
| The runtime support library for transactional memory. |
| |
| @item libobjc |
| The Objective-C and Objective-C++ runtime library. |
| |
| @item libquadmath |
| The runtime support library for quad-precision math operations. |
| |
| @item libphobos |
| The D standard and runtime library. The bulk of this library is mirrored |
| from the @uref{https://github.com/@/dlang, master D repositories}. |
| |
| @item libssp |
| The Stack protector runtime library. |
| |
| @item libstdc++-v3 |
| The C++ runtime library. |
| |
| @item lto-plugin |
| Plugin used by the linker if link-time optimizations are enabled. |
| |
| @item maintainer-scripts |
| Scripts used by the @code{gccadmin} account on @code{gcc.gnu.org}. |
| |
| @item zlib |
| The @code{zlib} compression library, used for compressing and |
| uncompressing GCC's intermediate language in LTO object files. |
| @end table |
| |
| The build system in the top level directory, including how recursion |
| into subdirectories works and how building runtime libraries for |
| multilibs is handled, is documented in a separate manual, included |
| with GNU Binutils. @xref{Top, , GNU configure and build system, |
| configure, The GNU configure and build system}, for details. |
| |
| @node gcc Directory |
| @section The @file{gcc} Subdirectory |
| |
| The @file{gcc} directory contains many files that are part of the C |
| sources of GCC, other files used as part of the configuration and |
| build process, and subdirectories including documentation and a |
| testsuite. The files that are sources of GCC are documented in a |
| separate chapter. @xref{Passes, , Passes and Files of the Compiler}. |
| |
| @menu |
| * Subdirectories:: Subdirectories of @file{gcc}. |
| * Configuration:: The configuration process, and the files it uses. |
| * Build:: The build system in the @file{gcc} directory. |
| * Makefile:: Targets in @file{gcc/Makefile}. |
| * Library Files:: Library source files and headers under @file{gcc/}. |
| * Headers:: Headers installed by GCC. |
| * Documentation:: Building documentation in GCC. |
| * Front End:: Anatomy of a language front end. |
| * Back End:: Anatomy of a target back end. |
| @end menu |
| |
| @node Subdirectories |
| @subsection Subdirectories of @file{gcc} |
| |
| The @file{gcc} directory contains the following subdirectories: |
| |
| @table @file |
| @item @var{language} |
| Subdirectories for various languages. Directories containing a file |
| @file{config-lang.in} are language subdirectories. The contents of |
| the subdirectories @file{c} (for C), @file{cp} (for C++), |
| @file{objc} (for Objective-C), @file{objcp} (for Objective-C++), |
| and @file{lto} (for LTO) are documented in this |
| manual (@pxref{Passes, , Passes and Files of the Compiler}); |
| those for other languages are not. @xref{Front End, , |
| Anatomy of a Language Front End}, for details of the files in these |
| directories. |
| |
| @item common |
| Source files shared between the compiler drivers (such as |
| @command{gcc}) and the compilers proper (such as @file{cc1}). If an |
| architecture defines target hooks shared between those places, it also |
| has a subdirectory in @file{common/config}. @xref{Target Structure}. |
| |
| @item config |
| Configuration files for supported architectures and operating |
| systems. @xref{Back End, , Anatomy of a Target Back End}, for |
| details of the files in this directory. |
| |
| @item doc |
| Texinfo documentation for GCC, together with automatically generated |
| man pages and support for converting the installation manual to |
| HTML@. @xref{Documentation}. |
| |
| @item ginclude |
| System headers installed by GCC, mainly those required by the C |
| standard of freestanding implementations. @xref{Headers, , Headers |
| Installed by GCC}, for details of when these and other headers are |
| installed. |
| |
| @item po |
| Message catalogs with translations of messages produced by GCC into |
| various languages, @file{@var{language}.po}. This directory also |
| contains @file{gcc.pot}, the template for these message catalogues, |
| @file{exgettext}, a wrapper around @command{gettext} to extract the |
| messages from the GCC sources and create @file{gcc.pot}, which is run |
| by @samp{make gcc.pot}, and @file{EXCLUDES}, a list of files from |
| which messages should not be extracted. |
| |
| @item testsuite |
| The GCC testsuites (except for those for runtime libraries). |
| @xref{Testsuites}. |
| @end table |
| |
| @node Configuration |
| @subsection Configuration in the @file{gcc} Directory |
| |
| The @file{gcc} directory is configured with an Autoconf-generated |
| script @file{configure}. The @file{configure} script is generated |
| from @file{configure.ac} and @file{aclocal.m4}. From the files |
| @file{configure.ac} and @file{acconfig.h}, Autoheader generates the |
| file @file{config.in}. The file @file{cstamp-h.in} is used as a |
| timestamp. |
| |
| @menu |
| * Config Fragments:: Scripts used by @file{configure}. |
| * System Config:: The @file{config.build}, @file{config.host}, and |
| @file{config.gcc} files. |
| * Configuration Files:: Files created by running @file{configure}. |
| @end menu |
| |
| @node Config Fragments |
| @subsubsection Scripts Used by @file{configure} |
| |
| @file{configure} uses some other scripts to help in its work: |
| |
| @itemize @bullet |
| @item The standard GNU @file{config.sub} and @file{config.guess} |
| files, kept in the top level directory, are used. |
| |
| @item The file @file{config.gcc} is used to handle configuration |
| specific to the particular target machine. The file |
| @file{config.build} is used to handle configuration specific to the |
| particular build machine. The file @file{config.host} is used to handle |
| configuration specific to the particular host machine. (In general, |
| these should only be used for features that cannot reasonably be tested in |
| Autoconf feature tests.) |
| @xref{System Config, , The @file{config.build}; @file{config.host}; |
| and @file{config.gcc} Files}, for details of the contents of these files. |
| |
| @item Each language subdirectory has a file |
| @file{@var{language}/config-lang.in} that is used for |
| front-end-specific configuration. @xref{Front End Config, , The Front |
| End @file{config-lang.in} File}, for details of this file. |
| |
| @item A helper script @file{configure.frag} is used as part of |
| creating the output of @file{configure}. |
| @end itemize |
| |
| @node System Config |
| @subsubsection The @file{config.build}; @file{config.host}; and @file{config.gcc} Files |
| |
| The @file{config.build} file contains specific rules for particular systems |
| which GCC is built on. This should be used as rarely as possible, as the |
| behavior of the build system can always be detected by autoconf. |
| |
| The @file{config.host} file contains specific rules for particular systems |
| which GCC will run on. This is rarely needed. |
| |
| The @file{config.gcc} file contains specific rules for particular systems |
| which GCC will generate code for. This is usually needed. |
| |
| Each file has a list of the shell variables it sets, with descriptions, at the |
| top of the file. |
| |
| FIXME: document the contents of these files, and what variables should |
| be set to control build, host and target configuration. |
| |
| @include configfiles.texi |
| |
| @node Build |
| @subsection Build System in the @file{gcc} Directory |
| |
| FIXME: describe the build system, including what is built in what |
| stages. Also list the various source files that are used in the build |
| process but aren't source files of GCC itself and so aren't documented |
| below (@pxref{Passes}). |
| |
| @include makefile.texi |
| |
| @node Library Files |
| @subsection Library Source Files and Headers under the @file{gcc} Directory |
| |
| FIXME: list here, with explanation, all the C source files and headers |
| under the @file{gcc} directory that aren't built into the GCC |
| executable but rather are part of runtime libraries and object files, |
| such as @file{crtstuff.c} and @file{unwind-dw2.c}. @xref{Headers, , |
| Headers Installed by GCC}, for more information about the |
| @file{ginclude} directory. |
| |
| @node Headers |
| @subsection Headers Installed by GCC |
| |
| In general, GCC expects the system C library to provide most of the |
| headers to be used with it. However, GCC will fix those headers if |
| necessary to make them work with GCC, and will install some headers |
| required of freestanding implementations. These headers are installed |
| in @file{@var{libsubdir}/include}. Headers for non-C runtime |
| libraries are also installed by GCC; these are not documented here. |
| (FIXME: document them somewhere.) |
| |
| Several of the headers GCC installs are in the @file{ginclude} |
| directory. These headers, @file{iso646.h}, |
| @file{stdarg.h}, @file{stdbool.h}, and @file{stddef.h}, |
| are installed in @file{@var{libsubdir}/include}, |
| unless the target Makefile fragment (@pxref{Target Fragment}) |
| overrides this by setting @code{USER_H}. |
| |
| In addition to these headers and those generated by fixing system |
| headers to work with GCC, some other headers may also be installed in |
| @file{@var{libsubdir}/include}. @file{config.gcc} may set |
| @code{extra_headers}; this specifies additional headers under |
| @file{config} to be installed on some systems. |
| |
| GCC installs its own version of @code{<float.h>}, from @file{ginclude/float.h}. |
| This is done to cope with command-line options that change the |
| representation of floating point numbers. |
| |
| GCC also installs its own version of @code{<limits.h>}; this is generated |
| from @file{glimits.h}, together with @file{limitx.h} and |
| @file{limity.h} if the system also has its own version of |
| @code{<limits.h>}. (GCC provides its own header because it is |
| required of ISO C freestanding implementations, but needs to include |
| the system header from its own header as well because other standards |
| such as POSIX specify additional values to be defined in |
| @code{<limits.h>}.) The system's @code{<limits.h>} header is used via |
| @file{@var{libsubdir}/include/syslimits.h}, which is copied from |
| @file{gsyslimits.h} if it does not need fixing to work with GCC; if it |
| needs fixing, @file{syslimits.h} is the fixed copy. |
| |
| GCC can also install @code{<tgmath.h>}. It will do this when |
| @file{config.gcc} sets @code{use_gcc_tgmath} to @code{yes}. |
| |
| @node Documentation |
| @subsection Building Documentation |
| |
| The main GCC documentation is in the form of manuals in Texinfo |
| format. These are installed in Info format; DVI versions may be |
| generated by @samp{make dvi}, PDF versions by @samp{make pdf}, and |
| HTML versions by @samp{make html}. In addition, some man pages are |
| generated from the Texinfo manuals, there are some other text files |
| with miscellaneous documentation, and runtime libraries have their own |
| documentation outside the @file{gcc} directory. FIXME: document the |
| documentation for runtime libraries somewhere. |
| |
| @menu |
| * Texinfo Manuals:: GCC manuals in Texinfo format. |
| * Man Page Generation:: Generating man pages from Texinfo manuals. |
| * Miscellaneous Docs:: Miscellaneous text files with documentation. |
| @end menu |
| |
| @node Texinfo Manuals |
| @subsubsection Texinfo Manuals |
| |
| The manuals for GCC as a whole, and the C and C++ front ends, are in |
| files @file{doc/*.texi}. Other front ends have their own manuals in |
| files @file{@var{language}/*.texi}. Common files |
| @file{doc/include/*.texi} are provided which may be included in |
| multiple manuals; the following files are in @file{doc/include}: |
| |
| @table @file |
| @item fdl.texi |
| The GNU Free Documentation License. |
| @item funding.texi |
| The section ``Funding Free Software''. |
| @item gcc-common.texi |
| Common definitions for manuals. |
| @item gpl_v3.texi |
| The GNU General Public License. |
| @item texinfo.tex |
| A copy of @file{texinfo.tex} known to work with the GCC manuals. |
| @end table |
| |
| DVI-formatted manuals are generated by @samp{make dvi}, which uses |
| @command{texi2dvi} (via the Makefile macro @code{$(TEXI2DVI)}). |
| PDF-formatted manuals are generated by @samp{make pdf}, which uses |
| @command{texi2pdf} (via the Makefile macro @code{$(TEXI2PDF)}). HTML |
| formatted manuals are generated by @samp{make html}. Info |
| manuals are generated by @samp{make info} (which is run as part of |
| a bootstrap); this generates the manuals in the source directory, |
| using @command{makeinfo} via the Makefile macro @code{$(MAKEINFO)}, |
| and they are included in release distributions. |
| |
| Manuals are also provided on the GCC web site, in both HTML and |
| PostScript forms. This is done via the script |
| @file{maintainer-scripts/update_web_docs_git}. Each manual to be |
| provided online must be listed in the definition of @code{MANUALS} in |
| that file; a file @file{@var{name}.texi} must only appear once in the |
| source tree, and the output manual must have the same name as the |
| source file. (However, other Texinfo files, included in manuals but |
| not themselves the root files of manuals, may have names that appear |
| more than once in the source tree.) The manual file |
| @file{@var{name}.texi} should only include other files in its own |
| directory or in @file{doc/include}. HTML manuals will be generated by |
| @samp{makeinfo --html}, PostScript manuals by @command{texi2dvi} |
| and @command{dvips}, and PDF manuals by @command{texi2pdf}. |
| All Texinfo files that are parts of manuals must |
| be version-controlled, even if they are generated files, for the |
| generation of online manuals to work. |
| |
| The installation manual, @file{doc/install.texi}, is also provided on |
| the GCC web site. The HTML version is generated by the script |
| @file{doc/install.texi2html}. |
| |
| @node Man Page Generation |
| @subsubsection Man Page Generation |
| |
| Because of user demand, in addition to full Texinfo manuals, man pages |
| are provided which contain extracts from those manuals. These man |
| pages are generated from the Texinfo manuals using |
| @file{contrib/texi2pod.pl} and @command{pod2man}. (The man page for |
| @command{g++}, @file{cp/g++.1}, just contains a @samp{.so} reference |
| to @file{gcc.1}, but all the other man pages are generated from |
| Texinfo manuals.) |
| |
| Because many systems may not have the necessary tools installed to |
| generate the man pages, they are only generated if the |
| @file{configure} script detects that recent enough tools are |
| installed, and the Makefiles allow generating man pages to fail |
| without aborting the build. Man pages are also included in release |
| distributions. They are generated in the source directory. |
| |
| Magic comments in Texinfo files starting @samp{@@c man} control what |
| parts of a Texinfo file go into a man page. Only a subset of Texinfo |
| is supported by @file{texi2pod.pl}, and it may be necessary to add |
| support for more Texinfo features to this script when generating new |
| man pages. To improve the man page output, some special Texinfo |
| macros are provided in @file{doc/include/gcc-common.texi} which |
| @file{texi2pod.pl} understands: |
| |
| @table @code |
| @item @@gcctabopt |
| Use in the form @samp{@@table @@gcctabopt} for tables of options, |
| where for printed output the effect of @samp{@@code} is better than |
| that of @samp{@@option} but for man page output a different effect is |
| wanted. |
| @item @@gccoptlist |
| Use for summary lists of options in manuals. |
| @item @@gol |
| Use at the end of each line inside @samp{@@gccoptlist}. This is |
| necessary to avoid problems with differences in how the |
| @samp{@@gccoptlist} macro is handled by different Texinfo formatters. |
| @end table |
| |
| FIXME: describe the @file{texi2pod.pl} input language and magic |
| comments in more detail. |
| |
| @node Miscellaneous Docs |
| @subsubsection Miscellaneous Documentation |
| |
| In addition to the formal documentation that is installed by GCC, |
| there are several other text files in the @file{gcc} subdirectory |
| with miscellaneous documentation: |
| |
| @table @file |
| @item ABOUT-GCC-NLS |
| Notes on GCC's Native Language Support. FIXME: this should be part of |
| this manual rather than a separate file. |
| @item ABOUT-NLS |
| Notes on the Free Translation Project. |
| @item COPYING |
| @itemx COPYING3 |
| The GNU General Public License, Versions 2 and 3. |
| @item COPYING.LIB |
| @itemx COPYING3.LIB |
| The GNU Lesser General Public License, Versions 2.1 and 3. |
| @item *ChangeLog* |
| @itemx */ChangeLog* |
| Change log files for various parts of GCC@. |
| @item LANGUAGES |
| Details of a few changes to the GCC front-end interface. FIXME: the |
| information in this file should be part of general documentation of |
| the front-end interface in this manual. |
| @item ONEWS |
| Information about new features in old versions of GCC@. (For recent |
| versions, the information is on the GCC web site.) |
| @item README.Portability |
| Information about portability issues when writing code in GCC@. FIXME: |
| why isn't this part of this manual or of the GCC Coding Conventions? |
| @end table |
| |
| FIXME: document such files in subdirectories, at least @file{config}, |
| @file{c}, @file{cp}, @file{objc}, @file{testsuite}. |
| |
| @node Front End |
| @subsection Anatomy of a Language Front End |
| |
| A front end for a language in GCC has the following parts: |
| |
| @itemize @bullet |
| @item |
| A directory @file{@var{language}} under @file{gcc} containing source |
| files for that front end. @xref{Front End Directory, , The Front End |
| @file{@var{language}} Directory}, for details. |
| @item |
| A mention of the language in the list of supported languages in |
| @file{gcc/doc/install.texi}. |
| @item |
| A mention of the name under which the language's runtime library is |
| recognized by @option{--enable-shared=@var{package}} in the |
| documentation of that option in @file{gcc/doc/install.texi}. |
| @item |
| A mention of any special prerequisites for building the front end in |
| the documentation of prerequisites in @file{gcc/doc/install.texi}. |
| @item |
| Details of contributors to that front end in |
| @file{gcc/doc/contrib.texi}. If the details are in that front end's |
| own manual then there should be a link to that manual's list in |
| @file{contrib.texi}. |
| @item |
| Information about support for that language in |
| @file{gcc/doc/frontends.texi}. |
| @item |
| Information about standards for that language, and the front end's |
| support for them, in @file{gcc/doc/standards.texi}. This may be a |
| link to such information in the front end's own manual. |
| @item |
| Details of source file suffixes for that language and @option{-x |
| @var{lang}} options supported, in @file{gcc/doc/invoke.texi}. |
| @item |
| Entries in @code{default_compilers} in @file{gcc.c} for source file |
| suffixes for that language. |
| @item |
| Preferably testsuites, which may be under @file{gcc/testsuite} or |
| runtime library directories. FIXME: document somewhere how to write |
| testsuite harnesses. |
| @item |
| Probably a runtime library for the language, outside the @file{gcc} |
| directory. FIXME: document this further. |
| @item |
| Details of the directories of any runtime libraries in |
| @file{gcc/doc/sourcebuild.texi}. |
| @item |
| Check targets in @file{Makefile.def} for the top-level @file{Makefile} |
| to check just the compiler or the compiler and runtime library for the |
| language. |
| @end itemize |
| |
| If the front end is added to the official GCC source repository, the |
| following are also necessary: |
| |
| @itemize @bullet |
| @item |
| At least one Bugzilla component for bugs in that front end and runtime |
| libraries. This category needs to be added to the Bugzilla database. |
| @item |
| Normally, one or more maintainers of that front end listed in |
| @file{MAINTAINERS}. |
| @item |
| Mentions on the GCC web site in @file{index.html} and |
| @file{frontends.html}, with any relevant links on |
| @file{readings.html}. (Front ends that are not an official part of |
| GCC may also be listed on @file{frontends.html}, with relevant links.) |
| @item |
| A news item on @file{index.html}, and possibly an announcement on the |
| @email{gcc-announce@@gcc.gnu.org} mailing list. |
| @item |
| The front end's manuals should be mentioned in |
| @file{maintainer-scripts/update_web_docs_git} (@pxref{Texinfo Manuals}) |
| and the online manuals should be linked to from |
| @file{onlinedocs/index.html}. |
| @item |
| Any old releases or CVS repositories of the front end, before its |
| inclusion in GCC, should be made available on the GCC web site at |
| @uref{https://gcc.gnu.org/pub/gcc/old-releases/}. |
| @item |
| The release and snapshot script @file{maintainer-scripts/gcc_release} |
| should be updated to generate appropriate tarballs for this front end. |
| @item |
| If this front end includes its own version files that include the |
| current date, @file{maintainer-scripts/update_version} should be |
| updated accordingly. |
| @end itemize |
| |
| @menu |
| * Front End Directory:: The front end @file{@var{language}} directory. |
| * Front End Config:: The front end @file{config-lang.in} file. |
| * Front End Makefile:: The front end @file{Make-lang.in} file. |
| @end menu |
| |
| @node Front End Directory |
| @subsubsection The Front End @file{@var{language}} Directory |
| |
| A front end @file{@var{language}} directory contains the source files |
| of that front end (but not of any runtime libraries, which should be |
| outside the @file{gcc} directory). This includes documentation, and |
| possibly some subsidiary programs built alongside the front end. |
| Certain files are special and other parts of the compiler depend on |
| their names: |
| |
| @table @file |
| @item config-lang.in |
| This file is required in all language subdirectories. @xref{Front End |
| Config, , The Front End @file{config-lang.in} File}, for details of |
| its contents |
| @item Make-lang.in |
| This file is required in all language subdirectories. @xref{Front End |
| Makefile, , The Front End @file{Make-lang.in} File}, for details of its |
| contents. |
| @item lang.opt |
| This file registers the set of switches that the front end accepts on |
| the command line, and their @option{--help} text. @xref{Options}. |
| @item lang-specs.h |
| This file provides entries for @code{default_compilers} in |
| @file{gcc.c} which override the default of giving an error that a |
| compiler for that language is not installed. |
| @item @var{language}-tree.def |
| This file, which need not exist, defines any language-specific tree |
| codes. |
| @end table |
| |
| @node Front End Config |
| @subsubsection The Front End @file{config-lang.in} File |
| |
| Each language subdirectory contains a @file{config-lang.in} file. |
| This file is a shell script that may define some variables describing |
| the language: |
| |
| @table @code |
| @item language |
| This definition must be present, and gives the name of the language |
| for some purposes such as arguments to @option{--enable-languages}. |
| @item lang_requires |
| If defined, this variable lists (space-separated) language front ends |
| other than C that this front end requires to be enabled (with the |
| names given being their @code{language} settings). For example, the |
| Obj-C++ front end depends on the C++ and ObjC front ends, so sets |
| @samp{lang_requires="objc c++"}. |
| @item subdir_requires |
| If defined, this variable lists (space-separated) front end directories |
| other than C that this front end requires to be present. For example, |
| the Objective-C++ front end uses source files from the C++ and |
| Objective-C front ends, so sets @samp{subdir_requires="cp objc"}. |
| @item target_libs |
| If defined, this variable lists (space-separated) targets in the top |
| level @file{Makefile} to build the runtime libraries for this |
| language, such as @code{target-libobjc}. |
| @item lang_dirs |
| If defined, this variable lists (space-separated) top level |
| directories (parallel to @file{gcc}), apart from the runtime libraries, |
| that should not be configured if this front end is not built. |
| @item build_by_default |
| If defined to @samp{no}, this language front end is not built unless |
| enabled in a @option{--enable-languages} argument. Otherwise, front |
| ends are built by default, subject to any special logic in |
| @file{configure.ac} (as is present to disable the Ada front end if the |
| Ada compiler is not already installed). |
| @item boot_language |
| If defined to @samp{yes}, this front end is built in stage1 of the |
| bootstrap. This is only relevant to front ends written in their own |
| languages. |
| @item compilers |
| If defined, a space-separated list of compiler executables that will |
| be run by the driver. The names here will each end |
| with @samp{\$(exeext)}. |
| @item outputs |
| If defined, a space-separated list of files that should be generated |
| by @file{configure} substituting values in them. This mechanism can |
| be used to create a file @file{@var{language}/Makefile} from |
| @file{@var{language}/Makefile.in}, but this is deprecated, building |
| everything from the single @file{gcc/Makefile} is preferred. |
| @item gtfiles |
| If defined, a space-separated list of files that should be scanned by |
| @file{gengtype.c} to generate the garbage collection tables and routines for |
| this language. This excludes the files that are common to all front |
| ends. @xref{Type Information}. |
| |
| @end table |
| |
| @node Front End Makefile |
| @subsubsection The Front End @file{Make-lang.in} File |
| |
| Each language subdirectory contains a @file{Make-lang.in} file. It contains |
| targets @code{@var{lang}.@var{hook}} (where @code{@var{lang}} is the |
| setting of @code{language} in @file{config-lang.in}) for the following |
| values of @code{@var{hook}}, and any other Makefile rules required to |
| build those targets (which may if necessary use other Makefiles |
| specified in @code{outputs} in @file{config-lang.in}, although this is |
| deprecated). It also adds any testsuite targets that can use the |
| standard rule in @file{gcc/Makefile.in} to the variable |
| @code{lang_checks}. |
| |
| @table @code |
| @item all.cross |
| @itemx start.encap |
| @itemx rest.encap |
| FIXME: exactly what goes in each of these targets? |
| @item tags |
| Build an @command{etags} @file{TAGS} file in the language subdirectory |
| in the source tree. |
| @item info |
| Build info documentation for the front end, in the build directory. |
| This target is only called by @samp{make bootstrap} if a suitable |
| version of @command{makeinfo} is available, so does not need to check |
| for this, and should fail if an error occurs. |
| @item dvi |
| Build DVI documentation for the front end, in the build directory. |
| This should be done using @code{$(TEXI2DVI)}, with appropriate |
| @option{-I} arguments pointing to directories of included files. |
| @item pdf |
| Build PDF documentation for the front end, in the build directory. |
| This should be done using @code{$(TEXI2PDF)}, with appropriate |
| @option{-I} arguments pointing to directories of included files. |
| @item html |
| Build HTML documentation for the front end, in the build directory. |
| @item man |
| Build generated man pages for the front end from Texinfo manuals |
| (@pxref{Man Page Generation}), in the build directory. This target |
| is only called if the necessary tools are available, but should ignore |
| errors so as not to stop the build if errors occur; man pages are |
| optional and the tools involved may be installed in a broken way. |
| @item install-common |
| Install everything that is part of the front end, apart from the |
| compiler executables listed in @code{compilers} in |
| @file{config-lang.in}. |
| @item install-info |
| Install info documentation for the front end, if it is present in the |
| source directory. This target should have dependencies on info files |
| that should be installed. |
| @item install-man |
| Install man pages for the front end. This target should ignore |
| errors. |
| @item install-plugin |
| Install headers needed for plugins. |
| @item srcextra |
| Copies its dependencies into the source directory. This generally should |
| be used for generated files such as Bison output files which are not |
| version-controlled, but should be included in any release tarballs. This |
| target will be executed during a bootstrap if |
| @samp{--enable-generated-files-in-srcdir} was specified as a |
| @file{configure} option. |
| @item srcinfo |
| @itemx srcman |
| Copies its dependencies into the source directory. These targets will be |
| executed during a bootstrap if @samp{--enable-generated-files-in-srcdir} |
| was specified as a @file{configure} option. |
| @item uninstall |
| Uninstall files installed by installing the compiler. This is |
| currently documented not to be supported, so the hook need not do |
| anything. |
| @item mostlyclean |
| @itemx clean |
| @itemx distclean |
| @itemx maintainer-clean |
| The language parts of the standard GNU |
| @samp{*clean} targets. @xref{Standard Targets, , Standard Targets for |
| Users, standards, GNU Coding Standards}, for details of the standard |
| targets. For GCC, @code{maintainer-clean} should delete |
| all generated files in the source directory that are not version-controlled, |
| but should not delete anything that is. |
| @end table |
| |
| @file{Make-lang.in} must also define a variable @code{@var{lang}_OBJS} |
| to a list of host object files that are used by that language. |
| |
| @node Back End |
| @subsection Anatomy of a Target Back End |
| |
| A back end for a target architecture in GCC has the following parts: |
| |
| @itemize @bullet |
| @item |
| A directory @file{@var{machine}} under @file{gcc/config}, containing a |
| machine description @file{@var{machine}.md} file (@pxref{Machine Desc, |
| , Machine Descriptions}), header files @file{@var{machine}.h} and |
| @file{@var{machine}-protos.h} and a source file @file{@var{machine}.c} |
| (@pxref{Target Macros, , Target Description Macros and Functions}), |
| possibly a target Makefile fragment @file{t-@var{machine}} |
| (@pxref{Target Fragment, , The Target Makefile Fragment}), and maybe |
| some other files. The names of these files may be changed from the |
| defaults given by explicit specifications in @file{config.gcc}. |
| @item |
| If necessary, a file @file{@var{machine}-modes.def} in the |
| @file{@var{machine}} directory, containing additional machine modes to |
| represent condition codes. @xref{Condition Code}, for further details. |
| @item |
| An optional @file{@var{machine}.opt} file in the @file{@var{machine}} |
| directory, containing a list of target-specific options. You can also |
| add other option files using the @code{extra_options} variable in |
| @file{config.gcc}. @xref{Options}. |
| @item |
| Entries in @file{config.gcc} (@pxref{System Config, , The |
| @file{config.gcc} File}) for the systems with this target |
| architecture. |
| @item |
| Documentation in @file{gcc/doc/invoke.texi} for any command-line |
| options supported by this target (@pxref{Run-time Target, , Run-time |
| Target Specification}). This means both entries in the summary table |
| of options and details of the individual options. |
| @item |
| Documentation in @file{gcc/doc/extend.texi} for any target-specific |
| attributes supported (@pxref{Target Attributes, , Defining |
| target-specific uses of @code{__attribute__}}), including where the |
| same attribute is already supported on some targets, which are |
| enumerated in the manual. |
| @item |
| Documentation in @file{gcc/doc/extend.texi} for any target-specific |
| pragmas supported. |
| @item |
| Documentation in @file{gcc/doc/extend.texi} of any target-specific |
| built-in functions supported. |
| @item |
| Documentation in @file{gcc/doc/extend.texi} of any target-specific |
| format checking styles supported. |
| @item |
| Documentation in @file{gcc/doc/md.texi} of any target-specific |
| constraint letters (@pxref{Machine Constraints, , Constraints for |
| Particular Machines}). |
| @item |
| A note in @file{gcc/doc/contrib.texi} under the person or people who |
| contributed the target support. |
| @item |
| Entries in @file{gcc/doc/install.texi} for all target triplets |
| supported with this target architecture, giving details of any special |
| notes about installation for this target, or saying that there are no |
| special notes if there are none. |
| @item |
| Possibly other support outside the @file{gcc} directory for runtime |
| libraries. FIXME: reference docs for this. The @code{libstdc++} porting |
| manual needs to be installed as info for this to work, or to be a |
| chapter of this manual. |
| @end itemize |
| |
| The @file{@var{machine}.h} header is included very early in GCC's |
| standard sequence of header files, while @file{@var{machine}-protos.h} |
| is included late in the sequence. Thus @file{@var{machine}-protos.h} |
| can include declarations referencing types that are not defined when |
| @file{@var{machine}.h} is included, specifically including those from |
| @file{rtl.h} and @file{tree.h}. Since both RTL and tree types may not |
| be available in every context where @file{@var{machine}-protos.h} is |
| included, in this file you should guard declarations using these types |
| inside appropriate @code{#ifdef RTX_CODE} or @code{#ifdef TREE_CODE} |
| conditional code segments. |
| |
| If the backend uses shared data structures that require @code{GTY} markers |
| for garbage collection (@pxref{Type Information}), you must declare those |
| in @file{@var{machine}.h} rather than @file{@var{machine}-protos.h}. |
| Any definitions required for building libgcc must also go in |
| @file{@var{machine}.h}. |
| |
| GCC uses the macro @code{IN_TARGET_CODE} to distinguish between |
| machine-specific @file{.c} and @file{.cc} files and |
| machine-independent @file{.c} and @file{.cc} files. Machine-specific |
| files should use the directive: |
| |
| @example |
| #define IN_TARGET_CODE 1 |
| @end example |
| |
| before including @code{config.h}. |
| |
| If the back end is added to the official GCC source repository, the |
| following are also necessary: |
| |
| @itemize @bullet |
| @item |
| An entry for the target architecture in @file{readings.html} on the |
| GCC web site, with any relevant links. |
| @item |
| Details of the properties of the back end and target architecture in |
| @file{backends.html} on the GCC web site. |
| @item |
| A news item about the contribution of support for that target |
| architecture, in @file{index.html} on the GCC web site. |
| @item |
| Normally, one or more maintainers of that target listed in |
| @file{MAINTAINERS}. Some existing architectures may be unmaintained, |
| but it would be unusual to add support for a target that does not have |
| a maintainer when support is added. |
| @item |
| Target triplets covering all @file{config.gcc} stanzas for the target, |
| in the list in @file{contrib/config-list.mk}. |
| @end itemize |
| |
| @node Testsuites |
| @chapter Testsuites |
| |
| GCC contains several testsuites to help maintain compiler quality. |
| Most of the runtime libraries and language front ends in GCC have |
| testsuites. Currently only the C language testsuites are documented |
| here; FIXME: document the others. |
| |
| @menu |
| * Test Idioms:: Idioms used in testsuite code. |
| * Test Directives:: Directives used within DejaGnu tests. |
| * Ada Tests:: The Ada language testsuites. |
| * C Tests:: The C language testsuites. |
| * LTO Testing:: Support for testing link-time optimizations. |
| * gcov Testing:: Support for testing gcov. |
| * profopt Testing:: Support for testing profile-directed optimizations. |
| * compat Testing:: Support for testing binary compatibility. |
| * Torture Tests:: Support for torture testing using multiple options. |
| * GIMPLE Tests:: Support for testing GIMPLE passes. |
| * RTL Tests:: Support for testing RTL passes. |
| @end menu |
| |
| @node Test Idioms |
| @section Idioms Used in Testsuite Code |
| |
| In general, C testcases have a trailing @file{-@var{n}.c}, starting |
| with @file{-1.c}, in case other testcases with similar names are added |
| later. If the test is a test of some well-defined feature, it should |
| have a name referring to that feature such as |
| @file{@var{feature}-1.c}. If it does not test a well-defined feature |
| but just happens to exercise a bug somewhere in the compiler, and a |
| bug report has been filed for this bug in the GCC bug database, |
| @file{pr@var{bug-number}-1.c} is the appropriate form of name. |
| Otherwise (for miscellaneous bugs not filed in the GCC bug database), |
| and previously more generally, test cases are named after the date on |
| which they were added. This allows people to tell at a glance whether |
| a test failure is because of a recently found bug that has not yet |
| been fixed, or whether it may be a regression, but does not give any |
| other information about the bug or where discussion of it may be |
| found. Some other language testsuites follow similar conventions. |
| |
| In the @file{gcc.dg} testsuite, it is often necessary to test that an |
| error is indeed a hard error and not just a warning---for example, |
| where it is a constraint violation in the C standard, which must |
| become an error with @option{-pedantic-errors}. The following idiom, |
| where the first line shown is line @var{line} of the file and the line |
| that generates the error, is used for this: |
| |
| @smallexample |
| /* @{ dg-bogus "warning" "warning in place of error" @} */ |
| /* @{ dg-error "@var{regexp}" "@var{message}" @{ target *-*-* @} @var{line} @} */ |
| @end smallexample |
| |
| It may be necessary to check that an expression is an integer constant |
| expression and has a certain value. To check that @code{@var{E}} has |
| value @code{@var{V}}, an idiom similar to the following is used: |
| |
| @smallexample |
| char x[((E) == (V) ? 1 : -1)]; |
| @end smallexample |
| |
| In @file{gcc.dg} tests, @code{__typeof__} is sometimes used to make |
| assertions about the types of expressions. See, for example, |
| @file{gcc.dg/c99-condexpr-1.c}. The more subtle uses depend on the |
| exact rules for the types of conditional expressions in the C |
| standard; see, for example, @file{gcc.dg/c99-intconst-1.c}. |
| |
| It is useful to be able to test that optimizations are being made |
| properly. This cannot be done in all cases, but it can be done where |
| the optimization will lead to code being optimized away (for example, |
| where flow analysis or alias analysis should show that certain code |
| cannot be called) or to functions not being called because they have |
| been expanded as built-in functions. Such tests go in |
| @file{gcc.c-torture/execute}. Where code should be optimized away, a |
| call to a nonexistent function such as @code{link_failure ()} may be |
| inserted; a definition |
| |
| @smallexample |
| #ifndef __OPTIMIZE__ |
| void |
| link_failure (void) |
| @{ |
| abort (); |
| @} |
| #endif |
| @end smallexample |
| |
| @noindent |
| will also be needed so that linking still succeeds when the test is |
| run without optimization. When all calls to a built-in function |
| should have been optimized and no calls to the non-built-in version of |
| the function should remain, that function may be defined as |
| @code{static} to call @code{abort ()} (although redeclaring a function |
| as static may not work on all targets). |
| |
| All testcases must be portable. Target-specific testcases must have |
| appropriate code to avoid causing failures on unsupported systems; |
| unfortunately, the mechanisms for this differ by directory. |
| |
| FIXME: discuss non-C testsuites here. |
| |
| @node Test Directives |
| @section Directives used within DejaGnu tests |
| |
| @menu |
| * Directives:: Syntax and descriptions of test directives. |
| * Selectors:: Selecting targets to which a test applies. |
| * Effective-Target Keywords:: Keywords describing target attributes. |
| * Add Options:: Features for @code{dg-add-options} |
| * Require Support:: Variants of @code{dg-require-@var{support}} |
| * Final Actions:: Commands for use in @code{dg-final} |
| @end menu |
| |
| @node Directives |
| @subsection Syntax and Descriptions of test directives |
| |
| Test directives appear within comments in a test source file and begin |
| with @code{dg-}. Some of these are defined within DejaGnu and others |
| are local to the GCC testsuite. |
| |
| The order in which test directives appear in a test can be important: |
| directives local to GCC sometimes override information used by the |
| DejaGnu directives, which know nothing about the GCC directives, so the |
| DejaGnu directives must precede GCC directives. |
| |
| Several test directives include selectors (@pxref{Selectors, , }) |
| which are usually preceded by the keyword @code{target} or @code{xfail}. |
| |
| @subsubsection Specify how to build the test |
| |
| @table @code |
| @item @{ dg-do @var{do-what-keyword} [@{ target/xfail @var{selector} @}] @} |
| @var{do-what-keyword} specifies how the test is compiled and whether |
| it is executed. It is one of: |
| |
| @table @code |
| @item preprocess |
| Compile with @option{-E} to run only the preprocessor. |
| @item compile |
| Compile with @option{-S} to produce an assembly code file. |
| @item assemble |
| Compile with @option{-c} to produce a relocatable object file. |
| @item link |
| Compile, assemble, and link to produce an executable file. |
| @item run |
| Produce and run an executable file, which is expected to return |
| an exit code of 0. |
| @end table |
| |
| The default is @code{compile}. That can be overridden for a set of |
| tests by redefining @code{dg-do-what-default} within the @code{.exp} |
| file for those tests. |
| |
| If the directive includes the optional @samp{@{ target @var{selector} @}} |
| then the test is skipped unless the target system matches the |
| @var{selector}. |
| |
| If @var{do-what-keyword} is @code{run} and the directive includes |
| the optional @samp{@{ xfail @var{selector} @}} and the selector is met |
| then the test is expected to fail. The @code{xfail} clause is ignored |
| for other values of @var{do-what-keyword}; those tests can use |
| directive @code{dg-xfail-if}. |
| @end table |
| |
| @subsubsection Specify additional compiler options |
| |
| @table @code |
| @item @{ dg-options @var{options} [@{ target @var{selector} @}] @} |
| This DejaGnu directive provides a list of compiler options, to be used |
| if the target system matches @var{selector}, that replace the default |
| options used for this set of tests. |
| |
| @item @{ dg-add-options @var{feature} @dots{} @} |
| Add any compiler options that are needed to access certain features. |
| This directive does nothing on targets that enable the features by |
| default, or that don't provide them at all. It must come after |
| all @code{dg-options} directives. |
| For supported values of @var{feature} see @ref{Add Options, ,}. |
| |
| @item @{ dg-additional-options @var{options} [@{ target @var{selector} @}] @} |
| This directive provides a list of compiler options, to be used |
| if the target system matches @var{selector}, that are added to the default |
| options used for this set of tests. |
| @end table |
| |
| @subsubsection Modify the test timeout value |
| |
| The normal timeout limit, in seconds, is found by searching the |
| following in order: |
| |
| @itemize @bullet |
| @item the value defined by an earlier @code{dg-timeout} directive in |
| the test |
| |
| @item variable @var{tool_timeout} defined by the set of tests |
| |
| @item @var{gcc},@var{timeout} set in the target board |
| |
| @item 300 |
| @end itemize |
| |
| @table @code |
| @item @{ dg-timeout @var{n} [@{target @var{selector} @}] @} |
| Set the time limit for the compilation and for the execution of the test |
| to the specified number of seconds. |
| |
| @item @{ dg-timeout-factor @var{x} [@{ target @var{selector} @}] @} |
| Multiply the normal time limit for compilation and execution of the test |
| by the specified floating-point factor. |
| @end table |
| |
| @subsubsection Skip a test for some targets |
| |
| @table @code |
| @item @{ dg-skip-if @var{comment} @{ @var{selector} @} [@{ @var{include-opts} @} [@{ @var{exclude-opts} @}]] @} |
| Arguments @var{include-opts} and @var{exclude-opts} are lists in which |
| each element is a string of zero or more GCC options. |
| Skip the test if all of the following conditions are met: |
| @itemize @bullet |
| @item the test system is included in @var{selector} |
| |
| @item for at least one of the option strings in @var{include-opts}, |
| every option from that string is in the set of options with which |
| the test would be compiled; use @samp{"*"} for an @var{include-opts} list |
| that matches any options; that is the default if @var{include-opts} is |
| not specified |
| |
| @item for each of the option strings in @var{exclude-opts}, at least one |
| option from that string is not in the set of options with which the test |
| would be compiled; use @samp{""} for an empty @var{exclude-opts} list; |
| that is the default if @var{exclude-opts} is not specified |
| @end itemize |
| |
| For example, to skip a test if option @code{-Os} is present: |
| |
| @smallexample |
| /* @{ dg-skip-if "" @{ *-*-* @} @{ "-Os" @} @{ "" @} @} */ |
| @end smallexample |
| |
| To skip a test if both options @code{-O2} and @code{-g} are present: |
| |
| @smallexample |
| /* @{ dg-skip-if "" @{ *-*-* @} @{ "-O2 -g" @} @{ "" @} @} */ |
| @end smallexample |
| |
| To skip a test if either @code{-O2} or @code{-O3} is present: |
| |
| @smallexample |
| /* @{ dg-skip-if "" @{ *-*-* @} @{ "-O2" "-O3" @} @{ "" @} @} */ |
| @end smallexample |
| |
| To skip a test unless option @code{-Os} is present: |
| |
| @smallexample |
| /* @{ dg-skip-if "" @{ *-*-* @} @{ "*" @} @{ "-Os" @} @} */ |
| @end smallexample |
| |
| To skip a test if either @code{-O2} or @code{-O3} is used with @code{-g} |
| but not if @code{-fpic} is also present: |
| |
| @smallexample |
| /* @{ dg-skip-if "" @{ *-*-* @} @{ "-O2 -g" "-O3 -g" @} @{ "-fpic" @} @} */ |
| @end smallexample |
| |
| @item @{ dg-require-effective-target @var{keyword} [@{ target @var{selector} @}] @} |
| Skip the test if the test target, including current multilib flags, |
| is not covered by the effective-target keyword. |
| If the directive includes the optional @samp{@{ @var{selector} @}} |
| then the effective-target test is only performed if the target system |
| matches the @var{selector}. |
| This directive must appear after any @code{dg-do} directive in the test |
| and before any @code{dg-additional-sources} directive. |
| @xref{Effective-Target Keywords, , }. |
| |
| @item @{ dg-require-@var{support} args @} |
| Skip the test if the target does not provide the required support. |
| These directives must appear after any @code{dg-do} directive in the test |
| and before any @code{dg-additional-sources} directive. |
| They require at least one argument, which can be an empty string if the |
| specific procedure does not examine the argument. |
| @xref{Require Support, , }, for a complete list of these directives. |
| @end table |
| |
| @subsubsection Expect a test to fail for some targets |
| |
| @table @code |
| @item @{ dg-xfail-if @var{comment} @{ @var{selector} @} [@{ @var{include-opts} @} [@{ @var{exclude-opts} @}]] @} |
| Expect the test to fail if the conditions (which are the same as for |
| @code{dg-skip-if}) are met. This does not affect the execute step. |
| |
| @item @{ dg-xfail-run-if @var{comment} @{ @var{selector} @} [@{ @var{include-opts} @} [@{ @var{exclude-opts} @}]] @} |
| Expect the execute step of a test to fail if the conditions (which are |
| the same as for @code{dg-skip-if}) are met. |
| @end table |
| |
| @subsubsection Expect the compiler to crash |
| |
| @table @code |
| @item @{ dg-ice @var{comment} [@{ @var{selector} @} [@{ @var{include-opts} @} [@{ @var{exclude-opts} @}]]] @} |
| Expect the compiler to crash with an internal compiler error and return |
| a nonzero exit status if the conditions (which are the same as for |
| @code{dg-skip-if}) are met. Used for tests that test bugs that have not been |
| fixed yet. |
| @end table |
| |
| @subsubsection Expect the test executable to fail |
| |
| @table @code |
| @item @{ dg-shouldfail @var{comment} [@{ @var{selector} @} [@{ @var{include-opts} @} [@{ @var{exclude-opts} @}]]] @} |
| Expect the test executable to return a nonzero exit status if the |
| conditions (which are the same as for @code{dg-skip-if}) are met. |
| @end table |
| |
| @subsubsection Verify compiler messages |
| Where @var{line} is an accepted argument for these commands, a value of @samp{0} |
| can be used if there is no line associated with the message. |
| |
| @table @code |
| @item @{ dg-error @var{regexp} [@var{comment} [@{ target/xfail @var{selector} @} [@var{line}] ]] @} |
| This DejaGnu directive appears on a source line that is expected to get |
| an error message, or else specifies the source line associated with the |
| message. If there is no message for that line or if the text of that |
| message is not matched by @var{regexp} then the check fails and |
| @var{comment} is included in the @code{FAIL} message. The check does |
| not look for the string @samp{error} unless it is part of @var{regexp}. |
| |
| @item @{ dg-warning @var{regexp} [@var{comment} [@{ target/xfail @var{selector} @} [@var{line}] ]] @} |
| This DejaGnu directive appears on a source line that is expected to get |
| a warning message, or else specifies the source line associated with the |
| message. If there is no message for that line or if the text of that |
| message is not matched by @var{regexp} then the check fails and |
| @var{comment} is included in the @code{FAIL} message. The check does |
| not look for the string @samp{warning} unless it is part of @var{regexp}. |
| |
| @item @{ dg-message @var{regexp} [@var{comment} [@{ target/xfail @var{selector} @} [@var{line}] ]] @} |
| The line is expected to get a message other than an error or warning. |
| If there is no message for that line or if the text of that message is |
| not matched by @var{regexp} then the check fails and @var{comment} is |
| included in the @code{FAIL} message. |
| |
| @item @{ dg-note @var{regexp} [@var{comment} [@{ target/xfail @var{selector} @} [@var{line}] ]] @} |
| The line is expected to get a @samp{note} message. |
| If there is no message for that line or if the text of that message is |
| not matched by @var{regexp} then the check fails and @var{comment} is |
| included in the @code{FAIL} message. |
| |
| By default, any @emph{excess} @samp{note} messages are pruned, meaning |
| their appearance doesn't trigger @emph{excess errors}. |
| However, if @samp{dg-note} is used at least once in a testcase, |
| they're not pruned and instead must @emph{all} be handled explicitly. |
| Thus, if looking for just single instances of messages with |
| @samp{note: } prefixes without caring for all of them, use |
| @samp{dg-message "note: [@dots{}]"} instead of @samp{dg-note}, or use |
| @samp{dg-note} together with @samp{dg-prune-output "note: "}. |
| |
| @item @{ dg-bogus @var{regexp} [@var{comment} [@{ target/xfail @var{selector} @} [@var{line}] ]] @} |
| This DejaGnu directive appears on a source line that should not get a |
| message matching @var{regexp}, or else specifies the source line |
| associated with the bogus message. It is usually used with @samp{xfail} |
| to indicate that the message is a known problem for a particular set of |
| targets. |
| |
| @item @{ dg-line @var{linenumvar} @} |
| This DejaGnu directive sets the variable @var{linenumvar} to the line number of |
| the source line. The variable @var{linenumvar} can then be used in subsequent |
| @code{dg-error}, @code{dg-warning}, @code{dg-message}, @code{dg-note} |
| and @code{dg-bogus} |
| directives. For example: |
| |
| @smallexample |
| int a; /* @{ dg-line first_def_a @} */ |
| float a; /* @{ dg-error "conflicting types of" @} */ |
| /* @{ dg-message "previous declaration of" "" @{ target *-*-* @} first_def_a @} */ |
| @end smallexample |
| |
| @item @{ dg-excess-errors @var{comment} [@{ target/xfail @var{selector} @}] @} |
| This DejaGnu directive indicates that the test is expected to fail due |
| to compiler messages that are not handled by @samp{dg-error}, |
| @samp{dg-warning}, @code{dg-message}, @samp{dg-note} or |
| @samp{dg-bogus}. |
| For this directive @samp{xfail} |
| has the same effect as @samp{target}. |
| |
| @item @{ dg-prune-output @var{regexp} @} |
| Prune messages matching @var{regexp} from the test output. |
| @end table |
| |
| @subsubsection Verify output of the test executable |
| |
| @table @code |
| @item @{ dg-output @var{regexp} [@{ target/xfail @var{selector} @}] @} |
| This DejaGnu directive compares @var{regexp} to the combined output |
| that the test executable writes to @file{stdout} and @file{stderr}. |
| @end table |
| |
| @subsubsection Specify environment variables for a test |
| |
| @table @code |
| @item @{ dg-set-compiler-env-var @var{var_name} "@var{var_value}" @} |
| Specify that the environment variable @var{var_name} needs to be set |
| to @var{var_value} before invoking the compiler on the test file. |
| |
| @item @{ dg-set-target-env-var @var{var_name} "@var{var_value}" @} |
| Specify that the environment variable @var{var_name} needs to be set |
| to @var{var_value} before execution of the program created by the test. |
| @end table |
| |
| @subsubsection Specify additional files for a test |
| |
| @table @code |
| @item @{ dg-additional-files "@var{filelist}" @} |
| Specify additional files, other than source files, that must be copied |
| to the system where the compiler runs. |
| |
| @item @{ dg-additional-sources "@var{filelist}" @} |
| Specify additional source files to appear in the compile line |
| following the main test file. |
| @end table |
| |
| @subsubsection Add checks at the end of a test |
| |
| @table @code |
| @item @{ dg-final @{ @var{local-directive} @} @} |
| This DejaGnu directive is placed within a comment anywhere in the |
| source file and is processed after the test has been compiled and run. |
| Multiple @samp{dg-final} commands are processed in the order in which |
| they appear in the source file. @xref{Final Actions, , }, for a list |
| of directives that can be used within @code{dg-final}. |
| @end table |
| |
| @node Selectors |
| @subsection Selecting targets to which a test applies |
| |
| Several test directives include @var{selector}s to limit the targets |
| for which a test is run or to declare that a test is expected to fail |
| on particular targets. |
| |
| A selector is: |
| @itemize @bullet |
| @item one or more target triplets, possibly including wildcard characters; |
| use @samp{*-*-*} to match any target |
| @item a single effective-target keyword (@pxref{Effective-Target Keywords}) |
| @item a list of compiler options that should be included or excluded |
| (as described in more detail below) |
| @item a logical expression |
| @end itemize |
| |
| Depending on the context, the selector specifies whether a test is |
| skipped and reported as unsupported or is expected to fail. A context |
| that allows either @samp{target} or @samp{xfail} also allows |
| @samp{@{ target @var{selector1} xfail @var{selector2} @}} |
| to skip the test for targets that don't match @var{selector1} and the |
| test to fail for targets that match @var{selector2}. |
| |
| A selector expression appears within curly braces and uses a single |
| logical operator: one of @samp{!}, @samp{&&}, or @samp{||}. An |
| operand is one of the following: |
| |
| @itemize @bullet |
| @item |
| another selector expression, in curly braces |
| |
| @item |
| an effective-target keyword, such as @code{lp64} |
| |
| @item |
| a single target triplet |
| |
| @item |
| a list of target triplets within quotes or curly braces |
| |
| @item |
| one of the following: |
| |
| @table @samp |
| @item @{ any-opts @var{opt1} @dots{} @var{optn} @} |
| Each of @var{opt1} to @var{optn} is a space-separated list of option globs. |
| The selector expression evaluates to true if, for one of these strings, |
| every glob in the string matches an option that was passed to the compiler. |
| For example: |
| |
| @smallexample |
| @{ any-opts "-O3 -flto" "-O[2g]" @} |
| @end smallexample |
| |
| is true if any of the following are true: |
| |
| @itemize @bullet |
| @item |
| @option{-O2} was passed to the compiler |
| |
| @item |
| @option{-Og} was passed to the compiler |
| |
| @item |
| both @option{-O3} and @option{-flto} were passed to the compiler |
| @end itemize |
| |
| This kind of selector can only be used within @code{dg-final} directives. |
| Use @code{dg-skip-if}, @code{dg-xfail-if} or @code{dg-xfail-run-if} to |
| skip whole tests based on options, or to mark them as expected to fail |
| with certain options. |
| |
| @item @{ no-opts @var{opt1} @dots{} @var{optn} @} |
| As for @code{any-opts} above, each of @var{opt1} to @var{optn} is a |
| space-separated list of option globs. The selector expression |
| evaluates to true if, for all of these strings, there is at least |
| one glob that does not match an option that was passed to the compiler. |
| It is shorthand for: |
| |
| @smallexample |
| @{ ! @{ any-opts @var{opt1} @dots{} @var{optn} @} @} |
| @end smallexample |
| |
| For example: |
| |
| @smallexample |
| @{ no-opts "-O3 -flto" "-O[2g]" @} |
| @end smallexample |
| |
| is true if all of the following are true: |
| |
| @itemize @bullet |
| @item |
| @option{-O2} was not passed to the compiler |
| |
| @item |
| @option{-Og} was not passed to the compiler |
| |
| @item |
| at least one of @option{-O3} or @option{-flto} was not passed to the compiler |
| @end itemize |
| |
| Like @code{any-opts}, this kind of selector can only be used within |
| @code{dg-final} directives. |
| |
| @end table |
| @end itemize |
| |
| Here are some examples of full target selectors: |
| |
| @smallexample |
| @{ target @{ ! "hppa*-*-* ia64*-*-*" @} @} |
| @{ target @{ powerpc*-*-* && lp64 @} @} |
| @{ xfail @{ lp64 || vect_no_align @} @} |
| @{ xfail @{ aarch64*-*-* && @{ any-opts "-O2" @} @} @} |
| @end smallexample |
| |
| @node Effective-Target Keywords |
| @subsection Keywords describing target attributes |
| |
| Effective-target keywords identify sets of targets that support |
| particular functionality. They are used to limit tests to be run only |
| for particular targets, or to specify that particular sets of targets |
| are expected to fail some tests. |
| |
| Effective-target keywords are defined in @file{lib/target-supports.exp} in |
| the GCC testsuite, with the exception of those that are documented as |
| being local to a particular test directory. |
| |
| The @samp{effective target} takes into account all of the compiler options |
| with which the test will be compiled, including the multilib options. |
| By convention, keywords ending in @code{_nocache} can also include options |
| specified for the particular test in an earlier @code{dg-options} or |
| @code{dg-add-options} directive. |
| |
| @subsubsection Endianness |
| |
| @table @code |
| @item be |
| Target uses big-endian memory order for multi-byte and multi-word data. |
| |
| @item le |
| Target uses little-endian memory order for multi-byte and multi-word data. |
| @end table |
| |
| @subsubsection Data type sizes |
| |
| @table @code |
| @item ilp32 |
| Target has 32-bit @code{int}, @code{long}, and pointers. |
| |
| @item lp64 |
| Target has 32-bit @code{int}, 64-bit @code{long} and pointers. |
| |
| @item llp64 |
| Target has 32-bit @code{int} and @code{long}, 64-bit @code{long long} |
| and pointers. |
| |
| @item double64 |
| Target has 64-bit @code{double}. |
| |
| @item double64plus |
| Target has @code{double} that is 64 bits or longer. |
| |
| @item longdouble128 |
| Target has 128-bit @code{long double}. |
| |
| @item int32plus |
| Target has @code{int} that is at 32 bits or longer. |
| |
| @item int16 |
| Target has @code{int} that is 16 bits or shorter. |
| |
| @item longlong64 |
| Target has 64-bit @code{long long}. |
| |
| @item long_neq_int |
| Target has @code{int} and @code{long} with different sizes. |
| |
| @item short_eq_int |
| Target has @code{short} and @code{int} with the same size. |
| |
| @item ptr_eq_short |
| Target has pointers (@code{void *}) and @code{short} with the same size. |
| |
| @item int_eq_float |
| Target has @code{int} and @code{float} with the same size. |
| |
| @item ptr_eq_long |
| Target has pointers (@code{void *}) and @code{long} with the same size. |
| |
| @item large_double |
| Target supports @code{double} that is longer than @code{float}. |
| |
| @item large_long_double |
| Target supports @code{long double} that is longer than @code{double}. |
| |
| @item ptr32plus |
| Target has pointers that are 32 bits or longer. |
| |
| @item size20plus |
| Target has a 20-bit or larger address space, so supports at least |
| 16-bit array and structure sizes. |
| |
| @item size24plus |
| Target has a 24-bit or larger address space, so supports at least |
| 20-bit array and structure sizes. |
| |
| @item size32plus |
| Target has a 32-bit or larger address space, so supports at least |
| 24-bit array and structure sizes. |
| |
| @item 4byte_wchar_t |
| Target has @code{wchar_t} that is at least 4 bytes. |
| |
| @item float@var{n} |
| Target has the @code{_Float@var{n}} type. |
| |
| @item float@var{n}x |
| Target has the @code{_Float@var{n}x} type. |
| |
| @item float@var{n}_runtime |
| Target has the @code{_Float@var{n}} type, including runtime support |
| for any options added with @code{dg-add-options}. |
| |
| @item float@var{n}x_runtime |
| Target has the @code{_Float@var{n}x} type, including runtime support |
| for any options added with @code{dg-add-options}. |
| |
| @item floatn_nx_runtime |
| Target has runtime support for any options added with |
| @code{dg-add-options} for any @code{_Float@var{n}} or |
| @code{_Float@var{n}x} type. |
| |
| @item inf |
| Target supports floating point infinite (@code{inf}) for type |
| @code{double}. |
| |
| @item inff |
| Target supports floating point infinite (@code{inf}) for type |
| @code{float}. |
| @end table |
| @subsubsection Fortran-specific attributes |
| |
| @table @code |
| @item fortran_integer_16 |
| Target supports Fortran @code{integer} that is 16 bytes or longer. |
| |
| @item fortran_real_10 |
| Target supports Fortran @code{real} that is 10 bytes or longer. |
| |
| @item fortran_real_16 |
| Target supports Fortran @code{real} that is 16 bytes or longer. |
| |
| @item fortran_large_int |
| Target supports Fortran @code{integer} kinds larger than @code{integer(8)}. |
| |
| @item fortran_large_real |
| Target supports Fortran @code{real} kinds larger than @code{real(8)}. |
| @end table |
| |
| @subsubsection Vector-specific attributes |
| |
| @table @code |
| @item vect_align_stack_vars |
| The target's ABI allows stack variables to be aligned to the preferred |
| vector alignment. |
| |
| @item vect_avg_qi |
| Target supports both signed and unsigned averaging operations on vectors |
| of bytes. |
| |
| @item vect_mulhrs_hi |
| Target supports both signed and unsigned multiply-high-with-round-and-scale |
| operations on vectors of half-words. |
| |
| @item vect_sdiv_pow2_si |
| Target supports signed division by constant power-of-2 operations |
| on vectors of 4-byte integers. |
| |
| @item vect_condition |
| Target supports vector conditional operations. |
| |
| @item vect_cond_mixed |
| Target supports vector conditional operations where comparison operands |
| have different type from the value operands. |
| |
| @item vect_double |
| Target supports hardware vectors of @code{double}. |
| |
| @item vect_double_cond_arith |
| Target supports conditional addition, subtraction, multiplication, |
| division, minimum and maximum on vectors of @code{double}, via the |
| @code{cond_} optabs. |
| |
| @item vect_element_align_preferred |
| The target's preferred vector alignment is the same as the element |
| alignment. |
| |
| @item vect_float |
| Target supports hardware vectors of @code{float} when |
| @option{-funsafe-math-optimizations} is in effect. |
| |
| @item vect_float_strict |
| Target supports hardware vectors of @code{float} when |
| @option{-funsafe-math-optimizations} is not in effect. |
| This implies @code{vect_float}. |
| |
| @item vect_int |
| Target supports hardware vectors of @code{int}. |
| |
| @item vect_long |
| Target supports hardware vectors of @code{long}. |
| |
| @item vect_long_long |
| Target supports hardware vectors of @code{long long}. |
| |
| @item vect_check_ptrs |
| Target supports the @code{check_raw_ptrs} and @code{check_war_ptrs} |
| optabs on vectors. |
| |
| @item vect_fully_masked |
| Target supports fully-masked (also known as fully-predicated) loops, |
| so that vector loops can handle partial as well as full vectors. |
| |
| @item vect_masked_load |
| Target supports vector masked loads. |
| |
| @item vect_masked_store |
| Target supports vector masked stores. |
| |
| @item vect_scatter_store |
| Target supports vector scatter stores. |
| |
| @item vect_aligned_arrays |
| Target aligns arrays to vector alignment boundary. |
| |
| @item vect_hw_misalign |
| Target supports a vector misalign access. |
| |
| @item vect_no_align |
| Target does not support a vector alignment mechanism. |
| |
| @item vect_peeling_profitable |
| Target might require to peel loops for alignment purposes. |
| |
| @item vect_no_int_min_max |
| Target does not support a vector min and max instruction on @code{int}. |
| |
| @item vect_no_int_add |
| Target does not support a vector add instruction on @code{int}. |
| |
| @item vect_no_bitwise |
| Target does not support vector bitwise instructions. |
| |
| @item vect_bool_cmp |
| Target supports comparison of @code{bool} vectors for at least one |
| vector length. |
| |
| @item vect_char_add |
| Target supports addition of @code{char} vectors for at least one |
| vector length. |
| |
| @item vect_char_mult |
| Target supports @code{vector char} multiplication. |
| |
| @item vect_short_mult |
| Target supports @code{vector short} multiplication. |
| |
| @item vect_int_mult |
| Target supports @code{vector int} multiplication. |
| |
| @item vect_long_mult |
| Target supports 64 bit @code{vector long} multiplication. |
| |
| @item vect_extract_even_odd |
| Target supports vector even/odd element extraction. |
| |
| @item vect_extract_even_odd_wide |
| Target supports vector even/odd element extraction of vectors with elements |
| @code{SImode} or larger. |
| |
| @item vect_interleave |
| Target supports vector interleaving. |
| |
| @item vect_strided |
| Target supports vector interleaving and extract even/odd. |
| |
| @item vect_strided_wide |
| Target supports vector interleaving and extract even/odd for wide |
| element types. |
| |
| @item vect_perm |
| Target supports vector permutation. |
| |
| @item vect_perm_byte |
| Target supports permutation of vectors with 8-bit elements. |
| |
| @item vect_perm_short |
| Target supports permutation of vectors with 16-bit elements. |
| |
| @item vect_perm3_byte |
| Target supports permutation of vectors with 8-bit elements, and for the |
| default vector length it is possible to permute: |
| @example |
| @{ a0, a1, a2, b0, b1, b2, @dots{} @} |
| @end example |
| to: |
| @example |
| @{ a0, a0, a0, b0, b0, b0, @dots{} @} |
| @{ a1, a1, a1, b1, b1, b1, @dots{} @} |
| @{ a2, a2, a2, b2, b2, b2, @dots{} @} |
| @end example |
| using only two-vector permutes, regardless of how long the sequence is. |
| |
| @item vect_perm3_int |
| Like @code{vect_perm3_byte}, but for 32-bit elements. |
| |
| @item vect_perm3_short |
| Like @code{vect_perm3_byte}, but for 16-bit elements. |
| |
| @item vect_shift |
| Target supports a hardware vector shift operation. |
| |
| @item vect_unaligned_possible |
| Target prefers vectors to have an alignment greater than element |
| alignment, but also allows unaligned vector accesses in some |
| circumstances. |
| |
| @item vect_variable_length |
| Target has variable-length vectors. |
| |
| @item vect64 |
| Target supports vectors of 64 bits. |
| |
| @item vect32 |
| Target supports vectors of 32 bits. |
| |
| @item vect_widen_sum_hi_to_si |
| Target supports a vector widening summation of @code{short} operands |
| into @code{int} results, or can promote (unpack) from @code{short} |
| to @code{int}. |
| |
| @item vect_widen_sum_qi_to_hi |
| Target supports a vector widening summation of @code{char} operands |
| into @code{short} results, or can promote (unpack) from @code{char} |
| to @code{short}. |
| |
| @item vect_widen_sum_qi_to_si |
| Target supports a vector widening summation of @code{char} operands |
| into @code{int} results. |
| |
| @item vect_widen_mult_qi_to_hi |
| Target supports a vector widening multiplication of @code{char} operands |
| into @code{short} results, or can promote (unpack) from @code{char} to |
| @code{short} and perform non-widening multiplication of @code{short}. |
| |
| @item vect_widen_mult_hi_to_si |
| Target supports a vector widening multiplication of @code{short} operands |
| into @code{int} results, or can promote (unpack) from @code{short} to |
| @code{int} and perform non-widening multiplication of @code{int}. |
| |
| @item vect_widen_mult_si_to_di_pattern |
| Target supports a vector widening multiplication of @code{int} operands |
| into @code{long} results. |
| |
| @item vect_sdot_qi |
| Target supports a vector dot-product of @code{signed char}. |
| |
| @item vect_udot_qi |
| Target supports a vector dot-product of @code{unsigned char}. |
| |
| @item vect_usdot_qi |
| Target supports a vector dot-product where one operand of the multiply is |
| @code{signed char} and the other of @code{unsigned char}. |
| |
| @item vect_sdot_hi |
| Target supports a vector dot-product of @code{signed short}. |
| |
| @item vect_udot_hi |
| Target supports a vector dot-product of @code{unsigned short}. |
| |
| @item vect_pack_trunc |
| Target supports a vector demotion (packing) of @code{short} to @code{char} |
| and from @code{int} to @code{short} using modulo arithmetic. |
| |
| @item vect_unpack |
| Target supports a vector promotion (unpacking) of @code{char} to @code{short} |
| and from @code{char} to @code{int}. |
| |
| @item vect_intfloat_cvt |
| Target supports conversion from @code{signed int} to @code{float}. |
| |
| @item vect_uintfloat_cvt |
| Target supports conversion from @code{unsigned int} to @code{float}. |
| |
| @item vect_floatint_cvt |
| Target supports conversion from @code{float} to @code{signed int}. |
| |
| @item vect_floatuint_cvt |
| Target supports conversion from @code{float} to @code{unsigned int}. |
| |
| @item vect_intdouble_cvt |
| Target supports conversion from @code{signed int} to @code{double}. |
| |
| @item vect_doubleint_cvt |
| Target supports conversion from @code{double} to @code{signed int}. |
| |
| @item vect_max_reduc |
| Target supports max reduction for vectors. |
| |
| @item vect_sizes_16B_8B |
| Target supports 16- and 8-bytes vectors. |
| |
| @item vect_sizes_32B_16B |
| Target supports 32- and 16-bytes vectors. |
| |
| @item vect_logical_reduc |
| Target supports AND, IOR and XOR reduction on vectors. |
| |
| @item vect_fold_extract_last |
| Target supports the @code{fold_extract_last} optab. |
| |
| @item vect_len_load_store |
| Target supports the @code{len_load} and @code{len_store} optabs. |
| |
| @item vect_partial_vectors_usage_1 |
| Target supports loop vectorization with partial vectors and |
| @code{vect-partial-vector-usage} is set to 1. |
| |
| @item vect_partial_vectors_usage_2 |
| Target supports loop vectorization with partial vectors and |
| @code{vect-partial-vector-usage} is set to 2. |
| |
| @item vect_partial_vectors |
| Target supports loop vectorization with partial vectors and |
| @code{vect-partial-vector-usage} is nonzero. |
| @end table |
| |
| @subsubsection Thread Local Storage attributes |
| |
| @table @code |
| @item tls |
| Target supports thread-local storage. |
| |
| @item tls_native |
| Target supports native (rather than emulated) thread-local storage. |
| |
| @item tls_runtime |
| Test system supports executing TLS executables. |
| @end table |
| |
| @subsubsection Decimal floating point attributes |
| |
| @table @code |
| @item dfp |
| Targets supports compiling decimal floating point extension to C. |
| |
| @item dfp_nocache |
| Including the options used to compile this particular test, the |
| target supports compiling decimal floating point extension to C. |
| |
| @item dfprt |
| Test system can execute decimal floating point tests. |
| |
| @item dfprt_nocache |
| Including the options used to compile this particular test, the |
| test system can execute decimal floating point tests. |
| |
| @item hard_dfp |
| Target generates decimal floating point instructions with current options. |
| @end table |
| |
| @subsubsection ARM-specific attributes |
| |
| @table @code |
| @item arm32 |
| ARM target generates 32-bit code. |
| |
| @item arm_little_endian |
| ARM target that generates little-endian code. |
| |
| @item arm_eabi |
| ARM target adheres to the ABI for the ARM Architecture. |
| |
| @item arm_fp_ok |
| @anchor{arm_fp_ok} |
| ARM target defines @code{__ARM_FP} using @code{-mfloat-abi=softfp} or |
| equivalent options. Some multilibs may be incompatible with these |
| options. |
| |
| @item arm_fp_dp_ok |
| @anchor{arm_fp_dp_ok} |
| ARM target defines @code{__ARM_FP} with double-precision support using |
| @code{-mfloat-abi=softfp} or equivalent options. Some multilibs may |
| be incompatible with these options. |
| |
| @item arm_hf_eabi |
| ARM target adheres to the VFP and Advanced SIMD Register Arguments |
| variant of the ABI for the ARM Architecture (as selected with |
| @code{-mfloat-abi=hard}). |
| |
| @item arm_softfloat |
| ARM target uses emulated floating point operations. |
| |
| @item arm_hard_vfp_ok |
| ARM target supports @code{-mfpu=vfp -mfloat-abi=hard}. |
| Some multilibs may be incompatible with these options. |
| |
| @item arm_iwmmxt_ok |
| ARM target supports @code{-mcpu=iwmmxt}. |
| Some multilibs may be incompatible with this option. |
| |
| @item arm_neon |
| ARM target supports generating NEON instructions. |
| |
| @item arm_tune_string_ops_prefer_neon |
| Test CPU tune supports inlining string operations with NEON instructions. |
| |
| @item arm_neon_hw |
| Test system supports executing NEON instructions. |
| |
| @item arm_neonv2_hw |
| Test system supports executing NEON v2 instructions. |
| |
| @item arm_neon_ok |
| @anchor{arm_neon_ok} |
| ARM Target supports @code{-mfpu=neon -mfloat-abi=softfp} or compatible |
| options. Some multilibs may be incompatible with these options. |
| |
| @item arm_neon_ok_no_float_abi |
| @anchor{arm_neon_ok_no_float_abi} |
| ARM Target supports NEON with @code{-mfpu=neon}, but without any |
| -mfloat-abi= option. Some multilibs may be incompatible with this |
| option. |
| |
| @item arm_neonv2_ok |
| @anchor{arm_neonv2_ok} |
| ARM Target supports @code{-mfpu=neon-vfpv4 -mfloat-abi=softfp} or compatible |
| options. Some multilibs may be incompatible with these options. |
| |
| @item arm_fp16_ok |
| @anchor{arm_fp16_ok} |
| Target supports options to generate VFP half-precision floating-point |
| instructions. Some multilibs may be incompatible with these |
| options. This test is valid for ARM only. |
| |
| @item arm_fp16_hw |
| Target supports executing VFP half-precision floating-point |
| instructions. This test is valid for ARM only. |
| |
| @item arm_neon_fp16_ok |
| @anchor{arm_neon_fp16_ok} |
| ARM Target supports @code{-mfpu=neon-fp16 -mfloat-abi=softfp} or compatible |
| options, including @code{-mfp16-format=ieee} if necessary to obtain the |
| @code{__fp16} type. Some multilibs may be incompatible with these options. |
| |
| @item arm_neon_fp16_hw |
| Test system supports executing Neon half-precision float instructions. |
| (Implies previous.) |
| |
| @item arm_fp16_alternative_ok |
| ARM target supports the ARM FP16 alternative format. Some multilibs |
| may be incompatible with the options needed. |
| |
| @item arm_fp16_none_ok |
| ARM target supports specifying none as the ARM FP16 format. |
| |
| @item arm_thumb1_ok |
| ARM target generates Thumb-1 code for @code{-mthumb}. |
| |
| @item arm_thumb2_ok |
| ARM target generates Thumb-2 code for @code{-mthumb}. |
| |
| @item arm_nothumb |
| ARM target that is not using Thumb. |
| |
| @item arm_vfp_ok |
| ARM target supports @code{-mfpu=vfp -mfloat-abi=softfp}. |
| Some multilibs may be incompatible with these options. |
| |
| @item arm_vfp3_ok |
| @anchor{arm_vfp3_ok} |
| ARM target supports @code{-mfpu=vfp3 -mfloat-abi=softfp}. |
| Some multilibs may be incompatible with these options. |
| |
| @item arm_arch_v8a_hard_ok |
| @anchor{arm_arch_v8a_hard_ok} |
| The compiler is targeting @code{arm*-*-*} and can compile and assemble code |
| using the options @code{-march=armv8-a -mfpu=neon-fp-armv8 -mfloat-abi=hard}. |
| This is not enough to guarantee that linking works. |
| |
| @item arm_arch_v8a_hard_multilib |
| The compiler is targeting @code{arm*-*-*} and can build programs using |
| the options @code{-march=armv8-a -mfpu=neon-fp-armv8 -mfloat-abi=hard}. |
| The target can also run the resulting binaries. |
| |
| @item arm_v8_vfp_ok |
| ARM target supports @code{-mfpu=fp-armv8 -mfloat-abi=softfp}. |
| Some multilibs may be incompatible with these options. |
| |
| @item arm_v8_neon_ok |
| ARM target supports @code{-mfpu=neon-fp-armv8 -mfloat-abi=softfp}. |
| Some multilibs may be incompatible with these options. |
| |
| @item arm_v8_1a_neon_ok |
| @anchor{arm_v8_1a_neon_ok} |
| ARM target supports options to generate ARMv8.1-A Adv.SIMD instructions. |
| Some multilibs may be incompatible with these options. |
| |
| @item arm_v8_1a_neon_hw |
| ARM target supports executing ARMv8.1-A Adv.SIMD instructions. Some |
| multilibs may be incompatible with the options needed. Implies |
| arm_v8_1a_neon_ok. |
| |
| @item arm_acq_rel |
| ARM target supports acquire-release instructions. |
| |
| @item arm_v8_2a_fp16_scalar_ok |
| @anchor{arm_v8_2a_fp16_scalar_ok} |
| ARM target supports options to generate instructions for ARMv8.2-A and |
| scalar instructions from the FP16 extension. Some multilibs may be |
| incompatible with these options. |
| |
| @item arm_v8_2a_fp16_scalar_hw |
| ARM target supports executing instructions for ARMv8.2-A and scalar |
| instructions from the FP16 extension. Some multilibs may be |
| incompatible with these options. Implies arm_v8_2a_fp16_neon_ok. |
| |
| @item arm_v8_2a_fp16_neon_ok |
| @anchor{arm_v8_2a_fp16_neon_ok} |
| ARM target supports options to generate instructions from ARMv8.2-A with |
| the FP16 extension. Some multilibs may be incompatible with these |
| options. Implies arm_v8_2a_fp16_scalar_ok. |
| |
| @item arm_v8_2a_fp16_neon_hw |
| ARM target supports executing instructions from ARMv8.2-A with the FP16 |
| extension. Some multilibs may be incompatible with these options. |
| Implies arm_v8_2a_fp16_neon_ok and arm_v8_2a_fp16_scalar_hw. |
| |
| @item arm_v8_2a_dotprod_neon_ok |
| @anchor{arm_v8_2a_dotprod_neon_ok} |
| ARM target supports options to generate instructions from ARMv8.2-A with |
| the Dot Product extension. Some multilibs may be incompatible with these |
| options. |
| |
| @item arm_v8_2a_dotprod_neon_hw |
| ARM target supports executing instructions from ARMv8.2-A with the Dot |
| Product extension. Some multilibs may be incompatible with these options. |
| Implies arm_v8_2a_dotprod_neon_ok. |
| |
| @item arm_v8_2a_i8mm_neon_hw |
| ARM target supports executing instructions from ARMv8.2-A with the 8-bit |
| Matrix Multiply extension. Some multilibs may be incompatible with these |
| options. Implies arm_v8_2a_i8mm_ok. |
| |
| @item arm_fp16fml_neon_ok |
| @anchor{arm_fp16fml_neon_ok} |
| ARM target supports extensions to generate the @code{VFMAL} and @code{VFMLS} |
| half-precision floating-point instructions available from ARMv8.2-A and |
| onwards. Some multilibs may be incompatible with these options. |
| |
| @item arm_v8_2a_bf16_neon_ok |
| ARM target supports options to generate instructions from ARMv8.2-A with |
| the BFloat16 extension (bf16). Some multilibs may be incompatible with these |
| options. |
| |
| @item arm_v8_2a_i8mm_ok |
| ARM target supports options to generate instructions from ARMv8.2-A with |
| the 8-Bit Integer Matrix Multiply extension (i8mm). Some multilibs may be |
| incompatible with these options. |
| |
| @item arm_v8_1m_mve_ok |
| ARM target supports options to generate instructions from ARMv8.1-M with |
| the M-Profile Vector Extension (MVE). Some multilibs may be incompatible |
| with these options. |
| |
| @item arm_v8_1m_mve_fp_ok |
| ARM target supports options to generate instructions from ARMv8.1-M with |
| the Half-precision floating-point instructions (HP), Floating-point Extension |
| (FP) along with M-Profile Vector Extension (MVE). Some multilibs may be |
| incompatible with these options. |
| |
| @item arm_mve_hw |
| Test system supports executing MVE instructions. |
| |
| @item arm_v8m_main_cde |
| ARM target supports options to generate instructions from ARMv8-M with |
| the Custom Datapath Extension (CDE). Some multilibs may be incompatible |
| with these options. |
| |
| @item arm_v8m_main_cde_fp |
| ARM target supports options to generate instructions from ARMv8-M with |
| the Custom Datapath Extension (CDE) and floating-point (VFP). |
| Some multilibs may be incompatible with these options. |
| |
| @item arm_v8_1m_main_cde_mve |
| ARM target supports options to generate instructions from ARMv8.1-M with |
| the Custom Datapath Extension (CDE) and M-Profile Vector Extension (MVE). |
| Some multilibs may be incompatible with these options. |
| |
| @item arm_prefer_ldrd_strd |
| ARM target prefers @code{LDRD} and @code{STRD} instructions over |
| @code{LDM} and @code{STM} instructions. |
| |
| @item arm_thumb1_movt_ok |
| ARM target generates Thumb-1 code for @code{-mthumb} with @code{MOVW} |
| and @code{MOVT} instructions available. |
| |
| @item arm_thumb1_cbz_ok |
| ARM target generates Thumb-1 code for @code{-mthumb} with |
| @code{CBZ} and @code{CBNZ} instructions available. |
| |
| @item arm_divmod_simode |
| ARM target for which divmod transform is disabled, if it supports hardware |
| div instruction. |
| |
| @item arm_cmse_ok |
| ARM target supports ARMv8-M Security Extensions, enabled by the @code{-mcmse} |
| option. |
| |
| @item arm_cmse_hw |
| Test system supports executing CMSE instructions. |
| |
| @item arm_coproc1_ok |
| @anchor{arm_coproc1_ok} |
| ARM target supports the following coprocessor instructions: @code{CDP}, |
| @code{LDC}, @code{STC}, @code{MCR} and @code{MRC}. |
| |
| @item arm_coproc2_ok |
| @anchor{arm_coproc2_ok} |
| ARM target supports all the coprocessor instructions also listed as supported |
| in @ref{arm_coproc1_ok} in addition to the following: @code{CDP2}, @code{LDC2}, |
| @code{LDC2l}, @code{STC2}, @code{STC2l}, @code{MCR2} and @code{MRC2}. |
| |
| @item arm_coproc3_ok |
| @anchor{arm_coproc3_ok} |
| ARM target supports all the coprocessor instructions also listed as supported |
| in @ref{arm_coproc2_ok} in addition the following: @code{MCRR} and @code{MRRC}. |
| |
| @item arm_coproc4_ok |
| ARM target supports all the coprocessor instructions also listed as supported |
| in @ref{arm_coproc3_ok} in addition the following: @code{MCRR2} and @code{MRRC2}. |
| |
| @item arm_simd32_ok |
| @anchor{arm_simd32_ok} |
| ARM Target supports options suitable for accessing the SIMD32 intrinsics from |
| @code{arm_acle.h}. |
| Some multilibs may be incompatible with these options. |
| |
| @item arm_sat_ok |
| @anchor{arm_sat_ok} |
| ARM Target supports options suitable for accessing the saturation |
| intrinsics from @code{arm_acle.h}. |
| Some multilibs may be incompatible with these options. |
| |
| @item arm_dsp_ok |
| @anchor{arm_dsp_ok} |
| ARM Target supports options suitable for accessing the DSP intrinsics |
| from @code{arm_acle.h}. |
| Some multilibs may be incompatible with these options. |
| |
| @item arm_softfp_ok |
| @anchor{arm_softfp_ok} |
| ARM target supports the @code{-mfloat-abi=softfp} option. |
| |
| @item arm_hard_ok |
| @anchor{arm_hard_ok} |
| ARM target supports the @code{-mfloat-abi=hard} option. |
| |
| @item arm_v8_1_lob_ok |
| @anchor{arm_v8_1_lob_ok} |
| ARM Target supports executing the Armv8.1-M Mainline Low Overhead Loop |
| instructions @code{DLS} and @code{LE}. |
| Some multilibs may be incompatible with these options. |
| |
| @item arm_thumb2_no_arm_v8_1_lob |
| ARM target where Thumb-2 is used without options but does not support |
| executing the Armv8.1-M Mainline Low Overhead Loop instructions |
| @code{DLS} and @code{LE}. |
| |
| @item arm_thumb2_ok_no_arm_v8_1_lob |
| ARM target generates Thumb-2 code for @code{-mthumb} but does not |
| support executing the Armv8.1-M Mainline Low Overhead Loop |
| instructions @code{DLS} and @code{LE}. |
| |
| @end table |
| |
| @subsubsection AArch64-specific attributes |
| |
| @table @code |
| @item aarch64_asm_<ext>_ok |
| AArch64 assembler supports the architecture extension @code{ext} via the |
| @code{.arch_extension} pseudo-op. |
| @item aarch64_tiny |
| AArch64 target which generates instruction sequences for tiny memory model. |
| @item aarch64_small |
| AArch64 target which generates instruction sequences for small memory model. |
| @item aarch64_large |
| AArch64 target which generates instruction sequences for large memory model. |
| @item aarch64_little_endian |
| AArch64 target which generates instruction sequences for little endian. |
| @item aarch64_big_endian |
| AArch64 target which generates instruction sequences for big endian. |
| @item aarch64_small_fpic |
| Binutils installed on test system supports relocation types required by -fpic |
| for AArch64 small memory model. |
| @item aarch64_sve_hw |
| AArch64 target that is able to generate and execute SVE code (regardless of |
| whether it does so by default). |
| @item aarch64_sve128_hw |
| @itemx aarch64_sve256_hw |
| @itemx aarch64_sve512_hw |
| @itemx aarch64_sve1024_hw |
| @itemx aarch64_sve2048_hw |
| Like @code{aarch64_sve_hw}, but also test for an exact hardware vector length. |
| |
| @item aarch64_fjcvtzs_hw |
| AArch64 target that is able to generate and execute armv8.3-a FJCVTZS |
| instruction. |
| @end table |
| |
| @subsubsection MIPS-specific attributes |
| |
| @table @code |
| @item mips64 |
| MIPS target supports 64-bit instructions. |
| |
| @item nomips16 |
| MIPS target does not produce MIPS16 code. |
| |
| @item mips16_attribute |
| MIPS target can generate MIPS16 code. |
| |
| @item mips_loongson |
| MIPS target is a Loongson-2E or -2F target using an ABI that supports |
| the Loongson vector modes. |
| |
| @item mips_msa |
| MIPS target supports @code{-mmsa}, MIPS SIMD Architecture (MSA). |
| |
| @item mips_newabi_large_long_double |
| MIPS target supports @code{long double} larger than @code{double} |
| when using the new ABI. |
| |
| @item mpaired_single |
| MIPS target supports @code{-mpaired-single}. |
| @end table |
| |
| @subsubsection MSP430-specific attributes |
| |
| @table @code |
| @item msp430_small |
| MSP430 target has the small memory model enabled (@code{-msmall}). |
| |
| @item msp430_large |
| MSP430 target has the large memory model enabled (@code{-mlarge}). |
| @end table |
| |
| @subsubsection PowerPC-specific attributes |
| |
| @table @code |
| |
| @item dfp_hw |
| PowerPC target supports executing hardware DFP instructions. |
| |
| @item p8vector_hw |
| PowerPC target supports executing VSX instructions (ISA 2.07). |
| |
| @item powerpc64 |
| Test system supports executing 64-bit instructions. |
| |
| @item powerpc_altivec |
| PowerPC target supports AltiVec. |
| |
| @item powerpc_altivec_ok |
| PowerPC target supports @code{-maltivec}. |
| |
| @item powerpc_eabi_ok |
| PowerPC target supports @code{-meabi}. |
| |
| @item powerpc_elfv2 |
| PowerPC target supports @code{-mabi=elfv2}. |
| |
| @item powerpc_fprs |
| PowerPC target supports floating-point registers. |
| |
| @item powerpc_hard_double |
| PowerPC target supports hardware double-precision floating-point. |
| |
| @item powerpc_htm_ok |
| PowerPC target supports @code{-mhtm} |
| |
| @item powerpc_p8vector_ok |
| PowerPC target supports @code{-mpower8-vector} |
| |
| @item powerpc_popcntb_ok |
| PowerPC target supports the @code{popcntb} instruction, indicating |
| that this target supports @code{-mcpu=power5}. |
| |
| @item powerpc_ppu_ok |
| PowerPC target supports @code{-mcpu=cell}. |
| |
| @item powerpc_spe |
| PowerPC target supports PowerPC SPE. |
| |
| @item powerpc_spe_nocache |
| Including the options used to compile this particular test, the |
| PowerPC target supports PowerPC SPE. |
| |
| @item powerpc_spu |
| PowerPC target supports PowerPC SPU. |
| |
| @item powerpc_vsx_ok |
| PowerPC target supports @code{-mvsx}. |
| |
| @item powerpc_405_nocache |
| Including the options used to compile this particular test, the |
| PowerPC target supports PowerPC 405. |
| |
| @item ppc_recip_hw |
| PowerPC target supports executing reciprocal estimate instructions. |
| |
| @item vmx_hw |
| PowerPC target supports executing AltiVec instructions. |
| |
| @item vsx_hw |
| PowerPC target supports executing VSX instructions (ISA 2.06). |
| |
| @item has_arch_pwr5 |
| PowerPC target pre-defines macro _ARCH_PWR5 which means the @code{-mcpu} |
| setting is Power5 or later. |
| |
| @item has_arch_pwr6 |
| PowerPC target pre-defines macro _ARCH_PWR6 which means the @code{-mcpu} |
| setting is Power6 or later. |
| |
| @item has_arch_pwr7 |
| PowerPC target pre-defines macro _ARCH_PWR7 which means the @code{-mcpu} |
| setting is Power7 or later. |
| |
| @item has_arch_pwr8 |
| PowerPC target pre-defines macro _ARCH_PWR8 which means the @code{-mcpu} |
| setting is Power8 or later. |
| |
| @item has_arch_pwr9 |
| PowerPC target pre-defines macro _ARCH_PWR9 which means the @code{-mcpu} |
| setting is Power9 or later. |
| @end table |
| |
| @subsubsection Other hardware attributes |
| |
| @c Please keep this table sorted alphabetically. |
| @table @code |
| @item autoincdec |
| Target supports autoincrement/decrement addressing. |
| |
| @item avx |
| Target supports compiling @code{avx} instructions. |
| |
| @item avx_runtime |
| Target supports the execution of @code{avx} instructions. |
| |
| @item avx2 |
| Target supports compiling @code{avx2} instructions. |
| |
| @item avx2_runtime |
| Target supports the execution of @code{avx2} instructions. |
| |
| @item avxvnni |
| Target supports the execution of @code{avxvnni} instructions. |
| |
| @item avx512f |
| Target supports compiling @code{avx512f} instructions. |
| |
| @item avx512f_runtime |
| Target supports the execution of @code{avx512f} instructions. |
| |
| @item avx512vp2intersect |
| Target supports the execution of @code{avx512vp2intersect} instructions. |
| |
| @item amx_tile |
| Target supports the execution of @code{amx-tile} instructions. |
| |
| @item amx_int8 |
| Target supports the execution of @code{amx-int8} instructions. |
| |
| @item amx_bf16 |
| Target supports the execution of @code{amx-bf16} instructions. |
| |
| @item cell_hw |
| Test system can execute AltiVec and Cell PPU instructions. |
| |
| @item coldfire_fpu |
| Target uses a ColdFire FPU. |
| |
| @item divmod |
| Target supporting hardware divmod insn or divmod libcall. |
| |
| @item divmod_simode |
| Target supporting hardware divmod insn or divmod libcall for SImode. |
| |
| @item hard_float |
| Target supports FPU instructions. |
| |
| @item non_strict_align |
| Target does not require strict alignment. |
| |
| @item pie_copyreloc |
| The x86-64 target linker supports PIE with copy reloc. |
| |
| @item rdrand |
| Target supports x86 @code{rdrand} instruction. |
| |
| @item sqrt_insn |
| Target has a square root instruction that the compiler can generate. |
| |
| @item sse |
| Target supports compiling @code{sse} instructions. |
| |
| @item sse_runtime |
| Target supports the execution of @code{sse} instructions. |
| |
| @item sse2 |
| Target supports compiling @code{sse2} instructions. |
| |
| @item sse2_runtime |
| Target supports the execution of @code{sse2} instructions. |
| |
| @item sync_char_short |
| Target supports atomic operations on @code{char} and @code{short}. |
| |
| @item sync_int_long |
| Target supports atomic operations on @code{int} and @code{long}. |
| |
| @item ultrasparc_hw |
| Test environment appears to run executables on a simulator that |
| accepts only @code{EM_SPARC} executables and chokes on @code{EM_SPARC32PLUS} |
| or @code{EM_SPARCV9} executables. |
| |
| @item vect_cmdline_needed |
| Target requires a command line argument to enable a SIMD instruction set. |
| |
| @item xorsign |
| Target supports the xorsign optab expansion. |
| |
| @end table |
| |
| @subsubsection Environment attributes |
| |
| @table @code |
| @item c |
| The language for the compiler under test is C. |
| |
| @item c++ |
| The language for the compiler under test is C++. |
| |
| @item c99_runtime |
| Target provides a full C99 runtime. |
| |
| @item correct_iso_cpp_string_wchar_protos |
| Target @code{string.h} and @code{wchar.h} headers provide C++ required |
| overloads for @code{strchr} etc. functions. |
| |
| @item d_runtime |
| Target provides the D runtime. |
| |
| @item d_runtime_has_std_library |
| Target provides the D standard library (Phobos). |
| |
| @item dummy_wcsftime |
| Target uses a dummy @code{wcsftime} function that always returns zero. |
| |
| @item fd_truncate |
| Target can truncate a file from a file descriptor, as used by |
| @file{libgfortran/io/unix.c:fd_truncate}; i.e.@: @code{ftruncate} or |
| @code{chsize}. |
| |
| @item fenv |
| Target provides @file{fenv.h} include file. |
| |
| @item fenv_exceptions |
| Target supports @file{fenv.h} with all the standard IEEE exceptions |
| and floating-point exceptions are raised by arithmetic operations. |
| |
| @item fenv_exceptions_dfp |
| Target supports @file{fenv.h} with all the standard IEEE exceptions |
| and floating-point exceptions are raised by arithmetic operations for |
| decimal floating point. |
| |
| @item fileio |
| Target offers such file I/O library functions as @code{fopen}, |
| @code{fclose}, @code{tmpnam}, and @code{remove}. This is a link-time |
| requirement for the presence of the functions in the library; even if |
| they fail at runtime, the requirement is still regarded as satisfied. |
| |
| @item freestanding |
| Target is @samp{freestanding} as defined in section 4 of the C99 standard. |
| Effectively, it is a target which supports no extra headers or libraries |
| other than what is considered essential. |
| |
| @item gettimeofday |
| Target supports @code{gettimeofday}. |
| |
| @item init_priority |
| Target supports constructors with initialization priority arguments. |
| |
| @item inttypes_types |
| Target has the basic signed and unsigned types in @code{inttypes.h}. |
| This is for tests that GCC's notions of these types agree with those |
| in the header, as some systems have only @code{inttypes.h}. |
| |
| @item lax_strtofp |
| Target might have errors of a few ULP in string to floating-point |
| conversion functions and overflow is not always detected correctly by |
| those functions. |
| |
| @item mempcpy |
| Target provides @code{mempcpy} function. |
| |
| @item mmap |
| Target supports @code{mmap}. |
| |
| @item newlib |
| Target supports Newlib. |
| |
| @item newlib_nano_io |
| GCC was configured with @code{--enable-newlib-nano-formatted-io}, which reduces |
| the code size of Newlib formatted I/O functions. |
| |
| @item pow10 |
| Target provides @code{pow10} function. |
| |
| @item pthread |
| Target can compile using @code{pthread.h} with no errors or warnings. |
| |
| @item pthread_h |
| Target has @code{pthread.h}. |
| |
| @item run_expensive_tests |
| Expensive testcases (usually those that consume excessive amounts of CPU |
| time) should be run on this target. This can be enabled by setting the |
| @env{GCC_TEST_RUN_EXPENSIVE} environment variable to a non-empty string. |
| |
| @item simulator |
| Test system runs executables on a simulator (i.e.@: slowly) rather than |
| hardware (i.e.@: fast). |
| |
| @item signal |
| Target has @code{signal.h}. |
| |
| @item stabs |
| Target supports the stabs debugging format. |
| |
| @item stdint_types |
| Target has the basic signed and unsigned C types in @code{stdint.h}. |
| This will be obsolete when GCC ensures a working @code{stdint.h} for |
| all targets. |
| |
| @item stdint_types_mbig_endian |
| Target accepts the option @option{-mbig-endian} and @code{stdint.h} |
| can be included without error when @option{-mbig-endian} is passed. |
| |
| @item stpcpy |
| Target provides @code{stpcpy} function. |
| |
| @item sysconf |
| Target supports @code{sysconf}. |
| |
| @item trampolines |
| Target supports trampolines. |
| |
| @item uclibc |
| Target supports uClibc. |
| |
| @item unwrapped |
| Target does not use a status wrapper. |
| |
| @item vxworks_kernel |
| Target is a VxWorks kernel. |
| |
| @item vxworks_rtp |
| Target is a VxWorks RTP. |
| |
| @item wchar |
| Target supports wide characters. |
| @end table |
| |
| @subsubsection Other attributes |
| |
| @table @code |
| @item R_flag_in_section |
| Target supports the 'R' flag in .section directive in assembly inputs. |
| |
| @item automatic_stack_alignment |
| Target supports automatic stack alignment. |
| |
| @item branch_cost |
| Target supports @option{-branch-cost=N}. |
| |
| @item cxa_atexit |
| Target uses @code{__cxa_atexit}. |
| |
| @item default_packed |
| Target has packed layout of structure members by default. |
| |
| @item exceptions |
| Target supports exceptions. |
| |
| @item exceptions_enabled |
| Target supports exceptions and they are enabled in the current |
| testing configuration. |
| |
| @item fgraphite |
| Target supports Graphite optimizations. |
| |
| @item fixed_point |
| Target supports fixed-point extension to C. |
| |
| @item fopenacc |
| Target supports OpenACC via @option{-fopenacc}. |
| |
| @item fopenmp |
| Target supports OpenMP via @option{-fopenmp}. |
| |
| @item fpic |
| Target supports @option{-fpic} and @option{-fPIC}. |
| |
| @item freorder |
| Target supports @option{-freorder-blocks-and-partition}. |
| |
| @item fstack_protector |
| Target supports @option{-fstack-protector}. |
| |
| @item gas |
| Target uses GNU @command{as}. |
| |
| @item gc_sections |
| Target supports @option{--gc-sections}. |
| |
| @item gld |
| Target uses GNU @command{ld}. |
| |
| @item keeps_null_pointer_checks |
| Target keeps null pointer checks, either due to the use of |
| @option{-fno-delete-null-pointer-checks} or hardwired into the target. |
| |
| @item llvm_binutils |
| Target is using an LLVM assembler and/or linker, instead of GNU Binutils. |
| |
| @item lra |
| Target supports local register allocator (LRA). |
| |
| @item lto |
| Compiler has been configured to support link-time optimization (LTO). |
| |
| @item lto_incremental |
| Compiler and linker support link-time optimization relocatable linking |
| with @option{-r} and @option{-flto} options. |
| |
| @item naked_functions |
| Target supports the @code{naked} function attribute. |
| |
| @item named_sections |
| Target supports named sections. |
| |
| @item natural_alignment_32 |
| Target uses natural alignment (aligned to type size) for types of |
| 32 bits or less. |
| |
| @item target_natural_alignment_64 |
| Target uses natural alignment (aligned to type size) for types of |
| 64 bits or less. |
| |
| @item noinit |
| Target supports the @code{noinit} variable attribute. |
| |
| @item nonpic |
| Target does not generate PIC by default. |
| |
| @item o_flag_in_section |
| Target supports the 'o' flag in .section directive in assembly inputs. |
| |
| @item offload_gcn |
| Target has been configured for OpenACC/OpenMP offloading on AMD GCN. |
| |
| @item persistent |
| Target supports the @code{persistent} variable attribute. |
| |
| @item pie_enabled |
| Target generates PIE by default. |
| |
| @item pcc_bitfield_type_matters |
| Target defines @code{PCC_BITFIELD_TYPE_MATTERS}. |
| |
| @item pe_aligned_commons |
| Target supports @option{-mpe-aligned-commons}. |
| |
| @item pie |
| Target supports @option{-pie}, @option{-fpie} and @option{-fPIE}. |
| |
| @item rdynamic |
| Target supports @option{-rdynamic}. |
| |
| @item scalar_all_fma |
| Target supports all four fused multiply-add optabs for both @code{float} |
| and @code{double}. These optabs are: @code{fma_optab}, @code{fms_optab}, |
| @code{fnma_optab} and @code{fnms_optab}. |
| |
| @item section_anchors |
| Target supports section anchors. |
| |
| @item short_enums |
| Target defaults to short enums. |
| |
| @item stack_size |
| @anchor{stack_size_et} |
| Target has limited stack size. The stack size limit can be obtained using the |
| STACK_SIZE macro defined by @ref{stack_size_ao,,@code{dg-add-options} feature |
| @code{stack_size}}. |
| |
| @item static |
| Target supports @option{-static}. |
| |
| @item static_libgfortran |
| Target supports statically linking @samp{libgfortran}. |
| |
| @item string_merging |
| Target supports merging string constants at link time. |
| |
| @item ucn |
| Target supports compiling and assembling UCN. |
| |
| @item ucn_nocache |
| Including the options used to compile this particular test, the |
| target supports compiling and assembling UCN. |
| |
| @item unaligned_stack |
| Target does not guarantee that its @code{STACK_BOUNDARY} is greater than |
| or equal to the required vector alignment. |
| |
| @item vector_alignment_reachable |
| Vector alignment is reachable for types of 32 bits or less. |
| |
| @item vector_alignment_reachable_for_64bit |
| Vector alignment is reachable for types of 64 bits or less. |
| |
| @item wchar_t_char16_t_compatible |
| Target supports @code{wchar_t} that is compatible with @code{char16_t}. |
| |
| @item wchar_t_char32_t_compatible |
| Target supports @code{wchar_t} that is compatible with @code{char32_t}. |
| |
| @item comdat_group |
| Target uses comdat groups. |
| |
| @item indirect_calls |
| Target supports indirect calls, i.e. calls where the target is not |
| constant. |
| |
| @item lgccjit |
| Target supports -lgccjit, i.e. libgccjit.so can be linked into jit tests. |
| |
| @item __OPTIMIZE__ |
| Optimizations are enabled (@code{__OPTIMIZE__}) per the current |
| compiler flags. |
| @end table |
| |
| @subsubsection Local to tests in @code{gcc.target/i386} |
| |
| @table @code |
| @item 3dnow |
| Target supports compiling @code{3dnow} instructions. |
| |
| @item aes |
| Target supports compiling @code{aes} instructions. |
| |
| @item fma4 |
| Target supports compiling @code{fma4} instructions. |
| |
| @item mfentry |
| Target supports the @code{-mfentry} option that alters the |
| position of profiling calls such that they precede the prologue. |
| |
| @item ms_hook_prologue |
| Target supports attribute @code{ms_hook_prologue}. |
| |
| @item pclmul |
| Target supports compiling @code{pclmul} instructions. |
| |
| @item sse3 |
| Target supports compiling @code{sse3} instructions. |
| |
| @item sse4 |
| Target supports compiling @code{sse4} instructions. |
| |
| @item sse4a |
| Target supports compiling @code{sse4a} instructions. |
| |
| @item ssse3 |
| Target supports compiling @code{ssse3} instructions. |
| |
| @item vaes |
| Target supports compiling @code{vaes} instructions. |
| |
| @item vpclmul |
| Target supports compiling @code{vpclmul} instructions. |
| |
| @item xop |
| Target supports compiling @code{xop} instructions. |
| @end table |
| |
| @subsubsection Local to tests in @code{gcc.test-framework} |
| |
| @table @code |
| @item no |
| Always returns 0. |
| |
| @item yes |
| Always returns 1. |
| @end table |
| |
| @node Add Options |
| @subsection Features for @code{dg-add-options} |
| |
| The supported values of @var{feature} for directive @code{dg-add-options} |
| are: |
| |
| @table @code |
| @item arm_fp |
| @code{__ARM_FP} definition. Only ARM targets support this feature, and only then |
| in certain modes; see the @ref{arm_fp_ok,,arm_fp_ok effective target |
| keyword}. |
| |
| @item arm_fp_dp |
| @code{__ARM_FP} definition with double-precision support. Only ARM |
| targets support this feature, and only then in certain modes; see the |
| @ref{arm_fp_dp_ok,,arm_fp_dp_ok effective target keyword}. |
| |
| @item arm_neon |
| NEON support. Only ARM targets support this feature, and only then |
| in certain modes; see the @ref{arm_neon_ok,,arm_neon_ok effective target |
| keyword}. |
| |
| @item arm_fp16 |
| VFP half-precision floating point support. This does not select the |
| FP16 format; for that, use @ref{arm_fp16_ieee,,arm_fp16_ieee} or |
| @ref{arm_fp16_alternative,,arm_fp16_alternative} instead. This |
| feature is only supported by ARM targets and then only in certain |
| modes; see the @ref{arm_fp16_ok,,arm_fp16_ok effective target |
| keyword}. |
| |
| @item arm_fp16_ieee |
| @anchor{arm_fp16_ieee} |
| ARM IEEE 754-2008 format VFP half-precision floating point support. |
| This feature is only supported by ARM targets and then only in certain |
| modes; see the @ref{arm_fp16_ok,,arm_fp16_ok effective target |
| keyword}. |
| |
| @item arm_fp16_alternative |
| @anchor{arm_fp16_alternative} |
| ARM Alternative format VFP half-precision floating point support. |
| This feature is only supported by ARM targets and then only in certain |
| modes; see the @ref{arm_fp16_ok,,arm_fp16_ok effective target |
| keyword}. |
| |
| @item arm_neon_fp16 |
| NEON and half-precision floating point support. Only ARM targets |
| support this feature, and only then in certain modes; see |
| the @ref{arm_neon_fp16_ok,,arm_neon_fp16_ok effective target keyword}. |
| |
| @item arm_vfp3 |
| arm vfp3 floating point support; see |
| the @ref{arm_vfp3_ok,,arm_vfp3_ok effective target keyword}. |
| |
| @item arm_arch_v8a_hard |
| Add options for ARMv8-A and the hard-float variant of the AAPCS, |
| if this is supported by the compiler; see the |
| @ref{arm_arch_v8a_hard_ok,,arm_arch_v8a_hard_ok} effective target keyword. |
| |
| @item arm_v8_1a_neon |
| Add options for ARMv8.1-A with Adv.SIMD support, if this is supported |
| by the target; see the @ref{arm_v8_1a_neon_ok,,arm_v8_1a_neon_ok} |
| effective target keyword. |
| |
| @item arm_v8_2a_fp16_scalar |
| Add options for ARMv8.2-A with scalar FP16 support, if this is |
| supported by the target; see the |
| @ref{arm_v8_2a_fp16_scalar_ok,,arm_v8_2a_fp16_scalar_ok} effective |
| target keyword. |
| |
| @item arm_v8_2a_fp16_neon |
| Add options for ARMv8.2-A with Adv.SIMD FP16 support, if this is |
| supported by the target; see the |
| @ref{arm_v8_2a_fp16_neon_ok,,arm_v8_2a_fp16_neon_ok} effective target |
| keyword. |
| |
| @item arm_v8_2a_dotprod_neon |
| Add options for ARMv8.2-A with Adv.SIMD Dot Product support, if this is |
| supported by the target; see the |
| @ref{arm_v8_2a_dotprod_neon_ok} effective target keyword. |
| |
| @item arm_fp16fml_neon |
| Add options to enable generation of the @code{VFMAL} and @code{VFMSL} |
| instructions, if this is supported by the target; see the |
| @ref{arm_fp16fml_neon_ok} effective target keyword. |
| |
| @item arm_dsp |
| Add options for ARM DSP intrinsics support, if this is supported by |
| the target; see the @ref{arm_dsp_ok,,arm_dsp_ok effective target |
| keyword}. |
| |
| @item bind_pic_locally |
| Add the target-specific flags needed to enable functions to bind |
| locally when using pic/PIC passes in the testsuite. |
| |
| @item float@var{n} |
| Add the target-specific flags needed to use the @code{_Float@var{n}} type. |
| |
| @item float@var{n}x |
| Add the target-specific flags needed to use the @code{_Float@var{n}x} type. |
| |
| @item ieee |
| Add the target-specific flags needed to enable full IEEE |
| compliance mode. |
| |
| @item mips16_attribute |
| @code{mips16} function attributes. |
| Only MIPS targets support this feature, and only then in certain modes. |
| |
| @item stack_size |
| @anchor{stack_size_ao} |
| Add the flags needed to define macro STACK_SIZE and set it to the stack size |
| limit associated with the @ref{stack_size_et,,@code{stack_size} effective |
| target}. |
| |
| @item sqrt_insn |
| Add the target-specific flags needed to enable hardware square root |
| instructions, if any. |
| |
| @item tls |
| Add the target-specific flags needed to use thread-local storage. |
| @end table |
| |
| @node Require Support |
| @subsection Variants of @code{dg-require-@var{support}} |
| |
| A few of the @code{dg-require} directives take arguments. |
| |
| @table @code |
| @item dg-require-iconv @var{codeset} |
| Skip the test if the target does not support iconv. @var{codeset} is |
| the codeset to convert to. |
| |
| @item dg-require-profiling @var{profopt} |
| Skip the test if the target does not support profiling with option |
| @var{profopt}. |
| |
| @item dg-require-stack-check @var{check} |
| Skip the test if the target does not support the @code{-fstack-check} |
| option. If @var{check} is @code{""}, support for @code{-fstack-check} |
| is checked, for @code{-fstack-check=("@var{check}")} otherwise. |
| |
| @item dg-require-stack-size @var{size} |
| Skip the test if the target does not support a stack size of @var{size}. |
| |
| @item dg-require-visibility @var{vis} |
| Skip the test if the target does not support the @code{visibility} attribute. |
| If @var{vis} is @code{""}, support for @code{visibility("hidden")} is |
| checked, for @code{visibility("@var{vis}")} otherwise. |
| @end table |
| |
| The original @code{dg-require} directives were defined before there |
| was support for effective-target keywords. The directives that do not |
| take arguments could be replaced with effective-target keywords. |
| |
| @table @code |
| @item dg-require-alias "" |
| Skip the test if the target does not support the @samp{alias} attribute. |
| |
| @item dg-require-ascii-locale "" |
| Skip the test if the host does not support an ASCII locale. |
| |
| @item dg-require-compat-dfp "" |
| Skip this test unless both compilers in a @file{compat} testsuite |
| support decimal floating point. |
| |
| @item dg-require-cxa-atexit "" |
| Skip the test if the target does not support @code{__cxa_atexit}. |
| This is equivalent to @code{dg-require-effective-target cxa_atexit}. |
| |
| @item dg-require-dll "" |
| Skip the test if the target does not support DLL attributes. |
| |
| @item dg-require-dot "" |
| Skip the test if the host does not have @command{dot}. |
| |
| @item dg-require-fork "" |
| Skip the test if the target does not support @code{fork}. |
| |
| @item dg-require-gc-sections "" |
| Skip the test if the target's linker does not support the |
| @code{--gc-sections} flags. |
| This is equivalent to @code{dg-require-effective-target gc-sections}. |
| |
| @item dg-require-host-local "" |
| Skip the test if the host is remote, rather than the same as the build |
| system. Some tests are incompatible with DejaGnu's handling of remote |
| hosts, which involves copying the source file to the host and compiling |
| it with a relative path and "@code{-o a.out}". |
| |
| @item dg-require-mkfifo "" |
| Skip the test if the target does not support @code{mkfifo}. |
| |
| @item dg-require-named-sections "" |
| Skip the test is the target does not support named sections. |
| This is equivalent to @code{dg-require-effective-target named_sections}. |
| |
| @item dg-require-weak "" |
| Skip the test if the target does not support weak symbols. |
| |
| @item dg-require-weak-override "" |
| Skip the test if the target does not support overriding weak symbols. |
| @end table |
| |
| @node Final Actions |
| @subsection Commands for use in @code{dg-final} |
| |
| The GCC testsuite defines the following directives to be used within |
| @code{dg-final}. |
| |
| @subsubsection Scan a particular file |
| |
| @table @code |
| @item scan-file @var{filename} @var{regexp} [@{ target/xfail @var{selector} @}] |
| Passes if @var{regexp} matches text in @var{filename}. |
| @item scan-file-not @var{filename} @var{regexp} [@{ target/xfail @var{selector} @}] |
| Passes if @var{regexp} does not match text in @var{filename}. |
| @item scan-module @var{module} @var{regexp} [@{ target/xfail @var{selector} @}] |
| Passes if @var{regexp} matches in Fortran module @var{module}. |
| @item dg-check-dot @var{filename} |
| Passes if @var{filename} is a valid @file{.dot} file (by running |
| @code{dot -Tpng} on it, and verifying the exit code is 0). |
| @end table |
| |
| @subsubsection Scan the assembly output |
| |
| @table @code |
| @item scan-assembler @var{regex} [@{ target/xfail @var{selector} @}] |
| Passes if @var{regex} matches text in the test's assembler output. |
| |
| @item scan-assembler-not @var{regex} [@{ target/xfail @var{selector} @}] |
| Passes if @var{regex} does not match text in the test's assembler output. |
| |
| @item scan-assembler-times @var{regex} @var{num} [@{ target/xfail @var{selector} @}] |
| Passes if @var{regex} is matched exactly @var{num} times in the test's |
| assembler output. |
| |
| @item scan-assembler-dem @var{regex} [@{ target/xfail @var{selector} @}] |
| Passes if @var{regex} matches text in the test's demangled assembler output. |
| |
| @item scan-assembler-dem-not @var{regex} [@{ target/xfail @var{selector} @}] |
| Passes if @var{regex} does not match text in the test's demangled assembler |
| output. |
| |
| @item scan-assembler-symbol-section @var{functions} @var{section} [@{ target/xfail @var{selector} @}] |
| Passes if @var{functions} are all in @var{section}. The caller needs to |
| allow for @code{USER_LABEL_PREFIX} and different section name conventions. |
| |
| @item scan-symbol-section @var{filename} @var{functions} @var{section} [@{ target/xfail @var{selector} @}] |
| Passes if @var{functions} are all in @var{section}in @var{filename}. |
| The same caveats as for @code{scan-assembler-symbol-section} apply. |
| |
| @item scan-hidden @var{symbol} [@{ target/xfail @var{selector} @}] |
| Passes if @var{symbol} is defined as a hidden symbol in the test's |
| assembly output. |
| |
| @item scan-not-hidden @var{symbol} [@{ target/xfail @var{selector} @}] |
| Passes if @var{symbol} is not defined as a hidden symbol in the test's |
| assembly output. |
| |
| @item check-function-bodies @var{prefix} @var{terminator} [@var{options} [@{ target/xfail @var{selector} @}]] |
| Looks through the source file for comments that give the expected assembly |
| output for selected functions. Each line of expected output starts with the |
| prefix string @var{prefix} and the expected output for a function as a whole |
| is followed by a line that starts with the string @var{terminator}. |
| Specifying an empty terminator is equivalent to specifying @samp{"*/"}. |
| |
| @var{options}, if specified, is a list of regular expressions, each of |
| which matches a full command-line option. A non-empty list prevents |
| the test from running unless all of the given options are present on the |
| command line. This can help if a source file is compiled both with |
| and without optimization, since it is rarely useful to check the full |
| function body for unoptimized code. |
| |
| The first line of the expected output for a function @var{fn} has the form: |
| |
| @smallexample |
| @var{prefix} @var{fn}: [@{ target/xfail @var{selector} @}] |
| @end smallexample |
| |
| Subsequent lines of the expected output also start with @var{prefix}. |
| In both cases, whitespace after @var{prefix} is not significant. |
| |
| The test discards assembly directives such as @code{.cfi_startproc} |
| and local label definitions such as @code{.LFB0} from the compiler's |
| assembly output. It then matches the result against the expected |
| output for a function as a single regular expression. This means that |
| later lines can use backslashes to refer back to @samp{(@dots{})} |
| captures on earlier lines. For example: |
| |
| @smallexample |
| /* @{ dg-final @{ check-function-bodies "**" "" "-DCHECK_ASM" @} @} */ |
| @dots{} |
| /* |
| ** add_w0_s8_m: |
| ** mov (z[0-9]+\.b), w0 |
| ** add z0\.b, p0/m, z0\.b, \1 |
| ** ret |
| */ |
| svint8_t add_w0_s8_m (@dots{}) @{ @dots{} @} |
| @dots{} |
| /* |
| ** add_b0_s8_m: |
| ** mov (z[0-9]+\.b), b0 |
| ** add z1\.b, p0/m, z1\.b, \1 |
| ** ret |
| */ |
| svint8_t add_b0_s8_m (@dots{}) @{ @dots{} @} |
| @end smallexample |
| |
| checks whether the implementations of @code{add_w0_s8_m} and |
| @code{add_b0_s8_m} match the regular expressions given. The test only |
| runs when @samp{-DCHECK_ASM} is passed on the command line. |
| |
| It is possible to create non-capturing multi-line regular expression |
| groups of the form @samp{(@var{a}|@var{b}|@dots{})} by putting the |
| @samp{(}, @samp{|} and @samp{)} on separate lines (each still using |
| @var{prefix}). For example: |
| |
| @smallexample |
| /* |
| ** cmple_f16_tied: |
| ** ( |
| ** fcmge p0\.h, p0/z, z1\.h, z0\.h |
| ** | |
| ** fcmle p0\.h, p0/z, z0\.h, z1\.h |
| ** ) |
| ** ret |
| */ |
| svbool_t cmple_f16_tied (@dots{}) @{ @dots{} @} |
| @end smallexample |
| |
| checks whether @code{cmple_f16_tied} is implemented by the |
| @code{fcmge} instruction followed by @code{ret} or by the |
| @code{fcmle} instruction followed by @code{ret}. The test is |
| still a single regular rexpression. |
| |
| A line containing just: |
| |
| @smallexample |
| @var{prefix} ... |
| @end smallexample |
| |
| stands for zero or more unmatched lines; the whitespace after |
| @var{prefix} is again not significant. |
| |
| @end table |
| |
| @subsubsection Scan optimization dump files |
| |
| These commands are available for @var{kind} of @code{tree}, @code{ltrans-tree}, |
| @code{offload-tree}, @code{rtl}, @code{offload-rtl}, @code{ipa}, and |
| @code{wpa-ipa}. |
| |
| @table @code |
| @item scan-@var{kind}-dump @var{regex} @var{suffix} [@{ target/xfail @var{selector} @}] |
| Passes if @var{regex} matches text in the dump file with suffix @var{suffix}. |
| |
| @item scan-@var{kind}-dump-not @var{regex} @var{suffix} [@{ target/xfail @var{selector} @}] |
| Passes if @var{regex} does not match text in the dump file with suffix |
| @var{suffix}. |
| |
| @item scan-@var{kind}-dump-times @var{regex} @var{num} @var{suffix} [@{ target/xfail @var{selector} @}] |
| Passes if @var{regex} is found exactly @var{num} times in the dump file |
| with suffix @var{suffix}. |
| |
| @item scan-@var{kind}-dump-dem @var{regex} @var{suffix} [@{ target/xfail @var{selector} @}] |
| Passes if @var{regex} matches demangled text in the dump file with |
| suffix @var{suffix}. |
| |
| @item scan-@var{kind}-dump-dem-not @var{regex} @var{suffix} [@{ target/xfail @var{selector} @}] |
| Passes if @var{regex} does not match demangled text in the dump file with |
| suffix @var{suffix}. |
| @end table |
| |
| The @var{suffix} argument which describes the dump file to be scanned |
| may contain a glob pattern that must expand to exactly one file |
| name. This is useful if, e.g., different pass instances are executed |
| depending on torture testing command-line flags, producing dump files |
| whose names differ only in their pass instance number suffix. For |
| example, to scan instances 1, 2, 3 of a tree pass ``mypass'' for |
| occurrences of the string ``code has been optimized'', use: |
| @smallexample |
| /* @{ dg-options "-fdump-tree-mypass" @} */ |
| /* @{ dg-final @{ scan-tree-dump "code has been optimized" "mypass\[1-3\]" @} @} */ |
| @end smallexample |
| |
| |
| @subsubsection Check for output files |
| |
| @table @code |
| @item output-exists [@{ target/xfail @var{selector} @}] |
| Passes if compiler output file exists. |
| |
| @item output-exists-not [@{ target/xfail @var{selector} @}] |
| Passes if compiler output file does not exist. |
| |
| @item scan-symbol @var{regexp} [@{ target/xfail @var{selector} @}] |
| Passes if the pattern is present in the final executable. |
| |
| @item scan-symbol-not @var{regexp} [@{ target/xfail @var{selector} @}] |
| Passes if the pattern is absent from the final executable. |
| @end table |
| |
| @subsubsection Checks for @command{gcov} tests |
| |
| @table @code |
| @item run-gcov @var{sourcefile} |
| Check line counts in @command{gcov} tests. |
| |
| @item run-gcov [branches] [calls] @{ @var{opts} @var{sourcefile} @} |
| Check branch and/or call counts, in addition to line counts, in |
| @command{gcov} tests. |
| |
| @item run-gcov-pytest @{ @var{sourcefile} @var{pytest_file} @} |
| Check output of @command{gcov} intermediate format with a pytest |
| script. |
| @end table |
| |
| @subsubsection Clean up generated test files |
| |
| Usually the test-framework removes files that were generated during |
| testing. If a testcase, for example, uses any dumping mechanism to |
| inspect a passes dump file, the testsuite recognized the dump option |
| passed to the tool and schedules a final cleanup to remove these files. |
| |
| There are, however, following additional cleanup directives that can be |
| used to annotate a testcase "manually". |
| @table @code |
| @item cleanup-coverage-files |
| Removes coverage data files generated for this test. |
| |
| @item cleanup-modules "@var{list-of-extra-modules}" |
| Removes Fortran module files generated for this test, excluding the |
| module names listed in keep-modules. |
| Cleaning up module files is usually done automatically by the testsuite |
| by looking at the source files and removing the modules after the test |
| has been executed. |
| @smallexample |
| module MoD1 |
| end module MoD1 |
| module Mod2 |
| end module Mod2 |
| module moD3 |
| end module moD3 |
| module mod4 |
| end module mod4 |
| ! @{ dg-final @{ cleanup-modules "mod1 mod2" @} @} ! redundant |
| ! @{ dg-final @{ keep-modules "mod3 mod4" @} @} |
| @end smallexample |
| |
| @item keep-modules "@var{list-of-modules-not-to-delete}" |
| Whitespace separated list of module names that should not be deleted by |
| cleanup-modules. |
| If the list of modules is empty, all modules defined in this file are kept. |
| @smallexample |
| module maybe_unneeded |
| end module maybe_unneeded |
| module keep1 |
| end module keep1 |
| module keep2 |
| end module keep2 |
| ! @{ dg-final @{ keep-modules "keep1 keep2" @} @} ! just keep these two |
| ! @{ dg-final @{ keep-modules "" @} @} ! keep all |
| @end smallexample |
| |
| @item dg-keep-saved-temps "@var{list-of-suffixes-not-to-delete}" |
| Whitespace separated list of suffixes that should not be deleted |
| automatically in a testcase that uses @option{-save-temps}. |
| @smallexample |
| // @{ dg-options "-save-temps -fpch-preprocess -I." @} |
| int main() @{ return 0; @} |
| // @{ dg-keep-saved-temps ".s" @} ! just keep assembler file |
| // @{ dg-keep-saved-temps ".s" ".i" @} ! ... and .i |
| // @{ dg-keep-saved-temps ".ii" ".o" @} ! or just .ii and .o |
| @end smallexample |
| |
| @item cleanup-profile-file |
| Removes profiling files generated for this test. |
| |
| @end table |
| |
| @node Ada Tests |
| @section Ada Language Testsuites |
| |
| The Ada testsuite includes executable tests from the ACATS |
| testsuite, publicly available at |
| @uref{http://www.ada-auth.org/acats.html}. |
| |
| These tests are integrated in the GCC testsuite in the |
| @file{ada/acats} directory, and |
| enabled automatically when running @code{make check}, assuming |
| the Ada language has been enabled when configuring GCC@. |
| |
| You can also run the Ada testsuite independently, using |
| @code{make check-ada}, or run a subset of the tests by specifying which |
| chapter to run, e.g.: |
| |
| @smallexample |
| $ make check-ada CHAPTERS="c3 c9" |
| @end smallexample |
| |
| The tests are organized by directory, each directory corresponding to |
| a chapter of the Ada Reference Manual. So for example, @file{c9} corresponds |
| to chapter 9, which deals with tasking features of the language. |
| |
| The tests are run using two @command{sh} scripts: @file{run_acats} and |
| @file{run_all.sh}. To run the tests using a simulator or a cross |
| target, see the small |
| customization section at the top of @file{run_all.sh}. |
| |
| These tests are run using the build tree: they can be run without doing |
| a @code{make install}. |
| |
| @node C Tests |
| @section C Language Testsuites |
| |
| GCC contains the following C language testsuites, in the |
| @file{gcc/testsuite} directory: |
| |
| @table @file |
| @item gcc.dg |
| This contains tests of particular features of the C compiler, using the |
| more modern @samp{dg} harness. Correctness tests for various compiler |
| features should go here if possible. |
| |
| Magic comments determine whether the file |
| is preprocessed, compiled, linked or run. In these tests, error and warning |
| message texts are compared against expected texts or regular expressions |
| given in comments. These tests are run with the options @samp{-ansi -pedantic} |
| unless other options are given in the test. Except as noted below they |
| are not run with multiple optimization options. |
| @item gcc.dg/compat |
| This subdirectory contains tests for binary compatibility using |
| @file{lib/compat.exp}, which in turn uses the language-independent support |
| (@pxref{compat Testing, , Support for testing binary compatibility}). |
| @item gcc.dg/cpp |
| This subdirectory contains tests of the preprocessor. |
| @item gcc.dg/debug |
| This subdirectory contains tests for debug formats. Tests in this |
| subdirectory are run for each debug format that the compiler supports. |
| @item gcc.dg/format |
| This subdirectory contains tests of the @option{-Wformat} format |
| checking. Tests in this directory are run with and without |
| @option{-DWIDE}. |
| @item gcc.dg/noncompile |
| This subdirectory contains tests of code that should not compile and |
| does not need any special compilation options. They are run with |
| multiple optimization options, since sometimes invalid code crashes |
| the compiler with optimization. |
| @item gcc.dg/special |
| FIXME: describe this. |
| |
| @item gcc.c-torture |
| This contains particular code fragments which have historically broken easily. |
| These tests are run with multiple optimization options, so tests for features |
| which only break at some optimization levels belong here. This also contains |
| tests to check that certain optimizations occur. It might be worthwhile to |
| separate the correctness tests cleanly from the code quality tests, but |
| it hasn't been done yet. |
| |
| @item gcc.c-torture/compat |
| FIXME: describe this. |
| |
| This directory should probably not be used for new tests. |
| @item gcc.c-torture/compile |
| This testsuite contains test cases that should compile, but do not |
| need to link or run. These test cases are compiled with several |
| different combinations of optimization options. All warnings are |
| disabled for these test cases, so this directory is not suitable if |
| you wish to test for the presence or absence of compiler warnings. |
| While special options can be set, and tests disabled on specific |
| platforms, by the use of @file{.x} files, mostly these test cases |
| should not contain platform dependencies. FIXME: discuss how defines |
| such as @code{STACK_SIZE} are used. |
| @item gcc.c-torture/execute |
| This testsuite contains test cases that should compile, link and run; |
| otherwise the same comments as for @file{gcc.c-torture/compile} apply. |
| @item gcc.c-torture/execute/ieee |
| This contains tests which are specific to IEEE floating point. |
| @item gcc.c-torture/unsorted |
| FIXME: describe this. |
| |
| This directory should probably not be used for new tests. |
| @item gcc.misc-tests |
| This directory contains C tests that require special handling. Some |
| of these tests have individual expect files, and others share |
| special-purpose expect files: |
| |
| @table @file |
| @item @code{bprob*.c} |
| Test @option{-fbranch-probabilities} using |
| @file{gcc.misc-tests/bprob.exp}, which |
| in turn uses the generic, language-independent framework |
| (@pxref{profopt Testing, , Support for testing profile-directed |
| optimizations}). |
| |
| @item @code{gcov*.c} |
| Test @command{gcov} output using @file{gcov.exp}, which in turn uses the |
| language-independent support (@pxref{gcov Testing, , Support for testing gcov}). |
| |
| @item @code{i386-pf-*.c} |
| Test i386-specific support for data prefetch using @file{i386-prefetch.exp}. |
| @end table |
| |
| @item gcc.test-framework |
| @table @file |
| @item @code{dg-*.c} |
| Test the testsuite itself using @file{gcc.test-framework/test-framework.exp}. |
| @end table |
| |
| @end table |
| |
| FIXME: merge in @file{testsuite/README.gcc} and discuss the format of |
| test cases and magic comments more. |
| |
| @node LTO Testing |
| @section Support for testing link-time optimizations |
| |
| Tests for link-time optimizations usually require multiple source files |
| that are compiled separately, perhaps with different sets of options. |
| There are several special-purpose test directives used for these tests. |
| |
| @table @code |
| @item @{ dg-lto-do @var{do-what-keyword} @} |
| @var{do-what-keyword} specifies how the test is compiled and whether |
| it is executed. It is one of: |
| |
| @table @code |
| @item assemble |
| Compile with @option{-c} to produce a relocatable object file. |
| @item link |
| Compile, assemble, and link to produce an executable file. |
| @item run |
| Produce and run an executable file, which is expected to return |
| an exit code of 0. |
| @end table |
| |
| The default is @code{assemble}. That can be overridden for a set of |
| tests by redefining @code{dg-do-what-default} within the @code{.exp} |
| file for those tests. |
| |
| Unlike @code{dg-do}, @code{dg-lto-do} does not support an optional |
| @samp{target} or @samp{xfail} list. Use @code{dg-skip-if}, |
| @code{dg-xfail-if}, or @code{dg-xfail-run-if}. |
| |
| @item @{ dg-lto-options @{ @{ @var{options} @} [@{ @var{options} @}] @} [@{ target @var{selector} @}]@} |
| This directive provides a list of one or more sets of compiler options |
| to override @var{LTO_OPTIONS}. Each test will be compiled and run with |
| each of these sets of options. |
| |
| @item @{ dg-extra-ld-options @var{options} [@{ target @var{selector} @}]@} |
| This directive adds @var{options} to the linker options used. |
| |
| @item @{ dg-suppress-ld-options @var{options} [@{ target @var{selector} @}]@} |
| This directive removes @var{options} from the set of linker options used. |
| @end table |
| |
| @node gcov Testing |
| @section Support for testing @command{gcov} |
| |
| Language-independent support for testing @command{gcov}, and for checking |
| that branch profiling produces expected values, is provided by the |
| expect file @file{lib/gcov.exp}. @command{gcov} tests also rely on procedures |
| in @file{lib/gcc-dg.exp} to compile and run the test program. A typical |
| @command{gcov} test contains the following DejaGnu commands within comments: |
| |
| @smallexample |
| @{ dg-options "--coverage" @} |
| @{ dg-do run @{ target native @} @} |
| @{ dg-final @{ run-gcov sourcefile @} @} |
| @end smallexample |
| |
| Checks of @command{gcov} output can include line counts, branch percentages, |
| and call return percentages. All of these checks are requested via |
| commands that appear in comments in the test's source file. |
| Commands to check line counts are processed by default. |
| Commands to check branch percentages and call return percentages are |
| processed if the @command{run-gcov} command has arguments @code{branches} |
| or @code{calls}, respectively. For example, the following specifies |
| checking both, as well as passing @option{-b} to @command{gcov}: |
| |
| @smallexample |
| @{ dg-final @{ run-gcov branches calls @{ -b sourcefile @} @} @} |
| @end smallexample |
| |
| A line count command appears within a comment on the source line |
| that is expected to get the specified count and has the form |
| @code{count(@var{cnt})}. A test should only check line counts for |
| lines that will get the same count for any architecture. |
| |
| Commands to check branch percentages (@code{branch}) and call |
| return percentages (@code{returns}) are very similar to each other. |
| A beginning command appears on or before the first of a range of |
| lines that will report the percentage, and the ending command |
| follows that range of lines. The beginning command can include a |
| list of percentages, all of which are expected to be found within |
| the range. A range is terminated by the next command of the same |
| kind. A command @code{branch(end)} or @code{returns(end)} marks |
| the end of a range without starting a new one. For example: |
| |
| @smallexample |
| if (i > 10 && j > i && j < 20) /* @r{branch(27 50 75)} */ |
| /* @r{branch(end)} */ |
| foo (i, j); |
| @end smallexample |
| |
| For a call return percentage, the value specified is the |
| percentage of calls reported to return. For a branch percentage, |
| the value is either the expected percentage or 100 minus that |
| value, since the direction of a branch can differ depending on the |
| target or the optimization level. |
| |
| Not all branches and calls need to be checked. A test should not |
| check for branches that might be optimized away or replaced with |
| predicated instructions. Don't check for calls inserted by the |
| compiler or ones that might be inlined or optimized away. |
| |
| A single test can check for combinations of line counts, branch |
| percentages, and call return percentages. The command to check a |
| line count must appear on the line that will report that count, but |
| commands to check branch percentages and call return percentages can |
| bracket the lines that report them. |
| |
| @node profopt Testing |
| @section Support for testing profile-directed optimizations |
| |
| The file @file{profopt.exp} provides language-independent support for |
| checking correct execution of a test built with profile-directed |
| optimization. This testing requires that a test program be built and |
| executed twice. The first time it is compiled to generate profile |
| data, and the second time it is compiled to use the data that was |
| generated during the first execution. The second execution is to |
| verify that the test produces the expected results. |
| |
| To check that the optimization actually generated better code, a |
| test can be built and run a third time with normal optimizations to |
| verify that the performance is better with the profile-directed |
| optimizations. @file{profopt.exp} has the beginnings of this kind |
| of support. |
| |
| @file{profopt.exp} provides generic support for profile-directed |
| optimizations. Each set of tests that uses it provides information |
| about a specific optimization: |
| |
| @table @code |
| @item tool |
| tool being tested, e.g., @command{gcc} |
| |
| @item profile_option |
| options used to generate profile data |
| |
| @item feedback_option |
| options used to optimize using that profile data |
| |
| @item prof_ext |
| suffix of profile data files |
| |
| @item PROFOPT_OPTIONS |
| list of options with which to run each test, similar to the lists for |
| torture tests |
| |
| @item @{ dg-final-generate @{ @var{local-directive} @} @} |
| This directive is similar to @code{dg-final}, but the |
| @var{local-directive} is run after the generation of profile data. |
| |
| @item @{ dg-final-use @{ @var{local-directive} @} @} |
| The @var{local-directive} is run after the profile data have been |
| used. |
| @end table |
| |
| @node compat Testing |
| @section Support for testing binary compatibility |
| |
| The file @file{compat.exp} provides language-independent support for |
| binary compatibility testing. It supports testing interoperability of |
| two compilers that follow the same ABI, or of multiple sets of |
| compiler options that should not affect binary compatibility. It is |
| intended to be used for testsuites that complement ABI testsuites. |
| |
| A test supported by this framework has three parts, each in a |
| separate source file: a main program and two pieces that interact |
| with each other to split up the functionality being tested. |
| |
| @table @file |
| @item @var{testname}_main.@var{suffix} |
| Contains the main program, which calls a function in file |
| @file{@var{testname}_x.@var{suffix}}. |
| |
| @item @var{testname}_x.@var{suffix} |
| Contains at least one call to a function in |
| @file{@var{testname}_y.@var{suffix}}. |
| |
| @item @var{testname}_y.@var{suffix} |
| Shares data with, or gets arguments from, |
| @file{@var{testname}_x.@var{suffix}}. |
| @end table |
| |
| Within each test, the main program and one functional piece are |
| compiled by the GCC under test. The other piece can be compiled by |
| an alternate compiler. If no alternate compiler is specified, |
| then all three source files are all compiled by the GCC under test. |
| You can specify pairs of sets of compiler options. The first element |
| of such a pair specifies options used with the GCC under test, and the |
| second element of the pair specifies options used with the alternate |
| compiler. Each test is compiled with each pair of options. |
| |
| @file{compat.exp} defines default pairs of compiler options. |
| These can be overridden by defining the environment variable |
| @env{COMPAT_OPTIONS} as: |
| |
| @smallexample |
| COMPAT_OPTIONS="[list [list @{@var{tst1}@} @{@var{alt1}@}] |
| @dots{}[list @{@var{tstn}@} @{@var{altn}@}]]" |
| @end smallexample |
| |
| where @var{tsti} and @var{alti} are lists of options, with @var{tsti} |
| used by the compiler under test and @var{alti} used by the alternate |
| compiler. For example, with |
| @code{[list [list @{-g -O0@} @{-O3@}] [list @{-fpic@} @{-fPIC -O2@}]]}, |
| the test is first built with @option{-g -O0} by the compiler under |
| test and with @option{-O3} by the alternate compiler. The test is |
| built a second time using @option{-fpic} by the compiler under test |
| and @option{-fPIC -O2} by the alternate compiler. |
| |
| An alternate compiler is specified by defining an environment |
| variable to be the full pathname of an installed compiler; for C |
| define @env{ALT_CC_UNDER_TEST}, and for C++ define |
| @env{ALT_CXX_UNDER_TEST}. These will be written to the |
| @file{site.exp} file used by DejaGnu. The default is to build each |
| test with the compiler under test using the first of each pair of |
| compiler options from @env{COMPAT_OPTIONS}. When |
| @env{ALT_CC_UNDER_TEST} or |
| @env{ALT_CXX_UNDER_TEST} is @code{same}, each test is built using |
| the compiler under test but with combinations of the options from |
| @env{COMPAT_OPTIONS}. |
| |
| To run only the C++ compatibility suite using the compiler under test |
| and another version of GCC using specific compiler options, do the |
| following from @file{@var{objdir}/gcc}: |
| |
| @smallexample |
| rm site.exp |
| make -k \ |
| ALT_CXX_UNDER_TEST=$@{alt_prefix@}/bin/g++ \ |
| COMPAT_OPTIONS="@var{lists as shown above}" \ |
| check-c++ \ |
| RUNTESTFLAGS="compat.exp" |
| @end smallexample |
| |
| A test that fails when the source files are compiled with different |
| compilers, but passes when the files are compiled with the same |
| compiler, demonstrates incompatibility of the generated code or |
| runtime support. A test that fails for the alternate compiler but |
| passes for the compiler under test probably tests for a bug that was |
| fixed in the compiler under test but is present in the alternate |
| compiler. |
| |
| The binary compatibility tests support a small number of test framework |
| commands that appear within comments in a test file. |
| |
| @table @code |
| @item dg-require-* |
| These commands can be used in @file{@var{testname}_main.@var{suffix}} |
| to skip the test if specific support is not available on the target. |
| |
| @item dg-options |
| The specified options are used for compiling this particular source |
| file, appended to the options from @env{COMPAT_OPTIONS}. When this |
| command appears in @file{@var{testname}_main.@var{suffix}} the options |
| are also used to link the test program. |
| |
| @item dg-xfail-if |
| This command can be used in a secondary source file to specify that |
| compilation is expected to fail for particular options on particular |
| targets. |
| @end table |
| |
| @node Torture Tests |
| @section Support for torture testing using multiple options |
| |
| Throughout the compiler testsuite there are several directories whose |
| tests are run multiple times, each with a different set of options. |
| These are known as torture tests. |
| @file{lib/torture-options.exp} defines procedures to |
| set up these lists: |
| |
| @table @code |
| @item torture-init |
| Initialize use of torture lists. |
| @item set-torture-options |
| Set lists of torture options to use for tests with and without loops. |
| Optionally combine a set of torture options with a set of other |
| options, as is done with Objective-C runtime options. |
| @item torture-finish |
| Finalize use of torture lists. |
| @end table |
| |
| The @file{.exp} file for a set of tests that use torture options must |
| include calls to these three procedures if: |
| |
| @itemize @bullet |
| @item It calls @code{gcc-dg-runtest} and overrides @var{DG_TORTURE_OPTIONS}. |
| |
| @item It calls @var{$@{tool@}}@code{-torture} or |
| @var{$@{tool@}}@code{-torture-execute}, where @var{tool} is @code{c}, |
| @code{fortran}, or @code{objc}. |
| |
| @item It calls @code{dg-pch}. |
| @end itemize |
| |
| It is not necessary for a @file{.exp} file that calls @code{gcc-dg-runtest} |
| to call the torture procedures if the tests should use the list in |
| @var{DG_TORTURE_OPTIONS} defined in @file{gcc-dg.exp}. |
| |
| Most uses of torture options can override the default lists by defining |
| @var{TORTURE_OPTIONS} or add to the default list by defining |
| @var{ADDITIONAL_TORTURE_OPTIONS}. Define these in a @file{.dejagnurc} |
| file or add them to the @file{site.exp} file; for example |
| |
| @smallexample |
| set ADDITIONAL_TORTURE_OPTIONS [list \ |
| @{ -O2 -ftree-loop-linear @} \ |
| @{ -O2 -fpeel-loops @} ] |
| @end smallexample |
| |
| @node GIMPLE Tests |
| @section Support for testing GIMPLE passes |
| |
| As of gcc 7, C functions can be tagged with @code{__GIMPLE} to indicate |
| that the function body will be GIMPLE, rather than C. The compiler requires |
| the option @option{-fgimple} to enable this functionality. For example: |
| |
| @smallexample |
| /* @{ dg-do compile @} */ |
| /* @{ dg-options "-O -fgimple" @} */ |
| |
| void __GIMPLE (startwith ("dse2")) foo () |
| @{ |
| int a; |
| |
| bb_2: |
| if (a > 4) |
| goto bb_3; |
| else |
| goto bb_4; |
| |
| bb_3: |
| a_2 = 10; |
| goto bb_5; |
| |
| bb_4: |
| a_3 = 20; |
| |
| bb_5: |
| a_1 = __PHI (bb_3: a_2, bb_4: a_3); |
| a_4 = a_1 + 4; |
| |
| return; |
| @} |
| @end smallexample |
| |
| The @code{startwith} argument indicates at which pass to begin. |
| |
| Use the dump modifier @code{-gimple} (e.g.@: @option{-fdump-tree-all-gimple}) |
| to make tree dumps more closely follow the format accepted by the GIMPLE |
| parser. |
| |
| Example DejaGnu tests of GIMPLE can be seen in the source tree at |
| @file{gcc/testsuite/gcc.dg/gimplefe-*.c}. |
| |
| The @code{__GIMPLE} parser is integrated with the C tokenizer and |
| preprocessor, so it should be possible to use macros to build out |
| test coverage. |
| |
| @node RTL Tests |
| @section Support for testing RTL passes |
| |
| As of gcc 7, C functions can be tagged with @code{__RTL} to indicate that the |
| function body will be RTL, rather than C. For example: |
| |
| @smallexample |
| double __RTL (startwith ("ira")) test (struct foo *f, const struct bar *b) |
| @{ |
| (function "test" |
| [...snip; various directives go in here...] |
| ) ;; function "test" |
| @} |
| @end smallexample |
| |
| The @code{startwith} argument indicates at which pass to begin. |
| |
| The parser expects the RTL body to be in the format emitted by this |
| dumping function: |
| |
| @smallexample |
| DEBUG_FUNCTION void |
| print_rtx_function (FILE *outfile, function *fn, bool compact); |
| @end smallexample |
| |
| when "compact" is true. So you can capture RTL in the correct format |
| from the debugger using: |
| |
| @smallexample |
| (gdb) print_rtx_function (stderr, cfun, true); |
| @end smallexample |
| |
| and copy and paste the output into the body of the C function. |
| |
| Example DejaGnu tests of RTL can be seen in the source tree under |
| @file{gcc/testsuite/gcc.dg/rtl}. |
| |
| The @code{__RTL} parser is not integrated with the C tokenizer or |
| preprocessor, and works simply by reading the relevant lines within |
| the braces. In particular, the RTL body must be on separate lines from |
| the enclosing braces, and the preprocessor is not usable within it. |