+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
</li><li> Solaris 2 (SPARC, Intel):
<ul>
-<li> <a href="http://www.sunfreeware.com/">Sunfreeware</a>
-
-</li><li> <a href="http://www.blastwave.org/">Blastwave</a>
-
-</li><li> <a href="http://www.opencsw.org/">OpenCSW</a>
+<li> <a href="http://www.opencsw.org/">OpenCSW</a>
</li><li> <a href="http://jupiterrise.com/tgcware/">TGCware</a>
</li></ul>
</p>
<p>Unlike standard bootstrap, several additional restrictions apply. The
compiler used to build <code>stage1</code> needs to support a 64-bit integral type.
-It is recommended to only use GCC for this. Also parallel make is currently
-not supported since collisions in profile collecting may occur.
+It is recommended to only use GCC for this.
</p>
<hr />
<p><p><a href="./index.html">Return to the GCC Installation page</a>
</p>
<hr /><a name="aarch64_002dx_002dx"></a><a name="aarch64_002a_002d_002a_002d_002a"></a>
<h3 class="heading">aarch64*-*-*</h3>
-<p>Pre 2.24 binutils does not have support for selecting -mabi and does not
-support ILP32. If GCC 4.9 or later is built with pre 2.24, GCC will not
-support option -mabi=ilp32.
+<p>Binutils pre 2.24 does not have support for selecting <samp>-mabi</samp> and
+does not support ILP32. If it is used to build GCC 4.9 or later, GCC will
+not support option <samp>-mabi=ilp32</samp>.
</p>
<hr />
<!-- rs6000-ibm-aix*, powerpc-ibm-aix* --><a name="x_002dibm_002daix"></a><a name="g_t_002a_002dibm_002daix_002a"></a>
-Obtained from SVN: tags/gcc_4_9_0_release revision 209612
+Obtained from SVN: tags/gcc_4_9_1_release revision 212636
# This file contains the MD5 checksums of the files in the
-# gcc-4.9.0.tar.bz2 tarball.
+# gcc-4.9.1.tar.bz2 tarball.
#
# Besides verifying that all files in the tarball were correctly expanded,
# it also can be used to determine if any files have changed since the
fe60d87048567d4fe8c8a0ed2448bcc8 COPYING.RUNTIME
d32239bcb673463ab874e80d47fae504 COPYING3
6a6a8e020838b23406c81b19c1d46df6 COPYING3.LIB
-8d6d05e379c4a8df790fbc678299a8a3 ChangeLog
+29e14d389b1c0e65e6ae681fe06c7857 ChangeLog
09538b708302f1735f6fa05b622ecf5e ChangeLog.tree-ssa
79ef16e405f5873970e04cee49091ff8 INSTALL/README
-2ac324e177e1068e2c7e9c2ad3aa779d INSTALL/binaries.html
-f2594062b115667717f768157a776465 INSTALL/build.html
+8fd5b9bf92cf218220799a40e8148fd1 INSTALL/binaries.html
+ddc94339e7cc49fddbf73d22ba6bc9d2 INSTALL/build.html
a75a16d0b16482ab73219c31f90f1265 INSTALL/configure.html
a09a2c134251cbc03a4d8c47881c96bf INSTALL/download.html
f71e8877b0791a16025b2bd2663f0865 INSTALL/finalinstall.html
4e742a49a16683b5759b0763fb109e84 INSTALL/index.html
37c24a83ee5d2059fce28b7e56527bf8 INSTALL/old.html
bca4120af0b2247e337e0b6991ed3702 INSTALL/prerequisites.html
-f060c2181d42f672076f86141966e64d INSTALL/specific.html
+1217d89de9b6c4a463ac85ecf755e1cf INSTALL/specific.html
86dd39fb0df38e33811ae7942add5854 INSTALL/test.html
-80f106aa8640529921d7dfcb42e401ee LAST_UPDATED
+5dfe8d6f44a964ca04e0c4da1a3f0e80 LAST_UPDATED
5df43eb77ba93510a6adee7bd06bd774 MAINTAINERS
e6078d46d3729f3f514954081bfd9480 Makefile.def
356452c2d3677e10f0047801465f2ea7 Makefile.in
f3a76b2dae23759df8f4bf5f1088f950 Makefile.tpl
-b5c55edd6d5a6fa42f76d5c01460a014 NEWS
+74d32ab573d398ae610c31f1efbb006f NEWS
80d26bc3b1ad4f6969a96a24c9181bf5 README
b510a5285eb05298b5f3d9f5ae920588 boehm-gc/AmigaOS.c
2caafacabf758bb76a9dfce1fc544b97 boehm-gc/BCC_MAKEFILE
-a800b05eea93a3656166cbb96dbe6432 boehm-gc/ChangeLog
+6c6cf7f4bd69abdad0091e39c3cb2f0a boehm-gc/ChangeLog
c18075e3729cd116028480307a8e845d boehm-gc/EMX_MAKEFILE
3b7cc3be9ed3c2135bbda990e8a69303 boehm-gc/MacOS.c
5cf7764626b7dd7272b2fe11403d1b6a boehm-gc/MacProjects.sit.hqx
eea34cf893bb060ee20189e256a8065a config.guess
040359150cf11493f973a46d8a25b06b config.rpath
9e38dc3cc2b4e471ea192c8984fb0cd1 config.sub
-1c536859092822f48876e093c0c2728e config/ChangeLog
+002024109027edb448563ba4e17df987 config/ChangeLog
0fcd4badfe2a2191778bdf5ab94aa40c config/acinclude.m4
9238d23c68259d195b332db71892d242 config/acx.m4
6b030f5cf640bdd401ea739f54a667f8 config/asmcfi.m4
e249d18c447a8372fd1ed5f084284d6b config/zlib.m4
2aee2a912a0f3cadd86b0ab07d01c110 configure
0a1b5029c2e53271ca6339f01757cc34 configure.ac
-aaccaa28104c9d5dde05a003d2ec5226 contrib/ChangeLog
+5eea86cbadf6888fca1d5cb97ea71df3 contrib/ChangeLog
7af8d2979bf1a7cfa88e30d05fa22be2 contrib/ChangeLog.tree-ssa
e0ea80d7094bf66610f2f60db444f9a1 contrib/analyze_brprob
998f0112578f801ac84646f060e18f89 contrib/check_GNU_style.sh
480dbaa133b74e68d41762d6596bd034 contrib/gcc.doxy
55236e85d8087042189b701cd05d84be contrib/gcc_build
2a5f30b12e8aab5e135e7f4dfd7d6519 contrib/gcc_update
-41804fd84ba2402d1b8a2d7979dedbd5 contrib/gennews
+7a9f4e8f88e74e4e83fa3ccb960b442b contrib/gennews
59304fc08afa489baa6b920cc76dc625 contrib/gthr_supp_vxw_5x.c
fa945bac89ee68b410027dcfe1312f4b contrib/index-prop
43e3d77ae19b5c6304d6d6846792c173 contrib/make-obstacks-texi.pl
0fb5c8c3cd465d8bd57b55b2548c683a contrib/paranoia.cc
9083c56c1c89c5bec355a27f78e49807 contrib/patch_tester.sh
87a19b40fbd220938cf6c23c42c255e2 contrib/prepare_patch.sh
-02992e52bfd0c60e25a3970249b90e02 contrib/reghunt/ChangeLog
+b09237f96cc90e605875486d065ffbbf contrib/reghunt/ChangeLog
cf247a580e49d212518de409793db0a8 contrib/reghunt/bin/gcc-build-full
724e70ea3e80f87f2a201bbe2f1eef37 contrib/reghunt/bin/gcc-build-simple
3f2318bae7562a4ad1639e686916a545 contrib/reghunt/bin/gcc-cleanup
e2829fc4af4f433a6a328a62d5ce8066 contrib/reghunt/examples/reg-watch
afd863c2ec84c906e20f9b9787b1f0fe contrib/reghunt/examples/reg-watch.awk
8955535523d4b5f48006bcb851ba9b4b contrib/reghunt/examples/testall
-eee9e8a09a9d2e921d33eab3f94f72a4 contrib/regression/ChangeLog
+5b76e18edfd2f7e11820243112e1ef67 contrib/regression/ChangeLog
30553bfced1b2b46bf7ca01ef6ba69d1 contrib/regression/GCC_Regression_Tester.wdgt/Default.png
ad38ddd771df222eb9d413e3c7f6a751 contrib/regression/GCC_Regression_Tester.wdgt/Icon.png
777bd286c147cc02861811f66b9a4440 contrib/regression/GCC_Regression_Tester.wdgt/Info.plist
6ed51d5edccbae74c6500732f8a40540 contrib/update-copyright.py
7cb42cbdf8becd280d1e16191416fb62 contrib/warn_summary
21504de31981a67b5b93b265029d1865 depcomp
-a38690f84bc8c30e2f9ee3434766ecc8 fixincludes/ChangeLog
+61aae72ab9e62647bad5bd0ba1b90c33 fixincludes/ChangeLog
c23ba4c4f4ca4dfcdd9b4155e4626da7 fixincludes/Makefile.in
4eb8fdda3b3e303c7aa822d341495822 fixincludes/README
455903ad4ff71fa5c5340ef7ae41a0e6 fixincludes/README-fixinc
955462b555900ecd3934223c64e21fa7 fixincludes/tests/base/types/vxTypesBase.h
c78e762f2c91f2af991feda7d3d7f4b2 fixincludes/tests/base/unistd.h
f9abccf4b8b7eac82a99bb1f9ef6832f gcc/ABOUT-GCC-NLS
-12c685a5239eb2421fb99d6211a31d2c gcc/BASE-VER
+b73567b635a03772e7a52b29fa7a12ee gcc/BASE-VER
59530bdf33659b29e73d4adb9f9f6552 gcc/COPYING
a916467b91076e631dd8edb7424769c7 gcc/COPYING.LIB
d32239bcb673463ab874e80d47fae504 gcc/COPYING3
6a6a8e020838b23406c81b19c1d46df6 gcc/COPYING3.LIB
-abe43b4eec0f7a36b8fff4884ea829a4 gcc/ChangeLog
+1a17ac233399b10a193fe4343c14e764 gcc/ChangeLog
a3b63c675afa7a655cc2bfa8a907af79 gcc/ChangeLog-1997
d9a88529352a010253c2e8fb1ed6023b gcc/ChangeLog-1998
240f08f81cb4699e8b49347db38233db gcc/ChangeLog-1999
3eb07e0b2e542409bf73d359f7f65609 gcc/ChangeLog.ptr
e13638e26743ba41e6011b76cc00d9a9 gcc/ChangeLog.tree-ssa
739ab47f6425bcea1d05e4fc0542de54 gcc/ChangeLog.tuples
-766c23d7fd70339aa367112c80a90a13 gcc/DATESTAMP
+3814e94fd45d6453d6951a69af800953 gcc/DATESTAMP
d41d8cd98f00b204e9800998ecf8427e gcc/DEV-PHASE
eb92e1ff5e982ca07e173e0eb286d243 gcc/FSFChangeLog
30e1e33411566388b3164558482dc5e6 gcc/FSFChangeLog.10
65b0958f3e11d2f408011ac52955b811 gcc/acinclude.m4
8dcfee0fc9b019ed7810de9926841795 gcc/aclocal.m4
30995d78221b41ce62c92b2f601b4ebb gcc/ada/9drpc.adb
-8023dbbd6cf13249e3c703346e047f0a gcc/ada/ChangeLog
+2eaa1b634c73ed0dab2f1330e32a2af8 gcc/ada/ChangeLog
683be0b07dc4f64f118fd5e8ae9cb30d gcc/ada/ChangeLog-2001
7aff25efb203be4136b8776cdc812956 gcc/ada/ChangeLog-2002
cd2379152000f40157d349018fb9364d gcc/ada/ChangeLog-2003
9493e0e9238e73f4ebdbaef95b89989a gcc/ada/cio.c
ada2f539221a75ff168031eff7815c0f gcc/ada/clean.adb
9a36d574098d976ee0279592d026b972 gcc/ada/clean.ads
-20f62cdc28eaef50f89b843b3b9c7cc2 gcc/ada/comperr.adb
-e46cbbab0c251b90c32553f7cd454455 gcc/ada/comperr.ads
+4aef9db9727ddb63adc4a92e757c5436 gcc/ada/comperr.adb
+1ad3f00ba3288ec56abed700e8fe5eff gcc/ada/comperr.ads
fbd23958a6d5c4207e39317e708436ac gcc/ada/config-lang.in
6e05548d8d2fbb2b63a0f07476437fb3 gcc/ada/csets.adb
4e4a23a69754d2ec7a8951a8570fe5b0 gcc/ada/csets.ads
f768c6b870ebc746874cc73fcdbdf7ab gcc/ada/exp_atag.ads
13e8a8feb8fa7a1bfb1990c1b25c879d gcc/ada/exp_attr.adb
5702351fe63e0743b3814a1800c30ed2 gcc/ada/exp_attr.ads
-b48d9a5c86e8364287d5edfa50b78fa7 gcc/ada/exp_cg.adb
+47f473b5c4602ac1bb03108dba91a1d3 gcc/ada/exp_cg.adb
4eabed8d6501ce1ad40758d4710a9831 gcc/ada/exp_cg.ads
5ccfa8aff821d4ddb7a383357ddb3724 gcc/ada/exp_ch10.ads
ab12a2bd11ed3ade8004fe061fd0f523 gcc/ada/exp_ch11.adb
5c78630af699c2c8866d59d8f8abffe8 gcc/ada/exp_ch9.ads
d839fc69ad7fb176e706739beaa91e63 gcc/ada/exp_code.adb
d2e1249b6b65db4c78621b52c7dc14fc gcc/ada/exp_code.ads
-313bb90ebc481c1617f766e248ad7105 gcc/ada/exp_dbug.adb
-2fa6fd1cad24e36376b4e0780aae3a52 gcc/ada/exp_dbug.ads
-773db59e5debdf769b8e642b7037afad gcc/ada/exp_disp.adb
+a0e02892c3f365ba1c2fb5e7b5407e06 gcc/ada/exp_dbug.adb
+0d7c0581afa280425de092cd0b33a32b gcc/ada/exp_dbug.ads
+fb4d06c9e6bf3a22adf5396afb6ad7f6 gcc/ada/exp_disp.adb
c192de81f13f3cdf2a0ca3f633d956e8 gcc/ada/exp_disp.ads
f96cc62086b3fe7b9a72604a429c8c8a gcc/ada/exp_dist.adb
d692d8d0a9890eca6c46d32547c20c29 gcc/ada/exp_dist.ads
cfd69fe81b466d6645a6f64a92e243ed gcc/ada/expander.adb
856cf1514fa6e098c62b2213757c16bd gcc/ada/expander.ads
7d93fd1e41c9e1089f5354141c2a45b8 gcc/ada/expect.c
-a2f56a8f24b7e2571aa376b073f108bf gcc/ada/fe.h
+9a406035019bea08a3c724f6033a711b gcc/ada/fe.h
875d98b79093e1d2a6626a408d638d00 gcc/ada/final.c
e8be99a2722456562ee665aec5b92580 gcc/ada/fmap.adb
c1521c6e3b4d7465c7d7c52c05cba906 gcc/ada/fmap.ads
b45654446bc74bb68ae4adef78906e9b gcc/ada/g-zspche.ads
698b837b776abdf33504479af8506a50 gcc/ada/g-zstspl.ads
ec9434db1d60180addfe46d2744f6380 gcc/ada/gcc-interface/Make-lang.in
-fc6e59fdc9ea9329c0d8cec36f6dd0f6 gcc/ada/gcc-interface/Makefile.in
+c7513fa4215e55ec6302debfeb9d2964 gcc/ada/gcc-interface/Makefile.in
d47cdfac076a7e474979da4139393b39 gcc/ada/gcc-interface/ada-tree.def
a283b124426371820055dc3a8082b6a8 gcc/ada/gcc-interface/ada-tree.h
51c95420b5900990141d2e5705582197 gcc/ada/gcc-interface/ada.h
4cbfd794461da0feb1b8661ec623b6c6 gcc/ada/gcc-interface/config-lang.in
cf89e8e38d01ca91bfed6c342ee1c569 gcc/ada/gcc-interface/cuintp.c
-102923abb29b03f41695246cfdc82516 gcc/ada/gcc-interface/decl.c
+31eef307443e6a2eff2dae2574fb077c gcc/ada/gcc-interface/decl.c
c413d4d50e9563859f4d751a4404b705 gcc/ada/gcc-interface/gadaint.h
b18231cb03f2f97b42fb46387ca5d9be gcc/ada/gcc-interface/gigi.h
551c6c4d04e4f9c63340554e826c7bed gcc/ada/gcc-interface/lang-specs.h
f4ffb206fe0e51f054ea66a5daaa32ff gcc/ada/gcc-interface/lang.opt
-1718f4d0012556901214e4eafc4c49a7 gcc/ada/gcc-interface/misc.c
+c34631d0635fe85f8015d681e1a9f5da gcc/ada/gcc-interface/misc.c
4ce109758af9fd09626d5277a2507764 gcc/ada/gcc-interface/targtyps.c
-61a9064b795a1391858ed057bc136de9 gcc/ada/gcc-interface/trans.c
-31f221fe81d7fee9ed5bfd540ea0dde4 gcc/ada/gcc-interface/utils.c
+c1e11cf924f59cc38344d4300a1d5ea5 gcc/ada/gcc-interface/trans.c
+671bbb5c023f9271e36e25a93de01aba gcc/ada/gcc-interface/utils.c
7b11749f4e6d3dd14546d219cb372cb0 gcc/ada/gcc-interface/utils2.c
78e1564fc6e18145efeeea01940a4cb4 gcc/ada/get_scos.adb
baa8fdaf8d693eb6c5a7e42944887584 gcc/ada/get_scos.ads
d7687cbf6b1c440a90c770b40742ab35 gcc/ada/indepsw-mingw.adb
fa914ddcd147d8430f947dc903d68021 gcc/ada/indepsw.adb
5b85c73b60202d26b3cccad29575fd6a gcc/ada/indepsw.ads
-59f1b9334085641476c51a4efa2f1f19 gcc/ada/init.c
+acfdbff5c5b19f4dcebb1d35e93fb745 gcc/ada/init.c
f27041d879873bad257544aba837b673 gcc/ada/initialize.c
172b35fc27ac645ebd334bef3f9dbf82 gcc/ada/inline.adb
190c3fbbc0e399688e01b2150271dacc gcc/ada/inline.ads
4521682baf658427c38e7e4194c86ab9 gcc/ada/ttypes.ads
373e654bed9f76ed6875cee226d0dcbc gcc/ada/types.adb
be7ee8bf42f632905fd0e265732c810d gcc/ada/types.ads
-72311200c3e0a1c92b46efc3a971d2d2 gcc/ada/types.h
+f6b6a35037bb773569ed43b3125aaf18 gcc/ada/types.h
441db1972464d6fa9f7e955634586561 gcc/ada/ug_words
54a60157722eefc861657338313fefea gcc/ada/uintp.adb
f49db1f5ff371d16dc0543a76ba05d6b gcc/ada/uintp.ads
f806ef31303c8073c9399221837a0cca gcc/alias.h
62460fd310b0c679995a9f3e7a5dd196 gcc/alloc-pool.c
381b28a1bdd5698b2aa6b37bbe7bd591 gcc/alloc-pool.h
-f2703a2c5283028811b9314f55a3f876 gcc/asan.c
+01f9205a58ab703ad269012b0f203bba gcc/asan.c
3e1fa4c99f53f52f13177fbdc594c191 gcc/asan.h
cfd590b0822ba24a9383ebb7ce10a076 gcc/attribs.c
a53a9ce9c944413119fc0a25fb06a976 gcc/attribs.h
435c31f0e374dedc231c9bfea1ee4de0 gcc/builtins.c
709447be4b984f09869436e1af94d606 gcc/builtins.def
4b25cb43c45b2775bf3398cad0b2f997 gcc/builtins.h
-429fcb29f67015be15355b2e9669d103 gcc/c-family/ChangeLog
+838b89ea6956c366627adb2126adab64 gcc/c-family/ChangeLog
73540d5b0f49564e0c08e24b6feeb126 gcc/c-family/array-notation-common.c
522dd88f1775b9c27c88bdec1b215f33 gcc/c-family/c-ada-spec.c
10157e4802b298ec57f6bbe626694034 gcc/c-family/c-ada-spec.h
005a6e6078a443f37358315735999e75 gcc/c-family/c-cilkplus.c
-fe4405afc690b12573dd77c70f79a145 gcc/c-family/c-common.c
+9adbf544851a929b93b59f8f294623a8 gcc/c-family/c-common.c
3ce0acd449868895cda4785a578266e2 gcc/c-family/c-common.def
-5d7444bae9d31d85d704048f1092625e gcc/c-family/c-common.h
+2f64edf02605a36ddcb4643da27c6200 gcc/c-family/c-common.h
3b67756246e8ee78f5476f7d6e1e5a26 gcc/c-family/c-cppbuiltin.c
dbc45b842496652a81ddf71534f085cb gcc/c-family/c-dump.c
d903f037f15d1a4333bff696b8b4951a gcc/c-family/c-format.c
69e2a115308d9b72ce2c53b23ca14cdb gcc/c-family/c-gimplify.c
a3c101e11d8d2321151be53333283c58 gcc/c-family/c-lex.c
5c6cd6a62c649574128a4651f621a0b0 gcc/c-family/c-objc.h
-1dc164b29bfc4608e65bc1dbbf3075f3 gcc/c-family/c-omp.c
-cb6a908fe3e325518d31541c95382ebd gcc/c-family/c-opts.c
+6fcd9cdd64b600cd292be161b04ea969 gcc/c-family/c-omp.c
+9dadf710ab87357edd7ac40326f605d2 gcc/c-family/c-opts.c
6f8ef838c68a594024f4c12c021f38be gcc/c-family/c-pch.c
a764fac4f453e4c326786cf0400015da gcc/c-family/c-ppoutput.c
-b657c501deaf141499da23ce44944859 gcc/c-family/c-pragma.c
+dce0ba09fb1c4c409b75ef665ff94efc gcc/c-family/c-pragma.c
61e3aeb23503e1772d1c2c1fdbcea56f gcc/c-family/c-pragma.h
7958151ac6795655d68812f5a45303f9 gcc/c-family/c-pretty-print.c
822314f9921231408f230b215ee5b6d1 gcc/c-family/c-pretty-print.h
8041b1cda8919775362c4465096c609b gcc/c-family/cilk.c
85b441a3f28a2bd4e2ca99f03490e65e gcc/c-family/cppspec.c
00be2969ca302d49f76b65173590c942 gcc/c-family/stub-objc.c
-2dff10b90e21925148128f0ea3ca20f0 gcc/c/ChangeLog
+1d6e9f4ede8900c62fcd5a689271133e gcc/c/ChangeLog
5d46413a194e3bb9b8b12f6e49e911c3 gcc/c/Make-lang.in
-9ec984df7cf8a2836f79a2162e03b3b6 gcc/c/c-array-notation.c
+d7a3c457ca29e4251a7b5d56221cd69e gcc/c/c-array-notation.c
f8a2e7536c39b4d1e3f4b1d5ee6d62c5 gcc/c/c-aux-info.c
3bda18438dfe79a5fcacb0ec192cf602 gcc/c/c-convert.c
-4604723e8e99cf3ff16e8d68f6feb581 gcc/c/c-decl.c
+3cc1c7d292032aaf8d66085b8dc20ce3 gcc/c/c-decl.c
80705e9d8c52ab1b2501574d0dc8ab67 gcc/c/c-errors.c
12ec429c86710adfcfe5eed23174aead gcc/c/c-lang.c
8b01b74da83bfb4d6dc1127114c72f94 gcc/c/c-lang.h
e8fa0ec0164ceb8a90d6ae74f9c7fd1b gcc/c/c-objc-common.c
941499386ac0a23999c942a8986f8e61 gcc/c/c-objc-common.h
-1307f7b7625b59fe133120362328b6da gcc/c/c-parser.c
+fc253e1619b9a8a5fc616ce97c6b09f1 gcc/c/c-parser.c
66a995603b2cd1394afbfb29b90fe209 gcc/c/c-tree.h
-b3b78f574305a73e4d51b5fc69bf9dda gcc/c/c-typeck.c
+cb28b4a54311cba22def99ce6e89cfda gcc/c/c-typeck.c
62032db4c55340bd16e7f80d99c0b016 gcc/c/config-lang.in
597ddbe49d6b3528aa5670f785ed61e8 gcc/c/gccspec.c
e972cc617a462165838c95421a29ca5e gcc/caller-save.c
02943835098f2e8538a6df30ad37cf85 gcc/cfganal.c
4d8cc1876560628dabb57cefce453d9d gcc/cfgbuild.c
373997b7234f5abbda49e47e5cd973ca gcc/cfgcleanup.c
-520104bc5700831e918532f501fa7010 gcc/cfgexpand.c
+567226e4328d5bfff1f1b9746e1e8c2e gcc/cfgexpand.c
b3c947b28531afadb81599f4a0d73783 gcc/cfgexpand.h
a6a0c9ebc641dfa71f1f2e5188b0da21 gcc/cfghooks.c
17095bd67a8350591e1bd47ec9355698 gcc/cfghooks.h
4465b1eb3d111a823235d7e5458b8889 gcc/cfgloopanal.c
a7a8e23de07e7514d4e470f630ee8e1e gcc/cfgloopmanip.c
0dec1bf60fb09e18cda16146df5e275d gcc/cfgrtl.c
-52f46e8841f01be23f4b2c95639280ae gcc/cgraph.c
-7674cf940b4d786f88075268cadb3e8a gcc/cgraph.h
+444bde39f32fb5b9671d26f44171421f gcc/cgraph.c
+7cc4dd8df507eb56aadd2311f739e311 gcc/cgraph.h
fcb9af5cf8a6d1c7a195ca1c007c9e3f gcc/cgraphbuild.c
-db61dc560eb7b548aaf9a52a603cbcbb gcc/cgraphclones.c
-6929849b51d262f226099cb75f6cfade gcc/cgraphunit.c
+d62467388a9a6820a3f988a536433852 gcc/cgraphclones.c
+3997d6631c4d50c3403b5b7b45b3a390 gcc/cgraphunit.c
554526d022cd2d03e42412e6886c1338 gcc/cif-code.def
f264c8d0b8b475e306ad180dadec1a98 gcc/cilk-builtins.def
05497e8da0a9b1c9dfb1957920b812c7 gcc/cilk-common.c
56efb0c450fd51a9713a2dde395871bd gcc/collect2.c
f925b9d3bc0775367c24b644d8e35002 gcc/collect2.h
d37c34609a296ebc9dd4d677348419ea gcc/combine-stack-adj.c
-49346b3ce7ce5180f0fe84291406bcd4 gcc/combine.c
+7477ad9438742a77e965dd5bb722f35c gcc/combine.c
bc34d644ab9d1299c59daeb7a59e1087 gcc/common.opt
a0c9b1ade89a8b10502b808eda27512d gcc/common/common-target-def.h
82f688c1c764b568b712d183e502bc24 gcc/common/common-target.def
c89c903fdaeebf0937c539fe077d79bc gcc/common/config/mips/mips-common.c
fc30a9a41b3f761ba5fff6f2c1581944 gcc/common/config/mmix/mmix-common.c
e3c6c57c2590f0a3610edb36b66dfc03 gcc/common/config/mn10300/mn10300-common.c
+a5289d44a7568876d6b8474ce02597f1 gcc/common/config/msp430/msp430-common.c
ef89260dc33590c40c56cc99fedc1511 gcc/common/config/nds32/nds32-common.c
598e0913f0667a262988f8a38927b2c6 gcc/common/config/nios2/nios2-common.c
5cd6f4c52d593fe8262f4f38668e7bf0 gcc/common/config/pa/pa-common.c
2ebc5e4eccb7d2c52897dd83a4be28a7 gcc/compare-elim.c
e82a81c423eccb73f4e9f04c09a5cae1 gcc/conditions.h
a40ac599c845be41c961d15dfd9559b3 gcc/config.build
-7ec66ee3b384f4fc04b63987c11b3e21 gcc/config.gcc
+0ed6c6819c194b5fc2f037ec312d30ed gcc/config.gcc
9eba81e694fe412bcfa8aafa6743a568 gcc/config.host
-0d9065d0b9bc757911399a1b4127aa6d gcc/config.in
+844939897f9a01558ce5f9f36bf0e344 gcc/config.in
8e697813dc96ca90f5d0f4c196efe2cc gcc/config/README
21a150941d104bd2b16b4b064132b82b gcc/config/aarch64/aarch64-arches.def
526b5bd7fea44716301891aad5581e68 gcc/config/aarch64/aarch64-builtins.c
79287aa831c8692a259b3fc99493fc1f gcc/config/aarch64/aarch64-elf-raw.h
0da8426685ba7860c8cacd8f15a98f78 gcc/config/aarch64/aarch64-elf.h
1f97cd7b50aac2382f0009c8933516a8 gcc/config/aarch64/aarch64-linux.h
-51bc0a1ddf9bda2e6a7c597b8e7a6782 gcc/config/aarch64/aarch64-modes.def
+19acc0c5b8eaf2ec35cb01753657f65d gcc/config/aarch64/aarch64-modes.def
719c650d0bf63bbe2a04c38aad30d8ca gcc/config/aarch64/aarch64-option-extensions.def
a3008f913374a88b9de4022df0b84d4c gcc/config/aarch64/aarch64-opts.h
e786c44f23ac42a3b66f08e8865d0b0a gcc/config/aarch64/aarch64-protos.h
0a8a4231dd82bedb83a9d89591dfd07f gcc/config/aarch64/aarch64-simd-builtins.def
-e0f8f1d76d1dae334cf39aaf5a922533 gcc/config/aarch64/aarch64-simd.md
+e92c68894aa2124bdd3fde807ebe5a28 gcc/config/aarch64/aarch64-simd.md
d0075eefdaf65db63dacef89ea39e1ea gcc/config/aarch64/aarch64-tune.md
-b8d56e96679088e423ae1431579ee273 gcc/config/aarch64/aarch64.c
-0d33e7e507dd97cbe7bf272379fa8dab gcc/config/aarch64/aarch64.h
-f63fe28acb626e46d41cba25d7ddbdce gcc/config/aarch64/aarch64.md
+d179820d7b55a2585bfe2aed5196f0be gcc/config/aarch64/aarch64.c
+52f8eb234212c8c48c3468fd5318f1e9 gcc/config/aarch64/aarch64.h
+1b2d799df61cb7053044749de1a94364 gcc/config/aarch64/aarch64.md
5f65f38fa897daabd9e7f57dd1a9e90a gcc/config/aarch64/aarch64.opt
-d744a2fc495a74654c2bc56f58b45274 gcc/config/aarch64/arm_neon.h
+04a9a881cdda356dc9397436e1175cd8 gcc/config/aarch64/arm_neon.h
563bb636b7b9dfcfc4fb5fd31576726b gcc/config/aarch64/atomics.md
e1792eef6442fd7efd11eb48c3c9a450 gcc/config/aarch64/biarchilp32.h
c206feb1f06af29cb310e7af1a86d8ee gcc/config/aarch64/biarchlp64.h
b01df6d05d957e306ba5c14f633d2320 gcc/config/aarch64/constraints.md
61def47e552d5a0279fbbe8a7a5fc8ad gcc/config/aarch64/gentune.sh
-d8521aa09888da5924979d87c18a69f4 gcc/config/aarch64/iterators.md
+f4b897b3be3c77cd2b507ea94363a21e gcc/config/aarch64/iterators.md
0d943cb735d61d6bb3c8b3260e47805c gcc/config/aarch64/predicates.md
a381f4f44bffba3068dea2bcf86b1c37 gcc/config/aarch64/t-aarch64
c5163265d2d83b8fe360d25202a8b342 gcc/config/aarch64/t-aarch64-linux
9d0a5d95304a9bd6b70b0e316bd30832 gcc/config/alpha/alpha-modes.def
b1dbf3309f3744b073c14d10174ad350 gcc/config/alpha/alpha-protos.h
-34f1fc8f7bc037838e036d6819487b42 gcc/config/alpha/alpha.c
+718370bc105011b843caf56c9aca49f1 gcc/config/alpha/alpha.c
26d7e3357f7c361c8e6343bd33837415 gcc/config/alpha/alpha.h
b88e1217fbf0f3dae5b18f17063bf733 gcc/config/alpha/alpha.md
0112499d08da07e950408270a411f17b gcc/config/alpha/alpha.opt
592330b7b4a8a7b6708c760c980be7e9 gcc/config/arm/aarch-common-protos.h
6f5f08370088230ff90314f46f9f7d7a gcc/config/arm/aarch-common.c
9321b0cdefad344e9a1f5562d699dd1c gcc/config/arm/aarch-cost-tables.h
-22ba327bc30b4f5e7a072f727c46d89b gcc/config/arm/aout.h
+ea8d6fd4a3a9ed6dc6e6fe9518fdd574 gcc/config/arm/aout.h
2a5e85335df5916cba0b8ad0a995b677 gcc/config/arm/arm-arches.def
fd7fbd9763af884894e66aca6091cd11 gcc/config/arm/arm-c.c
-990ac7296d4b4bcac097d093565c4727 gcc/config/arm/arm-cores.def
+ec1ec936dedafc71f84328103593f58c gcc/config/arm/arm-cores.def
717f132978455853fdebde9cd08f2ce3 gcc/config/arm/arm-fixed.md
cc77f434f0e62473275484fc733f9e2f gcc/config/arm/arm-fpus.def
b8712fbb401b24fa48945dac9bfe367c gcc/config/arm/arm-generic.md
a10288b2cb1af625b28612f6454a8386 gcc/config/arm/arm-ldmstm.ml
cf094505e37b191ba07edb74fbac88b1 gcc/config/arm/arm-modes.def
-e78af379056e6bf4060a0d2552d420a5 gcc/config/arm/arm-opts.h
+050d4ca3b04fd3fc1406a0dcbebfe6d9 gcc/config/arm/arm-opts.h
985bd0307db7a7dcdad194d599f5c624 gcc/config/arm/arm-protos.h
d4141d32e48618aa5ba56b67b3b6f221 gcc/config/arm/arm-tables.opt
d5d7db112e25b2d92afea2a696a57ff9 gcc/config/arm/arm-tune.md
-904a02287a0b495a86a23e9dce8cdac9 gcc/config/arm/arm.c
-ed8bea5ab7eab5b3ce8cafb6d1e0df6d gcc/config/arm/arm.h
-bc4b012b05f7c982e378994e229c8359 gcc/config/arm/arm.md
+84548cbc1ffc6a16eb12eece72917cc9 gcc/config/arm/arm.c
+4c8130737c990b8939f9a33c1f6314d5 gcc/config/arm/arm.h
+9e01454206781ded996aff1835119141 gcc/config/arm/arm.md
7ec80248e2019885ec3fa78e3d2df3b7 gcc/config/arm/arm.opt
55a87c11458722539f3821c53f4b8c5f gcc/config/arm/arm1020e.md
7c28931b2e524e1b44678ca8334d5d54 gcc/config/arm/arm1026ejs.md
dfdf8a4aee915224ee2bc49fae27c588 gcc/config/arm/arm1136jfs.md
45ac9277861b1a3d206e924adc48e8ba gcc/config/arm/arm926ejs.md
88a5b7809812aa7a05f031af0da0e964 gcc/config/arm/arm_acle.h
-d6139d5f8fe594d8bfeef9696109ad2c gcc/config/arm/arm_neon.h
+7757b942b9956d106f93c0bec956896c gcc/config/arm/arm_neon.h
57ea068bd966895991477ffd6e51d2f2 gcc/config/arm/arm_neon_builtins.def
-bc8ca7f0793af390c643b7fc7cf661f2 gcc/config/arm/bpabi.h
+ebcb1b558c456101c18d856467a5ffe4 gcc/config/arm/bpabi.h
1d36ffaf951df98052e3f212624f4570 gcc/config/arm/coff.h
014379a6df6bf446bf48de1cdb795218 gcc/config/arm/constraints.md
0cb3e2e12b3a38d03abbdeda5baf61cc gcc/config/arm/cortex-a15-neon.md
1d56e0ea31042b3affc03861cb6a14a2 gcc/config/arm/crypto.def
d5c5c3524695653b76c4f2c0f4962135 gcc/config/arm/crypto.md
6eee2b8989e806a15ddf1164190ae779 gcc/config/arm/driver-arm.c
-c21dcae115511871aabca10a1284c0e6 gcc/config/arm/elf.h
+8aa2af0f9cf690414116130a59f6ead0 gcc/config/arm/elf.h
68cb8271ca3a2efc000d490e96066dfe gcc/config/arm/fa526.md
091065d093420ecc514c25df889f23fb gcc/config/arm/fa606te.md
504b87c80c9fc45168f5d95a3111845d gcc/config/arm/fa626te.md
0a29e3add3cde2528f46f0ea3e4a9d16 gcc/config/arm/ldmstm.md
15a62603ee5291a6e33533c06353786e gcc/config/arm/ldrdstrd.md
11a002db4ff19e479f0d124cdafb860a gcc/config/arm/linux-eabi.h
-749a26b5388fa3f5575f3ba347ca5b8a gcc/config/arm/linux-elf.h
-e5707fd0263e93cfd7e4f294d88db7a5 gcc/config/arm/linux-gas.h
+1659d9b210406f8ab375e650ec9524b4 gcc/config/arm/linux-elf.h
+c0316bad2e142d642f4edea6c49a1661 gcc/config/arm/linux-gas.h
b7897a497d5fe972d6d7d42299cf7334 gcc/config/arm/marvell-f-iwmmxt.md
b1c28c557bd726126ce8dc1cca03d981 gcc/config/arm/marvell-pj4.md
771faa70c2051051996ec38873011acc gcc/config/arm/mmintrin.h
-1ee25c02568a36d527c0f8ebd7af594f gcc/config/arm/neon-docgen.ml
-575e419fc8cdf990cc4ff317aac599b4 gcc/config/arm/neon-gen.ml
7a5eba056883c332ad3a5fe1725cc6c2 gcc/config/arm/neon-testgen.ml
a5bcc027bcaf911067121805327b6407 gcc/config/arm/neon.md
d16795d6009d62f44e69fece0b527660 gcc/config/arm/neon.ml
-795ef8ff5bb19feeb771758cf2384c31 gcc/config/arm/netbsd-elf.h
+a24042b796d08a2cd687392b38423454 gcc/config/arm/netbsd-elf.h
24a26d6ba1e6ebf3a9676ee91cd6efb4 gcc/config/arm/predicates.md
e062772cc17dc38f590c49d66b7495e5 gcc/config/arm/rtems-eabi.h
f1380539ece11e800120f6dd294810c0 gcc/config/arm/semi.h
6a2754e02840c8bafdf59d8df84f5c35 gcc/config/arm/t-vxworks
bcd5d34153856d124d957f7232436d2c gcc/config/arm/thumb2.md
aff5361a35cf3b67875219f0cf3033e8 gcc/config/arm/types.md
-a5012a589602d48db53fabb9dc9109cd gcc/config/arm/uclinux-eabi.h
-7ef376804eee1de2ab012b3b7091e541 gcc/config/arm/uclinux-elf.h
+1e08e1c9ef0b4ef9afbd7098ed370a30 gcc/config/arm/uclinux-eabi.h
+9a1e2a69825c4161470dc22b2622e678 gcc/config/arm/uclinux-elf.h
75e200f7915fb565020d3cb835874ace gcc/config/arm/unknown-elf.h
c136d87590d20ac3cfb14cbfae13ffea gcc/config/arm/unspecs.md
3d0b0d6a1ba842743ec73559bd4deff8 gcc/config/arm/vec-common.md
6602aa41ff91da4bf98cb2adf2f43c7b gcc/config/arm/vfp.md
81b24c3d99f42aaf80b43d705f3f7ea3 gcc/config/arm/vfp11.md
-0cc82c8ffc973f91ed1c3859c23e186e gcc/config/arm/vxworks.h
+892885b7d4dc935afdd8917fc2d277e6 gcc/config/arm/vxworks.h
7ea704769204d420cbcbb2f114349312 gcc/config/arm/vxworks.opt
a17a638dc98f3f18b0e13448c69e1e65 gcc/config/arm/x-arm
b5a2b09861de6689113db05b64719022 gcc/config/avr/avr-arch.h
2643f8b817df1b5cb3b39737fdb810ad gcc/config/avr/avr-c.c
8b8a7041f9af051e650a9caa8a73e3f7 gcc/config/avr/avr-devices.c
5b18e57e6b772fc6eff612a345599f23 gcc/config/avr/avr-dimode.md
-964d39554ea32300f4353e8bf87c115a gcc/config/avr/avr-fixed.md
+6360195f2f3c5789d2f40cea7408f84f gcc/config/avr/avr-fixed.md
0ea9e1292fa63ad32d73b8c1ea6175e9 gcc/config/avr/avr-log.c
-12514ae1006cd842cff739c9680f69e2 gcc/config/avr/avr-mcus.def
+48400c902cb5f518f34efe8178f569b4 gcc/config/avr/avr-mcus.def
f2654233df6eb02ba173ff479c08e9a5 gcc/config/avr/avr-modes.def
f18b33ac6648ea748c8b996ee866aa3a gcc/config/avr/avr-protos.h
5ebe500ff3ac2700f5b1bc9c761a0c87 gcc/config/avr/avr-stdint.h
7344d18acafd2951ffbf2c0a9f014f08 gcc/config/avr/avr-tables.opt
-c4c13b493b766197778c55301a2613e3 gcc/config/avr/avr.c
-14d8b02e8292c150bb47704e7442bc82 gcc/config/avr/avr.h
-1cc6502c3e804c18ea0d4e157317d782 gcc/config/avr/avr.md
+039808b0d14099c7c5d41b144f7db0f0 gcc/config/avr/avr.c
+9f36e271302a29de37eae1f2ce2b1b0c gcc/config/avr/avr.h
+e11cb18f03e4fbe2cd763d60120d2f50 gcc/config/avr/avr.md
421709cbe0735ad8406c0430cf5087d8 gcc/config/avr/avr.opt
d661391f9cbec6e8f6a68663a2f1eef7 gcc/config/avr/avrlibc.h
df7d2059ef5d7a0c8b8680202c92f0c8 gcc/config/avr/builtins.def
08dc860eb57f4234525d5a7c354e6531 gcc/config/darwin.opt
a58fdc493363dfcf3d26a22cbacc78d7 gcc/config/darwin10.h
8f2cdbd6cce4cf6cc3b6312c89ab384a gcc/config/darwin9.h
-3936580e0711aeda2dc1e0b4b6ad2eb7 gcc/config/dbx.h
+d52e26808053c62149da62094c2d53f2 gcc/config/dbx.h
6992e29d69610bac1fc942b933479a3c gcc/config/dbxcoff.h
799a2e144a506e2b4880dfe40e4e3241 gcc/config/dbxelf.h
c79e4c5a8e729a0c1c7b6f3a5723ff97 gcc/config/default-c.c
24c5f3a19dc3f8efde748b4e1fb28aa1 gcc/config/i386/cygming.opt
e21436b3decf985d45fcb3570935958f gcc/config/i386/cygwin-stdint.h
b8c56841226d00f3611e76df81bc1c32 gcc/config/i386/cygwin-w64.h
-a4281656c7c96108f69b4d49b64346bc gcc/config/i386/cygwin.h
+04d0e764f6744c7e9b76a39d0381d053 gcc/config/i386/cygwin.h
21dcaf77cc8fb36ae705ee603ce101e7 gcc/config/i386/darwin.h
f662aa7a9eab8bad5800512a3187b0c8 gcc/config/i386/darwin64.h
e7c8adf4ccaf394835acedd1e77b0be5 gcc/config/i386/djgpp-stdint.h
ed2a20210c9db85baa32cfae1070d72a gcc/config/i386/djgpp.h
b5c747e37b508b664a1ff09f6e55f235 gcc/config/i386/djgpp.opt
-8d3102a8b712400dbd808d9910635dba gcc/config/i386/driver-i386.c
+4a6351b62d521bfcc95294ec2e18673f gcc/config/i386/driver-i386.c
8ee7873e94be2782003bd626af507dea gcc/config/i386/emmintrin.h
c10561ee6fc509ac4572687dc0f67e76 gcc/config/i386/f16cintrin.h
301045a5d299805e520b98e6c019c4eb gcc/config/i386/fma4intrin.h
fbc0e51208d80f573c53d5b2172b2750 gcc/config/i386/i386-modes.def
1fc953e4fa5bc7c93802f7952b7dafbc gcc/config/i386/i386-opts.h
b2009cc823c7348862f1dd5b62268874 gcc/config/i386/i386-protos.h
-5a3d6e3603783530ff8af3cd36274b56 gcc/config/i386/i386.c
+e9f3a07488290b60468d00cb4d4565a2 gcc/config/i386/i386.c
cc283b2c0490928dcd63471d19148858 gcc/config/i386/i386.h
-f6762ecc5776c962f05fbd3d189a99b4 gcc/config/i386/i386.md
+9a8b89ee2e0d7dd72af72a78b1ccf641 gcc/config/i386/i386.md
8ae240f9350420a2a75307b02b20422a gcc/config/i386/i386.opt
ddbc3d63f2446262d897ba8f20043c58 gcc/config/i386/i386elf.h
c238f4d065449a93da6bce13121a2c3d gcc/config/i386/ia32intrin.h
02bfe0ac147bcb4c9f26f542a3ea1c3a gcc/config/i386/mingw-w64.h
666ec7e2e9890486e50762bfe1ca7c25 gcc/config/i386/mingw-w64.opt
d17b901c2f628cb44f5a234eb3572a92 gcc/config/i386/mingw.opt
-8d288d09714f4e79aae5458ef6848407 gcc/config/i386/mingw32.h
+17134943d15d722dccd7c33d27496b58 gcc/config/i386/mingw32.h
97f47580518fbe15e82cf9bd4741669f gcc/config/i386/mm3dnow.h
e4e116de997ab92599e67a55612e8c65 gcc/config/i386/mmintrin.h
6417b98a54d4b0b7a5161245196159f4 gcc/config/i386/mmx.md
208c523338e87e92859a61537a861ee0 gcc/config/ia64/vect.md
bc324d80212cb61b474b747b25885f92 gcc/config/ia64/vms.h
f81371dd35397ed28d2a17f175979e8f gcc/config/ia64/vms.opt
-71188f9c44228efe9db53d6fa9b491b4 gcc/config/initfini-array.h
+5e1cb7f2cd29907f552aec0922372fc4 gcc/config/initfini-array.h
74314035e956f32870e446464a93df0f gcc/config/iq2000/abi
3a99cc3eedb9706a5a0f28a23617656f gcc/config/iq2000/constraints.md
35560233ecd22b772348ed6390e163d6 gcc/config/iq2000/iq2000-opts.h
4772463c3b1ea64d84fc459630245dc6 gcc/config/msp430/constraints.md
81c5efbfbbf0226a94fec244522f0086 gcc/config/msp430/msp430-c.c
45e698ba893f440905885dced318b218 gcc/config/msp430/msp430-modes.def
-2725dd8935cc0b1fe508a73747bfee2e gcc/config/msp430/msp430-protos.h
-9cd05a6d3ab08982dab0bf70da241111 gcc/config/msp430/msp430.c
-b2e61ed52e0d72055c1528a3de95164a gcc/config/msp430/msp430.h
-4955a52bd8647e7a5ed0a596c1558c55 gcc/config/msp430/msp430.md
-b73015e7d728b07e82f86543b578c7cf gcc/config/msp430/msp430.opt
-271e888963ee26b4096af0f70230db1b gcc/config/msp430/predicates.md
+e343f3539654f52b3b9a63601843a705 gcc/config/msp430/msp430-opts.h
+da9601ef9725a1ac04f31f9dd8d88b8e gcc/config/msp430/msp430-protos.h
+aadcd4b51cd4514cb6acdc4ca347eaff gcc/config/msp430/msp430.c
+0463c9d12d75be3d5afb9d8da1286fb5 gcc/config/msp430/msp430.h
+8f40265829d17cd8fdbd4ec9094e3493 gcc/config/msp430/msp430.md
+8a2e57378fa5d5962cae3a7e95498eec gcc/config/msp430/msp430.opt
+1cfe9d75789557869da70353b1cafcab gcc/config/msp430/predicates.md
dc8043434cd35a5508738f23cced8f6a gcc/config/msp430/t-msp430
bef2e0bb04dc995149b8679834ba792e gcc/config/nds32/constants.md
d01826784eb6ec8ca848e65ac5584da8 gcc/config/nds32/constraints.md
c75989e8ba956b93961234f81b1b3e58 gcc/config/netbsd-elf.opt
439770d83eb126178684932270b50d52 gcc/config/netbsd.h
ec624b498a34279e8f982b29f9a338af gcc/config/netbsd.opt
-96fd04552b2b9c6a425b19257d11f244 gcc/config/newlib-stdint.h
+5c96f94f067df4c4104960c5000a2fce gcc/config/newlib-stdint.h
b7d976992060b59d0ef7031a94475df5 gcc/config/nios2/constraints.md
ef734234c709297b1fb7f68b54c6d3de gcc/config/nios2/elf.h
ddc88bf2b6aa464fe12463a0467299d5 gcc/config/nios2/elf.opt
a126c516a8ecc213c4eae1949e1a2e15 gcc/config/rs6000/aix61.h
7ba56f31fe475125fb79489a951e14c5 gcc/config/rs6000/aix64.opt
f99b25eefb9db62d51f310e5b787ff5a gcc/config/rs6000/altivec.h
-c500bcd8daa1df5dd882d5357386ea5c gcc/config/rs6000/altivec.md
+87ac343d66c31032b41c494d38ffb0d9 gcc/config/rs6000/altivec.md
87ecd670e3f1a8e2186f29d0b3ee3720 gcc/config/rs6000/biarch64.h
07348cec6e9bf39592be4fad5e165f02 gcc/config/rs6000/cell.md
f3ab2b31f64194613298ea7a70a5e4ce gcc/config/rs6000/constraints.md
02ca5caa36de5edf56fe24dbbda6b294 gcc/config/rs6000/darwin7.h
5cbd6ff218133094f33d29711429a7bf gcc/config/rs6000/darwin8.h
1d8de40ad03abb984184f2bd449a4029 gcc/config/rs6000/default64.h
-7a1401c61271d7d7ad136bbb68b29ea1 gcc/config/rs6000/dfp.md
+e0c3e640aac757ec2f33aee03cea2181 gcc/config/rs6000/dfp.md
2441ed646ceea5331ee440418bd26204 gcc/config/rs6000/driver-rs6000.c
c8949ac54fd92b36837415b4558f7448 gcc/config/rs6000/e300c2c3.md
1f15aab6bf2c740614cb66d636c01a19 gcc/config/rs6000/e500.h
f993244bbc210c86997e1f962ce62a05 gcc/config/rs6000/genopt.sh
46cf29a42c9dea21b80a0d2adaf86045 gcc/config/rs6000/host-darwin.c
49e9ca19e3ce57f746c48f645ddb6629 gcc/config/rs6000/host-ppc64-darwin.c
-cc22d9575e94320c4263739101254d07 gcc/config/rs6000/htm.md
+608b42e39abfee0956b074f3b05d898c gcc/config/rs6000/htm.md
fc49e7468c18e626771f399690584b01 gcc/config/rs6000/htmintrin.h
-6db289dd98c70ade92bc5ce741966238 gcc/config/rs6000/htmxlintrin.h
+ce27605188d04634347cddbe29359656 gcc/config/rs6000/htmxlintrin.h
94b9c339bd047a988fc31eeb870b056b gcc/config/rs6000/linux.h
a53d69dc8707272a24e28a74b326df66 gcc/config/rs6000/linux64.h
e8976be8a2c554ec952fa2578c39aba7 gcc/config/rs6000/linux64.opt
ecc63691ee399be45afbeb50ef539bb7 gcc/config/rs6000/power8.md
0eca30e0219caa2c3b9107b8a8934167 gcc/config/rs6000/ppc-asm.h
a399e486f9d1ec320a662bd4afffd037 gcc/config/rs6000/ppu_intrinsics.h
-034b4482bb5c43d49fe72d5ee86f5755 gcc/config/rs6000/predicates.md
-1e67b012ea1a2a9bc17967d0176399b6 gcc/config/rs6000/rs6000-builtin.def
+7b4965895e3de2671c0d4baec4bac25c gcc/config/rs6000/predicates.md
+a727574906ad78e966f6cf33cd1b9fbe gcc/config/rs6000/rs6000-builtin.def
e03a012414e4363cc0297e7022d3d17c gcc/config/rs6000/rs6000-c.c
b8e72be81712f25cfaede9887cc18d63 gcc/config/rs6000/rs6000-cpus.def
2b7ac7ddb1e383347e8684708991a45c gcc/config/rs6000/rs6000-linux.c
7d06c2b54e7e78a9a57c2f9719e0d468 gcc/config/rs6000/rs6000-modes.def
09c1fbf640b3bad5ae3bb2300301eaa8 gcc/config/rs6000/rs6000-opts.h
-1e962a6fe5044ba2cf188d320875649b gcc/config/rs6000/rs6000-protos.h
+cd5c5823d74d91e89b5cde321fa0a0b5 gcc/config/rs6000/rs6000-protos.h
91c3c0b251bd8b64407d2c54008592a3 gcc/config/rs6000/rs6000-tables.opt
-8e99fce650a2d7c4802477b619849298 gcc/config/rs6000/rs6000.c
-a3ad0b92d8a977d3b7d0cef20546c521 gcc/config/rs6000/rs6000.h
-7e0dd7ce95a25e8ce508d8f1d07e91a5 gcc/config/rs6000/rs6000.md
+846d98a534311ea7e86f0de8b3226f9e gcc/config/rs6000/rs6000.c
+9ec9d392b57323b58611dcbb490a1646 gcc/config/rs6000/rs6000.h
+d792d34d555de1d81a1d5c74fcacadf6 gcc/config/rs6000/rs6000.md
7343b7045580eba4411121ec1934ecad gcc/config/rs6000/rs6000.opt
4449f37807aeb14832c50529169a3ffe gcc/config/rs6000/rs64.md
f33e13ba9553f9dffed8aa05d8df34d1 gcc/config/rs6000/rtems.h
a9da2a60ceb8a34d28fd44dfb88da7f7 gcc/config/rs6000/spe.h
d8d983e9d6d999fdf563dfe20ed78474 gcc/config/rs6000/spe.md
1bd465f61447745c22afbe27e0f381ec gcc/config/rs6000/spu2vmx.h
-10a887e10132e9413706333244ff91d4 gcc/config/rs6000/sync.md
+a9f8e6036f73260991227c777d01a371 gcc/config/rs6000/sync.md
8a041c83cc607c42aa7ae7046df74070 gcc/config/rs6000/sysv4.h
7a548d9a782e0a42d0e7ff42a1f331b7 gcc/config/rs6000/sysv4.opt
3b9a0af37461971b0c7698f018bd13af gcc/config/rs6000/sysv4le.h
b1f48ff99abc14b3f61842bd2ad8cb9f gcc/config/rs6000/titan.md
0ac3e3c82b12030f8797bf598d14a7df gcc/config/rs6000/vec_types.h
afa1b08d7889dfa24025d27c5ebcf9d2 gcc/config/rs6000/vector.md
-619057d84062c67d970112fcf127b91f gcc/config/rs6000/vsx.md
+66ec4591374a2a54342c80bb63250479 gcc/config/rs6000/vsx.md
0c2404e4c53d11d18595ce802fcd85df gcc/config/rs6000/vxworks.h
5c2f724024335c015d76fe32d3da6de9 gcc/config/rs6000/x-aix
af875b9bcb1ec1da1f33d5e34df8ca7b gcc/config/rs6000/x-darwin
e921244f996542b710957fd7ab4e7c8f gcc/config/rs6000/xfpu.md
1efdbc0666cd2a766427ef67bbb15773 gcc/config/rs6000/xilinx.h
e7a35ee01feee949866704b0d05f7375 gcc/config/rs6000/xilinx.opt
-69d954922c9feecc81aa2cbc28850fec gcc/config/rtems.h
+4ef07d56945965286be56fe634c74660 gcc/config/rtems.h
4a81983fc5767ef847178b1c398fa112 gcc/config/rtems.opt
b883ac69b1a233fdf81421da26748b82 gcc/config/rx/constraints.md
e32f17005427bb0f246f390e31202982 gcc/config/rx/predicates.md
815bc614203e150615c85713d1aa605a gcc/config/sh/sh-mem.cc
ee56adc86b26db0a967855a075947e96 gcc/config/sh/sh-modes.def
e0d982724069321bc7bdc47869642298 gcc/config/sh/sh-protos.h
-ef9ef4706de1da43d91e1037839b9a2d gcc/config/sh/sh.c
+ca269f7f50036a7abfe4c200bef3b526 gcc/config/sh/sh.c
c4e8a30076baf764ee83c7a1427cad1c gcc/config/sh/sh.h
56bc2118729eb86840eaa403473be07a gcc/config/sh/sh.md
738c29389fcea942f96d0f3ef40b61f8 gcc/config/sh/sh.opt
ee1c8551d20bb54f9fdc06c861fc7855 gcc/config/sol2-10.h
b158f432118f2f65990ae38e82cfa8b7 gcc/config/sol2-bi.h
3d12d4d612066683f2ac724e1208053d gcc/config/sol2-c.c
+5c26c2321d68d4724b0d0076803c6b89 gcc/config/sol2-clearcap.map
+73dd11dea23019ab25cbbd70968694e7 gcc/config/sol2-clearcapv2.map
44524ef1851c8536902a3c853a673893 gcc/config/sol2-cxx.c
57069fdd8de13deb38e01e37cc05c6e9 gcc/config/sol2-protos.h
9d646f447e0e9cea13634ba6247c718c gcc/config/sol2-stubs.c
ec1cee3f01093189b897e121867d295e gcc/config/sol2.c
-eb380a1bc26c24f3ad116ebc0a888b6b gcc/config/sol2.h
-98c7dbec52fde3172cca4e3dacdc725b gcc/config/sol2.opt
+ee49a8b66dfe04b0950ae00082080a2e gcc/config/sol2.h
+64a06bd4f2ca96a9e838f41d637a809b gcc/config/sol2.opt
d376961bc8fba1465e216bf051d953a3 gcc/config/sparc/biarch64.h
62b3b82c1d92b5afde36be050abfcd4f gcc/config/sparc/constraints.md
ad6e28a5a103aa7f72a933222bffb3ea gcc/config/sparc/cypress.md
4c9272c156a54169682c4d78519e0574 gcc/config/sparc/sparc-c.c
fe11466ca359c98303d1d5a77efc7277 gcc/config/sparc/sparc-modes.def
b3a2f800b64aa009f99321dfb6a0f3b6 gcc/config/sparc/sparc-opts.h
-d293d1f15e3d50817d45094addc03686 gcc/config/sparc/sparc-protos.h
-cc83181bf17b40dacf1b54d35a524561 gcc/config/sparc/sparc.c
+10784bdb9b36f0c0d8072f1299f9fa9c gcc/config/sparc/sparc-protos.h
+80cf8d1da0e7beece46d81df37a27494 gcc/config/sparc/sparc.c
056e9cce1df0c82fbbf3df07ca8247c8 gcc/config/sparc/sparc.h
-1bc8e3f63a355025962c17184c8abf24 gcc/config/sparc/sparc.md
-1ecc43f754c828db35372a102bd69702 gcc/config/sparc/sparc.opt
+809a67243ab306f705824adc49250783 gcc/config/sparc/sparc.md
+0fc21233cd7245bdd222051524ce0840 gcc/config/sparc/sparc.opt
a4e9378ba096bbe768f431e5efe542fe gcc/config/sparc/sparclet.md
23633c532af69df48b8945cd85fa8e89 gcc/config/sparc/supersparc.md
-02061225bf4b9a7f1d10b8074a261c5b gcc/config/sparc/sync.md
+9a1ba094e19de6682a05f2e661b89991 gcc/config/sparc/sync.md
06afb5edf97e75d9c98bd0c7feee7ce8 gcc/config/sparc/sysv4.h
a833a63e73fa8b2cd6d957a7dba46b80 gcc/config/sparc/t-elf
c220a70c033b2f3839f5da1eaf86bd51 gcc/config/sparc/t-leon
fa90d7365d19dbaf3cae61e13de2e767 gcc/config/t-pnt16-warn
501751f2be56698ed1c9cf18358b67ac gcc/config/t-rtems
51d3678acb41d4448cc332f7a8e8cb2e gcc/config/t-slibgcc
-4f7c6ccc905067d90494d4d1bb45d388 gcc/config/t-sol2
+e6a92484ed674b3c3213e4cfca07314a gcc/config/t-sol2
e05234e1ab29a8bd1212092f1bcd5a74 gcc/config/t-sysroot-suffix
d5bba4910d9cc9e902bff4cc8feff8e0 gcc/config/t-vxworks
20ed94baac64f4265b79ab4e13487e16 gcc/config/t-winnt
a6ae71a556271cc116214b3e9e87d867 gcc/config/usegld.h
aa217ffcab0f4b76c0459717934d5bda gcc/config/v850/constraints.md
3cb04126d779bc8a345b096d09d757da gcc/config/v850/predicates.md
-19e23482aaf4ca61eece1fea5a23c518 gcc/config/v850/rtems.h
+386aa2cbf18ef45000390ccf1bfb5867 gcc/config/v850/rtems.h
41b5d5e91cc905b1e3ba5de47db5f9c6 gcc/config/v850/t-rtems
66ab7b7fe2255c165f979e2b216bd8f7 gcc/config/v850/t-v850
b44b30ed33b02ca0176533d90957b282 gcc/config/v850/v850-c.c
11a7e98cb745eec186b8a9471f8c55e3 gcc/config/v850/v850-modes.def
-4883b298bdc79ea42637897927fed567 gcc/config/v850/v850-opts.h
+595422e67863727481fd0af4e07d6017 gcc/config/v850/v850-opts.h
bb76cf6465c78874169453c0c1814c1f gcc/config/v850/v850-protos.h
3bd8de8345980d16a3939ac539aee1a4 gcc/config/v850/v850.c
-2cc37b2d1b50b3aeeca4f76a6febaaee gcc/config/v850/v850.h
+d2a472a98b954b3eb4d5e6ccf30f985c gcc/config/v850/v850.h
a738c0152bc53c7ee18acf62857c95c0 gcc/config/v850/v850.md
0178572afbc1cc677bf4ca8fea8a70d8 gcc/config/v850/v850.opt
4851493966cb69d11eca715575900ccb gcc/config/vax/builtins.md
3403522b62b3afbdee0c6ba1c08dd9b5 gcc/config/xtensa/xtensa.h
d0f70581147ddc12bdd0b9b2002099f9 gcc/config/xtensa/xtensa.md
3626e5875265724499b1e0889df223f8 gcc/config/xtensa/xtensa.opt
-8100621be2c42a551591323bb0dec425 gcc/configure
-8ff785664c06b5945215ea6ed1108f6c gcc/configure.ac
+df9f37510364953e4b1a74fddafd5b0a gcc/configure
+0d863d1fe6d29c2d394c25cce860c6db gcc/configure.ac
3f8600d94fa18c9df14202629b15c30a gcc/context.c
a105f73fec5a545a02b66e02a5fc9cd1 gcc/context.h
ad2e5674b80419b7901057a9553438d4 gcc/convert.c
7f281fac897d0a12b476c90692737329 gcc/coretypes.h
77f22f105dfdc4a9829de4737400fdc3 gcc/coverage.c
fc0ea61bb4cd0e88fcb974874b454f63 gcc/coverage.h
-96599999d0dbcb083641d0fbe78a27d6 gcc/cp/ChangeLog
+90620d6f2e242e28c716bcbcf0182a93 gcc/cp/ChangeLog
d271e3663538ba1f3281cab3838e92cd gcc/cp/ChangeLog-1993
f5a44adbc05521162350ca409d1d95ce gcc/cp/ChangeLog-1994
ac55db48d964cb5469ff03c1cd3ee04d gcc/cp/ChangeLog-1995
9aa3cd9f75c785de9f51446e3f295515 gcc/cp/ChangeLog.tree-ssa
455a052c3ba589ded45beac207aae43f gcc/cp/Make-lang.in
2a39a12cc0dff2b94a44e84e818ded9e gcc/cp/NEWS
-1ed220fc9a91b1e2d8055ed57c933c8c gcc/cp/call.c
+795a3e86d150ac6ff6ed2e3258814e1d gcc/cp/call.c
e184e53ef1c7ccede7b4257052006bd7 gcc/cp/cfns.gperf
66d1092c8be3fffdb7372b46a158ebf6 gcc/cp/cfns.h
-910d44b3e4d1a6bf0e9a3c7dc0598bf9 gcc/cp/class.c
+466bc9f5ef4f8ea3fa10ef2564ea741d gcc/cp/class.c
47867890c0979e43203ac3b48152e806 gcc/cp/config-lang.in
-cc75be02c3d6f7f9c65125374c0b0401 gcc/cp/cp-array-notation.c
+6720d2dc0ff79c80bfee1d4a8e7fa99d gcc/cp/cp-array-notation.c
65ca14f2797c64f59cf5c6eab039cb48 gcc/cp/cp-cilkplus.c
-5c48807910c8c81287605f0dbe305ef0 gcc/cp/cp-gimplify.c
+fc4f4b0510305904f62be76691665660 gcc/cp/cp-gimplify.c
c0aa2580eac480bebef90fd178f23fce gcc/cp/cp-lang.c
ef87c1a033a26e7711907c6b178131b1 gcc/cp/cp-objcp-common.c
9eada522ec909990ce7386714e3c0afa gcc/cp/cp-objcp-common.h
d0d99db987a2bd8f0058a1faa5e408e5 gcc/cp/cp-tree.def
-a3688644c5783e84d0837702adf6d30a gcc/cp/cp-tree.h
+b0c697bcecdbc809a26b1fb7e2fff828 gcc/cp/cp-tree.h
2d310182ce712621a1c231f8d3450154 gcc/cp/cvt.c
72aec02508b7947aa57a3fdc7907592e gcc/cp/cxx-pretty-print.c
80ee86746b2127c64ef5c25f24ceb14b gcc/cp/cxx-pretty-print.h
-dd6792a8e6b84dd56b7ac60b97f97e9f gcc/cp/decl.c
+31f4146c017a869e65caf3540a83dee2 gcc/cp/decl.c
42cc7ee1282351aee587814acc597508 gcc/cp/decl.h
dbc65ed107b0f033dbc47a1901d3c6be gcc/cp/decl2.c
3f6c50620d2953d5b412ff4e390eb7ae gcc/cp/dump.c
-58e4348d50182a6fa678f3d6112d86f4 gcc/cp/error.c
+4f563217e305eef8adde18a3b3d0c547 gcc/cp/error.c
615a63805536eb9ffe1b46dd1881582c gcc/cp/except.c
eb58e03f4b2c41c5e089789e2a83f27e gcc/cp/expr.c
f825a4855a4c9f2390afb1302bb4d8d6 gcc/cp/friend.c
4e1f37f96a3d7f70ba70e24cba59dc3a gcc/cp/g++spec.c
-a5dabcb829765fe2506fdfe679534cb1 gcc/cp/init.c
-0bb50f920201a7665c66a8b34c1dbbad gcc/cp/lambda.c
+a1474fb450653b16df8e80f1bb84d9b6 gcc/cp/init.c
+be78b35f070bd7382c2233ae8aada26b gcc/cp/lambda.c
d505a249800c51140eb8d126b620394f gcc/cp/lang-specs.h
a9d9b7c8443dcc78573259632806eb39 gcc/cp/lex.c
-2c850a80db903247f001008baf357822 gcc/cp/mangle.c
+a4fd8479abffd3cacada620714d9306b gcc/cp/mangle.c
a331b4a15818458a23cced154db41740 gcc/cp/method.c
88641563e2d3f64a95da6434ecf8de00 gcc/cp/name-lookup.c
2fe9fc47b363db0eb4eb053c2b3b5109 gcc/cp/name-lookup.h
a4c4160079301223008ae949e923ae09 gcc/cp/operators.def
cab3f4d3911d5d98b499168510c420bf gcc/cp/optimize.c
-2da908e5f3db5d3a3aa0afe175078c9b gcc/cp/parser.c
+15fa1ea9b2ad4a1adfb7603af94a593c gcc/cp/parser.c
7dad8f7951a41247d36a1491c5ed3333 gcc/cp/parser.h
-74b0261982aec2eeb078b2eb670ffb00 gcc/cp/pt.c
+5d73a0128142b13861f975e7d63a9e59 gcc/cp/pt.c
1fb212eac0559ba1dcb95d7a26602e06 gcc/cp/ptree.c
da1e4054f89a7112f63ce85825932ca5 gcc/cp/repo.c
42e298dd7b029109771b91c2ed2adaec gcc/cp/rtti.c
6fb2431ec9910cb53f58bdbe3bff5f70 gcc/cp/search.c
-fd23ab9c86b9d7c857c0440da98be254 gcc/cp/semantics.c
-b1bc4d92bafd656e405c2a58d608378f gcc/cp/tree.c
+868801964bdaf1d008e2998cf969f64f gcc/cp/semantics.c
+1110b6600e0b29cc8cc3b9a534f3a4c0 gcc/cp/tree.c
1adee27afd0240132800372d13882a94 gcc/cp/type-utils.h
03213757a1dd8df87d0616f27d88863d gcc/cp/typeck.c
-eb3af5ebc8aeeffe9beaffbdef78ca84 gcc/cp/typeck2.c
+60b85f3b47168c08433dbcdaaf8ccfe9 gcc/cp/typeck2.c
74dbaaf0e744d50ebddff66290b3dfd4 gcc/cp/vtable-class-hierarchy.c
c69f7cfa3152c54d30a4413e74a55584 gcc/cppbuiltin.c
3ec7183b5a34a0f3e00a2f1e80b9b1d4 gcc/cppbuiltin.h
ea862db8f1c974282768561f5c6fd263 gcc/diagnostic.c
a82f4c29248edc233f641579ab6e772a gcc/diagnostic.def
439f0d28ab1a85692b11ba394cc4e6f6 gcc/diagnostic.h
-4fbbb71db1722ae5342765a0b1fbc441 gcc/doc/aot-compile.1
-a4f5d332dae4a0fd204d8bb28855e9b0 gcc/doc/arm-acle-intrinsics.texi
-8eddcd81550867f0cb449d6d2643e9e8 gcc/doc/arm-neon-intrinsics.texi
+2072ae7c6f8a0f7b3d208c76341f52d1 gcc/doc/aot-compile.1
+2931c39155bdab807e1af465d937350c gcc/doc/arm-acle-intrinsics.texi
+35b6982c7c5b95341a6e28476e4d1daf gcc/doc/arm-neon-intrinsics.texi
9afccee176594b00a1b7a15878bebcd0 gcc/doc/avr-mmcu.texi
e1ac881d48757e37668ade03bed6f6d5 gcc/doc/bugreport.texi
b57b0997377249aff11e6fcfa9c47200 gcc/doc/cfg.texi
429106f28aff7ad80a86d1442fb5003d gcc/doc/configterms.texi
3c64bdb237b5fc38837b9b9bc2fda853 gcc/doc/contrib.texi
6436407c42cecb738124becb9079d978 gcc/doc/contribute.texi
-34436461cdc0c7ecfb7a40b5e686e422 gcc/doc/cpp.1
+d437ef65bb5ccd3d76933938e4e08c3b gcc/doc/cpp.1
b466d87d5a11bb0e1bea3a60a6645b7b gcc/doc/cpp.info
7787bf2f2843f9e075dcabc3ef549147 gcc/doc/cpp.texi
4aa9560d9a516a5df4f7429c00ba1fb2 gcc/doc/cppenv.texi
d1619b326f23a607e6cb3a044afcc4df gcc/doc/cppinternals.info
ffb92a322644e39300d1398a048cb9a8 gcc/doc/cppinternals.texi
249506473d9c4b6f20554997a9c8946f gcc/doc/cppopts.texi
-9e34dec3b954fa18067e8949ca9a910d gcc/doc/extend.texi
+735f272973eb624ca2b27256784794b1 gcc/doc/extend.texi
5ee3105f6fb685feb1259931acfbf79e gcc/doc/fragments.texi
de203f1fc34a4d519c489d06bf46b2bf gcc/doc/frontends.texi
-556f499f2c221eff6a35c3b745af786c gcc/doc/fsf-funding.7
-952529ddc42e4badf57f5480f1a7ea68 gcc/doc/g++.1
-9effbde8fcf02bcea835284372237e5c gcc/doc/gc-analyze.1
-952529ddc42e4badf57f5480f1a7ea68 gcc/doc/gcc.1
-9628abd90c18f277c0312630a7400a77 gcc/doc/gcc.info
+a4cb11efeaf4bf15da2f1eed8f9e0fd0 gcc/doc/fsf-funding.7
+6d5daadcb08541e624f682345a1ff88e gcc/doc/g++.1
+a16b8f53d26e7577a736a15b6c072667 gcc/doc/gc-analyze.1
+6d5daadcb08541e624f682345a1ff88e gcc/doc/gcc.1
+4c8beb4866137f568bdefc6c862e00d4 gcc/doc/gcc.info
8daacd29f48167f6b49255b6c181b9bc gcc/doc/gcc.texi
-b821f76036a460788a4f67a985b06c72 gcc/doc/gccinstall.info
-c0218512e3fc985d93bf9beacdeec227 gcc/doc/gccint.info
+06c87b043578cf2fd323918518aa0053 gcc/doc/gccinstall.info
+4ac01439178dd157273447b66868dc7a gcc/doc/gccint.info
7911949acb880ae16515d7ca0ede3d9a gcc/doc/gccint.texi
-27a20c84ea29cb25e1f558e3c2b0fdc2 gcc/doc/gcj-dbtool.1
-558701264335d20a6dafb6f544251958 gcc/doc/gcj.1
+fd5d56a283c84be92c4e1d183d7cba73 gcc/doc/gcj-dbtool.1
+886766bf5b708c772ddaf91fcc346354 gcc/doc/gcj.1
aab4d3dcd1960876e4dd2744c0595107 gcc/doc/gcj.info
-a2aaacd8a4504c1eee42040c6d62d982 gcc/doc/gcov.1
+a34f1de7370f9812f9d7f4020fec0ffc gcc/doc/gcov.1
7a35df8cd0480abb695958df18ea6134 gcc/doc/gcov.texi
5587ca6c5976c7dffb318cf45f5b7f13 gcc/doc/generic.texi
1ded054093de910d9786c62bc4fe8cc6 gcc/doc/gfdl.7
-8867d9d5f00d2c3424fcc1ec15d11b36 gcc/doc/gfortran.1
-0b52eeba46e08a404b1efdeb0b73b3d7 gcc/doc/gij.1
+6bb57be9521f2b036ed5d2233cef7068 gcc/doc/gfortran.1
+efde45760f6dd331477c8fa3939c8c65 gcc/doc/gij.1
ac25ba9af042d4f99e0ab97a4f46517a gcc/doc/gimple.texi
290370669f02bef1502ada9273e5261f gcc/doc/gnu.texi
-0066e0767ad465789161865c43ff33b5 gcc/doc/gpl.7
-ef92b0edb983e1c4330f56fabd877997 gcc/doc/grmic.1
+35bdf87669d3e58fabb135fdd83a6704 gcc/doc/gpl.7
+147ed9750a2dff72fc62d4e6f78cbe17 gcc/doc/grmic.1
f2dd6df88ca65026d154f628ffbc8f13 gcc/doc/gty.texi
34a1955f331ff1028e09083a178c0418 gcc/doc/headerdirs.texi
a56cc8baf1b35fa5c4c43bbfdb35b74b gcc/doc/hostconfig.texi
5f5adc2c6c4ebdcf03cc0125250f5995 gcc/doc/include/gpl_v3.texi
73819b3930a3d4be5d6234070d02386a gcc/doc/include/texinfo.tex
ca81bf9d3358342ef978866b6895f4ca gcc/doc/install-old.texi
-36a705ad4747c9ba42a38ddc6b48480a gcc/doc/install.texi
+c53e675d2246709e75ea2f39f3a85b1a gcc/doc/install.texi
8851ed69b0a7490fa673efa763d090c7 gcc/doc/install.texi2html
f1aaec9eb4571d731a4089d5d5ef97fa gcc/doc/interface.texi
-1ca8071afee5c71cd6b887cc9411c03d gcc/doc/invoke.texi
-b5321deb87587779b8fa0e631185b29b gcc/doc/jcf-dump.1
-dcda92a48788754d1c476e86dc371535 gcc/doc/jv-convert.1
+308f00964d73903162d4703cf5802c1f gcc/doc/invoke.texi
+8b4286efc56335723d2be45a2ea1a3ef gcc/doc/jcf-dump.1
+d12c19c779a2a6a75c8329b054f080ef gcc/doc/jv-convert.1
c36b6709dd343cbcd4b54f0417bcc780 gcc/doc/languages.texi
2ae9a3e90fef1d92ab8196ae773a7673 gcc/doc/libgcc.texi
8b58315c921fc046e0ab6f949ebd5990 gcc/doc/loop.texi
f9f577785f8eae98a97b29568343be95 gcc/doc/passes.texi
6997cbfce5b82226e56271f7498697f5 gcc/doc/plugins.texi
914a3d181f9c38ac74e424d667026b61 gcc/doc/portability.texi
-d56bb820227b6cddf5dbc9f246f8df6a gcc/doc/rebuild-gcj-db.1
+a8566a07a637ea1a56bb0bfd084caf94 gcc/doc/rebuild-gcj-db.1
fa0276a6b5d315ae4e036add235d9b26 gcc/doc/rtl.texi
3f5d8a76a7ddd984603fb2f35ee46632 gcc/doc/service.texi
-5c68a874833d75649dad867b1c5db296 gcc/doc/sourcebuild.texi
+affb8b02a41ee94557fabcdce8048ce2 gcc/doc/sourcebuild.texi
80f74ac416390bd73b75ae93f1f2f8f8 gcc/doc/standards.texi
-95089e28a67d22186f3190775ec30f42 gcc/doc/tm.texi
-bd168a92c3471828c75208e25c6c6ab9 gcc/doc/tm.texi.in
+24a01a8bb1b86882ac27a90fbb507fe9 gcc/doc/tm.texi
+eed8aa101de465a7cd9c6aaa39f3f325 gcc/doc/tm.texi.in
2a0f462c8ac98826cc19fc71f6f09014 gcc/doc/tree-ssa.texi
f173054a88e0b97206d03f926b8bd696 gcc/doc/trouble.texi
b40aba636e9d9d23b966bc47f50ca0ad gcc/dojump.c
1c73909bd45b22ed2b016ad5fe3afca4 gcc/dominance.c
060582ff73194daaccc8cbe92add257a gcc/domwalk.c
297c055c19cbb073b385bb9443fec98c gcc/domwalk.h
-f79339a7902d370cae0f3c87986c844c gcc/double-int.c
+2e57c82dbd0e91dc5b2e7f8b275f7eaa gcc/double-int.c
9d7f6889e84a85a6aea3abb7201f6f04 gcc/double-int.h
70c3e303b842357f48e72c0b9bfb1d9a gcc/dse.c
1a746ea442089d7bdcdbf56af69a5b3e gcc/dumpfile.c
7aca1d34836c11d9a7af3c4f2e2899e3 gcc/dwarf2asm.c
81e5a5988d94ef1528027be5136860e3 gcc/dwarf2asm.h
42be1d7e96240ac3e4821237d124400c gcc/dwarf2cfi.c
-1a7c6bee2883034efe9eecbe42fb84a1 gcc/dwarf2out.c
+07c67d8b1760bd9bcd577d65397c530c gcc/dwarf2out.c
140d11658ba70cd9c582828aec6fb9d2 gcc/dwarf2out.h
e175f4e3ae8843610ba83ab88ac7c7d2 gcc/emit-rtl.c
c6455a67ada52042bea5f8bb117dcdb4 gcc/emit-rtl.h
24bbd090dbec005ad3793cae5f7e4e19 gcc/except.h
589e62819b3e668ae01defc5f5fb9ad5 gcc/exec-tool.in
a38616b15259ffd2171e03ecb4249502 gcc/explow.c
-ba1da1bfbb3288c8e6b89aff8c9a60dc gcc/expmed.c
+6459d443bd65bb4141a7d815b3d249ab gcc/expmed.c
71dcf205388e1d671c2d94a0d4a3c735 gcc/expmed.h
debe880cf639de262487698963b83b80 gcc/expr.c
d6416980df886e494b49961d4b3a9984 gcc/expr.h
e273344d3f81a5d94a7296a6f73d4599 gcc/fixed-value.h
84141e938faf8046cbecad04e080660d gcc/flag-types.h
927cde0489c22a941e547faf5ec11e50 gcc/flags.h
-bfa3c33b1a9c0b95a8b41227093171ef gcc/fold-const.c
+1b57a0120edfc1608920462a921aaf23 gcc/fold-const.c
926e7b21d0de960d055e2f98520491fc gcc/fold-const.h
-e3feb37017ce740135780b8149ebd3f7 gcc/fortran/ChangeLog
+f131cabe354c5669ae64aff678aa170b gcc/fortran/ChangeLog
3330102ad3a0217cba963be6b5eefd58 gcc/fortran/ChangeLog-2002
d000ab985b1eeb1ad5749f98b8fef99f gcc/fortran/ChangeLog-2003
bf42f94f0c51dcc7d8051cc7fda1efdc gcc/fortran/ChangeLog-2004
36047e58fcc2b326025fbf4851f809d4 gcc/fortran/constructor.c
ed4dd7bfb8f8c9f4cedd1f0d2943c8ee gcc/fortran/constructor.h
cdaada96cc92b73b8913f00cc371b353 gcc/fortran/convert.c
-359a334754a0cfbcc6d62e7fe9e242e5 gcc/fortran/cpp.c
+6a25f41ae4ec5f67345432aeacf0f43a gcc/fortran/cpp.c
87a07a13f25c3ba29526f7ff92badbda gcc/fortran/cpp.h
102934decfedea4b5a61c7e853023a49 gcc/fortran/data.c
b94dc1f5d1792f2e58b16f6fbdc3a709 gcc/fortran/data.h
-5f3d1f6ed0f06404fa0f04e3a077518a gcc/fortran/decl.c
+48ddd8ff961f12e5aefabf1470db4d8d gcc/fortran/decl.c
a13d3780d602ec99bac64635a2472427 gcc/fortran/dependency.c
c868d6d4a72cb319fabcfc59e4613fe7 gcc/fortran/dependency.h
-46c026bdf88def19657fa0fae2a1e2f8 gcc/fortran/dump-parse-tree.c
+17fd0657b5dd0ca2bb20d1ba3db84cdf gcc/fortran/dump-parse-tree.c
9499ec386ee632269bb460fc37b41279 gcc/fortran/error.c
d321ca0b46df45c3fbc073dd163d4647 gcc/fortran/expr.c
-ce6133a52a0fa6aec2a32bbadf2584bf gcc/fortran/f95-lang.c
-35359335a2a4611a4bd39850e837d3fd gcc/fortran/frontend-passes.c
+dd44a696cb95e5fca9e2493dd2b52a88 gcc/fortran/f95-lang.c
+d8fa3c5a71b9f5796eb606142df801c6 gcc/fortran/frontend-passes.c
0a038b837897c57a2b48cc83a3475346 gcc/fortran/gfc-internals.texi
-c19efada195a0808eff058dffb8dcdc8 gcc/fortran/gfortran.h
-b3c9192114aa576c4b1e37059b7ddc4c gcc/fortran/gfortran.info
-01b74d2257b39a5e878d0d02c961bc24 gcc/fortran/gfortran.texi
-1f64ebcbca965051ff328411c4a95624 gcc/fortran/gfortranspec.c
+8c1807f6710f9637de8d7c8da006d0be gcc/fortran/gfortran.h
+7a0fa8aa41d8ba8c9eea6e8f3ec87c26 gcc/fortran/gfortran.info
+938a524e09245e10fbef5b331f81fc45 gcc/fortran/gfortran.texi
+61383efc0d8e4f11fde1c9811c151797 gcc/fortran/gfortranspec.c
afbe567cd3204e53be6fbcc32e82e7c1 gcc/fortran/interface.c
aeb5696e9535c471d020d3c251c2d89d gcc/fortran/intrinsic.c
b32d2f0f3daa0209977368544f5278ef gcc/fortran/intrinsic.h
-f45dec0fb53c4fe3372cea348cbf7c20 gcc/fortran/intrinsic.texi
+9733ca3ef7f8ba540f3d5bb8f18f8f28 gcc/fortran/intrinsic.texi
ff09ef92d4e445cac44eee1e2a4a5191 gcc/fortran/invoke.texi
d3a2af66f4e1d3472664c1d0ec0bfea9 gcc/fortran/io.c
aaa0bd487c1196f96642d9c0d89f1960 gcc/fortran/ioparm.def
d10f92a8dc76d707df09ce50fc002ab8 gcc/fortran/lang-specs.h
bfedddb0e2a4e4d591242403a998177b gcc/fortran/lang.opt
f6dbfc92520c8224ad6af651606bf645 gcc/fortran/libgfortran.h
-dabfcac403e2f9a3635d051a434f4b67 gcc/fortran/match.c
-87c5e85360d47d9a3e9c44e689cc164b gcc/fortran/match.h
+5e48ec3fb934d950d9d4b474e998763e gcc/fortran/match.c
+a778602b7553d8c2a08d457710752041 gcc/fortran/match.h
a3d130b650f04e28104a3180689841ae gcc/fortran/matchexp.c
34817057427c24c69e4e7146fe26f75e gcc/fortran/mathbuiltins.def
e0fb4a1ffcb0343a20358ac7e9e3c259 gcc/fortran/misc.c
-ec92e27fc479d48e62b2685f31590d47 gcc/fortran/module.c
-dac352ff9fcc0629ce1b395753c19cf9 gcc/fortran/openmp.c
+ffd8bfce5f606751b4c433c9dd3e6cd2 gcc/fortran/module.c
+199d16240d064bb53966d66f2a542e12 gcc/fortran/openmp.c
f51d0e2eedb4abe7296518a55e09ca88 gcc/fortran/options.c
-9ddf6b1c7e1f71ab06663ea220fce3bf gcc/fortran/parse.c
+fc32c460b6cd9b3d248899bc6b084896 gcc/fortran/parse.c
6d0ad629aed04bdd74a9574a8bf4846e gcc/fortran/parse.h
fd7c4ac7c689b6a4fb90173f4133229d gcc/fortran/primary.c
-2894d407b715abd8941c0bc2e50afda8 gcc/fortran/resolve.c
-1034f94bfb9742bd1a794e92c5a75ba0 gcc/fortran/scanner.c
+ad6b0d5e1f473cf51dfb2ccebbba787c gcc/fortran/resolve.c
+9adf6905ca4673ba2fbf9cbbce54892d gcc/fortran/scanner.c
72c90bd863614df8517636fc47ccfc94 gcc/fortran/scanner.h
efa59c20588f8cbfa50de0c93a7eef20 gcc/fortran/simplify.c
-71985d0e3c14a6c71342913878c5a10b gcc/fortran/st.c
-4e0587f6c37c4220f168f8e854b6a5fb gcc/fortran/symbol.c
+e45fb97ea95ff4c3d74a0fbead1f06f9 gcc/fortran/st.c
+3871370aa0e7f7c7501c633d4e561739 gcc/fortran/symbol.c
18b66b03bc5d661f80bb81b03f388eb9 gcc/fortran/target-memory.c
2b15769f79ab3546bef45df0d6815e2c gcc/fortran/target-memory.h
-a7eb491b89c92e23b122f0cc6f162d49 gcc/fortran/trans-array.c
-420d334293cbc543a1986e5160791e87 gcc/fortran/trans-array.h
-42d8eb5427146efe747093a654b07ae3 gcc/fortran/trans-common.c
+9c3c626677d3cea17fbe4425bb18990e gcc/fortran/trans-array.c
+fb993a92547683640f7a49d6dd5d0cfe gcc/fortran/trans-array.h
+6f0a3ffc5ef85f6a9f67c1deaed718de gcc/fortran/trans-common.c
ad554dd79e97690c9fe5ce1779a7309c gcc/fortran/trans-const.c
a3ccaa77809b6dcc6aa42f435c57e3f9 gcc/fortran/trans-const.h
-68e62222bd1bfcd19a15dd8a8ca89e63 gcc/fortran/trans-decl.c
-8f2eac3cc158380deeb06b26ab692dc9 gcc/fortran/trans-expr.c
+f2e437a45f5c0d06e691752db2c1435f gcc/fortran/trans-decl.c
+6499eb348141916fa43d136bd292ca8c gcc/fortran/trans-expr.c
6ea2f877821771858978645b10ea08fd gcc/fortran/trans-intrinsic.c
b47cd6ce04818d16aea2c2442ca82278 gcc/fortran/trans-io.c
-082a60082cecb215d1b7533ce216e3df gcc/fortran/trans-openmp.c
-b7c2b183ea4cfd09ce04a4730c28ddfd gcc/fortran/trans-stmt.c
-c1f84f4dfcfc80070abd0502517f639a gcc/fortran/trans-stmt.h
-4a39b718d97e5fcd9d95a339c9debbff gcc/fortran/trans-types.c
+e8d1e2d01ed7c8c15dd07675a0897f7b gcc/fortran/trans-openmp.c
+6374bfca10befeb53e5ca4d22322b56c gcc/fortran/trans-stmt.c
+716b10c08519c671b98c6434e2214353 gcc/fortran/trans-stmt.h
+5147544dd813385df26d0ac0f51948fa gcc/fortran/trans-types.c
24e41f2179047fd847c46da3cd1c024c gcc/fortran/trans-types.h
-b4b84e3d822e739b0fed290ee12e2300 gcc/fortran/trans.c
-2e65b0f18a310ea59273cd8843959d66 gcc/fortran/trans.h
+51ee928eabf49de99a0d7e6578e236a2 gcc/fortran/trans.c
+3123832e121f344eec0a93415ec4c20d gcc/fortran/trans.h
95c41d60adaf583210f110d0984098f7 gcc/fortran/types.def
97b3f764fb651e1611194a18dbcbe3d3 gcc/fp-test.c
-bddd0259c8e15cb6bdcf23eb23190940 gcc/function.c
+4ea4072a16caab2b6332ebaadaee2f38 gcc/function.c
fff264db5393a59b9a99c486322b73f7 gcc/function.h
cd8ce281b668e13a32e83cf20a1634c9 gcc/fwprop.c
818a31d5b690a29005322b5357c9f908 gcc/gcc-ar.c
433eb66f3d010864a76c754d81db24cb gcc/genextract.c
fe4697f2b98c57d9478b6bb7a7ae2e88 gcc/genflags.c
e041d627ebfb410e6ac9821a3ebb3d42 gcc/gengenrtl.c
-9b8f0d2f17c80f6ff5fd6319f7369382 gcc/gengtype-lex.c
+e029143273161cfc842f402872ede845 gcc/gengtype-lex.c
689319748dcd572b0d864e2f427c5ffa gcc/gengtype-lex.l
cbbcd3bf3726ae98ca84780142a68208 gcc/gengtype-parse.c
4eaf2d492394ef805a5d5ae40b3405b1 gcc/gengtype-state.c
b2116458d45929978ab35d0063286333 gcc/gimple-fold.h
0fe61c47348d45f1c4d1c2f982b1e449 gcc/gimple-iterator.c
17559f5a410f8d50a42723d5e5e0bc71 gcc/gimple-iterator.h
-d5b3c841aa21c9571759196e5299b4bc gcc/gimple-low.c
+5003f659d2dabc1078b9b1f733dea592 gcc/gimple-low.c
7acad740b79bb8d5813ca5adaed51ea9 gcc/gimple-low.h
bce8302c35666fa97812af572784ddb4 gcc/gimple-pretty-print.c
fd36993cffdf23f8818cd5ab8119f9ef gcc/gimple-pretty-print.h
a55e2dba541a5690618f749ab8209b06 gcc/gimple-ssa-isolate-paths.c
-3c7181d1dd3aba8a2e25d2612ba3cc9f gcc/gimple-ssa-strength-reduction.c
+ddfcd12ffaa58e2c4343f8868d646bcc gcc/gimple-ssa-strength-reduction.c
65c5fd48c73569d5d8c6cb61fa000a0f gcc/gimple-ssa.h
05ea5f1994babea73ca748acd5ef37c6 gcc/gimple-streamer-in.c
d27ff703db577eb6b990d1d617cfe155 gcc/gimple-streamer-out.c
e59654c510717f38e5835473b88512f8 gcc/gimple.h
79b09968dccc8cd8a7a3bd3b2449b1b7 gcc/gimplify-me.c
0fe03cac0c9e29cc1e32425f09eb2c17 gcc/gimplify-me.h
-b70a6f4bd27f94701ed6a838e70ce584 gcc/gimplify.c
-37ff4336f0f0ec290f8652bccd3ba720 gcc/gimplify.h
+a9d1a518623d40e08ef02e39d4ebdaa2 gcc/gimplify.c
+331c48030a046b27a704925015fd1649 gcc/gimplify.h
2ac6b57e8aad060fa48b9a8a039a708a gcc/ginclude/float.h
a610d6820fa8bbb9030d13a1dcd4ee52 gcc/ginclude/iso646.h
6433efea489e00fb72b79d0db6179e90 gcc/ginclude/stdalign.h
d699488411097f968823f9f7e77d33fa gcc/ginclude/unwind-arm-common.h
8d9ecf0d6ef93c79623ce1d27a32a2cb gcc/ginclude/varargs.h
d0018c8b069fef23a59561ff2f8dc915 gcc/glimits.h
-84a3c830762454edd2d7436084b3fa90 gcc/go/ChangeLog
+a277a575bf893dc8df4230bc554357b1 gcc/go/ChangeLog
84d2ef4a6fee7df8a45a370a6b605aae gcc/go/Make-lang.in
60ea054548c83c7f66170073f9f3e74c gcc/go/README.gcc
e6bece4f0caf0458c84d9b29ca0de83e gcc/go/config-lang.in
2a2578ae2b3378d37d61324c02656e27 gcc/go/gofrontend/gogo-tree.cc
fbd5ef95dfe6c1db3cd54ba4bc33109b gcc/go/gofrontend/gogo.cc
e33b0b4c9d13b6266a694e094d738133 gcc/go/gofrontend/gogo.h
-a54db7e2c0bee63493b5e156afd1e29c gcc/go/gofrontend/import-archive.cc
+19530349ffce8b937ed080715e7442d8 gcc/go/gofrontend/import-archive.cc
499fe8bccdd0651f0566d8c145b8d5f7 gcc/go/gofrontend/import.cc
46ea027bf693486499d4396551ed674d gcc/go/gofrontend/import.h
-33c61fb692bc083f4b5774ea4325871f gcc/go/gofrontend/lex.cc
+0d90ebaff0c2a2d319c12a150479e5ce gcc/go/gofrontend/lex.cc
50f7fe6bed67437bd8cdedbdadbfd777 gcc/go/gofrontend/lex.h
98235b1a736055cd6a130337a9ee8e8e gcc/go/gofrontend/operator.h
fa42c777e5714a649057baddfa33ca30 gcc/go/gofrontend/parse.cc
30dd3449497113e8536805ec47db0d63 gcc/go/gofrontend/statements.cc
26fa4c1f2268d3e5180280310918ed0b gcc/go/gofrontend/statements.h
0ba1a11b029f92c6795e4c940c966f48 gcc/go/gofrontend/string-dump.h
-a4b994f44698b8a89e8c75119144265f gcc/go/gofrontend/types.cc
-f2cb4f81684d611386905f2fff829bd4 gcc/go/gofrontend/types.h
+807127e169b2ac5e8222bd4c8f66f1f8 gcc/go/gofrontend/types.cc
+2edc37f5e0fd28a18b5988791482cf60 gcc/go/gofrontend/types.h
14f99064d66c4b9bc9ab92b14d4e7afe gcc/go/gofrontend/unsafe.cc
dd84ec7483eb88b19ce6722e47c1a1f2 gcc/go/gospec.c
4d471970b23da7e4147258ef9373b38e gcc/go/lang-specs.h
1400b8e99d3520aa60a29717280777e2 gcc/graphite-optimize-isl.c
7acfa753917c853e000017c393da3fc3 gcc/graphite-poly.c
f9c785410cfde9d61c3ffb670dced572 gcc/graphite-poly.h
-ab1e6698efdaf3110847f7d273bdbc78 gcc/graphite-scop-detection.c
+89fcadefa8e3b6c09169e1c840d54860 gcc/graphite-scop-detection.c
2c30c8f2568b1d728f9ba0e3929140d6 gcc/graphite-scop-detection.h
3d283157b1a0b1afd2a76a27ce09465c gcc/graphite-sese-to-poly.c
49ddf476aa0ab3084a087850dbf32c8b gcc/graphite-sese-to-poly.h
00fcd665255c519c1dffc8cce3472d98 gcc/internal-fn.h
d9360459f2f4e913687597f9589da5da gcc/intl.c
828d71668221b7c1bd27436bf9a019bc gcc/intl.h
-c1423c98892b40ef08f44d0701ddf8e0 gcc/ipa-cp.c
-fc02b557228552e7d857db952632c4b0 gcc/ipa-devirt.c
+0006560fc2f706fce1ac466939c40369 gcc/ipa-cp.c
+f36213d901d1d1bd81b45ac95eaf53ee gcc/ipa-devirt.c
1b8d3fb6c67dd0e13f67b75b924c3a3d gcc/ipa-inline-analysis.c
-ae7311c23f026fe0be71fd216e23d50e gcc/ipa-inline-transform.c
-45752dfeb17ec8efd11c9e60b0b01c7c gcc/ipa-inline.c
-e3d2f4bfa7033d1b8fbd2134612adaf4 gcc/ipa-inline.h
+86e89dfc4cd8b878835b47d24fb38ef7 gcc/ipa-inline-transform.c
+07b45af4191a711dea059475f57c1a15 gcc/ipa-inline.c
+ef5aed192294b1ea841838ffe38b6ad0 gcc/ipa-inline.h
bc1b3139cd7a986ee918134a0530cff0 gcc/ipa-profile.c
-e99b183d28cc3fd85de7ad3aa4a19c8d gcc/ipa-prop.c
-4a9fb2a454b41089783929875d644ede gcc/ipa-prop.h
+44fe8a05d2644cd22ac19740a96f22c1 gcc/ipa-prop.c
+4cfe52b86527ded18edfae21b3a945cf gcc/ipa-prop.h
5d7c7c3998bd7526105c1e995c55b1a4 gcc/ipa-pure-const.c
4d91788577e596f236457cd265942705 gcc/ipa-ref-inline.h
1855589dcb6587a046dcb728192ee425 gcc/ipa-ref.c
6b64a43c2c779189270aa17b12713e99 gcc/ipa-split.c
446a574aba27a93de95b2b0c4b4cecbe gcc/ipa-utils.c
f1a401a90912552f632b32c77c399c6c gcc/ipa-utils.h
-579652fdce69538790449c49dc8145f8 gcc/ipa.c
+da8f2c35f7821cbc3822da57cfdccf9d gcc/ipa.c
dd7ab034904148f42c51b046d7f0b572 gcc/ira-build.c
43905ebf4d26681958db7403ec946ebc gcc/ira-color.c
70bab789c6dafc2ab624cc7af66b192e gcc/ira-conflicts.c
-41e9c50f013de42327bb4af6a3bb6395 gcc/ira-costs.c
+860fc86150488ec9dc71e5fa1468c1f2 gcc/ira-costs.c
2bd26b2844144d614e2af6f5617f0c46 gcc/ira-emit.c
6488cfc31e614d186769d37bd27cb054 gcc/ira-int.h
9c77805567ace1d43ebfaadc852c23c5 gcc/ira-lives.c
09d12eb5ca58b3a053aceb771c071238 gcc/ira.c
a143bddc3bc8d88afb0b31089aefe816 gcc/ira.h
843275b56a150408da64a72a1e86fd31 gcc/is-a.h
-69d277ee47c79b208afe37ec68dae66f gcc/java/ChangeLog
+aa42185fde7647b4f50fe0755cbc9810 gcc/java/ChangeLog
3becfaac793f49e1f52cd74e78172b48 gcc/java/ChangeLog.ptr
1c698a5c434720749e71a0ea3eb5a0ea gcc/java/ChangeLog.tree-ssa
3e907c2321d94f9d70c9bfcc63d251c3 gcc/java/Make-lang.in
ba23c462cffc03660fd11fb0c4392c4c gcc/java/zextract.c
9c0b0201efef1378fbce54f5bd65c98e gcc/java/zipfile.h
03b9495809742f845dbb701be808117d gcc/jump.c
-7838c4f8587c371ecd31b9e52b498200 gcc/langhooks-def.h
-c54aaeebda7b472c47d94d80c8be3d57 gcc/langhooks.c
-ed206298e22a303c30ef36e0bbd20a48 gcc/langhooks.h
+1ec3b83a546f9030158a6466675214f6 gcc/langhooks-def.h
+db9b7dec34f0a81ec5a37dbb74f862a9 gcc/langhooks.c
+40cb75b6a10a6d71bc4d62aeaef5cc97 gcc/langhooks.h
7b2bf12099bae7074b15d1964c8821c0 gcc/lcm.c
8693ecbe418eceacb540aed3603d8766 gcc/libfuncs.h
5314cfbffeb18b917515c40fdbc36540 gcc/limitx.h
bcd8945e5414cda5e3ad03542a2d011d gcc/lists.c
16086d64468975aa4ba54f78d2a7b542 gcc/lock-and-run.sh
208b088d7ccccc8e6c543e63fdea06fa gcc/loop-doloop.c
-b2e8b3596aa6202b3a28b571d7ab31ce gcc/loop-init.c
+2d37d0b843b816b1c6dd9aad0304fca4 gcc/loop-init.c
961aa1aafb4d7f6633b1296cae0f3adf gcc/loop-invariant.c
ec482357a36adb888741b89a43153c39 gcc/loop-iv.c
64a1aad9486a60d822da0c2f90e3d74d gcc/loop-unroll.c
ea528889eab563f14e1de595d2accbea gcc/lower-subreg.h
c5d6f1be07de4f413bcade24de1eb227 gcc/lra-assigns.c
dc1627ac98262eabf9f97f3174ae4d9b gcc/lra-coalesce.c
-c70a27b61278483ebab628a2533c55f5 gcc/lra-constraints.c
-91aa820c388b2095bf8b1956e6bb1079 gcc/lra-eliminations.c
+633b3d9192a422c6138881cab3e3abf6 gcc/lra-constraints.c
+13d0b61525b9064a61d09f25fd0ad388 gcc/lra-eliminations.c
e3cc33f3adfbde793a360b287c829ccb gcc/lra-int.h
b739e070bd2225a3a9caa382b77fe577 gcc/lra-lives.c
ca992aec926a40acb7ddb9ca411175f9 gcc/lra-spills.c
1ad7c612bb12a8205345f45c9902dbff gcc/lto-section-in.c
4ef9318ae61cbd95ceba4d21ac1dc3bc gcc/lto-section-out.c
9d90309ed38ceafd2737c415ab3b73b7 gcc/lto-streamer-in.c
-5b1dc7a9d599c8a7d5fb86745620eda6 gcc/lto-streamer-out.c
+6363140d711d0e7a7105c3c997df1ef3 gcc/lto-streamer-out.c
81d24bca19f31cd5f0e863be0155267b gcc/lto-streamer.c
b6667b25d54cd3d347edba40e635a6f8 gcc/lto-streamer.h
b22d02e83c5f71264232ba966fa80333 gcc/lto-wrapper.c
-7a77723cb569c38f04c6d2c1c575c814 gcc/lto/ChangeLog
+8936d922009af7d728c70ab3886be78e gcc/lto/ChangeLog
bd46eeecd1e05c40c9228f70c479cb8b gcc/lto/Make-lang.in
02974c5a3053c08f1c7046c3c00f237e gcc/lto/common.c
d2a23372f33fc6333deb5309623e859d gcc/lto/common.h
825fbe769aa70a26c698b09302310552 gcc/lto/lto-object.c
5ce936a1f06cbe68ffb6f15bfeb6fc88 gcc/lto/lto-partition.c
8977b46ede8ac142c4b6cef5cd202c65 gcc/lto/lto-partition.h
-e9f8090d5f38cfe55dfa4bd772a25dbb gcc/lto/lto-symtab.c
+a9663f2ad1ef207f00d8e9fbdece6519 gcc/lto/lto-symtab.c
cdfee539cfd3256004050bc33902c8f1 gcc/lto/lto-tree.h
535b0080fabf084d8709a1d179f82c53 gcc/lto/lto.c
53d38a820f2ac6511c4a3f1184674822 gcc/lto/lto.h
c105259690227bdba523ebbdb6785a23 gcc/mode-classes.def
5990f0f03ab20c63f205f98103605d90 gcc/mode-switching.c
ea3034ca83cb71b140bd50490e453acb gcc/modulo-sched.c
-cea0753f59b148c97a9230af18260dfe gcc/objc/ChangeLog
+78f49ff1378cc3a8aaaa089e78571d21 gcc/objc/ChangeLog
f7d80205bd69247c50937b75822d6bd9 gcc/objc/Make-lang.in
9e4f3a7afe892a3c94dacd501fa3b35f gcc/objc/config-lang.in
f4d88f51dbafbe757f45be85d78212b3 gcc/objc/lang-specs.h
ef6e827e622bc98f856c61b276dc8c64 gcc/objc/objc-runtime-shared-support.c
dab6095a59a77d76a9ffdf45011ed784 gcc/objc/objc-runtime-shared-support.h
a20e652c78591a316ce03a188632848f gcc/objc/objc-tree.def
-99f035685dd2d8035a3d8121840f65ee gcc/objcp/ChangeLog
+fb8e95f0185879ad9781fc10df395939 gcc/objcp/ChangeLog
79e09c916d955993dc8964962930f661 gcc/objcp/Make-lang.in
e75a1a94a911654e611dc33cc33ed861 gcc/objcp/config-lang.in
d551c7316da761fc633ce118cc2b5e8e gcc/objcp/lang-specs.h
b287f66d35995315cca62a202c60bb74 gcc/omega.c
010649dbdbf5e49817e4ea9f867a7bff gcc/omega.h
21429c2e0fbb11feafa4b0713ffd0458 gcc/omp-builtins.def
-f26a560e5c6f914b54f634408d144c07 gcc/omp-low.c
+0e7d90d8255b0ebdcdce7bd859483943 gcc/omp-low.c
768117c1b005da4325bccda2b1aafbf8 gcc/omp-low.h
f1316591a0b9cca13acbe19ecbc3bbc2 gcc/opt-functions.awk
dea8fbe4f187428f3ca66daeae92f165 gcc/opt-gather.awk
1ddfeafac813cf8a92d2c3e589959754 gcc/opts-common.c
f8af27e8d310fb07ee954b9d51720a44 gcc/opts-diagnostic.h
8d0e45b60b7e191de6268565d8f7be68 gcc/opts-global.c
-f0d81e40a553c25127f2ba08b8d59d94 gcc/opts.c
+a2552b89daebdcf868040ae6a98e6d41 gcc/opts.c
a8111e6b093d3a2ffb9761954116196f gcc/opts.h
aed504b0320caa1fe29201ae90d7696b gcc/output.h
1a435aeba364655d22922ca5ce6d6a57 gcc/params.c
ccfd047721d6ef8fbf1de21f9ce3d72c gcc/params.def
bd4f289f412d22ec498d4945cb7892b6 gcc/params.h
b61dc6bbf55ac62d93ddeaa57e1034d7 gcc/pass_manager.h
-881287af7fb13d7da6651d92e7936bfe gcc/passes.c
+9072ae9400752c4738ce43bc338e2f54 gcc/passes.c
05e2c2f175685b9549570e51b3dd799a gcc/passes.def
1e36a92344845ad1cb58222eea33d560 gcc/plugin.c
e68ff8352334b5b009a28b53fb9284ca gcc/plugin.def
c26393f8f5ea723bfcc15bf50ee1cc7d gcc/plugin.h
-706a43669ae00ed9fa3d772d5b6459c7 gcc/po/ChangeLog
+5c2f41ff65d94fed018df2830326783e gcc/po/ChangeLog
75ba3ed7c2ea3070333b11ced79b1cc8 gcc/po/EXCLUDES
1da2375d1cb67532f3330921d29cd450 gcc/po/be.gmo
ef9de679afafaa38517caa5a594e771a gcc/po/be.po
28ab66c54e1279b684f5240a46adc7a7 gcc/po/ru.po
56c8cc4daf3693852ab6e11be298083a gcc/po/sr.gmo
edc2c082d66ed31ad2c5897a23f09b8d gcc/po/sr.po
-d1f020c9a99ddcffda08d5f1f112901f gcc/po/sv.gmo
-f0e0da51bf7ee2ca2aa08bd2954c8968 gcc/po/sv.po
+ce615528bd4a3a1885147e51b029dcc6 gcc/po/sv.gmo
+7b50cd91f6dbfff3c10c3f39cccbc939 gcc/po/sv.po
50c9101bba2810cbc8f32fdf0154b842 gcc/po/tr.gmo
70f05386117166e45871362f9bed6288 gcc/po/tr.po
70add2819182fb77e30058d218746ad2 gcc/po/vi.gmo
6b8be71c236a0ffdb8beabb1e48c9714 gcc/po/vi.po
-4bcbbee8cefeef73ad8921889e8769f3 gcc/po/zh_CN.gmo
-da7cf7070e0b6d7b860bd2504261ae6e gcc/po/zh_CN.po
+5246a6782003fa351975b52b29769147 gcc/po/zh_CN.gmo
+6c55f69a1f24f470653cb44d3dd3fe73 gcc/po/zh_CN.po
c0a6da01a1a90e55a45d23532046d414 gcc/po/zh_TW.gmo
3c222a095eadff06aa61b52919603ca2 gcc/po/zh_TW.po
f6726e62db99c4bd4123f60cde728904 gcc/pointer-set.c
0862d16c511514fc4b9419fe8d2249fb gcc/realmpfr.h
5b9b5b3852225006cfc895ff9315681f gcc/recog.c
f8e8e735b5e2da8b23f855f10cf967d9 gcc/recog.h
-f72c7af647eb1b9bbf7430ece8542199 gcc/ree.c
+24eb88f29672c729eeb9c8cd44b47709 gcc/ree.c
705e5e05416b08906b765349ad349138 gcc/reg-notes.def
72ea708b4dc70ce4438d69d2319a2fde gcc/reg-stack.c
592552d455fba1ac9581479157402123 gcc/regcprop.c
36e2f10716593b481f8fb4e2836311ff gcc/sdbout.h
7d34229f0dd766db5d88ad4d07e7ac7f gcc/sel-sched-dump.c
ce9747499f85453b18cc17486a613be1 gcc/sel-sched-dump.h
-750e946a821c0b64a9537ac1eb5026f3 gcc/sel-sched-ir.c
+11a4d53aa01f91bf8d1e0b742058385f gcc/sel-sched-ir.c
20d66daf1a82ba97d0c7d7408435ef3c gcc/sel-sched-ir.h
cf60677a76338769fb2db05176673243 gcc/sel-sched.c
e7143a8fa4f763d1920eae298c76e3d6 gcc/sel-sched.h
373962dfad4478b106fdeaac9d95cdf9 gcc/streamer-hooks.h
1fe7e856e0066010e5281b160ab86b16 gcc/stringpool.c
aeb9c7847a29ddd73aaba4fe6916c482 gcc/stringpool.h
-5ee8172bf47d0223df6fe75c280e8b70 gcc/symtab.c
+4442eb1dcb11e9e35122e80ccfadd6c2 gcc/symtab.c
fb2c182d3b4fe1a83d730402d2dd93f1 gcc/sync-builtins.def
39bafcedb9b2dcef106d2a0338d4f027 gcc/system.h
6f7212d96dbe608531046cd09ce61d7c gcc/target-def.h
5096a6cda7c1340a6843c4eee249eb97 gcc/target.h
be5e3bfa678dd16872775c30f8c43ce4 gcc/targhooks.c
8e6bbb74d18a1c0dc21dee6ba057882f gcc/targhooks.h
-00e103354f56c5ed082d7bfa518b4ba4 gcc/testsuite/ChangeLog
+a4bb28b328e913c4c86847ad2d1fdc93 gcc/testsuite/ChangeLog
862f04afbd87da2cc6bc432c3f28430f gcc/testsuite/ChangeLog-1993-2007
029a5d8dacd25eb5d4711452ac448e5b gcc/testsuite/ChangeLog-2008
13ac28c41d51b66b4ec40dba6bd50f39 gcc/testsuite/ChangeLog-2009
2c088e019fefc928fe277ef1f4fb7d33 gcc/testsuite/c-c++-common/cilk-plus/AN/pr57457-2.c
bba6114b4cfe4a3376c77f125d594f06 gcc/testsuite/c-c++-common/cilk-plus/AN/pr57457.c
953c3a0fd51c86c993a221c31e5211ec gcc/testsuite/c-c++-common/cilk-plus/AN/pr57490.c
-caec5195ca9756829fab7d458899c693 gcc/testsuite/c-c++-common/cilk-plus/AN/pr57541.c
+43824703e1a03545ac36b780d6e1942a gcc/testsuite/c-c++-common/cilk-plus/AN/pr57541-2.c
+a3f5fc8ddb22402540a7884bec069d00 gcc/testsuite/c-c++-common/cilk-plus/AN/pr57541.c
a36b3974157c0833a64435f6ab921c63 gcc/testsuite/c-c++-common/cilk-plus/AN/pr57577.c
+18b9ecb01f318e46e1b1618d51b65ecf gcc/testsuite/c-c++-common/cilk-plus/AN/pr58942.c
+b642b955aa866b79df8b35740b79d712 gcc/testsuite/c-c++-common/cilk-plus/AN/pr61191.c
48e29ba8dcd43d0483eaa269c8168397 gcc/testsuite/c-c++-common/cilk-plus/AN/rank_mismatch.c
4dfe5bd9bbbf2b8f4fd4e8f2929b2810 gcc/testsuite/c-c++-common/cilk-plus/AN/rank_mismatch2.c
4cbb8c454d5869ef6fd39d428da765a0 gcc/testsuite/c-c++-common/cilk-plus/AN/rank_mismatch3.c
b5bfde6a9dd678a448b8474f39ba919b gcc/testsuite/c-c++-common/cilk-plus/CK/fib_no_return.c
b8b1cd4b185e786ec2db1f3a6cdfdc64 gcc/testsuite/c-c++-common/cilk-plus/CK/fib_no_sync.c
3c1aba27f563b43e7496044a67a04215 gcc/testsuite/c-c++-common/cilk-plus/CK/invalid_spawns.c
+e30e70e0f3ee94bd63ee8448c326b114 gcc/testsuite/c-c++-common/cilk-plus/CK/invalid_sync.cc
4973d12eddd618d656dec825d9f862ca gcc/testsuite/c-c++-common/cilk-plus/CK/no_args_error.c
baaa8dcaf89f3b8cd67c3c385d275b85 gcc/testsuite/c-c++-common/cilk-plus/CK/pr59631.c
0fdcd72893b4a82aea59579baa2dfba1 gcc/testsuite/c-c++-common/cilk-plus/CK/pr60197-2.c
c2e14df2c3c1f90d28c611400c8d66df gcc/testsuite/c-c++-common/gomp/atomic-13.c
7e932cfe67a56047f2793f8f073026d8 gcc/testsuite/c-c++-common/gomp/atomic-14.c
ea35c8898a66194ddfd4052e95c9b78c gcc/testsuite/c-c++-common/gomp/atomic-15.c
-041021ef9972945e372ef740ba657791 gcc/testsuite/c-c++-common/gomp/atomic-16.c
+0129f6c1e124f845d12d0e1105a1272a gcc/testsuite/c-c++-common/gomp/atomic-16.c
02a1665574401bc7491c754880894569 gcc/testsuite/c-c++-common/gomp/atomic-2.c
36961f7538f3a387eb44b9dd71182644 gcc/testsuite/c-c++-common/gomp/atomic-3.c
b2ce89f1ba635f8d6701308583cd4759 gcc/testsuite/c-c++-common/gomp/atomic-4.c
fe151bac678698a31d909bd16fae419b gcc/testsuite/c-c++-common/gomp/pr58551.c
6d1dc12c879ee866b842cec98b946a0d gcc/testsuite/c-c++-common/gomp/pr58703.c
8bae1133175c7b4a752ebdc6baba26e4 gcc/testsuite/c-c++-common/gomp/pr58809.c
+63108e4eb634574549c4c4c319dc6ae0 gcc/testsuite/c-c++-common/gomp/pr59073.c
5d8f96921e9524db1e999bab7eac1116 gcc/testsuite/c-c++-common/gomp/pr59152.c
05e6a38172b7bfc26de83040dfc8c364 gcc/testsuite/c-c++-common/gomp/pr59467.c
c282b9ecbe7c1cafd42ab3e0184003b2 gcc/testsuite/c-c++-common/gomp/pr59917-1.c
aae6611cdfa9d295d22870f8c9222f69 gcc/testsuite/c-c++-common/gomp/pr59917-2.c
+648e6282c96355072c109ed1a82ea4d7 gcc/testsuite/c-c++-common/gomp/pr60823-1.c
+5724f24c4f1988cd1539ef0c5e147b98 gcc/testsuite/c-c++-common/gomp/pr60823-2.c
+defbe62797ed1363de67a60914b29aa7 gcc/testsuite/c-c++-common/gomp/pr60823-3.c
+33408e801b735ed22ebf0d36f8fd7554 gcc/testsuite/c-c++-common/gomp/pr61486-1.c
+8e7463bc9420fce6b1a1443c77ad841e gcc/testsuite/c-c++-common/gomp/pr61486-2.c
328147f679f9eac26be960bf85acb2e8 gcc/testsuite/c-c++-common/gomp/sections1.c
c7cb982e272572b3d42948b23c3c6229 gcc/testsuite/c-c++-common/gomp/simd1.c
3ffb158d7db65691583ca6ff7330457a gcc/testsuite/c-c++-common/gomp/simd2.c
baa15b278da5bb4b2b348d4043f1c97e gcc/testsuite/c-c++-common/torture/pr58794-1.c
c816e733ed428f32e49d50b564aaef54 gcc/testsuite/c-c++-common/torture/pr58794-2.c
51789b713733d1d6693238c2ca4e9b85 gcc/testsuite/c-c++-common/torture/pr60026.c
+233a29474162885f1e2509bbf25e078f gcc/testsuite/c-c++-common/torture/pr60971.c
fdeec1e5ecb339bf68961fab033b606e gcc/testsuite/c-c++-common/torture/vector-compare-1.c
e098360b3686787abea6589b13d9e806 gcc/testsuite/c-c++-common/torture/vector-compare-2.c
26c13a49130d1f2d291bea112073585f gcc/testsuite/c-c++-common/torture/vector-shift.c
1bc1c995533b047ed8df6f6f24905cd1 gcc/testsuite/g++.dg/cpp0x/constexpr-99.C
785343af0b3355420f795309fbe121fb gcc/testsuite/g++.dg/cpp0x/constexpr-abi1.C
7d8afd8896f969ba303cb470f166dc1a gcc/testsuite/g++.dg/cpp0x/constexpr-access.C
+b2677ed5d88c259b9b0fac3db40c4180 gcc/testsuite/g++.dg/cpp0x/constexpr-aggr1.C
3f271472f05de1e297d6ea28097b47d1 gcc/testsuite/g++.dg/cpp0x/constexpr-and.C
d184daf58a1efefa9b5d9f2675332595 gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr.C
8fd033f4e6b69599a1e293c45d0814cb gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr2.C
71bf544adf239f884a43b6d72e78604e gcc/testsuite/g++.dg/cpp0x/constexpr-pos1.C
e29b90d7c0ad7662446a6055addb6315 gcc/testsuite/g++.dg/cpp0x/constexpr-potential1.C
fa7ac28bbeb7f5a520d7f5c5847dedff gcc/testsuite/g++.dg/cpp0x/constexpr-ptrmem.C
+02a38a7d530d4818a0d8dbbb4225efd9 gcc/testsuite/g++.dg/cpp0x/constexpr-ptrmem2.C
2e9d0ef04a28487562d30ab99afa37a2 gcc/testsuite/g++.dg/cpp0x/constexpr-ptrsub.C
c893e2388f9acef593b874b1e6b02071 gcc/testsuite/g++.dg/cpp0x/constexpr-pure.C
3d462eb6b34feb0c1cf9349c9e6e976c gcc/testsuite/g++.dg/cpp0x/constexpr-recursion.C
a05dfbf634e5313455c47b794057b288 gcc/testsuite/g++.dg/cpp0x/constexpr-template4.C
fa38f028820b71aa1be6862fa8eb6f7c gcc/testsuite/g++.dg/cpp0x/constexpr-template5.C
7af69efd7e063989a419444f87d1e491 gcc/testsuite/g++.dg/cpp0x/constexpr-template6.C
+fac54481719d52997e799f9f5944ce10 gcc/testsuite/g++.dg/cpp0x/constexpr-template7.C
53ba7c64d852ccf921166074b871f796 gcc/testsuite/g++.dg/cpp0x/constexpr-throw.C
77e5599180280cec4988ec1ddb372b25 gcc/testsuite/g++.dg/cpp0x/constexpr-tuple.C
e4e296b91d878f03ac7d69d384efc1f4 gcc/testsuite/g++.dg/cpp0x/constexpr-typedef1.C
acc6bd6fd744bdc18ca97d53d2b93372 gcc/testsuite/g++.dg/cpp0x/defaulted46.C
9c11c2857ec4e4034b1d9d143b50000f gcc/testsuite/g++.dg/cpp0x/defaulted47.C
c7e6cc6230f1d5b6c871906050eb4a8e gcc/testsuite/g++.dg/cpp0x/defaulted48.C
+f43c03a4784f2f2c60f5f1a33fb05baa gcc/testsuite/g++.dg/cpp0x/defaulted49.C
f850ce13cb38dd65e14979303082c6cf gcc/testsuite/g++.dg/cpp0x/defaulted5.C
1983e4823fae7dc43730a329ff221148 gcc/testsuite/g++.dg/cpp0x/defaulted6.C
bbb1e584edf09356b8623f522ff03019 gcc/testsuite/g++.dg/cpp0x/defaulted7.C
ec9b8f74c4220a07771e91a84c8311aa gcc/testsuite/g++.dg/cpp0x/inh-ctor9.C
09f09079c354ad93c3844a14549e0854 gcc/testsuite/g++.dg/cpp0x/initlist-array2.C
2689261b6dbe2bf5875e915ce8a31a53 gcc/testsuite/g++.dg/cpp0x/initlist-array3.C
+6c1907913d332611dd16d03002d759f9 gcc/testsuite/g++.dg/cpp0x/initlist-array4.C
75dbdd73972da9a369980925ff477d9d gcc/testsuite/g++.dg/cpp0x/initlist-arrray1.C
994605127bf908d7a5b9745b9991101e gcc/testsuite/g++.dg/cpp0x/initlist-ctor1.C
8642aa67406b008384f59447a05a884c gcc/testsuite/g++.dg/cpp0x/initlist-deduce.C
f4e51372ebce70d4e70fe4c30c9c5df3 gcc/testsuite/g++.dg/cpp0x/initlist80.C
02ef88866a33af3b82367f920d4380ba gcc/testsuite/g++.dg/cpp0x/initlist81.C
3df81dd8acdfbccf6fba7648b64b32c5 gcc/testsuite/g++.dg/cpp0x/initlist82.C
+e19590cab587582486b601d5b4135a2e gcc/testsuite/g++.dg/cpp0x/initlist84.C
+ce1c3896ddd664d6cbfa86d425a7cf39 gcc/testsuite/g++.dg/cpp0x/initlist86.C
de6fe33f85a45970df99586b8f8f48c8 gcc/testsuite/g++.dg/cpp0x/initlist9.C
2bd94659e18571416ec707555f61b80d gcc/testsuite/g++.dg/cpp0x/inline-ns1.C
3e2f011d130eb1b8b8c5b45e6f650dfb gcc/testsuite/g++.dg/cpp0x/inline-ns2.C
22fc25fa709265abbae77ff5d72e72f8 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const-neg.C
1d85414b94d2d104004fc7341b90a896 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const.C
64bc761abc3783521fdfb26f930f3410 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const2.C
+e513b4dcc45e6063745c03c7c99151fa gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const3.C
25265bcafc26c3a0ab3727a9ff348916 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv.C
299fbfde279f22ba6cf7e79d7e17f49b gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv2.C
13859d1112ce3900c792dcdc2e8ae085 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv3.C
06d36011a13482624806d2ac0b6cc62c gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template10.C
0480ccf1db57a209026d61f347f2558b gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template11.C
5a2e25e55c03b3d576cbd41cd3919157 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template12.C
+5eb96d2cc00390806e540f86524b3658 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template13.C
ba1b33731a2a8e72850872d9f2918923 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template2.C
94cfc36278ab817fd2df7010aa3c83ba gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template3.C
e099bfa2ff82527ea9b86eaaab9acb43 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template4.C
cb3b2650a080bd9c7acfa0a46c317afe gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this15.C
1552f0ad6ccfb863bbdcf5b710f3b84d gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this16.C
0d9d1df756c17ed3794931d85361bea9 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this17.C
+4140ff305c161e7f2fe64321a7e90846 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this18.C
53707c7f73c56183ff77914e6f7417b9 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this2.C
4d206d41378a3a22959ec8c2c1439014 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this3.C
63fdeead97cb6030e039c864293a278b gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this4.C
bb52d0707dea46cd2224e8f36c397c29 gcc/testsuite/g++.dg/cpp0x/nsdmi-local.C
532b3e2c733c1b03dfa22d18667650fb gcc/testsuite/g++.dg/cpp0x/nsdmi-sizeof.C
6a97f223fff723db9f950c32a7828e35 gcc/testsuite/g++.dg/cpp0x/nsdmi-template1.C
+4826317ec7401f0dceb7076d880beac7 gcc/testsuite/g++.dg/cpp0x/nsdmi-template10.C
+c56f71db72e83d4f4135a61f033eddbb gcc/testsuite/g++.dg/cpp0x/nsdmi-template11.C
+6a7ab71ba1c7fa9cc3345da8f9afe903 gcc/testsuite/g++.dg/cpp0x/nsdmi-template12.C
+b10aa26824c27a87b56ae1ff32b2a84b gcc/testsuite/g++.dg/cpp0x/nsdmi-template13.C
d83133afa9fe5d533ed8b6cecc90cc44 gcc/testsuite/g++.dg/cpp0x/nsdmi-template2.C
a4838f227c782d1dc8cc894a19deb0d1 gcc/testsuite/g++.dg/cpp0x/nsdmi-template3.C
ecc55c2acf604366d5eab66ebf6a29dd gcc/testsuite/g++.dg/cpp0x/nsdmi-template4.C
3a5b1755ff3b8f25bdc5d3343ec58d7e gcc/testsuite/g++.dg/cpp0x/nsdmi-template6.C
bca364bb7be51173c515446b467d101b gcc/testsuite/g++.dg/cpp0x/nsdmi-template7.C
8228a8cc4123378699db41bb692816a8 gcc/testsuite/g++.dg/cpp0x/nsdmi-template8.C
+10d5192bc22fb982a714dabcc1321c84 gcc/testsuite/g++.dg/cpp0x/nsdmi-template9.C
d1503365b6615b562965b9d47e9327c5 gcc/testsuite/g++.dg/cpp0x/nsdmi-union1.C
97244e2bdff262e5f89cc9d5717cbeee gcc/testsuite/g++.dg/cpp0x/nsdmi-union2.C
24d435bfe180c503be113a8efa76cca0 gcc/testsuite/g++.dg/cpp0x/nsdmi-union3.C
e9cd0db7db25af8829963f7122d2ed31 gcc/testsuite/g++.dg/cpp0x/pr57981.C
016ebcf6c9d25c8f22cd01c52f674b94 gcc/testsuite/g++.dg/cpp0x/pr58072.C
66a132ab0a4f16eb332c03fd38067a1c gcc/testsuite/g++.dg/cpp0x/pr58080.C
+10115e7416304bd9586633e7a175c150 gcc/testsuite/g++.dg/cpp0x/pr58155.C
fde4df725e337b433baf1bd5c4490563 gcc/testsuite/g++.dg/cpp0x/pr58510.C
99345be72ff580dd3de1858994530c51 gcc/testsuite/g++.dg/cpp0x/pr58563.C
b2c6b8e617bc163eb317b7668652e006 gcc/testsuite/g++.dg/cpp0x/pr58674.C
135956a1794cb24e32c252e833402edb gcc/testsuite/g++.dg/cpp0x/pr58707.C
+c2caeb92016de47392b35fa937c864f8 gcc/testsuite/g++.dg/cpp0x/pr58781.C
0015dc46694c26453738cf6d0f1ff9f1 gcc/testsuite/g++.dg/cpp0x/pr58871.C
91fd57600ae1f1e9e0fb675962816f3e gcc/testsuite/g++.dg/cpp0x/pr59111.C
97725be33d84460ca43942d2adc95953 gcc/testsuite/g++.dg/cpp0x/pr59641.C
3d0500d1d666af43dc6c0f875f02c205 gcc/testsuite/g++.dg/cpp0x/pr60047.C
b183a4e80609d3b7c1a96a71d68c8355 gcc/testsuite/g++.dg/cpp0x/pr60215.C
+0ec463c125bf90b0bc2b4ce4298afcc7 gcc/testsuite/g++.dg/cpp0x/pr60249.C
53428f69a6d0153074c9b06ee9fbe9e7 gcc/testsuite/g++.dg/cpp0x/ptrmem-cst-arg1.C
6e8e648c26d9bf237cc152180e88c2c2 gcc/testsuite/g++.dg/cpp0x/range-for1.C
5c7a98d8ca2f0f427c081bf6902aa831 gcc/testsuite/g++.dg/cpp0x/range-for10.C
0a0c7a2db84d28ba649ea53e136a1d9c gcc/testsuite/g++.dg/cpp0x/ref-qual12.C
759a26dd15a061d3f5a982b5eb65098b gcc/testsuite/g++.dg/cpp0x/ref-qual13.C
bf679e1b75877f28dc4d57155f61bcb1 gcc/testsuite/g++.dg/cpp0x/ref-qual14.C
+baf0dc0526b9c7116fa5e5cbccbe2286 gcc/testsuite/g++.dg/cpp0x/ref-qual15.C
17d77d3ef6cc0e1cfd53228f15a40017 gcc/testsuite/g++.dg/cpp0x/ref-qual2.C
68b27ec15231994ad0330625660d2720 gcc/testsuite/g++.dg/cpp0x/ref-qual3.C
1bb06529f586a3e77263290dd006534e gcc/testsuite/g++.dg/cpp0x/ref-qual4.C
7f9ec6f23b495a9ffdc2eb43224e4e97 gcc/testsuite/g++.dg/cpp0x/sfinae48.C
07a6e388376959abb699902ddf79cfaa gcc/testsuite/g++.dg/cpp0x/sfinae49.C
d5e6c1bb41ba570249eba838c6885b91 gcc/testsuite/g++.dg/cpp0x/sfinae5.C
+e658abe19e3f9090108ecdee6c7ff751 gcc/testsuite/g++.dg/cpp0x/sfinae50.C
7d2a515d9dca41b0e82b2e6ea54bd2d3 gcc/testsuite/g++.dg/cpp0x/sfinae6.C
ec1a51ea3fd41e6e61c8f425bde1fd0b gcc/testsuite/g++.dg/cpp0x/sfinae7.C
547894832b1452d5f513938e0cb8a166 gcc/testsuite/g++.dg/cpp0x/sfinae8.C
081a4bedbab268a6ae607a361a5687db gcc/testsuite/g++.dg/cpp0x/variadic154.C
bbeb66e2a1c3ff1e5215a3de0291398a gcc/testsuite/g++.dg/cpp0x/variadic155.C
0e3dc026b07c4ba87c8c89d690eccc97 gcc/testsuite/g++.dg/cpp0x/variadic156.C
+a516c60e45bf1eecdf3636277e7f49cb gcc/testsuite/g++.dg/cpp0x/variadic158.C
+bf231bc932b6dcd397fde94abd58295c gcc/testsuite/g++.dg/cpp0x/variadic159.C
ef6cd86993fd9e98b5c841e854f1e291 gcc/testsuite/g++.dg/cpp0x/variadic16.C
+5348f57a43bc1324c15c9e5945ba3ebe gcc/testsuite/g++.dg/cpp0x/variadic160.C
3bff3422f4558e688cb85c201d29da39 gcc/testsuite/g++.dg/cpp0x/variadic17.C
e7b3b347202f88043f677ea7ce8e4e18 gcc/testsuite/g++.dg/cpp0x/variadic18.C
b6eb5a5a2dea08c17e47320efabe05df gcc/testsuite/g++.dg/cpp0x/variadic19.C
119423feeda4a9e445a82989e694bc55 gcc/testsuite/g++.dg/cpp1y/pr59635.C
f653995a9fc3c07c5f78cb893a5d0f36 gcc/testsuite/g++.dg/cpp1y/pr59636.C
89674d408dfbc12f05e3c06cd0c72ada gcc/testsuite/g++.dg/cpp1y/pr59638.C
+761afa9b3e6b38bb9e9836c267285705 gcc/testsuite/g++.dg/cpp1y/pr59867.C
4f72056a5c0a9c06897a661b1a5ccf00 gcc/testsuite/g++.dg/cpp1y/pr60033.C
ae8b2c75d98bcfd540cfa668c012d7e1 gcc/testsuite/g++.dg/cpp1y/pr60052.C
8fcfe639eb392754703259ddfa944fb2 gcc/testsuite/g++.dg/cpp1y/pr60053.C
09b1f81116f03c2c68f057d9f2799605 gcc/testsuite/g++.dg/debug/dwarf2/global-used-types-1.C
5f527b1d5db3338320735cddde309293 gcc/testsuite/g++.dg/debug/dwarf2/icf.C
94ab24c4c92e0025c8c21c00e7088ab9 gcc/testsuite/g++.dg/debug/dwarf2/imported-decl-1.C
+aeaf229ff1bb7dd4ac9bc56468134190 gcc/testsuite/g++.dg/debug/dwarf2/imported-decl-2.C
cd2f8eb018e0f3274a839788f6516dbd gcc/testsuite/g++.dg/debug/dwarf2/imported-module-2.C
00073dddfb84caf2285834b264334fb6 gcc/testsuite/g++.dg/debug/dwarf2/imported-module-3.C
f328f5fd374ff3e1abef9c5c385bb657 gcc/testsuite/g++.dg/debug/dwarf2/imported-module-4.C
83e103e0e6e4fc3fb74441438b2c7288 gcc/testsuite/g++.dg/debug/dwarf2/pr46527.C
77d7e1ad341ac6addc71df4dbb8ec2e2 gcc/testsuite/g++.dg/debug/dwarf2/pr52260.C
ba3a14694481b03351ebef6174059c0f gcc/testsuite/g++.dg/debug/dwarf2/pr54508.C
+97f5ea2ec0d8ed4da158c8c51e4f395d gcc/testsuite/g++.dg/debug/dwarf2/pr61433.C
6a221e4796f80705722794e4cb854118 gcc/testsuite/g++.dg/debug/dwarf2/pubnames-1.C
61c15278662fb88f21f9d3f56b288d93 gcc/testsuite/g++.dg/debug/dwarf2/pubnames-2.C
1c216c5d6dbf7b013153d4ca504eeebc gcc/testsuite/g++.dg/debug/dwarf2/pubnames-3.C
ad9b04984e82c2e0e1fb2025de8f9a23 gcc/testsuite/g++.dg/ext/complit11.C
ab6acb4a7c8c1d0b3e7717da4ac42983 gcc/testsuite/g++.dg/ext/complit12.C
1ef2d5904216cc610d5c5dde143f79ac gcc/testsuite/g++.dg/ext/complit13.C
+07cb245f4432f072b7263e83c675d2de gcc/testsuite/g++.dg/ext/complit14.C
7350965e2763a3a6e1d4346deaa1e94e gcc/testsuite/g++.dg/ext/complit2.C
7c0cfd2335d61954c46222aa7517e055 gcc/testsuite/g++.dg/ext/complit3.C
f2a3354acae823d1855d3f7820f78229 gcc/testsuite/g++.dg/ext/complit4.C
28ced8869a7baac26a49e3084bf7d851 gcc/testsuite/g++.dg/init/copy4.C
02c689a173b02b7312d282add8f14591 gcc/testsuite/g++.dg/init/copy5.C
5d48182e8fa2907f420bf1ef3d67dba3 gcc/testsuite/g++.dg/init/copy6.C
+401730d1bb87c3edf85010755fe8a2ff gcc/testsuite/g++.dg/init/copy7.C
77ceed5edeb6a109374c44ef23679bef gcc/testsuite/g++.dg/init/ctor1.C
a7fab26ec8d16e90cb47357e7759a768 gcc/testsuite/g++.dg/init/ctor10.C
6ee4f7840a21e5a764e2facf94d7e71d gcc/testsuite/g++.dg/init/ctor11.C
181d03bf17027cab97eb47736f11ff30 gcc/testsuite/g++.dg/ipa/20090113-1.C
7522727dcb8122398374b49264575c77 gcc/testsuite/g++.dg/ipa/devirt-1.C
a38c209b4fc2c2a0b36cf4c89adcf9d8 gcc/testsuite/g++.dg/ipa/devirt-10.C
-30cb11288b1bdcca3c2f20d03e0033cf gcc/testsuite/g++.dg/ipa/devirt-11.C
+cfcb8d283cbb4cafcbcdc9e7065786fd gcc/testsuite/g++.dg/ipa/devirt-11.C
af8781bfa434602bbdd203a9b683acca gcc/testsuite/g++.dg/ipa/devirt-12.C
95efb847fd00d08421ccc099b6b62a1d gcc/testsuite/g++.dg/ipa/devirt-13.C
26800570b776735a7c4b46e635a55d01 gcc/testsuite/g++.dg/ipa/devirt-14.C
6d87b18d1fbfc853e7a4dedb581b38ac gcc/testsuite/g++.dg/ipa/devirt-22.C
dfb26a875a3981e85385d162fbc8fb72 gcc/testsuite/g++.dg/ipa/devirt-23.C
540360b373bf580206ab7238bc7a9976 gcc/testsuite/g++.dg/ipa/devirt-24.C
-0ea3d64f37ec0034e0cdf3da393fe2c8 gcc/testsuite/g++.dg/ipa/devirt-25.C
+ecabc1a11f2927b0222d65a9d86c4c38 gcc/testsuite/g++.dg/ipa/devirt-25.C
a955053ff50f32fdd98345068ff798fa gcc/testsuite/g++.dg/ipa/devirt-26.C
-8a2c5cc0f1c6187bc864f03efc389fae gcc/testsuite/g++.dg/ipa/devirt-27.C
+83c12ee028b9711638166b6f6aa4120c gcc/testsuite/g++.dg/ipa/devirt-27.C
4e8c06e1e1145b9d11bc125669054764 gcc/testsuite/g++.dg/ipa/devirt-28.C
31f84d40ad557791781d8a441ce8fb42 gcc/testsuite/g++.dg/ipa/devirt-29.C
48c9df6f6e861f2448fa74314b9affb3 gcc/testsuite/g++.dg/ipa/devirt-3.C
7cd06fb87d4e922414924f6395c7441b gcc/testsuite/g++.dg/ipa/devirt-30.C
+46c20441c2f9bdc827ed732c9e41f089 gcc/testsuite/g++.dg/ipa/devirt-31.C
d2da990ad34e9459150b3aa94be920a9 gcc/testsuite/g++.dg/ipa/devirt-4.C
bef829571c10195d63a0c4ff07d958ef gcc/testsuite/g++.dg/ipa/devirt-5.C
8c636e7513618b1b3735a28c660923df gcc/testsuite/g++.dg/ipa/devirt-6.C
e5598a6623b0d9d17b639bb9715c0aa1 gcc/testsuite/g++.dg/ipa/pr59737.C
cc7882632634230561bec7316fae94c5 gcc/testsuite/g++.dg/ipa/pr60419.C
19fe8d73bee48bb2e91c928907e2a11c gcc/testsuite/g++.dg/ipa/pr60457.C
-944191e3103ec99ba3e88de3e71f26c7 gcc/testsuite/g++.dg/ipa/pr60600.C
+d48ba9dd79036705896a57df5c510757 gcc/testsuite/g++.dg/ipa/pr60600.C
190bb52be2caa70fd51cc2a735d45f1e gcc/testsuite/g++.dg/ipa/pr60640-1.C
b4277c2887fdb910bdca2a8dbf0de117 gcc/testsuite/g++.dg/ipa/pr60640-2.C
2b5d243c5137f370d06b3628cfde2864 gcc/testsuite/g++.dg/ipa/pr60640-3.C
41bda91df204bac278fc60acb7c02356 gcc/testsuite/g++.dg/ipa/pr60640-4.C
+231677eaca7afc4bb98a3094c618e3f3 gcc/testsuite/g++.dg/ipa/pr61085.C
+2c3b07fe4ee36fc9baf0391eed8b9d2d gcc/testsuite/g++.dg/ipa/pr61160-1.C
+185fd53b287f35aa00dc354318e7b17f gcc/testsuite/g++.dg/ipa/pr61160-2.C
+a4862cb5f3f58316adc6e36c7d8eb036 gcc/testsuite/g++.dg/ipa/pr61160-3.C
+daceb1b2f3cf167fb6e78fc2d34f2778 gcc/testsuite/g++.dg/ipa/pr61540.C
65b30ac9d2b3a2244e49849aaad7dd78 gcc/testsuite/g++.dg/ipa/remref-1.C
d26e3f0899c708e0f4b2ec8427502236 gcc/testsuite/g++.dg/ipa/remref-2.C
8a469d09a1c8b835acf9b3b8f7d8078d gcc/testsuite/g++.dg/ipa/type-inheritance-1.C
bc581baefa9c2cdf340c7afe5ec42620 gcc/testsuite/g++.dg/opt/pr59947.C
fcc0cbf12c3c1ff2231451798c2c5d37 gcc/testsuite/g++.dg/opt/pr60002.C
e676633b5d90b99891eacfad5d4d65cc gcc/testsuite/g++.dg/opt/pr60597.C
+cd9ce81573f1dd55ed9926ad0afbe423 gcc/testsuite/g++.dg/opt/pr60849.C
+2ca5ee004fc73e412a39de0dd38e1b4c gcc/testsuite/g++.dg/opt/pr60912.C
+b1b3a2b530cb188994df8ef142ab9234 gcc/testsuite/g++.dg/opt/pr61456.C
+6cfd7f0d8649e554551af4ecdbfa227e gcc/testsuite/g++.dg/opt/pr61654.C
ac2356162f00cd5e8804482480f1795a gcc/testsuite/g++.dg/opt/pr6713.C
90bdbfd9313461944756a9e9f01ce788 gcc/testsuite/g++.dg/opt/pr7503-1.C
1451eba24eea82cbd0c1ab87885c0f77 gcc/testsuite/g++.dg/opt/preinc1.C
f869a43935cc3631852fcb3f8e68ecfd gcc/testsuite/g++.dg/opt/thunk3.C
2abee99752ddcdc2d689d23397d7046e gcc/testsuite/g++.dg/opt/thunk4.C
240c5e869a8b5ad0a8bf6049a8d00862 gcc/testsuite/g++.dg/opt/tmp1.C
+88cb064325abdff24b813c432e193161 gcc/testsuite/g++.dg/opt/typeinfo1.C
5a0d1f452801f903b71f360e2af9dab9 gcc/testsuite/g++.dg/opt/unroll1.C
b3a23f133e24d6239172db5b22fe6824 gcc/testsuite/g++.dg/opt/unroll2.C
c0e183747d99b3a1525638800b213d82 gcc/testsuite/g++.dg/opt/value-init1.C
c48f8e06d0c4fb011bdd97b2641d239a gcc/testsuite/g++.dg/pr59510.C
6ef903a30658765c574e6f3aa8592058 gcc/testsuite/g++.dg/pr59695.C
423a4225250186b2746ca0c376b8124a gcc/testsuite/g++.dg/pr60518.C
+11692c0a1d9e603f30a38169f72d42aa gcc/testsuite/g++.dg/pr60969.C
+a11ecfc0510623f70458e31e48d431fb gcc/testsuite/g++.dg/pr61094.C
+fa5e79b3c98a745c039b5e34186024a2 gcc/testsuite/g++.dg/pr61289-2.c
+1ec6b4df7e034d65d4befa4778662d11 gcc/testsuite/g++.dg/pr61289.C
ae8863cdd596655bd9501c7a7e546fc7 gcc/testsuite/g++.dg/predict-loop-exit-1.C
112161f9cc2e99ed1a64b608b234d230 gcc/testsuite/g++.dg/predict-loop-exit-2.C
9fdf45388f73e8c9a46342cf4ec52cb6 gcc/testsuite/g++.dg/predict-loop-exit-3.C
142422aea9a677fb32502402e895a96d gcc/testsuite/g++.dg/template/conv11.C
6652f3b06cb1bfcdf341802d7b0a8a9a gcc/testsuite/g++.dg/template/conv12.C
c31c403acbaa655ae0413e1d4350ae4b gcc/testsuite/g++.dg/template/conv13.C
+c28b6679b01f4bbe8403c045289d2aef gcc/testsuite/g++.dg/template/conv14.C
383f6618c1ccaddea23b36ff23d6d35e gcc/testsuite/g++.dg/template/conv2.C
be5017725e9889a47d07ba0d3a3464ff gcc/testsuite/g++.dg/template/conv3.C
8e48e2a0d63cdb353b4a07380c4cf577 gcc/testsuite/g++.dg/template/conv4.C
331e9bd8d23757608f4687c51ab1c460 gcc/testsuite/g++.dg/template/koenig8.C
0e217ccc45d6ea239c0b368c1909c623 gcc/testsuite/g++.dg/template/koenig9.C
9eed8ce0831bf0313cab105488a8b9f3 gcc/testsuite/g++.dg/template/linkage1.C
+29182ba864d966fb7660afbfb5b53867 gcc/testsuite/g++.dg/template/local-fn1.C
b7860e67547fa0e658cae5b27a73d61b gcc/testsuite/g++.dg/template/local1.C
d32b0f4cfabbf7cf6a3f55db155096d2 gcc/testsuite/g++.dg/template/local2.C
e254df20b082728d0e04a8e1b3b18557 gcc/testsuite/g++.dg/template/local3.C
698fef868c92929bbef3fe847bfc6295 gcc/testsuite/g++.dg/template/pr4926-1.C
6465acc359cf71ed791739a364127805 gcc/testsuite/g++.dg/template/pr54858.C
bf2a6b6f0f8991958562eeb56f4d4738 gcc/testsuite/g++.dg/template/pr58878.C
+ae27fcfe45fb638bb620109e3d14cecf gcc/testsuite/g++.dg/template/pr61537.C
04907f98f8eab7c64ced6646f5140346 gcc/testsuite/g++.dg/template/pretty1.C
b1805d4b386b8dcd432f41c68e255100 gcc/testsuite/g++.dg/template/pseudodtor1.C
5bbbdc0bd84a1cf86dd283b16e7aa6ba gcc/testsuite/g++.dg/template/pseudodtor2.C
8694ad15b71a480035424c4134c7c412 gcc/testsuite/g++.dg/template/ptrmem24.C
486102b52761663d2915ac7d52f96b42 gcc/testsuite/g++.dg/template/ptrmem25.C
0d524ba59ac7aba767ec6a00d1495501 gcc/testsuite/g++.dg/template/ptrmem26.C
+5825625a5ba7d28fd8a1fdd113dde9c2 gcc/testsuite/g++.dg/template/ptrmem27.C
+d7e997028da5485d49789a1ed367286f gcc/testsuite/g++.dg/template/ptrmem28.C
171d82f45a76129388539c01e3212ec9 gcc/testsuite/g++.dg/template/ptrmem3.C
9a4a21b8504db815b1c727663eff64ff gcc/testsuite/g++.dg/template/ptrmem4.C
c1d71028a4f69f5c3fcfd2fd8a35f919 gcc/testsuite/g++.dg/template/ptrmem5.C
276b21ff0a55339a3b1af911f5514ec8 gcc/testsuite/g++.dg/tls/thread_local7.C
5cc77d589814bde9b85c3b12c619eb3c gcc/testsuite/g++.dg/tls/thread_local7g.C
9399e18da7889fb7fc5333e641e339e4 gcc/testsuite/g++.dg/tls/thread_local8.C
+46eb3382c1226c7ec68020221453058a gcc/testsuite/g++.dg/tls/thread_local9.C
5c58bf38e3547535a343718f69db04f0 gcc/testsuite/g++.dg/tls/tls.exp
7212556766805451a098e554a8ab648e gcc/testsuite/g++.dg/tls/trivial.C
debf53c602437e43da099fa943834a84 gcc/testsuite/g++.dg/tm/20100429.C
8c2dc2c3e3d744280501f821dd5cfb10 gcc/testsuite/g++.dg/torture/pr60659.C
59b64e493342855b4d4f60c5c5b2e866 gcc/testsuite/g++.dg/torture/pr60746.C
5f42e568cc105049d43016ffc65ea36f gcc/testsuite/g++.dg/torture/pr60750.C
+2cd5e243f12b5ca6cf66ca1966b24a84 gcc/testsuite/g++.dg/torture/pr60854.C
+ea51728c5e2ae154940893c6ccb374f8 gcc/testsuite/g++.dg/torture/pr60895.C
389892c1f2e87d69449479d1b053c70c gcc/testsuite/g++.dg/torture/predcom-1.C
d28910105d9c9253d94d70eacd5e19d4 gcc/testsuite/g++.dg/torture/pushpop_macro.C
a1b47b9c3e69d79d1895ebc4fd11032b gcc/testsuite/g++.dg/torture/stackalign/check.h
a82ef6cbe78155176eca6d640870c3a5 gcc/testsuite/g++.dg/tree-ssa/pr54515.C
0302793462643aeaccabd5c387ce8c93 gcc/testsuite/g++.dg/tree-ssa/pr57380.C
bb17cbedcbb5bcabb9ee8299f30c3ae9 gcc/testsuite/g++.dg/tree-ssa/pr58404.C
+22dc7006f5ec66c9a231712242810915 gcc/testsuite/g++.dg/tree-ssa/pr61009.C
d56e4fc904579446fb892941249b3b4a gcc/testsuite/g++.dg/tree-ssa/pr8781.C
1774a3db4e8c1c639d06cfd8ba95990d gcc/testsuite/g++.dg/tree-ssa/ptrmemfield.C
fe0c4f92b4591334dd40df6bbeb06f32 gcc/testsuite/g++.dg/tree-ssa/restrict1.C
7341ca0a00bff9809481068f2f734d5a gcc/testsuite/g++.dg/vect/pr60023.cc
43a78626ccd2affbd7d45540f8fc64d9 gcc/testsuite/g++.dg/vect/pr60559.cc
3bff2af6c3bfd7ad46d2d49817f2f165 gcc/testsuite/g++.dg/vect/pr60729.cc
+6fedf5fcd346e8a54e1ea882011da7e0 gcc/testsuite/g++.dg/vect/pr60836.cc
2319b033c4be551a98e6e2be4cfa22df gcc/testsuite/g++.dg/vect/slp-pr50413.cc
8d1334dabd32a7cd566077fb76b6ef3f gcc/testsuite/g++.dg/vect/slp-pr50819.cc
df93e1203b366a6199944cfb11b3ada2 gcc/testsuite/g++.dg/vect/slp-pr56812.cc
e700f43c9f64656f7363a44babf1d9f6 gcc/testsuite/gcc.c-torture/compile/pr60556.c
d49dbb297cb14ffa50798367f47b01d6 gcc/testsuite/gcc.c-torture/compile/pr60655-1.c
ecd86b2ec3c6e99f8c9357249b8569eb gcc/testsuite/gcc.c-torture/compile/pr60655-2.c
+eb9a44bf10d9af818d3d8df7abc434ba gcc/testsuite/gcc.c-torture/compile/pr61684.c
b9e6ce52b90320c1c3803c25113844c5 gcc/testsuite/gcc.c-torture/compile/pta-1.c
ed716c1d1727fc2c748162e0cbc4ee47 gcc/testsuite/gcc.c-torture/compile/ptr-conv-1.c
8d869e3426345f0cf8837c5eaafd43b5 gcc/testsuite/gcc.c-torture/compile/simd-1.c
91f48b05bc9d42c398d7b5856e001a8d gcc/testsuite/gcc.c-torture/execute/20131127-1.c
00319451004c266ad1b8c6aeb089eb51 gcc/testsuite/gcc.c-torture/execute/20140212-1.c
4ad9d497fc6da5c1d93322b91642142c gcc/testsuite/gcc.c-torture/execute/20140326-1.c
+a5f4cdd2313a084c86b42c022d5711d7 gcc/testsuite/gcc.c-torture/execute/20140425-1.c
65f01ac7346bd4d47ed9c1ca94ab74ff gcc/testsuite/gcc.c-torture/execute/900409-1.c
5aefab4daab0bd29ecf2a389f3c44f40 gcc/testsuite/gcc.c-torture/execute/920202-1.c
655936aaf9a63e991a555cbc16738485 gcc/testsuite/gcc.c-torture/execute/920302-1.c
c9a0c78ab7e5e97f8d9f79003415e3c1 gcc/testsuite/gcc.c-torture/execute/pr60062.c
525a1e55ab5e4b58132522416d2abb4a gcc/testsuite/gcc.c-torture/execute/pr60072.c
2d9ffe4c8d2f9f03fc51460365e7419e gcc/testsuite/gcc.c-torture/execute/pr60454.c
+1313e26f31dd7d7fb997709384d78e64 gcc/testsuite/gcc.c-torture/execute/pr60960.c
+0dd9a258a9aa977acb1fcfe61739ec9b gcc/testsuite/gcc.c-torture/execute/pr61306-1.c
+85315cbee1fd6adfa2a8d6182171fa12 gcc/testsuite/gcc.c-torture/execute/pr61306-2.c
+7fe7c6627598916a61238a0e4bf50f86 gcc/testsuite/gcc.c-torture/execute/pr61306-3.c
+d8403e0ce437d1323b68336029446357 gcc/testsuite/gcc.c-torture/execute/pr61673.c
+8b656e3edd75c4787214dc55255d9100 gcc/testsuite/gcc.c-torture/execute/pr61725.c
ecfc31f12ce09d6ccbcced04ff04deba gcc/testsuite/gcc.c-torture/execute/pr7284-1.c
89f3c7ee990221eeb33cb08a0772e024 gcc/testsuite/gcc.c-torture/execute/pr7284-1.x
f4610e3bba97324f7005c428fe41e597 gcc/testsuite/gcc.c-torture/execute/printf-1.c
6ac2201f5ceaf1d669d875abfffae276 gcc/testsuite/gcc.dg/graphite/pr46970.c
78520b60a1ee3851ffd28abd9cd2e62d gcc/testsuite/gcc.dg/graphite/pr50561.c
c09c7286c8fcd9cc08b18719c098cc60 gcc/testsuite/gcc.dg/graphite/pr54094.c
+fb5a862ce6ffbade0ae64b3575de6664 gcc/testsuite/gcc.dg/graphite/pr55022.c
+16b9ffb71e6313c09e32f8d47736f438 gcc/testsuite/gcc.dg/graphite/pr59817-1.c
+3ef979f48d76e0fd94ea3b71fc3510af gcc/testsuite/gcc.dg/graphite/pr59817-2.c
60c6684ae0f8c1d5b794c4d512a928be gcc/testsuite/gcc.dg/graphite/pr60740.c
ad18eaa8675b607e46c69dadd60f3046 gcc/testsuite/gcc.dg/graphite/pr60785.c
+1fdc11dc63213a067b8ee7e1279b9614 gcc/testsuite/gcc.dg/graphite/pr60979.c
16574d3df752f79e2361bed11b712e31 gcc/testsuite/gcc.dg/graphite/run-id-1.c
69c11dc302a921c92977db519167bec1 gcc/testsuite/gcc.dg/graphite/run-id-2.c
84a75a861553ce658d85018a3ced0a6b gcc/testsuite/gcc.dg/graphite/run-id-3.c
10073f0592215c1f150902dbd5bea335 gcc/testsuite/gcc.dg/lto/pr60404_1.c
57b84f9f4fb097f80fb864bc81c70abb gcc/testsuite/gcc.dg/lto/pr60404_2.c
729e7df711f59da5edc3a02fe050b9eb gcc/testsuite/gcc.dg/lto/pr60461_0.c
+fb92fea16dbb92181a81b79e2e378036 gcc/testsuite/gcc.dg/lto/pr60720_0.c
+06c25fe0c80b8959051a62f8f034710a gcc/testsuite/gcc.dg/lto/pr60720_1.c
+3ce380dc49e4f5afb926994881824b04 gcc/testsuite/gcc.dg/lto/pr60911_0.c
+ed72338ed55138cf037314e45f0f7818 gcc/testsuite/gcc.dg/lto/pr61526_0.c
+962b3087915e41e8111b94acdd55b56e gcc/testsuite/gcc.dg/lto/pr61526_1.c
e36db27b1e4084d326181d15570bf8d4 gcc/testsuite/gcc.dg/lto/resolutions_0.c
1084184a9b11a84eee39ef130211f70b gcc/testsuite/gcc.dg/lto/save-temps_0.c
69ff2353992f738ce7ea3cb89e9db1e4 gcc/testsuite/gcc.dg/lto/trans-mem-3_0.c
605598c67818ee5aed3cb1f08d3c11f5 gcc/testsuite/gcc.dg/pr57149.c
6c6b53f24a88f01056d8f7861eb857b7 gcc/testsuite/gcc.dg/pr57154.c
a7df18a8bb63d3ca237dbd1011053c66 gcc/testsuite/gcc.dg/pr57184.c
+7bcd989620a2a6b05c3e229f5137b250 gcc/testsuite/gcc.dg/pr57233.c
e39c9c23ce048b3d87fe811194ae9d86 gcc/testsuite/gcc.dg/pr57286.c
e9a2eae4a192d8e2e6dafa7ecc6cf398 gcc/testsuite/gcc.dg/pr57287-2.c
07aacbb657b227fe9d393af35c6bfb45 gcc/testsuite/gcc.dg/pr57287.c
32abf2686c9d3296f9fa19df9002094d gcc/testsuite/gcc.dg/pr60647-2.c
c124a95a6e3650b96ef3058205b5ac36 gcc/testsuite/gcc.dg/pr60704.c
2fcb562c88ced77b7ac0bce42b64f443 gcc/testsuite/gcc.dg/pr60797.c
+5559e398e075ca7f9141308579b0fac6 gcc/testsuite/gcc.dg/pr60844.c
+0f7df7fa948acd5723878ae4d5ebceb6 gcc/testsuite/gcc.dg/pr60866.c
+d2c91f0601aece029dd3340da8167e6d gcc/testsuite/gcc.dg/pr61045.c
+fd6f50979e00ca24a8dde2933369bb11 gcc/testsuite/gcc.dg/pr61053.c
+e2d94f81ab73335d50800841dbd4b12c gcc/testsuite/gcc.dg/pr61060.c
+cd63a4b9a9b728f357c9ed6bc626c585 gcc/testsuite/gcc.dg/pr61158.c
+cea828a43f670db18b27e331441da562 gcc/testsuite/gcc.dg/pr61583.c
8b7d73da2d5d78000716492365a85d5a gcc/testsuite/gcc.dg/pr8715.c
3d08410b2dd57259aa63f0e1c64b376e gcc/testsuite/gcc.dg/pr8788-1.c
be04382a35ebb1cfae1b2168f1693a94 gcc/testsuite/gcc.dg/pr8835-1.c
5564f74a800596aaf87f8e8cb5453803 gcc/testsuite/gcc.dg/torture/pr57748-2.c
76796ab921180653905caef9c792720e gcc/testsuite/gcc.dg/torture/pr57748-3.c
85d58426bedaf1d6a74d38d55833e66d gcc/testsuite/gcc.dg/torture/pr57748-4.c
+5bfa303899e64bffcddb82847e6a434f gcc/testsuite/gcc.dg/torture/pr57864.c
6593178a39cf24816cba3dab5b42f172 gcc/testsuite/gcc.dg/torture/pr57993-2.cpp
8f27084dca98134d7f524112d900a2d1 gcc/testsuite/gcc.dg/torture/pr57993.c
95154523d1488e9fe16d67474343c8d5 gcc/testsuite/gcc.dg/torture/pr58018.c
3e0dd582d51f218aa9dbe4841686c12a gcc/testsuite/gcc.dg/torture/pr60183.c
128cefe94a9f05e84df676feb8e099af gcc/testsuite/gcc.dg/torture/pr60733.c
bc7d88b95c8be08a1a73b15283ed1f06 gcc/testsuite/gcc.dg/torture/pr60766.c
+d6d4353931f1be7031525660bdb72067 gcc/testsuite/gcc.dg/torture/pr60891.c
+b7419f520b851243b27be91c272be4ec gcc/testsuite/gcc.dg/torture/pr60903.c
+cd6896f9999dc19951f9e8e74e12f5f8 gcc/testsuite/gcc.dg/torture/pr60930.c
+dde8b20bde292ea6876f078bf22cadef gcc/testsuite/gcc.dg/torture/pr61010.c
+aa3d4a99808d1f2c872d909445ade1a8 gcc/testsuite/gcc.dg/torture/pr61383-1.c
+1aae51ae4d0d0a6f4039b24e664b4b9e gcc/testsuite/gcc.dg/torture/pr61452.c
+025a7e9b280231e992477ec24bb46a30 gcc/testsuite/gcc.dg/torture/pr61681.c
c99c3745eca0ddc81822cc070070a4d3 gcc/testsuite/gcc.dg/torture/pr8081.c
b3a9e4f2af6462183da8d6c5cb13bf1f gcc/testsuite/gcc.dg/torture/pta-callused-1.c
98fde0e59e55c1ed923ee9d9f034d7f2 gcc/testsuite/gcc.dg/torture/pta-escape-1.c
82856885ede689411173996a10bc876e gcc/testsuite/gcc.dg/tree-ssa/alias-28.c
0636ce20d822dd25b9d5ce792a2c3820 gcc/testsuite/gcc.dg/tree-ssa/alias-29.c
bb1c37124577d61c99b7e5ebd9d72713 gcc/testsuite/gcc.dg/tree-ssa/alias-3.c
-52fc06fea0d8944a3c7c7cf58329c649 gcc/testsuite/gcc.dg/tree-ssa/alias-30.c
+79dfb5b1039d2883100bde8c195d39c4 gcc/testsuite/gcc.dg/tree-ssa/alias-30.c
8cfc15afdd6d383287dda63878fc6083 gcc/testsuite/gcc.dg/tree-ssa/alias-31.c
104c2bb3b44866aa1a413bc286888421 gcc/testsuite/gcc.dg/tree-ssa/alias-4.c
02459b5c01776fac9cbf076da37d3770 gcc/testsuite/gcc.dg/tree-ssa/alias-5.c
9118470b664eadf52ee002874f4f83c4 gcc/testsuite/gcc.dg/tree-ssa/vrp88.c
35eaff882f33c5b61e50dd87a512ef72 gcc/testsuite/gcc.dg/tree-ssa/vrp89.c
5a6aee859816e05547591897194aa650 gcc/testsuite/gcc.dg/tree-ssa/vrp90.c
+d81d6e7cd77843ad59286339d261f89c gcc/testsuite/gcc.dg/tree-ssa/vrp93.c
63176004cb8d9a996e6fed7812d7df94 gcc/testsuite/gcc.dg/tree-ssa/wholeprogram-1.c
22cecfb6e50e9a0bfcb8417c616ecff4 gcc/testsuite/gcc.dg/tree-ssa/wholeprogram-2.c
22eb0b8eeae794a6956326b2c9383fb2 gcc/testsuite/gcc.dg/trunc-1.c
7b938b0cb614b822c40b1d1cd3386863 gcc/testsuite/gcc.dg/typedef-redecl.h
44e859486a96c5bde24ac67ae73472fe gcc/testsuite/gcc.dg/typename-vla-1.c
0347a7dc32b8dfb279bdfe3b50e84008 gcc/testsuite/gcc.dg/typeof-1.c
+a083e6af94dd22dcc82f08d47dc1c665 gcc/testsuite/gcc.dg/typeof-2.c
38f4467be27d0432adea9abcaf9cc366 gcc/testsuite/gcc.dg/typespec-1.c
7740693c7bb19d8fc6ab727a6ffbb65c gcc/testsuite/gcc.dg/ubsan/c-shift-1.c
2dbfddf9f012a91eb07b3c83841941a1 gcc/testsuite/gcc.dg/ubsan/c99-shift-1.c
43d1bfb1c3e82e590c699df9328c86ff gcc/testsuite/gcc.dg/unused-6-no.c
e3db8ed02ca0ecad28455ac3f0b93696 gcc/testsuite/gcc.dg/unused-6.c
b9094e47fb1bcf5228d5a172f181d34c gcc/testsuite/gcc.dg/unused-7.c
+615e1e240a379f560bb499664764aa19 gcc/testsuite/gcc.dg/unused-8b.c
3026c7972826035f46319fe0338270d0 gcc/testsuite/gcc.dg/unwind-1.c
82e97901e9d95cb7baff3da146a5c919 gcc/testsuite/gcc.dg/utf-array-short-wchar.c
58bb3d290d515392b37ec7e27a115e8e gcc/testsuite/gcc.dg/utf-array.c
a866350e19555393d6961e8b412e9124 gcc/testsuite/gcc.dg/vect/pr60276.c
b107b5d9d8332504cce7d4f98d0296f7 gcc/testsuite/gcc.dg/vect/pr60382.c
170c5596ccb511f48df93f8649f3aba7 gcc/testsuite/gcc.dg/vect/pr60482.c
-6238a8b7620ccb76249b00f14ace3ada gcc/testsuite/gcc.dg/vect/pr60505.c
+97f0138cf5bdb9cb11d8e107c00bc27c gcc/testsuite/gcc.dg/vect/pr60505.c
410bc9651b5f4b0552af7cad596832e8 gcc/testsuite/gcc.dg/vect/pr60656.c
+72142e96ba1e228790f86e7f25a6c1a5 gcc/testsuite/gcc.dg/vect/pr60841.c
+785dfb8a3638e3ded94e5cc79249383c gcc/testsuite/gcc.dg/vect/pr61680.c
0706a6b1e589668022cd055b960dd18d gcc/testsuite/gcc.dg/vect/section-anchors-pr27770.c
260e2f31b30dda89387f41e7bfe71e1e gcc/testsuite/gcc.dg/vect/section-anchors-vect-69.c
4d2e98feff81733536fba7cd2d0ca053 gcc/testsuite/gcc.dg/vect/slp-1.c
2ea572faabfe8ccd2ffe73544be74ef0 gcc/testsuite/gcc.dg/vect/vect-simd-clone-7.c
1b4a10a7ec4c46b91adfa18c3ce75e34 gcc/testsuite/gcc.dg/vect/vect-simd-clone-8.c
a4edce28556de1d94f24aa4e027ca78b gcc/testsuite/gcc.dg/vect/vect-simd-clone-9.c
+4f938eaebf48217ae438f73dece6a598 gcc/testsuite/gcc.dg/vect/vect-singleton_1.c
a5494bfefae827ff7fb0c991ea9b9905 gcc/testsuite/gcc.dg/vect/vect-strided-a-mult.c
12b7de6813a00befbee70dae6f9aed0d gcc/testsuite/gcc.dg/vect/vect-strided-a-u16-i2.c
d82347f60e7f2f61b695aca0b0162789 gcc/testsuite/gcc.dg/vect/vect-strided-a-u16-i4.c
18d22f4befcbe16f0fa91b011350e636 gcc/testsuite/gcc.dg/vect/vect-widen-shift-s8.c
b53fd5a38e5c7fb23c4d7cdddd35a122 gcc/testsuite/gcc.dg/vect/vect-widen-shift-u16.c
7cf39e0b990d4134843cf0934748018d gcc/testsuite/gcc.dg/vect/vect-widen-shift-u8.c
-4f87272d5e98bcddb685a783562b6553 gcc/testsuite/gcc.dg/vect/vect.exp
+51cf30fb13a2f5b1cab0c930e14801fe gcc/testsuite/gcc.dg/vect/vect.exp
70f5bfe5c3206bb27ef00df04395f1b4 gcc/testsuite/gcc.dg/vect/wrapv-vect-7.c
c1a258213052c3dfbc9b6a8c1c0d6d6c gcc/testsuite/gcc.dg/vect/wrapv-vect-reduc-2char.c
1e23759ae2d20580a48c9849cfca511f gcc/testsuite/gcc.dg/vect/wrapv-vect-reduc-2short.c
c3039576bdd2e286778c9c26319c1266 gcc/testsuite/gcc.dg/vmx/ldl.c
02e4a282249f914f0c14a216ba9d4cfc gcc/testsuite/gcc.dg/vmx/mem.c
6aae24591b76899daf226454ac9b1991 gcc/testsuite/gcc.dg/vmx/merge-be-order.c
-eee9871ed36b20241187f151e4501a99 gcc/testsuite/gcc.dg/vmx/merge-vsx-be-order.c
-25b17ce14463feddc218415eb2a5416b gcc/testsuite/gcc.dg/vmx/merge-vsx.c
+201b16426a5ac5b3987ba0dccc6f5a71 gcc/testsuite/gcc.dg/vmx/merge-vsx-be-order.c
+2e6a5aaa5824f852ad0030af451aeb08 gcc/testsuite/gcc.dg/vmx/merge-vsx.c
eb7dd9debe1674f5d04a9841461e4954 gcc/testsuite/gcc.dg/vmx/merge.c
1bf3417266f1541ffcf1dd896b544b2e gcc/testsuite/gcc.dg/vmx/mult-even-odd-be-order.c
69b4a248b11c1f8cdf318024cf68f3f6 gcc/testsuite/gcc.dg/vmx/mult-even-odd.c
5c50cda62bd8e028126d50524394cdcb gcc/testsuite/gcc.target/aarch64/aapcs64/test_complex.c
610639db1ddaee1b632bcaa03ae9e6d0 gcc/testsuite/gcc.target/aarch64/aapcs64/test_int128.c
6fda7511aca063408b079c2bb62031f8 gcc/testsuite/gcc.target/aarch64/aapcs64/test_quad_double.c
-2e77e4f91eafedcc40bca64ef88e8b3b gcc/testsuite/gcc.target/aarch64/aapcs64/type-def.h
+d9b74395ab6c4b86397ebb8c4882b21d gcc/testsuite/gcc.target/aarch64/aapcs64/type-def.h
8105c81103c5a63620a7b427d2c63471 gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg-1.c
596c2fbda9662178d39bdc8ca38a7b1e gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg-10.c
00b5c9f8a1a7953292a641277343cd80 gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg-11.c
d58c21aeac15c87b49b1a0cd83c5562a gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg-12.c
+5e80c8e2752a7c20800c170ed731fe83 gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg-13.c
+7277fa58dadb57113bc4495170498ae7 gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg-14.c
+d6d753fee2cc939c6e58cf69a3d84ce4 gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg-15.c
c4a5214c8570b2f0d809b0b52d72ec6d gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg-2.c
698de05abc498110e864a6e761b3aafb gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg-3.c
09b5b23890423c4c38ce2ed600d2f778 gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg-4.c
2ace503de1ebaa7ecee3cea5bdce43de gcc/testsuite/gcc.target/aarch64/pr60580_1.c
e3c168f45423111f89f16b75f8973c92 gcc/testsuite/gcc.target/aarch64/pr60675.C
ed3b25503ac7374fb7c47e079eb1318a gcc/testsuite/gcc.target/aarch64/pr60697.c
+2cd11476b07e206416f5d88420120ea5 gcc/testsuite/gcc.target/aarch64/pr61325.c
1f95766b4ed5bfb5f2cf1f168a607a8d gcc/testsuite/gcc.target/aarch64/predefine_large.c
d38e476730748c653068e7cb2d8d6ca6 gcc/testsuite/gcc.target/aarch64/predefine_small.c
29e7dbfba15c0f945488b33400b908b4 gcc/testsuite/gcc.target/aarch64/predefine_tiny.c
c5df9016ed51439c58173bf78280bc69 gcc/testsuite/gcc.target/aarch64/sbc.c
3b9354b9a15c8705b143711e5a0eb3cd gcc/testsuite/gcc.target/aarch64/scalar-mov.c
cf90801aa8927a70a5207b4cac2643b6 gcc/testsuite/gcc.target/aarch64/scalar-vca.c
-6cff277ed03444b13a1a7fea53b2a71d gcc/testsuite/gcc.target/aarch64/scalar_intrinsics.c
+56d1246ba8fe7a1c8c69a5ef49e39c01 gcc/testsuite/gcc.target/aarch64/scalar_intrinsics.c
d1af130615ebe55d6b2860145acf25fd gcc/testsuite/gcc.target/aarch64/scalar_shift_1.c
884050a96b25562ba73e9f6cd428f9ee gcc/testsuite/gcc.target/aarch64/sha1_1.c
fad4b886793516ea2f18ca518bf21e4c gcc/testsuite/gcc.target/aarch64/sha256_1.c
35df028f9c45bc9929182bb919a59563 gcc/testsuite/gcc.target/aarch64/vect.x
13829a5e264dfff8be4651d236a5da67 gcc/testsuite/gcc.target/aarch64/vect_saddl_1.c
3ebb64e885f488f353df6f1a07e997f1 gcc/testsuite/gcc.target/aarch64/vect_smlal_1.c
-5dca5816500cf4784a43933915a3fdb8 gcc/testsuite/gcc.target/aarch64/vector_intrinsics.c
+91822962d5a71129a8f94a0f50f2c42b gcc/testsuite/gcc.target/aarch64/vector_intrinsics.c
7e66886d01e17a3d5f4d365e18f11743 gcc/testsuite/gcc.target/aarch64/vfp-1.c
73ca66c42633ffbd35e499d89601c37a gcc/testsuite/gcc.target/aarch64/vld1-vst1_1.c
bdf9d08039684c459d9bd2f4906dba34 gcc/testsuite/gcc.target/aarch64/vmlsq_laneq.c
2655ac4297efd263942058c5d2f07f09 gcc/testsuite/gcc.target/aarch64/volatile-bitfields-1.c
8c5d2f2ef90312aaf1f0ada7c6b329b2 gcc/testsuite/gcc.target/aarch64/volatile-bitfields-2.c
db870a58bd047a3aea6a980e79d5f714 gcc/testsuite/gcc.target/aarch64/volatile-bitfields-3.c
+4880f29a3f855267072d6713a36969fb gcc/testsuite/gcc.target/aarch64/vqdmlal_high_lane_s16.c
+16dbe1aa44f454b09e980c7ad06eb278 gcc/testsuite/gcc.target/aarch64/vqdmlal_high_lane_s32.c
+55ef09719ca2f0ecea8218e071ac1246 gcc/testsuite/gcc.target/aarch64/vqdmlal_high_laneq_s16.c
+994fe4c63942b47dea509de593933512 gcc/testsuite/gcc.target/aarch64/vqdmlal_high_laneq_s32.c
+c6bc4fe7173b43fecb1b589646f1c198 gcc/testsuite/gcc.target/aarch64/vqdmlal_lane_s16.c
+a36e6cd2b3e52a4451f4864f20b7bdf5 gcc/testsuite/gcc.target/aarch64/vqdmlal_lane_s32.c
+82aaa586748c7bdcd0525bb1c3b57521 gcc/testsuite/gcc.target/aarch64/vqdmlal_laneq_s16.c
+e1ab7dc0ed83021115757cceb8111f18 gcc/testsuite/gcc.target/aarch64/vqdmlal_laneq_s32.c
+4fce87a86d51e4f66b9e342f66691dd9 gcc/testsuite/gcc.target/aarch64/vqdmlalh_lane_s16.c
+88d50cd2ba32778ba86aa966ccd451bd gcc/testsuite/gcc.target/aarch64/vqdmlals_lane_s32.c
+4d4b80bf2fe2d60827fdccb395deef0e gcc/testsuite/gcc.target/aarch64/vqdmlsl_high_lane_s16.c
+001a3277d06cc27a92070399fac1b2f6 gcc/testsuite/gcc.target/aarch64/vqdmlsl_high_lane_s32.c
+5e2ff8ce7f9e2099ca2180b84e6ce735 gcc/testsuite/gcc.target/aarch64/vqdmlsl_high_laneq_s16.c
+0b5a5e1fec4fd47d767b00883155e2db gcc/testsuite/gcc.target/aarch64/vqdmlsl_high_laneq_s32.c
+e846b77f02543314b1300023b0b20886 gcc/testsuite/gcc.target/aarch64/vqdmlsl_lane_s16.c
+7e94044d77773057ce614ba332db4c6c gcc/testsuite/gcc.target/aarch64/vqdmlsl_lane_s32.c
+32fc41cef895166fc1858057d8b40ade gcc/testsuite/gcc.target/aarch64/vqdmlsl_laneq_s32.c
+9338c9acb58e94014bef883c1a69cb19 gcc/testsuite/gcc.target/aarch64/vqdmlslh_lane_s16.c
+d5985f9d81afdb5d83ad5045d90e73c1 gcc/testsuite/gcc.target/aarch64/vqdmlsls_lane_s32.c
+0441469dd7f151cc6c5731908a0e2290 gcc/testsuite/gcc.target/aarch64/vqdmulh_laneq_s16.c
+ef977c11a066a47886fbc566d87b8266 gcc/testsuite/gcc.target/aarch64/vqdmulh_laneq_s32.c
+a812fdfe34a76fc538357652347138d6 gcc/testsuite/gcc.target/aarch64/vqdmulhh_lane_s16.c
+e6ae3f3cd8a16f1878dfe66ecac225c5 gcc/testsuite/gcc.target/aarch64/vqdmulhq_laneq_s16.c
+c0143267913c582d11a900fb22512cc5 gcc/testsuite/gcc.target/aarch64/vqdmulhq_laneq_s32.c
+115b31e912529a41935f4e844e876c4e gcc/testsuite/gcc.target/aarch64/vqdmulhs_lane_s32.c
+a3478ab1544de7f28c956bf030956380 gcc/testsuite/gcc.target/aarch64/vqdmull_high_lane_s16.c
+9b068e636142b0e6f8545b14bb01182c gcc/testsuite/gcc.target/aarch64/vqdmull_high_lane_s32.c
+a2a2bc1805727ecf2ce28596ff256fd8 gcc/testsuite/gcc.target/aarch64/vqdmull_high_laneq_s16.c
+5051bef6fcb95f2efdda615f8656d28c gcc/testsuite/gcc.target/aarch64/vqdmull_high_laneq_s32.c
+cf0806833b64e1195163f938859c2746 gcc/testsuite/gcc.target/aarch64/vqdmull_lane_s16.c
+acedc8b153776b4c42a579f48c279def gcc/testsuite/gcc.target/aarch64/vqdmull_lane_s32.c
+c662c11ea6a4cbbb56370052be7a33d0 gcc/testsuite/gcc.target/aarch64/vqdmull_laneq_s16.c
+f23677232fded6eda2bf48c5365709ea gcc/testsuite/gcc.target/aarch64/vqdmull_laneq_s32.c
+32975050892de47266a0e7e7d7749ba7 gcc/testsuite/gcc.target/aarch64/vqdmullh_lane_s16.c
+5f5f50626865012ae817cdc53d304530 gcc/testsuite/gcc.target/aarch64/vqdmulls_lane_s32.c
+c4dd8458d2d0d59f11c4ca346f5d72d4 gcc/testsuite/gcc.target/aarch64/vqrdmulh_laneq_s16.c
+4bafd8c78bcdf37b8dc4e363f70bf419 gcc/testsuite/gcc.target/aarch64/vqrdmulh_laneq_s32.c
+6ed6331d4a8ff6811a7ff9b0db24e816 gcc/testsuite/gcc.target/aarch64/vqrdmulhh_lane_s16.c
+d3da33c25fd27944e08a0e313a6ce076 gcc/testsuite/gcc.target/aarch64/vqrdmulhq_laneq_s16.c
+2f708ea62e1d637ade19885393e84c8c gcc/testsuite/gcc.target/aarch64/vqrdmulhq_laneq_s32.c
+2b9269bfb1a01995a26b521e3573feae gcc/testsuite/gcc.target/aarch64/vqrdmulhs_lane_s32.c
58dd6a3e44637fe97e1b64ad80330e95 gcc/testsuite/gcc.target/aarch64/vrecps.c
907c5d0330b8ae449375937f25cb5507 gcc/testsuite/gcc.target/aarch64/vrecpx.c
93fc6cd2c39a0e44d5a8f0087756fdd1 gcc/testsuite/gcc.target/aarch64/vsqrt.c
463af7840e4a680c4f850f8d5dfafd3f gcc/testsuite/gcc.target/alpha/pr42448-1.c
0539ee2bde042196f5382b5c738d4f43 gcc/testsuite/gcc.target/alpha/pr42448-2.c
5f0298d225684c28c36ad42548aeccbd gcc/testsuite/gcc.target/alpha/pr42774.c
+4b2dcff48566cef7a104bfadab9354cc gcc/testsuite/gcc.target/alpha/pr61586.c
fb02079e819ba875a046565cb325ff01 gcc/testsuite/gcc.target/arc/arc.exp
423fbfcb77e8a6141ca45a6a918e7d06 gcc/testsuite/gcc.target/arc/barrel-shifter-1.c
bad20bd941c5cc11536e8d6b5713cdee gcc/testsuite/gcc.target/arc/barrel-shifter-2.c
8b33facd3d82cfd7450f01caa40b46f5 gcc/testsuite/gcc.target/arm/pr46975-2.c
12462c8de0d3b9414c8dad41ea05d880 gcc/testsuite/gcc.target/arm/pr46975.c
ed98495500264d289525aebfd2fbd62f gcc/testsuite/gcc.target/arm/pr48183.c
-5d7de550ff9a13f490729c73dc59f1c5 gcc/testsuite/gcc.target/arm/pr48252.c
+d744fbeefa1a3fbcff67f43fc4dddd53 gcc/testsuite/gcc.target/arm/pr48252.c
ec5b96b8283a62c791f40ad2c7334d85 gcc/testsuite/gcc.target/arm/pr49641.c
1b0c11d109e5c1c7dd206ab3c72d6e20 gcc/testsuite/gcc.target/arm/pr50099.c
09333e2679d051041e8e33c603eb8b26 gcc/testsuite/gcc.target/arm/pr50305.c
2931177f4aeff49d531d5474224448f6 gcc/testsuite/gcc.target/avr/pr46779-1.c
572dc228e08385a1db0fcbab66dbaa4e gcc/testsuite/gcc.target/avr/pr46779-2.c
421d2b9b36fa2496dce05d129d2c352b gcc/testsuite/gcc.target/avr/pr58545.c
+9e82df166e8b559cb56d2c4f48cbaf30 gcc/testsuite/gcc.target/avr/pr60991.c
881cb1836ddfc3105e0aacacc481aa09 gcc/testsuite/gcc.target/avr/progmem-error-1.c
2eb3f167ae58b534e25afc1b94617746 gcc/testsuite/gcc.target/avr/progmem-error-1.cpp
56de611fd29076ce9da389a853476819 gcc/testsuite/gcc.target/avr/progmem-warning-1.c
70b849f57ecf42299230b99b7734dd2d gcc/testsuite/gcc.target/avr/torture/pr51374-1.c
640699ff4839c2a7798488c85177d381 gcc/testsuite/gcc.target/avr/torture/pr51782-1.c
006a6c5a86a749ba6291dfb65e0376e0 gcc/testsuite/gcc.target/avr/torture/pr57631.c
+fea352b16ae79edc9965b1f39680a709 gcc/testsuite/gcc.target/avr/torture/pr61055.c
+2531c68fb11c95a62490386167ef9148 gcc/testsuite/gcc.target/avr/torture/pr61443.c
21a45d34960ba9567b9f2483d22c843f gcc/testsuite/gcc.target/avr/torture/progmem-1.c
564c71a894aff68e98d5c4a6db2b47ae gcc/testsuite/gcc.target/avr/torture/progmem-1.cpp
e3e1c41865f5287c9ff7e200745758fd gcc/testsuite/gcc.target/avr/torture/sat-hr-plus-minus.c
46322bf9b32fe645dd973a6bc8e8b128 gcc/testsuite/gcc.target/i386/avx-os-support.h
62aa13560c827f799be1941a2e6da500 gcc/testsuite/gcc.target/i386/avx-pr51581-1.c
c437ae63e2540199d8c765547fc407d6 gcc/testsuite/gcc.target/i386/avx-pr51581-2.c
+2f44e29670d30f0c444f2637c627c838 gcc/testsuite/gcc.target/i386/avx-pr57233.c
4e3d37bb04b99394790fa9e8caddf790 gcc/testsuite/gcc.target/i386/avx-recip-vec.c
02ae18a66bd7b76f7a651b896f066b70 gcc/testsuite/gcc.target/i386/avx-reduc-1.c
772f703b19bb27d5947d136a2f72221e gcc/testsuite/gcc.target/i386/avx-rint-sfix-2-vec.c
fe43a9deff46d9922603adbeeafc1bca gcc/testsuite/gcc.target/i386/avx2-mul-1.c
a544282846ec57648b2f38abf14119f0 gcc/testsuite/gcc.target/i386/avx2-pr51581-1.c
46ffedd4e5e66cd46ad561ee8562eb7b gcc/testsuite/gcc.target/i386/avx2-pr51581-2.c
+bbb7100a6167d19314d56f1bcc1d4b22 gcc/testsuite/gcc.target/i386/avx2-pr57233.c
2b83554762241a146df7ccc1617e1bfa gcc/testsuite/gcc.target/i386/avx2-vbroadcastsd_pd-1.c
193f0a7d029b84ce4e3b2e58eac8240a gcc/testsuite/gcc.target/i386/avx2-vbroadcastsd_pd-2.c
84a46e7f4338347591f1c8fe0aaceda5 gcc/testsuite/gcc.target/i386/avx2-vbroadcastsi128-1.c
8313d814dd34953aeb41fdd1137e6236 gcc/testsuite/gcc.target/i386/avx512f-kxorw-1.c
88679aecb941ef98e4955fd53f24d648 gcc/testsuite/gcc.target/i386/avx512f-mask-type.h
20d7791d447e454dc99dd9e328d38933 gcc/testsuite/gcc.target/i386/avx512f-os-support.h
+b41e564451920ed5e6e2cc790be57646 gcc/testsuite/gcc.target/i386/avx512f-pr57233.c
5158ac78802e368957a44c0f68b3b5d8 gcc/testsuite/gcc.target/i386/avx512f-rounding.c
c5975a79a4ea5a75acc7b38b9e6c0c44 gcc/testsuite/gcc.target/i386/avx512f-set-v16sf-1.c
bea9dbd9114c8bb3fcd47ad0281ff5c2 gcc/testsuite/gcc.target/i386/avx512f-set-v16sf-2.c
371f18813dae88e704517a2270da2fa7 gcc/testsuite/gcc.target/i386/call-1.c
e7febacbd793814a1bdb3f04d9d9fc7f gcc/testsuite/gcc.target/i386/cleanup-1.c
4b6997eef25c42383324aa984b9b8791 gcc/testsuite/gcc.target/i386/cleanup-2.c
-e0242c2120b4d7e26149885baf8fd877 gcc/testsuite/gcc.target/i386/clearcap.map
-49b2c5d20796b3d7cb793898b4398535 gcc/testsuite/gcc.target/i386/clearcapv2.map
d4153e1bcf8bc5c311eaf09c93c16d08 gcc/testsuite/gcc.target/i386/clobbers.c
538ab6e8a06c514c724312c46aa4c439 gcc/testsuite/gcc.target/i386/cmov1.c
86cfb515b99e6eea4c48ca1ca4343c48 gcc/testsuite/gcc.target/i386/cmov2.c
d95f56a3f95ba78c3fdb5f418f8d953a gcc/testsuite/gcc.target/i386/hle-xchg-rel-1.c
c937938a0a49e70d699ee5ef70d33cb0 gcc/testsuite/gcc.target/i386/hle-xor-acq-1.c
7aef940035776cbf7ecabc540f63e33e gcc/testsuite/gcc.target/i386/hle-xor-rel-1.c
-1eddd48bb50f37a551309ded89196b6a gcc/testsuite/gcc.target/i386/i386.exp
+9e81adfeacb71e7e4e47ef1578ca849d gcc/testsuite/gcc.target/i386/i386.exp
2f691e14b36dfbcafcb11e2029b39ccc gcc/testsuite/gcc.target/i386/ifcvt-onecmpl-abs-1.c
05bb360a025eed6dd019b28ad5032c23 gcc/testsuite/gcc.target/i386/incoming-1.c
4770d945ceafa0ce8aaebccfb7094734 gcc/testsuite/gcc.target/i386/incoming-10.c
4be3438b496af45547bcaa622d04847f gcc/testsuite/gcc.target/i386/pr57098.c
a995edc07e467f878e75e842897b1cfd gcc/testsuite/gcc.target/i386/pr57106.c
24a8a0f263659238a672eac710e62c30 gcc/testsuite/gcc.target/i386/pr57189.c
+bb5074395957224a22a9703b2d5a55a9 gcc/testsuite/gcc.target/i386/pr57233.c
1be3cad52880bd204c5668a12dc63bc1 gcc/testsuite/gcc.target/i386/pr57264.c
14e07824556dcc3c9478b054976196a3 gcc/testsuite/gcc.target/i386/pr57275.c
6af7e4a1f6e542e19ce56a5b5cd909ab gcc/testsuite/gcc.target/i386/pr57293.c
697da7d0cc19b38fd886149eb3d4af13 gcc/testsuite/gcc.target/i386/pr60516.c
3c94cee0c51e457793c9d3861c12d06d gcc/testsuite/gcc.target/i386/pr60693.c
aa9afa3fae8ccdc655d286ee8211123a gcc/testsuite/gcc.target/i386/pr60700.c
+8166dccdf85e516834c35488dbde09e2 gcc/testsuite/gcc.target/i386/pr60868.c
+34cfaa1a2bf79cc8b3e8376802fd83e9 gcc/testsuite/gcc.target/i386/pr60901.c
+dd8e17a0fafdd705a4f0de3d73c4d9c0 gcc/testsuite/gcc.target/i386/pr60902.c
+90c5be2a3f80aff7d7204eaa36133881 gcc/testsuite/gcc.target/i386/pr60909-1.c
+65d3cafc066a01d0520d7d9137813522 gcc/testsuite/gcc.target/i386/pr60909-2.c
+c2ad80ced67848aa724c64790fae16e7 gcc/testsuite/gcc.target/i386/pr61423.c
+2e681bb97b6870c8edb1514a2edad73a gcc/testsuite/gcc.target/i386/pr61446.c
849234c7a569c1e86023244bc5561263 gcc/testsuite/gcc.target/i386/pr9771-1.c
24ceb6d5f3f5cde4b9d852839bdb98ae gcc/testsuite/gcc.target/i386/prefetchw-1.c
f11f4731c396f099373c033ab016a64f gcc/testsuite/gcc.target/i386/prefetchwt1-1.c
d1e0ff73b10eb61ca8fa06128a453ef9 gcc/testsuite/gcc.target/i386/sse2-pmullw-1.c
308fe64b1fe9bf78b6b4ed03b89a6c2f gcc/testsuite/gcc.target/i386/sse2-pmuludq-1.c
5a4b1b55ad120b0697aa2b141f831dcc gcc/testsuite/gcc.target/i386/sse2-por-1.c
+75bdc67a274c371dd4d0c3ceef63beb2 gcc/testsuite/gcc.target/i386/sse2-pr57233.c
306e316bf36fd1022168fa5560198f41 gcc/testsuite/gcc.target/i386/sse2-psadbw-1.c
31949c673c69db630bfaf04449d2677f gcc/testsuite/gcc.target/i386/sse2-pshufd-1.c
2890c692e114956ac819984c965d389e gcc/testsuite/gcc.target/i386/sse2-pshufhw-1.c
80fc45c82401c81c8e327977d855adfe gcc/testsuite/gcc.target/i386/vcvtps2ph-1.c
62f75fee089e9d7544817acc173d5b9e gcc/testsuite/gcc.target/i386/vcvtps2ph-2.c
7bfd4b219fe89df5db7d39dd83f07267 gcc/testsuite/gcc.target/i386/vcvtps2ph-3.c
+c3845076ba5898729c1d858ed48d8182 gcc/testsuite/gcc.target/i386/vec-may_alias.c
6c6b35f324ed291cf10b22e9a8f246a4 gcc/testsuite/gcc.target/i386/vecinit-1.c
8c76c9fbb837c00a866f4323808181a0 gcc/testsuite/gcc.target/i386/vecinit-2.c
5c31804a1a01677fce626685b7d3670c gcc/testsuite/gcc.target/i386/vecinit-3.c
a390d40d8a1affb5cd5f9f3db7a982e8 gcc/testsuite/gcc.target/i386/xop-mul-1.c
27be770a892c0916dde5fc60ad029da4 gcc/testsuite/gcc.target/i386/xop-pcmov.c
e5032ce4f2014410ac00439c345542c0 gcc/testsuite/gcc.target/i386/xop-pcmov2.c
+ddea8eaf8adf3f52c33c08d0906add75 gcc/testsuite/gcc.target/i386/xop-pr57233.c
2ab60c120001ef1c9c38bbff7a7468e7 gcc/testsuite/gcc.target/i386/xop-rotate1-int.c
746d986b57318d368f4af996e78bcbc0 gcc/testsuite/gcc.target/i386/xop-rotate1-vector.c
cb282467b4bd7e59d4a2c3df01f5daa1 gcc/testsuite/gcc.target/i386/xop-rotate2-int.c
e476471a7edb5f299042583dac1e4886 gcc/testsuite/gcc.target/powerpc/atomic-p8.c
1bb3c02dda5fc71d0e39b0833c955824 gcc/testsuite/gcc.target/powerpc/atomic_load_store-p8.c
f7e7c3525d555350473e6eaeb20a763c gcc/testsuite/gcc.target/powerpc/avoid-indexed-addresses.c
+68a98ba6065eb1bd5a5a38ffaebe3628 gcc/testsuite/gcc.target/powerpc/bcd-1.c
+4c4454e8a943ac537214d0651d7689fc gcc/testsuite/gcc.target/powerpc/bcd-2.c
+130b8d095a504ba76a81116d57667e8a gcc/testsuite/gcc.target/powerpc/bcd-3.c
d71e4fffd67fe9a02068065c31f40a8c gcc/testsuite/gcc.target/powerpc/block-move-1.c
acce3a59dc7d4ef94160abede8f06c07 gcc/testsuite/gcc.target/powerpc/block-move-2.c
8b94a94a7dff0052358065a48eaa4f9f gcc/testsuite/gcc.target/powerpc/bool.c
a034d7a8bf265623a75800f01113e836 gcc/testsuite/gcc.target/powerpc/darwin-split-ld-stret.c
548fc585bcbf766f23bef7319f0b0a18 gcc/testsuite/gcc.target/powerpc/darwin64-abi.c
b4bba5410c6e6f914897ce86ffaca508 gcc/testsuite/gcc.target/powerpc/dfmode_off.c
+57ea0173da68940a58564009a30679b4 gcc/testsuite/gcc.target/powerpc/dfp-builtin-1.c
+a5f66daa4a8160a6e06231f0c816da83 gcc/testsuite/gcc.target/powerpc/dfp-builtin-2.c
c25b0e4bf35d335bbde9c753c70ff289 gcc/testsuite/gcc.target/powerpc/dfp-dd-2.c
1957dd277fc1f9a9eef7275766fcea8e gcc/testsuite/gcc.target/powerpc/dfp-dd.c
b2bd0e99cbcd0dff49c3d07bafb4ad8c gcc/testsuite/gcc.target/powerpc/dfp-td-2.c
008e68ecfc8e883b43cb8fcc43f0e792 gcc/testsuite/gcc.target/powerpc/e500-unord-1.c
47822d8b2aed4011af4831b9d6950e63 gcc/testsuite/gcc.target/powerpc/e500-unord-2.c
52468a71868e251587d1c07bc7e2b10f gcc/testsuite/gcc.target/powerpc/ehreturn.c
+9a3782b86e33933301343450411ef697 gcc/testsuite/gcc.target/powerpc/extend-divide-1.c
+391b21c9192f7bcd5ab0a0179c012e29 gcc/testsuite/gcc.target/powerpc/extend-divide-2.c
fbe44e0943c31011fa30a479b0856bc9 gcc/testsuite/gcc.target/powerpc/fusion.c
4109709d89c976bec9d1d05e94004ff2 gcc/testsuite/gcc.target/powerpc/gcse-1.c
f5543e6f996fc00e4ca43418e125fb66 gcc/testsuite/gcc.target/powerpc/htm-builtin-1.c
+238571a7588bf04ee725a409029ddaf1 gcc/testsuite/gcc.target/powerpc/htm-ttest.c
bd2f03394b7690c22ce1aab465adb75f gcc/testsuite/gcc.target/powerpc/htm-xl-intrin-1.c
8d634b2a7d443f1e5b4b69716e57ac00 gcc/testsuite/gcc.target/powerpc/indexed-addr.c
a06c80b6841f0e175447fb154db9d45d gcc/testsuite/gcc.target/powerpc/le-altivec-consts.c
cf9235cec69f4eadb301d29838226a26 gcc/testsuite/gcc.target/powerpc/p8vector-vectorize-3.c
6708bd01f1d343f54ae84933d94773c6 gcc/testsuite/gcc.target/powerpc/p8vector-vectorize-4.c
d34c3ce9f5f4b9ff4e17af15a2345cab gcc/testsuite/gcc.target/powerpc/p8vector-vectorize-5.c
+5fd09506461138827bcc1a6e8e116021 gcc/testsuite/gcc.target/powerpc/pack01.c
+c9ce448310ccdac5da6fa5b69ec461fa gcc/testsuite/gcc.target/powerpc/pack02.c
+fa72c1f9512bac14ea57ebf20c94c152 gcc/testsuite/gcc.target/powerpc/pack03.c
d0bd3df7fee3d73a0acc876ce20691e2 gcc/testsuite/gcc.target/powerpc/paired-1.c
0d7e5847184bc01c42a40dda9b07bda3 gcc/testsuite/gcc.target/powerpc/paired-10.c
2bdeefd1d55b55e6e9b8ace714c9b100 gcc/testsuite/gcc.target/powerpc/paired-2.c
70e395f580930213d5cbd9e97ec91f7f gcc/testsuite/gcc.target/powerpc/pr60137.c
18d594301e79cf9932c8ad49c33828ac gcc/testsuite/gcc.target/powerpc/pr60203.c
f128ae78c8eb899c06243379c091ac5a gcc/testsuite/gcc.target/powerpc/pr60676.c
+73ae1ef8995476aa6b62eea67f6f58dd gcc/testsuite/gcc.target/powerpc/pr60735.c
06c624c2b437fc5b9f805dc2231a75b6 gcc/testsuite/gcc.target/powerpc/quad-atomic.c
6e15a41526f5cb59817b7a5541452615 gcc/testsuite/gcc.target/powerpc/recip-1.c
6f035f512a3f0d6917409f569174ccea gcc/testsuite/gcc.target/powerpc/recip-2.c
aefbc9c117b311a9394883e9c890efb9 gcc/testsuite/gcc.target/powerpc/spe-vector-memset.c
32bb5e201dd78c548aed0cdf044779ec gcc/testsuite/gcc.target/powerpc/spe1.c
c9be7e0cc9ba390460928b1de506fa70 gcc/testsuite/gcc.target/powerpc/stabs-attrib-vect-darwin.c
-d032ed8cc3859ce1a17c9d90fc292f26 gcc/testsuite/gcc.target/powerpc/tfmode_off.c
+18366289600f6f5c0ed1255bd8c267db gcc/testsuite/gcc.target/powerpc/tfmode_off.c
+c2edbb1afba546ea3ac8a5efcaca9c38 gcc/testsuite/gcc.target/powerpc/ti_math1.c
+c3d0d51284479d220a6166a0f362536c gcc/testsuite/gcc.target/powerpc/ti_math2.c
e8cdd476c18884428cf136ed2c4548b2 gcc/testsuite/gcc.target/powerpc/timode_off.c
2d7ba7687ab5e578e54145507a734e92 gcc/testsuite/gcc.target/powerpc/vsx-builtin-1.c
0126618c8adf18da2ca783d2a0e48645 gcc/testsuite/gcc.target/powerpc/vsx-builtin-2.c
4599244d74ba4aabbd69240d86d2fe79 gcc/testsuite/gcc.target/x86_64/abi/args.h
00a7756c300412476dc7df5636d760dd gcc/testsuite/gcc.target/x86_64/abi/asm-support-darwin.s
3003646df75711be87357346568aa8b2 gcc/testsuite/gcc.target/x86_64/abi/asm-support.S
-2f42b0a9460f5b6c8971e482a15a8b94 gcc/testsuite/gcc.target/x86_64/abi/avx/abi-avx.exp
+0a783dcc2deac06feabcad9b7d059a45 gcc/testsuite/gcc.target/x86_64/abi/avx/abi-avx.exp
f559d61e72669fec3c7c3bb1345a001f gcc/testsuite/gcc.target/x86_64/abi/avx/args.h
2ab990bb306a8a9c1f146095795ed0bb gcc/testsuite/gcc.target/x86_64/abi/avx/asm-support.S
4061363418adffdceb4cff80966eaf32 gcc/testsuite/gcc.target/x86_64/abi/avx/avx-check.h
b43e5e8d171dcdbec5cac42b0b9a298c gcc/testsuite/gcc.target/x86_64/abi/avx/test_passing_m256.c
ff732b27c9bb0c5b99ccccb31d12d3ea gcc/testsuite/gcc.target/x86_64/abi/avx/test_passing_structs.c
d02989c16f0d1cd0951fe435483c550e gcc/testsuite/gcc.target/x86_64/abi/avx/test_passing_unions.c
-c923c773d058813933b5dcda1968332c gcc/testsuite/gcc.target/x86_64/abi/avx512f/abi-avx512f.exp
+28f88eec378ae21b3480cc98af33b7f4 gcc/testsuite/gcc.target/x86_64/abi/avx512f/abi-avx512f.exp
2cf03d73572ce81dab43dcceeeacf5c4 gcc/testsuite/gcc.target/x86_64/abi/avx512f/args.h
341c91bf54efad299e2f11e9329738fa gcc/testsuite/gcc.target/x86_64/abi/avx512f/asm-support.S
1c4dc628c680a1d3ad4767c3a1455499 gcc/testsuite/gcc.target/x86_64/abi/avx512f/avx512f-check.h
f49b54ba1324c9645d5ab321e82b6873 gcc/testsuite/gfortran.dg/allocatable_function_5.f90
a1252b99fdac49d6a298e94e77bea067 gcc/testsuite/gfortran.dg/allocatable_function_6.f90
5204edb24b79e494174f82a33f3de0ac gcc/testsuite/gfortran.dg/allocatable_function_7.f90
+ac3181e47fe7f2ff87e5297ee5638865 gcc/testsuite/gfortran.dg/allocatable_function_8.f90
0eaf05114b7069214e95edca38338c8d gcc/testsuite/gfortran.dg/allocatable_module_1.f90
118b37f650281121c6f7a6e4cf4aa38b gcc/testsuite/gfortran.dg/allocatable_scalar_1.f90
02dd67e4175ac48686f16220da9b9eeb gcc/testsuite/gfortran.dg/allocatable_scalar_10.f90
4d48a42bc964040c164c122d032b8664 gcc/testsuite/gfortran.dg/arrayio_11.f90
e101afd93c6605938c295b10be41823a gcc/testsuite/gfortran.dg/arrayio_12.f90
8eeabeddf3eeabedb9644e95525e98f3 gcc/testsuite/gfortran.dg/arrayio_13.f90
+c59bae6f311e172f040e939b3bcf1fa4 gcc/testsuite/gfortran.dg/arrayio_14.f90
+3a163eca93a1b5da0cb1aa1265c1fc34 gcc/testsuite/gfortran.dg/arrayio_15.f90
+3b626835faa28accd28b7b44c1aa2964 gcc/testsuite/gfortran.dg/arrayio_16.f90
46396e4a37a64cec9c047113bad6eadc gcc/testsuite/gfortran.dg/arrayio_2.f90
464fdf5b0f515ce504fe0f8e2ee07c6b gcc/testsuite/gfortran.dg/arrayio_3.f90
4042242806976787cc2719282ff81591 gcc/testsuite/gfortran.dg/arrayio_4.f90
984ec0158ef522fe661e4163a5708f35 gcc/testsuite/gfortran.dg/associate_13.f90
7ad97bcf7457ca3c0309724df0caad5e gcc/testsuite/gfortran.dg/associate_14.f90
229584e99cd0fefd1f1309fe2cfe60db gcc/testsuite/gfortran.dg/associate_15.f90
+0ed1ec5c859d3837356536ddd0e6f9ac gcc/testsuite/gfortran.dg/associate_16.f90
+d8912284402d7f10695694e5d787c65c gcc/testsuite/gfortran.dg/associate_17.f90
c066328da870ad9b313bf9491c5b72d6 gcc/testsuite/gfortran.dg/associate_2.f95
ada9a3758cef9c8c02a55f1139c4f13b gcc/testsuite/gfortran.dg/associate_3.f03
a1f5f0d8423367d45fe9382b407ce7e9 gcc/testsuite/gfortran.dg/associate_4.f08
211e434394ea8ce43ce8f5c2e671416d gcc/testsuite/gfortran.dg/class_array_12.f03
7d1b70fed6324f2dae86399e70c60cb7 gcc/testsuite/gfortran.dg/class_array_13.f90
2880265b32eb89ea2a2339848e096186 gcc/testsuite/gfortran.dg/class_array_14.f90
-204f439f174315c159d07cb138c73159 gcc/testsuite/gfortran.dg/class_array_15.f03
+716eead744817cb2a71e4d66c7b93e29 gcc/testsuite/gfortran.dg/class_array_15.f03
5790c36b47ecec9e1e086133517074b9 gcc/testsuite/gfortran.dg/class_array_16.f90
2dcfa225532d68c04bcb2b83adabb1f0 gcc/testsuite/gfortran.dg/class_array_17.f90
c51442df4b78a56b7cd5dc0dacc16f6b gcc/testsuite/gfortran.dg/class_array_18.f90
f8a4ca21ccf302214564ec0d59e8fd51 gcc/testsuite/gfortran.dg/count_mask_1.f90
0f69fed692c7480664d7891f27db0443 gcc/testsuite/gfortran.dg/cr_lf.f90
33604a92da75a7b5ee0f958ab81b1328 gcc/testsuite/gfortran.dg/cray_pointers_1.f90
+1d44af9bd997323c65ffc1ac7e394957 gcc/testsuite/gfortran.dg/cray_pointers_10.f90
9b498b2d4cff83ed58620c1998f47f87 gcc/testsuite/gfortran.dg/cray_pointers_2.f90
49ea5999b0fbbd860fa0b8b1e6a01397 gcc/testsuite/gfortran.dg/cray_pointers_3.f90
c00f3a9d2f365b0dab03e2415fabbc16 gcc/testsuite/gfortran.dg/cray_pointers_4.f90
35efa4236e3136b5b5d89215e9c671a0 gcc/testsuite/gfortran.dg/default_format_2.f90
c286b196507e9ffee9aad5b53cf42fd7 gcc/testsuite/gfortran.dg/default_format_2.inc
c767d7f22474c8ad0d004a14d5e33668 gcc/testsuite/gfortran.dg/default_format_denormal_1.f90
-12e97e8bf807fa0fafbbf6bfb04a2f14 gcc/testsuite/gfortran.dg/default_format_denormal_2.f90
+a8fdda0b2ff88e8a64875e9f9417f37a gcc/testsuite/gfortran.dg/default_format_denormal_2.f90
42b3bc794999b325dd25fadf49212667 gcc/testsuite/gfortran.dg/default_initialization_1.f90
ba730e52e3b48dd9a54bf3a8e2b06575 gcc/testsuite/gfortran.dg/default_initialization_2.f90
82fe74ac8e598a41632b7047330d6d36 gcc/testsuite/gfortran.dg/default_initialization_3.f90
d88c4f69c4e8abbcf539c35db1c38c47 gcc/testsuite/gfortran.dg/finalize_22.f90
694cfd8a3b55175c1a6e16f7d7f60038 gcc/testsuite/gfortran.dg/finalize_23.f90
7777e7da27f0f204cb380c5791769371 gcc/testsuite/gfortran.dg/finalize_24.f90
+9d8695ba5d9b84a617601b19fbc15f3e gcc/testsuite/gfortran.dg/finalize_25.f90
fd6f56591cff43978fb9e37af994eec0 gcc/testsuite/gfortran.dg/finalize_3.f03
92b4ca27645d88cb11543d720382b004 gcc/testsuite/gfortran.dg/finalize_4.f03
ce817f495edb0ac306d6ae1052014e67 gcc/testsuite/gfortran.dg/finalize_5.f03
1e220f6220b76cc8c3a456baadfdbc39 gcc/testsuite/gfortran.dg/global_vars_f90_init_driver.c
55e7857d1dafac193e2cd5a0a381424f gcc/testsuite/gfortran.dg/gnu_logical_1.F
fcddec2c8be6f5c85fd4943091dc86d1 gcc/testsuite/gfortran.dg/gnu_logical_2.f90
-33c63b25f6446aeb7fb749d92c0162dd gcc/testsuite/gfortran.dg/gomp/allocatable_components_1.f90
+fe34d9d42d37b9776459e695b904bc39 gcc/testsuite/gfortran.dg/gomp/affinity-1.f90
+5633756a662441452bd869456e985808 gcc/testsuite/gfortran.dg/gomp/allocatable_components_1.f90
a2a78b9dfd24cc5b801a51ebf7713787 gcc/testsuite/gfortran.dg/gomp/appendix-a/a.1.1.f90
a939ad660a97fdd3a36058fbbed08e4e gcc/testsuite/gfortran.dg/gomp/appendix-a/a.11.1.f90
be2dfd843076b56ef43acf3c66d28133 gcc/testsuite/gfortran.dg/gomp/appendix-a/a.11.2.f90
53059af4b001b877b193a648ed0c69f4 gcc/testsuite/gfortran.dg/gomp/appendix-a/a.30.1.f90
87d438d380fe4278f5240b8d1fd0d3db gcc/testsuite/gfortran.dg/gomp/appendix-a/a.31.1.f90
0467067c8e8499996af77b64afbb8c31 gcc/testsuite/gfortran.dg/gomp/appendix-a/a.31.2.f90
-20a6f46dda017b3c095be51b91da5df6 gcc/testsuite/gfortran.dg/gomp/appendix-a/a.31.3.f90
+291e78adbe93a2f84d2a41707864c4d2 gcc/testsuite/gfortran.dg/gomp/appendix-a/a.31.3.f90
182731c8064c6ef83beb1d10cd03700b gcc/testsuite/gfortran.dg/gomp/appendix-a/a.32.1.f90
157bb81ef8b8706d56531116aacc2653 gcc/testsuite/gfortran.dg/gomp/appendix-a/a.33.1.f90
4ab99a44c0b5a623c5d27396d9bd8a6b gcc/testsuite/gfortran.dg/gomp/appendix-a/a.33.2.f90
953bdf3d3c109936d52b7448c0cf914f gcc/testsuite/gfortran.dg/gomp/appendix-a/a.7.2.f90
990da4894eee5b8e82d214eabde8634d gcc/testsuite/gfortran.dg/gomp/appendix-a/a.8.1.f90
fc76de5411a6ea3d2ef0e979cd24294f gcc/testsuite/gfortran.dg/gomp/appendix-a/a.9.1.f90
+552f0c0302bb6592f6a2fb291b4586a6 gcc/testsuite/gfortran.dg/gomp/associate1.f90
bab96c8ce5beeb0e7d9e4dae2fd0ea5f gcc/testsuite/gfortran.dg/gomp/block-1.f90
c8bcf6337f95b605de3d54a7f8e5ab84 gcc/testsuite/gfortran.dg/gomp/collapse1.f90
5889f294d23bf018b629ca16a28a09c2 gcc/testsuite/gfortran.dg/gomp/crayptr1.f90
0f6bba7fdd496b28f7b45fd8ee73a58f gcc/testsuite/gfortran.dg/gomp/crayptr3.f90
1c6644a88dc4bee98beb52bb4342fee9 gcc/testsuite/gfortran.dg/gomp/crayptr4.f90
5752af36ad97d8ba0a6600c514a1eb76 gcc/testsuite/gfortran.dg/gomp/crayptr5.f90
+3637ee280cfe64316f44286f354db90d gcc/testsuite/gfortran.dg/gomp/declare-simd-1.f90
+fa41d6dd0ec4bc45beb3cbce04bf821d gcc/testsuite/gfortran.dg/gomp/depend-1.f90
db187bc842cfaea8dd9eab3344c97e93 gcc/testsuite/gfortran.dg/gomp/do-1.f90
a467591fa5a7397d62aff928d63eb0ad gcc/testsuite/gfortran.dg/gomp/fixed-1.f
14ab6dfa2149c533128a3f201531e525 gcc/testsuite/gfortran.dg/gomp/free-1.f90
b7bb651884d39c2e5dce7d57d46f40a5 gcc/testsuite/gfortran.dg/gomp/free-2.f90
833c786734216c6ed1ad406a53f3af9a gcc/testsuite/gfortran.dg/gomp/gomp.exp
+0cfd422be152bb21744cc7cfe5baf808 gcc/testsuite/gfortran.dg/gomp/intentin1.f90
52223211c34f4dbace5e033f8243ae1f gcc/testsuite/gfortran.dg/gomp/omp_atomic1.f90
0e5454ac80bc199d6cf3e96e9750c33f gcc/testsuite/gfortran.dg/gomp/omp_atomic2.f90
5d43e477ab60e438b8824d612b24022d gcc/testsuite/gfortran.dg/gomp/omp_clauses1.f90
e7227cd823c352d8bcc8b82aeb57d316 gcc/testsuite/gfortran.dg/gomp/omp_do1.f90
+818c401459cd690f09b6456c6af28b9a gcc/testsuite/gfortran.dg/gomp/omp_do_concurrent.f90
04280f9a588c35300001e54082831f2f gcc/testsuite/gfortran.dg/gomp/omp_parse1.f90
748f336859d6338cc5d7146cd8a4b14b gcc/testsuite/gfortran.dg/gomp/omp_parse2.f
421900bf9ea5cfcbf2d2146fb3d77407 gcc/testsuite/gfortran.dg/gomp/omp_threadprivate1.f90
bdca03c79b16b5f9c19e5c92941f5888 gcc/testsuite/gfortran.dg/gomp/omp_threadprivate2.f90
+c97c8ff2f56cab022d1406778fde6e41 gcc/testsuite/gfortran.dg/gomp/openmp-simd-1.f90
+59468044bce741ee29e2c3362ce85e1d gcc/testsuite/gfortran.dg/gomp/openmp-simd-2.f90
+9ec7d78c19b910fb2fc4700d941d4a25 gcc/testsuite/gfortran.dg/gomp/openmp-simd-3.f90
9a6817790a272cd8153d4303d324c00f gcc/testsuite/gfortran.dg/gomp/pr26224.f
d2c74a71f2bea0005d853821e6f0142c gcc/testsuite/gfortran.dg/gomp/pr27573.f90
7905e149c2a2dbed5b9dd43384d712f4 gcc/testsuite/gfortran.dg/gomp/pr29759.f90
6954124ff522f1d30670dc093d886d8b gcc/testsuite/gfortran.dg/gomp/pr57089.f90
bcd9a8c5acf05494271659304f0f0a60 gcc/testsuite/gfortran.dg/gomp/pr59467.f90
b4be3f9de7631846875a711ae9b67293 gcc/testsuite/gfortran.dg/gomp/proc_ptr_1.f90
-4a9d10a348ccf5012c673f2637785ba6 gcc/testsuite/gfortran.dg/gomp/reduction1.f90
+87885556568e657ef4c936c53e1c7305 gcc/testsuite/gfortran.dg/gomp/proc_ptr_2.f90
+59e444df8ec8f5ea9859b5aef4d75865 gcc/testsuite/gfortran.dg/gomp/reduction1.f90
02484261b0434dbaf2709c34db58cd4d gcc/testsuite/gfortran.dg/gomp/reduction2.f90
-8d18e99707613f2d648e3240f0ba1d76 gcc/testsuite/gfortran.dg/gomp/reduction3.f90
+a2addf1a691db784ba87841fe1cf8f23 gcc/testsuite/gfortran.dg/gomp/reduction3.f90
4abf31477ed1e2174ce1a15dea5e1970 gcc/testsuite/gfortran.dg/gomp/sharing-1.f90
0225b461902c034537f77db022b17f11 gcc/testsuite/gfortran.dg/gomp/sharing-2.f90
338202088032a1453c1b11e7f193b475 gcc/testsuite/gfortran.dg/gomp/sharing-3.f90
+354de1f16113f3936aaf4a03d2f49a7d gcc/testsuite/gfortran.dg/gomp/target1.f90
+211df959d7353087bec284fb1e43ceec gcc/testsuite/gfortran.dg/gomp/target2.f90
+86c0623e8799ecab72ed886c759cde03 gcc/testsuite/gfortran.dg/gomp/target3.f90
+86f899863718848e682593290355e6c1 gcc/testsuite/gfortran.dg/gomp/udr1.f90
+2aa1076458fe27767e8682a018266e21 gcc/testsuite/gfortran.dg/gomp/udr2.f90
+6ddb9641f92715d3a3298771fab84b43 gcc/testsuite/gfortran.dg/gomp/udr3.f90
+69722424503f758e5d5b5fb26c82af7b gcc/testsuite/gfortran.dg/gomp/udr4.f90
+4c958e4e2ed3b058d16744bf6f4dc133 gcc/testsuite/gfortran.dg/gomp/udr5.f90
+4be69272338362c6a969ab47082c5fcc gcc/testsuite/gfortran.dg/gomp/udr6.f90
+d601b4dee96fb1e6923bf1f70930e930 gcc/testsuite/gfortran.dg/gomp/udr7.f90
+2f369bc0187e2b8a78573295b630c96f gcc/testsuite/gfortran.dg/gomp/udr8.f90
41759f5578782a6f4ae3601bff797650 gcc/testsuite/gfortran.dg/gomp/workshare1.f90
74f7a0197763c365cb7511562e6e77bf gcc/testsuite/gfortran.dg/gomp/workshare2.f90
50b2c95c698e63006e5f0e8cbcea5a66 gcc/testsuite/gfortran.dg/gomp/workshare3.f90
14ef0b0fb7468bddc8da80d525db505d gcc/testsuite/gfortran.dg/graphite/pr43349.f
cf66c78971cc0a0ccbbe06e8285499fb gcc/testsuite/gfortran.dg/graphite/pr45758.f90
c35834551693365c4a94cd2ef2b4bd6d gcc/testsuite/gfortran.dg/graphite/pr47019.f
+f993bc6aecd63bdc6b9e8b64e54b0800 gcc/testsuite/gfortran.dg/graphite/pr59817.f
daa53e999b30e1103a7ea6f3e62ecd91 gcc/testsuite/gfortran.dg/graphite/run-id-1.f
f284b8f4f2a5b32dc60a00731241ca8e gcc/testsuite/gfortran.dg/graphite/run-id-2.f90
a9d76d71bfd312f4638121eef4a5b755 gcc/testsuite/gfortran.dg/graphite/scop-1.f
16b03bca05a6acc43f24be44e1f2ff05 gcc/testsuite/gfortran.dg/list_read_10.f90
e76e21ee6abb6a701aa6c131c97d9312 gcc/testsuite/gfortran.dg/list_read_11.f90
20aebdb97e7740e2d38992e6981de05a gcc/testsuite/gfortran.dg/list_read_12.f90
+a9116f1431f2fcd98ac937aaf225727c gcc/testsuite/gfortran.dg/list_read_13.f
67997f845ffceb239257b26970956c2d gcc/testsuite/gfortran.dg/list_read_2.f90
799ffeafd700d24bd3e365a8addcfa10 gcc/testsuite/gfortran.dg/list_read_3.f90
36e928b3a5b9a5d89ecebae1c130be22 gcc/testsuite/gfortran.dg/list_read_4.f90
98b3add6564d9cb2c9fce79f49339208 gcc/testsuite/gfortran.dg/newunit_2.f90
6aa623107a603714b8177f7ed1641e4d gcc/testsuite/gfortran.dg/newunit_3.f90
cf1aadbb18d5e6f8399c252ebc5de0bf gcc/testsuite/gfortran.dg/nint_1.f90
-2a9b4addb34839a8caf5cb64192f4a35 gcc/testsuite/gfortran.dg/nint_2.f90
+42421c2b20fbb6d12877435f629d9adb gcc/testsuite/gfortran.dg/nint_2.f90
03b84fc5eca43cc5d1a0b1a93937da73 gcc/testsuite/gfortran.dg/no_arg_check_1.f90
e7bc0cb6b865f58b021aad8f7c5ad646 gcc/testsuite/gfortran.dg/no_arg_check_2.f90
b5459269634c18de84d59f7e3bfb7c5c gcc/testsuite/gfortran.dg/no_arg_check_3.f90
a6de0d0b913df7bf4f7e924d87693c5e gcc/testsuite/gfortran.dg/oldstyle_2.f90
22eb37df11114e6c809b504360ee7009 gcc/testsuite/gfortran.dg/oldstyle_3.f90
3dd41260093d8cf9e7bbb41939229a8c gcc/testsuite/gfortran.dg/oldstyle_4.f90
+782cced02660ac0a383a889e8e5324a5 gcc/testsuite/gfortran.dg/oldstyle_5.f
adbcc21a5778904b9a3a281e08e68479 gcc/testsuite/gfortran.dg/only_clause_main.c
2ec0da16b8d33ec015c6c20f193ee162 gcc/testsuite/gfortran.dg/open-options-blanks.f
941113644c9b039dadaf2ea8f8b4331d gcc/testsuite/gfortran.dg/open_access_1.f90
e548fbe30e98c9d7ac1106482dbc7e3e gcc/testsuite/gfortran.dg/open_status_3.f90
13b9efd2d6877e1ce4634b24aac8b5fc gcc/testsuite/gfortran.dg/openmp-define-1.f90
7c3311ed70efe122c0482f92398333c9 gcc/testsuite/gfortran.dg/openmp-define-2.f90
-a3a6d581b221bc307171485a58450895 gcc/testsuite/gfortran.dg/openmp-define-3.f90
+92c557030c984c498211d1b210bcdc7f gcc/testsuite/gfortran.dg/openmp-define-3.f90
343d2117bb7c6e6b90b647727aa8bad0 gcc/testsuite/gfortran.dg/operator_1.f90
b17cec21502c8794736dc737cec00cef gcc/testsuite/gfortran.dg/operator_2.f90
0dd70087c9deb3c1435a846982d5b717 gcc/testsuite/gfortran.dg/operator_3.f90
7bdbcf6bda9a84f72f0ce9ff5baa35b3 gcc/testsuite/gfortran.dg/round_1.f03
8c6826e188281f4ba61e0e09942cb319 gcc/testsuite/gfortran.dg/round_2.f03
1e6dca49810e611218d8671ef4acade6 gcc/testsuite/gfortran.dg/round_3.f08
-50d8e1af10610e462e7210d91db177e0 gcc/testsuite/gfortran.dg/round_4.f90
+d14f6788781c04d3f31703e85d091e08 gcc/testsuite/gfortran.dg/round_4.f90
795c3a5486634878e59848252e62aa82 gcc/testsuite/gfortran.dg/rrspacing_1.f90
54535416585a8a8a084e4b2896243778 gcc/testsuite/gfortran.dg/runtime_warning_1.f90
cf312106ea57ecf768f6b24b13308511 gcc/testsuite/gfortran.dg/same_name_1.f90
32af85ba2b22e3a45be1db299d0fc3a0 gcc/testsuite/gnat.dg/aggr9_pkg.ads
35031b3b1cfbf9db80dbdb131ad67e3e gcc/testsuite/gnat.dg/aliased1.adb
fc20c665ce493e3af920ca3b8b338e2e gcc/testsuite/gnat.dg/aliased_prefix_accessibility.adb
-a7739809a555fb662a89827d82bc3233 gcc/testsuite/gnat.dg/aliasing1.adb
+9e0da223f4688dd4c3482ce7c4390a98 gcc/testsuite/gnat.dg/aliasing1.adb
a4902656656cf1933e27aa840c492aae gcc/testsuite/gnat.dg/aliasing1.ads
54f6aed3ad979289cd3a9b9fca61c9d7 gcc/testsuite/gnat.dg/aliasing2.adb
fcc69d2d6784a35c97662eebdee16779 gcc/testsuite/gnat.dg/aliasing2.ads
4655c082e4d28f9145dcbe265465a866 gcc/testsuite/gnat.dg/enum1_pkg.ads
7fa9081040c1b11170ec87a324a3ebc0 gcc/testsuite/gnat.dg/enum2.adb
8512bce6ebb7b1c767b2f9d14a48a71e gcc/testsuite/gnat.dg/enum2_pkg.ads
+a4f52bfabfe2bc7e231d6ecd5aeefaf6 gcc/testsuite/gnat.dg/enum3.adb
6c032f23ef785bfe07a7d1b1a540adfc gcc/testsuite/gnat.dg/env_compile_capacity.adb
5f85dec3853c4180660d191365838fb2 gcc/testsuite/gnat.dg/env_compile_capacity.ads
797286d8d53abdbd5ade8214dca9db11 gcc/testsuite/gnat.dg/equal1.ads
ff63882d64d1bc7bf40b07c0ee842ed3 gcc/testsuite/gnat.dg/opt31.adb
20ad547be814ce4a0fc7d07e373934bf gcc/testsuite/gnat.dg/opt32.adb
ece02966a92b2ea240da4ed9c82963d9 gcc/testsuite/gnat.dg/opt33.adb
+cd1cd547ffd6a15fd43fea30ececc910 gcc/testsuite/gnat.dg/opt38.adb
+c7cef5a4232a339afa288abd7cb369dc gcc/testsuite/gnat.dg/opt38_pkg.adb
+ba03504b0b64d5f70065d0214412516e gcc/testsuite/gnat.dg/opt38_pkg.ads
+fe287ca30d00bf022eed63003e7799b0 gcc/testsuite/gnat.dg/opt39.adb
65e20f998d483941d92a34b07b482d10 gcc/testsuite/gnat.dg/opt3_pkg.ads
e98c04ac385dbd0581c1f5fa108caf6b gcc/testsuite/gnat.dg/opt4.adb
3d44b5cac38d62a85266069665682f5d gcc/testsuite/gnat.dg/opt5.adb
ba51f2b4ff3e6536d2d6f2acd9443799 gcc/testsuite/gnat.dg/opt9.adb
feb376d91f5514b647b1ad61b025d828 gcc/testsuite/gnat.dg/opt9_pkg.ads
fec5c039983cc172fd81dc506725f69c gcc/testsuite/gnat.dg/outer_agg_bitfield_constructor.adb
+4d9b7573a99095e98a73ab165f18724d gcc/testsuite/gnat.dg/overflow_fixed.adb
a2d243fe1c9cc4acb1eab0db0f587b81 gcc/testsuite/gnat.dg/overflow_sum.adb
94d7b3cc1345f58f5547ed8c8973d6c0 gcc/testsuite/gnat.dg/overflow_sum2.adb
562961be442c02c3c6c5b534016f3fc1 gcc/testsuite/gnat.dg/overriding_ops.adb
5ca9c51dae3c7625f396c0d24cf84814 gcc/testsuite/lib/c-compat.exp
71855d0a661e3936c137f1d4ae29f9d1 gcc/testsuite/lib/c-torture.exp
c62b99e026ed42b6e82f8480fb487837 gcc/testsuite/lib/cilk-plus-dg.exp
+0fd78d8ca5862167f2d986f8aa365429 gcc/testsuite/lib/clearcap.exp
a119592eb7fd6f217ae6b95df83d2b66 gcc/testsuite/lib/compat.exp
13aeaf85fd6afdf8e6afaef752ae087b gcc/testsuite/lib/copy-file.exp
959e1855b178d7db49dd62f2a19c2b95 gcc/testsuite/lib/dejapatches.exp
bd515d57aa30aa3fb51f62e9fc698abc gcc/testsuite/lib/scantree.exp
d44c50538cc6d39a3eb1aa063b392626 gcc/testsuite/lib/target-libpath.exp
d6e6500432d65180387c39287b536b8a gcc/testsuite/lib/target-supports-dg.exp
-d3d7377c7613aed518b295f4e436f2b9 gcc/testsuite/lib/target-supports.exp
+12cbb51fb1389b3dbd47c6985af487f4 gcc/testsuite/lib/target-supports.exp
11de8489fa53e77ff9be279e855090eb gcc/testsuite/lib/timeout-dg.exp
038a7798c766b7a7466b09f89b875129 gcc/testsuite/lib/timeout.exp
9aba7d93506cf79e6241eb0b27cdbce3 gcc/testsuite/lib/torture-options.exp
503ee4098f6eb3e1f6232141559346bc gcc/tree-chrec.c
7bc54df23602d375b2db5b7c4c4d5c6a gcc/tree-chrec.h
30a64a3df6bc881833526501f66db580 gcc/tree-complex.c
-4f70760d40ea5faeaf2fc2a7b235f14e gcc/tree-core.h
+914d12bc4c885a84e08969baf18e0d85 gcc/tree-core.h
68d17debfd1dc9aa375d8c5cfa5d6346 gcc/tree-data-ref.c
eb5d27926043e6b574073a68ae7a6bbd gcc/tree-data-ref.h
-3dd5a3692ceb0c94441ce1fa308fbead gcc/tree-dfa.c
+e76e8e1efc24553629d2002ee50fe15d gcc/tree-dfa.c
188948b90ecddaf70eef9d404c377bba gcc/tree-dfa.h
13373f758dbb8bec16c7f6bfc183483f gcc/tree-diagnostic.c
308dd14e2238ac39da0eada1c384605c gcc/tree-diagnostic.h
18f1ee32b871b8e6a91c092dc86652b2 gcc/tree-emutls.c
392b556d7ee2d1f57ef2b4cc6b7566ce gcc/tree-hasher.h
09eb6bde07e86a671ea0c0af5a54dcd2 gcc/tree-if-conv.c
-bc4d003e0876de5cac79fbbfbe1397f6 gcc/tree-inline.c
+54c9584f7b2133d8f97ee05f49ce5957 gcc/tree-inline.c
38c9fe3122537a015ee2e63c38dcdb4d gcc/tree-inline.h
9e237b35b42a8d96e2582a9a4b2e17cf gcc/tree-into-ssa.c
391b426d3a83206f44b13a9784fdc4f4 gcc/tree-into-ssa.h
a50e871a6391b650cd6682d5c01811e2 gcc/tree-iterator.c
f930e7c2f6a3ed536883d847d3b2ccbb gcc/tree-iterator.h
a15cc75a41e7bf2ccfc380cf1eba2caa gcc/tree-loop-distribution.c
-dd3474665f077379bc17e67c77962e53 gcc/tree-nested.c
+f233be2ac4a0dd55322b4744dbfc6c86 gcc/tree-nested.c
fd0be797829a72cc8aa7075c4f014071 gcc/tree-nested.h
f0a4e6c679c97265f09801be43d3a14c gcc/tree-nrv.c
20b5b1a12f858b7354b153c8ffc9772f gcc/tree-object-size.c
16ba28fd00b4db08b0a5d81b347083d5 gcc/tree-phinodes.c
8df39df261e9cfd73e097d2b8eb56618 gcc/tree-phinodes.h
a83a11aa58d5f244ef2615874775079d gcc/tree-predcom.c
-b5625e795fa95d9aab6fe82577573610 gcc/tree-pretty-print.c
+fcf562b10629ef610b52399780252ceb gcc/tree-pretty-print.c
455851cb801e9923d5e78bda86574697 gcc/tree-pretty-print.h
99eb64b4f611fa70c0be1172d2490e61 gcc/tree-profile.c
f05617fb6ae3aebf72fe8b08dc2c43cd gcc/tree-scalar-evolution.c
c01a6c1b8f3498c4297ae5486d8218e0 gcc/tree-sra.c
42d4f284771214b78fdc24ed8b8b2aab gcc/tree-ssa-address.c
1b77258ce233f1010fc549f8bc5dc234 gcc/tree-ssa-address.h
-309c5aee027224923b0b81018aa07fb7 gcc/tree-ssa-alias.c
+3583fb23bee7cd856dd838440b26a19d gcc/tree-ssa-alias.c
1ed0e9e14e828eebcbd12670911f57b3 gcc/tree-ssa-alias.h
908fae5b3e2e651511a1f59fed4310e4 gcc/tree-ssa-ccp.c
8854db1b9cfdaaeb605c67ebe35d6889 gcc/tree-ssa-coalesce.c
ab41801eb8e661b97721f2fdfe0af9a4 gcc/tree-ssa-dom.h
287491fa0cac5371bf21b51fa2f9883e gcc/tree-ssa-dse.c
eeb18249f19630551d81760b4bf8543c gcc/tree-ssa-forwprop.c
-09132742bdd50c906f5135b6160acd3e gcc/tree-ssa-ifcombine.c
+40873618b7b68316d2968048ff8cb66e gcc/tree-ssa-ifcombine.c
4316577d7bfe850e5701f66f50da950d gcc/tree-ssa-live.c
73c40cd97a78b00562f807d65b537704 gcc/tree-ssa-live.h
44623445e0a3c3ef90cbdeca15dc7898 gcc/tree-ssa-loop-ch.c
-d079a8d937eb558ee76ca68a6d35ee9b gcc/tree-ssa-loop-im.c
+d70235f13b67d1cd315cad0b61a93821 gcc/tree-ssa-loop-im.c
de0b463530ea41456521090168225afe gcc/tree-ssa-loop-ivcanon.c
917bdac433d10a17378ef2a0abb40878 gcc/tree-ssa-loop-ivopts.c
02338563356306fac3c2016a7cbb7e18 gcc/tree-ssa-loop-ivopts.h
437c9aea9639196d89592ec3141fffda gcc/tree-ssa-loop-unswitch.c
9ee9e10357d8d79a29baa53d34f769bd gcc/tree-ssa-loop.c
10c5655c0beaa92cd03aebe537042e27 gcc/tree-ssa-loop.h
-61528af55e47456e638ec793d61a2bb2 gcc/tree-ssa-math-opts.c
+31f06ae9e9d3aab469cb81ac503c34b7 gcc/tree-ssa-math-opts.c
f1ab905b3a864de6c06760872d285039 gcc/tree-ssa-operands.c
18da3215ee1eb3bc5e01eba7c52e4760 gcc/tree-ssa-operands.h
863288b76e2e726b542bbbf75b4993a0 gcc/tree-ssa-phiopt.c
8fb9d0b352dbc5a750557b79d39ecb7b gcc/tree-ssa-phiprop.c
f3b38ebf82330446d5ba11dc1c4f9999 gcc/tree-ssa-pre.c
-6a218f3964aafb0ad32c2c4c24656f22 gcc/tree-ssa-propagate.c
+9083eec79d74033bf086e4bb48337a5e gcc/tree-ssa-propagate.c
7815765bde42cd1f14f758d5728ff1b8 gcc/tree-ssa-propagate.h
-a105a8fff9d7fc96ff8a5807dec618ca gcc/tree-ssa-reassoc.c
-cec79090f8302ce24c3124ac80ae49d2 gcc/tree-ssa-sccvn.c
+49f3a282983a44d50b2be6d4223a2cc0 gcc/tree-ssa-reassoc.c
+3b4617ab5995aa30b2f8310cc7840329 gcc/tree-ssa-sccvn.c
2b653bc55e7496a67ed55e853541ad46 gcc/tree-ssa-sccvn.h
7e7a1a092345df08ee409928b3982dfe gcc/tree-ssa-sink.c
544ace7a165f16f1c9762df3a847246f gcc/tree-ssa-strlen.c
-a5f65a2627768e5489628080335c6b35 gcc/tree-ssa-structalias.c
-90f6f3b5d2fb378039024c5358db286f gcc/tree-ssa-tail-merge.c
+33a13266aadbcb7114132539a3b14dd7 gcc/tree-ssa-structalias.c
+26759ddea3c2091a2d428dcad711b886 gcc/tree-ssa-tail-merge.c
062609c7341f33356980b58413052721 gcc/tree-ssa-ter.c
b58c1f79a5493a196cfa2fe3743f0f1b gcc/tree-ssa-ter.h
-51c9c3be8d80f3944fdb6c4600335fb1 gcc/tree-ssa-threadedge.c
+6b6af3f5b123f1e218c8a404feab5135 gcc/tree-ssa-threadedge.c
516be19b8699fd0711b27443d9c35780 gcc/tree-ssa-threadedge.h
5da1def2ada611ef35889f5f82435404 gcc/tree-ssa-threadupdate.c
51f65d2aae4b00e4f980342a6f3e8f0d gcc/tree-ssa-threadupdate.h
7eac066b68b6b48d3af680244530782d gcc/tree-ssanames.h
53a6aac3efa8ad1efa3c8d85fe729b05 gcc/tree-stdarg.c
69d3270536f329aba1520dbf6de5c133 gcc/tree-stdarg.h
-a40cfa29f8fda80e38f78cf32f7f38c9 gcc/tree-streamer-in.c
+368b75e67d682575accb291afacae7e0 gcc/tree-streamer-in.c
1a84a7f62cf8907cb2ea05b556c05a97 gcc/tree-streamer-out.c
df287b486f934620deb088f2ee0ce7d6 gcc/tree-streamer.c
66df870f3a2e434206f12dfca5530651 gcc/tree-streamer.h
59772b6a0b414642ac5a2a048d0f3f3d gcc/tree-switch-conversion.c
-b31ae3316201ce279149fe5e7b06de4b gcc/tree-tailcall.c
-edc269fee754426fbefc306d4ad1abad gcc/tree-vect-data-refs.c
-0e27064ef9d087f1f89864c3e014fa18 gcc/tree-vect-generic.c
+ba49073bb43840db9e9ff429362ab8b2 gcc/tree-tailcall.c
+40ab70ef76279b925be56e4990f39935 gcc/tree-vect-data-refs.c
+2ebebe422bba1deae3219b1f8989ec26 gcc/tree-vect-generic.c
c4830553b5647a24557575bac1731b99 gcc/tree-vect-loop-manip.c
-4f794f59f5123dbe288b54e7f5f2217c gcc/tree-vect-loop.c
+75b561d43c4bab24c3cab19b15ed57f8 gcc/tree-vect-loop.c
20abc700ab1045ac316418ded7857b1d gcc/tree-vect-patterns.c
-570bb562cea9f896cf6d277a778eb509 gcc/tree-vect-slp.c
+77fd4e9dc7fd733a55875224826fccdd gcc/tree-vect-slp.c
9c3f0571fc30c94ce244049843fe875f gcc/tree-vect-stmts.c
4a58096af76df477534bbb3ab779b591 gcc/tree-vectorizer.c
-00577adc4ec453db88a9e940444ffd6b gcc/tree-vectorizer.h
-ddf25802321fbbbf5b2dbc7dd3c34257 gcc/tree-vrp.c
-cdcff8975ef1bf46b4d958ed3dab4420 gcc/tree.c
+b23aeb290e610825e695bf1897f28c7d gcc/tree-vectorizer.h
+b07eb837f5d883ab7e95b62882281e0f gcc/tree-vrp.c
+e63a58d04d50a799998b1cc7d23609f7 gcc/tree.c
3b971f9d72f052ea9a5fb6c32f6f9e34 gcc/tree.def
-0a5666325f0cd0535278735908559c65 gcc/tree.h
+9f533ff7502e6b3c8ea114b31a7e9309 gcc/tree.h
c1549110ae4675e04b97bd68b4d59a32 gcc/treestruct.def
f8da8bc6127f943f29fc1237e2806e29 gcc/tsan.c
de06e1e7c04c8221fb7bb5b03eee0230 gcc/tsan.h
be46f6bce22394dbb40a2ccd3e1d418e gcc/var-tracking.c
ff896ccaa225789c402604a012a30c32 gcc/varasm.c
f43ce19a1d9f849b6753808ae1b964bf gcc/varasm.h
-e7fd151858e94cde21b44463abecf853 gcc/varpool.c
+e468a68466ed0873d8b5bb1a9777ff24 gcc/varpool.c
06d4f9a4e63450e5e1c9506b8616c387 gcc/vec.c
03ef3ad6f5ef2d3d1ea3e6b8ae490d1e gcc/vec.h
b9595435606442955f515535078caa52 gcc/version.c
4dcd1437e2deaaef2853f093217fc063 gcc/xcoff.h
28db814d54aae5436666bc9547b4cf0c gcc/xcoffout.c
95e7984ae2ae01abd915f524df765a2b gcc/xcoffout.h
-c8be2196710d4694717387826fd1850b gnattools/ChangeLog
+c0722c0f0f883a7971f1f20be6097f09 gnattools/ChangeLog
692322cbac4dbf19144764e4486b9f54 gnattools/Makefile.in
41b96b7921d11e52b1d8465ea57136ad gnattools/configure
a73c18d8f44ab8bc3e71c3d530fa603e gnattools/configure.ac
59530bdf33659b29e73d4adb9f9f6552 include/COPYING
d32239bcb673463ab874e80d47fae504 include/COPYING3
-de508de3a6aec02d0e04a0ce87355f5c include/ChangeLog
+89bacb33918388be072c8d2b23c53442 include/ChangeLog
4263432a72ff47ed8bf420208ee7eea5 include/ChangeLog-9103
20f67b536f003da196c4e0e36c829fcf include/ansidecl.h
8c1a1603cbd7447bde95d9ae8723f232 include/demangle.h
0294cecbb1f66d640ccba3a5d862d05b include/xregex2.h
f648a66ed08e079e26a24c4346a3ba03 include/xtensa-config.h
0afce91a3daa1fdc32ee36370c1129dd install-sh
-f7609bb103efb231f6aee59ed7c638b2 intl/ChangeLog
+c340a6027b5bb839e7fd81f2672e95f3 intl/ChangeLog
cad1d6fab2274517783de7433c0faa74 intl/Makefile.in
6ec998bb4716c744bf8185e607f69301 intl/README
76ca170a525d5b84d90f0478fe788931 intl/VERSION
b4758a0194e3e41362b939911472ce62 intl/relocatable.c
bedade7bcfc3bc5eb09a2c6844f637f3 intl/relocatable.h
43f287d082528203fc85c1d2d81bf30d intl/textdomain.c
-f6502cd1f6a829d202c2305b928665aa libada/ChangeLog
+95a74939a99a60c0068877fb5c65fe01 libada/ChangeLog
205ed97dd66c9e8078c99311e25b584d libada/Makefile.in
8efb9115b70b2aa70c7db10862f7b2f5 libada/configure
6433b3fb1e942dd2597541b21eb8be0f libada/configure.ac
46d3fe6da7a771cc2d5420c4137a6861 libatomic/.gitignore
-9dd61f097c671a04b0edfedd77f8cfad libatomic/ChangeLog
+7770dc2abf69beac14080f078cb2339f libatomic/ChangeLog
bf2b737497af89020096e79749ced1a6 libatomic/Makefile.am
46bea738c735828c2e94c7f71122785e libatomic/Makefile.in
f7853b06953072a9987a45a5b00782d6 libatomic/acinclude.m4
8a7308fda7ed1543cb9e3be0f8e47bce libatomic/testsuite/libatomic.c/atomic-store-5.c
cce610fe1b2413dc6f097cb40816e9e8 libatomic/testsuite/libatomic.c/c.exp
97b0c9cdfcb733664bdf4efe0f5dc449 libatomic/testsuite/libatomic.c/generic-2.c
-a1f6c36fefc619da897ac9060b272016 libbacktrace/ChangeLog
+875f7c031ff8f59682ac6c6b4c7c2dd3 libbacktrace/ChangeLog
6af6c9838d1737a87529f290a49f863a libbacktrace/Makefile.am
10502b510e3bb652e63f65eab6326c9d libbacktrace/Makefile.in
1987c0495aeee1bc47709f399772173b libbacktrace/README
5badd67d5362a883d02092d992e2c605 libbacktrace/fileline.c
4c73c8c2d1aba3b0c421e8b8e163b7ed libbacktrace/filetype.awk
16977003b6cf9fba62ceb490ea19f074 libbacktrace/internal.h
-41d56b65744d5a34a78cf347f1f93225 libbacktrace/mmap.c
+6940c5afbd9fa8c0932aa32f75836141 libbacktrace/mmap.c
b0a8eab539202706059b1cbb305d132e libbacktrace/mmapio.c
86e7417bbd63c38c6f30058e4d2f7bd8 libbacktrace/nounwind.c
915162e3a8fae0ff20d7e9232030a49a libbacktrace/posix.c
1c31e53190ed9e49127ac9a1b8c9dec9 libbacktrace/state.c
7150f898c2b02b634d0f176a1d322385 libbacktrace/stest.c
41b3b24b264c530417d7b6970d7af429 libbacktrace/unknown.c
-6a9b484426d5c40e4fb851c591bf42eb libcilkrts/ChangeLog
+744f4e563ce155edded27dc0df7a8579 libcilkrts/ChangeLog
44e8fbbf5f5fdcf45b8dc268c303f4cc libcilkrts/Makefile.am
9e82ac68701a059f6122da2b42d5be43 libcilkrts/Makefile.in
4a307b1474cad63768b2ae0c183b6259 libcilkrts/README
94c538f9a3100a27649a9dc4d63d1677 libcilkrts/runtime/sysdep.h
ffd8820979e88b4845e4b6ae604d2fdf libcilkrts/runtime/worker_mutex.c
9af2df6acad19a2001c2b1f68f5f59be libcilkrts/runtime/worker_mutex.h
-0b6c3d6e8e0d7fe2e36c3a5fce04b44f libcpp/ChangeLog
+b61fb01fc9d8c8c8d75012c2fcdf8a63 libcpp/ChangeLog
07c1fdaef120cbf7edafa33ab3e0a20f libcpp/Makefile.in
7307c791a8de641ef6dada9a179ece57 libcpp/aclocal.m4
d19e8274ac720426c1d890feaa695d2b libcpp/charset.c
14697b3989b853bc975d8031495a37ff libcpp/include/symtab.h
ab1504e880a258c78a15e3a6de24f9a0 libcpp/init.c
e4beb80693183cdc4c98bef23dea2fc9 libcpp/internal.h
-360ef2ee5dad5d6b40c8d48cdc923d8f libcpp/lex.c
+91737a79365ff906cad63f5c1d681190 libcpp/lex.c
ae8eb46c3ad0c5e352fd21eed18adb3e libcpp/line-map.c
a3b42e84107cbc10045e964837492e97 libcpp/macro.c
e5e6e60c02d9485ec697dd4f781e5444 libcpp/makeucnid.c
2b26a65df760b88805e260d6da1b8586 libcpp/mkdeps.c
eced0388fb8c787f6ddc4e261432d411 libcpp/pch.c
-76f3706394bf44814a3cdbc90019ec94 libcpp/po/ChangeLog
+24a8966c2132466c5125561150511455 libcpp/po/ChangeLog
54906a88ab7fcfdf317421cf7c4303bc libcpp/po/be.gmo
ecad891effc5c3a27a61d3faa8aee068 libcpp/po/be.po
5df92306df1918b63b8969719b670bf7 libcpp/po/ca.gmo
0852e16675aa93396c6b42956dff1af3 libcpp/ucnid.h
c8500dcd582950cb6ed628ffc84e2c09 libcpp/ucnid.tab
a6c2b3de06c7424706b16f4c206396a1 libdecnumber/.gitignore
-5d5f20deda36cc7c29ce1b85c661257e libdecnumber/ChangeLog
+5dc6fbe6979ae9ce83b1fa3aac2ebb9b libdecnumber/ChangeLog
3b84e93d037a889256842da6a8b66418 libdecnumber/Makefile.in
2746a1155d319a2cda823ee5b58921ce libdecnumber/aclocal.m4
3ee16b60b2f53df578443d0a2e076824 libdecnumber/bid/bid-dpd.h
1d6434525d5b6fae13c2e8a996121a5e libdecnumber/dpd/decimal64.c
6b20f17b6f453b9ee65b87eb01d119d7 libdecnumber/dpd/decimal64.h
0f6db29710e7075c2fd62bc4478b3b8d libdecnumber/dpd/decimal64Symbols.h
-97b2cad4bc8d301d14fc1926d6026f75 libffi/ChangeLog
+39b2737f5a0ee5458284da5922301af4 libffi/ChangeLog
ba66fc19311348d373ec271be939a659 libffi/ChangeLog.libffi
fbbc216bc25d759a72ea3e6d734af56b libffi/ChangeLog.libgcj
d946d2b97454ad50a1dbfbf48923c5be libffi/ChangeLog.v1
291be426192f460f6a07dfe1c96ab094 libffi/testsuite/libffi.special/special.exp
93fc3ea311b79f64004992807ce75d1e libffi/testsuite/libffi.special/unwindtest.cc
185d0795017fbbe253a13db8e34085f9 libffi/testsuite/libffi.special/unwindtest_ffi_call.cc
-1235a9bc441affc877d2c91c634ce0b1 libgcc/ChangeLog
+36ff3e7f2290d495372417ef770bfd1f libgcc/ChangeLog
7f58014cfac96f94d81457205c18c223 libgcc/Makefile.in
4575e60db0c36a906ae99acf805a0550 libgcc/config.host
25a291c353009228fc85e36e91e64c08 libgcc/config.in
27de1ebbc2f12b5b9a8e6e0460fb3d9c libgcc/config/arc/t-arc
1c6498366e09d27eef3cc5443272b299 libgcc/config/arc/t-arc-newlib
0e6e6e67c1465c6e8f00f3f1d0dd213f libgcc/config/arc/t-arc700-uClibc
-f05865a040b0a8d835ff6c71e964a360 libgcc/config/arm/bpabi-lib.h
+69d95f104130cbb3227704dfd4ea75dd libgcc/config/arm/bpabi-lib.h
a69ec893b0e4432944938ba962a122cf libgcc/config/arm/bpabi-v6m.S
9c293f92f2c8aa994c222af1c87179e0 libgcc/config/arm/bpabi.S
39cd0b4384ba52c9517c6548457950e5 libgcc/config/arm/bpabi.c
22d94e88e335f7671d36a7cd9912ce14 libgcc/config/arm/linux-atomic-64bit.c
c00d8958faf55dcb0b1e5eacbe7f1d5f libgcc/config/arm/linux-atomic.c
df5b9082304d460b3f9c51c48122b5b3 libgcc/config/arm/pr-support.c
-0b424e73df344bd79e7ed7753abff90f libgcc/config/arm/sfp-machine.h
+131990bf9b0a8ab71c7abf0c49d4fbfa libgcc/config/arm/sfp-machine.h
f47aea1fef6da35621bca9a9b47656d4 libgcc/config/arm/symbian-lib.h
6f46bbbd9e7334a061e6dae05c1319b2 libgcc/config/arm/t-arm
95ccb8d9807e7229274f546d4664a038 libgcc/config/arm/t-bpabi
1ad8379325b99afa4e196e92cf5a5aba libgcc/config/i386/crti.S
a57fb755601c047971e04689034ff273 libgcc/config/i386/crtn.S
c2535975d467d390b827e21ee7f9a2d3 libgcc/config/i386/crtprec.c
-678c48b2cd8358306d0c6998bc9e6c06 libgcc/config/i386/cygming-crtbegin.c
+381536838c868685bd0f2abfa9f81af2 libgcc/config/i386/cygming-crtbegin.c
e7b956200c902115a507718a103cf015 libgcc/config/i386/cygming-crtend.c
cbd36f1edf69f15bf49d0044d38663b5 libgcc/config/i386/cygwin.S
8e657583537e83d8cc15822e9ade5eae libgcc/config/i386/darwin-lib.h
983913088848c37426464c44ed30f389 libgcc/config/ia64/vms-unwind.h
7a56469ad10b7c48767dcf3b22434e61 libgcc/config/iq2000/lib2funcs.c
102f7dad8ad6b54434a1b8313d1e42c4 libgcc/config/iq2000/t-iq2000
-70ba4bfcb9368d51ca67e556d79a8abe libgcc/config/libbid/ChangeLog
+88069328225f4c5b784f281ff87face6 libgcc/config/libbid/ChangeLog
bd427e604ec5104368c49c5babee0027 libgcc/config/libbid/_addsub_dd.c
e60ac20c51a4ad903984450529a1f0e9 libgcc/config/libbid/_addsub_sd.c
9ce300999fc3b8a8a9a5d57b1d1deb0c libgcc/config/libbid/_addsub_td.c
47f595c301c0de6db734c8f30450e180 libgcc/config/msp430/slli.S
76a5c501498c92789a5019b5dbfd4b2d libgcc/config/msp430/srai.S
67eb4bb44496978c58eeecca36f78971 libgcc/config/msp430/srli.S
-71f9923a59ce99387110cf16cdc70375 libgcc/config/msp430/t-msp430
+ebdf0bda076e781cccd9503b489f6ffe libgcc/config/msp430/t-msp430
24223486f1047780652dad7c2b11113b libgcc/config/nds32/crtzero.S
25766e41a9f7032fb9877f6a8f85d785 libgcc/config/nds32/initfini.c
3309bb3bd0d0a83f2e308d032c9803a7 libgcc/config/nds32/isr-library/adj_intr_lvl.inc
429659ae1ff2531e3ba2fd0c676a320d libgcc/config/t-slibgcc-hpux
229ab2f70a4aaaf97e2261ec00dc4497 libgcc/config/t-slibgcc-libgcc
b5d3fe85dff400a82befa6b901b438ec libgcc/config/t-slibgcc-nolc-override
-98c72042b97ae21a42e646d80bd3a4fb libgcc/config/t-slibgcc-sld
+7324b7b2d5416a7ab9bd659184c79194 libgcc/config/t-slibgcc-sld
39082f76e7ff28af867afdb6b93b1891 libgcc/config/t-slibgcc-vms
db7f1ee69a9d522e5199b4474c5ff1cb libgcc/config/t-softfp
72f41afb67b3c3c67809819763244452 libgcc/config/t-softfp-excl
7e5de74bf98e12bb4afb927d0c5d69c3 libgcc/vtv_end_preinit.c
1c9bb66910761539ddc5ff002e70c272 libgcc/vtv_start.c
868ca421eb9feaef7af922f89533ec54 libgcc/vtv_start_preinit.c
-22dc2014a415529e7d8004ae8c1b91b1 libgfortran/ChangeLog
+aa381e68a48b616462e4e99160c07012 libgfortran/ChangeLog
9aca36338382e5b4b730e7779170b24d libgfortran/ChangeLog-2002
80d3edc880c2da0b7a2beec2e2c4f774 libgfortran/ChangeLog-2003
9f0239429993a5e64ed793eb6c55a5c1 libgfortran/ChangeLog-2004
9de0a8e2d1cade6367a4d31644c10a7b libgfortran/intrinsics/clock.c
d71a656fcde539b83446162276d1bb62 libgfortran/intrinsics/cpu_time.c
ae946dafd409ca379c0855f90fa53cf8 libgfortran/intrinsics/cshift0.c
-d6b4eb6cb1c8a35729e47daffda35f74 libgfortran/intrinsics/ctime.c
+6fa5e66ac6ba5d6a81527a077490a25e libgfortran/intrinsics/ctime.c
b827d4f4acd4f0a9c746d9551a430d57 libgfortran/intrinsics/date_and_time.c
268b7f00782746fd5de7860c0fcc09c8 libgfortran/intrinsics/dprod_r8.f90
67a5fb3f13f0817c80390d84fc7b8c4b libgfortran/intrinsics/dtime.c
3265147203606b7bad62e5d2908f9869 libgfortran/io/inquire.c
040686ca709c2eb8e86ffe443d3fd8d6 libgfortran/io/intrinsics.c
c35833ba6b9b23bdef8de6e70635aea9 libgfortran/io/io.h
-fc91f07e504c9261c0d49f9d39a14a4c libgfortran/io/list_read.c
+0d3ffd29f6646e412bc51a6f195371f3 libgfortran/io/list_read.c
f0b41e3bb3904d863aec0780e95d876c libgfortran/io/lock.c
d7d4ed433bf1c8a869ae50ddb62b42f9 libgfortran/io/open.c
7f0a9a12949149a87ba70a272df7d9db libgfortran/io/read.c
0cec0394c4855ce26165f498b52379bc libgfortran/io/transfer.c
f936c3b00e7e8e0a02a6295e7b0f27c2 libgfortran/io/transfer128.c
cde532cf9943fbd5c2aee09a9e745fb1 libgfortran/io/unit.c
-511039c57c0fad796caac8498d2477e1 libgfortran/io/unix.c
+0bf46fbcca9ef7c6659d267dffbb6406 libgfortran/io/unix.c
77d75641d66ddd858c2323836d22c224 libgfortran/io/unix.h
c1bcf58817c5f55c9e7bd75ac50bc712 libgfortran/io/write.c
f6c291d3d0197f2bd00b964dada60450 libgfortran/io/write_float.def
0e3a2fb357762bdec163fe51ccb1e951 libgo/README
d46376034c1fd6df47c8ba2cd5de9d0a libgo/README.gcc
7281cb4b7a426e299beb22a3191d79c3 libgo/aclocal.m4
-2006458cea7d8eb986fc19fb9ceafac4 libgo/config.h.in
+636bde47828341ba6e598a0f281167cc libgo/config.h.in
ad1ce707d70b18d5d14bdbcfef82a9bb libgo/config/README
9a6e33ac95f7d5857d34f53bde4cb610 libgo/config/go.m4
0dbf51539b4d117324c49e2410a7868e libgo/config/libtool.m4
bc2f6032c98896249eadb56177c7d357 libgo/config/ltsugar.m4
c30cd33c496505f13d9fbdb6970c7c33 libgo/config/ltversion.m4
293853a13b7e218e3a4342cf85fbbf25 libgo/config/lt~obsolete.m4
-1abd9bf3e0611da88226a02318dfba20 libgo/configure
-fe865d95bef24266c89e3d2724ebbd6a libgo/configure.ac
+292416f1fc0ab677291a1094cac27c28 libgo/configure
+56d57ca3e961e4f201130d371bdd3274 libgo/configure.ac
1ef809eec8a49a2eca44b613eaf9847d libgo/go/archive/tar/common.go
45655d3df8e304b659bb098fc9006e94 libgo/go/archive/tar/reader.go
e432f7705cc613af1419f6c711089511 libgo/go/archive/tar/reader_test.go
d2c0f0166aa2cc63cec3270b5fa1d3e2 libgo/go/unicode/utf8/utf8_test.go
8e700e99e52bad7f8289006b7bd149d4 libgo/godeps.sh
8bc70efd6d9c1c8ba1e6df79a2241516 libgo/merge.sh
-b3f8c2f9a46ec559581ca9e007ca3c4e libgo/mksysinfo.sh
+27ae1fdf2b91e9664d6b1e923a866af4 libgo/mksysinfo.sh
06b0ddfbd036dbdfdf8c4c7efb8b746f libgo/runtime/arch.h
0d727dcfb3816731f56f174e8cbd29eb libgo/runtime/array.h
d539a7523f322c7b10a6e934c5fa16e6 libgo/runtime/chan.c
ec646d3074384118062135dba38d8e0c libgo/runtime/mfixalloc.c
66424704bf902fadede61a48abf430c1 libgo/runtime/mgc0.c
8814b7062f80a4c061b106b2c9c7c1bd libgo/runtime/mgc0.h
-25280d2578cb621c0a1a4808f3f0e792 libgo/runtime/mheap.c
+e66170fdb4388b7e18851ec4e3dd0b29 libgo/runtime/mheap.c
b97eeb7e3b957b7fb4f671642734023a libgo/runtime/mprof.goc
d15b2c21437b787c0d0e98b9a9740108 libgo/runtime/msize.c
c4ce56193babb313ea7bb80c882173e0 libgo/runtime/netpoll.goc
1b99484119160ad9d9cb5cc381d5b7ae libgo/runtime/panic.c
01541a76054b816f6c8c5558143ef68e libgo/runtime/parfor.c
3eafca6e0006b08920b178c1ca9ee121 libgo/runtime/print.c
-be088933873b3586b23b5492859ccabf libgo/runtime/proc.c
+a79bd15b7ad910aef1bfe2ebfdf97c64 libgo/runtime/proc.c
f8a80dccc77238f938943b1e8191e2b1 libgo/runtime/race.h
f3043edb6d3f3dec7c3d18064c9a2f46 libgo/runtime/reflect.goc
88236bd9baaae0e22c2fe3c097d9cfbf libgo/runtime/rtems-task-variable-add.c
207f334413c982763e10e994230fefbf libgo/testsuite/gotest
578a4705035f5cbb8425f2e2eb75a433 libgo/testsuite/lib/libgo.exp
6df485581d2f02246f41b5ca46f5bb5d libgo/testsuite/libgo.testmain/testmain.exp
-050c8bb88f970bea2fa92a4c08d9fa17 libgomp/ChangeLog
+7763044a5f66fe9f9c25c52d0f70e98c libgomp/ChangeLog
0d55aa862aee66efdc5f8d62c94ff8fb libgomp/ChangeLog.graphite
0b707c40cd3236f294bcd8a5bcead00f libgomp/Makefile.am
d538a08bffc033de3bd6ab6000ee2091 libgomp/Makefile.in
033ba0d8f9cd68151cebebf17bf33589 libgomp/iter.c
5f2f63229277fb78ee8308c045d7b476 libgomp/iter_ull.c
1f693ed86e1282c2307d65c71055023e libgomp/libgomp.h
-576982b551550b2fd60e8132ca5891e5 libgomp/libgomp.info
+cb364fb5e2911a114c03ff5088059936 libgomp/libgomp.info
6cbe48d155b1725f5e32de30d5daedb4 libgomp/libgomp.map
8b2aa50aecad82171348a6918309afd6 libgomp/libgomp.spec.in
-dce36ef18f99dd59489caa7388103c55 libgomp/libgomp.texi
+57242f2ada25ede0584dba75bcb07620 libgomp/libgomp.texi
19cd0ff067db126556be252f2c754934 libgomp/libgomp_f.h.in
23a87a355a8dd0b8bd4c15174738b461 libgomp/libgomp_g.h
ddd43eaec8e3214ed28a1fb346758714 libgomp/loop.c
aa0f0b8c12c665d06664bf1efc315be1 libgomp/loop_ull.c
b41bce1b1aadda6779b912891eba1906 libgomp/omp.h.in
-7c977650212bd2f23070bdffc0eda075 libgomp/omp_lib.f90.in
-7443cac321c74f24354ce00172e01ec3 libgomp/omp_lib.h.in
+1205ac703dbb7f8c65a0d9cc655afe4e libgomp/omp_lib.f90.in
+9a991ce228c7ab6290f86b0b3265629e libgomp/omp_lib.h.in
30ceb3811741e12322b00026bbfdf1e5 libgomp/ordered.c
47c08ff69d5d9d3b173bd58c96f13a21 libgomp/parallel.c
368e6e721ed45c2c90d7396d4ed21bad libgomp/sections.c
5562ceebc0054102930e3944e3d8cea0 libgomp/testsuite/libgomp.c++/atomic-11.C
60fb93a6f619d4375a1224303e0884ea libgomp/testsuite/libgomp.c++/atomic-12.C
a56e4a1dad7c21fecfbf5dd26cb1f86a libgomp/testsuite/libgomp.c++/atomic-13.C
-63da250a39155cc5c2679f50bafe413a libgomp/testsuite/libgomp.c++/atomic-14.C
-998d78d48199bf9a944cf00743b4f08e libgomp/testsuite/libgomp.c++/atomic-15.C
+f5aa3b6a543d3042289d53904701574b libgomp/testsuite/libgomp.c++/atomic-14.C
+156c6a231b71803eea67391fb8826eab libgomp/testsuite/libgomp.c++/atomic-15.C
11dca764f708d500baba4ceaa6de9b54 libgomp/testsuite/libgomp.c++/atomic-2.C
ed304e6a8199d4a60a7bb4acd1a4f4fc libgomp/testsuite/libgomp.c++/atomic-3.C
f944acede3f9beeaf281ef9282c0ff44 libgomp/testsuite/libgomp.c++/atomic-4.C
cf8630c02b905d98e08a439066bb9815 libgomp/testsuite/libgomp.c++/ctor-8.C
0bd7fe39119bfc0574561c1e381edc5b libgomp/testsuite/libgomp.c++/ctor-9.C
e1ee4867ce68141a641f925070e14fdc libgomp/testsuite/libgomp.c++/for-1.C
-a669a7a87be033fa10ce5831ba56bd7b libgomp/testsuite/libgomp.c++/for-10.C
+325a8a87e18b89a296100f50ff483415 libgomp/testsuite/libgomp.c++/for-10.C
dfe85033dffc4c50dfe322315583cac7 libgomp/testsuite/libgomp.c++/for-11.C
b64542faf55a399e300d1e45dd199dea libgomp/testsuite/libgomp.c++/for-2.C
ea264f143b0032900269cff3dd21e0cc libgomp/testsuite/libgomp.c++/for-3.C
4c94d5cac60e507291540a0f2e3436c1 libgomp/testsuite/libgomp.c++/simd-6.C
56e5a5def81a4763b39f8f8ea0468a5e libgomp/testsuite/libgomp.c++/simd-7.C
5e39603f7135e44a8a4eddc2486914e0 libgomp/testsuite/libgomp.c++/simd-8.C
+e7079692a564dbf5ba9a4e6b88667164 libgomp/testsuite/libgomp.c++/simd-9.C
+efbd2e4864876ba2f991a788cf935827 libgomp/testsuite/libgomp.c++/simd10.C
+25dbd1440a09a94fee9305462af883ac libgomp/testsuite/libgomp.c++/simd11.C
+4943afa1e0250f27fcf341e04af0c9cb libgomp/testsuite/libgomp.c++/simd12.C
+96c3fedeca45853d33c4b89a99b13bf7 libgomp/testsuite/libgomp.c++/simd13.C
989f18f6eb61c820627dc227d206e00d libgomp/testsuite/libgomp.c++/single-1.C
fa90d4613f21c2fc2203f662585b40a3 libgomp/testsuite/libgomp.c++/single-2.C
7d0f24f8edab30e9e5aa2d3f5133e9f4 libgomp/testsuite/libgomp.c++/single-3.C
85ee71c5eb239b17bb9095c68fbcb661 libgomp/testsuite/libgomp.c/atomic-14.c
33127ad11444516f01f50d3c91a2f1d6 libgomp/testsuite/libgomp.c/atomic-15.c
6f72ee0577bc6156aa5c8df3b6419bbb libgomp/testsuite/libgomp.c/atomic-16.c
-0ad9f2e3d666958d47ff539a07b4b3e4 libgomp/testsuite/libgomp.c/atomic-17.c
+0ab38a97361e81570c040a605673de79 libgomp/testsuite/libgomp.c/atomic-17.c
b2cad381aa4dd3db0ef4c2a7e632baf1 libgomp/testsuite/libgomp.c/atomic-2.c
b0fbce555e04a1378026d70e19942300 libgomp/testsuite/libgomp.c/atomic-3.c
55ed566464c81304a5007804570816ec libgomp/testsuite/libgomp.c/atomic-4.c
eee3a5f96082366f174ca0d6447da3d9 libgomp/testsuite/libgomp.c/depend-4.c
6658653ddd5ca0b2b531abd1158e9371 libgomp/testsuite/libgomp.c/for-1.c
c8a38164050e9ce322ff7c77a9f0f96c libgomp/testsuite/libgomp.c/for-1.h
-4ba00234487347368a6840b472021871 libgomp/testsuite/libgomp.c/for-2.c
-afbaf65a5d3f8a65a3bd27fe69af97b7 libgomp/testsuite/libgomp.c/for-2.h
+41fae244753e1767688f062024db0e24 libgomp/testsuite/libgomp.c/for-2.c
+2cf8aa5f45f0ddc2da9d951ba4897c71 libgomp/testsuite/libgomp.c/for-2.h
a2c7676fd46d069ce39b4d8a7c16ba5d libgomp/testsuite/libgomp.c/for-3.c
00d45ed4a463f0629d2d21a38fe0073a libgomp/testsuite/libgomp.c/icv-1.c
6619bda92e7a29f372b1a0bc19ef2c79 libgomp/testsuite/libgomp.c/icv-2.c
683302cd2c348c750020ecdfcfa8c7de libgomp/testsuite/libgomp.c/loop-13.c
81cd8a77c25ea49d08f07250f984f35d libgomp/testsuite/libgomp.c/loop-14.c
dffc3aabaa5b2461aa560fc66c80c0fe libgomp/testsuite/libgomp.c/loop-15.c
+8257d204f0bf53b53ae5433dcee92216 libgomp/testsuite/libgomp.c/loop-16.c
fcf0b70da92fc55e6cdd5d1a77923dc3 libgomp/testsuite/libgomp.c/loop-2.c
2d311b74a086fbde01cc1251018f8c89 libgomp/testsuite/libgomp.c/loop-3.c
3e1854d7c928c20929261995df919755 libgomp/testsuite/libgomp.c/loop-4.c
6059443919441f3c8acfe62439b65044 libgomp/testsuite/libgomp.c/shared-2.c
7b472060fcdfa5aa072be093a71d8d41 libgomp/testsuite/libgomp.c/shared-3.c
d687c7ee2b97ca318eb2cbe2d9e32923 libgomp/testsuite/libgomp.c/simd-1.c
+d584069147624aaa771a8fbe26a34b92 libgomp/testsuite/libgomp.c/simd-10.c
+4b97c8d0be63a89338a88d29f5f0fbad libgomp/testsuite/libgomp.c/simd-11.c
+e2fb02a03879cc3eefcf136169a6aa04 libgomp/testsuite/libgomp.c/simd-12.c
+6d5662514cdcb1fa1445426457b8795a libgomp/testsuite/libgomp.c/simd-13.c
+b6e3d868c2031082285e4d860a3d50a2 libgomp/testsuite/libgomp.c/simd-14.c
+873b738f8e15236955d11bfcb97f6032 libgomp/testsuite/libgomp.c/simd-15.c
+027b30720640c006221c9b4acfb8c976 libgomp/testsuite/libgomp.c/simd-16.c
+91a244fceb3e523fe73360a1817b9d6d libgomp/testsuite/libgomp.c/simd-17.c
d825417b8e2624e2972edaefb1333efd libgomp/testsuite/libgomp.c/simd-2.c
92361ad7427a9ea00af35e9e86485641 libgomp/testsuite/libgomp.c/simd-3.c
8d5767814fdf98dacd112725c1647994 libgomp/testsuite/libgomp.c/simd-4.c
91b5ed7d04f7567188bdb6f72bf88c56 libgomp/testsuite/libgomp.c/simd-5.c
da6350b2bde6abd3e194167a5b3eb74f libgomp/testsuite/libgomp.c/simd-6.c
+f7ffd498a19cadfe20b0cbe2bd4e62f1 libgomp/testsuite/libgomp.c/simd-7.c
+9bb4ef88871b44e41ac2f641b409f04a libgomp/testsuite/libgomp.c/simd-8.c
+b898403c47aaf9326713abfd2c7ed020 libgomp/testsuite/libgomp.c/simd-9.c
21b382f164a90f3510cb97d72b5288b0 libgomp/testsuite/libgomp.c/single-1.c
f96d46491425528d3d7b30c80c64952a libgomp/testsuite/libgomp.c/single-2.c
a3d6465fcc15265d1c049a81027ae8db libgomp/testsuite/libgomp.c/sort-1.c
4ebf32f910116d66ca9d291de6853ff9 libgomp/testsuite/libgomp.c/target-5.c
478dec9f49fcb1b67e9fe82cbb95d254 libgomp/testsuite/libgomp.c/target-6.c
6e8611e391b050b0df3fb173cfc1fc67 libgomp/testsuite/libgomp.c/target-7.c
+daf22b86ee42ffc308b6a344aea724e9 libgomp/testsuite/libgomp.c/target-8.c
05e0040fe890c467b6069b850ae3a252 libgomp/testsuite/libgomp.c/task-1.c
b07f3ce8ad8f8edece7624d18f5d154d libgomp/testsuite/libgomp.c/task-2.c
f7ff00e5f2a30832f7f427c91fa1f61b libgomp/testsuite/libgomp.c/task-3.c
4e04bd947e2e4aa6b0d33535232575a6 libgomp/testsuite/libgomp.c/udr-2.c
26a632a90e3b65f74ab6b734c3fd0d94 libgomp/testsuite/libgomp.c/udr-3.c
35c4904668124586d73a652acb4ed703 libgomp/testsuite/libgomp.c/vla-1.c
+72f799d6a28401fdff759786ae76ed6e libgomp/testsuite/libgomp.fortran/aligned1.f03
+71944b8bef7f0e4b6f81cf656e8b99d8 libgomp/testsuite/libgomp.fortran/alloc-comp-1.f90
+b8dd09f53416d6c63bc6648223c60f11 libgomp/testsuite/libgomp.fortran/alloc-comp-2.f90
+71f9dfa4865a762564750c9cb7de2ca7 libgomp/testsuite/libgomp.fortran/alloc-comp-3.f90
56a24835fa9d124fad3d523ffafe3b21 libgomp/testsuite/libgomp.fortran/allocatable1.f90
+956fa22db4361f8a28a17d9ee348259a libgomp/testsuite/libgomp.fortran/allocatable10.f90
+d21f2d58b9ffe5ef1aaf580180dfdad4 libgomp/testsuite/libgomp.fortran/allocatable11.f90
+4cc63c460b69cefd0cf2a165978338c6 libgomp/testsuite/libgomp.fortran/allocatable12.f90
927bc460f431a751bec399f6f3f1eae7 libgomp/testsuite/libgomp.fortran/allocatable2.f90
1746499596b2e82f512b2f7679eba1b1 libgomp/testsuite/libgomp.fortran/allocatable3.f90
f32aba254f0d07b32bb09a6665fa5d11 libgomp/testsuite/libgomp.fortran/allocatable4.f90
6bd96bc59a02f0cff14cedaa535e2b87 libgomp/testsuite/libgomp.fortran/allocatable6.f90
71d5213bf85633a62cd15b3c8d85606b libgomp/testsuite/libgomp.fortran/allocatable7.f90
a5c3b87debe112259e6655553f327b36 libgomp/testsuite/libgomp.fortran/allocatable8.f90
+ba13b71662af2e95ad0d09be9e3aa86a libgomp/testsuite/libgomp.fortran/allocatable9.f90
d69ebafdf43e748e354c0c05228cdd0c libgomp/testsuite/libgomp.fortran/appendix-a/a.15.1.f90
3f53f7b5eb9ab9c8cb9eb0edfeedad91 libgomp/testsuite/libgomp.fortran/appendix-a/a.16.1.f90
519d7f01f054c7eb7495ba49409d2c51 libgomp/testsuite/libgomp.fortran/appendix-a/a.18.1.f90
f34e0c37442a4a7019dadca0b34ac11d libgomp/testsuite/libgomp.fortran/appendix-a/a.40.1.f90
04f8ab2d7e7bf368add9b8d8c9a8c1bf libgomp/testsuite/libgomp.fortran/appendix-a/a.5.1.f90
6116086a89b906c26bd9afe26e57a07a libgomp/testsuite/libgomp.fortran/appendix-a/a10.1.f90
+ba05d0e1b584ec6c750d14a486ac83b2 libgomp/testsuite/libgomp.fortran/associate1.f90
+41cd3ed9183e6bc7b20ef8836663fbdd libgomp/testsuite/libgomp.fortran/associate2.f90
+cb0b79f7bddc47118981784eb7ba6f75 libgomp/testsuite/libgomp.fortran/cancel-do-1.f90
+2a5fe3d97ff9f23e08df5e015a45e3bc libgomp/testsuite/libgomp.fortran/cancel-do-2.f90
+a110324b7cb72dc5755c1ad39c5230fd libgomp/testsuite/libgomp.fortran/cancel-parallel-1.f90
+e804e30e2adbfe3b45724f1d27673f8a libgomp/testsuite/libgomp.fortran/cancel-parallel-3.f90
+b9afb6ff66c727dc1eae6ec7017f6d44 libgomp/testsuite/libgomp.fortran/cancel-sections-1.f90
+11bef914844f26ca1de29fda6df378cb libgomp/testsuite/libgomp.fortran/cancel-taskgroup-2.f90
d647e114a637a61f5170b3f577ebeb09 libgomp/testsuite/libgomp.fortran/character1.f90
527829a886591ba771eaaa6b79d07ad6 libgomp/testsuite/libgomp.fortran/character2.f90
98f9782da53de2e437f3670c305d4ea2 libgomp/testsuite/libgomp.fortran/collapse1.f90
4935884f21e6712b4f39b275079f0979 libgomp/testsuite/libgomp.fortran/crayptr1.f90
2fd37c1401303ca48058d885c14bbc9f libgomp/testsuite/libgomp.fortran/crayptr2.f90
a80ce4249b45880d8fb3896d2804747e libgomp/testsuite/libgomp.fortran/crayptr3.f90
+f5efb536310d1e6326052b063becef4e libgomp/testsuite/libgomp.fortran/declare-simd-1.f90
+c0ebd55529e9baf82532c7b2f51f3fe4 libgomp/testsuite/libgomp.fortran/declare-simd-2.f90
+0ffd85be0cdc2738928b8085de5bcffc libgomp/testsuite/libgomp.fortran/declare-simd-3.f90
+6e835db912fa2be675117b66187801c7 libgomp/testsuite/libgomp.fortran/depend-1.f90
+501e003d6de5432f0ae9aabf28a1785b libgomp/testsuite/libgomp.fortran/depend-2.f90
+a569a86614b3eb780060b03cae7470a1 libgomp/testsuite/libgomp.fortran/depend-3.f90
ed11df4baf7b08723fe3d9e881036bed libgomp/testsuite/libgomp.fortran/do1.f90
3e9f4c16fbcd55d7ad1c66acde8a2a71 libgomp/testsuite/libgomp.fortran/do2.f90
45f840dcecbdacf158c18a01710c8763 libgomp/testsuite/libgomp.fortran/fortran.exp
8934ee3a053a4179545b9e79fd5cb2bb libgomp/testsuite/libgomp.fortran/nestedfn2.f90
a9ae54e23bafe9142ed3fee717823360 libgomp/testsuite/libgomp.fortran/nestedfn3.f90
61d44d5f6efe0553ec613e3f73ba1ed5 libgomp/testsuite/libgomp.fortran/nestedfn4.f90
+5c2e73626905053c6cadd12f341036c4 libgomp/testsuite/libgomp.fortran/nestedfn5.f90
e863b24ed37278eaafc48570498cbbda libgomp/testsuite/libgomp.fortran/omp_atomic1.f90
2453d7412313367c31ca23e641719185 libgomp/testsuite/libgomp.fortran/omp_atomic2.f90
3245438b8d6d4d38923518299c0fcfe7 libgomp/testsuite/libgomp.fortran/omp_atomic3.f90
b7ae32017adcedabb18b40d236b2c2ff libgomp/testsuite/libgomp.fortran/omp_atomic4.f90
+a4dba85fc89bafd4bfeaca52301b1532 libgomp/testsuite/libgomp.fortran/omp_atomic5.f90
571baa2c0ffb5f61a61d1ee7e4744599 libgomp/testsuite/libgomp.fortran/omp_cond1.f
47ef1f5906cca9cb33adf59409c8422d libgomp/testsuite/libgomp.fortran/omp_cond2.f
3f611530c87478c4eefc94de263b2ad6 libgomp/testsuite/libgomp.fortran/omp_cond3.F90
c910dfe57b9f53b8992d397c3571fd09 libgomp/testsuite/libgomp.fortran/omp_reduction.f
77c80068c3418c0e379971a5e4ac91f1 libgomp/testsuite/libgomp.fortran/omp_workshare1.f
4c7b256074253b51c44fe0f469b4512e libgomp/testsuite/libgomp.fortran/omp_workshare2.f
-4ffb1064fa1cc39ffc18b17145647612 libgomp/testsuite/libgomp.fortran/openmp_version-1.f
-2f266c96aefe7956c1b41718afd9f2d8 libgomp/testsuite/libgomp.fortran/openmp_version-2.f90
+2831b1f46df2aa1dec0adf81da0a77e1 libgomp/testsuite/libgomp.fortran/openmp_version-1.f
+2c343f6f113766adffe1de8547e1bdf9 libgomp/testsuite/libgomp.fortran/openmp_version-2.f90
bd4f1fc88afdef5e17260c0d1f276b1b libgomp/testsuite/libgomp.fortran/pointer1.f90
68926972a15f091338fdd2c4911d21c2 libgomp/testsuite/libgomp.fortran/pointer2.f90
6c679ff49d6363b86f77ad4d1ea6ee34 libgomp/testsuite/libgomp.fortran/pr25162.f
59e84625ad4e7a9efce95deaae9a6074 libgomp/testsuite/libgomp.fortran/pr48894.f90
40b8d47a0d185d1cd5afdf5de857c4db libgomp/testsuite/libgomp.fortran/pr49792-1.f90
d40bb4d01cb9e310f1f5f2f8112947c3 libgomp/testsuite/libgomp.fortran/pr49792-2.f90
+ed38be90cae92afacea925b0c0c3c356 libgomp/testsuite/libgomp.fortran/procptr1.f90
4af6e9394ddc7a6c89dca2968cac162e libgomp/testsuite/libgomp.fortran/recursion1.f90
f7a52f7caa9a62d15b0f1270dc461c08 libgomp/testsuite/libgomp.fortran/reduction1.f90
0afa716c312eb72430b0e7e942b66c76 libgomp/testsuite/libgomp.fortran/reduction2.f90
1f82243a8f0a7760c615332b7656be74 libgomp/testsuite/libgomp.fortran/retval2.f90
411e72fddee46be87cb1f3a53f2488e4 libgomp/testsuite/libgomp.fortran/sharing1.f90
3b56e022c6f666bfa9c89a3c28f0a500 libgomp/testsuite/libgomp.fortran/sharing2.f90
+dbb326b55c871713fdc1de45c38a7c23 libgomp/testsuite/libgomp.fortran/simd1.f90
+8ceea2a4b33050312931a78e4f46bd6f libgomp/testsuite/libgomp.fortran/simd2.f90
+034f4c3fa611a401281064988a3e228f libgomp/testsuite/libgomp.fortran/simd3.f90
+462b4c390c030e55cc9db21a19137006 libgomp/testsuite/libgomp.fortran/simd4.f90
+5861fe58475761f0cb54c8755c49499a libgomp/testsuite/libgomp.fortran/simd5.f90
+d86df9609cefa51152b9350aacb817e1 libgomp/testsuite/libgomp.fortran/simd6.f90
+870b23ab9545da157e901683ff994ce3 libgomp/testsuite/libgomp.fortran/simd7.f90
166b5da3db2f62a2df7c6d3b58af4eaf libgomp/testsuite/libgomp.fortran/stack.f90
ddb20b7f8cb9aa13372d922fad1ddb95 libgomp/testsuite/libgomp.fortran/strassen.f90
be4a9506a28165677f79dbf7eea9dc39 libgomp/testsuite/libgomp.fortran/tabs1.f90
a8af85b9fb1ec1aac107848d192f6c66 libgomp/testsuite/libgomp.fortran/tabs2.f
+510eea5efdbce62755f50df6244acebe libgomp/testsuite/libgomp.fortran/target1.f90
+e7b2e7644f4981570bf4e4d8123aa095 libgomp/testsuite/libgomp.fortran/target2.f90
+11a77b021164127357401380e5d1d2da libgomp/testsuite/libgomp.fortran/target3.f90
+30f9fbc9bb3d35ad4e9ac77e3fa1c4f2 libgomp/testsuite/libgomp.fortran/target4.f90
+da080fe37da01c114e251fc67e64287c libgomp/testsuite/libgomp.fortran/target5.f90
+f66a5081bf7730dffebdba49894d2c54 libgomp/testsuite/libgomp.fortran/target6.f90
+881ca68a517e287bc011679bb19d953a libgomp/testsuite/libgomp.fortran/target7.f90
+a75ebee6d4c3f7b5a041b1208b48d7e3 libgomp/testsuite/libgomp.fortran/target8.f90
3a4bc67e69df5eb5726956f8c0f6b0c7 libgomp/testsuite/libgomp.fortran/task1.f90
58b7d380f359d6a326f0fc046f014c2d libgomp/testsuite/libgomp.fortran/task2.f90
190771ec6fc8070c1b15d6bc4103cc9e libgomp/testsuite/libgomp.fortran/task3.f90
99b0461034cab757c5038bc87a6a547a libgomp/testsuite/libgomp.fortran/task4.f90
+6fff773e2d31ef51153c030c719d62e5 libgomp/testsuite/libgomp.fortran/taskgroup1.f90
1d32702e4b540eb31abac9a94083a959 libgomp/testsuite/libgomp.fortran/threadprivate1.f90
789a1579a73a9912a2800d6c6717ad42 libgomp/testsuite/libgomp.fortran/threadprivate2.f90
0825abd8dca38d283771f7bb2d385fb8 libgomp/testsuite/libgomp.fortran/threadprivate3.f90
59c99788fd51984ac1ed8ab7c5df4d35 libgomp/testsuite/libgomp.fortran/threadprivate4.f90
+211a08e0c9797a94e5c0c7220f19a139 libgomp/testsuite/libgomp.fortran/udr1.f90
+4782493aba8c54c49e57d5c798e1781d libgomp/testsuite/libgomp.fortran/udr10.f90
+5e2c1bcf663ecf040fe096a5dce80be6 libgomp/testsuite/libgomp.fortran/udr11.f90
+f293f1be6e5cfc8c8b98dd542706cbce libgomp/testsuite/libgomp.fortran/udr12.f90
+a4dd971f4d8eda45b0dd2611b3eed443 libgomp/testsuite/libgomp.fortran/udr13.f90
+f93bcd7e7f316e54a12fff301c8bb8e1 libgomp/testsuite/libgomp.fortran/udr14.f90
+90e626816b064f1555d5fbf68caf5d43 libgomp/testsuite/libgomp.fortran/udr15.f90
+a05850a4a0bd9a2361ebfc916b7a9d00 libgomp/testsuite/libgomp.fortran/udr2.f90
+84da432f1f34fe8f451cd8b9d8bce9fa libgomp/testsuite/libgomp.fortran/udr3.f90
+850b2de5fa999416ac7aa4cfd2676570 libgomp/testsuite/libgomp.fortran/udr4.f90
+b656a37206639af2edd615193df33ceb libgomp/testsuite/libgomp.fortran/udr5.f90
+7724c54f6ab053faed6ef4b726537a65 libgomp/testsuite/libgomp.fortran/udr6.f90
+5373e3f88be1334dc28ffb71eadcf3f8 libgomp/testsuite/libgomp.fortran/udr7.f90
+24dc784a193aeda044549291e21a0ad7 libgomp/testsuite/libgomp.fortran/udr8.f90
+b468dfcb8761e4a8f3e2caabdf9b2a62 libgomp/testsuite/libgomp.fortran/udr9.f90
fd6becb20369d6ac5a1bacfc014b31a3 libgomp/testsuite/libgomp.fortran/use_intrinsic_1.f90
41d6cd26c0dd69586ce6eb144daf2093 libgomp/testsuite/libgomp.fortran/vla1.f90
4263959ee016933e58197580eb07520d libgomp/testsuite/libgomp.fortran/vla2.f90
54f9ab06f446afe0bc8a6e6f07a83d6c libgomp/work.c
99c2e5e712b990ee07be10f53e41f3fb libiberty/.gitignore
a916467b91076e631dd8edb7424769c7 libiberty/COPYING.LIB
-780259c74c81d8f8e9301f098331ac53 libiberty/ChangeLog
+7c43f6f1245efc0f716b479592ca91f5 libiberty/ChangeLog
a5d547789d7db4375ced07d9103d520e libiberty/Makefile.in
c68dbf7834af4281ebd84caa3fd54680 libiberty/README
a23c6974fb1adf6977b5f5454c430bf0 libiberty/_doprnt.c
4746095b1b67693ab6e78ed72ead1235 libiberty/xstrdup.c
6f774a92661ca4a067f1691a7925524b libiberty/xstrerror.c
c6e7ef53b4ff115a136d917511222656 libiberty/xstrndup.c
-37fe63edbb6d024fa4103fdb8239c407 libitm/ChangeLog
+5def6bc3ce74ccef8d3b4191094a1785 libitm/ChangeLog
800745ad84882bc445410a58c2fddd51 libitm/Makefile.am
232e2b039eaa7ea7006437397392ae64 libitm/Makefile.in
1529a197c135a0629228fc9d31998589 libitm/aatree.cc
7b1b43184a6209c1b1a137a5fc6065e7 libitm/aatree.h
-3674449b8cac55a89286179cd0b23809 libitm/acinclude.m4
+60c5bf0d4f3941ae12577c319ae67baa libitm/acinclude.m4
94efa0c0176ffe7ccddefedbc7bf422c libitm/aclocal.m4
c83d7c56996a8da20b9c4e3fc130ad41 libitm/alloc.cc
80400bb5e438158aca8dc4d4e0682477 libitm/alloc_c.cc
a1afed4e585fa3a1b7bcf7bd24e3cca2 libitm/alloc_cpp.cc
22a3b0e50cae33b93cc9092ca4fa4473 libitm/barrier.cc
4a2bae53331d4d3a34927fae2463d106 libitm/beginend.cc
-13c1205a3cbd2d6cd8d6531983c3b639 libitm/clearcap.map
7cd1b6956902226fa26938c62fed3134 libitm/clone.cc
083df06b45dfb981ffb97547251e2bb6 libitm/common.h
05ea82fd12c7b4a030b6310b862ff47d libitm/config.h.in
7aa2e131698a512bed54804e17ceb065 libitm/config/x86/target.h
d2dbbbb75cd9c5edfde395ad53e62153 libitm/config/x86/x86_avx.cc
b9557cfa4f6c06b54f305a5b85fd1015 libitm/config/x86/x86_sse.cc
-0045541ad9f5ae3f0fac08bd0e31c7ce libitm/configure
+acc6a26688cae0fd1d43ca2d36a0e0b4 libitm/configure
923e894a4f47f976d8e49af5afc13105 libitm/configure.ac
147a47d0c4814b75a3825c0bca693d99 libitm/configure.tgt
95fda76bdc2a5bcbcfb720b1f3bb1600 libitm/containers.h
d482ef5219faa907ff83393d6628de60 libitm/useraction.cc
b18e667b8febff13520856a6c985a788 libitm/util.cc
94d55d512a9ba36caa9b7df079bae19f libjava/COPYING
-5e2c838b69c613f1b94fdbd679819755 libjava/ChangeLog
+b96200f06646d43a62c6048a4e2e2485 libjava/ChangeLog
03e1f38b916604fdf1470238201325f3 libjava/ChangeLog-1998
691acb61fbd6a2235826ff55db5578be libjava/ChangeLog-1999
b58c6701706771a02bf00a77666941ef libjava/ChangeLog-2000
880a25226e4e4e4c241663041d24f8dd libjava/classpath/AUTHORS
efd97e0bb913655e0c8b16fa78bdded4 libjava/classpath/BUGS
af0004801732bc4b20d90f351cf80510 libjava/classpath/COPYING
-4f28e8ff207bafea344f2d3918cd861f libjava/classpath/ChangeLog
+42ed4bd3309333bcbbaf241f30327c71 libjava/classpath/ChangeLog
3418fae58de967afe26d915a4b18d82c libjava/classpath/ChangeLog-2003
a5b72adb94a3c362738b0f52e57a82af libjava/classpath/ChangeLog-2004
61159c6e0802d0d2a92b3051003db5c5 libjava/classpath/ChangeLog-2005
8e47b82e10c52c7434946f7552f1b333 libjava/classpath/doc/cp-tools.info
0349e5c38c548584225423ef4bafd20b libjava/classpath/doc/cp-tools.texinfo
3155d9bd9a7bf4aff2ff0dfe4a2cb878 libjava/classpath/doc/cp-vmintegration.texinfo
-c0c0e81b77952682626c07d8f3bf48b7 libjava/classpath/doc/gappletviewer.1
-8d4c248122d8d8b5aeb543425eb485a0 libjava/classpath/doc/gjar.1
-93cac536c263d4c94f75fe011d219f27 libjava/classpath/doc/gjarsigner.1
-8a418a99010f0cc7adda21f618d62433 libjava/classpath/doc/gjavah.1
-41f9cbbf7a0329e9e58f7531b6e6d58e libjava/classpath/doc/gjdoc.1
-25dfd043e4ad42a70874ca7eaa7c7576 libjava/classpath/doc/gkeytool.1
-384916dc8f8e2f999ce3a92fc8b620f8 libjava/classpath/doc/gnative2ascii.1
-9f05869a4f2ee199e364dead4bbc2186 libjava/classpath/doc/gorbd.1
-5a7e049f52bdb1a55390424b51bda8c3 libjava/classpath/doc/grmid.1
-077fa87e7b56a0d2d205afb29e7b88e9 libjava/classpath/doc/grmiregistry.1
-3bbda322d57e9d53953d3b7d82dcebc1 libjava/classpath/doc/gserialver.1
-5a0bcf97da9224b9f415d48d095431b5 libjava/classpath/doc/gtnameserv.1
+3b53b8c2b69159094d75733cf63abc48 libjava/classpath/doc/gappletviewer.1
+115cb92b0ffc5a51119f488a13ce566e libjava/classpath/doc/gjar.1
+9e39f569a94ac6ba3fa0155a87350708 libjava/classpath/doc/gjarsigner.1
+d9b29e442a6f0f3fbff7312d391b5b15 libjava/classpath/doc/gjavah.1
+ed73d4a0b361a6f75d37214b4e1473d0 libjava/classpath/doc/gjdoc.1
+9cd43593d014d62c583507bf674ec9f7 libjava/classpath/doc/gkeytool.1
+efd3c4eafb5daffd5570901d687f9366 libjava/classpath/doc/gnative2ascii.1
+c9f9abfad9b9e879f347121011b27481 libjava/classpath/doc/gorbd.1
+d6ec26206a8b4e6f959ae1ca2dc384e1 libjava/classpath/doc/grmid.1
+a7746f2831d24822c3f518c2f44c4989 libjava/classpath/doc/grmiregistry.1
+e90c5489749cf9eec13252c3322472d9 libjava/classpath/doc/gserialver.1
+52cc4c619dc3de17d05718b2c92732ae libjava/classpath/doc/gtnameserv.1
7e4e31659df1c7e815f9151958dceef2 libjava/classpath/doc/texi2pod.pl
01b23c87dcf82048a5958c8224653305 libjava/classpath/doc/texinfo.tex
b1e0c0c30547d57d7a09b04d47c70b06 libjava/classpath/examples/.cvsignore
697ca1de35069bd86456a5a19b9c4f11 libjava/libgcj.ver
184718636f014ef2ca46d62ba8d6c3bf libjava/libgcj_bc.c
e3eda01d9815f8d24aae2dbd89b68b06 libjava/libltdl/COPYING.LIB
-280ac83707eb05cd59d920b5e7af6a6e libjava/libltdl/ChangeLog
+3cde4e147c854a7505649f0c24fcbb14 libjava/libltdl/ChangeLog
349267319e3d55dcf180a20f85394144 libjava/libltdl/Makefile.am
930c6383a37e6cc8e0625c9a281eda95 libjava/libltdl/Makefile.in
36da24f9facf00b349ea10dba3789d92 libjava/libltdl/README
434ac04eb066f5075299583492846410 libjava/verify.cc
355440a0c2fb5e16259d7ae381b37ed5 libjava/win32-threads.cc
434d5e5e91727dec004f0d1d1fab47ec libjava/win32.cc
-13927143527f024eaa30c0c5b9a6b6ad libobjc/ChangeLog
+03a1b5f3b4fd735e510d24f1bee46af0 libobjc/ChangeLog
5b7fbdee280ee8842f0d92c076996a91 libobjc/Makefile.in
e4893352ae160018db798e6ecf5e5378 libobjc/NXConstStr.m
3989d86c4963b58cd68b2584b937e20a libobjc/Object.m
8824087a6da69f8b39bb0b25a8097646 libobjc/sendmsg.c
e6a04cd604bd9234cf63edd367b0d90c libobjc/thr.c
a916467b91076e631dd8edb7424769c7 libquadmath/COPYING.LIB
-2b2c0ccadbb525a55c204dc7f1f1561f libquadmath/ChangeLog
+aabf04a57ae6c00023e007e726360064 libquadmath/ChangeLog
76ca0ca0f1d83d1c11535e45e1044572 libquadmath/Makefile.am
e786ca4a729f6b1b34b37c7d15a02ae5 libquadmath/Makefile.in
4c8b4478a1031d129e7cc6b341876b99 libquadmath/acinclude.m4
a81cc82679e80c86cfbd5575867450d0 libquadmath/strtod/strtod_l.c
da808e110fc09ebd41ebd405790a70df libquadmath/strtod/strtoflt128.c
d15a18f7c46ba2add6148edc5b7563c0 libquadmath/strtod/tens_in_limb.c
-f43703fb95087ae5f6a8ab8a0793339f libsanitizer/ChangeLog
+c02cb224eaa3a464e5510b840b966448 libsanitizer/ChangeLog
0249c37748936faf5b1efd5789587909 libsanitizer/LICENSE.TXT
5c6a385040bdd0ebb0bc0a3498a6f538 libsanitizer/MERGE
8a92cfa8e4db49510b1a78b9b175583d libsanitizer/Makefile.am
2219f17a5c8740755ef8e9831cbaa8fe libsanitizer/ubsan/ubsan_type_hash.h
e3dd09193c7915da7b4966ed821529c1 libsanitizer/ubsan/ubsan_value.cc
b223f4ad4acdcad3f796a2d39e6ff81e libsanitizer/ubsan/ubsan_value.h
-c4385c8d28ba876e17f6242c3e904267 libssp/ChangeLog
+53db63ea57cf4b324d38c8e9f41682a3 libssp/ChangeLog
01d9954c400db04da1b8705029e6d9d9 libssp/Makefile.am
6f9651cc4e77f9e7629b0142b05a90e0 libssp/Makefile.in
8b0dd0c2a8b446bf5577a8562ad19885 libssp/aclocal.m4
e9ab923d2562bf5f5be6883dfb9f0184 libssp/strncpy-chk.c
5e0d8b8a766c31b12354baec1b7a159c libssp/vsnprintf-chk.c
f56ab1f8922a16f7e9e4f5270ae1e34e libssp/vsprintf-chk.c
-1a8f6e700007b6a608009660de48ebc7 libstdc++-v3/ChangeLog
+6b86d49ce89be74236bb5539c0bf3e9a libstdc++-v3/ChangeLog
7aa6c40440a44fcf5ec94c066160c2f8 libstdc++-v3/ChangeLog-1998
7aff86600b6a1ed3fa87305075a92db0 libstdc++-v3/ChangeLog-1999
a6f28e8fc9bb07696a9e068b439a3a87 libstdc++-v3/ChangeLog-2000
1d3eb837e8c17cf0d0ad6d151e8d1777 libstdc++-v3/doc/html/ext/lwg-active.html
68372fa89a0decb4aa5f941df5484129 libstdc++-v3/doc/html/ext/lwg-closed.html
2defa75c6dc8ce9a6f6b775439df3b7c libstdc++-v3/doc/html/ext/lwg-defects.html
-a14649ebd9755de4404f37ba6732487d libstdc++-v3/doc/html/faq.html
+c69ec11cafce0d5c44cae4cd87842360 libstdc++-v3/doc/html/faq.html
1ae70f0bf94464b036515d333fff8ab2 libstdc++-v3/doc/html/images/confdeps.png
d7f63b43e9f4c39cf71de7585de522ee libstdc++-v3/doc/html/images/pbds_balls_and_bins.png
22eedc841676a98f8ae8b95131ac4d7e libstdc++-v3/doc/html/images/pbds_binary_priority_queue_int_push.png
f5a41d4f7585b850b3182fc5f4888f93 libstdc++-v3/doc/xml/book.txml
95d1335e76860d53246f3e400231ec38 libstdc++-v3/doc/xml/chapter.txml
7f8c520dc83013026c671c5c342f73e2 libstdc++-v3/doc/xml/class.txml
-ee2a1b703e1eb8fc3aaac1c05aec6e41 libstdc++-v3/doc/xml/faq.xml
+a017272ecd74d4bd4949fd4ce69b337e libstdc++-v3/doc/xml/faq.xml
0408e04957d20fcb2a1048c482230ec0 libstdc++-v3/doc/xml/gnu/fdl-1.3.xml
df4574d04d7f029398ab0183832017b6 libstdc++-v3/doc/xml/gnu/gpl-3.0.xml
18a6390297702ec8fd75cbcc525d2005 libstdc++-v3/doc/xml/images/confdeps.dot
91203e2a620dcff7176bced04d474d2e libstdc++-v3/include/bits/functional_hash.h
3a5c3b695bc6a8715b2d70e8c2f9f2ff libstdc++-v3/include/bits/gslice.h
b6807699296278224532f23ba4838e6c libstdc++-v3/include/bits/gslice_array.h
-d498eec3bc5ba12914e4497bf436cb00 libstdc++-v3/include/bits/hashtable.h
+a85e548377ccf42ef83ed339308093b9 libstdc++-v3/include/bits/hashtable.h
9700c22307c69c419f5ce1653aa56128 libstdc++-v3/include/bits/hashtable_policy.h
e4a2fdc54d33a55caaa4b27be128f84a libstdc++-v3/include/bits/indirect_array.h
2d1e6e437cad5c97116088dded5da482 libstdc++-v3/include/bits/ios_base.h
ad4740e59e8cbd9ac6b9be2d488a3ff8 libstdc++-v3/include/bits/regex.h
649cb03167606d553e53cbe051581c71 libstdc++-v3/include/bits/regex.tcc
373a94fd87da4362c71ba2d3ac8076ce libstdc++-v3/include/bits/regex_automaton.h
-bd70946861bab70b4d2960a772a42568 libstdc++-v3/include/bits/regex_automaton.tcc
-b5c7637da9dc934e6b3361189c540bc3 libstdc++-v3/include/bits/regex_compiler.h
-6e87e732acdc9f133eedde3cad7fc3f2 libstdc++-v3/include/bits/regex_compiler.tcc
+0e859039cfef2b8e10086955d682f645 libstdc++-v3/include/bits/regex_automaton.tcc
+c9c0486da3c81cb40ea3367cdd91f8c0 libstdc++-v3/include/bits/regex_compiler.h
+4987af0d9f1776172a13cf84b43f55a2 libstdc++-v3/include/bits/regex_compiler.tcc
fcf411de1eb0b855de59fa82d47ed503 libstdc++-v3/include/bits/regex_constants.h
267e61d65dd573a232e4794b8a41c090 libstdc++-v3/include/bits/regex_error.h
87657e7a2c416958809f7ddbeb0340c0 libstdc++-v3/include/bits/regex_executor.h
-4f14def11f42509666af99f46fb8eea0 libstdc++-v3/include/bits/regex_executor.tcc
+d999eb2188ec36f75633f184618ea95f libstdc++-v3/include/bits/regex_executor.tcc
40d92d78e2e4d68bd737a1c39f1e8c9a libstdc++-v3/include/bits/regex_scanner.h
cb07487a8c867ffe44908705172d1d83 libstdc++-v3/include/bits/regex_scanner.tcc
ebd42997721b883b0c545520f6e1923d libstdc++-v3/include/bits/shared_ptr.h
-2c73a21b63642d56430e02d019b9a72c libstdc++-v3/include/bits/shared_ptr_base.h
+73934af07bbc86b6572b24058ba7f506 libstdc++-v3/include/bits/shared_ptr_base.h
6a86488bbca653f3a59bb8fa94b4e8a2 libstdc++-v3/include/bits/slice_array.h
6571ee6b9bcceaf19c56c7480d662850 libstdc++-v3/include/bits/sstream.tcc
6612703d15fae484dd38041011614cd2 libstdc++-v3/include/bits/stl_algo.h
31b2e6563922b13c61f34302db1e0895 libstdc++-v3/include/bits/stl_deque.h
564c232f6a3984a902168c5ed63dee3d libstdc++-v3/include/bits/stl_function.h
e94510088da5bc4e0335075b0964b5a3 libstdc++-v3/include/bits/stl_heap.h
-ef1aefd927cd362719132b6701a0527e libstdc++-v3/include/bits/stl_iterator.h
+18667479413ea2ec58c9d8dd1f83bcfc libstdc++-v3/include/bits/stl_iterator.h
430ba07bbc7a44cc10ce3890ca06a940 libstdc++-v3/include/bits/stl_iterator_base_funcs.h
032892ca6b0d5c74ee60b73ef2a30cf1 libstdc++-v3/include/bits/stl_iterator_base_types.h
a26666e5ba01046b83884d262adef1ca libstdc++-v3/include/bits/stl_list.h
a0088f41806a01bec922402b3eca201c libstdc++-v3/include/bits/stl_set.h
7d7a50c1bcb46613e4ec87b9c376df26 libstdc++-v3/include/bits/stl_stack.h
ba1d780f102f7ce8ebfcb87dd4a48d7b libstdc++-v3/include/bits/stl_tempbuf.h
-a8129e4da6ba88dd94051aa5f64667ed libstdc++-v3/include/bits/stl_tree.h
+cc79503887a370ccd44ef029cca3e47f libstdc++-v3/include/bits/stl_tree.h
8f773b6de66ac394bddf286331b71818 libstdc++-v3/include/bits/stl_uninitialized.h
-5d5c1e9bbf937f39841caaecbd05757f libstdc++-v3/include/bits/stl_vector.h
+647b57eaafb7ef6fa20b9974a21cd063 libstdc++-v3/include/bits/stl_vector.h
4a227ea0bd121a073811a974d1d3f9b9 libstdc++-v3/include/bits/stream_iterator.h
122883005110d85812da6f01829e96e9 libstdc++-v3/include/bits/streambuf.tcc
1c437562e43cf8a7a1f4ba02bb308f04 libstdc++-v3/include/bits/streambuf_iterator.h
918fb95f55f1fe8f78197411d268b5c1 libstdc++-v3/include/bits/valarray_array.h
4a627b9075252068afa8da4696a387fc libstdc++-v3/include/bits/valarray_array.tcc
485a0086425b2772da4e15fd41433c43 libstdc++-v3/include/bits/valarray_before.h
-d7147c7c297fdc86dcf25ab4ef8b0985 libstdc++-v3/include/bits/vector.tcc
+6034ae6655f7418322c7bc1cd98eba08 libstdc++-v3/include/bits/vector.tcc
c2ea3321ad369e72704e3afde6828ecb libstdc++-v3/include/c/cassert
ae6a534cd39eaec2a78f42fcf9df0039 libstdc++-v3/include/c/cctype
a4c5d9b471b21331d7351b5999bb5710 libstdc++-v3/include/c/cerrno
37dcb5505d644050637f490189f58833 libstdc++-v3/include/debug/string
56f3ad660e8300705b324a3f985b90c1 libstdc++-v3/include/debug/unordered_map
5e4e3827840ba1320c7dddbd85f56ebd libstdc++-v3/include/debug/unordered_set
-7c7720a25327cff231296154af94ae1a libstdc++-v3/include/debug/vector
+d9f9a801dbe5afcecb48a69ab8d93f32 libstdc++-v3/include/debug/vector
7e2551d2c2dd7bb997d42a690593b3fa libstdc++-v3/include/decimal/decimal
ac52c8af39627ef083a226df42fc31fb libstdc++-v3/include/decimal/decimal.h
-ef11306e00bcc0f4f269855252b1aeaa libstdc++-v3/include/experimental/optional
+9f57830b191f4bf2721cef3ccf82a697 libstdc++-v3/include/experimental/optional
5c356e2454335ced2476f7f9fdf04cb9 libstdc++-v3/include/experimental/string_view
25ac6a5e2e4bb3f2cc6cc5879b90ca32 libstdc++-v3/include/experimental/string_view.tcc
246337397419fba205fe59ea330ef425 libstdc++-v3/include/ext/algorithm
bdd91fa0453fe14cc18653b7dc6927f2 libstdc++-v3/include/std/deque
99ccf219bea076709ff5aa261b1e2d48 libstdc++-v3/include/std/forward_list
597cc52c077c63f1fdddbfa95c4bdf1f libstdc++-v3/include/std/fstream
-65b7a77990429e2e268f5b68eef98716 libstdc++-v3/include/std/functional
-d2b9b6f47bf0ff9c65becaac4c387c47 libstdc++-v3/include/std/future
-5b5ed5e588d574370e630aa6f1a21944 libstdc++-v3/include/std/iomanip
+7f133f2fc0f513033e8103e64ffbd5c3 libstdc++-v3/include/std/functional
+434b825e2b9a95e812434660bc1b494a libstdc++-v3/include/std/future
+a38fecdc41069d0441185ed2f61289d3 libstdc++-v3/include/std/iomanip
0c0f52522245aad5244a12ae2e638253 libstdc++-v3/include/std/ios
565afcfbf5ba12b6327e4de4d1fd0d2a libstdc++-v3/include/std/iosfwd
-1f149f33d005cdc244261d6cc211a73b libstdc++-v3/include/std/iostream
+50f28b6730969a973497fa9c1985ce0b libstdc++-v3/include/std/iostream
d86206727695677690dd9b76890a4336 libstdc++-v3/include/std/istream
ad8f7a1244f2cf5ed21c08d23c62637a libstdc++-v3/include/std/iterator
cdf2ed2088596d3b05077f5394156082 libstdc++-v3/include/std/limits
d3b6f528148b5a63ee727c016366da87 libstdc++-v3/include/std/string
cb7aa094ede5e41f12cda9a35a0cfb13 libstdc++-v3/include/std/system_error
d72a138145b8c940cb7f3df7af9cb1b1 libstdc++-v3/include/std/thread
-64697bcbc4f5426ee6ea2c644858dc8f libstdc++-v3/include/std/tuple
-ad757c964d01ac611f5409e023630869 libstdc++-v3/include/std/type_traits
+309ae19457bcc8f8a4a30c85e59f5545 libstdc++-v3/include/std/tuple
+b3a20eeb9b198ec90ea8465b308a1af7 libstdc++-v3/include/std/type_traits
c4e55f5325a735f9af1b712745d9ef83 libstdc++-v3/include/std/typeindex
fc58abad3b04bfec654e4e41b8f83040 libstdc++-v3/include/std/unordered_map
388660882b22dab09ead9c3d8311524c libstdc++-v3/include/std/unordered_set
c0aa2ceab1b70d2d95ca2126121c204b libstdc++-v3/include/tr1/utility
c813375cf6045e5a015c25ce62d4caed libstdc++-v3/include/tr1/wchar.h
5ac198e9b27c943cad3e58af9b6356c5 libstdc++-v3/include/tr1/wctype.h
-409fc18729f44c0bcad2687e7fa61b70 libstdc++-v3/include/tr2/bool_set
+1863a97225679f2488dec3f2506f73b0 libstdc++-v3/include/tr2/bool_set
826a3b0c14cb3b8a209ac0c4d45c292a libstdc++-v3/include/tr2/bool_set.tcc
03c8a563c7bd76f4bbb11938a00b733c libstdc++-v3/include/tr2/dynamic_bitset
2dfbc06ac68be638046909b28f216775 libstdc++-v3/include/tr2/dynamic_bitset.tcc
1f0d57eef092baee4784e63a2bd21719 libstdc++-v3/python/hook.in
68b329da9893e34099c7d8ad5cb9c940 libstdc++-v3/python/libstdcxx/__init__.py
68b329da9893e34099c7d8ad5cb9c940 libstdc++-v3/python/libstdcxx/v6/__init__.py
-95073c248e1254cc4b7c8b4ef8dceec7 libstdc++-v3/python/libstdcxx/v6/printers.py
+1b83b0b9896053a8206a076826e33de2 libstdc++-v3/python/libstdcxx/v6/printers.py
b1441422cec6381d9285b7681b666124 libstdc++-v3/scripts/check_compile
533e594add6e79910b0e557ba690fac6 libstdc++-v3/scripts/check_performance
f480e111db2d50194a3e1f7014c9f422 libstdc++-v3/scripts/create_testsuite_files
f1a84a17158780aaa37927191db4463a libstdc++-v3/scripts/gen_includers2.pl
12339b6ead78d7ddd0044dfd0f9f4f92 libstdc++-v3/scripts/make_exports.pl
80b6ff44b325c6b6d113435d8eea4b76 libstdc++-v3/scripts/make_graph.py
-ccbed1ea82cba0214ede86aa0eeeccef libstdc++-v3/scripts/run_doxygen
+93834810d190d1876fdb446dc5857f2f libstdc++-v3/scripts/run_doxygen
884bb3241e8e27e818855184b2f4737f libstdc++-v3/scripts/testsuite_flags.in
90d7fef889bdbbc920e1e38d886660ca libstdc++-v3/src/Makefile.am
b8f8c4f7127e3c67ca5118cc17870b43 libstdc++-v3/src/Makefile.in
ba8260aee97ff53f868d21a956ace200 libstdc++-v3/src/c++98/ios-inst.cc
f4cc74d469720509875160f74fff3aeb libstdc++-v3/src/c++98/ios.cc
33865b886a4fa91608c14b40d0e74673 libstdc++-v3/src/c++98/ios_failure.cc
-566a4281292275362923b6277ad4e566 libstdc++-v3/src/c++98/ios_init.cc
+1edbe2182283a26697c86fbe00cab5f2 libstdc++-v3/src/c++98/ios_init.cc
bf46baae6c5f1da47c22b2c072419379 libstdc++-v3/src/c++98/ios_locale.cc
ac80c7ec5c0a615662b28990e1094eeb libstdc++-v3/src/c++98/iostream-inst.cc
e057f7cce50ac3eba93348a0a06364fe libstdc++-v3/src/c++98/istream-inst.cc
da58a1733a65d67b0138286442f488ce libstdc++-v3/testsuite/20_util/decay/requirements/typedefs-2.cc
1c461b2c7969a95c1981fe59a3c396d7 libstdc++-v3/testsuite/20_util/decay/requirements/typedefs.cc
67675b70d7a9436cad86d77a166c6743 libstdc++-v3/testsuite/20_util/declval/requirements/1.cc
-014f87188021138d3fca7da91195f25b libstdc++-v3/testsuite/20_util/declval/requirements/1_neg.cc
+4e8590e176037588c370a2ae3125de83 libstdc++-v3/testsuite/20_util/declval/requirements/1_neg.cc
fad094d30df0973bbae4de357b71339f libstdc++-v3/testsuite/20_util/default_delete/48631_neg.cc
7595192fc239be876d23e6853d014bc6 libstdc++-v3/testsuite/20_util/default_delete/cons/constexpr.cc
88702bac0b1a9d40044560c70fcb3d64 libstdc++-v3/testsuite/20_util/default_delete/void_neg.cc
d9ab7a7f1b9b6b6acfc774735e8ae71d libstdc++-v3/testsuite/20_util/function/5.cc
5ff95a9327494e5fd5a7bb9548a8f4ed libstdc++-v3/testsuite/20_util/function/58569.cc
9e3c0cf22572df7b8cfad07710c111c9 libstdc++-v3/testsuite/20_util/function/6.cc
+fabfe76dc30b13e696bbaf0d3da99caf libstdc++-v3/testsuite/20_util/function/60594.cc
0366f931515bb0f27522d8f32613581b libstdc++-v3/testsuite/20_util/function/7.cc
9ace4aecb05784929a870023e72fa190 libstdc++-v3/testsuite/20_util/function/8.cc
9a4341f79b42e1f66f3258b878bc6cd5 libstdc++-v3/testsuite/20_util/function/9.cc
93f64ae5b11e2ef81b90d83ad6fa599d libstdc++-v3/testsuite/20_util/is_volatile/requirements/typedefs.cc
74dedb0d3fe0b7f74a64bcbb6c27687c libstdc++-v3/testsuite/20_util/is_volatile/value.cc
1a5b84229d8b958ab58228ec8aed383f libstdc++-v3/testsuite/20_util/make_signed/requirements/explicit_instantiation.cc
-67ad8c96d3340164fa61a11e3525d32a libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs-1.cc
-47ea48d675533175f5dd90261459f687 libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs-2.cc
+93a28511ca80a4ab934ab1ee75e8da26 libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs-1.cc
+453060e5a140ac4d00d0778f5563384d libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs-2.cc
7c9fee49549fbd106a03c68f6bc2f535 libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs-3.cc
-a4e5ca35f5d43b19cb9a556fe7d75858 libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs_neg.cc
+858096e31333568b2fb89852b8d0548f libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs-4.cc
+12b329b0322d1a9a94cbb89dc2ee4a91 libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs_neg.cc
101ce647b6cbe6cdb1e2470e3f2df996 libstdc++-v3/testsuite/20_util/make_unsigned/requirements/explicit_instantiation.cc
-552824da455eaf0fec634cb58888b9a8 libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs-1.cc
-3b59b2758f4c2c3e1f0415810f1921dd libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs-2.cc
+67019f2db5c8b8f0c0da6e6f1a21cc9d libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs-1.cc
+642a17c6cf8993d24dfbc054f50724ec libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs-2.cc
c9ec1269f88911267709a4b143fb0cb9 libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs-3.cc
-56378cf510e8f72ec07c806ce1d4705c libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc
+b61109ad287ad3c78df29934e9941e02 libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc
d37a7bb283bf94ade6ce11e3e7f3efc2 libstdc++-v3/testsuite/20_util/move/1.cc
94459598aa0d15ed5349e0514011cbf4 libstdc++-v3/testsuite/20_util/move/requirements/explicit_instantiation.cc
8b6cc534bce6a36ed392ffa4bc840f2f libstdc++-v3/testsuite/20_util/move_if_noexcept/1.cc
5d0781c37d398f45d346557df8346d0a libstdc++-v3/testsuite/20_util/shared_ptr/cons/55123.cc
72be9b573ae9730908ba49362a208f32 libstdc++-v3/testsuite/20_util/shared_ptr/cons/58659.cc
e47350c38a5a123564392ac3d8070833 libstdc++-v3/testsuite/20_util/shared_ptr/cons/58839.cc
+18099d5eb630735b727ff66874b6b79a libstdc++-v3/testsuite/20_util/shared_ptr/cons/61036.cc
56294d2ef9d9d9fd6f7c992ac3c7abff libstdc++-v3/testsuite/20_util/shared_ptr/cons/alias.cc
a07139730396a79913c3fc0485af03cc libstdc++-v3/testsuite/20_util/shared_ptr/cons/alloc.cc
9ae93bfe04caf93a462c94cca031dfb6 libstdc++-v3/testsuite/20_util/shared_ptr/cons/alloc_min.cc
27943d64279528f9141bfe71482464d4 libstdc++-v3/testsuite/20_util/tuple/48476.cc
04b82209ed6c0210db27506ad3187c7e libstdc++-v3/testsuite/20_util/tuple/51365.cc
c54af389d65573764200bfb0b3597473 libstdc++-v3/testsuite/20_util/tuple/53648.cc
+073f9c2ec2806d897dd09a059663bb00 libstdc++-v3/testsuite/20_util/tuple/60497.cc
ee9b755981731038f237341ae8a7dc3f libstdc++-v3/testsuite/20_util/tuple/comparison_operators/35480_neg.cc
87df08a010e0029b0c82f3c2bac6d87e libstdc++-v3/testsuite/20_util/tuple/comparison_operators/comparisons.cc
9a077a11db7228f699befe4f0726869a libstdc++-v3/testsuite/20_util/tuple/comparison_operators/constexpr.cc
2f22ce23afcfa03f328a20dc01644cef libstdc++-v3/testsuite/20_util/tuple/element_access/get.cc
85e7acd70fe1e294191b94bf834edc71 libstdc++-v3/testsuite/20_util/tuple/element_access/get2.cc
c546df3b4ba74ac64a0cb4ea57c630d6 libstdc++-v3/testsuite/20_util/tuple/element_access/get2_by_type.cc
-47d52c21660355a1a72bdd9469f1a6e7 libstdc++-v3/testsuite/20_util/tuple/element_access/get_by_type.cc
+3a1e22c8198a01dfad8bda84c438db27 libstdc++-v3/testsuite/20_util/tuple/element_access/get_by_type.cc
fad4ad5ad40bf44ea48788d9a6dab764 libstdc++-v3/testsuite/20_util/tuple/moveable.cc
6eaa1af34a5882c3de54ba11243799e0 libstdc++-v3/testsuite/20_util/tuple/moveable2.cc
6d5abe1c79608785a6a722e8fdc802c5 libstdc++-v3/testsuite/20_util/tuple/noexcept_move_assign.cc
e1eea1c271af0bdfa12cc94693ef107b libstdc++-v3/testsuite/20_util/tuple/requirements/dr801.cc
3f8ef4dac6a2e28913a495f5c2823e5f libstdc++-v3/testsuite/20_util/tuple/requirements/explicit_instantiation.cc
0fbf39466f47e927efc63b5fe8acf2d6 libstdc++-v3/testsuite/20_util/tuple/swap.cc
-9b6ff386dab421e6c403a91cfcbcf2fc libstdc++-v3/testsuite/20_util/tuple/tuple_element.cc
+2ddb2960845b7e1c69f2282968ca53aa libstdc++-v3/testsuite/20_util/tuple/tuple_element.cc
+8d5defa9ea9654930802511fbb97e9f1 libstdc++-v3/testsuite/20_util/tuple/tuple_element_t.cc
f0e73cece5252f9d8ced5f133fe2f45a libstdc++-v3/testsuite/20_util/tuple/tuple_size.cc
04d1024415682274ef59af1d5ba80f8f libstdc++-v3/testsuite/20_util/typeindex/comparison_operators.cc
9b7c3ebe2b60022fc39b43722bfc2e27 libstdc++-v3/testsuite/20_util/typeindex/hash.cc
eac021f82238b0e7f88b2f6f300962ca libstdc++-v3/testsuite/23_containers/set/allocator/swap.cc
44177aa990428b2a07f4cad36608b16b libstdc++-v3/testsuite/23_containers/set/capacity/29134.cc
cdc1c5cbfb547b78c021908f817445fe libstdc++-v3/testsuite/23_containers/set/check_construct_destroy.cc
+479cc77c5e25439c4361e2f6436d46c2 libstdc++-v3/testsuite/23_containers/set/cons/61023.cc
2c40c028cc84603b5d0823e47d5d0fa6 libstdc++-v3/testsuite/23_containers/set/cons/moveable.cc
8140074ed960ac4091fb63b0076ebc32 libstdc++-v3/testsuite/23_containers/set/cons/noexcept_move_construct.cc
a95e300c8c185b4d18f769fa8ffe8fdb libstdc++-v3/testsuite/23_containers/set/debug/60499.cc
f355739fd5282b5e4cff2b750cc2b3f6 libstdc++-v3/testsuite/23_containers/unordered_set/56267-2.cc
751a41d0c6826ff745486c3f3f0114b1 libstdc++-v3/testsuite/23_containers/unordered_set/56267.cc
0c97f4ca00fc977c8df9f9f5e83a8425 libstdc++-v3/testsuite/23_containers/unordered_set/56278.cc
+f3eebd181caa96b0b79cab436f550bc5 libstdc++-v3/testsuite/23_containers/unordered_set/61143.cc
b3b8ace808ed88c6a64ae34b1c650a84 libstdc++-v3/testsuite/23_containers/unordered_set/allocator/copy.cc
b0386447adbcdf3090a1b90341ef1d92 libstdc++-v3/testsuite/23_containers/unordered_set/allocator/copy_assign.cc
10ede91f68fad662234a9b53b1c3d111 libstdc++-v3/testsuite/23_containers/unordered_set/allocator/ext_ptr.cc
fff6e388e4734b3c3d9dcf019bbacdf6 libstdc++-v3/testsuite/23_containers/unordered_set/max_load_factor/robustness.cc
5377ed3668c63ebeb73c3ec8b1349715 libstdc++-v3/testsuite/23_containers/unordered_set/modifiers/emplace.cc
4686a793393ae777cc39a9aa59354e50 libstdc++-v3/testsuite/23_containers/unordered_set/modifiers/reserve.cc
+d5b8c10b8ae6dc5045ac01bb72b91e8e libstdc++-v3/testsuite/23_containers/unordered_set/modifiers/swap.cc
c0796bb1da03355f73b0328094814cef libstdc++-v3/testsuite/23_containers/unordered_set/observers.cc
471ddaa70ea98740aba436165883a83d libstdc++-v3/testsuite/23_containers/unordered_set/operations/count.cc
17a65bbd19b5fe478cf223e5b535da2a libstdc++-v3/testsuite/23_containers/unordered_set/operators/1.cc
4f335d323864b5be5299555c2912e8ac libstdc++-v3/testsuite/23_containers/vector/range_access.cc
9174c8b0a88b51a0557c382440e6823d libstdc++-v3/testsuite/23_containers/vector/requirements/citerators.cc
8606495410696a122546bcc697746c3c libstdc++-v3/testsuite/23_containers/vector/requirements/do_the_right_thing.cc
-167bb655cddee4f8d02062168dd75224 libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/assign_neg.cc
+bb8b1982b6ef069f872670de22921d72 libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/assign_neg.cc
97df37bb365cecef0333fd25b4e35c5c libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor.cc
-4f34ac09baa2df97864f0e72bee2849c libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc
-5742effad2a53f90eef6f9d5d5217265 libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc
-729c67193e8e356623b22cc821fec6da libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/insert_neg.cc
+b6b83ff4d8d1a5673351a5b066713cc2 libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc
+15dac0a181dd7f47fb11cfaf934e3a30 libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc
+0009af600ea619b6d63bffcc4d8f9748 libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/insert_neg.cc
7b0f44a8fc2116e762a4e07fd3133016 libstdc++-v3/testsuite/23_containers/vector/requirements/exception/basic.cc
941bc15e59f223786bada67caf743f9b libstdc++-v3/testsuite/23_containers/vector/requirements/exception/generation_prohibited.cc
39fe176070e9aa0d1fd59dfdb0878d89 libstdc++-v3/testsuite/23_containers/vector/requirements/exception/propagation_consistent.cc
6ab7a2d201c7d619833ab350ce113bb1 libstdc++-v3/testsuite/27_io/manipulators/standard/char/1.cc
0726e30b174aa3a887475a63dbe3df35 libstdc++-v3/testsuite/27_io/manipulators/standard/char/2.cc
21fcc9ddfe2fe463b9b484d87a7e225d libstdc++-v3/testsuite/27_io/manipulators/standard/char/60270.cc
+d594f3a267d4ac9ab043350e29831e75 libstdc++-v3/testsuite/27_io/manipulators/standard/char/dr2344.cc
8a9646bfe28fe9f78cd3787e9d650bc2 libstdc++-v3/testsuite/27_io/manipulators/standard/char/quoted.cc
f643bb61586dbb7c5cc216ebc29fbf64 libstdc++-v3/testsuite/27_io/manipulators/standard/wchar_t/1.cc
b0ecb2cec0bcf82632ae8330788d5b61 libstdc++-v3/testsuite/27_io/manipulators/standard/wchar_t/2.cc
+f55dd343fe2fba114349521a12652ac1 libstdc++-v3/testsuite/27_io/manipulators/standard/wchar_t/dr2344.cc
be4b141e6cdea93542fd9e4372e26f8f libstdc++-v3/testsuite/27_io/manipulators/standard/wchar_t/quoted.cc
a2cf3b8be9bd7b5c38092c26e2d1e876 libstdc++-v3/testsuite/27_io/objects/char/1.cc
fa16fa378e7cffe247d469d655fbb5b1 libstdc++-v3/testsuite/27_io/objects/char/10.cc
a8df08852135acfce31d7a69db7f20b3 libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/empty_range.cc
3934c0e8f097df26fe8421823b2952f0 libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/emptygroup.cc
f5caf57c85d0af0655b9e9c34cdd23bc libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/hex.cc
-5b401195d44d55aebac71bf80adc082f libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/quoted_char.cc
+cdd7e0324974a5d0d5116da659ed800b libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/quoted_char.cc
8a668015379b5d9e9c1374a53cbccaac libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/char/ungreedy.cc
34e54e012d1d79924b40cdb315a32794 libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/wchar_t/anymatcher.cc
c1ae504cc9233e3c0daa81baf286585e libstdc++-v3/testsuite/28_regex/algorithms/regex_match/ecma/wchar_t/cjk_match.cc
01685e9c20e2ae406bafcdeeeefc5719 libstdc++-v3/testsuite/28_regex/basic_regex/ctors/wchar_t/cstring.cc
d824e53ce1939f8587cebbca54759720 libstdc++-v3/testsuite/28_regex/basic_regex/ctors/wchar_t/default.cc
85f564a600e93544299a72e6944e3177 libstdc++-v3/testsuite/28_regex/basic_regex/ctors/wchar_t/range.cc
-464ecdda18418ae9b8eaf4f79127738b libstdc++-v3/testsuite/28_regex/basic_regex/multiple_quantifiers.cc
+7bcf78193be501772a8c1c55956d6ca6 libstdc++-v3/testsuite/28_regex/basic_regex/multiple_quantifiers.cc
5548ee8b630713e272673e09354fd60b libstdc++-v3/testsuite/28_regex/basic_regex/requirements/constexpr_data.cc
f3879155319951e3adcbdfa05a6982c7 libstdc++-v3/testsuite/28_regex/constants/error_type.cc
bcfe26ae804ab98295dcc5a24fda7d24 libstdc++-v3/testsuite/28_regex/constants/match_flag_type.cc
c3336e722be06e779e372392b0ef468f libstdc++-v3/testsuite/30_threads/packaged_task/members/valid.cc
01c9012beb48a8b5c0cc3a8928d9f3a2 libstdc++-v3/testsuite/30_threads/packaged_task/requirements/explicit_instantiation.cc
e95eb39d1d21934965a32f7de5b94c7c libstdc++-v3/testsuite/30_threads/packaged_task/uses_allocator.cc
+223c704e5a1c2639ce17491cb9b88ae7 libstdc++-v3/testsuite/30_threads/promise/60966.cc
43042e64d6224c1400056bc87ef51eb3 libstdc++-v3/testsuite/30_threads/promise/cons/1.cc
5a723b6e74dc2bc01255b69e36bea825 libstdc++-v3/testsuite/30_threads/promise/cons/alloc.cc
bf9566d4d69598700ae44d1f0c1e0a15 libstdc++-v3/testsuite/30_threads/promise/cons/alloc2.cc
bc6f0c361b3eb9651d818c2e0e645499 libstdc++-v3/testsuite/experimental/optional/observers/3.cc
51b90f804430db44b2dda8253d9b7692 libstdc++-v3/testsuite/experimental/optional/observers/4.cc
a59061cab533dab4faf31c5c7ab1d6ad libstdc++-v3/testsuite/experimental/optional/observers/5.cc
-c5f9c364199476e9fa303488156af366 libstdc++-v3/testsuite/experimental/optional/relops/1.cc
-4aacc81f47fb92960fb5faf60141e2e0 libstdc++-v3/testsuite/experimental/optional/relops/2.cc
-ceeeeac7654c3e1a806227ab531e3ee4 libstdc++-v3/testsuite/experimental/optional/relops/3.cc
-0046058c67bcf8a3898a782d86c898ea libstdc++-v3/testsuite/experimental/optional/relops/4.cc
-5ab41e00c91ba3b5f2983d83e072c294 libstdc++-v3/testsuite/experimental/optional/relops/5.cc
-e173488a7d91c6b92176cbe138566d23 libstdc++-v3/testsuite/experimental/optional/relops/6.cc
+7607163a58c7bf235533be7ce1f017b4 libstdc++-v3/testsuite/experimental/optional/relops/1.cc
+af8d68158b6bfe925afefc615fb0930a libstdc++-v3/testsuite/experimental/optional/relops/2.cc
+868ada806d159763660651740db597dd libstdc++-v3/testsuite/experimental/optional/relops/3.cc
+dc55fb894f1c03adba1041a6f273b249 libstdc++-v3/testsuite/experimental/optional/relops/4.cc
+090cba6677d1fea9a9f85fe0893724f3 libstdc++-v3/testsuite/experimental/optional/relops/5.cc
+8e69c348f95d204b190c6b1e1073912d libstdc++-v3/testsuite/experimental/optional/relops/6.cc
ffca06999dc2f2773d1d0ba023ea0eb2 libstdc++-v3/testsuite/experimental/optional/requirements.cc
665098ee916ad79f901d0b111d04524b libstdc++-v3/testsuite/experimental/optional/swap/1.cc
c5dc3eec5ce8007b0241cdcf55577dd5 libstdc++-v3/testsuite/experimental/string_view/capacity/1.cc
16ad995556bb1fb21842b84da10bc99c libstdc++-v3/testsuite/libstdc++-prettyprinters/debug.cc
b446ff0e9a95b28827a74d7cf33c1a2a libstdc++-v3/testsuite/libstdc++-prettyprinters/prettyprinters.exp
e5420a74cf55910e3f538d2b656fea8d libstdc++-v3/testsuite/libstdc++-prettyprinters/shared_ptr.cc
-13a710151699b2217a16079a0543a1e4 libstdc++-v3/testsuite/libstdc++-prettyprinters/simple.cc
+256a25db337bc4a096a88295c99baaae libstdc++-v3/testsuite/libstdc++-prettyprinters/simple.cc
+544702e55c214c943e924806b911f7b9 libstdc++-v3/testsuite/libstdc++-prettyprinters/simple11.cc
8914aa851af0c6a50497c3ba1a6a450e libstdc++-v3/testsuite/libstdc++-prettyprinters/tr1.cc
b7a630188c64c6cddbac76f48ceb3935 libstdc++-v3/testsuite/libstdc++-prettyprinters/whatis.cc
ef0d22637757cfcc1ca687b6d57d9a29 libstdc++-v3/testsuite/performance/21_strings/append-1.cc
e10d3cdddd0f53096227a5beb8dcd757 libstdc++-v3/testsuite/util/thread/all.h
18097d974d6f6a830c12c42592f0006d libtool-ldflags
3bb1de19ee64b1073f3d23d9a410b743 libtool.m4
-a81b8ec28f72325f391d24fa0122837b libvtv/ChangeLog
+0f8b7f26c46d05ed2b5f38d9fcd120c1 libvtv/ChangeLog
eef62b8fb153928c0a2c4a0578c942c0 libvtv/Makefile.am
6450c2f34e817a27b51c21ac0bd1cb6f libvtv/Makefile.in
4ce86f8604e6c86211a4cb2025ffc53e libvtv/acinclude.m4
5ddbd6d7662cb8cab972934da6561160 libvtv/vtv_utils.h
247597a3fcc5b5aa8bd923351c59d853 ltgcc.m4
4e65f2f6a05f5eca82ba79c6363aa3db ltmain.sh
-1270d93c3036a8d13b29e645e3112cfa lto-plugin/ChangeLog
+480a1e32fdbf26c9a90a8c5c24762161 lto-plugin/ChangeLog
4c40915b9f88608e518913005264f8fa lto-plugin/Makefile.am
e4afd16e3532d984448f0ca8ba8c3833 lto-plugin/Makefile.in
e0b6c77fa2326a08aa2d7a69e87e0f8c lto-plugin/aclocal.m4
e8d8e3dc8d2e134b03f22c7c567d030c lto-plugin/config.h.in
-b3f728672dbcbbf1207e6726769c9e55 lto-plugin/configure
-4b2d94ee477bdeb4963f60145713eb8a lto-plugin/configure.ac
+8a06a8b8a4ff79121337ebc6a7436458 lto-plugin/configure
+3e586084a6038d0f1df6d9ed4f2c4ee2 lto-plugin/configure.ac
5c23239009f0c6a206ed13799bd5f284 lto-plugin/lto-plugin.c
139179f8500d6f092a4f53d8f4da7f5c lto-plugin/lto-symtab.c
dee72a6a60e99528b0d17bf3ff9a1e15 ltoptions.m4
bc2f6032c98896249eadb56177c7d357 ltsugar.m4
c30cd33c496505f13d9fbdb6970c7c33 ltversion.m4
293853a13b7e218e3a4342cf85fbbf25 lt~obsolete.m4
-310996e85318ea77013088b4bd1ab21e maintainer-scripts/ChangeLog
+d84ab836d266bd10145007e79ed5e6f8 maintainer-scripts/ChangeLog
33c7bc2d2c55956dfac85a05d8a80eff maintainer-scripts/README
a3cc7e22d2016063d76bfc42361ab230 maintainer-scripts/crontab
6facef54b1f26f6ee5d58aef536e7c82 maintainer-scripts/gcc_release
cf2baa0854f564a7785307e79f155efc symlink-tree
69678e72941d681665c3731bfb3044ab ylwrap
ed77bd1cb8611c7e07d54332abbbb44a zlib/CMakeLists.txt
-00f7b875e62076d360ee8c76df3a143a zlib/ChangeLog
+9c4a0d1e3929379aaf51f841e669a980 zlib/ChangeLog
e7a1201f311d2ce7a5fc5e7eb763fe07 zlib/ChangeLog.gcj
b7a1991f01daea3efe108a215c5514a5 zlib/FAQ
3b6b6f9e88f2319b75e6ccb8c2823b13 zlib/INDEX
http://gcc.gnu.org/gcc-4.9/index.html
GCC 4.9 Release Series
- April 22, 2014
+ July 16, 2014
The [1]GNU project and the GCC developers are pleased to announce the
- release of GCC 4.9.0.
+ release of GCC 4.9.1.
- This release is a major release, containing new features (as well as
- many other improvements) relative to GCC 4.8.x.
+ This release is a bug-fix release, containing fixes for regressions in
+ GCC 4.9.0 relative to previous releases of GCC.
Release History
+ GCC 4.9.1
+ July 16, 2014 ([2]changes, [3]documentation)
+
GCC 4.9.0
- April 22, 2014 ([2]changes, [3]documentation)
+ April 22, 2014 ([4]changes, [5]documentation)
References and Acknowledgements
supports several other languages aside from C, it now stands for the
GNU Compiler Collection.
- A list of [4]successful builds is updated as new information becomes
+ A list of [6]successful builds is updated as new information becomes
available.
The GCC developers would like to thank the numerous people that have
contributed new features, improvements, bug fixes, and other changes as
- well as test results to GCC. This [5]amazing group of volunteers is
+ well as test results to GCC. This [7]amazing group of volunteers is
what makes GCC successful.
- For additional information about GCC please refer to the [6]GCC project
- web site or contact the [7]GCC development mailing list.
+ For additional information about GCC please refer to the [8]GCC project
+ web site or contact the [9]GCC development mailing list.
- To obtain GCC please use [8]our mirror sites or [9]our SVN server.
+ To obtain GCC please use [10]our mirror sites or [11]our SVN server.
For questions related to the use of GCC, please consult these web
- pages and the [10]GCC manuals. If that fails, the
- [11]gcc-help@gcc.gnu.org mailing list might help. Comments on these
+ pages and the [12]GCC manuals. If that fails, the
+ [13]gcc-help@gcc.gnu.org mailing list might help. Comments on these
web pages and the development of GCC are welcome on our developer
- list at [12]gcc@gcc.gnu.org. All of [13]our lists have public
+ list at [14]gcc@gcc.gnu.org. All of [15]our lists have public
archives.
- Copyright (C) [14]Free Software Foundation, Inc. Verbatim copying and
+ Copyright (C) [16]Free Software Foundation, Inc. Verbatim copying and
distribution of this entire article is permitted in any medium,
provided this notice is preserved.
- These pages are [15]maintained by the GCC team. Last modified
- 2014-04-22[16].
+ These pages are [17]maintained by the GCC team. Last modified
+ 2014-07-16[18].
References
1. http://www.gnu.org/
2. http://gcc.gnu.org/gcc-4.9/changes.html
- 3. http://gcc.gnu.org/onlinedocs/4.9.0/
- 4. http://gcc.gnu.org/gcc-4.9/buildstat.html
- 5. http://gcc.gnu.org/onlinedocs/gcc/Contributors.html
- 6. http://gcc.gnu.org/index.html
- 7. mailto:gcc@gcc.gnu.org
- 8. http://gcc.gnu.org/mirrors.html
- 9. http://gcc.gnu.org/svn.html
- 10. http://gcc.gnu.org/onlinedocs/
- 11. mailto:gcc-help@gcc.gnu.org
- 12. mailto:gcc@gcc.gnu.org
- 13. http://gcc.gnu.org/lists.html
- 14. http://www.fsf.org/
- 15. http://gcc.gnu.org/about.html
- 16. http://validator.w3.org/check/referer
+ 3. http://gcc.gnu.org/onlinedocs/4.9.1/
+ 4. http://gcc.gnu.org/gcc-4.9/changes.html
+ 5. https://gcc.gnu.org/onlinedocs/4.9.0/
+ 6. http://gcc.gnu.org/gcc-4.9/buildstat.html
+ 7. https://gcc.gnu.org/onlinedocs/gcc/Contributors.html
+ 8. http://gcc.gnu.org/index.html
+ 9. mailto:gcc@gcc.gnu.org
+ 10. http://gcc.gnu.org/mirrors.html
+ 11. http://gcc.gnu.org/svn.html
+ 12. https://gcc.gnu.org/onlinedocs/
+ 13. mailto:gcc-help@gcc.gnu.org
+ 14. mailto:gcc@gcc.gnu.org
+ 15. https://gcc.gnu.org/lists.html
+ 16. http://www.fsf.org/
+ 17. https://gcc.gnu.org/about.html
+ 18. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-4.9/changes.html
GCC 4.9 Release Series
architectures have been obsoleted:
+ Solaris 9 (*-*-solaris2.9). Details can be found in the
[1]announcement.
+ * On AArch64, the singleton vector types int64x1_t, uint64x1_t and
+ float64x1_t exported by arm_neon.h are defined to be the same as
+ their base types. This results in incorrect application of
+ parameter passing rules to arguments of types int64x1_t and
+ uint64x1_t, with respect to the AAPCS64 ABI specification. In
+ addition, names of C++ functions with parameters of these types
+ (including float64x1_t) are not mangled correctly. The current
+ typedef declarations also unintentionally allow implicit casting
+ between singleton vector types and their base types. These issues
+ will be resolved in a near future release. See [2]PR60825 for more
+ information.
More information on porting to GCC 4.9 from previous versions of GCC
- can be found in the [2]porting guide for this release.
+ can be found in the [3]porting guide for this release.
General Optimizer Improvements
improving overall memory usage at link time.
+ C++ hidden keyed methods can now be optimized out.
+ When using a linker plugin, compiling with the -flto option
- now generates slim objects files (.o) which only contain
+ now generates slim object files (.o) which only contain
intermediate language representation for LTO. Use
-ffat-lto-objects to create files which contain additionally
the object code. To generate static libraries suitable for LTO
processing, use gcc-ar and gcc-ranlib; to list symbols from a
- slim object file use gcc-nm. (Requires that ar, ranlib and nm
- have been compiled with plugin support.)
+ slim object file use gcc-nm. (This requires that ar, ranlib
+ and nm have been compiled with plugin support.)
Memory usage building Firefox with debug enabled was reduced from
15GB to 3.5GB; link time from 1700 seconds to 350 seconds.
* Inter-procedural optimization improvements:
New Languages and Language specific improvements
- * Version 4.0 of the [3]OpenMP specification is now supported for the
- C and C++ compilers. The new -fopenmp-simd option can be used to
+ * Version 4.0 of the [4]OpenMP specification is now supported in the
+ C and C++ compilers and starting with the 4.9.1 release also in the
+ Fortran compiler. The new -fopenmp-simd option can be used to
enable OpenMP's SIMD directives, while ignoring other OpenMP
- directives. The new [4]-fsimd-cost-model= option permits to tune
+ directives. The new [5]-fsimd-cost-model= option permits to tune
the vectorization cost model for loops annotated with OpenMP and
Cilk Plus simd directives; -Wopenmp-simd warns when the current
costmodel overrides simd directives set by the user.
C family
* Support for colorizing diagnostics emitted by GCC has been added.
- The [5]-fdiagnostics-color=auto will enable it when outputting to
+ The [6]-fdiagnostics-color=auto will enable it when outputting to
terminals, -fdiagnostics-color=always unconditionally. The
GCC_COLORS environment variable can be used to customize the colors
or disable coloring. If GCC_COLORS variable is present in the
test.C:2:46: error: incomplete type `X<100>' used in nested name specifier
- * With the new [6]#pragma GCC ivdep, the user can assert that there
+ * With the new [7]#pragma GCC ivdep, the user can assert that there
are no loop-carried dependencies which would prevent concurrent
execution of consecutive iterations using SIMD (single instruction
multiple data) instructions.
- * Support for [7]Cilk Plus has been added and can be enabled with the
+ * Support for [8]Cilk Plus has been added and can be enabled with the
-fcilkplus option. Cilk Plus is an extension to the C and C++
languages to support data and task parallelism. The present
implementation follows ABI version 1.2; all features but _Cilk_for
C++
- * The G++ implementation of [8]C++1y return type deduction for normal
- functions has been updated to conform to [9]N3638, the proposal
+ * The G++ implementation of [9]C++1y return type deduction for normal
+ functions has been updated to conform to [10]N3638, the proposal
accepted into the working paper. Most notably, it adds
decltype(auto) for getting decltype semantics rather than the
template argument deduction semantics of plain auto:
auto i1 = f(); // int
decltype(auto) i2 = f(); // int&
- * G++ supports [10]C++1y lambda capture initializers:
+ * G++ supports [11]C++1y lambda capture initializers:
[x = 42]{ ... };
Actually, they have been accepted since GCC 4.5, but now the
compiler doesn't warn about them with -std=c++1y, and supports
parenthesized and brace-enclosed initializers as well.
- * G++ supports [11]C++1y variable length arrays. G++ has supported
+ * G++ supports [12]C++1y variable length arrays. G++ has supported
GNU/C99-style VLAs for a long time, but now additionally supports
initializers and lambda capture by reference. In C++1y mode G++
will complain about VLA uses that are not permitted by the draft
&a; // error, taking address of VLA
}
- * G++ supports the [12]C++1y [[deprecated]] attribute modulo bugs in
+ * G++ supports the [13]C++1y [[deprecated]] attribute modulo bugs in
the underlying [[gnu::deprecated]] attribute. Classes and functions
can be marked deprecated and a diagnostic message added:
int j = bar(2); // warning: 'int bar(int)' is deprecated : bar is unsafe; use fo
o() instead
- * G++ supports [13]C++1y digit separators. Long numeric literals can
+ * G++ supports [14]C++1y digit separators. Long numeric literals can
be subdivided with a single quote ' to enhance readability:
int i = 1048576;
double x = 1.602'176'565e-19;
double y = 1.602'176'565e-1'9;
- * G++ supports [14]C++1y polymorphic lambdas.
+ * G++ supports [15]C++1y generic (polymorphic) lambdas.
// a functional object that will increment any type
auto incr = [](auto x) { return x++; };
+ * As a GNU extension, G++ supports explicit template parameter syntax
+ for generic lambdas. This can be combined in the expected way with
+ the standard auto syntax.
+
+// a functional object that will add two like-type objects
+auto add = [] <typename T> (T a, T b) { return a + b; };
+
+ * G++ supports unconstrained generic functions as specified by
+ S:4.1.2 and S:5.1.1 of [16]N3889: Concepts Lite Specification.
+ Briefly, auto may be used as a type-specifier in a parameter
+ declaration of any function declarator in order to introduce an
+ implicit function template parameter, akin to generic lambdas.
+
+// the following two function declarations are equivalent
+auto incr(auto x) { return x++; }
+template <typename T>
+auto incr(T x) { return x++; }
+
Runtime Library (libstdc++)
- * [15]Improved support for C++11, including:
+ * [17]Improved support for C++11, including:
+ support for <regex>;
+ The associative containers in <map> and <set> and the
unordered associative containers in <unordered_map> and
<unordered_set> meet the allocator-aware container
requirements;
- * [16]Improved experimental support for the upcoming ISO C++
+ * [18]Improved experimental support for the upcoming ISO C++
standard, C++14, including:
+ fixing constexpr member functions without const;
+ implementation of the std::exchange() utility function;
+ Module files: The version of the module files (.mod) has been
incremented; additionally, module files are now compressed.
Fortran MODULEs compiled by earlier GCC versions have to be
- recompiled, when they are USEd by files compiled with GCC 4.9,
- because GCC 4.9 is not able to read .mod files of earlier GCC
+ recompiled, when they are USEd by files compiled with GCC 4.9.
+ GCC 4.9 is not able to read .mod files of earlier GCC
versions; attempting to do so gives an error message. Note:
The ABI of the produced assembler data itself has not changed:
- object files and libraries are fully compatible to older
- versions. (Except for the next items.)
+ object files and libraries are fully compatible with older
+ versions (except as stated below).
+ ABI changes:
- o Note that the [17]argument passing ABI has changed for
- scalar dummy arguments of type INTEGER, REAL, COMPLEX and
- LOGICAL, which have both the VALUE and the OPTIONAL
- attribute.
- o Due to the support of finalization, the virtual table
- associated with polymorphic variables has changed.
- Therefore, code containing CLASS should be recompiled,
- including all files which define derived types involved
- in the type definition used by polymorphic variables.
- (Note: Due to the incremented module version, trying to
- mix old code with new code will usually give an error
- message.)
+ o The [19]argument passing ABI has changed for scalar dummy
+ arguments of type INTEGER, REAL, COMPLEX and LOGICAL,
+ which have both the VALUE and the OPTIONAL attributes.
+ o To support finalization the virtual table associated with
+ polymorphic variables has changed. Code containing CLASS
+ should be recompiled, including all files which define
+ derived types involved in the type definition used by
+ polymorphic variables. (Note: Due to the incremented
+ module version, trying to mix old code with new code will
+ usually give an error message.)
+ GNU Fortran no longer deallocates allocatable variables or
allocatable components of variables declared in the main
program. Since Fortran 2008, the standard explicitly states
* The compiler no longer unconditionally warns about DO loops with
zero iterations. This warning is now controlled by the -Wzerotrips
option, which is implied by -Wall.
- * The new NO_ARG_CHECK attribute of the [18]!GCC$ directive can be
+ * The new NO_ARG_CHECK attribute of the [20]!GCC$ directive can be
used to disable the type-kind-rank (TKR) argument check for a dummy
argument. The feature is similar to ISO/IEC TS 29133:2012's
TYPE(*), except that it additionally also disables the rank check.
contrary to NO_ARG_CHECK assumed-rank arguments pass an array
descriptor which contains the array shape and stride of the
argument.
- * [19]Fortran 2003:
- + Finalization is now supported. Note that finalization is
- currently only done for a subset of the situations in which it
- should occur.
+ * [21]Fortran 2003:
+ + Finalization is now supported. It is currently only done for a
+ subset of those situations in which it should occur.
+ Experimental support for scalar character components with
deferred length (i.e. allocatable string length) in derived
types has been added. (Deferred-length character variables are
supported since GCC 4.6.)
- * [20]Fortran 2008:
- + When STOP or ERROR STOP is used to terminate the execution and
- any exception (but inexact) is signaling, a warning is printed
- to ERROR_UNIT, indicating which exceptions are signaling. The
- [21]-ffpe-summary= command-line option can be used to
- fine-tune for which exception the warning should be shown.
+ * [22]Fortran 2008:
+ + When STOP or ERROR STOP are used to terminate the execution
+ and any exception (but inexact) is signaling, a warning is
+ printed to ERROR_UNIT, indicating which exceptions are
+ signaling. The [23]-ffpe-summary= command-line option can be
+ used to fine-tune for which exceptions the warning should be
+ shown.
+ Rounding on input (READ) is now handled on systems where
strtod honours the rounding mode. (For output, rounding is
supported since GCC 4.5.) Note that for input, the compatible
and are available through the -march=armv8-a+crc and
-march=armv8-a+crypto options.
* Initial support for ILP32 has now been added to the compiler. This
- is now available through the command line option -mabi=ilp32.
+ is now available through the command-line option -mabi=ilp32.
Support for ILP32 is considered experimental as the ABI
specification is still beta.
* Coverage of more of the ISA including the SIMD extensions has been
* A number of structural changes have been made to both the ARM and
AArch64 backends to facilitate improved code-generation.
+ ARC
+
+ * A port for Synopsys Designware ARC has been contributed by Embecosm
+ and Synopsys Inc.
+
ARM
* Use of Advanced SIMD (Neon) for 64-bit scalar computations has been
intrinsics and are available through the -march=armv8-a+crc and
mfpu=crypto-neon-fp-armv8 options.
* LRA is now on by default for the ARM target. This can be turned off
- using the -mno-lra option. This option is purely transitionary
- command line option and will be removed in a future release. We are
+ using the -mno-lra option. This option is a purely transitionary
+ command-line option and will be removed in a future release. We are
interested in any bug reports regarding functional and performance
regressions with LRA.
* A new option -mslow-flash-data to improve performance of programs
a file that are tagged with the corresponding target attribute
without having to compile the entire file with the -mxxx option.
This improves the usability of x86 intrinsics and is particularly
- useful when doing [22]Function Multiversioning.
+ useful when doing [24]Function Multiversioning.
* GCC now supports the new Intel microarchitecture named Silvermont
through -march=silvermont.
* GCC now supports the new Intel microarchitecture named Broadwell
A certain amount of bytes is reserved before the function entry
label plus a NOP is inserted at its very beginning to implement a
backward jump when applying a patch. The feature can either be
- enabled via command line option -mhotpatch for a compilation unit
- or can be enabled per function using the hotpatch attribute.
+ enabled per compilation unit via the command-line option -mhotpatch
+ or per function using the hotpatch attribute.
* The shrink wrap optimization is now supported on S/390 and enabled
by default.
* A major rework of the routines to determine which registers need to
RX
* The port now allows to specify the RX100, RX200, and RX600
- processors with the command line options -mcpu=rx100, -mcpu=rx200
+ processors with the command-line options -mcpu=rx100, -mcpu=rx200
and -mcpu=rx600.
SH
* The option -mcmpeqdi has been deprecated. Specifying it will result
in a warning and will not influence code generation.
+GCC 4.9.1
+
+ This is the [25]list of problem reports (PRs) from GCC's bug tracking
+ system that are known to be fixed in the 4.9.1 release. This list might
+ not be complete (that is, it is possible that some PRs that have been
+ fixed are not listed here).
+
+ Version 4.0 of the [26]OpenMP specification is supported even in
+ Fortran, not just C and C++.
+
For questions related to the use of GCC, please consult these web
- pages and the [23]GCC manuals. If that fails, the
- [24]gcc-help@gcc.gnu.org mailing list might help. Comments on these
+ pages and the [27]GCC manuals. If that fails, the
+ [28]gcc-help@gcc.gnu.org mailing list might help. Comments on these
web pages and the development of GCC are welcome on our developer
- list at [25]gcc@gcc.gnu.org. All of [26]our lists have public
+ list at [29]gcc@gcc.gnu.org. All of [30]our lists have public
archives.
- Copyright (C) [27]Free Software Foundation, Inc. Verbatim copying and
+ Copyright (C) [31]Free Software Foundation, Inc. Verbatim copying and
distribution of this entire article is permitted in any medium,
provided this notice is preserved.
- These pages are [28]maintained by the GCC team. Last modified
- 2014-04-20[29].
+ These pages are [32]maintained by the GCC team. Last modified
+ 2014-07-16[33].
References
- 1. http://gcc.gnu.org/ml/gcc-patches/2013-05/msg00728.html
- 2. http://gcc.gnu.org/gcc-4.9/porting_to.html
- 3. http://openmp.org/wp/openmp-specifications/
- 4. http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#index-fsimd-cost-model-908
- 5. http://gcc.gnu.org/onlinedocs/gcc/Language-Independent-Options.html#index-fdiagnostics-color-246
- 6. http://gcc.gnu.org/onlinedocs/gcc/Loop-Specific-Pragmas.html
- 7. https://www.cilkplus.org/
- 8. http://gcc.gnu.org/projects/cxx1y.html
- 9. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3638.html
- 10. http://gcc.gnu.org/projects/cxx1y.html
+ 1. https://gcc.gnu.org/ml/gcc-patches/2013-05/msg00728.html
+ 2. https://gcc.gnu.org/PR60825
+ 3. https://gcc.gnu.org/gcc-4.9/porting_to.html
+ 4. http://openmp.org/wp/openmp-specifications/
+ 5. https://gcc.gnu.org/onlinedocs/gcc-4.9.0/gcc/Optimize-Options.html#index-fsimd-cost-model-908
+ 6. https://gcc.gnu.org/onlinedocs/gcc-4.9.0/gcc/Language-Independent-Options.html#index-fdiagnostics-color-252
+ 7. https://gcc.gnu.org/onlinedocs/gcc-4.9.0/gcc/Loop-Specific-Pragmas.html
+ 8. https://www.cilkplus.org/
+ 9. http://gcc.gnu.org/projects/cxx1y.html
+ 10. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3638.html
11. http://gcc.gnu.org/projects/cxx1y.html
12. http://gcc.gnu.org/projects/cxx1y.html
13. http://gcc.gnu.org/projects/cxx1y.html
14. http://gcc.gnu.org/projects/cxx1y.html
- 15. http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2011
- 16. http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2014
- 17. http://gcc.gnu.org/onlinedocs/gfortran/Argument-passing-conventions.html
- 18. http://gcc.gnu.org/onlinedocs/gfortran/GNU-Fortran-Compiler-Directives.html
- 19. http://gcc.gnu.org/wiki/Fortran2003Status
- 20. http://gcc.gnu.org/wiki/Fortran2008Status
- 21. http://gcc.gnu.org/onlinedocs/gfortran/Debugging-Options.html
- 22. http://gcc.gnu.org/onlinedocs/gcc/Function-Multiversioning.html
- 23. http://gcc.gnu.org/onlinedocs/
- 24. mailto:gcc-help@gcc.gnu.org
- 25. mailto:gcc@gcc.gnu.org
- 26. http://gcc.gnu.org/lists.html
- 27. http://www.fsf.org/
- 28. http://gcc.gnu.org/about.html
- 29. http://validator.w3.org/check/referer
+ 15. http://gcc.gnu.org/projects/cxx1y.html
+ 16. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3889.pdf
+ 17. https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2011
+ 18. https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2014
+ 19. https://gcc.gnu.org/onlinedocs/gcc-4.9.0/gfortran/Argument-passing-conventions.html
+ 20. https://gcc.gnu.org/onlinedocs/gcc-4.9.0/gfortran/GNU-Fortran-Compiler-Directives.html
+ 21. https://gcc.gnu.org/wiki/Fortran2003Status
+ 22. https://gcc.gnu.org/wiki/Fortran2008Status
+ 23. https://gcc.gnu.org/onlinedocs/gcc-4.9.0/gfortran/Debugging-Options.html
+ 24. https://gcc.gnu.org/onlinedocs/gcc-4.9.0/gcc/Function-Multiversioning.html
+ 25. https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.9.1
+ 26. http://openmp.org/wp/openmp-specifications/
+ 27. https://gcc.gnu.org/onlinedocs/
+ 28. mailto:gcc-help@gcc.gnu.org
+ 29. mailto:gcc@gcc.gnu.org
+ 30. https://gcc.gnu.org/lists.html
+ 31. http://www.fsf.org/
+ 32. https://gcc.gnu.org/about.html
+ 33. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-4.8/index.html
GCC 4.8 Release Series
- October 16, 2013
+ May 22, 2014
The [1]GNU project and the GCC developers are pleased to announce the
- release of GCC 4.8.2.
+ release of GCC 4.8.3.
This release is a bug-fix release, containing fixes for regressions in
- GCC 4.8.1 relative to previous releases of GCC.
+ GCC 4.8.2 relative to previous releases of GCC.
Release History
+ GCC 4.8.3
+ May 22, 2014 ([2]changes, [3]documentation)
+
GCC 4.8.2
- October 16, 2013 ([2]changes, [3]documentation)
+ October 16, 2013 ([4]changes, [5]documentation)
GCC 4.8.1
- May 31, 2013 ([4]changes, [5]documentation)
+ May 31, 2013 ([6]changes, [7]documentation)
GCC 4.8.0
- March 22, 2013 ([6]changes, [7]documentation)
+ March 22, 2013 ([8]changes, [9]documentation)
References and Acknowledgements
supports several other languages aside from C, it now stands for the
GNU Compiler Collection.
- A list of [8]successful builds is updated as new information becomes
+ A list of [10]successful builds is updated as new information becomes
available.
The GCC developers would like to thank the numerous people that have
contributed new features, improvements, bug fixes, and other changes as
- well as test results to GCC. This [9]amazing group of volunteers is
+ well as test results to GCC. This [11]amazing group of volunteers is
what makes GCC successful.
- For additional information about GCC please refer to the [10]GCC
- project web site or contact the [11]GCC development mailing list.
+ For additional information about GCC please refer to the [12]GCC
+ project web site or contact the [13]GCC development mailing list.
- To obtain GCC please use [12]our mirror sites or [13]our SVN server.
+ To obtain GCC please use [14]our mirror sites or [15]our SVN server.
For questions related to the use of GCC, please consult these web
- pages and the [14]GCC manuals. If that fails, the
- [15]gcc-help@gcc.gnu.org mailing list might help. Comments on these
+ pages and the [16]GCC manuals. If that fails, the
+ [17]gcc-help@gcc.gnu.org mailing list might help. Comments on these
web pages and the development of GCC are welcome on our developer
- list at [16]gcc@gcc.gnu.org. All of [17]our lists have public
+ list at [18]gcc@gcc.gnu.org. All of [19]our lists have public
archives.
- Copyright (C) [18]Free Software Foundation, Inc. Verbatim copying and
+ Copyright (C) [20]Free Software Foundation, Inc. Verbatim copying and
distribution of this entire article is permitted in any medium,
provided this notice is preserved.
- These pages are [19]maintained by the GCC team. Last modified
- 2013-10-16[20].
+ These pages are [21]maintained by the GCC team. Last modified
+ 2014-06-11[22].
References
1. http://www.gnu.org/
2. http://gcc.gnu.org/gcc-4.8/changes.html
- 3. http://gcc.gnu.org/onlinedocs/4.8.2/
+ 3. https://gcc.gnu.org/onlinedocs/4.8.3/
4. http://gcc.gnu.org/gcc-4.8/changes.html
- 5. http://gcc.gnu.org/onlinedocs/4.8.1/
+ 5. https://gcc.gnu.org/onlinedocs/4.8.2/
6. http://gcc.gnu.org/gcc-4.8/changes.html
- 7. http://gcc.gnu.org/onlinedocs/4.8.0/
- 8. http://gcc.gnu.org/gcc-4.8/buildstat.html
- 9. http://gcc.gnu.org/onlinedocs/gcc/Contributors.html
- 10. http://gcc.gnu.org/index.html
- 11. mailto:gcc@gcc.gnu.org
- 12. http://gcc.gnu.org/mirrors.html
- 13. http://gcc.gnu.org/svn.html
- 14. http://gcc.gnu.org/onlinedocs/
- 15. mailto:gcc-help@gcc.gnu.org
- 16. mailto:gcc@gcc.gnu.org
- 17. http://gcc.gnu.org/lists.html
- 18. http://www.fsf.org/
- 19. http://gcc.gnu.org/about.html
- 20. http://validator.w3.org/check/referer
+ 7. https://gcc.gnu.org/onlinedocs/4.8.1/
+ 8. http://gcc.gnu.org/gcc-4.8/changes.html
+ 9. https://gcc.gnu.org/onlinedocs/4.8.0/
+ 10. http://gcc.gnu.org/gcc-4.8/buildstat.html
+ 11. https://gcc.gnu.org/onlinedocs/gcc/Contributors.html
+ 12. http://gcc.gnu.org/index.html
+ 13. mailto:gcc@gcc.gnu.org
+ 14. http://gcc.gnu.org/mirrors.html
+ 15. http://gcc.gnu.org/svn.html
+ 16. https://gcc.gnu.org/onlinedocs/
+ 17. mailto:gcc-help@gcc.gnu.org
+ 18. mailto:gcc@gcc.gnu.org
+ 19. https://gcc.gnu.org/lists.html
+ 20. http://www.fsf.org/
+ 21. https://gcc.gnu.org/about.html
+ 22. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-4.8/changes.html
GCC 4.8 Release Series
not be complete (that is, it is possible that some PRs that have been
fixed are not listed here).
+GCC 4.8.3
+
+ This is the [35]list of problem reports (PRs) from GCC's bug tracking
+ system that are known to be fixed in the 4.8.3 release. This list might
+ not be complete (that is, it is possible that some PRs that have been
+ fixed are not listed here).
+
+ Support for the new powerpc64le-linux platform has been added. It
+ defaults to generating code that conforms to the ELFV2 ABI.
+
For questions related to the use of GCC, please consult these web
- pages and the [35]GCC manuals. If that fails, the
- [36]gcc-help@gcc.gnu.org mailing list might help. Comments on these
+ pages and the [36]GCC manuals. If that fails, the
+ [37]gcc-help@gcc.gnu.org mailing list might help. Comments on these
web pages and the development of GCC are welcome on our developer
- list at [37]gcc@gcc.gnu.org. All of [38]our lists have public
+ list at [38]gcc@gcc.gnu.org. All of [39]our lists have public
archives.
- Copyright (C) [39]Free Software Foundation, Inc. Verbatim copying and
+ Copyright (C) [40]Free Software Foundation, Inc. Verbatim copying and
distribution of this entire article is permitted in any medium,
provided this notice is preserved.
- These pages are [40]maintained by the GCC team. Last modified
- 2013-11-26[41].
+ These pages are [41]maintained by the GCC team. Last modified
+ 2014-06-11[42].
References
- 1. http://gcc.gnu.org/wiki/cxx-conversion
+ 1. https://gcc.gnu.org/wiki/cxx-conversion
2. ftp://gcc.gnu.org/pub/gcc/infrastructure/
3. http://www.nongnu.org/avr-libc/
- 4. http://gcc.gnu.org/PR54461
- 5. http://gcc.gnu.org/gcc-4.8/porting_to.html
+ 4. https://gcc.gnu.org/PR54461
+ 5. https://gcc.gnu.org/gcc-4.8/porting_to.html
6. https://code.google.com/p/address-sanitizer/
7. https://code.google.com/p/data-race-test/wiki/ThreadSanitizer
8. https://lkml.org/lkml/2006/11/28/239
13. http://gcc.gnu.org/gcc-4.8/cxx0x_status.html
14. http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2012/n3386.html
15. http://gcc.gnu.org/projects/cxx1y.html
- 16. http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2011
- 17. http://gcc.gnu.org/onlinedocs/gfortran/BACKTRACE.html
- 18. http://gcc.gnu.org/onlinedocs/gfortran/Error-and-Warning-Options.html
- 19. http://gcc.gnu.org/onlinedocs/gfortran/Error-and-Warning-Options.html
- 20. http://gcc.gnu.org/onlinedocs/gfortran/Code-Gen-Options.html
- 21. http://gcc.gnu.org/onlinedocs/gfortran/Error-and-Warning-Options.html
- 22. http://gcc.gnu.org/onlinedocs/gfortran/Error-and-Warning-Options.html
- 23. http://gcc.gnu.org/onlinedocs/gfortran/TMPDIR.html
- 24. http://gcc.gnu.org/wiki/Fortran2003Status
- 25. http://gcc.gnu.org/wiki/TS29113Status
- 26. http://gcc.gnu.org/viewcvs/trunk/libgfortran/libgfortran.h?content-type=text%2Fplain&view=co
+ 16. https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2011
+ 17. https://gcc.gnu.org/onlinedocs/gfortran/BACKTRACE.html
+ 18. https://gcc.gnu.org/onlinedocs/gfortran/Error-and-Warning-Options.html
+ 19. https://gcc.gnu.org/onlinedocs/gfortran/Error-and-Warning-Options.html
+ 20. https://gcc.gnu.org/onlinedocs/gfortran/Code-Gen-Options.html
+ 21. https://gcc.gnu.org/onlinedocs/gfortran/Error-and-Warning-Options.html
+ 22. https://gcc.gnu.org/onlinedocs/gfortran/Error-and-Warning-Options.html
+ 23. https://gcc.gnu.org/onlinedocs/gfortran/TMPDIR.html
+ 24. https://gcc.gnu.org/wiki/Fortran2003Status
+ 25. https://gcc.gnu.org/wiki/TS29113Status
+ 26. https://gcc.gnu.org/viewcvs/trunk/libgfortran/libgfortran.h?content-type=text%2Fplain&view=co
27. http://chasm-interop.sourceforge.net/
- 28. http://gcc.gnu.org/wiki/avr-gcc#Fixed-Point_Support
- 29. http://gcc.gnu.org/onlinedocs/gcc/Fixed-Point.html
- 30. http://gcc.gnu.org/onlinedocs/gcc/X86-Built-in-Functions.html#X86-Built-in-Functions
- 31. http://gcc.gnu.org/onlinedocs/gcc/X86-Built-in-Functions.html#X86-Built-in-Functions
- 32. http://gcc.gnu.org/wiki/FunctionMultiVersioning
- 33. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.8.1
- 34. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.8.2
- 35. http://gcc.gnu.org/onlinedocs/
- 36. mailto:gcc-help@gcc.gnu.org
- 37. mailto:gcc@gcc.gnu.org
- 38. http://gcc.gnu.org/lists.html
- 39. http://www.fsf.org/
- 40. http://gcc.gnu.org/about.html
- 41. http://validator.w3.org/check/referer
+ 28. https://gcc.gnu.org/wiki/avr-gcc#Fixed-Point_Support
+ 29. https://gcc.gnu.org/onlinedocs/gcc/Fixed-Point.html
+ 30. https://gcc.gnu.org/onlinedocs/gcc/X86-Built-in-Functions.html#X86-Built-in-Functions
+ 31. https://gcc.gnu.org/onlinedocs/gcc/X86-Built-in-Functions.html#X86-Built-in-Functions
+ 32. https://gcc.gnu.org/wiki/FunctionMultiVersioning
+ 33. https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.8.1
+ 34. https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.8.2
+ 35. https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.8.3
+ 36. https://gcc.gnu.org/onlinedocs/
+ 37. mailto:gcc-help@gcc.gnu.org
+ 38. mailto:gcc@gcc.gnu.org
+ 39. https://gcc.gnu.org/lists.html
+ 40. http://www.fsf.org/
+ 41. https://gcc.gnu.org/about.html
+ 42. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-4.7/index.html
GCC 4.7 Release Series
- April 11, 2013
+ June 12, 2014
The [1]GNU project and the GCC developers are pleased to announce the
- release of GCC 4.7.3.
+ release of GCC 4.7.4.
This release is a bug-fix release, containing fixes for regressions in
- GCC 4.7.2 relative to previous releases of GCC.
+ GCC 4.7.3 relative to previous releases of GCC.
Release History
+ GCC 4.7.4
+ June 12, 2014 ([2]changes, [3]documentation)
+
GCC 4.7.3
- April 11, 2013 ([2]changes, [3]documentation)
+ April 11, 2013 ([4]changes, [5]documentation)
GCC 4.7.2
- September 20, 2012 ([4]changes, [5]documentation)
+ September 20, 2012 ([6]changes, [7]documentation)
GCC 4.7.1
- June 14, 2012 ([6]changes, [7]documentation)
+ June 14, 2012 ([8]changes, [9]documentation)
GCC 4.7.0
- March 22, 2012 ([8]changes, [9]documentation)
+ March 22, 2012 ([10]changes, [11]documentation)
References and Acknowledgements
supports several other languages aside from C, it now stands for the
GNU Compiler Collection.
- A list of [10]successful builds is updated as new information becomes
+ A list of [12]successful builds is updated as new information becomes
available.
The GCC developers would like to thank the numerous people that have
contributed new features, improvements, bug fixes, and other changes as
- well as test results to GCC. This [11]amazing group of volunteers is
+ well as test results to GCC. This [13]amazing group of volunteers is
what makes GCC successful.
- For additional information about GCC please refer to the [12]GCC
- project web site or contact the [13]GCC development mailing list.
+ For additional information about GCC please refer to the [14]GCC
+ project web site or contact the [15]GCC development mailing list.
- To obtain GCC please use [14]our mirror sites or [15]our SVN server.
+ To obtain GCC please use [16]our mirror sites or [17]our SVN server.
For questions related to the use of GCC, please consult these web
- pages and the [16]GCC manuals. If that fails, the
- [17]gcc-help@gcc.gnu.org mailing list might help. Comments on these
+ pages and the [18]GCC manuals. If that fails, the
+ [19]gcc-help@gcc.gnu.org mailing list might help. Comments on these
web pages and the development of GCC are welcome on our developer
- list at [18]gcc@gcc.gnu.org. All of [19]our lists have public
+ list at [20]gcc@gcc.gnu.org. All of [21]our lists have public
archives.
- Copyright (C) [20]Free Software Foundation, Inc. Verbatim copying and
+ Copyright (C) [22]Free Software Foundation, Inc. Verbatim copying and
distribution of this entire article is permitted in any medium,
provided this notice is preserved.
- These pages are [21]maintained by the GCC team. Last modified
- 2013-04-11[22].
+ These pages are [23]maintained by the GCC team. Last modified
+ 2014-06-12[24].
References
1. http://www.gnu.org/
2. http://gcc.gnu.org/gcc-4.7/changes.html
- 3. http://gcc.gnu.org/onlinedocs/4.7.3/
+ 3. https://gcc.gnu.org/onlinedocs/4.7.4/
4. http://gcc.gnu.org/gcc-4.7/changes.html
- 5. http://gcc.gnu.org/onlinedocs/4.7.2/
+ 5. https://gcc.gnu.org/onlinedocs/4.7.3/
6. http://gcc.gnu.org/gcc-4.7/changes.html
- 7. http://gcc.gnu.org/onlinedocs/4.7.1/
+ 7. https://gcc.gnu.org/onlinedocs/4.7.2/
8. http://gcc.gnu.org/gcc-4.7/changes.html
- 9. http://gcc.gnu.org/onlinedocs/4.7.0/
- 10. http://gcc.gnu.org/gcc-4.7/buildstat.html
- 11. http://gcc.gnu.org/onlinedocs/gcc/Contributors.html
- 12. http://gcc.gnu.org/index.html
- 13. mailto:gcc@gcc.gnu.org
- 14. http://gcc.gnu.org/mirrors.html
- 15. http://gcc.gnu.org/svn.html
- 16. http://gcc.gnu.org/onlinedocs/
- 17. mailto:gcc-help@gcc.gnu.org
- 18. mailto:gcc@gcc.gnu.org
- 19. http://gcc.gnu.org/lists.html
- 20. http://www.fsf.org/
- 21. http://gcc.gnu.org/about.html
- 22. http://validator.w3.org/check/referer
+ 9. https://gcc.gnu.org/onlinedocs/4.7.1/
+ 10. http://gcc.gnu.org/gcc-4.7/changes.html
+ 11. https://gcc.gnu.org/onlinedocs/4.7.0/
+ 12. http://gcc.gnu.org/gcc-4.7/buildstat.html
+ 13. https://gcc.gnu.org/onlinedocs/gcc/Contributors.html
+ 14. http://gcc.gnu.org/index.html
+ 15. mailto:gcc@gcc.gnu.org
+ 16. http://gcc.gnu.org/mirrors.html
+ 17. http://gcc.gnu.org/svn.html
+ 18. https://gcc.gnu.org/onlinedocs/
+ 19. mailto:gcc-help@gcc.gnu.org
+ 20. mailto:gcc@gcc.gnu.org
+ 21. https://gcc.gnu.org/lists.html
+ 22. http://www.fsf.org/
+ 23. https://gcc.gnu.org/about.html
+ 24. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-4.7/changes.html
GCC 4.7 Release Series
not be complete (that is, it is possible that some PRs that have been
fixed are not listed here).
+GCC 4.7.4
+
+ This is the [49]list of problem reports (PRs) from GCC's bug tracking
+ system that are known to be fixed in the 4.7.4 release. This list might
+ not be complete (that is, it is possible that some PRs that have been
+ fixed are not listed here).
+
For questions related to the use of GCC, please consult these web
- pages and the [49]GCC manuals. If that fails, the
- [50]gcc-help@gcc.gnu.org mailing list might help. Comments on these
+ pages and the [50]GCC manuals. If that fails, the
+ [51]gcc-help@gcc.gnu.org mailing list might help. Comments on these
web pages and the development of GCC are welcome on our developer
- list at [51]gcc@gcc.gnu.org. All of [52]our lists have public
+ list at [52]gcc@gcc.gnu.org. All of [53]our lists have public
archives.
- Copyright (C) [53]Free Software Foundation, Inc. Verbatim copying and
+ Copyright (C) [54]Free Software Foundation, Inc. Verbatim copying and
distribution of this entire article is permitted in any medium,
provided this notice is preserved.
- These pages are [54]maintained by the GCC team. Last modified
- 2013-04-11[55].
+ These pages are [55]maintained by the GCC team. Last modified
+ 2014-06-12[56].
References
- 1. http://gcc.gnu.org/ml/gcc-patches/2011-03/msg01263.html
+ 1. https://gcc.gnu.org/ml/gcc-patches/2011-03/msg01263.html
2. http://savannah.nongnu.org/bugs/?35407
- 3. http://gcc.gnu.org/PR18145
- 4. http://gcc.gnu.org/gcc-4.7/porting_to.html
+ 3. https://gcc.gnu.org/PR18145
+ 4. https://gcc.gnu.org/gcc-4.7/porting_to.html
5. http://openmp.org/wp/openmp-specifications/
- 6. http://gcc.gnu.org/wiki/TransactionalMemory
- 7. http://gcc.gnu.org/wiki/Atomic/GCCMM
+ 6. https://gcc.gnu.org/wiki/TransactionalMemory
+ 7. https://gcc.gnu.org/wiki/Atomic/GCCMM
8. http://gcc.gnu.org/gcc-4.7/cxx0x_status.html
9. http://gcc.gnu.org/gcc-4.7/cxx0x_status.html
10. http://gcc.gnu.org/gcc-4.7/cxx0x_status.html
11. http://gcc.gnu.org/gcc-4.7/cxx0x_status.html
12. http://gcc.gnu.org/gcc-4.7/cxx0x_status.html
13. http://gcc.gnu.org/gcc-4.7/cxx0x_status.html
- 14. http://gcc.gnu.org/PR14258
- 15. http://gcc.gnu.org/PR35688
- 16. http://gcc.gnu.org/onlinedocs/gcc-4.7.1/libstdc++/manual/manual/status.html#status.iso.2011
- 17. http://gcc.gnu.org/onlinedocs/gcc-4.7.1/gfortran/Code-Gen-Options.html#index-g_t_0040code_007bfstack-arrays_007d-254
- 18. http://gcc.gnu.org/onlinedocs/gcc-4.7.1/gcc/Optimize-Options.html#index-Ofast-689
- 19. http://gcc.gnu.org/onlinedocs/gcc-4.7.1/gfortran/Code-Gen-Options.html#index-g_t_0040code_007bfno-protect-parens_007d-270
- 20. http://gcc.gnu.org/onlinedocs/gcc-4.7.1/gfortran/Code-Gen-Options.html#index-g_t_0040code_007bfstack-arrays_007d-254
- 21. http://gcc.gnu.org/onlinedocs/gcc-4.7.1/gfortran/Code-Gen-Options.html#index-g_t_0040code_007bfrontend-optimize_007d-275
- 22. http://gcc.gnu.org/onlinedocs/gcc-4.7.1/gfortran/Error-and-Warning-Options.html#index-g_t_0040code_007bWfunction-elimination_007d-170
- 23. http://gcc.gnu.org/onlinedocs/gcc-4.7.1/gfortran/Code-Gen-Options.html#index-g_t_0040code_007bfaggressive-function-elimination_007d-270
- 24. http://gcc.gnu.org/onlinedocs/gcc-4.7.1/gfortran/Error-and-Warning-Options.html#index-g_t_0040code_007bWreal-q-constant_007d-149
- 25. http://gcc.gnu.org/onlinedocs/gcc-4.7.1/gfortran/SELECTED_005fREAL_005fKIND.html
+ 14. https://gcc.gnu.org/PR14258
+ 15. https://gcc.gnu.org/PR35688
+ 16. https://gcc.gnu.org/onlinedocs/gcc-4.7.1/libstdc++/manual/manual/status.html#status.iso.2011
+ 17. https://gcc.gnu.org/onlinedocs/gcc-4.7.1/gfortran/Code-Gen-Options.html#index-g_t_0040code_007bfstack-arrays_007d-254
+ 18. https://gcc.gnu.org/onlinedocs/gcc-4.7.1/gcc/Optimize-Options.html#index-Ofast-689
+ 19. https://gcc.gnu.org/onlinedocs/gcc-4.7.1/gfortran/Code-Gen-Options.html#index-g_t_0040code_007bfno-protect-parens_007d-270
+ 20. https://gcc.gnu.org/onlinedocs/gcc-4.7.1/gfortran/Code-Gen-Options.html#index-g_t_0040code_007bfstack-arrays_007d-254
+ 21. https://gcc.gnu.org/onlinedocs/gcc-4.7.1/gfortran/Code-Gen-Options.html#index-g_t_0040code_007bfrontend-optimize_007d-275
+ 22. https://gcc.gnu.org/onlinedocs/gcc-4.7.1/gfortran/Error-and-Warning-Options.html#index-g_t_0040code_007bWfunction-elimination_007d-170
+ 23. https://gcc.gnu.org/onlinedocs/gcc-4.7.1/gfortran/Code-Gen-Options.html#index-g_t_0040code_007bfaggressive-function-elimination_007d-270
+ 24. https://gcc.gnu.org/onlinedocs/gcc-4.7.1/gfortran/Error-and-Warning-Options.html#index-g_t_0040code_007bWreal-q-constant_007d-149
+ 25. https://gcc.gnu.org/onlinedocs/gcc-4.7.1/gfortran/SELECTED_005fREAL_005fKIND.html
26. http://msdn.microsoft.com/en-us/library/bb787181%28v=vs.85%29.aspx
- 27. http://gcc.gnu.org/onlinedocs/gcc-4.7.1/gfortran/Debugging-Options.html#index-g_t_0040code_007bfno-backtrace_007d-183
- 28. http://gcc.gnu.org/wiki/Fortran2003Status
- 29. http://gcc.gnu.org/wiki/OOP
- 30. http://gcc.gnu.org/wiki/Fortran2008Status
- 31. http://gcc.gnu.org/wiki/Coarray
- 32. http://gcc.gnu.org/wiki/CoarrayLib
- 33. http://gcc.gnu.org/wiki/TS29113Status
- 34. http://gcc.gnu.org/onlinedocs/gcc-4.7.1/gfortran/Fortran-Dialect-Options.html#index-g_t_0040code_007bstd_003d_007d_0040var_007bstd_007d-option-53
+ 27. https://gcc.gnu.org/onlinedocs/gcc-4.7.1/gfortran/Debugging-Options.html#index-g_t_0040code_007bfno-backtrace_007d-183
+ 28. https://gcc.gnu.org/wiki/Fortran2003Status
+ 29. https://gcc.gnu.org/wiki/OOP
+ 30. https://gcc.gnu.org/wiki/Fortran2008Status
+ 31. https://gcc.gnu.org/wiki/Coarray
+ 32. https://gcc.gnu.org/wiki/CoarrayLib
+ 33. https://gcc.gnu.org/wiki/TS29113Status
+ 34. https://gcc.gnu.org/onlinedocs/gcc-4.7.1/gfortran/Fortran-Dialect-Options.html#index-g_t_0040code_007bstd_003d_007d_0040var_007bstd_007d-option-53
35. http://weekly.golang.org/doc/go1.html
- 36. http://gcc.gnu.org/onlinedocs/gcc-4.7.1/gcc/Named-Address-Spaces.html
+ 36. https://gcc.gnu.org/onlinedocs/gcc-4.7.1/gcc/Named-Address-Spaces.html
37. http://nongnu.org/avr-libc/
- 38. http://gcc.gnu.org/PR54461
- 39. http://gcc.gnu.org/onlinedocs/gcc-4.7.1/gcc/AVR-Built%5f002din-Functions.html
+ 38. https://gcc.gnu.org/PR54461
+ 39. https://gcc.gnu.org/onlinedocs/gcc-4.7.1/gcc/AVR-Built%5f002din-Functions.html
40. https://sites.google.com/site/x32abi/
41. http://www.dwarfstd.org/ShowIssue.php?issue=100909.1
42. http://www.dwarfstd.org/ShowIssue.php?issue=100909.2
43. http://www.dwarfstd.org/doc/040408.1.html
44. http://www.dwarfstd.org/ShowIssue.php?issue=110722.1
- 45. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.7.1
+ 45. https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.7.1
46. http://weekly.golang.org/doc/go1.html
- 47. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.7.2
- 48. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.7.3
- 49. http://gcc.gnu.org/onlinedocs/
- 50. mailto:gcc-help@gcc.gnu.org
- 51. mailto:gcc@gcc.gnu.org
- 52. http://gcc.gnu.org/lists.html
- 53. http://www.fsf.org/
- 54. http://gcc.gnu.org/about.html
- 55. http://validator.w3.org/check/referer
+ 47. https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.7.2
+ 48. https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.7.3
+ 49. https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.7.4
+ 50. https://gcc.gnu.org/onlinedocs/
+ 51. mailto:gcc-help@gcc.gnu.org
+ 52. mailto:gcc@gcc.gnu.org
+ 53. https://gcc.gnu.org/lists.html
+ 54. http://www.fsf.org/
+ 55. https://gcc.gnu.org/about.html
+ 56. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-4.6/index.html
GCC 4.6 Release Series
provided this notice is preserved.
These pages are [23]maintained by the GCC team. Last modified
- 2013-04-12[24].
+ 2014-06-28[24].
References
1. http://www.gnu.org/
2. http://gcc.gnu.org/gcc-4.6/changes.html
- 3. http://gcc.gnu.org/onlinedocs/4.6.4/
+ 3. https://gcc.gnu.org/onlinedocs/4.6.4/
4. http://gcc.gnu.org/gcc-4.6/changes.html
- 5. http://gcc.gnu.org/onlinedocs/4.6.3/
+ 5. https://gcc.gnu.org/onlinedocs/4.6.3/
6. http://gcc.gnu.org/gcc-4.6/changes.html
- 7. http://gcc.gnu.org/onlinedocs/4.6.2/
+ 7. https://gcc.gnu.org/onlinedocs/4.6.2/
8. http://gcc.gnu.org/gcc-4.6/changes.html
- 9. http://gcc.gnu.org/onlinedocs/4.6.1/
+ 9. https://gcc.gnu.org/onlinedocs/4.6.1/
10. http://gcc.gnu.org/gcc-4.6/changes.html
- 11. http://gcc.gnu.org/onlinedocs/4.6.0/
+ 11. https://gcc.gnu.org/onlinedocs/4.6.0/
12. http://gcc.gnu.org/gcc-4.6/buildstat.html
- 13. http://gcc.gnu.org/onlinedocs/gcc/Contributors.html
+ 13. https://gcc.gnu.org/onlinedocs/gcc/Contributors.html
14. http://gcc.gnu.org/index.html
15. mailto:gcc@gcc.gnu.org
16. http://gcc.gnu.org/mirrors.html
17. http://gcc.gnu.org/svn.html
- 18. http://gcc.gnu.org/onlinedocs/
+ 18. https://gcc.gnu.org/onlinedocs/
19. mailto:gcc-help@gcc.gnu.org
20. mailto:gcc@gcc.gnu.org
- 21. http://gcc.gnu.org/lists.html
+ 21. https://gcc.gnu.org/lists.html
22. http://www.fsf.org/
- 23. http://gcc.gnu.org/about.html
+ 23. https://gcc.gnu.org/about.html
24. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-4.6/changes.html
provided this notice is preserved.
These pages are [29]maintained by the GCC team. Last modified
- 2013-04-12[30].
+ 2014-06-28[30].
References
3. http://gcc.gnu.org/gcc-4.5/changes.html#obsoleted
4. http://gcc.gnu.org/gcc-4.6/porting_to.html
5. http://gcc.gnu.org/projects/lto/whopr.pdf
- 6. http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#Warning-Options
+ 6. https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#Warning-Options
7. http://gcc.gnu.org/gcc-4.6/cxx0x_status.html
- 8. http://gcc.gnu.org/PR43145
- 9. http://gcc.gnu.org/PR43680
- 10. http://gcc.gnu.org/PR33558
+ 8. https://gcc.gnu.org/PR43145
+ 9. https://gcc.gnu.org/PR43680
+ 10. https://gcc.gnu.org/PR33558
11. http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#253
- 12. http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.200x
- 13. http://gcc.gnu.org/onlinedocs/libstdc++/manual/debug_mode.html
- 14. http://gcc.gnu.org/onlinedocs/libstdc++/manual/debug.html#debug.races
- 15. http://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html
- 16. http://gcc.gnu.org/wiki/OOP
- 17. http://gcc.gnu.org/wiki/Coarray
- 18. http://gcc.gnu.org/onlinedocs/gfortran/Code-Gen-Options.html#index-g_t_0040code_007bfcoarray_007d-233
+ 12. https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.200x
+ 13. https://gcc.gnu.org/onlinedocs/libstdc++/manual/debug_mode.html
+ 14. https://gcc.gnu.org/onlinedocs/libstdc++/manual/debug.html#debug.races
+ 15. https://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html
+ 16. https://gcc.gnu.org/wiki/OOP
+ 17. https://gcc.gnu.org/wiki/Coarray
+ 18. https://gcc.gnu.org/onlinedocs/gfortran/Code-Gen-Options.html#index-g_t_0040code_007bfcoarray_007d-233
19. http://golang.org/
- 20. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.6.1
- 21. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.6.2
- 22. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.6.3
- 23. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.6.4
- 24. http://gcc.gnu.org/onlinedocs/
+ 20. https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.6.1
+ 21. https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.6.2
+ 22. https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.6.3
+ 23. https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.6.4
+ 24. https://gcc.gnu.org/onlinedocs/
25. mailto:gcc-help@gcc.gnu.org
26. mailto:gcc@gcc.gnu.org
- 27. http://gcc.gnu.org/lists.html
+ 27. https://gcc.gnu.org/lists.html
28. http://www.fsf.org/
- 29. http://gcc.gnu.org/about.html
+ 29. https://gcc.gnu.org/about.html
30. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-4.5/index.html
provided this notice is preserved.
These pages are [18]maintained by the GCC team. Last modified
- 2012-11-02[19].
+ 2014-06-28[19].
References
5. http://gcc.gnu.org/gcc-4.5/changes.html
6. http://gcc.gnu.org/gcc-4.5/changes.html
7. http://gcc.gnu.org/gcc-4.5/buildstat.html
- 8. http://gcc.gnu.org/onlinedocs/gcc/Contributors.html
+ 8. https://gcc.gnu.org/onlinedocs/gcc/Contributors.html
9. http://gcc.gnu.org/index.html
10. mailto:gcc@gcc.gnu.org
11. http://gcc.gnu.org/mirrors.html
12. http://gcc.gnu.org/svn.html
- 13. http://gcc.gnu.org/onlinedocs/
+ 13. https://gcc.gnu.org/onlinedocs/
14. mailto:gcc-help@gcc.gnu.org
15. mailto:gcc@gcc.gnu.org
- 16. http://gcc.gnu.org/lists.html
+ 16. https://gcc.gnu.org/lists.html
17. http://www.fsf.org/
- 18. http://gcc.gnu.org/about.html
+ 18. https://gcc.gnu.org/about.html
19. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-4.5/changes.html
provided this notice is preserved.
These pages are [34]maintained by the GCC team. Last modified
- 2012-11-02[35].
+ 2014-06-28[35].
References
1. http://www.multiprecision.org/
- 2. http://gcc.gnu.org/install/prerequisites.html
- 3. http://gcc.gnu.org/ml/gcc/2010-01/msg00510.html
+ 2. https://gcc.gnu.org/install/prerequisites.html
+ 3. https://gcc.gnu.org/ml/gcc/2010-01/msg00510.html
4. http://gcc.gnu.org/gcc-4.4/changes.html#obsoleted
5. http://gcc.gnu.org/gcc-4.5/changes.html#x86
6. http://www.multiprecision.org/
- 7. http://gcc.gnu.org/PR30789
- 8. http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#index-flto-801
- 9. http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#index-fwhopr-802
- 10. http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#index-fwhole-program-800
- 11. http://gcc.gnu.org/onlinedocs/gcc/Restricted-Pointers.html
+ 7. https://gcc.gnu.org/PR30789
+ 8. https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#index-flto-801
+ 9. https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#index-fwhopr-802
+ 10. https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#index-fwhole-program-800
+ 11. https://gcc.gnu.org/onlinedocs/gcc/Restricted-Pointers.html
12. http://gcc.gnu.org/gcc-4.5/cxx0x_status.html
13. http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#757
14. http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#176
- 15. http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.200x
- 16. http://gcc.gnu.org/onlinedocs/libstdc++/manual/profile_mode.html
- 17. http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.tr24733
+ 15. https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.200x
+ 16. https://gcc.gnu.org/onlinedocs/libstdc++/manual/profile_mode.html
+ 17. https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.tr24733
18. http://sourceware.org/gdb/wiki/STLSupport
19. http://gcc.gnu.org/gcc-4.4/changes.html
- 20. http://gcc.gnu.org/onlinedocs/gfortran/Code-Gen-Options.html
- 21. http://gcc.gnu.org/onlinedocs/gfortran/Mixed-Language-Programming.html
- 22. http://gcc.gnu.org/onlinedocs/gfortran/GNU-Fortran-Compiler-Directives.html
- 23. http://gcc.gnu.org/wiki/OOP
- 24. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.5.1
- 25. http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#index-flto-801
- 26. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.5.2
- 27. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.5.3
- 28. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.5.4
- 29. http://gcc.gnu.org/onlinedocs/
+ 20. https://gcc.gnu.org/onlinedocs/gfortran/Code-Gen-Options.html
+ 21. https://gcc.gnu.org/onlinedocs/gfortran/Mixed-Language-Programming.html
+ 22. https://gcc.gnu.org/onlinedocs/gfortran/GNU-Fortran-Compiler-Directives.html
+ 23. https://gcc.gnu.org/wiki/OOP
+ 24. https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.5.1
+ 25. https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#index-flto-801
+ 26. https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.5.2
+ 27. https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.5.3
+ 28. https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.5.4
+ 29. https://gcc.gnu.org/onlinedocs/
30. mailto:gcc-help@gcc.gnu.org
31. mailto:gcc@gcc.gnu.org
- 32. http://gcc.gnu.org/lists.html
+ 32. https://gcc.gnu.org/lists.html
33. http://www.fsf.org/
- 34. http://gcc.gnu.org/about.html
+ 34. https://gcc.gnu.org/about.html
35. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-4.4/index.html
provided this notice is preserved.
These pages are [21]maintained by the GCC team. Last modified
- 2012-11-02[22].
+ 2014-06-28[22].
References
8. http://gcc.gnu.org/gcc-4.4/changes.html
9. http://gcc.gnu.org/gcc-4.4/changes.html
10. http://gcc.gnu.org/gcc-4.4/buildstat.html
- 11. http://gcc.gnu.org/onlinedocs/gcc/Contributors.html
+ 11. https://gcc.gnu.org/onlinedocs/gcc/Contributors.html
12. http://gcc.gnu.org/index.html
13. mailto:gcc@gcc.gnu.org
14. http://gcc.gnu.org/mirrors.html
15. http://gcc.gnu.org/svn.html
- 16. http://gcc.gnu.org/onlinedocs/
+ 16. https://gcc.gnu.org/onlinedocs/
17. mailto:gcc-help@gcc.gnu.org
18. mailto:gcc@gcc.gnu.org
- 19. http://gcc.gnu.org/lists.html
+ 19. https://gcc.gnu.org/lists.html
20. http://www.fsf.org/
- 21. http://gcc.gnu.org/about.html
+ 21. https://gcc.gnu.org/about.html
22. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-4.4/changes.html
provided this notice is preserved.
These pages are [25]maintained by the GCC team. Last modified
- 2012-11-02[26].
+ 2014-06-28[26].
References
1. http://gcc.gnu.org/gcc-4.4/changes.html#4.4.7
2. http://gcc.gnu.org/gcc-4.3/changes.html#obsoleted
3. http://gcc.gnu.org/gcc-4.4/porting_to.html
- 4. http://gcc.gnu.org/wiki/Graphite
+ 4. https://gcc.gnu.org/wiki/Graphite
5. http://openmp.org/wp/openmp-specifications/
6. http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1040.pdf
7. http://gcc.gnu.org/gcc-4.4/cxx0x_status.html
- 8. http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#id476343
- 9. http://gcc.gnu.org/onlinedocs/gfortran/Preprocessing-Options.html
- 10. http://gcc.gnu.org/onlinedocs/gfortran/Error-and-Warning-Options.html#index-g_t_0040code_007bWarray-temporaries_007d-125
- 11. http://gcc.gnu.org/onlinedocs/gfortran/Code-Gen-Options.html#index-g_t_0040code_007bfcheck-array-temporaries_007d-221
- 12. http://gcc.gnu.org/onlinedocs/gfortran/Fortran-Dialect-Options.html#index-g_t_0040code_007bbackslash_007d-34
- 13. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.4.1
- 14. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.4.2
- 15. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.4.3
- 16. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.4.4
- 17. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.4.5
- 18. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.4.6
- 19. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.4.7
- 20. http://gcc.gnu.org/onlinedocs/
+ 8. https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#id476343
+ 9. https://gcc.gnu.org/onlinedocs/gfortran/Preprocessing-Options.html
+ 10. https://gcc.gnu.org/onlinedocs/gfortran/Error-and-Warning-Options.html#index-g_t_0040code_007bWarray-temporaries_007d-125
+ 11. https://gcc.gnu.org/onlinedocs/gfortran/Code-Gen-Options.html#index-g_t_0040code_007bfcheck-array-temporaries_007d-221
+ 12. https://gcc.gnu.org/onlinedocs/gfortran/Fortran-Dialect-Options.html#index-g_t_0040code_007bbackslash_007d-34
+ 13. https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.4.1
+ 14. https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.4.2
+ 15. https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.4.3
+ 16. https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.4.4
+ 17. https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.4.5
+ 18. https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.4.6
+ 19. https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.4.7
+ 20. https://gcc.gnu.org/onlinedocs/
21. mailto:gcc-help@gcc.gnu.org
22. mailto:gcc@gcc.gnu.org
- 23. http://gcc.gnu.org/lists.html
+ 23. https://gcc.gnu.org/lists.html
24. http://www.fsf.org/
- 25. http://gcc.gnu.org/about.html
+ 25. https://gcc.gnu.org/about.html
26. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-4.3/index.html
provided this notice is preserved.
These pages are [20]maintained by the GCC team. Last modified
- 2012-11-02[21].
+ 2014-06-28[21].
References
7. http://gcc.gnu.org/gcc-4.3/changes.html
8. http://gcc.gnu.org/gcc-4.3/changes.html
9. http://gcc.gnu.org/gcc-4.3/buildstat.html
- 10. http://gcc.gnu.org/onlinedocs/gcc/Contributors.html
+ 10. https://gcc.gnu.org/onlinedocs/gcc/Contributors.html
11. http://gcc.gnu.org/index.html
12. mailto:gcc@gcc.gnu.org
13. http://gcc.gnu.org/mirrors.html
14. http://gcc.gnu.org/svn.html
- 15. http://gcc.gnu.org/onlinedocs/
+ 15. https://gcc.gnu.org/onlinedocs/
16. mailto:gcc-help@gcc.gnu.org
17. mailto:gcc@gcc.gnu.org
- 18. http://gcc.gnu.org/lists.html
+ 18. https://gcc.gnu.org/lists.html
19. http://www.fsf.org/
- 20. http://gcc.gnu.org/about.html
+ 20. https://gcc.gnu.org/about.html
21. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-4.3/changes.html
provided this notice is preserved.
These pages are [36]maintained by the GCC team. Last modified
- 2012-11-02[37].
+ 2014-06-28[37].
References
1. http://gcc.gnu.org/gcc-4.3/changes.html#4.3.5
2. http://gmplib.org/
3. http://www.mpfr.org/
- 4. http://gcc.gnu.org/install/prerequisites.html
- 5. http://gcc.gnu.org/ml/gcc-announce/2001/msg00000.html
- 6. http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#Warning-Options
+ 4. https://gcc.gnu.org/install/prerequisites.html
+ 5. https://gcc.gnu.org/ml/gcc-announce/2001/msg00000.html
+ 6. https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#Warning-Options
7. http://gcc.gnu.org/gcc-4.3/porting_to.html
8. http://www.mpfr.org/
9. http://www.mpfr.org/
10. http://www.mpfr.org/
- 11. http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
+ 11. https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
12. http://gcc.gnu.org/gcc-4.3/cxx0x_status.html
13. http://gcc.gnu.org/gcc-4.3/cxx0x_status.html
- 14. http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt01ch01.html#m anual.intro.status.standard.tr1
- 15. http://gcc.gnu.org/onlinedocs/libstdc++/manual/parallel_mode.html
+ 14. https://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt01ch01.html#m anual.intro.status.standard.tr1
+ 15. https://gcc.gnu.org/onlinedocs/libstdc++/manual/parallel_mode.html
16. http://gmplib.org/
17. http://www.mpfr.org/
- 18. http://gcc.gnu.org/onlinedocs/gfortran/Code-Gen-Options.html#Code-Gen-Options
- 19. http://gcc.gnu.org/onlinedocs/gfortran/Code-Gen-Options.html#index-g_t_0040code_007bfinit-local-zero_007d-167
- 20. http://gcc.gnu.org/onlinedocs/gcc-4.3.0/gfortran/GAMMA.html
- 21. http://gcc.gnu.org/onlinedocs/gcc-4.3.0/gfortran/LGAMMA.html
- 22. http://gcc.gnu.org/onlinedocs/gfortran/Fortran-Dialect-Options.html
- 23. http://gcc.gnu.org/onlinedocs/gfortran/BOZ-literal-constants.html
- 24. http://gcc.gnu.org/onlinedocs/libstdc++/
- 25. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.3.1
- 26. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.3.2
- 27. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.3.3
- 28. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.3.4
- 29. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.3.5
- 30. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.3.6
- 31. http://gcc.gnu.org/onlinedocs/
+ 18. https://gcc.gnu.org/onlinedocs/gfortran/Code-Gen-Options.html#Code-Gen-Options
+ 19. https://gcc.gnu.org/onlinedocs/gfortran/Code-Gen-Options.html#index-g_t_0040code_007bfinit-local-zero_007d-167
+ 20. https://gcc.gnu.org/onlinedocs/gcc-4.3.0/gfortran/GAMMA.html
+ 21. https://gcc.gnu.org/onlinedocs/gcc-4.3.0/gfortran/LGAMMA.html
+ 22. https://gcc.gnu.org/onlinedocs/gfortran/Fortran-Dialect-Options.html
+ 23. https://gcc.gnu.org/onlinedocs/gfortran/BOZ-literal-constants.html
+ 24. https://gcc.gnu.org/onlinedocs/libstdc++/
+ 25. https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.3.1
+ 26. https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.3.2
+ 27. https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.3.3
+ 28. https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.3.4
+ 29. https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.3.5
+ 30. https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.3.6
+ 31. https://gcc.gnu.org/onlinedocs/
32. mailto:gcc-help@gcc.gnu.org
33. mailto:gcc@gcc.gnu.org
- 34. http://gcc.gnu.org/lists.html
+ 34. https://gcc.gnu.org/lists.html
35. http://www.fsf.org/
- 36. http://gcc.gnu.org/about.html
+ 36. https://gcc.gnu.org/about.html
37. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-4.2/index.html
provided this notice is preserved.
These pages are [18]maintained by the GCC team. Last modified
- 2012-11-02[19].
+ 2014-06-28[19].
References
5. http://gcc.gnu.org/gcc-4.2/changes.html
6. http://gcc.gnu.org/gcc-4.2/changes.html
7. http://gcc.gnu.org/gcc-4.2/buildstat.html
- 8. http://gcc.gnu.org/onlinedocs/gcc/Contributors.html
+ 8. https://gcc.gnu.org/onlinedocs/gcc/Contributors.html
9. http://gcc.gnu.org/index.html
10. mailto:gcc@gcc.gnu.org
11. http://gcc.gnu.org/mirrors.html
12. http://gcc.gnu.org/svn.html
- 13. http://gcc.gnu.org/onlinedocs/
+ 13. https://gcc.gnu.org/onlinedocs/
14. mailto:gcc-help@gcc.gnu.org
15. mailto:gcc@gcc.gnu.org
- 16. http://gcc.gnu.org/lists.html
+ 16. https://gcc.gnu.org/lists.html
17. http://www.fsf.org/
- 18. http://gcc.gnu.org/about.html
+ 18. https://gcc.gnu.org/about.html
19. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-4.2/changes.html
memory than if the shared version of libgcj were used. However
caution should be used as it can also cause essential parts of the
library to be omitted. Some of these issues are discussed in:
- [6]http://gcc.gnu.org/wiki/Statically_linking_libgcj
+ [6]https://gcc.gnu.org/wiki/Statically_linking_libgcj
* fastjar is no longer bundled with GCC. To build libgcj, you will
need either InfoZIP (both zip and unzip) or an external jar
program. In the former case, the GCC build will install a jar shell
provided this notice is preserved.
These pages are [12]maintained by the GCC team. Last modified
- 2012-11-02[13].
+ 2014-06-28[13].
References
1. http://gcc.gnu.org/projects/gomp/
- 2. http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
- 3. http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt01ch01.html#manual.intro.status.standard.tr1
- 4. http://gcc.gnu.org/onlinedocs/libstdc++/ext/pb_ds/index.html
- 5. http://gcc.gnu.org/onlinedocs/gfortran/Runtime-Options.html
- 6. http://gcc.gnu.org/wiki/Statically_linking_libgcj
- 7. http://gcc.gnu.org/onlinedocs/
+ 2. https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
+ 3. https://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt01ch01.html#manual.intro.status.standard.tr1
+ 4. https://gcc.gnu.org/onlinedocs/libstdc++/ext/pb_ds/index.html
+ 5. https://gcc.gnu.org/onlinedocs/gfortran/Runtime-Options.html
+ 6. https://gcc.gnu.org/wiki/Statically_linking_libgcj
+ 7. https://gcc.gnu.org/onlinedocs/
8. mailto:gcc-help@gcc.gnu.org
9. mailto:gcc@gcc.gnu.org
- 10. http://gcc.gnu.org/lists.html
+ 10. https://gcc.gnu.org/lists.html
11. http://www.fsf.org/
- 12. http://gcc.gnu.org/about.html
+ 12. https://gcc.gnu.org/about.html
13. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-4.1/index.html
provided this notice is preserved.
These pages are [16]maintained by the GCC team. Last modified
- 2012-11-02[17].
+ 2014-06-28[17].
References
3. http://gcc.gnu.org/gcc-4.1/changes.html
4. http://gcc.gnu.org/gcc-4.1/changes.html
5. http://gcc.gnu.org/gcc-4.1/buildstat.html
- 6. http://gcc.gnu.org/onlinedocs/gcc/Contributors.html
+ 6. https://gcc.gnu.org/onlinedocs/gcc/Contributors.html
7. http://gcc.gnu.org/index.html
8. mailto:gcc@gcc.gnu.org
9. http://gcc.gnu.org/mirrors.html
10. http://gcc.gnu.org/svn.html
- 11. http://gcc.gnu.org/onlinedocs/
+ 11. https://gcc.gnu.org/onlinedocs/
12. mailto:gcc-help@gcc.gnu.org
13. mailto:gcc@gcc.gnu.org
- 14. http://gcc.gnu.org/lists.html
+ 14. https://gcc.gnu.org/lists.html
15. http://www.fsf.org/
- 16. http://gcc.gnu.org/about.html
+ 16. https://gcc.gnu.org/about.html
17. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-4.1/changes.html
most of the work is currently being done around gcj/gij
we want this framework to be as VM neutral as possible.
Early design is described in:
- [3]http://gcc.gnu.org/ml/java/2005-05/msg00260.html
+ [3]https://gcc.gnu.org/ml/java/2005-05/msg00260.html
o QT4 AWT peers, enable by giving configure
--enable-qt-peer. Included, but not ready for production
yet. They are explicitly disabled and not supported. But
provided this notice is preserved.
These pages are [12]maintained by the GCC team. Last modified
- 2012-11-02[13].
+ 2014-06-28[13].
References
1. http://gcc.gnu.org/gcc-4.1/changes.html#4.1.2
2. http://developer.classpath.org/mediation/ClasspathGraphicsImagesText
- 3. http://gcc.gnu.org/ml/java/2005-05/msg00260.html
+ 3. https://gcc.gnu.org/ml/java/2005-05/msg00260.html
4. http://developer.classpath.org/doc/
- 5. http://gcc.gnu.org/onlinedocs/gcc-4.1.0/gcc/Atomic-Builtins.html
- 6. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.1.2
- 7. http://gcc.gnu.org/onlinedocs/
+ 5. https://gcc.gnu.org/onlinedocs/gcc-4.1.0/gcc/Atomic-Builtins.html
+ 6. https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.1.2
+ 7. https://gcc.gnu.org/onlinedocs/
8. mailto:gcc-help@gcc.gnu.org
9. mailto:gcc@gcc.gnu.org
- 10. http://gcc.gnu.org/lists.html
+ 10. https://gcc.gnu.org/lists.html
11. http://www.fsf.org/
- 12. http://gcc.gnu.org/about.html
+ 12. https://gcc.gnu.org/about.html
13. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-4.0/index.html
provided this notice is preserved.
These pages are [18]maintained by the GCC team. Last modified
- 2012-11-02[19].
+ 2014-06-28[19].
References
5. http://gcc.gnu.org/gcc-4.0/changes.html#4.0.1
6. http://gcc.gnu.org/gcc-4.0/changes.html
7. http://gcc.gnu.org/gcc-4.0/buildstat.html
- 8. http://gcc.gnu.org/onlinedocs/gcc/Contributors.html
+ 8. https://gcc.gnu.org/onlinedocs/gcc/Contributors.html
9. http://gcc.gnu.org/index.html
10. mailto:gcc@gcc.gnu.org
11. http://gcc.gnu.org/mirrors.html
12. http://gcc.gnu.org/svn.html
- 13. http://gcc.gnu.org/onlinedocs/
+ 13. https://gcc.gnu.org/onlinedocs/
14. mailto:gcc-help@gcc.gnu.org
15. mailto:gcc@gcc.gnu.org
- 16. http://gcc.gnu.org/lists.html
+ 16. https://gcc.gnu.org/lists.html
17. http://www.fsf.org/
- 18. http://gcc.gnu.org/about.html
+ 18. https://gcc.gnu.org/about.html
19. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-4.0/changes.html
solving problems many projects such as python were forced to use
RTLD_LOCAL for (with its resulting issues for C++ correctness). You
can find more information about using these options at
- [11]http://gcc.gnu.org/wiki/Visibility.
+ [11]https://gcc.gnu.org/wiki/Visibility.
__________________________________________________________________
GCC 4.0.1
provided this notice is preserved.
These pages are [21]maintained by the GCC team. Last modified
- 2012-11-02[22].
+ 2014-06-28[22].
References
7. http://gcc.gnu.org/gcc-4.0/changes.html#visibility
8. http://mentorembedded.github.com/cxx-abi/
9. http://gcc.gnu.org/fortran/
- 10. http://gcc.gnu.org/install/
- 11. http://gcc.gnu.org/wiki/Visibility
- 12. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.0.1
- 13. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.0.2
- 14. http://gcc.gnu.org/ml/gcc-cvs/2005-09/msg00984.html
- 15. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.0.4
- 16. http://gcc.gnu.org/onlinedocs/
+ 10. https://gcc.gnu.org/install/
+ 11. https://gcc.gnu.org/wiki/Visibility
+ 12. https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.0.1
+ 13. https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.0.2
+ 14. https://gcc.gnu.org/ml/gcc-cvs/2005-09/msg00984.html
+ 15. https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.0.4
+ 16. https://gcc.gnu.org/onlinedocs/
17. mailto:gcc-help@gcc.gnu.org
18. mailto:gcc@gcc.gnu.org
- 19. http://gcc.gnu.org/lists.html
+ 19. https://gcc.gnu.org/lists.html
20. http://www.fsf.org/
- 21. http://gcc.gnu.org/about.html
+ 21. https://gcc.gnu.org/about.html
22. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-3.4/index.html
provided this notice is preserved.
These pages are [22]maintained by the GCC team. Last modified
- 2012-11-02[23].
+ 2014-06-28[23].
References
1. http://www.gnu.org/
2. http://gcc.gnu.org/gcc-3.4/changes.html
- 3. http://gcc.gnu.org/onlinedocs/gcc/Contributors.html
+ 3. https://gcc.gnu.org/onlinedocs/gcc/Contributors.html
4. http://gcc.gnu.org/gcc-3.4/changes.html#3.4.6
5. http://gcc.gnu.org/gcc-3.4/changes.html#3.4.5
6. http://gcc.gnu.org/gcc-3.4/changes.html#3.4.4
9. http://gcc.gnu.org/gcc-3.4/changes.html#3.4.1
10. http://gcc.gnu.org/gcc-3.4/changes.html
11. http://gcc.gnu.org/gcc-3.4/buildstat.html
- 12. http://gcc.gnu.org/onlinedocs/gcc/Contributors.html
+ 12. https://gcc.gnu.org/onlinedocs/gcc/Contributors.html
13. http://gcc.gnu.org/index.html
14. mailto:gcc@gcc.gnu.org
15. http://gcc.gnu.org/mirrors.html
16. http://gcc.gnu.org/svn.html
- 17. http://gcc.gnu.org/onlinedocs/
+ 17. https://gcc.gnu.org/onlinedocs/
18. mailto:gcc-help@gcc.gnu.org
19. mailto:gcc@gcc.gnu.org
- 20. http://gcc.gnu.org/lists.html
+ 20. https://gcc.gnu.org/lists.html
21. http://www.fsf.org/
- 22. http://gcc.gnu.org/about.html
+ 22. https://gcc.gnu.org/about.html
23. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-3.4/changes.html
provided this notice is preserved.
These pages are [417]maintained by the GCC team. Last modified
- 2012-11-02[418].
+ 2014-06-28[418].
References
5. http://gcc.gnu.org/gcc-3.4/mips-abi.html
6. http://gcc.gnu.org/gcc-3.4/sparc-abi.html
7. http://www.boost.org/
- 8. http://gcc.gnu.org/PR11953
- 9. http://gcc.gnu.org/PR8361
- 10. http://gcc.gnu.org/onlinedocs/gcc-3.4.3/gcc/Other-Builtins.html#Other%20Builtins
+ 8. https://gcc.gnu.org/PR11953
+ 9. https://gcc.gnu.org/PR8361
+ 10. https://gcc.gnu.org/onlinedocs/gcc-3.4.3/gcc/Other-Builtins.html#Other%20Builtins
11. http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#209
12. http://gcc.gnu.org/bugs/#cxx_rvalbind
- 13. http://gcc.gnu.org/onlinedocs/gcc-3.4.3/gcc/Objective-C-Dialect-Options.html
- 14. http://gcc.gnu.org/onlinedocs/gcc-3.4.3/gcc/Objective-C-Dialect-Options.html
- 15. http://gcc.gnu.org/onlinedocs/gcc-3.4.3/gcc/Objective-C-Dialect-Options.html
+ 13. https://gcc.gnu.org/onlinedocs/gcc-3.4.3/gcc/Objective-C-Dialect-Options.html
+ 14. https://gcc.gnu.org/onlinedocs/gcc-3.4.3/gcc/Objective-C-Dialect-Options.html
+ 15. https://gcc.gnu.org/onlinedocs/gcc-3.4.3/gcc/Objective-C-Dialect-Options.html
16. http://www.gnu.org/software/classpath/
17. http://www.eclipse.org/
- 18. http://gcc.gnu.org/onlinedocs/gcc-3.4.3/g77/News.html
- 19. http://gcc.gnu.org/onlinedocs/gcc-3.4.3/gcc/Alpha-Built-in-Functions.html
+ 18. https://gcc.gnu.org/onlinedocs/gcc-3.4.3/g77/News.html
+ 19. https://gcc.gnu.org/onlinedocs/gcc-3.4.3/gcc/Alpha-Built-in-Functions.html
20. http://h30097.www3.hp.com/docs/base_doc/DOCUMENTATION/V51A_HTML/ARH9MBTE/DTMNPLTN.HTM#normal-argument-list-structure
- 21. http://gcc.gnu.org/onlinedocs/gcc-3.4.3/gccint/Processor-pipeline-description.html
- 22. http://gcc.gnu.org/onlinedocs/gcc-3.4.3/gccint/Comparison-of-the-two-descriptions.html
- 23. http://gcc.gnu.org/onlinedocs/gcc-3.4.3/gccint/Processor-pipeline-description.html
+ 21. https://gcc.gnu.org/onlinedocs/gcc-3.4.3/gccint/Processor-pipeline-description.html
+ 22. https://gcc.gnu.org/onlinedocs/gcc-3.4.3/gccint/Comparison-of-the-two-descriptions.html
+ 23. https://gcc.gnu.org/onlinedocs/gcc-3.4.3/gccint/Processor-pipeline-description.html
24. http://gcc.gnu.org/gcc-3.4/mips-abi.html
25. http://gcc.gnu.org/gcc-3.4/powerpc-abi.html
26. http://gcc.gnu.org/gcc-3.4/sparc-abi.html
- 27. http://gcc.gnu.org/bugzilla/buglist.cgi?short_desc_type=notregexp&short_desc=%5C%5B3%5C.4.*%5BRr%5Degression&target_milestone=3.4.0&bug_status=RESOLVED&resolution=FIXED
- 28. http://gcc.gnu.org/PR10129
- 29. http://gcc.gnu.org/PR14576
- 30. http://gcc.gnu.org/PR14760
- 31. http://gcc.gnu.org/PR14671
- 32. http://gcc.gnu.org/PR15093
- 33. http://gcc.gnu.org/PR15178
- 34. http://gcc.gnu.org/PR12753
- 35. http://gcc.gnu.org/PR13985
- 36. http://gcc.gnu.org/PR14810
- 37. http://gcc.gnu.org/PR14883
- 38. http://gcc.gnu.org/PR15044
- 39. http://gcc.gnu.org/PR15057
- 40. http://gcc.gnu.org/PR15064
- 41. http://gcc.gnu.org/PR15142
- 42. http://gcc.gnu.org/PR15159
- 43. http://gcc.gnu.org/PR15165
- 44. http://gcc.gnu.org/PR15193
- 45. http://gcc.gnu.org/PR15209
- 46. http://gcc.gnu.org/PR15227
- 47. http://gcc.gnu.org/PR15285
- 48. http://gcc.gnu.org/PR15299
- 49. http://gcc.gnu.org/PR15329
- 50. http://gcc.gnu.org/PR15550
- 51. http://gcc.gnu.org/PR15554
- 52. http://gcc.gnu.org/PR15640
- 53. http://gcc.gnu.org/PR15666
- 54. http://gcc.gnu.org/PR15696
- 55. http://gcc.gnu.org/PR15701
- 56. http://gcc.gnu.org/PR15761
- 57. http://gcc.gnu.org/PR15829
- 58. http://gcc.gnu.org/PR14538
- 59. http://gcc.gnu.org/PR12391
- 60. http://gcc.gnu.org/PR14649
- 61. http://gcc.gnu.org/PR15004
- 62. http://gcc.gnu.org/PR15749
- 63. http://gcc.gnu.org/PR10646
- 64. http://gcc.gnu.org/PR12077
- 65. http://gcc.gnu.org/PR13598
- 66. http://gcc.gnu.org/PR14211
- 67. http://gcc.gnu.org/PR14220
- 68. http://gcc.gnu.org/PR14245
- 69. http://gcc.gnu.org/PR14340
- 70. http://gcc.gnu.org/PR14600
- 71. http://gcc.gnu.org/PR14668
- 72. http://gcc.gnu.org/PR14775
- 73. http://gcc.gnu.org/PR14821
- 74. http://gcc.gnu.org/PR14930
- 75. http://gcc.gnu.org/PR14932
- 76. http://gcc.gnu.org/PR14950
- 77. http://gcc.gnu.org/PR14962
- 78. http://gcc.gnu.org/PR14975
- 79. http://gcc.gnu.org/PR15002
- 80. http://gcc.gnu.org/PR15025
- 81. http://gcc.gnu.org/PR15046
- 82. http://gcc.gnu.org/PR15069
- 83. http://gcc.gnu.org/PR15074
- 84. http://gcc.gnu.org/PR15083
- 85. http://gcc.gnu.org/PR15096
- 86. http://gcc.gnu.org/PR15287
- 87. http://gcc.gnu.org/PR15317
- 88. http://gcc.gnu.org/PR15337
- 89. http://gcc.gnu.org/PR15361
- 90. http://gcc.gnu.org/PR15412
- 91. http://gcc.gnu.org/PR15427
- 92. http://gcc.gnu.org/PR15471
- 93. http://gcc.gnu.org/PR15503
- 94. http://gcc.gnu.org/PR15507
- 95. http://gcc.gnu.org/PR15542
- 96. http://gcc.gnu.org/PR15565
- 97. http://gcc.gnu.org/PR15625
- 98. http://gcc.gnu.org/PR15629
- 99. http://gcc.gnu.org/PR15742
- 100. http://gcc.gnu.org/PR15775
- 101. http://gcc.gnu.org/PR15821
- 102. http://gcc.gnu.org/PR15862
- 103. http://gcc.gnu.org/PR15875
- 104. http://gcc.gnu.org/PR15877
- 105. http://gcc.gnu.org/PR15947
- 106. http://gcc.gnu.org/PR16020
- 107. http://gcc.gnu.org/PR16154
- 108. http://gcc.gnu.org/PR16174
- 109. http://gcc.gnu.org/PR14315
- 110. http://gcc.gnu.org/PR15151
- 111. http://gcc.gnu.org/PR7993
- 112. http://gcc.gnu.org/PR15228
- 113. http://gcc.gnu.org/PR15345
- 114. http://gcc.gnu.org/PR15945
- 115. http://gcc.gnu.org/PR15526
- 116. http://gcc.gnu.org/PR14690
- 117. http://gcc.gnu.org/PR15112
- 118. http://gcc.gnu.org/PR15067
- 119. http://gcc.gnu.org/PR1963
- 120. http://gcc.gnu.org/PR15717
- 121. http://gcc.gnu.org/PR14782
- 122. http://gcc.gnu.org/PR14828
- 123. http://gcc.gnu.org/PR15202
- 124. http://gcc.gnu.org/PR14610
- 125. http://gcc.gnu.org/PR14813
- 126. http://gcc.gnu.org/PR14857
- 127. http://gcc.gnu.org/PR15598
- 128. http://gcc.gnu.org/PR15653
- 129. http://gcc.gnu.org/PR15189
- 130. http://gcc.gnu.org/PR15331
- 131. http://gcc.gnu.org/PR16144
- 132. http://gcc.gnu.org/PR16176
- 133. http://gcc.gnu.org/PR11591
- 134. http://gcc.gnu.org/PR12028
- 135. http://gcc.gnu.org/PR14478
- 136. http://gcc.gnu.org/PR14567
- 137. http://gcc.gnu.org/PR14715
- 138. http://gcc.gnu.org/PR14902
- 139. http://gcc.gnu.org/PR14924
- 140. http://gcc.gnu.org/PR14960
- 141. http://gcc.gnu.org/PR15106
- 142. http://gcc.gnu.org/PR16026
- 143. http://gcc.gnu.org/PR15191
- 144. http://gcc.gnu.org/PR15662
- 145. http://gcc.gnu.org/PR15054
- 146. http://gcc.gnu.org/PR15783
- 147. http://gcc.gnu.org/PR15626
- 148. http://gcc.gnu.org/PR14326
- 149. http://gcc.gnu.org/PR14723
- 150. http://gcc.gnu.org/PR15290
- 151. http://gcc.gnu.org/PR15250
- 152. http://gcc.gnu.org/PR15551
- 153. http://gcc.gnu.org/PR8309
- 154. http://gcc.gnu.org/PR13250
- 155. http://gcc.gnu.org/PR13803
- 156. http://gcc.gnu.org/PR14093
- 157. http://gcc.gnu.org/PR14457
- 158. http://gcc.gnu.org/PR14542
- 159. http://gcc.gnu.org/PR15100
- 160. http://gcc.gnu.org/PR15296
- 161. http://gcc.gnu.org/PR15396
- 162. http://gcc.gnu.org/PR15782
- 163. http://gcc.gnu.org/PR11610
- 164. http://gcc.gnu.org/PR15488
- 165. http://gcc.gnu.org/PR15489
- 166. http://gcc.gnu.org/PR13928
- 167. http://gcc.gnu.org/PR14150
- 168. http://gcc.gnu.org/PR14949
- 169. http://gcc.gnu.org/PR15123
- 170. http://gcc.gnu.org/PR16469
- 171. http://gcc.gnu.org/PR16344
- 172. http://gcc.gnu.org/PR16842
- 173. http://gcc.gnu.org/PR12608
- 174. http://gcc.gnu.org/PR14492
- 175. http://gcc.gnu.org/PR15461
- 176. http://gcc.gnu.org/PR15890
- 177. http://gcc.gnu.org/PR16180
- 178. http://gcc.gnu.org/PR16224
- 179. http://gcc.gnu.org/PR16408
- 180. http://gcc.gnu.org/PR16529
- 181. http://gcc.gnu.org/PR16698
- 182. http://gcc.gnu.org/PR16706
- 183. http://gcc.gnu.org/PR16810
- 184. http://gcc.gnu.org/PR16851
- 185. http://gcc.gnu.org/PR16870
- 186. http://gcc.gnu.org/PR16904
- 187. http://gcc.gnu.org/PR16905
- 188. http://gcc.gnu.org/PR16964
- 189. http://gcc.gnu.org/PR17068
- 190. http://gcc.gnu.org/PR16366
- 191. http://gcc.gnu.org/PR15345
- 192. http://gcc.gnu.org/PR16590
- 193. http://gcc.gnu.org/PR16693
- 194. http://gcc.gnu.org/PR17078
- 195. http://gcc.gnu.org/PR13956
- 196. http://gcc.gnu.org/PR16684
- 197. http://gcc.gnu.org/PR12658
- 198. http://gcc.gnu.org/PR13092
- 199. http://gcc.gnu.org/PR15320
- 200. http://gcc.gnu.org/PR16246
- 201. http://gcc.gnu.org/PR16273
- 202. http://gcc.gnu.org/PR16401
- 203. http://gcc.gnu.org/PR16411
- 204. http://gcc.gnu.org/PR16489
- 205. http://gcc.gnu.org/PR16618
- 206. http://gcc.gnu.org/PR16637
- 207. http://gcc.gnu.org/PR16717
- 208. http://gcc.gnu.org/PR16813
- 209. http://gcc.gnu.org/PR16853
- 210. http://gcc.gnu.org/PR16889
- 211. http://gcc.gnu.org/PR16959
- 212. http://gcc.gnu.org/PR7587
- 213. http://gcc.gnu.org/PR16473
- 214. http://gcc.gnu.org/PR16478
- 215. http://gcc.gnu.org/PR10695
- 216. http://gcc.gnu.org/PR16974
- 217. http://gcc.gnu.org/PR16298
- 218. http://gcc.gnu.org/PR17113
- 219. http://gcc.gnu.org/PR14697
- 220. http://gcc.gnu.org/PR15869
- 221. http://gcc.gnu.org/PR16325
- 222. http://gcc.gnu.org/PR16357
- 223. http://gcc.gnu.org/PR16380
- 224. http://gcc.gnu.org/PR16407
- 225. http://gcc.gnu.org/PR16643
- 226. http://gcc.gnu.org/PR15927
- 227. http://gcc.gnu.org/PR15948
- 228. http://gcc.gnu.org/PR17019
- 229. http://gcc.gnu.org/PR16130
- 230. http://gcc.gnu.org/PR16142
- 231. http://gcc.gnu.org/PR16278
- 232. http://gcc.gnu.org/PR16414
- 233. http://gcc.gnu.org/PR16445
- 234. http://gcc.gnu.org/PR16490
- 235. http://gcc.gnu.org/PR16683
- 236. http://gcc.gnu.org/PR16195
- 237. http://gcc.gnu.org/PR16239
- 238. http://gcc.gnu.org/PR16199
- 239. http://gcc.gnu.org/PR16416
- 240. http://gcc.gnu.org/PR16430
- 241. http://gcc.gnu.org/PR16379
- 242. http://gcc.gnu.org/PR17093
- 243. http://gcc.gnu.org/PR17119
- 244. http://gcc.gnu.org/PR15928
- 245. http://gcc.gnu.org/PR16210
- 246. http://gcc.gnu.org/PR15488
- 247. http://gcc.gnu.org/PR16250
- 248. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=3.4.3
- 249. http://gcc.gnu.org/PR17369
- 250. http://gcc.gnu.org/PR17850
- 251. http://gcc.gnu.org/PR13948
- 252. http://gcc.gnu.org/PR14492
- 253. http://gcc.gnu.org/PR16301
- 254. http://gcc.gnu.org/PR16566
- 255. http://gcc.gnu.org/PR17023
- 256. http://gcc.gnu.org/PR17027
- 257. http://gcc.gnu.org/PR17524
- 258. http://gcc.gnu.org/PR17826
- 259. http://gcc.gnu.org/PR15526
- 260. http://gcc.gnu.org/PR16999
- 261. http://gcc.gnu.org/PR17503
- 262. http://gcc.gnu.org/PR17581
- 263. http://gcc.gnu.org/PR18129
- 264. http://gcc.gnu.org/PR10975
- 265. http://gcc.gnu.org/PR11722
- 266. http://gcc.gnu.org/PR14534
- 267. http://gcc.gnu.org/PR15172
- 268. http://gcc.gnu.org/PR15786
- 269. http://gcc.gnu.org/PR16162
- 270. http://gcc.gnu.org/PR16612
- 271. http://gcc.gnu.org/PR16715
- 272. http://gcc.gnu.org/PR16848
- 273. http://gcc.gnu.org/PR17132
- 274. http://gcc.gnu.org/PR17259
- 275. http://gcc.gnu.org/PR17327
- 276. http://gcc.gnu.org/PR17393
- 277. http://gcc.gnu.org/PR17501
- 278. http://gcc.gnu.org/PR17537
- 279. http://gcc.gnu.org/PR17585
- 280. http://gcc.gnu.org/PR17821
- 281. http://gcc.gnu.org/PR17829
- 282. http://gcc.gnu.org/PR17851
- 283. http://gcc.gnu.org/PR17976
- 284. http://gcc.gnu.org/PR18020
- 285. http://gcc.gnu.org/PR18093
- 286. http://gcc.gnu.org/PR18140
- 287. http://gcc.gnu.org/PR17541
- 288. http://gcc.gnu.org/PR17853
- 289. http://gcc.gnu.org/PR17245
- 290. http://gcc.gnu.org/PR17167
- 291. http://gcc.gnu.org/PR17277
- 292. http://gcc.gnu.org/PR17505
- 293. http://gcc.gnu.org/PR17684
- 294. http://gcc.gnu.org/PR17384
- 295. http://gcc.gnu.org/PR17770
- 296. http://gcc.gnu.org/PR11476
- 297. http://gcc.gnu.org/PR14064
- 298. http://gcc.gnu.org/PR14678
- 299. http://gcc.gnu.org/PR15583
- 300. http://gcc.gnu.org/PR15790
- 301. http://gcc.gnu.org/PR15886
- 302. http://gcc.gnu.org/PR16884
- 303. http://gcc.gnu.org/PR13841
- 304. http://gcc.gnu.org/PR15860
- 305. http://gcc.gnu.org/PR17465
- 306. http://gcc.gnu.org/PR17469
- 307. http://gcc.gnu.org/PR18138
- 308. http://gcc.gnu.org/PR15498
- 309. http://gcc.gnu.org/PR15747
- 310. http://gcc.gnu.org/PR16406
- 311. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=3.4.4
- 312. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=3.4.5
- 313. http://gcc.gnu.org/PR24688
- 314. http://gcc.gnu.org/PR17188
- 315. http://gcc.gnu.org/PR20187
- 316. http://gcc.gnu.org/PR21873
- 317. http://gcc.gnu.org/PR21899
- 318. http://gcc.gnu.org/PR22061
- 319. http://gcc.gnu.org/PR22208
- 320. http://gcc.gnu.org/PR22458
- 321. http://gcc.gnu.org/PR22589
- 322. http://gcc.gnu.org/PR24101
- 323. http://gcc.gnu.org/PR10611
- 324. http://gcc.gnu.org/PR13377
- 325. http://gcc.gnu.org/PR16002
- 326. http://gcc.gnu.org/PR17413
- 327. http://gcc.gnu.org/PR17609
- 328. http://gcc.gnu.org/PR17618
- 329. http://gcc.gnu.org/PR18124
- 330. http://gcc.gnu.org/PR18155
- 331. http://gcc.gnu.org/PR18177
- 332. http://gcc.gnu.org/PR18368
- 333. http://gcc.gnu.org/PR18378
- 334. http://gcc.gnu.org/PR18466
- 335. http://gcc.gnu.org/PR18512
- 336. http://gcc.gnu.org/PR18545
- 337. http://gcc.gnu.org/PR18738
- 338. http://gcc.gnu.org/PR18803
- 339. http://gcc.gnu.org/PR19004
- 340. http://gcc.gnu.org/PR19208
- 341. http://gcc.gnu.org/PR19253
- 342. http://gcc.gnu.org/PR19608
- 343. http://gcc.gnu.org/PR19884
- 344. http://gcc.gnu.org/PR20153
- 345. http://gcc.gnu.org/PR20563
- 346. http://gcc.gnu.org/PR20789
- 347. http://gcc.gnu.org/PR21336
- 348. http://gcc.gnu.org/PR21768
- 349. http://gcc.gnu.org/PR21853
- 350. http://gcc.gnu.org/PR21903
- 351. http://gcc.gnu.org/PR21983
- 352. http://gcc.gnu.org/PR21987
- 353. http://gcc.gnu.org/PR22153
- 354. http://gcc.gnu.org/PR22172
- 355. http://gcc.gnu.org/PR21286
- 356. http://gcc.gnu.org/PR22233
- 357. http://gcc.gnu.org/PR22508
- 358. http://gcc.gnu.org/PR22545
- 359. http://gcc.gnu.org/PR23528
- 360. http://gcc.gnu.org/PR23550
- 361. http://gcc.gnu.org/PR23586
- 362. http://gcc.gnu.org/PR23624
- 363. http://gcc.gnu.org/PR23639
- 364. http://gcc.gnu.org/PR23797
- 365. http://gcc.gnu.org/PR23965
- 366. http://gcc.gnu.org/PR24052
- 367. http://gcc.gnu.org/PR24580
- 368. http://gcc.gnu.org/PR24267
- 369. http://gcc.gnu.org/PR17810
- 370. http://gcc.gnu.org/PR17860
- 371. http://gcc/gnu.org/PR21709
- 372. http://gcc.gnu.org/PR21964
- 373. http://gcc.gnu.org/PR22167
- 374. http://gcc.gnu.org/PR22619
- 375. http://gcc.gnu.org/PR23241
- 376. http://gcc.gnu.org/PR23478
- 377. http://gcc.gnu.org/PR24470
- 378. http://gcc.gnu.org/PR24950
- 379. http://gcc.gnu.org/PR14400
- 380. http://gcc.gnu.org/PR14940
- 381. http://gcc.gnu.org/PR20239
- 382. http://gcc.gnu.org/PR15220
- 383. http://gcc.gnu.org/PR19275
- 384. http://gcc.gnu.org/PR21888
- 385. http://gcc.gnu.org/PR15342
- 386. http://gcc.gnu.org/PR23985
- 387. http://gcc.gnu.org/PR16719
- 388. http://gcc.gnu.org/PR21723
- 389. http://gcc.gnu.org/PR21841
- 390. http://gcc.gnu.org/PR23644
- 391. http://gcc.gnu.org/PR24718
- 392. http://gcc.gnu.org/PR18421
- 393. http://gcc.gnu.org/PR20621
- 394. http://gcc.gnu.org/PR18583
- 395. http://gcc.gnu.org/PR20191
- 396. http://gcc.gnu.org/PR22083
- 397. http://gcc.gnu.org/PR23070
- 398. http://gcc.gnu.org/PR23404
- 399. http://gcc.gnu.org/PR23539
- 400. http://gcc.gnu.org/PR24102
- 401. http://gcc.gnu.org/PR24465
- 402. http://gcc.gnu.org/PR19933
- 403. http://gcc.gnu.org/PR21889
- 404. http://gcc.gnu.org/PR19300
- 405. http://gcc.gnu.org/PR20301
- 406. http://gcc.gnu.org/PR20673
- 407. http://gcc.gnu.org/PR18582
- 408. http://gcc.gnu.org/PR19340
- 409. http://gcc.gnu.org/PR21716
- 410. http://gcc.gnu.org/PR24315
- 411. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=3.4.6
- 412. http://gcc.gnu.org/onlinedocs/
+ 27. https://gcc.gnu.org/bugzilla/buglist.cgi?short_desc_type=notregexp&short_desc=%5C%5B3%5C.4.*%5BRr%5Degression&target_milestone=3.4.0&bug_status=RESOLVED&resolution=FIXED
+ 28. https://gcc.gnu.org/PR10129
+ 29. https://gcc.gnu.org/PR14576
+ 30. https://gcc.gnu.org/PR14760
+ 31. https://gcc.gnu.org/PR14671
+ 32. https://gcc.gnu.org/PR15093
+ 33. https://gcc.gnu.org/PR15178
+ 34. https://gcc.gnu.org/PR12753
+ 35. https://gcc.gnu.org/PR13985
+ 36. https://gcc.gnu.org/PR14810
+ 37. https://gcc.gnu.org/PR14883
+ 38. https://gcc.gnu.org/PR15044
+ 39. https://gcc.gnu.org/PR15057
+ 40. https://gcc.gnu.org/PR15064
+ 41. https://gcc.gnu.org/PR15142
+ 42. https://gcc.gnu.org/PR15159
+ 43. https://gcc.gnu.org/PR15165
+ 44. https://gcc.gnu.org/PR15193
+ 45. https://gcc.gnu.org/PR15209
+ 46. https://gcc.gnu.org/PR15227
+ 47. https://gcc.gnu.org/PR15285
+ 48. https://gcc.gnu.org/PR15299
+ 49. https://gcc.gnu.org/PR15329
+ 50. https://gcc.gnu.org/PR15550
+ 51. https://gcc.gnu.org/PR15554
+ 52. https://gcc.gnu.org/PR15640
+ 53. https://gcc.gnu.org/PR15666
+ 54. https://gcc.gnu.org/PR15696
+ 55. https://gcc.gnu.org/PR15701
+ 56. https://gcc.gnu.org/PR15761
+ 57. https://gcc.gnu.org/PR15829
+ 58. https://gcc.gnu.org/PR14538
+ 59. https://gcc.gnu.org/PR12391
+ 60. https://gcc.gnu.org/PR14649
+ 61. https://gcc.gnu.org/PR15004
+ 62. https://gcc.gnu.org/PR15749
+ 63. https://gcc.gnu.org/PR10646
+ 64. https://gcc.gnu.org/PR12077
+ 65. https://gcc.gnu.org/PR13598
+ 66. https://gcc.gnu.org/PR14211
+ 67. https://gcc.gnu.org/PR14220
+ 68. https://gcc.gnu.org/PR14245
+ 69. https://gcc.gnu.org/PR14340
+ 70. https://gcc.gnu.org/PR14600
+ 71. https://gcc.gnu.org/PR14668
+ 72. https://gcc.gnu.org/PR14775
+ 73. https://gcc.gnu.org/PR14821
+ 74. https://gcc.gnu.org/PR14930
+ 75. https://gcc.gnu.org/PR14932
+ 76. https://gcc.gnu.org/PR14950
+ 77. https://gcc.gnu.org/PR14962
+ 78. https://gcc.gnu.org/PR14975
+ 79. https://gcc.gnu.org/PR15002
+ 80. https://gcc.gnu.org/PR15025
+ 81. https://gcc.gnu.org/PR15046
+ 82. https://gcc.gnu.org/PR15069
+ 83. https://gcc.gnu.org/PR15074
+ 84. https://gcc.gnu.org/PR15083
+ 85. https://gcc.gnu.org/PR15096
+ 86. https://gcc.gnu.org/PR15287
+ 87. https://gcc.gnu.org/PR15317
+ 88. https://gcc.gnu.org/PR15337
+ 89. https://gcc.gnu.org/PR15361
+ 90. https://gcc.gnu.org/PR15412
+ 91. https://gcc.gnu.org/PR15427
+ 92. https://gcc.gnu.org/PR15471
+ 93. https://gcc.gnu.org/PR15503
+ 94. https://gcc.gnu.org/PR15507
+ 95. https://gcc.gnu.org/PR15542
+ 96. https://gcc.gnu.org/PR15565
+ 97. https://gcc.gnu.org/PR15625
+ 98. https://gcc.gnu.org/PR15629
+ 99. https://gcc.gnu.org/PR15742
+ 100. https://gcc.gnu.org/PR15775
+ 101. https://gcc.gnu.org/PR15821
+ 102. https://gcc.gnu.org/PR15862
+ 103. https://gcc.gnu.org/PR15875
+ 104. https://gcc.gnu.org/PR15877
+ 105. https://gcc.gnu.org/PR15947
+ 106. https://gcc.gnu.org/PR16020
+ 107. https://gcc.gnu.org/PR16154
+ 108. https://gcc.gnu.org/PR16174
+ 109. https://gcc.gnu.org/PR14315
+ 110. https://gcc.gnu.org/PR15151
+ 111. https://gcc.gnu.org/PR7993
+ 112. https://gcc.gnu.org/PR15228
+ 113. https://gcc.gnu.org/PR15345
+ 114. https://gcc.gnu.org/PR15945
+ 115. https://gcc.gnu.org/PR15526
+ 116. https://gcc.gnu.org/PR14690
+ 117. https://gcc.gnu.org/PR15112
+ 118. https://gcc.gnu.org/PR15067
+ 119. https://gcc.gnu.org/PR1963
+ 120. https://gcc.gnu.org/PR15717
+ 121. https://gcc.gnu.org/PR14782
+ 122. https://gcc.gnu.org/PR14828
+ 123. https://gcc.gnu.org/PR15202
+ 124. https://gcc.gnu.org/PR14610
+ 125. https://gcc.gnu.org/PR14813
+ 126. https://gcc.gnu.org/PR14857
+ 127. https://gcc.gnu.org/PR15598
+ 128. https://gcc.gnu.org/PR15653
+ 129. https://gcc.gnu.org/PR15189
+ 130. https://gcc.gnu.org/PR15331
+ 131. https://gcc.gnu.org/PR16144
+ 132. https://gcc.gnu.org/PR16176
+ 133. https://gcc.gnu.org/PR11591
+ 134. https://gcc.gnu.org/PR12028
+ 135. https://gcc.gnu.org/PR14478
+ 136. https://gcc.gnu.org/PR14567
+ 137. https://gcc.gnu.org/PR14715
+ 138. https://gcc.gnu.org/PR14902
+ 139. https://gcc.gnu.org/PR14924
+ 140. https://gcc.gnu.org/PR14960
+ 141. https://gcc.gnu.org/PR15106
+ 142. https://gcc.gnu.org/PR16026
+ 143. https://gcc.gnu.org/PR15191
+ 144. https://gcc.gnu.org/PR15662
+ 145. https://gcc.gnu.org/PR15054
+ 146. https://gcc.gnu.org/PR15783
+ 147. https://gcc.gnu.org/PR15626
+ 148. https://gcc.gnu.org/PR14326
+ 149. https://gcc.gnu.org/PR14723
+ 150. https://gcc.gnu.org/PR15290
+ 151. https://gcc.gnu.org/PR15250
+ 152. https://gcc.gnu.org/PR15551
+ 153. https://gcc.gnu.org/PR8309
+ 154. https://gcc.gnu.org/PR13250
+ 155. https://gcc.gnu.org/PR13803
+ 156. https://gcc.gnu.org/PR14093
+ 157. https://gcc.gnu.org/PR14457
+ 158. https://gcc.gnu.org/PR14542
+ 159. https://gcc.gnu.org/PR15100
+ 160. https://gcc.gnu.org/PR15296
+ 161. https://gcc.gnu.org/PR15396
+ 162. https://gcc.gnu.org/PR15782
+ 163. https://gcc.gnu.org/PR11610
+ 164. https://gcc.gnu.org/PR15488
+ 165. https://gcc.gnu.org/PR15489
+ 166. https://gcc.gnu.org/PR13928
+ 167. https://gcc.gnu.org/PR14150
+ 168. https://gcc.gnu.org/PR14949
+ 169. https://gcc.gnu.org/PR15123
+ 170. https://gcc.gnu.org/PR16469
+ 171. https://gcc.gnu.org/PR16344
+ 172. https://gcc.gnu.org/PR16842
+ 173. https://gcc.gnu.org/PR12608
+ 174. https://gcc.gnu.org/PR14492
+ 175. https://gcc.gnu.org/PR15461
+ 176. https://gcc.gnu.org/PR15890
+ 177. https://gcc.gnu.org/PR16180
+ 178. https://gcc.gnu.org/PR16224
+ 179. https://gcc.gnu.org/PR16408
+ 180. https://gcc.gnu.org/PR16529
+ 181. https://gcc.gnu.org/PR16698
+ 182. https://gcc.gnu.org/PR16706
+ 183. https://gcc.gnu.org/PR16810
+ 184. https://gcc.gnu.org/PR16851
+ 185. https://gcc.gnu.org/PR16870
+ 186. https://gcc.gnu.org/PR16904
+ 187. https://gcc.gnu.org/PR16905
+ 188. https://gcc.gnu.org/PR16964
+ 189. https://gcc.gnu.org/PR17068
+ 190. https://gcc.gnu.org/PR16366
+ 191. https://gcc.gnu.org/PR15345
+ 192. https://gcc.gnu.org/PR16590
+ 193. https://gcc.gnu.org/PR16693
+ 194. https://gcc.gnu.org/PR17078
+ 195. https://gcc.gnu.org/PR13956
+ 196. https://gcc.gnu.org/PR16684
+ 197. https://gcc.gnu.org/PR12658
+ 198. https://gcc.gnu.org/PR13092
+ 199. https://gcc.gnu.org/PR15320
+ 200. https://gcc.gnu.org/PR16246
+ 201. https://gcc.gnu.org/PR16273
+ 202. https://gcc.gnu.org/PR16401
+ 203. https://gcc.gnu.org/PR16411
+ 204. https://gcc.gnu.org/PR16489
+ 205. https://gcc.gnu.org/PR16618
+ 206. https://gcc.gnu.org/PR16637
+ 207. https://gcc.gnu.org/PR16717
+ 208. https://gcc.gnu.org/PR16813
+ 209. https://gcc.gnu.org/PR16853
+ 210. https://gcc.gnu.org/PR16889
+ 211. https://gcc.gnu.org/PR16959
+ 212. https://gcc.gnu.org/PR7587
+ 213. https://gcc.gnu.org/PR16473
+ 214. https://gcc.gnu.org/PR16478
+ 215. https://gcc.gnu.org/PR10695
+ 216. https://gcc.gnu.org/PR16974
+ 217. https://gcc.gnu.org/PR16298
+ 218. https://gcc.gnu.org/PR17113
+ 219. https://gcc.gnu.org/PR14697
+ 220. https://gcc.gnu.org/PR15869
+ 221. https://gcc.gnu.org/PR16325
+ 222. https://gcc.gnu.org/PR16357
+ 223. https://gcc.gnu.org/PR16380
+ 224. https://gcc.gnu.org/PR16407
+ 225. https://gcc.gnu.org/PR16643
+ 226. https://gcc.gnu.org/PR15927
+ 227. https://gcc.gnu.org/PR15948
+ 228. https://gcc.gnu.org/PR17019
+ 229. https://gcc.gnu.org/PR16130
+ 230. https://gcc.gnu.org/PR16142
+ 231. https://gcc.gnu.org/PR16278
+ 232. https://gcc.gnu.org/PR16414
+ 233. https://gcc.gnu.org/PR16445
+ 234. https://gcc.gnu.org/PR16490
+ 235. https://gcc.gnu.org/PR16683
+ 236. https://gcc.gnu.org/PR16195
+ 237. https://gcc.gnu.org/PR16239
+ 238. https://gcc.gnu.org/PR16199
+ 239. https://gcc.gnu.org/PR16416
+ 240. https://gcc.gnu.org/PR16430
+ 241. https://gcc.gnu.org/PR16379
+ 242. https://gcc.gnu.org/PR17093
+ 243. https://gcc.gnu.org/PR17119
+ 244. https://gcc.gnu.org/PR15928
+ 245. https://gcc.gnu.org/PR16210
+ 246. https://gcc.gnu.org/PR15488
+ 247. https://gcc.gnu.org/PR16250
+ 248. https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=3.4.3
+ 249. https://gcc.gnu.org/PR17369
+ 250. https://gcc.gnu.org/PR17850
+ 251. https://gcc.gnu.org/PR13948
+ 252. https://gcc.gnu.org/PR14492
+ 253. https://gcc.gnu.org/PR16301
+ 254. https://gcc.gnu.org/PR16566
+ 255. https://gcc.gnu.org/PR17023
+ 256. https://gcc.gnu.org/PR17027
+ 257. https://gcc.gnu.org/PR17524
+ 258. https://gcc.gnu.org/PR17826
+ 259. https://gcc.gnu.org/PR15526
+ 260. https://gcc.gnu.org/PR16999
+ 261. https://gcc.gnu.org/PR17503
+ 262. https://gcc.gnu.org/PR17581
+ 263. https://gcc.gnu.org/PR18129
+ 264. https://gcc.gnu.org/PR10975
+ 265. https://gcc.gnu.org/PR11722
+ 266. https://gcc.gnu.org/PR14534
+ 267. https://gcc.gnu.org/PR15172
+ 268. https://gcc.gnu.org/PR15786
+ 269. https://gcc.gnu.org/PR16162
+ 270. https://gcc.gnu.org/PR16612
+ 271. https://gcc.gnu.org/PR16715
+ 272. https://gcc.gnu.org/PR16848
+ 273. https://gcc.gnu.org/PR17132
+ 274. https://gcc.gnu.org/PR17259
+ 275. https://gcc.gnu.org/PR17327
+ 276. https://gcc.gnu.org/PR17393
+ 277. https://gcc.gnu.org/PR17501
+ 278. https://gcc.gnu.org/PR17537
+ 279. https://gcc.gnu.org/PR17585
+ 280. https://gcc.gnu.org/PR17821
+ 281. https://gcc.gnu.org/PR17829
+ 282. https://gcc.gnu.org/PR17851
+ 283. https://gcc.gnu.org/PR17976
+ 284. https://gcc.gnu.org/PR18020
+ 285. https://gcc.gnu.org/PR18093
+ 286. https://gcc.gnu.org/PR18140
+ 287. https://gcc.gnu.org/PR17541
+ 288. https://gcc.gnu.org/PR17853
+ 289. https://gcc.gnu.org/PR17245
+ 290. https://gcc.gnu.org/PR17167
+ 291. https://gcc.gnu.org/PR17277
+ 292. https://gcc.gnu.org/PR17505
+ 293. https://gcc.gnu.org/PR17684
+ 294. https://gcc.gnu.org/PR17384
+ 295. https://gcc.gnu.org/PR17770
+ 296. https://gcc.gnu.org/PR11476
+ 297. https://gcc.gnu.org/PR14064
+ 298. https://gcc.gnu.org/PR14678
+ 299. https://gcc.gnu.org/PR15583
+ 300. https://gcc.gnu.org/PR15790
+ 301. https://gcc.gnu.org/PR15886
+ 302. https://gcc.gnu.org/PR16884
+ 303. https://gcc.gnu.org/PR13841
+ 304. https://gcc.gnu.org/PR15860
+ 305. https://gcc.gnu.org/PR17465
+ 306. https://gcc.gnu.org/PR17469
+ 307. https://gcc.gnu.org/PR18138
+ 308. https://gcc.gnu.org/PR15498
+ 309. https://gcc.gnu.org/PR15747
+ 310. https://gcc.gnu.org/PR16406
+ 311. https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=3.4.4
+ 312. https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=3.4.5
+ 313. https://gcc.gnu.org/PR24688
+ 314. https://gcc.gnu.org/PR17188
+ 315. https://gcc.gnu.org/PR20187
+ 316. https://gcc.gnu.org/PR21873
+ 317. https://gcc.gnu.org/PR21899
+ 318. https://gcc.gnu.org/PR22061
+ 319. https://gcc.gnu.org/PR22208
+ 320. https://gcc.gnu.org/PR22458
+ 321. https://gcc.gnu.org/PR22589
+ 322. https://gcc.gnu.org/PR24101
+ 323. https://gcc.gnu.org/PR10611
+ 324. https://gcc.gnu.org/PR13377
+ 325. https://gcc.gnu.org/PR16002
+ 326. https://gcc.gnu.org/PR17413
+ 327. https://gcc.gnu.org/PR17609
+ 328. https://gcc.gnu.org/PR17618
+ 329. https://gcc.gnu.org/PR18124
+ 330. https://gcc.gnu.org/PR18155
+ 331. https://gcc.gnu.org/PR18177
+ 332. https://gcc.gnu.org/PR18368
+ 333. https://gcc.gnu.org/PR18378
+ 334. https://gcc.gnu.org/PR18466
+ 335. https://gcc.gnu.org/PR18512
+ 336. https://gcc.gnu.org/PR18545
+ 337. https://gcc.gnu.org/PR18738
+ 338. https://gcc.gnu.org/PR18803
+ 339. https://gcc.gnu.org/PR19004
+ 340. https://gcc.gnu.org/PR19208
+ 341. https://gcc.gnu.org/PR19253
+ 342. https://gcc.gnu.org/PR19608
+ 343. https://gcc.gnu.org/PR19884
+ 344. https://gcc.gnu.org/PR20153
+ 345. https://gcc.gnu.org/PR20563
+ 346. https://gcc.gnu.org/PR20789
+ 347. https://gcc.gnu.org/PR21336
+ 348. https://gcc.gnu.org/PR21768
+ 349. https://gcc.gnu.org/PR21853
+ 350. https://gcc.gnu.org/PR21903
+ 351. https://gcc.gnu.org/PR21983
+ 352. https://gcc.gnu.org/PR21987
+ 353. https://gcc.gnu.org/PR22153
+ 354. https://gcc.gnu.org/PR22172
+ 355. https://gcc.gnu.org/PR21286
+ 356. https://gcc.gnu.org/PR22233
+ 357. https://gcc.gnu.org/PR22508
+ 358. https://gcc.gnu.org/PR22545
+ 359. https://gcc.gnu.org/PR23528
+ 360. https://gcc.gnu.org/PR23550
+ 361. https://gcc.gnu.org/PR23586
+ 362. https://gcc.gnu.org/PR23624
+ 363. https://gcc.gnu.org/PR23639
+ 364. https://gcc.gnu.org/PR23797
+ 365. https://gcc.gnu.org/PR23965
+ 366. https://gcc.gnu.org/PR24052
+ 367. https://gcc.gnu.org/PR24580
+ 368. https://gcc.gnu.org/PR24267
+ 369. https://gcc.gnu.org/PR17810
+ 370. https://gcc.gnu.org/PR17860
+ 371. https://gcc.gnu.org/PR21709
+ 372. https://gcc.gnu.org/PR21964
+ 373. https://gcc.gnu.org/PR22167
+ 374. https://gcc.gnu.org/PR22619
+ 375. https://gcc.gnu.org/PR23241
+ 376. https://gcc.gnu.org/PR23478
+ 377. https://gcc.gnu.org/PR24470
+ 378. https://gcc.gnu.org/PR24950
+ 379. https://gcc.gnu.org/PR14400
+ 380. https://gcc.gnu.org/PR14940
+ 381. https://gcc.gnu.org/PR20239
+ 382. https://gcc.gnu.org/PR15220
+ 383. https://gcc.gnu.org/PR19275
+ 384. https://gcc.gnu.org/PR21888
+ 385. https://gcc.gnu.org/PR15342
+ 386. https://gcc.gnu.org/PR23985
+ 387. https://gcc.gnu.org/PR16719
+ 388. https://gcc.gnu.org/PR21723
+ 389. https://gcc.gnu.org/PR21841
+ 390. https://gcc.gnu.org/PR23644
+ 391. https://gcc.gnu.org/PR24718
+ 392. https://gcc.gnu.org/PR18421
+ 393. https://gcc.gnu.org/PR20621
+ 394. https://gcc.gnu.org/PR18583
+ 395. https://gcc.gnu.org/PR20191
+ 396. https://gcc.gnu.org/PR22083
+ 397. https://gcc.gnu.org/PR23070
+ 398. https://gcc.gnu.org/PR23404
+ 399. https://gcc.gnu.org/PR23539
+ 400. https://gcc.gnu.org/PR24102
+ 401. https://gcc.gnu.org/PR24465
+ 402. https://gcc.gnu.org/PR19933
+ 403. https://gcc.gnu.org/PR21889
+ 404. https://gcc.gnu.org/PR19300
+ 405. https://gcc.gnu.org/PR20301
+ 406. https://gcc.gnu.org/PR20673
+ 407. https://gcc.gnu.org/PR18582
+ 408. https://gcc.gnu.org/PR19340
+ 409. https://gcc.gnu.org/PR21716
+ 410. https://gcc.gnu.org/PR24315
+ 411. https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=3.4.6
+ 412. https://gcc.gnu.org/onlinedocs/
413. mailto:gcc-help@gcc.gnu.org
414. mailto:gcc@gcc.gnu.org
- 415. http://gcc.gnu.org/lists.html
+ 415. https://gcc.gnu.org/lists.html
416. http://www.fsf.org/
- 417. http://gcc.gnu.org/about.html
+ 417. https://gcc.gnu.org/about.html
418. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-3.3/index.html
provided this notice is preserved.
These pages are [21]maintained by the GCC team. Last modified
- 2012-11-02[22].
+ 2014-06-28[22].
References
1. http://www.gnu.org/
2. http://gcc.gnu.org/gcc-3.3/changes.html
- 3. http://gcc.gnu.org/onlinedocs/gcc/Contributors.html
+ 3. https://gcc.gnu.org/onlinedocs/gcc/Contributors.html
4. http://gcc.gnu.org/gcc-3.3/changes.html#3.3.6
5. http://gcc.gnu.org/gcc-3.3/changes.html#3.3.5
6. http://gcc.gnu.org/gcc-3.3/changes.html#3.3.4
9. http://gcc.gnu.org/gcc-3.3/changes.html#3.3.1
10. http://gcc.gnu.org/gcc-3.3/changes.html
11. http://gcc.gnu.org/gcc-3.3/buildstat.html
- 12. http://gcc.gnu.org/onlinedocs/gcc/Contributors.html
+ 12. https://gcc.gnu.org/onlinedocs/gcc/Contributors.html
13. http://gcc.gnu.org/index.html
14. mailto:gcc@gcc.gnu.org
15. http://gcc.gnu.org/mirrors.html
- 16. http://gcc.gnu.org/onlinedocs/
+ 16. https://gcc.gnu.org/onlinedocs/
17. mailto:gcc-help@gcc.gnu.org
18. mailto:gcc@gcc.gnu.org
- 19. http://gcc.gnu.org/lists.html
+ 19. https://gcc.gnu.org/lists.html
20. http://www.fsf.org/
- 21. http://gcc.gnu.org/about.html
+ 21. https://gcc.gnu.org/about.html
22. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-3.3/changes.html
Bug Fixes
- This section lists the problem reports (PRs) from [335]GCC's bug
- tracking system that are known to be fixed in the 3.3.2 release. This
- list might not be complete (that is, it is possible that some PRs that
- have been fixed are not listed here).
+ This section lists the problem reports (PRs) from GCC's bug tracker
+ that are known to be fixed in the 3.3.2 release. This list might not be
+ complete (that is, it is possible that some PRs that have been fixed
+ are not listed here).
Bootstrap failures and problems
- * [336]8336 [SCO5] bootstrap config still tries to use COFF options
- * [337]9330 [alpha-osf] Bootstrap failure on Compaq Tru64 with
+ * [335]8336 [SCO5] bootstrap config still tries to use COFF options
+ * [336]9330 [alpha-osf] Bootstrap failure on Compaq Tru64 with
--enable-threads=posix
- * [338]9631 [hppa64-linux] gcc-3.3 fails to bootstrap
- * [339]9877 fixincludes makes a bad sys/byteorder.h on svr5 (UnixWare
+ * [337]9631 [hppa64-linux] gcc-3.3 fails to bootstrap
+ * [338]9877 fixincludes makes a bad sys/byteorder.h on svr5 (UnixWare
7.1.1)
- * [340]11687 xstormy16-elf build fails in libf2c
- * [341]12263 [SGI IRIX] bootstrap fails during compile of
+ * [339]11687 xstormy16-elf build fails in libf2c
+ * [340]12263 [SGI IRIX] bootstrap fails during compile of
libf2c/libI77/backspace.c
- * [342]12490 buffer overflow in scan-decls.c (during Solaris 9
+ * [341]12490 buffer overflow in scan-decls.c (during Solaris 9
fix-header processing)
Internal compiler errors (multi-platform)
- * [343]7277 Casting integers to vector types causes ICE
- * [344]7939 (c++) ICE on invalid function template specialization
- * [345]11063 (c++) ICE on parsing initialization list of const array
+ * [342]7277 Casting integers to vector types causes ICE
+ * [343]7939 (c++) ICE on invalid function template specialization
+ * [344]11063 (c++) ICE on parsing initialization list of const array
member
- * [346]11207 ICE with negative index in array element designator
- * [347]11522 (fortran) g77 dwarf-2 ICE in
+ * [345]11207 ICE with negative index in array element designator
+ * [346]11522 (fortran) g77 dwarf-2 ICE in
add_abstract_origin_attribute
- * [348]11595 (c++) ICE on duplicate label definition
- * [349]11646 (c++) ICE in commit_one_edge_insertion with
+ * [347]11595 (c++) ICE on duplicate label definition
+ * [348]11646 (c++) ICE in commit_one_edge_insertion with
-fnon-call-exceptions -fgcse -O
- * [350]11665 ICE in struct initializer when taking address
- * [351]11852 (c++) ICE with bad struct initializer.
- * [352]11878 (c++) ICE in cp_expr_size
- * [353]11883 ICE with any -O on mercury-generated C code
- * [354]11991 (c++) ICE in cxx_incomplete_type_diagnostic, in
+ * [349]11665 ICE in struct initializer when taking address
+ * [350]11852 (c++) ICE with bad struct initializer.
+ * [351]11878 (c++) ICE in cp_expr_size
+ * [352]11883 ICE with any -O on mercury-generated C code
+ * [353]11991 (c++) ICE in cxx_incomplete_type_diagnostic, in
cp/typeck2.c when applying typeid operator to template template
parameter
- * [355]12146 ICE in lookup_template_function, in cp/pt.c
- * [356]12215 ICE in make_label_edge with -fnon-call-exceptions
+ * [354]12146 ICE in lookup_template_function, in cp/pt.c
+ * [355]12215 ICE in make_label_edge with -fnon-call-exceptions
-fno-gcse -O2
- * [357]12369 (c++) ICE with templates and friends
- * [358]12446 ICE in emit_move_insn on complicated array reference
- * [359]12510 ICE in final_scan_insn
- * [360]12544 ICE with large parameters used in nested functions
+ * [356]12369 (c++) ICE with templates and friends
+ * [357]12446 ICE in emit_move_insn on complicated array reference
+ * [358]12510 ICE in final_scan_insn
+ * [359]12544 ICE with large parameters used in nested functions
C and optimization bugs
- * [361]9862 spurious warnings with -W -finline-functions
- * [362]10962 lookup_field is a linear search on a linked list (can be
+ * [360]9862 spurious warnings with -W -finline-functions
+ * [361]10962 lookup_field is a linear search on a linked list (can be
slow if large struct)
- * [363]11370 -Wunreachable-code gives false complaints
- * [364]11637 invalid assembly with -fnon-call-exceptions
- * [365]11885 Problem with bitfields in packed structs
- * [366]12082 Inappropriate unreachable code warnings
- * [367]12180 Inline optimization fails for variadic function
- * [368]12340 loop unroller + gcse produces wrong code
+ * [362]11370 -Wunreachable-code gives false complaints
+ * [363]11637 invalid assembly with -fnon-call-exceptions
+ * [364]11885 Problem with bitfields in packed structs
+ * [365]12082 Inappropriate unreachable code warnings
+ * [366]12180 Inline optimization fails for variadic function
+ * [367]12340 loop unroller + gcse produces wrong code
C++ compiler and library
- * [369]3907 nested template parameter collides with member name
- * [370]5293 confusing message when binding a temporary to a reference
- * [371]5296 [DR115] Pointers to functions and to template functions
+ * [368]3907 nested template parameter collides with member name
+ * [369]5293 confusing message when binding a temporary to a reference
+ * [370]5296 [DR115] Pointers to functions and to template functions
behave differently in deduction
- * [372]7939 ICE on function template specialization
- * [373]8656 Unable to assign function with __attribute__ and pointer
+ * [371]7939 ICE on function template specialization
+ * [372]8656 Unable to assign function with __attribute__ and pointer
return type to an appropriate variable
- * [374]10147 Confusing error message for invalid template function
+ * [373]10147 Confusing error message for invalid template function
argument
- * [375]11400 std::search_n() makes assumptions about Size parameter
- * [376]11409 issues with using declarations, overloading, and
+ * [374]11400 std::search_n() makes assumptions about Size parameter
+ * [375]11409 issues with using declarations, overloading, and
built-in functions
- * [377]11740 ctype<wchar_t>::do_is(mask, wchar_t) doesn't handle
+ * [376]11740 ctype<wchar_t>::do_is(mask, wchar_t) doesn't handle
multiple bits in mask
- * [378]11786 operator() call on variable in other namespace not
+ * [377]11786 operator() call on variable in other namespace not
recognized
- * [379]11867 static_cast ignores ambiguity
- * [380]11928 bug with conversion operators that are typedefs
- * [381]12114 Uninitialized memory accessed in dtor
- * [382]12163 static_cast + explicit constructor regression
- * [383]12181 Wrong code with comma operator and c++
- * [384]12236 regparm and fastcall messes up parameters
- * [385]12266 incorrect instantiation of unneeded template during
+ * [378]11867 static_cast ignores ambiguity
+ * [379]11928 bug with conversion operators that are typedefs
+ * [380]12114 Uninitialized memory accessed in dtor
+ * [381]12163 static_cast + explicit constructor regression
+ * [382]12181 Wrong code with comma operator and c++
+ * [383]12236 regparm and fastcall messes up parameters
+ * [384]12266 incorrect instantiation of unneeded template during
overload resolution
- * [386]12296 istream::peek() doesn't set eofbit
- * [387]12298 [sjlj exceptions] Stack unwind destroys
+ * [385]12296 istream::peek() doesn't set eofbit
+ * [386]12298 [sjlj exceptions] Stack unwind destroys
not-yet-constructed object
- * [388]12369 ICE with templates and friends
- * [389]12337 apparently infinite loop in g++
- * [390]12344 stdcall attribute ignored if function returns a pointer
- * [391]12451 missing(late) class forward declaration in cxxabi.h
- * [392]12486 g++ accepts invalid use of a qualified name
+ * [387]12369 ICE with templates and friends
+ * [388]12337 apparently infinite loop in g++
+ * [389]12344 stdcall attribute ignored if function returns a pointer
+ * [390]12451 missing(late) class forward declaration in cxxabi.h
+ * [391]12486 g++ accepts invalid use of a qualified name
x86 specific (Intel/AMD)
- * [393]8869 [x86 MMX] ICE with const variable optimization and MMX
+ * [392]8869 [x86 MMX] ICE with const variable optimization and MMX
builtins
- * [394]9786 ICE in fixup_abnormal_edges with -fnon-call-exceptions
+ * [393]9786 ICE in fixup_abnormal_edges with -fnon-call-exceptions
-O2
- * [395]11689 g++3.3 emits un-assembleable code for k6 architecture
- * [396]12116 [k6] Invalid assembly output values with X-MAME code
- * [397]12070 ICE converting between double and long double with
+ * [394]11689 g++3.3 emits un-assembleable code for k6 architecture
+ * [395]12116 [k6] Invalid assembly output values with X-MAME code
+ * [396]12070 ICE converting between double and long double with
-msoft-float
ia64-specific
- * [398]11184 [ia64 hpux] ICE on __builtin_apply building libobjc
- * [399]11535 __builtin_return_address may not work on ia64
- * [400]11693 [ia64] ICE in gen_nop_type
- * [401]12224 [ia64] Thread-local storage doesn't work
+ * [397]11184 [ia64 hpux] ICE on __builtin_apply building libobjc
+ * [398]11535 __builtin_return_address may not work on ia64
+ * [399]11693 [ia64] ICE in gen_nop_type
+ * [400]12224 [ia64] Thread-local storage doesn't work
PowerPC-specific
- * [402]11087 [powerpc64-linux] GCC miscompiles raid1.c from linux
+ * [401]11087 [powerpc64-linux] GCC miscompiles raid1.c from linux
kernel
- * [403]11319 loop miscompiled on ppc32
- * [404]11949 ICE Compiler segfault with ffmpeg -maltivec code
+ * [402]11319 loop miscompiled on ppc32
+ * [403]11949 ICE Compiler segfault with ffmpeg -maltivec code
SPARC-specific
- * [405]11662 wrong code for expr. with cast to long long and
+ * [404]11662 wrong code for expr. with cast to long long and
exclusive or
- * [406]11965 invalid assembler code for a shift < 32 operation
- * [407]12301 (c++) stack corruption when a returned expression throws
+ * [405]11965 invalid assembler code for a shift < 32 operation
+ * [406]12301 (c++) stack corruption when a returned expression throws
an exception
Alpha-specific
- * [408]11717 [alpha-linux] unrecognizable insn compiling for.c of
+ * [407]11717 [alpha-linux] unrecognizable insn compiling for.c of
kernel 2.4.22-pre8
HPUX-specific
- * [409]11313 problem with #pragma weak and static inline functions
- * [410]11712 __STDC_EXT__ not defined for C++ by default anymore?
+ * [408]11313 problem with #pragma weak and static inline functions
+ * [409]11712 __STDC_EXT__ not defined for C++ by default anymore?
Solaris specific
- * [411]12166 Profiled programs crash if PROFDIR is set
+ * [410]12166 Profiled programs crash if PROFDIR is set
Solaris-x86 specific
- * [412]12101 i386 Solaris no longer works with GNU as?
+ * [411]12101 i386 Solaris no longer works with GNU as?
Miscellaneous embedded target-specific bugs
- * [413]10988 [m32r-elf] wrong blockmove code with -O3
- * [414]11805 [h8300-unknown-coff] [H8300] ICE for simple code with
+ * [412]10988 [m32r-elf] wrong blockmove code with -O3
+ * [413]11805 [h8300-unknown-coff] [H8300] ICE for simple code with
-O2
- * [415]11902 [sh4] spec file improperly inserts rpath even when none
+ * [414]11902 [sh4] spec file improperly inserts rpath even when none
needed
- * [416]11903 [sh4] -pthread fails to link due to error in spec file
+ * [415]11903 [sh4] -pthread fails to link due to error in spec file
on sh4
__________________________________________________________________
Bug Fixes
- This section lists the problem reports (PRs) from [417]GCC's bug
- tracking system that are known to be fixed in the 3.3.3 release. This
- list might not be complete (that is, it is possible that some PRs that
- have been fixed are not listed here).
+ This section lists the problem reports (PRs) from GCC's bug tracker
+ that are known to be fixed in the 3.3.3 release. This list might not be
+ complete (that is, it is possible that some PRs that have been fixed
+ are not listed here).
Bootstrap failures and issues
- * [418]11890 Building cross gcc-3.3.1 for sparc-sun-solaris2.6 fails
- * [419]12399 boehm-gc fails (when building a cross compiler): libtool
+ * [416]11890 Building cross gcc-3.3.1 for sparc-sun-solaris2.6 fails
+ * [417]12399 boehm-gc fails (when building a cross compiler): libtool
unable to infer tagged configuration
- * [420]13068 mklibgcc.in doesn't handle multi-level multilib
+ * [418]13068 mklibgcc.in doesn't handle multi-level multilib
subdirectories properly
Internal compiler errors (multi-platform)
- * [421]10060 ICE (stack overflow) on huge file (300k lines) due to
+ * [419]10060 ICE (stack overflow) on huge file (300k lines) due to
recursive behaviour of copy_rtx_if_shared, in emit_rtl.c
- * [422]10555 (c++) ICE on undefined template argument
- * [423]10706 (c++) ICE in mangle_class_name_for_template
- * [424]11496 (fortran) error in flow_loops_find when -funroll-loops
+ * [420]10555 (c++) ICE on undefined template argument
+ * [421]10706 (c++) ICE in mangle_class_name_for_template
+ * [422]11496 (fortran) error in flow_loops_find when -funroll-loops
active
- * [425]11741 ICE in pre_insert_copy_insn, in gcse.c
- * [426]12440 GCC crashes during compilation of quicktime4linux 2.0.0
- * [427]12632 (fortran) -fbounds-check ICE
- * [428]12712 (c++) ICE on short legit C++ code fragment with gcc
+ * [423]11741 ICE in pre_insert_copy_insn, in gcse.c
+ * [424]12440 GCC crashes during compilation of quicktime4linux 2.0.0
+ * [425]12632 (fortran) -fbounds-check ICE
+ * [426]12712 (c++) ICE on short legit C++ code fragment with gcc
3.3.2
- * [429]12726 (c++) ICE (segfault) on trivial code
- * [430]12890 (c++) ICE on compilation of class with throwing method
- * [431]12900 (c++) ICE in rtl_verify_flow_info_1
- * [432]13060 (fortran) ICE in fixup_var_refs_1, in function.c on
+ * [427]12726 (c++) ICE (segfault) on trivial code
+ * [428]12890 (c++) ICE on compilation of class with throwing method
+ * [429]12900 (c++) ICE in rtl_verify_flow_info_1
+ * [430]13060 (fortran) ICE in fixup_var_refs_1, in function.c on
correct code with -O2 -fno-force-mem
- * [433]13289 (c++) ICE in regenerate_decl_from_template on recursive
+ * [431]13289 (c++) ICE in regenerate_decl_from_template on recursive
template
- * [434]13318 ICE: floating point exception in the loop optimizer
- * [435]13392 (c++) ICE in convert_from_eh_region_ranges_1, in
+ * [432]13318 ICE: floating point exception in the loop optimizer
+ * [433]13392 (c++) ICE in convert_from_eh_region_ranges_1, in
except.c
- * [436]13574 (c++) invalid array default initializer in class lets
+ * [434]13574 (c++) invalid array default initializer in class lets
gcc consume all memory and die
- * [437]13475 ICE on SIMD variables with partial value initialization
- * [438]13797 (c++) ICE on invalid template parameter
- * [439]13824 (java) gcj SEGV with simple .java program
+ * [435]13475 ICE on SIMD variables with partial value initialization
+ * [436]13797 (c++) ICE on invalid template parameter
+ * [437]13824 (java) gcj SEGV with simple .java program
C and optimization bugs
- * [440]8776 loop invariants are not removed (most likely)
- * [441]10339 [sparc,ppc,ppc64] Invalid optimization: replacing
+ * [438]8776 loop invariants are not removed (most likely)
+ * [439]10339 [sparc,ppc,ppc64] Invalid optimization: replacing
strncmp by memcmp
- * [442]11350 undefined labels with -Os -fPIC
- * [443]12826 Optimizer removes reference through volatile pointer
- * [444]12500 stabs debug info: void no longer a predefined / builtin
+ * [440]11350 undefined labels with -Os -fPIC
+ * [441]12826 Optimizer removes reference through volatile pointer
+ * [442]12500 stabs debug info: void no longer a predefined / builtin
type
- * [445]12941 builtin-bitops-1.c miscompilation (latent bug)
- * [446]12953 tree inliner bug (in inline_forbidden_p) and fix
- * [447]13041 linux-2.6/sound/core/oss/rate.c miscompiled
- * [448]13507 spurious printf format warning
- * [449]13382 Type information for const pointer disappears during
+ * [443]12941 builtin-bitops-1.c miscompilation (latent bug)
+ * [444]12953 tree inliner bug (in inline_forbidden_p) and fix
+ * [445]13041 linux-2.6/sound/core/oss/rate.c miscompiled
+ * [446]13507 spurious printf format warning
+ * [447]13382 Type information for const pointer disappears during
optimization.
- * [450]13394 noreturn attribute ignored on recursive invokation
- * [451]13400 Compiled code crashes storing to read-only location
- * [452]13521 Endless loop in calculate_global_regs_live
+ * [448]13394 noreturn attribute ignored on recursive invokation
+ * [449]13400 Compiled code crashes storing to read-only location
+ * [450]13521 Endless loop in calculate_global_regs_live
C++ compiler and library
that the ISO C++ standards committee has made concerning several defect
reports (DRs). Links in the list below point to detailed discussion of
the relevant defect report.
- * [453]2094 unimplemented: use of `ptrmem_cst' in template type
+ * [451]2094 unimplemented: use of `ptrmem_cst' in template type
unification
- * [454]2294 using declaration confusion
- * [455]5050 template instantiation depth exceeds limit: recursion
+ * [452]2294 using declaration confusion
+ * [453]5050 template instantiation depth exceeds limit: recursion
problem?
- * [456]9371 Bad exception handling in
+ * [454]9371 Bad exception handling in
i/ostream::operator>>/<<(streambuf*)
- * [457]9546 bad exception handling in ostream members
- * [458]10081 basic_ios::_M_cache_locale leaves NULL members in the
+ * [455]9546 bad exception handling in ostream members
+ * [456]10081 basic_ios::_M_cache_locale leaves NULL members in the
face of unknown locales
- * [459]10093 [460][DR 61] Setting failbit in exceptions doesn't work
- * [461]10095 istream::operator>>(int&) sets ios::badbit when
+ * [457]10093 [458][DR 61] Setting failbit in exceptions doesn't work
+ * [459]10095 istream::operator>>(int&) sets ios::badbit when
ios::failbit is set.
- * [462]11554 Warning about reordering of initializers doesn't mention
+ * [460]11554 Warning about reordering of initializers doesn't mention
location of constructor
- * [463]12297 istream::sentry::sentry() handles eof() incorrectly.
- * [464]12352 Exception safety problems in src/localename.cc
- * [465]12438 Memory leak in locale::combine()
- * [466]12540 Memory leak in locale::locale(const char*)
- * [467]12594 DRs [468]60 [TC] and [469]63 [TC] not implemented
- * [470]12657 Resolution of [471]DR 292 (WP) still unimplemented
- * [472]12696 memory eating infinite loop in diagnostics (error
+ * [461]12297 istream::sentry::sentry() handles eof() incorrectly.
+ * [462]12352 Exception safety problems in src/localename.cc
+ * [463]12438 Memory leak in locale::combine()
+ * [464]12540 Memory leak in locale::locale(const char*)
+ * [465]12594 DRs [466]60 [TC] and [467]63 [TC] not implemented
+ * [468]12657 Resolution of [469]DR 292 (WP) still unimplemented
+ * [470]12696 memory eating infinite loop in diagnostics (error
recovery problem)
- * [473]12815 Code compiled with optimization behaves unexpectedly
- * [474]12862 Conflicts between typedefs/enums and namespace member
+ * [471]12815 Code compiled with optimization behaves unexpectedly
+ * [472]12862 Conflicts between typedefs/enums and namespace member
declarations
- * [475]12926 Wrong value after assignment in initialize list using
+ * [473]12926 Wrong value after assignment in initialize list using
bit-fields
- * [476]12967 Resolution of [477]DR 300 [WP] still unimplemented
- * [478]12971 Resolution of [479]DR 328 [WP] still unimplemented
- * [480]13007 basic_streambuf::pubimbue, imbue wrong
- * [481]13009 Implicitly-defined assignment operator writes to wrong
+ * [474]12967 Resolution of [475]DR 300 [WP] still unimplemented
+ * [476]12971 Resolution of [477]DR 328 [WP] still unimplemented
+ * [478]13007 basic_streambuf::pubimbue, imbue wrong
+ * [479]13009 Implicitly-defined assignment operator writes to wrong
memory
- * [482]13057 regparm attribute not applied to destructor
- * [483]13070 -Wformat option ignored in g++
- * [484]13081 forward template declarations in <complex> let inlining
+ * [480]13057 regparm attribute not applied to destructor
+ * [481]13070 -Wformat option ignored in g++
+ * [482]13081 forward template declarations in <complex> let inlining
fail
- * [485]13239 Assertion does not seem to work correctly anymore
- * [486]13262 "xxx is private within this context" when initializing a
+ * [483]13239 Assertion does not seem to work correctly anymore
+ * [484]13262 "xxx is private within this context" when initializing a
self-contained template class
- * [487]13290 simple typo in concept checking for std::generate_n
- * [488]13323 Template code does not compile in presence of typedef
- * [489]13369 __verify_grouping (and __add_grouping?) not correct
- * [490]13371 infinite loop with packed struct and inlining
- * [491]13445 Template argument replacement "dereferences" a typedef
- * [492]13461 Fails to access protected-ctor from public constant
- * [493]13462 Non-standard-conforming type set::pointer
- * [494]13478 gcc uses wrong constructor to initialize a const
+ * [485]13290 simple typo in concept checking for std::generate_n
+ * [486]13323 Template code does not compile in presence of typedef
+ * [487]13369 __verify_grouping (and __add_grouping?) not correct
+ * [488]13371 infinite loop with packed struct and inlining
+ * [489]13445 Template argument replacement "dereferences" a typedef
+ * [490]13461 Fails to access protected-ctor from public constant
+ * [491]13462 Non-standard-conforming type set::pointer
+ * [492]13478 gcc uses wrong constructor to initialize a const
reference
- * [495]13544 "conflicting types" for enums in different scopes
- * [496]13650 string::compare should not (always) use
+ * [493]13544 "conflicting types" for enums in different scopes
+ * [494]13650 string::compare should not (always) use
traits_type::length()
- * [497]13683 bogus warning about passing non-PODs through ellipsis
- * [498]13688 Derived class is denied access to protected base class
+ * [495]13683 bogus warning about passing non-PODs through ellipsis
+ * [496]13688 Derived class is denied access to protected base class
member class
- * [499]13774 Member variable cleared in virtual multiple inheritance
+ * [497]13774 Member variable cleared in virtual multiple inheritance
class
- * [500]13884 Protect sstream.tcc from extern template use
+ * [498]13884 Protect sstream.tcc from extern template use
Java compiler and library
- * [501]10746 [win32] garbage collection crash in GCJ
+ * [499]10746 [win32] garbage collection crash in GCJ
Objective-C compiler and library
- * [502]11433 Crash due to dereferencing null pointer when querying
+ * [500]11433 Crash due to dereferencing null pointer when querying
protocol
Fortran compiler and library
- * [503]12633 logical expression gives incorrect result with
+ * [501]12633 logical expression gives incorrect result with
-fugly-logint option
- * [504]13037 [gcse-lm] g77 generates incorrect code
- * [505]13213 Hex constant problem when compiling with -fugly-logint
+ * [502]13037 [gcse-lm] g77 generates incorrect code
+ * [503]13213 Hex constant problem when compiling with -fugly-logint
and -ftypeless-boz
x86-specific (Intel/AMD)
- * [506]4490 ICE with -m128bit-long-double
- * [507]12292 [x86_64] ICE: RTL check: expected code `const_int', have
+ * [504]4490 ICE with -m128bit-long-double
+ * [505]12292 [x86_64] ICE: RTL check: expected code `const_int', have
`reg' in make_field_assignment, in combine.c
- * [508]12441 ICE: can't find a register to spill
- * [509]12943 array static-init failure under -fpic, -fPIC
- * [510]13608 Incorrect code with -O3 -ffast-math
+ * [506]12441 ICE: can't find a register to spill
+ * [507]12943 array static-init failure under -fpic, -fPIC
+ * [508]13608 Incorrect code with -O3 -ffast-math
PowerPC-specific
- * [511]11598 testcase gcc.dg/20020118-1.c fails runtime check of
+ * [509]11598 testcase gcc.dg/20020118-1.c fails runtime check of
__attribute__((aligned(16)))
- * [512]11793 ICE in extract_insn, in recog.c (const_vector's)
- * [513]12467 vmsumubm emitted when vmsummbm appropriate (typo in
+ * [510]11793 ICE in extract_insn, in recog.c (const_vector's)
+ * [511]12467 vmsumubm emitted when vmsummbm appropriate (typo in
altivec.md)
- * [514]12537 g++ generates writeable text sections
+ * [512]12537 g++ generates writeable text sections
SPARC-specific
- * [515]12496 wrong result for __atomic_add(&value, -1) when using -O0
+ * [513]12496 wrong result for __atomic_add(&value, -1) when using -O0
-m64
- * [516]12865 mprotect call to make trampoline executable may fail
- * [517]13354 ICE in sparc_emit_set_const32
+ * [514]12865 mprotect call to make trampoline executable may fail
+ * [515]13354 ICE in sparc_emit_set_const32
ARM-specific
- * [518]10467 [arm] ICE in pre_insert_copy_insn,
+ * [516]10467 [arm] ICE in pre_insert_copy_insn,
ia64-specific
- * [519]11226 ICE passing struct arg with two floats
- * [520]11227 ICE for _Complex float, _Complex long double args
- * [521]12644 GCC 3.3.2 fails to compile glibc on ia64
- * [522]13149 build gcc-3.3.2 1305 error:unrecognizable insn
+ * [517]11226 ICE passing struct arg with two floats
+ * [518]11227 ICE for _Complex float, _Complex long double args
+ * [519]12644 GCC 3.3.2 fails to compile glibc on ia64
+ * [520]13149 build gcc-3.3.2 1305 error:unrecognizable insn
* Various fixes for libunwind
Alpha-specific
- * [523]12654 Incorrect comparison code generated for Alpha
- * [524]12965 SEGV+ICE in cc1plus on alpha-linux with -O2
- * [525]13031 ICE (unrecognizable insn) when building gnome-libs-1.4.2
+ * [521]12654 Incorrect comparison code generated for Alpha
+ * [522]12965 SEGV+ICE in cc1plus on alpha-linux with -O2
+ * [523]13031 ICE (unrecognizable insn) when building gnome-libs-1.4.2
HPPA-specific
- * [526]11634 [hppa] ICE in verify_local_live_at_start, in flow.c
- * [527]12158 [hppa] compilation does not terminate at -O1
+ * [524]11634 [hppa] ICE in verify_local_live_at_start, in flow.c
+ * [525]12158 [hppa] compilation does not terminate at -O1
S390-specific
- * [528]11992 Wrong built-in code for memcmp with length 1<<24: only
+ * [526]11992 Wrong built-in code for memcmp with length 1<<24: only
(1<<24)-1 possible for CLCL-Instruction
SH-specific
- * [529]9365 segfault in gen_far_branch (config/sh/sh.c)
- * [530]10392 optimizer generates faulty array indexing
- * [531]11322 SH profiler outputs multiple definitions of symbol
- * [532]13069 gcc/config/sh/rtems.h broken
- * [533]13302 Putting a va_list in a struct causes seg fault
- * [534]13585 Incorrect optimization of call to sfunc
+ * [527]9365 segfault in gen_far_branch (config/sh/sh.c)
+ * [528]10392 optimizer generates faulty array indexing
+ * [529]11322 SH profiler outputs multiple definitions of symbol
+ * [530]13069 gcc/config/sh/rtems.h broken
+ * [531]13302 Putting a va_list in a struct causes seg fault
+ * [532]13585 Incorrect optimization of call to sfunc
* Fix inappropriately exported libgcc functions from the shared
library
Other embedded target specific
- * [535]8916 [mcore] unsigned char assign gets hosed.
- * [536]11576 [h8300] ICE in change_address_1, in emit-rtl.c
- * [537]13122 [h8300] local variable gets corrupted by function call
+ * [533]8916 [mcore] unsigned char assign gets hosed.
+ * [534]11576 [h8300] ICE in change_address_1, in emit-rtl.c
+ * [535]13122 [h8300] local variable gets corrupted by function call
when -fomit-frame-pointer is given
- * [538]13256 [cris] strict_low_part mistreated in delay slots
- * [539]13373 [mcore] optimization with -frerun-cse-after-loop
+ * [536]13256 [cris] strict_low_part mistreated in delay slots
+ * [537]13373 [mcore] optimization with -frerun-cse-after-loop
-fexpensive-optimizations produces wrong code on mcore
GNU HURD-specific
- * [540]12561 gcc/config/t-gnu needs updating to work with
+ * [538]12561 gcc/config/t-gnu needs updating to work with
--with-sysroot
Tru64 Unix specific
- * [541]6243 testsuite fails almost all tests due to no libintl in
+ * [539]6243 testsuite fails almost all tests due to no libintl in
LD_LIBRARY_PATH during test.
- * [542]11397 weak aliases broken on Tru64 UNIX
+ * [540]11397 weak aliases broken on Tru64 UNIX
AIX-specific
- * [543]12505 build failure due to defines of uchar in cpphash.h and
+ * [541]12505 build failure due to defines of uchar in cpphash.h and
sys/types.h
- * [544]13150 WEAK symbols not exported by collect2
+ * [542]13150 WEAK symbols not exported by collect2
IRIX-specific
- * [545]12666 fixincludes problem on IRIX 6.5.19m
+ * [543]12666 fixincludes problem on IRIX 6.5.19m
Solaris-specific
- * [546]12969 Including sys/byteorder.h breaks configure checks
+ * [544]12969 Including sys/byteorder.h breaks configure checks
Testsuite problems (compiler is not affected)
- * [547]10819 testsuite creates CR+LF on compiler version lines in
+ * [545]10819 testsuite creates CR+LF on compiler version lines in
test summary files
- * [548]11612 abi_check not finding correct libgcc_s.so.1
+ * [546]11612 abi_check not finding correct libgcc_s.so.1
Miscellaneous
- * [549]13211 using -###, incorrect warnings about unused linker file
+ * [547]13211 using -###, incorrect warnings about unused linker file
are produced
__________________________________________________________________
GCC 3.3.4
- This is the [550]list of problem reports (PRs) from GCC's bug tracking
+ This is the [548]list of problem reports (PRs) from GCC's bug tracking
system that are known to be fixed in the 3.3.4 release. This list might
not be complete (that is, it is possible that some PRs that have been
fixed are not listed here).
GCC 3.3.5
- This is the [551]list of problem reports (PRs) from GCC's bug tracking
+ This is the [549]list of problem reports (PRs) from GCC's bug tracking
system that are known to be fixed in the 3.3.5 release. This list might
not be complete (that is, it is possible that some PRs that have been
fixed are not listed here).
GCC 3.3.6
- This is the [552]list of problem reports (PRs) from GCC's bug tracking
+ This is the [550]list of problem reports (PRs) from GCC's bug tracking
system that are known to be fixed in the 3.3.6 release. This list might
not be complete (that is, it is possible that some PRs that have been
fixed are not listed here).
For questions related to the use of GCC, please consult these web
- pages and the [553]GCC manuals. If that fails, the
- [554]gcc-help@gcc.gnu.org mailing list might help. Comments on these
+ pages and the [551]GCC manuals. If that fails, the
+ [552]gcc-help@gcc.gnu.org mailing list might help. Comments on these
web pages and the development of GCC are welcome on our developer
- list at [555]gcc@gcc.gnu.org. All of [556]our lists have public
+ list at [553]gcc@gcc.gnu.org. All of [554]our lists have public
archives.
- Copyright (C) [557]Free Software Foundation, Inc. Verbatim copying and
+ Copyright (C) [555]Free Software Foundation, Inc. Verbatim copying and
distribution of this entire article is permitted in any medium,
provided this notice is preserved.
- These pages are [558]maintained by the GCC team. Last modified
- 2013-10-31[559].
+ These pages are [556]maintained by the GCC team. Last modified
+ 2014-06-28[557].
References
4. http://gcc.gnu.org/gcc-3.3/changes.html#nonnull_attribute
5. http://gcc.gnu.org/news/dfa.html
6. http://gcc.gnu.org/c99status.html
- 7. http://gcc.gnu.org/onlinedocs/gcc-3.3.6/g77/News.html
- 8. http://gcc.gnu.org/PR10140
- 9. http://gcc.gnu.org/PR10198
- 10. http://gcc.gnu.org/PR10338
- 11. http://gcc.gnu.org/PR3581
- 12. http://gcc.gnu.org/PR4382
- 13. http://gcc.gnu.org/PR5533
- 14. http://gcc.gnu.org/PR6387
- 15. http://gcc.gnu.org/PR6412
- 16. http://gcc.gnu.org/PR6620
- 17. http://gcc.gnu.org/PR6663
- 18. http://gcc.gnu.org/PR7068
- 19. http://gcc.gnu.org/PR7083
- 20. http://gcc.gnu.org/PR7647
- 21. http://gcc.gnu.org/PR7675
- 22. http://gcc.gnu.org/PR7718
- 23. http://gcc.gnu.org/PR8116
- 24. http://gcc.gnu.org/PR8358
- 25. http://gcc.gnu.org/PR8511
- 26. http://gcc.gnu.org/PR8564
- 27. http://gcc.gnu.org/PR8660
- 28. http://gcc.gnu.org/PR8766
- 29. http://gcc.gnu.org/PR8803
- 30. http://gcc.gnu.org/PR8846
- 31. http://gcc.gnu.org/PR8906
- 32. http://gcc.gnu.org/PR9216
- 33. http://gcc.gnu.org/PR9261
- 34. http://gcc.gnu.org/PR9263
- 35. http://gcc.gnu.org/PR9429
- 36. http://gcc.gnu.org/PR9516
- 37. http://gcc.gnu.org/PR9600
- 38. http://gcc.gnu.org/PR9629
- 39. http://gcc.gnu.org/PR9672
- 40. http://gcc.gnu.org/PR9749
- 41. http://gcc.gnu.org/PR9794
- 42. http://gcc.gnu.org/PR9829
- 43. http://gcc.gnu.org/PR9916
- 44. http://gcc.gnu.org/PR9936
- 45. http://gcc.gnu.org/PR10262
- 46. http://gcc.gnu.org/PR10278
- 47. http://gcc.gnu.org/PR10446
- 48. http://gcc.gnu.org/PR10451
- 49. http://gcc.gnu.org/PR10506
- 50. http://gcc.gnu.org/PR10549
- 51. http://gcc.gnu.org/PR2001
- 52. http://gcc.gnu.org/PR2391
- 53. http://gcc.gnu.org/PR2960
- 54. http://gcc.gnu.org/PR4046
- 55. http://gcc.gnu.org/PR6405
- 56. http://gcc.gnu.org/PR6798
- 57. http://gcc.gnu.org/PR6871
- 58. http://gcc.gnu.org/PR6909
- 59. http://gcc.gnu.org/PR7189
- 60. http://gcc.gnu.org/PR7642
- 61. http://gcc.gnu.org/PR8634
- 62. http://gcc.gnu.org/PR8750
- 63. http://gcc.gnu.org/PR2161
- 64. http://gcc.gnu.org/PR4319
- 65. http://gcc.gnu.org/PR8602
- 66. http://gcc.gnu.org/PR9177
- 67. http://gcc.gnu.org/PR9853
- 68. http://gcc.gnu.org/PR45
- 69. http://gcc.gnu.org/PR3784
- 70. http://gcc.gnu.org/PR764
- 71. http://gcc.gnu.org/PR5116
- 72. http://gcc.gnu.org/PR2862
- 73. http://gcc.gnu.org/PR3663
- 74. http://gcc.gnu.org/PR3797
- 75. http://gcc.gnu.org/PR3948
- 76. http://gcc.gnu.org/PR4137
- 77. http://gcc.gnu.org/PR4361
- 78. http://gcc.gnu.org/PR4802
- 79. http://gcc.gnu.org/PR5837
- 80. http://gcc.gnu.org/PR4803
- 81. http://gcc.gnu.org/PR5094
- 82. http://gcc.gnu.org/PR5730
- 83. http://gcc.gnu.org/PR6713
- 84. http://gcc.gnu.org/PR7015
- 85. http://gcc.gnu.org/PR7086
- 86. http://gcc.gnu.org/PR7099
- 87. http://gcc.gnu.org/PR7247
- 88. http://gcc.gnu.org/PR7441
- 89. http://gcc.gnu.org/PR7768
- 90. http://gcc.gnu.org/PR7804
- 91. http://gcc.gnu.org/PR8099
- 92. http://gcc.gnu.org/PR8117
- 93. http://gcc.gnu.org/PR8205
- 94. http://gcc.gnu.org/PR8645
- 95. http://gcc.gnu.org/PR8724
- 96. http://gcc.gnu.org/PR8805
- 97. http://gcc.gnu.org/PR8691
- 98. http://gcc.gnu.org/PR8700
- 99. http://gcc.gnu.org/PR8724
- 100. http://gcc.gnu.org/PR8949
- 101. http://gcc.gnu.org/PR9016
- 102. http://gcc.gnu.org/PR9053
- 103. http://gcc.gnu.org/PR9152
- 104. http://gcc.gnu.org/PR9182
- 105. http://gcc.gnu.org/PR9297
- 106. http://gcc.gnu.org/PR9318
- 107. http://gcc.gnu.org/PR9320
- 108. http://gcc.gnu.org/PR9400
- 109. http://gcc.gnu.org/PR9424
- 110. http://gcc.gnu.org/PR9425
- 111. http://gcc.gnu.org/PR9439
- 112. http://gcc.gnu.org/PR9474
- 113. http://gcc.gnu.org/PR9548
+ 7. https://gcc.gnu.org/onlinedocs/gcc-3.3.6/g77/News.html
+ 8. https://gcc.gnu.org/PR10140
+ 9. https://gcc.gnu.org/PR10198
+ 10. https://gcc.gnu.org/PR10338
+ 11. https://gcc.gnu.org/PR3581
+ 12. https://gcc.gnu.org/PR4382
+ 13. https://gcc.gnu.org/PR5533
+ 14. https://gcc.gnu.org/PR6387
+ 15. https://gcc.gnu.org/PR6412
+ 16. https://gcc.gnu.org/PR6620
+ 17. https://gcc.gnu.org/PR6663
+ 18. https://gcc.gnu.org/PR7068
+ 19. https://gcc.gnu.org/PR7083
+ 20. https://gcc.gnu.org/PR7647
+ 21. https://gcc.gnu.org/PR7675
+ 22. https://gcc.gnu.org/PR7718
+ 23. https://gcc.gnu.org/PR8116
+ 24. https://gcc.gnu.org/PR8358
+ 25. https://gcc.gnu.org/PR8511
+ 26. https://gcc.gnu.org/PR8564
+ 27. https://gcc.gnu.org/PR8660
+ 28. https://gcc.gnu.org/PR8766
+ 29. https://gcc.gnu.org/PR8803
+ 30. https://gcc.gnu.org/PR8846
+ 31. https://gcc.gnu.org/PR8906
+ 32. https://gcc.gnu.org/PR9216
+ 33. https://gcc.gnu.org/PR9261
+ 34. https://gcc.gnu.org/PR9263
+ 35. https://gcc.gnu.org/PR9429
+ 36. https://gcc.gnu.org/PR9516
+ 37. https://gcc.gnu.org/PR9600
+ 38. https://gcc.gnu.org/PR9629
+ 39. https://gcc.gnu.org/PR9672
+ 40. https://gcc.gnu.org/PR9749
+ 41. https://gcc.gnu.org/PR9794
+ 42. https://gcc.gnu.org/PR9829
+ 43. https://gcc.gnu.org/PR9916
+ 44. https://gcc.gnu.org/PR9936
+ 45. https://gcc.gnu.org/PR10262
+ 46. https://gcc.gnu.org/PR10278
+ 47. https://gcc.gnu.org/PR10446
+ 48. https://gcc.gnu.org/PR10451
+ 49. https://gcc.gnu.org/PR10506
+ 50. https://gcc.gnu.org/PR10549
+ 51. https://gcc.gnu.org/PR2001
+ 52. https://gcc.gnu.org/PR2391
+ 53. https://gcc.gnu.org/PR2960
+ 54. https://gcc.gnu.org/PR4046
+ 55. https://gcc.gnu.org/PR6405
+ 56. https://gcc.gnu.org/PR6798
+ 57. https://gcc.gnu.org/PR6871
+ 58. https://gcc.gnu.org/PR6909
+ 59. https://gcc.gnu.org/PR7189
+ 60. https://gcc.gnu.org/PR7642
+ 61. https://gcc.gnu.org/PR8634
+ 62. https://gcc.gnu.org/PR8750
+ 63. https://gcc.gnu.org/PR2161
+ 64. https://gcc.gnu.org/PR4319
+ 65. https://gcc.gnu.org/PR8602
+ 66. https://gcc.gnu.org/PR9177
+ 67. https://gcc.gnu.org/PR9853
+ 68. https://gcc.gnu.org/PR45
+ 69. https://gcc.gnu.org/PR3784
+ 70. https://gcc.gnu.org/PR764
+ 71. https://gcc.gnu.org/PR5116
+ 72. https://gcc.gnu.org/PR2862
+ 73. https://gcc.gnu.org/PR3663
+ 74. https://gcc.gnu.org/PR3797
+ 75. https://gcc.gnu.org/PR3948
+ 76. https://gcc.gnu.org/PR4137
+ 77. https://gcc.gnu.org/PR4361
+ 78. https://gcc.gnu.org/PR4802
+ 79. https://gcc.gnu.org/PR5837
+ 80. https://gcc.gnu.org/PR4803
+ 81. https://gcc.gnu.org/PR5094
+ 82. https://gcc.gnu.org/PR5730
+ 83. https://gcc.gnu.org/PR6713
+ 84. https://gcc.gnu.org/PR7015
+ 85. https://gcc.gnu.org/PR7086
+ 86. https://gcc.gnu.org/PR7099
+ 87. https://gcc.gnu.org/PR7247
+ 88. https://gcc.gnu.org/PR7441
+ 89. https://gcc.gnu.org/PR7768
+ 90. https://gcc.gnu.org/PR7804
+ 91. https://gcc.gnu.org/PR8099
+ 92. https://gcc.gnu.org/PR8117
+ 93. https://gcc.gnu.org/PR8205
+ 94. https://gcc.gnu.org/PR8645
+ 95. https://gcc.gnu.org/PR8724
+ 96. https://gcc.gnu.org/PR8805
+ 97. https://gcc.gnu.org/PR8691
+ 98. https://gcc.gnu.org/PR8700
+ 99. https://gcc.gnu.org/PR8724
+ 100. https://gcc.gnu.org/PR8949
+ 101. https://gcc.gnu.org/PR9016
+ 102. https://gcc.gnu.org/PR9053
+ 103. https://gcc.gnu.org/PR9152
+ 104. https://gcc.gnu.org/PR9182
+ 105. https://gcc.gnu.org/PR9297
+ 106. https://gcc.gnu.org/PR9318
+ 107. https://gcc.gnu.org/PR9320
+ 108. https://gcc.gnu.org/PR9400
+ 109. https://gcc.gnu.org/PR9424
+ 110. https://gcc.gnu.org/PR9425
+ 111. https://gcc.gnu.org/PR9439
+ 112. https://gcc.gnu.org/PR9474
+ 113. https://gcc.gnu.org/PR9548
114. http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#231
- 115. http://gcc.gnu.org/PR9555
- 116. http://gcc.gnu.org/PR9561
- 117. http://gcc.gnu.org/PR9563
- 118. http://gcc.gnu.org/PR9582
- 119. http://gcc.gnu.org/PR9622
- 120. http://gcc.gnu.org/PR9683
- 121. http://gcc.gnu.org/PR9791
- 122. http://gcc.gnu.org/PR9817
- 123. http://gcc.gnu.org/PR9825
- 124. http://gcc.gnu.org/PR9826
- 125. http://gcc.gnu.org/PR9924
- 126. http://gcc.gnu.org/PR9946
- 127. http://gcc.gnu.org/PR9964
- 128. http://gcc.gnu.org/PR9988
- 129. http://gcc.gnu.org/PR10033
- 130. http://gcc.gnu.org/PR10097
- 131. http://gcc.gnu.org/PR10132
- 132. http://gcc.gnu.org/PR10180
- 133. http://gcc.gnu.org/PR10199
- 134. http://gcc.gnu.org/PR10300
- 135. http://gcc.gnu.org/PR10427
- 136. http://gcc.gnu.org/PR10503
- 137. http://gcc.gnu.org/PR5956
- 138. http://gcc.gnu.org/PR1832
- 139. http://gcc.gnu.org/PR3924
- 140. http://gcc.gnu.org/PR5634
- 141. http://gcc.gnu.org/PR6367
- 142. http://gcc.gnu.org/PR6491
- 143. http://gcc.gnu.org/PR6742
- 144. http://gcc.gnu.org/PR7113
- 145. http://gcc.gnu.org/PR7236
- 146. http://gcc.gnu.org/PR7278
- 147. http://gcc.gnu.org/PR7384
- 148. http://gcc.gnu.org/PR7388
- 149. http://gcc.gnu.org/PR8587
- 150. http://gcc.gnu.org/PR9038
- 151. http://gcc.gnu.org/PR10197
- 152. http://gcc.gnu.org/PR6005
- 153. http://gcc.gnu.org/PR6389
- 154. http://gcc.gnu.org/PR6576
- 155. http://gcc.gnu.org/PR6652
- 156. http://gcc.gnu.org/PR7060
- 157. http://gcc.gnu.org/PR7073
- 158. http://gcc.gnu.org/PR7180
- 159. http://gcc.gnu.org/PR7416
- 160. http://gcc.gnu.org/PR7570
- 161. http://gcc.gnu.org/PR7578
- 162. http://gcc.gnu.org/PR7611
- 163. http://gcc.gnu.org/PR7709
- 164. http://gcc.gnu.org/PR7766
- 165. http://gcc.gnu.org/PR7785
- 166. http://gcc.gnu.org/PR7786
- 167. http://gcc.gnu.org/PR8142
- 168. http://gcc.gnu.org/PR8234
- 169. http://gcc.gnu.org/PR8415
- 170. http://gcc.gnu.org/PR8481
- 171. http://gcc.gnu.org/PR8593
- 172. http://gcc.gnu.org/PR8759
- 173. http://gcc.gnu.org/PR8997
- 174. http://gcc.gnu.org/PR9253
- 175. http://gcc.gnu.org/PR9254
- 176. http://gcc.gnu.org/PR9271
- 177. http://gcc.gnu.org/PR6767
- 178. http://gcc.gnu.org/PR9911
- 179. http://gcc.gnu.org/PR10020
- 180. http://gcc.gnu.org/PR10546
- 181. http://gcc.gnu.org/PR7029
- 182. http://gcc.gnu.org/PR2903
- 183. http://gcc.gnu.org/PR7873
- 184. http://gcc.gnu.org/PR7680
- 185. http://gcc.gnu.org/PR8705
- 186. http://gcc.gnu.org/PR9986
- 187. http://gcc.gnu.org/PR10056
- 188. http://gcc.gnu.org/PR6744
- 189. http://gcc.gnu.org/PR7361
- 190. http://gcc.gnu.org/PR9496
- 191. http://gcc.gnu.org/PR7067
- 192. http://gcc.gnu.org/PR8480
- 193. http://gcc.gnu.org/PR8784
- 194. http://gcc.gnu.org/PR10315
- 195. http://gcc.gnu.org/PR10267
- 196. http://gcc.gnu.org/PR7916
- 197. http://gcc.gnu.org/PR7926
- 198. http://gcc.gnu.org/PR8555
- 199. http://gcc.gnu.org/PR8994
- 200. http://gcc.gnu.org/PR9426
- 201. http://gcc.gnu.org/PR9806
- 202. http://gcc.gnu.org/PR10077
- 203. http://gcc.gnu.org/PR10233
- 204. http://gcc.gnu.org/PR10286
- 205. http://gcc.gnu.org/PR10308
- 206. http://gcc.gnu.org/PR11272
- 207. http://gcc.gnu.org/PR5754
- 208. http://gcc.gnu.org/PR6597
- 209. http://gcc.gnu.org/PR6949
- 210. http://gcc.gnu.org/PR7053
- 211. http://gcc.gnu.org/PR8164
- 212. http://gcc.gnu.org/PR8384
- 213. http://gcc.gnu.org/PR9559
- 214. http://gcc.gnu.org/PR9649
- 215. http://gcc.gnu.org/PR9864
- 216. http://gcc.gnu.org/PR10432
- 217. http://gcc.gnu.org/PR10475
- 218. http://gcc.gnu.org/PR10635
- 219. http://gcc.gnu.org/PR10661
- 220. http://gcc.gnu.org/PR10700
- 221. http://gcc.gnu.org/PR10712
- 222. http://gcc.gnu.org/PR10796
- 223. http://gcc.gnu.org/PR10890
- 224. http://gcc.gnu.org/PR10939
- 225. http://gcc.gnu.org/PR10956
- 226. http://gcc.gnu.org/PR11041
- 227. http://gcc.gnu.org/PR11059
- 228. http://gcc.gnu.org/PR11083
- 229. http://gcc.gnu.org/PR11105
- 230. http://gcc.gnu.org/PR11149
- 231. http://gcc.gnu.org/PR11228
- 232. http://gcc.gnu.org/PR11282
- 233. http://gcc.gnu.org/PR11301
- 234. http://gcc.gnu.org/PR11308
- 235. http://gcc.gnu.org/PR11473
- 236. http://gcc.gnu.org/PR11503
- 237. http://gcc.gnu.org/PR11513
- 238. http://gcc.gnu.org/PR11198
- 239. http://gcc.gnu.org/PR11304
- 240. http://gcc.gnu.org/PR11381
- 241. http://gcc.gnu.org/PR11536
- 242. http://gcc.gnu.org/PR11557
- 243. http://gcc.gnu.org/PR5897
- 244. http://gcc.gnu.org/PR11279
- 245. http://gcc.gnu.org/PR11022
- 246. http://gcc.gnu.org/PR2330
- 247. http://gcc.gnu.org/PR5388
- 248. http://gcc.gnu.org/PR5390
- 249. http://gcc.gnu.org/PR7877
- 250. http://gcc.gnu.org/PR9393
- 251. http://gcc.gnu.org/PR10032
- 252. http://gcc.gnu.org/PR10468
- 253. http://gcc.gnu.org/PR10527
- 254. http://gcc.gnu.org/PR10679
- 255. http://gcc.gnu.org/PR10682
- 256. http://gcc.gnu.org/PR10689
- 257. http://gcc.gnu.org/PR10845
- 258. http://gcc.gnu.org/PR10849
- 259. http://gcc.gnu.org/PR10888
- 260. http://gcc.gnu.org/PR10929
- 261. http://gcc.gnu.org/PR10931
- 262. http://gcc.gnu.org/PR10940
- 263. http://gcc.gnu.org/PR10968
- 264. http://gcc.gnu.org/PR10990
- 265. http://gcc.gnu.org/PR11039
- 266. http://gcc.gnu.org/PR11062
- 267. http://gcc.gnu.org/PR11095
- 268. http://gcc.gnu.org/PR11098
- 269. http://gcc.gnu.org/PR11137
- 270. http://gcc.gnu.org/PR11154
- 271. http://gcc.gnu.org/PR11329
- 272. http://gcc.gnu.org/PR11332
- 273. http://gcc.gnu.org/PR11431
- 274. http://gcc.gnu.org/PR11528
- 275. http://gcc.gnu.org/PR11546
- 276. http://gcc.gnu.org/PR11567
- 277. http://gcc.gnu.org/PR11645
- 278. http://gcc.gnu.org/PR5179
- 279. http://gcc.gnu.org/PR8204
- 280. http://gcc.gnu.org/PR10838
- 281. http://gcc.gnu.org/PR10886
- 282. http://gcc.gnu.org/PR11349
- 283. http://gcc.gnu.org/PR4823
- 284. http://gcc.gnu.org/PR8878
- 285. http://gcc.gnu.org/PR9815
- 286. http://gcc.gnu.org/PR10402
- 287. http://gcc.gnu.org/PR10504
- 288. http://gcc.gnu.org/PR10673
- 289. http://gcc.gnu.org/PR11044
- 290. http://gcc.gnu.org/PR11089
- 291. http://gcc.gnu.org/PR11420
- 292. http://gcc.gnu.org/PR9362
- 293. http://gcc.gnu.org/PR10142
- 294. http://gcc.gnu.org/PR10663
- 295. http://gcc.gnu.org/PR10835
- 296. http://gcc.gnu.org/PR10876
- 297. http://gcc.gnu.org/PR10955
- 298. http://gcc.gnu.org/PR11018
- 299. http://gcc.gnu.org/PR11556
- 300. http://gcc.gnu.org/PR10907
- 301. http://gcc.gnu.org/PR11320
- 302. http://gcc.gnu.org/PR11599
- 303. http://gcc.gnu.org/PR9745
- 304. http://gcc.gnu.org/PR10871
- 305. http://gcc.gnu.org/PR11440
- 306. http://gcc.gnu.org/PR7594
- 307. http://gcc.gnu.org/PR10557
- 308. http://gcc.gnu.org/PR11054
- 309. http://gcc.gnu.org/PR10834
- 310. http://gcc.gnu.org/PR10842
- 311. http://gcc.gnu.org/PR11052
- 312. http://gcc.gnu.org/PR11183
- 313. http://gcc.gnu.org/PR11084
- 314. http://gcc.gnu.org/PR10331
- 315. http://gcc.gnu.org/PR10413
- 316. http://gcc.gnu.org/PR11096
- 317. http://gcc.gnu.org/PR2873
- 318. http://gcc.gnu.org/PR3163
- 319. http://gcc.gnu.org/PR5287
- 320. http://gcc.gnu.org/PR10148
- 321. http://gcc.gnu.org/PR8787
- 322. http://gcc.gnu.org/PR10900
- 323. http://gcc.gnu.org/PR1607
- 324. http://gcc.gnu.org/PR4252
- 325. http://gcc.gnu.org/PR4490
- 326. http://gcc.gnu.org/PR10355
- 327. http://gcc.gnu.org/PR10726
- 328. http://gcc.gnu.org/PR10805
- 329. http://gcc.gnu.org/PR10815
- 330. http://gcc.gnu.org/PR10877
- 331. http://gcc.gnu.org/PR11280
- 332. http://gcc.gnu.org/PR11466
- 333. http://gcc.gnu.org/PR10737
- 334. http://gcc.gnu.org/PR10810
- 335. http://gcc.gnu.org/bugzilla/
- 336. http://gcc.gnu.org/PR8336
- 337. http://gcc.gnu.org/PR9330
- 338. http://gcc.gnu.org/PR9631
- 339. http://gcc.gnu.org/PR9877
- 340. http://gcc.gnu.org/PR11687
- 341. http://gcc.gnu.org/PR12263
- 342. http://gcc.gnu.org/PR12490
- 343. http://gcc.gnu.org/PR7277
- 344. http://gcc.gnu.org/PR7939
- 345. http://gcc.gnu.org/PR11063
- 346. http://gcc.gnu.org/PR11207
- 347. http://gcc.gnu.org/PR11522
- 348. http://gcc.gnu.org/PR11595
- 349. http://gcc.gnu.org/PR11646
- 350. http://gcc.gnu.org/PR11665
- 351. http://gcc.gnu.org/PR11852
- 352. http://gcc.gnu.org/PR11878
- 353. http://gcc.gnu.org/PR11883
- 354. http://gcc.gnu.org/PR11991
- 355. http://gcc.gnu.org/PR12146
- 356. http://gcc.gnu.org/PR12215
- 357. http://gcc.gnu.org/PR12369
- 358. http://gcc.gnu.org/PR12446
- 359. http://gcc.gnu.org/PR12510
- 360. http://gcc.gnu.org/PR12544
- 361. http://gcc.gnu.org/PR9862
- 362. http://gcc.gnu.org/PR10962
- 363. http://gcc.gnu.org/PR11370
- 364. http://gcc.gnu.org/PR11637
- 365. http://gcc.gnu.org/PR11885
- 366. http://gcc.gnu.org/PR12082
- 367. http://gcc.gnu.org/PR12180
- 368. http://gcc.gnu.org/PR12340
- 369. http://gcc.gnu.org/PR3907
- 370. http://gcc.gnu.org/PR5293
- 371. http://gcc.gnu.org/PR5296
- 372. http://gcc.gnu.org/PR7939
- 373. http://gcc.gnu.org/PR8656
- 374. http://gcc.gnu.org/PR10147
- 375. http://gcc.gnu.org/PR11400
- 376. http://gcc.gnu.org/PR11409
- 377. http://gcc.gnu.org/PR11740
- 378. http://gcc.gnu.org/PR11786
- 379. http://gcc.gnu.org/PR11867
- 380. http://gcc.gnu.org/PR11928
- 381. http://gcc.gnu.org/PR12114
- 382. http://gcc.gnu.org/PR12163
- 383. http://gcc.gnu.org/PR12181
- 384. http://gcc.gnu.org/PR12236
- 385. http://gcc.gnu.org/PR12266
- 386. http://gcc.gnu.org/PR12296
- 387. http://gcc.gnu.org/PR12298
- 388. http://gcc.gnu.org/PR12369
- 389. http://gcc.gnu.org/PR12337
- 390. http://gcc.gnu.org/PR12344
- 391. http://gcc.gnu.org/PR12451
- 392. http://gcc.gnu.org/PR12486
- 393. http://gcc.gnu.org/PR8869
- 394. http://gcc.gnu.org/PR9786
- 395. http://gcc.gnu.org/PR11689
- 396. http://gcc.gnu.org/PR12116
- 397. http://gcc.gnu.org/PR12070
- 398. http://gcc.gnu.org/PR11184
- 399. http://gcc.gnu.org/PR11535
- 400. http://gcc.gnu.org/PR11693
- 401. http://gcc.gnu.org/PR12224
- 402. http://gcc.gnu.org/PR11087
- 403. http://gcc.gnu.org/PR11319
- 404. http://gcc.gnu.org/PR11949
- 405. http://gcc.gnu.org/PR11662
- 406. http://gcc.gnu.org/PR11965
- 407. http://gcc.gnu.org/PR12301
- 408. http://gcc.gnu.org/PR11717
- 409. http://gcc.gnu.org/PR11313
- 410. http://gcc.gnu.org/PR11712
- 411. http://gcc.gnu.org/PR12166
- 412. http://gcc.gnu.org/PR12101
- 413. http://gcc.gnu.org/PR10988
- 414. http://gcc.gnu.org/PR11805
- 415. http://gcc.gnu.org/PR11902
- 416. http://gcc.gnu.org/PR11903
- 417. http://gcc.gnu.org/bugzilla/
- 418. http://gcc.gnu.org/PR11890
- 419. http://gcc.gnu.org/PR12399
- 420. http://gcc.gnu.org/PR13068
- 421. http://gcc.gnu.org/PR10060
- 422. http://gcc.gnu.org/PR10555
- 423. http://gcc.gnu.org/PR10706
- 424. http://gcc.gnu.org/PR11496
- 425. http://gcc.gnu.org/PR11741
- 426. http://gcc.gnu.org/PR12440
- 427. http://gcc.gnu.org/PR12632
- 428. http://gcc.gnu.org/PR12712
- 429. http://gcc.gnu.org/PR12726
- 430. http://gcc.gnu.org/PR12890
- 431. http://gcc.gnu.org/PR12900
- 432. http://gcc.gnu.org/PR13060
- 433. http://gcc.gnu.org/PR13289
- 434. http://gcc.gnu.org/PR13318
- 435. http://gcc.gnu.org/PR13392
- 436. http://gcc.gnu.org/PR13574
- 437. http://gcc.gnu.org/PR13475
- 438. http://gcc.gnu.org/PR13797
- 439. http://gcc.gnu.org/PR13824
- 440. http://gcc.gnu.org/PR8776
- 441. http://gcc.gnu.org/PR10339
- 442. http://gcc.gnu.org/PR11350
- 443. http://gcc.gnu.org/PR12826
- 444. http://gcc.gnu.org/PR12500
- 445. http://gcc.gnu.org/PR12941
- 446. http://gcc.gnu.org/PR12953
- 447. http://gcc.gnu.org/PR13041
- 448. http://gcc.gnu.org/PR13507
- 449. http://gcc.gnu.org/PR13382
- 450. http://gcc.gnu.org/PR13394
- 451. http://gcc.gnu.org/PR13400
- 452. http://gcc.gnu.org/PR13521
- 453. http://gcc.gnu.org/PR2094
- 454. http://gcc.gnu.org/PR2294
- 455. http://gcc.gnu.org/PR5050
- 456. http://gcc.gnu.org/PR9371
- 457. http://gcc.gnu.org/PR9546
- 458. http://gcc.gnu.org/PR10081
- 459. http://gcc.gnu.org/PR10093
- 460. http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#61
- 461. http://gcc.gnu.org/PR10095
- 462. http://gcc.gnu.org/PR11554
- 463. http://gcc.gnu.org/PR12297
- 464. http://gcc.gnu.org/PR12352
- 465. http://gcc.gnu.org/PR12438
- 466. http://gcc.gnu.org/PR12540
- 467. http://gcc.gnu.org/PR12594
- 468. http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#60
- 469. http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#63
- 470. http://gcc.gnu.org/PR12657
- 471. http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#292
- 472. http://gcc.gnu.org/PR12696
- 473. http://gcc.gnu.org/PR12815
- 474. http://gcc.gnu.org/PR12862
- 475. http://gcc.gnu.org/PR12926
- 476. http://gcc.gnu.org/PR12967
- 477. http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html
- 478. http://gcc.gnu.org/PR12971
- 479. http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#328
- 480. http://gcc.gnu.org/PR13007
- 481. http://gcc.gnu.org/PR13009
- 482. http://gcc.gnu.org/PR13057
- 483. http://gcc.gnu.org/PR13070
- 484. http://gcc.gnu.org/PR13081
- 485. http://gcc.gnu.org/PR13239
- 486. http://gcc.gnu.org/PR13262
- 487. http://gcc.gnu.org/PR13290
- 488. http://gcc.gnu.org/PR13323
- 489. http://gcc.gnu.org/PR13369
- 490. http://gcc.gnu.org/PR13371
- 491. http://gcc.gnu.org/PR13445
- 492. http://gcc.gnu.org/PR13461
- 493. http://gcc.gnu.org/PR13462
- 494. http://gcc.gnu.org/PR13478
- 495. http://gcc.gnu.org/PR13544
- 496. http://gcc.gnu.org/PR13650
- 497. http://gcc.gnu.org/PR13683
- 498. http://gcc.gnu.org/PR13688
- 499. http://gcc.gnu.org/PR13774
- 500. http://gcc.gnu.org/PR13884
- 501. http://gcc.gnu.org/PR10746
- 502. http://gcc.gnu.org/PR11433
- 503. http://gcc.gnu.org/PR12633
- 504. http://gcc.gnu.org/PR13037
- 505. http://gcc.gnu.org/PR13213
- 506. http://gcc.gnu.org/PR4490
- 507. http://gcc.gnu.org/PR12292
- 508. http://gcc.gnu.org/PR12441
- 509. http://gcc.gnu.org/PR12943
- 510. http://gcc.gnu.org/PR13608
- 511. http://gcc.gnu.org/PR11598
- 512. http://gcc.gnu.org/PR11793
- 513. http://gcc.gnu.org/PR12467
- 514. http://gcc.gnu.org/PR12537
- 515. http://gcc.gnu.org/PR12496
- 516. http://gcc.gnu.org/PR12865
- 517. http://gcc.gnu.org/PR13354
- 518. http://gcc.gnu.org/PR10467
- 519. http://gcc.gnu.org/PR11226
- 520. http://gcc.gnu.org/PR11227
- 521. http://gcc.gnu.org/PR12644
- 522. http://gcc.gnu.org/PR13149
- 523. http://gcc.gnu.org/PR12654
- 524. http://gcc.gnu.org/PR12965
- 525. http://gcc.gnu.org/PR13031
- 526. http://gcc.gnu.org/PR11634
- 527. http://gcc.gnu.org/PR12158
- 528. http://gcc.gnu.org/PR11992
- 529. http://gcc.gnu.org/PR9365
- 530. http://gcc.gnu.org/PR10392
- 531. http://gcc.gnu.org/PR11322
- 532. http://gcc.gnu.org/PR13069
- 533. http://gcc.gnu.org/PR13302
- 534. http://gcc.gnu.org/PR13585
- 535. http://gcc.gnu.org/PR8916
- 536. http://gcc.gnu.org/PR11576
- 537. http://gcc.gnu.org/PR13122
- 538. http://gcc.gnu.org/PR13256
- 539. http://gcc.gnu.org/PR13373
- 540. http://gcc.gnu.org/PR12561
- 541. http://gcc.gnu.org/PR6243
- 542. http://gcc.gnu.org/PR11397
- 543. http://gcc.gnu.org/PR12505
- 544. http://gcc.gnu.org/PR13150
- 545. http://gcc.gnu.org/PR12666
- 546. http://gcc.gnu.org/PR12969
- 547. http://gcc.gnu.org/PR10819
- 548. http://gcc.gnu.org/PR11612
- 549. http://gcc.gnu.org/PR13211
- 550. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=3.3.4
- 551. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=3.3.5
- 552. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=3.3.6
- 553. http://gcc.gnu.org/onlinedocs/
- 554. mailto:gcc-help@gcc.gnu.org
- 555. mailto:gcc@gcc.gnu.org
- 556. http://gcc.gnu.org/lists.html
- 557. http://www.fsf.org/
- 558. http://gcc.gnu.org/about.html
- 559. http://validator.w3.org/check/referer
+ 115. https://gcc.gnu.org/PR9555
+ 116. https://gcc.gnu.org/PR9561
+ 117. https://gcc.gnu.org/PR9563
+ 118. https://gcc.gnu.org/PR9582
+ 119. https://gcc.gnu.org/PR9622
+ 120. https://gcc.gnu.org/PR9683
+ 121. https://gcc.gnu.org/PR9791
+ 122. https://gcc.gnu.org/PR9817
+ 123. https://gcc.gnu.org/PR9825
+ 124. https://gcc.gnu.org/PR9826
+ 125. https://gcc.gnu.org/PR9924
+ 126. https://gcc.gnu.org/PR9946
+ 127. https://gcc.gnu.org/PR9964
+ 128. https://gcc.gnu.org/PR9988
+ 129. https://gcc.gnu.org/PR10033
+ 130. https://gcc.gnu.org/PR10097
+ 131. https://gcc.gnu.org/PR10132
+ 132. https://gcc.gnu.org/PR10180
+ 133. https://gcc.gnu.org/PR10199
+ 134. https://gcc.gnu.org/PR10300
+ 135. https://gcc.gnu.org/PR10427
+ 136. https://gcc.gnu.org/PR10503
+ 137. https://gcc.gnu.org/PR5956
+ 138. https://gcc.gnu.org/PR1832
+ 139. https://gcc.gnu.org/PR3924
+ 140. https://gcc.gnu.org/PR5634
+ 141. https://gcc.gnu.org/PR6367
+ 142. https://gcc.gnu.org/PR6491
+ 143. https://gcc.gnu.org/PR6742
+ 144. https://gcc.gnu.org/PR7113
+ 145. https://gcc.gnu.org/PR7236
+ 146. https://gcc.gnu.org/PR7278
+ 147. https://gcc.gnu.org/PR7384
+ 148. https://gcc.gnu.org/PR7388
+ 149. https://gcc.gnu.org/PR8587
+ 150. https://gcc.gnu.org/PR9038
+ 151. https://gcc.gnu.org/PR10197
+ 152. https://gcc.gnu.org/PR6005
+ 153. https://gcc.gnu.org/PR6389
+ 154. https://gcc.gnu.org/PR6576
+ 155. https://gcc.gnu.org/PR6652
+ 156. https://gcc.gnu.org/PR7060
+ 157. https://gcc.gnu.org/PR7073
+ 158. https://gcc.gnu.org/PR7180
+ 159. https://gcc.gnu.org/PR7416
+ 160. https://gcc.gnu.org/PR7570
+ 161. https://gcc.gnu.org/PR7578
+ 162. https://gcc.gnu.org/PR7611
+ 163. https://gcc.gnu.org/PR7709
+ 164. https://gcc.gnu.org/PR7766
+ 165. https://gcc.gnu.org/PR7785
+ 166. https://gcc.gnu.org/PR7786
+ 167. https://gcc.gnu.org/PR8142
+ 168. https://gcc.gnu.org/PR8234
+ 169. https://gcc.gnu.org/PR8415
+ 170. https://gcc.gnu.org/PR8481
+ 171. https://gcc.gnu.org/PR8593
+ 172. https://gcc.gnu.org/PR8759
+ 173. https://gcc.gnu.org/PR8997
+ 174. https://gcc.gnu.org/PR9253
+ 175. https://gcc.gnu.org/PR9254
+ 176. https://gcc.gnu.org/PR9271
+ 177. https://gcc.gnu.org/PR6767
+ 178. https://gcc.gnu.org/PR9911
+ 179. https://gcc.gnu.org/PR10020
+ 180. https://gcc.gnu.org/PR10546
+ 181. https://gcc.gnu.org/PR7029
+ 182. https://gcc.gnu.org/PR2903
+ 183. https://gcc.gnu.org/PR7873
+ 184. https://gcc.gnu.org/PR7680
+ 185. https://gcc.gnu.org/PR8705
+ 186. https://gcc.gnu.org/PR9986
+ 187. https://gcc.gnu.org/PR10056
+ 188. https://gcc.gnu.org/PR6744
+ 189. https://gcc.gnu.org/PR7361
+ 190. https://gcc.gnu.org/PR9496
+ 191. https://gcc.gnu.org/PR7067
+ 192. https://gcc.gnu.org/PR8480
+ 193. https://gcc.gnu.org/PR8784
+ 194. https://gcc.gnu.org/PR10315
+ 195. https://gcc.gnu.org/PR10267
+ 196. https://gcc.gnu.org/PR7916
+ 197. https://gcc.gnu.org/PR7926
+ 198. https://gcc.gnu.org/PR8555
+ 199. https://gcc.gnu.org/PR8994
+ 200. https://gcc.gnu.org/PR9426
+ 201. https://gcc.gnu.org/PR9806
+ 202. https://gcc.gnu.org/PR10077
+ 203. https://gcc.gnu.org/PR10233
+ 204. https://gcc.gnu.org/PR10286
+ 205. https://gcc.gnu.org/PR10308
+ 206. https://gcc.gnu.org/PR11272
+ 207. https://gcc.gnu.org/PR5754
+ 208. https://gcc.gnu.org/PR6597
+ 209. https://gcc.gnu.org/PR6949
+ 210. https://gcc.gnu.org/PR7053
+ 211. https://gcc.gnu.org/PR8164
+ 212. https://gcc.gnu.org/PR8384
+ 213. https://gcc.gnu.org/PR9559
+ 214. https://gcc.gnu.org/PR9649
+ 215. https://gcc.gnu.org/PR9864
+ 216. https://gcc.gnu.org/PR10432
+ 217. https://gcc.gnu.org/PR10475
+ 218. https://gcc.gnu.org/PR10635
+ 219. https://gcc.gnu.org/PR10661
+ 220. https://gcc.gnu.org/PR10700
+ 221. https://gcc.gnu.org/PR10712
+ 222. https://gcc.gnu.org/PR10796
+ 223. https://gcc.gnu.org/PR10890
+ 224. https://gcc.gnu.org/PR10939
+ 225. https://gcc.gnu.org/PR10956
+ 226. https://gcc.gnu.org/PR11041
+ 227. https://gcc.gnu.org/PR11059
+ 228. https://gcc.gnu.org/PR11083
+ 229. https://gcc.gnu.org/PR11105
+ 230. https://gcc.gnu.org/PR11149
+ 231. https://gcc.gnu.org/PR11228
+ 232. https://gcc.gnu.org/PR11282
+ 233. https://gcc.gnu.org/PR11301
+ 234. https://gcc.gnu.org/PR11308
+ 235. https://gcc.gnu.org/PR11473
+ 236. https://gcc.gnu.org/PR11503
+ 237. https://gcc.gnu.org/PR11513
+ 238. https://gcc.gnu.org/PR11198
+ 239. https://gcc.gnu.org/PR11304
+ 240. https://gcc.gnu.org/PR11381
+ 241. https://gcc.gnu.org/PR11536
+ 242. https://gcc.gnu.org/PR11557
+ 243. https://gcc.gnu.org/PR5897
+ 244. https://gcc.gnu.org/PR11279
+ 245. https://gcc.gnu.org/PR11022
+ 246. https://gcc.gnu.org/PR2330
+ 247. https://gcc.gnu.org/PR5388
+ 248. https://gcc.gnu.org/PR5390
+ 249. https://gcc.gnu.org/PR7877
+ 250. https://gcc.gnu.org/PR9393
+ 251. https://gcc.gnu.org/PR10032
+ 252. https://gcc.gnu.org/PR10468
+ 253. https://gcc.gnu.org/PR10527
+ 254. https://gcc.gnu.org/PR10679
+ 255. https://gcc.gnu.org/PR10682
+ 256. https://gcc.gnu.org/PR10689
+ 257. https://gcc.gnu.org/PR10845
+ 258. https://gcc.gnu.org/PR10849
+ 259. https://gcc.gnu.org/PR10888
+ 260. https://gcc.gnu.org/PR10929
+ 261. https://gcc.gnu.org/PR10931
+ 262. https://gcc.gnu.org/PR10940
+ 263. https://gcc.gnu.org/PR10968
+ 264. https://gcc.gnu.org/PR10990
+ 265. https://gcc.gnu.org/PR11039
+ 266. https://gcc.gnu.org/PR11062
+ 267. https://gcc.gnu.org/PR11095
+ 268. https://gcc.gnu.org/PR11098
+ 269. https://gcc.gnu.org/PR11137
+ 270. https://gcc.gnu.org/PR11154
+ 271. https://gcc.gnu.org/PR11329
+ 272. https://gcc.gnu.org/PR11332
+ 273. https://gcc.gnu.org/PR11431
+ 274. https://gcc.gnu.org/PR11528
+ 275. https://gcc.gnu.org/PR11546
+ 276. https://gcc.gnu.org/PR11567
+ 277. https://gcc.gnu.org/PR11645
+ 278. https://gcc.gnu.org/PR5179
+ 279. https://gcc.gnu.org/PR8204
+ 280. https://gcc.gnu.org/PR10838
+ 281. https://gcc.gnu.org/PR10886
+ 282. https://gcc.gnu.org/PR11349
+ 283. https://gcc.gnu.org/PR4823
+ 284. https://gcc.gnu.org/PR8878
+ 285. https://gcc.gnu.org/PR9815
+ 286. https://gcc.gnu.org/PR10402
+ 287. https://gcc.gnu.org/PR10504
+ 288. https://gcc.gnu.org/PR10673
+ 289. https://gcc.gnu.org/PR11044
+ 290. https://gcc.gnu.org/PR11089
+ 291. https://gcc.gnu.org/PR11420
+ 292. https://gcc.gnu.org/PR9362
+ 293. https://gcc.gnu.org/PR10142
+ 294. https://gcc.gnu.org/PR10663
+ 295. https://gcc.gnu.org/PR10835
+ 296. https://gcc.gnu.org/PR10876
+ 297. https://gcc.gnu.org/PR10955
+ 298. https://gcc.gnu.org/PR11018
+ 299. https://gcc.gnu.org/PR11556
+ 300. https://gcc.gnu.org/PR10907
+ 301. https://gcc.gnu.org/PR11320
+ 302. https://gcc.gnu.org/PR11599
+ 303. https://gcc.gnu.org/PR9745
+ 304. https://gcc.gnu.org/PR10871
+ 305. https://gcc.gnu.org/PR11440
+ 306. https://gcc.gnu.org/PR7594
+ 307. https://gcc.gnu.org/PR10557
+ 308. https://gcc.gnu.org/PR11054
+ 309. https://gcc.gnu.org/PR10834
+ 310. https://gcc.gnu.org/PR10842
+ 311. https://gcc.gnu.org/PR11052
+ 312. https://gcc.gnu.org/PR11183
+ 313. https://gcc.gnu.org/PR11084
+ 314. https://gcc.gnu.org/PR10331
+ 315. https://gcc.gnu.org/PR10413
+ 316. https://gcc.gnu.org/PR11096
+ 317. https://gcc.gnu.org/PR2873
+ 318. https://gcc.gnu.org/PR3163
+ 319. https://gcc.gnu.org/PR5287
+ 320. https://gcc.gnu.org/PR10148
+ 321. https://gcc.gnu.org/PR8787
+ 322. https://gcc.gnu.org/PR10900
+ 323. https://gcc.gnu.org/PR1607
+ 324. https://gcc.gnu.org/PR4252
+ 325. https://gcc.gnu.org/PR4490
+ 326. https://gcc.gnu.org/PR10355
+ 327. https://gcc.gnu.org/PR10726
+ 328. https://gcc.gnu.org/PR10805
+ 329. https://gcc.gnu.org/PR10815
+ 330. https://gcc.gnu.org/PR10877
+ 331. https://gcc.gnu.org/PR11280
+ 332. https://gcc.gnu.org/PR11466
+ 333. https://gcc.gnu.org/PR10737
+ 334. https://gcc.gnu.org/PR10810
+ 335. https://gcc.gnu.org/PR8336
+ 336. https://gcc.gnu.org/PR9330
+ 337. https://gcc.gnu.org/PR9631
+ 338. https://gcc.gnu.org/PR9877
+ 339. https://gcc.gnu.org/PR11687
+ 340. https://gcc.gnu.org/PR12263
+ 341. https://gcc.gnu.org/PR12490
+ 342. https://gcc.gnu.org/PR7277
+ 343. https://gcc.gnu.org/PR7939
+ 344. https://gcc.gnu.org/PR11063
+ 345. https://gcc.gnu.org/PR11207
+ 346. https://gcc.gnu.org/PR11522
+ 347. https://gcc.gnu.org/PR11595
+ 348. https://gcc.gnu.org/PR11646
+ 349. https://gcc.gnu.org/PR11665
+ 350. https://gcc.gnu.org/PR11852
+ 351. https://gcc.gnu.org/PR11878
+ 352. https://gcc.gnu.org/PR11883
+ 353. https://gcc.gnu.org/PR11991
+ 354. https://gcc.gnu.org/PR12146
+ 355. https://gcc.gnu.org/PR12215
+ 356. https://gcc.gnu.org/PR12369
+ 357. https://gcc.gnu.org/PR12446
+ 358. https://gcc.gnu.org/PR12510
+ 359. https://gcc.gnu.org/PR12544
+ 360. https://gcc.gnu.org/PR9862
+ 361. https://gcc.gnu.org/PR10962
+ 362. https://gcc.gnu.org/PR11370
+ 363. https://gcc.gnu.org/PR11637
+ 364. https://gcc.gnu.org/PR11885
+ 365. https://gcc.gnu.org/PR12082
+ 366. https://gcc.gnu.org/PR12180
+ 367. https://gcc.gnu.org/PR12340
+ 368. https://gcc.gnu.org/PR3907
+ 369. https://gcc.gnu.org/PR5293
+ 370. https://gcc.gnu.org/PR5296
+ 371. https://gcc.gnu.org/PR7939
+ 372. https://gcc.gnu.org/PR8656
+ 373. https://gcc.gnu.org/PR10147
+ 374. https://gcc.gnu.org/PR11400
+ 375. https://gcc.gnu.org/PR11409
+ 376. https://gcc.gnu.org/PR11740
+ 377. https://gcc.gnu.org/PR11786
+ 378. https://gcc.gnu.org/PR11867
+ 379. https://gcc.gnu.org/PR11928
+ 380. https://gcc.gnu.org/PR12114
+ 381. https://gcc.gnu.org/PR12163
+ 382. https://gcc.gnu.org/PR12181
+ 383. https://gcc.gnu.org/PR12236
+ 384. https://gcc.gnu.org/PR12266
+ 385. https://gcc.gnu.org/PR12296
+ 386. https://gcc.gnu.org/PR12298
+ 387. https://gcc.gnu.org/PR12369
+ 388. https://gcc.gnu.org/PR12337
+ 389. https://gcc.gnu.org/PR12344
+ 390. https://gcc.gnu.org/PR12451
+ 391. https://gcc.gnu.org/PR12486
+ 392. https://gcc.gnu.org/PR8869
+ 393. https://gcc.gnu.org/PR9786
+ 394. https://gcc.gnu.org/PR11689
+ 395. https://gcc.gnu.org/PR12116
+ 396. https://gcc.gnu.org/PR12070
+ 397. https://gcc.gnu.org/PR11184
+ 398. https://gcc.gnu.org/PR11535
+ 399. https://gcc.gnu.org/PR11693
+ 400. https://gcc.gnu.org/PR12224
+ 401. https://gcc.gnu.org/PR11087
+ 402. https://gcc.gnu.org/PR11319
+ 403. https://gcc.gnu.org/PR11949
+ 404. https://gcc.gnu.org/PR11662
+ 405. https://gcc.gnu.org/PR11965
+ 406. https://gcc.gnu.org/PR12301
+ 407. https://gcc.gnu.org/PR11717
+ 408. https://gcc.gnu.org/PR11313
+ 409. https://gcc.gnu.org/PR11712
+ 410. https://gcc.gnu.org/PR12166
+ 411. https://gcc.gnu.org/PR12101
+ 412. https://gcc.gnu.org/PR10988
+ 413. https://gcc.gnu.org/PR11805
+ 414. https://gcc.gnu.org/PR11902
+ 415. https://gcc.gnu.org/PR11903
+ 416. https://gcc.gnu.org/PR11890
+ 417. https://gcc.gnu.org/PR12399
+ 418. https://gcc.gnu.org/PR13068
+ 419. https://gcc.gnu.org/PR10060
+ 420. https://gcc.gnu.org/PR10555
+ 421. https://gcc.gnu.org/PR10706
+ 422. https://gcc.gnu.org/PR11496
+ 423. https://gcc.gnu.org/PR11741
+ 424. https://gcc.gnu.org/PR12440
+ 425. https://gcc.gnu.org/PR12632
+ 426. https://gcc.gnu.org/PR12712
+ 427. https://gcc.gnu.org/PR12726
+ 428. https://gcc.gnu.org/PR12890
+ 429. https://gcc.gnu.org/PR12900
+ 430. https://gcc.gnu.org/PR13060
+ 431. https://gcc.gnu.org/PR13289
+ 432. https://gcc.gnu.org/PR13318
+ 433. https://gcc.gnu.org/PR13392
+ 434. https://gcc.gnu.org/PR13574
+ 435. https://gcc.gnu.org/PR13475
+ 436. https://gcc.gnu.org/PR13797
+ 437. https://gcc.gnu.org/PR13824
+ 438. https://gcc.gnu.org/PR8776
+ 439. https://gcc.gnu.org/PR10339
+ 440. https://gcc.gnu.org/PR11350
+ 441. https://gcc.gnu.org/PR12826
+ 442. https://gcc.gnu.org/PR12500
+ 443. https://gcc.gnu.org/PR12941
+ 444. https://gcc.gnu.org/PR12953
+ 445. https://gcc.gnu.org/PR13041
+ 446. https://gcc.gnu.org/PR13507
+ 447. https://gcc.gnu.org/PR13382
+ 448. https://gcc.gnu.org/PR13394
+ 449. https://gcc.gnu.org/PR13400
+ 450. https://gcc.gnu.org/PR13521
+ 451. https://gcc.gnu.org/PR2094
+ 452. https://gcc.gnu.org/PR2294
+ 453. https://gcc.gnu.org/PR5050
+ 454. https://gcc.gnu.org/PR9371
+ 455. https://gcc.gnu.org/PR9546
+ 456. https://gcc.gnu.org/PR10081
+ 457. https://gcc.gnu.org/PR10093
+ 458. http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#61
+ 459. https://gcc.gnu.org/PR10095
+ 460. https://gcc.gnu.org/PR11554
+ 461. https://gcc.gnu.org/PR12297
+ 462. https://gcc.gnu.org/PR12352
+ 463. https://gcc.gnu.org/PR12438
+ 464. https://gcc.gnu.org/PR12540
+ 465. https://gcc.gnu.org/PR12594
+ 466. http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#60
+ 467. http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#63
+ 468. https://gcc.gnu.org/PR12657
+ 469. http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#292
+ 470. https://gcc.gnu.org/PR12696
+ 471. https://gcc.gnu.org/PR12815
+ 472. https://gcc.gnu.org/PR12862
+ 473. https://gcc.gnu.org/PR12926
+ 474. https://gcc.gnu.org/PR12967
+ 475. http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html
+ 476. https://gcc.gnu.org/PR12971
+ 477. http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#328
+ 478. https://gcc.gnu.org/PR13007
+ 479. https://gcc.gnu.org/PR13009
+ 480. https://gcc.gnu.org/PR13057
+ 481. https://gcc.gnu.org/PR13070
+ 482. https://gcc.gnu.org/PR13081
+ 483. https://gcc.gnu.org/PR13239
+ 484. https://gcc.gnu.org/PR13262
+ 485. https://gcc.gnu.org/PR13290
+ 486. https://gcc.gnu.org/PR13323
+ 487. https://gcc.gnu.org/PR13369
+ 488. https://gcc.gnu.org/PR13371
+ 489. https://gcc.gnu.org/PR13445
+ 490. https://gcc.gnu.org/PR13461
+ 491. https://gcc.gnu.org/PR13462
+ 492. https://gcc.gnu.org/PR13478
+ 493. https://gcc.gnu.org/PR13544
+ 494. https://gcc.gnu.org/PR13650
+ 495. https://gcc.gnu.org/PR13683
+ 496. https://gcc.gnu.org/PR13688
+ 497. https://gcc.gnu.org/PR13774
+ 498. https://gcc.gnu.org/PR13884
+ 499. https://gcc.gnu.org/PR10746
+ 500. https://gcc.gnu.org/PR11433
+ 501. https://gcc.gnu.org/PR12633
+ 502. https://gcc.gnu.org/PR13037
+ 503. https://gcc.gnu.org/PR13213
+ 504. https://gcc.gnu.org/PR4490
+ 505. https://gcc.gnu.org/PR12292
+ 506. https://gcc.gnu.org/PR12441
+ 507. https://gcc.gnu.org/PR12943
+ 508. https://gcc.gnu.org/PR13608
+ 509. https://gcc.gnu.org/PR11598
+ 510. https://gcc.gnu.org/PR11793
+ 511. https://gcc.gnu.org/PR12467
+ 512. https://gcc.gnu.org/PR12537
+ 513. https://gcc.gnu.org/PR12496
+ 514. https://gcc.gnu.org/PR12865
+ 515. https://gcc.gnu.org/PR13354
+ 516. https://gcc.gnu.org/PR10467
+ 517. https://gcc.gnu.org/PR11226
+ 518. https://gcc.gnu.org/PR11227
+ 519. https://gcc.gnu.org/PR12644
+ 520. https://gcc.gnu.org/PR13149
+ 521. https://gcc.gnu.org/PR12654
+ 522. https://gcc.gnu.org/PR12965
+ 523. https://gcc.gnu.org/PR13031
+ 524. https://gcc.gnu.org/PR11634
+ 525. https://gcc.gnu.org/PR12158
+ 526. https://gcc.gnu.org/PR11992
+ 527. https://gcc.gnu.org/PR9365
+ 528. https://gcc.gnu.org/PR10392
+ 529. https://gcc.gnu.org/PR11322
+ 530. https://gcc.gnu.org/PR13069
+ 531. https://gcc.gnu.org/PR13302
+ 532. https://gcc.gnu.org/PR13585
+ 533. https://gcc.gnu.org/PR8916
+ 534. https://gcc.gnu.org/PR11576
+ 535. https://gcc.gnu.org/PR13122
+ 536. https://gcc.gnu.org/PR13256
+ 537. https://gcc.gnu.org/PR13373
+ 538. https://gcc.gnu.org/PR12561
+ 539. https://gcc.gnu.org/PR6243
+ 540. https://gcc.gnu.org/PR11397
+ 541. https://gcc.gnu.org/PR12505
+ 542. https://gcc.gnu.org/PR13150
+ 543. https://gcc.gnu.org/PR12666
+ 544. https://gcc.gnu.org/PR12969
+ 545. https://gcc.gnu.org/PR10819
+ 546. https://gcc.gnu.org/PR11612
+ 547. https://gcc.gnu.org/PR13211
+ 548. https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=3.3.4
+ 549. https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=3.3.5
+ 550. https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=3.3.6
+ 551. https://gcc.gnu.org/onlinedocs/
+ 552. mailto:gcc-help@gcc.gnu.org
+ 553. mailto:gcc@gcc.gnu.org
+ 554. https://gcc.gnu.org/lists.html
+ 555. http://www.fsf.org/
+ 556. https://gcc.gnu.org/about.html
+ 557. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-3.2/index.html
GCC 3.2 Release Series
provided this notice is preserved.
These pages are [17]maintained by the GCC team. Last modified
- 2012-11-02[18].
+ 2014-06-28[18].
References
5. http://gcc.gnu.org/gcc-3.2/changes.html#3.2.1
6. http://gcc.gnu.org/gcc-3.2/changes.html#3.2
7. http://gcc.gnu.org/gcc-3.2/buildstat.html
- 8. http://gcc.gnu.org/onlinedocs/gcc/Contributors.html
+ 8. https://gcc.gnu.org/onlinedocs/gcc/Contributors.html
9. http://gcc.gnu.org/index.html
10. mailto:gcc@gcc.gnu.org
11. http://gcc.gnu.org/mirrors.html
- 12. http://gcc.gnu.org/onlinedocs/
+ 12. https://gcc.gnu.org/onlinedocs/
13. mailto:gcc-help@gcc.gnu.org
14. mailto:gcc@gcc.gnu.org
- 15. http://gcc.gnu.org/lists.html
+ 15. https://gcc.gnu.org/lists.html
16. http://www.fsf.org/
- 17. http://gcc.gnu.org/about.html
+ 17. https://gcc.gnu.org/about.html
18. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-3.2/changes.html
provided this notice is preserved.
These pages are [251]maintained by the GCC team. Last modified
- 2012-11-02[252].
+ 2014-06-27[252].
References
1. http://gcc.gnu.org/gcc-3.2/changes.html#3.2.3
2. http://gcc.gnu.org/gcc-3.1/changes.html
3. http://gcc.gnu.org/gcc-3.2/c++-abi.html
- 4. http://gcc.gnu.org/PR3782
- 5. http://gcc.gnu.org/PR6440
- 6. http://gcc.gnu.org/PR7050
- 7. http://gcc.gnu.org/PR7741
- 8. http://gcc.gnu.org/PR7982
- 9. http://gcc.gnu.org/PR8068
- 10. http://gcc.gnu.org/PR8178
- 11. http://gcc.gnu.org/PR8396
- 12. http://gcc.gnu.org/PR8674
- 13. http://gcc.gnu.org/PR9768
- 14. http://gcc.gnu.org/PR9798
- 15. http://gcc.gnu.org/PR9799
- 16. http://gcc.gnu.org/PR9928
- 17. http://gcc.gnu.org/PR10114
- 18. http://gcc.gnu.org/PR10352
- 19. http://gcc.gnu.org/PR10336
- 20. http://gcc.gnu.org/PR8224
- 21. http://gcc.gnu.org/PR8613
- 22. http://gcc.gnu.org/PR8828
- 23. http://gcc.gnu.org/PR9226
- 24. http://gcc.gnu.org/PR9853
- 25. http://gcc.gnu.org/PR9797
- 26. http://gcc.gnu.org/PR9967
- 27. http://gcc.gnu.org/PR10116
- 28. http://gcc.gnu.org/PR10171
- 29. http://gcc.gnu.org/PR10175
- 30. http://gcc.gnu.org/PR8316
- 31. http://gcc.gnu.org/PR9169
- 32. http://gcc.gnu.org/PR9420
- 33. http://gcc.gnu.org/PR9459
- 34. http://gcc.gnu.org/PR9507
- 35. http://gcc.gnu.org/PR9538
- 36. http://gcc.gnu.org/PR9602
- 37. http://gcc.gnu.org/PR9993
- 38. http://gcc.gnu.org/PR10167
- 39. http://gcc.gnu.org/PR9652
- 40. http://gcc.gnu.org/PR10144
- 41. http://gcc.gnu.org/PR8746
- 42. http://gcc.gnu.org/PR9888
- 43. http://gcc.gnu.org/PR9638
- 44. http://gcc.gnu.org/PR9954
- 45. http://gcc.gnu.org/PR7784
- 46. http://gcc.gnu.org/PR7796
- 47. http://gcc.gnu.org/PR8281
- 48. http://gcc.gnu.org/PR8366
- 49. http://gcc.gnu.org/PR8726
- 50. http://gcc.gnu.org/PR9414
- 51. http://gcc.gnu.org/PR10067
- 52. http://gcc.gnu.org/PR7248
- 53. http://gcc.gnu.org/PR8343
- 54. http://gcc.gnu.org/PR9732
- 55. http://gcc.gnu.org/PR10073
- 56. http://gcc.gnu.org/PR7702
- 57. http://gcc.gnu.org/PR9671
- 58. http://gcc.gnu.org/PR8694
- 59. http://gcc.gnu.org/PR9953
- 60. http://gcc.gnu.org/PR10271
- 61. http://gcc.gnu.org/PR6362
- 62. http://gcc.gnu.org/PR10377
- 63. http://gcc.gnu.org/PR6955
- 64. http://gcc.gnu.org/PR5919
- 65. http://gcc.gnu.org/PR7129
- 66. http://gcc.gnu.org/PR7507
- 67. http://gcc.gnu.org/PR7622
- 68. http://gcc.gnu.org/PR7681
- 69. http://gcc.gnu.org/PR9528
- 70. http://gcc.gnu.org/PR8031
- 71. http://gcc.gnu.org/PR8275
- 72. http://gcc.gnu.org/PR8332
- 73. http://gcc.gnu.org/PR8372
- 74. http://gcc.gnu.org/PR8439
- 75. http://gcc.gnu.org/PR8442
- 76. http://gcc.gnu.org/PR8518
- 77. http://gcc.gnu.org/PR8615
- 78. http://gcc.gnu.org/PR8663
- 79. http://gcc.gnu.org/PR8799
- 80. http://gcc.gnu.org/PR9328
- 81. http://gcc.gnu.org/PR9465
- 82. http://gcc.gnu.org/PR47
- 83. http://gcc.gnu.org/PR6745
- 84. http://gcc.gnu.org/PR8214
- 85. http://gcc.gnu.org/PR8493
- 86. http://gcc.gnu.org/PR8332
- 87. http://gcc.gnu.org/PR8503
- 88. http://gcc.gnu.org/PR8727
- 89. http://gcc.gnu.org/PR7445
- 90. http://gcc.gnu.org/PR8230
- 91. http://gcc.gnu.org/PR8399
- 92. http://gcc.gnu.org/PR8662
- 93. http://gcc.gnu.org/PR8707
- 94. http://gcc.gnu.org/PR8708
- 95. http://gcc.gnu.org/PR8790
- 96. http://gcc.gnu.org/PR8887
- 97. http://gcc.gnu.org/PR9076
- 98. http://gcc.gnu.org/PR9151
- 99. http://gcc.gnu.org/PR9168
- 100. http://gcc.gnu.org/PR9269
- 101. http://gcc.gnu.org/PR9322
- 102. http://gcc.gnu.org/PR9433
- 103. http://gcc.gnu.org/PR8032
- 104. http://gcc.gnu.org/PR8639
- 105. http://gcc.gnu.org/PR8794
- 106. http://gcc.gnu.org/PR8832
- 107. http://gcc.gnu.org/PR8988
- 108. http://gcc.gnu.org/PR9492
- 109. http://gcc.gnu.org/PR9267
- 110. http://gcc.gnu.org/PR8344
- 111. http://gcc.gnu.org/PR8524
- 112. http://gcc.gnu.org/PR8880
- 113. http://gcc.gnu.org/PR9090
- 114. http://gcc.gnu.org/PR8588
- 115. http://gcc.gnu.org/PR8599
- 116. http://gcc.gnu.org/PR9506
- 117. http://gcc.gnu.org/PR9484
- 118. http://gcc.gnu.org/PR9292
- 119. http://gcc.gnu.org/PR9293
- 120. http://gcc.gnu.org/PR9295
- 121. http://gcc.gnu.org/PR9296
- 122. http://gcc.gnu.org/PR9316
- 123. http://gcc.gnu.org/PR9493
- 124. http://gcc.gnu.org/PR7341
- 125. http://gcc.gnu.org/PR8947
- 126. http://gcc.gnu.org/PR7448
- 127. http://gcc.gnu.org/PR8882
- 128. http://gcc.gnu.org/PR7445
- 129. http://gcc.gnu.org/PR2521
- 130. http://gcc.gnu.org/PR5661
- 131. http://gcc.gnu.org/PR6419
- 132. http://gcc.gnu.org/PR6994
- 133. http://gcc.gnu.org/PR7150
- 134. http://gcc.gnu.org/PR7160
- 135. http://gcc.gnu.org/PR7228
- 136. http://gcc.gnu.org/PR7266
- 137. http://gcc.gnu.org/PR7353
- 138. http://gcc.gnu.org/PR7411
- 139. http://gcc.gnu.org/PR7478
- 140. http://gcc.gnu.org/PR7526
- 141. http://gcc.gnu.org/PR7721
- 142. http://gcc.gnu.org/PR7803
- 143. http://gcc.gnu.org/PR7754
- 144. http://gcc.gnu.org/PR7788
- 145. http://gcc.gnu.org/PR8031
- 146. http://gcc.gnu.org/PR8055
- 147. http://gcc.gnu.org/PR8067
- 148. http://gcc.gnu.org/PR8134
- 149. http://gcc.gnu.org/PR8149
- 150. http://gcc.gnu.org/PR8160
- 151. http://gcc.gnu.org/PR5607
- 152. http://gcc.gnu.org/PR6579
- 153. http://gcc.gnu.org/PR6803
- 154. http://gcc.gnu.org/PR7176
- 155. http://gcc.gnu.org/PR7188
- 156. http://gcc.gnu.org/PR7306
- 157. http://gcc.gnu.org/PR7461
- 158. http://gcc.gnu.org/PR7524
- 159. http://gcc.gnu.org/PR7584
- 160. http://gcc.gnu.org/PR7676
- 161. http://gcc.gnu.org/PR7679
- 162. http://gcc.gnu.org/PR7811
- 163. http://gcc.gnu.org/PR7961
- 164. http://gcc.gnu.org/PR8071
- 165. http://gcc.gnu.org/PR8127
- 166. http://gcc.gnu.org/PR6745
- 167. http://gcc.gnu.org/PR8096
- 168. http://gcc.gnu.org/PR8127
- 169. http://gcc.gnu.org/PR8218
- 170. http://gcc.gnu.org/PR8287
- 171. http://gcc.gnu.org/PR8347
- 172. http://gcc.gnu.org/PR8348
- 173. http://gcc.gnu.org/PR8391
- 174. http://gcc.gnu.org/PR6627
- 175. http://gcc.gnu.org/PR6631
- 176. http://gcc.gnu.org/PR7102
- 177. http://gcc.gnu.org/PR7120
- 178. http://gcc.gnu.org/PR7209
- 179. http://gcc.gnu.org/PR7515
- 180. http://gcc.gnu.org/PR7814
- 181. http://gcc.gnu.org/PR8467
- 182. http://gcc.gnu.org/PR4890
- 183. http://gcc.gnu.org/PR7357
- 184. http://gcc.gnu.org/PR7358
- 185. http://gcc.gnu.org/PR7602
- 186. http://gcc.gnu.org/PR7862
- 187. http://gcc.gnu.org/PR8190
- 188. http://gcc.gnu.org/PR8524
- 189. http://gcc.gnu.org/PR5351
- 190. http://gcc.gnu.org/PR7591
- 191. http://gcc.gnu.org/PR6845
- 192. http://gcc.gnu.org/PR7034
- 193. http://gcc.gnu.org/PR7124
- 194. http://gcc.gnu.org/PR7174
- 195. http://gcc.gnu.org/PR7134
- 196. http://gcc.gnu.org/PR7375
- 197. http://gcc.gnu.org/PR7390
- 198. http://gcc.gnu.org/PR6890
- 199. http://gcc.gnu.org/PR6981
- 200. http://gcc.gnu.org/PR7242
- 201. http://gcc.gnu.org/PR7396
- 202. http://gcc.gnu.org/PR7630
- 203. http://gcc.gnu.org/PR7693
- 204. http://gcc.gnu.org/PR7723
- 205. http://gcc.gnu.org/PR7951
- 206. http://gcc.gnu.org/PR8146
- 207. http://gcc.gnu.org/PR5967
- 208. http://gcc.gnu.org/PR6984
- 209. http://gcc.gnu.org/PR7114
- 210. http://gcc.gnu.org/PR7130
- 211. http://gcc.gnu.org/PR7133
- 212. http://gcc.gnu.org/PR7380
- 213. http://gcc.gnu.org/PR8252
- 214. http://gcc.gnu.org/PR8451
- 215. http://gcc.gnu.org/PR7250
- 216. http://gcc.gnu.org/PR6668
- 217. http://gcc.gnu.org/PR7151
- 218. http://gcc.gnu.org/PR7335
- 219. http://gcc.gnu.org/PR7842
- 220. http://gcc.gnu.org/PR7856
- 221. http://gcc.gnu.org/PR7967
- 222. http://gcc.gnu.org/PR7374
- 223. http://gcc.gnu.org/PR7370
- 224. http://gcc.gnu.org/PR7409
- 225. http://gcc.gnu.org/PR8232
- 226. http://gcc.gnu.org/PR7623
- 227. http://gcc.gnu.org/PR8314
- 228. http://gcc.gnu.org/PR761
- 229. http://gcc.gnu.org/PR5610
- 230. http://gcc.gnu.org/PR7484
- 231. http://gcc.gnu.org/PR7531
- 232. http://gcc.gnu.org/PR8120
- 233. http://gcc.gnu.org/PR7320
- 234. http://gcc.gnu.org/PR7470
- 235. http://gcc.gnu.org/PR6410
- 236. http://gcc.gnu.org/PR6503
- 237. http://gcc.gnu.org/PR6642
- 238. http://gcc.gnu.org/PR7186
- 239. http://gcc.gnu.org/PR7216
- 240. http://gcc.gnu.org/PR7220
- 241. http://gcc.gnu.org/PR7222
- 242. http://gcc.gnu.org/PR7286
- 243. http://gcc.gnu.org/PR7442
- 244. http://gcc.gnu.org/PR7445
- 245. http://gcc.gnu.org/PR7291
- 246. http://gcc.gnu.org/onlinedocs/
+ 4. https://gcc.gnu.org/PR3782
+ 5. https://gcc.gnu.org/PR6440
+ 6. https://gcc.gnu.org/PR7050
+ 7. https://gcc.gnu.org/PR7741
+ 8. https://gcc.gnu.org/PR7982
+ 9. https://gcc.gnu.org/PR8068
+ 10. https://gcc.gnu.org/PR8178
+ 11. https://gcc.gnu.org/PR8396
+ 12. https://gcc.gnu.org/PR8674
+ 13. https://gcc.gnu.org/PR9768
+ 14. https://gcc.gnu.org/PR9798
+ 15. https://gcc.gnu.org/PR9799
+ 16. https://gcc.gnu.org/PR9928
+ 17. https://gcc.gnu.org/PR10114
+ 18. https://gcc.gnu.org/PR10352
+ 19. https://gcc.gnu.org/PR10336
+ 20. https://gcc.gnu.org/PR8224
+ 21. https://gcc.gnu.org/PR8613
+ 22. https://gcc.gnu.org/PR8828
+ 23. https://gcc.gnu.org/PR9226
+ 24. https://gcc.gnu.org/PR9853
+ 25. https://gcc.gnu.org/PR9797
+ 26. https://gcc.gnu.org/PR9967
+ 27. https://gcc.gnu.org/PR10116
+ 28. https://gcc.gnu.org/PR10171
+ 29. https://gcc.gnu.org/PR10175
+ 30. https://gcc.gnu.org/PR8316
+ 31. https://gcc.gnu.org/PR9169
+ 32. https://gcc.gnu.org/PR9420
+ 33. https://gcc.gnu.org/PR9459
+ 34. https://gcc.gnu.org/PR9507
+ 35. https://gcc.gnu.org/PR9538
+ 36. https://gcc.gnu.org/PR9602
+ 37. https://gcc.gnu.org/PR9993
+ 38. https://gcc.gnu.org/PR10167
+ 39. https://gcc.gnu.org/PR9652
+ 40. https://gcc.gnu.org/PR10144
+ 41. https://gcc.gnu.org/PR8746
+ 42. https://gcc.gnu.org/PR9888
+ 43. https://gcc.gnu.org/PR9638
+ 44. https://gcc.gnu.org/PR9954
+ 45. https://gcc.gnu.org/PR7784
+ 46. https://gcc.gnu.org/PR7796
+ 47. https://gcc.gnu.org/PR8281
+ 48. https://gcc.gnu.org/PR8366
+ 49. https://gcc.gnu.org/PR8726
+ 50. https://gcc.gnu.org/PR9414
+ 51. https://gcc.gnu.org/PR10067
+ 52. https://gcc.gnu.org/PR7248
+ 53. https://gcc.gnu.org/PR8343
+ 54. https://gcc.gnu.org/PR9732
+ 55. https://gcc.gnu.org/PR10073
+ 56. https://gcc.gnu.org/PR7702
+ 57. https://gcc.gnu.org/PR9671
+ 58. https://gcc.gnu.org/PR8694
+ 59. https://gcc.gnu.org/PR9953
+ 60. https://gcc.gnu.org/PR10271
+ 61. https://gcc.gnu.org/PR6362
+ 62. https://gcc.gnu.org/PR10377
+ 63. https://gcc.gnu.org/PR6955
+ 64. https://gcc.gnu.org/PR5919
+ 65. https://gcc.gnu.org/PR7129
+ 66. https://gcc.gnu.org/PR7507
+ 67. https://gcc.gnu.org/PR7622
+ 68. https://gcc.gnu.org/PR7681
+ 69. https://gcc.gnu.org/PR9528
+ 70. https://gcc.gnu.org/PR8031
+ 71. https://gcc.gnu.org/PR8275
+ 72. https://gcc.gnu.org/PR8332
+ 73. https://gcc.gnu.org/PR8372
+ 74. https://gcc.gnu.org/PR8439
+ 75. https://gcc.gnu.org/PR8442
+ 76. https://gcc.gnu.org/PR8518
+ 77. https://gcc.gnu.org/PR8615
+ 78. https://gcc.gnu.org/PR8663
+ 79. https://gcc.gnu.org/PR8799
+ 80. https://gcc.gnu.org/PR9328
+ 81. https://gcc.gnu.org/PR9465
+ 82. https://gcc.gnu.org/PR47
+ 83. https://gcc.gnu.org/PR6745
+ 84. https://gcc.gnu.org/PR8214
+ 85. https://gcc.gnu.org/PR8493
+ 86. https://gcc.gnu.org/PR8332
+ 87. https://gcc.gnu.org/PR8503
+ 88. https://gcc.gnu.org/PR8727
+ 89. https://gcc.gnu.org/PR7445
+ 90. https://gcc.gnu.org/PR8230
+ 91. https://gcc.gnu.org/PR8399
+ 92. https://gcc.gnu.org/PR8662
+ 93. https://gcc.gnu.org/PR8707
+ 94. https://gcc.gnu.org/PR8708
+ 95. https://gcc.gnu.org/PR8790
+ 96. https://gcc.gnu.org/PR8887
+ 97. https://gcc.gnu.org/PR9076
+ 98. https://gcc.gnu.org/PR9151
+ 99. https://gcc.gnu.org/PR9168
+ 100. https://gcc.gnu.org/PR9269
+ 101. https://gcc.gnu.org/PR9322
+ 102. https://gcc.gnu.org/PR9433
+ 103. https://gcc.gnu.org/PR8032
+ 104. https://gcc.gnu.org/PR8639
+ 105. https://gcc.gnu.org/PR8794
+ 106. https://gcc.gnu.org/PR8832
+ 107. https://gcc.gnu.org/PR8988
+ 108. https://gcc.gnu.org/PR9492
+ 109. https://gcc.gnu.org/PR9267
+ 110. https://gcc.gnu.org/PR8344
+ 111. https://gcc.gnu.org/PR8524
+ 112. https://gcc.gnu.org/PR8880
+ 113. https://gcc.gnu.org/PR9090
+ 114. https://gcc.gnu.org/PR8588
+ 115. https://gcc.gnu.org/PR8599
+ 116. https://gcc.gnu.org/PR9506
+ 117. https://gcc.gnu.org/PR9484
+ 118. https://gcc.gnu.org/PR9292
+ 119. https://gcc.gnu.org/PR9293
+ 120. https://gcc.gnu.org/PR9295
+ 121. https://gcc.gnu.org/PR9296
+ 122. https://gcc.gnu.org/PR9316
+ 123. https://gcc.gnu.org/PR9493
+ 124. https://gcc.gnu.org/PR7341
+ 125. https://gcc.gnu.org/PR8947
+ 126. https://gcc.gnu.org/PR7448
+ 127. https://gcc.gnu.org/PR8882
+ 128. https://gcc.gnu.org/PR7445
+ 129. https://gcc.gnu.org/PR2521
+ 130. https://gcc.gnu.org/PR5661
+ 131. https://gcc.gnu.org/PR6419
+ 132. https://gcc.gnu.org/PR6994
+ 133. https://gcc.gnu.org/PR7150
+ 134. https://gcc.gnu.org/PR7160
+ 135. https://gcc.gnu.org/PR7228
+ 136. https://gcc.gnu.org/PR7266
+ 137. https://gcc.gnu.org/PR7353
+ 138. https://gcc.gnu.org/PR7411
+ 139. https://gcc.gnu.org/PR7478
+ 140. https://gcc.gnu.org/PR7526
+ 141. https://gcc.gnu.org/PR7721
+ 142. https://gcc.gnu.org/PR7803
+ 143. https://gcc.gnu.org/PR7754
+ 144. https://gcc.gnu.org/PR7788
+ 145. https://gcc.gnu.org/PR8031
+ 146. https://gcc.gnu.org/PR8055
+ 147. https://gcc.gnu.org/PR8067
+ 148. https://gcc.gnu.org/PR8134
+ 149. https://gcc.gnu.org/PR8149
+ 150. https://gcc.gnu.org/PR8160
+ 151. https://gcc.gnu.org/PR5607
+ 152. https://gcc.gnu.org/PR6579
+ 153. https://gcc.gnu.org/PR6803
+ 154. https://gcc.gnu.org/PR7176
+ 155. https://gcc.gnu.org/PR7188
+ 156. https://gcc.gnu.org/PR7306
+ 157. https://gcc.gnu.org/PR7461
+ 158. https://gcc.gnu.org/PR7524
+ 159. https://gcc.gnu.org/PR7584
+ 160. https://gcc.gnu.org/PR7676
+ 161. https://gcc.gnu.org/PR7679
+ 162. https://gcc.gnu.org/PR7811
+ 163. https://gcc.gnu.org/PR7961
+ 164. https://gcc.gnu.org/PR8071
+ 165. https://gcc.gnu.org/PR8127
+ 166. https://gcc.gnu.org/PR6745
+ 167. https://gcc.gnu.org/PR8096
+ 168. https://gcc.gnu.org/PR8127
+ 169. https://gcc.gnu.org/PR8218
+ 170. https://gcc.gnu.org/PR8287
+ 171. https://gcc.gnu.org/PR8347
+ 172. https://gcc.gnu.org/PR8348
+ 173. https://gcc.gnu.org/PR8391
+ 174. https://gcc.gnu.org/PR6627
+ 175. https://gcc.gnu.org/PR6631
+ 176. https://gcc.gnu.org/PR7102
+ 177. https://gcc.gnu.org/PR7120
+ 178. https://gcc.gnu.org/PR7209
+ 179. https://gcc.gnu.org/PR7515
+ 180. https://gcc.gnu.org/PR7814
+ 181. https://gcc.gnu.org/PR8467
+ 182. https://gcc.gnu.org/PR4890
+ 183. https://gcc.gnu.org/PR7357
+ 184. https://gcc.gnu.org/PR7358
+ 185. https://gcc.gnu.org/PR7602
+ 186. https://gcc.gnu.org/PR7862
+ 187. https://gcc.gnu.org/PR8190
+ 188. https://gcc.gnu.org/PR8524
+ 189. https://gcc.gnu.org/PR5351
+ 190. https://gcc.gnu.org/PR7591
+ 191. https://gcc.gnu.org/PR6845
+ 192. https://gcc.gnu.org/PR7034
+ 193. https://gcc.gnu.org/PR7124
+ 194. https://gcc.gnu.org/PR7174
+ 195. https://gcc.gnu.org/PR7134
+ 196. https://gcc.gnu.org/PR7375
+ 197. https://gcc.gnu.org/PR7390
+ 198. https://gcc.gnu.org/PR6890
+ 199. https://gcc.gnu.org/PR6981
+ 200. https://gcc.gnu.org/PR7242
+ 201. https://gcc.gnu.org/PR7396
+ 202. https://gcc.gnu.org/PR7630
+ 203. https://gcc.gnu.org/PR7693
+ 204. https://gcc.gnu.org/PR7723
+ 205. https://gcc.gnu.org/PR7951
+ 206. https://gcc.gnu.org/PR8146
+ 207. https://gcc.gnu.org/PR5967
+ 208. https://gcc.gnu.org/PR6984
+ 209. https://gcc.gnu.org/PR7114
+ 210. https://gcc.gnu.org/PR7130
+ 211. https://gcc.gnu.org/PR7133
+ 212. https://gcc.gnu.org/PR7380
+ 213. https://gcc.gnu.org/PR8252
+ 214. https://gcc.gnu.org/PR8451
+ 215. https://gcc.gnu.org/PR7250
+ 216. https://gcc.gnu.org/PR6668
+ 217. https://gcc.gnu.org/PR7151
+ 218. https://gcc.gnu.org/PR7335
+ 219. https://gcc.gnu.org/PR7842
+ 220. https://gcc.gnu.org/PR7856
+ 221. https://gcc.gnu.org/PR7967
+ 222. https://gcc.gnu.org/PR7374
+ 223. https://gcc.gnu.org/PR7370
+ 224. https://gcc.gnu.org/PR7409
+ 225. https://gcc.gnu.org/PR8232
+ 226. https://gcc.gnu.org/PR7623
+ 227. https://gcc.gnu.org/PR8314
+ 228. https://gcc.gnu.org/PR761
+ 229. https://gcc.gnu.org/PR5610
+ 230. https://gcc.gnu.org/PR7484
+ 231. https://gcc.gnu.org/PR7531
+ 232. https://gcc.gnu.org/PR8120
+ 233. https://gcc.gnu.org/PR7320
+ 234. https://gcc.gnu.org/PR7470
+ 235. https://gcc.gnu.org/PR6410
+ 236. https://gcc.gnu.org/PR6503
+ 237. https://gcc.gnu.org/PR6642
+ 238. https://gcc.gnu.org/PR7186
+ 239. https://gcc.gnu.org/PR7216
+ 240. https://gcc.gnu.org/PR7220
+ 241. https://gcc.gnu.org/PR7222
+ 242. https://gcc.gnu.org/PR7286
+ 243. https://gcc.gnu.org/PR7442
+ 244. https://gcc.gnu.org/PR7445
+ 245. https://gcc.gnu.org/PR7291
+ 246. https://gcc.gnu.org/onlinedocs/
247. mailto:gcc-help@gcc.gnu.org
248. mailto:gcc@gcc.gnu.org
- 249. http://gcc.gnu.org/lists.html
+ 249. https://gcc.gnu.org/lists.html
250. http://www.fsf.org/
- 251. http://gcc.gnu.org/about.html
+ 251. https://gcc.gnu.org/about.html
252. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-3.1/index.html
provided this notice is preserved.
These pages are [14]maintained by the GCC team. Last modified
- 2012-11-02[15].
+ 2014-06-28[15].
References
2. http://www.gnu.org/
3. http://gcc.gnu.org/gcc-3.1/buildstat.html
4. http://gcc.gnu.org/gcc-3.1/changes.html
- 5. http://gcc.gnu.org/onlinedocs/gcc/Contributors.html
+ 5. https://gcc.gnu.org/onlinedocs/gcc/Contributors.html
6. http://gcc.gnu.org/index.html
7. mailto:gcc@gcc.gnu.org
8. http://gcc.gnu.org/mirrors.html
- 9. http://gcc.gnu.org/onlinedocs/
+ 9. https://gcc.gnu.org/onlinedocs/
10. mailto:gcc-help@gcc.gnu.org
11. mailto:gcc@gcc.gnu.org
- 12. http://gcc.gnu.org/lists.html
+ 12. https://gcc.gnu.org/lists.html
13. http://www.fsf.org/
- 14. http://gcc.gnu.org/about.html
+ 14. https://gcc.gnu.org/about.html
15. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-3.1/changes.html
provided this notice is preserved.
These pages are [18]maintained by the GCC team. Last modified
- 2013-10-31[19].
+ 2014-06-28[19].
References
- 1. http://gcc.gnu.org/ml/gcc/2002-07/msg01208.html
+ 1. https://gcc.gnu.org/ml/gcc/2002-07/msg01208.html
2. http://gcc.gnu.org/news/profiledriven.html
3. http://gcc.gnu.org/benchmarks/
4. http://gcc.gnu.org/c99status.html
- 5. http://gcc.gnu.org/onlinedocs/libstdc++/faq.html
- 6. http://gcc.gnu.org/onlinedocs/gcc-3.1.1/g77/News.html
+ 5. https://gcc.gnu.org/onlinedocs/libstdc++/faq.html
+ 6. https://gcc.gnu.org/onlinedocs/gcc-3.1.1/g77/News.html
7. http://www.adacore.com/
8. http://www-cs-faculty.stanford.edu/~knuth/mmix.html
9. http://www.axis.com/
10. http://developer.axis.com/
11. http://www.superh.com/
12. http://www.x86-64.org/
- 13. http://gcc.gnu.org/onlinedocs/
+ 13. https://gcc.gnu.org/onlinedocs/
14. mailto:gcc-help@gcc.gnu.org
15. mailto:gcc@gcc.gnu.org
- 16. http://gcc.gnu.org/lists.html
+ 16. https://gcc.gnu.org/lists.html
17. http://www.fsf.org/
- 18. http://gcc.gnu.org/about.html
+ 18. https://gcc.gnu.org/about.html
19. http://validator.w3.org/check/referer
======================================================================
-http://gcc.gnu.org/gcc-3.0/gcc-3.0.html
+http://gcc.gnu.org/gcc-3.0/index.html
GCC 3.0.4
February 20, 2002
provided this notice is preserved.
These pages are [14]maintained by the GCC team. Last modified
- 2012-11-02[15].
+ 2014-06-28[15].
References
1. http://www.gnu.org/
2. http://gcc.gnu.org/gcc-3.0/features.html
3. http://gcc.gnu.org/gcc-3.0/buildstat.html
- 4. http://gcc.gnu.org/onlinedocs/gcc/Contributors.html
+ 4. https://gcc.gnu.org/onlinedocs/gcc/Contributors.html
5. http://gcc.gnu.org/gcc-3.0/caveats.html
6. http://gcc.gnu.org/index.html
7. mailto:gcc@gcc.gnu.org
8. http://gcc.gnu.org/mirrors.html
- 9. http://gcc.gnu.org/onlinedocs/
+ 9. https://gcc.gnu.org/onlinedocs/
10. mailto:gcc-help@gcc.gnu.org
11. mailto:gcc@gcc.gnu.org
- 12. http://gcc.gnu.org/lists.html
+ 12. https://gcc.gnu.org/lists.html
13. http://www.fsf.org/
- 14. http://gcc.gnu.org/about.html
+ 14. https://gcc.gnu.org/about.html
15. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-3.0/features.html
provided this notice is preserved.
These pages are [19]maintained by the GCC team. Last modified
- 2013-12-03[20].
+ 2014-06-28[20].
References
8. http://gcc.gnu.org/news/inlining.html
9. http://gcc.gnu.org/news/dependencies.html
10. http://gcc.gnu.org/c99status.html
- 11. http://gcc.gnu.org/onlinedocs/gcc-3.4.6/g77/News.html
+ 11. https://gcc.gnu.org/onlinedocs/gcc-3.4.6/g77/News.html
12. http://gcc.gnu.org/gcc-3.0/libgcc.html
13. http://gcc.gnu.org/gcc-2.95/features.html
- 14. http://gcc.gnu.org/onlinedocs/
+ 14. https://gcc.gnu.org/onlinedocs/
15. mailto:gcc-help@gcc.gnu.org
16. mailto:gcc@gcc.gnu.org
- 17. http://gcc.gnu.org/lists.html
+ 17. https://gcc.gnu.org/lists.html
18. http://www.fsf.org/
- 19. http://gcc.gnu.org/about.html
+ 19. https://gcc.gnu.org/about.html
20. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-3.0/caveats.html
earlier versions. There is a problem setting breakpoints by line
number, and other related issues that have been fixed in GCC 3.0
but not yet handled in GDB:
- [1]http://gcc.gnu.org/ml/gcc-bugs/2001-06/msg00421.html
+ [1]https://gcc.gnu.org/ml/gcc-bugs/2001-06/msg00421.html
For questions related to the use of GCC, please consult these web
provided this notice is preserved.
These pages are [7]maintained by the GCC team. Last modified
- 2012-11-02[8].
+ 2014-06-27[8].
References
- 1. http://gcc.gnu.org/ml/gcc-bugs/2001-06/msg00421.html
- 2. http://gcc.gnu.org/onlinedocs/
+ 1. https://gcc.gnu.org/ml/gcc-bugs/2001-06/msg00421.html
+ 2. https://gcc.gnu.org/onlinedocs/
3. mailto:gcc-help@gcc.gnu.org
4. mailto:gcc@gcc.gnu.org
- 5. http://gcc.gnu.org/lists.html
+ 5. https://gcc.gnu.org/lists.html
6. http://www.fsf.org/
- 7. http://gcc.gnu.org/about.html
+ 7. https://gcc.gnu.org/about.html
8. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-2.95/index.html
The sources include installation instructions in both HTML and
plaintext forms in the install directory in the distribution. However,
- the most up to date [4]installation instructions and [5]build/test
- status are on the web pages. We will update those pages as new
- information becomes available.
+ the most up to date installation instructions and [4]build/test status
+ are on the web pages. We will update those pages as new information
+ becomes available.
The GCC developers would like to thank the numerous people that have
contributed new features, test results, bugfixes, etc to GCC. This
- [6]amazing group of volunteers is what makes GCC successful.
+ [5]amazing group of volunteers is what makes GCC successful.
And finally, we can't in good conscience fail to mention some
- [7]caveats to using GCC 2.95.
+ [6]caveats to using GCC 2.95.
- Download GCC 2.95 from one of our many [8]mirror sites.
+ Download GCC 2.95 from one of our many [7]mirror sites.
- For additional information about GCC please see the [9]GCC project web
- server or contact the [10]GCC development mailing list.
+ For additional information about GCC please see the [8]GCC project web
+ server or contact the [9]GCC development mailing list.
For questions related to the use of GCC, please consult these web
- pages and the [11]GCC manuals. If that fails, the
- [12]gcc-help@gcc.gnu.org mailing list might help. Comments on these
+ pages and the [10]GCC manuals. If that fails, the
+ [11]gcc-help@gcc.gnu.org mailing list might help. Comments on these
web pages and the development of GCC are welcome on our developer
- list at [13]gcc@gcc.gnu.org. All of [14]our lists have public
+ list at [12]gcc@gcc.gnu.org. All of [13]our lists have public
archives.
- Copyright (C) [15]Free Software Foundation, Inc. Verbatim copying and
+ Copyright (C) [14]Free Software Foundation, Inc. Verbatim copying and
distribution of this entire article is permitted in any medium,
provided this notice is preserved.
- These pages are [16]maintained by the GCC team. Last modified
- 2012-11-02[17].
+ These pages are [15]maintained by the GCC team. Last modified
+ 2014-06-28[16].
References
1. http://gcc.gnu.org/gcc-2.95/regress.html
2. http://gcc.gnu.org/gcc-2.95/othertest.html
3. http://gcc.gnu.org/gcc-2.95/features.html
- 4. http://gcc.gnu.org/install/
- 5. http://gcc.gnu.org/gcc-2.95/buildstat.html
- 6. http://gcc.gnu.org/onlinedocs/gcc/Contributors.html
- 7. http://gcc.gnu.org/gcc-2.95/caveats.html
- 8. http://gcc.gnu.org/mirrors.html
- 9. http://gcc.gnu.org/index.html
- 10. mailto:gcc@gcc.gnu.org
- 11. http://gcc.gnu.org/onlinedocs/
- 12. mailto:gcc-help@gcc.gnu.org
- 13. mailto:gcc@gcc.gnu.org
- 14. http://gcc.gnu.org/lists.html
- 15. http://www.fsf.org/
- 16. http://gcc.gnu.org/about.html
- 17. http://validator.w3.org/check/referer
+ 4. http://gcc.gnu.org/gcc-2.95/buildstat.html
+ 5. https://gcc.gnu.org/onlinedocs/gcc/Contributors.html
+ 6. http://gcc.gnu.org/gcc-2.95/caveats.html
+ 7. http://gcc.gnu.org/mirrors.html
+ 8. http://gcc.gnu.org/index.html
+ 9. mailto:gcc@gcc.gnu.org
+ 10. https://gcc.gnu.org/onlinedocs/
+ 11. mailto:gcc-help@gcc.gnu.org
+ 12. mailto:gcc@gcc.gnu.org
+ 13. https://gcc.gnu.org/lists.html
+ 14. http://www.fsf.org/
+ 15. https://gcc.gnu.org/about.html
+ 16. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-2.95/features.html
GCC 2.95 New Features
provided this notice is preserved.
These pages are [22]maintained by the GCC team. Last modified
- 2012-11-02[23].
+ 2014-06-28[23].
References
6. http://gcc.gnu.org/news/hoist.html
7. http://gcc.gnu.org/news/alias.html
8. http://gcc.gnu.org/gcc-2.95/c++features.html
- 9. http://gcc.gnu.org/onlinedocs/gcc-3.4.6/g77/News.html
+ 9. https://gcc.gnu.org/onlinedocs/gcc-3.4.6/g77/News.html
10. http://gcc.gnu.org/java/gcj-announce.txt
11. http://gcc.gnu.org/news/javaannounce.html
12. http://gcc.gnu.org/c99status.html
14. http://gcc.gnu.org/news/sparc.html
15. http://gcc.gnu.org/news/egcs-vcg.html
16. http://gcc.gnu.org/egcs-1.0/features-2.8.html
- 17. http://gcc.gnu.org/onlinedocs/
+ 17. https://gcc.gnu.org/onlinedocs/
18. mailto:gcc-help@gcc.gnu.org
19. mailto:gcc@gcc.gnu.org
- 20. http://gcc.gnu.org/lists.html
+ 20. https://gcc.gnu.org/lists.html
21. http://www.fsf.org/
- 22. http://gcc.gnu.org/about.html
+ 22. https://gcc.gnu.org/about.html
23. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-2.95/caveats.html
provided this notice is preserved.
These pages are [7]maintained by the GCC team. Last modified
- 2012-11-02[8].
+ 2014-06-12[8].
References
1. ftp://gcc.gnu.org/pub/gcc/infrastructure/libg++-2.8.1.3.tar.gz
- 2. http://gcc.gnu.org/onlinedocs/
+ 2. https://gcc.gnu.org/onlinedocs/
3. mailto:gcc-help@gcc.gnu.org
4. mailto:gcc@gcc.gnu.org
- 5. http://gcc.gnu.org/lists.html
+ 5. https://gcc.gnu.org/lists.html
6. http://www.fsf.org/
- 7. http://gcc.gnu.org/about.html
+ 7. https://gcc.gnu.org/about.html
8. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/egcs-1.1/index.html
Each release includes installation instructions in both HTML and
plaintext forms (see the INSTALL directory in the toplevel directory of
the distribution). However, we also keep the most up to date
- [6]installation instructions and [7]build/test status on our web page.
- We will update those pages as new information becomes available.
+ installation instructions and [6]build/test status on our web page. We
+ will update those pages as new information becomes available.
The EGCS project would like to thank the numerous people that have
- contributed new features, test results, bugfixes, etc. This [8]amazing
+ contributed new features, test results, bugfixes, etc. This [7]amazing
group of volunteers is what makes EGCS successful.
And finally, we can't in good conscience fail to mention some
- [9]caveats to using EGCS 1.1.
+ [8]caveats to using EGCS 1.1.
Download EGCS from egcs.cygnus.com (USA California).
The EGCS 1.1 release is also available on many mirror sites.
- [10]Goto mirror list to find a closer site.
+ [9]Goto mirror list to find a closer site.
For questions related to the use of GCC, please consult these web
- pages and the [11]GCC manuals. If that fails, the
- [12]gcc-help@gcc.gnu.org mailing list might help. Comments on these
+ pages and the [10]GCC manuals. If that fails, the
+ [11]gcc-help@gcc.gnu.org mailing list might help. Comments on these
web pages and the development of GCC are welcome on our developer
- list at [13]gcc@gcc.gnu.org. All of [14]our lists have public
+ list at [12]gcc@gcc.gnu.org. All of [13]our lists have public
archives.
- Copyright (C) [15]Free Software Foundation, Inc. Verbatim copying and
+ Copyright (C) [14]Free Software Foundation, Inc. Verbatim copying and
distribution of this entire article is permitted in any medium,
provided this notice is preserved.
- These pages are [16]maintained by the GCC team. Last modified
- 2012-11-02[17].
+ These pages are [15]maintained by the GCC team. Last modified
+ 2014-06-28[16].
References
3. http://gcc.gnu.org/news/alias.html
4. http://gcc.gnu.org/egcs-1.1/c++features.html
5. http://gcc.gnu.org/egcs-1.1/features.html
- 6. http://gcc.gnu.org/install/
- 7. http://gcc.gnu.org/egcs-1.1/buildstat.html
- 8. http://gcc.gnu.org/onlinedocs/gcc/Contributors.html
- 9. http://gcc.gnu.org/egcs-1.1/caveats.html
- 10. http://gcc.gnu.org/mirrors.html
- 11. http://gcc.gnu.org/onlinedocs/
- 12. mailto:gcc-help@gcc.gnu.org
- 13. mailto:gcc@gcc.gnu.org
- 14. http://gcc.gnu.org/lists.html
- 15. http://www.fsf.org/
- 16. http://gcc.gnu.org/about.html
- 17. http://validator.w3.org/check/referer
+ 6. http://gcc.gnu.org/egcs-1.1/buildstat.html
+ 7. https://gcc.gnu.org/onlinedocs/gcc/Contributors.html
+ 8. http://gcc.gnu.org/egcs-1.1/caveats.html
+ 9. http://gcc.gnu.org/mirrors.html
+ 10. https://gcc.gnu.org/onlinedocs/
+ 11. mailto:gcc-help@gcc.gnu.org
+ 12. mailto:gcc@gcc.gnu.org
+ 13. https://gcc.gnu.org/lists.html
+ 14. http://www.fsf.org/
+ 15. https://gcc.gnu.org/about.html
+ 16. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/egcs-1.1/features.html
EGCS 1.1 new features
provided this notice is preserved.
These pages are [10]maintained by the GCC team. Last modified
- 2012-11-02[11].
+ 2014-06-12[11].
References
2. http://gcc.gnu.org/news/gcse.html
3. http://gcc.gnu.org/news/alias.html
4. http://gcc.gnu.org/egcs-1.0/features-2.8.html
- 5. http://gcc.gnu.org/onlinedocs/
+ 5. https://gcc.gnu.org/onlinedocs/
6. mailto:gcc-help@gcc.gnu.org
7. mailto:gcc@gcc.gnu.org
- 8. http://gcc.gnu.org/lists.html
+ 8. https://gcc.gnu.org/lists.html
9. http://www.fsf.org/
- 10. http://gcc.gnu.org/about.html
+ 10. https://gcc.gnu.org/about.html
11. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/egcs-1.1/caveats.html
provided this notice is preserved.
These pages are [6]maintained by the GCC team. Last modified
- 2012-11-02[7].
+ 2014-06-12[7].
References
- 1. http://gcc.gnu.org/onlinedocs/
+ 1. https://gcc.gnu.org/onlinedocs/
2. mailto:gcc-help@gcc.gnu.org
3. mailto:gcc@gcc.gnu.org
- 4. http://gcc.gnu.org/lists.html
+ 4. https://gcc.gnu.org/lists.html
5. http://www.fsf.org/
- 6. http://gcc.gnu.org/about.html
+ 6. https://gcc.gnu.org/about.html
7. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/egcs-1.0/index.html
The EGCS 1.0 releases include installation instructions in both HTML
and plaintext forms (see the INSTALL directory in the toplevel
directory of the distribution). However, we also keep the most up to
- date [2]installation instructions and [3]build/test status on our web
+ date installation instructions and [2]build/test status on our web
page. We will update those pages as new information becomes available.
- And, we can't in good conscience fail to mention some [4]caveats to
+ And, we can't in good conscience fail to mention some [3]caveats to
using EGCS.
Update: Big thanks to Stanford for providing a high speed link for
(USA California -- High speed link provided by Stanford).
The EGCS 1.0 release is also available many mirror sites.
- [5]Goto mirror list to find a closer site
+ [4]Goto mirror list to find a closer site
We'd like to thank the numerous people that have contributed new
features, test results, bugfixes, etc. Unfortunately, they're far too
For questions related to the use of GCC, please consult these web
- pages and the [6]GCC manuals. If that fails, the
- [7]gcc-help@gcc.gnu.org mailing list might help. Comments on these
+ pages and the [5]GCC manuals. If that fails, the
+ [6]gcc-help@gcc.gnu.org mailing list might help. Comments on these
web pages and the development of GCC are welcome on our developer
- list at [8]gcc@gcc.gnu.org. All of [9]our lists have public archives.
+ list at [7]gcc@gcc.gnu.org. All of [8]our lists have public archives.
- Copyright (C) [10]Free Software Foundation, Inc. Verbatim copying and
+ Copyright (C) [9]Free Software Foundation, Inc. Verbatim copying and
distribution of this entire article is permitted in any medium,
provided this notice is preserved.
- These pages are [11]maintained by the GCC team. Last modified
- 2013-12-03[12].
+ These pages are [10]maintained by the GCC team. Last modified
+ 2014-06-28[11].
References
1. http://gcc.gnu.org/egcs-1.0/features.html
- 2. http://gcc.gnu.org/install/
- 3. http://gcc.gnu.org/egcs-1.0/buildstat.html
- 4. http://gcc.gnu.org/egcs-1.0/caveats.html
- 5. http://gcc.gnu.org/mirrors.html
- 6. http://gcc.gnu.org/onlinedocs/
- 7. mailto:gcc-help@gcc.gnu.org
- 8. mailto:gcc@gcc.gnu.org
- 9. http://gcc.gnu.org/lists.html
- 10. http://www.fsf.org/
- 11. http://gcc.gnu.org/about.html
- 12. http://validator.w3.org/check/referer
+ 2. http://gcc.gnu.org/egcs-1.0/buildstat.html
+ 3. http://gcc.gnu.org/egcs-1.0/caveats.html
+ 4. http://gcc.gnu.org/mirrors.html
+ 5. https://gcc.gnu.org/onlinedocs/
+ 6. mailto:gcc-help@gcc.gnu.org
+ 7. mailto:gcc@gcc.gnu.org
+ 8. https://gcc.gnu.org/lists.html
+ 9. http://www.fsf.org/
+ 10. https://gcc.gnu.org/about.html
+ 11. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/egcs-1.0/features.html
EGCS 1.0 features
provided this notice is preserved.
These pages are [8]maintained by the GCC team. Last modified
- 2012-11-02[9].
+ 2014-06-12[9].
References
1. http://gcc.gnu.org/egcs-1.0/features-2.8.html
2. http://gcc.gnu.org/egcs-1.0/c++features.html
- 3. http://gcc.gnu.org/onlinedocs/
+ 3. https://gcc.gnu.org/onlinedocs/
4. mailto:gcc-help@gcc.gnu.org
5. mailto:gcc@gcc.gnu.org
- 6. http://gcc.gnu.org/lists.html
+ 6. https://gcc.gnu.org/lists.html
7. http://www.fsf.org/
- 8. http://gcc.gnu.org/about.html
+ 8. https://gcc.gnu.org/about.html
9. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/egcs-1.0/caveats.html
provided this notice is preserved.
These pages are [6]maintained by the GCC team. Last modified
- 2012-11-02[7].
+ 2014-06-12[7].
References
- 1. http://gcc.gnu.org/onlinedocs/
+ 1. https://gcc.gnu.org/onlinedocs/
2. mailto:gcc-help@gcc.gnu.org
3. mailto:gcc@gcc.gnu.org
- 4. http://gcc.gnu.org/lists.html
+ 4. https://gcc.gnu.org/lists.html
5. http://www.fsf.org/
- 6. http://gcc.gnu.org/about.html
+ 6. https://gcc.gnu.org/about.html
7. http://validator.w3.org/check/referer
======================================================================
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
+2014-06-29 Richard Biener <rguenther@suse.de>
+
+ * gennews: Use gcc-3.0/index.html.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
gcc-3.3/index.html gcc-3.3/changes.html
gcc-3.2/index.html gcc-3.2/changes.html
gcc-3.1/index.html gcc-3.1/changes.html
- gcc-3.0/gcc-3.0.html gcc-3.0/features.html gcc-3.0/caveats.html
+ gcc-3.0/index.html gcc-3.0/features.html gcc-3.0/caveats.html
gcc-2.95/index.html gcc-2.95/features.html gcc-2.95/caveats.html
egcs-1.1/index.html egcs-1.1/features.html egcs-1.1/caveats.html
egcs-1.0/index.html egcs-1.0/features.html egcs-1.0/caveats.html"
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
+2014-07-10 Cary Coutant <ccoutant@google.com>
+
+ Backport from trunk at r212211.
+
+ * dwarf2out.c (remove_addr_table_entry): Remove unnecessary hash table
+ lookup.
+ (resolve_addr_in_expr): When replacing the rtx in a location list
+ entry, get a new address table entry.
+ (dwarf2out_finish): Call index_location_lists even if there are no
+ addr_index_table entries yet.
+
+2014-07-10 Tom G. Christensen <tgc@jupiterrise.com>
+
+ * doc/install.texi: Remove links to defunct package providers for
+ Solaris.
+
+2014-07-10 Eric Botcazou <ebotcazou@adacore.com>
+
+ PR middle-end/53590
+ * function.c (allocate_struct_function): Revert r188667 change.
+
+ * gimple-low.c (lower_builtin_setjmp): Use properly-typed constant.
+
+2014-07-09 Alan Lawrence <alan.lawrence@arm.com>
+
+ Backport r211369 from trunk.
+ 2014-06-09 Alan Lawrence <alan.lawrence@arm.com>
+
+ PR target/61062
+ * config/arm/arm_neon.h (vtrn_s8, vtrn_s16, vtrn_u8, vtrn_u16, vtrn_p8,
+ vtrn_p16, vtrn_s32, vtrn_f32, vtrn_u32, vtrnq_s8, vtrnq_s16, vtrnq_s32,
+ vtrnq_f32, vtrnq_u8, vtrnq_u16, vtrnq_u32, vtrnq_p8, vtrnq_p16, vzip_s8,
+ vzip_s16, vzip_u8, vzip_u16, vzip_p8, vzip_p16, vzip_s32, vzip_f32,
+ vzip_u32, vzipq_s8, vzipq_s16, vzipq_s32, vzipq_f32, vzipq_u8,
+ vzipq_u16, vzipq_u32, vzipq_p8, vzipq_p16, vuzp_s8, vuzp_s16, vuzp_s32,
+ vuzp_f32, vuzp_u8, vuzp_u16, vuzp_u32, vuzp_p8, vuzp_p16, vuzpq_s8,
+ vuzpq_s16, vuzpq_s32, vuzpq_f32, vuzpq_u8, vuzpq_u16, vuzpq_u32,
+ vuzpq_p8, vuzpq_p16): Correct mask for bigendian.
+
+
+2014-07-09 Alan Lawrence <alan.lawrence@arm.com>
+
+ Backport r210219 from trunk.
+ 2014-05-08 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
+
+ * config/arm/arm_neon.h: Update comment.
+ * config/arm/neon-docgen.ml: Delete.
+ * config/arm/neon-gen.ml: Delete.
+ * doc/arm-neon-intrinsics.texi: Update comment.
+
+2014-07-09 Zhenqiang Chen <zhenqiang.chen@linaro.org>
+
+ Backport r211775 from trunk.
+ 2014-06-18 Terry Guo <terry.guo@arm.com>
+
+ PR target/61544
+ * config/arm/arm.c (thumb1_reorg): Move to next basic block if we
+ reach the head.
+
+2014-07-08 Jakub Jelinek <jakub@redhat.com>
+
+ PR rtl-optimization/61673
+ * combine.c (simplify_comparison): Test just mode's sign bit
+ in tmode rather than the sign bit and any bits above it.
+
+2014-07-08 James Greenhalgh <james.greenhalgh@arm.com>
+
+ Backport r212298 from trunk.
+ 2014-07-04 James Greenhalgh <james.greenhalgh@arm.com>
+
+ * config/aarch64/aarch64-simd.md (move_lo_quad_internal_<mode>): New.
+ (move_lo_quad_internal_be_<mode>): Likewise.
+ (move_lo_quad_<mode>): Convert to define_expand.
+ (aarch64_simd_move_hi_quad_<mode>): Gate on BYTES_BIG_ENDIAN.
+ (aarch64_simd_move_hi_quad_be_<mode>): New.
+ (move_hi_quad_<mode>): Use appropriate insn for BYTES_BIG_ENDIAN.
+ (aarch64_combinez<mode>): Gate on BYTES_BIG_ENDIAN.
+ (aarch64_combinez_be<mode>): New.
+ (aarch64_combine<mode>): Convert to define_expand.
+ (aarch64_combine_internal<mode>): New.
+ (aarch64_simd_combine<mode>): Remove bogus RTL description.
+
+2014-07-08 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/61680
+ * tree-vect-data-refs.c (vect_analyze_data_ref_dependence):
+ Handle properly all read-write dependences with group accesses.
+
+ PR tree-optimization/61681
+ * tree-ssa-structalias.c (find_what_var_points_to): Expand
+ NONLOCAL inside ESCAPED.
+
+2014-07-08 Alan Lawrence <alan.lawrence@arm.com>
+
+ Backport r211502 from mainline.
+ 2014-06-10 Alan Lawrence <alan.lawrence@arm.com>
+
+ PR target/59843
+ * config/aarch64/aarch64-modes.def: Add V1DFmode.
+ * config/aarch64/aarch64.c (aarch64_vector_mode_supported_p):
+ Support V1DFmode.
+
+2014-07-08 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/61725
+ * tree-vrp.c (extract_range_basic): Don't assume vr0 is unsigned
+ range, use range_includes_zerop_p instead of integer_zerop on
+ vr0->min, only use log2 of max if min is not negative.
+
+2014-07-06 Gerald Pfeifer <gerald@pfeifer.com>
+
+ * doc/install.texi (Specific, aarch64*-*-*): Fix markup. Reword a bit.
+
+2014-07-04 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/61654
+ * cgraphunit.c (expand_thunk): Call free_dominance_info.
+
+ PR tree-optimization/61684
+ * tree-ssa-ifcombine.c (recognize_single_bit_test): Make sure
+ rhs1 of conversion is a SSA_NAME before using SSA_NAME_DEF_STMT on it.
+
+2014-06-30 Jakub Jelinek <jakub@redhat.com>
+
+ Backported from mainline
+ 2014-06-27 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/57233
+ PR tree-optimization/61299
+ * tree-vect-generic.c (get_compute_type, count_type_subparts): New
+ functions.
+ (expand_vector_operations_1): Use them. If {L,R}ROTATE_EXPR
+ would be lowered to scalar shifts, check if corresponding
+ shifts and vector BIT_IOR_EXPR are supported and don't lower
+ or lower just to narrower vector type in that case.
+ * expmed.c (expand_shift_1): Fix up handling of vector
+ shifts and rotates.
+
+ 2014-06-25 Jakub Jelinek <jakub@redhat.com>
+
+ * langhooks-def.h (LANG_HOOKS_OMP_CLAUSE_LINEAR_CTOR): Define.
+ (LANG_HOOKS_DECLS): Add it.
+ * gimplify.c (gimplify_omp_for): Make sure OMP_CLAUSE_LINEAR_STEP
+ has correct type.
+ * tree.h (OMP_CLAUSE_LINEAR_ARRAY): Define.
+ * langhooks.h (struct lang_hooks_for_decls): Add
+ omp_clause_linear_ctor hook.
+ * omp-low.c (lower_rec_input_clauses): Set max_vf even if
+ OMP_CLAUSE_LINEAR_ARRAY is set. Don't fold_convert
+ OMP_CLAUSE_LINEAR_STEP. For OMP_CLAUSE_LINEAR_ARRAY in
+ combined simd loop use omp_clause_linear_ctor hook.
+
+ 2014-06-24 Jakub Jelinek <jakub@redhat.com>
+
+ * gimplify.c (gimplify_scan_omp_clauses) <case OMP_CLAUSE_MAP,
+ OMP_CLAUSE_TO, OMP_CLAUSE_FROM): Make sure OMP_CLAUSE_SIZE is
+ non-NULL.
+ <case OMP_CLAUSE_ALIGNED>: Gimplify OMP_CLAUSE_ALIGNED_ALIGNMENT.
+ (gimplify_adjust_omp_clauses_1): Make sure OMP_CLAUSE_SIZE is
+ non-NULL.
+ (gimplify_adjust_omp_clauses): Likewise.
+ * omp-low.c (lower_rec_simd_input_clauses,
+ lower_rec_input_clauses, expand_omp_simd): Handle non-constant
+ safelen the same as safelen(1).
+ * tree-nested.c (convert_nonlocal_omp_clauses,
+ convert_local_omp_clauses): Handle OMP_CLAUSE_ALIGNED. For
+ OMP_CLAUSE_{MAP,TO,FROM} if not decl use walk_tree.
+ (convert_nonlocal_reference_stmt, convert_local_reference_stmt):
+ Fixup handling of GIMPLE_OMP_TARGET.
+ (convert_tramp_reference_stmt, convert_gimple_call): Handle
+ GIMPLE_OMP_TARGET.
+
+ 2014-06-18 Jakub Jelinek <jakub@redhat.com>
+
+ * gimplify.c (omp_notice_variable): If n is non-NULL
+ and no flags change in ORT_TARGET region, don't jump to
+ do_outer.
+ (struct gimplify_adjust_omp_clauses_data): New type.
+ (gimplify_adjust_omp_clauses_1): Adjust for data being
+ a struct gimplify_adjust_omp_clauses_data pointer instead
+ of tree *. Pass pre_p as a new argument to
+ lang_hooks.decls.omp_finish_clause hook.
+ (gimplify_adjust_omp_clauses): Add pre_p argument, adjust
+ splay_tree_foreach to pass both list_p and pre_p.
+ (gimplify_omp_parallel, gimplify_omp_task, gimplify_omp_for,
+ gimplify_omp_workshare, gimplify_omp_target_update): Adjust
+ gimplify_adjust_omp_clauses callers.
+ * langhooks.c (lhd_omp_finish_clause): New function.
+ * langhooks-def.h (lhd_omp_finish_clause): New prototype.
+ (LANG_HOOKS_OMP_FINISH_CLAUSE): Define to lhd_omp_finish_clause.
+ * langhooks.h (struct lang_hooks_for_decls): Add a new
+ gimple_seq * argument to omp_finish_clause hook.
+ * omp-low.c (scan_sharing_clauses): Call scan_omp_op on
+ non-DECL_P OMP_CLAUSE_DECL if ctx->outer.
+ (scan_omp_parallel, lower_omp_for): When adding
+ _LOOPTEMP_ clause var, add it to outer ctx's decl_map
+ as identity.
+ * tree-core.h (OMP_CLAUSE_MAP_TO_PSET): New map kind.
+ * tree-nested.c (convert_nonlocal_omp_clauses,
+ convert_local_omp_clauses): Handle various OpenMP 4.0 clauses.
+ * tree-pretty-print.c (dump_omp_clause): Handle
+ OMP_CLAUSE_MAP_TO_PSET.
+
+ 2014-06-10 Jakub Jelinek <jakub@redhat.com>
+
+ PR fortran/60928
+ * omp-low.c (lower_rec_input_clauses) <case OMP_CLAUSE_LASTPRIVATE>:
+ Set lastprivate_firstprivate even if omp_private_outer_ref
+ langhook returns true.
+ <case OMP_CLAUSE_REDUCTION>: When calling omp_clause_default_ctor
+ langhook, call unshare_expr on new_var and call
+ build_outer_var_ref to get the last argument.
+
+ 2014-05-11 Jakub Jelinek <jakub@redhat.com>
+
+ * tree.h (OMP_CLAUSE_LINEAR_STMT): Define.
+ * tree.c (omp_clause_num_ops): Increase OMP_CLAUSE_LINEAR
+ number of operands to 3.
+ (walk_tree_1): Walk all operands of OMP_CLAUSE_LINEAR.
+ * tree-nested.c (convert_nonlocal_omp_clauses,
+ convert_local_omp_clauses): Handle OMP_CLAUSE_DEPEND.
+ * gimplify.c (gimplify_scan_omp_clauses): Handle
+ OMP_CLAUSE_LINEAR_STMT.
+ * omp-low.c (lower_rec_input_clauses): Fix typo.
+ (maybe_add_implicit_barrier_cancel, lower_omp_1): Add
+ cast between Fortran boolean_type_node and C _Bool if
+ needed.
+
+2014-06-30 Jason Merrill <jason@redhat.com>
+
+ PR c++/51253
+ PR c++/61382
+ * gimplify.c (gimplify_arg): Non-static.
+ * gimplify.h: Declare it.
+
+2014-06-30 Marcus Shawcroft <marcus.shawcroft@arm.com>
+
+ Backport from Mainline
+ 2014-06-30 Marcus Shawcroft <marcus.shawcroft@arm.com>
+
+ PR target/61633
+ * config/aarch64/aarch64.md (*aarch64_ashr_sisd_or_int_<mode>3):
+ Add alternative; make early clobber. Adjust both split patterns
+ to use operand 0 as the working register.
+
+2014-06-30 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
+
+ * config/aarch64/iterators.md (VCOND): Handle SI and HI modes.
+ Update comments.
+ (VCONQ): Make comment more helpful.
+ (VCON): Delete.
+ * config/aarch64/aarch64-simd.md
+ (aarch64_sqdmulh_lane<mode>):
+ Use VCOND for operands 2. Update lane checking and flipping logic.
+ (aarch64_sqrdmulh_lane<mode>): Likewise.
+ (aarch64_sq<r>dmulh_lane<mode>_internal): Likewise.
+ (aarch64_sqdmull2<mode>): Remove VCON, use VQ_HSI mode iterator.
+ (aarch64_sqdml<SBINQOPS:as>l_lane<mode>_internal, VD_HSI): Change mode
+ attribute of operand 3 to VCOND.
+ (aarch64_sqdml<SBINQOPS:as>l_lane<mode>_internal, SD_HSI): Likewise.
+ (aarch64_sqdml<SBINQOPS:as>l2_lane<mode>_internal): Likewise.
+ (aarch64_sqdmull_lane<mode>_internal, VD_HSI): Likewise.
+ (aarch64_sqdmull_lane<mode>_internal, SD_HSI): Likewise.
+ (aarch64_sqdmull2_lane<mode>_internal): Likewise.
+ (aarch64_sqdml<SBINQOPS:as>l_laneq<mode>_internal, VD_HSI: New
+ define_insn.
+ (aarch64_sqdml<SBINQOPS:as>l_laneq<mode>_internal, SD_HSI): Likewise.
+ (aarch64_sqdml<SBINQOPS:as>l2_laneq<mode>_internal): Likewise.
+ (aarch64_sqdmull_laneq<mode>_internal, VD_HSI): Likewise.
+ (aarch64_sqdmull_laneq<mode>_internal, SD_HSI): Likewise.
+ (aarch64_sqdmull2_laneq<mode>_internal): Likewise.
+ (aarch64_sqdmlal_lane<mode>): Change mode attribute of penultimate
+ operand to VCOND. Update lane flipping and bounds checking logic.
+ (aarch64_sqdmlal2_lane<mode>): Likewise.
+ (aarch64_sqdmlsl_lane<mode>): Likewise.
+ (aarch64_sqdmull_lane<mode>): Likewise.
+ (aarch64_sqdmull2_lane<mode>): Likewise.
+ (aarch64_sqdmlal_laneq<mode>):
+ Replace VCON usage with VCONQ.
+ Emit aarch64_sqdmlal_laneq<mode>_internal insn.
+ (aarch64_sqdmlal2_laneq<mode>): Emit
+ aarch64_sqdmlal2_laneq<mode>_internal insn.
+ Replace VCON with VCONQ.
+ (aarch64_sqdmlsl2_lane<mode>): Replace VCON with VCONQ.
+ (aarch64_sqdmlsl2_laneq<mode>): Likewise.
+ (aarch64_sqdmull_laneq<mode>): Emit
+ aarch64_sqdmull_laneq<mode>_internal insn.
+ Replace VCON with VCONQ.
+ (aarch64_sqdmull2_laneq<mode>): Emit
+ aarch64_sqdmull2_laneq<mode>_internal insn.
+ (aarch64_sqdmlsl_laneq<mode>): Replace VCON usage with VCONQ.
+ * config/aarch64/arm_neon.h (vqdmlal_high_lane_s16): Change type
+ of 3rd argument to int16x4_t.
+ (vqdmlalh_lane_s16): Likewise.
+ (vqdmlslh_lane_s16): Likewise.
+ (vqdmull_high_lane_s16): Likewise.
+ (vqdmullh_lane_s16): Change type of 2nd argument to int16x4_t.
+ (vqdmlal_lane_s16): Don't create temporary int16x8_t value.
+ (vqdmlsl_lane_s16): Likewise.
+ (vqdmull_lane_s16): Don't create temporary int16x8_t value.
+ (vqdmlal_high_lane_s32): Change type 3rd argument to int32x2_t.
+ (vqdmlals_lane_s32): Likewise.
+ (vqdmlsls_lane_s32): Likewise.
+ (vqdmull_high_lane_s32): Change type 2nd argument to int32x2_t.
+ (vqdmulls_lane_s32): Likewise.
+ (vqdmlal_lane_s32): Don't create temporary int32x4_t value.
+ (vqdmlsl_lane_s32): Likewise.
+ (vqdmull_lane_s32): Don't create temporary int32x4_t value.
+ (vqdmulhh_lane_s16): Change type of second argument to int16x4_t.
+ (vqrdmulhh_lane_s16): Likewise.
+ (vqdmlsl_high_lane_s16): Likewise.
+ (vqdmulhs_lane_s32): Change type of second argument to int32x2_t.
+ (vqdmlsl_high_lane_s32): Likewise.
+ (vqrdmulhs_lane_s32): Likewise.
+
+2014-06-30 Thomas Preud'homme <thomas.preudhomme@arm.com>
+
+ Backport from Mainline
+ 2014-06-20 Jakub Jelinek <jakub@redhat.com>
+ 2014-06-11 Thomas Preud'homme <thomas.preudhomme@arm.com>
+
+ PR tree-optimization/61306
+ * tree-ssa-math-opts.c (struct symbolic_number): Store type of
+ expression instead of its size.
+ (do_shift_rotate): Adapt to change in struct symbolic_number. Return
+ false to prevent optimization when the result is unpredictable due to
+ arithmetic right shift of signed type with highest byte is set.
+ (verify_symbolic_number_p): Adapt to change in struct symbolic_number.
+ (find_bswap_1): Likewise. Return NULL to prevent optimization when the
+ result is unpredictable due to sign extension.
+ (find_bswap): Adapt to change in struct symbolic_number.
+
+2014-06-27 Martin Jambor <mjambor@suse.cz>
+
+ PR ipa/61160
+ * cgraphclones.c (duplicate_thunk_for_node): Removed parameter
+ args_to_skip, use those from node instead. Copy args_to_skip and
+ combined_args_to_skip from node to the new thunk.
+ (redirect_edge_duplicating_thunks): Removed parameter args_to_skip.
+ (cgraph_create_virtual_clone): Moved computation of
+ combined_args_to_skip...
+ (cgraph_clone_node): ...here, simplify it to bitmap_ior..
+
+2014-06-27 Uros Bizjak <ubizjak@gmail.com>
+
+ Backport from mainline
+ 2014-06-26 Uros Bizjak <ubizjak@gmail.com>
+
+ PR target/61586
+ * config/alpha/alpha.c (alpha_handle_trap_shadows): Handle BARRIER RTX.
+
+2014-06-26 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
+
+ PR target/61542
+ * config/rs6000/vsx.md (vsx_extract_v4sf): Fix bug with element
+ extraction other than index 3.
+
+2014-06-26 Marc Glisse <marc.glisse@inria.fr>
+
+ PR target/61503
+ * config/i386/i386.md (x86_64_shrd, x86_shrd,
+ ix86_rotr<dwi>3_doubleword): Replace ashiftrt with lshiftrt.
+
+2014-06-26 Martin Jambor <mjambor@suse.cz>
+
+ Backport from mainline
+ * ipa-prop.c (ipa_impossible_devirt_target): No longer static,
+ renamed to ipa_impossible_devirt_target. Fix typo.
+ * ipa-prop.h (ipa_impossible_devirt_target): Declare.
+ * ipa-cp.c (ipa_get_indirect_edge_target_1): Use
+ ipa_impossible_devirt_target.
+
+2014-06-24 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/61570
+ * config/i386/driver-i386.c (host_detect_local_cpu): For unknown
+ model family 6 CPU with has_longmode never use a CPU without
+ 64-bit support.
+
+ * gimplify.c (gimplify_omp_for): For #pragma omp for simd iterator
+ not mentioned in clauses use private clause if the iterator is
+ declared in #pragma omp for simd, and when adding lastprivate
+ instead, add it to the outer #pragma omp for too. Diagnose
+ if the variable is private in outer context. For simd collapse > 1
+ loops, replace all iterators with temporaries.
+ * omp-low.c (lower_rec_input_clauses): Handle LINEAR clause the
+ same even in collapse > 1 loops.
+
+2014-06-23 Alan Modra <amodra@gmail.com>
+
+ PR bootstrap/61583
+ * tree-vrp.c (remove_range_assertions): Do not set is_unreachable
+ to zero on debug statements.
+
+2014-06-10 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
+
+ * config/aarch64/aarch64-simd.md (aarch64_sqdmulh_lane<mode>):
+ New expander.
+ (aarch64_sqrdmulh_lane<mode>): Likewise.
+ (aarch64_sq<r>dmulh_lane<mode>): Rename to...
+ (aarch64_sq<r>dmulh_lane<mode>_interna): ...this.
+ (aarch64_sqdmulh_laneq<mode>): New expander.
+ (aarch64_sqrdmulh_laneq<mode>): Likewise.
+ (aarch64_sq<r>dmulh_laneq<mode>): Rename to...
+ (aarch64_sq<r>dmulh_laneq<mode>_internal): ...this.
+ (aarch64_sqdmulh_lane<mode>): New expander.
+ (aarch64_sqrdmulh_lane<mode>): Likewise.
+ (aarch64_sq<r>dmulh_lane<mode>): Rename to...
+ (aarch64_sq<r>dmulh_lane<mode>_internal): ...this.
+ (aarch64_sqdmlal_lane<mode>): Add lane flip for big-endian.
+ (aarch64_sqdmlal_laneq<mode>): Likewise.
+ (aarch64_sqdmlsl_lane<mode>): Likewise.
+ (aarch64_sqdmlsl_laneq<mode>): Likewise.
+ (aarch64_sqdmlal2_lane<mode>): Likewise.
+ (aarch64_sqdmlal2_laneq<mode>): Likewise.
+ (aarch64_sqdmlsl2_lane<mode>): Likewise.
+ (aarch64_sqdmlsl2_laneq<mode>): Likewise.
+ (aarch64_sqdmull_lane<mode>): Likewise.
+ (aarch64_sqdmull_laneq<mode>): Likewise.
+ (aarch64_sqdmull2_lane<mode>): Likewise.
+ (aarch64_sqdmull2_laneq<mode>): Likewise.
+
+2014-06-20 Martin Jambor <mjambor@suse.cz>
+
+ PR ipa/61540
+ * ipa-prop.c (impossible_devirt_target): New function.
+ (try_make_edge_direct_virtual_call): Use it, also instead of
+ asserting.
+
+2014-06-20 Martin Jambor <mjambor@suse.cz>
+
+ PR ipa/61211
+ * cgraph.c (clone_of_p): Allow skipped_branch to deal with
+ expanded clones.
+
+2014-06-20 Chung-Lin Tang <cltang@codesourcery.com>
+
+ Backport from mainline
+
+ 2014-06-20 Julian Brown <julian@codesourcery.com>
+ Chung-Lin Tang <cltang@codesourcery.com>
+
+ * config/arm/arm.c (arm_output_mi_thunk): Fix offset for
+ TARGET_THUMB1_ONLY. Add comments.
+
+2014-06-18 Uros Bizjak <ubizjak@gmail.com>
+
+ Backport from mainline
+ 2014-06-16 Uros Bizjak <ubizjak@gmail.com>
+
+ * config/i386/i386.c (decide_alg): Correctly handle
+ maximum size of stringop algorithm.
+
+2014-06-18 Richard Henderson <rth@redhat.com>
+
+ PR target/61545
+ * config/aarch64/aarch64.md (tlsdesc_small): Clobber CC_REGNUM.
+
+2014-06-17 Yufeng Zhang <yufeng.zhang@arm.com>
+
+ PR target/61483
+ * config/aarch64/aarch64.c (aarch64_layout_arg): Add new local
+ variable 'size'; calculate 'size' right in the front; use
+ 'size' to compute 'nregs' (when 'allocate_ncrn != 0') and
+ pcum->aapcs_stack_words.
+
+2014-06-17 Nick Clifton <nickc@redhat.com>
+
+ * config/msp430/msp430.md (mulhisi3): Add a NOP after the DINT.
+ (umulhi3, mulsidi3, umulsidi3): Likewise.
+
+2014-06-17 Uros Bizjak <ubizjak@gmail.com>
+
+ Backport from mainline
+ 2014-06-06 Uros Bizjak <ubizjak@gmail.com>
+
+ PR target/61423
+ * config/i386/i386.md (*floatunssi<mode>2_i387_with_xmm): New
+ define_insn_and_split pattern, merged from *floatunssi<mode>2_1
+ and corresponding splitters. Zero extend general register
+ or memory input operand to XMM temporary. Enable for
+ TARGET_SSE2 and TARGET_INTER_UNIT_MOVES_TO_VEC only.
+ (floatunssi<mode>2): Update expander predicate.
+
+2014-06-16 Vladimir Makarov <vmakarov@redhat.com>
+
+ PR rtl-optimization/61325
+ * lra-constraints.c (valid_address_p): Add forward declaration.
+ (simplify_operand_subreg): Check address validity before and after
+ alter_reg of memory subreg.
+
+2014-06-18 Jakub Jelinek <jakub@redhat.com>
+
+ PR plugins/45078
+ * config.gcc (arm*-*-linux-*): Include vxworks-dummy.h in tm_file.
+
+2014-06-13 Peter Bergner <bergner@vnet.ibm.com>
+
+ Backport from mainline
+
+ 2014-06-13 Peter Bergner <bergner@vnet.ibm.com>
+ PR target/61415
+ * config/rs6000/rs6000-builtin.def (BU_MISC_1): Delete.
+ (BU_MISC_2): Rename to ...
+ (BU_LDBL128_2): ... this.
+ * config/rs6000/rs6000.h (RS6000_BTM_LDBL128): New define.
+ (RS6000_BTM_COMMON): Add RS6000_BTM_LDBL128.
+ * config/rs6000/rs6000.c (rs6000_builtin_mask_calculate): Handle
+ RS6000_BTM_LDBL128.
+ (rs6000_invalid_builtin): Add long double 128-bit builtin support.
+ (rs6000_builtin_mask_names): Add RS6000_BTM_LDBL128.
+ * config/rs6000/rs6000.md (unpacktf_0): Remove define)expand.
+ (unpacktf_1): Likewise.
+ * doc/extend.texi (__builtin_longdouble_dw0): Remove documentation.
+ (__builtin_longdouble_dw1): Likewise.
+ * doc/sourcebuild.texi (longdouble128): Document.
+
+2014-06-13 Jeff Law <law@redhat.com>
+
+ Backports from mainline:
+ 2014-06-13 Jeff Law <law@redhat.com>
+
+ PR rtl-optimization/61094
+ PR rtl-optimization/61446
+ * ree.c (combine_reaching_defs): Get the mode for the copy from
+ the extension insn rather than the defining insn.
+
+ 2014-06-02 Jeff Law <law@redhat.com>
+
+ PR rtl-optimization/61094
+ * ree.c (combine_reaching_defs): Do not reextend an insn if it
+ was marked as do_no_reextend. If a copy is needed to eliminate
+ an extension, then mark it as do_not_reextend.
+
+2014-06-13 Martin Jambor <mjambor@suse.cz>
+
+ PR ipa/61186
+ * ipa-devirt.c (possible_polymorphic_call_targets): Store NULL to
+ cache_token if returning early.
+
+2014-06-12 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/61486
+ * gimplify.c (struct gimplify_omp_ctx): Add distribute field.
+ (gimplify_adjust_omp_clauses): Don't or in GOVD_LASTPRIVATE
+ if outer combined construct is distribute.
+ (gimplify_omp_for): For OMP_DISTRIBUTE set
+ gimplify_omp_ctxp->distribute.
+ * omp-low.c (scan_sharing_clauses) <case OMP_CLAUSE_SHARED>: For
+ GIMPLE_OMP_TEAMS, if decl isn't global in outer context, record
+ mapping into decl map.
+
+2014-06-12 Jeff Law <law@redhat.com>
+
+ Backports from mainline:
+
+ 2014-06-12 Jeff Law <law@redhat.com>
+
+ PR tree-optimization/61009
+ * tree-ssa-threadedge.c (thread_through_normal_block): Correct return
+ value when we stop processing a block due to problematic PHIs.
+
+ 2014-06-05 Jeff Law <law@redhat.com>
+
+ PR tree-optimization/61289
+ * tree-ssa-threadedge.c (invalidate_equivalences): Remove SRC_MAP and
+ DST_MAP parameters. Invalidate by walking all the SSA_NAME_VALUES
+ looking for those which match LHS. All callers changed.
+ (record_temporary_equivalences_from_phis): Remove SRC_MAP and DST_MAP
+ parameters and code which manipulated them. All callers changed.
+ (record_temporary_equivalences_from_stmts_at_dest): Remove SRC_MAP
+ and DST_MAP parameters. Simplify invalidation code by just calling
+ invalidate_equivalences. All callers changed.
+ (thread_across_edge): Simplify now that we don't need to maintain
+ the map of equivalences to invalidate.
+
+2014-06-12 Eric Botcazou <ebotcazou@adacore.com>
+
+ * tree-core.h (DECL_NONALIASED): Use proper spelling in comment.
+
+2014-06-12 Georg-Johann Lay <avr@gjlay.de>
+
+ Backport from 2014-05-14 trunk r210418
+ * config/avr/avr.h (REG_CLASS_CONTENTS): Use unsigned suffix for
+ shifted values to avoid build warning.
+
+2014-06-12 Georg-Johann Lay <avr@gjlay.de>
+
+ Backport from 2014-05-09 trunk r210272
+
+ * config/avr/avr-fixed.md (round<mode>3): Use -1U instead of -1 in
+ unsigned int initializers for regno_in, regno_out.
+
+ Backport from 2014-06-12 trunk r211491
+
+ PR target/61443
+ * config/avr/avr.md (push<mode>1): Avoid (subreg(mem)) when
+ loading from address spaces.
+
+2014-06-12 Alan Modra <amodra@gmail.com>
+
+ PR target/61300
+ * doc/tm.texi.in (INCOMING_REG_PARM_STACK_SPACE): Document.
+ * doc/tm.texi: Regenerate.
+ * function.c (INCOMING_REG_PARM_STACK_SPACE): Provide default.
+ Use throughout in place of REG_PARM_STACK_SPACE.
+ * config/rs6000/rs6000.c (rs6000_reg_parm_stack_space): Add
+ "incoming" param. Pass to rs6000_function_parms_need_stack.
+ (rs6000_function_parms_need_stack): Add "incoming" param, ignore
+ prototype_p when incoming. Use function decl when incoming
+ to handle K&R style functions.
+ * config/rs6000/rs6000.h (REG_PARM_STACK_SPACE): Adjust.
+ (INCOMING_REG_PARM_STACK_SPACE): Define.
+
+2014-06-11 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/61452
+ * tree-ssa-sccvn.c (visit_phi): Remove pointless setting of
+ expr and has_constants in case we found a leader.
+ (simplify_binary_expression): Always valueize operands first.
+ (simplify_unary_expression): Likewise.
+
+2014-06-11 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/61456
+ * tree-ssa-alias.c (nonoverlapping_component_refs_of_decl_p):
+ Do not use the main variant for the type comparison.
+
+2014-06-10 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
+
+ * doc/arm-acle-intrinsics.texi: Specify when CRC32 intrinsics are
+ available.
+ Simplify description of __crc32d and __crc32cd intrinsics.
+ * doc/extend.texi (ARM ACLE Intrinsics): Remove comment about CRC32
+ availability.
+
+2014-06-07 Eric Botcazou <ebotcazou@adacore.com>
+
+ * tree-ssa-tail-merge.c (same_succ_hash): Hash the static chain of a
+ call statement, if any.
+ (gimple_equal_p) <GIMPLE_CALL>: Compare the static chain of the call
+ statements, if any. Tidy up.
+
+2014-06-06 Michael Meissner <meissner@linux.vnet.ibm.com>
+
+ Back port from trunk
+ 2014-06-06 Michael Meissner <meissner@linux.vnet.ibm.com>
+
+ PR target/61431
+ * config/rs6000/vsx.md (VSX_LE): Split VSX_D into 2 separate
+ iterators, VSX_D that handles 64-bit types, and VSX_LE that
+ handles swapping the two 64-bit double words on little endian
+ systems. Include V1TImode and optionally TImode in VSX_LE so that
+ these types are properly swapped. Change all of the insns and
+ splits that do the 64-bit swaps to use VSX_LE.
+ (vsx_le_perm_load_<mode>): Likewise.
+ (vsx_le_perm_store_<mode>): Likewise.
+ (splitters for little endian memory operations): Likewise.
+ (vsx_xxpermdi2_le_<mode>): Likewise.
+ (vsx_lxvd2x2_le_<mode>): Likewise.
+ (vsx_stxvd2x2_le_<mode>): Likewise.
+
+2014-06-06 Vladimir Makarov <vmakarov@redhat.com>
+
+ PR rtl-optimization/61325
+ * lra-constraints.c (process_address_1): Check scale equal to one
+ to prevent transformation: base + scale * index => base + new_reg.
+
+2014-06-05 Martin Jambor <mjambor@suse.cz>
+
+ PR ipa/61393
+ * ipa-cp.c (determine_versionability): Pretend that tm_clones are
+ not versionable.
+
+2014-06-04 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/61383
+ * tree-ssa-ifcombine.c (bb_no_side_effects_p): Make sure
+ stmts can't trap.
+
+2014-06-02 Jason Merrill <jason@redhat.com>
+
+ PR c++/61020
+ * varpool.c (ctor_for_folding): Handle uninitialized vtables.
+
+2014-06-03 Martin Jambor <mjambor@suse.cz>
+
+ PR ipa/61160
+ * ipa-cp.c (cgraph_edge_brings_value_p): Handle edges leading to
+ thunks.
+
+2014-06-03 Andrey Belevantsev <abel@ispras.ru>
+
+ Backport from mainline
+ 2014-05-14 Andrey Belevantsev <abel@ispras.ru>
+
+ PR rtl-optimization/60866
+ * sel-sched-ir (sel_init_new_insn): New parameter old_seqno.
+ Default it to -1. Pass it down to init_simplejump_data.
+ (init_simplejump_data): New parameter old_seqno. Pass it down
+ to get_seqno_for_a_jump.
+ (get_seqno_for_a_jump): New parameter old_seqno. Use it for
+ initializing new jump seqno as a last resort. Add comment.
+ (sel_redirect_edge_and_branch): Save old seqno of the conditional
+ jump and pass it down to sel_init_new_insn.
+ (sel_redirect_edge_and_branch_force): Likewise.
+
+2014-06-03 Andrey Belevantsev <abel@ispras.ru>
+
+ Backport from mainline
+ 2014-05-14 Andrey Belevantsev <abel@ispras.ru>
+
+ PR rtl-optimization/60901
+ * config/i386/i386.c (ix86_dependencies_evaluation_hook): Check that
+ bb predecessor belongs to the same scheduling region. Adjust comment.
+
+2014-06-03 Uros Bizjak <ubizjak@gmail.com>
+
+ Backport from mainline
+ 2014-06-02 Uros Bizjak <ubizjak@gmail.com>
+
+ PR target/61239
+ * config/i386/i386.c (ix86_expand_vec_perm) [case V32QImode]: Use
+ GEN_INT (-128) instead of GEN_INT (128) to set MSB of QImode constant.
+
+2014-05-29 Vladimir Makarov <vmakarov@redhat.com>
+
+ PR rtl-optimization/61325
+ * lra-constraints.c (process_address): Rename to
+ process_address_1.
+ (process_address): New function.
+
+2014-05-29 Uros Bizjak <ubizjak@gmail.com>
+
+ Backport from mainline
+ 2014-05-26 Uros Bizjak <ubizjak@gmail.com>
+
+ PR target/61271
+ * config/i386/i386.c (ix86_rtx_costs)
+ <case CONST_INT, case CONST, case LABEL_REF, case SYMBOL_REF>:
+ Fix condition.
+
+2014-05-28 Eric Botcazou <ebotcazou@adacore.com>
+
+ Backport from mainline
+ 2014-05-27 Eric Botcazou <ebotcazou@adacore.com>
+
+ * double-int.c (div_and_round_double) <ROUND_DIV_EXPR>: Use the proper
+ predicate to detect a negative quotient.
+
+2014-05-28 Richard Biener <rguenther@suse.de>
+
+ Backport from mainline
+ 2014-05-28 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/61045
+ * fold-const.c (fold_comparison): When folding
+ X +- C1 CMP Y +- C2 to X CMP Y +- C2 +- C1 also ensure
+ the sign of the remaining constant operand stays the same.
+
+ 2014-05-05 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/61010
+ * fold-const.c (fold_binary_loc): Consistently avoid
+ canonicalizing X & CST away from a CST that is the mask
+ of a mode.
+
+ 2014-04-28 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/60979
+ * graphite-scop-detection.c (scopdet_basic_block_info): Reject
+ SCOPs that end in a block with a successor with abnormal
+ predecessors.
+
+2014-05-28 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+
+ * configure.ac ($gcc_cv_ld_clearcap): New test.
+ * configure: Regenerate.
+ * config.in: Regenerate.
+ * config/sol2.opt (mclear-hwcap): New option.
+ * config/sol2.h (LINK_CLEARCAP_SPEC): Define.
+ * config/sol2-clearcap.map: Moved here from
+ testsuite/gcc.target/i386/clearcap.map.
+ * config/sol2-clearcapv2.map: Move here from
+ gcc.target/i386/clearcapv2.map.
+ * config/t-sol2 (install): Depend on install-clearcap-map.
+ (install-clearcap-map): New target.
+ * doc/invoke.texi (Option Summary, Solaris 2 Options): Document
+ -mclear-hwcap.
+
+2014-05-28 Georg-Johann Lay <avr@gjlay.de>
+
+ PR libgcc/61152
+ * config/dbx.h (License): Add Runtime Library Exception.
+ * config/newlib-stdint.h (License): Same.
+ * config/rtems.h (License): Same
+ * config/initfini-array.h (License): Same
+ * config/v850/v850.h (License): Same.
+ * config/v850/v850-opts.h (License): Same
+ * config/v850/rtems.h (License): Same.
+
+2014-05-28 Georg-Johann Lay <avr@gjlay.de>
+
+ PR target/61044
+ * doc/extend.texi (Local Labels): Note that label differences are
+ not supported for AVR.
+
+2014-05-27 Georg-Johann Lay <avr@gjlay.de>
+
+ Backport from 2014-05-12 mainline r210322.
+ Backport from 2014-05-27 mainline r210959, r210969.
+
+ PR libgcc/61152
+ * config/arm/arm.h (License): Add GCC Runtime Library Exception.
+ * config/arm/arm-cores.def (License): Same.
+ * config/arm/arm-opts.h (License): Same.
+ * config/arm/aout.h (License): Same.
+ * config/arm/bpabi.h (License): Same.
+ * config/arm/elf.h (License): Same.
+ * config/arm/linux-elf.h (License): Same.
+ * config/arm/linux-gas.h (License): Same.
+ * config/arm/netbsd-elf.h (License): Same.
+ * config/arm/uclinux-eabi.h (License): Same.
+ * config/arm/uclinux-elf.h (License): Same.
+ * config/arm/vxworks.h (License): Same.
+
+2014-05-26 Michael Tautschnig <mt@debian.org>
+
+ PR target/61249
+ * doc/extend.texi (X86 Built-in Functions): Fix parameter lists of
+ __builtin_ia32_vfrczs[sd] and __builtin_ia32_mpsadbw256.
+
+2014-05-22 Vladimir Makarov <vmakarov@redhat.com>
+
+ PR rtl-optimization/61215
+ * lra-elelimination.c (lra_eliminate_regs_1): Don't use
+ simplify_gen_subreg until final substitution.
+
+2014-05-23 Alan Modra <amodra@gmail.com>
+
+ PR target/61231
+ * config/rs6000/rs6000.c (mem_operand_gpr): Handle SImode.
+ * config/rs6000/rs6000.md (extendsidi2_lfiwax, extendsidi2_nocell):
+ Use "Y" constraint rather than "m".
+
+2014-05-22 Vladimir Makarov <vmakarov@redhat.com>
+
+ PR rtl-optimization/60969
+ * ira-costs.c (record_reg_classes): Process NO_REGS for matching
+ constraints. Set up mem cost for NO_REGS case.
+
+2014-05-22 Peter Bergner <bergner@vnet.ibm.com>
+
+ * config/rs6000/htm.md (ttest): Use correct shift value to get CR0.
+
+2014-05-22 Richard Earnshaw <rearnsha@arm.com>
+
+ PR target/61208
+ * arm.md (arm_cmpdi_unsigned): Fix length calculation for Thumb2.
+
+2014-05-22 Nick Clifton <nickc@redhat.com>
+
+ * config/msp430/msp430.h (ASM_SPEC): Add spaces after inserted options.
+
+2014-05-22 Jakub Jelinek <jakub@redhat.com>
+
+ * tree-streamer-in.c (unpack_ts_real_cst_value_fields): Make sure
+ all padding bits in REAL_VALUE_TYPE are cleared.
+
+2014-05-21 Guozhi Wei <carrot@google.com>
+
+ PR target/61202
+ * config/aarch64/arm_neon.h (vqdmulh_n_s16): Change the last operand's
+ constraint.
+ (vqdmulhq_n_s16): Likewise.
+
+2014-05-21 Martin Jambor <mjambor@suse.cz>
+
+ * doc/invoke.texi (Optimize Options): Document parameters
+ ipa-cp-eval-threshold, ipa-max-agg-items, ipa-cp-loop-hint-bonus and
+ ipa-cp-array-index-hint-bonus.
+
+2014-05-21 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/61252
+ * omp-low.c (handle_simd_reference): New function.
+ (lower_rec_input_clauses): Use it. Defer adding reference
+ initialization even for reduction without placeholder if in simd,
+ handle it properly later on.
+
+2014-05-20 Jan Hubicka <hubicka@ucw.cz>
+
+ PR bootstrap/60984
+ * ipa-inline-transform.c (inline_call): Use add CALLEE_REMOVED
+ parameter.
+ * ipa-inline.c (inline_to_all_callers): If callee was removed; return.
+ (ipa_inline): Loop inline_to_all_callers until no more aliases
+ are removed.
+
+2014-05-20 Jan Hubicka <hubicka@ucw.cz>
+
+ PR lto/60820
+ * varpool.c (varpool_remove_node): Do not alter decls when streaming.
+
+2014-05-20 DJ Delorie <dj@redhat.com>
+
+ * config/msp430/msp430.md (split): Don't allow subregs when
+ splitting SImode adds.
+ (andneghi): Fix subtraction logic.
+ * config/msp430/predicates.md (msp430_nonsubreg_or_imm_operand): New.
+
+2014-05-20 Nick Clifton <nickc@redhat.com>
+
+ * config/msp430/msp430.c (TARGET_GIMPLIFY_VA_ARG_EXPR): Define.
+ (msp430_gimplify_va_arg_expr): New function.
+ (msp430_print_operand): Handle (CONST (ZERO_EXTRACT)).
+
+ * config/msp430/msp430.md (zero_extendpsisi2): Use + constraint on
+ operand 0 in order to prevent confusion about the number of
+ registers involved.
+
+2014-05-20 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
+
+ * config/arm/arm.md (arith_shiftsi): Do not predicate for
+ arm_restrict_it.
+
+2014-05-19 Richard Earnshaw <rearnsha@arm.com>
+
+ * arm.c (thumb1_reorg): When scanning backwards skip anything
+ that's not a proper insn.
+
+2014-05-17 Jan Hubicka <hubicka@ucw.cz>
+
+ * ipa.c (symtab_remove_unreachable_nodes): Remove
+ symbol from comdat group if its body was eliminated.
+ (comdat_can_be_unshared_p_1): Static symbols can always be privatized.
+ * symtab.c (symtab_remove_from_same_comdat_group): Break out from ...
+ (symtab_unregister_node): ... this one.
+ (verify_symtab_base): More strict checking of comdats.
+ * cgraph.h (symtab_remove_from_same_comdat_group): Declare.
+
+2014-05-17 Jan Hubicka <hubicka@ucw.cz>
+
+ * opts.c (common_handle_option): Disable -fipa-reference coorectly
+ with -fuse-profile.
+
+2014-05-17 Jan Hubicka <hubicka@ucw.cz>
+
+ PR ipa/60854
+ * ipa.c (symtab_remove_unreachable_nodes): Mark targets of
+ external aliases alive, too.
+
+2014-05-17 Uros Bizjak <ubizjak@gmail.com>
+
+ * doc/invoke.texi (free): Mention Alpha. Also enabled at -Os.
+
+2014-05-17 Uros Bizjak <ubizjak@gmail.com>
+
+ Backport from mainline
+ 2014-04-25 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR target/60969
+ * config/i386/i386.md (*movsf_internal): Set MODE to SI for
+ alternative 12.
+
+2014-05-16 Vladimir Makarov <vmakarov@redhat.com>
+
+ PR rtl-optimization/60969
+ * ira-costs.c (record_reg_classes): Allow only memory for pseudo.
+ Calculate costs for this case.
+
+2014-05-15 Peter Bergner <bergner@vnet.ibm.com>
+
+ PR target/61193
+ * config/rs6000/htmxlintrin.h (_HTM_TBEGIN_STARTED): New define.
+ (__TM_simple_begin): Use it.
+ (__TM_begin): Likewise.
+
+2014-05-15 Martin Jambor <mjambor@suse.cz>
+
+ PR ipa/61085
+ * ipa-prop.c (update_indirect_edges_after_inlining): Check
+ type_preserved flag when the indirect edge is polymorphic.
+
+2014-05-15 Martin Jambor <mjambor@suse.cz>
+
+ PR ipa/60897
+ * ipa-prop.c (ipa_modify_formal_parameters): Reset DECL_LANG_SPECIFIC.
+
+2014-05-15 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/61158
+ * fold-const.c (fold_binary_loc): If X is zero-extended and
+ shiftc >= prec, make sure zerobits is all ones instead of
+ invoking undefined behavior.
+
+2014-05-14 Cary Coutant <ccoutant@google.com>
+
+ PR debug/61013
+ * opts.c (common_handle_option): Don't special-case "-g".
+ (set_debug_level): Default to at least level 2 with "-g".
+
+2014-05-14 Eric Botcazou <ebotcazou@adacore.com>
+
+ * config/sparc/sparc-protos.h (sparc_absnegfloat_split_legitimate):
+ Delete.
+ * config/sparc/sparc.c (sparc_absnegfloat_split_legitimate): Likewise.
+ * config/sparc/sparc.md (fptype_ut699): New attribute.
+ (in_branch_delay): Return false if -mfix-ut699 is specified and
+ fptype_ut699 is set to single.
+ (truncdfsf2): Add fptype_ut699 attribute.
+ (fix_truncdfsi2): Likewise.
+ (floatsisf2): Change fptype attribute.
+ (fix_truncsfsi2): Likewise.
+ (negtf2_notv9): Delete.
+ (negtf2_v9): Likewise.
+ (negtf2_hq): New instruction.
+ (negtf2): New instruction and splitter.
+ (negdf2_notv9): Rewrite.
+ (abstf2_notv9): Delete.
+ (abstf2_hq_v9): Likewise.
+ (abstf2_v9): Likewise.
+ (abstf2_hq): New instruction.
+ (abstf2): New instruction and splitter.
+ (absdf2_notv9): Rewrite.
+
+2014-05-14 Matthias Klose <doko@ubuntu.com>
+
+ Revert:
+ 2014-05-08 Manuel López-Ibáñez <manu@gcc.gnu.org>
+ Matthias Klose <doko@ubuntu.com>
+
+ PR driver/61106
+ * optc-gen.awk: Fix option handling for -Wunused-parameter.
+
+2014-05-13 Peter Bergner <bergner@vnet.ibm.com>
+
+ * doc/sourcebuild.texi: (dfp_hw): Document.
+ (p8vector_hw): Likewise.
+ (powerpc_eabi_ok): Likewise.
+ (powerpc_elfv2): Likewise.
+ (powerpc_htm_ok): Likewise.
+ (ppc_recip_hw): Likewise.
+ (vsx_hw): Likewise.
+
+2014-05-13 Jeff Law <law@redhat.com>
+
+ Backports fromm mainline:
+
+ 2014-05-08 Jeff Law <law@redhat.com>
+
+ PR tree-optimization/61009
+ * tree-ssa-threadedge.c (thread_through_normal_block): Return a
+ tri-state rather than a boolean. When a block is too big to
+ thread through, inform caller via negative return value.
+ (thread_across_edge): If a block was too big for normal threading,
+ then it's too big for a joiner too, so remove temporary equivalences
+ and return immediately.
+
+ 2014-04-28 Jeff Law <law@redhat.com>
+
+ PR tree-optimization/60902
+ * tree-ssa-threadedge.c
+ (record_temporary_equivalences_from_stmts_at_dest): Only iterate
+ over real defs when invalidating outputs from statements that do not
+ produce useful outputs for threading.
+
+ 2014-04-23 Jeff Law <law@redhat.com>
+
+ PR tree-optimization/60902
+ * tree-ssa-threadedge.c
+ (record_temporary_equivalences_from_stmts_at_dest): Make sure to
+ invalidate outputs from statements that do not produce useful
+ outputs for threading.
+
+2014-05-13 Richard Biener <rguenther@suse.de>
+
+ PR ipa/60973
+ * tree-inline.c (remap_gimple_stmt): Clear tail call flag,
+ it needs revisiting whether the call still may be tail-called.
+
+2014-05-13 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/61060
+ * config/i386/i386.c (ix86_expand_set_or_movmem): If count_exp
+ is const0_rtx, return immediately. Don't test count == 0 when
+ it is always true.
+
+2014-05-12 Senthil Kumar Selvaraj <senthil_kumar.selvaraj@atmel.com>
+
+ Backport from mainline
+ 2014-05-12 Senthil Kumar Selvaraj <senthil_kumar.selvaraj@atmel.com>
+
+ PR target/60991
+ * config/avr/avr.c (avr_out_store_psi): Use correct constant
+ to restore Y.
+
+2014-05-09 Uros Bizjak <ubizjak@gmail.com>
+
+ Backport from mainline
+ 2014-05-08 Uros Bizjak <ubizjak@gmail.com>
+
+ PR target/61092
+ * config/alpha/alpha.c: Include gimple-iterator.h.
+ (alpha_gimple_fold_builtin): New function. Move
+ ALPHA_BUILTIN_UMULH folding from ...
+ (alpha_fold_builtin): ... here.
+ (TARGET_GIMPLE_FOLD_BUILTIN): New define.
+
+2014-05-09 Pitchumani Sivanupandi <Pitchumani.S@atmel.com>
+
+ Backport from 2014-04-16 trunk r209446
+ 2014-04-16 Pitchumani Sivanupandi <Pitchumani.S@atmel.com>
+
+ * config/avr/avr-mcus.def: Correct typo for atxmega256a3bu macro.
+
+2014-05-09 Georg-Johann Lay <avr@gjlay.de>
+
+ Backport from 2014-05-09 trunk r210267
+
+ PR target/61055
+ * config/avr/avr.md (cc): Add new attribute set_vzn.
+ (addqi3, addqq3, adduqq3, subqi3, subqq3, subuqq3, negqi2) [cc]:
+ Set cc insn attribute to set_vzn instead of set_zn for alternatives
+ with INC, DEC or NEG.
+ * config/avr/avr.c (avr_notice_update_cc): Handle SET_VZN.
+ (avr_out_plus_1): ADIW sets cc0 to CC_SET_CZN.
+ INC, DEC and ADD+ADC set cc0 to CC_CLOBBER.
+
+2014-05-08 Manuel López-Ibáñez <manu@gcc.gnu.org>
+ Matthias Klose <doko@ubuntu.com>
+
+ PR driver/61106
+ * optc-gen.awk: Fix option handling for -Wunused-parameter.
+
+2014-05-08 Uros Bizjak <ubizjak@gmail.com>
+
+ PR target/59952
+ * config/i386/i386.c (PTA_HASWELL): Remove PTA_RTM.
+
+2014-05-05 Marek Polacek <polacek@redhat.com>
+
+ Back port from mainline
+ 2014-05-05 Marek Polacek <polacek@redhat.com>
+
+ PR driver/61065
+ * opts.c (common_handle_option): Call error_at instead of warning_at.
+
+2014-05-04 Jan Hubicka <hubicka@ucw.cz>
+
+ PR ipa/60965
+ * ipa-devirt.c (get_class_context): Allow POD to change to non-POD.
+
+2014-05-04 Peter Bergner <bergner@vnet.ibm.com>
+
+ * config/rs6000/rs6000.h (RS6000_BTM_HARD_FLOAT): New define.
+ (RS6000_BTM_COMMON): Add RS6000_BTM_HARD_FLOAT.
+ (TARGET_EXTRA_BUILTINS): Add TARGET_HARD_FLOAT.
+ * config/rs6000/rs6000-builtin.def (BU_MISC_1):
+ Use RS6000_BTM_HARD_FLOAT.
+ (BU_MISC_2): Likewise.
+ * config/rs6000/rs6000.c (rs6000_builtin_mask_calculate): Handle
+ RS6000_BTM_HARD_FLOAT.
+ (rs6000_option_override_internal): Enforce -mhard-float if -mhard-dfp
+ is explicitly used.
+ (rs6000_invalid_builtin): Add hard floating builtin support.
+ (rs6000_expand_builtin): Relax the gcc_assert to allow the new
+ hard float builtins.
+ (rs6000_builtin_mask_names): Add RS6000_BTM_HARD_FLOAT.
+
+2014-05-03 Joey Ye <joey.ye@arm.com>
+
+ Backport from mainline r209463
+ 2014-04-17 Joey Ye <joey.ye@arm.com>
+
+ * opts.c (OPT_fif_conversion, OPT_fif_conversion2): Disable for Og.
+
+2014-05-03 Oleg Endo <olegendo@gcc.gnu.org>
+
+ Back port from mainline
+ PR target/61026
+ * config/sh/sh.c: Include stdlib headers before everything else.
+
+2014-05-02 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
+
+ PR tree-optimization/60930
+ * gimple-ssa-strength-reduction.c (create_mul_imm_cand): Reject
+ creating a multiply candidate by folding two constant
+ multiplicands when the result overflows.
+
+2014-05-02 Jakub Jelinek <jakub@redhat.com>
+
+ * gimplify.c (gimplify_adjust_omp_clauses_1): Handle
+ GOVD_FIRSTPRIVATE | GOVD_LASTPRIVATE.
+ (gimplify_adjust_omp_clauses): Simd region is never
+ directly nested in combined parallel. Instead, for linear
+ with copyin/copyout, if in combined for simd loop, make decl
+ firstprivate/lastprivate on OMP_FOR.
+ * omp-low.c (expand_omp_for_generic, expand_omp_for_static_nochunk,
+ expand_omp_for_static_chunk): When setting endvar, also set
+ fd->loop.v to the same value.
+
+2014-05-02 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
+
+ Back port from mainline
+ 2014-04-24 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
+
+ * config/aarch64/aarch64.h (TARGET_CPU_CPP_BUILTINS): Check
+ TARGET_SIMD rather than TARGET_GENERAL_REGS_ONLY.
+ (TARGET_SIMD): Take AARCH64_ISA_SIMD into account.
+ (TARGET_FLOAT): Take AARCH64_ISA_FP into account.
+ (TARGET_CRYPTO): Take TARGET_SIMD into account.
+
+2014-04-30 Michael Meissner <meissner@linux.vnet.ibm.com>
+
+ Back port from mainline
+ 2014-04-24 Michael Meissner <meissner@linux.vnet.ibm.com>
+
+ * doc/extend.texi (PowerPC Built-in Functions): Document new
+ powerpc extended divide, bcd, pack/unpack 128-bit, builtin
+ functions.
+ (PowerPC AltiVec/VSX Built-in Functions): Likewise.
+
+ * config/rs6000/predicates.md (const_0_to_3_operand): New
+ predicate to match 0..3 integer constants.
+
+ * config/rs6000/rs6000-builtin.def (BU_DFP_MISC_1): Add new macros
+ to support adding miscellaneous builtin functions.
+ (BU_DFP_MISC_2): Likewise.
+ (BU_P7_MISC_1): Likewise.
+ (BU_P7_MISC_2): Likewise.
+ (BU_P8V_MISC_3): Likewise.
+ (BU_MISC_1): Likewise.
+ (BU_MISC_2): Likewise.
+ (DIVWE): Add extended divide builtin functions.
+ (DIVWEO): Likewise.
+ (DIVWEU): Likewise.
+ (DIVWEUO): Likewise.
+ (DIVDE): Likewise.
+ (DIVDEO): Likewise.
+ (DIVDEU): Likewise.
+ (DIVDEUO): Likewise.
+ (DXEX): Add decimal floating-point builtin functions.
+ (DXEXQ): Likewise.
+ (DDEDPD): Likewise.
+ (DDEDPDQ): Likewise.
+ (DENBCD): Likewise.
+ (DENBCDQ): Likewise.
+ (DIEX): Likewise.
+ (DIEXQ): Likewise.
+ (DSCLI): Likewise.
+ (DSCLIQ): Likewise.
+ (DSCRI): Likewise.
+ (DSCRIQ): Likewise.
+ (CDTBCD): Add new BCD builtin functions.
+ (CBCDTD): Likewise.
+ (ADDG6S): Likewise.
+ (BCDADD): Likewise.
+ (BCDADD_LT): Likewise.
+ (BCDADD_EQ): Likewise.
+ (BCDADD_GT): Likewise.
+ (BCDADD_OV): Likewise.
+ (BCDSUB): Likewise.
+ (BCDSUB_LT): Likewise.
+ (BCDSUB_EQ): Likewise.
+ (BCDSUB_GT): Likewise.
+ (BCDSUB_OV): Likewise.
+ (PACK_TD): Add new pack/unpack 128-bit type builtin functions.
+ (UNPACK_TD): Likewise.
+ (PACK_TF): Likewise.
+ (UNPACK_TF): Likewise.
+ (UNPACK_TF_0): Likewise.
+ (UNPACK_TF_1): Likewise.
+ (PACK_V1TI): Likewise.
+ (UNPACK_V1TI): Likewise.
+
+ * config/rs6000/rs6000.c (rs6000_builtin_mask_calculate): Add
+ support for decimal floating point builtin functions.
+ (rs6000_expand_ternop_builtin): Add checks for the new builtin
+ functions that take constant arguments.
+ (rs6000_invalid_builtin): Add decimal floating point builtin
+ support.
+ (rs6000_init_builtins): Setup long double, _Decimal64, and
+ _Decimal128 types for new builtin functions.
+ (builtin_function_type): Set the unsigned flags appropriately for
+ the new builtin functions.
+ (rs6000_opt_masks): Add support for decimal floating point builtin
+ functions.
+
+ * config/rs6000/rs6000.h (RS6000_BTM_DFP): Add support for decimal
+ floating point builtin functions.
+ (RS6000_BTM_COMMON): Likewise.
+ (RS6000_BTI_long_double): Likewise.
+ (RS6000_BTI_dfloat64): Likewise.
+ (RS6000_BTI_dfloat128): Likewise.
+ (long_double_type_internal_node): Likewise.
+ (dfloat64_type_internal_node): Likewise.
+ (dfloat128_type_internal_node): Likewise.
+
+ * config/rs6000/altivec.h (UNSPEC_BCDADD): Add support for ISA
+ 2.07 bcd arithmetic instructions.
+ (UNSPEC_BCDSUB): Likewise.
+ (UNSPEC_BCD_OVERFLOW): Likewise.
+ (UNSPEC_BCD_ADD_SUB): Likewise.
+ (bcd_add_sub): Likewise.
+ (BCD_TEST): Likewise.
+ (bcd<bcd_add_sub>): Likewise.
+ (bcd<bcd_add_sub>_test): Likewise.
+ (bcd<bcd_add_sub>_test2): Likewise.
+ (bcd<bcd_add_sub>_<code>): Likewise.
+ (peephole2 for combined bcd ops): Likewise.
+
+ * config/rs6000/dfp.md (UNSPEC_DDEDPD): Add support for new
+ decimal floating point builtin functions.
+ (UNSPEC_DENBCD): Likewise.
+ (UNSPEC_DXEX): Likewise.
+ (UNSPEC_DIEX): Likewise.
+ (UNSPEC_DSCLI): Likewise.
+ (UNSPEC_DSCRI): Likewise.
+ (D64_D128): Likewise.
+ (dfp_suffix): Likewise.
+ (dfp_ddedpd_<mode>): Likewise.
+ (dfp_denbcd_<mode>): Likewise.
+ (dfp_dxex_<mode>): Likewise.
+ (dfp_diex_<mode>): Likewise.
+ (dfp_dscli_<mode>): Likewise.
+ (dfp_dscri_<mode>): Likewise.
+
+ * config/rs6000/rs6000.md (UNSPEC_ADDG6S): Add support for new BCD
+ builtin functions.
+ (UNSPEC_CDTBCD): Likewise.
+ (UNSPEC_CBCDTD): Likewise.
+ (UNSPEC_DIVE): Add support for new extended divide builtin
+ functions.
+ (UNSPEC_DIVEO): Likewise.
+ (UNSPEC_DIVEU): Likewise.
+ (UNSPEC_DIVEUO): Likewise.
+ (UNSPEC_UNPACK_128BIT): Add support for new builtin functions to
+ pack/unpack 128-bit types.
+ (UNSPEC_PACK_128BIT): Likewise.
+ (idiv_ldiv): New mode attribute to set the 32/64-bit divide type.
+ (udiv<mode>3): Use idiv_ldiv mode attribute.
+ (div<mode>3): Likewise.
+ (addg6s): Add new BCD builtin functions.
+ (cdtbcd): Likewise.
+ (cbcdtd): Likewise.
+ (UNSPEC_DIV_EXTEND): Add support for new extended divide
+ instructions.
+ (div_extend): Likewise.
+ (div<div_extend>_<mode>"): Likewise.
+ (FP128_64): Add support for new builtin functions to pack/unpack
+ 128-bit types.
+ (unpack<mode>): Likewise.
+ (unpacktf_0): Likewise.
+ (unpacktf_1): Likewise.
+ (unpack<mode>_dm): Likewise.
+ (unpack<mode>_nodm): Likewise.
+ (pack<mode>): Likewise.
+ (unpackv1ti): Likewise.
+ (packv1ti): Likewise.
+
+2014-04-29 Pat Haugen <pthaugen@us.ibm.com>
+
+ Backport from mainline
+ 2014-04-17 Pat Haugen <pthaugen@us.ibm.com>
+
+ * config/rs6000/rs6000.md (addti3, subti3): New.
+
+2014-04-29 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/60971
+ * tree-tailcall.c (process_assignment): Reject conversions which
+ reduce precision.
+
+2014-04-29 Nick Clifton <nickc@redhat.com>
+
+ * config/msp430/msp430.md (umulsidi): Fix typo.
+ (mulhisi3): Enable even inside interrupt handlers.
+ * config/msp430/msp430.c (msp430_print_operand): %O: Allow for the
+ bigger return address pushed in large mode.
+
+2014-04-28 Pat Haugen <pthaugen@us.ibm.com>
+
+ * config/rs6000/sync.md (AINT mode_iterator): Move definition.
+ (loadsync_<mode>): Change mode.
+ (load_quadpti, store_quadpti): New.
+ (atomic_load<mode>, atomic_store<mode>): Add support for TI mode.
+ * config/rs6000/rs6000.md (unspec enum): Add UNSPEC_LSQ.
+
+2014-04-28 Eric Botcazou <ebotcazou@adacore.com>
+
+ * configure.ac: Tweak GAS check for LEON instructions on SPARC.
+ * configure: Regenerate.
+ * config/sparc/sparc.opt (muser-mode): New option.
+ * config/sparc/sync.md (atomic_compare_and_swap<mode>_1): Do not enable
+ for LEON3.
+ (atomic_compare_and_swap_leon3_1): New instruction for LEON3.
+ * doc/invoke.texi (SPARC options): Document -muser-mode.
+
+2014-04-26 Markus Trippelsdorf <markus@trippelsdorf.de>
+
+ * doc/install.texi (Building with profile feedback): Remove
+ outdated sentence.
+
+2014-04-26 Tom de Vries <tom@codesourcery.com>
+
+ * config/i386/i386.md (define_expand "ldexpxf3"): Fix out-of-bounds
+ array accesses.
+
+2014-04-25 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/60960
+ * tree-vect-generic.c (expand_vector_operation): Only call
+ expand_vector_divmod if type's mode satisfies VECTOR_MODE_P.
+
+2014-04-25 Eric Botcazou <ebotcazou@adacore.com>
+
+ PR target/60941
+ * config/sparc/sparc.md (ashlsi3_extend): Delete.
+
+2014-04-25 Richard Biener <rguenther@suse.de>
+
+ PR ipa/60912
+ * tree-ssa-structalias.c (ipa_pta_execute): Compute direct
+ call stmt use/clobber sets during stmt walk instead of
+ walking the possibly incomplete set of caller edges.
+
+2014-04-25 Richard Biener <rguenther@suse.de>
+
+ PR ipa/60911
+ * passes.c (apply_ipa_transforms): Inline into only caller ...
+ (execute_one_pass): ... here. Properly bring in function
+ bodies for nodes we want to apply IPA transforms to.
+
+2014-04-24 Jakub Jelinek <jakub@redhat.com>
+
+ * tree.h (OMP_CLAUSE_LINEAR_GIMPLE_SEQ): Define.
+ * gimplify.c (omp_is_private): Change last argument's type to int.
+ Only diagnose lastprivate if the simd argument is 1, only diagnose
+ linear if the simd argument is 2.
+ (gimplify_omp_for): Adjust omp_is_private callers. When adding
+ lastprivate or private, add the clause to OMP_FOR_CLAUSES. Pass
+ GOVD_EXPLICIT to omp_add_variable. For simd with collapse == 1
+ create OMP_CLAUSE_LINEAR rather than OMP_CLAUSE_PRIVATE for var.
+ If var != decl and decl is in OMP_CLAUSE_LINEAR, gimplify decl
+ increment to OMP_CLAUSE_LINEAR_GIMPLE_SEQ.
+ * omp-low.c (scan_sharing_clauses, lower_lastprivate_clauses): Handle
+ OMP_CLAUSE_LINEAR_GIMPLE_SEQ.
+ * tree-nested.c (convert_nonlocal_omp_clauses,
+ convert_local_omp_clauses): Handle OMP_CLAUSE_LINEAR.
+
+2014-04-23 Uros Bizjak <ubizjak@gmail.com>
+
+ Backport from mainline
+ 2014-04-21 Uros Bizjak <ubizjak@gmail.com>
+
+ PR target/60909
+ * config/i386/i386.c (ix86_expand_builtin)
+ <case IX86_BUILTIN_RDRAND{16,32,64}_STEP>: Use temporary
+ register for target RTX.
+ <case IX86_BUILTIN_RDSEED{16,32,64}_STEP>: Ditto.
+
+2014-04-23 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/60903
+ * tree-ssa-loop-im.c (analyze_memory_references): Remove
+ commented code block.
+ (execute_sm_if_changed): Properly apply IRREDUCIBLE_LOOP
+ loop flags to newly created BBs and edges.
+
+2014-04-23 Nick Clifton <nickc@redhat.com>
+
+ * config/msp430/msp430.c (msp430_handle_option): Move function
+ to msp430-common.c
+ (msp430_option_override): Simplify mcu and mcpu option handling.
+ (msp430_is_f5_mcu): Rename to msp430_use_f5_series_hwmult. Add
+ support for -mhwmult command line option.
+ (has_32bit_hwmult): Rename to use_32bit_hwmult. Add support for
+ -mhwmult command line option.
+ (msp430_hwmult_enabled): Delete.
+ (msp43o_output_labelref): Add support for -mhwmult command line
+ option.
+ * config/msp430/msp430.md (mulhisi3, umulhisi3, mulsidi3)
+ (umulsidi3): Likewise.
+ * config/msp430/msp430.opt (mmcu): Add Report attribute.
+ (mcpu, mlarge, msmall): Likewise.
+ (mhwmult): New option.
+ * config/msp430/msp430-protos.h (msp430_hwmult_enabled): Remove
+ prototype.
+ (msp430_is_f5_mcu): Remove prototype.
+ (msp430_use_f5_series_hwmult): Add prototype.
+ * config/msp430/msp430-opts.h: New file.
+ * common/config/msp430: New directory.
+ * common/config/msp430/msp430-common.c: New file.
+ * config.gcc (msp430): Remove target_has_targetm_common.
+ * doc/invoke.texi: Document -mhwmult command line option.
+
+2014-04-23 Nick Clifton <nickc@redhat.com>
+
+ * config/i386/cygwin.h (ENDFILE_SPEC): Include
+ default-manifest.o if it can be found in the search path.
+ * config/i386/mingw32.h (ENDFILE_SPEC): Likewise.
+
+2014-04-23 Richard Biener <rguenther@suse.de>
+
+ Backport from mainline
+ 2014-04-14 Richard Biener <rguenther@suse.de>
+
+ PR lto/60720
+ * lto-streamer-out.c (wrap_refs): New function.
+ (lto_output): Wrap symbol references in global initializes in
+ type-preserving MEM_REFs.
+
+2014-04-23 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/60895
+ * tree-inline.c (declare_return_variable): Use mark_addressable.
+
+2014-04-23 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/60891
+ * loop-init.c (loop_optimizer_init): Make sure to apply
+ LOOPS_MAY_HAVE_MULTIPLE_LATCHES before fixing up loops.
+
+2014-04-22 Michael Meissner <meissner@linux.vnet.ibm.com>
+
+ Backport from mainline
+ 2014-04-21 Michael Meissner <meissner@linux.vnet.ibm.com>
+
+ PR target/60735
+ * config/rs6000/rs6000.md (mov<mode>_softfloat32, FMOVE64 case):
+ If mode is DDmode and TARGET_E500_DOUBLE allow move.
+
+ * config/rs6000/rs6000.c (rs6000_debug_reg_global): Print some
+ more debug information for E500 if -mdebug=reg.
+
+2014-04-22 H.J. Lu <hongjiu.lu@intel.com>
+
+ Backport from mainline
+ 2014-04-22 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR target/60868
+ * config/i386/i386.c (ix86_expand_set_or_movmem): Call counter_mode
+ on count_exp to get mode.
+
+2014-04-22 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
+
+ * config/rs6000/vsx.md (vsx_xxmrghw_<mode>): Adjust for
+ little-endian.
+ (vsx_xxmrglw_<mode>): Likewise.
+
+2014-04-22 Richard Biener <rguenther@suse.de>
+
+ Backport from mainline
+ 2014-04-14 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/55022
+ * fold-const.c (negate_expr_p): Don't negate directional rounding
+ division.
+ (fold_negate_expr): Likewise.
+
+2014-04-22 Richard Biener <rguenther@suse.de>
+
+ Backport from mainline
+ 2014-04-17 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/60849
+ * tree-ssa-propagate.c (valid_gimple_rhs_p): Only allow effective
+ boolean results for comparisons.
+
+2014-04-22 Richard Biener <rguenther@suse.de>
+
+ Backport from mainline
+ 2014-04-17 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/60841
+ * tree-vect-data-refs.c (vect_analyze_data_refs): Count stmts.
+ * tree-vect-loop.c (vect_analyze_loop_2): Pass down number
+ of stmts to SLP build.
+ * tree-vect-slp.c (vect_slp_analyze_bb_1): Likewise.
+ (vect_analyze_slp): Likewise.
+ (vect_analyze_slp_instance): Likewise.
+ (vect_build_slp_tree): Limit overall SLP tree growth.
+ * tree-vectorizer.h (vect_analyze_data_refs,
+ vect_analyze_slp): Adjust prototypes.
+
+2014-04-22 Richard Biener <rguenther@suse.de>
+
+ Backport from mainline
+ 2014-04-17 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/60836
+ * tree-vect-loop.c (vect_create_epilog_for_reduction): Force
+ initial PHI args to be gimple values.
+
+2014-04-22 Richard Biener <rguenther@suse.de>
+
+ Backport from mainline
+ 2014-04-14 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/59817
+ PR tree-optimization/60453
+ * graphite-scop-detection.c (graphite_can_represent_scev): Complete
+ recursion to catch all CHRECs in the scalar evolution and restrict
+ the predicate for the remains appropriately.
+
+2014-04-22 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/60823
+ * omp-low.c (ipa_simd_modify_function_body): Go through
+ all SSA_NAMEs and for those refering to vector arguments
+ which are going to be replaced adjust SSA_NAME_VAR and,
+ if it is a default definition, change it into a non-default
+ definition assigned at the beginning of function from new_decl.
+ (ipa_simd_modify_stmt_ops): Rewritten.
+ * tree-dfa.c (set_ssa_default_def): When removing default def,
+ check for NULL loc instead of NULL *loc.
+
+2014-04-22 Lin Zuojian <manjian2006@gmail.com>
+
+ PR middle-end/60281
+ * asan.c (asan_emit_stack_protection): Force the base to align to
+ appropriate bits if STRICT_ALIGNMENT. Set shadow_mem align to
+ appropriate bits if STRICT_ALIGNMENT.
+ * cfgexpand.c (expand_stack_vars): Set base_align appropriately
+ when asan is on.
+ (expand_used_vars): Leave a space in the stack frame for alignment
+ if STRICT_ALIGNMENT.
+
+2014-04-22 Jakub Jelinek <jakub@redhat.com>
+
+ Backported from mainline
+ 2014-04-16 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/60844
+ * tree-ssa-reassoc.c (reassoc_remove_stmt): New function.
+ (propagate_op_to_single_use, remove_visited_stmt_chain,
+ linearize_expr, repropagate_negates, reassociate_bb): Use it
+ instead of gsi_remove.
+
+2014-04-22 Jakub Jelinek <jakub@redhat.com>
+
+ * BASE-VER: Set to 4.9.1.
+ * DEV-PHASE: Set to prerelease.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
2014-04-11 Tobias Burnus <burnus@net-b.de>
PR other/59055
- * doc/bugreport.texi (Bugs): Remove nodes pointing to the
- nirvana.
+ * doc/bugreport.texi (Bugs): Remove nodes pointing to the nirvana.
* doc/gcc.texi (Service): Update description in the @menu
* doc/invoke.texi (Option Summary): Remove misplaced and
duplicated @menu.
2014-04-11 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/60663
- * cse.c (cse_insn): Set src_volatile on ASM_OPERANDS in
- PARALLEL.
+ * cse.c (cse_insn): Set src_volatile on ASM_OPERANDS in PARALLEL.
2014-04-10 Jan Hubicka <hubicka@ucw.cz>
Jakub Jelinek <jakub@redhat.com>
PR lto/60567
- * ipa.c (function_and_variable_visibility): Copy forced_by_abi flag from
- decl_node to node.
+ * ipa.c (function_and_variable_visibility): Copy forced_by_abi
+ flag from decl_node to node.
2014-04-10 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
2014-04-05 Pitchumani Sivanupandi <Pitchumani.S@atmel.com>
- * config/avr/avr-arch.h (avr_mcu_t): Add dev_attribute field to have device
- specific ISA/ feature information. Remove short_sp and errata_skip ds.
- Add avr_device_specific_features enum to have device specific info.
+ * config/avr/avr-arch.h (avr_mcu_t): Add dev_attribute field to have
+ device specific ISA/ feature information. Remove short_sp and
+ errata_skip ds. Add avr_device_specific_features enum to have device
+ specific info.
* config/avr/avr-c.c (avr_cpu_cpp_builtins): use dev_attribute to check
errata_skip. Add __AVR_ISA_RMW__ builtin macro if RMW ISA available.
* config/avr/avr-devices.c (avr_mcu_types): Update AVR_MCU macro for
2014-04-04 Martin Jambor <mjambor@suse.cz>
PR ipa/60640
- * cgraph.h (cgraph_clone_node): New parameter added to declaration.
- Adjust all callers.
+ * cgraph.h (cgraph_clone_node): New parameter added to declaration.
+ Adjust all callers.
* cgraph.c (clone_of_p): Also return true if thunks match.
(verify_edge_corresponds_to_fndecl): Removed extraneous call to
cgraph_function_or_thunk_node and an obsolete comment.
- * cgraphclones.c (build_function_type_skip_args): Moved upwards in the
- file.
- (build_function_decl_skip_args): Likewise.
+ * cgraphclones.c (build_function_type_skip_args): Moved upwards in the
+ file.
+ (build_function_decl_skip_args): Likewise.
(set_new_clone_decl_and_node_flags): New function.
- (duplicate_thunk_for_node): Likewise.
- (redirect_edge_duplicating_thunks): Likewise.
- (cgraph_clone_node): New parameter args_to_skip, pass it to
- redirect_edge_duplicating_thunks which is called instead of
- cgraph_redirect_edge_callee.
- (cgraph_create_virtual_clone): Pass args_to_skip to cgraph_clone_node,
+ (duplicate_thunk_for_node): Likewise.
+ (redirect_edge_duplicating_thunks): Likewise.
+ (cgraph_clone_node): New parameter args_to_skip, pass it to
+ redirect_edge_duplicating_thunks which is called instead of
+ cgraph_redirect_edge_callee.
+ (cgraph_create_virtual_clone): Pass args_to_skip to cgraph_clone_node,
moved setting of a lot of flags to set_new_clone_decl_and_node_flags.
2014-04-04 Jeff Law <law@redhat.com>
PR tree-optimization/60505
* tree-vectorizer.h (struct _stmt_vec_info): Add th field as the
- threshold of number of iterations below which no vectorization will be
- done.
+ threshold of number of iterations below which no vectorization
+ will be done.
* tree-vect-loop.c (new_loop_vec_info):
Initialize LOOP_VINFO_COST_MODEL_THRESHOLD.
* tree-vect-loop.c (vect_analyze_loop_operations):
2014-04-03 Richard Biener <rguenther@suse.de>
- * tree-streamer.h (struct streamer_tree_cache_d): Add next_idx
- member.
+ * tree-streamer.h (struct streamer_tree_cache_d): Add next_idx member.
(streamer_tree_cache_create): Adjust.
* tree-streamer.c (streamer_tree_cache_add_to_node_array): Adjust
to allow optional nodes array.
* lto-streamer-out.c (create_output_block): Avoid maintaining
the node array in the writer cache.
(DFS_write_tree): Remove assertion.
- (produce_asm_for_decls): Free the out decl state hash table
- early.
+ (produce_asm_for_decls): Free the out decl state hash table early.
* lto-streamer-in.c (lto_data_in_create): Adjust for
streamer_tree_cache_create prototype change.
(Weffc++): Remove Scott's numbering, merge lists and reference
Wnon-virtual-dtor.
- c-family/
-
- cp/
- * class.c (accessible_nvdtor_p): New.
- (check_bases): Don't check base destructor here ...
- (check_bases_and_members): ... check them here. Trigger on
- Wnon-virtual-dtor flag.
- (finish_struct_1): Use accessible_nvdtor_p.
-
- testsuite/
- * g++.dg/warn/Wnvdtor.C: Add non-polymorphic case.
- * g++.dg/warn/Wnvdtor-2.C: New.
- * g++.dg/warn/Wnvdtor-3.C: New.
- * g++.dg/warn/Wnvdtor-4.C: New.
- * g++.dg/warn/Weff1.C: Delete.
- * g++.old-deja/g++.benjamin/15309-1.C: Delete.
- * g++.old-deja/g++.benjamin/15309-2.C: Delete.
-
2014-04-03 Nick Clifton <nickc@redhat.com>
* config/rl78/rl78-expand.md (movqi): Handle (SUBREG (SYMBOL_REF))
2014-04-02 Jan Hubicka <hubicka@ucw.cz>
PR ipa/60659
- * ipa-devirt.c (get_polymorphic_call_info): Do not ICE on type inconsistent
- code and instead mark the context inconsistent.
+ * ipa-devirt.c (get_polymorphic_call_info): Do not ICE on type
+ inconsistent code and instead mark the context inconsistent.
(possible_polymorphic_call_targets): For inconsistent contexts
return empty complete list.
2014-04-01 Richard Biener <rguenther@suse.de>
- * gimple.h (struct gimple_statement_base): Align subcode to
- 16 bits.
+ * gimple.h (struct gimple_statement_base): Align subcode to 16 bits.
2014-04-01 Sebastian Huber <sebastian.huber@embedded-brains.de>
PR tree-optimization/60577
* tree-core.h (struct tree_base): Document nothrow_flag use
- in VAR_DECL_NONALIASED.
- * tree.h (VAR_DECL_NONALIASED): New.
+ in DECL_NONALIASED.
+ * tree.h (DECL_NONALIASED): New.
(may_be_aliased): Adjust.
- * coverage.c (build_var): Set VAR_DECL_NONALIASED.
+ * coverage.c (build_var): Set DECL_NONALIASED.
2014-03-20 Eric Botcazou <ebotcazou@adacore.com>
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
+2014-05-19 Eric Botcazou <ebotcazou@adacore.com>
+
+ Backport from mainline
+ 2014-04-22 Richard Henderson <rth@redhat.com>
+
+ * init.c [__linux__] (HAVE_GNAT_ALTERNATE_STACK): New define.
+ (__gnat_alternate_stack): Enable for all linux except ia64.
+
+2014-05-18 Eric Botcazou <ebotcazou@adacore.com>
+
+ * utils.c (gnat_write_global_declarations): Adjust the flags put on
+ dummy_global.
+
+2014-05-18 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gcc-interface/decl.c (gnat_to_gnu_entity) <E_Array_Subtype>: Do not
+ consider that regular packed arrays can never be superflat.
+
+2014-05-17 Eric Botcazou <ebotcazou@adacore.com>
+
+ Backport from mainline
+ 2014-04-28 Richard Henderson <rth@redhat.com>
+
+ * gcc-interface/Makefile.in: Support aarch64-linux.
+
+ 2014-04-28 Eric Botcazou <ebotcazou@adacore.com>
+
+ * exp_dbug.ads (Get_External_Name): Add 'False' default to Has_Suffix,
+ add 'Suffix' parameter and adjust comment.
+ (Get_External_Name_With_Suffix): Delete.
+ * exp_dbug.adb (Get_External_Name_With_Suffix): Merge into...
+ (Get_External_Name): ...here. Add 'False' default to Has_Suffix, add
+ 'Suffix' parameter.
+ (Get_Encoded_Name): Remove 2nd argument in call to Get_External_Name.
+ Call Get_External_Name instead of Get_External_Name_With_Suffix.
+ (Get_Secondary_DT_External_Name): Likewise.
+ * exp_cg.adb (Write_Call_Info): Likewise.
+ * exp_disp.adb (Export_DT): Likewise.
+ (Import_DT): Likewise.
+ * comperr.ads (Compiler_Abort): Remove Code parameter and add From_GCC
+ parameter with False default.
+ * comperr.adb (Compiler_Abort): Likewise. Adjust accordingly.
+ * types.h (Fat_Pointer): Rename into...
+ (String_Pointer): ...this. Add comment on interfacing rules.
+ * fe.h (Compiler_Abort): Adjust for above renaming.
+ (Error_Msg_N): Likewise.
+ (Error_Msg_NE): Likewise.
+ (Get_External_Name): Likewise. Add third parameter.
+ (Get_External_Name_With_Suffix): Delete.
+ * gcc-interface/decl.c (STDCALL_PREFIX): Define.
+ (create_concat_name): Adjust call to Get_External_Name, remove call to
+ Get_External_Name_With_Suffix, use STDCALL_PREFIX, adjust for renaming.
+ * gcc-interface/trans.c (post_error): Likewise.
+ (post_error_ne): Likewise.
+ * gcc-interface/misc.c (internal_error_function): Likewise.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
-- --
-- B o d y --
-- --
--- Copyright (C) 1992-2013, Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2014, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
procedure Compiler_Abort
(X : String;
- Code : Integer := 0;
- Fallback_Loc : String := "")
+ Fallback_Loc : String := "";
+ From_GCC : Boolean := False)
is
-- The procedures below output a "bug box" with information about
-- the cause of the compiler abort and about the preferred method
Write_Str (") ");
if X'Length + Column > 76 then
- if Code < 0 then
+ if From_GCC then
Write_Str ("GCC error:");
end if;
Write_Str (X);
end if;
- if Code > 0 then
- Write_Str (", Code=");
- Write_Int (Int (Code));
-
- elsif Code = 0 then
+ if not From_GCC then
-- For exception case, get exception message from the TSD. Note
-- that it would be neater and cleaner to pass the exception
-- --
-- S p e c --
-- --
--- Copyright (C) 1992-2013, Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2014, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
procedure Compiler_Abort
(X : String;
- Code : Integer := 0;
- Fallback_Loc : String := "");
+ Fallback_Loc : String := "";
+ From_GCC : Boolean := False);
pragma No_Return (Compiler_Abort);
-- Signals an internal compiler error. Never returns control. Depending on
-- processing may end up raising Unrecoverable_Error, or exiting directly.
-- Note that this is only used at the outer level (to handle constraint
-- errors or assert errors etc.) In the normal logic of the compiler we
-- always use pragma Assert to check for errors, and if necessary an
- -- explicit abort is achieved by pragma Assert (False). Code is positive
- -- for a gigi abort (giving the gigi abort code), zero for a front
- -- end exception (with possible message stored in TSD.Current_Excep,
- -- and negative (an unused value) for a GCC abort.
+ -- explicit abort is achieved by pragma Assert (False). From_GCC is true
+ -- for a GCC abort and false for a front end exception (with a possible
+ -- message stored in TSD.Current_Excep).
procedure Delete_SCIL_Files;
-- Delete SCIL files associated with the main unit
-- --
-- B o d y --
-- --
--- Copyright (C) 2010-2013, Free Software Foundation, Inc. --
+-- Copyright (C) 2010-2014, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
if Nkind (P) = N_Subprogram_Body
and then not Acts_As_Spec (P)
then
- Get_External_Name (Corresponding_Spec (P), Has_Suffix => False);
+ Get_External_Name (Corresponding_Spec (P));
else
- Get_External_Name (Defining_Entity (P), Has_Suffix => False);
+ Get_External_Name (Defining_Entity (P));
end if;
Write_Str (Name_Buffer (1 .. Name_Len));
begin
-- If not generating code, there is no need to create encoded names, and
-- problems when the back-end is called to annotate types without full
- -- code generation. See comments in Get_External_Name_With_Suffix for
- -- additional details.
+ -- code generation. See comments in Get_External_Name for additional
+ -- details.
-- However we do create encoded names if the back end is active, even
-- if Operating_Mode got reset. Otherwise any serious error reported
-- Fixed-point case
if Is_Fixed_Point_Type (E) then
- Get_External_Name_With_Suffix (E, "XF_");
+ Get_External_Name (E, True, "XF_");
Add_Real_To_Buffer (Delta_Value (E));
if Small_Value (E) /= Delta_Value (E) then
elsif Vax_Float (E) then
if Digits_Value (Base_Type (E)) = 6 then
- Get_External_Name_With_Suffix (E, "XFF");
+ Get_External_Name (E, True, "XFF");
elsif Digits_Value (Base_Type (E)) = 9 then
- Get_External_Name_With_Suffix (E, "XFF");
+ Get_External_Name (E, True, "XFF");
else
pragma Assert (Digits_Value (Base_Type (E)) = 15);
- Get_External_Name_With_Suffix (E, "XFG");
+ Get_External_Name (E, True, "XFG");
end if;
-- Discrete case where bounds do not match size
begin
if Biased then
- Get_External_Name_With_Suffix (E, "XB");
+ Get_External_Name (E, True, "XB");
else
- Get_External_Name_With_Suffix (E, "XD");
+ Get_External_Name (E, True, "XD");
end if;
if Lo_Encode or Hi_Encode then
else
Has_Suffix := False;
- Get_External_Name (E, Has_Suffix);
+ Get_External_Name (E);
end if;
if Debug_Flag_B and then Has_Suffix then
-- Get_External_Name --
-----------------------
- procedure Get_External_Name (Entity : Entity_Id; Has_Suffix : Boolean) is
+ procedure Get_External_Name
+ (Entity : Entity_Id;
+ Has_Suffix : Boolean := False;
+ Suffix : String := "")
+ is
E : Entity_Id := Entity;
Kind : Entity_Kind;
-- Start of processing for Get_External_Name
begin
+ -- If we are not in code generation mode, this procedure may still be
+ -- called from Back_End (more specifically - from gigi for doing type
+ -- representation annotation or some representation-specific checks).
+ -- But in this mode there is no need to mess with external names.
+
+ -- Furthermore, the call causes difficulties in this case because the
+ -- string representing the homonym number is not correctly reset as a
+ -- part of the call to Output_Homonym_Numbers_Suffix (which is not
+ -- called in gigi).
+
+ if Operating_Mode /= Generate_Code then
+ return;
+ end if;
+
Reset_Buffers;
-- If this is a child unit, we want the child
Get_Qualified_Name_And_Append (E);
end if;
- Name_Buffer (Name_Len + 1) := ASCII.NUL;
- end Get_External_Name;
-
- -----------------------------------
- -- Get_External_Name_With_Suffix --
- -----------------------------------
-
- procedure Get_External_Name_With_Suffix
- (Entity : Entity_Id;
- Suffix : String)
- is
- Has_Suffix : constant Boolean := (Suffix /= "");
-
- begin
- -- If we are not in code generation mode, this procedure may still be
- -- called from Back_End (more specifically - from gigi for doing type
- -- representation annotation or some representation-specific checks).
- -- But in this mode there is no need to mess with external names.
-
- -- Furthermore, the call causes difficulties in this case because the
- -- string representing the homonym number is not correctly reset as a
- -- part of the call to Output_Homonym_Numbers_Suffix (which is not
- -- called in gigi).
-
- if Operating_Mode /= Generate_Code then
- return;
- end if;
-
- Get_External_Name (Entity, Has_Suffix);
-
if Has_Suffix then
Add_Str_To_Name_Buffer ("___");
Add_Str_To_Name_Buffer (Suffix);
- Name_Buffer (Name_Len + 1) := ASCII.NUL;
end if;
- end Get_External_Name_With_Suffix;
+
+ Name_Buffer (Name_Len + 1) := ASCII.NUL;
+ end Get_External_Name;
--------------------------
-- Get_Variant_Encoding --
Suffix_Index : Int)
is
begin
- Get_External_Name (Typ, Has_Suffix => False);
+ Get_External_Name (Typ);
if Ancestor_Typ /= Typ then
declare
Save_Str : constant String (1 .. Name_Len)
:= Name_Buffer (1 .. Name_Len);
begin
- Get_External_Name (Ancestor_Typ, Has_Suffix => False);
+ Get_External_Name (Ancestor_Typ);
-- Append the extended name of the ancestor to the
-- extended name of Typ
procedure Get_External_Name
(Entity : Entity_Id;
- Has_Suffix : Boolean);
- -- Set Name_Buffer and Name_Len to the external name of entity E. The
+ Has_Suffix : Boolean := False;
+ Suffix : String := "");
+ -- Set Name_Buffer and Name_Len to the external name of the entity. The
-- external name is the Interface_Name, if specified, unless the entity
- -- has an address clause or a suffix.
+ -- has an address clause or Has_Suffix is true.
--
-- If the Interface is not present, or not used, the external name is the
-- concatenation of:
-- - the string "$" (or "__" if target does not allow "$"), followed
-- by homonym suffix, if the entity is an overloaded subprogram
-- or is defined within an overloaded subprogram.
-
- procedure Get_External_Name_With_Suffix
- (Entity : Entity_Id;
- Suffix : String);
- -- Set Name_Buffer and Name_Len to the external name of entity E. If
- -- Suffix is the empty string the external name is as above, otherwise
- -- the external name is the concatenation of:
- --
- -- - the string "_ada_", if the entity is a library subprogram,
- -- - the names of any enclosing scopes, each followed by "__",
- -- or "X_" if the next entity is a subunit)
- -- - the name of the entity
- -- - the string "$" (or "__" if target does not allow "$"), followed
- -- by homonym suffix, if the entity is an overloaded subprogram
- -- or is defined within an overloaded subprogram.
- -- - the string "___" followed by Suffix
+ -- - the string "___" followed by Suffix if Has_Suffix is true.
--
-- Note that a call to this procedure has no effect if we are not
-- generating code, since the necessary information for computing the
- -- proper encoded name is not available in this case.
+ -- proper external name is not available in this case.
--------------------------------------------
-- Subprograms for Handling Qualification --
pragma Assert (Related_Type (Node (Elmt)) = Typ);
- Get_External_Name
- (Entity => Node (Elmt),
- Has_Suffix => True);
-
+ Get_External_Name (Node (Elmt));
Set_Interface_Name (DT,
Make_String_Literal (Loc,
Strval => String_From_Name_Buffer));
Set_Scope (DT, Current_Scope);
- Get_External_Name (DT, True);
+ Get_External_Name (DT);
Set_Interface_Name (DT,
Make_String_Literal (Loc, Strval => String_From_Name_Buffer));
* *
****************************************************************************/
-/* This file contains definitions to access front-end functions and
- variables used by gigi. */
+/* This file contains declarations to access front-end functions and variables
+ used by gigi.
+
+ WARNING: functions taking String_Pointer parameters must abide by the rule
+ documented alongside the definition of String_Pointer in types.h. */
#ifdef __cplusplus
extern "C" {
#endif
-/* comperr: */
+/* comperr: */
#define Compiler_Abort comperr__compiler_abort
-extern int Compiler_Abort (Fat_Pointer, int, Fat_Pointer) ATTRIBUTE_NORETURN;
+extern int Compiler_Abort (String_Pointer, String_Pointer, Boolean) ATTRIBUTE_NORETURN;
/* csets: */
extern void Set_RM_Size (Entity_Id, Uint);
extern void Set_Present_Expr (Node_Id, Uint);
-/* Test if the node N is the name of an entity (i.e. is an identifier,
- expanded name, or an attribute reference that returns an entity). */
#define Is_Entity_Name einfo__is_entity_name
extern Boolean Is_Entity_Name (Node_Id);
#define Error_Msg_NE errout__error_msg_ne
#define Set_Identifier_Casing errout__set_identifier_casing
-extern void Error_Msg_N (Fat_Pointer, Node_Id);
-extern void Error_Msg_NE (Fat_Pointer, Node_Id, Entity_Id);
+extern void Error_Msg_N (String_Pointer, Node_Id);
+extern void Error_Msg_NE (String_Pointer, Node_Id, Entity_Id);
extern void Set_Identifier_Casing (Char *, const Char *);
/* err_vars: */
#define Get_Encoded_Name exp_dbug__get_encoded_name
#define Get_External_Name exp_dbug__get_external_name
-#define Get_External_Name_With_Suffix exp_dbug__get_external_name_with_suffix
-extern void Get_Encoded_Name (Entity_Id);
-extern void Get_External_Name (Entity_Id, Boolean);
-extern void Get_External_Name_With_Suffix (Entity_Id, Fat_Pointer);
+extern void Get_Encoded_Name (Entity_Id);
+extern void Get_External_Name (Entity_Id, Boolean, String_Pointer);
/* exp_util: */
LIBRARY_VERSION := $(LIB_VERSION)
endif
+# AArch64 Linux
+ifeq ($(strip $(filter-out aarch64% linux%,$(target_cpu) $(target_os))),)
+ LIBGNAT_TARGET_PAIRS = \
+ a-exetim.adb<a-exetim-posix.adb \
+ a-exetim.ads<a-exetim-default.ads \
+ a-intnam.ads<a-intnam-linux.ads \
+ a-synbar.adb<a-synbar-posix.adb \
+ a-synbar.ads<a-synbar-posix.ads \
+ s-inmaop.adb<s-inmaop-posix.adb \
+ s-intman.adb<s-intman-posix.adb \
+ s-linux.ads<s-linux.ads \
+ s-mudido.adb<s-mudido-affinity.adb \
+ s-osinte.ads<s-osinte-linux.ads \
+ s-osinte.adb<s-osinte-posix.adb \
+ s-osprim.adb<s-osprim-posix.adb \
+ s-taprop.adb<s-taprop-linux.adb \
+ s-tasinf.ads<s-tasinf-linux.ads \
+ s-tasinf.adb<s-tasinf-linux.adb \
+ s-tpopsp.adb<s-tpopsp-tls.adb \
+ s-taspri.ads<s-taspri-posix.ads \
+ g-sercom.adb<g-sercom-linux.adb \
+ $(ATOMICS_TARGET_PAIRS) \
+ $(ATOMICS_BUILTINS_TARGET_PAIRS) \
+ system.ads<system-linux-x86_64.ads
+ ## ^^ Note the above is a pretty-close placeholder.
+
+ TOOLS_TARGET_PAIRS = \
+ mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \
+ indepsw.adb<indepsw-gnu.adb
+
+ EXTRA_GNATRTL_TASKING_OBJS=s-linux.o a-exetim.o
+ EH_MECHANISM=-gcc
+ THREADSLIB=-lpthread -lrt
+ GNATLIB_SHARED=gnatlib-shared-dual
+ GMEM_LIB = gmemlib
+ LIBRARY_VERSION := $(LIB_VERSION)
+endif
+
# Sparc Linux
ifeq ($(strip $(filter-out sparc% linux%,$(target_cpu) $(target_os))),)
LIBGNAT_TARGET_PAIRS_COMMON = \
#define Has_Thiscall_Convention(E) 0
#endif
+#define STDCALL_PREFIX "_imp__"
+
/* Stack realignment is necessary for functions with foreign conventions when
the ABI doesn't mandate as much as what the compiler assumes - that is, up
to PREFERRED_STACK_BOUNDARY.
we can just use the high bound of the index type. */
else if ((Nkind (gnat_index) == N_Range
&& cannot_be_superflat_p (gnat_index))
- /* Packed Array Types are never superflat. */
- || Is_Packed_Array_Type (gnat_entity))
+ /* Bit-Packed Array Types are never superflat. */
+ || (Is_Packed_Array_Type (gnat_entity)
+ && Is_Bit_Packed_Array
+ (Original_Array_Type (gnat_entity))))
gnu_high = gnu_max;
/* Otherwise, if the high bound is constant but the low bound is
tree
create_concat_name (Entity_Id gnat_entity, const char *suffix)
{
- Entity_Kind kind = Ekind (gnat_entity);
+ const Entity_Kind kind = Ekind (gnat_entity);
+ const bool has_suffix = (suffix != NULL);
+ String_Template temp = {1, has_suffix ? strlen (suffix) : 0};
+ String_Pointer sp = {suffix, &temp};
- if (suffix)
- {
- String_Template temp = {1, (int) strlen (suffix)};
- Fat_Pointer fp = {suffix, &temp};
- Get_External_Name_With_Suffix (gnat_entity, fp);
- }
- else
- Get_External_Name (gnat_entity, 0);
+ Get_External_Name (gnat_entity, has_suffix, sp);
/* A variable using the Stdcall convention lives in a DLL. We adjust
its name to use the jump table, the _imp__NAME contains the address
if ((kind == E_Variable || kind == E_Constant)
&& Has_Stdcall_Convention (gnat_entity))
{
- const int len = 6 + Name_Len;
+ const int len = strlen (STDCALL_PREFIX) + Name_Len;
char *new_name = (char *) alloca (len + 1);
- strcpy (new_name, "_imp__");
+ strcpy (new_name, STDCALL_PREFIX);
strcat (new_name, Name_Buffer);
return get_identifier_with_length (new_name, len);
}
text_info tinfo;
char *buffer, *p, *loc;
String_Template temp, temp_loc;
- Fat_Pointer fp, fp_loc;
- expanded_location s;
+ String_Pointer sp, sp_loc;
+ expanded_location xloc;
/* Warn if plugins present. */
warn_if_plugins ();
temp.Low_Bound = 1;
temp.High_Bound = p - buffer;
- fp.Bounds = &temp;
- fp.Array = buffer;
+ sp.Bounds = &temp;
+ sp.Array = buffer;
- s = expand_location (input_location);
- if (context->show_column && s.column != 0)
- asprintf (&loc, "%s:%d:%d", s.file, s.line, s.column);
+ xloc = expand_location (input_location);
+ if (context->show_column && xloc.column != 0)
+ asprintf (&loc, "%s:%d:%d", xloc.file, xloc.line, xloc.column);
else
- asprintf (&loc, "%s:%d", s.file, s.line);
+ asprintf (&loc, "%s:%d", xloc.file, xloc.line);
temp_loc.Low_Bound = 1;
temp_loc.High_Bound = strlen (loc);
- fp_loc.Bounds = &temp_loc;
- fp_loc.Array = loc;
+ sp_loc.Bounds = &temp_loc;
+ sp_loc.Array = loc;
Current_Error_Node = error_gnat_node;
- Compiler_Abort (fp, -1, fp_loc);
+ Compiler_Abort (sp, sp_loc, true);
}
/* Perform all the initialization steps that are language-specific. */
post_error (const char *msg, Node_Id node)
{
String_Template temp;
- Fat_Pointer fp;
+ String_Pointer sp;
if (No (node))
return;
temp.Low_Bound = 1;
temp.High_Bound = strlen (msg);
- fp.Bounds = &temp;
- fp.Array = msg;
- Error_Msg_N (fp, node);
+ sp.Bounds = &temp;
+ sp.Array = msg;
+ Error_Msg_N (sp, node);
}
/* Similar to post_error, but NODE is the node at which to post the error and
post_error_ne (const char *msg, Node_Id node, Entity_Id ent)
{
String_Template temp;
- Fat_Pointer fp;
+ String_Pointer sp;
if (No (node))
return;
temp.Low_Bound = 1;
temp.High_Bound = strlen (msg);
- fp.Bounds = &temp;
- fp.Array = msg;
- Error_Msg_NE (fp, node, ent);
+ sp.Bounds = &temp;
+ sp.Array = msg;
+ Error_Msg_NE (sp, node, ent);
}
/* Similar to post_error_ne, but NUM is the number to use for the '^'. */
dummy_global
= build_decl (BUILTINS_LOCATION, VAR_DECL, get_identifier (label),
void_type_node);
+ DECL_HARD_REGISTER (dummy_global) = 1;
TREE_STATIC (dummy_global) = 1;
- TREE_ASM_WRITTEN (dummy_global) = 1;
node = varpool_node_for_decl (dummy_global);
+ node->definition = 1;
node->force_output = 1;
while (!types_used_by_cur_var_decl->is_empty ())
Raise_From_Signal_Handler (exception, msg);
}
-#if defined (i386) || defined (__x86_64__) || defined (__powerpc__)
-/* This must be in keeping with System.OS_Interface.Alternate_Stack_Size. */
-char __gnat_alternate_stack[16 * 1024]; /* 2 * SIGSTKSZ */
+#ifndef __ia64__
+#define HAVE_GNAT_ALTERNATE_STACK 1
+/* This must be in keeping with System.OS_Interface.Alternate_Stack_Size.
+ It must be larger than MINSIGSTKSZ and hopefully near 2 * SIGSTKSZ. */
+# if 16 * 1024 < MINSIGSTKSZ
+# error "__gnat_alternate_stack too small"
+# endif
+char __gnat_alternate_stack[16 * 1024];
#endif
#ifdef __XENO__
sigaction (SIGBUS, &act, NULL);
if (__gnat_get_interrupt_state (SIGSEGV) != 's')
{
-#if defined (i386) || defined (__x86_64__) || defined (__powerpc__)
+#ifdef HAVE_GNAT_ALTERNATE_STACK
/* Setup an alternate stack region for the handler execution so that
stack overflows can be handled properly, avoiding a SEGV generation
from stack usage by the handler itself. */
/* Pointer to string of Chars */
typedef Char *Str_Ptr;
-/* Types for the fat pointer used for strings and the template it
- points to. */
-typedef struct {int Low_Bound, High_Bound; } String_Template;
-typedef struct {const char *Array; String_Template *Bounds; }
- __attribute ((aligned (sizeof (char *) * 2))) Fat_Pointer;
+/* Types for the fat pointer used for strings and the template it points to.
+ The fat pointer is conceptually a couple of pointers, but it is wrapped
+ up in a special record type. On the Ada side, the record is naturally
+ aligned (i.e. given pointer alignment) on regular platforms, but it is
+ given twice this alignment on strict-alignment platforms for performance
+ reasons. On the C side, for the sake of portability and simplicity, we
+ overalign it on all platforms (so the machine mode is always the same as
+ on the Ada side) but arrange to pass it in an even scalar position as a
+ parameter to functions (so the scalar parameter alignment is always the
+ same as on the Ada side). */
+typedef struct { int Low_Bound, High_Bound; } String_Template;
+typedef struct { const char *Array; String_Template *Bounds; }
+ __attribute ((aligned (sizeof (char *) * 2))) String_Pointer;
/* Types for Node/Entity Kinds: */
base_align_bias = ((asan_frame_size + alignb - 1)
& ~(alignb - HOST_WIDE_INT_1)) - asan_frame_size;
}
+ /* Align base if target is STRICT_ALIGNMENT. */
+ if (STRICT_ALIGNMENT)
+ base = expand_binop (Pmode, and_optab, base,
+ gen_int_mode (-((GET_MODE_ALIGNMENT (SImode)
+ << ASAN_SHADOW_SHIFT)
+ / BITS_PER_UNIT), Pmode), NULL_RTX,
+ 1, OPTAB_DIRECT);
+
if (use_after_return_class == -1 && pbase)
emit_move_insn (pbase, base);
+
base = expand_binop (Pmode, add_optab, base,
gen_int_mode (base_offset - base_align_bias, Pmode),
NULL_RTX, 1, OPTAB_DIRECT);
&& (ASAN_RED_ZONE_SIZE >> ASAN_SHADOW_SHIFT) == 4);
shadow_mem = gen_rtx_MEM (SImode, shadow_base);
set_mem_alias_set (shadow_mem, asan_shadow_set);
+ if (STRICT_ALIGNMENT)
+ set_mem_align (shadow_mem, (GET_MODE_ALIGNMENT (SImode)));
prev_offset = base_offset;
for (l = length; l; l -= 2)
{
shadow_mem = gen_rtx_MEM (BLKmode, shadow_base);
set_mem_alias_set (shadow_mem, asan_shadow_set);
+
+ if (STRICT_ALIGNMENT)
+ set_mem_align (shadow_mem, (GET_MODE_ALIGNMENT (SImode)));
+
prev_offset = base_offset;
last_offset = base_offset;
last_size = 0;
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
+2014-06-30 Jakub Jelinek <jakub@redhat.com>
+
+ Backported from mainline
+ 2014-06-10 Jakub Jelinek <jakub@redhat.com>
+
+ PR fortran/60928
+ * c-pragma.c (omp_pragmas_simd): Move PRAGMA_OMP_TASK...
+ (omp_pragmas): ... back here.
+
+2014-06-12 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/61486
+ * c-omp.c (c_omp_split_clauses): Don't crash on firstprivate in
+ #pragma omp target teams or
+ #pragma omp {,target }teams distribute simd.
+
+2014-06-04 Marek Polacek <polacek@redhat.com>
+
+ Backport from mainline
+ 2014-05-08 Marek Polacek <polacek@redhat.com>
+
+ PR c/61053
+ * c-common.c (min_align_of_type): New function factored out from...
+ (c_sizeof_or_alignof_type): ...here.
+ * c-common.h (min_align_of_type): Declare.
+
+2014-05-06 Richard Biener <rguenther@suse.de>
+
+ * c-opts.c (c_common_post_options): For -freestanding,
+ -fno-hosted and -fno-builtin disable pattern recognition
+ if not enabled explicitely.
+
+2014-04-22 Richard Biener <rguenther@suse.de>
+
+ Backport from mainline
+ 2014-04-14 Richard Biener <rguenther@suse.de>
+ Marc Glisse <marc.glisse@inria.fr>
+
+ PR c/60819
+ * c-common.c (convert_vector_to_pointer_for_subscript): Properly
+ apply may-alias the scalar pointer type when applicable.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
return -1;
}
\f
+/* Return the least alignment required for type TYPE. */
+
+unsigned int
+min_align_of_type (tree type)
+{
+ unsigned int align = TYPE_ALIGN (type);
+ align = MIN (align, BIGGEST_ALIGNMENT);
+#ifdef BIGGEST_FIELD_ALIGNMENT
+ align = MIN (align, BIGGEST_FIELD_ALIGNMENT);
+#endif
+ unsigned int field_align = align;
+#ifdef ADJUST_FIELD_ALIGN
+ tree field = build_decl (UNKNOWN_LOCATION, FIELD_DECL, NULL_TREE,
+ type);
+ field_align = ADJUST_FIELD_ALIGN (field, field_align);
+#endif
+ align = MIN (align, field_align);
+ return align / BITS_PER_UNIT;
+}
+
/* Compute the value of 'sizeof (TYPE)' or '__alignof__ (TYPE)', where
the IS_SIZEOF parameter indicates which operator is being applied.
The COMPLAIN flag controls whether we should diagnose possibly
size_int (TYPE_PRECISION (char_type_node)
/ BITS_PER_UNIT));
else if (min_alignof)
- {
- unsigned int align = TYPE_ALIGN (type);
- align = MIN (align, BIGGEST_ALIGNMENT);
-#ifdef BIGGEST_FIELD_ALIGNMENT
- align = MIN (align, BIGGEST_FIELD_ALIGNMENT);
-#endif
- unsigned int field_align = align;
-#ifdef ADJUST_FIELD_ALIGN
- tree field = build_decl (UNKNOWN_LOCATION, FIELD_DECL, NULL_TREE,
- type);
- field_align = ADJUST_FIELD_ALIGN (field, field_align);
-#endif
- align = MIN (align, field_align);
- value = size_int (align / BITS_PER_UNIT);
- }
+ value = size_int (min_align_of_type (type));
else
value = size_int (TYPE_ALIGN_UNIT (type));
}
c_common_mark_addressable_vec (*vecp);
type = build_qualified_type (TREE_TYPE (type), TYPE_QUALS (type));
- type = build_pointer_type (type);
type1 = build_pointer_type (TREE_TYPE (*vecp));
+ bool ref_all = TYPE_REF_CAN_ALIAS_ALL (type1);
+ if (!ref_all
+ && !DECL_P (*vecp))
+ {
+ /* If the original vector isn't declared may_alias and it
+ isn't a bare vector look if the subscripting would
+ alias the vector we subscript, and if not, force ref-all. */
+ alias_set_type vecset = get_alias_set (*vecp);
+ alias_set_type sset = get_alias_set (type);
+ if (!alias_sets_must_conflict_p (sset, vecset)
+ && !alias_set_subset_of (sset, vecset))
+ ref_all = true;
+ }
+ type = build_pointer_type_for_mode (type, ptr_mode, ref_all);
*vecp = build1 (ADDR_EXPR, type1, *vecp);
*vecp = convert (type, *vecp);
}
extern tree c_save_expr (tree);
extern tree c_common_truthvalue_conversion (location_t, tree);
extern void c_apply_type_quals_to_decl (int, tree);
+extern unsigned int min_align_of_type (tree);
extern tree c_sizeof_or_alignof_type (location_t, tree, bool, bool, int);
extern tree c_alignof_expr (location_t, tree);
/* Print an error message for invalid operands to arith operation CODE.
else if ((mask & (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NUM_TEAMS))
!= 0)
{
- /* This must be #pragma omp {,target }teams distribute. */
- gcc_assert (code == OMP_DISTRIBUTE);
+ /* This must be one of
+ #pragma omp {,target }teams distribute
+ #pragma omp target teams
+ #pragma omp {,target }teams distribute simd. */
+ gcc_assert (code == OMP_DISTRIBUTE
+ || code == OMP_TEAMS
+ || code == OMP_SIMD);
s = C_OMP_CLAUSE_SPLIT_TEAMS;
}
else if ((mask & (OMP_CLAUSE_MASK_1
if (flag_objc_exceptions && !flag_objc_sjlj_exceptions)
flag_exceptions = 1;
+ /* If -ffreestanding, -fno-hosted or -fno-builtin then disable
+ pattern recognition. */
+ if (!global_options_set.x_flag_tree_loop_distribute_patterns
+ && flag_no_builtin)
+ flag_tree_loop_distribute_patterns = 0;
+
/* -Woverlength-strings is off by default, but is enabled by -Wpedantic.
It is never enabled in C++, as the minimum limit is not normative
in that standard. */
{ "section", PRAGMA_OMP_SECTION },
{ "sections", PRAGMA_OMP_SECTIONS },
{ "single", PRAGMA_OMP_SINGLE },
+ { "task", PRAGMA_OMP_TASK },
{ "taskgroup", PRAGMA_OMP_TASKGROUP },
{ "taskwait", PRAGMA_OMP_TASKWAIT },
{ "taskyield", PRAGMA_OMP_TASKYIELD },
{ "parallel", PRAGMA_OMP_PARALLEL },
{ "simd", PRAGMA_OMP_SIMD },
{ "target", PRAGMA_OMP_TARGET },
- { "task", PRAGMA_OMP_TASK },
{ "teams", PRAGMA_OMP_TEAMS },
};
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
+2014-06-30 Jakub Jelinek <jakub@redhat.com>
+
+ Backported from mainline
+ 2014-06-25 Jakub Jelinek <jakub@redhat.com>
+
+ * c-typeck.c (c_finish_omp_clauses): Make sure
+ OMP_CLAUSE_LINEAR_STEP has correct type.
+
+2014-06-30 Sebastian Huber <sebastian.huber@embedded-brains.de>
+
+ * c-parser.c (c_parser_declaration_or_fndef): Discard all type
+ qualifiers in __auto_type for atomic types.
+ (c_parser_typeof_specifier): Discard all type qualifiers in
+ __typeof__ for atomic types.
+
+2014-06-30 Igor Zamyatin <igor.zamyatin@intel.com>
+
+ PR middle-end/57541
+ * c-array-notation.c (fix_builtin_array_notation_fn):
+ Check for 0 arguments in builtin call. Check that bultin argument is
+ correct.
+ * c-parser.c (c_parser_array_notation): Check for incorrect initial
+ index.
+
+2014-06-24 Jakub Jelinek <jakub@redhat.com>
+
+ * c-parser.c (c_parser_omp_for_loop): For
+ #pragma omp parallel for simd move lastprivate clause from parallel
+ to for rather than simd.
+
+2014-06-04 Igor Zamyatin <igor.zamyatin@intel.com>
+
+ PR c/58942
+ * c-array-notation.c (fix_builtin_array_notation_fn): Handle the case
+ with a pointer.
+
+2014-06-04 Marek Polacek <polacek@redhat.com>
+
+ Backport from mainline
+ 2014-05-08 Marek Polacek <polacek@redhat.com>
+
+ PR c/61053
+ * c-decl.c (grokdeclarator): Use min_align_of_type instead of
+ TYPE_ALIGN_UNIT.
+
+2014-05-26 Igor Zamyatin <igor.zamyatin@intel.com>
+
+ PR c/61191
+ * c-array-notation.c (fix_builtin_array_notation_fn): Check invalid
+ function parameters.
+
+2014-04-24 Jakub Jelinek <jakub@redhat.com>
+
+ * c-parser.c (c_parser_omp_atomic): Allow seq_cst before
+ atomic-clause, allow comma in between atomic-clause and
+ seq_cst.
+
+2014-04-22 Jakub Jelinek <jakub@redhat.com>
+
+ PR c/59073
+ * c-parser.c (c_parser_omp_parallel): If c_parser_omp_for
+ fails, don't set OM_PARALLEL_COMBINED and return NULL.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
if (an_type == BUILT_IN_NONE)
return NULL_TREE;
+ /* Builtin call should contain at least one argument. */
+ if (call_expr_nargs (an_builtin_fn) == 0)
+ {
+ error_at (EXPR_LOCATION (an_builtin_fn), "Invalid builtin arguments");
+ return error_mark_node;
+ }
+
if (an_type == BUILT_IN_CILKPLUS_SEC_REDUCE
|| an_type == BUILT_IN_CILKPLUS_SEC_REDUCE_MUTATING)
{
/* Fully fold any EXCESSIVE_PRECISION EXPR that can occur in the function
parameter. */
func_parm = c_fully_fold (func_parm, false, NULL);
+ if (func_parm == error_mark_node)
+ return error_mark_node;
location = EXPR_LOCATION (an_builtin_fn);
return error_mark_node;
if (rank == 0)
- return an_builtin_fn;
+ {
+ error_at (location, "Invalid builtin arguments");
+ return error_mark_node;
+ }
else if (rank > 1
&& (an_type == BUILT_IN_CILKPLUS_SEC_REDUCE_MAX_IND
|| an_type == BUILT_IN_CILKPLUS_SEC_REDUCE_MIN_IND))
|| an_type == BUILT_IN_CILKPLUS_SEC_REDUCE_MIN_IND)
array_ind_value = build_decl (location, VAR_DECL, NULL_TREE,
TREE_TYPE (func_parm));
- array_op0 = (*array_operand)[0];
+ array_op0 = (*array_operand)[0];
+ if (TREE_CODE (array_op0) == INDIRECT_REF)
+ array_op0 = TREE_OPERAND (array_op0, 0);
switch (an_type)
{
case BUILT_IN_CILKPLUS_SEC_REDUCE_ADD:
else if (declspecs->align_log != -1)
{
alignas_align = 1U << declspecs->align_log;
- if (alignas_align < TYPE_ALIGN_UNIT (type))
+ if (alignas_align < min_align_of_type (type))
{
if (name)
error_at (loc, "%<_Alignas%> specifiers cannot reduce "
" initializer");
init = convert_lvalue_to_rvalue (init_loc, init, true, true);
tree init_type = TREE_TYPE (init.value);
- /* As with typeof, remove _Atomic and const
- qualifiers from atomic types. */
+ /* As with typeof, remove all qualifiers from atomic types. */
if (init_type != error_mark_node && TYPE_ATOMIC (init_type))
init_type
- = c_build_qualified_type (init_type,
- (TYPE_QUALS (init_type)
- & ~(TYPE_QUAL_ATOMIC
- | TYPE_QUAL_CONST)));
+ = c_build_qualified_type (init_type, TYPE_UNQUALIFIED);
bool vm_type = variably_modified_type_p (init_type,
NULL_TREE);
if (vm_type)
if (was_vm)
ret.expr = c_fully_fold (expr.value, false, &ret.expr_const_operands);
pop_maybe_used (was_vm);
- /* For use in macros such as those in <stdatomic.h>, remove
- _Atomic and const qualifiers from atomic types. (Possibly
- all qualifiers should be removed; const can be an issue for
- more macros using typeof than just the <stdatomic.h>
- ones.) */
+ /* For use in macros such as those in <stdatomic.h>, remove all
+ qualifiers from atomic types. (const can be an issue for more macros
+ using typeof than just the <stdatomic.h> ones.) */
if (ret.spec != error_mark_node && TYPE_ATOMIC (ret.spec))
- ret.spec = c_build_qualified_type (ret.spec,
- (TYPE_QUALS (ret.spec)
- & ~(TYPE_QUAL_ATOMIC
- | TYPE_QUAL_CONST)));
+ ret.spec = c_build_qualified_type (ret.spec, TYPE_UNQUALIFIED);
}
c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
return ret;
if (c_parser_next_token_is (parser, CPP_NAME))
{
const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
+ if (!strcmp (p, "seq_cst"))
+ {
+ seq_cst = true;
+ c_parser_consume_token (parser);
+ if (c_parser_next_token_is (parser, CPP_COMMA)
+ && c_parser_peek_2nd_token (parser)->type == CPP_NAME)
+ c_parser_consume_token (parser);
+ }
+ }
+ if (c_parser_next_token_is (parser, CPP_NAME))
+ {
+ const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
if (!strcmp (p, "read"))
code = OMP_ATOMIC_READ;
if (p)
c_parser_consume_token (parser);
}
- if (c_parser_next_token_is (parser, CPP_NAME))
+ if (!seq_cst)
{
- const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
- if (!strcmp (p, "seq_cst"))
+ if (c_parser_next_token_is (parser, CPP_COMMA)
+ && c_parser_peek_2nd_token (parser)->type == CPP_NAME)
+ c_parser_consume_token (parser);
+
+ if (c_parser_next_token_is (parser, CPP_NAME))
{
- seq_cst = true;
- c_parser_consume_token (parser);
+ const char *p
+ = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
+ if (!strcmp (p, "seq_cst"))
+ {
+ seq_cst = true;
+ c_parser_consume_token (parser);
+ }
}
}
c_parser_skip_to_pragma_eol (parser);
tree l = build_omp_clause (OMP_CLAUSE_LOCATION (*c),
OMP_CLAUSE_LASTPRIVATE);
OMP_CLAUSE_DECL (l) = OMP_CLAUSE_DECL (*c);
- OMP_CLAUSE_CHAIN (l) = clauses;
- clauses = l;
+ if (code == OMP_SIMD)
+ {
+ OMP_CLAUSE_CHAIN (l)
+ = cclauses[C_OMP_CLAUSE_SPLIT_FOR];
+ cclauses[C_OMP_CLAUSE_SPLIT_FOR] = l;
+ }
+ else
+ {
+ OMP_CLAUSE_CHAIN (l) = clauses;
+ clauses = l;
+ }
OMP_CLAUSE_SET_CODE (*c, OMP_CLAUSE_SHARED);
}
}
if (!flag_openmp) /* flag_openmp_simd */
return c_parser_omp_for (loc, parser, p_name, mask, cclauses);
block = c_begin_omp_parallel ();
- c_parser_omp_for (loc, parser, p_name, mask, cclauses);
+ tree ret = c_parser_omp_for (loc, parser, p_name, mask, cclauses);
stmt
= c_finish_omp_parallel (loc, cclauses[C_OMP_CLAUSE_SPLIT_PARALLEL],
block);
+ if (ret == NULL_TREE)
+ return ret;
OMP_PARALLEL_COMBINED (stmt) = 1;
return stmt;
}
tree value_tree = NULL_TREE, type = NULL_TREE, array_type = NULL_TREE;
tree array_type_domain = NULL_TREE;
- if (array_value == error_mark_node)
+ if (array_value == error_mark_node || initial_index == error_mark_node)
{
/* No need to continue. If either of these 2 were true, then an error
must be emitted already. Thus, no need to emit them twice. */
s = size_one_node;
OMP_CLAUSE_LINEAR_STEP (c) = s;
}
+ else
+ OMP_CLAUSE_LINEAR_STEP (c)
+ = fold_convert (TREE_TYPE (t), OMP_CLAUSE_LINEAR_STEP (c));
goto check_dup_generic;
check_dup_generic:
if (data->asan_base == NULL)
data->asan_base = gen_reg_rtx (Pmode);
base = data->asan_base;
+
+ if (!STRICT_ALIGNMENT)
+ base_align = crtl->max_used_stack_slot_alignment;
+ else
+ base_align = MAX (crtl->max_used_stack_slot_alignment,
+ GET_MODE_ALIGNMENT (SImode)
+ << ASAN_SHADOW_SHIFT);
}
else
- offset = alloc_stack_frame_space (stack_vars[i].size, alignb);
- base_align = crtl->max_used_stack_slot_alignment;
+ {
+ offset = alloc_stack_frame_space (stack_vars[i].size, alignb);
+ base_align = crtl->max_used_stack_slot_alignment;
+ }
}
else
{
= alloc_stack_frame_space (redzonesz, ASAN_RED_ZONE_SIZE);
data.asan_vec.safe_push (prev_offset);
data.asan_vec.safe_push (offset);
+ /* Leave space for alignment if STRICT_ALIGNMENT. */
+ if (STRICT_ALIGNMENT)
+ alloc_stack_frame_space ((GET_MODE_ALIGNMENT (SImode)
+ << ASAN_SHADOW_SHIFT)
+ / BITS_PER_UNIT, 1);
var_end_seq
= asan_emit_stack_protection (virtual_stack_vars_rtx,
skipped_thunk = true;
}
- if (skipped_thunk
- && (!node2->clone_of
- || !node2->clone.args_to_skip
- || !bitmap_bit_p (node2->clone.args_to_skip, 0)))
- return false;
+ if (skipped_thunk)
+ {
+ if (!node2->clone.args_to_skip
+ || !bitmap_bit_p (node2->clone.args_to_skip, 0))
+ return false;
+ if (node2->former_clone_of == node->decl)
+ return true;
+ else if (!node2->clone_of)
+ return false;
+ }
while (node != node2 && node2)
node2 = node2->clone_of;
/* In symtab.c */
void symtab_register_node (symtab_node *);
void symtab_unregister_node (symtab_node *);
+void symtab_remove_from_same_comdat_group (symtab_node *);
void symtab_remove_node (symtab_node *);
symtab_node *symtab_get_node (const_tree);
symtab_node *symtab_node_for_asm (const_tree asmname);
thunk is this_adjusting but we are removing this parameter. */
static cgraph_node *
-duplicate_thunk_for_node (cgraph_node *thunk, cgraph_node *node,
- bitmap args_to_skip)
+duplicate_thunk_for_node (cgraph_node *thunk, cgraph_node *node)
{
cgraph_node *new_thunk, *thunk_of;
thunk_of = cgraph_function_or_thunk_node (thunk->callees->callee);
if (thunk_of->thunk.thunk_p)
- node = duplicate_thunk_for_node (thunk_of, node, args_to_skip);
+ node = duplicate_thunk_for_node (thunk_of, node);
struct cgraph_edge *cs;
for (cs = node->callers; cs; cs = cs->next_caller)
return cs->caller;
tree new_decl;
- if (!args_to_skip)
+ if (!node->clone.args_to_skip)
new_decl = copy_node (thunk->decl);
else
{
/* We do not need to duplicate this_adjusting thunks if we have removed
this. */
if (thunk->thunk.this_adjusting
- && bitmap_bit_p (args_to_skip, 0))
+ && bitmap_bit_p (node->clone.args_to_skip, 0))
return node;
- new_decl = build_function_decl_skip_args (thunk->decl, args_to_skip,
+ new_decl = build_function_decl_skip_args (thunk->decl,
+ node->clone.args_to_skip,
false);
}
gcc_checking_assert (!DECL_STRUCT_FUNCTION (new_decl));
new_thunk->thunk = thunk->thunk;
new_thunk->unique_name = in_lto_p;
new_thunk->former_clone_of = thunk->decl;
+ new_thunk->clone.args_to_skip = node->clone.args_to_skip;
+ new_thunk->clone.combined_args_to_skip = node->clone.combined_args_to_skip;
struct cgraph_edge *e = cgraph_create_edge (new_thunk, node, NULL, 0,
CGRAPH_FREQ_BASE);
chain. */
void
-redirect_edge_duplicating_thunks (struct cgraph_edge *e, struct cgraph_node *n,
- bitmap args_to_skip)
+redirect_edge_duplicating_thunks (struct cgraph_edge *e, struct cgraph_node *n)
{
cgraph_node *orig_to = cgraph_function_or_thunk_node (e->callee);
if (orig_to->thunk.thunk_p)
- n = duplicate_thunk_for_node (orig_to, n, args_to_skip);
+ n = duplicate_thunk_for_node (orig_to, n);
cgraph_redirect_edge_callee (e, n);
}
new_node->rtl = n->rtl;
new_node->count = count;
new_node->frequency = n->frequency;
- new_node->clone = n->clone;
- new_node->clone.tree_map = NULL;
new_node->tp_first_run = n->tp_first_run;
+
+ new_node->clone.tree_map = NULL;
+ new_node->clone.args_to_skip = args_to_skip;
+ if (!args_to_skip)
+ new_node->clone.combined_args_to_skip = n->clone.combined_args_to_skip;
+ else if (n->clone.combined_args_to_skip)
+ {
+ new_node->clone.combined_args_to_skip = BITMAP_GGC_ALLOC ();
+ bitmap_ior (new_node->clone.combined_args_to_skip,
+ n->clone.combined_args_to_skip, args_to_skip);
+ }
+ else
+ new_node->clone.combined_args_to_skip = args_to_skip;
+
if (n->count)
{
if (new_node->count > n->count)
if (!e->callee
|| DECL_BUILT_IN_CLASS (e->callee->decl) != BUILT_IN_NORMAL
|| DECL_FUNCTION_CODE (e->callee->decl) != BUILT_IN_UNREACHABLE)
- redirect_edge_duplicating_thunks (e, new_node, args_to_skip);
+ redirect_edge_duplicating_thunks (e, new_node);
}
-
for (e = n->callees;e; e=e->next_callee)
cgraph_clone_edge (e, new_node, e->call_stmt, e->lto_stmt_uid,
count_scale, freq, update_original);
DECL_SECTION_NAME (new_node->decl) = NULL;
set_new_clone_decl_and_node_flags (new_node);
new_node->clone.tree_map = tree_map;
- new_node->clone.args_to_skip = args_to_skip;
/* Clones of global symbols or symbols with unique names are unique. */
if ((TREE_PUBLIC (old_decl)
FOR_EACH_VEC_SAFE_ELT (tree_map, i, map)
ipa_maybe_record_reference (new_node, map->new_tree,
IPA_REF_ADDR, NULL);
- if (!args_to_skip)
- new_node->clone.combined_args_to_skip = old_node->clone.combined_args_to_skip;
- else if (old_node->clone.combined_args_to_skip)
- {
- int newi = 0, oldi = 0;
- tree arg;
- bitmap new_args_to_skip = BITMAP_GGC_ALLOC ();
- struct cgraph_node *orig_node;
- for (orig_node = old_node; orig_node->clone_of; orig_node = orig_node->clone_of)
- ;
- for (arg = DECL_ARGUMENTS (orig_node->decl);
- arg; arg = DECL_CHAIN (arg), oldi++)
- {
- if (bitmap_bit_p (old_node->clone.combined_args_to_skip, oldi))
- {
- bitmap_set_bit (new_args_to_skip, oldi);
- continue;
- }
- if (bitmap_bit_p (args_to_skip, newi))
- bitmap_set_bit (new_args_to_skip, oldi);
- newi++;
- }
- new_node->clone.combined_args_to_skip = new_args_to_skip;
- }
- else
- new_node->clone.combined_args_to_skip = args_to_skip;
cgraph_call_node_duplication_hooks (old_node, new_node);
#ifdef ENABLE_CHECKING
verify_flow_info ();
#endif
+ free_dominance_info (CDI_DOMINATORS);
/* Since we want to emit the thunk, we explicitly mark its name as
referenced. */
= (unsigned HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (mode) - 1);
op0 = simplify_gen_binary (AND, tmode,
gen_lowpart (tmode, op0),
- gen_int_mode (sign, mode));
+ gen_int_mode (sign, tmode));
code = (code == LT) ? NE : EQ;
break;
}
--- /dev/null
+/* Common hooks for Texas Instruments MSP430.
+ Copyright (C) 2014 Free Software Foundation, Inc.
+
+ This file is part of GCC.
+
+ GCC is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3, or (at your option)
+ any later version.
+
+ GCC is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GCC; see the file COPYING3. If not see
+ <http://www.gnu.org/licenses/>. */
+
+#include "config.h"
+#include "system.h"
+#include "coretypes.h"
+#include "diagnostic-core.h"
+#include "tm.h"
+#include "common/common-target.h"
+#include "common/common-target-def.h"
+#include "opts.h"
+#include "flags.h"
+
+/* Handle -mcpu= and -mmcu= here. We want to ensure that only one
+ of these two options - the last specified on the command line -
+ is passed on to the msp430 backend. */
+
+static bool
+msp430_handle_option (struct gcc_options *opts ATTRIBUTE_UNUSED,
+ struct gcc_options *opts_set ATTRIBUTE_UNUSED,
+ const struct cl_decoded_option *decoded,
+ location_t loc ATTRIBUTE_UNUSED)
+{
+ switch (decoded->opt_index)
+ {
+ case OPT_mcpu_:
+ if (strcasecmp (decoded->arg, "msp430x") == 0
+ || strcasecmp (decoded->arg, "msp430xv2") == 0
+ || strcasecmp (decoded->arg, "430x") == 0
+ || strcasecmp (decoded->arg, "430xv2") == 0)
+ {
+ target_cpu = "msp430x";
+ target_mcu = NULL;
+ }
+ else if (strcasecmp (decoded->arg, "msp430") == 0
+ || strcasecmp (decoded->arg, "430") == 0)
+ {
+ target_cpu = "msp430";
+ target_mcu = NULL;
+ }
+ else
+ {
+ error ("unrecognised argument of -mcpu: %s", decoded->arg);
+ return false;
+ }
+ break;
+
+ case OPT_mmcu_:
+ /* For backwards compatibility we recognise two generic MCU
+ 430X names. However we want to be able to generate special C
+ preprocessor defines for them, which is why we set target_mcu
+ to NULL. */
+ if (strcasecmp (decoded->arg, "msp430") == 0)
+ {
+ target_cpu = "msp430";
+ target_mcu = NULL;
+ }
+ else if (strcasecmp (decoded->arg, "msp430x") == 0
+ || strcasecmp (decoded->arg, "msp430xv2") == 0)
+ {
+ target_cpu = "msp430x";
+ target_mcu = NULL;
+ }
+ else
+ target_cpu = NULL;
+ break;
+ }
+
+ return true;
+}
+
+#undef TARGET_HANDLE_OPTION
+#define TARGET_HANDLE_OPTION msp430_handle_option
+
+struct gcc_targetm_common targetm_common = TARGETM_COMMON_INITIALIZER;
;;
esac
tmake_file="${tmake_file} arm/t-arm arm/t-arm-elf arm/t-bpabi arm/t-linux-eabi"
- tm_file="$tm_file arm/bpabi.h arm/linux-eabi.h arm/aout.h arm/arm.h"
+ tm_file="$tm_file arm/bpabi.h arm/linux-eabi.h arm/aout.h vxworks-dummy.h arm/arm.h"
# Define multilib configuration for arm-linux-androideabi.
case ${target} in
*-androideabi)
tm_file="dbxelf.h elfos.h newlib-stdint.h ${tm_file}"
c_target_objs="msp430-c.o"
cxx_target_objs="msp430-c.o"
- target_has_targetm_common=no
tmake_file="${tmake_file} msp430/t-msp430"
;;
nds32le-*-*)
#endif
+/* Define if the linker supports clearing hardware capabilities via mapfile.
+ */
+#ifndef USED_FOR_TARGET
+#undef HAVE_LD_CLEARCAP
+#endif
+
+
/* Define if your linker supports --demangle option. */
#ifndef USED_FOR_TARGET
#undef HAVE_LD_DEMANGLE
VECTOR_MODES (INT, 16); /* V16QI V8HI V4SI V2DI. */
VECTOR_MODES (FLOAT, 8); /* V2SF. */
VECTOR_MODES (FLOAT, 16); /* V4SF V2DF. */
+VECTOR_MODE (FLOAT, DF, 1); /* V1DF. */
/* Oct Int: 256-bit integer mode needed for 32-byte vector arguments. */
INT_MODE (OI, 32);
[(set_attr "type" "neon_minmax<q>")]
)
-;; Move into low-half clearing high half to 0.
+;; vec_concat gives a new vector with the low elements from operand 1, and
+;; the high elements from operand 2. That is to say, given op1 = { a, b }
+;; op2 = { c, d }, vec_concat (op1, op2) = { a, b, c, d }.
+;; What that means, is that the RTL descriptions of the below patterns
+;; need to change depending on endianness.
-(define_insn "move_lo_quad_<mode>"
+;; Move to the low architectural bits of the register.
+;; On little-endian this is { operand, zeroes }
+;; On big-endian this is { zeroes, operand }
+
+(define_insn "move_lo_quad_internal_<mode>"
[(set (match_operand:VQ 0 "register_operand" "=w,w,w")
(vec_concat:VQ
(match_operand:<VHALF> 1 "register_operand" "w,r,r")
(vec_duplicate:<VHALF> (const_int 0))))]
- "TARGET_SIMD"
+ "TARGET_SIMD && !BYTES_BIG_ENDIAN"
"@
dup\\t%d0, %1.d[0]
fmov\\t%d0, %1
(set_attr "length" "4")]
)
-;; Move into high-half.
+(define_insn "move_lo_quad_internal_be_<mode>"
+ [(set (match_operand:VQ 0 "register_operand" "=w,w,w")
+ (vec_concat:VQ
+ (vec_duplicate:<VHALF> (const_int 0))
+ (match_operand:<VHALF> 1 "register_operand" "w,r,r")))]
+ "TARGET_SIMD && BYTES_BIG_ENDIAN"
+ "@
+ dup\\t%d0, %1.d[0]
+ fmov\\t%d0, %1
+ dup\\t%d0, %1"
+ [(set_attr "type" "neon_dup<q>,f_mcr,neon_dup<q>")
+ (set_attr "simd" "yes,*,yes")
+ (set_attr "fp" "*,yes,*")
+ (set_attr "length" "4")]
+)
+
+(define_expand "move_lo_quad_<mode>"
+ [(match_operand:VQ 0 "register_operand")
+ (match_operand:VQ 1 "register_operand")]
+ "TARGET_SIMD"
+{
+ if (BYTES_BIG_ENDIAN)
+ emit_insn (gen_move_lo_quad_internal_be_<mode> (operands[0], operands[1]));
+ else
+ emit_insn (gen_move_lo_quad_internal_<mode> (operands[0], operands[1]));
+ DONE;
+}
+)
+
+;; Move operand1 to the high architectural bits of the register, keeping
+;; the low architectural bits of operand2.
+;; For little-endian this is { operand2, operand1 }
+;; For big-endian this is { operand1, operand2 }
(define_insn "aarch64_simd_move_hi_quad_<mode>"
[(set (match_operand:VQ 0 "register_operand" "+w,w")
(match_dup 0)
(match_operand:VQ 2 "vect_par_cnst_lo_half" ""))
(match_operand:<VHALF> 1 "register_operand" "w,r")))]
- "TARGET_SIMD"
+ "TARGET_SIMD && !BYTES_BIG_ENDIAN"
"@
ins\\t%0.d[1], %1.d[0]
ins\\t%0.d[1], %1"
- [(set_attr "type" "neon_ins")
- (set_attr "length" "4")]
+ [(set_attr "type" "neon_ins")]
+)
+
+(define_insn "aarch64_simd_move_hi_quad_be_<mode>"
+ [(set (match_operand:VQ 0 "register_operand" "+w,w")
+ (vec_concat:VQ
+ (match_operand:<VHALF> 1 "register_operand" "w,r")
+ (vec_select:<VHALF>
+ (match_dup 0)
+ (match_operand:VQ 2 "vect_par_cnst_hi_half" ""))))]
+ "TARGET_SIMD && BYTES_BIG_ENDIAN"
+ "@
+ ins\\t%0.d[1], %1.d[0]
+ ins\\t%0.d[1], %1"
+ [(set_attr "type" "neon_ins")]
)
(define_expand "move_hi_quad_<mode>"
(match_operand:<VHALF> 1 "register_operand" "")]
"TARGET_SIMD"
{
- rtx p = aarch64_simd_vect_par_cnst_half (<MODE>mode, false);
- emit_insn (gen_aarch64_simd_move_hi_quad_<mode> (operands[0],
- operands[1], p));
+ rtx p = aarch64_simd_vect_par_cnst_half (<MODE>mode, BYTES_BIG_ENDIAN);
+ if (BYTES_BIG_ENDIAN)
+ emit_insn (gen_aarch64_simd_move_hi_quad_be_<mode> (operands[0],
+ operands[1], p));
+ else
+ emit_insn (gen_aarch64_simd_move_hi_quad_<mode> (operands[0],
+ operands[1], p));
DONE;
})
(vec_concat:<VDBL>
(match_operand:VDIC 1 "register_operand" "w")
(match_operand:VDIC 2 "aarch64_simd_imm_zero" "Dz")))]
- "TARGET_SIMD"
+ "TARGET_SIMD && !BYTES_BIG_ENDIAN"
"mov\\t%0.8b, %1.8b"
[(set_attr "type" "neon_move<q>")]
)
-(define_insn_and_split "aarch64_combine<mode>"
+(define_insn "*aarch64_combinez_be<mode>"
+ [(set (match_operand:<VDBL> 0 "register_operand" "=&w")
+ (vec_concat:<VDBL>
+ (match_operand:VDIC 2 "aarch64_simd_imm_zero" "Dz")
+ (match_operand:VDIC 1 "register_operand" "w")))]
+ "TARGET_SIMD && BYTES_BIG_ENDIAN"
+ "mov\\t%0.8b, %1.8b"
+ [(set_attr "type" "neon_move<q>")]
+)
+
+(define_expand "aarch64_combine<mode>"
+ [(match_operand:<VDBL> 0 "register_operand")
+ (match_operand:VDC 1 "register_operand")
+ (match_operand:VDC 2 "register_operand")]
+ "TARGET_SIMD"
+{
+ rtx op1, op2;
+ if (BYTES_BIG_ENDIAN)
+ {
+ op1 = operands[2];
+ op2 = operands[1];
+ }
+ else
+ {
+ op1 = operands[1];
+ op2 = operands[2];
+ }
+ emit_insn (gen_aarch64_combine_internal<mode> (operands[0], op1, op2));
+ DONE;
+}
+)
+
+(define_insn_and_split "aarch64_combine_internal<mode>"
[(set (match_operand:<VDBL> 0 "register_operand" "=&w")
(vec_concat:<VDBL> (match_operand:VDC 1 "register_operand" "w")
(match_operand:VDC 2 "register_operand" "w")))]
"&& reload_completed"
[(const_int 0)]
{
- aarch64_split_simd_combine (operands[0], operands[1], operands[2]);
+ if (BYTES_BIG_ENDIAN)
+ aarch64_split_simd_combine (operands[0], operands[2], operands[1]);
+ else
+ aarch64_split_simd_combine (operands[0], operands[1], operands[2]);
DONE;
}
[(set_attr "type" "multiple")]
)
(define_expand "aarch64_simd_combine<mode>"
- [(set (match_operand:<VDBL> 0 "register_operand" "=&w")
- (vec_concat:<VDBL> (match_operand:VDC 1 "register_operand" "w")
- (match_operand:VDC 2 "register_operand" "w")))]
+ [(match_operand:<VDBL> 0 "register_operand")
+ (match_operand:VDC 1 "register_operand")
+ (match_operand:VDC 2 "register_operand")]
"TARGET_SIMD"
{
emit_insn (gen_move_lo_quad_<Vdbl> (operands[0], operands[1]));
;; sq<r>dmulh_lane
-(define_insn "aarch64_sq<r>dmulh_lane<mode>"
+(define_expand "aarch64_sqdmulh_lane<mode>"
+ [(match_operand:VDQHS 0 "register_operand" "")
+ (match_operand:VDQHS 1 "register_operand" "")
+ (match_operand:<VCOND> 2 "register_operand" "")
+ (match_operand:SI 3 "immediate_operand" "")]
+ "TARGET_SIMD"
+ {
+ aarch64_simd_lane_bounds (operands[3], 0, GET_MODE_NUNITS (<VCOND>mode));
+ operands[3] = GEN_INT (ENDIAN_LANE_N (<VCOND>mode, INTVAL (operands[3])));
+ emit_insn (gen_aarch64_sqdmulh_lane<mode>_internal (operands[0],
+ operands[1],
+ operands[2],
+ operands[3]));
+ DONE;
+ }
+)
+
+(define_expand "aarch64_sqrdmulh_lane<mode>"
+ [(match_operand:VDQHS 0 "register_operand" "")
+ (match_operand:VDQHS 1 "register_operand" "")
+ (match_operand:<VCOND> 2 "register_operand" "")
+ (match_operand:SI 3 "immediate_operand" "")]
+ "TARGET_SIMD"
+ {
+ aarch64_simd_lane_bounds (operands[3], 0, GET_MODE_NUNITS (<VCOND>mode));
+ operands[3] = GEN_INT (ENDIAN_LANE_N (<VCOND>mode, INTVAL (operands[3])));
+ emit_insn (gen_aarch64_sqrdmulh_lane<mode>_internal (operands[0],
+ operands[1],
+ operands[2],
+ operands[3]));
+ DONE;
+ }
+)
+
+(define_insn "aarch64_sq<r>dmulh_lane<mode>_internal"
[(set (match_operand:VDQHS 0 "register_operand" "=w")
(unspec:VDQHS
[(match_operand:VDQHS 1 "register_operand" "w")
[(set_attr "type" "neon_sat_mul_<Vetype>_scalar<q>")]
)
-(define_insn "aarch64_sq<r>dmulh_laneq<mode>"
+(define_expand "aarch64_sqdmulh_laneq<mode>"
+ [(match_operand:VDQHS 0 "register_operand" "")
+ (match_operand:VDQHS 1 "register_operand" "")
+ (match_operand:<VCONQ> 2 "register_operand" "")
+ (match_operand:SI 3 "immediate_operand" "")]
+ "TARGET_SIMD"
+ {
+ aarch64_simd_lane_bounds (operands[3], 0, GET_MODE_NUNITS (<VCONQ>mode));
+ operands[3] = GEN_INT (ENDIAN_LANE_N (<VCONQ>mode, INTVAL (operands[3])));
+ emit_insn (gen_aarch64_sqdmulh_laneq<mode>_internal (operands[0],
+ operands[1],
+ operands[2],
+ operands[3]));
+ DONE;
+ }
+)
+
+(define_expand "aarch64_sqrdmulh_laneq<mode>"
+ [(match_operand:VDQHS 0 "register_operand" "")
+ (match_operand:VDQHS 1 "register_operand" "")
+ (match_operand:<VCONQ> 2 "register_operand" "")
+ (match_operand:SI 3 "immediate_operand" "")]
+ "TARGET_SIMD"
+ {
+ aarch64_simd_lane_bounds (operands[3], 0, GET_MODE_NUNITS (<VCONQ>mode));
+ operands[3] = GEN_INT (ENDIAN_LANE_N (<VCONQ>mode, INTVAL (operands[3])));
+ emit_insn (gen_aarch64_sqrdmulh_laneq<mode>_internal (operands[0],
+ operands[1],
+ operands[2],
+ operands[3]));
+ DONE;
+ }
+)
+
+(define_insn "aarch64_sq<r>dmulh_laneq<mode>_internal"
[(set (match_operand:VDQHS 0 "register_operand" "=w")
(unspec:VDQHS
[(match_operand:VDQHS 1 "register_operand" "w")
VQDMULH))]
"TARGET_SIMD"
"*
- aarch64_simd_lane_bounds (operands[3], 0, GET_MODE_NUNITS (<VCONQ>mode));
operands[3] = GEN_INT (ENDIAN_LANE_N (<VCONQ>mode, INTVAL (operands[3])));
return \"sq<r>dmulh\\t%0.<Vtype>, %1.<Vtype>, %2.<Vetype>[%3]\";"
[(set_attr "type" "neon_sat_mul_<Vetype>_scalar<q>")]
)
-(define_insn "aarch64_sq<r>dmulh_lane<mode>"
+(define_expand "aarch64_sqdmulh_lane<mode>"
+ [(match_operand:SD_HSI 0 "register_operand" "")
+ (match_operand:SD_HSI 1 "register_operand" "")
+ (match_operand:<VCOND> 2 "register_operand" "")
+ (match_operand:SI 3 "immediate_operand" "")]
+ "TARGET_SIMD"
+ {
+ aarch64_simd_lane_bounds (operands[3], 0, GET_MODE_NUNITS (<VCOND>mode));
+ operands[3] = GEN_INT (ENDIAN_LANE_N (<VCOND>mode, INTVAL (operands[3])));
+ emit_insn (gen_aarch64_sqdmulh_lane<mode>_internal (operands[0],
+ operands[1],
+ operands[2],
+ operands[3]));
+ DONE;
+ }
+)
+
+(define_expand "aarch64_sqrdmulh_lane<mode>"
+ [(match_operand:SD_HSI 0 "register_operand" "")
+ (match_operand:SD_HSI 1 "register_operand" "")
+ (match_operand:<VCOND> 2 "register_operand" "")
+ (match_operand:SI 3 "immediate_operand" "")]
+ "TARGET_SIMD"
+ {
+ aarch64_simd_lane_bounds (operands[3], 0, GET_MODE_NUNITS (<VCOND>mode));
+ operands[3] = GEN_INT (ENDIAN_LANE_N (<VCOND>mode, INTVAL (operands[3])));
+ emit_insn (gen_aarch64_sqrdmulh_lane<mode>_internal (operands[0],
+ operands[1],
+ operands[2],
+ operands[3]));
+ DONE;
+ }
+)
+
+(define_insn "aarch64_sq<r>dmulh_lane<mode>_internal"
[(set (match_operand:SD_HSI 0 "register_operand" "=w")
(unspec:SD_HSI
[(match_operand:SD_HSI 1 "register_operand" "w")
(vec_select:<VEL>
- (match_operand:<VCONQ> 2 "register_operand" "<vwx>")
+ (match_operand:<VCOND> 2 "register_operand" "<vwx>")
(parallel [(match_operand:SI 3 "immediate_operand" "i")]))]
VQDMULH))]
"TARGET_SIMD"
"*
- aarch64_simd_lane_bounds (operands[3], 0, GET_MODE_NUNITS (<VCONQ>mode));
- operands[3] = GEN_INT (ENDIAN_LANE_N (<VCONQ>mode, INTVAL (operands[3])));
+ operands[3] = GEN_INT (ENDIAN_LANE_N (<VCOND>mode, INTVAL (operands[3])));
return \"sq<r>dmulh\\t%<v>0, %<v>1, %2.<v>[%3]\";"
[(set_attr "type" "neon_sat_mul_<Vetype>_scalar<q>")]
)
(sign_extend:<VWIDE>
(vec_duplicate:VD_HSI
(vec_select:<VEL>
- (match_operand:<VCON> 3 "register_operand" "<vwx>")
+ (match_operand:<VCOND> 3 "register_operand" "<vwx>")
+ (parallel [(match_operand:SI 4 "immediate_operand" "i")])))
+ ))
+ (const_int 1))))]
+ "TARGET_SIMD"
+ {
+ operands[4] = GEN_INT (ENDIAN_LANE_N (<VCOND>mode, INTVAL (operands[4])));
+ return
+ "sqdml<SBINQOPS:as>l\\t%<vw2>0<Vmwtype>, %<v>2<Vmtype>, %3.<Vetype>[%4]";
+ }
+ [(set_attr "type" "neon_sat_mla_<Vetype>_scalar_long")]
+)
+
+(define_insn "aarch64_sqdml<SBINQOPS:as>l_laneq<mode>_internal"
+ [(set (match_operand:<VWIDE> 0 "register_operand" "=w")
+ (SBINQOPS:<VWIDE>
+ (match_operand:<VWIDE> 1 "register_operand" "0")
+ (ss_ashift:<VWIDE>
+ (mult:<VWIDE>
+ (sign_extend:<VWIDE>
+ (match_operand:VD_HSI 2 "register_operand" "w"))
+ (sign_extend:<VWIDE>
+ (vec_duplicate:VD_HSI
+ (vec_select:<VEL>
+ (match_operand:<VCONQ> 3 "register_operand" "<vwx>")
(parallel [(match_operand:SI 4 "immediate_operand" "i")])))
))
(const_int 1))))]
(match_operand:SD_HSI 2 "register_operand" "w"))
(sign_extend:<VWIDE>
(vec_select:<VEL>
- (match_operand:<VCON> 3 "register_operand" "<vwx>")
+ (match_operand:<VCOND> 3 "register_operand" "<vwx>")
+ (parallel [(match_operand:SI 4 "immediate_operand" "i")])))
+ )
+ (const_int 1))))]
+ "TARGET_SIMD"
+ {
+ operands[4] = GEN_INT (ENDIAN_LANE_N (<VCOND>mode, INTVAL (operands[4])));
+ return
+ "sqdml<SBINQOPS:as>l\\t%<vw2>0<Vmwtype>, %<v>2<Vmtype>, %3.<Vetype>[%4]";
+ }
+ [(set_attr "type" "neon_sat_mla_<Vetype>_scalar_long")]
+)
+
+(define_insn "aarch64_sqdml<SBINQOPS:as>l_laneq<mode>_internal"
+ [(set (match_operand:<VWIDE> 0 "register_operand" "=w")
+ (SBINQOPS:<VWIDE>
+ (match_operand:<VWIDE> 1 "register_operand" "0")
+ (ss_ashift:<VWIDE>
+ (mult:<VWIDE>
+ (sign_extend:<VWIDE>
+ (match_operand:SD_HSI 2 "register_operand" "w"))
+ (sign_extend:<VWIDE>
+ (vec_select:<VEL>
+ (match_operand:<VCONQ> 3 "register_operand" "<vwx>")
(parallel [(match_operand:SI 4 "immediate_operand" "i")])))
)
(const_int 1))))]
[(match_operand:<VWIDE> 0 "register_operand" "=w")
(match_operand:<VWIDE> 1 "register_operand" "0")
(match_operand:VSD_HSI 2 "register_operand" "w")
- (match_operand:<VCON> 3 "register_operand" "<vwx>")
+ (match_operand:<VCOND> 3 "register_operand" "<vwx>")
(match_operand:SI 4 "immediate_operand" "i")]
"TARGET_SIMD"
{
- aarch64_simd_lane_bounds (operands[4], 0, GET_MODE_NUNITS (<VCON>mode) / 2);
+ aarch64_simd_lane_bounds (operands[4], 0, GET_MODE_NUNITS (<VCOND>mode));
+ operands[4] = GEN_INT (ENDIAN_LANE_N (<VCOND>mode, INTVAL (operands[4])));
emit_insn (gen_aarch64_sqdmlal_lane<mode>_internal (operands[0], operands[1],
operands[2], operands[3],
operands[4]));
[(match_operand:<VWIDE> 0 "register_operand" "=w")
(match_operand:<VWIDE> 1 "register_operand" "0")
(match_operand:VSD_HSI 2 "register_operand" "w")
- (match_operand:<VCON> 3 "register_operand" "<vwx>")
+ (match_operand:<VCONQ> 3 "register_operand" "<vwx>")
(match_operand:SI 4 "immediate_operand" "i")]
"TARGET_SIMD"
{
- aarch64_simd_lane_bounds (operands[4], 0, GET_MODE_NUNITS (<VCON>mode));
- emit_insn (gen_aarch64_sqdmlal_lane<mode>_internal (operands[0], operands[1],
+ aarch64_simd_lane_bounds (operands[4], 0, GET_MODE_NUNITS (<VCONQ>mode));
+ operands[4] = GEN_INT (ENDIAN_LANE_N (<VCONQ>mode, INTVAL (operands[4])));
+ emit_insn (gen_aarch64_sqdmlal_laneq<mode>_internal (operands[0], operands[1],
operands[2], operands[3],
operands[4]));
DONE;
[(match_operand:<VWIDE> 0 "register_operand" "=w")
(match_operand:<VWIDE> 1 "register_operand" "0")
(match_operand:VSD_HSI 2 "register_operand" "w")
- (match_operand:<VCON> 3 "register_operand" "<vwx>")
+ (match_operand:<VCOND> 3 "register_operand" "<vwx>")
(match_operand:SI 4 "immediate_operand" "i")]
"TARGET_SIMD"
{
- aarch64_simd_lane_bounds (operands[4], 0, GET_MODE_NUNITS (<VCON>mode) / 2);
+ aarch64_simd_lane_bounds (operands[4], 0, GET_MODE_NUNITS (<VCOND>mode));
+ operands[4] = GEN_INT (ENDIAN_LANE_N (<VCOND>mode, INTVAL (operands[4])));
emit_insn (gen_aarch64_sqdmlsl_lane<mode>_internal (operands[0], operands[1],
operands[2], operands[3],
operands[4]));
[(match_operand:<VWIDE> 0 "register_operand" "=w")
(match_operand:<VWIDE> 1 "register_operand" "0")
(match_operand:VSD_HSI 2 "register_operand" "w")
- (match_operand:<VCON> 3 "register_operand" "<vwx>")
+ (match_operand:<VCONQ> 3 "register_operand" "<vwx>")
(match_operand:SI 4 "immediate_operand" "i")]
"TARGET_SIMD"
{
- aarch64_simd_lane_bounds (operands[4], 0, GET_MODE_NUNITS (<VCON>mode));
- emit_insn (gen_aarch64_sqdmlsl_lane<mode>_internal (operands[0], operands[1],
+ aarch64_simd_lane_bounds (operands[4], 0, GET_MODE_NUNITS (<VCONQ>mode));
+ operands[4] = GEN_INT (ENDIAN_LANE_N (<VCONQ>mode, INTVAL (operands[4])));
+ emit_insn (gen_aarch64_sqdmlsl_laneq<mode>_internal (operands[0], operands[1],
operands[2], operands[3],
operands[4]));
DONE;
(sign_extend:<VWIDE>
(vec_duplicate:<VHALF>
(vec_select:<VEL>
- (match_operand:<VCON> 3 "register_operand" "<vwx>")
+ (match_operand:<VCOND> 3 "register_operand" "<vwx>")
+ (parallel [(match_operand:SI 4 "immediate_operand" "i")])
+ ))))
+ (const_int 1))))]
+ "TARGET_SIMD"
+ {
+ operands[4] = GEN_INT (ENDIAN_LANE_N (<VCOND>mode, INTVAL (operands[4])));
+ return
+ "sqdml<SBINQOPS:as>l2\\t%<vw2>0<Vmwtype>, %<v>2<Vmtype>, %3.<Vetype>[%4]";
+ }
+ [(set_attr "type" "neon_sat_mla_<Vetype>_scalar_long")]
+)
+
+(define_insn "aarch64_sqdml<SBINQOPS:as>l2_laneq<mode>_internal"
+ [(set (match_operand:<VWIDE> 0 "register_operand" "=w")
+ (SBINQOPS:<VWIDE>
+ (match_operand:<VWIDE> 1 "register_operand" "0")
+ (ss_ashift:<VWIDE>
+ (mult:<VWIDE>
+ (sign_extend:<VWIDE>
+ (vec_select:<VHALF>
+ (match_operand:VQ_HSI 2 "register_operand" "w")
+ (match_operand:VQ_HSI 5 "vect_par_cnst_hi_half" "")))
+ (sign_extend:<VWIDE>
+ (vec_duplicate:<VHALF>
+ (vec_select:<VEL>
+ (match_operand:<VCONQ> 3 "register_operand" "<vwx>")
(parallel [(match_operand:SI 4 "immediate_operand" "i")])
))))
(const_int 1))))]
[(match_operand:<VWIDE> 0 "register_operand" "=w")
(match_operand:<VWIDE> 1 "register_operand" "w")
(match_operand:VQ_HSI 2 "register_operand" "w")
- (match_operand:<VCON> 3 "register_operand" "<vwx>")
+ (match_operand:<VCOND> 3 "register_operand" "<vwx>")
(match_operand:SI 4 "immediate_operand" "i")]
"TARGET_SIMD"
{
rtx p = aarch64_simd_vect_par_cnst_half (<MODE>mode, true);
- aarch64_simd_lane_bounds (operands[4], 0, GET_MODE_NUNITS (<MODE>mode) / 2);
+ aarch64_simd_lane_bounds (operands[4], 0, GET_MODE_NUNITS (<VCOND>mode));
+ operands[4] = GEN_INT (ENDIAN_LANE_N (<VCOND>mode, INTVAL (operands[4])));
emit_insn (gen_aarch64_sqdmlal2_lane<mode>_internal (operands[0], operands[1],
operands[2], operands[3],
operands[4], p));
[(match_operand:<VWIDE> 0 "register_operand" "=w")
(match_operand:<VWIDE> 1 "register_operand" "w")
(match_operand:VQ_HSI 2 "register_operand" "w")
- (match_operand:<VCON> 3 "register_operand" "<vwx>")
+ (match_operand:<VCONQ> 3 "register_operand" "<vwx>")
(match_operand:SI 4 "immediate_operand" "i")]
"TARGET_SIMD"
{
rtx p = aarch64_simd_vect_par_cnst_half (<MODE>mode, true);
- aarch64_simd_lane_bounds (operands[4], 0, GET_MODE_NUNITS (<MODE>mode));
- emit_insn (gen_aarch64_sqdmlal2_lane<mode>_internal (operands[0], operands[1],
+ aarch64_simd_lane_bounds (operands[4], 0, GET_MODE_NUNITS (<VCONQ>mode));
+ operands[4] = GEN_INT (ENDIAN_LANE_N (<VCONQ>mode, INTVAL (operands[4])));
+ emit_insn (gen_aarch64_sqdmlal2_laneq<mode>_internal (operands[0], operands[1],
operands[2], operands[3],
operands[4], p));
DONE;
[(match_operand:<VWIDE> 0 "register_operand" "=w")
(match_operand:<VWIDE> 1 "register_operand" "w")
(match_operand:VQ_HSI 2 "register_operand" "w")
- (match_operand:<VCON> 3 "register_operand" "<vwx>")
+ (match_operand:<VCOND> 3 "register_operand" "<vwx>")
(match_operand:SI 4 "immediate_operand" "i")]
"TARGET_SIMD"
{
rtx p = aarch64_simd_vect_par_cnst_half (<MODE>mode, true);
- aarch64_simd_lane_bounds (operands[4], 0, GET_MODE_NUNITS (<MODE>mode) / 2);
+ aarch64_simd_lane_bounds (operands[4], 0, GET_MODE_NUNITS (<VCOND>mode));
+ operands[4] = GEN_INT (ENDIAN_LANE_N (<VCOND>mode, INTVAL (operands[4])));
emit_insn (gen_aarch64_sqdmlsl2_lane<mode>_internal (operands[0], operands[1],
operands[2], operands[3],
operands[4], p));
[(match_operand:<VWIDE> 0 "register_operand" "=w")
(match_operand:<VWIDE> 1 "register_operand" "w")
(match_operand:VQ_HSI 2 "register_operand" "w")
- (match_operand:<VCON> 3 "register_operand" "<vwx>")
+ (match_operand:<VCONQ> 3 "register_operand" "<vwx>")
(match_operand:SI 4 "immediate_operand" "i")]
"TARGET_SIMD"
{
rtx p = aarch64_simd_vect_par_cnst_half (<MODE>mode, true);
- aarch64_simd_lane_bounds (operands[4], 0, GET_MODE_NUNITS (<MODE>mode));
- emit_insn (gen_aarch64_sqdmlsl2_lane<mode>_internal (operands[0], operands[1],
+ aarch64_simd_lane_bounds (operands[4], 0, GET_MODE_NUNITS (<VCONQ>mode));
+ operands[4] = GEN_INT (ENDIAN_LANE_N (<VCONQ>mode, INTVAL (operands[4])));
+ emit_insn (gen_aarch64_sqdmlsl2_laneq<mode>_internal (operands[0], operands[1],
operands[2], operands[3],
operands[4], p));
DONE;
(sign_extend:<VWIDE>
(vec_duplicate:VD_HSI
(vec_select:<VEL>
- (match_operand:<VCON> 2 "register_operand" "<vwx>")
+ (match_operand:<VCOND> 2 "register_operand" "<vwx>")
+ (parallel [(match_operand:SI 3 "immediate_operand" "i")])))
+ ))
+ (const_int 1)))]
+ "TARGET_SIMD"
+ {
+ operands[3] = GEN_INT (ENDIAN_LANE_N (<VCOND>mode, INTVAL (operands[3])));
+ return "sqdmull\\t%<vw2>0<Vmwtype>, %<v>1<Vmtype>, %2.<Vetype>[%3]";
+ }
+ [(set_attr "type" "neon_sat_mul_<Vetype>_scalar_long")]
+)
+
+(define_insn "aarch64_sqdmull_laneq<mode>_internal"
+ [(set (match_operand:<VWIDE> 0 "register_operand" "=w")
+ (ss_ashift:<VWIDE>
+ (mult:<VWIDE>
+ (sign_extend:<VWIDE>
+ (match_operand:VD_HSI 1 "register_operand" "w"))
+ (sign_extend:<VWIDE>
+ (vec_duplicate:VD_HSI
+ (vec_select:<VEL>
+ (match_operand:<VCONQ> 2 "register_operand" "<vwx>")
(parallel [(match_operand:SI 3 "immediate_operand" "i")])))
))
(const_int 1)))]
(match_operand:SD_HSI 1 "register_operand" "w"))
(sign_extend:<VWIDE>
(vec_select:<VEL>
- (match_operand:<VCON> 2 "register_operand" "<vwx>")
+ (match_operand:<VCOND> 2 "register_operand" "<vwx>")
+ (parallel [(match_operand:SI 3 "immediate_operand" "i")]))
+ ))
+ (const_int 1)))]
+ "TARGET_SIMD"
+ {
+ operands[3] = GEN_INT (ENDIAN_LANE_N (<VCOND>mode, INTVAL (operands[3])));
+ return "sqdmull\\t%<vw2>0<Vmwtype>, %<v>1<Vmtype>, %2.<Vetype>[%3]";
+ }
+ [(set_attr "type" "neon_sat_mul_<Vetype>_scalar_long")]
+)
+
+(define_insn "aarch64_sqdmull_laneq<mode>_internal"
+ [(set (match_operand:<VWIDE> 0 "register_operand" "=w")
+ (ss_ashift:<VWIDE>
+ (mult:<VWIDE>
+ (sign_extend:<VWIDE>
+ (match_operand:SD_HSI 1 "register_operand" "w"))
+ (sign_extend:<VWIDE>
+ (vec_select:<VEL>
+ (match_operand:<VCONQ> 2 "register_operand" "<vwx>")
(parallel [(match_operand:SI 3 "immediate_operand" "i")]))
))
(const_int 1)))]
(define_expand "aarch64_sqdmull_lane<mode>"
[(match_operand:<VWIDE> 0 "register_operand" "=w")
(match_operand:VSD_HSI 1 "register_operand" "w")
- (match_operand:<VCON> 2 "register_operand" "<vwx>")
+ (match_operand:<VCOND> 2 "register_operand" "<vwx>")
(match_operand:SI 3 "immediate_operand" "i")]
"TARGET_SIMD"
{
- aarch64_simd_lane_bounds (operands[3], 0, GET_MODE_NUNITS (<VCON>mode) / 2);
+ aarch64_simd_lane_bounds (operands[3], 0, GET_MODE_NUNITS (<VCOND>mode));
+ operands[3] = GEN_INT (ENDIAN_LANE_N (<VCOND>mode, INTVAL (operands[3])));
emit_insn (gen_aarch64_sqdmull_lane<mode>_internal (operands[0], operands[1],
operands[2], operands[3]));
DONE;
(define_expand "aarch64_sqdmull_laneq<mode>"
[(match_operand:<VWIDE> 0 "register_operand" "=w")
(match_operand:VD_HSI 1 "register_operand" "w")
- (match_operand:<VCON> 2 "register_operand" "<vwx>")
+ (match_operand:<VCONQ> 2 "register_operand" "<vwx>")
(match_operand:SI 3 "immediate_operand" "i")]
"TARGET_SIMD"
{
- aarch64_simd_lane_bounds (operands[3], 0, GET_MODE_NUNITS (<VCON>mode));
- emit_insn (gen_aarch64_sqdmull_lane<mode>_internal
+ aarch64_simd_lane_bounds (operands[3], 0, GET_MODE_NUNITS (<VCONQ>mode));
+ operands[3] = GEN_INT (ENDIAN_LANE_N (<VCONQ>mode, INTVAL (operands[3])));
+ emit_insn (gen_aarch64_sqdmull_laneq<mode>_internal
(operands[0], operands[1], operands[2], operands[3]));
DONE;
})
(define_expand "aarch64_sqdmull2<mode>"
[(match_operand:<VWIDE> 0 "register_operand" "=w")
(match_operand:VQ_HSI 1 "register_operand" "w")
- (match_operand:<VCON> 2 "register_operand" "w")]
+ (match_operand:VQ_HSI 2 "register_operand" "w")]
"TARGET_SIMD"
{
rtx p = aarch64_simd_vect_par_cnst_half (<MODE>mode, true);
(sign_extend:<VWIDE>
(vec_duplicate:<VHALF>
(vec_select:<VEL>
- (match_operand:<VCON> 2 "register_operand" "<vwx>")
+ (match_operand:<VCOND> 2 "register_operand" "<vwx>")
+ (parallel [(match_operand:SI 3 "immediate_operand" "i")])))
+ ))
+ (const_int 1)))]
+ "TARGET_SIMD"
+ {
+ operands[3] = GEN_INT (ENDIAN_LANE_N (<VCOND>mode, INTVAL (operands[3])));
+ return "sqdmull2\\t%<vw2>0<Vmwtype>, %<v>1<Vmtype>, %2.<Vetype>[%3]";
+ }
+ [(set_attr "type" "neon_sat_mul_<Vetype>_scalar_long")]
+)
+
+(define_insn "aarch64_sqdmull2_laneq<mode>_internal"
+ [(set (match_operand:<VWIDE> 0 "register_operand" "=w")
+ (ss_ashift:<VWIDE>
+ (mult:<VWIDE>
+ (sign_extend:<VWIDE>
+ (vec_select:<VHALF>
+ (match_operand:VQ_HSI 1 "register_operand" "w")
+ (match_operand:VQ_HSI 4 "vect_par_cnst_hi_half" "")))
+ (sign_extend:<VWIDE>
+ (vec_duplicate:<VHALF>
+ (vec_select:<VEL>
+ (match_operand:<VCONQ> 2 "register_operand" "<vwx>")
(parallel [(match_operand:SI 3 "immediate_operand" "i")])))
))
(const_int 1)))]
(define_expand "aarch64_sqdmull2_lane<mode>"
[(match_operand:<VWIDE> 0 "register_operand" "=w")
(match_operand:VQ_HSI 1 "register_operand" "w")
- (match_operand:<VCON> 2 "register_operand" "<vwx>")
+ (match_operand:<VCOND> 2 "register_operand" "<vwx>")
(match_operand:SI 3 "immediate_operand" "i")]
"TARGET_SIMD"
{
rtx p = aarch64_simd_vect_par_cnst_half (<MODE>mode, true);
- aarch64_simd_lane_bounds (operands[3], 0, GET_MODE_NUNITS (<MODE>mode) / 2);
+ aarch64_simd_lane_bounds (operands[3], 0, GET_MODE_NUNITS (<VCOND>mode));
+ operands[3] = GEN_INT (ENDIAN_LANE_N (<VCOND>mode, INTVAL (operands[3])));
emit_insn (gen_aarch64_sqdmull2_lane<mode>_internal (operands[0], operands[1],
operands[2], operands[3],
p));
(define_expand "aarch64_sqdmull2_laneq<mode>"
[(match_operand:<VWIDE> 0 "register_operand" "=w")
(match_operand:VQ_HSI 1 "register_operand" "w")
- (match_operand:<VCON> 2 "register_operand" "<vwx>")
+ (match_operand:<VCONQ> 2 "register_operand" "<vwx>")
(match_operand:SI 3 "immediate_operand" "i")]
"TARGET_SIMD"
{
rtx p = aarch64_simd_vect_par_cnst_half (<MODE>mode, true);
- aarch64_simd_lane_bounds (operands[3], 0, GET_MODE_NUNITS (<MODE>mode));
- emit_insn (gen_aarch64_sqdmull2_lane<mode>_internal (operands[0], operands[1],
+ aarch64_simd_lane_bounds (operands[3], 0, GET_MODE_NUNITS (<VCONQ>mode));
+ operands[3] = GEN_INT (ENDIAN_LANE_N (<VCONQ>mode, INTVAL (operands[3])));
+ emit_insn (gen_aarch64_sqdmull2_laneq<mode>_internal (operands[0], operands[1],
operands[2], operands[3],
p));
DONE;
CUMULATIVE_ARGS *pcum = get_cumulative_args (pcum_v);
int ncrn, nvrn, nregs;
bool allocate_ncrn, allocate_nvrn;
+ HOST_WIDE_INT size;
/* We need to do this once per argument. */
if (pcum->aapcs_arg_processed)
pcum->aapcs_arg_processed = true;
+ /* Size in bytes, rounded to the nearest multiple of 8 bytes. */
+ size
+ = AARCH64_ROUND_UP (type ? int_size_in_bytes (type) : GET_MODE_SIZE (mode),
+ UNITS_PER_WORD);
+
allocate_ncrn = (type) ? !(FLOAT_TYPE_P (type)) : !FLOAT_MODE_P (mode);
allocate_nvrn = aarch64_vfp_is_call_candidate (pcum_v,
mode,
}
ncrn = pcum->aapcs_ncrn;
- nregs = ((type ? int_size_in_bytes (type) : GET_MODE_SIZE (mode))
- + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
-
+ nregs = size / UNITS_PER_WORD;
/* C6 - C9. though the sign and zero extension semantics are
handled elsewhere. This is the case where the argument fits
pcum->aapcs_nextncrn = NUM_ARG_REGS;
/* The argument is passed on stack; record the needed number of words for
- this argument (we can re-use NREGS) and align the total size if
- necessary. */
+ this argument and align the total size if necessary. */
on_stack:
- pcum->aapcs_stack_words = nregs;
+ pcum->aapcs_stack_words = size / UNITS_PER_WORD;
if (aarch64_function_arg_alignment (mode, type) == 16 * BITS_PER_UNIT)
pcum->aapcs_stack_size = AARCH64_ROUND_UP (pcum->aapcs_stack_size,
- 16 / UNITS_PER_WORD) + 1;
+ 16 / UNITS_PER_WORD);
return;
}
|| mode == V16QImode || mode == V2DImode
|| mode == V2SImode || mode == V4HImode
|| mode == V8QImode || mode == V2SFmode
- || mode == V4SFmode || mode == V2DFmode))
+ || mode == V4SFmode || mode == V2DFmode
+ || mode == V1DFmode))
return true;
return false;
else \
builtin_define ("__AARCH64EL__"); \
\
- if (!TARGET_GENERAL_REGS_ONLY) \
+ if (TARGET_SIMD) \
builtin_define ("__ARM_NEON"); \
\
switch (aarch64_cmodel) \
#define WORDS_BIG_ENDIAN (BYTES_BIG_ENDIAN)
/* AdvSIMD is supported in the default configuration, unless disabled by
- -mgeneral-regs-only. */
-#define TARGET_SIMD !TARGET_GENERAL_REGS_ONLY
-#define TARGET_FLOAT !TARGET_GENERAL_REGS_ONLY
+ -mgeneral-regs-only or by the +nosimd extension. */
+#define TARGET_SIMD (!TARGET_GENERAL_REGS_ONLY && AARCH64_ISA_SIMD)
+#define TARGET_FLOAT (!TARGET_GENERAL_REGS_ONLY && AARCH64_ISA_FP)
#define UNITS_PER_WORD 8
extern unsigned long aarch64_tune_flags;
#define AARCH64_TUNE_SLOWMUL (aarch64_tune_flags & AARCH64_FL_SLOWMUL)
-/* Crypto is an optional feature. */
-#define TARGET_CRYPTO AARCH64_ISA_CRYPTO
+/* Crypto is an optional extension to AdvSIMD. */
+#define TARGET_CRYPTO (TARGET_SIMD && AARCH64_ISA_CRYPTO)
/* Standard register usage. */
;; Arithmetic right shift using SISD or Integer instruction
(define_insn "*aarch64_ashr_sisd_or_int_<mode>3"
- [(set (match_operand:GPI 0 "register_operand" "=w,w,r")
+ [(set (match_operand:GPI 0 "register_operand" "=w,&w,&w,r")
(ashiftrt:GPI
- (match_operand:GPI 1 "register_operand" "w,w,r")
- (match_operand:QI 2 "aarch64_reg_or_shift_imm_di" "Us<cmode>,w,rUs<cmode>")))]
+ (match_operand:GPI 1 "register_operand" "w,w,w,r")
+ (match_operand:QI 2 "aarch64_reg_or_shift_imm_di" "Us<cmode>,w,0,rUs<cmode>")))]
""
"@
sshr\t%<rtn>0<vas>, %<rtn>1<vas>, %2
#
+ #
asr\t%<w>0, %<w>1, %<w>2"
- [(set_attr "simd" "yes,yes,no")
- (set_attr "type" "neon_shift_imm<q>,neon_shift_reg<q>,shift_reg")]
+ [(set_attr "simd" "yes,yes,yes,no")
+ (set_attr "type" "neon_shift_imm<q>,neon_shift_reg<q>,neon_shift_reg<q>,shift_reg")]
)
(define_split
(match_operand:DI 1 "aarch64_simd_register")
(match_operand:QI 2 "aarch64_simd_register")))]
"TARGET_SIMD && reload_completed"
- [(set (match_dup 2)
+ [(set (match_dup 3)
(unspec:QI [(match_dup 2)] UNSPEC_SISD_NEG))
(set (match_dup 0)
- (unspec:DI [(match_dup 1) (match_dup 2)] UNSPEC_SISD_SSHL))]
- ""
+ (unspec:DI [(match_dup 1) (match_dup 3)] UNSPEC_SISD_SSHL))]
+{
+ operands[3] = gen_lowpart (QImode, operands[0]);
+}
)
(define_split
(match_operand:SI 1 "aarch64_simd_register")
(match_operand:QI 2 "aarch64_simd_register")))]
"TARGET_SIMD && reload_completed"
- [(set (match_dup 2)
+ [(set (match_dup 3)
(unspec:QI [(match_dup 2)] UNSPEC_SISD_NEG))
(set (match_dup 0)
- (unspec:SI [(match_dup 1) (match_dup 2)] UNSPEC_SSHL_2S))]
- ""
+ (unspec:SI [(match_dup 1) (match_dup 3)] UNSPEC_SSHL_2S))]
+{
+ operands[3] = gen_lowpart (QImode, operands[0]);
+}
)
(define_insn "*aarch64_sisd_ushl"
(unspec:DI [(match_operand:DI 0 "aarch64_valid_symref" "S")]
UNSPEC_TLSDESC))
(clobber (reg:DI LR_REGNUM))
+ (clobber (reg:CC CC_REGNUM))
(clobber (match_scratch:DI 1 "=r"))]
"TARGET_TLS_DESC"
"adrp\\tx0, %A0\;ldr\\t%1, [x0, #%L0]\;add\\tx0, x0, %L0\;.tlsdesccall\\t%0\;blr\\t%1"
int16x4_t result;
__asm__ ("sqdmulh %0.4h,%1.4h,%2.h[0]"
: "=w"(result)
- : "w"(a), "w"(b)
+ : "w"(a), "x"(b)
: /* No clobbers */);
return result;
}
int16x8_t result;
__asm__ ("sqdmulh %0.8h,%1.8h,%2.h[0]"
: "=w"(result)
- : "w"(a), "w"(b)
+ : "w"(a), "x"(b)
: /* No clobbers */);
return result;
}
}
__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
-vqdmlal_high_lane_s16 (int32x4_t __a, int16x8_t __b, int16x8_t __c,
+vqdmlal_high_lane_s16 (int32x4_t __a, int16x8_t __b, int16x4_t __c,
int const __d)
{
return __builtin_aarch64_sqdmlal2_lanev8hi (__a, __b, __c, __d);
__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
vqdmlal_lane_s16 (int32x4_t __a, int16x4_t __b, int16x4_t __c, int const __d)
{
- int16x8_t __tmp = vcombine_s16 (__c, vcreate_s16 (__AARCH64_INT64_C (0)));
- return __builtin_aarch64_sqdmlal_lanev4hi (__a, __b, __tmp, __d);
+ return __builtin_aarch64_sqdmlal_lanev4hi (__a, __b, __c, __d);
}
__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
}
__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
-vqdmlal_high_lane_s32 (int64x2_t __a, int32x4_t __b, int32x4_t __c,
+vqdmlal_high_lane_s32 (int64x2_t __a, int32x4_t __b, int32x2_t __c,
int const __d)
{
return __builtin_aarch64_sqdmlal2_lanev4si (__a, __b, __c, __d);
__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
vqdmlal_lane_s32 (int64x2_t __a, int32x2_t __b, int32x2_t __c, int const __d)
{
- int32x4_t __tmp = vcombine_s32 (__c, vcreate_s32 (__AARCH64_INT64_C (0)));
- return __builtin_aarch64_sqdmlal_lanev2si (__a, __b, __tmp, __d);
+ return __builtin_aarch64_sqdmlal_lanev2si (__a, __b, __c, __d);
}
__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
}
__extension__ static __inline int32x1_t __attribute__ ((__always_inline__))
-vqdmlalh_lane_s16 (int32x1_t __a, int16x1_t __b, int16x8_t __c, const int __d)
+vqdmlalh_lane_s16 (int32x1_t __a, int16x1_t __b, int16x4_t __c, const int __d)
{
return __builtin_aarch64_sqdmlal_lanehi (__a, __b, __c, __d);
}
}
__extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
-vqdmlals_lane_s32 (int64x1_t __a, int32x1_t __b, int32x4_t __c, const int __d)
+vqdmlals_lane_s32 (int64x1_t __a, int32x1_t __b, int32x2_t __c, const int __d)
{
return __builtin_aarch64_sqdmlal_lanesi (__a, __b, __c, __d);
}
}
__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
-vqdmlsl_high_lane_s16 (int32x4_t __a, int16x8_t __b, int16x8_t __c,
+vqdmlsl_high_lane_s16 (int32x4_t __a, int16x8_t __b, int16x4_t __c,
int const __d)
{
return __builtin_aarch64_sqdmlsl2_lanev8hi (__a, __b, __c, __d);
__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
vqdmlsl_lane_s16 (int32x4_t __a, int16x4_t __b, int16x4_t __c, int const __d)
{
- int16x8_t __tmp = vcombine_s16 (__c, vcreate_s16 (__AARCH64_INT64_C (0)));
- return __builtin_aarch64_sqdmlsl_lanev4hi (__a, __b, __tmp, __d);
+ return __builtin_aarch64_sqdmlsl_lanev4hi (__a, __b, __c, __d);
}
__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
}
__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
-vqdmlsl_high_lane_s32 (int64x2_t __a, int32x4_t __b, int32x4_t __c,
+vqdmlsl_high_lane_s32 (int64x2_t __a, int32x4_t __b, int32x2_t __c,
int const __d)
{
return __builtin_aarch64_sqdmlsl2_lanev4si (__a, __b, __c, __d);
__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
vqdmlsl_lane_s32 (int64x2_t __a, int32x2_t __b, int32x2_t __c, int const __d)
{
- int32x4_t __tmp = vcombine_s32 (__c, vcreate_s32 (__AARCH64_INT64_C (0)));
- return __builtin_aarch64_sqdmlsl_lanev2si (__a, __b, __tmp, __d);
+ return __builtin_aarch64_sqdmlsl_lanev2si (__a, __b, __c, __d);
}
__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
}
__extension__ static __inline int32x1_t __attribute__ ((__always_inline__))
-vqdmlslh_lane_s16 (int32x1_t __a, int16x1_t __b, int16x8_t __c, const int __d)
+vqdmlslh_lane_s16 (int32x1_t __a, int16x1_t __b, int16x4_t __c, const int __d)
{
return __builtin_aarch64_sqdmlsl_lanehi (__a, __b, __c, __d);
}
}
__extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
-vqdmlsls_lane_s32 (int64x1_t __a, int32x1_t __b, int32x4_t __c, const int __d)
+vqdmlsls_lane_s32 (int64x1_t __a, int32x1_t __b, int32x2_t __c, const int __d)
{
return __builtin_aarch64_sqdmlsl_lanesi (__a, __b, __c, __d);
}
}
__extension__ static __inline int16x1_t __attribute__ ((__always_inline__))
-vqdmulhh_lane_s16 (int16x1_t __a, int16x8_t __b, const int __c)
+vqdmulhh_lane_s16 (int16x1_t __a, int16x4_t __b, const int __c)
{
return __builtin_aarch64_sqdmulh_lanehi (__a, __b, __c);
}
}
__extension__ static __inline int32x1_t __attribute__ ((__always_inline__))
-vqdmulhs_lane_s32 (int32x1_t __a, int32x4_t __b, const int __c)
+vqdmulhs_lane_s32 (int32x1_t __a, int32x2_t __b, const int __c)
{
return __builtin_aarch64_sqdmulh_lanesi (__a, __b, __c);
}
}
__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
-vqdmull_high_lane_s16 (int16x8_t __a, int16x8_t __b, int const __c)
+vqdmull_high_lane_s16 (int16x8_t __a, int16x4_t __b, int const __c)
{
return __builtin_aarch64_sqdmull2_lanev8hi (__a, __b,__c);
}
__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
vqdmull_lane_s16 (int16x4_t __a, int16x4_t __b, int const __c)
{
- int16x8_t __tmp = vcombine_s16 (__b, vcreate_s16 (__AARCH64_INT64_C (0)));
- return __builtin_aarch64_sqdmull_lanev4hi (__a, __tmp, __c);
+ return __builtin_aarch64_sqdmull_lanev4hi (__a, __b, __c);
}
__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
}
__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
-vqdmull_high_lane_s32 (int32x4_t __a, int32x4_t __b, int const __c)
+vqdmull_high_lane_s32 (int32x4_t __a, int32x2_t __b, int const __c)
{
return __builtin_aarch64_sqdmull2_lanev4si (__a, __b, __c);
}
__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
vqdmull_lane_s32 (int32x2_t __a, int32x2_t __b, int const __c)
{
- int32x4_t __tmp = vcombine_s32 (__b, vcreate_s32 (__AARCH64_INT64_C (0)));
- return __builtin_aarch64_sqdmull_lanev2si (__a, __tmp, __c);
+ return __builtin_aarch64_sqdmull_lanev2si (__a, __b, __c);
}
__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
}
__extension__ static __inline int32x1_t __attribute__ ((__always_inline__))
-vqdmullh_lane_s16 (int16x1_t __a, int16x8_t __b, const int __c)
+vqdmullh_lane_s16 (int16x1_t __a, int16x4_t __b, const int __c)
{
return __builtin_aarch64_sqdmull_lanehi (__a, __b, __c);
}
}
__extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
-vqdmulls_lane_s32 (int32x1_t __a, int32x4_t __b, const int __c)
+vqdmulls_lane_s32 (int32x1_t __a, int32x2_t __b, const int __c)
{
return __builtin_aarch64_sqdmull_lanesi (__a, __b, __c);
}
}
__extension__ static __inline int16x1_t __attribute__ ((__always_inline__))
-vqrdmulhh_lane_s16 (int16x1_t __a, int16x8_t __b, const int __c)
+vqrdmulhh_lane_s16 (int16x1_t __a, int16x4_t __b, const int __c)
{
return __builtin_aarch64_sqrdmulh_lanehi (__a, __b, __c);
}
}
__extension__ static __inline int32x1_t __attribute__ ((__always_inline__))
-vqrdmulhs_lane_s32 (int32x1_t __a, int32x4_t __b, const int __c)
+vqrdmulhs_lane_s32 (int32x1_t __a, int32x2_t __b, const int __c)
{
return __builtin_aarch64_sqrdmulh_lanesi (__a, __b, __c);
}
(SI "SI") (HI "HI")
(QI "QI")])
-;; Define container mode for lane selection.
-(define_mode_attr VCOND [(V4HI "V4HI") (V8HI "V4HI")
+;; 64-bit container modes the inner or scalar source mode.
+(define_mode_attr VCOND [(HI "V4HI") (SI "V2SI")
+ (V4HI "V4HI") (V8HI "V4HI")
(V2SI "V2SI") (V4SI "V2SI")
(DI "DI") (V2DI "DI")
(V2SF "V2SF") (V4SF "V2SF")
(V2DF "DF")])
-;; Define container mode for lane selection.
+;; 128-bit container modes the inner or scalar source mode.
(define_mode_attr VCONQ [(V8QI "V16QI") (V16QI "V16QI")
(V4HI "V8HI") (V8HI "V8HI")
(V2SI "V4SI") (V4SI "V4SI")
(V2DF "V2DF") (SI "V4SI")
(HI "V8HI") (QI "V16QI")])
-;; Define container mode for lane selection.
-(define_mode_attr VCON [(V8QI "V16QI") (V16QI "V16QI")
- (V4HI "V8HI") (V8HI "V8HI")
- (V2SI "V4SI") (V4SI "V4SI")
- (DI "V2DI") (V2DI "V2DI")
- (V2SF "V4SF") (V4SF "V4SF")
- (V2DF "V2DF") (SI "V4SI")
- (HI "V8HI") (QI "V16QI")])
-
;; Half modes of all vector modes.
(define_mode_attr VHALF [(V8QI "V4QI") (V16QI "V8QI")
(V4HI "V2HI") (V8HI "V4HI")
#include "gimple-expr.h"
#include "is-a.h"
#include "gimple.h"
+#include "gimple-iterator.h"
#include "gimplify.h"
#include "gimple-ssa.h"
#include "stringpool.h"
case ALPHA_BUILTIN_MSKQH:
return alpha_fold_builtin_mskxx (op, opint, op_const, 0xff, true);
- case ALPHA_BUILTIN_UMULH:
- return fold_build2 (MULT_HIGHPART_EXPR, alpha_dimode_u, op[0], op[1]);
-
case ALPHA_BUILTIN_ZAP:
opint[1] ^= 0xff;
/* FALLTHRU */
return NULL;
}
}
+
+bool
+alpha_gimple_fold_builtin (gimple_stmt_iterator *gsi)
+{
+ bool changed = false;
+ gimple stmt = gsi_stmt (*gsi);
+ tree call = gimple_call_fn (stmt);
+ gimple new_stmt = NULL;
+
+ if (call)
+ {
+ tree fndecl = gimple_call_fndecl (stmt);
+
+ if (fndecl)
+ {
+ tree arg0, arg1;
+
+ switch (DECL_FUNCTION_CODE (fndecl))
+ {
+ case ALPHA_BUILTIN_UMULH:
+ arg0 = gimple_call_arg (stmt, 0);
+ arg1 = gimple_call_arg (stmt, 1);
+
+ new_stmt
+ = gimple_build_assign_with_ops (MULT_HIGHPART_EXPR,
+ gimple_call_lhs (stmt),
+ arg0,
+ arg1);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ if (new_stmt)
+ {
+ gsi_replace (gsi, new_stmt, true);
+ changed = true;
+ }
+
+ return changed;
+}
\f
/* This page contains routines that are used to determine what the function
prologue and epilogue code will do and write them out. */
}
break;
+ case BARRIER:
+ /* __builtin_unreachable can expand to no code at all,
+ leaving (barrier) RTXes in the instruction stream. */
+ goto close_shadow_notrapb;
+
case JUMP_INSN:
case CALL_INSN:
case CODE_LABEL:
n = emit_insn_before (gen_trapb (), i);
PUT_MODE (n, TImode);
PUT_MODE (i, TImode);
+ close_shadow_notrapb:
trap_pending = 0;
shadow.used.i = 0;
shadow.used.fp = 0;
#define TARGET_EXPAND_BUILTIN alpha_expand_builtin
#undef TARGET_FOLD_BUILTIN
#define TARGET_FOLD_BUILTIN alpha_fold_builtin
+#undef TARGET_GIMPLE_FOLD_BUILTIN
+#define TARGET_GIMPLE_FOLD_BUILTIN alpha_gimple_fold_builtin
#undef TARGET_FUNCTION_OK_FOR_SIBCALL
#define TARGET_FUNCTION_OK_FOR_SIBCALL alpha_function_ok_for_sibcall
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
License for more details.
- You should have received a copy of the GNU General Public License
- along with GCC; see the file COPYING3. If not see
+ Under Section 7 of GPL version 3, you are granted additional
+ permissions described in the GCC Runtime Library Exception, version
+ 3.1, as published by the Free Software Foundation.
+
+ You should have received a copy of the GNU General Public License and
+ a copy of the GCC Runtime Library Exception along with this program;
+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
#ifndef ASM_APP_ON
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with GCC; see the file COPYING3. If not see
+ Under Section 7 of GPL version 3, you are granted additional
+ permissions described in the GCC Runtime Library Exception, version
+ 3.1, as published by the Free Software Foundation.
+
+ You should have received a copy of the GNU General Public License and
+ a copy of the GCC Runtime Library Exception along with this program;
+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
/* Before using #include to read this file, define a macro:
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
License for more details.
- You should have received a copy of the GNU General Public License
- along with GCC; see the file COPYING3. If not see
+ Under Section 7 of GPL version 3, you are granted additional
+ permissions described in the GCC Runtime Library Exception, version
+ 3.1, as published by the Free Software Foundation.
+
+ You should have received a copy of the GNU General Public License and
+ a copy of the GCC Runtime Library Exception along with this program;
+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
#ifndef ARM_OPTS_H
rtx prev, insn = BB_END (bb);
bool insn_clobbered = false;
- while (insn != BB_HEAD (bb) && DEBUG_INSN_P (insn))
+ while (insn != BB_HEAD (bb) && !NONDEBUG_INSN_P (insn))
insn = PREV_INSN (insn);
/* Find the last cbranchsi4_insn in basic block BB. */
- if (INSN_CODE (insn) != CODE_FOR_cbranchsi4_insn)
+ if (insn == BB_HEAD (bb)
+ || INSN_CODE (insn) != CODE_FOR_cbranchsi4_insn)
continue;
/* Get the register with which we are comparing. */
fputs (":\n", file);
if (flag_pic)
{
- /* Output ".word .LTHUNKn-7-.LTHUNKPCn". */
+ /* Output ".word .LTHUNKn-[3,7]-.LTHUNKPCn". */
rtx tem = XEXP (DECL_RTL (function), 0);
- tem = plus_constant (GET_MODE (tem), tem, -7);
+ /* For TARGET_THUMB1_ONLY the thunk is in Thumb mode, so the PC
+ pipeline offset is four rather than eight. Adjust the offset
+ accordingly. */
+ tem = plus_constant (GET_MODE (tem), tem,
+ TARGET_THUMB1_ONLY ? -3 : -7);
tem = gen_rtx_MINUS (GET_MODE (tem),
tem,
gen_rtx_SYMBOL_REF (Pmode,
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
License for more details.
- You should have received a copy of the GNU General Public License
- along with GCC; see the file COPYING3. If not see
+ Under Section 7 of GPL version 3, you are granted additional
+ permissions described in the GCC Runtime Library Exception, version
+ 3.1, as published by the Free Software Foundation.
+
+ You should have received a copy of the GNU General Public License and
+ a copy of the GCC Runtime Library Exception along with this program;
+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
#ifndef GCC_ARM_H
(define_insn_and_split "*arm_cmpdi_unsigned"
[(set (reg:CC_CZ CC_REGNUM)
- (compare:CC_CZ (match_operand:DI 0 "s_register_operand" "l,r,r")
- (match_operand:DI 1 "arm_di_operand" "Py,r,rDi")))]
+ (compare:CC_CZ (match_operand:DI 0 "s_register_operand" "l,r,r,r")
+ (match_operand:DI 1 "arm_di_operand" "Py,r,Di,rDi")))]
"TARGET_32BIT"
"#" ; "cmp\\t%R0, %R1\;it eq\;cmpeq\\t%Q0, %Q1"
operands[1] = gen_lowpart (SImode, operands[1]);
}
[(set_attr "conds" "set")
- (set_attr "enabled_for_depr_it" "yes,yes,no")
- (set_attr "arch" "t2,t2,*")
- (set_attr "length" "6,6,8")
+ (set_attr "enabled_for_depr_it" "yes,yes,no,*")
+ (set_attr "arch" "t2,t2,t2,a")
+ (set_attr "length" "6,6,10,8")
(set_attr "type" "multiple")]
)
"TARGET_32BIT"
"%i1%?\\t%0, %2, %4%S3"
[(set_attr "predicable" "yes")
+ (set_attr "predicable_short_it" "no")
(set_attr "shift" "4")
(set_attr "arch" "a,t2,t2,a")
;; Thumb2 doesn't allow the stack pointer to be used for
-/* ARM NEON intrinsics include file. This file is generated automatically
- using neon-gen.ml. Please do not edit manually.
+/* ARM NEON intrinsics include file.
Copyright (C) 2006-2014 Free Software Foundation, Inc.
Contributed by CodeSourcery.
return (poly16x8_t)__builtin_neon_vbslv8hi ((int16x8_t) __a, (int16x8_t) __b, (int16x8_t) __c);
}
+/* For big-endian, the shuffle masks for ZIP, UZP and TRN must be changed as
+ follows. (nelt = the number of elements within a vector.)
+
+ Firstly, a value of N within a mask, becomes (N ^ (nelt - 1)), as gcc vector
+ extension's indexing scheme is reversed *within each vector* (relative to the
+ neon intrinsics view), but without changing which of the two vectors.
+
+ Secondly, the elements within each mask are reversed, as the mask is itself a
+ vector, and will itself be loaded in reverse order (again, relative to the
+ neon intrinsics view, i.e. that would result from a "vld1" instruction). */
+
__extension__ static __inline int8x8x2_t __attribute__ ((__always_inline__))
vtrn_s8 (int8x8_t __a, int8x8_t __b)
{
int8x8x2_t __rv;
- __rv.val[0] = (int8x8_t) __builtin_shuffle (__a, __b, (uint8x8_t) { 0, 8, 2, 10, 4, 12, 6, 14 });
- __rv.val[1] = (int8x8_t) __builtin_shuffle (__a, __b, (uint8x8_t) { 1, 9, 3, 11, 5, 13, 7, 15 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x8_t)
+ { 9, 1, 11, 3, 13, 5, 15, 7 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x8_t)
+ { 8, 0, 10, 2, 12, 4, 14, 6 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x8_t)
+ { 0, 8, 2, 10, 4, 12, 6, 14 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x8_t)
+ { 1, 9, 3, 11, 5, 13, 7, 15 });
+#endif
return __rv;
}
vtrn_s16 (int16x4_t __a, int16x4_t __b)
{
int16x4x2_t __rv;
- __rv.val[0] = (int16x4_t) __builtin_shuffle (__a, __b, (uint16x4_t) { 0, 4, 2, 6 });
- __rv.val[1] = (int16x4_t) __builtin_shuffle (__a, __b, (uint16x4_t) { 1, 5, 3, 7 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x4_t) { 5, 1, 7, 3 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x4_t) { 4, 0, 6, 2 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x4_t) { 0, 4, 2, 6 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x4_t) { 1, 5, 3, 7 });
+#endif
return __rv;
}
vtrn_u8 (uint8x8_t __a, uint8x8_t __b)
{
uint8x8x2_t __rv;
- __rv.val[0] = (uint8x8_t) __builtin_shuffle (__a, __b, (uint8x8_t) { 0, 8, 2, 10, 4, 12, 6, 14 });
- __rv.val[1] = (uint8x8_t) __builtin_shuffle (__a, __b, (uint8x8_t) { 1, 9, 3, 11, 5, 13, 7, 15 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x8_t)
+ { 9, 1, 11, 3, 13, 5, 15, 7 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x8_t)
+ { 8, 0, 10, 2, 12, 4, 14, 6 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x8_t)
+ { 0, 8, 2, 10, 4, 12, 6, 14 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x8_t)
+ { 1, 9, 3, 11, 5, 13, 7, 15 });
+#endif
return __rv;
}
vtrn_u16 (uint16x4_t __a, uint16x4_t __b)
{
uint16x4x2_t __rv;
- __rv.val[0] = (uint16x4_t) __builtin_shuffle (__a, __b, (uint16x4_t) { 0, 4, 2, 6 });
- __rv.val[1] = (uint16x4_t) __builtin_shuffle (__a, __b, (uint16x4_t) { 1, 5, 3, 7 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x4_t) { 5, 1, 7, 3 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x4_t) { 4, 0, 6, 2 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x4_t) { 0, 4, 2, 6 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x4_t) { 1, 5, 3, 7 });
+#endif
return __rv;
}
vtrn_p8 (poly8x8_t __a, poly8x8_t __b)
{
poly8x8x2_t __rv;
- __rv.val[0] = (poly8x8_t) __builtin_shuffle (__a, __b, (uint8x8_t) { 0, 8, 2, 10, 4, 12, 6, 14 });
- __rv.val[1] = (poly8x8_t) __builtin_shuffle (__a, __b, (uint8x8_t) { 1, 9, 3, 11, 5, 13, 7, 15 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x8_t)
+ { 9, 1, 11, 3, 13, 5, 15, 7 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x8_t)
+ { 8, 0, 10, 2, 12, 4, 14, 6 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x8_t)
+ { 0, 8, 2, 10, 4, 12, 6, 14 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x8_t)
+ { 1, 9, 3, 11, 5, 13, 7, 15 });
+#endif
return __rv;
}
vtrn_p16 (poly16x4_t __a, poly16x4_t __b)
{
poly16x4x2_t __rv;
- __rv.val[0] = (poly16x4_t) __builtin_shuffle (__a, __b, (uint16x4_t) { 0, 4, 2, 6 });
- __rv.val[1] = (poly16x4_t) __builtin_shuffle (__a, __b, (uint16x4_t) { 1, 5, 3, 7 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x4_t) { 5, 1, 7, 3 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x4_t) { 4, 0, 6, 2 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x4_t) { 0, 4, 2, 6 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x4_t) { 1, 5, 3, 7 });
+#endif
return __rv;
}
vtrn_s32 (int32x2_t __a, int32x2_t __b)
{
int32x2x2_t __rv;
- __rv.val[0] = (int32x2_t) __builtin_shuffle (__a, __b, (uint32x2_t) { 0, 2 });
- __rv.val[1] = (int32x2_t) __builtin_shuffle (__a, __b, (uint32x2_t) { 1, 3 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x2_t) { 3, 1 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x2_t) { 2, 0 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x2_t) { 0, 2 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x2_t) { 1, 3 });
+#endif
return __rv;
}
vtrn_f32 (float32x2_t __a, float32x2_t __b)
{
float32x2x2_t __rv;
- __rv.val[0] = (float32x2_t) __builtin_shuffle (__a, __b, (uint32x2_t) { 0, 2 });
- __rv.val[1] = (float32x2_t) __builtin_shuffle (__a, __b, (uint32x2_t) { 1, 3 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x2_t) { 3, 1 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x2_t) { 2, 0 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x2_t) { 0, 2 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x2_t) { 1, 3 });
+#endif
return __rv;
}
vtrn_u32 (uint32x2_t __a, uint32x2_t __b)
{
uint32x2x2_t __rv;
- __rv.val[0] = (uint32x2_t) __builtin_shuffle (__a, __b, (uint32x2_t) { 0, 2 });
- __rv.val[1] = (uint32x2_t) __builtin_shuffle (__a, __b, (uint32x2_t) { 1, 3 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x2_t) { 3, 1 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x2_t) { 2, 0 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x2_t) { 0, 2 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x2_t) { 1, 3 });
+#endif
return __rv;
}
vtrnq_s8 (int8x16_t __a, int8x16_t __b)
{
int8x16x2_t __rv;
- __rv.val[0] = (int8x16_t) __builtin_shuffle (__a, __b, (uint8x16_t) { 0, 16, 2, 18, 4, 20, 6, 22, 8, 24, 10, 26, 12, 28, 14, 30 });
- __rv.val[1] = (int8x16_t) __builtin_shuffle (__a, __b, (uint8x16_t) { 1, 17, 3, 19, 5, 21, 7, 23, 9, 25, 11, 27, 13, 29, 15, 31 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x16_t)
+ { 17, 1, 19, 3, 21, 5, 23, 7, 25, 9, 27, 11, 29, 13, 31, 15 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x16_t)
+ { 16, 0, 18, 2, 20, 4, 22, 6, 24, 8, 26, 10, 28, 12, 30, 14 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x16_t)
+ { 0, 16, 2, 18, 4, 20, 6, 22, 8, 24, 10, 26, 12, 28, 14, 30 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x16_t)
+ { 1, 17, 3, 19, 5, 21, 7, 23, 9, 25, 11, 27, 13, 29, 15, 31 });
+#endif
return __rv;
}
vtrnq_s16 (int16x8_t __a, int16x8_t __b)
{
int16x8x2_t __rv;
- __rv.val[0] = (int16x8_t) __builtin_shuffle (__a, __b, (uint16x8_t) { 0, 8, 2, 10, 4, 12, 6, 14 });
- __rv.val[1] = (int16x8_t) __builtin_shuffle (__a, __b, (uint16x8_t) { 1, 9, 3, 11, 5, 13, 7, 15 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x8_t)
+ { 9, 1, 11, 3, 13, 5, 15, 7 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x8_t)
+ { 8, 0, 10, 2, 12, 4, 14, 6 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x8_t)
+ { 0, 8, 2, 10, 4, 12, 6, 14 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x8_t)
+ { 1, 9, 3, 11, 5, 13, 7, 15 });
+#endif
return __rv;
}
vtrnq_s32 (int32x4_t __a, int32x4_t __b)
{
int32x4x2_t __rv;
- __rv.val[0] = (int32x4_t) __builtin_shuffle (__a, __b, (uint32x4_t) { 0, 4, 2, 6 });
- __rv.val[1] = (int32x4_t) __builtin_shuffle (__a, __b, (uint32x4_t) { 1, 5, 3, 7 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x4_t) { 5, 1, 7, 3 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x4_t) { 4, 0, 6, 2 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x4_t) { 0, 4, 2, 6 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x4_t) { 1, 5, 3, 7 });
+#endif
return __rv;
}
vtrnq_f32 (float32x4_t __a, float32x4_t __b)
{
float32x4x2_t __rv;
- __rv.val[0] = (float32x4_t) __builtin_shuffle (__a, __b, (uint32x4_t) { 0, 4, 2, 6 });
- __rv.val[1] = (float32x4_t) __builtin_shuffle (__a, __b, (uint32x4_t) { 1, 5, 3, 7 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x4_t) { 5, 1, 7, 3 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x4_t) { 4, 0, 6, 2 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x4_t) { 0, 4, 2, 6 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x4_t) { 1, 5, 3, 7 });
+#endif
return __rv;
}
vtrnq_u8 (uint8x16_t __a, uint8x16_t __b)
{
uint8x16x2_t __rv;
- __rv.val[0] = (uint8x16_t) __builtin_shuffle (__a, __b, (uint8x16_t) { 0, 16, 2, 18, 4, 20, 6, 22, 8, 24, 10, 26, 12, 28, 14, 30 });
- __rv.val[1] = (uint8x16_t) __builtin_shuffle (__a, __b, (uint8x16_t) { 1, 17, 3, 19, 5, 21, 7, 23, 9, 25, 11, 27, 13, 29, 15, 31 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x16_t)
+ { 17, 1, 19, 3, 21, 5, 23, 7, 25, 9, 27, 11, 29, 13, 31, 15 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x16_t)
+ { 16, 0, 18, 2, 20, 4, 22, 6, 24, 8, 26, 10, 28, 12, 30, 14 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x16_t)
+ { 0, 16, 2, 18, 4, 20, 6, 22, 8, 24, 10, 26, 12, 28, 14, 30 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x16_t)
+ { 1, 17, 3, 19, 5, 21, 7, 23, 9, 25, 11, 27, 13, 29, 15, 31 });
+#endif
return __rv;
}
vtrnq_u16 (uint16x8_t __a, uint16x8_t __b)
{
uint16x8x2_t __rv;
- __rv.val[0] = (uint16x8_t) __builtin_shuffle (__a, __b, (uint16x8_t) { 0, 8, 2, 10, 4, 12, 6, 14 });
- __rv.val[1] = (uint16x8_t) __builtin_shuffle (__a, __b, (uint16x8_t) { 1, 9, 3, 11, 5, 13, 7, 15 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x8_t)
+ { 9, 1, 11, 3, 13, 5, 15, 7 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x8_t)
+ { 8, 0, 10, 2, 12, 4, 14, 6 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x8_t)
+ { 0, 8, 2, 10, 4, 12, 6, 14 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x8_t)
+ { 1, 9, 3, 11, 5, 13, 7, 15 });
+#endif
return __rv;
}
vtrnq_u32 (uint32x4_t __a, uint32x4_t __b)
{
uint32x4x2_t __rv;
- __rv.val[0] = (uint32x4_t) __builtin_shuffle (__a, __b, (uint32x4_t) { 0, 4, 2, 6 });
- __rv.val[1] = (uint32x4_t) __builtin_shuffle (__a, __b, (uint32x4_t) { 1, 5, 3, 7 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x4_t) { 5, 1, 7, 3 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x4_t) { 4, 0, 6, 2 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x4_t) { 0, 4, 2, 6 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x4_t) { 1, 5, 3, 7 });
+#endif
return __rv;
}
vtrnq_p8 (poly8x16_t __a, poly8x16_t __b)
{
poly8x16x2_t __rv;
- __rv.val[0] = (poly8x16_t) __builtin_shuffle (__a, __b, (uint8x16_t) { 0, 16, 2, 18, 4, 20, 6, 22, 8, 24, 10, 26, 12, 28, 14, 30 });
- __rv.val[1] = (poly8x16_t) __builtin_shuffle (__a, __b, (uint8x16_t) { 1, 17, 3, 19, 5, 21, 7, 23, 9, 25, 11, 27, 13, 29, 15, 31 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x16_t)
+ { 17, 1, 19, 3, 21, 5, 23, 7, 25, 9, 27, 11, 29, 13, 31, 15 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x16_t)
+ { 16, 0, 18, 2, 20, 4, 22, 6, 24, 8, 26, 10, 28, 12, 30, 14 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x16_t)
+ { 0, 16, 2, 18, 4, 20, 6, 22, 8, 24, 10, 26, 12, 28, 14, 30 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x16_t)
+ { 1, 17, 3, 19, 5, 21, 7, 23, 9, 25, 11, 27, 13, 29, 15, 31 });
+#endif
return __rv;
}
vtrnq_p16 (poly16x8_t __a, poly16x8_t __b)
{
poly16x8x2_t __rv;
- __rv.val[0] = (poly16x8_t) __builtin_shuffle (__a, __b, (uint16x8_t) { 0, 8, 2, 10, 4, 12, 6, 14 });
- __rv.val[1] = (poly16x8_t) __builtin_shuffle (__a, __b, (uint16x8_t) { 1, 9, 3, 11, 5, 13, 7, 15 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x8_t)
+ { 9, 1, 11, 3, 13, 5, 15, 7 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x8_t)
+ { 8, 0, 10, 2, 12, 4, 14, 6 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x8_t)
+ { 0, 8, 2, 10, 4, 12, 6, 14 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x8_t)
+ { 1, 9, 3, 11, 5, 13, 7, 15 });
+#endif
return __rv;
}
vzip_s8 (int8x8_t __a, int8x8_t __b)
{
int8x8x2_t __rv;
- __rv.val[0] = (int8x8_t) __builtin_shuffle (__a, __b, (uint8x8_t) { 0, 8, 1, 9, 2, 10, 3, 11 });
- __rv.val[1] = (int8x8_t) __builtin_shuffle (__a, __b, (uint8x8_t) { 4, 12, 5, 13, 6, 14, 7, 15 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x8_t)
+ { 12, 4, 13, 5, 14, 6, 15, 7 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x8_t)
+ { 8, 0, 9, 1, 10, 2, 11, 3 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x8_t)
+ { 0, 8, 1, 9, 2, 10, 3, 11 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x8_t)
+ { 4, 12, 5, 13, 6, 14, 7, 15 });
+#endif
return __rv;
}
vzip_s16 (int16x4_t __a, int16x4_t __b)
{
int16x4x2_t __rv;
- __rv.val[0] = (int16x4_t) __builtin_shuffle (__a, __b, (uint16x4_t) { 0, 4, 1, 5 });
- __rv.val[1] = (int16x4_t) __builtin_shuffle (__a, __b, (uint16x4_t) { 2, 6, 3, 7 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x4_t) { 6, 2, 7, 3 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x4_t) { 4, 0, 5, 1 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x4_t) { 0, 4, 1, 5 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x4_t) { 2, 6, 3, 7 });
+#endif
return __rv;
}
vzip_u8 (uint8x8_t __a, uint8x8_t __b)
{
uint8x8x2_t __rv;
- __rv.val[0] = (uint8x8_t) __builtin_shuffle (__a, __b, (uint8x8_t) { 0, 8, 1, 9, 2, 10, 3, 11 });
- __rv.val[1] = (uint8x8_t) __builtin_shuffle (__a, __b, (uint8x8_t) { 4, 12, 5, 13, 6, 14, 7, 15 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x8_t)
+ { 12, 4, 13, 5, 14, 6, 15, 7 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x8_t)
+ { 8, 0, 9, 1, 10, 2, 11, 3 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x8_t)
+ { 0, 8, 1, 9, 2, 10, 3, 11 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x8_t)
+ { 4, 12, 5, 13, 6, 14, 7, 15 });
+#endif
return __rv;
}
vzip_u16 (uint16x4_t __a, uint16x4_t __b)
{
uint16x4x2_t __rv;
- __rv.val[0] = (uint16x4_t) __builtin_shuffle (__a, __b, (uint16x4_t) { 0, 4, 1, 5 });
- __rv.val[1] = (uint16x4_t) __builtin_shuffle (__a, __b, (uint16x4_t) { 2, 6, 3, 7 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x4_t) { 6, 2, 7, 3 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x4_t) { 4, 0, 5, 1 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x4_t) { 0, 4, 1, 5 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x4_t) { 2, 6, 3, 7 });
+#endif
return __rv;
}
vzip_p8 (poly8x8_t __a, poly8x8_t __b)
{
poly8x8x2_t __rv;
- __rv.val[0] = (poly8x8_t) __builtin_shuffle (__a, __b, (uint8x8_t) { 0, 8, 1, 9, 2, 10, 3, 11 });
- __rv.val[1] = (poly8x8_t) __builtin_shuffle (__a, __b, (uint8x8_t) { 4, 12, 5, 13, 6, 14, 7, 15 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x8_t)
+ { 12, 4, 13, 5, 14, 6, 15, 7 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x8_t)
+ { 8, 0, 9, 1, 10, 2, 11, 3 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x8_t)
+ { 0, 8, 1, 9, 2, 10, 3, 11 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x8_t)
+ { 4, 12, 5, 13, 6, 14, 7, 15 });
+#endif
return __rv;
}
vzip_p16 (poly16x4_t __a, poly16x4_t __b)
{
poly16x4x2_t __rv;
- __rv.val[0] = (poly16x4_t) __builtin_shuffle (__a, __b, (uint16x4_t) { 0, 4, 1, 5 });
- __rv.val[1] = (poly16x4_t) __builtin_shuffle (__a, __b, (uint16x4_t) { 2, 6, 3, 7 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x4_t) { 6, 2, 7, 3 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x4_t) { 4, 0, 5, 1 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x4_t) { 0, 4, 1, 5 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x4_t) { 2, 6, 3, 7 });
+#endif
return __rv;
}
vzip_s32 (int32x2_t __a, int32x2_t __b)
{
int32x2x2_t __rv;
- __rv.val[0] = (int32x2_t) __builtin_shuffle (__a, __b, (uint32x2_t) { 0, 2 });
- __rv.val[1] = (int32x2_t) __builtin_shuffle (__a, __b, (uint32x2_t) { 1, 3 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x2_t) { 3, 1 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x2_t) { 2, 0 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x2_t) { 0, 2 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x2_t) { 1, 3 });
+#endif
return __rv;
}
vzip_f32 (float32x2_t __a, float32x2_t __b)
{
float32x2x2_t __rv;
- __rv.val[0] = (float32x2_t) __builtin_shuffle (__a, __b, (uint32x2_t) { 0, 2 });
- __rv.val[1] = (float32x2_t) __builtin_shuffle (__a, __b, (uint32x2_t) { 1, 3 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x2_t) { 3, 1 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x2_t) { 2, 0 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x2_t) { 0, 2 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x2_t) { 1, 3 });
+#endif
return __rv;
}
vzip_u32 (uint32x2_t __a, uint32x2_t __b)
{
uint32x2x2_t __rv;
- __rv.val[0] = (uint32x2_t) __builtin_shuffle (__a, __b, (uint32x2_t) { 0, 2 });
- __rv.val[1] = (uint32x2_t) __builtin_shuffle (__a, __b, (uint32x2_t) { 1, 3 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x2_t) { 3, 1 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x2_t) { 2, 0 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x2_t) { 0, 2 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x2_t) { 1, 3 });
+#endif
return __rv;
}
vzipq_s8 (int8x16_t __a, int8x16_t __b)
{
int8x16x2_t __rv;
- __rv.val[0] = (int8x16_t) __builtin_shuffle (__a, __b, (uint8x16_t) { 0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23 });
- __rv.val[1] = (int8x16_t) __builtin_shuffle (__a, __b, (uint8x16_t) { 8, 24, 9, 25, 10, 26, 11, 27, 12, 28, 13, 29, 14, 30, 15, 31 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x16_t)
+ { 24, 8, 25, 9, 26, 10, 27, 11, 28, 12, 29, 13, 30, 14, 31, 15 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x16_t)
+ { 16, 0, 17, 1, 18, 2, 19, 3, 20, 4, 21, 5, 22, 6, 23, 7 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x16_t)
+ { 0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x16_t)
+ { 8, 24, 9, 25, 10, 26, 11, 27, 12, 28, 13, 29, 14, 30, 15, 31 });
+#endif
return __rv;
}
vzipq_s16 (int16x8_t __a, int16x8_t __b)
{
int16x8x2_t __rv;
- __rv.val[0] = (int16x8_t) __builtin_shuffle (__a, __b, (uint16x8_t) { 0, 8, 1, 9, 2, 10, 3, 11 });
- __rv.val[1] = (int16x8_t) __builtin_shuffle (__a, __b, (uint16x8_t) { 4, 12, 5, 13, 6, 14, 7, 15 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x8_t)
+ { 12, 4, 13, 5, 14, 6, 15, 7 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x8_t)
+ { 8, 0, 9, 1, 10, 2, 11, 3 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x8_t)
+ { 0, 8, 1, 9, 2, 10, 3, 11 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x8_t)
+ { 4, 12, 5, 13, 6, 14, 7, 15 });
+#endif
return __rv;
}
vzipq_s32 (int32x4_t __a, int32x4_t __b)
{
int32x4x2_t __rv;
- __rv.val[0] = (int32x4_t) __builtin_shuffle (__a, __b, (uint32x4_t) { 0, 4, 1, 5 });
- __rv.val[1] = (int32x4_t) __builtin_shuffle (__a, __b, (uint32x4_t) { 2, 6, 3, 7 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x4_t) { 6, 2, 7, 3 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x4_t) { 4, 0, 5, 1 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x4_t) { 0, 4, 1, 5 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x4_t) { 2, 6, 3, 7 });
+#endif
return __rv;
}
vzipq_f32 (float32x4_t __a, float32x4_t __b)
{
float32x4x2_t __rv;
- __rv.val[0] = (float32x4_t) __builtin_shuffle (__a, __b, (uint32x4_t) { 0, 4, 1, 5 });
- __rv.val[1] = (float32x4_t) __builtin_shuffle (__a, __b, (uint32x4_t) { 2, 6, 3, 7 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x4_t) { 6, 2, 7, 3 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x4_t) { 4, 0, 5, 1 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x4_t) { 0, 4, 1, 5 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x4_t) { 2, 6, 3, 7 });
+#endif
return __rv;
}
vzipq_u8 (uint8x16_t __a, uint8x16_t __b)
{
uint8x16x2_t __rv;
- __rv.val[0] = (uint8x16_t) __builtin_shuffle (__a, __b, (uint8x16_t) { 0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23 });
- __rv.val[1] = (uint8x16_t) __builtin_shuffle (__a, __b, (uint8x16_t) { 8, 24, 9, 25, 10, 26, 11, 27, 12, 28, 13, 29, 14, 30, 15, 31 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x16_t)
+ { 24, 8, 25, 9, 26, 10, 27, 11, 28, 12, 29, 13, 30, 14, 31, 15 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x16_t)
+ { 16, 0, 17, 1, 18, 2, 19, 3, 20, 4, 21, 5, 22, 6, 23, 7 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x16_t)
+ { 0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x16_t)
+ { 8, 24, 9, 25, 10, 26, 11, 27, 12, 28, 13, 29, 14, 30, 15, 31 });
+#endif
return __rv;
}
vzipq_u16 (uint16x8_t __a, uint16x8_t __b)
{
uint16x8x2_t __rv;
- __rv.val[0] = (uint16x8_t) __builtin_shuffle (__a, __b, (uint16x8_t) { 0, 8, 1, 9, 2, 10, 3, 11 });
- __rv.val[1] = (uint16x8_t) __builtin_shuffle (__a, __b, (uint16x8_t) { 4, 12, 5, 13, 6, 14, 7, 15 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x8_t)
+ { 12, 4, 13, 5, 14, 6, 15, 7 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x8_t)
+ { 8, 0, 9, 1, 10, 2, 11, 3 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x8_t)
+ { 0, 8, 1, 9, 2, 10, 3, 11 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x8_t)
+ { 4, 12, 5, 13, 6, 14, 7, 15 });
+#endif
return __rv;
}
vzipq_u32 (uint32x4_t __a, uint32x4_t __b)
{
uint32x4x2_t __rv;
- __rv.val[0] = (uint32x4_t) __builtin_shuffle (__a, __b, (uint32x4_t) { 0, 4, 1, 5 });
- __rv.val[1] = (uint32x4_t) __builtin_shuffle (__a, __b, (uint32x4_t) { 2, 6, 3, 7 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x4_t) { 6, 2, 7, 3 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x4_t) { 4, 0, 5, 1 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x4_t) { 0, 4, 1, 5 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x4_t) { 2, 6, 3, 7 });
+#endif
return __rv;
}
vzipq_p8 (poly8x16_t __a, poly8x16_t __b)
{
poly8x16x2_t __rv;
- __rv.val[0] = (poly8x16_t) __builtin_shuffle (__a, __b, (uint8x16_t) { 0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23 });
- __rv.val[1] = (poly8x16_t) __builtin_shuffle (__a, __b, (uint8x16_t) { 8, 24, 9, 25, 10, 26, 11, 27, 12, 28, 13, 29, 14, 30, 15, 31 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x16_t)
+ { 24, 8, 25, 9, 26, 10, 27, 11, 28, 12, 29, 13, 30, 14, 31, 15 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x16_t)
+ { 16, 0, 17, 1, 18, 2, 19, 3, 20, 4, 21, 5, 22, 6, 23, 7 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x16_t)
+ { 0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x16_t)
+ { 8, 24, 9, 25, 10, 26, 11, 27, 12, 28, 13, 29, 14, 30, 15, 31 });
+#endif
return __rv;
}
vzipq_p16 (poly16x8_t __a, poly16x8_t __b)
{
poly16x8x2_t __rv;
- __rv.val[0] = (poly16x8_t) __builtin_shuffle (__a, __b, (uint16x8_t) { 0, 8, 1, 9, 2, 10, 3, 11 });
- __rv.val[1] = (poly16x8_t) __builtin_shuffle (__a, __b, (uint16x8_t) { 4, 12, 5, 13, 6, 14, 7, 15 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x8_t)
+ { 12, 4, 13, 5, 14, 6, 15, 7 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x8_t)
+ { 8, 0, 9, 1, 10, 2, 11, 3 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x8_t)
+ { 0, 8, 1, 9, 2, 10, 3, 11 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x8_t)
+ { 4, 12, 5, 13, 6, 14, 7, 15 });
+#endif
return __rv;
}
vuzp_s8 (int8x8_t __a, int8x8_t __b)
{
int8x8x2_t __rv;
- __rv.val[0] = (int8x8_t) __builtin_shuffle (__a, __b, (uint8x8_t) { 0, 2, 4, 6, 8, 10, 12, 14 });
- __rv.val[1] = (int8x8_t) __builtin_shuffle (__a, __b, (uint8x8_t) { 1, 3, 5, 7, 9, 11, 13, 15 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x8_t)
+ { 9, 11, 13, 15, 1, 3, 5, 7 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x8_t)
+ { 8, 10, 12, 14, 0, 2, 4, 6 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x8_t)
+ { 0, 2, 4, 6, 8, 10, 12, 14 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x8_t)
+ { 1, 3, 5, 7, 9, 11, 13, 15 });
+#endif
return __rv;
}
vuzp_s16 (int16x4_t __a, int16x4_t __b)
{
int16x4x2_t __rv;
- __rv.val[0] = (int16x4_t) __builtin_shuffle (__a, __b, (uint16x4_t) { 0, 2, 4, 6 });
- __rv.val[1] = (int16x4_t) __builtin_shuffle (__a, __b, (uint16x4_t) { 1, 3, 5, 7 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x4_t) { 5, 7, 1, 3 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x4_t) { 4, 6, 0, 2 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x4_t) { 0, 2, 4, 6 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x4_t) { 1, 3, 5, 7 });
+#endif
return __rv;
}
vuzp_s32 (int32x2_t __a, int32x2_t __b)
{
int32x2x2_t __rv;
- __rv.val[0] = (int32x2_t) __builtin_shuffle (__a, __b, (uint32x2_t) { 0, 2 });
- __rv.val[1] = (int32x2_t) __builtin_shuffle (__a, __b, (uint32x2_t) { 1, 3 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x2_t) { 3, 1 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x2_t) { 2, 0 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x2_t) { 0, 2 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x2_t) { 1, 3 });
+#endif
return __rv;
}
vuzp_f32 (float32x2_t __a, float32x2_t __b)
{
float32x2x2_t __rv;
- __rv.val[0] = (float32x2_t) __builtin_shuffle (__a, __b, (uint32x2_t) { 0, 2 });
- __rv.val[1] = (float32x2_t) __builtin_shuffle (__a, __b, (uint32x2_t) { 1, 3 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x2_t) { 3, 1 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x2_t) { 2, 0 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x2_t) { 0, 2 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x2_t) { 1, 3 });
+#endif
return __rv;
}
vuzp_u8 (uint8x8_t __a, uint8x8_t __b)
{
uint8x8x2_t __rv;
- __rv.val[0] = (uint8x8_t) __builtin_shuffle (__a, __b, (uint8x8_t) { 0, 2, 4, 6, 8, 10, 12, 14 });
- __rv.val[1] = (uint8x8_t) __builtin_shuffle (__a, __b, (uint8x8_t) { 1, 3, 5, 7, 9, 11, 13, 15 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x8_t)
+ { 9, 11, 13, 15, 1, 3, 5, 7 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x8_t)
+ { 8, 10, 12, 14, 0, 2, 4, 6 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x8_t)
+ { 0, 2, 4, 6, 8, 10, 12, 14 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x8_t)
+ { 1, 3, 5, 7, 9, 11, 13, 15 });
+#endif
return __rv;
}
vuzp_u16 (uint16x4_t __a, uint16x4_t __b)
{
uint16x4x2_t __rv;
- __rv.val[0] = (uint16x4_t) __builtin_shuffle (__a, __b, (uint16x4_t) { 0, 2, 4, 6 });
- __rv.val[1] = (uint16x4_t) __builtin_shuffle (__a, __b, (uint16x4_t) { 1, 3, 5, 7 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x4_t) { 5, 7, 1, 3 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x4_t) { 4, 6, 0, 2 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x4_t) { 0, 2, 4, 6 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x4_t) { 1, 3, 5, 7 });
+#endif
return __rv;
}
vuzp_u32 (uint32x2_t __a, uint32x2_t __b)
{
uint32x2x2_t __rv;
- __rv.val[0] = (uint32x2_t) __builtin_shuffle (__a, __b, (uint32x2_t) { 0, 2 });
- __rv.val[1] = (uint32x2_t) __builtin_shuffle (__a, __b, (uint32x2_t) { 1, 3 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x2_t) { 3, 1 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x2_t) { 2, 0 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x2_t) { 0, 2 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x2_t) { 1, 3 });
+#endif
return __rv;
}
vuzp_p8 (poly8x8_t __a, poly8x8_t __b)
{
poly8x8x2_t __rv;
- __rv.val[0] = (poly8x8_t) __builtin_shuffle (__a, __b, (uint8x8_t) { 0, 2, 4, 6, 8, 10, 12, 14 });
- __rv.val[1] = (poly8x8_t) __builtin_shuffle (__a, __b, (uint8x8_t) { 1, 3, 5, 7, 9, 11, 13, 15 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x8_t)
+ { 9, 11, 13, 15, 1, 3, 5, 7 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x8_t)
+ { 8, 10, 12, 14, 0, 2, 4, 6 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x8_t)
+ { 0, 2, 4, 6, 8, 10, 12, 14 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x8_t)
+ { 1, 3, 5, 7, 9, 11, 13, 15 });
+#endif
return __rv;
}
vuzp_p16 (poly16x4_t __a, poly16x4_t __b)
{
poly16x4x2_t __rv;
- __rv.val[0] = (poly16x4_t) __builtin_shuffle (__a, __b, (uint16x4_t) { 0, 2, 4, 6 });
- __rv.val[1] = (poly16x4_t) __builtin_shuffle (__a, __b, (uint16x4_t) { 1, 3, 5, 7 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x4_t) { 5, 7, 1, 3 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x4_t) { 4, 6, 0, 2 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x4_t) { 0, 2, 4, 6 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x4_t) { 1, 3, 5, 7 });
+#endif
return __rv;
}
vuzpq_s8 (int8x16_t __a, int8x16_t __b)
{
int8x16x2_t __rv;
- __rv.val[0] = (int8x16_t) __builtin_shuffle (__a, __b, (uint8x16_t) { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30 });
- __rv.val[1] = (int8x16_t) __builtin_shuffle (__a, __b, (uint8x16_t) { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x16_t)
+ { 17, 19, 21, 23, 25, 27, 29, 31, 1, 3, 5, 7, 9, 11, 13, 15 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x16_t)
+ { 16, 18, 20, 22, 24, 26, 28, 30, 0, 2, 4, 6, 8, 10, 12, 14 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x16_t)
+ { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x16_t)
+ { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31 });
+#endif
return __rv;
}
vuzpq_s16 (int16x8_t __a, int16x8_t __b)
{
int16x8x2_t __rv;
- __rv.val[0] = (int16x8_t) __builtin_shuffle (__a, __b, (uint16x8_t) { 0, 2, 4, 6, 8, 10, 12, 14 });
- __rv.val[1] = (int16x8_t) __builtin_shuffle (__a, __b, (uint16x8_t) { 1, 3, 5, 7, 9, 11, 13, 15 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x8_t)
+ { 9, 11, 13, 15, 1, 3, 5, 7 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x8_t)
+ { 8, 10, 12, 14, 0, 2, 4, 6 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x8_t)
+ { 0, 2, 4, 6, 8, 10, 12, 14 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x8_t)
+ { 1, 3, 5, 7, 9, 11, 13, 15 });
+#endif
return __rv;
}
vuzpq_s32 (int32x4_t __a, int32x4_t __b)
{
int32x4x2_t __rv;
- __rv.val[0] = (int32x4_t) __builtin_shuffle (__a, __b, (uint32x4_t) { 0, 2, 4, 6 });
- __rv.val[1] = (int32x4_t) __builtin_shuffle (__a, __b, (uint32x4_t) { 1, 3, 5, 7 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x4_t) { 5, 7, 1, 3 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x4_t) { 4, 6, 0, 2 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x4_t) { 0, 2, 4, 6 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x4_t) { 1, 3, 5, 7 });
+#endif
return __rv;
}
vuzpq_f32 (float32x4_t __a, float32x4_t __b)
{
float32x4x2_t __rv;
- __rv.val[0] = (float32x4_t) __builtin_shuffle (__a, __b, (uint32x4_t) { 0, 2, 4, 6 });
- __rv.val[1] = (float32x4_t) __builtin_shuffle (__a, __b, (uint32x4_t) { 1, 3, 5, 7 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x4_t) { 5, 7, 1, 3 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x4_t) { 4, 6, 0, 2 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x4_t) { 0, 2, 4, 6 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x4_t) { 1, 3, 5, 7 });
+#endif
return __rv;
}
vuzpq_u8 (uint8x16_t __a, uint8x16_t __b)
{
uint8x16x2_t __rv;
- __rv.val[0] = (uint8x16_t) __builtin_shuffle (__a, __b, (uint8x16_t) { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30 });
- __rv.val[1] = (uint8x16_t) __builtin_shuffle (__a, __b, (uint8x16_t) { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x16_t)
+ { 17, 19, 21, 23, 25, 27, 29, 31, 1, 3, 5, 7, 9, 11, 13, 15 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x16_t)
+ { 16, 18, 20, 22, 24, 26, 28, 30, 0, 2, 4, 6, 8, 10, 12, 14 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x16_t)
+ { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x16_t)
+ { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31 });
+#endif
return __rv;
}
vuzpq_u16 (uint16x8_t __a, uint16x8_t __b)
{
uint16x8x2_t __rv;
- __rv.val[0] = (uint16x8_t) __builtin_shuffle (__a, __b, (uint16x8_t) { 0, 2, 4, 6, 8, 10, 12, 14 });
- __rv.val[1] = (uint16x8_t) __builtin_shuffle (__a, __b, (uint16x8_t) { 1, 3, 5, 7, 9, 11, 13, 15 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x8_t)
+ { 9, 11, 13, 15, 1, 3, 5, 7 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x8_t)
+ { 8, 10, 12, 14, 0, 2, 4, 6 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x8_t)
+ { 0, 2, 4, 6, 8, 10, 12, 14 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x8_t)
+ { 1, 3, 5, 7, 9, 11, 13, 15 });
+#endif
return __rv;
}
vuzpq_u32 (uint32x4_t __a, uint32x4_t __b)
{
uint32x4x2_t __rv;
- __rv.val[0] = (uint32x4_t) __builtin_shuffle (__a, __b, (uint32x4_t) { 0, 2, 4, 6 });
- __rv.val[1] = (uint32x4_t) __builtin_shuffle (__a, __b, (uint32x4_t) { 1, 3, 5, 7 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x4_t) { 5, 7, 1, 3 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x4_t) { 4, 6, 0, 2 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint32x4_t) { 0, 2, 4, 6 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint32x4_t) { 1, 3, 5, 7 });
+#endif
return __rv;
}
vuzpq_p8 (poly8x16_t __a, poly8x16_t __b)
{
poly8x16x2_t __rv;
- __rv.val[0] = (poly8x16_t) __builtin_shuffle (__a, __b, (uint8x16_t) { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30 });
- __rv.val[1] = (poly8x16_t) __builtin_shuffle (__a, __b, (uint8x16_t) { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x16_t)
+ { 17, 19, 21, 23, 25, 27, 29, 31, 1, 3, 5, 7, 9, 11, 13, 15 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x16_t)
+ { 16, 18, 20, 22, 24, 26, 28, 30, 0, 2, 4, 6, 8, 10, 12, 14 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint8x16_t)
+ { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint8x16_t)
+ { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31 });
+#endif
return __rv;
}
vuzpq_p16 (poly16x8_t __a, poly16x8_t __b)
{
poly16x8x2_t __rv;
- __rv.val[0] = (poly16x8_t) __builtin_shuffle (__a, __b, (uint16x8_t) { 0, 2, 4, 6, 8, 10, 12, 14 });
- __rv.val[1] = (poly16x8_t) __builtin_shuffle (__a, __b, (uint16x8_t) { 1, 3, 5, 7, 9, 11, 13, 15 });
+#ifdef __ARM_BIG_ENDIAN
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x8_t)
+ { 9, 11, 13, 15, 1, 3, 5, 7 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x8_t)
+ { 8, 10, 12, 14, 0, 2, 4, 6 });
+#else
+ __rv.val[0] = __builtin_shuffle (__a, __b, (uint16x8_t)
+ { 0, 2, 4, 6, 8, 10, 12, 14 });
+ __rv.val[1] = __builtin_shuffle (__a, __b, (uint16x8_t)
+ { 1, 3, 5, 7, 9, 11, 13, 15 });
+#endif
return __rv;
}
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
License for more details.
- You should have received a copy of the GNU General Public License
- along with GCC; see the file COPYING3. If not see
+ Under Section 7 of GPL version 3, you are granted additional
+ permissions described in the GCC Runtime Library Exception, version
+ 3.1, as published by the Free Software Foundation.
+
+ You should have received a copy of the GNU General Public License and
+ a copy of the GCC Runtime Library Exception along with this program;
+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
/* Use the AAPCS ABI by default. */
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
License for more details.
- You should have received a copy of the GNU General Public License
- along with GCC; see the file COPYING3. If not see
+ Under Section 7 of GPL version 3, you are granted additional
+ permissions described in the GCC Runtime Library Exception, version
+ 3.1, as published by the Free Software Foundation.
+
+ You should have received a copy of the GNU General Public License and
+ a copy of the GCC Runtime Library Exception along with this program;
+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
#ifndef OBJECT_FORMAT_ELF
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
License for more details.
- You should have received a copy of the GNU General Public License
- along with GCC; see the file COPYING3. If not see
+ Under Section 7 of GPL version 3, you are granted additional
+ permissions described in the GCC Runtime Library Exception, version
+ 3.1, as published by the Free Software Foundation.
+
+ You should have received a copy of the GNU General Public License and
+ a copy of the GCC Runtime Library Exception along with this program;
+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
/* elfos.h should have already been included. Now just override
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
License for more details.
- You should have received a copy of the GNU General Public License
- along with GCC; see the file COPYING3. If not see
+ Under Section 7 of GPL version 3, you are granted additional
+ permissions described in the GCC Runtime Library Exception, version
+ 3.1, as published by the Free Software Foundation.
+
+ You should have received a copy of the GNU General Public License and
+ a copy of the GCC Runtime Library Exception along with this program;
+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
/* This is how we tell the assembler that a symbol is weak.
+++ /dev/null
-(* ARM NEON documentation generator.
-
- Copyright (C) 2006-2014 Free Software Foundation, Inc.
- Contributed by CodeSourcery.
-
- This file is part of GCC.
-
- GCC is free software; you can redistribute it and/or modify it under
- the terms of the GNU General Public License as published by the Free
- Software Foundation; either version 3, or (at your option) any later
- version.
-
- GCC is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- for more details.
-
- You should have received a copy of the GNU General Public License
- along with GCC; see the file COPYING3. If not see
- <http://www.gnu.org/licenses/>.
-
- This is an O'Caml program. The O'Caml compiler is available from:
-
- http://caml.inria.fr/
-
- Or from your favourite OS's friendly packaging system. Tested with version
- 3.09.2, though other versions will probably work too.
-
- Compile with:
- ocamlc -c neon.ml
- ocamlc -o neon-docgen neon.cmo neon-docgen.ml
-
- Run with:
- /path/to/neon-docgen /path/to/gcc/doc/arm-neon-intrinsics.texi
-*)
-
-open Neon
-
-(* The combined "ops" and "reinterp" table. *)
-let ops_reinterp = reinterp @ ops
-
-(* Helper functions for extracting things from the "ops" table. *)
-let single_opcode desired_opcode () =
- List.fold_left (fun got_so_far ->
- fun row ->
- match row with
- (opcode, _, _, _, _, _) ->
- if opcode = desired_opcode then row :: got_so_far
- else got_so_far
- ) [] ops_reinterp
-
-let multiple_opcodes desired_opcodes () =
- List.fold_left (fun got_so_far ->
- fun desired_opcode ->
- (single_opcode desired_opcode ()) @ got_so_far)
- [] desired_opcodes
-
-let ldx_opcode number () =
- List.fold_left (fun got_so_far ->
- fun row ->
- match row with
- (opcode, _, _, _, _, _) ->
- match opcode with
- Vldx n | Vldx_lane n | Vldx_dup n when n = number ->
- row :: got_so_far
- | _ -> got_so_far
- ) [] ops_reinterp
-
-let stx_opcode number () =
- List.fold_left (fun got_so_far ->
- fun row ->
- match row with
- (opcode, _, _, _, _, _) ->
- match opcode with
- Vstx n | Vstx_lane n when n = number ->
- row :: got_so_far
- | _ -> got_so_far
- ) [] ops_reinterp
-
-let tbl_opcode () =
- List.fold_left (fun got_so_far ->
- fun row ->
- match row with
- (opcode, _, _, _, _, _) ->
- match opcode with
- Vtbl _ -> row :: got_so_far
- | _ -> got_so_far
- ) [] ops_reinterp
-
-let tbx_opcode () =
- List.fold_left (fun got_so_far ->
- fun row ->
- match row with
- (opcode, _, _, _, _, _) ->
- match opcode with
- Vtbx _ -> row :: got_so_far
- | _ -> got_so_far
- ) [] ops_reinterp
-
-(* The groups of intrinsics. *)
-let intrinsic_groups =
- [ "Addition", single_opcode Vadd;
- "Multiplication", single_opcode Vmul;
- "Multiply-accumulate", single_opcode Vmla;
- "Multiply-subtract", single_opcode Vmls;
- "Fused-multiply-accumulate", single_opcode Vfma;
- "Fused-multiply-subtract", single_opcode Vfms;
- "Round to integral (to nearest, ties to even)", single_opcode Vrintn;
- "Round to integral (to nearest, ties away from zero)", single_opcode Vrinta;
- "Round to integral (towards +Inf)", single_opcode Vrintp;
- "Round to integral (towards -Inf)", single_opcode Vrintm;
- "Round to integral (towards 0)", single_opcode Vrintz;
- "Subtraction", single_opcode Vsub;
- "Comparison (equal-to)", single_opcode Vceq;
- "Comparison (greater-than-or-equal-to)", single_opcode Vcge;
- "Comparison (less-than-or-equal-to)", single_opcode Vcle;
- "Comparison (greater-than)", single_opcode Vcgt;
- "Comparison (less-than)", single_opcode Vclt;
- "Comparison (absolute greater-than-or-equal-to)", single_opcode Vcage;
- "Comparison (absolute less-than-or-equal-to)", single_opcode Vcale;
- "Comparison (absolute greater-than)", single_opcode Vcagt;
- "Comparison (absolute less-than)", single_opcode Vcalt;
- "Test bits", single_opcode Vtst;
- "Absolute difference", single_opcode Vabd;
- "Absolute difference and accumulate", single_opcode Vaba;
- "Maximum", single_opcode Vmax;
- "Minimum", single_opcode Vmin;
- "Pairwise add", single_opcode Vpadd;
- "Pairwise add, single_opcode widen and accumulate", single_opcode Vpada;
- "Folding maximum", single_opcode Vpmax;
- "Folding minimum", single_opcode Vpmin;
- "Reciprocal step", multiple_opcodes [Vrecps; Vrsqrts];
- "Vector shift left", single_opcode Vshl;
- "Vector shift left by constant", single_opcode Vshl_n;
- "Vector shift right by constant", single_opcode Vshr_n;
- "Vector shift right by constant and accumulate", single_opcode Vsra_n;
- "Vector shift right and insert", single_opcode Vsri;
- "Vector shift left and insert", single_opcode Vsli;
- "Absolute value", single_opcode Vabs;
- "Negation", single_opcode Vneg;
- "Bitwise not", single_opcode Vmvn;
- "Count leading sign bits", single_opcode Vcls;
- "Count leading zeros", single_opcode Vclz;
- "Count number of set bits", single_opcode Vcnt;
- "Reciprocal estimate", single_opcode Vrecpe;
- "Reciprocal square-root estimate", single_opcode Vrsqrte;
- "Get lanes from a vector", single_opcode Vget_lane;
- "Set lanes in a vector", single_opcode Vset_lane;
- "Create vector from literal bit pattern", single_opcode Vcreate;
- "Set all lanes to the same value",
- multiple_opcodes [Vdup_n; Vmov_n; Vdup_lane];
- "Combining vectors", single_opcode Vcombine;
- "Splitting vectors", multiple_opcodes [Vget_high; Vget_low];
- "Conversions", multiple_opcodes [Vcvt; Vcvt_n];
- "Move, single_opcode narrowing", single_opcode Vmovn;
- "Move, single_opcode long", single_opcode Vmovl;
- "Table lookup", tbl_opcode;
- "Extended table lookup", tbx_opcode;
- "Multiply, lane", single_opcode Vmul_lane;
- "Long multiply, lane", single_opcode Vmull_lane;
- "Saturating doubling long multiply, lane", single_opcode Vqdmull_lane;
- "Saturating doubling multiply high, lane", single_opcode Vqdmulh_lane;
- "Multiply-accumulate, lane", single_opcode Vmla_lane;
- "Multiply-subtract, lane", single_opcode Vmls_lane;
- "Vector multiply by scalar", single_opcode Vmul_n;
- "Vector long multiply by scalar", single_opcode Vmull_n;
- "Vector saturating doubling long multiply by scalar",
- single_opcode Vqdmull_n;
- "Vector saturating doubling multiply high by scalar",
- single_opcode Vqdmulh_n;
- "Vector multiply-accumulate by scalar", single_opcode Vmla_n;
- "Vector multiply-subtract by scalar", single_opcode Vmls_n;
- "Vector extract", single_opcode Vext;
- "Reverse elements", multiple_opcodes [Vrev64; Vrev32; Vrev16];
- "Bit selection", single_opcode Vbsl;
- "Transpose elements", single_opcode Vtrn;
- "Zip elements", single_opcode Vzip;
- "Unzip elements", single_opcode Vuzp;
- "Element/structure loads, VLD1 variants", ldx_opcode 1;
- "Element/structure stores, VST1 variants", stx_opcode 1;
- "Element/structure loads, VLD2 variants", ldx_opcode 2;
- "Element/structure stores, VST2 variants", stx_opcode 2;
- "Element/structure loads, VLD3 variants", ldx_opcode 3;
- "Element/structure stores, VST3 variants", stx_opcode 3;
- "Element/structure loads, VLD4 variants", ldx_opcode 4;
- "Element/structure stores, VST4 variants", stx_opcode 4;
- "Logical operations (AND)", single_opcode Vand;
- "Logical operations (OR)", single_opcode Vorr;
- "Logical operations (exclusive OR)", single_opcode Veor;
- "Logical operations (AND-NOT)", single_opcode Vbic;
- "Logical operations (OR-NOT)", single_opcode Vorn;
- "Reinterpret casts", single_opcode Vreinterp ]
-
-(* Given an intrinsic shape, produce a string to document the corresponding
- operand shapes. *)
-let rec analyze_shape shape =
- let rec n_things n thing =
- match n with
- 0 -> []
- | n -> thing :: (n_things (n - 1) thing)
- in
- let rec analyze_shape_elt reg_no elt =
- match elt with
- Dreg -> "@var{d" ^ (string_of_int reg_no) ^ "}"
- | Qreg -> "@var{q" ^ (string_of_int reg_no) ^ "}"
- | Corereg -> "@var{r" ^ (string_of_int reg_no) ^ "}"
- | Immed -> "#@var{0}"
- | VecArray (1, elt) ->
- let elt_regexp = analyze_shape_elt 0 elt in
- "@{" ^ elt_regexp ^ "@}"
- | VecArray (n, elt) ->
- let rec f m =
- match m with
- 0 -> []
- | m -> (analyze_shape_elt (m - 1) elt) :: (f (m - 1))
- in
- let ops = List.rev (f n) in
- "@{" ^ (commas (fun x -> x) ops "") ^ "@}"
- | (PtrTo elt | CstPtrTo elt) ->
- "[" ^ (analyze_shape_elt reg_no elt) ^ "]"
- | Element_of_dreg -> (analyze_shape_elt reg_no Dreg) ^ "[@var{0}]"
- | Element_of_qreg -> (analyze_shape_elt reg_no Qreg) ^ "[@var{0}]"
- | All_elements_of_dreg -> (analyze_shape_elt reg_no Dreg) ^ "[]"
- | Alternatives alts -> (analyze_shape_elt reg_no (List.hd alts))
- in
- match shape with
- All (n, elt) -> commas (analyze_shape_elt 0) (n_things n elt) ""
- | Long -> (analyze_shape_elt 0 Qreg) ^ ", " ^ (analyze_shape_elt 0 Dreg) ^
- ", " ^ (analyze_shape_elt 0 Dreg)
- | Long_noreg elt -> (analyze_shape_elt 0 elt) ^ ", " ^
- (analyze_shape_elt 0 elt)
- | Wide -> (analyze_shape_elt 0 Qreg) ^ ", " ^ (analyze_shape_elt 0 Qreg) ^
- ", " ^ (analyze_shape_elt 0 Dreg)
- | Wide_noreg elt -> analyze_shape (Long_noreg elt)
- | Narrow -> (analyze_shape_elt 0 Dreg) ^ ", " ^ (analyze_shape_elt 0 Qreg) ^
- ", " ^ (analyze_shape_elt 0 Qreg)
- | Use_operands elts -> commas (analyze_shape_elt 0) (Array.to_list elts) ""
- | By_scalar Dreg ->
- analyze_shape (Use_operands [| Dreg; Dreg; Element_of_dreg |])
- | By_scalar Qreg ->
- analyze_shape (Use_operands [| Qreg; Qreg; Element_of_dreg |])
- | By_scalar _ -> assert false
- | Wide_lane ->
- analyze_shape (Use_operands [| Qreg; Dreg; Element_of_dreg |])
- | Wide_scalar ->
- analyze_shape (Use_operands [| Qreg; Dreg; Element_of_dreg |])
- | Pair_result elt ->
- let elt_regexp = analyze_shape_elt 0 elt in
- let elt_regexp' = analyze_shape_elt 1 elt in
- elt_regexp ^ ", " ^ elt_regexp'
- | Unary_scalar _ -> "FIXME Unary_scalar"
- | Binary_imm elt -> analyze_shape (Use_operands [| elt; elt; Immed |])
- | Narrow_imm -> analyze_shape (Use_operands [| Dreg; Qreg; Immed |])
- | Long_imm -> analyze_shape (Use_operands [| Qreg; Dreg; Immed |])
-
-(* Document a single intrinsic. *)
-let describe_intrinsic first chan
- (elt_ty, (_, features, shape, name, munge, _)) =
- let c_arity, new_elt_ty = munge shape elt_ty in
- let c_types = strings_of_arity c_arity in
- Printf.fprintf chan "@itemize @bullet\n";
- let item_code = if first then "@item" else "@itemx" in
- Printf.fprintf chan "%s %s %s_%s (" item_code (List.hd c_types)
- (intrinsic_name name) (string_of_elt elt_ty);
- Printf.fprintf chan "%s)\n" (commas (fun ty -> ty) (List.tl c_types) "");
- if not (List.exists (fun feature -> feature = No_op) features) then
- begin
- let print_one_insn name =
- Printf.fprintf chan "@code{";
- let no_suffix = (new_elt_ty = NoElts) in
- let name_with_suffix =
- if no_suffix then name
- else name ^ "." ^ (string_of_elt_dots new_elt_ty)
- in
- let possible_operands = analyze_all_shapes features shape
- analyze_shape
- in
- let rec print_one_possible_operand op =
- Printf.fprintf chan "%s %s}" name_with_suffix op
- in
- (* If the intrinsic expands to multiple instructions, we assume
- they are all of the same form. *)
- print_one_possible_operand (List.hd possible_operands)
- in
- let rec print_insns names =
- match names with
- [] -> ()
- | [name] -> print_one_insn name
- | name::names -> (print_one_insn name;
- Printf.fprintf chan " @emph{or} ";
- print_insns names)
- in
- let insn_names = get_insn_names features name in
- Printf.fprintf chan "@*@emph{Form of expected instruction(s):} ";
- print_insns insn_names;
- Printf.fprintf chan "\n"
- end;
- Printf.fprintf chan "@end itemize\n";
- Printf.fprintf chan "\n\n"
-
-(* Document a group of intrinsics. *)
-let document_group chan (group_title, group_extractor) =
- (* Extract the rows in question from the ops table and then turn them
- into a list of intrinsics. *)
- let intrinsics =
- List.fold_left (fun got_so_far ->
- fun row ->
- match row with
- (_, _, _, _, _, elt_tys) ->
- List.fold_left (fun got_so_far' ->
- fun elt_ty ->
- (elt_ty, row) :: got_so_far')
- got_so_far elt_tys
- ) [] (group_extractor ())
- in
- (* Emit the title for this group. *)
- Printf.fprintf chan "@subsubsection %s\n\n" group_title;
- (* Emit a description of each intrinsic. *)
- List.iter (describe_intrinsic true chan) intrinsics;
- (* Close this group. *)
- Printf.fprintf chan "\n\n"
-
-let gnu_header chan =
- List.iter (fun s -> Printf.fprintf chan "%s\n" s) [
- "@c Copyright (C) 2006-2014 Free Software Foundation, Inc.";
- "@c This is part of the GCC manual.";
- "@c For copying conditions, see the file gcc.texi.";
- "";
- "@c This file is generated automatically using gcc/config/arm/neon-docgen.ml";
- "@c Please do not edit manually."]
-
-let crypto_doc =
-"
-@itemize @bullet
-@item poly128_t vldrq_p128(poly128_t const *)
-@end itemize
-
-@itemize @bullet
-@item void vstrq_p128(poly128_t *, poly128_t)
-@end itemize
-
-@itemize @bullet
-@item uint64x1_t vceq_p64 (poly64x1_t, poly64x1_t)
-@end itemize
-
-@itemize @bullet
-@item uint64x1_t vtst_p64 (poly64x1_t, poly64x1_t)
-@end itemize
-
-@itemize @bullet
-@item uint32_t vsha1h_u32 (uint32_t)
-@*@emph{Form of expected instruction(s):} @code{sha1h.32 @var{q0}, @var{q1}}
-@end itemize
-
-@itemize @bullet
-@item uint32x4_t vsha1cq_u32 (uint32x4_t, uint32_t, uint32x4_t)
-@*@emph{Form of expected instruction(s):} @code{sha1c.32 @var{q0}, @var{q1}, @var{q2}}
-@end itemize
-
-@itemize @bullet
-@item uint32x4_t vsha1pq_u32 (uint32x4_t, uint32_t, uint32x4_t)
-@*@emph{Form of expected instruction(s):} @code{sha1p.32 @var{q0}, @var{q1}, @var{q2}}
-@end itemize
-
-@itemize @bullet
-@item uint32x4_t vsha1mq_u32 (uint32x4_t, uint32_t, uint32x4_t)
-@*@emph{Form of expected instruction(s):} @code{sha1m.32 @var{q0}, @var{q1}, @var{q2}}
-@end itemize
-
-@itemize @bullet
-@item uint32x4_t vsha1su0q_u32 (uint32x4_t, uint32x4_t, uint32x4_t)
-@*@emph{Form of expected instruction(s):} @code{sha1su0.32 @var{q0}, @var{q1}, @var{q2}}
-@end itemize
-
-@itemize @bullet
-@item uint32x4_t vsha1su1q_u32 (uint32x4_t, uint32x4_t)
-@*@emph{Form of expected instruction(s):} @code{sha1su1.32 @var{q0}, @var{q1}, @var{q2}}
-@end itemize
-
-@itemize @bullet
-@item uint32x4_t vsha256hq_u32 (uint32x4_t, uint32x4_t, uint32x4_t)
-@*@emph{Form of expected instruction(s):} @code{sha256h.32 @var{q0}, @var{q1}, @var{q2}}
-@end itemize
-
-@itemize @bullet
-@item uint32x4_t vsha256h2q_u32 (uint32x4_t, uint32x4_t, uint32x4_t)
-@*@emph{Form of expected instruction(s):} @code{sha256h2.32 @var{q0}, @var{q1}, @var{q2}}
-@end itemize
-
-@itemize @bullet
-@item uint32x4_t vsha256su0q_u32 (uint32x4_t, uint32x4_t)
-@*@emph{Form of expected instruction(s):} @code{sha256su0.32 @var{q0}, @var{q1}}
-@end itemize
-
-@itemize @bullet
-@item uint32x4_t vsha256su1q_u32 (uint32x4_t, uint32x4_t, uint32x4_t)
-@*@emph{Form of expected instruction(s):} @code{sha256su1.32 @var{q0}, @var{q1}, @var{q2}}
-@end itemize
-
-@itemize @bullet
-@item poly128_t vmull_p64 (poly64_t a, poly64_t b)
-@*@emph{Form of expected instruction(s):} @code{vmull.p64 @var{q0}, @var{d1}, @var{d2}}
-@end itemize
-
-@itemize @bullet
-@item poly128_t vmull_high_p64 (poly64x2_t a, poly64x2_t b)
-@*@emph{Form of expected instruction(s):} @code{vmull.p64 @var{q0}, @var{d1}, @var{d2}}
-@end itemize
-"
-
-(* Program entry point. *)
-let _ =
- if Array.length Sys.argv <> 2 then
- failwith "Usage: neon-docgen <output filename>"
- else
- let file = Sys.argv.(1) in
- try
- let chan = open_out file in
- gnu_header chan;
- List.iter (document_group chan) intrinsic_groups;
- Printf.fprintf chan "%s\n" crypto_doc;
- close_out chan
- with Sys_error sys ->
- failwith ("Could not create output file " ^ file ^ ": " ^ sys)
+++ /dev/null
-(* Auto-generate ARM Neon intrinsics header file.
- Copyright (C) 2006-2014 Free Software Foundation, Inc.
- Contributed by CodeSourcery.
-
- This file is part of GCC.
-
- GCC is free software; you can redistribute it and/or modify it under
- the terms of the GNU General Public License as published by the Free
- Software Foundation; either version 3, or (at your option) any later
- version.
-
- GCC is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- for more details.
-
- You should have received a copy of the GNU General Public License
- along with GCC; see the file COPYING3. If not see
- <http://www.gnu.org/licenses/>.
-
- This is an O'Caml program. The O'Caml compiler is available from:
-
- http://caml.inria.fr/
-
- Or from your favourite OS's friendly packaging system. Tested with version
- 3.09.2, though other versions will probably work too.
-
- Compile with:
- ocamlc -c neon.ml
- ocamlc -o neon-gen neon.cmo neon-gen.ml
-
- Run with:
- ./neon-gen > arm_neon.h
-*)
-
-open Neon
-
-(* The format codes used in the following functions are documented at:
- http://caml.inria.fr/pub/docs/manual-ocaml/libref/Format.html\
- #6_printflikefunctionsforprettyprinting
- (one line, remove the backslash.)
-*)
-
-(* Following functions can be used to approximate GNU indentation style. *)
-let start_function () =
- Format.printf "@[<v 0>";
- ref 0
-
-let end_function nesting =
- match !nesting with
- 0 -> Format.printf "@;@;@]"
- | _ -> failwith ("Bad nesting (ending function at level "
- ^ (string_of_int !nesting) ^ ")")
-
-let open_braceblock nesting =
- begin match !nesting with
- 0 -> Format.printf "@,@<0>{@[<v 2>@,"
- | _ -> Format.printf "@,@[<v 2> @<0>{@[<v 2>@,"
- end;
- incr nesting
-
-let close_braceblock nesting =
- decr nesting;
- match !nesting with
- 0 -> Format.printf "@]@,@<0>}"
- | _ -> Format.printf "@]@,@<0>}@]"
-
-let print_function arity fnname body =
- let ffmt = start_function () in
- Format.printf "__extension__ static __inline ";
- let inl = "__attribute__ ((__always_inline__))" in
- begin match arity with
- Arity0 ret ->
- Format.printf "%s %s@,%s (void)" (string_of_vectype ret) inl fnname
- | Arity1 (ret, arg0) ->
- Format.printf "%s %s@,%s (%s __a)" (string_of_vectype ret) inl fnname
- (string_of_vectype arg0)
- | Arity2 (ret, arg0, arg1) ->
- Format.printf "%s %s@,%s (%s __a, %s __b)"
- (string_of_vectype ret) inl fnname (string_of_vectype arg0)
- (string_of_vectype arg1)
- | Arity3 (ret, arg0, arg1, arg2) ->
- Format.printf "%s %s@,%s (%s __a, %s __b, %s __c)"
- (string_of_vectype ret) inl fnname (string_of_vectype arg0)
- (string_of_vectype arg1) (string_of_vectype arg2)
- | Arity4 (ret, arg0, arg1, arg2, arg3) ->
- Format.printf "%s %s@,%s (%s __a, %s __b, %s __c, %s __d)"
- (string_of_vectype ret) inl fnname (string_of_vectype arg0)
- (string_of_vectype arg1) (string_of_vectype arg2)
- (string_of_vectype arg3)
- end;
- open_braceblock ffmt;
- let rec print_lines = function
- [] -> ()
- | "" :: lines -> print_lines lines
- | [line] -> Format.printf "%s" line
- | line::lines -> Format.printf "%s@," line ; print_lines lines in
- print_lines body;
- close_braceblock ffmt;
- end_function ffmt
-
-let union_string num elts base =
- let itype = inttype_for_array num elts in
- let iname = string_of_inttype itype
- and sname = string_of_vectype (T_arrayof (num, elts)) in
- Printf.sprintf "union { %s __i; %s __o; } %s" sname iname base
-
-let rec signed_ctype = function
- T_uint8x8 | T_poly8x8 -> T_int8x8
- | T_uint8x16 | T_poly8x16 -> T_int8x16
- | T_uint16x4 | T_poly16x4 -> T_int16x4
- | T_uint16x8 | T_poly16x8 -> T_int16x8
- | T_uint32x2 -> T_int32x2
- | T_uint32x4 -> T_int32x4
- | T_uint64x1 -> T_int64x1
- | T_uint64x2 -> T_int64x2
- | T_poly64x2 -> T_int64x2
- (* Cast to types defined by mode in arm.c, not random types pulled in from
- the <stdint.h> header in use. This fixes incompatible pointer errors when
- compiling with C++. *)
- | T_uint8 | T_int8 -> T_intQI
- | T_uint16 | T_int16 -> T_intHI
- | T_uint32 | T_int32 -> T_intSI
- | T_uint64 | T_int64 -> T_intDI
- | T_float16 -> T_floatHF
- | T_float32 -> T_floatSF
- | T_poly8 -> T_intQI
- | T_poly16 -> T_intHI
- | T_poly64 -> T_intDI
- | T_poly128 -> T_intTI
- | T_arrayof (n, elt) -> T_arrayof (n, signed_ctype elt)
- | T_ptrto elt -> T_ptrto (signed_ctype elt)
- | T_const elt -> T_const (signed_ctype elt)
- | x -> x
-
-let add_cast ctype cval =
- let stype = signed_ctype ctype in
- if ctype <> stype then
- Printf.sprintf "(%s) %s" (string_of_vectype stype) cval
- else
- cval
-
-let cast_for_return to_ty = "(" ^ (string_of_vectype to_ty) ^ ")"
-
-(* Return a tuple of a list of declarations to go at the start of the function,
- and a list of statements needed to return THING. *)
-let return arity thing =
- match arity with
- Arity0 (ret) | Arity1 (ret, _) | Arity2 (ret, _, _) | Arity3 (ret, _, _, _)
- | Arity4 (ret, _, _, _, _) ->
- begin match ret with
- T_arrayof (num, vec) ->
- let uname = union_string num vec "__rv" in
- [uname ^ ";"], ["__rv.__o = " ^ thing ^ ";"; "return __rv.__i;"]
- | T_void ->
- [], [thing ^ ";"]
- | _ ->
- [], ["return " ^ (cast_for_return ret) ^ thing ^ ";"]
- end
-
-let mask_shape_for_shuffle = function
- All (num, reg) -> All (num, reg)
- | Pair_result reg -> All (2, reg)
- | _ -> failwith "mask_for_shuffle"
-
-let mask_elems shuffle shape elttype part =
- let elem_size = elt_width elttype in
- let num_elems =
- match regmap shape 0 with
- Dreg -> 64 / elem_size
- | Qreg -> 128 / elem_size
- | _ -> failwith "mask_elems" in
- shuffle elem_size num_elems part
-
-(* Return a tuple of a list of declarations 0and a list of statements needed
- to implement an intrinsic using __builtin_shuffle. SHUFFLE is a function
- which returns a list of elements suitable for using as a mask. *)
-
-let shuffle_fn shuffle shape arity elttype =
- let mshape = mask_shape_for_shuffle shape in
- let masktype = type_for_elt mshape (unsigned_of_elt elttype) 0 in
- let masktype_str = string_of_vectype masktype in
- let shuffle_res = type_for_elt mshape elttype 0 in
- let shuffle_res_str = string_of_vectype shuffle_res in
- match arity with
- Arity0 (ret) | Arity1 (ret, _) | Arity2 (ret, _, _) | Arity3 (ret, _, _, _)
- | Arity4 (ret, _, _, _, _) ->
- begin match ret with
- T_arrayof (num, vec) ->
- let elems1 = mask_elems shuffle mshape elttype `lo
- and elems2 = mask_elems shuffle mshape elttype `hi in
- let mask1 = (String.concat ", " (List.map string_of_int elems1))
- and mask2 = (String.concat ", " (List.map string_of_int elems2)) in
- let shuf1 = Printf.sprintf
- "__rv.val[0] = (%s) __builtin_shuffle (__a, __b, (%s) { %s });"
- shuffle_res_str masktype_str mask1
- and shuf2 = Printf.sprintf
- "__rv.val[1] = (%s) __builtin_shuffle (__a, __b, (%s) { %s });"
- shuffle_res_str masktype_str mask2 in
- [Printf.sprintf "%s __rv;" (string_of_vectype ret);],
- [shuf1; shuf2; "return __rv;"]
- | _ ->
- let elems = mask_elems shuffle mshape elttype `lo in
- let mask = (String.concat ", " (List.map string_of_int elems)) in
- let shuf = Printf.sprintf
- "return (%s) __builtin_shuffle (__a, (%s) { %s });" shuffle_res_str masktype_str mask in
- [""],
- [shuf]
- end
-
-let rec element_type ctype =
- match ctype with
- T_arrayof (_, v) -> element_type v
- | _ -> ctype
-
-let params ps =
- let pdecls = ref [] in
- let ptype t p =
- match t with
- T_arrayof (num, elts) ->
- let uname = union_string num elts (p ^ "u") in
- let decl = Printf.sprintf "%s = { %s };" uname p in
- pdecls := decl :: !pdecls;
- p ^ "u.__o"
- | _ -> add_cast t p in
- let plist = match ps with
- Arity0 _ -> []
- | Arity1 (_, t1) -> [ptype t1 "__a"]
- | Arity2 (_, t1, t2) -> [ptype t1 "__a"; ptype t2 "__b"]
- | Arity3 (_, t1, t2, t3) -> [ptype t1 "__a"; ptype t2 "__b"; ptype t3 "__c"]
- | Arity4 (_, t1, t2, t3, t4) ->
- [ptype t1 "__a"; ptype t2 "__b"; ptype t3 "__c"; ptype t4 "__d"] in
- !pdecls, plist
-
-let modify_params features plist =
- let is_flipped =
- List.exists (function Flipped _ -> true | _ -> false) features in
- if is_flipped then
- match plist with
- [ a; b ] -> [ b; a ]
- | _ ->
- failwith ("Don't know how to flip args " ^ (String.concat ", " plist))
- else
- plist
-
-(* !!! Decide whether to add an extra information word based on the shape
- form. *)
-let extra_word shape features paramlist bits =
- let use_word =
- match shape with
- All _ | Long | Long_noreg _ | Wide | Wide_noreg _ | Narrow
- | By_scalar _ | Wide_scalar | Wide_lane | Binary_imm _ | Long_imm
- | Narrow_imm -> true
- | _ -> List.mem InfoWord features
- in
- if use_word then
- paramlist @ [string_of_int bits]
- else
- paramlist
-
-(* Bit 0 represents signed (1) vs unsigned (0), or float (1) vs poly (0).
- Bit 1 represents floats & polynomials (1), or ordinary integers (0).
- Bit 2 represents rounding (1) vs none (0). *)
-let infoword_value elttype features =
- let bits01 =
- match elt_class elttype with
- Signed | ConvClass (Signed, _) | ConvClass (_, Signed) -> 0b001
- | Poly -> 0b010
- | Float -> 0b011
- | _ -> 0b000
- and rounding_bit = if List.mem Rounding features then 0b100 else 0b000 in
- bits01 lor rounding_bit
-
-(* "Cast" type operations will throw an exception in mode_of_elt (actually in
- elt_width, called from there). Deal with that here, and generate a suffix
- with multiple modes (<to><from>). *)
-let rec mode_suffix elttype shape =
- try
- let mode = mode_of_elt elttype shape in
- string_of_mode mode
- with MixedMode (dst, src) ->
- let dstmode = mode_of_elt ~argpos:0 dst shape
- and srcmode = mode_of_elt ~argpos:1 src shape in
- string_of_mode dstmode ^ string_of_mode srcmode
-
-let get_shuffle features =
- try
- match List.find (function Use_shuffle _ -> true | _ -> false) features with
- Use_shuffle fn -> Some fn
- | _ -> None
- with Not_found -> None
-
-let print_feature_test_start features =
- try
- match List.find (fun feature ->
- match feature with Requires_feature _ -> true
- | Requires_arch _ -> true
- | Requires_FP_bit _ -> true
- | _ -> false)
- features with
- Requires_feature feature ->
- Format.printf "#ifdef __ARM_FEATURE_%s@\n" feature
- | Requires_arch arch ->
- Format.printf "#if __ARM_ARCH >= %d@\n" arch
- | Requires_FP_bit bit ->
- Format.printf "#if ((__ARM_FP & 0x%X) != 0)@\n"
- (1 lsl bit)
- | _ -> assert false
- with Not_found -> assert true
-
-let print_feature_test_end features =
- let feature =
- List.exists (function Requires_feature _ -> true
- | Requires_arch _ -> true
- | Requires_FP_bit _ -> true
- | _ -> false) features in
- if feature then Format.printf "#endif@\n"
-
-
-let print_variant opcode features shape name (ctype, asmtype, elttype) =
- let bits = infoword_value elttype features in
- let modesuf = mode_suffix elttype shape in
- let pdecls, paramlist = params ctype in
- let rdecls, stmts =
- match get_shuffle features with
- Some shuffle -> shuffle_fn shuffle shape ctype elttype
- | None ->
- let paramlist' = modify_params features paramlist in
- let paramlist'' = extra_word shape features paramlist' bits in
- let parstr = String.concat ", " paramlist'' in
- let builtin = Printf.sprintf "__builtin_neon_%s%s (%s)"
- (builtin_name features name) modesuf parstr in
- return ctype builtin in
- let body = pdecls @ rdecls @ stmts
- and fnname = (intrinsic_name name) ^ "_" ^ (string_of_elt elttype) in
- begin
- print_feature_test_start features;
- print_function ctype fnname body;
- print_feature_test_end features;
- end
-
-(* When this function processes the element types in the ops table, it rewrites
- them in a list of tuples (a,b,c):
- a : C type as an "arity", e.g. Arity1 (T_poly8x8, T_poly8x8)
- b : Asm type : a single, processed element type, e.g. P16. This is the
- type which should be attached to the asm opcode.
- c : Variant type : the unprocessed type for this variant (e.g. in add
- instructions which don't care about the sign, b might be i16 and c
- might be s16.)
-*)
-
-let print_op (opcode, features, shape, name, munge, types) =
- let sorted_types = List.sort compare types in
- let munged_types = List.map
- (fun elt -> let c, asm = munge shape elt in c, asm, elt) sorted_types in
- List.iter
- (fun variant -> print_variant opcode features shape name variant)
- munged_types
-
-let print_ops ops =
- List.iter print_op ops
-
-(* Output type definitions. Table entries are:
- cbase : "C" name for the type.
- abase : "ARM" base name for the type (i.e. int in int8x8_t).
- esize : element size.
- enum : element count.
- alevel: architecture level at which available.
-*)
-
-type fpulevel = CRYPTO | ALL
-
-let deftypes () =
- let typeinfo = [
- (* Doubleword vector types. *)
- "__builtin_neon_qi", "int", 8, 8, ALL;
- "__builtin_neon_hi", "int", 16, 4, ALL;
- "__builtin_neon_si", "int", 32, 2, ALL;
- "__builtin_neon_di", "int", 64, 1, ALL;
- "__builtin_neon_hf", "float", 16, 4, ALL;
- "__builtin_neon_sf", "float", 32, 2, ALL;
- "__builtin_neon_poly8", "poly", 8, 8, ALL;
- "__builtin_neon_poly16", "poly", 16, 4, ALL;
- "__builtin_neon_poly64", "poly", 64, 1, CRYPTO;
- "__builtin_neon_uqi", "uint", 8, 8, ALL;
- "__builtin_neon_uhi", "uint", 16, 4, ALL;
- "__builtin_neon_usi", "uint", 32, 2, ALL;
- "__builtin_neon_udi", "uint", 64, 1, ALL;
-
- (* Quadword vector types. *)
- "__builtin_neon_qi", "int", 8, 16, ALL;
- "__builtin_neon_hi", "int", 16, 8, ALL;
- "__builtin_neon_si", "int", 32, 4, ALL;
- "__builtin_neon_di", "int", 64, 2, ALL;
- "__builtin_neon_sf", "float", 32, 4, ALL;
- "__builtin_neon_poly8", "poly", 8, 16, ALL;
- "__builtin_neon_poly16", "poly", 16, 8, ALL;
- "__builtin_neon_poly64", "poly", 64, 2, CRYPTO;
- "__builtin_neon_uqi", "uint", 8, 16, ALL;
- "__builtin_neon_uhi", "uint", 16, 8, ALL;
- "__builtin_neon_usi", "uint", 32, 4, ALL;
- "__builtin_neon_udi", "uint", 64, 2, ALL
- ] in
- List.iter
- (fun (cbase, abase, esize, enum, fpulevel) ->
- let attr =
- match enum with
- 1 -> ""
- | _ -> Printf.sprintf "\t__attribute__ ((__vector_size__ (%d)))"
- (esize * enum / 8) in
- if fpulevel == CRYPTO then
- Format.printf "#ifdef __ARM_FEATURE_CRYPTO\n";
- Format.printf "typedef %s %s%dx%d_t%s;@\n" cbase abase esize enum attr;
- if fpulevel == CRYPTO then
- Format.printf "#endif\n";)
- typeinfo;
- Format.print_newline ();
- (* Extra types not in <stdint.h>. *)
- Format.printf "typedef float float32_t;\n";
- Format.printf "typedef __builtin_neon_poly8 poly8_t;\n";
- Format.printf "typedef __builtin_neon_poly16 poly16_t;\n";
- Format.printf "#ifdef __ARM_FEATURE_CRYPTO\n";
- Format.printf "typedef __builtin_neon_poly64 poly64_t;\n";
- Format.printf "typedef __builtin_neon_poly128 poly128_t;\n";
- Format.printf "#endif\n"
-
-(* Output structs containing arrays, for load & store instructions etc.
- poly128_t is deliberately not included here because it has no array types
- defined for it. *)
-
-let arrtypes () =
- let typeinfo = [
- "int", 8, ALL; "int", 16, ALL;
- "int", 32, ALL; "int", 64, ALL;
- "uint", 8, ALL; "uint", 16, ALL;
- "uint", 32, ALL; "uint", 64, ALL;
- "float", 32, ALL; "poly", 8, ALL;
- "poly", 16, ALL; "poly", 64, CRYPTO
- ] in
- let writestruct elname elsize regsize arrsize fpulevel =
- let elnum = regsize / elsize in
- let structname =
- Printf.sprintf "%s%dx%dx%d_t" elname elsize elnum arrsize in
- let sfmt = start_function () in
- Format.printf "%stypedef struct %s"
- (if fpulevel == CRYPTO then "#ifdef __ARM_FEATURE_CRYPTO\n" else "") structname;
- open_braceblock sfmt;
- Format.printf "%s%dx%d_t val[%d];" elname elsize elnum arrsize;
- close_braceblock sfmt;
- Format.printf " %s;%s" structname (if fpulevel == CRYPTO then "\n#endif\n" else "");
- end_function sfmt;
- in
- for n = 2 to 4 do
- List.iter
- (fun (elname, elsize, alevel) ->
- writestruct elname elsize 64 n alevel;
- writestruct elname elsize 128 n alevel)
- typeinfo
- done
-
-let print_lines = List.iter (fun s -> Format.printf "%s@\n" s)
-
-(* Do it. *)
-
-let _ =
- print_lines [
-"/* ARM NEON intrinsics include file. This file is generated automatically";
-" using neon-gen.ml. Please do not edit manually.";
-"";
-" Copyright (C) 2006-2014 Free Software Foundation, Inc.";
-" Contributed by CodeSourcery.";
-"";
-" This file is part of GCC.";
-"";
-" GCC is free software; you can redistribute it and/or modify it";
-" under the terms of the GNU General Public License as published";
-" by the Free Software Foundation; either version 3, or (at your";
-" option) any later version.";
-"";
-" GCC is distributed in the hope that it will be useful, but WITHOUT";
-" ANY WARRANTY; without even the implied warranty of MERCHANTABILITY";
-" or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public";
-" License for more details.";
-"";
-" Under Section 7 of GPL version 3, you are granted additional";
-" permissions described in the GCC Runtime Library Exception, version";
-" 3.1, as published by the Free Software Foundation.";
-"";
-" You should have received a copy of the GNU General Public License and";
-" a copy of the GCC Runtime Library Exception along with this program;";
-" see the files COPYING3 and COPYING.RUNTIME respectively. If not, see";
-" <http://www.gnu.org/licenses/>. */";
-"";
-"#ifndef _GCC_ARM_NEON_H";
-"#define _GCC_ARM_NEON_H 1";
-"";
-"#ifndef __ARM_NEON__";
-"#error You must enable NEON instructions (e.g. -mfloat-abi=softfp -mfpu=neon) to use arm_neon.h";
-"#else";
-"";
-"#ifdef __cplusplus";
-"extern \"C\" {";
-"#endif";
-"";
-"#include <stdint.h>";
-""];
- deftypes ();
- arrtypes ();
- Format.print_newline ();
- print_ops ops;
- Format.print_newline ();
- print_ops reinterp;
- print_ops reinterpq;
- Format.printf "%s" crypto_intrinsics;
- print_lines [
-"#ifdef __cplusplus";
-"}";
-"#endif";
-"#endif";
-"#endif"]
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
License for more details.
- You should have received a copy of the GNU General Public License
- along with GCC; see the file COPYING3. If not see
+ Under Section 7 of GPL version 3, you are granted additional
+ permissions described in the GCC Runtime Library Exception, version
+ 3.1, as published by the Free Software Foundation.
+
+ You should have received a copy of the GNU General Public License and
+ a copy of the GCC Runtime Library Exception along with this program;
+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
/* Run-time Target Specification. */
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
License for more details.
- You should have received a copy of the GNU General Public License
- along with GCC; see the file COPYING3. If not see
+ Under Section 7 of GPL version 3, you are granted additional
+ permissions described in the GCC Runtime Library Exception, version
+ 3.1, as published by the Free Software Foundation.
+
+ You should have received a copy of the GNU General Public License and
+ a copy of the GCC Runtime Library Exception along with this program;
+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
/* Override settings that are different to the uclinux-elf or
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
License for more details.
- You should have received a copy of the GNU General Public License
- along with GCC; see the file COPYING3. If not see
+ Under Section 7 of GPL version 3, you are granted additional
+ permissions described in the GCC Runtime Library Exception, version
+ 3.1, as published by the Free Software Foundation.
+
+ You should have received a copy of the GNU General Public License and
+ a copy of the GCC Runtime Library Exception along with this program;
+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
/* We don't want a PLT. */
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3. If not see
+Under Section 7 of GPL version 3, you are granted additional
+permissions described in the GCC Runtime Library Exception, version
+3.1, as published by the Free Software Foundation.
+
+You should have received a copy of the GNU General Public License and
+a copy of the GCC Runtime Library Exception along with this program;
+see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
}
// Input and output of the libgcc function
- const unsigned int regno_in[] = { -1, 22, 22, -1, 18 };
- const unsigned int regno_out[] = { -1, 24, 24, -1, 22 };
+ const unsigned int regno_in[] = { -1U, 22, 22, -1U, 18 };
+ const unsigned int regno_out[] = { -1U, 24, 24, -1U, 22 };
operands[3] = gen_rtx_REG (<MODE>mode, regno_out[(size_t) GET_MODE_SIZE (<MODE>mode)]);
operands[4] = gen_rtx_REG (<MODE>mode, regno_in[(size_t) GET_MODE_SIZE (<MODE>mode)]);
AVR_MCU ("atxmega192d3", ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATxmega192D3__", 0x2000, 4, "x192d3")
AVR_MCU ("atxmega256a3", ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATxmega256A3__", 0x2000, 5, "x256a3")
AVR_MCU ("atxmega256a3b", ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATxmega256A3B__", 0x2000, 5, "x256a3b")
-AVR_MCU ("atxmega256a3bu", ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATxmega258A3BU__", 0x2000, 5, "x256a3bu")
+AVR_MCU ("atxmega256a3bu", ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATxmega256A3BU__", 0x2000, 5, "x256a3bu")
AVR_MCU ("atxmega256d3", ARCH_AVRXMEGA6, AVR_ISA_NONE, "__AVR_ATxmega256D3__", 0x2000, 5, "x256d3")
AVR_MCU ("atxmega128a3u", ARCH_AVRXMEGA6, AVR_ISA_RMW, "__AVR_ATxmega128A3U__", 0x2000, 3, "x128a3u")
AVR_MCU ("atxmega128b1", ARCH_AVRXMEGA6, AVR_ISA_RMW, "__AVR_ATxmega128B1__", 0x2000, 3, "x128b1")
}
break;
+ case CC_SET_VZN:
+ /* Insn like INC, DEC, NEG that set Z,N,V. We currently don't make use
+ of this combination, cf. also PR61055. */
+ CC_STATUS_INIT;
+ break;
+
case CC_SET_CZN:
/* Insn sets the Z,N,C flags of CC to recog_operand[0].
The V flag may or may not be known but that's ok because
"std Y+61,%A1" CR_TAB
"std Y+62,%B1" CR_TAB
"std Y+63,%C1" CR_TAB
- "sbiw r28,%o0-60", op, plen, -5);
+ "sbiw r28,%o0-61", op, plen, -5);
return avr_asm_len ("subi r28,lo8(-%o0)" CR_TAB
"sbci r29,hi8(-%o0)" CR_TAB
if (REG_P (xop[2]))
{
- *pcc = MINUS == code ? (int) CC_SET_CZN : (int) CC_SET_N;
+ *pcc = MINUS == code ? (int) CC_SET_CZN : (int) CC_CLOBBER;
for (i = 0; i < n_bytes; i++)
{
op, plen, 1);
if (n_bytes == 2 && PLUS == code)
- *pcc = CC_SET_ZN;
+ *pcc = CC_SET_CZN;
}
i++;
{
avr_asm_len ((code == PLUS) ^ (val8 == 1) ? "dec %0" : "inc %0",
op, plen, 1);
+ *pcc = CC_CLOBBER;
break;
}
#define REG_CLASS_CONTENTS { \
{0x00000000,0x00000000}, /* NO_REGS */ \
{0x00000001,0x00000000}, /* R0_REG */ \
- {3 << REG_X,0x00000000}, /* POINTER_X_REGS, r26 - r27 */ \
- {3 << REG_Y,0x00000000}, /* POINTER_Y_REGS, r28 - r29 */ \
- {3 << REG_Z,0x00000000}, /* POINTER_Z_REGS, r30 - r31 */ \
+ {3u << REG_X,0x00000000}, /* POINTER_X_REGS, r26 - r27 */ \
+ {3u << REG_Y,0x00000000}, /* POINTER_Y_REGS, r28 - r29 */ \
+ {3u << REG_Z,0x00000000}, /* POINTER_Z_REGS, r30 - r31 */ \
{0x00000000,0x00000003}, /* STACK_REG, STACK */ \
- {(3 << REG_Y) | (3 << REG_Z), \
+ {(3u << REG_Y) | (3u << REG_Z), \
0x00000000}, /* BASE_POINTER_REGS, r28 - r31 */ \
- {(3 << REG_X) | (3 << REG_Y) | (3 << REG_Z), \
+ {(3u << REG_X) | (3u << REG_Y) | (3u << REG_Z), \
0x00000000}, /* POINTER_REGS, r26 - r31 */ \
- {(3 << REG_X) | (3 << REG_Y) | (3 << REG_Z) | (3 << REG_W), \
+ {(3u << REG_X) | (3u << REG_Y) | (3u << REG_Z) | (3u << REG_W), \
0x00000000}, /* ADDW_REGS, r24 - r31 */ \
{0x00ff0000,0x00000000}, /* SIMPLE_LD_REGS r16 - r23 */ \
- {(3 << REG_X)|(3 << REG_Y)|(3 << REG_Z)|(3 << REG_W)|(0xff << 16), \
+ {(3u << REG_X)|(3u << REG_Y)|(3u << REG_Z)|(3u << REG_W)|(0xffu << 16),\
0x00000000}, /* LD_REGS, r16 - r31 */ \
{0x0000ffff,0x00000000}, /* NO_LD_REGS r0 - r15 */ \
{0xffffffff,0x00000000}, /* GENERAL_REGS, r0 - r31 */ \
(include "constraints.md")
;; Condition code settings.
-(define_attr "cc" "none,set_czn,set_zn,set_n,compare,clobber,
+(define_attr "cc" "none,set_czn,set_zn,set_vzn,set_n,compare,clobber,
plus,ldi"
(const_string "none"))
""
{
int i;
+
+ // Avoid (subreg (mem)) for non-generic address spaces below. Because
+ // of the poor addressing capabilities of these spaces it's better to
+ // load them in one chunk. And it avoids PR61443.
+
+ if (MEM_P (operands[0])
+ && !ADDR_SPACE_GENERIC_P (MEM_ADDR_SPACE (operands[0])))
+ operands[0] = copy_to_mode_reg (<MODE>mode, operands[0]);
+
for (i = GET_MODE_SIZE (<MODE>mode) - 1; i >= 0; --i)
{
rtx part = simplify_gen_subreg (QImode, operands[0], <MODE>mode, i);
inc %0\;inc %0
dec %0\;dec %0"
[(set_attr "length" "1,1,1,1,2,2")
- (set_attr "cc" "set_czn,set_czn,set_zn,set_zn,set_zn,set_zn")])
+ (set_attr "cc" "set_czn,set_czn,set_vzn,set_vzn,set_vzn,set_vzn")])
;; "addhi3"
;; "addhq3" "adduhq3"
dec %0\;dec %0
inc %0\;inc %0"
[(set_attr "length" "1,1,1,1,2,2")
- (set_attr "cc" "set_czn,set_czn,set_zn,set_zn,set_zn,set_zn")])
+ (set_attr "cc" "set_czn,set_czn,set_vzn,set_vzn,set_vzn,set_vzn")])
;; "subhi3"
;; "subhq3" "subuhq3"
""
"neg %0"
[(set_attr "length" "1")
- (set_attr "cc" "set_zn")])
+ (set_attr "cc" "set_vzn")])
(define_insn "*negqihi2"
[(set (match_operand:HI 0 "register_operand" "=r")
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3. If not see
+Under Section 7 of GPL version 3, you are granted additional
+permissions described in the GCC Runtime Library Exception, version
+3.1, as published by the Free Software Foundation.
+
+You should have received a copy of the GNU General Public License and
+a copy of the GCC Runtime Library Exception along with this program;
+see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
/* This file causes gcc to prefer using DBX (stabs) debugging
#undef ENDFILE_SPEC
#define ENDFILE_SPEC \
"%{Ofast|ffast-math|funsafe-math-optimizations:crtfastmath.o%s}\
+ %{!shared:%:if-exists(default-manifest.o%s)}\
crtend.o%s"
/* Normally, -lgcc is not needed since everything in it is in the DLL, but we
/* Assume Core 2. */
cpu = "core2";
}
+ else if (has_longmode)
+ /* Perhaps some emulator? Assume x86-64, otherwise gcc
+ -march=native would be unusable for 64-bit compilations,
+ as all the CPUs below are 32-bit only. */
+ cpu = "x86-64";
else if (has_sse3)
/* It is Core Duo. */
cpu = "pentium-m";
(PTA_SANDYBRIDGE | PTA_FSGSBASE | PTA_RDRND | PTA_F16C)
#define PTA_HASWELL \
(PTA_IVYBRIDGE | PTA_AVX2 | PTA_BMI | PTA_BMI2 | PTA_LZCNT \
- | PTA_FMA | PTA_MOVBE | PTA_RTM | PTA_HLE)
+ | PTA_FMA | PTA_MOVBE | PTA_HLE)
#define PTA_BROADWELL \
(PTA_HASWELL | PTA_ADX | PTA_PRFCHW | PTA_RDSEED)
#define PTA_BONNELL \
t1 = gen_reg_rtx (V32QImode);
t2 = gen_reg_rtx (V32QImode);
t3 = gen_reg_rtx (V32QImode);
- vt2 = GEN_INT (128);
+ vt2 = GEN_INT (-128);
for (i = 0; i < 32; i++)
vec[i] = vt2;
vt = gen_rtx_CONST_VECTOR (V32QImode, gen_rtvec_v (32, vec));
{
const struct stringop_algs * algs;
bool optimize_for_speed;
- int max = -1;
+ int max = 0;
const struct processor_costs *cost;
int i;
bool any_alg_usable_p = false;
/* If expected size is not known but max size is small enough
so inline version is a win, set expected size into
the range. */
- if (max > 1 && (unsigned HOST_WIDE_INT) max >= max_size
+ if (((max > 1 && (unsigned HOST_WIDE_INT) max >= max_size) || max == -1)
&& expected_size == -1)
expected_size = min_size / 2 + max_size / 2;
*dynamic_check = 128;
return loop_1_byte;
}
- if (max == -1)
+ if (max <= 0)
max = 4096;
alg = decide_alg (count, max / 2, min_size, max_size, memset,
zero_memset, dynamic_check, noalign);
align = MEM_ALIGN (dst) / BITS_PER_UNIT;
if (CONST_INT_P (count_exp))
- min_size = max_size = probable_max_size = count = expected_size
- = INTVAL (count_exp);
+ {
+ min_size = max_size = probable_max_size = count = expected_size
+ = INTVAL (count_exp);
+ /* When COUNT is 0, there is nothing to do. */
+ if (!count)
+ return true;
+ }
else
{
if (min_size_exp)
max_size = INTVAL (max_size_exp);
if (probable_max_size_exp)
probable_max_size = INTVAL (probable_max_size_exp);
- if (CONST_INT_P (expected_size_exp) && count == 0)
+ if (CONST_INT_P (expected_size_exp))
expected_size = INTVAL (expected_size_exp);
}
if (jump_around_label == NULL_RTX)
jump_around_label = gen_label_rtx ();
emit_cmp_and_jump_insns (count_exp, GEN_INT (dynamic_check - 1),
- LEU, 0, GET_MODE (count_exp), 1, hot_label);
+ LEU, 0, counter_mode (count_exp),
+ 1, hot_label);
predict_jump (REG_BR_PROB_BASE * 90 / 100);
if (issetmem)
set_storage_via_libcall (dst, count_exp, val_exp, false);
{
edge e;
edge_iterator ei;
- /* Assume that region is SCC, i.e. all immediate predecessors
- of non-head block are in the same region. */
+
+ /* Regions are SCCs with the exception of selective
+ scheduling with pipelining of outer blocks enabled.
+ So also check that immediate predecessors of a non-head
+ block are in the same region. */
FOR_EACH_EDGE (e, ei, bb->preds)
{
/* Avoid creating of loop-carried dependencies through
- using topological odering in region. */
- if (BLOCK_TO_BB (bb->index) > BLOCK_TO_BB (e->src->index))
+ using topological ordering in the region. */
+ if (rgn == CONTAINING_RGN (e->src->index)
+ && BLOCK_TO_BB (bb->index) > BLOCK_TO_BB (e->src->index))
add_dependee_for_func_arg (first_arg, e->src);
}
}
else
op2 = gen_rtx_SUBREG (SImode, op0, 0);
- if (target == 0)
+ if (target == 0
+ || !register_operand (target, SImode))
target = gen_reg_rtx (SImode);
pat = gen_rtx_GEU (VOIDmode, gen_rtx_REG (CCCmode, FLAGS_REG),
const0_rtx);
emit_insn (gen_rtx_SET (VOIDmode, op2, pat));
- if (target == 0)
+ if (target == 0
+ || !register_operand (target, SImode))
target = gen_reg_rtx (SImode);
emit_insn (gen_zero_extendqisi2 (target, op2));
else if (TARGET_64BIT && !x86_64_zext_immediate_operand (x, VOIDmode))
*total = 2;
else if (flag_pic && SYMBOLIC_CONST (x)
- && (!TARGET_64BIT
- || (!GET_CODE (x) != LABEL_REF
- && (GET_CODE (x) != SYMBOL_REF
- || !SYMBOL_REF_LOCAL_P (x)))))
+ && !(TARGET_64BIT
+ && (GET_CODE (x) == LABEL_REF
+ || (GET_CODE (x) == SYMBOL_REF
+ && SYMBOL_REF_LOCAL_P (x)))))
*total = 1;
else
*total = 0;
(const_string "1")
(const_string "*")))
(set (attr "mode")
- (cond [(eq_attr "alternative" "3,4,9,10,13,14,15")
+ (cond [(eq_attr "alternative" "3,4,9,10,12,13,14,15")
(const_string "SI")
(eq_attr "alternative" "11")
(const_string "DI")
;; Avoid store forwarding (partial memory) stall penalty by extending
;; SImode value to DImode through XMM register instead of pushing two
-;; SImode values to stack. Note that even !TARGET_INTER_UNIT_MOVES_TO_VEC
-;; targets benefit from this optimization. Also note that fild
-;; loads from memory only.
+;; SImode values to stack. Also note that fild loads from memory only.
-(define_insn "*floatunssi<mode>2_1"
- [(set (match_operand:X87MODEF 0 "register_operand" "=f,f")
+(define_insn_and_split "*floatunssi<mode>2_i387_with_xmm"
+ [(set (match_operand:X87MODEF 0 "register_operand" "=f")
(unsigned_float:X87MODEF
- (match_operand:SI 1 "nonimmediate_operand" "x,m")))
- (clobber (match_operand:DI 2 "memory_operand" "=m,m"))
- (clobber (match_scratch:SI 3 "=X,x"))]
+ (match_operand:SI 1 "nonimmediate_operand" "rm")))
+ (clobber (match_scratch:DI 3 "=x"))
+ (clobber (match_operand:DI 2 "memory_operand" "=m"))]
"!TARGET_64BIT
&& TARGET_80387 && X87_ENABLE_FLOAT (<X87MODEF:MODE>mode, DImode)
- && TARGET_SSE"
+ && TARGET_SSE2 && TARGET_INTER_UNIT_MOVES_TO_VEC"
"#"
- [(set_attr "type" "multi")
- (set_attr "mode" "<MODE>")])
-
-(define_split
- [(set (match_operand:X87MODEF 0 "register_operand")
- (unsigned_float:X87MODEF
- (match_operand:SI 1 "register_operand")))
- (clobber (match_operand:DI 2 "memory_operand"))
- (clobber (match_scratch:SI 3))]
- "!TARGET_64BIT
- && TARGET_80387 && X87_ENABLE_FLOAT (<X87MODEF:MODE>mode, DImode)
- && TARGET_SSE
- && reload_completed"
- [(set (match_dup 2) (match_dup 1))
- (set (match_dup 0)
- (float:X87MODEF (match_dup 2)))]
- "operands[1] = simplify_gen_subreg (DImode, operands[1], SImode, 0);")
-
-(define_split
- [(set (match_operand:X87MODEF 0 "register_operand")
- (unsigned_float:X87MODEF
- (match_operand:SI 1 "memory_operand")))
- (clobber (match_operand:DI 2 "memory_operand"))
- (clobber (match_scratch:SI 3))]
- "!TARGET_64BIT
- && TARGET_80387 && X87_ENABLE_FLOAT (<X87MODEF:MODE>mode, DImode)
- && TARGET_SSE
- && reload_completed"
- [(set (match_dup 2) (match_dup 3))
+ "&& reload_completed"
+ [(set (match_dup 3) (zero_extend:DI (match_dup 1)))
+ (set (match_dup 2) (match_dup 3))
(set (match_dup 0)
(float:X87MODEF (match_dup 2)))]
-{
- emit_move_insn (operands[3], operands[1]);
- operands[3] = simplify_gen_subreg (DImode, operands[3], SImode, 0);
-})
+ ""
+ [(set_attr "type" "multi")
+ (set_attr "mode" "<MODE>")])
(define_expand "floatunssi<mode>2"
[(parallel
[(set (match_operand:X87MODEF 0 "register_operand")
(unsigned_float:X87MODEF
(match_operand:SI 1 "nonimmediate_operand")))
- (clobber (match_dup 2))
- (clobber (match_scratch:SI 3))])]
+ (clobber (match_scratch:DI 3))
+ (clobber (match_dup 2))])]
"!TARGET_64BIT
&& ((TARGET_80387 && X87_ENABLE_FLOAT (<X87MODEF:MODE>mode, DImode)
- && TARGET_SSE)
+ && TARGET_SSE2 && TARGET_INTER_UNIT_MOVES_TO_VEC)
|| (SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH))"
{
if (SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
(define_insn "x86_64_shrd"
[(set (match_operand:DI 0 "nonimmediate_operand" "+r*m")
- (ior:DI (ashiftrt:DI (match_dup 0)
+ (ior:DI (lshiftrt:DI (match_dup 0)
(match_operand:QI 2 "nonmemory_operand" "Jc"))
(ashift:DI (match_operand:DI 1 "register_operand" "r")
(minus:QI (const_int 64) (match_dup 2)))))
(define_insn "x86_shrd"
[(set (match_operand:SI 0 "nonimmediate_operand" "+r*m")
- (ior:SI (ashiftrt:SI (match_dup 0)
+ (ior:SI (lshiftrt:SI (match_dup 0)
(match_operand:QI 2 "nonmemory_operand" "Ic"))
(ashift:SI (match_operand:SI 1 "register_operand" "r")
(minus:QI (const_int 32) (match_dup 2)))))
[(set (match_dup 3) (match_dup 4))
(parallel
[(set (match_dup 4)
- (ior:DWIH (ashiftrt:DWIH (match_dup 4) (match_dup 2))
+ (ior:DWIH (lshiftrt:DWIH (match_dup 4) (match_dup 2))
(ashift:DWIH (match_dup 5)
(minus:QI (match_dup 6) (match_dup 2)))))
(clobber (reg:CC FLAGS_REG))])
(parallel
[(set (match_dup 5)
- (ior:DWIH (ashiftrt:DWIH (match_dup 5) (match_dup 2))
+ (ior:DWIH (lshiftrt:DWIH (match_dup 5) (match_dup 2))
(ashift:DWIH (match_dup 3)
(minus:QI (match_dup 6) (match_dup 2)))))
(clobber (reg:CC FLAGS_REG))])]
"TARGET_USE_FANCY_MATH_387
&& flag_unsafe_math_optimizations"
{
+ rtx tmp1, tmp2;
if (optimize_insn_for_size_p ())
FAIL;
- operands[3] = gen_reg_rtx (XFmode);
- operands[4] = gen_reg_rtx (XFmode);
+ tmp1 = gen_reg_rtx (XFmode);
+ tmp2 = gen_reg_rtx (XFmode);
- emit_insn (gen_floatsixf2 (operands[3], operands[2]));
- emit_insn (gen_fscalexf4_i387 (operands[0], operands[4],
- operands[1], operands[3]));
+ emit_insn (gen_floatsixf2 (tmp1, operands[2]));
+ emit_insn (gen_fscalexf4_i387 (operands[0], tmp2,
+ operands[1], tmp1));
DONE;
})
#undef ENDFILE_SPEC
#define ENDFILE_SPEC \
"%{Ofast|ffast-math|funsafe-math-optimizations:crtfastmath.o%s} \
+ %{!shared:%:if-exists(default-manifest.o%s)}\
crtend.o%s"
/* Override startfile prefix defaults. */
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
License for more details.
- You should have received a copy of the GNU General Public License
- along with GCC; see the file COPYING3. If not see
+ Under Section 7 of GPL version 3, you are granted additional
+ permissions described in the GCC Runtime Library Exception, version
+ 3.1, as published by the Free Software Foundation.
+
+ You should have received a copy of the GNU General Public License and
+ a copy of the GCC Runtime Library Exception along with this program;
+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
#ifdef HAVE_INITFINI_ARRAY_SUPPORT
--- /dev/null
+/* GCC option-handling definitions for the TI MSP430
+ Copyright (C) 2014 Free Software Foundation, Inc.
+
+ This file is part of GCC.
+
+ GCC is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GCC is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+ License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GCC; see the file COPYING3. If not see
+ <http://www.gnu.org/licenses/>. */
+
+#ifndef MSP430_OPTS_H
+#define MSP430_OPTS_H
+
+enum msp430_hwmult_types
+{
+ NONE,
+ AUTO,
+ SMALL,
+ LARGE,
+ F5SERIES
+};
+
+#endif
void msp430_fixup_compare_operands (enum machine_mode, rtx *);
int msp430_hard_regno_mode_ok (int, enum machine_mode);
int msp430_hard_regno_nregs (int, enum machine_mode);
-bool msp430_hwmult_enabled (void);
rtx msp430_incoming_return_addr_rtx (void);
void msp430_init_cumulative_args (CUMULATIVE_ARGS *, tree, rtx, tree, int);
int msp430_initial_elimination_offset (int, int);
-bool msp430_is_f5_mcu (void);
bool msp430_is_interrupt_func (void);
const char * msp430x_logical_shift_right (rtx);
const char * msp430_mcu_name (void);
void msp430_split_movsi (rtx *);
void msp430_start_function (FILE *, const char *, tree);
rtx msp430_subreg (enum machine_mode, rtx, enum machine_mode, int);
+bool msp430_use_f5_series_hwmult (void);
#endif /* GCC_MSP430_PROTOS_H */
return m;
}
-#undef TARGET_HANDLE_OPTION
-#define TARGET_HANDLE_OPTION msp430_handle_option
-
-bool
-msp430_handle_option (struct gcc_options *opts ATTRIBUTE_UNUSED,
- struct gcc_options *opts_set ATTRIBUTE_UNUSED,
- const struct cl_decoded_option *decoded ATTRIBUTE_UNUSED,
- location_t loc ATTRIBUTE_UNUSED)
-{
- return true;
-}
-
#undef TARGET_OPTION_OVERRIDE
#define TARGET_OPTION_OVERRIDE msp430_option_override
if (target_cpu)
{
- if (strcasecmp (target_cpu, "msp430x") == 0
- || strcasecmp (target_cpu, "msp430xv2") == 0
- || strcasecmp (target_cpu, "430x") == 0
- || strcasecmp (target_cpu, "430xv2") == 0)
+ if (strcasecmp (target_cpu, "msp430x") == 0)
msp430x = true;
- else if (strcasecmp (target_cpu, "msp430") == 0
- || strcasecmp (target_cpu, "430") == 0)
+ else /* target_cpu == "msp430" - already handled by the front end. */
msp430x = false;
- else
- error ("unrecognised argument of -mcpu: %s", target_cpu);
}
-
- if (target_mcu)
+ /* Note - the front end has already ensured at most
+ one of target_cpu and target_mcu will be set. */
+ else if (target_mcu)
{
int i;
supports 430. */
msp430x = true;
- /* For backwards compatibility we recognise two generic MCU
- 430X names. However we want to be able to generate special C
- preprocessor defines for them, which is why we set target_mcu
- to NULL. */
- if (strcasecmp (target_mcu, "msp430") == 0)
- {
- msp430x = false;
- target_mcu = NULL;
- }
- else if (strcasecmp (target_mcu, "msp430x") == 0
- || strcasecmp (target_mcu, "msp430xv2") == 0)
- target_mcu = NULL;
- else
- for (i = ARRAY_SIZE (msp430_mcu_names); i--;)
- if (strcasecmp (msp430_mcu_names[i], target_mcu) == 0)
- {
- msp430x = false;
- break;
- }
+ for (i = ARRAY_SIZE (msp430_mcu_names); i--;)
+ if (strcasecmp (msp430_mcu_names[i], target_mcu) == 0)
+ {
+ msp430x = false;
+ break;
+ }
/* It is not an error if we do not match the MCU name. There are
hundreds of them. */
}
{
return Pmode;
}
+
+#undef TARGET_GIMPLIFY_VA_ARG_EXPR
+#define TARGET_GIMPLIFY_VA_ARG_EXPR msp430_gimplify_va_arg_expr
+
+#include "gimplify.h"
+#include "gimple-expr.h"
+
+static tree
+msp430_gimplify_va_arg_expr (tree valist, tree type, gimple_seq *pre_p,
+ gimple_seq *post_p)
+{
+ tree addr, t, type_size, rounded_size, valist_tmp;
+ unsigned HOST_WIDE_INT align, boundary;
+ bool indirect;
+
+ indirect = pass_by_reference (NULL, TYPE_MODE (type), type, false);
+ if (indirect)
+ type = build_pointer_type (type);
+
+ align = PARM_BOUNDARY / BITS_PER_UNIT;
+ boundary = targetm.calls.function_arg_boundary (TYPE_MODE (type), type);
+
+ /* When we align parameter on stack for caller, if the parameter
+ alignment is beyond MAX_SUPPORTED_STACK_ALIGNMENT, it will be
+ aligned at MAX_SUPPORTED_STACK_ALIGNMENT. We will match callee
+ here with caller. */
+ if (boundary > MAX_SUPPORTED_STACK_ALIGNMENT)
+ boundary = MAX_SUPPORTED_STACK_ALIGNMENT;
+
+ boundary /= BITS_PER_UNIT;
+
+ /* Hoist the valist value into a temporary for the moment. */
+ valist_tmp = get_initialized_tmp_var (valist, pre_p, NULL);
+
+ /* va_list pointer is aligned to PARM_BOUNDARY. If argument actually
+ requires greater alignment, we must perform dynamic alignment. */
+ if (boundary > align
+ && !integer_zerop (TYPE_SIZE (type)))
+ {
+ /* FIXME: This is where this function diverts from targhooks.c:
+ std_gimplify_va_arg_expr(). It works, but I do not know why... */
+ if (! POINTER_TYPE_P (type))
+ {
+ t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
+ fold_build_pointer_plus_hwi (valist_tmp, boundary - 1));
+ gimplify_and_add (t, pre_p);
+
+ t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
+ fold_build2 (BIT_AND_EXPR, TREE_TYPE (valist),
+ valist_tmp,
+ build_int_cst (TREE_TYPE (valist), -boundary)));
+ gimplify_and_add (t, pre_p);
+ }
+ }
+ else
+ boundary = align;
+
+ /* If the actual alignment is less than the alignment of the type,
+ adjust the type accordingly so that we don't assume strict alignment
+ when dereferencing the pointer. */
+ boundary *= BITS_PER_UNIT;
+ if (boundary < TYPE_ALIGN (type))
+ {
+ type = build_variant_type_copy (type);
+ TYPE_ALIGN (type) = boundary;
+ }
+
+ /* Compute the rounded size of the type. */
+ type_size = size_in_bytes (type);
+ rounded_size = round_up (type_size, align);
+
+ /* Reduce rounded_size so it's sharable with the postqueue. */
+ gimplify_expr (&rounded_size, pre_p, post_p, is_gimple_val, fb_rvalue);
+
+ /* Get AP. */
+ addr = valist_tmp;
+
+ /* Compute new value for AP. */
+ t = fold_build_pointer_plus (valist_tmp, rounded_size);
+ t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist, t);
+ gimplify_and_add (t, pre_p);
+
+ addr = fold_convert (build_pointer_type (type), addr);
+
+ if (indirect)
+ addr = build_va_arg_indirect_ref (addr);
+
+ addr = build_va_arg_indirect_ref (addr);
+
+ return addr;
+}
\f
/* Addressing Modes */
/* Returns true if the current MCU is an F5xxx series. */
bool
-msp430_is_f5_mcu (void)
+msp430_use_f5_series_hwmult (void)
{
- if (target_mcu == NULL)
+ if (msp430_hwmult_type == F5SERIES)
+ return true;
+
+ if (target_mcu == NULL || msp430_hwmult_type != AUTO)
return false;
+
return strncasecmp (target_mcu, "msp430f5", 8) == 0;
}
/* Returns true id the current MCU has a second generation 32-bit hardware multiplier. */
static bool
-has_32bit_hw_mult (void)
+use_32bit_hwmult (void)
{
static const char * known_32bit_mult_mcus [] =
{
"msp430f47177", "msp430f47187", "msp430f47197"
};
int i;
- if (target_mcu == NULL)
+
+ if (msp430_hwmult_type == LARGE)
+ return true;
+
+ if (target_mcu == NULL || msp430_hwmult_type != AUTO)
return false;
for (i = ARRAY_SIZE (known_32bit_mult_mcus); i--;)
return false;
}
-/* Returns true if hardware multiply is supported by the chosen MCU. */
-bool
-msp430_hwmult_enabled (void)
-{
- if (target_mcu == NULL)
- return false;
-
- if (!ENABLE_HWMULT)
- return false;
-
- if (msp430_is_interrupt_func ())
- return false;
-
- if (msp430_is_f5_mcu () || has_32bit_hw_mult ())
- return true;
-
- return false;
-}
-
/* This function does the same as the default, but it will replace GCC
function names with the MSPABI-specified ones. */
void
/* If we have been given a specific MCU name then we may be
able to make use of its hardware multiply capabilities. */
- if (msp430_hwmult_enabled ())
+ if (msp430_hwmult_type != NONE)
{
if (strcmp ("__mspabi_mpyi", name) == 0)
{
- if (msp430_is_f5_mcu ())
+ if (msp430_use_f5_series_hwmult ())
name = "__mulhi2_f5";
else
name = "__mulhi2";
}
else if (strcmp ("__mspabi_mpyl", name) == 0)
{
- if (msp430_is_f5_mcu ())
+ if (msp430_use_f5_series_hwmult ())
name = "__mulsi2_f5";
- else if (has_32bit_hw_mult ())
+ else if (use_32bit_hwmult ())
name = "__mulsi2_hw32";
else
name = "__mulsi2";
because builtins are expanded before the frame layout is determined. */
fprintf (file, "%d",
msp430_initial_elimination_offset (ARG_POINTER_REGNUM, STACK_POINTER_REGNUM)
- - 2);
+ - (TARGET_LARGE ? 4 : 2));
return;
case 'J':
msp430_print_operand_addr (file, addr);
break;
- case CONST_INT:
case CONST:
+ if (GET_CODE (XEXP (op, 0)) == ZERO_EXTRACT)
+ {
+ op = XEXP (op, 0);
+ switch (INTVAL (XEXP (op, 2)))
+ {
+ case 0:
+ fprintf (file, "#lo (");
+ msp430_print_operand_raw (file, XEXP (op, 0));
+ fprintf (file, ")");
+ break;
+
+ case 16:
+ fprintf (file, "#hi (");
+ msp430_print_operand_raw (file, XEXP (op, 0));
+ fprintf (file, ")");
+ break;
+
+ default:
+ output_operand_lossage ("invalid zero extract");
+ break;
+ }
+ break;
+ }
+ /* Fall through. */
+ case CONST_INT:
case SYMBOL_REF:
case LABEL_REF:
if (letter == 0)
"%{mcpu=*:-mcpu=%*}%{!mcpu=*:%{mmcu=*:-mmcu=%*}} " /* Pass the CPU type on to the assembler. */ \
"%{mrelax=-mQ} " /* Pass the relax option on to the assembler. */ \
"%{mlarge:-ml} " /* Tell the assembler if we are building for the LARGE pointer model. */ \
- "%{!msim:-md} %{msim:%{mlarge:-md}}" /* Copy data from ROM to RAM if necessary. */ \
- "%{ffunction-sections:-gdwarf-sections}" /* If function sections are being created then create DWARF line number sections as well. */
+ "%{!msim:-md} %{msim:%{mlarge:-md}} " /* Copy data from ROM to RAM if necessary. */ \
+ "%{ffunction-sections:-gdwarf-sections} " /* If function sections are being created then create DWARF line number sections as well. */
/* Enable linker section garbage collection by default, unless we
are creating a relocatable binary (gc does not work) or debugging
; halves.
(define_split
[(set (match_operand:SI 0 "msp430_nonsubreg_operand")
- (plus:SI (match_operand:SI 1 "nonimmediate_operand")
- (match_operand:SI 2 "general_operand")))
+ (plus:SI (match_operand:SI 1 "msp430_nonsubreg_operand")
+ (match_operand:SI 2 "msp430_nonsubreg_or_imm_operand")))
]
""
[(parallel [(set (match_operand:HI 3 "nonimmediate_operand" "=&rm")
; when the PSI value is negative..
;
; Note: using PUSHM.A #1 is two bytes smaller than using PUSHX.A....
+;
+; Note: We use a + constraint on operand 0 as otherwise GCC gets confused
+; about extending a single PSI mode register into a pair of SImode registers
+; with the same starting register. It thinks that the upper register of
+; the pair is unused and so it can clobber it. Try compiling 20050826-2.c
+; at -O2 to see this.
(define_insn "zero_extendpsisi2"
- [(set (match_operand:SI 0 "register_operand" "=r")
+ [(set (match_operand:SI 0 "register_operand" "+r")
(zero_extend:SI (match_operand:PSI 1 "register_operand" "r")))]
""
"*
""
"*
if (REGNO (operands[0]) != REGNO (operands[1]))
- return \"MOV.W\t%1, %0 { SUB.W\t#0, %0 { AND.W\t%2, %0\";
+ return \"MOV.W\t%1, %0 { INV.W\t%0 { INC.W\t%0 { AND.W\t%2, %0\";
else
- return \"SUB.W\t#0, %0 { AND.W\t%2, %0\";
+ return \"INV.W\t%0 { INC.W\t%0 { AND.W\t%2, %0\";
"
)
[(set (match_operand:SI 0 "register_operand" "=r")
(mult:SI (sign_extend:SI (match_operand:HI 1 "register_operand" "%0"))
(sign_extend:SI (match_operand:HI 2 "register_operand" "r"))))]
- "optimize > 2 && msp430_hwmult_enabled ()"
+ "optimize > 2 && msp430_hwmult_type != NONE"
"*
- if (msp430_is_f5_mcu ())
- return \"MOV.W %1, &0x04C2 { MOV.W %2, &0x04C8 { MOV.W &0x04CA, %L0 { MOV.W &0x04CC, %H0\";
+ if (msp430_use_f5_series_hwmult ())
+ return \"PUSH.W sr { DINT { NOP { MOV.W %1, &0x04C2 { MOV.W %2, &0x04C8 { MOV.W &0x04CA, %L0 { MOV.W &0x04CC, %H0 { POP.W sr\";
else
- return \"MOV.W %1, &0x0132 { MOV.W %2, &0x0138 { MOV.W &0x013A, %L0 { MOV.W &0x013C, %H0\";
+ return \"PUSH.W sr { DINT { NOP { MOV.W %1, &0x0132 { MOV.W %2, &0x0138 { MOV.W &0x013A, %L0 { MOV.W &0x013C, %H0 { POP.W sr\";
"
)
[(set (match_operand:SI 0 "register_operand" "=r")
(mult:SI (zero_extend:SI (match_operand:HI 1 "register_operand" "%0"))
(zero_extend:SI (match_operand:HI 2 "register_operand" "r"))))]
- "optimize > 2 && msp430_hwmult_enabled ()"
+ "optimize > 2 && msp430_hwmult_type != NONE"
"*
- if (msp430_is_f5_mcu ())
- return \"MOV.W %1, &0x04C0 { MOV.W %2, &0x04C8 { MOV.W &0x04CA, %L0 { MOV.W &0x04CC, %H0\";
+ if (msp430_use_f5_series_hwmult ())
+ return \"PUSH.W sr { DINT { NOP { MOV.W %1, &0x04C0 { MOV.W %2, &0x04C8 { MOV.W &0x04CA, %L0 { MOV.W &0x04CC, %H0 { POP.W sr\";
else
- return \"MOV.W %1, &0x0130 { MOV.W %2, &0x0138 { MOV.W &0x013A, %L0 { MOV.W &0x013C, %H0\";
+ return \"PUSH.W sr { DINT { NOP { MOV.W %1, &0x0130 { MOV.W %2, &0x0138 { MOV.W &0x013A, %L0 { MOV.W &0x013C, %H0 { POP.W sr\";
"
)
[(set (match_operand:DI 0 "register_operand" "=r")
(mult:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "%0"))
(sign_extend:DI (match_operand:SI 2 "register_operand" "r"))))]
- "optimize > 2 && msp430_hwmult_enabled ()"
+ "optimize > 2 && msp430_hwmult_type != NONE"
"*
- if (msp430_is_f5_mcu ())
- return \"MOV.W %L1, &0x04D4 { MOV.W %H1, &0x04D6 { MOV.W %L2, &0x04E0 { MOV.W %H2, &0x04E2 { MOV.W &0x04E4, %A0 { MOV.W &0x04E6, %B0 { MOV.W &0x04E8, %C0 { MOV.W &0x04EA, %D0\";
+ if (msp430_use_f5_series_hwmult ())
+ return \"PUSH.W sr { DINT { NOP { MOV.W %L1, &0x04D4 { MOV.W %H1, &0x04D6 { MOV.W %L2, &0x04E0 { MOV.W %H2, &0x04E2 { MOV.W &0x04E4, %A0 { MOV.W &0x04E6, %B0 { MOV.W &0x04E8, %C0 { MOV.W &0x04EA, %D0 { POP.W sr\";
else
- return \"MOV.W %L1, &0x0144 { MOV.W %H1, &0x0146 { MOV.W %L2, &0x0150 { MOV.W %H2, &0x0152 { MOV.W &0x0154, %A0 { MOV.W &0x0156, %B0 { MOV.W &0x0158, %C0 { MOV.W &0x015A, %D0\";
+ return \"PUSH.W sr { DINT { NOP { MOV.W %L1, &0x0144 { MOV.W %H1, &0x0146 { MOV.W %L2, &0x0150 { MOV.W %H2, &0x0152 { MOV.W &0x0154, %A0 { MOV.W &0x0156, %B0 { MOV.W &0x0158, %C0 { MOV.W &0x015A, %D0 { POP.W sr\";
"
)
[(set (match_operand:DI 0 "register_operand" "=r")
(mult:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "%0"))
(zero_extend:DI (match_operand:SI 2 "register_operand" "r"))))]
- "optimize > 2 && msp430_hwmult_enabled ()"
+ "optimize > 2 && msp430_hwmult_type != NONE"
"*
- if (msp430_is_f5_mcu ())
- return \"MOV.W %L1, &0x04D0 { MOV.W %H1, &0x04D2 { MOV.W %L2, &0x04E0 { MOV.W %H2, &0x04E2 { MOV.W &0x04E4, %A0 { MOV.W &0x04E6, %B0 { MOV.W &0x04E8, %C0 { MOV.W &0x04EA, %D0\";
+ if (msp430_use_f5_series_hwmult ())
+ return \"PUSH.W sr { DINT { NOP { MOV.W %L1, &0x04D0 { MOV.W %H1, &0x04D2 { MOV.W %L2, &0x04E0 { MOV.W %H2, &0x04E2 { MOV.W &0x04E4, %A0 { MOV.W &0x04E6, %B0 { MOV.W &0x04E8, %C0 { MOV.W &0x04EA, %D0 { POP.W sr\";
else
- return \"MOV.W %L1, &0x0140 { MOV.W %H1, &0x0141 { MOV.W %L2, &0x0150 { MOV.W %H2, &0x0152 { MOV.W &0x0154, %A0 { MOV.W &0x0156, %B0 { MOV.W &0x0158, %C0 { MOV.W &0x015A, %D0\";
+ return \"PUSH.W sr { DINT { NOP { MOV.W %L1, &0x0140 { MOV.W %H1, &0x0142 { MOV.W %L2, &0x0150 { MOV.W %H2, &0x0152 { MOV.W &0x0154, %A0 { MOV.W &0x0156, %B0 { MOV.W &0x0158, %C0 { MOV.W &0x015A, %D0 { POP.W sr\";
"
)
Force assembly output to always use hex constants
mmcu=
-Target ToLower Joined RejectNegative Var(target_mcu)
+Target Report ToLower Joined RejectNegative Var(target_mcu)
Specify the MCU to build for.
mcpu=
-Target Joined RejectNegative Var(target_cpu)
+Target Report Joined RejectNegative Var(target_cpu)
Specify the ISA to build for: msp430, mdsp430x, msp430xv2
mlarge
-Target Mask(LARGE) RejectNegative
+Target Report Mask(LARGE) RejectNegative
Select large model - 20-bit addresses/pointers
msmall
-Target InverseMask(LARGE) RejectNegative
+Target Report InverseMask(LARGE) RejectNegative
Select small model - 16-bit addresses/pointers (default)
mrelax
Target Report Mask(MINRT) RejectNegative
Use a minimum runtime (no static initializers or ctors) for memory-constrained devices.
-mhwmult
-Target Report Var(ENABLE_HWMULT, 1) Init(1)
-Enable hardware multiply (except in interrupt routines)
+HeaderInclude
+config/msp430/msp430-opts.h
+
+mhwmult=
+Target Joined RejectNegative Report ToLower Var(msp430_hwmult_type) Enum(msp430_hwmult_types) Init(AUTO)
+Specify the type of hardware multiply to support
+
+Enum
+Name(msp430_hwmult_types) Type(enum msp430_hwmult_types)
+
+EnumValue
+Enum(msp430_hwmult_types) String(none) Value(NONE)
+
+EnumValue
+Enum(msp430_hwmult_types) String(auto) Value(AUTO)
+
+EnumValue
+Enum(msp430_hwmult_types) String(16bit) Value(SMALL)
+
+EnumValue
+Enum(msp430_hwmult_types) String(32bit) Value(LARGE)
+
+EnumValue
+Enum(msp430_hwmult_types) String(f5series) Value(F5SERIES)
(define_predicate "msp430_nonsubreg_operand"
(match_code "reg,mem"))
+(define_predicate "msp430_nonsubreg_or_imm_operand"
+ (ior (match_operand 0 "msp430_nonsubreg_operand")
+ (match_operand 0 "immediate_operand")))
+
; TRUE for constants which are bit positions for zero_extract
(define_predicate "msp430_bitpos"
(and (match_code "const_int")
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3. If not see
+Under Section 7 of GPL version 3, you are granted additional
+permissions described in the GCC Runtime Library Exception, version
+3.1, as published by the Free Software Foundation.
+
+You should have received a copy of the GNU General Public License and
+a copy of the GCC Runtime Library Exception along with this program;
+see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
/* newlib uses 32-bit long in certain cases for all non-SPU
UNSPEC_VSUBEUQM
UNSPEC_VSUBECUQ
UNSPEC_VBPERMQ
+ UNSPEC_BCDADD
+ UNSPEC_BCDSUB
+ UNSPEC_BCD_OVERFLOW
])
(define_c_enum "unspecv"
"vbpermq %0,%1,%2"
[(set_attr "length" "4")
(set_attr "type" "vecsimple")])
+
+;; Decimal Integer operations
+(define_int_iterator UNSPEC_BCD_ADD_SUB [UNSPEC_BCDADD UNSPEC_BCDSUB])
+
+(define_int_attr bcd_add_sub [(UNSPEC_BCDADD "add")
+ (UNSPEC_BCDSUB "sub")])
+
+(define_code_iterator BCD_TEST [eq lt gt unordered])
+
+(define_insn "bcd<bcd_add_sub>"
+ [(set (match_operand:V1TI 0 "register_operand" "")
+ (unspec:V1TI [(match_operand:V1TI 1 "register_operand" "")
+ (match_operand:V1TI 2 "register_operand" "")
+ (match_operand:QI 3 "const_0_to_1_operand" "")]
+ UNSPEC_BCD_ADD_SUB))
+ (clobber (reg:CCFP 74))]
+ "TARGET_P8_VECTOR"
+ "bcd<bcd_add_sub>. %0,%1,%2,%3"
+ [(set_attr "length" "4")
+ (set_attr "type" "vecsimple")])
+
+;; Use a floating point type (V2DFmode) for the compare to set CR6 so that we
+;; can use the unordered test for BCD nans and add/subtracts that overflow. An
+;; UNORDERED test on an integer type (like V1TImode) is not defined. The type
+;; probably should be one that can go in the VMX (Altivec) registers, so we
+;; can't use DDmode or DFmode.
+(define_insn "*bcd<bcd_add_sub>_test"
+ [(set (reg:CCFP 74)
+ (compare:CCFP
+ (unspec:V2DF [(match_operand:V1TI 1 "register_operand" "v")
+ (match_operand:V1TI 2 "register_operand" "v")
+ (match_operand:QI 3 "const_0_to_1_operand" "i")]
+ UNSPEC_BCD_ADD_SUB)
+ (match_operand:V2DF 4 "zero_constant" "j")))
+ (clobber (match_scratch:V1TI 0 "=v"))]
+ "TARGET_P8_VECTOR"
+ "bcd<bcd_add_sub>. %0,%1,%2,%3"
+ [(set_attr "length" "4")
+ (set_attr "type" "vecsimple")])
+
+(define_insn "*bcd<bcd_add_sub>_test2"
+ [(set (match_operand:V1TI 0 "register_operand" "=v")
+ (unspec:V1TI [(match_operand:V1TI 1 "register_operand" "v")
+ (match_operand:V1TI 2 "register_operand" "v")
+ (match_operand:QI 3 "const_0_to_1_operand" "i")]
+ UNSPEC_BCD_ADD_SUB))
+ (set (reg:CCFP 74)
+ (compare:CCFP
+ (unspec:V2DF [(match_dup 1)
+ (match_dup 2)
+ (match_dup 3)]
+ UNSPEC_BCD_ADD_SUB)
+ (match_operand:V2DF 4 "zero_constant" "j")))]
+ "TARGET_P8_VECTOR"
+ "bcd<bcd_add_sub>. %0,%1,%2,%3"
+ [(set_attr "length" "4")
+ (set_attr "type" "vecsimple")])
+
+(define_expand "bcd<bcd_add_sub>_<code>"
+ [(parallel [(set (reg:CCFP 74)
+ (compare:CCFP
+ (unspec:V2DF [(match_operand:V1TI 1 "register_operand" "")
+ (match_operand:V1TI 2 "register_operand" "")
+ (match_operand:QI 3 "const_0_to_1_operand" "")]
+ UNSPEC_BCD_ADD_SUB)
+ (match_dup 4)))
+ (clobber (match_scratch:V1TI 5 ""))])
+ (set (match_operand:SI 0 "register_operand" "")
+ (BCD_TEST:SI (reg:CCFP 74)
+ (const_int 0)))]
+ "TARGET_P8_VECTOR"
+{
+ operands[4] = CONST0_RTX (V2DFmode);
+})
+
+;; Peephole2 pattern to combine a bcdadd/bcdsub that calculates the value and
+;; the bcdadd/bcdsub that tests the value. The combiner won't work since
+;; CR6 is a hard coded register. Unfortunately, all of the Altivec predicate
+;; support is hard coded to use the fixed register CR6 instead of creating
+;; a register class for CR6.
+
+(define_peephole2
+ [(parallel [(set (match_operand:V1TI 0 "register_operand" "")
+ (unspec:V1TI [(match_operand:V1TI 1 "register_operand" "")
+ (match_operand:V1TI 2 "register_operand" "")
+ (match_operand:QI 3 "const_0_to_1_operand" "")]
+ UNSPEC_BCD_ADD_SUB))
+ (clobber (reg:CCFP 74))])
+ (parallel [(set (reg:CCFP 74)
+ (compare:CCFP
+ (unspec:V2DF [(match_dup 1)
+ (match_dup 2)
+ (match_dup 3)]
+ UNSPEC_BCD_ADD_SUB)
+ (match_operand:V2DF 4 "zero_constant" "")))
+ (clobber (match_operand:V1TI 5 "register_operand" ""))])]
+ "TARGET_P8_VECTOR"
+ [(parallel [(set (match_dup 0)
+ (unspec:V1TI [(match_dup 1)
+ (match_dup 2)
+ (match_dup 3)]
+ UNSPEC_BCD_ADD_SUB))
+ (set (reg:CCFP 74)
+ (compare:CCFP
+ (unspec:V2DF [(match_dup 1)
+ (match_dup 2)
+ (match_dup 3)]
+ UNSPEC_BCD_ADD_SUB)
+ (match_dup 4)))])])
"TARGET_DFP"
"dctfixq %0,%1"
[(set_attr "type" "fp")])
+
+\f
+;; Decimal builtin support
+
+(define_c_enum "unspec"
+ [UNSPEC_DDEDPD
+ UNSPEC_DENBCD
+ UNSPEC_DXEX
+ UNSPEC_DIEX
+ UNSPEC_DSCLI
+ UNSPEC_DSCRI])
+
+(define_mode_iterator D64_D128 [DD TD])
+
+(define_mode_attr dfp_suffix [(DD "")
+ (TD "q")])
+
+(define_insn "dfp_ddedpd_<mode>"
+ [(set (match_operand:D64_D128 0 "gpc_reg_operand" "=d")
+ (unspec:D64_D128 [(match_operand:QI 1 "const_0_to_3_operand" "i")
+ (match_operand:D64_D128 2 "gpc_reg_operand" "d")]
+ UNSPEC_DDEDPD))]
+ "TARGET_DFP"
+ "ddedpd<dfp_suffix> %1,%0,%2"
+ [(set_attr "type" "fp")])
+
+(define_insn "dfp_denbcd_<mode>"
+ [(set (match_operand:D64_D128 0 "gpc_reg_operand" "=d")
+ (unspec:D64_D128 [(match_operand:QI 1 "const_0_to_1_operand" "i")
+ (match_operand:D64_D128 2 "gpc_reg_operand" "d")]
+ UNSPEC_DENBCD))]
+ "TARGET_DFP"
+ "denbcd<dfp_suffix> %1,%0,%2"
+ [(set_attr "type" "fp")])
+
+(define_insn "dfp_dxex_<mode>"
+ [(set (match_operand:D64_D128 0 "gpc_reg_operand" "=d")
+ (unspec:D64_D128 [(match_operand:D64_D128 1 "gpc_reg_operand" "d")]
+ UNSPEC_DXEX))]
+ "TARGET_DFP"
+ "dxex<dfp_suffix> %0,%1"
+ [(set_attr "type" "fp")])
+
+(define_insn "dfp_diex_<mode>"
+ [(set (match_operand:D64_D128 0 "gpc_reg_operand" "=d")
+ (unspec:D64_D128 [(match_operand:D64_D128 1 "gpc_reg_operand" "d")
+ (match_operand:D64_D128 2 "gpc_reg_operand" "d")]
+ UNSPEC_DXEX))]
+ "TARGET_DFP"
+ "diex<dfp_suffix> %0,%1,%2"
+ [(set_attr "type" "fp")])
+
+(define_insn "dfp_dscli_<mode>"
+ [(set (match_operand:D64_D128 0 "gpc_reg_operand" "=d")
+ (unspec:D64_D128 [(match_operand:D64_D128 1 "gpc_reg_operand" "d")
+ (match_operand:QI 2 "immediate_operand" "i")]
+ UNSPEC_DSCLI))]
+ "TARGET_DFP"
+ "dscli<dfp_suffix> %0,%1,%2"
+ [(set_attr "type" "fp")])
+
+(define_insn "dfp_dscri_<mode>"
+ [(set (match_operand:D64_D128 0 "gpc_reg_operand" "=d")
+ (unspec:D64_D128 [(match_operand:D64_D128 1 "gpc_reg_operand" "d")
+ (match_operand:QI 2 "immediate_operand" "i")]
+ UNSPEC_DSCRI))]
+ "TARGET_DFP"
+ "dscri<dfp_suffix> %0,%1,%2"
+ [(set_attr "type" "fp")])
(const_int 0)]
UNSPECV_HTM_TABORTWCI))
(set (subreg:CC (match_dup 2) 0) (match_dup 1))
- (set (match_dup 3) (lshiftrt:SI (match_dup 2) (const_int 24)))
+ (set (match_dup 3) (lshiftrt:SI (match_dup 2) (const_int 28)))
(parallel [(set (match_operand:SI 0 "int_reg_operand" "")
(and:SI (match_dup 3) (const_int 15)))
(clobber (scratch:CC))])]
typedef char TM_buff_type[16];
+/* Compatibility macro with s390. This macro can be used to determine
+ whether a transaction was successfully started from the __TM_begin()
+ and __TM_simple_begin() intrinsic functions below. */
+#define _HTM_TBEGIN_STARTED 1
+
extern __inline long
__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
__TM_simple_begin (void)
{
if (__builtin_expect (__builtin_tbegin (0), 1))
- return 1;
+ return _HTM_TBEGIN_STARTED;
return 0;
}
{
*_TEXASRL_PTR (TM_buff) = 0;
if (__builtin_expect (__builtin_tbegin (0), 1))
- return 1;
+ return _HTM_TBEGIN_STARTED;
#ifdef __powerpc64__
*_TEXASR_PTR (TM_buff) = __builtin_get_texasr ();
#else
(and (match_code "const_int")
(match_test "IN_RANGE (INTVAL (op), 0, 1)")))
+;; Match op = 0..3.
+(define_predicate "const_0_to_3_operand"
+ (and (match_code "const_int")
+ (match_test "IN_RANGE (INTVAL (op), 0, 3)")))
+
;; Match op = 2 or op = 3.
(define_predicate "const_2_to_3_operand"
(and (match_code "const_int")
(match_test "offsettable_nonstrict_memref_p (op)")))
;; Return 1 if the operand is suitable for load/store quad memory.
-;; This predicate only checks for non-atomic loads/stores.
+;; This predicate only checks for non-atomic loads/stores (not lqarx/stqcx).
(define_predicate "quad_memory_operand"
(match_code "mem")
{
rtx addr, op0, op1;
int ret;
- if (!TARGET_QUAD_MEMORY)
+ if (!TARGET_QUAD_MEMORY && !TARGET_SYNC_TI)
ret = 0;
else if (!memory_operand (op, mode))
MASK, /* MASK */ \
(ATTR | RS6000_BTC_SPECIAL), /* ATTR */ \
CODE_FOR_nothing) /* ICODE */
+
+
+/* Decimal floating point builtins for instructions. */
+#define BU_DFP_MISC_1(ENUM, NAME, ATTR, ICODE) \
+ RS6000_BUILTIN_1 (MISC_BUILTIN_ ## ENUM, /* ENUM */ \
+ "__builtin_" NAME, /* NAME */ \
+ RS6000_BTM_DFP, /* MASK */ \
+ (RS6000_BTC_ ## ATTR /* ATTR */ \
+ | RS6000_BTC_UNARY), \
+ CODE_FOR_ ## ICODE) /* ICODE */
+
+#define BU_DFP_MISC_2(ENUM, NAME, ATTR, ICODE) \
+ RS6000_BUILTIN_2 (MISC_BUILTIN_ ## ENUM, /* ENUM */ \
+ "__builtin_" NAME, /* NAME */ \
+ RS6000_BTM_DFP, /* MASK */ \
+ (RS6000_BTC_ ## ATTR /* ATTR */ \
+ | RS6000_BTC_BINARY), \
+ CODE_FOR_ ## ICODE) /* ICODE */
+
+
+/* Miscellaneous builtins for instructions added in ISA 2.06. These
+ instructions don't require either the DFP or VSX options, just the basic ISA
+ 2.06 (popcntd) enablement since they operate on general purpose
+ registers. */
+#define BU_P7_MISC_1(ENUM, NAME, ATTR, ICODE) \
+ RS6000_BUILTIN_1 (MISC_BUILTIN_ ## ENUM, /* ENUM */ \
+ "__builtin_" NAME, /* NAME */ \
+ RS6000_BTM_POPCNTD, /* MASK */ \
+ (RS6000_BTC_ ## ATTR /* ATTR */ \
+ | RS6000_BTC_UNARY), \
+ CODE_FOR_ ## ICODE) /* ICODE */
+
+#define BU_P7_MISC_2(ENUM, NAME, ATTR, ICODE) \
+ RS6000_BUILTIN_2 (MISC_BUILTIN_ ## ENUM, /* ENUM */ \
+ "__builtin_" NAME, /* NAME */ \
+ RS6000_BTM_POPCNTD, /* MASK */ \
+ (RS6000_BTC_ ## ATTR /* ATTR */ \
+ | RS6000_BTC_BINARY), \
+ CODE_FOR_ ## ICODE) /* ICODE */
+
+
+/* Miscellaneous builtins for instructions added in ISA 2.07. These
+ instructions do require the ISA 2.07 vector support, but they aren't vector
+ instructions. */
+#define BU_P8V_MISC_3(ENUM, NAME, ATTR, ICODE) \
+ RS6000_BUILTIN_3 (MISC_BUILTIN_ ## ENUM, /* ENUM */ \
+ "__builtin_" NAME, /* NAME */ \
+ RS6000_BTM_P8_VECTOR, /* MASK */ \
+ (RS6000_BTC_ ## ATTR /* ATTR */ \
+ | RS6000_BTC_TERNARY), \
+ CODE_FOR_ ## ICODE) /* ICODE */
+
+/* 128-bit long double floating point builtins. */
+#define BU_LDBL128_2(ENUM, NAME, ATTR, ICODE) \
+ RS6000_BUILTIN_2 (MISC_BUILTIN_ ## ENUM, /* ENUM */ \
+ "__builtin_" NAME, /* NAME */ \
+ (RS6000_BTM_HARD_FLOAT /* MASK */ \
+ | RS6000_BTM_LDBL128), \
+ (RS6000_BTC_ ## ATTR /* ATTR */ \
+ | RS6000_BTC_BINARY), \
+ CODE_FOR_ ## ICODE) /* ICODE */
+
#endif
/* Insure 0 is not a legitimate index. */
BU_P8V_AV_2 (ORC_V2DF, "orc_v2df", CONST, orcv2df3)
/* 3 argument altivec instructions added in ISA 2.07. */
-BU_P8V_AV_3 (VADDEUQM, "vaddeuqm", CONST, altivec_vaddeuqm)
-BU_P8V_AV_3 (VADDECUQ, "vaddecuq", CONST, altivec_vaddecuq)
-BU_P8V_AV_3 (VSUBEUQM, "vsubeuqm", CONST, altivec_vsubeuqm)
-BU_P8V_AV_3 (VSUBECUQ, "vsubecuq", CONST, altivec_vsubecuq)
+BU_P8V_AV_3 (VADDEUQM, "vaddeuqm", CONST, altivec_vaddeuqm)
+BU_P8V_AV_3 (VADDECUQ, "vaddecuq", CONST, altivec_vaddecuq)
+BU_P8V_AV_3 (VSUBEUQM, "vsubeuqm", CONST, altivec_vsubeuqm)
+BU_P8V_AV_3 (VSUBECUQ, "vsubecuq", CONST, altivec_vsubecuq)
/* Vector comparison instructions added in ISA 2.07. */
BU_P8V_AV_2 (VCMPEQUD, "vcmpequd", CONST, vector_eqv2di)
BU_P8V_OVERLOAD_3 (VSUBEUQM, "vsubeuqm")
\f
+/* 2 argument extended divide functions added in ISA 2.06. */
+BU_P7_MISC_2 (DIVWE, "divwe", CONST, dive_si)
+BU_P7_MISC_2 (DIVWEO, "divweo", CONST, diveo_si)
+BU_P7_MISC_2 (DIVWEU, "divweu", CONST, diveu_si)
+BU_P7_MISC_2 (DIVWEUO, "divweuo", CONST, diveuo_si)
+BU_P7_MISC_2 (DIVDE, "divde", CONST, dive_di)
+BU_P7_MISC_2 (DIVDEO, "divdeo", CONST, diveo_di)
+BU_P7_MISC_2 (DIVDEU, "divdeu", CONST, diveu_di)
+BU_P7_MISC_2 (DIVDEUO, "divdeuo", CONST, diveuo_di)
+
+/* 1 argument DFP (decimal floating point) functions added in ISA 2.05. */
+BU_DFP_MISC_1 (DXEX, "dxex", CONST, dfp_dxex_dd)
+BU_DFP_MISC_1 (DXEXQ, "dxexq", CONST, dfp_dxex_td)
+
+/* 2 argument DFP (decimal floating point) functions added in ISA 2.05. */
+BU_DFP_MISC_2 (DDEDPD, "ddedpd", CONST, dfp_ddedpd_dd)
+BU_DFP_MISC_2 (DDEDPDQ, "ddedpdq", CONST, dfp_ddedpd_td)
+BU_DFP_MISC_2 (DENBCD, "denbcd", CONST, dfp_denbcd_dd)
+BU_DFP_MISC_2 (DENBCDQ, "denbcdq", CONST, dfp_denbcd_td)
+BU_DFP_MISC_2 (DIEX, "diex", CONST, dfp_diex_dd)
+BU_DFP_MISC_2 (DIEXQ, "diexq", CONST, dfp_diex_td)
+BU_DFP_MISC_2 (DSCLI, "dscli", CONST, dfp_dscli_dd)
+BU_DFP_MISC_2 (DSCLIQ, "dscliq", CONST, dfp_dscli_td)
+BU_DFP_MISC_2 (DSCRI, "dscri", CONST, dfp_dscri_dd)
+BU_DFP_MISC_2 (DSCRIQ, "dscriq", CONST, dfp_dscri_td)
+
+/* 1 argument BCD functions added in ISA 2.06. */
+BU_P7_MISC_1 (CDTBCD, "cdtbcd", CONST, cdtbcd)
+BU_P7_MISC_1 (CBCDTD, "cbcdtd", CONST, cbcdtd)
+
+/* 2 argument BCD functions added in ISA 2.06. */
+BU_P7_MISC_2 (ADDG6S, "addg6s", CONST, addg6s)
+
+/* 3 argument BCD functions added in ISA 2.07. */
+BU_P8V_MISC_3 (BCDADD, "bcdadd", CONST, bcdadd)
+BU_P8V_MISC_3 (BCDADD_LT, "bcdadd_lt", CONST, bcdadd_lt)
+BU_P8V_MISC_3 (BCDADD_EQ, "bcdadd_eq", CONST, bcdadd_eq)
+BU_P8V_MISC_3 (BCDADD_GT, "bcdadd_gt", CONST, bcdadd_gt)
+BU_P8V_MISC_3 (BCDADD_OV, "bcdadd_ov", CONST, bcdadd_unordered)
+BU_P8V_MISC_3 (BCDSUB, "bcdsub", CONST, bcdsub)
+BU_P8V_MISC_3 (BCDSUB_LT, "bcdsub_lt", CONST, bcdsub_lt)
+BU_P8V_MISC_3 (BCDSUB_EQ, "bcdsub_eq", CONST, bcdsub_eq)
+BU_P8V_MISC_3 (BCDSUB_GT, "bcdsub_gt", CONST, bcdsub_gt)
+BU_P8V_MISC_3 (BCDSUB_OV, "bcdsub_ov", CONST, bcdsub_unordered)
+
+/* 2 argument pack/unpack 128-bit floating point types. */
+BU_DFP_MISC_2 (PACK_TD, "pack_dec128", CONST, packtd)
+BU_DFP_MISC_2 (UNPACK_TD, "unpack_dec128", CONST, unpacktd)
+
+BU_LDBL128_2 (PACK_TF, "pack_longdouble", CONST, packtf)
+BU_LDBL128_2 (UNPACK_TF, "unpack_longdouble", CONST, unpacktf)
+
+BU_P7_MISC_2 (PACK_V1TI, "pack_vector_int128", CONST, packv1ti)
+BU_P7_MISC_2 (UNPACK_V1TI, "unpack_vector_int128", CONST, unpackv1ti)
+
+\f
/* 1 argument crypto functions. */
BU_CRYPTO_1 (VSBOX, "vsbox", CONST, crypto_vsbox)
extern rtx rs6000_libcall_value (enum machine_mode);
extern rtx rs6000_va_arg (tree, tree);
extern int function_ok_for_sibcall (tree);
-extern int rs6000_reg_parm_stack_space (tree);
+extern int rs6000_reg_parm_stack_space (tree, bool);
extern void rs6000_elf_declare_function_name (FILE *, const char *, tree);
extern bool rs6000_elf_in_small_data_p (const_tree);
#ifdef ARGS_SIZE_RTX
if (rs6000_float_gprs)
fprintf (stderr, DEBUG_FMT_S, "float_gprs", "true");
+ fprintf (stderr, DEBUG_FMT_S, "fprs",
+ (TARGET_FPRS ? "true" : "false"));
+
+ fprintf (stderr, DEBUG_FMT_S, "single_float",
+ (TARGET_SINGLE_FLOAT ? "true" : "false"));
+
+ fprintf (stderr, DEBUG_FMT_S, "double_float",
+ (TARGET_DOUBLE_FLOAT ? "true" : "false"));
+
+ fprintf (stderr, DEBUG_FMT_S, "soft_float",
+ (TARGET_SOFT_FLOAT ? "true" : "false"));
+
+ fprintf (stderr, DEBUG_FMT_S, "e500_single",
+ (TARGET_E500_SINGLE ? "true" : "false"));
+
+ fprintf (stderr, DEBUG_FMT_S, "e500_double",
+ (TARGET_E500_DOUBLE ? "true" : "false"));
+
if (TARGET_LINK_STACK)
fprintf (stderr, DEBUG_FMT_S, "link_stack", "true");
| ((rs6000_cpu == PROCESSOR_CELL) ? RS6000_BTM_CELL : 0)
| ((TARGET_P8_VECTOR) ? RS6000_BTM_P8_VECTOR : 0)
| ((TARGET_CRYPTO) ? RS6000_BTM_CRYPTO : 0)
- | ((TARGET_HTM) ? RS6000_BTM_HTM : 0));
+ | ((TARGET_HTM) ? RS6000_BTM_HTM : 0)
+ | ((TARGET_DFP) ? RS6000_BTM_DFP : 0)
+ | ((TARGET_HARD_FLOAT) ? RS6000_BTM_HARD_FLOAT : 0)
+ | ((TARGET_LONG_DOUBLE_128) ? RS6000_BTM_LDBL128 : 0));
}
/* Override command line options. Mostly we process the processor type and
rs6000_isa_flags &= ~OPTION_MASK_VSX_TIMODE;
}
+ if (TARGET_DFP && !TARGET_HARD_FLOAT)
+ {
+ if (rs6000_isa_flags_explicit & OPTION_MASK_DFP)
+ error ("-mhard-dfp requires -mhard-float");
+ rs6000_isa_flags &= ~OPTION_MASK_DFP;
+ }
+
/* The quad memory instructions only works in 64-bit mode. In 32-bit mode,
silently turn off quad memory mode. */
if ((TARGET_QUAD_MEMORY || TARGET_QUAD_MEMORY_ATOMIC) && !TARGET_POWERPC64)
return false;
extra = GET_MODE_SIZE (mode) - UNITS_PER_WORD;
- gcc_assert (extra >= 0);
+ if (extra < 0)
+ extra = 0;
if (GET_CODE (addr) == LO_SUM)
/* For lo_sum addresses, we must allow any offset except one that
list, or passes any parameter in memory. */
static bool
-rs6000_function_parms_need_stack (tree fun)
+rs6000_function_parms_need_stack (tree fun, bool incoming)
{
- function_args_iterator args_iter;
- tree arg_type;
+ tree fntype, result;
CUMULATIVE_ARGS args_so_far_v;
cumulative_args_t args_so_far;
if (!fun)
/* Must be a libcall, all of which only use reg parms. */
return false;
+
+ fntype = fun;
if (!TYPE_P (fun))
- fun = TREE_TYPE (fun);
+ fntype = TREE_TYPE (fun);
/* Varargs functions need the parameter save area. */
- if (!prototype_p (fun) || stdarg_p (fun))
+ if ((!incoming && !prototype_p (fntype)) || stdarg_p (fntype))
return true;
- INIT_CUMULATIVE_INCOMING_ARGS (args_so_far_v, fun, NULL_RTX);
+ INIT_CUMULATIVE_INCOMING_ARGS (args_so_far_v, fntype, NULL_RTX);
args_so_far = pack_cumulative_args (&args_so_far_v);
- if (aggregate_value_p (TREE_TYPE (fun), fun))
+ /* When incoming, we will have been passed the function decl.
+ It is necessary to use the decl to handle K&R style functions,
+ where TYPE_ARG_TYPES may not be available. */
+ if (incoming)
{
- tree type = build_pointer_type (TREE_TYPE (fun));
- rs6000_parm_needs_stack (args_so_far, type);
+ gcc_assert (DECL_P (fun));
+ result = DECL_RESULT (fun);
}
+ else
+ result = TREE_TYPE (fntype);
- FOREACH_FUNCTION_ARGS (fun, arg_type, args_iter)
- if (rs6000_parm_needs_stack (args_so_far, arg_type))
- return true;
+ if (result && aggregate_value_p (result, fntype))
+ {
+ if (!TYPE_P (result))
+ result = TREE_TYPE (result);
+ result = build_pointer_type (result);
+ rs6000_parm_needs_stack (args_so_far, result);
+ }
+
+ if (incoming)
+ {
+ tree parm;
+
+ for (parm = DECL_ARGUMENTS (fun);
+ parm && parm != void_list_node;
+ parm = TREE_CHAIN (parm))
+ if (rs6000_parm_needs_stack (args_so_far, TREE_TYPE (parm)))
+ return true;
+ }
+ else
+ {
+ function_args_iterator args_iter;
+ tree arg_type;
+
+ FOREACH_FUNCTION_ARGS (fntype, arg_type, args_iter)
+ if (rs6000_parm_needs_stack (args_so_far, arg_type))
+ return true;
+ }
return false;
}
all parameters in registers. */
int
-rs6000_reg_parm_stack_space (tree fun)
+rs6000_reg_parm_stack_space (tree fun, bool incoming)
{
int reg_parm_stack_space;
case ABI_ELFv2:
/* ??? Recomputing this every time is a bit expensive. Is there
a place to cache this information? */
- if (rs6000_function_parms_need_stack (fun))
+ if (rs6000_function_parms_need_stack (fun, incoming))
reg_parm_stack_space = TARGET_64BIT ? 64 : 32;
else
reg_parm_stack_space = 0;
}
}
else if (icode == CODE_FOR_vsx_set_v2df
- || icode == CODE_FOR_vsx_set_v2di)
+ || icode == CODE_FOR_vsx_set_v2di
+ || icode == CODE_FOR_bcdadd
+ || icode == CODE_FOR_bcdadd_lt
+ || icode == CODE_FOR_bcdadd_eq
+ || icode == CODE_FOR_bcdadd_gt
+ || icode == CODE_FOR_bcdsub
+ || icode == CODE_FOR_bcdsub_lt
+ || icode == CODE_FOR_bcdsub_eq
+ || icode == CODE_FOR_bcdsub_gt)
{
/* Only allow 1-bit unsigned literals. */
STRIP_NOPS (arg2);
return const0_rtx;
}
}
+ else if (icode == CODE_FOR_dfp_ddedpd_dd
+ || icode == CODE_FOR_dfp_ddedpd_td)
+ {
+ /* Only allow 2-bit unsigned literals where the value is 0 or 2. */
+ STRIP_NOPS (arg0);
+ if (TREE_CODE (arg0) != INTEGER_CST
+ || TREE_INT_CST_LOW (arg2) & ~0x3)
+ {
+ error ("argument 1 must be 0 or 2");
+ return const0_rtx;
+ }
+ }
+ else if (icode == CODE_FOR_dfp_denbcd_dd
+ || icode == CODE_FOR_dfp_denbcd_td)
+ {
+ /* Only allow 1-bit unsigned literals. */
+ STRIP_NOPS (arg0);
+ if (TREE_CODE (arg0) != INTEGER_CST
+ || TREE_INT_CST_LOW (arg0) & ~0x1)
+ {
+ error ("argument 1 must be a 1-bit unsigned literal");
+ return const0_rtx;
+ }
+ }
+ else if (icode == CODE_FOR_dfp_dscli_dd
+ || icode == CODE_FOR_dfp_dscli_td
+ || icode == CODE_FOR_dfp_dscri_dd
+ || icode == CODE_FOR_dfp_dscri_td)
+ {
+ /* Only allow 6-bit unsigned literals. */
+ STRIP_NOPS (arg1);
+ if (TREE_CODE (arg1) != INTEGER_CST
+ || TREE_INT_CST_LOW (arg1) & ~0x3f)
+ {
+ error ("argument 2 must be a 6-bit unsigned literal");
+ return const0_rtx;
+ }
+ }
else if (icode == CODE_FOR_crypto_vshasigmaw
|| icode == CODE_FOR_crypto_vshasigmad)
{
error ("Builtin function %s requires the -mpaired option", name);
else if ((fnmask & RS6000_BTM_SPE) != 0)
error ("Builtin function %s requires the -mspe option", name);
+ else if ((fnmask & (RS6000_BTM_DFP | RS6000_BTM_P8_VECTOR))
+ == (RS6000_BTM_DFP | RS6000_BTM_P8_VECTOR))
+ error ("Builtin function %s requires the -mhard-dfp and"
+ " -mpower8-vector options", name);
+ else if ((fnmask & RS6000_BTM_DFP) != 0)
+ error ("Builtin function %s requires the -mhard-dfp option", name);
+ else if ((fnmask & RS6000_BTM_P8_VECTOR) != 0)
+ error ("Builtin function %s requires the -mpower8-vector option", name);
+ else if ((fnmask & (RS6000_BTM_HARD_FLOAT | RS6000_BTM_LDBL128))
+ == (RS6000_BTM_HARD_FLOAT | RS6000_BTM_LDBL128))
+ error ("Builtin function %s requires the -mhard-float and"
+ " -mlong-double-128 options", name);
+ else if ((fnmask & RS6000_BTM_HARD_FLOAT) != 0)
+ error ("Builtin function %s requires the -mhard-float option", name);
else
error ("Builtin function %s is not supported with the current options",
name);
return ret;
}
- gcc_assert (TARGET_ALTIVEC || TARGET_VSX || TARGET_SPE || TARGET_PAIRED_FLOAT);
+ unsigned attr = rs6000_builtin_info[uns_fcode].attr & RS6000_BTC_TYPE_MASK;
+ gcc_assert (attr == RS6000_BTC_UNARY
+ || attr == RS6000_BTC_BINARY
+ || attr == RS6000_BTC_TERNARY);
/* Handle simple unary operations. */
d = bdesc_1arg;
uintTI_type_internal_node = unsigned_intTI_type_node;
float_type_internal_node = float_type_node;
double_type_internal_node = double_type_node;
+ long_double_type_internal_node = long_double_type_node;
+ dfloat64_type_internal_node = dfloat64_type_node;
+ dfloat128_type_internal_node = dfloat128_type_node;
void_type_internal_node = void_type_node;
/* Initialize the modes for builtin_function_type, mapping a machine mode to
builtin_mode_to_type[TImode][1] = unsigned_intTI_type_node;
builtin_mode_to_type[SFmode][0] = float_type_node;
builtin_mode_to_type[DFmode][0] = double_type_node;
+ builtin_mode_to_type[TFmode][0] = long_double_type_node;
+ builtin_mode_to_type[DDmode][0] = dfloat64_type_node;
+ builtin_mode_to_type[TDmode][0] = dfloat128_type_node;
builtin_mode_to_type[V1TImode][0] = V1TI_type_node;
builtin_mode_to_type[V1TImode][1] = unsigned_V1TI_type_node;
builtin_mode_to_type[V2SImode][0] = V2SI_type_node;
/* unsigned 1 argument functions. */
case CRYPTO_BUILTIN_VSBOX:
case P8V_BUILTIN_VGBBD:
+ case MISC_BUILTIN_CDTBCD:
+ case MISC_BUILTIN_CBCDTD:
h.uns_p[0] = 1;
h.uns_p[1] = 1;
break;
case CRYPTO_BUILTIN_VPMSUMW:
case CRYPTO_BUILTIN_VPMSUMD:
case CRYPTO_BUILTIN_VPMSUM:
+ case MISC_BUILTIN_ADDG6S:
+ case MISC_BUILTIN_DIVWEU:
+ case MISC_BUILTIN_DIVWEUO:
+ case MISC_BUILTIN_DIVDEU:
+ case MISC_BUILTIN_DIVDEUO:
h.uns_p[0] = 1;
h.uns_p[1] = 1;
h.uns_p[2] = 1;
/* signed args, unsigned return. */
case VSX_BUILTIN_XVCVDPUXDS_UNS:
case ALTIVEC_BUILTIN_FIXUNS_V4SF_V4SI:
+ case MISC_BUILTIN_UNPACK_TD:
+ case MISC_BUILTIN_UNPACK_V1TI:
h.uns_p[0] = 1;
break;
+ /* unsigned arguments for 128-bit pack instructions. */
+ case MISC_BUILTIN_PACK_TD:
+ case MISC_BUILTIN_PACK_V1TI:
+ h.uns_p[1] = 1;
+ h.uns_p[2] = 1;
+ break;
+
default:
break;
}
{ "power8-vector", RS6000_BTM_P8_VECTOR, false, false },
{ "crypto", RS6000_BTM_CRYPTO, false, false },
{ "htm", RS6000_BTM_HTM, false, false },
+ { "hard-dfp", RS6000_BTM_DFP, false, false },
+ { "hard-float", RS6000_BTM_HARD_FLOAT, false, false },
+ { "long-double-128", RS6000_BTM_LDBL128, false, false },
};
/* Option variables that we want to support inside attribute((target)) and
|| TARGET_CMPB /* ISA 2.05 */ \
|| TARGET_POPCNTD /* ISA 2.06 */ \
|| TARGET_ALTIVEC \
- || TARGET_VSX)))
+ || TARGET_VSX \
+ || TARGET_HARD_FLOAT)))
/* E500 cores only support plain "sync", not lwsync. */
#define TARGET_NO_LWSYNC (rs6000_cpu == PROCESSOR_PPC8540 \
/* Define this if stack space is still allocated for a parameter passed
in a register. The value is the number of bytes allocated to this
area. */
-#define REG_PARM_STACK_SPACE(FNDECL) rs6000_reg_parm_stack_space((FNDECL))
+#define REG_PARM_STACK_SPACE(FNDECL) \
+ rs6000_reg_parm_stack_space ((FNDECL), false)
+
+/* Define this macro if space guaranteed when compiling a function body
+ is different to space required when making a call, a situation that
+ can arise with K&R style function definitions. */
+#define INCOMING_REG_PARM_STACK_SPACE(FNDECL) \
+ rs6000_reg_parm_stack_space ((FNDECL), true)
/* Define this if the above stack space is to be considered part of the
space allocated by the caller. */
#define RS6000_BTC_SAT RS6000_BTC_MISC /* saturate sets VSCR. */
/* Builtin targets. For now, we reuse the masks for those options that are in
- target flags, and pick two random bits for SPE and paired which aren't in
- target_flags. */
+ target flags, and pick three random bits for SPE, paired and ldbl128 which
+ aren't in target_flags. */
#define RS6000_BTM_ALWAYS 0 /* Always enabled. */
#define RS6000_BTM_ALTIVEC MASK_ALTIVEC /* VMX/altivec vectors. */
#define RS6000_BTM_VSX MASK_VSX /* VSX (vector/scalar). */
#define RS6000_BTM_FRSQRTES MASK_POPCNTB /* FRSQRTES instruction. */
#define RS6000_BTM_POPCNTD MASK_POPCNTD /* Target supports ISA 2.06. */
#define RS6000_BTM_CELL MASK_FPRND /* Target is cell powerpc. */
+#define RS6000_BTM_DFP MASK_DFP /* Decimal floating point. */
+#define RS6000_BTM_HARD_FLOAT MASK_SOFT_FLOAT /* Hardware floating point. */
+#define RS6000_BTM_LDBL128 MASK_MULTIPLE /* 128-bit long double. */
#define RS6000_BTM_COMMON (RS6000_BTM_ALTIVEC \
| RS6000_BTM_VSX \
| RS6000_BTM_FRSQRTES \
| RS6000_BTM_HTM \
| RS6000_BTM_POPCNTD \
- | RS6000_BTM_CELL)
+ | RS6000_BTM_CELL \
+ | RS6000_BTM_DFP \
+ | RS6000_BTM_HARD_FLOAT \
+ | RS6000_BTM_LDBL128)
/* Define builtin enum index. */
RS6000_BTI_UINTTI, /* unsigned_intTI_type_node */
RS6000_BTI_float, /* float_type_node */
RS6000_BTI_double, /* double_type_node */
+ RS6000_BTI_long_double, /* long_double_type_node */
+ RS6000_BTI_dfloat64, /* dfloat64_type_node */
+ RS6000_BTI_dfloat128, /* dfloat128_type_node */
RS6000_BTI_void, /* void_type_node */
RS6000_BTI_MAX
};
#define uintTI_type_internal_node (rs6000_builtin_types[RS6000_BTI_UINTTI])
#define float_type_internal_node (rs6000_builtin_types[RS6000_BTI_float])
#define double_type_internal_node (rs6000_builtin_types[RS6000_BTI_double])
+#define long_double_type_internal_node (rs6000_builtin_types[RS6000_BTI_long_double])
+#define dfloat64_type_internal_node (rs6000_builtin_types[RS6000_BTI_dfloat64])
+#define dfloat128_type_internal_node (rs6000_builtin_types[RS6000_BTI_dfloat128])
#define void_type_internal_node (rs6000_builtin_types[RS6000_BTI_void])
extern GTY(()) tree rs6000_builtin_types[RS6000_BTI_MAX];
UNSPEC_P8V_MTVSRD
UNSPEC_P8V_XXPERMDI
UNSPEC_P8V_RELOAD_FROM_VSX
+ UNSPEC_ADDG6S
+ UNSPEC_CDTBCD
+ UNSPEC_CBCDTD
+ UNSPEC_DIVE
+ UNSPEC_DIVEO
+ UNSPEC_DIVEU
+ UNSPEC_DIVEUO
+ UNSPEC_UNPACK_128BIT
+ UNSPEC_PACK_128BIT
+ UNSPEC_LSQ
])
;;
(V2DF "X,X,X,X,X")
(V1TI "X,X,X,X,X")])
+;; Mode attribute to give the correct type for integer divides
+(define_mode_attr idiv_ldiv [(SI "idiv")
+ (DI "ldiv")])
+
\f
;; Start with fixed-point load and store insns. Here we put only the more
;; complex forms. Basic data transfer is done later.
(define_insn "*extendsidi2_lfiwax"
[(set (match_operand:DI 0 "gpc_reg_operand" "=r,r,??wm,!wl,!wu")
- (sign_extend:DI (match_operand:SI 1 "lwa_operand" "m,r,r,Z,Z")))]
+ (sign_extend:DI (match_operand:SI 1 "lwa_operand" "Y,r,r,Z,Z")))]
"TARGET_POWERPC64 && TARGET_LFIWAX"
"@
lwa%U1%X1 %0,%1
(define_insn "*extendsidi2_nocell"
[(set (match_operand:DI 0 "gpc_reg_operand" "=r,r")
- (sign_extend:DI (match_operand:SI 1 "lwa_operand" "m,r")))]
+ (sign_extend:DI (match_operand:SI 1 "lwa_operand" "Y,r")))]
"TARGET_POWERPC64 && rs6000_gen_cell_microcode && !TARGET_LFIWAX"
"@
lwa%U1%X1 %0,%1
(match_operand:GPR 2 "gpc_reg_operand" "r")))]
""
"div<wd>u %0,%1,%2"
- [(set (attr "type")
- (cond [(match_operand:SI 0 "" "")
- (const_string "idiv")]
- (const_string "ldiv")))])
+ [(set_attr "type" "<idiv_ldiv>")])
;; For powers of two we can do srai/aze for divide and then adjust for
(match_operand:GPR 2 "gpc_reg_operand" "r")))]
""
"div<wd> %0,%1,%2"
- [(set (attr "type")
- (cond [(match_operand:SI 0 "" "")
- (const_string "idiv")]
- (const_string "ldiv")))])
+ [(set_attr "type" "<idiv_ldiv>")])
(define_expand "mod<mode>3"
[(use (match_operand:GPR 0 "gpc_reg_operand" ""))
[(set_attr "length" "8")
(set_attr "type" "fpload")])
\f
+;; Define the TImode operations that can be done in a small number
+;; of instructions. The & constraints are to prevent the register
+;; allocator from allocating registers that overlap with the inputs
+;; (for example, having an input in 7,8 and an output in 6,7). We
+;; also allow for the output being the same as one of the inputs.
+
+(define_insn "addti3"
+ [(set (match_operand:TI 0 "gpc_reg_operand" "=&r,&r,r,r")
+ (plus:TI (match_operand:TI 1 "gpc_reg_operand" "%r,r,0,0")
+ (match_operand:TI 2 "reg_or_short_operand" "r,I,r,I")))]
+ "TARGET_64BIT"
+{
+ if (WORDS_BIG_ENDIAN)
+ return (GET_CODE (operands[2])) != CONST_INT
+ ? \"addc %L0,%L1,%L2\;adde %0,%1,%2\"
+ : \"addic %L0,%L1,%2\;add%G2e %0,%1\";
+ else
+ return (GET_CODE (operands[2])) != CONST_INT
+ ? \"addc %0,%1,%2\;adde %L0,%L1,%L2\"
+ : \"addic %0,%1,%2\;add%G2e %L0,%L1\";
+}
+ [(set_attr "type" "two")
+ (set_attr "length" "8")])
+
+(define_insn "subti3"
+ [(set (match_operand:TI 0 "gpc_reg_operand" "=&r,&r,r,r,r")
+ (minus:TI (match_operand:TI 1 "reg_or_short_operand" "r,I,0,r,I")
+ (match_operand:TI 2 "gpc_reg_operand" "r,r,r,0,0")))]
+ "TARGET_64BIT"
+{
+ if (WORDS_BIG_ENDIAN)
+ return (GET_CODE (operands[1]) != CONST_INT)
+ ? \"subfc %L0,%L2,%L1\;subfe %0,%2,%1\"
+ : \"subfic %L0,%L2,%1\;subf%G1e %0,%2\";
+ else
+ return (GET_CODE (operands[1]) != CONST_INT)
+ ? \"subfc %0,%2,%1\;subfe %L0,%L2,%L1\"
+ : \"subfic %0,%2,%1\;subf%G1e %L0,%L2\";
+}
+ [(set_attr "type" "two")
+ (set_attr "length" "8")])
+
+
;; Define the DImode operations that can be done in a small number
;; of instructions. The & constraints are to prevent the register
;; allocator from allocating registers that overlap with the inputs
(match_operand:FMOVE64 1 "input_operand" "r,Y,r,G,H,F"))]
"! TARGET_POWERPC64
&& ((TARGET_FPRS && TARGET_SINGLE_FLOAT)
- || TARGET_SOFT_FLOAT || TARGET_E500_SINGLE)
+ || TARGET_SOFT_FLOAT || TARGET_E500_SINGLE
+ || (<MODE>mode == DDmode && TARGET_E500_DOUBLE))
&& (gpc_reg_operand (operands[0], <MODE>mode)
|| gpc_reg_operand (operands[1], <MODE>mode))"
"#"
})
\f
+;; Miscellaneous ISA 2.06 (power7) instructions
+(define_insn "addg6s"
+ [(set (match_operand:SI 0 "register_operand" "=r")
+ (unspec:SI [(match_operand:SI 1 "register_operand" "r")
+ (match_operand:SI 2 "register_operand" "r")]
+ UNSPEC_ADDG6S))]
+ "TARGET_POPCNTD"
+ "addg6s %0,%1,%2"
+ [(set_attr "type" "integer")
+ (set_attr "length" "4")])
+
+(define_insn "cdtbcd"
+ [(set (match_operand:SI 0 "register_operand" "=r")
+ (unspec:SI [(match_operand:SI 1 "register_operand" "r")]
+ UNSPEC_CDTBCD))]
+ "TARGET_POPCNTD"
+ "cdtbcd %0,%1"
+ [(set_attr "type" "integer")
+ (set_attr "length" "4")])
+
+(define_insn "cbcdtd"
+ [(set (match_operand:SI 0 "register_operand" "=r")
+ (unspec:SI [(match_operand:SI 1 "register_operand" "r")]
+ UNSPEC_CBCDTD))]
+ "TARGET_POPCNTD"
+ "cbcdtd %0,%1"
+ [(set_attr "type" "integer")
+ (set_attr "length" "4")])
+
+(define_int_iterator UNSPEC_DIV_EXTEND [UNSPEC_DIVE
+ UNSPEC_DIVEO
+ UNSPEC_DIVEU
+ UNSPEC_DIVEUO])
+
+(define_int_attr div_extend [(UNSPEC_DIVE "e")
+ (UNSPEC_DIVEO "eo")
+ (UNSPEC_DIVEU "eu")
+ (UNSPEC_DIVEUO "euo")])
+
+(define_insn "div<div_extend>_<mode>"
+ [(set (match_operand:GPR 0 "register_operand" "=r")
+ (unspec:GPR [(match_operand:GPR 1 "register_operand" "r")
+ (match_operand:GPR 2 "register_operand" "r")]
+ UNSPEC_DIV_EXTEND))]
+ "TARGET_POPCNTD"
+ "div<wd><div_extend> %0,%1,%2"
+ [(set_attr "type" "<idiv_ldiv>")])
+
+\f
+;; Pack/unpack 128-bit floating point types that take 2 scalar registers
+
+; Type of the 64-bit part when packing/unpacking 128-bit floating point types
+(define_mode_attr FP128_64 [(TF "DF") (TD "DI")])
+
+(define_expand "unpack<mode>"
+ [(set (match_operand:<FP128_64> 0 "nonimmediate_operand" "")
+ (unspec:<FP128_64>
+ [(match_operand:FMOVE128 1 "register_operand" "")
+ (match_operand:QI 2 "const_0_to_1_operand" "")]
+ UNSPEC_UNPACK_128BIT))]
+ ""
+ "")
+
+(define_insn_and_split "unpack<mode>_dm"
+ [(set (match_operand:<FP128_64> 0 "nonimmediate_operand" "=d,m,d,r,m")
+ (unspec:<FP128_64>
+ [(match_operand:FMOVE128 1 "register_operand" "d,d,r,d,r")
+ (match_operand:QI 2 "const_0_to_1_operand" "i,i,i,i,i")]
+ UNSPEC_UNPACK_128BIT))]
+ "TARGET_POWERPC64 && TARGET_DIRECT_MOVE"
+ "#"
+ "&& reload_completed"
+ [(set (match_dup 0) (match_dup 3))]
+{
+ unsigned fp_regno = REGNO (operands[1]) + UINTVAL (operands[2]);
+
+ if (REG_P (operands[0]) && REGNO (operands[0]) == fp_regno)
+ {
+ emit_note (NOTE_INSN_DELETED);
+ DONE;
+ }
+
+ operands[3] = gen_rtx_REG (<FP128_64>mode, fp_regno);
+}
+ [(set_attr "type" "fp,fpstore,mffgpr,mftgpr,store")
+ (set_attr "length" "4")])
+
+(define_insn_and_split "unpack<mode>_nodm"
+ [(set (match_operand:<FP128_64> 0 "nonimmediate_operand" "=d,m")
+ (unspec:<FP128_64>
+ [(match_operand:FMOVE128 1 "register_operand" "d,d")
+ (match_operand:QI 2 "const_0_to_1_operand" "i,i")]
+ UNSPEC_UNPACK_128BIT))]
+ "!TARGET_POWERPC64 || !TARGET_DIRECT_MOVE"
+ "#"
+ "&& reload_completed"
+ [(set (match_dup 0) (match_dup 3))]
+{
+ unsigned fp_regno = REGNO (operands[1]) + UINTVAL (operands[2]);
+
+ if (REG_P (operands[0]) && REGNO (operands[0]) == fp_regno)
+ {
+ emit_note (NOTE_INSN_DELETED);
+ DONE;
+ }
+
+ operands[3] = gen_rtx_REG (<FP128_64>mode, fp_regno);
+}
+ [(set_attr "type" "fp,fpstore")
+ (set_attr "length" "4")])
+
+(define_insn_and_split "pack<mode>"
+ [(set (match_operand:FMOVE128 0 "register_operand" "=d,&d")
+ (unspec:FMOVE128
+ [(match_operand:<FP128_64> 1 "register_operand" "0,d")
+ (match_operand:<FP128_64> 2 "register_operand" "d,d")]
+ UNSPEC_PACK_128BIT))]
+ ""
+ "@
+ fmr %L0,%2
+ #"
+ "&& reload_completed && REGNO (operands[0]) != REGNO (operands[1])"
+ [(set (match_dup 3) (match_dup 1))
+ (set (match_dup 4) (match_dup 2))]
+{
+ unsigned dest_hi = REGNO (operands[0]);
+ unsigned dest_lo = dest_hi + 1;
+
+ gcc_assert (!IN_RANGE (REGNO (operands[1]), dest_hi, dest_lo));
+ gcc_assert (!IN_RANGE (REGNO (operands[2]), dest_hi, dest_lo));
+
+ operands[3] = gen_rtx_REG (<FP128_64>mode, dest_hi);
+ operands[4] = gen_rtx_REG (<FP128_64>mode, dest_lo);
+}
+ [(set_attr "type" "fp,fp")
+ (set_attr "length" "4,8")])
+
+(define_insn "unpackv1ti"
+ [(set (match_operand:DI 0 "register_operand" "=d,d")
+ (unspec:DI [(match_operand:V1TI 1 "register_operand" "0,wa")
+ (match_operand:QI 2 "const_0_to_1_operand" "O,i")]
+ UNSPEC_UNPACK_128BIT))]
+ "TARGET_VSX"
+{
+ if (REGNO (operands[0]) == REGNO (operands[1]) && INTVAL (operands[2]) == 0)
+ return ASM_COMMENT_START " xxpermdi to same register";
+
+ operands[3] = GEN_INT (INTVAL (operands[2]) == 0 ? 0 : 3);
+ return "xxpermdi %x0,%x1,%x1,%3";
+}
+ [(set_attr "type" "vecperm")
+ (set_attr "length" "4")])
+
+(define_insn "packv1ti"
+ [(set (match_operand:V1TI 0 "register_operand" "=wa")
+ (unspec:V1TI
+ [(match_operand:DI 1 "register_operand" "d")
+ (match_operand:DI 2 "register_operand" "d")]
+ UNSPEC_PACK_128BIT))]
+ "TARGET_VSX"
+ "xxpermdi %x0,%x1,%x2,0"
+ [(set_attr "type" "vecperm")
+ (set_attr "length" "4")])
+
+\f
(include "sync.md")
(include "vector.md")
"isync"
[(set_attr "type" "isync")])
+;; Types that we should provide atomic instructions for.
+(define_mode_iterator AINT [QI
+ HI
+ SI
+ (DI "TARGET_POWERPC64")
+ (TI "TARGET_SYNC_TI")])
+
;; The control dependency used for load dependency described
;; in B.2.3 of the Power ISA 2.06B.
(define_insn "loadsync_<mode>"
- [(unspec_volatile:BLK [(match_operand:INT1 0 "register_operand" "r")]
+ [(unspec_volatile:BLK [(match_operand:AINT 0 "register_operand" "r")]
UNSPECV_ISYNC)
(clobber (match_scratch:CC 1 "=y"))]
""
[(set_attr "type" "isync")
(set_attr "length" "12")])
+(define_insn "load_quadpti"
+ [(set (match_operand:PTI 0 "quad_int_reg_operand" "=&r")
+ (unspec:PTI
+ [(match_operand:TI 1 "quad_memory_operand" "wQ")] UNSPEC_LSQ))]
+ "TARGET_SYNC_TI
+ && !reg_mentioned_p (operands[0], operands[1])"
+ "lq %0,%1"
+ [(set_attr "type" "load")
+ (set_attr "length" "4")])
+
(define_expand "atomic_load<mode>"
- [(set (match_operand:INT1 0 "register_operand" "") ;; output
- (match_operand:INT1 1 "memory_operand" "")) ;; memory
+ [(set (match_operand:AINT 0 "register_operand" "") ;; output
+ (match_operand:AINT 1 "memory_operand" "")) ;; memory
(use (match_operand:SI 2 "const_int_operand" ""))] ;; model
""
{
+ if (<MODE>mode == TImode && !TARGET_SYNC_TI)
+ FAIL;
+
enum memmodel model = (enum memmodel) INTVAL (operands[2]);
if (model == MEMMODEL_SEQ_CST)
emit_insn (gen_hwsync ());
- emit_move_insn (operands[0], operands[1]);
+ if (<MODE>mode != TImode)
+ emit_move_insn (operands[0], operands[1]);
+ else
+ {
+ rtx op0 = operands[0];
+ rtx op1 = operands[1];
+ rtx pti_reg = gen_reg_rtx (PTImode);
+
+ // Can't have indexed address for 'lq'
+ if (indexed_address (XEXP (op1, 0), TImode))
+ {
+ rtx old_addr = XEXP (op1, 0);
+ rtx new_addr = force_reg (Pmode, old_addr);
+ operands[1] = op1 = replace_equiv_address (op1, new_addr);
+ }
+
+ emit_insn (gen_load_quadpti (pti_reg, op1));
+
+ if (WORDS_BIG_ENDIAN)
+ emit_move_insn (op0, gen_lowpart (TImode, pti_reg));
+ else
+ {
+ emit_move_insn (gen_lowpart (DImode, op0), gen_highpart (DImode, pti_reg));
+ emit_move_insn (gen_highpart (DImode, op0), gen_lowpart (DImode, pti_reg));
+ }
+ }
switch (model)
{
DONE;
})
+(define_insn "store_quadpti"
+ [(set (match_operand:PTI 0 "quad_memory_operand" "=wQ")
+ (unspec:PTI
+ [(match_operand:PTI 1 "quad_int_reg_operand" "r")] UNSPEC_LSQ))]
+ "TARGET_SYNC_TI"
+ "stq %1,%0"
+ [(set_attr "type" "store")
+ (set_attr "length" "4")])
+
(define_expand "atomic_store<mode>"
- [(set (match_operand:INT1 0 "memory_operand" "") ;; memory
- (match_operand:INT1 1 "register_operand" "")) ;; input
+ [(set (match_operand:AINT 0 "memory_operand" "") ;; memory
+ (match_operand:AINT 1 "register_operand" "")) ;; input
(use (match_operand:SI 2 "const_int_operand" ""))] ;; model
""
{
+ if (<MODE>mode == TImode && !TARGET_SYNC_TI)
+ FAIL;
+
enum memmodel model = (enum memmodel) INTVAL (operands[2]);
switch (model)
{
default:
gcc_unreachable ();
}
- emit_move_insn (operands[0], operands[1]);
+ if (<MODE>mode != TImode)
+ emit_move_insn (operands[0], operands[1]);
+ else
+ {
+ rtx op0 = operands[0];
+ rtx op1 = operands[1];
+ rtx pti_reg = gen_reg_rtx (PTImode);
+
+ // Can't have indexed address for 'stq'
+ if (indexed_address (XEXP (op0, 0), TImode))
+ {
+ rtx old_addr = XEXP (op0, 0);
+ rtx new_addr = force_reg (Pmode, old_addr);
+ operands[0] = op0 = replace_equiv_address (op0, new_addr);
+ }
+
+ if (WORDS_BIG_ENDIAN)
+ emit_move_insn (pti_reg, gen_lowpart (PTImode, op1));
+ else
+ {
+ emit_move_insn (gen_lowpart (DImode, pti_reg), gen_highpart (DImode, op1));
+ emit_move_insn (gen_highpart (DImode, pti_reg), gen_lowpart (DImode, op1));
+ }
+
+ emit_insn (gen_store_quadpti (gen_lowpart (PTImode, op0), pti_reg));
+ }
+
DONE;
})
SI
(DI "TARGET_POWERPC64")])
-;; Types that we should provide atomic instructions for.
-
-(define_mode_iterator AINT [QI
- HI
- SI
- (DI "TARGET_POWERPC64")
- (TI "TARGET_SYNC_TI")])
-
(define_insn "load_locked<mode>"
[(set (match_operand:ATOMIC 0 "int_reg_operand" "=r")
(unspec_volatile:ATOMIC
;; Iterator for the 2 64-bit vector types
(define_mode_iterator VSX_D [V2DF V2DI])
+;; Iterator for the 2 64-bit vector types + 128-bit types that are loaded with
+;; lxvd2x to properly handle swapping words on little endian
+(define_mode_iterator VSX_LE [V2DF
+ V2DI
+ V1TI
+ (TI "VECTOR_MEM_VSX_P (TImode)")])
+
;; Iterator for the 2 32-bit vector types
(define_mode_iterator VSX_W [V4SF V4SI])
;; The patterns for LE permuted loads and stores come before the general
;; VSX moves so they match first.
(define_insn_and_split "*vsx_le_perm_load_<mode>"
- [(set (match_operand:VSX_D 0 "vsx_register_operand" "=wa")
- (match_operand:VSX_D 1 "memory_operand" "Z"))]
+ [(set (match_operand:VSX_LE 0 "vsx_register_operand" "=wa")
+ (match_operand:VSX_LE 1 "memory_operand" "Z"))]
"!BYTES_BIG_ENDIAN && TARGET_VSX"
"#"
"!BYTES_BIG_ENDIAN && TARGET_VSX"
(set_attr "length" "8")])
(define_insn "*vsx_le_perm_store_<mode>"
- [(set (match_operand:VSX_D 0 "memory_operand" "=Z")
- (match_operand:VSX_D 1 "vsx_register_operand" "+wa"))]
+ [(set (match_operand:VSX_LE 0 "memory_operand" "=Z")
+ (match_operand:VSX_LE 1 "vsx_register_operand" "+wa"))]
"!BYTES_BIG_ENDIAN && TARGET_VSX"
"#"
[(set_attr "type" "vecstore")
(set_attr "length" "12")])
(define_split
- [(set (match_operand:VSX_D 0 "memory_operand" "")
- (match_operand:VSX_D 1 "vsx_register_operand" ""))]
+ [(set (match_operand:VSX_LE 0 "memory_operand" "")
+ (match_operand:VSX_LE 1 "vsx_register_operand" ""))]
"!BYTES_BIG_ENDIAN && TARGET_VSX && !reload_completed"
[(set (match_dup 2)
(vec_select:<MODE>
;; The post-reload split requires that we re-permute the source
;; register in case it is still live.
(define_split
- [(set (match_operand:VSX_D 0 "memory_operand" "")
- (match_operand:VSX_D 1 "vsx_register_operand" ""))]
+ [(set (match_operand:VSX_LE 0 "memory_operand" "")
+ (match_operand:VSX_LE 1 "vsx_register_operand" ""))]
"!BYTES_BIG_ENDIAN && TARGET_VSX && reload_completed"
[(set (match_dup 1)
(vec_select:<MODE>
;; xxpermdi for little endian loads and stores. We need several of
;; these since the form of the PARALLEL differs by mode.
(define_insn "*vsx_xxpermdi2_le_<mode>"
- [(set (match_operand:VSX_D 0 "vsx_register_operand" "=wa")
- (vec_select:VSX_D
- (match_operand:VSX_D 1 "vsx_register_operand" "wa")
+ [(set (match_operand:VSX_LE 0 "vsx_register_operand" "=wa")
+ (vec_select:VSX_LE
+ (match_operand:VSX_LE 1 "vsx_register_operand" "wa")
(parallel [(const_int 1) (const_int 0)])))]
"!BYTES_BIG_ENDIAN && VECTOR_MEM_VSX_P (<MODE>mode)"
"xxpermdi %x0,%x1,%x1,2"
;; lxvd2x for little endian loads. We need several of
;; these since the form of the PARALLEL differs by mode.
(define_insn "*vsx_lxvd2x2_le_<mode>"
- [(set (match_operand:VSX_D 0 "vsx_register_operand" "=wa")
- (vec_select:VSX_D
- (match_operand:VSX_D 1 "memory_operand" "Z")
+ [(set (match_operand:VSX_LE 0 "vsx_register_operand" "=wa")
+ (vec_select:VSX_LE
+ (match_operand:VSX_LE 1 "memory_operand" "Z")
(parallel [(const_int 1) (const_int 0)])))]
"!BYTES_BIG_ENDIAN && VECTOR_MEM_VSX_P (<MODE>mode)"
"lxvd2x %x0,%y1"
;; stxvd2x for little endian stores. We need several of
;; these since the form of the PARALLEL differs by mode.
(define_insn "*vsx_stxvd2x2_le_<mode>"
- [(set (match_operand:VSX_D 0 "memory_operand" "=Z")
- (vec_select:VSX_D
- (match_operand:VSX_D 1 "vsx_register_operand" "wa")
+ [(set (match_operand:VSX_LE 0 "memory_operand" "=Z")
+ (vec_select:VSX_LE
+ (match_operand:VSX_LE 1 "vsx_register_operand" "wa")
(parallel [(const_int 1) (const_int 0)])))]
"!BYTES_BIG_ENDIAN && VECTOR_MEM_VSX_P (<MODE>mode)"
"stxvd2x %x1,%y0"
{
if (GET_CODE (op3) == SCRATCH)
op3 = gen_reg_rtx (V4SFmode);
- emit_insn (gen_vsx_xxsldwi_v4sf (op3, op1, op1, op2));
+ emit_insn (gen_vsx_xxsldwi_v4sf (op3, op1, op1, GEN_INT (ele)));
tmp = op3;
}
emit_insn (gen_vsx_xscvspdp_scalar2 (op0, tmp));
(parallel [(const_int 0) (const_int 4)
(const_int 1) (const_int 5)])))]
"VECTOR_MEM_VSX_P (<MODE>mode)"
- "xxmrghw %x0,%x1,%x2"
+{
+ if (BYTES_BIG_ENDIAN)
+ return "xxmrghw %x0,%x1,%x2";
+ else
+ return "xxmrglw %x0,%x2,%x1";
+}
[(set_attr "type" "vecperm")])
(define_insn "vsx_xxmrglw_<mode>"
(parallel [(const_int 2) (const_int 6)
(const_int 3) (const_int 7)])))]
"VECTOR_MEM_VSX_P (<MODE>mode)"
- "xxmrglw %x0,%x1,%x2"
+{
+ if (BYTES_BIG_ENDIAN)
+ return "xxmrglw %x0,%x1,%x2";
+ else
+ return "xxmrghw %x0,%x2,%x1";
+}
[(set_attr "type" "vecperm")])
;; Shift left double by word immediate
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3. If not see
+Under Section 7 of GPL version 3, you are granted additional
+permissions described in the GCC Runtime Library Exception, version
+3.1, as published by the Free Software Foundation.
+
+You should have received a copy of the GNU General Public License and
+a copy of the GCC Runtime Library Exception along with this program;
+see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
/* The system headers under RTEMS are C++-aware. */
along with GCC; see the file COPYING3. If not see
<http://www.gnu.org/licenses/>. */
+#include <sstream>
+#include <vector>
+#include <algorithm>
+
#include "config.h"
#include "system.h"
#include "coretypes.h"
#include "pass_manager.h"
#include "context.h"
-#include <sstream>
-#include <vector>
-#include <algorithm>
-
int code_for_indirect_jump_scratch = CODE_FOR_indirect_jump_scratch;
/* These are some macros to abstract register modes. */
--- /dev/null
+# Clear all hardware capabilities emitted by Sun as.
+hwcap_1 = V0x0 OVERRIDE;
--- /dev/null
+# Clear all hardware capabilities emitted by Sun as.
+#
+# Uses mapfile v2 syntax which is the only way to clear AT_SUN_CAP_HW2 flags.
+$mapfile_version 2
+CAPABILITY {
+ HW = ;
+};
#define LINK_LIBGCC_MAPFILE_SPEC ""
#endif
+/* Clear hardware capabilities, either explicitly or with OpenMP:
+ #pragma openmp declare simd creates clones for SSE2, AVX, and AVX2. */
+#ifdef HAVE_LD_CLEARCAP
+#define LINK_CLEARCAP_SPEC " %{mclear-hwcap|fopenmp*:-M %sclearcap.map}"
+#else
+#define LINK_CLEARCAP_SPEC ""
+#endif
+
#undef LINK_SPEC
#define LINK_SPEC \
"%{h*} %{v:-V} \
%{!shared:%{!static:%{rdynamic: " RDYNAMIC_SPEC "}}} \
%{static:-dn -Bstatic} \
- %{shared:-G -dy %{!mimpure-text:-z text}} " LINK_LIBGCC_MAPFILE_SPEC " \
+ %{shared:-G -dy %{!mimpure-text:-z text}} " \
+ LINK_LIBGCC_MAPFILE_SPEC LINK_CLEARCAP_SPEC " \
%{symbolic:-Bsymbolic -G -dy -z text} \
%(link_arch) \
%{Qy:} %{!Qn:-Qy}"
Ym,
Driver Joined
+mclear-hwcap
+Target Report
+Clear hardware capabilities when linking
+
mimpure-text
Target Report
Pass -z text to linker
extern void sparc_emit_set_symbolic_const64 (rtx, rtx, rtx);
extern int sparc_splitdi_legitimate (rtx, rtx);
extern int sparc_split_regreg_legitimate (rtx, rtx);
-extern int sparc_absnegfloat_split_legitimate (rtx, rtx);
extern const char *output_ubranch (rtx, rtx);
extern const char *output_cbranch (rtx, rtx, int, int, int, rtx);
extern const char *output_return (rtx);
return 0;
}
-/* Return 1 if x and y are some kind of REG and they refer to
- different hard registers. This test is guaranteed to be
- run after reload. */
-
-int
-sparc_absnegfloat_split_legitimate (rtx x, rtx y)
-{
- if (GET_CODE (x) != REG)
- return 0;
- if (GET_CODE (y) != REG)
- return 0;
- if (REGNO (x) == REGNO (y))
- return 0;
- return 1;
-}
-
/* Return 1 if REGNO (reg1) is even and REGNO (reg1) == REGNO (reg2) - 1.
This makes them candidates for using ldd and std insns.
(define_attr "fptype" "single,double"
(const_string "single"))
+;; FP precision specific to the UT699.
+(define_attr "fptype_ut699" "none,single"
+ (const_string "none"))
+
;; UltraSPARC-III integer load type.
(define_attr "us3load_type" "2cycle,3cycle"
(const_string "2cycle"))
(const_string "false")
(and (eq_attr "fix_ut699" "true")
(and (eq_attr "type" "fpload,fp,fpmove,fpmul,fpdivs,fpsqrts")
- (eq_attr "fptype" "single")))
+ (ior (eq_attr "fptype" "single")
+ (eq_attr "fptype_ut699" "single"))))
(const_string "false")
(eq_attr "length" "1")
(const_string "true")
"TARGET_FPU"
"fdtos\t%1, %0"
[(set_attr "type" "fp")
- (set_attr "fptype" "double")])
+ (set_attr "fptype" "double")
+ (set_attr "fptype_ut699" "single")])
(define_expand "trunctfsf2"
[(set (match_operand:SF 0 "register_operand" "")
"TARGET_FPU"
"fitos\t%1, %0"
[(set_attr "type" "fp")
- (set_attr "fptype" "double")])
+ (set_attr "fptype" "single")])
(define_insn "floatsidf2"
[(set (match_operand:DF 0 "register_operand" "=e")
"TARGET_FPU"
"fstoi\t%1, %0"
[(set_attr "type" "fp")
- (set_attr "fptype" "double")])
+ (set_attr "fptype" "single")])
(define_insn "fix_truncdfsi2"
[(set (match_operand:SI 0 "register_operand" "=f")
"TARGET_FPU"
"fdtoi\t%1, %0"
[(set_attr "type" "fp")
- (set_attr "fptype" "double")])
+ (set_attr "fptype" "double")
+ (set_attr "fptype_ut699" "single")])
(define_expand "fix_trunctfsi2"
[(set (match_operand:SI 0 "register_operand" "")
[(set_attr "type" "fpdivs")])
(define_expand "negtf2"
- [(set (match_operand:TF 0 "register_operand" "=e,e")
- (neg:TF (match_operand:TF 1 "register_operand" "0,e")))]
+ [(set (match_operand:TF 0 "register_operand" "")
+ (neg:TF (match_operand:TF 1 "register_operand" "")))]
"TARGET_FPU"
"")
-(define_insn_and_split "*negtf2_notv9"
- [(set (match_operand:TF 0 "register_operand" "=e,e")
- (neg:TF (match_operand:TF 1 "register_operand" "0,e")))]
- ; We don't use quad float insns here so we don't need TARGET_HARD_QUAD.
- "TARGET_FPU
- && ! TARGET_V9"
- "@
- fnegs\t%0, %0
- #"
- "&& reload_completed
- && sparc_absnegfloat_split_legitimate (operands[0], operands[1])"
- [(set (match_dup 2) (neg:SF (match_dup 3)))
- (set (match_dup 4) (match_dup 5))
- (set (match_dup 6) (match_dup 7))]
- "operands[2] = gen_rtx_raw_REG (SFmode, REGNO (operands[0]));
- operands[3] = gen_rtx_raw_REG (SFmode, REGNO (operands[1]));
- operands[4] = gen_rtx_raw_REG (SFmode, REGNO (operands[0]) + 1);
- operands[5] = gen_rtx_raw_REG (SFmode, REGNO (operands[1]) + 1);
- operands[6] = gen_rtx_raw_REG (DFmode, REGNO (operands[0]) + 2);
- operands[7] = gen_rtx_raw_REG (DFmode, REGNO (operands[1]) + 2);"
- [(set_attr "type" "fpmove,*")
- (set_attr "length" "*,2")])
-
-(define_insn_and_split "*negtf2_v9"
- [(set (match_operand:TF 0 "register_operand" "=e,e")
- (neg:TF (match_operand:TF 1 "register_operand" "0,e")))]
- ; We don't use quad float insns here so we don't need TARGET_HARD_QUAD.
- "TARGET_FPU && TARGET_V9"
- "@
- fnegd\t%0, %0
- #"
- "&& reload_completed
- && sparc_absnegfloat_split_legitimate (operands[0], operands[1])"
- [(set (match_dup 2) (neg:DF (match_dup 3)))
- (set (match_dup 4) (match_dup 5))]
- "operands[2] = gen_rtx_raw_REG (DFmode, REGNO (operands[0]));
- operands[3] = gen_rtx_raw_REG (DFmode, REGNO (operands[1]));
- operands[4] = gen_rtx_raw_REG (DFmode, REGNO (operands[0]) + 2);
- operands[5] = gen_rtx_raw_REG (DFmode, REGNO (operands[1]) + 2);"
- [(set_attr "type" "fpmove,*")
- (set_attr "length" "*,2")
- (set_attr "fptype" "double")])
+(define_insn "*negtf2_hq"
+ [(set (match_operand:TF 0 "register_operand" "=e")
+ (neg:TF (match_operand:TF 1 "register_operand" "e")))]
+ "TARGET_FPU && TARGET_HARD_QUAD"
+ "fnegq\t%1, %0"
+ [(set_attr "type" "fpmove")])
+
+(define_insn_and_split "*negtf2"
+ [(set (match_operand:TF 0 "register_operand" "=e")
+ (neg:TF (match_operand:TF 1 "register_operand" "e")))]
+ "TARGET_FPU && !TARGET_HARD_QUAD"
+ "#"
+ "&& reload_completed"
+ [(clobber (const_int 0))]
+{
+ rtx set_dest = operands[0];
+ rtx set_src = operands[1];
+ rtx dest1, dest2;
+ rtx src1, src2;
+
+ dest1 = gen_df_reg (set_dest, 0);
+ dest2 = gen_df_reg (set_dest, 1);
+ src1 = gen_df_reg (set_src, 0);
+ src2 = gen_df_reg (set_src, 1);
+
+ /* Now emit using the real source and destination we found, swapping
+ the order if we detect overlap. */
+ if (reg_overlap_mentioned_p (dest1, src2))
+ {
+ emit_insn (gen_movdf (dest2, src2));
+ emit_insn (gen_negdf2 (dest1, src1));
+ }
+ else
+ {
+ emit_insn (gen_negdf2 (dest1, src1));
+ if (REGNO (dest2) != REGNO (src2))
+ emit_insn (gen_movdf (dest2, src2));
+ }
+ DONE;
+}
+ [(set_attr "length" "2")])
(define_expand "negdf2"
[(set (match_operand:DF 0 "register_operand" "")
"")
(define_insn_and_split "*negdf2_notv9"
- [(set (match_operand:DF 0 "register_operand" "=e,e")
- (neg:DF (match_operand:DF 1 "register_operand" "0,e")))]
- "TARGET_FPU && ! TARGET_V9"
- "@
- fnegs\t%0, %0
- #"
- "&& reload_completed
- && sparc_absnegfloat_split_legitimate (operands[0], operands[1])"
- [(set (match_dup 2) (neg:SF (match_dup 3)))
- (set (match_dup 4) (match_dup 5))]
- "operands[2] = gen_rtx_raw_REG (SFmode, REGNO (operands[0]));
- operands[3] = gen_rtx_raw_REG (SFmode, REGNO (operands[1]));
- operands[4] = gen_rtx_raw_REG (SFmode, REGNO (operands[0]) + 1);
- operands[5] = gen_rtx_raw_REG (SFmode, REGNO (operands[1]) + 1);"
- [(set_attr "type" "fpmove,*")
- (set_attr "length" "*,2")])
+ [(set (match_operand:DF 0 "register_operand" "=e")
+ (neg:DF (match_operand:DF 1 "register_operand" "e")))]
+ "TARGET_FPU && !TARGET_V9"
+ "#"
+ "&& reload_completed"
+ [(clobber (const_int 0))]
+{
+ rtx set_dest = operands[0];
+ rtx set_src = operands[1];
+ rtx dest1, dest2;
+ rtx src1, src2;
+
+ dest1 = gen_highpart (SFmode, set_dest);
+ dest2 = gen_lowpart (SFmode, set_dest);
+ src1 = gen_highpart (SFmode, set_src);
+ src2 = gen_lowpart (SFmode, set_src);
+
+ /* Now emit using the real source and destination we found, swapping
+ the order if we detect overlap. */
+ if (reg_overlap_mentioned_p (dest1, src2))
+ {
+ emit_insn (gen_movsf (dest2, src2));
+ emit_insn (gen_negsf2 (dest1, src1));
+ }
+ else
+ {
+ emit_insn (gen_negsf2 (dest1, src1));
+ if (REGNO (dest2) != REGNO (src2))
+ emit_insn (gen_movsf (dest2, src2));
+ }
+ DONE;
+}
+ [(set_attr "length" "2")])
(define_insn "*negdf2_v9"
[(set (match_operand:DF 0 "register_operand" "=e")
"TARGET_FPU"
"")
-(define_insn_and_split "*abstf2_notv9"
- [(set (match_operand:TF 0 "register_operand" "=e,e")
- (abs:TF (match_operand:TF 1 "register_operand" "0,e")))]
- ; We don't use quad float insns here so we don't need TARGET_HARD_QUAD.
- "TARGET_FPU && ! TARGET_V9"
- "@
- fabss\t%0, %0
- #"
- "&& reload_completed
- && sparc_absnegfloat_split_legitimate (operands[0], operands[1])"
- [(set (match_dup 2) (abs:SF (match_dup 3)))
- (set (match_dup 4) (match_dup 5))
- (set (match_dup 6) (match_dup 7))]
- "operands[2] = gen_rtx_raw_REG (SFmode, REGNO (operands[0]));
- operands[3] = gen_rtx_raw_REG (SFmode, REGNO (operands[1]));
- operands[4] = gen_rtx_raw_REG (SFmode, REGNO (operands[0]) + 1);
- operands[5] = gen_rtx_raw_REG (SFmode, REGNO (operands[1]) + 1);
- operands[6] = gen_rtx_raw_REG (DFmode, REGNO (operands[0]) + 2);
- operands[7] = gen_rtx_raw_REG (DFmode, REGNO (operands[1]) + 2);"
- [(set_attr "type" "fpmove,*")
- (set_attr "length" "*,2")])
-
-(define_insn "*abstf2_hq_v9"
- [(set (match_operand:TF 0 "register_operand" "=e,e")
- (abs:TF (match_operand:TF 1 "register_operand" "0,e")))]
- "TARGET_FPU && TARGET_V9 && TARGET_HARD_QUAD"
- "@
- fabsd\t%0, %0
- fabsq\t%1, %0"
- [(set_attr "type" "fpmove")
- (set_attr "fptype" "double,*")])
+(define_insn "*abstf2_hq"
+ [(set (match_operand:TF 0 "register_operand" "=e")
+ (abs:TF (match_operand:TF 1 "register_operand" "e")))]
+ "TARGET_FPU && TARGET_HARD_QUAD"
+ "fabsq\t%1, %0"
+ [(set_attr "type" "fpmove")])
-(define_insn_and_split "*abstf2_v9"
- [(set (match_operand:TF 0 "register_operand" "=e,e")
- (abs:TF (match_operand:TF 1 "register_operand" "0,e")))]
- "TARGET_FPU && TARGET_V9 && !TARGET_HARD_QUAD"
- "@
- fabsd\t%0, %0
- #"
- "&& reload_completed
- && sparc_absnegfloat_split_legitimate (operands[0], operands[1])"
- [(set (match_dup 2) (abs:DF (match_dup 3)))
- (set (match_dup 4) (match_dup 5))]
- "operands[2] = gen_rtx_raw_REG (DFmode, REGNO (operands[0]));
- operands[3] = gen_rtx_raw_REG (DFmode, REGNO (operands[1]));
- operands[4] = gen_rtx_raw_REG (DFmode, REGNO (operands[0]) + 2);
- operands[5] = gen_rtx_raw_REG (DFmode, REGNO (operands[1]) + 2);"
- [(set_attr "type" "fpmove,*")
- (set_attr "length" "*,2")
- (set_attr "fptype" "double,*")])
+(define_insn_and_split "*abstf2"
+ [(set (match_operand:TF 0 "register_operand" "=e")
+ (abs:TF (match_operand:TF 1 "register_operand" "e")))]
+ "TARGET_FPU && !TARGET_HARD_QUAD"
+ "#"
+ "&& reload_completed"
+ [(clobber (const_int 0))]
+{
+ rtx set_dest = operands[0];
+ rtx set_src = operands[1];
+ rtx dest1, dest2;
+ rtx src1, src2;
+
+ dest1 = gen_df_reg (set_dest, 0);
+ dest2 = gen_df_reg (set_dest, 1);
+ src1 = gen_df_reg (set_src, 0);
+ src2 = gen_df_reg (set_src, 1);
+
+ /* Now emit using the real source and destination we found, swapping
+ the order if we detect overlap. */
+ if (reg_overlap_mentioned_p (dest1, src2))
+ {
+ emit_insn (gen_movdf (dest2, src2));
+ emit_insn (gen_absdf2 (dest1, src1));
+ }
+ else
+ {
+ emit_insn (gen_absdf2 (dest1, src1));
+ if (REGNO (dest2) != REGNO (src2))
+ emit_insn (gen_movdf (dest2, src2));
+ }
+ DONE;
+}
+ [(set_attr "length" "2")])
(define_expand "absdf2"
[(set (match_operand:DF 0 "register_operand" "")
"")
(define_insn_and_split "*absdf2_notv9"
- [(set (match_operand:DF 0 "register_operand" "=e,e")
- (abs:DF (match_operand:DF 1 "register_operand" "0,e")))]
- "TARGET_FPU && ! TARGET_V9"
- "@
- fabss\t%0, %0
- #"
- "&& reload_completed
- && sparc_absnegfloat_split_legitimate (operands[0], operands[1])"
- [(set (match_dup 2) (abs:SF (match_dup 3)))
- (set (match_dup 4) (match_dup 5))]
- "operands[2] = gen_rtx_raw_REG (SFmode, REGNO (operands[0]));
- operands[3] = gen_rtx_raw_REG (SFmode, REGNO (operands[1]));
- operands[4] = gen_rtx_raw_REG (SFmode, REGNO (operands[0]) + 1);
- operands[5] = gen_rtx_raw_REG (SFmode, REGNO (operands[1]) + 1);"
- [(set_attr "type" "fpmove,*")
- (set_attr "length" "*,2")])
+ [(set (match_operand:DF 0 "register_operand" "=e")
+ (abs:DF (match_operand:DF 1 "register_operand" "e")))]
+ "TARGET_FPU && !TARGET_V9"
+ "#"
+ "&& reload_completed"
+ [(clobber (const_int 0))]
+{
+ rtx set_dest = operands[0];
+ rtx set_src = operands[1];
+ rtx dest1, dest2;
+ rtx src1, src2;
+
+ dest1 = gen_highpart (SFmode, set_dest);
+ dest2 = gen_lowpart (SFmode, set_dest);
+ src1 = gen_highpart (SFmode, set_src);
+ src2 = gen_lowpart (SFmode, set_src);
+
+ /* Now emit using the real source and destination we found, swapping
+ the order if we detect overlap. */
+ if (reg_overlap_mentioned_p (dest1, src2))
+ {
+ emit_insn (gen_movsf (dest2, src2));
+ emit_insn (gen_abssf2 (dest1, src1));
+ }
+ else
+ {
+ emit_insn (gen_abssf2 (dest1, src1));
+ if (REGNO (dest2) != REGNO (src2))
+ emit_insn (gen_movsf (dest2, src2));
+ }
+ DONE;
+}
+ [(set_attr "length" "2")])
(define_insn "*absdf2_v9"
[(set (match_operand:DF 0 "register_operand" "=e")
}
[(set_attr "type" "shift")])
-(define_insn "*ashlsi3_extend"
- [(set (match_operand:DI 0 "register_operand" "=r")
- (zero_extend:DI
- (ashift:SI (match_operand:SI 1 "register_operand" "r")
- (match_operand:SI 2 "arith_operand" "rI"))))]
- "TARGET_ARCH64"
-{
- if (GET_CODE (operands[2]) == CONST_INT)
- operands[2] = GEN_INT (INTVAL (operands[2]) & 0x1f);
- return "sll\t%1, %2, %0";
-}
- [(set_attr "type" "shift")])
-
(define_expand "ashldi3"
[(set (match_operand:DI 0 "register_operand" "=r")
(ashift:DI (match_operand:DI 1 "register_operand" "r")
Target
Optimize tail call instructions in assembler and linker
+muser-mode
+Target Report Mask(USER_MODE)
+Do not generate code that can only run in supervisor mode
+
mcpu=
Target RejectNegative Joined Var(sparc_cpu_and_features) Enum(sparc_processor_type) Init(PROCESSOR_V7)
Use features of and schedule code for given CPU
[(match_operand:I48MODE 2 "register_operand" "r")
(match_operand:I48MODE 3 "register_operand" "0")]
UNSPECV_CAS))]
- "(TARGET_V9 || TARGET_LEON3) && (<MODE>mode != DImode || TARGET_ARCH64)"
+ "TARGET_V9 && (<MODE>mode != DImode || TARGET_ARCH64)"
"cas<modesuffix>\t%1, %2, %0"
[(set_attr "type" "multi")])
+(define_insn "*atomic_compare_and_swap_leon3_1"
+ [(set (match_operand:SI 0 "register_operand" "=r")
+ (match_operand:SI 1 "mem_noofs_operand" "+w"))
+ (set (match_dup 1)
+ (unspec_volatile:SI
+ [(match_operand:SI 2 "register_operand" "r")
+ (match_operand:SI 3 "register_operand" "0")]
+ UNSPECV_CAS))]
+ "TARGET_LEON3"
+{
+ if (TARGET_USER_MODE)
+ return "casa\t%1 0xa, %2, %0"; /* ASI for user data space. */
+ else
+ return "casa\t%1 0xb, %2, %0"; /* ASI for supervisor data space. */
+}
+ [(set_attr "type" "multi")])
+
(define_insn "*atomic_compare_and_swapdi_v8plus"
[(set (match_operand:DI 0 "register_operand" "=h")
(match_operand:DI 1 "mem_noofs_operand" "+w"))
sol2.o: $(srcdir)/config/sol2.c
$(COMPILE) $<
$(POSTCOMPILE)
+
+# Install clearcap.map if present.
+install: install-clearcap-map
+
+# Ignore failures: file only exists if linker supports it.
+install-clearcap-map:
+ -$(INSTALL_DATA) clearcap.map $(DESTDIR)$(libdir)
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with GCC; see the file COPYING3. If not see
+ Under Section 7 of GPL version 3, you are granted additional
+ permissions described in the GCC Runtime Library Exception, version
+ 3.1, as published by the Free Software Foundation.
+
+ You should have received a copy of the GNU General Public License and
+ a copy of the GCC Runtime Library Exception along with this program;
+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
/* Specify predefined symbols in preprocessor. */
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with GCC; see the file COPYING3. If not see
+ Under Section 7 of GPL version 3, you are granted additional
+ permissions described in the GCC Runtime Library Exception, version
+ 3.1, as published by the Free Software Foundation.
+
+ You should have received a copy of the GNU General Public License and
+ a copy of the GCC Runtime Library Exception along with this program;
+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
#ifndef V850_OPTS_H
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with GCC; see the file COPYING3. If not see
+ Under Section 7 of GPL version 3, you are granted additional
+ permissions described in the GCC Runtime Library Exception, version
+ 3.1, as published by the Free Software Foundation.
+
+ You should have received a copy of the GNU General Public License and
+ a copy of the GCC Runtime Library Exception along with this program;
+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
#ifndef GCC_V850_H
.align 4
smac %g2, %g3, %g1
umac %g2, %g3, %g1
- cas [%g2], %g3, %g1' > conftest.s
+ casa [%g2] 0xb, %g3, %g1' > conftest.s
if { ac_try='$gcc_cv_as $gcc_cv_as_flags -Aleon -o conftest.o conftest.s >&5'
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
(eval $ac_try) 2>&5
fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking linker mapfile support for clearing hardware capabilities" >&5
+$as_echo_n "checking linker mapfile support for clearing hardware capabilities... " >&6; }
+saved_LDFLAGS="$LDFLAGS"
+for clearcap_map in sol2-clearcapv2.map sol2-clearcap.map; do
+ LDFLAGS="$saved_LDFLAGS -Wl,-M,${srcdir}/config/$clearcap_map"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+int main(void) {return 0;}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ gcc_cv_ld_clearcap=yes; break
+else
+ gcc_cv_ld_clearcap=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+done
+LDFLAGS="$saved_LDFLAGS"
+if test "x$gcc_cv_ld_clearcap" = xyes; then
+
+$as_echo "#define HAVE_LD_CLEARCAP 1" >>confdefs.h
+
+ ac_config_links="$ac_config_links clearcap.map:${srcdir}/config/$clearcap_map"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_ld_clearcap" >&5
+$as_echo "$gcc_cv_ld_clearcap" >&6; }
+
case "$target:$tm_file" in
powerpc64-*-freebsd* | powerpc64*-*-linux* | powerpc*-*-linux*rs6000/biarch64.h*)
case "$target" in
# Files that config.status was made for.
config_files="$ac_config_files"
config_headers="$ac_config_headers"
+config_links="$ac_config_links"
config_commands="$ac_config_commands"
_ACEOF
Configuration headers:
$config_headers
+Configuration links:
+$config_links
+
Configuration commands:
$config_commands
"as") CONFIG_FILES="$CONFIG_FILES as:exec-tool.in" ;;
"collect-ld") CONFIG_FILES="$CONFIG_FILES collect-ld:exec-tool.in" ;;
"nm") CONFIG_FILES="$CONFIG_FILES nm:exec-tool.in" ;;
+ "clearcap.map") CONFIG_LINKS="$CONFIG_LINKS clearcap.map:${srcdir}/config/$clearcap_map" ;;
"$all_outputs") CONFIG_FILES="$CONFIG_FILES $all_outputs" ;;
"default") CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;;
if $ac_need_defaults; then
test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+ test "${CONFIG_LINKS+set}" = set || CONFIG_LINKS=$config_links
test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
fi
fi # test -n "$CONFIG_HEADERS"
-eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS"
+eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :L $CONFIG_LINKS :C $CONFIG_COMMANDS"
shift
for ac_tag
do
|| as_fn_error "could not create -" "$LINENO" 5
fi
;;
+ :L)
+ #
+ # CONFIG_LINK
+ #
+
+ if test "$ac_source" = "$ac_file" && test "$srcdir" = '.'; then
+ :
+ else
+ # Prefer the file from the source tree if names are identical.
+ if test "$ac_source" = "$ac_file" || test ! -r "$ac_source"; then
+ ac_source=$srcdir/$ac_source
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: linking $ac_source to $ac_file" >&5
+$as_echo "$as_me: linking $ac_source to $ac_file" >&6;}
+
+ if test ! -r "$ac_source"; then
+ as_fn_error "$ac_source: file not found" "$LINENO" 5
+ fi
+ rm -f "$ac_file"
+
+ # Try a relative symlink, then a hard link, then a copy.
+ case $srcdir in
+ [\\/$]* | ?:[\\/]* ) ac_rel_source=$ac_source ;;
+ *) ac_rel_source=$ac_top_build_prefix$ac_source ;;
+ esac
+ ln -s "$ac_rel_source" "$ac_file" 2>/dev/null ||
+ ln "$ac_source" "$ac_file" 2>/dev/null ||
+ cp -p "$ac_source" "$ac_file" ||
+ as_fn_error "cannot link or copy $ac_source to $ac_file" "$LINENO" 5
+ fi
+ ;;
:C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
$as_echo "$as_me: executing $ac_file commands" >&6;}
;;
.align 4
smac %g2, %g3, %g1
umac %g2, %g3, %g1
- cas [[%g2]], %g3, %g1],,
+ casa [[%g2]] 0xb, %g3, %g1],,
[AC_DEFINE(HAVE_AS_LEON, 1,
[Define if your assembler supports LEON instructions.])])
;;
[Define to the linker option to keep unused dependencies.])
fi
+AC_MSG_CHECKING(linker mapfile support for clearing hardware capabilities)
+saved_LDFLAGS="$LDFLAGS"
+for clearcap_map in sol2-clearcapv2.map sol2-clearcap.map; do
+ LDFLAGS="$saved_LDFLAGS -Wl,-M,${srcdir}/config/$clearcap_map"
+ AC_LINK_IFELSE([int main(void) {return 0;}],
+ [gcc_cv_ld_clearcap=yes; break], [gcc_cv_ld_clearcap=no])
+done
+LDFLAGS="$saved_LDFLAGS"
+if test "x$gcc_cv_ld_clearcap" = xyes; then
+ AC_DEFINE([HAVE_LD_CLEARCAP], 1,
+[Define if the linker supports clearing hardware capabilities via mapfile.])
+ AC_CONFIG_LINKS([clearcap.map:${srcdir}/config/$clearcap_map])
+fi
+AC_MSG_RESULT($gcc_cv_ld_clearcap)
+
case "$target:$tm_file" in
powerpc64-*-freebsd* | powerpc64*-*-linux* | powerpc*-*-linux*rs6000/biarch64.h*)
case "$target" in
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
+2014-07-13 Jason Merrill <jason@redhat.com>
+
+ PR c++/58636
+ * call.c (build_list_conv): Don't try to build a list of references.
+
+2014-07-10 Jason Merrill <jason@redhat.com>
+
+ PR c++/61661
+ * semantics.c (reduced_constant_expression_p): Handle CONSTRUCTOR.
+
+2014-07-01 Paul Pluzhnikov <ppluzhnikov@google.com>
+
+ PR c++/58753
+ PR c++/58930
+ PR c++/58704
+
+ Backported from mainline
+ 2014-05-20 Paolo Carlini <paolo.carlini@oracle.com>
+
+ * typeck2.c (digest_nsdmi_init): New.
+ * parser.c (cp_parser_late_parse_one_default_arg): Use it.
+ * init.c (get_nsdmi): Likewise.
+ * cp-tree.h (digest_nsdmi_init): Declare.
+
+2014-06-30 Edward Smith-Rowland <3dw4rd@verizon.net>
+
+ PR c++/58781
+ PR c++/60249
+ PR c++/59867
+ * parser.c (cp_parser_userdef_string_literal()): Take a tree
+ not a cp_token*. (cp_parser_string_literal(): Don't hack
+ the token stream!
+
+2014-06-30 Jason Merrill <jason@redhat.com>
+
+ PR c++/61647
+ * pt.c (type_dependent_expression_p): Check BASELINK_OPTYPE.
+
+ PR c++/61566
+ * mangle.c (decl_mangling_context): Look through a TEMPLATE_DECL.
+
+2014-06-30 Jakub Jelinek <jakub@redhat.com>
+
+ Backported from mainline
+ 2014-06-25 Jakub Jelinek <jakub@redhat.com>
+
+ * semantics.c (finish_omp_clauses): Make sure
+ OMP_CLAUSE_LINEAR_STEP has correct type.
+
+ 2014-06-18 Jakub Jelinek <jakub@redhat.com>
+
+ * cp-gimplify.c (cxx_omp_finish_clause): Add a gimple_seq *
+ argument.
+ * cp-tree.h (cxx_omp_finish_clause): Adjust prototype.
+
+2014-06-30 Jason Merrill <jason@redhat.com>
+
+ PR c++/61539
+ * pt.c (unify_one_argument): Type/expression mismatch just causes
+ deduction failure.
+
+ DR 1030
+ PR c++/51253
+ PR c++/61382
+ * cp-tree.h (CALL_EXPR_LIST_INIT_P): New.
+ * call.c (struct z_candidate): Add flags field.
+ (add_candidate): Add flags parm.
+ (add_function_candidate, add_conv_candidate, build_builtin_candidate)
+ (add_template_candidate_real): Pass it.
+ (build_over_call): Set CALL_EXPR_LIST_INIT_P.
+ * tree.c (build_aggr_init_expr): Copy it.
+ * semantics.c (simplify_aggr_init_expr): Copy it.
+ * cp-gimplify.c (cp_gimplify_expr): Handle it.
+
+ PR c++/61488
+ * pt.c (check_valid_ptrmem_cst_expr): Fix for template context.
+
+ PR c++/61500
+ * tree.c (lvalue_kind): Handle MEMBER_REF and DOTSTAR_EXPR.
+
+2014-06-30 Igor Zamyatin <igor.zamyatin@intel.com>
+
+ PR middle-end/57541
+ * cp-array-notation.c (expand_sec_reduce_builtin):
+ Check that bultin argument is correct.
+ * call.c (build_cxx_call): Check for 0 arguments in builtin call.
+
+2014-06-27 Jason Merrill <jason@redhat.com>
+
+ PR c++/61433
+ * error.c (dump_template_bindings): Don't tsubst in a clone.
+
+2014-06-27 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/61614
+ * semantics.c (finish_compound_literal): Revert r204228.
+
+2014-06-26 Adam Butcher <adam@jessamine.co.uk>
+
+ PR c++/61537
+ * parser.c (cp_parser_elaborated_type_specifier): Only consider template
+ parameter lists outside of function parameter scope.
+
+2014-06-25 Jason Merrill <jason@redhat.com>
+
+ PR c++/61242
+ * call.c (build_aggr_conv): Ignore passed in flags.
+ (build_array_conv, build_complex_conv): Likewise.
+
+2014-06-24 Jakub Jelinek <jakub@redhat.com>
+
+ * parser.c (cp_parser_omp_for_loop): For
+ #pragma omp parallel for simd move lastprivate clause from parallel
+ to for rather than simd.
+
+2014-06-20 Jason Merrill <jason@redhat.com>
+
+ PR c++/59296
+ * call.c (add_function_candidate): Avoid special 'this' handling
+ if we have a ref-qualifier.
+
+ PR c++/61556
+ * call.c (build_over_call): Call build_this in template path.
+
+2014-06-19 Jason Merrill <jason@redhat.com>
+
+ PR c++/59296
+ * call.c (add_function_candidate): Set LOOKUP_NO_RVAL_BIND
+ |LOOKUP_NO_TEMP_BIND for ref-qualifier handling.
+
+ PR c++/61507
+ * pt.c (resolve_overloaded_unification): Preserve
+ ARGUMENT_PACK_EXPLICIT_ARGS.
+
+2014-06-18 Jason Merrill <jason@redhat.com>
+
+ PR c++/60605
+ * pt.c (check_default_tmpl_args): Check DECL_LOCAL_FUNCTION_P.
+
+2014-06-18 Siva Chandra Reddy <sivachandra@google.com>
+
+ PR debug/57519
+ * class.c (handle_using_decl): Pass the correct scope to
+ cp_emit_debug_info_for_using.
+
+2014-06-09 Jason Merrill <jason@redhat.com>
+
+ PR c++/61343
+ * decl.c (check_initializer): Maybe clear
+ DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P.
+
+2014-06-04 Igor Zamyatin <igor.zamyatin@intel.com>
+
+ PR c/58942
+ * c-c++-common/cilk-plus/AN/pr58942.c: Check for correct handling of
+ the case with a pointer.
+
+2014-06-02 Jason Merrill <jason@redhat.com>
+
+ PR c++/61134
+ * pt.c (pack_deducible_p): Handle canonicalization.
+
+2014-05-21 Igor Zamyatin <igor.zamyatin@intel.com>
+
+ PR c/60189
+ * parser.c (cp_parser_postfix_expression): Move handling of cilk_sync
+ from here to...
+ (cp_parser_statement): ...here. Make sure only semicolon can go after
+ Cilk_sync.
+
+2014-05-13 Jason Merrill <jason@redhat.com>
+
+ PR c++/61151
+ * lambda.c (is_this): Allow capture proxies too.
+
+ DR 5
+ PR c++/60019
+ * call.c (build_user_type_conversion_1): The copy-init temporary
+ is cv-unqualified.
+
+2014-05-07 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/61083
+ * pt.c (convert_nontype_argument): Protect all the error calls
+ with complain & tf_error.
+
+2014-05-06 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/60999
+ * pt.c (maybe_begin_member_template_processing): Use
+ uses_template_parms.
+
+2014-05-02 Jason Merrill <jason@redhat.com>
+
+ PR c++/60992
+ * lambda.c (lambda_capture_field_type): Wrap anything dependent
+ other than 'this' or a VLA.
+ (is_this): New.
+ * pt.c (tsubst_copy) [VAR_DECL]: Also build a new VAR_DECL if
+ the operand was static or constant.
+
+2014-04-30 Jason Merrill <jason@redhat.com>
+
+ PR c++/60980
+ * init.c (build_value_init): Don't try to call an array constructor.
+
+ PR c++/60951
+ * typeck2.c (massage_init_elt): Use maybe_constant_init.
+
+2014-04-24 Jakub Jelinek <jakub@redhat.com>
+
+ * parser.c (cp_parser_omp_atomic): Allow seq_cst before
+ atomic-clause, allow comma in between atomic-clause and
+ seq_cst.
+
+2014-04-22 Jakub Jelinek <jakub@redhat.com>
+
+ PR c/59073
+ * parser.c (cp_parser_omp_parallel): If cp_parser_omp_for
+ fails, don't set OM_PARALLEL_COMBINED and return NULL.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
static void maybe_handle_implicit_object (conversion **);
static struct z_candidate *add_candidate
(struct z_candidate **, tree, tree, const vec<tree, va_gc> *, size_t,
- conversion **, tree, tree, int, struct rejection_reason *);
+ conversion **, tree, tree, int, struct rejection_reason *, int);
static tree source_type (conversion *);
static void add_warning (struct z_candidate *, struct z_candidate *);
static bool reference_compatible_p (tree, tree);
sequence from the type returned by FN to the desired destination
type. */
conversion *second_conv;
- int viable;
struct rejection_reason *reason;
/* If FN is a member function, the binfo indicating the path used to
qualify the name of FN at the call site. This path is used to
tree explicit_targs;
candidate_warning *warnings;
z_candidate *next;
+ int viable;
+
+ /* The flags active in add_candidate. */
+ int flags;
};
/* Returns true iff T is a null pointer constant in the sense of
/* But no narrowing conversions. */
flags |= LOOKUP_NO_NARROWING;
+ /* Can't make an array of these types. */
+ if (TREE_CODE (elttype) == REFERENCE_TYPE
+ || TREE_CODE (elttype) == FUNCTION_TYPE
+ || VOID_TYPE_P (elttype))
+ return NULL;
+
FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (ctor), i, val)
{
conversion *sub
if (ctor == error_mark_node)
return NULL;
- flags |= LOOKUP_NO_NARROWING;
+ /* The conversions within the init-list aren't affected by the enclosing
+ context; they're always simple copy-initialization. */
+ flags = LOOKUP_IMPLICIT|LOOKUP_NO_NARROWING;
for (; field; field = next_initializable_field (DECL_CHAIN (field)))
{
return NULL;
}
+ flags = LOOKUP_IMPLICIT|LOOKUP_NO_NARROWING;
+
FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (ctor), i, val)
{
conversion *sub
if (len != 2)
return NULL;
+ flags = LOOKUP_IMPLICIT|LOOKUP_NO_NARROWING;
+
FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (ctor), i, val)
{
conversion *sub
tree fn, tree first_arg, const vec<tree, va_gc> *args,
size_t num_convs, conversion **convs,
tree access_path, tree conversion_path,
- int viable, struct rejection_reason *reason)
+ int viable, struct rejection_reason *reason,
+ int flags)
{
struct z_candidate *cand = (struct z_candidate *)
conversion_obstack_alloc (sizeof (struct z_candidate));
cand->viable = viable;
cand->reason = reason;
cand->next = *candidates;
+ cand->flags = flags;
*candidates = cand;
return cand;
object parameter has reference type. */
bool rv = FUNCTION_RVALUE_QUALIFIED (TREE_TYPE (fn));
parmtype = cp_build_reference_type (parmtype, rv);
+ /* The special handling of 'this' conversions in compare_ics
+ does not apply if there is a ref-qualifier. */
+ is_this = false;
}
else
{
out:
return add_candidate (candidates, fn, orig_first_arg, args, len, convs,
- access_path, conversion_path, viable, reason);
+ access_path, conversion_path, viable, reason, flags);
}
/* Create an overload candidate for the conversion function FN which will
}
return add_candidate (candidates, totype, first_arg, arglist, len, convs,
- access_path, conversion_path, viable, reason);
+ access_path, conversion_path, viable, reason, flags);
}
static void
num_convs, convs,
/*access_path=*/NULL_TREE,
/*conversion_path=*/NULL_TREE,
- viable, reason);
+ viable, reason, flags);
}
static bool
return cand;
fail:
return add_candidate (candidates, tmpl, first_arg, arglist, nargs, NULL,
- access_path, conversion_path, 0, reason);
+ access_path, conversion_path, 0, reason, flags);
}
return cand;
}
+ tree convtype;
+ if (!DECL_CONSTRUCTOR_P (cand->fn))
+ convtype = non_reference (TREE_TYPE (TREE_TYPE (cand->fn)));
+ else if (cand->second_conv->kind == ck_rvalue)
+ /* DR 5: [in the first step of copy-initialization]...if the function
+ is a constructor, the call initializes a temporary of the
+ cv-unqualified version of the destination type. */
+ convtype = cv_unqualified (totype);
+ else
+ convtype = totype;
/* Build the user conversion sequence. */
conv = build_conv
(ck_user,
- (DECL_CONSTRUCTOR_P (cand->fn)
- ? totype : non_reference (TREE_TYPE (TREE_TYPE (cand->fn)))),
+ convtype,
build_identity_conv (TREE_TYPE (expr), expr));
conv->cand = cand;
if (cand->viable == -1)
++nargs;
alcarray = XALLOCAVEC (tree, nargs);
- alcarray[0] = first_arg;
+ alcarray[0] = build_this (first_arg);
FOR_EACH_VEC_SAFE_ELT (args, ix, arg)
alcarray[ix + 1] = arg;
argarray = alcarray;
return error_mark_node;
}
- return build_cxx_call (fn, nargs, argarray, complain|decltype_flag);
+ tree call = build_cxx_call (fn, nargs, argarray, complain|decltype_flag);
+ if (TREE_CODE (call) == CALL_EXPR
+ && (cand->flags & LOOKUP_LIST_INIT_CTOR))
+ CALL_EXPR_LIST_INIT_P (call) = true;
+ return call;
}
/* Build and return a call to FN, using NARGS arguments in ARGARRAY.
|| bif == BUILT_IN_CILKPLUS_SEC_REDUCE
|| bif == BUILT_IN_CILKPLUS_SEC_REDUCE_MUTATING)
{
+ if (call_expr_nargs (fn) == 0)
+ {
+ error_at (EXPR_LOCATION (fn), "Invalid builtin arguments");
+ return error_mark_node;
+ }
/* for bif == BUILT_IN_CILKPLUS_SEC_REDUCE_ALL_ZERO or
BUILT_IN_CILKPLUS_SEC_REDUCE_ANY_ZERO or
BUILT_IN_CILKPLUS_SEC_REDUCE_ANY_NONZERO or
/* [over.ics.rank]
--S1 and S2 are reference bindings (_dcl.init.ref_) and neither refers
- to an implicit object parameter, and either S1 binds an lvalue reference
- to an lvalue and S2 binds an rvalue reference or S1 binds an rvalue
- reference to an rvalue and S2 binds an lvalue reference
- (C++0x draft standard, 13.3.3.2)
+ to an implicit object parameter of a non-static member function
+ declared without a ref-qualifier, and either S1 binds an lvalue
+ reference to an lvalue and S2 binds an rvalue reference or S1 binds an
+ rvalue reference to an rvalue and S2 binds an lvalue reference (C++0x
+ draft standard, 13.3.3.2)
--S1 and S2 are reference bindings (_dcl.init.ref_), and the
types to which the references refer are the same type except for
old_value = NULL_TREE;
}
- cp_emit_debug_info_for_using (decl, USING_DECL_SCOPE (using_decl));
+ cp_emit_debug_info_for_using (decl, t);
if (is_overloaded_fn (decl))
flist = decl;
if (!find_rank (location, an_builtin_fn, an_builtin_fn, true, &rank))
return error_mark_node;
if (rank == 0)
- return an_builtin_fn;
+ {
+ error_at (location, "Invalid builtin arguments");
+ return error_mark_node;
+ }
else if (rank > 1
&& (an_type == BUILT_IN_CILKPLUS_SEC_REDUCE_MAX_IND
|| an_type == BUILT_IN_CILKPLUS_SEC_REDUCE_MIN_IND))
array_ind_value = get_temp_regvar (TREE_TYPE (func_parm), func_parm);
array_op0 = (*array_operand)[0];
+ if (TREE_CODE (array_op0) == INDIRECT_REF)
+ array_op0 = TREE_OPERAND (array_op0, 0);
switch (an_type)
{
case BUILT_IN_CILKPLUS_SEC_REDUCE_ADD:
&& !seen_error ())
return (enum gimplify_status) gimplify_cilk_spawn (expr_p);
+ /* DR 1030 says that we need to evaluate the elements of an
+ initializer-list in forward order even when it's used as arguments to
+ a constructor. So if the target wants to evaluate them in reverse
+ order and there's more than one argument other than 'this', gimplify
+ them in order. */
+ ret = GS_OK;
+ if (PUSH_ARGS_REVERSED && CALL_EXPR_LIST_INIT_P (*expr_p)
+ && call_expr_nargs (*expr_p) > 2)
+ {
+ int nargs = call_expr_nargs (*expr_p);
+ location_t loc = EXPR_LOC_OR_LOC (*expr_p, input_location);
+ for (int i = 1; i < nargs; ++i)
+ {
+ enum gimplify_status t
+ = gimplify_arg (&CALL_EXPR_ARG (*expr_p, i), pre_p, loc);
+ if (t == GS_ERROR)
+ ret = GS_ERROR;
+ }
+ }
+ break;
+
default:
ret = (enum gimplify_status) c_gimplify_expr (expr_p, pre_p, post_p);
break;
/* Finalize an implicitly determined clause. */
void
-cxx_omp_finish_clause (tree c)
+cxx_omp_finish_clause (tree c, gimple_seq *)
{
tree decl, inner_type;
bool make_shared = false;
FNDECL_USED_AUTO (in FUNCTION_DECL)
DECLTYPE_FOR_LAMBDA_PROXY (in DECLTYPE_TYPE)
REF_PARENTHESIZED_P (in COMPONENT_REF, SCOPE_REF)
+ AGGR_INIT_ZERO_FIRST (in AGGR_INIT_EXPR)
3: (TREE_REFERENCE_EXPR) (in NON_LVALUE_EXPR) (commented-out).
ICS_BAD_FLAG (in _CONV)
FN_TRY_BLOCK_P (in TRY_BLOCK)
IDENTIFIER_CTOR_OR_DTOR_P (in IDENTIFIER_NODE)
BIND_EXPR_BODY_BLOCK (in BIND_EXPR)
DECL_NON_TRIVIALLY_INITIALIZED_P (in VAR_DECL)
+ CALL_EXPR_LIST_INIT_P (in CALL_EXPR, AGGR_INIT_EXPR)
4: TREE_HAS_CONSTRUCTOR (in INDIRECT_REF, SAVE_EXPR, CONSTRUCTOR,
or FIELD_DECL).
IDENTIFIER_TYPENAME_P (in IDENTIFIER_NODE)
should be performed at instantiation time. */
#define KOENIG_LOOKUP_P(NODE) TREE_LANG_FLAG_0 (CALL_EXPR_CHECK (NODE))
+/* True if CALL_EXPR expresses list-initialization of an object. */
+#define CALL_EXPR_LIST_INIT_P(NODE) \
+ TREE_LANG_FLAG_3 (TREE_CHECK2 ((NODE),CALL_EXPR,AGGR_INIT_EXPR))
+
/* Indicates whether a string literal has been parenthesized. Such
usages are disallowed in certain circumstances. */
B b{1,2}, not B b({1,2}) or B b = {1,2}. */
#define CONSTRUCTOR_IS_DIRECT_INIT(NODE) (TREE_LANG_FLAG_0 (CONSTRUCTOR_CHECK (NODE)))
+#define DIRECT_LIST_INIT_P(NODE) \
+ (BRACE_ENCLOSED_INITIALIZER_P (NODE) && CONSTRUCTOR_IS_DIRECT_INIT (NODE))
+
/* True if NODE represents a conversion for direct-initialization in a
template. Set by perform_implicit_conversion_flags. */
#define IMPLICIT_CONV_EXPR_DIRECT_INIT(NODE) \
PARM_DECLs in cp_tree_equal. */
extern int comparing_specializations;
+/* A type-qualifier, or bitmask therefore, using the TYPE_QUAL
+ constants. */
+
+typedef int cp_cv_quals;
+
/* In parser.c. */
/* Nonzero if we are parsing an unevaluated operand: an operand to
extern int cp_unevaluated_operand;
extern tree cp_convert_range_for (tree, tree, tree, bool);
extern bool parsing_nsdmi (void);
+extern void inject_this_parameter (tree, cp_cv_quals);
/* in pt.c */
extern GTY(()) operator_name_info_t assignment_operator_name_info
[(int) MAX_TREE_CODES];
-/* A type-qualifier, or bitmask therefore, using the TYPE_QUAL
- constants. */
-
-typedef int cp_cv_quals;
-
/* Non-static member functions have an optional virt-specifier-seq.
There is a VIRT_SPEC value for each virt-specifier.
They can be combined by bitwise-or to form the complete set of
extern tree build_zero_init (tree, tree, bool);
extern tree build_value_init (tree, tsubst_flags_t);
extern tree build_value_init_noctor (tree, tsubst_flags_t);
+extern tree get_nsdmi (tree, bool);
extern tree build_offset_ref (tree, tree, bool,
tsubst_flags_t);
extern tree throw_bad_array_new_length (void);
extern void check_narrowing (tree, tree);
extern tree digest_init (tree, tree, tsubst_flags_t);
extern tree digest_init_flags (tree, tree, int);
+extern tree digest_nsdmi_init (tree, tree);
extern tree build_scoped_ref (tree, tree, tree *);
extern tree build_x_arrow (location_t, tree,
tsubst_flags_t);
extern tree cxx_omp_clause_copy_ctor (tree, tree, tree);
extern tree cxx_omp_clause_assign_op (tree, tree, tree);
extern tree cxx_omp_clause_dtor (tree, tree);
-extern void cxx_omp_finish_clause (tree);
+extern void cxx_omp_finish_clause (tree, gimple_seq *);
extern bool cxx_omp_privatize_by_reference (const_tree);
/* in name-lookup.c */
if (init && init != error_mark_node)
init_code = build2 (INIT_EXPR, type, decl, init);
+ if (init_code)
+ {
+ /* We might have set these in cp_finish_decl. */
+ DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl) = false;
+ TREE_CONSTANT (decl) = false;
+ }
+
if (init_code && DECL_IN_AGGR_P (decl))
{
static int explained = 0;
if (vec_safe_is_empty (typenames) || uses_template_parms (args))
return;
+ /* Don't try to print typenames when we're processing a clone. */
+ if (current_function_decl
+ && !DECL_LANG_SPECIFIC (current_function_decl))
+ return;
+
FOR_EACH_VEC_SAFE_ELT (typenames, i, t)
{
if (need_semicolon)
gcc_assert (!processing_template_decl
|| (SCALAR_TYPE_P (type) || TREE_CODE (type) == ARRAY_TYPE));
- if (type_build_ctor_call (type))
+ if (CLASS_TYPE_P (type)
+ && type_build_ctor_call (type))
{
tree ctor = build_aggr_init_expr
(type,
}
}
+/* Return the non-static data initializer for FIELD_DECL MEMBER. */
+
+tree
+get_nsdmi (tree member, bool in_ctor)
+{
+ tree init;
+ tree save_ccp = current_class_ptr;
+ tree save_ccr = current_class_ref;
+ if (!in_ctor)
+ inject_this_parameter (DECL_CONTEXT (member), TYPE_UNQUALIFIED);
+ if (DECL_LANG_SPECIFIC (member) && DECL_TEMPLATE_INFO (member))
+ {
+ /* Do deferred instantiation of the NSDMI. */
+ init = (tsubst_copy_and_build
+ (DECL_INITIAL (DECL_TI_TEMPLATE (member)),
+ DECL_TI_ARGS (member),
+ tf_warning_or_error, member, /*function_p=*/false,
+ /*integral_constant_expression_p=*/false));
+
+ init = digest_nsdmi_init (member, init);
+ }
+ else
+ {
+ init = DECL_INITIAL (member);
+ if (init && TREE_CODE (init) == DEFAULT_ARG)
+ {
+ error ("constructor required before non-static data member "
+ "for %qD has been parsed", member);
+ DECL_INITIAL (member) = error_mark_node;
+ init = NULL_TREE;
+ }
+ /* Strip redundant TARGET_EXPR so we don't need to remap it, and
+ so the aggregate init code below will see a CONSTRUCTOR. */
+ if (init && TREE_CODE (init) == TARGET_EXPR
+ && !VOID_TYPE_P (TREE_TYPE (TARGET_EXPR_INITIAL (init))))
+ init = TARGET_EXPR_INITIAL (init);
+ init = break_out_target_exprs (init);
+ }
+ current_class_ptr = save_ccp;
+ current_class_ref = save_ccr;
+ return init;
+}
+
/* Initialize MEMBER, a FIELD_DECL, with INIT, a TREE_LIST of
arguments. If TREE_LIST is void_type_node, an empty initializer
list was given; if NULL_TREE no initializer was given. */
/* Use the non-static data member initializer if there was no
mem-initializer for this field. */
if (init == NULL_TREE)
- {
- if (DECL_LANG_SPECIFIC (member) && DECL_TEMPLATE_INFO (member))
- /* Do deferred instantiation of the NSDMI. */
- init = (tsubst_copy_and_build
- (DECL_INITIAL (DECL_TI_TEMPLATE (member)),
- DECL_TI_ARGS (member),
- tf_warning_or_error, member, /*function_p=*/false,
- /*integral_constant_expression_p=*/false));
- else
- {
- init = DECL_INITIAL (member);
- if (init && TREE_CODE (init) == DEFAULT_ARG)
- {
- error ("constructor required before non-static data member "
- "for %qD has been parsed", member);
- init = NULL_TREE;
- }
- /* Strip redundant TARGET_EXPR so we don't need to remap it, and
- so the aggregate init code below will see a CONSTRUCTOR. */
- if (init && TREE_CODE (init) == TARGET_EXPR
- && !VOID_TYPE_P (TREE_TYPE (TARGET_EXPR_INITIAL (init))))
- init = TARGET_EXPR_INITIAL (init);
- init = break_out_target_exprs (init);
- }
- }
+ init = get_nsdmi (member, /*ctor*/true);
if (init == error_mark_node)
return;
return lambda;
}
+static inline bool
+is_this (tree t)
+{
+ return ((TREE_CODE (t) == PARM_DECL
+ || TREE_CODE (t) == VAR_DECL)
+ && DECL_NAME (t) == this_identifier);
+}
+
/* Returns the type to use for the FIELD_DECL corresponding to the
capture of EXPR.
The caller should add REFERENCE_TYPE for capture by reference. */
}
else
type = non_reference (unlowered_expr_type (expr));
- if (!type || WILDCARD_TYPE_P (type) || type_uses_auto (type)
- || DECL_PACK_P (expr))
+ if (type_dependent_expression_p (expr)
+ && !is_this (tree_strip_nop_conversions (expr))
+ && !array_of_runtime_bound_p (type))
{
type = cxx_make_type (DECLTYPE_TYPE);
DECLTYPE_TYPE_EXPR (type) = expr;
if (tcontext != NULL_TREE)
return tcontext;
+ if (TREE_CODE (decl) == TEMPLATE_DECL
+ && DECL_TEMPLATE_RESULT (decl))
+ decl = DECL_TEMPLATE_RESULT (decl);
+
if (TREE_CODE (decl) == TYPE_DECL
&& LAMBDA_TYPE_P (TREE_TYPE (decl)))
{
static tree cp_parser_userdef_char_literal
(cp_parser *);
static tree cp_parser_userdef_string_literal
- (cp_token *);
+ (tree);
static tree cp_parser_userdef_numeric_literal
(cp_parser *);
{
tree literal = build_userdef_literal (suffix_id, value,
OT_NONE, NULL_TREE);
- tok->u.value = literal;
- return cp_parser_userdef_string_literal (tok);
+ value = cp_parser_userdef_string_literal (literal);
}
}
else
as arguments. */
static tree
-cp_parser_userdef_string_literal (cp_token *token)
+cp_parser_userdef_string_literal (tree literal)
{
- tree literal = token->u.value;
tree suffix_id = USERDEF_LITERAL_SUFFIX_ID (literal);
tree name = cp_literal_operator_id (IDENTIFIER_POINTER (suffix_id));
tree value = USERDEF_LITERAL_VALUE (literal);
}
break;
}
-
- case RID_CILK_SYNC:
- if (flag_cilkplus)
- {
- tree sync_expr = build_cilk_sync ();
- SET_EXPR_LOCATION (sync_expr,
- cp_lexer_peek_token (parser->lexer)->location);
- finish_expr_stmt (sync_expr);
- }
- else
- error_at (token->location, "-fcilkplus must be enabled to use"
- " %<_Cilk_sync%>");
- cp_lexer_consume_token (parser->lexer);
- break;
case RID_BUILTIN_SHUFFLE:
{
statement = cp_parser_jump_statement (parser);
break;
+ case RID_CILK_SYNC:
+ cp_lexer_consume_token (parser->lexer);
+ if (flag_cilkplus)
+ {
+ tree sync_expr = build_cilk_sync ();
+ SET_EXPR_LOCATION (sync_expr,
+ token->location);
+ statement = finish_expr_stmt (sync_expr);
+ }
+ else
+ {
+ error_at (token->location, "-fcilkplus must be enabled to use"
+ " %<_Cilk_sync%>");
+ statement = error_mark_node;
+ }
+ cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
+ break;
+
/* Objective-C++ exception-handling constructs. */
case RID_AT_TRY:
case RID_AT_CATCH:
return cp_parser_make_typename_type (parser, parser->scope,
identifier,
token->location);
+
+ /* Template parameter lists apply only if we are not within a
+ function parameter list. */
+ bool template_parm_lists_apply
+ = parser->num_template_parameter_lists;
+ if (template_parm_lists_apply)
+ for (cp_binding_level *s = current_binding_level;
+ s && s->kind != sk_template_parms;
+ s = s->level_chain)
+ if (s->kind == sk_function_parms)
+ template_parm_lists_apply = false;
+
/* Look up a qualified name in the usual way. */
if (parser->scope)
{
decl = (cp_parser_maybe_treat_template_as_class
(decl, /*tag_name_p=*/is_friend
- && parser->num_template_parameter_lists));
+ && template_parm_lists_apply));
if (TREE_CODE (decl) != TYPE_DECL)
{
if (TREE_CODE (TREE_TYPE (decl)) != TYPENAME_TYPE)
{
- bool allow_template = (parser->num_template_parameter_lists
- || DECL_SELF_REFERENCE_P (decl));
- type = check_elaborated_type_specifier (tag_type, decl,
+ bool allow_template = (template_parm_lists_apply
+ || DECL_SELF_REFERENCE_P (decl));
+ type = check_elaborated_type_specifier (tag_type, decl,
allow_template);
if (type == error_mark_node)
ts = ts_global;
template_p =
- (parser->num_template_parameter_lists
+ (template_parm_lists_apply
&& (cp_parser_next_token_starts_class_definition_p (parser)
|| cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON)));
/* An unqualified name was used to reference this type, so
there were no qualifying templates. */
- if (!cp_parser_check_template_parameters (parser,
- /*num_templates=*/0,
- token->location,
- /*declarator=*/NULL))
+ if (template_parm_lists_apply
+ && !cp_parser_check_template_parameters (parser,
+ /*num_templates=*/0,
+ token->location,
+ /*declarator=*/NULL))
return error_mark_node;
type = xref_tag (tag_type, identifier, ts, template_p);
}
/* Used by handling of trailing-return-types and NSDMI, in which 'this'
is in scope even though it isn't real. */
-static void
+void
inject_this_parameter (tree ctype, cp_cv_quals quals)
{
tree this_parm;
ok = false;
}
if (!ok)
- error ("literal operator template %qD has invalid parameter list."
- " Expected non-type template argument pack <char...>"
- " or <typename CharT, CharT...>",
- decl);
+ {
+ if (cxx_dialect >= cxx1y)
+ error ("literal operator template %qD has invalid parameter list."
+ " Expected non-type template argument pack <char...>"
+ " or <typename CharT, CharT...>",
+ decl);
+ else
+ error ("literal operator template %qD has invalid parameter list."
+ " Expected non-type template argument pack <char...>",
+ decl);
+ }
}
/* Register member declarations. */
if (member_p && !friend_p && decl && !DECL_CLASS_TEMPLATE_P (decl))
parsed_arg = check_default_argument (parmtype, parsed_arg,
tf_warning_or_error);
else
- {
- int flags = LOOKUP_IMPLICIT;
- if (BRACE_ENCLOSED_INITIALIZER_P (parsed_arg)
- && CONSTRUCTOR_IS_DIRECT_INIT (parsed_arg))
- flags = LOOKUP_NORMAL;
- parsed_arg = digest_init_flags (TREE_TYPE (decl), parsed_arg, flags);
- if (TREE_CODE (parsed_arg) == TARGET_EXPR)
- /* This represents the whole initialization. */
- TARGET_EXPR_DIRECT_INIT_P (parsed_arg) = true;
- }
+ parsed_arg = digest_nsdmi_init (decl, parsed_arg);
}
/* If the token stream has not been completely used up, then
tree id = cp_lexer_peek_token (parser->lexer)->u.value;
const char *p = IDENTIFIER_POINTER (id);
+ if (!strcmp (p, "seq_cst"))
+ {
+ seq_cst = true;
+ cp_lexer_consume_token (parser->lexer);
+ if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA)
+ && cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_NAME)
+ cp_lexer_consume_token (parser->lexer);
+ }
+ }
+ if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
+ {
+ tree id = cp_lexer_peek_token (parser->lexer)->u.value;
+ const char *p = IDENTIFIER_POINTER (id);
+
if (!strcmp (p, "read"))
code = OMP_ATOMIC_READ;
else if (!strcmp (p, "write"))
if (p)
cp_lexer_consume_token (parser->lexer);
}
-
- if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
+ if (!seq_cst)
{
- tree id = cp_lexer_peek_token (parser->lexer)->u.value;
- const char *p = IDENTIFIER_POINTER (id);
+ if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA)
+ && cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_NAME)
+ cp_lexer_consume_token (parser->lexer);
- if (!strcmp (p, "seq_cst"))
+ if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
{
- seq_cst = true;
- cp_lexer_consume_token (parser->lexer);
+ tree id = cp_lexer_peek_token (parser->lexer)->u.value;
+ const char *p = IDENTIFIER_POINTER (id);
+
+ if (!strcmp (p, "seq_cst"))
+ {
+ seq_cst = true;
+ cp_lexer_consume_token (parser->lexer);
+ }
}
}
cp_parser_require_pragma_eol (parser, pragma_tok);
change it to shared (decl) in OMP_PARALLEL_CLAUSES. */
tree l = build_omp_clause (loc, OMP_CLAUSE_LASTPRIVATE);
OMP_CLAUSE_DECL (l) = real_decl;
- OMP_CLAUSE_CHAIN (l) = clauses;
CP_OMP_CLAUSE_INFO (l) = CP_OMP_CLAUSE_INFO (*c);
- clauses = l;
+ if (code == OMP_SIMD)
+ {
+ OMP_CLAUSE_CHAIN (l) = cclauses[C_OMP_CLAUSE_SPLIT_FOR];
+ cclauses[C_OMP_CLAUSE_SPLIT_FOR] = l;
+ }
+ else
+ {
+ OMP_CLAUSE_CHAIN (l) = clauses;
+ clauses = l;
+ }
OMP_CLAUSE_SET_CODE (*c, OMP_CLAUSE_SHARED);
CP_OMP_CLAUSE_INFO (*c) = NULL;
add_private_clause = false;
return cp_parser_omp_for (parser, pragma_tok, p_name, mask, cclauses);
block = begin_omp_parallel ();
save = cp_parser_begin_omp_structured_block (parser);
- cp_parser_omp_for (parser, pragma_tok, p_name, mask, cclauses);
+ tree ret = cp_parser_omp_for (parser, pragma_tok, p_name, mask, cclauses);
cp_parser_end_omp_structured_block (parser, save);
stmt = finish_omp_parallel (cclauses[C_OMP_CLAUSE_SPLIT_PARALLEL],
block);
+ if (ret == NULL_TREE)
+ return ret;
OMP_PARALLEL_COMBINED (stmt) = 1;
return stmt;
}
bool nsdmi = TREE_CODE (decl) == FIELD_DECL;
if (nsdmi)
- decl = (CLASSTYPE_TEMPLATE_INFO (DECL_CONTEXT (decl))
- ? CLASSTYPE_TI_TEMPLATE (DECL_CONTEXT (decl))
- : NULL_TREE);
+ {
+ tree ctx = DECL_CONTEXT (decl);
+ decl = (CLASSTYPE_TEMPLATE_INFO (ctx)
+ /* Disregard full specializations (c++/60999). */
+ && uses_template_parms (ctx)
+ ? CLASSTYPE_TI_TEMPLATE (ctx) : NULL_TREE);
+ }
if (inline_needs_template_parms (decl, nsdmi))
{
in the template-parameter-list of the definition of a member of a
class template. */
- if (TREE_CODE (CP_DECL_CONTEXT (decl)) == FUNCTION_DECL)
+ if (TREE_CODE (CP_DECL_CONTEXT (decl)) == FUNCTION_DECL
+ || (TREE_CODE (decl) == FUNCTION_DECL && DECL_LOCAL_FUNCTION_P (decl)))
/* You can't have a function template declaration in a local
scope, nor you can you define a member of a class template in a
local scope. */
return true;
if (cxx_dialect >= cxx11 && null_member_pointer_value_p (expr))
return true;
+ if (processing_template_decl
+ && TREE_CODE (expr) == ADDR_EXPR
+ && TREE_CODE (TREE_OPERAND (expr, 0)) == OFFSET_REF)
+ return true;
if (complain & tf_error)
{
error ("%qE is not a valid template argument for type %qT",
{
if (VAR_P (expr))
{
- error ("%qD is not a valid template argument "
- "because %qD is a variable, not the address of "
- "a variable",
- expr, expr);
+ if (complain & tf_error)
+ error ("%qD is not a valid template argument "
+ "because %qD is a variable, not the address of "
+ "a variable", expr, expr);
return NULL_TREE;
}
if (POINTER_TYPE_P (expr_type))
{
- error ("%qE is not a valid template argument for %qT "
- "because it is not the address of a variable",
- expr, type);
+ if (complain & tf_error)
+ error ("%qE is not a valid template argument for %qT "
+ "because it is not the address of a variable",
+ expr, type);
return NULL_TREE;
}
/* Other values, like integer constants, might be valid
? TREE_OPERAND (expr, 0) : expr);
if (!VAR_P (decl))
{
- error ("%qE is not a valid template argument of type %qT "
- "because %qE is not a variable",
- expr, type, decl);
+ if (complain & tf_error)
+ error ("%qE is not a valid template argument of type %qT "
+ "because %qE is not a variable", expr, type, decl);
return NULL_TREE;
}
else if (cxx_dialect < cxx11 && !DECL_EXTERNAL_LINKAGE_P (decl))
{
- error ("%qE is not a valid template argument of type %qT "
- "because %qD does not have external linkage",
- expr, type, decl);
+ if (complain & tf_error)
+ error ("%qE is not a valid template argument of type %qT "
+ "because %qD does not have external linkage",
+ expr, type, decl);
return NULL_TREE;
}
else if (cxx_dialect >= cxx11 && decl_linkage (decl) == lk_none)
{
- error ("%qE is not a valid template argument of type %qT "
- "because %qD has no linkage",
- expr, type, decl);
+ if (complain & tf_error)
+ error ("%qE is not a valid template argument of type %qT "
+ "because %qD has no linkage", expr, type, decl);
return NULL_TREE;
}
}
if (!at_least_as_qualified_p (TREE_TYPE (type), expr_type))
{
- error ("%qE is not a valid template argument for type %qT "
- "because of conflicts in cv-qualification", expr, type);
+ if (complain & tf_error)
+ error ("%qE is not a valid template argument for type %qT "
+ "because of conflicts in cv-qualification", expr, type);
return NULL_TREE;
}
if (!real_lvalue_p (expr))
{
- error ("%qE is not a valid template argument for type %qT "
- "because it is not an lvalue", expr, type);
+ if (complain & tf_error)
+ error ("%qE is not a valid template argument for type %qT "
+ "because it is not an lvalue", expr, type);
return NULL_TREE;
}
expr = TREE_OPERAND (expr, 0);
if (DECL_P (expr))
{
- error ("%q#D is not a valid template argument for type %qT "
- "because a reference variable does not have a constant "
- "address", expr, type);
+ if (complain & tf_error)
+ error ("%q#D is not a valid template argument for type %qT "
+ "because a reference variable does not have a constant "
+ "address", expr, type);
return NULL_TREE;
}
}
if (!DECL_P (expr))
{
- error ("%qE is not a valid template argument for type %qT "
- "because it is not an object with external linkage",
- expr, type);
+ if (complain & tf_error)
+ error ("%qE is not a valid template argument for type %qT "
+ "because it is not an object with external linkage",
+ expr, type);
return NULL_TREE;
}
if (!DECL_EXTERNAL_LINKAGE_P (expr))
{
- error ("%qE is not a valid template argument for type %qT "
- "because object %qD has not external linkage",
- expr, type, expr);
+ if (complain & tf_error)
+ error ("%qE is not a valid template argument for type %qT "
+ "because object %qD has not external linkage",
+ expr, type, expr);
return NULL_TREE;
}
{
if (TREE_CODE (expr) == ADDR_EXPR)
{
- error ("%qE is not a valid template argument for type %qT "
- "because it is a pointer", expr, type);
- inform (input_location, "try using %qE instead", TREE_OPERAND (expr, 0));
+ if (complain & tf_error)
+ {
+ error ("%qE is not a valid template argument for type %qT "
+ "because it is a pointer", expr, type);
+ inform (input_location, "try using %qE instead",
+ TREE_OPERAND (expr, 0));
+ }
return NULL_TREE;
}
provide a superior diagnostic. */
if (!same_type_p (TREE_TYPE (expr), type))
{
- error ("%qE is not a valid template argument for type %qT "
- "because it is of type %qT", expr, type,
- TREE_TYPE (expr));
- /* If we are just one standard conversion off, explain. */
- if (can_convert_standard (type, TREE_TYPE (expr), complain))
- inform (input_location,
- "standard conversions are not allowed in this context");
+ if (complain & tf_error)
+ {
+ error ("%qE is not a valid template argument for type %qT "
+ "because it is of type %qT", expr, type,
+ TREE_TYPE (expr));
+ /* If we are just one standard conversion off, explain. */
+ if (can_convert_standard (type, TREE_TYPE (expr), complain))
+ inform (input_location,
+ "standard conversions are not allowed in this context");
+ }
return NULL_TREE;
}
}
{
if (expr != nullptr_node)
{
- error ("%qE is not a valid template argument for type %qT "
- "because it is of type %qT", expr, type, TREE_TYPE (expr));
+ if (complain & tf_error)
+ error ("%qE is not a valid template argument for type %qT "
+ "because it is of type %qT", expr, type, TREE_TYPE (expr));
return NULL_TREE;
}
return expr;
}
else
{
- /* This can happen for a variable used in a late-specified
- return type of a local lambda. Just make a dummy decl
- since it's only used for its type. */
- if (cp_unevaluated_operand)
- return tsubst_decl (t, args, complain);
- gcc_assert (errorcount || sorrycount);
- return error_mark_node;
+ /* This can happen for a variable used in a
+ late-specified return type of a local lambda, or for a
+ local static or constant. Building a new VAR_DECL
+ should be OK in all those cases. */
+ r = tsubst_decl (t, args, complain);
+ if (decl_constant_var_p (r))
+ /* A use of a local constant must decay to its value. */
+ return integral_constant_value (r);
+ gcc_assert (cp_unevaluated_operand || TREE_STATIC (r)
+ || errorcount || sorrycount);
+ return r;
}
}
}
continue;
for (packs = PACK_EXPANSION_PARAMETER_PACKS (type);
packs; packs = TREE_CHAIN (packs))
- if (TREE_VALUE (packs) == parm)
+ if (template_args_equal (TREE_VALUE (packs), parm))
{
/* The template parameter pack is used in a function parameter
pack. If this is the end of the parameter list, the
maybe_adjust_types_for_deduction (strict, &parm, &arg, arg_expr);
}
else
- gcc_assert ((TYPE_P (parm) || TREE_CODE (parm) == TEMPLATE_DECL)
- == (TYPE_P (arg) || TREE_CODE (arg) == TEMPLATE_DECL));
+ if ((TYPE_P (parm) || TREE_CODE (parm) == TEMPLATE_DECL)
+ != (TYPE_P (arg) || TREE_CODE (arg) == TEMPLATE_DECL))
+ return unify_template_argument_mismatch (explain_p, parm, arg);
/* For deduction from an init-list we need the actual list. */
if (arg_expr && BRACE_ENCLOSED_INITIALIZER_P (arg_expr))
int i = TREE_VEC_LENGTH (targs);
for (; i--; )
if (TREE_VEC_ELT (tempargs, i))
- TREE_VEC_ELT (targs, i) = TREE_VEC_ELT (tempargs, i);
+ {
+ tree old = TREE_VEC_ELT (targs, i);
+ tree new_ = TREE_VEC_ELT (tempargs, i);
+ if (new_ && old && ARGUMENT_PACK_P (old)
+ && ARGUMENT_PACK_EXPLICIT_ARGS (old))
+ /* Don't forget explicit template arguments in a pack. */
+ ARGUMENT_PACK_EXPLICIT_ARGS (new_)
+ = ARGUMENT_PACK_EXPLICIT_ARGS (old);
+ TREE_VEC_ELT (targs, i) = new_;
+ }
}
if (good)
return true;
return true;
if (BASELINK_P (expression))
- expression = BASELINK_FUNCTIONS (expression);
+ {
+ if (BASELINK_OPTYPE (expression)
+ && dependent_type_p (BASELINK_OPTYPE (expression)))
+ return true;
+ expression = BASELINK_FUNCTIONS (expression);
+ }
if (TREE_CODE (expression) == TEMPLATE_ID_EXPR)
{
if ((!at_function_scope_p () || CP_TYPE_CONST_P (type))
&& TREE_CODE (type) == ARRAY_TYPE
&& !TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type)
- && !cp_unevaluated_operand
&& initializer_constant_valid_p (compound_literal, type))
{
tree decl = create_temporary_var (type);
aggr_init_expr_nargs (aggr_init_expr),
AGGR_INIT_EXPR_ARGP (aggr_init_expr));
TREE_NOTHROW (call_expr) = TREE_NOTHROW (aggr_init_expr);
+ CALL_EXPR_LIST_INIT_P (call_expr) = CALL_EXPR_LIST_INIT_P (aggr_init_expr);
if (style == ctor)
{
break;
}
}
+ else
+ t = fold_convert (TREE_TYPE (OMP_CLAUSE_DECL (c)), t);
}
OMP_CLAUSE_LINEAR_STEP (c) = t;
}
bool
reduced_constant_expression_p (tree t)
{
- if (TREE_CODE (t) == PTRMEM_CST)
- /* Even if we can't lower this yet, it's constant. */
- return true;
- /* FIXME are we calling this too much? */
- return initializer_constant_valid_p (t, TREE_TYPE (t)) != NULL_TREE;
+ switch (TREE_CODE (t))
+ {
+ case PTRMEM_CST:
+ /* Even if we can't lower this yet, it's constant. */
+ return true;
+
+ case CONSTRUCTOR:
+ /* And we need to handle PTRMEM_CST wrapped in a CONSTRUCTOR. */
+ tree elt; unsigned HOST_WIDE_INT idx;
+ FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (t), idx, elt)
+ if (!reduced_constant_expression_p (elt))
+ return false;
+ return true;
+
+ default:
+ /* FIXME are we calling this too much? */
+ return initializer_constant_valid_p (t, TREE_TYPE (t)) != NULL_TREE;
+ }
}
/* Some expressions may have constant operands but are not constant
case IMAGPART_EXPR:
return lvalue_kind (TREE_OPERAND (ref, 0));
+ case MEMBER_REF:
+ case DOTSTAR_EXPR:
+ if (TREE_CODE (ref) == MEMBER_REF)
+ op1_lvalue_kind = clk_ordinary;
+ else
+ op1_lvalue_kind = lvalue_kind (TREE_OPERAND (ref, 0));
+ if (TYPE_PTRMEMFUNC_P (TREE_TYPE (TREE_OPERAND (ref, 1))))
+ op1_lvalue_kind = clk_none;
+ return op1_lvalue_kind;
+
case COMPONENT_REF:
op1_lvalue_kind = lvalue_kind (TREE_OPERAND (ref, 0));
/* Look at the member designator. */
TREE_SIDE_EFFECTS (rval) = 1;
AGGR_INIT_VIA_CTOR_P (rval) = is_ctor;
TREE_NOTHROW (rval) = TREE_NOTHROW (init);
+ CALL_EXPR_LIST_INIT_P (rval) = CALL_EXPR_LIST_INIT_P (init);
}
else
rval = init;
{
return digest_init_r (type, init, false, flags, tf_warning_or_error);
}
+
+/* Process the initializer INIT for an NSDMI DECL (a FIELD_DECL). */
+tree
+digest_nsdmi_init (tree decl, tree init)
+{
+ gcc_assert (TREE_CODE (decl) == FIELD_DECL);
+
+ int flags = LOOKUP_IMPLICIT;
+ if (DIRECT_LIST_INIT_P (init))
+ flags = LOOKUP_NORMAL;
+ init = digest_init_flags (TREE_TYPE (decl), init, flags);
+ if (TREE_CODE (init) == TARGET_EXPR)
+ /* This represents the whole initialization. */
+ TARGET_EXPR_DIRECT_INIT_P (init) = true;
+ return init;
+}
\f
/* Set of flags used within process_init_constructor to describe the
initializers. */
/* When we defer constant folding within a statement, we may want to
defer this folding as well. */
tree t = fold_non_dependent_expr_sfinae (init, complain);
- t = maybe_constant_value (t);
+ t = maybe_constant_init (t);
if (TREE_CONSTANT (t))
init = t;
return init;
.\" ========================================================================
.\"
.IX Title "AOT-COMPILE 1"
-.TH AOT-COMPILE 1 "2014-04-22" "gcc-4.9.0" "GNU"
+.TH AOT-COMPILE 1 "2014-07-16" "gcc-4.9.1" "GNU"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
@subsubsection CRC32 intrinsics
+These intrinsics are available when the CRC32 architecture extension is
+specified, e.g. when the @option{-march=armv8-a+crc} switch is used, or when
+the target processor specified with @option{-mcpu} supports it.
+
@itemize @bullet
@item uint32_t __crc32b (uint32_t, uint8_t)
@*@emph{Form of expected instruction(s):} @code{crc32b @var{r0}, @var{r0}, @var{r0}}
@itemize @bullet
@item uint32_t __crc32d (uint32_t, uint64_t)
@*@emph{Form of expected instruction(s):} Two @code{crc32w @var{r0}, @var{r0}, @var{r0}}
-instructions for AArch32. One @code{crc32w @var{w0}, @var{w0}, @var{x0}} instruction for
-AArch64.
+instructions.
@end itemize
@itemize @bullet
@itemize @bullet
@item uint32_t __crc32cd (uint32_t, uint64_t)
@*@emph{Form of expected instruction(s):} Two @code{crc32cw @var{r0}, @var{r0}, @var{r0}}
-instructions for AArch32. One @code{crc32cw @var{w0}, @var{w0}, @var{x0}} instruction for
-AArch64.
+instructions.
@end itemize
@c This is part of the GCC manual.
@c For copying conditions, see the file gcc.texi.
-@c This file is generated automatically using gcc/config/arm/neon-docgen.ml
-@c Please do not edit manually.
@subsubsection Addition
@itemize @bullet
.\" ========================================================================
.\"
.IX Title "CPP 1"
-.TH CPP 1 "2014-04-22" "gcc-4.9.0" "GNU"
+.TH CPP 1 "2014-07-16" "gcc-4.9.1" "GNU"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
This is more friendly to code living in shared libraries, as it reduces
the number of dynamic relocations that are needed, and by consequence,
allows the data to be read-only.
+This alternative with label differences is not supported for the AVR target,
+please use the first approach for AVR programs.
The @code{&&foo} expressions for the same label might have different
values if the containing function is inlined or cloned. If a program
@node ARM ACLE Intrinsics
@subsection ARM ACLE Intrinsics
-These built-in intrinsics for the ARMv8-A CRC32 extension are available when
-the @option{-march=armv8-a+crc} switch is used:
-
@include arm-acle-intrinsics.texi
@node AVR Built-in Functions
name.
@smallexample
-v32qi __builtin_ia32_mpsadbw256 (v32qi,v32qi,v32qi,int)
+v32qi __builtin_ia32_mpsadbw256 (v32qi,v32qi,int)
v32qi __builtin_ia32_pabsb256 (v32qi)
v16hi __builtin_ia32_pabsw256 (v16hi)
v8si __builtin_ia32_pabsd256 (v8si)
@smallexample
v2df __builtin_ia32_vfrczpd (v2df)
v4sf __builtin_ia32_vfrczps (v4sf)
-v2df __builtin_ia32_vfrczsd (v2df, v2df)
-v4sf __builtin_ia32_vfrczss (v4sf, v4sf)
+v2df __builtin_ia32_vfrczsd (v2df)
+v4sf __builtin_ia32_vfrczss (v4sf)
v4df __builtin_ia32_vfrczpd256 (v4df)
v8sf __builtin_ia32_vfrczps256 (v8sf)
v2di __builtin_ia32_vpcmov (v2di, v2di, v2di)
float __builtin_rsqrtf (float);
double __builtin_recipdiv (double, double);
double __builtin_rsqrt (double);
-long __builtin_bpermd (long, long);
uint64_t __builtin_ppc_get_timebase ();
unsigned long __builtin_ppc_mftb ();
+double __builtin_unpack_longdouble (long double, int);
+long double __builtin_pack_longdouble (double, double);
@end smallexample
The @code{vec_rsqrt}, @code{__builtin_rsqrt}, and
returns the Time Base Register value as an unsigned long, throwing away
the most significant word on 32-bit environments.
+The following built-in functions are available for the PowerPC family
+of processors, starting with ISA 2.06 or later (@option{-mcpu=power7}
+or @option{-mpopcntd}):
+@smallexample
+long __builtin_bpermd (long, long);
+int __builtin_divwe (int, int);
+int __builtin_divweo (int, int);
+unsigned int __builtin_divweu (unsigned int, unsigned int);
+unsigned int __builtin_divweuo (unsigned int, unsigned int);
+long __builtin_divde (long, long);
+long __builtin_divdeo (long, long);
+unsigned long __builtin_divdeu (unsigned long, unsigned long);
+unsigned long __builtin_divdeuo (unsigned long, unsigned long);
+unsigned int cdtbcd (unsigned int);
+unsigned int cbcdtd (unsigned int);
+unsigned int addg6s (unsigned int, unsigned int);
+@end smallexample
+
+The @code{__builtin_divde}, @code{__builtin_divdeo},
+@code{__builitin_divdeu}, @code{__builtin_divdeou} functions require a
+64-bit environment support ISA 2.06 or later.
+
+The following built-in functions are available for the PowerPC family
+of processors when hardware decimal floating point
+(@option{-mhard-dfp}) is available:
+@smallexample
+_Decimal64 __builtin_dxex (_Decimal64);
+_Decimal128 __builtin_dxexq (_Decimal128);
+_Decimal64 __builtin_ddedpd (int, _Decimal64);
+_Decimal128 __builtin_ddedpdq (int, _Decimal128);
+_Decimal64 __builtin_denbcd (int, _Decimal64);
+_Decimal128 __builtin_denbcdq (int, _Decimal128);
+_Decimal64 __builtin_diex (_Decimal64, _Decimal64);
+_Decimal128 _builtin_diexq (_Decimal128, _Decimal128);
+_Decimal64 __builtin_dscli (_Decimal64, int);
+_Decimal128 __builitn_dscliq (_Decimal128, int);
+_Decimal64 __builtin_dscri (_Decimal64, int);
+_Decimal128 __builitn_dscriq (_Decimal128, int);
+unsigned long long __builtin_unpack_dec128 (_Decimal128, int);
+_Decimal128 __builtin_pack_dec128 (unsigned long long, unsigned long long);
+@end smallexample
+
+The following built-in functions are available for the PowerPC family
+of processors when the Vector Scalar (vsx) instruction set is
+available:
+@smallexample
+unsigned long long __builtin_unpack_vector_int128 (vector __int128_t, int);
+vector __int128_t __builtin_pack_vector_int128 (unsigned long long,
+ unsigned long long);
+@end smallexample
+
@node PowerPC AltiVec/VSX Built-in Functions
@subsection PowerPC AltiVec Built-in Functions
__int128_t vec_vsubuqm (__int128_t, __int128_t);
__uint128_t vec_vsubuqm (__uint128_t, __uint128_t);
+
+vector __int128_t __builtin_bcdadd (vector __int128_t, vector__int128_t);
+int __builtin_bcdadd_lt (vector __int128_t, vector__int128_t);
+int __builtin_bcdadd_eq (vector __int128_t, vector__int128_t);
+int __builtin_bcdadd_gt (vector __int128_t, vector__int128_t);
+int __builtin_bcdadd_ov (vector __int128_t, vector__int128_t);
+vector __int128_t bcdsub (vector __int128_t, vector__int128_t);
+int __builtin_bcdsub_lt (vector __int128_t, vector__int128_t);
+int __builtin_bcdsub_eq (vector __int128_t, vector__int128_t);
+int __builtin_bcdsub_gt (vector __int128_t, vector__int128_t);
+int __builtin_bcdsub_ov (vector __int128_t, vector__int128_t);
@end smallexample
If the cryptographic instructions are enabled (@option{-mcrypto} or
.\" ========================================================================
.\"
.IX Title "FSF-FUNDING 7"
-.TH FSF-FUNDING 7 "2014-04-22" "gcc-4.9.0" "GNU"
+.TH FSF-FUNDING 7 "2014-07-16" "gcc-4.9.1" "GNU"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
.\" ========================================================================
.\"
.IX Title "GCC 1"
-.TH GCC 1 "2014-04-22" "gcc-4.9.0" "GNU"
+.TH GCC 1 "2014-07-16" "gcc-4.9.1" "GNU"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
\&\fB\-meb \-mel \-mno\-crt0\fR
.Sp
\&\fI\s-1MSP430\s0 Options\fR
-\&\fB\-msim \-masm\-hex \-mmcu= \-mcpu= \-mlarge \-msmall \-mrelax\fR
+\&\fB\-msim \-masm\-hex \-mmcu= \-mcpu= \-mlarge \-msmall \-mrelax
+\&\-mhwmult=\fR
.Sp
\&\fI\s-1NDS32\s0 Options\fR
\&\fB\-mbig\-endian \-mlittle\-endian
\&\-mpretend\-cmove \-mtas\fR
.Sp
\&\fISolaris 2 Options\fR
-\&\fB\-mimpure\-text \-mno\-impure\-text
+\&\fB\-mclear\-hwcap \-mno\-clear\-hwcap \-mimpure\-text \-mno\-impure\-text
\&\-pthreads \-pthread\fR
.Sp
\&\fI\s-1SPARC\s0 Options\fR
\&\-mhard\-quad\-float \-msoft\-quad\-float
\&\-mstack\-bias \-mno\-stack\-bias
\&\-munaligned\-doubles \-mno\-unaligned\-doubles
+\&\-muser\-mode \-mno\-user\-mode
\&\-mv8plus \-mno\-v8plus \-mvis \-mno\-vis
\&\-mvis2 \-mno\-vis2 \-mvis3 \-mno\-vis3
\&\-mcbcond \-mno\-cbcond
helpful for the x86\-64 architecture, which implicitly zero-extends in 64\-bit
registers after writing to their lower 32\-bit half.
.Sp
-Enabled for AArch64 and x86 at levels \fB\-O2\fR, \fB\-O3\fR.
+Enabled for Alpha, AArch64 and x86 at levels \fB\-O2\fR,
+\&\fB\-O3\fR, \fB\-Os\fR.
.IP "\fB\-flive\-range\-shrinkage\fR" 4
.IX Item "-flive-range-shrinkage"
Attempt to decrease register pressure through register live range
parameter in order to propagate them and perform devirtualization.
\&\fBipa-cp-value-list-size\fR is the maximum number of values and types it
stores per one formal parameter of a function.
+.IP "\fBipa-cp-eval-threshold\fR" 4
+.IX Item "ipa-cp-eval-threshold"
+IPA-CP calculates its own score of cloning profitability heuristics
+and performs those cloning opportunities with scores that exceed
+\&\fBipa-cp-eval-threshold\fR.
+.IP "\fBipa-max-agg-items\fR" 4
+.IX Item "ipa-max-agg-items"
+IPA-CP is also capable to propagate a number of scalar values passed
+in an aggregate. \fBipa-max-agg-items\fR controls the maximum
+number of such values per one parameter.
+.IP "\fBipa-cp-loop-hint-bonus\fR" 4
+.IX Item "ipa-cp-loop-hint-bonus"
+When IPA-CP determines that a cloning candidate would make the number
+of iterations of a loop known, it adds a bonus of
+\&\fBipa-cp-loop-hint-bonus\fR bonus to the profitability score of
+the candidate.
+.IP "\fBipa-cp-array-index-hint-bonus\fR" 4
+.IX Item "ipa-cp-array-index-hint-bonus"
+When IPA-CP determines that a cloning candidate would make the index of
+an array access known, it adds a bonus of
+\&\fBipa-cp-array-index-hint-bonus\fR bonus to the profitability
+score of the candidate.
.IP "\fBlto-partitions\fR" 4
.IX Item "lto-partitions"
Specify desired number of partitions produced during \s-1WHOPR\s0 compilation.
This option is passed to the assembler and linker, and allows the
linker to perform certain optimizations that cannot be done until
the final link.
+.IP "\fBmhwmult=\fR" 4
+.IX Item "mhwmult="
+Describes the type of hardware multiply supported by the target.
+Accepted values are \f(CW\*(C`none\*(C'\fR for no hardware multiply, \f(CW\*(C`16bit\*(C'\fR
+for the original 16\-bit\-only multiply supported by early MCUs.
+\&\f(CW\*(C`32bit\*(C'\fR for the 16/32\-bit multiply supported by later MCUs and
+\&\f(CW\*(C`f5series\*(C'\fR for the 16/32\-bit multiply supported by F5\-series MCUs.
+A value of \f(CW\*(C`auto\*(C'\fR can also be given. This tells \s-1GCC\s0 to deduce
+the hardware multiply support based upon the \s-1MCU\s0 name provided by the
+\&\fB\-mmcu\fR option. If no \fB\-mmcu\fR option is specified then
+\&\f(CW\*(C`32bit\*(C'\fR hardware multiply support is assumed. \f(CW\*(C`auto\*(C'\fR is the
+default setting.
+.Sp
+Hardware multiplies are normally performed by calling a library
+routine. This saves space in the generated code. When compiling at
+\&\f(CW\*(C`\-O3\*(C'\fR or higher however the hardware multiplier is invoked
+inline. This makes for bigger, but faster code.
+.Sp
+The hardware multiply routines disable interrupts whilst running and
+restore the previous interrupt state when they finish. This makes
+them safe to use inside interrupt handlers as well as in normal code.
.PP
\fI\s-1NDS32\s0 Options\fR
.IX Subsection "NDS32 Options"
.IX Subsection "Solaris 2 Options"
.PP
These \fB\-m\fR options are supported on Solaris 2:
+.IP "\fB\-mclear\-hwcap\fR" 4
+.IX Item "-mclear-hwcap"
+\&\fB\-mclear\-hwcap\fR tells the compiler to remove the hardware
+capabilities generated by the Solaris assembler. This is only necessary
+when object files use \s-1ISA\s0 extensions not supported by the current
+machine, but check at runtime whether or not to use them.
.IP "\fB\-mimpure\-text\fR" 4
.IX Item "-mimpure-text"
\&\fB\-mimpure\-text\fR, used in addition to \fB\-shared\fR, tells
Specifying this option avoids some rare compatibility problems with code
generated by other compilers. It is not the default because it results
in a performance loss, especially for floating-point code.
+.IP "\fB\-muser\-mode\fR" 4
+.IX Item "-muser-mode"
+.PD 0
+.IP "\fB\-mno\-user\-mode\fR" 4
+.IX Item "-mno-user-mode"
+.PD
+Do not generate code that can only run in supervisor mode. This is relevant
+only for the \f(CW\*(C`casa\*(C'\fR instruction emitted for the \s-1LEON3\s0 processor. The
+default is \fB\-mno\-user\-mode\fR.
.IP "\fB\-mno\-faster\-structs\fR" 4
.IX Item "-mno-faster-structs"
.PD 0
.\" ========================================================================
.\"
.IX Title "GC-ANALYZE 1"
-.TH GC-ANALYZE 1 "2014-04-22" "gcc-4.9.0" "GNU"
+.TH GC-ANALYZE 1 "2014-07-16" "gcc-4.9.1" "GNU"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
.\" ========================================================================
.\"
.IX Title "GCC 1"
-.TH GCC 1 "2014-04-22" "gcc-4.9.0" "GNU"
+.TH GCC 1 "2014-07-16" "gcc-4.9.1" "GNU"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
\&\fB\-meb \-mel \-mno\-crt0\fR
.Sp
\&\fI\s-1MSP430\s0 Options\fR
-\&\fB\-msim \-masm\-hex \-mmcu= \-mcpu= \-mlarge \-msmall \-mrelax\fR
+\&\fB\-msim \-masm\-hex \-mmcu= \-mcpu= \-mlarge \-msmall \-mrelax
+\&\-mhwmult=\fR
.Sp
\&\fI\s-1NDS32\s0 Options\fR
\&\fB\-mbig\-endian \-mlittle\-endian
\&\-mpretend\-cmove \-mtas\fR
.Sp
\&\fISolaris 2 Options\fR
-\&\fB\-mimpure\-text \-mno\-impure\-text
+\&\fB\-mclear\-hwcap \-mno\-clear\-hwcap \-mimpure\-text \-mno\-impure\-text
\&\-pthreads \-pthread\fR
.Sp
\&\fI\s-1SPARC\s0 Options\fR
\&\-mhard\-quad\-float \-msoft\-quad\-float
\&\-mstack\-bias \-mno\-stack\-bias
\&\-munaligned\-doubles \-mno\-unaligned\-doubles
+\&\-muser\-mode \-mno\-user\-mode
\&\-mv8plus \-mno\-v8plus \-mvis \-mno\-vis
\&\-mvis2 \-mno\-vis2 \-mvis3 \-mno\-vis3
\&\-mcbcond \-mno\-cbcond
helpful for the x86\-64 architecture, which implicitly zero-extends in 64\-bit
registers after writing to their lower 32\-bit half.
.Sp
-Enabled for AArch64 and x86 at levels \fB\-O2\fR, \fB\-O3\fR.
+Enabled for Alpha, AArch64 and x86 at levels \fB\-O2\fR,
+\&\fB\-O3\fR, \fB\-Os\fR.
.IP "\fB\-flive\-range\-shrinkage\fR" 4
.IX Item "-flive-range-shrinkage"
Attempt to decrease register pressure through register live range
parameter in order to propagate them and perform devirtualization.
\&\fBipa-cp-value-list-size\fR is the maximum number of values and types it
stores per one formal parameter of a function.
+.IP "\fBipa-cp-eval-threshold\fR" 4
+.IX Item "ipa-cp-eval-threshold"
+IPA-CP calculates its own score of cloning profitability heuristics
+and performs those cloning opportunities with scores that exceed
+\&\fBipa-cp-eval-threshold\fR.
+.IP "\fBipa-max-agg-items\fR" 4
+.IX Item "ipa-max-agg-items"
+IPA-CP is also capable to propagate a number of scalar values passed
+in an aggregate. \fBipa-max-agg-items\fR controls the maximum
+number of such values per one parameter.
+.IP "\fBipa-cp-loop-hint-bonus\fR" 4
+.IX Item "ipa-cp-loop-hint-bonus"
+When IPA-CP determines that a cloning candidate would make the number
+of iterations of a loop known, it adds a bonus of
+\&\fBipa-cp-loop-hint-bonus\fR bonus to the profitability score of
+the candidate.
+.IP "\fBipa-cp-array-index-hint-bonus\fR" 4
+.IX Item "ipa-cp-array-index-hint-bonus"
+When IPA-CP determines that a cloning candidate would make the index of
+an array access known, it adds a bonus of
+\&\fBipa-cp-array-index-hint-bonus\fR bonus to the profitability
+score of the candidate.
.IP "\fBlto-partitions\fR" 4
.IX Item "lto-partitions"
Specify desired number of partitions produced during \s-1WHOPR\s0 compilation.
This option is passed to the assembler and linker, and allows the
linker to perform certain optimizations that cannot be done until
the final link.
+.IP "\fBmhwmult=\fR" 4
+.IX Item "mhwmult="
+Describes the type of hardware multiply supported by the target.
+Accepted values are \f(CW\*(C`none\*(C'\fR for no hardware multiply, \f(CW\*(C`16bit\*(C'\fR
+for the original 16\-bit\-only multiply supported by early MCUs.
+\&\f(CW\*(C`32bit\*(C'\fR for the 16/32\-bit multiply supported by later MCUs and
+\&\f(CW\*(C`f5series\*(C'\fR for the 16/32\-bit multiply supported by F5\-series MCUs.
+A value of \f(CW\*(C`auto\*(C'\fR can also be given. This tells \s-1GCC\s0 to deduce
+the hardware multiply support based upon the \s-1MCU\s0 name provided by the
+\&\fB\-mmcu\fR option. If no \fB\-mmcu\fR option is specified then
+\&\f(CW\*(C`32bit\*(C'\fR hardware multiply support is assumed. \f(CW\*(C`auto\*(C'\fR is the
+default setting.
+.Sp
+Hardware multiplies are normally performed by calling a library
+routine. This saves space in the generated code. When compiling at
+\&\f(CW\*(C`\-O3\*(C'\fR or higher however the hardware multiplier is invoked
+inline. This makes for bigger, but faster code.
+.Sp
+The hardware multiply routines disable interrupts whilst running and
+restore the previous interrupt state when they finish. This makes
+them safe to use inside interrupt handlers as well as in normal code.
.PP
\fI\s-1NDS32\s0 Options\fR
.IX Subsection "NDS32 Options"
.IX Subsection "Solaris 2 Options"
.PP
These \fB\-m\fR options are supported on Solaris 2:
+.IP "\fB\-mclear\-hwcap\fR" 4
+.IX Item "-mclear-hwcap"
+\&\fB\-mclear\-hwcap\fR tells the compiler to remove the hardware
+capabilities generated by the Solaris assembler. This is only necessary
+when object files use \s-1ISA\s0 extensions not supported by the current
+machine, but check at runtime whether or not to use them.
.IP "\fB\-mimpure\-text\fR" 4
.IX Item "-mimpure-text"
\&\fB\-mimpure\-text\fR, used in addition to \fB\-shared\fR, tells
Specifying this option avoids some rare compatibility problems with code
generated by other compilers. It is not the default because it results
in a performance loss, especially for floating-point code.
+.IP "\fB\-muser\-mode\fR" 4
+.IX Item "-muser-mode"
+.PD 0
+.IP "\fB\-mno\-user\-mode\fR" 4
+.IX Item "-mno-user-mode"
+.PD
+Do not generate code that can only run in supervisor mode. This is relevant
+only for the \f(CW\*(C`casa\*(C'\fR instruction emitted for the \s-1LEON3\s0 processor. The
+default is \fB\-mno\-user\-mode\fR.
.IP "\fB\-mno\-faster\-structs\fR" 4
.IX Item "-mno-faster-structs"
.PD 0
This manual documents how to use the GNU compilers, as well as their
features and incompatibilities, and how to report bugs. It corresponds
-to the compilers (GCC) version 4.9.0. The internals of the GNU
+to the compilers (GCC) version 4.9.1. The internals of the GNU
compilers, including how to port them to new targets and some
information about how to write front ends for new languages, are
documented in a separate manual. *Note Introduction: (gccint)Top.
_MSP430 Options_
-msim -masm-hex -mmcu= -mcpu= -mlarge -msmall -mrelax
+ -mhwmult=
_NDS32 Options_
-mbig-endian -mlittle-endian
-mpretend-cmove -mtas
_Solaris 2 Options_
- -mimpure-text -mno-impure-text
+ -mclear-hwcap -mno-clear-hwcap -mimpure-text -mno-impure-text
-pthreads -pthread
_SPARC Options_
-mhard-quad-float -msoft-quad-float
-mstack-bias -mno-stack-bias
-munaligned-doubles -mno-unaligned-doubles
+ -muser-mode -mno-user-mode
-mv8plus -mno-v8plus -mvis -mno-vis
-mvis2 -mno-vis2 -mvis3 -mno-vis3
-mcbcond -mno-cbcond
zero-extends in 64-bit registers after writing to their lower
32-bit half.
- Enabled for AArch64 and x86 at levels '-O2', '-O3'.
+ Enabled for Alpha, AArch64 and x86 at levels '-O2', '-O3', '-Os'.
'-flive-range-shrinkage'
Attempt to decrease register pressure through register live range
maximum number of values and types it stores per one formal
parameter of a function.
+ 'ipa-cp-eval-threshold'
+ IPA-CP calculates its own score of cloning profitability
+ heuristics and performs those cloning opportunities with
+ scores that exceed 'ipa-cp-eval-threshold'.
+
+ 'ipa-max-agg-items'
+ IPA-CP is also capable to propagate a number of scalar values
+ passed in an aggregate. 'ipa-max-agg-items' controls the
+ maximum number of such values per one parameter.
+
+ 'ipa-cp-loop-hint-bonus'
+ When IPA-CP determines that a cloning candidate would make the
+ number of iterations of a loop known, it adds a bonus of
+ 'ipa-cp-loop-hint-bonus' bonus to the profitability score of
+ the candidate.
+
+ 'ipa-cp-array-index-hint-bonus'
+ When IPA-CP determines that a cloning candidate would make the
+ index of an array access known, it adds a bonus of
+ 'ipa-cp-array-index-hint-bonus' bonus to the profitability
+ score of the candidate.
+
'lto-partitions'
Specify desired number of partitions produced during WHOPR
compilation. The number of partitions should exceed the
linker to perform certain optimizations that cannot be done until
the final link.
+'mhwmult='
+ Describes the type of hardware multiply supported by the target.
+ Accepted values are 'none' for no hardware multiply, '16bit' for
+ the original 16-bit-only multiply supported by early MCUs. '32bit'
+ for the 16/32-bit multiply supported by later MCUs and 'f5series'
+ for the 16/32-bit multiply supported by F5-series MCUs. A value of
+ 'auto' can also be given. This tells GCC to deduce the hardware
+ multiply support based upon the MCU name provided by the '-mmcu'
+ option. If no '-mmcu' option is specified then '32bit' hardware
+ multiply support is assumed. 'auto' is the default setting.
+
+ Hardware multiplies are normally performed by calling a library
+ routine. This saves space in the generated code. When compiling
+ at '-O3' or higher however the hardware multiplier is invoked
+ inline. This makes for bigger, but faster code.
+
+ The hardware multiply routines disable interrupts whilst running
+ and restore the previous interrupt state when they finish. This
+ makes them safe to use inside interrupt handlers as well as in
+ normal code.
+
\1f
File: gcc.info, Node: NDS32 Options, Next: Nios II Options, Prev: MSP430 Options, Up: Submodel Options
These '-m' options are supported on Solaris 2:
+'-mclear-hwcap'
+ '-mclear-hwcap' tells the compiler to remove the hardware
+ capabilities generated by the Solaris assembler. This is only
+ necessary when object files use ISA extensions not supported by the
+ current machine, but check at runtime whether or not to use them.
+
'-mimpure-text'
'-mimpure-text', used in addition to '-shared', tells the compiler
to not pass '-z text' to the linker when linking a shared object.
default because it results in a performance loss, especially for
floating-point code.
+'-muser-mode'
+'-mno-user-mode'
+ Do not generate code that can only run in supervisor mode. This is
+ relevant only for the 'casa' instruction emitted for the LEON3
+ processor. The default is '-mno-user-mode'.
+
'-mno-faster-structs'
'-mfaster-structs'
With '-mfaster-structs', the compiler assumes that structures
This is more friendly to code living in shared libraries, as it reduces
the number of dynamic relocations that are needed, and by consequence,
-allows the data to be read-only.
+allows the data to be read-only. This alternative with label
+differences is not supported for the AVR target, please use the first
+approach for AVR programs.
The '&&foo' expressions for the same label might have different values
if the containing function is inlined or cloned. If a program relies on
6.57.7 ARM ACLE Intrinsics
--------------------------
-These built-in intrinsics for the ARMv8-A CRC32 extension are available
-when the '-march=armv8-a+crc' switch is used:
-
6.57.7.1 CRC32 intrinsics
.........................
+These intrinsics are available when the CRC32 architecture extension is
+specified, e.g. when the '-march=armv8-a+crc' switch is used, or when
+the target processor specified with '-mcpu' supports it.
+
* uint32_t __crc32b (uint32_t, uint8_t)
_Form of expected instruction(s):_ 'crc32b R0, R0, R0'
* uint32_t __crc32d (uint32_t, uint64_t)
_Form of expected instruction(s):_ Two 'crc32w R0, R0, R0'
- instructions for AArch32. One 'crc32w W0, W0, X0' instruction for
- AArch64.
+ instructions.
* uint32_t __crc32cb (uint32_t, uint8_t)
_Form of expected instruction(s):_ 'crc32cb R0, R0, R0'
* uint32_t __crc32cd (uint32_t, uint64_t)
_Form of expected instruction(s):_ Two 'crc32cw R0, R0, R0'
- instructions for AArch32. One 'crc32cw W0, W0, X0' instruction for
- AArch64.
+ instructions.
\1f
File: gcc.info, Node: AVR Built-in Functions, Next: Blackfin Built-in Functions, Prev: ARM ACLE Intrinsics, Up: Target Builtins
The following built-in functions are available when '-mavx2' is used.
All of them generate the machine instruction that is part of the name.
- v32qi __builtin_ia32_mpsadbw256 (v32qi,v32qi,v32qi,int)
+ v32qi __builtin_ia32_mpsadbw256 (v32qi,v32qi,int)
v32qi __builtin_ia32_pabsb256 (v32qi)
v16hi __builtin_ia32_pabsw256 (v16hi)
v8si __builtin_ia32_pabsd256 (v8si)
The following built-in functions are available when '-mxop' is used.
v2df __builtin_ia32_vfrczpd (v2df)
v4sf __builtin_ia32_vfrczps (v4sf)
- v2df __builtin_ia32_vfrczsd (v2df, v2df)
- v4sf __builtin_ia32_vfrczss (v4sf, v4sf)
+ v2df __builtin_ia32_vfrczsd (v2df)
+ v4sf __builtin_ia32_vfrczss (v4sf)
v4df __builtin_ia32_vfrczpd256 (v4df)
v8sf __builtin_ia32_vfrczps256 (v8sf)
v2di __builtin_ia32_vpcmov (v2di, v2di, v2di)
float __builtin_rsqrtf (float);
double __builtin_recipdiv (double, double);
double __builtin_rsqrt (double);
- long __builtin_bpermd (long, long);
uint64_t __builtin_ppc_get_timebase ();
unsigned long __builtin_ppc_mftb ();
+ double __builtin_unpack_longdouble (long double, int);
+ long double __builtin_pack_longdouble (double, double);
The 'vec_rsqrt', '__builtin_rsqrt', and '__builtin_rsqrtf' functions
generate multiple instructions to implement the reciprocal sqrt
returns the Time Base Register value as an unsigned long, throwing away
the most significant word on 32-bit environments.
+ The following built-in functions are available for the PowerPC family
+of processors, starting with ISA 2.06 or later ('-mcpu=power7' or
+'-mpopcntd'):
+ long __builtin_bpermd (long, long);
+ int __builtin_divwe (int, int);
+ int __builtin_divweo (int, int);
+ unsigned int __builtin_divweu (unsigned int, unsigned int);
+ unsigned int __builtin_divweuo (unsigned int, unsigned int);
+ long __builtin_divde (long, long);
+ long __builtin_divdeo (long, long);
+ unsigned long __builtin_divdeu (unsigned long, unsigned long);
+ unsigned long __builtin_divdeuo (unsigned long, unsigned long);
+ unsigned int cdtbcd (unsigned int);
+ unsigned int cbcdtd (unsigned int);
+ unsigned int addg6s (unsigned int, unsigned int);
+
+ The '__builtin_divde', '__builtin_divdeo', '__builitin_divdeu',
+'__builtin_divdeou' functions require a 64-bit environment support ISA
+2.06 or later.
+
+ The following built-in functions are available for the PowerPC family
+of processors when hardware decimal floating point ('-mhard-dfp') is
+available:
+ _Decimal64 __builtin_dxex (_Decimal64);
+ _Decimal128 __builtin_dxexq (_Decimal128);
+ _Decimal64 __builtin_ddedpd (int, _Decimal64);
+ _Decimal128 __builtin_ddedpdq (int, _Decimal128);
+ _Decimal64 __builtin_denbcd (int, _Decimal64);
+ _Decimal128 __builtin_denbcdq (int, _Decimal128);
+ _Decimal64 __builtin_diex (_Decimal64, _Decimal64);
+ _Decimal128 _builtin_diexq (_Decimal128, _Decimal128);
+ _Decimal64 __builtin_dscli (_Decimal64, int);
+ _Decimal128 __builitn_dscliq (_Decimal128, int);
+ _Decimal64 __builtin_dscri (_Decimal64, int);
+ _Decimal128 __builitn_dscriq (_Decimal128, int);
+ unsigned long long __builtin_unpack_dec128 (_Decimal128, int);
+ _Decimal128 __builtin_pack_dec128 (unsigned long long, unsigned long long);
+
+ The following built-in functions are available for the PowerPC family
+of processors when the Vector Scalar (vsx) instruction set is available:
+ unsigned long long __builtin_unpack_vector_int128 (vector __int128_t, int);
+ vector __int128_t __builtin_pack_vector_int128 (unsigned long long,
+ unsigned long long);
+
\1f
File: gcc.info, Node: PowerPC AltiVec/VSX Built-in Functions, Next: PowerPC Hardware Transactional Memory Built-in Functions, Prev: PowerPC Built-in Functions, Up: Target Builtins
__int128_t vec_vsubuqm (__int128_t, __int128_t);
__uint128_t vec_vsubuqm (__uint128_t, __uint128_t);
+ vector __int128_t __builtin_bcdadd (vector __int128_t, vector__int128_t);
+ int __builtin_bcdadd_lt (vector __int128_t, vector__int128_t);
+ int __builtin_bcdadd_eq (vector __int128_t, vector__int128_t);
+ int __builtin_bcdadd_gt (vector __int128_t, vector__int128_t);
+ int __builtin_bcdadd_ov (vector __int128_t, vector__int128_t);
+ vector __int128_t bcdsub (vector __int128_t, vector__int128_t);
+ int __builtin_bcdsub_lt (vector __int128_t, vector__int128_t);
+ int __builtin_bcdsub_eq (vector __int128_t, vector__int128_t);
+ int __builtin_bcdsub_gt (vector __int128_t, vector__int128_t);
+ int __builtin_bcdsub_ov (vector __int128_t, vector__int128_t);
+
If the cryptographic instructions are enabled ('-mcrypto' or
'-mcpu=power8'), the following builtins are enabled.
(line 940)
* m32 <1>: RS/6000 and PowerPC Options.
(line 274)
-* m32 <2>: SPARC Options. (line 250)
+* m32 <2>: SPARC Options. (line 256)
* m32 <3>: TILE-Gx Options. (line 23)
* m32 <4>: TILEPro Options. (line 13)
* m32-bit: CRIS Options. (line 64)
(line 274)
* m64 <2>: S/390 and zSeries Options.
(line 86)
-* m64 <3>: SPARC Options. (line 250)
+* m64 <3>: SPARC Options. (line 256)
* m64 <4>: TILE-Gx Options. (line 23)
* m64bit-doubles: RX Options. (line 10)
* m68000: M680x0 Options. (line 93)
* mcaller-super-interworking: ARM Options. (line 292)
* mcallgraph-data: MCore Options. (line 31)
* mcase-vector-pcrel: ARC Options. (line 206)
-* mcbcond: SPARC Options. (line 217)
+* mcbcond: SPARC Options. (line 223)
* mcc-init: CRIS Options. (line 42)
* mcfv4e: M680x0 Options. (line 169)
* mcheck-zero-division: MIPS Options. (line 503)
* mcix: DEC Alpha Options. (line 163)
* mcld: i386 and x86-64 Options.
(line 672)
+* mclear-hwcap: Solaris 2 Options. (line 9)
* mclip: MeP Options. (line 35)
-* mcmodel: SPARC Options. (line 255)
+* mcmodel: SPARC Options. (line 261)
* mcmodel=kernel: i386 and x86-64 Options.
(line 971)
* mcmodel=large: AArch64 Options. (line 44)
* mcpu <8>: picoChip Options. (line 9)
* mcpu <9>: RS/6000 and PowerPC Options.
(line 68)
-* mcpu <10>: SPARC Options. (line 95)
+* mcpu <10>: SPARC Options. (line 101)
* mcpu <11>: TILE-Gx Options. (line 18)
* mcpu <12>: TILEPro Options. (line 9)
* mcpu32: M680x0 Options. (line 135)
* mfast-fp: Blackfin Options. (line 132)
* mfast-indirect-calls: HPPA Options. (line 46)
* mfast-sw-div: Nios II Options. (line 46)
-* mfaster-structs: SPARC Options. (line 85)
+* mfaster-structs: SPARC Options. (line 91)
* mfdpic: FRV Options. (line 72)
* mfentry: i386 and x86-64 Options.
(line 910)
* mfix: DEC Alpha Options. (line 163)
* mfix-24k: MIPS Options. (line 567)
* mfix-and-continue: Darwin Options. (line 104)
-* mfix-at697f: SPARC Options. (line 237)
+* mfix-at697f: SPARC Options. (line 243)
* mfix-cortex-m3-ldrd: ARM Options. (line 325)
* mfix-r10000: MIPS Options. (line 589)
* mfix-r4000: MIPS Options. (line 573)
* mfix-r4400: MIPS Options. (line 583)
* mfix-rm7000: MIPS Options. (line 600)
* mfix-sb1: MIPS Options. (line 625)
-* mfix-ut699: SPARC Options. (line 242)
+* mfix-ut699: SPARC Options. (line 248)
* mfix-vr4120: MIPS Options. (line 605)
* mfix-vr4130: MIPS Options. (line 618)
* mfixed-cc: FRV Options. (line 35)
* mflush-func: MIPS Options. (line 692)
* mflush-func=NAME: M32R/D Options. (line 93)
* mflush-trap=NUMBER: M32R/D Options. (line 86)
-* mfmaf: SPARC Options. (line 231)
+* mfmaf: SPARC Options. (line 237)
* mfmovd: SH Options. (line 96)
* mforbid-fp-as-gp: NDS32 Options. (line 65)
* mforce-fp-as-gp: NDS32 Options. (line 61)
* mhw-div: Nios II Options. (line 55)
* mhw-mul: Nios II Options. (line 55)
* mhw-mulx: Nios II Options. (line 55)
+* mhwmult=: MSP430 Options. (line 56)
* micplb: Blackfin Options. (line 177)
* mid-shared-library: Blackfin Options. (line 80)
* mieee: DEC Alpha Options. (line 39)
* mieee-with-inexact: DEC Alpha Options. (line 52)
* milp32: IA-64 Options. (line 121)
* mimadd: MIPS Options. (line 543)
-* mimpure-text: Solaris 2 Options. (line 9)
+* mimpure-text: Solaris 2 Options. (line 15)
* mincoming-stack-boundary: i386 and x86-64 Options.
(line 535)
* mindexed-addressing: SH Options. (line 345)
* mmemcpy-strategy=STRATEGY: i386 and x86-64 Options.
(line 871)
* mmemory-latency: DEC Alpha Options. (line 268)
-* mmemory-model: SPARC Options. (line 283)
+* mmemory-model: SPARC Options. (line 289)
* mmemset-strategy=STRATEGY: i386 and x86-64 Options.
(line 883)
* mmfcrf: RS/6000 and PowerPC Options.
* mno-bypass-cache: Nios II Options. (line 34)
* mno-cache-volatile: Nios II Options. (line 40)
* mno-callgraph-data: MCore Options. (line 31)
-* mno-cbcond: SPARC Options. (line 217)
+* mno-cbcond: SPARC Options. (line 223)
* mno-check-zero-division: MIPS Options. (line 503)
* mno-cix: DEC Alpha Options. (line 163)
* mno-clearbss: MicroBlaze Options. (line 16)
* mno-fancy-math-387: i386 and x86-64 Options.
(line 356)
* mno-fast-sw-div: Nios II Options. (line 46)
-* mno-faster-structs: SPARC Options. (line 85)
+* mno-faster-structs: SPARC Options. (line 91)
* mno-fix: DEC Alpha Options. (line 163)
* mno-fix-24k: MIPS Options. (line 567)
* mno-fix-r10000: MIPS Options. (line 589)
* mno-float64: PDP-11 Options. (line 52)
* mno-flush-func: M32R/D Options. (line 98)
* mno-flush-trap: M32R/D Options. (line 90)
-* mno-fmaf: SPARC Options. (line 231)
+* mno-fmaf: SPARC Options. (line 237)
* mno-fp-in-toc: RS/6000 and PowerPC Options.
(line 285)
* mno-fp-regs: DEC Alpha Options. (line 25)
* mno-pic: IA-64 Options. (line 26)
* mno-pid: RX Options. (line 117)
* mno-plt: MIPS Options. (line 189)
-* mno-popc: SPARC Options. (line 224)
+* mno-popc: SPARC Options. (line 230)
* mno-popcntb: RS/6000 and PowerPC Options.
(line 27)
* mno-popcntd: RS/6000 and PowerPC Options.
* mno-sse: i386 and x86-64 Options.
(line 629)
* mno-stack-align: CRIS Options. (line 55)
-* mno-stack-bias: SPARC Options. (line 307)
+* mno-stack-bias: SPARC Options. (line 313)
* mno-strict-align: M680x0 Options. (line 283)
* mno-strict-align <1>: RS/6000 and PowerPC Options.
(line 463)
* mno-uninit-const-in-rodata: MIPS Options. (line 458)
* mno-update: RS/6000 and PowerPC Options.
(line 410)
+* mno-user-mode: SPARC Options. (line 85)
* mno-v3push: NDS32 Options. (line 36)
-* mno-v8plus: SPARC Options. (line 188)
+* mno-v8plus: SPARC Options. (line 194)
* mno-vect-double: Adapteva Epiphany Options.
(line 115)
* mno-virt: MIPS Options. (line 367)
-* mno-vis: SPARC Options. (line 195)
-* mno-vis2: SPARC Options. (line 201)
-* mno-vis3: SPARC Options. (line 209)
+* mno-vis: SPARC Options. (line 201)
+* mno-vis2: SPARC Options. (line 207)
+* mno-vis3: SPARC Options. (line 215)
* mno-vliw-branch: FRV Options. (line 208)
* mno-volatile-asm-stop: IA-64 Options. (line 32)
* mno-volatile-cache: ARC Options. (line 188)
* mpointers-to-nested-functions: RS/6000 and PowerPC Options.
(line 868)
* mpoke-function-name: ARM Options. (line 244)
-* mpopc: SPARC Options. (line 224)
+* mpopc: SPARC Options. (line 230)
* mpopcntb: RS/6000 and PowerPC Options.
(line 27)
* mpopcntd: RS/6000 and PowerPC Options.
* msseregparm: i386 and x86-64 Options.
(line 462)
* mstack-align: CRIS Options. (line 55)
-* mstack-bias: SPARC Options. (line 307)
+* mstack-bias: SPARC Options. (line 313)
* mstack-check-l1: Blackfin Options. (line 76)
* mstack-guard: S/390 and zSeries Options.
(line 154)
(line 110)
* mtune <12>: S/390 and zSeries Options.
(line 122)
-* mtune <13>: SPARC Options. (line 174)
+* mtune <13>: SPARC Options. (line 180)
* mtune-ctrl=FEATURE-LIST: i386 and x86-64 Options.
(line 658)
* mucb-mcount: ARC Options. (line 179)
* mupdate: RS/6000 and PowerPC Options.
(line 410)
* muser-enabled: LM32 Options. (line 21)
+* muser-mode: SPARC Options. (line 85)
* musermode: SH Options. (line 228)
* mv3push: NDS32 Options. (line 33)
* mv850: V850 Options. (line 49)
* mv850e2v4: V850 Options. (line 57)
* mv850e3v5: V850 Options. (line 52)
* mv850es: V850 Options. (line 75)
-* mv8plus: SPARC Options. (line 188)
+* mv8plus: SPARC Options. (line 194)
* mveclibabi: i386 and x86-64 Options.
(line 776)
* mveclibabi <1>: RS/6000 and PowerPC Options.
* mvect8-ret-in-mem: i386 and x86-64 Options.
(line 472)
* mvirt: MIPS Options. (line 367)
-* mvis: SPARC Options. (line 195)
-* mvis2: SPARC Options. (line 201)
-* mvis3: SPARC Options. (line 209)
+* mvis: SPARC Options. (line 201)
+* mvis2: SPARC Options. (line 207)
+* mvis3: SPARC Options. (line 215)
* mvliw-branch: FRV Options. (line 201)
* mvms-return-codes: VMS Options. (line 9)
* mvolatile-asm-stop: IA-64 Options. (line 32)
* private_bundle: Darwin Options. (line 196)
* pthread: RS/6000 and PowerPC Options.
(line 792)
-* pthread <1>: Solaris 2 Options. (line 30)
-* pthreads: Solaris 2 Options. (line 24)
+* pthread <1>: Solaris 2 Options. (line 36)
+* pthreads: Solaris 2 Options. (line 30)
* Q: Debugging Options. (line 422)
* Qn: System V Options. (line 18)
* Qy: System V Options. (line 14)
Node: Standards\7f5686
Node: Invoking GCC\7f17845
Node: Option Summary\7f21590
-Node: Overall Options\7f63276
-Node: Invoking G++\7f77463
-Node: C Dialect Options\7f78986
-Node: C++ Dialect Options\7f95984
-Node: Objective-C and Objective-C++ Dialect Options\7f126529
-Node: Language Independent Options\7f137036
-Node: Warning Options\7f141536
-Node: Debugging Options\7f211575
-Node: Optimize Options\7f271636
-Ref: Type-punning\7f331182
-Node: Preprocessor Options\7f413934
-Ref: Wtrigraphs\7f418717
-Ref: dashMF\7f423467
-Ref: fdollars-in-identifiers\7f434348
-Node: Assembler Options\7f444573
-Node: Link Options\7f445264
-Ref: Link Options-Footnote-1\7f457404
-Node: Directory Options\7f457740
-Node: Spec Files\7f464284
-Node: Target Options\7f486113
-Node: Submodel Options\7f486512
-Node: AArch64 Options\7f488278
-Node: Adapteva Epiphany Options\7f493403
-Node: ARC Options\7f499351
-Node: ARM Options\7f511795
-Node: AVR Options\7f529093
-Node: Blackfin Options\7f549318
-Node: C6X Options\7f557336
-Node: CRIS Options\7f558879
-Node: CR16 Options\7f562618
-Node: Darwin Options\7f563529
-Node: DEC Alpha Options\7f570963
-Node: FR30 Options\7f582579
-Node: FRV Options\7f583143
-Node: GNU/Linux Options\7f589907
-Node: H8/300 Options\7f591167
-Node: HPPA Options\7f592619
-Node: i386 and x86-64 Options\7f601921
-Node: i386 and x86-64 Windows Options\7f643992
-Node: IA-64 Options\7f646845
-Node: LM32 Options\7f654911
-Node: M32C Options\7f655434
-Node: M32R/D Options\7f656707
-Node: M680x0 Options\7f660252
-Node: MCore Options\7f674287
-Node: MeP Options\7f675789
-Node: MicroBlaze Options\7f679749
-Node: MIPS Options\7f682551
-Node: MMIX Options\7f714436
-Node: MN10300 Options\7f716913
-Node: Moxie Options\7f719454
-Node: MSP430 Options\7f719824
-Node: NDS32 Options\7f721913
-Node: Nios II Options\7f723793
-Node: PDP-11 Options\7f732258
-Node: picoChip Options\7f733952
-Node: PowerPC Options\7f736090
-Node: RL78 Options\7f736311
-Node: RS/6000 and PowerPC Options\7f736972
-Node: RX Options\7f775902
-Node: S/390 and zSeries Options\7f783234
-Node: Score Options\7f791781
-Node: SH Options\7f792630
-Node: Solaris 2 Options\7f811301
-Node: SPARC Options\7f812531
-Node: SPU Options\7f825566
-Node: System V Options\7f830505
-Node: TILE-Gx Options\7f831331
-Node: TILEPro Options\7f832349
-Node: V850 Options\7f832853
-Node: VAX Options\7f839561
-Node: VMS Options\7f840096
-Node: VxWorks Options\7f840909
-Node: x86-64 Options\7f842064
-Node: Xstormy16 Options\7f842282
-Node: Xtensa Options\7f842571
-Node: zSeries Options\7f846882
-Node: Code Gen Options\7f847078
-Node: Environment Variables\7f877946
-Node: Precompiled Headers\7f885949
-Node: C Implementation\7f891952
-Node: Translation implementation\7f893642
-Node: Environment implementation\7f894233
-Node: Identifiers implementation\7f894787
-Node: Characters implementation\7f895873
-Node: Integers implementation\7f899523
-Node: Floating point implementation\7f901408
-Node: Arrays and pointers implementation\7f904471
-Ref: Arrays and pointers implementation-Footnote-1\7f905931
-Node: Hints implementation\7f906057
-Node: Structures unions enumerations and bit-fields implementation\7f907542
-Node: Qualifiers implementation\7f909766
-Node: Declarators implementation\7f911546
-Node: Statements implementation\7f911887
-Node: Preprocessing directives implementation\7f912213
-Node: Library functions implementation\7f914534
-Node: Architecture implementation\7f915183
-Node: Locale-specific behavior implementation\7f916828
-Node: C++ Implementation\7f917133
-Node: Conditionally-supported behavior\7f918416
-Node: Exception handling\7f918925
-Node: C Extensions\7f919333
-Node: Statement Exprs\7f924403
-Node: Local Labels\7f928880
-Node: Labels as Values\7f931853
-Ref: Labels as Values-Footnote-1\7f934254
-Node: Nested Functions\7f934439
-Node: Constructing Calls\7f938397
-Node: Typeof\7f943114
-Node: Conditionals\7f947496
-Node: __int128\7f948385
-Node: Long Long\7f948910
-Node: Complex\7f950386
-Node: Floating Types\7f952974
-Node: Half-Precision\7f954102
-Node: Decimal Float\7f956287
-Node: Hex Floats\7f958143
-Node: Fixed-Point\7f959180
-Node: Named Address Spaces\7f962440
-Ref: AVR Named Address Spaces\7f963121
-Node: Zero Length\7f968329
-Node: Empty Structures\7f971616
-Node: Variable Length\7f972022
-Node: Variadic Macros\7f974878
-Node: Escaped Newlines\7f977256
-Node: Subscripting\7f978095
-Node: Pointer Arith\7f978820
-Node: Initializers\7f979388
-Node: Compound Literals\7f979884
-Node: Designated Inits\7f983245
-Node: Case Ranges\7f986983
-Node: Cast to Union\7f987664
-Node: Mixed Declarations\7f988754
-Node: Function Attributes\7f989264
-Node: Attribute Syntax\7f1083847
-Node: Function Prototypes\7f1094237
-Node: C++ Comments\7f1096017
-Node: Dollar Signs\7f1096536
-Node: Character Escapes\7f1097001
-Node: Variable Attributes\7f1097295
-Ref: AVR Variable Attributes\7f1110970
-Ref: MeP Variable Attributes\7f1113632
-Ref: i386 Variable Attributes\7f1115568
-Node: Type Attributes\7f1121229
-Ref: MeP Type Attributes\7f1135117
-Ref: i386 Type Attributes\7f1135391
-Ref: PowerPC Type Attributes\7f1136083
-Ref: SPU Type Attributes\7f1136945
-Node: Alignment\7f1137236
-Node: Inline\7f1138606
-Node: Volatiles\7f1143582
-Node: Extended Asm\7f1146463
-Ref: Example of asm with clobbered asm reg\7f1152367
-Ref: Extended asm with goto\7f1162080
-Node: Constraints\7f1169930
-Node: Simple Constraints\7f1171014
-Node: Multi-Alternative\7f1178324
-Node: Modifiers\7f1180041
-Node: Machine Constraints\7f1183054
-Node: Asm Labels\7f1240008
-Node: Explicit Reg Vars\7f1241684
-Node: Global Reg Vars\7f1243282
-Node: Local Reg Vars\7f1247778
-Node: Alternate Keywords\7f1250194
-Node: Incomplete Enums\7f1251680
-Node: Function Names\7f1252436
-Node: Return Address\7f1254597
-Node: Vector Extensions\7f1258104
-Node: Offsetof\7f1265033
-Node: __sync Builtins\7f1265838
-Node: __atomic Builtins\7f1271307
-Node: x86 specific memory model extensions for transactional memory\7f1282941
-Node: Object Size Checking\7f1284203
-Node: Cilk Plus Builtins\7f1289696
-Node: Other Builtins\7f1290565
-Node: Target Builtins\7f1319872
-Node: Alpha Built-in Functions\7f1321291
-Node: Altera Nios II Built-in Functions\7f1324304
-Node: ARC Built-in Functions\7f1328291
-Node: ARC SIMD Built-in Functions\7f1333503
-Node: ARM iWMMXt Built-in Functions\7f1342399
-Node: ARM NEON Intrinsics\7f1349382
-Node: ARM ACLE Intrinsics\7f1566876
-Node: AVR Built-in Functions\7f1568257
-Node: Blackfin Built-in Functions\7f1571335
-Node: FR-V Built-in Functions\7f1571952
-Node: Argument Types\7f1572815
-Node: Directly-mapped Integer Functions\7f1574569
-Node: Directly-mapped Media Functions\7f1575653
-Node: Raw read/write Functions\7f1583859
-Node: Other Built-in Functions\7f1584767
-Node: X86 Built-in Functions\7f1585953
-Node: X86 transactional memory intrinsics\7f1645162
-Node: MIPS DSP Built-in Functions\7f1647838
-Node: MIPS Paired-Single Support\7f1660347
-Node: MIPS Loongson Built-in Functions\7f1661846
-Node: Paired-Single Arithmetic\7f1668361
-Node: Paired-Single Built-in Functions\7f1669309
-Node: MIPS-3D Built-in Functions\7f1671976
-Node: Other MIPS Built-in Functions\7f1677354
-Node: MSP430 Built-in Functions\7f1678359
-Node: NDS32 Built-in Functions\7f1679263
-Node: picoChip Built-in Functions\7f1680556
-Node: PowerPC Built-in Functions\7f1681899
-Node: PowerPC AltiVec/VSX Built-in Functions\7f1683314
-Node: PowerPC Hardware Transactional Memory Built-in Functions\7f1815519
-Node: RX Built-in Functions\7f1822060
-Node: S/390 System z Built-in Functions\7f1826093
-Node: SH Built-in Functions\7f1831322
-Node: SPARC VIS Built-in Functions\7f1832714
-Node: SPU Built-in Functions\7f1838317
-Node: TI C6X Built-in Functions\7f1840134
-Node: TILE-Gx Built-in Functions\7f1841158
-Node: TILEPro Built-in Functions\7f1842275
-Node: Target Format Checks\7f1843342
-Node: Solaris Format Checks\7f1843774
-Node: Darwin Format Checks\7f1844200
-Node: Pragmas\7f1845018
-Node: ARM Pragmas\7f1845754
-Node: M32C Pragmas\7f1846357
-Node: MeP Pragmas\7f1847429
-Node: RS/6000 and PowerPC Pragmas\7f1849497
-Node: Darwin Pragmas\7f1850238
-Node: Solaris Pragmas\7f1851305
-Node: Symbol-Renaming Pragmas\7f1852469
-Node: Structure-Packing Pragmas\7f1854025
-Node: Weak Pragmas\7f1855670
-Node: Diagnostic Pragmas\7f1856404
-Node: Visibility Pragmas\7f1859513
-Node: Push/Pop Macro Pragmas\7f1860265
-Node: Function Specific Option Pragmas\7f1861238
-Node: Loop-Specific Pragmas\7f1863429
-Node: Unnamed Fields\7f1864528
-Node: Thread-Local\7f1866755
-Node: C99 Thread-Local Edits\7f1868860
-Node: C++98 Thread-Local Edits\7f1870858
-Node: Binary constants\7f1874303
-Node: C++ Extensions\7f1874974
-Node: C++ Volatiles\7f1876685
-Node: Restricted Pointers\7f1879033
-Node: Vague Linkage\7f1880624
-Node: C++ Interface\7f1884247
-Ref: C++ Interface-Footnote-1\7f1888535
-Node: Template Instantiation\7f1888673
-Node: Bound member functions\7f1895259
-Node: C++ Attributes\7f1896791
-Node: Function Multiversioning\7f1900370
-Node: Namespace Association\7f1902187
-Node: Type Traits\7f1903567
-Node: Java Exceptions\7f1910050
-Node: Deprecated Features\7f1911440
-Node: Backwards Compatibility\7f1914407
-Node: Objective-C\7f1915754
-Node: GNU Objective-C runtime API\7f1916361
-Node: Modern GNU Objective-C runtime API\7f1917368
-Node: Traditional GNU Objective-C runtime API\7f1919804
-Node: Executing code before main\7f1920531
-Node: What you can and what you cannot do in +load\7f1923269
-Node: Type encoding\7f1925657
-Node: Legacy type encoding\7f1930684
-Node: @encode\7f1931774
-Node: Method signatures\7f1932315
-Node: Garbage Collection\7f1934307
-Node: Constant string objects\7f1936996
-Node: compatibility_alias\7f1939504
-Node: Exceptions\7f1940225
-Node: Synchronization\7f1942935
-Node: Fast enumeration\7f1944119
-Node: Using fast enumeration\7f1944431
-Node: c99-like fast enumeration syntax\7f1945642
-Node: Fast enumeration details\7f1946345
-Node: Fast enumeration protocol\7f1948685
-Node: Messaging with the GNU Objective-C runtime\7f1951837
-Node: Dynamically registering methods\7f1953209
-Node: Forwarding hook\7f1954900
-Node: Compatibility\7f1957940
-Node: Gcov\7f1964496
-Node: Gcov Intro\7f1965029
-Node: Invoking Gcov\7f1967747
-Node: Gcov and Optimization\7f1981987
-Node: Gcov Data Files\7f1984989
-Node: Cross-profiling\7f1986384
-Node: Trouble\7f1988238
-Node: Actual Bugs\7f1989650
-Node: Interoperation\7f1990097
-Node: Incompatibilities\7f1996988
-Node: Fixed Headers\7f2005140
-Node: Standard Libraries\7f2006798
-Node: Disappointments\7f2008170
-Node: C++ Misunderstandings\7f2012529
-Node: Static Definitions\7f2013340
-Node: Name lookup\7f2014393
-Ref: Name lookup-Footnote-1\7f2019173
-Node: Temporaries\7f2019362
-Node: Copy Assignment\7f2021338
-Node: Non-bugs\7f2023145
-Node: Warnings and Errors\7f2033651
-Node: Bugs\7f2035413
-Node: Bug Criteria\7f2035880
-Node: Bug Reporting\7f2038090
-Node: Service\7f2038311
-Node: Contributing\7f2039130
-Node: Funding\7f2039870
-Node: GNU Project\7f2042360
-Node: Copying\7f2043006
-Node: GNU Free Documentation License\7f2080514
-Node: Contributors\7f2105631
-Node: Option Index\7f2143500
-Node: Keyword Index\7f2353567
+Node: Overall Options\7f63365
+Node: Invoking G++\7f77552
+Node: C Dialect Options\7f79075
+Node: C++ Dialect Options\7f96073
+Node: Objective-C and Objective-C++ Dialect Options\7f126618
+Node: Language Independent Options\7f137125
+Node: Warning Options\7f141625
+Node: Debugging Options\7f211664
+Node: Optimize Options\7f271725
+Ref: Type-punning\7f331285
+Node: Preprocessor Options\7f415022
+Ref: Wtrigraphs\7f419805
+Ref: dashMF\7f424555
+Ref: fdollars-in-identifiers\7f435436
+Node: Assembler Options\7f445661
+Node: Link Options\7f446352
+Ref: Link Options-Footnote-1\7f458492
+Node: Directory Options\7f458828
+Node: Spec Files\7f465372
+Node: Target Options\7f487201
+Node: Submodel Options\7f487600
+Node: AArch64 Options\7f489366
+Node: Adapteva Epiphany Options\7f494491
+Node: ARC Options\7f500439
+Node: ARM Options\7f512883
+Node: AVR Options\7f530181
+Node: Blackfin Options\7f550406
+Node: C6X Options\7f558424
+Node: CRIS Options\7f559967
+Node: CR16 Options\7f563706
+Node: Darwin Options\7f564617
+Node: DEC Alpha Options\7f572051
+Node: FR30 Options\7f583667
+Node: FRV Options\7f584231
+Node: GNU/Linux Options\7f590995
+Node: H8/300 Options\7f592255
+Node: HPPA Options\7f593707
+Node: i386 and x86-64 Options\7f603009
+Node: i386 and x86-64 Windows Options\7f645080
+Node: IA-64 Options\7f647933
+Node: LM32 Options\7f655999
+Node: M32C Options\7f656522
+Node: M32R/D Options\7f657795
+Node: M680x0 Options\7f661340
+Node: MCore Options\7f675375
+Node: MeP Options\7f676877
+Node: MicroBlaze Options\7f680837
+Node: MIPS Options\7f683639
+Node: MMIX Options\7f715524
+Node: MN10300 Options\7f718001
+Node: Moxie Options\7f720542
+Node: MSP430 Options\7f720912
+Node: NDS32 Options\7f724135
+Node: Nios II Options\7f726015
+Node: PDP-11 Options\7f734480
+Node: picoChip Options\7f736174
+Node: PowerPC Options\7f738312
+Node: RL78 Options\7f738533
+Node: RS/6000 and PowerPC Options\7f739194
+Node: RX Options\7f778124
+Node: S/390 and zSeries Options\7f785456
+Node: Score Options\7f794003
+Node: SH Options\7f794852
+Node: Solaris 2 Options\7f813523
+Node: SPARC Options\7f815045
+Node: SPU Options\7f828303
+Node: System V Options\7f833242
+Node: TILE-Gx Options\7f834068
+Node: TILEPro Options\7f835086
+Node: V850 Options\7f835590
+Node: VAX Options\7f842298
+Node: VMS Options\7f842833
+Node: VxWorks Options\7f843646
+Node: x86-64 Options\7f844801
+Node: Xstormy16 Options\7f845019
+Node: Xtensa Options\7f845308
+Node: zSeries Options\7f849619
+Node: Code Gen Options\7f849815
+Node: Environment Variables\7f880683
+Node: Precompiled Headers\7f888686
+Node: C Implementation\7f894689
+Node: Translation implementation\7f896379
+Node: Environment implementation\7f896970
+Node: Identifiers implementation\7f897524
+Node: Characters implementation\7f898610
+Node: Integers implementation\7f902260
+Node: Floating point implementation\7f904145
+Node: Arrays and pointers implementation\7f907208
+Ref: Arrays and pointers implementation-Footnote-1\7f908668
+Node: Hints implementation\7f908794
+Node: Structures unions enumerations and bit-fields implementation\7f910279
+Node: Qualifiers implementation\7f912503
+Node: Declarators implementation\7f914283
+Node: Statements implementation\7f914624
+Node: Preprocessing directives implementation\7f914950
+Node: Library functions implementation\7f917271
+Node: Architecture implementation\7f917920
+Node: Locale-specific behavior implementation\7f919565
+Node: C++ Implementation\7f919870
+Node: Conditionally-supported behavior\7f921153
+Node: Exception handling\7f921662
+Node: C Extensions\7f922070
+Node: Statement Exprs\7f927140
+Node: Local Labels\7f931617
+Node: Labels as Values\7f934590
+Ref: Labels as Values-Footnote-1\7f937117
+Node: Nested Functions\7f937302
+Node: Constructing Calls\7f941260
+Node: Typeof\7f945977
+Node: Conditionals\7f950359
+Node: __int128\7f951248
+Node: Long Long\7f951773
+Node: Complex\7f953249
+Node: Floating Types\7f955837
+Node: Half-Precision\7f956965
+Node: Decimal Float\7f959150
+Node: Hex Floats\7f961006
+Node: Fixed-Point\7f962043
+Node: Named Address Spaces\7f965303
+Ref: AVR Named Address Spaces\7f965984
+Node: Zero Length\7f971192
+Node: Empty Structures\7f974479
+Node: Variable Length\7f974885
+Node: Variadic Macros\7f977741
+Node: Escaped Newlines\7f980119
+Node: Subscripting\7f980958
+Node: Pointer Arith\7f981683
+Node: Initializers\7f982251
+Node: Compound Literals\7f982747
+Node: Designated Inits\7f986108
+Node: Case Ranges\7f989846
+Node: Cast to Union\7f990527
+Node: Mixed Declarations\7f991617
+Node: Function Attributes\7f992127
+Node: Attribute Syntax\7f1086710
+Node: Function Prototypes\7f1097100
+Node: C++ Comments\7f1098880
+Node: Dollar Signs\7f1099399
+Node: Character Escapes\7f1099864
+Node: Variable Attributes\7f1100158
+Ref: AVR Variable Attributes\7f1113833
+Ref: MeP Variable Attributes\7f1116495
+Ref: i386 Variable Attributes\7f1118431
+Node: Type Attributes\7f1124092
+Ref: MeP Type Attributes\7f1137980
+Ref: i386 Type Attributes\7f1138254
+Ref: PowerPC Type Attributes\7f1138946
+Ref: SPU Type Attributes\7f1139808
+Node: Alignment\7f1140099
+Node: Inline\7f1141469
+Node: Volatiles\7f1146445
+Node: Extended Asm\7f1149326
+Ref: Example of asm with clobbered asm reg\7f1155230
+Ref: Extended asm with goto\7f1164943
+Node: Constraints\7f1172793
+Node: Simple Constraints\7f1173877
+Node: Multi-Alternative\7f1181187
+Node: Modifiers\7f1182904
+Node: Machine Constraints\7f1185917
+Node: Asm Labels\7f1242871
+Node: Explicit Reg Vars\7f1244547
+Node: Global Reg Vars\7f1246145
+Node: Local Reg Vars\7f1250641
+Node: Alternate Keywords\7f1253057
+Node: Incomplete Enums\7f1254543
+Node: Function Names\7f1255299
+Node: Return Address\7f1257460
+Node: Vector Extensions\7f1260967
+Node: Offsetof\7f1267896
+Node: __sync Builtins\7f1268701
+Node: __atomic Builtins\7f1274170
+Node: x86 specific memory model extensions for transactional memory\7f1285804
+Node: Object Size Checking\7f1287066
+Node: Cilk Plus Builtins\7f1292559
+Node: Other Builtins\7f1293428
+Node: Target Builtins\7f1322735
+Node: Alpha Built-in Functions\7f1324154
+Node: Altera Nios II Built-in Functions\7f1327167
+Node: ARC Built-in Functions\7f1331154
+Node: ARC SIMD Built-in Functions\7f1336366
+Node: ARM iWMMXt Built-in Functions\7f1345262
+Node: ARM NEON Intrinsics\7f1352245
+Node: ARM ACLE Intrinsics\7f1569739
+Node: AVR Built-in Functions\7f1571067
+Node: Blackfin Built-in Functions\7f1574145
+Node: FR-V Built-in Functions\7f1574762
+Node: Argument Types\7f1575625
+Node: Directly-mapped Integer Functions\7f1577379
+Node: Directly-mapped Media Functions\7f1578463
+Node: Raw read/write Functions\7f1586669
+Node: Other Built-in Functions\7f1587577
+Node: X86 Built-in Functions\7f1588763
+Node: X86 transactional memory intrinsics\7f1647954
+Node: MIPS DSP Built-in Functions\7f1650630
+Node: MIPS Paired-Single Support\7f1663139
+Node: MIPS Loongson Built-in Functions\7f1664638
+Node: Paired-Single Arithmetic\7f1671153
+Node: Paired-Single Built-in Functions\7f1672101
+Node: MIPS-3D Built-in Functions\7f1674768
+Node: Other MIPS Built-in Functions\7f1680146
+Node: MSP430 Built-in Functions\7f1681151
+Node: NDS32 Built-in Functions\7f1682055
+Node: picoChip Built-in Functions\7f1683348
+Node: PowerPC Built-in Functions\7f1684691
+Node: PowerPC AltiVec/VSX Built-in Functions\7f1688400
+Node: PowerPC Hardware Transactional Memory Built-in Functions\7f1821298
+Node: RX Built-in Functions\7f1827839
+Node: S/390 System z Built-in Functions\7f1831872
+Node: SH Built-in Functions\7f1837101
+Node: SPARC VIS Built-in Functions\7f1838493
+Node: SPU Built-in Functions\7f1844096
+Node: TI C6X Built-in Functions\7f1845913
+Node: TILE-Gx Built-in Functions\7f1846937
+Node: TILEPro Built-in Functions\7f1848054
+Node: Target Format Checks\7f1849121
+Node: Solaris Format Checks\7f1849553
+Node: Darwin Format Checks\7f1849979
+Node: Pragmas\7f1850797
+Node: ARM Pragmas\7f1851533
+Node: M32C Pragmas\7f1852136
+Node: MeP Pragmas\7f1853208
+Node: RS/6000 and PowerPC Pragmas\7f1855276
+Node: Darwin Pragmas\7f1856017
+Node: Solaris Pragmas\7f1857084
+Node: Symbol-Renaming Pragmas\7f1858248
+Node: Structure-Packing Pragmas\7f1859804
+Node: Weak Pragmas\7f1861449
+Node: Diagnostic Pragmas\7f1862183
+Node: Visibility Pragmas\7f1865292
+Node: Push/Pop Macro Pragmas\7f1866044
+Node: Function Specific Option Pragmas\7f1867017
+Node: Loop-Specific Pragmas\7f1869208
+Node: Unnamed Fields\7f1870307
+Node: Thread-Local\7f1872534
+Node: C99 Thread-Local Edits\7f1874639
+Node: C++98 Thread-Local Edits\7f1876637
+Node: Binary constants\7f1880082
+Node: C++ Extensions\7f1880753
+Node: C++ Volatiles\7f1882464
+Node: Restricted Pointers\7f1884812
+Node: Vague Linkage\7f1886403
+Node: C++ Interface\7f1890026
+Ref: C++ Interface-Footnote-1\7f1894314
+Node: Template Instantiation\7f1894452
+Node: Bound member functions\7f1901038
+Node: C++ Attributes\7f1902570
+Node: Function Multiversioning\7f1906149
+Node: Namespace Association\7f1907966
+Node: Type Traits\7f1909346
+Node: Java Exceptions\7f1915829
+Node: Deprecated Features\7f1917219
+Node: Backwards Compatibility\7f1920186
+Node: Objective-C\7f1921533
+Node: GNU Objective-C runtime API\7f1922140
+Node: Modern GNU Objective-C runtime API\7f1923147
+Node: Traditional GNU Objective-C runtime API\7f1925583
+Node: Executing code before main\7f1926310
+Node: What you can and what you cannot do in +load\7f1929048
+Node: Type encoding\7f1931436
+Node: Legacy type encoding\7f1936463
+Node: @encode\7f1937553
+Node: Method signatures\7f1938094
+Node: Garbage Collection\7f1940086
+Node: Constant string objects\7f1942775
+Node: compatibility_alias\7f1945283
+Node: Exceptions\7f1946004
+Node: Synchronization\7f1948714
+Node: Fast enumeration\7f1949898
+Node: Using fast enumeration\7f1950210
+Node: c99-like fast enumeration syntax\7f1951421
+Node: Fast enumeration details\7f1952124
+Node: Fast enumeration protocol\7f1954464
+Node: Messaging with the GNU Objective-C runtime\7f1957616
+Node: Dynamically registering methods\7f1958988
+Node: Forwarding hook\7f1960679
+Node: Compatibility\7f1963719
+Node: Gcov\7f1970275
+Node: Gcov Intro\7f1970808
+Node: Invoking Gcov\7f1973526
+Node: Gcov and Optimization\7f1987766
+Node: Gcov Data Files\7f1990768
+Node: Cross-profiling\7f1992163
+Node: Trouble\7f1994017
+Node: Actual Bugs\7f1995429
+Node: Interoperation\7f1995876
+Node: Incompatibilities\7f2002767
+Node: Fixed Headers\7f2010919
+Node: Standard Libraries\7f2012577
+Node: Disappointments\7f2013949
+Node: C++ Misunderstandings\7f2018308
+Node: Static Definitions\7f2019119
+Node: Name lookup\7f2020172
+Ref: Name lookup-Footnote-1\7f2024952
+Node: Temporaries\7f2025141
+Node: Copy Assignment\7f2027117
+Node: Non-bugs\7f2028924
+Node: Warnings and Errors\7f2039430
+Node: Bugs\7f2041192
+Node: Bug Criteria\7f2041659
+Node: Bug Reporting\7f2043869
+Node: Service\7f2044090
+Node: Contributing\7f2044909
+Node: Funding\7f2045649
+Node: GNU Project\7f2048139
+Node: Copying\7f2048785
+Node: GNU Free Documentation License\7f2086293
+Node: Contributors\7f2111410
+Node: Option Index\7f2149279
+Node: Keyword Index\7f2359638
\1f
End Tag Table
Unlike standard bootstrap, several additional restrictions apply.
The compiler used to build 'stage1' needs to support a 64-bit integral
-type. It is recommended to only use GCC for this. Also parallel make
-is currently not supported since collisions in profile collecting may
-occur.
+type. It is recommended to only use GCC for this.
\1f
File: gccinstall.info, Node: Testing, Next: Final install, Prev: Building, Up: Installing GCC
* SCO OpenServer/Unixware.
* Solaris 2 (SPARC, Intel):
- * Sunfreeware
-
- * Blastwave
-
* OpenCSW
* TGCware
aarch64*-*-*
============
-Pre 2.24 binutils does not have support for selecting -mabi and does not
-support ILP32. If GCC 4.9 or later is built with pre 2.24, GCC will not
-support option -mabi=ilp32.
+Binutils pre 2.24 does not have support for selecting '-mabi' and does
+not support ILP32. If it is used to build GCC 4.9 or later, GCC will
+not support option '-mabi=ilp32'.
*-ibm-aix*
==========
Ref: with-as\7f33480
Ref: with-gnu-ld\7f34893
Node: Building\7f84585
-Node: Testing\7f100052
-Node: Final install\7f107914
-Node: Binaries\7f113225
-Node: Specific\7f114733
-Ref: alpha-x-x\7f115240
-Ref: alpha-dec-osf51\7f115729
-Ref: amd64-x-solaris210\7f116254
-Ref: arc-x-elf32\7f116357
-Ref: arc-linux-uclibc\7f116533
-Ref: arm-x-eabi\7f116674
-Ref: avr\7f116885
-Ref: bfin\7f117524
-Ref: cr16\7f117765
-Ref: cris\7f118181
-Ref: dos\7f118996
-Ref: epiphany-x-elf\7f119319
-Ref: x-x-freebsd\7f119424
-Ref: h8300-hms\7f121260
-Ref: hppa-hp-hpux\7f121612
-Ref: hppa-hp-hpux10\7f123984
-Ref: hppa-hp-hpux11\7f124397
-Ref: x-x-linux-gnu\7f130056
-Ref: ix86-x-linux\7f130249
-Ref: ix86-x-solaris29\7f130562
-Ref: ix86-x-solaris210\7f131341
-Ref: ia64-x-linux\7f132532
-Ref: ia64-x-hpux\7f133302
-Ref: aarch64-x-x\7f133857
-Ref: x-ibm-aix\7f134059
-Ref: iq2000-x-elf\7f140922
-Ref: lm32-x-elf\7f141062
-Ref: lm32-x-uclinux\7f141166
-Ref: m32c-x-elf\7f141294
-Ref: m32r-x-elf\7f141396
-Ref: m68k-x-x\7f141498
-Ref: m68k-x-uclinux\7f142536
-Ref: mep-x-elf\7f142781
-Ref: microblaze-x-elf\7f142891
-Ref: mips-x-x\7f143010
-Ref: mips-sgi-irix5\7f145404
-Ref: mips-sgi-irix6\7f145484
-Ref: moxie-x-elf\7f145671
-Ref: msp430-x-elf\7f145718
-Ref: nds32le-x-elf\7f145821
-Ref: nds32be-x-elf\7f145893
-Ref: powerpc-x-x\7f145962
-Ref: powerpc-x-darwin\7f146167
-Ref: powerpc-x-elf\7f146661
-Ref: powerpc-x-linux-gnu\7f146746
-Ref: powerpc-x-netbsd\7f146841
-Ref: powerpc-x-eabisim\7f146929
-Ref: powerpc-x-eabi\7f147055
-Ref: powerpcle-x-elf\7f147131
-Ref: powerpcle-x-eabisim\7f147223
-Ref: powerpcle-x-eabi\7f147356
-Ref: rl78-x-elf\7f147439
-Ref: rx-x-elf\7f147545
-Ref: s390-x-linux\7f147744
-Ref: s390x-x-linux\7f147816
-Ref: s390x-ibm-tpf\7f147903
-Ref: x-x-solaris2\7f148034
-Ref: sparc-x-x\7f152955
-Ref: sparc-sun-solaris2\7f153457
-Ref: sparc-sun-solaris210\7f156210
-Ref: sparc-x-linux\7f156585
-Ref: sparc64-x-solaris2\7f156810
-Ref: sparcv9-x-solaris2\7f157463
-Ref: c6x-x-x\7f157550
-Ref: tilegx-*-linux\7f157642
-Ref: tilegxbe-*-linux\7f157784
-Ref: tilepro-*-linux\7f157927
-Ref: x-x-vxworks\7f158048
-Ref: x86-64-x-x\7f159571
-Ref: x86-64-x-solaris210\7f159899
-Ref: xtensa-x-elf\7f160561
-Ref: xtensa-x-linux\7f161232
-Ref: windows\7f161573
-Ref: x-x-cygwin\7f163506
-Ref: x-x-interix\7f164059
-Ref: x-x-mingw32\7f164367
-Ref: older\7f164593
-Ref: elf\7f166710
-Node: Old\7f166968
-Node: Configurations\7f170101
-Node: GNU Free Documentation License\7f173639
-Node: Concept Index\7f198766
+Node: Testing\7f99955
+Node: Final install\7f107817
+Node: Binaries\7f113128
+Node: Specific\7f114592
+Ref: alpha-x-x\7f115099
+Ref: alpha-dec-osf51\7f115588
+Ref: amd64-x-solaris210\7f116113
+Ref: arc-x-elf32\7f116216
+Ref: arc-linux-uclibc\7f116392
+Ref: arm-x-eabi\7f116533
+Ref: avr\7f116744
+Ref: bfin\7f117383
+Ref: cr16\7f117624
+Ref: cris\7f118040
+Ref: dos\7f118855
+Ref: epiphany-x-elf\7f119178
+Ref: x-x-freebsd\7f119283
+Ref: h8300-hms\7f121119
+Ref: hppa-hp-hpux\7f121471
+Ref: hppa-hp-hpux10\7f123843
+Ref: hppa-hp-hpux11\7f124256
+Ref: x-x-linux-gnu\7f129915
+Ref: ix86-x-linux\7f130108
+Ref: ix86-x-solaris29\7f130421
+Ref: ix86-x-solaris210\7f131200
+Ref: ia64-x-linux\7f132391
+Ref: ia64-x-hpux\7f133161
+Ref: aarch64-x-x\7f133716
+Ref: x-ibm-aix\7f133919
+Ref: iq2000-x-elf\7f140782
+Ref: lm32-x-elf\7f140922
+Ref: lm32-x-uclinux\7f141026
+Ref: m32c-x-elf\7f141154
+Ref: m32r-x-elf\7f141256
+Ref: m68k-x-x\7f141358
+Ref: m68k-x-uclinux\7f142396
+Ref: mep-x-elf\7f142641
+Ref: microblaze-x-elf\7f142751
+Ref: mips-x-x\7f142870
+Ref: mips-sgi-irix5\7f145264
+Ref: mips-sgi-irix6\7f145344
+Ref: moxie-x-elf\7f145531
+Ref: msp430-x-elf\7f145578
+Ref: nds32le-x-elf\7f145681
+Ref: nds32be-x-elf\7f145753
+Ref: powerpc-x-x\7f145822
+Ref: powerpc-x-darwin\7f146027
+Ref: powerpc-x-elf\7f146521
+Ref: powerpc-x-linux-gnu\7f146606
+Ref: powerpc-x-netbsd\7f146701
+Ref: powerpc-x-eabisim\7f146789
+Ref: powerpc-x-eabi\7f146915
+Ref: powerpcle-x-elf\7f146991
+Ref: powerpcle-x-eabisim\7f147083
+Ref: powerpcle-x-eabi\7f147216
+Ref: rl78-x-elf\7f147299
+Ref: rx-x-elf\7f147405
+Ref: s390-x-linux\7f147604
+Ref: s390x-x-linux\7f147676
+Ref: s390x-ibm-tpf\7f147763
+Ref: x-x-solaris2\7f147894
+Ref: sparc-x-x\7f152815
+Ref: sparc-sun-solaris2\7f153317
+Ref: sparc-sun-solaris210\7f156070
+Ref: sparc-x-linux\7f156445
+Ref: sparc64-x-solaris2\7f156670
+Ref: sparcv9-x-solaris2\7f157323
+Ref: c6x-x-x\7f157410
+Ref: tilegx-*-linux\7f157502
+Ref: tilegxbe-*-linux\7f157644
+Ref: tilepro-*-linux\7f157787
+Ref: x-x-vxworks\7f157908
+Ref: x86-64-x-x\7f159431
+Ref: x86-64-x-solaris210\7f159759
+Ref: xtensa-x-elf\7f160421
+Ref: xtensa-x-linux\7f161092
+Ref: windows\7f161433
+Ref: x-x-cygwin\7f163366
+Ref: x-x-interix\7f163919
+Ref: x-x-mingw32\7f164227
+Ref: older\7f164453
+Ref: elf\7f166570
+Node: Old\7f166828
+Node: Configurations\7f169961
+Node: GNU Free Documentation License\7f173499
+Node: Concept Index\7f198626
\1f
End Tag Table
This manual documents the internals of the GNU compilers, including how
to port them to new targets and some information about how to write
front ends for new languages. It corresponds to the compilers (GCC)
-version 4.9.0. The use of the GNU compilers is documented in a separate
+version 4.9.1. The use of the GNU compilers is documented in a separate
manual. *Note Introduction: (gcc)Top.
This manual is mainly a reference manual rather than a tutorial. It
'double64plus'
Target has 'double' that is 64 bits or longer.
+'longdouble128'
+ Target has 128-bit 'long double'.
+
'int32plus'
Target has 'int' that is at 32 bits or longer.
7.2.3.8 PowerPC-specific attributes
...................................
+'dfp_hw'
+ PowerPC target supports executing hardware DFP instructions.
+
+'p8vector_hw'
+ PowerPC target supports executing VSX instructions (ISA 2.07).
+
'powerpc64'
Test system supports executing 64-bit instructions.
'powerpc_altivec_ok'
PowerPC target supports '-maltivec'.
+'powerpc_eabi_ok'
+ PowerPC target supports '-meabi'.
+
+'powerpc_elfv2'
+ PowerPC target supports '-mabi=elfv2'.
+
'powerpc_fprs'
PowerPC target supports floating-point registers.
'powerpc_hard_double'
PowerPC target supports hardware double-precision floating-point.
+'powerpc_htm_ok'
+ PowerPC target supports '-mhtm'
+
+'powerpc_p8vector_ok'
+ PowerPC target supports '-mpower8-vector'
+
'powerpc_ppu_ok'
PowerPC target supports '-mcpu=cell'.
'powerpc_spu'
PowerPC target supports PowerPC SPU.
-'spu_auto_overlay'
- SPU target has toolchain that supports automatic overlay
- generation.
-
'powerpc_vsx_ok'
PowerPC target supports '-mvsx'.
Including the options used to compile this particular test, the
PowerPC target supports PowerPC 405.
+'ppc_recip_hw'
+ PowerPC target supports executing reciprocal estimate instructions.
+
+'spu_auto_overlay'
+ SPU target has toolchain that supports automatic overlay
+ generation.
+
'vmx_hw'
PowerPC target supports executing AltiVec instructions.
+'vsx_hw'
+ PowerPC target supports executing VSX instructions (ISA 2.06).
+
7.2.3.9 Other hardware attributes
.................................
machine-dependent stack frame: 'OUTGOING_REG_PARM_STACK_SPACE' says
which.
+ -- Macro: INCOMING_REG_PARM_STACK_SPACE (FNDECL)
+ Like 'REG_PARM_STACK_SPACE', but for incoming register arguments.
+ Define this macro if space guaranteed when compiling a function
+ body is different to space required when making a call, a situation
+ that can arise with K&R style function definitions.
+
-- Macro: OUTGOING_REG_PARM_STACK_SPACE (FNTYPE)
Define this to a nonzero value if it is the responsibility of the
caller to allocate the area reserved for arguments passed in
* 'call_insn' and '/v': Flags. (line 44)
* CALL_INSN_FUNCTION_USAGE: Insns. (line 101)
* 'call_pop' instruction pattern: Standard Names. (line 1148)
-* CALL_POPS_ARGS: Stack Arguments. (line 132)
+* CALL_POPS_ARGS: Stack Arguments. (line 138)
* CALL_REALLY_USED_REGISTERS: Register Basics. (line 45)
* CALL_USED_REGISTERS: Register Basics. (line 34)
* call_used_regs: Register Basics. (line 59)
* inclusive-or, bitwise: Arithmetic. (line 164)
* INCOMING_FRAME_SP_OFFSET: Frame Layout. (line 181)
* INCOMING_REGNO: Register Basics. (line 87)
+* INCOMING_REG_PARM_STACK_SPACE: Stack Arguments. (line 73)
* INCOMING_RETURN_ADDR_RTX: Frame Layout. (line 137)
* INCOMING_STACK_BOUNDARY: Storage Layout. (line 154)
* INDEX_REG_CLASS: Register Classes. (line 140)
* other register constraints: Simple Constraints. (line 171)
* outgoing_args_size: Stack Arguments. (line 48)
* OUTGOING_REGNO: Register Basics. (line 94)
-* OUTGOING_REG_PARM_STACK_SPACE: Stack Arguments. (line 73)
+* OUTGOING_REG_PARM_STACK_SPACE: Stack Arguments. (line 79)
* output of assembler code: File Framework. (line 6)
* output statements: Output Statement. (line 6)
* output templates: Output Template. (line 6)
* 'STACK_DYNAMIC_OFFSET' and virtual registers: Regs and Memory.
(line 83)
* STACK_GROWS_DOWNWARD: Frame Layout. (line 8)
-* STACK_PARMS_IN_REG_PARM_AREA: Stack Arguments. (line 83)
+* STACK_PARMS_IN_REG_PARM_AREA: Stack Arguments. (line 89)
* STACK_POINTER_OFFSET: Frame Layout. (line 57)
* 'STACK_POINTER_OFFSET' and virtual registers: Regs and Memory.
(line 93)
* TARGET_RESOLVE_OVERLOADED_BUILTIN: Misc. (line 624)
* TARGET_RETURN_IN_MEMORY: Aggregate Return. (line 15)
* TARGET_RETURN_IN_MSB: Scalar Return. (line 117)
-* TARGET_RETURN_POPS_ARGS: Stack Arguments. (line 92)
+* TARGET_RETURN_POPS_ARGS: Stack Arguments. (line 98)
* TARGET_RTX_COSTS: Costs. (line 269)
* TARGET_SCALAR_MODE_SUPPORTED_P: Register Arguments. (line 315)
* TARGET_SCHED_ADJUST_COST: Scheduling. (line 35)
Node: Directives\7f204569
Node: Selectors\7f214866
Node: Effective-Target Keywords\7f216222
-Ref: arm_neon_ok\7f223910
-Ref: arm_neonv2_ok\7f224068
-Ref: arm_neon_fp16_ok\7f224240
-Ref: arm_vfp3_ok\7f224680
-Node: Add Options\7f234179
-Node: Require Support\7f235496
-Node: Final Actions\7f238003
-Node: Ada Tests\7f243168
-Node: C Tests\7f244499
-Node: libgcj Tests\7f248894
-Node: LTO Testing\7f250021
-Node: gcov Testing\7f251669
-Node: profopt Testing\7f254659
-Node: compat Testing\7f256374
-Node: Torture Tests\7f260614
-Node: Options\7f262229
-Node: Option file format\7f262670
-Node: Option properties\7f269659
-Node: Passes\7f282686
-Node: Parsing pass\7f283576
-Node: Cilk Plus Transformation\7f287109
-Node: Gimplification pass\7f290491
-Node: Pass manager\7f292336
-Node: Tree SSA passes\7f294182
-Node: RTL passes\7f315249
-Node: Optimization info\7f327613
-Node: Dump setup\7f328432
-Node: Optimization groups\7f329561
-Node: Dump files and streams\7f330450
-Node: Dump output verbosity\7f331648
-Node: Dump types\7f332704
-Node: Dump examples\7f334194
-Node: GENERIC\7f335540
-Node: Deficiencies\7f337416
-Node: Tree overview\7f337657
-Node: Macros and Functions\7f341781
-Node: Identifiers\7f342606
-Node: Containers\7f344215
-Node: Types\7f345372
-Node: Declarations\7f357446
-Node: Working with declarations\7f357941
-Node: Internal structure\7f363545
-Node: Current structure hierarchy\7f363929
-Node: Adding new DECL node types\7f366022
-Node: Attributes\7f370306
-Node: Expression trees\7f371550
-Node: Constant expressions\7f373304
-Node: Storage References\7f377517
-Node: Unary and Binary Expressions\7f381036
-Node: Vectors\7f401184
-Node: Statements\7f405916
-Node: Basic Statements\7f406436
-Node: Blocks\7f410943
-Node: Statement Sequences\7f412347
-Node: Empty Statements\7f412680
-Node: Jumps\7f413254
-Node: Cleanups\7f413907
-Node: OpenMP\7f415674
-Node: Functions\7f421518
-Node: Function Basics\7f421989
-Node: Function Properties\7f425673
-Node: Language-dependent trees\7f428454
-Node: C and C++ Trees\7f429341
-Node: Types for C++\7f432245
-Node: Namespaces\7f437215
-Node: Classes\7f440321
-Node: Functions for C++\7f445398
-Node: Statements for C++\7f451649
-Node: C++ Expressions\7f460422
-Node: Java Trees\7f461927
-Node: GIMPLE\7f462040
-Node: Tuple representation\7f465664
-Node: GIMPLE instruction set\7f473968
-Node: GIMPLE Exception Handling\7f475584
-Node: Temporaries\7f477496
-Ref: Temporaries-Footnote-1\7f478814
-Node: Operands\7f478879
-Node: Compound Expressions\7f479640
-Node: Compound Lvalues\7f479874
-Node: Conditional Expressions\7f480636
-Node: Logical Operators\7f481295
-Node: Manipulating GIMPLE statements\7f488153
-Node: Tuple specific accessors\7f494089
-Node: 'GIMPLE_ASM'\7f494908
-Node: 'GIMPLE_ASSIGN'\7f497425
-Node: 'GIMPLE_BIND'\7f501531
-Node: 'GIMPLE_CALL'\7f503339
-Node: 'GIMPLE_CATCH'\7f507610
-Node: 'GIMPLE_COND'\7f508754
-Node: 'GIMPLE_DEBUG'\7f511542
-Node: 'GIMPLE_EH_FILTER'\7f514920
-Node: 'GIMPLE_LABEL'\7f516408
-Node: 'GIMPLE_NOP'\7f517383
-Node: 'GIMPLE_OMP_ATOMIC_LOAD'\7f517752
-Node: 'GIMPLE_OMP_ATOMIC_STORE'\7f518662
-Node: 'GIMPLE_OMP_CONTINUE'\7f519302
-Node: 'GIMPLE_OMP_CRITICAL'\7f520652
-Node: 'GIMPLE_OMP_FOR'\7f521590
-Node: 'GIMPLE_OMP_MASTER'\7f525105
-Node: 'GIMPLE_OMP_ORDERED'\7f525489
-Node: 'GIMPLE_OMP_PARALLEL'\7f525889
-Node: 'GIMPLE_OMP_RETURN'\7f528522
-Node: 'GIMPLE_OMP_SECTION'\7f529173
-Node: 'GIMPLE_OMP_SECTIONS'\7f529839
-Node: 'GIMPLE_OMP_SINGLE'\7f531446
-Node: 'GIMPLE_PHI'\7f532384
-Node: 'GIMPLE_RESX'\7f533671
-Node: 'GIMPLE_RETURN'\7f534390
-Node: 'GIMPLE_SWITCH'\7f534958
-Node: 'GIMPLE_TRY'\7f536760
-Node: 'GIMPLE_WITH_CLEANUP_EXPR'\7f538551
-Node: GIMPLE sequences\7f539434
-Node: Sequence iterators\7f542640
-Node: Adding a new GIMPLE statement code\7f551095
-Node: Statement and operand traversals\7f552371
-Node: Tree SSA\7f554963
-Node: Annotations\7f556751
-Node: SSA Operands\7f557156
-Node: SSA\7f571230
-Node: Alias analysis\7f582262
-Node: Memory model\7f586036
-Node: RTL\7f587395
-Node: RTL Objects\7f589583
-Node: RTL Classes\7f593457
-Node: Accessors\7f598454
-Node: Special Accessors\7f600848
-Node: Flags\7f606635
-Node: Machine Modes\7f621399
-Node: Constants\7f634687
-Node: Regs and Memory\7f641415
-Node: Arithmetic\7f659303
-Node: Comparisons\7f669385
-Node: Bit-Fields\7f673677
-Node: Vector Operations\7f675229
-Node: Conversions\7f677110
-Node: RTL Declarations\7f681608
-Node: Side Effects\7f682429
-Node: Incdec\7f699439
-Node: Assembler\7f702775
-Node: Debug Information\7f704320
-Node: Insns\7f705517
-Node: Calls\7f731938
-Node: Sharing\7f734531
-Node: Reading RTL\7f737642
-Node: Control Flow\7f738633
-Node: Basic Blocks\7f740402
-Node: Edges\7f745691
-Node: Profile information\7f754320
-Node: Maintaining the CFG\7f759004
-Node: Liveness information\7f764865
-Node: Loop Analysis and Representation\7f766991
-Node: Loop representation\7f768101
-Node: Loop querying\7f775664
-Node: Loop manipulation\7f778480
-Node: LCSSA\7f780841
-Node: Scalar evolutions\7f782910
-Node: loop-iv\7f786154
-Node: Number of iterations\7f788076
-Node: Dependency analysis\7f790882
-Node: Omega\7f797246
-Node: Machine Desc\7f798822
-Node: Overview\7f801385
-Node: Patterns\7f803425
-Node: Example\7f806863
-Node: RTL Template\7f808297
-Node: Output Template\7f818952
-Node: Output Statement\7f822915
-Node: Predicates\7f827254
-Node: Machine-Independent Predicates\7f830172
-Node: Defining Predicates\7f835116
-Node: Constraints\7f841079
-Node: Simple Constraints\7f842561
-Node: Multi-Alternative\7f855401
-Node: Class Preferences\7f858242
-Node: Modifiers\7f859134
-Node: Machine Constraints\7f863380
-Node: Disable Insn Alternatives\7f921548
-Node: Define Constraints\7f924449
-Node: C Constraint Interface\7f931234
-Node: Standard Names\7f934886
-Ref: shift patterns\7f958034
-Ref: prologue instruction pattern\7f1002791
-Ref: window_save instruction pattern\7f1003284
-Ref: epilogue instruction pattern\7f1003561
-Node: Pattern Ordering\7f1021147
-Node: Dependent Patterns\7f1022383
-Node: Jump Patterns\7f1024003
-Ref: Jump Patterns-Footnote-1\7f1026150
-Node: Looping Patterns\7f1026198
-Node: Insn Canonicalizations\7f1030927
-Node: Expander Definitions\7f1035512
-Node: Insn Splitting\7f1043726
-Node: Including Patterns\7f1053327
-Node: Peephole Definitions\7f1055108
-Node: define_peephole\7f1056361
-Node: define_peephole2\7f1062691
-Node: Insn Attributes\7f1065757
-Node: Defining Attributes\7f1066939
-Ref: define_enum_attr\7f1070432
-Node: Expressions\7f1071468
-Node: Tagging Insns\7f1078218
-Node: Attr Example\7f1082571
-Node: Insn Lengths\7f1084944
-Node: Constant Attributes\7f1088003
-Node: Mnemonic Attribute\7f1089179
-Node: Delay Slots\7f1090698
-Node: Processor pipeline description\7f1093921
-Ref: Processor pipeline description-Footnote-1\7f1112739
-Node: Conditional Execution\7f1113063
-Node: Define Subst\7f1116546
-Node: Define Subst Example\7f1118582
-Node: Define Subst Pattern Matching\7f1121576
-Node: Define Subst Output Template\7f1122802
-Node: Constant Definitions\7f1124872
-Ref: define_enum\7f1128654
-Node: Iterators\7f1129142
-Node: Mode Iterators\7f1129720
-Node: Defining Mode Iterators\7f1130698
-Node: Substitutions\7f1132192
-Node: Examples\7f1134434
-Node: Code Iterators\7f1135882
-Node: Int Iterators\7f1138161
-Node: Subst Iterators\7f1140605
-Node: Target Macros\7f1142297
-Node: Target Structure\7f1145385
-Node: Driver\7f1147501
-Node: Run-time Target\7f1166313
-Node: Per-Function Data\7f1176024
-Node: Storage Layout\7f1178788
-Node: Type Layout\7f1205040
-Node: Registers\7f1220363
-Node: Register Basics\7f1221337
-Node: Allocation Order\7f1226845
-Node: Values in Registers\7f1229291
-Node: Leaf Functions\7f1236769
-Node: Stack Registers\7f1239628
-Node: Register Classes\7f1240900
-Node: Old Constraints\7f1271844
-Node: Stack and Calling\7f1278984
-Node: Frame Layout\7f1279518
-Node: Exception Handling\7f1290394
-Node: Stack Checking\7f1296606
-Node: Frame Registers\7f1301420
-Node: Elimination\7f1309679
-Node: Stack Arguments\7f1313909
-Node: Register Arguments\7f1320772
-Node: Scalar Return\7f1341073
-Node: Aggregate Return\7f1347160
-Node: Caller Saves\7f1351371
-Node: Function Entry\7f1352548
-Node: Profiling\7f1363642
-Node: Tail Calls\7f1365341
-Node: Stack Smashing Protection\7f1367244
-Node: Varargs\7f1368872
-Node: Trampolines\7f1375559
-Node: Library Calls\7f1381602
-Node: Addressing Modes\7f1386286
-Node: Anchored Addresses\7f1407254
-Node: Condition Code\7f1409897
-Node: CC0 Condition Codes\7f1412224
-Node: MODE_CC Condition Codes\7f1415470
-Node: Costs\7f1421922
-Node: Scheduling\7f1438384
-Node: Sections\7f1458342
-Node: PIC\7f1474040
-Node: Assembler Format\7f1476099
-Node: File Framework\7f1477237
-Ref: TARGET_HAVE_SWITCHABLE_BSS_SECTIONS\7f1484169
-Node: Data Output\7f1487439
-Node: Uninitialized Data\7f1495208
-Node: Label Output\7f1500219
-Node: Initialization\7f1523175
-Node: Macros for Initialization\7f1529136
-Node: Instruction Output\7f1535855
-Node: Dispatch Tables\7f1546478
-Node: Exception Region Output\7f1550862
-Node: Alignment Output\7f1557540
-Node: Debugging Info\7f1562119
-Node: All Debuggers\7f1562789
-Node: DBX Options\7f1565644
-Node: DBX Hooks\7f1571082
-Node: File Names and DBX\7f1572391
-Node: SDB and DWARF\7f1574503
-Node: VMS Debug\7f1580575
-Node: Floating Point\7f1581162
-Node: Mode Switching\7f1585638
-Node: Target Attributes\7f1589634
-Node: Emulated TLS\7f1598092
-Node: MIPS Coprocessors\7f1601482
-Node: PCH Target\7f1602779
-Node: C++ ABI\7f1604621
-Node: Named Address Spaces\7f1609415
-Node: Misc\7f1614349
-Ref: TARGET_SHIFT_TRUNCATION_MASK\7f1621091
-Node: Host Config\7f1669593
-Node: Host Common\7f1670661
-Node: Filesystem\7f1673035
-Node: Host Misc\7f1677150
-Node: Fragments\7f1679599
-Node: Target Fragment\7f1680794
-Node: Host Fragment\7f1691422
-Node: Collect2\7f1691662
-Node: Header Dirs\7f1694298
-Node: Type Information\7f1695721
-Node: GTY Options\7f1698997
-Node: Inheritance and GTY\7f1713517
-Ref: Inheritance and GTY-Footnote-1\7f1715080
-Node: User GC\7f1715350
-Node: GGC Roots\7f1719089
-Node: Files\7f1719802
-Node: Invoking the garbage collector\7f1722509
-Node: Troubleshooting\7f1724014
-Node: Plugins\7f1725089
-Node: Plugins loading\7f1726207
-Node: Plugin API\7f1727077
-Node: Plugins pass\7f1734740
-Node: Plugins GC\7f1736711
-Node: Plugins description\7f1738376
-Node: Plugins attr\7f1738912
-Node: Plugins recording\7f1741185
-Node: Plugins gate\7f1742035
-Node: Plugins tracking\7f1742626
-Node: Plugins building\7f1743214
-Node: LTO\7f1745004
-Node: LTO Overview\7f1745865
-Node: LTO object file layout\7f1751697
-Node: IPA\7f1756327
-Node: WHOPR\7f1765292
-Node: Internal flags\7f1769981
-Node: Funding\7f1771392
-Node: GNU Project\7f1773876
-Node: Copying\7f1774525
-Node: GNU Free Documentation License\7f1812036
-Node: Contributors\7f1837156
-Node: Option Index\7f1875028
-Node: Concept Index\7f1875905
+Ref: arm_neon_ok\7f223966
+Ref: arm_neonv2_ok\7f224124
+Ref: arm_neon_fp16_ok\7f224296
+Ref: arm_vfp3_ok\7f224736
+Node: Add Options\7f234805
+Node: Require Support\7f236122
+Node: Final Actions\7f238629
+Node: Ada Tests\7f243794
+Node: C Tests\7f245125
+Node: libgcj Tests\7f249520
+Node: LTO Testing\7f250647
+Node: gcov Testing\7f252295
+Node: profopt Testing\7f255285
+Node: compat Testing\7f257000
+Node: Torture Tests\7f261240
+Node: Options\7f262855
+Node: Option file format\7f263296
+Node: Option properties\7f270285
+Node: Passes\7f283312
+Node: Parsing pass\7f284202
+Node: Cilk Plus Transformation\7f287735
+Node: Gimplification pass\7f291117
+Node: Pass manager\7f292962
+Node: Tree SSA passes\7f294808
+Node: RTL passes\7f315875
+Node: Optimization info\7f328239
+Node: Dump setup\7f329058
+Node: Optimization groups\7f330187
+Node: Dump files and streams\7f331076
+Node: Dump output verbosity\7f332274
+Node: Dump types\7f333330
+Node: Dump examples\7f334820
+Node: GENERIC\7f336166
+Node: Deficiencies\7f338042
+Node: Tree overview\7f338283
+Node: Macros and Functions\7f342407
+Node: Identifiers\7f343232
+Node: Containers\7f344841
+Node: Types\7f345998
+Node: Declarations\7f358072
+Node: Working with declarations\7f358567
+Node: Internal structure\7f364171
+Node: Current structure hierarchy\7f364555
+Node: Adding new DECL node types\7f366648
+Node: Attributes\7f370932
+Node: Expression trees\7f372176
+Node: Constant expressions\7f373930
+Node: Storage References\7f378143
+Node: Unary and Binary Expressions\7f381662
+Node: Vectors\7f401810
+Node: Statements\7f406542
+Node: Basic Statements\7f407062
+Node: Blocks\7f411569
+Node: Statement Sequences\7f412973
+Node: Empty Statements\7f413306
+Node: Jumps\7f413880
+Node: Cleanups\7f414533
+Node: OpenMP\7f416300
+Node: Functions\7f422144
+Node: Function Basics\7f422615
+Node: Function Properties\7f426299
+Node: Language-dependent trees\7f429080
+Node: C and C++ Trees\7f429967
+Node: Types for C++\7f432871
+Node: Namespaces\7f437841
+Node: Classes\7f440947
+Node: Functions for C++\7f446024
+Node: Statements for C++\7f452275
+Node: C++ Expressions\7f461048
+Node: Java Trees\7f462553
+Node: GIMPLE\7f462666
+Node: Tuple representation\7f466290
+Node: GIMPLE instruction set\7f474594
+Node: GIMPLE Exception Handling\7f476210
+Node: Temporaries\7f478122
+Ref: Temporaries-Footnote-1\7f479440
+Node: Operands\7f479505
+Node: Compound Expressions\7f480266
+Node: Compound Lvalues\7f480500
+Node: Conditional Expressions\7f481262
+Node: Logical Operators\7f481921
+Node: Manipulating GIMPLE statements\7f488779
+Node: Tuple specific accessors\7f494715
+Node: 'GIMPLE_ASM'\7f495534
+Node: 'GIMPLE_ASSIGN'\7f498051
+Node: 'GIMPLE_BIND'\7f502157
+Node: 'GIMPLE_CALL'\7f503965
+Node: 'GIMPLE_CATCH'\7f508236
+Node: 'GIMPLE_COND'\7f509380
+Node: 'GIMPLE_DEBUG'\7f512168
+Node: 'GIMPLE_EH_FILTER'\7f515546
+Node: 'GIMPLE_LABEL'\7f517034
+Node: 'GIMPLE_NOP'\7f518009
+Node: 'GIMPLE_OMP_ATOMIC_LOAD'\7f518378
+Node: 'GIMPLE_OMP_ATOMIC_STORE'\7f519288
+Node: 'GIMPLE_OMP_CONTINUE'\7f519928
+Node: 'GIMPLE_OMP_CRITICAL'\7f521278
+Node: 'GIMPLE_OMP_FOR'\7f522216
+Node: 'GIMPLE_OMP_MASTER'\7f525731
+Node: 'GIMPLE_OMP_ORDERED'\7f526115
+Node: 'GIMPLE_OMP_PARALLEL'\7f526515
+Node: 'GIMPLE_OMP_RETURN'\7f529148
+Node: 'GIMPLE_OMP_SECTION'\7f529799
+Node: 'GIMPLE_OMP_SECTIONS'\7f530465
+Node: 'GIMPLE_OMP_SINGLE'\7f532072
+Node: 'GIMPLE_PHI'\7f533010
+Node: 'GIMPLE_RESX'\7f534297
+Node: 'GIMPLE_RETURN'\7f535016
+Node: 'GIMPLE_SWITCH'\7f535584
+Node: 'GIMPLE_TRY'\7f537386
+Node: 'GIMPLE_WITH_CLEANUP_EXPR'\7f539177
+Node: GIMPLE sequences\7f540060
+Node: Sequence iterators\7f543266
+Node: Adding a new GIMPLE statement code\7f551721
+Node: Statement and operand traversals\7f552997
+Node: Tree SSA\7f555589
+Node: Annotations\7f557377
+Node: SSA Operands\7f557782
+Node: SSA\7f571856
+Node: Alias analysis\7f582888
+Node: Memory model\7f586662
+Node: RTL\7f588021
+Node: RTL Objects\7f590209
+Node: RTL Classes\7f594083
+Node: Accessors\7f599080
+Node: Special Accessors\7f601474
+Node: Flags\7f607261
+Node: Machine Modes\7f622025
+Node: Constants\7f635313
+Node: Regs and Memory\7f642041
+Node: Arithmetic\7f659929
+Node: Comparisons\7f670011
+Node: Bit-Fields\7f674303
+Node: Vector Operations\7f675855
+Node: Conversions\7f677736
+Node: RTL Declarations\7f682234
+Node: Side Effects\7f683055
+Node: Incdec\7f700065
+Node: Assembler\7f703401
+Node: Debug Information\7f704946
+Node: Insns\7f706143
+Node: Calls\7f732564
+Node: Sharing\7f735157
+Node: Reading RTL\7f738268
+Node: Control Flow\7f739259
+Node: Basic Blocks\7f741028
+Node: Edges\7f746317
+Node: Profile information\7f754946
+Node: Maintaining the CFG\7f759630
+Node: Liveness information\7f765491
+Node: Loop Analysis and Representation\7f767617
+Node: Loop representation\7f768727
+Node: Loop querying\7f776290
+Node: Loop manipulation\7f779106
+Node: LCSSA\7f781467
+Node: Scalar evolutions\7f783536
+Node: loop-iv\7f786780
+Node: Number of iterations\7f788702
+Node: Dependency analysis\7f791508
+Node: Omega\7f797872
+Node: Machine Desc\7f799448
+Node: Overview\7f802011
+Node: Patterns\7f804051
+Node: Example\7f807489
+Node: RTL Template\7f808923
+Node: Output Template\7f819578
+Node: Output Statement\7f823541
+Node: Predicates\7f827880
+Node: Machine-Independent Predicates\7f830798
+Node: Defining Predicates\7f835742
+Node: Constraints\7f841705
+Node: Simple Constraints\7f843187
+Node: Multi-Alternative\7f856027
+Node: Class Preferences\7f858868
+Node: Modifiers\7f859760
+Node: Machine Constraints\7f864006
+Node: Disable Insn Alternatives\7f922174
+Node: Define Constraints\7f925075
+Node: C Constraint Interface\7f931860
+Node: Standard Names\7f935512
+Ref: shift patterns\7f958660
+Ref: prologue instruction pattern\7f1003417
+Ref: window_save instruction pattern\7f1003910
+Ref: epilogue instruction pattern\7f1004187
+Node: Pattern Ordering\7f1021773
+Node: Dependent Patterns\7f1023009
+Node: Jump Patterns\7f1024629
+Ref: Jump Patterns-Footnote-1\7f1026776
+Node: Looping Patterns\7f1026824
+Node: Insn Canonicalizations\7f1031553
+Node: Expander Definitions\7f1036138
+Node: Insn Splitting\7f1044352
+Node: Including Patterns\7f1053953
+Node: Peephole Definitions\7f1055734
+Node: define_peephole\7f1056987
+Node: define_peephole2\7f1063317
+Node: Insn Attributes\7f1066383
+Node: Defining Attributes\7f1067565
+Ref: define_enum_attr\7f1071058
+Node: Expressions\7f1072094
+Node: Tagging Insns\7f1078844
+Node: Attr Example\7f1083197
+Node: Insn Lengths\7f1085570
+Node: Constant Attributes\7f1088629
+Node: Mnemonic Attribute\7f1089805
+Node: Delay Slots\7f1091324
+Node: Processor pipeline description\7f1094547
+Ref: Processor pipeline description-Footnote-1\7f1113365
+Node: Conditional Execution\7f1113689
+Node: Define Subst\7f1117172
+Node: Define Subst Example\7f1119208
+Node: Define Subst Pattern Matching\7f1122202
+Node: Define Subst Output Template\7f1123428
+Node: Constant Definitions\7f1125498
+Ref: define_enum\7f1129280
+Node: Iterators\7f1129768
+Node: Mode Iterators\7f1130346
+Node: Defining Mode Iterators\7f1131324
+Node: Substitutions\7f1132818
+Node: Examples\7f1135060
+Node: Code Iterators\7f1136508
+Node: Int Iterators\7f1138787
+Node: Subst Iterators\7f1141231
+Node: Target Macros\7f1142923
+Node: Target Structure\7f1146011
+Node: Driver\7f1148127
+Node: Run-time Target\7f1166939
+Node: Per-Function Data\7f1176650
+Node: Storage Layout\7f1179414
+Node: Type Layout\7f1205666
+Node: Registers\7f1220989
+Node: Register Basics\7f1221963
+Node: Allocation Order\7f1227471
+Node: Values in Registers\7f1229917
+Node: Leaf Functions\7f1237395
+Node: Stack Registers\7f1240254
+Node: Register Classes\7f1241526
+Node: Old Constraints\7f1272470
+Node: Stack and Calling\7f1279610
+Node: Frame Layout\7f1280144
+Node: Exception Handling\7f1291020
+Node: Stack Checking\7f1297232
+Node: Frame Registers\7f1302046
+Node: Elimination\7f1310305
+Node: Stack Arguments\7f1314535
+Node: Register Arguments\7f1321719
+Node: Scalar Return\7f1342020
+Node: Aggregate Return\7f1348107
+Node: Caller Saves\7f1352318
+Node: Function Entry\7f1353495
+Node: Profiling\7f1364589
+Node: Tail Calls\7f1366288
+Node: Stack Smashing Protection\7f1368191
+Node: Varargs\7f1369819
+Node: Trampolines\7f1376506
+Node: Library Calls\7f1382549
+Node: Addressing Modes\7f1387233
+Node: Anchored Addresses\7f1408201
+Node: Condition Code\7f1410844
+Node: CC0 Condition Codes\7f1413171
+Node: MODE_CC Condition Codes\7f1416417
+Node: Costs\7f1422869
+Node: Scheduling\7f1439331
+Node: Sections\7f1459289
+Node: PIC\7f1474987
+Node: Assembler Format\7f1477046
+Node: File Framework\7f1478184
+Ref: TARGET_HAVE_SWITCHABLE_BSS_SECTIONS\7f1485116
+Node: Data Output\7f1488386
+Node: Uninitialized Data\7f1496155
+Node: Label Output\7f1501166
+Node: Initialization\7f1524122
+Node: Macros for Initialization\7f1530083
+Node: Instruction Output\7f1536802
+Node: Dispatch Tables\7f1547425
+Node: Exception Region Output\7f1551809
+Node: Alignment Output\7f1558487
+Node: Debugging Info\7f1563066
+Node: All Debuggers\7f1563736
+Node: DBX Options\7f1566591
+Node: DBX Hooks\7f1572029
+Node: File Names and DBX\7f1573338
+Node: SDB and DWARF\7f1575450
+Node: VMS Debug\7f1581522
+Node: Floating Point\7f1582109
+Node: Mode Switching\7f1586585
+Node: Target Attributes\7f1590581
+Node: Emulated TLS\7f1599039
+Node: MIPS Coprocessors\7f1602429
+Node: PCH Target\7f1603726
+Node: C++ ABI\7f1605568
+Node: Named Address Spaces\7f1610362
+Node: Misc\7f1615296
+Ref: TARGET_SHIFT_TRUNCATION_MASK\7f1622038
+Node: Host Config\7f1670540
+Node: Host Common\7f1671608
+Node: Filesystem\7f1673982
+Node: Host Misc\7f1678097
+Node: Fragments\7f1680546
+Node: Target Fragment\7f1681741
+Node: Host Fragment\7f1692369
+Node: Collect2\7f1692609
+Node: Header Dirs\7f1695245
+Node: Type Information\7f1696668
+Node: GTY Options\7f1699944
+Node: Inheritance and GTY\7f1714464
+Ref: Inheritance and GTY-Footnote-1\7f1716027
+Node: User GC\7f1716297
+Node: GGC Roots\7f1720036
+Node: Files\7f1720749
+Node: Invoking the garbage collector\7f1723456
+Node: Troubleshooting\7f1724961
+Node: Plugins\7f1726036
+Node: Plugins loading\7f1727154
+Node: Plugin API\7f1728024
+Node: Plugins pass\7f1735687
+Node: Plugins GC\7f1737658
+Node: Plugins description\7f1739323
+Node: Plugins attr\7f1739859
+Node: Plugins recording\7f1742132
+Node: Plugins gate\7f1742982
+Node: Plugins tracking\7f1743573
+Node: Plugins building\7f1744161
+Node: LTO\7f1745951
+Node: LTO Overview\7f1746812
+Node: LTO object file layout\7f1752644
+Node: IPA\7f1757274
+Node: WHOPR\7f1766239
+Node: Internal flags\7f1770928
+Node: Funding\7f1772339
+Node: GNU Project\7f1774823
+Node: Copying\7f1775472
+Node: GNU Free Documentation License\7f1812983
+Node: Contributors\7f1838103
+Node: Option Index\7f1875975
+Node: Concept Index\7f1876852
\1f
End Tag Table
.\" ========================================================================
.\"
.IX Title "GCJ-DBTOOL 1"
-.TH GCJ-DBTOOL 1 "2014-04-22" "gcc-4.9.0" "GNU"
+.TH GCJ-DBTOOL 1 "2014-07-16" "gcc-4.9.1" "GNU"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
.\" ========================================================================
.\"
.IX Title "GCJ 1"
-.TH GCJ 1 "2014-04-22" "gcc-4.9.0" "GNU"
+.TH GCJ 1 "2014-07-16" "gcc-4.9.1" "GNU"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
.\" ========================================================================
.\"
.IX Title "GCOV 1"
-.TH GCOV 1 "2014-04-22" "gcc-4.9.0" "GNU"
+.TH GCOV 1 "2014-07-16" "gcc-4.9.1" "GNU"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
.\" ========================================================================
.\"
.IX Title "GFORTRAN 1"
-.TH GFORTRAN 1 "2014-04-22" "gcc-4.9.0" "GNU"
+.TH GFORTRAN 1 "2014-07-16" "gcc-4.9.1" "GNU"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
.\" ========================================================================
.\"
.IX Title "GIJ 1"
-.TH GIJ 1 "2014-04-22" "gcc-4.9.0" "GNU"
+.TH GIJ 1 "2014-07-16" "gcc-4.9.1" "GNU"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
.\" ========================================================================
.\"
.IX Title "GPL 7"
-.TH GPL 7 "2014-04-22" "gcc-4.9.0" "GNU"
+.TH GPL 7 "2014-07-16" "gcc-4.9.1" "GNU"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
.\" ========================================================================
.\"
.IX Title "GRMIC 1"
-.TH GRMIC 1 "2014-04-22" "gcc-4.9.0" "GNU"
+.TH GRMIC 1 "2014-07-16" "gcc-4.9.1" "GNU"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
Unlike standard bootstrap, several additional restrictions apply. The
compiler used to build @code{stage1} needs to support a 64-bit integral type.
-It is recommended to only use GCC for this. Also parallel make is currently
-not supported since collisions in profile collecting may occur.
+It is recommended to only use GCC for this.
@html
<hr />
Solaris 2 (SPARC, Intel):
@itemize
@item
-@uref{http://www.sunfreeware.com/,,Sunfreeware}
-
-@item
-@uref{http://www.blastwave.org/,,Blastwave}
-
-@item
@uref{http://www.opencsw.org/,,OpenCSW}
@item
@end html
@anchor{aarch64-x-x}
@heading aarch64*-*-*
-Pre 2.24 binutils does not have support for selecting -mabi and does not
-support ILP32. If GCC 4.9 or later is built with pre 2.24, GCC will not
-support option -mabi=ilp32.
+Binutils pre 2.24 does not have support for selecting @option{-mabi} and
+does not support ILP32. If it is used to build GCC 4.9 or later, GCC will
+not support option @option{-mabi=ilp32}.
@html
<hr />
@gccoptlist{-meb -mel -mno-crt0}
@emph{MSP430 Options}
-@gccoptlist{-msim -masm-hex -mmcu= -mcpu= -mlarge -msmall -mrelax}
+@gccoptlist{-msim -masm-hex -mmcu= -mcpu= -mlarge -msmall -mrelax @gol
+-mhwmult=}
@emph{NDS32 Options}
@gccoptlist{-mbig-endian -mlittle-endian @gol
-mpretend-cmove -mtas}
@emph{Solaris 2 Options}
-@gccoptlist{-mimpure-text -mno-impure-text @gol
+@gccoptlist{-mclear-hwcap -mno-clear-hwcap -mimpure-text -mno-impure-text @gol
-pthreads -pthread}
@emph{SPARC Options}
-mhard-quad-float -msoft-quad-float @gol
-mstack-bias -mno-stack-bias @gol
-munaligned-doubles -mno-unaligned-doubles @gol
+-muser-mode -mno-user-mode @gol
-mv8plus -mno-v8plus -mvis -mno-vis @gol
-mvis2 -mno-vis2 -mvis3 -mno-vis3 @gol
-mcbcond -mno-cbcond @gol
helpful for the x86-64 architecture, which implicitly zero-extends in 64-bit
registers after writing to their lower 32-bit half.
-Enabled for AArch64 and x86 at levels @option{-O2}, @option{-O3}.
+Enabled for Alpha, AArch64 and x86 at levels @option{-O2},
+@option{-O3}, @option{-Os}.
@item -flive-range-shrinkage
@opindex flive-range-shrinkage
@option{ipa-cp-value-list-size} is the maximum number of values and types it
stores per one formal parameter of a function.
+@item ipa-cp-eval-threshold
+IPA-CP calculates its own score of cloning profitability heuristics
+and performs those cloning opportunities with scores that exceed
+@option{ipa-cp-eval-threshold}.
+
+@item ipa-max-agg-items
+IPA-CP is also capable to propagate a number of scalar values passed
+in an aggregate. @option{ipa-max-agg-items} controls the maximum
+number of such values per one parameter.
+
+@item ipa-cp-loop-hint-bonus
+When IPA-CP determines that a cloning candidate would make the number
+of iterations of a loop known, it adds a bonus of
+@option{ipa-cp-loop-hint-bonus} bonus to the profitability score of
+the candidate.
+
+@item ipa-cp-array-index-hint-bonus
+When IPA-CP determines that a cloning candidate would make the index of
+an array access known, it adds a bonus of
+@option{ipa-cp-array-index-hint-bonus} bonus to the profitability
+score of the candidate.
+
@item lto-partitions
Specify desired number of partitions produced during WHOPR compilation.
The number of partitions should exceed the number of CPUs used for compilation.
linker to perform certain optimizations that cannot be done until
the final link.
+@item mhwmult=
+@opindex mhwmult=
+Describes the type of hardware multiply supported by the target.
+Accepted values are @code{none} for no hardware multiply, @code{16bit}
+for the original 16-bit-only multiply supported by early MCUs.
+@code{32bit} for the 16/32-bit multiply supported by later MCUs and
+@code{f5series} for the 16/32-bit multiply supported by F5-series MCUs.
+A value of @code{auto} can also be given. This tells GCC to deduce
+the hardware multiply support based upon the MCU name provided by the
+@option{-mmcu} option. If no @option{-mmcu} option is specified then
+@code{32bit} hardware multiply support is assumed. @code{auto} is the
+default setting.
+
+Hardware multiplies are normally performed by calling a library
+routine. This saves space in the generated code. When compiling at
+@code{-O3} or higher however the hardware multiplier is invoked
+inline. This makes for bigger, but faster code.
+
+The hardware multiply routines disable interrupts whilst running and
+restore the previous interrupt state when they finish. This makes
+them safe to use inside interrupt handlers as well as in normal code.
+
@end table
@node NDS32 Options
These @samp{-m} options are supported on Solaris 2:
@table @gcctabopt
+@item -mclear-hwcap
+@opindex mclear-hwcap
+@option{-mclear-hwcap} tells the compiler to remove the hardware
+capabilities generated by the Solaris assembler. This is only necessary
+when object files use ISA extensions not supported by the current
+machine, but check at runtime whether or not to use them.
+
@item -mimpure-text
@opindex mimpure-text
@option{-mimpure-text}, used in addition to @option{-shared}, tells
generated by other compilers. It is not the default because it results
in a performance loss, especially for floating-point code.
+@item -muser-mode
+@itemx -mno-user-mode
+@opindex muser-mode
+@opindex mno-user-mode
+Do not generate code that can only run in supervisor mode. This is relevant
+only for the @code{casa} instruction emitted for the LEON3 processor. The
+default is @option{-mno-user-mode}.
+
@item -mno-faster-structs
@itemx -mfaster-structs
@opindex mno-faster-structs
.\" ========================================================================
.\"
.IX Title "JCF-DUMP 1"
-.TH JCF-DUMP 1 "2014-04-22" "gcc-4.9.0" "GNU"
+.TH JCF-DUMP 1 "2014-07-16" "gcc-4.9.1" "GNU"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
.\" ========================================================================
.\"
.IX Title "JV-CONVERT 1"
-.TH JV-CONVERT 1 "2014-04-22" "gcc-4.9.0" "GNU"
+.TH JV-CONVERT 1 "2014-07-16" "gcc-4.9.1" "GNU"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
.\" ========================================================================
.\"
.IX Title "REBUILD-GCJ-DB 1"
-.TH REBUILD-GCJ-DB 1 "2014-04-22" "gcc-4.9.0" "GNU"
+.TH REBUILD-GCJ-DB 1 "2014-07-16" "gcc-4.9.1" "GNU"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
@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.
@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_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_ppu_ok
PowerPC target supports @code{-mcpu=cell}.
@item powerpc_spu
PowerPC target supports PowerPC SPU.
-@item spu_auto_overlay
-SPU target has toolchain that supports automatic overlay generation.
-
@item powerpc_vsx_ok
PowerPC target supports @code{-mvsx}.
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 spu_auto_overlay
+SPU target has toolchain that supports automatic overlay generation.
+
@item vmx_hw
PowerPC target supports executing AltiVec instructions.
+
+@item vsx_hw
+PowerPC target supports executing VSX instructions (ISA 2.06).
@end table
@subsubsection Other hardware attributes
@c above is overfull. not sure what to do. --mew 5feb93 did
@c something, not sure if it looks good. --mew 10feb93
+@defmac INCOMING_REG_PARM_STACK_SPACE (@var{fndecl})
+Like @code{REG_PARM_STACK_SPACE}, but for incoming register arguments.
+Define this macro if space guaranteed when compiling a function body
+is different to space required when making a call, a situation that
+can arise with K&R style function definitions.
+@end defmac
+
@defmac OUTGOING_REG_PARM_STACK_SPACE (@var{fntype})
Define this to a nonzero value if it is the responsibility of the
caller to allocate the area reserved for arguments passed in registers
@c above is overfull. not sure what to do. --mew 5feb93 did
@c something, not sure if it looks good. --mew 10feb93
+@defmac INCOMING_REG_PARM_STACK_SPACE (@var{fndecl})
+Like @code{REG_PARM_STACK_SPACE}, but for incoming register arguments.
+Define this macro if space guaranteed when compiling a function body
+is different to space required when making a call, a situation that
+can arise with K&R style function definitions.
+@end defmac
+
@defmac OUTGOING_REG_PARM_STACK_SPACE (@var{fntype})
Define this to a nonzero value if it is the responsibility of the
caller to allocate the area reserved for arguments passed in registers
== (unsigned HOST_WIDE_INT) htwice)
&& (labs_den <= ltwice)))
{
- if (*hquo < 0)
+ if (quo_neg)
/* quo = quo - 1; */
add_double (*lquo, *hquo,
(HOST_WIDE_INT) -1, (HOST_WIDE_INT) -1, lquo, hquo);
static void
remove_addr_table_entry (addr_table_entry *entry)
{
- addr_table_entry *node;
-
gcc_assert (dwarf_split_debug_info && addr_index_table);
- node = (addr_table_entry *) htab_find (addr_index_table, entry);
/* After an index is assigned, the table is frozen. */
- gcc_assert (node->refcount > 0 && node->index == NO_INDEX_ASSIGNED);
- node->refcount--;
+ gcc_assert (entry->refcount > 0 && entry->index == NO_INDEX_ASSIGNED);
+ entry->refcount--;
}
/* Given a location list, remove all addresses it refers to from the
break;
case DW_OP_GNU_addr_index:
case DW_OP_GNU_const_index:
- if ((loc->dw_loc_opc == DW_OP_GNU_addr_index
- || (loc->dw_loc_opc == DW_OP_GNU_const_index && loc->dtprel))
- && resolve_one_addr (&loc->dw_loc_oprnd1.val_entry->addr.rtl,
- NULL))
- return false;
+ if (loc->dw_loc_opc == DW_OP_GNU_addr_index
+ || (loc->dw_loc_opc == DW_OP_GNU_const_index && loc->dtprel))
+ {
+ rtx rtl = loc->dw_loc_oprnd1.val_entry->addr.rtl;
+ if (resolve_one_addr (&rtl, NULL))
+ return false;
+ remove_addr_table_entry (loc->dw_loc_oprnd1.val_entry);
+ loc->dw_loc_oprnd1.val_entry =
+ add_addr_table_entry (rtl, ate_kind_rtx);
+ }
break;
case DW_OP_const4u:
case DW_OP_const8u:
dwarf_strict ? DW_AT_macro_info : DW_AT_GNU_macros,
macinfo_section_label);
- if (dwarf_split_debug_info && addr_index_table != NULL)
+ if (dwarf_split_debug_info)
{
/* optimize_location_lists calculates the size of the lists,
so index them first, and assign indices to the entries.
Although optimize_location_lists will remove entries from
the table, it only does so for duplicates, and therefore
only reduces ref_counts to 1. */
- unsigned int index = 0;
index_location_lists (comp_unit_die ());
- htab_traverse_noresize (addr_index_table,
- index_addr_table_entry, &index);
+
+ if (addr_index_table != NULL)
+ {
+ unsigned int index = 0;
+ htab_traverse_noresize (addr_index_table,
+ index_addr_table_entry, &index);
+ }
}
+
if (have_location_lists)
optimize_location_lists (comp_unit_die ());
optab lrotate_optab = rotl_optab;
optab rrotate_optab = rotr_optab;
enum machine_mode op1_mode;
+ enum machine_mode scalar_mode = mode;
int attempt;
bool speed = optimize_insn_for_speed_p ();
+ if (VECTOR_MODE_P (mode))
+ scalar_mode = GET_MODE_INNER (mode);
op1 = amount;
op1_mode = GET_MODE (op1);
{
if (CONST_INT_P (op1)
&& ((unsigned HOST_WIDE_INT) INTVAL (op1) >=
- (unsigned HOST_WIDE_INT) GET_MODE_BITSIZE (mode)))
+ (unsigned HOST_WIDE_INT) GET_MODE_BITSIZE (scalar_mode)))
op1 = GEN_INT ((unsigned HOST_WIDE_INT) INTVAL (op1)
- % GET_MODE_BITSIZE (mode));
+ % GET_MODE_BITSIZE (scalar_mode));
else if (GET_CODE (op1) == SUBREG
&& subreg_lowpart_p (op1)
&& SCALAR_INT_MODE_P (GET_MODE (SUBREG_REG (op1)))
amount instead. */
if (rotate
&& CONST_INT_P (op1)
- && IN_RANGE (INTVAL (op1), GET_MODE_BITSIZE (mode) / 2 + left,
- GET_MODE_BITSIZE (mode) - 1))
+ && IN_RANGE (INTVAL (op1), GET_MODE_BITSIZE (scalar_mode) / 2 + left,
+ GET_MODE_BITSIZE (scalar_mode) - 1))
{
- op1 = GEN_INT (GET_MODE_BITSIZE (mode) - INTVAL (op1));
+ op1 = GEN_INT (GET_MODE_BITSIZE (scalar_mode) - INTVAL (op1));
left = !left;
code = left ? LROTATE_EXPR : RROTATE_EXPR;
}
if (code == LSHIFT_EXPR
&& CONST_INT_P (op1)
&& INTVAL (op1) > 0
- && INTVAL (op1) < GET_MODE_PRECISION (mode)
+ && INTVAL (op1) < GET_MODE_PRECISION (scalar_mode)
&& INTVAL (op1) < MAX_BITS_PER_WORD
&& (shift_cost (speed, mode, INTVAL (op1))
> INTVAL (op1) * add_cost (speed, mode))
if (op1 == const0_rtx)
return shifted;
else if (CONST_INT_P (op1))
- other_amount = GEN_INT (GET_MODE_BITSIZE (mode)
+ other_amount = GEN_INT (GET_MODE_BITSIZE (scalar_mode)
- INTVAL (op1));
else
{
other_amount
= simplify_gen_unary (NEG, GET_MODE (op1),
op1, GET_MODE (op1));
- HOST_WIDE_INT mask = GET_MODE_PRECISION (mode) - 1;
+ HOST_WIDE_INT mask = GET_MODE_PRECISION (scalar_mode) - 1;
other_amount
= simplify_gen_binary (AND, GET_MODE (op1), other_amount,
gen_int_mode (mask, GET_MODE (op1)));
case TRUNC_DIV_EXPR:
case ROUND_DIV_EXPR:
- case FLOOR_DIV_EXPR:
- case CEIL_DIV_EXPR:
case EXACT_DIV_EXPR:
/* In general we can't negate A / B, because if A is INT_MIN and
B is 1, we may turn this into INT_MIN / -1 which is undefined
case TRUNC_DIV_EXPR:
case ROUND_DIV_EXPR:
- case FLOOR_DIV_EXPR:
- case CEIL_DIV_EXPR:
case EXACT_DIV_EXPR:
/* In general we can't negate A / B, because if A is INT_MIN and
B is 1, we may turn this into INT_MIN / -1 which is undefined
/* Transform comparisons of the form X +- C1 CMP Y +- C2 to
X CMP Y +- C2 +- C1 for signed X, Y. This is valid if
the resulting offset is smaller in absolute value than the
- original one. */
+ original one and has the same sign. */
if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))
&& (TREE_CODE (arg0) == PLUS_EXPR || TREE_CODE (arg0) == MINUS_EXPR)
&& (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST
"a comparison");
/* Put the constant on the side where it doesn't overflow and is
- of lower absolute value than before. */
+ of lower absolute value and of same sign than before. */
cst = int_const_binop (TREE_CODE (arg0) == TREE_CODE (arg1)
? MINUS_EXPR : PLUS_EXPR,
const2, const1);
if (!TREE_OVERFLOW (cst)
- && tree_int_cst_compare (const2, cst) == tree_int_cst_sgn (const2))
+ && tree_int_cst_compare (const2, cst) == tree_int_cst_sgn (const2)
+ && tree_int_cst_sgn (cst) == tree_int_cst_sgn (const2))
{
fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
return fold_build2_loc (loc, code, type,
- variable1,
- fold_build2_loc (loc,
- TREE_CODE (arg1), TREE_TYPE (arg1),
- variable2, cst));
+ variable1,
+ fold_build2_loc (loc, TREE_CODE (arg1),
+ TREE_TYPE (arg1),
+ variable2, cst));
}
cst = int_const_binop (TREE_CODE (arg0) == TREE_CODE (arg1)
? MINUS_EXPR : PLUS_EXPR,
const1, const2);
if (!TREE_OVERFLOW (cst)
- && tree_int_cst_compare (const1, cst) == tree_int_cst_sgn (const1))
+ && tree_int_cst_compare (const1, cst) == tree_int_cst_sgn (const1)
+ && tree_int_cst_sgn (cst) == tree_int_cst_sgn (const1))
{
fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
return fold_build2_loc (loc, code, type,
- fold_build2_loc (loc, TREE_CODE (arg0), TREE_TYPE (arg0),
- variable1, cst),
- variable2);
+ fold_build2_loc (loc, TREE_CODE (arg0),
+ TREE_TYPE (arg0),
+ variable1, cst),
+ variable2);
}
}
{
double_int c1, c2, c3, msk;
int width = TYPE_PRECISION (type), w;
- bool try_simplify = true;
c1 = tree_to_double_int (TREE_OPERAND (arg0, 1));
c2 = tree_to_double_int (arg1);
}
}
- /* If X is a tree of the form (Y * K1) & K2, this might conflict
- with that optimization from the BIT_AND_EXPR optimizations.
- This could end up in an infinite recursion. */
- if (TREE_CODE (TREE_OPERAND (arg0, 0)) == MULT_EXPR
- && TREE_CODE (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1))
- == INTEGER_CST)
- {
- tree t = TREE_OPERAND (TREE_OPERAND (arg0, 0), 1);
- double_int masked = mask_with_tz (type, c3, tree_to_double_int (t));
-
- try_simplify = (masked != c1);
- }
-
- if (try_simplify && c3 != c1)
+ if (c3 != c1)
return fold_build2_loc (loc, BIT_IOR_EXPR, type,
fold_build2_loc (loc, BIT_AND_EXPR, type,
TREE_OPERAND (arg0, 0),
&& TREE_CODE (arg0) == MULT_EXPR
&& TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
{
+ double_int darg1 = tree_to_double_int (arg1);
double_int masked
- = mask_with_tz (type, tree_to_double_int (arg1),
+ = mask_with_tz (type, darg1,
tree_to_double_int (TREE_OPERAND (arg0, 1)));
if (masked.is_zero ())
return omit_two_operands_loc (loc, type, build_zero_cst (type),
arg0, arg1);
- else if (masked != tree_to_double_int (arg1))
- return fold_build2_loc (loc, code, type, op0,
- double_int_to_tree (type, masked));
+ else if (masked != darg1)
+ {
+ /* Avoid the transform if arg1 is a mask of some
+ mode which allows further optimizations. */
+ int pop = darg1.popcount ();
+ if (!(pop >= BITS_PER_UNIT
+ && exact_log2 (pop) != -1
+ && double_int::mask (pop) == darg1))
+ return fold_build2_loc (loc, code, type, op0,
+ double_int_to_tree (type, masked));
+ }
}
/* For constants M and N, if M == (1LL << cst) - 1 && (N & M) == M,
/* See if we can shorten the right shift. */
if (shiftc < prec)
shift_type = inner_type;
+ /* Otherwise X >> C1 is all zeros, so we'll optimize
+ it into (X, 0) later on by making sure zerobits
+ is all ones. */
}
}
zerobits = ~(unsigned HOST_WIDE_INT) 0;
- zerobits >>= HOST_BITS_PER_WIDE_INT - shiftc;
- zerobits <<= prec - shiftc;
+ if (shiftc < prec)
+ {
+ zerobits >>= HOST_BITS_PER_WIDE_INT - shiftc;
+ zerobits <<= prec - shiftc;
+ }
/* For arithmetic shift if sign bit could be set, zerobits
can contain actually sign bits, so no transformation is
possible, unless MASK masks them all away. In that
/* ((X << 16) & 0xff00) is (X, 0). */
if ((mask & zerobits) == mask)
return omit_one_operand_loc (loc, type,
- build_int_cst (type, 0), arg0);
+ build_int_cst (type, 0), arg0);
newmask = mask | zerobits;
if (newmask != mask && (newmask & (newmask + 1)) == 0)
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
+2014-07-07 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/61459
+ PR fortran/58883
+ * trans-expr.c (fcncall_realloc_result): Use the natural type
+ for the address expression of 'res_desc'.
+
+2014-07-07 Dominique d'Humieres <dominiq@lps.ens.fr>
+ Mikael Morin <mikael@gcc.gnu.org>
+
+ PR fortran/41936
+ * trans-expr.c (gfc_conv_expr_reference): Deallocate array
+ components.
+
+2014-07-02 Jakub Jelinek <jakub@redhat.com>
+ Fritz Reese <Reese-Fritz@zai.com>
+
+ * decl.c (variable_decl): Reject old style initialization
+ for derived type components.
+
+2014-06-30 Jakub Jelinek <jakub@redhat.com>
+
+ * module.c (MOD_VERSION): Revert back to 12.
+ (MOD_VERSION_OMP4): Define.
+ (module_omp4): New variable.
+ (mio_symbol): Call mio_omp_declare_simd only if module_omp4.
+ (read_module): Load omp udrs only if module_omp4.
+ (write_module): Write omp udrs only if module_omp4.
+ (find_omp_declare_simd): New function.
+ (gfc_dump_module): Compute module_omp4. Use MOD_VERSION_OMP4
+ if module_omp4.
+ (gfc_use_module): Handle MOD_VERSION_OMP4, set module_omp4.
+
+ Backported from mainline
+ 2014-06-25 Jakub Jelinek <jakub@redhat.com>
+
+ * trans.h (gfc_omp_clause_linear_ctor): New prototype.
+ * trans-openmp.c (gfc_omp_linear_clause_add_loop,
+ gfc_omp_clause_linear_ctor): New functions.
+ (gfc_trans_omp_clauses): Make sure OMP_CLAUSE_LINEAR_STEP has
+ correct type. Set OMP_CLAUSE_LINEAR_ARRAY flag if needed.
+ * f95-lang.c (LANG_HOOKS_OMP_CLAUSE_LINEAR_CTOR): Redefine.
+
+ 2014-06-24 Jakub Jelinek <jakub@redhat.com>
+
+ * dump-parse-tree.c (show_omp_namelist): Use n->udr->udr instead
+ of n->udr.
+ * f95-lang.c (gfc_init_builtin_functions): Initialize
+ BUILT_IN_ASSUME_ALIGNED.
+ * gfortran.h (gfc_omp_namelist): Change udr field type to
+ struct gfc_omp_namelist_udr.
+ (gfc_omp_namelist_udr): New type.
+ (gfc_get_omp_namelist_udr): Define.
+ (gfc_resolve_code): New prototype.
+ * match.c (gfc_free_omp_namelist): Free name->udr.
+ * module.c (intrinsics): Add INTRINSIC_USER.
+ (fix_mio_expr): Likewise.
+ (mio_expr): Handle INSTRINSIC_USER and non-resolved EXPR_FUNCTION.
+ * openmp.c (gfc_match_omp_clauses): Adjust initialization of n->udr.
+ (gfc_match_omp_declare_reduction): Treat len=: the same as len=*.
+ Set attr.flavor on omp_{out,in,priv,orig} artificial variables.
+ (struct resolve_omp_udr_callback_data): New type.
+ (resolve_omp_udr_callback, resolve_omp_udr_callback2,
+ resolve_omp_udr_clause): New functions.
+ (resolve_omp_clauses): Adjust for n->udr changes, resolve UDR clauses
+ here.
+ (omp_udr_callback): Don't check for implicitly declared functions
+ here.
+ (gfc_resolve_omp_udr): Don't call gfc_resolve. Don't check for
+ implicitly declared subroutines here.
+ * resolve.c (resolve_function): If value.function.isym is non-NULL,
+ consider it already resolved.
+ (resolve_code): Renamed to ...
+ (gfc_resolve_code): ... this. No longer static.
+ (gfc_resolve_blocks, generate_component_assignments, resolve_codes):
+ Adjust callers.
+ * trans-openmp.c (gfc_omp_privatize_by_reference): Don't privatize
+ by reference type (C_PTR) variables.
+ (gfc_omp_finish_clause): Make sure OMP_CLAUSE_SIZE is non-NULL.
+ (gfc_trans_omp_udr_expr): Remove.
+ (gfc_trans_omp_array_reduction_or_udr): Adjust for n->udr changes.
+ Don't call gfc_trans_omp_udr_expr, even for sym->attr.dimension
+ expand it as assignment or subroutine call. Don't initialize
+ value.function.isym.
+
+ 2014-06-18 Tobias Burnus <burnus@net-b.de>
+
+ * gfortran.texi (OpenMP): Update refs to OpenMP 4.0.
+ * intrinsic.texi (OpenMP Modules): Ditto.
+
+ 2014-06-18 Jakub Jelinek <jakub@redhat.com>
+
+ * cpp.c (cpp_define_builtins): Change _OPENMP macro to
+ 201307.
+ * dump-parse-tree.c (show_omp_namelist): Add list_type
+ argument. Adjust for rop being u.reduction_op now,
+ handle depend_op or map_op.
+ (show_omp_node): Adjust callers. Print some new
+ OpenMP 4.0 clauses, adjust for OMP_LIST_DEPEND_{IN,OUT}
+ becoming a single OMP_LIST_DEPEND.
+ * f95-lang.c (gfc_handle_omp_declare_target_attribute): New
+ function.
+ (gfc_attribute_table): New variable.
+ (LANG_HOOKS_OMP_FINISH_CLAUSE, LANG_HOOKS_ATTRIBUTE_TABLE): Redefine.
+ * frontend-passes.c (gfc_code_walker): Handle new OpenMP target
+ EXEC_OMP_* codes and new clauses.
+ * gfortran.h (gfc_statement): Add ST_OMP_TARGET, ST_OMP_END_TARGET,
+ ST_OMP_TARGET_DATA, ST_OMP_END_TARGET_DATA, ST_OMP_TARGET_UPDATE,
+ ST_OMP_DECLARE_TARGET, ST_OMP_TEAMS, ST_OMP_END_TEAMS,
+ ST_OMP_DISTRIBUTE, ST_OMP_END_DISTRIBUTE, ST_OMP_DISTRIBUTE_SIMD,
+ ST_OMP_END_DISTRIBUTE_SIMD, ST_OMP_DISTRIBUTE_PARALLEL_DO,
+ ST_OMP_END_DISTRIBUTE_PARALLEL_DO, ST_OMP_DISTRIBUTE_PARALLEL_DO_SIMD,
+ ST_OMP_END_DISTRIBUTE_PARALLEL_DO_SIMD, ST_OMP_TARGET_TEAMS,
+ ST_OMP_END_TARGET_TEAMS, ST_OMP_TEAMS_DISTRIBUTE,
+ ST_OMP_END_TEAMS_DISTRIBUTE, ST_OMP_TEAMS_DISTRIBUTE_SIMD,
+ ST_OMP_END_TEAMS_DISTRIBUTE_SIMD, ST_OMP_TARGET_TEAMS_DISTRIBUTE,
+ ST_OMP_END_TARGET_TEAMS_DISTRIBUTE,
+ ST_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD,
+ ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_SIMD,
+ ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO,
+ ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO,
+ ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO,
+ ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO,
+ ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD,
+ ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD,
+ ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD and
+ ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD.
+ (symbol_attribute): Add omp_declare_target field.
+ (gfc_omp_depend_op, gfc_omp_map_op): New enums.
+ (gfc_omp_namelist): Replace rop field with union
+ containing reduction_op, depend_op and map_op.
+ (OMP_LIST_DEPEND_IN, OMP_LIST_DEPEND_OUT): Remove.
+ (OMP_LIST_DEPEND, OMP_LIST_MAP, OMP_LIST_TO, OMP_LIST_FROM): New.
+ (gfc_omp_clauses): Add num_teams, device, thread_limit,
+ dist_sched_kind, dist_chunk_size fields.
+ (gfc_common_head): Add omp_declare_target field.
+ (gfc_exec_op): Add EXEC_OMP_TARGET, EXEC_OMP_TARGET_DATA,
+ EXEC_OMP_TEAMS, EXEC_OMP_DISTRIBUTE, EXEC_OMP_DISTRIBUTE_SIMD,
+ EXEC_OMP_DISTRIBUTE_PARALLEL_DO, EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD,
+ EXEC_OMP_TARGET_TEAMS, EXEC_OMP_TEAMS_DISTRIBUTE,
+ EXEC_OMP_TEAMS_DISTRIBUTE_SIMD, EXEC_OMP_TARGET_TEAMS_DISTRIBUTE,
+ EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD,
+ EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO,
+ EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO,
+ EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD,
+ EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD and
+ EXEC_OMP_TARGET_UPDATE.
+ (gfc_add_omp_declare_target): New prototype.
+ * match.h (gfc_match_omp_declare_target, gfc_match_omp_distribute,
+ gfc_match_omp_distribute_parallel_do,
+ gfc_match_omp_distribute_parallel_do_simd,
+ gfc_match_omp_distribute_simd, gfc_match_omp_target,
+ gfc_match_omp_target_data, gfc_match_omp_target_teams,
+ gfc_match_omp_target_teams_distribute,
+ gfc_match_omp_target_teams_distribute_parallel_do,
+ gfc_match_omp_target_teams_distribute_parallel_do_simd,
+ gfc_match_omp_target_teams_distribute_simd,
+ gfc_match_omp_target_update, gfc_match_omp_teams,
+ gfc_match_omp_teams_distribute,
+ gfc_match_omp_teams_distribute_parallel_do,
+ gfc_match_omp_teams_distribute_parallel_do_simd,
+ gfc_match_omp_teams_distribute_simd): New prototypes.
+ * module.c (ab_attribute): Add AB_OMP_DECLARE_TARGET.
+ (attr_bits): Likewise.
+ (mio_symbol_attribute): Handle omp_declare_target attribute.
+ (gfc_free_omp_clauses): Free num_teams, device, thread_limit
+ and dist_chunk_size expressions.
+ (OMP_CLAUSE_PRIVATE, OMP_CLAUSE_FIRSTPRIVATE, OMP_CLAUSE_LASTPRIVATE,
+ OMP_CLAUSE_COPYPRIVATE, OMP_CLAUSE_SHARED, OMP_CLAUSE_COPYIN,
+ OMP_CLAUSE_REDUCTION, OMP_CLAUSE_IF, OMP_CLAUSE_NUM_THREADS,
+ OMP_CLAUSE_SCHEDULE, OMP_CLAUSE_DEFAULT, OMP_CLAUSE_ORDERED,
+ OMP_CLAUSE_COLLAPSE, OMP_CLAUSE_UNTIED, OMP_CLAUSE_FINAL,
+ OMP_CLAUSE_MERGEABLE, OMP_CLAUSE_ALIGNED, OMP_CLAUSE_DEPEND,
+ OMP_CLAUSE_INBRANCH, OMP_CLAUSE_LINEAR, OMP_CLAUSE_NOTINBRANCH,
+ OMP_CLAUSE_PROC_BIND, OMP_CLAUSE_SAFELEN, OMP_CLAUSE_SIMDLEN,
+ OMP_CLAUSE_UNIFORM): Use 1U instead of 1.
+ (OMP_CLAUSE_DEVICE, OMP_CLAUSE_MAP, OMP_CLAUSE_TO, OMP_CLAUSE_FROM,
+ OMP_CLAUSE_NUM_TEAMS, OMP_CLAUSE_THREAD_LIMIT,
+ OMP_CLAUSE_DIST_SCHEDULE): Define.
+ (gfc_match_omp_clauses): Change mask parameter to unsigned int.
+ Adjust for rop becoming u.reduction_op. Disallow inbranch with
+ notinbranch. For depend clause, always create OMP_LIST_DEPEND
+ and fill in u.depend_op. Handle num_teams, device, map,
+ to, from, thread_limit and dist_schedule clauses.
+ (OMP_DECLARE_SIMD_CLAUSES): Or in OMP_CLAUSE_INBRANCH and
+ OMP_CLAUSE_NOTINBRANCH.
+ (OMP_TARGET_CLAUSES, OMP_TARGET_DATA_CLAUSES,
+ OMP_TARGET_UPDATE_CLAUSES, OMP_TEAMS_CLAUSES,
+ OMP_DISTRIBUTE_CLAUSES): Define.
+ (match_omp): New function.
+ (gfc_match_omp_do, gfc_match_omp_do_simd, gfc_match_omp_parallel,
+ gfc_match_omp_parallel_do, gfc_match_omp_parallel_do_simd,
+ gfc_match_omp_parallel_sections, gfc_match_omp_parallel_workshare,
+ gfc_match_omp_sections, gfc_match_omp_simd, gfc_match_omp_single,
+ gfc_match_omp_task): Rewritten using match_omp.
+ (gfc_match_omp_threadprivate, gfc_match_omp_declare_reduction):
+ Diagnose if the directives are followed by unexpected junk.
+ (gfc_match_omp_distribute, gfc_match_omp_distribute_parallel_do,
+ gfc_match_omp_distribute_parallel_do_simd,
+ gfc_match_omp_distrbute_simd, gfc_match_omp_declare_target,
+ gfc_match_omp_target, gfc_match_omp_target_data,
+ gfc_match_omp_target_teams, gfc_match_omp_target_teams_distribute,
+ gfc_match_omp_target_teams_distribute_parallel_do,
+ gfc_match_omp_target_teams_distribute_parallel_do_simd,
+ gfc_match_omp_target_teams_distrbute_simd, gfc_match_omp_target_update,
+ gfc_match_omp_teams, gfc_match_omp_teams_distribute,
+ gfc_match_omp_teams_distribute_parallel_do,
+ gfc_match_omp_teams_distribute_parallel_do_simd,
+ gfc_match_omp_teams_distrbute_simd): New functions.
+ * openmp.c (resolve_omp_clauses): Adjust for
+ OMP_LIST_DEPEND_{IN,OUT} being changed to OMP_LIST_DEPEND. Handle
+ OMP_LIST_MAP, OMP_LIST_FROM, OMP_LIST_TO, num_teams, device,
+ dist_chunk_size and thread_limit.
+ (gfc_resolve_omp_parallel_blocks): Only put sharing clauses into
+ ctx.sharing_clauses. Call gfc_resolve_omp_do_blocks for various
+ new EXEC_OMP_* codes.
+ (resolve_omp_do): Handle various new EXEC_OMP_* codes.
+ (gfc_resolve_omp_directive): Likewise.
+ (gfc_resolve_omp_declare_simd): Add missing space to diagnostics.
+ * parse.c (decode_omp_directive): Handle parsing of OpenMP 4.0
+ offloading related directives.
+ (case_executable): Add ST_OMP_TARGET_UPDATE.
+ (case_exec_markers): Add ST_OMP_TARGET*, ST_OMP_TEAMS*,
+ ST_OMP_DISTRIBUTE*.
+ (case_decl): Add ST_OMP_DECLARE_TARGET.
+ (gfc_ascii_statement): Handle new ST_OMP_* codes.
+ (parse_omp_do): Handle various new ST_OMP_* codes.
+ (parse_executable): Likewise.
+ * resolve.c (gfc_resolve_blocks): Handle various new EXEC_OMP_*
+ codes.
+ (resolve_code): Likewise.
+ (resolve_symbol): Change that !$OMP DECLARE TARGET variables
+ are saved.
+ * st.c (gfc_free_statement): Handle various new EXEC_OMP_* codes.
+ * symbol.c (check_conflict): Check omp_declare_target conflicts.
+ (gfc_add_omp_declare_target): New function.
+ (gfc_copy_attr): Copy omp_declare_target.
+ * trans.c (trans_code): Handle various new EXEC_OMP_* codes.
+ * trans-common.c (build_common_decl): Add "omp declare target"
+ attribute if needed.
+ * trans-decl.c (add_attributes_to_decl): Likewise.
+ * trans.h (gfc_omp_finish_clause): New prototype.
+ * trans-openmp.c (gfc_omp_finish_clause): New function.
+ (gfc_trans_omp_reduction_list): Adjust for rop being renamed
+ to u.reduction_op.
+ (gfc_trans_omp_clauses): Adjust for OMP_LIST_DEPEND_{IN,OUT}
+ change to OMP_LIST_DEPEND and fix up depend handling.
+ Handle OMP_LIST_MAP, OMP_LIST_TO, OMP_LIST_FROM, num_teams,
+ thread_limit, device, dist_chunk_size and dist_sched_kind.
+ (gfc_trans_omp_do): Handle EXEC_OMP_DISTRIBUTE.
+ (GFC_OMP_SPLIT_DISTRIBUTE, GFC_OMP_SPLIT_TEAMS,
+ GFC_OMP_SPLIT_TARGET, GFC_OMP_SPLIT_NUM, GFC_OMP_MASK_DISTRIBUTE,
+ GFC_OMP_MASK_TEAMS, GFC_OMP_MASK_TARGET, GFC_OMP_MASK_NUM): New.
+ (gfc_split_omp_clauses): Handle splitting of clauses for new
+ EXEC_OMP_* codes.
+ (gfc_trans_omp_do_simd): Add pblock argument, adjust for being
+ callable for combined constructs.
+ (gfc_trans_omp_parallel_do, gfc_trans_omp_parallel_do_simd): Likewise.
+ (gfc_trans_omp_distribute, gfc_trans_omp_teams,
+ gfc_trans_omp_target, gfc_trans_omp_target_data,
+ gfc_trans_omp_target_update): New functions.
+ (gfc_trans_omp_directive): Adjust gfc_trans_omp_* callers, handle
+ new EXEC_OMP_* codes.
+
+ 2014-06-10 Jakub Jelinek <jakub@redhat.com>
+
+ PR fortran/60928
+ * f95-lang.c (gfc_init_builtin_functions): Handle -fopenmp-simd
+ like -fopenmp.
+ * openmp.c (resolve_omp_clauses): Remove allocatable components
+ diagnostics. Add associate-name and intent(in) pointer
+ diagnostics for various clauses, diagnose procedure pointers in
+ reduction clause.
+ * parse.c (match_word_omp_simd): New function.
+ (matchs, matcho): New macros.
+ (decode_omp_directive): Change match macros to either matchs
+ or matcho. Handle -fopenmp-simd.
+ (next_free, next_fixed): Handle -fopenmp-simd like -fopenmp.
+ * scanner.c (skip_free_comments, skip_fixed_comments, include_line):
+ Likewise.
+ * trans-array.c (get_full_array_size): Rename to...
+ (gfc_full_array_size): ... this. No longer static.
+ (duplicate_allocatable): Adjust caller. Add NO_MEMCPY argument
+ and handle it.
+ (gfc_duplicate_allocatable, gfc_copy_allocatable_data): Adjust
+ duplicate_allocatable callers.
+ (gfc_duplicate_allocatable_nocopy): New function.
+ (structure_alloc_comps): Adjust g*_full_array_size and
+ duplicate_allocatable caller.
+ * trans-array.h (gfc_full_array_size,
+ gfc_duplicate_allocatable_nocopy): New prototypes.
+ * trans-common.c (create_common): Call gfc_finish_decl_attrs.
+ * trans-decl.c (gfc_finish_decl_attrs): New function.
+ (gfc_finish_var_decl, create_function_arglist,
+ gfc_get_fake_result_decl): Call it.
+ (gfc_allocate_lang_decl): If DECL_LANG_SPECIFIC is already allocated,
+ don't allocate it again.
+ (gfc_get_symbol_decl): Set GFC_DECL_ASSOCIATE_VAR_P on
+ associate-names.
+ * trans.h (gfc_finish_decl_attrs): New prototype.
+ (struct lang_decl): Add scalar_allocatable and scalar_pointer
+ bitfields.
+ (GFC_DECL_SCALAR_ALLOCATABLE, GFC_DECL_SCALAR_POINTER,
+ GFC_DECL_GET_SCALAR_ALLOCATABLE, GFC_DECL_GET_SCALAR_POINTER,
+ GFC_DECL_ASSOCIATE_VAR_P): Define.
+ (GFC_POINTER_TYPE_P): Remove.
+ * trans-openmp.c (gfc_omp_privatize_by_reference): Don't check
+ GFC_POINTER_TYPE_P, instead test GFC_DECL_GET_SCALAR_ALLOCATABLE,
+ GFC_DECL_GET_SCALAR_POINTER or GFC_DECL_CRAY_POINTEE on decl.
+ (gfc_omp_predetermined_sharing): Associate-names are predetermined.
+ (enum walk_alloc_comps): New.
+ (gfc_has_alloc_comps, gfc_omp_unshare_expr_r, gfc_omp_unshare_expr,
+ gfc_walk_alloc_comps): New functions.
+ (gfc_omp_private_outer_ref): Return true for scalar allocatables or
+ decls with allocatable components.
+ (gfc_omp_clause_default_ctor, gfc_omp_clause_copy_ctor,
+ gfc_omp_clause_assign_op, gfc_omp_clause_dtor): Fix up handling of
+ allocatables, handle also OMP_CLAUSE_REDUCTION, handle scalar
+ allocatables and decls with allocatable components.
+ (gfc_trans_omp_array_reduction_or_udr): Don't handle allocatable
+ arrays here.
+ (gfc_trans_omp_reduction_list): Call
+ gfc_trans_omp_array_reduction_or_udr even for allocatable scalars.
+ (gfc_trans_omp_do_simd): If -fno-openmp, just expand it as OMP_SIMD.
+ (gfc_trans_omp_parallel_do_simd): Likewise.
+ * trans-types.c (gfc_sym_type): Don't set GFC_POINTER_TYPE_P.
+ (gfc_get_derived_type): Call gfc_finish_decl_attrs.
+
+ 2014-06-06 Jakub Jelinek <jakub@redhat.com>
+
+ * dump-parse-tree.c (show_omp_namelist): Dump reduction
+ id in each list item.
+ (show_omp_node): Only handle OMP_LIST_REDUCTION, not
+ OMP_LIST_REDUCTION_FIRST .. OMP_LIST_REDUCTION_LAST. Don't
+ dump reduction id here.
+ * frontend-passes.c (dummy_code_callback): Renamed to...
+ (gfc_dummy_code_callback): ... this. No longer static.
+ (optimize_reduction): Use gfc_dummy_code_callback instead of
+ dummy_code_callback.
+ * gfortran.h (gfc_statement): Add ST_OMP_DECLARE_REDUCTION.
+ (symbol_attribute): Add omp_udr_artificial_var bitfield.
+ (gfc_omp_reduction_op): New enum.
+ (gfc_omp_namelist): Add rop and udr fields.
+ (OMP_LIST_PLUS, OMP_LIST_REDUCTION_FIRST, OMP_LIST_MULT,
+ OMP_LIST_SUB, OMP_LIST_AND, OMP_LIST_OR, OMP_LIST_EQV,
+ OMP_LIST_NEQV, OMP_LIST_MAX, OMP_LIST_MIN, OMP_LIST_IAND,
+ OMP_LIST_IOR, OMP_LIST_IEOR, OMP_LIST_REDUCTION_LAST): Removed.
+ (OMP_LIST_REDUCTION): New.
+ (gfc_omp_udr): New type.
+ (gfc_get_omp_udr): Define.
+ (gfc_symtree): Add n.omp_udr field.
+ (gfc_namespace): Add omp_udr_root field, add omp_udr_ns bitfield.
+ (gfc_free_omp_udr, gfc_omp_udr_find, gfc_resolve_omp_udrs,
+ gfc_dummy_code_callback): New prototypes.
+ * match.h (gfc_match_omp_declare_reduction): New prototype.
+ * module.c (MOD_VERSION): Increase to 13.
+ (omp_declare_reduction_stmt): New array.
+ (mio_omp_udr_expr, write_omp_udr, write_omp_udrs, load_omp_udrs):
+ New functions.
+ (read_module): Read OpenMP user defined reductions.
+ (write_module): Write OpenMP user defined reductions.
+ * openmp.c: Include arith.h.
+ (gfc_free_omp_udr, gfc_find_omp_udr): New functions.
+ (gfc_match_omp_clauses): Handle user defined reductions.
+ Store reduction kind into gfc_omp_namelist instead of using
+ several OMP_LIST_* entries.
+ (match_udr_expr, gfc_omp_udr_predef, gfc_omp_udr_find,
+ gfc_match_omp_declare_reduction): New functions.
+ (resolve_omp_clauses): Adjust for reduction clauses being only
+ in OMP_LIST_REDUCTION list. Diagnose missing UDRs.
+ (struct omp_udr_callback_data): New type.
+ (omp_udr_callback, gfc_resolve_omp_udr, gfc_resolve_omp_udrs): New
+ functions.
+ * parse.c (decode_omp_directive): Handle !$omp declare reduction.
+ (case_decl): Add ST_OMP_DECLARE_REDUCTION.
+ (gfc_ascii_statement): Print ST_OMP_DECLARE_REDUCTION.
+ * resolve.c (resolve_fl_variable): Allow len=: or len=* on
+ sym->attr.omp_udr_artificial_var symbols.
+ (resolve_types): Call gfc_resolve_omp_udrs.
+ * symbol.c (gfc_get_uop): If gfc_current_ns->omp_udr_ns,
+ use parent ns instead of gfc_current_ns.
+ (gfc_get_sym_tree): Don't insert symbols into
+ namespaces with omp_udr_ns set.
+ (free_omp_udr_tree): New function.
+ (gfc_free_namespace): Call it.
+ * trans-openmp.c (struct omp_udr_find_orig_data): New type.
+ (omp_udr_find_orig, gfc_trans_omp_udr_expr): New functions.
+ (gfc_trans_omp_array_reduction): Renamed to...
+ (gfc_trans_omp_array_reduction_or_udr): ... this. Remove SYM
+ argument, instead pass gfc_omp_namelist pointer N. Handle
+ user defined reductions.
+ (gfc_trans_omp_reduction_list): Remove REDUCTION_CODE argument.
+ Handle user defined reductions and reduction ops in gfc_omp_namelist.
+ (gfc_trans_omp_clauses): Adjust for just a single OMP_LIST_REDUCTION
+ list.
+ (gfc_split_omp_clauses): Likewise.
+
+ 2014-05-12 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/60127
+ * openmp.c (resolve_omp_do): Reject do concurrent loops.
+
+ 2014-05-11 Jakub Jelinek <jakub@redhat.com>
+
+ * gfortran.h (gfc_statement): Add ST_OMP_CANCEL,
+ ST_OMP_CANCELLATION_POINT, ST_OMP_TASKGROUP, ST_OMP_END_TASKGROUP,
+ ST_OMP_SIMD, ST_OMP_END_SIMD, ST_OMP_DO_SIMD, ST_OMP_END_DO_SIMD,
+ ST_OMP_PARALLEL_DO_SIMD, ST_OMP_END_PARALLEL_DO_SIMD and
+ ST_OMP_DECLARE_SIMD.
+ (gfc_omp_namelist): New typedef.
+ (gfc_get_omp_namelist): Define.
+ (OMP_LIST_UNIFORM, OMP_LIST_ALIGNED, OMP_LIST_LINEAR,
+ OMP_LIST_DEPEND_IN, OMP_LIST_DEPEND_OUT): New clause list kinds.
+ (gfc_omp_proc_bind_kind, gfc_omp_cancel_kind): New enums.
+ (gfc_omp_clauses): Change type of lists to gfc_omp_namelist *.
+ Add inbranch, notinbranch, cancel, proc_bind, safelen_expr and
+ simdlen_expr fields.
+ (gfc_omp_declare_simd): New typedef.
+ (gfc_get_omp_declare_simd): Define.
+ (gfc_namespace): Add omp_declare_simd field.
+ (gfc_exec_op): Add EXEC_OMP_CANCEL, EXEC_OMP_CANCELLATION_POINT,
+ EXEC_OMP_TASKGROUP, EXEC_OMP_SIMD, EXEC_OMP_DO_SIMD and
+ EXEC_OMP_PARALLEL_DO_SIMD.
+ (gfc_omp_atomic_op): Add GFC_OMP_ATOMIC_MASK, GFC_OMP_ATOMIC_SEQ_CST
+ and GFC_OMP_ATOMIC_SWAP.
+ (gfc_code): Change type of omp_namelist field to gfc_omp_namelist *.
+ (gfc_free_omp_namelist, gfc_free_omp_declare_simd,
+ gfc_free_omp_declare_simd_list, gfc_resolve_omp_declare_simd): New
+ prototypes.
+ * trans-stmt.h (gfc_trans_omp_declare_simd): New prototype.
+ * symbol.c (gfc_free_namespace): Call gfc_free_omp_declare_simd.
+ * openmp.c (gfc_free_omp_clauses): Free safelen_expr and
+ simdlen_expr. Use gfc_free_omp_namelist instead of
+ gfc_free_namelist.
+ (gfc_free_omp_declare_simd, gfc_free_omp_declare_simd_list): New
+ functions.
+ (gfc_match_omp_variable_list): Add end_colon, headp and
+ allow_sections arguments. Handle parsing of array sections.
+ Use *omp_namelist* instead of *namelist* data structure and
+ functions/macros. Allow termination at : character.
+ (OMP_CLAUSE_ALIGNED, OMP_CLAUSE_DEPEND, OMP_CLAUSE_INBRANCH,
+ OMP_CLAUSE_LINEAR, OMP_CLAUSE_NOTINBRANCH, OMP_CLAUSE_PROC_BIND,
+ OMP_CLAUSE_SAFELEN, OMP_CLAUSE_SIMDLEN, OMP_CLAUSE_UNIFORM): Define.
+ (gfc_match_omp_clauses): Change first and needs_space variables
+ into arguments with default values. Parse inbranch, notinbranch,
+ proc_bind, safelen, simdlen, uniform, linear, aligned and
+ depend clauses.
+ (OMP_PARALLEL_CLAUSES): Add OMP_CLAUSE_PROC_BIND.
+ (OMP_DECLARE_SIMD_CLAUSES, OMP_SIMD_CLAUSES): Define.
+ (OMP_TASK_CLAUSES): Add OMP_CLAUSE_DEPEND.
+ (gfc_match_omp_do_simd): New function.
+ (gfc_match_omp_flush): Use *omp_namelist* instead of *namelist*
+ data structure and functions/macros.
+ (gfc_match_omp_simd, gfc_match_omp_declare_simd,
+ gfc_match_omp_parallel_do_simd): New functions.
+ (gfc_match_omp_atomic): Handle seq_cst clause. Handle atomic swap.
+ (gfc_match_omp_taskgroup, gfc_match_omp_cancel_kind,
+ gfc_match_omp_cancel, gfc_match_omp_cancellation_point): New
+ functions.
+ (resolve_omp_clauses): Add where, omp_clauses and ns arguments.
+ Use *omp_namelist* instead of *namelist* data structure and
+ functions/macros. Resolve uniform, aligned, linear, depend,
+ safelen and simdlen clauses.
+ (resolve_omp_atomic): Adjust for GFC_OMP_ATOMIC_{MASK,SEQ_CST,SWAP}
+ addition, recognize atomic swap.
+ (gfc_resolve_omp_parallel_blocks): Use gfc_omp_namelist instead
+ of gfc_namelist. Handle EXEC_OMP_PARALLEL_DO_SIMD the same as
+ EXEC_OMP_PARALLEL_DO.
+ (gfc_resolve_do_iterator): Use *omp_namelist* instead of *namelist*
+ data structure and functions/macros.
+ (resolve_omp_do): Likewise. Handle EXEC_OMP_SIMD, EXEC_OMP_DO_SIMD,
+ EXEC_OMP_PARALLEL_DO_SIMD.
+ (gfc_resolve_omp_directive): Handle EXEC_OMP_SIMD, EXEC_OMP_DO_SIMD,
+ EXEC_OMP_PARALLEL_DO_SIMD and EXEC_OMP_CANCEL. Adjust
+ resolve_omp_clauses caller.
+ (gfc_resolve_omp_declare_simd): New function.
+ * parse.c (decode_omp_directive): Parse cancellation point, cancel,
+ declare simd, end do simd, end simd, end parallel do simd,
+ end taskgroup, parallel do simd, simd and taskgroup directives.
+ (case_executable): Add ST_OMP_CANCEL and ST_OMP_CANCELLATION_POINT.
+ (case_exec_markers): Add ST_OMP_TASKGROUP, case ST_OMP_SIMD,
+ ST_OMP_DO_SIMD and ST_OMP_PARALLEL_DO_SIMD.
+ (case_decl): Add ST_OMP_DECLARE_SIMD.
+ (gfc_ascii_statement): Handle ST_OMP_CANCEL,
+ ST_OMP_CANCELLATION_POINT, ST_OMP_TASKGROUP, ST_OMP_END_TASKGROUP,
+ ST_OMP_SIMD, ST_OMP_END_SIMD, ST_OMP_DO_SIMD, ST_OMP_END_DO_SIMD,
+ ST_OMP_PARALLEL_DO_SIMD, ST_OMP_END_PARALLEL_DO_SIMD and
+ ST_OMP_DECLARE_SIMD.
+ (parse_omp_do): Handle ST_OMP_SIMD, ST_OMP_DO_SIMD and
+ ST_OMP_PARALLEL_DO_SIMD.
+ (parse_omp_atomic): Adjust for GFC_OMP_ATOMIC_* additions.
+ (parse_omp_structured_block): Handle ST_OMP_TASKGROUP and
+ ST_OMP_PARALLEL_DO_SIMD.
+ (parse_executable): Handle ST_OMP_SIMD, ST_OMP_DO_SIMD,
+ ST_OMP_PARALLEL_DO_SIMD and ST_OMP_TASKGROUP.
+ * trans-decl.c (gfc_get_extern_function_decl,
+ gfc_create_function_decl): Call gfc_trans_omp_declare_simd if
+ needed.
+ * frontend-passes.c (gfc_code_walker): Handle EXEC_OMP_SIMD,
+ EXEC_OMP_DO_SIMD and EXEC_OMP_PARALLEL_DO_SIMD. Walk
+ safelen_expr and simdlen_expr. Walk expressions in gfc_omp_namelist
+ of depend, aligned and linear clauses.
+ * match.c (match_exit_cycle): Handle EXEC_OMP_SIMD, EXEC_OMP_DO_SIMD
+ and EXEC_OMP_PARALLEL_DO_SIMD.
+ (gfc_free_omp_namelist): New function.
+ * dump-parse-tree.c (show_namelist): Removed.
+ (show_omp_namelist): New function.
+ (show_omp_node): Handle OpenMP 4.0 additions.
+ (show_code_node): Handle EXEC_OMP_CANCEL, EXEC_OMP_CANCELLATION_POINT,
+ EXEC_OMP_DO_SIMD, EXEC_OMP_PARALLEL_DO_SIMD, EXEC_OMP_SIMD and
+ EXEC_OMP_TASKGROUP.
+ * match.h (gfc_match_omp_cancel, gfc_match_omp_cancellation_point,
+ gfc_match_omp_declare_simd, gfc_match_omp_do_simd,
+ gfc_match_omp_parallel_do_simd, gfc_match_omp_simd,
+ gfc_match_omp_taskgroup): New prototypes.
+ * trans-openmp.c (gfc_trans_omp_variable): Add declare_simd
+ argument, handle it. Allow current_function_decl to be NULL.
+ (gfc_trans_omp_variable_list): Add declare_simd argument, pass
+ it through to gfc_trans_omp_variable and disregard whether
+ sym is referenced if declare_simd is true. Work on gfc_omp_namelist
+ instead of gfc_namelist.
+ (gfc_trans_omp_reduction_list): Work on gfc_omp_namelist instead of
+ gfc_namelist. Adjust gfc_trans_omp_variable caller.
+ (gfc_trans_omp_clauses): Add declare_simd argument, pass it through
+ to gfc_trans_omp_variable{,_list} callers. Work on gfc_omp_namelist
+ instead of gfc_namelist. Handle inbranch, notinbranch, safelen,
+ simdlen, depend, uniform, linear, proc_bind and aligned clauses.
+ Handle cancel kind.
+ (gfc_trans_omp_atomic): Handle seq_cst clause, handle atomic swap,
+ adjust for GFC_OMP_ATOMIC_* changes.
+ (gfc_trans_omp_cancel, gfc_trans_omp_cancellation_point): New
+ functions.
+ (gfc_trans_omp_do): Add op argument, handle simd translation into
+ generic.
+ (GFC_OMP_SPLIT_SIMD, GFC_OMP_SPLIT_DO, GFC_OMP_SPLIT_PARALLEL,
+ GFC_OMP_SPLIT_NUM, GFC_OMP_MASK_SIMD, GFC_OMP_MASK_DO,
+ GFC_OMP_MASK_PARALLEL): New.
+ (gfc_split_omp_clauses, gfc_trans_omp_do_simd): New functions.
+ (gfc_trans_omp_parallel_do): Rework to use gfc_split_omp_clauses.
+ (gfc_trans_omp_parallel_do_simd, gfc_trans_omp_taskgroup): New
+ functions.
+ (gfc_trans_omp_directive): Handle EXEC_OMP_CANCEL,
+ EXEC_OMP_CANCELLATION_POINT, EXEC_OMP_DO_SIMD,
+ EXEC_OMP_PARALLEL_DO_SIMD, EXEC_OMP_SIMD and EXEC_OMP_TASKGROUP.
+ Adjust gfc_trans_omp_do caller.
+ (gfc_trans_omp_declare_simd): New function.
+ * st.c (gfc_free_statement): Handle EXEC_OMP_CANCEL,
+ EXEC_OMP_CANCELLATION_POINT, EXEC_OMP_DO_SIMD,
+ EXEC_OMP_PARALLEL_DO_SIMD, EXEC_OMP_SIMD and EXEC_OMP_TASKGROUP.
+ For EXEC_OMP_FLUSH call gfc_free_omp_namelist instead of
+ gfc_free_namelist.
+ * module.c (omp_declare_simd_clauses): New variable.
+ (mio_omp_declare_simd): New function.
+ (mio_symbol): Call it.
+ * trans.c (trans_code): Handle EXEC_OMP_CANCEL,
+ EXEC_OMP_CANCELLATION_POINT, EXEC_OMP_DO_SIMD,
+ EXEC_OMP_PARALLEL_DO_SIMD, EXEC_OMP_SIMD and EXEC_OMP_TASKGROUP.
+ * resolve.c (gfc_resolve_blocks): Handle EXEC_OMP_DO_SIMD,
+ EXEC_OMP_PARALLEL_DO_SIMD, EXEC_OMP_SIMD and EXEC_OMP_TASKGROUP.
+ (resolve_code): Handle EXEC_OMP_CANCEL,
+ EXEC_OMP_CANCELLATION_POINT, EXEC_OMP_DO_SIMD,
+ EXEC_OMP_PARALLEL_DO_SIMD, EXEC_OMP_SIMD and EXEC_OMP_TASKGROUP.
+ (resolve_types): Call gfc_resolve_omp_declare_simd.
+
+2014-06-15 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
+
+ Backport from trunk.
+ PR fortran/45187
+ * trans-decl.c (gfc_create_module_variable): Don't create
+ Cray-pointee decls twice.
+
+2014-06-09 Paul Thomas <pault@gcc.gnu.org>
+
+ Backport from trunk.
+ PR fortran/61406
+ * trans-stmt.c (trans_associate_var): Check that array
+ constructors are constant for direct reference.
+
+2014-06-05 Richard Biener <rguenther@suse.de>
+
+ PR fortran/61418
+ * gfortranspec.c (spec_file): Remove.
+ (find_spec_file): Likewise.
+ (lang_specific_driver): Do not look for specs file in -L
+ or append -specs command line argument.
+ (lang_specific_pre_link): Always %:include libgfortran.spec.
+
+2014-05-29 Thomas Koenig <tkoenig@gcc.gnu.org>
+
+ PR fortran/60834
+ Backport from mainline
+ * frontend-passes.c (in_assoc_list): New variable.
+ (optimize_namespace): Initialize in_assoc_list
+ (combine_array_constructor): Don't try to combine
+ assoc lists.
+ (gfc_code_walker): Keep track of in_assoc_list.
+
+2014-05-26 Janne Blomqvist <jb@gcc.gnu.org>
+
+ Backport from mainline
+ PR libfortran/61310
+ * intrinsics.texi (CTIME): Remove mention of locale-dependent
+ behavior.
+
+2014-04-22 Tobias Burnus <burnus@net-b.de>
+
+ Backport from mainline
+ 2014-04-11 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/58880
+ PR fortran/60495
+ * resolve.c (gfc_resolve_finalizers): Ensure that vtables
+ and finalization wrappers are generated.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
cpp_define (pfile, "_LANGUAGE_FORTRAN=1");
if (gfc_option.gfc_flag_openmp)
- cpp_define (pfile, "_OPENMP=201107");
+ cpp_define (pfile, "_OPENMP=201307");
/* The defines below are necessary for the TARGET_* macros.
if (!gfc_notify_std (GFC_STD_GNU, "Old-style "
"initialization at %C"))
return MATCH_ERROR;
+ else if (gfc_current_state () == COMP_DERIVED)
+ {
+ gfc_error ("Invalid old style initialization for derived type "
+ "component at %C");
+ m = MATCH_ERROR;
+ goto cleanup;
+ }
return match_old_style_init (name);
}
}
static void
-show_namelist (gfc_namelist *n)
+show_omp_namelist (int list_type, gfc_omp_namelist *n)
{
- for (; n->next; n = n->next)
- fprintf (dumpfile, "%s,", n->sym->name);
- fprintf (dumpfile, "%s", n->sym->name);
+ for (; n; n = n->next)
+ {
+ if (list_type == OMP_LIST_REDUCTION)
+ switch (n->u.reduction_op)
+ {
+ case OMP_REDUCTION_PLUS:
+ case OMP_REDUCTION_TIMES:
+ case OMP_REDUCTION_MINUS:
+ case OMP_REDUCTION_AND:
+ case OMP_REDUCTION_OR:
+ case OMP_REDUCTION_EQV:
+ case OMP_REDUCTION_NEQV:
+ fprintf (dumpfile, "%s:",
+ gfc_op2string ((gfc_intrinsic_op) n->u.reduction_op));
+ break;
+ case OMP_REDUCTION_MAX: fputs ("max:", dumpfile); break;
+ case OMP_REDUCTION_MIN: fputs ("min:", dumpfile); break;
+ case OMP_REDUCTION_IAND: fputs ("iand:", dumpfile); break;
+ case OMP_REDUCTION_IOR: fputs ("ior:", dumpfile); break;
+ case OMP_REDUCTION_IEOR: fputs ("ieor:", dumpfile); break;
+ case OMP_REDUCTION_USER:
+ if (n->udr)
+ fprintf (dumpfile, "%s:", n->udr->udr->name);
+ break;
+ default: break;
+ }
+ else if (list_type == OMP_LIST_DEPEND)
+ switch (n->u.depend_op)
+ {
+ case OMP_DEPEND_IN: fputs ("in:", dumpfile); break;
+ case OMP_DEPEND_OUT: fputs ("out:", dumpfile); break;
+ case OMP_DEPEND_INOUT: fputs ("inout:", dumpfile); break;
+ default: break;
+ }
+ else if (list_type == OMP_LIST_MAP)
+ switch (n->u.map_op)
+ {
+ case OMP_MAP_ALLOC: fputs ("alloc:", dumpfile); break;
+ case OMP_MAP_TO: fputs ("to:", dumpfile); break;
+ case OMP_MAP_FROM: fputs ("from:", dumpfile); break;
+ case OMP_MAP_TOFROM: fputs ("tofrom:", dumpfile); break;
+ default: break;
+ }
+ fprintf (dumpfile, "%s", n->sym->name);
+ if (n->expr)
+ {
+ fputc (':', dumpfile);
+ show_expr (n->expr);
+ }
+ if (n->next)
+ fputc (',', dumpfile);
+ }
}
/* Show a single OpenMP directive node and everything underneath it
{
case EXEC_OMP_ATOMIC: name = "ATOMIC"; break;
case EXEC_OMP_BARRIER: name = "BARRIER"; break;
+ case EXEC_OMP_CANCEL: name = "CANCEL"; break;
+ case EXEC_OMP_CANCELLATION_POINT: name = "CANCELLATION POINT"; break;
case EXEC_OMP_CRITICAL: name = "CRITICAL"; break;
case EXEC_OMP_FLUSH: name = "FLUSH"; break;
case EXEC_OMP_DO: name = "DO"; break;
+ case EXEC_OMP_DO_SIMD: name = "DO SIMD"; break;
case EXEC_OMP_MASTER: name = "MASTER"; break;
case EXEC_OMP_ORDERED: name = "ORDERED"; break;
case EXEC_OMP_PARALLEL: name = "PARALLEL"; break;
case EXEC_OMP_PARALLEL_DO: name = "PARALLEL DO"; break;
+ case EXEC_OMP_PARALLEL_DO_SIMD: name = "PARALLEL DO SIMD"; break;
case EXEC_OMP_PARALLEL_SECTIONS: name = "PARALLEL SECTIONS"; break;
case EXEC_OMP_PARALLEL_WORKSHARE: name = "PARALLEL WORKSHARE"; break;
case EXEC_OMP_SECTIONS: name = "SECTIONS"; break;
+ case EXEC_OMP_SIMD: name = "SIMD"; break;
case EXEC_OMP_SINGLE: name = "SINGLE"; break;
case EXEC_OMP_TASK: name = "TASK"; break;
+ case EXEC_OMP_TASKGROUP: name = "TASKGROUP"; break;
case EXEC_OMP_TASKWAIT: name = "TASKWAIT"; break;
case EXEC_OMP_TASKYIELD: name = "TASKYIELD"; break;
case EXEC_OMP_WORKSHARE: name = "WORKSHARE"; break;
fprintf (dumpfile, "!$OMP %s", name);
switch (c->op)
{
+ case EXEC_OMP_CANCEL:
+ case EXEC_OMP_CANCELLATION_POINT:
case EXEC_OMP_DO:
+ case EXEC_OMP_DO_SIMD:
case EXEC_OMP_PARALLEL:
case EXEC_OMP_PARALLEL_DO:
+ case EXEC_OMP_PARALLEL_DO_SIMD:
case EXEC_OMP_PARALLEL_SECTIONS:
case EXEC_OMP_SECTIONS:
+ case EXEC_OMP_SIMD:
case EXEC_OMP_SINGLE:
case EXEC_OMP_WORKSHARE:
case EXEC_OMP_PARALLEL_WORKSHARE:
if (c->ext.omp_namelist)
{
fputs (" (", dumpfile);
- show_namelist (c->ext.omp_namelist);
+ show_omp_namelist (OMP_LIST_NUM, c->ext.omp_namelist);
fputc (')', dumpfile);
}
return;
{
int list_type;
+ switch (omp_clauses->cancel)
+ {
+ case OMP_CANCEL_UNKNOWN:
+ break;
+ case OMP_CANCEL_PARALLEL:
+ fputs (" PARALLEL", dumpfile);
+ break;
+ case OMP_CANCEL_SECTIONS:
+ fputs (" SECTIONS", dumpfile);
+ break;
+ case OMP_CANCEL_DO:
+ fputs (" DO", dumpfile);
+ break;
+ case OMP_CANCEL_TASKGROUP:
+ fputs (" TASKGROUP", dumpfile);
+ break;
+ }
if (omp_clauses->if_expr)
{
fputs (" IF(", dumpfile);
if (omp_clauses->lists[list_type] != NULL
&& list_type != OMP_LIST_COPYPRIVATE)
{
- const char *type;
- if (list_type >= OMP_LIST_REDUCTION_FIRST)
+ const char *type = NULL;
+ switch (list_type)
{
- switch (list_type)
- {
- case OMP_LIST_PLUS: type = "+"; break;
- case OMP_LIST_MULT: type = "*"; break;
- case OMP_LIST_SUB: type = "-"; break;
- case OMP_LIST_AND: type = ".AND."; break;
- case OMP_LIST_OR: type = ".OR."; break;
- case OMP_LIST_EQV: type = ".EQV."; break;
- case OMP_LIST_NEQV: type = ".NEQV."; break;
- case OMP_LIST_MAX: type = "MAX"; break;
- case OMP_LIST_MIN: type = "MIN"; break;
- case OMP_LIST_IAND: type = "IAND"; break;
- case OMP_LIST_IOR: type = "IOR"; break;
- case OMP_LIST_IEOR: type = "IEOR"; break;
- default:
- gcc_unreachable ();
- }
- fprintf (dumpfile, " REDUCTION(%s:", type);
+ case OMP_LIST_PRIVATE: type = "PRIVATE"; break;
+ case OMP_LIST_FIRSTPRIVATE: type = "FIRSTPRIVATE"; break;
+ case OMP_LIST_LASTPRIVATE: type = "LASTPRIVATE"; break;
+ case OMP_LIST_SHARED: type = "SHARED"; break;
+ case OMP_LIST_COPYIN: type = "COPYIN"; break;
+ case OMP_LIST_UNIFORM: type = "UNIFORM"; break;
+ case OMP_LIST_ALIGNED: type = "ALIGNED"; break;
+ case OMP_LIST_LINEAR: type = "LINEAR"; break;
+ case OMP_LIST_REDUCTION: type = "REDUCTION"; break;
+ case OMP_LIST_DEPEND: type = "DEPEND"; break;
+ default:
+ gcc_unreachable ();
}
- else
- {
- switch (list_type)
- {
- case OMP_LIST_PRIVATE: type = "PRIVATE"; break;
- case OMP_LIST_FIRSTPRIVATE: type = "FIRSTPRIVATE"; break;
- case OMP_LIST_LASTPRIVATE: type = "LASTPRIVATE"; break;
- case OMP_LIST_SHARED: type = "SHARED"; break;
- case OMP_LIST_COPYIN: type = "COPYIN"; break;
- default:
- gcc_unreachable ();
- }
- fprintf (dumpfile, " %s(", type);
- }
- show_namelist (omp_clauses->lists[list_type]);
+ fprintf (dumpfile, " %s(", type);
+ show_omp_namelist (list_type, omp_clauses->lists[list_type]);
fputc (')', dumpfile);
}
+ if (omp_clauses->safelen_expr)
+ {
+ fputs (" SAFELEN(", dumpfile);
+ show_expr (omp_clauses->safelen_expr);
+ fputc (')', dumpfile);
+ }
+ if (omp_clauses->simdlen_expr)
+ {
+ fputs (" SIMDLEN(", dumpfile);
+ show_expr (omp_clauses->simdlen_expr);
+ fputc (')', dumpfile);
+ }
+ if (omp_clauses->inbranch)
+ fputs (" INBRANCH", dumpfile);
+ if (omp_clauses->notinbranch)
+ fputs (" NOTINBRANCH", dumpfile);
+ if (omp_clauses->proc_bind != OMP_PROC_BIND_UNKNOWN)
+ {
+ const char *type;
+ switch (omp_clauses->proc_bind)
+ {
+ case OMP_PROC_BIND_MASTER: type = "MASTER"; break;
+ case OMP_PROC_BIND_SPREAD: type = "SPREAD"; break;
+ case OMP_PROC_BIND_CLOSE: type = "CLOSE"; break;
+ default:
+ gcc_unreachable ();
+ }
+ fprintf (dumpfile, " PROC_BIND(%s)", type);
+ }
+ if (omp_clauses->num_teams)
+ {
+ fputs (" NUM_TEAMS(", dumpfile);
+ show_expr (omp_clauses->num_teams);
+ fputc (')', dumpfile);
+ }
+ if (omp_clauses->device)
+ {
+ fputs (" DEVICE(", dumpfile);
+ show_expr (omp_clauses->device);
+ fputc (')', dumpfile);
+ }
+ if (omp_clauses->thread_limit)
+ {
+ fputs (" THREAD_LIMIT(", dumpfile);
+ show_expr (omp_clauses->thread_limit);
+ fputc (')', dumpfile);
+ }
+ if (omp_clauses->dist_sched_kind != OMP_SCHED_NONE)
+ {
+ fprintf (dumpfile, " DIST_SCHEDULE (static");
+ if (omp_clauses->dist_chunk_size)
+ {
+ fputc (',', dumpfile);
+ show_expr (omp_clauses->dist_chunk_size);
+ }
+ fputc (')', dumpfile);
+ }
}
fputc ('\n', dumpfile);
if (c->op == EXEC_OMP_SECTIONS || c->op == EXEC_OMP_PARALLEL_SECTIONS)
show_code (level + 1, c->block->next);
if (c->op == EXEC_OMP_ATOMIC)
return;
+ fputc ('\n', dumpfile);
code_indent (level, 0);
fprintf (dumpfile, "!$OMP END %s", name);
if (omp_clauses != NULL)
if (omp_clauses->lists[OMP_LIST_COPYPRIVATE])
{
fputs (" COPYPRIVATE(", dumpfile);
- show_namelist (omp_clauses->lists[OMP_LIST_COPYPRIVATE]);
+ show_omp_namelist (OMP_LIST_COPYPRIVATE,
+ omp_clauses->lists[OMP_LIST_COPYPRIVATE]);
fputc (')', dumpfile);
}
else if (omp_clauses->nowait)
break;
case EXEC_OMP_ATOMIC:
+ case EXEC_OMP_CANCEL:
+ case EXEC_OMP_CANCELLATION_POINT:
case EXEC_OMP_BARRIER:
case EXEC_OMP_CRITICAL:
case EXEC_OMP_FLUSH:
case EXEC_OMP_DO:
+ case EXEC_OMP_DO_SIMD:
case EXEC_OMP_MASTER:
case EXEC_OMP_ORDERED:
case EXEC_OMP_PARALLEL:
case EXEC_OMP_PARALLEL_DO:
+ case EXEC_OMP_PARALLEL_DO_SIMD:
case EXEC_OMP_PARALLEL_SECTIONS:
case EXEC_OMP_PARALLEL_WORKSHARE:
case EXEC_OMP_SECTIONS:
+ case EXEC_OMP_SIMD:
case EXEC_OMP_SINGLE:
case EXEC_OMP_TASK:
+ case EXEC_OMP_TASKGROUP:
case EXEC_OMP_TASKWAIT:
case EXEC_OMP_TASKYIELD:
case EXEC_OMP_WORKSHARE:
static void gfc_init_ts (void);
static tree gfc_builtin_function (tree);
+/* Handle an "omp declare target" attribute; arguments as in
+ struct attribute_spec.handler. */
+static tree
+gfc_handle_omp_declare_target_attribute (tree *, tree, tree, int, bool *)
+{
+ return NULL_TREE;
+}
+
+/* Table of valid Fortran attributes. */
+static const struct attribute_spec gfc_attribute_table[] =
+{
+ /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
+ affects_type_identity } */
+ { "omp declare target", 0, 0, true, false, false,
+ gfc_handle_omp_declare_target_attribute, false },
+ { NULL, 0, 0, false, false, false, NULL, false }
+};
+
#undef LANG_HOOKS_NAME
#undef LANG_HOOKS_INIT
#undef LANG_HOOKS_FINISH
#undef LANG_HOOKS_OMP_CLAUSE_DEFAULT_CTOR
#undef LANG_HOOKS_OMP_CLAUSE_COPY_CTOR
#undef LANG_HOOKS_OMP_CLAUSE_ASSIGN_OP
+#undef LANG_HOOKS_OMP_CLAUSE_LINEAR_CTOR
#undef LANG_HOOKS_OMP_CLAUSE_DTOR
+#undef LANG_HOOKS_OMP_FINISH_CLAUSE
#undef LANG_HOOKS_OMP_DISREGARD_VALUE_EXPR
#undef LANG_HOOKS_OMP_PRIVATE_DEBUG_CLAUSE
#undef LANG_HOOKS_OMP_PRIVATE_OUTER_REF
#undef LANG_HOOKS_BUILTIN_FUNCTION
#undef LANG_HOOKS_BUILTIN_FUNCTION
#undef LANG_HOOKS_GET_ARRAY_DESCR_INFO
+#undef LANG_HOOKS_ATTRIBUTE_TABLE
/* Define lang hooks. */
#define LANG_HOOKS_NAME "GNU Fortran"
#define LANG_HOOKS_OMP_CLAUSE_DEFAULT_CTOR gfc_omp_clause_default_ctor
#define LANG_HOOKS_OMP_CLAUSE_COPY_CTOR gfc_omp_clause_copy_ctor
#define LANG_HOOKS_OMP_CLAUSE_ASSIGN_OP gfc_omp_clause_assign_op
+#define LANG_HOOKS_OMP_CLAUSE_LINEAR_CTOR gfc_omp_clause_linear_ctor
#define LANG_HOOKS_OMP_CLAUSE_DTOR gfc_omp_clause_dtor
+#define LANG_HOOKS_OMP_FINISH_CLAUSE gfc_omp_finish_clause
#define LANG_HOOKS_OMP_DISREGARD_VALUE_EXPR gfc_omp_disregard_value_expr
#define LANG_HOOKS_OMP_PRIVATE_DEBUG_CLAUSE gfc_omp_private_debug_clause
#define LANG_HOOKS_OMP_PRIVATE_OUTER_REF gfc_omp_private_outer_ref
#define LANG_HOOKS_OMP_FIRSTPRIVATIZE_TYPE_SIZES \
gfc_omp_firstprivatize_type_sizes
-#define LANG_HOOKS_BUILTIN_FUNCTION gfc_builtin_function
-#define LANG_HOOKS_GET_ARRAY_DESCR_INFO gfc_get_array_descr_info
+#define LANG_HOOKS_BUILTIN_FUNCTION gfc_builtin_function
+#define LANG_HOOKS_GET_ARRAY_DESCR_INFO gfc_get_array_descr_info
+#define LANG_HOOKS_ATTRIBUTE_TABLE gfc_attribute_table
struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
#include "../sync-builtins.def"
#undef DEF_SYNC_BUILTIN
- if (gfc_option.gfc_flag_openmp || flag_tree_parallelize_loops)
+ if (gfc_option.gfc_flag_openmp
+ || gfc_option.gfc_flag_openmp_simd
+ || flag_tree_parallelize_loops)
{
#undef DEF_GOMP_BUILTIN
#define DEF_GOMP_BUILTIN(code, name, type, attr) \
BUILT_IN_TRAP, NULL, ATTR_NOTHROW_LEAF_LIST);
TREE_THIS_VOLATILE (builtin_decl_explicit (BUILT_IN_TRAP)) = 1;
+ ftype = build_varargs_function_type_list (ptr_type_node, const_ptr_type_node,
+ size_type_node, NULL_TREE);
+ gfc_define_builtin ("__builtin_assume_aligned", ftype,
+ BUILT_IN_ASSUME_ALIGNED,
+ "__builtin_assume_aligned",
+ ATTR_CONST_NOTHROW_LEAF_LIST);
+
gfc_define_builtin ("__emutls_get_address",
builtin_types[BT_FN_PTR_PTR],
BUILT_IN_EMUTLS_GET_ADDRESS,
struct my_struct *evec;
+/* Keep track of association lists. */
+
+static bool in_assoc_list;
+
/* Entry point - run all passes for a namespace. */
void
/* Dummy function for code callback, for use when we really
don't want to do anything. */
-static int
-dummy_code_callback (gfc_code **e ATTRIBUTE_UNUSED,
- int *walk_subtrees ATTRIBUTE_UNUSED,
- void *data ATTRIBUTE_UNUSED)
+int
+gfc_dummy_code_callback (gfc_code **e ATTRIBUTE_UNUSED,
+ int *walk_subtrees ATTRIBUTE_UNUSED,
+ void *data ATTRIBUTE_UNUSED)
{
return 0;
}
current_ns = ns;
forall_level = 0;
iterator_level = 0;
+ in_assoc_list = false;
in_omp_workshare = false;
gfc_code_walker (&ns->code, convert_do_while, dummy_expr_callback, NULL);
optimize_reduction (gfc_namespace *ns)
{
current_ns = ns;
- gfc_code_walker (&ns->code, dummy_code_callback, callback_reduction, NULL);
+ gfc_code_walker (&ns->code, gfc_dummy_code_callback,
+ callback_reduction, NULL);
/* BLOCKs are handled in the expression walker below. */
for (ns = ns->contained; ns; ns = ns->sibling)
if (e->rank != 1)
return false;
+ /* Don't try to combine association lists, this makes no sense
+ and leads to an ICE. */
+ if (in_assoc_list)
+ return false;
+
op1 = e->value.op.op1;
op2 = e->value.op.op2;
case EXEC_BLOCK:
WALK_SUBCODE (co->ext.block.ns->code);
- for (alist = co->ext.block.assoc; alist; alist = alist->next)
- WALK_SUBEXPR (alist->target);
+ if (co->ext.block.assoc)
+ {
+ bool saved_in_assoc_list = in_assoc_list;
+
+ in_assoc_list = true;
+ for (alist = co->ext.block.assoc; alist; alist = alist->next)
+ WALK_SUBEXPR (alist->target);
+
+ in_assoc_list = saved_in_assoc_list;
+ }
+
break;
case EXEC_DO:
case EXEC_OMP_PARALLEL:
case EXEC_OMP_PARALLEL_DO:
+ case EXEC_OMP_PARALLEL_DO_SIMD:
case EXEC_OMP_PARALLEL_SECTIONS:
in_omp_workshare = false;
in_omp_workshare = true;
/* Fall through */
-
+
+ case EXEC_OMP_DISTRIBUTE:
+ case EXEC_OMP_DISTRIBUTE_PARALLEL_DO:
+ case EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD:
+ case EXEC_OMP_DISTRIBUTE_SIMD:
case EXEC_OMP_DO:
+ case EXEC_OMP_DO_SIMD:
case EXEC_OMP_SECTIONS:
case EXEC_OMP_SINGLE:
case EXEC_OMP_END_SINGLE:
+ case EXEC_OMP_SIMD:
+ case EXEC_OMP_TARGET:
+ case EXEC_OMP_TARGET_DATA:
+ case EXEC_OMP_TARGET_TEAMS:
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE:
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO:
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD:
+ case EXEC_OMP_TARGET_UPDATE:
case EXEC_OMP_TASK:
+ case EXEC_OMP_TEAMS:
+ case EXEC_OMP_TEAMS_DISTRIBUTE:
+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO:
+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
+ case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD:
/* Come to this label only from the
EXEC_OMP_PARALLEL_* cases above. */
if (co->ext.omp_clauses)
{
+ gfc_omp_namelist *n;
+ static int list_types[]
+ = { OMP_LIST_ALIGNED, OMP_LIST_LINEAR, OMP_LIST_DEPEND,
+ OMP_LIST_MAP, OMP_LIST_TO, OMP_LIST_FROM };
+ size_t idx;
WALK_SUBEXPR (co->ext.omp_clauses->if_expr);
WALK_SUBEXPR (co->ext.omp_clauses->final_expr);
WALK_SUBEXPR (co->ext.omp_clauses->num_threads);
WALK_SUBEXPR (co->ext.omp_clauses->chunk_size);
+ WALK_SUBEXPR (co->ext.omp_clauses->safelen_expr);
+ WALK_SUBEXPR (co->ext.omp_clauses->simdlen_expr);
+ WALK_SUBEXPR (co->ext.omp_clauses->num_teams);
+ WALK_SUBEXPR (co->ext.omp_clauses->device);
+ WALK_SUBEXPR (co->ext.omp_clauses->thread_limit);
+ WALK_SUBEXPR (co->ext.omp_clauses->dist_chunk_size);
+ for (idx = 0;
+ idx < sizeof (list_types) / sizeof (list_types[0]);
+ idx++)
+ for (n = co->ext.omp_clauses->lists[list_types[idx]];
+ n; n = n->next)
+ WALK_SUBEXPR (n->expr);
}
break;
default:
ST_OMP_PARALLEL, ST_OMP_PARALLEL_DO, ST_OMP_PARALLEL_SECTIONS,
ST_OMP_PARALLEL_WORKSHARE, ST_OMP_SECTIONS, ST_OMP_SECTION, ST_OMP_SINGLE,
ST_OMP_THREADPRIVATE, ST_OMP_WORKSHARE, ST_OMP_TASK, ST_OMP_END_TASK,
- ST_OMP_TASKWAIT, ST_OMP_TASKYIELD, ST_PROCEDURE, ST_GENERIC, ST_CRITICAL,
- ST_END_CRITICAL, ST_GET_FCN_CHARACTERISTICS, ST_LOCK, ST_UNLOCK, ST_NONE
+ ST_OMP_TASKWAIT, ST_OMP_TASKYIELD, ST_OMP_CANCEL, ST_OMP_CANCELLATION_POINT,
+ ST_OMP_TASKGROUP, ST_OMP_END_TASKGROUP, ST_OMP_SIMD, ST_OMP_END_SIMD,
+ ST_OMP_DO_SIMD, ST_OMP_END_DO_SIMD, ST_OMP_PARALLEL_DO_SIMD,
+ ST_OMP_END_PARALLEL_DO_SIMD, ST_OMP_DECLARE_SIMD, ST_OMP_DECLARE_REDUCTION,
+ ST_OMP_TARGET, ST_OMP_END_TARGET, ST_OMP_TARGET_DATA, ST_OMP_END_TARGET_DATA,
+ ST_OMP_TARGET_UPDATE, ST_OMP_DECLARE_TARGET,
+ ST_OMP_TEAMS, ST_OMP_END_TEAMS, ST_OMP_DISTRIBUTE, ST_OMP_END_DISTRIBUTE,
+ ST_OMP_DISTRIBUTE_SIMD, ST_OMP_END_DISTRIBUTE_SIMD,
+ ST_OMP_DISTRIBUTE_PARALLEL_DO, ST_OMP_END_DISTRIBUTE_PARALLEL_DO,
+ ST_OMP_DISTRIBUTE_PARALLEL_DO_SIMD, ST_OMP_END_DISTRIBUTE_PARALLEL_DO_SIMD,
+ ST_OMP_TARGET_TEAMS, ST_OMP_END_TARGET_TEAMS, ST_OMP_TEAMS_DISTRIBUTE,
+ ST_OMP_END_TEAMS_DISTRIBUTE, ST_OMP_TEAMS_DISTRIBUTE_SIMD,
+ ST_OMP_END_TEAMS_DISTRIBUTE_SIMD, ST_OMP_TARGET_TEAMS_DISTRIBUTE,
+ ST_OMP_END_TARGET_TEAMS_DISTRIBUTE, ST_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD,
+ ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_SIMD, ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO,
+ ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO,
+ ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO,
+ ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO,
+ ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD,
+ ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD,
+ ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD,
+ ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD,
+ ST_PROCEDURE, ST_GENERIC, ST_CRITICAL, ST_END_CRITICAL,
+ ST_GET_FCN_CHARACTERISTICS, ST_LOCK, ST_UNLOCK, ST_NONE
}
gfc_statement;
variable for SELECT_TYPE or ASSOCIATE. */
unsigned select_type_temporary:1, associate_var:1;
+ /* This is omp_{out,in,priv,orig} artificial variable in
+ !$OMP DECLARE REDUCTION. */
+ unsigned omp_udr_artificial_var:1;
+
+ /* Mentioned in OMP DECLARE TARGET. */
+ unsigned omp_declare_target:1;
+
/* Attributes set by compiler extensions (!GCC$ ATTRIBUTES). */
unsigned ext_attr:EXT_ATTR_NUM;
#define gfc_get_namelist() XCNEW (gfc_namelist)
+typedef enum
+{
+ OMP_REDUCTION_NONE = -1,
+ OMP_REDUCTION_PLUS = INTRINSIC_PLUS,
+ OMP_REDUCTION_MINUS = INTRINSIC_MINUS,
+ OMP_REDUCTION_TIMES = INTRINSIC_TIMES,
+ OMP_REDUCTION_AND = INTRINSIC_AND,
+ OMP_REDUCTION_OR = INTRINSIC_OR,
+ OMP_REDUCTION_EQV = INTRINSIC_EQV,
+ OMP_REDUCTION_NEQV = INTRINSIC_NEQV,
+ OMP_REDUCTION_MAX = GFC_INTRINSIC_END,
+ OMP_REDUCTION_MIN,
+ OMP_REDUCTION_IAND,
+ OMP_REDUCTION_IOR,
+ OMP_REDUCTION_IEOR,
+ OMP_REDUCTION_USER
+}
+gfc_omp_reduction_op;
+
+typedef enum
+{
+ OMP_DEPEND_IN,
+ OMP_DEPEND_OUT,
+ OMP_DEPEND_INOUT
+}
+gfc_omp_depend_op;
+
+typedef enum
+{
+ OMP_MAP_ALLOC,
+ OMP_MAP_TO,
+ OMP_MAP_FROM,
+ OMP_MAP_TOFROM
+}
+gfc_omp_map_op;
+
+/* For use in OpenMP clauses in case we need extra information
+ (aligned clause alignment, linear clause step, etc.). */
+
+typedef struct gfc_omp_namelist
+{
+ struct gfc_symbol *sym;
+ struct gfc_expr *expr;
+ union
+ {
+ gfc_omp_reduction_op reduction_op;
+ gfc_omp_depend_op depend_op;
+ gfc_omp_map_op map_op;
+ } u;
+ struct gfc_omp_namelist_udr *udr;
+ struct gfc_omp_namelist *next;
+}
+gfc_omp_namelist;
+
+#define gfc_get_omp_namelist() XCNEW (gfc_omp_namelist)
+
enum
{
OMP_LIST_PRIVATE,
OMP_LIST_COPYPRIVATE,
OMP_LIST_SHARED,
OMP_LIST_COPYIN,
- OMP_LIST_PLUS,
- OMP_LIST_REDUCTION_FIRST = OMP_LIST_PLUS,
- OMP_LIST_MULT,
- OMP_LIST_SUB,
- OMP_LIST_AND,
- OMP_LIST_OR,
- OMP_LIST_EQV,
- OMP_LIST_NEQV,
- OMP_LIST_MAX,
- OMP_LIST_MIN,
- OMP_LIST_IAND,
- OMP_LIST_IOR,
- OMP_LIST_IEOR,
- OMP_LIST_REDUCTION_LAST = OMP_LIST_IEOR,
+ OMP_LIST_UNIFORM,
+ OMP_LIST_ALIGNED,
+ OMP_LIST_LINEAR,
+ OMP_LIST_DEPEND,
+ OMP_LIST_MAP,
+ OMP_LIST_TO,
+ OMP_LIST_FROM,
+ OMP_LIST_REDUCTION,
OMP_LIST_NUM
};
OMP_DEFAULT_FIRSTPRIVATE
};
+enum gfc_omp_proc_bind_kind
+{
+ OMP_PROC_BIND_UNKNOWN,
+ OMP_PROC_BIND_MASTER,
+ OMP_PROC_BIND_SPREAD,
+ OMP_PROC_BIND_CLOSE
+};
+
+enum gfc_omp_cancel_kind
+{
+ OMP_CANCEL_UNKNOWN,
+ OMP_CANCEL_PARALLEL,
+ OMP_CANCEL_SECTIONS,
+ OMP_CANCEL_DO,
+ OMP_CANCEL_TASKGROUP
+};
+
typedef struct gfc_omp_clauses
{
struct gfc_expr *if_expr;
struct gfc_expr *final_expr;
struct gfc_expr *num_threads;
- gfc_namelist *lists[OMP_LIST_NUM];
+ gfc_omp_namelist *lists[OMP_LIST_NUM];
enum gfc_omp_sched_kind sched_kind;
struct gfc_expr *chunk_size;
enum gfc_omp_default_sharing default_sharing;
int collapse;
bool nowait, ordered, untied, mergeable;
+ bool inbranch, notinbranch;
+ enum gfc_omp_cancel_kind cancel;
+ enum gfc_omp_proc_bind_kind proc_bind;
+ struct gfc_expr *safelen_expr;
+ struct gfc_expr *simdlen_expr;
+ struct gfc_expr *num_teams;
+ struct gfc_expr *device;
+ struct gfc_expr *thread_limit;
+ enum gfc_omp_sched_kind dist_sched_kind;
+ struct gfc_expr *dist_chunk_size;
}
gfc_omp_clauses;
#define gfc_get_omp_clauses() XCNEW (gfc_omp_clauses)
+/* Node in the linked list used for storing !$omp declare simd constructs. */
+
+typedef struct gfc_omp_declare_simd
+{
+ struct gfc_omp_declare_simd *next;
+ locus where; /* Where the !$omp declare simd construct occurred. */
+
+ gfc_symbol *proc_name;
+
+ gfc_omp_clauses *clauses;
+}
+gfc_omp_declare_simd;
+#define gfc_get_omp_declare_simd() XCNEW (gfc_omp_declare_simd)
+
+typedef struct gfc_omp_udr
+{
+ struct gfc_omp_udr *next;
+ locus where; /* Where the !$omp declare reduction construct occurred. */
+
+ const char *name;
+ gfc_typespec ts;
+ gfc_omp_reduction_op rop;
+
+ struct gfc_symbol *omp_out;
+ struct gfc_symbol *omp_in;
+ struct gfc_namespace *combiner_ns;
+
+ struct gfc_symbol *omp_priv;
+ struct gfc_symbol *omp_orig;
+ struct gfc_namespace *initializer_ns;
+}
+gfc_omp_udr;
+#define gfc_get_omp_udr() XCNEW (gfc_omp_udr)
+
+typedef struct gfc_omp_namelist_udr
+{
+ struct gfc_omp_udr *udr;
+ struct gfc_code *combiner;
+ struct gfc_code *initializer;
+}
+gfc_omp_namelist_udr;
+#define gfc_get_omp_namelist_udr() XCNEW (gfc_omp_namelist_udr)
+
/* The gfc_st_label structure is a BBT attached to a namespace that
records the usage of statement labels within that space. */
typedef struct gfc_common_head
{
locus where;
- char use_assoc, saved, threadprivate;
+ char use_assoc, saved, threadprivate, omp_declare_target;
char name[GFC_MAX_SYMBOL_LEN + 1];
struct gfc_symbol *head;
const char* binding_label;
gfc_user_op *uop;
gfc_common_head *common;
gfc_typebound_proc *tb;
+ gfc_omp_udr *omp_udr;
}
n;
}
gfc_symtree *uop_root;
/* Tree containing all the common blocks. */
gfc_symtree *common_root;
+ /* Tree containing all the OpenMP user defined reductions. */
+ gfc_symtree *omp_udr_root;
/* Tree containing type-bound procedures. */
gfc_symtree *tb_sym_root;
/* A list of USE statements in this namespace. */
gfc_use_list *use_stmts;
+ /* Linked list of !$omp declare simd constructs. */
+ struct gfc_omp_declare_simd *omp_declare_simd;
+
/* Set to 1 if namespace is a BLOCK DATA program unit. */
unsigned is_block_data:1;
/* Set to 1 if symbols in this namespace should be 'construct entities',
i.e. for BLOCK local variables. */
unsigned construct_entities:1;
+
+ /* Set to 1 for !$OMP DECLARE REDUCTION namespaces. */
+ unsigned omp_udr_ns:1;
}
gfc_namespace;
EXEC_OMP_SECTIONS, EXEC_OMP_SINGLE, EXEC_OMP_WORKSHARE,
EXEC_OMP_ATOMIC, EXEC_OMP_BARRIER, EXEC_OMP_END_NOWAIT,
EXEC_OMP_END_SINGLE, EXEC_OMP_TASK, EXEC_OMP_TASKWAIT,
- EXEC_OMP_TASKYIELD
+ EXEC_OMP_TASKYIELD, EXEC_OMP_CANCEL, EXEC_OMP_CANCELLATION_POINT,
+ EXEC_OMP_TASKGROUP, EXEC_OMP_SIMD, EXEC_OMP_DO_SIMD,
+ EXEC_OMP_PARALLEL_DO_SIMD, EXEC_OMP_TARGET, EXEC_OMP_TARGET_DATA,
+ EXEC_OMP_TEAMS, EXEC_OMP_DISTRIBUTE, EXEC_OMP_DISTRIBUTE_SIMD,
+ EXEC_OMP_DISTRIBUTE_PARALLEL_DO, EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD,
+ EXEC_OMP_TARGET_TEAMS, EXEC_OMP_TEAMS_DISTRIBUTE,
+ EXEC_OMP_TEAMS_DISTRIBUTE_SIMD, EXEC_OMP_TARGET_TEAMS_DISTRIBUTE,
+ EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD,
+ EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO,
+ EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO,
+ EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD,
+ EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD,
+ EXEC_OMP_TARGET_UPDATE
}
gfc_exec_op;
typedef enum
{
- GFC_OMP_ATOMIC_UPDATE,
- GFC_OMP_ATOMIC_READ,
- GFC_OMP_ATOMIC_WRITE,
- GFC_OMP_ATOMIC_CAPTURE
+ GFC_OMP_ATOMIC_UPDATE = 0,
+ GFC_OMP_ATOMIC_READ = 1,
+ GFC_OMP_ATOMIC_WRITE = 2,
+ GFC_OMP_ATOMIC_CAPTURE = 3,
+ GFC_OMP_ATOMIC_MASK = 3,
+ GFC_OMP_ATOMIC_SEQ_CST = 4,
+ GFC_OMP_ATOMIC_SWAP = 8
}
gfc_omp_atomic_op;
gfc_entry_list *entry;
gfc_omp_clauses *omp_clauses;
const char *omp_name;
- gfc_namelist *omp_namelist;
+ gfc_omp_namelist *omp_namelist;
bool omp_bool;
gfc_omp_atomic_op omp_atomic;
}
bool gfc_add_result (symbol_attribute *, const char *, locus *);
bool gfc_add_save (symbol_attribute *, save_state, const char *, locus *);
bool gfc_add_threadprivate (symbol_attribute *, const char *, locus *);
+bool gfc_add_omp_declare_target (symbol_attribute *, const char *, locus *);
bool gfc_add_saved_common (symbol_attribute *, locus *);
bool gfc_add_target (symbol_attribute *, locus *);
bool gfc_add_dummy (symbol_attribute *, const char *, locus *);
void gfc_free_forall_iterator (gfc_forall_iterator *);
void gfc_free_alloc_list (gfc_alloc *);
void gfc_free_namelist (gfc_namelist *);
+void gfc_free_omp_namelist (gfc_omp_namelist *);
void gfc_free_equiv (gfc_equiv *);
void gfc_free_equiv_until (gfc_equiv *, gfc_equiv *);
void gfc_free_data (gfc_data *);
/* openmp.c */
struct gfc_omp_saved_state { void *ptrs[2]; int ints[1]; };
void gfc_free_omp_clauses (gfc_omp_clauses *);
+void gfc_free_omp_declare_simd (gfc_omp_declare_simd *);
+void gfc_free_omp_declare_simd_list (gfc_omp_declare_simd *);
+void gfc_free_omp_udr (gfc_omp_udr *);
+gfc_omp_udr *gfc_omp_udr_find (gfc_symtree *, gfc_typespec *);
void gfc_resolve_omp_directive (gfc_code *, gfc_namespace *);
void gfc_resolve_do_iterator (gfc_code *, gfc_symbol *);
void gfc_resolve_omp_parallel_blocks (gfc_code *, gfc_namespace *);
void gfc_resolve_omp_do_blocks (gfc_code *, gfc_namespace *);
+void gfc_resolve_omp_declare_simd (gfc_namespace *);
+void gfc_resolve_omp_udrs (gfc_symtree *);
void gfc_omp_save_and_clear_state (struct gfc_omp_saved_state *);
void gfc_omp_restore_state (struct gfc_omp_saved_state *);
/* resolve.c */
bool gfc_resolve_expr (gfc_expr *);
void gfc_resolve (gfc_namespace *);
+void gfc_resolve_code (gfc_code *, gfc_namespace *);
void gfc_resolve_blocks (gfc_code *, gfc_namespace *);
int gfc_impure_variable (gfc_symbol *);
int gfc_pure (gfc_symbol *);
typedef int (*walk_code_fn_t) (gfc_code **, int *, void *);
typedef int (*walk_expr_fn_t) (gfc_expr **, int *, void *);
+int gfc_dummy_code_callback (gfc_code **, int *, void *);
int gfc_expr_walker (gfc_expr **, walk_expr_fn_t, void *);
int gfc_code_walker (gfc_code **, walk_code_fn_t, walk_expr_fn_t, void *);
*note TS 29113 status:: sections of the documentation.
Additionally, the GNU Fortran compilers supports the OpenMP
-specification (version 3.1,
+specification (version 4.0,
<http://openmp.org/wp/openmp-specifications/>).
\1f
run-time behavior.
GNU Fortran strives to be compatible to the OpenMP Application
-Program Interface v3.1 (http://www.openmp.org/mp-documents/spec31.pdf).
+Program Interface v4.0 (http://openmp.org/wp/openmp-specifications/).
To enable the processing of the OpenMP directive '!$omp' in free-form
source code; the 'c$omp', '*$omp' and '!$omp' directives in fixed form;
_Description_:
'CTIME' converts a system time value, such as returned by 'TIME8',
- to a string. Unless the application has called 'setlocale', the
- output will be in the default locale, of length 24 and of the form
- 'Sat Aug 19 18:13:14 1995'. In other locales, a longer string may
- result.
+ to a string. The output will be of the form 'Sat Aug 19 18:13:14
+ 1995'.
This intrinsic is provided in both subroutine and function forms;
however, only one form can be used in any given program unit.
'OMP_LIB' provides the scalar default-integer named constant
'openmp_version' with a value of the form YYYYMM, where 'yyyy' is the
-year and MM the month of the OpenMP version; for OpenMP v3.1 the value
-is '201107' and for OpenMP v4.0 the value is '201307'.
+year and MM the month of the OpenMP version; for OpenMP v4.0 the value
+is '201307'.
The following scalar integer named constants of the kind
'omp_sched_kind':
Node: Cray pointers\7f116621
Node: CONVERT specifier\7f122068
Node: OpenMP\7f124063
-Node: Argument list functions\7f126314
-Node: Extensions not implemented in GNU Fortran\7f127919
-Node: STRUCTURE and RECORD\7f128868
-Node: ENCODE and DECODE statements\7f131305
-Node: Variable FORMAT expressions\7f132665
-Node: Alternate complex function syntax\7f133770
-Node: Volatile COMMON blocks\7f134320
-Node: Mixed-Language Programming\7f134797
-Node: Interoperability with C\7f135378
-Node: Intrinsic Types\7f136712
-Node: Derived Types and struct\7f137708
-Node: Interoperable Global Variables\7f139066
-Node: Interoperable Subroutines and Functions\7f140341
-Node: Working with Pointers\7f144135
-Node: Further Interoperability of Fortran with C\7f148611
-Node: GNU Fortran Compiler Directives\7f151965
-Node: Non-Fortran Main Program\7f155217
-Node: _gfortran_set_args\7f157405
-Node: _gfortran_set_options\7f158343
-Node: _gfortran_set_convert\7f161743
-Node: _gfortran_set_record_marker\7f162611
-Node: _gfortran_set_fpe\7f163421
-Node: _gfortran_set_max_subrecord_length\7f164619
-Node: Naming and argument-passing conventions\7f165542
-Node: Naming conventions\7f166261
-Node: Argument passing conventions\7f167733
-Node: Intrinsic Procedures\7f172227
-Node: Introduction to Intrinsics\7f187713
-Node: ABORT\7f190063
-Node: ABS\7f190808
-Node: ACCESS\7f192410
-Node: ACHAR\7f194340
-Node: ACOS\7f195544
-Node: ACOSH\7f196798
-Node: ADJUSTL\7f197793
-Node: ADJUSTR\7f198735
-Node: AIMAG\7f199683
-Node: AINT\7f201055
-Node: ALARM\7f202661
-Node: ALL\7f204293
-Node: ALLOCATED\7f206217
-Node: AND\7f207356
-Node: ANINT\7f208655
-Node: ANY\7f210152
-Node: ASIN\7f212078
-Node: ASINH\7f213321
-Node: ASSOCIATED\7f214326
-Node: ATAN\7f217337
-Node: ATAN2\7f218755
-Node: ATANH\7f220547
-Node: ATOMIC_DEFINE\7f221555
-Node: ATOMIC_REF\7f222631
-Node: BACKTRACE\7f223893
-Node: BESSEL_J0\7f224473
-Node: BESSEL_J1\7f225530
-Node: BESSEL_JN\7f226591
-Node: BESSEL_Y0\7f228416
-Node: BESSEL_Y1\7f229426
-Node: BESSEL_YN\7f230436
-Node: BGE\7f232267
-Node: BGT\7f232959
-Node: BIT_SIZE\7f233609
-Node: BLE\7f234431
-Node: BLT\7f235113
-Node: BTEST\7f235751
-Node: C_ASSOCIATED\7f236636
-Node: C_F_POINTER\7f237847
-Node: C_F_PROCPOINTER\7f239282
-Node: C_FUNLOC\7f240789
-Node: C_LOC\7f242160
-Node: C_SIZEOF\7f243439
-Node: CEILING\7f244852
-Node: CHAR\7f245860
-Node: CHDIR\7f247072
-Node: CHMOD\7f248246
-Node: CMPLX\7f250161
-Node: COMMAND_ARGUMENT_COUNT\7f251614
-Node: COMPILER_OPTIONS\7f252530
-Node: COMPILER_VERSION\7f253556
-Node: COMPLEX\7f254520
-Node: CONJG\7f255659
-Node: COS\7f256715
-Node: COSH\7f258139
-Node: COUNT\7f259321
-Node: CPU_TIME\7f261344
-Node: CSHIFT\7f262701
-Node: CTIME\7f264361
-Node: DATE_AND_TIME\7f266007
-Node: DBLE\7f268487
-Node: DCMPLX\7f269282
-Node: DIGITS\7f270464
-Node: DIM\7f271431
-Node: DOT_PRODUCT\7f272712
-Node: DPROD\7f274355
-Node: DREAL\7f275282
-Node: DSHIFTL\7f275948
-Node: DSHIFTR\7f277281
-Node: DTIME\7f278615
-Node: EOSHIFT\7f281430
-Node: EPSILON\7f283503
-Node: ERF\7f284230
-Node: ERFC\7f285011
-Node: ERFC_SCALED\7f285821
-Node: ETIME\7f286514
-Node: EXECUTE_COMMAND_LINE\7f288762
-Node: EXIT\7f291349
-Node: EXP\7f292225
-Node: EXPONENT\7f293476
-Node: EXTENDS_TYPE_OF\7f294238
-Node: FDATE\7f295094
-Node: FGET\7f296567
-Node: FGETC\7f298392
-Node: FLOOR\7f300198
-Node: FLUSH\7f301185
-Node: FNUM\7f303062
-Node: FPUT\7f303785
-Node: FPUTC\7f305417
-Node: FRACTION\7f307196
-Node: FREE\7f308098
-Node: FSEEK\7f308939
-Node: FSTAT\7f311243
-Node: FTELL\7f312328
-Node: GAMMA\7f313308
-Node: GERROR\7f314360
-Node: GETARG\7f315080
-Node: GET_COMMAND\7f316851
-Node: GET_COMMAND_ARGUMENT\7f318223
-Node: GETCWD\7f320271
-Node: GETENV\7f321251
-Node: GET_ENVIRONMENT_VARIABLE\7f322683
-Node: GETGID\7f324846
-Node: GETLOG\7f325383
-Node: GETPID\7f326245
-Node: GETUID\7f326975
-Node: GMTIME\7f327491
-Node: HOSTNM\7f328975
-Node: HUGE\7f329896
-Node: HYPOT\7f330618
-Node: IACHAR\7f331444
-Node: IALL\7f332612
-Node: IAND\7f334097
-Node: IANY\7f335084
-Node: IARGC\7f336578
-Node: IBCLR\7f337599
-Node: IBITS\7f338261
-Node: IBSET\7f339179
-Node: ICHAR\7f339836
-Node: IDATE\7f342006
-Node: IEOR\7f343036
-Node: IERRNO\7f343916
-Node: IMAGE_INDEX\7f344465
-Node: INDEX intrinsic\7f345493
-Node: INT\7f347019
-Node: INT2\7f348747
-Node: INT8\7f349515
-Node: IOR\7f350230
-Node: IPARITY\7f351086
-Node: IRAND\7f352618
-Node: IS_IOSTAT_END\7f353977
-Node: IS_IOSTAT_EOR\7f355076
-Node: ISATTY\7f356205
-Node: ISHFT\7f356988
-Node: ISHFTC\7f357971
-Node: ISNAN\7f359192
-Node: ITIME\7f359959
-Node: KILL\7f360987
-Node: KIND\7f361896
-Node: LBOUND\7f362742
-Node: LCOBOUND\7f364080
-Node: LEADZ\7f365215
-Node: LEN\7f366076
-Node: LEN_TRIM\7f367372
-Node: LGE\7f368360
-Node: LGT\7f369873
-Node: LINK\7f371351
-Node: LLE\7f372390
-Node: LLT\7f373890
-Node: LNBLNK\7f375361
-Node: LOC\7f376139
-Node: LOG\7f376871
-Node: LOG10\7f378219
-Node: LOG_GAMMA\7f379209
-Node: LOGICAL\7f380311
-Node: LONG\7f381123
-Node: LSHIFT\7f381881
-Node: LSTAT\7f382967
-Node: LTIME\7f384167
-Node: MALLOC\7f385573
-Node: MASKL\7f387035
-Node: MASKR\7f387802
-Node: MATMUL\7f388572
-Node: MAX\7f389670
-Node: MAXEXPONENT\7f391205
-Node: MAXLOC\7f392022
-Node: MAXVAL\7f394047
-Node: MCLOCK\7f395687
-Node: MCLOCK8\7f396710
-Node: MERGE\7f397940
-Node: MERGE_BITS\7f398692
-Node: MIN\7f399557
-Node: MINEXPONENT\7f401095
-Node: MINLOC\7f401726
-Node: MINVAL\7f403751
-Node: MOD\7f405404
-Node: MODULO\7f407173
-Node: MOVE_ALLOC\7f408476
-Node: MVBITS\7f409509
-Node: NEAREST\7f410575
-Node: NEW_LINE\7f411675
-Node: NINT\7f412448
-Node: NORM2\7f413869
-Node: NOT\7f415011
-Node: NULL\7f415595
-Node: NUM_IMAGES\7f416503
-Node: OR\7f417319
-Node: PACK\7f418605
-Node: PARITY\7f420613
-Node: PERROR\7f421834
-Node: POPCNT\7f422459
-Node: POPPAR\7f423331
-Node: PRECISION\7f424385
-Node: PRESENT\7f425272
-Node: PRODUCT\7f426384
-Node: RADIX\7f427918
-Node: RAN\7f428730
-Node: RAND\7f429186
-Node: RANDOM_NUMBER\7f430521
-Node: RANDOM_SEED\7f432250
-Node: RANGE\7f436081
-Node: RANK\7f436762
-Node: REAL\7f437543
-Node: RENAME\7f439340
-Node: REPEAT\7f440362
-Node: RESHAPE\7f441090
-Node: RRSPACING\7f442557
-Node: RSHIFT\7f443250
-Node: SAME_TYPE_AS\7f444390
-Node: SCALE\7f445222
-Node: SCAN\7f446003
-Node: SECNDS\7f447561
-Node: SECOND\7f448653
-Node: SELECTED_CHAR_KIND\7f449529
-Node: SELECTED_INT_KIND\7f451124
-Node: SELECTED_REAL_KIND\7f452301
-Node: SET_EXPONENT\7f454978
-Node: SHAPE\7f455975
-Node: SHIFTA\7f457399
-Node: SHIFTL\7f458363
-Node: SHIFTR\7f459200
-Node: SIGN\7f460038
-Node: SIGNAL\7f461264
-Node: SIN\7f462770
-Node: SINH\7f463812
-Node: SIZE\7f464824
-Node: SIZEOF\7f466143
-Node: SLEEP\7f467620
-Node: SPACING\7f468181
-Node: SPREAD\7f469195
-Node: SQRT\7f470346
-Node: SRAND\7f471678
-Node: STAT\7f472848
-Node: STORAGE_SIZE\7f476016
-Node: SUM\7f476895
-Node: SYMLNK\7f478387
-Node: SYSTEM\7f479522
-Node: SYSTEM_CLOCK\7f480777
-Node: TAN\7f483536
-Node: TANH\7f484524
-Node: THIS_IMAGE\7f485698
-Node: TIME\7f487198
-Node: TIME8\7f488323
-Node: TINY\7f489476
-Node: TRAILZ\7f490077
-Node: TRANSFER\7f490895
-Node: TRANSPOSE\7f492931
-Node: TRIM\7f493621
-Node: TTYNAM\7f494479
-Node: UBOUND\7f495397
-Node: UCOBOUND\7f496787
-Node: UMASK\7f497924
-Node: UNLINK\7f498606
-Node: UNPACK\7f499586
-Node: VERIFY\7f500881
-Node: XOR\7f502610
-Node: Intrinsic Modules\7f503983
-Node: ISO_FORTRAN_ENV\7f504226
-Node: ISO_C_BINDING\7f508394
-Node: OpenMP Modules OMP_LIB and OMP_LIB_KINDS\7f512126
-Node: Contributing\7f513671
-Node: Contributors\7f514525
-Node: Projects\7f516156
-Node: Proposed Extensions\7f516962
-Node: Copying\7f518972
-Node: GNU Free Documentation License\7f556517
-Node: Funding\7f581640
-Node: Option Index\7f584166
-Node: Keyword Index\7f599298
+Node: Argument list functions\7f126312
+Node: Extensions not implemented in GNU Fortran\7f127917
+Node: STRUCTURE and RECORD\7f128866
+Node: ENCODE and DECODE statements\7f131303
+Node: Variable FORMAT expressions\7f132663
+Node: Alternate complex function syntax\7f133768
+Node: Volatile COMMON blocks\7f134318
+Node: Mixed-Language Programming\7f134795
+Node: Interoperability with C\7f135376
+Node: Intrinsic Types\7f136710
+Node: Derived Types and struct\7f137706
+Node: Interoperable Global Variables\7f139064
+Node: Interoperable Subroutines and Functions\7f140339
+Node: Working with Pointers\7f144133
+Node: Further Interoperability of Fortran with C\7f148609
+Node: GNU Fortran Compiler Directives\7f151963
+Node: Non-Fortran Main Program\7f155215
+Node: _gfortran_set_args\7f157403
+Node: _gfortran_set_options\7f158341
+Node: _gfortran_set_convert\7f161741
+Node: _gfortran_set_record_marker\7f162609
+Node: _gfortran_set_fpe\7f163419
+Node: _gfortran_set_max_subrecord_length\7f164617
+Node: Naming and argument-passing conventions\7f165540
+Node: Naming conventions\7f166259
+Node: Argument passing conventions\7f167731
+Node: Intrinsic Procedures\7f172225
+Node: Introduction to Intrinsics\7f187711
+Node: ABORT\7f190061
+Node: ABS\7f190806
+Node: ACCESS\7f192408
+Node: ACHAR\7f194338
+Node: ACOS\7f195542
+Node: ACOSH\7f196796
+Node: ADJUSTL\7f197791
+Node: ADJUSTR\7f198733
+Node: AIMAG\7f199681
+Node: AINT\7f201053
+Node: ALARM\7f202659
+Node: ALL\7f204291
+Node: ALLOCATED\7f206215
+Node: AND\7f207354
+Node: ANINT\7f208653
+Node: ANY\7f210150
+Node: ASIN\7f212076
+Node: ASINH\7f213319
+Node: ASSOCIATED\7f214324
+Node: ATAN\7f217335
+Node: ATAN2\7f218753
+Node: ATANH\7f220545
+Node: ATOMIC_DEFINE\7f221553
+Node: ATOMIC_REF\7f222629
+Node: BACKTRACE\7f223891
+Node: BESSEL_J0\7f224471
+Node: BESSEL_J1\7f225528
+Node: BESSEL_JN\7f226589
+Node: BESSEL_Y0\7f228414
+Node: BESSEL_Y1\7f229424
+Node: BESSEL_YN\7f230434
+Node: BGE\7f232265
+Node: BGT\7f232957
+Node: BIT_SIZE\7f233607
+Node: BLE\7f234429
+Node: BLT\7f235111
+Node: BTEST\7f235749
+Node: C_ASSOCIATED\7f236634
+Node: C_F_POINTER\7f237845
+Node: C_F_PROCPOINTER\7f239280
+Node: C_FUNLOC\7f240787
+Node: C_LOC\7f242158
+Node: C_SIZEOF\7f243437
+Node: CEILING\7f244850
+Node: CHAR\7f245858
+Node: CHDIR\7f247070
+Node: CHMOD\7f248244
+Node: CMPLX\7f250159
+Node: COMMAND_ARGUMENT_COUNT\7f251612
+Node: COMPILER_OPTIONS\7f252528
+Node: COMPILER_VERSION\7f253554
+Node: COMPLEX\7f254518
+Node: CONJG\7f255657
+Node: COS\7f256713
+Node: COSH\7f258137
+Node: COUNT\7f259319
+Node: CPU_TIME\7f261342
+Node: CSHIFT\7f262699
+Node: CTIME\7f264359
+Node: DATE_AND_TIME\7f265861
+Node: DBLE\7f268341
+Node: DCMPLX\7f269136
+Node: DIGITS\7f270318
+Node: DIM\7f271285
+Node: DOT_PRODUCT\7f272566
+Node: DPROD\7f274209
+Node: DREAL\7f275136
+Node: DSHIFTL\7f275802
+Node: DSHIFTR\7f277135
+Node: DTIME\7f278469
+Node: EOSHIFT\7f281284
+Node: EPSILON\7f283357
+Node: ERF\7f284084
+Node: ERFC\7f284865
+Node: ERFC_SCALED\7f285675
+Node: ETIME\7f286368
+Node: EXECUTE_COMMAND_LINE\7f288616
+Node: EXIT\7f291203
+Node: EXP\7f292079
+Node: EXPONENT\7f293330
+Node: EXTENDS_TYPE_OF\7f294092
+Node: FDATE\7f294948
+Node: FGET\7f296421
+Node: FGETC\7f298246
+Node: FLOOR\7f300052
+Node: FLUSH\7f301039
+Node: FNUM\7f302916
+Node: FPUT\7f303639
+Node: FPUTC\7f305271
+Node: FRACTION\7f307050
+Node: FREE\7f307952
+Node: FSEEK\7f308793
+Node: FSTAT\7f311097
+Node: FTELL\7f312182
+Node: GAMMA\7f313162
+Node: GERROR\7f314214
+Node: GETARG\7f314934
+Node: GET_COMMAND\7f316705
+Node: GET_COMMAND_ARGUMENT\7f318077
+Node: GETCWD\7f320125
+Node: GETENV\7f321105
+Node: GET_ENVIRONMENT_VARIABLE\7f322537
+Node: GETGID\7f324700
+Node: GETLOG\7f325237
+Node: GETPID\7f326099
+Node: GETUID\7f326829
+Node: GMTIME\7f327345
+Node: HOSTNM\7f328829
+Node: HUGE\7f329750
+Node: HYPOT\7f330472
+Node: IACHAR\7f331298
+Node: IALL\7f332466
+Node: IAND\7f333951
+Node: IANY\7f334938
+Node: IARGC\7f336432
+Node: IBCLR\7f337453
+Node: IBITS\7f338115
+Node: IBSET\7f339033
+Node: ICHAR\7f339690
+Node: IDATE\7f341860
+Node: IEOR\7f342890
+Node: IERRNO\7f343770
+Node: IMAGE_INDEX\7f344319
+Node: INDEX intrinsic\7f345347
+Node: INT\7f346873
+Node: INT2\7f348601
+Node: INT8\7f349369
+Node: IOR\7f350084
+Node: IPARITY\7f350940
+Node: IRAND\7f352472
+Node: IS_IOSTAT_END\7f353831
+Node: IS_IOSTAT_EOR\7f354930
+Node: ISATTY\7f356059
+Node: ISHFT\7f356842
+Node: ISHFTC\7f357825
+Node: ISNAN\7f359046
+Node: ITIME\7f359813
+Node: KILL\7f360841
+Node: KIND\7f361750
+Node: LBOUND\7f362596
+Node: LCOBOUND\7f363934
+Node: LEADZ\7f365069
+Node: LEN\7f365930
+Node: LEN_TRIM\7f367226
+Node: LGE\7f368214
+Node: LGT\7f369727
+Node: LINK\7f371205
+Node: LLE\7f372244
+Node: LLT\7f373744
+Node: LNBLNK\7f375215
+Node: LOC\7f375993
+Node: LOG\7f376725
+Node: LOG10\7f378073
+Node: LOG_GAMMA\7f379063
+Node: LOGICAL\7f380165
+Node: LONG\7f380977
+Node: LSHIFT\7f381735
+Node: LSTAT\7f382821
+Node: LTIME\7f384021
+Node: MALLOC\7f385427
+Node: MASKL\7f386889
+Node: MASKR\7f387656
+Node: MATMUL\7f388426
+Node: MAX\7f389524
+Node: MAXEXPONENT\7f391059
+Node: MAXLOC\7f391876
+Node: MAXVAL\7f393901
+Node: MCLOCK\7f395541
+Node: MCLOCK8\7f396564
+Node: MERGE\7f397794
+Node: MERGE_BITS\7f398546
+Node: MIN\7f399411
+Node: MINEXPONENT\7f400949
+Node: MINLOC\7f401580
+Node: MINVAL\7f403605
+Node: MOD\7f405258
+Node: MODULO\7f407027
+Node: MOVE_ALLOC\7f408330
+Node: MVBITS\7f409363
+Node: NEAREST\7f410429
+Node: NEW_LINE\7f411529
+Node: NINT\7f412302
+Node: NORM2\7f413723
+Node: NOT\7f414865
+Node: NULL\7f415449
+Node: NUM_IMAGES\7f416357
+Node: OR\7f417173
+Node: PACK\7f418459
+Node: PARITY\7f420467
+Node: PERROR\7f421688
+Node: POPCNT\7f422313
+Node: POPPAR\7f423185
+Node: PRECISION\7f424239
+Node: PRESENT\7f425126
+Node: PRODUCT\7f426238
+Node: RADIX\7f427772
+Node: RAN\7f428584
+Node: RAND\7f429040
+Node: RANDOM_NUMBER\7f430375
+Node: RANDOM_SEED\7f432104
+Node: RANGE\7f435935
+Node: RANK\7f436616
+Node: REAL\7f437397
+Node: RENAME\7f439194
+Node: REPEAT\7f440216
+Node: RESHAPE\7f440944
+Node: RRSPACING\7f442411
+Node: RSHIFT\7f443104
+Node: SAME_TYPE_AS\7f444244
+Node: SCALE\7f445076
+Node: SCAN\7f445857
+Node: SECNDS\7f447415
+Node: SECOND\7f448507
+Node: SELECTED_CHAR_KIND\7f449383
+Node: SELECTED_INT_KIND\7f450978
+Node: SELECTED_REAL_KIND\7f452155
+Node: SET_EXPONENT\7f454832
+Node: SHAPE\7f455829
+Node: SHIFTA\7f457253
+Node: SHIFTL\7f458217
+Node: SHIFTR\7f459054
+Node: SIGN\7f459892
+Node: SIGNAL\7f461118
+Node: SIN\7f462624
+Node: SINH\7f463666
+Node: SIZE\7f464678
+Node: SIZEOF\7f465997
+Node: SLEEP\7f467474
+Node: SPACING\7f468035
+Node: SPREAD\7f469049
+Node: SQRT\7f470200
+Node: SRAND\7f471532
+Node: STAT\7f472702
+Node: STORAGE_SIZE\7f475870
+Node: SUM\7f476749
+Node: SYMLNK\7f478241
+Node: SYSTEM\7f479376
+Node: SYSTEM_CLOCK\7f480631
+Node: TAN\7f483390
+Node: TANH\7f484378
+Node: THIS_IMAGE\7f485552
+Node: TIME\7f487052
+Node: TIME8\7f488177
+Node: TINY\7f489330
+Node: TRAILZ\7f489931
+Node: TRANSFER\7f490749
+Node: TRANSPOSE\7f492785
+Node: TRIM\7f493475
+Node: TTYNAM\7f494333
+Node: UBOUND\7f495251
+Node: UCOBOUND\7f496641
+Node: UMASK\7f497778
+Node: UNLINK\7f498460
+Node: UNPACK\7f499440
+Node: VERIFY\7f500735
+Node: XOR\7f502464
+Node: Intrinsic Modules\7f503837
+Node: ISO_FORTRAN_ENV\7f504080
+Node: ISO_C_BINDING\7f508248
+Node: OpenMP Modules OMP_LIB and OMP_LIB_KINDS\7f511980
+Node: Contributing\7f513483
+Node: Contributors\7f514337
+Node: Projects\7f515968
+Node: Proposed Extensions\7f516774
+Node: Copying\7f518784
+Node: GNU Free Documentation License\7f556329
+Node: Funding\7f581452
+Node: Option Index\7f583978
+Node: Keyword Index\7f599110
\1f
End Tag Table
@ref{TS 29113 status} sections of the documentation.
Additionally, the GNU Fortran compilers supports the OpenMP specification
-(version 3.1, @url{http://openmp.org/@/wp/@/openmp-specifications/}).
+(version 4.0, @url{http://openmp.org/@/wp/@/openmp-specifications/}).
@node Varying Length Character Strings
@subsection Varying Length Character Strings
and environment variables that influence run-time behavior.
GNU Fortran strives to be compatible to the
-@uref{http://www.openmp.org/mp-documents/spec31.pdf,
-OpenMP Application Program Interface v3.1}.
+@uref{http://openmp.org/wp/openmp-specifications/,
+OpenMP Application Program Interface v4.0}.
To enable the processing of the OpenMP directive @code{!$omp} in
free-form source code; the @code{c$omp}, @code{*$omp} and @code{!$omp}
static unsigned int g77_newargc;
static struct cl_decoded_option *g77_new_decoded_options;
-/* The path to the spec file. */
-static char *spec_file = NULL;
-
/* This will be NULL if we encounter a situation where we should not
link in the fortran libraries. */
static const char *library = NULL;
-/* Return full path name of spec file if it is in DIR, or NULL if
- not. */
-static char *
-find_spec_file (const char *dir)
-{
- const char dirsep_string[] = { DIR_SEPARATOR, '\0' };
- char *spec;
- struct stat sb;
-
- spec = XNEWVEC (char, strlen (dir) + sizeof (SPEC_FILE) + 4);
- strcpy (spec, dir);
- strcat (spec, dirsep_string);
- strcat (spec, SPEC_FILE);
- if (!stat (spec, &sb))
- return spec;
- free (spec);
- return NULL;
-}
-
-
/* Return whether strings S1 and S2 are both NULL or both the same
string. */
cool facility for handling --help and --verbose --help. */
return;
- case OPT_L:
- if (!spec_file)
- spec_file = find_spec_file (decoded_options[i].arg);
- break;
-
-
default:
break;
}
#endif
- /* Read the specs file corresponding to libgfortran.
- If we didn't find the spec file on the -L path, we load it
- via lang_specific_pre_link. */
- if (spec_file)
- append_option (OPT_specs_, spec_file, 1);
-
if (verbose && g77_new_decoded_options != g77_x_decoded_options)
{
fprintf (stderr, _("Driving:"));
int
lang_specific_pre_link (void)
{
- free (spec_file);
- if (spec_file == NULL && library)
+ if (library)
do_spec ("%:include(libgfortran.spec)");
return 0;
@table @asis
@item @emph{Description}:
@code{CTIME} converts a system time value, such as returned by
-@code{TIME8}, to a string. Unless the application has called
-@code{setlocale}, the output will be in the default locale, of length
-24 and of the form @samp{Sat Aug 19 18:13:14 1995}. In other locales,
-a longer string may result.
+@code{TIME8}, to a string. The output will be of the form @samp{Sat
+Aug 19 18:13:14 1995}.
This intrinsic is provided in both subroutine and function forms; however,
only one form can be used in any given program unit.
@code{OMP_LIB} provides the scalar default-integer
named constant @code{openmp_version} with a value of the form
@var{yyyymm}, where @code{yyyy} is the year and @var{mm} the month
-of the OpenMP version; for OpenMP v3.1 the value is @code{201107}
-and for OpenMP v4.0 the value is @code{201307}.
+of the OpenMP version; for OpenMP v4.0 the value is @code{201307}.
The following scalar integer named constants of the
kind @code{omp_sched_kind}:
&& o != NULL
&& o->state == COMP_OMP_STRUCTURED_BLOCK
&& (o->head->op == EXEC_OMP_DO
- || o->head->op == EXEC_OMP_PARALLEL_DO))
+ || o->head->op == EXEC_OMP_PARALLEL_DO
+ || o->head->op == EXEC_OMP_SIMD
+ || o->head->op == EXEC_OMP_DO_SIMD
+ || o->head->op == EXEC_OMP_PARALLEL_DO_SIMD))
{
int collapse = 1;
gcc_assert (o->head->next != NULL
}
+/* Free an OpenMP namelist structure. */
+
+void
+gfc_free_omp_namelist (gfc_omp_namelist *name)
+{
+ gfc_omp_namelist *n;
+
+ for (; name; name = n)
+ {
+ gfc_free_expr (name->expr);
+ if (name->udr)
+ {
+ if (name->udr->combiner)
+ gfc_free_statement (name->udr->combiner);
+ if (name->udr->initializer)
+ gfc_free_statement (name->udr->initializer);
+ free (name->udr);
+ }
+ n = name->next;
+ free (name);
+ }
+}
+
+
/* Match a NAMELIST statement. */
match
match gfc_match_omp_eos (void);
match gfc_match_omp_atomic (void);
match gfc_match_omp_barrier (void);
+match gfc_match_omp_cancel (void);
+match gfc_match_omp_cancellation_point (void);
match gfc_match_omp_critical (void);
+match gfc_match_omp_declare_reduction (void);
+match gfc_match_omp_declare_simd (void);
+match gfc_match_omp_declare_target (void);
+match gfc_match_omp_distribute (void);
+match gfc_match_omp_distribute_parallel_do (void);
+match gfc_match_omp_distribute_parallel_do_simd (void);
+match gfc_match_omp_distribute_simd (void);
match gfc_match_omp_do (void);
+match gfc_match_omp_do_simd (void);
match gfc_match_omp_flush (void);
match gfc_match_omp_master (void);
match gfc_match_omp_ordered (void);
match gfc_match_omp_parallel (void);
match gfc_match_omp_parallel_do (void);
+match gfc_match_omp_parallel_do_simd (void);
match gfc_match_omp_parallel_sections (void);
match gfc_match_omp_parallel_workshare (void);
match gfc_match_omp_sections (void);
+match gfc_match_omp_simd (void);
match gfc_match_omp_single (void);
+match gfc_match_omp_target (void);
+match gfc_match_omp_target_data (void);
+match gfc_match_omp_target_teams (void);
+match gfc_match_omp_target_teams_distribute (void);
+match gfc_match_omp_target_teams_distribute_parallel_do (void);
+match gfc_match_omp_target_teams_distribute_parallel_do_simd (void);
+match gfc_match_omp_target_teams_distribute_simd (void);
+match gfc_match_omp_target_update (void);
match gfc_match_omp_task (void);
+match gfc_match_omp_taskgroup (void);
match gfc_match_omp_taskwait (void);
match gfc_match_omp_taskyield (void);
+match gfc_match_omp_teams (void);
+match gfc_match_omp_teams_distribute (void);
+match gfc_match_omp_teams_distribute_parallel_do (void);
+match gfc_match_omp_teams_distribute_parallel_do_simd (void);
+match gfc_match_omp_teams_distribute_simd (void);
match gfc_match_omp_threadprivate (void);
match gfc_match_omp_workshare (void);
match gfc_match_omp_end_nowait (void);
/* Don't put any single quote (') in MOD_VERSION, if you want it to be
recognized. */
#define MOD_VERSION "12"
+#define MOD_VERSION_OMP4 "12 OpenMP 4"
/* Structure that describes a position within a module file. */
static long module_pos;
static int module_line, module_column, only_flag;
static int prev_module_line, prev_module_column;
+static bool module_omp4;
static enum
{ IO_INPUT, IO_OUTPUT }
AB_IS_BIND_C, AB_IS_C_INTEROP, AB_IS_ISO_C, AB_ABSTRACT, AB_ZERO_COMP,
AB_IS_CLASS, AB_PROCEDURE, AB_PROC_POINTER, AB_ASYNCHRONOUS, AB_CODIMENSION,
AB_COARRAY_COMP, AB_VTYPE, AB_VTAB, AB_CONTIGUOUS, AB_CLASS_POINTER,
- AB_IMPLICIT_PURE, AB_ARTIFICIAL, AB_UNLIMITED_POLY
+ AB_IMPLICIT_PURE, AB_ARTIFICIAL, AB_UNLIMITED_POLY, AB_OMP_DECLARE_TARGET
}
ab_attribute;
minit ("CLASS_POINTER", AB_CLASS_POINTER),
minit ("IMPLICIT_PURE", AB_IMPLICIT_PURE),
minit ("UNLIMITED_POLY", AB_UNLIMITED_POLY),
+ minit ("OMP_DECLARE_TARGET", AB_OMP_DECLARE_TARGET),
minit (NULL, -1)
};
MIO_NAME (ab_attribute) (AB_VTYPE, attr_bits);
if (attr->vtab)
MIO_NAME (ab_attribute) (AB_VTAB, attr_bits);
+ if (attr->omp_declare_target)
+ MIO_NAME (ab_attribute) (AB_OMP_DECLARE_TARGET, attr_bits);
mio_rparen ();
case AB_VTAB:
attr->vtab = 1;
break;
+ case AB_OMP_DECLARE_TARGET:
+ attr->omp_declare_target = 1;
+ break;
}
}
}
minit ("LE", INTRINSIC_LE_OS),
minit ("NOT", INTRINSIC_NOT),
minit ("PARENTHESES", INTRINSIC_PARENTHESES),
+ minit ("USER", INTRINSIC_USER),
minit (NULL, -1)
};
&& !e->symtree->n.sym->attr.dummy)
e->symtree = ns_st;
}
- else if (e->expr_type == EXPR_FUNCTION && e->value.function.name)
+ else if (e->expr_type == EXPR_FUNCTION
+ && (e->value.function.name || e->value.function.isym))
{
gfc_symbol *sym;
mio_expr (&e->value.op.op2);
break;
+ case INTRINSIC_USER:
+ /* INTRINSIC_USER should not appear in resolved expressions,
+ though for UDRs we need to stream unresolved ones. */
+ if (iomode == IO_OUTPUT)
+ write_atom (ATOM_STRING, e->value.op.uop->name);
+ else
+ {
+ char *name = read_string ();
+ const char *uop_name = find_use_name (name, true);
+ if (uop_name == NULL)
+ {
+ size_t len = strlen (name);
+ char *name2 = XCNEWVEC (char, len + 2);
+ memcpy (name2, name, len);
+ name2[len] = ' ';
+ name2[len + 1] = '\0';
+ free (name);
+ uop_name = name = name2;
+ }
+ e->value.op.uop = gfc_get_uop (uop_name);
+ free (name);
+ }
+ mio_expr (&e->value.op.op1);
+ mio_expr (&e->value.op.op2);
+ break;
+
default:
bad_module ("Bad operator");
}
flag = 1;
else if (e->ref)
flag = 2;
+ else if (e->value.function.isym == NULL)
+ flag = 3;
else
flag = 0;
mio_integer (&flag);
case 2:
mio_ref_list (&e->ref);
break;
+ case 3:
+ break;
default:
write_atom (ATOM_STRING, e->value.function.isym->name);
}
else
{
require_atom (ATOM_STRING);
- e->value.function.name = gfc_get_string (atom_string);
+ if (atom_string[0] == '\0')
+ e->value.function.name = NULL;
+ else
+ e->value.function.name = gfc_get_string (atom_string);
free (atom_string);
mio_integer (&flag);
case 2:
mio_ref_list (&e->ref);
break;
+ case 3:
+ break;
default:
require_atom (ATOM_STRING);
e->value.function.isym = gfc_find_function (atom_string);
mio_rparen ();
}
+static const mstring omp_declare_simd_clauses[] =
+{
+ minit ("INBRANCH", 0),
+ minit ("NOTINBRANCH", 1),
+ minit ("SIMDLEN", 2),
+ minit ("UNIFORM", 3),
+ minit ("LINEAR", 4),
+ minit ("ALIGNED", 5),
+ minit (NULL, -1)
+};
+
+/* Handle !$omp declare simd. */
+
+static void
+mio_omp_declare_simd (gfc_namespace *ns, gfc_omp_declare_simd **odsp)
+{
+ if (iomode == IO_OUTPUT)
+ {
+ if (*odsp == NULL)
+ return;
+ }
+ else if (peek_atom () != ATOM_LPAREN)
+ return;
+
+ gfc_omp_declare_simd *ods = *odsp;
+
+ mio_lparen ();
+ if (iomode == IO_OUTPUT)
+ {
+ write_atom (ATOM_NAME, "OMP_DECLARE_SIMD");
+ if (ods->clauses)
+ {
+ gfc_omp_namelist *n;
+
+ if (ods->clauses->inbranch)
+ mio_name (0, omp_declare_simd_clauses);
+ if (ods->clauses->notinbranch)
+ mio_name (1, omp_declare_simd_clauses);
+ if (ods->clauses->simdlen_expr)
+ {
+ mio_name (2, omp_declare_simd_clauses);
+ mio_expr (&ods->clauses->simdlen_expr);
+ }
+ for (n = ods->clauses->lists[OMP_LIST_UNIFORM]; n; n = n->next)
+ {
+ mio_name (3, omp_declare_simd_clauses);
+ mio_symbol_ref (&n->sym);
+ }
+ for (n = ods->clauses->lists[OMP_LIST_LINEAR]; n; n = n->next)
+ {
+ mio_name (4, omp_declare_simd_clauses);
+ mio_symbol_ref (&n->sym);
+ mio_expr (&n->expr);
+ }
+ for (n = ods->clauses->lists[OMP_LIST_ALIGNED]; n; n = n->next)
+ {
+ mio_name (5, omp_declare_simd_clauses);
+ mio_symbol_ref (&n->sym);
+ mio_expr (&n->expr);
+ }
+ }
+ }
+ else
+ {
+ gfc_omp_namelist **ptrs[3] = { NULL, NULL, NULL };
+
+ require_atom (ATOM_NAME);
+ *odsp = ods = gfc_get_omp_declare_simd ();
+ ods->where = gfc_current_locus;
+ ods->proc_name = ns->proc_name;
+ if (peek_atom () == ATOM_NAME)
+ {
+ ods->clauses = gfc_get_omp_clauses ();
+ ptrs[0] = &ods->clauses->lists[OMP_LIST_UNIFORM];
+ ptrs[1] = &ods->clauses->lists[OMP_LIST_LINEAR];
+ ptrs[2] = &ods->clauses->lists[OMP_LIST_ALIGNED];
+ }
+ while (peek_atom () == ATOM_NAME)
+ {
+ gfc_omp_namelist *n;
+ int t = mio_name (0, omp_declare_simd_clauses);
+
+ switch (t)
+ {
+ case 0: ods->clauses->inbranch = true; break;
+ case 1: ods->clauses->notinbranch = true; break;
+ case 2: mio_expr (&ods->clauses->simdlen_expr); break;
+ case 3:
+ case 4:
+ case 5:
+ *ptrs[t - 3] = n = gfc_get_omp_namelist ();
+ ptrs[t - 3] = &n->next;
+ mio_symbol_ref (&n->sym);
+ if (t != 3)
+ mio_expr (&n->expr);
+ break;
+ }
+ }
+ }
+
+ mio_omp_declare_simd (ns, &ods->next);
+
+ mio_rparen ();
+}
+
+
+static const mstring omp_declare_reduction_stmt[] =
+{
+ minit ("ASSIGN", 0),
+ minit ("CALL", 1),
+ minit (NULL, -1)
+};
+
+
+static void
+mio_omp_udr_expr (gfc_omp_udr *udr, gfc_symbol **sym1, gfc_symbol **sym2,
+ gfc_namespace *ns, bool is_initializer)
+{
+ if (iomode == IO_OUTPUT)
+ {
+ if ((*sym1)->module == NULL)
+ {
+ (*sym1)->module = module_name;
+ (*sym2)->module = module_name;
+ }
+ mio_symbol_ref (sym1);
+ mio_symbol_ref (sym2);
+ if (ns->code->op == EXEC_ASSIGN)
+ {
+ mio_name (0, omp_declare_reduction_stmt);
+ mio_expr (&ns->code->expr1);
+ mio_expr (&ns->code->expr2);
+ }
+ else
+ {
+ int flag;
+ mio_name (1, omp_declare_reduction_stmt);
+ mio_symtree_ref (&ns->code->symtree);
+ mio_actual_arglist (&ns->code->ext.actual);
+
+ flag = ns->code->resolved_isym != NULL;
+ mio_integer (&flag);
+ if (flag)
+ write_atom (ATOM_STRING, ns->code->resolved_isym->name);
+ else
+ mio_symbol_ref (&ns->code->resolved_sym);
+ }
+ }
+ else
+ {
+ pointer_info *p1 = mio_symbol_ref (sym1);
+ pointer_info *p2 = mio_symbol_ref (sym2);
+ gfc_symbol *sym;
+ gcc_assert (p1->u.rsym.ns == p2->u.rsym.ns);
+ gcc_assert (p1->u.rsym.sym == NULL);
+ /* Add hidden symbols to the symtree. */
+ pointer_info *q = get_integer (p1->u.rsym.ns);
+ q->u.pointer = (void *) ns;
+ sym = gfc_new_symbol (is_initializer ? "omp_priv" : "omp_out", ns);
+ sym->ts = udr->ts;
+ sym->module = gfc_get_string (p1->u.rsym.module);
+ associate_integer_pointer (p1, sym);
+ sym->attr.omp_udr_artificial_var = 1;
+ gcc_assert (p2->u.rsym.sym == NULL);
+ sym = gfc_new_symbol (is_initializer ? "omp_orig" : "omp_in", ns);
+ sym->ts = udr->ts;
+ sym->module = gfc_get_string (p2->u.rsym.module);
+ associate_integer_pointer (p2, sym);
+ sym->attr.omp_udr_artificial_var = 1;
+ if (mio_name (0, omp_declare_reduction_stmt) == 0)
+ {
+ ns->code = gfc_get_code (EXEC_ASSIGN);
+ mio_expr (&ns->code->expr1);
+ mio_expr (&ns->code->expr2);
+ }
+ else
+ {
+ int flag;
+ ns->code = gfc_get_code (EXEC_CALL);
+ mio_symtree_ref (&ns->code->symtree);
+ mio_actual_arglist (&ns->code->ext.actual);
+
+ mio_integer (&flag);
+ if (flag)
+ {
+ require_atom (ATOM_STRING);
+ ns->code->resolved_isym = gfc_find_subroutine (atom_string);
+ free (atom_string);
+ }
+ else
+ mio_symbol_ref (&ns->code->resolved_sym);
+ }
+ ns->code->loc = gfc_current_locus;
+ ns->omp_udr_ns = 1;
+ }
+}
+
/* Unlike most other routines, the address of the symbol node is already
fixed on input and the name/module has already been filled in.
if (sym->attr.flavor == FL_DERIVED)
mio_integer (&(sym->hash_value));
+ if (sym->formal_ns
+ && sym->formal_ns->proc_name == sym
+ && sym->formal_ns->entries == NULL)
+ {
+ if (module_omp4)
+ mio_omp_declare_simd (sym->formal_ns,
+ &sym->formal_ns->omp_declare_simd);
+ else if (iomode == IO_OUTPUT)
+ gcc_assert (sym->formal_ns->omp_declare_simd == NULL);
+ }
+
mio_rparen ();
}
}
+/* This function loads OpenMP user defined reductions. */
+static void
+load_omp_udrs (void)
+{
+ mio_lparen ();
+ while (peek_atom () != ATOM_RPAREN)
+ {
+ const char *name, *newname;
+ char *altname;
+ gfc_typespec ts;
+ gfc_symtree *st;
+ gfc_omp_reduction_op rop = OMP_REDUCTION_USER;
+
+ mio_lparen ();
+ mio_pool_string (&name);
+ mio_typespec (&ts);
+ if (strncmp (name, "operator ", sizeof ("operator ") - 1) == 0)
+ {
+ const char *p = name + sizeof ("operator ") - 1;
+ if (strcmp (p, "+") == 0)
+ rop = OMP_REDUCTION_PLUS;
+ else if (strcmp (p, "*") == 0)
+ rop = OMP_REDUCTION_TIMES;
+ else if (strcmp (p, "-") == 0)
+ rop = OMP_REDUCTION_MINUS;
+ else if (strcmp (p, ".and.") == 0)
+ rop = OMP_REDUCTION_AND;
+ else if (strcmp (p, ".or.") == 0)
+ rop = OMP_REDUCTION_OR;
+ else if (strcmp (p, ".eqv.") == 0)
+ rop = OMP_REDUCTION_EQV;
+ else if (strcmp (p, ".neqv.") == 0)
+ rop = OMP_REDUCTION_NEQV;
+ }
+ altname = NULL;
+ if (rop == OMP_REDUCTION_USER && name[0] == '.')
+ {
+ size_t len = strlen (name + 1);
+ altname = XALLOCAVEC (char, len);
+ gcc_assert (name[len] == '.');
+ memcpy (altname, name + 1, len - 1);
+ altname[len - 1] = '\0';
+ }
+ newname = name;
+ if (rop == OMP_REDUCTION_USER)
+ newname = find_use_name (altname ? altname : name, !!altname);
+ else if (only_flag && find_use_operator ((gfc_intrinsic_op) rop) == NULL)
+ newname = NULL;
+ if (newname == NULL)
+ {
+ skip_list (1);
+ continue;
+ }
+ if (altname && newname != altname)
+ {
+ size_t len = strlen (newname);
+ altname = XALLOCAVEC (char, len + 3);
+ altname[0] = '.';
+ memcpy (altname + 1, newname, len);
+ altname[len + 1] = '.';
+ altname[len + 2] = '\0';
+ name = gfc_get_string (altname);
+ }
+ st = gfc_find_symtree (gfc_current_ns->omp_udr_root, name);
+ gfc_omp_udr *udr = gfc_omp_udr_find (st, &ts);
+ if (udr)
+ {
+ require_atom (ATOM_INTEGER);
+ pointer_info *p = get_integer (atom_int);
+ if (strcmp (p->u.rsym.module, udr->omp_out->module))
+ {
+ gfc_error ("Ambiguous !$OMP DECLARE REDUCTION from "
+ "module %s at %L",
+ p->u.rsym.module, &gfc_current_locus);
+ gfc_error ("Previous !$OMP DECLARE REDUCTION from module "
+ "%s at %L",
+ udr->omp_out->module, &udr->where);
+ }
+ skip_list (1);
+ continue;
+ }
+ udr = gfc_get_omp_udr ();
+ udr->name = name;
+ udr->rop = rop;
+ udr->ts = ts;
+ udr->where = gfc_current_locus;
+ udr->combiner_ns = gfc_get_namespace (gfc_current_ns, 1);
+ udr->combiner_ns->proc_name = gfc_current_ns->proc_name;
+ mio_omp_udr_expr (udr, &udr->omp_out, &udr->omp_in, udr->combiner_ns,
+ false);
+ if (peek_atom () != ATOM_RPAREN)
+ {
+ udr->initializer_ns = gfc_get_namespace (gfc_current_ns, 1);
+ udr->initializer_ns->proc_name = gfc_current_ns->proc_name;
+ mio_omp_udr_expr (udr, &udr->omp_priv, &udr->omp_orig,
+ udr->initializer_ns, true);
+ }
+ if (st)
+ {
+ udr->next = st->n.omp_udr;
+ st->n.omp_udr = udr;
+ }
+ else
+ {
+ st = gfc_new_symtree (&gfc_current_ns->omp_udr_root, name);
+ st->n.omp_udr = udr;
+ }
+ mio_rparen ();
+ }
+ mio_rparen ();
+}
+
+
/* Recursive function to traverse the pointer_info tree and load a
needed symbol. We return nonzero if we load a symbol and stop the
traversal, because the act of loading can alter the tree. */
static void
read_module (void)
{
- module_locus operator_interfaces, user_operators, extensions;
+ module_locus operator_interfaces, user_operators, extensions, omp_udrs;
const char *p;
char name[GFC_MAX_SYMBOL_LEN + 1];
int i;
get_module_locus (&extensions);
skip_list ();
+ /* Skip OpenMP UDRs. */
+ get_module_locus (&omp_udrs);
+ if (module_omp4)
+ skip_list ();
+
mio_lparen ();
/* Create the fixup nodes for all the symbols. */
load_commons ();
load_equiv ();
+ if (module_omp4)
+ {
+ /* Load OpenMP user defined reductions. */
+ set_module_locus (&omp_udrs);
+ load_omp_udrs ();
+ }
+
/* At this point, we read those symbols that are needed but haven't
been loaded yet. If one symbol requires another, the other gets
marked as NEEDED if its previous state was UNUSED. */
}
+static void
+write_omp_udr (gfc_omp_udr *udr)
+{
+ switch (udr->rop)
+ {
+ case OMP_REDUCTION_USER:
+ /* Non-operators can't be used outside of the module. */
+ if (udr->name[0] != '.')
+ return;
+ else
+ {
+ gfc_symtree *st;
+ size_t len = strlen (udr->name + 1);
+ char *name = XALLOCAVEC (char, len);
+ memcpy (name, udr->name, len - 1);
+ name[len - 1] = '\0';
+ st = gfc_find_symtree (gfc_current_ns->uop_root, name);
+ /* If corresponding user operator is private, don't write
+ the UDR. */
+ if (st != NULL)
+ {
+ gfc_user_op *uop = st->n.uop;
+ if (!check_access (uop->access, uop->ns->default_access))
+ return;
+ }
+ }
+ break;
+ case OMP_REDUCTION_PLUS:
+ case OMP_REDUCTION_MINUS:
+ case OMP_REDUCTION_TIMES:
+ case OMP_REDUCTION_AND:
+ case OMP_REDUCTION_OR:
+ case OMP_REDUCTION_EQV:
+ case OMP_REDUCTION_NEQV:
+ /* If corresponding operator is private, don't write the UDR. */
+ if (!check_access (gfc_current_ns->operator_access[udr->rop],
+ gfc_current_ns->default_access))
+ return;
+ break;
+ default:
+ break;
+ }
+ if (udr->ts.type == BT_DERIVED || udr->ts.type == BT_CLASS)
+ {
+ /* If derived type is private, don't write the UDR. */
+ if (!gfc_check_symbol_access (udr->ts.u.derived))
+ return;
+ }
+
+ mio_lparen ();
+ mio_pool_string (&udr->name);
+ mio_typespec (&udr->ts);
+ mio_omp_udr_expr (udr, &udr->omp_out, &udr->omp_in, udr->combiner_ns, false);
+ if (udr->initializer_ns)
+ mio_omp_udr_expr (udr, &udr->omp_priv, &udr->omp_orig,
+ udr->initializer_ns, true);
+ mio_rparen ();
+}
+
+
+static void
+write_omp_udrs (gfc_symtree *st)
+{
+ if (st == NULL)
+ return;
+
+ write_omp_udrs (st->left);
+ gfc_omp_udr *udr;
+ for (udr = st->n.omp_udr; udr; udr = udr->next)
+ write_omp_udr (udr);
+ write_omp_udrs (st->right);
+}
+
+
/* Type for the temporary tree used when writing secondary symbols. */
struct sorted_pointer_info
write_char ('\n');
write_char ('\n');
+ if (module_omp4)
+ {
+ mio_lparen ();
+ write_omp_udrs (gfc_current_ns->omp_udr_root);
+ mio_rparen ();
+ write_char ('\n');
+ write_char ('\n');
+ }
+ else
+ gcc_assert (gfc_current_ns->omp_udr_root == NULL);
+
/* Write symbol information. First we traverse all symbols in the
primary namespace, writing those that need to be written.
Sometimes writing one symbol will cause another to need to be
}
+/* Set module_omp4 if any symbol has !$OMP DECLARE SIMD directives. */
+
+static void
+find_omp_declare_simd (gfc_symtree *st)
+{
+ gfc_symbol *sym = st->n.sym;
+ if (sym->formal_ns
+ && sym->formal_ns->proc_name == sym
+ && sym->formal_ns->omp_declare_simd)
+ module_omp4 = true;
+ else if (sym->attr.omp_declare_target)
+ module_omp4 = true;
+}
+
+
/* Given module, dump it to disk. If there was an error while
processing the module, dump_flag will be set to zero and we delete
the module file, even if it was already there. */
if (gfc_cpp_makedep ())
gfc_cpp_add_target (filename);
+ module_omp4 = false;
+ if (gfc_current_ns->omp_udr_root)
+ module_omp4 = true;
+ else
+ gfc_traverse_symtree (gfc_current_ns->sym_root, find_omp_declare_simd);
+
/* Write the module to the temporary file. */
module_fp = gzopen (filename_tmp, "w");
if (module_fp == NULL)
filename_tmp, xstrerror (errno));
gzprintf (module_fp, "GFORTRAN module version '%s' created from %s\n",
- MOD_VERSION, gfc_source_file);
+ module_omp4 ? MOD_VERSION_OMP4 : MOD_VERSION, gfc_source_file);
/* Write the module itself. */
iomode = IO_OUTPUT;
read_module_to_tmpbuf ();
gzclose (module_fp);
+ module_omp4 = false;
+
/* Skip the first line of the module, after checking that this is
a gfortran module file. */
line = 0;
if (strcmp (atom_name, " version") != 0
|| module_char () != ' '
|| parse_atom () != ATOM_STRING
- || strcmp (atom_string, MOD_VERSION))
+ || (strcmp (atom_string, MOD_VERSION)
+ && strcmp (atom_string, MOD_VERSION_OMP4)))
gfc_fatal_error ("Cannot read module file '%s' opened at %C,"
" because it was created by a different"
" version of GNU Fortran", filename);
+ if (strcmp (atom_string, MOD_VERSION_OMP4) == 0)
+ module_omp4 = true;
+
free (atom_string);
}
#include "coretypes.h"
#include "flags.h"
#include "gfortran.h"
+#include "arith.h"
#include "match.h"
#include "parse.h"
#include "pointer-set.h"
gfc_free_expr (c->final_expr);
gfc_free_expr (c->num_threads);
gfc_free_expr (c->chunk_size);
+ gfc_free_expr (c->safelen_expr);
+ gfc_free_expr (c->simdlen_expr);
+ gfc_free_expr (c->num_teams);
+ gfc_free_expr (c->device);
+ gfc_free_expr (c->thread_limit);
+ gfc_free_expr (c->dist_chunk_size);
for (i = 0; i < OMP_LIST_NUM; i++)
- gfc_free_namelist (c->lists[i]);
+ gfc_free_omp_namelist (c->lists[i]);
free (c);
}
+/* Free an !$omp declare simd construct list. */
+
+void
+gfc_free_omp_declare_simd (gfc_omp_declare_simd *ods)
+{
+ if (ods)
+ {
+ gfc_free_omp_clauses (ods->clauses);
+ free (ods);
+ }
+}
+
+void
+gfc_free_omp_declare_simd_list (gfc_omp_declare_simd *list)
+{
+ while (list)
+ {
+ gfc_omp_declare_simd *current = list;
+ list = list->next;
+ gfc_free_omp_declare_simd (current);
+ }
+}
+
+/* Free an !$omp declare reduction. */
+
+void
+gfc_free_omp_udr (gfc_omp_udr *omp_udr)
+{
+ if (omp_udr)
+ {
+ gfc_free_omp_udr (omp_udr->next);
+ gfc_free_namespace (omp_udr->combiner_ns);
+ if (omp_udr->initializer_ns)
+ gfc_free_namespace (omp_udr->initializer_ns);
+ free (omp_udr);
+ }
+}
+
+
+static gfc_omp_udr *
+gfc_find_omp_udr (gfc_namespace *ns, const char *name, gfc_typespec *ts)
+{
+ gfc_symtree *st;
+
+ if (ns == NULL)
+ ns = gfc_current_ns;
+ do
+ {
+ gfc_omp_udr *omp_udr;
+
+ st = gfc_find_symtree (ns->omp_udr_root, name);
+ if (st != NULL)
+ for (omp_udr = st->n.omp_udr; omp_udr; omp_udr = omp_udr->next)
+ if (ts == NULL)
+ return omp_udr;
+ else if (gfc_compare_types (&omp_udr->ts, ts))
+ {
+ if (ts->type == BT_CHARACTER)
+ {
+ if (omp_udr->ts.u.cl->length == NULL)
+ return omp_udr;
+ if (ts->u.cl->length == NULL)
+ continue;
+ if (gfc_compare_expr (omp_udr->ts.u.cl->length,
+ ts->u.cl->length,
+ INTRINSIC_EQ) != 0)
+ continue;
+ }
+ return omp_udr;
+ }
+
+ /* Don't escape an interface block. */
+ if (ns && !ns->has_import_set
+ && ns->proc_name && ns->proc_name->attr.if_source == IFSRC_IFBODY)
+ break;
+
+ ns = ns->parent;
+ }
+ while (ns != NULL);
+
+ return NULL;
+}
+
+
/* Match a variable/common block list and construct a namelist from it. */
static match
-gfc_match_omp_variable_list (const char *str, gfc_namelist **list,
- bool allow_common)
+gfc_match_omp_variable_list (const char *str, gfc_omp_namelist **list,
+ bool allow_common, bool *end_colon = NULL,
+ gfc_omp_namelist ***headp = NULL,
+ bool allow_sections = false)
{
- gfc_namelist *head, *tail, *p;
- locus old_loc;
+ gfc_omp_namelist *head, *tail, *p;
+ locus old_loc, cur_loc;
char n[GFC_MAX_SYMBOL_LEN+1];
gfc_symbol *sym;
match m;
for (;;)
{
+ cur_loc = gfc_current_locus;
m = gfc_match_symbol (&sym, 1);
switch (m)
{
case MATCH_YES:
+ gfc_expr *expr;
+ expr = NULL;
+ if (allow_sections && gfc_peek_ascii_char () == '(')
+ {
+ gfc_current_locus = cur_loc;
+ m = gfc_match_variable (&expr, 0);
+ switch (m)
+ {
+ case MATCH_ERROR:
+ goto cleanup;
+ case MATCH_NO:
+ goto syntax;
+ default:
+ break;
+ }
+ }
gfc_set_sym_referenced (sym);
- p = gfc_get_namelist ();
+ p = gfc_get_omp_namelist ();
if (head == NULL)
head = tail = p;
else
tail = tail->next;
}
tail->sym = sym;
+ tail->expr = expr;
goto next_item;
case MATCH_NO:
break;
for (sym = st->n.common->head; sym; sym = sym->common_next)
{
gfc_set_sym_referenced (sym);
- p = gfc_get_namelist ();
+ p = gfc_get_omp_namelist ();
if (head == NULL)
head = tail = p;
else
}
next_item:
+ if (end_colon && gfc_match_char (':') == MATCH_YES)
+ {
+ *end_colon = true;
+ break;
+ }
if (gfc_match_char (')') == MATCH_YES)
break;
if (gfc_match_char (',') != MATCH_YES)
list = &(*list)->next;
*list = head;
+ if (headp)
+ *headp = list;
return MATCH_YES;
syntax:
gfc_error ("Syntax error in OpenMP variable list at %C");
cleanup:
- gfc_free_namelist (head);
+ gfc_free_omp_namelist (head);
gfc_current_locus = old_loc;
return MATCH_ERROR;
}
-#define OMP_CLAUSE_PRIVATE (1 << 0)
-#define OMP_CLAUSE_FIRSTPRIVATE (1 << 1)
-#define OMP_CLAUSE_LASTPRIVATE (1 << 2)
-#define OMP_CLAUSE_COPYPRIVATE (1 << 3)
-#define OMP_CLAUSE_SHARED (1 << 4)
-#define OMP_CLAUSE_COPYIN (1 << 5)
-#define OMP_CLAUSE_REDUCTION (1 << 6)
-#define OMP_CLAUSE_IF (1 << 7)
-#define OMP_CLAUSE_NUM_THREADS (1 << 8)
-#define OMP_CLAUSE_SCHEDULE (1 << 9)
-#define OMP_CLAUSE_DEFAULT (1 << 10)
-#define OMP_CLAUSE_ORDERED (1 << 11)
-#define OMP_CLAUSE_COLLAPSE (1 << 12)
-#define OMP_CLAUSE_UNTIED (1 << 13)
-#define OMP_CLAUSE_FINAL (1 << 14)
-#define OMP_CLAUSE_MERGEABLE (1 << 15)
+#define OMP_CLAUSE_PRIVATE (1U << 0)
+#define OMP_CLAUSE_FIRSTPRIVATE (1U << 1)
+#define OMP_CLAUSE_LASTPRIVATE (1U << 2)
+#define OMP_CLAUSE_COPYPRIVATE (1U << 3)
+#define OMP_CLAUSE_SHARED (1U << 4)
+#define OMP_CLAUSE_COPYIN (1U << 5)
+#define OMP_CLAUSE_REDUCTION (1U << 6)
+#define OMP_CLAUSE_IF (1U << 7)
+#define OMP_CLAUSE_NUM_THREADS (1U << 8)
+#define OMP_CLAUSE_SCHEDULE (1U << 9)
+#define OMP_CLAUSE_DEFAULT (1U << 10)
+#define OMP_CLAUSE_ORDERED (1U << 11)
+#define OMP_CLAUSE_COLLAPSE (1U << 12)
+#define OMP_CLAUSE_UNTIED (1U << 13)
+#define OMP_CLAUSE_FINAL (1U << 14)
+#define OMP_CLAUSE_MERGEABLE (1U << 15)
+#define OMP_CLAUSE_ALIGNED (1U << 16)
+#define OMP_CLAUSE_DEPEND (1U << 17)
+#define OMP_CLAUSE_INBRANCH (1U << 18)
+#define OMP_CLAUSE_LINEAR (1U << 19)
+#define OMP_CLAUSE_NOTINBRANCH (1U << 20)
+#define OMP_CLAUSE_PROC_BIND (1U << 21)
+#define OMP_CLAUSE_SAFELEN (1U << 22)
+#define OMP_CLAUSE_SIMDLEN (1U << 23)
+#define OMP_CLAUSE_UNIFORM (1U << 24)
+#define OMP_CLAUSE_DEVICE (1U << 25)
+#define OMP_CLAUSE_MAP (1U << 26)
+#define OMP_CLAUSE_TO (1U << 27)
+#define OMP_CLAUSE_FROM (1U << 28)
+#define OMP_CLAUSE_NUM_TEAMS (1U << 29)
+#define OMP_CLAUSE_THREAD_LIMIT (1U << 30)
+#define OMP_CLAUSE_DIST_SCHEDULE (1U << 31)
/* Match OpenMP directive clauses. MASK is a bitmask of
clauses that are allowed for a particular directive. */
static match
-gfc_match_omp_clauses (gfc_omp_clauses **cp, int mask)
+gfc_match_omp_clauses (gfc_omp_clauses **cp, unsigned int mask,
+ bool first = true, bool needs_space = true)
{
gfc_omp_clauses *c = gfc_get_omp_clauses ();
locus old_loc;
- bool needs_space = true, first = true;
*cp = NULL;
while (1)
if ((mask & OMP_CLAUSE_REDUCTION)
&& gfc_match ("reduction ( ") == MATCH_YES)
{
- int reduction = OMP_LIST_NUM;
- char buffer[GFC_MAX_SYMBOL_LEN + 1];
+ gfc_omp_reduction_op rop = OMP_REDUCTION_NONE;
+ char buffer[GFC_MAX_SYMBOL_LEN + 3];
if (gfc_match_char ('+') == MATCH_YES)
- reduction = OMP_LIST_PLUS;
+ rop = OMP_REDUCTION_PLUS;
else if (gfc_match_char ('*') == MATCH_YES)
- reduction = OMP_LIST_MULT;
+ rop = OMP_REDUCTION_TIMES;
else if (gfc_match_char ('-') == MATCH_YES)
- reduction = OMP_LIST_SUB;
+ rop = OMP_REDUCTION_MINUS;
else if (gfc_match (".and.") == MATCH_YES)
- reduction = OMP_LIST_AND;
+ rop = OMP_REDUCTION_AND;
else if (gfc_match (".or.") == MATCH_YES)
- reduction = OMP_LIST_OR;
+ rop = OMP_REDUCTION_OR;
else if (gfc_match (".eqv.") == MATCH_YES)
- reduction = OMP_LIST_EQV;
+ rop = OMP_REDUCTION_EQV;
else if (gfc_match (".neqv.") == MATCH_YES)
- reduction = OMP_LIST_NEQV;
+ rop = OMP_REDUCTION_NEQV;
+ if (rop != OMP_REDUCTION_NONE)
+ snprintf (buffer, sizeof buffer,
+ "operator %s", gfc_op2string ((gfc_intrinsic_op) rop));
+ else if (gfc_match_defined_op_name (buffer + 1, 1) == MATCH_YES)
+ {
+ buffer[0] = '.';
+ strcat (buffer, ".");
+ }
else if (gfc_match_name (buffer) == MATCH_YES)
{
gfc_symbol *sym;
|| sym->attr.if_source != IFSRC_UNKNOWN
|| sym == sym->ns->proc_name)
{
- gfc_error_now ("%s is not INTRINSIC procedure name "
- "at %C", buffer);
sym = NULL;
+ n = NULL;
}
else
n = sym->name;
}
- if (strcmp (n, "max") == 0)
- reduction = OMP_LIST_MAX;
+ if (n == NULL)
+ rop = OMP_REDUCTION_NONE;
+ else if (strcmp (n, "max") == 0)
+ rop = OMP_REDUCTION_MAX;
else if (strcmp (n, "min") == 0)
- reduction = OMP_LIST_MIN;
+ rop = OMP_REDUCTION_MIN;
else if (strcmp (n, "iand") == 0)
- reduction = OMP_LIST_IAND;
+ rop = OMP_REDUCTION_IAND;
else if (strcmp (n, "ior") == 0)
- reduction = OMP_LIST_IOR;
+ rop = OMP_REDUCTION_IOR;
else if (strcmp (n, "ieor") == 0)
- reduction = OMP_LIST_IEOR;
- if (reduction != OMP_LIST_NUM
+ rop = OMP_REDUCTION_IEOR;
+ if (rop != OMP_REDUCTION_NONE
&& sym != NULL
&& ! sym->attr.intrinsic
&& ! sym->attr.use_assoc
&& ((sym->attr.flavor == FL_UNKNOWN
- && !gfc_add_flavor (&sym->attr, FL_PROCEDURE, sym->name, NULL))
+ && !gfc_add_flavor (&sym->attr, FL_PROCEDURE,
+ sym->name, NULL))
|| !gfc_add_intrinsic (&sym->attr, NULL)))
+ rop = OMP_REDUCTION_NONE;
+ }
+ gfc_omp_udr *udr = gfc_find_omp_udr (gfc_current_ns, buffer, NULL);
+ gfc_omp_namelist **head = NULL;
+ if (rop == OMP_REDUCTION_NONE && udr)
+ rop = OMP_REDUCTION_USER;
+
+ if (gfc_match_omp_variable_list (" :",
+ &c->lists[OMP_LIST_REDUCTION],
+ false, NULL, &head) == MATCH_YES)
+ {
+ gfc_omp_namelist *n;
+ if (rop == OMP_REDUCTION_NONE)
{
- gfc_free_omp_clauses (c);
- return MATCH_ERROR;
+ n = *head;
+ *head = NULL;
+ gfc_error_now ("!$OMP DECLARE REDUCTION %s not found "
+ "at %L", buffer, &old_loc);
+ gfc_free_omp_namelist (n);
}
+ else
+ for (n = *head; n; n = n->next)
+ {
+ n->u.reduction_op = rop;
+ if (udr)
+ {
+ n->udr = gfc_get_omp_namelist_udr ();
+ n->udr->udr = udr;
+ }
+ }
+ continue;
}
- if (reduction != OMP_LIST_NUM
- && gfc_match_omp_variable_list (" :", &c->lists[reduction],
- false)
- == MATCH_YES)
- continue;
else
gfc_current_locus = old_loc;
}
continue;
}
}
+ if ((mask & OMP_CLAUSE_INBRANCH) && !c->inbranch && !c->notinbranch
+ && gfc_match ("inbranch") == MATCH_YES)
+ {
+ c->inbranch = needs_space = true;
+ continue;
+ }
+ if ((mask & OMP_CLAUSE_NOTINBRANCH) && !c->notinbranch && !c->inbranch
+ && gfc_match ("notinbranch") == MATCH_YES)
+ {
+ c->notinbranch = needs_space = true;
+ continue;
+ }
+ if ((mask & OMP_CLAUSE_PROC_BIND)
+ && c->proc_bind == OMP_PROC_BIND_UNKNOWN)
+ {
+ if (gfc_match ("proc_bind ( master )") == MATCH_YES)
+ c->proc_bind = OMP_PROC_BIND_MASTER;
+ else if (gfc_match ("proc_bind ( spread )") == MATCH_YES)
+ c->proc_bind = OMP_PROC_BIND_SPREAD;
+ else if (gfc_match ("proc_bind ( close )") == MATCH_YES)
+ c->proc_bind = OMP_PROC_BIND_CLOSE;
+ if (c->proc_bind != OMP_PROC_BIND_UNKNOWN)
+ continue;
+ }
+ if ((mask & OMP_CLAUSE_SAFELEN) && c->safelen_expr == NULL
+ && gfc_match ("safelen ( %e )", &c->safelen_expr) == MATCH_YES)
+ continue;
+ if ((mask & OMP_CLAUSE_SIMDLEN) && c->simdlen_expr == NULL
+ && gfc_match ("simdlen ( %e )", &c->simdlen_expr) == MATCH_YES)
+ continue;
+ if ((mask & OMP_CLAUSE_UNIFORM)
+ && gfc_match_omp_variable_list ("uniform (",
+ &c->lists[OMP_LIST_UNIFORM], false)
+ == MATCH_YES)
+ continue;
+ bool end_colon = false;
+ gfc_omp_namelist **head = NULL;
+ old_loc = gfc_current_locus;
+ if ((mask & OMP_CLAUSE_ALIGNED)
+ && gfc_match_omp_variable_list ("aligned (",
+ &c->lists[OMP_LIST_ALIGNED], false,
+ &end_colon, &head)
+ == MATCH_YES)
+ {
+ gfc_expr *alignment = NULL;
+ gfc_omp_namelist *n;
+
+ if (end_colon
+ && gfc_match (" %e )", &alignment) != MATCH_YES)
+ {
+ gfc_free_omp_namelist (*head);
+ gfc_current_locus = old_loc;
+ *head = NULL;
+ break;
+ }
+ for (n = *head; n; n = n->next)
+ if (n->next && alignment)
+ n->expr = gfc_copy_expr (alignment);
+ else
+ n->expr = alignment;
+ continue;
+ }
+ end_colon = false;
+ head = NULL;
+ old_loc = gfc_current_locus;
+ if ((mask & OMP_CLAUSE_LINEAR)
+ && gfc_match_omp_variable_list ("linear (",
+ &c->lists[OMP_LIST_LINEAR], false,
+ &end_colon, &head)
+ == MATCH_YES)
+ {
+ gfc_expr *step = NULL;
+
+ if (end_colon
+ && gfc_match (" %e )", &step) != MATCH_YES)
+ {
+ gfc_free_omp_namelist (*head);
+ gfc_current_locus = old_loc;
+ *head = NULL;
+ break;
+ }
+ else if (!end_colon)
+ {
+ step = gfc_get_constant_expr (BT_INTEGER,
+ gfc_default_integer_kind,
+ &old_loc);
+ mpz_set_si (step->value.integer, 1);
+ }
+ (*head)->expr = step;
+ continue;
+ }
+ if ((mask & OMP_CLAUSE_DEPEND)
+ && gfc_match ("depend ( ") == MATCH_YES)
+ {
+ match m = MATCH_YES;
+ gfc_omp_depend_op depend_op = OMP_DEPEND_OUT;
+ if (gfc_match ("inout") == MATCH_YES)
+ depend_op = OMP_DEPEND_INOUT;
+ else if (gfc_match ("in") == MATCH_YES)
+ depend_op = OMP_DEPEND_IN;
+ else if (gfc_match ("out") == MATCH_YES)
+ depend_op = OMP_DEPEND_OUT;
+ else
+ m = MATCH_NO;
+ head = NULL;
+ if (m == MATCH_YES
+ && gfc_match_omp_variable_list (" : ",
+ &c->lists[OMP_LIST_DEPEND],
+ false, NULL, &head, true)
+ == MATCH_YES)
+ {
+ gfc_omp_namelist *n;
+ for (n = *head; n; n = n->next)
+ n->u.depend_op = depend_op;
+ continue;
+ }
+ else
+ gfc_current_locus = old_loc;
+ }
+ if ((mask & OMP_CLAUSE_DIST_SCHEDULE)
+ && c->dist_sched_kind == OMP_SCHED_NONE
+ && gfc_match ("dist_schedule ( static") == MATCH_YES)
+ {
+ match m = MATCH_NO;
+ c->dist_sched_kind = OMP_SCHED_STATIC;
+ m = gfc_match (" , %e )", &c->dist_chunk_size);
+ if (m != MATCH_YES)
+ m = gfc_match_char (')');
+ if (m != MATCH_YES)
+ {
+ c->dist_sched_kind = OMP_SCHED_NONE;
+ gfc_current_locus = old_loc;
+ }
+ else
+ continue;
+ }
+ if ((mask & OMP_CLAUSE_NUM_TEAMS) && c->num_teams == NULL
+ && gfc_match ("num_teams ( %e )", &c->num_teams) == MATCH_YES)
+ continue;
+ if ((mask & OMP_CLAUSE_DEVICE) && c->device == NULL
+ && gfc_match ("device ( %e )", &c->device) == MATCH_YES)
+ continue;
+ if ((mask & OMP_CLAUSE_THREAD_LIMIT) && c->thread_limit == NULL
+ && gfc_match ("thread_limit ( %e )", &c->thread_limit) == MATCH_YES)
+ continue;
+ if ((mask & OMP_CLAUSE_MAP)
+ && gfc_match ("map ( ") == MATCH_YES)
+ {
+ gfc_omp_map_op map_op = OMP_MAP_TOFROM;
+ if (gfc_match ("alloc : ") == MATCH_YES)
+ map_op = OMP_MAP_ALLOC;
+ else if (gfc_match ("tofrom : ") == MATCH_YES)
+ map_op = OMP_MAP_TOFROM;
+ else if (gfc_match ("to : ") == MATCH_YES)
+ map_op = OMP_MAP_TO;
+ else if (gfc_match ("from : ") == MATCH_YES)
+ map_op = OMP_MAP_FROM;
+ head = NULL;
+ if (gfc_match_omp_variable_list ("", &c->lists[OMP_LIST_MAP],
+ false, NULL, &head, true)
+ == MATCH_YES)
+ {
+ gfc_omp_namelist *n;
+ for (n = *head; n; n = n->next)
+ n->u.map_op = map_op;
+ continue;
+ }
+ else
+ gfc_current_locus = old_loc;
+ }
+ if ((mask & OMP_CLAUSE_TO)
+ && gfc_match_omp_variable_list ("to (",
+ &c->lists[OMP_LIST_TO], false,
+ NULL, &head, true)
+ == MATCH_YES)
+ continue;
+ if ((mask & OMP_CLAUSE_FROM)
+ && gfc_match_omp_variable_list ("from (",
+ &c->lists[OMP_LIST_FROM], false,
+ NULL, &head, true)
+ == MATCH_YES)
+ continue;
break;
}
#define OMP_PARALLEL_CLAUSES \
(OMP_CLAUSE_PRIVATE | OMP_CLAUSE_FIRSTPRIVATE | OMP_CLAUSE_SHARED \
| OMP_CLAUSE_COPYIN | OMP_CLAUSE_REDUCTION | OMP_CLAUSE_IF \
- | OMP_CLAUSE_NUM_THREADS | OMP_CLAUSE_DEFAULT)
+ | OMP_CLAUSE_NUM_THREADS | OMP_CLAUSE_DEFAULT | OMP_CLAUSE_PROC_BIND)
+#define OMP_DECLARE_SIMD_CLAUSES \
+ (OMP_CLAUSE_SIMDLEN | OMP_CLAUSE_LINEAR | OMP_CLAUSE_UNIFORM \
+ | OMP_CLAUSE_ALIGNED | OMP_CLAUSE_INBRANCH | OMP_CLAUSE_NOTINBRANCH)
#define OMP_DO_CLAUSES \
(OMP_CLAUSE_PRIVATE | OMP_CLAUSE_FIRSTPRIVATE \
| OMP_CLAUSE_LASTPRIVATE | OMP_CLAUSE_REDUCTION \
#define OMP_SECTIONS_CLAUSES \
(OMP_CLAUSE_PRIVATE | OMP_CLAUSE_FIRSTPRIVATE \
| OMP_CLAUSE_LASTPRIVATE | OMP_CLAUSE_REDUCTION)
+#define OMP_SIMD_CLAUSES \
+ (OMP_CLAUSE_PRIVATE | OMP_CLAUSE_LASTPRIVATE | OMP_CLAUSE_REDUCTION \
+ | OMP_CLAUSE_COLLAPSE | OMP_CLAUSE_SAFELEN | OMP_CLAUSE_LINEAR \
+ | OMP_CLAUSE_ALIGNED)
#define OMP_TASK_CLAUSES \
(OMP_CLAUSE_PRIVATE | OMP_CLAUSE_FIRSTPRIVATE | OMP_CLAUSE_SHARED \
| OMP_CLAUSE_IF | OMP_CLAUSE_DEFAULT | OMP_CLAUSE_UNTIED \
- | OMP_CLAUSE_FINAL | OMP_CLAUSE_MERGEABLE)
-
-match
-gfc_match_omp_parallel (void)
-{
- gfc_omp_clauses *c;
- if (gfc_match_omp_clauses (&c, OMP_PARALLEL_CLAUSES) != MATCH_YES)
- return MATCH_ERROR;
- new_st.op = EXEC_OMP_PARALLEL;
- new_st.ext.omp_clauses = c;
- return MATCH_YES;
-}
+ | OMP_CLAUSE_FINAL | OMP_CLAUSE_MERGEABLE | OMP_CLAUSE_DEPEND)
+#define OMP_TARGET_CLAUSES \
+ (OMP_CLAUSE_DEVICE | OMP_CLAUSE_MAP | OMP_CLAUSE_IF)
+#define OMP_TARGET_DATA_CLAUSES \
+ (OMP_CLAUSE_DEVICE | OMP_CLAUSE_MAP | OMP_CLAUSE_IF)
+#define OMP_TARGET_UPDATE_CLAUSES \
+ (OMP_CLAUSE_DEVICE | OMP_CLAUSE_IF | OMP_CLAUSE_TO | OMP_CLAUSE_FROM)
+#define OMP_TEAMS_CLAUSES \
+ (OMP_CLAUSE_NUM_TEAMS | OMP_CLAUSE_THREAD_LIMIT | OMP_CLAUSE_DEFAULT \
+ | OMP_CLAUSE_PRIVATE | OMP_CLAUSE_FIRSTPRIVATE | OMP_CLAUSE_SHARED \
+ | OMP_CLAUSE_REDUCTION)
+#define OMP_DISTRIBUTE_CLAUSES \
+ (OMP_CLAUSE_PRIVATE | OMP_CLAUSE_FIRSTPRIVATE | OMP_CLAUSE_COLLAPSE \
+ | OMP_CLAUSE_DIST_SCHEDULE)
-match
-gfc_match_omp_task (void)
+static match
+match_omp (gfc_exec_op op, unsigned int mask)
{
gfc_omp_clauses *c;
- if (gfc_match_omp_clauses (&c, OMP_TASK_CLAUSES) != MATCH_YES)
+ if (gfc_match_omp_clauses (&c, mask) != MATCH_YES)
return MATCH_ERROR;
- new_st.op = EXEC_OMP_TASK;
+ new_st.op = op;
new_st.ext.omp_clauses = c;
return MATCH_YES;
}
match
-gfc_match_omp_taskwait (void)
+gfc_match_omp_critical (void)
{
+ char n[GFC_MAX_SYMBOL_LEN+1];
+
+ if (gfc_match (" ( %n )", n) != MATCH_YES)
+ n[0] = '\0';
if (gfc_match_omp_eos () != MATCH_YES)
{
- gfc_error ("Unexpected junk after TASKWAIT clause at %C");
+ gfc_error ("Unexpected junk after $OMP CRITICAL statement at %C");
return MATCH_ERROR;
}
- new_st.op = EXEC_OMP_TASKWAIT;
- new_st.ext.omp_clauses = NULL;
+ new_st.op = EXEC_OMP_CRITICAL;
+ new_st.ext.omp_name = n[0] ? xstrdup (n) : NULL;
return MATCH_YES;
}
match
-gfc_match_omp_taskyield (void)
+gfc_match_omp_distribute (void)
{
- if (gfc_match_omp_eos () != MATCH_YES)
- {
- gfc_error ("Unexpected junk after TASKYIELD clause at %C");
- return MATCH_ERROR;
- }
- new_st.op = EXEC_OMP_TASKYIELD;
- new_st.ext.omp_clauses = NULL;
- return MATCH_YES;
+ return match_omp (EXEC_OMP_DISTRIBUTE, OMP_DISTRIBUTE_CLAUSES);
}
match
-gfc_match_omp_critical (void)
+gfc_match_omp_distribute_parallel_do (void)
{
- char n[GFC_MAX_SYMBOL_LEN+1];
+ return match_omp (EXEC_OMP_DISTRIBUTE_PARALLEL_DO,
+ OMP_DISTRIBUTE_CLAUSES | OMP_PARALLEL_CLAUSES
+ | OMP_DO_CLAUSES);
+}
- if (gfc_match (" ( %n )", n) != MATCH_YES)
- n[0] = '\0';
- if (gfc_match_omp_eos () != MATCH_YES)
- {
- gfc_error ("Unexpected junk after $OMP CRITICAL statement at %C");
- return MATCH_ERROR;
- }
- new_st.op = EXEC_OMP_CRITICAL;
- new_st.ext.omp_name = n[0] ? xstrdup (n) : NULL;
- return MATCH_YES;
+
+match
+gfc_match_omp_distribute_parallel_do_simd (void)
+{
+ return match_omp (EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD,
+ (OMP_DISTRIBUTE_CLAUSES | OMP_PARALLEL_CLAUSES
+ | OMP_DO_CLAUSES | OMP_SIMD_CLAUSES)
+ & ~OMP_CLAUSE_ORDERED);
+}
+
+
+match
+gfc_match_omp_distribute_simd (void)
+{
+ return match_omp (EXEC_OMP_DISTRIBUTE_SIMD,
+ OMP_DISTRIBUTE_CLAUSES | OMP_SIMD_CLAUSES);
}
match
gfc_match_omp_do (void)
{
- gfc_omp_clauses *c;
- if (gfc_match_omp_clauses (&c, OMP_DO_CLAUSES) != MATCH_YES)
- return MATCH_ERROR;
- new_st.op = EXEC_OMP_DO;
- new_st.ext.omp_clauses = c;
- return MATCH_YES;
+ return match_omp (EXEC_OMP_DO, OMP_DO_CLAUSES);
+}
+
+
+match
+gfc_match_omp_do_simd (void)
+{
+ return match_omp (EXEC_OMP_DO_SIMD, ((OMP_DO_CLAUSES | OMP_SIMD_CLAUSES)
+ & ~OMP_CLAUSE_ORDERED));
}
match
gfc_match_omp_flush (void)
{
- gfc_namelist *list = NULL;
+ gfc_omp_namelist *list = NULL;
gfc_match_omp_variable_list (" (", &list, true);
if (gfc_match_omp_eos () != MATCH_YES)
{
gfc_error ("Unexpected junk after $OMP FLUSH statement at %C");
- gfc_free_namelist (list);
+ gfc_free_omp_namelist (list);
return MATCH_ERROR;
}
new_st.op = EXEC_OMP_FLUSH;
match
-gfc_match_omp_threadprivate (void)
+gfc_match_omp_declare_simd (void)
+{
+ locus where = gfc_current_locus;
+ gfc_symbol *proc_name;
+ gfc_omp_clauses *c;
+ gfc_omp_declare_simd *ods;
+
+ if (gfc_match (" ( %s ) ", &proc_name) != MATCH_YES)
+ return MATCH_ERROR;
+
+ if (gfc_match_omp_clauses (&c, OMP_DECLARE_SIMD_CLAUSES, true,
+ false) != MATCH_YES)
+ return MATCH_ERROR;
+
+ ods = gfc_get_omp_declare_simd ();
+ ods->where = where;
+ ods->proc_name = proc_name;
+ ods->clauses = c;
+ ods->next = gfc_current_ns->omp_declare_simd;
+ gfc_current_ns->omp_declare_simd = ods;
+ return MATCH_YES;
+}
+
+
+static bool
+match_udr_expr (gfc_symtree *omp_sym1, gfc_symtree *omp_sym2)
{
- locus old_loc;
- char n[GFC_MAX_SYMBOL_LEN+1];
- gfc_symbol *sym;
match m;
+ locus old_loc = gfc_current_locus;
+ char sname[GFC_MAX_SYMBOL_LEN + 1];
+ gfc_symbol *sym;
+ gfc_namespace *ns = gfc_current_ns;
+ gfc_expr *lvalue = NULL, *rvalue = NULL;
gfc_symtree *st;
+ gfc_actual_arglist *arglist;
- old_loc = gfc_current_locus;
-
- m = gfc_match (" (");
+ m = gfc_match (" %v =", &lvalue);
if (m != MATCH_YES)
- return m;
-
- for (;;)
+ gfc_current_locus = old_loc;
+ else
{
- m = gfc_match_symbol (&sym, 0);
- switch (m)
+ m = gfc_match (" %e )", &rvalue);
+ if (m == MATCH_YES)
{
- case MATCH_YES:
- if (sym->attr.in_common)
- gfc_error_now ("Threadprivate variable at %C is an element of "
- "a COMMON block");
- else if (!gfc_add_threadprivate (&sym->attr, sym->name, &sym->declared_at))
- goto cleanup;
- goto next_item;
- case MATCH_NO:
- break;
- case MATCH_ERROR:
- goto cleanup;
+ ns->code = gfc_get_code (EXEC_ASSIGN);
+ ns->code->expr1 = lvalue;
+ ns->code->expr2 = rvalue;
+ ns->code->loc = old_loc;
+ return true;
}
- m = gfc_match (" / %n /", n);
- if (m == MATCH_ERROR)
- goto cleanup;
- if (m == MATCH_NO || n[0] == '\0')
- goto syntax;
+ gfc_current_locus = old_loc;
+ gfc_free_expr (lvalue);
+ }
- st = gfc_find_symtree (gfc_current_ns->common_root, n);
- if (st == NULL)
+ m = gfc_match (" %n", sname);
+ if (m != MATCH_YES)
+ return false;
+
+ if (strcmp (sname, omp_sym1->name) == 0
+ || strcmp (sname, omp_sym2->name) == 0)
+ return false;
+
+ gfc_current_ns = ns->parent;
+ if (gfc_get_ha_sym_tree (sname, &st))
+ return false;
+
+ sym = st->n.sym;
+ if (sym->attr.flavor != FL_PROCEDURE
+ && sym->attr.flavor != FL_UNKNOWN)
+ return false;
+
+ if (!sym->attr.generic
+ && !sym->attr.subroutine
+ && !sym->attr.function)
+ {
+ if (!(sym->attr.external && !sym->attr.referenced))
{
- gfc_error ("COMMON block /%s/ not found at %C", n);
- goto cleanup;
+ /* ...create a symbol in this scope... */
+ if (sym->ns != gfc_current_ns
+ && gfc_get_sym_tree (sname, NULL, &st, false) == 1)
+ return false;
+
+ if (sym != st->n.sym)
+ sym = st->n.sym;
}
- st->n.common->threadprivate = 1;
- for (sym = st->n.common->head; sym; sym = sym->common_next)
- if (!gfc_add_threadprivate (&sym->attr, sym->name, &sym->declared_at))
- goto cleanup;
- next_item:
- if (gfc_match_char (')') == MATCH_YES)
- break;
- if (gfc_match_char (',') != MATCH_YES)
- goto syntax;
+ /* ...and then to try to make the symbol into a subroutine. */
+ if (!gfc_add_subroutine (&sym->attr, sym->name, NULL))
+ return false;
}
- return MATCH_YES;
+ gfc_set_sym_referenced (sym);
+ gfc_gobble_whitespace ();
+ if (gfc_peek_ascii_char () != '(')
+ return false;
-syntax:
+ gfc_current_ns = ns;
+ m = gfc_match_actual_arglist (1, &arglist);
+ if (m != MATCH_YES)
+ return false;
+
+ if (gfc_match_char (')') != MATCH_YES)
+ return false;
+
+ ns->code = gfc_get_code (EXEC_CALL);
+ ns->code->symtree = st;
+ ns->code->ext.actual = arglist;
+ ns->code->loc = old_loc;
+ return true;
+}
+
+static bool
+gfc_omp_udr_predef (gfc_omp_reduction_op rop, const char *name,
+ gfc_typespec *ts, const char **n)
+{
+ if (!gfc_numeric_ts (ts) && ts->type != BT_LOGICAL)
+ return false;
+
+ switch (rop)
+ {
+ case OMP_REDUCTION_PLUS:
+ case OMP_REDUCTION_MINUS:
+ case OMP_REDUCTION_TIMES:
+ return ts->type != BT_LOGICAL;
+ case OMP_REDUCTION_AND:
+ case OMP_REDUCTION_OR:
+ case OMP_REDUCTION_EQV:
+ case OMP_REDUCTION_NEQV:
+ return ts->type == BT_LOGICAL;
+ case OMP_REDUCTION_USER:
+ if (name[0] != '.' && (ts->type == BT_INTEGER || ts->type == BT_REAL))
+ {
+ gfc_symbol *sym;
+
+ gfc_find_symbol (name, NULL, 1, &sym);
+ if (sym != NULL)
+ {
+ if (sym->attr.intrinsic)
+ *n = sym->name;
+ else if ((sym->attr.flavor != FL_UNKNOWN
+ && sym->attr.flavor != FL_PROCEDURE)
+ || sym->attr.external
+ || sym->attr.generic
+ || sym->attr.entry
+ || sym->attr.result
+ || sym->attr.dummy
+ || sym->attr.subroutine
+ || sym->attr.pointer
+ || sym->attr.target
+ || sym->attr.cray_pointer
+ || sym->attr.cray_pointee
+ || (sym->attr.proc != PROC_UNKNOWN
+ && sym->attr.proc != PROC_INTRINSIC)
+ || sym->attr.if_source != IFSRC_UNKNOWN
+ || sym == sym->ns->proc_name)
+ *n = NULL;
+ else
+ *n = sym->name;
+ }
+ else
+ *n = name;
+ if (*n
+ && (strcmp (*n, "max") == 0 || strcmp (*n, "min") == 0))
+ return true;
+ else if (*n
+ && ts->type == BT_INTEGER
+ && (strcmp (*n, "iand") == 0
+ || strcmp (*n, "ior") == 0
+ || strcmp (*n, "ieor") == 0))
+ return true;
+ }
+ break;
+ default:
+ break;
+ }
+ return false;
+}
+
+gfc_omp_udr *
+gfc_omp_udr_find (gfc_symtree *st, gfc_typespec *ts)
+{
+ gfc_omp_udr *omp_udr;
+
+ if (st == NULL)
+ return NULL;
+
+ for (omp_udr = st->n.omp_udr; omp_udr; omp_udr = omp_udr->next)
+ if (omp_udr->ts.type == ts->type
+ || ((omp_udr->ts.type == BT_DERIVED || omp_udr->ts.type == BT_CLASS)
+ && (ts->type == BT_DERIVED && ts->type == BT_CLASS)))
+ {
+ if (omp_udr->ts.type == BT_DERIVED || omp_udr->ts.type == BT_CLASS)
+ {
+ if (strcmp (omp_udr->ts.u.derived->name, ts->u.derived->name) == 0)
+ return omp_udr;
+ }
+ else if (omp_udr->ts.kind == ts->kind)
+ {
+ if (omp_udr->ts.type == BT_CHARACTER)
+ {
+ if (omp_udr->ts.u.cl->length == NULL
+ || ts->u.cl->length == NULL)
+ return omp_udr;
+ if (omp_udr->ts.u.cl->length->expr_type != EXPR_CONSTANT)
+ return omp_udr;
+ if (ts->u.cl->length->expr_type != EXPR_CONSTANT)
+ return omp_udr;
+ if (omp_udr->ts.u.cl->length->ts.type != BT_INTEGER)
+ return omp_udr;
+ if (ts->u.cl->length->ts.type != BT_INTEGER)
+ return omp_udr;
+ if (gfc_compare_expr (omp_udr->ts.u.cl->length,
+ ts->u.cl->length, INTRINSIC_EQ) != 0)
+ continue;
+ }
+ return omp_udr;
+ }
+ }
+ return NULL;
+}
+
+match
+gfc_match_omp_declare_reduction (void)
+{
+ match m;
+ gfc_intrinsic_op op;
+ char name[GFC_MAX_SYMBOL_LEN + 3];
+ auto_vec<gfc_typespec, 5> tss;
+ gfc_typespec ts;
+ unsigned int i;
+ gfc_symtree *st;
+ locus where = gfc_current_locus;
+ locus end_loc = gfc_current_locus;
+ bool end_loc_set = false;
+ gfc_omp_reduction_op rop = OMP_REDUCTION_NONE;
+
+ if (gfc_match_char ('(') != MATCH_YES)
+ return MATCH_ERROR;
+
+ m = gfc_match (" %o : ", &op);
+ if (m == MATCH_ERROR)
+ return MATCH_ERROR;
+ if (m == MATCH_YES)
+ {
+ snprintf (name, sizeof name, "operator %s", gfc_op2string (op));
+ rop = (gfc_omp_reduction_op) op;
+ }
+ else
+ {
+ m = gfc_match_defined_op_name (name + 1, 1);
+ if (m == MATCH_ERROR)
+ return MATCH_ERROR;
+ if (m == MATCH_YES)
+ {
+ name[0] = '.';
+ strcat (name, ".");
+ if (gfc_match (" : ") != MATCH_YES)
+ return MATCH_ERROR;
+ }
+ else
+ {
+ if (gfc_match (" %n : ", name) != MATCH_YES)
+ return MATCH_ERROR;
+ }
+ rop = OMP_REDUCTION_USER;
+ }
+
+ m = gfc_match_type_spec (&ts);
+ if (m != MATCH_YES)
+ return MATCH_ERROR;
+ /* Treat len=: the same as len=*. */
+ if (ts.type == BT_CHARACTER)
+ ts.deferred = false;
+ tss.safe_push (ts);
+
+ while (gfc_match_char (',') == MATCH_YES)
+ {
+ m = gfc_match_type_spec (&ts);
+ if (m != MATCH_YES)
+ return MATCH_ERROR;
+ tss.safe_push (ts);
+ }
+ if (gfc_match_char (':') != MATCH_YES)
+ return MATCH_ERROR;
+
+ st = gfc_find_symtree (gfc_current_ns->omp_udr_root, name);
+ for (i = 0; i < tss.length (); i++)
+ {
+ gfc_symtree *omp_out, *omp_in;
+ gfc_symtree *omp_priv = NULL, *omp_orig = NULL;
+ gfc_namespace *combiner_ns, *initializer_ns = NULL;
+ gfc_omp_udr *prev_udr, *omp_udr;
+ const char *predef_name = NULL;
+
+ omp_udr = gfc_get_omp_udr ();
+ omp_udr->name = gfc_get_string (name);
+ omp_udr->rop = rop;
+ omp_udr->ts = tss[i];
+ omp_udr->where = where;
+
+ gfc_current_ns = combiner_ns = gfc_get_namespace (gfc_current_ns, 1);
+ combiner_ns->proc_name = combiner_ns->parent->proc_name;
+
+ gfc_get_sym_tree ("omp_out", combiner_ns, &omp_out, false);
+ gfc_get_sym_tree ("omp_in", combiner_ns, &omp_in, false);
+ combiner_ns->omp_udr_ns = 1;
+ omp_out->n.sym->ts = tss[i];
+ omp_in->n.sym->ts = tss[i];
+ omp_out->n.sym->attr.omp_udr_artificial_var = 1;
+ omp_in->n.sym->attr.omp_udr_artificial_var = 1;
+ omp_out->n.sym->attr.flavor = FL_VARIABLE;
+ omp_in->n.sym->attr.flavor = FL_VARIABLE;
+ gfc_commit_symbols ();
+ omp_udr->combiner_ns = combiner_ns;
+ omp_udr->omp_out = omp_out->n.sym;
+ omp_udr->omp_in = omp_in->n.sym;
+
+ locus old_loc = gfc_current_locus;
+
+ if (!match_udr_expr (omp_out, omp_in))
+ {
+ syntax:
+ gfc_current_locus = old_loc;
+ gfc_current_ns = combiner_ns->parent;
+ gfc_free_omp_udr (omp_udr);
+ return MATCH_ERROR;
+ }
+
+ if (gfc_match (" initializer ( ") == MATCH_YES)
+ {
+ gfc_current_ns = combiner_ns->parent;
+ initializer_ns = gfc_get_namespace (gfc_current_ns, 1);
+ gfc_current_ns = initializer_ns;
+ initializer_ns->proc_name = initializer_ns->parent->proc_name;
+
+ gfc_get_sym_tree ("omp_priv", initializer_ns, &omp_priv, false);
+ gfc_get_sym_tree ("omp_orig", initializer_ns, &omp_orig, false);
+ initializer_ns->omp_udr_ns = 1;
+ omp_priv->n.sym->ts = tss[i];
+ omp_orig->n.sym->ts = tss[i];
+ omp_priv->n.sym->attr.omp_udr_artificial_var = 1;
+ omp_orig->n.sym->attr.omp_udr_artificial_var = 1;
+ omp_priv->n.sym->attr.flavor = FL_VARIABLE;
+ omp_orig->n.sym->attr.flavor = FL_VARIABLE;
+ gfc_commit_symbols ();
+ omp_udr->initializer_ns = initializer_ns;
+ omp_udr->omp_priv = omp_priv->n.sym;
+ omp_udr->omp_orig = omp_orig->n.sym;
+
+ if (!match_udr_expr (omp_priv, omp_orig))
+ goto syntax;
+ }
+
+ gfc_current_ns = combiner_ns->parent;
+ if (!end_loc_set)
+ {
+ end_loc_set = true;
+ end_loc = gfc_current_locus;
+ }
+ gfc_current_locus = old_loc;
+
+ prev_udr = gfc_omp_udr_find (st, &tss[i]);
+ if (gfc_omp_udr_predef (rop, name, &tss[i], &predef_name)
+ /* Don't error on !$omp declare reduction (min : integer : ...)
+ just yet, there could be integer :: min afterwards,
+ making it valid. When the UDR is resolved, we'll get
+ to it again. */
+ && (rop != OMP_REDUCTION_USER || name[0] == '.'))
+ {
+ if (predef_name)
+ gfc_error_now ("Redefinition of predefined %s "
+ "!$OMP DECLARE REDUCTION at %L",
+ predef_name, &where);
+ else
+ gfc_error_now ("Redefinition of predefined "
+ "!$OMP DECLARE REDUCTION at %L", &where);
+ }
+ else if (prev_udr)
+ {
+ gfc_error_now ("Redefinition of !$OMP DECLARE REDUCTION at %L",
+ &where);
+ gfc_error_now ("Previous !$OMP DECLARE REDUCTION at %L",
+ &prev_udr->where);
+ }
+ else if (st)
+ {
+ omp_udr->next = st->n.omp_udr;
+ st->n.omp_udr = omp_udr;
+ }
+ else
+ {
+ st = gfc_new_symtree (&gfc_current_ns->omp_udr_root, name);
+ st->n.omp_udr = omp_udr;
+ }
+ }
+
+ if (end_loc_set)
+ {
+ gfc_current_locus = end_loc;
+ if (gfc_match_omp_eos () != MATCH_YES)
+ {
+ gfc_error ("Unexpected junk after !$OMP DECLARE REDUCTION at %C");
+ gfc_current_locus = where;
+ return MATCH_ERROR;
+ }
+
+ return MATCH_YES;
+ }
+ gfc_clear_error ();
+ return MATCH_ERROR;
+}
+
+
+match
+gfc_match_omp_declare_target (void)
+{
+ locus old_loc;
+ char n[GFC_MAX_SYMBOL_LEN+1];
+ gfc_symbol *sym;
+ match m;
+ gfc_symtree *st;
+
+ old_loc = gfc_current_locus;
+
+ m = gfc_match (" (");
+
+ if (gfc_current_ns->proc_name
+ && gfc_current_ns->proc_name->attr.if_source == IFSRC_IFBODY
+ && m == MATCH_YES)
+ {
+ gfc_error ("Only the !$OMP DECLARE TARGET form without "
+ "list is allowed in interface block at %C");
+ goto cleanup;
+ }
+
+ if (m == MATCH_NO
+ && gfc_current_ns->proc_name
+ && gfc_match_omp_eos () == MATCH_YES)
+ {
+ if (!gfc_add_omp_declare_target (&gfc_current_ns->proc_name->attr,
+ gfc_current_ns->proc_name->name,
+ &old_loc))
+ goto cleanup;
+ return MATCH_YES;
+ }
+
+ if (m != MATCH_YES)
+ return m;
+
+ for (;;)
+ {
+ m = gfc_match_symbol (&sym, 0);
+ switch (m)
+ {
+ case MATCH_YES:
+ if (sym->attr.in_common)
+ gfc_error_now ("OMP DECLARE TARGET on a variable at %C is an "
+ "element of a COMMON block");
+ else if (!gfc_add_omp_declare_target (&sym->attr, sym->name,
+ &sym->declared_at))
+ goto cleanup;
+ goto next_item;
+ case MATCH_NO:
+ break;
+ case MATCH_ERROR:
+ goto cleanup;
+ }
+
+ m = gfc_match (" / %n /", n);
+ if (m == MATCH_ERROR)
+ goto cleanup;
+ if (m == MATCH_NO || n[0] == '\0')
+ goto syntax;
+
+ st = gfc_find_symtree (gfc_current_ns->common_root, n);
+ if (st == NULL)
+ {
+ gfc_error ("COMMON block /%s/ not found at %C", n);
+ goto cleanup;
+ }
+ st->n.common->omp_declare_target = 1;
+ for (sym = st->n.common->head; sym; sym = sym->common_next)
+ if (!gfc_add_omp_declare_target (&sym->attr, sym->name,
+ &sym->declared_at))
+ goto cleanup;
+
+ next_item:
+ if (gfc_match_char (')') == MATCH_YES)
+ break;
+ if (gfc_match_char (',') != MATCH_YES)
+ goto syntax;
+ }
+
+ if (gfc_match_omp_eos () != MATCH_YES)
+ {
+ gfc_error ("Unexpected junk after !$OMP DECLARE TARGET at %C");
+ goto cleanup;
+ }
+ return MATCH_YES;
+
+syntax:
+ gfc_error ("Syntax error in !$OMP DECLARE TARGET list at %C");
+
+cleanup:
+ gfc_current_locus = old_loc;
+ return MATCH_ERROR;
+}
+
+
+match
+gfc_match_omp_threadprivate (void)
+{
+ locus old_loc;
+ char n[GFC_MAX_SYMBOL_LEN+1];
+ gfc_symbol *sym;
+ match m;
+ gfc_symtree *st;
+
+ old_loc = gfc_current_locus;
+
+ m = gfc_match (" (");
+ if (m != MATCH_YES)
+ return m;
+
+ for (;;)
+ {
+ m = gfc_match_symbol (&sym, 0);
+ switch (m)
+ {
+ case MATCH_YES:
+ if (sym->attr.in_common)
+ gfc_error_now ("Threadprivate variable at %C is an element of "
+ "a COMMON block");
+ else if (!gfc_add_threadprivate (&sym->attr, sym->name, &sym->declared_at))
+ goto cleanup;
+ goto next_item;
+ case MATCH_NO:
+ break;
+ case MATCH_ERROR:
+ goto cleanup;
+ }
+
+ m = gfc_match (" / %n /", n);
+ if (m == MATCH_ERROR)
+ goto cleanup;
+ if (m == MATCH_NO || n[0] == '\0')
+ goto syntax;
+
+ st = gfc_find_symtree (gfc_current_ns->common_root, n);
+ if (st == NULL)
+ {
+ gfc_error ("COMMON block /%s/ not found at %C", n);
+ goto cleanup;
+ }
+ st->n.common->threadprivate = 1;
+ for (sym = st->n.common->head; sym; sym = sym->common_next)
+ if (!gfc_add_threadprivate (&sym->attr, sym->name, &sym->declared_at))
+ goto cleanup;
+
+ next_item:
+ if (gfc_match_char (')') == MATCH_YES)
+ break;
+ if (gfc_match_char (',') != MATCH_YES)
+ goto syntax;
+ }
+
+ if (gfc_match_omp_eos () != MATCH_YES)
+ {
+ gfc_error ("Unexpected junk after OMP THREADPRIVATE at %C");
+ goto cleanup;
+ }
+
+ return MATCH_YES;
+
+syntax:
gfc_error ("Syntax error in !$OMP THREADPRIVATE list at %C");
cleanup:
match
+gfc_match_omp_parallel (void)
+{
+ return match_omp (EXEC_OMP_PARALLEL, OMP_PARALLEL_CLAUSES);
+}
+
+
+match
gfc_match_omp_parallel_do (void)
{
- gfc_omp_clauses *c;
- if (gfc_match_omp_clauses (&c, OMP_PARALLEL_CLAUSES | OMP_DO_CLAUSES)
- != MATCH_YES)
- return MATCH_ERROR;
- new_st.op = EXEC_OMP_PARALLEL_DO;
- new_st.ext.omp_clauses = c;
- return MATCH_YES;
+ return match_omp (EXEC_OMP_PARALLEL_DO,
+ OMP_PARALLEL_CLAUSES | OMP_DO_CLAUSES);
+}
+
+
+match
+gfc_match_omp_parallel_do_simd (void)
+{
+ return match_omp (EXEC_OMP_PARALLEL_DO_SIMD,
+ (OMP_PARALLEL_CLAUSES | OMP_DO_CLAUSES | OMP_SIMD_CLAUSES)
+ & ~OMP_CLAUSE_ORDERED);
}
match
gfc_match_omp_parallel_sections (void)
{
- gfc_omp_clauses *c;
- if (gfc_match_omp_clauses (&c, OMP_PARALLEL_CLAUSES | OMP_SECTIONS_CLAUSES)
- != MATCH_YES)
- return MATCH_ERROR;
- new_st.op = EXEC_OMP_PARALLEL_SECTIONS;
- new_st.ext.omp_clauses = c;
- return MATCH_YES;
+ return match_omp (EXEC_OMP_PARALLEL_SECTIONS,
+ OMP_PARALLEL_CLAUSES | OMP_SECTIONS_CLAUSES);
}
match
gfc_match_omp_parallel_workshare (void)
{
- gfc_omp_clauses *c;
- if (gfc_match_omp_clauses (&c, OMP_PARALLEL_CLAUSES) != MATCH_YES)
- return MATCH_ERROR;
- new_st.op = EXEC_OMP_PARALLEL_WORKSHARE;
- new_st.ext.omp_clauses = c;
- return MATCH_YES;
+ return match_omp (EXEC_OMP_PARALLEL_WORKSHARE, OMP_PARALLEL_CLAUSES);
}
match
gfc_match_omp_sections (void)
{
- gfc_omp_clauses *c;
- if (gfc_match_omp_clauses (&c, OMP_SECTIONS_CLAUSES) != MATCH_YES)
- return MATCH_ERROR;
- new_st.op = EXEC_OMP_SECTIONS;
- new_st.ext.omp_clauses = c;
- return MATCH_YES;
+ return match_omp (EXEC_OMP_SECTIONS, OMP_SECTIONS_CLAUSES);
+}
+
+
+match
+gfc_match_omp_simd (void)
+{
+ return match_omp (EXEC_OMP_SIMD, OMP_SIMD_CLAUSES);
+}
+
+
+match
+gfc_match_omp_single (void)
+{
+ return match_omp (EXEC_OMP_SINGLE,
+ OMP_CLAUSE_PRIVATE | OMP_CLAUSE_FIRSTPRIVATE);
+}
+
+
+match
+gfc_match_omp_task (void)
+{
+ return match_omp (EXEC_OMP_TASK, OMP_TASK_CLAUSES);
+}
+
+
+match
+gfc_match_omp_taskwait (void)
+{
+ if (gfc_match_omp_eos () != MATCH_YES)
+ {
+ gfc_error ("Unexpected junk after TASKWAIT clause at %C");
+ return MATCH_ERROR;
+ }
+ new_st.op = EXEC_OMP_TASKWAIT;
+ new_st.ext.omp_clauses = NULL;
+ return MATCH_YES;
+}
+
+
+match
+gfc_match_omp_taskyield (void)
+{
+ if (gfc_match_omp_eos () != MATCH_YES)
+ {
+ gfc_error ("Unexpected junk after TASKYIELD clause at %C");
+ return MATCH_ERROR;
+ }
+ new_st.op = EXEC_OMP_TASKYIELD;
+ new_st.ext.omp_clauses = NULL;
+ return MATCH_YES;
+}
+
+
+match
+gfc_match_omp_target (void)
+{
+ return match_omp (EXEC_OMP_TARGET, OMP_TARGET_CLAUSES);
+}
+
+
+match
+gfc_match_omp_target_data (void)
+{
+ return match_omp (EXEC_OMP_TARGET_DATA, OMP_TARGET_DATA_CLAUSES);
+}
+
+
+match
+gfc_match_omp_target_teams (void)
+{
+ return match_omp (EXEC_OMP_TARGET_TEAMS,
+ OMP_TARGET_CLAUSES | OMP_TEAMS_CLAUSES);
+}
+
+
+match
+gfc_match_omp_target_teams_distribute (void)
+{
+ return match_omp (EXEC_OMP_TARGET_TEAMS_DISTRIBUTE,
+ OMP_TARGET_CLAUSES | OMP_TEAMS_CLAUSES
+ | OMP_DISTRIBUTE_CLAUSES);
+}
+
+
+match
+gfc_match_omp_target_teams_distribute_parallel_do (void)
+{
+ return match_omp (EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO,
+ OMP_TARGET_CLAUSES | OMP_TEAMS_CLAUSES
+ | OMP_DISTRIBUTE_CLAUSES | OMP_PARALLEL_CLAUSES
+ | OMP_DO_CLAUSES);
+}
+
+
+match
+gfc_match_omp_target_teams_distribute_parallel_do_simd (void)
+{
+ return match_omp (EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD,
+ (OMP_TARGET_CLAUSES | OMP_TEAMS_CLAUSES
+ | OMP_DISTRIBUTE_CLAUSES | OMP_PARALLEL_CLAUSES
+ | OMP_DO_CLAUSES | OMP_SIMD_CLAUSES)
+ & ~OMP_CLAUSE_ORDERED);
+}
+
+
+match
+gfc_match_omp_target_teams_distribute_simd (void)
+{
+ return match_omp (EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD,
+ OMP_TARGET_CLAUSES | OMP_TEAMS_CLAUSES
+ | OMP_DISTRIBUTE_CLAUSES | OMP_SIMD_CLAUSES);
+}
+
+
+match
+gfc_match_omp_target_update (void)
+{
+ return match_omp (EXEC_OMP_TARGET_UPDATE, OMP_TARGET_UPDATE_CLAUSES);
+}
+
+
+match
+gfc_match_omp_teams (void)
+{
+ return match_omp (EXEC_OMP_TEAMS, OMP_TEAMS_CLAUSES);
+}
+
+
+match
+gfc_match_omp_teams_distribute (void)
+{
+ return match_omp (EXEC_OMP_TEAMS_DISTRIBUTE,
+ OMP_TEAMS_CLAUSES | OMP_DISTRIBUTE_CLAUSES);
+}
+
+
+match
+gfc_match_omp_teams_distribute_parallel_do (void)
+{
+ return match_omp (EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO,
+ OMP_TEAMS_CLAUSES | OMP_DISTRIBUTE_CLAUSES
+ | OMP_PARALLEL_CLAUSES | OMP_DO_CLAUSES);
+}
+
+
+match
+gfc_match_omp_teams_distribute_parallel_do_simd (void)
+{
+ return match_omp (EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD,
+ (OMP_TEAMS_CLAUSES | OMP_DISTRIBUTE_CLAUSES
+ | OMP_PARALLEL_CLAUSES | OMP_DO_CLAUSES
+ | OMP_SIMD_CLAUSES) & ~OMP_CLAUSE_ORDERED);
}
match
-gfc_match_omp_single (void)
+gfc_match_omp_teams_distribute_simd (void)
{
- gfc_omp_clauses *c;
- if (gfc_match_omp_clauses (&c, OMP_CLAUSE_PRIVATE | OMP_CLAUSE_FIRSTPRIVATE)
- != MATCH_YES)
- return MATCH_ERROR;
- new_st.op = EXEC_OMP_SINGLE;
- new_st.ext.omp_clauses = c;
- return MATCH_YES;
+ return match_omp (EXEC_OMP_TEAMS_DISTRIBUTE_SIMD,
+ OMP_TEAMS_CLAUSES | OMP_DISTRIBUTE_CLAUSES
+ | OMP_SIMD_CLAUSES);
}
gfc_match_omp_atomic (void)
{
gfc_omp_atomic_op op = GFC_OMP_ATOMIC_UPDATE;
- if (gfc_match ("% update") == MATCH_YES)
- op = GFC_OMP_ATOMIC_UPDATE;
- else if (gfc_match ("% read") == MATCH_YES)
- op = GFC_OMP_ATOMIC_READ;
- else if (gfc_match ("% write") == MATCH_YES)
- op = GFC_OMP_ATOMIC_WRITE;
- else if (gfc_match ("% capture") == MATCH_YES)
- op = GFC_OMP_ATOMIC_CAPTURE;
+ int seq_cst = 0;
+ if (gfc_match ("% seq_cst") == MATCH_YES)
+ seq_cst = 1;
+ locus old_loc = gfc_current_locus;
+ if (seq_cst && gfc_match_char (',') == MATCH_YES)
+ seq_cst = 2;
+ if (seq_cst == 2
+ || gfc_match_space () == MATCH_YES)
+ {
+ gfc_gobble_whitespace ();
+ if (gfc_match ("update") == MATCH_YES)
+ op = GFC_OMP_ATOMIC_UPDATE;
+ else if (gfc_match ("read") == MATCH_YES)
+ op = GFC_OMP_ATOMIC_READ;
+ else if (gfc_match ("write") == MATCH_YES)
+ op = GFC_OMP_ATOMIC_WRITE;
+ else if (gfc_match ("capture") == MATCH_YES)
+ op = GFC_OMP_ATOMIC_CAPTURE;
+ else
+ {
+ if (seq_cst == 2)
+ gfc_current_locus = old_loc;
+ goto finish;
+ }
+ if (!seq_cst
+ && (gfc_match (", seq_cst") == MATCH_YES
+ || gfc_match ("% seq_cst") == MATCH_YES))
+ seq_cst = 1;
+ }
+ finish:
if (gfc_match_omp_eos () != MATCH_YES)
{
gfc_error ("Unexpected junk after $OMP ATOMIC statement at %C");
return MATCH_ERROR;
}
new_st.op = EXEC_OMP_ATOMIC;
+ if (seq_cst)
+ op = (gfc_omp_atomic_op) (op | GFC_OMP_ATOMIC_SEQ_CST);
new_st.ext.omp_atomic = op;
return MATCH_YES;
}
match
+gfc_match_omp_taskgroup (void)
+{
+ if (gfc_match_omp_eos () != MATCH_YES)
+ {
+ gfc_error ("Unexpected junk after $OMP TASKGROUP statement at %C");
+ return MATCH_ERROR;
+ }
+ new_st.op = EXEC_OMP_TASKGROUP;
+ return MATCH_YES;
+}
+
+
+static enum gfc_omp_cancel_kind
+gfc_match_omp_cancel_kind (void)
+{
+ if (gfc_match_space () != MATCH_YES)
+ return OMP_CANCEL_UNKNOWN;
+ if (gfc_match ("parallel") == MATCH_YES)
+ return OMP_CANCEL_PARALLEL;
+ if (gfc_match ("sections") == MATCH_YES)
+ return OMP_CANCEL_SECTIONS;
+ if (gfc_match ("do") == MATCH_YES)
+ return OMP_CANCEL_DO;
+ if (gfc_match ("taskgroup") == MATCH_YES)
+ return OMP_CANCEL_TASKGROUP;
+ return OMP_CANCEL_UNKNOWN;
+}
+
+
+match
+gfc_match_omp_cancel (void)
+{
+ gfc_omp_clauses *c;
+ enum gfc_omp_cancel_kind kind = gfc_match_omp_cancel_kind ();
+ if (kind == OMP_CANCEL_UNKNOWN)
+ return MATCH_ERROR;
+ if (gfc_match_omp_clauses (&c, OMP_CLAUSE_IF, false) != MATCH_YES)
+ return MATCH_ERROR;
+ c->cancel = kind;
+ new_st.op = EXEC_OMP_CANCEL;
+ new_st.ext.omp_clauses = c;
+ return MATCH_YES;
+}
+
+
+match
+gfc_match_omp_cancellation_point (void)
+{
+ gfc_omp_clauses *c;
+ enum gfc_omp_cancel_kind kind = gfc_match_omp_cancel_kind ();
+ if (kind == OMP_CANCEL_UNKNOWN)
+ return MATCH_ERROR;
+ if (gfc_match_omp_eos () != MATCH_YES)
+ {
+ gfc_error ("Unexpected junk after $OMP CANCELLATION POINT statement "
+ "at %C");
+ return MATCH_ERROR;
+ }
+ c = gfc_get_omp_clauses ();
+ c->cancel = kind;
+ new_st.op = EXEC_OMP_CANCELLATION_POINT;
+ new_st.ext.omp_clauses = c;
+ return MATCH_YES;
+}
+
+
+match
gfc_match_omp_end_nowait (void)
{
bool nowait = false;
}
+struct resolve_omp_udr_callback_data
+{
+ gfc_symbol *sym1, *sym2;
+};
+
+
+static int
+resolve_omp_udr_callback (gfc_expr **e, int *, void *data)
+{
+ struct resolve_omp_udr_callback_data *rcd
+ = (struct resolve_omp_udr_callback_data *) data;
+ if ((*e)->expr_type == EXPR_VARIABLE
+ && ((*e)->symtree->n.sym == rcd->sym1
+ || (*e)->symtree->n.sym == rcd->sym2))
+ {
+ gfc_ref *ref = gfc_get_ref ();
+ ref->type = REF_ARRAY;
+ ref->u.ar.where = (*e)->where;
+ ref->u.ar.as = (*e)->symtree->n.sym->as;
+ ref->u.ar.type = AR_FULL;
+ ref->u.ar.dimen = 0;
+ ref->next = (*e)->ref;
+ (*e)->ref = ref;
+ }
+ return 0;
+}
+
+
+static int
+resolve_omp_udr_callback2 (gfc_expr **e, int *, void *)
+{
+ if ((*e)->expr_type == EXPR_FUNCTION
+ && (*e)->value.function.isym == NULL)
+ {
+ gfc_symbol *sym = (*e)->symtree->n.sym;
+ if (!sym->attr.intrinsic
+ && sym->attr.if_source == IFSRC_UNKNOWN)
+ gfc_error ("Implicitly declared function %s used in "
+ "!$OMP DECLARE REDUCTION at %L ", sym->name, &(*e)->where);
+ }
+ return 0;
+}
+
+
+static gfc_code *
+resolve_omp_udr_clause (gfc_omp_namelist *n, gfc_namespace *ns,
+ gfc_symbol *sym1, gfc_symbol *sym2)
+{
+ gfc_code *copy;
+ gfc_symbol sym1_copy, sym2_copy;
+
+ if (ns->code->op == EXEC_ASSIGN)
+ {
+ copy = gfc_get_code (EXEC_ASSIGN);
+ copy->expr1 = gfc_copy_expr (ns->code->expr1);
+ copy->expr2 = gfc_copy_expr (ns->code->expr2);
+ }
+ else
+ {
+ copy = gfc_get_code (EXEC_CALL);
+ copy->symtree = ns->code->symtree;
+ copy->ext.actual = gfc_copy_actual_arglist (ns->code->ext.actual);
+ }
+ copy->loc = ns->code->loc;
+ sym1_copy = *sym1;
+ sym2_copy = *sym2;
+ *sym1 = *n->sym;
+ *sym2 = *n->sym;
+ sym1->name = sym1_copy.name;
+ sym2->name = sym2_copy.name;
+ ns->proc_name = ns->parent->proc_name;
+ if (n->sym->attr.dimension)
+ {
+ struct resolve_omp_udr_callback_data rcd;
+ rcd.sym1 = sym1;
+ rcd.sym2 = sym2;
+ gfc_code_walker (©, gfc_dummy_code_callback,
+ resolve_omp_udr_callback, &rcd);
+ }
+ gfc_resolve_code (copy, gfc_current_ns);
+ if (copy->op == EXEC_CALL && copy->resolved_isym == NULL)
+ {
+ gfc_symbol *sym = copy->resolved_sym;
+ if (sym
+ && !sym->attr.intrinsic
+ && sym->attr.if_source == IFSRC_UNKNOWN)
+ gfc_error ("Implicitly declared subroutine %s used in "
+ "!$OMP DECLARE REDUCTION at %L ", sym->name,
+ ©->loc);
+ }
+ gfc_code_walker (©, gfc_dummy_code_callback,
+ resolve_omp_udr_callback2, NULL);
+ *sym1 = sym1_copy;
+ *sym2 = sym2_copy;
+ return copy;
+}
+
+
/* OpenMP directive resolving routines. */
static void
-resolve_omp_clauses (gfc_code *code)
+resolve_omp_clauses (gfc_code *code, locus *where,
+ gfc_omp_clauses *omp_clauses, gfc_namespace *ns)
{
- gfc_omp_clauses *omp_clauses = code->ext.omp_clauses;
- gfc_namelist *n;
+ gfc_omp_namelist *n;
int list;
static const char *clause_names[]
= { "PRIVATE", "FIRSTPRIVATE", "LASTPRIVATE", "COPYPRIVATE", "SHARED",
- "COPYIN", "REDUCTION" };
+ "COPYIN", "UNIFORM", "ALIGNED", "LINEAR", "DEPEND", "MAP",
+ "TO", "FROM", "REDUCTION" };
if (omp_clauses == NULL)
return;
for (n = omp_clauses->lists[list]; n; n = n->next)
{
n->sym->mark = 0;
- if (n->sym->attr.flavor == FL_VARIABLE || n->sym->attr.proc_pointer)
- continue;
+ if (n->sym->attr.flavor == FL_VARIABLE
+ || n->sym->attr.proc_pointer
+ || (!code && (!n->sym->attr.dummy || n->sym->ns != ns)))
+ {
+ if (!code && (!n->sym->attr.dummy || n->sym->ns != ns))
+ gfc_error ("Variable '%s' is not a dummy argument at %L",
+ n->sym->name, where);
+ continue;
+ }
if (n->sym->attr.flavor == FL_PROCEDURE
&& n->sym->result == n->sym
&& n->sym->attr.function)
}
}
gfc_error ("Object '%s' is not a variable at %L", n->sym->name,
- &code->loc);
+ where);
}
for (list = 0; list < OMP_LIST_NUM; list++)
- if (list != OMP_LIST_FIRSTPRIVATE && list != OMP_LIST_LASTPRIVATE)
+ if (list != OMP_LIST_FIRSTPRIVATE
+ && list != OMP_LIST_LASTPRIVATE
+ && list != OMP_LIST_ALIGNED
+ && list != OMP_LIST_DEPEND
+ && list != OMP_LIST_MAP
+ && list != OMP_LIST_FROM
+ && list != OMP_LIST_TO)
for (n = omp_clauses->lists[list]; n; n = n->next)
{
if (n->sym->mark)
gfc_error ("Symbol '%s' present on multiple clauses at %L",
- n->sym->name, &code->loc);
+ n->sym->name, where);
else
n->sym->mark = 1;
}
if (n->sym->mark)
{
gfc_error ("Symbol '%s' present on multiple clauses at %L",
- n->sym->name, &code->loc);
+ n->sym->name, where);
n->sym->mark = 0;
}
{
if (n->sym->mark)
gfc_error ("Symbol '%s' present on multiple clauses at %L",
- n->sym->name, &code->loc);
+ n->sym->name, where);
else
n->sym->mark = 1;
}
{
if (n->sym->mark)
gfc_error ("Symbol '%s' present on multiple clauses at %L",
- n->sym->name, &code->loc);
+ n->sym->name, where);
+ else
+ n->sym->mark = 1;
+ }
+
+ for (n = omp_clauses->lists[OMP_LIST_ALIGNED]; n; n = n->next)
+ n->sym->mark = 0;
+
+ for (n = omp_clauses->lists[OMP_LIST_ALIGNED]; n; n = n->next)
+ {
+ if (n->sym->mark)
+ gfc_error ("Symbol '%s' present on multiple clauses at %L",
+ n->sym->name, where);
else
n->sym->mark = 1;
}
+
+ for (n = omp_clauses->lists[OMP_LIST_TO]; n; n = n->next)
+ n->sym->mark = 0;
+ for (n = omp_clauses->lists[OMP_LIST_FROM]; n; n = n->next)
+ if (n->expr == NULL)
+ n->sym->mark = 1;
+ for (n = omp_clauses->lists[OMP_LIST_TO]; n; n = n->next)
+ {
+ if (n->expr == NULL && n->sym->mark)
+ gfc_error ("Symbol '%s' present on both FROM and TO clauses at %L",
+ n->sym->name, where);
+ else
+ n->sym->mark = 1;
+ }
+
for (list = 0; list < OMP_LIST_NUM; list++)
if ((n = omp_clauses->lists[list]) != NULL)
{
const char *name;
- if (list < OMP_LIST_REDUCTION_FIRST)
+ if (list < OMP_LIST_NUM)
name = clause_names[list];
- else if (list <= OMP_LIST_REDUCTION_LAST)
- name = clause_names[OMP_LIST_REDUCTION_FIRST];
else
gcc_unreachable ();
{
if (!n->sym->attr.threadprivate)
gfc_error ("Non-THREADPRIVATE object '%s' in COPYIN clause"
- " at %L", n->sym->name, &code->loc);
- if (n->sym->ts.type == BT_DERIVED && n->sym->ts.u.derived->attr.alloc_comp)
- gfc_error ("COPYIN clause object '%s' at %L has ALLOCATABLE components",
- n->sym->name, &code->loc);
+ " at %L", n->sym->name, where);
}
break;
case OMP_LIST_COPYPRIVATE:
{
if (n->sym->as && n->sym->as->type == AS_ASSUMED_SIZE)
gfc_error ("Assumed size array '%s' in COPYPRIVATE clause "
- "at %L", n->sym->name, &code->loc);
- if (n->sym->ts.type == BT_DERIVED && n->sym->ts.u.derived->attr.alloc_comp)
- gfc_error ("COPYPRIVATE clause object '%s' at %L has ALLOCATABLE components",
- n->sym->name, &code->loc);
+ "at %L", n->sym->name, where);
+ if (n->sym->attr.pointer && n->sym->attr.intent == INTENT_IN)
+ gfc_error ("INTENT(IN) POINTER '%s' in COPYPRIVATE clause "
+ "at %L", n->sym->name, where);
}
break;
case OMP_LIST_SHARED:
{
if (n->sym->attr.threadprivate)
gfc_error ("THREADPRIVATE object '%s' in SHARED clause at "
- "%L", n->sym->name, &code->loc);
+ "%L", n->sym->name, where);
if (n->sym->attr.cray_pointee)
gfc_error ("Cray pointee '%s' in SHARED clause at %L",
- n->sym->name, &code->loc);
+ n->sym->name, where);
+ if (n->sym->attr.associate_var)
+ gfc_error ("ASSOCIATE name '%s' in SHARED clause at %L",
+ n->sym->name, where);
+ }
+ break;
+ case OMP_LIST_ALIGNED:
+ for (; n != NULL; n = n->next)
+ {
+ if (!n->sym->attr.pointer
+ && !n->sym->attr.allocatable
+ && !n->sym->attr.cray_pointer
+ && (n->sym->ts.type != BT_DERIVED
+ || (n->sym->ts.u.derived->from_intmod
+ != INTMOD_ISO_C_BINDING)
+ || (n->sym->ts.u.derived->intmod_sym_id
+ != ISOCBINDING_PTR)))
+ gfc_error ("'%s' in ALIGNED clause must be POINTER, "
+ "ALLOCATABLE, Cray pointer or C_PTR at %L",
+ n->sym->name, where);
+ else if (n->expr)
+ {
+ gfc_expr *expr = n->expr;
+ int alignment = 0;
+ if (!gfc_resolve_expr (expr)
+ || expr->ts.type != BT_INTEGER
+ || expr->rank != 0
+ || gfc_extract_int (expr, &alignment)
+ || alignment <= 0)
+ gfc_error ("'%s' in ALIGNED clause at %L requires a scalar "
+ "positive constant integer alignment "
+ "expression", n->sym->name, where);
+ }
}
break;
+ case OMP_LIST_DEPEND:
+ case OMP_LIST_MAP:
+ case OMP_LIST_TO:
+ case OMP_LIST_FROM:
+ for (; n != NULL; n = n->next)
+ if (n->expr)
+ {
+ if (!gfc_resolve_expr (n->expr)
+ || n->expr->expr_type != EXPR_VARIABLE
+ || n->expr->ref == NULL
+ || n->expr->ref->next
+ || n->expr->ref->type != REF_ARRAY)
+ gfc_error ("'%s' in %s clause at %L is not a proper "
+ "array section", n->sym->name, name, where);
+ else if (n->expr->ref->u.ar.codimen)
+ gfc_error ("Coarrays not supported in %s clause at %L",
+ name, where);
+ else
+ {
+ int i;
+ gfc_array_ref *ar = &n->expr->ref->u.ar;
+ for (i = 0; i < ar->dimen; i++)
+ if (ar->stride[i])
+ {
+ gfc_error ("Stride should not be specified for "
+ "array section in %s clause at %L",
+ name, where);
+ break;
+ }
+ else if (ar->dimen_type[i] != DIMEN_ELEMENT
+ && ar->dimen_type[i] != DIMEN_RANGE)
+ {
+ gfc_error ("'%s' in %s clause at %L is not a "
+ "proper array section",
+ n->sym->name, name, where);
+ break;
+ }
+ else if (list == OMP_LIST_DEPEND
+ && ar->start[i]
+ && ar->start[i]->expr_type == EXPR_CONSTANT
+ && ar->end[i]
+ && ar->end[i]->expr_type == EXPR_CONSTANT
+ && mpz_cmp (ar->start[i]->value.integer,
+ ar->end[i]->value.integer) > 0)
+ {
+ gfc_error ("'%s' in DEPEND clause at %L is a zero "
+ "size array section", n->sym->name,
+ where);
+ break;
+ }
+ }
+ }
+ if (list != OMP_LIST_DEPEND)
+ for (n = omp_clauses->lists[list]; n != NULL; n = n->next)
+ {
+ n->sym->attr.referenced = 1;
+ if (n->sym->attr.threadprivate)
+ gfc_error ("THREADPRIVATE object '%s' in %s clause at %L",
+ n->sym->name, name, where);
+ if (n->sym->attr.cray_pointee)
+ gfc_error ("Cray pointee '%s' in %s clause at %L",
+ n->sym->name, name, where);
+ }
+ break;
default:
for (; n != NULL; n = n->next)
{
+ bool bad = false;
if (n->sym->attr.threadprivate)
gfc_error ("THREADPRIVATE object '%s' in %s clause at %L",
- n->sym->name, name, &code->loc);
+ n->sym->name, name, where);
if (n->sym->attr.cray_pointee)
gfc_error ("Cray pointee '%s' in %s clause at %L",
- n->sym->name, name, &code->loc);
+ n->sym->name, name, where);
+ if (n->sym->attr.associate_var)
+ gfc_error ("ASSOCIATE name '%s' in %s clause at %L",
+ n->sym->name, name, where);
if (list != OMP_LIST_PRIVATE)
{
- if (n->sym->attr.pointer
- && list >= OMP_LIST_REDUCTION_FIRST
- && list <= OMP_LIST_REDUCTION_LAST)
+ if (n->sym->attr.proc_pointer && list == OMP_LIST_REDUCTION)
+ gfc_error ("Procedure pointer '%s' in %s clause at %L",
+ n->sym->name, name, where);
+ if (n->sym->attr.pointer && list == OMP_LIST_REDUCTION)
gfc_error ("POINTER object '%s' in %s clause at %L",
- n->sym->name, name, &code->loc);
- /* Variables in REDUCTION-clauses must be of intrinsic type (flagged below). */
- if ((list < OMP_LIST_REDUCTION_FIRST || list > OMP_LIST_REDUCTION_LAST)
- && n->sym->ts.type == BT_DERIVED
- && n->sym->ts.u.derived->attr.alloc_comp)
- gfc_error ("%s clause object '%s' has ALLOCATABLE components at %L",
- name, n->sym->name, &code->loc);
- if (n->sym->attr.cray_pointer
- && list >= OMP_LIST_REDUCTION_FIRST
- && list <= OMP_LIST_REDUCTION_LAST)
+ n->sym->name, name, where);
+ if (n->sym->attr.cray_pointer && list == OMP_LIST_REDUCTION)
gfc_error ("Cray pointer '%s' in %s clause at %L",
- n->sym->name, name, &code->loc);
+ n->sym->name, name, where);
}
if (n->sym->as && n->sym->as->type == AS_ASSUMED_SIZE)
gfc_error ("Assumed size array '%s' in %s clause at %L",
- n->sym->name, name, &code->loc);
- if (n->sym->attr.in_namelist
- && (list < OMP_LIST_REDUCTION_FIRST
- || list > OMP_LIST_REDUCTION_LAST))
+ n->sym->name, name, where);
+ if (n->sym->attr.in_namelist && list != OMP_LIST_REDUCTION)
gfc_error ("Variable '%s' in %s clause is used in "
"NAMELIST statement at %L",
- n->sym->name, name, &code->loc);
+ n->sym->name, name, where);
+ if (n->sym->attr.pointer && n->sym->attr.intent == INTENT_IN)
+ switch (list)
+ {
+ case OMP_LIST_PRIVATE:
+ case OMP_LIST_LASTPRIVATE:
+ case OMP_LIST_LINEAR:
+ /* case OMP_LIST_REDUCTION: */
+ gfc_error ("INTENT(IN) POINTER '%s' in %s clause at %L",
+ n->sym->name, name, where);
+ break;
+ default:
+ break;
+ }
switch (list)
{
- case OMP_LIST_PLUS:
- case OMP_LIST_MULT:
- case OMP_LIST_SUB:
- if (!gfc_numeric_ts (&n->sym->ts))
- gfc_error ("%c REDUCTION variable '%s' at %L must be of numeric type, got %s",
- list == OMP_LIST_PLUS ? '+'
- : list == OMP_LIST_MULT ? '*' : '-',
- n->sym->name, &code->loc,
- gfc_typename (&n->sym->ts));
+ case OMP_LIST_REDUCTION:
+ switch (n->u.reduction_op)
+ {
+ case OMP_REDUCTION_PLUS:
+ case OMP_REDUCTION_TIMES:
+ case OMP_REDUCTION_MINUS:
+ if (!gfc_numeric_ts (&n->sym->ts))
+ bad = true;
+ break;
+ case OMP_REDUCTION_AND:
+ case OMP_REDUCTION_OR:
+ case OMP_REDUCTION_EQV:
+ case OMP_REDUCTION_NEQV:
+ if (n->sym->ts.type != BT_LOGICAL)
+ bad = true;
+ break;
+ case OMP_REDUCTION_MAX:
+ case OMP_REDUCTION_MIN:
+ if (n->sym->ts.type != BT_INTEGER
+ && n->sym->ts.type != BT_REAL)
+ bad = true;
+ break;
+ case OMP_REDUCTION_IAND:
+ case OMP_REDUCTION_IOR:
+ case OMP_REDUCTION_IEOR:
+ if (n->sym->ts.type != BT_INTEGER)
+ bad = true;
+ break;
+ case OMP_REDUCTION_USER:
+ bad = true;
+ break;
+ default:
+ break;
+ }
+ if (!bad)
+ n->udr = NULL;
+ else
+ {
+ const char *udr_name = NULL;
+ if (n->udr)
+ {
+ udr_name = n->udr->udr->name;
+ n->udr->udr
+ = gfc_find_omp_udr (NULL, udr_name,
+ &n->sym->ts);
+ if (n->udr->udr == NULL)
+ {
+ free (n->udr);
+ n->udr = NULL;
+ }
+ }
+ if (n->udr == NULL)
+ {
+ if (udr_name == NULL)
+ switch (n->u.reduction_op)
+ {
+ case OMP_REDUCTION_PLUS:
+ case OMP_REDUCTION_TIMES:
+ case OMP_REDUCTION_MINUS:
+ case OMP_REDUCTION_AND:
+ case OMP_REDUCTION_OR:
+ case OMP_REDUCTION_EQV:
+ case OMP_REDUCTION_NEQV:
+ udr_name = gfc_op2string ((gfc_intrinsic_op)
+ n->u.reduction_op);
+ break;
+ case OMP_REDUCTION_MAX:
+ udr_name = "max";
+ break;
+ case OMP_REDUCTION_MIN:
+ udr_name = "min";
+ break;
+ case OMP_REDUCTION_IAND:
+ udr_name = "iand";
+ break;
+ case OMP_REDUCTION_IOR:
+ udr_name = "ior";
+ break;
+ case OMP_REDUCTION_IEOR:
+ udr_name = "ieor";
+ break;
+ default:
+ gcc_unreachable ();
+ }
+ gfc_error ("!$OMP DECLARE REDUCTION %s not found "
+ "for type %s at %L", udr_name,
+ gfc_typename (&n->sym->ts), where);
+ }
+ else
+ {
+ gfc_omp_udr *udr = n->udr->udr;
+ n->u.reduction_op = OMP_REDUCTION_USER;
+ n->udr->combiner
+ = resolve_omp_udr_clause (n, udr->combiner_ns,
+ udr->omp_out,
+ udr->omp_in);
+ if (udr->initializer_ns)
+ n->udr->initializer
+ = resolve_omp_udr_clause (n,
+ udr->initializer_ns,
+ udr->omp_priv,
+ udr->omp_orig);
+ }
+ }
break;
- case OMP_LIST_AND:
- case OMP_LIST_OR:
- case OMP_LIST_EQV:
- case OMP_LIST_NEQV:
- if (n->sym->ts.type != BT_LOGICAL)
- gfc_error ("%s REDUCTION variable '%s' must be LOGICAL "
- "at %L",
- list == OMP_LIST_AND ? ".AND."
- : list == OMP_LIST_OR ? ".OR."
- : list == OMP_LIST_EQV ? ".EQV." : ".NEQV.",
- n->sym->name, &code->loc);
- break;
- case OMP_LIST_MAX:
- case OMP_LIST_MIN:
- if (n->sym->ts.type != BT_INTEGER
- && n->sym->ts.type != BT_REAL)
- gfc_error ("%s REDUCTION variable '%s' must be "
- "INTEGER or REAL at %L",
- list == OMP_LIST_MAX ? "MAX" : "MIN",
- n->sym->name, &code->loc);
- break;
- case OMP_LIST_IAND:
- case OMP_LIST_IOR:
- case OMP_LIST_IEOR:
+ case OMP_LIST_LINEAR:
if (n->sym->ts.type != BT_INTEGER)
- gfc_error ("%s REDUCTION variable '%s' must be INTEGER "
- "at %L",
- list == OMP_LIST_IAND ? "IAND"
- : list == OMP_LIST_MULT ? "IOR" : "IEOR",
- n->sym->name, &code->loc);
+ gfc_error ("LINEAR variable '%s' must be INTEGER "
+ "at %L", n->sym->name, where);
+ else if (!code && !n->sym->attr.value)
+ gfc_error ("LINEAR dummy argument '%s' must have VALUE "
+ "attribute at %L", n->sym->name, where);
+ else if (n->expr)
+ {
+ gfc_expr *expr = n->expr;
+ if (!gfc_resolve_expr (expr)
+ || expr->ts.type != BT_INTEGER
+ || expr->rank != 0)
+ gfc_error ("'%s' in LINEAR clause at %L requires "
+ "a scalar integer linear-step expression",
+ n->sym->name, where);
+ else if (!code && expr->expr_type != EXPR_CONSTANT)
+ gfc_error ("'%s' in LINEAR clause at %L requires "
+ "a constant integer linear-step expression",
+ n->sym->name, where);
+ }
break;
/* Workaround for PR middle-end/26316, nothing really needs
to be done here for OMP_LIST_PRIVATE. */
case OMP_LIST_PRIVATE:
- gcc_assert (code->op != EXEC_NOP);
+ gcc_assert (code && code->op != EXEC_NOP);
default:
break;
}
break;
}
}
+ if (omp_clauses->safelen_expr)
+ {
+ gfc_expr *expr = omp_clauses->safelen_expr;
+ if (!gfc_resolve_expr (expr)
+ || expr->ts.type != BT_INTEGER || expr->rank != 0)
+ gfc_error ("SAFELEN clause at %L requires a scalar "
+ "INTEGER expression", &expr->where);
+ }
+ if (omp_clauses->simdlen_expr)
+ {
+ gfc_expr *expr = omp_clauses->simdlen_expr;
+ if (!gfc_resolve_expr (expr)
+ || expr->ts.type != BT_INTEGER || expr->rank != 0)
+ gfc_error ("SIMDLEN clause at %L requires a scalar "
+ "INTEGER expression", &expr->where);
+ }
+ if (omp_clauses->num_teams)
+ {
+ gfc_expr *expr = omp_clauses->num_teams;
+ if (!gfc_resolve_expr (expr)
+ || expr->ts.type != BT_INTEGER || expr->rank != 0)
+ gfc_error ("NUM_TEAMS clause at %L requires a scalar "
+ "INTEGER expression", &expr->where);
+ }
+ if (omp_clauses->device)
+ {
+ gfc_expr *expr = omp_clauses->device;
+ if (!gfc_resolve_expr (expr)
+ || expr->ts.type != BT_INTEGER || expr->rank != 0)
+ gfc_error ("DEVICE clause at %L requires a scalar "
+ "INTEGER expression", &expr->where);
+ }
+ if (omp_clauses->dist_chunk_size)
+ {
+ gfc_expr *expr = omp_clauses->dist_chunk_size;
+ if (!gfc_resolve_expr (expr)
+ || expr->ts.type != BT_INTEGER || expr->rank != 0)
+ gfc_error ("DIST_SCHEDULE clause's chunk_size at %L requires "
+ "a scalar INTEGER expression", &expr->where);
+ }
+ if (omp_clauses->thread_limit)
+ {
+ gfc_expr *expr = omp_clauses->thread_limit;
+ if (!gfc_resolve_expr (expr)
+ || expr->ts.type != BT_INTEGER || expr->rank != 0)
+ gfc_error ("THREAD_LIMIT clause at %L requires a scalar "
+ "INTEGER expression", &expr->where);
+ }
}
gfc_code *atomic_code = code;
gfc_symbol *var;
gfc_expr *expr2, *expr2_tmp;
+ gfc_omp_atomic_op aop
+ = (gfc_omp_atomic_op) (atomic_code->ext.omp_atomic & GFC_OMP_ATOMIC_MASK);
code = code->block->next;
gcc_assert (code->op == EXEC_ASSIGN);
- gcc_assert ((atomic_code->ext.omp_atomic != GFC_OMP_ATOMIC_CAPTURE
- && code->next == NULL)
- || (atomic_code->ext.omp_atomic == GFC_OMP_ATOMIC_CAPTURE
+ gcc_assert (((aop != GFC_OMP_ATOMIC_CAPTURE) && code->next == NULL)
+ || ((aop == GFC_OMP_ATOMIC_CAPTURE)
&& code->next != NULL
&& code->next->op == EXEC_ASSIGN
&& code->next->next == NULL));
expr2 = is_conversion (code->expr2, false);
if (expr2 == NULL)
{
- if (atomic_code->ext.omp_atomic == GFC_OMP_ATOMIC_READ
- || atomic_code->ext.omp_atomic == GFC_OMP_ATOMIC_WRITE)
+ if (aop == GFC_OMP_ATOMIC_READ || aop == GFC_OMP_ATOMIC_WRITE)
expr2 = is_conversion (code->expr2, true);
if (expr2 == NULL)
expr2 = code->expr2;
}
- switch (atomic_code->ext.omp_atomic)
+ switch (aop)
{
case GFC_OMP_ATOMIC_READ:
if (expr2->expr_type != EXPR_VARIABLE
break;
}
- if (expr2->expr_type == EXPR_OP)
+ if (var->attr.allocatable)
+ {
+ gfc_error ("!$OMP ATOMIC with ALLOCATABLE variable at %L",
+ &code->loc);
+ return;
+ }
+
+ if (aop == GFC_OMP_ATOMIC_CAPTURE
+ && code->next == NULL
+ && code->expr2->rank == 0
+ && !expr_references_sym (code->expr2, var, NULL))
+ atomic_code->ext.omp_atomic
+ = (gfc_omp_atomic_op) (atomic_code->ext.omp_atomic
+ | GFC_OMP_ATOMIC_SWAP);
+ else if (expr2->expr_type == EXPR_OP)
{
gfc_expr *v = NULL, *e, *c;
gfc_intrinsic_op op = expr2->value.op.op;
&& arg->expr->symtree->n.sym == var)
var_arg = arg;
else if (expr_references_sym (arg->expr, var, NULL))
- gfc_error ("!$OMP ATOMIC intrinsic arguments except one must not "
- "reference '%s' at %L", var->name, &arg->expr->where);
+ {
+ gfc_error ("!$OMP ATOMIC intrinsic arguments except one must "
+ "not reference '%s' at %L",
+ var->name, &arg->expr->where);
+ return;
+ }
if (arg->expr->rank != 0)
- gfc_error ("!$OMP ATOMIC intrinsic arguments must be scalar "
- "at %L", &arg->expr->where);
+ {
+ gfc_error ("!$OMP ATOMIC intrinsic arguments must be scalar "
+ "at %L", &arg->expr->where);
+ return;
+ }
}
if (var_arg == NULL)
}
}
else
- gfc_error ("!$OMP ATOMIC assignment must have an operator or intrinsic "
- "on right hand side at %L", &expr2->where);
+ gfc_error ("!$OMP ATOMIC assignment must have an operator or "
+ "intrinsic on right hand side at %L", &expr2->where);
- if (atomic_code->ext.omp_atomic == GFC_OMP_ATOMIC_CAPTURE && code->next)
+ if (aop == GFC_OMP_ATOMIC_CAPTURE && code->next)
{
code = code->next;
if (code->expr1->expr_type != EXPR_VARIABLE
{
struct omp_context ctx;
gfc_omp_clauses *omp_clauses = code->ext.omp_clauses;
- gfc_namelist *n;
+ gfc_omp_namelist *n;
int list;
ctx.code = code;
omp_current_ctx = &ctx;
for (list = 0; list < OMP_LIST_NUM; list++)
- for (n = omp_clauses->lists[list]; n; n = n->next)
- pointer_set_insert (ctx.sharing_clauses, n->sym);
+ switch (list)
+ {
+ case OMP_LIST_SHARED:
+ case OMP_LIST_PRIVATE:
+ case OMP_LIST_FIRSTPRIVATE:
+ case OMP_LIST_LASTPRIVATE:
+ case OMP_LIST_REDUCTION:
+ case OMP_LIST_LINEAR:
+ for (n = omp_clauses->lists[list]; n; n = n->next)
+ pointer_set_insert (ctx.sharing_clauses, n->sym);
+ break;
+ default:
+ break;
+ }
- if (code->op == EXEC_OMP_PARALLEL_DO)
- gfc_resolve_omp_do_blocks (code, ns);
- else
- gfc_resolve_blocks (code->block, ns);
+ switch (code->op)
+ {
+ case EXEC_OMP_PARALLEL_DO:
+ case EXEC_OMP_PARALLEL_DO_SIMD:
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE:
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO:
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD:
+ case EXEC_OMP_TEAMS_DISTRIBUTE:
+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO:
+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
+ case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD:
+ gfc_resolve_omp_do_blocks (code, ns);
+ break;
+ default:
+ gfc_resolve_blocks (code->block, ns);
+ }
omp_current_ctx = ctx.previous;
pointer_set_destroy (ctx.sharing_clauses);
if (! pointer_set_insert (omp_current_ctx->private_iterators, sym))
{
gfc_omp_clauses *omp_clauses = omp_current_ctx->code->ext.omp_clauses;
- gfc_namelist *p;
+ gfc_omp_namelist *p;
- p = gfc_get_namelist ();
+ p = gfc_get_omp_namelist ();
p->sym = sym;
p->next = omp_clauses->lists[OMP_LIST_PRIVATE];
omp_clauses->lists[OMP_LIST_PRIVATE] = p;
{
gfc_code *do_code, *c;
int list, i, collapse;
- gfc_namelist *n;
+ gfc_omp_namelist *n;
gfc_symbol *dovar;
+ const char *name;
+ bool is_simd = false;
+
+ switch (code->op)
+ {
+ case EXEC_OMP_DISTRIBUTE: name = "!$OMP DISTRIBUTE"; break;
+ case EXEC_OMP_DISTRIBUTE_PARALLEL_DO:
+ name = "!$OMP DISTRIBUTE PARALLEL DO";
+ break;
+ case EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD:
+ name = "!$OMP DISTRIBUTE PARALLEL DO SIMD";
+ is_simd = true;
+ break;
+ case EXEC_OMP_DISTRIBUTE_SIMD:
+ name = "!$OMP DISTRIBUTE SIMD";
+ is_simd = true;
+ break;
+ case EXEC_OMP_DO: name = "!$OMP DO"; break;
+ case EXEC_OMP_DO_SIMD: name = "!$OMP DO SIMD"; is_simd = true; break;
+ case EXEC_OMP_PARALLEL_DO: name = "!$OMP PARALLEL DO"; break;
+ case EXEC_OMP_PARALLEL_DO_SIMD:
+ name = "!$OMP PARALLEL DO SIMD";
+ is_simd = true;
+ break;
+ case EXEC_OMP_SIMD: name = "!$OMP SIMD"; is_simd = true; break;
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE:
+ name = "!$OMP TARGET TEAMS_DISTRIBUTE";
+ break;
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO:
+ name = "!$OMP TARGET TEAMS DISTRIBUTE PARALLEL DO";
+ break;
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
+ name = "!$OMP TARGET TEAMS DISTRIBUTE PARALLEL DO SIMD";
+ is_simd = true;
+ break;
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD:
+ name = "!$OMP TARGET TEAMS DISTRIBUTE SIMD";
+ is_simd = true;
+ break;
+ case EXEC_OMP_TEAMS_DISTRIBUTE: name = "!$OMP TEAMS_DISTRIBUTE"; break;
+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO:
+ name = "!$OMP TEAMS DISTRIBUTE PARALLEL DO";
+ break;
+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
+ name = "!$OMP TEAMS DISTRIBUTE PARALLEL DO SIMD";
+ is_simd = true;
+ break;
+ case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD:
+ name = "!$OMP TEAMS DISTRIBUTE SIMD";
+ is_simd = true;
+ break;
+ default: gcc_unreachable ();
+ }
if (code->ext.omp_clauses)
- resolve_omp_clauses (code);
+ resolve_omp_clauses (code, &code->loc, code->ext.omp_clauses, NULL);
do_code = code->block->next;
collapse = code->ext.omp_clauses->collapse;
{
if (do_code->op == EXEC_DO_WHILE)
{
- gfc_error ("!$OMP DO cannot be a DO WHILE or DO without loop control "
- "at %L", &do_code->loc);
+ gfc_error ("%s cannot be a DO WHILE or DO without loop control "
+ "at %L", name, &do_code->loc);
+ break;
+ }
+ if (do_code->op == EXEC_DO_CONCURRENT)
+ {
+ gfc_error ("%s cannot be a DO CONCURRENT loop at %L", name,
+ &do_code->loc);
break;
}
gcc_assert (do_code->op == EXEC_DO);
if (do_code->ext.iterator->var->ts.type != BT_INTEGER)
- gfc_error ("!$OMP DO iteration variable must be of type integer at %L",
- &do_code->loc);
+ gfc_error ("%s iteration variable must be of type integer at %L",
+ name, &do_code->loc);
dovar = do_code->ext.iterator->var->symtree->n.sym;
if (dovar->attr.threadprivate)
- gfc_error ("!$OMP DO iteration variable must not be THREADPRIVATE "
- "at %L", &do_code->loc);
+ gfc_error ("%s iteration variable must not be THREADPRIVATE "
+ "at %L", name, &do_code->loc);
if (code->ext.omp_clauses)
for (list = 0; list < OMP_LIST_NUM; list++)
- if (list != OMP_LIST_PRIVATE && list != OMP_LIST_LASTPRIVATE)
+ if (!is_simd
+ ? (list != OMP_LIST_PRIVATE && list != OMP_LIST_LASTPRIVATE)
+ : code->ext.omp_clauses->collapse > 1
+ ? (list != OMP_LIST_LASTPRIVATE)
+ : (list != OMP_LIST_LINEAR))
for (n = code->ext.omp_clauses->lists[list]; n; n = n->next)
if (dovar == n->sym)
{
- gfc_error ("!$OMP DO iteration variable present on clause "
- "other than PRIVATE or LASTPRIVATE at %L",
- &do_code->loc);
+ if (!is_simd)
+ gfc_error ("%s iteration variable present on clause "
+ "other than PRIVATE or LASTPRIVATE at %L",
+ name, &do_code->loc);
+ else if (code->ext.omp_clauses->collapse > 1)
+ gfc_error ("%s iteration variable present on clause "
+ "other than LASTPRIVATE at %L",
+ name, &do_code->loc);
+ else
+ gfc_error ("%s iteration variable present on clause "
+ "other than LINEAR at %L",
+ name, &do_code->loc);
break;
}
if (i > 1)
|| gfc_find_sym_in_expr (ivar, do_code->ext.iterator->end)
|| gfc_find_sym_in_expr (ivar, do_code->ext.iterator->step))
{
- gfc_error ("!$OMP DO collapsed loops don't form rectangular iteration space at %L",
- &do_code->loc);
+ gfc_error ("%s collapsed loops don't form rectangular "
+ "iteration space at %L", name, &do_code->loc);
break;
}
if (j < i)
for (c = do_code->next; c; c = c->next)
if (c->op != EXEC_NOP && c->op != EXEC_CONTINUE)
{
- gfc_error ("collapsed !$OMP DO loops not perfectly nested at %L",
- &c->loc);
+ gfc_error ("collapsed %s loops not perfectly nested at %L",
+ name, &c->loc);
break;
}
if (c)
do_code = do_code->block;
if (do_code->op != EXEC_DO && do_code->op != EXEC_DO_WHILE)
{
- gfc_error ("not enough DO loops for collapsed !$OMP DO at %L",
- &code->loc);
+ gfc_error ("not enough DO loops for collapsed %s at %L",
+ name, &code->loc);
break;
}
do_code = do_code->next;
if (do_code == NULL
|| (do_code->op != EXEC_DO && do_code->op != EXEC_DO_WHILE))
{
- gfc_error ("not enough DO loops for collapsed !$OMP DO at %L",
- &code->loc);
+ gfc_error ("not enough DO loops for collapsed %s at %L",
+ name, &code->loc);
break;
}
}
switch (code->op)
{
+ case EXEC_OMP_DISTRIBUTE:
+ case EXEC_OMP_DISTRIBUTE_PARALLEL_DO:
+ case EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD:
+ case EXEC_OMP_DISTRIBUTE_SIMD:
case EXEC_OMP_DO:
+ case EXEC_OMP_DO_SIMD:
case EXEC_OMP_PARALLEL_DO:
+ case EXEC_OMP_PARALLEL_DO_SIMD:
+ case EXEC_OMP_SIMD:
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE:
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO:
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD:
+ case EXEC_OMP_TEAMS_DISTRIBUTE:
+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO:
+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
+ case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD:
resolve_omp_do (code);
break;
- case EXEC_OMP_WORKSHARE:
+ case EXEC_OMP_CANCEL:
case EXEC_OMP_PARALLEL_WORKSHARE:
case EXEC_OMP_PARALLEL:
case EXEC_OMP_PARALLEL_SECTIONS:
case EXEC_OMP_SECTIONS:
case EXEC_OMP_SINGLE:
+ case EXEC_OMP_TARGET:
+ case EXEC_OMP_TARGET_DATA:
+ case EXEC_OMP_TARGET_TEAMS:
case EXEC_OMP_TASK:
+ case EXEC_OMP_TEAMS:
+ case EXEC_OMP_WORKSHARE:
+ if (code->ext.omp_clauses)
+ resolve_omp_clauses (code, &code->loc, code->ext.omp_clauses, NULL);
+ break;
+ case EXEC_OMP_TARGET_UPDATE:
if (code->ext.omp_clauses)
- resolve_omp_clauses (code);
+ resolve_omp_clauses (code, &code->loc, code->ext.omp_clauses, NULL);
+ if (code->ext.omp_clauses == NULL
+ || (code->ext.omp_clauses->lists[OMP_LIST_TO] == NULL
+ && code->ext.omp_clauses->lists[OMP_LIST_FROM] == NULL))
+ gfc_error ("OMP TARGET UPDATE at %L requires at least one TO or "
+ "FROM clause", &code->loc);
break;
case EXEC_OMP_ATOMIC:
resolve_omp_atomic (code);
break;
}
}
+
+/* Resolve !$omp declare simd constructs in NS. */
+
+void
+gfc_resolve_omp_declare_simd (gfc_namespace *ns)
+{
+ gfc_omp_declare_simd *ods;
+
+ for (ods = ns->omp_declare_simd; ods; ods = ods->next)
+ {
+ if (ods->proc_name != ns->proc_name)
+ gfc_error ("!$OMP DECLARE SIMD should refer to containing procedure "
+ "'%s' at %L", ns->proc_name->name, &ods->where);
+ if (ods->clauses)
+ resolve_omp_clauses (NULL, &ods->where, ods->clauses, ns);
+ }
+}
+
+struct omp_udr_callback_data
+{
+ gfc_omp_udr *omp_udr;
+ bool is_initializer;
+};
+
+static int
+omp_udr_callback (gfc_expr **e, int *walk_subtrees ATTRIBUTE_UNUSED,
+ void *data)
+{
+ struct omp_udr_callback_data *cd = (struct omp_udr_callback_data *) data;
+ if ((*e)->expr_type == EXPR_VARIABLE)
+ {
+ if (cd->is_initializer)
+ {
+ if ((*e)->symtree->n.sym != cd->omp_udr->omp_priv
+ && (*e)->symtree->n.sym != cd->omp_udr->omp_orig)
+ gfc_error ("Variable other than OMP_PRIV or OMP_ORIG used in "
+ "INITIALIZER clause of !$OMP DECLARE REDUCTION at %L",
+ &(*e)->where);
+ }
+ else
+ {
+ if ((*e)->symtree->n.sym != cd->omp_udr->omp_out
+ && (*e)->symtree->n.sym != cd->omp_udr->omp_in)
+ gfc_error ("Variable other than OMP_OUT or OMP_IN used in "
+ "combiner of !$OMP DECLARE REDUCTION at %L",
+ &(*e)->where);
+ }
+ }
+ return 0;
+}
+
+/* Resolve !$omp declare reduction constructs. */
+
+static void
+gfc_resolve_omp_udr (gfc_omp_udr *omp_udr)
+{
+ gfc_actual_arglist *a;
+ const char *predef_name = NULL;
+
+ switch (omp_udr->rop)
+ {
+ case OMP_REDUCTION_PLUS:
+ case OMP_REDUCTION_TIMES:
+ case OMP_REDUCTION_MINUS:
+ case OMP_REDUCTION_AND:
+ case OMP_REDUCTION_OR:
+ case OMP_REDUCTION_EQV:
+ case OMP_REDUCTION_NEQV:
+ case OMP_REDUCTION_MAX:
+ case OMP_REDUCTION_USER:
+ break;
+ default:
+ gfc_error ("Invalid operator for !$OMP DECLARE REDUCTION %s at %L",
+ omp_udr->name, &omp_udr->where);
+ return;
+ }
+
+ if (gfc_omp_udr_predef (omp_udr->rop, omp_udr->name,
+ &omp_udr->ts, &predef_name))
+ {
+ if (predef_name)
+ gfc_error_now ("Redefinition of predefined %s "
+ "!$OMP DECLARE REDUCTION at %L",
+ predef_name, &omp_udr->where);
+ else
+ gfc_error_now ("Redefinition of predefined "
+ "!$OMP DECLARE REDUCTION at %L", &omp_udr->where);
+ return;
+ }
+
+ if (omp_udr->ts.type == BT_CHARACTER
+ && omp_udr->ts.u.cl->length
+ && omp_udr->ts.u.cl->length->expr_type != EXPR_CONSTANT)
+ {
+ gfc_error ("CHARACTER length in !$OMP DECLARE REDUCTION %s not "
+ "constant at %L", omp_udr->name, &omp_udr->where);
+ return;
+ }
+
+ struct omp_udr_callback_data cd;
+ cd.omp_udr = omp_udr;
+ cd.is_initializer = false;
+ gfc_code_walker (&omp_udr->combiner_ns->code, gfc_dummy_code_callback,
+ omp_udr_callback, &cd);
+ if (omp_udr->combiner_ns->code->op == EXEC_CALL)
+ {
+ for (a = omp_udr->combiner_ns->code->ext.actual; a; a = a->next)
+ if (a->expr == NULL)
+ break;
+ if (a)
+ gfc_error ("Subroutine call with alternate returns in combiner "
+ "of !$OMP DECLARE REDUCTION at %L",
+ &omp_udr->combiner_ns->code->loc);
+ }
+ if (omp_udr->initializer_ns)
+ {
+ cd.is_initializer = true;
+ gfc_code_walker (&omp_udr->initializer_ns->code, gfc_dummy_code_callback,
+ omp_udr_callback, &cd);
+ if (omp_udr->initializer_ns->code->op == EXEC_CALL)
+ {
+ for (a = omp_udr->initializer_ns->code->ext.actual; a; a = a->next)
+ if (a->expr == NULL)
+ break;
+ if (a)
+ gfc_error ("Subroutine call with alternate returns in "
+ "INITIALIZER clause of !$OMP DECLARE REDUCTION "
+ "at %L", &omp_udr->initializer_ns->code->loc);
+ for (a = omp_udr->initializer_ns->code->ext.actual; a; a = a->next)
+ if (a->expr
+ && a->expr->expr_type == EXPR_VARIABLE
+ && a->expr->symtree->n.sym == omp_udr->omp_priv
+ && a->expr->ref == NULL)
+ break;
+ if (a == NULL)
+ gfc_error ("One of actual subroutine arguments in INITIALIZER "
+ "clause of !$OMP DECLARE REDUCTION must be OMP_PRIV "
+ "at %L", &omp_udr->initializer_ns->code->loc);
+ }
+ }
+ else if (omp_udr->ts.type == BT_DERIVED
+ && !gfc_has_default_initializer (omp_udr->ts.u.derived))
+ {
+ gfc_error ("Missing INITIALIZER clause for !$OMP DECLARE REDUCTION "
+ "of derived type without default initializer at %L",
+ &omp_udr->where);
+ return;
+ }
+}
+
+void
+gfc_resolve_omp_udrs (gfc_symtree *st)
+{
+ gfc_omp_udr *omp_udr;
+
+ if (st == NULL)
+ return;
+ gfc_resolve_omp_udrs (st->left);
+ gfc_resolve_omp_udrs (st->right);
+ for (omp_udr = st->n.omp_udr; omp_udr; omp_udr = omp_udr->next)
+ gfc_resolve_omp_udr (omp_udr);
+}
}
+/* Like match_word, but if str is matched, set a flag that it
+ was matched. */
+static match
+match_word_omp_simd (const char *str, match (*subr) (void), locus *old_locus,
+ bool *simd_matched)
+{
+ match m;
+
+ if (str != NULL)
+ {
+ m = gfc_match (str);
+ if (m != MATCH_YES)
+ return m;
+ *simd_matched = true;
+ }
+
+ m = (*subr) ();
+
+ if (m != MATCH_YES)
+ {
+ gfc_current_locus = *old_locus;
+ reject_statement ();
+ }
+
+ return m;
+}
+
+
/* Load symbols from all USE statements encountered in this scoping unit. */
static void
if (match_word (keyword, subr, &old_locus) == MATCH_YES) \
return st; \
else \
- undo_new_statement (); \
+ undo_new_statement (); \
} while (0);
return ST_NONE;
}
+/* Like match, but set a flag simd_matched if keyword matched. */
+#define matchs(keyword, subr, st) \
+ do { \
+ if (match_word_omp_simd (keyword, subr, &old_locus, \
+ &simd_matched) == MATCH_YES) \
+ return st; \
+ else \
+ undo_new_statement (); \
+ } while (0);
+
+/* Like match, but don't match anything if not -fopenmp. */
+#define matcho(keyword, subr, st) \
+ do { \
+ if (!gfc_option.gfc_flag_openmp) \
+ ; \
+ else if (match_word (keyword, subr, &old_locus) \
+ == MATCH_YES) \
+ return st; \
+ else \
+ undo_new_statement (); \
+ } while (0);
+
static gfc_statement
decode_omp_directive (void)
{
locus old_locus;
char c;
+ bool simd_matched = false;
gfc_enforce_clean_symbol_state ();
c = gfc_peek_ascii_char ();
+ /* match is for directives that should be recognized only if
+ -fopenmp, matchs for directives that should be recognized
+ if either -fopenmp or -fopenmp-simd. */
switch (c)
{
case 'a':
- match ("atomic", gfc_match_omp_atomic, ST_OMP_ATOMIC);
+ matcho ("atomic", gfc_match_omp_atomic, ST_OMP_ATOMIC);
break;
case 'b':
- match ("barrier", gfc_match_omp_barrier, ST_OMP_BARRIER);
+ matcho ("barrier", gfc_match_omp_barrier, ST_OMP_BARRIER);
break;
case 'c':
- match ("critical", gfc_match_omp_critical, ST_OMP_CRITICAL);
+ matcho ("cancellation% point", gfc_match_omp_cancellation_point,
+ ST_OMP_CANCELLATION_POINT);
+ matcho ("cancel", gfc_match_omp_cancel, ST_OMP_CANCEL);
+ matcho ("critical", gfc_match_omp_critical, ST_OMP_CRITICAL);
break;
case 'd':
- match ("do", gfc_match_omp_do, ST_OMP_DO);
+ matchs ("declare reduction", gfc_match_omp_declare_reduction,
+ ST_OMP_DECLARE_REDUCTION);
+ matchs ("declare simd", gfc_match_omp_declare_simd,
+ ST_OMP_DECLARE_SIMD);
+ matcho ("declare target", gfc_match_omp_declare_target,
+ ST_OMP_DECLARE_TARGET);
+ matchs ("distribute parallel do simd",
+ gfc_match_omp_distribute_parallel_do_simd,
+ ST_OMP_DISTRIBUTE_PARALLEL_DO_SIMD);
+ matcho ("distribute parallel do", gfc_match_omp_distribute_parallel_do,
+ ST_OMP_DISTRIBUTE_PARALLEL_DO);
+ matchs ("distribute simd", gfc_match_omp_distribute_simd,
+ ST_OMP_DISTRIBUTE_SIMD);
+ matcho ("distribute", gfc_match_omp_distribute, ST_OMP_DISTRIBUTE);
+ matchs ("do simd", gfc_match_omp_do_simd, ST_OMP_DO_SIMD);
+ matcho ("do", gfc_match_omp_do, ST_OMP_DO);
break;
case 'e':
- match ("end atomic", gfc_match_omp_eos, ST_OMP_END_ATOMIC);
- match ("end critical", gfc_match_omp_critical, ST_OMP_END_CRITICAL);
- match ("end do", gfc_match_omp_end_nowait, ST_OMP_END_DO);
- match ("end master", gfc_match_omp_eos, ST_OMP_END_MASTER);
- match ("end ordered", gfc_match_omp_eos, ST_OMP_END_ORDERED);
- match ("end parallel do", gfc_match_omp_eos, ST_OMP_END_PARALLEL_DO);
- match ("end parallel sections", gfc_match_omp_eos,
- ST_OMP_END_PARALLEL_SECTIONS);
- match ("end parallel workshare", gfc_match_omp_eos,
- ST_OMP_END_PARALLEL_WORKSHARE);
- match ("end parallel", gfc_match_omp_eos, ST_OMP_END_PARALLEL);
- match ("end sections", gfc_match_omp_end_nowait, ST_OMP_END_SECTIONS);
- match ("end single", gfc_match_omp_end_single, ST_OMP_END_SINGLE);
- match ("end task", gfc_match_omp_eos, ST_OMP_END_TASK);
- match ("end workshare", gfc_match_omp_end_nowait,
- ST_OMP_END_WORKSHARE);
+ matcho ("end atomic", gfc_match_omp_eos, ST_OMP_END_ATOMIC);
+ matcho ("end critical", gfc_match_omp_critical, ST_OMP_END_CRITICAL);
+ matchs ("end distribute parallel do simd", gfc_match_omp_eos,
+ ST_OMP_END_DISTRIBUTE_PARALLEL_DO_SIMD);
+ matcho ("end distribute parallel do", gfc_match_omp_eos,
+ ST_OMP_END_DISTRIBUTE_PARALLEL_DO);
+ matchs ("end distribute simd", gfc_match_omp_eos,
+ ST_OMP_END_DISTRIBUTE_SIMD);
+ matcho ("end distribute", gfc_match_omp_eos, ST_OMP_END_DISTRIBUTE);
+ matchs ("end do simd", gfc_match_omp_end_nowait, ST_OMP_END_DO_SIMD);
+ matcho ("end do", gfc_match_omp_end_nowait, ST_OMP_END_DO);
+ matchs ("end simd", gfc_match_omp_eos, ST_OMP_END_SIMD);
+ matcho ("end master", gfc_match_omp_eos, ST_OMP_END_MASTER);
+ matcho ("end ordered", gfc_match_omp_eos, ST_OMP_END_ORDERED);
+ matchs ("end parallel do simd", gfc_match_omp_eos,
+ ST_OMP_END_PARALLEL_DO_SIMD);
+ matcho ("end parallel do", gfc_match_omp_eos, ST_OMP_END_PARALLEL_DO);
+ matcho ("end parallel sections", gfc_match_omp_eos,
+ ST_OMP_END_PARALLEL_SECTIONS);
+ matcho ("end parallel workshare", gfc_match_omp_eos,
+ ST_OMP_END_PARALLEL_WORKSHARE);
+ matcho ("end parallel", gfc_match_omp_eos, ST_OMP_END_PARALLEL);
+ matcho ("end sections", gfc_match_omp_end_nowait, ST_OMP_END_SECTIONS);
+ matcho ("end single", gfc_match_omp_end_single, ST_OMP_END_SINGLE);
+ matcho ("end target data", gfc_match_omp_eos, ST_OMP_END_TARGET_DATA);
+ matchs ("end target teams distribute parallel do simd",
+ gfc_match_omp_eos,
+ ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD);
+ matcho ("end target teams distribute parallel do", gfc_match_omp_eos,
+ ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO);
+ matchs ("end target teams distribute simd", gfc_match_omp_eos,
+ ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_SIMD);
+ matcho ("end target teams distribute", gfc_match_omp_eos,
+ ST_OMP_END_TARGET_TEAMS_DISTRIBUTE);
+ matcho ("end target teams", gfc_match_omp_eos, ST_OMP_END_TARGET_TEAMS);
+ matcho ("end target", gfc_match_omp_eos, ST_OMP_END_TARGET);
+ matcho ("end taskgroup", gfc_match_omp_eos, ST_OMP_END_TASKGROUP);
+ matcho ("end task", gfc_match_omp_eos, ST_OMP_END_TASK);
+ matchs ("end teams distribute parallel do simd", gfc_match_omp_eos,
+ ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD);
+ matcho ("end teams distribute parallel do", gfc_match_omp_eos,
+ ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO);
+ matchs ("end teams distribute simd", gfc_match_omp_eos,
+ ST_OMP_END_TEAMS_DISTRIBUTE_SIMD);
+ matcho ("end teams distribute", gfc_match_omp_eos,
+ ST_OMP_END_TEAMS_DISTRIBUTE);
+ matcho ("end teams", gfc_match_omp_eos, ST_OMP_END_TEAMS);
+ matcho ("end workshare", gfc_match_omp_end_nowait,
+ ST_OMP_END_WORKSHARE);
break;
case 'f':
- match ("flush", gfc_match_omp_flush, ST_OMP_FLUSH);
+ matcho ("flush", gfc_match_omp_flush, ST_OMP_FLUSH);
break;
case 'm':
- match ("master", gfc_match_omp_master, ST_OMP_MASTER);
+ matcho ("master", gfc_match_omp_master, ST_OMP_MASTER);
break;
case 'o':
- match ("ordered", gfc_match_omp_ordered, ST_OMP_ORDERED);
+ matcho ("ordered", gfc_match_omp_ordered, ST_OMP_ORDERED);
break;
case 'p':
- match ("parallel do", gfc_match_omp_parallel_do, ST_OMP_PARALLEL_DO);
- match ("parallel sections", gfc_match_omp_parallel_sections,
- ST_OMP_PARALLEL_SECTIONS);
- match ("parallel workshare", gfc_match_omp_parallel_workshare,
- ST_OMP_PARALLEL_WORKSHARE);
- match ("parallel", gfc_match_omp_parallel, ST_OMP_PARALLEL);
+ matchs ("parallel do simd", gfc_match_omp_parallel_do_simd,
+ ST_OMP_PARALLEL_DO_SIMD);
+ matcho ("parallel do", gfc_match_omp_parallel_do, ST_OMP_PARALLEL_DO);
+ matcho ("parallel sections", gfc_match_omp_parallel_sections,
+ ST_OMP_PARALLEL_SECTIONS);
+ matcho ("parallel workshare", gfc_match_omp_parallel_workshare,
+ ST_OMP_PARALLEL_WORKSHARE);
+ matcho ("parallel", gfc_match_omp_parallel, ST_OMP_PARALLEL);
break;
case 's':
- match ("sections", gfc_match_omp_sections, ST_OMP_SECTIONS);
- match ("section", gfc_match_omp_eos, ST_OMP_SECTION);
- match ("single", gfc_match_omp_single, ST_OMP_SINGLE);
+ matcho ("sections", gfc_match_omp_sections, ST_OMP_SECTIONS);
+ matcho ("section", gfc_match_omp_eos, ST_OMP_SECTION);
+ matchs ("simd", gfc_match_omp_simd, ST_OMP_SIMD);
+ matcho ("single", gfc_match_omp_single, ST_OMP_SINGLE);
break;
case 't':
- match ("task", gfc_match_omp_task, ST_OMP_TASK);
- match ("taskwait", gfc_match_omp_taskwait, ST_OMP_TASKWAIT);
- match ("taskyield", gfc_match_omp_taskyield, ST_OMP_TASKYIELD);
- match ("threadprivate", gfc_match_omp_threadprivate,
- ST_OMP_THREADPRIVATE);
+ matcho ("target data", gfc_match_omp_target_data, ST_OMP_TARGET_DATA);
+ matchs ("target teams distribute parallel do simd",
+ gfc_match_omp_target_teams_distribute_parallel_do_simd,
+ ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD);
+ matcho ("target teams distribute parallel do",
+ gfc_match_omp_target_teams_distribute_parallel_do,
+ ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO);
+ matchs ("target teams distribute simd",
+ gfc_match_omp_target_teams_distribute_simd,
+ ST_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD);
+ matcho ("target teams distribute", gfc_match_omp_target_teams_distribute,
+ ST_OMP_TARGET_TEAMS_DISTRIBUTE);
+ matcho ("target teams", gfc_match_omp_target_teams, ST_OMP_TARGET_TEAMS);
+ matcho ("target update", gfc_match_omp_target_update,
+ ST_OMP_TARGET_UPDATE);
+ matcho ("target", gfc_match_omp_target, ST_OMP_TARGET);
+ matcho ("taskgroup", gfc_match_omp_taskgroup, ST_OMP_TASKGROUP);
+ matcho ("taskwait", gfc_match_omp_taskwait, ST_OMP_TASKWAIT);
+ matcho ("taskyield", gfc_match_omp_taskyield, ST_OMP_TASKYIELD);
+ matcho ("task", gfc_match_omp_task, ST_OMP_TASK);
+ matchs ("teams distribute parallel do simd",
+ gfc_match_omp_teams_distribute_parallel_do_simd,
+ ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD);
+ matcho ("teams distribute parallel do",
+ gfc_match_omp_teams_distribute_parallel_do,
+ ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO);
+ matchs ("teams distribute simd", gfc_match_omp_teams_distribute_simd,
+ ST_OMP_TEAMS_DISTRIBUTE_SIMD);
+ matcho ("teams distribute", gfc_match_omp_teams_distribute,
+ ST_OMP_TEAMS_DISTRIBUTE);
+ matcho ("teams", gfc_match_omp_teams, ST_OMP_TEAMS);
+ matcho ("threadprivate", gfc_match_omp_threadprivate,
+ ST_OMP_THREADPRIVATE);
break;
case 'w':
- match ("workshare", gfc_match_omp_workshare, ST_OMP_WORKSHARE);
+ matcho ("workshare", gfc_match_omp_workshare, ST_OMP_WORKSHARE);
break;
}
/* All else has failed, so give up. See if any of the matchers has
- stored an error message of some sort. */
+ stored an error message of some sort. Don't error out if
+ not -fopenmp and simd_matched is false, i.e. if a directive other
+ than one marked with match has been seen. */
- if (gfc_error_check () == 0)
- gfc_error_now ("Unclassifiable OpenMP directive at %C");
+ if (gfc_option.gfc_flag_openmp || simd_matched)
+ {
+ if (gfc_error_check () == 0)
+ gfc_error_now ("Unclassifiable OpenMP directive at %C");
+ }
reject_statement ();
return decode_gcc_attribute ();
}
- else if (c == '$' && gfc_option.gfc_flag_openmp)
+ else if (c == '$'
+ && (gfc_option.gfc_flag_openmp
+ || gfc_option.gfc_flag_openmp_simd))
{
int i;
return decode_gcc_attribute ();
}
- else if (c == '$' && gfc_option.gfc_flag_openmp)
+ else if (c == '$'
+ && (gfc_option.gfc_flag_openmp
+ || gfc_option.gfc_flag_openmp_simd))
{
for (i = 0; i < 4; i++, c = gfc_next_char_literal (NONSTRING))
gcc_assert ((char) gfc_wide_tolower (c) == "$omp"[i]);
case ST_ASSIGNMENT: case ST_ARITHMETIC_IF: case ST_WHERE: case ST_FORALL: \
case ST_LABEL_ASSIGNMENT: case ST_FLUSH: case ST_OMP_FLUSH: \
case ST_OMP_BARRIER: case ST_OMP_TASKWAIT: case ST_OMP_TASKYIELD: \
- case ST_ERROR_STOP: case ST_SYNC_ALL: case ST_SYNC_IMAGES: \
- case ST_SYNC_MEMORY: case ST_LOCK: case ST_UNLOCK
+ case ST_OMP_CANCEL: case ST_OMP_CANCELLATION_POINT: \
+ case ST_OMP_TARGET_UPDATE: case ST_ERROR_STOP: case ST_SYNC_ALL: \
+ case ST_SYNC_IMAGES: case ST_SYNC_MEMORY: case ST_LOCK: case ST_UNLOCK
/* Statements that mark other executable statements. */
case ST_OMP_CRITICAL: case ST_OMP_MASTER: case ST_OMP_SINGLE: \
case ST_OMP_DO: case ST_OMP_PARALLEL_DO: case ST_OMP_ATOMIC: \
case ST_OMP_WORKSHARE: case ST_OMP_PARALLEL_WORKSHARE: \
- case ST_OMP_TASK: case ST_CRITICAL
+ case ST_OMP_TASK: case ST_OMP_TASKGROUP: case ST_OMP_SIMD: \
+ case ST_OMP_DO_SIMD: case ST_OMP_PARALLEL_DO_SIMD: case ST_OMP_TARGET: \
+ case ST_OMP_TARGET_DATA: case ST_OMP_TARGET_TEAMS: \
+ case ST_OMP_TARGET_TEAMS_DISTRIBUTE: \
+ case ST_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD: \
+ case ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO: \
+ case ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: \
+ case ST_OMP_TEAMS: case ST_OMP_TEAMS_DISTRIBUTE: \
+ case ST_OMP_TEAMS_DISTRIBUTE_SIMD: \
+ case ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO: \
+ case ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD: case ST_OMP_DISTRIBUTE: \
+ case ST_OMP_DISTRIBUTE_SIMD: case ST_OMP_DISTRIBUTE_PARALLEL_DO: \
+ case ST_OMP_DISTRIBUTE_PARALLEL_DO_SIMD: \
+ case ST_CRITICAL
/* Declaration statements */
#define case_decl case ST_ATTR_DECL: case ST_COMMON: case ST_DATA_DECL: \
case ST_EQUIVALENCE: case ST_NAMELIST: case ST_STATEMENT_FUNCTION: \
case ST_TYPE: case ST_INTERFACE: case ST_OMP_THREADPRIVATE: \
- case ST_PROCEDURE
+ case ST_PROCEDURE: case ST_OMP_DECLARE_SIMD: case ST_OMP_DECLARE_REDUCTION: \
+ case ST_OMP_DECLARE_TARGET
/* Block end statements. Errors associated with interchanging these
are detected in gfc_match_end(). */
case ST_OMP_BARRIER:
p = "!$OMP BARRIER";
break;
+ case ST_OMP_CANCEL:
+ p = "!$OMP CANCEL";
+ break;
+ case ST_OMP_CANCELLATION_POINT:
+ p = "!$OMP CANCELLATION POINT";
+ break;
case ST_OMP_CRITICAL:
p = "!$OMP CRITICAL";
break;
+ case ST_OMP_DECLARE_REDUCTION:
+ p = "!$OMP DECLARE REDUCTION";
+ break;
+ case ST_OMP_DECLARE_SIMD:
+ p = "!$OMP DECLARE SIMD";
+ break;
+ case ST_OMP_DECLARE_TARGET:
+ p = "!$OMP DECLARE TARGET";
+ break;
+ case ST_OMP_DISTRIBUTE:
+ p = "!$OMP DISTRIBUTE";
+ break;
+ case ST_OMP_DISTRIBUTE_PARALLEL_DO:
+ p = "!$OMP DISTRIBUTE PARALLEL DO";
+ break;
+ case ST_OMP_DISTRIBUTE_PARALLEL_DO_SIMD:
+ p = "!$OMP DISTRIBUTE PARALLEL DO SIMD";
+ break;
+ case ST_OMP_DISTRIBUTE_SIMD:
+ p = "!$OMP DISTRIBUTE SIMD";
+ break;
case ST_OMP_DO:
p = "!$OMP DO";
break;
+ case ST_OMP_DO_SIMD:
+ p = "!$OMP DO SIMD";
+ break;
case ST_OMP_END_ATOMIC:
p = "!$OMP END ATOMIC";
break;
case ST_OMP_END_CRITICAL:
p = "!$OMP END CRITICAL";
break;
+ case ST_OMP_END_DISTRIBUTE:
+ p = "!$OMP END DISTRIBUTE";
+ break;
+ case ST_OMP_END_DISTRIBUTE_PARALLEL_DO:
+ p = "!$OMP END DISTRIBUTE PARALLEL DO";
+ break;
+ case ST_OMP_END_DISTRIBUTE_PARALLEL_DO_SIMD:
+ p = "!$OMP END DISTRIBUTE PARALLEL DO SIMD";
+ break;
+ case ST_OMP_END_DISTRIBUTE_SIMD:
+ p = "!$OMP END DISTRIBUTE SIMD";
+ break;
case ST_OMP_END_DO:
p = "!$OMP END DO";
break;
+ case ST_OMP_END_DO_SIMD:
+ p = "!$OMP END DO SIMD";
+ break;
+ case ST_OMP_END_SIMD:
+ p = "!$OMP END SIMD";
+ break;
case ST_OMP_END_MASTER:
p = "!$OMP END MASTER";
break;
case ST_OMP_END_PARALLEL_DO:
p = "!$OMP END PARALLEL DO";
break;
+ case ST_OMP_END_PARALLEL_DO_SIMD:
+ p = "!$OMP END PARALLEL DO SIMD";
+ break;
case ST_OMP_END_PARALLEL_SECTIONS:
p = "!$OMP END PARALLEL SECTIONS";
break;
case ST_OMP_END_TASK:
p = "!$OMP END TASK";
break;
+ case ST_OMP_END_TARGET:
+ p = "!$OMP END TARGET";
+ break;
+ case ST_OMP_END_TARGET_DATA:
+ p = "!$OMP END TARGET DATA";
+ break;
+ case ST_OMP_END_TARGET_TEAMS:
+ p = "!$OMP END TARGET TEAMS";
+ break;
+ case ST_OMP_END_TARGET_TEAMS_DISTRIBUTE:
+ p = "!$OMP END TARGET TEAMS DISTRIBUTE";
+ break;
+ case ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO:
+ p = "!$OMP END TARGET TEAMS DISTRIBUTE PARALLEL DO";
+ break;
+ case ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
+ p = "!$OMP END TARGET TEAMS DISTRIBUTE PARALLEL DO SIMD";
+ break;
+ case ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_SIMD:
+ p = "!$OMP END TARGET TEAMS DISTRIBUTE SIMD";
+ break;
+ case ST_OMP_END_TASKGROUP:
+ p = "!$OMP END TASKGROUP";
+ break;
+ case ST_OMP_END_TEAMS:
+ p = "!$OMP END TEAMS";
+ break;
+ case ST_OMP_END_TEAMS_DISTRIBUTE:
+ p = "!$OMP END TEAMS DISTRIBUTE";
+ break;
+ case ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO:
+ p = "!$OMP END TEAMS DISTRIBUTE PARALLEL DO";
+ break;
+ case ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
+ p = "!$OMP END TEAMS DISTRIBUTE PARALLEL DO SIMD";
+ break;
+ case ST_OMP_END_TEAMS_DISTRIBUTE_SIMD:
+ p = "!$OMP END TEAMS DISTRIBUTE SIMD";
+ break;
case ST_OMP_END_WORKSHARE:
p = "!$OMP END WORKSHARE";
break;
case ST_OMP_PARALLEL_DO:
p = "!$OMP PARALLEL DO";
break;
+ case ST_OMP_PARALLEL_DO_SIMD:
+ p = "!$OMP PARALLEL DO SIMD";
+ break;
case ST_OMP_PARALLEL_SECTIONS:
p = "!$OMP PARALLEL SECTIONS";
break;
case ST_OMP_SECTION:
p = "!$OMP SECTION";
break;
+ case ST_OMP_SIMD:
+ p = "!$OMP SIMD";
+ break;
case ST_OMP_SINGLE:
p = "!$OMP SINGLE";
break;
+ case ST_OMP_TARGET:
+ p = "!$OMP TARGET";
+ break;
+ case ST_OMP_TARGET_DATA:
+ p = "!$OMP TARGET DATA";
+ break;
+ case ST_OMP_TARGET_TEAMS:
+ p = "!$OMP TARGET TEAMS";
+ break;
+ case ST_OMP_TARGET_TEAMS_DISTRIBUTE:
+ p = "!$OMP TARGET TEAMS DISTRIBUTE";
+ break;
+ case ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO:
+ p = "!$OMP TARGET TEAMS DISTRIBUTE PARALLEL DO";
+ break;
+ case ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
+ p = "!$OMP TARGET TEAMS DISTRIBUTE PARALLEL DO SIMD";
+ break;
+ case ST_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD:
+ p = "!$OMP TARGET TEAMS DISTRIBUTE SIMD";
+ break;
+ case ST_OMP_TARGET_UPDATE:
+ p = "!$OMP TARGET UPDATE";
+ break;
case ST_OMP_TASK:
p = "!$OMP TASK";
break;
+ case ST_OMP_TASKGROUP:
+ p = "!$OMP TASKGROUP";
+ break;
case ST_OMP_TASKWAIT:
p = "!$OMP TASKWAIT";
break;
case ST_OMP_TASKYIELD:
p = "!$OMP TASKYIELD";
break;
+ case ST_OMP_TEAMS:
+ p = "!$OMP TEAMS";
+ break;
+ case ST_OMP_TEAMS_DISTRIBUTE:
+ p = "!$OMP TEAMS DISTRIBUTE";
+ break;
+ case ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO:
+ p = "!$OMP TEAMS DISTRIBUTE PARALLEL DO";
+ break;
+ case ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
+ p = "!$OMP TEAMS DISTRIBUTE PARALLEL DO SIMD";
+ break;
+ case ST_OMP_TEAMS_DISTRIBUTE_SIMD:
+ p = "!$OMP TEAMS DISTRIBUTE SIMD";
+ break;
case ST_OMP_THREADPRIVATE:
p = "!$OMP THREADPRIVATE";
break;
pop_state ();
st = next_statement ();
- if (st == (omp_st == ST_OMP_DO ? ST_OMP_END_DO : ST_OMP_END_PARALLEL_DO))
+ gfc_statement omp_end_st = ST_OMP_END_DO;
+ switch (omp_st)
+ {
+ case ST_OMP_DISTRIBUTE: omp_end_st = ST_OMP_END_DISTRIBUTE; break;
+ case ST_OMP_DISTRIBUTE_PARALLEL_DO:
+ omp_end_st = ST_OMP_END_DISTRIBUTE_PARALLEL_DO;
+ break;
+ case ST_OMP_DISTRIBUTE_PARALLEL_DO_SIMD:
+ omp_end_st = ST_OMP_END_DISTRIBUTE_PARALLEL_DO_SIMD;
+ break;
+ case ST_OMP_DISTRIBUTE_SIMD:
+ omp_end_st = ST_OMP_END_DISTRIBUTE_SIMD;
+ break;
+ case ST_OMP_DO: omp_end_st = ST_OMP_END_DO; break;
+ case ST_OMP_DO_SIMD: omp_end_st = ST_OMP_END_DO_SIMD; break;
+ case ST_OMP_PARALLEL_DO: omp_end_st = ST_OMP_END_PARALLEL_DO; break;
+ case ST_OMP_PARALLEL_DO_SIMD:
+ omp_end_st = ST_OMP_END_PARALLEL_DO_SIMD;
+ break;
+ case ST_OMP_SIMD: omp_end_st = ST_OMP_END_SIMD; break;
+ case ST_OMP_TARGET_TEAMS_DISTRIBUTE:
+ omp_end_st = ST_OMP_END_TARGET_TEAMS_DISTRIBUTE;
+ break;
+ case ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO:
+ omp_end_st = ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO;
+ break;
+ case ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
+ omp_end_st = ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD;
+ break;
+ case ST_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD:
+ omp_end_st = ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_SIMD;
+ break;
+ case ST_OMP_TEAMS_DISTRIBUTE:
+ omp_end_st = ST_OMP_END_TEAMS_DISTRIBUTE;
+ break;
+ case ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO:
+ omp_end_st = ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO;
+ break;
+ case ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
+ omp_end_st = ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD;
+ break;
+ case ST_OMP_TEAMS_DISTRIBUTE_SIMD:
+ omp_end_st = ST_OMP_END_TEAMS_DISTRIBUTE_SIMD;
+ break;
+ default: gcc_unreachable ();
+ }
+ if (st == omp_end_st)
{
if (new_st.op == EXEC_OMP_END_NOWAIT)
cp->ext.omp_clauses->nowait |= new_st.ext.omp_bool;
np = new_level (cp);
np->op = cp->op;
np->block = NULL;
- count = 1 + (cp->ext.omp_atomic == GFC_OMP_ATOMIC_CAPTURE);
+ count = 1 + ((cp->ext.omp_atomic & GFC_OMP_ATOMIC_MASK)
+ == GFC_OMP_ATOMIC_CAPTURE);
while (count)
{
gfc_warning_check ();
st = next_statement ();
}
- else if (cp->ext.omp_atomic == GFC_OMP_ATOMIC_CAPTURE)
+ else if ((cp->ext.omp_atomic & GFC_OMP_ATOMIC_MASK)
+ == GFC_OMP_ATOMIC_CAPTURE)
gfc_error ("Missing !$OMP END ATOMIC after !$OMP ATOMIC CAPTURE at %C");
return st;
}
case ST_OMP_SINGLE:
omp_end_st = ST_OMP_END_SINGLE;
break;
+ case ST_OMP_TARGET:
+ omp_end_st = ST_OMP_END_TARGET;
+ break;
+ case ST_OMP_TARGET_DATA:
+ omp_end_st = ST_OMP_END_TARGET_DATA;
+ break;
+ case ST_OMP_TARGET_TEAMS:
+ omp_end_st = ST_OMP_END_TARGET_TEAMS;
+ break;
+ case ST_OMP_TARGET_TEAMS_DISTRIBUTE:
+ omp_end_st = ST_OMP_END_TARGET_TEAMS_DISTRIBUTE;
+ break;
+ case ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO:
+ omp_end_st = ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO;
+ break;
+ case ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
+ omp_end_st = ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD;
+ break;
+ case ST_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD:
+ omp_end_st = ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_SIMD;
+ break;
case ST_OMP_TASK:
omp_end_st = ST_OMP_END_TASK;
break;
+ case ST_OMP_TASKGROUP:
+ omp_end_st = ST_OMP_END_TASKGROUP;
+ break;
+ case ST_OMP_TEAMS:
+ omp_end_st = ST_OMP_END_TEAMS;
+ break;
+ case ST_OMP_TEAMS_DISTRIBUTE:
+ omp_end_st = ST_OMP_END_TEAMS_DISTRIBUTE;
+ break;
+ case ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO:
+ omp_end_st = ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO;
+ break;
+ case ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
+ omp_end_st = ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD;
+ break;
+ case ST_OMP_TEAMS_DISTRIBUTE_SIMD:
+ omp_end_st = ST_OMP_END_TEAMS_DISTRIBUTE_SIMD;
+ break;
+ case ST_OMP_DISTRIBUTE:
+ omp_end_st = ST_OMP_END_DISTRIBUTE;
+ break;
+ case ST_OMP_DISTRIBUTE_PARALLEL_DO:
+ omp_end_st = ST_OMP_END_DISTRIBUTE_PARALLEL_DO;
+ break;
+ case ST_OMP_DISTRIBUTE_PARALLEL_DO_SIMD:
+ omp_end_st = ST_OMP_END_DISTRIBUTE_PARALLEL_DO_SIMD;
+ break;
+ case ST_OMP_DISTRIBUTE_SIMD:
+ omp_end_st = ST_OMP_END_DISTRIBUTE_SIMD;
+ break;
case ST_OMP_WORKSHARE:
omp_end_st = ST_OMP_END_WORKSHARE;
break;
break;
case ST_OMP_PARALLEL_DO:
+ case ST_OMP_PARALLEL_DO_SIMD:
st = parse_omp_do (st);
continue;
case ST_OMP_CRITICAL:
case ST_OMP_MASTER:
case ST_OMP_SINGLE:
+ case ST_OMP_TARGET:
+ case ST_OMP_TARGET_DATA:
+ case ST_OMP_TARGET_TEAMS:
+ case ST_OMP_TEAMS:
case ST_OMP_TASK:
+ case ST_OMP_TASKGROUP:
parse_omp_structured_block (st, false);
break;
parse_omp_structured_block (st, true);
break;
+ case ST_OMP_DISTRIBUTE:
+ case ST_OMP_DISTRIBUTE_PARALLEL_DO:
+ case ST_OMP_DISTRIBUTE_PARALLEL_DO_SIMD:
+ case ST_OMP_DISTRIBUTE_SIMD:
case ST_OMP_DO:
+ case ST_OMP_DO_SIMD:
case ST_OMP_PARALLEL_DO:
+ case ST_OMP_PARALLEL_DO_SIMD:
+ case ST_OMP_SIMD:
+ case ST_OMP_TARGET_TEAMS_DISTRIBUTE:
+ case ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO:
+ case ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
+ case ST_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD:
+ case ST_OMP_TEAMS_DISTRIBUTE:
+ case ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO:
+ case ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
+ case ST_OMP_TEAMS_DISTRIBUTE_SIMD:
st = parse_omp_do (st);
if (st == ST_IMPLIED_ENDDO)
return st;
seq_type;
/* Stack to keep track of the nesting of blocks as we move through the
- code. See resolve_branch() and resolve_code(). */
+ code. See resolve_branch() and gfc_resolve_code(). */
typedef struct code_stack
{
/* See if function is already resolved. */
- if (expr->value.function.name != NULL)
+ if (expr->value.function.name != NULL
+ || expr->value.function.isym != NULL)
{
if (expr->ts.type == BT_UNKNOWN)
expr->ts = sym->ts;
if (check_assumed_size_reference (sym, e))
return false;
- /* Deal with forward references to entries during resolve_code, to
+ /* Deal with forward references to entries during gfc_resolve_code, to
satisfy, at least partially, 12.5.2.5. */
if (gfc_current_ns->entries
&& current_entry_id == sym->entry_id
/* Resolve lists of blocks found in IF, SELECT CASE, WHERE, FORALL, GOTO and
DO code nodes. */
-static void resolve_code (gfc_code *, gfc_namespace *);
-
void
gfc_resolve_blocks (gfc_code *b, gfc_namespace *ns)
{
case EXEC_OMP_ATOMIC:
case EXEC_OMP_CRITICAL:
+ case EXEC_OMP_DISTRIBUTE:
+ case EXEC_OMP_DISTRIBUTE_PARALLEL_DO:
+ case EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD:
+ case EXEC_OMP_DISTRIBUTE_SIMD:
case EXEC_OMP_DO:
+ case EXEC_OMP_DO_SIMD:
case EXEC_OMP_MASTER:
case EXEC_OMP_ORDERED:
case EXEC_OMP_PARALLEL:
case EXEC_OMP_PARALLEL_DO:
+ case EXEC_OMP_PARALLEL_DO_SIMD:
case EXEC_OMP_PARALLEL_SECTIONS:
case EXEC_OMP_PARALLEL_WORKSHARE:
case EXEC_OMP_SECTIONS:
+ case EXEC_OMP_SIMD:
case EXEC_OMP_SINGLE:
+ case EXEC_OMP_TARGET:
+ case EXEC_OMP_TARGET_DATA:
+ case EXEC_OMP_TARGET_TEAMS:
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE:
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO:
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD:
+ case EXEC_OMP_TARGET_UPDATE:
case EXEC_OMP_TASK:
+ case EXEC_OMP_TASKGROUP:
case EXEC_OMP_TASKWAIT:
case EXEC_OMP_TASKYIELD:
+ case EXEC_OMP_TEAMS:
+ case EXEC_OMP_TEAMS_DISTRIBUTE:
+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO:
+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
+ case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD:
case EXEC_OMP_WORKSHARE:
break;
gfc_internal_error ("gfc_resolve_blocks(): Bad block type");
}
- resolve_code (b->next, ns);
+ gfc_resolve_code (b->next, ns);
}
}
The pointer assignments are taken care of by the intrinsic
assignment of the structure itself. This function recursively adds
defined assignments where required. The recursion is accomplished
- by calling resolve_code.
+ by calling gfc_resolve_code.
When the lhs in a defined assignment has intent INOUT, we need a
temporary for the lhs. In pseudo-code:
comp1, comp2, (*code)->loc);
/* Convert the assignment if there is a defined assignment for
- this type. Otherwise, using the call from resolve_code,
+ this type. Otherwise, using the call from gfc_resolve_code,
recurse into its components. */
- resolve_code (this_code, ns);
+ gfc_resolve_code (this_code, ns);
if (this_code->op == EXEC_ASSIGN_CALL)
{
/* Given a block of code, recursively resolve everything pointed to by this
code block. */
-static void
-resolve_code (gfc_code *code, gfc_namespace *ns)
+void
+gfc_resolve_code (gfc_code *code, gfc_namespace *ns)
{
int omp_workshare_save;
int forall_save, do_concurrent_save;
break;
case EXEC_OMP_PARALLEL:
case EXEC_OMP_PARALLEL_DO:
+ case EXEC_OMP_PARALLEL_DO_SIMD:
case EXEC_OMP_PARALLEL_SECTIONS:
+ case EXEC_OMP_TARGET_TEAMS:
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE:
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO:
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD:
case EXEC_OMP_TASK:
+ case EXEC_OMP_TEAMS:
+ case EXEC_OMP_TEAMS_DISTRIBUTE:
+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO:
+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
+ case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD:
omp_workshare_save = omp_workshare_flag;
omp_workshare_flag = 0;
gfc_resolve_omp_parallel_blocks (code, ns);
break;
+ case EXEC_OMP_DISTRIBUTE:
+ case EXEC_OMP_DISTRIBUTE_SIMD:
case EXEC_OMP_DO:
+ case EXEC_OMP_DO_SIMD:
+ case EXEC_OMP_SIMD:
gfc_resolve_omp_do_blocks (code, ns);
break;
case EXEC_SELECT_TYPE:
case EXEC_DO_WHILE:
if (code->expr1 == NULL)
- gfc_internal_error ("resolve_code(): No expression on DO WHILE");
+ gfc_internal_error ("gfc_resolve_code(): No expression on "
+ "DO WHILE");
if (t
&& (code->expr1->rank != 0
|| code->expr1->ts.type != BT_LOGICAL))
case EXEC_OMP_ATOMIC:
case EXEC_OMP_BARRIER:
+ case EXEC_OMP_CANCEL:
+ case EXEC_OMP_CANCELLATION_POINT:
case EXEC_OMP_CRITICAL:
case EXEC_OMP_FLUSH:
+ case EXEC_OMP_DISTRIBUTE:
+ case EXEC_OMP_DISTRIBUTE_PARALLEL_DO:
+ case EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD:
+ case EXEC_OMP_DISTRIBUTE_SIMD:
case EXEC_OMP_DO:
+ case EXEC_OMP_DO_SIMD:
case EXEC_OMP_MASTER:
case EXEC_OMP_ORDERED:
case EXEC_OMP_SECTIONS:
+ case EXEC_OMP_SIMD:
case EXEC_OMP_SINGLE:
+ case EXEC_OMP_TARGET:
+ case EXEC_OMP_TARGET_DATA:
+ case EXEC_OMP_TARGET_TEAMS:
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE:
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO:
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD:
+ case EXEC_OMP_TARGET_UPDATE:
+ case EXEC_OMP_TASK:
+ case EXEC_OMP_TASKGROUP:
case EXEC_OMP_TASKWAIT:
case EXEC_OMP_TASKYIELD:
+ case EXEC_OMP_TEAMS:
+ case EXEC_OMP_TEAMS_DISTRIBUTE:
+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO:
+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
+ case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD:
case EXEC_OMP_WORKSHARE:
gfc_resolve_omp_directive (code, ns);
break;
case EXEC_OMP_PARALLEL:
case EXEC_OMP_PARALLEL_DO:
+ case EXEC_OMP_PARALLEL_DO_SIMD:
case EXEC_OMP_PARALLEL_SECTIONS:
case EXEC_OMP_PARALLEL_WORKSHARE:
- case EXEC_OMP_TASK:
omp_workshare_save = omp_workshare_flag;
omp_workshare_flag = 0;
gfc_resolve_omp_directive (code, ns);
break;
default:
- gfc_internal_error ("resolve_code(): Bad statement code");
+ gfc_internal_error ("gfc_resolve_code(): Bad statement code");
}
}
}
/* Constraints on deferred type parameter. */
- if (sym->ts.deferred && !(sym->attr.pointer || sym->attr.allocatable))
+ if (sym->ts.deferred
+ && !(sym->attr.pointer
+ || sym->attr.allocatable
+ || sym->attr.omp_udr_artificial_var))
{
gfc_error ("Entity '%s' at %L has a deferred type parameter and "
"requires either the pointer or allocatable attribute",
dummy arguments. */
e = sym->ts.u.cl->length;
if (e == NULL && !sym->attr.dummy && !sym->attr.result
- && !sym->ts.deferred && !sym->attr.select_type_temporary)
+ && !sym->ts.deferred && !sym->attr.select_type_temporary
+ && !sym->attr.omp_udr_artificial_var)
{
gfc_error ("Entity with assumed character length at %L must be a "
"dummy argument or a PARAMETER", &sym->declared_at);
the requirements of the standard for procedures used as finalizers. */
static bool
-gfc_resolve_finalizers (gfc_symbol* derived)
+gfc_resolve_finalizers (gfc_symbol* derived, bool *finalizable)
{
gfc_finalizer* list;
gfc_finalizer** prev_link; /* For removing wrong entries from the list. */
bool result = true;
bool seen_scalar = false;
+ gfc_symbol *vtab;
+ gfc_component *c;
+ /* Return early when not finalizable. Additionally, ensure that derived-type
+ components have a their finalizables resolved. */
if (!derived->f2k_derived || !derived->f2k_derived->finalizers)
- return true;
+ {
+ bool has_final = false;
+ for (c = derived->components; c; c = c->next)
+ if (c->ts.type == BT_DERIVED
+ && !c->attr.pointer && !c->attr.proc_pointer && !c->attr.allocatable)
+ {
+ bool has_final2 = false;
+ if (!gfc_resolve_finalizers (c->ts.u.derived, &has_final))
+ return false; /* Error. */
+ has_final = has_final || has_final2;
+ }
+ if (!has_final)
+ {
+ if (finalizable)
+ *finalizable = false;
+ return true;
+ }
+ }
/* Walk over the list of finalizer-procedures, check them, and if any one
does not fit in with the standard's definition, print an error and remove
/* Remove wrong nodes immediately from the list so we don't risk any
troubles in the future when they might fail later expectations. */
error:
- result = false;
i = list;
*prev_link = list->next;
gfc_free_finalizer (i);
+ result = false;
}
+ if (result == false)
+ return false;
+
/* Warn if we haven't seen a scalar finalizer procedure (but we know there
were nodes in the list, must have been for arrays. It is surely a good
idea to have a scalar version there if there's something to finalize. */
" defined at %L, suggest also scalar one",
derived->name, &derived->declared_at);
- gfc_find_derived_vtab (derived);
- return result;
+ vtab = gfc_find_derived_vtab (derived);
+ c = vtab->ts.u.derived->components->next->next->next->next->next;
+ gfc_set_sym_referenced (c->initializer->symtree->n.sym);
+
+ if (finalizable)
+ *finalizable = true;
+
+ return true;
}
return false;
/* Resolve the finalizer procedures. */
- if (!gfc_resolve_finalizers (sym))
+ if (!gfc_resolve_finalizers (sym, NULL))
return false;
if (sym->attr.is_class && sym->ts.u.derived == NULL)
|| sym->ns->proc_name->attr.flavor != FL_MODULE)))
gfc_error ("Threadprivate at %L isn't SAVEd", &sym->declared_at);
+ /* Check omp declare target restrictions. */
+ if (sym->attr.omp_declare_target
+ && sym->attr.flavor == FL_VARIABLE
+ && !sym->attr.save
+ && !sym->ns->save_all
+ && (!sym->attr.in_common
+ && sym->module == NULL
+ && (sym->ns->proc_name == NULL
+ || sym->ns->proc_name->attr.flavor != FL_MODULE)))
+ gfc_error ("!$OMP DECLARE TARGET variable '%s' at %L isn't SAVEd",
+ sym->name, &sym->declared_at);
+
/* If we have come this far we can apply default-initializers, as
described in 14.7.5, to those variables that have not already
been assigned one. */
assign types to all intermediate expressions, make sure that all
assignments are to compatible types and figure out which names
refer to which functions or subroutines. It doesn't check code
- block, which is handled by resolve_code. */
+ block, which is handled by gfc_resolve_code. */
static void
resolve_types (gfc_namespace *ns)
gfc_resolve_uops (ns->uop_root);
+ gfc_resolve_omp_declare_simd (ns);
+
+ gfc_resolve_omp_udrs (ns->omp_udr_root);
+
gfc_current_ns = old_ns;
}
-/* Call resolve_code recursively. */
+/* Call gfc_resolve_code recursively. */
static void
resolve_codes (gfc_namespace *ns)
old_obstack = labels_obstack;
bitmap_obstack_initialize (&labels_obstack);
- resolve_code (ns->code, ns);
+ gfc_resolve_code (ns->code, ns);
bitmap_obstack_release (&labels_obstack);
labels_obstack = old_obstack;
2) handle OpenMP conditional compilation, where
!$ should be treated as 2 spaces (for initial lines
only if followed by space). */
- if (gfc_option.gfc_flag_openmp && at_bol)
+ if ((gfc_option.gfc_flag_openmp
+ || gfc_option.gfc_flag_openmp_simd) && at_bol)
{
locus old_loc = gfc_current_locus;
if (next_char () == '$')
&& continue_line < gfc_linebuf_linenum (gfc_current_locus.lb))
continue_line = gfc_linebuf_linenum (gfc_current_locus.lb);
- if (gfc_option.gfc_flag_openmp)
+ if (gfc_option.gfc_flag_openmp || gfc_option.gfc_flag_openmp_simd)
{
if (next_char () == '$')
{
c = line;
- if (gfc_option.gfc_flag_openmp)
+ if (gfc_option.gfc_flag_openmp || gfc_option.gfc_flag_openmp_simd)
{
if (gfc_current_form == FORM_FREE)
{
gfc_free_forall_iterator (p->ext.forall_iterator);
break;
+ case EXEC_OMP_CANCEL:
+ case EXEC_OMP_CANCELLATION_POINT:
+ case EXEC_OMP_DISTRIBUTE:
+ case EXEC_OMP_DISTRIBUTE_PARALLEL_DO:
+ case EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD:
+ case EXEC_OMP_DISTRIBUTE_SIMD:
case EXEC_OMP_DO:
+ case EXEC_OMP_DO_SIMD:
case EXEC_OMP_END_SINGLE:
case EXEC_OMP_PARALLEL:
case EXEC_OMP_PARALLEL_DO:
+ case EXEC_OMP_PARALLEL_DO_SIMD:
case EXEC_OMP_PARALLEL_SECTIONS:
case EXEC_OMP_SECTIONS:
+ case EXEC_OMP_SIMD:
case EXEC_OMP_SINGLE:
+ case EXEC_OMP_TARGET:
+ case EXEC_OMP_TARGET_DATA:
+ case EXEC_OMP_TARGET_TEAMS:
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE:
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO:
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD:
+ case EXEC_OMP_TARGET_UPDATE:
case EXEC_OMP_TASK:
+ case EXEC_OMP_TEAMS:
+ case EXEC_OMP_TEAMS_DISTRIBUTE:
+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO:
+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
+ case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD:
case EXEC_OMP_WORKSHARE:
case EXEC_OMP_PARALLEL_WORKSHARE:
gfc_free_omp_clauses (p->ext.omp_clauses);
break;
case EXEC_OMP_FLUSH:
- gfc_free_namelist (p->ext.omp_namelist);
+ gfc_free_omp_namelist (p->ext.omp_namelist);
break;
case EXEC_OMP_ATOMIC:
case EXEC_OMP_MASTER:
case EXEC_OMP_ORDERED:
case EXEC_OMP_END_NOWAIT:
+ case EXEC_OMP_TASKGROUP:
case EXEC_OMP_TASKWAIT:
case EXEC_OMP_TASKYIELD:
break;
*asynchronous = "ASYNCHRONOUS", *codimension = "CODIMENSION",
*contiguous = "CONTIGUOUS", *generic = "GENERIC";
static const char *threadprivate = "THREADPRIVATE";
+ static const char *omp_declare_target = "OMP DECLARE TARGET";
const char *a1, *a2;
int standard;
conf (dummy, entry);
conf (dummy, intrinsic);
conf (dummy, threadprivate);
+ conf (dummy, omp_declare_target);
conf (pointer, target);
conf (pointer, intrinsic);
conf (pointer, elemental);
conf (in_equivalence, entry);
conf (in_equivalence, allocatable);
conf (in_equivalence, threadprivate);
+ conf (in_equivalence, omp_declare_target);
conf (dummy, result);
conf (entry, result);
conf (cray_pointee, in_common);
conf (cray_pointee, in_equivalence);
conf (cray_pointee, threadprivate);
+ conf (cray_pointee, omp_declare_target);
conf (data, dummy);
conf (data, function);
conf (proc_pointer, abstract)
+ conf (entry, omp_declare_target)
+
a1 = gfc_code2string (flavors, attr->flavor);
if (attr->in_namelist
conf2 (function);
conf2 (subroutine);
conf2 (threadprivate);
+ conf2 (omp_declare_target);
if (attr->access == ACCESS_PUBLIC || attr->access == ACCESS_PRIVATE)
{
conf2 (subroutine);
conf2 (threadprivate);
conf2 (result);
+ conf2 (omp_declare_target);
if (attr->intent != INTENT_UNKNOWN)
{
bool
+gfc_add_omp_declare_target (symbol_attribute *attr, const char *name,
+ locus *where)
+{
+
+ if (check_used (attr, name, where))
+ return false;
+
+ if (attr->omp_declare_target)
+ return true;
+
+ attr->omp_declare_target = 1;
+ return check_conflict (attr, name, where);
+}
+
+
+bool
gfc_add_target (symbol_attribute *attr, locus *where)
{
if (src->threadprivate
&& !gfc_add_threadprivate (dest, NULL, where))
goto fail;
+ if (src->omp_declare_target
+ && !gfc_add_omp_declare_target (dest, NULL, where))
+ goto fail;
if (src->target && !gfc_add_target (dest, where))
goto fail;
if (src->dummy && !gfc_add_dummy (dest, NULL, where))
{
gfc_user_op *uop;
gfc_symtree *st;
+ gfc_namespace *ns = gfc_current_ns;
- st = gfc_find_symtree (gfc_current_ns->uop_root, name);
+ if (ns->omp_udr_ns)
+ ns = ns->parent;
+ st = gfc_find_symtree (ns->uop_root, name);
if (st != NULL)
return st->n.uop;
- st = gfc_new_symtree (&gfc_current_ns->uop_root, name);
+ st = gfc_new_symtree (&ns->uop_root, name);
uop = st->n.uop = XCNEW (gfc_user_op);
uop->name = gfc_get_string (name);
uop->access = ACCESS_UNKNOWN;
- uop->ns = gfc_current_ns;
+ uop->ns = ns;
return uop;
}
/* Try to find the symbol in ns. */
st = gfc_find_symtree (ns->sym_root, name);
+ if (st == NULL && ns->omp_udr_ns)
+ {
+ ns = ns->parent;
+ st = gfc_find_symtree (ns->sym_root, name);
+ }
+
if (st == NULL)
{
/* If not there, create a new symbol. */
}
+/* Recursive function that deletes an entire tree and all the common
+ head structures it points to. */
+
+static void
+free_omp_udr_tree (gfc_symtree * omp_udr_tree)
+{
+ if (omp_udr_tree == NULL)
+ return;
+
+ free_omp_udr_tree (omp_udr_tree->left);
+ free_omp_udr_tree (omp_udr_tree->right);
+
+ gfc_free_omp_udr (omp_udr_tree->n.omp_udr);
+ free (omp_udr_tree);
+}
+
+
/* Recursive function that deletes an entire tree and all the user
operator nodes that it contains. */
free_sym_tree (ns->sym_root);
free_uop_tree (ns->uop_root);
free_common_tree (ns->common_root);
+ free_omp_udr_tree (ns->omp_udr_root);
free_tb_tree (ns->tb_sym_root);
free_tb_tree (ns->tb_uop_root);
gfc_free_finalizer_list (ns->finalizers);
+ gfc_free_omp_declare_simd_list (ns->omp_declare_simd);
gfc_free_charlen (ns->cl_list, NULL);
free_st_labels (ns->st_labels);
/* This helper function calculates the size in words of a full array. */
-static tree
-get_full_array_size (stmtblock_t *block, tree decl, int rank)
+tree
+gfc_full_array_size (stmtblock_t *block, tree decl, int rank)
{
tree idx;
tree nelems;
static tree
duplicate_allocatable (tree dest, tree src, tree type, int rank,
- bool no_malloc, tree str_sz)
+ bool no_malloc, bool no_memcpy, tree str_sz)
{
tree tmp;
tree size;
gfc_add_expr_to_block (&block, tmp);
}
- tmp = builtin_decl_explicit (BUILT_IN_MEMCPY);
- tmp = build_call_expr_loc (input_location, tmp, 3, dest, src,
- fold_convert (size_type_node, size));
+ if (!no_memcpy)
+ {
+ tmp = builtin_decl_explicit (BUILT_IN_MEMCPY);
+ tmp = build_call_expr_loc (input_location, tmp, 3, dest, src,
+ fold_convert (size_type_node, size));
+ gfc_add_expr_to_block (&block, tmp);
+ }
}
else
{
gfc_init_block (&block);
if (rank)
- nelems = get_full_array_size (&block, src, rank);
+ nelems = gfc_full_array_size (&block, src, rank);
else
nelems = gfc_index_one_node;
/* We know the temporary and the value will be the same length,
so can use memcpy. */
- tmp = builtin_decl_explicit (BUILT_IN_MEMCPY);
- tmp = build_call_expr_loc (input_location,
- tmp, 3, gfc_conv_descriptor_data_get (dest),
- gfc_conv_descriptor_data_get (src),
- fold_convert (size_type_node, size));
+ if (!no_memcpy)
+ {
+ tmp = builtin_decl_explicit (BUILT_IN_MEMCPY);
+ tmp = build_call_expr_loc (input_location, tmp, 3,
+ gfc_conv_descriptor_data_get (dest),
+ gfc_conv_descriptor_data_get (src),
+ fold_convert (size_type_node, size));
+ gfc_add_expr_to_block (&block, tmp);
+ }
}
- gfc_add_expr_to_block (&block, tmp);
tmp = gfc_finish_block (&block);
/* Null the destination if the source is null; otherwise do
tree
gfc_duplicate_allocatable (tree dest, tree src, tree type, int rank)
{
- return duplicate_allocatable (dest, src, type, rank, false, NULL_TREE);
+ return duplicate_allocatable (dest, src, type, rank, false, false,
+ NULL_TREE);
}
tree
gfc_copy_allocatable_data (tree dest, tree src, tree type, int rank)
{
- return duplicate_allocatable (dest, src, type, rank, true, NULL_TREE);
+ return duplicate_allocatable (dest, src, type, rank, true, false,
+ NULL_TREE);
+}
+
+/* Allocate dest to the same size as src, but don't copy anything. */
+
+tree
+gfc_duplicate_allocatable_nocopy (tree dest, tree src, tree type, int rank)
+{
+ return duplicate_allocatable (dest, src, type, rank, false, true, NULL_TREE);
}
/* Use the descriptor for an allocatable array. Since this
is a full array reference, we only need the descriptor
information from dimension = rank. */
- tmp = get_full_array_size (&fnblock, decl, rank);
+ tmp = gfc_full_array_size (&fnblock, decl, rank);
tmp = fold_build2_loc (input_location, MINUS_EXPR,
gfc_array_index_type, tmp,
gfc_index_one_node);
gfc_add_expr_to_block (&fnblock, tmp);
size = size_of_string_in_bytes (c->ts.kind, len);
tmp = duplicate_allocatable (dcmp, comp, ctype, rank,
- false, size);
+ false, false, size);
gfc_add_expr_to_block (&fnblock, tmp);
}
else if (c->attr.allocatable && !c->attr.proc_pointer
/* Generate code to deallocate an array, if it is allocated. */
tree gfc_trans_dealloc_allocated (tree, bool, gfc_expr *);
+tree gfc_full_array_size (stmtblock_t *, tree, int);
+
tree gfc_duplicate_allocatable (tree dest, tree src, tree type, int rank);
tree gfc_copy_allocatable_data (tree dest, tree src, tree type, int rank);
+tree gfc_duplicate_allocatable_nocopy (tree, tree, tree, int);
+
tree gfc_nullify_alloc_comp (gfc_symbol *, tree, int);
tree gfc_deallocate_alloc_comp (gfc_symbol *, tree, int);
if (com->threadprivate)
DECL_TLS_MODEL (decl) = decl_default_tls_model (decl);
+ if (com->omp_declare_target)
+ DECL_ATTRIBUTES (decl)
+ = tree_cons (get_identifier ("omp declare target"),
+ NULL_TREE, DECL_ATTRIBUTES (decl));
+
/* Place the back end declaration for this common block in
GLOBAL_BINDING_LEVEL. */
gfc_map_of_all_commons[identifier] = pushdecl_top_level (decl);
TREE_ADDRESSABLE (var_decl) = 1;
/* Fake variables are not visible from other translation units. */
TREE_PUBLIC (var_decl) = 0;
+ gfc_finish_decl_attrs (var_decl, &s->sym->attr);
/* To preserve identifier names in COMMON, chain to procedure
scope unless at top level in a module definition. */
}
+/* Handle setting of GFC_DECL_SCALAR* on DECL. */
+
+void
+gfc_finish_decl_attrs (tree decl, symbol_attribute *attr)
+{
+ if (!attr->dimension && !attr->codimension)
+ {
+ /* Handle scalar allocatable variables. */
+ if (attr->allocatable)
+ {
+ gfc_allocate_lang_decl (decl);
+ GFC_DECL_SCALAR_ALLOCATABLE (decl) = 1;
+ }
+ /* Handle scalar pointer variables. */
+ if (attr->pointer)
+ {
+ gfc_allocate_lang_decl (decl);
+ GFC_DECL_SCALAR_POINTER (decl) = 1;
+ }
+ }
+}
+
+
/* Apply symbol attributes to a variable, and add it to the function scope. */
static void
if (sym->attr.threadprivate
&& (TREE_STATIC (decl) || DECL_EXTERNAL (decl)))
DECL_TLS_MODEL (decl) = decl_default_tls_model (decl);
+
+ gfc_finish_decl_attrs (decl, &sym->attr);
}
void
gfc_allocate_lang_decl (tree decl)
{
- DECL_LANG_SPECIFIC (decl) = ggc_alloc_cleared_lang_decl(sizeof
- (struct lang_decl));
+ if (DECL_LANG_SPECIFIC (decl) == NULL)
+ DECL_LANG_SPECIFIC (decl)
+ = ggc_alloc_cleared_lang_decl (sizeof (struct lang_decl));
}
/* Remember a symbol to generate initialization/cleanup code at function
list = chainon (list, attr);
}
+ if (sym_attr.omp_declare_target)
+ list = tree_cons (get_identifier ("omp declare target"),
+ NULL_TREE, list);
+
return list;
}
&& !sym->attr.select_type_temporary)
DECL_BY_REFERENCE (decl) = 1;
+ if (sym->attr.associate_var)
+ GFC_DECL_ASSOCIATE_VAR_P (decl) = 1;
+
if (sym->attr.vtab
|| (sym->name[0] == '_' && strncmp ("__def_init", sym->name, 10) == 0))
TREE_READONLY (decl) = 1;
if (DECL_CONTEXT (fndecl) == NULL_TREE)
pushdecl_top_level (fndecl);
+ if (sym->formal_ns
+ && sym->formal_ns->proc_name == sym
+ && sym->formal_ns->omp_declare_simd)
+ gfc_trans_omp_declare_simd (sym->formal_ns);
+
return fndecl;
}
DECL_BY_REFERENCE (parm) = 1;
gfc_finish_decl (parm);
+ gfc_finish_decl_attrs (parm, &f->sym->attr);
f->sym->backend_decl = parm;
/* Now create the read argument list. */
create_function_arglist (ns->proc_name);
+
+ if (ns->omp_declare_simd)
+ gfc_trans_omp_declare_simd (ns);
}
/* Return the decl used to hold the function return value. If
TREE_ADDRESSABLE (decl) = 1;
layout_decl (decl, 0);
+ gfc_finish_decl_attrs (decl, &sym->attr);
if (parent_flag)
gfc_add_decl_to_parent_function (decl);
}
/* Don't generate variables from other modules. Variables from
- COMMONs will already have been generated. */
- if (sym->attr.use_assoc || sym->attr.in_common)
+ COMMONs and Cray pointees will already have been generated. */
+ if (sym->attr.use_assoc || sym->attr.in_common || sym->attr.cray_pointee)
return;
/* Equivalenced variables arrive here after creation. */
/* Take the address of that value. */
se->expr = gfc_build_addr_expr (NULL_TREE, var);
+ if (expr->ts.type == BT_DERIVED && expr->rank
+ && !gfc_is_finalizable (expr->ts.u.derived, NULL)
+ && expr->ts.u.derived->attr.alloc_comp
+ && expr->expr_type != EXPR_VARIABLE)
+ {
+ tree tmp;
+
+ tmp = build_fold_indirect_ref_loc (input_location, se->expr);
+ tmp = gfc_deallocate_alloc_comp (expr->ts.u.derived, tmp, expr->rank);
+
+ /* The components shall be deallocated before
+ their containing entity. */
+ gfc_prepend_expr_to_block (&se->post, tmp);
+ }
}
res_desc = gfc_evaluate_now (desc, &se->pre);
gfc_conv_descriptor_data_set (&se->pre, res_desc, null_pointer_node);
- se->expr = gfc_build_addr_expr (TREE_TYPE (se->expr), res_desc);
+ se->expr = gfc_build_addr_expr (NULL_TREE, res_desc);
/* Free the lhs after the function call and copy the result data to
the lhs descriptor. */
if (TREE_CODE (type) == POINTER_TYPE)
{
/* Array POINTER/ALLOCATABLE have aggregate types, all user variables
- that have POINTER_TYPE type and don't have GFC_POINTER_TYPE_P
- set are supposed to be privatized by reference. */
- if (GFC_POINTER_TYPE_P (type))
+ that have POINTER_TYPE type and aren't scalar pointers, scalar
+ allocatables, Cray pointees or C pointers are supposed to be
+ privatized by reference. */
+ if (GFC_DECL_GET_SCALAR_POINTER (decl)
+ || GFC_DECL_GET_SCALAR_ALLOCATABLE (decl)
+ || GFC_DECL_CRAY_POINTEE (decl)
+ || VOID_TYPE_P (TREE_TYPE (TREE_TYPE (decl))))
return false;
if (!DECL_ARTIFICIAL (decl)
enum omp_clause_default_kind
gfc_omp_predetermined_sharing (tree decl)
{
+ /* Associate names preserve the association established during ASSOCIATE.
+ As they are implemented either as pointers to the selector or array
+ descriptor and shouldn't really change in the ASSOCIATE region,
+ this decl can be either shared or firstprivate. If it is a pointer,
+ use firstprivate, as it is cheaper that way, otherwise make it shared. */
+ if (GFC_DECL_ASSOCIATE_VAR_P (decl))
+ {
+ if (TREE_CODE (TREE_TYPE (decl)) == POINTER_TYPE)
+ return OMP_CLAUSE_DEFAULT_FIRSTPRIVATE;
+ else
+ return OMP_CLAUSE_DEFAULT_SHARED;
+ }
+
if (DECL_ARTIFICIAL (decl)
&& ! GFC_DECL_RESULT (decl)
&& ! (DECL_LANG_SPECIFIC (decl)
return decl;
}
+/* Return true if TYPE has any allocatable components. */
+
+static bool
+gfc_has_alloc_comps (tree type, tree decl)
+{
+ tree field, ftype;
+
+ if (POINTER_TYPE_P (type))
+ {
+ if (GFC_DECL_GET_SCALAR_ALLOCATABLE (decl))
+ type = TREE_TYPE (type);
+ else if (GFC_DECL_GET_SCALAR_POINTER (decl))
+ return false;
+ }
+
+ while (GFC_DESCRIPTOR_TYPE_P (type) || GFC_ARRAY_TYPE_P (type))
+ type = gfc_get_element_type (type);
+
+ if (TREE_CODE (type) != RECORD_TYPE)
+ return false;
+
+ for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
+ {
+ ftype = TREE_TYPE (field);
+ if (GFC_DECL_GET_SCALAR_ALLOCATABLE (field))
+ return true;
+ if (GFC_DESCRIPTOR_TYPE_P (ftype)
+ && GFC_TYPE_ARRAY_AKIND (ftype) == GFC_ARRAY_ALLOCATABLE)
+ return true;
+ if (gfc_has_alloc_comps (ftype, field))
+ return true;
+ }
+ return false;
+}
+
/* Return true if DECL in private clause needs
OMP_CLAUSE_PRIVATE_OUTER_REF on the private clause. */
bool
&& GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_ALLOCATABLE)
return true;
+ if (GFC_DECL_GET_SCALAR_ALLOCATABLE (decl))
+ return true;
+
+ if (gfc_omp_privatize_by_reference (decl))
+ type = TREE_TYPE (type);
+
+ if (gfc_has_alloc_comps (type, decl))
+ return true;
+
return false;
}
+/* Callback for gfc_omp_unshare_expr. */
+
+static tree
+gfc_omp_unshare_expr_r (tree *tp, int *walk_subtrees, void *)
+{
+ tree t = *tp;
+ enum tree_code code = TREE_CODE (t);
+
+ /* Stop at types, decls, constants like copy_tree_r. */
+ if (TREE_CODE_CLASS (code) == tcc_type
+ || TREE_CODE_CLASS (code) == tcc_declaration
+ || TREE_CODE_CLASS (code) == tcc_constant
+ || code == BLOCK)
+ *walk_subtrees = 0;
+ else if (handled_component_p (t)
+ || TREE_CODE (t) == MEM_REF)
+ {
+ *tp = unshare_expr (t);
+ *walk_subtrees = 0;
+ }
+
+ return NULL_TREE;
+}
+
+/* Unshare in expr anything that the FE which normally doesn't
+ care much about tree sharing (because during gimplification
+ everything is unshared) could cause problems with tree sharing
+ at omp-low.c time. */
+
+static tree
+gfc_omp_unshare_expr (tree expr)
+{
+ walk_tree (&expr, gfc_omp_unshare_expr_r, NULL, NULL);
+ return expr;
+}
+
+enum walk_alloc_comps
+{
+ WALK_ALLOC_COMPS_DTOR,
+ WALK_ALLOC_COMPS_DEFAULT_CTOR,
+ WALK_ALLOC_COMPS_COPY_CTOR
+};
+
+/* Handle allocatable components in OpenMP clauses. */
+
+static tree
+gfc_walk_alloc_comps (tree decl, tree dest, tree var,
+ enum walk_alloc_comps kind)
+{
+ stmtblock_t block, tmpblock;
+ tree type = TREE_TYPE (decl), then_b, tem, field;
+ gfc_init_block (&block);
+
+ if (GFC_ARRAY_TYPE_P (type) || GFC_DESCRIPTOR_TYPE_P (type))
+ {
+ if (GFC_DESCRIPTOR_TYPE_P (type))
+ {
+ gfc_init_block (&tmpblock);
+ tem = gfc_full_array_size (&tmpblock, decl,
+ GFC_TYPE_ARRAY_RANK (type));
+ then_b = gfc_finish_block (&tmpblock);
+ gfc_add_expr_to_block (&block, gfc_omp_unshare_expr (then_b));
+ tem = gfc_omp_unshare_expr (tem);
+ tem = fold_build2_loc (input_location, MINUS_EXPR,
+ gfc_array_index_type, tem,
+ gfc_index_one_node);
+ }
+ else
+ {
+ if (!TYPE_DOMAIN (type)
+ || TYPE_MAX_VALUE (TYPE_DOMAIN (type)) == NULL_TREE
+ || TYPE_MIN_VALUE (TYPE_DOMAIN (type)) == error_mark_node
+ || TYPE_MAX_VALUE (TYPE_DOMAIN (type)) == error_mark_node)
+ {
+ tem = fold_build2 (EXACT_DIV_EXPR, sizetype,
+ TYPE_SIZE_UNIT (type),
+ TYPE_SIZE_UNIT (TREE_TYPE (type)));
+ tem = size_binop (MINUS_EXPR, tem, size_one_node);
+ }
+ else
+ tem = array_type_nelts (type);
+ tem = fold_convert (gfc_array_index_type, tem);
+ }
+
+ tree nelems = gfc_evaluate_now (tem, &block);
+ tree index = gfc_create_var (gfc_array_index_type, "S");
+
+ gfc_init_block (&tmpblock);
+ tem = gfc_conv_array_data (decl);
+ tree declvar = build_fold_indirect_ref_loc (input_location, tem);
+ tree declvref = gfc_build_array_ref (declvar, index, NULL);
+ tree destvar, destvref = NULL_TREE;
+ if (dest)
+ {
+ tem = gfc_conv_array_data (dest);
+ destvar = build_fold_indirect_ref_loc (input_location, tem);
+ destvref = gfc_build_array_ref (destvar, index, NULL);
+ }
+ gfc_add_expr_to_block (&tmpblock,
+ gfc_walk_alloc_comps (declvref, destvref,
+ var, kind));
+
+ gfc_loopinfo loop;
+ gfc_init_loopinfo (&loop);
+ loop.dimen = 1;
+ loop.from[0] = gfc_index_zero_node;
+ loop.loopvar[0] = index;
+ loop.to[0] = nelems;
+ gfc_trans_scalarizing_loops (&loop, &tmpblock);
+ gfc_add_block_to_block (&block, &loop.pre);
+ return gfc_finish_block (&block);
+ }
+ else if (GFC_DECL_GET_SCALAR_ALLOCATABLE (var))
+ {
+ decl = build_fold_indirect_ref_loc (input_location, decl);
+ if (dest)
+ dest = build_fold_indirect_ref_loc (input_location, dest);
+ type = TREE_TYPE (decl);
+ }
+
+ gcc_assert (TREE_CODE (type) == RECORD_TYPE);
+ for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
+ {
+ tree ftype = TREE_TYPE (field);
+ tree declf, destf = NULL_TREE;
+ bool has_alloc_comps = gfc_has_alloc_comps (ftype, field);
+ if ((!GFC_DESCRIPTOR_TYPE_P (ftype)
+ || GFC_TYPE_ARRAY_AKIND (ftype) != GFC_ARRAY_ALLOCATABLE)
+ && !GFC_DECL_GET_SCALAR_ALLOCATABLE (field)
+ && !has_alloc_comps)
+ continue;
+ declf = fold_build3_loc (input_location, COMPONENT_REF, ftype,
+ decl, field, NULL_TREE);
+ if (dest)
+ destf = fold_build3_loc (input_location, COMPONENT_REF, ftype,
+ dest, field, NULL_TREE);
+
+ tem = NULL_TREE;
+ switch (kind)
+ {
+ case WALK_ALLOC_COMPS_DTOR:
+ break;
+ case WALK_ALLOC_COMPS_DEFAULT_CTOR:
+ if (GFC_DESCRIPTOR_TYPE_P (ftype)
+ && GFC_TYPE_ARRAY_AKIND (ftype) == GFC_ARRAY_ALLOCATABLE)
+ {
+ gfc_add_modify (&block, unshare_expr (destf),
+ unshare_expr (declf));
+ tem = gfc_duplicate_allocatable_nocopy
+ (destf, declf, ftype,
+ GFC_TYPE_ARRAY_RANK (ftype));
+ }
+ else if (GFC_DECL_GET_SCALAR_ALLOCATABLE (field))
+ tem = gfc_duplicate_allocatable_nocopy (destf, declf, ftype, 0);
+ break;
+ case WALK_ALLOC_COMPS_COPY_CTOR:
+ if (GFC_DESCRIPTOR_TYPE_P (ftype)
+ && GFC_TYPE_ARRAY_AKIND (ftype) == GFC_ARRAY_ALLOCATABLE)
+ tem = gfc_duplicate_allocatable (destf, declf, ftype,
+ GFC_TYPE_ARRAY_RANK (ftype));
+ else if (GFC_DECL_GET_SCALAR_ALLOCATABLE (field))
+ tem = gfc_duplicate_allocatable (destf, declf, ftype, 0);
+ break;
+ }
+ if (tem)
+ gfc_add_expr_to_block (&block, gfc_omp_unshare_expr (tem));
+ if (has_alloc_comps)
+ {
+ gfc_init_block (&tmpblock);
+ gfc_add_expr_to_block (&tmpblock,
+ gfc_walk_alloc_comps (declf, destf,
+ field, kind));
+ then_b = gfc_finish_block (&tmpblock);
+ if (GFC_DESCRIPTOR_TYPE_P (ftype)
+ && GFC_TYPE_ARRAY_AKIND (ftype) == GFC_ARRAY_ALLOCATABLE)
+ tem = gfc_conv_descriptor_data_get (unshare_expr (declf));
+ else if (GFC_DECL_GET_SCALAR_ALLOCATABLE (field))
+ tem = unshare_expr (declf);
+ else
+ tem = NULL_TREE;
+ if (tem)
+ {
+ tem = fold_convert (pvoid_type_node, tem);
+ tem = fold_build2_loc (input_location, NE_EXPR,
+ boolean_type_node, tem,
+ null_pointer_node);
+ then_b = build3_loc (input_location, COND_EXPR, void_type_node,
+ tem, then_b,
+ build_empty_stmt (input_location));
+ }
+ gfc_add_expr_to_block (&block, then_b);
+ }
+ if (kind == WALK_ALLOC_COMPS_DTOR)
+ {
+ if (GFC_DESCRIPTOR_TYPE_P (ftype)
+ && GFC_TYPE_ARRAY_AKIND (ftype) == GFC_ARRAY_ALLOCATABLE)
+ {
+ tem = gfc_trans_dealloc_allocated (unshare_expr (declf),
+ false, NULL);
+ gfc_add_expr_to_block (&block, gfc_omp_unshare_expr (tem));
+ }
+ else if (GFC_DECL_GET_SCALAR_ALLOCATABLE (field))
+ {
+ tem = gfc_call_free (unshare_expr (declf));
+ gfc_add_expr_to_block (&block, gfc_omp_unshare_expr (tem));
+ }
+ }
+ }
+
+ return gfc_finish_block (&block);
+}
+
/* Return code to initialize DECL with its default constructor, or
NULL if there's nothing to do. */
tree
gfc_omp_clause_default_ctor (tree clause, tree decl, tree outer)
{
- tree type = TREE_TYPE (decl), rank, size, esize, ptr, cond, then_b, else_b;
+ tree type = TREE_TYPE (decl), size, ptr, cond, then_b, else_b;
stmtblock_t block, cond_block;
- if (! GFC_DESCRIPTOR_TYPE_P (type)
- || GFC_TYPE_ARRAY_AKIND (type) != GFC_ARRAY_ALLOCATABLE)
- return NULL;
+ gcc_assert (OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_PRIVATE
+ || OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_LASTPRIVATE
+ || OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_LINEAR
+ || OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_REDUCTION);
- if (OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_REDUCTION)
- return NULL;
+ if ((! GFC_DESCRIPTOR_TYPE_P (type)
+ || GFC_TYPE_ARRAY_AKIND (type) != GFC_ARRAY_ALLOCATABLE)
+ && !GFC_DECL_GET_SCALAR_ALLOCATABLE (OMP_CLAUSE_DECL (clause)))
+ {
+ if (gfc_has_alloc_comps (type, OMP_CLAUSE_DECL (clause)))
+ {
+ gcc_assert (outer);
+ gfc_start_block (&block);
+ tree tem = gfc_walk_alloc_comps (outer, decl,
+ OMP_CLAUSE_DECL (clause),
+ WALK_ALLOC_COMPS_DEFAULT_CTOR);
+ gfc_add_expr_to_block (&block, tem);
+ return gfc_finish_block (&block);
+ }
+ return NULL_TREE;
+ }
- gcc_assert (outer != NULL);
- gcc_assert (OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_PRIVATE
- || OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_LASTPRIVATE);
+ gcc_assert (outer != NULL_TREE);
- /* Allocatable arrays in PRIVATE clauses need to be set to
+ /* Allocatable arrays and scalars in PRIVATE clauses need to be set to
"not currently allocated" allocation status if outer
array is "not currently allocated", otherwise should be allocated. */
gfc_start_block (&block);
gfc_init_block (&cond_block);
- gfc_add_modify (&cond_block, decl, outer);
- rank = gfc_rank_cst[GFC_TYPE_ARRAY_RANK (type) - 1];
- size = gfc_conv_descriptor_ubound_get (decl, rank);
- size = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type,
- size, gfc_conv_descriptor_lbound_get (decl, rank));
- size = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type,
- size, gfc_index_one_node);
- if (GFC_TYPE_ARRAY_RANK (type) > 1)
- size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type,
- size, gfc_conv_descriptor_stride_get (decl, rank));
- esize = fold_convert (gfc_array_index_type,
- TYPE_SIZE_UNIT (gfc_get_element_type (type)));
- size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type,
- size, esize);
- size = gfc_evaluate_now (fold_convert (size_type_node, size), &cond_block);
-
+ if (GFC_DESCRIPTOR_TYPE_P (type))
+ {
+ gfc_add_modify (&cond_block, decl, outer);
+ tree rank = gfc_rank_cst[GFC_TYPE_ARRAY_RANK (type) - 1];
+ size = gfc_conv_descriptor_ubound_get (decl, rank);
+ size = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type,
+ size,
+ gfc_conv_descriptor_lbound_get (decl, rank));
+ size = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type,
+ size, gfc_index_one_node);
+ if (GFC_TYPE_ARRAY_RANK (type) > 1)
+ size = fold_build2_loc (input_location, MULT_EXPR,
+ gfc_array_index_type, size,
+ gfc_conv_descriptor_stride_get (decl, rank));
+ tree esize = fold_convert (gfc_array_index_type,
+ TYPE_SIZE_UNIT (gfc_get_element_type (type)));
+ size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type,
+ size, esize);
+ size = unshare_expr (size);
+ size = gfc_evaluate_now (fold_convert (size_type_node, size),
+ &cond_block);
+ }
+ else
+ size = fold_convert (size_type_node, TYPE_SIZE_UNIT (TREE_TYPE (type)));
ptr = gfc_create_var (pvoid_type_node, NULL);
gfc_allocate_using_malloc (&cond_block, ptr, size, NULL_TREE);
- gfc_conv_descriptor_data_set (&cond_block, decl, ptr);
-
+ if (GFC_DESCRIPTOR_TYPE_P (type))
+ gfc_conv_descriptor_data_set (&cond_block, unshare_expr (decl), ptr);
+ else
+ gfc_add_modify (&cond_block, unshare_expr (decl),
+ fold_convert (TREE_TYPE (decl), ptr));
+ if (gfc_has_alloc_comps (type, OMP_CLAUSE_DECL (clause)))
+ {
+ tree tem = gfc_walk_alloc_comps (outer, decl,
+ OMP_CLAUSE_DECL (clause),
+ WALK_ALLOC_COMPS_DEFAULT_CTOR);
+ gfc_add_expr_to_block (&cond_block, tem);
+ }
then_b = gfc_finish_block (&cond_block);
- gfc_init_block (&cond_block);
- gfc_conv_descriptor_data_set (&cond_block, decl, null_pointer_node);
- else_b = gfc_finish_block (&cond_block);
-
- cond = fold_build2_loc (input_location, NE_EXPR, boolean_type_node,
- fold_convert (pvoid_type_node,
- gfc_conv_descriptor_data_get (outer)),
- null_pointer_node);
- gfc_add_expr_to_block (&block, build3_loc (input_location, COND_EXPR,
- void_type_node, cond, then_b, else_b));
+ /* Reduction clause requires allocated ALLOCATABLE. */
+ if (OMP_CLAUSE_CODE (clause) != OMP_CLAUSE_REDUCTION)
+ {
+ gfc_init_block (&cond_block);
+ if (GFC_DESCRIPTOR_TYPE_P (type))
+ gfc_conv_descriptor_data_set (&cond_block, unshare_expr (decl),
+ null_pointer_node);
+ else
+ gfc_add_modify (&cond_block, unshare_expr (decl),
+ build_zero_cst (TREE_TYPE (decl)));
+ else_b = gfc_finish_block (&cond_block);
+
+ tree tem = fold_convert (pvoid_type_node,
+ GFC_DESCRIPTOR_TYPE_P (type)
+ ? gfc_conv_descriptor_data_get (outer) : outer);
+ tem = unshare_expr (tem);
+ cond = fold_build2_loc (input_location, NE_EXPR, boolean_type_node,
+ tem, null_pointer_node);
+ gfc_add_expr_to_block (&block,
+ build3_loc (input_location, COND_EXPR,
+ void_type_node, cond, then_b,
+ else_b));
+ }
+ else
+ gfc_add_expr_to_block (&block, then_b);
return gfc_finish_block (&block);
}
tree
gfc_omp_clause_copy_ctor (tree clause, tree dest, tree src)
{
- tree type = TREE_TYPE (dest), ptr, size, esize, rank, call;
+ tree type = TREE_TYPE (dest), ptr, size, call;
tree cond, then_b, else_b;
stmtblock_t block, cond_block;
- if (! GFC_DESCRIPTOR_TYPE_P (type)
- || GFC_TYPE_ARRAY_AKIND (type) != GFC_ARRAY_ALLOCATABLE)
- return build2_v (MODIFY_EXPR, dest, src);
+ gcc_assert (OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_FIRSTPRIVATE
+ || OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_LINEAR);
- gcc_assert (OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_FIRSTPRIVATE);
+ if ((! GFC_DESCRIPTOR_TYPE_P (type)
+ || GFC_TYPE_ARRAY_AKIND (type) != GFC_ARRAY_ALLOCATABLE)
+ && !GFC_DECL_GET_SCALAR_ALLOCATABLE (OMP_CLAUSE_DECL (clause)))
+ {
+ if (gfc_has_alloc_comps (type, OMP_CLAUSE_DECL (clause)))
+ {
+ gfc_start_block (&block);
+ gfc_add_modify (&block, dest, src);
+ tree tem = gfc_walk_alloc_comps (src, dest, OMP_CLAUSE_DECL (clause),
+ WALK_ALLOC_COMPS_COPY_CTOR);
+ gfc_add_expr_to_block (&block, tem);
+ return gfc_finish_block (&block);
+ }
+ else
+ return build2_v (MODIFY_EXPR, dest, src);
+ }
/* Allocatable arrays in FIRSTPRIVATE clauses need to be allocated
and copied from SRC. */
gfc_init_block (&cond_block);
gfc_add_modify (&cond_block, dest, src);
- rank = gfc_rank_cst[GFC_TYPE_ARRAY_RANK (type) - 1];
- size = gfc_conv_descriptor_ubound_get (dest, rank);
- size = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type,
- size, gfc_conv_descriptor_lbound_get (dest, rank));
- size = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type,
- size, gfc_index_one_node);
- if (GFC_TYPE_ARRAY_RANK (type) > 1)
- size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type,
- size, gfc_conv_descriptor_stride_get (dest, rank));
- esize = fold_convert (gfc_array_index_type,
- TYPE_SIZE_UNIT (gfc_get_element_type (type)));
- size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type,
- size, esize);
- size = gfc_evaluate_now (fold_convert (size_type_node, size), &cond_block);
-
+ if (GFC_DESCRIPTOR_TYPE_P (type))
+ {
+ tree rank = gfc_rank_cst[GFC_TYPE_ARRAY_RANK (type) - 1];
+ size = gfc_conv_descriptor_ubound_get (dest, rank);
+ size = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type,
+ size,
+ gfc_conv_descriptor_lbound_get (dest, rank));
+ size = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type,
+ size, gfc_index_one_node);
+ if (GFC_TYPE_ARRAY_RANK (type) > 1)
+ size = fold_build2_loc (input_location, MULT_EXPR,
+ gfc_array_index_type, size,
+ gfc_conv_descriptor_stride_get (dest, rank));
+ tree esize = fold_convert (gfc_array_index_type,
+ TYPE_SIZE_UNIT (gfc_get_element_type (type)));
+ size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type,
+ size, esize);
+ size = unshare_expr (size);
+ size = gfc_evaluate_now (fold_convert (size_type_node, size),
+ &cond_block);
+ }
+ else
+ size = fold_convert (size_type_node, TYPE_SIZE_UNIT (TREE_TYPE (type)));
ptr = gfc_create_var (pvoid_type_node, NULL);
gfc_allocate_using_malloc (&cond_block, ptr, size, NULL_TREE);
- gfc_conv_descriptor_data_set (&cond_block, dest, ptr);
+ if (GFC_DESCRIPTOR_TYPE_P (type))
+ gfc_conv_descriptor_data_set (&cond_block, unshare_expr (dest), ptr);
+ else
+ gfc_add_modify (&cond_block, unshare_expr (dest),
+ fold_convert (TREE_TYPE (dest), ptr));
+ tree srcptr = GFC_DESCRIPTOR_TYPE_P (type)
+ ? gfc_conv_descriptor_data_get (src) : src;
+ srcptr = unshare_expr (srcptr);
+ srcptr = fold_convert (pvoid_type_node, srcptr);
call = build_call_expr_loc (input_location,
- builtin_decl_explicit (BUILT_IN_MEMCPY),
- 3, ptr,
- fold_convert (pvoid_type_node,
- gfc_conv_descriptor_data_get (src)),
- size);
+ builtin_decl_explicit (BUILT_IN_MEMCPY), 3, ptr,
+ srcptr, size);
gfc_add_expr_to_block (&cond_block, fold_convert (void_type_node, call));
+ if (gfc_has_alloc_comps (type, OMP_CLAUSE_DECL (clause)))
+ {
+ tree tem = gfc_walk_alloc_comps (src, dest,
+ OMP_CLAUSE_DECL (clause),
+ WALK_ALLOC_COMPS_COPY_CTOR);
+ gfc_add_expr_to_block (&cond_block, tem);
+ }
then_b = gfc_finish_block (&cond_block);
gfc_init_block (&cond_block);
- gfc_conv_descriptor_data_set (&cond_block, dest, null_pointer_node);
+ if (GFC_DESCRIPTOR_TYPE_P (type))
+ gfc_conv_descriptor_data_set (&cond_block, unshare_expr (dest),
+ null_pointer_node);
+ else
+ gfc_add_modify (&cond_block, unshare_expr (dest),
+ build_zero_cst (TREE_TYPE (dest)));
else_b = gfc_finish_block (&cond_block);
cond = fold_build2_loc (input_location, NE_EXPR, boolean_type_node,
- fold_convert (pvoid_type_node,
- gfc_conv_descriptor_data_get (src)),
- null_pointer_node);
- gfc_add_expr_to_block (&block, build3_loc (input_location, COND_EXPR,
- void_type_node, cond, then_b, else_b));
+ unshare_expr (srcptr), null_pointer_node);
+ gfc_add_expr_to_block (&block,
+ build3_loc (input_location, COND_EXPR,
+ void_type_node, cond, then_b, else_b));
return gfc_finish_block (&block);
}
-/* Similarly, except use an assignment operator instead. */
+/* Similarly, except use an intrinsic or pointer assignment operator
+ instead. */
tree
-gfc_omp_clause_assign_op (tree clause ATTRIBUTE_UNUSED, tree dest, tree src)
+gfc_omp_clause_assign_op (tree clause, tree dest, tree src)
{
- tree type = TREE_TYPE (dest), rank, size, esize, call;
- stmtblock_t block;
+ tree type = TREE_TYPE (dest), ptr, size, call, nonalloc;
+ tree cond, then_b, else_b;
+ stmtblock_t block, cond_block, cond_block2, inner_block;
- if (! GFC_DESCRIPTOR_TYPE_P (type)
- || GFC_TYPE_ARRAY_AKIND (type) != GFC_ARRAY_ALLOCATABLE)
- return build2_v (MODIFY_EXPR, dest, src);
+ if ((! GFC_DESCRIPTOR_TYPE_P (type)
+ || GFC_TYPE_ARRAY_AKIND (type) != GFC_ARRAY_ALLOCATABLE)
+ && !GFC_DECL_GET_SCALAR_ALLOCATABLE (OMP_CLAUSE_DECL (clause)))
+ {
+ if (gfc_has_alloc_comps (type, OMP_CLAUSE_DECL (clause)))
+ {
+ gfc_start_block (&block);
+ /* First dealloc any allocatable components in DEST. */
+ tree tem = gfc_walk_alloc_comps (dest, NULL_TREE,
+ OMP_CLAUSE_DECL (clause),
+ WALK_ALLOC_COMPS_DTOR);
+ gfc_add_expr_to_block (&block, tem);
+ /* Then copy over toplevel data. */
+ gfc_add_modify (&block, dest, src);
+ /* Finally allocate any allocatable components and copy. */
+ tem = gfc_walk_alloc_comps (src, dest, OMP_CLAUSE_DECL (clause),
+ WALK_ALLOC_COMPS_COPY_CTOR);
+ gfc_add_expr_to_block (&block, tem);
+ return gfc_finish_block (&block);
+ }
+ else
+ return build2_v (MODIFY_EXPR, dest, src);
+ }
- /* Handle copying allocatable arrays. */
gfc_start_block (&block);
- rank = gfc_rank_cst[GFC_TYPE_ARRAY_RANK (type) - 1];
- size = gfc_conv_descriptor_ubound_get (dest, rank);
- size = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type,
- size, gfc_conv_descriptor_lbound_get (dest, rank));
- size = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type,
- size, gfc_index_one_node);
- if (GFC_TYPE_ARRAY_RANK (type) > 1)
- size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type,
- size, gfc_conv_descriptor_stride_get (dest, rank));
- esize = fold_convert (gfc_array_index_type,
- TYPE_SIZE_UNIT (gfc_get_element_type (type)));
- size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type,
- size, esize);
- size = gfc_evaluate_now (fold_convert (size_type_node, size), &block);
+ if (gfc_has_alloc_comps (type, OMP_CLAUSE_DECL (clause)))
+ {
+ then_b = gfc_walk_alloc_comps (dest, NULL_TREE, OMP_CLAUSE_DECL (clause),
+ WALK_ALLOC_COMPS_DTOR);
+ tree tem = fold_convert (pvoid_type_node,
+ GFC_DESCRIPTOR_TYPE_P (type)
+ ? gfc_conv_descriptor_data_get (dest) : dest);
+ tem = unshare_expr (tem);
+ cond = fold_build2_loc (input_location, NE_EXPR, boolean_type_node,
+ tem, null_pointer_node);
+ tem = build3_loc (input_location, COND_EXPR, void_type_node, cond,
+ then_b, build_empty_stmt (input_location));
+ gfc_add_expr_to_block (&block, tem);
+ }
+
+ gfc_init_block (&cond_block);
+
+ if (GFC_DESCRIPTOR_TYPE_P (type))
+ {
+ tree rank = gfc_rank_cst[GFC_TYPE_ARRAY_RANK (type) - 1];
+ size = gfc_conv_descriptor_ubound_get (src, rank);
+ size = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type,
+ size,
+ gfc_conv_descriptor_lbound_get (src, rank));
+ size = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type,
+ size, gfc_index_one_node);
+ if (GFC_TYPE_ARRAY_RANK (type) > 1)
+ size = fold_build2_loc (input_location, MULT_EXPR,
+ gfc_array_index_type, size,
+ gfc_conv_descriptor_stride_get (src, rank));
+ tree esize = fold_convert (gfc_array_index_type,
+ TYPE_SIZE_UNIT (gfc_get_element_type (type)));
+ size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type,
+ size, esize);
+ size = unshare_expr (size);
+ size = gfc_evaluate_now (fold_convert (size_type_node, size),
+ &cond_block);
+ }
+ else
+ size = fold_convert (size_type_node, TYPE_SIZE_UNIT (TREE_TYPE (type)));
+ ptr = gfc_create_var (pvoid_type_node, NULL);
+
+ tree destptr = GFC_DESCRIPTOR_TYPE_P (type)
+ ? gfc_conv_descriptor_data_get (dest) : dest;
+ destptr = unshare_expr (destptr);
+ destptr = fold_convert (pvoid_type_node, destptr);
+ gfc_add_modify (&cond_block, ptr, destptr);
+
+ nonalloc = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node,
+ destptr, null_pointer_node);
+ cond = nonalloc;
+ if (GFC_DESCRIPTOR_TYPE_P (type))
+ {
+ int i;
+ for (i = 0; i < GFC_TYPE_ARRAY_RANK (type); i++)
+ {
+ tree rank = gfc_rank_cst[i];
+ tree tem = gfc_conv_descriptor_ubound_get (src, rank);
+ tem = fold_build2_loc (input_location, MINUS_EXPR,
+ gfc_array_index_type, tem,
+ gfc_conv_descriptor_lbound_get (src, rank));
+ tem = fold_build2_loc (input_location, PLUS_EXPR,
+ gfc_array_index_type, tem,
+ gfc_conv_descriptor_lbound_get (dest, rank));
+ tem = fold_build2_loc (input_location, NE_EXPR, boolean_type_node,
+ tem, gfc_conv_descriptor_ubound_get (dest,
+ rank));
+ cond = fold_build2_loc (input_location, TRUTH_ORIF_EXPR,
+ boolean_type_node, cond, tem);
+ }
+ }
+
+ gfc_init_block (&cond_block2);
+
+ if (GFC_DESCRIPTOR_TYPE_P (type))
+ {
+ gfc_init_block (&inner_block);
+ gfc_allocate_using_malloc (&inner_block, ptr, size, NULL_TREE);
+ then_b = gfc_finish_block (&inner_block);
+
+ gfc_init_block (&inner_block);
+ gfc_add_modify (&inner_block, ptr,
+ gfc_call_realloc (&inner_block, ptr, size));
+ else_b = gfc_finish_block (&inner_block);
+
+ gfc_add_expr_to_block (&cond_block2,
+ build3_loc (input_location, COND_EXPR,
+ void_type_node,
+ unshare_expr (nonalloc),
+ then_b, else_b));
+ gfc_add_modify (&cond_block2, dest, src);
+ gfc_conv_descriptor_data_set (&cond_block2, unshare_expr (dest), ptr);
+ }
+ else
+ {
+ gfc_allocate_using_malloc (&cond_block2, ptr, size, NULL_TREE);
+ gfc_add_modify (&cond_block2, unshare_expr (dest),
+ fold_convert (type, ptr));
+ }
+ then_b = gfc_finish_block (&cond_block2);
+ else_b = build_empty_stmt (input_location);
+
+ gfc_add_expr_to_block (&cond_block,
+ build3_loc (input_location, COND_EXPR,
+ void_type_node, unshare_expr (cond),
+ then_b, else_b));
+
+ tree srcptr = GFC_DESCRIPTOR_TYPE_P (type)
+ ? gfc_conv_descriptor_data_get (src) : src;
+ srcptr = unshare_expr (srcptr);
+ srcptr = fold_convert (pvoid_type_node, srcptr);
call = build_call_expr_loc (input_location,
- builtin_decl_explicit (BUILT_IN_MEMCPY), 3,
- fold_convert (pvoid_type_node,
- gfc_conv_descriptor_data_get (dest)),
- fold_convert (pvoid_type_node,
- gfc_conv_descriptor_data_get (src)),
- size);
- gfc_add_expr_to_block (&block, fold_convert (void_type_node, call));
+ builtin_decl_explicit (BUILT_IN_MEMCPY), 3, ptr,
+ srcptr, size);
+ gfc_add_expr_to_block (&cond_block, fold_convert (void_type_node, call));
+ if (gfc_has_alloc_comps (type, OMP_CLAUSE_DECL (clause)))
+ {
+ tree tem = gfc_walk_alloc_comps (src, dest,
+ OMP_CLAUSE_DECL (clause),
+ WALK_ALLOC_COMPS_COPY_CTOR);
+ gfc_add_expr_to_block (&cond_block, tem);
+ }
+ then_b = gfc_finish_block (&cond_block);
+
+ if (OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_COPYIN)
+ {
+ gfc_init_block (&cond_block);
+ if (GFC_DESCRIPTOR_TYPE_P (type))
+ gfc_add_expr_to_block (&cond_block,
+ gfc_trans_dealloc_allocated (unshare_expr (dest),
+ false, NULL));
+ else
+ {
+ destptr = gfc_evaluate_now (destptr, &cond_block);
+ gfc_add_expr_to_block (&cond_block, gfc_call_free (destptr));
+ gfc_add_modify (&cond_block, unshare_expr (dest),
+ build_zero_cst (TREE_TYPE (dest)));
+ }
+ else_b = gfc_finish_block (&cond_block);
+
+ cond = fold_build2_loc (input_location, NE_EXPR, boolean_type_node,
+ unshare_expr (srcptr), null_pointer_node);
+ gfc_add_expr_to_block (&block,
+ build3_loc (input_location, COND_EXPR,
+ void_type_node, cond,
+ then_b, else_b));
+ }
+ else
+ gfc_add_expr_to_block (&block, then_b);
+
+ return gfc_finish_block (&block);
+}
+
+static void
+gfc_omp_linear_clause_add_loop (stmtblock_t *block, tree dest, tree src,
+ tree add, tree nelems)
+{
+ stmtblock_t tmpblock;
+ tree desta, srca, index = gfc_create_var (gfc_array_index_type, "S");
+ nelems = gfc_evaluate_now (nelems, block);
+
+ gfc_init_block (&tmpblock);
+ if (TREE_CODE (TREE_TYPE (dest)) == ARRAY_TYPE)
+ {
+ desta = gfc_build_array_ref (dest, index, NULL);
+ srca = gfc_build_array_ref (src, index, NULL);
+ }
+ else
+ {
+ gcc_assert (POINTER_TYPE_P (TREE_TYPE (dest)));
+ tree idx = fold_build2 (MULT_EXPR, sizetype,
+ fold_convert (sizetype, index),
+ TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (dest))));
+ desta = build_fold_indirect_ref (fold_build2 (POINTER_PLUS_EXPR,
+ TREE_TYPE (dest), dest,
+ idx));
+ srca = build_fold_indirect_ref (fold_build2 (POINTER_PLUS_EXPR,
+ TREE_TYPE (src), src,
+ idx));
+ }
+ gfc_add_modify (&tmpblock, desta,
+ fold_build2 (PLUS_EXPR, TREE_TYPE (desta),
+ srca, add));
+
+ gfc_loopinfo loop;
+ gfc_init_loopinfo (&loop);
+ loop.dimen = 1;
+ loop.from[0] = gfc_index_zero_node;
+ loop.loopvar[0] = index;
+ loop.to[0] = nelems;
+ gfc_trans_scalarizing_loops (&loop, &tmpblock);
+ gfc_add_block_to_block (block, &loop.pre);
+}
+
+/* Build and return code for a constructor of DEST that initializes
+ it to SRC plus ADD (ADD is scalar integer). */
+
+tree
+gfc_omp_clause_linear_ctor (tree clause, tree dest, tree src, tree add)
+{
+ tree type = TREE_TYPE (dest), ptr, size, nelems = NULL_TREE;
+ stmtblock_t block;
+
+ gcc_assert (OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_LINEAR);
+
+ gfc_start_block (&block);
+ add = gfc_evaluate_now (add, &block);
+
+ if ((! GFC_DESCRIPTOR_TYPE_P (type)
+ || GFC_TYPE_ARRAY_AKIND (type) != GFC_ARRAY_ALLOCATABLE)
+ && !GFC_DECL_GET_SCALAR_ALLOCATABLE (OMP_CLAUSE_DECL (clause)))
+ {
+ gcc_assert (TREE_CODE (type) == ARRAY_TYPE);
+ if (!TYPE_DOMAIN (type)
+ || TYPE_MAX_VALUE (TYPE_DOMAIN (type)) == NULL_TREE
+ || TYPE_MIN_VALUE (TYPE_DOMAIN (type)) == error_mark_node
+ || TYPE_MAX_VALUE (TYPE_DOMAIN (type)) == error_mark_node)
+ {
+ nelems = fold_build2 (EXACT_DIV_EXPR, sizetype,
+ TYPE_SIZE_UNIT (type),
+ TYPE_SIZE_UNIT (TREE_TYPE (type)));
+ nelems = size_binop (MINUS_EXPR, nelems, size_one_node);
+ }
+ else
+ nelems = array_type_nelts (type);
+ nelems = fold_convert (gfc_array_index_type, nelems);
+ gfc_omp_linear_clause_add_loop (&block, dest, src, add, nelems);
+ return gfc_finish_block (&block);
+ }
+
+ /* Allocatable arrays in LINEAR clauses need to be allocated
+ and copied from SRC. */
+ gfc_add_modify (&block, dest, src);
+ if (GFC_DESCRIPTOR_TYPE_P (type))
+ {
+ tree rank = gfc_rank_cst[GFC_TYPE_ARRAY_RANK (type) - 1];
+ size = gfc_conv_descriptor_ubound_get (dest, rank);
+ size = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type,
+ size,
+ gfc_conv_descriptor_lbound_get (dest, rank));
+ size = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type,
+ size, gfc_index_one_node);
+ if (GFC_TYPE_ARRAY_RANK (type) > 1)
+ size = fold_build2_loc (input_location, MULT_EXPR,
+ gfc_array_index_type, size,
+ gfc_conv_descriptor_stride_get (dest, rank));
+ tree esize = fold_convert (gfc_array_index_type,
+ TYPE_SIZE_UNIT (gfc_get_element_type (type)));
+ nelems = gfc_evaluate_now (unshare_expr (size), &block);
+ size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type,
+ nelems, unshare_expr (esize));
+ size = gfc_evaluate_now (fold_convert (size_type_node, size),
+ &block);
+ nelems = fold_build2_loc (input_location, MINUS_EXPR,
+ gfc_array_index_type, nelems,
+ gfc_index_one_node);
+ }
+ else
+ size = fold_convert (size_type_node, TYPE_SIZE_UNIT (TREE_TYPE (type)));
+ ptr = gfc_create_var (pvoid_type_node, NULL);
+ gfc_allocate_using_malloc (&block, ptr, size, NULL_TREE);
+ if (GFC_DESCRIPTOR_TYPE_P (type))
+ {
+ gfc_conv_descriptor_data_set (&block, unshare_expr (dest), ptr);
+ tree etype = gfc_get_element_type (type);
+ ptr = fold_convert (build_pointer_type (etype), ptr);
+ tree srcptr = gfc_conv_descriptor_data_get (unshare_expr (src));
+ srcptr = fold_convert (build_pointer_type (etype), srcptr);
+ gfc_omp_linear_clause_add_loop (&block, ptr, srcptr, add, nelems);
+ }
+ else
+ {
+ gfc_add_modify (&block, unshare_expr (dest),
+ fold_convert (TREE_TYPE (dest), ptr));
+ ptr = fold_convert (TREE_TYPE (dest), ptr);
+ tree dstm = build_fold_indirect_ref (ptr);
+ tree srcm = build_fold_indirect_ref (unshare_expr (src));
+ gfc_add_modify (&block, dstm,
+ fold_build2 (PLUS_EXPR, TREE_TYPE (add), srcm, add));
+ }
return gfc_finish_block (&block);
}
to be done. */
tree
-gfc_omp_clause_dtor (tree clause ATTRIBUTE_UNUSED, tree decl)
+gfc_omp_clause_dtor (tree clause, tree decl)
{
- tree type = TREE_TYPE (decl);
+ tree type = TREE_TYPE (decl), tem;
+
+ if ((! GFC_DESCRIPTOR_TYPE_P (type)
+ || GFC_TYPE_ARRAY_AKIND (type) != GFC_ARRAY_ALLOCATABLE)
+ && !GFC_DECL_GET_SCALAR_ALLOCATABLE (OMP_CLAUSE_DECL (clause)))
+ {
+ if (gfc_has_alloc_comps (type, OMP_CLAUSE_DECL (clause)))
+ return gfc_walk_alloc_comps (decl, NULL_TREE,
+ OMP_CLAUSE_DECL (clause),
+ WALK_ALLOC_COMPS_DTOR);
+ return NULL_TREE;
+ }
+
+ if (GFC_DESCRIPTOR_TYPE_P (type))
+ /* Allocatable arrays in FIRSTPRIVATE/LASTPRIVATE etc. clauses need
+ to be deallocated if they were allocated. */
+ tem = gfc_trans_dealloc_allocated (decl, false, NULL);
+ else
+ tem = gfc_call_free (decl);
+ tem = gfc_omp_unshare_expr (tem);
+
+ if (gfc_has_alloc_comps (type, OMP_CLAUSE_DECL (clause)))
+ {
+ stmtblock_t block;
+ tree then_b;
+
+ gfc_init_block (&block);
+ gfc_add_expr_to_block (&block,
+ gfc_walk_alloc_comps (decl, NULL_TREE,
+ OMP_CLAUSE_DECL (clause),
+ WALK_ALLOC_COMPS_DTOR));
+ gfc_add_expr_to_block (&block, tem);
+ then_b = gfc_finish_block (&block);
+
+ tem = fold_convert (pvoid_type_node,
+ GFC_DESCRIPTOR_TYPE_P (type)
+ ? gfc_conv_descriptor_data_get (decl) : decl);
+ tem = unshare_expr (tem);
+ tree cond = fold_build2_loc (input_location, NE_EXPR, boolean_type_node,
+ tem, null_pointer_node);
+ tem = build3_loc (input_location, COND_EXPR, void_type_node, cond,
+ then_b, build_empty_stmt (input_location));
+ }
+ return tem;
+}
- if (! GFC_DESCRIPTOR_TYPE_P (type)
- || GFC_TYPE_ARRAY_AKIND (type) != GFC_ARRAY_ALLOCATABLE)
- return NULL;
- if (OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_REDUCTION)
- return NULL;
+void
+gfc_omp_finish_clause (tree c, gimple_seq *pre_p)
+{
+ if (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_MAP)
+ return;
- /* Allocatable arrays in FIRSTPRIVATE/LASTPRIVATE etc. clauses need
- to be deallocated if they were allocated. */
- return gfc_trans_dealloc_allocated (decl, false, NULL);
+ tree decl = OMP_CLAUSE_DECL (c);
+ tree c2 = NULL_TREE, c3 = NULL_TREE, c4 = NULL_TREE;
+ if (POINTER_TYPE_P (TREE_TYPE (decl)))
+ {
+ if (!gfc_omp_privatize_by_reference (decl)
+ && !GFC_DECL_GET_SCALAR_POINTER (decl)
+ && !GFC_DECL_GET_SCALAR_ALLOCATABLE (decl)
+ && !GFC_DECL_CRAY_POINTEE (decl)
+ && !GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (TREE_TYPE (decl))))
+ return;
+ c4 = build_omp_clause (OMP_CLAUSE_LOCATION (c), OMP_CLAUSE_MAP);
+ OMP_CLAUSE_MAP_KIND (c4) = OMP_CLAUSE_MAP_POINTER;
+ OMP_CLAUSE_DECL (c4) = decl;
+ OMP_CLAUSE_SIZE (c4) = size_int (0);
+ decl = build_fold_indirect_ref (decl);
+ OMP_CLAUSE_DECL (c) = decl;
+ OMP_CLAUSE_SIZE (c) = NULL_TREE;
+ }
+ if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (decl)))
+ {
+ stmtblock_t block;
+ gfc_start_block (&block);
+ tree type = TREE_TYPE (decl);
+ tree ptr = gfc_conv_descriptor_data_get (decl);
+ ptr = fold_convert (build_pointer_type (char_type_node), ptr);
+ ptr = build_fold_indirect_ref (ptr);
+ OMP_CLAUSE_DECL (c) = ptr;
+ c2 = build_omp_clause (input_location, OMP_CLAUSE_MAP);
+ OMP_CLAUSE_MAP_KIND (c2) = OMP_CLAUSE_MAP_TO_PSET;
+ OMP_CLAUSE_DECL (c2) = decl;
+ OMP_CLAUSE_SIZE (c2) = TYPE_SIZE_UNIT (type);
+ c3 = build_omp_clause (OMP_CLAUSE_LOCATION (c), OMP_CLAUSE_MAP);
+ OMP_CLAUSE_MAP_KIND (c3) = OMP_CLAUSE_MAP_POINTER;
+ OMP_CLAUSE_DECL (c3) = gfc_conv_descriptor_data_get (decl);
+ OMP_CLAUSE_SIZE (c3) = size_int (0);
+ tree size = create_tmp_var (gfc_array_index_type, NULL);
+ tree elemsz = TYPE_SIZE_UNIT (gfc_get_element_type (type));
+ elemsz = fold_convert (gfc_array_index_type, elemsz);
+ if (GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_POINTER
+ || GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_POINTER_CONT)
+ {
+ stmtblock_t cond_block;
+ tree tem, then_b, else_b, zero, cond;
+
+ gfc_init_block (&cond_block);
+ tem = gfc_full_array_size (&cond_block, decl,
+ GFC_TYPE_ARRAY_RANK (type));
+ gfc_add_modify (&cond_block, size, tem);
+ gfc_add_modify (&cond_block, size,
+ fold_build2 (MULT_EXPR, gfc_array_index_type,
+ size, elemsz));
+ then_b = gfc_finish_block (&cond_block);
+ gfc_init_block (&cond_block);
+ zero = build_int_cst (gfc_array_index_type, 0);
+ gfc_add_modify (&cond_block, size, zero);
+ else_b = gfc_finish_block (&cond_block);
+ tem = gfc_conv_descriptor_data_get (decl);
+ tem = fold_convert (pvoid_type_node, tem);
+ cond = fold_build2_loc (input_location, NE_EXPR,
+ boolean_type_node, tem, null_pointer_node);
+ gfc_add_expr_to_block (&block, build3_loc (input_location, COND_EXPR,
+ void_type_node, cond,
+ then_b, else_b));
+ }
+ else
+ {
+ gfc_add_modify (&block, size,
+ gfc_full_array_size (&block, decl,
+ GFC_TYPE_ARRAY_RANK (type)));
+ gfc_add_modify (&block, size,
+ fold_build2 (MULT_EXPR, gfc_array_index_type,
+ size, elemsz));
+ }
+ OMP_CLAUSE_SIZE (c) = size;
+ tree stmt = gfc_finish_block (&block);
+ gimplify_and_add (stmt, pre_p);
+ }
+ tree last = c;
+ if (OMP_CLAUSE_SIZE (c) == NULL_TREE)
+ OMP_CLAUSE_SIZE (c)
+ = DECL_P (decl) ? DECL_SIZE_UNIT (decl)
+ : TYPE_SIZE_UNIT (TREE_TYPE (decl));
+ if (c2)
+ {
+ OMP_CLAUSE_CHAIN (c2) = OMP_CLAUSE_CHAIN (last);
+ OMP_CLAUSE_CHAIN (last) = c2;
+ last = c2;
+ }
+ if (c3)
+ {
+ OMP_CLAUSE_CHAIN (c3) = OMP_CLAUSE_CHAIN (last);
+ OMP_CLAUSE_CHAIN (last) = c3;
+ last = c3;
+ }
+ if (c4)
+ {
+ OMP_CLAUSE_CHAIN (c4) = OMP_CLAUSE_CHAIN (last);
+ OMP_CLAUSE_CHAIN (last) = c4;
+ last = c4;
+ }
}
}
static tree
-gfc_trans_omp_variable (gfc_symbol *sym)
+gfc_trans_omp_variable (gfc_symbol *sym, bool declare_simd)
{
+ if (declare_simd)
+ {
+ int cnt = 0;
+ gfc_symbol *proc_sym;
+ gfc_formal_arglist *f;
+
+ gcc_assert (sym->attr.dummy);
+ proc_sym = sym->ns->proc_name;
+ if (proc_sym->attr.entry_master)
+ ++cnt;
+ if (gfc_return_by_reference (proc_sym))
+ {
+ ++cnt;
+ if (proc_sym->ts.type == BT_CHARACTER)
+ ++cnt;
+ }
+ for (f = gfc_sym_get_dummy_args (proc_sym); f; f = f->next)
+ if (f->sym == sym)
+ break;
+ else if (f->sym)
+ ++cnt;
+ gcc_assert (f);
+ return build_int_cst (integer_type_node, cnt);
+ }
+
tree t = gfc_get_symbol_decl (sym);
tree parent_decl;
int parent_flag;
entry_master = sym->attr.result
&& sym->ns->proc_name->attr.entry_master
&& !gfc_return_by_reference (sym->ns->proc_name);
- parent_decl = DECL_CONTEXT (current_function_decl);
+ parent_decl = current_function_decl
+ ? DECL_CONTEXT (current_function_decl) : NULL_TREE;
if ((t == parent_decl && return_value)
|| (sym->ns && sym->ns->proc_name
}
static tree
-gfc_trans_omp_variable_list (enum omp_clause_code code, gfc_namelist *namelist,
- tree list)
+gfc_trans_omp_variable_list (enum omp_clause_code code,
+ gfc_omp_namelist *namelist, tree list,
+ bool declare_simd)
{
for (; namelist != NULL; namelist = namelist->next)
- if (namelist->sym->attr.referenced)
+ if (namelist->sym->attr.referenced || declare_simd)
{
- tree t = gfc_trans_omp_variable (namelist->sym);
+ tree t = gfc_trans_omp_variable (namelist->sym, declare_simd);
if (t != error_mark_node)
{
tree node = build_omp_clause (input_location, code);
return list;
}
+struct omp_udr_find_orig_data
+{
+ gfc_omp_udr *omp_udr;
+ bool omp_orig_seen;
+};
+
+static int
+omp_udr_find_orig (gfc_expr **e, int *walk_subtrees ATTRIBUTE_UNUSED,
+ void *data)
+{
+ struct omp_udr_find_orig_data *cd = (struct omp_udr_find_orig_data *) data;
+ if ((*e)->expr_type == EXPR_VARIABLE
+ && (*e)->symtree->n.sym == cd->omp_udr->omp_orig)
+ cd->omp_orig_seen = true;
+
+ return 0;
+}
+
static void
-gfc_trans_omp_array_reduction (tree c, gfc_symbol *sym, locus where)
+gfc_trans_omp_array_reduction_or_udr (tree c, gfc_omp_namelist *n, locus where)
{
+ gfc_symbol *sym = n->sym;
gfc_symtree *root1 = NULL, *root2 = NULL, *root3 = NULL, *root4 = NULL;
gfc_symtree *symtree1, *symtree2, *symtree3, *symtree4 = NULL;
gfc_symbol init_val_sym, outer_sym, intrinsic_sym;
+ gfc_symbol omp_var_copy[4];
gfc_expr *e1, *e2, *e3, *e4;
gfc_ref *ref;
tree decl, backend_decl, stmt, type, outer_decl;
locus old_loc = gfc_current_locus;
const char *iname;
bool t;
+ gfc_omp_udr *udr = n->udr ? n->udr->udr : NULL;
decl = OMP_CLAUSE_DECL (c);
gfc_current_locus = where;
init_val_sym.attr.referenced = 1;
init_val_sym.declared_at = where;
init_val_sym.attr.flavor = FL_VARIABLE;
- backend_decl = omp_reduction_init (c, gfc_sym_type (&init_val_sym));
+ if (OMP_CLAUSE_REDUCTION_CODE (c) != ERROR_MARK)
+ backend_decl = omp_reduction_init (c, gfc_sym_type (&init_val_sym));
+ else if (udr->initializer_ns)
+ backend_decl = NULL;
+ else
+ switch (sym->ts.type)
+ {
+ case BT_LOGICAL:
+ case BT_INTEGER:
+ case BT_REAL:
+ case BT_COMPLEX:
+ backend_decl = build_zero_cst (gfc_sym_type (&init_val_sym));
+ break;
+ default:
+ backend_decl = NULL_TREE;
+ break;
+ }
init_val_sym.backend_decl = backend_decl;
/* Create a fake symbol for the outer array reference. */
outer_sym = *sym;
- outer_sym.as = gfc_copy_array_spec (sym->as);
+ if (sym->as)
+ outer_sym.as = gfc_copy_array_spec (sym->as);
outer_sym.attr.dummy = 0;
outer_sym.attr.result = 0;
outer_sym.attr.flavor = FL_VARIABLE;
symtree3->n.sym = &outer_sym;
gcc_assert (symtree3 == root3);
+ memset (omp_var_copy, 0, sizeof omp_var_copy);
+ if (udr)
+ {
+ omp_var_copy[0] = *udr->omp_out;
+ omp_var_copy[1] = *udr->omp_in;
+ *udr->omp_out = outer_sym;
+ *udr->omp_in = *sym;
+ if (udr->initializer_ns)
+ {
+ omp_var_copy[2] = *udr->omp_priv;
+ omp_var_copy[3] = *udr->omp_orig;
+ *udr->omp_priv = *sym;
+ *udr->omp_orig = outer_sym;
+ }
+ }
+
/* Create expressions. */
e1 = gfc_get_expr ();
e1->expr_type = EXPR_VARIABLE;
e1->where = where;
e1->symtree = symtree1;
e1->ts = sym->ts;
- e1->ref = ref = gfc_get_ref ();
- ref->type = REF_ARRAY;
- ref->u.ar.where = where;
- ref->u.ar.as = sym->as;
- ref->u.ar.type = AR_FULL;
- ref->u.ar.dimen = 0;
+ if (sym->attr.dimension)
+ {
+ e1->ref = ref = gfc_get_ref ();
+ ref->type = REF_ARRAY;
+ ref->u.ar.where = where;
+ ref->u.ar.as = sym->as;
+ ref->u.ar.type = AR_FULL;
+ ref->u.ar.dimen = 0;
+ }
t = gfc_resolve_expr (e1);
gcc_assert (t);
- e2 = gfc_get_expr ();
- e2->expr_type = EXPR_VARIABLE;
- e2->where = where;
- e2->symtree = symtree2;
- e2->ts = sym->ts;
- t = gfc_resolve_expr (e2);
- gcc_assert (t);
+ e2 = NULL;
+ if (backend_decl != NULL_TREE)
+ {
+ e2 = gfc_get_expr ();
+ e2->expr_type = EXPR_VARIABLE;
+ e2->where = where;
+ e2->symtree = symtree2;
+ e2->ts = sym->ts;
+ t = gfc_resolve_expr (e2);
+ gcc_assert (t);
+ }
+ else if (udr->initializer_ns == NULL)
+ {
+ gcc_assert (sym->ts.type == BT_DERIVED);
+ e2 = gfc_default_initializer (&sym->ts);
+ gcc_assert (e2);
+ t = gfc_resolve_expr (e2);
+ gcc_assert (t);
+ }
+ else if (n->udr->initializer->op == EXEC_ASSIGN)
+ {
+ e2 = gfc_copy_expr (n->udr->initializer->expr2);
+ t = gfc_resolve_expr (e2);
+ gcc_assert (t);
+ }
+ if (udr && udr->initializer_ns)
+ {
+ struct omp_udr_find_orig_data cd;
+ cd.omp_udr = udr;
+ cd.omp_orig_seen = false;
+ gfc_code_walker (&n->udr->initializer,
+ gfc_dummy_code_callback, omp_udr_find_orig, &cd);
+ if (cd.omp_orig_seen)
+ OMP_CLAUSE_REDUCTION_OMP_ORIG_REF (c) = 1;
+ }
e3 = gfc_copy_expr (e1);
e3->symtree = symtree3;
gcc_assert (t);
iname = NULL;
+ e4 = NULL;
switch (OMP_CLAUSE_REDUCTION_CODE (c))
{
case PLUS_EXPR:
case BIT_XOR_EXPR:
iname = "ieor";
break;
+ case ERROR_MARK:
+ if (n->udr->combiner->op == EXEC_ASSIGN)
+ {
+ gfc_free_expr (e3);
+ e3 = gfc_copy_expr (n->udr->combiner->expr1);
+ e4 = gfc_copy_expr (n->udr->combiner->expr2);
+ t = gfc_resolve_expr (e3);
+ gcc_assert (t);
+ t = gfc_resolve_expr (e4);
+ gcc_assert (t);
+ }
+ break;
default:
gcc_unreachable ();
}
e4->expr_type = EXPR_FUNCTION;
e4->where = where;
e4->symtree = symtree4;
- e4->value.function.isym = gfc_find_function (iname);
e4->value.function.actual = gfc_get_actual_arglist ();
e4->value.function.actual->expr = e3;
e4->value.function.actual->next = gfc_get_actual_arglist ();
e4->value.function.actual->next->expr = e1;
}
- /* e1 and e3 have been stored as arguments of e4, avoid sharing. */
- e1 = gfc_copy_expr (e1);
- e3 = gfc_copy_expr (e3);
- t = gfc_resolve_expr (e4);
- gcc_assert (t);
+ if (OMP_CLAUSE_REDUCTION_CODE (c) != ERROR_MARK)
+ {
+ /* e1 and e3 have been stored as arguments of e4, avoid sharing. */
+ e1 = gfc_copy_expr (e1);
+ e3 = gfc_copy_expr (e3);
+ t = gfc_resolve_expr (e4);
+ gcc_assert (t);
+ }
/* Create the init statement list. */
pushlevel ();
- if (GFC_DESCRIPTOR_TYPE_P (type)
- && GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_ALLOCATABLE)
- {
- /* If decl is an allocatable array, it needs to be allocated
- with the same bounds as the outer var. */
- tree rank, size, esize, ptr;
- stmtblock_t block;
-
- gfc_start_block (&block);
-
- gfc_add_modify (&block, decl, outer_sym.backend_decl);
- rank = gfc_rank_cst[GFC_TYPE_ARRAY_RANK (type) - 1];
- size = gfc_conv_descriptor_ubound_get (decl, rank);
- size = fold_build2_loc (input_location, MINUS_EXPR,
- gfc_array_index_type, size,
- gfc_conv_descriptor_lbound_get (decl, rank));
- size = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type,
- size, gfc_index_one_node);
- if (GFC_TYPE_ARRAY_RANK (type) > 1)
- size = fold_build2_loc (input_location, MULT_EXPR,
- gfc_array_index_type, size,
- gfc_conv_descriptor_stride_get (decl, rank));
- esize = fold_convert (gfc_array_index_type,
- TYPE_SIZE_UNIT (gfc_get_element_type (type)));
- size = fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type,
- size, esize);
- size = gfc_evaluate_now (fold_convert (size_type_node, size), &block);
-
- ptr = gfc_create_var (pvoid_type_node, NULL);
- gfc_allocate_using_malloc (&block, ptr, size, NULL_TREE);
- gfc_conv_descriptor_data_set (&block, decl, ptr);
-
- gfc_add_expr_to_block (&block, gfc_trans_assignment (e1, e2, false,
- false));
- stmt = gfc_finish_block (&block);
- }
- else
+ if (e2)
stmt = gfc_trans_assignment (e1, e2, false, false);
+ else
+ stmt = gfc_trans_call (n->udr->initializer, false,
+ NULL_TREE, NULL_TREE, false);
if (TREE_CODE (stmt) != BIND_EXPR)
stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0));
else
/* Create the merge statement list. */
pushlevel ();
- if (GFC_DESCRIPTOR_TYPE_P (type)
- && GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_ALLOCATABLE)
- {
- /* If decl is an allocatable array, it needs to be deallocated
- afterwards. */
- stmtblock_t block;
-
- gfc_start_block (&block);
- gfc_add_expr_to_block (&block, gfc_trans_assignment (e3, e4, false,
- true));
- gfc_add_expr_to_block (&block, gfc_trans_dealloc_allocated (decl, false,
- NULL));
- stmt = gfc_finish_block (&block);
- }
- else
+ if (e4)
stmt = gfc_trans_assignment (e3, e4, false, true);
+ else
+ stmt = gfc_trans_call (n->udr->combiner, false,
+ NULL_TREE, NULL_TREE, false);
if (TREE_CODE (stmt) != BIND_EXPR)
stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0));
else
gfc_current_locus = old_loc;
gfc_free_expr (e1);
- gfc_free_expr (e2);
+ if (e2)
+ gfc_free_expr (e2);
gfc_free_expr (e3);
- gfc_free_expr (e4);
+ if (e4)
+ gfc_free_expr (e4);
free (symtree1);
free (symtree2);
free (symtree3);
free (symtree4);
- gfc_free_array_spec (outer_sym.as);
+ if (outer_sym.as)
+ gfc_free_array_spec (outer_sym.as);
+
+ if (udr)
+ {
+ *udr->omp_out = omp_var_copy[0];
+ *udr->omp_in = omp_var_copy[1];
+ if (udr->initializer_ns)
+ {
+ *udr->omp_priv = omp_var_copy[2];
+ *udr->omp_orig = omp_var_copy[3];
+ }
+ }
}
static tree
-gfc_trans_omp_reduction_list (gfc_namelist *namelist, tree list,
- enum tree_code reduction_code, locus where)
+gfc_trans_omp_reduction_list (gfc_omp_namelist *namelist, tree list,
+ locus where)
{
for (; namelist != NULL; namelist = namelist->next)
if (namelist->sym->attr.referenced)
{
- tree t = gfc_trans_omp_variable (namelist->sym);
+ tree t = gfc_trans_omp_variable (namelist->sym, false);
if (t != error_mark_node)
{
tree node = build_omp_clause (where.lb->location,
OMP_CLAUSE_REDUCTION);
OMP_CLAUSE_DECL (node) = t;
- OMP_CLAUSE_REDUCTION_CODE (node) = reduction_code;
- if (namelist->sym->attr.dimension)
- gfc_trans_omp_array_reduction (node, namelist->sym, where);
+ switch (namelist->u.reduction_op)
+ {
+ case OMP_REDUCTION_PLUS:
+ OMP_CLAUSE_REDUCTION_CODE (node) = PLUS_EXPR;
+ break;
+ case OMP_REDUCTION_MINUS:
+ OMP_CLAUSE_REDUCTION_CODE (node) = MINUS_EXPR;
+ break;
+ case OMP_REDUCTION_TIMES:
+ OMP_CLAUSE_REDUCTION_CODE (node) = MULT_EXPR;
+ break;
+ case OMP_REDUCTION_AND:
+ OMP_CLAUSE_REDUCTION_CODE (node) = TRUTH_ANDIF_EXPR;
+ break;
+ case OMP_REDUCTION_OR:
+ OMP_CLAUSE_REDUCTION_CODE (node) = TRUTH_ORIF_EXPR;
+ break;
+ case OMP_REDUCTION_EQV:
+ OMP_CLAUSE_REDUCTION_CODE (node) = EQ_EXPR;
+ break;
+ case OMP_REDUCTION_NEQV:
+ OMP_CLAUSE_REDUCTION_CODE (node) = NE_EXPR;
+ break;
+ case OMP_REDUCTION_MAX:
+ OMP_CLAUSE_REDUCTION_CODE (node) = MAX_EXPR;
+ break;
+ case OMP_REDUCTION_MIN:
+ OMP_CLAUSE_REDUCTION_CODE (node) = MIN_EXPR;
+ break;
+ case OMP_REDUCTION_IAND:
+ OMP_CLAUSE_REDUCTION_CODE (node) = BIT_AND_EXPR;
+ break;
+ case OMP_REDUCTION_IOR:
+ OMP_CLAUSE_REDUCTION_CODE (node) = BIT_IOR_EXPR;
+ break;
+ case OMP_REDUCTION_IEOR:
+ OMP_CLAUSE_REDUCTION_CODE (node) = BIT_XOR_EXPR;
+ break;
+ case OMP_REDUCTION_USER:
+ OMP_CLAUSE_REDUCTION_CODE (node) = ERROR_MARK;
+ break;
+ default:
+ gcc_unreachable ();
+ }
+ if (namelist->sym->attr.dimension
+ || namelist->u.reduction_op == OMP_REDUCTION_USER
+ || namelist->sym->attr.allocatable)
+ gfc_trans_omp_array_reduction_or_udr (node, namelist, where);
list = gfc_trans_add_clause (node, list);
}
}
static tree
gfc_trans_omp_clauses (stmtblock_t *block, gfc_omp_clauses *clauses,
- locus where)
+ locus where, bool declare_simd = false)
{
tree omp_clauses = NULL_TREE, chunk_size, c;
int list;
for (list = 0; list < OMP_LIST_NUM; list++)
{
- gfc_namelist *n = clauses->lists[list];
+ gfc_omp_namelist *n = clauses->lists[list];
if (n == NULL)
continue;
- if (list >= OMP_LIST_REDUCTION_FIRST
- && list <= OMP_LIST_REDUCTION_LAST)
- {
- enum tree_code reduction_code;
- switch (list)
- {
- case OMP_LIST_PLUS:
- reduction_code = PLUS_EXPR;
- break;
- case OMP_LIST_MULT:
- reduction_code = MULT_EXPR;
- break;
- case OMP_LIST_SUB:
- reduction_code = MINUS_EXPR;
- break;
- case OMP_LIST_AND:
- reduction_code = TRUTH_ANDIF_EXPR;
- break;
- case OMP_LIST_OR:
- reduction_code = TRUTH_ORIF_EXPR;
- break;
- case OMP_LIST_EQV:
- reduction_code = EQ_EXPR;
- break;
- case OMP_LIST_NEQV:
- reduction_code = NE_EXPR;
- break;
- case OMP_LIST_MAX:
- reduction_code = MAX_EXPR;
- break;
- case OMP_LIST_MIN:
- reduction_code = MIN_EXPR;
- break;
- case OMP_LIST_IAND:
- reduction_code = BIT_AND_EXPR;
- break;
- case OMP_LIST_IOR:
- reduction_code = BIT_IOR_EXPR;
- break;
- case OMP_LIST_IEOR:
- reduction_code = BIT_XOR_EXPR;
- break;
- default:
- gcc_unreachable ();
- }
- omp_clauses
- = gfc_trans_omp_reduction_list (n, omp_clauses, reduction_code,
- where);
- continue;
- }
switch (list)
{
+ case OMP_LIST_REDUCTION:
+ omp_clauses = gfc_trans_omp_reduction_list (n, omp_clauses, where);
+ break;
case OMP_LIST_PRIVATE:
clause_code = OMP_CLAUSE_PRIVATE;
goto add_clause;
goto add_clause;
case OMP_LIST_COPYPRIVATE:
clause_code = OMP_CLAUSE_COPYPRIVATE;
+ goto add_clause;
+ case OMP_LIST_UNIFORM:
+ clause_code = OMP_CLAUSE_UNIFORM;
/* FALLTHROUGH */
add_clause:
omp_clauses
- = gfc_trans_omp_variable_list (clause_code, n, omp_clauses);
+ = gfc_trans_omp_variable_list (clause_code, n, omp_clauses,
+ declare_simd);
+ break;
+ case OMP_LIST_ALIGNED:
+ for (; n != NULL; n = n->next)
+ if (n->sym->attr.referenced || declare_simd)
+ {
+ tree t = gfc_trans_omp_variable (n->sym, declare_simd);
+ if (t != error_mark_node)
+ {
+ tree node = build_omp_clause (input_location,
+ OMP_CLAUSE_ALIGNED);
+ OMP_CLAUSE_DECL (node) = t;
+ if (n->expr)
+ {
+ tree alignment_var;
+
+ if (block == NULL)
+ alignment_var = gfc_conv_constant_to_tree (n->expr);
+ else
+ {
+ gfc_init_se (&se, NULL);
+ gfc_conv_expr (&se, n->expr);
+ gfc_add_block_to_block (block, &se.pre);
+ alignment_var = gfc_evaluate_now (se.expr, block);
+ gfc_add_block_to_block (block, &se.post);
+ }
+ OMP_CLAUSE_ALIGNED_ALIGNMENT (node) = alignment_var;
+ }
+ omp_clauses = gfc_trans_add_clause (node, omp_clauses);
+ }
+ }
+ break;
+ case OMP_LIST_LINEAR:
+ {
+ gfc_expr *last_step_expr = NULL;
+ tree last_step = NULL_TREE;
+
+ for (; n != NULL; n = n->next)
+ {
+ if (n->expr)
+ {
+ last_step_expr = n->expr;
+ last_step = NULL_TREE;
+ }
+ if (n->sym->attr.referenced || declare_simd)
+ {
+ tree t = gfc_trans_omp_variable (n->sym, declare_simd);
+ if (t != error_mark_node)
+ {
+ tree node = build_omp_clause (input_location,
+ OMP_CLAUSE_LINEAR);
+ OMP_CLAUSE_DECL (node) = t;
+ if (last_step_expr && last_step == NULL_TREE)
+ {
+ if (block == NULL)
+ last_step
+ = gfc_conv_constant_to_tree (last_step_expr);
+ else
+ {
+ gfc_init_se (&se, NULL);
+ gfc_conv_expr (&se, last_step_expr);
+ gfc_add_block_to_block (block, &se.pre);
+ last_step = gfc_evaluate_now (se.expr, block);
+ gfc_add_block_to_block (block, &se.post);
+ }
+ }
+ OMP_CLAUSE_LINEAR_STEP (node)
+ = fold_convert (gfc_typenode_for_spec (&n->sym->ts),
+ last_step);
+ if (n->sym->attr.dimension || n->sym->attr.allocatable)
+ OMP_CLAUSE_LINEAR_ARRAY (node) = 1;
+ omp_clauses = gfc_trans_add_clause (node, omp_clauses);
+ }
+ }
+ }
+ }
+ break;
+ case OMP_LIST_DEPEND:
+ for (; n != NULL; n = n->next)
+ {
+ if (!n->sym->attr.referenced)
+ continue;
+
+ tree node = build_omp_clause (input_location, OMP_CLAUSE_DEPEND);
+ if (n->expr == NULL || n->expr->ref->u.ar.type == AR_FULL)
+ {
+ tree decl = gfc_get_symbol_decl (n->sym);
+ if (gfc_omp_privatize_by_reference (decl))
+ decl = build_fold_indirect_ref (decl);
+ if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (decl)))
+ {
+ decl = gfc_conv_descriptor_data_get (decl);
+ decl = fold_convert (build_pointer_type (char_type_node),
+ decl);
+ decl = build_fold_indirect_ref (decl);
+ }
+ else if (DECL_P (decl))
+ TREE_ADDRESSABLE (decl) = 1;
+ OMP_CLAUSE_DECL (node) = decl;
+ }
+ else
+ {
+ tree ptr;
+ gfc_init_se (&se, NULL);
+ if (n->expr->ref->u.ar.type == AR_ELEMENT)
+ {
+ gfc_conv_expr_reference (&se, n->expr);
+ ptr = se.expr;
+ }
+ else
+ {
+ gfc_conv_expr_descriptor (&se, n->expr);
+ ptr = gfc_conv_array_data (se.expr);
+ }
+ gfc_add_block_to_block (block, &se.pre);
+ gfc_add_block_to_block (block, &se.post);
+ ptr = fold_convert (build_pointer_type (char_type_node),
+ ptr);
+ OMP_CLAUSE_DECL (node) = build_fold_indirect_ref (ptr);
+ }
+ switch (n->u.depend_op)
+ {
+ case OMP_DEPEND_IN:
+ OMP_CLAUSE_DEPEND_KIND (node) = OMP_CLAUSE_DEPEND_IN;
+ break;
+ case OMP_DEPEND_OUT:
+ OMP_CLAUSE_DEPEND_KIND (node) = OMP_CLAUSE_DEPEND_OUT;
+ break;
+ case OMP_DEPEND_INOUT:
+ OMP_CLAUSE_DEPEND_KIND (node) = OMP_CLAUSE_DEPEND_INOUT;
+ break;
+ default:
+ gcc_unreachable ();
+ }
+ omp_clauses = gfc_trans_add_clause (node, omp_clauses);
+ }
+ break;
+ case OMP_LIST_MAP:
+ for (; n != NULL; n = n->next)
+ {
+ if (!n->sym->attr.referenced)
+ continue;
+
+ tree node = build_omp_clause (input_location, OMP_CLAUSE_MAP);
+ tree node2 = NULL_TREE;
+ tree node3 = NULL_TREE;
+ tree node4 = NULL_TREE;
+ tree decl = gfc_get_symbol_decl (n->sym);
+ if (DECL_P (decl))
+ TREE_ADDRESSABLE (decl) = 1;
+ if (n->expr == NULL || n->expr->ref->u.ar.type == AR_FULL)
+ {
+ if (POINTER_TYPE_P (TREE_TYPE (decl)))
+ {
+ node4 = build_omp_clause (input_location,
+ OMP_CLAUSE_MAP);
+ OMP_CLAUSE_MAP_KIND (node4) = OMP_CLAUSE_MAP_POINTER;
+ OMP_CLAUSE_DECL (node4) = decl;
+ OMP_CLAUSE_SIZE (node4) = size_int (0);
+ decl = build_fold_indirect_ref (decl);
+ }
+ if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (decl)))
+ {
+ tree type = TREE_TYPE (decl);
+ tree ptr = gfc_conv_descriptor_data_get (decl);
+ ptr = fold_convert (build_pointer_type (char_type_node),
+ ptr);
+ ptr = build_fold_indirect_ref (ptr);
+ OMP_CLAUSE_DECL (node) = ptr;
+ node2 = build_omp_clause (input_location,
+ OMP_CLAUSE_MAP);
+ OMP_CLAUSE_MAP_KIND (node2) = OMP_CLAUSE_MAP_TO_PSET;
+ OMP_CLAUSE_DECL (node2) = decl;
+ OMP_CLAUSE_SIZE (node2) = TYPE_SIZE_UNIT (type);
+ node3 = build_omp_clause (input_location,
+ OMP_CLAUSE_MAP);
+ OMP_CLAUSE_MAP_KIND (node3) = OMP_CLAUSE_MAP_POINTER;
+ OMP_CLAUSE_DECL (node3)
+ = gfc_conv_descriptor_data_get (decl);
+ OMP_CLAUSE_SIZE (node3) = size_int (0);
+ if (n->sym->attr.pointer)
+ {
+ stmtblock_t cond_block;
+ tree size
+ = gfc_create_var (gfc_array_index_type, NULL);
+ tree tem, then_b, else_b, zero, cond;
+
+ gfc_init_block (&cond_block);
+ tem
+ = gfc_full_array_size (&cond_block, decl,
+ GFC_TYPE_ARRAY_RANK (type));
+ gfc_add_modify (&cond_block, size, tem);
+ then_b = gfc_finish_block (&cond_block);
+ gfc_init_block (&cond_block);
+ zero = build_int_cst (gfc_array_index_type, 0);
+ gfc_add_modify (&cond_block, size, zero);
+ else_b = gfc_finish_block (&cond_block);
+ tem = gfc_conv_descriptor_data_get (decl);
+ tem = fold_convert (pvoid_type_node, tem);
+ cond = fold_build2_loc (input_location, NE_EXPR,
+ boolean_type_node,
+ tem, null_pointer_node);
+ gfc_add_expr_to_block (block,
+ build3_loc (input_location,
+ COND_EXPR,
+ void_type_node,
+ cond, then_b,
+ else_b));
+ OMP_CLAUSE_SIZE (node) = size;
+ }
+ else
+ OMP_CLAUSE_SIZE (node)
+ = gfc_full_array_size (block, decl,
+ GFC_TYPE_ARRAY_RANK (type));
+ tree elemsz
+ = TYPE_SIZE_UNIT (gfc_get_element_type (type));
+ elemsz = fold_convert (gfc_array_index_type, elemsz);
+ OMP_CLAUSE_SIZE (node)
+ = fold_build2 (MULT_EXPR, gfc_array_index_type,
+ OMP_CLAUSE_SIZE (node), elemsz);
+ }
+ else
+ OMP_CLAUSE_DECL (node) = decl;
+ }
+ else
+ {
+ tree ptr, ptr2;
+ gfc_init_se (&se, NULL);
+ if (n->expr->ref->u.ar.type == AR_ELEMENT)
+ {
+ gfc_conv_expr_reference (&se, n->expr);
+ gfc_add_block_to_block (block, &se.pre);
+ ptr = se.expr;
+ OMP_CLAUSE_SIZE (node)
+ = TYPE_SIZE_UNIT (TREE_TYPE (ptr));
+ }
+ else
+ {
+ gfc_conv_expr_descriptor (&se, n->expr);
+ ptr = gfc_conv_array_data (se.expr);
+ tree type = TREE_TYPE (se.expr);
+ gfc_add_block_to_block (block, &se.pre);
+ OMP_CLAUSE_SIZE (node)
+ = gfc_full_array_size (block, se.expr,
+ GFC_TYPE_ARRAY_RANK (type));
+ tree elemsz
+ = TYPE_SIZE_UNIT (gfc_get_element_type (type));
+ elemsz = fold_convert (gfc_array_index_type, elemsz);
+ OMP_CLAUSE_SIZE (node)
+ = fold_build2 (MULT_EXPR, gfc_array_index_type,
+ OMP_CLAUSE_SIZE (node), elemsz);
+ }
+ gfc_add_block_to_block (block, &se.post);
+ ptr = fold_convert (build_pointer_type (char_type_node),
+ ptr);
+ OMP_CLAUSE_DECL (node) = build_fold_indirect_ref (ptr);
+
+ if (POINTER_TYPE_P (TREE_TYPE (decl))
+ && GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (TREE_TYPE (decl))))
+ {
+ node4 = build_omp_clause (input_location,
+ OMP_CLAUSE_MAP);
+ OMP_CLAUSE_MAP_KIND (node4) = OMP_CLAUSE_MAP_POINTER;
+ OMP_CLAUSE_DECL (node4) = decl;
+ OMP_CLAUSE_SIZE (node4) = size_int (0);
+ decl = build_fold_indirect_ref (decl);
+ }
+ ptr = fold_convert (sizetype, ptr);
+ if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (decl)))
+ {
+ tree type = TREE_TYPE (decl);
+ ptr2 = gfc_conv_descriptor_data_get (decl);
+ node2 = build_omp_clause (input_location,
+ OMP_CLAUSE_MAP);
+ OMP_CLAUSE_MAP_KIND (node2) = OMP_CLAUSE_MAP_TO_PSET;
+ OMP_CLAUSE_DECL (node2) = decl;
+ OMP_CLAUSE_SIZE (node2) = TYPE_SIZE_UNIT (type);
+ node3 = build_omp_clause (input_location,
+ OMP_CLAUSE_MAP);
+ OMP_CLAUSE_MAP_KIND (node3) = OMP_CLAUSE_MAP_POINTER;
+ OMP_CLAUSE_DECL (node3)
+ = gfc_conv_descriptor_data_get (decl);
+ }
+ else
+ {
+ if (TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE)
+ ptr2 = build_fold_addr_expr (decl);
+ else
+ {
+ gcc_assert (POINTER_TYPE_P (TREE_TYPE (decl)));
+ ptr2 = decl;
+ }
+ node3 = build_omp_clause (input_location,
+ OMP_CLAUSE_MAP);
+ OMP_CLAUSE_MAP_KIND (node3) = OMP_CLAUSE_MAP_POINTER;
+ OMP_CLAUSE_DECL (node3) = decl;
+ }
+ ptr2 = fold_convert (sizetype, ptr2);
+ OMP_CLAUSE_SIZE (node3)
+ = fold_build2 (MINUS_EXPR, sizetype, ptr, ptr2);
+ }
+ switch (n->u.map_op)
+ {
+ case OMP_MAP_ALLOC:
+ OMP_CLAUSE_MAP_KIND (node) = OMP_CLAUSE_MAP_ALLOC;
+ break;
+ case OMP_MAP_TO:
+ OMP_CLAUSE_MAP_KIND (node) = OMP_CLAUSE_MAP_TO;
+ break;
+ case OMP_MAP_FROM:
+ OMP_CLAUSE_MAP_KIND (node) = OMP_CLAUSE_MAP_FROM;
+ break;
+ case OMP_MAP_TOFROM:
+ OMP_CLAUSE_MAP_KIND (node) = OMP_CLAUSE_MAP_TOFROM;
+ break;
+ default:
+ gcc_unreachable ();
+ }
+ omp_clauses = gfc_trans_add_clause (node, omp_clauses);
+ if (node2)
+ omp_clauses = gfc_trans_add_clause (node2, omp_clauses);
+ if (node3)
+ omp_clauses = gfc_trans_add_clause (node3, omp_clauses);
+ if (node4)
+ omp_clauses = gfc_trans_add_clause (node4, omp_clauses);
+ }
+ break;
+ case OMP_LIST_TO:
+ case OMP_LIST_FROM:
+ for (; n != NULL; n = n->next)
+ {
+ if (!n->sym->attr.referenced)
+ continue;
+
+ tree node = build_omp_clause (input_location,
+ list == OMP_LIST_TO
+ ? OMP_CLAUSE_TO : OMP_CLAUSE_FROM);
+ if (n->expr == NULL || n->expr->ref->u.ar.type == AR_FULL)
+ {
+ tree decl = gfc_get_symbol_decl (n->sym);
+ if (gfc_omp_privatize_by_reference (decl))
+ decl = build_fold_indirect_ref (decl);
+ if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (decl)))
+ {
+ tree type = TREE_TYPE (decl);
+ tree ptr = gfc_conv_descriptor_data_get (decl);
+ ptr = fold_convert (build_pointer_type (char_type_node),
+ ptr);
+ ptr = build_fold_indirect_ref (ptr);
+ OMP_CLAUSE_DECL (node) = ptr;
+ OMP_CLAUSE_SIZE (node)
+ = gfc_full_array_size (block, decl,
+ GFC_TYPE_ARRAY_RANK (type));
+ tree elemsz
+ = TYPE_SIZE_UNIT (gfc_get_element_type (type));
+ elemsz = fold_convert (gfc_array_index_type, elemsz);
+ OMP_CLAUSE_SIZE (node)
+ = fold_build2 (MULT_EXPR, gfc_array_index_type,
+ OMP_CLAUSE_SIZE (node), elemsz);
+ }
+ else
+ OMP_CLAUSE_DECL (node) = decl;
+ }
+ else
+ {
+ tree ptr;
+ gfc_init_se (&se, NULL);
+ if (n->expr->ref->u.ar.type == AR_ELEMENT)
+ {
+ gfc_conv_expr_reference (&se, n->expr);
+ ptr = se.expr;
+ gfc_add_block_to_block (block, &se.pre);
+ OMP_CLAUSE_SIZE (node)
+ = TYPE_SIZE_UNIT (TREE_TYPE (ptr));
+ }
+ else
+ {
+ gfc_conv_expr_descriptor (&se, n->expr);
+ ptr = gfc_conv_array_data (se.expr);
+ tree type = TREE_TYPE (se.expr);
+ gfc_add_block_to_block (block, &se.pre);
+ OMP_CLAUSE_SIZE (node)
+ = gfc_full_array_size (block, se.expr,
+ GFC_TYPE_ARRAY_RANK (type));
+ tree elemsz
+ = TYPE_SIZE_UNIT (gfc_get_element_type (type));
+ elemsz = fold_convert (gfc_array_index_type, elemsz);
+ OMP_CLAUSE_SIZE (node)
+ = fold_build2 (MULT_EXPR, gfc_array_index_type,
+ OMP_CLAUSE_SIZE (node), elemsz);
+ }
+ gfc_add_block_to_block (block, &se.post);
+ ptr = fold_convert (build_pointer_type (char_type_node),
+ ptr);
+ OMP_CLAUSE_DECL (node) = build_fold_indirect_ref (ptr);
+ }
+ omp_clauses = gfc_trans_add_clause (node, omp_clauses);
+ }
break;
default:
break;
omp_clauses = gfc_trans_add_clause (c, omp_clauses);
}
- return omp_clauses;
+ if (clauses->inbranch)
+ {
+ c = build_omp_clause (where.lb->location, OMP_CLAUSE_INBRANCH);
+ omp_clauses = gfc_trans_add_clause (c, omp_clauses);
+ }
+
+ if (clauses->notinbranch)
+ {
+ c = build_omp_clause (where.lb->location, OMP_CLAUSE_NOTINBRANCH);
+ omp_clauses = gfc_trans_add_clause (c, omp_clauses);
+ }
+
+ switch (clauses->cancel)
+ {
+ case OMP_CANCEL_UNKNOWN:
+ break;
+ case OMP_CANCEL_PARALLEL:
+ c = build_omp_clause (where.lb->location, OMP_CLAUSE_PARALLEL);
+ omp_clauses = gfc_trans_add_clause (c, omp_clauses);
+ break;
+ case OMP_CANCEL_SECTIONS:
+ c = build_omp_clause (where.lb->location, OMP_CLAUSE_SECTIONS);
+ omp_clauses = gfc_trans_add_clause (c, omp_clauses);
+ break;
+ case OMP_CANCEL_DO:
+ c = build_omp_clause (where.lb->location, OMP_CLAUSE_FOR);
+ omp_clauses = gfc_trans_add_clause (c, omp_clauses);
+ break;
+ case OMP_CANCEL_TASKGROUP:
+ c = build_omp_clause (where.lb->location, OMP_CLAUSE_TASKGROUP);
+ omp_clauses = gfc_trans_add_clause (c, omp_clauses);
+ break;
+ }
+
+ if (clauses->proc_bind != OMP_PROC_BIND_UNKNOWN)
+ {
+ c = build_omp_clause (where.lb->location, OMP_CLAUSE_PROC_BIND);
+ switch (clauses->proc_bind)
+ {
+ case OMP_PROC_BIND_MASTER:
+ OMP_CLAUSE_PROC_BIND_KIND (c) = OMP_CLAUSE_PROC_BIND_MASTER;
+ break;
+ case OMP_PROC_BIND_SPREAD:
+ OMP_CLAUSE_PROC_BIND_KIND (c) = OMP_CLAUSE_PROC_BIND_SPREAD;
+ break;
+ case OMP_PROC_BIND_CLOSE:
+ OMP_CLAUSE_PROC_BIND_KIND (c) = OMP_CLAUSE_PROC_BIND_CLOSE;
+ break;
+ default:
+ gcc_unreachable ();
+ }
+ omp_clauses = gfc_trans_add_clause (c, omp_clauses);
+ }
+
+ if (clauses->safelen_expr)
+ {
+ tree safelen_var;
+
+ gfc_init_se (&se, NULL);
+ gfc_conv_expr (&se, clauses->safelen_expr);
+ gfc_add_block_to_block (block, &se.pre);
+ safelen_var = gfc_evaluate_now (se.expr, block);
+ gfc_add_block_to_block (block, &se.post);
+
+ c = build_omp_clause (where.lb->location, OMP_CLAUSE_SAFELEN);
+ OMP_CLAUSE_SAFELEN_EXPR (c) = safelen_var;
+ omp_clauses = gfc_trans_add_clause (c, omp_clauses);
+ }
+
+ if (clauses->simdlen_expr)
+ {
+ c = build_omp_clause (where.lb->location, OMP_CLAUSE_SIMDLEN);
+ OMP_CLAUSE_SIMDLEN_EXPR (c)
+ = gfc_conv_constant_to_tree (clauses->simdlen_expr);
+ omp_clauses = gfc_trans_add_clause (c, omp_clauses);
+ }
+
+ if (clauses->num_teams)
+ {
+ tree num_teams;
+
+ gfc_init_se (&se, NULL);
+ gfc_conv_expr (&se, clauses->num_teams);
+ gfc_add_block_to_block (block, &se.pre);
+ num_teams = gfc_evaluate_now (se.expr, block);
+ gfc_add_block_to_block (block, &se.post);
+
+ c = build_omp_clause (where.lb->location, OMP_CLAUSE_NUM_TEAMS);
+ OMP_CLAUSE_NUM_TEAMS_EXPR (c) = num_teams;
+ omp_clauses = gfc_trans_add_clause (c, omp_clauses);
+ }
+
+ if (clauses->device)
+ {
+ tree device;
+
+ gfc_init_se (&se, NULL);
+ gfc_conv_expr (&se, clauses->device);
+ gfc_add_block_to_block (block, &se.pre);
+ device = gfc_evaluate_now (se.expr, block);
+ gfc_add_block_to_block (block, &se.post);
+
+ c = build_omp_clause (where.lb->location, OMP_CLAUSE_DEVICE);
+ OMP_CLAUSE_DEVICE_ID (c) = device;
+ omp_clauses = gfc_trans_add_clause (c, omp_clauses);
+ }
+
+ if (clauses->thread_limit)
+ {
+ tree thread_limit;
+
+ gfc_init_se (&se, NULL);
+ gfc_conv_expr (&se, clauses->thread_limit);
+ gfc_add_block_to_block (block, &se.pre);
+ thread_limit = gfc_evaluate_now (se.expr, block);
+ gfc_add_block_to_block (block, &se.post);
+
+ c = build_omp_clause (where.lb->location, OMP_CLAUSE_THREAD_LIMIT);
+ OMP_CLAUSE_THREAD_LIMIT_EXPR (c) = thread_limit;
+ omp_clauses = gfc_trans_add_clause (c, omp_clauses);
+ }
+
+ chunk_size = NULL_TREE;
+ if (clauses->dist_chunk_size)
+ {
+ gfc_init_se (&se, NULL);
+ gfc_conv_expr (&se, clauses->dist_chunk_size);
+ gfc_add_block_to_block (block, &se.pre);
+ chunk_size = gfc_evaluate_now (se.expr, block);
+ gfc_add_block_to_block (block, &se.post);
+ }
+
+ if (clauses->dist_sched_kind != OMP_SCHED_NONE)
+ {
+ c = build_omp_clause (where.lb->location, OMP_CLAUSE_DIST_SCHEDULE);
+ OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (c) = chunk_size;
+ omp_clauses = gfc_trans_add_clause (c, omp_clauses);
+ }
+
+ return nreverse (omp_clauses);
}
/* Like gfc_trans_code, but force creation of a BIND_EXPR around it. */
enum tree_code op = ERROR_MARK;
enum tree_code aop = OMP_ATOMIC;
bool var_on_left = false;
+ bool seq_cst = (atomic_code->ext.omp_atomic & GFC_OMP_ATOMIC_SEQ_CST) != 0;
code = code->block->next;
gcc_assert (code->op == EXEC_ASSIGN);
&& expr2->value.function.isym->id == GFC_ISYM_CONVERSION)
expr2 = expr2->value.function.actual->expr;
- switch (atomic_code->ext.omp_atomic)
+ switch (atomic_code->ext.omp_atomic & GFC_OMP_ATOMIC_MASK)
{
case GFC_OMP_ATOMIC_READ:
gfc_conv_expr (&vse, code->expr1);
lhsaddr = gfc_build_addr_expr (NULL, lse.expr);
x = build1 (OMP_ATOMIC_READ, type, lhsaddr);
+ OMP_ATOMIC_SEQ_CST (x) = seq_cst;
x = convert (TREE_TYPE (vse.expr), x);
gfc_add_modify (&block, vse.expr, x);
type = TREE_TYPE (lse.expr);
lhsaddr = gfc_build_addr_expr (NULL, lse.expr);
- if (atomic_code->ext.omp_atomic == GFC_OMP_ATOMIC_WRITE)
+ if (((atomic_code->ext.omp_atomic & GFC_OMP_ATOMIC_MASK)
+ == GFC_OMP_ATOMIC_WRITE)
+ || (atomic_code->ext.omp_atomic & GFC_OMP_ATOMIC_SWAP))
{
gfc_conv_expr (&rse, expr2);
gfc_add_block_to_block (&block, &rse.pre);
lhsaddr = save_expr (lhsaddr);
rhs = gfc_evaluate_now (rse.expr, &block);
- if (atomic_code->ext.omp_atomic == GFC_OMP_ATOMIC_WRITE)
+ if (((atomic_code->ext.omp_atomic & GFC_OMP_ATOMIC_MASK)
+ == GFC_OMP_ATOMIC_WRITE)
+ || (atomic_code->ext.omp_atomic & GFC_OMP_ATOMIC_SWAP))
x = rhs;
else
{
if (aop == OMP_ATOMIC)
{
x = build2_v (OMP_ATOMIC, lhsaddr, convert (type, x));
+ OMP_ATOMIC_SEQ_CST (x) = seq_cst;
gfc_add_expr_to_block (&block, x);
}
else
gfc_add_block_to_block (&block, &lse.pre);
}
x = build2 (aop, type, lhsaddr, convert (type, x));
+ OMP_ATOMIC_SEQ_CST (x) = seq_cst;
x = convert (TREE_TYPE (vse.expr), x);
gfc_add_modify (&block, vse.expr, x);
}
}
static tree
+gfc_trans_omp_cancel (gfc_code *code)
+{
+ int mask = 0;
+ tree ifc = boolean_true_node;
+ stmtblock_t block;
+ switch (code->ext.omp_clauses->cancel)
+ {
+ case OMP_CANCEL_PARALLEL: mask = 1; break;
+ case OMP_CANCEL_DO: mask = 2; break;
+ case OMP_CANCEL_SECTIONS: mask = 4; break;
+ case OMP_CANCEL_TASKGROUP: mask = 8; break;
+ default: gcc_unreachable ();
+ }
+ gfc_start_block (&block);
+ if (code->ext.omp_clauses->if_expr)
+ {
+ gfc_se se;
+ tree if_var;
+
+ gfc_init_se (&se, NULL);
+ gfc_conv_expr (&se, code->ext.omp_clauses->if_expr);
+ gfc_add_block_to_block (&block, &se.pre);
+ if_var = gfc_evaluate_now (se.expr, &block);
+ gfc_add_block_to_block (&block, &se.post);
+ tree type = TREE_TYPE (if_var);
+ ifc = fold_build2_loc (input_location, NE_EXPR,
+ boolean_type_node, if_var,
+ build_zero_cst (type));
+ }
+ tree decl = builtin_decl_explicit (BUILT_IN_GOMP_CANCEL);
+ tree c_bool_type = TREE_TYPE (TREE_TYPE (decl));
+ ifc = fold_convert (c_bool_type, ifc);
+ gfc_add_expr_to_block (&block,
+ build_call_expr_loc (input_location, decl, 2,
+ build_int_cst (integer_type_node,
+ mask), ifc));
+ return gfc_finish_block (&block);
+}
+
+static tree
+gfc_trans_omp_cancellation_point (gfc_code *code)
+{
+ int mask = 0;
+ switch (code->ext.omp_clauses->cancel)
+ {
+ case OMP_CANCEL_PARALLEL: mask = 1; break;
+ case OMP_CANCEL_DO: mask = 2; break;
+ case OMP_CANCEL_SECTIONS: mask = 4; break;
+ case OMP_CANCEL_TASKGROUP: mask = 8; break;
+ default: gcc_unreachable ();
+ }
+ tree decl = builtin_decl_explicit (BUILT_IN_GOMP_CANCELLATION_POINT);
+ return build_call_expr_loc (input_location, decl, 1,
+ build_int_cst (integer_type_node, mask));
+}
+
+static tree
gfc_trans_omp_critical (gfc_code *code)
{
tree name = NULL_TREE, stmt;
static tree
-gfc_trans_omp_do (gfc_code *code, stmtblock_t *pblock,
+gfc_trans_omp_do (gfc_code *code, gfc_exec_op op, stmtblock_t *pblock,
gfc_omp_clauses *do_clauses, tree par_clauses)
{
gfc_se se;
if (clauses)
{
- gfc_namelist *n;
- for (n = clauses->lists[OMP_LIST_LASTPRIVATE]; n != NULL;
- n = n->next)
- if (code->ext.iterator->var->symtree->n.sym == n->sym)
- break;
+ gfc_omp_namelist *n = NULL;
+ if (op != EXEC_OMP_DISTRIBUTE)
+ for (n = clauses->lists[(op == EXEC_OMP_SIMD && collapse == 1)
+ ? OMP_LIST_LINEAR : OMP_LIST_LASTPRIVATE];
+ n != NULL; n = n->next)
+ if (code->ext.iterator->var->symtree->n.sym == n->sym)
+ break;
if (n != NULL)
dovar_found = 1;
- else if (n == NULL)
+ else if (n == NULL && op != EXEC_OMP_SIMD)
for (n = clauses->lists[OMP_LIST_PRIVATE]; n != NULL; n = n->next)
if (code->ext.iterator->var->symtree->n.sym == n->sym)
break;
}
else
dovar_decl
- = gfc_trans_omp_variable (code->ext.iterator->var->symtree->n.sym);
+ = gfc_trans_omp_variable (code->ext.iterator->var->symtree->n.sym,
+ false);
/* Loop body. */
if (simple)
if (!dovar_found)
{
- tmp = build_omp_clause (input_location, OMP_CLAUSE_PRIVATE);
+ if (op == EXEC_OMP_SIMD)
+ {
+ if (collapse == 1)
+ {
+ tmp = build_omp_clause (input_location, OMP_CLAUSE_LINEAR);
+ OMP_CLAUSE_LINEAR_STEP (tmp) = step;
+ }
+ else
+ tmp = build_omp_clause (input_location, OMP_CLAUSE_LASTPRIVATE);
+ if (!simple)
+ dovar_found = 2;
+ }
+ else
+ tmp = build_omp_clause (input_location, OMP_CLAUSE_PRIVATE);
OMP_CLAUSE_DECL (tmp) = dovar_decl;
omp_clauses = gfc_trans_add_clause (tmp, omp_clauses);
}
- else if (dovar_found == 2)
+ if (dovar_found == 2)
{
tree c = NULL;
OMP_CLAUSE_LASTPRIVATE_STMT (c) = tmp;
break;
}
+ else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LINEAR
+ && OMP_CLAUSE_DECL (c) == dovar_decl)
+ {
+ OMP_CLAUSE_LINEAR_STMT (c) = tmp;
+ break;
+ }
}
- if (c == NULL && par_clauses != NULL)
+ if (c == NULL && op == EXEC_OMP_DO && par_clauses != NULL)
{
for (c = par_clauses; c ; c = OMP_CLAUSE_CHAIN (c))
if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE
}
if (!simple)
{
- tmp = build_omp_clause (input_location, OMP_CLAUSE_PRIVATE);
+ if (op != EXEC_OMP_SIMD)
+ tmp = build_omp_clause (input_location, OMP_CLAUSE_PRIVATE);
+ else if (collapse == 1)
+ {
+ tmp = build_omp_clause (input_location, OMP_CLAUSE_LINEAR);
+ OMP_CLAUSE_LINEAR_STEP (tmp) = step;
+ OMP_CLAUSE_LINEAR_NO_COPYIN (tmp) = 1;
+ OMP_CLAUSE_LINEAR_NO_COPYOUT (tmp) = 1;
+ }
+ else
+ tmp = build_omp_clause (input_location, OMP_CLAUSE_LASTPRIVATE);
OMP_CLAUSE_DECL (tmp) = count;
omp_clauses = gfc_trans_add_clause (tmp, omp_clauses);
}
}
/* End of loop body. */
- stmt = make_node (OMP_FOR);
+ switch (op)
+ {
+ case EXEC_OMP_SIMD: stmt = make_node (OMP_SIMD); break;
+ case EXEC_OMP_DO: stmt = make_node (OMP_FOR); break;
+ case EXEC_OMP_DISTRIBUTE: stmt = make_node (OMP_DISTRIBUTE); break;
+ default: gcc_unreachable ();
+ }
TREE_TYPE (stmt) = void_type_node;
OMP_FOR_BODY (stmt) = gfc_finish_block (&body);
return gfc_finish_block (&block);
}
+enum
+{
+ GFC_OMP_SPLIT_SIMD,
+ GFC_OMP_SPLIT_DO,
+ GFC_OMP_SPLIT_PARALLEL,
+ GFC_OMP_SPLIT_DISTRIBUTE,
+ GFC_OMP_SPLIT_TEAMS,
+ GFC_OMP_SPLIT_TARGET,
+ GFC_OMP_SPLIT_NUM
+};
+
+enum
+{
+ GFC_OMP_MASK_SIMD = (1 << GFC_OMP_SPLIT_SIMD),
+ GFC_OMP_MASK_DO = (1 << GFC_OMP_SPLIT_DO),
+ GFC_OMP_MASK_PARALLEL = (1 << GFC_OMP_SPLIT_PARALLEL),
+ GFC_OMP_MASK_DISTRIBUTE = (1 << GFC_OMP_SPLIT_DISTRIBUTE),
+ GFC_OMP_MASK_TEAMS = (1 << GFC_OMP_SPLIT_TEAMS),
+ GFC_OMP_MASK_TARGET = (1 << GFC_OMP_SPLIT_TARGET)
+};
+
+static void
+gfc_split_omp_clauses (gfc_code *code,
+ gfc_omp_clauses clausesa[GFC_OMP_SPLIT_NUM])
+{
+ int mask = 0, innermost = 0;
+ memset (clausesa, 0, GFC_OMP_SPLIT_NUM * sizeof (gfc_omp_clauses));
+ switch (code->op)
+ {
+ case EXEC_OMP_DISTRIBUTE:
+ innermost = GFC_OMP_SPLIT_DISTRIBUTE;
+ break;
+ case EXEC_OMP_DISTRIBUTE_PARALLEL_DO:
+ mask = GFC_OMP_MASK_DISTRIBUTE | GFC_OMP_MASK_PARALLEL | GFC_OMP_MASK_DO;
+ innermost = GFC_OMP_SPLIT_DO;
+ break;
+ case EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD:
+ mask = GFC_OMP_MASK_DISTRIBUTE | GFC_OMP_MASK_PARALLEL
+ | GFC_OMP_MASK_DO | GFC_OMP_MASK_SIMD;
+ innermost = GFC_OMP_SPLIT_SIMD;
+ break;
+ case EXEC_OMP_DISTRIBUTE_SIMD:
+ mask = GFC_OMP_MASK_DISTRIBUTE | GFC_OMP_MASK_SIMD;
+ innermost = GFC_OMP_SPLIT_SIMD;
+ break;
+ case EXEC_OMP_DO:
+ innermost = GFC_OMP_SPLIT_DO;
+ break;
+ case EXEC_OMP_DO_SIMD:
+ mask = GFC_OMP_MASK_DO | GFC_OMP_MASK_SIMD;
+ innermost = GFC_OMP_SPLIT_SIMD;
+ break;
+ case EXEC_OMP_PARALLEL:
+ innermost = GFC_OMP_SPLIT_PARALLEL;
+ break;
+ case EXEC_OMP_PARALLEL_DO:
+ mask = GFC_OMP_MASK_PARALLEL | GFC_OMP_MASK_DO;
+ innermost = GFC_OMP_SPLIT_DO;
+ break;
+ case EXEC_OMP_PARALLEL_DO_SIMD:
+ mask = GFC_OMP_MASK_PARALLEL | GFC_OMP_MASK_DO | GFC_OMP_MASK_SIMD;
+ innermost = GFC_OMP_SPLIT_SIMD;
+ break;
+ case EXEC_OMP_SIMD:
+ innermost = GFC_OMP_SPLIT_SIMD;
+ break;
+ case EXEC_OMP_TARGET:
+ innermost = GFC_OMP_SPLIT_TARGET;
+ break;
+ case EXEC_OMP_TARGET_TEAMS:
+ mask = GFC_OMP_MASK_TARGET | GFC_OMP_MASK_TEAMS;
+ innermost = GFC_OMP_SPLIT_TEAMS;
+ break;
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE:
+ mask = GFC_OMP_MASK_TARGET | GFC_OMP_MASK_TEAMS
+ | GFC_OMP_MASK_DISTRIBUTE;
+ innermost = GFC_OMP_SPLIT_DISTRIBUTE;
+ break;
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO:
+ mask = GFC_OMP_MASK_TARGET | GFC_OMP_MASK_TEAMS | GFC_OMP_MASK_DISTRIBUTE
+ | GFC_OMP_MASK_PARALLEL | GFC_OMP_MASK_DO;
+ innermost = GFC_OMP_SPLIT_DO;
+ break;
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
+ mask = GFC_OMP_MASK_TARGET | GFC_OMP_MASK_TEAMS | GFC_OMP_MASK_DISTRIBUTE
+ | GFC_OMP_MASK_PARALLEL | GFC_OMP_MASK_DO | GFC_OMP_MASK_SIMD;
+ innermost = GFC_OMP_SPLIT_SIMD;
+ break;
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD:
+ mask = GFC_OMP_MASK_TARGET | GFC_OMP_MASK_TEAMS
+ | GFC_OMP_MASK_DISTRIBUTE | GFC_OMP_MASK_SIMD;
+ innermost = GFC_OMP_SPLIT_SIMD;
+ break;
+ case EXEC_OMP_TEAMS:
+ innermost = GFC_OMP_SPLIT_TEAMS;
+ break;
+ case EXEC_OMP_TEAMS_DISTRIBUTE:
+ mask = GFC_OMP_MASK_TEAMS | GFC_OMP_MASK_DISTRIBUTE;
+ innermost = GFC_OMP_SPLIT_DISTRIBUTE;
+ break;
+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO:
+ mask = GFC_OMP_MASK_TEAMS | GFC_OMP_MASK_DISTRIBUTE
+ | GFC_OMP_MASK_PARALLEL | GFC_OMP_MASK_DO;
+ innermost = GFC_OMP_SPLIT_DO;
+ break;
+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
+ mask = GFC_OMP_MASK_TEAMS | GFC_OMP_MASK_DISTRIBUTE
+ | GFC_OMP_MASK_PARALLEL | GFC_OMP_MASK_DO | GFC_OMP_MASK_SIMD;
+ innermost = GFC_OMP_SPLIT_SIMD;
+ break;
+ case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD:
+ mask = GFC_OMP_MASK_TEAMS | GFC_OMP_MASK_DISTRIBUTE | GFC_OMP_MASK_SIMD;
+ innermost = GFC_OMP_SPLIT_SIMD;
+ break;
+ default:
+ gcc_unreachable ();
+ }
+ if (mask == 0)
+ {
+ clausesa[innermost] = *code->ext.omp_clauses;
+ return;
+ }
+ if (code->ext.omp_clauses != NULL)
+ {
+ if (mask & GFC_OMP_MASK_TARGET)
+ {
+ /* First the clauses that are unique to some constructs. */
+ clausesa[GFC_OMP_SPLIT_TARGET].lists[OMP_LIST_MAP]
+ = code->ext.omp_clauses->lists[OMP_LIST_MAP];
+ clausesa[GFC_OMP_SPLIT_TARGET].device
+ = code->ext.omp_clauses->device;
+ }
+ if (mask & GFC_OMP_MASK_TEAMS)
+ {
+ /* First the clauses that are unique to some constructs. */
+ clausesa[GFC_OMP_SPLIT_TEAMS].num_teams
+ = code->ext.omp_clauses->num_teams;
+ clausesa[GFC_OMP_SPLIT_TEAMS].thread_limit
+ = code->ext.omp_clauses->thread_limit;
+ /* Shared and default clauses are allowed on parallel and teams. */
+ clausesa[GFC_OMP_SPLIT_TEAMS].lists[OMP_LIST_SHARED]
+ = code->ext.omp_clauses->lists[OMP_LIST_SHARED];
+ clausesa[GFC_OMP_SPLIT_TEAMS].default_sharing
+ = code->ext.omp_clauses->default_sharing;
+ }
+ if (mask & GFC_OMP_MASK_DISTRIBUTE)
+ {
+ /* First the clauses that are unique to some constructs. */
+ clausesa[GFC_OMP_SPLIT_DISTRIBUTE].dist_sched_kind
+ = code->ext.omp_clauses->dist_sched_kind;
+ clausesa[GFC_OMP_SPLIT_DISTRIBUTE].dist_chunk_size
+ = code->ext.omp_clauses->dist_chunk_size;
+ /* Duplicate collapse. */
+ clausesa[GFC_OMP_SPLIT_DISTRIBUTE].collapse
+ = code->ext.omp_clauses->collapse;
+ }
+ if (mask & GFC_OMP_MASK_PARALLEL)
+ {
+ /* First the clauses that are unique to some constructs. */
+ clausesa[GFC_OMP_SPLIT_PARALLEL].lists[OMP_LIST_COPYIN]
+ = code->ext.omp_clauses->lists[OMP_LIST_COPYIN];
+ clausesa[GFC_OMP_SPLIT_PARALLEL].num_threads
+ = code->ext.omp_clauses->num_threads;
+ clausesa[GFC_OMP_SPLIT_PARALLEL].proc_bind
+ = code->ext.omp_clauses->proc_bind;
+ /* Shared and default clauses are allowed on parallel and teams. */
+ clausesa[GFC_OMP_SPLIT_PARALLEL].lists[OMP_LIST_SHARED]
+ = code->ext.omp_clauses->lists[OMP_LIST_SHARED];
+ clausesa[GFC_OMP_SPLIT_PARALLEL].default_sharing
+ = code->ext.omp_clauses->default_sharing;
+ }
+ if (mask & GFC_OMP_MASK_DO)
+ {
+ /* First the clauses that are unique to some constructs. */
+ clausesa[GFC_OMP_SPLIT_DO].ordered
+ = code->ext.omp_clauses->ordered;
+ clausesa[GFC_OMP_SPLIT_DO].sched_kind
+ = code->ext.omp_clauses->sched_kind;
+ clausesa[GFC_OMP_SPLIT_DO].chunk_size
+ = code->ext.omp_clauses->chunk_size;
+ clausesa[GFC_OMP_SPLIT_DO].nowait
+ = code->ext.omp_clauses->nowait;
+ /* Duplicate collapse. */
+ clausesa[GFC_OMP_SPLIT_DO].collapse
+ = code->ext.omp_clauses->collapse;
+ }
+ if (mask & GFC_OMP_MASK_SIMD)
+ {
+ clausesa[GFC_OMP_SPLIT_SIMD].safelen_expr
+ = code->ext.omp_clauses->safelen_expr;
+ clausesa[GFC_OMP_SPLIT_SIMD].lists[OMP_LIST_LINEAR]
+ = code->ext.omp_clauses->lists[OMP_LIST_LINEAR];
+ clausesa[GFC_OMP_SPLIT_SIMD].lists[OMP_LIST_ALIGNED]
+ = code->ext.omp_clauses->lists[OMP_LIST_ALIGNED];
+ /* Duplicate collapse. */
+ clausesa[GFC_OMP_SPLIT_SIMD].collapse
+ = code->ext.omp_clauses->collapse;
+ }
+ /* Private clause is supported on all constructs but target,
+ it is enough to put it on the innermost one. For
+ !$ omp do put it on parallel though,
+ as that's what we did for OpenMP 3.1. */
+ clausesa[innermost == GFC_OMP_SPLIT_DO
+ ? (int) GFC_OMP_SPLIT_PARALLEL
+ : innermost].lists[OMP_LIST_PRIVATE]
+ = code->ext.omp_clauses->lists[OMP_LIST_PRIVATE];
+ /* Firstprivate clause is supported on all constructs but
+ target and simd. Put it on the outermost of those and
+ duplicate on parallel. */
+ if (mask & GFC_OMP_MASK_TEAMS)
+ clausesa[GFC_OMP_SPLIT_TEAMS].lists[OMP_LIST_FIRSTPRIVATE]
+ = code->ext.omp_clauses->lists[OMP_LIST_FIRSTPRIVATE];
+ else if (mask & GFC_OMP_MASK_DISTRIBUTE)
+ clausesa[GFC_OMP_SPLIT_DISTRIBUTE].lists[OMP_LIST_FIRSTPRIVATE]
+ = code->ext.omp_clauses->lists[OMP_LIST_FIRSTPRIVATE];
+ if (mask & GFC_OMP_MASK_PARALLEL)
+ clausesa[GFC_OMP_SPLIT_PARALLEL].lists[OMP_LIST_FIRSTPRIVATE]
+ = code->ext.omp_clauses->lists[OMP_LIST_FIRSTPRIVATE];
+ else if (mask & GFC_OMP_MASK_DO)
+ clausesa[GFC_OMP_SPLIT_DO].lists[OMP_LIST_FIRSTPRIVATE]
+ = code->ext.omp_clauses->lists[OMP_LIST_FIRSTPRIVATE];
+ /* Lastprivate is allowed on do and simd. In
+ parallel do{, simd} we actually want to put it on
+ parallel rather than do. */
+ if (mask & GFC_OMP_MASK_PARALLEL)
+ clausesa[GFC_OMP_SPLIT_PARALLEL].lists[OMP_LIST_LASTPRIVATE]
+ = code->ext.omp_clauses->lists[OMP_LIST_LASTPRIVATE];
+ else if (mask & GFC_OMP_MASK_DO)
+ clausesa[GFC_OMP_SPLIT_DO].lists[OMP_LIST_LASTPRIVATE]
+ = code->ext.omp_clauses->lists[OMP_LIST_LASTPRIVATE];
+ if (mask & GFC_OMP_MASK_SIMD)
+ clausesa[GFC_OMP_SPLIT_SIMD].lists[OMP_LIST_LASTPRIVATE]
+ = code->ext.omp_clauses->lists[OMP_LIST_LASTPRIVATE];
+ /* Reduction is allowed on simd, do, parallel and teams.
+ Duplicate it on all of them, but omit on do if
+ parallel is present. */
+ if (mask & GFC_OMP_MASK_TEAMS)
+ clausesa[GFC_OMP_SPLIT_TEAMS].lists[OMP_LIST_REDUCTION]
+ = code->ext.omp_clauses->lists[OMP_LIST_REDUCTION];
+ if (mask & GFC_OMP_MASK_PARALLEL)
+ clausesa[GFC_OMP_SPLIT_PARALLEL].lists[OMP_LIST_REDUCTION]
+ = code->ext.omp_clauses->lists[OMP_LIST_REDUCTION];
+ else if (mask & GFC_OMP_MASK_DO)
+ clausesa[GFC_OMP_SPLIT_DO].lists[OMP_LIST_REDUCTION]
+ = code->ext.omp_clauses->lists[OMP_LIST_REDUCTION];
+ if (mask & GFC_OMP_MASK_SIMD)
+ clausesa[GFC_OMP_SPLIT_SIMD].lists[OMP_LIST_REDUCTION]
+ = code->ext.omp_clauses->lists[OMP_LIST_REDUCTION];
+ /* FIXME: This is currently being discussed. */
+ if (mask & GFC_OMP_MASK_PARALLEL)
+ clausesa[GFC_OMP_SPLIT_PARALLEL].if_expr
+ = code->ext.omp_clauses->if_expr;
+ else
+ clausesa[GFC_OMP_SPLIT_TARGET].if_expr
+ = code->ext.omp_clauses->if_expr;
+ }
+ if ((mask & (GFC_OMP_MASK_PARALLEL | GFC_OMP_MASK_DO))
+ == (GFC_OMP_MASK_PARALLEL | GFC_OMP_MASK_DO))
+ clausesa[GFC_OMP_SPLIT_DO].nowait = true;
+}
+
static tree
-gfc_trans_omp_parallel_do (gfc_code *code)
+gfc_trans_omp_do_simd (gfc_code *code, stmtblock_t *pblock,
+ gfc_omp_clauses *clausesa, tree omp_clauses)
{
- stmtblock_t block, *pblock = NULL;
- gfc_omp_clauses parallel_clauses, do_clauses;
- tree stmt, omp_clauses = NULL_TREE;
+ stmtblock_t block;
+ gfc_omp_clauses clausesa_buf[GFC_OMP_SPLIT_NUM];
+ tree stmt, body, omp_do_clauses = NULL_TREE;
- gfc_start_block (&block);
+ if (pblock == NULL)
+ gfc_start_block (&block);
+ else
+ gfc_init_block (&block);
- memset (&do_clauses, 0, sizeof (do_clauses));
- if (code->ext.omp_clauses != NULL)
+ if (clausesa == NULL)
+ {
+ clausesa = clausesa_buf;
+ gfc_split_omp_clauses (code, clausesa);
+ }
+ if (gfc_option.gfc_flag_openmp)
+ omp_do_clauses
+ = gfc_trans_omp_clauses (&block, &clausesa[GFC_OMP_SPLIT_DO], code->loc);
+ body = gfc_trans_omp_do (code, EXEC_OMP_SIMD, pblock ? pblock : &block,
+ &clausesa[GFC_OMP_SPLIT_SIMD], omp_clauses);
+ if (pblock == NULL)
+ {
+ if (TREE_CODE (body) != BIND_EXPR)
+ body = build3_v (BIND_EXPR, NULL, body, poplevel (1, 0));
+ else
+ poplevel (0, 0);
+ }
+ else if (TREE_CODE (body) != BIND_EXPR)
+ body = build3_v (BIND_EXPR, NULL, body, NULL_TREE);
+ if (gfc_option.gfc_flag_openmp)
{
- memcpy (¶llel_clauses, code->ext.omp_clauses,
- sizeof (parallel_clauses));
- do_clauses.sched_kind = parallel_clauses.sched_kind;
- do_clauses.chunk_size = parallel_clauses.chunk_size;
- do_clauses.ordered = parallel_clauses.ordered;
- do_clauses.collapse = parallel_clauses.collapse;
- parallel_clauses.sched_kind = OMP_SCHED_NONE;
- parallel_clauses.chunk_size = NULL;
- parallel_clauses.ordered = false;
- parallel_clauses.collapse = 0;
- omp_clauses = gfc_trans_omp_clauses (&block, ¶llel_clauses,
- code->loc);
- }
- do_clauses.nowait = true;
- if (!do_clauses.ordered && do_clauses.sched_kind != OMP_SCHED_STATIC)
- pblock = █
+ stmt = make_node (OMP_FOR);
+ TREE_TYPE (stmt) = void_type_node;
+ OMP_FOR_BODY (stmt) = body;
+ OMP_FOR_CLAUSES (stmt) = omp_do_clauses;
+ }
else
- pushlevel ();
- stmt = gfc_trans_omp_do (code, pblock, &do_clauses, omp_clauses);
- if (TREE_CODE (stmt) != BIND_EXPR)
- stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0));
+ stmt = body;
+ gfc_add_expr_to_block (&block, stmt);
+ return gfc_finish_block (&block);
+}
+
+static tree
+gfc_trans_omp_parallel_do (gfc_code *code, stmtblock_t *pblock,
+ gfc_omp_clauses *clausesa)
+{
+ stmtblock_t block, *new_pblock = pblock;
+ gfc_omp_clauses clausesa_buf[GFC_OMP_SPLIT_NUM];
+ tree stmt, omp_clauses = NULL_TREE;
+
+ if (pblock == NULL)
+ gfc_start_block (&block);
else
- poplevel (0, 0);
+ gfc_init_block (&block);
+
+ if (clausesa == NULL)
+ {
+ clausesa = clausesa_buf;
+ gfc_split_omp_clauses (code, clausesa);
+ }
+ omp_clauses
+ = gfc_trans_omp_clauses (&block, &clausesa[GFC_OMP_SPLIT_PARALLEL],
+ code->loc);
+ if (pblock == NULL)
+ {
+ if (!clausesa[GFC_OMP_SPLIT_DO].ordered
+ && clausesa[GFC_OMP_SPLIT_DO].sched_kind != OMP_SCHED_STATIC)
+ new_pblock = █
+ else
+ pushlevel ();
+ }
+ stmt = gfc_trans_omp_do (code, EXEC_OMP_DO, new_pblock,
+ &clausesa[GFC_OMP_SPLIT_DO], omp_clauses);
+ if (pblock == NULL)
+ {
+ if (TREE_CODE (stmt) != BIND_EXPR)
+ stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0));
+ else
+ poplevel (0, 0);
+ }
+ else if (TREE_CODE (stmt) != BIND_EXPR)
+ stmt = build3_v (BIND_EXPR, NULL, stmt, NULL_TREE);
stmt = build2_loc (input_location, OMP_PARALLEL, void_type_node, stmt,
omp_clauses);
OMP_PARALLEL_COMBINED (stmt) = 1;
}
static tree
+gfc_trans_omp_parallel_do_simd (gfc_code *code, stmtblock_t *pblock,
+ gfc_omp_clauses *clausesa)
+{
+ stmtblock_t block;
+ gfc_omp_clauses clausesa_buf[GFC_OMP_SPLIT_NUM];
+ tree stmt, omp_clauses = NULL_TREE;
+
+ if (pblock == NULL)
+ gfc_start_block (&block);
+ else
+ gfc_init_block (&block);
+
+ if (clausesa == NULL)
+ {
+ clausesa = clausesa_buf;
+ gfc_split_omp_clauses (code, clausesa);
+ }
+ if (gfc_option.gfc_flag_openmp)
+ omp_clauses
+ = gfc_trans_omp_clauses (&block, &clausesa[GFC_OMP_SPLIT_PARALLEL],
+ code->loc);
+ if (pblock == NULL)
+ pushlevel ();
+ stmt = gfc_trans_omp_do_simd (code, pblock, clausesa, omp_clauses);
+ if (pblock == NULL)
+ {
+ if (TREE_CODE (stmt) != BIND_EXPR)
+ stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0));
+ else
+ poplevel (0, 0);
+ }
+ else if (TREE_CODE (stmt) != BIND_EXPR)
+ stmt = build3_v (BIND_EXPR, NULL, stmt, NULL_TREE);
+ if (gfc_option.gfc_flag_openmp)
+ {
+ stmt = build2_loc (input_location, OMP_PARALLEL, void_type_node, stmt,
+ omp_clauses);
+ OMP_PARALLEL_COMBINED (stmt) = 1;
+ }
+ gfc_add_expr_to_block (&block, stmt);
+ return gfc_finish_block (&block);
+}
+
+static tree
gfc_trans_omp_parallel_sections (gfc_code *code)
{
stmtblock_t block;
}
static tree
+gfc_trans_omp_taskgroup (gfc_code *code)
+{
+ tree stmt = gfc_trans_code (code->block->next);
+ return build1_loc (input_location, OMP_TASKGROUP, void_type_node, stmt);
+}
+
+static tree
gfc_trans_omp_taskwait (void)
{
tree decl = builtin_decl_explicit (BUILT_IN_GOMP_TASKWAIT);
}
static tree
+gfc_trans_omp_distribute (gfc_code *code, gfc_omp_clauses *clausesa)
+{
+ stmtblock_t block;
+ gfc_omp_clauses clausesa_buf[GFC_OMP_SPLIT_NUM];
+ tree stmt, omp_clauses = NULL_TREE;
+
+ gfc_start_block (&block);
+ if (clausesa == NULL)
+ {
+ clausesa = clausesa_buf;
+ gfc_split_omp_clauses (code, clausesa);
+ }
+ if (gfc_option.gfc_flag_openmp)
+ omp_clauses
+ = gfc_trans_omp_clauses (&block, &clausesa[GFC_OMP_SPLIT_DISTRIBUTE],
+ code->loc);
+ switch (code->op)
+ {
+ case EXEC_OMP_DISTRIBUTE:
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE:
+ case EXEC_OMP_TEAMS_DISTRIBUTE:
+ /* This is handled in gfc_trans_omp_do. */
+ gcc_unreachable ();
+ break;
+ case EXEC_OMP_DISTRIBUTE_PARALLEL_DO:
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO:
+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO:
+ stmt = gfc_trans_omp_parallel_do (code, &block, clausesa);
+ if (TREE_CODE (stmt) != BIND_EXPR)
+ stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0));
+ else
+ poplevel (0, 0);
+ break;
+ case EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD:
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
+ stmt = gfc_trans_omp_parallel_do_simd (code, &block, clausesa);
+ if (TREE_CODE (stmt) != BIND_EXPR)
+ stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0));
+ else
+ poplevel (0, 0);
+ break;
+ case EXEC_OMP_DISTRIBUTE_SIMD:
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD:
+ case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD:
+ stmt = gfc_trans_omp_do (code, EXEC_OMP_SIMD, &block,
+ &clausesa[GFC_OMP_SPLIT_SIMD], NULL_TREE);
+ if (TREE_CODE (stmt) != BIND_EXPR)
+ stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0));
+ else
+ poplevel (0, 0);
+ break;
+ default:
+ gcc_unreachable ();
+ }
+ if (gfc_option.gfc_flag_openmp)
+ {
+ tree distribute = make_node (OMP_DISTRIBUTE);
+ TREE_TYPE (distribute) = void_type_node;
+ OMP_FOR_BODY (distribute) = stmt;
+ OMP_FOR_CLAUSES (distribute) = omp_clauses;
+ stmt = distribute;
+ }
+ gfc_add_expr_to_block (&block, stmt);
+ return gfc_finish_block (&block);
+}
+
+static tree
+gfc_trans_omp_teams (gfc_code *code, gfc_omp_clauses *clausesa)
+{
+ stmtblock_t block;
+ gfc_omp_clauses clausesa_buf[GFC_OMP_SPLIT_NUM];
+ tree stmt, omp_clauses = NULL_TREE;
+
+ gfc_start_block (&block);
+ if (clausesa == NULL)
+ {
+ clausesa = clausesa_buf;
+ gfc_split_omp_clauses (code, clausesa);
+ }
+ if (gfc_option.gfc_flag_openmp)
+ omp_clauses
+ = gfc_trans_omp_clauses (&block, &clausesa[GFC_OMP_SPLIT_TEAMS],
+ code->loc);
+ switch (code->op)
+ {
+ case EXEC_OMP_TARGET_TEAMS:
+ case EXEC_OMP_TEAMS:
+ stmt = gfc_trans_omp_code (code->block->next, true);
+ break;
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE:
+ case EXEC_OMP_TEAMS_DISTRIBUTE:
+ stmt = gfc_trans_omp_do (code, EXEC_OMP_DISTRIBUTE, NULL,
+ &clausesa[GFC_OMP_SPLIT_DISTRIBUTE],
+ NULL);
+ break;
+ default:
+ stmt = gfc_trans_omp_distribute (code, clausesa);
+ break;
+ }
+ stmt = build2_loc (input_location, OMP_TEAMS, void_type_node, stmt,
+ omp_clauses);
+ gfc_add_expr_to_block (&block, stmt);
+ return gfc_finish_block (&block);
+}
+
+static tree
+gfc_trans_omp_target (gfc_code *code)
+{
+ stmtblock_t block;
+ gfc_omp_clauses clausesa[GFC_OMP_SPLIT_NUM];
+ tree stmt, omp_clauses = NULL_TREE;
+
+ gfc_start_block (&block);
+ gfc_split_omp_clauses (code, clausesa);
+ if (gfc_option.gfc_flag_openmp)
+ omp_clauses
+ = gfc_trans_omp_clauses (&block, &clausesa[GFC_OMP_SPLIT_TARGET],
+ code->loc);
+ if (code->op == EXEC_OMP_TARGET)
+ stmt = gfc_trans_omp_code (code->block->next, true);
+ else
+ stmt = gfc_trans_omp_teams (code, clausesa);
+ if (TREE_CODE (stmt) != BIND_EXPR)
+ stmt = build3_v (BIND_EXPR, NULL, stmt, NULL_TREE);
+ if (gfc_option.gfc_flag_openmp)
+ stmt = build2_loc (input_location, OMP_TARGET, void_type_node, stmt,
+ omp_clauses);
+ gfc_add_expr_to_block (&block, stmt);
+ return gfc_finish_block (&block);
+}
+
+static tree
+gfc_trans_omp_target_data (gfc_code *code)
+{
+ stmtblock_t block;
+ tree stmt, omp_clauses;
+
+ gfc_start_block (&block);
+ omp_clauses = gfc_trans_omp_clauses (&block, code->ext.omp_clauses,
+ code->loc);
+ stmt = gfc_trans_omp_code (code->block->next, true);
+ stmt = build2_loc (input_location, OMP_TARGET_DATA, void_type_node, stmt,
+ omp_clauses);
+ gfc_add_expr_to_block (&block, stmt);
+ return gfc_finish_block (&block);
+}
+
+static tree
+gfc_trans_omp_target_update (gfc_code *code)
+{
+ stmtblock_t block;
+ tree stmt, omp_clauses;
+
+ gfc_start_block (&block);
+ omp_clauses = gfc_trans_omp_clauses (&block, code->ext.omp_clauses,
+ code->loc);
+ stmt = build1_loc (input_location, OMP_TARGET_UPDATE, void_type_node,
+ omp_clauses);
+ gfc_add_expr_to_block (&block, stmt);
+ return gfc_finish_block (&block);
+}
+
+static tree
gfc_trans_omp_workshare (gfc_code *code, gfc_omp_clauses *clauses)
{
tree res, tmp, stmt;
return gfc_trans_omp_atomic (code);
case EXEC_OMP_BARRIER:
return gfc_trans_omp_barrier ();
+ case EXEC_OMP_CANCEL:
+ return gfc_trans_omp_cancel (code);
+ case EXEC_OMP_CANCELLATION_POINT:
+ return gfc_trans_omp_cancellation_point (code);
case EXEC_OMP_CRITICAL:
return gfc_trans_omp_critical (code);
+ case EXEC_OMP_DISTRIBUTE:
case EXEC_OMP_DO:
- return gfc_trans_omp_do (code, NULL, code->ext.omp_clauses, NULL);
+ case EXEC_OMP_SIMD:
+ return gfc_trans_omp_do (code, code->op, NULL, code->ext.omp_clauses,
+ NULL);
+ case EXEC_OMP_DISTRIBUTE_PARALLEL_DO:
+ case EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD:
+ case EXEC_OMP_DISTRIBUTE_SIMD:
+ return gfc_trans_omp_distribute (code, NULL);
+ case EXEC_OMP_DO_SIMD:
+ return gfc_trans_omp_do_simd (code, NULL, NULL, NULL_TREE);
case EXEC_OMP_FLUSH:
return gfc_trans_omp_flush ();
case EXEC_OMP_MASTER:
case EXEC_OMP_PARALLEL:
return gfc_trans_omp_parallel (code);
case EXEC_OMP_PARALLEL_DO:
- return gfc_trans_omp_parallel_do (code);
+ return gfc_trans_omp_parallel_do (code, NULL, NULL);
+ case EXEC_OMP_PARALLEL_DO_SIMD:
+ return gfc_trans_omp_parallel_do_simd (code, NULL, NULL);
case EXEC_OMP_PARALLEL_SECTIONS:
return gfc_trans_omp_parallel_sections (code);
case EXEC_OMP_PARALLEL_WORKSHARE:
return gfc_trans_omp_sections (code, code->ext.omp_clauses);
case EXEC_OMP_SINGLE:
return gfc_trans_omp_single (code, code->ext.omp_clauses);
+ case EXEC_OMP_TARGET:
+ case EXEC_OMP_TARGET_TEAMS:
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE:
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO:
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD:
+ return gfc_trans_omp_target (code);
+ case EXEC_OMP_TARGET_DATA:
+ return gfc_trans_omp_target_data (code);
+ case EXEC_OMP_TARGET_UPDATE:
+ return gfc_trans_omp_target_update (code);
case EXEC_OMP_TASK:
return gfc_trans_omp_task (code);
+ case EXEC_OMP_TASKGROUP:
+ return gfc_trans_omp_taskgroup (code);
case EXEC_OMP_TASKWAIT:
return gfc_trans_omp_taskwait ();
case EXEC_OMP_TASKYIELD:
return gfc_trans_omp_taskyield ();
+ case EXEC_OMP_TEAMS:
+ case EXEC_OMP_TEAMS_DISTRIBUTE:
+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO:
+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
+ case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD:
+ return gfc_trans_omp_teams (code, NULL);
case EXEC_OMP_WORKSHARE:
return gfc_trans_omp_workshare (code, code->ext.omp_clauses);
default:
gcc_unreachable ();
}
}
+
+void
+gfc_trans_omp_declare_simd (gfc_namespace *ns)
+{
+ if (ns->entries)
+ return;
+
+ gfc_omp_declare_simd *ods;
+ for (ods = ns->omp_declare_simd; ods; ods = ods->next)
+ {
+ tree c = gfc_trans_omp_clauses (NULL, ods->clauses, ods->where, true);
+ tree fndecl = ns->proc_name->backend_decl;
+ if (c != NULL_TREE)
+ c = tree_cons (NULL_TREE, c, NULL_TREE);
+ c = build_tree_list (get_identifier ("omp declare simd"), c);
+ TREE_CHAIN (c) = DECL_ATTRIBUTES (fndecl);
+ DECL_ATTRIBUTES (fndecl) = c;
+ }
+}
{
gfc_se se;
tree desc;
+ bool cst_array_ctor;
desc = sym->backend_decl;
+ cst_array_ctor = e->expr_type == EXPR_ARRAY
+ && gfc_constant_array_constructor_p (e->value.constructor);
/* If association is to an expression, evaluate it and create temporary.
Otherwise, get descriptor of target for pointer assignment. */
gfc_init_se (&se, NULL);
- if (sym->assoc->variable || e->expr_type == EXPR_ARRAY)
+ if (sym->assoc->variable || cst_array_ctor)
{
se.direct_byref = 1;
se.use_offset = 1;
/* If we didn't already do the pointer assignment, set associate-name
descriptor to the one generated for the temporary. */
- if (!sym->assoc->variable && e->expr_type != EXPR_ARRAY)
+ if (!sym->assoc->variable && !cst_array_ctor)
{
int dim;
/* trans-openmp.c */
tree gfc_trans_omp_directive (gfc_code *);
+void gfc_trans_omp_declare_simd (gfc_namespace *);
/* trans-io.c */
tree gfc_trans_open (gfc_code *);
restricted);
byref = 0;
}
-
- if (sym->attr.cray_pointee)
- GFC_POINTER_TYPE_P (type) = 1;
}
else
{
if (sym->attr.allocatable || sym->attr.pointer
|| gfc_is_associate_pointer (sym))
type = gfc_build_pointer_type (sym, type);
- if (sym->attr.pointer || sym->attr.cray_pointee)
- GFC_POINTER_TYPE_P (type) = 1;
}
/* We currently pass all parameters by reference.
else if (derived->declared_at.lb)
gfc_set_decl_location (field, &derived->declared_at);
+ gfc_finish_decl_attrs (field, &c->attr);
+
DECL_PACKED (field) |= TYPE_PACKED (typenode);
gcc_assert (field);
case EXEC_OMP_ATOMIC:
case EXEC_OMP_BARRIER:
+ case EXEC_OMP_CANCEL:
+ case EXEC_OMP_CANCELLATION_POINT:
case EXEC_OMP_CRITICAL:
+ case EXEC_OMP_DISTRIBUTE:
+ case EXEC_OMP_DISTRIBUTE_PARALLEL_DO:
+ case EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD:
+ case EXEC_OMP_DISTRIBUTE_SIMD:
case EXEC_OMP_DO:
+ case EXEC_OMP_DO_SIMD:
case EXEC_OMP_FLUSH:
case EXEC_OMP_MASTER:
case EXEC_OMP_ORDERED:
case EXEC_OMP_PARALLEL:
case EXEC_OMP_PARALLEL_DO:
+ case EXEC_OMP_PARALLEL_DO_SIMD:
case EXEC_OMP_PARALLEL_SECTIONS:
case EXEC_OMP_PARALLEL_WORKSHARE:
case EXEC_OMP_SECTIONS:
+ case EXEC_OMP_SIMD:
case EXEC_OMP_SINGLE:
+ case EXEC_OMP_TARGET:
+ case EXEC_OMP_TARGET_DATA:
+ case EXEC_OMP_TARGET_TEAMS:
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE:
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO:
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
+ case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD:
+ case EXEC_OMP_TARGET_UPDATE:
case EXEC_OMP_TASK:
+ case EXEC_OMP_TASKGROUP:
case EXEC_OMP_TASKWAIT:
case EXEC_OMP_TASKYIELD:
+ case EXEC_OMP_TEAMS:
+ case EXEC_OMP_TEAMS_DISTRIBUTE:
+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO:
+ case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
+ case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD:
case EXEC_OMP_WORKSHARE:
res = gfc_trans_omp_directive (code);
break;
/* Returns true if a variable of specified size should go on the stack. */
int gfc_can_put_var_on_stack (tree);
+/* Set GFC_DECL_SCALAR_* on decl from sym if needed. */
+void gfc_finish_decl_attrs (tree, symbol_attribute *);
+
/* Allocate the lang-specific part of a decl node. */
void gfc_allocate_lang_decl (tree);
tree gfc_omp_clause_default_ctor (tree, tree, tree);
tree gfc_omp_clause_copy_ctor (tree, tree, tree);
tree gfc_omp_clause_assign_op (tree, tree, tree);
+tree gfc_omp_clause_linear_ctor (tree, tree, tree, tree);
tree gfc_omp_clause_dtor (tree, tree);
+void gfc_omp_finish_clause (tree, gimple_seq *);
bool gfc_omp_disregard_value_expr (tree, bool);
bool gfc_omp_private_debug_clause (tree, bool);
bool gfc_omp_private_outer_ref (tree);
tree span;
/* For assumed-shape coarrays. */
tree token, caf_offset;
+ unsigned int scalar_allocatable : 1;
+ unsigned int scalar_pointer : 1;
};
#define GFC_DECL_CAF_OFFSET(node) DECL_LANG_SPECIFIC(node)->caf_offset
#define GFC_DECL_SAVED_DESCRIPTOR(node) \
(DECL_LANG_SPECIFIC(node)->saved_descriptor)
+#define GFC_DECL_SCALAR_ALLOCATABLE(node) \
+ (DECL_LANG_SPECIFIC (node)->scalar_allocatable)
+#define GFC_DECL_SCALAR_POINTER(node) \
+ (DECL_LANG_SPECIFIC (node)->scalar_pointer)
+#define GFC_DECL_GET_SCALAR_ALLOCATABLE(node) \
+ (DECL_LANG_SPECIFIC (node) ? GFC_DECL_SCALAR_ALLOCATABLE (node) : 0)
+#define GFC_DECL_GET_SCALAR_POINTER(node) \
+ (DECL_LANG_SPECIFIC (node) ? GFC_DECL_SCALAR_POINTER (node) : 0)
#define GFC_DECL_PACKED_ARRAY(node) DECL_LANG_FLAG_0(node)
#define GFC_DECL_PARTIAL_PACKED_ARRAY(node) DECL_LANG_FLAG_1(node)
#define GFC_DECL_ASSIGN(node) DECL_LANG_FLAG_2(node)
#define GFC_DECL_CRAY_POINTEE(node) DECL_LANG_FLAG_4(node)
#define GFC_DECL_RESULT(node) DECL_LANG_FLAG_5(node)
#define GFC_DECL_SUBREF_ARRAY_P(node) DECL_LANG_FLAG_6(node)
+#define GFC_DECL_ASSOCIATE_VAR_P(node) DECL_LANG_FLAG_7(node)
#define GFC_DECL_CLASS(node) DECL_LANG_FLAG_8(node)
/* An array descriptor. */
#define GFC_DESCRIPTOR_TYPE_P(node) TYPE_LANG_FLAG_1(node)
/* An array without a descriptor. */
#define GFC_ARRAY_TYPE_P(node) TYPE_LANG_FLAG_2(node)
-/* Fortran POINTER type. */
-#define GFC_POINTER_TYPE_P(node) TYPE_LANG_FLAG_3(node)
/* Fortran CLASS type. */
#define GFC_CLASS_TYPE_P(node) TYPE_LANG_FLAG_4(node)
/* The GFC_TYPE_ARRAY_* members are present in both descriptor and
#define STACK_POINTER_OFFSET 0
#endif
+#if defined (REG_PARM_STACK_SPACE) && !defined (INCOMING_REG_PARM_STACK_SPACE)
+#define INCOMING_REG_PARM_STACK_SPACE REG_PARM_STACK_SPACE
+#endif
+
/* If not defined, pick an appropriate default for the offset of dynamically
allocated memory depending on the value of ACCUMULATE_OUTGOING_ARGS,
- REG_PARM_STACK_SPACE, and OUTGOING_REG_PARM_STACK_SPACE. */
+ INCOMING_REG_PARM_STACK_SPACE, and OUTGOING_REG_PARM_STACK_SPACE. */
#ifndef STACK_DYNAMIC_OFFSET
`crtl->outgoing_args_size'. Nevertheless, we must allow
for it when allocating stack dynamic objects. */
-#if defined(REG_PARM_STACK_SPACE)
+#ifdef INCOMING_REG_PARM_STACK_SPACE
#define STACK_DYNAMIC_OFFSET(FNDECL) \
((ACCUMULATE_OUTGOING_ARGS \
? (crtl->outgoing_args_size \
+ (OUTGOING_REG_PARM_STACK_SPACE ((!(FNDECL) ? NULL_TREE : TREE_TYPE (FNDECL))) ? 0 \
- : REG_PARM_STACK_SPACE (FNDECL))) \
+ : INCOMING_REG_PARM_STACK_SPACE (FNDECL))) \
: 0) + (STACK_POINTER_OFFSET))
#else
#define STACK_DYNAMIC_OFFSET(FNDECL) \
#endif
all->args_so_far = pack_cumulative_args (&all->args_so_far_v);
-#ifdef REG_PARM_STACK_SPACE
- all->reg_parm_stack_space = REG_PARM_STACK_SPACE (current_function_decl);
+#ifdef INCOMING_REG_PARM_STACK_SPACE
+ all->reg_parm_stack_space
+ = INCOMING_REG_PARM_STACK_SPACE (current_function_decl);
#endif
}
/* ??? This could be set on a per-function basis by the front-end
but is this worth the hassle? */
cfun->can_throw_non_call_exceptions = flag_non_call_exceptions;
+ cfun->can_delete_dead_exceptions = flag_delete_dead_exceptions;
}
}
#define YY_MORE_ADJ 0
#define YY_RESTORE_YY_MORE_OFFSET
char *yytext;
-#line 1 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 1 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
/* -*- indented-text -*- */
/* Process source files and output type information.
Copyright (C) 2002-2014 Free Software Foundation, Inc.
along with GCC; see the file COPYING3. If not see
<http://www.gnu.org/licenses/>. */
#define YY_NO_INPUT 1
-#line 24 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 24 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
#ifdef GENERATOR_FILE
#include "bconfig.h"
#else
register char *yy_cp, *yy_bp;
register int yy_act;
-#line 65 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 65 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
/* Do this on entry to yylex(): */
*yylval = 0;
(yy_c_buf_p) = yy_cp -= 1;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
-#line 76 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 76 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
{
BEGIN(in_struct);
return TYPEDEF;
(yy_c_buf_p) = yy_cp -= 1;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
-#line 80 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 80 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
{
BEGIN(in_struct);
return STRUCT;
(yy_c_buf_p) = yy_cp -= 1;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
-#line 84 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 84 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
{
BEGIN(in_struct);
return UNION;
(yy_c_buf_p) = yy_cp -= 1;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
-#line 88 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 88 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
{
BEGIN(in_struct);
return STRUCT;
(yy_c_buf_p) = yy_cp -= 1;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
-#line 92 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 92 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
{
BEGIN(in_struct);
return EXTERN;
(yy_c_buf_p) = yy_cp -= 1;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
-#line 96 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 96 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
{
BEGIN(in_struct);
return STATIC;
case 7:
YY_RULE_SETUP
-#line 104 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 104 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
{ BEGIN(in_struct_comment); }
YY_BREAK
case 8:
/* rule 8 can match eol */
YY_RULE_SETUP
-#line 105 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 105 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
{ lexer_line.line++; }
YY_BREAK
case 9:
/* rule 9 can match eol */
YY_RULE_SETUP
-#line 107 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 107 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
{ update_lineno (yytext, yyleng); }
YY_BREAK
case 10:
/* rule 10 can match eol */
YY_RULE_SETUP
-#line 108 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 108 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
{ lexer_line.line++; }
YY_BREAK
case 11:
(yy_c_buf_p) = yy_cp = yy_bp + 5;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
-#line 110 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 110 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
/* don't care */
YY_BREAK
case 12:
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
(yy_c_buf_p) = yy_cp -= 1;
YY_DO_BEFORE_ACTION; /* set up yytext again */
-#line 112 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 112 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
case 13:
/* rule 13 can match eol */
-#line 113 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 113 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
case 14:
/* rule 14 can match eol */
YY_RULE_SETUP
-#line 113 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 113 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
{
*yylval = XDUPVAR (const char, yytext, yyleng, yyleng + 1);
return IGNORABLE_CXX_KEYWORD;
(yy_c_buf_p) = yy_cp = yy_bp + 3;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
-#line 117 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 117 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
{ return GTY_TOKEN; }
YY_BREAK
case 16:
(yy_c_buf_p) = yy_cp = yy_bp + 5;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
-#line 118 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 118 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
{ return UNION; }
YY_BREAK
case 17:
(yy_c_buf_p) = yy_cp = yy_bp + 6;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
-#line 119 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 119 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
{ return STRUCT; }
YY_BREAK
case 18:
(yy_c_buf_p) = yy_cp = yy_bp + 5;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
-#line 120 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 120 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
{ return STRUCT; }
YY_BREAK
case 19:
(yy_c_buf_p) = yy_cp = yy_bp + 7;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
-#line 121 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 121 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
{ return TYPEDEF; }
YY_BREAK
case 20:
(yy_c_buf_p) = yy_cp = yy_bp + 4;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
-#line 122 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 122 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
{ return ENUM; }
YY_BREAK
case 21:
(yy_c_buf_p) = yy_cp = yy_bp + 9;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
-#line 123 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 123 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
{ return PTR_ALIAS; }
YY_BREAK
case 22:
(yy_c_buf_p) = yy_cp = yy_bp + 10;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
-#line 124 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 124 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
{ return NESTED_PTR; }
YY_BREAK
case 23:
(yy_c_buf_p) = yy_cp = yy_bp + 4;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
-#line 125 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 125 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
{ return USER_GTY; }
YY_BREAK
case 24:
YY_RULE_SETUP
-#line 126 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 126 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
{ return NUM; }
YY_BREAK
case 25:
(yy_c_buf_p) = yy_cp -= 1;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
-#line 127 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 127 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
{
*yylval = XDUPVAR (const char, yytext, yyleng, yyleng+1);
return PARAM_IS;
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
(yy_c_buf_p) = yy_cp -= 1;
YY_DO_BEFORE_ACTION; /* set up yytext again */
-#line 133 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 133 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
case 27:
/* rule 27 can match eol */
YY_RULE_SETUP
-#line 133 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 133 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
{
size_t len;
(yy_c_buf_p) = yy_cp -= 1;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
-#line 144 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 144 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
{
*yylval = XDUPVAR (const char, yytext, yyleng, yyleng+1);
return ID;
case 29:
/* rule 29 can match eol */
YY_RULE_SETUP
-#line 149 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 149 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
{
*yylval = XDUPVAR (const char, yytext+1, yyleng-2, yyleng-1);
return STRING;
case 30:
/* rule 30 can match eol */
YY_RULE_SETUP
-#line 154 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 154 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
{
*yylval = XDUPVAR (const char, yytext+1, yyleng-2, yyleng-1);
return ARRAY;
case 31:
/* rule 31 can match eol */
YY_RULE_SETUP
-#line 158 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 158 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
{
*yylval = XDUPVAR (const char, yytext+1, yyleng-2, yyleng);
return CHAR;
YY_BREAK
case 32:
YY_RULE_SETUP
-#line 163 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 163 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
{ return ELLIPSIS; }
YY_BREAK
case 33:
YY_RULE_SETUP
-#line 164 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 164 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
{ return yytext[0]; }
YY_BREAK
/* ignore pp-directives */
case 34:
/* rule 34 can match eol */
YY_RULE_SETUP
-#line 167 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 167 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
{lexer_line.line++;}
YY_BREAK
case 35:
YY_RULE_SETUP
-#line 169 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 169 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
{
error_at_line (&lexer_line, "unexpected character `%s'", yytext);
}
case 36:
YY_RULE_SETUP
-#line 174 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 174 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
{ BEGIN(in_comment); }
YY_BREAK
case 37:
/* rule 37 can match eol */
YY_RULE_SETUP
-#line 175 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 175 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
{ lexer_line.line++; }
YY_BREAK
case 38:
/* rule 38 can match eol */
YY_RULE_SETUP
-#line 176 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 176 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
{ lexer_line.line++; }
YY_BREAK
case 39:
-#line 178 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 178 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
case 40:
/* rule 40 can match eol */
-#line 179 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 179 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
case 41:
/* rule 41 can match eol */
YY_RULE_SETUP
-#line 179 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 179 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
/* do nothing */
YY_BREAK
case 42:
/* rule 42 can match eol */
YY_RULE_SETUP
-#line 180 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 180 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
{ update_lineno (yytext, yyleng); }
YY_BREAK
case 43:
(yy_c_buf_p) = yy_cp = yy_bp + 1;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
-#line 181 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 181 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
/* do nothing */
YY_BREAK
case 44:
/* rule 44 can match eol */
YY_RULE_SETUP
-#line 184 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 184 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
{ lexer_line.line++; }
YY_BREAK
case 45:
-#line 186 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 186 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
case 46:
YY_RULE_SETUP
-#line 186 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 186 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
/* do nothing */
YY_BREAK
case 47:
(yy_c_buf_p) = yy_cp = yy_bp + 1;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
-#line 187 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 187 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
/* do nothing */
YY_BREAK
case 48:
YY_RULE_SETUP
-#line 190 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 190 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
{ BEGIN(INITIAL); }
YY_BREAK
case 49:
YY_RULE_SETUP
-#line 191 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 191 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
{ BEGIN(in_struct); }
YY_BREAK
case 50:
-#line 194 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 194 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
case 51:
YY_RULE_SETUP
-#line 194 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 194 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
{
error_at_line (&lexer_line,
"unterminated comment or string; unexpected EOF");
case 52:
/* rule 52 can match eol */
YY_RULE_SETUP
-#line 199 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 199 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
/* do nothing */
YY_BREAK
case 53:
YY_RULE_SETUP
-#line 201 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 201 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
YY_FATAL_ERROR( "flex scanner jammed" );
YY_BREAK
#line 1911 "gengtype-lex.c"
#define YYTABLES_NAME "yytables"
-#line 201 "/d/gcc-4.9.0/gcc-4.9.0/gcc/gengtype-lex.l"
+#line 201 "/d/gcc-4.9.1/gcc-4.9.1/gcc/gengtype-lex.l"
these builtins are modelled as non-local label jumps to the label
that is passed to these two builtins, so pretend we have a non-local
label during GIMPLE passes too. See PR60003. */
- cfun->has_nonlocal_label = true;
+ cfun->has_nonlocal_label = 1;
/* NEXT_LABEL is the label __builtin_longjmp will jump to. Its address is
passed to both __builtin_setjmp_setup and __builtin_setjmp_receiver. */
X = Y * c
============================
X = (B + i') * (S * c) */
- base = base_cand->base_expr;
- index = base_cand->index;
temp = tree_to_double_int (base_cand->stride)
* tree_to_double_int (stride_in);
- stride = double_int_to_tree (TREE_TYPE (stride_in), temp);
- ctype = base_cand->cand_type;
- if (has_single_use (base_in))
- savings = (base_cand->dead_savings
- + stmt_cost (base_cand->cand_stmt, speed));
+ if (double_int_fits_to_tree_p (TREE_TYPE (stride_in), temp))
+ {
+ base = base_cand->base_expr;
+ index = base_cand->index;
+ stride = double_int_to_tree (TREE_TYPE (stride_in), temp);
+ ctype = base_cand->cand_type;
+ if (has_single_use (base_in))
+ savings = (base_cand->dead_savings
+ + stmt_cost (base_cand->cand_stmt, speed));
+ }
}
else if (base_cand->kind == CAND_ADD && integer_onep (base_cand->stride))
{
enum omp_clause_default_kind default_kind;
enum omp_region_type region_type;
bool combined_loop;
+ bool distribute;
};
static struct gimplify_ctx *gimplify_ctxp;
Store any side-effects in PRE_P. CALL_LOCATION is the location of
the CALL_EXPR. */
-static enum gimplify_status
+enum gimplify_status
gimplify_arg (tree *arg_p, gimple_seq *pre_p, location_t call_location)
{
bool (*test) (tree);
n = splay_tree_lookup (ctx->variables, (splay_tree_key)decl);
if (ctx->region_type == ORT_TARGET)
{
+ ret = lang_hooks.decls.omp_disregard_value_expr (decl, true);
if (n == NULL)
{
if (!lang_hooks.types.omp_mappable_type (TREE_TYPE (decl)))
omp_add_variable (ctx, decl, GOVD_MAP | flags);
}
else
- n->value |= flags;
- ret = lang_hooks.decls.omp_disregard_value_expr (decl, true);
+ {
+ /* If nothing changed, there's nothing left to do. */
+ if ((n->value & flags) == flags)
+ return ret;
+ n->value |= flags;
+ }
goto do_outer;
}
to the contrary in the innermost scope, generate an error. */
static bool
-omp_is_private (struct gimplify_omp_ctx *ctx, tree decl, bool simd)
+omp_is_private (struct gimplify_omp_ctx *ctx, tree decl, int simd)
{
splay_tree_node n;
else if ((n->value & GOVD_REDUCTION) != 0)
error ("iteration variable %qE should not be reduction",
DECL_NAME (decl));
- else if (simd && (n->value & GOVD_LASTPRIVATE) != 0)
+ else if (simd == 1 && (n->value & GOVD_LASTPRIVATE) != 0)
error ("iteration variable %qE should not be lastprivate",
DECL_NAME (decl));
else if (simd && (n->value & GOVD_PRIVATE) != 0)
error ("iteration variable %qE should not be private",
DECL_NAME (decl));
- else if (simd && (n->value & GOVD_LINEAR) != 0)
+ else if (simd == 2 && (n->value & GOVD_LINEAR) != 0)
error ("iteration variable %qE is predetermined linear",
DECL_NAME (decl));
}
goto do_add;
case OMP_CLAUSE_MAP:
- if (OMP_CLAUSE_SIZE (c)
- && gimplify_expr (&OMP_CLAUSE_SIZE (c), pre_p,
- NULL, is_gimple_val, fb_rvalue) == GS_ERROR)
+ decl = OMP_CLAUSE_DECL (c);
+ if (error_operand_p (decl))
+ {
+ remove = true;
+ break;
+ }
+ if (OMP_CLAUSE_SIZE (c) == NULL_TREE)
+ OMP_CLAUSE_SIZE (c) = DECL_P (decl) ? DECL_SIZE_UNIT (decl)
+ : TYPE_SIZE_UNIT (TREE_TYPE (decl));
+ if (gimplify_expr (&OMP_CLAUSE_SIZE (c), pre_p,
+ NULL, is_gimple_val, fb_rvalue) == GS_ERROR)
{
remove = true;
break;
}
- decl = OMP_CLAUSE_DECL (c);
if (!DECL_P (decl))
{
if (gimplify_expr (&OMP_CLAUSE_DECL (c), pre_p,
case OMP_CLAUSE_TO:
case OMP_CLAUSE_FROM:
- if (OMP_CLAUSE_SIZE (c)
- && gimplify_expr (&OMP_CLAUSE_SIZE (c), pre_p,
- NULL, is_gimple_val, fb_rvalue) == GS_ERROR)
+ decl = OMP_CLAUSE_DECL (c);
+ if (error_operand_p (decl))
{
remove = true;
break;
}
- decl = OMP_CLAUSE_DECL (c);
- if (error_operand_p (decl))
+ if (OMP_CLAUSE_SIZE (c) == NULL_TREE)
+ OMP_CLAUSE_SIZE (c) = DECL_P (decl) ? DECL_SIZE_UNIT (decl)
+ : TYPE_SIZE_UNIT (TREE_TYPE (decl));
+ if (gimplify_expr (&OMP_CLAUSE_SIZE (c), pre_p,
+ NULL, is_gimple_val, fb_rvalue) == GS_ERROR)
{
remove = true;
break;
gimplify_omp_ctxp = outer_ctx;
}
+ else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LINEAR
+ && OMP_CLAUSE_LINEAR_STMT (c))
+ {
+ gimplify_omp_ctxp = ctx;
+ push_gimplify_context ();
+ if (TREE_CODE (OMP_CLAUSE_LINEAR_STMT (c)) != BIND_EXPR)
+ {
+ tree bind = build3 (BIND_EXPR, void_type_node, NULL,
+ NULL, NULL);
+ TREE_SIDE_EFFECTS (bind) = 1;
+ BIND_EXPR_BODY (bind) = OMP_CLAUSE_LINEAR_STMT (c);
+ OMP_CLAUSE_LINEAR_STMT (c) = bind;
+ }
+ gimplify_and_add (OMP_CLAUSE_LINEAR_STMT (c),
+ &OMP_CLAUSE_LINEAR_GIMPLE_SEQ (c));
+ pop_gimplify_context
+ (gimple_seq_first_stmt (OMP_CLAUSE_LINEAR_GIMPLE_SEQ (c)));
+ OMP_CLAUSE_LINEAR_STMT (c) = NULL_TREE;
+
+ gimplify_omp_ctxp = outer_ctx;
+ }
if (notice_outer)
goto do_notice;
break;
remove = true;
break;
}
+ if (gimplify_expr (&OMP_CLAUSE_ALIGNED_ALIGNMENT (c), pre_p, NULL,
+ is_gimple_val, fb_rvalue) == GS_ERROR)
+ {
+ remove = true;
+ break;
+ }
if (!is_global_var (decl)
&& TREE_CODE (TREE_TYPE (decl)) == POINTER_TYPE)
omp_add_variable (ctx, decl, GOVD_ALIGNED);
gimplify_omp_ctxp = ctx;
}
+struct gimplify_adjust_omp_clauses_data
+{
+ tree *list_p;
+ gimple_seq *pre_p;
+};
+
/* For all variables that were not actually used within the context,
remove PRIVATE, SHARED, and FIRSTPRIVATE clauses. */
static int
gimplify_adjust_omp_clauses_1 (splay_tree_node n, void *data)
{
- tree *list_p = (tree *) data;
+ tree *list_p = ((struct gimplify_adjust_omp_clauses_data *) data)->list_p;
+ gimple_seq *pre_p
+ = ((struct gimplify_adjust_omp_clauses_data *) data)->pre_p;
tree decl = (tree) n->key;
unsigned flags = n->value;
enum omp_clause_code code;
OMP_CLAUSE_CHAIN (nc) = OMP_CLAUSE_CHAIN (clause);
OMP_CLAUSE_CHAIN (clause) = nc;
}
+ else
+ OMP_CLAUSE_SIZE (clause) = DECL_SIZE_UNIT (decl);
+ }
+ if (code == OMP_CLAUSE_FIRSTPRIVATE && (flags & GOVD_LASTPRIVATE) != 0)
+ {
+ tree nc = build_omp_clause (input_location, OMP_CLAUSE_LASTPRIVATE);
+ OMP_CLAUSE_DECL (nc) = decl;
+ OMP_CLAUSE_LASTPRIVATE_FIRSTPRIVATE (nc) = 1;
+ OMP_CLAUSE_CHAIN (nc) = *list_p;
+ OMP_CLAUSE_CHAIN (clause) = nc;
+ struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp;
+ gimplify_omp_ctxp = ctx->outer_context;
+ lang_hooks.decls.omp_finish_clause (nc, pre_p);
+ gimplify_omp_ctxp = ctx;
}
*list_p = clause;
- lang_hooks.decls.omp_finish_clause (clause);
-
+ struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp;
+ gimplify_omp_ctxp = ctx->outer_context;
+ lang_hooks.decls.omp_finish_clause (clause, pre_p);
+ gimplify_omp_ctxp = ctx;
return 0;
}
static void
-gimplify_adjust_omp_clauses (tree *list_p)
+gimplify_adjust_omp_clauses (gimple_seq *pre_p, tree *list_p)
{
struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp;
tree c, decl;
if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LINEAR
&& ctx->outer_context
&& !(OMP_CLAUSE_LINEAR_NO_COPYIN (c)
- && OMP_CLAUSE_LINEAR_NO_COPYOUT (c))
- && !is_global_var (decl))
+ && OMP_CLAUSE_LINEAR_NO_COPYOUT (c)))
{
- if (ctx->outer_context->region_type == ORT_COMBINED_PARALLEL)
+ if (ctx->outer_context->combined_loop
+ && !OMP_CLAUSE_LINEAR_NO_COPYIN (c))
{
n = splay_tree_lookup (ctx->outer_context->variables,
(splay_tree_key) decl);
if (n == NULL
|| (n->value & GOVD_DATA_SHARE_CLASS) == 0)
{
- int flags = OMP_CLAUSE_LINEAR_NO_COPYIN (c)
- ? GOVD_LASTPRIVATE : GOVD_SHARED;
+ int flags = GOVD_FIRSTPRIVATE;
+ /* #pragma omp distribute does not allow
+ lastprivate clause. */
+ if (!ctx->outer_context->distribute)
+ flags |= GOVD_LASTPRIVATE;
if (n == NULL)
omp_add_variable (ctx->outer_context, decl,
flags | GOVD_SEEN);
n->value |= flags | GOVD_SEEN;
}
}
- else
+ else if (!is_global_var (decl))
omp_notice_variable (ctx->outer_context, decl, true);
}
}
OMP_CLAUSE_CHAIN (c) = nc;
c = nc;
}
+ else if (OMP_CLAUSE_SIZE (c) == NULL_TREE)
+ OMP_CLAUSE_SIZE (c) = DECL_SIZE_UNIT (decl);
break;
case OMP_CLAUSE_TO:
OMP_CLAUSE_SIZE (c), true);
}
}
+ else if (OMP_CLAUSE_SIZE (c) == NULL_TREE)
+ OMP_CLAUSE_SIZE (c) = DECL_SIZE_UNIT (decl);
break;
case OMP_CLAUSE_REDUCTION:
}
/* Add in any implicit data sharing. */
- splay_tree_foreach (ctx->variables, gimplify_adjust_omp_clauses_1, list_p);
+ struct gimplify_adjust_omp_clauses_data data;
+ data.list_p = list_p;
+ data.pre_p = pre_p;
+ splay_tree_foreach (ctx->variables, gimplify_adjust_omp_clauses_1, &data);
gimplify_omp_ctxp = ctx->outer_context;
delete_omp_context (ctx);
else
pop_gimplify_context (NULL);
- gimplify_adjust_omp_clauses (&OMP_PARALLEL_CLAUSES (expr));
+ gimplify_adjust_omp_clauses (pre_p, &OMP_PARALLEL_CLAUSES (expr));
g = gimple_build_omp_parallel (body,
OMP_PARALLEL_CLAUSES (expr),
else
pop_gimplify_context (NULL);
- gimplify_adjust_omp_clauses (&OMP_TASK_CLAUSES (expr));
+ gimplify_adjust_omp_clauses (pre_p, &OMP_TASK_CLAUSES (expr));
g = gimple_build_omp_task (body,
OMP_TASK_CLAUSES (expr),
orig_for_stmt = for_stmt = *expr_p;
- simd = TREE_CODE (for_stmt) == OMP_SIMD
- || TREE_CODE (for_stmt) == CILK_SIMD;
+ simd = (TREE_CODE (for_stmt) == OMP_SIMD
+ || TREE_CODE (for_stmt) == CILK_SIMD);
gimplify_scan_omp_clauses (&OMP_FOR_CLAUSES (for_stmt), pre_p,
simd ? ORT_SIMD : ORT_WORKSHARE);
+ if (TREE_CODE (for_stmt) == OMP_DISTRIBUTE)
+ gimplify_omp_ctxp->distribute = true;
/* Handle OMP_FOR_INIT. */
for_pre_body = NULL;
/* Make sure the iteration variable is private. */
tree c = NULL_TREE;
+ tree c2 = NULL_TREE;
if (orig_for_stmt != for_stmt)
/* Do this only on innermost construct for combined ones. */;
else if (simd)
{
splay_tree_node n = splay_tree_lookup (gimplify_omp_ctxp->variables,
(splay_tree_key)decl);
- omp_is_private (gimplify_omp_ctxp, decl, simd);
+ omp_is_private (gimplify_omp_ctxp, decl,
+ 1 + (TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt))
+ != 1));
if (n != NULL && (n->value & GOVD_DATA_SHARE_CLASS) != 0)
omp_notice_variable (gimplify_omp_ctxp, decl, true);
else if (TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt)) == 1)
bool lastprivate
= (!has_decl_expr
|| !bitmap_bit_p (has_decl_expr, DECL_UID (decl)));
+ if (lastprivate
+ && gimplify_omp_ctxp->outer_context
+ && gimplify_omp_ctxp->outer_context->region_type
+ == ORT_WORKSHARE
+ && gimplify_omp_ctxp->outer_context->combined_loop
+ && !gimplify_omp_ctxp->outer_context->distribute)
+ {
+ struct gimplify_omp_ctx *outer
+ = gimplify_omp_ctxp->outer_context;
+ n = splay_tree_lookup (outer->variables,
+ (splay_tree_key) decl);
+ if (n != NULL
+ && (n->value & GOVD_DATA_SHARE_CLASS) == GOVD_LOCAL)
+ lastprivate = false;
+ else if (omp_check_private (outer, decl, false))
+ error ("lastprivate variable %qE is private in outer "
+ "context", DECL_NAME (decl));
+ else
+ {
+ omp_add_variable (outer, decl,
+ GOVD_LASTPRIVATE | GOVD_SEEN);
+ if (outer->outer_context)
+ omp_notice_variable (outer->outer_context, decl, true);
+ }
+ }
c = build_omp_clause (input_location,
lastprivate ? OMP_CLAUSE_LASTPRIVATE
: OMP_CLAUSE_PRIVATE);
OMP_CLAUSE_DECL (c) = decl;
OMP_CLAUSE_CHAIN (c) = OMP_FOR_CLAUSES (for_stmt);
+ OMP_FOR_CLAUSES (for_stmt) = c;
omp_add_variable (gimplify_omp_ctxp, decl,
(lastprivate ? GOVD_LASTPRIVATE : GOVD_PRIVATE)
- | GOVD_SEEN);
+ | GOVD_EXPLICIT | GOVD_SEEN);
c = NULL_TREE;
}
}
- else if (omp_is_private (gimplify_omp_ctxp, decl, simd))
+ else if (omp_is_private (gimplify_omp_ctxp, decl, 0))
omp_notice_variable (gimplify_omp_ctxp, decl, true);
else
omp_add_variable (gimplify_omp_ctxp, decl, GOVD_PRIVATE | GOVD_SEEN);
/* If DECL is not a gimple register, create a temporary variable to act
as an iteration counter. This is valid, since DECL cannot be
- modified in the body of the loop. */
+ modified in the body of the loop. Similarly for any iteration vars
+ in simd with collapse > 1 where the iterator vars must be
+ lastprivate. */
if (orig_for_stmt != for_stmt)
var = decl;
- else if (!is_gimple_reg (decl))
+ else if (!is_gimple_reg (decl)
+ || (simd && TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt)) > 1))
{
var = create_tmp_var (TREE_TYPE (decl), get_name (decl));
TREE_OPERAND (t, 0) = var;
gimplify_seq_add_stmt (&for_body, gimple_build_assign (decl, var));
- omp_add_variable (gimplify_omp_ctxp, var, GOVD_PRIVATE | GOVD_SEEN);
+ if (simd && TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt)) == 1)
+ {
+ c2 = build_omp_clause (input_location, OMP_CLAUSE_LINEAR);
+ OMP_CLAUSE_LINEAR_NO_COPYIN (c2) = 1;
+ OMP_CLAUSE_LINEAR_NO_COPYOUT (c2) = 1;
+ OMP_CLAUSE_DECL (c2) = var;
+ OMP_CLAUSE_CHAIN (c2) = OMP_FOR_CLAUSES (for_stmt);
+ OMP_FOR_CLAUSES (for_stmt) = c2;
+ omp_add_variable (gimplify_omp_ctxp, var,
+ GOVD_LINEAR | GOVD_EXPLICIT | GOVD_SEEN);
+ if (c == NULL_TREE)
+ {
+ c = c2;
+ c2 = NULL_TREE;
+ }
+ }
+ else
+ omp_add_variable (gimplify_omp_ctxp, var,
+ GOVD_PRIVATE | GOVD_SEEN);
}
else
var = decl;
case POSTINCREMENT_EXPR:
{
tree decl = TREE_OPERAND (t, 0);
- // c_omp_for_incr_canonicalize_ptr() should have been
- // called to massage things appropriately.
+ /* c_omp_for_incr_canonicalize_ptr() should have been
+ called to massage things appropriately. */
gcc_assert (!POINTER_TYPE_P (TREE_TYPE (decl)));
if (orig_for_stmt != for_stmt)
case PREDECREMENT_EXPR:
case POSTDECREMENT_EXPR:
+ /* c_omp_for_incr_canonicalize_ptr() should have been
+ called to massage things appropriately. */
+ gcc_assert (!POINTER_TYPE_P (TREE_TYPE (decl)));
if (orig_for_stmt != for_stmt)
break;
t = build_int_cst (TREE_TYPE (decl), -1);
ret = MIN (ret, tret);
if (c)
{
- OMP_CLAUSE_LINEAR_STEP (c) = TREE_OPERAND (t, 1);
+ tree step = TREE_OPERAND (t, 1);
+ tree stept = TREE_TYPE (decl);
+ if (POINTER_TYPE_P (stept))
+ stept = sizetype;
+ step = fold_convert (stept, step);
if (TREE_CODE (t) == MINUS_EXPR)
+ step = fold_build1 (NEGATE_EXPR, stept, step);
+ OMP_CLAUSE_LINEAR_STEP (c) = step;
+ if (step != TREE_OPERAND (t, 1))
{
- t = TREE_OPERAND (t, 1);
- OMP_CLAUSE_LINEAR_STEP (c)
- = fold_build1 (NEGATE_EXPR, TREE_TYPE (t), t);
tret = gimplify_expr (&OMP_CLAUSE_LINEAR_STEP (c),
&for_pre_body, NULL,
is_gimple_val, fb_rvalue);
gcc_unreachable ();
}
+ if (c2)
+ {
+ gcc_assert (c);
+ OMP_CLAUSE_LINEAR_STEP (c2) = OMP_CLAUSE_LINEAR_STEP (c);
+ }
+
if ((var != decl || TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt)) > 1)
&& orig_for_stmt == for_stmt)
{
for (c = OMP_FOR_CLAUSES (for_stmt); c ; c = OMP_CLAUSE_CHAIN (c))
- if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE
- && OMP_CLAUSE_DECL (c) == decl
- && OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c) == NULL)
+ if (((OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE
+ && OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c) == NULL)
+ || (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LINEAR
+ && !OMP_CLAUSE_LINEAR_NO_COPYOUT (c)
+ && OMP_CLAUSE_LINEAR_GIMPLE_SEQ (c) == NULL))
+ && OMP_CLAUSE_DECL (c) == decl)
{
t = TREE_VEC_ELT (OMP_FOR_INCR (for_stmt), i);
gcc_assert (TREE_CODE (t) == MODIFY_EXPR);
gcc_assert (TREE_OPERAND (t, 0) == var);
t = build2 (TREE_CODE (t), TREE_TYPE (decl), decl,
TREE_OPERAND (t, 1));
- gimplify_assign (decl, t,
- &OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c));
+ gimple_seq *seq;
+ if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE)
+ seq = &OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c);
+ else
+ seq = &OMP_CLAUSE_LINEAR_GIMPLE_SEQ (c);
+ gimplify_assign (decl, t, seq);
}
}
}
TREE_OPERAND (TREE_OPERAND (t, 1), 0) = var;
}
- gimplify_adjust_omp_clauses (&OMP_FOR_CLAUSES (orig_for_stmt));
+ gimplify_adjust_omp_clauses (pre_p, &OMP_FOR_CLAUSES (orig_for_stmt));
int kind;
switch (TREE_CODE (orig_for_stmt))
}
else
gimplify_and_add (OMP_BODY (expr), &body);
- gimplify_adjust_omp_clauses (&OMP_CLAUSES (expr));
+ gimplify_adjust_omp_clauses (pre_p, &OMP_CLAUSES (expr));
switch (TREE_CODE (expr))
{
gimplify_scan_omp_clauses (&OMP_TARGET_UPDATE_CLAUSES (expr), pre_p,
ORT_WORKSHARE);
- gimplify_adjust_omp_clauses (&OMP_TARGET_UPDATE_CLAUSES (expr));
+ gimplify_adjust_omp_clauses (pre_p, &OMP_TARGET_UPDATE_CLAUSES (expr));
stmt = gimple_build_omp_target (NULL, GF_OMP_TARGET_KIND_UPDATE,
OMP_TARGET_UPDATE_CLAUSES (expr));
extern void gimplify_type_sizes (tree, gimple_seq *);
extern void gimplify_one_sizepos (tree *, gimple_seq *);
extern gimple gimplify_body (tree, bool);
+extern enum gimplify_status gimplify_arg (tree *, gimple_seq *, location_t);
extern void gimplify_function_tree (tree);
extern enum gimplify_status gimplify_va_arg_expr (tree *, gimple_seq *,
gimple_seq *);
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
char size_string[size_string_size + 1];
memcpy(size_string, hdr->ar_size, size_string_size);
char* ps = size_string + size_string_size;
- while (ps[-1] == ' ')
+ while (ps > size_string && ps[-1] == ' ')
--ps;
*ps = '\0';
}
else if (p[1] == '*')
{
- this->lineoff_ = p - this->linebuf_;
+ this->lineoff_ = p + 2 - this->linebuf_;
Location location = this->location();
if (!this->skip_c_comment())
return Token::make_invalid_token(location);
Methods** all_methods)
{
*all_methods = NULL;
- Types_seen types_seen;
- Type::add_methods_for_type(type, NULL, 0, false, false, &types_seen,
- all_methods);
+ std::vector<const Named_type*> seen;
+ Type::add_methods_for_type(type, NULL, 0, false, false, &seen, all_methods);
Type::build_stub_methods(gogo, type, *all_methods, location);
}
unsigned int depth,
bool is_embedded_pointer,
bool needs_stub_method,
- Types_seen* types_seen,
+ std::vector<const Named_type*>* seen,
Methods** methods)
{
// Pointer types may not have methods.
const Named_type* nt = type->named_type();
if (nt != NULL)
{
- std::pair<Types_seen::iterator, bool> ins = types_seen->insert(nt);
- if (!ins.second)
- return;
- }
+ for (std::vector<const Named_type*>::const_iterator p = seen->begin();
+ p != seen->end();
+ ++p)
+ {
+ if (*p == nt)
+ return;
+ }
- if (nt != NULL)
- Type::add_local_methods_for_type(nt, field_indexes, depth,
- is_embedded_pointer, needs_stub_method,
- methods);
+ seen->push_back(nt);
+
+ Type::add_local_methods_for_type(nt, field_indexes, depth,
+ is_embedded_pointer, needs_stub_method,
+ methods);
+ }
Type::add_embedded_methods_for_type(type, field_indexes, depth,
is_embedded_pointer, needs_stub_method,
- types_seen, methods);
+ seen, methods);
// If we are called with depth > 0, then we are looking at an
// anonymous field of a struct. If such a field has interface type,
// following the usual rules for an interface type.
if (depth > 0)
Type::add_interface_methods_for_type(type, field_indexes, depth, methods);
+
+ if (nt != NULL)
+ seen->pop_back();
}
// Add the local methods for the named type NT to *METHODS. The
unsigned int depth,
bool is_embedded_pointer,
bool needs_stub_method,
- Types_seen* types_seen,
+ std::vector<const Named_type*>* seen,
Methods** methods)
{
// Look for anonymous fields in TYPE. TYPE has fields if it is a
(needs_stub_method
|| is_pointer
|| i > 0),
- types_seen,
+ seen,
methods);
}
}
static tree
build_receive_return_type(tree type);
- // A hash table we use to avoid infinite recursion.
- typedef Unordered_set_hash(const Named_type*, Type_hash_identical,
- Type_identical) Types_seen;
-
// Add all methods for TYPE to the list of methods for THIS.
static void
add_methods_for_type(const Type* type, const Method::Field_indexes*,
- unsigned int depth, bool, bool, Types_seen*,
+ unsigned int depth, bool, bool,
+ std::vector<const Named_type*>*,
Methods**);
static void
static void
add_embedded_methods_for_type(const Type* type,
const Method::Field_indexes*,
- unsigned int depth, bool, bool, Types_seen*,
+ unsigned int depth, bool, bool,
+ std::vector<const Named_type*>*,
Methods**);
static void
switch (TREE_CODE (scev))
{
+ case NEGATE_EXPR:
+ case BIT_NOT_EXPR:
+ CASE_CONVERT:
+ case NON_LVALUE_EXPR:
+ return graphite_can_represent_scev (TREE_OPERAND (scev, 0));
+
case PLUS_EXPR:
+ case POINTER_PLUS_EXPR:
case MINUS_EXPR:
return graphite_can_represent_scev (TREE_OPERAND (scev, 0))
&& graphite_can_represent_scev (TREE_OPERAND (scev, 1));
if (!evolution_function_right_is_integer_cst (scev)
|| !graphite_can_represent_init (scev))
return false;
+ return graphite_can_represent_scev (CHREC_LEFT (scev));
default:
break;
}
/* Only affine functions can be represented. */
- if (!scev_is_linear_expression (scev))
+ if (tree_contains_chrecs (scev, NULL)
+ || !scev_is_linear_expression (scev))
return false;
return true;
result.exits = false;
/* Mark bbs terminating a SESE region difficult, if they start
- a condition. */
- if (!single_succ_p (bb))
+ a condition or if the block it exits to cannot be split
+ with make_forwarder_block. */
+ if (!single_succ_p (bb)
+ || bb_has_abnormal_pred (single_succ (bb)))
result.difficult = true;
else
result.exit = single_succ (bb);
else if (!opt_for_fn (node->decl, optimize)
|| !opt_for_fn (node->decl, flag_ipa_cp))
reason = "non-optimized function";
+ else if (node->tm_clone)
+ reason = "transactional memory clone";
else if (lookup_attribute ("omp declare simd", DECL_ATTRIBUTES (node->decl)))
{
/* Ideally we should clone the SIMD clones themselves and create
&& DECL_FUNCTION_CODE (target) == BUILT_IN_UNREACHABLE)
|| !possible_polymorphic_call_target_p
(ie, cgraph_get_node (target)))
- {
- if (dump_file)
- fprintf (dump_file,
- "Type inconsident devirtualization: %s/%i->%s\n",
- ie->caller->name (), ie->caller->order,
- IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (target)));
- target = builtin_decl_implicit (BUILT_IN_UNREACHABLE);
- cgraph_get_create_node (target);
- }
+ target = ipa_impossible_devirt_target (ie, target);
return target;
}
}
if (targets.length () == 1)
target = targets[0]->decl;
else
- target = builtin_decl_implicit (BUILT_IN_UNREACHABLE);
+ target = ipa_impossible_devirt_target (ie, NULL_TREE);
}
else
{
if (target && !possible_polymorphic_call_target_p (ie,
cgraph_get_node (target)))
- {
- if (dump_file)
- fprintf (dump_file,
- "Type inconsident devirtualization: %s/%i->%s\n",
- ie->caller->name (), ie->caller->order,
- IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (target)));
- target = builtin_decl_implicit (BUILT_IN_UNREACHABLE);
- cgraph_get_create_node (target);
- }
+ target = ipa_impossible_devirt_target (ie, target);
return target;
}
struct ipcp_value_source *src)
{
struct ipa_node_params *caller_info = IPA_NODE_REF (cs->caller);
- struct ipa_node_params *dst_info = IPA_NODE_REF (cs->callee);
+ cgraph_node *real_dest = cgraph_function_node (cs->callee);
+ struct ipa_node_params *dst_info = IPA_NODE_REF (real_dest);
if ((dst_info->ipcp_orig_node && !dst_info->is_all_contexts_clone)
|| caller_info->node_dead)
context->outer_type = expected_type;
context->offset = 0;
context->maybe_derived_type = true;
+ context->maybe_in_construction = true;
+ /* POD can be changed to an instance of a polymorphic type by
+ placement new. Here we play safe and assume that any
+ non-polymorphic type is POD. */
+ if ((TREE_CODE (type) != RECORD_TYPE
+ || !TYPE_BINFO (type)
+ || !polymorphic_type_binfo_p (TYPE_BINFO (type)))
+ && (TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST
+ || (offset + tree_to_uhwi (TYPE_SIZE (expected_type)) <=
+ tree_to_uhwi (TYPE_SIZE (type)))))
+ return true;
return false;
}
{
if (completep)
*completep = false;
+ if (cache_token)
+ *cache_token = NULL;
if (nonconstruction_targetsp)
*nonconstruction_targetsp = 0;
return nodes;
{
if (completep)
*completep = true;
+ if (cache_token)
+ *cache_token = NULL;
if (nonconstruction_targetsp)
*nonconstruction_targetsp = 0;
return nodes;
{
if (completep)
*completep = false;
+ if (cache_token)
+ *cache_token = NULL;
if (nonconstruction_targetsp)
*nonconstruction_targetsp = 0;
return nodes;
it is NULL. If UPDATE_OVERALL_SUMMARY is false, do not bother to recompute overall
size of caller after inlining. Caller is required to eventually do it via
inline_update_overall_summary.
+ If callee_removed is non-NULL, set it to true if we removed callee node.
Return true iff any new callgraph edges were discovered as a
result of inlining. */
bool
inline_call (struct cgraph_edge *e, bool update_original,
vec<cgraph_edge_p> *new_edges,
- int *overall_size, bool update_overall_summary)
+ int *overall_size, bool update_overall_summary,
+ bool *callee_removed)
{
int old_size = 0, new_size = 0;
struct cgraph_node *to = NULL;
{
next_alias = cgraph_alias_target (alias);
cgraph_remove_node (alias);
+ if (callee_removed)
+ *callee_removed = true;
alias = next_alias;
}
else
inline_to_all_callers (struct cgraph_node *node, void *data)
{
int *num_calls = (int *)data;
+ bool callee_removed = false;
+
while (node->callers && !node->global.inlined_to)
{
struct cgraph_node *caller = node->callers->caller;
inline_summary (node->callers->caller)->size);
}
- inline_call (node->callers, true, NULL, NULL, true);
+ inline_call (node->callers, true, NULL, NULL, true, &callee_removed);
if (dump_file)
fprintf (dump_file,
" Inlined into %s which now has %i size\n",
{
if (dump_file)
fprintf (dump_file, "New calls found; giving up.\n");
- return true;
+ return callee_removed;
}
+ if (callee_removed)
+ return true;
}
return false;
}
int num_calls = 0;
cgraph_for_node_and_aliases (node, sum_callers,
&num_calls, true);
- cgraph_for_node_and_aliases (node, inline_to_all_callers,
- &num_calls, true);
+ while (cgraph_for_node_and_aliases (node, inline_to_all_callers,
+ &num_calls, true))
+ ;
remove_functions = true;
}
}
bool speculation_useful_p (struct cgraph_edge *e, bool anticipate_inlining);
/* In ipa-inline-transform.c */
-bool inline_call (struct cgraph_edge *, bool, vec<cgraph_edge_p> *, int *, bool);
+bool inline_call (struct cgraph_edge *, bool, vec<cgraph_edge_p> *, int *, bool,
+ bool *callee_removed = NULL);
unsigned int inline_transform (struct cgraph_node *);
void clone_inlined_nodes (struct cgraph_edge *e, bool, bool, int *,
int freq_scale);
return cs;
}
+/* Return the target to be used in cases of impossible devirtualization. IE
+ and target (the latter can be NULL) are dumped when dumping is enabled. */
+
+tree
+ipa_impossible_devirt_target (struct cgraph_edge *ie, tree target)
+{
+ if (dump_file)
+ {
+ if (target)
+ fprintf (dump_file,
+ "Type inconsistent devirtualization: %s/%i->%s\n",
+ ie->caller->name (), ie->caller->order,
+ IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (target)));
+ else
+ fprintf (dump_file,
+ "No devirtualization target in %s/%i\n",
+ ie->caller->name (), ie->caller->order);
+ }
+ tree new_target = builtin_decl_implicit (BUILT_IN_UNREACHABLE);
+ cgraph_get_create_node (new_target);
+ return new_target;
+}
+
/* Try to find a destination for indirect edge IE that corresponds to a virtual
call based on a formal parameter which is described by jump function JFUNC
and if it can be determined, make it direct and return the direct edge.
&& DECL_FUNCTION_CODE (target) == BUILT_IN_UNREACHABLE)
|| !possible_polymorphic_call_target_p
(ie, cgraph_get_node (target)))
- {
- if (dump_file)
- fprintf (dump_file,
- "Type inconsident devirtualization: %s/%i->%s\n",
- ie->caller->name (), ie->caller->order,
- IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (target)));
- target = builtin_decl_implicit (BUILT_IN_UNREACHABLE);
- cgraph_get_create_node (target);
- }
+ target = ipa_impossible_devirt_target (ie, target);
return ipa_make_edge_direct_to_target (ie, target);
}
}
if (targets.length () == 1)
target = targets[0]->decl;
else
- {
- target = builtin_decl_implicit (BUILT_IN_UNREACHABLE);
- cgraph_get_create_node (target);
- }
+ target = ipa_impossible_devirt_target (ie, NULL_TREE);
}
else
{
if (target)
{
-#ifdef ENABLE_CHECKING
- gcc_assert (possible_polymorphic_call_target_p
- (ie, cgraph_get_node (target)));
-#endif
+ if (!possible_polymorphic_call_target_p (ie, cgraph_get_node (target)))
+ target = ipa_impossible_devirt_target (ie, target);
return ipa_make_edge_direct_to_target (ie, target);
}
else
else if (jfunc->type == IPA_JF_PASS_THROUGH
&& ipa_get_jf_pass_through_operation (jfunc) == NOP_EXPR)
{
- if (ici->agg_contents
- && !ipa_get_jf_pass_through_agg_preserved (jfunc))
+ if ((ici->agg_contents
+ && !ipa_get_jf_pass_through_agg_preserved (jfunc))
+ || (ici->polymorphic
+ && !ipa_get_jf_pass_through_type_preserved (jfunc)))
ici->param_index = -1;
else
ici->param_index = ipa_get_jf_pass_through_formal_id (jfunc);
}
else if (jfunc->type == IPA_JF_ANCESTOR)
{
- if (ici->agg_contents
- && !ipa_get_jf_ancestor_agg_preserved (jfunc))
+ if ((ici->agg_contents
+ && !ipa_get_jf_ancestor_agg_preserved (jfunc))
+ || (ici->polymorphic
+ && !ipa_get_jf_ancestor_type_preserved (jfunc)))
ici->param_index = -1;
else
{
TREE_TYPE (fndecl) = new_type;
DECL_VIRTUAL_P (fndecl) = 0;
+ DECL_LANG_SPECIFIC (fndecl) = NULL;
otypes.release ();
oparms.release ();
}
struct cgraph_edge *ipa_make_edge_direct_to_target (struct cgraph_edge *, tree);
tree ipa_binfo_from_known_type_jfunc (struct ipa_jump_func *);
tree ipa_intraprocedural_devirtualization (gimple);
+tree ipa_impossible_devirt_target (struct cgraph_edge *, tree);
/* Functions related to both. */
void ipa_analyze_node (struct cgraph_node *);
|| !DECL_EXTERNAL (e->callee->decl)
|| e->callee->alias
|| before_inlining_p))
- pointer_set_insert (reachable, e->callee);
+ {
+ /* Be sure that we will not optimize out alias target
+ body. */
+ if (DECL_EXTERNAL (e->callee->decl)
+ && e->callee->alias
+ && before_inlining_p)
+ {
+ pointer_set_insert (reachable,
+ cgraph_function_node (e->callee));
+ }
+ pointer_set_insert (reachable, e->callee);
+ }
enqueue_node (e->callee, &first, reachable);
}
if (!node->in_other_partition)
node->local.local = false;
cgraph_node_remove_callees (node);
+ symtab_remove_from_same_comdat_group (node);
ipa_remove_all_references (&node->ref_list);
changed = true;
}
vnode->analyzed = false;
vnode->aux = NULL;
+ symtab_remove_from_same_comdat_group (vnode);
+
/* Keep body if it may be useful for constant folding. */
if ((init = ctor_for_folding (vnode->decl)) == error_mark_node)
varpool_remove_initializer (vnode);
static bool
comdat_can_be_unshared_p_1 (symtab_node *node)
{
+ if (!node->externally_visible)
+ return true;
/* When address is taken, we don't know if equality comparison won't
break eventually. Exception are virutal functions, C++
constructors/destructors and vtables, where this is not possible by
int alt;
int i, j, k;
int insn_allows_mem[MAX_RECOG_OPERANDS];
+ move_table *move_in_cost, *move_out_cost;
+ short (*mem_cost)[2];
for (i = 0; i < n_ops; i++)
insn_allows_mem[i] = 0;
bool in_p = recog_data.operand_type[i] != OP_OUT;
bool out_p = recog_data.operand_type[i] != OP_IN;
enum reg_class op_class = classes[i];
- move_table *move_in_cost, *move_out_cost;
ira_init_register_move_cost_if_necessary (mode);
if (! in_p)
{
ira_assert (out_p);
- move_out_cost = ira_may_move_out_cost[mode];
- for (k = cost_classes_ptr->num - 1; k >= 0; k--)
+ if (op_class == NO_REGS)
{
- rclass = cost_classes[k];
- pp_costs[k]
- = move_out_cost[op_class][rclass] * frequency;
+ mem_cost = ira_memory_move_cost[mode];
+ for (k = cost_classes_ptr->num - 1; k >= 0; k--)
+ {
+ rclass = cost_classes[k];
+ pp_costs[k] = mem_cost[rclass][0] * frequency;
+ }
+ }
+ else
+ {
+ move_out_cost = ira_may_move_out_cost[mode];
+ for (k = cost_classes_ptr->num - 1; k >= 0; k--)
+ {
+ rclass = cost_classes[k];
+ pp_costs[k]
+ = move_out_cost[op_class][rclass] * frequency;
+ }
}
}
else if (! out_p)
{
ira_assert (in_p);
- move_in_cost = ira_may_move_in_cost[mode];
- for (k = cost_classes_ptr->num - 1; k >= 0; k--)
+ if (op_class == NO_REGS)
{
- rclass = cost_classes[k];
- pp_costs[k]
- = move_in_cost[rclass][op_class] * frequency;
+ mem_cost = ira_memory_move_cost[mode];
+ for (k = cost_classes_ptr->num - 1; k >= 0; k--)
+ {
+ rclass = cost_classes[k];
+ pp_costs[k] = mem_cost[rclass][1] * frequency;
+ }
+ }
+ else
+ {
+ move_in_cost = ira_may_move_in_cost[mode];
+ for (k = cost_classes_ptr->num - 1; k >= 0; k--)
+ {
+ rclass = cost_classes[k];
+ pp_costs[k]
+ = move_in_cost[rclass][op_class] * frequency;
+ }
}
}
else
{
- move_in_cost = ira_may_move_in_cost[mode];
- move_out_cost = ira_may_move_out_cost[mode];
- for (k = cost_classes_ptr->num - 1; k >= 0; k--)
+ if (op_class == NO_REGS)
{
- rclass = cost_classes[k];
- pp_costs[k] = ((move_in_cost[rclass][op_class]
- + move_out_cost[op_class][rclass])
- * frequency);
+ mem_cost = ira_memory_move_cost[mode];
+ for (k = cost_classes_ptr->num - 1; k >= 0; k--)
+ {
+ rclass = cost_classes[k];
+ pp_costs[k] = ((mem_cost[rclass][0]
+ + mem_cost[rclass][1])
+ * frequency);
+ }
+ }
+ else
+ {
+ move_in_cost = ira_may_move_in_cost[mode];
+ move_out_cost = ira_may_move_out_cost[mode];
+ for (k = cost_classes_ptr->num - 1; k >= 0; k--)
+ {
+ rclass = cost_classes[k];
+ pp_costs[k] = ((move_in_cost[rclass][op_class]
+ + move_out_cost[op_class][rclass])
+ * frequency);
+ }
}
}
into that class. */
if (REG_P (op) && REGNO (op) >= FIRST_PSEUDO_REGISTER)
{
- if (classes[i] == NO_REGS)
+ if (classes[i] == NO_REGS && ! allows_mem[i])
{
/* We must always fail if the operand is a REG, but
- we did not find a suitable class.
+ we did not find a suitable class and memory is
+ not allowed.
Otherwise we may perform an uninitialized read
from this_op_costs after the `continue' statement
bool in_p = recog_data.operand_type[i] != OP_OUT;
bool out_p = recog_data.operand_type[i] != OP_IN;
enum reg_class op_class = classes[i];
- move_table *move_in_cost, *move_out_cost;
ira_init_register_move_cost_if_necessary (mode);
if (! in_p)
{
ira_assert (out_p);
- move_out_cost = ira_may_move_out_cost[mode];
- for (k = cost_classes_ptr->num - 1; k >= 0; k--)
+ if (op_class == NO_REGS)
{
- rclass = cost_classes[k];
- pp_costs[k]
- = move_out_cost[op_class][rclass] * frequency;
+ mem_cost = ira_memory_move_cost[mode];
+ for (k = cost_classes_ptr->num - 1; k >= 0; k--)
+ {
+ rclass = cost_classes[k];
+ pp_costs[k] = mem_cost[rclass][0] * frequency;
+ }
+ }
+ else
+ {
+ move_out_cost = ira_may_move_out_cost[mode];
+ for (k = cost_classes_ptr->num - 1; k >= 0; k--)
+ {
+ rclass = cost_classes[k];
+ pp_costs[k]
+ = move_out_cost[op_class][rclass] * frequency;
+ }
}
}
else if (! out_p)
{
ira_assert (in_p);
- move_in_cost = ira_may_move_in_cost[mode];
- for (k = cost_classes_ptr->num - 1; k >= 0; k--)
+ if (op_class == NO_REGS)
+ {
+ mem_cost = ira_memory_move_cost[mode];
+ for (k = cost_classes_ptr->num - 1; k >= 0; k--)
+ {
+ rclass = cost_classes[k];
+ pp_costs[k] = mem_cost[rclass][1] * frequency;
+ }
+ }
+ else
{
- rclass = cost_classes[k];
- pp_costs[k]
- = move_in_cost[rclass][op_class] * frequency;
+ move_in_cost = ira_may_move_in_cost[mode];
+ for (k = cost_classes_ptr->num - 1; k >= 0; k--)
+ {
+ rclass = cost_classes[k];
+ pp_costs[k]
+ = move_in_cost[rclass][op_class] * frequency;
+ }
}
}
else
{
- move_in_cost = ira_may_move_in_cost[mode];
- move_out_cost = ira_may_move_out_cost[mode];
- for (k = cost_classes_ptr->num - 1; k >= 0; k--)
+ if (op_class == NO_REGS)
{
- rclass = cost_classes[k];
- pp_costs[k] = ((move_in_cost[rclass][op_class]
- + move_out_cost[op_class][rclass])
- * frequency);
+ mem_cost = ira_memory_move_cost[mode];
+ for (k = cost_classes_ptr->num - 1; k >= 0; k--)
+ {
+ rclass = cost_classes[k];
+ pp_costs[k] = ((mem_cost[rclass][0]
+ + mem_cost[rclass][1])
+ * frequency);
+ }
+ }
+ else
+ {
+ move_in_cost = ira_may_move_in_cost[mode];
+ move_out_cost = ira_may_move_out_cost[mode];
+ for (k = cost_classes_ptr->num - 1; k >= 0; k--)
+ {
+ rclass = cost_classes[k];
+ pp_costs[k] = ((move_in_cost[rclass][op_class]
+ + move_out_cost[op_class][rclass])
+ * frequency);
+ }
}
}
- /* If the alternative actually allows memory, make
- things a bit cheaper since we won't need an extra
- insn to load it. */
- pp->mem_cost
- = ((out_p ? ira_memory_move_cost[mode][op_class][0] : 0)
- + (in_p ? ira_memory_move_cost[mode][op_class][1] : 0)
- - allows_mem[i]) * frequency;
+ if (op_class == NO_REGS)
+ /* Although we don't need insn to reload from
+ memory, still accessing memory is usually more
+ expensive than a register. */
+ pp->mem_cost = frequency;
+ else
+ /* If the alternative actually allows memory, make
+ things a bit cheaper since we won't need an
+ extra insn to load it. */
+ pp->mem_cost
+ = ((out_p ? ira_memory_move_cost[mode][op_class][0] : 0)
+ + (in_p ? ira_memory_move_cost[mode][op_class][1] : 0)
+ - allows_mem[i]) * frequency;
/* If we have assigned a class to this allocno in
our first pass, add a cost to this alternative
corresponding to what we would add if this
enum reg_class pref_class = pref[COST_INDEX (REGNO (op))];
if (pref_class == NO_REGS)
+ {
+ if (op_class != NO_REGS)
+ alt_cost
+ += ((out_p
+ ? ira_memory_move_cost[mode][op_class][0]
+ : 0)
+ + (in_p
+ ? ira_memory_move_cost[mode][op_class][1]
+ : 0));
+ }
+ else if (op_class == NO_REGS)
alt_cost
+= ((out_p
- ? ira_memory_move_cost[mode][op_class][0] : 0)
+ ? ira_memory_move_cost[mode][pref_class][1]
+ : 0)
+ (in_p
- ? ira_memory_move_cost[mode][op_class][1]
+ ? ira_memory_move_cost[mode][pref_class][0]
: 0));
else if (ira_reg_class_intersect[pref_class][op_class]
== NO_REGS)
- alt_cost += ira_register_move_cost[mode][pref_class][op_class];
+ alt_cost += (ira_register_move_cost
+ [mode][pref_class][op_class]);
}
}
}
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
extern int lhd_gimplify_expr (tree *, gimple_seq *, gimple_seq *);
extern enum omp_clause_default_kind lhd_omp_predetermined_sharing (tree);
extern tree lhd_omp_assignment (tree, tree, tree);
+extern void lhd_omp_finish_clause (tree, gimple_seq *);
struct gimplify_omp_ctx;
extern void lhd_omp_firstprivatize_type_sizes (struct gimplify_omp_ctx *,
tree);
#define LANG_HOOKS_OMP_CLAUSE_DEFAULT_CTOR hook_tree_tree_tree_tree_null
#define LANG_HOOKS_OMP_CLAUSE_COPY_CTOR lhd_omp_assignment
#define LANG_HOOKS_OMP_CLAUSE_ASSIGN_OP lhd_omp_assignment
+#define LANG_HOOKS_OMP_CLAUSE_LINEAR_CTOR NULL
#define LANG_HOOKS_OMP_CLAUSE_DTOR hook_tree_tree_tree_null
-#define LANG_HOOKS_OMP_FINISH_CLAUSE hook_void_tree
+#define LANG_HOOKS_OMP_FINISH_CLAUSE lhd_omp_finish_clause
#define LANG_HOOKS_DECLS { \
LANG_HOOKS_GLOBAL_BINDINGS_P, \
LANG_HOOKS_OMP_CLAUSE_DEFAULT_CTOR, \
LANG_HOOKS_OMP_CLAUSE_COPY_CTOR, \
LANG_HOOKS_OMP_CLAUSE_ASSIGN_OP, \
+ LANG_HOOKS_OMP_CLAUSE_LINEAR_CTOR, \
LANG_HOOKS_OMP_CLAUSE_DTOR, \
LANG_HOOKS_OMP_FINISH_CLAUSE \
}
return build2 (MODIFY_EXPR, TREE_TYPE (dst), dst, src);
}
+/* Finalize clause C. */
+
+void
+lhd_omp_finish_clause (tree, gimple_seq *)
+{
+}
+
/* Register language specific type size variables as potentially OpenMP
firstprivate variables. */
/* Similarly, except use an assignment operator instead. */
tree (*omp_clause_assign_op) (tree clause, tree dst, tree src);
+ /* Build and return code for a constructor of DST that sets it to
+ SRC + ADD. */
+ tree (*omp_clause_linear_ctor) (tree clause, tree dst, tree src, tree add);
+
/* Build and return code destructing DECL. Return NULL if nothing
to be done. */
tree (*omp_clause_dtor) (tree clause, tree decl);
/* Do language specific checking on an implicitly determined clause. */
- void (*omp_finish_clause) (tree clause);
+ void (*omp_finish_clause) (tree clause, gimple_seq *pre_p);
};
/* Language hooks related to LTO serialization. */
else
{
bool recorded_exits = loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS);
+ bool needs_fixup = loops_state_satisfies_p (LOOPS_NEED_FIXUP);
gcc_assert (cfun->curr_properties & PROP_loops);
/* Ensure that the dominators are computed, like flow_loops_find does. */
calculate_dominance_info (CDI_DOMINATORS);
- if (loops_state_satisfies_p (LOOPS_NEED_FIXUP))
- {
- loops_state_clear (~0U);
- fix_loop_structure (NULL);
- }
-
#ifdef ENABLE_CHECKING
- else
+ if (!needs_fixup)
verify_loop_structure ();
#endif
if (recorded_exits)
release_recorded_exits ();
loops_state_clear (~0U);
+
+ if (needs_fixup)
+ {
+ /* Apply LOOPS_MAY_HAVE_MULTIPLE_LATCHES early as fix_loop_structure
+ re-applies flags. */
+ loops_state_set (flags & LOOPS_MAY_HAVE_MULTIPLE_LATCHES);
+ fix_loop_structure (NULL);
+ }
}
/* Apply flags to loops. */
}
}
+static int valid_address_p (enum machine_mode mode, rtx addr, addr_space_t as);
+
/* Make reloads for subreg in operand NOP with internal subreg mode
REG_MODE, add new reloads for further processing. Return true if
any reload was generated. */
equivalences in function lra_constraints) and because for spilled
pseudos we allocate stack memory enough for the biggest
corresponding paradoxical subreg. */
- if ((MEM_P (reg)
- && (! SLOW_UNALIGNED_ACCESS (mode, MEM_ALIGN (reg))
- || MEM_ALIGN (reg) >= GET_MODE_ALIGNMENT (mode)))
- || (REG_P (reg) && REGNO (reg) < FIRST_PSEUDO_REGISTER))
+ if (MEM_P (reg)
+ && (! SLOW_UNALIGNED_ACCESS (mode, MEM_ALIGN (reg))
+ || MEM_ALIGN (reg) >= GET_MODE_ALIGNMENT (mode)))
+ {
+ rtx subst, old = *curr_id->operand_loc[nop];
+
+ alter_subreg (curr_id->operand_loc[nop], false);
+ subst = *curr_id->operand_loc[nop];
+ lra_assert (MEM_P (subst));
+ if (! valid_address_p (GET_MODE (reg), XEXP (reg, 0),
+ MEM_ADDR_SPACE (reg))
+ || valid_address_p (GET_MODE (subst), XEXP (subst, 0),
+ MEM_ADDR_SPACE (subst)))
+ return true;
+ /* If the address was valid and became invalid, prefer to reload
+ the memory. Typical case is when the index scale should
+ correspond the memory. */
+ *curr_id->operand_loc[nop] = old;
+ }
+ else if (REG_P (reg) && REGNO (reg) < FIRST_PSEUDO_REGISTER)
{
alter_subreg (curr_id->operand_loc[nop], false);
return true;
Add reloads to the lists *BEFORE and *AFTER. We might need to add
reloads to *AFTER because of inc/dec, {pre, post} modify in the
- address. Return true for any RTL change. */
+ address. Return true for any RTL change.
+
+ The function is a helper function which does not produce all
+ transformations which can be necessary. It does just basic steps.
+ To do all necessary transformations use function
+ process_address. */
static bool
-process_address (int nop, rtx *before, rtx *after)
+process_address_1 (int nop, rtx *before, rtx *after)
{
struct address_info ad;
rtx new_reg;
*ad.inner = simplify_gen_binary (PLUS, GET_MODE (new_reg),
new_reg, *ad.index);
}
+ else if (get_index_scale (&ad) == 1)
+ {
+ /* The last transformation to one reg will be made in
+ curr_insn_transform function. */
+ end_sequence ();
+ return false;
+ }
else
{
/* base + scale * index => base + new_reg,
return true;
}
+/* Do address reloads until it is necessary. Use process_address_1 as
+ a helper function. Return true for any RTL changes. */
+static bool
+process_address (int nop, rtx *before, rtx *after)
+{
+ bool res = false;
+
+ while (process_address_1 (nop, before, after))
+ res = true;
+ return res;
+}
+
/* Emit insns to reload VALUE into a new register. VALUE is an
auto-increment or auto-decrement RTX whose operand is a register or
memory location; so reloading involves incrementing that location.
change_p = true;
lra_update_dup (curr_id, i);
}
-
+
if (change_p)
/* If we've changed the instruction then any alternative that
we chose previously may no longer be valid. */
alter_subreg (&x, false);
return x;
}
+ else if (! subst_p)
+ {
+ /* LRA can transform subregs itself. So don't call
+ simplify_gen_subreg until LRA transformations are
+ finished. Function simplify_gen_subreg can do
+ non-trivial transformations (like truncation) which
+ might make LRA work to fail. */
+ SUBREG_REG (x) = new_rtx;
+ return x;
+ }
else
return simplify_gen_subreg (GET_MODE (x), new_rtx,
GET_MODE (new_rtx), SUBREG_BYTE (x));
lto_end_section ();
}
+/* Wrap symbol references in *TP inside a type-preserving MEM_REF. */
+
+static tree
+wrap_refs (tree *tp, int *ws, void *)
+{
+ tree t = *tp;
+ if (handled_component_p (t)
+ && TREE_CODE (TREE_OPERAND (t, 0)) == VAR_DECL)
+ {
+ tree decl = TREE_OPERAND (t, 0);
+ tree ptrtype = build_pointer_type (TREE_TYPE (decl));
+ TREE_OPERAND (t, 0) = build2 (MEM_REF, TREE_TYPE (decl),
+ build1 (ADDR_EXPR, ptrtype, decl),
+ build_int_cst (ptrtype, 0));
+ TREE_THIS_VOLATILE (TREE_OPERAND (t, 0)) = TREE_THIS_VOLATILE (decl);
+ *ws = 0;
+ }
+ else if (TREE_CODE (t) == CONSTRUCTOR)
+ ;
+ else if (!EXPR_P (t))
+ *ws = 0;
+ return NULL_TREE;
+}
/* Main entry point from the pass manager. */
for (i = 0; i < n_nodes; i++)
{
symtab_node *snode = lto_symtab_encoder_deref (encoder, i);
- cgraph_node *node = dyn_cast <cgraph_node> (snode);
- if (node
- && lto_symtab_encoder_encode_body_p (encoder, node)
- && !node->alias)
+ if (cgraph_node *node = dyn_cast <cgraph_node> (snode))
{
+ if (lto_symtab_encoder_encode_body_p (encoder, node)
+ && !node->alias)
+ {
#ifdef ENABLE_CHECKING
- gcc_assert (!bitmap_bit_p (output, DECL_UID (node->decl)));
- bitmap_set_bit (output, DECL_UID (node->decl));
+ gcc_assert (!bitmap_bit_p (output, DECL_UID (node->decl)));
+ bitmap_set_bit (output, DECL_UID (node->decl));
#endif
- decl_state = lto_new_out_decl_state ();
- lto_push_out_decl_state (decl_state);
- if (gimple_has_body_p (node->decl) || !flag_wpa)
- output_function (node);
- else
- copy_function (node);
- gcc_assert (lto_get_out_decl_state () == decl_state);
- lto_pop_out_decl_state ();
- lto_record_function_out_decl_state (node->decl, decl_state);
+ decl_state = lto_new_out_decl_state ();
+ lto_push_out_decl_state (decl_state);
+ if (gimple_has_body_p (node->decl) || !flag_wpa)
+ output_function (node);
+ else
+ copy_function (node);
+ gcc_assert (lto_get_out_decl_state () == decl_state);
+ lto_pop_out_decl_state ();
+ lto_record_function_out_decl_state (node->decl, decl_state);
+ }
+ }
+ else if (varpool_node *node = dyn_cast <varpool_node> (snode))
+ {
+ /* Wrap symbol references inside the ctor in a type
+ preserving MEM_REF. */
+ tree ctor = DECL_INITIAL (node->decl);
+ if (ctor && !in_lto_p)
+ walk_tree (&ctor, wrap_refs, NULL, NULL);
}
}
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
+2014-04-22 Jan Hubicka <hubicka@ucw.cz>
+
+ PR lto/61012
+ * lto-symtab.c (lto_symtab_merge_decls_1):
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
cgraph or a varpool node. */
if (!prevailing)
{
- prevailing = first;
+ for (prevailing = first;
+ prevailing; prevailing = prevailing->next_sharing_asm_name)
+ if (lto_symtab_symbol_p (prevailing))
+ break;
+ if (!prevailing)
+ return;
/* For variables chose with a priority variant with vnode
attached (i.e. from unit where external declaration of
variable is actually used).
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
break;
case OMP_CLAUSE_SHARED:
+ decl = OMP_CLAUSE_DECL (c);
/* Ignore shared directives in teams construct. */
if (gimple_code (ctx->stmt) == GIMPLE_OMP_TEAMS)
- break;
+ {
+ /* Global variables don't need to be copied,
+ the receiver side will use them directly. */
+ tree odecl = maybe_lookup_decl_in_outer_ctx (decl, ctx);
+ if (is_global_var (odecl))
+ break;
+ insert_decl_map (&ctx->cb, decl, odecl);
+ break;
+ }
gcc_assert (is_taskreg_ctx (ctx));
- decl = OMP_CLAUSE_DECL (c);
gcc_assert (!COMPLETE_TYPE_P (TREE_TYPE (decl))
|| !is_variable_sized (decl));
/* Global variables don't need to be copied,
}
else
{
+ if (ctx->outer)
+ {
+ scan_omp_op (&OMP_CLAUSE_DECL (c), ctx->outer);
+ decl = OMP_CLAUSE_DECL (c);
+ }
gcc_assert (!splay_tree_lookup (ctx->field_map,
(splay_tree_key) decl));
tree field
if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_REDUCTION
&& OMP_CLAUSE_REDUCTION_PLACEHOLDER (c))
scan_array_reductions = true;
+ else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LINEAR
+ && OMP_CLAUSE_LINEAR_GIMPLE_SEQ (c))
+ scan_array_reductions = true;
break;
case OMP_CLAUSE_SHARED:
else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE
&& OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c))
scan_omp (&OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c), ctx);
+ else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LINEAR
+ && OMP_CLAUSE_LINEAR_GIMPLE_SEQ (c))
+ scan_omp (&OMP_CLAUSE_LINEAR_GIMPLE_SEQ (c), ctx);
}
/* Create a new name for omp child function. Returns an identifier. */
tree temp = create_tmp_var (type, NULL);
tree c = build_omp_clause (UNKNOWN_LOCATION,
OMP_CLAUSE__LOOPTEMP_);
+ insert_decl_map (&outer_ctx->cb, temp, temp);
OMP_CLAUSE_DECL (c) = temp;
OMP_CLAUSE_CHAIN (c) = gimple_omp_parallel_clauses (stmt);
gimple_omp_parallel_set_clauses (stmt, c);
return false;
}
break;
+ case GIMPLE_OMP_TARGET:
+ for (; ctx != NULL; ctx = ctx->outer)
+ if (gimple_code (ctx->stmt) == GIMPLE_OMP_TARGET
+ && gimple_omp_target_kind (ctx->stmt) == GF_OMP_TARGET_KIND_REGION)
+ {
+ const char *name;
+ switch (gimple_omp_target_kind (stmt))
+ {
+ case GF_OMP_TARGET_KIND_REGION: name = "target"; break;
+ case GF_OMP_TARGET_KIND_DATA: name = "target data"; break;
+ case GF_OMP_TARGET_KIND_UPDATE: name = "target update"; break;
+ default: gcc_unreachable ();
+ }
+ warning_at (gimple_location (stmt), 0,
+ "%s construct inside of target region", name);
+ }
+ break;
default:
break;
}
{
tree c = find_omp_clause (gimple_omp_for_clauses (ctx->stmt),
OMP_CLAUSE_SAFELEN);
- if (c
- && compare_tree_int (OMP_CLAUSE_SAFELEN_EXPR (c), max_vf) == -1)
+ if (c && TREE_CODE (OMP_CLAUSE_SAFELEN_EXPR (c)) != INTEGER_CST)
+ max_vf = 1;
+ else if (c && compare_tree_int (OMP_CLAUSE_SAFELEN_EXPR (c),
+ max_vf) == -1)
max_vf = tree_to_shwi (OMP_CLAUSE_SAFELEN_EXPR (c));
}
if (max_vf > 1)
return true;
}
+/* Helper function of lower_rec_input_clauses. For a reference
+ in simd reduction, add an underlying variable it will reference. */
+
+static void
+handle_simd_reference (location_t loc, tree new_vard, gimple_seq *ilist)
+{
+ tree z = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (new_vard)));
+ if (TREE_CONSTANT (z))
+ {
+ const char *name = NULL;
+ if (DECL_NAME (new_vard))
+ name = IDENTIFIER_POINTER (DECL_NAME (new_vard));
+
+ z = create_tmp_var_raw (TREE_TYPE (TREE_TYPE (new_vard)), name);
+ gimple_add_tmp_var (z);
+ TREE_ADDRESSABLE (z) = 1;
+ z = build_fold_addr_expr_loc (loc, z);
+ gimplify_assign (new_vard, z, ilist);
+ }
+}
+
/* Generate code to implement the input clauses, FIRSTPRIVATE and COPYIN,
from the receiver (aka child) side and initializers for REFERENCE_TYPE
private variables. Initialization statements go in ILIST, while calls
for (c = clauses; c ; c = OMP_CLAUSE_CHAIN (c))
switch (OMP_CLAUSE_CODE (c))
{
+ case OMP_CLAUSE_LINEAR:
+ if (OMP_CLAUSE_LINEAR_ARRAY (c))
+ max_vf = 1;
+ /* FALLTHRU */
case OMP_CLAUSE_REDUCTION:
case OMP_CLAUSE_PRIVATE:
case OMP_CLAUSE_FIRSTPRIVATE:
case OMP_CLAUSE_LASTPRIVATE:
- case OMP_CLAUSE_LINEAR:
if (is_variable_sized (OMP_CLAUSE_DECL (c)))
max_vf = 1;
break;
if (pass != 0)
continue;
}
+ /* Even without corresponding firstprivate, if
+ decl is Fortran allocatable, it needs outer var
+ reference. */
+ else if (pass == 0
+ && lang_hooks.decls.omp_private_outer_ref
+ (OMP_CLAUSE_DECL (c)))
+ lastprivate_firstprivate = true;
break;
case OMP_CLAUSE_ALIGNED:
if (pass == 0)
}
else if (TREE_CONSTANT (x))
{
- /* For reduction with placeholder in SIMD loop,
- defer adding the initialization of the reference,
- because if we decide to use SIMD array for it,
- the initilization could cause expansion ICE. */
- if (c_kind == OMP_CLAUSE_REDUCTION
- && OMP_CLAUSE_REDUCTION_PLACEHOLDER (c)
- && is_simd)
+ /* For reduction in SIMD loop, defer adding the
+ initialization of the reference, because if we decide
+ to use SIMD array for it, the initilization could cause
+ expansion ICE. */
+ if (c_kind == OMP_CLAUSE_REDUCTION && is_simd)
x = NULL_TREE;
else
{
if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LINEAR
&& gimple_omp_for_combined_into_p (ctx->stmt))
{
- tree stept = POINTER_TYPE_P (TREE_TYPE (x))
- ? sizetype : TREE_TYPE (x);
- tree t = fold_convert (stept,
- OMP_CLAUSE_LINEAR_STEP (c));
- tree c = find_omp_clause (clauses,
- OMP_CLAUSE__LOOPTEMP_);
- gcc_assert (c);
- tree l = OMP_CLAUSE_DECL (c);
- if (fd->collapse == 1)
- {
- tree n1 = fd->loop.n1;
- tree step = fd->loop.step;
- tree itype = TREE_TYPE (l);
- if (POINTER_TYPE_P (itype))
- itype = signed_type_for (itype);
- l = fold_build2 (MINUS_EXPR, itype, l, n1);
- if (TYPE_UNSIGNED (itype)
- && fd->loop.cond_code == GT_EXPR)
- l = fold_build2 (TRUNC_DIV_EXPR, itype,
- fold_build1 (NEGATE_EXPR,
- itype, l),
- fold_build1 (NEGATE_EXPR,
- itype, step));
- else
- l = fold_build2 (TRUNC_DIV_EXPR, itype, l, step);
- }
+ tree t = OMP_CLAUSE_LINEAR_STEP (c);
+ tree stept = TREE_TYPE (t);
+ tree ct = find_omp_clause (clauses,
+ OMP_CLAUSE__LOOPTEMP_);
+ gcc_assert (ct);
+ tree l = OMP_CLAUSE_DECL (ct);
+ tree n1 = fd->loop.n1;
+ tree step = fd->loop.step;
+ tree itype = TREE_TYPE (l);
+ if (POINTER_TYPE_P (itype))
+ itype = signed_type_for (itype);
+ l = fold_build2 (MINUS_EXPR, itype, l, n1);
+ if (TYPE_UNSIGNED (itype)
+ && fd->loop.cond_code == GT_EXPR)
+ l = fold_build2 (TRUNC_DIV_EXPR, itype,
+ fold_build1 (NEGATE_EXPR, itype, l),
+ fold_build1 (NEGATE_EXPR,
+ itype, step));
+ else
+ l = fold_build2 (TRUNC_DIV_EXPR, itype, l, step);
t = fold_build2 (MULT_EXPR, stept,
fold_convert (stept, l), t);
+
+ if (OMP_CLAUSE_LINEAR_ARRAY (c))
+ {
+ x = lang_hooks.decls.omp_clause_linear_ctor
+ (c, new_var, x, t);
+ gimplify_and_add (x, ilist);
+ goto do_dtor;
+ }
+
if (POINTER_TYPE_P (TREE_TYPE (x)))
x = fold_build2 (POINTER_PLUS_EXPR,
TREE_TYPE (x), x, t);
= gimple_build_assign (unshare_expr (lvar), iv);
gsi_insert_before_without_update (&gsi, g,
GSI_SAME_STMT);
- tree stept = POINTER_TYPE_P (TREE_TYPE (x))
- ? sizetype : TREE_TYPE (x);
- tree t = fold_convert (stept,
- OMP_CLAUSE_LINEAR_STEP (c));
+ tree t = OMP_CLAUSE_LINEAR_STEP (c);
enum tree_code code = PLUS_EXPR;
if (POINTER_TYPE_P (TREE_TYPE (new_var)))
code = POINTER_PLUS_EXPR;
But if they aren't used, we need to emit the deferred
initialization now. */
else if (is_reference (var) && is_simd)
- {
- tree z
- = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (new_vard)));
- if (TREE_CONSTANT (z))
- {
- const char *name = NULL;
- if (DECL_NAME (var))
- name = IDENTIFIER_POINTER (DECL_NAME (new_vard));
-
- z = create_tmp_var_raw
- (TREE_TYPE (TREE_TYPE (new_vard)), name);
- gimple_add_tmp_var (z);
- TREE_ADDRESSABLE (z) = 1;
- z = build_fold_addr_expr_loc (clause_loc, z);
- gimplify_assign (new_vard, z, ilist);
- }
- }
+ handle_simd_reference (clause_loc, new_vard, ilist);
x = lang_hooks.decls.omp_clause_default_ctor
- (c, new_var, unshare_expr (x));
+ (c, unshare_expr (new_var),
+ build_outer_var_ref (var, ctx));
if (x)
gimplify_and_add (x, ilist);
if (OMP_CLAUSE_REDUCTION_GIMPLE_INIT (c))
if (code == MINUS_EXPR)
code = PLUS_EXPR;
+ tree new_vard = new_var;
+ if (is_simd && is_reference (var))
+ {
+ gcc_assert (TREE_CODE (new_var) == MEM_REF);
+ new_vard = TREE_OPERAND (new_var, 0);
+ gcc_assert (DECL_P (new_vard));
+ }
if (is_simd
&& lower_rec_simd_input_clauses (new_var, ctx, max_vf,
idx, lane, ivar, lvar))
x = build2 (code, TREE_TYPE (ref), ref, ivar);
ref = build_outer_var_ref (var, ctx);
gimplify_assign (ref, x, &llist[1]);
+
+ if (new_vard != new_var)
+ {
+ SET_DECL_VALUE_EXPR (new_vard,
+ build_fold_addr_expr (lvar));
+ DECL_HAS_VALUE_EXPR_P (new_vard) = 1;
+ }
}
else
{
+ if (is_reference (var) && is_simd)
+ handle_simd_reference (clause_loc, new_vard, ilist);
gimplify_assign (new_var, x, ilist);
if (is_simd)
{
tree c = find_omp_clause (gimple_omp_for_clauses (ctx->stmt),
OMP_CLAUSE_SAFELEN);
if (c == NULL_TREE
- || compare_tree_int (OMP_CLAUSE_SAFELEN_EXPR (c),
- max_vf) == 1)
+ || (TREE_CODE (OMP_CLAUSE_SAFELEN_EXPR (c)) == INTEGER_CST
+ && compare_tree_int (OMP_CLAUSE_SAFELEN_EXPR (c),
+ max_vf) == 1))
{
c = build_omp_clause (UNKNOWN_LOCATION, OMP_CLAUSE_SAFELEN);
OMP_CLAUSE_SAFELEN_EXPR (c) = build_int_cst (integer_type_node,
OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c));
OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (c) = NULL;
}
+ else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LINEAR
+ && OMP_CLAUSE_LINEAR_GIMPLE_SEQ (c))
+ {
+ lower_omp (&OMP_CLAUSE_LINEAR_GIMPLE_SEQ (c), ctx);
+ gimple_seq_add_seq (stmt_list,
+ OMP_CLAUSE_LINEAR_GIMPLE_SEQ (c));
+ OMP_CLAUSE_LINEAR_GIMPLE_SEQ (c) = NULL;
+ }
x = build_outer_var_ref (var, ctx);
if (is_reference (var))
{
stmt = gimple_build_assign (endvar, iend);
gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING);
+ if (useless_type_conversion_p (TREE_TYPE (fd->loop.v), TREE_TYPE (iend)))
+ stmt = gimple_build_assign (fd->loop.v, iend);
+ else
+ stmt = gimple_build_assign_with_ops (NOP_EXPR, fd->loop.v, iend,
+ NULL_TREE);
+ gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING);
}
if (fd->collapse > 1)
expand_omp_for_init_vars (fd, &gsi, counts, inner_stmt, startvar);
{
stmt = gimple_build_assign (endvar, e);
gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING);
+ if (useless_type_conversion_p (TREE_TYPE (fd->loop.v), TREE_TYPE (e)))
+ stmt = gimple_build_assign (fd->loop.v, e);
+ else
+ stmt = gimple_build_assign_with_ops (NOP_EXPR, fd->loop.v, e,
+ NULL_TREE);
+ gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING);
}
if (fd->collapse > 1)
expand_omp_for_init_vars (fd, &gsi, counts, inner_stmt, startvar);
{
stmt = gimple_build_assign (endvar, e);
gsi_insert_after (&si, stmt, GSI_CONTINUE_LINKING);
+ if (useless_type_conversion_p (TREE_TYPE (fd->loop.v), TREE_TYPE (e)))
+ stmt = gimple_build_assign (fd->loop.v, e);
+ else
+ stmt = gimple_build_assign_with_ops (NOP_EXPR, fd->loop.v, e,
+ NULL_TREE);
+ gsi_insert_after (&si, stmt, GSI_CONTINUE_LINKING);
}
if (fd->collapse > 1)
expand_omp_for_init_vars (fd, &si, counts, inner_stmt, startvar);
else
{
safelen = OMP_CLAUSE_SAFELEN_EXPR (safelen);
- if (!tree_fits_uhwi_p (safelen)
- || tree_to_uhwi (safelen) > INT_MAX)
+ if (TREE_CODE (safelen) != INTEGER_CST)
+ loop->safelen = 0;
+ else if (!tree_fits_uhwi_p (safelen)
+ || tree_to_uhwi (safelen) > INT_MAX)
loop->safelen = INT_MAX;
else
loop->safelen = tree_to_uhwi (safelen);
&& gimple_code (ctx->outer->stmt) == GIMPLE_OMP_PARALLEL
&& ctx->outer->cancellable)
{
- tree lhs = create_tmp_var (boolean_type_node, NULL);
+ tree fndecl = builtin_decl_explicit (BUILT_IN_GOMP_CANCEL);
+ tree c_bool_type = TREE_TYPE (TREE_TYPE (fndecl));
+ tree lhs = create_tmp_var (c_bool_type, NULL);
gimple_omp_return_set_lhs (omp_return, lhs);
tree fallthru_label = create_artificial_label (UNKNOWN_LOCATION);
- gimple g = gimple_build_cond (NE_EXPR, lhs, boolean_false_node,
+ gimple g = gimple_build_cond (NE_EXPR, lhs,
+ fold_convert (c_bool_type,
+ boolean_false_node),
ctx->outer->cancel_label, fallthru_label);
gimple_seq_add_stmt (body, g);
gimple_seq_add_stmt (body, gimple_build_label (fallthru_label));
OMP_CLAUSE__LOOPTEMP_);
}
else
- temp = create_tmp_var (type, NULL);
+ {
+ temp = create_tmp_var (type, NULL);
+ insert_decl_map (&ctx->outer->cb, temp, temp);
+ }
*pc = build_omp_clause (UNKNOWN_LOCATION, OMP_CLAUSE__LOOPTEMP_);
OMP_CLAUSE_DECL (*pc) = temp;
pc = &OMP_CLAUSE_CHAIN (*pc);
}
break;
}
- tree lhs;
- lhs = create_tmp_var (boolean_type_node, NULL);
if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_GOMP_BARRIER)
{
fndecl = builtin_decl_explicit (BUILT_IN_GOMP_BARRIER_CANCEL);
gimple_call_set_fndecl (stmt, fndecl);
gimple_call_set_fntype (stmt, TREE_TYPE (fndecl));
}
+ tree lhs;
+ lhs = create_tmp_var (TREE_TYPE (TREE_TYPE (fndecl)), NULL);
gimple_call_set_lhs (stmt, lhs);
tree fallthru_label;
fallthru_label = create_artificial_label (UNKNOWN_LOCATION);
gimple g;
g = gimple_build_label (fallthru_label);
gsi_insert_after (gsi_p, g, GSI_SAME_STMT);
- g = gimple_build_cond (NE_EXPR, lhs, boolean_false_node,
+ g = gimple_build_cond (NE_EXPR, lhs,
+ fold_convert (TREE_TYPE (lhs),
+ boolean_false_node),
cctx->cancel_label, fallthru_label);
gsi_insert_after (gsi_p, g, GSI_SAME_STMT);
break;
ipa_simd_modify_stmt_ops (tree *tp, int *walk_subtrees, void *data)
{
struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
- if (!SSA_VAR_P (*tp))
+ struct modify_stmt_info *info = (struct modify_stmt_info *) wi->info;
+ tree *orig_tp = tp;
+ if (TREE_CODE (*tp) == ADDR_EXPR)
+ tp = &TREE_OPERAND (*tp, 0);
+ struct ipa_parm_adjustment *cand = NULL;
+ if (TREE_CODE (*tp) == PARM_DECL)
+ cand = ipa_get_adjustment_candidate (&tp, NULL, info->adjustments, true);
+ else
{
- /* Make sure we treat subtrees as a RHS. This makes sure that
- when examining the `*foo' in *foo=x, the `foo' get treated as
- a use properly. */
- wi->is_lhs = false;
- wi->val_only = true;
if (TYPE_P (*tp))
*walk_subtrees = 0;
- return NULL_TREE;
}
- struct modify_stmt_info *info = (struct modify_stmt_info *) wi->info;
- struct ipa_parm_adjustment *cand
- = ipa_get_adjustment_candidate (&tp, NULL, info->adjustments, true);
- if (!cand)
- return NULL_TREE;
- tree t = *tp;
- tree repl = make_ssa_name (TREE_TYPE (t), NULL);
-
- gimple stmt;
- gimple_stmt_iterator gsi = gsi_for_stmt (info->stmt);
- if (wi->is_lhs)
+ tree repl = NULL_TREE;
+ if (cand)
+ repl = unshare_expr (cand->new_decl);
+ else
{
- stmt = gimple_build_assign (unshare_expr (cand->new_decl), repl);
- gsi_insert_after (&gsi, stmt, GSI_SAME_STMT);
- SSA_NAME_DEF_STMT (repl) = info->stmt;
+ if (tp != orig_tp)
+ {
+ *walk_subtrees = 0;
+ bool modified = info->modified;
+ info->modified = false;
+ walk_tree (tp, ipa_simd_modify_stmt_ops, wi, wi->pset);
+ if (!info->modified)
+ {
+ info->modified = modified;
+ return NULL_TREE;
+ }
+ info->modified = modified;
+ repl = *tp;
+ }
+ else
+ return NULL_TREE;
}
- else
+
+ if (tp != orig_tp)
{
- /* You'd think we could skip the extra SSA variable when
- wi->val_only=true, but we may have `*var' which will get
- replaced into `*var_array[iter]' and will likely be something
- not gimple. */
- stmt = gimple_build_assign (repl, unshare_expr (cand->new_decl));
+ repl = build_fold_addr_expr (repl);
+ gimple stmt
+ = gimple_build_assign (make_ssa_name (TREE_TYPE (repl), NULL), repl);
+ repl = gimple_assign_lhs (stmt);
+ gimple_stmt_iterator gsi = gsi_for_stmt (info->stmt);
gsi_insert_before (&gsi, stmt, GSI_SAME_STMT);
+ *orig_tp = repl;
}
-
- if (!useless_type_conversion_p (TREE_TYPE (*tp), TREE_TYPE (repl)))
+ else if (!useless_type_conversion_p (TREE_TYPE (*tp), TREE_TYPE (repl)))
{
tree vce = build1 (VIEW_CONVERT_EXPR, TREE_TYPE (*tp), repl);
*tp = vce;
*tp = repl;
info->modified = true;
- wi->is_lhs = false;
- wi->val_only = true;
return NULL_TREE;
}
tree retval_array, tree iter)
{
basic_block bb;
- unsigned int i, j;
+ unsigned int i, j, l;
/* Re-use the adjustments array, but this time use it to replace
every function argument use to an offset into the corresponding
j += node->simdclone->simdlen / TYPE_VECTOR_SUBPARTS (vectype) - 1;
}
+ l = adjustments.length ();
+ for (i = 1; i < num_ssa_names; i++)
+ {
+ tree name = ssa_name (i);
+ if (name
+ && SSA_NAME_VAR (name)
+ && TREE_CODE (SSA_NAME_VAR (name)) == PARM_DECL)
+ {
+ for (j = 0; j < l; j++)
+ if (SSA_NAME_VAR (name) == adjustments[j].base
+ && adjustments[j].new_decl)
+ {
+ tree base_var;
+ if (adjustments[j].new_ssa_base == NULL_TREE)
+ {
+ base_var
+ = copy_var_decl (adjustments[j].base,
+ DECL_NAME (adjustments[j].base),
+ TREE_TYPE (adjustments[j].base));
+ adjustments[j].new_ssa_base = base_var;
+ }
+ else
+ base_var = adjustments[j].new_ssa_base;
+ if (SSA_NAME_IS_DEFAULT_DEF (name))
+ {
+ bb = single_succ (ENTRY_BLOCK_PTR_FOR_FN (cfun));
+ gimple_stmt_iterator gsi = gsi_after_labels (bb);
+ tree new_decl = unshare_expr (adjustments[j].new_decl);
+ set_ssa_default_def (cfun, adjustments[j].base, NULL_TREE);
+ SET_SSA_NAME_VAR_OR_IDENTIFIER (name, base_var);
+ SSA_NAME_IS_DEFAULT_DEF (name) = 0;
+ gimple stmt = gimple_build_assign (name, new_decl);
+ gsi_insert_before (&gsi, stmt, GSI_SAME_STMT);
+ }
+ else
+ SET_SSA_NAME_VAR_OR_IDENTIFIER (name, base_var);
+ }
+ }
+ }
+
struct modify_stmt_info info;
info.adjustments = adjustments;
{ OPT_LEVELS_1_PLUS, OPT_fguess_branch_probability, NULL, 1 },
{ OPT_LEVELS_1_PLUS, OPT_fcprop_registers, NULL, 1 },
{ OPT_LEVELS_1_PLUS, OPT_fforward_propagate, NULL, 1 },
- { OPT_LEVELS_1_PLUS, OPT_fif_conversion, NULL, 1 },
- { OPT_LEVELS_1_PLUS, OPT_fif_conversion2, NULL, 1 },
+ { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fif_conversion, NULL, 1 },
+ { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fif_conversion2, NULL, 1 },
{ OPT_LEVELS_1_PLUS, OPT_fipa_pure_const, NULL, 1 },
{ OPT_LEVELS_1_PLUS, OPT_fipa_reference, NULL, 1 },
{ OPT_LEVELS_1_PLUS, OPT_fipa_profile, NULL, 1 },
}
if (! found)
- warning_at (loc, 0,
- "unrecognized argument to -fsanitize= option: %q.*s",
- (int) len, p);
+ error_at (loc,
+ "unrecognized argument to -fsanitize= option: %q.*s",
+ (int) len, p);
if (comma == NULL)
break;
/* FIXME: Instrumentation we insert makes ipa-reference bitmaps
quadratic. Disable the pass until better memory representation
is done. */
- if (!opts_set->x_flag_ipa_reference && opts->x_in_lto_p)
+ if (!opts_set->x_flag_ipa_reference)
opts->x_flag_ipa_reference = false;
break;
break;
case OPT_g:
- /* -g by itself should force -g2. */
- if (*arg == '\0')
- set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, "2", opts, opts_set,
- loc);
- else
- set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, arg, opts, opts_set,
- loc);
+ set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, arg, opts, opts_set,
+ loc);
break;
case OPT_gcoff:
opts_set->x_write_symbols = type;
}
- /* A debug flag without a level defaults to level 2. */
+ /* A debug flag without a level defaults to level 2.
+ If off or at level 1, set it to level 2, but if already
+ at level 3, don't lower it. */
if (*arg == '\0')
{
- if (!opts->x_debug_info_level)
+ if (opts->x_debug_info_level < DINFO_LEVEL_NORMAL)
opts->x_debug_info_level = DINFO_LEVEL_NORMAL;
}
else
}
}
-/* Callback for do_per_function to apply all IPA transforms. */
-
-static void
-apply_ipa_transforms (void *data)
-{
- struct cgraph_node *node = cgraph_get_node (current_function_decl);
- if (!node->global.inlined_to && node->ipa_transforms_to_apply.exists ())
- {
- *(bool *)data = true;
- execute_all_ipa_transforms ();
- rebuild_cgraph_edges ();
- }
-}
-
/* Check if PASS is explicitly disabled or enabled and return
the gate status. FUNC is the function to be processed, and
GATE_STATUS is the gate status determined by pass manager by
Apply all trnasforms first. */
if (pass->type == SIMPLE_IPA_PASS)
{
+ struct cgraph_node *node;
bool applied = false;
- do_per_function (apply_ipa_transforms, (void *)&applied);
+ FOR_EACH_DEFINED_FUNCTION (node)
+ if (node->analyzed
+ && cgraph_function_with_gimple_body_p (node)
+ && (!node->clone_of || node->decl != node->clone_of->decl))
+ {
+ if (!node->global.inlined_to
+ && node->ipa_transforms_to_apply.exists ())
+ {
+ cgraph_get_body (node);
+ push_cfun (DECL_STRUCT_FUNCTION (node->decl));
+ execute_all_ipa_transforms ();
+ rebuild_cgraph_edges ();
+ free_dominance_info (CDI_DOMINATORS);
+ free_dominance_info (CDI_POST_DOMINATORS);
+ pop_cfun ();
+ applied = true;
+ }
+ }
if (applied)
symtab_remove_unreachable_nodes (true, dump_file);
/* Restore current_pass. */
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
+2014-05-14 Joseph Myers <joseph@codesourcery.com>
+
+ * zh_CN.po: Update.
+
+2014-05-01 Joseph Myers <joseph@codesourcery.com>
+
+ * sv.po: Update.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
"Project-Id-Version: gcc 4.9-b20140202\n"
"Report-Msgid-Bugs-To: http://gcc.gnu.org/bugs.html\n"
"POT-Creation-Date: 2014-02-02 17:35+0000\n"
-"PO-Revision-Date: 2014-03-30 20:23+0200\n"
+"PO-Revision-Date: 2014-04-11 20:56+0200\n"
"Last-Translator: Göran Uddeborg <goeran@uddeborg.se>\n"
"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
"Language: sv\n"
#: cif-code.def:125
msgid "callee refers to comdat-local symbols"
-msgstr "den anropade referarar till comdat-lokala symboler"
+msgstr "den anropade refererar till comdat-lokala symboler"
#. The remainder are real diagnostic types.
#: diagnostic.def:33
#: c-family/c.opt:653
msgid "Warn about __TIME__, __DATE__ and __TIMESTAMP__ usage"
-msgstr "Warn för använding av __TIME__, __DATE__ och __TIMESTAMP__"
+msgstr "Varna för användning av __TIME__, __DATE__ och __TIMESTAMP__"
#: c-family/c.opt:657
msgid "Warn if a property for an Objective-C object has no assign semantics specified"
#: common.opt:811
msgid "Aggressively optimize loops using language constraints"
-msgstr "Optimera aggresivt slingor med användning av språkbegränsningar"
+msgstr "Optimera aggressivt slingor med användning av språkbegränsningar"
#: common.opt:815
msgid "Align the start of functions"
#: common.opt:2332
msgid "Enables the dynamic vectorizer cost model. Preserved for backward compatibility."
-msgstr "Aktivera den dynamiska kostnadsmodellen för vekoriseraren. Bevarad för bakåtkompatibilitet."
+msgstr "Aktivera den dynamiska kostnadsmodellen för vektoriseraren. Bevarad för bakåtkompatibilitet."
#: common.opt:2336
msgid "Enables the unlimited vectorizer cost model. Preserved for backward compatibility."
#: c/c-array-notation.c:721 cp/cp-array-notation.c:610
#, gcc-internal-format
msgid "rank mismatch between %qE and %qE"
-msgstr "ordingen stämmer inte mellan %qE och %qE"
+msgstr "ordningen stämmer inte mellan %qE och %qE"
#. Here the original expression is printed as a "heads-up"
#. to the programmer. This is because since there is no
msgid "too much stack space to dispose of: %d"
msgstr "för mycket stackutrymme att göra av med: %d"
-# Förmodligen en felstavning i orginalet, men tills jag vet säkert
+# Förmodligen en felstavning i originalet, men tills jag vet säkert
# behåller jag den
#: config/v850/v850.c:2788
#, gcc-internal-format, gfc-internal-format
#: c/c-parser.c:6884
#, gcc-internal-format
msgid "%<_Generic%> selector of type %qT is not compatible with any association"
-msgstr "%<_Generic%>-väljare av typ %qT är inte kompatiblem med någon association"
+msgstr "%<_Generic%>-väljare av typ %qT är inte kompatibel med någon association"
#: c/c-parser.c:7039 c/c-parser.c:7519 c/c-parser.c:7538
#, gcc-internal-format
#: c/c-parser.c:7505 cp/parser.c:5807
#, gcc-internal-format
msgid "consecutive %<_Cilk_spawn%> keywords are not permitted"
-msgstr "konsektiva %<_Cilk_spawn%>-nyckelord är inte tillåtet"
+msgstr "konsekutiva %<_Cilk_spawn%>-nyckelord är inte tillåtet"
#: c/c-parser.c:7573
#, gcc-internal-format
#: cp/cp-array-notation.c:849 cp/cp-array-notation.c:855
#, gcc-internal-format
msgid "rank mismatch with controlling expression of parent if-statement"
-msgstr "ordingen stämmer inte med det styrande uttrycket i förälder-if-satsen"
+msgstr "ordningen stämmer inte med det styrande uttrycket i förälder-if-satsen"
#: cp/cp-array-notation.c:1250
#, gcc-internal-format
#: cp/cp-array-notation.c:1422
#, gcc-internal-format
msgid "array notation cannot be used with function type"
-msgstr "vektornotation kan inte användas användas med en funktionstyp"
+msgstr "vektornotation kan inte användas med en funktionstyp"
#: cp/cp-array-notation.c:1432
#, gcc-internal-format
#: cp/cp-array-notation.c:1438
#, gcc-internal-format
msgid "rank of an array notation triplet%'s length is not zero"
-msgstr "ordingen på en vektornotations trippels längd är inte noll"
+msgstr "ordningen på en vektornotations trippels längd är inte noll"
#: cp/cp-array-notation.c:1443
#, gcc-internal-format
#: cp/cvt.c:1659
#, gcc-internal-format
msgid "ambiguous default type conversion from %qT"
-msgstr "tvetydig standartypkonvertering från %qT"
+msgstr "tvetydig standardtypkonvertering från %qT"
#: cp/cvt.c:1661
#, gcc-internal-format
#: cp/decl.c:14531 cp/decl2.c:4673
#, gcc-internal-format
msgid "use of %qD before deduction of %<auto%>"
-msgstr "använding av %qD före härledning av %<auto%>"
+msgstr "användning av %qD före härledning av %<auto%>"
#: cp/decl2.c:322
#, gcc-internal-format
#: cp/parser.c:14516
#, gcc-internal-format
msgid "use of %<auto%> in parameter declaration only available with -std=c++1y or -std=gnu++1y"
-msgstr "använding av %<auto%> i parameterdeklarationer är endast tillgängligt med -std=c++1y eller -std=gnu++1y"
+msgstr "användning av %<auto%> i parameterdeklarationer är endast tillgängligt med -std=c++1y eller -std=gnu++1y"
#: cp/parser.c:14521
#, gcc-internal-format
#: cp/pt.c:4861
#, gcc-internal-format
msgid "template arguments to %qD do not match original template %qD"
-msgstr "mallargument till %qD stämmer inte med orginalmallen %qD"
+msgstr "mallargument till %qD stämmer inte med originalmallen %qD"
#: cp/pt.c:4865
#, gcc-internal-format
#: cp/semantics.c:3800
#, gcc-internal-format
msgid "second operand of %<offsetof%> is neither a single identifier nor a sequence of member accesses and array references"
-msgstr "andra operanden till %<offsetof%> är varken en ensam idientifierare eller en sekvens av medlemsåtkomster och vektorreferenser"
+msgstr "andra operanden till %<offsetof%> är varken en ensam identifierare eller en sekvens av medlemsåtkomster och vektorreferenser"
#: cp/semantics.c:3808
#, gcc-internal-format
#: fortran/resolve.c:13229
#, gcc-internal-format, gfc-internal-format
msgid "Variable '%s' at %L with coarray component shall be a nonpointer, nonallocatable scalar, which is not a coarray"
-msgstr "Variabeln ”%s” vid %L med co-vektorkomponent skall vara en skalär som inte är en pekare eller allokerbar och inte en co-vaktor"
+msgstr "Variabeln ”%s” vid %L med co-vektorkomponent skall vara en skalär som inte är en pekare eller allokerbar och inte en co-vektor"
#: fortran/resolve.c:13244
#, gcc-internal-format, gfc-internal-format
#: lto/lto-symtab.c:404
#, gcc-internal-format
msgid "type of %qD does not match original declaration"
-msgstr "typen på %qD stämmer inte med orginaldeklarationen"
+msgstr "typen på %qD stämmer inte med originaldeklarationen"
#: lto/lto-symtab.c:412
#, gcc-internal-format
msgid "alignment of %qD is bigger than original declaration"
-msgstr "justering av %qD är större än orginaldeklarationen"
+msgstr "justering av %qD är större än originaldeklarationen"
#: lto/lto-symtab.c:418 lto/lto-symtab.c:517
#, gcc-internal-format
# Simplified Chinese translation for gcc.
# Copyright (C) 2005 Free Software Foundation, Inc.
# This file is distributed under the same license as the gcc package.
-# Meng Jie <zuxy.meng@gmail.com>, 2005-2011.
+# Meng Jie <zuxy.meng@gmail.com>, 2005-2014.
#
msgid ""
msgstr ""
-"Project-Id-Version: gcc 4.6.0\n"
+"Project-Id-Version: gcc 4.9-b20140202\n"
"Report-Msgid-Bugs-To: http://gcc.gnu.org/bugs.html\n"
"POT-Creation-Date: 2014-02-02 17:35+0000\n"
-"PO-Revision-Date: 2011-05-19 15:04+0800\n"
+"PO-Revision-Date: 2014-05-14 14:25-0800\n"
"Last-Translator: Meng Jie <zuxy.meng@gmail.com>\n"
"Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n"
"Language: zh_CN\n"
#: collect2.c:1578
#, fuzzy, c-format
-#| msgid "collect2 version %s"
msgid "collect2 version %s\n"
msgstr "collect2 版本 %s"
#: diagnostic.c:170
#, fuzzy, c-format
-#| msgid "%s: all warnings being treated as errors\n"
msgid "%s: all warnings being treated as errors"
msgstr "%s:所有的警告都被当作是错误\n"
#: diagnostic.c:175
#, fuzzy, c-format
-#| msgid "%s: some warnings being treated as errors\n"
msgid "%s: some warnings being treated as errors"
msgstr "%s:有些警告被当作是错误\n"
#: diagnostic.c:479
#, fuzzy, c-format
-#| msgid ""
-#| "Please submit a full bug report,\n"
-#| "with preprocessed source if appropriate.\n"
-#| "See %s for instructions.\n"
msgid ""
"Please submit a full bug report,\n"
"with preprocessed source if appropriate.\n"
#: diagnostic.c:485
#, fuzzy, c-format
-#| msgid "Use fp double instructions"
msgid "See %s for instructions.\n"
msgstr "使用浮点双精度指令"
#: gcc.c:3073
#, fuzzy
-#| msgid " --help={target|optimizers|warnings|params|[^]{joined|separate|undocumented}}[,...]\n"
msgid " --help={common|optimizers|params|target|warnings|[^]{joined|separate|undocumented}}[,...]\n"
msgstr " --help={target|optimizers|warnings|params|[^]{joined|separate|undocumented}}[,...]\n"
#: gcc.c:3085
#, fuzzy
-#| msgid ""
-#| " -print-multi-lib Display the mapping between command line options and\n"
-#| " multiple library search directories\n"
msgid ""
" -print-multiarch Display the target's normalized GNU triplet, used as\n"
" a component in the library path\n"
#: gcc.c:3120
#, fuzzy
-#| msgid "Create a position independent executable"
msgid " -pie Create a position independent executable\n"
msgstr "生成位置无关可执行文件"
#: gcc.c:3121
#, fuzzy
-#| msgid "Create a shared library"
msgid " -shared Create a shared library\n"
msgstr "生成一个共享库"
#: gcc.c:5402
#, fuzzy, c-format
-#| msgid "Processing spec %c%s%c, which is '%s'\n"
msgid "Processing spec (%s), which is '%s'\n"
msgstr "处理 spec %c%s%c,即‘%s’\n"
#: gcov.c:472
#, fuzzy, c-format
-#| msgid ""
-#| "Usage: gcov [OPTION]... SOURCEFILE...\n"
-#| "\n"
msgid ""
"Usage: gcov [OPTION]... SOURCE|OBJ...\n"
"\n"
#: gcov.c:477
#, fuzzy, c-format
-#| msgid ""
-#| " -c, --branch-counts Given counts of branches taken\n"
-#| " rather than percentages\n"
msgid ""
" -c, --branch-counts Output counts of branches taken\n"
" rather than percentages\n"
#: gcov.c:488
#, fuzzy, c-format
-#| msgid " -a, --all-blocks Show information for every basic block\n"
msgid " -r, --relative-only Only show data for relative sources\n"
msgstr " -a, --all-blocks 显示每个基本块的信息\n"
#: gcov.c:794
#, fuzzy, c-format
-#| msgid "%s:creating '%s'\n"
msgid "Creating '%s'\n"
msgstr "%s:正在创建‘%s’\n"
#: gcov.c:797
#, fuzzy, c-format
-#| msgid "%s:error writing output file '%s'\n"
msgid "Error writing output file '%s'\n"
msgstr "%s:写入输出文件‘%s’时出错\n"
#: gcov.c:801
#, fuzzy, c-format
-#| msgid "%s:could not open output file '%s'\n"
msgid "Could not open output file '%s'\n"
msgstr "%s:不能打开输出文件‘%s’\n"
#: gcov.c:806
#, fuzzy, c-format
-#| msgid "[Leaving %s]\n"
msgid "Removing '%s'\n"
msgstr "[离开 %s]\n"
#: gcov.c:856
#, fuzzy, c-format
-#| msgid "%s: Cannot open output file: %s\n"
msgid "Cannot open intermediate output file %s\n"
msgstr "%s:无法打开输出文件:%s\n"
#: gcov.c:1139
#, fuzzy, c-format
-#| msgid "%s:source file is newer than graph file '%s'\n"
msgid "%s:source file is newer than notes file '%s'\n"
msgstr "%s:源文件较图文件‘%s’新\n"
#: gcov.c:1169
#, fuzzy, c-format
-#| msgid "%s:cannot open source file\n"
msgid "%s:cannot open notes file\n"
msgstr "%s:无法打开源文件\n"
#: gcov.c:1175
#, fuzzy, c-format
-#| msgid "%s:not a gcov data file\n"
msgid "%s:not a gcov notes file\n"
msgstr "%s:不是一个 gcov 数据文件\n"
#: gcov.c:1417
#, fuzzy, c-format
-#| msgid "%s:stamp mismatch with graph file\n"
msgid "%s:stamp mismatch with notes file\n"
msgstr "%s:时间戳与图文件不匹配\n"
#: gcov.c:2424
#, fuzzy, c-format
-#| msgid "%s:cannot open source file\n"
msgid "Cannot open source file %s\n"
msgstr "%s:无法打开源文件\n"
#: langhooks.c:456 cp/error.c:3131
#, fuzzy
-#| msgid " inlined from %qs at %s:%d:%d"
msgid " inlined from %qs at %r%s:%d:%d%R"
msgstr " 内联自%qs于 %s:%d:%d"
#: langhooks.c:461 cp/error.c:3136
#, fuzzy
-#| msgid " inlined from %qs at %s:%d"
msgid " inlined from %qs at %r%s:%d%R"
msgstr " 内联自%qs于 %s:%d"
#: cif-code.def:43
#, fuzzy
-#| msgid "%qE is not initialized"
msgid "caller is not optimized"
msgstr "%qE未经初始化"
#: cif-code.def:60
#, fuzzy
-#| msgid "function body can be overwriten at linktime"
msgid "function body can be overwritten at link time"
msgstr "函数体可能在链接时被改写"
#: cif-code.def:113
#, fuzzy
-#| msgid "Enable exception handling"
msgid "non-call exception handling mismatch"
msgstr "启用异常处理"
#: params.def:117
#, fuzzy
-#| msgid "Probability that COMDAT function will be shared with different compilatoin unit"
msgid "Probability that COMDAT function will be shared with different compilation unit"
msgstr "与其他编译单元共享 COMDAT 函数的概率"
#: params.def:175
#, fuzzy
-#| msgid "The maximum number of instructions to consider to unroll in a loop"
msgid "The maximum number of backtrack attempts the scheduler should make when modulo scheduling a loop"
msgstr "单个循环中考虑展开的最大指令数"
#: params.def:300
#, fuzzy
-#| msgid "The maximum number of iterations through CFG to extend regions"
msgid "The maximum number of branches on the path through the peeled sequence"
msgstr "通过 CFG 以扩展区域的最大循环次数"
#: params.def:980
#, fuzzy
-#| msgid "Maximum number of times that an insn could be scheduled"
msgid "Maximum number of conditional store pairs that can be sunk"
msgstr "指定一条指令最多能被调度几次"
#: params.def:1006
#, fuzzy
-#| msgid "Allow branches to be packed with other instructions"
msgid "Allow new data races on packed data loads to be introduced"
msgstr "允许跳转与其他指令打包在一起"
#: params.def:1011
#, fuzzy
-#| msgid "Allow branches to be packed with other instructions"
msgid "Allow new data races on packed data stores to be introduced"
msgstr "允许跳转与其他指令打包在一起"
#: params.def:1054
#, fuzzy
-#| msgid "Enable stack probing"
msgid "Enable asan stack protection"
msgstr "启用堆栈探测"
#: params.def:1059
#, fuzzy
-#| msgid "Enable all optional instructions"
msgid "Enable asan globals protection"
msgstr "启用所有可选指令"
#: params.def:1064
#, fuzzy
-#| msgid "Enable saturation instructions"
msgid "Enable asan store operations protection"
msgstr "启用饱和指令"
#: params.def:1069
#, fuzzy
-#| msgid "Enable all optional instructions"
msgid "Enable asan load operations protection"
msgstr "启用所有可选指令"
#: params.def:1074 params.def:1079
#, fuzzy
-#| msgid "Enable saturation instructions"
msgid "Enable asan builtin functions protection"
msgstr "启用饱和指令"
#: config/aarch64/aarch64.c:3487 config/arm/arm.c:21114 config/arm/arm.c:21127
#: config/nios2/nios2.c:1885
#, fuzzy, c-format
-#| msgid "invalid operand for code '%c'"
msgid "Unsupported operand for code '%c'"
msgstr "代码‘%c’的操作数无效"
#: config/aarch64/aarch64.c:3551 config/aarch64/aarch64.c:3567
#: config/aarch64/aarch64.c:3586 config/aarch64/aarch64.c:3625
#, fuzzy, c-format
-#| msgid "invalid operand for code '%c'"
msgid "invalid operand for '%%%c'"
msgstr "代码‘%c’的操作数无效"
#: config/aarch64/aarch64.c:3724
#, fuzzy, c-format
-#| msgid "invalid insn:"
msgid "invalid constant"
msgstr "无效指令:"
#: config/aarch64/aarch64.c:3727
#, fuzzy, c-format
-#| msgid "invalid %%d operand"
msgid "invalid operand"
msgstr "无效的 %%d 操作数"
#: config/aarch64/aarch64.c:3815
#, fuzzy, c-format
-#| msgid "invalid operand code '%c'"
msgid "invalid operand prefix '%%%c'"
msgstr "无效的操作数代码‘%c’"
#: config/arc/arc.c:2782
#, fuzzy, c-format
-#| msgid "invalid operand to %%R code"
msgid "invalid operand to %%Z code"
msgstr "%%R 代码的操作数无效"
#: config/arc/arc.c:2790
#, fuzzy, c-format
-#| msgid "invalid operand to %%R code"
msgid "invalid operand to %%z code"
msgstr "%%R 代码的操作数无效"
#: config/arc/arc.c:2798
#, fuzzy, c-format
-#| msgid "invalid operand to %%R code"
msgid "invalid operand to %%M code"
msgstr "%%R 代码的操作数无效"
#: config/arc/arc.c:3099
#, fuzzy, c-format
-#| msgid "invalid operand to %%R code"
msgid "invalid operand to %%O code"
msgstr "%%R 代码的操作数无效"
#: config/arc/arc.c:4676
#, fuzzy, c-format
-#| msgid "invalid UNSPEC as operand"
msgid "invalid UNSPEC as operand: %d"
msgstr "无效的 UNSPEC 用作操作数"
#: config/avr/avr.c:2140
#, fuzzy
-#| msgid "output operand %d must use %<&%> constraint"
msgid "operands to %T/%t must be reg + const_int:"
msgstr "输出操作数 %d 必须使用%<&%>约束"
#: config/avr/avr.c:2180 config/avr/avr.c:2235
#, fuzzy
-#| msgid "bad address, not (reg+disp):"
msgid "bad address, not an I/O address:"
msgstr "地址错误,不是(reg+disp):"
#: config/avr/avr.c:2189
#, fuzzy
-#| msgid "bad address, not a constant):"
msgid "bad address, not a constant:"
msgstr "错误的地址,不是一个常量):"
#: config/avr/avr.c:7100
#, fuzzy
-#| msgid "invalid types in fixed-point conversion"
msgid "unsupported fixed-point conversion"
msgstr "整点转换中类型无效"
#: config/i386/i386.c:14839
#, fuzzy, c-format
-#| msgid "invalid operand size for operand code '%c'"
msgid "invalid operand size for operand code 'O'"
msgstr "操作数代码‘%c’的操作数大小无效"
#: config/i386/i386.c:14874
#, fuzzy, c-format
-#| msgid "invalid operand size for operand code '%c'"
msgid "invalid operand size for operand code 'z'"
msgstr "操作数代码‘%c’的操作数大小无效"
#: config/i386/i386.c:14944
#, fuzzy, c-format
-#| msgid "invalid operand type used with operand code '%c'"
msgid "invalid operand type used with operand code 'Z'"
msgstr "操作数代码‘%c’的操作数类型无效"
#: config/i386/i386.c:14949
#, fuzzy, c-format
-#| msgid "invalid operand size for operand code '%c'"
msgid "invalid operand size for operand code 'Z'"
msgstr "操作数代码‘%c’的操作数大小无效"
#: config/i386/i386.c:15115
#, fuzzy, c-format
-#| msgid "operand is not a condition code, invalid operand code 'D'"
msgid "operand is not a condition code, invalid operand code '%c'"
msgstr "操作数不是一个条件码,无效的操作数代码‘D’"
#: config/i386/i386.c:15128
#, fuzzy, c-format
-#| msgid "operand is not a condition code, invalid operand code 'D'"
msgid "operand is not an offsettable memory reference, invalid operand code 'H'"
msgstr "操作数不是一个条件码,无效的操作数代码‘D’"
#: config/i386/i386-interix.h:78
#, fuzzy
-#| msgid "Use native (MS) bitfield layout"
msgid "Use gcc default bitfield layout"
msgstr "使用本地 (MS) 位段存储方式"
#: config/msp430/msp430.c:2130
#, fuzzy, c-format
-#| msgid "invalid reference prefix"
msgid "invalid operand prefix"
msgstr "无效的引用前缀"
#: config/rs6000/rs6000.c:3363
#, fuzzy
-#| msgid "--resource requires -o"
msgid "-mquad-memory requires 64-bit mode"
msgstr "--resource 需要 -o"
#: config/rs6000/rs6000.c:3378
#, fuzzy
-#| msgid "Generate code in little endian mode"
msgid "-mquad-memory is not available in little endian mode"
msgstr "生成小端在前的代码"
#: config/rs6000/rs6000.c:32382
#, fuzzy
-#| msgid "Do not generate a single exit point for each function"
msgid "Could not generate addis value for fusion"
msgstr "不为每个函数生成单一的退出点"
#: config/rs6000/rs6000.c:32441
#, fuzzy
-#| msgid "unable to generate reloads for:"
msgid "Unable to generate load offset for fusion"
msgstr "无法生成重新载入,为:"
#: config/sparc/sparc.c:8830 config/tilegx/tilegx.c:5061
#: config/tilepro/tilepro.c:4516
#, fuzzy, c-format
-#| msgid "invalid %%P operand"
msgid "invalid %%C operand"
msgstr "无效的 %%P 操作数"
#: config/sparc/sparc.c:8847 config/tilegx/tilegx.c:5094
#, fuzzy, c-format
-#| msgid "invalid %%P operand"
msgid "invalid %%D operand"
msgstr "无效的 %%P 操作数"
#: config/tilegx/tilegx.c:5174
#, fuzzy, c-format
-#| msgid "invalid %%L code"
msgid "invalid %%H specifier"
msgstr "无效 %%L 代码"
#: config/tilegx/tilegx.c:5216 config/tilepro/tilepro.c:4530
#, fuzzy, c-format
-#| msgid "invalid %%P operand"
msgid "invalid %%h operand"
msgstr "无效的 %%P 操作数"
#: config/tilegx/tilegx.c:5228 config/tilepro/tilepro.c:4594
#, fuzzy, c-format
-#| msgid "invalid %%P operand"
msgid "invalid %%I operand"
msgstr "无效的 %%P 操作数"
#: config/tilegx/tilegx.c:5242 config/tilepro/tilepro.c:4608
#, fuzzy, c-format
-#| msgid "invalid %%P operand"
msgid "invalid %%i operand"
msgstr "无效的 %%P 操作数"
#: config/tilegx/tilegx.c:5265 config/tilepro/tilepro.c:4631
#, fuzzy, c-format
-#| msgid "invalid %%P operand"
msgid "invalid %%j operand"
msgstr "无效的 %%P 操作数"
#: config/tilegx/tilegx.c:5296
#, fuzzy, c-format
-#| msgid "invalid %%c operand"
msgid "invalid %%%c operand"
msgstr "无效的 %%c 操作数"
#: config/tilegx/tilegx.c:5311 config/tilepro/tilepro.c:4745
#, fuzzy, c-format
-#| msgid "invalid %%P operand"
msgid "invalid %%N operand"
msgstr "无效的 %%P 操作数"
#: config/tilegx/tilegx.c:5355
#, fuzzy, c-format
-#| msgid "invalid operand for 'b' modifier"
msgid "invalid operand for 'r' specifier"
msgstr "‘b’修饰符的操作数无效"
#: config/tilepro/tilepro.c:4566
#, fuzzy, c-format
-#| msgid "invalid %%P operand"
msgid "invalid %%H operand"
msgstr "无效的 %%P 操作数"
#: config/tilepro/tilepro.c:4670
#, fuzzy, c-format
-#| msgid "invalid %%P operand"
msgid "invalid %%L operand"
msgstr "无效的 %%P 操作数"
#: config/tilepro/tilepro.c:4730
#, fuzzy, c-format
-#| msgid "invalid %%P operand"
msgid "invalid %%M operand"
msgstr "无效的 %%P 操作数"
#: config/tilepro/tilepro.c:4773
#, fuzzy, c-format
-#| msgid "invalid %%P operand"
msgid "invalid %%t operand"
msgstr "无效的 %%P 操作数"
#: config/tilepro/tilepro.c:4780
#, fuzzy, c-format
-#| msgid "invalid %%P operand"
msgid "invalid %%t operand '"
msgstr "无效的 %%P 操作数"
#: config/tilepro/tilepro.c:4801
#, fuzzy, c-format
-#| msgid "invalid %%P operand"
msgid "invalid %%r operand"
msgstr "无效的 %%P 操作数"
#: cp/error.c:1060
#, fuzzy
-#| msgid "(anonymous)"
msgid "(anonymous namespace)"
msgstr "(匿名)"
#: cp/error.c:1169
#, fuzzy
-#| msgid "<template parameter error>"
msgid "<template arguments error>"
msgstr "<模板参数数错误>"
#: cp/error.c:2616
#, fuzzy
-#| msgid "<lambda"
msgid "<lambda>"
msgstr "<lambda"
#: cp/error.c:3196
#, fuzzy, c-format
-#| msgid "%s: In instantiation of %qs:\n"
msgid "%s: In substitution of %qS:\n"
msgstr "%s:在%qs的实例化中:\n"
#: cp/error.c:3197
#, fuzzy
-#| msgid "%s: In instantiation of %qs:\n"
msgid "%s: In instantiation of %q#D:\n"
msgstr "%s:在%qs的实例化中:\n"
#: cp/error.c:3240
#, fuzzy
-#| msgid "provided for %q+D"
msgid "required from %q#D\n"
msgstr "提供给%q+D"
#: cp/error.c:3248
#, fuzzy
-#| msgid "called from here"
msgid "required from here"
msgstr "从此处调用"
#: cp/error.c:3300
#, fuzzy
-#| msgid "%s:%d:%d: [ skipping %d instantiation contexts ]\n"
msgid "%r%s:%d:%d:%R [ skipping %d instantiation contexts, use -ftemplate-backtrace-limit=0 to disable ]\n"
msgstr "%s:%d:%d:[ 跳过 %d 个实例化上下文 ]\n"
#: cp/error.c:3306
#, fuzzy
-#| msgid "%s:%d:%d: [ skipping %d instantiation contexts ]\n"
msgid "%r%s:%d:%R [ skipping %d instantiation contexts, use -ftemplate-backtrace-limit=0 to disable ]\n"
msgstr "%s:%d:%d:[ 跳过 %d 个实例化上下文 ]\n"
#: cp/error.c:3371
#, fuzzy
-#| msgid "%s:%d:%d: in constexpr expansion of %qs"
msgid "%r%s:%d:%d:%R in constexpr expansion of %qs"
msgstr "%s:%d:%d:在%qs的广义常表达式扩展中"
#: cp/error.c:3375
#, fuzzy
-#| msgid "%s:%d: in constexpr expansion of %qs"
msgid "%r%s:%d:%R in constexpr expansion of %qs"
msgstr "%s:%d:在%qs的广义常表达式扩展中"
#: fortran/error.c:899
#, fuzzy
-#| msgid "Obsolescent feature: Computed GOTO at %C"
msgid "Obsolescent feature:"
msgstr "已过时的特性:%C处的计算转移 GOTO 语句"
#: fortran/error.c:902
#, fuzzy
-#| msgid "expected operator"
msgid "Deleted feature:"
msgstr "需要操作符"
#: fortran/resolve.c:2225
#, fuzzy
-#| msgid "no arguments"
msgid "allocatable argument"
msgstr "没有参数"
#: fortran/resolve.c:2230
#, fuzzy
-#| msgid "not enough arguments"
msgid "asynchronous argument"
msgstr "实参太少"
#: fortran/resolve.c:2235
#, fuzzy
-#| msgid "invalid PHI argument"
msgid "optional argument"
msgstr "无效的 PHI 实参"
#: fortran/resolve.c:2240
#, fuzzy
-#| msgid "pointer assignment"
msgid "pointer argument"
msgstr "指针赋值"
#: fortran/resolve.c:2245
#, fuzzy
-#| msgid "no arguments"
msgid "target argument"
msgstr "没有参数"
#: fortran/resolve.c:2250
#, fuzzy
-#| msgid "invalid PHI argument"
msgid "value argument"
msgstr "无效的 PHI 实参"
#: fortran/resolve.c:2255
#, fuzzy
-#| msgid "no arguments"
msgid "volatile argument"
msgstr "没有参数"
#: fortran/resolve.c:2260
#, fuzzy
-#| msgid "mismatched arguments"
msgid "assumed-shape argument"
msgstr "参数不匹配"
#: fortran/resolve.c:2265
#, fuzzy
-#| msgid "mismatched arguments"
msgid "assumed-rank argument"
msgstr "参数不匹配"
#: fortran/resolve.c:2270
#, fuzzy
-#| msgid "array assignment"
msgid "coarray argument"
msgstr "数组赋值"
#: fortran/resolve.c:2280
#, fuzzy
-#| msgid "no arguments"
msgid "polymorphic argument"
msgstr "没有参数"
#. See also TS 29113, Note 6.1.
#: fortran/resolve.c:2292
#, fuzzy
-#| msgid "mismatched arguments"
msgid "assumed-type argument"
msgstr "参数不匹配"
#: fortran/resolve.c:2315
#, fuzzy
-#| msgid "'%s' at %L must have constant character length in this context"
msgid "result with non-constant character length"
msgstr "变量‘%s’在%L处上下文中字符长度必须为常量"
#: fortran/resolve.c:2327
#, fuzzy
-#| msgid "module procedure"
msgid "bind(c) procedure"
msgstr "模块过程"
#: fortran/trans-intrinsic.c:6165
#, fuzzy, c-format
-#| msgid "Argument NCOPIES of REPEAT intrinsic is negative (its value is %lld)"
msgid "Argument NCOPIES of REPEAT intrinsic is negative (its value is %ld)"
msgstr "内建函数 REPEAT 的 NCOPIES 参数为负(其值是 %lld)"
#: go/go-backend.c:171
#, fuzzy
-#| msgid "Memory allocation failed"
msgid "memory allocation failed while reading export data"
msgstr "内存分配失败"
#: ada/gcc-interface/lang-specs.h:52
#, fuzzy
-#| msgid "-c or -S required for Ada"
msgid "-c required for gnat2why"
msgstr "Ada 需要指定 -c 或 -S"
#: ada/gcc-interface/lang-specs.h:65
#, fuzzy
-#| msgid "-c or -S required for Ada"
msgid "-c required for gnat2scil"
msgstr "Ada 需要指定 -c 或 -S"
#: config/avr/avr.h:526
#, fuzzy
-#| msgid "-fpic is not supported"
msgid "shared is not supported"
msgstr "不支持 -fpic"
#: config/rx/rx.h:76
#, fuzzy
-#| msgid "rx200 cpu does not have FPU hardware"
msgid "rx100 cpu does not have FPU hardware"
msgstr "RX200 CPU 没有 FPU 硬件"
#: config/rs6000/freebsd64.h:161 config/rs6000/freebsd64.h:173
#, fuzzy
-#| msgid "consider using `-pg' instead of `-p' with gprof(1) "
msgid "consider using `-pg' instead of `-p' with gprof(1)"
msgstr "与 gprof(1) 一起使用时请考虑使用‘-pg’以代替‘-p’"
#: gcc.c:731
#, fuzzy
-#| msgid "-fdirectives-only is incompatible with -traditional"
msgid "-fsanitize=address is incompatible with -fsanitize=thread"
msgstr "-fdirectives-only 与 -traditional 不兼容"
#: config/arm/arm.h:217
#, fuzzy
-#| msgid "-msoft-float and -mhard_float may not be used together"
msgid "-mfloat-abi=soft and -mfloat-abi=hard may not be used together"
msgstr "-msoft-float 和 -mhard_float 不能一起使用"
#: fortran/lang.opt:242
#, fuzzy
-#| msgid "Warn about implicit function declarations"
msgid "Warn about function call elimination"
msgstr "对隐式函数声明给出警告"
#: fortran/lang.opt:270
#, fuzzy
-#| msgid "Warn when a register variable is declared volatile"
msgid "Warn when a left-hand-side array variable is reallocated"
msgstr "当一个寄存器变量被声明为 volatile 时给出警告"
#: fortran/lang.opt:274
#, fuzzy
-#| msgid "Warn when a register variable is declared volatile"
msgid "Warn when a left-hand-side variable is reallocated"
msgstr "当一个寄存器变量被声明为 volatile 时给出警告"
#: fortran/lang.opt:306
#, fuzzy
-#| msgid "Warn about zero-length formats"
msgid "Warn about zero-trip DO loops"
msgstr "对长度为 0 的格式字符串给出警告"
#: fortran/lang.opt:458
#, fuzzy
-#| msgid "-ffpe-trap=[...]\tStop on following floating point exceptions"
msgid "-ffpe-summary=[...]\tPrint summary of floating point exceptions"
msgstr "-ffpe-trap=[...]\t在以下浮点异常的情况下停止"
#: fortran/lang.opt:474
#, fuzzy
-#| msgid "Enable linker optimizations"
msgid "Enable front end optimization"
msgstr "启用链接器优化"
#: fortran/lang.opt:670
#, fuzzy
-#| msgid "Conform to the ISO Fortran 2008 standard"
msgid "Conform to the ISO Fortran 2008 standard including TS 29113"
msgstr "遵循 ISO Fortran 2008 标准"
#: c-family/c.opt:296
#, fuzzy
-#| msgid "Deprecated in favor of -std=c99"
msgid "Deprecated in favor of -Wc++11-compat"
msgstr "不建议使用,请改用 -std=c99"
#: c-family/c.opt:300
#, fuzzy
-#| msgid "Warn about C++ constructs whose meaning differs between ISO C++ 1998 and ISO C++ 200x"
msgid "Warn about C++ constructs whose meaning differs between ISO C++ 1998 and ISO C++ 2011"
msgstr "当 C++ 构造的意义在 ISO C++ 1998 和 ISO C++ 200x 中不同时给出警告"
#: c-family/c.opt:344
#, fuzzy
-#| msgid "dereferencing pointer to incomplete type"
msgid "Warn when deleting a pointer to incomplete type"
msgstr "提领指向不完全类型的指针"
#: c-family/c.opt:348
#, fuzzy
-#| msgid "Warn about non-virtual destructors"
msgid "Warn about deleting polymorphic objects with non-virtual destructors"
msgstr "当析构函数不是虚函数时给出警告"
#: c-family/c.opt:392
#, fuzzy
-#| msgid "Warn for implicit type conversions that may change a value"
msgid "Warn for implicit type conversions that cause loss of floating point precision"
msgstr "当隐式类型转换可能改变值时给出警告"
#: c-family/c.opt:673
#, fuzzy
-#| msgid "returning reference to temporary"
msgid "Warn about returning a pointer/reference to a local or temporary variable."
msgstr "返回临时变量的引用"
#: c-family/c.opt:777
#, fuzzy
-#| msgid "Warn about macros defined in the main file that are not used"
msgid "Warn when typedefs locally defined in a function are not used"
msgstr "当定义在主文件中的宏未被使用时给出警告"
#: c-family/c.opt:789
#, fuzzy
-#| msgid "Do not warn about using variadic macros when -pedantic"
msgid "Warn about using variadic macros"
msgstr "指定 -pedantic 时不为可变参数宏给出警告"
#: c-family/c.opt:813
#, fuzzy
-#| msgid "Warn when a label is unused"
msgid "Warn when a literal '0' is used as null pointer"
msgstr "有未使用的标号时警告"
#: c-family/c.opt:817
#, fuzzy
-#| msgid "Warn about misuses of pragmas"
msgid "Warn about useless casts"
msgstr "对错误使用的 pragma 加以警告"
#: c-family/c.opt:883
#, fuzzy
-#| msgid "-ftemplate-depth=<number>\tSpecify maximum template instantiation depth"
msgid "-fconstexpr-depth=<number>\tSpecify maximum constexpr recursion depth"
msgstr "-ftemplate-depth=<N>\t指定模板实例化的最大深度"
#: c-family/c.opt:887
#, fuzzy
-#| msgid "Enable traditional preprocessing"
msgid "Emit debug annotations during preprocessing"
msgstr "启用传统预处理"
#: c-family/c.opt:891
#, fuzzy
-#| msgid "-fno-deduce-init-list\tdisable deduction of std::initializer_list for a template type parameter from a brace-enclosed initializer-list"
msgid "-fdeduce-init-list\tenable deduction of std::initializer_list for a template type parameter from a brace-enclosed initializer-list"
msgstr "-fno-deduce-init-list\t禁用为模板类型参数从花括号中的初始值设定列表演绎 std::initializer_list"
#: c-family/c.opt:895
#, fuzzy
-#| msgid "Warn when all constructors and destructors are private"
msgid "Factor complex constructors and destructors to favor space over speed"
msgstr "当所有构造函数和析构函数都是私有时给出警告"
#: c-family/c.opt:1090
#, fuzzy
-#| msgid "Unclassifiable OpenMP directive at %C"
msgid "Enable OpenMP's SIMD directives"
msgstr "%C处的 OpenMP 指示无法分类"
#: c-family/c.opt:1183
#, fuzzy
-#| msgid "The maximum number of peelings of a single loop"
msgid "Set the maximum number of template instantiation notes for a single warning or error"
msgstr "单个循环最大的剥离数"
#: c-family/c.opt:1217
#, fuzzy
-#| msgid "Marks all inlined methods as having hidden visibility"
msgid "Marks all inlined functions and methods as having hidden visibility"
msgstr "将所有内联函数标记为具有隐藏的可见性"
#: c-family/c.opt:1344 c-family/c.opt:1348
#, fuzzy
-#| msgid "Conform to the ISO 1998 C++ standard with GNU extensions"
msgid "Conform to the ISO 1998 C++ standard revised by the 2003 technical corrigendum"
msgstr "遵循 ISO 1998 C++ 标准,也支持 GNU 扩展"
#: c-family/c.opt:1352
#, fuzzy
-#| msgid "Conform to the ISO 201X C standard draft (experimental and incomplete support)"
msgid "Conform to the ISO 2011 C++ standard (experimental and incomplete support)"
msgstr "遵循 ISO 201X C 标准草案(试验性质的不完全支持)"
#: c-family/c.opt:1356
#, fuzzy
-#| msgid "Deprecated in favor of -std=c99"
msgid "Deprecated in favor of -std=c++11"
msgstr "不建议使用,请改用 -std=c99"
#: c-family/c.opt:1360
#, fuzzy
-#| msgid "Conform to the ISO 201X C standard draft (experimental and incomplete support)"
msgid "Conform to the ISO 201y(7?) C++ draft standard (experimental and incomplete support)"
msgstr "遵循 ISO 201X C 标准草案(试验性质的不完全支持)"
#: c-family/c.opt:1364 c-family/c.opt:1450
#, fuzzy
-#| msgid "Conform to the ISO 201X C standard draft (experimental and incomplete support)"
msgid "Conform to the ISO 2011 C standard (experimental and incomplete support)"
msgstr "遵循 ISO 201X C 标准草案(试验性质的不完全支持)"
#: c-family/c.opt:1368
#, fuzzy
-#| msgid "Deprecated in favor of -std=c99"
msgid "Deprecated in favor of -std=c11"
msgstr "不建议使用,请改用 -std=c99"
#: c-family/c.opt:1388 c-family/c.opt:1393
#, fuzzy
-#| msgid "Conform to the ISO 1998 C++ standard with GNU extensions"
msgid "Conform to the ISO 1998 C++ standard revised by the 2003 technical"
msgstr "遵循 ISO 1998 C++ 标准,也支持 GNU 扩展"
#: c-family/c.opt:1398
#, fuzzy
-#| msgid "Conform to the ISO 201X C standard draft with GNU extensions (experimental and incomplete support)"
msgid "Conform to the ISO 2011 C++ standard with GNU extensions (experimental and incomplete support)"
msgstr "遵循 ISO 201X C 标准草案和 GNU 扩展(试验性质的不完全支持)"
#: c-family/c.opt:1402
#, fuzzy
-#| msgid "Deprecated in favor of -std=gnu99"
msgid "Deprecated in favor of -std=gnu++11"
msgstr "不建议使用,请改用 -std=gnu99"
#: c-family/c.opt:1406
#, fuzzy
-#| msgid "Conform to the ISO 201X C standard draft with GNU extensions (experimental and incomplete support)"
msgid "Conform to the ISO 201y(7?) C++ draft standard with GNU extensions (experimental and incomplete support)"
msgstr "遵循 ISO 201X C 标准草案和 GNU 扩展(试验性质的不完全支持)"
#: c-family/c.opt:1410
#, fuzzy
-#| msgid "Conform to the ISO 201X C standard draft with GNU extensions (experimental and incomplete support)"
msgid "Conform to the ISO 2011 C standard with GNU extensions (experimental and incomplete support)"
msgstr "遵循 ISO 201X C 标准草案和 GNU 扩展(试验性质的不完全支持)"
#: c-family/c.opt:1414
#, fuzzy
-#| msgid "Deprecated in favor of -std=gnu99"
msgid "Deprecated in favor of -std=gnu11"
msgstr "不建议使用,请改用 -std=gnu99"
#: ada/gcc-interface/lang.opt:61
#, fuzzy
-#| msgid "Synonym for -Wcomment"
msgid "Synonym of -gnatk8"
msgstr "-Wcomment 的同义词"
#: ada/gcc-interface/lang.opt:73
#, fuzzy
-#| msgid "Select code model"
msgid "Select the runtime"
msgstr "选择代码模型"
#: config/vms/vms.opt:42
#, fuzzy, c-format
-#| msgid "unknown TLS model %qs"
msgid "unknown pointer size model %qs"
msgstr "未知的 TLS 模型%qs"
#: config/aarch64/aarch64.opt:68
#, fuzzy
-#| msgid "Generate code which uses hardware floating point instructions"
msgid "Generate code which uses only the general registers"
msgstr "生成使用硬件浮点指令的代码"
#: config/aarch64/aarch64.opt:76
#, fuzzy
-#| msgid "Select code model"
msgid "Specify the code model"
msgstr "选择代码模型"
#: config/aarch64/aarch64.opt:92
#, fuzzy
-#| msgid "-mcpu=\tUse features of and schedule code for given CPU"
msgid "-march=ARCH\tUse features of architecture ARCH"
msgstr "-mcpu=\t使用指定 CPU 的特性和调度代码"
#: config/aarch64/aarch64.opt:96
#, fuzzy
-#| msgid "-mcpu=\tUse features of and schedule code for given CPU"
msgid "-mcpu=CPU\tUse features of and optimize for CPU"
msgstr "-mcpu=\t使用指定 CPU 的特性和调度代码"
#: config/aarch64/aarch64.opt:104
#, fuzzy
-#| msgid "-mabi=ABI\tGenerate code that conforms to the given ABI"
msgid "-mabi=ABI\tGenerate code that conforms to the specified ABI"
msgstr "-mabi=ABI\t生成遵循给定 ABI 的代码"
#: config/epiphany/epiphany.opt:32
#, fuzzy
-#| msgid "Relax branches"
msgid "Set branch cost"
msgstr "放宽跳转"
#: config/epiphany/epiphany.opt:36
#, fuzzy
-#| msgid "Enable all optional instructions"
msgid "enable conditional move instruction usage."
msgstr "启用所有可选指令"
#: config/epiphany/epiphany.opt:40
#, fuzzy
-#| msgid "The number of insns executed before prefetch is completed"
msgid "set number of nops to emit before each insn pattern"
msgstr "预取操作完成前执行指令的数目"
#: config/epiphany/epiphany.opt:52
#, fuzzy
-#| msgid "Use software floating point"
msgid "Use software floating point comparisons"
msgstr "使用软件浮点单元"
#: config/epiphany/epiphany.opt:76
#, fuzzy
-#| msgid "Generate call insns as indirect calls, if necessary"
msgid "Generate call insns as indirect calls"
msgstr "如有必须,为调用指令生成间接调用"
#: config/epiphany/epiphany.opt:80
#, fuzzy
-#| msgid "Generate call insns as indirect calls, if necessary"
msgid "Generate call insns as direct calls"
msgstr "如有必须,为调用指令生成间接调用"
#: config/epiphany/epiphany.opt:112
#, fuzzy
-#| msgid "Use structs on stronger alignment for double-word copies"
msgid "Vectorize for double-word operations."
msgstr "为结构使用更强的对齐以使用双字复制"
#: config/epiphany/epiphany.opt:132
#, fuzzy
-#| msgid "Use hardware floating point conversion instructions"
msgid "Use the floating point unit for integer add/subtract."
msgstr "使用浮点转换指令"
#: config/i386/i386.opt:190
#, fuzzy
-#| msgid "Use 128-bit long double"
msgid "Use 80-bit long double"
msgstr "使用 128 位 long double"
#: config/i386/i386.opt:271
#, fuzzy
-#| msgid "Use given x86-64 code model"
msgid "Use given address mode"
msgstr "使用给定的 x86-64 代码模式"
#: config/i386/i386.opt:369
#, fuzzy
-#| msgid "Set 80387 floating-point precision (-mpc32, -mpc64, -mpc80)"
msgid "Set 80387 floating-point precision to 32-bit"
msgstr "设定 80387 浮点精度(-mpc32、-mpc64、-mpc80)"
#: config/i386/i386.opt:373
#, fuzzy
-#| msgid "Set 80387 floating-point precision (-mpc32, -mpc64, -mpc80)"
msgid "Set 80387 floating-point precision to 64-bit"
msgstr "设定 80387 浮点精度(-mpc32、-mpc64、-mpc80)"
#: config/i386/i386.opt:377
#, fuzzy
-#| msgid "Set 80387 floating-point precision (-mpc32, -mpc64, -mpc80)"
msgid "Set 80387 floating-point precision to 80-bit"
msgstr "设定 80387 浮点精度(-mpc32、-mpc64、-mpc80)"
#: config/i386/i386.opt:433
#, fuzzy
-#| msgid "bad value (%s) for %sstringop-strategy=%s %s"
msgid "Valid arguments to -mstringop-strategy=:"
msgstr "%2$sstringop-strategy=%3$s %4$s所带参数(%1$s)不正确"
#: config/i386/i386.opt:543
#, fuzzy
-#| msgid "Do dispatch scheduling if processor is bdver1 and Haifa scheduling"
msgid "Do dispatch scheduling if processor is bdver1 or bdver2 or bdver3 or bdver4 and Haifa scheduling"
msgstr "进行海法调度,当处理器是 bdver1 时也进行派遣调度"
#: config/i386/i386.opt:562
#, fuzzy
-#| msgid "Generate 64bit x86-64 code"
msgid "Generate 32bit x86-64 code"
msgstr "生成 64 位 x86-64 代码"
#: config/i386/i386.opt:566
#, fuzzy
-#| msgid "Generate 32bit i386 code"
msgid "Generate 16bit i386 code"
msgstr "生成 32 位 i386 代码"
#: config/i386/i386.opt:622
#, fuzzy
-#| msgid "Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX and FMA built-in functions and code generation"
msgid "Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX and AVX2 built-in functions and code generation"
msgstr "支持 MMX、SSE、SSE2、SSE3、SSSE3、SSE4.1、SSE4.2、AVX 和 FMA 内建函数及代码生成"
#: config/i386/i386.opt:626
#, fuzzy
-#| msgid "Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX and FMA built-in functions and code generation"
msgid "Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2 and AVX512F built-in functions and code generation"
msgstr "支持 MMX、SSE、SSE2、SSE3、SSSE3、SSE4.1、SSE4.2、AVX 和 FMA 内建函数及代码生成"
#: config/i386/i386.opt:630
#, fuzzy
-#| msgid "Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX and FMA built-in functions and code generation"
msgid "Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2 and AVX512F and AVX512PF built-in functions and code generation"
msgstr "支持 MMX、SSE、SSE2、SSE3、SSSE3、SSE4.1、SSE4.2、AVX 和 FMA 内建函数及代码生成"
#: config/i386/i386.opt:634
#, fuzzy
-#| msgid "Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX and FMA built-in functions and code generation"
msgid "Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2 and AVX512F and AVX512ER built-in functions and code generation"
msgstr "支持 MMX、SSE、SSE2、SSE3、SSSE3、SSE4.1、SSE4.2、AVX 和 FMA 内建函数及代码生成"
#: config/i386/i386.opt:638
#, fuzzy
-#| msgid "Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX and FMA built-in functions and code generation"
msgid "Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2 and AVX512F and AVX512CD built-in functions and code generation"
msgstr "支持 MMX、SSE、SSE2、SSE3、SSSE3、SSE4.1、SSE4.2、AVX 和 FMA 内建函数及代码生成"
#: config/i386/i386.opt:674
#, fuzzy
-#| msgid "Support BMI built-in functions and code generation"
msgid "Support BMI2 built-in functions and code generation"
msgstr "支持 BMI 内建函数及代码生成"
#: config/i386/i386.opt:678
#, fuzzy
-#| msgid "Support TBM built-in functions and code generation"
msgid "Support LZCNT built-in function and code generation"
msgstr "支持 TBM 内建函数及代码生成"
#: config/i386/i386.opt:686
#, fuzzy
-#| msgid "Use SmartMIPS instructions"
msgid "Support RDSEED instruction"
msgstr "使用 SmartMIPS 指令"
#: config/i386/i386.opt:694
#, fuzzy
-#| msgid "Support code generation of crc32 instruction."
msgid "Support flag-preserving add-carry instructions"
msgstr "支持生成 crc32 指令。"
#: config/i386/i386.opt:702
#, fuzzy
-#| msgid "Support calls between Thumb and ARM instruction sets"
msgid "Support XSAVE and XRSTOR instructions"
msgstr "支持 Thumb 和 ARM 指令集间互相调用g"
#: config/i386/i386.opt:706
#, fuzzy
-#| msgid "Support MMX built-in functions"
msgid "Support XSAVEOPT instruction"
msgstr "支持 MMX 内建函数"
#: config/i386/i386.opt:734
#, fuzzy
-#| msgid "Support MMX and SSE built-in functions and code generation"
msgid "Support SHA1 and SHA256 built-in functions and code generation"
msgstr "支持 MMX 和 SSE 内建函数及代码生成"
#: config/i386/i386.opt:774
#, fuzzy
-#| msgid "Support TBM built-in functions and code generation"
msgid "Support RTM built-in functions and code generation"
msgstr "支持 TBM 内建函数及代码生成"
#: config/i386/i386.opt:778
#, fuzzy
-#| msgid "Use propolice as a stack protection method"
msgid "Use given stack-protector guard"
msgstr "使用 propolice 来保护堆栈"
#: config/v850/v850.opt:41
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the callt instruction (default)"
msgstr "不使用 callt 指令"
#: config/v850/v850.opt:117
#, fuzzy
-#| msgid "Compile for the v850e processor"
msgid "Compile for the v850e3v5 processor"
msgstr "为 v850e 处理器编译"
#: config/v850/v850.opt:124
#, fuzzy
-#| msgid "Enable clip instructions"
msgid "Enable v850e3v5 loop instructions"
msgstr "启用 clip 指令"
#: config/v850/v850.opt:135
#, fuzzy
-#| msgid "Enable the rank heuristic in the scheduler"
msgid "Enable relaxing in the assembler"
msgstr "在调度器中启用秩启发"
#: config/v850/v850.opt:139
#, fuzzy
-#| msgid "Prohibit PC relative function calls"
msgid "Prohibit PC relative jumps"
msgstr "禁止相对 PC 的函数调用"
#: config/v850/v850.opt:143
#, fuzzy
-#| msgid "Prevent the use of all hardware floating-point instructions"
msgid "Inhibit the use of hardware floating point instructions"
msgstr "不允许使用任何硬件浮点指令"
#: config/v850/v850.opt:147
#, fuzzy
-#| msgid "Allow the use of hardware floating-point ABI and instructions"
msgid "Allow the use of hardware floating point instructions for V850E2V3 and up"
msgstr "允许使用硬件浮点 ABI 和指令"
#: config/v850/v850.opt:151
#, fuzzy
-#| msgid "Enable the use of RX FPU instructions. This is the default."
msgid "Enable support for the RH850 ABI. This is the default"
msgstr "启用使用 RX FPU 指令。这是默认值。"
#: config/v850/v850.opt:155
#, fuzzy
-#| msgid "Enable support for huge objects"
msgid "Enable support for the old GCC ABI"
msgstr "启用对巨型对象的支持"
#: config/cr16/cr16.opt:23
#, fuzzy
-#| msgid "-msim\tUse simulator runtime"
msgid "-msim Use simulator runtime"
msgstr "-msim\t使用仿真器运行时"
#: config/cr16/cr16.opt:27
#, fuzzy
-#| msgid "Generate bit instructions"
msgid "Generate SBIT, CBIT instructions"
msgstr "生成位指令"
#: config/cr16/cr16.opt:42
#, fuzzy
-#| msgid "Generate code for a cpu32"
msgid "Generate code for CR16C architecture"
msgstr "为 cpu32 生成代码"
#: config/cr16/cr16.opt:46
#, fuzzy
-#| msgid "Generate code for GNU assembler (gas)"
msgid "Generate code for CR16C+ architecture (Default)"
msgstr "为 GNU 汇编器(gas)生成代码"
#: config/cr16/cr16.opt:50
#, fuzzy
-#| msgid "Pointers are 32-bit"
msgid "Treat integers as 32-bit."
msgstr "指针是 32 位"
#: config/avr/avr.opt:80
#, fuzzy
-#| msgid "taking the address of a label is non-standard"
msgid "Warn if the address space of an address is changed."
msgstr "取标号的地址不符合标准"
#: config/s390/s390.opt:117
#, fuzzy
-#| msgid "Use hardware floating point instructions"
msgid "Use hardware transactional execution instructions"
msgstr "使用硬件浮点指令"
#: config/s390/s390.opt:167 config/rs6000/rs6000.opt:470
#, fuzzy
-#| msgid "Use ROM instead of RAM"
msgid "Use LRA instead of reload"
msgstr "使用 ROM 而不是 RAM"
#: config/rl78/rl78.opt:47
#, fuzzy
-#| msgid "Specifies the number of registers to reserve for interrupt handlers."
msgid "Use all registers, reserving none for interrupt handlers."
msgstr "指定保留给中断处理函数使用的寄存器的数量"
#: config/rl78/rl78.opt:55
#, fuzzy
-#| msgid "Target the AM33/2.0 processor"
msgid "Target the RL78/G10 series"
msgstr "目标为 AM33/2.0 处理器"
#: config/arm/arm.opt:90
#, fuzzy
-#| msgid "Generate code for 32 bit addressing"
msgid "Generate code in 32 bit ARM state."
msgstr "为 32 位寻址生成代码"
#: config/arm/arm.opt:131
#, fuzzy
-#| msgid "invalid __fp16 format option: -mfp16-format=%s"
msgid "Known __fp16 formats (for use with the -mfp16-format= option):"
msgstr "无效的 __fp16 浮点选项:-mfp16-format=%s"
#: config/arm/arm.opt:163
#, fuzzy
-#| msgid "Assume arguments alias no other storage"
msgid "Assume data segments are relative to text segment."
msgstr "假定实参不与其他存储重叠"
#: config/arm/arm.opt:190
#, fuzzy
-#| msgid "Generate code for GNU as"
msgid "Generate code for Thumb state"
msgstr "为 GNU as 生成代码"
#: config/arm/arm.opt:198
#, fuzzy
-#| msgid "Use given thread-local storage dialect"
msgid "Specify thread local storage scheme"
msgstr "使用给定的线程局部存储模式"
#: config/arm/arm.opt:236
#, fuzzy
-#| msgid "Assume big endian bytes, little endian words"
msgid "Assume big endian bytes, little endian words. This option is deprecated."
msgstr "假定高位字节在前,低位字在前"
#: config/arm/arm.opt:244
#, fuzzy
-#| msgid "Use Neon quad-word (rather than double-word) registers for vectorization"
msgid "Use Neon double-word (rather than quad-word) registers for vectorization"
msgstr "使用 Neon 四字(而非双字)寄存器来进行向量化"
#: config/sparc/sparc.opt:42
#, fuzzy
-#| msgid "Use alternate register names"
msgid "Use flat register window model"
msgstr "使用另一套寄存器名"
#: config/sparc/sparc.opt:66
#, fuzzy
-#| msgid "Use UltraSPARC Visual Instruction Set extensions"
msgid "Use UltraSPARC Visual Instruction Set version 1.0 extensions"
msgstr "使用 UltraSPARC 可视化指令集"
#: config/sparc/sparc.opt:70
#, fuzzy
-#| msgid "Use UltraSPARC Visual Instruction Set extensions"
msgid "Use UltraSPARC Visual Instruction Set version 2.0 extensions"
msgstr "使用 UltraSPARC 可视化指令集"
#: config/sparc/sparc.opt:74
#, fuzzy
-#| msgid "Use UltraSPARC Visual Instruction Set extensions"
msgid "Use UltraSPARC Visual Instruction Set version 3.0 extensions"
msgstr "使用 UltraSPARC 可视化指令集"
#: config/sparc/sparc.opt:78
#, fuzzy
-#| msgid "Use UltraSPARC Visual Instruction Set extensions"
msgid "Use UltraSPARC Compare-and-Branch extensions"
msgstr "使用 UltraSPARC 可视化指令集"
#: config/sparc/sparc.opt:82
#, fuzzy
-#| msgid "Use UltraSPARC Visual Instruction Set extensions"
msgid "Use UltraSPARC Fused Multiply-Add extensions"
msgstr "使用 UltraSPARC 可视化指令集"
#: config/sparc/sparc.opt:86
#, fuzzy
-#| msgid "Use hardware floating point instructions"
msgid "Use UltraSPARC Population-Count instruction"
msgstr "使用硬件浮点指令"
#: config/sparc/sparc.opt:196
#, fuzzy
-#| msgid "-mdebug=\tEnable debug output"
msgid "Enable debug output"
msgstr "-mdebug=\t启用调试输出"
#: config/rs6000/rs6000.opt:145
#, fuzzy
-#| msgid "Generate code in little endian mode"
msgid "Generate Altivec instructions using little-endian element order"
msgstr "生成小端在前的代码"
#: config/rs6000/rs6000.opt:149
#, fuzzy
-#| msgid "Generate VRSAVE instructions when generating AltiVec code"
msgid "Generate Altivec instructions using big-endian element order"
msgstr "生成 AltiVec 代码时生成 VRSAVE 指令"
#: config/rs6000/rs6000.opt:322
#, fuzzy
-#| msgid "-mvrsave=yes/no\tDeprecated option. Use -mvrsave/-mno-vrsave instead"
msgid "Deprecated option. Use -mno-vrsave instead"
msgstr "-mvrsave=yes/no\t不建议使用的选项。请改用 -mvrsave/-mno-vrsave"
#: config/rs6000/rs6000.opt:326
#, fuzzy
-#| msgid "Deprecated. Use -Os instead"
msgid "Deprecated option. Use -mvrsave instead"
msgstr "不建议使用。请改用 -Os"
#: config/rs6000/rs6000.opt:338
#, fuzzy
-#| msgid "-misel=yes/no\tDeprecated option. Use -misel/-mno-isel instead"
msgid "Deprecated option. Use -mno-isel instead"
msgstr "-misel=yes/no\t不建议使用的选项。请改用 -misel/-mno-isel"
#: config/rs6000/rs6000.opt:342
#, fuzzy
-#| msgid "Deprecated. Use -Os instead"
msgid "Deprecated option. Use -misel instead"
msgstr "不建议使用。请改用 -Os"
#: config/rs6000/rs6000.opt:354
#, fuzzy
-#| msgid "-mspe=yes/no\tDeprecated option. Use -mspe/-mno-spe instead"
msgid "Deprecated option. Use -mno-spe instead"
msgstr "-mspe=yes/no\t不建议使用的选项。请改用 -mspe/-mno-spe"
#: config/rs6000/rs6000.opt:358
#, fuzzy
-#| msgid "Deprecated. Use -Os instead"
msgid "Deprecated option. Use -mspe instead"
msgstr "不建议使用。请改用 -Os"
#: config/rs6000/rs6000.opt:366
#, fuzzy
-#| msgid "Use the Cray Pointer extension"
msgid "Use the AltiVec ABI extensions"
msgstr "使用 Cray 指针扩展"
#: config/rs6000/rs6000.opt:370
#, fuzzy
-#| msgid "Do not use the bit-field instructions"
msgid "Do not use the AltiVec ABI extensions"
msgstr "不使用位段指令"
#: config/rs6000/rs6000.opt:374
#, fuzzy
-#| msgid "Use the Cray Pointer extension"
msgid "Use the SPE ABI extensions"
msgstr "使用 Cray 指针扩展"
#: config/rs6000/rs6000.opt:378
#, fuzzy
-#| msgid "Do not use the bit-field instructions"
msgid "Do not use the SPE ABI extensions"
msgstr "不使用位段指令"
#: config/rs6000/rs6000.opt:382
#, fuzzy
-#| msgid "Use EABI"
msgid "Use the ELFv1 ABI"
msgstr "使用 EABI"
#: config/rs6000/rs6000.opt:386
#, fuzzy
-#| msgid "Use EABI"
msgid "Use the ELFv2 ABI"
msgstr "使用 EABI"
#: config/rs6000/rs6000.opt:554
#, fuzzy
-#| msgid "Align destination of the string operations"
msgid "Allow sign extension in fusion operations"
msgstr "对齐字符串操作的目标"
#: config/rs6000/rs6000.opt:562
#, fuzzy
-#| msgid "Use SmartMIPS instructions"
msgid "Use ISA 2.07 crypto instructions"
msgstr "使用 SmartMIPS 指令"
#: config/rs6000/rs6000.opt:570
#, fuzzy
-#| msgid "Use vector/scalar (VSX) instructions"
msgid "Use ISA 2.07 transactional memory (HTM) instructions"
msgstr "使用向量/标量(VSX)指令"
#: config/rs6000/rs6000.opt:574
#, fuzzy
-#| msgid "Generate load/store multiple instructions"
msgid "Generate the quad word memory instructions (lq/stq)."
msgstr "生成加载/存储乘法指令"
#: config/tilepro/tilepro.opt:28 config/tilegx/tilegx.opt:26
#, fuzzy
-#| msgid "-mcpu=\tUse features of and schedule code for given CPU"
msgid "-mcpu=CPU\tUse features of and schedule code for given CPU"
msgstr "-mcpu=\t使用指定 CPU 的特性和调度代码"
#: config/nios2/elf.opt:26
#, fuzzy
-#| msgid "Link with the fast floating-point library"
msgid "Link with a limited version of the C library"
msgstr "与快速浮点库链接"
#: config/nios2/nios2.opt:39
#, fuzzy
-#| msgid "Enable clip instructions"
msgid "Enable MUL instructions"
msgstr "启用 clip 指令"
#: config/nios2/nios2.opt:47
#, fuzzy
-#| msgid "Use the software emulation for divides (default)"
msgid "Use table based fast divide (default at -O3)"
msgstr "使用软件模拟除法(默认)"
#: config/nios2/nios2.opt:51
#, fuzzy
-#| msgid "Enable unaligned load/store instruction"
msgid "All memory accesses use I/O load/store instructions"
msgstr "启用不对齐的载入/存储指令"
#: config/nios2/nios2.opt:55
#, fuzzy
-#| msgid "Enable unaligned load/store instruction"
msgid "Volatile memory accesses use I/O load/store instructions"
msgstr "启用不对齐的载入/存储指令"
#: config/nios2/nios2.opt:79
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the ftruncds custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:87
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fextsd custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:95
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fixdu custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:99
#, fuzzy
-#| msgid "Enable divide and modulus instructions"
msgid "Integer id (N) of fixdu custom instruction"
msgstr "启用除法和求余指令"
#: config/nios2/nios2.opt:103
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fixdi custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:111
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fixsu custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:119
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fixsi custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:127
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the floatud custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:131
#, fuzzy
-#| msgid "Enable unaligned load/store instruction"
msgid "Integer id (N) of floatud custom instruction"
msgstr "启用不对齐的载入/存储指令"
#: config/nios2/nios2.opt:135
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the floatid custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:139
#, fuzzy
-#| msgid "Enable unaligned load/store instruction"
msgid "Integer id (N) of floatid custom instruction"
msgstr "启用不对齐的载入/存储指令"
#: config/nios2/nios2.opt:143
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the floatus custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:151
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the floatis custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:159
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fcmpned custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:167
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fcmpeqd custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:175
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fcmpged custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:183
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fcmpgtd custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:191
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fcmpled custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:199
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fcmpltd custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:207
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the flogd custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:215
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fexpd custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:223
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fatand custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:231
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the ftand custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:235
#, fuzzy
-#| msgid "Enable divide and modulus instructions"
msgid "Integer id (N) of ftand custom instruction"
msgstr "启用除法和求余指令"
#: config/nios2/nios2.opt:239
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fsind custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:247
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fcosd custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:255
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fsqrtd custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:263
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fabsd custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:271
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fnegd custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:279
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fmaxd custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:287
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fmind custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:295
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fdivd custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:303
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fmuld custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:307
#, fuzzy
-#| msgid "Enable divide and modulus instructions"
msgid "Integer id (N) of fmuld custom instruction"
msgstr "启用除法和求余指令"
#: config/nios2/nios2.opt:311
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fsubd custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:319
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the faddd custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:327
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fcmpnes custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:335
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fcmpeqs custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:343
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fcmpges custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:351
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fcmpgts custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:359
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fcmples custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:367
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fcmplts custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:375
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the flogs custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:383
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fexps custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:391
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fatans custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:399
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the ftans custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:407
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fsins custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:415
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fcoss custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:423
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fsqrts custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:431
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fabss custom instr"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:439
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fnegs custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:447
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fmaxs custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:455
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fmins custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:463
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fdivs custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:471
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fmuls custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:475
#, fuzzy
-#| msgid "Enable divide and modulus instructions"
msgid "Integer id (N) of fmuls custom instruction"
msgstr "启用除法和求余指令"
#: config/nios2/nios2.opt:479
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fsubs custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:487
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fadds custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:495
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the frdy custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:503
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the frdxhi custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:511
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the frdxlo custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:519
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fwry custom instruction"
msgstr "不使用 callt 指令"
#: config/nios2/nios2.opt:527
#, fuzzy
-#| msgid "Do not use the callt instruction"
msgid "Do not use the fwrx custom instruction"
msgstr "不使用 callt 指令"
#: config/rx/rx.opt:93
#, fuzzy
-#| msgid "Generate assembler output that is compatible with the Renesas AS100 assembler. This may restrict some of the compiler's capabilities. The default is to generate GAS compatable syntax."
msgid "Generate assembler output that is compatible with the Renesas AS100 assembler. This may restrict some of the compiler's capabilities. The default is to generate GAS compatible syntax."
msgstr "生成与 Renesas AS100 兼容的汇编输出。这可能会限制编译器的某些功能。默认是使用与 GAS 兼容的语法。"
#: config/rx/rx.opt:141
#, fuzzy
-#| msgid "Enable the use of the short load instructions"
msgid "Enable the use of the LRA register allocator."
msgstr "启用对短加载指令的使用"
#: config/microblaze/microblaze.opt:87
#, fuzzy, c-format
-#| msgid "%qE is deprecated: %s"
msgid "%qs is deprecated; use -fstack-check"
msgstr "不建议使用%qE:%s"
#: config/microblaze/microblaze.opt:95
#, fuzzy, c-format
-#| msgid "-mno-clearbss is deprecated; use -fno-zero-initialized-in-bss"
msgid "%qs is deprecated; use -fno-zero-initialized-in-bss"
msgstr "-mno-clearbss已不建议使用;请改用 -fno-zero-initialized-in-bss"
#: config/mn10300/mn10300.opt:67
#, fuzzy
-#| msgid "Allow gcc to generate LIW instructions"
msgid "Allow gcc to generate the SETLB and Lcc instructions"
msgstr "允许 gcc 生成 LIW 指令"
#: config/nds32/nds32.opt:26
#, fuzzy
-#| msgid "Generate code in big endian mode"
msgid "Generate code in big-endian mode."
msgstr "生成大端在前的代码"
#: config/nds32/nds32.opt:30
#, fuzzy
-#| msgid "Generate code in little endian mode"
msgid "Generate code in little-endian mode."
msgstr "生成小端在前的代码"
#: config/nds32/nds32.opt:34
#, fuzzy
-#| msgid "Reschedule instructions before register allocation"
msgid "Use reduced-set registers for register allocation."
msgstr "分配寄存器前重新调度指令"
#: config/nds32/nds32.opt:38
#, fuzzy
-#| msgid "Reschedule instructions before register allocation"
msgid "Use full-set registers for register allocation."
msgstr "分配寄存器前重新调度指令"
#: config/nds32/nds32.opt:42
#, fuzzy
-#| msgid "Generate bit instructions"
msgid "Generate conditional move instructions."
msgstr "生成位指令"
#: config/nds32/nds32.opt:46
#, fuzzy
-#| msgid "Generate bit instructions"
msgid "Generate performance extension instructions."
msgstr "生成位指令"
#: config/nds32/nds32.opt:50
#, fuzzy
-#| msgid "Generate isel instructions"
msgid "Generate v3 push25/pop25 instructions."
msgstr "生成 isel 指令"
#: config/nds32/nds32.opt:54
#, fuzzy
-#| msgid "Generate bit instructions"
msgid "Generate 16-bit instructions."
msgstr "生成位指令"
#: config/nds32/nds32.opt:58
#, fuzzy
-#| msgid "Generate isel instructions"
msgid "Generate GP base instructions directly."
msgstr "生成 isel 指令"
#: config/nds32/nds32.opt:70
#, fuzzy
-#| msgid "Specify the name of the target architecture"
msgid "Specify the name of the target architecture."
msgstr "指定目标架构的名称"
#: config/nds32/nds32.opt:94
#, fuzzy
-#| msgid "Run predictive commoning optimization."
msgid "Use special directives to guide linker doing ex9 optimization."
msgstr "启用预测公因子优化。"
#: config/nds32/nds32.opt:98
#, fuzzy
-#| msgid "Warn when all constructors and destructors are private"
msgid "Enable constructor/destructor feature."
msgstr "当所有构造函数和析构函数都是私有时给出警告"
#: config/nds32/nds32.opt:102
#, fuzzy
-#| msgid "Generate isel instructions"
msgid "Guide linker to relax instructions."
msgstr "生成 isel 指令"
#: config/c6x/c6x.opt:46
#, fuzzy
-#| msgid "alias argument not a string"
msgid "Valid arguments for the -msdata= option"
msgstr "alias 的参数不是一个字符串"
#: config/c6x/c6x.opt:59
#, fuzzy
-#| msgid "Create a shared library"
msgid "Compile for the DSBT shared library ABI"
msgstr "生成一个共享库"
#: config/sh/sh.opt:236 config/sh/sh.opt:240
#, fuzzy, c-format
-#| msgid "Deprecated. This switch has no effect"
msgid "%qs is deprecated and has no effect"
msgstr "不建议使用。此开关不起作用。"
#: config/sh/sh.opt:277
#, fuzzy
-#| msgid "Increase the IEEE compliance for floating-point code"
msgid "Increase the IEEE compliance for floating-point comparisons"
msgstr "让浮点代码更加遵循 IEEE 标准"
#: config/sh/sh.opt:331
#, fuzzy
-#| msgid "Generate code for built-in atomic operations"
msgid "Specify the model for atomic operations"
msgstr "为内建原子操作生成代码"
#: config/sh/sh.opt:357
#, fuzzy
-#| msgid "Enable the use of the short load instructions"
msgid "Enable the use of the fsca instruction"
msgstr "启用对短加载指令的使用"
#: config/sh/sh.opt:361
#, fuzzy
-#| msgid "Enable the use of the short load instructions"
msgid "Enable the use of the fsrra instruction"
msgstr "启用对短加载指令的使用"
#: config/mips/mips.opt:63
#, fuzzy
-#| msgid "Use multiply add/subtract instructions"
msgid "Use integer madd/msub instructions"
msgstr "使用乘加/减指令"
#: config/mips/mips.opt:91
#, fuzzy
-#| msgid "invalid argument %qs to -fdebug-prefix-map"
msgid "Valid arguments to -mcode-readable=:"
msgstr "-fdebug-prefix-map 的参数%qs无效"
#: config/mips/mips.opt:146
#, fuzzy
-#| msgid "Use the bit-field instructions"
msgid "Use Enhanced Virtual Addressing instructions"
msgstr "使用位段指令"
#: config/mips/mips.opt:158
#, fuzzy
-#| msgid "Work around certain R4000 errata"
msgid "Work around certain 24K errata"
msgstr "为某些 R4000 缺陷提供变通"
#: config/mips/mips.opt:170
#, fuzzy
-#| msgid "Work around certain R4000 errata"
msgid "Work around certain RM7000 errata"
msgstr "为某些 R4000 缺陷提供变通"
#: config/mips/mips.opt:252
#, fuzzy
-#| msgid "Generate code that can be safely linked with MIPS16 code."
msgid "Generate code that is link-compatible with MIPS16 and microMIPS code."
msgstr "生成能与 MIPS16 代码安全链接的代码。"
#: config/mips/mips.opt:256
#, fuzzy
-#| msgid "Does nothing. Preserved for backward compatibility."
msgid "An alias for minterlink-compressed provided for backward-compatibility."
msgstr "不起作用。为向前兼容保留的选项。"
#: config/mips/mips.opt:300
#, fuzzy
-#| msgid "Use SmartMIPS instructions"
msgid "Use microMIPS instructions"
msgstr "使用 SmartMIPS 指令"
#: config/mips/mips.opt:312
#, fuzzy
-#| msgid "Use MIPS-3D instructions"
msgid "Use MCU instructions"
msgstr "使用 MIPS-3D 指令"
#: config/tilegx/tilegx.opt:37
#, fuzzy
-#| msgid "Compile for 32-bit pointers"
msgid "Compile with 32 bit longs and pointers."
msgstr "为 32 位指针编译"
#: config/tilegx/tilegx.opt:41
#, fuzzy
-#| msgid "Compile for 64-bit pointers"
msgid "Compile with 64 bit longs and pointers."
msgstr "为 64 位指针编译"
#: config/tilegx/tilegx.opt:45
#, fuzzy
-#| msgid "Use given x86-64 code model"
msgid "Use given TILE-Gx code model"
msgstr "使用给定的 x86-64 代码模式"
#: config/arc/arc.opt:26
#, fuzzy
-#| msgid "Generate code in big endian mode"
msgid "Compile code for big endian mode"
msgstr "生成大端在前的代码"
#: config/arc/arc.opt:30
#, fuzzy
-#| msgid "Stores doubles in 32 bits. This is the default."
msgid "Compile code for little endian mode. This is the default"
msgstr "以 32 位双精度数存储。这是默认值。"
#: config/arc/arc.opt:80
#, fuzzy
-#| msgid "Generate string instructions for block moves"
msgid "Generate instructions supported by barrel shifter"
msgstr "为块移动使用字符串指令"
#: config/arc/arc.opt:84
#, fuzzy
-#| msgid "Generate bit instructions"
msgid "Generate norm instruction"
msgstr "生成位指令"
#: config/arc/arc.opt:88
#, fuzzy
-#| msgid "Generate isel instructions"
msgid "Generate swap instruction"
msgstr "生成 isel 指令"
#: config/arc/arc.opt:92
#, fuzzy
-#| msgid "Generate load/store multiple instructions"
msgid "Generate mul64 and mulu64 instructions"
msgstr "生成加载/存储乘法指令"
#: config/arc/arc.opt:96
#, fuzzy
-#| msgid "Do not generate fused multiply/add instructions"
msgid "Do not generate mpy instructions for ARC700"
msgstr "不生成融合的乘/加指令"
#: config/arc/arc.opt:108
#, fuzzy
-#| msgid "Generate call insns as indirect calls, if necessary"
msgid "Generate call insns as register indirect calls"
msgstr "如有必须,为调用指令生成间接调用"
#: config/arc/arc.opt:112
#, fuzzy
-#| msgid "Generate cld instruction in the function prologue."
msgid "Do no generate BRcc instructions in arc_reorg."
msgstr "在函数序言中生成 cld 指令"
#: config/arc/arc.opt:132
#, fuzzy
-#| msgid "Generate bit instructions"
msgid "FPX: Generate Single Precision FPX (fast) instructions."
msgstr "生成位指令"
#: config/arc/arc.opt:140 config/arc/arc.opt:144
#, fuzzy
-#| msgid "Generate bit instructions"
msgid "FPX: Generate Double Precision FPX (compact) instructions."
msgstr "生成位指令"
#: config/arc/arc.opt:148
#, fuzzy
-#| msgid "Generate bit instructions"
msgid "FPX: Generate Double Precision FPX (fast) instructions."
msgstr "生成位指令"
#: config/arc/arc.opt:187
#, fuzzy
-#| msgid "Cost to assume for a multiply insn"
msgid "Cost to assume for a multiply instruction, with 4 being equal to a normal insn."
msgstr "为乘法指令设定的开销"
#: config/arc/arc.opt:215
#, fuzzy
-#| msgid "Enable the use of the short load instructions"
msgid "Enable the use of indexed loads"
msgstr "启用对短加载指令的使用"
#: config/arc/arc.opt:223
#, fuzzy
-#| msgid "Generate fused multiply/add instructions"
msgid "Generate 32x16 multiply and mac instructions"
msgstr "生成融合的乘/加指令"
#: config/arc/arc.opt:241
#, fuzzy
-#| msgid "Avoid all range limits on call instructions"
msgid "Do alignment optimizations for call instructions."
msgstr "为调用指令避免一切范围限制"
#: config/arc/arc.opt:253
#, fuzzy
-#| msgid "Enable cbranchdi4 pattern"
msgid "Enable pre-reload use of cbranchsi pattern"
msgstr "启用 cbranchdi4 样式"
#: config/arc/arc.opt:265
#, fuzzy
-#| msgid "Enable cbranchdi4 pattern"
msgid "Enable compact casesi pattern"
msgstr "启用 cbranchdi4 样式"
#: config/arc/arc.opt:269
#, fuzzy
-#| msgid "Enable clip instructions"
msgid "Enable 'q' instruction alternatives."
msgstr "启用 clip 指令"
#: config/arc/arc.opt:280
#, fuzzy
-#| msgid "Enable Plan 9 language extensions"
msgid "Enable variable polynomial CRC extension"
msgstr "启用九号计划语言扩展"
#: config/arc/arc.opt:284
#, fuzzy
-#| msgid "Enable Plan 9 language extensions"
msgid "Enable DSP 3.1 Pack A extensions"
msgstr "启用九号计划语言扩展"
#: config/arc/arc.opt:288
#, fuzzy
-#| msgid "Enable Plan 9 language extensions"
msgid "Enable dual viterbi butterfly extension"
msgstr "启用九号计划语言扩展"
#: config/arc/arc.opt:298
#, fuzzy
-#| msgid "Enable leading zero instructions"
msgid "Enable Dual and Single Operand Instructions for Telephony"
msgstr "启用前导零指令"
#: config/arc/arc.opt:307
#, fuzzy
-#| msgid "Enable dead store elimination"
msgid "Enable Locked Load/Store Conditional extension"
msgstr "删除死存储"
#: config/arc/arc.opt:311
#, fuzzy
-#| msgid "Enable sign extend instructions"
msgid "Enable swap byte ordering extension instruction"
msgstr "启用符号扩展指令"
#: config/arc/arc.opt:315
#, fuzzy
-#| msgid "Enable bit manipulation instructions"
msgid "Enable 64-bit Time-Stamp Counter extension instruction"
msgstr "启用位操作指令"
#: config/arc/arc.opt:327
#, fuzzy
-#| msgid "Pass -z text to linker"
msgid "Pass -EB option through to linker."
msgstr "将 -z text 传递给链接器"
#: config/arc/arc.opt:331
#, fuzzy
-#| msgid "Pass -z text to linker"
msgid "Pass -EL option through to linker."
msgstr "将 -z text 传递给链接器"
#: config/arc/arc.opt:335
#, fuzzy
-#| msgid "Pass -z text to linker"
msgid "Pass -marclinux option through to linker."
msgstr "将 -z text 传递给链接器"
#: common.opt:457
#, fuzzy
-#| msgid "Optimize for space rather than speed"
msgid "Optimize for debugging experience rather than speed or size"
msgstr "为最小空间而不是最大速度优化"
#: common.opt:562
#, fuzzy
-#| msgid "%Kattempt to free a non-heap object"
msgid "Warn when attempting to free a non-heap object"
msgstr "%K试图 free 一个不在堆上的对象"
#: common.opt:660
#, fuzzy
-#| msgid "Warn about uninitialized automatic variables"
msgid "Warn about maybe uninitialized automatic variables"
msgstr "自动变量未初始化时警告"
#: common.opt:918
#, fuzzy
-#| msgid "Check the return value of new"
msgid "Check the return value of new in C++"
msgstr "检查 new 的返回值"
#: common.opt:1012
#, fuzzy
-#| msgid "Perform superblock formation via tail duplication"
msgid "Perform speculative devirtualization"
msgstr "通过尾复制进行超块合成"
#: common.opt:1096
#, fuzzy
-#| msgid "Do the full register move optimization pass"
msgid "Dump optimization passes"
msgstr "进行全寄存器传送优化"
#: common.opt:1243
#, fuzzy
-#| msgid "Enable hoisting loads from conditional pointers."
msgid "Enable hoisting adjacent loads to encourage generating conditional move"
msgstr "为条件指针外提内存读取操作。"
#: common.opt:1303
#, fuzzy, c-format
-#| msgid "unknown TLS model %qs"
msgid "unknown Stack Reuse Level %qs"
msgstr "未知的 TLS 模型%qs"
#: common.opt:1342
#, fuzzy
-#| msgid "Integrate simple functions into their callers when code size is known to not growth"
msgid "Integrate functions into their callers when code size is known not to grow"
msgstr "在不导致代码膨胀的情况下将简单函数集成到它们的调用者中"
#: common.opt:1346
#, fuzzy
-#| msgid "Integrate functions called once into their callers"
msgid "Integrate functions not declared \"inline\" into their callers when profitable"
msgstr "将只被调用一次的函数集成到它们的调用者中"
#: common.opt:1350
#, fuzzy
-#| msgid "Integrate functions called once into their callers"
msgid "Integrate functions only required by their single caller"
msgstr "将只被调用一次的函数集成到它们的调用者中"
#: common.opt:1377
#, fuzzy
-#| msgid "Perform Interprocedural constant propagation"
msgid "Perform interprocedural constant propagation"
msgstr "进行进程间的复写传递"
#: common.opt:1397
#, fuzzy
-#| msgid "unimplemented functionality"
msgid "Perform Semantic function equality"
msgstr "未实现的功能"
#: common.opt:1521
#, fuzzy
-#| msgid "Report various link-time optimization statistics"
msgid "Report various link-time optimization statistics for WPA only"
msgstr "报告各种链接时优化统计"
#: common.opt:1537
#, fuzzy
-#| msgid "Report on permanent memory allocation"
msgid "Report on permanent memory allocation in WPA only"
msgstr "报告永久性内存分配"
#: common.opt:1592
#, fuzzy
-#| msgid "Enable loop optimizations on tree level"
msgid "Enable all optimization info dumps on stderr"
msgstr "在树级别进行循环优化"
#: common.opt:1713
#, fuzzy
-#| msgid "internal consistency failure"
msgid "Report on consistency of profile"
msgstr "内部一致性错误"
#: common.opt:1717
#, fuzzy
-#| msgid "Reorder functions to improve code placement"
msgid "Enable function reordering that improves code placement"
msgstr "函数重新排序以改善代码布局"
#: common.opt:1746
#, fuzzy
-#| msgid "Enable register pressure sensitive insn scheduling"
msgid "Relief of register pressure through live range shrinkage"
msgstr "启用对寄存器压力敏感的指令调度"
#: common.opt:1967
#, fuzzy
-#| msgid "Use a stack protection method for every function"
msgid "Use a smart stack protection method for certain functions"
msgstr "为每个函数使用堆栈保护机制"
#: common.opt:2065
#, fuzzy
-#| msgid "Perform variable tracking and also tag variables that are uninitialized"
msgid "Enable coalescing of copy-related user variables that are inlined"
msgstr "进行变量追踪并且标记未被初始化的变量"
#: common.opt:2101
#, fuzzy
-#| msgid "Enable loop header copying on trees"
msgid "Enable tail merging on trees"
msgstr "启用树上的循环不变量转移"
#: common.opt:2117
#, fuzzy
-#| msgid "Enable SSA-CCP optimization on trees"
msgid "Enable string length optimizations on trees"
msgstr "启用树上的 SSA-CCP 优化"
#: common.opt:2121
#, fuzzy
-#| msgid "comparison with string literal results in unspecified behaviour"
msgid "Detect paths which trigger erroneous or undefined behaviour due to"
msgstr "与字面字符串比较的结构是不可预测的"
#: common.opt:2254
#, fuzzy
-#| msgid "Use the hardware barrel shifter instead of emulation"
msgid "Use the bfd linker instead of the default linker"
msgstr "使用硬件桶型移位器代替仿真"
#: common.opt:2258
#, fuzzy
-#| msgid "Use the hardware barrel shifter instead of emulation"
msgid "Use the gold linker instead of the default linker"
msgstr "使用硬件桶型移位器代替仿真"
#: common.opt:2296
#, fuzzy
-#| msgid "Enable loop vectorization on trees"
msgid "Enable vectorization on trees"
msgstr "在树上进行循环向量化"
#: common.opt:2312
#, fuzzy
-#| msgid "Enable use of cost model in vectorization"
msgid "Specifies the cost model for vectorization"
msgstr "启用向量化开销模型"
#: common.opt:2319
#, fuzzy, c-format
-#| msgid "unknown TLS model %qs"
msgid "unknown vectorizer cost model %qs"
msgstr "未知的 TLS 模型%qs"
#: common.opt:2332
#, fuzzy
-#| msgid "Does nothing. Preserved for backward compatibility."
msgid "Enables the dynamic vectorizer cost model. Preserved for backward compatibility."
msgstr "不起作用。为向前兼容保留的选项。"
#: common.opt:2336
#, fuzzy
-#| msgid "Does nothing. Preserved for backward compatibility."
msgid "Enables the unlimited vectorizer cost model. Preserved for backward compatibility."
msgstr "不起作用。为向前兼容保留的选项。"
#: common.opt:2380
#, fuzzy, c-format
-#| msgid "(near initialization for %qs)"
msgid "unknown vtable verify initialization priority %qs"
msgstr "(在%qs的初始化附近)"
#: common.opt:2433
#, fuzzy
-#| msgid "Generate debug information in default format"
msgid "Generate debug information in default version of DWARF format"
msgstr "生成默认格式的调试信息"
#: common.opt:2457
#, fuzzy
-#| msgid "Record gcc command line switches in the object file."
msgid "Don't record gcc command line switches in DWARF DW_AT_producer."
msgstr "在目标文件中记录 gcc 命令行开关。"
#: common.opt:2461
#, fuzzy
-#| msgid "Record gcc command line switches in the object file."
msgid "Record gcc command line switches in DWARF DW_AT_producer."
msgstr "在目标文件中记录 gcc 命令行开关。"
#: common.opt:2465
#, fuzzy
-#| msgid "Generate debug information in default format"
msgid "Don't generate debug information in separate .dwo files"
msgstr "生成默认格式的调试信息"
#: common.opt:2469
#, fuzzy
-#| msgid "Generate debug information in default format"
msgid "Generate debug information in separate .dwo files"
msgstr "生成默认格式的调试信息"
#: common.opt:2512
#, fuzzy
-#| msgid "-imultilib <dir>\tSet <dir> to be the multilib include subdirectory"
msgid "-imultiarch <dir>\tSet <dir> to be the multiarch include subdirectory"
msgstr "-imultilib <目录>\t将目录设定为 multilib 的包含子目录"
#: go/gofrontend/expressions.cc:4157
#, fuzzy
-#| msgid "expected integer or boolean type"
msgid "expected boolean type"
msgstr "需要整数或布尔类型"
#: go/gofrontend/expressions.cc:5925
#, fuzzy
-#| msgid "invalid comparison code in gimple cond"
msgid "invalid comparison of nil with nil"
msgstr "gimple 条件中比较代码无效"
#: go/gofrontend/expressions.cc:5969
#, fuzzy
-#| msgid "division by zero"
msgid "integer division by zero"
msgstr "被零除"
#: go/gofrontend/expressions.cc:7156
#, fuzzy
-#| msgid "invalid argument to built-in function"
msgid "invalid use of %<...%> with builtin function"
msgstr "内建函数实参无效"
#: go/gofrontend/expressions.cc:7167
#, fuzzy
-#| msgid "invalid use of template-name %qE without an argument list"
msgid "invalid use of method value as argument of Offsetof"
msgstr "使用模板名%qE时不带实参表无效"
#: go/gofrontend/expressions.cc:7271
#, fuzzy
-#| msgid "argument must be a constant"
msgid "argument 1 must be a map"
msgstr "实参必须是常数"
#: go/gofrontend/expressions.cc:7384
#, fuzzy
-#| msgid "bad length when making slice"
msgid "length required when allocating a slice"
msgstr "生成切片时长度错误"
#: go/gofrontend/expressions.cc:7435
#, fuzzy
-#| msgid "too many arguments to %qE"
msgid "too many arguments to make"
msgstr "%qE实参太多"
#: go/gofrontend/expressions.cc:8317
#, fuzzy
-#| msgid "left argument must be a slice"
msgid "first argument must be []byte"
msgstr "左实参必须是一个切片"
#: go/gofrontend/expressions.cc:8320
#, fuzzy
-#| msgid "right argument must be a slice or a string"
msgid "second argument must be slice or string"
msgstr "右实参必须是一个切片或字符串"
#: go/gofrontend/expressions.cc:8361
#, fuzzy
-#| msgid "parameter %u has void type"
msgid "argument 2 has invalid type"
msgstr "第 %u 个参数类型为 void"
#: go/gofrontend/expressions.cc:9332
#, fuzzy
-#| msgid "invalid use of %<this%> at top level"
msgid "invalid use of %<...%> with non-slice"
msgstr "在文件作用域使用%<this%>无效"
#: go/gofrontend/expressions.cc:9623
#, fuzzy
-#| msgid "invalid use of %<this%> in non-member function"
msgid "invalid use of %<...%> calling non-variadic function"
msgstr "在非成员函数中使用%<this%>无效"
#: go/gofrontend/expressions.cc:10474
#, fuzzy
-#| msgid "slice end must be integer"
msgid "slice capacity must be integer"
msgstr "切片结尾必须是整数"
#: go/gofrontend/statements.cc:2654 go/gofrontend/statements.cc:2683
#, fuzzy
-#| msgid "not enough arguments"
msgid "not enough arguments to return"
msgstr "实参太少"
#: go/gofrontend/types.cc:514
#, fuzzy
-#| msgid "invalid comparison code in gimple cond"
msgid "invalid comparison of non-ordered type"
msgstr "gimple 条件中比较代码无效"
#: go/gofrontend/types.cc:530
#, fuzzy
-#| msgid "duplicate class will only be compiled once"
msgid "slice can only be compared to nil"
msgstr "重复的类只会被编译一次"
#: go/gofrontend/types.cc:532
#, fuzzy
-#| msgid "duplicate class will only be compiled once"
msgid "map can only be compared to nil"
msgstr "重复的类只会被编译一次"
#: go/gofrontend/types.cc:534
#, fuzzy
-#| msgid "duplicate class will only be compiled once"
msgid "func can only be compared to nil"
msgstr "重复的类只会被编译一次"
#: go/gofrontend/types.cc:540
#, fuzzy, c-format
-#| msgid "invalid operand to %%R"
msgid "invalid operation (%s)"
msgstr "%%R 的操作数无效"
#: go/gofrontend/types.cc:563
#, fuzzy
-#| msgid "invalid comparison code in gimple cond"
msgid "invalid comparison of non-comparable type"
msgstr "gimple 条件中比较代码无效"
#: go/gofrontend/types.cc:581
#, fuzzy
-#| msgid "invalid comparison code in gimple cond"
msgid "invalid comparison of non-comparable struct"
msgstr "gimple 条件中比较代码无效"
#: go/gofrontend/types.cc:592
#, fuzzy
-#| msgid "invalid use of non-lvalue array"
msgid "invalid comparison of non-comparable array"
msgstr "对非左值数组的使用无效"
#: go/gofrontend/types.cc:7240
#, fuzzy, c-format
-#| msgid "method %s%s%s requires a pointer"
msgid "method %s%s%s requires a pointer receiver"
msgstr "方法%s%s%s需要一个指针"
#: go/gofrontend/types.cc:7258
#, fuzzy, c-format
-#| msgid "method %s%s%s requires a pointer"
msgid "method %s%s%s is marked go:nointerface"
msgstr "方法%s%s%s需要一个指针"
#: attribs.c:450
#, fuzzy, gcc-internal-format
-#| msgid "%qE attribute directive ignored"
msgid "%<%E::%E%> scoped attribute directive ignored"
msgstr "%qE属性指定被忽略"
#. type. Ignore it.
#: attribs.c:472
#, fuzzy, gcc-internal-format
-#| msgid "%qE attribute ignored"
msgid "attribute ignored"
msgstr "%qE属性被忽略"
#: builtins.c:5248
#, fuzzy, gcc-internal-format
-#| msgid "invalid argument to built-in function"
msgid "invalid memory model argument to builtin"
msgstr "内建函数实参无效"
#: builtins.c:5360
#, fuzzy, gcc-internal-format
-#| msgid "invalid use of %<auto%>"
msgid "invalid memory model for %<__atomic_load%>"
msgstr "错误地使用了%<auto%>"
#: builtins.c:5390 builtins.c:5497
#, fuzzy, gcc-internal-format
-#| msgid "invalid use of %<auto%>"
msgid "invalid memory model for %<__atomic_store%>"
msgstr "错误地使用了%<auto%>"
#: builtins.c:5709
#, fuzzy, gcc-internal-format
-#| msgid "__builtin_eh_return not supported on this target"
msgid "__builtin_thread_pointer is not supported on this target"
msgstr "__builtin_eh_return 在此目标机上不受支持"
#: builtins.c:5729
#, fuzzy, gcc-internal-format
-#| msgid "__builtin_eh_return not supported on this target"
msgid "__builtin_set_thread_pointer is not supported on this target"
msgstr "__builtin_eh_return 在此目标机上不受支持"
#: calls.c:3055
#, fuzzy, gcc-internal-format
-#| msgid "missing argument to %qs"
msgid "passing too large argument on stack"
msgstr "%qs缺少参数"
#: cfghooks.c:310
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "%s does not support duplicate_block"
msgid "%s does not support dump_bb_for_graph"
msgstr "%s 不支持 duplicate_block"
#: cfghooks.c:984
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "%s does not support move_block_after"
msgid "%s does not support force_nonfallthru"
msgstr "%s 不支持t move_block_after"
#: cfgloop.c:1356
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Enable loop header copying on trees"
msgid "loop with header %d not in loop tree"
msgstr "启用树上的循环不变量转移"
#: cfgloop.c:1395
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "bb %d do not belong to loop %d"
msgid "bb %d does not belong to loop %d"
msgstr "基本块 %d 不属于循环 %d"
#: cfgloop.c:1407
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "size of loop %d should be %d, not %d"
msgid "bb %d has father loop %d, should be loop %d"
msgstr "循环 %d 的大小应该为 %d,而不是%d"
#: cfgrtl.c:2428
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "verify_flow_info: REG_BR_PROB does not match cfg %wi %i"
msgid "verify_flow_info: REG_BR_PROB does not match cfg %i %i"
msgstr "verify_flow_info:REG_BR_PROB 不匹配 cfg %wi %i"
#: cfgrtl.c:2454
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "fallthru edge crosses section boundary (bb %i)"
msgid "fallthru edge crosses section boundary in bb %i"
msgstr "直通边越过了节分界(基本块 %i)"
#: cfgrtl.c:2460
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "fallthru edge crosses section boundary (bb %i)"
msgid "EH edge crosses section boundary in bb %i"
msgstr "直通边越过了节分界(基本块 %i)"
#: cfgrtl.c:2467
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "fallthru edge crosses section boundary (bb %i)"
msgid "No region crossing jump at section boundary in bb %i"
msgstr "直通边越过了节分界(基本块 %i)"
#: cfgrtl.c:2510
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "missing REG_EH_REGION note in the end of bb %i"
msgid "missing REG_EH_REGION note at the end of bb %i"
msgstr "基本块 %i 结尾缺少 REG_EH_REGION 记录"
#: cfgrtl.c:2515
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "too many outgoing branch edges from bb %i"
msgid "too many exception handling edges in bb %i"
msgstr "从基本块 %i 分出太多的分支边"
#: cfgrtl.c:2528
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "fallthru edge after unconditional jump %i"
msgid "fallthru edge after unconditional jump in bb %i"
msgstr "非条件跳转 %i 之后的直通边"
#: cfgrtl.c:2533
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "wrong number of branch edges after unconditional jump %i"
msgid "wrong number of branch edges after unconditional jump in bb %i"
msgstr "非条件跳转 %i 之后的分支边数不对"
#: cfgrtl.c:2540
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "wrong amount of branch edges after conditional jump %i"
msgid "wrong amount of branch edges after conditional jump in bb %i"
msgstr "条件跳转 %i 之后的分支边数不对"
#: cfgrtl.c:2546
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "call edges for non-call insn in bb %i"
msgid "abnormal call edges for non-call insn in bb %i"
msgstr "在基本块 %i 中非调用指令的调用边"
#: cfgrtl.c:2551
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "call edges for non-call insn in bb %i"
msgid "sibcall edges for non-call insn in bb %i"
msgstr "在基本块 %i 中非调用指令的调用边"
#: cgraph.c:2651
#, fuzzy, gcc-internal-format
-#| msgid "Assume symbols might be invalid"
msgid "local symbols must be defined"
msgstr "假定符号可能无效"
#: cgraph.c:2666
#, fuzzy, gcc-internal-format
-#| msgid "inline clone is needed"
msgid "inline clone is forced to output"
msgstr "需要内联克隆"
#: cgraph.c:2895
#, fuzzy, gcc-internal-format
-#| msgid "expected statement"
msgid "reference to dead statement"
msgstr "需要语句"
#: cgraphunit.c:774
#, fuzzy, gcc-internal-format
-#| msgid "Warn when an inlined function cannot be inlined"
msgid "always_inline function might not be inlinable"
msgstr "当内联函数无法被内联时给出警告"
#: cgraphunit.c:1200
#, fuzzy, gcc-internal-format
-#| msgid "%q+D used prior to declaration"
msgid "%q+D aliased declaration"
msgstr "%q+D在声明前使用"
#: cgraphunit.c:1303
#, fuzzy, gcc-internal-format
-#| msgid "failed to reclaim unneeded function"
msgid "failed to reclaim unneeded function in same comdat group"
msgstr "无法收回不需要的函数"
#: collect2.c:1567 collect2.c:1750 collect2.c:1790
#, fuzzy, gcc-internal-format
-#| msgid "fopen %s"
msgid "fopen %s: %m"
msgstr "fopen %s"
#: collect2.c:1570 collect2.c:1755 collect2.c:1793
#, fuzzy, gcc-internal-format
-#| msgid "fclose %s"
msgid "fclose %s: %m"
msgstr "fclose %s"
#: collect2.c:1857
#, fuzzy, gcc-internal-format
-#| msgid "can't get program status: %s"
msgid "can't get program status: %m"
msgstr "无法获取程序状态:%s"
#: collect2.c:2546
#, fuzzy, gcc-internal-format
-#| msgid "can't open nm output"
msgid "can't open nm output: %m"
msgstr "无法打开 nm 的输出"
#: collect2.c:2742
#, fuzzy, gcc-internal-format
-#| msgid "can't open ldd output"
msgid "can't open ldd output: %m"
msgstr "无法打开 ldd 输出"
#: coverage.c:291
#, fuzzy, gcc-internal-format
-#| msgid "checksum is %x instead of %x"
msgid "checksum is (%x,%x) instead of (%x,%x)"
msgstr "检验和是 %x 而不是 %x"
#: coverage.c:393
#, fuzzy, gcc-internal-format
-#| msgid "execution counts estimated"
msgid "execution counts estimated\n"
msgstr "预计执行次数"
#: dumpfile.c:862
#, fuzzy, gcc-internal-format
-#| msgid "ignoring unknown option %q.*s in %<-fdump-%s%>"
msgid "unknown option %q.*s in %<-fopt-info-%s%>"
msgstr "忽略未知的选项%q.*s,在%<-fdump-%s%>中"
#: dwarf2out.c:11303
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "non-delegitimized UNSPEC %d found in variable location"
msgid "non-delegitimized UNSPEC %s (%d) found in variable location"
msgstr "变量位置处发现未被非法化的 UNSPEC %d"
#: expr.c:7657
#, fuzzy, gcc-internal-format
-#| msgid "global register variable %qD used in nested function"
msgid "local frame unavailable (naked function?)"
msgstr "嵌套函数中使用了全局寄存器变量%qD"
#: gcc.c:7131
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "-fuse-linker-plugin, but "
msgid "-fuse-linker-plugin, but %s not found"
msgstr "使用了 -fuse-linker-plugin,但"
#: gcc.c:8636
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "too few arguments to function"
msgid "too few arguments to %%:replace-extension"
msgstr "给予函数的实参太少"
#: gimplify.c:5647
#, fuzzy, gcc-internal-format
-#| msgid "%qE not specified in enclosing parallel"
msgid "%qE not specified in enclosing task"
msgstr "%qE未为在括入的并行中指定"
#: gimplify.c:5653
#, fuzzy, gcc-internal-format
-#| msgid "%qE not specified in enclosing parallel"
msgid "%qE not specified in enclosing teams construct"
msgstr "%qE未为在括入的并行中指定"
#: gimplify.c:5770 gimplify.c:5799
#, fuzzy, gcc-internal-format
-#| msgid "iteration variable %qE should not be reduction"
msgid "iteration variable %qE is predetermined linear"
msgstr "迭代变量%qE不应当是 reduction"
#: gimplify.c:5793
#, fuzzy, gcc-internal-format
-#| msgid "iteration variable %qE should not be firstprivate"
msgid "iteration variable %qE should not be lastprivate"
msgstr "迭代变量%qE不应当是 firstprivate"
#: gimplify.c:5796
#, fuzzy, gcc-internal-format
-#| msgid "iteration variable %qE should be private"
msgid "iteration variable %qE should not be private"
msgstr "迭代变量%qE应当是私有的"
#: gimplify.c:6064
#, fuzzy, gcc-internal-format
-#| msgid "%s variable %qE is private in outer context"
msgid "copyprivate variable %qE is not threadprivate or private in outer context"
msgstr "%s 变量%qE在外层上下文中是私有的"
#: gimplify.c:8063
#, fuzzy, gcc-internal-format
-#| msgid "expected %<}%> before %<else%>"
msgid "expected %<_Cilk_spawn%> before %<_Cilk_sync%>"
msgstr "%<else%>前需要%<}%>"
#: ipa-devirt.c:302 ipa-devirt.c:337
#, fuzzy, gcc-internal-format
-#| msgid "previous definition here"
msgid "type %qD violates one definition rule "
msgstr "先前的定义在这里"
#: ira.c:5544
#, fuzzy, gcc-internal-format
-#| msgid "as %qD"
msgid "for %qD"
msgstr "作为%qD"
#: lto-cgraph.c:1083
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "bytecode stream: found multiple instances of cgraph node %d"
msgid "bytecode stream: found multiple instances of cgraph node with uid %d"
msgstr "字节码流:找到 cgraph 节点 %d 的多个实例"
#: lto-streamer-in.c:824
#, fuzzy, gcc-internal-format
-#| msgid "operand number out of range"
msgid "Reference statement index out of range"
msgstr "操作数号超出范围"
#: lto-streamer-in.c:827
#, fuzzy, gcc-internal-format
-#| msgid "Warn if deprecated empty statements are found"
msgid "Reference statement index not found"
msgstr "发现不建议使用的空语句时给出警告"
#: lto-streamer-out.c:393 lto-streamer-out.c:1307
#, fuzzy, gcc-internal-format
-#| msgid "tree code %qs is not supported in gimple streams"
msgid "tree code %qs is not supported in LTO streams"
msgstr "树代码%qs在 gimple 流中不被支持"
#: omp-low.c:2351 omp-low.c:2364
#, fuzzy, gcc-internal-format
-#| msgid "%<#pragma omp section%> may only be used in %<#pragma omp sections%> construct"
msgid "%<#pragma omp cancel sections%> inside %<nowait%> sections construct"
msgstr "%<#pragma omp section%>只能用在%<#pragma omp sections%>结构中"
#: omp-low.c:2378
#, fuzzy, gcc-internal-format
-#| msgid "invalid PHI argument"
msgid "invalid arguments"
msgstr "无效的 PHI 实参"
#: omp-low.c:2492
#, fuzzy, gcc-internal-format
-#| msgid "master region may not be closely nested inside of work-sharing or explicit task region"
msgid "teams construct not closely nested inside of target region"
msgstr "主要区域不可以紧密嵌套在工作共享或显式的任务区域内"
#: omp-low.c:10275
#, fuzzy, gcc-internal-format
-#| msgid "invalid entry to OpenMP structured block"
msgid "invalid entry to Cilk Plus structured block"
msgstr "OpenMP 结构块入口无效"
#: omp-low.c:10283
#, fuzzy, gcc-internal-format
-#| msgid "invalid branch to/from an OpenMP structured block"
msgid "invalid branch to/from a Cilk Plus structured block"
msgstr "进出 OpenMP 结构块的分支无效"
#: omp-low.c:10761
#, fuzzy, gcc-internal-format
-#| msgid "ignoring duplicate directory \"%s\"\n"
msgid "ignoring large linear step"
msgstr "忽略重复的目录“%s”\n"
#: opts.c:695
#, fuzzy, gcc-internal-format
-#| msgid "-static-libgfortran is not supported in this configuration"
msgid "transactional memory is not supported with non-call exceptions"
msgstr "-static-libgfortran 在此配置下不受支持"
#: passes.c:107
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "%s does not support split_edge"
msgid "pass %s does not support cloning"
msgstr "%s 不支持 split_edge"
#: passes.c:999
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "unknown field %qE specified in initializer"
msgid "unknown pass %s specified in -fenable"
msgstr "初始值设定项里有未知的字段%qE"
#: passes.c:1001
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "unknown field %qE specified in initializer"
msgid "unknown pass %s specified in -fdisable"
msgstr "初始值设定项里有未知的字段%qE"
#: passes.c:1065 passes.c:1093
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "invalid floating point option: -mfpu=%s"
msgid "Invalid range %s in option %s"
msgstr "无效的浮点选项:-mfpu=%s"
#: passes.c:1111
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "invalid storage class for function %qE"
msgid "enable pass %s for function %s"
msgstr "函数%qE存储类无效"
#: passes.c:1122
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "invalid storage class for function %qE"
msgid "disable pass %s for function %s"
msgstr "函数%qE存储类无效"
#: predict.c:2805
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Missing argument list in function '%s' at %C"
msgid "Missing counts for called function %s/%i"
msgstr "函数‘%s’在%C处缺少参数列表"
#: reginfo.c:770
#, fuzzy, gcc-internal-format
-#| msgid "register used for two global register variables"
msgid "register of %qD used for multiple global register variables"
msgstr "寄存器用作两个全局寄存器变量"
#: reginfo.c:773
#, fuzzy, gcc-internal-format
-#| msgid " conflict with %q+D"
msgid "conflicts with %qD"
msgstr " 与%q+D冲突"
#: symtab.c:736
#, fuzzy, gcc-internal-format
-#| msgid "function returning a function"
msgid "function symbol is not function"
msgstr "函数返回了一个函数"
#: symtab.c:744
#, fuzzy, gcc-internal-format
-#| msgid "array is not addressable"
msgid "variable symbol is not variable"
msgstr "数组不能被取指"
#: symtab.c:750
#, fuzzy, gcc-internal-format
-#| msgid "node has wrong clone list"
msgid "node has unknown type"
msgstr "节点的克隆列表不正确"
#: symtab.c:759
#, fuzzy, gcc-internal-format
-#| msgid "node not found in cgraph_hash"
msgid "node not found in symtab decl hashtable"
msgstr "cgraph_hash 中找不到节点"
#: symtab.c:790
#, fuzzy, gcc-internal-format
-#| msgid "node not found in cgraph_hash"
msgid "node not found in symtab assembler name hash"
msgstr "cgraph_hash 中找不到节点"
#: symtab.c:797
#, fuzzy, gcc-internal-format
-#| msgid "double linked list of clones corrupted"
msgid "double linked list of assembler names corrupted"
msgstr "双向克隆链接列表已损坏"
#: symtab.c:802
#, fuzzy, gcc-internal-format
-#| msgid "node is in clone list but it is not clone"
msgid "node is analyzed byt it is not a definition"
msgstr "节点在克隆列表中,但并不是克隆"
#: symtab.c:813
#, fuzzy, gcc-internal-format
-#| msgid "node is in clone list but it is not clone"
msgid "node is alias but not definition"
msgstr "节点在克隆列表中,但并不是克隆"
#: symtab.c:832
#, fuzzy, gcc-internal-format
-#| msgid "Combining units with different profiles is not supported."
msgid "mixing different types of symbol in same comdat groups is not supported"
msgstr "不支持组合有不同取样信息的单元。"
#: symtab.c:885
#, fuzzy, gcc-internal-format
-#| msgid "verify_cgraph_node failed"
msgid "verify_symtab_node failed"
msgstr "verify_cgraph_node 失败"
#: symtab.c:1110
#, fuzzy, gcc-internal-format
-#| msgid "function %q+D redeclared as inline"
msgid "function %q+D part of alias cycle"
msgstr "函数%q+D重声明为内联的"
#: tlink.c:489
#, fuzzy, gcc-internal-format
-#| msgid "removing .rpo file"
msgid "removing .rpo file: %m"
msgstr "删除 .rpo 文件"
#: tlink.c:491
#, fuzzy, gcc-internal-format
-#| msgid "renaming .rpo file"
msgid "renaming .rpo file: %m"
msgstr "重命名 .rpo 文件"
#: toplev.c:989
#, fuzzy, gcc-internal-format
-#| msgid "-fstack-usage not supported for this target"
msgid "stack usage computation not supported for this target"
msgstr "-fstack-usage 在此目标机上不受支持"
#: toplev.c:1060
#, fuzzy, gcc-internal-format
-#| msgid "stackframe too big: %d bytes"
msgid "stack usage might be %wd bytes"
msgstr "栈帧太大:%d 字节"
#: toplev.c:1063
#, fuzzy, gcc-internal-format
-#| msgid "stackframe too big: %d bytes"
msgid "stack usage is %wd bytes"
msgstr "栈帧太大:%d 字节"
#: toplev.c:1559
#, fuzzy, gcc-internal-format
-#| msgid "-fdata-sections not supported for this target"
msgid "-fsanitize=address not supported for this target"
msgstr "-fdata-sections 在此目标机上不受支持"
#: trans-mem.c:614
#, fuzzy, gcc-internal-format
-#| msgid "invalid use of %qD in linkage specification"
msgid "invalid volatile use of %qD inside transaction"
msgstr "指定链接时使用%qD无效"
#: trans-mem.c:725
#, fuzzy, gcc-internal-format
-#| msgid "indirect function call with a yet undetermined callee"
msgid "unsafe indirect function call within atomic transaction"
msgstr "间接函数调用目标未定义"
#: trans-mem.c:743
#, fuzzy, gcc-internal-format
-#| msgid "indirect function call with a yet undetermined callee"
msgid "unsafe indirect function call within %<transaction_safe%> function"
msgstr "间接函数调用目标未定义"
#: trans-mem.c:758 trans-mem.c:4721
#, fuzzy, gcc-internal-format
-#| msgid "namespace %qD not allowed in using-declaration"
msgid "asm not allowed in atomic transaction"
msgstr "不允许在 using 声明中使用命名空间%qD"
#: trans-mem.c:761
#, fuzzy, gcc-internal-format
-#| msgid "attributes are not allowed on a function-definition"
msgid "asm not allowed in %<transaction_safe%> function"
msgstr "函数定义中不允许有属性"
#: trans-mem.c:772
#, fuzzy, gcc-internal-format
-#| msgid "Place each function into its own section"
msgid "relaxed transaction in atomic transaction"
msgstr "将每个函数分别放在它们各自的节中"
#: trans-mem.c:782
#, fuzzy, gcc-internal-format
-#| msgid "pointer to a function used in subtraction"
msgid "outer transaction in transaction"
msgstr "函数指针不能相减"
#: trans-mem.c:4348
#, fuzzy, gcc-internal-format
-#| msgid "attributes are not allowed on a function-definition"
msgid "%Kasm not allowed in %<transaction_safe%> function"
msgstr "函数定义中不允许有属性"
#: tree-cfg.c:2836
#, fuzzy, gcc-internal-format
-#| msgid "invalid position or size operand to BIT_FIELD_REF"
msgid "position plus size exceeds size of referenced object in BIT_FIELD_REF"
msgstr "BIT_FIELD_REF 位置或大小操作数无效"
#: tree-cfg.c:3333
#, fuzzy, gcc-internal-format
-#| msgid "type mismatch in comparison expression"
msgid "mismatching comparison operand types"
msgstr "比较表达式类型不匹配"
#: tree-cfg.c:3347
#, fuzzy, gcc-internal-format
-#| msgid "function returning a function"
msgid "vector comparison returning a boolean"
msgstr "函数返回了一个函数"
#: tree-cfg.c:3361
#, fuzzy, gcc-internal-format
-#| msgid "invalid operands in gimple comparison"
msgid "non-vector operands in vector comparison"
msgstr "gimple 比较中操作数无效"
#: tree-cfg.c:3374
#, fuzzy, gcc-internal-format
-#| msgid "invalid vector permutation constant"
msgid "invalid vector comparison resulting type"
msgstr "无效的向量置换常量"
#: tree-cfg.c:3381
#, fuzzy, gcc-internal-format
-#| msgid "Warn about comparison of different enum types"
msgid "bogus comparison result type"
msgstr "对不同枚举类型之间的比较给出警告"
#: tree-cfg.c:3660 tree-cfg.c:3681
#, fuzzy, gcc-internal-format
-#| msgid "type mismatch in vector shift expression"
msgid "type mismatch in widening vector shift expression"
msgstr "向量移位表达式类型不匹配"
#: tree-cfg.c:3900
#, fuzzy, gcc-internal-format
-#| msgid "type mismatch in vector shift expression"
msgid "type mismatch in vector permute expression"
msgstr "向量移位表达式类型不匹配"
#: tree-cfg.c:3912
#, fuzzy, gcc-internal-format
-#| msgid "expected integer expression"
msgid "vector types expected in vector permute expression"
msgstr "需要整数表达式"
#: tree-cfg.c:3939
#, fuzzy, gcc-internal-format
-#| msgid "invalid increment expression"
msgid "invalid mask type in vector permute expression"
msgstr "无效的自增语句"
#: tree-cfg.c:4268
#, fuzzy, gcc-internal-format
-#| msgid "invalid operand to switch statement"
msgid "non-integral type switch statement"
msgstr "开关语句操作数无效"
#: tree-cfg.c:4276
#, fuzzy, gcc-internal-format
-#| msgid "%<default%> label not within a switch statement"
msgid "invalid default case label in switch statement"
msgstr "%<default%>标号未出现在 switch 语句内"
#: tree-cfg.c:4288
#, fuzzy, gcc-internal-format
-#| msgid "case label not within a switch statement"
msgid "invalid case label in switch statement"
msgstr "case 标号出现在开关语句外"
#: tree-cfg.c:4295
#, fuzzy, gcc-internal-format
-#| msgid "invalid operand to switch statement"
msgid "invalid case range in switch statement"
msgstr "开关语句操作数无效"
#: tree-cfg.c:4305
#, fuzzy, gcc-internal-format
-#| msgid "case label not within a switch statement"
msgid "type mismatch for case label in switch statement"
msgstr "case 标号出现在开关语句外"
#: tree-cfg.c:4315
#, fuzzy, gcc-internal-format
-#| msgid "case label not within a switch statement"
msgid "type precision mismatch in switch statement"
msgstr "case 标号出现在开关语句外"
#: tree-cfg.c:4324
#, fuzzy, gcc-internal-format
-#| msgid "case label not within a switch statement"
msgid "case labels not sorted in switch statement"
msgstr "case 标号出现在开关语句外"
#: tree-cfg.c:4816
#, fuzzy, gcc-internal-format
-#| msgid "from this location"
msgid "PHI node with location"
msgstr "从这个地方"
#: tree-diagnostic.c:203
#, fuzzy, gcc-internal-format
-#| msgid "redefinition of %q+D"
msgid "in definition of macro %qs"
msgstr "%q+D重定义"
#: tree-diagnostic.c:220
#, fuzzy, gcc-internal-format
-#| msgid "%s:%d: in constexpr expansion of %qs"
msgid "in expansion of macro %qs"
msgstr "%s:%d:在%qs的广义常表达式扩展中"
#: tree-inline.c:4147
#, fuzzy, gcc-internal-format
-#| msgid "inlining failed in call to %q+F: %s"
msgid "inlining failed in call to always_inline %q+F: %s"
msgstr "调用%q+F时内联失败:%s"
#: tree-ssa-loop-niter.c:2632
#, fuzzy, gcc-internal-format
-#| msgid "operation on %qE may be undefined"
msgid "iteration %E invokes undefined behavior"
msgstr "%qE上的运算结果可能是未定义的"
#: tree-ssa-operands.c:1001
#, fuzzy, gcc-internal-format
-#| msgid "invalid operand in return statement"
msgid "virtual def operand missing for stmt"
msgstr "返回语句操作数无效"
#: tree-ssa-operands.c:1042
#, fuzzy, gcc-internal-format
-#| msgid "operand number missing after %%-letter"
msgid "use operand missing for stmt"
msgstr "%% 字母后缺少操作数号"
#: tree-ssa-uninit.c:238
#, fuzzy, gcc-internal-format
-#| msgid "%qD is used uninitialized in this function"
msgid "%qE is used uninitialized in this function"
msgstr "此函数中的%qD在使用前未初始化"
#: tree-ssa-uninit.c:243
#, fuzzy, gcc-internal-format
-#| msgid "%qD may be used uninitialized in this function"
msgid "%qE may be used uninitialized in this function"
msgstr "此函数中的%qD在使用前可能未初始化"
#: tree-streamer-out.c:510
#, fuzzy, gcc-internal-format
-#| msgid "gimple bytecode streams do not support machine specific builtin functions on this target"
msgid "tree bytecode streams do not support machine specific builtin functions on this target"
msgstr "GIMPLE 字节码流在此目标机上不支持机器相关的内建函数"
#: tree.c:12081
#, fuzzy
-#| msgid "%qD is deprecated (declared at %s:%d): %s"
msgid "%qD is deprecated (declared at %r%s:%d%R): %s"
msgstr "不建议使用%qD(声明于 %s:%d):%s"
#: tree.c:12085
#, fuzzy
-#| msgid "%qD is deprecated (declared at %s:%d)"
msgid "%qD is deprecated (declared at %r%s:%d%R)"
msgstr "不建议使用%qD(声明于 %s:%d)"
#: tree.c:12110
#, fuzzy
-#| msgid "%qE is deprecated (declared at %s:%d): %s"
msgid "%qE is deprecated (declared at %r%s:%d%R): %s"
msgstr "不建议使用%qE(声明于 %s:%d):%s"
#: tree.c:12114
#, fuzzy
-#| msgid "%qE is deprecated (declared at %s:%d)"
msgid "%qE is deprecated (declared at %r%s:%d%R)"
msgstr "不建议使用%qE(声明于 %s:%d)"
#: tree.c:12121
#, fuzzy
-#| msgid "type is deprecated (declared at %s:%d): %s"
msgid "type is deprecated (declared at %r%s:%d%R): %s"
msgstr "不建议使用类型(声明于 %s:%d):%s"
#: tree.c:12125
#, fuzzy
-#| msgid "type is deprecated (declared at %s:%d)"
msgid "type is deprecated (declared at %r%s:%d%R)"
msgstr "不建议使用类型(声明于 %s:%d)"
#: varasm.c:319
#, fuzzy, gcc-internal-format
-#| msgid "%+D causes a section type conflict"
msgid "%+D causes a section type conflict with %D"
msgstr "%+D 导致一个节类型冲突"
#: varasm.c:322
#, fuzzy, gcc-internal-format
-#| msgid " conflict with %q+D"
msgid "section type conflict with %D"
msgstr " 与%q+D冲突"
#: varasm.c:329
#, fuzzy, gcc-internal-format
-#| msgid "%+D causes a section type conflict"
msgid "section type conflict"
msgstr "%+D 导致一个节类型冲突"
#: varasm.c:977
#, fuzzy, gcc-internal-format
-#| msgid "alignment of %q+D is greater than maximum object file alignment. Using %d"
msgid "alignment of %q+D is greater than maximum object file alignment %d"
msgstr "%q+D的对齐要求大于目标文件的最大对齐边界。使用 %d"
#: varasm.c:1295
#, fuzzy, gcc-internal-format
-#| msgid "register specified for %q+D isn%'t suitable for data type"
msgid "the register specified for %q+D cannot be accessed by the current target"
msgstr "为%q+D指定的寄存器不适合此数据类型"
#: varasm.c:1298
#, fuzzy, gcc-internal-format
-#| msgid "register used for two global register variables"
msgid "the register specified for %q+D is not general enough to be used as a register variable"
msgstr "寄存器用作两个全局寄存器变量"
#: varasm.c:5600
#, fuzzy, gcc-internal-format
-#| msgid "nested functions not supported on this target"
msgid "ifunc is not supported on this target"
msgstr "嵌套函数在此目标机上不受支持"
#: c-family/array-notation-common.c:70
#, fuzzy, gcc-internal-format
-#| msgid "case label is not an integer constant expression"
msgid "__sec_implicit_index parameter must be an integer constant expression"
msgstr "case 标号不是一个整数常量表达式"
#: c-family/array-notation-common.c:106
#, fuzzy, gcc-internal-format
-#| msgid "type mismatch in shift expression"
msgid "length mismatch in expression"
msgstr "移位表达式类型不匹配"
#: c-family/array-notation-common.c:278 c-family/array-notation-common.c:306
#: c/c-array-notation.c:721 cp/cp-array-notation.c:610
#, fuzzy, gcc-internal-format
-#| msgid "comparison between %qT and %qT"
msgid "rank mismatch between %qE and %qE"
msgstr "在%qT和%qT间比较"
#. may lie in the original expression.
#: c-family/array-notation-common.c:287
#, fuzzy, gcc-internal-format
-#| msgid "type mismatch in shift expression"
msgid "rank mismatch in expression %qE"
msgstr "移位表达式类型不匹配"
#: c-family/c-cilkplus.c:39
#, fuzzy, gcc-internal-format
-#| msgid "iteration variable %qE should be private"
msgid "iteration variable cannot be volatile"
msgstr "迭代变量%qE应当是私有的"
#: c-family/c-cilkplus.c:82
#, fuzzy, gcc-internal-format
-#| msgid "%qE appears more than once in data clauses"
msgid "variable appears in more than one clause"
msgstr "%qE在数据子句中多次出现"
#: c-family/c-cilkplus.c:84
#, fuzzy, gcc-internal-format
-#| msgid "struct defined here"
msgid "other clause defined here"
msgstr "结构在此定义"
#: c-family/c-common.c:2333
#, fuzzy, gcc-internal-format
-#| msgid "the last argument must be an 8-bit immediate"
msgid "__builtin_shuffle last argument must be an integer vector"
msgstr "最后一个实参必须是一个 8 位立即数"
#: c-family/c-common.c:2342
#, fuzzy, gcc-internal-format
-#| msgid "%<__builtin_longjmp%> second argument must be 1"
msgid "__builtin_shuffle arguments must be vectors"
msgstr "%<__builtin_longjmp%>的第二个实参必须是 1"
#: c-family/c-common.c:4958
#, fuzzy, gcc-internal-format
-#| msgid "ISO C++ does not allow %<alignof%> with a non-type"
msgid "ISO C++ does not permit %<alignof%> applied to a function type"
msgstr "ISO C++ 不允许对非类型使用%<alignof%>"
#: c-family/c-common.c:4961
#, fuzzy, gcc-internal-format
-#| msgid "ISO C++ does not allow %<alignof%> with a non-type"
msgid "ISO C does not permit %<_Alignof%> applied to a function type"
msgstr "ISO C++ 不允许对非类型使用%<alignof%>"
#: c-family/c-common.c:4981
#, fuzzy, gcc-internal-format
-#| msgid "invalid application of %qs to incomplete type %qT "
msgid "invalid application of %qs to incomplete type %qT"
msgstr "%qs不能用于不完全的类型%qT"
#: c-family/c-common.c:4989
#, fuzzy, gcc-internal-format
-#| msgid "invalid application of %qs to incomplete type %qT "
msgid "invalid application of %qs to array type %qT of incomplete element type"
msgstr "%qs不能用于不完全的类型%qT"
#: c-family/c-common.c:7417
#, fuzzy, gcc-internal-format
-#| msgid "requested alignment is not a constant"
msgid "requested alignment is not an integer constant"
msgstr "要求的对齐边界不是常量"
#: c-family/c-common.c:7425
#, fuzzy, gcc-internal-format
-#| msgid "requested alignment is not a power of 2"
msgid "requested alignment is not a positive power of 2"
msgstr "要求的对齐边界不是 2 的某次方"
#: c-family/c-common.c:7513
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "requested alignment is too large"
msgid "requested alignment %d is larger than %d"
msgstr "要求的对齐边界太大"
#: c-family/c-common.c:8190
#, fuzzy, gcc-internal-format
-#| msgid "%qE attribute ignored"
msgid "%qE attribute duplicated"
msgstr "%qE属性被忽略"
#: c-family/c-common.c:8192
#, fuzzy, gcc-internal-format
-#| msgid "%qE attribute ignored for %qE"
msgid "%qE attribute follows %qE"
msgstr "%qE属性为%qE所忽略"
#: c-family/c-common.c:8291
#, fuzzy, gcc-internal-format
-#| msgid "previously declared here"
msgid "type was previously declared %qE"
msgstr "以前在此声明过"
#: c-family/c-common.c:8344
#, fuzzy, gcc-internal-format
-#| msgid "cleanup argument not an identifier"
msgid "%qE argument not an identifier"
msgstr "cleanup 实参不是一个标识符"
#: c-family/c-common.c:8355
#, fuzzy, gcc-internal-format
-#| msgid "%qD is not declared in %qD"
msgid "%qD is not compatible with %qD"
msgstr "%qD未在%qD中声明"
#: c-family/c-common.c:8358
#, fuzzy, gcc-internal-format
-#| msgid "cleanup argument not a function"
msgid "transaction_wrap argument is not a function"
msgstr "cleanup 实参不是一个函数"
#: c-family/c-common.c:9343
#, fuzzy, gcc-internal-format
-#| msgid "non-const integer argument %u in call to function %qE"
msgid "non-integer argument 3 in call to function %qE"
msgstr "给予函数%2$qE的参数%1$u不是整型常量"
#: c-family/c-common.c:9932
#, fuzzy, gcc-internal-format
-#| msgid "invalid type argument of %<->%> (have %qT)"
msgid "invalid type argument of %<->*%> (have %qT)"
msgstr "%<->%>参数类型无效(有%qT)"
#: c-family/c-common.c:10277
#, fuzzy, gcc-internal-format
-#| msgid "not enough arguments to function %qE"
msgid "incorrect number of arguments to function %qE"
msgstr "提供给函数%qE的实参太少"
#: c-family/c-common.c:10285
#, fuzzy, gcc-internal-format
-#| msgid "argument %d of %qE must be an address"
msgid "argument 1 of %qE must be a non-void pointer type"
msgstr "%2$qE的实参 %1$d 必须是地址"
#: c-family/c-common.c:10294
#, fuzzy, gcc-internal-format
-#| msgid "%Kfirst argument of %D must be a pointer, second integer constant"
msgid "argument 1 of %qE must be a pointer to a constant size type"
msgstr "%K%D 的第一个实参必须是一个指针,第二个必须是整常量"
#: c-family/c-common.c:10305
#, fuzzy, gcc-internal-format
-#| msgid "%Kfirst argument of %D must be a pointer, second integer constant"
msgid "argument 1 of %qE must be a pointer to a nonzero size object"
msgstr "%K%D 的第一个实参必须是一个指针,第二个必须是整常量"
#: c-family/c-common.c:10320
#, fuzzy, gcc-internal-format
-#| msgid "argument %d of %qE must be an address"
msgid "argument %d of %qE must be a pointer type"
msgstr "%2$qE的实参 %1$d 必须是地址"
#: c-family/c-common.c:10327
#, fuzzy, gcc-internal-format
-#| msgid "Type/rank mismatch in argument '%s' at %L"
msgid "size mismatch in argument %d of %qE"
msgstr "%2$L处实参‘%1$s’类型/秩不匹配"
#: c-family/c-common.c:10343
#, fuzzy, gcc-internal-format
-#| msgid "incompatible type for argument %d of %qE"
msgid "invalid memory model argument %d of %qE"
msgstr "%2$qE的第 %1$d 个实参类型不兼容"
#: c-family/c-common.c:10350
#, fuzzy, gcc-internal-format
-#| msgid "incompatible type for argument %d of %qE"
msgid "non-integer memory model argument %d of %qE"
msgstr "%2$qE的第 %1$d 个实参类型不兼容"
#: c-family/c-common.c:11454
#, fuzzy, gcc-internal-format
-#| msgid "%q+D defined but not used"
msgid "typedef %qD locally defined but not used"
msgstr "%q+D定义后未使用"
#: c-family/c-common.c:11733 c-family/c-common.c:11783
#: c-family/c-common.c:11798 cp/call.c:4493 cp/call.c:4500
#, fuzzy, gcc-internal-format
-#| msgid "conversion from %qT to %qT is ambiguous"
msgid "conversion of scalar %qT to vector %qT involves truncation"
msgstr "从%qT到%qT的转换有歧义"
#: c-family/c-omp.c:976
#, fuzzy, gcc-internal-format
-#| msgid "%qE is not a function name"
msgid "%qD is not an function argument"
msgstr "%qE不是一个函数名"
#: c-family/c-opts.c:924
#, fuzzy, gcc-internal-format
-#| msgid "nested functions not supported on this target"
msgid "external TLS initialization functions not supported on this target"
msgstr "嵌套函数在此目标机上不受支持"
#: c-family/cilk.c:93 cp/parser.c:5784
#, fuzzy, gcc-internal-format
-#| msgid "%<friend%> can only be specified inside a class"
msgid "%<_Cilk_spawn%> may only be used inside a function"
msgstr "%<friend%>只能在类中指定"
#: c-family/cilk.c:107
#, fuzzy, gcc-internal-format
-#| msgid "virtual functions cannot be friends"
msgid "only function calls can be spawned"
msgstr "虚函数不能是友元"
#: c-family/cilk.c:356
#, fuzzy, gcc-internal-format
-#| msgid "address of explicit register variable %qD requested"
msgid "explicit register variable %qD may not be modified in spawn"
msgstr "要求显式寄存器变量%qD的地址。"
#: c-family/cilk.c:436
#, fuzzy, gcc-internal-format
-#| msgid "invalid use of %qD in linkage specification"
msgid "invalid use of label %q+D in %<_Cilk_spawn%>"
msgstr "指定链接时使用%qD无效"
#: common/config/arc/arc-common.c:80
#, fuzzy, gcc-internal-format
-#| msgid "multiple function type attributes specified"
msgid "multiple -mcpu= options specified."
msgstr "指定了多个函数类型属性"
#: common/config/i386/i386-common.c:764
#, fuzzy, gcc-internal-format
-#| msgid "%salign-loops%s is obsolete, use -falign-loops%s"
msgid "-malign-loops is obsolete, use -falign-loops"
msgstr "%salign-loops%s 已经过时,请使用 -falign-loops%s"
#: common/config/i386/i386-common.c:766
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "%salign-loops=%d%s is not between 0 and %d"
msgid "-malign-loops=%d is not between 0 and %d"
msgstr "%salign-loops=%d%s 不在 0 和 %d 之间"
#: common/config/i386/i386-common.c:773
#, fuzzy, gcc-internal-format
-#| msgid "%salign-jumps%s is obsolete, use -falign-jumps%s"
msgid "-malign-jumps is obsolete, use -falign-jumps"
msgstr "%salign-jumps%s 已经过时,请使用 -falign-jumps%s"
#: common/config/i386/i386-common.c:775
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "%salign-loops=%d%s is not between 0 and %d"
msgid "-malign-jumps=%d is not between 0 and %d"
msgstr "%salign-loops=%d%s 不在 0 和 %d 之间"
#: common/config/i386/i386-common.c:783
#, fuzzy, gcc-internal-format
-#| msgid "%salign-functions%s is obsolete, use -falign-functions%s"
msgid "-malign-functions is obsolete, use -falign-functions"
msgstr "%salign-functions%s 已过时,请使用 -falign-functions%s"
#: common/config/i386/i386-common.c:785
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "%salign-loops=%d%s is not between 0 and %d"
msgid "-malign-functions=%d is not between 0 and %d"
msgstr "%salign-loops=%d%s 不在 0 和 %d 之间"
#: common/config/i386/i386-common.c:794
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "%sbranch-cost=%d%s is not between 0 and 5"
msgid "-mbranch-cost=%d is not between 0 and 5"
msgstr "%sbranch-cost=%d%s不在 0 和 5 之间"
#: common/config/rx/rx-common.c:63
#, fuzzy, gcc-internal-format
-#| msgid "the RX200 cpu does not have FPU hardware"
msgid "the RX100 cpu does not have FPU hardware"
msgstr "RX200 CPU 没有 FPU 硬件"
#: common/config/v850/v850-common.c:47
#, fuzzy, gcc-internal-format
-#| msgid "value passed to %<-m%s%> is too large"
msgid "value passed in %qs is too large"
msgstr "传递给%<-m%s%>的值太大"
#: config/darwin.c:2738
#, fuzzy, gcc-internal-format
-#| msgid "visibility attribute not supported in this configuration; ignored"
msgid "protected visibility attribute not supported in this configuration; ignored"
msgstr "可见性属性在此配置下不受支持;已忽略"
#: config/darwin.c:3096
#, fuzzy, gcc-internal-format
-#| msgid "%<-fobjc-abi-version%> >= 2 is only supported on %<-m64%> targets for %<-fnext-runtime%>"
msgid "%<-fobjc-abi-version%> >= 2 must be used for %<-m64%> targets with %<-fnext-runtime%>"
msgstr "%<-fobjc-abi-version%> >= 2 只在%<-m64%>目标下支持%<-fnext-runtime%>"
#: config/darwin.c:3100
#, fuzzy, gcc-internal-format
-#| msgid "%<-fobjc-abi-version%> >= 2 is only supported on %<-m64%> targets for %<-fnext-runtime%>"
msgid "%<-fobjc-abi-version%> >= 2 is not supported on %<-m32%> targets with %<-fnext-runtime%>"
msgstr "%<-fobjc-abi-version%> >= 2 只在%<-m64%>目标下支持%<-fnext-runtime%>"
#: config/darwin.c:3185
#, fuzzy, gcc-internal-format
-#| msgid "-mdynamic-no-pic overrides -fpic or -fPIC"
msgid "%<-mdynamic-no-pic%> overrides %<-fpic%>, %<-fPIC%>, %<-fpie%> or %<-fPIE%>"
msgstr "-mdynamic-no-pic 覆盖了 -fpic 或 -fPIC"
#: config/aarch64/aarch64-builtins.c:817
#, fuzzy, gcc-internal-format
-#| msgid "incompatible type for argument %d of %qE"
msgid "incompatible type for argument %d, expected %<const int%>"
msgstr "%2$qE的第 %1$d 个实参类型不兼容"
#: config/aarch64/aarch64.c:5041
#, fuzzy, gcc-internal-format
-#| msgid "missing filename after %qs"
msgid "missing feature modifier after %qs"
msgstr "%qs后缺少文件名"
#. Extension not found in list.
#: config/aarch64/aarch64.c:5062
#, fuzzy, gcc-internal-format
-#| msgid "unknown TLS model %qs"
msgid "unknown feature modifier %qs"
msgstr "未知的 TLS 模型%qs"
#: config/aarch64/aarch64.c:5093
#, fuzzy, gcc-internal-format
-#| msgid "missing path after %qs"
msgid "missing arch name in -march=%qs"
msgstr "%qs后缺少路径"
#. ARCH name not found in list.
#: config/aarch64/aarch64.c:5125
#, fuzzy, gcc-internal-format
-#| msgid "unknown value %s for -mfpu"
msgid "unknown value %qs for -march"
msgstr "-mfpu 的值 %s 未知"
#: config/aarch64/aarch64.c:5150
#, fuzzy, gcc-internal-format
-#| msgid "missing path after %qs"
msgid "missing cpu name in -mcpu=%qs"
msgstr "%qs后缺少路径"
#. CPU name not found in list.
#: config/aarch64/aarch64.c:5174
#, fuzzy, gcc-internal-format
-#| msgid "unknown value %s for -mfpu"
msgid "unknown value %qs for -mcpu"
msgstr "-mfpu 的值 %s 未知"
#. CPU name not found in list.
#: config/aarch64/aarch64.c:5198
#, fuzzy, gcc-internal-format
-#| msgid "unknown value %s for -mfpu"
msgid "unknown value %qs for -mtune"
msgstr "-mfpu 的值 %s 未知"
#: config/aarch64/aarch64.c:5234
#, fuzzy, gcc-internal-format
-#| msgid "does not support multilib"
msgid "Assembler does not support -mabi=ilp32"
msgstr "不支持 multilib"
#: config/aarch64/aarch64.c:5611 config/aarch64/aarch64.c:5719
#: config/aarch64/aarch64.c:5958
#, fuzzy, gcc-internal-format
-#| msgid "Use hardware floating point instructions"
msgid "%qs and floating point or vector arguments"
msgstr "使用硬件浮点指令"
#: config/aarch64/aarch64.c:6830
#, fuzzy, gcc-internal-format
-#| msgid "operand number out of range"
msgid "lane out of range"
msgstr "操作数号超出范围"
#: config/aarch64/aarch64.c:6840
#, fuzzy, gcc-internal-format
-#| msgid "constant argument out of range for %qs"
msgid "constant out of range"
msgstr "常量实参超过%qs的范围"
#: config/arc/arc.c:738
#, fuzzy, gcc-internal-format
-#| msgid "-mrelax is only supported for RTP PIC"
msgid "-mmul64 not supported for ARC700"
msgstr "-mrelax 只在 RTP PIC 上受支持"
#: config/arc/arc.c:1230
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "multiple function type attributes specified"
msgid "multiply option implies r%d is fixed"
msgstr "指定了多个函数类型属性"
#: config/arc/arc.c:5373
#, fuzzy, gcc-internal-format
-#| msgid "%<__builtin_next_arg%> called without an argument"
msgid "__builtin_arc_aligned with non-constant alignment"
msgstr "调用%<__builtin_next_arg%>时没有给定实参"
#: config/arc/arc.c:5381
#, fuzzy, gcc-internal-format
-#| msgid "invalid argument to %<__builtin_frame_address%>"
msgid "invalid alignment value for __builtin_arc_aligned"
msgstr "%<__builtin_frame_address%>的实参无效"
#: config/arc/arc.c:6206
#, fuzzy, gcc-internal-format
-#| msgid "Bad address, not register:"
msgid "insn addresses not freed"
msgstr "错误的地址,不是寄存器:"
#: config/arm/arm.c:2571
#, fuzzy, gcc-internal-format
-#| msgid "-fPIC and -G are incompatible"
msgid "iWMMXt and NEON are incompatible"
msgstr "-fPIC 与 -G 互不兼容"
#: config/arm/arm.c:2638
#, fuzzy, gcc-internal-format
-#| msgid "structure size boundary can only be set to %s"
msgid "structure size boundary can only be set to 8, 32 or 64"
msgstr "结构大小边界只能被设定为 %s"
#: config/arm/arm.c:2640
#, fuzzy, gcc-internal-format
-#| msgid "structure size boundary can only be set to %s"
msgid "structure size boundary can only be set to 8 or 32"
msgstr "结构大小边界只能被设定为 %s"
#: config/arm/arm.c:2715
#, fuzzy, gcc-internal-format
-#| msgid "target CPU does not support ARM mode"
msgid "target CPU does not support unaligned accesses"
msgstr "目标 CPU 不支持 ARM 模式"
#: config/arm/arm.c:25441
#, fuzzy, gcc-internal-format
-#| msgid "%qE attribute argument should be between 0 to 255"
msgid "the range of mask should be in 0 to 255"
msgstr "%qE属性的参数应当在 0 和 255 之间"
#: config/arm/arm.c:26165
#, fuzzy, gcc-internal-format
-#| msgid "Unexpected end of module"
msgid "Unexpected thumb1 far jump"
msgstr "非预期的模块结束"
#: config/avr/avr-c.c:66 config/avr/avr-c.c:191
#, fuzzy, gcc-internal-format
-#| msgid "%qs expects a constant argument"
msgid "%qs expects 1 argument but %d given"
msgstr "%qs需要一个常量实参"
#: config/avr/avr-c.c:77
#, fuzzy, gcc-internal-format
-#| msgid "%qs expects a constant argument"
msgid "%qs expects a fixed-point value as argument"
msgstr "%qs需要一个常量实参"
#: config/avr/avr-c.c:108 config/avr/avr-c.c:174 config/avr/avr-c.c:231
#, fuzzy, gcc-internal-format
-#| msgid "no matching template for %qD found"
msgid "no matching fixed-point overload found for %qs"
msgstr "没有找到与%qD匹配的模板"
#: config/avr/avr-c.c:125
#, fuzzy, gcc-internal-format
-#| msgid "%qs expects a constant argument"
msgid "%qs expects 2 arguments but %d given"
msgstr "%qs需要一个常量实参"
#: config/avr/avr-c.c:137 config/avr/avr-c.c:202
#, fuzzy, gcc-internal-format
-#| msgid "%qs expects a constant argument"
msgid "%qs expects a fixed-point value as first argument"
msgstr "%qs需要一个常量实参"
#: config/avr/avr-c.c:145
#, fuzzy, gcc-internal-format
-#| msgid "%qs expects a constant argument"
msgid "%qs expects an integer value as second argument"
msgstr "%qs需要一个常量实参"
#: config/avr/avr.c:322
#, fuzzy, gcc-internal-format
-#| msgid "-fpic is not supported"
msgid "-fpie is not supported"
msgstr "不支持 -fpic"
#: config/avr/avr.c:324
#, fuzzy, gcc-internal-format
-#| msgid "-fPIC is not supported"
msgid "-fPIE is not supported"
msgstr "不支持 -fPIC"
#: config/avr/avr.c:586
#, fuzzy, gcc-internal-format
-#| msgid "-flto and -fwhopr are mutually exclusive"
msgid "function attributes %qs, %qs and %qs are mutually exclusive"
msgstr "-flto and -fwhopr 互斥"
#: config/avr/avr.c:616
#, fuzzy, gcc-internal-format
-#| msgid "%qD cannot have default arguments"
msgid "%qs function cannot have arguments"
msgstr "%qD不能有默认参数"
#: config/avr/avr.c:619
#, fuzzy, gcc-internal-format
-#| msgid "functions cannot return __fp16 type"
msgid "%qs function cannot return a value"
msgstr "函数不能返回 __fp16 类型"
#: config/avr/avr.c:626
#, fuzzy, gcc-internal-format
-#| msgid "%qs appears to be a misspelled signal handler"
msgid "%qs appears to be a misspelled %s handler"
msgstr "%qs似乎是一个拼写错的信号处理者"
#: config/avr/avr.c:856
#, fuzzy, gcc-internal-format
-#| msgid "'builtin_return_address' contains only 2 bytes of address"
msgid "%<builtin_return_address%> contains only 2 bytes of address"
msgstr "‘builtin_return_address’只包含两字节地址"
#: config/avr/avr.c:2241
#, fuzzy, gcc-internal-format
-#| msgid "accessing program memory with data memory address"
msgid "accessing program memory with data memory address"
msgstr "用数据内存地址访问程序内存"
#: config/avr/avr.c:2660
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Number of registers used to pass integer arguments"
msgid "fixed register %s used to pass parameter to function"
msgstr "用以传递整数参数的寄存器个数"
#: config/avr/avr.c:2931
#, fuzzy, gcc-internal-format
-#| msgid "conflicting named address spaces (%s vs %s)"
msgid "writing to address space %qs not supported"
msgstr "冲突的有名地址空间(%s和%s)"
#: config/avr/avr.c:8292
#, fuzzy, gcc-internal-format
-#| msgid "pointers to disjoint address spaces used in conditional expression"
msgid "pointer targeting address space %qs must be const in %qT"
msgstr "条件表达式中使用了指向不相交地址空间的指针"
#: config/avr/avr.c:8295
#, fuzzy, gcc-internal-format
-#| msgid "pointers to disjoint address spaces used in conditional expression"
msgid "pointer targeting address space %qs must be const in %s %q+D"
msgstr "条件表达式中使用了指向不相交地址空间的指针"
#: config/avr/avr.c:8597
#, fuzzy, gcc-internal-format
-#| msgid "only initialized variables can be placed into program memory area"
msgid "uninitialized variable %q+D put into program memory area"
msgstr "只有初始化的变量才能放入程序内存区"
#: config/avr/avr.c:11101
#, fuzzy, gcc-internal-format
-#| msgid "Conversion from %s to %s at %L"
msgid "conversion from address space %qs to address space %qs"
msgstr "从 %s 转换到 %s,位于 %L"
#: config/avr/avr.c:12048
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Unexpected end of module in string constant"
msgid "%s expects a compile time integer constant"
msgstr "字符串常量中出现非预期的模块结束"
#: config/avr/avr.c:12062
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "%qs expects a constant argument"
msgid "%s expects a compile time long integer constant as first argument"
msgstr "%qs需要一个常量实参"
#: config/c6x/c6x.c:238
#, fuzzy, gcc-internal-format
-#| msgid "-fPIC and -fpic are not supported for this target"
msgid "-fpic and -fPIC not supported without -mdsbt on this target"
msgstr "-fPIC 和 -fpic 不被此目标所支持"
#: config/cr16/cr16.c:299
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "invalid thread pointer option: -mtp=%s"
msgid "invalid data model option -mdata-model=%s"
msgstr "无效的线程指钟选项:-mtp=%s"
#: config/epiphany/epiphany.c:1468
#, fuzzy, gcc-internal-format
-#| msgid "stack size must be an exact power of 2"
msgid "stack_offset must be at least 4"
msgstr "栈大小必须刚好是 2 的某次方"
#: config/epiphany/epiphany.c:1470
#, fuzzy, gcc-internal-format
-#| msgid "stack size must be an exact power of 2"
msgid "stack_offset must be a multiple of 4"
msgstr "栈大小必须刚好是 2 的某次方"
#: config/h8300/h8300.c:324
#, fuzzy, gcc-internal-format
-#| msgid "-f%s not supported: ignored"
msgid "-msx is not supported in coff"
msgstr "-f%s 不受支持:已忽略"
#: config/h8300/h8300.c:352
#, fuzzy, gcc-internal-format
-#| msgid "-mn is used without -mh or -ms"
msgid "-mn is used without -mh or -ms or -msx"
msgstr "-mn 未与 -mh 或 -ms 一起使用"
#: config/h8300/h8300.c:358
#, fuzzy, gcc-internal-format
-#| msgid "-ms2600 is used without -ms"
msgid "-mexr is used without -ms"
msgstr "-ms2600 未与 -ms 一起使用"
#: config/h8300/h8300.c:364
#, fuzzy, gcc-internal-format
-#| msgid "%<__int128%> is not supported for this target"
msgid "-mint32 is not supported for H8300 and H8300L targets"
msgstr "%<__int128%>在此目标机上不受支持"
#: config/h8300/h8300.c:370
#, fuzzy, gcc-internal-format
-#| msgid "-mn is used without -mh or -ms"
msgid "-mexr is used without -ms or -msx"
msgstr "-mn 未与 -mh 或 -ms 一起使用"
#: config/i386/i386.c:2911
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "-Werror=%s: no option -%s"
msgid "wrong arg %s to option %s"
msgstr "-Werror=%s:没有选项 -%s"
#: config/i386/i386.c:2929
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "register name not specified for %q+D"
msgid "wrong stringop strategy name %s specified for option %s"
msgstr "%q+D的寄存器名无效"
#: config/i386/i386.c:2943
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "alignment may not be specified for %q+D"
msgid "unknown alignment %s specified for option %s"
msgstr "不能为%q+D指定对齐"
#: config/i386/i386.c:2962
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "no class name specified with %qs"
msgid "too many size ranges specified in option %s"
msgstr "%qs没有指定类名"
#: config/i386/i386.c:3016
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Unknown argument list function at %L"
msgid "Unknown parameter to option -mtune-ctrl: %s"
msgstr "%L处参数列表函数未知"
#: config/i386/i386.c:3424
#, fuzzy, gcc-internal-format
-#| msgid "code model %qs not supported in the %s bit mode"
msgid "address mode %qs not supported in the %s bit mode"
msgstr "代码模式%qs在 %s 位模式下不受支持"
#: config/i386/i386.c:3462 config/i386/i386.c:3474
#, fuzzy, gcc-internal-format
-#| msgid "code model %qs not supported in the %s bit mode"
msgid "code model %qs not supported in x32 mode"
msgstr "代码模式%qs在 %s 位模式下不受支持"
#: config/i386/i386.c:3517
#, fuzzy, gcc-internal-format
-#| msgid "-m%s not supported in this configuration"
msgid "-masm=intel not supported in this configuration"
msgstr "-m%s 在此配置下不受支持"
#: config/i386/i386.c:3678
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "generic CPU can be used only for %stune=%s %s"
msgid "intel CPU can be used only for %stune=%s %s"
msgstr "generic 只能用在%stune%s %s中"
#: config/i386/i386.c:3777
#, fuzzy, gcc-internal-format
-#| msgid "%sregparm%s is ignored in 64-bit mode"
msgid "-mregparm is ignored in 64-bit mode"
msgstr "%sregparm%s 在 64 位模式下被忽略"
#: config/i386/i386.c:3780
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "%sregparm=%d%s is not between 0 and %d"
msgid "-mregparm=%d is not between 0 and %d"
msgstr "%sregparm=%d%s 不在 0 和 %d 之间"
#: config/i386/i386.c:3900
#, fuzzy, gcc-internal-format
-#| msgid "%spreferred-stack-boundary%s is not supported for this target"
msgid "-mpreferred-stack-boundary is not supported for this target"
msgstr "%spreferred-stack-boundary%s 在此目标机上不被支持"
#: config/i386/i386.c:3903
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "%spreferred-stack-boundary=%d%s is not between %d and %d"
msgid "-mpreferred-stack-boundary=%d is not between %d and %d"
msgstr "%spreferred-stack-boundary=%d%s 不在 %d 和 %d 之间"
#: config/i386/i386.c:4108
#, gcc-internal-format
msgid "-mfentry isn%'t supported for 32-bit in combination with -fpic"
-msgstr "-mfentry 在 32 位下不能和 -pic 同时使用"
+msgstr "-mfentry 在 32 位下不能和 -fpic 同时使用"
#: config/i386/i386.c:4115
#, gcc-internal-format
#: config/i386/i386.c:6236
#, fuzzy, gcc-internal-format
-#| msgid "AVX vector argument without AVX enabled changes the ABI"
msgid "AVX vector return without AVX enabled changes the ABI"
msgstr "没有启用 AVX,却出现了 AVX 向量实参,这改变了 ABI"
#: config/i386/i386.c:14881
#, fuzzy, gcc-internal-format
-#| msgid "non-integer operand used with operand code '%c'"
msgid "non-integer operand used with operand code 'z'"
msgstr "非整数操作数使用了操作数代码‘%c’"
#: config/i386/i386.c:31750 config/i386/i386.c:32198
#, fuzzy, gcc-internal-format
-#| msgid "static linking is not supported"
msgid "Virtual function multiversioning not supported"
msgstr "不支持静态链接"
#: config/i386/i386.c:31818
#, fuzzy, gcc-internal-format
-#| msgid "previous declaration of %q+D"
msgid "previous declaration of %D"
msgstr "%q+D的前一个声明"
#: config/i386/i386.c:32037
#, fuzzy, gcc-internal-format
-#| msgid "nested functions not supported on this target"
msgid "multiversioning needs ifunc which is not supported on this target"
msgstr "嵌套函数在此目标机上不受支持"
#: config/i386/i386.c:32405
#, fuzzy, gcc-internal-format
-#| msgid "argument to %qs must be a 2-bit unsigned literal"
msgid "Parameter to builtin must be a string constant or literal"
msgstr "%qs的实参必须是一个 2 位无符号字面常量"
#: config/i386/i386.c:32430 config/i386/i386.c:32480
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Argument to -ffpe-trap is not valid: %s"
msgid "Parameter to builtin not valid: %s"
msgstr "-ffpe-trap 的参数无效:%s"
#: config/i386/i386.c:33287
#, fuzzy, gcc-internal-format
-#| msgid "the fifth argument must be a 8-bit immediate"
msgid "the fifth argument must be an 8-bit immediate"
msgstr "第五个实参必须是一个 8 位立即数"
#: config/i386/i386.c:33382
#, fuzzy, gcc-internal-format
-#| msgid "the third argument must be a 8-bit immediate"
msgid "the third argument must be an 8-bit immediate"
msgstr "第三个实参必须是一个 8 位立即数"
#: config/i386/i386.c:33967
#, fuzzy, gcc-internal-format
-#| msgid "the last argument must be a 1-bit immediate"
msgid "the last argument must be an 1-bit immediate"
msgstr "最后一个实参必须是一个 1 位立即数"
#: config/i386/i386.c:33974
#, fuzzy, gcc-internal-format
-#| msgid "the last argument must be a 32-bit immediate"
msgid "the last argument must be a 3-bit immediate"
msgstr "最后一个参数必须是一个 32 位立即数"
#: config/i386/i386.c:34214
#, fuzzy, gcc-internal-format
-#| msgid "argument must be a constant"
msgid "the third argument must be comparison constant"
msgstr "实参必须是常数"
#: config/i386/i386.c:34219
#, fuzzy, gcc-internal-format
-#| msgid "incorrect sharing of tree nodes"
msgid "incorect comparison mode"
msgstr "对树结节的共享不正确"
#: config/i386/i386.c:34225 config/i386/i386.c:34421
#, fuzzy, gcc-internal-format
-#| msgid "incorrect sharing of tree nodes"
msgid "incorrect rounding operand"
msgstr "对树结节的共享不正确"
#: config/i386/i386.c:34403
#, fuzzy, gcc-internal-format
-#| msgid "the last argument must be a 4-bit immediate"
msgid "the immediate argument must be a 4-bit immediate"
msgstr "最后一个实参必须是一个 4 位立即数"
#: config/i386/i386.c:34409
#, fuzzy, gcc-internal-format
-#| msgid "the last argument must be a 5-bit immediate"
msgid "the immediate argument must be a 5-bit immediate"
msgstr "最后一个实参必须是一个 5 位立即数"
#: config/i386/i386.c:34412
#, fuzzy, gcc-internal-format
-#| msgid "the last argument must be an 8-bit immediate"
msgid "the immediate argument must be an 8-bit immediate"
msgstr "最后一个实参必须是一个 8 位立即数"
#: config/i386/i386.c:35816 config/i386/i386.c:35964
#, fuzzy, gcc-internal-format
-#| msgid "the last argument must be a 4-bit immediate"
msgid "the last argument must be scale 1, 2, 4, 8"
msgstr "最后一个实参必须是一个 4 位立即数"
#: config/i386/i386.c:36016
#, fuzzy, gcc-internal-format
-#| msgid "left argument must be a slice"
msgid "the forth argument must be scale 1, 2, 4, 8"
msgstr "左实参必须是一个切片"
#: config/i386/i386.c:36022
#, fuzzy, gcc-internal-format
-#| msgid "the last argument must be a 4-bit immediate"
msgid "the last argument must be hint 0 or 1"
msgstr "最后一个实参必须是一个 4 位立即数"
#: config/i386/i386.c:36041
#, fuzzy, gcc-internal-format
-#| msgid "the last argument must be an 8-bit immediate"
msgid "the xabort's argument must be an 8-bit immediate"
msgstr "最后一个实参必须是一个 8 位立即数"
#: config/i386/i386.c:46439
#, fuzzy, gcc-internal-format
-#| msgid "Unknown architecture '%s'"
msgid "Unknown architecture specific memory model"
msgstr "未知的架构‘%s’"
#: config/i386/i386.c:46476
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "unsupported ELF file class"
msgid "unsupported simdlen %d"
msgstr "不支持的 ELF 文件类"
#: config/m68k/m68k.c:624
#, fuzzy, gcc-internal-format
-#| msgid "stack limits not supported on this target"
msgid "-fstack-limit- options are not supported on this cpu"
msgstr "堆栈限制在此目标机上不受支持"
#: config/microblaze/microblaze.c:1679
#, fuzzy, gcc-internal-format
-#| msgid "-fPIC and -fpic are not supported for this target"
msgid "-fPIC/-fpic not supported for this target"
msgstr "-fPIC 和 -fpic 不被此目标所支持"
#: config/mips/mips.c:1427 config/mips/mips.c:1433
#, fuzzy, gcc-internal-format
-#| msgid "%qE cannot have both %<mips16%> and %<nomips16%> attributes"
msgid "%qE cannot have both %qs and %qs attributes"
msgstr "%qE不能同时有%<mips16%>和%<nomips16%>属性"
#: config/mips/mips.c:17050 config/mips/mips.c:17052 config/mips/mips.c:17065
#, fuzzy, gcc-internal-format
-#| msgid "assert: %s is assign compatible with %s"
msgid "%qs is incompatible with %qs"
msgstr "assert:%s 与 %s 赋值兼容"
#. an error.
#: config/mips/mips.c:17059
#, fuzzy, gcc-internal-format
-#| msgid "assert: %s is assign compatible with %s"
msgid "the combination of %qs and %qs is incompatible with %qs"
msgstr "assert:%s 与 %s 赋值兼容"
#: config/mips/mips.c:17120
#, fuzzy, gcc-internal-format
-#| msgid "the %qs architecture does not support the synci instruction"
msgid "the %qs architecture does not support madd or msub instructions"
msgstr "%qs架构不支持 synci 指令"
#: config/mips/mips.c:17134
#, fuzzy, gcc-internal-format
-#| msgid "Generate position-independent code if possible (large mode)"
msgid "cannot generate position-independent code for %qs"
msgstr "尽可能生成与位置无关的代码(大模式)"
#: config/msp430/msp430.c:1102
#, fuzzy, gcc-internal-format
-#| msgid "invalid argument of %qE attribute"
msgid "unrecognised interrupt vector argument of %qE attribute"
msgstr "属性%qE的参数无效"
#: config/msp430/msp430.c:1111
#, fuzzy, gcc-internal-format
-#| msgid "argument %d of %qE must be in the range %d...%d"
msgid "numeric argument of %qE attribute must be in range 0..63"
msgstr "%2$qE的第 %1$d 个参数必须是在 %3$d 和 %4$d 之间"
#: config/msp430/msp430.c:1117
#, fuzzy, gcc-internal-format
-#| msgid "argument of %qE attribute is not a string constant"
msgid "argument of %qE attribute is not a string constant or number"
msgstr "%qE属性的实参不是一个字符串常量"
#: config/nds32/nds32.c:1213
#, fuzzy, gcc-internal-format
-#| msgid "multiple function type attributes specified"
msgid "multiple nested types attributes to function %qD"
msgstr "指定了多个函数类型属性"
#: config/nds32/nds32.c:1225
#, fuzzy, gcc-internal-format
-#| msgid "multiple interrupt attributes not allowed"
msgid "multiple interrupt attributes to function %qD"
msgstr "不允许多个中断属性"
#: config/nds32/nds32.c:3007 config/nds32/nds32.c:3013
#: config/nds32/nds32.c:3045
#, fuzzy, gcc-internal-format
-#| msgid "nested functions not supported on this target"
msgid "a nested function is not supported for reduced registers"
msgstr "嵌套函数在此目标机上不受支持"
#. The enum index value for array size is out of range.
#: config/nds32/nds32.c:2848
#, fuzzy, gcc-internal-format
-#| msgid "invalid register in the instruction"
msgid "intrinsic register index is out of range"
msgstr "此指令中寄存器无效"
#: config/nds32/nds32.c:3153
#, fuzzy, gcc-internal-format
-#| msgid "invalid type for iteration variable %qE"
msgid "invalid id value for interrupt/exception attribute"
msgstr "迭代变量%qE类型无效"
#: config/nds32/nds32.c:3181
#, fuzzy, gcc-internal-format
-#| msgid "invalid argument of %qs attribute"
msgid "invalid id value for reset attribute"
msgstr "属性%qs的参数无效"
#: config/nds32/nds32.c:3197
#, fuzzy, gcc-internal-format
-#| msgid "invalid argument of %qs attribute"
msgid "invalid nmi function for reset attribute"
msgstr "属性%qs的参数无效"
#: config/nds32/nds32.c:3210
#, fuzzy, gcc-internal-format
-#| msgid "invalid argument of %qs attribute"
msgid "invalid warm function for reset attribute"
msgstr "属性%qs的参数无效"
#: config/nds32/nds32.c:3284
#, fuzzy, gcc-internal-format
-#| msgid "%s does not support split_block"
msgid "not support -fpic"
msgstr "%s 不支持 split_block"
#: config/nios2/nios2.c:794
#, fuzzy, gcc-internal-format
-#| msgid "target attribute or pragma changes double precision floating point"
msgid "switch %<-mcustom-%s%> is required for double precision floating point"
msgstr "目标属性或 pragma 改变了双精度浮点数"
#: config/nios2/nios2.c:2598
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "invalid argument to built-in function"
msgid "invalid argument to built-in function %s"
msgstr "内建函数实参无效"
#: config/nios2/nios2.c:2743
#, fuzzy, gcc-internal-format
-#| msgid "switch -mcpu=%s conflicts with -march=%s switch"
msgid "switch %<-mcustom-%s%> conflicts with switch %<-mcustom-%s%>"
msgstr "开关 -mcpu=%s 与 -march=%s 冲突"
#: config/nios2/nios2.c:2899
#, fuzzy, gcc-internal-format
-#| msgid "%s only accepts 2 arguments"
msgid "%<no-custom-%s%> does not accept arguments"
msgstr "%s 只接受 2 个参数"
#: config/nios2/nios2.c:2943
#, fuzzy, gcc-internal-format
-#| msgid "type of %qE is unknown"
msgid "%<%s%> is unknown"
msgstr "%qE的类型未知"
#: config/rs6000/rs6000.c:3173
#, fuzzy, gcc-internal-format
-#| msgid "not configured for ABI: '%s'"
msgid "not configured for SPE ABI"
msgstr "没有为此 ABI 配置:‘%s’"
#: config/rs6000/rs6000.c:3178
#, fuzzy, gcc-internal-format
-#| msgid "Do not use PowerPC instruction set"
msgid "not configured for SPE instruction set"
msgstr "不使用 PowerPC 指令集"
#: config/rs6000/rs6000.c:3333
#, fuzzy, gcc-internal-format
-#| msgid "--resource requires -o"
msgid "-mdirect-move requires -mvsx"
msgstr "--resource 需要 -o"
#: config/rs6000/rs6000.c:3347
#, fuzzy, gcc-internal-format
-#| msgid "--resource requires -o"
msgid "-mpower8-vector requires -mvsx"
msgstr "--resource 需要 -o"
#: config/rs6000/rs6000.c:3354
#, fuzzy, gcc-internal-format
-#| msgid "--resource requires -o"
msgid "-mvsx-timode requires -mvsx"
msgstr "--resource 需要 -o"
#: config/rs6000/rs6000.c:11517
#, fuzzy, gcc-internal-format
-#| msgid "argument 1 must be a 5-bit signed literal"
msgid "argument 1 must be an 8-bit field value"
msgstr "实参 1 必须是一个 5 位有符号字面值"
#: config/rs6000/rs6000.c:12074
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "argument 2 must be a 5-bit unsigned literal"
msgid "argument %d must be an unsigned literal"
msgstr "实参 2 必须是一个 5 位无符号字面值"
#: config/rs6000/rs6000.c:12076
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "argument 1 of __builtin_spe_predicate is out of range"
msgid "argument %d is an unsigned literal that is out of range"
msgstr "__builtin_spe_predicate 的第 1 个实参越界"
#: config/rs6000/rs6000.c:12246
#, fuzzy, gcc-internal-format
-#| msgid "number must be 0 or 1"
msgid "argument 2 must be 0 or 1"
msgstr "数字必须是 0 或 1"
#: config/rs6000/rs6000.c:12254
#, fuzzy, gcc-internal-format
-#| msgid "argument %d of %qE must be in the range %d...%d"
msgid "argument 3 must be in the range 0..15"
msgstr "%2$qE的第 %1$d 个参数必须是在 %3$d 和 %4$d 之间"
#: config/rs6000/rs6000.c:13239
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "this builtin function is only available on the fr450"
msgid "Builtin function %s is only valid for the cell processor"
msgstr "此内建函数只在 fr450 上可用"
#: config/rs6000/e500.h:37
#, fuzzy, gcc-internal-format
-#| msgid "AltiVec and E500 instructions cannot coexist"
msgid "AltiVec and SPE instructions cannot coexist"
msgstr "AltiVec 和 E500 指令不能共存"
#: config/rs6000/e500.h:39
#, fuzzy, gcc-internal-format
-#| msgid "VSX and E500 instructions cannot coexist"
msgid "VSX and SPE instructions cannot coexist"
msgstr "VSX 和 E500 指令不能共存"
#: config/rs6000/e500.h:41
#, fuzzy, gcc-internal-format
-#| msgid "64-bit E500 not supported"
msgid "64-bit SPE not supported"
msgstr "不支持 64 位 E500"
#: config/rs6000/linux64.h:116
#, fuzzy, gcc-internal-format
-#| msgid "-mas100-syntax is incompatible with -gdwarf"
msgid "-mcall-aixdesc incompatible with -mabi=elfv2"
msgstr "-mas100-syntax 与 -gdwarf 不兼容"
#: config/rx/rx.c:644
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "unreocgnized control register number: %d - using 'psw'"
msgid "unrecognized control register number: %d - using 'psw'"
msgstr "无法识别的控制寄存器号:%d - 使用‘psw’"
#: config/rx/rx.c:1380
#, fuzzy, gcc-internal-format
-#| msgid "multiple interrupt attributes not allowed"
msgid "multiple fast interrupt routines seen: %qE and %qE"
msgstr "不允许多个中断属性"
#: config/s390/s390.c:479
#, fuzzy, gcc-internal-format
-#| msgid "argument of %qE attribute is not a string constant"
msgid "requested %qE attribute is not a non-negative integer constant or too large (max. %d)"
msgstr "%qE属性的实参不是一个字符串常量"
#: config/s390/s390.c:1712
#, fuzzy, gcc-internal-format
-#| msgid "argument to %qE attribute larger than %d"
msgid "argument to %qs is too large (max. %d)"
msgstr "%qE属性的实参大于 %d"
#: config/s390/s390.c:5480
#, fuzzy, gcc-internal-format
-#| msgid "function %q+D redeclared with attribute noinline"
msgid "function %qE with the %qs attribute is not hotpatchable"
msgstr "函数%q+D重声明为带有不可内联属性"
#: config/s390/s390.c:5521
#, fuzzy, gcc-internal-format
-#| msgid "ms_hook_prologue is not compatible with nested function"
msgid "hotpatch_prologue is not compatible with nested function"
msgstr "ms_hook_prologue 与嵌套函数不兼容"
#: config/s390/s390.c:9019
#, fuzzy, gcc-internal-format
-#| msgid "frame size of %qs is "
msgid "frame size of %qs is %wd bytes"
msgstr "%qs的框架大小是"
#: config/sparc/sparc.c:1298
#, fuzzy, gcc-internal-format
-#| msgid "-fdata-sections not supported for this target"
msgid "-fcall-saved-REG is not supported for out registers"
msgstr "-fdata-sections 在此目标机上不受支持"
#: config/tilegx/tilegx.c:3512 config/tilepro/tilepro.c:3118
#, fuzzy, gcc-internal-format
-#| msgid "bad builtin code"
msgid "bad builtin icode"
msgstr "错误的内建代码"
#: config/tilegx/tilegx.c:3553 config/tilepro/tilepro.c:3144
#, fuzzy, gcc-internal-format
-#| msgid "mask must be an immediate"
msgid "operand must be an immediate of the right size"
msgstr "掩码必须是一个立即数"
#: config/vms/vms-c.c:44
#, fuzzy, gcc-internal-format
-#| msgid "junk at end of #pragma ghs starttda"
msgid "junk at end of #pragma __nostandard"
msgstr "#pragma ghs starttda 末尾有垃圾字符"
#: config/vms/vms-c.c:55
#, fuzzy, gcc-internal-format
-#| msgid "junk at end of #pragma %s"
msgid "junk at end of #pragma __standard"
msgstr "#pragma %s 末尾有垃圾字符"
#: config/vms/vms-c.c:80
#, fuzzy, gcc-internal-format
-#| msgid "malformed %<#pragma align%>, ignoring"
msgid "malformed '#pragma member_alignment', ignoring"
msgstr "%<#pragma align%>格式错误 - 已忽略"
#: config/vms/vms-c.c:100
#, fuzzy, gcc-internal-format
-#| msgid "malformed %<#pragma align%>"
msgid "malformed '#pragma member_alignment'"
msgstr "%<#pragma align%>格式错误"
#: config/vms/vms-c.c:134
#, fuzzy, gcc-internal-format
-#| msgid "invalid alignment for %<#pragma align%>, ignoring"
msgid "unhandled alignment for '#pragma nomember_alignment'"
msgstr "%<#pragma align%>指定的对齐边界无效,忽略"
#: config/vms/vms-c.c:147
#, fuzzy, gcc-internal-format
-#| msgid "junk at end of '#pragma options'"
msgid "garbage at end of '#pragma nomember_alignment'"
msgstr "‘#pragma options’末尾有垃圾字符"
#: config/vms/vms-c.c:202
#, fuzzy, gcc-internal-format
-#| msgid "malformed '#pragma options', ignoring"
msgid "malformed '#pragma extern_model', ignoring"
msgstr "‘#pragma options’格式错误 - 已忽略"
#: config/vms/vms-c.c:234
#, fuzzy, gcc-internal-format
-#| msgid "junk at end of %<#pragma extern_prefix%>"
msgid "junk at end of '#pragma extern_model'"
msgstr "%<#pragma extern_prefix%>末尾有垃圾字符"
#: config/vms/vms-c.c:248
#, fuzzy, gcc-internal-format
-#| msgid "malformed %<#pragma message%>, ignored"
msgid "vms '#pragma __message' is ignored"
msgstr "%<#pragma message%>格式错误,已忽略"
#: config/vms/vms-c.c:273 config/vms/vms-c.c:279
#, fuzzy, gcc-internal-format
-#| msgid "malformed #pragma extern_prefix, ignored"
msgid "malformed '#pragma __extern_prefix', ignoring"
msgstr "#pragma extern_prefix 格式错误,已忽略"
#: config/vms/vms-c.c:312 config/vms/vms-c.c:332
#, fuzzy, gcc-internal-format
-#| msgid "malformed %<#pragma %s%>, ignored"
msgid "malformed %<#pragma %s%>, ignoring"
msgstr "%<#pragma %s%>格式错误,已忽略"
#: config/vms/vms-c.c:328
#, fuzzy, gcc-internal-format
-#| msgid "invalid constant in %<#pragma pack%> - ignored"
msgid "invalid constant in %<#pragma %s%>"
msgstr "%<#pragma pack%>中有无效常量 - 已忽略"
#: c/c-array-notation.c:708 c/c-array-notation.c:714
#, fuzzy, gcc-internal-format
-#| msgid "%qD cannot be declared as constexpr"
msgid "%qE cannot be scalar when %qE is not"
msgstr "%qD不能被声明为广义常表达式"
#: c/c-array-notation.c:776 cp/cp-array-notation.c:658
#, fuzzy, gcc-internal-format
-#| msgid "type mismatch between an SSA_NAME and its symbol"
msgid "length mismatch between LHS and RHS"
msgstr "SSA_NAME 和其符号间类型不匹配"
#: c/c-array-notation.c:1323 cp/cp-array-notation.c:1407
#, fuzzy, gcc-internal-format
-#| msgid "array subscript is not an integer"
msgid "start-index of array notation triplet is not an integer"
msgstr "数组下标不是一个整数"
#: c/c-array-notation.c:1328 cp/cp-array-notation.c:1412
#, fuzzy, gcc-internal-format
-#| msgid "array subscript is not an integer"
msgid "length of array notation triplet is not an integer"
msgstr "数组下标不是一个整数"
#: c/c-array-notation.c:1335 cp/cp-array-notation.c:1417
#, fuzzy, gcc-internal-format
-#| msgid "array subscript is not an integer"
msgid "stride of array notation triplet is not an integer"
msgstr "数组下标不是一个整数"
#: c/c-decl.c:3755
#, fuzzy, gcc-internal-format
-#| msgid "empty declaration with type qualifier does not redeclare tag"
msgid "empty declaration with %<_Alignas%> does not redeclare tag"
msgstr "带有类型限定的空声明没有重声明标记"
#: c/c-decl.c:3799
#, fuzzy, gcc-internal-format
-#| msgid "%<inline%> in empty declaration"
msgid "%<_Noreturn%> in empty declaration"
msgstr "%<inline%>用于空声明中"
#: c/c-decl.c:3824
#, fuzzy, gcc-internal-format
-#| msgid "useless type name in empty declaration"
msgid "useless %qs in empty declaration"
msgstr "空声明中类型名无用"
#: c/c-decl.c:3844
#, fuzzy, gcc-internal-format
-#| msgid "useless %<__thread%> in empty declaration"
msgid "useless %<_Alignas%> in empty declaration"
msgstr "空声明中%<__thread%>无用"
#: c/c-decl.c:5147
#, fuzzy, gcc-internal-format
-#| msgid "duplicate %<restrict%>"
msgid "duplicate %<_Atomic%>"
msgstr "重复的%<restrict%>"
#: c/c-decl.c:5190
#, fuzzy, gcc-internal-format
-#| msgid "function definition declared %<auto%>"
msgid "function definition declared %qs"
msgstr "函数声明定义为%<auto%>"
#: c/c-decl.c:5259
#, fuzzy, gcc-internal-format
-#| msgid "function-scope %qE implicitly auto and declared %<__thread%>"
msgid "function-scope %qE implicitly auto and declared %qs"
msgstr "函数作用域的%qE隐式为 auto,却被声明为%<__thread%>"
#: c/c-decl.c:5754 c/c-decl.c:5952 c/c-decl.c:6005 c/c-decl.c:6078
#: c/c-decl.c:6179 c/c-parser.c:2401
#, fuzzy, gcc-internal-format
-#| msgid "ISO C forbids qualified function types"
msgid "%<_Atomic%>-qualified function type"
msgstr "ISO C 不允许使用 const 或 volatile 限定函数类型"
#: c/c-decl.c:5880
#, fuzzy, gcc-internal-format
-#| msgid "bit-field %qs has invalid type"
msgid "bit-field %qE has atomic type"
msgstr "位段%qs类型无效"
#: c/c-decl.c:5882
#, fuzzy, gcc-internal-format
-#| msgid "bit-field %qs has invalid type"
msgid "bit-field has atomic type"
msgstr "位段%qs类型无效"
#: c/c-decl.c:5891
#, fuzzy, gcc-internal-format
-#| msgid "alignment may not be specified for %q+D"
msgid "alignment specified for typedef %qE"
msgstr "不能为%q+D指定对齐"
#: c/c-decl.c:5893
#, fuzzy, gcc-internal-format
-#| msgid "%qs specified for parameter %qE"
msgid "alignment specified for %<register%> object %qE"
msgstr "为形参%2$qE指定了%1$qs"
#: c/c-decl.c:5898
#, fuzzy, gcc-internal-format
-#| msgid "%qs specified for parameter %qE"
msgid "alignment specified for parameter %qE"
msgstr "为形参%2$qE指定了%1$qs"
#: c/c-decl.c:5900
#, fuzzy, gcc-internal-format
-#| msgid "%qs specified for unnamed parameter"
msgid "alignment specified for unnamed parameter"
msgstr "为无名形参指定了%qs"
#: c/c-decl.c:5905
#, fuzzy, gcc-internal-format
-#| msgid "alignment may not be specified for %q+D"
msgid "alignment specified for bit-field %qE"
msgstr "不能为%q+D指定对齐"
#: c/c-decl.c:5907
#, fuzzy, gcc-internal-format
-#| msgid "%qs specified for unnamed parameter"
msgid "alignment specified for unnamed bit-field"
msgstr "为无名形参指定了%qs"
#: c/c-decl.c:5910
#, fuzzy, gcc-internal-format
-#| msgid "assignment of function %qD"
msgid "alignment specified for function %qE"
msgstr "向函数%qD赋值"
#: c/c-decl.c:5968
#, fuzzy, gcc-internal-format
-#| msgid "typedef %q+D declared %<inline%>"
msgid "typedef %q+D declared %<_Noreturn%>"
msgstr "typedef%q+D声明为%<inline%>"
#: c/c-decl.c:6111
#, fuzzy, gcc-internal-format
-#| msgid "parameter %q+D declared %<inline%>"
msgid "parameter %q+D declared %<_Noreturn%>"
msgstr "形参%q+D声明为%<inline%>"
#: c/c-decl.c:6223
#, fuzzy, gcc-internal-format
-#| msgid "%qE initialized and declared %<extern%>"
msgid "%<main%> declared %<_Noreturn%>"
msgstr "%qE已初始化,却又被声明为%<extern%>"
#: c/c-decl.c:6236
#, fuzzy, gcc-internal-format
-#| msgid "ISO C99 does not support %<_Static_assert%>"
msgid "ISO C99 does not support %<_Noreturn%>"
msgstr "ISO C90 不支持%<_Static_assert%>"
#: c/c-decl.c:6239
#, fuzzy, gcc-internal-format
-#| msgid "ISO C90 does not support %<long long%>"
msgid "ISO C90 does not support %<_Noreturn%>"
msgstr "ISO C90 不支持%<long long%>"
#: c/c-decl.c:6280
#, fuzzy, gcc-internal-format
-#| msgid "variable %q+D declared %<inline%>"
msgid "variable %q+D declared %<_Noreturn%>"
msgstr "变量%q+D声明为%<inline%>"
#: c/c-decl.c:7352 cp/class.c:6386
#, fuzzy, gcc-internal-format
-#| msgid "size of array %qE is too large"
msgid "type %qT is too large"
msgstr "数组%qE太大"
#. allow it.
#: c/c-decl.c:8697
#, fuzzy, gcc-internal-format
-#| msgid "%<for%> loop initial declarations are only allowed in C99 mode"
msgid "%<for%> loop initial declarations are only allowed in C99 or C11 mode"
msgstr "只允许在 C99 模式下使用%<for%>循环初始化声明"
#: c/c-decl.c:8702
#, fuzzy, gcc-internal-format
-#| msgid "use option -std=c99 or -std=gnu99 to compile your code"
msgid "use option -std=c99, -std=gnu99, -std=c11 or -std=gnu11 to compile your code"
msgstr "使用 -std=c99 或 -std=gnu99 来编译您的代码"
#: c/c-decl.c:9862
#, fuzzy, gcc-internal-format
-#| msgid "%<__thread%> used with %<auto%>"
msgid "%qE used with %<auto%>"
msgstr "%<__thread%>与%<auto%>一起使用"
#: c/c-decl.c:9864
#, fuzzy, gcc-internal-format
-#| msgid "%<__thread%> used with %<register%>"
msgid "%qE used with %<register%>"
msgstr "%<__thread%>与%<register%>一起使用"
#: c/c-decl.c:9866
#, fuzzy, gcc-internal-format
-#| msgid "%<__thread%> used with %<typedef%>"
msgid "%qE used with %<typedef%>"
msgstr "%<__thread%>与%<typedef%>一起使用"
#: c/c-decl.c:9880 c/c-parser.c:6560
#, fuzzy, gcc-internal-format
-#| msgid "%s does not support %s"
msgid "ISO C99 does not support %qE"
msgstr "%s 不支持 %s"
#: c/c-decl.c:9883 c/c-parser.c:6563
#, fuzzy, gcc-internal-format
-#| msgid "ISO C90 does not support %<long long%>"
msgid "ISO C90 does not support %qE"
msgstr "ISO C90 不支持%<long long%>"
#: c/c-decl.c:9933
#, fuzzy, gcc-internal-format
-#| msgid "%qs must be used with %qs"
msgid "%qs used with %qE"
msgstr "%qs必须与%qs一起使用"
#: c/c-parser.c:1535
#, fuzzy, gcc-internal-format
-#| msgid "%<inline%> in empty declaration"
msgid "%<__auto_type%> in empty declaration"
msgstr "%<inline%>用于空声明中"
#: c/c-parser.c:1706
#, fuzzy, gcc-internal-format
-#| msgid "%<typeof%> applied to a bit-field"
msgid "%<__auto_type%> used with a bit-field initializer"
msgstr "为位段使用%<typeof%>"
#: c/c-parser.c:1778 c/c-parser.c:1863
#, fuzzy, gcc-internal-format
-#| msgid "%<auto%> in file-scope empty declaration"
msgid "%<__auto_type%> requires an initialized data declaration"
msgstr "文件作用域中出现%<auto%>空声明"
#: c/c-parser.c:2372
#, fuzzy, gcc-internal-format
-#| msgid "ISO C99 does not support %<_Static_assert%>"
msgid "ISO C99 does not support the %<_Atomic%> qualifier"
msgstr "ISO C90 不支持%<_Static_assert%>"
#: c/c-parser.c:2375
#, fuzzy, gcc-internal-format
-#| msgid "ISO C90 does not support %<_Static_assert%>"
msgid "ISO C90 does not support the %<_Atomic%> qualifier"
msgstr "ISO C90 不支持%<_Static_assert%>"
#: c/c-parser.c:2403
#, fuzzy, gcc-internal-format
-#| msgid "%<typeof%> applied to a bit-field"
msgid "%<_Atomic%> applied to a qualified type"
msgstr "为位段使用%<typeof%>"
#: c/c-parser.c:3049
#, fuzzy, gcc-internal-format
-#| msgid "ISO C90 does not support %<long long%>"
msgid "ISO C99 does not support %<_Alignas%>"
msgstr "ISO C90 不支持%<long long%>"
#: c/c-parser.c:3052
#, fuzzy, gcc-internal-format
-#| msgid "ISO C90 does not support %<long long%>"
msgid "ISO C90 does not support %<_Alignas%>"
msgstr "ISO C90 不支持%<long long%>"
#: c/c-parser.c:3349 c/c-parser.c:3378
#, fuzzy, gcc-internal-format
-#| msgid "Warn for obsolescent usage in a declaration"
msgid "array notations cannot be used in declaration"
msgstr "对声明中的过时用法给出警告"
#: c/c-parser.c:6616
#, fuzzy, gcc-internal-format
-#| msgid "ISO C++ does not allow %<alignof%> with a non-type"
msgid "ISO C does not allow %<%E (expression)%>"
msgstr "ISO C++ 不允许对非类型使用%<alignof%>"
#: c/c-parser.c:6643
#, fuzzy, gcc-internal-format
-#| msgid "cannot take address of bit-field %qD"
msgid "cannot take address of %qs"
msgstr "无法取得位段%qD的地址"
#: c/c-parser.c:6727
#, fuzzy, gcc-internal-format
-#| msgid "ISO C99 does not support %<_Static_assert%>"
msgid "ISO C99 does not support %<_Generic%>"
msgstr "ISO C90 不支持%<_Static_assert%>"
#: c/c-parser.c:6730
#, fuzzy, gcc-internal-format
-#| msgid "ISO C90 does not support %<_Static_assert%>"
msgid "ISO C90 does not support %<_Generic%>"
msgstr "ISO C90 不支持%<_Static_assert%>"
#: c/c-parser.c:6797
#, fuzzy, gcc-internal-format
-#| msgid "cast specifies function type"
msgid "%<_Generic%> association has function type"
msgstr "类型转换指定了函数类型"
#: c/c-parser.c:6800
#, fuzzy, gcc-internal-format
-#| msgid "expression statement has incomplete type"
msgid "%<_Generic%> association has incomplete type"
msgstr "表达式语句类型不完全"
#: c/c-parser.c:6829
#, fuzzy, gcc-internal-format
-#| msgid "originally defined here"
msgid "original %<default%> is here"
msgstr "原先在这里定义"
#: c/c-parser.c:6861
#, fuzzy, gcc-internal-format
-#| msgid "Generate load/store multiple instructions"
msgid "%<_Generic> selector matches multiple associations"
msgstr "生成加载/存储乘法指令"
#: c/c-parser.c:7265
#, fuzzy, gcc-internal-format
-#| msgid "wrong number of arguments to function %<__builtin_next_arg%>"
msgid "wrong number of arguments to %<__builtin_choose_expr%>"
msgstr "给函数%<__builtin_next_arg%>的参数数目不对"
#: c/c-parser.c:7347
#, fuzzy, gcc-internal-format
-#| msgid "wrong number of arguments to function %<__builtin_next_arg%>"
msgid "wrong number of arguments to %<__builtin_complex%>"
msgstr "给函数%<__builtin_next_arg%>的参数数目不对"
#: c/c-parser.c:7378
#, fuzzy, gcc-internal-format
-#| msgid "%<__builtin_longjmp%> second argument must be 1"
msgid "%<__builtin_complex%> operands of different types"
msgstr "%<__builtin_longjmp%>的第二个实参必须是 1"
#: c/c-parser.c:7424 cp/parser.c:5861
#, fuzzy, gcc-internal-format
-#| msgid "wrong number of arguments to function %<__builtin_next_arg%>"
msgid "wrong number of arguments to %<__builtin_shuffle%>"
msgstr "给函数%<__builtin_next_arg%>的参数数目不对"
#: c/c-parser.c:9422 cp/parser.c:31380
#, fuzzy, gcc-internal-format
-#| msgid "%<#pragma omp taskwait%> may only be used in compound statements"
msgid "%<#pragma omp taskyield%> may only be used in compound statements"
msgstr "%<#pragma omp taskwait%>只能用在复合语句中"
#: c/c-parser.c:9433 cp/parser.c:31396
#, fuzzy, gcc-internal-format
-#| msgid "%<#pragma omp barrier%> may only be used in compound statements"
msgid "%<#pragma omp cancel%> may only be used in compound statements"
msgstr "%<#pragma omp barrier%>只能用在复合语句中"
#: c/c-parser.c:9444 cp/parser.c:31412
#, fuzzy, gcc-internal-format
-#| msgid "%<#pragma omp taskwait%> may only be used in compound statements"
msgid "%<#pragma omp cancellation point%> may only be used in compound statements"
msgstr "%<#pragma omp taskwait%>只能用在复合语句中"
#: c/c-parser.c:9479 cp/parser.c:31468
#, fuzzy, gcc-internal-format
-#| msgid "for statement expected"
msgid "for, while or do statement expected"
msgstr "需要 for 语句"
#: c/c-parser.c:10195
#, fuzzy, gcc-internal-format
-#| msgid "expected %<+%>, %<*%>, %<-%>, %<&%>, %<^%>, %<|%>, %<&&%>, or %<||%>"
msgid "expected %<+%>, %<*%>, %<-%>, %<&%>, %<^%>, %<|%>, %<&&%>, %<||%>, %<min%> or %<max%>"
msgstr "需要%<+%>、%<*%>、%<-%>、%<&%>、%<^%>、%<|%>、%<&&%>或%<||%>"
#: c/c-parser.c:10410
#, fuzzy, gcc-internal-format
-#| msgid "%<num_threads%> value must be positive"
msgid "%<num_teams%> value must be positive"
msgstr "%<num_threads%>值必须为正"
#: c/c-parser.c:10454
#, fuzzy, gcc-internal-format
-#| msgid "%<num_threads%> value must be positive"
msgid "%<thread_limit%> value must be positive"
msgstr "%<num_threads%>值必须为正"
#: c/c-parser.c:10496 cp/semantics.c:5589
#, fuzzy, gcc-internal-format
-#| msgid "%Hcollapse argument needs positive constant integer expression"
msgid "%<aligned%> clause alignment expression must be positive constant integer expression"
msgstr "%H折叠变量需要正整常数表达式"
#: c/c-parser.c:10538
#, fuzzy, gcc-internal-format
-#| msgid "schedule chunk size expression must be integral"
msgid "%<linear%> clause step expression must be integral"
msgstr "调度块大小表达式必须为整型"
#: c/c-parser.c:10575
#, fuzzy, gcc-internal-format
-#| msgid "%Hcollapse argument needs positive constant integer expression"
msgid "%<safelen%> clause expression must be positive constant integer expression"
msgstr "%H折叠变量需要正整常数表达式"
#: c/c-parser.c:10611
#, fuzzy, gcc-internal-format
-#| msgid "%Hcollapse argument needs positive constant integer expression"
msgid "%<simdlen%> clause expression must be positive constant integer expression"
msgstr "%H折叠变量需要正整常数表达式"
#: c/c-parser.c:10673 cp/parser.c:27875 cp/parser.c:28058
#, fuzzy, gcc-internal-format
-#| msgid "invalid schedule kind"
msgid "invalid depend kind"
msgstr "无效的调度类型"
#: c/c-parser.c:10710 cp/parser.c:27915
#, fuzzy, gcc-internal-format
-#| msgid "invalid mask"
msgid "invalid map kind"
msgstr "无效掩码"
#: c/c-parser.c:10775 cp/parser.c:28005
#, fuzzy, gcc-internal-format
-#| msgid "invalid schedule kind"
msgid "invalid dist_schedule kind"
msgstr "无效的调度类型"
#: c/c-parser.c:10844
#, fuzzy, gcc-internal-format
-#| msgid "invalid schedule kind"
msgid "invalid proc_bind kind"
msgstr "无效的调度类型"
#: c/c-parser.c:10999 cp/parser.c:28194
#, fuzzy, gcc-internal-format
-#| msgid "%qs must be used with %qs"
msgid "%qs must be the first clause of %qs"
msgstr "%qs必须与%qs一起使用"
#: c/c-parser.c:11459 cp/parser.c:28653 cp/parser.c:28679
#, fuzzy, gcc-internal-format
-#| msgid "invalid operator for %<#pragma omp atomic%>"
msgid "invalid form of %<#pragma omp atomic%>"
msgstr "%<#pragma omp atomic%>运算符无效"
#: c/c-parser.c:12219 cp/parser.c:29731
#, fuzzy, gcc-internal-format
-#| msgid "expected %<operator%>"
msgid "expected %<for%> after %qs"
msgstr "需要%<operator%>"
#: c/c-parser.c:12411 cp/parser.c:29918
#, fuzzy, gcc-internal-format
-#| msgid "expected %<using%>"
msgid "expected %<point%>"
msgstr "需要%<using%>"
#: c/c-parser.c:12615 cp/parser.c:30140
#, fuzzy, gcc-internal-format
-#| msgid "%<#pragma omp taskwait%> may only be used in compound statements"
msgid "%<#pragma omp target update%> may only be used in compound statements"
msgstr "%<#pragma omp taskwait%>只能用在复合语句中"
#: c/c-parser.c:12817 c/c-parser.c:12845
#, fuzzy, gcc-internal-format
-#| msgid "%<#pragma align%> must appear before the declaration of %D, ignoring"
msgid "%<#pragma omp declare simd%> must be followed by function declaration or definition"
msgstr "%<#pragma align%>必须出现在 %D 的声明之前,忽略"
#: c/c-parser.c:12983 cp/parser.c:30450
#, fuzzy, gcc-internal-format
-#| msgid "expected %<try%>"
msgid "expected %<target%>"
msgstr "需要%<try%>"
#: c/c-parser.c:12990 cp/parser.c:30457
#, fuzzy, gcc-internal-format
-#| msgid "expected %<decltype%>"
msgid "expected %<declare%>"
msgstr "需要%<decltype%>"
#: c/c-parser.c:12996 cp/parser.c:30464
#, fuzzy, gcc-internal-format
-#| msgid "%<#pragma GCC pop_options%> without a corresponding %<#pragma GCC push_options%>"
msgid "%<#pragma omp end declare target%> without corresponding %<#pragma omp declare target%>"
msgstr "%<#pragma GCC pop_options%>缺少相应的%<#pragma GCC push_options%>"
#: c/c-parser.c:13074
#, fuzzy, gcc-internal-format
-#| msgid "expected %<+%>, %<*%>, %<-%>, %<&%>, %<^%>, %<|%>, %<&&%>, or %<||%>"
msgid "expected %<+%>, %<*%>, %<-%>, %<&%>, %<^%>, %<|%>, %<&&%>, %<||%>, %<min%> or identifier"
msgstr "需要%<+%>、%<*%>、%<-%>、%<&%>、%<^%>、%<|%>、%<&&%>或%<||%>"
#: c/c-parser.c:13125
#, fuzzy, gcc-internal-format
-#| msgid "previous declaration"
msgid "previous %<#pragma omp declare reduction%>"
msgstr "上一个声明"
#: c/c-parser.c:13242
#, fuzzy, gcc-internal-format
-#| msgid "expected %<(%> or end of line"
msgid "expected %<omp_priv%> or function-name"
msgstr "需要%<(%>或行尾"
#: c/c-parser.c:13253
#, fuzzy, gcc-internal-format
-#| msgid "expected function"
msgid "expected function-name %<(%>"
msgstr "需要函数"
#: c/c-parser.c:13388 cp/parser.c:30900
#, fuzzy, gcc-internal-format
-#| msgid "expected %<#pragma omp section%> or %<}%>"
msgid "expected %<simd%> or %<reduction%> or %<target%>"
msgstr "需要%<#pragma omp section%>或%<}%>"
#: c/c-parser.c:13536
#, fuzzy, gcc-internal-format
-#| msgid "#pragma GCC optimize is not allowed inside functions"
msgid "pragma simd must be inside a function"
msgstr "#pragma GCC optimize 不允许用在函数中"
#: c/c-parser.c:13580 cp/parser.c:31586
#, fuzzy, gcc-internal-format
-#| msgid "selector must be an integer constant in the range 0..%wi"
msgid "vectorlength must be an integer constant"
msgstr "选择子必须是 0 到 %wi 间的整常量"
#: c/c-parser.c:13582 cp/parser.c:31589
#, fuzzy, gcc-internal-format
-#| msgid "stack size must be an exact power of 2"
msgid "vectorlength must be a power of 2"
msgstr "栈大小必须刚好是 2 的某次方"
#: c/c-parser.c:13665 cp/parser.c:31696
#, fuzzy, gcc-internal-format
-#| msgid "selector must be an integer constant in the range 0..%wi"
msgid "step size must be an integer constant expression or an integer variable"
msgstr "选择子必须是 0 到 %wi 间的整常量"
#: c/c-parser.c:13764 cp/parser.c:31789
#, fuzzy, gcc-internal-format
-#| msgid "expected %<#pragma omp%> clause"
msgid "expected %<#pragma simd%> clause"
msgstr "需要%<#pragma omp%>子句"
#: c/c-parser.c:14059 cp/parser.c:6263
#, fuzzy, gcc-internal-format
-#| msgid "expected %<:%> or %<::%>"
msgid "expected %<:%> or numeral"
msgstr "需要%<:%>或%<::%>"
#: c/c-parser.c:14077 c/c-parser.c:14120
#, fuzzy, gcc-internal-format
-#| msgid "new cannot be applied to a function type"
msgid "array notations cannot be used with function type"
msgstr "new 不能用于函数类型"
#: c/c-parser.c:14148 c/c-parser.c:14151
#, fuzzy, gcc-internal-format
-#| msgid "expected boolean expression"
msgid "expected array notation expression"
msgstr "需要布尔表达式"
#: c/c-typeck.c:1832
#, fuzzy, gcc-internal-format
-#| msgid "defining a type in a compound literal is invalid in C++"
msgid "converting an array compound literal to a pointer is ill-formed in C++"
msgstr "C++ 不允许在组合字面常量中定义类型"
#: c/c-typeck.c:2434
#, fuzzy, gcc-internal-format
-#| msgid "alignment of array elements is greater than element size"
msgid "rank of the array's index is greater than 1"
msgstr "数组元素的对齐边界比元素大小还要大"
#: c/c-typeck.c:2881
#, fuzzy, gcc-internal-format
-#| msgid "called object %qE is not a function"
msgid "called object %qE is not a function or function pointer"
msgstr "被调用的对象%qE不是一个函数"
#: c/c-typeck.c:2886
#, fuzzy, gcc-internal-format
-#| msgid "called object %qE is not a function"
msgid "called object %qD is not a function or function pointer"
msgstr "被调用的对象%qE不是一个函数"
#: c/c-typeck.c:2892
#, fuzzy, gcc-internal-format
-#| msgid "called object %qE is not a function"
msgid "called object is not a function or function pointer"
msgstr "被调用的对象%qE不是一个函数"
#: c/c-typeck.c:3515 cp/typeck.c:5054
#, fuzzy, gcc-internal-format
-#| msgid "arithmetic on pointer to an incomplete type"
msgid "arithmetic on pointer to an empty aggregate"
msgstr "在指向不完全类型的指针上执行算术运算"
#: c/c-typeck.c:4725 cp/typeck.c:6204
#, fuzzy, gcc-internal-format
-#| msgid "a function call cannot appear in a constant-expression"
msgid "spawned function call cannot be part of a comma expression"
msgstr "函数调用不能出现在常量表达式中"
#: c/c-typeck.c:4777 c/c-typeck.c:9666
#, fuzzy, gcc-internal-format
-#| msgid "left-hand operand of comma expression has no effect"
msgid "right-hand operand of comma expression has no effect"
msgstr "逗号表达式的左操作数不起作用"
#: c/c-typeck.c:5214
#, fuzzy, gcc-internal-format
-#| msgid "assignment suppression"
msgid "assignment to expression with array type"
msgstr "取消赋值"
#: c/c-typeck.c:7436
#, fuzzy, gcc-internal-format
-#| msgid "missing initializer for member %qD"
msgid "missing initializer for field %qD of %qT"
msgstr "成员%qD缺少初始值设定"
#: c/c-typeck.c:9139 cp/typeck.c:8333
#, fuzzy, gcc-internal-format
-#| msgid "Logical range in CASE statement at %L is not allowed"
msgid "use of %<_Cilk_spawn%> in a return statement is not allowed"
msgstr "%L处 CASE 语句中的逻辑范围是不被允许的"
#: c/c-typeck.c:9621
#, fuzzy, gcc-internal-format
-#| msgid "break statement not within loop or switch"
msgid "break statement within %<#pragma simd%> loop body"
msgstr "break 语句不在循环或开关语句内"
#: c/c-typeck.c:9623 cp/parser.c:10656
#, fuzzy, gcc-internal-format
-#| msgid "continue statement not within a loop"
msgid "continue statement within %<#pragma simd%> loop body"
msgstr "continue 语句出现在循环以外"
#: c/c-typeck.c:10464 c/c-typeck.c:10601 cp/typeck.c:4570
#, fuzzy, gcc-internal-format
-#| msgid "Warn about comparison of different enum types"
msgid "comparing vectors with different element types"
msgstr "对不同枚举类型之间的比较给出警告"
#: c/c-typeck.c:11053
#, fuzzy, gcc-internal-format
-#| msgid "used struct type value where scalar is required"
msgid "used vector type where scalar is required"
msgstr "需要标量时使用了结构类型"
#: c/c-typeck.c:11269 cp/semantics.c:4222 cp/semantics.c:5655
#, fuzzy, gcc-internal-format
-#| msgid "%qD is not a variable in clause %qs"
msgid "%qD is not a variable in %qs clause"
msgstr "%qD在子句%qs中不是一个变量"
#: c/c-typeck.c:11273 c/c-typeck.c:12044 cp/semantics.c:4226
#: cp/semantics.c:5658
#, fuzzy, gcc-internal-format
-#| msgid "%qE is not a variable in clause %qs"
msgid "%qE is not a variable in %qs clause"
msgstr "%qE在子句%qs中不是一个变量"
#: c/c-typeck.c:11281 c/c-typeck.c:12051 cp/semantics.c:4234
#: cp/semantics.c:5664
#, fuzzy, gcc-internal-format
-#| msgid "%qD is not a variable in clause %qs"
msgid "%qD is threadprivate variable in %qs clause"
msgstr "%qD在子句%qs中不是一个变量"
#: c/c-typeck.c:11303 cp/semantics.c:4260
#, fuzzy, gcc-internal-format
-#| msgid "size in array new must have integral type"
msgid "low bound %qE of array section does not have integral type"
msgstr "数组 new 的大小必须有整数类型"
#: c/c-typeck.c:11310 cp/semantics.c:4267
#, fuzzy, gcc-internal-format
-#| msgid "size in array new must have integral type"
msgid "length %qE of array section does not have integral type"
msgstr "数组 new 的大小必须有整数类型"
#: c/c-typeck.c:11359 cp/semantics.c:4316
#, fuzzy, gcc-internal-format
-#| msgid "variable length array is used"
msgid "negative length in array section in %qs clause"
msgstr "使用了变长数组"
#: c/c-typeck.c:11447 cp/semantics.c:4404
#, fuzzy, gcc-internal-format
-#| msgid "for increment expression has no effect"
msgid "for pointer type length expression must be specified"
msgstr "for 循环増量表达式不起作用"
#: c/c-typeck.c:11456 c/c-typeck.c:11571 cp/semantics.c:4413
#: cp/semantics.c:4524
#, fuzzy, gcc-internal-format
-#| msgid "Copy array sections into a contiguous block on procedure entry"
msgid "array section is not contiguous in %qs clause"
msgstr "在过程入口处将数组段复制到一个连续的块中"
#: c/c-typeck.c:11975 cp/semantics.c:5545
#, fuzzy, gcc-internal-format
-#| msgid "%qE is not a variable in clause %qs"
msgid "%qE is not a variable in %<aligned%> clause"
msgstr "%qE在子句%qs中不是一个变量"
#: c/c-typeck.c:11982
#, fuzzy, gcc-internal-format
-#| msgid "type to vector delete is neither pointer or array type"
msgid "%qE in %<aligned%> clause is neither a pointer nor an array"
msgstr "向量 delete 的实参类型既非指针也非数组"
#: c/c-typeck.c:11989
#, fuzzy, gcc-internal-format
-#| msgid "%qE appears more than once in data clauses"
msgid "%qE appears more than once in %<aligned%> clauses"
msgstr "%qE在数据子句中多次出现"
#: c/c-typeck.c:12010 cp/semantics.c:5615
#, fuzzy, gcc-internal-format
-#| msgid "%qE is not a variable in clause %qs"
msgid "%qE is not a variable in %<depend%> clause"
msgstr "%qE在子句%qs中不是一个变量"
#: c/c-typeck.c:12062 cp/semantics.c:5680
#, fuzzy, gcc-internal-format
-#| msgid "%qD is not a variable in clause %qs"
msgid "%qD does not have a mappable type in %qs clause"
msgstr "%qD在子句%qs中不是一个变量"
#: c/c-typeck.c:12069 cp/semantics.c:5687
#, fuzzy, gcc-internal-format
-#| msgid "%qD appears more than once in data clauses"
msgid "%qD appears more than once in motion clauses"
msgstr "%qD在数据子句中多次出现"
#: c/c-typeck.c:12071 cp/semantics.c:5689
#, fuzzy, gcc-internal-format
-#| msgid "%qD appears more than once in data clauses"
msgid "%qD appears more than once in map clauses"
msgstr "%qD在数据子句中多次出现"
#: c/c-typeck.c:12084 cp/semantics.c:5703
#, fuzzy, gcc-internal-format
-#| msgid "%qD is not a variable in clause %qs"
msgid "%qD is not an argument in %<uniform%> clause"
msgstr "%qD在子句%qs中不是一个变量"
#: c/c-typeck.c:12087 cp/semantics.c:5705
#, fuzzy, gcc-internal-format
-#| msgid "%qE is not a variable in clause %qs"
msgid "%qE is not an argument in %<uniform%> clause"
msgstr "%qE在子句%qs中不是一个变量"
#. Re-run template unification with diagnostics.
#: cp/call.c:3279
#, fuzzy, gcc-internal-format
-#| msgid "template argument %d is invalid"
msgid " template argument deduction/substitution failed:"
msgstr "模板第 %d 个参数无效"
#: cp/call.c:4245
#, fuzzy, gcc-internal-format
-#| msgid "ambiguous overload for %qs in %<%s %E%>"
msgid "ambiguous overload for "
msgstr "%qs在%<%s %E%>中的重载有歧义"
#: cp/call.c:4246
#, fuzzy, gcc-internal-format
-#| msgid "no match for %qs in %<%s %E%>"
msgid "no match for "
msgstr "%qs在%<%s %E%>中没有匹配"
#: cp/call.c:4249
#, fuzzy, gcc-internal-format
-#| msgid "invalid operands to binary %s (have %qT and %qT)"
msgid " (operand types are %qT, %qT, and %qT)"
msgstr "双目运算符 %s 操作数(%qT和%qT)无效"
#: cp/call.c:4251
#, fuzzy, gcc-internal-format
-#| msgid "invalid operands to binary %s (have %qT and %qT)"
msgid " (operand types are %qT and %qT)"
msgstr "双目运算符 %s 操作数(%qT和%qT)无效"
#: cp/call.c:4273
#, fuzzy, gcc-internal-format
-#| msgid "expected %<operator%>"
msgid "ternary %<operator?:%>"
msgstr "需要%<operator%>"
#: cp/call.c:4277
#, fuzzy, gcc-internal-format
-#| msgid "no match for ternary %<operator?:%> in %<%E ? %E : %E%>"
msgid "ternary %<operator?:%> in %<%E ? %E : %E%>"
msgstr "三元%<operator?:%>在%<%E ? %E : %E%>中没有匹配"
#: cp/call.c:4286 cp/call.c:4317 cp/call.c:4326
#, fuzzy, gcc-internal-format
-#| msgid "expected %<operator%>"
msgid "%<operator%s%>"
msgstr "需要%<operator%>"
#: cp/call.c:4289
#, fuzzy, gcc-internal-format
-#| msgid "no match for %<operator%s%> in %<%E%s%>"
msgid "%<operator%s%> in %<%E%s%>"
msgstr "%<operator%s%>在%<%E%s%>中没有匹配"
#: cp/call.c:4296
#, fuzzy, gcc-internal-format
-#| msgid "expected %<operator%>"
msgid "%<operator[]%>"
msgstr "需要%<operator%>"
#: cp/call.c:4299
#, fuzzy, gcc-internal-format
-#| msgid "no match for %<operator[]%> in %<%E[%E]%>"
msgid "%<operator[]%> in %<%E[%E]%>"
msgstr "%<operator[]%>在%<%E[%E]%>中没有匹配"
#: cp/call.c:4307
#, fuzzy, gcc-internal-format
-#| msgid "%s"
msgid "%qs"
msgstr "%s"
#: cp/call.c:4310
#, fuzzy, gcc-internal-format
-#| msgid "no match for %qs in %<%s %E%>"
msgid "%qs in %<%s %E%>"
msgstr "%qs在%<%s %E%>中没有匹配"
#: cp/call.c:4320
#, fuzzy, gcc-internal-format
-#| msgid "no match for %<operator%s%> in %<%E %s %E%>"
msgid "%<operator%s%> in %<%E %s %E%>"
msgstr "%<operator%s%>在%<%E %s %E%>中没有匹配"
#: cp/call.c:4329
#, fuzzy, gcc-internal-format
-#| msgid "no match for %<operator%s%> in %<%s%E%>"
msgid "%<operator%s%> in %<%s%E%>"
msgstr "%<operator%s%>在%<%s%E%>中没有匹配"
#: cp/call.c:4554
#, fuzzy, gcc-internal-format
-#| msgid "enumeral mismatch in conditional expression: %qT vs %qT"
msgid "incompatible vector types in conditional expression: %qT, %qT and %qT"
msgstr "条件表达式中枚举不匹配:%qT对%qT"
#: cp/call.c:5883
#, fuzzy, gcc-internal-format
-#| msgid "converting %<false%> to pointer type for argument %P of %qD"
msgid "converting %<false%> to pointer type %qT"
msgstr "将%<false%>转换为指向%2$qD的实参 %1$P 的指针类型"
#: cp/call.c:5940
#, fuzzy, gcc-internal-format
-#| msgid "invalid conversion from %qT to %qT"
msgid "invalid user-defined conversion from %qT to %qT"
msgstr "从类型%qT到类型%qT的转换无效"
#: cp/call.c:5975
#, fuzzy, gcc-internal-format
-#| msgid " initializing argument %P of %qD"
msgid "initializing argument %P of %qD"
msgstr " 初始化%2$qD的实参 %1$P"
#: cp/call.c:6080 cp/call.c:6219
#, fuzzy, gcc-internal-format
-#| msgid " initializing argument %P of %q+D"
msgid "initializing argument %P of %q+D"
msgstr "以初始化%2$q+D的实参 %1$P"
#: cp/call.c:6370 cp/cvt.c:1720
#, fuzzy, gcc-internal-format
-#| msgid "class %qT will be considered nearly empty in a future version of GCC"
msgid "scoped enum %qT will not promote to an integral type in a future version of GCC"
msgstr "在 GCC 的未来版本中类%qT将被看作几乎为空"
#: cp/call.c:6507
#, fuzzy, gcc-internal-format
-#| msgid "the default argument for parameter %d of %qD has not yet been parsed"
msgid "call to %qD uses the default argument for parameter %P, which is not yet defined"
msgstr "%2$qD的第 %1$d 个形参的默认实参尚未被解析到"
#: cp/call.c:6668
#, fuzzy, gcc-internal-format
-#| msgid "defaulted function %q+D with default argument"
msgid "use of multiversioned function without a default"
msgstr "默认化函数%q+D有默认参数"
#: cp/call.c:7662
#, fuzzy, gcc-internal-format
-#| msgid " for a function-style cast, remove the redundant %<::%D%>"
msgid "for a function-style cast, remove the redundant %<::%D%>"
msgstr "对于函数类型的类型转换,移除冗余的%<::%D%>"
#: cp/call.c:9075
#, fuzzy, gcc-internal-format
-#| msgid "could not convert %qE to %qT"
msgid "could not convert %qE from %qT to %qT"
msgstr "不能将%qE转换为%qT"
#: cp/class.c:302
#, fuzzy, gcc-internal-format
-#| msgid "cannot convert from base %qT to derived type %qT via virtual base %qT"
msgid "cannot convert from pointer to base class %qT to pointer to derived class %qT because the base is virtual"
msgstr "无法从基类%qT转换到派生类%qT,通过虚基类%qT"
#: cp/class.c:306
#, fuzzy, gcc-internal-format
-#| msgid "cannot convert from base %qT to derived type %qT via virtual base %qT"
msgid "cannot convert from base class %qT to derived class %qT because the base is virtual"
msgstr "无法从基类%qT转换到派生类%qT,通过虚基类%qT"
#: cp/class.c:313
#, fuzzy, gcc-internal-format
-#| msgid "cannot convert from base %qT to derived type %qT via virtual base %qT"
msgid "cannot convert from pointer to base class %qT to pointer to derived class %qT via virtual base %qT"
msgstr "无法从基类%qT转换到派生类%qT,通过虚基类%qT"
#: cp/class.c:318
#, fuzzy, gcc-internal-format
-#| msgid "cannot convert from base %qT to derived type %qT via virtual base %qT"
msgid "cannot convert from base class %qT to derived class %qT via virtual base %qT"
msgstr "无法从基类%qT转换到派生类%qT,通过虚基类%qT"
#: cp/class.c:1159
#, fuzzy, gcc-internal-format
-#| msgid " inlined from %qs"
msgid "%q#D inherited from %qT"
msgstr " 内联自%qs"
#: cp/class.c:1162
#, fuzzy, gcc-internal-format
-#| msgid "conflicts with previous declaration here"
msgid "conflicts with version inherited from %qT"
msgstr "与先前此处的声明冲突"
#: cp/class.c:1389 cp/class.c:1399
#, fuzzy, gcc-internal-format
-#| msgid "%qD declared here"
msgid "%qT declared here"
msgstr "%qD在此声明"
#: cp/class.c:1508
#, fuzzy, gcc-internal-format
-#| msgid "cannot convert from base %qT to derived type %qT via virtual base %qT"
msgid "cannot derive from %<final%> base %qT in derived type %qT"
msgstr "无法从基类%qT转换到派生类%qT,通过虚基类%qT"
#: cp/class.c:2753
#, fuzzy, gcc-internal-format
-#| msgid "%q+D defined but not used"
msgid "%q+#D marked final, but is not virtual"
msgstr "%q+D定义后未使用"
#: cp/class.c:3594
#, fuzzy, gcc-internal-format
-#| msgid "non-member %qs cannot be declared %<mutable%>"
msgid "member %q+D cannot be declared both %<const%> and %<mutable%>"
msgstr "非成员%qs不能被声明为%<mutable%>"
#: cp/class.c:3600
#, fuzzy, gcc-internal-format
-#| msgid "non-member %qs cannot be declared %<mutable%>"
msgid "member %q+D cannot be declared as a %<mutable%> reference"
msgstr "非成员%qs不能被声明为%<mutable%>"
#: cp/class.c:5393
#, fuzzy, gcc-internal-format
-#| msgid "%q#T is not a class"
msgid "%q+T is not literal because:"
msgstr "%q#T不是一个类"
#: cp/class.c:5395
#, fuzzy, gcc-internal-format
-#| msgid "base class %q#T has a non-virtual destructor"
msgid " %q+T has a non-trivial destructor"
msgstr "基类%q#T有一个非虚析构函数"
#: cp/class.c:5450
#, fuzzy, gcc-internal-format
-#| msgid "non-static data member %qD has Java class type"
msgid " non-static data member %q+D has non-literal type"
msgstr "非静态数据成员%qD具有 Java 类类型"
#: cp/class.c:6643
#, fuzzy, gcc-internal-format
-#| msgid "type %qT does not have a known size"
msgid "type transparent %q#T does not have any fields"
msgstr "类型%qT大小未知"
#: cp/class.c:6653
#, fuzzy, gcc-internal-format
-#| msgid "type %qE has virtual member functions"
msgid "type transparent class %qT has virtual functions"
msgstr "类型%qE有虚成员函数"
#: cp/cp-array-notation.c:605
#, fuzzy, gcc-internal-format
-#| msgid "%qD cannot be declared as constexpr"
msgid "%qD cannot be scalar when %qD is not"
msgstr "%qD不能被声明为广义常表达式"
#: cp/cp-array-notation.c:1422
#, fuzzy, gcc-internal-format
-#| msgid "new cannot be applied to a function type"
msgid "array notation cannot be used with function type"
msgstr "new 不能用于函数类型"
#: cp/cp-cilkplus.c:53
#, fuzzy, gcc-internal-format
-#| msgid "statement-expressions are not allowed outside functions nor in template-argument lists"
msgid "throw expressions are not allowed inside loops marked with pragma simd"
msgstr "语句表达式只能用于函数或模板实参列表内"
#: cp/cp-cilkplus.c:60
#, fuzzy, gcc-internal-format
-#| msgid "%s statement is not allowed inside of BLOCK at %C"
msgid "try statements are not allowed inside loops marked with #pragma simd"
msgstr "%s 语句不能用在%C处 BLOCK 内"
#: cp/cvt.c:780
#, fuzzy, gcc-internal-format
-#| msgid "could not convert %qE to %qT"
msgid "could not convert %qE from %<void%> to %<bool%>"
msgstr "不能将%qE转换为%qT"
#: cp/cvt.c:1644
#, fuzzy, gcc-internal-format
-#| msgid "could not convert template argument %qE to %qT"
msgid "default type conversion can't deduce template argument for %qD"
msgstr "不能将模板参数从%qE转换到%qT"
#: cp/decl.c:1304
#, fuzzy, gcc-internal-format
-#| msgid "previous declaration of %q+D with attribute noinline"
msgid "previous declaration of %qD with attribute noinline"
msgstr "先前%q+D的声明带有 noinline 属性"
#: cp/decl.c:1314
#, fuzzy, gcc-internal-format
-#| msgid "previous declaration of %q+D was inline"
msgid "previous declaration of %qD was inline"
msgstr "%q+D先前被声明为内联的"
#: cp/decl.c:1349
#, fuzzy, gcc-internal-format
-#| msgid "conflicts with built-in declaration %q#D"
msgid "declaration of %q#D conflicts with built-in declaration %q#D"
msgstr "与内建声明%q#D冲突"
#: cp/decl.c:1357
#, fuzzy, gcc-internal-format
-#| msgid "declaration of %qD shadows a global declaration"
msgid "redeclaration of %<pragma omp declare reduction%>"
msgstr "%qD的声明隐藏了一个全局声明"
#: cp/decl.c:1359
#, fuzzy, gcc-internal-format
-#| msgid "previous non-function declaration %q+#D"
msgid "previous %<pragma omp declare reduction%> declaration"
msgstr "先前对于%q+#D的非函数声明"
#: cp/decl.c:1410
#, fuzzy, gcc-internal-format
-#| msgid "ambiguates built-in declaration %q#D"
msgid "new declaration %q#D ambiguates built-in declaration %q#D"
msgstr "使内建声明%q#D出现歧义"
#: cp/decl.c:1505 cp/decl.c:1526 cp/decl.c:1553
#, fuzzy, gcc-internal-format
-#| msgid "previous declaration %q+D"
msgid "previous declaration %q#D"
msgstr "先前的声明%q+D"
#: cp/decl.c:1524
#, fuzzy, gcc-internal-format
-#| msgid "declaration of template %q#D"
msgid "conflicting declaration of template %q#D"
msgstr "模板声明%q#D"
#: cp/decl.c:1540
#, fuzzy, gcc-internal-format
-#| msgid "ambiguates old declaration %q+#D"
msgid "ambiguating new declaration %q#D"
msgstr "使旧的声明%q+#D出现歧义"
#: cp/decl.c:1542 cp/decl.c:1565
#, fuzzy, gcc-internal-format
-#| msgid "global declaration %q+#D"
msgid "old declaration %q#D"
msgstr "全局声明%q+#D"
#: cp/decl.c:1550
#, fuzzy, gcc-internal-format
-#| msgid "conflicting declaration %q#D"
msgid "conflicting declaration of C function %q#D"
msgstr "相互冲突的声明%q#D"
#: cp/decl.c:1563
#, fuzzy, gcc-internal-format
-#| msgid "ambiguates old declaration %q+#D"
msgid "ambiguating new declaration of %q#D"
msgstr "使旧的声明%q+#D出现歧义"
#: cp/decl.c:1575
#, fuzzy, gcc-internal-format
-#| msgid "previous declaration of %q+#D"
msgid "previous declaration as %q#D"
msgstr "%q+#D的前一个声明"
#. of the program.
#: cp/decl.c:1627
#, fuzzy, gcc-internal-format
-#| msgid "conflicting declaration %q#D"
msgid "conflicting declaration of namespace %qD"
msgstr "相互冲突的声明%q#D"
#: cp/decl.c:1629
#, fuzzy, gcc-internal-format
-#| msgid "previous declaration of namespace %q+D here"
msgid "previous declaration of namespace %qD here"
msgstr "命名空间%q+D早先的声明在这里"
#: cp/decl.c:1642 cp/name-lookup.c:1152 cp/name-lookup.c:1175
#, fuzzy, gcc-internal-format
-#| msgid "previously declared here"
msgid "%q+#D previously declared here"
msgstr "以前在此声明过"
#: cp/decl.c:1652
#, fuzzy, gcc-internal-format
-#| msgid "prototype for %q+#D"
msgid "prototype specified for %q#D"
msgstr "%q+#D的原型"
#: cp/decl.c:1654
#, fuzzy, gcc-internal-format
-#| msgid "follows non-prototype definition here"
msgid "previous non-prototype definition here"
msgstr "出现在此处的非原型定义之后"
#: cp/decl.c:1693
#, fuzzy, gcc-internal-format
-#| msgid "conflicts with new declaration with %qL linkage"
msgid "conflicting declaration of %q#D with %qL linkage"
msgstr "与带有%qL链接的新声明冲突"
#: cp/decl.c:1696
#, fuzzy, gcc-internal-format
-#| msgid "previous declaration of %q+#D with %qL linkage"
msgid "previous declaration with %qL linkage"
msgstr "%q+#D的早先声明有%qL链接"
#: cp/decl.c:1723
#, fuzzy, gcc-internal-format
-#| msgid "redeclaration of friend %q#D may not have default template arguments"
msgid "redeclaration of %q#D may not have default arguments"
msgstr "友元%q#D的重声明不能有默认模板参数"
#: cp/decl.c:1741 cp/decl.c:1749
#, fuzzy, gcc-internal-format
-#| msgid "after previous specification in %q+#D"
msgid "previous specification in %q#D here"
msgstr "但先前在%q+#D中已有指定"
#: cp/decl.c:1815 cp/decl.c:1825
#, fuzzy, gcc-internal-format
-#| msgid "previous declaration of %q+D"
msgid "previous declaration of %qD"
msgstr "%q+D的前一个声明"
#: cp/decl.c:3395
#, fuzzy, gcc-internal-format
-#| msgid "no class template named %q#T in %q#T"
msgid "no type named %q#T in %q#T"
msgstr "没有名为%q#T的类模板,在%q#T中 "
#: cp/decl.c:4246
#, fuzzy, gcc-internal-format
-#| msgid "attribute ignored in declaration of %q+#T"
msgid "attribute ignored in declaration of %q#T"
msgstr "属性于%q+#T的声明中被忽略"
#: cp/decl.c:4249
#, fuzzy, gcc-internal-format
-#| msgid "attribute for %q+#T must follow the %qs keyword"
msgid "attribute for %q#T must follow the %qs keyword"
msgstr "%q+#T的属性必须跟在%qs关键字后面"
#: cp/decl.c:4294
#, fuzzy, gcc-internal-format
-#| msgid "%qs can only be specified for functions"
msgid "%<auto%> can only be specified for variables or function declarations"
msgstr "只能为函数指定%qs"
#: cp/decl.c:4378
#, fuzzy, gcc-internal-format
-#| msgid "attributes ignored on template instantiation"
msgid "attribute ignored in explicit instantiation %q#T"
msgstr "属性在模板实例化上被忽略"
#: cp/decl.c:4381
#, fuzzy, gcc-internal-format
-#| msgid "%qE attribute can only be applied to class definitions"
msgid "no attribute can be applied to an explicit instantiation"
msgstr "只能为类定义应用%qE属性"
#: cp/decl.c:5260
#, fuzzy, gcc-internal-format
-#| msgid "name %qD used in a GNU-style designated initializer for an array"
msgid "%<[%E] =%> used in a GNU-style designated initializer for class %qT"
msgstr "名字%qD用在 GNU 风格的数组指定元素初始值设定中"
#: cp/decl.c:5632
#, fuzzy, gcc-internal-format
-#| msgid "%qD has incomplete type"
msgid "%q#D has incomplete type"
msgstr "%qD类型不完全"
#: cp/decl.c:7176
#, fuzzy, gcc-internal-format
-#| msgid "initializer fails to determine size of %qD"
msgid "initializer fails to determine size of %qT"
msgstr "初始值设定无法决定%qD的大小"
#: cp/decl.c:7180
#, fuzzy, gcc-internal-format
-#| msgid "array size missing in %qD"
msgid "array size missing in %qT"
msgstr "%qD缺少数组大小"
#: cp/decl.c:7183
#, fuzzy, gcc-internal-format
-#| msgid "zero-size array %qD"
msgid "zero-size array %qT"
msgstr "大小为 0 的数组%qD"
#: cp/decl.c:7499
#, fuzzy, gcc-internal-format
-#| msgid "%<inline%> is not allowed in declaration of friend template specialization %qD"
msgid "%<constexpr%> is not allowed in declaration of friend template specialization %qD"
msgstr "%<inline%>不允许用于友元模板特例化%qD的声明"
#: cp/decl.c:7547
#, fuzzy, gcc-internal-format
-#| msgid "cannot declare %<::main%> to be inline"
msgid "cannot declare %<::main%> to be constexpr"
msgstr "不能将%<::main%>声明为 inline"
#: cp/decl.c:7620
#, fuzzy, gcc-internal-format
-#| msgid "static member function %qD cannot have cv-qualifier"
msgid "static member function %qD cannot have ref-qualifier"
msgstr "成员函数%qD不能拥有 cv 限定符"
#: cp/decl.c:7621
#, fuzzy, gcc-internal-format
-#| msgid "non-member function %qD cannot have cv-qualifier"
msgid "non-member function %qD cannot have ref-qualifier"
msgstr "非成员函数%qD不能拥有 cv 限定符"
#: cp/decl.c:7638
#, fuzzy, gcc-internal-format
-#| msgid "template with C linkage"
msgid "literal operator with C linkage"
msgstr "模板有 C 链接"
#: cp/decl.c:7667
#, fuzzy, gcc-internal-format
-#| msgid "%qD must be a nonstatic member function"
msgid "%qD must be a non-member function"
msgstr "%qD必须是一个非静态的成员函数"
#: cp/decl.c:7792
#, fuzzy, gcc-internal-format
-#| msgid "definition of implicitly-declared %qD"
msgid "definition of explicitly-defaulted %q+D"
msgstr "隐式声明的%qD的定义"
#: cp/decl.c:7793
#, fuzzy, gcc-internal-format
-#| msgid "%q+#D previously defined here"
msgid "%q+#D explicitly defaulted here"
msgstr "%q+#D已在此定义过"
#: cp/decl.c:8522
#, fuzzy, gcc-internal-format
-#| msgid "declaration of %qD as array of void"
msgid "declaration of %qD as array of %<auto%>"
msgstr "%qD声明为 void 的数组"
#: cp/decl.c:8578
#, fuzzy, gcc-internal-format
-#| msgid "creating array of functions"
msgid "array of array of runtime bound"
msgstr "创建函数的数组"
#: cp/decl.c:9014
#, fuzzy, gcc-internal-format
-#| msgid "template declaration of %<typedef%>"
msgid "declaration of %qD as %<typedef%>"
msgstr "%<typedef%>的模板声明"
#: cp/decl.c:9019
#, fuzzy, gcc-internal-format
-#| msgid "declaration of %q+D shadows a parameter"
msgid "declaration of %qD as parameter"
msgstr "%q+D的声明隐藏了一个形参"
#: cp/decl.c:9608
#, fuzzy, gcc-internal-format
-#| msgid "%qs function uses %<auto%> type specifier without late return type"
msgid "%qs function uses %<auto%> type specifier without trailing return type"
msgstr "%qs函数使用了%<auto%>类型限定却没有迟返回类型"
#: cp/decl.c:9611
#, fuzzy, gcc-internal-format
-#| msgid "scoped enums only available with -std=c++0x or -std=gnu++0x"
msgid "deduced return type only available with -std=c++1y or -std=gnu++1y"
msgstr "带作用域的枚举只在 -std=c++0x 或 -std=gnu++0x 下可用"
#: cp/decl.c:9616
#, fuzzy, gcc-internal-format
-#| msgid "virtual functions cannot be friends"
msgid "virtual function cannot have deduced return type"
msgstr "虚函数不能是友元"
#: cp/decl.c:9621
#, fuzzy, gcc-internal-format
-#| msgid "%qs function with late return type has %qT as its type rather than plain %<auto%>"
msgid "%qs function with trailing return type has %qT as its type rather than plain %<auto%>"
msgstr "%qs函数使用迟返回类型%qT作为它的类型,而不是%<auto%>"
#: cp/decl.c:9635
#, fuzzy, gcc-internal-format
-#| msgid "%qs function with late return type not declared with %<auto%> type specifier"
msgid "%qs function with trailing return type not declared with %<auto%> type specifier"
msgstr "%qs函数使用了迟返回类型却未用%<auto%>类型限定声明"
#: cp/decl.c:9670
#, fuzzy, gcc-internal-format
-#| msgid "destructor cannot be static member function"
msgid "constructor cannot be static member function"
msgstr "析构函数不能是静态成员函数"
#: cp/decl.c:9675
#, fuzzy, gcc-internal-format
-#| msgid "destructors may not be cv-qualified"
msgid "constructors may not be cv-qualified"
msgstr "析构函数不能被 cv 限定"
#: cp/decl.c:9683
#, fuzzy, gcc-internal-format
-#| msgid "destructors may not be cv-qualified"
msgid "destructors may not be ref-qualified"
msgstr "析构函数不能被 cv 限定"
#: cp/decl.c:9829
#, fuzzy, gcc-internal-format
-#| msgid "Array reference out of bounds"
msgid "reference to array of runtime bound"
msgstr "对数组的引用超出范围"
#: cp/decl.c:9830
#, fuzzy, gcc-internal-format
-#| msgid "pointer to a function used in subtraction"
msgid "pointer to array of runtime bound"
msgstr "函数指针不能相减"
#: cp/decl.c:10028
#, fuzzy, gcc-internal-format
-#| msgid "cannot define member function %<%T::%s%> within %<%T%>"
msgid "cannot declare member function %<%T::%s%> within %<%T%>"
msgstr "无法定义成员函数%<%T::%s%>,在%<%T%>中"
#: cp/decl.c:10170
#, fuzzy, gcc-internal-format
-#| msgid "parameter declared %<auto%>"
msgid "typedef declared %<auto%>"
msgstr "形参声明为%<auto%>"
#: cp/decl.c:10176
#, fuzzy, gcc-internal-format
-#| msgid "creating array of functions"
msgid "typedef naming array of runtime bound"
msgstr "创建函数的数组"
#: cp/decl.c:10420
#, fuzzy, gcc-internal-format
-#| msgid "%<this%> may not be used in this context"
msgid "%<auto%> parameter not permitted in this context"
msgstr "%<this%>不能用在此上下文中"
#: cp/decl.c:10465
#, fuzzy, gcc-internal-format
-#| msgid "non-static data member %qE declared %<constexpr%>"
msgid "non-static data member declared %<auto%>"
msgstr "非静态数据成员%qE被声明为%<constexpr%>"
#: cp/decl.c:10608
#, fuzzy, gcc-internal-format
-#| msgid "field %qD has incomplete type"
msgid "field %qD has incomplete type %qT"
msgstr "字段%qD类型不完全"
#: cp/decl.c:10747
#, fuzzy, gcc-internal-format
-#| msgid "storage class %<__thread%> invalid for function %qs"
msgid "storage class %<thread_local%> invalid for function %qs"
msgstr "函数%qs的存储类%<__thread%>无效"
#: cp/decl.c:10752
#, fuzzy, gcc-internal-format
-#| msgid "an asm-specification is not allowed on a function-definition"
msgid "virt-specifiers in %qs not allowed outside a class definition"
msgstr "函数定义中不允许出现 asm 指定"
#: cp/decl.c:10783
#, fuzzy, gcc-internal-format
-#| msgid "%qs defined in a non-class scope"
msgid "%qs declared in a non-class scope"
msgstr "%qs定义在在非类作用域中"
#: cp/decl.c:11032
#, fuzzy, gcc-internal-format
-#| msgid "default argument %qE uses local variable %qD"
msgid "default argument %qE uses %qD"
msgstr "默认实参%qE使用了局部变量%qD"
#: cp/decl.c:11915
#, fuzzy, gcc-internal-format
-#| msgid "ambiguous template specialization %qD for %q+D"
msgid "using alias template specialization %qT after %qs"
msgstr "有歧义的模板特例化%qD(为%q+D)"
#: cp/decl.c:11920
#, fuzzy, gcc-internal-format
-#| msgid "%q+D has a previous declaration here"
msgid "%qD has a previous declaration here"
msgstr "%q+D先前在此处有过声明"
#: cp/decl.c:12928
#, fuzzy, gcc-internal-format
-#| msgid "integer constant is too large for %<unsigned long%> type"
msgid "incremented enumerator value is too large for %<unsigned long%>"
msgstr "对%<unsigned long%>类型而言整数常量太大"
#: cp/decl.c:12960
#, fuzzy, gcc-internal-format
-#| msgid "enumerator value %E is too large for underlying type %<%T%>"
msgid "enumerator value %E is outside the range of underlying type %<%T%>"
msgstr "枚举值 %E 对其类型%<%T%>而言太大了"
#: cp/decl.c:13960
#, fuzzy, gcc-internal-format
-#| msgid "no return statement in function returning non-void"
msgid "no return statements in function returning %qT"
msgstr "在有返回值的函数中未发现 return 语句"
#: cp/decl.c:13962 cp/typeck.c:8384
#, fuzzy, gcc-internal-format
-#| msgid "function return types not compatible due to %<volatile%>"
msgid "only plain %<auto%> return type can be deduced to %<void%>"
msgstr "由于%<volatile%>,函数返回类型不兼容"
#: cp/decl.c:14531 cp/decl2.c:4673
#, fuzzy, gcc-internal-format
-#| msgid "type of %qD defaults to %<int%>"
msgid "use of %qD before deduction of %<auto%>"
msgstr "%qD的类型默认为%<int%>"
#: cp/decl2.c:449
#, fuzzy, gcc-internal-format
-#| msgid "deleting array %q#D"
msgid "deleting array %q#E"
msgstr "删除数组%q#D"
#: cp/decl2.c:1388
#, fuzzy, gcc-internal-format
-#| msgid "%qD is not a static data member of a class template"
msgid "%q+D static data member inside of declare target directive"
msgstr "%qD不是类模板的非静态数据成员"
#: cp/error.c:3474
#, fuzzy, gcc-internal-format
-#| msgid "extended initializer lists only available with -std=c++0x or -std=gnu++0x"
msgid "extended initializer lists only available with -std=c++11 or -std=gnu++11"
msgstr "扩展初始值设定列表只在 -std=c++0x 或 -std=gnu++0x 下可用"
#: cp/error.c:3479
#, fuzzy, gcc-internal-format
-#| msgid "explicit conversion operators only available with -std=c++0x or -std=gnu++0x"
msgid "explicit conversion operators only available with -std=c++11 or -std=gnu++11"
msgstr "显式转换运算符只在 -std=c++0x 或 -std=gnu++0x 下可用"
#: cp/error.c:3484
#, fuzzy, gcc-internal-format
-#| msgid "variadic templates only available with -std=c++0x or -std=gnu++0x"
msgid "variadic templates only available with -std=c++11 or -std=gnu++11"
msgstr "可变参数模板只在 -std=c++0x 或 -std=gnu++0x 下可用"
#: cp/error.c:3489
#, fuzzy, gcc-internal-format
-#| msgid "lambda expressions only available with -std=c++0x or -std=gnu++0x"
msgid "lambda expressions only available with -std=c++11 or -std=gnu++11"
msgstr "Lambda 表达式只在 -std=c++0x 或 -std=gnu++0x 下可用"
#: cp/error.c:3494
#, fuzzy, gcc-internal-format
-#| msgid "C++0x auto only available with -std=c++0x or -std=gnu++0x"
msgid "C++11 auto only available with -std=c++11 or -std=gnu++11"
msgstr "C++0x auto 只在 -std=c++0x 或 -std=gnu++0x 下可用"
#: cp/error.c:3498
#, fuzzy, gcc-internal-format
-#| msgid "scoped enums only available with -std=c++0x or -std=gnu++0x"
msgid "scoped enums only available with -std=c++11 or -std=gnu++11"
msgstr "带作用域的枚举只在 -std=c++0x 或 -std=gnu++0x 下可用"
#: cp/error.c:3502
#, fuzzy, gcc-internal-format
-#| msgid "defaulted and deleted functions only available with -std=c++0x or -std=gnu++0x"
msgid "defaulted and deleted functions only available with -std=c++11 or -std=gnu++11"
msgstr "默认化和被删除的函数只在 -std=c++0x 或 -std=gnu++0x 下可用"
#: cp/error.c:3512
#, fuzzy, gcc-internal-format
-#| msgid "explicit conversion operators only available with -std=c++0x or -std=gnu++0x"
msgid "override controls (override/final) only available with -std=c++11 or -std=gnu++11"
msgstr "显式转换运算符只在 -std=c++0x 或 -std=gnu++0x 下可用"
#: cp/error.c:3517
#, fuzzy, gcc-internal-format
-#| msgid "extended initializer lists only available with -std=c++0x or -std=gnu++0x"
msgid "non-static data member initializers only available with -std=c++11 or -std=gnu++11"
msgstr "扩展初始值设定列表只在 -std=c++0x 或 -std=gnu++0x 下可用"
#: cp/error.c:3522
#, fuzzy, gcc-internal-format
-#| msgid "extended initializer lists only available with -std=c++0x or -std=gnu++0x"
msgid "user-defined literals only available with -std=c++11 or -std=gnu++11"
msgstr "扩展初始值设定列表只在 -std=c++0x 或 -std=gnu++0x 下可用"
#: cp/error.c:3527
#, fuzzy, gcc-internal-format
-#| msgid "explicit conversion operators only available with -std=c++0x or -std=gnu++0x"
msgid "delegating constructors only available with -std=c++11 or -std=gnu++11"
msgstr "显式转换运算符只在 -std=c++0x 或 -std=gnu++0x 下可用"
#: cp/error.c:3537
#, fuzzy, gcc-internal-format
-#| msgid "C++0x auto only available with -std=c++0x or -std=gnu++0x"
msgid "c++11 attributes only available with -std=c++11 or -std=gnu++11"
msgstr "C++0x auto 只在 -std=c++0x 或 -std=gnu++0x 下可用"
#: cp/error.c:3542
#, fuzzy, gcc-internal-format
-#| msgid "scoped enums only available with -std=c++0x or -std=gnu++0x"
msgid "ref-qualifiers only available with -std=c++11 or -std=gnu++11"
msgstr "带作用域的枚举只在 -std=c++0x 或 -std=gnu++0x 下可用"
#: cp/except.c:987
#, fuzzy, gcc-internal-format
-#| msgid "cannot declare parameter %q+D to be of abstract type %qT"
msgid "cannot declare catch parameter to be of rvalue reference type %qT"
msgstr "不能将形参%q+D声明为具有抽象类型%qT"
#: cp/except.c:994
#, fuzzy, gcc-internal-format
-#| msgid "cannot create type information for type %qT because it involves types of variable size"
msgid "cannot throw expression of type %qT because it involves types of variable size"
msgstr "无法为类型%qT创建类型信息,因为它的大小是可变的"
#: cp/except.c:997
#, fuzzy, gcc-internal-format
-#| msgid "cannot create type information for type %qT because it involves types of variable size"
msgid "cannot catch type %qT because it involves types of variable size"
msgstr "无法为类型%qT创建类型信息,因为它的大小是可变的"
#: cp/init.c:378
#, fuzzy, gcc-internal-format
-#| msgid "invalid application of %qs to incomplete type %qT "
msgid "value-initialization of incomplete type %qT"
msgstr "%qs不能用于不完全的类型%qT"
#: cp/init.c:482
#, fuzzy, gcc-internal-format
-#| msgid "value-initialization of reference"
msgid "value-initialization of function type %qT"
msgstr "引用被值所初始化"
#: cp/init.c:488
#, fuzzy, gcc-internal-format
-#| msgid "value-initialization of reference"
msgid "value-initialization of reference type %qT"
msgstr "引用被值所初始化"
#: cp/init.c:585
#, fuzzy, gcc-internal-format
-#| msgid "%qD is used uninitialized in this function"
msgid "%qD is initialized with itself"
msgstr "此函数中的%qD在使用前未初始化"
#: cp/init.c:2147
#, fuzzy, gcc-internal-format
-#| msgid "uninitialized reference member in %q#T"
msgid "uninitialized reference member in base %q#T of %q#T"
msgstr "%q#T中有未初始化的引用成员"
#: cp/init.c:2317
#, fuzzy, gcc-internal-format
-#| msgid "integer overflow in expression"
msgid "integer overflow in array size"
msgstr "整数溢出"
#: cp/init.c:2327
#, fuzzy, gcc-internal-format
-#| msgid "Variable '%s' at %L in this context must be constant"
msgid "array size in operator new must be constant"
msgstr "变量‘%s’在%L处上下文中必须是常量"
#: cp/init.c:2341
#, fuzzy, gcc-internal-format
-#| msgid "variably modified field at file scope"
msgid "variably modified type not allowed in operator new"
msgstr "文件域中的动态可变字段"
#: cp/init.c:2355
#, fuzzy, gcc-internal-format
-#| msgid "ISO C does not support saturating types"
msgid "ISO C++ does not support variable-length array types"
msgstr "ISO C 不支持饱和类型"
#: cp/init.c:2477
#, fuzzy, gcc-internal-format
-#| msgid "not a valid Java .class file"
msgid "%qT isn%'t a valid Java class type"
msgstr "不是一个有效的 Java .class 文件。"
#: cp/init.c:2775
#, fuzzy, gcc-internal-format
-#| msgid "attributes after parenthesized initializer ignored"
msgid "parenthesized initializer in array new"
msgstr "括起的初始值设定后出现的属性被忽略"
#: cp/init.c:3158
#, fuzzy, gcc-internal-format
-#| msgid "possible problem detected in invocation of delete operator:"
msgid "possible problem detected in invocation of delete [] operator:"
msgstr "检测到调用 delete 运算符时可能出现的问题:"
#: cp/lambda.c:477
#, fuzzy, gcc-internal-format
-#| msgid "compound literal has variable size"
msgid "because the array element type %qT has variable size"
msgstr "复合字面值有可变的大小"
#: cp/lambda.c:514
#, fuzzy, gcc-internal-format
-#| msgid "already captured %<this%> in lambda expression"
msgid "already captured %qD in lambda expression"
msgstr "已经在 Lambda 表达式中捕获了%<this%>"
#: cp/mangle.c:2116
#, fuzzy, gcc-internal-format
-#| msgid "mangling unknown fixed point type"
msgid "mangling __underlying_type"
msgstr "修饰未知的定点类型"
#: cp/mangle.c:3500
#, fuzzy, gcc-internal-format
-#| msgid "-fabi-version=4 (or =0) avoids this error with a change in vector mangling"
msgid "-fabi-version=6 (or =0) avoids this error with a change in mangling"
msgstr "-fabi-version=4 (or =0) 可以改变向量修饰来避免这个错误"
#: cp/method.c:1010
#, fuzzy, gcc-internal-format
-#| msgid "a destructor cannot be %<constexpr%>"
msgid "defaulted constructor calls non-constexpr %q+D"
msgstr "析构函数不能是%<constexpr%>"
#: cp/method.c:1071
#, fuzzy, gcc-internal-format
-#| msgid "uninitialized const %qD is invalid in C++"
msgid "initializer for %q+#D is invalid"
msgstr "未初始化的常量%qD在C++中是无效的"
#: cp/method.c:1128
#, fuzzy, gcc-internal-format
-#| msgid "non-static data member %qD has Java class type"
msgid "copying non-static data member %q#D of rvalue reference type"
msgstr "非静态数据成员%qD具有 Java 类类型"
#: cp/method.c:1814
#, fuzzy, gcc-internal-format
-#| msgid "function %q+D defaulted on its first declaration must not have an exception-specification"
msgid "function %q+D defaulted on its redeclaration with an exception-specification that differs from the implicit declaration %q#D"
msgstr "首次声明时被默认化的函数%q+D不可以指定异常"
#: cp/method.c:1860
#, fuzzy, gcc-internal-format
-#| msgid "%qD cannot be defaulted"
msgid "a template cannot be defaulted"
msgstr "%qD不能被默认化"
#: cp/name-lookup.c:567
#, fuzzy, gcc-internal-format
-#| msgid "%q#D conflicts with previous using declaration %q#D"
msgid "%q#D conflicts with a previous declaration"
msgstr "%q#D与先前的 using 声明%q#D冲突"
#: cp/name-lookup.c:569
#, fuzzy, gcc-internal-format
-#| msgid "previous declaration %q+D"
msgid "previous declaration %q+#D"
msgstr "先前的声明%q+D"
#: cp/name-lookup.c:1189
#, fuzzy, gcc-internal-format
-#| msgid "declaration of %q+D shadows a parameter"
msgid "declaration of %qD shadows a lambda capture"
msgstr "%q+D的声明隐藏了一个形参"
#: cp/parser.c:792
#, fuzzy, gcc-internal-format
-#| msgid "identifier %qE will become a keyword in C++0x"
msgid "identifier %qE is a keyword in C++11"
msgstr "标志符%qE将会成为 C++0x 的一个关键字"
#: cp/parser.c:2719
#, fuzzy, gcc-internal-format
-#| msgid "%qE is not a template"
msgid "%qE is not a class template"
msgstr "%qE不是一个模板"
#: cp/parser.c:2809
#, fuzzy, gcc-internal-format
-#| msgid "a function call cannot appear in a constant-expression"
msgid "a transaction expression cannot appear in a constant-expression"
msgstr "函数调用不能出现在常量表达式中"
#: cp/parser.c:2903
#, fuzzy, gcc-internal-format
-#| msgid "C++0x %<constexpr%> only available with -std=c++0x or -std=gnu++0x"
msgid "C++11 %<constexpr%> only available with -std=c++11 or -std=gnu++11"
msgstr "C++0x %<constexpr%>只在 -std=c++0x 或 -std=gnu++0x 下可用"
#: cp/parser.c:2948
#, fuzzy, gcc-internal-format
-#| msgid "%qE in namespace %qE does not name a type"
msgid "%qE in namespace %qE does not name a template type"
msgstr "%qE不是命名空间%qE中的一个类型名"
#: cp/parser.c:2974
#, fuzzy, gcc-internal-format
-#| msgid "%qE in class %qT does not name a type"
msgid "%qE in %q#T does not name a template type"
msgstr "%qE不是类%qT中的一个类型名"
#: cp/parser.c:2978
#, fuzzy, gcc-internal-format
-#| msgid "%qE in class %qT does not name a type"
msgid "%qE in %q#T does not name a type"
msgstr "%qE不是类%qT中的一个类型名"
#: cp/parser.c:3867
#, fuzzy, gcc-internal-format
-#| msgid "floating constant exceeds range of %qT"
msgid "integer literal exceeds range of %qT type"
msgstr "浮点常量超出%qT的范围"
#: cp/parser.c:3873
#, fuzzy, gcc-internal-format
-#| msgid "floating constant exceeds range of %qT"
msgid "floating literal exceeds range of %qT type"
msgstr "浮点常量超出%qT的范围"
#: cp/parser.c:3877
#, fuzzy, gcc-internal-format
-#| msgid "floating constant truncated to zero"
msgid "floating literal truncated to zero"
msgstr "浮点常量向零截断"
#: cp/parser.c:3920
#, fuzzy, gcc-internal-format
-#| msgid "unable to find a register to spill in class %qs"
msgid "unable to find numeric literal operator %qD"
msgstr "在类%qs中找不到可溢出的寄存器"
#: cp/parser.c:3969
#, fuzzy, gcc-internal-format
-#| msgid "unable to find a register to spill in class %qs"
msgid "unable to find string literal operator %qD"
msgstr "在类%qs中找不到可溢出的寄存器"
#: cp/parser.c:4935 cp/parser.c:6785
#, fuzzy, gcc-internal-format
-#| msgid "C++0x auto only available with -std=c++0x or -std=gnu++0x"
msgid "%<~auto%> only available with -std=c++1y or -std=gnu++1y"
msgstr "C++0x auto 只在 -std=c++0x 或 -std=gnu++0x 下可用"
#: cp/parser.c:5276
#, fuzzy, gcc-internal-format
-#| msgid "%qT resolves to %qT, which is not an enumeration type"
msgid "decltype evaluates to %qT, which is not a class or enumeration type"
msgstr "%qT被解析到非枚举类型%qT"
#: cp/parser.c:6368
#, fuzzy, gcc-internal-format
-#| msgid "-client_name not allowed with -dynamiclib"
msgid "braced list index is not allowed with array notation"
msgstr "-client_name 不能和 -dynamiclib 一起使用"
#: cp/parser.c:6558
#, fuzzy, gcc-internal-format
-#| msgid "%<%D::%D%> is not a member of %qT"
msgid "%<%D::%D%> is not a class member"
msgstr "%<%D::%D%>不是%qT的成员"
#: cp/parser.c:7262
#, fuzzy, gcc-internal-format
-#| msgid "types may not be defined in a new-type-id"
msgid "types may not be defined in a new-expression"
msgstr "类型不能定义在 new-type-id 中"
#: cp/parser.c:7891
#, fuzzy, gcc-internal-format
-#| msgid "%<>>%> operator will be treated as two right angle brackets in C++0x"
msgid "%<>>%> operator is treated as two right angle brackets in C++11"
msgstr "%<>>%>运算符在 C++0x 中将被认为是两个右尖括号"
#: cp/parser.c:8901
#, fuzzy, gcc-internal-format
-#| msgid "lambda expressions only available with -std=c++0x or -std=gnu++0x"
msgid "lambda capture initializers only available with -std=c++1y or -std=gnu++1y"
msgstr "Lambda 表达式只在 -std=c++0x 或 -std=gnu++0x 下可用"
#: cp/parser.c:8931
#, fuzzy, gcc-internal-format
-#| msgid "increment of read-only variable %qD"
msgid "capture of non-variable %qD "
msgstr "令只读变量%qD自增"
#: cp/parser.c:8933 cp/parser.c:8942 cp/semantics.c:3237
#, fuzzy, gcc-internal-format
-#| msgid "%q+D declared here"
msgid "%q+#D declared here"
msgstr "%q+D已在此声明过"
#: cp/parser.c:9027
#, fuzzy, gcc-internal-format
-#| msgid "variadic templates only available with -std=c++0x or -std=gnu++0x"
msgid "lambda templates are only available with -std=c++1y or -std=gnu++1y"
msgstr "可变参数模板只在 -std=c++0x 或 -std=gnu++0x 下可用"
#: cp/parser.c:9485
#, fuzzy, gcc-internal-format
-#| msgid "attributes after parenthesized initializer ignored"
msgid "attributes at the beginning of statement are ignored"
msgstr "括起的初始值设定后出现的属性被忽略"
#: cp/parser.c:9692
#, fuzzy, gcc-internal-format
-#| msgid "%qD is not a constexpr function"
msgid "compound-statement in constexpr function"
msgstr "%qD不是一个广义常函数"
#: cp/parser.c:10305
#, fuzzy, gcc-internal-format
-#| msgid "expression statement has incomplete type"
msgid "range-based %<for%> expression of type %qT has incomplete type"
msgstr "表达式语句类型不完全"
#: cp/parser.c:10568
#, fuzzy, gcc-internal-format
-#| msgid "range-based-for loops are not allowed in C++98 mode"
msgid "range-based %<for%> loops are not allowed in C++98 mode"
msgstr "C++98 模式下不允许使用基于范围的 for 循环"
#: cp/parser.c:10642
#, fuzzy, gcc-internal-format
-#| msgid "break statement used with OpenMP for loop"
msgid "break statement used with Cilk Plus for loop"
msgstr "OpenMP for 循环中使用了 break 语句"
#. we're complaining about C++0x compatibility.
#: cp/parser.c:11485
#, fuzzy, gcc-internal-format
-#| msgid "%<auto%> will change meaning in C++0x; please remove it"
msgid "%<auto%> changes meaning in C++11; please remove it"
msgstr "%<auto%>的语义在 C++0x 中将被改变;请考虑删除它"
#: cp/parser.c:12122
#, fuzzy, gcc-internal-format
-#| msgid "types may not be defined in a new-type-id"
msgid "types may not be defined in a conversion-type-id"
msgstr "类型不能定义在 new-type-id 中"
#: cp/parser.c:12153
#, fuzzy, gcc-internal-format
-#| msgid "invalid use of %<auto%> in conversion operator"
msgid "use of %<auto%> in member template conversion operator can never be deduced"
msgstr "在转换运算符中使用%<auto%>无效"
#: cp/parser.c:12276
#, fuzzy, gcc-internal-format
-#| msgid "static declaration of %q+D follows non-static declaration"
msgid "mem-initializer for %qD follows constructor delegation"
msgstr "对%qD的静态声明出现在非静态声明之后"
#: cp/parser.c:12737 cp/parser.c:12784
#, fuzzy, gcc-internal-format
-#| msgid "expected a string after %<#pragma message%>"
msgid "expected empty string after %<operator%> keyword"
msgstr "%<#pragma message%>后需要一个字符串"
#: cp/parser.c:12761
#, fuzzy, gcc-internal-format
-#| msgid "expected identifier"
msgid "expected suffix identifier"
msgstr "需要标识符"
#: cp/parser.c:13403
#, fuzzy, gcc-internal-format
-#| msgid "(if you use %<-fpermissive%> G++ will accept your code)"
msgid "(if you use %<-fpermissive%> or %<-std=c++11%>, or %<-std=gnu++11%> G++ will accept your code)"
msgstr "(如果您使用%<-fpermissive%>G++ 会接受您的代码)"
#: cp/parser.c:14510
#, fuzzy, gcc-internal-format
-#| msgid "defaulted and deleted functions only available with -std=c++0x or -std=gnu++0x"
msgid "use of %<auto%> in lambda parameter declaration only available with -std=c++1y or -std=gnu++1y"
msgstr "默认化和被删除的函数只在 -std=c++0x 或 -std=gnu++0x 下可用"
#: cp/parser.c:14516
#, fuzzy, gcc-internal-format
-#| msgid "defaulted and deleted functions only available with -std=c++0x or -std=gnu++0x"
msgid "use of %<auto%> in parameter declaration only available with -std=c++1y or -std=gnu++1y"
msgstr "默认化和被删除的函数只在 -std=c++0x 或 -std=gnu++0x 下可用"
#: cp/parser.c:14521
#, fuzzy, gcc-internal-format
-#| msgid "ISO C forbids forward parameter declarations"
msgid "ISO C++ forbids use of %<auto%> in parameter declaration"
msgstr "ISO C 不允许前向参数声明"
#: cp/parser.c:15524
#, fuzzy, gcc-internal-format
-#| msgid "ISO C++ forbids incrementing an enum"
msgid "ISO C++ forbids empty anonymous enum"
msgstr "ISO C++ 不允许枚举自增"
#: cp/parser.c:16101
#, fuzzy, gcc-internal-format
-#| msgid "types may not be defined in exception-declarations"
msgid "types may not be defined in alias template declarations"
msgstr "类型不能定义在异常声明中"
#. function.
#: cp/parser.c:17476
#, fuzzy, gcc-internal-format
-#| msgid "invalid type in declaration"
msgid "qualified-id in declaration"
msgstr "声明中有无效类型"
#: cp/parser.c:17605
#, fuzzy, gcc-internal-format
-#| msgid "creating pointer to member of non-class type %qT"
msgid "cannot form pointer to member of non-class %q#T"
msgstr "生成非类类型%qT的成员指针"
#: cp/parser.c:17739
#, fuzzy, gcc-internal-format
-#| msgid "duplicate cv-qualifier"
msgid "multiple ref-qualifiers"
msgstr "重复的 cv 限定"
#: cp/parser.c:17797
#, fuzzy, gcc-internal-format
-#| msgid "duplicate cv-qualifier"
msgid "duplicate virt-specifier"
msgstr "重复的 cv 限定"
#: cp/parser.c:18594
#, fuzzy, gcc-internal-format
-#| msgid "%H%sparameter pack %qD cannot have a default argument"
msgid "parameter pack %qD cannot have a default argument"
msgstr "%H%s模板参数包%qD不能有默认参数"
#: cp/parser.c:18602
#, fuzzy, gcc-internal-format
-#| msgid "%H%sparameter pack cannot have a default argument"
msgid "parameter pack cannot have a default argument"
msgstr "%H%s模板参数包不能有默认参数"
#: cp/parser.c:18907
#, fuzzy, gcc-internal-format
-#| msgid "ISO C++ does not allow designated initializers"
msgid "ISO C++ does not allow C99 designated initializers"
msgstr "ISO C++ 不允许指定元素初始值设定"
#: cp/parser.c:19667
#, fuzzy, gcc-internal-format
-#| msgid "cannot find file for class %s"
msgid "cannot specify %<override%> for a class"
msgstr "无法为类 %s 找到文件"
#: cp/parser.c:20181
#, fuzzy, gcc-internal-format
-#| msgid "a class-key must be used when declaring a friend"
msgid "in C++03 a class-key must be used when declaring a friend"
msgstr "声明友元时必须使用 class 关键字"
#: cp/parser.c:21749
#, fuzzy, gcc-internal-format
-#| msgid "expected identifier or %<(%>"
msgid "expected an identifier for the attribute name"
msgstr "需要标识符或%<(%>"
#: cp/parser.c:24031
#, fuzzy, gcc-internal-format
-#| msgid "both %<_Sat%> and %<char%> in declaration specifiers"
msgid "both %<__thread%> and %<thread_local%> specified"
msgstr "声明中同时使用了%<_Sat%>和%<char%>"
#: cp/parser.c:24033
#, fuzzy, gcc-internal-format
-#| msgid "duplicate %qE"
msgid "duplicate %qD"
msgstr "重复的%qE"
#: cp/parser.c:24157
#, fuzzy, gcc-internal-format
-#| msgid "expected %<static_assert%>"
msgid "expected %<__transaction_atomic%>"
msgstr "需要%<static_assert%>"
#: cp/parser.c:24160
#, fuzzy, gcc-internal-format
-#| msgid "expected %<static_assert%>"
msgid "expected %<__transaction_relaxed%>"
msgstr "需要%<static_assert%>"
#: cp/parser.c:24488
#, fuzzy, gcc-internal-format
-#| msgid "previously declared here"
msgid "%q#T was previously declared here"
msgstr "以前在此声明过"
#: cp/parser.c:24528
#, fuzzy, gcc-internal-format
-#| msgid "%<template%> (as a disambiguator) is only allowed within templates"
msgid "in C++98 %<template%> (as a disambiguator) is only allowed within templates"
msgstr "用作消歧义的%<template%>只能用于模板内"
#: cp/parser.c:27475
#, fuzzy, gcc-internal-format
-#| msgid "invalid initializer"
msgid "invalid reduction-identifier"
msgstr "无效的初始值设定"
#: cp/parser.c:29045
#, fuzzy, gcc-internal-format
-#| msgid "parenthesized initialization is not allowed in OpenMP %<for%> loop"
msgid "parenthesized initialization is not allowed in for-loop"
msgstr "括起的初始化不允许使用在 OpenMP %<for%>循环中"
#: cp/parser.c:30334
#, fuzzy, gcc-internal-format
-#| msgid "attributes are not allowed on a function-definition"
msgid "vector attribute not immediately followed by a single function declaration or definition"
msgstr "函数定义中不允许有属性"
#: cp/parser.c:30561
#, fuzzy, gcc-internal-format
-#| msgid "invalid initializer"
msgid "invalid initializer clause"
msgstr "无效的初始值设定"
#: cp/parser.c:30678
#, fuzzy, gcc-internal-format
-#| msgid "expected %<+%>, %<*%>, %<-%>, %<&%>, %<^%>, %<|%>, %<&&%>, or %<||%>"
msgid "expected %<+%>, %<*%>, %<-%>, %<&%>, %<^%>, %<|%>, %<&&%>, %<||%> or identifier"
msgstr "需要%<+%>、%<*%>、%<-%>、%<&%>、%<^%>、%<|%>、%<&&%>或%<||%>"
#: cp/parser.c:30697
#, fuzzy, gcc-internal-format
-#| msgid "new types may not be defined in a return type"
msgid "types may not be defined in declare reduction type list"
msgstr "不能在返回类型中定义新类型"
#: cp/parser.c:31479
#, fuzzy, gcc-internal-format
-#| msgid "#pragma GCC optimize is not allowed inside functions"
msgid "%<#pragma simd%> must be inside a function"
msgstr "#pragma GCC optimize 不允许用在函数中"
#: cp/parser.c:31650
#, fuzzy, gcc-internal-format
-#| msgid "Expected variable name at %C"
msgid "expected variable-name"
msgstr "在%C处需要变量名"
#: cp/parser.c:31714
#, fuzzy, gcc-internal-format
-#| msgid "expected %<,%> or %<)%>"
msgid "expected %<,%> or %<)%> after %qE"
msgstr "需要 %<,%> 或 %<)%>"
#: cp/parser.c:31996
#, fuzzy, gcc-internal-format
-#| msgid "templates may not be %<virtual%>"
msgid "implicit templates may not be %<virtual%>"
msgstr "模板不能是%<virtual%>的"
#: cp/pt.c:831
#, fuzzy, gcc-internal-format
-#| msgid "declaration of template %q#D"
msgid "specialization of alias template %qD"
msgstr "模板声明%q#D"
#: cp/pt.c:1769
#, fuzzy, gcc-internal-format
-#| msgid "candidate is: %+#D"
msgid "candidate is: %#D"
msgstr "备选为:%+#D"
#: cp/pt.c:1776 cp/semantics.c:4775
#, fuzzy, gcc-internal-format
-#| msgid "%s %+#D"
msgid "%s %#D"
msgstr "%s %+#D"
#: cp/pt.c:2299
#, fuzzy, gcc-internal-format
-#| msgid "wrong number of template arguments (%d, should be %d)"
msgid "too many template headers for %D (should be %d)"
msgstr "模板参数数目不对(不应是 %d 个而应是 %d 个)"
#: cp/pt.c:4159
#, fuzzy, gcc-internal-format
-#| msgid "previously declared here"
msgid "primary template here"
msgstr "以前在此声明过"
#: cp/pt.c:4478
#, fuzzy, gcc-internal-format
-#| msgid "default template arguments may not be used in function templates without -std=c++0x or -std=gnu++0x"
msgid "default template arguments may not be used in function templates without -std=c++11 or -std=gnu++11"
msgstr "只有指定了 -std=c++0x 或 -std=gnu++0x 时才能在函数模板中使用默认参数"
#: cp/pt.c:5229
#, fuzzy, gcc-internal-format
-#| msgid "it must be the address of a function with external linkage"
msgid "it must be the name of a function with external linkage"
msgstr "它必须是一个具有外部链接函数的地址"
#: cp/pt.c:5237
#, fuzzy, gcc-internal-format
-#| msgid "%qE is not a valid template argument for type %qT because object %qD has not external linkage"
msgid "%qE is not a valid template argument for type %qT because %qD has no linkage"
msgstr "%qE不是类型%qT的有效模板实参,因为对象%qD没有外部链接"
#: cp/pt.c:5241
#, fuzzy, gcc-internal-format
-#| msgid "%qE is not a valid template argument of type %qT because %qD does not have external linkage"
msgid "%qE is not a valid template argument for type %qT because %qD does not have external linkage"
msgstr "%qE不是类型%qT的有效模板实参,因为函数%qD没有外部链接"
#: cp/pt.c:5318
#, fuzzy, gcc-internal-format
-#| msgid "got %d template parameters for %q#D"
msgid " couldn't deduce template parameter %qD"
msgstr "得到 %d 个模板参数,为%q#D"
#: cp/pt.c:5342
#, fuzzy, gcc-internal-format
-#| msgid "comparison between types %qT and %qT"
msgid " mismatched types %qT and %qT"
msgstr "在类型%qT和%qT间比较"
#: cp/pt.c:5351
#, fuzzy, gcc-internal-format
-#| msgid "template parameter pack %qD cannot have a default argument"
msgid " template parameter %qD is not a parameter pack, but argument %qD is"
msgstr "模板参数包%qD不能有默认参数"
#: cp/pt.c:5362
#, fuzzy, gcc-internal-format
-#| msgid "template arguments to %qD do not match original template %qD"
msgid " template argument %qE does not match pointer-to-member constant %qE"
msgstr "给%qD的模板实参不匹配原先的模板%qD"
#: cp/pt.c:5372
#, fuzzy, gcc-internal-format
-#| msgid "%qs is not valid for %qs"
msgid " %qE is not equivalent to %qE"
msgstr "%qs对%qs而言无效"
#: cp/pt.c:5381
#, fuzzy, gcc-internal-format
-#| msgid "inconsistent deduction for %qT: %qT and then %qT"
msgid " inconsistent parameter pack deduction with %qT and %qT"
msgstr "对%qT不一致的演绎:先是%qT然后是%qT"
#: cp/pt.c:5408
#, fuzzy, gcc-internal-format
-#| msgid "partial specialization %qT does not specialize any template arguments"
msgid " variable-sized array type %qT is not a valid template argument"
msgstr "部分特例化%qT并未特例化任何模板参数"
#: cp/pt.c:5419
#, fuzzy, gcc-internal-format
-#| msgid "%qE is not a valid template argument for type %qT"
msgid " member function type %qT is not a valid template argument"
msgstr "%qE不是类型%qT的有效模板参数"
#: cp/pt.c:5453
#, fuzzy, gcc-internal-format
-#| msgid "cannot convert type %qT to type %qT"
msgid " cannot convert %qE (type %qT) to type %qT"
msgstr "不能将类型%qT转换为类型%qT"
#: cp/pt.c:5466
#, fuzzy, gcc-internal-format
-#| msgid "%qT is an ambiguous base of %qT"
msgid " %qT is an ambiguous base class of %qT"
msgstr "%qT是%qT的有歧义的基类"
#: cp/pt.c:5470
#, fuzzy, gcc-internal-format
-#| msgid "type %qT is not derived from type %qT"
msgid " %qT is not derived from %qT"
msgstr "类型%qT不是由类型%qT派生的"
#: cp/pt.c:5491
#, fuzzy, gcc-internal-format
-#| msgid "cannot decrement a pointer to incomplete type %qT"
msgid " can't deduce a template for %qT from non-template type %qT"
msgstr "指向不完全类型%qT的指针不能自减"
#: cp/pt.c:5501
#, fuzzy, gcc-internal-format
-#| msgid "template arguments to %qD do not match original template %qD"
msgid " template argument %qE does not match %qD"
msgstr "给%qD的模板实参不匹配原先的模板%qD"
#: cp/pt.c:5747
#, fuzzy, gcc-internal-format
-#| msgid "%qD is not a valid template argument because %qD is a variable, not the address of a variable"
msgid "%qE is not a valid template argument for %qT because it is not the address of a variable"
msgstr "%qD不是一个有效模板实参,因为%qD是一个变量,而非变量的地址"
#: cp/pt.c:5778
#, fuzzy, gcc-internal-format
-#| msgid "%qE is not a valid template argument of type %qT because %qE is not a variable"
msgid "%qE is not a valid template argument of type %qT because %qD has no linkage"
msgstr "%qE不是类型%qT的有效模板实参,因为%qE不是一个变量"
#: cp/pt.c:6336
#, fuzzy, gcc-internal-format
-#| msgid "invalid use of destructor %qD as a type"
msgid "invalid use of destructor %qE as a type"
msgstr "将析构函数%qD用作类型无效"
#: cp/pt.c:6754
#, fuzzy, gcc-internal-format
-#| msgid "default argument for template parameter for class enclosing %qD"
msgid "pack expansion argument for non-pack parameter %qD of alias template %qD"
msgstr "包含%qD的类的模板参数有默认参数"
#: cp/pt.c:7085
#, fuzzy, gcc-internal-format
-#| msgid "%qD is not a function template"
msgid "%q#D is not a function template"
msgstr "%qD不是一个函数模板"
#: cp/pt.c:8088
#, fuzzy
-#| msgid "template instantiation depth exceeds maximum of %d (use -ftemplate-depth= to increase the maximum) instantiating %qD"
msgid "template instantiation depth exceeds maximum of %d (use -ftemplate-depth= to increase the maximum) substituting %qS"
msgstr "在实例化%2$qD时模板实例化深度超过最大值 %1$d(使用 use -ftemplate-depth= 来增大最大值)"
#: cp/pt.c:10108
#, fuzzy, gcc-internal-format
-#| msgid "redefinition of default argument for %q#D"
msgid " when instantiating default argument for call to %D"
msgstr "重定义%q#D的默认参数"
#: cp/pt.c:11791
#, fuzzy, gcc-internal-format
-#| msgid "cannot declare pointer to qualified function type %qT"
msgid "forming pointer to qualified function type %qT"
msgstr "不能声明指向限定函数类型%qT的指针"
#: cp/pt.c:11794
#, fuzzy, gcc-internal-format
-#| msgid "cannot declare reference to qualified function type %qT"
msgid "forming reference to qualified function type %qT"
msgstr "不能声明指向限定函数类型%qT的引用"
#: cp/pt.c:11831
#, fuzzy, gcc-internal-format
-#| msgid "cannot declare reference to qualified function type %qT"
msgid "cannot declare reference to array of runtime bound"
msgstr "不能声明指向限定函数类型%qT的引用"
#: cp/pt.c:11832
#, fuzzy, gcc-internal-format
-#| msgid "cannot declare pointer to %q#T member"
msgid "cannot declare pointer to array of runtime bound"
msgstr "无法声明指向%q#T成员的指针"
#: cp/pt.c:14567
#, fuzzy, gcc-internal-format
-#| msgid "%<%T::%E%> is not a type"
msgid "use %<%T::%D%> instead"
msgstr "%<%T::%E%>不是一个类型"
#: cp/pt.c:14571
#, fuzzy, gcc-internal-format
-#| msgid "%qE undeclared here (not in a function)"
msgid "%q+D declared here, later in the translation unit"
msgstr "%qE未声明(不在函数内)"
#: cp/pt.c:18935
#, fuzzy, gcc-internal-format
-#| msgid "explicit instantiation of non-template %q#D"
msgid "explicit instantiation of non-class template %qD"
msgstr "对非模板%q#D的显式实例化"
#: cp/pt.c:20137
#, fuzzy, gcc-internal-format
-#| msgid "invalid use of template type parameter %qT"
msgid "invalid template non-type parameter"
msgstr "对模板类型参数%qT的使用无效"
#: cp/pt.c:20139
#, fuzzy, gcc-internal-format
-#| msgid "%q#T is not a valid type for a template constant parameter"
msgid "%q#T is not a valid type for a template non-type parameter"
msgstr "%q#T不是一个有效的模板常量参数类型"
#: cp/pt.c:21484
#, fuzzy, gcc-internal-format
-#| msgid "unable to deduce %qT from %qE"
msgid "unable to deduce lambda return type from %qE"
msgstr "无法从%2$qE推导出%1$qT"
#: cp/rtti.c:399
#, fuzzy, gcc-internal-format
-#| msgid "creating array of functions"
msgid "typeid of array of runtime bound"
msgstr "创建函数的数组"
#: cp/rtti.c:491
#, fuzzy, gcc-internal-format
-#| msgid "cannot declare pointer to qualified function type %qT"
msgid "typeid of qualified function type %qT"
msgstr "不能声明指向限定函数类型%qT的指针"
#: cp/search.c:1899
#, fuzzy, gcc-internal-format
-#| msgid "invalid covariant return type for %q+#D"
msgid "invalid covariant return type for %q#D"
msgstr "%q+#D的协变返回类型无效"
#: cp/search.c:1966
#, fuzzy, gcc-internal-format
-#| msgid "virtual non-class function %qs"
msgid "virtual function %q+D"
msgstr "虚函数%qs不是类成员"
#: cp/search.c:1967
#, fuzzy, gcc-internal-format
-#| msgid "overriding deleted function %q+D"
msgid "overriding final function %q+D"
msgstr "隐藏了被删除的函数%q+D"
#: cp/semantics.c:3218
#, fuzzy, gcc-internal-format
-#| msgid "protected member %q+#D in anonymous union"
msgid "cannot capture member %qD of anonymous union"
msgstr "匿名联合中出现保护成员%q+#D"
#: cp/semantics.c:3235
#, fuzzy, gcc-internal-format
-#| msgid "use of %<auto%> variable from containing function"
msgid "use of local variable with automatic storage from containing function"
msgstr "在包含函数中使用%<auto%>变量"
#: cp/semantics.c:3236
#, fuzzy, gcc-internal-format
-#| msgid "use of %<auto%> variable from containing function"
msgid "use of parameter from containing function"
msgstr "在包含函数中使用%<auto%>变量"
#: cp/semantics.c:3622
#, fuzzy, gcc-internal-format
-#| msgid "%qD is not an enumerator-name"
msgid "%qT is not an enumeration type"
msgstr "%qD不是一个枚举名"
#. Parameter packs can only be used in templates
#: cp/semantics.c:3771
#, fuzzy, gcc-internal-format
-#| msgid "storage class specifiers invalid in parameter declarations"
msgid "Parameter pack __bases only valid in template declaration"
msgstr "为形参声明指定了无效的存储类"
#: cp/semantics.c:4772
#, fuzzy, gcc-internal-format
-#| msgid "reference to %qD is ambiguous"
msgid "user defined reduction lookup is ambiguous"
msgstr "对%qD的引用有歧义"
#: cp/semantics.c:5267
#, fuzzy, gcc-internal-format
-#| msgid "num_threads expression must be integral"
msgid "linear step expression must be integral"
msgstr "num_threads 表达式必须是整型的"
#: cp/semantics.c:5434
#, fuzzy, gcc-internal-format
-#| msgid "num_threads expression must be integral"
msgid "%qs length expression must be integral"
msgstr "num_threads 表达式必须是整型的"
#: cp/semantics.c:5447
#, fuzzy, gcc-internal-format
-#| msgid "%Hcollapse argument needs positive constant integer expression"
msgid "%qs length expression must be positive constant integer expression"
msgstr "%H折叠变量需要正整常数表达式"
#: cp/semantics.c:5464
#, fuzzy, gcc-internal-format
-#| msgid "num_threads expression must be integral"
msgid "%<num_teams%> expression must be integral"
msgstr "num_threads 表达式必须是整型的"
#: cp/semantics.c:5483
#, fuzzy, gcc-internal-format
-#| msgid "num_threads expression must be integral"
msgid "%<thread_limit%> expression must be integral"
msgstr "num_threads 表达式必须是整型的"
#: cp/semantics.c:5502
#, fuzzy, gcc-internal-format
-#| msgid "slice end must be integer"
msgid "%<device%> id must be integral"
msgstr "切片结尾必须是整数"
#: cp/semantics.c:5523
#, fuzzy, gcc-internal-format
-#| msgid "schedule chunk size expression must be integral"
msgid "%<dist_schedule%> chunk size expression must be integral"
msgstr "调度块大小表达式必须为整型"
#: cp/semantics.c:5543
#, fuzzy, gcc-internal-format
-#| msgid "%qD is not a variable in clause %qs"
msgid "%qD is not a variable in %<aligned%> clause"
msgstr "%qD在子句%qs中不是一个变量"
#: cp/semantics.c:5563
#, fuzzy, gcc-internal-format
-#| msgid "%qD appears more than once in data clauses"
msgid "%qD appears more than once in %<aligned%> clauses"
msgstr "%qD在数据子句中多次出现"
#: cp/semantics.c:5576
#, fuzzy, gcc-internal-format
-#| msgid "schedule chunk size expression must be integral"
msgid "%<aligned%> clause alignment expression must be integral"
msgstr "调度块大小表达式必须为整型"
#: cp/semantics.c:5613
#, fuzzy, gcc-internal-format
-#| msgid "%qD is not a variable in clause %qs"
msgid "%qD is not a variable in %<depend%> clause"
msgstr "%qD在子句%qs中不是一个变量"
#. Report the error.
#: cp/semantics.c:6870
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "static assertion failed: %E"
msgid "static assertion failed: %s"
msgstr "静态断言错误:%E"
#: cp/semantics.c:7494
#, fuzzy, gcc-internal-format
-#| msgid "%q#T is not a class"
msgid "%q#T has virtual base classes"
msgstr "%q#T不是一个类"
#: cp/semantics.c:8033
#, fuzzy, gcc-internal-format
-#| msgid "%qD is not a constexpr function"
msgid "%q+D is not usable as a constexpr function because:"
msgstr "%qD不是一个广义常函数"
#: cp/semantics.c:8382 cp/semantics.c:10054
#, fuzzy, gcc-internal-format
-#| msgid "call to non-function %qD"
msgid "call to non-constexpr function %qD"
msgstr "调用非函数的%qD"
#. The definition of fun was somehow unsuitable.
#: cp/semantics.c:8416
#, fuzzy, gcc-internal-format
-#| msgid "%qE is not a constant expression"
msgid "%qD called in a constant expression"
msgstr "%qE不是一个常量表达式"
#: cp/semantics.c:8462
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "template instantiation depth exceeds maximum of %d (use -ftemplate-depth= to increase the maximum) instantiating %qD"
msgid "constexpr evaluation depth exceeds maximum of %d (use -fconstexpr-depth= to increase the maximum)"
msgstr "在实例化%2$qD时模板实例化深度超过最大值 %1$d(使用 use -ftemplate-depth= 来增大最大值)"
#: cp/semantics.c:8682
#, fuzzy, gcc-internal-format
-#| msgid "Expected array subscript at %C"
msgid "negative array subscript"
msgstr "%C处需要数组下标"
#: cp/semantics.c:9492 cp/semantics.c:10361
#, fuzzy, gcc-internal-format
-#| msgid "enumeral and non-enumeral type in conditional expression"
msgid "temporary of non-literal type %qT in a constant expression"
msgstr "枚举和非枚举类型一起出现在条件表达式中"
#: cp/semantics.c:9735 cp/semantics.c:10146
#, fuzzy, gcc-internal-format
-#| msgid "reinterpret_cast from type %qT to type %qT casts away qualifiers"
msgid "reinterpret_cast from integer to pointer"
msgstr "从类型%qT到类型%qT的 reinterpret_cast 丢失了限定符"
#: cp/semantics.c:10200
#, fuzzy, gcc-internal-format
-#| msgid "%qE is not a constant expression"
msgid "use of %<this%> in a constant expression"
msgstr "%qE不是一个常量表达式"
#: cp/semantics.c:10336
#, fuzzy, gcc-internal-format
-#| msgid "Bad type in constant expression"
msgid "cast to non-integral type %qT in a constant expression"
msgstr "常量表达式中类型错误"
#: cp/tree.c:3333
#, fuzzy, gcc-internal-format
-#| msgid "declaration of %qD as member of %qT"
msgid "redeclaration of %qD adds abi tag %E"
msgstr "%qD声明为%qT的一个成员"
#: cp/tree.c:3339
#, fuzzy, gcc-internal-format
-#| msgid "previous declaration %q+#D here"
msgid "previous declaration here"
msgstr "与此处早先的声明%q+#D冲突"
#: cp/tree.c:3356
#, fuzzy, gcc-internal-format
-#| msgid "%qE attribute ignored on non-class types"
msgid "%qE attribute applied to non-class, non-enum type %qT"
msgstr "%qE属性在不是类的类型上被忽略"
#: cp/tree.c:3362
#, fuzzy, gcc-internal-format
-#| msgid "ignoring attributes applied to %qT after definition"
msgid "%qE attribute applied to %qT after its definition"
msgstr "忽略在其定义之后为%qT应用的属性"
#: cp/tree.c:3384
#, fuzzy, gcc-internal-format
-#| msgid "%qE attribute applies only to functions"
msgid "%qE attribute applied to non-function %qD"
msgstr "%qE属性只能用于函数"
#: cp/tree.c:3389
#, fuzzy, gcc-internal-format
-#| msgid "%qE attribute applies only to functions"
msgid "%qE attribute applied to extern \"C\" function %qD"
msgstr "%qE属性只能用于函数"
#: cp/tree.c:4093
#, fuzzy, gcc-internal-format
-#| msgid "array bound is not an integer constant"
msgid "zero as null pointer constant"
msgstr "数组边界不是一个整数常量"
#: cp/typeck.c:1559
#, fuzzy, gcc-internal-format
-#| msgid "creating array of functions"
msgid "taking sizeof array of runtime bound"
msgstr "创建函数的数组"
#: cp/typeck.c:1961
#, fuzzy, gcc-internal-format
-#| msgid "taking address of temporary"
msgid "taking address of temporary array"
msgstr "取临时变量的地址"
#: cp/typeck.c:2248 cp/typeck.c:2658
#, fuzzy, gcc-internal-format
-#| msgid "request for member %qD in %qE, which is of non-class type %qT"
msgid "request for member %qD in %qE, which is of pointer type %qT (maybe you meant to use %<->%> ?)"
msgstr "对成员%qD的请求出现在%qE中,而后者具有非类类型%qT"
#: cp/typeck.c:3029
#, fuzzy, gcc-internal-format
-#| msgid "alignment of array elements is greater than element size"
msgid "rank of the array%'s index is greater than 1"
msgstr "数组元素的对齐边界比元素大小还要大"
#: cp/typeck.c:3486
#, fuzzy, gcc-internal-format
-#| msgid "%qE cannot be used as a function"
msgid "%qD cannot be used as a function"
msgstr "%qE不能用作函数"
#: cp/typeck.c:3489
#, fuzzy, gcc-internal-format
-#| msgid "%qE cannot be used as a function"
msgid "expression cannot be used as a function"
msgstr "%qE不能用作函数"
#: cp/typeck.c:4572 cp/typeck.c:4584
#, fuzzy, gcc-internal-format
-#| msgid "comparison between %qT and %qT"
msgid "operand types are %qT and %qT"
msgstr "在%qT和%qT间比较"
#: cp/typeck.c:4596
#, fuzzy, gcc-internal-format
-#| msgid "could not find interface for class %qE"
msgid "could not find an integer type of the same size as %qT"
msgstr "找不到类%qE的接口"
#: cp/typeck.c:5473
#, fuzzy, gcc-internal-format
-#| msgid "taking address of expression of type %<void%>"
msgid "taking address of array of runtime bound"
msgstr "取一个类型为%<void%>的表达式的地址"
#: cp/typeck.c:6077
#, fuzzy, gcc-internal-format
-#| msgid "initializer for %qT must be brace-enclosed"
msgid "list-initializer for non-class type must not be parenthesized"
msgstr "%qT的初始值设定必须在花括号内"
#: cp/typeck.c:6296
#, fuzzy, gcc-internal-format
-#| msgid "invalid cast to function type %qT"
msgid "useless cast to type %qT"
msgstr "向函数类型%qT的转换无效"
#: cp/typeck.c:6850
#, fuzzy, gcc-internal-format
-#| msgid "ISO C++ forbids casting between pointer-to-function and pointer-to-object"
msgid "casting between pointer-to-function and pointer-to-object is conditionally-supported"
msgstr "ISO C++ 不允许在函数指针和对象指针间进行转换"
#: cp/typeck.c:8390
#, fuzzy, gcc-internal-format
-#| msgid "<brace-enclosed initializer list>"
msgid "returning initializer list"
msgstr "<花括号内的初始值列表>"
#: cp/typeck2.c:333
#, fuzzy, gcc-internal-format
-#| msgid "cannot declare parameter %q+D to be of abstract type %qT"
msgid "cannot declare parameter to be of abstract type %qT"
msgstr "不能将形参%q+D声明为具有抽象类型%qT"
#: cp/typeck2.c:356
#, fuzzy, gcc-internal-format
-#| msgid "invalid cast to function type %qT"
msgid "invalid cast to abstract class type %qT"
msgstr "向函数类型%qT的转换无效"
#: cp/typeck2.c:359
#, fuzzy, gcc-internal-format
-#| msgid "invalid cast of an rvalue expression of type %qT to type %qT"
msgid "invalid new-expression of abstract class type %qT"
msgstr "从具有类型%qT的右值表达式到类型%qT中的转换无效"
#: cp/typeck2.c:362
#, fuzzy, gcc-internal-format
-#| msgid "invalid parameter type %qT"
msgid "invalid abstract return type %qT"
msgstr "无效的参数类型%qT"
#: cp/typeck2.c:365
#, fuzzy, gcc-internal-format
-#| msgid "invalid parameter type %qT"
msgid "invalid abstract parameter type %qT"
msgstr "无效的参数类型%qT"
#: cp/typeck2.c:368
#, fuzzy, gcc-internal-format
-#| msgid "expression %qE of abstract class type %qT cannot be used in throw-expression"
msgid "expression of abstract class type %qT cannot be used in throw-expression"
msgstr "表达式%qE具有抽象类类型%qT,不能用于 throw 表达式中"
#: cp/typeck2.c:372
#, fuzzy, gcc-internal-format
-#| msgid "cannot declare parameter %q+D to be of abstract type %qT"
msgid "cannot declare catch parameter to be of abstract class type %qT"
msgstr "不能将形参%q+D声明为具有抽象类型%qT"
#: cp/typeck2.c:501
#, fuzzy, gcc-internal-format
-#| msgid "invalid use of member (did you forget the %<&%> ?)"
msgid "invalid use of member function (did you forget the %<()%> ?)"
msgstr "对成员的使用无效(您是否遗忘了%<&%>?)"
#: cp/typeck2.c:534
#, fuzzy, gcc-internal-format
-#| msgid "<brace-enclosed initializer list>"
msgid "invalid use of brace-enclosed initializer list"
msgstr "<花括号内的初始值列表>"
#: cp/typeck2.c:922
#, fuzzy, gcc-internal-format
-#| msgid "narrowing conversion of %qE from %qT to %qT inside { }"
msgid "narrowing conversion of %qE from %qT to %qT inside { } is ill-formed in C++11"
msgstr "在 {} 内将%qE从%qT转换为较窄的类型%qT"
#: cp/typeck2.c:1759
#, fuzzy, gcc-internal-format
-#| msgid "pointer to member function used in arithmetic"
msgid "pointer-to-member-function type %qT requires an rvalue"
msgstr "在算术表达式中使用了成员指针"
#: cp/typeck2.c:1766
#, fuzzy, gcc-internal-format
-#| msgid "pointer to member function used in arithmetic"
msgid "pointer-to-member-function type %qT requires an lvalue"
msgstr "在算术表达式中使用了成员指针"
#: cp/typeck2.c:1807
#, fuzzy, gcc-internal-format
-#| msgid "invalid cast to function type %qT"
msgid "functional cast to array type %qT"
msgstr "向函数类型%qT的转换无效"
#: fortran/arith.c:904 fortran/arith.c:929
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: Noninteger exponent in an initialization expression at %L"
msgid "Noninteger exponent in an initialization expression at %L"
msgstr "Fortran 2003:%L处初始化表达式中非整数指数"
#: fortran/array.c:578
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Array specification at %C has more than %d dimensions"
msgid "Array specification at %C with more than 7 dimensions"
msgstr "%C处数组规格中有多于 %d 的维数"
#: fortran/array.c:1060
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: [...] style array constructors at %C"
msgid "[...] style array constructors at %C"
msgstr "Fortran 2003:%C处 [...] 风格的数组构造"
#: fortran/array.c:1082
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: Array constructor including type specification at %C"
msgid "Array constructor including type specification at %C"
msgstr "Fortran 2003:%C处包含类型规格的数组构造"
#: fortran/check.c:868 fortran/check.c:1807 fortran/check.c:1933
#: fortran/check.c:2007 fortran/check.c:2427
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Extension: Different type kinds at %L"
msgid "Different type kinds at %L"
msgstr "扩展:%L处类型种别不同"
#: fortran/check.c:913 fortran/check.c:949 fortran/check.c:2945
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "'%s' argument of '%s' intrinsic at %L must be of kind %d"
msgid "'%s' argument of '%s' intrinsic at %L shall not be coindexed"
msgstr "%3$L处内建函数‘%2$s’的实参‘%1$s’必须具有种别 %4$d"
#: fortran/check.c:1030
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "'%s' and '%s' arguments of '%s' intrinsic at %L must have the same type"
msgid "ATOM and VALUE argument of the %s intrinsic function shall have the same type at %L"
msgstr "%4$L处‘%3$s’内建函数的‘%1$s’和‘%2$s’实参类型必须相同"
#: fortran/check.c:1048
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "'%s' argument of '%s' intrinsic at %L must be default real"
msgid "ATOM argument of the %s intrinsic function at %L shall be definable"
msgstr "%3$L处内建函数‘%2$s’的‘%1$s’实参类型必须为默认实型"
#: fortran/check.c:1065
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "'%s' argument of '%s' intrinsic at %L must be default real"
msgid "VALUE argument of the %s intrinsic function at %L shall be definable"
msgstr "%3$L处内建函数‘%2$s’的‘%1$s’实参类型必须为默认实型"
#: fortran/check.c:3609 fortran/check.c:3664 fortran/check.c:4620
#: fortran/check.c:4749
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: '%s' intrinsic with KIND argument at %L"
msgid "'%s' intrinsic with KIND argument at %L"
msgstr "Fortran 2003:%2$L处的‘%1$s’内建函数有 KIND 实参"
#: fortran/check.c:1739
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2008: COMPLEX argument '%s' argument of '%s' intrinsic at %L"
msgid "COMPLEX argument '%s' argument of '%s' intrinsic at %L"
msgstr "Fortran 2008:%3$L处的‘%2$s’内建函数有 COMPLEX 参数‘%1$s’"
#: fortran/check.c:2384
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "'%s' argument of '%s' intrinsic at %L is empty"
msgid "Missing '%s' argument to the %s intrinsic at %L"
msgstr "%3$L处内建‘%2$s’内建函数的‘%1$s’实参为空"
#: fortran/check.c:2399
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "arguments '%s' and '%s' for intrinsic %s"
msgid "Duplicate argument '%s' at %L to intrinsic %s"
msgstr "‘%s’和‘%s’用作内建函数‘%s’的参数"
#: fortran/check.c:2404
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "arguments '%s' and '%s' for intrinsic %s"
msgid "Unknown argument '%s' at %L to intrinsic %s"
msgstr "‘%s’和‘%s’用作内建函数‘%s’的参数"
#: fortran/check.c:2464
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: '%s' intrinsic with CHARACTER argument at %L"
msgid "'%s' intrinsic with CHARACTER argument at %L"
msgstr "Fortran 2003:%2$L处的‘%1$s’内建函数有 CHARACTER 实参"
#: fortran/check.c:2815
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Second argument of NEAREST at %L shall not be zero"
msgid "The FROM argument to MOVE_ALLOC at %L shall not be coindexed"
msgstr "%L处 NEAREST 的第二个参数不能为 0"
#: fortran/check.c:2826
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Second argument of NEAREST at %L shall not be zero"
msgid "The TO argument to MOVE_ALLOC at %L shall not be coindexed"
msgstr "%L处 NEAREST 的第二个参数不能为 0"
#: fortran/check.c:2844
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "the '%s' and '%s' arguments of '%s' intrinsic at %L must have the same rank %d/%d"
msgid "The FROM and TO arguments of the MOVE_ALLOC intrinsic at %L must have the same rank %d/%d"
msgstr "%4$L处‘%3$s’内建函数的‘%1$s’和‘%2$s’实参必须有相同的秩 %5$d/%6$d"
#: fortran/check.c:2853
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "the '%s' and '%s' arguments of '%s' intrinsic at %L must have the same rank %d/%d"
msgid "The FROM and TO arguments of the MOVE_ALLOC intrinsic at %L must have the same corank %d/%d"
msgstr "%4$L处‘%3$s’内建函数的‘%1$s’和‘%2$s’实参必须有相同的秩 %5$d/%6$d"
#: fortran/check.c:2880
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Second argument of NEAREST at %L shall not be zero"
msgid "Argument 'S' of NEAREST at %L shall not be zero"
msgstr "%L处 NEAREST 的第二个参数不能为 0"
#: fortran/check.c:2930
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "'%s' argument of '%s' intrinsic at %L must be ALLOCATABLE"
msgid "'%s' argument of '%s' intrinsic at %L must be a POINTER, ALLOCATABLE or procedure pointer"
msgstr "%3$L处内建函数‘%2$s’的实参‘%1$s’必须为 ALLOCATABLE"
#: fortran/check.c:3150
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "'%s' argument of '%s' intrinsic at %L must be a variable"
msgid "The argument of the RANK intrinsic at %L must be a data object"
msgstr "%3$L处内建函数‘%2$s’的实参‘%1$s’必须是一个变量"
#: fortran/check.c:3408 fortran/check.c:3427
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "'%s' argument of '%s' intrinsic at %L must be %s"
msgid "'%s' argument of '%s' intrinsic at %L cannot be of type %s"
msgstr "%3$L处内建函数‘%2$s’的实参‘%1$s’必须是 %4$s"
#: fortran/check.c:3679 fortran/check.c:5705
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "'%s' argument of '%s' intrinsic at %L must be a scalar"
msgid "'%s' argument of '%s' intrinsic at %L shall not be a procedure"
msgstr "%3$L处内建函数‘%2$s’的实参‘%1$s’必须是一个标量"
#: fortran/check.c:3687 fortran/check.c:3826 fortran/check.c:5697
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "'%s' argument of '%s' intrinsic at %L cannot be INTENT(IN)"
msgid "'%s' argument of '%s' intrinsic at %L shall not be TYPE(*)"
msgstr "%3$L处内建函数‘%2$s’的实参‘%1$s’不能是 INTENT(IN)"
#: fortran/check.c:3698 fortran/check.c:3838
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "'source' argument of 'shape' intrinsic at %L must not be an assumed size array"
msgid "'%s' argument of '%s' intrinsic at %L shall not be an assumed-size array"
msgstr "‘shape’内建函数的‘source’实参在%L处不能是假定大小的数组"
#: fortran/check.c:3906
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Argument dim at %L must be scalar"
msgid "Argument FPTR at %L to C_F_POINTER must be a pointer"
msgstr "%L 实参维数必须是标量"
#: fortran/check.c:4036
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Function result '%s' at %L has no IMPLICIT type"
msgid "Function result '%s' at %L is invalid as X argument to C_FUNLOC"
msgstr "%2$L处的函数返回值‘%1$s’处没有隐式类型"
#: fortran/check.c:4050
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "User operator procedure '%s' at %L must be a FUNCTION"
msgid "Noninteroperable procedure at %L to C_FUNLOC"
msgstr "%2$L处的用户运算符‘%1$s’必须是一个 FUNCTION"
#: fortran/check.c:4081
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Component at %C must have the POINTER attribute"
msgid "Argument X at %L to C_LOC shall have either the POINTER or the TARGET attribute"
msgstr "%C处的组件必须有 POINTER 属性"
#: fortran/data.c:327 fortran/data.c:493
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Extension: re-initialization of '%s' at %L"
msgid "re-initialization of '%s' at %L"
msgstr "扩展:‘%s’重初始化于 %L"
#: fortran/decl.c:271
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Extension: initialization of common block variable '%s' in DATA statement at %C"
msgid "initialization of common block variable '%s' in DATA statement at %C"
msgstr "扩展:DATA 语句中对公共块变量‘%s’在%C处初始化"
#: fortran/decl.c:752
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Obsolescent feature: Old-style character length at %C"
msgid "Old-style character length at %C"
msgstr "已过时:%C处的旧式字符长度"
#: fortran/decl.c:1032
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Variable '%s' at %L is a parameter to the BIND(C) procedure '%s' but may not be C interoperable"
msgid "Variable '%s' at %L is a dummy argument to the BIND(C) procedure '%s' but is not C interoperable because it is polymorphic"
msgstr "%2$L处变量‘%1$s’是 BIND(C) 过程‘%3$s’的参数,但它不能与 C 互操作"
#: fortran/decl.c:1038
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Variable '%s' at %L is a parameter to the BIND(C) procedure '%s' but may not be C interoperable"
msgid "Variable '%s' at %L is a dummy argument of the BIND(C) procedure '%s' but may not be C interoperable"
msgstr "%2$L处变量‘%1$s’是 BIND(C) 过程‘%3$s’的参数,但它不能与 C 互操作"
#: fortran/decl.c:1066
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Variable '%s' at %L cannot have the ALLOCATABLE attribute because procedure '%s' is BIND(C)"
msgid "Variable '%s' at %L with ALLOCATABLE attribute in procedure '%s' with BIND(C)"
msgstr "%2$L处变量‘%1$s’不能有 ALLOCATABLE 属性,因为过程‘%3$s’是 BIND(C)"
#: fortran/decl.c:1074
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Variable '%s' at %L cannot have the POINTER attribute because procedure '%s' is BIND(C)"
msgid "Variable '%s' at %L with POINTER attribute in procedure '%s' with BIND(C)"
msgstr "%2$L处变量‘%1$s’不能有 POINTER 属性,因为过程‘%3$s’是 BIND(C)"
#: fortran/decl.c:1083
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Variable '%s' at %L cannot have the ALLOCATABLE attribute because procedure '%s' is BIND(C)"
msgid "Scalar variable '%s' at %L with POINTER or ALLOCATABLE in procedure '%s' with BIND(C) is not yet supported"
msgstr "%2$L处变量‘%1$s’不能有 ALLOCATABLE 属性,因为过程‘%3$s’是 BIND(C)"
#: fortran/decl.c:1092
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Variable '%s' at %L cannot have the OPTIONAL attribute because procedure '%s' is BIND(C)"
msgid "Variable '%s' at %L cannot have both the OPTIONAL and the VALUE attribute because procedure '%s' is BIND(C)"
msgstr "%2$L处变量‘%1$s’不能有 OPTIONAL 属性,因为过程‘%3$s’是 BIND(C)"
#: fortran/decl.c:1099
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Variable '%s' at %L cannot have the OPTIONAL attribute because procedure '%s' is BIND(C)"
msgid "Variable '%s' at %L with OPTIONAL attribute in procedure '%s' which is BIND(C)"
msgstr "%2$L处变量‘%1$s’不能有 OPTIONAL 属性,因为过程‘%3$s’是 BIND(C)"
#: fortran/decl.c:1110
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Assumed-shape array '%s' at %L cannot be an argument to the procedure '%s' at %L because the procedure is BIND(C)"
msgid "Assumed-shape array '%s' at %L as dummy argument to the BIND(C) procedure '%s' at %L"
msgstr "%2$L处假定外形数组‘%1$s’不能是%4$L处过程‘%3$s’的参数,因为该过程是 BIND(C)"
#: fortran/decl.c:1724
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "NULL() initialization at %C is ambiguous"
msgid "NULL() initialization at %C may not have MOLD"
msgstr "%C处的 NULL() 初始化有歧义"
#: fortran/decl.c:2003
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Extension: Old-style initialization at %C"
msgid "Old-style initialization at %C"
msgstr "扩展:%C处旧式的初始化"
#: fortran/decl.c:2597
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Extension: BYTE type at %C"
msgid "BYTE type at %C"
msgstr "扩展:%C处的 BYTE 类型"
#: fortran/decl.c:2624
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "By-value argument at %L is not allowed in this context"
msgid "Assumed type at %C is not allowed for components"
msgstr "%L处上下文中不允许使用按值传递的实参"
#: fortran/decl.c:2780
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: CLASS statement at %C"
msgid "CLASS statement at %C"
msgstr "Fortran 2003:%C处的 CLASS 语句"
#: fortran/decl.c:3171
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Empty IMPLICIT statement at %C"
msgid "IMPORT statement at %C"
msgstr "%C处 IMPLICIT 语句为空"
#: fortran/decl.c:3667
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: ALLOCATABLE attribute at %C in a TYPE definition"
msgid "ALLOCATABLE attribute at %C in a TYPE definition"
msgstr "Fortran 2003:%C处的 ALLOCATABLE 属性出现在 TYPE 定义中"
#: fortran/decl.c:3694
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: Attribute %s at %L in a TYPE definition"
msgid "Attribute %s at %L in a TYPE definition"
msgstr "Fortran 2003:属性 %s 在%L处出现在 TYPE 定义中"
#: fortran/decl.c:3718
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: ASYNCHRONOUS attribute at %C"
msgid "ASYNCHRONOUS attribute at %C"
msgstr "Fortran 2003:%C处的 ASYNCHRONOUS 属性"
#: fortran/decl.c:3780
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: PROTECTED attribute at %C"
msgid "PROTECTED attribute at %C"
msgstr "Fortran 2003:%C处的 PROTECT 属性"
#: fortran/decl.c:3809
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: VALUE attribute at %C"
msgid "VALUE attribute at %C"
msgstr "Fortran 2003:%C处的 VALUE 属性"
#: fortran/decl.c:3816
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: VOLATILE attribute at %C"
msgid "VOLATILE attribute at %C"
msgstr "Fortran 2003:%C处的 VOLATILE 属性"
#: fortran/decl.c:4212
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Empty IMPLICIT statement at %C"
msgid "BIND(C) statement at %C"
msgstr "%C处 IMPLICIT 语句为空"
#: fortran/decl.c:4475 fortran/primary.c:1717
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Expected alternate return label at %C"
msgid "Alternate-return argument at %C"
msgstr "%C处需要替代的返回标号"
#: fortran/decl.c:4687 fortran/decl.c:5753
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2008: BIND(C) attribute at %L may not be specified for an internal procedure"
msgid "BIND(C) attribute at %L may not be specified for an internal procedure"
msgstr "Fortran 2008:%L处的 BIND(C)属性对于内部过程不可以指定"
#: fortran/decl.c:5031
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: Procedure pointer component at %C"
msgid "Procedure pointer component at %C"
msgstr "Fortran 2003:%C处的过程指针组件"
#: fortran/decl.c:5130 fortran/decl.c:7325
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Syntax error in PROCEDURE statement at %C"
msgid "double colon in MODULE PROCEDURE statement at %L"
msgstr "%C处 PROCEDURE 语句语法错误"
#: fortran/decl.c:5199
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: PROCEDURE statement at %C"
msgid "PROCEDURE statement at %C"
msgstr "Fortran 2003:%C处的 PROCEDURE 语句"
#: fortran/decl.c:5440
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Empty IMPLICIT statement at %C"
msgid "ENTRY statement at %C"
msgstr "%C处 IMPLICIT 语句为空"
#: fortran/decl.c:6144
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Expecting %s statement at %C"
msgid "Expecting %s statement at %L"
msgstr "需要 %s 语句,于 %C"
#: fortran/decl.c:6162
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Expected block name of '%s' in %s statement at %C"
msgid "Expected block name of '%s' in %s statement at %L"
msgstr "需要块名‘%s’在‘%s’表达式中,于 %C"
#: fortran/decl.c:6834
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: PROTECTED statement at %C"
msgid "PROTECTED statement at %C"
msgstr "Fortran 2003:%C处的 PROTECTED 语句"
#: fortran/decl.c:7128
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: VALUE statement at %C"
msgid "VALUE statement at %C"
msgstr "Fortran 2003:%C处的 VALUE 语句"
#: fortran/decl.c:7177
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: VOLATILE statement at %C"
msgid "VOLATILE statement at %C"
msgstr "Fortran 2003:%C处的 VOLATILE 语句"
#: fortran/decl.c:7236
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: ASYNCHRONOUS statement at %C"
msgid "ASYNCHRONOUS statement at %C"
msgstr "Fortran 2003:%C处的 ASYNCHRONOUS 语句"
#: fortran/decl.c:7416
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Symbol '%s' at %C has already been host associated"
msgid "Symbol '%s' at %C has not been previously defined"
msgstr "%2$C处符号‘%1$s’已经与主机相关联"
#: fortran/decl.c:7492
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "ABSTRACT type '%s' used at %L"
msgid "ABSTRACT type at %C"
msgstr "%2$L处使用了 ABSTRACT 类型‘%1$s’"
#: fortran/decl.c:7722
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: ENUM and ENUMERATOR at %C"
msgid "ENUM and ENUMERATOR at %C"
msgstr "Fortran 2003:%C处的 ENUM 和 ENUMERATOR"
#: fortran/expr.c:2414
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Extension: Evaluation of nonstandard initialization expression at %L"
msgid "Evaluation of nonstandard initialization expression at %L"
msgstr "扩展:%L处求非标量初始化表达式的值"
#: fortran/expr.c:3161
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "POINTER valued function appears on right-hand side of assignment at %L"
msgid "POINTER-valued function appears on right-hand side of assignment at %L"
msgstr "%L处赋值右手边出现值为 POINTER 的函数"
#: fortran/expr.c:3171
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Extension: BOZ literal at %L used to initialize non-integer variable '%s'"
msgid "BOZ literal at %L used to initialize non-integer variable '%s'"
msgstr "扩展:%L处 BOZ 字面值被用来初始化非整数变量‘%s’"
#: fortran/expr.c:3176 fortran/resolve.c:9062
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Extension: BOZ literal at %L outside a DATA statement and outside INT/REAL/DBLE/CMPLX"
msgid "BOZ literal at %L outside a DATA statement and outside INT/REAL/DBLE/CMPLX"
msgstr "扩展:在 %L处的 BOZ 字面值在一个 DATA 语句之外并且也在 INT/REAL/DBLE/CMPLX 之外"
#: fortran/expr.c:3343
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: Bounds specification for '%s' in pointer assignment at %L"
msgid "Bounds specification for '%s' in pointer assignment at %L"
msgstr "Fortran 2003:%2$L处指针赋值语句中‘%1$s’的边界规格"
#: fortran/expr.c:3445
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Statement function '%s' is invalid in procedure pointer assignment at %L"
msgid "Function result '%s' is invalid as proc-target in procedure pointer assignment at %L"
msgstr "语句函数‘%s’在%L处的过程指针赋值中是非法的"
#: fortran/expr.c:3477
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Internal procedure '%s' is invalid in procedure pointer assignment at %L"
msgid "Intrinsic '%s' at %L is invalid in procedure pointer assignment"
msgstr "内部过程‘%s’在%L处的过程指针赋值中是非法的"
#: fortran/expr.c:3485
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Internal procedure '%s' is invalid in procedure pointer assignment at %L"
msgid "Nonintrinsic elemental procedure '%s' is invalid in procedure pointer assignment at %L"
msgstr "内部过程‘%s’在%L处的过程指针赋值中是非法的"
#: fortran/expr.c:3564 fortran/expr.c:3571 fortran/resolve.c:2430
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "NOPASS or explicit interface required at %C"
msgid "Explicit interface required for '%s' at %L: %s"
msgstr "%C处需要 NOPASS 或显式接口"
#: fortran/frontend-passes.c:562 fortran/frontend-passes.c:565
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Return value of function '%s' at %L not set"
msgid "Removing call to function '%s' at %L"
msgstr "%2$L处函数‘%1$s’的返回值没有设置"
#: fortran/frontend-passes.c:1668
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Variable '%s' at %C cannot be redefined inside loop beginning at %L"
msgid "Variable '%s' at %L set to undefined value inside loop beginning at %L as INTENT(OUT) argument to subroutine '%s'"
msgstr "变量‘%s’(位于 %C)不能在从 %L 开始的循环的内部重定义"
#: fortran/frontend-passes.c:1674
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Variable '%s' at %C cannot be redefined inside loop beginning at %L"
msgid "Variable '%s' at %L not definable inside loop beginning at %L as INTENT(INOUT) argument to subroutine '%s'"
msgstr "变量‘%s’(位于 %C)不能在从 %L 开始的循环的内部重定义"
#: fortran/frontend-passes.c:1738
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Variable '%s' at %C cannot be redefined inside loop beginning at %L"
msgid "Variable '%s' at %L set to undefined value inside loop beginning at %L as INTENT(OUT) argument to function '%s'"
msgstr "变量‘%s’(位于 %C)不能在从 %L 开始的循环的内部重定义"
#: fortran/frontend-passes.c:1744
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Variable '%s' at %C cannot be redefined inside loop beginning at %L"
msgid "Variable '%s' at %L not definable inside loop beginning at %L as INTENT(INOUT) argument to function '%s'"
msgstr "变量‘%s’(位于 %C)不能在从 %L 开始的循环的内部重定义"
#: fortran/interface.c:254
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: ABSTRACT INTERFACE at %C"
msgid "ABSTRACT INTERFACE at %C"
msgstr "Fortran 2003:%C处的 ABSTRACT INTERFACE"
#: fortran/interface.c:1590
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Cray pointee '%s' in %s clause at %L"
msgid "Internal procedure '%s' in %s at %L"
msgstr "%3$L处 %2$s 分句中 的Cray 指针目标‘%1$s’"
#: fortran/interface.c:1893
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Assumed shape array at %L must be a dummy argument"
msgid "The assumed-rank array at %L requires that the dummy argument '%s' has assumed-rank"
msgstr "%L处假定外形的数组必须是一个虚参"
#: fortran/interface.c:2007
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Assumed-shape actual argument at %L is incompatible with the non-assumed-shape dummy argument '%s' due to VOLATILE attribute"
msgid "Assumed-type actual argument at %L requires that dummy argument '%s' is of assumed type"
msgstr "%L处假定外形的实参由于 VOLATILE 属性而与非假定外形虚参‘%s’不兼容"
#: fortran/interface.c:2843
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Actual argument for '%s' must be a pointer at %L"
msgid "Actual CLASS array argument for '%s' must be a full array at %L"
msgstr "‘%s’的实参在%L处必须是一个指针"
#: fortran/interface.c:3298
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Symbol '%s' at %L already has an explicit interface"
msgid "Assumed-type argument %s at %L requires an explicit interface"
msgstr "符号‘%s’在%L处已经有了显式接口"
#: fortran/interface.c:3328
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Keyword argument requires explicit interface for procedure '%s' at %L"
msgid "Assumed-rank argument requires an explicit interface at %L"
msgstr "%2$L处过程‘%1$s’的关键字参数要求显式的接口"
#: fortran/interface.c:3902
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Entity '%s' at %C is already present in the interface"
msgid "Entity '%s' at %L is already present in the interface"
msgstr "%2$C处实体‘%1$s’已经出现在接口中"
#: fortran/interface.c:4184
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Interface mismatch in dummy procedure '%s' at %L: %s"
msgid "Result mismatch for the overriding procedure '%s' at %L: %s"
msgstr "哑过程‘%s’接口在%L处不匹配:%s"
#: fortran/interface.c:4236
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Interface mismatch in dummy procedure '%s' at %L: %s"
msgid "Argument mismatch for the overriding procedure '%s' at %L: %s"
msgstr "哑过程‘%s’接口在%L处不匹配:%s"
#: fortran/intrinsic.c:196
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "NULL pointer at %L is not permitted as actual argument of '%s' intrinsic function"
msgid "Variable with NO_ARG_CHECK attribute at %L is only permitted as argument to the intrinsic functions C_LOC and PRESENT"
msgstr "%L 的 NULL 指针不能用作内建函数‘%s’的实参"
#: fortran/intrinsic.c:210
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "NULL pointer at %L is not permitted as actual argument of '%s' intrinsic function"
msgid "Assumed-type argument at %L is not permitted as actual argument to the intrinsic %s"
msgstr "%L 的 NULL 指针不能用作内建函数‘%s’的实参"
#: fortran/intrinsic.c:217
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "NULL pointer at %L is not permitted as actual argument of '%s' intrinsic function"
msgid "Assumed-type argument at %L is only permitted as first actual argument to the intrinsic %s"
msgstr "%L 的 NULL 指针不能用作内建函数‘%s’的实参"
#: fortran/intrinsic.c:224
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "NULL pointer at %L is not permitted as actual argument of '%s' intrinsic function"
msgid "Assumed-rank argument at %L is only permitted as actual argument to intrinsic inquiry functions"
msgstr "%L 的 NULL 指针不能用作内建函数‘%s’的实参"
#: fortran/intrinsic.c:231
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "NULL pointer at %L is not permitted as actual argument of '%s' intrinsic function"
msgid "Assumed-rank argument at %L is only permitted as first actual argument to the intrinsic inquiry function %s"
msgstr "%L 的 NULL 指针不能用作内建函数‘%s’的实参"
#: fortran/intrinsic.c:4255
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: Function '%s' as initialization expression at %L"
msgid "Function '%s' as initialization expression at %L"
msgstr "Fortran 2003:函数‘%s’在%L处用作初始化表达式"
#: fortran/intrinsic.c:4331
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: Elemental function as initialization expression with non-integer/non-character arguments at %L"
msgid "Elemental function as initialization expression with non-integer/non-character arguments at %L"
msgstr "Fortran 2003:作为初始表达式的基本函数在%L处使用了非整数或非字符的参数"
#: fortran/intrinsic.c:4402
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Subroutine call to intrinsic '%s' at %L is not PURE"
msgid "Subroutine call to intrinsic '%s' in DO CONCURRENT block at %L is not PURE"
msgstr "在%2$L处调用内建‘%1$s’的子例程不是 PURE"
#: fortran/io.c:455
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: DP format specifier not allowed at %C"
msgid "DP format specifier not allowed at %C"
msgstr "Fortran 2003:不允许在%C处使用 DP 格式限定符"
#: fortran/io.c:462
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: DC format specifier not allowed at %C"
msgid "DC format specifier not allowed at %C"
msgstr "Fortran 2003:不允许在%C处使用 DC 格式限定符"
#: fortran/io.c:651
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Extension: X descriptor requires leading space count at %L"
msgid "X descriptor requires leading space count at %L"
msgstr "扩展:X 描述符在%L需要前导空格数量"
#: fortran/io.c:680
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Extension: $ descriptor at %L"
msgid "$ descriptor at %L"
msgstr "扩展:%L处的 $ 描述符"
#: fortran/io.c:826
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2008: 'G0' in format at %L"
msgid "'G0' in format at %L"
msgstr "Fortran 2008:%L处格式中的‘G0’"
#: fortran/io.c:1059 fortran/io.c:1121
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Extension: Missing comma at %L"
msgid "Missing comma at %L"
msgstr "扩展:%L处缺少逗号"
#: fortran/io.c:1399
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "FORMAT tag at %L must be of type CHARACTER or INTEGER"
msgid "FORMAT tag at %L must be of type default-kind CHARACTER or of INTEGER"
msgstr "%L处 FORMAT 标记必须具有类型 CHARACTER 或 INTEGER"
#: fortran/io.c:1405
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Deleted feature: ASSIGNED variable in FORMAT tag at %L"
msgid "ASSIGNED variable in FORMAT tag at %L"
msgstr "已删除的特性:%L处 FORMAT 标记中有 ASSIGNED 变量"
#: fortran/io.c:1429
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Extension: Non-character in FORMAT tag at %L"
msgid "Non-character in FORMAT tag at %L"
msgstr "扩展:%L处的 FORMAT 标记中有非字符"
#: fortran/io.c:1482
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Concat operator at %L must concatenate strings of the same kind"
msgid "%s tag at %L must be a character string of default kind"
msgstr "%L处的毗连运算符必须毗连同一种别的字符串"
#: fortran/io.c:1495
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: IOMSG tag at %L"
msgid "IOMSG tag at %L"
msgstr "Fortran 2003:%L处的 IOMSG 标记"
#: fortran/io.c:1516
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "UNIT not specified at %L"
msgid "NEWUNIT specifier at %L"
msgstr "%L没有指定 UNIT"
#: fortran/io.c:1534
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Extension: CONVERT tag at %L"
msgid "CONVERT tag at %L"
msgstr "扩展:%L处的 CONVERT 标记"
#: fortran/io.c:1727 fortran/io.c:1754
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "%s specifier in %s statement at %C has invalid value '%s'"
msgid "%s specifier in %s statement at %C has value '%s'"
msgstr "为%3$C处 %2$s 语句中 %1$s 指定了非法的值‘%4$s’"
#: fortran/io.c:1889
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: ASYNCHRONOUS= at %C not allowed in Fortran 95"
msgid "ASYNCHRONOUS= at %C not allowed in Fortran 95"
msgstr "Fortran 2003:%C处的 ASYNCHRONOUS= 不允许用在 Fortran 95 中"
#: fortran/io.c:1907 fortran/io.c:3350
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: BLANK= at %C not allowed in Fortran 95"
msgid "BLANK= at %C not allowed in Fortran 95"
msgstr "Fortran 2003:%C处的 BLANK= 不允许用在 Fortran 95 中"
#: fortran/io.c:1925 fortran/io.c:3329
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: DECIMAL= at %C not allowed in Fortran 95"
msgid "DECIMAL= at %C not allowed in Fortran 95"
msgstr "Fortran 2003:%C处的 DECIMAL= 不允许用在 Fortran 95 中"
#: fortran/io.c:1957
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: ENCODING= at %C not allowed in Fortran 95"
msgid "ENCODING= at %C not allowed in Fortran 95"
msgstr "Fortran 2003:%C处的 ENCODING= 不允许用在 Fortran 95 中"
#: fortran/io.c:2008 fortran/io.c:3392
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: ROUND= at %C not allowed in Fortran 95"
msgid "ROUND= at %C not allowed in Fortran 95"
msgstr "Fortran 2003:%C处的 ROUND= 不允许用在 Fortran 95 中"
#: fortran/io.c:2028
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: SIGN= at %C not allowed in Fortran 95"
msgid "SIGN= at %C not allowed in Fortran 95"
msgstr "Fortran 2003:%C处的 SIGN= 不允许用在 Fortran 95 中"
#: fortran/io.c:2301
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "ASSIGNED GOTO statement at %L requires an INTEGER variable"
msgid "CLOSE statement at %L requires a UNIT number"
msgstr "ASSIGNED GOTO 语句在%L处需要一个 INTEGER 变量"
#: fortran/io.c:2474
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: FLUSH statement at %C"
msgid "FLUSH statement at %C"
msgstr "Fortran 2003:%C处的 FLUSH 语句"
#: fortran/io.c:2904
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Extension: Comma before i/o item list at %L"
msgid "Comma before i/o item list at %L"
msgstr "扩展:%L处 i/o 项目列表前的逗号"
#: fortran/io.c:3246
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: Internal file at %L with namelist"
msgid "Internal file at %L with namelist"
msgstr "Fortran 2003:%L处内部文件有名字列表"
#: fortran/io.c:3371
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: PAD= at %C not allowed in Fortran 95"
msgid "PAD= at %C not allowed in Fortran 95"
msgstr "Fortran 2003:%C处的 PAD= 不允许用在 Fortran 95 中"
#: fortran/io.c:3437
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: DELIM= at %C not allowed in Fortran 95"
msgid "DELIM= at %C not allowed in Fortran 95"
msgstr "Fortran 2003:%C处的 DELIM= 不允许用在 Fortran 95 中"
#: fortran/io.c:4188
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: WAIT at %C not allowed in Fortran 95"
msgid "WAIT at %C not allowed in Fortran 95"
msgstr "Fortran 2003:%C处的 WAIT 不允许用在 Fortran 95 中"
#: fortran/match.c:560
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Invalid character '$' at %C. Use -fdollar-ok to allow it as an extension"
msgid "Invalid character '$' at %L. Use -fdollar-ok to allow it as an extension"
msgstr "%C处无效的字符‘$’。使用 -fdollar-ok 以允许它作为一个扩展"
#: fortran/match.c:1395 fortran/match.c:1475
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Obsolescent feature: Arithmetic IF statement at %C"
msgid "Arithmetic IF statement at %C"
msgstr "已过时的特性:%C处的算术 IF 语句"
#: fortran/match.c:2766
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Unexpected CASE statement at %C"
msgid "PAUSE statement at %C"
msgstr "%C处非预期的 CASE 语句"
#: fortran/match.c:2907
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Redundant SOURCE tag found at %L "
msgid "Redundant ACQUIRED_LOCK tag found at %L "
msgstr "%L有多余的 SOURCE 标记"
#: fortran/match.c:2972
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Empty IMPLICIT statement at %C"
msgid "LOCK statement at %C"
msgstr "%C处 IMPLICIT 语句为空"
#: fortran/match.c:2982
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Empty IMPLICIT statement at %C"
msgid "UNLOCK statement at %C"
msgstr "%C处 IMPLICIT 语句为空"
#: fortran/match.c:3211
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Deleted feature: ASSIGN statement at %C"
msgid "ASSIGN statement at %C"
msgstr "已删除的特性:%C处的 ASSIGN 语句"
#: fortran/match.c:3255
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Deleted feature: Assigned GOTO statement at %C"
msgid "Assigned GOTO statement at %C"
msgstr "已删除的特性:%C处赋值 GOTO 语句"
#: fortran/match.c:3360
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Obsolescent feature: Computed GOTO at %C"
msgid "Computed GOTO at %C"
msgstr "已过时的特性:%C处的计算转移 GOTO 语句"
#: fortran/match.c:3442
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: typespec in ALLOCATE at %L"
msgid "typespec in ALLOCATE at %L"
msgstr "Fortran 2003:%L处 ALLOCATE 中有 typespec"
#: fortran/match.c:3607
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: ERRMSG tag at %L"
msgid "ERRMSG tag at %L"
msgstr "Fortran 2003:%L处的 ERRMSG 标记"
#: fortran/match.c:3630
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: SOURCE tag at %L"
msgid "SOURCE tag at %L"
msgstr "Fortran 2003:%L处的 SOURCE 标记"
#: fortran/match.c:3649
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "SOURCE tag at %L requires only a single entity in the allocation-list"
msgid "SOURCE tag at %L with more than a single allocate object"
msgstr "%L处的 SOURCE 标记在分配列表中只需要一个单独的实体"
#: fortran/match.c:3906
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Allocate-object at %C is not a nonprocedure pointer or an allocatable variable"
msgid "Allocate-object at %C is not a nonprocedure pointer nor an allocatable variable"
msgstr "%C处的分配对象不是一个非过程指针或可分配的变量"
#: fortran/match.c:3943
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: ERRMSG at %L"
msgid "ERRMSG at %L"
msgstr "Fortran 2003:%L处的 ERRMSG"
#: fortran/match.c:4046
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Extension: RETURN statement in main program at %C"
msgid "RETURN statement in main program at %C"
msgstr "扩展:%C处 RETURN 语句出现在主程序中"
#: fortran/match.c:4941
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Statement function at %L is recursive"
msgid "Statement function at %C"
msgstr "%L处的语句函数是递归的"
#: fortran/match.c:5339
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Syntax error in PROTECTED statement at %C"
msgid "parse error in SELECT TYPE statement at %C"
msgstr "%C处 PROTECTED 语句语法错误"
#: fortran/module.c:527
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: module nature in USE statement at %C"
msgid "module nature in USE statement at %C"
msgstr "Fortran 2003:%C处的 USE 语句中模块本性"
#: fortran/module.c:562
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: \"USE :: module\" at %C"
msgid "\"USE :: module\" at %C"
msgstr "Fortran 2003:%C处的“USE :: module”"
#: fortran/module.c:629
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: Renaming operators in USE statements at %C"
msgid "Renaming operators in USE statements at %C"
msgstr "Fortran 2003:%C处的 USE 语句中更名运算符"
#: fortran/module.c:4494
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Name '%s' at %C is an ambiguous reference to '%s' from current program unit"
msgid "'%s' of module '%s', imported at %C, is also the name of the current program unit"
msgstr "%2$C处的名字‘%1$s’是从当前程序单元对‘%3$s’有歧义的引用"
#: fortran/module.c:6307
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: ISO_FORTRAN_ENV intrinsic module at %C"
msgid "ISO_FORTRAN_ENV intrinsic module at %C"
msgstr "Fortran 2003:%C 处的 ISO_FORTRAN_ENV 内建模块"
#: fortran/module.c:6319
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: ISO_C_BINDING module at %C"
msgid "ISO_C_BINDING module at %C"
msgstr "Fortran 2003:%C处的 ISO_C_BINDING 模块"
#: fortran/module.c:6368
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "File '%s' opened at %C is not a GFORTRAN module file"
msgid "File '%s' opened at %C is not a GNU Fortran module file"
msgstr "%2$C处打开的文件的‘%1$s’并非一个 GFORTRAN 模块文件"
#: fortran/openmp.c:824
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "IF clause at %L requires a scalar LOGICAL expression"
msgid "FINAL clause at %L requires a scalar LOGICAL expression"
msgstr "%L处的 IF 分句需要一个标量 LOGICAL 表达式"
#: fortran/openmp.c:1189
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "!$OMP ATOMIC statement must set a scalar variable of intrinsic type at %L"
msgid "!$OMP ATOMIC READ statement must read from a scalar variable of intrinsic type at %L"
msgstr "%L处 !$OMP ATOMIC 语句必须设定一个内建类型的标量值"
#: fortran/openmp.c:1194
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "expr in !$OMP ATOMIC assignment var = var op expr must be scalar and cannot reference var at %L"
msgid "expr in !$OMP ATOMIC WRITE assignment var = expr must be scalar and cannot reference var at %L"
msgstr "%L处 !$OMP ATOMIC 赋值“变量 = 变量 运算符 表达式”中的“表达式”必须是标量并且不能引用“变量”"
#: fortran/openmp.c:1216 fortran/openmp.c:1486
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "!$OMP ATOMIC statement must set a scalar variable of intrinsic type at %L"
msgid "!$OMP ATOMIC CAPTURE capture statement must read from a scalar variable of intrinsic type at %L"
msgstr "%L处 !$OMP ATOMIC 语句必须设定一个内建类型的标量值"
#: fortran/openmp.c:1231
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "!$OMP ATOMIC statement must set a scalar variable of intrinsic type at %L"
msgid "!$OMP ATOMIC CAPTURE update statement must set a scalar variable of intrinsic type at %L"
msgstr "%L处 !$OMP ATOMIC 语句必须设定一个内建类型的标量值"
#: fortran/openmp.c:1282
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "!$OMP ATOMIC assignment operator must be +, *, -, /, .AND., .OR., .EQV. or .NEQV. at %L"
msgid "!$OMP ATOMIC assignment operator must be binary +, *, -, /, .AND., .OR., .EQV. or .NEQV. at %L"
msgstr "%L处 !$OMP ATOMIC 赋值运算符必须是 +、*、-、/、.AND.、.OR.、.EQV. 或 .NEQV."
#: fortran/openmp.c:1464
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "!$OMP ATOMIC statement must set a scalar variable of intrinsic type at %L"
msgid "!$OMP ATOMIC CAPTURE capture statement must set a scalar variable of intrinsic type at %L"
msgstr "%L处 !$OMP ATOMIC 语句必须设定一个内建类型的标量值"
#: fortran/options.c:564
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Argument to -ffpe-trap is not valid: %s"
msgid "Argument to -ffpe-summary is not valid: %s"
msgstr "-ffpe-trap 的参数无效:%s"
#: fortran/parse.c:1987
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: Type-bound procedure at %C"
msgid "Type-bound procedure at %C"
msgstr "Fortran 2003:%C处的类型限定过程"
#: fortran/parse.c:1995
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Junk after GENERIC binding at %C"
msgid "GENERIC binding at %C"
msgstr "%C 处的泛型绑定后有垃圾字符"
#: fortran/parse.c:2003
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: FINAL procedure declaration at %C"
msgid "FINAL procedure declaration at %C"
msgstr "Fortran 2003:%C处的的 FINAL 过程声明"
#: fortran/parse.c:2015
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2008: Derived type definition at %C with empty CONTAINS section"
msgid "Derived type definition at %C with empty CONTAINS section"
msgstr "Fortran 2008:%C的派生类型定义有空的 CONTAINS 节"
#: fortran/parse.c:2119
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: Derived type definition at %C without components"
msgid "Derived type definition at %C without components"
msgstr "Fortran 2003:%C处的派生类型定义没有组件"
#: fortran/parse.c:2173
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: CONTAINS block in derived type definition at %C"
msgid "CONTAINS block in derived type definition at %C"
msgstr "Fortran 2003:%C处的派生类型定义中的 CONTAINS 块"
#: fortran/parse.c:2272
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Allocatable component of structure at %C must have a deferred shape"
msgid "Allocatable component %s at %L of type LOCK_TYPE must have a codimension"
msgstr "%C处可分配的组件必须有延迟的外形"
#: fortran/parse.c:2653
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "%s statement is not allowed inside of BLOCK at %C"
msgid "%s statement is not allowed inside of BLOCK DATA at %C"
msgstr "%s 语句不能用在%C处 BLOCK 内"
#: fortran/parse.c:3372
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2008: BLOCK construct at %C"
msgid "BLOCK construct at %C"
msgstr "Fortran 2008:%C处的 BLOCK 结构"
#: fortran/parse.c:3863
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "FORMAT statement at %L does not have a statement label"
msgid "DATA statement at %C after the first executable statement"
msgstr "%L处 FORMAT 语句没有语句标号"
#: fortran/parse.c:4135
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2008: CONTAINS statement without FUNCTION or SUBROUTINE statement at %C"
msgid "CONTAINS statement without FUNCTION or SUBROUTINE statement at %C"
msgstr "Fortran 2008:%C处 CONTAINS 语句没有 FUNCTION 或 SUBROUTINE 语句"
#: fortran/parse.c:4263
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Global name '%s' at %L is already being used as a %s at %L"
msgid "Global binding name '%s' at %L is already being used as a %s at %L"
msgstr "%2$L处的名字‘%1$s’已经在%4$L处被用作 %3$s"
#: fortran/primary.c:270
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Extension: Hollerith constant at %C"
msgid "Hollerith constant at %C"
msgstr "扩展:%C处的荷勒瑞斯常量"
#: fortran/primary.c:393
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Extension: Hexadecimal constant at %C uses non-standard syntax"
msgid "Hexadecimal constant at %C uses non-standard syntax"
msgstr "扩展:%C处的十六进制常量使用了非标准语法"
#: fortran/primary.c:431
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Extension: BOZ constant at %C uses non-standard postfix syntax"
msgid "BOZ constant at %C uses non-standard postfix syntax"
msgstr "扩展:%C处的 BOZ 常量使用了非标准的后序语法。"
#: fortran/primary.c:467
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: BOZ used outside a DATA statement at %C"
msgid "BOZ used outside a DATA statement at %C"
msgstr "Fortran 2003:%C处的 BOZ 用在了 DATA 语句之外"
#: fortran/primary.c:561
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Extension: Hollerith constant at %C"
msgid "Extension: exponent-letter 'q' in real-literal-constant at %C"
msgstr "扩展:%C处的荷勒瑞斯常量"
#: fortran/primary.c:663
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Real number at %C has a 'd' exponent and an explicit kind"
msgid "Real number at %C has a 'q' exponent and an explicit kind"
msgstr "%C处的实数有一个‘d’指数和一个显式的种别"
#: fortran/primary.c:677
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Invalid initializer %s in Data statement at %C"
msgid "Invalid exponent-letter 'q' in real-literal-constant at %C"
msgstr "%2$C处 DATA 语句初始值设定 %1$s 无效"
#: fortran/primary.c:1216
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Expected PARAMETER symbol in complex constant at %C"
msgid "PARAMETER symbol in complex constant at %C"
msgstr "%C处复数常量中需要 PARAMETER 符号"
#: fortran/primary.c:1645
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Unknown argument list function at %L"
msgid "argument list function at %C"
msgstr "%L处参数列表函数未知"
#: fortran/primary.c:1915
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Symbol '%s' at %L has no IMPLICIT type"
msgid "Symbol '%s' at %C has no IMPLICIT type"
msgstr "%2$L处的符号‘%1$s’没有隐式类型"
#: fortran/primary.c:1921
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Unexpected character in variable list at %C"
msgid "Unexpected '%%' for nonderived-type variable '%s' at %C"
msgstr "%C处变量列表中有非预期的垃圾字符"
#: fortran/primary.c:2363
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: Structure constructor with missing optional arguments at %C"
msgid "Structure constructor with missing optional arguments at %C"
msgstr "Fortran 2003:%C处的结构构造函数丢失可选的参数"
#: fortran/primary.c:2418
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Can't construct ABSTRACT type '%s' at %C"
msgid "Can't construct ABSTRACT type '%s' at %L"
msgstr "%2$C处无法构建 ABSTRACT 类型‘%1$s’"
#: fortran/primary.c:2438
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: Structure constructor with named arguments at %C"
msgid "Structure constructor with named arguments at %C"
msgstr "Fortran 2003:%C处的结构构造函数有有名的参数"
#: fortran/primary.c:2453
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Component initializer without name after component named %s at %C!"
msgid "Component initializer without name after component named %s at %L!"
msgstr "%2$C处名为 %1$s 的组件之后的组件初始值设定没有名字!"
#: fortran/primary.c:2458
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Too many components in structure constructor at %C!"
msgid "Too many components in structure constructor at %L!"
msgstr "%C处结构构造函数中组件太多!"
#: fortran/primary.c:2495
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Component '%s' is initialized twice in the structure constructor at %C!"
msgid "Component '%s' is initialized twice in the structure constructor at %L!"
msgstr "%2$C处结构构造函数中组件‘%1$s’被初始化两次!"
#: fortran/resolve.c:145
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Interface '%s', used by procedure '%s' at %L, is declared in a later PROCEDURE statement"
msgid "Interface '%s' at %L is declared in a later PROCEDURE statement"
msgstr "为过程‘%2$s’在%3$L处使用的接口‘%1$s’是在之后的 PROCEDURE 语句中声明的"
#: fortran/resolve.c:158
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Interface '%s' at %C may not be generic"
msgid "Interface '%s' at %L may not be generic"
msgstr "%2$C处的接口‘%1$s’不能是泛型"
#: fortran/resolve.c:165
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Interface '%s' at %C may not be a statement function"
msgid "Interface '%s' at %L may not be a statement function"
msgstr "%2$C处的接口‘%1$s’不能是个语句函数"
#: fortran/resolve.c:174
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Intrinsic procedure '%s' not allowed in PROCEDURE statement at %C"
msgid "Intrinsic procedure '%s' not allowed in PROCEDURE statement at %L"
msgstr "内建过程‘%s’不允许在 %C 的 PROCEDURE 语句中"
#: fortran/resolve.c:180
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Interface '%s' of procedure '%s' at %L must be explicit"
msgid "Interface '%s' at %L must be explicit"
msgstr "%3$L处过程‘%2$s’的接口‘%1$s’必须是显式的"
#: fortran/resolve.c:311
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Keyword argument '%s' at %L is not in the procedure"
msgid "Self-referential argument '%s' at %L is not allowed"
msgstr "%2$L处关键字实参‘%1$s’不在过程里"
#: fortran/resolve.c:788
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Extension: Function %s at %L with entries returning variables of different string lengths"
msgid "Function %s at %L with entries returning variables of different string lengths"
msgstr "扩展:%2$L处函数 %1$s 有返回不同字符串长度的变量的表项"
#: fortran/resolve.c:1001
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "COMMON block '%s' at %L is used as PARAMETER at %L"
msgid "COMMON block '%s' at %L uses the same global identifier as entity at %L"
msgstr "%2$L处的 COMMON 块‘%1$s’在%3$L处被用作 PARAMETER"
#: fortran/resolve.c:1056
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Variable '%s' at %L cannot have both the POINTER and BIND(C) attributes"
msgid "COMMON block '%s' at %L can not have the EXTERNAL attribute"
msgstr "%2$L处变量‘%1$s’不能既有 POINTER 又有 BIND(C) 属性"
#: fortran/resolve.c:1064
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: COMMON block '%s' at %L that is also a function result"
msgid "COMMON block '%s' at %L that is also a function result"
msgstr "Fortran 2003:%2$L处的 COMMON 块‘%1$s’也是一个函数返回值"
#: fortran/resolve.c:1069
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: COMMON block '%s' at %L that is also a global procedure"
msgid "COMMON block '%s' at %L that is also a global procedure"
msgstr "Fortran 2003:%2$L处的 COMMON 块‘%1$s’也是一个全局过程"
#: fortran/resolve.c:1152
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "The rank of the element in the derived type constructor at %L does not match that of the component (%d/%d)"
msgid "The rank of the element in the structure constructor at %L does not match that of the component (%d/%d)"
msgstr "%L处的派生类型构造函数中元素的秩与该组件(%d/%d)的不匹配"
#: fortran/resolve.c:1173
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "The element in the derived type constructor at %L, for pointer component '%s', is %s but should be %s"
msgid "The element in the structure constructor at %L, for pointer component '%s', is %s but should be %s"
msgstr "%L处指针组件‘%s’的派生类型构造函数中的元素是 %s 但应该是 %s"
#: fortran/resolve.c:1258
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "The NULL in the derived type constructor at %L is being applied to component '%s', which is neither a POINTER nor ALLOCATABLE"
msgid "The NULL in the structure constructor at %L is being applied to component '%s', which is neither a POINTER nor ALLOCATABLE"
msgstr "%L处派生类型构造函数中的 NULL 被用在既不是一个指针也不是 ALLOCATABLE 的组件‘%s’上"
#: fortran/resolve.c:1308
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "The element in the derived type constructor at %L, for pointer component '%s' should be a POINTER or a TARGET"
msgid "The element in the structure constructor at %L, for pointer component '%s' should be a POINTER or a TARGET"
msgstr "%L处指针组件‘%s’的派生类型构造函数中的元素应该是 POINTER 或 TARGET"
#: fortran/resolve.c:1336
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Invalid expression in the derived type constructor for pointer component '%s' at %L in PURE procedure"
msgid "Invalid expression in the structure constructor for pointer component '%s' at %L in PURE procedure"
msgstr "%2$L处指针组件‘%1$s’的派生类型构造函数中表达式无效"
#: fortran/resolve.c:2442
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Interface mismatch in dummy procedure '%s' at %L: %s"
msgid "Interface mismatch in global procedure '%s' at %L: %s "
msgstr "哑过程‘%s’接口在%L处不匹配:%s"
#: fortran/resolve.c:2990
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "reference to non-PURE function '%s' at %L inside a FORALL %s"
msgid "Reference to non-PURE function '%s' at %L inside a FORALL %s"
msgstr "%2$L处对非 PURE 函数‘%1$s’的引用出现在 FORALL %3$s 中"
#: fortran/resolve.c:2997
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "reference to non-PURE function '%s' at %L inside a FORALL %s"
msgid "Reference to non-PURE function '%s' at %L inside a DO CONCURRENT %s"
msgstr "%2$L处对非 PURE 函数‘%1$s’的引用出现在 FORALL %3$s 中"
#: fortran/resolve.c:3069
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Subroutine call to '%s' in FORALL block at %L is not PURE"
msgid "Subroutine call to '%s' in DO CONCURRENT block at %L is not PURE"
msgstr "%2$L处 FORALL 块内对‘%1$s’子例程的调用不是 PURE"
#: fortran/resolve.c:4129
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Extension: REAL array index at %L"
msgid "REAL array index at %L"
msgstr "扩展:%L处的 REAL 数组索引"
#: fortran/resolve.c:4766
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Assumed shape array at %L must be a dummy argument"
msgid "Assumed-type variable %s at %L may only be used as actual argument"
msgstr "%L处假定外形的数组必须是一个虚参"
#: fortran/resolve.c:4791
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Assumed shape array at %L must be a dummy argument"
msgid "Assumed-rank variable %s at %L may only be used as actual argument"
msgstr "%L处假定外形的数组必须是一个虚参"
#: fortran/resolve.c:6292
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "DO loop at %L will be executed zero times"
msgid "DO loop at %L will be executed zero times (use -Wno-zerotrip to suppress)"
msgstr "%L处的 DO 循环会被执行零次"
#: fortran/resolve.c:7966
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Unexpected use of subroutine name '%s' at %C"
msgid "Unexpected intrinsic type '%s' at %L"
msgstr "对子进程名‘%s’非预期的使用,在%C处"
#: fortran/resolve.c:8256
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Invalid context for NULL() pointer at %%L"
msgid "Invalid context for NULL () intrinsic at %L"
msgstr "%%L处 NULL() 指针上下文无效"
#: fortran/resolve.c:8296
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Data transfer element at %L cannot have POINTER components"
msgid "Data transfer element at %L cannot have POINTER components unless it is processed by a defined input/output procedure"
msgstr "%L处数据传输元素不能有 POINTER 组件"
#: fortran/resolve.c:8312
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Data transfer element at %L cannot have ALLOCATABLE components"
msgid "Data transfer element at %L cannot have ALLOCATABLE components unless it is processed by a defined input/output procedure"
msgstr "%L处数据传输元素不能有 ALLOCATABLE 组件"
#: fortran/resolve.c:8388
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Stat-variable at %L must be a scalar INTEGER variable"
msgid "Lock variable at %L must be a scalar of type LOCK_TYPE"
msgstr "%L处 stat 变量必须是一个标量 INTEGER 变量"
#: fortran/resolve.c:9196
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Assignment to a FORALL index variable at %L"
msgid "Assignment to an allocatable polymorphic variable at %L"
msgstr "%L处向 FORALL 索引变量赋值"
#: fortran/resolve.c:10180
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Binding label '%s' at %L collides with the global entity '%s' at %L"
msgid "Variable %s with binding label %s at %L uses the same global identifier as entity at %L"
msgstr "%2$L处的绑定标号‘%1$s’与 %4$L 处的全局实体‘%3$s’冲突"
#. multiple checks for the same procedure.
#: fortran/resolve.c:10210
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Binding label '%s' at %L collides with the global entity '%s' at %L"
msgid "Procedure %s with binding label %s at %L uses the same global identifier as entity at %L"
msgstr "%2$L处的绑定标号‘%1$s’与 %4$L 处的全局实体‘%3$s’冲突"
#: fortran/resolve.c:10628
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Allocatable array '%s' at %L must have a deferred shape"
msgid "Allocatable array '%s' at %L must have a deferred shape or assumed rank"
msgstr "可分配的数组‘%s’在%L处必须有延迟的外形"
#: fortran/resolve.c:10640
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Array pointer '%s' at %L must have a deferred shape"
msgid "Array pointer '%s' at %L must have a deferred shape or assumed rank"
msgstr "数组指针‘%s’在%L处必须有延迟的外形"
#: fortran/resolve.c:10730
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2008: Implied SAVE for module variable '%s' at %L, needed due to the default initialization"
msgid "Implied SAVE for module variable '%s' at %L, needed due to the default initialization"
msgstr "Fortran 2008:%2$L处模块变量‘%1$s’隐含使用了 SAVE,因为默认初始化有此需求"
#: fortran/resolve.c:10830
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "'%s' at %L must have constant character length in this context"
msgid "COMMON variable '%s' at %L must have constant character length"
msgstr "变量‘%s’在%L处上下文中字符长度必须为常量"
#: fortran/resolve.c:10958
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: '%s' is of a PRIVATE type and cannot be a dummy argument of '%s', which is PUBLIC at %L"
msgid "'%s' is of a PRIVATE type and cannot be a dummy argument of '%s', which is PUBLIC at %L"
msgstr "Fortran 2003:%3$L处‘%1$s’是 PRIVATE 类型因而不能是 PUBLIC 类型‘%2$s’的虚参"
#: fortran/resolve.c:10980 fortran/resolve.c:11004
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: Procedure '%s' in PUBLIC interface '%s' at %L takes dummy arguments of '%s' which is PRIVATE"
msgid "Procedure '%s' in PUBLIC interface '%s' at %L takes dummy arguments of '%s' which is PRIVATE"
msgstr "Fortran 2003: %3$L处 PUBLIC 接口‘%2$s’中的过程‘%1$s’有 PRIVATE 的虚参‘%4$s’"
#: fortran/resolve.c:11093
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "CHARACTER(*) function '%s' at %L cannot be pure"
msgid "CHARACTER(*) function '%s' at %L"
msgstr "CHARACTER(*) 函数‘%s’在%L处不能为纯函数"
#: fortran/resolve.c:11102
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Procedure pointer component '%s' with PASS at %L must have at least one argument"
msgid "Procedure pointer '%s' at %L shall not be elemental"
msgstr "%2$L处的具有 PASS 的过程指针组件‘%1$s’必须至少有一个实参"
#: fortran/resolve.c:11108
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Dummy procedure '%s' at %C cannot have a generic interface"
msgid "Dummy procedure '%s' at %L shall not be elemental"
msgstr "哑过程‘%s’在%C处不能有泛型接口"
#: fortran/resolve.c:12356
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: the component '%s' is a PRIVATE type and cannot be a component of '%s', which is PUBLIC at %L"
msgid "the component '%s' is a PRIVATE type and cannot be a component of '%s', which is PUBLIC at %L"
msgstr "Fortran 2003:%3$L处组合‘%1$s’是一个 PRIVATE 类型,因此不能是 PUBLIC‘%2$s’的组合"
#: fortran/resolve.c:12484
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Component '%s' of '%s' at %L has the same name as an inherited type-bound procedure"
msgid "Generic name '%s' of function '%s' at %L being the same name as derived type at %L"
msgstr "%3$L处‘%2$s’的组件‘%1$s’与一个继承的类型限定过程同名"
#: fortran/resolve.c:12900
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Assumed shape array at %L must be a dummy argument"
msgid "Assumed-rank array at %L must be a dummy argument"
msgstr "%L处假定外形的数组必须是一个虚参"
#: fortran/resolve.c:12990
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Variable '%s' at %L cannot have both the ALLOCATABLE and BIND(C) attributes"
msgid "Variable %s at %L with NO_ARG_CHECK attribute may not have the ALLOCATABLE, CODIMENSION, POINTER or VALUE attribute"
msgstr "%2$L处变量‘%1$s’不能既有 ALLOCATABLE 又有 BIND(C) 属性"
#: fortran/resolve.c:12998
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Variable '%s' at %L cannot have both the POINTER and BIND(C) attributes"
msgid "Variable %s at %L with NO_ARG_CHECK attribute may not have the INTENT(OUT) attribute"
msgstr "%2$L处变量‘%1$s’不能既有 POINTER 又有 BIND(C) 属性"
#: fortran/resolve.c:13025
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Assumed shape array '%s' at %L is not permitted in an initialization expression"
msgid "Assumed type of variable %s at %L is only permitted for dummy variables"
msgstr "%2$L处假定外形数组‘%1$s’不能用在初始化表达式中"
#: fortran/resolve.c:13032
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Variable '%s' at %L cannot have both the ALLOCATABLE and BIND(C) attributes"
msgid "Assumed-type variable %s at %L may not have the ALLOCATABLE, CODIMENSION, POINTER or VALUE attribute"
msgstr "%2$L处变量‘%1$s’不能既有 ALLOCATABLE 又有 BIND(C) 属性"
#: fortran/resolve.c:13039
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Variable '%s' at %L cannot have both the POINTER and BIND(C) attributes"
msgid "Assumed-type variable %s at %L may not have the INTENT(OUT) attribute"
msgstr "%2$L处变量‘%1$s’不能既有 POINTER 又有 BIND(C) 属性"
#: fortran/resolve.c:13151
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: PUBLIC %s '%s' at %L of PRIVATE derived type '%s'"
msgid "PUBLIC %s '%s' at %L of PRIVATE derived type '%s'"
msgstr "Fortran 2003:%3$L处 PUBLIC %1$s‘%2$s’具有 PRIVATE 派生类型‘%4$s’"
#: fortran/resolve.c:13196
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Dummy argument '%s' at %L cannot be INTENT(OUT)"
msgid "Dummy argument '%s' at %L of LOCK_TYPE shall not be INTENT(OUT)"
msgstr "%2$L处的‘%1$s’虚参不能是 INTENT(OUT)"
#: fortran/resolve.c:14338
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: PUBLIC function '%s' at %L of PRIVATE type '%s'"
msgid "PUBLIC function '%s' at %L of PRIVATE type '%s'"
msgstr "Fortran 2003:%2$L处 PRIVATE 类型‘%3$s’的 PUBLIC 函数‘%1$s’"
#: fortran/scanner.c:327
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "ignoring duplicate directory \"%s\"\n"
msgid "Include directory \"%s\": %s"
msgstr "忽略重复的目录“%s”\n"
#: fortran/scanner.c:333
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "ignoring nonexistent directory \"%s\"\n"
msgid "Nonexistent include directory \"%s\""
msgstr "忽略不存在的目录“%s”\n"
#: fortran/scanner.c:339
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "%qD is not a type"
msgid "\"%s\" is not a directory"
msgstr "%qD不是一个类型"
#: fortran/symbol.c:474
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: Procedure pointer at %C"
msgid "Procedure pointer at %C"
msgstr "Fortran 2003:%C处的过程指针"
#: fortran/symbol.c:767
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "%s attribute conflicts with %s attribute at %L"
msgid "%s attribute with %s attribute at %L"
msgstr "%s 属性与 %s 属性在%L处冲突"
#: fortran/symbol.c:773
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "%s attribute conflicts with %s attribute in '%s' at %L"
msgid "%s attribute with %s attribute in '%s' at %L"
msgstr "%s 属性与 %s 属性冲突,在‘%s’中,位于 %L"
#: fortran/symbol.c:1590
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: BIND(C) at %L"
msgid "BIND(C) at %L"
msgstr "Fortran 2003:%L处的 BIND(C)"
#: fortran/symbol.c:1610
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Fortran 2003: EXTENDS at %L"
msgid "EXTENDS at %L"
msgstr "Fortran 2003:%L处的 EXTENDS"
#: fortran/symbol.c:2270
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Expected terminating name at %C"
msgid "Shared DO termination label %d at %C"
msgstr "%C处需要结束名"
#: fortran/trans-common.c:400
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Named COMMON block '%s' at %L shall be of the same size"
msgid "Named COMMON block '%s' at %L shall be of the same size as elsewhere (%lu vs %lu bytes)"
msgstr "%2$L处的 COMMON 块‘%1$s’应该有同样的大小"
#: fortran/trans-common.c:1167
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "COMMON '%s' at %L requires %d bytes of padding at start; reorder elements or use -fno-align-commons"
msgid "COMMON '%s' at %L requires %d bytes of padding; reorder elements or use -fno-align-commons"
msgstr "%2$L处的 COMMON‘%1$s’需要 %3$d 字节填充在开始处;重排序元素或使用 -fno-align-commons"
#: fortran/trans-common.c:1171
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "COMMON at %L requires %d bytes of padding at start; reorder elements or use -fno-align-commons"
msgid "COMMON at %L requires %d bytes of padding; reorder elements or use -fno-align-commons"
msgstr "%L处的 COMMON 需要 %d 字节填充在开始处;重排序元素或使用 -fno-align-commons"
#: fortran/trans-decl.c:4257
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Unused variable '%s' declared at %L"
msgid "Unused PRIVATE module variable '%s' declared at %L"
msgstr "%2$L处声明了未使用的变量‘%1$s’"
#: fortran/trans-decl.c:4837
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Unused variable '%s' declared at %L"
msgid "Unused module variable '%s' which has been explicitly imported at %L"
msgstr "%2$L处声明了未使用的变量‘%1$s’"
#: fortran/trans-decl.c:4896
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Unused parameter '%s' declared at %L"
msgid "Unused parameter '%s' which has been explicitly imported at %L"
msgstr "%2$L处声明了未使用的参数‘%1$s’"
#: fortran/trans-types.c:496
#, fuzzy, gcc-internal-format
-#| msgid "integer kind=8 not available for -fdefault-integer-8 option"
msgid "INTEGER(KIND=8) is not available for -fdefault-integer-8 option"
msgstr "integer kind=8 在指定了 -fdefault-integer-8 选项时不可用"
#: fortran/trans-types.c:504
#, fuzzy, gcc-internal-format
-#| msgid "integer kind=8 not available for -fdefault-integer-8 option"
msgid "INTEGER(KIND=8) is not available for -finteger-4-integer-8 option"
msgstr "integer kind=8 在指定了 -fdefault-integer-8 选项时不可用"
#: fortran/trans-types.c:522
#, fuzzy, gcc-internal-format
-#| msgid "real kind=8 not available for -fdefault-real-8 option"
msgid "REAL(KIND=8) is not available for -fdefault-real-8 option"
msgstr "real kind=8 在指定了 -fdefault-real-8 选项时不可用"
#: fortran/trans-types.c:529
#, fuzzy, gcc-internal-format
-#| msgid "real kind=8 not available for -fdefault-real-8 option"
msgid "REAL(KIND=8) is not available for -freal-4-real-8 option"
msgstr "real kind=8 在指定了 -fdefault-real-8 选项时不可用"
#: fortran/trans-types.c:536
#, fuzzy, gcc-internal-format
-#| msgid "real kind=8 not available for -fdefault-real-8 option"
msgid "REAL(KIND=10) is not available for -freal-4-real-10 option"
msgstr "real kind=8 在指定了 -fdefault-real-8 选项时不可用"
#: fortran/trans-types.c:543
#, fuzzy, gcc-internal-format
-#| msgid "real kind=8 not available for -fdefault-real-8 option"
msgid "REAL(KIND=16) is not available for -freal-4-real-16 option"
msgstr "real kind=8 在指定了 -fdefault-real-8 选项时不可用"
#: fortran/trans-types.c:566
#, fuzzy, gcc-internal-format
-#| msgid "real kind=8 not available for -fdefault-real-8 option"
msgid "REAL(KIND=4) is not available for -freal-8-real-4 option"
msgstr "real kind=8 在指定了 -fdefault-real-8 选项时不可用"
#: fortran/trans-types.c:573
#, fuzzy, gcc-internal-format
-#| msgid "real kind=8 not available for -fdefault-real-8 option"
msgid "REAL(KIND=10) is not available for -freal-8-real-10 option"
msgstr "real kind=8 在指定了 -fdefault-real-8 选项时不可用"
#: fortran/trans-types.c:580
#, fuzzy, gcc-internal-format
-#| msgid "real kind=8 not available for -fdefault-real-8 option"
msgid "REAL(KIND=10) is not available for -freal-8-real-16 option"
msgstr "real kind=8 在指定了 -fdefault-real-8 选项时不可用"
#: fortran/trans-types.c:1458
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Array element size too big"
msgid "Array element size too big at %C"
msgstr "数组元素太大"
#. duplicate code from LOAD macro
#: java/expr.c:3549
#, fuzzy, gcc-internal-format
-#| msgid "unrecogized wide sub-instruction"
msgid "unrecognized wide sub-instruction"
msgstr "无法识别的宽子指令"
#: lto/lto.c:2302
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "cannot open %s"
msgid "Cannot open %s"
msgstr "不能打开 %s"
#: lto/lto.c:2323
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "cannot open %s"
msgid "Cannot map %s"
msgstr "不能打开 %s"
#: lto/lto.c:2334
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "cannot open %s"
msgid "Cannot read %s"
msgstr "不能打开 %s"
#: objc/objc-act.c:3964 objc/objc-act.c:3992 objc/objc-act.c:4048
#, fuzzy, gcc-internal-format
-#| msgid "unused variable %q+D"
msgid "duplicate instance variable %q+D"
msgstr "未使用的变量%q+D"
#. rtype is an IDENTIFIER_NODE at this point.
#: objc/objc-act.c:5398 objc/objc-act.c:5532
#, fuzzy, gcc-internal-format
-#| msgid "definition of protocol %qE not found"
msgid "@interface of class %qE not found"
msgstr "找不到协议%qE的方法定义"
/* Kind of modification of the insn. */
ENUM_BITFIELD(ext_modified_kind) kind : 2;
+ unsigned int do_not_reextend : 1;
+
/* True if the insn is scheduled to be deleted. */
unsigned int deleted : 1;
};
register than the source operand, then additional restrictions
are needed. Note we have to handle cases where we have nested
extensions in the source operand. */
- if (REGNO (SET_DEST (PATTERN (cand->insn)))
- != REGNO (get_extended_src_reg (SET_SRC (PATTERN (cand->insn)))))
+ bool copy_needed
+ = (REGNO (SET_DEST (PATTERN (cand->insn)))
+ != REGNO (get_extended_src_reg (SET_SRC (PATTERN (cand->insn)))));
+ if (copy_needed)
{
/* In theory we could handle more than one reaching def, it
just makes the code to update the insn stream more complex. */
/* We require the candidate not already be modified. It may,
for example have been changed from a (sign_extend (reg))
- into (zero_extend (sign_extend (reg)).
+ into (zero_extend (sign_extend (reg))).
Handling that case shouldn't be terribly difficult, but the code
here and the code to emit copies would need auditing. Until
|| reg_set_between_p (SET_DEST (PATTERN (cand->insn)),
def_insn, cand->insn))
return false;
+
+ /* We must be able to copy between the two registers. Generate,
+ recognize and verify constraints of the copy. Also fail if this
+ generated more than one insn.
+
+ This generates garbage since we throw away the insn when we're
+ done, only to recreate it later if this test was successful.
+
+ Make sure to get the mode from the extension (cand->insn). This
+ is different than in the code to emit the copy as we have not
+ modified the defining insn yet. */
+ start_sequence ();
+ rtx pat = PATTERN (cand->insn);
+ rtx new_dst = gen_rtx_REG (GET_MODE (SET_DEST (pat)),
+ REGNO (XEXP (SET_SRC (pat), 0)));
+ rtx new_src = gen_rtx_REG (GET_MODE (SET_DEST (pat)),
+ REGNO (SET_DEST (pat)));
+ emit_move_insn (new_dst, new_src);
+
+ rtx insn = get_insns();
+ end_sequence ();
+ if (NEXT_INSN (insn))
+ return false;
+ if (recog_memoized (insn) == -1)
+ return false;
+ extract_insn (insn);
+ if (!constrain_operands (1))
+ return false;
}
fprintf (dump_file, "All merges were successful.\n");
FOR_EACH_VEC_ELT (state->modified_list, i, def_insn)
- if (state->modified[INSN_UID (def_insn)].kind == EXT_MODIFIED_NONE)
- state->modified[INSN_UID (def_insn)].kind
- = (cand->code == ZERO_EXTEND
- ? EXT_MODIFIED_ZEXT : EXT_MODIFIED_SEXT);
+ {
+ ext_modified *modified = &state->modified[INSN_UID (def_insn)];
+ if (modified->kind == EXT_MODIFIED_NONE)
+ modified->kind = (cand->code == ZERO_EXTEND ? EXT_MODIFIED_ZEXT
+ : EXT_MODIFIED_SEXT);
+ if (copy_needed)
+ modified->do_not_reextend = 1;
+ }
return true;
}
else
static void free_av_set (basic_block);
static void invalidate_av_set (basic_block);
static void extend_insn_data (void);
-static void sel_init_new_insn (insn_t, int);
+static void sel_init_new_insn (insn_t, int, int = -1);
static void finish_insns (void);
\f
/* Various list functions. */
return seqno;
}
-/* Compute seqno for INSN by its preds or succs. */
+/* Compute seqno for INSN by its preds or succs. Use OLD_SEQNO to compute
+ seqno in corner cases. */
static int
-get_seqno_for_a_jump (insn_t insn)
+get_seqno_for_a_jump (insn_t insn, int old_seqno)
{
int seqno;
if (seqno < 0)
seqno = get_seqno_by_succs (insn);
- gcc_assert (seqno >= 0);
+ if (seqno < 0)
+ {
+ /* The only case where this could be here legally is that the only
+ unscheduled insn was a conditional jump that got removed and turned
+ into this unconditional one. Initialize from the old seqno
+ of that jump passed down to here. */
+ seqno = old_seqno;
+ }
+ gcc_assert (seqno >= 0);
return seqno;
}
}
/* This is used to initialize spurious jumps generated by
- sel_redirect_edge (). */
+ sel_redirect_edge (). OLD_SEQNO is used for initializing seqnos
+ in corner cases within get_seqno_for_a_jump. */
static void
-init_simplejump_data (insn_t insn)
+init_simplejump_data (insn_t insn, int old_seqno)
{
init_expr (INSN_EXPR (insn), vinsn_create (insn, false), 0,
REG_BR_PROB_BASE, 0, 0, 0, 0, 0, 0,
vNULL, true, false, false,
false, true);
- INSN_SEQNO (insn) = get_seqno_for_a_jump (insn);
+ INSN_SEQNO (insn) = get_seqno_for_a_jump (insn, old_seqno);
init_first_time_insn_data (insn);
}
/* Perform deferred initialization of insns. This is used to process
- a new jump that may be created by redirect_edge. */
-void
-sel_init_new_insn (insn_t insn, int flags)
+ a new jump that may be created by redirect_edge. OLD_SEQNO is used
+ for initializing simplejumps in init_simplejump_data. */
+static void
+sel_init_new_insn (insn_t insn, int flags, int old_seqno)
{
/* We create data structures for bb when the first insn is emitted in it. */
if (INSN_P (insn)
if (flags & INSN_INIT_TODO_SIMPLEJUMP)
{
extend_insn_data ();
- init_simplejump_data (insn);
+ init_simplejump_data (insn, old_seqno);
}
gcc_assert (CONTAINING_RGN (BLOCK_NUM (insn))
}
/* A wrapper for redirect_edge_and_branch_force, which also initializes
- data structures for possibly created bb and insns. Returns the newly
- added bb or NULL, when a bb was not needed. */
+ data structures for possibly created bb and insns. */
void
sel_redirect_edge_and_branch_force (edge e, basic_block to)
{
basic_block jump_bb, src, orig_dest = e->dest;
int prev_max_uid;
rtx jump;
+ int old_seqno = -1;
/* This function is now used only for bookkeeping code creation, where
we'll never get the single pred of orig_dest block and thus will not
&& !single_pred_p (orig_dest));
src = e->src;
prev_max_uid = get_max_uid ();
- jump_bb = redirect_edge_and_branch_force (e, to);
+ /* Compute and pass old_seqno down to sel_init_new_insn only for the case
+ when the conditional jump being redirected may become unconditional. */
+ if (any_condjump_p (BB_END (src))
+ && INSN_SEQNO (BB_END (src)) >= 0)
+ old_seqno = INSN_SEQNO (BB_END (src));
+ jump_bb = redirect_edge_and_branch_force (e, to);
if (jump_bb != NULL)
sel_add_bb (jump_bb);
jump = find_new_jump (src, jump_bb, prev_max_uid);
if (jump)
- sel_init_new_insn (jump, INSN_INIT_TODO_LUID | INSN_INIT_TODO_SIMPLEJUMP);
+ sel_init_new_insn (jump, INSN_INIT_TODO_LUID | INSN_INIT_TODO_SIMPLEJUMP,
+ old_seqno);
set_immediate_dominator (CDI_DOMINATORS, to,
recompute_dominator (CDI_DOMINATORS, to));
set_immediate_dominator (CDI_DOMINATORS, orig_dest,
edge redirected;
bool recompute_toporder_p = false;
bool maybe_unreachable = single_pred_p (orig_dest);
+ int old_seqno = -1;
latch_edge_p = (pipelining_p
&& current_loop_nest
src = e->src;
prev_max_uid = get_max_uid ();
+ /* Compute and pass old_seqno down to sel_init_new_insn only for the case
+ when the conditional jump being redirected may become unconditional. */
+ if (any_condjump_p (BB_END (src))
+ && INSN_SEQNO (BB_END (src)) >= 0)
+ old_seqno = INSN_SEQNO (BB_END (src));
+
redirected = redirect_edge_and_branch (e, to);
gcc_assert (redirected && !last_added_blocks.exists ());
jump = find_new_jump (src, NULL, prev_max_uid);
if (jump)
- sel_init_new_insn (jump, INSN_INIT_TODO_LUID | INSN_INIT_TODO_SIMPLEJUMP);
+ sel_init_new_insn (jump, INSN_INIT_TODO_LUID | INSN_INIT_TODO_SIMPLEJUMP, old_seqno);
/* Only update dominator info when we don't have unreachable blocks.
Otherwise we'll update in maybe_tidy_empty_bb. */
*slot = node;
}
-/* Remove node from symbol table. This function is not used directly, but via
- cgraph/varpool node removal routines. */
+/* Remove NODE from same comdat group. */
void
-symtab_unregister_node (symtab_node *node)
+symtab_remove_from_same_comdat_group (symtab_node *node)
{
- void **slot;
- ipa_remove_all_references (&node->ref_list);
- ipa_remove_all_referring (&node->ref_list);
-
if (node->same_comdat_group)
{
symtab_node *prev;
prev->same_comdat_group = node->same_comdat_group;
node->same_comdat_group = NULL;
}
+}
+
+/* Remove node from symbol table. This function is not used directly, but via
+ cgraph/varpool node removal routines. */
+
+void
+symtab_unregister_node (symtab_node *node)
+{
+ void **slot;
+ ipa_remove_all_references (&node->ref_list);
+ ipa_remove_all_referring (&node->ref_list);
+
+ symtab_remove_from_same_comdat_group (node);
if (node->previous)
node->previous->next = node->next;
error ("non-DECL_ONE_ONLY node in a same_comdat_group list");
error_found = true;
}
+ if (DECL_COMDAT_GROUP (n->decl) != DECL_COMDAT_GROUP (node->same_comdat_group->decl))
+ {
+ error ("same_comdat_group list across different groups");
+ error_found = true;
+ }
+ if (!n->definition)
+ {
+ error ("Node has same_comdat_group but it is not a definition");
+ error_found = true;
+ }
if (n->type != node->type)
{
error ("mixing different types of symbol in same comdat groups is not supported");
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
+2014-07-10 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gnat.dg/opt39.adb: New test.
+
+2014-07-09 Edward Smith-Rowland <3dw4rd@verizon.net>
+
+ PR c++/58155 - -Wliteral-suffix warns about tokens which are skipped
+ g++.dg/cpp0x/pr58155.C: New.
+
+2014-07-09 Alan Lawrence <alan.lawrence@arm.com>
+
+ Backport r211369 from trunk.
+ 2014-06-09 Alan Lawrence <alan.lawrence@arm.com>
+
+ PR target/61062
+ * gcc.target/arm/pr48252.c (main): Expect same result as endian-neutral.
+
+2014-07-08 Jakub Jelinek <jakub@redhat.com>
+
+ PR rtl-optimization/61673
+ * gcc.c-torture/execute/pr61673.c: New test.
+
+2014-07-08 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/61680
+ * gcc.dg/vect/pr61680.c: New testcase.
+
+ PR tree-optimization/61681
+ * gcc.dg/torture/pr61681.c: New testcase.
+
+2014-07-08 Alan Lawrence <alan.lawrence@arm.com>
+
+ Backport r211502 from mainline.
+ 2014-06-10 Alan Lawrence <alan.lawrence@arm.com>
+
+ PR target/59843
+ * gcc.dg/vect/vect-singleton_1.c: New file.
+
+2014-07-08 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/61725
+ * gcc.dg/tree-ssa/vrp93.c: New test.
+ * gcc.c-torture/execute/pr61725.c: New test.
+
+2014-07-07 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/61459
+ PR fortran/58883
+ * gfortran.dg/allocatable_function_8.f90 : New test
+
+2014-07-07 Dominique d'Humieres <dominiq@lps.ens.fr>
+ Mikael Morin <mikael@gcc.gnu.org>
+
+ PR fortran/41936
+ * gfortran.dg/class_array_15.f03: Check memory leaks.
+
+2014-07-06 Jerry DeLisle <jvdelisle@gcc.gnu.org>
+
+ Backport from mainline.
+ PR libgfortran/61640
+ * gfortran.dg/arrayio_16.f90: New test.
+
+2014-07-04 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/61654
+ * g++.dg/opt/pr61654.C: New test.
+
+ PR tree-optimization/61684
+ * gcc.c-torture/compile/pr61684.c: New test.
+
+ PR c++/61382
+ Backport from mainline
+ 2014-06-05 Andreas Schwab <schwab@suse.de>
+
+ * g++.dg/cpp0x/initlist86.C (main): Initialize i.
+
+2014-07-02 Jakub Jelinek <jakub@redhat.com>
+ Fritz Reese <Reese-Fritz@zai.com>
+
+ * gfortran.dg/oldstyle_5.f: New test.
+
+2014-07-01 Paul Pluzhnikov <ppluzhnikov@google.com>
+
+ PR c++/58753
+ PR c++/58930
+ PR c++/58704
+
+ Backported from mainline
+ 2014-05-20 Paolo Carlini <paolo.carlini@oracle.com>
+
+ * g++.dg/cpp0x/nsdmi-template11.C: New.
+ * g++.dg/cpp0x/nsdmi-template12.C: Likewise.
+ * g++.dg/cpp0x/nsdmi-template13.C: Likewise.
+
+2014-06-28 Edward Smith-Rowland <3dw4rd@verizon.net>
+
+ PR c++/58781
+ PR c++/60249
+ PR c++/59867
+ * testsuite/g++.dg/cpp0x/pr58781.C: New.
+ * testsuite/g++.dg/cpp0x/pr60249.C: New.
+ * testsuite/g++.dg/cpp1y/pr59867.C: New.
+
+2014-06-30 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
+
+ * gfortran.dg/round_4.f90: Skip for powerpc*-*-linux* since the
+ test requires greater precision than the current PowerPC long
+ double implementation supports.
+
+2014-06-30 Jakub Jelinek <jakub@redhat.com>
+
+ Backported from mainline
+ 2014-06-27 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/57233
+ PR tree-optimization/61299
+ * gcc.dg/pr57233.c: New test.
+ * gcc.target/i386/pr57233.c: New test.
+ * gcc.target/i386/sse2-pr57233.c: New test.
+ * gcc.target/i386/avx-pr57233.c: New test.
+ * gcc.target/i386/avx2-pr57233.c: New test.
+ * gcc.target/i386/avx512f-pr57233.c: New test.
+ * gcc.target/i386/xop-pr57233.c: New test.
+
+ 2014-06-24 Jakub Jelinek <jakub@redhat.com>
+
+ * gfortran.dg/gomp/udr2.f90 (f7, f9): Add !$omp parallel with
+ reduction clause.
+ * gfortran.dg/gomp/udr4.f90 (f4): Likewise.
+ Remove Label is never defined expected error.
+ * gfortran.dg/gomp/udr8.f90: New test.
+
+ 2014-06-18 Jakub Jelinek <jakub@redhat.com>
+
+ * gfortran.dg/gomp/declare-simd-1.f90: New test.
+ * gfortran.dg/gomp/depend-1.f90: New test.
+ * gfortran.dg/gomp/target1.f90: New test.
+ * gfortran.dg/gomp/target2.f90: New test.
+ * gfortran.dg/gomp/target3.f90: New test.
+ * gfortran.dg/gomp/udr4.f90: Adjust expected diagnostics.
+ * gfortran.dg/openmp-define-3.f90: Expect _OPENMP 201307 instead of
+ 201107.
+
+ 2014-06-10 Jakub Jelinek <jakub@redhat.com>
+
+ PR fortran/60928
+ * gfortran.dg/gomp/allocatable_components_1.f90: Remove dg-error
+ directives.
+ * gfortran.dg/gomp/associate1.f90: New test.
+ * gfortran.dg/gomp/intentin1.f90: New test.
+ * gfortran.dg/gomp/openmp-simd-1.f90: New test.
+ * gfortran.dg/gomp/openmp-simd-2.f90: New test.
+ * gfortran.dg/gomp/openmp-simd-3.f90: New test.
+ * gfortran.dg/gomp/proc_ptr_2.f90: New test.
+
+ 2014-06-09 Jakub Jelinek <jakub@redhat.com>
+
+ * gfortran.dg/gomp/udr6.f90 (f1, f2, f3): Use complex(kind=8)
+ instead of complex(kind=16).
+
+ 2014-06-06 Jakub Jelinek <jakub@redhat.com>
+
+ * gfortran.dg/gomp/allocatable_components_1.f90: Adjust for
+ reduction clause diagnostic changes.
+ * gfortran.dg/gomp/appendix-a/a.31.3.f90: Likewise.
+ * gfortran.dg/gomp/reduction1.f90: Likewise.
+ * gfortran.dg/gomp/reduction3.f90: Likewise.
+ * gfortran.dg/gomp/udr1.f90: New test.
+ * gfortran.dg/gomp/udr2.f90: New test.
+ * gfortran.dg/gomp/udr3.f90: New test.
+ * gfortran.dg/gomp/udr4.f90: New test.
+ * gfortran.dg/gomp/udr5.f90: New test.
+ * gfortran.dg/gomp/udr6.f90: New test.
+ * gfortran.dg/gomp/udr7.f90: New test.
+
+ 2014-05-12 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/60127
+ * gfortran.dg/gomp/omp_do_concurrent.f90: New.
+
+ 2014-05-11 Jakub Jelinek <jakub@redhat.com>
+
+ * gfortran.dg/gomp/affinity-1.f90: New test.
+
+2014-06-30 Sebastian Huber <sebastian.huber@embedded-brains.de>
+
+ * gcc.dg/typeof-2.c: New testcase.
+
+2014-06-30 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
+
+ * gcc.target/aarch64/vqdmulhh_lane_s16.c: New test.
+ * gcc.target/aarch64/vqdmulhs_lane_s32.c: Likewise.
+ * gcc.target/aarch64/vqrdmulhh_lane_s16.c: Likewise.
+ * gcc.target/aarch64/vqrdmulhs_lane_s32.c: Likewise.
+ * gcc.target/aarch64/vqdmlal_high_lane_s16.c: New test.
+ * gcc.target/aarch64/vqdmlal_high_lane_s32.c: Likewise.
+ * gcc.target/aarch64/vqdmlal_high_laneq_s16.c: Likewise.
+ * gcc.target/aarch64/vqdmlal_high_laneq_s32.c: Likewise.
+ * gcc.target/aarch64/vqdmlal_lane_s16.c: Likewise.
+ * gcc.target/aarch64/vqdmlal_lane_s32.c: Likewise.
+ * gcc.target/aarch64/vqdmlal_laneq_s16.c: Likewise.
+ * gcc.target/aarch64/vqdmlal_laneq_s32.c: Likewise.
+ * gcc.target/aarch64/vqdmlalh_lane_s16.c: Likewise.
+ * gcc.target/aarch64/vqdmlals_lane_s32.c: Likewise.
+ * gcc.target/aarch64/vqdmlsl_high_lane_s16.c: Likewise.
+ * gcc.target/aarch64/vqdmlsl_high_lane_s32.c: Likewise.
+ * gcc.target/aarch64/vqdmlsl_high_laneq_s16.c: Likewise.
+ * gcc.target/aarch64/vqdmlsl_high_laneq_s32.c: Likewise.
+ * gcc.target/aarch64/vqdmlsl_lane_s16.c: Likewise.
+ * gcc.target/aarch64/vqdmlsl_lane_s32.c: Likewise.
+ * gcc.target/aarch64/vqdmlsl_laneq_s32.c: Likewise.
+ * gcc.target/aarch64/vqdmlslh_lane_s16.c: Likewise.
+ * gcc.target/aarch64/vqdmlsls_lane_s32.c: Likewise.
+ * gcc.target/aarch64/vqdmulh_laneq_s16.c: Likewise.
+ * gcc.target/aarch64/vqdmulh_laneq_s32.c: Likewise.
+ * gcc.target/aarch64/vqdmulhq_laneq_s16.c: Likewise.
+ * gcc.target/aarch64/vqdmulhq_laneq_s32.c: Likewise.
+ * gcc.target/aarch64/vqdmull_high_lane_s16.c: Likewise.
+ * gcc.target/aarch64/vqdmull_high_lane_s32.c: Likewise.
+ * gcc.target/aarch64/vqdmull_high_laneq_s16.c: Likewise.
+ * gcc.target/aarch64/vqdmull_high_laneq_s32.c: Likewise.
+ * gcc.target/aarch64/vqdmull_lane_s16.c: Likewise.
+ * gcc.target/aarch64/vqdmull_lane_s32.c: Likewise.
+ * gcc.target/aarch64/vqdmull_laneq_s16.c: Likewise.
+ * gcc.target/aarch64/vqdmull_laneq_s32.c: Likewise.
+ * gcc.target/aarch64/vqdmullh_lane_s16.c: Likewise.
+ * gcc.target/aarch64/vqdmulls_lane_s32.c: Likewise.
+ * gcc.target/aarch64/vqrdmulh_laneq_s16.c: Likewise.
+ * gcc.target/aarch64/vqrdmulh_laneq_s32.c: Likewise.
+ * gcc.target/aarch64/vqrdmulhq_laneq_s16.c: Likewise.
+ * gcc.target/aarch64/vqrdmulhq_laneq_s32.c: Likewise.
+ * gcc.target/aarch64/vector_intrinsics.c: Simplify arm_neon.h include.
+ (test_vqdmlal_high_lane_s16): Fix parameter type.
+ (test_vqdmlal_high_lane_s32): Likewise.
+ (test_vqdmull_high_lane_s16): Likewise.
+ (test_vqdmull_high_lane_s32): Likewise.
+ (test_vqdmlsl_high_lane_s32): Likewise.
+ (test_vqdmlsl_high_lane_s16): Likewise.
+ * gcc.target/aarch64/scalar_intrinsics.c (test_vqdmlalh_lane_s16):
+ Fix argument type.
+ (test_vqdmlals_lane_s32): Likewise.
+ (test_vqdmlslh_lane_s16): Likewise.
+ (test_vqdmlsls_lane_s32): Likewise.
+ (test_vqdmulhh_lane_s16): Likewise.
+ (test_vqdmulhs_lane_s32): Likewise.
+ (test_vqdmullh_lane_s16): Likewise.
+ (test_vqdmulls_lane_s32): Likewise.
+ (test_vqrdmulhh_lane_s16): Likewise.
+ (test_vqrdmulhs_lane_s32): Likewise.
+
+2014-06-30 Igor Zamyatin <igor.zamyatin@intel.com>
+
+ PR middle-end/57541
+ * c-c++-common/cilk-plus/AN/pr57541.c: New case added.
+ * c-c++-common/cilk-plus/AN/pr57541-2.c: New test.
+
+2014-06-30 Thomas Preud'homme <thomas.preudhomme@arm.com>
+
+ Backport from mainline
+ 2014-06-11 Thomas Preud'homme <thomas.preudhomme@arm.com>
+
+ PR tree-optimization/61306
+ * gcc.c-torture/execute/pr61306-1.c: New test.
+ * gcc.c-torture/execute/pr61306-2.c: Likewise.
+ * gcc.c-torture/execute/pr61306-3.c: Likewise.
+
+2014-06-27 Jerry DeLisle <jvdelisle@gcc.gnu.org>
+
+ Backport from mainline.
+ PR libgfortran/61499
+ * gfortran.dg/arrayio_15.f90: New test.
+
+2014-06-27 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
+
+ * gfortran.dg/nint_2.f90: Don't XFAIL for powerpc64le-*-linux*.
+
+2014-06-27 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/61614
+ * g++.dg/ext/complit14.C: New.
+
+2014-06-27 Martin Jambor <mjambor@suse.cz>
+
+ PR ipa/61160
+ * g++.dg/ipa/pr61160-2.C: New test.
+ * g++.dg/ipa/pr61160-3.C: Likewise.
+
+2014-06-27 Uros Bizjak <ubizjak@gmail.com>
+
+ Backport from mainline
+ 2014-06-26 Uros Bizjak <ubizjak@gmail.com>
+
+ PR target/61586
+ * gcc.target/alpha/pr61586.c: New test.
+
+2014-06-26 Adam Butcher <adam@jessamine.co.uk>
+
+ PR c++/61537
+ * g++.dg/template/pr61537.C: New testcase.
+
+2014-06-26 Martin Jambor <mjambor@suse.cz>
+
+ * g++.dg/ipa/pr60600.C: Fix typo.
+ * g++.dg/ipa/devirt-25.C: Likewise.
+ * g++.dg/ipa/pr61540.C: Likewise.
+
+2014-06-26 Martin Jambor <mjambor@suse.cz>
+
+ * g++.dg/ipa/pr61540.C: Remove dumping test.
+
+2014-06-25 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
+
+ * gfortran.dg/default_format_denormal_2.f90: Remove xfail for
+ powerpc*-*-linux*.
+
+2014-06-23 Alan Modra <amodra@gmail.com>
+
+ * gcc.dg/pr61583.c: New.
+
+2014-06-20 Martin Jambor <mjambor@suse.cz>
+
+ PR ipa/61540
+ * g++.dg/ipa/pr61540.C: New test.
+
+2014-06-17 Yufeng Zhang <yufeng.zhang@arm.com>
+
+ PR target/61483
+ * gcc.target/aarch64/aapcs64/type-def.h (struct hfa_fx2_t): New type.
+ * gcc.target/aarch64/aapcs64/va_arg-13.c: New test.
+ * gcc.target/aarch64/aapcs64/va_arg-14.c: Ditto.
+ * gcc.target/aarch64/aapcs64/va_arg-15.c: Ditto.
+
+2014-06-17 Richard Biener <rguenther@suse.de>
+
+ PR lto/61012
+ * gcc.dg/lto/pr61526_0.c: New testcase.
+ * gcc.dg/lto/pr61526_1.c: Likewise.
+
+2014-06-17 Uros Bizjak <ubizjak@gmail.com>
+
+ Backport from mainline
+ 2014-06-06 Uros Bizjak <ubizjak@gmail.com>
+
+ PR target/61423
+ * gcc.target/i386/pr61423.c: New test.
+
+2014-06-15 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
+
+ Backport from trunk.
+ PR fortran/45187
+ * gfortran.dg/cray_pointers_10.f90: New file.
+
+2014-06-13 Peter Bergner <bergner@vnet.ibm.com>
+
+ Backport from mainline
+
+ 2014-06-13 Peter Bergner <bergner@vnet.ibm.com>
+ PR target/61415
+ * lib/target-supports.exp (check_effective_target_longdouble128): New.
+ * gcc.target/powerpc/pack02.c: Use it.
+ * gcc.target/powerpc/tfmode_off.c: Likewise.
+
+2014-06-13 Jeff Law <law@redhat.com>
+
+ Backports from mainline:
+
+ 2014-06-13 Ilya Enkovich <ilya.enkovich@intel.com>
+
+ PR rtl-optimization/61094
+ PR rtl-optimization/61446
+ * gcc.target/i386/pr61446.c : New.
+
+ 2014-06-02 Jeff Law <law@redhat.com>
+
+ PR rtl-optimization/61094
+ * g++.dg/pr61094: New test.
+
+2014-06-12 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/61486
+ * c-c++-common/gomp/pr61486-1.c: New test.
+ * c-c++-common/gomp/pr61486-2.c: New test.
+
+2014-06-12 Jeff Law <law@redhat.com>
+
+ Backports from mainline:
+ 2014-06-05 Jeff Law <law@redhat.com>
+
+ PR tree-optimization/61289
+ * g++.dg/pr61289.C: New test.
+ * g++.dg/pr61289-2.C: New test.
+
+2014-06-12 Georg-Johann Lay <avr@gjlay.de>
+
+ Backport from 2014-06-12 trunk r211491
+
+ PR target/61443
+ * gcc.target/avr/torture/pr61443.c: New test.
+
+2014-06-11 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/61452
+ * gcc.dg/torture/pr61452.c: New testcase.
+
+2014-06-11 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/61456
+ * g++.dg/opt/pr61456.C: New testcase.
+
+2014-06-09 Paul Thomas <pault@gcc.gnu.org>
+
+ Backport from trunk.
+ PR fortran/61406
+ * gfortran.dg/associate_17.f90 : New test
+
+2014-06-07 Jerry DeLisle <jvdelisle@gcc.gnu>
+
+ Backport from trunk.
+ PR libfortran/61173
+ * gfortran.dg/arrayio_14.f90: New test.
+
+2014-06-07 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gnat.dg/opt38.adb: New test.
+ * gnat.dg/opt38_pkg.ad[sb]: New helper.
+
+2014-06-04 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/61383
+ * gcc.dg/torture/pr61383-1.c: New testcase.
+
+2014-06-04 Igor Zamyatin <igor.zamyatin@intel.com>
+
+ PR c/58942
+ * c-c++-common/cilk-plus/AN/pr58942.c: Check for correct handling of
+ the case with a pointer.
+
+2014-06-04 Marek Polacek <polacek@redhat.com>
+
+ Backport from mainline
+ 2014-05-08 Marek Polacek <polacek@redhat.com>
+
+ PR c/61053
+ * gcc.dg/pr61053.c: New test.
+
+2014-06-03 Martin Jambor <mjambor@suse.cz>
+
+ PR ipa/61160
+ * g++.dg/ipa/pr61160-1.C: New test.
+
+2014-06-03 Andrey Belevantsev <abel@ispras.ru>
+
+ Backport from mainline
+ 2014-05-14 Andrey Belevantsev <abel@ispras.ru>
+
+ PR rtl-optimization/60866
+ * gcc.dg/pr60866.c: New test.
+
+2014-06-03 Andrey Belevantsev <abel@ispras.ru>
+
+ Backport from mainline
+ 2014-05-14 Andrey Belevantsev <abel@ispras.ru>
+
+ PR rtl-optimization/60901
+ * gcc.target/i386/pr60901.c: New test.
+
+2014-06-01 Uros Bizjak <ubizjak@gmail.com>
+
+ * g++.dg/pr60969.C (dg-do compile): Change ilp32 target to ia32.
+
+2014-05-29 Vladimir Makarov <vmakarov@redhat.com>
+
+ PR rtl-optimization/61325
+ * gcc.target/aarch64/pr61325.c: New.
+
+2014-05-29 Thomas Koenig <tkoenig@gcc.gnu.org>
+
+ PR fortran/60834
+ Backport from mainline
+ * gfortran.dg/associate_16.f90: New test.
+
+2014-05-28 Eric Botcazou <ebotcazou@adacore.com>
+
+ Backport from mainline
+ 2014-05-27 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gnat.dg/overflow_fixed.adb: New test.
+
+2014-05-28 Richard Biener <rguenther@suse.de>
+
+ Backport from mainline
+ 2014-05-28 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/61045
+ * gcc.dg/pr61045.c: New testcase.
+
+ 2014-05-05 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/61010
+ * gcc.dg/torture/pr61010.c: New testcase.
+
+ 2014-04-28 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/60979
+ * gcc.dg/graphite/pr60979.c: New testcase.
+
+2014-05-28 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+
+ * lib/clearcap.exp: New file.
+ * gcc.dg/vect/vect.exp: Load clearcap.exp.
+ Remove clearcap_ldflags handling.
+ Call clearcap-init, clearcap-finish.
+ * gcc.target/i386/i386.exp: Likewise.
+ * gcc.target/i386/clearcap.map: Move to ../config/sol2-clearcap.map.
+ * gcc.target/i386/clearcapv2.map: Move to
+ ../config/sol2-clearcapv2.map.
+ * gcc.target/x86_64/abi/avx/abi-avx.exp: Likewise.
+ * gcc.target/x86_64/abi/avx512f/abi-avx512f.exp: Likewise.
+
+2014-05-27 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gnat.dg/aliasing1.adb (dg-final): Robustify pattern matching.
+
+2014-05-26 Uros Bizjak <ubizjak@gmail.com>
+
+ * c-c++-common/cilk-plus/AN/pr61191.c: Fix dg-error directives.
+
+2014-05-26 Igor Zamyatin <igor.zamyatin@intel.com>
+
+ PR c/61191
+ * c-c++-common/cilk-plus/AN/pr61191.c: Check for correct handling of
+ the case with syntax error.
+
+2014-05-22 Peter Bergner <bergner@vnet.ibm.com>
+
+ * gcc.target/powerpc/htm-ttest.c: New test.
+
+2014-05-21 Igor Zamyatin <igor.zamyatin@intel.com>
+
+ PR c++/60189
+ * c-c++-common/cilk-plus/CK/invalid_sync.cc: New test.
+
+2014-05-18 Jan Hubicka <hubicka@ucw.cz>
+
+ PR middle-end/58094
+ * g++.dg/ipa/devirt-11.C: Be lax about number of devirtualizations.
+
+2014-05-18 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gnat.dg/enum3.adb: New test.
+
+2014-04-16 Jan Hubicka <hubicka@ucw.cz>
+
+ PR ipa/60854
+ * g++.dg/torture/pr60854.C: New testcase.
+
+2014-05-17 Uros Bizjak <ubizjak@gmail.com>
+
+ * g++.dg/pr60969.C: Compile for all ilp32 x86 targets.
+ (dg-options): Add -mfpmath=387.
+ (dg-final): Check that no MMX registers are used.
+
+2014-05-16 Vladimir Makarov <vmakarov@redhat.com>
+
+ PR rtl-optimization/60969
+ * g++.dg/pr60969.C: New.
+
+2014-05-15 Martin Jambor <mjambor@suse.cz>
+
+ PR ipa/61085
+ * g++.dg/ipa/pr61085.C: New test.
+
+2014-05-15 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/61158
+ * gcc.dg/pr61158.c: New test.
+
+2014-05-14 Matthias Klose <doko@ubuntu.com>
+
+ PR driver/61106
+ * gcc-dg/unused-8a.c: Remove.
+
+2014-05-13 Peter Bergner <bergner@vnet.ibm.com>
+
+ * lib/target-support.exp (check_dfp_hw_available): New function.
+ (is-effective-target): Check $arg for dfp_hw.
+ (is-effective-target-keyword): Likewise.
+ * gcc.target/powerpc/pack03.c: (dg-require-effective-target):
+ Change target to dfp_hw.
+
+2014-05-13 Jeff Law <law@redhat.com>
+
+ Backports from mainline
+
+ 2014-05-08 Jeff Law <law@redhat.com>
+
+ PR tree-optimization/61009
+ * g++.dg/tree-ssa/pr61009.C: New test.
+
+ 2014-04-23 Jeff Law <law@redhat.com>
+
+ PR tree-optimization/60902
+ * gcc.target/i386/pr60902.c: New test.
+
+2014-05-13 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/61060
+ * gcc.dg/pr61060.c: New test.
+
+2014-05-12 Senthil Kumar Selvaraj <senthil_kumar.selvaraj@atmel.com>
+
+ Backport from mainline
+ 2014-05-12 Senthil Kumar Selvaraj <senthil_kumar.selvaraj@atmel.com>
+
+ PR target/60991
+ * gcc.target/avr/pr60991.c: New testcase.
+
+2014-05-10 Jerry DeLisle <jvdelisle@gcc.gnu>
+
+ Backport from trunk.
+ PR libfortran/61049
+ * gfortran.dg/list_read_13.f: New test.
+
+2014-05-09 Georg-Johann Lay <avr@gjlay.de>
+
+ Backport from 2014-05-09 trunk r210267
+
+ PR target/61055
+ * gcc.target/avr/torture/pr61055.c: New test.
+
+2014-05-08 Matthias Klose <doko@ubuntu.com>
+
+ PR driver/61106
+ * gcc-dg/unused-8a.c: New.
+ * gcc-dg/unused-8b.c: Likewise.
+
+2014-05-07 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/61083
+ * g++.dg/cpp0x/sfinae50.C: New.
+
+2014-05-07 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/57864
+ * gcc.dg/torture/pr57864.c: New testcase.
+
+2014-05-06 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/60999
+ * g++.dg/cpp0x/nsdmi-template9.C: New.
+ * g++.dg/cpp0x/nsdmi-template10.C: Likewise.
+
+2014-05-04 Jan Hubicka <hubicka@ucw.cz>
+
+ PR ipa/60965
+ * g++.dg/ipa/devirt-31.C: New testcase.
+ * g++.dg/ipa/devirt-11.C: Adjust testcase.
+
+2014-05-04 Peter Bergner <bergner@vnet.ibm.com>
+
+ * gcc.target/powerpc/pack02.c (dg-options): Add -mhard-float.
+ (dg-require-effective-target): Change target to powerpc_fprs.
+ * gcc.target/powerpc/pack03.c (dg-options): Add -mhard-dfp.
+ (dg-require-effective-target): Change target to dfprt.
+
+2014-05-02 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
+
+ PR tree-optimization/60930
+ * gcc.dg/torture/pr60930.c: New test.
+
+2014-04-30 Michael Meissner <meissner@linux.vnet.ibm.com>
+
+ Back port from mainline
+ 2014-04-24 Michael Meissner <meissner@linux.vnet.ibm.com>
+
+ * gcc.target/powerpc/pack01.c: New test to test the new pack and
+ unpack builtin functionss for 128-bit types.
+ * gcc.target/powerpc/pack02.c: Likewise.
+ * gcc.target/powerpc/pack03.c: Likewise.
+ * gcc.target/powerpc/extend-divide-1.c: New test to test extended
+ divide builtin functionss.
+ * gcc.target/powerpc/extend-divide-2.c: Likewise.
+ * gcc.target/powerpc/bcd-1.c: New test for the new BCD builtin
+ functions.
+ * gcc.target/powerpc/bcd-2.c: Likewise.
+ * gcc.target/powerpc/bcd-3.c: Likewise.
+ * gcc.target/powerpc/dfp-builtin-1.c: New test for the new DFP
+ builtin functionss.
+ * gcc.target/powerpc/dfp-builtin-2.c: Likewise.
+
+2014-04-29 Pat Haugen <pthaugen@us.ibm.com>
+
+ Backport from mainline
+ 2014-04-17 Pat Haugen <pthaugen@us.ibm.com>
+
+ * gcc.target/powerpc/ti_math1.c: New.
+ * gcc.target/powerpc/ti_math2.c: New.
+
+2014-04-29 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/60971
+ * c-c++-common/turtore/pr60971.c: New test.
+
+2014-04-26 Uros Bizjak <ubizjak@gmail.com>
+
+ * gcc.dg/tree-ssa/alias-30.c (dg-options): Dump only fre1 details.
+ * gcc.dg/vect/pr60505.c: Cleanup vect tree dump.
+ * g++.dg/ipa/devirt-27.C (dg-options): Remove -fdump-ipa-devirt.
+
+2014-04-25 Uros Bizjak <ubizjak@gmail.com>
+
+ * c-c++-common/gomp/pr60823-2.c: Require effective target
+ vect_simd_clones.
+
+2014-04-25 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/60960
+ * gcc.c-torture/execute/pr60960.c: New test.
+
+2014-04-25 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gcc.c-torture/execute/20140425-1.c: New test.
+
+2014-04-25 Richard Biener <rguenther@suse.de>
+
+ PR ipa/60912
+ * g++.dg/opt/pr60912.C: New testcase.
+
+2014-04-25 Richard Biener <rguenther@suse.de>
+
+ PR ipa/60911
+ * gcc.dg/lto/pr60911_0.c: New testcase.
+
+2014-04-24 Jakub Jelinek <jakub@redhat.com>
+
+ * c-c++-common/gomp/atomic-16.c: Remove all dg-error directives.
+ Replace load with read and store with write.
+
+2014-04-23 Uros Bizjak <ubizjak@gmail.com>
+
+ Backport from mainline
+ 2014-04-21 Uros Bizjak <ubizjak@gmail.com>
+
+ PR target/60909
+ * gcc.target/i386/pr60909-1.c: New test.
+ * gcc.target/i386/pr60909-2.c: Ditto.
+
+2014-04-23 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/60903
+ * gcc.dg/torture/pr60903.c: New testcase.
+
+2014-04-23 Richard Biener <rguenther@suse.de>
+
+ Backport from mainline
+ 2014-04-14 Richard Biener <rguenther@suse.de>
+
+ PR lto/60720
+ * gcc.dg/lto/pr60720_0.c: New testcase.
+ * gcc.dg/lto/pr60720_1.c: Likewise.
+
+2014-04-23 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/60895
+ * g++.dg/torture/pr60895.C: New testcase.
+
+2014-04-23 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/60891
+ * gcc.dg/torture/pr60891.c: New testcase.
+
+2014-04-22 Michael Meissner <meissner@linux.vnet.ibm.com>
+
+ Backport from mainline
+ 2014-04-21 Michael Meissner <meissner@linux.vnet.ibm.com>
+
+ PR target/60735
+ * gcc.target/powerpc/pr60735.c: New test. Insure _Decimal64 does
+ not cause errors if -mspe.
+
+2014-04-22 Tobias Burnus <burnus@net-b.de>
+
+ Backport from mainline
+ 2014-04-11 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/58880
+ PR fortran/60495
+ * gfortran.dg/finalize_25.f90: New.
+
+2014-04-22 H.J. Lu <hongjiu.lu@intel.com>
+
+ Backport from mainline
+ 2014-04-22 H.J. Lu <hongjiu.lu@intel.com>
+
+ * gcc.target/i386/pr60868.c: New testcase.
+
+2014-04-22 Jakub Jelinek <jakub@redhat.com>
+
+ PR c/59073
+ * c-c++-common/gomp/pr59073.c: New test.
+
+2014-04-22 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
+
+ * gcc.dg/vmx/merge-vsx.c: Add V4SI and V4SF tests.
+ * gcc.dg/vmx/merge-vsx-be-order.c: Likewise.
+
+2014-04-22 Richard Biener <rguenther@suse.de>
+
+ Backport from mainline
+ 2014-04-14 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/55022
+ * gcc.dg/graphite/pr55022.c: New testcase.
+
+2014-04-22 Richard Biener <rguenther@suse.de>
+
+ Backport from mainline
+ 2014-04-17 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/60849
+ * g++.dg/opt/pr60849.C: New testcase.
+
+2014-04-22 Richard Biener <rguenther@suse.de>
+
+ Backport from mainline
+ 2014-04-17 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/60841
+ * gcc.dg/vect/pr60841.c: New testcase.
+
+2014-04-22 Richard Biener <rguenther@suse.de>
+
+ Backport from mainline
+ 2014-04-17 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/60836
+ * g++.dg/vect/pr60836.cc: New testcase.
+
+2014-04-22 Richard Biener <rguenther@suse.de>
+
+ Backport from mainline
+ 2014-04-14 Richard Biener <rguenther@suse.de>
+ Marc Glisse <marc.glisse@inria.fr>
+
+ PR c/60819
+ * gcc.target/i386/vec-may_alias.c: New testcase.
+
+2014-04-22 Richard Biener <rguenther@suse.de>
+
+ Backport from mainline
+ 2014-04-14 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/59817
+ PR tree-optimization/60453
+ * gfortran.dg/graphite/pr59817.f: New testcase.
+ * gcc.dg/graphite/pr59817-1.c: Likewise.
+ * gcc.dg/graphite/pr59817-2.c: Likewise.
+
+2014-04-22 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/60823
+ * c-c++-common/gomp/pr60823-1.c: New test.
+ * c-c++-common/gomp/pr60823-2.c: New test.
+ * c-c++-common/gomp/pr60823-3.c: New test.
+
+ Backported from mainline
+ 2014-04-16 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/60844
+ * gcc.dg/pr60844.c: New test.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
2014-04-12 Jerry DeLisle <jvdelisle@gcc.gnu>
PR libfortran/60810
- gfortran.dg/arrayio_13.f90: New test.
+ * gfortran.dg/arrayio_13.f90: New test.
2014-04-11 Steve Ellcey <sellcey@mips.com>
Jakub Jelinek <jakub@redhat.com>
2014-04-08 Jason Merrill <jason@redhat.com>
- * lib/gcc-dg.exp (dg-build-dso): Reset dg-do-what-default to
- compile.
+ * lib/gcc-dg.exp (dg-build-dso): Reset dg-do-what-default to compile.
2014-04-08 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
2014-04-04 Martin Jambor <mjambor@suse.cz>
PR ipa/60640
- * g++.dg/ipa/pr60640-1.C: New test.
- * g++.dg/ipa/pr60640-2.C: Likewise.
- * g++.dg/ipa/pr60640-3.C: Likewise.
- * g++.dg/ipa/pr60640-4.C: Likewise.
+ * g++.dg/ipa/pr60640-1.C: New test.
+ * g++.dg/ipa/pr60640-2.C: Likewise.
+ * g++.dg/ipa/pr60640-3.C: Likewise.
+ * g++.dg/ipa/pr60640-4.C: Likewise.
2014-04-04 Jeff Law <law@redhat.com>
2014-04-01 Fabien Chêne <fabien@gcc.gnu.org>
- * g++.dg/init/ctor4.C: Adjust.
+ * g++.dg/init/ctor4.C: Adjust.
* g++.dg/init/ctor4-1.C: New.
* g++.dg/cpp0x/defaulted2.C: Adjust.
2014-03-27 Jeff Law <law@redhat.com>
- PR target/60648
- * g++.dg/pr60648.C: New test.
+ PR target/60648
+ * g++.dg/pr60648.C: New test.
2014-03-28 Adam Butcher <adam@jessamine.co.uk>
2014-03-28 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
- * gcc.dg/tree-ssa/ssa-dom-thread-4.c: Remove s390 special
- option.
+ * gcc.dg/tree-ssa/ssa-dom-thread-4.c: Remove s390 special option.
* lib/target-supports.exp: Return true for s390
- in check_effective_logical_op_short_circuit.
+ in check_effective_logical_op_short_circuit.
2014-03-28 Kirill Yukhin <kirill.yukhin@intel.com>
- * gcc.target/i386/avx512f-vshuff32x4-2.c: Fix initialization
+ * gcc.target/i386/avx512f-vshuff32x4-2.c: Fix initialization
of second source operand.
* gcc.target/i386/avx512f-vshuff64x2-2.c: Ditto.
* gcc.target/i386/avx512f-vshufi32x4-2.c: Ditto.
2014-03-24 Marek Polacek <polacek@redhat.com>
- * c-c++-common/ubsan/div-by-zero-4.c: Don't include limits.h. Define
- INT_MIN.
+ * c-c++-common/ubsan/div-by-zero-4.c: Don't include limits.h.
+ Define INT_MIN.
* c-c++-common/ubsan/overflow-1.c: Check for unwanted output.
* c-c++-common/ubsan/overflow-add-1.c: Likewise.
* c-c++-common/ubsan/overflow-mul-1.c: Likewise.
2014-03-21 Tobias Burnus <burnus@net-b.de>
PR fortran/60599
- * lib/gcc-dg.exp (scan-module): Uncompress .mod files for
- reading.
+ * lib/gcc-dg.exp (scan-module): Uncompress .mod files for reading.
2014-03-20 Jakub Jelinek <jakub@redhat.com>
2014-02-19 Paul Pluzhnikov <ppluzhnikov@google.com>
- * gcc.dg/vect/no-vfa-vect-depend-2.c (main1): Fix buffer
- overflow.
+ * gcc.dg/vect/no-vfa-vect-depend-2.c (main1): Fix buffer overflow.
2014-02-19 Jakub Jelinek <jakub@redhat.com>
2014-02-10 Jakub Jelinek <jakub@redhat.com>
- * gcc.dg/vect/pr59984.c: Require effective target
- vect_simd_clones.
+ * gcc.dg/vect/pr59984.c: Require effective target vect_simd_clones.
2014-02-09 Paul Thomas <pault@gcc.gnu.org>
* gfortran.dg/vect/fast-math-mgrid-resid.f: Change
-fdump-tree-optimized to -fdump-tree-pcom-details in dg-options and
cleanup-tree-dump from optimized to pcom. Remove scan-tree-dump-times
- for vect_\[^\\n\]*\\+, add scan-tree-dump-times for no suitable chains and
- Executing predictive commoning without unrolling.
+ for vect_\[^\\n\]*\\+, add scan-tree-dump-times for no suitable
+ chains and Executing predictive commoning without unrolling.
2014-01-14 Kirill Yukhin <kirill.yukhin@intel.com>
--- /dev/null
+/* PR middle-end/57541 */
+/* { dg-do compile } */
+/* { dg-options "-fcilkplus" } */
+
+int foo1 ()
+{
+ int a;
+ a = __sec_reduce_add (1); /* { dg-error "Invalid builtin arguments" } */
+}
+
+int foo2 ()
+{
+ int a;
+ a = __sec_reduce_add (); /* { dg-error "Invalid builtin arguments" } */
+}
+/* PR middle-end/57541 */
/* { dg-do compile } */
/* { dg-options "-fcilkplus" } */
int A[10];
-int main () {
+int foo () {
/* C compiler uses the term "undeclared" whereas C++ compiler uses
"not declared". Thus, grepping for declared seem to be the easiest. */
A[l:s:c];
}
-/* { dg-message "note: each" "defined" { target c } 10 } */
+int foo1 (int N) {
+
+ char c = (char)N;
+ short s = (short)N;
+ A[l:s:c]; /* { dg-error "declared" } */
+}
+
+
+/* { dg-message "note: each" "defined" { target c } 11 } */
--- /dev/null
+/* PR c/58942 */
+/* { dg-do compile } */
+/* { dg-options "-fcilkplus" } */
+
+int foo (int*p, int i)
+{
+ return __sec_reduce_max_ind(p[1:i]);
+}
--- /dev/null
+/* PR c/61191 */
+/* { dg-do compile } */
+/* { dg-options "-fcilkplus" } */
+
+double f(double * A, double * B)
+{
+ return __sec_reduce_add((B[0:500])(; /* { dg-error "called object" "" { target c } } */
+/* { dg-error "expected expression before ';' token" "" { target c } 7 } */
+/* { dg-error "expected primary-expression before ';' token" "" { target c++ } 7 } */
+} /* { dg-error "expected" "" { target c } } */
--- /dev/null
+/* PR c/60189 */
+/* { dg-do compile } */
+/* { dg-options "-fcilkplus" } */
+
+int main (void)
+{
+ _Cilk_sync return; /* { dg-error " expected ';' before 'return'" } */
+ return 0;
+}
foo ()
{
int v;
- #pragma omp atomic seq_cst load /* { dg-error "expected end of line" } */
- v = x; /* { dg-error "invalid form" } */
- #pragma omp atomic seq_cst, load /* { dg-error "expected end of line" } */
- v = x; /* { dg-error "invalid form" } */
- #pragma omp atomic seq_cst store /* { dg-error "expected end of line" } */
- x = v; /* { dg-error "invalid form" } */
- #pragma omp atomic seq_cst ,store /* { dg-error "expected end of line" } */
- x = v; /* { dg-error "invalid form" } */
- #pragma omp atomic seq_cst update /* { dg-error "expected end of line" } */
+ #pragma omp atomic seq_cst read
+ v = x;
+ #pragma omp atomic seq_cst, read
+ v = x;
+ #pragma omp atomic seq_cst write
+ x = v;
+ #pragma omp atomic seq_cst ,write
+ x = v;
+ #pragma omp atomic seq_cst update
x += v;
- #pragma omp atomic seq_cst , update /* { dg-error "expected end of line" } */
+ #pragma omp atomic seq_cst , update
x += v;
- #pragma omp atomic seq_cst capture /* { dg-error "expected end of line" } */
- v = x += 2; /* { dg-error "invalid form" } */
- #pragma omp atomic seq_cst, capture /* { dg-error "expected end of line" } */
- v = x += 2; /* { dg-error "invalid form" } */
- #pragma omp atomic load , seq_cst /* { dg-error "expected end of line" } */
- v = x; /* { dg-error "invalid form" } */
- #pragma omp atomic store ,seq_cst /* { dg-error "expected end of line" } */
- x = v; /* { dg-error "invalid form" } */
- #pragma omp atomic update, seq_cst /* { dg-error "expected end of line" } */
+ #pragma omp atomic seq_cst capture
+ v = x += 2;
+ #pragma omp atomic seq_cst, capture
+ v = x += 2;
+ #pragma omp atomic read , seq_cst
+ v = x;
+ #pragma omp atomic write ,seq_cst
+ x = v;
+ #pragma omp atomic update, seq_cst
x += v;
- #pragma omp atomic capture, seq_cst /* { dg-error "expected end of line" } */
+ #pragma omp atomic capture, seq_cst
v = x += 2;
}
--- /dev/null
+/* PR c/59073 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp" } */
+
+void
+foo ()
+{
+ int i;
+#pragma omp distribute parallel for
+ for (i = 0; i < 10; i) /* { dg-error "invalid increment expression" } */
+ ;
+}
--- /dev/null
+/* PR tree-optimization/60823 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fopenmp-simd" } */
+
+#pragma omp declare simd simdlen(4) notinbranch
+int
+foo (const double c1, const double c2)
+{
+ double z1 = c1, z2 = c2;
+ int res = 100, i;
+
+ for (i = 0; i < 100; i++)
+ {
+ res = (z1 * z1 + z2 * z2 > 4.0) ? (i < res ? i : res) : res;
+ z1 = c1 + z1 * z1 - z2 * z2;
+ z2 = c2 + 2.0 * z1 * z2;
+ }
+ return res;
+}
--- /dev/null
+/* PR tree-optimization/60823 */
+/* { dg-do run } */
+/* { dg-require-effective-target vect_simd_clones } */
+/* { dg-options "-O2 -fopenmp-simd" } */
+
+#pragma omp declare simd simdlen(4) notinbranch
+__attribute__((noinline)) int
+foo (double c1, double c2)
+{
+ double z1 = c1, z2 = c2;
+ int res = 100, i;
+
+ for (i = 0; i < 5; i++)
+ {
+ res = (z1 * z1 + z2 * z2 > 4.0) ? (i < res ? i : res) : res;
+ z1 = c1 + z1 * z1 - z2 * z2;
+ z2 = c2 + 2.0 * z1 * z2;
+ c1 += 0.5;
+ c2 += 0.5;
+ }
+ return res;
+}
+
+__attribute__((noinline, noclone)) void
+bar (double *x, double *y)
+{
+ asm volatile ("" : : "rm" (x), "rm" (y) : "memory");
+}
+
+int
+main ()
+{
+ int i;
+ double c[4] = { 0.0, 1.0, 0.0, 1.0 };
+ double d[4] = { 0.0, 1.0, 2.0, 0.0 };
+ int e[4];
+ bar (c, d);
+#pragma omp simd safelen(4)
+ for (i = 0; i < 4; i++)
+ e[i] = foo (c[i], d[i]);
+ if (e[0] != 3 || e[1] != 1 || e[2] != 1 || e[3] != 2)
+ __builtin_abort ();
+ return 0;
+}
--- /dev/null
+/* PR tree-optimization/60823 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fopenmp-simd -fno-strict-aliasing" } */
+
+void bar (char *, double *);
+
+#if __SIZEOF_DOUBLE__ >= 4
+
+struct S { char c[sizeof (double)]; };
+void baz (struct S, struct S);
+union U { struct S s; double d; };
+
+#pragma omp declare simd simdlen(4) notinbranch
+__attribute__((noinline)) int
+foo (double c1, double c2)
+{
+ double *a = &c1;
+ char *b = (char *) &c1 + 2;
+
+ b[-2]++;
+ b[1]--;
+ *a++;
+ c2++;
+ bar ((char *) &c2 + 1, &c2);
+ c2 *= 3.0;
+ bar (b, a);
+ baz (((union U) { .d = c1 }).s, ((union U) { .d = c2 }).s);
+ baz (*(struct S *)&c1, *(struct S *)&c2);
+ return c1 + c2 + ((struct S *)&c1)->c[1];
+}
+
+#endif
--- /dev/null
+/* PR middle-end/61486 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp" } */
+
+int
+foo (int *a)
+{
+ int i, j = 0;
+ #pragma omp target teams distribute simd linear(i, j) map(a[:10])
+ for (i = 0; i < 10; i++)
+ a[i] = j++;
+ return i + j;
+}
--- /dev/null
+/* PR middle-end/61486 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp" } */
+
+#pragma omp declare target
+void dosomething (int *a, int n, int m);
+#pragma omp end declare target
+
+void
+test (int n, int o, int p, int q, int r, int s, int *pp)
+{
+ int a[o], i, j;
+ #pragma omp target data device (n + 1) if (n != 6) map (tofrom: n, r)
+ {
+ #pragma omp target device (n + 1) if (n != 6) map (from: n) map (alloc: a[2:o-2])
+ dosomething (a, n, 0);
+ #pragma omp target teams device (n + 1) num_teams (n + 4) thread_limit (n * 2) \
+ if (n != 6)map (from: n) map (alloc: a[2:o-2]) default(shared) \
+ private (p) firstprivate (q) shared (n) reduction (+: r)
+ {
+ r = r + 1;
+ p = q;
+ dosomething (a, n, p + q);
+ }
+ #pragma omp target teams distribute device (n + 1) num_teams (n + 4) collapse (2) \
+ if (n != 6)map (from: n) map (alloc: a[2:o-2]) default(shared) \
+ private (p) firstprivate (q) shared (n) reduction (+: r) \
+ thread_limit (n * 2) dist_schedule (static, 4)
+ for (i = 0; i < 10; i++)
+ for (j = 0; j < 10; j++)
+ {
+ r = r + 1;
+ p = q;
+ dosomething (a, n, p + q);
+ }
+ #pragma omp target teams distribute device (n + 1) num_teams (n + 4) \
+ if (n != 6)map (from: n) map (alloc: a[2:o-2]) default(shared) \
+ private (p) firstprivate (q) shared (n) reduction (+: r) \
+ thread_limit (n * 2) dist_schedule (static, 4)
+ for (i = 0; i < 10; i++)
+ for (j = 0; j < 10; j++)
+ {
+ r = r + 1;
+ p = q;
+ dosomething (a, n, p + q);
+ }
+ #pragma omp target teams distribute parallel for device (n + 1) num_teams (n + 4) \
+ if (n != 6)map (from: n) map (alloc: a[2:o-2]) default(shared) \
+ private (p) firstprivate (q) shared (n) reduction (+: r) \
+ thread_limit (n * 2) dist_schedule (static, 4) collapse (2) \
+ num_threads (n + 4) proc_bind (spread) lastprivate (s) \
+ ordered schedule (static, 8)
+ for (i = 0; i < 10; i++)
+ for (j = 0; j < 10; j++)
+ {
+ r = r + 1;
+ p = q;
+ dosomething (a, n, p + q);
+ #pragma omp ordered
+ p = q;
+ s = i * 10 + j;
+ }
+ #pragma omp target teams distribute parallel for device (n + 1) num_teams (n + 4) \
+ if (n != 6)map (from: n) map (alloc: a[2:o-2]) default(shared) \
+ private (p) firstprivate (q) shared (n) reduction (+: r) \
+ thread_limit (n * 2) dist_schedule (static, 4) num_threads (n + 4) \
+ proc_bind (master) lastprivate (s) ordered schedule (static, 8)
+ for (i = 0; i < 10; i++)
+ {
+ for (j = 0; j < 10; j++)
+ {
+ r = r + 1;
+ p = q;
+ dosomething (a, n, p + q);
+ }
+ #pragma omp ordered
+ p = q;
+ s = i * 10;
+ }
+ #pragma omp target teams distribute parallel for simd device (n + 1) \
+ if (n != 6)map (from: n) map (alloc: a[2:o-2]) default(shared) \
+ private (p) firstprivate (q) shared (n) reduction (+: r) \
+ thread_limit (n * 2) dist_schedule (static, 4) collapse (2) \
+ num_threads (n + 4) proc_bind (spread) lastprivate (s) \
+ schedule (static, 8) num_teams (n + 4) safelen(8)
+ for (i = 0; i < 10; i++)
+ for (j = 0; j < 10; j++)
+ {
+ r = r + 1;
+ p = q;
+ a[2+i*10+j] = p + q;
+ s = i * 10 + j;
+ }
+ #pragma omp target teams distribute parallel for simd device (n + 1) \
+ if (n != 6)map (from: n) map (alloc: a[2:o-2]) default(shared) \
+ private (p) firstprivate (q) shared (n) reduction (+: r) \
+ thread_limit (n * 2) dist_schedule (static, 4) num_threads (n + 4) \
+ proc_bind (master) lastprivate (s) schedule (static, 8) \
+ num_teams (n + 4) safelen(16) linear(i:1) aligned (pp:4)
+ for (i = 0; i < 10; i++)
+ {
+ r = r + 1;
+ p = q;
+ a[2+i] = p + q;
+ s = i * 10;
+ }
+ #pragma omp target teams distribute simd device (n + 1) \
+ if (n != 6)map (from: n) map (alloc: a[2:o-2]) default(shared) \
+ private (p) firstprivate (q) shared (n) reduction (+: r) \
+ thread_limit (n * 2) dist_schedule (static, 4) collapse (2) \
+ lastprivate (s) num_teams (n + 4) safelen(8)
+ for (i = 0; i < 10; i++)
+ for (j = 0; j < 10; j++)
+ {
+ r = r + 1;
+ p = q;
+ a[2+i*10+j] = p + q;
+ s = i * 10 + j;
+ }
+ #pragma omp target teams distribute simd device (n + 1) \
+ if (n != 6)map (from: n) map (alloc: a[2:o-2]) default(shared) \
+ private (p) firstprivate (q) shared (n) reduction (+: r) \
+ thread_limit (n * 2) dist_schedule (static, 4) lastprivate (s) \
+ num_teams (n + 4) safelen(16) linear(i:1) aligned (pp:4)
+ for (i = 0; i < 10; i++)
+ {
+ r = r + 1;
+ p = q;
+ a[2+i] = p + q;
+ s = i * 10;
+ }
+ #pragma omp target device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2])
+ #pragma omp teams num_teams (n + 4) thread_limit (n * 2) default(shared) \
+ private (p) firstprivate (q) shared (n) reduction (+: r)
+ {
+ r = r + 1;
+ p = q;
+ dosomething (a, n, p + q);
+ }
+ #pragma omp target device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2])
+ #pragma omp teams distribute num_teams (n + 4) collapse (2) default(shared) \
+ private (p) firstprivate (q) shared (n) reduction (+: r) \
+ thread_limit (n * 2) dist_schedule (static, 4)
+ for (i = 0; i < 10; i++)
+ for (j = 0; j < 10; j++)
+ {
+ r = r + 1;
+ p = q;
+ dosomething (a, n, p + q);
+ }
+ #pragma omp target device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2])
+ #pragma omp teams distribute num_teams (n + 4) default(shared) \
+ private (p) firstprivate (q) shared (n) reduction (+: r) \
+ thread_limit (n * 2) dist_schedule (static, 4)
+ for (i = 0; i < 10; i++)
+ for (j = 0; j < 10; j++)
+ {
+ r = r + 1;
+ p = q;
+ dosomething (a, n, p + q);
+ }
+ #pragma omp target device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2])
+ #pragma omp teams distribute parallel for num_teams (n + 4) if (n != 6) \
+ default(shared) private (p) firstprivate (q) shared (n) reduction (+: r) \
+ thread_limit (n * 2) dist_schedule (static, 4) collapse (2) \
+ num_threads (n + 4) proc_bind (spread) lastprivate (s) \
+ ordered schedule (static, 8)
+ for (i = 0; i < 10; i++)
+ for (j = 0; j < 10; j++)
+ {
+ r = r + 1;
+ p = q;
+ dosomething (a, n, p + q);
+ #pragma omp ordered
+ p = q;
+ s = i * 10 + j;
+ }
+ #pragma omp target device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2])
+ #pragma omp teams distribute parallel for num_teams (n + 4) if (n != 6) \
+ default(shared) private (p) firstprivate (q) shared (n) reduction (+: r) \
+ thread_limit (n * 2) dist_schedule (static, 4) num_threads (n + 4) \
+ proc_bind (master) lastprivate (s) ordered schedule (static, 8)
+ for (i = 0; i < 10; i++)
+ {
+ for (j = 0; j < 10; j++)
+ {
+ r = r + 1;
+ p = q;
+ dosomething (a, n, p + q);
+ }
+ #pragma omp ordered
+ p = q;
+ s = i * 10;
+ }
+ #pragma omp target device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2])
+ #pragma omp teams distribute parallel for simd if (n != 6)default(shared) \
+ private (p) firstprivate (q) shared (n) reduction (+: r) \
+ thread_limit (n * 2) dist_schedule (static, 4) collapse (2) \
+ num_threads (n + 4) proc_bind (spread) lastprivate (s) \
+ schedule (static, 8) num_teams (n + 4) safelen(8)
+ for (i = 0; i < 10; i++)
+ for (j = 0; j < 10; j++)
+ {
+ r = r + 1;
+ p = q;
+ a[2+i*10+j] = p + q;
+ s = i * 10 + j;
+ }
+ #pragma omp target device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2])
+ #pragma omp teams distribute parallel for simd if (n != 6)default(shared) \
+ private (p) firstprivate (q) shared (n) reduction (+: r) \
+ thread_limit (n * 2) dist_schedule (static, 4) num_threads (n + 4) \
+ proc_bind (master) lastprivate (s) schedule (static, 8) \
+ num_teams (n + 4) safelen(16) linear(i:1) aligned (pp:4)
+ for (i = 0; i < 10; i++)
+ {
+ r = r + 1;
+ p = q;
+ a[2+i] = p + q;
+ s = i * 10;
+ }
+ #pragma omp target device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2])
+ #pragma omp teams distribute simd default(shared) \
+ private (p) firstprivate (q) shared (n) reduction (+: r) \
+ thread_limit (n * 2) dist_schedule (static, 4) collapse (2) \
+ lastprivate (s) num_teams (n + 4) safelen(8)
+ for (i = 0; i < 10; i++)
+ for (j = 0; j < 10; j++)
+ {
+ r = r + 1;
+ p = q;
+ a[2+i*10+j] = p + q;
+ s = i * 10 + j;
+ }
+ #pragma omp target device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2])
+ #pragma omp teams distribute simd default(shared) \
+ private (p) firstprivate (q) shared (n) reduction (+: r) \
+ thread_limit (n * 2) dist_schedule (static, 4) lastprivate (s) \
+ num_teams (n + 4) safelen(16) linear(i:1) aligned (pp:4)
+ for (i = 0; i < 10; i++)
+ {
+ r = r + 1;
+ p = q;
+ a[2+i] = p + q;
+ s = i * 10;
+ }
+ #pragma omp target teams device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) \
+ num_teams (n + 4) thread_limit (n * 2)default(shared) shared(n) \
+ private (p) reduction (+: r)
+ #pragma omp distribute collapse (2) dist_schedule (static, 4) firstprivate (q)
+ for (i = 0; i < 10; i++)
+ for (j = 0; j < 10; j++)
+ {
+ r = r + 1;
+ p = q;
+ dosomething (a, n, p + q);
+ }
+ #pragma omp target teams device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) \
+ num_teams (n + 4) thread_limit (n * 2) shared(n) private(p) reduction (+ : r) \
+ default(shared)
+ #pragma omp distribute dist_schedule (static, 4) firstprivate (q)
+ for (i = 0; i < 10; i++)
+ for (j = 0; j < 10; j++)
+ {
+ r = r + 1;
+ p = q;
+ dosomething (a, n, p + q);
+ }
+ #pragma omp target teams device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) \
+ num_teams (n + 4) thread_limit (n * 2)
+ #pragma omp distribute parallel for if (n != 6) \
+ default(shared) private (p) firstprivate (q) shared (n) reduction (+: r) \
+ collapse (2) dist_schedule (static, 4) \
+ num_threads (n + 4) proc_bind (spread) lastprivate (s) \
+ ordered schedule (static, 8)
+ for (i = 0; i < 10; i++)
+ for (j = 0; j < 10; j++)
+ {
+ r = r + 1;
+ p = q;
+ dosomething (a, n, p + q);
+ #pragma omp ordered
+ p = q;
+ s = i * 10 + j;
+ }
+ #pragma omp target teams device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) \
+ num_teams (n + 4) thread_limit (n * 2)
+ #pragma omp distribute parallel for if (n != 6) \
+ default(shared) private (p) firstprivate (q) shared (n) reduction (+: r) \
+ num_threads (n + 4) dist_schedule (static, 4) \
+ proc_bind (master) lastprivate (s) ordered schedule (static, 8)
+ for (i = 0; i < 10; i++)
+ {
+ for (j = 0; j < 10; j++)
+ {
+ r = r + 1;
+ p = q;
+ dosomething (a, n, p + q);
+ }
+ #pragma omp ordered
+ p = q;
+ s = i * 10;
+ }
+ #pragma omp target teams device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) \
+ num_teams (n + 4) thread_limit (n * 2)
+ #pragma omp distribute parallel for simd if (n != 6)default(shared) \
+ private (p) firstprivate (q) shared (n) reduction (+: r) \
+ collapse (2) dist_schedule (static, 4) \
+ num_threads (n + 4) proc_bind (spread) lastprivate (s) \
+ schedule (static, 8) safelen(8)
+ for (i = 0; i < 10; i++)
+ for (j = 0; j < 10; j++)
+ {
+ r = r + 1;
+ p = q;
+ a[2+i*10+j] = p + q;
+ s = i * 10 + j;
+ }
+ #pragma omp target teams device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) \
+ num_teams (n + 4) thread_limit (n * 2)
+ #pragma omp distribute parallel for simd if (n != 6)default(shared) \
+ private (p) firstprivate (q) shared (n) reduction (+: r) \
+ num_threads (n + 4) dist_schedule (static, 4) \
+ proc_bind (master) lastprivate (s) schedule (static, 8) \
+ safelen(16) linear(i:1) aligned (pp:4)
+ for (i = 0; i < 10; i++)
+ {
+ r = r + 1;
+ p = q;
+ a[2+i] = p + q;
+ s = i * 10;
+ }
+ #pragma omp target teams device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) \
+ num_teams (n + 4) thread_limit (n * 2) default(shared) shared(n) private(p) \
+ reduction(+:r)
+ #pragma omp distribute simd private (p) firstprivate (q) reduction (+: r) \
+ collapse (2) dist_schedule (static, 4) lastprivate (s) safelen(8)
+ for (i = 0; i < 10; i++)
+ for (j = 0; j < 10; j++)
+ {
+ r = r + 1;
+ p = q;
+ a[2+i*10+j] = p + q;
+ s = i * 10 + j;
+ }
+ #pragma omp target teams device (n + 1) if (n != 6)map(from:n) map(alloc:a[2:o-2]) \
+ num_teams (n + 4) thread_limit (n * 2) default(shared) shared(n) private(p) \
+ reduction(+:r)
+ #pragma omp distribute simd private (p) firstprivate (q) reduction (+: r) \
+ lastprivate (s) dist_schedule (static, 4) safelen(16) linear(i:1) aligned (pp:4)
+ for (i = 0; i < 10; i++)
+ {
+ r = r + 1;
+ p = q;
+ a[2+i] = p + q;
+ s = i * 10;
+ }
+ }
+}
+
+int q, i, j;
+
+void
+test2 (int n, int o, int p, int r, int s, int *pp)
+{
+ int a[o];
+ #pragma omp distribute collapse (2) dist_schedule (static, 4) firstprivate (q)
+ for (i = 0; i < 10; i++)
+ for (j = 0; j < 10; j++)
+ {
+ r = r + 1;
+ p = q;
+ dosomething (a, n, p + q);
+ }
+ #pragma omp distribute dist_schedule (static, 4) firstprivate (q)
+ for (i = 0; i < 10; i++)
+ for (j = 0; j < 10; j++)
+ {
+ r = r + 1;
+ p = q;
+ dosomething (a, n, p + q);
+ }
+ #pragma omp distribute parallel for if (n != 6) \
+ default(shared) private (p) firstprivate (q) shared (n) reduction (+: r) \
+ collapse (2) dist_schedule (static, 4) \
+ num_threads (n + 4) proc_bind (spread) lastprivate (s) \
+ ordered schedule (static, 8)
+ for (i = 0; i < 10; i++)
+ for (j = 0; j < 10; j++)
+ {
+ r = r + 1;
+ p = q;
+ dosomething (a, n, p + q);
+ #pragma omp ordered
+ p = q;
+ s = i * 10 + j;
+ }
+ #pragma omp distribute parallel for if (n != 6) \
+ default(shared) private (p) firstprivate (q) shared (n) reduction (+: r) \
+ num_threads (n + 4) dist_schedule (static, 4) \
+ proc_bind (master) lastprivate (s) ordered schedule (static, 8)
+ for (i = 0; i < 10; i++)
+ {
+ for (j = 0; j < 10; j++)
+ {
+ r = r + 1;
+ p = q;
+ dosomething (a, n, p + q);
+ }
+ #pragma omp ordered
+ p = q;
+ s = i * 10;
+ }
+ #pragma omp distribute parallel for simd if (n != 6)default(shared) \
+ private (p) firstprivate (q) shared (n) reduction (+: r) \
+ collapse (2) dist_schedule (static, 4) \
+ num_threads (n + 4) proc_bind (spread) lastprivate (s) \
+ schedule (static, 8) safelen(8)
+ for (i = 0; i < 10; i++)
+ for (j = 0; j < 10; j++)
+ {
+ r = r + 1;
+ p = q;
+ a[2+i*10+j] = p + q;
+ s = i * 10 + j;
+ }
+ #pragma omp distribute parallel for simd if (n != 6)default(shared) \
+ private (p) firstprivate (q) shared (n) reduction (+: r) \
+ num_threads (n + 4) dist_schedule (static, 4) \
+ proc_bind (master) lastprivate (s) schedule (static, 8) \
+ safelen(16) linear(i:1) aligned (pp:4)
+ for (i = 0; i < 10; i++)
+ {
+ r = r + 1;
+ p = q;
+ a[2+i] = p + q;
+ s = i * 10;
+ }
+ #pragma omp distribute simd private (p) firstprivate (q) reduction (+: r) \
+ collapse (2) dist_schedule (static, 4) lastprivate (s) safelen(8)
+ for (i = 0; i < 10; i++)
+ for (j = 0; j < 10; j++)
+ {
+ r = r + 1;
+ p = q;
+ a[2+i*10+j] = p + q;
+ s = i * 10 + j;
+ }
+ #pragma omp distribute simd private (p) firstprivate (q) reduction (+: r) \
+ lastprivate (s) dist_schedule (static, 4) safelen(16) linear(i:1) aligned (pp:4)
+ for (i = 0; i < 10; i++)
+ {
+ r = r + 1;
+ p = q;
+ a[2+i] = p + q;
+ s = i * 10;
+ }
+}
--- /dev/null
+/* PR tree-optimization/60971 */
+/* { dg-do run } */
+
+#ifndef __cplusplus
+#define bool _Bool
+#endif
+
+volatile unsigned char c;
+
+__attribute__((noinline)) unsigned char
+foo (void)
+{
+ return c;
+}
+
+__attribute__((noinline)) bool
+bar (void)
+{
+ return foo () & 1;
+}
+
+int
+main ()
+{
+ c = 0x41;
+ c = bar ();
+ if (c != 1)
+ __builtin_abort ();
+ c = 0x20;
+ c = bar ();
+ if (c != 0)
+ __builtin_abort ();
+ return 0;
+}
--- /dev/null
+// PR c++/60951
+// { dg-do compile { target c++11 } }
+
+struct Foo {
+ constexpr Foo(int x = 0) : memb(x) {}
+ int memb;
+};
+
+struct FooContainer {
+ Foo foo[2];
+};
+
+void fubar() {
+ int nonConst = 0;
+ FooContainer fooContainer;
+ fooContainer = { { 0, nonConst } };
+}
--- /dev/null
+// PR c++/61661
+// { dg-do compile { target c++11 } }
+
+struct Outer {
+
+ void Bar();
+
+ struct Foo {
+ void (Outer::*ptr)() ;
+ };
+
+ static constexpr Foo foo = { &Outer::Bar };
+};
--- /dev/null
+// PR c++/61556
+// { dg-do compile { target c++11 } }
+
+class ValueType {
+public:
+ constexpr operator int() const {return m_ID;};
+ constexpr ValueType(const int v)
+ : m_ID(v) {}
+private:
+ int m_ID;
+};
+
+class ValueTypeEnum {
+public:
+ static constexpr ValueType doubleval = ValueType(1);
+};
+
+template <int format>
+class ValueTypeInfo {
+};
+
+template <typename Format>
+class FillFunctor {
+public:
+ FillFunctor() {
+ ValueTypeInfo<ValueTypeEnum::doubleval> v;
+ }
+};
+
+int main() {
+ ValueTypeInfo<ValueTypeEnum::doubleval> v;
+}
--- /dev/null
+// PR c++/60980
+// { dg-do compile { target c++11 } }
+
+struct x0
+{
+ x0 () = default;
+};
+struct x1
+{
+ x0 x2[2];
+ void x3 ()
+ {
+ x1 ();
+ }
+};
--- /dev/null
+// PR c++/58636
+// { dg-do compile { target c++11 } }
+
+#include <initializer_list>
+
+// { dg-error "pointer to reference" "" { target *-*-* } 0 }
+int foo(std::initializer_list<int&&>);
+
+int i = foo({ 0 }); // { dg-error "std::initializer_list" }
--- /dev/null
+// PR c++/61242
+// { dg-do compile { target c++11 } }
+
+struct Foo
+{
+ struct A
+ {
+ const int &container;
+ const int &args;
+ };
+ static void Create (const A &);
+};
+
+int main ()
+{
+ Foo::Create ({{}, {}});
+}
--- /dev/null
+// PR c++/61382
+// { dg-do run { target c++11 } }
+
+struct A
+{
+ int i,j;
+ A(int i,int j):i(i),j(j){}
+};
+
+extern "C" int printf (const char *, ...);
+
+int main()
+{
+ int i = 0;
+ A a{i++,i++};
+ if (a.i != 0 || a.j != 1)
+ __builtin_abort();
+}
--- /dev/null
+// PR c++/60992
+// { dg-do compile { target c++11 } }
+
+struct ScopeGuardGenerator { };
+
+struct FF
+{
+ template < class F, class ... Ts >
+ void
+ operator () (F & ...)
+ {
+ const int n = sizeof ... (Ts) + 1;
+ void *mutexes[n];
+ auto _on_scope_exit_var_0 =
+ ScopeGuardGenerator () + [&mutexes] { };
+ }
+};
+
+template < class F >
+int operator+ (ScopeGuardGenerator, F) { return 1; }
+
+struct D
+{
+ template < class T0, class T1, class T2, class ... T >
+ void
+ operator () (T0, T1, const T2 & t2, T & ... t)
+ {
+ base (t2, t ...);
+ }
+ FF base;
+};
+
+D run_with_locks;
+
+void Fn ()
+{
+ run_with_locks ([] { }, 0, 0);
+}
--- /dev/null
+// PR c++/61566
+// { dg-do compile { target c++11 } }
+
+struct function
+{
+ template < typename _Functor>
+ function (_Functor);
+};
+
+struct C
+{
+ template <typename T>
+ void foo (T, function = [] {});
+};
+
+void bar ()
+{
+ C c;
+ c.foo (1);
+}
--- /dev/null
+// PR c++/61151
+// { dg-do compile { target c++11 } }
+
+struct B
+{
+ void foo () {}
+};
+
+template <class>
+struct A
+{
+ template <class> void bar ();
+ B a;
+};
+
+template <class T>
+template <class U>
+void
+A<T>::bar ()
+{
+ auto f = [this] () { auto g = [=] () { a.foo (); }; g (); };
+ f ();
+}
+
+int
+main ()
+{
+ A<int> a;
+ a.bar <int> ();
+}
--- /dev/null
+// PR c++/60999
+// { dg-do compile { target c++11 } }
+
+struct B
+{
+ template<int N, int M>
+ struct A;
+
+ template<int M>
+ struct A<1, M>
+ {
+ int X = M;
+ };
+};
--- /dev/null
+// PR c++/58930
+// { dg-do compile { target c++11 } }
+
+struct SampleModule
+{
+ explicit SampleModule (int);
+};
+
+template < typename >
+struct BaseHandler
+{
+ SampleModule module_ { 0 };
+};
+
+BaseHandler<int> a;
--- /dev/null
+// PR c++/58753
+// { dg-do compile { target c++11 } }
+
+#include <initializer_list>
+
+template <class T>
+struct X {X(std::initializer_list<int>) {}};
+
+template <class zomg>
+class T {
+ X<T> x{1};
+};
+
+int main()
+{
+ T<int> t;
+}
--- /dev/null
+// PR c++/58704
+// { dg-do compile { target c++11 } }
+
+struct A {};
+
+template<typename> struct B
+{
+ A a[1] = { };
+};
+
+B<int> b;
--- /dev/null
+// PR c++/60999
+// { dg-do compile { target c++11 } }
+
+template <typename A>
+struct foo
+{
+};
+
+template<>
+struct foo<int>
+{
+ static constexpr int code = 42;
+ unsigned int bar = static_cast<unsigned int>(code);
+};
+
+foo<int> a;
--- /dev/null
+// { dg-do compile { target c++11 } }
+
+#define BAZ "baz"
+
+#if 0
+
+"bar"BAZ
+
+R"(
+ bar
+)"BAZ
+
+#endif
--- /dev/null
+// PR c++/58781
+// { dg-do compile { target c++11 } }
+
+#include <cstddef>
+
+int
+operator""_s(const char32_t *a, size_t b)
+{
+ return 0;
+}
+
+int
+f()
+{
+ using a = decltype(U"\x1181"_s);
+ using b = decltype(U"\x8111"_s);
+ using c = decltype(U" \x1181"_s);
+}
--- /dev/null
+// PR c++/60249
+// { dg-do compile { target c++11 } }
+
+decltype(""_) x; // { dg-error "unable to find string literal operator" }
+
+// { dg-error "invalid type in declaration before" "invalid" { target *-*-* } 4 }
--- /dev/null
+// PR c++/59296
+// { dg-do compile { target c++11 } }
+
+struct Type
+{
+ void get() const& { }
+ void get() const&& { }
+};
+
+int main()
+{
+ Type{}.get();
+}
--- /dev/null
+// PR c++/61083
+// { dg-do compile { target c++11 } }
+
+template<typename T> T declval();
+
+template<typename T, typename U>
+struct is_same {
+ static const bool value = false;
+};
+
+template<typename T>
+struct is_same<T, T> {
+ static const bool value = true;
+};
+
+struct true_type {};
+struct false_type {};
+
+template <typename T>
+struct is_foo {
+private:
+ template<typename U, U> struct helper {};
+
+ template <typename Z> static auto
+ test(Z z) -> decltype(helper<void (Z::*)() const, &Z::foo>(), true_type());
+
+ template <typename> static auto test(...) -> false_type;
+
+public:
+ enum { value = is_same<decltype(test<T>(declval<T>())), true_type>::value };
+};
+
+struct A {
+ int foo();
+ void foo() const;
+};
+
+struct A1 : public A {};
+
+static_assert (is_foo<A>::value == 1, "");
+static_assert (is_foo<A1>::value == 0, "");
--- /dev/null
+// PR c++/61134
+// { dg-do compile { target c++11 } }
+
+struct Base { };
+
+template <typename>
+struct Fixed {
+ typedef const char* name;
+};
+
+template <typename VT, typename... Fields>
+void New(const char* name,
+ typename Fixed<Fields>::name... field_names);
+
+template <typename VT, typename... Fields>
+void CreateMetric(const char* name,
+ typename Fixed<Fields>::name... field_names,
+ const Base&) { }
+
+
+void Fn()
+{
+ CreateMetric<int, const char*>("abcd", "def", Base());
+}
--- /dev/null
+// PR c++/61507
+// { dg-do compile { target c++11 } }
+
+struct A {
+ void foo(const int &);
+ void foo(float);
+};
+
+template <typename... Args>
+void bar(void (A::*memfun)(Args...), Args... args);
+
+void go(const int& i) {
+ bar<const int &>(&A::foo, i);
+}
--- /dev/null
+// PR c++/61539
+// { dg-do compile { target c++11 } }
+
+template <typename _CharT> class A;
+template <typename> class B;
+template <class charT> class C;
+template <> class C<char>
+{
+ virtual void xparse (int &, const B<A<char> > &) const;
+};
+template <class T, class charT = char> class G : C<charT>
+{
+public:
+ G (void *) {}
+ void default_value (const T &);
+ void xparse (int &, const B<A<charT> > &) const;
+};
+template <class T, class charT>
+void validate (int &, const B<A<charT> > &, T *, int);
+template <class T, class charT>
+void G<T, charT>::xparse (int &p1, const B<A<charT> > &p2) const
+{
+ validate (p1, p2, (T *)0, 0);
+}
+template <class T> G<T> *value (T *) { return new G<T>(0); }
+namespace Eigen
+{
+template <typename T> struct D;
+template <typename, int, int, int = 0, int = 0, int = 0 > class F;
+template <typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows,
+ int _MaxCols>
+struct D<F<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> >
+{
+ typedef _Scalar Scalar;
+};
+template <typename, int, int, int, int, int _MaxCols> class F
+{
+public:
+ typedef typename Eigen::D<F>::Scalar Scalar;
+ F (const Scalar &, const Scalar &, const Scalar &);
+};
+template <class... T>
+void validate (int &, const B<A<char> > &, Eigen::F<T...> *);
+}
+int main (int, char *[])
+{
+ Eigen::F<double, 3, 1> a (0, 0, 0);
+ value (&a)->default_value (Eigen::F<double, 3, 1>(0, 0, 0));
+}
--- /dev/null
+// PR c++/59867
+// { dg-do compile { target c++1y } }
+
+#include <iostream>
+using namespace std;
+
+// constant
+template<typename T, T x>
+ struct meta_value
+ {
+ typedef meta_value type;
+ typedef T value_type;
+ static const T value = x;
+ };
+
+// array
+template<typename T, T... data>
+ struct meta_array
+ {
+ typedef meta_array type;
+ typedef T item_type;
+ };
+
+// static array -> runtime array conversion utility
+template<typename T>
+ struct array_gen;
+
+template<typename T, T... xs>
+ struct array_gen<meta_array<T, xs...>>
+ {
+ static const T value[sizeof...(xs)];
+ };
+
+template<typename T, T... xs>
+ const T
+ array_gen<meta_array<T, xs...>>::value[sizeof...(xs)] = {xs...};
+
+// static string
+template<typename T, T... xs>
+ constexpr meta_array<T, xs...>
+ operator""_s()
+ {
+ static_assert(sizeof...(xs) == 3, "What's wrong with you?");
+ return meta_array<T, xs...>();
+ }
+
+int
+main()
+{
+ auto a = "123"_s;
+ const char (& xs)[3] = array_gen<decltype("123"_s)>::value;
+}
--- /dev/null
+// { dg-do compile }
+// { dg-options "-gdwarf-2 -dA -O0 -fno-merge-debug-strings" }
+
+class AAAA
+{
+ public:
+ int method (void);
+ int a;
+};
+
+int
+AAAA::method (void)
+{
+ return a;
+}
+
+class BBBB : public AAAA
+{
+ public:
+ using AAAA::method;
+
+ int method (int b);
+};
+
+int
+BBBB::method (int b)
+{
+ return a + b;
+}
+
+// { dg-final { scan-assembler-not "ascii \"BBBB\\\\0\".*ascii \"AAAA\\\\0\".*DW_TAG_imported_declaration" } }
+// { dg-final { scan-assembler-times "ascii \"AAAA\\\\0\".*ascii \"BBBB\\\\0\".*DIE .0x\[0-9a-f\]*. DW_TAG_imported_declaration" 1 } }
--- /dev/null
+// PR c++/61433
+// { dg-do compile { target c++11 } }
+// { dg-options "-O -fcompare-debug -fno-inline -fno-ipa-pure-const -fipa-sra" }
+
+template <class T>
+struct A
+{
+ template <class V>
+ struct B
+ {
+ int MEM;
+ };
+};
+struct D {};
+struct C: public A<int>::B<D>
+{};
+template <class T, class U, class V>
+auto k(T t, U u, V v) -> decltype (t.U::template B<V>::MEM)
+{}
+int main()
+{
+ k( C(), A<int>(), D() );
+}
--- /dev/null
+// PR c++/61614
+// { dg-options "" }
+
+int Fn (...);
+
+void
+Test ()
+{
+ int j = Fn ((const int[]) { 0 }); // OK
+ unsigned long sz = sizeof Fn ((const int[]) { 0 }); // Error
+}
--- /dev/null
+// CWG 5
+
+struct C { };
+C c;
+struct A {
+ A(const A&);
+ A(const C&);
+};
+const volatile A a = c; // Okay
/* While inlining function called once we should devirtualize a new call to fn2
and two to fn3. While doing so the new symbol for fn2 needs to be
introduced. */
-/* { dg-final { scan-ipa-dump-times "Discovered a virtual call to a known target" 3 "inline" } } */
+/* { dg-final { scan-ipa-dump "Discovered a virtual call to a known target" "inline" } } */
/* { dg-final { cleanup-ipa-dump "inline" } } */
dpr_Job jobL;
dpr_run(jobL);
}
-/* { dg-final { scan-ipa-dump "Type inconsident devirtualization" "cp" } } */
+/* { dg-final { scan-ipa-dump "Type inconsistent devirtualization" "cp" } } */
/* { dg-final { cleanup-ipa-dump "cp" } } */
/* { dg-do compile } */
-/* { dg-options "-O3 -fdump-ipa-devirt -fdump-tree-optimized" } */
+/* { dg-options "-O3 -fdump-tree-optimized" } */
struct A
{
int a;
--- /dev/null
+/* { dg-options "-O2 -std=c++11 -fdump-ipa-inline" } */
+#include <new>
+
+class EmbeddedObject {
+public:
+ virtual int val() { return 2; }
+};
+
+class Container {
+ alignas(EmbeddedObject) char buffer[sizeof(EmbeddedObject)];
+public:
+ EmbeddedObject *obj() { return (EmbeddedObject*)buffer; }
+ Container() { new (buffer) EmbeddedObject(); }
+};
+
+Container o;
+
+int main()
+{
+ __builtin_printf("%d\n", o.obj()->val());
+}
+/* { dg-final { scan-ipa-dump-not "__builtin_unreachable" "inline" } } */
+/* { dg-final { cleanup-ipa-dump "inline" } } */
test(d);
}
-/* { dg-final { scan-ipa-dump "Type inconsident devirtualization" "cp" } } */
+/* { dg-final { scan-ipa-dump "Type inconsistent devirtualization" "cp" } } */
/* { dg-final { cleanup-ipa-dump "cp" } } */
--- /dev/null
+/* { dg-do run } */
+/* { dg-options "-O2 -fno-early-inlining" } */
+
+struct A {};
+struct B : virtual A {
+ unsigned m_i;
+ B() : m_i () {}
+ virtual A *m_virt ()
+ {
+ return 0;
+ }
+ ~B ()
+ {
+ m_foo ();
+ while (m_i)
+ ;
+ }
+ void m_foo ()
+ {
+ m_virt ();
+ }
+};
+
+class C : B {
+ A *m_virt () {
+ __builtin_abort ();
+ }
+};
+
+int main ()
+{
+ C c;
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+
+struct CBase {
+ virtual void BaseFunc () {}
+};
+
+struct MMixin {
+ virtual void * MixinFunc (int, void *) = 0;
+};
+
+struct CExample: CBase, public MMixin
+{
+ void *MixinFunc (int arg, void *arg2)
+ {
+ if (arg != 1 || arg2)
+ return 0;
+ return this;
+ }
+};
+
+void *test (MMixin & anExample)
+{
+ return anExample.MixinFunc (1, 0);
+}
+
+int main ()
+{
+ CExample c;
+ return (test (c) != &c);
+}
--- /dev/null
+/* { dg-do run } */
+/* { dg-options "-O3 --param ipa-cp-eval-threshold=1" } */
+
+extern "C" void abort (void);
+
+struct CBase {
+ virtual void BaseFunc () {}
+};
+
+struct MMixin {
+ virtual void * MixinFunc (int, void *) = 0;
+};
+
+struct CExample: CBase, public MMixin
+{
+ int stuff, magic, more_stuff;
+
+ CExample ()
+ {
+ stuff = 0;
+ magic = 0xbeef;
+ more_stuff = 0;
+ }
+ void *MixinFunc (int arg, void *arg2)
+ {
+ if (arg != 1 || arg2)
+ return 0;
+ if (magic != 0xbeef)
+ abort();
+ return this;
+ }
+};
+
+void *test (MMixin & anExample)
+{
+ return anExample.MixinFunc (1, 0);
+}
+
+int main ()
+{
+ CExample c;
+ return (test (c) != &c);
+}
--- /dev/null
+/* { dg-do run } */
+/* { dg-options "-O3" } */
+
+struct A {
+ void *p;
+ A (void *q) : p (q) {}
+ A (const A &) : p () {}
+};
+
+struct CBase {
+ virtual void BaseFunc () {}
+};
+
+struct MMixin {
+ virtual A MixinFunc (int, A) = 0;
+};
+
+struct CExample: CBase, public MMixin
+{
+ A MixinFunc (int arg, A arg2)
+ {
+ if (arg != 1 || arg2.p)
+ return 0;
+ return this;
+ }
+};
+
+void *test (MMixin & anExample)
+{
+ return anExample.MixinFunc (1, (0)).p;
+}
+
+int main ()
+{
+ CExample c;
+ return (test (c) != &c);
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O3 -fno-early-inlining" } */
+
+struct data {
+ data(int) {}
+};
+
+struct top {
+ virtual int topf() {}
+};
+
+struct intermediate: top {
+ int topf() /* override */ { return 0; }
+};
+
+struct child1: top {
+ void childf()
+ {
+ data d(topf());
+ }
+};
+
+struct child2: intermediate {};
+
+void test(top& t)
+{
+ child1& c = static_cast<child1&>(t);
+ c.childf();
+ child2 d;
+ test(d);
+}
+
+int main (int argc, char **argv)
+{
+ child1 c;
+ test (c);
+ return 0;
+}
--- /dev/null
+// { dg-do compile }
+// { dg-options "-O2" }
+
+int g;
+
+extern "C" int isnan ();
+
+void foo(float a) {
+ int (*xx)(...);
+ xx = isnan;
+ if (xx(a))
+ g++;
+}
--- /dev/null
+// { dg-do run }
+// { dg-options "-O -fno-inline -fipa-pta" }
+
+struct IFoo
+{
+ virtual void Foo () = 0;
+};
+
+struct Bar:IFoo
+{
+ void Foo () {}
+};
+
+int main ()
+{
+ (new Bar ())->Foo ();
+ return 0;
+}
--- /dev/null
+// { dg-do compile }
+// { dg-options "-O2 -std=c++11 -Werror=uninitialized" }
+
+int rand ();
+
+class Funcs
+{
+public:
+ int *f1 ();
+ int *f2 ();
+};
+typedef decltype (&Funcs::f1) pfunc;
+
+static int Set (Funcs * f, const pfunc & fp)
+{
+ (f->*fp) ();
+}
+
+void
+Foo ()
+{
+ pfunc fp = &Funcs::f1;
+ if (rand ())
+ fp = &Funcs::f2;
+ Set (0, fp);
+}
--- /dev/null
+// PR middle-end/61654
+// { dg-do compile }
+
+class A
+{
+ virtual int a (int, int = 0) = 0;
+ int b (const int &);
+ int c;
+};
+
+class B : virtual A
+{
+ int d;
+ int a (int, int);
+};
+
+int
+A::b (const int &)
+{
+ return a ('\0');
+}
+
+int
+B::a (int, int)
+{
+ return 0 ? 0 : d;
+}
--- /dev/null
+// PR c++/61020
+// { dg-options "-O2" }
+// { dg-do run }
+
+#include <typeinfo>
+
+struct Base {
+ virtual ~Base() { }
+};
+
+struct Derived : public Base {
+};
+
+int compare(const Base& base)
+{
+ return typeid(base) == typeid(typeid(Derived));
+}
+
+int main()
+{
+ Base base;
+ Derived derived;
+
+ if (compare(base)) return 1;
+ if (compare(derived)) return 2;
+ return 0;
+}
--- /dev/null
+/* { dg-do compile { target { { i?86-*-* x86_64-*-* } && ia32 } } } */
+/* { dg-options "-O2 -ftree-vectorize -march=pentium4 -mfpmath=387" } */
+
+struct A
+{
+ float f, g, h, k;
+ A () {}
+ A (float v0, float x, float y) : f(v0), g(x), h(y), k(0.0f) {}
+ A bar (A &a, float t) { return A (f + a.f * t, g + a.g * t, h + a.h * t); }
+};
+
+A
+baz (A &x, A &y, float t)
+{
+ return x.bar (y, t);
+}
+
+A *
+foo (A &s, A &t, A &u, A &v, int y, int z)
+{
+ A *x = new A[y * z];
+ for (int i = 0; i < 7; i++)
+ {
+ A s = baz (s, u, i / (float) z);
+ A t = baz (t, v, i / (float) z);
+ for (int j = 0; j < 7; j++)
+ x[i * y + j] = baz (s, t, j / (float) y);
+ }
+ return x;
+}
+
+/* { dg-final { scan-assembler-not "%mm" } } */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+
+template <typename> struct A {
+ unsigned _width, _height, _depth, _spectrum;
+ template <typename t> A(t p1) {
+ int a = p1.size();
+ if (a) {
+ _width = p1._width;
+ _depth = _height = _spectrum = p1._spectrum;
+ }
+ }
+ long size() { return (long)_width * _height * _depth * _spectrum; }
+};
+
+int d;
+void fn1(void *);
+A<int> *fn2();
+void fn3() {
+ int b;
+ for (;;) {
+ A<char> c(*fn2());
+ fn1(&c);
+ if (d || !b)
+ throw;
+ }
+}
+
+
+
+
--- /dev/null
+/* { dg-do run } */
+/* { dg-options "-O2 -fno-exceptions" } */
+struct S
+{
+ inline int fn1 () const { return s; }
+ __attribute__ ((noinline, noclone)) S *fn2 (int);
+ __attribute__ ((noinline, noclone)) void fn3 ();
+ __attribute__ ((noinline, noclone)) static S *fn4 (int);
+ S (int i) : s (i) {}
+ int s;
+};
+
+int a = 0;
+S *b = 0;
+
+S *
+S::fn2 (int i)
+{
+ a++;
+ if (a == 1)
+ return b;
+ if (a > 3)
+ __builtin_abort ();
+ b = this;
+ return new S (i + s);
+}
+
+S *
+S::fn4 (int i)
+{
+ b = new S (i);
+ return b;
+}
+
+void
+S::fn3 ()
+{
+ delete this;
+}
+
+void
+foo ()
+{
+ S *c = S::fn4 (20);
+ for (int i = 0; i < 2;)
+ {
+ S *d = c->fn2 (c->fn1 () + 10);
+ if (c != d)
+{
+ c->fn3 ();
+ c = d;
+ ++i;
+}
+ }
+ c->fn3 ();
+}
+
+int
+main ()
+{
+ foo ();
+}
--- /dev/null
+/* { dg-do run } */
+/* { dg-options "-O2 -fno-exceptions" } */
+
+struct S
+{
+ inline int fn1 () const { return s; }
+ __attribute__ ((noinline, noclone)) S *fn2 (int);
+ __attribute__ ((noinline, noclone)) void fn3 ();
+ __attribute__ ((noinline, noclone)) static S *fn4 (int);
+ S (int i) : s (i) {}
+ int s;
+};
+
+int a = 0;
+S *b = 0;
+
+S *
+S::fn2 (int i)
+{
+ a++;
+ if (a == 1)
+ return b;
+ if (a > 3)
+ __builtin_abort ();
+ b = this;
+ return new S (i + s);
+}
+
+S *
+S::fn4 (int i)
+{
+ b = new S (i);
+ return b;
+}
+
+void
+S::fn3 ()
+{
+ delete this;
+}
+
+void
+foo ()
+{
+ S *c = S::fn4 (20);
+ for (int i = 0; i < 2;)
+ {
+ S *d = c->fn2 (c->fn1 () + 10);
+ if (d != c)
+{
+ c->fn3 ();
+ c = d;
+ ++i;
+}
+ }
+ c->fn3 ();
+}
+
+int
+main ()
+{
+ foo ();
+}
--- /dev/null
+// PR c++/61647
+
+class XX;
+
+template<typename Container, typename Key>
+struct Accessor;
+
+template<typename Container, typename Key, typename KeyStore = Key>
+class Variant {
+protected:
+ KeyStore index;
+ Container state;
+public:
+ Variant(Container st, const Key& i) : index(i), state(st) {}
+
+ template<typename T>
+ operator T() const {
+ return Accessor<Container, KeyStore>::template get<T>(state, index);
+ }
+};
+
+class AutoCleanVariant : public Variant<XX*, int> {
+public:
+ AutoCleanVariant(XX* st, int i) : Variant<XX*,int>(st,i) {}
+
+ template<typename T>
+ operator T() const {
+ return Variant<XX*, int>::operator T();
+ }
+};
--- /dev/null
+// PR c++/60605
+
+template <typename T = int>
+struct Foo {
+ void bar() {
+ void bug();
+ }
+};
--- /dev/null
+// PR c++/61537
+// { dg-do compile }
+
+struct A {};
+
+template <typename T>
+struct B
+{
+ template <typename U>
+ void f(U, struct A);
+};
+
+template <typename T>
+template <typename U>
+void B<T>::f(U, struct A)
+{
+}
+
+int main()
+{
+ B<char> b;
+ b.f(42, A());
+}
--- /dev/null
+// PR c++/61500
+
+struct X {
+ int i;
+ int j;
+
+ int foo(int X::* ptr);
+
+ template <int X::* ptr>
+ int bar();
+};
+
+int X::foo(int X::* ptr) {
+ int* p = &(this->*ptr); // OK.
+ return *p;
+}
+
+template <int X::* ptr>
+int X::bar() {
+ int* p = &(this->*ptr); // gcc 4.9.0: OK in C++98 mode, fails in C++11 mode.
+ return *p;
+}
--- /dev/null
+// PR c++/61488
+
+struct A {
+ typedef int (A::*cont_func)();
+ template <A::cont_func> void wait(int);
+ int notify();
+
+ void fix() { wait<&A::notify>(0); } // OK
+ template <int> void repair() { wait<&A::notify>(0); }
+};
--- /dev/null
+// PR c++/61343
+
+// { dg-do run { target c++11 } }
+// { dg-add-options tls }
+// { dg-require-effective-target tls_runtime }
+
+struct Foo {
+ int value;
+
+ Foo() noexcept {
+ value = 12;
+ }
+};
+
+static thread_local Foo a{};
+
+static __attribute__((noinline)) void UseA() {
+ if (a.value != 12) __builtin_abort();
+}
+
+int main() {
+ UseA();
+}
--- /dev/null
+template <typename T>
+class MyClass
+{
+public:
+ __attribute__ ((__always_inline__)) inline MyClass () { ; }
+};
+
+extern template class MyClass<double>;
+
+void Func()
+{
+ MyClass<double> x;
+}
--- /dev/null
+// { dg-do compile }
+
+struct C
+{
+ double elems[3];
+};
+
+C
+foo ()
+{
+ C a;
+ double *f = a.elems;
+ int b;
+ for (; b;)
+ {
+ *f = 0;
+ ++f;
+ }
+ return a;
+}
+
+struct J
+{
+ C c;
+ __attribute__((always_inline)) J () : c (foo ()) {}
+};
+
+void
+bar ()
+{
+ J ();
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2 -fno-tree-vrp -std=c++11 -fno-strict-aliasing -fdump-tree-dom1" } */
+
+#include <stdio.h>
+struct Field {
+ virtual int Compare(void*, void*);
+};
+extern int NKF, NR;
+extern int idxs[];
+extern Field* the_field;
+extern int *incs;
+extern char** fptrs;
+inline int doCmp(int this_row_offset, int field_idx) {
+ void *p = fptrs[field_idx] + this_row_offset * incs[field_idx];
+ return the_field->Compare(p,0);
+}
+bool Test(void) {
+
+ int row_offset = 0;
+
+ for (; row_offset < NR; ++row_offset) {
+
+ bool is_different = false;
+ for (int j = 0; j < NKF ; ++j) {
+ int field_idx = idxs[j];
+ int cmp = doCmp(row_offset, field_idx);
+ fprintf (stderr, "cmp=%d\n",cmp);
+
+ if (cmp == 0) {
+ continue;
+ }
+ if (cmp > 0) {
+ is_different = true;
+ break;
+ } else {
+ fprintf (stderr, "Incorrect\n");
+ return false;
+ }
+ }
+ if (!is_different) {
+
+ return false;
+ }
+ }
+
+ return true;
+}
+
+// The block ending with cmp == 0 should not be threaded. ie,
+// there should be a single == 0 comparison in the dump file.
+
+// { dg-final { scan-tree-dump-times "== 0" 1 "dom1" } }
+// { dg-final { cleanup-tree-dump "dom1" } }
--- /dev/null
+// { dg-do compile }
+
+int a, b;
+typedef double (*NormFunc) (const int &);
+int &
+max (int &p1, int &p2)
+{
+ if (p1 < p2)
+ return p2;
+ return p1;
+}
+
+struct A
+{
+ int operator () (int p1, int p2)
+ {
+ return max (p1, p2);
+ }
+};
+template < class, class > double
+norm_ (const int &)
+{
+ char c, d;
+ A e;
+ for (; a; a++)
+ {
+ b = e (b, d);
+ b = e (b, c);
+ }
+}
+
+void
+norm ()
+{
+ static NormFunc f = norm_ < int, A >;
+ f = 0;
+}
+
+// { dg-final { cleanup-tree-dump "vect" } }
--- /dev/null
+/* PR tree-optimization/61684 */
+
+int a, c;
+static int *b = 0;
+short d;
+static short **e = 0;
+
+void
+foo ()
+{
+ for (; c < 1; c++)
+ ;
+ *e = &d;
+ a = d && (c && 1) & *b;
+}
--- /dev/null
+/* PR target/60941 */
+/* Reported by Martin Husemann <martin@netbsd.org> */
+
+extern void abort (void);
+
+static void __attribute__((noinline))
+set (unsigned long *l)
+{
+ *l = 31;
+}
+
+int main (void)
+{
+ unsigned long l;
+ int i;
+
+ set (&l);
+ i = (int) l;
+ l = (unsigned long)(2U << i);
+ if (l != 0)
+ abort ();
+ return 0;
+}
--- /dev/null
+/* PR tree-optimization/60960 */
+
+typedef unsigned char v4qi __attribute__ ((vector_size (4)));
+
+__attribute__((noinline, noclone)) v4qi
+f1 (v4qi v)
+{
+ return v / 2;
+}
+
+__attribute__((noinline, noclone)) v4qi
+f2 (v4qi v)
+{
+ return v / (v4qi) { 2, 2, 2, 2 };
+}
+
+__attribute__((noinline, noclone)) v4qi
+f3 (v4qi x, v4qi y)
+{
+ return x / y;
+}
+
+int
+main ()
+{
+ v4qi x = { 5, 5, 5, 5 };
+ v4qi y = { 2, 2, 2, 2 };
+ v4qi z = f1 (x);
+ if (__builtin_memcmp (&y, &z, sizeof (y)) != 0)
+ __builtin_abort ();
+ z = f2 (x);
+ if (__builtin_memcmp (&y, &z, sizeof (y)) != 0)
+ __builtin_abort ();
+ z = f3 (x, y);
+ if (__builtin_memcmp (&y, &z, sizeof (y)) != 0)
+ __builtin_abort ();
+ return 0;
+}
--- /dev/null
+#ifdef __INT32_TYPE__
+typedef __INT32_TYPE__ int32_t;
+#else
+typedef int int32_t;
+#endif
+
+#ifdef __UINT32_TYPE__
+typedef __UINT32_TYPE__ uint32_t;
+#else
+typedef unsigned uint32_t;
+#endif
+
+#define __fake_const_swab32(x) ((uint32_t)( \
+ (((uint32_t)(x) & (uint32_t)0x000000ffUL) << 24) | \
+ (((uint32_t)(x) & (uint32_t)0x0000ff00UL) << 8) | \
+ (((uint32_t)(x) & (uint32_t)0x00ff0000UL) >> 8) | \
+ (( (int32_t)(x) & (int32_t)0xff000000UL) >> 24)))
+
+/* Previous version of bswap optimization failed to consider sign extension
+ and as a result would replace an expression *not* doing a bswap by a
+ bswap. */
+
+__attribute__ ((noinline, noclone)) uint32_t
+fake_bswap32 (uint32_t in)
+{
+ return __fake_const_swab32 (in);
+}
+
+int
+main(void)
+{
+ if (sizeof (int32_t) * __CHAR_BIT__ != 32)
+ return 0;
+ if (sizeof (uint32_t) * __CHAR_BIT__ != 32)
+ return 0;
+ if (fake_bswap32 (0x87654321) != 0xffffff87)
+ __builtin_abort ();
+ return 0;
+}
--- /dev/null
+#ifdef __INT16_TYPE__
+typedef __INT16_TYPE__ int16_t;
+#else
+typedef short int16_t;
+#endif
+
+#ifdef __UINT32_TYPE__
+typedef __UINT32_TYPE__ uint32_t;
+#else
+typedef unsigned uint32_t;
+#endif
+
+#define __fake_const_swab32(x) ((uint32_t)( \
+ (((uint32_t) (x) & (uint32_t)0x000000ffUL) << 24) | \
+ (((uint32_t)(int16_t)(x) & (uint32_t)0x00ffff00UL) << 8) | \
+ (((uint32_t) (x) & (uint32_t)0x00ff0000UL) >> 8) | \
+ (((uint32_t) (x) & (uint32_t)0xff000000UL) >> 24)))
+
+
+/* Previous version of bswap optimization failed to consider sign extension
+ and as a result would replace an expression *not* doing a bswap by a
+ bswap. */
+
+__attribute__ ((noinline, noclone)) uint32_t
+fake_bswap32 (uint32_t in)
+{
+ return __fake_const_swab32 (in);
+}
+
+int
+main(void)
+{
+ if (sizeof (uint32_t) * __CHAR_BIT__ != 32)
+ return 0;
+ if (sizeof (int16_t) * __CHAR_BIT__ != 16)
+ return 0;
+ if (fake_bswap32 (0x81828384) != 0xff838281)
+ __builtin_abort ();
+ return 0;
+}
--- /dev/null
+short a = -1;
+int b;
+char c;
+
+int
+main ()
+{
+ c = a;
+ b = a | c;
+ if (b != -1)
+ __builtin_abort ();
+ return 0;
+}
--- /dev/null
+/* PR rtl-optimization/61673 */
+
+char e;
+
+__attribute__((noinline, noclone)) void
+bar (char x)
+{
+ if (x != 0x54 && x != (char) 0x87)
+ __builtin_abort ();
+}
+
+__attribute__((noinline, noclone)) void
+foo (const char *x)
+{
+ char d = x[0];
+ int c = d;
+ if ((c >= 0 && c <= 0x7f) == 0)
+ e = d;
+ bar (d);
+}
+
+__attribute__((noinline, noclone)) void
+baz (const char *x)
+{
+ char d = x[0];
+ int c = d;
+ if ((c >= 0 && c <= 0x7f) == 0)
+ e = d;
+}
+
+int
+main ()
+{
+ const char c[] = { 0x54, 0x87 };
+ e = 0x21;
+ foo (c);
+ if (e != 0x21)
+ __builtin_abort ();
+ foo (c + 1);
+ if (e != (char) 0x87)
+ __builtin_abort ();
+ e = 0x21;
+ baz (c);
+ if (e != 0x21)
+ __builtin_abort ();
+ baz (c + 1);
+ if (e != (char) 0x87)
+ __builtin_abort ();
+ return 0;
+}
--- /dev/null
+/* PR tree-optimization/61725 */
+
+int
+main ()
+{
+ int x;
+ for (x = -128; x <= 128; x++)
+ {
+ int a = __builtin_ffs (x);
+ if (x == 0 && a != 0)
+ __builtin_abort ();
+ }
+ return 0;
+}
--- /dev/null
+/* { dg-do run } */
+/* { dg-options "-O2 -fgraphite-identity" } */
+
+extern void abort (void);
+
+void __attribute__((noinline,noclone))
+f(int *limit, int minLen, int maxLen)
+{
+ int i;
+
+ for (i = minLen; i <= maxLen; i++) {
+ limit[i] = i;
+ }
+}
+
+int main()
+{
+ int limit[256], i;
+ f (limit, 0, 255);
+ for (i = 0; i < 256; ++i)
+ {
+ if (limit[i] != i)
+ abort ();
+ __asm__ volatile ("" : : : "memory");
+ }
+ return 0;
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2 -floop-interchange" } */
+
+int kd;
+
+void
+n2(void)
+{
+ static int so;
+ static short int i5;
+ int wj;
+ int *il;
+ int *nk = &so;
+ for (wj = 0; wj < 2; ++wj)
+ *nk = ((i5 += *il) || kd );
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2 -floop-interchange" } */
+
+void
+xl(void)
+{
+ static int j3;
+ for (j3 = 0; j3 < 1; ++j3) {
+ static int f2;
+ static int w7;
+ short int b5;
+ int ok;
+ f2 = (b5 += ok) ? (w7 = 0): (w7 ? 0 : (f2 = ok));
+ }
+}
--- /dev/null
+/* { dg-options "-O -fgraphite-identity" } */
+
+#include <setjmp.h>
+
+struct x;
+
+typedef struct x **(*a)(struct x *);
+
+struct x {
+ union {
+ struct {
+ union {
+ a *i;
+ } l;
+ int s;
+ } y;
+ } e;
+};
+
+jmp_buf c;
+
+void
+b(struct x *r)
+{
+ int f;
+ static int w = 0;
+ volatile jmp_buf m;
+ f = (*(((struct x *)r)->e.y.l.i[2]((struct x *)r)))->e.y.s;
+ if (w++ != 0)
+ __builtin_memcpy((char *)m, (const char *)c, sizeof(jmp_buf));
+ if (setjmp (c) == 0) {
+ int z;
+ for (z = 0; z < 0; ++z)
+ ;
+ }
+ d((const char *)m);
+}
--- /dev/null
+/* { dg-lto-do run } */
+/* { dg-extra-ld-options { -w } } */
+
+/* ??? lto.exp does not allow to scan for
+ :1:12: warning: type of 'x' does not match original declaration
+ extern int x[];
+ ^
+ :1:5: note: previously declared here
+ int x;
+ ^ */
+
+extern int x[];
+int *foo[] = { &x[0] };
+
+int main() { return *foo[0]; }
--- /dev/null
+// { dg-lto-do run }
+// { dg-lto-options { { -O2 -flto -fipa-pta } } }
+
+int __attribute__ ((__noinline__)) f (unsigned *p, int *x)
+{
+ int y = *p++ & 0xfff;
+ *x++ = y;
+ *x = *p;
+ return y;
+}
+
+int
+main ()
+{
+ unsigned u[2] = { 0x3aad, 0x5ad1 };
+ int x[2] = { 17689, 23456 };
+
+ if (f (u, x) != 0xaad || x[0] != 0xaad || x[1] != 0x5ad1)
+ __builtin_abort ();
+ return 0;
+}
--- /dev/null
+/* { dg-lto-do link } */
+/* { dg-lto-options { { -fPIC -flto -flto-partition=1to1 } } } */
+/* { dg-extra-ld-options { -shared } } */
+
+static void *master;
+void *foo () { return master; }
--- /dev/null
+extern void *master;
+void *bar () { return master; }
--- /dev/null
+/* PR tree-optimization/57233 */
+/* { dg-do run { target { ilp32 || lp64 } } } */
+/* { dg-options "-O2" } */
+
+typedef unsigned V4 __attribute__((vector_size(4 * sizeof (int))));
+typedef unsigned V8 __attribute__((vector_size(8 * sizeof (int))));
+typedef unsigned V16 __attribute__((vector_size(16 * sizeof (int))));
+V4 a, b, g;
+V8 c, d, h;
+V16 e, f, j;
+
+__attribute__((noinline)) void
+f1 (void)
+{
+ a = (a << 2) | (a >> 30);
+}
+
+__attribute__((noinline)) void
+f2 (void)
+{
+ a = (a << 30) | (a >> 2);
+}
+
+__attribute__((noinline)) void
+f3 (void)
+{
+ a = (a << b) | (a >> (32 - b));
+}
+
+__attribute__((noinline, noclone)) void
+f4 (int x)
+{
+ a = (a << x) | (a >> (32 - x));
+}
+
+__attribute__((noinline)) void
+f5 (void)
+{
+ c = (c << 2) | (c >> 30);
+}
+
+__attribute__((noinline)) void
+f6 (void)
+{
+ c = (c << 30) | (c >> 2);
+}
+
+__attribute__((noinline)) void
+f7 (void)
+{
+ c = (c << d) | (c >> (32 - d));
+}
+
+__attribute__((noinline, noclone)) void
+f8 (int x)
+{
+ c = (c << x) | (c >> (32 - x));
+}
+
+__attribute__((noinline)) void
+f9 (void)
+{
+ e = (e << 2) | (e >> 30);
+}
+
+__attribute__((noinline)) void
+f10 (void)
+{
+ e = (e << 30) | (e >> 2);
+}
+
+__attribute__((noinline)) void
+f11 (void)
+{
+ e = (e << f) | (e >> (32 - f));
+}
+
+__attribute__((noinline, noclone)) void
+f12 (int x)
+{
+ e = (e << x) | (e >> (32 - x));
+}
+
+unsigned
+r (void)
+{
+ static unsigned x = 0xdeadbeefU;
+ static unsigned y = 0x12347654U;
+ static unsigned z = 0x1a2b3c4dU;
+ static unsigned w = 0x87654321U;
+ unsigned t = x ^ (x << 11);
+ x = y;
+ y = z;
+ z = w;
+ w = w ^ (w >> 19) ^ t ^ (t >> 8);
+ return w;
+}
+
+void
+init (unsigned int *p, int count, int mod)
+{
+ int i;
+ for (i = 0; i < count; i++)
+ {
+ unsigned int v = r ();
+ if (mod)
+ v = (v % 31) + 1;
+ p[i] = v;
+ }
+}
+
+void
+check (unsigned int *p, unsigned int *q, int count, unsigned int *s, int ss)
+{
+ int i;
+ for (i = 0; i < count; i++)
+ {
+ if (s)
+ ss = s[i];
+ if (p[i] != ((q[i] << ss) | (q[i] >> (32 - ss))))
+ __builtin_abort ();
+ }
+}
+
+int
+main ()
+{
+ init ((unsigned int *) &a, 4, 0);
+ init ((unsigned int *) &b, 4, 1);
+ init ((unsigned int *) &c, 8, 0);
+ init ((unsigned int *) &d, 8, 1);
+ init ((unsigned int *) &e, 16, 0);
+ init ((unsigned int *) &f, 16, 1);
+ g = a;
+ h = c;
+ j = e;
+ f1 ();
+ f5 ();
+ f9 ();
+ check ((unsigned int *) &a, (unsigned int *) &g, 4, 0, 2);
+ check ((unsigned int *) &c, (unsigned int *) &h, 8, 0, 2);
+ check ((unsigned int *) &e, (unsigned int *) &j, 16, 0, 2);
+ g = a;
+ h = c;
+ j = e;
+ f2 ();
+ f6 ();
+ f10 ();
+ check ((unsigned int *) &a, (unsigned int *) &g, 4, 0, 30);
+ check ((unsigned int *) &c, (unsigned int *) &h, 8, 0, 30);
+ check ((unsigned int *) &e, (unsigned int *) &j, 16, 0, 30);
+ g = a;
+ h = c;
+ j = e;
+ f3 ();
+ f7 ();
+ f11 ();
+ check ((unsigned int *) &a, (unsigned int *) &g, 4, (unsigned int *) &b, 0);
+ check ((unsigned int *) &c, (unsigned int *) &h, 8, (unsigned int *) &d, 0);
+ check ((unsigned int *) &e, (unsigned int *) &j, 16, (unsigned int *) &f, 0);
+ g = a;
+ h = c;
+ j = e;
+ f4 (5);
+ f8 (5);
+ f12 (5);
+ check ((unsigned int *) &a, (unsigned int *) &g, 4, 0, 5);
+ check ((unsigned int *) &c, (unsigned int *) &h, 8, 0, 5);
+ check ((unsigned int *) &e, (unsigned int *) &j, 16, 0, 5);
+ return 0;
+}
--- /dev/null
+/* PR tree-optimization/60844 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -g" } */
+/* { dg-additional-options "-mtune=atom" { target { i?86-*-* x86_64-*-* } } } */
+
+void
+foo (int *x, int y, int z)
+{
+ int b, c = x[0], d = x[1];
+ for (b = 0; b < 1; b++)
+ {
+ int e = (y ? 1 : 0) | (d ? 2 : 0) | (z ? 1 : 0);
+ e |= (c ? 2 : 0) | ((1 >> b) ? 1 : 0);
+ x[2 + b] = e;
+ }
+}
--- /dev/null
+/* { dg-do compile { target powerpc*-*-* ia64-*-* x86_64-*-* } } */
+/* { dg-options "-O -fselective-scheduling -fno-if-conversion -fschedule-insns" } */
+
+int n;
+
+void
+foo (int w, int **dnroot, int **dn)
+{
+ int *child;
+ int *xchild = xchild;
+ for (; w < n; w++)
+ if (!dnroot)
+ {
+ dnroot = dn;
+ for (child = *dn; child; child = xchild)
+ ;
+ }
+}
--- /dev/null
+/* { dg-do run } */
+/* { dg-options "-fstrict-overflow" } */
+
+int main ()
+{
+ int a = 0;
+ int b = __INT_MAX__;
+ int t = (a - 2) > (b - 1);
+ if (t != 0)
+ __builtin_abort();
+ return 0;
+}
--- /dev/null
+/* PR c/61053 */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-options "-std=c11 -pedantic-errors" } */
+
+_Alignas (char) char cc;
+_Alignas (short int) char cs;
+_Alignas (int) char ci;
+_Alignas (long int) char cl;
+_Alignas (long long int) char cll;
+_Alignas (float) char cf;
+_Alignas (double) char cd;
+_Alignas (long double) char cld;
+
+_Alignas (char) short int sc; /* { dg-error "cannot reduce alignment" } */
+_Alignas (short int) short int ss;
+_Alignas (int) short int si;
+_Alignas (long int) short int sl;
+_Alignas (long long int) short int sll;
+_Alignas (float) short int sf;
+_Alignas (double) short int sd;
+_Alignas (long double) short int sld;
+
+_Alignas (char) int ic; /* { dg-error "cannot reduce alignment" } */
+_Alignas (short int) int is; /* { dg-error "cannot reduce alignment" } */
+_Alignas (int) int ii;
+_Alignas (long int) int il;
+_Alignas (long long int) int ill;
+_Alignas (float) int if_;
+_Alignas (double) int id;
+_Alignas (long double) int ild;
+
+_Alignas (char) long int lic; /* { dg-error "cannot reduce alignment" } */
+_Alignas (short int) long int lis; /* { dg-error "cannot reduce alignment" } */
+_Alignas (int) long int lii; /* { dg-error "cannot reduce alignment" "" { target { ! { ia32 } } } } */
+_Alignas (long int) long int lil;
+_Alignas (long long int) long int lill;
+_Alignas (float) long int lif; /* { dg-error "cannot reduce alignment" "" { target { ! { ia32 } } } } */
+_Alignas (double) long int lid;
+_Alignas (long double) long int lild;
+
+_Alignas (char) long long int llic; /* { dg-error "cannot reduce alignment" } */
+_Alignas (short int) long long int llis; /* { dg-error "cannot reduce alignment" } */
+_Alignas (int) long long int llii; /* { dg-error "cannot reduce alignment" "" { target { ! { ia32 } } } } */
+_Alignas (long int) long long int llil;
+_Alignas (long long int) long long int llill;
+_Alignas (float) long long int llif; /* { dg-error "cannot reduce alignment" "" { target { ! { ia32 } } } } */
+_Alignas (double) long long int llid;
+_Alignas (long double) long long int llild;
+
+_Alignas (char) float fc; /* { dg-error "cannot reduce alignment" } */
+_Alignas (short int) float fs; /* { dg-error "cannot reduce alignment" } */
+_Alignas (int) float fi;
+_Alignas (long int) float fl;
+_Alignas (long long int) float fll;
+_Alignas (float) float ff;
+_Alignas (double) float fd;
+_Alignas (long double) float fld;
+
+_Alignas (char) double dc; /* { dg-error "cannot reduce alignment" } */
+_Alignas (short int) double ds; /* { dg-error "cannot reduce alignment" } */
+_Alignas (int) double di; /* { dg-error "cannot reduce alignment" "" { target { ! { ia32 } } } } */
+_Alignas (long int) double dl;
+_Alignas (long long int) double dll;
+_Alignas (float) double df; /* { dg-error "cannot reduce alignment" "" { target { ! { ia32 } } } } */
+_Alignas (double) double dd;
+_Alignas (long double) double dld;
+
+_Alignas (char) long double ldc; /* { dg-error "cannot reduce alignment" } */
+_Alignas (short int) long double lds; /* { dg-error "cannot reduce alignment" } */
+_Alignas (int) long double ldi; /* { dg-error "cannot reduce alignment" "" { target { ! { ia32 } } } } */
+_Alignas (long int) long double ldl; /* { dg-error "cannot reduce alignment" "" { target { ! { ia32 } } } } */
+_Alignas (long long int) long double ldll; /* { dg-error "cannot reduce alignment" "" { target { ! { ia32 } } } } */
+_Alignas (float) long double ldf; /* { dg-error "cannot reduce alignment" "" { target { ! { ia32 } } } } */
+_Alignas (double) long double ldd; /* { dg-error "cannot reduce alignment" "" { target { ! { ia32 } } } } */
+_Alignas (long double) long double ldld;
--- /dev/null
+/* PR target/61060 */
+/* { dg-do compile } */
+/* { dg-options "-O0 -ftree-ter" } */
+
+typedef __SIZE_TYPE__ size_t;
+
+extern inline __attribute__ ((gnu_inline, always_inline, artificial))
+void *memset (void *dest, int ch, size_t len)
+{
+ return __builtin_memset (dest, ch, len);
+}
+
+char buf[10];
+
+void
+foo (void)
+{
+ memset (buf, sizeof (buf), 0);
+}
--- /dev/null
+/* PR tree-optimization/61158 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-original" } */
+
+unsigned long long
+foo (unsigned int x)
+{
+ return ((unsigned long long) x & 0x00ff000000000000ULL) >> 40;
+}
+
+/* { dg-final { scan-tree-dump "return 0;" "original" { target { ilp32 || lp64 } } } } */
+/* { dg-final { cleanup-tree-dump "original" } } */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2 -fcompare-debug" } */
+
+void
+f1 (int n, int b)
+{
+ extern void f2 (int);
+ int j;
+
+ if (b)
+ n = 1;
+
+ if (n < 1)
+ __builtin_unreachable ();
+
+ for (j = 0; j < n; j++)
+ f2 (j);
+}
--- /dev/null
+/* { dg-do compile } */
+
+union U {
+ double val;
+ union U *ptr;
+};
+
+union U *d;
+double a;
+int b;
+int c;
+
+static void fn1(union U *p1, int p2, _Bool p3)
+{
+ union U *e;
+
+ if (p2 == 0)
+ a = ((union U*)((unsigned long)p1 & ~1))->val;
+
+ if (b) {
+ e = p1;
+ } else if (c) {
+ e = ((union U*)((unsigned long)p1 & ~1))->ptr;
+ d = e;
+ } else {
+ e = 0;
+ d = ((union U*)0)->ptr;
+ }
+
+ fn1 (e, 0, 0);
+ fn1 (0, 0, p3);
+}
+
+void fn2 (void)
+{
+ fn1 (0, 0, 0);
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-additional-options "-fno-tree-ch -fno-tree-cselim -fno-tree-dominator-opts" } */
+
+int a, b, c, d, e, f;
+
+void foo (int x)
+{
+ for (;;)
+ {
+ int g = c;
+ if (x)
+ {
+ if (e)
+ while (a)
+ --f;
+ }
+ for (b = 5; b; b--)
+ {
+ }
+ if (!g)
+ x = 0;
+ }
+}
--- /dev/null
+/* { dg-do compile } */
+
+extern int a, b, k, q;
+
+void
+foo ()
+{
+ if (a)
+ {
+ while (q)
+ {
+ lbl:
+ if (a)
+ {
+ a = 0;
+ goto lbl;
+ }
+ }
+ b = k;
+ }
+ goto lbl;
+}
--- /dev/null
+/* { dg-do run } */
+
+int x = 1;
+
+__attribute__((noinline, noclone)) void
+foo (unsigned long long t)
+{
+ asm volatile ("" : : "r" (&t));
+ if (t == 1)
+ __builtin_abort ();
+}
+
+int
+main ()
+{
+#if __SIZEOF_LONG_LONG__ >= 8
+ unsigned long long t = 0xffffffffffffffffULL * (0xffffffffUL * x);
+ if (t != 0xffffffff00000001ULL)
+ foo (t);;
+#endif
+ return 0;
+}
--- /dev/null
+/* { dg-do compile } */
+
+int main (void)
+{
+ int a = 0;
+ unsigned b = (a * 64 & 192) | 63U;
+ return 0;
+}
--- /dev/null
+/* { dg-do run } */
+
+int a, b = 1, c, d, e, f, g;
+
+int
+fn1 ()
+{
+ int h;
+ for (;;)
+ {
+ g = b;
+ g = g ? 0 : 1 % g;
+ e = a + 1;
+ for (; d < 1; d = e)
+ {
+ if (f == 0)
+ h = 0;
+ else
+ h = 1 % f;
+ if (f < 1)
+ c = 0;
+ else if (h)
+ break;
+ }
+ if (b)
+ return 0;
+ }
+}
+
+int
+main ()
+{
+ fn1 ();
+ return 0;
+}
--- /dev/null
+/* { dg-do run } */
+
+int a, b;
+short c, d;
+char e, f;
+
+int
+fn1 (int p1, char p2)
+{
+ return p1 || p2 ? 0 : p2;
+}
+
+void
+fn2 ()
+{
+ for (; a;)
+ {
+ int g;
+ g = c = e;
+ for (; a;)
+ b = fn1 (g = d = e, g);
+ f = g;
+ }
+}
+
+int
+main ()
+{
+ fn2 ();
+ return 0;
+}
--- /dev/null
+/* { dg-do run } */
+
+extern void abort (void);
+
+int a = 1, *e = &a, **f = &e, *l, *p, j;
+static int b;
+long d;
+short g;
+
+void
+fn1 (int *p)
+{
+ int m;
+ if (!(*p & j))
+ {
+ int *n = &m;
+ for (d = 6; d; d--)
+ {
+ for (g = 0; g < 1; g++)
+ {
+ n = l = *f;
+ b = *p;
+ }
+ *n = 0;
+ }
+ }
+}
+
+int
+main ()
+{
+ p = *f;
+ fn1 (p);
+ if (b != 0)
+ abort ();
+ return 0;
+}
/* { dg-do compile } */
-/* { dg-options "-O -fdump-tree-fre-details" } */
+/* { dg-options "-O -fdump-tree-fre1-details" } */
extern int posix_memalign(void **memptr,
__SIZE_TYPE__ alignment, __SIZE_TYPE__ size);
--- /dev/null
+/* PR target/29776 */
+/* PR tree-optimization/61725 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-vrp1" } */
+/* { dg-final { scan-tree-dump-not "link_error" "vrp1"} } */
+/* { dg-final { cleanup-tree-dump "vrp1" } } */
+
+#define A(fn, arg, min, max) \
+ if (__builtin_##fn (arg) < min || __builtin_##fn (arg) > max) \
+ link_error ();
+#define B(fn, min, max) \
+ A (fn, a, min, max) A (fn##l, b, min, max) A (fn##ll, c, min, max)
+#define C(fn, min, sub) \
+ A (fn, a, min, ((int) sizeof (a) * __CHAR_BIT__ - sub)) \
+ A (fn##l, b, min, ((int) sizeof (b) * __CHAR_BIT__ - sub)) \
+ A (fn##ll, c, min, ((int) sizeof (c) * __CHAR_BIT__ - sub))
+
+extern void link_error (void);
+
+unsigned int d;
+unsigned long e;
+unsigned long long f;
+
+void
+foo (int a, long b, long long c)
+{
+ C (ffs, 0, 0)
+ a &= 63; b &= 63; c &= 63;
+ B (ffs, 0, 6)
+ a++; b++; c++;
+ B (ffs, 1, 7)
+ a -= 2; b -= 2; c -= 2;
+ C (ffs, 0, 0)
+ a -= 63; b -= 63; c -= 63;
+ C (ffs, 1, 0)
+}
--- /dev/null
+/* Test qualifier discard of typeof for atomic types. */
+/* { dg-do compile } */
+/* { dg-options "-std=c11" } */
+
+extern int i;
+
+extern int * p;
+
+extern int _Atomic const ci;
+extern __typeof (ci) i;
+
+extern int _Atomic volatile vi;
+extern __typeof (vi) i;
+
+extern int * _Atomic restrict ri;
+extern __typeof (ri) p;
+
+void f(void)
+{
+ __auto_type aci = ci;
+ int *paci = &aci;
+
+ __auto_type avi = vi;
+ int *pavi = &avi;
+
+ __auto_type ari = ri;
+ int **pari = &ari;
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Wall -Wno-unused -Wextra" } */
+
+void foo(int x) { }
out[i] = (ovec[i] = in[i]);
out[num] = ovec[num/2];
}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-additional-options "-ffast-math" } */
+
+/* This testcase shouldn't consume much memory or produce a 1GB vectorizer
+ dump file due to SLP tree explosion. */
+
+struct S { int f1, f2, f3, f4; } a;
+struct T { short f3, f2, f1, f4; };
+int b, c, d, e, f, g;
+unsigned long z;
+
+void
+foo (struct T *p, struct T *q, int x, int w)
+{
+ for (; x; x++)
+ {
+ struct S h;
+ int i;
+ struct T j;
+ struct T *r;
+ h = a;
+ g = 0;
+ r = p + 2 * (c + 4) + 1;
+ j = *r;
+ r = p;
+ f = r->f1 - 1;
+ b = +1.0 + f * f;
+ i = (r->f2 + j.f2) / 2;
+ f = r->f3 - 1;
+ b += 1.0 - i * f * f;
+ f = r->f4 - 1;
+ if (b)
+ b += -1.0 - i * f;
+ if (b / w)
+ {
+ h.f1 += 8.0 * r->f1;
+ h.f2 += 8.0 * r->f2;
+ h.f3 += 8.0 * r->f3;
+ h.f4 += 8.0 * r->f4;
+ g = 1;
+ }
+ r++;
+ f = r->f1;
+ i = (r->f2 + j.f2) / 2;
+ f = r->f3 - 1;
+ b += 1.0 - i * f * f;
+ i = (r->f4);
+ if (b * 65535UL / w)
+ {
+ h.f1 += 10.0 * r->f1;
+ h.f2 += 10.0 * r->f2;
+ h.f3 += 10.0 * r->f3;
+ h.f4 += 10.0 * r->f4;
+ g += 10.0;
+ }
+ r++;
+ f = r->f1;
+ z = 5UL * i;
+ f = r->f2;
+ i = (r->f3 + j.f3) / 2;
+ b = -i * f * f;
+ i = (r->f4 + j.f4) / 2;
+ if (b * 65535UL / 25.0f)
+ {
+ h.f1 += 8.0 * r->f1;
+ h.f2 += 8.0 * r->f2;
+ h.f3 += 8.0 * r->f3;
+ h.f4 += 8.0 * r->f4;
+ g += 8.0;
+ }
+ r++;
+ f = r->f1 - j.f1;
+ b = 1 * 2.0 * i * f * f;
+ f = r->f2;
+ b += 4.0 * f;
+ i = r->f3 / 2;
+ f = r->f4 - 1;
+ if (b * 1)
+ {
+ h.f1 += 8.0 * r->f1;
+ h.f2 += 8.0 * r->f2;
+ h.f3 += 8.0 * r->f3;
+ h.f4 += 8.0 * r->f4;
+ g += 8.0;
+ }
+ b = 4.0 * 1 * f;
+ if (b * 65535UL / 25.0f)
+ {
+ h.f1 += 20.0 * r->f1;
+ h.f2 += 20.0 * r->f2;
+ h.f3 += 20.0 * r->f3;
+ h.f4 += 20.0 * r->f4;
+ g += 20.0;
+ }
+ b = 5 * (0.0 - i);
+ if (b < 0)
+ {
+ h.f1 += 8.0 * r->f1;
+ h.f2 += 8.0 * r->f2;
+ h.f3 += 8.0 * r->f3;
+ h.f4 += 8.0 * r->f4;
+ g += 8.0;
+ }
+ r = p + 2 * (c + 4);
+ i = (r->f1 + j.f1);
+ b = 1 * 2.0 * i * 1;
+ f = r->f2 - 1;
+ i = (r->f3 + j.f3) / 2;
+ b = 5 * (0.0 - i) * f * f;
+ i = (r->f4 + j.f4) / 2;
+ if (b * 65535UL / 25.0f)
+ {
+ h.f1 += 10.0 * r->f1;
+ h.f2 += 10.0 * r->f2;
+ h.f3 += 10.0 * r->f3;
+ h.f4 += 10.0 * r->f4;
+ g += 10.0;
+ }
+ r++;
+ f = r->f1;
+ b = 5UL * i * f;
+ i = (r->f2 + j.f2) / 2;
+ f = r->f3 - 1;
+ b = 5 * (0.0 - i) * f * f;
+ f = r->f4 - 1;
+ if (b * 65535UL / 25.0f)
+ {
+ h.f1 += 40.0 * r->f1;
+ h.f2 += 40.0 * r->f2;
+ h.f3 += 40.0 * r->f3;
+ h.f4 += 40.0 * r->f4;
+ g += 40.0;
+ }
+ r++;
+ i = (r->f1 + j.f1);
+ b = 5 * i * f;
+ f = r->f2;
+ b = 4.0 * f * f;
+ f = r->f3;
+ i = (r->f4 + j.f4) / 2;
+ b = 5 * (0.0 - i) * f * f;
+ if (b * 25.0f)
+ {
+ h.f1 += 8.0 * r->f1;
+ h.f2 += 8.0 * r->f2;
+ h.f3 += 8.0 * r->f3;
+ h.f4 += 8.0 * r->f4;
+ g += 8.0;
+ }
+ r = p + 4 * (c + 4);
+ i = r->f1 / 2;
+ b = 5 * (1.0 + i);
+ i = r->f2 + j.f2;
+ f = r->f3 - 1;
+ b = 5 * (0.0 - i) * f * f;
+ i = (r->f4 + j.f4) / 2;
+ if (b * 65535UL / 25.0f)
+ {
+ h.f1 += 5.0 * r->f1;
+ h.f2 += 5.0 * r->f2;
+ h.f3 += 5.0 * r->f3;
+ h.f4 += 5.0 * r->f4;
+ g += 5.0;
+ }
+ b = 5 * (1.0 + i);
+ if (b < 0)
+ {
+ h.f1 += 5.0 * r->f1;
+ h.f2 += 5.0 * r->f2;
+ h.f3 += 5.0 * r->f3;
+ h.f4 += 5.0 * r->f4;
+ g += 5.0;
+ }
+ q->f1 = (h.f1 + g / 2 - 1) / g;
+ q->f2 = (h.f2 + g / 2 - 1) / g;
+ q->f3 = (h.f3 + g / 2 - 1) / g;
+ q->f4 = (h.f4 + g / 2 - 1) / g;
+ p++;
+ q++;
+ }
+}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */
--- /dev/null
+/* { dg-do run } */
+
+#include "tree-vect.h"
+
+double v[4096][4];
+
+__attribute__((noinline, noclone)) void
+bar (double p[][4])
+{
+ int i;
+ double d = 172.0;
+ for (i = 0; i < 4096; i++)
+ {
+ if (p[i][0] != 6.0 || p[i][1] != 6.0 || p[i][2] != 10.0)
+ __builtin_abort ();
+ if (__builtin_fabs (p[i][3] - d) > 0.25)
+ __builtin_abort ();
+ }
+}
+
+__attribute__((noinline, noclone)) void
+foo (void)
+{
+ int i;
+ double w[4096][4], t;
+ for (i = 0; i < 4096; i++)
+ {
+ w[i][0] = v[i][0] + 2.0;
+ w[i][1] = v[i][1] + 1.0;
+ w[i][2] = v[i][2] + 4.0;
+ w[i][3] = (w[i][0] * w[i][0] + w[i][1] * w[i][1] + w[i][2] * w[i][2]);
+ }
+ bar (w);
+}
+
+int
+main ()
+{
+ int i;
+
+ check_vect ();
+
+ for (i = 0; i < 4096; i++)
+ {
+ v[i][0] = 4.0;
+ v[i][1] = 5.0;
+ v[i][2] = 6.0;
+ }
+ foo ();
+ return 0;
+}
--- /dev/null
+/* PR target/59843 ICE on function taking/returning vector of one float64_t. */
+
+/* { dg-do compile } */
+/* { dg-options "-Warray-bounds -O2 -fno-inline -std=c99" } */
+
+#define TEST(BASETYPE, VECTYPE, SUFFIX) \
+ typedef BASETYPE VECTYPE \
+ __attribute__ ((__vector_size__ (sizeof (BASETYPE)))); \
+ VECTYPE \
+ test_vadd_##SUFFIX (VECTYPE a, VECTYPE b) \
+ { \
+ return a + b; \
+ } \
+ \
+ void \
+ test_##SUFFIX (BASETYPE val) \
+ { \
+ VECTYPE var = { val }; \
+ BASETYPE v0 = var[0]; \
+ BASETYPE v1 = var[1]; /* { dg-warning "index value is out of bound" } */ \
+ }
+
+TEST (double, float64x1_t, f64)
+
+/* Original bug was for above type;
+ in a nod to completeness, test other types too. */
+
+TEST (long long, int64x1_t, s64)
+
+TEST (float, float32x1_t, f32)
+
+TEST (long, longx1_t, l)
+
+TEST (int, intx1_t, i)
+
+TEST (short, int16x1_t, s16)
+
+TEST (char, int8x1_t, s8)
# Load support procs.
load_lib gcc-dg.exp
+load_lib clearcap.exp
# Set up flags used for tests that don't specify options.
global DEFAULT_VECTCFLAGS
# These flags are used for all targets.
lappend DEFAULT_VECTCFLAGS "-ftree-vectorize" "-fno-vect-cost-model" "-fno-common"
-# If the linker used understands -M <mapfile>, pass it to clear hardware
-# capabilities set by the Sun assembler.
-# Try mapfile syntax v2 first which is the only way to clear hwcap_2 flags.
-set clearcap_ldflags "-Wl,-M,$srcdir/gcc.target/i386/clearcapv2.map"
-
-if ![check_no_compiler_messages mapfilev2 executable {
- int main (void) { return 0; }
-} $clearcap_ldflags ] {
- # If this doesn't work, fall back to the less capable v1 syntax.
- set clearcap_ldflags "-Wl,-M,$srcdir/gcc.target/i386/clearcap.map"
-
- if ![check_no_compiler_messages mapfile executable {
- int main (void) { return 0; }
- } $clearcap_ldflags ] {
- unset clearcap_ldflags
- }
-}
-
-if [info exists clearcap_ldflags] {
- lappend DEFAULT_VECTCFLAGS $clearcap_ldflags
-}
-
# Initialize `dg'.
dg-init
+clearcap-init
global VEC_FLAGS
set VEC_FLAGS $DEFAULT_VECTCFLAGS
set dg-do-what-default ${save-dg-do-what-default}
# All done.
+clearcap-finish
dg-finish
vector long long vlb = {0,1};
vector double vda = {-2.0,-1.0};
vector double vdb = {0.0,1.0};
+ vector unsigned int vuia = {0,1,2,3};
+ vector unsigned int vuib = {4,5,6,7};
+ vector signed int vsia = {-4,-3,-2,-1};
+ vector signed int vsib = {0,1,2,3};
+ vector float vfa = {-4.0,-3.0,-2.0,-1.0};
+ vector float vfb = {0.0,1.0,2.0,3.0};
/* Result vectors. */
vector long long vlh, vll;
vector double vdh, vdl;
+ vector unsigned int vuih, vuil;
+ vector signed int vsih, vsil;
+ vector float vfh, vfl;
/* Expected result vectors. */
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
vector long long vlrl = {0,-2};
vector double vdrh = {1.0,-1.0};
vector double vdrl = {0.0,-2.0};
+ vector unsigned int vuirh = {6,2,7,3};
+ vector unsigned int vuirl = {4,0,5,1};
+ vector signed int vsirh = {2,-2,3,-1};
+ vector signed int vsirl = {0,-4,1,-3};
+ vector float vfrh = {2.0,-2.0,3.0,-1.0};
+ vector float vfrl = {0.0,-4.0,1.0,-3.0};
#else
vector long long vlrh = {-2,0};
vector long long vlrl = {-1,1};
vector double vdrh = {-2.0,0.0};
vector double vdrl = {-1.0,1.0};
+ vector unsigned int vuirh = {0,4,1,5};
+ vector unsigned int vuirl = {2,6,3,7};
+ vector signed int vsirh = {-4,0,-3,1};
+ vector signed int vsirl = {-2,2,-1,3};
+ vector float vfrh = {-4.0,0.0,-3.0,1.0};
+ vector float vfrl = {-2.0,2.0,-1.0,3.0};
#endif
vlh = vec_mergeh (vla, vlb);
vll = vec_mergel (vla, vlb);
vdh = vec_mergeh (vda, vdb);
vdl = vec_mergel (vda, vdb);
+ vuih = vec_mergeh (vuia, vuib);
+ vuil = vec_mergel (vuia, vuib);
+ vsih = vec_mergeh (vsia, vsib);
+ vsil = vec_mergel (vsia, vsib);
+ vfh = vec_mergeh (vfa, vfb );
+ vfl = vec_mergel (vfa, vfb );
check (vec_long_long_eq (vlh, vlrh), "vlh");
check (vec_long_long_eq (vll, vlrl), "vll");
check (vec_double_eq (vdh, vdrh), "vdh" );
check (vec_double_eq (vdl, vdrl), "vdl" );
+ check (vec_all_eq (vuih, vuirh), "vuih");
+ check (vec_all_eq (vuil, vuirl), "vuil");
+ check (vec_all_eq (vsih, vsirh), "vsih");
+ check (vec_all_eq (vsil, vsirl), "vsil");
+ check (vec_all_eq (vfh, vfrh), "vfh");
+ check (vec_all_eq (vfl, vfrl), "vfl");
}
vector long long vlb = {0,1};
vector double vda = {-2.0,-1.0};
vector double vdb = {0.0,1.0};
+ vector unsigned int vuia = {0,1,2,3};
+ vector unsigned int vuib = {4,5,6,7};
+ vector signed int vsia = {-4,-3,-2,-1};
+ vector signed int vsib = {0,1,2,3};
+ vector float vfa = {-4.0,-3.0,-2.0,-1.0};
+ vector float vfb = {0.0,1.0,2.0,3.0};
/* Result vectors. */
vector long long vlh, vll;
vector double vdh, vdl;
+ vector unsigned int vuih, vuil;
+ vector signed int vsih, vsil;
+ vector float vfh, vfl;
/* Expected result vectors. */
vector long long vlrh = {-2,0};
vector long long vlrl = {-1,1};
vector double vdrh = {-2.0,0.0};
vector double vdrl = {-1.0,1.0};
+ vector unsigned int vuirh = {0,4,1,5};
+ vector unsigned int vuirl = {2,6,3,7};
+ vector signed int vsirh = {-4,0,-3,1};
+ vector signed int vsirl = {-2,2,-1,3};
+ vector float vfrh = {-4.0,0.0,-3.0,1.0};
+ vector float vfrl = {-2.0,2.0,-1.0,3.0};
vlh = vec_mergeh (vla, vlb);
vll = vec_mergel (vla, vlb);
vdh = vec_mergeh (vda, vdb);
vdl = vec_mergel (vda, vdb);
+ vuih = vec_mergeh (vuia, vuib);
+ vuil = vec_mergel (vuia, vuib);
+ vsih = vec_mergeh (vsia, vsib);
+ vsil = vec_mergel (vsia, vsib);
+ vfh = vec_mergeh (vfa, vfb );
+ vfl = vec_mergel (vfa, vfb );
check (vec_long_long_eq (vlh, vlrh), "vlh");
check (vec_long_long_eq (vll, vlrl), "vll");
check (vec_double_eq (vdh, vdrh), "vdh" );
check (vec_double_eq (vdl, vdrl), "vdl" );
+ check (vec_all_eq (vuih, vuirh), "vuih");
+ check (vec_all_eq (vuil, vuirl), "vuil");
+ check (vec_all_eq (vsih, vsirh), "vsih");
+ check (vec_all_eq (vsil, vsirl), "vsil");
+ check (vec_all_eq (vfh, vfrh), "vfh");
+ check (vec_all_eq (vfl, vfrl), "vfl");
}
float b;
};
+struct hfa_fx3_t
+{
+ float a;
+ float b;
+ float c;
+};
+
struct hfa_dx2_t
{
double a;
--- /dev/null
+/* Test AAPCS64 layout and __builtin_va_start.
+
+ Pass named HFA/HVA argument on stack. */
+
+/* { dg-do run { target aarch64*-*-* } } */
+
+#ifndef IN_FRAMEWORK
+#define AAPCS64_TEST_STDARG
+#define TESTFILE "va_arg-13.c"
+
+struct float_float_t
+{
+ float a;
+ float b;
+} float_float;
+
+union float_int_t
+{
+ float b8;
+ int b5;
+} float_int;
+
+#define HAS_DATA_INIT_FUNC
+void
+init_data ()
+{
+ float_float.a = 1.2f;
+ float_float.b = 2.2f;
+
+ float_int.b8 = 4983.80f;
+}
+
+#include "abitest.h"
+#else
+ ARG (float, 1.0f, S0, 0)
+ ARG (float, 2.0f, S1, 1)
+ ARG (float, 3.0f, S2, 2)
+ ARG (float, 4.0f, S3, 3)
+ ARG (float, 5.0f, S4, 4)
+ ARG (float, 6.0f, S5, 5)
+ ARG (float, 7.0f, S6, 6)
+ ARG (struct float_float_t, float_float, STACK, 7)
+ ARG (int, 9, W0, 8)
+ ARG (int, 10, W1, 9)
+ ARG (int, 11, W2, 10)
+ ARG (int, 12, W3, 11)
+ ARG (int, 13, W4, 12)
+ ARG (int, 14, W5, 13)
+ ARG (int, 15, W6, LAST_NAMED_ARG_ID)
+ DOTS
+ /* Note on the reason of using 'X7' instead of 'W7' here:
+ Using 'X7' makes sure the test works in the big-endian mode.
+ According to PCS rules B.4 and C.10, the size of float_int is rounded
+ to 8 bytes and prepared in the register X7 as if loaded via LDR from
+ the memory, with the content of the other 4 bytes unspecified. The
+ test framework will only compare the 4 relavent bytes. */
+ ANON (union float_int_t, float_int, X7, 15)
+ LAST_ANON (long long, 12683143434LL, STACK + 8, 16)
+#endif
--- /dev/null
+/* Test AAPCS64 layout and __builtin_va_start.
+
+ Pass named HFA/HVA argument on stack. */
+
+/* { dg-do run { target aarch64*-*-* } } */
+
+#ifndef IN_FRAMEWORK
+#define AAPCS64_TEST_STDARG
+#define TESTFILE "va_arg-14.c"
+#include "type-def.h"
+
+struct hfa_fx2_t hfa_fx2 = {1.2f, 2.2f};
+struct hfa_fx3_t hfa_fx3 = {3.2f, 4.2f, 5.2f};
+vf4_t float32x4 = {6.2f, 7.2f, 8.2f, 9.2f};
+vf4_t float32x4_2 = {10.2f, 11.2f, 12.2f, 13.2f};
+
+#include "abitest.h"
+#else
+ ARG (float, 1.0f, S0, 0)
+ ARG (float, 2.0f, S1, 1)
+ ARG (float, 3.0f, S2, 2)
+ ARG (float, 4.0f, S3, 3)
+ ARG (float, 5.0f, S4, 4)
+ ARG (float, 6.0f, S5, 5)
+ ARG (float, 7.0f, S6, 6)
+ ARG (struct hfa_fx3_t, hfa_fx3, STACK, 7)
+ /* Previous argument size has been rounded up to the nearest multiple of
+ 8 bytes. */
+ ARG (struct hfa_fx2_t, hfa_fx2, STACK + 16, 8)
+ /* NSAA is rounded up to the nearest natural alignment of float32x4. */
+ ARG (vf4_t, float32x4, STACK + 32, 9)
+ ARG (vf4_t, float32x4_2, STACK + 48, LAST_NAMED_ARG_ID)
+ DOTS
+ LAST_ANON (double, 123456789.987, STACK + 64, 11)
+#endif
--- /dev/null
+/* Test AAPCS64 layout and __builtin_va_start.
+
+ Pass named __128int argument on stack. */
+
+/* { dg-do run { target aarch64*-*-* } } */
+
+#ifndef IN_FRAMEWORK
+#define AAPCS64_TEST_STDARG
+#define TESTFILE "va_arg-15.c"
+#include "type-def.h"
+
+union int128_t qword;
+
+#define HAS_DATA_INIT_FUNC
+void
+init_data ()
+{
+ /* Init signed quad-word integer. */
+ qword.l64 = 0xfdb9753102468aceLL;
+ qword.h64 = 0xeca8642013579bdfLL;
+}
+
+#include "abitest.h"
+#else
+ ARG (int, 1, W0, 0)
+ ARG (int, 2, W1, 1)
+ ARG (int, 3, W2, 2)
+ ARG (int, 4, W3, 3)
+ ARG (int, 5, W4, 4)
+ ARG (int, 6, W5, 5)
+ ARG (int, 7, W6, 6)
+ ARG (__int128, qword.i, STACK, LAST_NAMED_ARG_ID)
+ DOTS
+#ifndef __AAPCS64_BIG_ENDIAN__
+ LAST_ANON (int, 8, STACK + 16, 8)
+#else
+ LAST_ANON (int, 8, STACK + 20, 8)
+#endif
+#endif
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+typedef unsigned int wchar_t;
+typedef long unsigned int size_t;
+
+size_t
+wcstombs(char *s , const wchar_t *pwcs , size_t n)
+{
+ int count = 0;
+
+ if (n != 0) {
+ do {
+ if ((*s++ = (char) *pwcs++) == 0)
+ break;
+ count++;
+ } while (--n != 0);
+ }
+ return count;
+}
/* { dg-final { scan-assembler-times "\\tsqdmlal\\ts\[0-9\]+, h\[0-9\]+, v" 1 } } */
int32x1_t
-test_vqdmlalh_lane_s16 (int32x1_t a, int16x1_t b, int16x8_t c)
+test_vqdmlalh_lane_s16 (int32x1_t a, int16x1_t b, int16x4_t c)
{
return vqdmlalh_lane_s16 (a, b, c, 3);
}
/* { dg-final { scan-assembler-times "\\tsqdmlal\\td\[0-9\]+, s\[0-9\]+, v" 1 } } */
int64x1_t
-test_vqdmlals_lane_s32 (int64x1_t a, int32x1_t b, int32x4_t c)
+test_vqdmlals_lane_s32 (int64x1_t a, int32x1_t b, int32x2_t c)
{
return vqdmlals_lane_s32 (a, b, c, 1);
}
/* { dg-final { scan-assembler-times "\\tsqdmlsl\\ts\[0-9\]+, h\[0-9\]+, v" 1 } } */
int32x1_t
-test_vqdmlslh_lane_s16 (int32x1_t a, int16x1_t b, int16x8_t c)
+test_vqdmlslh_lane_s16 (int32x1_t a, int16x1_t b, int16x4_t c)
{
return vqdmlslh_lane_s16 (a, b, c, 3);
}
/* { dg-final { scan-assembler-times "\\tsqdmlsl\\td\[0-9\]+, s\[0-9\]+, v" 1 } } */
int64x1_t
-test_vqdmlsls_lane_s32 (int64x1_t a, int32x1_t b, int32x4_t c)
+test_vqdmlsls_lane_s32 (int64x1_t a, int32x1_t b, int32x2_t c)
{
return vqdmlsls_lane_s32 (a, b, c, 1);
}
/* { dg-final { scan-assembler-times "\\tsqdmulh\\th\[0-9\]+, h\[0-9\]+, v" 1 } } */
int16x1_t
-test_vqdmulhh_lane_s16 (int16x1_t a, int16x8_t b)
+test_vqdmulhh_lane_s16 (int16x1_t a, int16x4_t b)
{
return vqdmulhh_lane_s16 (a, b, 3);
}
/* { dg-final { scan-assembler-times "\\tsqdmulh\\ts\[0-9\]+, s\[0-9\]+, v" 1 } } */
int32x1_t
-test_vqdmulhs_lane_s32 (int32x1_t a, int32x4_t b)
+test_vqdmulhs_lane_s32 (int32x1_t a, int32x2_t b)
{
- return vqdmulhs_lane_s32 (a, b, 3);
+ return vqdmulhs_lane_s32 (a, b, 1);
}
/* { dg-final { scan-assembler-times "\\tsqdmull\\ts\[0-9\]+, h\[0-9\]+, h\[0-9\]+" 1 } } */
/* { dg-final { scan-assembler-times "\\tsqdmull\\ts\[0-9\]+, h\[0-9\]+, v" 1 } } */
int32x1_t
-test_vqdmullh_lane_s16 (int16x1_t a, int16x8_t b)
+test_vqdmullh_lane_s16 (int16x1_t a, int16x4_t b)
{
return vqdmullh_lane_s16 (a, b, 3);
}
/* { dg-final { scan-assembler-times "\\tsqdmull\\td\[0-9\]+, s\[0-9\]+, v" 1 } } */
int64x1_t
-test_vqdmulls_lane_s32 (int32x1_t a, int32x4_t b)
+test_vqdmulls_lane_s32 (int32x1_t a, int32x2_t b)
{
return vqdmulls_lane_s32 (a, b, 1);
}
/* { dg-final { scan-assembler-times "\\tsqrdmulh\\th\[0-9\]+, h\[0-9\]+, v" 1 } } */
int16x1_t
-test_vqrdmulhh_lane_s16 (int16x1_t a, int16x8_t b)
+test_vqrdmulhh_lane_s16 (int16x1_t a, int16x4_t b)
{
- return vqrdmulhh_lane_s16 (a, b, 6);
+ return vqrdmulhh_lane_s16 (a, b, 3);
}
/* { dg-final { scan-assembler-times "\\tsqrdmulh\\ts\[0-9\]+, s\[0-9\]+, s\[0-9\]+" 1 } } */
/* { dg-final { scan-assembler-times "\\tsqrdmulh\\ts\[0-9\]+, s\[0-9\]+, v" 1 } } */
int32x1_t
-test_vqrdmulhs_lane_s32 (int32x1_t a, int32x4_t b)
+test_vqrdmulhs_lane_s32 (int32x1_t a, int32x2_t b)
{
- return vqrdmulhs_lane_s32 (a, b, 2);
+ return vqrdmulhs_lane_s32 (a, b, 1);
}
/* { dg-final { scan-assembler-times "\\tsuqadd\\tb\[0-9\]+" 1 } } */
/* { dg-do compile } */
/* { dg-options "-O2" } */
-#include "../../../config/aarch64/arm_neon.h"
+#include "arm_neon.h"
/* { dg-final { scan-assembler-times "\\tfmax\\tv\[0-9\]+\.2s, v\[0-9\].2s, v\[0-9\].2s" 1 } } */
/* { dg-final { scan-assembler-times "\\tsqdmlal2\\tv\[0-9\]+\.4s, v\[0-9\]+\.8h, v\[0-9\]+\.h" 3 } } */
int32x4_t
-test_vqdmlal_high_lane_s16 (int32x4_t a, int16x8_t b, int16x8_t c)
+test_vqdmlal_high_lane_s16 (int32x4_t a, int16x8_t b, int16x4_t c)
{
return vqdmlal_high_lane_s16 (a, b, c, 3);
}
/* { dg-final { scan-assembler-times "\\tsqdmlal2\\tv\[0-9\]+\.2d, v\[0-9\]+\.4s, v\[0-9\]+\.s" 3 } } */
int64x2_t
-test_vqdmlal_high_lane_s32 (int64x2_t __a, int32x4_t __b, int32x4_t __c)
+test_vqdmlal_high_lane_s32 (int64x2_t __a, int32x4_t __b, int32x2_t __c)
{
return vqdmlal_high_lane_s32 (__a, __b, __c, 1);
}
/* { dg-final { scan-assembler-times "\\tsqdmlsl2\\tv\[0-9\]+\.4s, v\[0-9\]+\.8h, v\[0-9\]+\.h" 3 } } */
int32x4_t
-test_vqdmlsl_high_lane_s16 (int32x4_t a, int16x8_t b, int16x8_t c)
+test_vqdmlsl_high_lane_s16 (int32x4_t a, int16x8_t b, int16x4_t c)
{
return vqdmlsl_high_lane_s16 (a, b, c, 3);
}
/* { dg-final { scan-assembler-times "\\tsqdmlsl2\\tv\[0-9\]+\.2d, v\[0-9\]+\.4s, v\[0-9\]+\.s" 3 } } */
int64x2_t
-test_vqdmlsl_high_lane_s32 (int64x2_t __a, int32x4_t __b, int32x4_t __c)
+test_vqdmlsl_high_lane_s32 (int64x2_t __a, int32x4_t __b, int32x2_t __c)
{
return vqdmlsl_high_lane_s32 (__a, __b, __c, 1);
}
/* { dg-final { scan-assembler-times "\\tsqdmull2\\tv\[0-9\]+\.4s, v\[0-9\]+\.8h, v\[0-9\]+\.h" 3 } } */
int32x4_t
-test_vqdmull_high_lane_s16 (int16x8_t a, int16x8_t b)
+test_vqdmull_high_lane_s16 (int16x8_t a, int16x4_t b)
{
return vqdmull_high_lane_s16 (a, b, 3);
}
/* { dg-final { scan-assembler-times "\\tsqdmull2\\tv\[0-9\]+\.2d, v\[0-9\]+\.4s, v\[0-9\]+\.s" 3 } } */
int64x2_t
-test_vqdmull_high_lane_s32 (int32x4_t __a, int32x4_t __b)
+test_vqdmull_high_lane_s32 (int32x4_t __a, int32x2_t __b)
{
return vqdmull_high_lane_s32 (__a, __b, 1);
}
--- /dev/null
+/* Test the vqdmlal_high_lane_s16 AArch64 SIMD intrinsic. */
+
+/* { dg-do compile } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+int32x4_t
+t_vqdmlal_high_lane_s16 (int32x4_t a, int16x8_t b, int16x4_t c)
+{
+ return vqdmlal_high_lane_s16 (a, b, c, 0);
+}
+
+/* { dg-final { scan-assembler-times "sqdmlal2\[ \t\]+\[vV\]\[0-9\]+\.4\[sS\], ?\[vV\]\[0-9\]+\.8\[hH\], ?\[vV\]\[0-9\]+\.\[hH\]\\\[0\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- /dev/null
+/* Test the vqdmlal_high_lane_s32 AArch64 SIMD intrinsic. */
+
+/* { dg-do compile } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+int64x2_t
+t_vqdmlal_high_lane_s32 (int64x2_t a, int32x4_t b, int32x2_t c)
+{
+ return vqdmlal_high_lane_s32 (a, b, c, 0);
+}
+
+/* { dg-final { scan-assembler-times "sqdmlal2\[ \t\]+\[vV\]\[0-9\]+\.2\[dD\], ?\[vV\]\[0-9\]+\.4\[sS\], ?\[vV\]\[0-9\]+\.\[sS\]\\\[0\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- /dev/null
+/* Test the vqdmlal_high_laneq_s16 AArch64 SIMD intrinsic. */
+
+/* { dg-do compile } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+int32x4_t
+t_vqdmlal_high_laneq_s16 (int32x4_t a, int16x8_t b, int16x8_t c)
+{
+ return vqdmlal_high_laneq_s16 (a, b, c, 0);
+}
+
+/* { dg-final { scan-assembler-times "sqdmlal2\[ \t\]+\[vV\]\[0-9\]+\.4\[sS\], ?\[vV\]\[0-9\]+\.8\[hH\], ?\[vV\]\[0-9\]+\.\[hH\]\\\[0\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- /dev/null
+/* Test the vqdmlal_high_laneq_s32 AArch64 SIMD intrinsic. */
+
+/* { dg-do compile } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+int64x2_t
+t_vqdmlal_high_laneq_s32 (int64x2_t a, int32x4_t b, int32x4_t c)
+{
+ return vqdmlal_high_laneq_s32 (a, b, c, 0);
+}
+
+/* { dg-final { scan-assembler-times "sqdmlal2\[ \t\]+\[vV\]\[0-9\]+\.2\[dD\], ?\[vV\]\[0-9\]+\.4\[sS\], ?\[vV\]\[0-9\]+\.\[sS\]\\\[0\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- /dev/null
+/* Test the vqdmlal_lane_s16 AArch64 SIMD intrinsic. */
+
+/* { dg-do compile } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+int32x4_t
+t_vqdmlal_lane_s16 (int32x4_t a, int16x4_t b, int16x4_t c)
+{
+ return vqdmlal_lane_s16 (a, b, c, 0);
+}
+
+/* { dg-final { scan-assembler-times "sqdmlal\[ \t\]+\[vV\]\[0-9\]+\.4\[sS\], ?\[vV\]\[0-9\]+\.4\[hH\], ?\[vV\]\[0-9\]+\.\[hH\]\\\[0\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- /dev/null
+/* Test the vqdmlal_lane_s32 AArch64 SIMD intrinsic. */
+
+/* { dg-do compile } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+int64x2_t
+t_vqdmlal_lane_s32 (int64x2_t a, int32x2_t b, int32x2_t c)
+{
+ return vqdmlal_lane_s32 (a, b, c, 0);
+}
+
+/* { dg-final { scan-assembler-times "sqdmlal\[ \t\]+\[vV\]\[0-9\]+\.2\[dD\], ?\[vV\]\[0-9\]+\.2\[sS\], ?\[vV\]\[0-9\]+\.\[sS\]\\\[0\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- /dev/null
+/* Test the vqdmlal_laneq_s16 AArch64 SIMD intrinsic. */
+
+/* { dg-do compile } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+int32x4_t
+t_vqdmlal_laneq_s16 (int32x4_t a, int16x4_t b, int16x8_t c)
+{
+ return vqdmlal_laneq_s16 (a, b, c, 0);
+}
+
+/* { dg-final { scan-assembler-times "sqdmlal\[ \t\]+\[vV\]\[0-9\]+\.4\[sS\], ?\[vV\]\[0-9\]+\.4\[hH\], ?\[vV\]\[0-9\]+\.\[hH\]\\\[0\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- /dev/null
+/* Test the vqdmlal_laneq_s32 AArch64 SIMD intrinsic. */
+
+/* { dg-do compile } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+int64x2_t
+t_vqdmlal_laneq_s32 (int64x2_t a, int32x2_t b, int32x4_t c)
+{
+ return vqdmlal_laneq_s32 (a, b, c, 0);
+}
+
+/* { dg-final { scan-assembler-times "sqdmlal\[ \t\]+\[vV\]\[0-9\]+\.2\[dD\], ?\[vV\]\[0-9\]+\.2\[sS\], ?\[vV\]\[0-9\]+\.\[sS\]\\\[0\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- /dev/null
+/* Test the vqdmlalh_lane_s16 AArch64 SIMD intrinsic. */
+
+/* { dg-do compile } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+int32x1_t
+t_vqdmlalh_lane_s16 (int32x1_t a, int16x1_t b, int16x4_t c)
+{
+ return vqdmlalh_lane_s16 (a, b, c, 0);
+}
+
+/* { dg-final { scan-assembler-times "sqdmlal\[ \t\]+\[sS\]\[0-9\]+, ?\[hH\]\[0-9\]+, ?\[vV\]\[0-9\]+\.\[hH\]\\\[0\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- /dev/null
+/* Test the vqdmlals_lane_s32 AArch64 SIMD intrinsic. */
+
+/* { dg-do compile } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+int64x1_t
+t_vqdmlals_lane_s32 (int64x1_t a, int32x1_t b, int32x2_t c)
+{
+ return vqdmlals_lane_s32 (a, b, c, 0);
+}
+
+/* { dg-final { scan-assembler-times "sqdmlal\[ \t\]+\[dD\]\[0-9\]+, ?\[sS\]\[0-9\]+, ?\[vV\]\[0-9\]+\.\[sS\]\\\[0\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- /dev/null
+/* Test the vqdmlsl_high_lane_s16 AArch64 SIMD intrinsic. */
+
+/* { dg-do compile } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+int32x4_t
+t_vqdmlsl_high_lane_s16 (int32x4_t a, int16x8_t b, int16x4_t c)
+{
+ return vqdmlsl_high_lane_s16 (a, b, c, 0);
+}
+
+/* { dg-final { scan-assembler-times "sqdmlsl2\[ \t\]+\[vV\]\[0-9\]+\.4\[sS\], ?\[vV\]\[0-9\]+\.8\[hH\], ?\[vV\]\[0-9\]+\.\[hH\]\\\[0\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- /dev/null
+/* Test the vqdmlsl_high_lane_s32 AArch64 SIMD intrinsic. */
+
+/* { dg-do compile } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+int64x2_t
+t_vqdmlsl_high_lane_s32 (int64x2_t a, int32x4_t b, int32x2_t c)
+{
+ return vqdmlsl_high_lane_s32 (a, b, c, 0);
+}
+
+/* { dg-final { scan-assembler-times "sqdmlsl2\[ \t\]+\[vV\]\[0-9\]+\.2\[dD\], ?\[vV\]\[0-9\]+\.4\[sS\], ?\[vV\]\[0-9\]+\.\[sS\]\\\[0\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- /dev/null
+/* Test the vqdmlsl_high_laneq_s16 AArch64 SIMD intrinsic. */
+
+/* { dg-do compile } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+int32x4_t
+t_vqdmlsl_high_laneq_s16 (int32x4_t a, int16x8_t b, int16x8_t c)
+{
+ return vqdmlsl_high_laneq_s16 (a, b, c, 0);
+}
+
+/* { dg-final { scan-assembler-times "sqdmlsl2\[ \t\]+\[vV\]\[0-9\]+\.4\[sS\], ?\[vV\]\[0-9\]+\.8\[hH\], ?\[vV\]\[0-9\]+\.\[hH\]\\\[0\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- /dev/null
+/* Test the vqdmlsl_high_laneq_s32 AArch64 SIMD intrinsic. */
+
+/* { dg-do compile } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+int64x2_t
+t_vqdmlsl_high_laneq_s32 (int64x2_t a, int32x4_t b, int32x4_t c)
+{
+ return vqdmlsl_high_laneq_s32 (a, b, c, 0);
+}
+
+/* { dg-final { scan-assembler-times "sqdmlsl2\[ \t\]+\[vV\]\[0-9\]+\.2\[dD\], ?\[vV\]\[0-9\]+\.4\[sS\], ?\[vV\]\[0-9\]+\.\[sS\]\\\[0\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- /dev/null
+/* Test the vqdmlsl_lane_s16 AArch64 SIMD intrinsic. */
+
+/* { dg-do compile } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+int32x4_t
+t_vqdmlsl_lane_s16 (int32x4_t a, int16x4_t b, int16x4_t c)
+{
+ return vqdmlsl_lane_s16 (a, b, c, 0);
+}
+
+/* { dg-final { scan-assembler-times "sqdmlsl\[ \t\]+\[vV\]\[0-9\]+\.4\[sS\], ?\[vV\]\[0-9\]+\.4\[hH\], ?\[vV\]\[0-9\]+\.\[hH\]\\\[0\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- /dev/null
+/* Test the vqdmlsl_lane_s32 AArch64 SIMD intrinsic. */
+
+/* { dg-do compile } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+int64x2_t
+t_vqdmlsl_lane_s32 (int64x2_t a, int32x2_t b, int32x2_t c)
+{
+ return vqdmlsl_lane_s32 (a, b, c, 0);
+}
+
+/* { dg-final { scan-assembler-times "sqdmlsl\[ \t\]+\[vV\]\[0-9\]+\.2\[dD\], ?\[vV\]\[0-9\]+\.2\[sS\], ?\[vV\]\[0-9\]+\.\[sS\]\\\[0\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- /dev/null
+/* Test the vqdmlsl_laneq_s32 AArch64 SIMD intrinsic. */
+
+/* { dg-do compile } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+int64x2_t
+t_vqdmlsl_lane_s32 (int64x2_t a, int32x2_t b, int32x4_t c)
+{
+ return vqdmlsl_laneq_s32 (a, b, c, 0);
+}
+
+/* { dg-final { scan-assembler-times "sqdmlsl\[ \t\]+\[vV\]\[0-9\]+\.2\[dD\], ?\[vV\]\[0-9\]+\.2\[sS\], ?\[vV\]\[0-9\]+\.\[sS\]\\\[0\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- /dev/null
+/* Test the vqdmlslh_lane_s16 AArch64 SIMD intrinsic. */
+
+/* { dg-do compile } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+int32x1_t
+t_vqdmlslh_lane_s16 (int32x1_t a, int16x1_t b, int16x4_t c)
+{
+ return vqdmlslh_lane_s16 (a, b, c, 0);
+}
+
+/* { dg-final { scan-assembler-times "sqdmlsl\[ \t\]+\[sS\]\[0-9\]+, ?\[hH\]\[0-9\]+, ?\[vV\]\[0-9\]+\.\[hH\]\\\[0\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- /dev/null
+/* Test the vqdmlsls_lane_s32 AArch64 SIMD intrinsic. */
+
+/* { dg-do compile } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+int64x1_t
+t_vqdmlsls_lane_s32 (int64x1_t a, int32x1_t b, int32x2_t c)
+{
+ return vqdmlsls_lane_s32 (a, b, c, 0);
+}
+
+/* { dg-final { scan-assembler-times "sqdmlsl\[ \t\]+\[dD\]\[0-9\]+, ?\[sS\]\[0-9\]+, ?\[vV\]\[0-9\]+\.\[sS\]\\\[0\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- /dev/null
+/* Test the vqdmulh_laneq_s16 AArch64 SIMD intrinsic. */
+
+/* { dg-do compile } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+int16x4_t
+t_vqdmulh_laneq_s16 (int16x4_t a, int16x8_t b)
+{
+ return vqdmulh_laneq_s16 (a, b, 0);
+}
+
+/* { dg-final { scan-assembler-times "sqdmulh\[ \t\]+\[vV\]\[0-9\]+\.4\[hH\], ?\[vV\]\[0-9\]+\.4\[hH\], ?\[vV\]\[0-9\]+\.\[hH\]\\\[0\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- /dev/null
+/* Test the vqdmulh_laneq_s32 AArch64 SIMD intrinsic. */
+
+/* { dg-do compile } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+int32x2_t
+t_vqdmulh_laneq_s32 (int32x2_t a, int32x4_t b)
+{
+ return vqdmulh_laneq_s32 (a, b, 0);
+}
+
+/* { dg-final { scan-assembler-times "sqdmulh\[ \t\]+\[vV\]\[0-9\]+\.2\[sS\], ?\[vV\]\[0-9\]+\.2\[sS\], ?\[vV\]\[0-9\]+\.\[sS\]\\\[0\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- /dev/null
+/* Test the vqdmulhh_lane_s16 AArch64 SIMD intrinsic. */
+
+/* { dg-do run } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+#include <stdio.h>
+
+extern void abort (void);
+
+int
+main (void)
+{
+ int16_t arg1;
+ int16x4_t arg2;
+ int16_t result;
+ int16_t actual;
+ int16_t expected;
+
+ arg1 = -32768;
+ arg2 = vcreate_s16 (0x0000ffff2489e398ULL);
+ actual = vqdmulhh_lane_s16 (arg1, arg2, 2);
+ expected = 1;
+
+ if (expected != actual)
+ {
+ fprintf (stderr, "Expected: %xd, got %xd\n", expected, actual);
+ abort ();
+ }
+
+ return 0;
+}
+
+
+/* { dg-final { scan-assembler-times "sqdmulh\[ \t\]+\[hH\]\[0-9\]+, ?\[hH\]\[0-9\]+, ?\[vV\]\[0-9\]+\.\[hH\]\\\[2\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- /dev/null
+/* Test the vqdmulhq_laneq_s16 AArch64 SIMD intrinsic. */
+
+/* { dg-do compile } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+int16x8_t
+t_vqdmulhq_laneq_s16 (int16x8_t a, int16x8_t b)
+{
+ return vqdmulhq_laneq_s16 (a, b, 0);
+}
+
+/* { dg-final { scan-assembler-times "sqdmulh\[ \t\]+\[vV\]\[0-9\]+\.8\[hH\], ?\[vV\]\[0-9\]+\.8\[hH\], ?\[vV\]\[0-9\]+\.\[hH\]\\\[0\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- /dev/null
+/* Test the vqdmulhq_laneq_s32 AArch64 SIMD intrinsic. */
+
+/* { dg-do compile } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+int32x4_t
+t_vqdmulhq_laneq_s32 (int32x4_t a, int32x4_t b)
+{
+ return vqdmulhq_laneq_s32 (a, b, 0);
+}
+
+/* { dg-final { scan-assembler-times "sqdmulh\[ \t\]+\[vV\]\[0-9\]+\.4\[sS\], ?\[vV\]\[0-9\]+\.4\[sS\], ?\[vV\]\[0-9\]+\.\[sS\]\\\[0\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- /dev/null
+/* Test the vqdmulhs_lane_s32 AArch64 SIMD intrinsic. */
+
+/* { dg-do run } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+#include <stdio.h>
+
+extern void abort (void);
+
+int
+main (void)
+{
+ int32_t arg1;
+ int32x2_t arg2;
+ int32_t result;
+ int32_t actual;
+ int32_t expected;
+
+ arg1 = 57336;
+ arg2 = vcreate_s32 (0x55897fff7fff0000ULL);
+ actual = vqdmulhs_lane_s32 (arg1, arg2, 0);
+ expected = 57334;
+
+ if (expected != actual)
+ {
+ fprintf (stderr, "Expected: %xd, got %xd\n", expected, actual);
+ abort ();
+ }
+
+ return 0;
+}
+/* { dg-final { scan-assembler-times "sqdmulh\[ \t\]+\[sS\]\[0-9\]+, ?\[sS\]\[0-9\]+, ?\[vV\]\[0-9\]+\.\[sS\]\\\[0\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- /dev/null
+/* Test the vqdmull_high_lane_s16 AArch64 SIMD intrinsic. */
+
+/* { dg-do compile } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+int32x4_t
+t_vqdmull_high_lane_s16 (int16x8_t a, int16x4_t b)
+{
+ return vqdmull_high_lane_s16 (a, b, 0);
+}
+
+/* { dg-final { scan-assembler-times "sqdmull2\[ \t\]+\[vV\]\[0-9\]+\.4\[sS\], ?\[vV\]\[0-9\]+\.8\[hH\], ?\[vV\]\[0-9\]+\.\[hH\]\\\[0\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- /dev/null
+/* Test the vqdmull_high_lane_s32 AArch64 SIMD intrinsic. */
+
+/* { dg-do compile } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+int64x2_t
+t_vqdmull_high_lane_s32 (int32x4_t a, int32x2_t b)
+{
+ return vqdmull_high_lane_s32 (a, b, 0);
+}
+
+/* { dg-final { scan-assembler-times "sqdmull2\[ \t\]+\[vV\]\[0-9\]+\.2\[dD\], ?\[vV\]\[0-9\]+\.4\[sS\], ?\[vV\]\[0-9\]+\.\[sS\]\\\[0\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- /dev/null
+/* Test the vqdmull_high_laneq_s16 AArch64 SIMD intrinsic. */
+
+/* { dg-do compile } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+int32x4_t
+t_vqdmull_high_laneq_s16 (int16x8_t a, int16x8_t b)
+{
+ return vqdmull_high_laneq_s16 (a, b, 0);
+}
+
+/* { dg-final { scan-assembler-times "sqdmull2\[ \t\]+\[vV\]\[0-9\]+\.4\[sS\], ?\[vV\]\[0-9\]+\.8\[hH\], ?\[vV\]\[0-9\]+\.\[hH\]\\\[0\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- /dev/null
+/* Test the vqdmull_high_laneq_s32 AArch64 SIMD intrinsic. */
+
+/* { dg-do compile } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+int64x2_t
+t_vqdmull_high_laneq_s32 (int32x4_t a, int32x4_t b)
+{
+ return vqdmull_high_laneq_s32 (a, b, 0);
+}
+
+/* { dg-final { scan-assembler-times "sqdmull2\[ \t\]+\[vV\]\[0-9\]+\.2\[dD\], ?\[vV\]\[0-9\]+\.4\[sS\], ?\[vV\]\[0-9\]+\.\[sS\]\\\[0\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- /dev/null
+/* Test the vqdmull_lane_s16 AArch64 SIMD intrinsic. */
+
+/* { dg-do compile } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+int32x4_t
+t_vqdmull_lane_s16 (int16x4_t a, int16x4_t b)
+{
+ return vqdmull_lane_s16 (a, b, 0);
+}
+
+/* { dg-final { scan-assembler-times "sqdmull\[ \t\]+\[vV\]\[0-9\]+\.4\[sS\], ?\[vV\]\[0-9\]+\.4\[hH\], ?\[vV\]\[0-9\]+\.\[hH\]\\\[0\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- /dev/null
+/* Test the vqdmull_lane_s32 AArch64 SIMD intrinsic. */
+
+/* { dg-do compile } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+int64x2_t
+t_vqdmull_lane_s32 (int32x2_t a, int32x2_t b)
+{
+ return vqdmull_lane_s32 (a, b, 0);
+}
+
+/* { dg-final { scan-assembler-times "sqdmull\[ \t\]+\[vV\]\[0-9\]+\.2\[dD\], ?\[vV\]\[0-9\]+\.2\[sS\], ?\[vV\]\[0-9\]+\.\[sS\]\\\[0\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- /dev/null
+/* Test the vqdmull_laneq_s16 AArch64 SIMD intrinsic. */
+
+/* { dg-do compile } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+int32x4_t
+t_vqdmull_laneq_s16 (int16x4_t a, int16x8_t b)
+{
+ return vqdmull_laneq_s16 (a, b, 0);
+}
+
+/* { dg-final { scan-assembler-times "sqdmull\[ \t\]+\[vV\]\[0-9\]+\.4\[sS\], ?\[vV\]\[0-9\]+\.4\[hH\], ?\[vV\]\[0-9\]+\.\[hH\]\\\[0\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- /dev/null
+/* Test the vqdmull_laneq_s32 AArch64 SIMD intrinsic. */
+
+/* { dg-do compile } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+int64x2_t
+t_vqdmull_laneq_s32 (int32x2_t a, int32x4_t b)
+{
+ return vqdmull_laneq_s32 (a, b, 0);
+}
+
+/* { dg-final { scan-assembler-times "sqdmull\[ \t\]+\[vV\]\[0-9\]+\.2\[dD\], ?\[vV\]\[0-9\]+\.2\[sS\], ?\[vV\]\[0-9\]+\.\[sS\]\\\[0\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- /dev/null
+/* Test the vqdmullh_lane_s16 AArch64 SIMD intrinsic. */
+
+/* { dg-do compile } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+int32x1_t
+t_vqdmullh_lane_s16 (int16x1_t a, int16x4_t b)
+{
+ return vqdmullh_lane_s16 (a, b, 0);
+}
+
+/* { dg-final { scan-assembler-times "sqdmull\[ \t\]+\[sS\]\[0-9\]+, ?\[hH\]\[0-9\]+, ?\[vV\]\[0-9\]+\.\[hH\]\\\[0\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- /dev/null
+/* Test the vqdmulls_lane_s32 AArch64 SIMD intrinsic. */
+
+/* { dg-do compile } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+int64x1_t
+t_vqdmulls_lane_s32 (int32x1_t a, int32x2_t b)
+{
+ return vqdmulls_lane_s32 (a, b, 0);
+}
+
+/* { dg-final { scan-assembler-times "sqdmull\[ \t\]+\[dD\]\[0-9\]+, ?\[sS\]\[0-9\]+, ?\[vV\]\[0-9\]+\.\[sS\]\\\[0\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- /dev/null
+/* Test the vqrdmulh_laneq_s16 AArch64 SIMD intrinsic. */
+
+/* { dg-do compile } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+int16x4_t
+t_vqrdmulh_laneq_s16 (int16x4_t a, int16x8_t b)
+{
+ return vqrdmulh_laneq_s16 (a, b, 0);
+}
+
+/* { dg-final { scan-assembler-times "sqrdmulh\[ \t\]+\[vV\]\[0-9\]+\.4\[hH\], ?\[vV\]\[0-9\]+\.4\[hH\], ?\[vV\]\[0-9\]+\.\[hH\]\\\[0\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- /dev/null
+/* Test the vqrdmulh_laneq_s32 AArch64 SIMD intrinsic. */
+
+/* { dg-do compile } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+int32x2_t
+t_vqrdmulh_laneq_s32 (int32x2_t a, int32x4_t b)
+{
+ return vqrdmulh_laneq_s32 (a, b, 0);
+}
+
+/* { dg-final { scan-assembler-times "sqrdmulh\[ \t\]+\[vV\]\[0-9\]+\.2\[sS\], ?\[vV\]\[0-9\]+\.2\[sS\], ?\[vV\]\[0-9\]+\.\[sS\]\\\[0\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- /dev/null
+/* Test the vqrdmulhh_lane_s16 AArch64 SIMD intrinsic. */
+
+/* { dg-do run } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+#include <stdio.h>
+
+extern void abort (void);
+
+int
+main (void)
+{
+ int16_t arg1;
+ int16x4_t arg2;
+ int16_t result;
+ int16_t actual;
+ int16_t expected;
+
+ arg1 = -32768;
+ arg2 = vcreate_s16 (0xd78e000005d78000ULL);
+ actual = vqrdmulhh_lane_s16 (arg1, arg2, 3);
+ expected = 10354;
+
+ if (expected != actual)
+ {
+ fprintf (stderr, "Expected: %xd, got %xd\n", expected, actual);
+ abort ();
+ }
+
+ return 0;
+}
+
+/* { dg-final { scan-assembler-times "sqrdmulh\[ \t\]+\[hH\]\[0-9\]+, ?\[hH\]\[0-9\]+, ?\[vV\]\[0-9\]+\.\[hH\]\\\[3\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- /dev/null
+/* Test the vqrdmulhq_laneq_s16 AArch64 SIMD intrinsic. */
+
+/* { dg-do compile } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+int16x8_t
+t_vqrdmulhq_laneq_s16 (int16x8_t a, int16x8_t b)
+{
+ return vqrdmulhq_laneq_s16 (a, b, 0);
+}
+
+/* { dg-final { scan-assembler-times "sqrdmulh\[ \t\]+\[vV\]\[0-9\]+\.8\[hH\], ?\[vV\]\[0-9\]+\.8\[hH\], ?\[vV\]\[0-9\]+\.\[hH\]\\\[0\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- /dev/null
+/* Test the vqrdmulhq_laneq_s32 AArch64 SIMD intrinsic. */
+
+/* { dg-do compile } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+
+int32x4_t
+t_vqrdmulhq_laneq_s32 (int32x4_t a, int32x4_t b)
+{
+ return vqrdmulhq_laneq_s32 (a, b, 0);
+}
+
+/* { dg-final { scan-assembler-times "sqrdmulh\[ \t\]+\[vV\]\[0-9\]+\.4\[sS\], ?\[vV\]\[0-9\]+\.4\[sS\], ?\[vV\]\[0-9\]+\.\[sS\]\\\[0\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- /dev/null
+/* Test the vqrdmulhs_lane_s32 AArch64 SIMD intrinsic. */
+
+/* { dg-do run } */
+/* { dg-options "-save-temps -O3 -fno-inline" } */
+
+#include "arm_neon.h"
+#include <stdio.h>
+
+extern void abort (void);
+
+int
+main (void)
+{
+ int32_t arg1;
+ int32x2_t arg2;
+ int32_t result;
+ int32_t actual;
+ int32_t expected;
+
+ arg1 = -2099281921;
+ arg2 = vcreate_s32 (0x000080007fff0000ULL);
+ actual = vqrdmulhs_lane_s32 (arg1, arg2, 1);
+ expected = -32033;
+
+ if (expected != actual)
+ {
+ fprintf (stderr, "Expected: %xd, got %xd\n", expected, actual);
+ abort ();
+ }
+
+ return 0;
+}
+
+/* { dg-final { scan-assembler-times "sqrdmulh\[ \t\]+\[sS\]\[0-9\]+, ?\[sS\]\[0-9\]+, ?\[vV\]\[0-9\]+\.\[sS\]\\\[1\\\]\n" 1 } } */
+/* { dg-final { cleanup-saved-temps } } */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2 -mieee" } */
+
+void foo (int *dimensions, double **params, int hh)
+{
+ if (params[hh])
+ ;
+ else if (dimensions[hh] > 0)
+ params[hh][0] = 1.0f;
+}
uint8x8x2_t vd1, vd2;
union {uint8x8_t v; uint8_t buf[8];} d1, d2, d3, d4;
int i;
- uint8_t odd, even;
vd1 = vzip_u8(v1, vdup_n_u8(0));
vd2 = vzip_u8(v2, vdup_n_u8(0));
vst1_u8(d3.buf, vd2.val[0]);
vst1_u8(d4.buf, vd2.val[1]);
-#ifdef __ARMEL__
- odd = 1;
- even = 0;
-#else
- odd = 0;
- even = 1;
-#endif
-
for (i = 0; i < 8; i++)
- if ((i % 2 == even && d4.buf[i] != 2)
- || (i % 2 == odd && d4.buf[i] != 0))
+ if ((i % 2 == 0 && d4.buf[i] != 2)
+ || (i % 2 == 1 && d4.buf[i] != 0))
abort ();
return 0;
--- /dev/null
+/* { dg-do run } */
+/* { dg-options "-O1" } */
+
+/* This testcase (simplified from the original bug report) exposes
+ PR60991. The code generated for writing the __int24 value corrupts
+ the frame pointer if the offset is <= 63 + MAX_LD_OFFSET */
+
+#include <stdlib.h>
+
+int main(void)
+{
+ volatile char junk[62];
+ junk[0] = 5;
+ volatile __int24 staticConfig = 0;
+
+ if (junk[0] != 5)
+ abort();
+
+ exit(0);
+ return 0;
+}
--- /dev/null
+/* { dg-do run } */
+/* { dg-options { -fno-peephole2 } } */
+
+#include <stdlib.h>
+
+typedef __UINT16_TYPE__ uint16_t;
+typedef __INT16_TYPE__ int16_t;
+typedef __UINT8_TYPE__ uint8_t;
+
+uint8_t __attribute__((noinline,noclone))
+fun_inc (uint8_t c0)
+{
+ register uint8_t c asm ("r15") = c0;
+
+ /* Force target value into R15 (lower register) */
+ asm ("" : "+l" (c));
+
+ c++;
+ if (c >= 0x80)
+ c = 0;
+
+ asm ("" : "+l" (c));
+
+ return c;
+}
+
+uint8_t __attribute__((noinline,noclone))
+fun_dec (uint8_t c0)
+{
+ register uint8_t c asm ("r15") = c0;
+
+ /* Force target value into R15 (lower register) */
+ asm ("" : "+l" (c));
+
+ c--;
+ if (c < 0x80)
+ c = 0;
+
+ asm ("" : "+l" (c));
+
+ return c;
+}
+
+
+uint8_t __attribute__((noinline,noclone))
+fun_neg (uint8_t c0)
+{
+ register uint8_t c asm ("r15") = c0;
+
+ c = -c;
+ if (c >= 0x80)
+ c = 0;
+
+ return c;
+}
+
+uint16_t __attribute__((noinline,noclone))
+fun_adiw (uint16_t c0)
+{
+ register uint16_t c asm ("r24") = c0;
+
+ /* Force target value into R24 (for ADIW) */
+ asm ("" : "+r" (c));
+
+ c += 2;
+ if (c >= 0x8000)
+ c = 0;
+
+ asm ("" : "+r" (c));
+
+ return c;
+}
+
+
+int main()
+{
+ if (fun_inc (0x7f) != 0)
+ abort();
+
+ if (fun_neg (0x80) != 0)
+ abort();
+
+ if (fun_adiw (0x7ffe) != 0)
+ abort();
+
+ exit (0);
+ return 0;
+}
--- /dev/null
+/* { dg-do run } */
+/* { dg-options "-std=gnu99" } */
+
+#include <stdlib.h>
+#include <stdarg.h>
+
+#define NC __attribute__((noinline,noclone))
+
+void NC vfun (char n, ...)
+{
+ va_list ap;
+
+ va_start (ap, n);
+
+ switch (n)
+ {
+ default:
+ abort();
+ case 1:
+ if (11 != va_arg (ap, int))
+ abort();
+ break;
+ case 2:
+ if (2222 != va_arg (ap, int))
+ abort();
+ break;
+ case 3:
+ if (333333 != va_arg (ap, __int24))
+ abort();
+ break;
+ case 4:
+ if (44444444 != va_arg (ap, long))
+ abort();
+ break;
+ case 8:
+ if (8888888888888888 != va_arg (ap, long long))
+ abort();
+ break;
+ }
+
+ va_end (ap);
+}
+
+
+void NC boo_qi (const __flash char *p)
+{
+ vfun (1, *p);
+}
+
+void NC boox_qi (const __memx char *p)
+{
+ vfun (1, *p);
+}
+
+void NC boo_hi (const __flash int *p)
+{
+ vfun (2, *p);
+}
+
+void NC boox_hi (const __memx int *p)
+{
+ vfun (2, *p);
+}
+
+void NC boo_psi (const __flash __int24 *p)
+{
+ vfun (3, *p);
+}
+
+void NC boox_psi (const __memx __int24 *p)
+{
+ vfun (3, *p);
+}
+
+void NC boo_si (const __flash long *p)
+{
+ vfun (4, *p);
+}
+
+void NC boox_si (const __memx long *p)
+{
+ vfun (4, *p);
+}
+
+void NC boo_di (const __flash long long *p)
+{
+ vfun (8, *p);
+}
+
+void NC boox_di (const __memx long long *p)
+{
+ vfun (8, *p);
+}
+
+const __flash char f_qi = 11;
+const __flash int f_hi = 2222;
+const __flash __int24 f_psi = 333333;
+const __flash long f_si = 44444444;
+const __flash long long f_di = 8888888888888888;
+
+const __memx char x_qi = 11;
+const __memx int x_hi = 2222;
+const __memx __int24 x_psi = 333333;
+const __memx long x_si = 44444444;
+const __memx long long x_di = 8888888888888888;
+
+char r_qi = 11;
+int r_hi = 2222;
+__int24 r_psi = 333333;
+long r_si = 44444444;
+long long r_di = 8888888888888888;
+
+int main (void)
+{
+ boo_qi (&f_qi);
+ boo_hi (&f_hi);
+ boo_psi (&f_psi);
+ boo_si (&f_si);
+ boo_di (&f_di);
+
+ boox_qi (&x_qi);
+ boox_hi (&x_hi);
+ boox_psi (&x_psi);
+ boox_si (&x_si);
+ boox_di (&x_di);
+
+ boox_qi (&r_qi);
+ boox_hi (&r_hi);
+ boox_psi (&r_psi);
+ boox_si (&r_si);
+ boox_di (&r_di);
+
+ exit (0);
+}
--- /dev/null
+/* PR tree-optimization/57233 */
+/* { dg-do run { target avx } } */
+/* { dg-options "-O2 -mavx" } */
+
+#include "avx-check.h"
+
+static void
+avx_test (void)
+{
+ do_main ();
+}
+
+#undef main
+#define main() do_main ()
+
+#include "../../gcc.dg/pr57233.c"
--- /dev/null
+/* PR tree-optimization/57233 */
+/* { dg-do run { target avx2 } } */
+/* { dg-options "-O2 -mavx2" } */
+
+#include "avx2-check.h"
+
+static void
+avx2_test (void)
+{
+ do_main ();
+}
+
+#undef main
+#define main() do_main ()
+
+#include "../../gcc.dg/pr57233.c"
--- /dev/null
+/* PR tree-optimization/57233 */
+/* { dg-do run { target avx512f } } */
+/* { dg-options "-O2 -mavx512f" } */
+
+#include "avx512f-check.h"
+
+static void
+avx512f_test (void)
+{
+ do_main ();
+}
+
+#undef main
+#define main() do_main ()
+
+#include "../../gcc.dg/pr57233.c"
+++ /dev/null
-# clear all hardware capabilities emitted by Sun as: the tests here
-# guard against execution at runtime
-hwcap_1 = V0x0 OVERRIDE;
+++ /dev/null
-# clear all hardware capabilities emitted by Sun as: the tests here
-# guard against execution at runtime
-# uses mapfile v2 syntax which is the only way to clear AT_SUN_CAP_HW2 flags
-$mapfile_version 2
-CAPABILITY {
- HW = ;
-};
# Load support procs.
load_lib gcc-dg.exp
+load_lib clearcap.exp
# Return 1 if attribute ms_hook_prologue is supported.
proc check_effective_target_ms_hook_prologue { } {
} "-O2 -msha" ]
}
-# If the linker used understands -M <mapfile>, pass it to clear hardware
-# capabilities set by the Sun assembler.
-# Try mapfile syntax v2 first which is the only way to clear hwcap_2 flags.
-set clearcap_ldflags "-Wl,-M,$srcdir/$subdir/clearcapv2.map"
-
-if ![check_no_compiler_messages mapfilev2 executable {
- int main (void) { return 0; }
-} $clearcap_ldflags ] {
- # If this doesn't work, fall back to the less capable v1 syntax.
- set clearcap_ldflags "-Wl,-M,$srcdir/$subdir/clearcap.map"
-
- if ![check_no_compiler_messages mapfile executable {
- int main (void) { return 0; }
- } $clearcap_ldflags ] {
- unset clearcap_ldflags
- }
-}
-
-if [info exists clearcap_ldflags] {
- if { [info procs gcc_target_compile] != [list] \
- && [info procs saved_gcc_target_compile] == [list] } {
- rename gcc_target_compile saved_gcc_target_compile
-
- proc gcc_target_compile { source dest type options } {
- global clearcap_ldflags
- # Always pass -Wl,-M,<mapfile>, but don't let it show up in gcc.sum.
- lappend options "additional_flags=$clearcap_ldflags"
-
- return [saved_gcc_target_compile $source $dest $type $options]
- }
- }
-}
-
# If a testcase doesn't have special options, use these.
global DEFAULT_CFLAGS
if ![info exists DEFAULT_CFLAGS] then {
# Initialize `dg'.
dg-init
+clearcap-init
# Special case compilation of vect-args.c so we don't have to
# replicate it 10 times.
dg-runtest $tests "" $DEFAULT_CFLAGS
# All done.
+clearcap-finish
dg-finish
--- /dev/null
+/* PR tree-optimization/57233 */
+/* { dg-do compile { target avx } } */
+/* { dg-options "-O2 -mavx -mno-xop" } */
+
+typedef unsigned V4 __attribute__((vector_size(4 * sizeof (int))));
+V4 a;
+
+__attribute__((noinline)) void
+foo (void)
+{
+ a = (a << 2) | (a >> 30);
+}
+
+/* { dg-final { scan-assembler "vpsrld\[^\n\r]*30" } } */
+/* { dg-final { scan-assembler "vpslld\[^\n\r]*2" } } */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O0 -minline-all-stringops -minline-stringops-dynamically -march=core2" } */
+
+void bar (float *);
+
+void foo (void)
+{
+ float b[256] = {0};
+ bar(b);
+}
--- /dev/null
+/* { dg-options "-O -fselective-scheduling -fschedule-insns -fsel-sched-pipelining -fsel-sched-pipelining-outer-loops -fno-tree-dominator-opts" } */
+
+extern int n;
+extern void bar (void);
+extern int baz (int);
+
+void
+foo (void)
+{
+ int i, j;
+ for (j = 0; j < n; j++)
+ {
+ for (i = 1; i < j; i++)
+ bar ();
+ baz (0);
+ }
+}
--- /dev/null
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+extern void abort ();
+extern void exit (int);
+
+int x;
+
+foo()
+{
+ static int count;
+ count++;
+ if (count > 1)
+ abort ();
+}
+
+static inline int
+frob ()
+{
+ int a;
+ __asm__ ("mov %1, %0\n\t" : "=r" (a) : "m" (x));
+ x++;
+ return a;
+}
+
+int
+main ()
+{
+ int i;
+ for (i = 0; i < 10 && frob () == 0; i++)
+ foo();
+ exit (0);
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-mrdrnd" } */
+
+extern void bar (int);
+
+void
+foo (unsigned *u)
+{
+ int i = __builtin_ia32_rdrand32_step (u);
+ bar (i);
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-mrdseed" } */
+
+extern void bar (int);
+
+void
+foo (unsigned *u)
+{
+ int i = __builtin_ia32_rdseed_si_step (u);
+ bar (i);
+}
--- /dev/null
+/* PR target/61423 */
+/* { dg-do run { target ia32 } } */
+/* { dg-options "-O1 -ftree-vectorize -msse2 -mfpmath=387 -mtune=core2" } */
+
+#define N 1024
+static unsigned int A[N];
+
+double
+__attribute__((noinline))
+func (void)
+{
+ unsigned int sum = 0;
+ unsigned i;
+ double t;
+
+ for (i = 0; i < N; i++)
+ sum += A[i];
+
+ t = sum;
+ return t;
+}
+
+int
+main ()
+{
+ unsigned i;
+ double d;
+
+ for(i = 0; i < N; i++)
+ A[i] = 1;
+
+ d = func();
+
+ if (d != 1024.0)
+ __builtin_abort ();
+
+ return 0;
+}
--- /dev/null
+/* PR rtl-optimization/61446 */
+
+/* { dg-do compile { target { ia32 } } } */
+/* { dg-options "-O2 -march=corei7 -mfpmath=387" } */
+
+unsigned long long
+foo (float a)
+{
+ const double dfa = a;
+ const unsigned int hi = dfa / 0x1p32f;
+ const unsigned int lo = dfa - (double) hi * 0x1p32f;
+
+ return ((unsigned long long) hi << (4 * (8))) | lo;
+}
--- /dev/null
+/* PR tree-optimization/57233 */
+/* { dg-do run { target sse2 } } */
+/* { dg-options "-O2 -msse2" } */
+
+#include "sse2-check.h"
+
+static void
+sse2_test (void)
+{
+ do_main ();
+}
+
+#undef main
+#define main() do_main ()
+
+#include "../../gcc.dg/pr57233.c"
--- /dev/null
+/* { dg-do run } */
+/* { dg-options "-O2 -w -Wno-abi" } */
+
+typedef int v2si __attribute__ ((vector_size (8)));
+typedef short v4hi __attribute__ ((vector_size (8)));
+typedef short v4hia __attribute__ ((vector_size (8), may_alias));
+
+__attribute__ ((noinline, noclone))
+int f (v2si A, int N)
+{ return ((v4hia)A)[N]; }
+
+__attribute__ ((noinline, noclone))
+int g (v2si A, int N)
+{ return ((v4hi)A)[N]; }
+
+int main()
+{
+ v2si x = { 0, 0 }, y = { 1, 1 };
+ if (f (x, 0) || f (x, 1) || f (x, 2) || f (x, 3))
+ __builtin_abort ();
+ if (g (y, 0) != 1 || g (y, 1) || g (y, 2) != 1 || g (y, 3))
+ __builtin_abort ();
+ return 0;
+}
+
--- /dev/null
+/* PR tree-optimization/57233 */
+/* { dg-do run { target xop } } */
+/* { dg-options "-O2 -mxop" } */
+
+#include "xop-check.h"
+
+static void
+xop_test (void)
+{
+ do_main ();
+}
+
+#undef main
+#define main() do_main ()
+
+#include "../../gcc.dg/pr57233.c"
--- /dev/null
+/* { dg-do compile { target { powerpc*-*-linux* } } } */
+/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
+/* { dg-skip-if "" { powerpc*-*-*spe* } { "*" } { "" } } */
+/* { dg-require-effective-target powerpc_vsx_ok } */
+/* { dg-options "-mcpu=power7 -O2" } */
+/* { dg-final { scan-assembler-times "cdtbcd " 1 } } */
+/* { dg-final { scan-assembler-times "cbcdtd " 1 } } */
+/* { dg-final { scan-assembler-times "addg6s " 1 } } */
+/* { dg-final { scan-assembler-not "bl __builtin" } } */
+
+unsigned int
+to_bcd (unsigned int a)
+{
+ return __builtin_cdtbcd (a);
+}
+
+unsigned int
+from_bcd (unsigned int a)
+{
+ return __builtin_cbcdtd (a);
+}
+
+unsigned int
+bcd_arith (unsigned int a, unsigned int b)
+{
+ return __builtin_addg6s (a, b);
+}
--- /dev/null
+/* { dg-do compile { target { powerpc*-*-linux* && lp64 } } } */
+/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
+/* { dg-skip-if "" { powerpc*-*-*spe* } { "*" } { "" } } */
+/* { dg-require-effective-target powerpc_p8vector_ok } */
+/* { dg-options "-mcpu=power8 -O2" } */
+/* { dg-final { scan-assembler-times "bcdadd\[.\] " 2 } } */
+/* { dg-final { scan-assembler-times "bcdsub\[.\] " 2 } } */
+/* { dg-final { scan-assembler-not "bl __builtin" } } */
+/* { dg-final { scan-assembler-not "mtvsr" } } */
+/* { dg-final { scan-assembler-not "mfvsr" } } */
+/* { dg-final { scan-assembler-not "lvx" } } */
+/* { dg-final { scan-assembler-not "lxvw4x" } } */
+/* { dg-final { scan-assembler-not "lxvd2x" } } */
+/* { dg-final { scan-assembler-not "stvx" } } */
+/* { dg-final { scan-assembler-not "stxvw4x" } } */
+/* { dg-final { scan-assembler-not "stxvd2x" } } */
+
+typedef __int128_t __attribute__((__vector_size__(16))) vector_128_t;
+typedef __int128_t scalar_128_t;
+typedef unsigned long long scalar_64_t;
+
+vector_128_t
+do_add_0 (vector_128_t a, vector_128_t b)
+{
+ return __builtin_bcdadd (a, b, 0);
+}
+
+vector_128_t
+do_add_1 (vector_128_t a, vector_128_t b)
+{
+ return __builtin_bcdadd (a, b, 1);
+}
+
+vector_128_t
+do_sub_0 (vector_128_t a, vector_128_t b)
+{
+ return __builtin_bcdsub (a, b, 0);
+}
+
+vector_128_t
+do_sub_1 (vector_128_t a, vector_128_t b)
+{
+ return __builtin_bcdsub (a, b, 1);
+}
--- /dev/null
+/* { dg-do compile { target { powerpc*-*-linux* && lp64 } } } */
+/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
+/* { dg-skip-if "" { powerpc*-*-*spe* } { "*" } { "" } } */
+/* { dg-require-effective-target powerpc_p8vector_ok } */
+/* { dg-options "-mcpu=power8 -O2" } */
+/* { dg-final { scan-assembler-times "bcdadd\[.\] " 4 } } */
+/* { dg-final { scan-assembler-times "bcdsub\[.\] " 4 } } */
+/* { dg-final { scan-assembler-not "bl __builtin" } } */
+/* { dg-final { scan-assembler-not "mtvsr" } } */
+/* { dg-final { scan-assembler-not "mfvsr" } } */
+/* { dg-final { scan-assembler-not "lvx" } } */
+/* { dg-final { scan-assembler-not "lxvw4x" } } */
+/* { dg-final { scan-assembler-not "lxvd2x" } } */
+/* { dg-final { scan-assembler-not "stvx" } } */
+/* { dg-final { scan-assembler-not "stxvw4x" } } */
+/* { dg-final { scan-assembler-not "stxvd2x" } } */
+
+typedef __int128_t __attribute__((__vector_size__(16))) vector_128_t;
+typedef __int128_t scalar_128_t;
+typedef unsigned long long scalar_64_t;
+
+/* Test whether the peephole works to allow folding a bcdadd, with a
+ bcdadd_<test> into a single instruction. */
+
+vector_128_t
+do_add_lt (vector_128_t a, vector_128_t b, int *p)
+{
+ vector_128_t ret = __builtin_bcdadd (a, b, 0);
+ if (__builtin_bcdadd_lt (a, b, 0))
+ *p = 1;
+
+ return ret;
+}
+
+vector_128_t
+do_add_eq (vector_128_t a, vector_128_t b, int *p)
+{
+ vector_128_t ret = __builtin_bcdadd (a, b, 0);
+ if (__builtin_bcdadd_eq (a, b, 0))
+ *p = 1;
+
+ return ret;
+}
+
+vector_128_t
+do_add_gt (vector_128_t a, vector_128_t b, int *p)
+{
+ vector_128_t ret = __builtin_bcdadd (a, b, 0);
+ if (__builtin_bcdadd_gt (a, b, 0))
+ *p = 1;
+
+ return ret;
+}
+
+vector_128_t
+do_add_ov (vector_128_t a, vector_128_t b, int *p)
+{
+ vector_128_t ret = __builtin_bcdadd (a, b, 0);
+ if (__builtin_bcdadd_ov (a, b, 0))
+ *p = 1;
+
+ return ret;
+}
+
+vector_128_t
+do_sub_lt (vector_128_t a, vector_128_t b, int *p)
+{
+ vector_128_t ret = __builtin_bcdsub (a, b, 0);
+ if (__builtin_bcdsub_lt (a, b, 0))
+ *p = 1;
+
+ return ret;
+}
+
+vector_128_t
+do_sub_eq (vector_128_t a, vector_128_t b, int *p)
+{
+ vector_128_t ret = __builtin_bcdsub (a, b, 0);
+ if (__builtin_bcdsub_eq (a, b, 0))
+ *p = 1;
+
+ return ret;
+}
+
+vector_128_t
+do_sub_gt (vector_128_t a, vector_128_t b, int *p)
+{
+ vector_128_t ret = __builtin_bcdsub (a, b, 0);
+ if (__builtin_bcdsub_gt (a, b, 0))
+ *p = 1;
+
+ return ret;
+}
+
+vector_128_t
+do_sub_ov (vector_128_t a, vector_128_t b, int *p)
+{
+ vector_128_t ret = __builtin_bcdsub (a, b, 0);
+ if (__builtin_bcdsub_ov (a, b, 0))
+ *p = 1;
+
+ return ret;
+}
--- /dev/null
+/* { dg-do compile { target { powerpc*-*-linux* } } } */
+/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
+/* { dg-skip-if "" { powerpc*-*-*spe* } { "*" } { "" } } */
+/* { dg-require-effective-target powerpc_vsx_ok } */
+/* { dg-options "-mcpu=power7 -O2" } */
+/* { dg-final { scan-assembler-times "ddedpd " 4 } } */
+/* { dg-final { scan-assembler-times "denbcd " 2 } } */
+/* { dg-final { scan-assembler-times "dxex " 1 } } */
+/* { dg-final { scan-assembler-times "diex " 1 } } */
+/* { dg-final { scan-assembler-times "dscli " 2 } } */
+/* { dg-final { scan-assembler-times "dscri " 2 } } */
+/* { dg-final { scan-assembler-not "bl __builtin" } } */
+/* { dg-final { scan-assembler-not "dctqpq" } } */
+/* { dg-final { scan-assembler-not "drdpq" } } */
+/* { dg-final { scan-assembler-not "stfd" } } */
+/* { dg-final { scan-assembler-not "lfd" } } */
+
+_Decimal64
+do_dedpd_0 (_Decimal64 a)
+{
+ return __builtin_ddedpd (0, a);
+}
+
+_Decimal64
+do_dedpd_1 (_Decimal64 a)
+{
+ return __builtin_ddedpd (1, a);
+}
+
+_Decimal64
+do_dedpd_2 (_Decimal64 a)
+{
+ return __builtin_ddedpd (2, a);
+}
+
+_Decimal64
+do_dedpd_3 (_Decimal64 a)
+{
+ return __builtin_ddedpd (3, a);
+}
+
+_Decimal64
+do_enbcd_0 (_Decimal64 a)
+{
+ return __builtin_denbcd (0, a);
+}
+
+_Decimal64
+do_enbcd_1 (_Decimal64 a)
+{
+ return __builtin_denbcd (1, a);
+}
+
+_Decimal64
+do_xex (_Decimal64 a)
+{
+ return __builtin_dxex (a);
+}
+
+_Decimal64
+do_iex (_Decimal64 a, _Decimal64 b)
+{
+ return __builtin_diex (a, b);
+}
+
+_Decimal64
+do_scli_1 (_Decimal64 a)
+{
+ return __builtin_dscli (a, 1);
+}
+
+_Decimal64
+do_scli_10 (_Decimal64 a)
+{
+ return __builtin_dscli (a, 10);
+}
+
+_Decimal64
+do_scri_1 (_Decimal64 a)
+{
+ return __builtin_dscri (a, 1);
+}
+
+_Decimal64
+do_scri_10 (_Decimal64 a)
+{
+ return __builtin_dscri (a, 10);
+}
--- /dev/null
+/* { dg-do compile { target { powerpc*-*-linux* } } } */
+/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
+/* { dg-skip-if "" { powerpc*-*-*spe* } { "*" } { "" } } */
+/* { dg-require-effective-target powerpc_vsx_ok } */
+/* { dg-options "-mcpu=power7 -O2" } */
+/* { dg-final { scan-assembler-times "ddedpdq " 4 } } */
+/* { dg-final { scan-assembler-times "denbcdq " 2 } } */
+/* { dg-final { scan-assembler-times "dxexq " 1 } } */
+/* { dg-final { scan-assembler-times "diexq " 1 } } */
+/* { dg-final { scan-assembler-times "dscliq " 2 } } */
+/* { dg-final { scan-assembler-times "dscriq " 2 } } */
+/* { dg-final { scan-assembler-not "bl __builtin" } } */
+/* { dg-final { scan-assembler-not "dctqpq" } } */
+/* { dg-final { scan-assembler-not "drdpq" } } */
+/* { dg-final { scan-assembler-not "stfd" } } */
+/* { dg-final { scan-assembler-not "lfd" } } */
+
+_Decimal128
+do_dedpdq_0 (_Decimal128 a)
+{
+ return __builtin_ddedpdq (0, a);
+}
+
+_Decimal128
+do_dedpdq_1 (_Decimal128 a)
+{
+ return __builtin_ddedpdq (1, a);
+}
+
+_Decimal128
+do_dedpdq_2 (_Decimal128 a)
+{
+ return __builtin_ddedpdq (2, a);
+}
+
+_Decimal128
+do_dedpdq_3 (_Decimal128 a)
+{
+ return __builtin_ddedpdq (3, a);
+}
+
+_Decimal128
+do_enbcdq_0 (_Decimal128 a)
+{
+ return __builtin_denbcdq (0, a);
+}
+
+_Decimal128
+do_enbcdq_1 (_Decimal128 a)
+{
+ return __builtin_denbcdq (1, a);
+}
+
+_Decimal128
+do_xexq (_Decimal128 a)
+{
+ return __builtin_dxexq (a);
+}
+
+_Decimal128
+do_iexq (_Decimal128 a, _Decimal128 b)
+{
+ return __builtin_diexq (a, b);
+}
+
+_Decimal128
+do_scliq_1 (_Decimal128 a)
+{
+ return __builtin_dscliq (a, 1);
+}
+
+_Decimal128
+do_scliq_10 (_Decimal128 a)
+{
+ return __builtin_dscliq (a, 10);
+}
+
+_Decimal128
+do_scriq_1 (_Decimal128 a)
+{
+ return __builtin_dscriq (a, 1);
+}
+
+_Decimal128
+do_scriq_10 (_Decimal128 a)
+{
+ return __builtin_dscriq (a, 10);
+}
--- /dev/null
+/* { dg-do compile { target { powerpc*-*-linux* } } } */
+/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
+/* { dg-skip-if "" { powerpc*-*-*spe* } { "*" } { "" } } */
+/* { dg-require-effective-target powerpc_vsx_ok } */
+/* { dg-options "-mcpu=power7 -O2" } */
+/* { dg-final { scan-assembler-times "divwe " 1 } } */
+/* { dg-final { scan-assembler-times "divweo " 1 } } */
+/* { dg-final { scan-assembler-times "divweu " 1 } } */
+/* { dg-final { scan-assembler-times "divweuo " 1 } } */
+/* { dg-final { scan-assembler-not "bl __builtin" } } */
+
+int
+div_we (int a, int b)
+{
+ return __builtin_divwe (a, b);
+}
+
+int
+div_weo (int a, int b)
+{
+ return __builtin_divweo (a, b);
+}
+
+unsigned int
+div_weu (unsigned int a, unsigned int b)
+{
+ return __builtin_divweu (a, b);
+}
+
+unsigned int
+div_weuo (unsigned int a, unsigned int b)
+{
+ return __builtin_divweuo (a, b);
+}
--- /dev/null
+/* { dg-do compile { target { powerpc*-*-linux* && lp64 } } } */
+/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
+/* { dg-skip-if "" { powerpc*-*-*spe* } { "*" } { "" } } */
+/* { dg-require-effective-target powerpc_vsx_ok } */
+/* { dg-options "-mcpu=power7 -O2" } */
+/* { dg-final { scan-assembler-times "divde " 1 } } */
+/* { dg-final { scan-assembler-times "divdeo " 1 } } */
+/* { dg-final { scan-assembler-times "divdeu " 1 } } */
+/* { dg-final { scan-assembler-times "divdeuo " 1 } } */
+/* { dg-final { scan-assembler-not "bl __builtin" } } */
+
+long
+div_de (long a, long b)
+{
+ return __builtin_divde (a, b);
+}
+
+long
+div_deo (long a, long b)
+{
+ return __builtin_divdeo (a, b);
+}
+
+unsigned long
+div_deu (unsigned long a, unsigned long b)
+{
+ return __builtin_divdeu (a, b);
+}
+
+unsigned long
+div_deuo (unsigned long a, unsigned long b)
+{
+ return __builtin_divdeuo (a, b);
+}
--- /dev/null
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
+/* { dg-require-effective-target powerpc_htm_ok } */
+/* { dg-options "-O2 -mhtm" } */
+
+/* { dg-final { scan-assembler "rlwinm r?\[0-9\]+,r?\[0-9\]+,3,30,31" { target { ilp32 } } } } */
+/* { dg-final { scan-assembler "rldicl r?\[0-9\]+,r?\[0-9\]+,35,62" { target { lp64 } } } } */
+
+#include <htmintrin.h>
+long
+ttest (void)
+{
+ return _HTM_STATE(__builtin_ttest());
+}
--- /dev/null
+/* { dg-do run { target { powerpc*-*-linux* && lp64 } } } */
+/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
+/* { dg-skip-if "" { powerpc*-*-*spe* } { "*" } { "" } } */
+/* { dg-require-effective-target p8vector_hw } */
+/* { dg-options "-mcpu=power8 -O2" } */
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <altivec.h>
+
+#ifdef DEBUG
+#include <stdio.h>
+#endif
+
+typedef __int128_t __attribute__((__vector_size__(16))) vector_128_t;
+typedef __int128_t scalar_128_t;
+typedef unsigned long long scalar_64_t;
+
+volatile scalar_64_t one = 1;
+volatile scalar_64_t two = 2;
+
+int
+main (void)
+{
+ scalar_128_t a = (((scalar_128_t)one) << 64) | ((scalar_128_t)two);
+ vector_128_t v1 = (vector_128_t) { a };
+ vector_128_t v2 = __builtin_pack_vector_int128 (one, two);
+ scalar_64_t x0 = __builtin_unpack_vector_int128 (v1, 0);
+ scalar_64_t x1 = __builtin_unpack_vector_int128 (v1, 1);
+ vector_128_t v3 = __builtin_pack_vector_int128 (x0, x1);
+
+ size_t i;
+ union {
+ scalar_128_t i128;
+ vector_128_t v128;
+ scalar_64_t u64;
+ unsigned char uc[sizeof (scalar_128_t)];
+ char c[sizeof (scalar_128_t)];
+ } u, u2;
+
+#ifdef DEBUG
+ {
+ printf ("a = 0x");
+ u.i128 = a;
+ for (i = 0; i < sizeof (scalar_128_t); i++)
+ printf ("%.2x", u.uc[i]);
+
+ printf ("\nv1 = 0x");
+ u.v128 = v1;
+ for (i = 0; i < sizeof (scalar_128_t); i++)
+ printf ("%.2x", u.uc[i]);
+
+ printf ("\nv2 = 0x");
+ u.v128 = v2;
+ for (i = 0; i < sizeof (scalar_128_t); i++)
+ printf ("%.2x", u.uc[i]);
+
+ printf ("\nv3 = 0x");
+ u.v128 = v3;
+ for (i = 0; i < sizeof (scalar_128_t); i++)
+ printf ("%.2x", u.uc[i]);
+
+ printf ("\nx0 = 0x");
+ u.u64 = x0;
+ for (i = 0; i < sizeof (scalar_64_t); i++)
+ printf ("%.2x", u.uc[i]);
+
+ printf ("\nx1 = 0x");
+ u.u64 = x1;
+ for (i = 0; i < sizeof (scalar_64_t); i++)
+ printf ("%.2x", u.uc[i]);
+
+ printf ("\n");
+ }
+#endif
+
+ u2.i128 = a;
+ u.v128 = v1;
+ if (memcmp (u.c, u2.c, sizeof (scalar_128_t)) != 0)
+ abort ();
+
+ u.v128 = v2;
+ if (memcmp (u.c, u2.c, sizeof (scalar_128_t)) != 0)
+ abort ();
+
+ u.v128 = v3;
+ if (memcmp (u.c, u2.c, sizeof (scalar_128_t)) != 0)
+ abort ();
+
+ return 0;
+}
--- /dev/null
+/* { dg-do run { target { powerpc*-*-linux* } } } */
+/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
+/* { dg-skip-if "" { powerpc*-*-*spe* } { "*" } { "" } } */
+/* { dg-require-effective-target powerpc_fprs } */
+/* { dg-require-effective-target longdouble128 } */
+/* { dg-options "-O2 -mhard-float" } */
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <math.h>
+
+#ifdef DEBUG
+#include <stdio.h>
+#endif
+
+int
+main (void)
+{
+ double high = pow (2.0, 60);
+ double low = 2.0;
+ long double a = ((long double)high) + ((long double)low);
+ double x0 = __builtin_unpack_longdouble (a, 0);
+ double x1 = __builtin_unpack_longdouble (a, 1);
+ long double b = __builtin_pack_longdouble (x0, x1);
+
+#ifdef DEBUG
+ {
+ size_t i;
+ union {
+ long double ld;
+ double d;
+ unsigned char uc[sizeof (long double)];
+ char c[sizeof (long double)];
+ } u;
+
+ printf ("a = 0x");
+ u.ld = a;
+ for (i = 0; i < sizeof (long double); i++)
+ printf ("%.2x", u.uc[i]);
+
+ printf (", %Lg\n", a);
+
+ printf ("b = 0x");
+ u.ld = b;
+ for (i = 0; i < sizeof (long double); i++)
+ printf ("%.2x", u.uc[i]);
+
+ printf (", %Lg\n", b);
+
+ printf ("hi = 0x");
+ u.d = high;
+ for (i = 0; i < sizeof (double); i++)
+ printf ("%.2x", u.uc[i]);
+
+ printf (",%*s %g\n", (int)(2 * (sizeof (long double) - sizeof (double))), "", high);
+
+ printf ("lo = 0x");
+ u.d = low;
+ for (i = 0; i < sizeof (double); i++)
+ printf ("%.2x", u.uc[i]);
+
+ printf (",%*s %g\n", (int)(2 * (sizeof (long double) - sizeof (double))), "", low);
+
+ printf ("x0 = 0x");
+ u.d = x0;
+ for (i = 0; i < sizeof (double); i++)
+ printf ("%.2x", u.uc[i]);
+
+ printf (",%*s %g\n", (int)(2 * (sizeof (long double) - sizeof (double))), "", x0);
+
+ printf ("x1 = 0x");
+ u.d = x1;
+ for (i = 0; i < sizeof (double); i++)
+ printf ("%.2x", u.uc[i]);
+
+ printf (",%*s %g\n", (int)(2 * (sizeof (long double) - sizeof (double))), "", x1);
+ }
+#endif
+
+ if (high != x0)
+ abort ();
+
+ if (low != x1)
+ abort ();
+
+ if (a != b)
+ abort ();
+
+ if (x0 != high)
+ abort ();
+
+ if (x1 != low)
+ abort ();
+
+ return 0;
+}
--- /dev/null
+/* { dg-do run { target { powerpc*-*-linux* } } } */
+/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
+/* { dg-skip-if "" { powerpc*-*-*spe* } { "*" } { "" } } */
+/* { dg-require-effective-target dfp_hw } */
+/* { dg-options "-O2 -mhard-dfp" } */
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <math.h>
+
+#ifdef DEBUG
+#include <stdio.h>
+#endif
+
+int
+main (void)
+{
+ _Decimal128 one = (_Decimal128)1.0;
+ _Decimal128 two = (_Decimal128)2.0;
+ _Decimal128 ten = (_Decimal128)10.0;
+ _Decimal128 a = one;
+ _Decimal128 b;
+ _Decimal128 c;
+ unsigned long long x0;
+ unsigned long long x1;
+ size_t i;
+
+ for (i = 0; i < 25; i++)
+ a *= ten;
+
+ a += two;
+
+ x0 = __builtin_unpack_dec128 (a, 0);
+ x1 = __builtin_unpack_dec128 (a, 1);
+ b = __builtin_pack_dec128 (x0, x1);
+ c = __builtin_dscliq (one, 25) + two;
+
+#ifdef DEBUG
+ {
+ union {
+ _Decimal128 d;
+ unsigned long long ull;
+ unsigned char uc[sizeof (_Decimal128)];
+ } u;
+
+ printf ("a = 0x");
+ u.d = a;
+ for (i = 0; i < sizeof (_Decimal128); i++)
+ printf ("%.2x", u.uc[i]);
+
+ printf (", %Lg\n", (long double)a);
+
+ printf ("b = 0x");
+ u.d = b;
+ for (i = 0; i < sizeof (_Decimal128); i++)
+ printf ("%.2x", u.uc[i]);
+
+ printf (", %Lg\n", (long double)b);
+
+ printf ("c = 0x");
+ u.d = c;
+ for (i = 0; i < sizeof (_Decimal128); i++)
+ printf ("%.2x", u.uc[i]);
+
+ printf (", %Lg\n", (long double)c);
+
+ printf ("x0 = 0x");
+ u.ull = x0;
+ for (i = 0; i < sizeof (unsigned long long); i++)
+ printf ("%.2x", u.uc[i]);
+
+ printf ("\nx1 = 0x");
+ u.ull = x1;
+ for (i = 0; i < sizeof (unsigned long long); i++)
+ printf ("%.2x", u.uc[i]);
+
+ printf ("\n");
+ }
+#endif
+
+ if (a != b)
+ abort ();
+
+ if (a != c)
+ abort ();
+
+ return 0;
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-mcpu=8548 -mspe -mabi=spe -O2" } */
+/* { dg-skip-if "not an SPE target" { ! powerpc_spe_nocache } { "*" } { "" } } */
+
+/* In PR60735, the type _Decimal64 generated an insn not found message. */
+
+void
+pr60735 (_Decimal64 *p, _Decimal64 *q)
+{
+ *p = *q;
+}
/* { dg-do assemble } */
/* { dg-skip-if "" { powerpc-ibm-aix* } { "*" } { "" } } */
/* { dg-skip-if "no TFmode" { powerpc-*-eabi* } { "*" } { "" } } */
+/* { dg-require-effective-target longdouble128 } */
/* { dg-options "-O2 -fno-align-functions -mtraceback=no -save-temps" } */
typedef float TFmode __attribute__ ((mode (TF)));
--- /dev/null
+/* { dg-do compile { target { powerpc*-*-* && lp64 } } } */
+/* { dg-options "-O2" } */
+/* { dg-final { scan-assembler-times "addc" 1 } } */
+/* { dg-final { scan-assembler-times "adde" 1 } } */
+/* { dg-final { scan-assembler-times "subfc" 1 } } */
+/* { dg-final { scan-assembler-times "subfe" 1 } } */
+/* { dg-final { scan-assembler-not "subf " } } */
+
+__int128
+add_128 (__int128 *ptr, __int128 val)
+{
+ return (*ptr + val);
+}
+
+__int128
+sub_128 (__int128 *ptr, __int128 val)
+{
+ return (*ptr - val);
+}
+
--- /dev/null
+/* { dg-do run { target { powerpc*-*-* && lp64 } } } */
+/* { dg-options "-O2 -fno-inline" } */
+
+union U {
+ __int128 i128;
+ struct {
+ long l1;
+ long l2;
+ } s;
+};
+
+union U u1,u2;
+
+__int128
+create_128 (long most_sig, long least_sig)
+{
+ union U u;
+
+#if __LITTLE_ENDIAN__
+ u.s.l1 = least_sig;
+ u.s.l2 = most_sig;
+#else
+ u.s.l1 = most_sig;
+ u.s.l2 = least_sig;
+#endif
+ return u.i128;
+}
+
+long most_sig (union U * u)
+{
+#if __LITTLE_ENDIAN__
+ return (*u).s.l2;
+#else
+ return (*u).s.l1;
+#endif
+}
+
+long least_sig (union U * u)
+{
+#if __LITTLE_ENDIAN__
+ return (*u).s.l1;
+#else
+ return (*u).s.l2;
+#endif
+}
+
+__int128
+add_128 (__int128 *ptr, __int128 val)
+{
+ return (*ptr + val);
+}
+
+__int128
+sub_128 (__int128 *ptr, __int128 val)
+{
+ return (*ptr - val);
+}
+
+int
+main (void)
+{
+ /* Do a simple add/sub to make sure carry is happening between the dwords
+ and that dwords are in correct endian order. */
+ u1.i128 = create_128 (1, -1);
+ u2.i128 = add_128 (&u1.i128, 1);
+ if ((most_sig (&u2) != 2) || (least_sig (&u2) != 0))
+ __builtin_abort ();
+ u2.i128 = sub_128 (&u2.i128, 1);
+ if ((most_sig (&u2) != 1) || (least_sig (&u2) != -1))
+ __builtin_abort ();
+ return 0;
+}
+
load_lib c-torture.exp
load_lib target-supports.exp
load_lib torture-options.exp
+load_lib clearcap.exp
if { (![istarget x86_64-*-*] && ![istarget i?86-*-*])
|| ![is-effective-target lp64]
}
-# If the linker used understands -M <mapfile>, pass it to clear hardware
-# capabilities set by the Sun assembler.
-set flags ""
-set clearcap_ldflags "-Wl,-M,$srcdir/gcc.target/i386/clearcap.map"
-
-if [check_no_compiler_messages mapfile executable {
- int main (void) { return 0; }
- } $clearcap_ldflags ] {
- set flags $clearcap_ldflags
-}
-
torture-init
+clearcap-init
set-torture-options $C_TORTURE_OPTIONS
-set additional_flags "-W -Wall -mavx $flags"
+set additional_flags "-W -Wall -mavx"
foreach src [lsort [glob -nocomplain $srcdir/$subdir/test_*.c]] {
if {[runtest_file_p $runtests $src]} {
}
}
+clearcap-finish
torture-finish
load_lib c-torture.exp
load_lib target-supports.exp
load_lib torture-options.exp
+load_lib clearcap.exp
if { (![istarget x86_64-*-*] && ![istarget i?86-*-*])
|| ![is-effective-target lp64]
}
-# If the linker used understands -M <mapfile>, pass it to clear hardware
-# capabilities set by the Sun assembler.
-set flags ""
-set clearcap_ldflags "-Wl,-M,$srcdir/gcc.target/i386/clearcap.map"
-
-if [check_no_compiler_messages mapfile executable {
- int main (void) { return 0; }
- } $clearcap_ldflags ] {
- set flags $clearcap_ldflags
-}
-
torture-init
+clearcap-init
set-torture-options $C_TORTURE_OPTIONS
-set additional_flags "-W -Wall -mavx512f $flags"
+set additional_flags "-W -Wall -mavx512f"
foreach src [lsort [glob -nocomplain $srcdir/$subdir/test_*.c]] {
if {[runtest_file_p $runtests $src]} {
}
}
+clearcap-finish
torture-finish
--- /dev/null
+! { dg-do run }
+! Test the fix for PR61459 and PR58883.
+!
+! Contributed by John Wingate <johnww@tds.net>
+! and Tao Song <songtao.thu@gmail.com>
+!
+module a
+
+ implicit none
+ private
+ public :: f_segfault, f_segfault_plus, f_workaround
+ integer, dimension(2,2) :: b = reshape([1,-1,1,1],[2,2])
+
+contains
+
+ function f_segfault(x)
+ real, dimension(:), allocatable :: f_segfault
+ real, dimension(:), intent(in) :: x
+ allocate(f_segfault(2))
+ f_segfault = matmul(b,x)
+ end function f_segfault
+
+! Sefaulted without the ALLOCATE as well.
+ function f_segfault_plus(x)
+ real, dimension(:), allocatable :: f_segfault_plus
+ real, dimension(:), intent(in) :: x
+ f_segfault_plus = matmul(b,x)
+ end function f_segfault_plus
+
+ function f_workaround(x)
+ real, dimension(:), allocatable :: f_workaround
+ real, dimension(:), intent(in) :: x
+ real, dimension(:), allocatable :: tmp
+ allocate(f_workaround(2),tmp(2))
+ tmp = matmul(b,x)
+ f_workaround = tmp
+ end function f_workaround
+
+end module a
+
+program main
+ use a
+ implicit none
+ real, dimension(2) :: x = 1.0, y
+! PR61459
+ y = f_workaround (x)
+ if (any (f_segfault (x) .ne. y)) call abort
+ if (any (f_segfault_plus (x) .ne. y)) call abort
+! PR58883
+ if (any (foo () .ne. reshape([1,2,3,4,5,6,7,8],[2,4]))) call abort
+contains
+ function foo()
+ integer, allocatable :: foo(:,:)
+ integer, allocatable :: temp(:)
+
+ temp = [1,2,3,4,5,6,7,8]
+ foo = reshape(temp,[2,4])
+ end function
+end program main
--- /dev/null
+! { dg-do run }
+! PR61173.f90 Bogus END condition
+module bd
+ character(len=25, kind=1), dimension(:), allocatable, save :: source
+ contains
+ subroutine init_data
+ allocate(source(2))
+ source=[" 1 1 1 ", " 4 4 4 "]
+ end subroutine init_data
+end module bd
+program read_internal
+ use bd
+ integer :: x(6),i
+
+ call init_data
+ read(source,*) (x(i), i=1,6)
+ if (any(x/=[1,1,1,4,4,4])) call abort
+end program read_internal
--- /dev/null
+! { dg-do run }
+! PR61499
+program read_internal
+
+ integer :: x(9),i,iostat
+ character(len=512) :: iomsg
+ character(kind=1,len=30), dimension(:), allocatable, save :: source
+ allocate(source(3))
+ source=[" 1 1 -1"," 1 -1 1"," -1 1 1"] !This fails
+ read(source,*) (x(i), i=1,6)
+end program read_internal
--- /dev/null
+! { dg-do run }
+! PR61640 KIND=4 Character Array Internal Unit Read Fail
+program read_internal
+ integer :: x(9),i
+ integer :: y(9)
+ character(kind=4,len=30), dimension(3) :: source
+
+ y = reshape ((/ 1,1,-1,1,-1,1,-1,1,1 /), shape(x))
+ source=[4_" 1 1 -1",4_" 1 -1 1",4_" -1 1 1"]
+ !print *, (trim(source(i)), i=1,3)
+ read(source,*) (x(i), i=1,9) ! This read fails for KIND=4 character
+ if (any(x /= y )) call abort
+end program read_internal
--- /dev/null
+! { dg-do compile }
+! PR 60834 - this used to ICE.
+
+module m
+ implicit none
+ type :: t
+ real :: diffusion=1.
+ end type
+contains
+ subroutine solve(this, x)
+ class(t), intent(in) :: this
+ real, intent(in) :: x(:)
+ integer :: i
+ integer, parameter :: n(1:5)=[(i,i=1, 5)]
+
+ associate( nu=>this%diffusion)
+ associate( exponential=>exp(-(x(i)-n) ))
+ do i = 1, size(x)
+ end do
+ end associate
+ end associate
+ end subroutine solve
+end module m
--- /dev/null
+! { dg-do run }
+! Test the fix for PR61406
+! Contributed by Adam Hirst <adam@aphirst.karoo.co.uk>
+program test
+ implicit none
+ real :: theta = 1.0
+
+ associate (n => [cos(theta), sin(theta)])
+ if (abs (norm2(n) - 1.0) .gt. 1.0e-4) call abort
+ end associate
+
+end program test
! { dg-do run }
+! { dg-options "-fdump-tree-original" }
!
! Tests the fixes for three bugs with the same underlying cause. All are regressions
! that come about because class array elements end up with a different tree type
bh => bhGet(b,instance=2)
if (loc (b) .ne. loc(bh%hostNode)) call abort
end
+! { dg-final { scan-tree-dump-times "builtin_free" 12 "original" } }
+! { dg-final { cleanup-tree-dump "original" } }
--- /dev/null
+! { dg-do run }
+! { dg-options "-fcray-pointer" }
+!
+! PR fortran/45187
+!
+module foo
+ implicit none
+ real :: a
+ pointer(c_a, a)
+end module foo
+
+program test
+ use foo
+ real :: z
+ c_a = loc(z)
+ a = 42
+ if (z /= 42) call abort
+end program test
! { dg-require-effective-target fortran_large_real }
-! { dg-do run { xfail powerpc*-apple-darwin* powerpc*-*-linux* } }
-! Test XFAILed on these platforms because the system's printf() lacks
+! { dg-do run { xfail powerpc*-apple-darwin* } }
+! Test XFAILed on this platform because the system's printf() lacks
! proper support for denormalized long doubles. See PR24685
!
! This tests that the default formats for formatted I/O of reals are
--- /dev/null
+! { dg-do run }
+!
+! PR fortran/58880
+! PR fortran/60495
+!
+! Contributed by Andrew Benson and Janus Weil
+!
+
+module gn
+ implicit none
+ type sl
+ integer, allocatable, dimension(:) :: lv
+ contains
+ final :: sld
+ end type
+ type :: nde
+ type(sl) :: r
+ end type nde
+
+ integer :: cnt = 0
+
+contains
+
+ subroutine sld(s)
+ type(sl) :: s
+ cnt = cnt + 1
+ ! print *,'Finalize sl'
+ end subroutine
+ subroutine ndm(s)
+ type(nde), intent(inout) :: s
+ type(nde) :: i
+ i=s
+ end subroutine ndm
+end module
+
+program main
+ use gn
+ type :: nde2
+ type(sl) :: r
+ end type nde2
+ type(nde) :: x
+
+ cnt = 0
+ call ndm(x)
+ if (cnt /= 2) call abort()
+
+ cnt = 0
+ call ndm2()
+ if (cnt /= 3) call abort()
+contains
+ subroutine ndm2
+ type(nde2) :: s,i
+ i=s
+ end subroutine ndm2
+end program main
--- /dev/null
+ integer :: i, j
+ integer, dimension (10, 10) :: a
+!$omp parallel do default(none)proc_bind(master)shared(a)
+ do i = 1, 10
+ j = 4
+ do j = 1, 10
+ a(i, j) = i + j
+ end do
+ j = 8
+ end do
+!$omp end parallel do
+!$omp parallel proc_bind (close)
+!$omp parallel default(none) proc_bind (spread) firstprivate(a) private (i)
+ do i = 1, 10
+ a(i, i) = i
+ enddo
+!$omp end parallel
+!$omp endparallel
+end
TYPE(t), SAVE :: a
!$omp threadprivate(a)
- !$omp parallel copyin(a) ! { dg-error "has ALLOCATABLE components" }
+ !$omp parallel copyin(a)
! do something
!$omp end parallel
END SUBROUTINE
SUBROUTINE test_copyprivate()
TYPE(t) :: a
- !$omp single ! { dg-error "has ALLOCATABLE components" }
+ !$omp single
! do something
!$omp end single copyprivate (a)
END SUBROUTINE
SUBROUTINE test_firstprivate
TYPE(t) :: a
- !$omp parallel firstprivate(a) ! { dg-error "has ALLOCATABLE components" }
+ !$omp parallel firstprivate(a)
! do something
!$omp end parallel
END SUBROUTINE
TYPE(t) :: a
INTEGER :: i
- !$omp parallel do lastprivate(a) ! { dg-error "has ALLOCATABLE components" }
+ !$omp parallel do lastprivate(a)
DO i = 1, 1
END DO
!$omp end parallel do
TYPE(t) :: a(10)
INTEGER :: i
- !$omp parallel do reduction(+: a) ! { dg-error "must be of numeric type" }
+ !$omp parallel do reduction(+: a) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" }
DO i = 1, SIZE(a)
END DO
!$omp end parallel do
!$OMP PARALLEL DO REDUCTION(MAX: M) ! MAX is no longer the
! intrinsic so this
! is non-conforming
-! { dg-error "is not INTRINSIC procedure name" "" { target *-*-* } 5 } */
+! { dg-error "OMP DECLARE REDUCTION max not found" "" { target *-*-* } 5 } */
DO I = 1, 100
CALL SUB(M,I)
END DO
--- /dev/null
+! { dg-do compile }
+
+program associate1
+ type dl
+ integer :: i
+ end type
+ type dt
+ integer :: i
+ real :: a(3, 3)
+ type(dl) :: c(3, 3)
+ end type
+ integer :: v, i, j
+ real :: a(3, 3)
+ type(dt) :: b(3)
+ i = 1
+ j = 2
+ associate(k => v, l => a(i, j), m => a(i, :))
+ associate(n => b(j)%c(:, :)%i, o => a, p => b)
+!$omp parallel shared (l) ! { dg-error "ASSOCIATE name" }
+!$omp end parallel
+!$omp parallel firstprivate (m) ! { dg-error "ASSOCIATE name" }
+!$omp end parallel
+!$omp parallel reduction (+: k) ! { dg-error "ASSOCIATE name" }
+!$omp end parallel
+!$omp parallel do firstprivate (k) ! { dg-error "ASSOCIATE name" }
+ do i = 1, 10
+ end do
+!$omp parallel do lastprivate (n) ! { dg-error "ASSOCIATE name" }
+ do i = 1, 10
+ end do
+!$omp parallel do private (o) ! { dg-error "ASSOCIATE name" }
+ do i = 1, 10
+ end do
+!$omp parallel do shared (p) ! { dg-error "ASSOCIATE name" }
+ do i = 1, 10
+ end do
+!$omp task private (k) ! { dg-error "ASSOCIATE name" }
+!$omp end task
+!$omp task shared (l) ! { dg-error "ASSOCIATE name" }
+!$omp end task
+!$omp task firstprivate (m) ! { dg-error "ASSOCIATE name" }
+!$omp end task
+!$omp do private (l) ! { dg-error "ASSOCIATE name" }
+ do i = 1, 10
+ end do
+!$omp do reduction (*: k) ! { dg-error "ASSOCIATE name" }
+ do i = 1, 10
+ end do
+!$omp sections private(o) ! { dg-error "ASSOCIATE name" }
+!$omp section
+!$omp section
+!$omp end sections
+!$omp parallel sections firstprivate(p) ! { dg-error "ASSOCIATE name" }
+!$omp section
+!$omp section
+!$omp endparallelsections
+!$omp parallelsections lastprivate(m) ! { dg-error "ASSOCIATE name" }
+!$omp section
+!$omp section
+!$omp endparallelsections
+!$omp sections reduction(+:k) ! { dg-error "ASSOCIATE name" }
+!$omp section
+!$omp section
+!$omp end sections
+!$omp simd private (l) ! { dg-error "ASSOCIATE name" }
+ do i = 1, 10
+ end do
+ k = 1
+!$omp simd lastprivate (m) ! { dg-error "ASSOCIATE name" }
+ do i = 1, 10
+ end do
+ k = 1
+!$omp simd reduction (+: k) ! { dg-error "ASSOCIATE name" }
+ do i = 1, 10
+ end do
+ k = 1
+!$omp simd linear (k : 2) ! { dg-error "ASSOCIATE name" }
+ do i = 1, 10
+ k = k + 2
+ end do
+ end associate
+ end associate
+end program
--- /dev/null
+! { dg-do compile }
+
+subroutine fn1 (x)
+ integer :: x
+!$omp declare simd (fn1) inbranch notinbranch uniform (x) ! { dg-error "Unclassifiable OpenMP directive" }
+end subroutine fn1
+subroutine fn2 (x)
+!$omp declare simd (fn100) ! { dg-error "should refer to containing procedure" }
+end subroutine fn2
--- /dev/null
+! { dg-do compile }
+
+subroutine foo (x)
+ integer :: x(5, *)
+!$omp parallel
+!$omp single
+!$omp task depend(in:x(:,5))
+!$omp end task
+!$omp task depend(in:x(5,:)) ! { dg-error "Rightmost upper bound of assumed size array section|proper array section" }
+!$omp end task
+!$omp end single
+!$omp end parallel
+end
--- /dev/null
+! { dg-do compile }
+
+subroutine foo (x)
+ integer, pointer, intent (in) :: x
+ integer :: i
+!$omp parallel private (x) ! { dg-error "INTENT.IN. POINTER" }
+!$omp end parallel
+!$omp parallel do lastprivate (x) ! { dg-error "INTENT.IN. POINTER" }
+ do i = 1, 10
+ end do
+!$omp simd linear (x) ! { dg-error "INTENT.IN. POINTER" }
+ do i = 1, 10
+ end do
+!$omp single ! { dg-error "INTENT.IN. POINTER" }
+!$omp end single copyprivate (x)
+end
--- /dev/null
+! { dg-do compile }
+! { dg-options "-fopenmp" }
+!
+! PR fortran/60127
+!
+! OpenMP 4.0 doesn't permit DO CONCURRENT (yet)
+!
+
+!$omp do
+do concurrent(i=1:5) ! { dg-error "OMP DO cannot be a DO CONCURRENT loop" }
+print *, 'Hello'
+end do
+end
--- /dev/null
+! { dg-do compile }
+! { dg-options "-fno-openmp -fopenmp-simd -fdump-tree-original -O2" }
+
+!$omp declare reduction (foo:integer:omp_out = omp_out + omp_in)
+ interface
+ integer function foo (x, y)
+ integer, value :: x, y
+!$omp declare simd (foo) linear (y : 2)
+ end function foo
+ end interface
+ integer :: i, a(64), b, c
+ integer, save :: d
+!$omp threadprivate (d)
+ d = 5
+ a = 6
+!$omp simd
+ do i = 1, 64
+ a(i) = foo (a(i), 2 * i)
+ end do
+ b = 0
+ c = 0
+!$omp simd reduction (+:b) reduction (foo:c)
+ do i = 1, 64
+ b = b + a(i)
+ c = c + a(i) * 2
+ end do
+ print *, b
+ b = 0
+!$omp parallel
+!$omp do simd schedule(static, 4) safelen (8) reduction (+:b)
+ do i = 1, 64
+ a(i) = a(i) + 1
+ b = b + 1
+ end do
+!$omp end parallel
+ print *, b
+ b = 0
+!$omp parallel do simd schedule(static, 4) safelen (8) &
+!$omp num_threads (4) if (.true.) reduction (+:b)
+ do i = 1, 64
+ a(i) = a(i) + 1
+ b = b + 1
+ end do
+ print *, b
+ b = 0
+!$omp parallel
+!$omp do simd schedule(static, 4) safelen (8) reduction (+:b)
+ do i = 1, 64
+ a(i) = a(i) + 1
+ b = b + 1
+ end do
+!$omp enddosimd
+!$omp end parallel
+ print *, b
+ b = 0
+!$omp parallel do simd schedule(static, 4) safelen (8) &
+!$omp num_threads (4) if (.true.) reduction (+:b)
+ do i = 1, 64
+ a(i) = a(i) + 1
+ b = b + 1
+ end do
+!$omp end parallel do simd
+!$omp atomic seq_cst
+ b = b + 1
+!$omp end atomic
+!$omp barrier
+!$omp parallel private (i)
+!$omp cancellation point parallel
+!$omp critical (bar)
+ b = b + 1
+!$omp end critical (bar)
+!$omp flush(b)
+!$omp single
+ b = b + 1
+!$omp end single
+!$omp do ordered
+ do i = 1, 10
+ !$omp atomic
+ b = b + 1
+ !$omp end atomic
+ !$omp ordered
+ print *, b
+ !$omp end ordered
+ end do
+!$omp end do
+!$omp master
+ b = b + 1
+!$omp end master
+!$omp cancel parallel
+!$omp end parallel
+!$omp parallel do schedule(runtime) num_threads(8)
+ do i = 1, 10
+ print *, b
+ end do
+!$omp end parallel do
+!$omp sections
+!$omp section
+ b = b + 1
+!$omp section
+ c = c + 1
+!$omp end sections
+ print *, b
+!$omp parallel sections firstprivate (b) if (.true.)
+!$omp section
+ b = b + 1
+!$omp section
+ c = c + 1
+!$omp endparallelsections
+!$omp workshare
+ b = 24
+!$omp end workshare
+!$omp parallel workshare num_threads (2)
+ b = b + 1
+ c = c + 1
+!$omp end parallel workshare
+ print *, b
+!$omp parallel
+!$omp single
+!$omp taskgroup
+!$omp task firstprivate (b)
+ b = b + 1
+!$omp taskyield
+!$omp end task
+!$omp task firstprivate (b)
+ b = b + 1
+!$omp end task
+!$omp taskwait
+!$omp end taskgroup
+!$omp end single
+!$omp end parallel
+ print *, a, c
+end
+
+! { dg-final { scan-tree-dump-times "pragma omp simd" 6 "original" } }
+! { dg-final { scan-tree-dump-times "pragma omp" 6 "original" } }
+! { dg-final { scan-tree-dump-times "__builtin_GOMP" 0 "original" } }
+! { dg-final { cleanup-tree-dump "original" } }
--- /dev/null
+! { dg-do compile }
+! { dg-options "-fopenmp -fopenmp-simd -fdump-tree-original -O2" }
+
+include 'openmp-simd-1.f90'
+
+! { dg-final { scan-tree-dump-times "pragma omp simd" 6 "original" } }
+! { dg-final { scan-tree-dump-times "pragma omp" 39 "original" } }
+! { dg-final { scan-tree-dump-times "pragma omp for" 6 "original" } }
+! { dg-final { scan-tree-dump-times "pragma omp parallel" 9 "original" } }
+! { dg-final { scan-tree-dump-times "pragma omp taskgroup" 1 "original" } }
+! Includes the above taskgroup
+! { dg-final { scan-tree-dump-times "pragma omp task" 3 "original" } }
+! { dg-final { scan-tree-dump-times "pragma omp critical" 1 "original" } }
+! { dg-final { scan-tree-dump-times "pragma omp atomic" 2 "original" } }
+! { dg-final { scan-tree-dump-times "pragma omp sections" 2 "original" } }
+! Includes the above sections
+! { dg-final { scan-tree-dump-times "pragma omp section" 6 "original" } }
+! { dg-final { scan-tree-dump-times "pragma omp single" 4 "original" } }
+! { dg-final { scan-tree-dump-times "pragma omp ordered" 1 "original" } }
+! { dg-final { scan-tree-dump-times "pragma omp master" 1 "original" } }
+! { dg-final { scan-tree-dump-times "__builtin_GOMP" 5 "original" } }
+! { dg-final { scan-tree-dump-times "__builtin_GOMP_barrier" 1 "original" } }
+! { dg-final { scan-tree-dump-times "__builtin_GOMP_cancellation_point" 1 "original" } }
+! Includes the above cancellation point
+! { dg-final { scan-tree-dump-times "__builtin_GOMP_cancel" 2 "original" } }
+! { dg-final { scan-tree-dump-times "__builtin_GOMP_taskyield" 1 "original" } }
+! { dg-final { scan-tree-dump-times "__builtin_GOMP_taskwait" 1 "original" } }
+! { dg-final { cleanup-tree-dump "original" } }
--- /dev/null
+! { dg-do compile }
+! { dg-options "-fopenmp -fno-openmp-simd -fdump-tree-original -O2" }
+
+include 'openmp-simd-1.f90'
+
+! { dg-final { scan-tree-dump-times "pragma omp simd" 6 "original" } }
+! { dg-final { scan-tree-dump-times "pragma omp" 39 "original" } }
+! { dg-final { scan-tree-dump-times "pragma omp for" 6 "original" } }
+! { dg-final { scan-tree-dump-times "pragma omp parallel" 9 "original" } }
+! { dg-final { scan-tree-dump-times "pragma omp taskgroup" 1 "original" } }
+! Includes the above taskgroup
+! { dg-final { scan-tree-dump-times "pragma omp task" 3 "original" } }
+! { dg-final { scan-tree-dump-times "pragma omp critical" 1 "original" } }
+! { dg-final { scan-tree-dump-times "pragma omp atomic" 2 "original" } }
+! { dg-final { scan-tree-dump-times "pragma omp sections" 2 "original" } }
+! Includes the above sections
+! { dg-final { scan-tree-dump-times "pragma omp section" 6 "original" } }
+! { dg-final { scan-tree-dump-times "pragma omp single" 4 "original" } }
+! { dg-final { scan-tree-dump-times "pragma omp ordered" 1 "original" } }
+! { dg-final { scan-tree-dump-times "pragma omp master" 1 "original" } }
+! { dg-final { scan-tree-dump-times "__builtin_GOMP" 5 "original" } }
+! { dg-final { scan-tree-dump-times "__builtin_GOMP_barrier" 1 "original" } }
+! { dg-final { scan-tree-dump-times "__builtin_GOMP_cancellation_point" 1 "original" } }
+! Includes the above cancellation point
+! { dg-final { scan-tree-dump-times "__builtin_GOMP_cancel" 2 "original" } }
+! { dg-final { scan-tree-dump-times "__builtin_GOMP_taskyield" 1 "original" } }
+! { dg-final { scan-tree-dump-times "__builtin_GOMP_taskwait" 1 "original" } }
+! { dg-final { cleanup-tree-dump "original" } }
--- /dev/null
+! { dg-do compile }
+ procedure(foo), pointer :: ptr
+ integer :: i
+ ptr => foo
+!$omp do reduction (+ : ptr) ! { dg-error "Procedure pointer|not found" }
+ do i = 1, 10
+ end do
+!$omp simd linear (ptr) ! { dg-error "must be INTEGER" }
+ do i = 1, 10
+ end do
+contains
+ subroutine foo
+ end subroutine
+end
!$omp end parallel
!$omp parallel reduction (*:ia1) ! { dg-error "Assumed size" }
!$omp end parallel
-!$omp parallel reduction (+:l1) ! { dg-error "must be of numeric type, got LOGICAL" }
+!$omp parallel reduction (+:l1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" }
!$omp end parallel
-!$omp parallel reduction (*:la1) ! { dg-error "must be of numeric type, got LOGICAL" }
+!$omp parallel reduction (*:la1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" }
!$omp end parallel
-!$omp parallel reduction (-:a1) ! { dg-error "must be of numeric type, got CHARACTER" }
+!$omp parallel reduction (-:a1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" }
!$omp end parallel
-!$omp parallel reduction (+:t1) ! { dg-error "must be of numeric type, got TYPE" }
+!$omp parallel reduction (+:t1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" }
!$omp end parallel
-!$omp parallel reduction (*:ta1) ! { dg-error "must be of numeric type, got TYPE" }
+!$omp parallel reduction (*:ta1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" }
!$omp end parallel
-!$omp parallel reduction (.and.:i3) ! { dg-error "must be LOGICAL" }
+!$omp parallel reduction (.and.:i3) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" }
!$omp end parallel
-!$omp parallel reduction (.or.:ia2) ! { dg-error "must be LOGICAL" }
+!$omp parallel reduction (.or.:ia2) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" }
!$omp end parallel
-!$omp parallel reduction (.eqv.:r1) ! { dg-error "must be LOGICAL" }
+!$omp parallel reduction (.eqv.:r1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" }
!$omp end parallel
-!$omp parallel reduction (.neqv.:ra1) ! { dg-error "must be LOGICAL" }
+!$omp parallel reduction (.neqv.:ra1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" }
!$omp end parallel
-!$omp parallel reduction (.and.:d1) ! { dg-error "must be LOGICAL" }
+!$omp parallel reduction (.and.:d1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" }
!$omp end parallel
-!$omp parallel reduction (.or.:da1) ! { dg-error "must be LOGICAL" }
+!$omp parallel reduction (.or.:da1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" }
!$omp end parallel
-!$omp parallel reduction (.eqv.:c1) ! { dg-error "must be LOGICAL" }
+!$omp parallel reduction (.eqv.:c1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" }
!$omp end parallel
-!$omp parallel reduction (.neqv.:ca1) ! { dg-error "must be LOGICAL" }
+!$omp parallel reduction (.neqv.:ca1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" }
!$omp end parallel
-!$omp parallel reduction (.and.:a1) ! { dg-error "must be LOGICAL" }
+!$omp parallel reduction (.and.:a1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" }
!$omp end parallel
-!$omp parallel reduction (.or.:t1) ! { dg-error "must be LOGICAL" }
+!$omp parallel reduction (.or.:t1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" }
!$omp end parallel
-!$omp parallel reduction (.eqv.:ta1) ! { dg-error "must be LOGICAL" }
+!$omp parallel reduction (.eqv.:ta1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" }
!$omp end parallel
-!$omp parallel reduction (min:c1) ! { dg-error "must be INTEGER or REAL" }
+!$omp parallel reduction (min:c1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" }
!$omp end parallel
-!$omp parallel reduction (max:ca1) ! { dg-error "must be INTEGER or REAL" }
+!$omp parallel reduction (max:ca1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" }
!$omp end parallel
-!$omp parallel reduction (max:l1) ! { dg-error "must be INTEGER or REAL" }
+!$omp parallel reduction (max:l1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" }
!$omp end parallel
-!$omp parallel reduction (min:la1) ! { dg-error "must be INTEGER or REAL" }
+!$omp parallel reduction (min:la1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" }
!$omp end parallel
-!$omp parallel reduction (max:a1) ! { dg-error "must be INTEGER or REAL" }
+!$omp parallel reduction (max:a1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" }
!$omp end parallel
-!$omp parallel reduction (min:t1) ! { dg-error "must be INTEGER or REAL" }
+!$omp parallel reduction (min:t1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" }
!$omp end parallel
-!$omp parallel reduction (max:ta1) ! { dg-error "must be INTEGER or REAL" }
+!$omp parallel reduction (max:ta1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" }
!$omp end parallel
-!$omp parallel reduction (iand:r1) ! { dg-error "must be INTEGER" }
+!$omp parallel reduction (iand:r1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" }
!$omp end parallel
-!$omp parallel reduction (ior:ra1) ! { dg-error "must be INTEGER" }
+!$omp parallel reduction (ior:ra1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" }
!$omp end parallel
-!$omp parallel reduction (ieor:d1) ! { dg-error "must be INTEGER" }
+!$omp parallel reduction (ieor:d1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" }
!$omp end parallel
-!$omp parallel reduction (ior:da1) ! { dg-error "must be INTEGER" }
+!$omp parallel reduction (ior:da1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" }
!$omp end parallel
-!$omp parallel reduction (iand:c1) ! { dg-error "must be INTEGER" }
+!$omp parallel reduction (iand:c1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" }
!$omp end parallel
-!$omp parallel reduction (ior:ca1) ! { dg-error "must be INTEGER" }
+!$omp parallel reduction (ior:ca1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" }
!$omp end parallel
-!$omp parallel reduction (ieor:l1) ! { dg-error "must be INTEGER" }
+!$omp parallel reduction (ieor:l1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" }
!$omp end parallel
-!$omp parallel reduction (iand:la1) ! { dg-error "must be INTEGER" }
+!$omp parallel reduction (iand:la1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" }
!$omp end parallel
-!$omp parallel reduction (ior:a1) ! { dg-error "must be INTEGER" }
+!$omp parallel reduction (ior:a1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" }
!$omp end parallel
-!$omp parallel reduction (ieor:t1) ! { dg-error "must be INTEGER" }
+!$omp parallel reduction (ieor:t1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" }
!$omp end parallel
-!$omp parallel reduction (iand:ta1) ! { dg-error "must be INTEGER" }
+!$omp parallel reduction (iand:ta1) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found for type" }
!$omp end parallel
end subroutine
integer :: i, ior
ior = 6
i = 6
-!$omp parallel reduction (ior:i) ! { dg-error "is not INTRINSIC procedure name" }
+!$omp parallel reduction (ior:i) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found" }
!$omp end parallel
end subroutine f1
subroutine f2
end function
end interface
i = 6
-!$omp parallel reduction (ior:i) ! { dg-error "is not INTRINSIC procedure name" }
+!$omp parallel reduction (ior:i) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found" }
i = ior (i, 3)
!$omp end parallel
end subroutine f2
use mreduction3
integer :: i
i = 6
-!$omp parallel reduction (ior:i) ! { dg-error "is not INTRINSIC procedure name" }
+!$omp parallel reduction (ior:i) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found" }
i = ior (i, 7)
!$omp end parallel
end subroutine f5
use mreduction3
integer :: i
i = 6
-!$omp parallel reduction (iand:i) ! { dg-error "is not INTRINSIC procedure name" }
+!$omp parallel reduction (iand:i) ! { dg-error "OMP DECLARE REDUCTION\[^\n\r\]*not found" }
i = iand (i, 18)
!$omp end parallel
end subroutine f6
--- /dev/null
+! { dg-do compile }
+! { dg-options "-fopenmp" }
+
+module target1
+ interface
+ subroutine dosomething (a, n, m)
+ integer :: a (:), n, m
+ !$omp declare target
+ end subroutine dosomething
+ end interface
+contains
+ subroutine foo (n, o, p, q, r, pp)
+ integer :: n, o, p, q, r, s, i, j
+ integer :: a (2:o)
+ integer, pointer :: pp
+ !$omp target data device (n + 1) if (n .ne. 6) map (tofrom: n, r)
+ !$omp target device (n + 1) if (n .ne. 6) map (from: n) map (alloc: a(2:o))
+ call dosomething (a, n, 0)
+ !$omp end target
+ !$omp target teams device (n + 1) num_teams (n + 4) thread_limit (n * 2) &
+ !$omp & if (n .ne. 6)map (from: n) map (alloc: a(2:o)) default(shared) &
+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r)
+ r = r + 1
+ p = q
+ call dosomething (a, n, p + q)
+ !$omp end target teams
+ !$omp target teams distribute device (n + 1) num_teams (n + 4) collapse (2) &
+ !$omp & if (n .ne. 6)map (from: n) map (alloc: a(2:o)) default(shared) &
+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) &
+ !$omp & thread_limit (n * 2) dist_schedule (static, 4)
+ do i = 1, 10
+ do j = 1, 10
+ r = r + 1
+ p = q
+ call dosomething (a, n, p + q)
+ end do
+ end do
+ !$omp target teams distribute device (n + 1) num_teams (n + 4) &
+ !$omp & if (n .ne. 6)map (from: n) map (alloc: a(2:o)) default(shared) &
+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) &
+ !$omp & thread_limit (n * 2) dist_schedule (static, 4)
+ do i = 1, 10
+ do j = 1, 10
+ r = r + 1
+ p = q
+ call dosomething (a, n, p + q)
+ end do
+ end do
+ !$omp end target teams distribute
+ !$omp target teams distribute parallel do device (n + 1) num_teams (n + 4) &
+ !$omp & if (n .ne. 6)map (from: n) map (alloc: a(2:o)) default(shared) &
+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) &
+ !$omp & thread_limit (n * 2) dist_schedule (static, 4) collapse (2) &
+ !$omp & num_threads (n + 4) proc_bind (spread) lastprivate (s) &
+ !$omp & ordered schedule (static, 8)
+ do i = 1, 10
+ do j = 1, 10
+ r = r + 1
+ p = q
+ call dosomething (a, n, p + q)
+ !$omp ordered
+ p = q
+ !$omp end ordered
+ s = i * 10 + j
+ end do
+ end do
+ !$omp target teams distribute parallel do device (n + 1) num_teams (n + 4) &
+ !$omp & if (n .ne. 6)map (from: n) map (alloc: a(2:o)) default(shared) &
+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) &
+ !$omp & thread_limit (n * 2) dist_schedule (static, 4) num_threads (n + 4) &
+ !$omp & proc_bind (master) lastprivate (s) ordered schedule (static, 8)
+ do i = 1, 10
+ do j = 1, 10
+ r = r + 1
+ p = q
+ call dosomething (a, n, p + q)
+ end do
+ !$omp ordered
+ p = q
+ !$omp end ordered
+ s = i * 10
+ end do
+ !$omp end target teams distribute parallel do
+ !$omp target teams distribute parallel do simd device (n + 1) &
+ !$omp & if (n .ne. 6)map (from: n) map (alloc: a(2:o)) default(shared) &
+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) &
+ !$omp & thread_limit (n * 2) dist_schedule (static, 4) collapse (2) &
+ !$omp & num_threads (n + 4) proc_bind (spread) lastprivate (s) &
+ !$omp & schedule (static, 8) num_teams (n + 4) safelen(8)
+ do i = 1, 10
+ do j = 1, 10
+ r = r + 1
+ p = q
+ a(2+i*10+j) = p + q
+ s = i * 10 + j
+ end do
+ end do
+ !$omp target teams distribute parallel do simd device (n + 1) &
+ !$omp & if (n .ne. 6)map (from: n) map (alloc: a(2:o)) default(shared) &
+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) &
+ !$omp & thread_limit (n * 2) dist_schedule (static, 4) num_threads (n + 4) &
+ !$omp & proc_bind (master) lastprivate (s) schedule (static, 8) &
+ !$omp & num_teams (n + 4) safelen(16) linear(i:1) aligned (pp:4)
+ do i = 1, 10
+ r = r + 1
+ p = q
+ a(1+i) = p + q
+ s = i * 10
+ end do
+ !$omp end target teams distribute parallel do simd
+ !$omp target teams distribute simd device (n + 1) &
+ !$omp & if (n .ne. 6)map (from: n) map (alloc: a(2:o)) default(shared) &
+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) &
+ !$omp & thread_limit (n * 2) dist_schedule (static, 4) collapse (2) &
+ !$omp & lastprivate (s) num_teams (n + 4) safelen(8)
+ do i = 1, 10
+ do j = 1, 10
+ r = r + 1
+ p = q
+ a(2+i*10+j) = p + q
+ s = i * 10 + j
+ end do
+ end do
+ !$omp target teams distribute simd device (n + 1) &
+ !$omp & if (n .ne. 6)map (from: n) map (alloc: a(2:o)) default(shared) &
+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) &
+ !$omp & thread_limit (n * 2) dist_schedule (static, 4) lastprivate (s) &
+ !$omp & num_teams (n + 4) safelen(16) linear(i:1) aligned (pp:4)
+ do i = 1, 10
+ r = r + 1
+ p = q
+ a(1+i) = p + q
+ s = i * 10
+ end do
+ !$omp end target teams distribute simd
+ !$omp target device (n + 1) if (n .ne. 6)map (from: n) map (alloc: a(2:o))
+ !$omp teams num_teams (n + 4) thread_limit (n * 2) default(shared) &
+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r)
+ r = r + 1
+ p = q
+ call dosomething (a, n, p + q)
+ !$omp end teams
+ !$omp end target
+ !$omp target device (n + 1) if (n .ne. 6)map (from: n) map (alloc: a(2:o))
+ !$omp teams distribute num_teams (n + 4) collapse (2) default(shared) &
+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) &
+ !$omp & thread_limit (n * 2) dist_schedule (static, 4)
+ do i = 1, 10
+ do j = 1, 10
+ r = r + 1
+ p = q
+ call dosomething (a, n, p + q)
+ end do
+ end do
+ !$omp end target
+ !$omp target device (n + 1) if (n .ne. 6)map (from: n) map (alloc: a(2:o))
+ !$omp teams distribute num_teams (n + 4) default(shared) &
+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) &
+ !$omp & thread_limit (n * 2) dist_schedule (static, 4)
+ do i = 1, 10
+ do j = 1, 10
+ r = r + 1
+ p = q
+ call dosomething (a, n, p + q)
+ end do
+ end do
+ !$omp end teams distribute
+ !$omp end target
+ !$omp target device (n + 1) if (n .ne. 6)map (from: n) map (alloc: a(2:o))
+ !$omp teams distribute parallel do num_teams (n + 4) &
+ !$omp & if (n .ne. 6) default(shared) ordered schedule (static, 8) &
+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) &
+ !$omp & thread_limit (n * 2) dist_schedule (static, 4) collapse (2) &
+ !$omp & num_threads (n + 4) proc_bind (spread) lastprivate (s)
+ do i = 1, 10
+ do j = 1, 10
+ r = r + 1
+ p = q
+ call dosomething (a, n, p + q)
+ !$omp ordered
+ p = q
+ !$omp end ordered
+ s = i * 10 + j
+ end do
+ end do
+ !$omp end target
+ !$omp target device (n + 1) if (n .ne. 6)map (from: n) map (alloc: a(2:o))
+ !$omp teams distribute parallel do num_teams (n + 4)if(n.ne.6)default(shared)&
+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) &
+ !$omp & thread_limit (n * 2) dist_schedule (static, 4) num_threads (n + 4) &
+ !$omp & proc_bind (master) lastprivate (s) ordered schedule (static, 8)
+ do i = 1, 10
+ do j = 1, 10
+ r = r + 1
+ p = q
+ call dosomething (a, n, p + q)
+ end do
+ !$omp ordered
+ p = q
+ !$omp end ordered
+ s = i * 10
+ end do
+ !$omp end teams distribute parallel do
+ !$omp end target
+ !$omp target device (n + 1) if (n .ne. 6)map (from: n) map (alloc: a(2:o))
+ !$omp teams distribute parallel do simd if(n.ne.6)default(shared)&
+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) &
+ !$omp & thread_limit (n * 2) dist_schedule (static, 4) collapse (2) &
+ !$omp & num_threads (n + 4) proc_bind (spread) lastprivate (s) &
+ !$omp & schedule (static, 8) num_teams (n + 4) safelen(8)
+ do i = 1, 10
+ do j = 1, 10
+ r = r + 1
+ p = q
+ a(2+i*10+j) = p + q
+ s = i * 10 + j
+ end do
+ end do
+ !$omp end target
+ !$omp target device (n + 1) if (n .ne. 6)map (from: n) map (alloc: a(2:o))
+ !$omp teams distribute parallel do simd if (n .ne. 6)default(shared) &
+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) &
+ !$omp & thread_limit (n * 2) dist_schedule (static, 4) num_threads (n + 4) &
+ !$omp & proc_bind (master) lastprivate (s) schedule (static, 8) &
+ !$omp & num_teams (n + 4) safelen(16) linear(i:1) aligned (pp:4)
+ do i = 1, 10
+ r = r + 1
+ p = q
+ a(1+i) = p + q
+ s = i * 10
+ end do
+ !$omp end teams distribute parallel do simd
+ !$omp end target
+ !$omp target device (n + 1) if (n .ne. 6)map (from: n) map (alloc: a(2:o))
+ !$omp teams distribute simd default(shared) safelen(8) &
+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) &
+ !$omp & thread_limit (n * 2) dist_schedule (static, 4) collapse (2) &
+ !$omp & lastprivate (s) num_teams (n + 4)
+ do i = 1, 10
+ do j = 1, 10
+ r = r + 1
+ p = q
+ a(2+i*10+j) = p + q
+ s = i * 10 + j
+ end do
+ end do
+ !$omp end target
+ !$omp target device (n + 1) if (n .ne. 6)map (from: n) map (alloc: a(2:o))
+ !$omp teams distribute simd default(shared) aligned (pp:4) &
+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) &
+ !$omp & thread_limit (n * 2) dist_schedule (static, 4) lastprivate (s)
+ do i = 1, 10
+ r = r + 1
+ p = q
+ a(1+i) = p + q
+ s = i * 10
+ end do
+ !$omp end teams distribute simd
+ !$omp end target
+ !$omp target teams device (n + 1) if (n .ne. 6)map (from: n) &
+ !$omp & map (alloc: a(2:o)) num_teams (n + 4) thread_limit (n * 2) &
+ !$omp & default(shared) shared(n) private (p) reduction ( + : r )
+ !$omp distribute collapse (2) firstprivate (q) dist_schedule (static, 4)
+ do i = 1, 10
+ do j = 1, 10
+ r = r + 1
+ p = q
+ call dosomething (a, n, p + q)
+ end do
+ end do
+ !$omp end target teams
+ !$omp target teams device (n + 1) if (n .ne. 6)map (from: n) &
+ !$omp & map (alloc: a(2:o)) num_teams (n + 4) thread_limit (n * 2) &
+ !$omp & default(shared) shared(n) private (p) reduction(+:r)
+ !$omp distribute firstprivate (q) dist_schedule (static, 4)
+ do i = 1, 10
+ do j = 1, 10
+ r = r + 1
+ p = q
+ call dosomething (a, n, p + q)
+ end do
+ end do
+ !$omp end distribute
+ !$omp end target teams
+ !$omp target teams device (n + 1) if (n .ne. 6)map (from: n) &
+ !$omp & map (alloc: a(2:o)) num_teams (n + 4) thread_limit (n * 2) &
+ !$omp & default(shared) shared(n) private (p) reduction(+:r)
+ !$omp distribute parallel do if (n .ne. 6) default(shared) &
+ !$omp & ordered schedule (static, 8) private (p) firstprivate (q) &
+ !$omp & shared(n)reduction(+:r)dist_schedule(static,4)collapse(2)&
+ !$omp & num_threads (n + 4) proc_bind (spread) lastprivate (s)
+ do i = 1, 10
+ do j = 1, 10
+ r = r + 1
+ p = q
+ call dosomething (a, n, p + q)
+ !$omp ordered
+ p = q
+ !$omp end ordered
+ s = i * 10 + j
+ end do
+ end do
+ !$omp end target teams
+ !$omp target teams device (n + 1) if (n .ne. 6)map (from: n) &
+ !$omp & map (alloc: a(2:o)) num_teams (n + 4) thread_limit (n * 2) &
+ !$omp & default(shared) shared(n) private (p) reduction(+:r)
+ !$omp distribute parallel do if(n.ne.6)default(shared)&
+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) &
+ !$omp & dist_schedule (static, 4) num_threads (n + 4) &
+ !$omp & proc_bind (master) lastprivate (s) ordered schedule (static, 8)
+ do i = 1, 10
+ do j = 1, 10
+ r = r + 1
+ p = q
+ call dosomething (a, n, p + q)
+ end do
+ !$omp ordered
+ p = q
+ !$omp end ordered
+ s = i * 10
+ end do
+ !$omp end distribute parallel do
+ !$omp end target teams
+ !$omp target teams device (n + 1) if (n .ne. 6)map (from: n) &
+ !$omp & map (alloc: a(2:o)) num_teams (n + 4) thread_limit (n * 2) &
+ !$omp & default(shared) shared(n) private (p) reduction(+:r)
+ !$omp distribute parallel do simd if(n.ne.6)default(shared)&
+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) &
+ !$omp & dist_schedule (static, 4) collapse (2) safelen(8) &
+ !$omp & num_threads (n + 4) proc_bind (spread) lastprivate (s) &
+ !$omp & schedule (static, 8)
+ do i = 1, 10
+ do j = 1, 10
+ r = r + 1
+ p = q
+ a(2+i*10+j) = p + q
+ s = i * 10 + j
+ end do
+ end do
+ !$omp end target teams
+ !$omp target teams device (n + 1) if (n .ne. 6)map (from: n) &
+ !$omp & map (alloc: a(2:o)) num_teams (n + 4) thread_limit (n * 2) &
+ !$omp & default(shared) shared(n) private (p) reduction(+:r)
+ !$omp distribute parallel do simd if (n .ne. 6)default(shared) &
+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) &
+ !$omp & dist_schedule (static, 4) num_threads (n + 4) &
+ !$omp & proc_bind (master) lastprivate (s) schedule (static, 8) &
+ !$omp & safelen(16) linear(i:1) aligned (pp:4)
+ do i = 1, 10
+ r = r + 1
+ p = q
+ a(1+i) = p + q
+ s = i * 10
+ end do
+ !$omp end distribute parallel do simd
+ !$omp end target teams
+ !$omp target teams device (n + 1) if (n .ne. 6)map (from: n) &
+ !$omp & map (alloc: a(2:o)) num_teams (n + 4) thread_limit (n * 2) &
+ !$omp & default(shared) shared(n) private (p) reduction(+:r)
+ !$omp distribute simd safelen(8) lastprivate(s) &
+ !$omp & private (p) firstprivate (q) reduction (+: r) &
+ !$omp & dist_schedule (static, 4) collapse (2)
+ do i = 1, 10
+ do j = 1, 10
+ r = r + 1
+ p = q
+ a(2+i*10+j) = p + q
+ s = i * 10 + j
+ end do
+ end do
+ !$omp end target teams
+ !$omp target teams device (n + 1) if (n .ne. 6)map (from: n) &
+ !$omp & map (alloc: a(2:o)) num_teams (n + 4) thread_limit (n * 2) &
+ !$omp & default(shared) shared(n) private (p) reduction(+:r)
+ !$omp distribute simd aligned (pp:4) &
+ !$omp & private (p) firstprivate (q) reduction (+: r) &
+ !$omp & dist_schedule (static, 4) lastprivate (s)
+ do i = 1, 10
+ r = r + 1
+ p = q
+ a(1+i) = p + q
+ s = i * 10
+ end do
+ !$omp end distribute simd
+ !$omp end target teams
+ !$omp end target data
+ end subroutine
+ subroutine bar (n, o, p, r, pp)
+ integer :: n, o, p, q, r, s, i, j
+ integer :: a (2:o)
+ integer, pointer :: pp
+ common /blk/ i, j, q
+ !$omp target teams device (n + 1) if (n .ne. 6)map (from: n) &
+ !$omp & map (alloc: a(2:o)) num_teams (n + 4) thread_limit (n * 2) &
+ !$omp & default(shared) shared(n) private (p) reduction ( + : r )
+ !$omp distribute collapse (2) firstprivate (q) dist_schedule (static, 4)
+ do i = 1, 10
+ do j = 1, 10
+ r = r + 1
+ p = q
+ call dosomething (a, n, p + q)
+ end do
+ end do
+ !$omp end target teams
+ !$omp target teams device (n + 1) if (n .ne. 6)map (from: n) &
+ !$omp & map (alloc: a(2:o)) num_teams (n + 4) thread_limit (n * 2) &
+ !$omp & default(shared) shared(n) private (p) reduction(+:r)
+ !$omp distribute firstprivate (q) dist_schedule (static, 4)
+ do i = 1, 10
+ do j = 1, 10
+ r = r + 1
+ p = q
+ call dosomething (a, n, p + q)
+ end do
+ end do
+ !$omp end distribute
+ !$omp end target teams
+ !$omp target teams device (n + 1) if (n .ne. 6)map (from: n) &
+ !$omp & map (alloc: a(2:o)) num_teams (n + 4) thread_limit (n * 2) &
+ !$omp & default(shared) shared(n) private (p) reduction(+:r)
+ !$omp distribute parallel do if (n .ne. 6) default(shared) &
+ !$omp & ordered schedule (static, 8) private (p) firstprivate (q) &
+ !$omp & shared(n)reduction(+:r)dist_schedule(static,4)collapse(2)&
+ !$omp & num_threads (n + 4) proc_bind (spread) lastprivate (s)
+ do i = 1, 10
+ do j = 1, 10
+ r = r + 1
+ p = q
+ call dosomething (a, n, p + q)
+ !$omp ordered
+ p = q
+ !$omp end ordered
+ s = i * 10 + j
+ end do
+ end do
+ !$omp end target teams
+ !$omp target teams device (n + 1) if (n .ne. 6)map (from: n) &
+ !$omp & map (alloc: a(2:o)) num_teams (n + 4) thread_limit (n * 2) &
+ !$omp & default(shared) shared(n) private (p) reduction(+:r)
+ !$omp distribute parallel do if(n.ne.6)default(shared)&
+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) &
+ !$omp & dist_schedule (static, 4) num_threads (n + 4) &
+ !$omp & proc_bind (master) lastprivate (s) ordered schedule (static, 8)
+ do i = 1, 10
+ do j = 1, 10
+ r = r + 1
+ p = q
+ call dosomething (a, n, p + q)
+ end do
+ !$omp ordered
+ p = q
+ !$omp end ordered
+ s = i * 10
+ end do
+ !$omp end distribute parallel do
+ !$omp end target teams
+ !$omp target teams device (n + 1) if (n .ne. 6)map (from: n) &
+ !$omp & map (alloc: a(2:o)) num_teams (n + 4) thread_limit (n * 2) &
+ !$omp & default(shared) shared(n) private (p) reduction(+:r)
+ !$omp distribute parallel do simd if(n.ne.6)default(shared)&
+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) &
+ !$omp & dist_schedule (static, 4) collapse (2) safelen(8) &
+ !$omp & num_threads (n + 4) proc_bind (spread) lastprivate (s) &
+ !$omp & schedule (static, 8)
+ do i = 1, 10
+ do j = 1, 10
+ r = r + 1
+ p = q
+ a(2+i*10+j) = p + q
+ s = i * 10 + j
+ end do
+ end do
+ !$omp end target teams
+ !$omp target teams device (n + 1) if (n .ne. 6)map (from: n) &
+ !$omp & map (alloc: a(2:o)) num_teams (n + 4) thread_limit (n * 2) &
+ !$omp & default(shared) shared(n) private (p) reduction(+:r)
+ !$omp distribute parallel do simd if (n .ne. 6)default(shared) &
+ !$omp & private (p) firstprivate (q) shared (n) reduction (+: r) &
+ !$omp & dist_schedule (static, 4) num_threads (n + 4) &
+ !$omp & proc_bind (master) lastprivate (s) schedule (static, 8) &
+ !$omp & safelen(16) linear(i:1) aligned (pp:4)
+ do i = 1, 10
+ r = r + 1
+ p = q
+ a(1+i) = p + q
+ s = i * 10
+ end do
+ !$omp end distribute parallel do simd
+ !$omp end target teams
+ !$omp target teams device (n + 1) if (n .ne. 6)map (from: n) &
+ !$omp & map (alloc: a(2:o)) num_teams (n + 4) thread_limit (n * 2) &
+ !$omp & default(shared) shared(n) private (p) reduction(+:r)
+ !$omp distribute simd safelen(8) lastprivate(s) &
+ !$omp & private (p) firstprivate (q) reduction (+: r) &
+ !$omp & dist_schedule (static, 4) collapse (2)
+ do i = 1, 10
+ do j = 1, 10
+ r = r + 1
+ p = q
+ a(2+i*10+j) = p + q
+ s = i * 10 + j
+ end do
+ end do
+ !$omp end target teams
+ !$omp target teams device (n + 1) if (n .ne. 6)map (from: n) &
+ !$omp & map (alloc: a(2:o)) num_teams (n + 4) thread_limit (n * 2) &
+ !$omp & default(shared) shared(n) private (p) reduction(+:r)
+ !$omp distribute simd aligned (pp:4) &
+ !$omp & private (p) firstprivate (q) reduction (+: r) &
+ !$omp & dist_schedule (static, 4) lastprivate (s)
+ do i = 1, 10
+ r = r + 1
+ p = q
+ a(1+i) = p + q
+ s = i * 10
+ end do
+ !$omp end distribute simd
+ !$omp end target teams
+ end subroutine
+end module
--- /dev/null
+! { dg-do compile }
+! { dg-options "-fopenmp -ffree-line-length-160" }
+
+subroutine foo (n, s, t, u, v, w)
+ integer :: n, i, s, t, u, v, w
+ common /bar/ i
+ !$omp simd safelen(s + 1)
+ do i = 1, n
+ end do
+ !$omp do schedule (static, t * 2)
+ do i = 1, n
+ end do
+ !$omp do simd safelen(s + 1) schedule (static, t * 2)
+ do i = 1, n
+ end do
+ !$omp parallel do schedule (static, t * 2) num_threads (u - 1)
+ do i = 1, n
+ end do
+ !$omp parallel do simd safelen(s + 1) schedule (static, t * 2) num_threads (u - 1)
+ do i = 1, n
+ end do
+ !$omp distribute dist_schedule (static, v + 8)
+ do i = 1, n
+ end do
+ !$omp distribute simd dist_schedule (static, v + 8) safelen(s + 1)
+ do i = 1, n
+ end do
+ !$omp distribute parallel do simd dist_schedule (static, v + 8) safelen(s + 1) &
+ !$omp & schedule (static, t * 2) num_threads (u - 1)
+ do i = 1, n
+ end do
+ !$omp distribute parallel do dist_schedule (static, v + 8) num_threads (u - 1) &
+ !$omp & schedule (static, t * 2)
+ do i = 1, n
+ end do
+ !$omp target
+ !$omp teams distribute dist_schedule (static, v + 8) num_teams (w + 8)
+ do i = 1, n
+ end do
+ !$omp end target
+ !$omp target
+ !$omp teams distribute simd dist_schedule (static, v + 8) safelen(s + 1) &
+ !$omp & num_teams (w + 8)
+ do i = 1, n
+ end do
+ !$omp end target
+ !$omp target
+ !$omp teams distribute parallel do simd dist_schedule (static, v + 8) safelen(s + 1) &
+ !$omp & schedule (static, t * 2) num_threads (u - 1) num_teams (w + 8)
+ do i = 1, n
+ end do
+ !$omp end target
+ !$omp target
+ !$omp teams distribute parallel do dist_schedule (static, v + 8) num_threads (u - 1) &
+ !$omp & schedule (static, t * 2) num_teams (w + 8)
+ do i = 1, n
+ end do
+ !$omp end target
+ !$omp target teams distribute dist_schedule (static, v + 8) num_teams (w + 8)
+ do i = 1, n
+ end do
+ !$omp target teams distribute simd dist_schedule (static, v + 8) safelen(s + 1) &
+ !$omp & num_teams (w + 8)
+ do i = 1, n
+ end do
+ !$omp target teams distribute parallel do simd dist_schedule (static, v + 8) safelen(s + 1) &
+ !$omp & schedule (static, t * 2) num_threads (u - 1) num_teams (w + 8)
+ do i = 1, n
+ end do
+ !$omp target teams distribute parallel do dist_schedule (static, v + 8) num_threads (u - 1) &
+ !$omp & schedule (static, t * 2) num_teams (w + 8)
+ do i = 1, n
+ end do
+end subroutine
--- /dev/null
+! { dg-do compile }
+! { dg-options "-fopenmp" }
+
+subroutine foo (r)
+ integer :: i, r
+ !$omp target
+ !$omp target teams distribute parallel do reduction (+: r) ! { dg-warning "target construct inside of target region" }
+ do i = 1, 10
+ r = r + 1
+ end do
+ !$omp end target
+end subroutine
--- /dev/null
+! { dg-do compile }
+
+subroutine f1
+!$omp declare reduction (.le.:integer:omp_out = omp_out + omp_in) ! { dg-error "Invalid operator for" }
+end subroutine f1
+subroutine f2
+!$omp declare reduction (bar:real(kind=4):omp_out = omp_out + omp_in)
+ real(kind=4) :: r
+ integer :: i
+ r = 0.0
+!$omp parallel do reduction (bar:r)
+ do i = 1, 10
+ r = r + i
+ end do
+!$omp parallel do reduction (foo:r) ! { dg-error "foo not found" }
+ do i = 1, 10
+ r = r + i
+ end do
+!$omp parallel do reduction (.gt.:r) ! { dg-error "cannot be used as a defined operator" }
+ do i = 1, 10
+ r = r + i
+ end do
+end subroutine f2
+subroutine f3
+!$omp declare reduction (foo:blah:omp_out=omp_out + omp_in) ! { dg-error "Unclassifiable OpenMP directive" }
+end subroutine f3
+subroutine f4
+!$omp declare reduction (foo:integer:a => null()) ! { dg-error "Invalid character in name" }
+!$omp declare reduction (foo:integer:omp_out = omp_in + omp_out) &
+!$omp & initializer(a => null()) ! { dg-error "Invalid character in name" }
+end subroutine f4
+subroutine f5
+ integer :: a, b
+!$omp declare reduction (foo:integer:a = b + 1) ! { dg-error "Variable other than OMP_OUT or OMP_IN used in combiner" }
+!$omp declare reduction (bar:integer:omp_out = omp_out * omp_in) &
+!$omp & initializer(b = a + 1) ! { dg-error "Variable other than OMP_PRIV or OMP_ORIG used in INITIALIZER clause" }
+end subroutine f5
+subroutine f6
+!$omp declare reduction (foo:integer:omp_out=omp_out+omp_in) &
+!$omp & initializer(omp_orig=omp_priv)
+end subroutine f6
--- /dev/null
+! { dg-do compile }
+
+subroutine f6
+!$omp declare reduction (foo:real:omp_out (omp_in)) ! { dg-error "Unclassifiable OpenMP directive" }
+!$omp declare reduction (bar:real:omp_out = omp_in * omp_out) & ! { dg-error "Unclassifiable OpenMP directive" }
+!$omp & initializer (omp_priv (omp_orig))
+end subroutine f6
+subroutine f7
+ integer :: a
+!$omp declare reduction (foo:integer:a (omp_out, omp_in)) ! { dg-error "Unclassifiable OpenMP directive" }
+!$omp declare reduction (bar:real:omp_out = omp_out.or.omp_in) ! { dg-error "Operands of logical operator" }
+!$omp declare reduction (baz:real:omp_out = omp_out + omp_in)
+!$omp & initializer (a (omp_priv, omp_orig)) ! { dg-error "Unclassifiable OpenMP directive" }
+ real :: r
+ r = 0.0
+!$omp parallel reduction (bar:r)
+!$omp end parallel
+end subroutine f7
+subroutine f8
+ interface
+ subroutine f8a (x)
+ integer :: x
+ end subroutine f8a
+ end interface
+!$omp declare reduction (baz:integer:omp_out = omp_out + omp_in) &
+!$omp & initializer (f8a (omp_orig)) ! { dg-error "One of actual subroutine arguments in INITIALIZER clause" }
+!$omp declare reduction (foo:integer:f8a) ! { dg-error "is not a variable" }
+!$omp declare reduction (bar:integer:omp_out = omp_out - omp_in) &
+!$omp & initializer (f8a) ! { dg-error "is not a variable" }
+end subroutine f8
+subroutine f9
+ type dt ! { dg-error "which is not consistent with the CALL" }
+ integer :: x = 0
+ integer :: y = 0
+ end type dt
+ integer :: i
+!$omp declare reduction (foo:integer:dt (omp_out, omp_in)) ! { dg-error "which is not consistent with the CALL" }
+!$omp declare reduction (bar:integer:omp_out = omp_out + omp_in) &
+!$omp & initializer (dt (omp_priv, omp_orig)) ! { dg-error "which is not consistent with the CALL" }
+ i = 0
+!$omp parallel reduction (foo : i)
+!$omp end parallel
+!$omp parallel reduction (bar : i)
+!$omp end parallel
+end subroutine f9
+subroutine f10
+ integer :: a, b
+!$omp declare reduction(foo:character(len=64) &
+!$omp & :omp_out(a:b) = omp_in(a:b)) ! { dg-error "Variable other than OMP_OUT or OMP_IN used in combiner" }
+!$omp declare reduction(bar:character(len=16) &
+!$omp & :omp_out = trim(omp_out) // omp_in) &
+!$omp & initializer (omp_priv(a:b) = ' ') ! { dg-error "Variable other than OMP_PRIV or OMP_ORIG used in INITIALIZER clause" }
+end subroutine f10
--- /dev/null
+! { dg-do compile }
+
+subroutine f1
+ type dt
+ logical :: l = .false.
+ end type
+ type dt2
+ logical :: l = .false.
+ end type
+!$omp declare reduction (foo:integer(kind = 4) & ! { dg-error "Previous !.OMP DECLARE REDUCTION" }
+!$omp & :omp_out = omp_out + omp_in)
+!$omp declare reduction (foo:integer(kind = 4) : & ! { dg-error "Redefinition of !.OMP DECLARE REDUCTION" }
+!$omp & omp_out = omp_out + omp_in)
+!$omp declare reduction (bar:integer, &
+!$omp & real:omp_out = omp_out + omp_in)
+!$omp declare reduction (baz:integer,real,integer & ! { dg-error "Redefinition of !.OMP DECLARE REDUCTION|Previous" }
+!$omp & : omp_out = omp_out + omp_in)
+!$omp declare reduction (id1:dt,dt2:omp_out%l=omp_out%l &
+!$omp & .or.omp_in%l)
+!$omp declare reduction (id2:dt,dt:omp_out%l=omp_out%l & ! { dg-error "Redefinition of !.OMP DECLARE REDUCTION|Previous" }
+!$omp & .or.omp_in%l)
+!$omp declare reduction (id3:dt2,dt:omp_out%l=omp_out%l & ! { dg-error "Previous !.OMP DECLARE REDUCTION" }
+!$omp & .or.omp_in%l)
+!$omp declare reduction (id3:dt2:omp_out%l=omp_out%l & ! { dg-error "Redefinition of !.OMP DECLARE REDUCTION" }
+!$omp & .or.omp_in%l)
+end subroutine f1
+subroutine f2
+ interface
+ subroutine f2a (x, y, z)
+ character (len = *) :: x, y
+ logical :: z
+ end subroutine
+ end interface
+ interface f2b
+ subroutine f2b (x, y, z)
+ character (len = *, kind = 1) :: x, y
+ logical :: z
+ end subroutine
+ subroutine f2c (x, y, z)
+ character (kind = 4, len = *) :: x, y
+ logical :: z
+ end subroutine
+ end interface
+!$omp declare reduction (foo:character(len=*): &
+!$omp & f2a (omp_out, omp_in, .false.)) &
+!$omp & initializer (f2a (omp_priv, omp_orig, .true.))
+!$omp declare reduction (bar:character(len=:): &
+!$omp & f2a (omp_out, omp_in, .false.)) &
+!$omp & initializer (f2a (omp_priv, omp_orig, .true.))
+!$omp declare reduction (baz:character(len=4): &
+!$omp & f2a (omp_out, omp_in, .false.)) &
+!$omp & initializer (f2a (omp_priv, omp_orig, .true.))
+!$omp declare reduction (baz:character(len=5): &
+!$omp & f2a (omp_out, omp_in, .false.)) &
+!$omp & initializer (f2a (omp_priv, omp_orig, .true.))
+!$omp declare reduction (baz:character(len=6): &
+!$omp & f2a (omp_out, omp_in, .false.)) &
+!$omp & initializer (f2a (omp_priv, omp_orig, .true.))
+!$omp declare reduction (id:character(len=*): & ! { dg-error "Previous !.OMP DECLARE REDUCTION" }
+!$omp & f2a (omp_out, omp_in, .false.)) &
+!$omp & initializer (f2a (omp_priv, omp_orig, .true.))
+!$omp declare reduction (id: & ! { dg-error "Redefinition of !.OMP DECLARE REDUCTION" }
+!$omp & character(len=:) : f2a (omp_out, omp_in, .false.)) &
+!$omp & initializer (f2a (omp_priv, omp_orig, .true.))
+!$omp declare reduction & ! { dg-error "Redefinition of !.OMP DECLARE REDUCTION|Previous" }
+!$omp (id2:character(len=*), character(len=:): &
+!$omp f2a (omp_out, omp_in, .false.)) &
+!$omp & initializer (f2a (omp_priv, omp_orig, .true.))
+!$omp declare reduction (id3:character(len=*, kind = 1), character(kind=4, len=:): &
+!$omp f2b (omp_out, omp_in, .false.)) &
+!$omp & initializer (f2b (omp_priv, omp_orig, .true.))
+!$omp declare reduction (id4:character(kind=4, len=4), character(kind =1, len=4): &
+!$omp f2b (omp_out, omp_in, .false.)) &
+!$omp & initializer (f2b (omp_priv, omp_orig, .true.))
+end subroutine f2
--- /dev/null
+! { dg-do compile }
+
+subroutine f3
+!$omp declare reduction ! { dg-error "Unclassifiable OpenMP directive" }
+!$omp declare reduction foo ! { dg-error "Unclassifiable OpenMP directive" }
+!$omp declare reduction (foo) ! { dg-error "Unclassifiable OpenMP directive" }
+!$omp declare reduction (foo:integer) ! { dg-error "Unclassifiable OpenMP directive" }
+!$omp declare reduction (foo:integer:omp_out=omp_out+omp_in) &
+!$omp & initializer(omp_priv=0) initializer(omp_priv=0) ! { dg-error "Unexpected junk after" }
+end subroutine f3
+subroutine f4
+ implicit integer (o)
+ implicit real (b)
+!$omp declare reduction (foo:integer:omp_priv(omp_out,omp_in)) ! { dg-error "Implicitly declared subroutine omp_priv" }
+!$omp declare reduction (foo:real:bar(omp_out,omp_in)) ! { dg-error "Implicitly declared subroutine bar used" }
+!$omp declare reduction (bar:integer:omp_out=omp_out+omp_in) &
+!$omp & initializer(omp_out (omp_priv)) ! { dg-error "Implicitly declared subroutine omp_out used" }
+!$omp declare reduction (bar:real:omp_out=omp_out+omp_in) &
+!$omp & initializer(bar (omp_priv, omp_orig)) ! { dg-error "Implicitly declared subroutine bar used" }
+!$omp declare reduction (id1:integer:omp_out=omp_orig(omp_out,omp_in)) ! { dg-error "Implicitly declared function omp_orig used" }
+!$omp declare reduction (id1:real:omp_out=foo(omp_out,omp_in)) ! { dg-error "Implicitly declared function foo used" }
+!$omp declare reduction (id2:integer:omp_out=omp_out+omp_in) &
+!$omp & initializer(omp_priv = omp_in (omp_orig)) ! { dg-error "Implicitly declared function omp_in used" }
+!$omp declare reduction (id2:real:omp_out=omp_out+omp_in) &
+!$omp & initializer(omp_priv = baz (omp_orig)) ! { dg-error "Implicitly declared function baz used" }
+ integer :: i
+ real :: r
+ i = 0
+ r = 0
+!$omp parallel reduction (foo: i, r)
+!$omp end parallel
+!$omp parallel reduction (bar: i, r)
+!$omp end parallel
+!$omp parallel reduction (id1: i, r)
+!$omp end parallel
+!$omp parallel reduction (id2: i, r)
+!$omp end parallel
+end subroutine f4
+subroutine f5
+ interface
+ subroutine f5a (x, *, y)
+ double precision :: x, y
+ end subroutine f5a
+ end interface
+!$omp declare reduction (foo:double precision: & ! { dg-error "Subroutine call with alternate returns in combiner" }
+!$omp & f5a (omp_out, *10, omp_in))
+!$omp declare reduction (bar:double precision: &
+!$omp omp_out = omp_in + omp_out) &
+!$omp & initializer (f5a (omp_priv, *20, omp_orig)) ! { dg-error "Subroutine call with alternate returns in INITIALIZER clause" }
+10 continue
+20 continue
+end subroutine f5
+subroutine f6
+ integer :: a
+!$omp declare reduction(foo:character(len=a*2) & ! { dg-error "cannot appear in the expression|not constant" }
+!$omp & :omp_out=trim(omp_out)//omp_in) &
+!$omp & initializer(omp_priv=' ')
+end subroutine f6
+subroutine f7
+ type dt1
+ integer :: a = 1
+ integer :: b
+ end type
+ type dt2
+ integer :: a = 2
+ integer :: b = 3
+ end type
+ type dt3
+ integer :: a
+ integer :: b
+ end type dt3
+!$omp declare reduction(foo:dt1,dt2:omp_out%a=omp_out%a+omp_in%a)
+!$omp declare reduction(foo:dt3:omp_out%a=omp_out%a+omp_in%a) ! { dg-error "Missing INITIALIZER clause for !.OMP DECLARE REDUCTION of derived type without default initializer" }
+end subroutine f7
--- /dev/null
+! { dg-do compile }
+
+module udr5m1
+ type dt
+ real :: r
+ end type dt
+end module udr5m1
+module udr5m2
+ use udr5m1
+ interface operator(+)
+ module procedure addm2
+ end interface
+!$omp declare reduction(+:dt:omp_out=omp_out+omp_in) &
+!$omp & initializer(omp_priv=dt(0.0))
+!$omp declare reduction(.myadd.:dt:omp_out=omp_out.myadd.omp_in) &
+!$omp & initializer(omp_priv=dt(0.0))
+ interface operator(.myadd.)
+ module procedure addm2
+ end interface
+contains
+ type(dt) function addm2 (x, y)
+ type(dt), intent (in):: x, y
+ addm2%r = x%r + y%r
+ end function
+end module udr5m2
+module udr5m3
+ use udr5m1
+ interface operator(.myadd.)
+ module procedure addm3
+ end interface
+!$omp declare reduction(+:dt:omp_out=omp_out+omp_in) &
+!$omp & initializer(omp_priv=dt(0.0))
+!$omp declare reduction(.myadd.:dt:omp_out=omp_out.myadd.omp_in) &
+!$omp & initializer(omp_priv=dt(0.0))
+ interface operator(+)
+ module procedure addm3
+ end interface
+contains
+ type(dt) function addm3 (x, y)
+ type(dt), intent (in):: x, y
+ addm3%r = x%r + y%r
+ end function
+end module udr5m3
+subroutine f1
+ use udr5m2
+ type(dt) :: d, e
+ integer :: i
+ d=dt(0.0)
+ e = dt (0.0)
+!$omp parallel do reduction (+ : d) reduction ( .myadd. : e)
+ do i=1,100
+ d=d+dt(i)
+ e=e+dt(i)
+ end do
+end subroutine f1
+subroutine f2
+ use udr5m3 ! { dg-error "Previous !.OMP DECLARE REDUCTION|Ambiguous interfaces" }
+ use udr5m2 ! { dg-error "Ambiguous !.OMP DECLARE REDUCTION" }
+end subroutine f2
--- /dev/null
+! { dg-do compile }
+! { dg-options "-fmax-errors=1000 -fopenmp -ffree-line-length-160" }
+
+module udr6
+ type dt
+ integer :: i
+ end type
+end module udr6
+subroutine f1
+ use udr6, only : dt
+!$omp declare reduction (+:integer:omp_out = omp_out + omp_in) ! { dg-error "Redefinition of predefined" }
+!$omp declare reduction (+:real(kind=4):omp_out = omp_out + omp_in) ! { dg-error "Redefinition of predefined" }
+!$omp declare reduction (+:double precision:omp_out = omp_out + omp_in) ! { dg-error "Redefinition of predefined" }
+!$omp declare reduction (+:integer(kind=8),integer(kind=1) & ! { dg-error "Redefinition of predefined" }
+!$omp & :omp_out = omp_out + omp_in)
+!$omp declare reduction (+:complex:omp_out = omp_out + omp_in) ! { dg-error "Redefinition of predefined" }
+!$omp declare reduction (+:complex(kind=8):omp_out = omp_out + omp_in) ! { dg-error "Redefinition of predefined" }
+ interface operator(+)
+ function addf1 (x, y)
+ use udr6, only : dt
+ type(dt), intent (in) :: x, y
+ type(dt) :: addf1
+ end function
+ end interface
+end subroutine f1
+subroutine f2
+ use udr6, only : dt
+ interface operator(-)
+ function subf2 (x, y)
+ use udr6, only : dt
+ type(dt), intent (in) :: x, y
+ type(dt) :: subf2
+ end function
+ end interface
+!$omp declare reduction (-:integer:omp_out = omp_out + omp_in) ! { dg-error "Redefinition of predefined" }
+!$omp declare reduction (-:real(kind=4):omp_out = omp_out + omp_in) ! { dg-error "Redefinition of predefined" }
+!$omp declare reduction (-:double precision:omp_out = omp_out + omp_in) ! { dg-error "Redefinition of predefined" }
+!$omp declare reduction (-:integer(kind=8),integer(kind=1) & ! { dg-error "Redefinition of predefined" }
+!$omp & :omp_out = omp_out + omp_in)
+!$omp declare reduction (-:complex:omp_out = omp_out + omp_in) ! { dg-error "Redefinition of predefined" }
+!$omp declare reduction (-:complex(kind=8):omp_out = omp_out + omp_in) ! { dg-error "Redefinition of predefined" }
+end subroutine f2
+subroutine f3
+ use udr6, only : dt
+ interface operator(*)
+ function mulf3 (x, y)
+ use udr6, only : dt
+ type(dt), intent (in) :: x, y
+ type(dt) :: mulf3
+ end function
+ end interface
+!$omp declare reduction (*:integer:omp_out = omp_out * omp_in) ! { dg-error "Redefinition of predefined" }
+!$omp declare reduction (*:real(kind=4):omp_out = omp_out * omp_in) ! { dg-error "Redefinition of predefined" }
+!$omp declare reduction (*:double precision:omp_out = omp_out * omp_in) ! { dg-error "Redefinition of predefined" }
+!$omp declare reduction (*:integer(kind=8),integer(kind=1) & ! { dg-error "Redefinition of predefined" }
+!$omp & :omp_out = omp_out * omp_in)
+!$omp declare reduction (*:complex:omp_out = omp_out * omp_in) ! { dg-error "Redefinition of predefined" }
+!$omp declare reduction (*:complex(kind=8):omp_out = omp_out * omp_in) ! { dg-error "Redefinition of predefined" }
+end subroutine f3
+subroutine f4
+ use udr6, only : dt
+ interface operator(.and.)
+ function andf4 (x, y)
+ use udr6, only : dt
+ type(dt), intent (in) :: x, y
+ type(dt) :: andf4
+ end function
+ end interface
+!$omp declare reduction (.neqv.:logical:omp_out = omp_out .or. omp_in) ! { dg-error "Redefinition of predefined" }
+ interface operator(.or.)
+ function orf4 (x, y)
+ use udr6, only : dt
+ type(dt), intent (in) :: x, y
+ type(dt) :: orf4
+ end function
+ end interface
+!$omp declare reduction (.eqv.:logical:omp_out = omp_out .or. omp_in) ! { dg-error "Redefinition of predefined" }
+ interface operator(.eqv.)
+ function eqvf4 (x, y)
+ use udr6, only : dt
+ type(dt), intent (in) :: x, y
+ type(dt) :: eqvf4
+ end function
+ end interface
+!$omp declare reduction (.or.:logical:omp_out = omp_out .or. omp_in) ! { dg-error "Redefinition of predefined" }
+ interface operator(.neqv.)
+ function neqvf4 (x, y)
+ use udr6, only : dt
+ type(dt), intent (in) :: x, y
+ type(dt) :: neqvf4
+ end function
+ end interface
+!$omp declare reduction (.and.:logical:omp_out = omp_out .and. omp_in) ! { dg-error "Redefinition of predefined" }
+end subroutine f4
+subroutine f5
+ use udr6, only : dt
+ interface operator(.and.)
+ function andf5 (x, y)
+ use udr6, only : dt
+ type(dt), intent (in) :: x, y
+ type(dt) :: andf5
+ end function
+ end interface
+!$omp declare reduction (.neqv.:logical(kind =4):omp_out = omp_out .neqv. omp_in) ! { dg-error "Redefinition of predefined" }
+ interface operator(.or.)
+ function orf5 (x, y)
+ use udr6, only : dt
+ type(dt), intent (in) :: x, y
+ type(dt) :: orf5
+ end function
+ end interface
+!$omp declare reduction (.eqv.:logical(kind= 4):omp_out = omp_out .eqv. omp_in) ! { dg-error "Redefinition of predefined" }
+ interface operator(.eqv.)
+ function eqvf5 (x, y)
+ use udr6, only : dt
+ type(dt), intent (in) :: x, y
+ type(dt) :: eqvf5
+ end function
+ end interface
+!$omp declare reduction (.or.:logical(kind=4):omp_out = omp_out .or. omp_in) ! { dg-error "Redefinition of predefined" }
+ interface operator(.neqv.)
+ function neqvf5 (x, y)
+ use udr6, only : dt
+ type(dt), intent (in) :: x, y
+ type(dt) :: neqvf5
+ end function
+ end interface
+!$omp declare reduction (.and.:logical(kind = 4):omp_out = omp_out .and. omp_in) ! { dg-error "Redefinition of predefined" }
+end subroutine f5
+subroutine f6
+!$omp declare reduction (min:integer:omp_out = min (omp_out, omp_in)) ! { dg-error "Redefinition of predefined" }
+!$omp declare reduction (max:integer:omp_out = max (omp_out, omp_in)) ! { dg-error "Redefinition of predefined" }
+!$omp declare reduction (iand:integer:omp_out = iand (omp_out, omp_in)) ! { dg-error "Redefinition of predefined" }
+!$omp declare reduction (ior:integer:omp_out = ior (omp_out, omp_in)) ! { dg-error "Redefinition of predefined" }
+!$omp declare reduction (ieor:integer:omp_out = ieor (omp_out, omp_in)) ! { dg-error "Redefinition of predefined" }
+!$omp declare reduction (min:real:omp_out = min (omp_out, omp_in)) ! { dg-error "Redefinition of predefined" }
+!$omp declare reduction (max:real:omp_out = max (omp_out, omp_in)) ! { dg-error "Redefinition of predefined" }
+!$omp declare reduction (min:double precision:omp_out = min (omp_out, omp_in)) ! { dg-error "Redefinition of predefined" }
+!$omp declare reduction (max:double precision:omp_out = max (omp_out, omp_in)) ! { dg-error "Redefinition of predefined" }
+end subroutine f6
+subroutine f7
+!$omp declare reduction (min:integer(kind=2):omp_out = min (omp_out, omp_in)) ! { dg-error "Redefinition of predefined" }
+!$omp declare reduction (max:integer(kind=4):omp_out = max (omp_out, omp_in)) ! { dg-error "Redefinition of predefined" }
+!$omp declare reduction (iand:integer(kind=1):omp_out = iand (omp_out, omp_in)) ! { dg-error "Redefinition of predefined" }
+!$omp declare reduction (ior:integer(kind=8):omp_out = ior (omp_out, omp_in)) ! { dg-error "Redefinition of predefined" }
+!$omp declare reduction (ieor:integer(kind=4):omp_out = ieor (omp_out, omp_in)) ! { dg-error "Redefinition of predefined" }
+!$omp declare reduction (min:real(kind=4):omp_out = min (omp_out, omp_in)) ! { dg-error "Redefinition of predefined" }
+!$omp declare reduction (max:real(kind=4):omp_out = max (omp_out, omp_in)) ! { dg-error "Redefinition of predefined" }
+!$omp declare reduction (min:double precision:omp_out = min (omp_out, omp_in)) ! { dg-error "Redefinition of predefined" }
+!$omp declare reduction (max:double precision:omp_out = max (omp_out, omp_in)) ! { dg-error "Redefinition of predefined" }
+end subroutine f7
+subroutine f8
+ integer :: min
+!$omp declare reduction (min:integer:omp_out = omp_out + omp_in)
+!$omp declare reduction (min:real:omp_out = omp_out + omp_in)
+!$omp declare reduction (min:double precision:omp_out = omp_out + omp_in)
+end subroutine f8
+subroutine f9
+ integer :: max
+!$omp declare reduction (max:integer:omp_out = omp_out + omp_in)
+!$omp declare reduction (max:real:omp_out = omp_out + omp_in)
+!$omp declare reduction (max:double precision:omp_out = omp_out + omp_in)
+end subroutine f9
+subroutine f10
+ integer :: iand
+!$omp declare reduction (iand:integer:omp_out = omp_out + omp_in)
+!$omp declare reduction (iand:real:omp_out = omp_out + omp_in)
+end subroutine f10
+subroutine f11
+ integer :: ior
+!$omp declare reduction (ior:integer:omp_out = omp_out + omp_in)
+!$omp declare reduction (ior:real:omp_out = omp_out + omp_in)
+end subroutine f11
+subroutine f12
+ integer :: ieor
+!$omp declare reduction (ieor:integer:omp_out = omp_out + omp_in)
+!$omp declare reduction (ieor:real:omp_out = omp_out + omp_in)
+end subroutine f12
+subroutine f13
+!$omp declare reduction (min:integer:omp_out = omp_out + omp_in)
+!$omp declare reduction (min:real:omp_out = omp_out + omp_in)
+!$omp declare reduction (min:double precision:omp_out = omp_out + omp_in)
+ integer :: min
+end subroutine f13
+subroutine f14
+!$omp declare reduction (max:integer:omp_out = omp_out + omp_in)
+!$omp declare reduction (max:real:omp_out = omp_out + omp_in)
+!$omp declare reduction (max:double precision:omp_out = omp_out + omp_in)
+ integer :: max
+end subroutine f14
+subroutine f15
+!$omp declare reduction (iand:integer:omp_out = omp_out + omp_in)
+!$omp declare reduction (iand:real:omp_out = omp_out + omp_in)
+ integer :: iand
+end subroutine f15
+subroutine f16
+!$omp declare reduction (ior:integer:omp_out = omp_out + omp_in)
+!$omp declare reduction (ior:real:omp_out = omp_out + omp_in)
+ integer :: ior
+end subroutine f16
+subroutine f17
+!$omp declare reduction (ieor:integer:omp_out = omp_out + omp_in)
+!$omp declare reduction (ieor:real:omp_out = omp_out + omp_in)
+ integer :: ieor
+end subroutine f17
--- /dev/null
+! { dg-do compile }
+
+module udr7m1
+ type dt
+ real :: r
+ end type dt
+end module udr7m1
+module udr7m2
+ use udr7m1
+ interface operator(+)
+ module procedure addm2
+ end interface
+!$omp declare reduction(+:dt:omp_out=omp_out+omp_in) &
+!$omp & initializer(omp_priv=dt(0.0))
+!$omp declare reduction(.myadd.:dt:omp_out=omp_out.myadd.omp_in) &
+!$omp & initializer(omp_priv=dt(0.0))
+ interface operator(.myadd.)
+ module procedure addm2
+ end interface
+ private
+ public :: operator(+), operator(.myadd.), dt
+contains
+ type(dt) function addm2 (x, y)
+ type(dt), intent (in):: x, y
+ addm2%r = x%r + y%r
+ end function
+end module udr7m2
+module udr7m3
+ use udr7m1
+ private
+ public :: operator(.myadd.), operator(+), dt
+ interface operator(.myadd.)
+ module procedure addm3
+ end interface
+!$omp declare reduction(+:dt:omp_out=omp_out+omp_in) &
+!$omp & initializer(omp_priv=dt(0.0))
+!$omp declare reduction(.myadd.:dt:omp_out=omp_out.myadd.omp_in) &
+!$omp & initializer(omp_priv=dt(0.0))
+ interface operator(+)
+ module procedure addm3
+ end interface
+contains
+ type(dt) function addm3 (x, y)
+ type(dt), intent (in):: x, y
+ addm3%r = x%r + y%r
+ end function
+end module udr7m3
+module udr7m4
+ use udr7m1
+ private
+ interface operator(.myadd.)
+ module procedure addm4
+ end interface
+!$omp declare reduction(+:dt:omp_out=omp_out+omp_in) &
+!$omp & initializer(omp_priv=dt(0.0))
+!$omp declare reduction(.myadd.:dt:omp_out=omp_out.myadd.omp_in) &
+!$omp & initializer(omp_priv=dt(0.0))
+ interface operator(+)
+ module procedure addm4
+ end interface
+contains
+ type(dt) function addm4 (x, y)
+ type(dt), intent (in):: x, y
+ addm4%r = x%r + y%r
+ end function
+end module udr7m4
+subroutine f1
+ use udr7m2
+ type(dt) :: d, e
+ integer :: i
+ d=dt(0.0)
+ e = dt (0.0)
+!$omp parallel do reduction (+ : d) reduction ( .myadd. : e)
+ do i=1,100
+ d=d+dt(i)
+ e=e+dt(i)
+ end do
+end subroutine f1
+subroutine f2
+ use udr7m3 ! { dg-error "Previous !.OMP DECLARE REDUCTION|Ambiguous interfaces" }
+ use udr7m2 ! { dg-error "Ambiguous !.OMP DECLARE REDUCTION" }
+end subroutine f2
+subroutine f3
+ use udr7m4
+ use udr7m2
+end subroutine f3
+subroutine f4
+ use udr7m3
+ use udr7m4
+end subroutine f4
--- /dev/null
+! { dg-do compile }
+! { dg-options "-fmax-errors=1000 -fopenmp" }
+
+module m
+contains
+ function fn1 (x, y)
+ integer, intent(in) :: x, y
+ integer :: fn1
+ fn1 = x + 2 * y
+ end function
+ subroutine sub1 (x, y)
+ integer, intent(in) :: y
+ integer, intent(out) :: x
+ x = y
+ end subroutine
+ function fn2 (x)
+ integer, intent(in) :: x
+ integer :: fn2
+ fn2 = x
+ end function
+ subroutine sub2 (x, y)
+ integer, intent(in) :: y
+ integer, intent(inout) :: x
+ x = x + y
+ end subroutine
+ function fn3 (x, y)
+ integer, intent(in) :: x(:), y(:)
+ integer :: fn3(lbound(x, 1):ubound(x, 1))
+ fn3 = x + 2 * y
+ end function
+ subroutine sub3 (x, y)
+ integer, intent(in) :: y(:)
+ integer, intent(out) :: x(:)
+ x = y
+ end subroutine
+ function fn4 (x)
+ integer, intent(in) :: x(:)
+ integer :: fn4(lbound(x, 1):ubound(x, 1))
+ fn4 = x
+ end function
+ subroutine sub4 (x, y)
+ integer, intent(in) :: y(:)
+ integer, intent(inout) :: x(:)
+ x = x + y
+ end subroutine
+ function fn5 (x, y)
+ integer, intent(in) :: x(10), y(10)
+ integer :: fn5(10)
+ fn5 = x + 2 * y
+ end function
+ subroutine sub5 (x, y)
+ integer, intent(in) :: y(10)
+ integer, intent(out) :: x(10)
+ x = y
+ end subroutine
+ function fn6 (x)
+ integer, intent(in) :: x(10)
+ integer :: fn6(10)
+ fn6 = x
+ end function
+ subroutine sub6 (x, y)
+ integer, intent(in) :: y(10)
+ integer, intent(inout) :: x(10)
+ x = x + y
+ end subroutine
+ function fn7 (x, y)
+ integer, allocatable, intent(in) :: x(:), y(:)
+ integer, allocatable :: fn7(:)
+ fn7 = x + 2 * y
+ end function
+ subroutine sub7 (x, y)
+ integer, allocatable, intent(in) :: y(:)
+ integer, allocatable, intent(out) :: x(:)
+ x = y
+ end subroutine
+ function fn8 (x)
+ integer, allocatable, intent(in) :: x(:)
+ integer, allocatable :: fn8(:)
+ fn8 = x
+ end function
+ subroutine sub8 (x, y)
+ integer, allocatable, intent(in) :: y(:)
+ integer, allocatable, intent(inout) :: x(:)
+ x = x + y
+ end subroutine
+end module
+subroutine test1
+ use m
+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0)
+!$omp declare reduction (bar : integer : omp_out = fn1 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*scalar and rank-1" }
+!$omp & initializer (sub1 (omp_priv, omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*scalar and rank-1" }
+!$omp declare reduction (baz : integer : sub2 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*scalar and rank-1" }
+!$omp initializer (omp_priv = fn2 (omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*scalar and rank-1" }
+ integer :: a(10)
+!$omp parallel reduction (foo : a)
+!$omp end parallel
+!$omp parallel reduction (bar : a)
+!$omp end parallel
+!$omp parallel reduction (baz : a)
+!$omp end parallel
+end subroutine test1
+subroutine test2
+ use m
+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0)
+!$omp declare reduction (bar : integer : omp_out = fn1 (omp_out, omp_in)) &
+!$omp & initializer (sub1 (omp_priv, omp_orig))
+!$omp declare reduction (baz : integer : sub2 (omp_out, omp_in)) &
+!$omp initializer (omp_priv = fn2 (omp_orig))
+ integer :: a
+!$omp parallel reduction (foo : a)
+!$omp end parallel
+!$omp parallel reduction (bar : a)
+!$omp end parallel
+!$omp parallel reduction (baz : a)
+!$omp end parallel
+end subroutine test2
+subroutine test3
+ use m
+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0)
+!$omp declare reduction (bar : integer : omp_out = fn1 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*scalar and rank-1" }
+!$omp & initializer (sub1 (omp_priv, omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*scalar and rank-1" }
+!$omp declare reduction (baz : integer : sub2 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*scalar and rank-1" }
+!$omp initializer (omp_priv = fn2 (omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*scalar and rank-1" }
+ integer, allocatable :: a(:)
+ allocate (a(10))
+!$omp parallel reduction (foo : a)
+!$omp end parallel
+!$omp parallel reduction (bar : a)
+!$omp end parallel
+!$omp parallel reduction (baz : a)
+!$omp end parallel
+end subroutine test3
+subroutine test4
+ use m
+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0)
+!$omp declare reduction (bar : integer : omp_out = fn1 (omp_out, omp_in)) &
+!$omp & initializer (sub1 (omp_priv, omp_orig))
+!$omp declare reduction (baz : integer : sub2 (omp_out, omp_in)) &
+!$omp initializer (omp_priv = fn2 (omp_orig))
+ integer, allocatable :: a
+ allocate (a)
+!$omp parallel reduction (foo : a)
+!$omp end parallel
+!$omp parallel reduction (bar : a)
+!$omp end parallel
+!$omp parallel reduction (baz : a)
+!$omp end parallel
+end subroutine test4
+subroutine test5
+ use m
+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0)
+!$omp declare reduction (bar : integer : omp_out = fn3 (omp_out, omp_in)) &
+!$omp & initializer (sub3 (omp_priv, omp_orig))
+!$omp declare reduction (baz : integer : sub4 (omp_out, omp_in)) &
+!$omp initializer (omp_priv = fn4 (omp_orig))
+ integer :: a(10)
+!$omp parallel reduction (foo : a)
+!$omp end parallel
+!$omp parallel reduction (bar : a)
+!$omp end parallel
+!$omp parallel reduction (baz : a)
+!$omp end parallel
+end subroutine test5
+subroutine test6
+ use m
+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0)
+!$omp declare reduction (bar : integer : omp_out = fn3 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar|Incompatible ranks 0 and 1 in assignment" }
+!$omp & initializer (sub3 (omp_priv, omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar" }
+!$omp declare reduction (baz : integer : sub4 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar" }
+!$omp initializer (omp_priv = fn4 (omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar|Incompatible ranks 0 and 1 in assignment" }
+ integer :: a
+!$omp parallel reduction (foo : a)
+!$omp end parallel
+!$omp parallel reduction (bar : a)
+!$omp end parallel
+!$omp parallel reduction (baz : a)
+!$omp end parallel
+end subroutine test6
+subroutine test7
+ use m
+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0)
+!$omp declare reduction (bar : integer : omp_out = fn3 (omp_out, omp_in)) &
+!$omp & initializer (sub3 (omp_priv, omp_orig))
+!$omp declare reduction (baz : integer : sub4 (omp_out, omp_in)) &
+!$omp initializer (omp_priv = fn4 (omp_orig))
+ integer, allocatable :: a(:)
+ allocate (a(10))
+!$omp parallel reduction (foo : a)
+!$omp end parallel
+!$omp parallel reduction (bar : a)
+!$omp end parallel
+!$omp parallel reduction (baz : a)
+!$omp end parallel
+end subroutine test7
+subroutine test8
+ use m
+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0)
+!$omp declare reduction (bar : integer : omp_out = fn3 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar|Incompatible ranks 0 and 1 in assignment" }
+!$omp & initializer (sub3 (omp_priv, omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar" }
+!$omp declare reduction (baz : integer : sub4 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar" }
+!$omp initializer (omp_priv = fn4 (omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar|Incompatible ranks 0 and 1 in assignment" }
+ integer, allocatable :: a
+ allocate (a)
+!$omp parallel reduction (foo : a)
+!$omp end parallel
+!$omp parallel reduction (bar : a)
+!$omp end parallel
+!$omp parallel reduction (baz : a)
+!$omp end parallel
+end subroutine test8
+subroutine test9
+ use m
+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0)
+!$omp declare reduction (bar : integer : omp_out = fn5 (omp_out, omp_in)) &
+!$omp & initializer (sub5 (omp_priv, omp_orig))
+!$omp declare reduction (baz : integer : sub6 (omp_out, omp_in)) &
+!$omp initializer (omp_priv = fn6 (omp_orig))
+ integer :: a(10)
+!$omp parallel reduction (foo : a)
+!$omp end parallel
+!$omp parallel reduction (bar : a)
+!$omp end parallel
+!$omp parallel reduction (baz : a)
+!$omp end parallel
+end subroutine test9
+subroutine test10
+ use m
+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0)
+!$omp declare reduction (bar : integer : omp_out = fn5 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar|Incompatible ranks 0 and 1 in assignment" }
+!$omp & initializer (sub5 (omp_priv, omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar" }
+!$omp declare reduction (baz : integer : sub6 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar" }
+!$omp initializer (omp_priv = fn6 (omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar|Incompatible ranks 0 and 1 in assignment" }
+ integer :: a
+!$omp parallel reduction (foo : a)
+!$omp end parallel
+!$omp parallel reduction (bar : a)
+!$omp end parallel
+!$omp parallel reduction (baz : a)
+!$omp end parallel
+end subroutine test10
+subroutine test11
+ use m
+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0)
+!$omp declare reduction (bar : integer : omp_out = fn5 (omp_out, omp_in)) &
+!$omp & initializer (sub5 (omp_priv, omp_orig))
+!$omp declare reduction (baz : integer : sub6 (omp_out, omp_in)) &
+!$omp initializer (omp_priv = fn6 (omp_orig))
+ integer, allocatable :: a(:)
+ allocate (a(10))
+!$omp parallel reduction (foo : a)
+!$omp end parallel
+!$omp parallel reduction (bar : a)
+!$omp end parallel
+!$omp parallel reduction (baz : a)
+!$omp end parallel
+end subroutine test11
+subroutine test12
+ use m
+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0)
+!$omp declare reduction (bar : integer : omp_out = fn5 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar|Incompatible ranks 0 and 1 in assignment" }
+!$omp & initializer (sub5 (omp_priv, omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar" }
+!$omp declare reduction (baz : integer : sub6 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar" }
+!$omp initializer (omp_priv = fn6 (omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar|Incompatible ranks 0 and 1 in assignment" }
+ integer, allocatable :: a
+ allocate (a)
+!$omp parallel reduction (foo : a)
+!$omp end parallel
+!$omp parallel reduction (bar : a)
+!$omp end parallel
+!$omp parallel reduction (baz : a)
+!$omp end parallel
+end subroutine test12
+subroutine test13
+ use m
+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0)
+!$omp declare reduction (bar : integer : omp_out = & ! { dg-error "Different shape for array assignment at \[^\n\r]* on dimension 1 .9 and 10" }
+!$omp & fn5 (omp_out, omp_in)) & ! { dg-warning "Actual argument contains too few elements for dummy argument \[^\n\r]* .9/10" }
+!$omp & initializer (sub5 (omp_priv, omp_orig)) ! { dg-warning "Actual argument contains too few elements for dummy argument \[^\n\r]* .9/10" }
+!$omp declare reduction (baz : integer : sub6 (omp_out, omp_in)) & ! { dg-warning "Actual argument contains too few elements for dummy argument \[^\n\r]* .9/10" }
+!$omp initializer (omp_priv = & ! { dg-error "Different shape for array assignment at \[^\n\r]* on dimension 1 .9 and 10" }
+!$omp & fn6 (omp_orig)) ! { dg-warning "Actual argument contains too few elements for dummy argument \[^\n\r]* .9/10" }
+ integer :: a(9)
+!$omp parallel reduction (foo : a)
+!$omp end parallel
+!$omp parallel reduction (bar : a)
+!$omp end parallel
+!$omp parallel reduction (baz : a)
+!$omp end parallel
+end subroutine test13
+subroutine test14
+ use m
+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0)
+!$omp declare reduction (bar : integer : omp_out = fn7 (omp_out, omp_in)) & ! { dg-error "Actual argument for \[^\n\r]* must be ALLOCATABLE" }
+!$omp & initializer (sub7 (omp_priv, omp_orig)) ! { dg-error "Actual argument for \[^\n\r]* must be ALLOCATABLE" }
+!$omp declare reduction (baz : integer : sub8 (omp_out, omp_in)) & ! { dg-error "Actual argument for \[^\n\r]* must be ALLOCATABLE" }
+!$omp initializer (omp_priv = fn8 (omp_orig)) ! { dg-error "Actual argument for \[^\n\r]* must be ALLOCATABLE" }
+ integer :: a(10)
+!$omp parallel reduction (foo : a)
+!$omp end parallel
+!$omp parallel reduction (bar : a)
+!$omp end parallel
+!$omp parallel reduction (baz : a)
+!$omp end parallel
+end subroutine test14
+subroutine test15
+ use m
+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0)
+!$omp declare reduction (bar : integer : omp_out = fn7 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar|Incompatible ranks 0 and 1 in assignment" }
+!$omp & initializer (sub7 (omp_priv, omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar" }
+!$omp declare reduction (baz : integer : sub8 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar" }
+!$omp initializer (omp_priv = fn8 (omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar|Incompatible ranks 0 and 1 in assignment" }
+ integer :: a
+!$omp parallel reduction (foo : a)
+!$omp end parallel
+!$omp parallel reduction (bar : a)
+!$omp end parallel
+!$omp parallel reduction (baz : a)
+!$omp end parallel
+end subroutine test15
+subroutine test16
+ use m
+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0)
+!$omp declare reduction (bar : integer : omp_out = fn7 (omp_out, omp_in)) &
+!$omp & initializer (sub7 (omp_priv, omp_orig))
+!$omp declare reduction (baz : integer : sub8 (omp_out, omp_in)) &
+!$omp initializer (omp_priv = fn8 (omp_orig))
+ integer, allocatable :: a(:)
+ allocate (a(10))
+!$omp parallel reduction (foo : a)
+!$omp end parallel
+!$omp parallel reduction (bar : a)
+!$omp end parallel
+!$omp parallel reduction (baz : a)
+!$omp end parallel
+end subroutine test16
+subroutine test17
+ use m
+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0)
+!$omp declare reduction (bar : integer : omp_out = fn7 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar|Incompatible ranks 0 and 1 in assignment" }
+!$omp & initializer (sub7 (omp_priv, omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar" }
+!$omp declare reduction (baz : integer : sub8 (omp_out, omp_in)) & ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar" }
+!$omp initializer (omp_priv = fn8 (omp_orig)) ! { dg-error "Rank mismatch in argument\[^\n\r]*rank-1 and scalar|Incompatible ranks 0 and 1 in assignment" }
+ integer, allocatable :: a
+ allocate (a)
+!$omp parallel reduction (foo : a)
+!$omp end parallel
+!$omp parallel reduction (bar : a)
+!$omp end parallel
+!$omp parallel reduction (baz : a)
+!$omp end parallel
+end subroutine test17
--- /dev/null
+! { dg-do compile }
+! { dg-options "-O2 -floop-interchange" }
+ SUBROUTINE PREPD(ICAST,ICAS,ICASX,ICAS1,ICAS2,NDET,NM,III,IMP,
+ * CASMIN)
+ LOGICAL CASMIN
+ DIMENSION ICAST(NDET,NM),IMP(NM)
+ IF(CASMIN) THEN
+ DO K=1,NDET
+ DO L=1,NM
+ IF(L.EQ.K-1) ICAST(K,L) = 1
+ END DO
+ END DO
+ END IF
+ END SUBROUTINE
--- /dev/null
+c { dg-do run }
+c PR61049, reduced test case by Dominique d'Humieres
+ character(len=30) :: buff = ", (2.0, 3.0),,6.0D0, 2*,"
+ DOUBLE PRECISION AVD, BVD, CVD, DVCORR
+ COMPLEX AVC, BVC, CVC, ZVCORR
+
+ read(buff, *, err=10) AVD, AVC, BVC, BVD, CVC, CVD
+ goto 20
+ 10 call abort
+ 20 continue
+ end
+
+
! http://gcc.gnu.org/ml/fortran/2005-04/msg00139.html
!
! { dg-do run }
-! { dg-xfail-run-if "PR 33271, math library bug" { powerpc-ibm-aix* powerpc*-*-linux* *-*-mingw* } { "-O0" } { "" } }
+! { dg-xfail-run-if "PR 33271, math library bug" { powerpc-ibm-aix* powerpc-*-linux* powerpc64-*-linux* *-*-mingw* } { "-O0" } { "" } }
+! Note that this doesn't fail on powerpc64le-*-linux*.
real(kind=8) :: a
integer(kind=8) :: i1, i2
real :: b
--- /dev/null
+C { dg-do compile }
+ TYPE T
+ INTEGER A(2)/1,2/ ! { dg-error "Invalid old style initialization for derived type component" }
+ END TYPE
+ TYPE S
+ INTEGER B/1/ ! { dg-error "Invalid old style initialization for derived type component" }
+ END TYPE
+ END
# error _OPENMP not defined
#endif
-#if _OPENMP != 201107
+#if _OPENMP != 201307
# error _OPENMP defined to wrong value
#endif
! { dg-do run }
! { dg-add-options ieee }
! { dg-skip-if "PR libfortran/58015" { *-*-solaris2.9* hppa*-*-hpux* } }
+! { dg-skip-if "IBM long double 31 bits of precision, test requires 38" { powerpc*-*-linux* } }
!
! PR fortran/35862
!
end Aliasing1;
--- { dg-final { scan-tree-dump-not "__gnat_rcheck" "optimized" } }
+-- { dg-final { scan-tree-dump-not "gnat_rcheck" "optimized" } }
-- { dg-final { cleanup-tree-dump "optimized" } }
--- /dev/null
+-- { dg-do run }
+
+procedure Enum3 is
+ type Enum is (Aaa, Bbb, Ccc);
+ for Enum use (1,2,4);
+begin
+ for Lo in Enum loop
+ for Hi in Enum loop
+ declare
+ subtype S is Enum range Lo .. Hi;
+ type Vector is array (S) of Integer;
+ Vec : Vector;
+ begin
+ for I in S loop
+ Vec (I) := 0;
+ end loop;
+ if Vec /= (S => 0) then
+ raise Program_Error;
+ end if;
+ end;
+ end loop;
+ end loop;
+end;
--- /dev/null
+-- { dg-do run }
+-- { dg-options "-O2 -gnatn" }
+
+with Opt38_Pkg; use Opt38_Pkg;
+
+procedure Opt38 is
+begin
+ Test (-1);
+end;
--- /dev/null
+package body Opt38_Pkg is
+
+ procedure Proc (I : Integer);
+ pragma Inline (Proc);
+
+ procedure Proc (I : Integer) is
+
+ procedure Inner;
+ pragma No_Inline (Inner);
+
+ procedure Inner is
+ begin
+ if I /= 110 then
+ raise Program_Error;
+ end if;
+ end;
+
+ begin
+ if I > 0 then
+ Inner;
+ end if;
+ end;
+
+ procedure Test (I : Integer) is
+ begin
+ if I > -1 then
+ Proc (I);
+ else
+ Proc (I + 111);
+ end if;
+ end;
+
+end Opt38_Pkg;
--- /dev/null
+package Opt38_Pkg is
+
+ procedure Test (I : Integer);
+
+end Opt38_Pkg;
--- /dev/null
+-- { dg-do compile }
+-- { dg-options "-O2 -fno-inline -fdump-tree-optimized" }
+
+procedure Opt39 (I : Integer) is
+
+ type Rec is record
+ I1 : Integer;
+ I2 : Integer;
+ I3 : Integer;
+ I4 : Integer;
+ I5 : Integer;
+ end record;
+
+ procedure Set (A : access Rec; I : Integer) is
+ Tmp : Rec := A.all;
+ begin
+ Tmp.I1 := I;
+ A.all := Tmp;
+ end;
+
+ R : aliased Rec;
+
+begin
+ Set (R'Access, I);
+ if R.I1 /= I then
+ raise Program_Error;
+ end if;
+end;
+
+-- { dg-final { scan-tree-dump-times "MEM" 1 "optimized" } }
+-- { dg-final { cleanup-tree-dump "optimized" } }
--- /dev/null
+-- { dg-do run }
+-- { dg-options "-gnato -O" }
+
+procedure Overflow_Fixed is
+
+ type Unsigned_8_Bit is mod 2**8;
+
+ procedure Fixed_To_Eight (Value : Duration) is
+ Item : Unsigned_8_Bit;
+ begin
+ Item := Unsigned_8_Bit(Value);
+ raise Program_Error;
+ exception
+ when Constraint_Error => null; -- expected case
+ end;
+
+begin
+ Fixed_To_Eight (-0.5);
+end;
--- /dev/null
+# Copyright (C) 2014 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3. If not see
+# <http://www.gnu.org/licenses/>.
+
+# Clear hardware capabilities on Solaris.
+if [istarget *-*-solaris2*] {
+ set clearcap_ldflags "-mclear-hwcap"
+}
+
+#
+# clearcap-init -- called at the start of each subdir of tests
+#
+
+proc clearcap-init { args } {
+ global TEST_ALWAYS_FLAGS
+ global ALWAYS_CXXFLAGS
+ global clearcap_saved_TEST_ALWAYS_FLAGS
+ global clearcap_ldflags
+
+ if [info exists TEST_ALWAYS_FLAGS] {
+ set clearcap_saved_TEST_ALWAYS_FLAGS $TEST_ALWAYS_FLAGS
+ }
+ if [info exists clearcap_ldflags] {
+ if [info exists ALWAYS_CXXFLAGS] {
+ set ALWAYS_CXXFLAGS [concat "{ldflags=$clearcap_ldflags}" $ALWAYS_CXXFLAGS]
+ } else {
+ append TEST_ALWAYS_FLAGS " $clearcap_ldflags"
+ }
+ }
+ return 0
+}
+
+#
+# clearcap-finish -- called at the start of each subdir of tests
+#
+
+proc clearcap-finish { args } {
+ global TEST_ALWAYS_FLAGS
+ global clearcap_saved_TEST_ALWAYS_FLAGS
+
+ if [info exists clearcap_saved_TEST_ALWAYS_FLAGS] {
+ set TEST_ALWAYS_FLAGS $clearcap_saved_TEST_ALWAYS_FLAGS
+ } else {
+ unset TEST_ALWAYS_FLAGS
+ }
+}
}]
}
+# Return 1 if the target supports long double of 128 bits,
+# 0 otherwise.
+
+proc check_effective_target_longdouble128 { } {
+ return [check_no_compiler_messages longdouble128 object {
+ int dummy[sizeof(long double) == 16 ? 1 : -1];
+ }]
+}
+
# Return 1 if the target supports double of 64 bits,
# 0 otherwise.
}]
}
+# Return 1 if the target supports executing DFP hardware instructions,
+# 0 otherwise. Cache the result.
+
+proc check_dfp_hw_available { } {
+ return [check_cached_effective_target dfp_hw_available {
+ # For now, disable on Darwin
+ if { [istarget powerpc-*-eabi] || [istarget powerpc*-*-eabispe] || [istarget *-*-darwin*]} {
+ expr 0
+ } else {
+ check_runtime_nocache dfp_hw_available {
+ volatile _Decimal64 r;
+ volatile _Decimal64 a = 4.0DD;
+ volatile _Decimal64 b = 2.0DD;
+ int main()
+ {
+ asm volatile ("dadd %0,%1,%2" : "=d" (r) : "d" (a), "d" (b));
+ asm volatile ("dsub %0,%1,%2" : "=d" (r) : "d" (a), "d" (b));
+ asm volatile ("dmul %0,%1,%2" : "=d" (r) : "d" (a), "d" (b));
+ asm volatile ("ddiv %0,%1,%2" : "=d" (r) : "d" (a), "d" (b));
+ return 0;
+ }
+ } "-mcpu=power6 -mhard-float"
+ }
+ }]
+}
+
# Return 1 if the target supports compiling and assembling UCN, 0 otherwise.
proc check_effective_target_ucn_nocache { } {
"vsx_hw" { set selected [check_vsx_hw_available] }
"p8vector_hw" { set selected [check_p8vector_hw_available] }
"ppc_recip_hw" { set selected [check_ppc_recip_hw_available] }
+ "dfp_hw" { set selected [check_dfp_hw_available] }
"named_sections" { set selected [check_named_sections_available] }
"gc_sections" { set selected [check_gc_sections_available] }
"cxa_atexit" { set selected [check_cxa_atexit_available] }
"vsx_hw" { return 1 }
"p8vector_hw" { return 1 }
"ppc_recip_hw" { return 1 }
+ "dfp_hw" { return 1 }
"named_sections" { return 1 }
"gc_sections" { return 1 }
"cxa_atexit" { return 1 }
SSA_NAME_IN_FREELIST in
SSA_NAME
- VAR_DECL_NONALIASED in
+ DECL_NONALIASED in
VAR_DECL
deprecated_flag:
array sections. OMP_CLAUSE_SIZE for these is not the pointer size,
which is implicitly POINTER_SIZE / BITS_PER_UNIT, but the bias. */
OMP_CLAUSE_MAP_POINTER,
+ /* Also internal, behaves like OMP_CLAUS_MAP_TO, but additionally any
+ OMP_CLAUSE_MAP_POINTER records consecutive after it which have addresses
+ falling into that range will not be ignored if OMP_CLAUSE_MAP_TO_PSET
+ wasn't mapped already. */
+ OMP_CLAUSE_MAP_TO_PSET,
OMP_CLAUSE_MAP_LAST
};
{
loc = htab_find_slot_with_hash (DEFAULT_DEFS (fn), &in,
DECL_UID (var), NO_INSERT);
- if (*loc)
+ if (loc)
{
SSA_NAME_IS_DEFAULT_DEF (*(tree *)loc) = false;
htab_clear_slot (DEFAULT_DEFS (fn), loc);
/* Create a new deep copy of the statement. */
copy = gimple_copy (stmt);
+ /* Clear flags that need revisiting. */
+ if (is_gimple_call (copy)
+ && gimple_call_tail_p (copy))
+ gimple_call_set_tail (copy, false);
+
/* Remap the region numbers for __builtin_eh_{pointer,filter},
RESX and EH_DISPATCH. */
if (id->eh_map)
{
var = return_slot;
gcc_assert (TREE_CODE (var) != SSA_NAME);
- TREE_ADDRESSABLE (var) |= TREE_ADDRESSABLE (result);
+ if (TREE_ADDRESSABLE (result))
+ mark_addressable (var);
}
if ((TREE_CODE (TREE_TYPE (result)) == COMPLEX_TYPE
|| TREE_CODE (TREE_TYPE (result)) == VECTOR_TYPE)
need_stmts = true;
goto do_decl_clause;
+ case OMP_CLAUSE_LINEAR:
+ if (OMP_CLAUSE_LINEAR_GIMPLE_SEQ (clause))
+ need_stmts = true;
+ wi->val_only = true;
+ wi->is_lhs = false;
+ convert_nonlocal_reference_op (&OMP_CLAUSE_LINEAR_STEP (clause),
+ &dummy, wi);
+ goto do_decl_clause;
+
case OMP_CLAUSE_PRIVATE:
case OMP_CLAUSE_FIRSTPRIVATE:
case OMP_CLAUSE_COPYPRIVATE:
case OMP_CLAUSE_FINAL:
case OMP_CLAUSE_IF:
case OMP_CLAUSE_NUM_THREADS:
+ case OMP_CLAUSE_DEPEND:
+ case OMP_CLAUSE_DEVICE:
+ case OMP_CLAUSE_NUM_TEAMS:
+ case OMP_CLAUSE_THREAD_LIMIT:
+ case OMP_CLAUSE_SAFELEN:
wi->val_only = true;
wi->is_lhs = false;
convert_nonlocal_reference_op (&OMP_CLAUSE_OPERAND (clause, 0),
- &dummy, wi);
+ &dummy, wi);
+ break;
+
+ case OMP_CLAUSE_DIST_SCHEDULE:
+ if (OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (clause) != NULL)
+ {
+ wi->val_only = true;
+ wi->is_lhs = false;
+ convert_nonlocal_reference_op (&OMP_CLAUSE_OPERAND (clause, 0),
+ &dummy, wi);
+ }
+ break;
+
+ case OMP_CLAUSE_MAP:
+ case OMP_CLAUSE_TO:
+ case OMP_CLAUSE_FROM:
+ if (OMP_CLAUSE_SIZE (clause))
+ {
+ wi->val_only = true;
+ wi->is_lhs = false;
+ convert_nonlocal_reference_op (&OMP_CLAUSE_SIZE (clause),
+ &dummy, wi);
+ }
+ if (DECL_P (OMP_CLAUSE_DECL (clause)))
+ goto do_decl_clause;
+ wi->val_only = true;
+ wi->is_lhs = false;
+ walk_tree (&OMP_CLAUSE_DECL (clause), convert_nonlocal_reference_op,
+ wi, NULL);
+ break;
+
+ case OMP_CLAUSE_ALIGNED:
+ if (OMP_CLAUSE_ALIGNED_ALIGNMENT (clause))
+ {
+ wi->val_only = true;
+ wi->is_lhs = false;
+ convert_nonlocal_reference_op
+ (&OMP_CLAUSE_ALIGNED_ALIGNMENT (clause), &dummy, wi);
+ }
+ /* Like do_decl_clause, but don't add any suppression. */
+ decl = OMP_CLAUSE_DECL (clause);
+ if (TREE_CODE (decl) == VAR_DECL
+ && (TREE_STATIC (decl) || DECL_EXTERNAL (decl)))
+ break;
+ if (decl_function_context (decl) != info->context)
+ {
+ OMP_CLAUSE_DECL (clause) = get_nonlocal_debug_decl (info, decl);
+ if (OMP_CLAUSE_CODE (clause) != OMP_CLAUSE_PRIVATE)
+ need_chain = true;
+ }
break;
case OMP_CLAUSE_NOWAIT:
case OMP_CLAUSE_COLLAPSE:
case OMP_CLAUSE_UNTIED:
case OMP_CLAUSE_MERGEABLE:
+ case OMP_CLAUSE_PROC_BIND:
break;
default:
&OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (clause));
break;
+ case OMP_CLAUSE_LINEAR:
+ walk_body (convert_nonlocal_reference_stmt,
+ convert_nonlocal_reference_op, info,
+ &OMP_CLAUSE_LINEAR_GIMPLE_SEQ (clause));
+ break;
+
default:
break;
}
break;
case GIMPLE_OMP_TARGET:
+ if (gimple_omp_target_kind (stmt) != GF_OMP_TARGET_KIND_REGION)
+ {
+ save_suppress = info->suppress_expansion;
+ convert_nonlocal_omp_clauses (gimple_omp_target_clauses_ptr (stmt),
+ wi);
+ info->suppress_expansion = save_suppress;
+ walk_body (convert_nonlocal_reference_stmt,
+ convert_nonlocal_reference_op, info,
+ gimple_omp_body_ptr (stmt));
+ break;
+ }
save_suppress = info->suppress_expansion;
- convert_nonlocal_omp_clauses (gimple_omp_target_clauses_ptr (stmt), wi);
+ if (convert_nonlocal_omp_clauses (gimple_omp_target_clauses_ptr (stmt),
+ wi))
+ {
+ tree c, decl;
+ decl = get_chain_decl (info);
+ c = build_omp_clause (gimple_location (stmt), OMP_CLAUSE_MAP);
+ OMP_CLAUSE_DECL (c) = decl;
+ OMP_CLAUSE_MAP_KIND (c) = OMP_CLAUSE_MAP_TO;
+ OMP_CLAUSE_SIZE (c) = DECL_SIZE_UNIT (decl);
+ OMP_CLAUSE_CHAIN (c) = gimple_omp_target_clauses (stmt);
+ gimple_omp_target_set_clauses (stmt, c);
+ }
+
+ save_local_var_chain = info->new_local_var_chain;
+ info->new_local_var_chain = NULL;
+
walk_body (convert_nonlocal_reference_stmt, convert_nonlocal_reference_op,
info, gimple_omp_body_ptr (stmt));
+
+ if (info->new_local_var_chain)
+ declare_vars (info->new_local_var_chain,
+ gimple_seq_first_stmt (gimple_omp_body (stmt)),
+ false);
+ info->new_local_var_chain = save_local_var_chain;
info->suppress_expansion = save_suppress;
break;
need_stmts = true;
goto do_decl_clause;
+ case OMP_CLAUSE_LINEAR:
+ if (OMP_CLAUSE_LINEAR_GIMPLE_SEQ (clause))
+ need_stmts = true;
+ wi->val_only = true;
+ wi->is_lhs = false;
+ convert_local_reference_op (&OMP_CLAUSE_LINEAR_STEP (clause), &dummy,
+ wi);
+ goto do_decl_clause;
+
case OMP_CLAUSE_PRIVATE:
case OMP_CLAUSE_FIRSTPRIVATE:
case OMP_CLAUSE_COPYPRIVATE:
case OMP_CLAUSE_FINAL:
case OMP_CLAUSE_IF:
case OMP_CLAUSE_NUM_THREADS:
+ case OMP_CLAUSE_DEPEND:
+ case OMP_CLAUSE_DEVICE:
+ case OMP_CLAUSE_NUM_TEAMS:
+ case OMP_CLAUSE_THREAD_LIMIT:
+ case OMP_CLAUSE_SAFELEN:
wi->val_only = true;
wi->is_lhs = false;
convert_local_reference_op (&OMP_CLAUSE_OPERAND (clause, 0), &dummy,
wi);
break;
+ case OMP_CLAUSE_DIST_SCHEDULE:
+ if (OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (clause) != NULL)
+ {
+ wi->val_only = true;
+ wi->is_lhs = false;
+ convert_local_reference_op (&OMP_CLAUSE_OPERAND (clause, 0),
+ &dummy, wi);
+ }
+ break;
+
+ case OMP_CLAUSE_MAP:
+ case OMP_CLAUSE_TO:
+ case OMP_CLAUSE_FROM:
+ if (OMP_CLAUSE_SIZE (clause))
+ {
+ wi->val_only = true;
+ wi->is_lhs = false;
+ convert_local_reference_op (&OMP_CLAUSE_SIZE (clause),
+ &dummy, wi);
+ }
+ if (DECL_P (OMP_CLAUSE_DECL (clause)))
+ goto do_decl_clause;
+ wi->val_only = true;
+ wi->is_lhs = false;
+ walk_tree (&OMP_CLAUSE_DECL (clause), convert_local_reference_op,
+ wi, NULL);
+ break;
+
+ case OMP_CLAUSE_ALIGNED:
+ if (OMP_CLAUSE_ALIGNED_ALIGNMENT (clause))
+ {
+ wi->val_only = true;
+ wi->is_lhs = false;
+ convert_local_reference_op
+ (&OMP_CLAUSE_ALIGNED_ALIGNMENT (clause), &dummy, wi);
+ }
+ /* Like do_decl_clause, but don't add any suppression. */
+ decl = OMP_CLAUSE_DECL (clause);
+ if (TREE_CODE (decl) == VAR_DECL
+ && (TREE_STATIC (decl) || DECL_EXTERNAL (decl)))
+ break;
+ if (decl_function_context (decl) == info->context
+ && !use_pointer_in_frame (decl))
+ {
+ tree field = lookup_field_for_decl (info, decl, NO_INSERT);
+ if (field)
+ {
+ OMP_CLAUSE_DECL (clause)
+ = get_local_debug_decl (info, decl, field);
+ need_frame = true;
+ }
+ }
+ break;
+
case OMP_CLAUSE_NOWAIT:
case OMP_CLAUSE_ORDERED:
case OMP_CLAUSE_DEFAULT:
case OMP_CLAUSE_COLLAPSE:
case OMP_CLAUSE_UNTIED:
case OMP_CLAUSE_MERGEABLE:
+ case OMP_CLAUSE_PROC_BIND:
break;
default:
&OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ (clause));
break;
+ case OMP_CLAUSE_LINEAR:
+ walk_body (convert_local_reference_stmt,
+ convert_local_reference_op, info,
+ &OMP_CLAUSE_LINEAR_GIMPLE_SEQ (clause));
+ break;
+
default:
break;
}
break;
case GIMPLE_OMP_TARGET:
+ if (gimple_omp_target_kind (stmt) != GF_OMP_TARGET_KIND_REGION)
+ {
+ save_suppress = info->suppress_expansion;
+ convert_local_omp_clauses (gimple_omp_target_clauses_ptr (stmt), wi);
+ info->suppress_expansion = save_suppress;
+ walk_body (convert_local_reference_stmt, convert_local_reference_op,
+ info, gimple_omp_body_ptr (stmt));
+ break;
+ }
save_suppress = info->suppress_expansion;
- convert_local_omp_clauses (gimple_omp_target_clauses_ptr (stmt), wi);
- walk_body (convert_local_reference_stmt, convert_local_reference_op,
- info, gimple_omp_body_ptr (stmt));
+ if (convert_local_omp_clauses (gimple_omp_target_clauses_ptr (stmt), wi))
+ {
+ tree c;
+ (void) get_frame_type (info);
+ c = build_omp_clause (gimple_location (stmt), OMP_CLAUSE_MAP);
+ OMP_CLAUSE_DECL (c) = info->frame_decl;
+ OMP_CLAUSE_MAP_KIND (c) = OMP_CLAUSE_MAP_TOFROM;
+ OMP_CLAUSE_SIZE (c) = DECL_SIZE_UNIT (info->frame_decl);
+ OMP_CLAUSE_CHAIN (c) = gimple_omp_target_clauses (stmt);
+ gimple_omp_target_set_clauses (stmt, c);
+ }
+
+ save_local_var_chain = info->new_local_var_chain;
+ info->new_local_var_chain = NULL;
+
+ walk_body (convert_local_reference_stmt, convert_local_reference_op, info,
+ gimple_omp_body_ptr (stmt));
+
+ if (info->new_local_var_chain)
+ declare_vars (info->new_local_var_chain,
+ gimple_seq_first_stmt (gimple_omp_body (stmt)), false);
+ info->new_local_var_chain = save_local_var_chain;
info->suppress_expansion = save_suppress;
break;
break;
}
+ case GIMPLE_OMP_TARGET:
+ if (gimple_omp_target_kind (stmt) != GF_OMP_TARGET_KIND_REGION)
+ {
+ *handled_ops_p = false;
+ return NULL_TREE;
+ }
+ /* FALLTHRU */
case GIMPLE_OMP_PARALLEL:
case GIMPLE_OMP_TASK:
{
default:
*handled_ops_p = false;
return NULL_TREE;
- break;
}
*handled_ops_p = true;
info->static_chain_added |= save_static_chain_added;
break;
+ case GIMPLE_OMP_TARGET:
+ if (gimple_omp_target_kind (stmt) != GF_OMP_TARGET_KIND_REGION)
+ {
+ walk_body (convert_gimple_call, NULL, info, gimple_omp_body_ptr (stmt));
+ break;
+ }
+ save_static_chain_added = info->static_chain_added;
+ info->static_chain_added = 0;
+ walk_body (convert_gimple_call, NULL, info, gimple_omp_body_ptr (stmt));
+ for (i = 0; i < 2; i++)
+ {
+ tree c, decl;
+ if ((info->static_chain_added & (1 << i)) == 0)
+ continue;
+ decl = i ? get_chain_decl (info) : info->frame_decl;
+ /* Don't add CHAIN.* or FRAME.* twice. */
+ for (c = gimple_omp_target_clauses (stmt);
+ c;
+ c = OMP_CLAUSE_CHAIN (c))
+ if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP
+ && OMP_CLAUSE_DECL (c) == decl)
+ break;
+ if (c == NULL)
+ {
+ c = build_omp_clause (gimple_location (stmt), OMP_CLAUSE_MAP);
+ OMP_CLAUSE_DECL (c) = decl;
+ OMP_CLAUSE_MAP_KIND (c)
+ = i ? OMP_CLAUSE_MAP_TO : OMP_CLAUSE_MAP_TOFROM;
+ OMP_CLAUSE_SIZE (c) = DECL_SIZE_UNIT (decl);
+ OMP_CLAUSE_CHAIN (c) = gimple_omp_target_clauses (stmt);
+ gimple_omp_target_set_clauses (stmt, c);
+ }
+ }
+ info->static_chain_added |= save_static_chain_added;
+ break;
+
case GIMPLE_OMP_FOR:
walk_body (convert_gimple_call, NULL, info,
gimple_omp_for_pre_body_ptr (stmt));
case GIMPLE_OMP_SECTIONS:
case GIMPLE_OMP_SECTION:
case GIMPLE_OMP_SINGLE:
- case GIMPLE_OMP_TARGET:
case GIMPLE_OMP_TEAMS:
case GIMPLE_OMP_MASTER:
case GIMPLE_OMP_TASKGROUP:
pp_string (buffer, "alloc");
break;
case OMP_CLAUSE_MAP_TO:
+ case OMP_CLAUSE_MAP_TO_PSET:
pp_string (buffer, "to");
break;
case OMP_CLAUSE_MAP_FROM:
if (OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_MAP
&& OMP_CLAUSE_MAP_KIND (clause) == OMP_CLAUSE_MAP_POINTER)
pp_string (buffer, " [pointer assign, bias: ");
+ else if (OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_MAP
+ && OMP_CLAUSE_MAP_KIND (clause) == OMP_CLAUSE_MAP_TO_PSET)
+ pp_string (buffer, " [pointer set, len: ");
else
pp_string (buffer, " [len: ");
dump_generic_node (buffer, OMP_CLAUSE_SIZE (clause),
/* ??? We cannot simply use the type of operand #0 of the refs here
as the Fortran compiler smuggles type punning into COMPONENT_REFs
for common blocks instead of using unions like everyone else. */
- tree type1 = TYPE_MAIN_VARIANT (DECL_CONTEXT (field1));
- tree type2 = TYPE_MAIN_VARIANT (DECL_CONTEXT (field2));
+ tree type1 = DECL_CONTEXT (field1);
+ tree type2 = DECL_CONTEXT (field2);
/* We cannot disambiguate fields in a union or qualified union. */
if (type1 != type2 || TREE_CODE (type1) != RECORD_TYPE)
{
gimple stmt = gsi_stmt (gsi);
+ if (is_gimple_debug (stmt))
+ continue;
+
if (gimple_has_side_effects (stmt)
+ || gimple_could_trap_p (stmt)
|| gimple_vuse (stmt))
return false;
}
while (is_gimple_assign (stmt)
&& ((CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (stmt))
&& (TYPE_PRECISION (TREE_TYPE (gimple_assign_lhs (stmt)))
- <= TYPE_PRECISION (TREE_TYPE (gimple_assign_rhs1 (stmt)))))
+ <= TYPE_PRECISION (TREE_TYPE (gimple_assign_rhs1 (stmt))))
+ && TREE_CODE (gimple_assign_rhs1 (stmt)) == SSA_NAME)
|| gimple_assign_ssa_name_copy_p (stmt)))
stmt = SSA_NAME_DEF_STMT (gimple_assign_rhs1 (stmt));
struct loop *loop, *outer;
unsigned i, n;
-#if 0
- /* Initialize bb_loop_postorder with a mapping from loop->num to
- its postorder index. */
- i = 0;
- bb_loop_postorder = XNEWVEC (unsigned, number_of_loops (cfun));
- FOR_EACH_LOOP (loop, LI_FROM_INNERMOST)
- bb_loop_postorder[loop->num] = i++;
-#endif
-
/* Collect all basic-blocks in loops and sort them after their
loops postorder. */
i = 0;
gimple_stmt_iterator gsi;
gimple stmt;
struct prev_flag_edges *prev_edges = (struct prev_flag_edges *) ex->aux;
+ bool irr = ex->flags & EDGE_IRREDUCIBLE_LOOP;
/* ?? Insert store after previous store if applicable. See note
below. */
old_dest = ex->dest;
new_bb = split_edge (ex);
then_bb = create_empty_bb (new_bb);
- if (current_loops && new_bb->loop_father)
- add_bb_to_loop (then_bb, new_bb->loop_father);
+ if (irr)
+ then_bb->flags = BB_IRREDUCIBLE_LOOP;
+ add_bb_to_loop (then_bb, new_bb->loop_father);
gsi = gsi_start_bb (new_bb);
stmt = gimple_build_cond (NE_EXPR, flag, boolean_false_node,
stmt = gimple_build_assign (unshare_expr (mem), tmp_var);
gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING);
- make_edge (new_bb, then_bb, EDGE_TRUE_VALUE);
- make_edge (new_bb, old_dest, EDGE_FALSE_VALUE);
- then_old_edge = make_edge (then_bb, old_dest, EDGE_FALLTHRU);
+ make_edge (new_bb, then_bb,
+ EDGE_TRUE_VALUE | (irr ? EDGE_IRREDUCIBLE_LOOP : 0));
+ make_edge (new_bb, old_dest,
+ EDGE_FALSE_VALUE | (irr ? EDGE_IRREDUCIBLE_LOOP : 0));
+ then_old_edge = make_edge (then_bb, old_dest,
+ EDGE_FALLTHRU | (irr ? EDGE_IRREDUCIBLE_LOOP : 0));
set_immediate_dominator (CDI_DOMINATORS, then_bb, new_bb);
struct symbolic_number {
unsigned HOST_WIDEST_INT n;
- int size;
+ tree type;
};
/* Perform a SHIFT or ROTATE operation by COUNT bits on symbolic
struct symbolic_number *n,
int count)
{
+ int bitsize = TYPE_PRECISION (n->type);
+
if (count % 8 != 0)
return false;
/* Zero out the extra bits of N in order to avoid them being shifted
into the significant bits. */
- if (n->size < (int)sizeof (HOST_WIDEST_INT))
- n->n &= ((unsigned HOST_WIDEST_INT)1 << (n->size * BITS_PER_UNIT)) - 1;
+ if (bitsize < 8 * (int)sizeof (HOST_WIDEST_INT))
+ n->n &= ((unsigned HOST_WIDEST_INT)1 << bitsize) - 1;
switch (code)
{
n->n <<= count;
break;
case RSHIFT_EXPR:
+ /* Arithmetic shift of signed type: result is dependent on the value. */
+ if (!TYPE_UNSIGNED (n->type)
+ && (n->n & ((unsigned HOST_WIDEST_INT) 0xff << (bitsize - 8))))
+ return false;
n->n >>= count;
break;
case LROTATE_EXPR:
- n->n = (n->n << count) | (n->n >> ((n->size * BITS_PER_UNIT) - count));
+ n->n = (n->n << count) | (n->n >> (bitsize - count));
break;
case RROTATE_EXPR:
- n->n = (n->n >> count) | (n->n << ((n->size * BITS_PER_UNIT) - count));
+ n->n = (n->n >> count) | (n->n << (bitsize - count));
break;
default:
return false;
}
/* Zero unused bits for size. */
- if (n->size < (int)sizeof (HOST_WIDEST_INT))
- n->n &= ((unsigned HOST_WIDEST_INT)1 << (n->size * BITS_PER_UNIT)) - 1;
+ if (bitsize < 8 * (int)sizeof (HOST_WIDEST_INT))
+ n->n &= ((unsigned HOST_WIDEST_INT)1 << bitsize) - 1;
return true;
}
if (TREE_CODE (lhs_type) != INTEGER_TYPE)
return false;
- if (TYPE_PRECISION (lhs_type) != n->size * BITS_PER_UNIT)
+ if (TYPE_PRECISION (lhs_type) != TYPE_PRECISION (n->type))
return false;
return true;
to initialize the symbolic number. */
if (!source_expr1)
{
+ int size;
+
/* Set up the symbolic number N by setting each byte to a
value between 1 and the byte size of rhs1. The highest
order byte is set to n->size and the lowest order
byte to 1. */
- n->size = TYPE_PRECISION (TREE_TYPE (rhs1));
- if (n->size % BITS_PER_UNIT != 0)
+ n->type = TREE_TYPE (rhs1);
+ size = TYPE_PRECISION (n->type);
+ if (size % BITS_PER_UNIT != 0)
return NULL_TREE;
- n->size /= BITS_PER_UNIT;
+ size /= BITS_PER_UNIT;
n->n = (sizeof (HOST_WIDEST_INT) < 8 ? 0 :
(unsigned HOST_WIDEST_INT)0x08070605 << 32 | 0x04030201);
- if (n->size < (int)sizeof (HOST_WIDEST_INT))
+ if (size < (int)sizeof (HOST_WIDEST_INT))
n->n &= ((unsigned HOST_WIDEST_INT)1 <<
- (n->size * BITS_PER_UNIT)) - 1;
+ (size * BITS_PER_UNIT)) - 1;
source_expr1 = rhs1;
}
{
case BIT_AND_EXPR:
{
- int i;
+ int i, size = TYPE_PRECISION (n->type) / BITS_PER_UNIT;
unsigned HOST_WIDEST_INT val = widest_int_cst_value (rhs2);
unsigned HOST_WIDEST_INT tmp = val;
/* Only constants masking full bytes are allowed. */
- for (i = 0; i < n->size; i++, tmp >>= BITS_PER_UNIT)
+ for (i = 0; i < size; i++, tmp >>= BITS_PER_UNIT)
if ((tmp & 0xff) != 0 && (tmp & 0xff) != 0xff)
return NULL_TREE;
break;
CASE_CONVERT:
{
- int type_size;
+ int type_size, old_type_size;
+ tree type;
- type_size = TYPE_PRECISION (gimple_expr_type (stmt));
+ type = gimple_expr_type (stmt);
+ type_size = TYPE_PRECISION (type);
if (type_size % BITS_PER_UNIT != 0)
return NULL_TREE;
+ /* Sign extension: result is dependent on the value. */
+ old_type_size = TYPE_PRECISION (n->type);
+ if (!TYPE_UNSIGNED (n->type)
+ && type_size > old_type_size
+ && n->n &
+ ((unsigned HOST_WIDEST_INT) 0xff << (old_type_size - 8)))
+ return NULL_TREE;
+
if (type_size / BITS_PER_UNIT < (int)(sizeof (HOST_WIDEST_INT)))
{
/* If STMT casts to a smaller type mask out the bits not
belonging to the target type. */
n->n &= ((unsigned HOST_WIDEST_INT)1 << type_size) - 1;
}
- n->size = type_size / BITS_PER_UNIT;
+ n->type = type;
}
break;
default:
if (rhs_class == GIMPLE_BINARY_RHS)
{
- int i;
+ int i, size;
struct symbolic_number n1, n2;
unsigned HOST_WIDEST_INT mask;
tree source_expr2;
source_expr2 = find_bswap_1 (rhs2_stmt, &n2, limit - 1);
if (source_expr1 != source_expr2
- || n1.size != n2.size)
+ || TYPE_PRECISION (n1.type) != TYPE_PRECISION (n2.type))
return NULL_TREE;
- n->size = n1.size;
- for (i = 0, mask = 0xff; i < n->size; i++, mask <<= BITS_PER_UNIT)
+ n->type = n1.type;
+ size = TYPE_PRECISION (n->type) / BITS_PER_UNIT;
+ for (i = 0, mask = 0xff; i < size; i++, mask <<= BITS_PER_UNIT)
{
unsigned HOST_WIDEST_INT masked1, masked2;
struct symbolic_number n;
tree source_expr;
- int limit;
+ int limit, bitsize;
/* The last parameter determines the depth search limit. It usually
correlates directly to the number of bytes to be touched. We
return NULL_TREE;
/* Zero out the extra bits of N and CMP. */
- if (n.size < (int)sizeof (HOST_WIDEST_INT))
+ bitsize = TYPE_PRECISION (n.type);
+ if (bitsize < 8 * (int)sizeof (HOST_WIDEST_INT))
{
unsigned HOST_WIDEST_INT mask =
- ((unsigned HOST_WIDEST_INT)1 << (n.size * BITS_PER_UNIT)) - 1;
+ ((unsigned HOST_WIDEST_INT)1 << bitsize) - 1;
n.n &= mask;
- cmp >>= (sizeof (HOST_WIDEST_INT) - n.size) * BITS_PER_UNIT;
+ cmp >>= sizeof (HOST_WIDEST_INT) * BITS_PER_UNIT - bitsize;
}
/* A complete byte swap should make the symbolic number to start
/* All constants are ok. */
break;
- case tcc_binary:
case tcc_comparison:
+ /* GENERIC allows comparisons with non-boolean types, reject
+ those for GIMPLE. Let vector-typed comparisons pass - rules
+ for GENERIC and GIMPLE are the same here. */
+ if (!(INTEGRAL_TYPE_P (TREE_TYPE (expr))
+ && (TREE_CODE (TREE_TYPE (expr)) == BOOLEAN_TYPE
+ || TYPE_PRECISION (TREE_TYPE (expr)) == 1))
+ && TREE_CODE (TREE_TYPE (expr)) != VECTOR_TYPE)
+ return false;
+
+ /* Fallthru. */
+ case tcc_binary:
if (!is_gimple_val (TREE_OPERAND (expr, 0))
|| !is_gimple_val (TREE_OPERAND (expr, 1)))
return false;
static long get_rank (tree);
static bool reassoc_stmt_dominates_stmt_p (gimple, gimple);
+/* Wrapper around gsi_remove, which adjusts gimple_uid of debug stmts
+ possibly added by gsi_remove. */
+
+bool
+reassoc_remove_stmt (gimple_stmt_iterator *gsi)
+{
+ gimple stmt = gsi_stmt (*gsi);
+
+ if (!MAY_HAVE_DEBUG_STMTS || gimple_code (stmt) == GIMPLE_PHI)
+ return gsi_remove (gsi, true);
+
+ gimple_stmt_iterator prev = *gsi;
+ gsi_prev (&prev);
+ unsigned uid = gimple_uid (stmt);
+ basic_block bb = gimple_bb (stmt);
+ bool ret = gsi_remove (gsi, true);
+ if (!gsi_end_p (prev))
+ gsi_next (&prev);
+ else
+ prev = gsi_start_bb (bb);
+ gimple end_stmt = gsi_stmt (*gsi);
+ while ((stmt = gsi_stmt (prev)) != end_stmt)
+ {
+ gcc_assert (stmt && is_gimple_debug (stmt) && gimple_uid (stmt) == 0);
+ gimple_set_uid (stmt, uid);
+ gsi_next (&prev);
+ }
+ return ret;
+}
/* Bias amount for loop-carried phis. We want this to be larger than
the depth of any reassociation tree we can see, but not larger than
update_stmt (use_stmt);
gsi = gsi_for_stmt (stmt);
unlink_stmt_vdef (stmt);
- gsi_remove (&gsi, true);
+ reassoc_remove_stmt (&gsi);
release_defs (stmt);
}
{
var = gimple_assign_rhs1 (stmt);
gsi = gsi_for_stmt (stmt);
- gsi_remove (&gsi, true);
+ reassoc_remove_stmt (&gsi);
release_defs (stmt);
}
else
update_stmt (stmt);
gsi = gsi_for_stmt (oldbinrhs);
- gsi_remove (&gsi, true);
+ reassoc_remove_stmt (&gsi);
release_defs (oldbinrhs);
gimple_set_visited (stmt, true);
gimple_assign_set_rhs_with_ops (&gsi2, NEGATE_EXPR, x, NULL);
user = gsi_stmt (gsi2);
update_stmt (user);
- gsi_remove (&gsi, true);
+ reassoc_remove_stmt (&gsi);
release_defs (feed);
plus_negates.safe_push (gimple_assign_lhs (user));
}
reassociations. */
if (has_zero_uses (gimple_get_lhs (stmt)))
{
- gsi_remove (&gsi, true);
+ reassoc_remove_stmt (&gsi);
release_defs (stmt);
/* We might end up removing the last stmt above which
places the iterator to the end of the sequence.
/* If all value numbered to the same value, the phi node has that
value. */
if (allsame)
- {
- if (is_gimple_min_invariant (sameval))
- {
- VN_INFO (PHI_RESULT (phi))->has_constants = true;
- VN_INFO (PHI_RESULT (phi))->expr = sameval;
- }
- else
- {
- VN_INFO (PHI_RESULT (phi))->has_constants = false;
- VN_INFO (PHI_RESULT (phi))->expr = sameval;
- }
-
- if (TREE_CODE (sameval) == SSA_NAME)
- return visit_copy (PHI_RESULT (phi), sameval);
-
- return set_ssa_val_to (PHI_RESULT (phi), sameval);
- }
+ return set_ssa_val_to (PHI_RESULT (phi), sameval);
/* Otherwise, see if it is equivalent to a phi node in this block. */
result = vn_phi_lookup (phi);
if (result)
- {
- if (TREE_CODE (result) == SSA_NAME)
- changed = visit_copy (PHI_RESULT (phi), result);
- else
- changed = set_ssa_val_to (PHI_RESULT (phi), result);
- }
+ changed = set_ssa_val_to (PHI_RESULT (phi), result);
else
{
vn_phi_insert (phi, PHI_RESULT (phi));
catch those with constants. The goal here is to simultaneously
combine constants between expressions, but avoid infinite
expansion of expressions during simplification. */
- if (TREE_CODE (op0) == SSA_NAME)
- {
- if (VN_INFO (op0)->has_constants
+ op0 = vn_valueize (op0);
+ if (TREE_CODE (op0) == SSA_NAME
+ && (VN_INFO (op0)->has_constants
|| TREE_CODE_CLASS (code) == tcc_comparison
- || code == COMPLEX_EXPR)
- op0 = valueize_expr (vn_get_expr_for (op0));
- else
- op0 = vn_valueize (op0);
- }
+ || code == COMPLEX_EXPR))
+ op0 = valueize_expr (vn_get_expr_for (op0));
- if (TREE_CODE (op1) == SSA_NAME)
- {
- if (VN_INFO (op1)->has_constants
- || code == COMPLEX_EXPR)
- op1 = valueize_expr (vn_get_expr_for (op1));
- else
- op1 = vn_valueize (op1);
- }
+ op1 = vn_valueize (op1);
+ if (TREE_CODE (op1) == SSA_NAME
+ && (VN_INFO (op1)->has_constants
+ || code == COMPLEX_EXPR))
+ op1 = valueize_expr (vn_get_expr_for (op1));
/* Pointer plus constant can be represented as invariant address.
Do so to allow further propatation, see also tree forwprop. */
return NULL_TREE;
orig_op0 = op0;
- if (VN_INFO (op0)->has_constants)
- op0 = valueize_expr (vn_get_expr_for (op0));
- else if (CONVERT_EXPR_CODE_P (code)
- || code == REALPART_EXPR
- || code == IMAGPART_EXPR
- || code == VIEW_CONVERT_EXPR
- || code == BIT_FIELD_REF)
+ op0 = vn_valueize (op0);
+ if (TREE_CODE (op0) == SSA_NAME)
{
- /* We want to do tree-combining on conversion-like expressions.
- Make sure we feed only SSA_NAMEs or constants to fold though. */
- tree tem = valueize_expr (vn_get_expr_for (op0));
- if (UNARY_CLASS_P (tem)
- || BINARY_CLASS_P (tem)
- || TREE_CODE (tem) == VIEW_CONVERT_EXPR
- || TREE_CODE (tem) == SSA_NAME
- || TREE_CODE (tem) == CONSTRUCTOR
- || is_gimple_min_invariant (tem))
- op0 = tem;
+ if (VN_INFO (op0)->has_constants)
+ op0 = valueize_expr (vn_get_expr_for (op0));
+ else if (CONVERT_EXPR_CODE_P (code)
+ || code == REALPART_EXPR
+ || code == IMAGPART_EXPR
+ || code == VIEW_CONVERT_EXPR
+ || code == BIT_FIELD_REF)
+ {
+ /* We want to do tree-combining on conversion-like expressions.
+ Make sure we feed only SSA_NAMEs or constants to fold though. */
+ tree tem = valueize_expr (vn_get_expr_for (op0));
+ if (UNARY_CLASS_P (tem)
+ || BINARY_CLASS_P (tem)
+ || TREE_CODE (tem) == VIEW_CONVERT_EXPR
+ || TREE_CODE (tem) == SSA_NAME
+ || TREE_CODE (tem) == CONSTRUCTOR
+ || is_gimple_min_invariant (tem))
+ op0 = tem;
+ }
}
/* Avoid folding if nothing changed, but remember the expression. */
pt->ipa_escaped = 1;
else
pt->escaped = 1;
+ /* Expand some special vars of ESCAPED in-place here. */
+ varinfo_t evi = get_varinfo (find (escaped_id));
+ if (bitmap_bit_p (evi->solution, nonlocal_id))
+ pt->nonlocal = 1;
}
else if (vi->id == nonlocal_id)
pt->nonlocal = 1;
tree ptr;
struct function *fn;
unsigned i;
- varinfo_t fi;
basic_block bb;
- struct pt_solution uses, clobbers;
- struct cgraph_edge *e;
/* Nodes without a body are not interesting. */
if (!cgraph_function_with_gimple_body_p (node) || node->clone_of)
find_what_p_points_to (ptr);
}
- /* Compute the call-use and call-clobber sets for all direct calls. */
- fi = lookup_vi_for_tree (node->decl);
- gcc_assert (fi->is_fn_info);
- clobbers
- = find_what_var_points_to (first_vi_for_offset (fi, fi_clobbers));
- uses = find_what_var_points_to (first_vi_for_offset (fi, fi_uses));
- for (e = node->callers; e; e = e->next_caller)
- {
- if (!e->call_stmt)
- continue;
-
- *gimple_call_clobber_set (e->call_stmt) = clobbers;
- *gimple_call_use_set (e->call_stmt) = uses;
- }
-
/* Compute the call-use and call-clobber sets for indirect calls
and calls to external functions. */
FOR_EACH_BB_FN (bb, fn)
{
gimple stmt = gsi_stmt (gsi);
struct pt_solution *pt;
- varinfo_t vi;
+ varinfo_t vi, fi;
tree decl;
if (!is_gimple_call (stmt))
continue;
- /* Handle direct calls to external functions. */
+ /* Handle direct calls to functions with body. */
decl = gimple_call_fndecl (stmt);
if (decl
- && (!(fi = lookup_vi_for_tree (decl))
- || !fi->is_fn_info))
+ && (fi = lookup_vi_for_tree (decl))
+ && fi->is_fn_info)
+ {
+ *gimple_call_clobber_set (stmt)
+ = find_what_var_points_to
+ (first_vi_for_offset (fi, fi_clobbers));
+ *gimple_call_use_set (stmt)
+ = find_what_var_points_to
+ (first_vi_for_offset (fi, fi_uses));
+ }
+ /* Handle direct calls to external functions. */
+ else if (decl)
{
pt = gimple_call_use_set (stmt);
if (gimple_call_flags (stmt) & ECF_CONST)
pt->nonlocal = 1;
}
}
-
/* Handle indirect calls. */
- if (!decl
- && (fi = get_fi_for_callee (stmt)))
+ else if (!decl
+ && (fi = get_fi_for_callee (stmt)))
{
/* We need to accumulate all clobbers/uses of all possible
callees. */
hashval = iterative_hash_hashval_t
((hashval_t) gimple_call_internal_fn (stmt), hashval);
else
- hashval = iterative_hash_expr (gimple_call_fn (stmt), hashval);
+ {
+ hashval = iterative_hash_expr (gimple_call_fn (stmt), hashval);
+ if (gimple_call_chain (stmt))
+ hashval = iterative_hash_expr (gimple_call_chain (stmt), hashval);
+ }
for (i = 0; i < gimple_call_num_args (stmt); i++)
{
arg = gimple_call_arg (stmt, i);
switch (gimple_code (s1))
{
case GIMPLE_CALL:
- if (gimple_call_num_args (s1) != gimple_call_num_args (s2))
- return false;
if (!gimple_call_same_target_p (s1, s2))
return false;
+ t1 = gimple_call_chain (s1);
+ t2 = gimple_call_chain (s2);
+ if (!gimple_operand_equal_value_p (t1, t2))
+ return false;
+
+ if (gimple_call_num_args (s1) != gimple_call_num_args (s2))
+ return false;
+
for (i = 0; i < gimple_call_num_args (s1); ++i)
{
t1 = gimple_call_arg (s1, i);
t2 = gimple_call_arg (s2, i);
- if (gimple_operand_equal_value_p (t1, t2))
- continue;
- return false;
+ if (!gimple_operand_equal_value_p (t1, t2))
+ return false;
}
lhs1 = gimple_get_lhs (s1);
traversing back edges less painful. */
static bool
-record_temporary_equivalences_from_phis (edge e, vec<tree> *stack,
- bool backedge_seen,
- bitmap src_map, bitmap dst_map)
+record_temporary_equivalences_from_phis (edge e, vec<tree> *stack)
{
gimple_stmt_iterator gsi;
stmt_count++;
record_temporary_equivalence (dst, src, stack);
-
- /* If we have crossed a backedge, then start recording equivalences
- we might need to invalidate. */
- if (backedge_seen && TREE_CODE (src) == SSA_NAME)
- {
- bitmap_set_bit (src_map, SSA_NAME_VERSION (src));
- bitmap_set_bit (dst_map, SSA_NAME_VERSION (dst));
- }
}
return true;
}
/* A new value has been assigned to LHS. If necessary, invalidate any
equivalences that are no longer valid. */
static void
-invalidate_equivalences (tree lhs, vec<tree> *stack,
- bitmap src_map, bitmap dst_map)
+invalidate_equivalences (tree lhs, vec<tree> *stack)
{
- /* SRC_MAP contains the source SSA_NAMEs for equivalences created by PHI
- nodes. If an entry in SRC_MAP changes, there's some destination that
- has been recorded as equivalent to the source and that equivalency
- needs to be eliminated. */
- if (bitmap_bit_p (src_map, SSA_NAME_VERSION (lhs)))
- {
- unsigned int i;
- bitmap_iterator bi;
-
- /* We know that the LHS of STMT was used as the RHS in an equivalency
- created by a PHI. All the LHS of such PHIs were recorded into DST_MAP.
- So we can iterate over them to see if any have the LHS of STMT as
- an equivalence, and if so, remove the equivalence as it is no longer
- valid. */
- EXECUTE_IF_SET_IN_BITMAP (dst_map, 0, i, bi)
- {
- if (SSA_NAME_VALUE (ssa_name (i)) == lhs)
- record_temporary_equivalence (ssa_name (i), NULL_TREE, stack);
- }
- }
+
+ for (unsigned int i = 1; i < num_ssa_names; i++)
+ if (ssa_name (i) && SSA_NAME_VALUE (ssa_name (i)) == lhs)
+ record_temporary_equivalence (ssa_name (i), NULL_TREE, stack);
+
+ if (SSA_NAME_VALUE (lhs))
+ record_temporary_equivalence (lhs, NULL_TREE, stack);
}
/* Try to simplify each statement in E->dest, ultimately leading to
vec<tree> *stack,
tree (*simplify) (gimple,
gimple),
- bool backedge_seen,
- bitmap src_map,
- bitmap dst_map)
+ bool backedge_seen)
{
gimple stmt = NULL;
gimple_stmt_iterator gsi;
&& (gimple_code (stmt) != GIMPLE_CALL
|| gimple_call_lhs (stmt) == NULL_TREE
|| TREE_CODE (gimple_call_lhs (stmt)) != SSA_NAME))
- continue;
+ {
+ /* STMT might still have DEFS and we need to invalidate any known
+ equivalences for them.
+
+ Consider if STMT is a GIMPLE_ASM with one or more outputs that
+ feeds a conditional inside a loop. We might derive an equivalence
+ due to the conditional. */
+ tree op;
+ ssa_op_iter iter;
+
+ if (backedge_seen)
+ FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_DEF)
+ invalidate_equivalences (op, stack);
+
+ continue;
+ }
/* The result of __builtin_object_size depends on all the arguments
of a phi node. Temporarily using only one edge produces invalid
if (backedge_seen)
{
tree lhs = gimple_get_lhs (stmt);
- record_temporary_equivalence (lhs, NULL_TREE, stack);
- invalidate_equivalences (lhs, stack, src_map, dst_map);
+ invalidate_equivalences (lhs, stack);
}
continue;
}
|| is_gimple_min_invariant (cached_lhs)))
record_temporary_equivalence (gimple_get_lhs (stmt), cached_lhs, stack);
else if (backedge_seen)
- record_temporary_equivalence (gimple_get_lhs (stmt), NULL_TREE, stack);
-
- if (backedge_seen)
- invalidate_equivalences (gimple_get_lhs (stmt), stack,
- src_map, dst_map);
+ invalidate_equivalences (gimple_get_lhs (stmt), stack);
}
return stmt;
}
SIMPLIFY is a pass-specific function used to simplify statements.
Our caller is responsible for restoring the state of the expression
- and const_and_copies stacks. */
+ and const_and_copies stacks.
-static bool
+ Positive return value is success. Zero return value is failure, but
+ the block can still be duplicated as a joiner in a jump thread path,
+ negative indicates the block should not be duplicated and thus is not
+ suitable for a joiner in a jump threading path. */
+
+static int
thread_through_normal_block (edge e,
gimple dummy_cond,
bool handle_dominating_asserts,
tree (*simplify) (gimple, gimple),
vec<jump_thread_edge *> *path,
bitmap visited,
- bool *backedge_seen_p,
- bitmap src_map,
- bitmap dst_map)
+ bool *backedge_seen_p)
{
/* If we have traversed a backedge, then we do not want to look
at certain expressions in the table that can not be relied upon.
if (*backedge_seen_p)
simplify = dummy_simplify;
- /* PHIs create temporary equivalences. */
- if (!record_temporary_equivalences_from_phis (e, stack, *backedge_seen_p,
- src_map, dst_map))
- return false;
+ /* PHIs create temporary equivalences.
+ Note that if we found a PHI that made the block non-threadable, then
+ we need to bubble that up to our caller in the same manner we do
+ when we prematurely stop processing statements below. */
+ if (!record_temporary_equivalences_from_phis (e, stack))
+ return -1;
/* Now walk each statement recording any context sensitive
temporary equivalences we can detect. */
gimple stmt
= record_temporary_equivalences_from_stmts_at_dest (e, stack, simplify,
- *backedge_seen_p,
- src_map, dst_map);
+ *backedge_seen_p);
+
+ /* If we didn't look at all the statements, the most likely reason is
+ there were too many and thus duplicating this block is not profitable.
+
+ Also note if we do not look at all the statements, then we may not
+ have invalidated equivalences that are no longer valid if we threaded
+ around a loop. Thus we must signal to our caller that this block
+ is not suitable for use as a joiner in a threading path. */
if (!stmt)
- return false;
+ return -1;
/* If we stopped at a COND_EXPR or SWITCH_EXPR, see if we know which arm
will be taken. */
if (dest == NULL
|| dest == e->dest
|| bitmap_bit_p (visited, dest->index))
- return false;
+ return 0;
/* Only push the EDGE_START_JUMP_THREAD marker if this is
first edge on the path. */
visited,
path,
backedge_seen_p);
- return true;
+ return 1;
}
}
- return false;
+ return 0;
}
/* We are exiting E->src, see if E->dest ends with a conditional
tree (*simplify) (gimple, gimple))
{
bitmap visited = BITMAP_ALLOC (NULL);
- bitmap src_map = BITMAP_ALLOC (NULL);
- bitmap dst_map = BITMAP_ALLOC (NULL);
bool backedge_seen;
stmt_count = 0;
if (backedge_seen)
simplify = dummy_simplify;
- if (thread_through_normal_block (e, dummy_cond, handle_dominating_asserts,
- stack, simplify, path, visited,
- &backedge_seen, src_map, dst_map))
+ int threaded = thread_through_normal_block (e, dummy_cond,
+ handle_dominating_asserts,
+ stack, simplify, path,
+ visited, &backedge_seen);
+ if (threaded > 0)
{
propagate_threaded_block_debug_into (path->last ()->e->dest,
e->dest);
remove_temporary_equivalences (stack);
BITMAP_FREE (visited);
- BITMAP_FREE (src_map);
- BITMAP_FREE (dst_map);
register_jump_thread (path);
return;
}
else
{
- /* There should be no edges on the path, so no need to walk through
- the vector entries. */
+ /* Negative and zero return values indicate no threading was possible,
+ thus there should be no edges on the thread path and no need to walk
+ through the vector entries. */
gcc_assert (path->length () == 0);
path->release ();
+
+ /* A negative status indicates the target block was deemed too big to
+ duplicate. Just quit now rather than trying to use the block as
+ a joiner in a jump threading path.
+
+ This prevents unnecessary code growth, but more importantly if we
+ do not look at all the statements in the block, then we may have
+ missed some invalidations if we had traversed a backedge! */
+ if (threaded < 0)
+ {
+ BITMAP_FREE (visited);
+ remove_temporary_equivalences (stack);
+ return;
+ }
}
/* We were unable to determine what out edge from E->dest is taken. However,
{
remove_temporary_equivalences (stack);
BITMAP_FREE (visited);
- BITMAP_FREE (src_map);
- BITMAP_FREE (dst_map);
return;
}
- /* We need to restore the state of the maps to this point each loop
- iteration. */
- bitmap src_map_copy = BITMAP_ALLOC (NULL);
- bitmap dst_map_copy = BITMAP_ALLOC (NULL);
- bitmap_copy (src_map_copy, src_map);
- bitmap_copy (dst_map_copy, dst_map);
-
/* Look at each successor of E->dest to see if we can thread through it. */
FOR_EACH_EDGE (taken_edge, ei, e->dest->succs)
{
/* Push a fresh marker so we can unwind the equivalences created
for each of E->dest's successors. */
stack->safe_push (NULL_TREE);
- bitmap_copy (src_map, src_map_copy);
- bitmap_copy (dst_map, dst_map_copy);
/* Avoid threading to any block we have already visited. */
bitmap_clear (visited);
found = thread_through_normal_block (path->last ()->e, dummy_cond,
handle_dominating_asserts,
stack, simplify, path, visited,
- &backedge_seen,
- src_map, dst_map);
+ &backedge_seen) > 0;
/* If we were able to thread through a successor of E->dest, then
record the jump threading opportunity. */
remove_temporary_equivalences (stack);
}
BITMAP_FREE (visited);
- BITMAP_FREE (src_map);
- BITMAP_FREE (dst_map);
- BITMAP_FREE (src_map_copy);
- BITMAP_FREE (dst_map_copy);
}
remove_temporary_equivalences (stack);
REAL_VALUE_TYPE r;
REAL_VALUE_TYPE *rp;
+ /* Clear all bits of the real value type so that we can later do
+ bitwise comparisons to see if two values are the same. */
+ memset (&r, 0, sizeof r);
r.cl = (unsigned) bp_unpack_value (bp, 2);
r.decimal = (unsigned) bp_unpack_value (bp, 1);
r.sign = (unsigned) bp_unpack_value (bp, 1);
{
/* Reject a tailcall if the type conversion might need
additional code. */
- if (gimple_assign_cast_p (stmt)
- && TYPE_MODE (TREE_TYPE (dest)) != TYPE_MODE (TREE_TYPE (src_var)))
- return false;
+ if (gimple_assign_cast_p (stmt))
+ {
+ if (TYPE_MODE (TREE_TYPE (dest)) != TYPE_MODE (TREE_TYPE (src_var)))
+ return false;
+
+ /* Even if the type modes are the same, if the precision of the
+ type is smaller than mode's precision,
+ reduce_to_bit_field_precision would generate additional code. */
+ if (INTEGRAL_TYPE_P (TREE_TYPE (dest))
+ && (GET_MODE_PRECISION (TYPE_MODE (TREE_TYPE (dest)))
+ > TYPE_PRECISION (TREE_TYPE (dest))))
+ return false;
+ }
if (src_var != *ass_var)
return false;
.. = a[i+1];
where we will end up loading { a[i], a[i+1] } once, make
sure that inserting group loads before the first load and
- stores after the last store will do the right thing. */
- if ((STMT_VINFO_GROUPED_ACCESS (stmtinfo_a)
- && GROUP_SAME_DR_STMT (stmtinfo_a))
- || (STMT_VINFO_GROUPED_ACCESS (stmtinfo_b)
- && GROUP_SAME_DR_STMT (stmtinfo_b)))
+ stores after the last store will do the right thing.
+ Similar for groups like
+ a[i] = ...;
+ ... = a[i];
+ a[i+1] = ...;
+ where loads from the group interleave with the store. */
+ if (STMT_VINFO_GROUPED_ACCESS (stmtinfo_a)
+ || STMT_VINFO_GROUPED_ACCESS (stmtinfo_b))
{
gimple earlier_stmt;
earlier_stmt = get_earlier_stmt (DR_STMT (dra), DR_STMT (drb));
bool
vect_analyze_data_refs (loop_vec_info loop_vinfo,
bb_vec_info bb_vinfo,
- int *min_vf)
+ int *min_vf, unsigned *n_stmts)
{
struct loop *loop = NULL;
basic_block bb = NULL;
for (gsi = gsi_start_bb (bbs[i]); !gsi_end_p (gsi); gsi_next (&gsi))
{
gimple stmt = gsi_stmt (gsi);
+ if (is_gimple_debug (stmt))
+ continue;
+ ++*n_stmts;
if (!find_data_references_in_stmt (loop, stmt, &datarefs))
{
if (is_gimple_call (stmt) && loop->safelen)
for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
{
gimple stmt = gsi_stmt (gsi);
+ if (is_gimple_debug (stmt))
+ continue;
+ ++*n_stmts;
if (!find_data_references_in_stmt (NULL, stmt,
&BB_VINFO_DATAREFS (bb_vinfo)))
{
if (!optimize
|| !VECTOR_INTEGER_TYPE_P (type)
- || TREE_CODE (rhs2) != VECTOR_CST)
+ || TREE_CODE (rhs2) != VECTOR_CST
+ || !VECTOR_MODE_P (TYPE_MODE (type)))
break;
ret = expand_vector_divmod (gsi, type, rhs1, rhs2, code);
update_stmt (gsi_stmt (*gsi));
}
+/* Return type in which CODE operation with optab OP can be
+ computed. */
+
+static tree
+get_compute_type (enum tree_code code, optab op, tree type)
+{
+ /* For very wide vectors, try using a smaller vector mode. */
+ tree compute_type = type;
+ if (op
+ && (!VECTOR_MODE_P (TYPE_MODE (type))
+ || optab_handler (op, TYPE_MODE (type)) == CODE_FOR_nothing))
+ {
+ tree vector_compute_type
+ = type_for_widest_vector_mode (TREE_TYPE (type), op);
+ if (vector_compute_type != NULL_TREE
+ && (TYPE_VECTOR_SUBPARTS (vector_compute_type)
+ < TYPE_VECTOR_SUBPARTS (compute_type))
+ && (optab_handler (op, TYPE_MODE (vector_compute_type))
+ != CODE_FOR_nothing))
+ compute_type = vector_compute_type;
+ }
+
+ /* If we are breaking a BLKmode vector into smaller pieces,
+ type_for_widest_vector_mode has already looked into the optab,
+ so skip these checks. */
+ if (compute_type == type)
+ {
+ enum machine_mode compute_mode = TYPE_MODE (compute_type);
+ if (VECTOR_MODE_P (compute_mode))
+ {
+ if (op && optab_handler (op, compute_mode) != CODE_FOR_nothing)
+ return compute_type;
+ if (code == MULT_HIGHPART_EXPR
+ && can_mult_highpart_p (compute_mode,
+ TYPE_UNSIGNED (compute_type)))
+ return compute_type;
+ }
+ /* There is no operation in hardware, so fall back to scalars. */
+ compute_type = TREE_TYPE (type);
+ }
+
+ return compute_type;
+}
+
+/* Helper function of expand_vector_operations_1. Return number of
+ vector elements for vector types or 1 for other types. */
+
+static inline int
+count_type_subparts (tree type)
+{
+ return VECTOR_TYPE_P (type) ? TYPE_VECTOR_SUBPARTS (type) : 1;
+}
+
/* Process one statement. If we identify a vector operation, expand it. */
static void
expand_vector_operations_1 (gimple_stmt_iterator *gsi)
{
gimple stmt = gsi_stmt (*gsi);
- tree lhs, rhs1, rhs2 = NULL, type, compute_type;
+ tree lhs, rhs1, rhs2 = NULL, type, compute_type = NULL_TREE;
enum tree_code code;
- enum machine_mode compute_mode;
optab op = unknown_optab;
enum gimple_rhs_class rhs_class;
tree new_rhs;
{
op = optab_for_tree_code (code, type, optab_scalar);
+ compute_type = get_compute_type (code, op, type);
+ if (compute_type == type)
+ return;
/* The rtl expander will expand vector/scalar as vector/vector
- if necessary. Don't bother converting the stmt here. */
- if (optab_handler (op, TYPE_MODE (type)) == CODE_FOR_nothing
- && optab_handler (opv, TYPE_MODE (type)) != CODE_FOR_nothing)
+ if necessary. Pick one with wider vector type. */
+ tree compute_vtype = get_compute_type (code, opv, type);
+ if (count_type_subparts (compute_vtype)
+ > count_type_subparts (compute_type))
+ {
+ compute_type = compute_vtype;
+ op = opv;
+ }
+ }
+
+ if (code == LROTATE_EXPR || code == RROTATE_EXPR)
+ {
+ if (compute_type == NULL_TREE)
+ compute_type = get_compute_type (code, op, type);
+ if (compute_type == type)
return;
+ /* Before splitting vector rotates into scalar rotates,
+ see if we can't use vector shifts and BIT_IOR_EXPR
+ instead. For vector by vector rotates we'd also
+ need to check BIT_AND_EXPR and NEGATE_EXPR, punt there
+ for now, fold doesn't seem to create such rotates anyway. */
+ if (compute_type == TREE_TYPE (type)
+ && !VECTOR_INTEGER_TYPE_P (TREE_TYPE (rhs2)))
+ {
+ optab oplv = vashl_optab, opl = ashl_optab;
+ optab oprv = vlshr_optab, opr = lshr_optab, opo = ior_optab;
+ tree compute_lvtype = get_compute_type (LSHIFT_EXPR, oplv, type);
+ tree compute_rvtype = get_compute_type (RSHIFT_EXPR, oprv, type);
+ tree compute_otype = get_compute_type (BIT_IOR_EXPR, opo, type);
+ tree compute_ltype = get_compute_type (LSHIFT_EXPR, opl, type);
+ tree compute_rtype = get_compute_type (RSHIFT_EXPR, opr, type);
+ /* The rtl expander will expand vector/scalar as vector/vector
+ if necessary. Pick one with wider vector type. */
+ if (count_type_subparts (compute_lvtype)
+ > count_type_subparts (compute_ltype))
+ {
+ compute_ltype = compute_lvtype;
+ opl = oplv;
+ }
+ if (count_type_subparts (compute_rvtype)
+ > count_type_subparts (compute_rtype))
+ {
+ compute_rtype = compute_rvtype;
+ opr = oprv;
+ }
+ /* Pick the narrowest type from LSHIFT_EXPR, RSHIFT_EXPR and
+ BIT_IOR_EXPR. */
+ compute_type = compute_ltype;
+ if (count_type_subparts (compute_type)
+ > count_type_subparts (compute_rtype))
+ compute_type = compute_rtype;
+ if (count_type_subparts (compute_type)
+ > count_type_subparts (compute_otype))
+ compute_type = compute_otype;
+ /* Verify all 3 operations can be performed in that type. */
+ if (compute_type != TREE_TYPE (type))
+ {
+ if (optab_handler (opl, TYPE_MODE (compute_type))
+ == CODE_FOR_nothing
+ || optab_handler (opr, TYPE_MODE (compute_type))
+ == CODE_FOR_nothing
+ || optab_handler (opo, TYPE_MODE (compute_type))
+ == CODE_FOR_nothing)
+ compute_type = TREE_TYPE (type);
+ }
+ }
}
}
else
&& INTEGRAL_TYPE_P (TREE_TYPE (type)))
op = optab_for_tree_code (MINUS_EXPR, type, optab_default);
- /* For very wide vectors, try using a smaller vector mode. */
- compute_type = type;
- if (!VECTOR_MODE_P (TYPE_MODE (type)) && op)
- {
- tree vector_compute_type
- = type_for_widest_vector_mode (TREE_TYPE (type), op);
- if (vector_compute_type != NULL_TREE
- && (TYPE_VECTOR_SUBPARTS (vector_compute_type)
- < TYPE_VECTOR_SUBPARTS (compute_type))
- && (optab_handler (op, TYPE_MODE (vector_compute_type))
- != CODE_FOR_nothing))
- compute_type = vector_compute_type;
- }
-
- /* If we are breaking a BLKmode vector into smaller pieces,
- type_for_widest_vector_mode has already looked into the optab,
- so skip these checks. */
+ if (compute_type == NULL_TREE)
+ compute_type = get_compute_type (code, op, type);
if (compute_type == type)
- {
- compute_mode = TYPE_MODE (compute_type);
- if (VECTOR_MODE_P (compute_mode))
- {
- if (op && optab_handler (op, compute_mode) != CODE_FOR_nothing)
- return;
- if (code == MULT_HIGHPART_EXPR
- && can_mult_highpart_p (compute_mode,
- TYPE_UNSIGNED (compute_type)))
- return;
- }
- /* There is no operation in hardware, so fall back to scalars. */
- compute_type = TREE_TYPE (type);
- }
+ return;
gcc_assert (code != VEC_LSHIFT_EXPR && code != VEC_RSHIFT_EXPR);
new_rhs = expand_vector_operation (gsi, type, compute_type, stmt, code);
int max_vf = MAX_VECTORIZATION_FACTOR;
int min_vf = 2;
unsigned int th;
+ unsigned int n_stmts = 0;
/* Find all data references in the loop (which correspond to vdefs/vuses)
and analyze their evolution in the loop. Also adjust the minimal
FORNOW: Handle only simple, array references, which
alignment can be forced, and aligned pointer-references. */
- ok = vect_analyze_data_refs (loop_vinfo, NULL, &min_vf);
+ ok = vect_analyze_data_refs (loop_vinfo, NULL, &min_vf, &n_stmts);
if (!ok)
{
if (dump_enabled_p ())
}
/* Check the SLP opportunities in the loop, analyze and build SLP trees. */
- ok = vect_analyze_slp (loop_vinfo, NULL);
+ ok = vect_analyze_slp (loop_vinfo, NULL, n_stmts);
if (ok)
{
/* Decide which possible SLP instances to SLP. */
/* Set phi nodes arguments. */
FOR_EACH_VEC_ELT (reduction_phis, i, phi)
{
- tree vec_init_def = vec_initial_defs[i];
- tree def = vect_defs[i];
+ tree vec_init_def, def;
+ gimple_seq stmts;
+ vec_init_def = force_gimple_operand (vec_initial_defs[i], &stmts,
+ true, NULL_TREE);
+ gsi_insert_seq_on_edge_immediate (loop_preheader_edge (loop), stmts);
+ def = vect_defs[i];
for (j = 0; j < ncopies; j++)
{
/* Set the loop-entry arg of the reduction-phi. */
unsigned int *max_nunits,
vec<slp_tree> *loads,
unsigned int vectorization_factor,
- bool *matches, unsigned *npermutes)
+ bool *matches, unsigned *npermutes, unsigned *tree_size,
+ unsigned max_tree_size)
{
- unsigned nops, i, this_npermutes = 0;
+ unsigned nops, i, this_npermutes = 0, this_tree_size = 0;
gimple stmt;
if (!matches)
if (oprnd_info->first_dt != vect_internal_def)
continue;
+ if (++this_tree_size > max_tree_size)
+ {
+ vect_free_oprnd_info (oprnds_info);
+ return false;
+ }
+
child = vect_create_new_slp_node (oprnd_info->def_stmts);
if (!child)
{
bool *matches = XALLOCAVEC (bool, group_size);
if (vect_build_slp_tree (loop_vinfo, bb_vinfo, &child,
group_size, max_nunits, loads,
- vectorization_factor, matches, npermutes))
+ vectorization_factor, matches,
+ npermutes, &this_tree_size, max_tree_size))
{
oprnd_info->def_stmts = vNULL;
SLP_TREE_CHILDREN (*node).quick_push (child);
if (vect_build_slp_tree (loop_vinfo, bb_vinfo, &child,
group_size, max_nunits, loads,
vectorization_factor,
- matches, npermutes))
+ matches, npermutes, &this_tree_size,
+ max_tree_size))
{
oprnd_info->def_stmts = vNULL;
SLP_TREE_CHILDREN (*node).quick_push (child);
return false;
}
+ if (tree_size)
+ *tree_size += this_tree_size;
+
vect_free_oprnd_info (oprnds_info);
return true;
}
static bool
vect_analyze_slp_instance (loop_vec_info loop_vinfo, bb_vec_info bb_vinfo,
- gimple stmt)
+ gimple stmt, unsigned max_tree_size)
{
slp_instance new_instance;
slp_tree node;
/* Build the tree for the SLP instance. */
if (vect_build_slp_tree (loop_vinfo, bb_vinfo, &node, group_size,
&max_nunits, &loads,
- vectorization_factor, NULL, NULL))
+ vectorization_factor, NULL, NULL, NULL,
+ max_tree_size))
{
/* Calculate the unrolling factor based on the smallest type. */
if (max_nunits > nunits)
trees of packed scalar stmts if SLP is possible. */
bool
-vect_analyze_slp (loop_vec_info loop_vinfo, bb_vec_info bb_vinfo)
+vect_analyze_slp (loop_vec_info loop_vinfo, bb_vec_info bb_vinfo,
+ unsigned max_tree_size)
{
unsigned int i;
vec<gimple> grouped_stores;
/* Find SLP sequences starting from groups of grouped stores. */
FOR_EACH_VEC_ELT (grouped_stores, i, first_element)
- if (vect_analyze_slp_instance (loop_vinfo, bb_vinfo, first_element))
+ if (vect_analyze_slp_instance (loop_vinfo, bb_vinfo, first_element,
+ max_tree_size))
ok = true;
if (bb_vinfo && !ok)
{
/* Find SLP sequences starting from reduction chains. */
FOR_EACH_VEC_ELT (reduc_chains, i, first_element)
- if (vect_analyze_slp_instance (loop_vinfo, bb_vinfo, first_element))
+ if (vect_analyze_slp_instance (loop_vinfo, bb_vinfo, first_element,
+ max_tree_size))
ok = true;
else
return false;
/* Find SLP sequences starting from groups of reductions. */
if (loop_vinfo && LOOP_VINFO_REDUCTIONS (loop_vinfo).length () > 1
- && vect_analyze_slp_instance (loop_vinfo, bb_vinfo, reductions[0]))
+ && vect_analyze_slp_instance (loop_vinfo, bb_vinfo, reductions[0],
+ max_tree_size))
ok = true;
return true;
slp_instance instance;
int i;
int min_vf = 2;
+ unsigned n_stmts = 0;
bb_vinfo = new_bb_vec_info (bb);
if (!bb_vinfo)
return NULL;
- if (!vect_analyze_data_refs (NULL, bb_vinfo, &min_vf))
+ if (!vect_analyze_data_refs (NULL, bb_vinfo, &min_vf, &n_stmts))
{
if (dump_enabled_p ())
dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
/* Check the SLP opportunities in the basic block, analyze and build SLP
trees. */
- if (!vect_analyze_slp (NULL, bb_vinfo))
+ if (!vect_analyze_slp (NULL, bb_vinfo, n_stmts))
{
if (dump_enabled_p ())
dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
extern bool vect_prune_runtime_alias_test_list (loop_vec_info);
extern tree vect_check_gather (gimple, loop_vec_info, tree *, tree *,
int *);
-extern bool vect_analyze_data_refs (loop_vec_info, bb_vec_info, int *);
+extern bool vect_analyze_data_refs (loop_vec_info, bb_vec_info, int *,
+ unsigned *);
extern tree vect_create_data_ref_ptr (gimple, tree, struct loop *, tree,
tree *, gimple_stmt_iterator *,
gimple *, bool, bool *);
slp_instance, bool);
extern bool vect_schedule_slp (loop_vec_info, bb_vec_info);
extern void vect_update_slp_costs_according_to_vf (loop_vec_info);
-extern bool vect_analyze_slp (loop_vec_info, bb_vec_info);
+extern bool vect_analyze_slp (loop_vec_info, bb_vec_info, unsigned);
extern bool vect_make_slp_decision (loop_vec_info);
extern void vect_detect_hybrid_slp (loop_vec_info);
extern void vect_get_slp_defs (vec<tree> , slp_tree,
/* If arg is non-zero, then ffs or popcount
are non-zero. */
if (((vr0->type == VR_RANGE
- && integer_nonzerop (vr0->min))
+ && range_includes_zero_p (vr0->min, vr0->max) == 0)
|| (vr0->type == VR_ANTI_RANGE
- && integer_zerop (vr0->min)))
- && !is_overflow_infinity (vr0->min))
+ && range_includes_zero_p (vr0->min, vr0->max) == 1))
+ && !is_overflow_infinity (vr0->min)
+ && !is_overflow_infinity (vr0->max))
mini = 1;
/* If some high bits are known to be zero,
we can decrease the maximum. */
if (vr0->type == VR_RANGE
&& TREE_CODE (vr0->max) == INTEGER_CST
+ && !operand_less_p (vr0->min,
+ build_zero_cst (TREE_TYPE (vr0->min)))
&& !is_overflow_infinity (vr0->max))
maxi = tree_floor_log2 (vr0->max) + 1;
}
}
else
{
+ if (!is_gimple_debug (gsi_stmt (si)))
+ is_unreachable = 0;
gsi_next (&si);
- is_unreachable = 0;
}
}
}
4, /* OMP_CLAUSE_REDUCTION */
1, /* OMP_CLAUSE_COPYIN */
1, /* OMP_CLAUSE_COPYPRIVATE */
- 2, /* OMP_CLAUSE_LINEAR */
+ 3, /* OMP_CLAUSE_LINEAR */
2, /* OMP_CLAUSE_ALIGNED */
1, /* OMP_CLAUSE_DEPEND */
1, /* OMP_CLAUSE_UNIFORM */
WALK_SUBTREE_TAIL (OMP_CLAUSE_CHAIN (*tp));
}
- case OMP_CLAUSE_ALIGNED:
case OMP_CLAUSE_LINEAR:
+ WALK_SUBTREE (OMP_CLAUSE_DECL (*tp));
+ WALK_SUBTREE (OMP_CLAUSE_LINEAR_STEP (*tp));
+ WALK_SUBTREE (OMP_CLAUSE_LINEAR_STMT (*tp));
+ WALK_SUBTREE_TAIL (OMP_CLAUSE_CHAIN (*tp));
+
+ case OMP_CLAUSE_ALIGNED:
case OMP_CLAUSE_FROM:
case OMP_CLAUSE_TO:
case OMP_CLAUSE_MAP:
#define OMP_CLAUSE_LINEAR_VARIABLE_STRIDE(NODE) \
TREE_PROTECTED (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_LINEAR))
+/* True if a LINEAR clause is for an array or allocatable variable that
+ needs special handling by the frontend. */
+#define OMP_CLAUSE_LINEAR_ARRAY(NODE) \
+ (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_LINEAR)->base.deprecated_flag)
+
#define OMP_CLAUSE_LINEAR_STEP(NODE) \
OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_LINEAR), 1)
+#define OMP_CLAUSE_LINEAR_STMT(NODE) \
+ OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_LINEAR), 2)
+
+#define OMP_CLAUSE_LINEAR_GIMPLE_SEQ(NODE) \
+ (OMP_CLAUSE_CHECK (NODE))->omp_clause.gimple_reduction_init
+
#define OMP_CLAUSE_ALIGNED_ALIGNMENT(NODE) \
OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_ALIGNED), 1)
/* Because we remove references from external functions before final compilation,
we may end up removing useful constructors.
FIXME: We probably want to trace boundaries better. */
- if ((init = ctor_for_folding (node->decl)) == error_mark_node)
+ if (cgraph_state == CGRAPH_LTO_STREAMING)
+ ;
+ else if ((init = ctor_for_folding (node->decl)) == error_mark_node)
varpool_remove_initializer (node);
else
DECL_INITIAL (node->decl) = init;
if (DECL_VIRTUAL_P (real_decl))
{
gcc_checking_assert (TREE_READONLY (real_decl));
- return DECL_INITIAL (real_decl);
+ if (DECL_INITIAL (real_decl))
+ return DECL_INITIAL (real_decl);
+ else
+ {
+ /* The C++ front end creates VAR_DECLs for vtables of typeinfo
+ classes not defined in the current TU so that it can refer
+ to them from typeinfo objects. Avoid returning NULL_TREE. */
+ gcc_checking_assert (!COMPLETE_TYPE_P (DECL_CONTEXT (real_decl)));
+ return error_mark_node;
+ }
}
/* If there is no constructor, we have nothing to do. */
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
+2014-05-08 Ian Lance Taylor <iant@google.com>
+
+ Backport from mainline:
+ * mmap.c (backtrace_free): If freeing a large aligned block of
+ memory, call munmap rather than holding onto it.
+ (backtrace_vector_grow): When growing a vector, double the number
+ of pages requested. When releasing the old version of a grown
+ vector, pass the correct size to backtrace_free.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
{
int locked;
+ /* If we are freeing a large aligned block, just release it back to
+ the system. This case arises when growing a vector for a large
+ binary with lots of debug info. Calling munmap here may cause us
+ to call mmap again if there is also a large shared library; we
+ just live with that. */
+ if (size >= 16 * 4096)
+ {
+ size_t pagesize;
+
+ pagesize = getpagesize ();
+ if (((uintptr_t) addr & (pagesize - 1)) == 0
+ && (size & (pagesize - 1)) == 0)
+ {
+ /* If munmap fails for some reason, just add the block to
+ the freelist. */
+ if (munmap (addr, size) == 0)
+ return;
+ }
+ }
+
/* If we can acquire the lock, add the new space to the free list.
If we can't acquire the lock, just leak the memory.
__sync_lock_test_and_set returns the old state of the lock, so we
alc = pagesize;
}
else
- alc = (alc + pagesize - 1) & ~ (pagesize - 1);
+ {
+ alc *= 2;
+ alc = (alc + pagesize - 1) & ~ (pagesize - 1);
+ }
base = backtrace_alloc (state, alc, error_callback, data);
if (base == NULL)
return NULL;
if (vec->base != NULL)
{
memcpy (base, vec->base, vec->size);
- backtrace_free (state, vec->base, vec->alc, error_callback, data);
+ backtrace_free (state, vec->base, vec->size + vec->alc,
+ error_callback, data);
}
vec->base = base;
vec->alc = alc - vec->size;
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
+2014-07-09 Edward Smith-Rowland <3dw4rd@verizon.net>
+
+ PR c++/58155 - -Wliteral-suffix warns about tokens which are skipped
+ by preprocessor
+ * lex.c (lex_raw_string ()): Do not warn about invalid suffix
+ if skipping. (lex_string ()): Ditto.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
if (is_macro (pfile, cur))
{
/* Raise a warning, but do not consume subsequent tokens. */
- if (CPP_OPTION (pfile, warn_literal_suffix))
+ if (CPP_OPTION (pfile, warn_literal_suffix) && !pfile->state.skipping)
cpp_warning_with_line (pfile, CPP_W_LITERAL_SUFFIX,
token->src_loc, 0,
"invalid suffix on literal; C++11 requires "
if (is_macro (pfile, cur))
{
/* Raise a warning, but do not consume subsequent tokens. */
- if (CPP_OPTION (pfile, warn_literal_suffix))
+ if (CPP_OPTION (pfile, warn_literal_suffix) && !pfile->state.skipping)
cpp_warning_with_line (pfile, CPP_W_LITERAL_SUFFIX,
token->src_loc, 0,
"invalid suffix on literal; C++11 requires "
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
+2014-05-27 Georg-Johann Lay <avr@gjlay.de>
+
+ Backport from 2014-05-27 mainline r210322.
+
+ PR libgcc/61152
+ * config/arm/bpabi-lib.h (License): Add GCC Runtime Library Exception.
+
+2014-05-22 Nick Clifton <nickc@redhat.com>
+
+ * config/msp430/t-msp430 (HOST_LIBGCC2_CFLAGS): Add
+ -mhwmult=none.
+
+2014-05-21 Maciej W. Rozycki <macro@codesourcery.com>
+
+ Backport from mainline
+ 2014-05-21 Maciej W. Rozycki <macro@codesourcery.com>
+
+ PR libgcc/60166
+ * config/arm/sfp-machine.h (_FP_NANFRAC_H, _FP_NANFRAC_S)
+ (_FP_NANFRAC_D, _FP_NANSIGN_Q): Set the quiet bit.
+
+2014-05-15 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+
+ Backport from mainline
+ 2014-05-08 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+
+ PR libgcc/61097
+ * config/t-slibgcc-sld: Only build and install libgcc-unwind.map
+ if --enable-shared.
+
+2014-04-30 Bernd Edlinger <bernd.edlinger@hotmail.de>
+
+ Work around for current cygwin32 build problems.
+ * config/i386/cygming-crtbegin.c (__register_frame_info,
+ __deregister_frame_info, _Jv_RegisterClasses): Compile weak default
+ functions only for 64-bit systems.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
License for more details.
+ Under Section 7 of GPL version 3, you are granted additional
+ permissions described in the GCC Runtime Library Exception, version
+ 3.1, as published by the Free Software Foundation.
+
You should have received a copy of the GNU General Public License and
a copy of the GCC Runtime Library Exception along with this program;
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
/* According to RTABI, QNAN is only with the most significant bit of the
significand set, and all other significand bits zero. */
-#define _FP_NANFRAC_H 0
-#define _FP_NANFRAC_S 0
-#define _FP_NANFRAC_D 0, 0
-#define _FP_NANFRAC_Q 0, 0, 0, 0
+#define _FP_NANFRAC_H _FP_QNANBIT_H
+#define _FP_NANFRAC_S _FP_QNANBIT_S
+#define _FP_NANFRAC_D _FP_QNANBIT_D, 0
+#define _FP_NANFRAC_Q _FP_QNANBIT_Q, 0, 0, 0
#define _FP_NANSIGN_H 0
#define _FP_NANSIGN_S 0
#define _FP_NANSIGN_D 0
TARGET_ATTRIBUTE_WEAK;
extern void *__deregister_frame_info (__attribute__((unused)) const void *)
TARGET_ATTRIBUTE_WEAK;
+
+/* Work around for current cygwin32 build problems (Bug gas/16858).
+ Compile weak default functions only for 64-bit systems,
+ when absolutely necessary. */
+#ifdef __x86_64__
TARGET_ATTRIBUTE_WEAK void
__register_frame_info (__attribute__((unused)) const void *p,
__attribute__((unused)) struct object *o)
{
return (void*) 0;
}
+#endif
#endif /* DWARF2_UNWIND_INFO */
#if TARGET_USE_JCR_SECTION
extern void _Jv_RegisterClasses (__attribute__((unused)) const void *)
TARGET_ATTRIBUTE_WEAK;
+#ifdef __x86_64__
TARGET_ATTRIBUTE_WEAK void
_Jv_RegisterClasses (__attribute__((unused)) const void *p)
{
}
+#endif
#endif /* TARGET_USE_JCR_SECTION */
#if defined(HAVE_LD_RO_RW_SECTION_MIXING)
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
$(srcdir)/config/msp430/floathisf.c \
$(srcdir)/config/msp430/cmpd.c
-HOST_LIBGCC2_CFLAGS += -Os -ffunction-sections -fdata-sections
+HOST_LIBGCC2_CFLAGS += -Os -ffunction-sections -fdata-sections -mhwmult=none
# Local Variables:
# mode: Makefile
SHLIB_LDFLAGS = -Wl,-h,$(SHLIB_SONAME) -Wl,-z,text -Wl,-z,defs \
-Wl,-M,$(SHLIB_MAP)
+ifeq ($(enable_shared),yes)
+
# Linker mapfile to enforce direct binding to libgcc_s unwinder
# (PR target/59788).
libgcc-unwind.map: libgcc-std.ver
$(INSTALL_DATA) $< $(DESTDIR)$(slibdir)
install: install-libgcc-unwind-map
+
+endif
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
+2014-07-06 Jerry DeLisle <jvdelisle@gcc.gnu.org>
+
+ Backport from trunk.
+ PR libgfortran/61640
+ * io/list_read.c (next_char_internal): Adjust the read length to
+ a single wide character. (eat_spaces): Add missing paren.
+ * io/unix.c (mem_read4): Use the correct mem_alloc function for
+ wide character internal reads.
+
+2014-06-27 Jerry DeLisle <jvdelisle@gcc.gnu.org>
+
+ Backport from trunk.
+ PR libgfortran/61499
+ * io/list_read.c (eat_spaces): Use a 'for' loop instead of
+ 'while' loop to skip the loop if there are no bytes left in the
+ string. Only seek if actual spaces can be skipped.
+
+2014-06-07 Jerry DeLisle <jvdelisle@gcc.gnu>
+
+ Backport from trunk.
+ PR libfortran/61173
+ * io/list_read.c (eat_spaces): If the next character pointed to
+ is a space, don't seek, must be at the end.
+
+2014-05-26 Janne Blomqvist <jb@gcc.gnu.org>
+
+ Backport from mainline
+ PR libfortran/61310
+ * intrinsics/ctime.c (strctime): Rename to gf_ctime, use snprintf
+ instead of strftime.
+ (fdate): Use gf_ctime.
+ (fdate_sub): Likewise.
+ (ctime): Likewise.
+ (ctime_sub): Likewise.
+
+2014-05-16 Janne Blomqvist <jb@gcc.gnu.org>
+
+ Backport from trunk:
+ PR libfortran/61187
+ * io/unix.c (raw_close): Check if s->fd is -1.
+ (fd_to_stream): Check return value of fstat(), handle error.
+
+2014-05-10 Jerry DeLisle <jvdelisle@gcc.gnu>
+
+ Backport from Trunk.
+ PR libfortran/61049
+ * io/list_read.c (list_formatted_read_scalar): Use eat_separator
+ and delete extraneous code.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
#include <string.h>
-/* strftime-like function that fills a C string with %c format which
- is identical to ctime in the default locale. As ctime and ctime_r
- are poorly specified and their usage not recommended, the
- implementation instead uses strftime. */
-
-static size_t
-strctime (char *s, size_t max, const time_t *timep)
+/* Maximum space a ctime-like string might need. A "normal" ctime
+ string is 26 bytes, and in our case 24 bytes as we don't include
+ the trailing newline and null. However, the longest possible year
+ number is -2,147,481,748 (1900 - 2,147,483,648, since tm_year is a
+ 32-bit signed integer) so an extra 7 bytes are needed. */
+#define CTIME_BUFSZ 31
+
+
+/* Thread-safe ctime-like function that fills a Fortran
+ string. ctime_r is a portability headache and marked as obsolescent
+ in POSIX 2008, which recommends strftime in its place. However,
+ strftime(..., "%c",...) doesn't produce ctime-like output on
+ MinGW, so do it manually with snprintf. */
+
+static int
+gf_ctime (char *s, size_t max, const time_t timev)
{
struct tm ltm;
int failed;
+ char buf[CTIME_BUFSZ + 1];
/* Some targets provide a localtime_r based on a draft of the POSIX
standard where the return type is int rather than the
standardized struct tm*. */
- __builtin_choose_expr (__builtin_classify_type (localtime_r (timep, <m))
+ __builtin_choose_expr (__builtin_classify_type (localtime_r (&timev, <m))
== 5,
- failed = localtime_r (timep, <m) == NULL,
- failed = localtime_r (timep, <m) != 0);
+ failed = localtime_r (&timev, <m) == NULL,
+ failed = localtime_r (&timev, <m) != 0);
if (failed)
- return 0;
- return strftime (s, max, "%c", <m);
+ goto blank;
+ int n = snprintf (buf, sizeof (buf),
+ "%3.3s %3.3s%3d %.2d:%.2d:%.2d %d",
+ "SunMonTueWedThuFriSat" + ltm.tm_wday * 3,
+ "JanFebMarAprMayJunJulAugSepOctNovDec" + ltm.tm_mon * 3,
+ ltm.tm_mday, ltm.tm_hour, ltm.tm_min, ltm.tm_sec,
+ 1900 + ltm.tm_year);
+ if (n < 0)
+ goto blank;
+ if ((size_t) n <= max)
+ {
+ cf_strcpy (s, max, buf);
+ return n;
+ }
+ blank:
+ memset (s, ' ', max);
+ return 0;
}
-/* In the default locale, the date and time representation fits in 26
- bytes. However, other locales might need more space. */
-#define CSZ 100
extern void fdate (char **, gfc_charlen_type *);
export_proto(fdate);
fdate (char ** date, gfc_charlen_type * date_len)
{
time_t now = time(NULL);
- *date = xmalloc (CSZ);
- *date_len = strctime (*date, CSZ, &now);
+ *date = xmalloc (CTIME_BUFSZ);
+ *date_len = gf_ctime (*date, CTIME_BUFSZ, now);
}
fdate_sub (char * date, gfc_charlen_type date_len)
{
time_t now = time(NULL);
- char *s = xmalloc (date_len + 1);
- size_t n = strctime (s, date_len + 1, &now);
- fstrcpy (date, date_len, s, n);
- free (s);
+ gf_ctime (date, date_len, now);
}
PREFIX(ctime) (char ** date, gfc_charlen_type * date_len, GFC_INTEGER_8 t)
{
time_t now = t;
- *date = xmalloc (CSZ);
- *date_len = strctime (*date, CSZ, &now);
+ *date = xmalloc (CTIME_BUFSZ);
+ *date_len = gf_ctime (*date, CTIME_BUFSZ, now);
}
ctime_sub (GFC_INTEGER_8 * t, char * date, gfc_charlen_type date_len)
{
time_t now = *t;
- char *s = xmalloc (date_len + 1);
- size_t n = strctime (s, date_len + 1, &now);
- fstrcpy (date, date_len, s, n);
- free (s);
+ gf_ctime (date, date_len, now);
}
{
/* Check for kind=4 internal unit. */
if (dtp->common.unit)
- length = sread (dtp->u.p.current_unit->s, &c, sizeof (gfc_char4_t));
+ length = sread (dtp->u.p.current_unit->s, &c, 1);
else
{
char cc;
int c;
/* If internal character array IO, peak ahead and seek past spaces.
- This is an optimazation to eliminate numerous calls to
- next character unique to character arrays with large character
- lengths (PR38199). */
- if (is_array_io (dtp))
+ This is an optimization unique to character arrays with large
+ character lengths (PR38199). This code eliminates numerous calls
+ to next_character. */
+ if (is_array_io (dtp) && (dtp->u.p.last_char == EOF - 1))
{
gfc_offset offset = stell (dtp->u.p.current_unit->s);
- gfc_offset limit = dtp->u.p.current_unit->bytes_left;
+ gfc_offset i;
if (dtp->common.unit) /* kind=4 */
{
- gfc_char4_t cc;
- limit *= (sizeof (gfc_char4_t));
- do
+ for (i = 0; i < dtp->u.p.current_unit->bytes_left; i++)
{
- cc = dtp->internal_unit[offset];
- offset += (sizeof (gfc_char4_t));
- dtp->u.p.current_unit->bytes_left--;
+ if (dtp->internal_unit[(offset + i) * sizeof (gfc_char4_t)]
+ != (gfc_char4_t)' ')
+ break;
}
- while (offset < limit && (cc == (gfc_char4_t)' '
- || cc == (gfc_char4_t)'\t'));
- /* Back up, seek ahead, and fall through to complete the
- process so that END conditions are handled correctly. */
- dtp->u.p.current_unit->bytes_left++;
- sseek (dtp->u.p.current_unit->s,
- offset-(sizeof (gfc_char4_t)), SEEK_SET);
}
else
{
- do
+ for (i = 0; i < dtp->u.p.current_unit->bytes_left; i++)
{
- c = dtp->internal_unit[offset++];
- dtp->u.p.current_unit->bytes_left--;
+ if (dtp->internal_unit[offset + i] != ' ')
+ break;
}
- while (offset < limit && (c == ' ' || c == '\t'));
- /* Back up, seek ahead, and fall through to complete the
- process so that END conditions are handled correctly. */
- dtp->u.p.current_unit->bytes_left++;
- sseek (dtp->u.p.current_unit->s, offset-1, SEEK_SET);
+ }
+
+ if (i != 0)
+ {
+ sseek (dtp->u.p.current_unit->s, offset + i, SEEK_SET);
+ dtp->u.p.current_unit->bytes_left -= i;
}
}
+
/* Now skip spaces, EOF and EOL are handled in next_char. */
do
c = next_char (dtp);
}
if (is_separator (c))
{
- /* Found a null value. Do not use eat_separator here otherwise
- we will do an extra read from stdin. */
+ /* Found a null value. */
dtp->u.p.repeat_count = 0;
-
- /* Set comma_flag. */
- if ((c == ';'
- && dtp->u.p.current_unit->decimal_status == DECIMAL_COMMA)
- ||
- (c == ','
- && dtp->u.p.current_unit->decimal_status == DECIMAL_POINT))
- {
- dtp->u.p.comma_flag = 1;
- goto cleanup;
- }
+ eat_separator (dtp);
/* Set end-of-line flag. */
if (c == '\n' || c == '\r')
else
goto cleanup;
}
-
}
else
{
{
int retval;
- if (s->fd != STDOUT_FILENO
+ if (s->fd == -1)
+ retval = -1;
+ else if (s->fd != STDOUT_FILENO
&& s->fd != STDERR_FILENO
&& s->fd != STDIN_FILENO)
retval = close (s->fd);
void *p;
int nb = nbytes;
- p = mem_alloc_r (s, &nb);
+ p = mem_alloc_r4 (s, &nb);
if (p)
{
- memcpy (buf, p, nb);
+ memcpy (buf, p, nb * 4);
return (ssize_t) nb;
}
else
/* Get the current length of the file. */
- fstat (fd, &statbuf);
+ if (fstat (fd, &statbuf) == -1)
+ {
+ s->st_dev = s->st_ino = -1;
+ s->file_length = 0;
+ if (errno == EBADF)
+ s->fd = -1;
+ raw_init (s);
+ return (stream *) s;
+ }
s->st_dev = statbuf.st_dev;
s->st_ino = statbuf.st_ino;
/* Define to 1 if you have the `renameat' function. */
#undef HAVE_RENAMEAT
+/* Define to 1 if you have the <sched.h> header file. */
+#undef HAVE_SCHED_H
+
/* Define to 1 if you have the `sem_timedwait' function. */
#undef HAVE_SEM_TIMEDWAIT
;;
esac
-for ac_header in sys/file.h sys/mman.h syscall.h sys/epoll.h sys/inotify.h sys/ptrace.h sys/syscall.h sys/user.h sys/utsname.h sys/select.h sys/socket.h net/if.h net/if_arp.h net/route.h netpacket/packet.h sys/prctl.h sys/mount.h sys/vfs.h sys/statfs.h sys/timex.h sys/sysinfo.h utime.h linux/ether.h linux/fs.h linux/reboot.h netinet/icmp6.h netinet/in_syst.h netinet/ip.h netinet/ip_mroute.h netinet/if_ether.h
+for ac_header in sched.h sys/file.h sys/mman.h syscall.h sys/epoll.h sys/inotify.h sys/ptrace.h sys/syscall.h sys/user.h sys/utsname.h sys/select.h sys/socket.h net/if.h net/if_arp.h net/route.h netpacket/packet.h sys/prctl.h sys/mount.h sys/vfs.h sys/statfs.h sys/timex.h sys/sysinfo.h utime.h linux/ether.h linux/fs.h linux/reboot.h netinet/icmp6.h netinet/in_syst.h netinet/ip.h netinet/ip_mroute.h netinet/if_ether.h
do :
as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
;;
esac
-AC_CHECK_HEADERS(sys/file.h sys/mman.h syscall.h sys/epoll.h sys/inotify.h sys/ptrace.h sys/syscall.h sys/user.h sys/utsname.h sys/select.h sys/socket.h net/if.h net/if_arp.h net/route.h netpacket/packet.h sys/prctl.h sys/mount.h sys/vfs.h sys/statfs.h sys/timex.h sys/sysinfo.h utime.h linux/ether.h linux/fs.h linux/reboot.h netinet/icmp6.h netinet/in_syst.h netinet/ip.h netinet/ip_mroute.h netinet/if_ether.h)
+AC_CHECK_HEADERS(sched.h sys/file.h sys/mman.h syscall.h sys/epoll.h sys/inotify.h sys/ptrace.h sys/syscall.h sys/user.h sys/utsname.h sys/select.h sys/socket.h net/if.h net/if_arp.h net/route.h netpacket/packet.h sys/prctl.h sys/mount.h sys/vfs.h sys/statfs.h sys/timex.h sys/sysinfo.h utime.h linux/ether.h linux/fs.h linux/reboot.h netinet/icmp6.h netinet/in_syst.h netinet/ip.h netinet/ip_mroute.h netinet/if_ether.h)
AC_CHECK_HEADERS([linux/filter.h linux/if_addr.h linux/if_ether.h linux/if_tun.h linux/netlink.h linux/rtnetlink.h], [], [],
[#ifdef HAVE_SYS_SOCKET_H
#if defined(HAVE_NETINET_ICMP6_H)
#include <netinet/icmp6.h>
#endif
+#if defined(HAVE_SCHED_H)
+#include <sched.h>
+#endif
/* Constants that may only be defined as expressions on some systems,
expressions too complex for -fdump-go-spec to handle. These are
#ifdef TIOCSCTTY
TIOCSCTTY_val = TIOCSCTTY,
#endif
+#ifdef TIOCGPTN
+ TIOCGPTN_val = TIOCGPTN,
+#endif
+#ifdef TIOCSPTLCK
+ TIOCSPTLCK_val = TIOCSPTLCK,
+#endif
+#ifdef TIOCGDEV
+ TIOCGDEV_val = TIOCGDEV,
+#endif
+#ifdef TIOCSIG
+ TIOCSIG_val = TIOCSIG,
+#endif
};
EOF
echo 'const TIOCSCTTY = _TIOCSCTTY_val' >> ${OUT}
fi
fi
+if ! grep '^const TIOCGPTN' ${OUT} >/dev/null 2>&1; then
+ if grep '^const _TIOCGPTN_val' ${OUT} >/dev/null 2>&1; then
+ echo 'const TIOCGPTN = _TIOCGPTN_val' >> ${OUT}
+ fi
+fi
+if ! grep '^const TIOCSPTLCK' ${OUT} >/dev/null 2>&1; then
+ if grep '^const _TIOCSPTLCK_val' ${OUT} >/dev/null 2>&1; then
+ echo 'const TIOCSPTLCK = _TIOCSPTLCK_val' >> ${OUT}
+ fi
+fi
+if ! grep '^const TIOCGDEV' ${OUT} >/dev/null 2>&1; then
+ if grep '^const _TIOCGDEV_val' ${OUT} >/dev/null 2>&1; then
+ echo 'const TIOCGDEV = _TIOCGDEV_val' >> ${OUT}
+ fi
+fi
+if ! grep '^const TIOCSIG' ${OUT} >/dev/null 2>&1; then
+ if grep '^const _TIOCSIG_val' ${OUT} >/dev/null 2>&1; then
+ echo 'const TIOCSIG = _TIOCSIG_val' >> ${OUT}
+ fi
+fi
# The ioctl flags for terminal control
grep '^const _TC[GS]ET' gen-sysinfo.go | \
-e 's/\[0\]byte/[0]int8/' \
>> ${OUT}
+# The GNU/Linux CLONE flags.
+grep '^const _CLONE_' gen-sysinfo.go | \
+ sed -e 's/^\(const \)_\(CLONE_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
+
# The Solaris 11 Update 1 _zone_net_addr_t struct.
grep '^type _zone_net_addr_t ' gen-sysinfo.go | \
sed -e 's/_in6_addr/[16]byte/' \
static uintptr
scavengelist(MSpan *list, uint64 now, uint64 limit)
{
- uintptr released, sumreleased;
+ uintptr released, sumreleased, start, end, pagesize;
MSpan *s;
if(runtime_MSpanList_IsEmpty(list))
mstats.heap_released += released;
sumreleased += released;
s->npreleased = s->npages;
- runtime_SysUnused((void*)(s->start << PageShift), s->npages << PageShift);
+
+ start = s->start << PageShift;
+ end = start + (s->npages << PageShift);
+
+ // Round start up and end down to ensure we
+ // are acting on entire pages.
+ pagesize = getpagesize();
+ start = ROUND(start, pagesize);
+ end &= ~(pagesize - 1);
+ if(end > start)
+ runtime_SysUnused((void*)start, end - start);
}
}
return sumreleased;
if(runtime_needextram) {
// Can happen if C/C++ code calls Go from a global ctor.
// Can not throw, because scheduler is not initialized yet.
- runtime_write(2, "fatal error: cgo callback before cgo call\n",
+ int rv __attribute__((unused));
+ rv = runtime_write(2, "fatal error: cgo callback before cgo call\n",
sizeof("fatal error: cgo callback before cgo call\n")-1);
runtime_exit(1);
}
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
+2014-06-30 Jakub Jelinek <jakub@redhat.com>
+
+ Backported from mainline
+ 2014-06-25 Jakub Jelinek <jakub@redhat.com>
+
+ * testsuite/libgomp.fortran/simd5.f90: New test.
+ * testsuite/libgomp.fortran/simd6.f90: New test.
+ * testsuite/libgomp.fortran/simd7.f90: New test.
+
+ 2014-06-24 Jakub Jelinek <jakub@redhat.com>
+
+ * testsuite/libgomp.fortran/aligned1.f03: New test.
+ * testsuite/libgomp.fortran/nestedfn5.f90: New test.
+ * testsuite/libgomp.fortran/target7.f90: Surround loop spawning
+ tasks with !$omp parallel !$omp single.
+ * testsuite/libgomp.fortran/target8.f90: New test.
+ * testsuite/libgomp.fortran/udr4.f90 (foo UDR, bar UDR): Adjust
+ not to use trim in the combiner, instead call elemental function.
+ (fn): New elemental function.
+ * testsuite/libgomp.fortran/udr6.f90 (do_add, dp_add, dp_init):
+ Make elemental.
+ * testsuite/libgomp.fortran/udr7.f90 (omp_priv, omp_orig, omp_out,
+ omp_in): Likewise.
+ * testsuite/libgomp.fortran/udr12.f90: New test.
+ * testsuite/libgomp.fortran/udr13.f90: New test.
+ * testsuite/libgomp.fortran/udr14.f90: New test.
+ * testsuite/libgomp.fortran/udr15.f90: New test.
+
+ 2014-06-18 Jakub Jelinek <jakub@redhat.com>
+
+ * omp_lib.f90.in (openmp_version): Set to 201307.
+ * omp_lib.h.in (openmp_version): Likewise.
+ * testsuite/libgomp.c/target-8.c: New test.
+ * testsuite/libgomp.fortran/declare-simd-1.f90: Add notinbranch
+ and inbranch clauses.
+ * testsuite/libgomp.fortran/depend-3.f90: New test.
+ * testsuite/libgomp.fortran/openmp_version-1.f: Adjust for new
+ openmp_version.
+ * testsuite/libgomp.fortran/openmp_version-2.f90: Likewise.
+ * testsuite/libgomp.fortran/target1.f90: New test.
+ * testsuite/libgomp.fortran/target2.f90: New test.
+ * testsuite/libgomp.fortran/target3.f90: New test.
+ * testsuite/libgomp.fortran/target4.f90: New test.
+ * testsuite/libgomp.fortran/target5.f90: New test.
+ * testsuite/libgomp.fortran/target6.f90: New test.
+ * testsuite/libgomp.fortran/target7.f90: New test.
+
+ 2014-06-10 Jakub Jelinek <jakub@redhat.com>
+
+ PR fortran/60928
+ * testsuite/libgomp.fortran/allocatable9.f90: New test.
+ * testsuite/libgomp.fortran/allocatable10.f90: New test.
+ * testsuite/libgomp.fortran/allocatable11.f90: New test.
+ * testsuite/libgomp.fortran/allocatable12.f90: New test.
+ * testsuite/libgomp.fortran/alloc-comp-1.f90: New test.
+ * testsuite/libgomp.fortran/alloc-comp-2.f90: New test.
+ * testsuite/libgomp.fortran/alloc-comp-3.f90: New test.
+ * testsuite/libgomp.fortran/associate1.f90: New test.
+ * testsuite/libgomp.fortran/associate2.f90: New test.
+ * testsuite/libgomp.fortran/procptr1.f90: New test.
+
+ 2014-06-06 Jakub Jelinek <jakub@redhat.com>
+
+ * testsuite/libgomp.fortran/simd1.f90: New test.
+ * testsuite/libgomp.fortran/udr1.f90: New test.
+ * testsuite/libgomp.fortran/udr2.f90: New test.
+ * testsuite/libgomp.fortran/udr3.f90: New test.
+ * testsuite/libgomp.fortran/udr4.f90: New test.
+ * testsuite/libgomp.fortran/udr5.f90: New test.
+ * testsuite/libgomp.fortran/udr6.f90: New test.
+ * testsuite/libgomp.fortran/udr7.f90: New test.
+ * testsuite/libgomp.fortran/udr8.f90: New test.
+ * testsuite/libgomp.fortran/udr9.f90: New test.
+ * testsuite/libgomp.fortran/udr10.f90: New test.
+ * testsuite/libgomp.fortran/udr11.f90: New test.
+
+ 2014-05-27 Uros Bizjak <ubizjak@gmail.com>
+
+ * testsuite/libgomp.fortran/declare-simd-1.f90: Require
+ vect_simd_clones effective target.
+ * testsuite/libgomp.fortran/declare-simd-2.f90: Ditto.
+
+ 2014-05-11 Jakub Jelinek <jakub@redhat.com>
+
+ * testsuite/libgomp.fortran/cancel-do-1.f90: New test.
+ * testsuite/libgomp.fortran/cancel-do-2.f90: New test.
+ * testsuite/libgomp.fortran/cancel-parallel-1.f90: New test.
+ * testsuite/libgomp.fortran/cancel-parallel-3.f90: New test.
+ * testsuite/libgomp.fortran/cancel-sections-1.f90: New test.
+ * testsuite/libgomp.fortran/cancel-taskgroup-2.f90: New test.
+ * testsuite/libgomp.fortran/declare-simd-1.f90: New test.
+ * testsuite/libgomp.fortran/declare-simd-2.f90: New test.
+ * testsuite/libgomp.fortran/declare-simd-3.f90: New test.
+ * testsuite/libgomp.fortran/depend-1.f90: New test.
+ * testsuite/libgomp.fortran/depend-2.f90: New test.
+ * testsuite/libgomp.fortran/omp_atomic5.f90: New test.
+ * testsuite/libgomp.fortran/simd1.f90: New test.
+ * testsuite/libgomp.fortran/simd2.f90: New test.
+ * testsuite/libgomp.fortran/simd3.f90: New test.
+ * testsuite/libgomp.fortran/simd4.f90: New test.
+ * testsuite/libgomp.fortran/taskgroup1.f90: New test.
+
+2014-06-24 Jakub Jelinek <jakub@redhat.com>
+
+ * testsuite/libgomp.c/for-2.c: Define SC to static for
+ #pragma omp for simd testing.
+ * testsuite/libgomp.c/for-2.h (SC): Define if not defined.
+ (N(f5), N(f6), N(f7), N(f8), N(f10), N(f12), N(f14)): Use
+ SC macro.
+ * testsuite/libgomp.c/simd-14.c: New test.
+ * testsuite/libgomp.c/simd-15.c: New test.
+ * testsuite/libgomp.c/simd-16.c: New test.
+ * testsuite/libgomp.c/simd-17.c: New test.
+ * testsuite/libgomp.c++/for-10.C: Define SC to static for
+ #pragma omp for simd testing.
+ * testsuite/libgomp.c++/simd10.C: New test.
+ * testsuite/libgomp.c++/simd11.C: New test.
+ * testsuite/libgomp.c++/simd12.C: New test.
+ * testsuite/libgomp.c++/simd13.C: New test.
+
+2014-05-21 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/61252
+ * testsuite/libgomp.c++/simd-9.C: New test.
+
+2014-05-18 Uros Bizjak <ubizjak@gmail.com>
+
+ * libgomp.texi (Runitme Library Routines): Remove multiple @menu.
+ (Environment Variables) Move OMP_PROC_BIND and OMP_STACKSIZE node
+ texts according to their @menu entry positions.
+
+2014-05-02 Jakub Jelinek <jakub@redhat.com>
+
+ * testsuite/libgomp.c/simd-10.c: New test.
+ * testsuite/libgomp.c/simd-11.c: New test.
+ * testsuite/libgomp.c/simd-12.c: New test.
+ * testsuite/libgomp.c/simd-13.c: New test.
+
+2014-04-24 Jakub Jelinek <jakub@redhat.com>
+
+ * testsuite/libgomp.c++/atomic-14.C: Allow seq_cst and
+ atomic type clauses in any order and optional comma in between.
+ * testsuite/libgomp.c++/atomic-15.C: Likewise.
+ * testsuite/libgomp.c/atomic-17.c: Likewise.
+
+ * testsuite/libgomp.c/simd-7.c: New test.
+ * testsuite/libgomp.c/simd-8.c: New test.
+ * testsuite/libgomp.c/simd-9.c: New test.
+ * testsuite/libgomp.c/loop-16.c: New test.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
OpenMP specification in version 4.0. The routines are structured in
following three parts:
- Control threads, processors and the parallel environment. They have
-C linkage, and do not throw exceptions.
-
* Menu:
+Control threads, processors and the parallel environment. They have C
+linkage, and do not throw exceptions.
+
* omp_get_active_level:: Number of active parallel regions
* omp_get_ancestor_thread_num:: Ancestor thread ID
* omp_get_cancellation:: Whether cancellation support is enabled
* omp_set_num_threads:: Set upper team size limit
* omp_set_schedule:: Set the runtime scheduling method
- Initialize, set, test, unset and destroy simple and nested locks.
-
-* Menu:
+Initialize, set, test, unset and destroy simple and nested locks.
* omp_init_lock:: Initialize simple lock
* omp_set_lock:: Wait for and set simple lock
* omp_unset_nest_lock:: Unset nested lock
* omp_destroy_nest_lock:: Destroy nested lock
- Portable, thread-based, wall clock timer.
-
-* Menu:
+Portable, thread-based, wall clock timer.
* omp_get_wtick:: Get timer precision.
* omp_get_wtime:: Elapsed wall clock time.
OpenMP specification v4.0 (http://www.openmp.org/), Section 4.6
\1f
-File: libgomp.info, Node: OMP_NUM_THREADS, Next: OMP_PLACES, Prev: OMP_NESTED, Up: Environment Variables
+File: libgomp.info, Node: OMP_NUM_THREADS, Next: OMP_PROC_BIND, Prev: OMP_NESTED, Up: Environment Variables
3.7 'OMP_NUM_THREADS' - Specifies the number of threads to use
==============================================================
OpenMP specification v4.0 (http://www.openmp.org/), Section 4.2
\1f
-File: libgomp.info, Node: OMP_PLACES, Next: OMP_PROC_BIND, Prev: OMP_NUM_THREADS, Up: Environment Variables
+File: libgomp.info, Node: OMP_PROC_BIND, Next: OMP_PLACES, Prev: OMP_NUM_THREADS, Up: Environment Variables
+
+3.8 'OMP_PROC_BIND' - Whether theads may be moved between CPUs
+==============================================================
+
+_Description_:
+ Specifies whether threads may be moved between processors. If set
+ to 'TRUE', OpenMP theads should not be moved; if set to 'FALSE'
+ they may be moved. Alternatively, a comma separated list with the
+ values 'MASTER', 'CLOSE' and 'SPREAD' can be used to specify the
+ thread affinity policy for the corresponding nesting level. With
+ 'MASTER' the worker threads are in the same place partition as the
+ master thread. With 'CLOSE' those are kept close to the master
+ thread in contiguous place partitions. And with 'SPREAD' a sparse
+ distribution across the place partitions is used.
+
+ When undefined, 'OMP_PROC_BIND' defaults to 'TRUE' when
+ 'OMP_PLACES' or 'GOMP_CPU_AFFINITY' is set and 'FALSE' otherwise.
+
+_See also_:
+ *note OMP_PLACES::, *note GOMP_CPU_AFFINITY::, *note
+ omp_get_proc_bind::
+
+_Reference_:
+ OpenMP specification v4.0 (http://www.openmp.org/), Section 4.4
+
+\1f
+File: libgomp.info, Node: OMP_PLACES, Next: OMP_STACKSIZE, Prev: OMP_PROC_BIND, Up: Environment Variables
-3.8 'OMP_PLACES' - Specifies on which CPUs the theads should be placed
+3.9 'OMP_PLACES' - Specifies on which CPUs the theads should be placed
======================================================================
_Description_:
OpenMP specification v4.0 (http://www.openmp.org/), Section 4.5
\1f
-File: libgomp.info, Node: OMP_PROC_BIND, Next: OMP_SCHEDULE, Prev: OMP_PLACES, Up: Environment Variables
+File: libgomp.info, Node: OMP_STACKSIZE, Next: OMP_SCHEDULE, Prev: OMP_PLACES, Up: Environment Variables
-3.9 'OMP_PROC_BIND' - Whether theads may be moved between CPUs
-==============================================================
+3.10 'OMP_STACKSIZE' - Set default thread stack size
+====================================================
_Description_:
- Specifies whether threads may be moved between processors. If set
- to 'TRUE', OpenMP theads should not be moved; if set to 'FALSE'
- they may be moved. Alternatively, a comma separated list with the
- values 'MASTER', 'CLOSE' and 'SPREAD' can be used to specify the
- thread affinity policy for the corresponding nesting level. With
- 'MASTER' the worker threads are in the same place partition as the
- master thread. With 'CLOSE' those are kept close to the master
- thread in contiguous place partitions. And with 'SPREAD' a sparse
- distribution across the place partitions is used.
-
- When undefined, 'OMP_PROC_BIND' defaults to 'TRUE' when
- 'OMP_PLACES' or 'GOMP_CPU_AFFINITY' is set and 'FALSE' otherwise.
-
-_See also_:
- *note OMP_PLACES::, *note GOMP_CPU_AFFINITY::, *note
- omp_get_proc_bind::
+ Set the default thread stack size in kilobytes, unless the number
+ is suffixed by 'B', 'K', 'M' or 'G', in which case the size is,
+ respectively, in bytes, kilobytes, megabytes or gigabytes. This is
+ different from 'pthread_attr_setstacksize' which gets the number of
+ bytes as an argument. If the stack size cannot be set due to
+ system constraints, an error is reported and the initial stack size
+ is left unchanged. If undefined, the stack size is system
+ dependent.
_Reference_:
- OpenMP specification v4.0 (http://www.openmp.org/), Section 4.4
+ OpenMP specification v4.0 (http://www.openmp.org/), Section 4.7
\1f
-File: libgomp.info, Node: OMP_SCHEDULE, Next: OMP_STACKSIZE, Prev: OMP_PROC_BIND, Up: Environment Variables
+File: libgomp.info, Node: OMP_SCHEDULE, Next: OMP_THREAD_LIMIT, Prev: OMP_STACKSIZE, Up: Environment Variables
-3.10 'OMP_SCHEDULE' - How threads are scheduled
+3.11 'OMP_SCHEDULE' - How threads are scheduled
===============================================
_Description_:
and 4.1
\1f
-File: libgomp.info, Node: OMP_STACKSIZE, Next: OMP_THREAD_LIMIT, Prev: OMP_SCHEDULE, Up: Environment Variables
-
-3.11 'OMP_STACKSIZE' - Set default thread stack size
-====================================================
-
-_Description_:
- Set the default thread stack size in kilobytes, unless the number
- is suffixed by 'B', 'K', 'M' or 'G', in which case the size is,
- respectively, in bytes, kilobytes, megabytes or gigabytes. This is
- different from 'pthread_attr_setstacksize' which gets the number of
- bytes as an argument. If the stack size cannot be set due to
- system constraints, an error is reported and the initial stack size
- is left unchanged. If undefined, the stack size is system
- dependent.
-
-_Reference_:
- OpenMP specification v4.0 (http://www.openmp.org/), Section 4.7
-
-\1f
-File: libgomp.info, Node: OMP_THREAD_LIMIT, Next: OMP_WAIT_POLICY, Prev: OMP_STACKSIZE, Up: Environment Variables
+File: libgomp.info, Node: OMP_THREAD_LIMIT, Next: OMP_WAIT_POLICY, Prev: OMP_SCHEDULE, Up: Environment Variables
3.12 'OMP_THREAD_LIMIT' - Set the maximum number of threads
===========================================================
* Environment Variable <4>: OMP_MAX_ACTIVE_LEVELS. (line 6)
* Environment Variable <5>: OMP_NESTED. (line 6)
* Environment Variable <6>: OMP_NUM_THREADS. (line 6)
-* Environment Variable <7>: OMP_PLACES. (line 6)
-* Environment Variable <8>: OMP_PROC_BIND. (line 6)
-* Environment Variable <9>: OMP_SCHEDULE. (line 6)
-* Environment Variable <10>: OMP_STACKSIZE. (line 6)
+* Environment Variable <7>: OMP_PROC_BIND. (line 6)
+* Environment Variable <8>: OMP_PLACES. (line 6)
+* Environment Variable <9>: OMP_STACKSIZE. (line 6)
+* Environment Variable <10>: OMP_SCHEDULE. (line 6)
* Environment Variable <11>: OMP_THREAD_LIMIT. (line 6)
* Environment Variable <12>: OMP_WAIT_POLICY. (line 6)
* Environment Variable <13>: GOMP_CPU_AFFINITY. (line 6)
Node: Top\7f1992
Node: Enabling OpenMP\7f3186
Node: Runtime Library Routines\7f3973
-Node: omp_get_active_level\7f6987
-Node: omp_get_ancestor_thread_num\7f7687
-Node: omp_get_cancellation\7f8617
-Node: omp_get_default_device\7f9431
-Node: omp_get_dynamic\7f10107
-Node: omp_get_level\7f10982
-Node: omp_get_max_active_levels\7f11602
-Node: omp_get_max_threads\7f12301
-Node: omp_get_nested\7f13058
-Node: omp_get_num_devices\7f13970
-Node: omp_get_num_procs\7f14491
-Node: omp_get_num_teams\7f15030
-Node: omp_get_num_threads\7f15546
-Node: omp_get_proc_bind\7f16635
-Node: omp_get_schedule\7f17556
-Node: omp_get_team_num\7f18502
-Node: omp_get_team_size\7f19001
-Node: omp_get_thread_limit\7f19961
-Node: omp_get_thread_num\7f20580
-Node: omp_in_parallel\7f21451
-Node: omp_in_final\7f22100
-Node: omp_is_initial_device\7f22774
-Node: omp_set_default_device\7f23467
-Node: omp_set_dynamic\7f24258
-Node: omp_set_max_active_levels\7f25144
-Node: omp_set_nested\7f25921
-Node: omp_set_num_threads\7f26813
-Node: omp_set_schedule\7f27681
-Node: omp_init_lock\7f28732
-Node: omp_set_lock\7f29385
-Node: omp_test_lock\7f30240
-Node: omp_unset_lock\7f31216
-Node: omp_destroy_lock\7f32147
-Node: omp_init_nest_lock\7f32824
-Node: omp_set_nest_lock\7f33559
-Node: omp_test_nest_lock\7f34474
-Node: omp_unset_nest_lock\7f35501
-Node: omp_destroy_nest_lock\7f36516
-Node: omp_get_wtick\7f37267
-Node: omp_get_wtime\7f37859
-Node: Environment Variables\7f38635
-Node: OMP_CANCELLATION\7f39977
-Node: OMP_DISPLAY_ENV\7f40510
-Node: OMP_DEFAULT_DEVICE\7f41213
-Node: OMP_DYNAMIC\7f41993
-Node: OMP_MAX_ACTIVE_LEVELS\7f42589
-Node: OMP_NESTED\7f43228
-Node: OMP_NUM_THREADS\7f43833
-Node: OMP_PLACES\7f44518
-Node: OMP_PROC_BIND\7f46695
-Node: OMP_SCHEDULE\7f47884
-Node: OMP_STACKSIZE\7f48577
-Node: OMP_THREAD_LIMIT\7f49407
-Node: OMP_WAIT_POLICY\7f50008
-Node: GOMP_CPU_AFFINITY\7f50700
-Node: GOMP_STACKSIZE\7f52437
-Node: GOMP_SPINCOUNT\7f53273
-Node: The libgomp ABI\7f54445
-Node: Implementing MASTER construct\7f55244
-Node: Implementing CRITICAL construct\7f55658
-Node: Implementing ATOMIC construct\7f56397
-Node: Implementing FLUSH construct\7f56878
-Node: Implementing BARRIER construct\7f57149
-Node: Implementing THREADPRIVATE construct\7f57418
-Node: Implementing PRIVATE clause\7f58071
-Node: Implementing FIRSTPRIVATE LASTPRIVATE COPYIN and COPYPRIVATE clauses\7f58652
-Node: Implementing REDUCTION clause\7f59976
-Node: Implementing PARALLEL construct\7f60533
-Node: Implementing FOR construct\7f61790
-Node: Implementing ORDERED construct\7f63788
-Node: Implementing SECTIONS construct\7f64094
-Node: Implementing SINGLE construct\7f64860
-Node: Reporting Bugs\7f65522
-Node: Copying\7f65832
-Node: GNU Free Documentation License\7f103378
-Node: Funding\7f128500
-Node: Library Index\7f131026
+Node: omp_get_active_level\7f6960
+Node: omp_get_ancestor_thread_num\7f7660
+Node: omp_get_cancellation\7f8590
+Node: omp_get_default_device\7f9404
+Node: omp_get_dynamic\7f10080
+Node: omp_get_level\7f10955
+Node: omp_get_max_active_levels\7f11575
+Node: omp_get_max_threads\7f12274
+Node: omp_get_nested\7f13031
+Node: omp_get_num_devices\7f13943
+Node: omp_get_num_procs\7f14464
+Node: omp_get_num_teams\7f15003
+Node: omp_get_num_threads\7f15519
+Node: omp_get_proc_bind\7f16608
+Node: omp_get_schedule\7f17529
+Node: omp_get_team_num\7f18475
+Node: omp_get_team_size\7f18974
+Node: omp_get_thread_limit\7f19934
+Node: omp_get_thread_num\7f20553
+Node: omp_in_parallel\7f21424
+Node: omp_in_final\7f22073
+Node: omp_is_initial_device\7f22747
+Node: omp_set_default_device\7f23440
+Node: omp_set_dynamic\7f24231
+Node: omp_set_max_active_levels\7f25117
+Node: omp_set_nested\7f25894
+Node: omp_set_num_threads\7f26786
+Node: omp_set_schedule\7f27654
+Node: omp_init_lock\7f28705
+Node: omp_set_lock\7f29358
+Node: omp_test_lock\7f30213
+Node: omp_unset_lock\7f31189
+Node: omp_destroy_lock\7f32120
+Node: omp_init_nest_lock\7f32797
+Node: omp_set_nest_lock\7f33532
+Node: omp_test_nest_lock\7f34447
+Node: omp_unset_nest_lock\7f35474
+Node: omp_destroy_nest_lock\7f36489
+Node: omp_get_wtick\7f37240
+Node: omp_get_wtime\7f37832
+Node: Environment Variables\7f38608
+Node: OMP_CANCELLATION\7f39950
+Node: OMP_DISPLAY_ENV\7f40483
+Node: OMP_DEFAULT_DEVICE\7f41186
+Node: OMP_DYNAMIC\7f41966
+Node: OMP_MAX_ACTIVE_LEVELS\7f42562
+Node: OMP_NESTED\7f43201
+Node: OMP_NUM_THREADS\7f43806
+Node: OMP_PROC_BIND\7f44494
+Node: OMP_PLACES\7f45686
+Node: OMP_STACKSIZE\7f47861
+Node: OMP_SCHEDULE\7f48685
+Node: OMP_THREAD_LIMIT\7f49381
+Node: OMP_WAIT_POLICY\7f49981
+Node: GOMP_CPU_AFFINITY\7f50673
+Node: GOMP_STACKSIZE\7f52410
+Node: GOMP_SPINCOUNT\7f53246
+Node: The libgomp ABI\7f54418
+Node: Implementing MASTER construct\7f55217
+Node: Implementing CRITICAL construct\7f55631
+Node: Implementing ATOMIC construct\7f56370
+Node: Implementing FLUSH construct\7f56851
+Node: Implementing BARRIER construct\7f57122
+Node: Implementing THREADPRIVATE construct\7f57391
+Node: Implementing PRIVATE clause\7f58044
+Node: Implementing FIRSTPRIVATE LASTPRIVATE COPYIN and COPYPRIVATE clauses\7f58625
+Node: Implementing REDUCTION clause\7f59949
+Node: Implementing PARALLEL construct\7f60506
+Node: Implementing FOR construct\7f61763
+Node: Implementing ORDERED construct\7f63761
+Node: Implementing SECTIONS construct\7f64067
+Node: Implementing SINGLE construct\7f64833
+Node: Reporting Bugs\7f65495
+Node: Copying\7f65805
+Node: GNU Free Documentation License\7f103351
+Node: Funding\7f128473
+Node: Library Index\7f130999
\1f
End Tag Table
specification in version 4.0. The routines are structured in following
three parts:
+@menu
Control threads, processors and the parallel environment. They have C
linkage, and do not throw exceptions.
-@menu
* omp_get_active_level:: Number of active parallel regions
* omp_get_ancestor_thread_num:: Ancestor thread ID
* omp_get_cancellation:: Whether cancellation support is enabled
* omp_set_nested:: Enable/disable nested parallel regions
* omp_set_num_threads:: Set upper team size limit
* omp_set_schedule:: Set the runtime scheduling method
-@end menu
Initialize, set, test, unset and destroy simple and nested locks.
-@menu
* omp_init_lock:: Initialize simple lock
* omp_set_lock:: Wait for and set simple lock
* omp_test_lock:: Test and set simple lock if available
* omp_test_nest_lock:: Test and set nested lock if available
* omp_unset_nest_lock:: Unset nested lock
* omp_destroy_nest_lock:: Destroy nested lock
-@end menu
Portable, thread-based, wall clock timer.
-@menu
* omp_get_wtick:: Get timer precision.
* omp_get_wtime:: Elapsed wall clock time.
@end menu
+@node OMP_PROC_BIND
+@section @env{OMP_PROC_BIND} -- Whether theads may be moved between CPUs
+@cindex Environment Variable
+@table @asis
+@item @emph{Description}:
+Specifies whether threads may be moved between processors. If set to
+@code{TRUE}, OpenMP theads should not be moved; if set to @code{FALSE}
+they may be moved. Alternatively, a comma separated list with the
+values @code{MASTER}, @code{CLOSE} and @code{SPREAD} can be used to specify
+the thread affinity policy for the corresponding nesting level. With
+@code{MASTER} the worker threads are in the same place partition as the
+master thread. With @code{CLOSE} those are kept close to the master thread
+in contiguous place partitions. And with @code{SPREAD} a sparse distribution
+across the place partitions is used.
+
+When undefined, @env{OMP_PROC_BIND} defaults to @code{TRUE} when
+@env{OMP_PLACES} or @env{GOMP_CPU_AFFINITY} is set and @code{FALSE} otherwise.
+
+@item @emph{See also}:
+@ref{OMP_PLACES}, @ref{GOMP_CPU_AFFINITY}, @ref{omp_get_proc_bind}
+
+@item @emph{Reference}:
+@uref{http://www.openmp.org/, OpenMP specification v4.0}, Section 4.4
+@end table
+
+
+
@node OMP_PLACES
@section @env{OMP_PLACES} -- Specifies on which CPUs the theads should be placed
@cindex Environment Variable
-@node OMP_PROC_BIND
-@section @env{OMP_PROC_BIND} -- Whether theads may be moved between CPUs
+@node OMP_STACKSIZE
+@section @env{OMP_STACKSIZE} -- Set default thread stack size
@cindex Environment Variable
@table @asis
@item @emph{Description}:
-Specifies whether threads may be moved between processors. If set to
-@code{TRUE}, OpenMP theads should not be moved; if set to @code{FALSE}
-they may be moved. Alternatively, a comma separated list with the
-values @code{MASTER}, @code{CLOSE} and @code{SPREAD} can be used to specify
-the thread affinity policy for the corresponding nesting level. With
-@code{MASTER} the worker threads are in the same place partition as the
-master thread. With @code{CLOSE} those are kept close to the master thread
-in contiguous place partitions. And with @code{SPREAD} a sparse distribution
-across the place partitions is used.
-
-When undefined, @env{OMP_PROC_BIND} defaults to @code{TRUE} when
-@env{OMP_PLACES} or @env{GOMP_CPU_AFFINITY} is set and @code{FALSE} otherwise.
-
-@item @emph{See also}:
-@ref{OMP_PLACES}, @ref{GOMP_CPU_AFFINITY}, @ref{omp_get_proc_bind}
+Set the default thread stack size in kilobytes, unless the number
+is suffixed by @code{B}, @code{K}, @code{M} or @code{G}, in which
+case the size is, respectively, in bytes, kilobytes, megabytes
+or gigabytes. This is different from @code{pthread_attr_setstacksize}
+which gets the number of bytes as an argument. If the stack size cannot
+be set due to system constraints, an error is reported and the initial
+stack size is left unchanged. If undefined, the stack size is system
+dependent.
-@item @emph{Reference}:
-@uref{http://www.openmp.org/, OpenMP specification v4.0}, Section 4.4
+@item @emph{Reference}:
+@uref{http://www.openmp.org/, OpenMP specification v4.0}, Section 4.7
@end table
-@node OMP_STACKSIZE
-@section @env{OMP_STACKSIZE} -- Set default thread stack size
-@cindex Environment Variable
-@table @asis
-@item @emph{Description}:
-Set the default thread stack size in kilobytes, unless the number
-is suffixed by @code{B}, @code{K}, @code{M} or @code{G}, in which
-case the size is, respectively, in bytes, kilobytes, megabytes
-or gigabytes. This is different from @code{pthread_attr_setstacksize}
-which gets the number of bytes as an argument. If the stack size cannot
-be set due to system constraints, an error is reported and the initial
-stack size is left unchanged. If undefined, the stack size is system
-dependent.
-
-@item @emph{Reference}:
-@uref{http://www.openmp.org/, OpenMP specification v4.0}, Section 4.7
-@end table
-
-
-
@node OMP_THREAD_LIMIT
@section @env{OMP_THREAD_LIMIT} -- Set the maximum number of threads
@cindex Environment Variable
module omp_lib
use omp_lib_kinds
implicit none
- integer, parameter :: openmp_version = 201107
+ integer, parameter :: openmp_version = 201307
interface
subroutine omp_init_lock (svar)
parameter (omp_proc_bind_master = 2)
parameter (omp_proc_bind_close = 3)
parameter (omp_proc_bind_spread = 4)
- parameter (openmp_version = 201107)
+ parameter (openmp_version = 201307)
external omp_init_lock, omp_init_nest_lock
external omp_destroy_lock, omp_destroy_nest_lock
v = x;
if (v != 3)
abort ();
- #pragma omp atomic update seq_cst
+ #pragma omp atomic seq_cst update
x = 3 * 2 * 1 + x;
- #pragma omp atomic read seq_cst
+ #pragma omp atomic read, seq_cst
v = x;
if (v != 9)
abort ();
- #pragma omp atomic capture seq_cst
+ #pragma omp atomic seq_cst, capture
v = x = x | 16;
if (v != 25)
abort ();
v = x = x + 14 * 2 / 4;
if (v != 32)
abort ();
- #pragma omp atomic capture seq_cst
+ #pragma omp atomic seq_cst capture
v = x = 5 | x;
if (v != 37)
abort ();
- #pragma omp atomic capture seq_cst
+ #pragma omp atomic capture, seq_cst
v = x = 40 + 12 - 2 - 7 - x;
if (v != 6)
abort ();
- #pragma omp atomic read seq_cst
+ #pragma omp atomic seq_cst read
v = x;
if (v != 6)
abort ();
{ v = x; x = 3 + x; }
if (v != 6)
abort ();
- #pragma omp atomic capture seq_cst
+ #pragma omp atomic seq_cst capture
{ v = x; x = -1 * -1 * -1 * -1 - x; }
if (v != 9)
abort ();
v = x;
if (v != -8)
abort ();
- #pragma omp atomic capture seq_cst
+ #pragma omp atomic capture, seq_cst
{ x = 2 * 2 - x; v = x; }
if (v != 12)
abort ();
- #pragma omp atomic capture seq_cst
+ #pragma omp atomic seq_cst capture
{ x = 7 & x; v = x; }
if (v != 4)
abort ();
{ v = x; x = 6; }
if (v != 4)
abort ();
- #pragma omp atomic read seq_cst
+ #pragma omp atomic read, seq_cst
v = x;
if (v != 6)
abort ();
{ v = x; x = 7 * 8 + 23; }
if (v != 6)
abort ();
- #pragma omp atomic read seq_cst
+ #pragma omp atomic seq_cst, read
v = x;
if (v != 79)
abort ();
- #pragma omp atomic capture seq_cst
+ #pragma omp atomic capture , seq_cst
{ v = x; x = 23 + 6 * 4; }
if (v != 79)
abort ();
v = x;
if (v != 47)
abort ();
- #pragma omp atomic capture seq_cst
+ #pragma omp atomic seq_cst capture
{ v = x; x = l ? 17 : 12; }
if (v != 47)
abort ();
v = x;
if (v != 3)
abort ();
- #pragma omp atomic update seq_cst
+ #pragma omp atomic seq_cst update
x = 3 * 2 * 1 + x;
- #pragma omp atomic read seq_cst
+ #pragma omp atomic read, seq_cst
v = x;
if (v != 9)
abort ();
- #pragma omp atomic capture seq_cst
+ #pragma omp atomic seq_cst, capture
v = x = x | 16;
if (v != 25)
abort ();
v = x = x + 14 * 2 / 4;
if (v != 32)
abort ();
- #pragma omp atomic capture seq_cst
+ #pragma omp atomic seq_cst capture
v = x = 5 | x;
if (v != 37)
abort ();
- #pragma omp atomic capture seq_cst
+ #pragma omp atomic capture, seq_cst
v = x = 40 + 12 - 2 - 7 - x;
if (v != 6)
abort ();
- #pragma omp atomic read seq_cst
+ #pragma omp atomic seq_cst read
v = x;
if (v != 6)
abort ();
{ v = x; x = 3 + x; }
if (v != 6)
abort ();
- #pragma omp atomic capture seq_cst
+ #pragma omp atomic seq_cst capture
{ v = x; x = -1 * -1 * -1 * -1 - x; }
if (v != 9)
abort ();
v = x;
if (v != -8)
abort ();
- #pragma omp atomic capture seq_cst
+ #pragma omp atomic capture, seq_cst
{ x = 2 * 2 - x; v = x; }
if (v != 12)
abort ();
- #pragma omp atomic capture seq_cst
+ #pragma omp atomic seq_cst capture
{ x = 7 & x; v = x; }
if (v != 4)
abort ();
{ v = x; x = 6; }
if (v != 4)
abort ();
- #pragma omp atomic read seq_cst
+ #pragma omp atomic read, seq_cst
v = x;
if (v != 6)
abort ();
{ v = x; x = 7 * 8 + 23; }
if (v != 6)
abort ();
- #pragma omp atomic read seq_cst
+ #pragma omp atomic seq_cst, read
v = x;
if (v != 79)
abort ();
- #pragma omp atomic capture seq_cst
+ #pragma omp atomic capture , seq_cst
{ v = x; x = 23 + 6 * 4; }
if (v != 79)
abort ();
v = x;
if (v != 47)
abort ();
- #pragma omp atomic capture seq_cst
+ #pragma omp atomic seq_cst capture
{ v = x; x = l ? 17 : 12; }
if (v != 47)
abort ();
#undef F
#undef G
+#undef SC
+#define SC static
#define F for simd
#define G f_simd
#include "../libgomp.c/for-1.h"
#undef F
#undef G
+#undef SC
int
main ()
--- /dev/null
+// { dg-do run }
+// { dg-options "-O2" }
+// { dg-additional-options "-msse2" { target sse2_runtime } }
+// { dg-additional-options "-mavx" { target avx_runtime } }
+
+extern "C" void abort ();
+int a[1024] __attribute__((aligned (32))) = { 1 };
+#pragma omp declare reduction (foo:int:omp_out += omp_in) \
+ initializer (omp_priv = 0)
+
+__attribute__((noinline, noclone)) void
+foo (int &u, int &v)
+{
+ int i;
+ #pragma omp simd aligned(a : 32) reduction(foo:u) reduction(+:v)
+ for (i = 0; i < 1024; i++)
+ {
+ int x = a[i];
+ u += x;
+ v += x;
+ }
+}
+
+__attribute__((noinline, noclone)) void
+bar (int &u, int &v)
+{
+ int i;
+ #pragma omp simd aligned(a : 32) reduction(foo:u) reduction(+:v) \
+ safelen(1)
+ for (i = 0; i < 1024; i++)
+ {
+ int x = a[i];
+ u += x;
+ v += x;
+ }
+}
+
+int
+main ()
+{
+ int i;
+ for (i = 0; i < 1024; i++)
+ a[i] = (i & 31) + (i / 128);
+ int u = 0, v = 0;
+ foo (u, v);
+ if (u != 19456 || v != 19456)
+ abort ();
+ u = 0; v = 0;
+ bar (u, v);
+ if (u != 19456 || v != 19456)
+ abort ();
+}
--- /dev/null
+// { dg-do run }
+// { dg-options "-O2" }
+// { dg-additional-options "-msse2" { target sse2_runtime } }
+// { dg-additional-options "-mavx" { target avx_runtime } }
+
+#include "../libgomp.c/simd-14.c"
--- /dev/null
+// { dg-do run }
+// { dg-options "-O2" }
+// { dg-additional-options "-msse2" { target sse2_runtime } }
+// { dg-additional-options "-mavx" { target avx_runtime } }
+
+#include "../libgomp.c/simd-15.c"
--- /dev/null
+// { dg-do run }
+// { dg-options "-O2" }
+// { dg-additional-options "-msse2" { target sse2_runtime } }
+// { dg-additional-options "-mavx" { target avx_runtime } }
+
+#include "../libgomp.c/simd-16.c"
--- /dev/null
+// { dg-do run }
+// { dg-options "-O2" }
+// { dg-additional-options "-msse2" { target sse2_runtime } }
+// { dg-additional-options "-mavx" { target avx_runtime } }
+
+#include "../libgomp.c/simd-17.c"
v = x;
if (v != 3)
abort ();
- #pragma omp atomic update seq_cst
+ #pragma omp atomic seq_cst update
x = 3 * 2 * 1 + x;
- #pragma omp atomic read seq_cst
+ #pragma omp atomic read, seq_cst
v = x;
if (v != 9)
abort ();
- #pragma omp atomic capture seq_cst
+ #pragma omp atomic seq_cst, capture
v = x = x | 16;
if (v != 25)
abort ();
v = x = x + 14 * 2 / 4;
if (v != 32)
abort ();
- #pragma omp atomic capture seq_cst
+ #pragma omp atomic seq_cst capture
v = x = 5 | x;
if (v != 37)
abort ();
- #pragma omp atomic capture seq_cst
+ #pragma omp atomic capture, seq_cst
v = x = 40 + 12 - 2 - 7 - x;
if (v != 6)
abort ();
- #pragma omp atomic read seq_cst
+ #pragma omp atomic seq_cst read
v = x;
if (v != 6)
abort ();
{ v = x; x = 3 + x; }
if (v != 6)
abort ();
- #pragma omp atomic capture seq_cst
+ #pragma omp atomic seq_cst capture
{ v = x; x = -1 * -1 * -1 * -1 - x; }
if (v != 9)
abort ();
v = x;
if (v != -8)
abort ();
- #pragma omp atomic capture seq_cst
+ #pragma omp atomic capture, seq_cst
{ x = 2 * 2 - x; v = x; }
if (v != 12)
abort ();
- #pragma omp atomic capture seq_cst
+ #pragma omp atomic seq_cst capture
{ x = 7 & x; v = x; }
if (v != 4)
abort ();
{ v = x; x = 6; }
if (v != 4)
abort ();
- #pragma omp atomic read seq_cst
+ #pragma omp atomic read, seq_cst
v = x;
if (v != 6)
abort ();
{ v = x; x = 7 * 8 + 23; }
if (v != 6)
abort ();
- #pragma omp atomic read seq_cst
+ #pragma omp atomic seq_cst, read
v = x;
if (v != 79)
abort ();
- #pragma omp atomic capture seq_cst
+ #pragma omp atomic capture , seq_cst
{ v = x; x = 23 + 6 * 4; }
if (v != 79)
abort ();
v = x;
if (v != 47)
abort ();
- #pragma omp atomic capture seq_cst
+ #pragma omp atomic seq_cst capture
{ v = x; x = l ? 17 : 12; }
if (v != 47)
abort ();
#undef F
#undef G
+#undef SC
+#define SC static
#define F for simd
#define G f_simd
#include "for-1.h"
#undef F
#undef G
+#undef SC
int
main ()
for (;;);
}
#endif
+#ifndef SC
+#define SC
+#endif
__attribute__((noinline, noclone)) void
N(f0) (void)
N(f5) (int n11, int n12, int n21, int n22, int n31, int n32,
int s1, int s2, int s3)
{
- int v1, v2, v3;
+ SC int v1, v2, v3;
#pragma omp F S collapse(3)
for (v1 = n11; v1 < n12; v1 += s1)
for (v2 = n21; v2 < n22; v2 += s2)
N(f6) (int n11, int n12, int n21, int n22, long long n31, long long n32,
int s1, int s2, long long int s3)
{
- int v1, v2;
- long long v3;
+ SC int v1, v2;
+ SC long long v3;
#pragma omp F S collapse(3)
for (v1 = n11; v1 > n12; v1 += s1)
for (v2 = n21; v2 > n22; v2 += s2)
__attribute__((noinline, noclone)) void
N(f7) (void)
{
- unsigned int v1, v3;
- unsigned long long v2;
+ SC unsigned int v1, v3;
+ SC unsigned long long v2;
#pragma omp F S collapse(3)
for (v1 = 0; v1 < 20; v1 += 2)
for (v2 = __LONG_LONG_MAX__ + 16ULL;
__attribute__((noinline, noclone)) void
N(f8) (void)
{
- long long v1, v2, v3;
+ SC long long v1, v2, v3;
#pragma omp F S collapse(3)
for (v1 = 0; v1 < 20; v1 += 2)
for (v2 = 30; v2 < 20; v2++)
__attribute__((noinline, noclone)) void
N(f10) (void)
{
- int i;
+ SC int i;
#pragma omp F S collapse(3)
for (i = 0; i < 10; i++)
for (int j = 10; j < 8; j++)
__attribute__((noinline, noclone)) void
N(f12) (int n)
{
- int i;
+ SC int i;
#pragma omp F S collapse(3)
for (i = 0; i < 10; i++)
for (int j = n; j < 8; j++)
__attribute__((noinline, noclone)) void
N(f14) (void)
{
- float *i;
+ SC float *i;
#pragma omp F S collapse(3)
for (i = &b[0][0][0]; i < &b[0][0][10]; i++)
for (float *j = &b[0][15][0]; j > &b[0][0][0]; j -= 10)
--- /dev/null
+/* { dg-do run } */
+
+extern void abort (void);
+
+volatile int count;
+static int test (void)
+{
+ return ++count > 0;
+}
+
+int i;
+
+int
+main ()
+{
+ #pragma omp for lastprivate (i)
+ for (i = 0; i < 10; ++i)
+ {
+ int *p = &i;
+ if (test ())
+ continue;
+ abort ();
+ }
+ if (i != count)
+ abort ();
+ return 0;
+}
--- /dev/null
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+/* { dg-additional-options "-msse2" { target sse2_runtime } } */
+/* { dg-additional-options "-mavx" { target avx_runtime } } */
+
+int s = 0, i, u;
+
+void
+foo ()
+{
+ #pragma omp for simd schedule(static, 32) reduction(+:s) lastprivate(u)
+ for (i = 0; i < 128; i++)
+ {
+ s++;
+ u = i;
+ }
+ if (i != 128 || s != 128 || u != 127)
+ __builtin_abort ();
+}
+
+int
+main ()
+{
+ foo ();
+ return 0;
+}
--- /dev/null
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+/* { dg-additional-options "-msse2" { target sse2_runtime } } */
+/* { dg-additional-options "-mavx" { target avx_runtime } } */
+
+int s = 0, i, j, u;
+
+void
+foo ()
+{
+ #pragma omp for simd schedule(static, 32) reduction(+:s) lastprivate(u) collapse(2)
+ for (i = 0; i < 16; i++)
+ for (j = 0; j < 16; j++)
+ {
+ s++;
+ u = i + j;
+ }
+ if (i != 16 || j != 16 || s != 256 || u != 30)
+ __builtin_abort ();
+}
+
+int
+main ()
+{
+ foo ();
+ return 0;
+}
--- /dev/null
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+/* { dg-additional-options "-msse2" { target sse2_runtime } } */
+/* { dg-additional-options "-mavx" { target avx_runtime } } */
+
+int
+main ()
+{
+ int k = 0, i, s = 0;
+ #pragma omp parallel
+ #pragma omp for simd linear(k : 3) reduction(+: s) schedule (static, 16)
+ for (i = 0; i < 128; i++)
+ {
+ k = k + 3;
+ s = s + k;
+ }
+ if (s != 128 * 129 / 2 * 3) __builtin_abort ();
+ return 0;
+}
--- /dev/null
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+/* { dg-additional-options "-msse2" { target sse2_runtime } } */
+/* { dg-additional-options "-mavx" { target avx_runtime } } */
+
+int
+main ()
+{
+ int k = 0, i, s = 0;
+ #pragma omp parallel for simd linear(k : 3) reduction(+: s) schedule (static, 16)
+ for (i = 0; i < 128; i++)
+ {
+ k = k + 3;
+ s = s + k;
+ }
+ if (s != 128 * 129 / 2 * 3) __builtin_abort ();
+ return 0;
+}
--- /dev/null
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+/* { dg-additional-options "-msse2" { target sse2_runtime } } */
+/* { dg-additional-options "-mavx" { target avx_runtime } } */
+
+int
+main ()
+{
+ int i, j, b, c = 0;
+ i = 4; j = 4; b = 7;
+ #pragma omp simd linear(b:2) reduction(+:c)
+ for (i = 0; i < 64; i++)
+ {
+ c = c + (b != 7 + 2 * i);
+ b = b + 2;
+ }
+ if (c || i != 64 || b != 7 + 64 * 2)
+ __builtin_abort ();
+ i = 4; j = 4; b = 7;
+ #pragma omp simd linear(b:3) reduction(+:c)
+ for (i = 0; i < 64; i += 4)
+ {
+ c = c + (b != 7 + i / 4 * 3);
+ b = b + 3;
+ }
+ if (c || i != 64 || b != 7 + 16 * 3)
+ __builtin_abort ();
+ i = 4; j = 4; b = 7;
+ #pragma omp simd linear(i) linear(b:2) reduction(+:c)
+ for (i = 0; i < 64; i++)
+ {
+ c = c + (b != 7 + 2 * i);
+ b = b + 2;
+ }
+ if (c || i != 64 || b != 7 + 64 * 2)
+ __builtin_abort ();
+ i = 4; j = 4; b = 7;
+ #pragma omp simd linear(i:4) linear(b:3) reduction(+:c)
+ for (i = 0; i < 64; i += 4)
+ {
+ c = c + (b != 7 + i / 4 * 3);
+ b = b + 3;
+ }
+ if (c || i != 64 || b != 7 + 16 * 3)
+ __builtin_abort ();
+ i = 4; j = 4; b = 7;
+ #pragma omp simd collapse (2) linear(b:2) reduction(+:c)
+ for (i = 0; i < 8; i++)
+ for (j = 0; j < 8; j++)
+ {
+ c = c + (b != 7 + 2 * j + 2 * 8 * i);
+ b = b + 2;
+ }
+ if (c || i != 8 || j != 8 || b != 7 + 64 * 2)
+ __builtin_abort ();
+ i = 4; j = 4; b = 7;
+ #pragma omp simd collapse (2) lastprivate (i, j) linear(b:2) reduction(+:c)
+ for (i = 0; i < 8; i++)
+ for (j = 0; j < 8; j++)
+ {
+ c = c + (b != 7 + 2 * j + 2 * 8 * i);
+ b = b + 2;
+ }
+ if (c || i != 8 || j != 8 || b != 7 + 64 * 2)
+ __builtin_abort ();
+ i = 4; j = 4; b = 7;
+ #pragma omp parallel for simd schedule (static, 4) linear(b:2) reduction(+:c)
+ for (i = 0; i < 64; i++)
+ {
+ c = c + (b != 7 + 2 * i);
+ b = b + 2;
+ }
+ if (c || i != 64 || b != 7 + 64 * 2)
+ __builtin_abort ();
+ i = 4; j = 4; b = 7;
+ #pragma omp parallel for simd schedule (static, 4) linear(b:3) reduction(+:c)
+ for (i = 0; i < 64; i += 4)
+ {
+ c = c + (b != 7 + i / 4 * 3);
+ b = b + 3;
+ }
+ if (c || i != 64 || b != 7 + 16 * 3)
+ __builtin_abort ();
+ i = 4; j = 4; b = 7;
+ #pragma omp parallel for simd schedule (static, 4) linear(i) linear(b:2) reduction(+:c)
+ for (i = 0; i < 64; i++)
+ {
+ c = c + (b != 7 + 2 * i);
+ b = b + 2;
+ }
+ if (c || i != 64 || b != 7 + 64 * 2)
+ __builtin_abort ();
+ i = 4; j = 4; b = 7;
+ #pragma omp parallel for simd schedule (static, 4) linear(i:4) linear(b:3) reduction(+:c)
+ for (i = 0; i < 64; i += 4)
+ {
+ c = c + (b != 7 + i / 4 * 3);
+ b = b + 3;
+ }
+ if (c || i != 64 || b != 7 + 16 * 3)
+ __builtin_abort ();
+ i = 4; j = 4; b = 7;
+ #pragma omp parallel for simd lastprivate (i, j) collapse (2) schedule (static, 4) linear(b:2) reduction(+:c)
+ for (i = 0; i < 8; i++)
+ for (j = 0; j < 8; j++)
+ {
+ c = c + (b != 7 + 2 * j + 2 * 8 * i);
+ b = b + 2;
+ }
+ if (c || i != 8 || j != 8 || b != 7 + 64 * 2)
+ __builtin_abort ();
+ i = 4; j = 4; b = 7;
+ #pragma omp parallel for simd collapse (2) schedule (static, 4) linear(b:2) reduction(+:c)
+ for (i = 0; i < 8; i++)
+ for (j = 0; j < 8; j++)
+ {
+ c = c + (b != 7 + 2 * j + 2 * 8 * i);
+ b = b + 2;
+ }
+ if (c || i != 8 || j != 8 || b != 7 + 64 * 2)
+ __builtin_abort ();
+ return 0;
+}
--- /dev/null
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+/* { dg-additional-options "-msse2" { target sse2_runtime } } */
+/* { dg-additional-options "-mavx" { target avx_runtime } } */
+
+static inline void
+foo (int *b, int *i, int *j, int x)
+{
+ *b = *b + x + (*i - *i) + (*j - *j);
+}
+
+int
+main ()
+{
+ int i, j, b, c = 0;
+ i = 4; j = 4; b = 7;
+ #pragma omp simd linear(b:2) reduction(+:c)
+ for (i = 0; i < 64; i++)
+ {
+ c = c + (b != 7 + 2 * i);
+ foo (&b, &i, &j, 2);
+ }
+ if (c || i != 64 || b != 7 + 64 * 2)
+ __builtin_abort ();
+ i = 4; j = 4; b = 7;
+ #pragma omp simd linear(b:3) reduction(+:c)
+ for (i = 0; i < 64; i += 4)
+ {
+ c = c + (b != 7 + i / 4 * 3);
+ foo (&b, &i, &j, 3);
+ }
+ if (c || i != 64 || b != 7 + 16 * 3)
+ __builtin_abort ();
+ i = 4; j = 4; b = 7;
+ #pragma omp simd linear(i) linear(b:2) reduction(+:c)
+ for (i = 0; i < 64; i++)
+ {
+ c = c + (b != 7 + 2 * i);
+ foo (&b, &i, &j, 2);
+ }
+ if (c || i != 64 || b != 7 + 64 * 2)
+ __builtin_abort ();
+ i = 4; j = 4; b = 7;
+ #pragma omp simd linear(i:4) linear(b:3) reduction(+:c)
+ for (i = 0; i < 64; i += 4)
+ {
+ c = c + (b != 7 + i / 4 * 3);
+ foo (&b, &i, &j, 3);
+ }
+ if (c || i != 64 || b != 7 + 16 * 3)
+ __builtin_abort ();
+ i = 4; j = 4; b = 7;
+ #pragma omp simd collapse (2) linear(b:2) reduction(+:c)
+ for (i = 0; i < 8; i++)
+ for (j = 0; j < 8; j++)
+ {
+ c = c + (b != 7 + 2 * j + 2 * 8 * i);
+ foo (&b, &i, &j, 2);
+ }
+ if (c || i != 8 || j != 8 || b != 7 + 64 * 2)
+ __builtin_abort ();
+ i = 4; j = 4; b = 7;
+ #pragma omp simd collapse (2) lastprivate (i, j) linear(b:2) reduction(+:c)
+ for (i = 0; i < 8; i++)
+ for (j = 0; j < 8; j++)
+ {
+ c = c + (b != 7 + 2 * j + 2 * 8 * i);
+ foo (&b, &i, &j, 2);
+ }
+ if (c || i != 8 || j != 8 || b != 7 + 64 * 2)
+ __builtin_abort ();
+ i = 4; j = 4; b = 7;
+ #pragma omp parallel for simd schedule (static, 4) linear(b:2) reduction(+:c)
+ for (i = 0; i < 64; i++)
+ {
+ c = c + (b != 7 + 2 * i);
+ foo (&b, &i, &j, 2);
+ }
+ if (c || i != 64 || b != 7 + 64 * 2)
+ __builtin_abort ();
+ i = 4; j = 4; b = 7;
+ #pragma omp parallel for simd schedule (static, 4) linear(b:3) reduction(+:c)
+ for (i = 0; i < 64; i += 4)
+ {
+ c = c + (b != 7 + i / 4 * 3);
+ foo (&b, &i, &j, 3);
+ }
+ if (c || i != 64 || b != 7 + 16 * 3)
+ __builtin_abort ();
+ i = 4; j = 4; b = 7;
+ #pragma omp parallel for simd schedule (static, 4) linear(i) linear(b:2) reduction(+:c)
+ for (i = 0; i < 64; i++)
+ {
+ c = c + (b != 7 + 2 * i);
+ foo (&b, &i, &j, 2);
+ }
+ if (c || i != 64 || b != 7 + 64 * 2)
+ __builtin_abort ();
+ i = 4; j = 4; b = 7;
+ #pragma omp parallel for simd schedule (static, 4) linear(i:4) linear(b:3) reduction(+:c)
+ for (i = 0; i < 64; i += 4)
+ {
+ c = c + (b != 7 + i / 4 * 3);
+ foo (&b, &i, &j, 3);
+ }
+ if (c || i != 64 || b != 7 + 16 * 3)
+ __builtin_abort ();
+ i = 4; j = 4; b = 7;
+ #pragma omp parallel for simd lastprivate (i, j) collapse (2) schedule (static, 4) linear(b:2) reduction(+:c)
+ for (i = 0; i < 8; i++)
+ for (j = 0; j < 8; j++)
+ {
+ c = c + (b != 7 + 2 * j + 2 * 8 * i);
+ foo (&b, &i, &j, 2);
+ }
+ if (c || i != 8 || j != 8 || b != 7 + 64 * 2)
+ __builtin_abort ();
+ i = 4; j = 4; b = 7;
+ #pragma omp parallel for simd collapse (2) schedule (static, 4) linear(b:2) reduction(+:c)
+ for (i = 0; i < 8; i++)
+ for (j = 0; j < 8; j++)
+ {
+ c = c + (b != 7 + 2 * j + 2 * 8 * i);
+ foo (&b, &i, &j, 2);
+ }
+ if (c || i != 8 || j != 8 || b != 7 + 64 * 2)
+ __builtin_abort ();
+ return 0;
+}
--- /dev/null
+/* { dg-do run } */
+/* { dg-options "-O2 -std=c99" } */
+/* { dg-additional-options "-msse2" { target sse2_runtime } } */
+/* { dg-additional-options "-mavx" { target avx_runtime } } */
+
+int
+main ()
+{
+ int b, c = 0;
+ b = 7;
+ #pragma omp simd linear(b:2) reduction(+:c)
+ for (int i = 0; i < 64; i++)
+ {
+ c = c + (b != 7 + 2 * i);
+ b = b + 2;
+ }
+ if (c || b != 7 + 64 * 2)
+ __builtin_abort ();
+ b = 7;
+ #pragma omp simd linear(b:3) reduction(+:c)
+ for (int i = 0; i < 64; i += 4)
+ {
+ c = c + (b != 7 + i / 4 * 3);
+ b = b + 3;
+ }
+ if (c || b != 7 + 16 * 3)
+ __builtin_abort ();
+ b = 7;
+ #pragma omp simd collapse (2) linear(b:2) reduction(+:c)
+ for (int i = 0; i < 8; i++)
+ for (int j = 0; j < 8; j++)
+ {
+ c = c + (b != 7 + 2 * j + 2 * 8 * i);
+ b = b + 2;
+ }
+ if (c || b != 7 + 64 * 2)
+ __builtin_abort ();
+ b = 7;
+ #pragma omp parallel for simd schedule (static, 4) linear(b:2) reduction(+:c)
+ for (int i = 0; i < 64; i++)
+ {
+ c = c + (b != 7 + 2 * i);
+ b = b + 2;
+ }
+ if (c || b != 7 + 64 * 2)
+ __builtin_abort ();
+ b = 7;
+ #pragma omp parallel for simd schedule (static, 4) linear(b:3) reduction(+:c)
+ for (int i = 0; i < 64; i += 4)
+ {
+ c = c + (b != 7 + i / 4 * 3);
+ b = b + 3;
+ }
+ if (c || b != 7 + 16 * 3)
+ __builtin_abort ();
+ b = 7;
+ #pragma omp parallel for simd collapse (2) schedule (static, 4) linear(b:2) reduction(+:c)
+ for (int i = 0; i < 8; i++)
+ for (int j = 0; j < 8; j++)
+ {
+ c = c + (b != 7 + 2 * j + 2 * 8 * i);
+ b = b + 2;
+ }
+ if (c || b != 7 + 64 * 2)
+ __builtin_abort ();
+ return 0;
+}
--- /dev/null
+/* { dg-do run } */
+/* { dg-options "-O2 -std=c99" } */
+/* { dg-additional-options "-msse2" { target sse2_runtime } } */
+/* { dg-additional-options "-mavx" { target avx_runtime } } */
+
+static inline void
+foo (int *b, int *i, int *j, int x)
+{
+ *b = *b + x + (*i - *i) + (*j - *j);
+}
+
+int
+main ()
+{
+ int b, c = 0;
+ b = 7;
+ #pragma omp simd linear(b:2) reduction(+:c)
+ for (int i = 0; i < 64; i++)
+ {
+ c = c + (b != 7 + 2 * i);
+ foo (&b, &i, &i, 2);
+ }
+ if (c || b != 7 + 64 * 2)
+ __builtin_abort ();
+ b = 7;
+ #pragma omp simd linear(b:3) reduction(+:c)
+ for (int i = 0; i < 64; i += 4)
+ {
+ c = c + (b != 7 + i / 4 * 3);
+ foo (&b, &i, &i, 3);
+ }
+ if (c || b != 7 + 16 * 3)
+ __builtin_abort ();
+ b = 7;
+ #pragma omp simd collapse (2) linear(b:2) reduction(+:c)
+ for (int i = 0; i < 8; i++)
+ for (int j = 0; j < 8; j++)
+ {
+ c = c + (b != 7 + 2 * j + 2 * 8 * i);
+ foo (&b, &i, &j, 2);
+ }
+ if (c || b != 7 + 64 * 2)
+ __builtin_abort ();
+ b = 7;
+ #pragma omp parallel for simd schedule (static, 4) linear(b:2) reduction(+:c)
+ for (int i = 0; i < 64; i++)
+ {
+ c = c + (b != 7 + 2 * i);
+ foo (&b, &i, &i, 2);
+ }
+ if (c || b != 7 + 64 * 2)
+ __builtin_abort ();
+ b = 7;
+ #pragma omp parallel for simd schedule (static, 4) linear(b:3) reduction(+:c)
+ for (int i = 0; i < 64; i += 4)
+ {
+ c = c + (b != 7 + i / 4 * 3);
+ foo (&b, &i, &i, 3);
+ }
+ if (c || b != 7 + 16 * 3)
+ __builtin_abort ();
+ b = 7;
+ #pragma omp parallel for simd collapse (2) schedule (static, 4) linear(b:2) reduction(+:c)
+ for (int i = 0; i < 8; i++)
+ for (int j = 0; j < 8; j++)
+ {
+ c = c + (b != 7 + 2 * j + 2 * 8 * i);
+ foo (&b, &i, &j, 2);
+ }
+ if (c || b != 7 + 64 * 2)
+ __builtin_abort ();
+ return 0;
+}
--- /dev/null
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+/* { dg-additional-options "-msse2" { target sse2_runtime } } */
+/* { dg-additional-options "-mavx" { target avx_runtime } } */
+
+extern void abort ();
+int a[1024] __attribute__((aligned (32))) = { 1 };
+int b[1024] __attribute__((aligned (32))) = { 1 };
+int k, m;
+struct U { int u; };
+struct V { int v; };
+
+__attribute__((noinline, noclone)) int
+foo (int *p)
+{
+ int i, s = 0;
+ struct U u;
+ struct V v;
+ #pragma omp simd aligned(a, p : 32) linear(k: m + 1) \
+ linear(i) reduction(+:s) lastprivate(u, v)
+ for (i = 0; i < 1024; i++)
+ {
+ int *q = &i;
+ a[i] *= p[i];
+ u.u = p[i] + k;
+ k += m + 1;
+ v.v = p[i] + k;
+ s += p[i] + k;
+ }
+ if (u.u != 36 + 4 + 3 * 1023 || v.v != 36 + 4 + 3 * 1024 || i != 1024)
+ abort ();
+ return s;
+}
+
+__attribute__((noinline, noclone)) int
+bar (int *p)
+{
+ int i, s = 0;
+ struct U u;
+ struct V v;
+ #pragma omp simd aligned(a, p : 32) linear(k: m + 1) \
+ reduction(+:s) lastprivate(u, v)
+ for (i = 0; i < 1024; i++)
+ {
+ int *q = &i;
+ a[i] *= p[i];
+ u.u = p[i] + k;
+ k += m + 1;
+ v.v = p[i] + k;
+ s += p[i] + k;
+ }
+ if (u.u != 36 + 4 + 3 * 1023 || v.v != 36 + 4 + 3 * 1024 || i != 1024)
+ abort ();
+ return s;
+}
+
+int
+main ()
+{
+#if __SIZEOF_INT__ >= 4
+ int i;
+ k = 4;
+ m = 2;
+ for (i = 0; i < 1024; i++)
+ {
+ a[i] = i - 512;
+ b[i] = (i - 51) % 39;
+ }
+ int s = foo (b);
+ for (i = 0; i < 1024; i++)
+ {
+ if (b[i] != (i - 51) % 39
+ || a[i] != (i - 512) * b[i])
+ abort ();
+ }
+ if (k != 4 + 3 * 1024 || s != 1596127)
+ abort ();
+ k = 4;
+ m = 2;
+ for (i = 0; i < 1024; i++)
+ {
+ a[i] = i - 512;
+ b[i] = (i - 51) % 39;
+ }
+ s = bar (b);
+ for (i = 0; i < 1024; i++)
+ {
+ if (b[i] != (i - 51) % 39
+ || a[i] != (i - 512) * b[i])
+ abort ();
+ }
+ if (k != 4 + 3 * 1024 || s != 1596127)
+ abort ();
+#endif
+ return 0;
+}
--- /dev/null
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+/* { dg-additional-options "-msse2" { target sse2_runtime } } */
+/* { dg-additional-options "-mavx" { target avx_runtime } } */
+
+extern void abort ();
+int a[32][32] __attribute__((aligned (32))) = { { 1 } };
+struct S { int s; };
+#pragma omp declare reduction (+:struct S:omp_out.s += omp_in.s)
+#pragma omp declare reduction (foo:struct S:omp_out.s += omp_in.s)
+#pragma omp declare reduction (foo:int:omp_out += omp_in)
+
+__attribute__((noinline, noclone)) int
+foo (void)
+{
+ int i, j, u = 0;
+ struct S s, t;
+ s.s = 0; t.s = 0;
+ #pragma omp simd aligned(a : 32) reduction(+:s) reduction(foo:t, u) collapse(2)
+ for (i = 0; i < 32; i++)
+ for (j = 0; j < 32; j++)
+ {
+ int x = a[i][j];
+ s.s += x;
+ t.s += x;
+ u += x;
+ }
+ if (t.s != s.s || u != s.s)
+ abort ();
+ return s.s;
+}
+
+int
+main ()
+{
+ int i, j;
+ for (i = 0; i < 32; i++)
+ for (j = 0; j < 32; j++)
+ a[i][j] = j + (i / 4);
+ int s = foo ();
+ if (s != 19456)
+ abort ();
+ return 0;
+}
--- /dev/null
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+/* { dg-additional-options "-msse2" { target sse2_runtime } } */
+/* { dg-additional-options "-mavx" { target avx_runtime } } */
+
+extern void abort ();
+int a[32][32] __attribute__((aligned (32))) = { { 1 } };
+struct S { int s; };
+#pragma omp declare reduction (+:struct S:omp_out.s += omp_in.s)
+#pragma omp declare reduction (foo:struct S:omp_out.s += omp_in.s)
+#pragma omp declare reduction (foo:int:omp_out += omp_in)
+
+__attribute__((noinline, noclone)) int
+foo (void)
+{
+ int i, j, u = 0;
+ struct S s, t;
+ s.s = 0; t.s = 0;
+ #pragma omp simd aligned(a : 32) lastprivate (i, j) reduction(+:s) reduction(foo:t, u) collapse(2)
+ for (i = 0; i < 32; i++)
+ for (j = 0; j < 32; j++)
+ {
+ int *q = &i;
+ int *r = &j;
+ int x = a[i][j];
+ s.s += x;
+ t.s += x;
+ u += x;
+ }
+ if (t.s != s.s || u != s.s || i != 32 || j != 32)
+ abort ();
+ return s.s;
+}
+
+__attribute__((noinline, noclone)) int
+bar (void)
+{
+ int i, j, u = 0;
+ struct S s, t;
+ s.s = 0; t.s = 0;
+ #pragma omp simd aligned(a:32)reduction(+:s)reduction(foo:t,u)collapse(2)
+ for (i = 0; i < 32; i++)
+ for (j = 0; j < 32; j++)
+ {
+ int *q = &i;
+ int *r = &j;
+ int x = a[i][j];
+ s.s += x;
+ t.s += x;
+ u += x;
+ }
+ if (t.s != s.s || u != s.s || i != 32 || j != 32)
+ abort ();
+ return s.s;
+}
+
+int
+main ()
+{
+ int i, j;
+ for (i = 0; i < 32; i++)
+ for (j = 0; j < 32; j++)
+ a[i][j] = j + (i / 4);
+ int s = foo ();
+ if (s != 19456)
+ abort ();
+ if (bar () != 19456)
+ abort ();
+ return 0;
+}
--- /dev/null
+/* { dg-do run } */
+/* { dg-options "-fopenmp" } */
+
+void
+foo (int *p)
+{
+ int i;
+ #pragma omp parallel
+ #pragma omp single
+ #pragma omp target teams distribute parallel for map(p[0:24])
+ for (i = 0; i < 24; i++)
+ p[i] = p[i] + 1;
+}
+
+int
+main ()
+{
+ int p[24], i;
+ for (i = 0; i < 24; i++)
+ p[i] = i;
+ foo (p);
+ for (i = 0; i < 24; i++)
+ if (p[i] != i + 1)
+ __builtin_abort ();
+ return 0;
+}
--- /dev/null
+! { dg-do run }
+! { dg-options "-fopenmp -fcray-pointer" }
+
+ use iso_c_binding, only : c_ptr, c_ptrdiff_t, c_loc
+ interface
+ subroutine foo (x, y, z, w)
+ use iso_c_binding, only : c_ptr
+ real, pointer :: x(:), y(:), w(:)
+ type(c_ptr) :: z
+ end subroutine
+ subroutine bar (x, y, z, w)
+ use iso_c_binding, only : c_ptr
+ real, pointer :: x(:), y(:), w(:)
+ type(c_ptr) :: z
+ end subroutine
+ subroutine baz (x, c)
+ real, pointer :: x(:)
+ real, allocatable :: c(:)
+ end subroutine
+ end interface
+ type dt
+ real, allocatable :: a(:)
+ end type
+ type (dt) :: b(64)
+ real, target :: a(4096+63)
+ real, pointer :: p(:), q(:), r(:), s(:)
+ real, allocatable :: c(:)
+ integer(c_ptrdiff_t) :: o
+ integer :: i
+ o = 64 - mod (loc (a), 64)
+ if (o == 64) o = 0
+ o = o / sizeof(0.0)
+ p => a(o + 1:o + 1024)
+ q => a(o + 1025:o + 2048)
+ r => a(o + 2049:o + 3072)
+ s => a(o + 3073:o + 4096)
+ do i = 1, 1024
+ p(i) = i
+ q(i) = i
+ r(i) = i
+ s(i) = i
+ end do
+ call foo (p, q, c_loc (r(1)), s)
+ do i = 1, 1024
+ if (p(i) /= i * i + 3 * i + 2) call abort
+ p(i) = i
+ end do
+ call bar (p, q, c_loc (r(1)), s)
+ do i = 1, 1024
+ if (p(i) /= i * i + 3 * i + 2) call abort
+ end do
+ ! Attempt to create 64-byte aligned allocatable
+ do i = 1, 64
+ allocate (c(1023 + i))
+ if (iand (loc (c(1)), 63) == 0) exit
+ deallocate (c)
+ allocate (b(i)%a(1023 + i))
+ allocate (c(1023 + i))
+ if (iand (loc (c(1)), 63) == 0) exit
+ deallocate (c)
+ end do
+ if (allocated (c)) then
+ do i = 1, 1024
+ c(i) = 2 * i
+ end do
+ call baz (p, c)
+ do i = 1, 1024
+ if (p(i) /= i * i + 5 * i + 2) call abort
+ end do
+ end if
+end
+subroutine foo (x, y, z, w)
+ use iso_c_binding, only : c_ptr, c_f_pointer
+ real, pointer :: x(:), y(:), w(:), p(:)
+ type(c_ptr) :: z
+ integer :: i
+ real :: pt(1024)
+ pointer (ip, pt)
+ ip = loc (w)
+!$omp simd aligned (x, y : 64)
+ do i = 1, 1024
+ x(i) = x(i) * y(i) + 2.0
+ end do
+!$omp simd aligned (x, z : 64) private (p)
+ do i = 1, 1024
+ call c_f_pointer (z, p, shape=[1024])
+ x(i) = x(i) + p(i)
+ end do
+!$omp simd aligned (x, ip : 64)
+ do i = 1, 1024
+ x(i) = x(i) + 2 * pt(i)
+ end do
+!$omp end simd
+end subroutine
+subroutine bar (x, y, z, w)
+ use iso_c_binding, only : c_ptr, c_f_pointer
+ real, pointer :: x(:), y(:), w(:), a(:), b(:)
+ type(c_ptr) :: z, c
+ integer :: i
+ real :: pt(1024)
+ pointer (ip, pt)
+ ip = loc (w)
+ a => x
+ b => y
+ c = z
+!$omp simd aligned (a, b : 64)
+ do i = 1, 1024
+ a(i) = a(i) * b(i) + 2.0
+ end do
+!$omp simd aligned (a, c : 64)
+ do i = 1, 1024
+ block
+ real, pointer :: p(:)
+ call c_f_pointer (c, p, shape=[1024])
+ a(i) = a(i) + p(i)
+ end block
+ end do
+!$omp simd aligned (a, ip : 64)
+ do i = 1, 1024
+ a(i) = a(i) + 2 * pt(i)
+ end do
+!$omp end simd
+end subroutine
+subroutine baz (x, c)
+ real, pointer :: x(:)
+ real, allocatable :: c(:)
+ integer :: i
+!$omp simd aligned (x, c : 64)
+ do i = 1, 1024
+ x(i) = x(i) + c(i)
+ end do
+!$omp end simd
+end subroutine baz
--- /dev/null
+! { dg-do run }
+! Don't cycle by default through all options, just test -O0 and -O2,
+! as this is quite large test.
+! { dg-skip-if "" { ! run_expensive_tests } { "*" } { "-O0" "-O2" } }
+
+module m
+ type dl
+ integer :: a, b
+ integer, allocatable :: c(:,:)
+ integer :: d, e
+ integer, allocatable :: f
+ end type
+ type dt
+ integer :: g
+ type (dl), allocatable :: h(:)
+ integer :: i
+ type (dl) :: j(2, 2)
+ type (dl), allocatable :: k
+ end type
+contains
+ subroutine ver_dl (obj, val, c, cl1, cu1, cl2, cu2, f)
+ type (dl), intent (in) :: obj
+ integer, intent (in) :: val, cl1, cu1, cl2, cu2
+ logical, intent (in) :: c, f
+ if ((c .neqv. allocated (obj%c)) .or. (f .neqv. allocated (obj%f))) call abort
+ if (c) then
+ if (lbound (obj%c, 1) /= cl1 .or. ubound (obj%c, 1) /= cu1) call abort
+ if (lbound (obj%c, 2) /= cl2 .or. ubound (obj%c, 2) /= cu2) call abort
+ end if
+ if (val /= 0) then
+ if (obj%a /= val .or. obj%b /= val) call abort
+ if (obj%d /= val .or. obj%e /= val) call abort
+ if (c) then
+ if (any (obj%c /= val)) call abort
+ end if
+ if (f) then
+ if (obj%f /= val) call abort
+ end if
+ end if
+ end subroutine ver_dl
+ subroutine ver_dt (obj, val, h, hl, hu, k, c, cl1, cu1, cl2, cu2, f)
+ type (dt), intent (in) :: obj
+ integer, intent (in) :: val, hl, hu, cl1, cu1, cl2, cu2
+ logical, intent (in) :: h, k, c, f
+ integer :: i, j
+ if ((h .neqv. allocated (obj%h)) .or. (k .neqv. allocated (obj%k))) call abort
+ if (h) then
+ if (lbound (obj%h, 1) /= hl .or. ubound (obj%h, 1) /= hu) call abort
+ do i = hl, hu
+ call ver_dl (obj%h(i), val, c, cl1, cu1, cl2, cu2, f)
+ end do
+ end if
+ do i = 1, 2
+ do j = 1, 2
+ call ver_dl (obj%j(i, j), val, c, cl1, cu1, cl2, cu2, f)
+ end do
+ end do
+ if (k) call ver_dl (obj%k, val, c, cl1, cu1, cl2, cu2, f)
+ if (val /= 0) then
+ if (obj%g /= val .or. obj%i /= val) call abort
+ end if
+ end subroutine ver_dt
+ subroutine alloc_dl (obj, val, c, cl1, cu1, cl2, cu2, f)
+ type (dl), intent (inout) :: obj
+ integer, intent (in) :: val, cl1, cu1, cl2, cu2
+ logical, intent (in) :: c, f
+ if (val /= 0) then
+ obj%a = val
+ obj%b = val
+ obj%d = val
+ obj%e = val
+ end if
+ if (allocated (obj%c)) deallocate (obj%c)
+ if (c) then
+ allocate (obj%c(cl1:cu1, cl2:cu2))
+ if (val /= 0) obj%c = val
+ end if
+ if (f) then
+ if (.not.allocated (obj%f)) allocate (obj%f)
+ if (val /= 0) obj%f = val
+ else
+ if (allocated (obj%f)) deallocate (obj%f)
+ end if
+ end subroutine alloc_dl
+ subroutine alloc_dt (obj, val, h, hl, hu, k, c, cl1, cu1, cl2, cu2, f)
+ type (dt), intent (inout) :: obj
+ integer, intent (in) :: val, hl, hu, cl1, cu1, cl2, cu2
+ logical, intent (in) :: h, k, c, f
+ integer :: i, j
+ if (val /= 0) then
+ obj%g = val
+ obj%i = val
+ end if
+ if (allocated (obj%h)) deallocate (obj%h)
+ if (h) then
+ allocate (obj%h(hl:hu))
+ do i = hl, hu
+ call alloc_dl (obj%h(i), val, c, cl1, cu1, cl2, cu2, f)
+ end do
+ end if
+ do i = 1, 2
+ do j = 1, 2
+ call alloc_dl (obj%j(i, j), val, c, cl1, cu1, cl2, cu2, f)
+ end do
+ end do
+ if (k) then
+ if (.not.allocated (obj%k)) allocate (obj%k)
+ call alloc_dl (obj%k, val, c, cl1, cu1, cl2, cu2, f)
+ else
+ if (allocated (obj%k)) deallocate (obj%k)
+ end if
+ end subroutine alloc_dt
+end module m
+ use m
+ type (dt) :: y
+ call foo (y)
+contains
+ subroutine foo (y)
+ use m
+ type (dt) :: x, y, z(-3:-3,2:3)
+ logical, parameter :: F = .false.
+ logical, parameter :: T = .true.
+ logical :: l
+ call ver_dt (x, 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call ver_dt (y, 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call ver_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call ver_dt (z(-3,3), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+!$omp parallel private (x, y, z)
+ call ver_dt (x, 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (x, 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (x, 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (y, 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (y, 14, T, 3, 4, F, T, 1, 1, 2, 4, T)
+ call ver_dt (y, 14, T, 3, 4, F, T, 1, 1, 2, 4, T)
+ call ver_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (z(-3,3), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (z(-3,3), 14, T, 3, 4, F, T, 1, 1, 2, 4, T)
+ call ver_dt (z(-3,3), 14, T, 3, 4, F, T, 1, 1, 2, 4, T)
+!$omp end parallel
+ call ver_dt (x, 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (x, 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (y, 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (y, 14, T, 3, 4, F, T, 1, 1, 2, 4, T)
+ call ver_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (z(-3,3), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (z(-3,3), 14, T, 3, 4, F, T, 1, 1, 2, 4, T)
+!$omp parallel private (x, y, z)
+ call ver_dt (x, 0, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (y, 0, T, 3, 4, F, T, 1, 1, 2, 4, T)
+ deallocate (x%h, x%k)
+ deallocate (y%h)
+ allocate (y%k)
+ call ver_dt (z(-3,2), 0, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (z(-3,3), 0, T, 3, 4, F, T, 1, 1, 2, 4, T)
+ deallocate (z(-3,2)%h, z(-3,2)%k)
+ deallocate (z(-3,3)%h)
+ allocate (z(-3,3)%k)
+!$omp end parallel
+ call alloc_dt (x, 5, T, 1, 2, F, T, 2, 3, -2, -2, F)
+ call alloc_dt (y, 15, F, 0, 0, T, T, 2, 2, 2, 2, T)
+ call alloc_dt (z(-3,2), 5, T, 1, 2, F, T, 2, 3, -2, -2, F)
+ call alloc_dt (z(-3,3), 15, F, 0, 0, T, T, 2, 2, 2, 2, T)
+!$omp parallel firstprivate (x, y, z)
+ call ver_dt (x, 5, T, 1, 2, F, T, 2, 3, -2, -2, F)
+ call alloc_dt (x, 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (x, 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (y, 15, F, 0, 0, T, T, 2, 2, 2, 2, T)
+ call alloc_dt (y, 4, T, 3, 4, T, T, 1, 1, 2, 4, T)
+ call ver_dt (y, 4, T, 3, 4, T, T, 1, 1, 2, 4, T)
+ call ver_dt (z(-3,2), 5, T, 1, 2, F, T, 2, 3, -2, -2, F)
+ call alloc_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (z(-3,3), 15, F, 0, 0, T, T, 2, 2, 2, 2, T)
+ call alloc_dt (z(-3,3), 4, T, 3, 4, T, T, 1, 1, 2, 4, T)
+ call ver_dt (z(-3,3), 4, T, 3, 4, T, T, 1, 1, 2, 4, T)
+!$omp end parallel
+ call ver_dt (x, 5, T, 1, 2, F, T, 2, 3, -2, -2, F)
+ call alloc_dt (x, 4, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call ver_dt (y, 15, F, 0, 0, T, T, 2, 2, 2, 2, T)
+ call alloc_dt (y, 16, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call ver_dt (z(-3,2), 5, T, 1, 2, F, T, 2, 3, -2, -2, F)
+ call alloc_dt (z(-3,2), 4, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call ver_dt (z(-3,3), 15, F, 0, 0, T, T, 2, 2, 2, 2, T)
+ call alloc_dt (z(-3,3), 16, F, 0, 0, F, F, 0, 0, 0, 0, F)
+!$omp parallel firstprivate (x, y, z)
+ call ver_dt (x, 4, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (x, 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (x, 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (y, 16, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (y, 17, T, 1, 2, F, T, 2, 2, 3, 3, F)
+ call ver_dt (y, 17, T, 1, 2, F, T, 2, 2, 3, 3, F)
+ call ver_dt (z(-3,2), 4, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (z(-3,3), 16, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (z(-3,3), 17, T, 1, 2, F, T, 2, 2, 3, 3, F)
+ call ver_dt (z(-3,3), 17, T, 1, 2, F, T, 2, 2, 3, 3, F)
+!$omp end parallel
+ call ver_dt (x, 4, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call ver_dt (y, 16, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (y, 18, T, 0, 1, T, T, 0, 1, 0, 1, T)
+ call ver_dt (z(-3,2), 4, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call ver_dt (z(-3,3), 16, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (z(-3,3), 18, T, 0, 1, T, T, 0, 1, 0, 1, T)
+ l = F
+!$omp parallel sections lastprivate (x, y, z) firstprivate (l)
+!$omp section
+ if (l) then
+ call ver_dt (x, 9, T, 1, 1, F, F, 0, 0, 0, 0, T)
+ call ver_dt (y, 21, F, 0, 0, T, T, 1, 2, 3, 4, T)
+ call ver_dt (z(-3,2), 9, T, 1, 1, F, F, 0, 0, 0, 0, T)
+ call ver_dt (z(-3,3), 21, F, 0, 0, T, T, 1, 2, 3, 4, T)
+ else
+ call ver_dt (x, 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call ver_dt (y, 0, T, 0, 1, T, T, 0, 1, 0, 1, T)
+ call ver_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call ver_dt (z(-3,3), 0, T, 0, 1, T, T, 0, 1, 0, 1, T)
+ end if
+ l = T
+ call alloc_dt (x, 7, T, 1, 1, T, T, 1, 2, 3, 3, T)
+ call ver_dt (x, 7, T, 1, 1, T, T, 1, 2, 3, 3, T)
+ call alloc_dt (y, 20, T, 0, 0, F, T, 2, 2, 3, 4, F)
+ call ver_dt (y, 20, T, 0, 0, F, T, 2, 2, 3, 4, F)
+ call alloc_dt (z(-3,2), 7, T, 1, 1, T, T, 1, 2, 3, 3, T)
+ call ver_dt (z(-3,2), 7, T, 1, 1, T, T, 1, 2, 3, 3, T)
+ call alloc_dt (z(-3,3), 20, T, 0, 0, F, T, 2, 2, 3, 4, F)
+ call ver_dt (z(-3,3), 20, T, 0, 0, F, T, 2, 2, 3, 4, F)
+!$omp section
+ if (l) then
+ call ver_dt (x, 7, T, 1, 1, T, T, 1, 2, 3, 3, T)
+ call ver_dt (y, 20, T, 0, 0, F, T, 2, 2, 3, 4, F)
+ call ver_dt (z(-3,2), 7, T, 1, 1, T, T, 1, 2, 3, 3, T)
+ call ver_dt (z(-3,3), 20, T, 0, 0, F, T, 2, 2, 3, 4, F)
+ else
+ call ver_dt (x, 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call ver_dt (y, 0, T, 0, 1, T, T, 0, 1, 0, 1, T)
+ call ver_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call ver_dt (z(-3,3), 0, T, 0, 1, T, T, 0, 1, 0, 1, T)
+ end if
+ l = T
+ call alloc_dt (x, 9, T, 1, 1, F, F, 0, 0, 0, 0, T)
+ call ver_dt (x, 9, T, 1, 1, F, F, 0, 0, 0, 0, T)
+ call alloc_dt (y, 21, F, 0, 0, T, T, 1, 2, 3, 4, T)
+ call ver_dt (y, 21, F, 0, 0, T, T, 1, 2, 3, 4, T)
+ call alloc_dt (z(-3,2), 9, T, 1, 1, F, F, 0, 0, 0, 0, T)
+ call ver_dt (z(-3,2), 9, T, 1, 1, F, F, 0, 0, 0, 0, T)
+ call alloc_dt (z(-3,3), 21, F, 0, 0, T, T, 1, 2, 3, 4, T)
+ call ver_dt (z(-3,3), 21, F, 0, 0, T, T, 1, 2, 3, 4, T)
+!$omp section
+!$omp end parallel sections
+ call ver_dt (x, 9, T, 1, 1, F, F, 0, 0, 0, 0, T)
+ call ver_dt (y, 21, F, 0, 0, T, T, 1, 2, 3, 4, T)
+ call ver_dt (z(-3,2), 9, T, 1, 1, F, F, 0, 0, 0, 0, T)
+ call ver_dt (z(-3,3), 21, F, 0, 0, T, T, 1, 2, 3, 4, T)
+!$omp parallel sections lastprivate (x, y, z) firstprivate (l)
+!$omp section
+ if (l) then
+ call ver_dt (x, 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call ver_dt (y, 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
+ call ver_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call ver_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
+ else
+ call ver_dt (x, 0, T, 1, 1, F, F, 0, 0, 0, 0, T)
+ call ver_dt (y, 0, F, 0, 0, T, T, 1, 2, 3, 4, T)
+ call ver_dt (z(-3,2), 0, T, 1, 1, F, F, 0, 0, 0, 0, T)
+ call ver_dt (z(-3,3), 0, F, 0, 0, T, T, 1, 2, 3, 4, T)
+ end if
+ l = T
+ call alloc_dt (x, 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
+ call ver_dt (x, 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
+ call alloc_dt (y, 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
+ call ver_dt (y, 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
+ call alloc_dt (z(-3,2), 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
+ call ver_dt (z(-3,2), 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
+ call alloc_dt (z(-3,3), 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
+ call ver_dt (z(-3,3), 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
+!$omp section
+ if (l) then
+ call ver_dt (x, 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
+ call ver_dt (y, 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
+ call ver_dt (z(-3,2), 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
+ call ver_dt (z(-3,3), 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
+ else
+ call ver_dt (x, 0, T, 1, 1, F, F, 0, 0, 0, 0, T)
+ call ver_dt (y, 0, F, 0, 0, T, T, 1, 2, 3, 4, T)
+ call ver_dt (z(-3,2), 0, T, 1, 1, F, F, 0, 0, 0, 0, T)
+ call ver_dt (z(-3,3), 0, F, 0, 0, T, T, 1, 2, 3, 4, T)
+ end if
+ l = T
+ call alloc_dt (x, 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call ver_dt (x, 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call alloc_dt (y, 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
+ call ver_dt (y, 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
+ call alloc_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call ver_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call alloc_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
+ call ver_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
+!$omp section
+!$omp end parallel sections
+ call ver_dt (x, 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call ver_dt (y, 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
+ call ver_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call ver_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
+!$omp parallel private (x, y, z)
+ call ver_dt (x, 0, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call ver_dt (y, 0, T, 0, 1, T, T, 2, 2, 2, 2, F)
+ call ver_dt (z(-3,2), 0, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call ver_dt (z(-3,3), 0, T, 0, 1, T, T, 2, 2, 2, 2, F)
+!$omp single
+ call alloc_dt (x, 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
+ call alloc_dt (y, 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
+ call alloc_dt (z(-3,2), 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
+ call alloc_dt (z(-3,3), 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
+!$omp end single copyprivate (x, y, z)
+ call ver_dt (x, 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
+ call ver_dt (y, 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
+ call ver_dt (z(-3,2), 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
+ call ver_dt (z(-3,3), 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
+!$omp end parallel
+ call ver_dt (x, 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call ver_dt (y, 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
+ call ver_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call ver_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
+ end subroutine foo
+end
--- /dev/null
+! { dg-do run }
+! Don't cycle by default through all options, just test -O0 and -O2,
+! as this is quite large test.
+! { dg-skip-if "" { ! run_expensive_tests } { "*" } { "-O0" "-O2" } }
+
+module m
+ type dl
+ integer :: a, b
+ integer, allocatable :: c(:,:)
+ integer :: d, e
+ integer, allocatable :: f
+ end type
+ type dt
+ integer :: g
+ type (dl), allocatable :: h(:)
+ integer :: i
+ type (dl) :: j(2, 2)
+ type (dl), allocatable :: k
+ end type
+contains
+ subroutine ver_dl (obj, val, c, cl1, cu1, cl2, cu2, f)
+ type (dl), intent (in) :: obj
+ integer, intent (in) :: val, cl1, cu1, cl2, cu2
+ logical, intent (in) :: c, f
+ if ((c .neqv. allocated (obj%c)) .or. (f .neqv. allocated (obj%f))) call abort
+ if (c) then
+ if (lbound (obj%c, 1) /= cl1 .or. ubound (obj%c, 1) /= cu1) call abort
+ if (lbound (obj%c, 2) /= cl2 .or. ubound (obj%c, 2) /= cu2) call abort
+ end if
+ if (val /= 0) then
+ if (obj%a /= val .or. obj%b /= val) call abort
+ if (obj%d /= val .or. obj%e /= val) call abort
+ if (c) then
+ if (any (obj%c /= val)) call abort
+ end if
+ if (f) then
+ if (obj%f /= val) call abort
+ end if
+ end if
+ end subroutine ver_dl
+ subroutine ver_dt (obj, val, h, hl, hu, k, c, cl1, cu1, cl2, cu2, f)
+ type (dt), intent (in) :: obj
+ integer, intent (in) :: val, hl, hu, cl1, cu1, cl2, cu2
+ logical, intent (in) :: h, k, c, f
+ integer :: i, j
+ if ((h .neqv. allocated (obj%h)) .or. (k .neqv. allocated (obj%k))) call abort
+ if (h) then
+ if (lbound (obj%h, 1) /= hl .or. ubound (obj%h, 1) /= hu) call abort
+ do i = hl, hu
+ call ver_dl (obj%h(i), val, c, cl1, cu1, cl2, cu2, f)
+ end do
+ end if
+ do i = 1, 2
+ do j = 1, 2
+ call ver_dl (obj%j(i, j), val, c, cl1, cu1, cl2, cu2, f)
+ end do
+ end do
+ if (k) call ver_dl (obj%k, val, c, cl1, cu1, cl2, cu2, f)
+ if (val /= 0) then
+ if (obj%g /= val .or. obj%i /= val) call abort
+ end if
+ end subroutine ver_dt
+ subroutine alloc_dl (obj, val, c, cl1, cu1, cl2, cu2, f)
+ type (dl), intent (inout) :: obj
+ integer, intent (in) :: val, cl1, cu1, cl2, cu2
+ logical, intent (in) :: c, f
+ if (val /= 0) then
+ obj%a = val
+ obj%b = val
+ obj%d = val
+ obj%e = val
+ end if
+ if (allocated (obj%c)) deallocate (obj%c)
+ if (c) then
+ allocate (obj%c(cl1:cu1, cl2:cu2))
+ if (val /= 0) obj%c = val
+ end if
+ if (f) then
+ if (.not.allocated (obj%f)) allocate (obj%f)
+ if (val /= 0) obj%f = val
+ else
+ if (allocated (obj%f)) deallocate (obj%f)
+ end if
+ end subroutine alloc_dl
+ subroutine alloc_dt (obj, val, h, hl, hu, k, c, cl1, cu1, cl2, cu2, f)
+ type (dt), intent (inout) :: obj
+ integer, intent (in) :: val, hl, hu, cl1, cu1, cl2, cu2
+ logical, intent (in) :: h, k, c, f
+ integer :: i, j
+ if (val /= 0) then
+ obj%g = val
+ obj%i = val
+ end if
+ if (allocated (obj%h)) deallocate (obj%h)
+ if (h) then
+ allocate (obj%h(hl:hu))
+ do i = hl, hu
+ call alloc_dl (obj%h(i), val, c, cl1, cu1, cl2, cu2, f)
+ end do
+ end if
+ do i = 1, 2
+ do j = 1, 2
+ call alloc_dl (obj%j(i, j), val, c, cl1, cu1, cl2, cu2, f)
+ end do
+ end do
+ if (k) then
+ if (.not.allocated (obj%k)) allocate (obj%k)
+ call alloc_dl (obj%k, val, c, cl1, cu1, cl2, cu2, f)
+ else
+ if (allocated (obj%k)) deallocate (obj%k)
+ end if
+ end subroutine alloc_dt
+end module m
+ use m
+ type (dt), allocatable :: y
+ call foo (y)
+contains
+ subroutine foo (y)
+ use m
+ type (dt), allocatable :: x, y, z(:,:)
+ logical, parameter :: F = .false.
+ logical, parameter :: T = .true.
+ logical :: l
+!$omp parallel private (x, y, z)
+ if (allocated (x) .or. allocated (y) .or. allocated (z)) call abort
+!$omp end parallel
+!$omp parallel firstprivate (x, y, z)
+ if (allocated (x) .or. allocated (y) .or. allocated (z)) call abort
+!$omp end parallel
+ l = F
+!$omp parallel sections lastprivate (x, y, z) firstprivate (l)
+!$omp section
+ if (.not. l) then
+ if (allocated (x) .or. allocated (y) .or. allocated (z)) call abort
+ end if
+!$omp section
+ if (.not. l) then
+ if (allocated (x) .or. allocated (y) .or. allocated (z)) call abort
+ end if
+ allocate (x, y, z(-3:-3,2:3))
+ call alloc_dt (x, 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call ver_dt (x, 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call alloc_dt (y, 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
+ call ver_dt (y, 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
+ call alloc_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call ver_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call alloc_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
+ call ver_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
+!$omp section
+!$omp end parallel sections
+ if (.not.allocated (x) .or. .not.allocated (y)) call abort
+ if (.not.allocated (z)) call abort
+ if (lbound (z, 1) /= -3 .or. ubound (z, 1) /= -3) call abort
+ if (lbound (z, 2) /= 2 .or. ubound (z, 2) /= 3) call abort
+ call ver_dt (x, 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call ver_dt (y, 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
+ call ver_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call ver_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
+ call alloc_dt (x, 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call ver_dt (x, 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (y, 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call ver_dt (y, 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call ver_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (z(-3,3), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call ver_dt (z(-3,3), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+!$omp parallel private (x, y, z)
+ call ver_dt (x, 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (x, 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (x, 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (y, 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (y, 14, T, 3, 4, F, T, 1, 1, 2, 4, T)
+ call ver_dt (y, 14, T, 3, 4, F, T, 1, 1, 2, 4, T)
+ call ver_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (z(-3,3), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (z(-3,3), 14, T, 3, 4, F, T, 1, 1, 2, 4, T)
+ call ver_dt (z(-3,3), 14, T, 3, 4, F, T, 1, 1, 2, 4, T)
+!$omp end parallel
+ call ver_dt (x, 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (x, 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (y, 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (y, 14, T, 3, 4, F, T, 1, 1, 2, 4, T)
+ call ver_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (z(-3,3), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (z(-3,3), 14, T, 3, 4, F, T, 1, 1, 2, 4, T)
+!$omp parallel private (x, y, z)
+ call ver_dt (x, 0, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (y, 0, T, 3, 4, F, T, 1, 1, 2, 4, T)
+ deallocate (x%h, x%k)
+ deallocate (y%h)
+ allocate (y%k)
+ call ver_dt (z(-3,2), 0, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (z(-3,3), 0, T, 3, 4, F, T, 1, 1, 2, 4, T)
+ deallocate (z(-3,2)%h, z(-3,2)%k)
+ deallocate (z(-3,3)%h)
+ allocate (z(-3,3)%k)
+!$omp end parallel
+ call alloc_dt (x, 5, T, 1, 2, F, T, 2, 3, -2, -2, F)
+ call alloc_dt (y, 15, F, 0, 0, T, T, 2, 2, 2, 2, T)
+ call alloc_dt (z(-3,2), 5, T, 1, 2, F, T, 2, 3, -2, -2, F)
+ call alloc_dt (z(-3,3), 15, F, 0, 0, T, T, 2, 2, 2, 2, T)
+!$omp parallel firstprivate (x, y, z)
+ call ver_dt (x, 5, T, 1, 2, F, T, 2, 3, -2, -2, F)
+ call alloc_dt (x, 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (x, 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (y, 15, F, 0, 0, T, T, 2, 2, 2, 2, T)
+ call alloc_dt (y, 4, T, 3, 4, T, T, 1, 1, 2, 4, T)
+ call ver_dt (y, 4, T, 3, 4, T, T, 1, 1, 2, 4, T)
+ call ver_dt (z(-3,2), 5, T, 1, 2, F, T, 2, 3, -2, -2, F)
+ call alloc_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (z(-3,3), 15, F, 0, 0, T, T, 2, 2, 2, 2, T)
+ call alloc_dt (z(-3,3), 4, T, 3, 4, T, T, 1, 1, 2, 4, T)
+ call ver_dt (z(-3,3), 4, T, 3, 4, T, T, 1, 1, 2, 4, T)
+!$omp end parallel
+ call ver_dt (x, 5, T, 1, 2, F, T, 2, 3, -2, -2, F)
+ call alloc_dt (x, 4, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call ver_dt (y, 15, F, 0, 0, T, T, 2, 2, 2, 2, T)
+ call alloc_dt (y, 16, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call ver_dt (z(-3,2), 5, T, 1, 2, F, T, 2, 3, -2, -2, F)
+ call alloc_dt (z(-3,2), 4, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call ver_dt (z(-3,3), 15, F, 0, 0, T, T, 2, 2, 2, 2, T)
+ call alloc_dt (z(-3,3), 16, F, 0, 0, F, F, 0, 0, 0, 0, F)
+!$omp parallel firstprivate (x, y, z)
+ call ver_dt (x, 4, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (x, 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (x, 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (y, 16, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (y, 17, T, 1, 2, F, T, 2, 2, 3, 3, F)
+ call ver_dt (y, 17, T, 1, 2, F, T, 2, 2, 3, 3, F)
+ call ver_dt (z(-3,2), 4, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (z(-3,3), 16, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (z(-3,3), 17, T, 1, 2, F, T, 2, 2, 3, 3, F)
+ call ver_dt (z(-3,3), 17, T, 1, 2, F, T, 2, 2, 3, 3, F)
+!$omp end parallel
+ call ver_dt (x, 4, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call ver_dt (y, 16, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (y, 18, T, 0, 1, T, T, 0, 1, 0, 1, T)
+ call ver_dt (z(-3,2), 4, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call ver_dt (z(-3,3), 16, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (z(-3,3), 18, T, 0, 1, T, T, 0, 1, 0, 1, T)
+ l = F
+!$omp parallel sections lastprivate (x, y, z) firstprivate (l)
+!$omp section
+ if (l) then
+ call ver_dt (x, 9, T, 1, 1, F, F, 0, 0, 0, 0, T)
+ call ver_dt (y, 21, F, 0, 0, T, T, 1, 2, 3, 4, T)
+ call ver_dt (z(-3,2), 9, T, 1, 1, F, F, 0, 0, 0, 0, T)
+ call ver_dt (z(-3,3), 21, F, 0, 0, T, T, 1, 2, 3, 4, T)
+ else
+ call ver_dt (x, 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call ver_dt (y, 0, T, 0, 1, T, T, 0, 1, 0, 1, T)
+ call ver_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call ver_dt (z(-3,3), 0, T, 0, 1, T, T, 0, 1, 0, 1, T)
+ end if
+ l = T
+ call alloc_dt (x, 7, T, 1, 1, T, T, 1, 2, 3, 3, T)
+ call ver_dt (x, 7, T, 1, 1, T, T, 1, 2, 3, 3, T)
+ call alloc_dt (y, 20, T, 0, 0, F, T, 2, 2, 3, 4, F)
+ call ver_dt (y, 20, T, 0, 0, F, T, 2, 2, 3, 4, F)
+ call alloc_dt (z(-3,2), 7, T, 1, 1, T, T, 1, 2, 3, 3, T)
+ call ver_dt (z(-3,2), 7, T, 1, 1, T, T, 1, 2, 3, 3, T)
+ call alloc_dt (z(-3,3), 20, T, 0, 0, F, T, 2, 2, 3, 4, F)
+ call ver_dt (z(-3,3), 20, T, 0, 0, F, T, 2, 2, 3, 4, F)
+!$omp section
+ if (l) then
+ call ver_dt (x, 7, T, 1, 1, T, T, 1, 2, 3, 3, T)
+ call ver_dt (y, 20, T, 0, 0, F, T, 2, 2, 3, 4, F)
+ call ver_dt (z(-3,2), 7, T, 1, 1, T, T, 1, 2, 3, 3, T)
+ call ver_dt (z(-3,3), 20, T, 0, 0, F, T, 2, 2, 3, 4, F)
+ else
+ call ver_dt (x, 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call ver_dt (y, 0, T, 0, 1, T, T, 0, 1, 0, 1, T)
+ call ver_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call ver_dt (z(-3,3), 0, T, 0, 1, T, T, 0, 1, 0, 1, T)
+ end if
+ l = T
+ call alloc_dt (x, 9, T, 1, 1, F, F, 0, 0, 0, 0, T)
+ call ver_dt (x, 9, T, 1, 1, F, F, 0, 0, 0, 0, T)
+ call alloc_dt (y, 21, F, 0, 0, T, T, 1, 2, 3, 4, T)
+ call ver_dt (y, 21, F, 0, 0, T, T, 1, 2, 3, 4, T)
+ call alloc_dt (z(-3,2), 9, T, 1, 1, F, F, 0, 0, 0, 0, T)
+ call ver_dt (z(-3,2), 9, T, 1, 1, F, F, 0, 0, 0, 0, T)
+ call alloc_dt (z(-3,3), 21, F, 0, 0, T, T, 1, 2, 3, 4, T)
+ call ver_dt (z(-3,3), 21, F, 0, 0, T, T, 1, 2, 3, 4, T)
+!$omp section
+!$omp end parallel sections
+ call ver_dt (x, 9, T, 1, 1, F, F, 0, 0, 0, 0, T)
+ call ver_dt (y, 21, F, 0, 0, T, T, 1, 2, 3, 4, T)
+ call ver_dt (z(-3,2), 9, T, 1, 1, F, F, 0, 0, 0, 0, T)
+ call ver_dt (z(-3,3), 21, F, 0, 0, T, T, 1, 2, 3, 4, T)
+!$omp parallel sections lastprivate (x, y, z) firstprivate (l)
+!$omp section
+ if (l) then
+ call ver_dt (x, 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call ver_dt (y, 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
+ call ver_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call ver_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
+ else
+ call ver_dt (x, 0, T, 1, 1, F, F, 0, 0, 0, 0, T)
+ call ver_dt (y, 0, F, 0, 0, T, T, 1, 2, 3, 4, T)
+ call ver_dt (z(-3,2), 0, T, 1, 1, F, F, 0, 0, 0, 0, T)
+ call ver_dt (z(-3,3), 0, F, 0, 0, T, T, 1, 2, 3, 4, T)
+ end if
+ l = T
+ call alloc_dt (x, 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
+ call ver_dt (x, 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
+ call alloc_dt (y, 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
+ call ver_dt (y, 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
+ call alloc_dt (z(-3,2), 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
+ call ver_dt (z(-3,2), 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
+ call alloc_dt (z(-3,3), 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
+ call ver_dt (z(-3,3), 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
+!$omp section
+ if (l) then
+ call ver_dt (x, 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
+ call ver_dt (y, 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
+ call ver_dt (z(-3,2), 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
+ call ver_dt (z(-3,3), 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
+ else
+ call ver_dt (x, 0, T, 1, 1, F, F, 0, 0, 0, 0, T)
+ call ver_dt (y, 0, F, 0, 0, T, T, 1, 2, 3, 4, T)
+ call ver_dt (z(-3,2), 0, T, 1, 1, F, F, 0, 0, 0, 0, T)
+ call ver_dt (z(-3,3), 0, F, 0, 0, T, T, 1, 2, 3, 4, T)
+ end if
+ l = T
+ call alloc_dt (x, 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call ver_dt (x, 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call alloc_dt (y, 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
+ call ver_dt (y, 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
+ call alloc_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call ver_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call alloc_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
+ call ver_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
+!$omp section
+!$omp end parallel sections
+ call ver_dt (x, 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call ver_dt (y, 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
+ call ver_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call ver_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
+!$omp parallel private (x, y, z)
+ call ver_dt (x, 0, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call ver_dt (y, 0, T, 0, 1, T, T, 2, 2, 2, 2, F)
+ call ver_dt (z(-3,2), 0, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call ver_dt (z(-3,3), 0, T, 0, 1, T, T, 2, 2, 2, 2, F)
+!$omp single
+ call alloc_dt (x, 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
+ call alloc_dt (y, 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
+ call alloc_dt (z(-3,2), 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
+ call alloc_dt (z(-3,3), 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
+!$omp end single copyprivate (x, y, z)
+ call ver_dt (x, 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
+ call ver_dt (y, 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
+ call ver_dt (z(-3,2), 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
+ call ver_dt (z(-3,3), 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
+!$omp end parallel
+ call ver_dt (x, 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call ver_dt (y, 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
+ call ver_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call ver_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
+ end subroutine foo
+end
--- /dev/null
+! { dg-do run }
+! Don't cycle by default through all options, just test -O0 and -O2,
+! as this is quite large test.
+! { dg-skip-if "" { ! run_expensive_tests } { "*" } { "-O0" "-O2" } }
+
+module m
+ type dl
+ integer :: a, b
+ integer, allocatable :: c(:,:)
+ integer :: d, e
+ integer, allocatable :: f
+ end type
+ type dt
+ integer :: g
+ type (dl), allocatable :: h(:)
+ integer :: i
+ type (dl) :: j(2, 2)
+ type (dl), allocatable :: k
+ end type
+contains
+ subroutine ver_dl (obj, val, c, cl1, cu1, cl2, cu2, f)
+ type (dl), intent (in) :: obj
+ integer, intent (in) :: val, cl1, cu1, cl2, cu2
+ logical, intent (in) :: c, f
+ if ((c .neqv. allocated (obj%c)) .or. (f .neqv. allocated (obj%f))) call abort
+ if (c) then
+ if (lbound (obj%c, 1) /= cl1 .or. ubound (obj%c, 1) /= cu1) call abort
+ if (lbound (obj%c, 2) /= cl2 .or. ubound (obj%c, 2) /= cu2) call abort
+ end if
+ if (val /= 0) then
+ if (obj%a /= val .or. obj%b /= val) call abort
+ if (obj%d /= val .or. obj%e /= val) call abort
+ if (c) then
+ if (any (obj%c /= val)) call abort
+ end if
+ if (f) then
+ if (obj%f /= val) call abort
+ end if
+ end if
+ end subroutine ver_dl
+ subroutine ver_dt (obj, val, h, hl, hu, k, c, cl1, cu1, cl2, cu2, f)
+ type (dt), intent (in) :: obj
+ integer, intent (in) :: val, hl, hu, cl1, cu1, cl2, cu2
+ logical, intent (in) :: h, k, c, f
+ integer :: i, j
+ if ((h .neqv. allocated (obj%h)) .or. (k .neqv. allocated (obj%k))) call abort
+ if (h) then
+ if (lbound (obj%h, 1) /= hl .or. ubound (obj%h, 1) /= hu) call abort
+ do i = hl, hu
+ call ver_dl (obj%h(i), val, c, cl1, cu1, cl2, cu2, f)
+ end do
+ end if
+ do i = 1, 2
+ do j = 1, 2
+ call ver_dl (obj%j(i, j), val, c, cl1, cu1, cl2, cu2, f)
+ end do
+ end do
+ if (k) call ver_dl (obj%k, val, c, cl1, cu1, cl2, cu2, f)
+ if (val /= 0) then
+ if (obj%g /= val .or. obj%i /= val) call abort
+ end if
+ end subroutine ver_dt
+ subroutine alloc_dl (obj, val, c, cl1, cu1, cl2, cu2, f)
+ type (dl), intent (inout) :: obj
+ integer, intent (in) :: val, cl1, cu1, cl2, cu2
+ logical, intent (in) :: c, f
+ if (val /= 0) then
+ obj%a = val
+ obj%b = val
+ obj%d = val
+ obj%e = val
+ end if
+ if (allocated (obj%c)) deallocate (obj%c)
+ if (c) then
+ allocate (obj%c(cl1:cu1, cl2:cu2))
+ if (val /= 0) obj%c = val
+ end if
+ if (f) then
+ if (.not.allocated (obj%f)) allocate (obj%f)
+ if (val /= 0) obj%f = val
+ else
+ if (allocated (obj%f)) deallocate (obj%f)
+ end if
+ end subroutine alloc_dl
+ subroutine alloc_dt (obj, val, h, hl, hu, k, c, cl1, cu1, cl2, cu2, f)
+ type (dt), intent (inout) :: obj
+ integer, intent (in) :: val, hl, hu, cl1, cu1, cl2, cu2
+ logical, intent (in) :: h, k, c, f
+ integer :: i, j
+ if (val /= 0) then
+ obj%g = val
+ obj%i = val
+ end if
+ if (allocated (obj%h)) deallocate (obj%h)
+ if (h) then
+ allocate (obj%h(hl:hu))
+ do i = hl, hu
+ call alloc_dl (obj%h(i), val, c, cl1, cu1, cl2, cu2, f)
+ end do
+ end if
+ do i = 1, 2
+ do j = 1, 2
+ call alloc_dl (obj%j(i, j), val, c, cl1, cu1, cl2, cu2, f)
+ end do
+ end do
+ if (k) then
+ if (.not.allocated (obj%k)) allocate (obj%k)
+ call alloc_dl (obj%k, val, c, cl1, cu1, cl2, cu2, f)
+ else
+ if (allocated (obj%k)) deallocate (obj%k)
+ end if
+ end subroutine alloc_dt
+end module m
+ use m
+ type (dt), allocatable :: z(:,:)
+ type (dt) :: y(2:3)
+ call foo (y, z, 4)
+contains
+ subroutine foo (y, z, n)
+ use m
+ integer :: n
+ type (dt) :: x(2:n), y(3:)
+ type (dt), allocatable :: z(:,:)
+ logical, parameter :: F = .false.
+ logical, parameter :: T = .true.
+ logical :: l
+ if (lbound (x, 1) /= 2 .or. ubound (x, 1) /= 4) call abort
+ if (lbound (y, 1) /= 3 .or. ubound (y, 1) /= 4) call abort
+ call ver_dt (x(2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call ver_dt (x(n), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call ver_dt (y(3), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call ver_dt (y(4), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+!$omp parallel private (z)
+ if (allocated (z)) call abort
+!$omp end parallel
+!$omp parallel firstprivate (z)
+ if (allocated (z)) call abort
+!$omp end parallel
+ l = F
+!$omp parallel sections lastprivate (z) firstprivate (l)
+!$omp section
+ if (.not. l) then
+ if (allocated (z)) call abort
+ end if
+!$omp section
+ if (.not. l) then
+ if (allocated (z)) call abort
+ end if
+ allocate (z(-3:-3,2:3))
+ call alloc_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call ver_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call alloc_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
+ call ver_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
+!$omp section
+!$omp end parallel sections
+ if (.not.allocated (z)) call abort
+ if (lbound (z, 1) /= -3 .or. ubound (z, 1) /= -3) call abort
+ if (lbound (z, 2) /= 2 .or. ubound (z, 2) /= 3) call abort
+ call ver_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call ver_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
+ call ver_dt (x(n - 1), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call ver_dt (y(4), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call ver_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (z(-3,3), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call ver_dt (z(-3,3), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+!$omp parallel private (x, y, z)
+ call ver_dt (x(n - 1), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (x(n - 1), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (x(n - 1), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (y(4), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (y(4), 14, T, 3, 4, F, T, 1, 1, 2, 4, T)
+ call ver_dt (y(4), 14, T, 3, 4, F, T, 1, 1, 2, 4, T)
+ call ver_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (z(-3,3), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (z(-3,3), 14, T, 3, 4, F, T, 1, 1, 2, 4, T)
+ call ver_dt (z(-3,3), 14, T, 3, 4, F, T, 1, 1, 2, 4, T)
+!$omp end parallel
+ call ver_dt (x(n - 1), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (x(n - 1), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (y(4), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (y(4), 14, T, 3, 4, F, T, 1, 1, 2, 4, T)
+ call ver_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (z(-3,3), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (z(-3,3), 14, T, 3, 4, F, T, 1, 1, 2, 4, T)
+!$omp parallel private (x, y, z)
+ call ver_dt (x(n - 1), 0, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (y(4), 0, T, 3, 4, F, T, 1, 1, 2, 4, T)
+ deallocate (x(n - 1)%h, x(n - 1)%k)
+ deallocate (y(4)%h)
+ allocate (y(4)%k)
+ call ver_dt (z(-3,2), 0, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (z(-3,3), 0, T, 3, 4, F, T, 1, 1, 2, 4, T)
+ deallocate (z(-3,2)%h, z(-3,2)%k)
+ deallocate (z(-3,3)%h)
+ allocate (z(-3,3)%k)
+!$omp end parallel
+ call alloc_dt (x(n - 1), 5, T, 1, 2, F, T, 2, 3, -2, -2, F)
+ call alloc_dt (y(4), 15, F, 0, 0, T, T, 2, 2, 2, 2, T)
+ call alloc_dt (z(-3,2), 5, T, 1, 2, F, T, 2, 3, -2, -2, F)
+ call alloc_dt (z(-3,3), 15, F, 0, 0, T, T, 2, 2, 2, 2, T)
+!$omp parallel firstprivate (x, y, z)
+ if (lbound (x, 1) /= 2 .or. ubound (x, 1) /= 4) call abort
+ if (lbound (y, 1) /= 3 .or. ubound (y, 1) /= 4) call abort
+ call ver_dt (x(n - 1), 5, T, 1, 2, F, T, 2, 3, -2, -2, F)
+ call alloc_dt (x(n - 1), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (x(n - 1), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (y(4), 15, F, 0, 0, T, T, 2, 2, 2, 2, T)
+ call alloc_dt (y(4), 4, T, 3, 4, T, T, 1, 1, 2, 4, T)
+ call ver_dt (y(4), 4, T, 3, 4, T, T, 1, 1, 2, 4, T)
+ call ver_dt (z(-3,2), 5, T, 1, 2, F, T, 2, 3, -2, -2, F)
+ call alloc_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (z(-3,3), 15, F, 0, 0, T, T, 2, 2, 2, 2, T)
+ call alloc_dt (z(-3,3), 4, T, 3, 4, T, T, 1, 1, 2, 4, T)
+ call ver_dt (z(-3,3), 4, T, 3, 4, T, T, 1, 1, 2, 4, T)
+!$omp end parallel
+ call ver_dt (x(n - 1), 5, T, 1, 2, F, T, 2, 3, -2, -2, F)
+ call alloc_dt (x(n - 1), 4, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call ver_dt (y(4), 15, F, 0, 0, T, T, 2, 2, 2, 2, T)
+ call alloc_dt (y(4), 16, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call ver_dt (z(-3,2), 5, T, 1, 2, F, T, 2, 3, -2, -2, F)
+ call alloc_dt (z(-3,2), 4, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call ver_dt (z(-3,3), 15, F, 0, 0, T, T, 2, 2, 2, 2, T)
+ call alloc_dt (z(-3,3), 16, F, 0, 0, F, F, 0, 0, 0, 0, F)
+!$omp parallel firstprivate (x, y, z)
+ call ver_dt (x(n - 1), 4, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (x(n - 1), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (x(n - 1), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (y(4), 16, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (y(4), 17, T, 1, 2, F, T, 2, 2, 3, 3, F)
+ call ver_dt (y(4), 17, T, 1, 2, F, T, 2, 2, 3, 3, F)
+ call ver_dt (z(-3,2), 4, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
+ call ver_dt (z(-3,3), 16, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (z(-3,3), 17, T, 1, 2, F, T, 2, 2, 3, 3, F)
+ call ver_dt (z(-3,3), 17, T, 1, 2, F, T, 2, 2, 3, 3, F)
+!$omp end parallel
+ call ver_dt (x(n - 1), 4, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call ver_dt (y(4), 16, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (y(4), 18, T, 0, 1, T, T, 0, 1, 0, 1, T)
+ call ver_dt (z(-3,2), 4, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call ver_dt (z(-3,3), 16, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call alloc_dt (z(-3,3), 18, T, 0, 1, T, T, 0, 1, 0, 1, T)
+ l = F
+!$omp parallel sections lastprivate (x, y, z) firstprivate (l)
+!$omp section
+ if (l) then
+ call ver_dt (x(n - 1), 9, T, 1, 1, F, F, 0, 0, 0, 0, T)
+ call ver_dt (y(4), 21, F, 0, 0, T, T, 1, 2, 3, 4, T)
+ call ver_dt (z(-3,2), 9, T, 1, 1, F, F, 0, 0, 0, 0, T)
+ call ver_dt (z(-3,3), 21, F, 0, 0, T, T, 1, 2, 3, 4, T)
+ else
+ call ver_dt (x(n - 1), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call ver_dt (y(4), 0, T, 0, 1, T, T, 0, 1, 0, 1, T)
+ call ver_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call ver_dt (z(-3,3), 0, T, 0, 1, T, T, 0, 1, 0, 1, T)
+ end if
+ l = T
+ call alloc_dt (x(n - 1), 7, T, 1, 1, T, T, 1, 2, 3, 3, T)
+ call ver_dt (x(n - 1), 7, T, 1, 1, T, T, 1, 2, 3, 3, T)
+ call alloc_dt (y(4), 20, T, 0, 0, F, T, 2, 2, 3, 4, F)
+ call ver_dt (y(4), 20, T, 0, 0, F, T, 2, 2, 3, 4, F)
+ call alloc_dt (z(-3,2), 7, T, 1, 1, T, T, 1, 2, 3, 3, T)
+ call ver_dt (z(-3,2), 7, T, 1, 1, T, T, 1, 2, 3, 3, T)
+ call alloc_dt (z(-3,3), 20, T, 0, 0, F, T, 2, 2, 3, 4, F)
+ call ver_dt (z(-3,3), 20, T, 0, 0, F, T, 2, 2, 3, 4, F)
+!$omp section
+ if (l) then
+ call ver_dt (x(n - 1), 7, T, 1, 1, T, T, 1, 2, 3, 3, T)
+ call ver_dt (y(4), 20, T, 0, 0, F, T, 2, 2, 3, 4, F)
+ call ver_dt (z(-3,2), 7, T, 1, 1, T, T, 1, 2, 3, 3, T)
+ call ver_dt (z(-3,3), 20, T, 0, 0, F, T, 2, 2, 3, 4, F)
+ else
+ call ver_dt (x(n - 1), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call ver_dt (y(4), 0, T, 0, 1, T, T, 0, 1, 0, 1, T)
+ call ver_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call ver_dt (z(-3,3), 0, T, 0, 1, T, T, 0, 1, 0, 1, T)
+ end if
+ l = T
+ call alloc_dt (x(n - 1), 9, T, 1, 1, F, F, 0, 0, 0, 0, T)
+ call ver_dt (x(n - 1), 9, T, 1, 1, F, F, 0, 0, 0, 0, T)
+ call alloc_dt (y(4), 21, F, 0, 0, T, T, 1, 2, 3, 4, T)
+ call ver_dt (y(4), 21, F, 0, 0, T, T, 1, 2, 3, 4, T)
+ call alloc_dt (z(-3,2), 9, T, 1, 1, F, F, 0, 0, 0, 0, T)
+ call ver_dt (z(-3,2), 9, T, 1, 1, F, F, 0, 0, 0, 0, T)
+ call alloc_dt (z(-3,3), 21, F, 0, 0, T, T, 1, 2, 3, 4, T)
+ call ver_dt (z(-3,3), 21, F, 0, 0, T, T, 1, 2, 3, 4, T)
+!$omp section
+!$omp end parallel sections
+ call ver_dt (x(n - 1), 9, T, 1, 1, F, F, 0, 0, 0, 0, T)
+ call ver_dt (y(4), 21, F, 0, 0, T, T, 1, 2, 3, 4, T)
+ call ver_dt (z(-3,2), 9, T, 1, 1, F, F, 0, 0, 0, 0, T)
+ call ver_dt (z(-3,3), 21, F, 0, 0, T, T, 1, 2, 3, 4, T)
+!$omp parallel sections lastprivate (x, y, z) firstprivate (l)
+!$omp section
+ if (l) then
+ call ver_dt (x(n - 1), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call ver_dt (y(4), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
+ call ver_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call ver_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
+ else
+ call ver_dt (x(n - 1), 0, T, 1, 1, F, F, 0, 0, 0, 0, T)
+ call ver_dt (y(4), 0, F, 0, 0, T, T, 1, 2, 3, 4, T)
+ call ver_dt (z(-3,2), 0, T, 1, 1, F, F, 0, 0, 0, 0, T)
+ call ver_dt (z(-3,3), 0, F, 0, 0, T, T, 1, 2, 3, 4, T)
+ end if
+ l = T
+ call alloc_dt (x(n - 1), 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
+ call ver_dt (x(n - 1), 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
+ call alloc_dt (y(4), 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
+ call ver_dt (y(4), 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
+ call alloc_dt (z(-3,2), 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
+ call ver_dt (z(-3,2), 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
+ call alloc_dt (z(-3,3), 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
+ call ver_dt (z(-3,3), 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
+!$omp section
+ if (l) then
+ call ver_dt (x(n - 1), 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
+ call ver_dt (y(4), 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
+ call ver_dt (z(-3,2), 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
+ call ver_dt (z(-3,3), 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
+ else
+ call ver_dt (x(n - 1), 0, T, 1, 1, F, F, 0, 0, 0, 0, T)
+ call ver_dt (y(4), 0, F, 0, 0, T, T, 1, 2, 3, 4, T)
+ call ver_dt (z(-3,2), 0, T, 1, 1, F, F, 0, 0, 0, 0, T)
+ call ver_dt (z(-3,3), 0, F, 0, 0, T, T, 1, 2, 3, 4, T)
+ end if
+ l = T
+ call alloc_dt (x(n - 1), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call ver_dt (x(n - 1), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call alloc_dt (y(4), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
+ call ver_dt (y(4), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
+ call alloc_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call ver_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call alloc_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
+ call ver_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
+!$omp section
+!$omp end parallel sections
+ call ver_dt (x(n - 1), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call ver_dt (y(4), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
+ call ver_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call ver_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
+!$omp parallel private (x, y, z)
+ call ver_dt (x(n - 1), 0, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call ver_dt (y(4), 0, T, 0, 1, T, T, 2, 2, 2, 2, F)
+ call ver_dt (z(-3,2), 0, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call ver_dt (z(-3,3), 0, T, 0, 1, T, T, 2, 2, 2, 2, F)
+!$omp single
+ call alloc_dt (x(n - 1), 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
+ call alloc_dt (y(4), 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
+ call alloc_dt (z(-3,2), 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
+ call alloc_dt (z(-3,3), 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
+!$omp end single copyprivate (x, y, z)
+ call ver_dt (x(n - 1), 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
+ call ver_dt (y(4), 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
+ call ver_dt (z(-3,2), 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
+ call ver_dt (z(-3,3), 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
+!$omp end parallel
+ call ver_dt (x(n - 1), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call ver_dt (y(4), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
+ call ver_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
+ call ver_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
+ call ver_dt (x(2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call ver_dt (x(n), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ call ver_dt (y(3), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
+ end subroutine foo
+end
--- /dev/null
+! { dg-do run }
+
+ integer, allocatable :: a, b(:), c(:,:)
+ integer :: i
+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) &
+!$omp & initializer (omp_priv = 0)
+ if (allocated (a) .or. allocated (b) .or. allocated (c)) call abort
+ allocate (a, b(6:9), c(3, 8:9))
+ a = 0
+ b = 0
+ c = 0
+ if (.not.allocated (a)) call abort
+ if (.not.allocated (b) .or. size (b) /= 4) call abort
+ if (lbound (b, 1) /= 6 .or. ubound (b, 1) /= 9) call abort
+ if (.not.allocated (c) .or. size (c) /= 6) call abort
+ if (size (c, 1) /= 3 .or. size (c, 2) /= 2) call abort
+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 3) call abort
+ if (lbound (c, 2) /= 8 .or. ubound (c, 2) /= 9) call abort
+!$omp parallel do reduction (+:a, b, c)
+ do i = 1, 10
+ if (.not.allocated (a)) call abort
+ if (.not.allocated (b) .or. size (b) /= 4) call abort
+ if (lbound (b, 1) /= 6 .or. ubound (b, 1) /= 9) call abort
+ if (.not.allocated (c) .or. size (c) /= 6) call abort
+ if (size (c, 1) /= 3 .or. size (c, 2) /= 2) call abort
+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 3) call abort
+ if (lbound (c, 2) /= 8 .or. ubound (c, 2) /= 9) call abort
+ a = a + i
+ b = b + 2 * i
+ c = c + 3 * i
+ end do
+ if (.not.allocated (a)) call abort
+ if (.not.allocated (b) .or. size (b) /= 4) call abort
+ if (lbound (b, 1) /= 6 .or. ubound (b, 1) /= 9) call abort
+ if (.not.allocated (c) .or. size (c) /= 6) call abort
+ if (size (c, 1) /= 3 .or. size (c, 2) /= 2) call abort
+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 3) call abort
+ if (lbound (c, 2) /= 8 .or. ubound (c, 2) /= 9) call abort
+ if (a /= 55 .or. any (b /= 110) .or. any (c /= 165)) call abort
+ a = 0
+ b = 0
+ c = 0
+!$omp parallel do reduction (foo : a, b, c)
+ do i = 1, 10
+ if (.not.allocated (a)) call abort
+ if (.not.allocated (b) .or. size (b) /= 4) call abort
+ if (lbound (b, 1) /= 6 .or. ubound (b, 1) /= 9) call abort
+ if (.not.allocated (c) .or. size (c) /= 6) call abort
+ if (size (c, 1) /= 3 .or. size (c, 2) /= 2) call abort
+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 3) call abort
+ if (lbound (c, 2) /= 8 .or. ubound (c, 2) /= 9) call abort
+ a = a + i
+ b = b + 2 * i
+ c = c + 3 * i
+ end do
+ if (.not.allocated (a)) call abort
+ if (.not.allocated (b) .or. size (b) /= 4) call abort
+ if (lbound (b, 1) /= 6 .or. ubound (b, 1) /= 9) call abort
+ if (.not.allocated (c) .or. size (c) /= 6) call abort
+ if (size (c, 1) /= 3 .or. size (c, 2) /= 2) call abort
+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 3) call abort
+ if (lbound (c, 2) /= 8 .or. ubound (c, 2) /= 9) call abort
+ if (a /= 55 .or. any (b /= 110) .or. any (c /= 165)) call abort
+ a = 0
+ b = 0
+ c = 0
+!$omp simd reduction (+:a, b, c)
+ do i = 1, 10
+ if (.not.allocated (a)) call abort
+ if (.not.allocated (b) .or. size (b) /= 4) call abort
+ if (lbound (b, 1) /= 6 .or. ubound (b, 1) /= 9) call abort
+ if (.not.allocated (c) .or. size (c) /= 6) call abort
+ if (size (c, 1) /= 3 .or. size (c, 2) /= 2) call abort
+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 3) call abort
+ if (lbound (c, 2) /= 8 .or. ubound (c, 2) /= 9) call abort
+ a = a + i
+ b = b + 2 * i
+ c = c + 3 * i
+ end do
+ if (.not.allocated (a)) call abort
+ if (.not.allocated (b) .or. size (b) /= 4) call abort
+ if (lbound (b, 1) /= 6 .or. ubound (b, 1) /= 9) call abort
+ if (.not.allocated (c) .or. size (c) /= 6) call abort
+ if (size (c, 1) /= 3 .or. size (c, 2) /= 2) call abort
+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 3) call abort
+ if (lbound (c, 2) /= 8 .or. ubound (c, 2) /= 9) call abort
+ if (a /= 55 .or. any (b /= 110) .or. any (c /= 165)) call abort
+ a = 0
+ b = 0
+ c = 0
+!$omp simd reduction (foo : a, b, c)
+ do i = 1, 10
+ if (.not.allocated (a)) call abort
+ if (.not.allocated (b) .or. size (b) /= 4) call abort
+ if (lbound (b, 1) /= 6 .or. ubound (b, 1) /= 9) call abort
+ if (.not.allocated (c) .or. size (c) /= 6) call abort
+ if (size (c, 1) /= 3 .or. size (c, 2) /= 2) call abort
+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 3) call abort
+ if (lbound (c, 2) /= 8 .or. ubound (c, 2) /= 9) call abort
+ a = a + i
+ b = b + 2 * i
+ c = c + 3 * i
+ end do
+ if (.not.allocated (a)) call abort
+ if (.not.allocated (b) .or. size (b) /= 4) call abort
+ if (lbound (b, 1) /= 6 .or. ubound (b, 1) /= 9) call abort
+ if (.not.allocated (c) .or. size (c) /= 6) call abort
+ if (size (c, 1) /= 3 .or. size (c, 2) /= 2) call abort
+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 3) call abort
+ if (lbound (c, 2) /= 8 .or. ubound (c, 2) /= 9) call abort
+ if (a /= 55 .or. any (b /= 110) .or. any (c /= 165)) call abort
+end
--- /dev/null
+! { dg-do run }
+! { dg-require-effective-target tls_runtime }
+
+ use omp_lib
+ integer, allocatable, save :: a, b(:), c(:,:)
+ integer :: p
+!$omp threadprivate (a, b, c)
+ if (allocated (a) .or. allocated (b) .or. allocated (c)) call abort
+
+ call omp_set_dynamic (.false.)
+ call omp_set_num_threads (4)
+
+!$omp parallel num_threads (4)
+ if (allocated (a) .or. allocated (b) .or. allocated (c)) call abort
+!$omp end parallel
+
+ allocate (a, b(6:9), c(3, 8:9))
+ a = 4
+ b = 5
+ c = 6
+ if (.not.allocated (a)) call abort
+ if (.not.allocated (b) .or. size (b) /= 4) call abort
+ if (lbound (b, 1) /= 6 .or. ubound (b, 1) /= 9) call abort
+ if (.not.allocated (c) .or. size (c) /= 6) call abort
+ if (size (c, 1) /= 3 .or. size (c, 2) /= 2) call abort
+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 3) call abort
+ if (lbound (c, 2) /= 8 .or. ubound (c, 2) /= 9) call abort
+
+!$omp parallel num_threads (4) copyin (a, b, c) private (p)
+ p = omp_get_thread_num ()
+ if (.not.allocated (a)) call abort
+ if (.not.allocated (b) .or. size (b) /= 4) call abort
+ if (lbound (b, 1) /= 6 .or. ubound (b, 1) /= 9) call abort
+ if (.not.allocated (c) .or. size (c) /= 6) call abort
+ if (size (c, 1) /= 3 .or. size (c, 2) /= 2) call abort
+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 3) call abort
+ if (lbound (c, 2) /= 8 .or. ubound (c, 2) /= 9) call abort
+ if (a /= 4 .or. any (b /= 5) .or. any (c /= 6)) call abort
+ deallocate (a, b, c)
+ if (allocated (a) .or. allocated (b) .or. allocated (c)) call abort
+ allocate (a, b(p:9), c(3, p:7))
+ a = p
+ b = p
+ c = p
+ if (.not.allocated (a)) call abort
+ if (.not.allocated (b) .or. size (b) /= (10 - p)) call abort
+ if (lbound (b, 1) /= p .or. ubound (b, 1) /= 9) call abort
+ if (.not.allocated (c) .or. size (c) /= (3 * (8 - p))) call abort
+ if (size (c, 1) /= 3 .or. size (c, 2) /= (8 - p)) call abort
+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 3) call abort
+ if (lbound (c, 2) /= p .or. ubound (c, 2) /= 7) call abort
+ if (a /= p .or. any (b /= p) .or. any (c /= p)) call abort
+!$omp end parallel
+
+!$omp parallel num_threads (4) copyin (a, b, c)
+ if (.not.allocated (a)) call abort
+ if (.not.allocated (b) .or. size (b) /= 10) call abort
+ if (lbound (b, 1) /= 0 .or. ubound (b, 1) /= 9) call abort
+ if (.not.allocated (c) .or. size (c) /= 24) call abort
+ if (size (c, 1) /= 3 .or. size (c, 2) /= 8) call abort
+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 3) call abort
+ if (lbound (c, 2) /= 0 .or. ubound (c, 2) /= 7) call abort
+ if (a /= 0 .or. any (b /= 0) .or. any (c /= 0)) call abort
+!$omp end parallel
+
+ deallocate (a, b, c)
+ if (allocated (a) .or. allocated (b) .or. allocated (c)) call abort
+
+!$omp parallel num_threads (4) copyin (a, b, c)
+ if (allocated (a) .or. allocated (b) .or. allocated (c)) call abort
+!$omp end parallel
+end
--- /dev/null
+! { dg-do run }
+
+ integer, allocatable :: a, b(:), c(:,:)
+ logical :: l
+ if (allocated (a) .or. allocated (b) .or. allocated (c)) call abort
+
+!$omp parallel private (a, b, c, l)
+ l = .false.
+ if (allocated (a) .or. allocated (b) .or. allocated (c)) call abort
+
+!$omp single
+ allocate (a, b(6:9), c(3, 8:9))
+ a = 4
+ b = 5
+ c = 6
+!$omp end single copyprivate (a, b, c)
+
+ if (.not.allocated (a)) call abort
+ if (.not.allocated (b) .or. size (b) /= 4) call abort
+ if (lbound (b, 1) /= 6 .or. ubound (b, 1) /= 9) call abort
+ if (.not.allocated (c) .or. size (c) /= 6) call abort
+ if (size (c, 1) /= 3 .or. size (c, 2) /= 2) call abort
+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 3) call abort
+ if (lbound (c, 2) /= 8 .or. ubound (c, 2) /= 9) call abort
+ if (a /= 4 .or. any (b /= 5) .or. any (c /= 6)) call abort
+
+!$omp single
+ deallocate (a, b, c)
+ if (allocated (a) .or. allocated (b) .or. allocated (c)) call abort
+ allocate (a, b(0:4), c(3, 2:7))
+ a = 1
+ b = 2
+ c = 3
+!$omp end single copyprivate (a, b, c)
+
+ if (.not.allocated (a)) call abort
+ if (.not.allocated (b) .or. size (b) /= 5) call abort
+ if (lbound (b, 1) /= 0 .or. ubound (b, 1) /= 4) call abort
+ if (.not.allocated (c) .or. size (c) /= 18) call abort
+ if (size (c, 1) /= 3 .or. size (c, 2) /= 6) call abort
+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 3) call abort
+ if (lbound (c, 2) /= 2 .or. ubound (c, 2) /= 7) call abort
+ if (a /= 1 .or. any (b /= 2) .or. any (c /= 3)) call abort
+
+!$omp single
+ l = .true.
+ deallocate (a, b, c)
+ if (allocated (a) .or. allocated (b) .or. allocated (c)) call abort
+ allocate (a, b(2:6), c(3:5, 3:8))
+ a = 7
+ b = 8
+ c = 9
+!$omp end single copyprivate (a, b, c)
+
+ if (.not.allocated (a)) call abort
+ if (.not.allocated (b) .or. size (b) /= 5) call abort
+ if (l) then
+ if (lbound (b, 1) /= 2 .or. ubound (b, 1) /= 6) call abort
+ else
+ if (lbound (b, 1) /= 0 .or. ubound (b, 1) /= 4) call abort
+ end if
+ if (.not.allocated (c) .or. size (c) /= 18) call abort
+ if (size (c, 1) /= 3 .or. size (c, 2) /= 6) call abort
+ if (l) then
+ if (lbound (c, 1) /= 3 .or. ubound (c, 1) /= 5) call abort
+ if (lbound (c, 2) /= 3 .or. ubound (c, 2) /= 8) call abort
+ else
+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 3) call abort
+ if (lbound (c, 2) /= 2 .or. ubound (c, 2) /= 7) call abort
+ end if
+ if (a /= 7 .or. any (b /= 8) .or. any (c /= 9)) call abort
+
+!$omp end parallel
+end
--- /dev/null
+! { dg-do run }
+
+ integer, allocatable :: a, b(:), c(:,:)
+ logical :: l
+ if (allocated (a) .or. allocated (b) .or. allocated (c)) call abort
+!$omp parallel private (a, b, c)
+ if (allocated (a) .or. allocated (b) .or. allocated (c)) call abort
+ allocate (a, b(-7:-1), c(2:3, 3:5))
+ if (.not.allocated (a)) call abort
+ if (.not.allocated (b) .or. size (b) /= 7) call abort
+ if (lbound (b, 1) /= -7 .or. ubound (b, 1) /= -1) call abort
+ if (.not.allocated (c) .or. size (c) /= 6) call abort
+ if (size (c, 1) /= 2 .or. size (c, 2) /= 3) call abort
+ if (lbound (c, 1) /= 2 .or. ubound (c, 1) /= 3) call abort
+ if (lbound (c, 2) /= 3 .or. ubound (c, 2) /= 5) call abort
+ a = 4
+ b = 3
+ c = 2
+!$omp end parallel
+ if (allocated (a) .or. allocated (b) .or. allocated (c)) call abort
+!$omp parallel firstprivate (a, b, c)
+ if (allocated (a) .or. allocated (b) .or. allocated (c)) call abort
+ allocate (a, b(-7:-1), c(2:3, 3:5))
+ if (.not.allocated (a)) call abort
+ if (.not.allocated (b) .or. size (b) /= 7) call abort
+ if (lbound (b, 1) /= -7 .or. ubound (b, 1) /= -1) call abort
+ if (.not.allocated (c) .or. size (c) /= 6) call abort
+ if (size (c, 1) /= 2 .or. size (c, 2) /= 3) call abort
+ if (lbound (c, 1) /= 2 .or. ubound (c, 1) /= 3) call abort
+ if (lbound (c, 2) /= 3 .or. ubound (c, 2) /= 5) call abort
+ a = 4
+ b = 3
+ c = 2
+!$omp end parallel
+ if (allocated (a) .or. allocated (b) .or. allocated (c)) call abort
+ allocate (a, b(6:9), c(3, 8:9))
+ a = 2
+ b = 4
+ c = 5
+ if (.not.allocated (a)) call abort
+ if (.not.allocated (b) .or. size (b) /= 4) call abort
+ if (lbound (b, 1) /= 6 .or. ubound (b, 1) /= 9) call abort
+ if (.not.allocated (c) .or. size (c) /= 6) call abort
+ if (size (c, 1) /= 3 .or. size (c, 2) /= 2) call abort
+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 3) call abort
+ if (lbound (c, 2) /= 8 .or. ubound (c, 2) /= 9) call abort
+!$omp parallel firstprivate (a, b, c)
+ if (.not.allocated (a)) call abort
+ if (.not.allocated (b) .or. size (b) /= 4) call abort
+ if (lbound (b, 1) /= 6 .or. ubound (b, 1) /= 9) call abort
+ if (.not.allocated (c) .or. size (c) /= 6) call abort
+ if (size (c, 1) /= 3 .or. size (c, 2) /= 2) call abort
+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 3) call abort
+ if (lbound (c, 2) /= 8 .or. ubound (c, 2) /= 9) call abort
+ if (a /= 2 .or. any (b .ne. 4) .or. any (c .ne. 5)) call abort
+ deallocate (a)
+ if (allocated (a)) call abort
+ allocate (a)
+ a = 8
+ b = (/ 1, 2, 3 /)
+ c = reshape ((/ 1, 2, 3, 4, 5, 6, 7, 8 /), (/ 2, 4 /))
+ if (.not.allocated (a)) call abort
+ if (.not.allocated (b) .or. size (b) /= 3) call abort
+ if (lbound (b, 1) /= 1 .or. ubound (b, 1) /= 3) call abort
+ if (.not.allocated (c) .or. size (c) /= 8) call abort
+ if (size (c, 1) /= 2 .or. size (c, 2) /= 4) call abort
+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 2) call abort
+ if (lbound (c, 2) /= 1 .or. ubound (c, 2) /= 4) call abort
+ if (a /= 8 .or. b(2) /= 2 .or. c(1, 2) /= 3) call abort
+!$omp end parallel
+ if (.not.allocated (a)) call abort
+ if (.not.allocated (b) .or. size (b) /= 4) call abort
+ if (lbound (b, 1) /= 6 .or. ubound (b, 1) /= 9) call abort
+ if (.not.allocated (c) .or. size (c) /= 6) call abort
+ if (size (c, 1) /= 3 .or. size (c, 2) /= 2) call abort
+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 3) call abort
+ if (lbound (c, 2) /= 8 .or. ubound (c, 2) /= 9) call abort
+ if (a /= 2 .or. any (b .ne. 4) .or. any (c .ne. 5)) call abort
+ l = .false.
+!$omp parallel sections lastprivate (a, b, c) firstprivate (l)
+!$omp section
+ if (.not.allocated (a)) call abort
+ if (l) then
+ if (.not.allocated (b) .or. size (b) /= 6) call abort
+ if (lbound (b, 1) /= 1 .or. ubound (b, 1) /= 6) call abort
+ if (.not.allocated (c) .or. size (c) /= 8) call abort
+ if (size (c, 1) /= 4 .or. size (c, 2) /= 2) call abort
+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 4) call abort
+ if (lbound (c, 2) /= 1 .or. ubound (c, 2) /= 2) call abort
+ if (a /= 12 .or. b(2) /= 8 .or. c(1, 2) /= 5) call abort
+ else
+ if (.not.allocated (b) .or. size (b) /= 4) call abort
+ if (lbound (b, 1) /= 6 .or. ubound (b, 1) /= 9) call abort
+ if (.not.allocated (c) .or. size (c) /= 6) call abort
+ if (size (c, 1) /= 3 .or. size (c, 2) /= 2) call abort
+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 3) call abort
+ if (lbound (c, 2) /= 8 .or. ubound (c, 2) /= 9) call abort
+ end if
+ l = .true.
+ deallocate (a)
+ if (allocated (a)) call abort
+ allocate (a)
+ a = 8
+ b = (/ 1, 2, 3 /)
+ c = reshape ((/ 1, 2, 3, 4, 5, 6, 7, 8 /), (/ 2, 4 /))
+ if (.not.allocated (a)) call abort
+ if (.not.allocated (b) .or. size (b) /= 3) call abort
+ if (lbound (b, 1) /= 1 .or. ubound (b, 1) /= 3) call abort
+ if (.not.allocated (c) .or. size (c) /= 8) call abort
+ if (size (c, 1) /= 2 .or. size (c, 2) /= 4) call abort
+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 2) call abort
+ if (lbound (c, 2) /= 1 .or. ubound (c, 2) /= 4) call abort
+ if (a /= 8 .or. b(2) /= 2 .or. c(1, 2) /= 3) call abort
+!$omp section
+ if (.not.allocated (a)) call abort
+ if (l) then
+ if (.not.allocated (b) .or. size (b) /= 3) call abort
+ if (lbound (b, 1) /= 1 .or. ubound (b, 1) /= 3) call abort
+ if (.not.allocated (c) .or. size (c) /= 8) call abort
+ if (size (c, 1) /= 2 .or. size (c, 2) /= 4) call abort
+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 2) call abort
+ if (lbound (c, 2) /= 1 .or. ubound (c, 2) /= 4) call abort
+ if (a /= 8 .or. b(2) /= 2 .or. c(1, 2) /= 3) call abort
+ else
+ if (.not.allocated (b) .or. size (b) /= 4) call abort
+ if (lbound (b, 1) /= 6 .or. ubound (b, 1) /= 9) call abort
+ if (.not.allocated (c) .or. size (c) /= 6) call abort
+ if (size (c, 1) /= 3 .or. size (c, 2) /= 2) call abort
+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 3) call abort
+ if (lbound (c, 2) /= 8 .or. ubound (c, 2) /= 9) call abort
+ end if
+ l = .true.
+ deallocate (a)
+ if (allocated (a)) call abort
+ allocate (a)
+ a = 12
+ b = (/ 9, 8, 7, 6, 5, 4 /)
+ c = reshape ((/ 1, 2, 3, 4, 5, 6, 7, 8 /), (/ 4, 2 /))
+ if (.not.allocated (a)) call abort
+ if (.not.allocated (b) .or. size (b) /= 6) call abort
+ if (lbound (b, 1) /= 1 .or. ubound (b, 1) /= 6) call abort
+ if (.not.allocated (c) .or. size (c) /= 8) call abort
+ if (size (c, 1) /= 4 .or. size (c, 2) /= 2) call abort
+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 4) call abort
+ if (lbound (c, 2) /= 1 .or. ubound (c, 2) /= 2) call abort
+ if (a /= 12 .or. b(2) /= 8 .or. c(1, 2) /= 5) call abort
+!$omp end parallel sections
+ if (.not.allocated (a)) call abort
+ if (.not.allocated (b) .or. size (b) /= 6) call abort
+ if (lbound (b, 1) /= 1 .or. ubound (b, 1) /= 6) call abort
+ if (.not.allocated (c) .or. size (c) /= 8) call abort
+ if (size (c, 1) /= 4 .or. size (c, 2) /= 2) call abort
+ if (lbound (c, 1) /= 1 .or. ubound (c, 1) /= 4) call abort
+ if (lbound (c, 2) /= 1 .or. ubound (c, 2) /= 2) call abort
+ if (a /= 12 .or. b(2) /= 8 .or. c(1, 2) /= 5) call abort
+end
--- /dev/null
+! { dg-do run }
+
+program associate1
+ integer :: v, i, j
+ real :: a(3, 3)
+ v = 15
+ a = 4.5
+ a(2,1) = 3.5
+ i = 2
+ j = 1
+ associate(u => v, b => a(i, j))
+!$omp parallel private(v, a) default(none)
+ v = -1
+ a = 2.5
+ if (v /= -1 .or. u /= 15) call abort
+ if (a(2,1) /= 2.5 .or. b /= 3.5) call abort
+ associate(u => v, b => a(2, 1))
+ if (u /= -1 .or. b /= 2.5) call abort
+ end associate
+ if (u /= 15 .or. b /= 3.5) call abort
+!$omp end parallel
+ end associate
+end program
--- /dev/null
+! { dg-do run }
+
+program associate2
+ type dl
+ integer :: i
+ end type
+ type dt
+ integer :: i
+ real :: a(3, 3)
+ type(dl) :: c(3, 3)
+ end type
+ integer :: v(4), i, j, k, l
+ type (dt) :: a(3, 3)
+ v = 15
+ forall (k = 1:3, l = 1:3) a(k, l)%a(:,:) = 4.5
+ a(2,1)%a(1,2) = 3.5
+ i = 2
+ j = 1
+ associate(u => v, b => a(i, j)%a)
+!$omp parallel private(v, a) default(none)
+ v = -1
+ forall (k = 1:3, l = 1:3) a(k, l)%a(:,:) = 2.5
+ if (v(3) /= -1 .or. u(3) /= 15) call abort
+ if (a(2,1)%a(1,2) /= 2.5 .or. b(1,2) /= 3.5) call abort
+ associate(u => v, b => a(2, 1)%a)
+ if (u(3) /= -1 .or. b(1,2) /= 2.5) call abort
+ end associate
+ if (u(3) /= 15 .or. b(1,2) /= 3.5) call abort
+!$omp end parallel
+ end associate
+ forall (k = 1:3, l = 1:3) a(k, l)%c(:,:)%i = 7
+ a(1,2)%c(2,1)%i = 9
+ i = 1
+ j = 2
+ associate(d => a(i, j)%c(2,:)%i)
+!$omp parallel private(a) default(none)
+ forall (k = 1:3, l = 1:3) a(k, l)%c(:,:)%i = 15
+ if (a(1,2)%c(2,1)%i /= 15 .or. d(1) /= 9) call abort
+ if (a(1,2)%c(2,2)%i /= 15 .or. d(2) /= 7) call abort
+ associate(d => a(2,1)%c(2,:)%i)
+ if (d(1) /= 15 .or. d(2) /= 15) call abort
+ end associate
+ if (d(1) /= 9 .or. d(2) /= 7) call abort
+!$omp end parallel
+ end associate
+end program
--- /dev/null
+! { dg-do run }
+! { dg-set-target-env-var OMP_CANCELLATION "true" }
+
+ use omp_lib
+ integer :: i
+
+ !$omp parallel num_threads(32)
+ !$omp do
+ do i = 0, 999
+ !$omp cancel do
+ if (omp_get_cancellation ()) call abort
+ enddo
+ !$omp endparallel
+end
--- /dev/null
+! { dg-do run }
+! { dg-options "-fno-inline -fno-ipa-sra -fno-ipa-cp -fno-ipa-cp-clone" }
+! { dg-set-target-env-var OMP_CANCELLATION "true" }
+
+ use omp_lib
+ integer :: i
+ logical :: x(5)
+
+ x(:) = .false.
+ x(1) = .true.
+ x(3) = .true.
+ if (omp_get_cancellation ()) call foo (x)
+contains
+ subroutine foo (x)
+ use omp_lib
+ logical :: x(5)
+ integer :: v, w, i
+
+ v = 0
+ w = 0
+ !$omp parallel num_threads (32) shared (v, w)
+ !$omp do
+ do i = 0, 999
+ !$omp cancel do if (x(1))
+ call abort
+ end do
+ !$omp do
+ do i = 0, 999
+ !$omp cancel do if (x(2))
+ !$omp atomic
+ v = v + 1
+ !$omp endatomic
+ enddo
+ !$omp do
+ do i = 0, 999
+ !$omp cancel do if (x(3))
+ !$omp atomic
+ w = w + 8
+ !$omp end atomic
+ end do
+ !$omp do
+ do i = 0, 999
+ !$omp cancel do if (x(4))
+ !$omp atomic
+ v = v + 2
+ !$omp end atomic
+ end do
+ !$omp end do
+ !$omp end parallel
+ if (v.ne.3000.or.w.ne.0) call abort
+ !$omp parallel num_threads (32) shared (v, w)
+ ! None of these cancel directives should actually cancel anything,
+ ! but the compiler shouldn't know that and thus should use cancellable
+ ! barriers at the end of all the workshares.
+ !$omp cancel parallel if (omp_get_thread_num ().eq.1.and.x(5))
+ !$omp do
+ do i = 0, 999
+ !$omp cancel do if (x(1))
+ call abort
+ end do
+ !$omp cancel parallel if (omp_get_thread_num ().eq.2.and.x(5))
+ !$omp do
+ do i = 0, 999
+ !$omp cancel do if (x(2))
+ !$omp atomic
+ v = v + 1
+ !$omp endatomic
+ enddo
+ !$omp cancel parallel if (omp_get_thread_num ().eq.3.and.x(5))
+ !$omp do
+ do i = 0, 999
+ !$omp cancel do if (x(3))
+ !$omp atomic
+ w = w + 8
+ !$omp end atomic
+ end do
+ !$omp cancel parallel if (omp_get_thread_num ().eq.4.and.x(5))
+ !$omp do
+ do i = 0, 999
+ !$omp cancel do if (x(4))
+ !$omp atomic
+ v = v + 2
+ !$omp end atomic
+ end do
+ !$omp end do
+ !$omp cancel parallel if (omp_get_thread_num ().eq.5.and.x(5))
+ !$omp end parallel
+ if (v.ne.6000.or.w.ne.0) call abort
+ end subroutine
+end
--- /dev/null
+! { dg-do run }
+! { dg-set-target-env-var OMP_CANCELLATION "true" }
+
+ use omp_lib
+
+ !$omp parallel num_threads(32)
+ !$omp cancel parallel
+ if (omp_get_cancellation ()) call abort
+ !$omp end parallel
+end
--- /dev/null
+! { dg-do run }
+! { dg-options "-fno-inline -fno-ipa-sra -fno-ipa-cp -fno-ipa-cp-clone" }
+! { dg-set-target-env-var OMP_CANCELLATION "true" }
+
+ use omp_lib
+ integer :: x, i, j
+ common /x/ x
+
+ call omp_set_dynamic (.false.)
+ call omp_set_schedule (omp_sched_static, 1)
+ !$omp parallel num_threads(16) private (i, j)
+ call do_some_work
+ !$omp barrier
+ if (omp_get_thread_num ().eq.1) then
+ call sleep (2)
+ !$omp cancellation point parallel
+ end if
+ do j = 3, 16
+ !$omp do schedule(runtime)
+ do i = 0, j - 1
+ call do_some_work
+ end do
+ !$omp enddo nowait
+ end do
+ if (omp_get_thread_num ().eq.0) then
+ call sleep (1)
+ !$omp cancel parallel
+ end if
+ !$omp end parallel
+contains
+ subroutine do_some_work
+ integer :: x
+ common /x/ x
+ !$omp atomic
+ x = x + 1
+ !$omp end atomic
+ endsubroutine do_some_work
+end
--- /dev/null
+! { dg-do run }
+! { dg-set-target-env-var OMP_CANCELLATION "true" }
+
+ use omp_lib
+
+ if (omp_get_cancellation ()) then
+ !$omp parallel num_threads(32)
+ !$omp sections
+ !$omp cancel sections
+ call abort
+ !$omp section
+ !$omp cancel sections
+ call abort
+ !$omp section
+ !$omp cancel sections
+ call abort
+ !$omp section
+ !$omp cancel sections
+ call abort
+ !$omp end sections
+ !$omp end parallel
+ end if
+end
--- /dev/null
+! { dg-do run }
+! { dg-set-target-env-var OMP_CANCELLATION "true" }
+
+ use omp_lib
+ integer :: i
+
+ !$omp parallel
+ !$omp taskgroup
+ !$omp task
+ !$omp cancel taskgroup
+ call abort
+ !$omp endtask
+ !$omp endtaskgroup
+ !$omp endparallel
+ !$omp parallel private (i)
+ !$omp barrier
+ !$omp single
+ !$omp taskgroup
+ do i = 0, 49
+ !$omp task
+ !$omp cancellation point taskgroup
+ !$omp cancel taskgroup if (i.gt.5)
+ !$omp end task
+ end do
+ !$omp end taskgroup
+ !$omp endsingle
+ !$omp end parallel
+end
--- /dev/null
+! { dg-do run { target vect_simd_clones } }
+! { dg-options "-fno-inline" }
+! { dg-additional-options "-msse2" { target sse2_runtime } }
+! { dg-additional-options "-mavx" { target avx_runtime } }
+
+module declare_simd_1_mod
+ contains
+ real function foo (a, b, c)
+ !$omp declare simd (foo) simdlen (4) uniform (a) linear (b : 5) &
+ !$omp & notinbranch
+ double precision, value :: a
+ real, value :: c
+ !$omp declare simd (foo)
+ integer, value :: b
+ foo = a + b * c
+ end function foo
+end module declare_simd_1_mod
+ use declare_simd_1_mod
+ interface
+ function bar (a, b, c)
+ !$omp declare simd (bar)
+ integer, value :: b
+ real, value :: c
+ real :: bar
+ !$omp declare simd (bar) simdlen (4) linear (b : 2)
+ !$omp declare simd (bar) simdlen (16) inbranch
+ double precision, value :: a
+ end function bar
+ end interface
+ integer :: i
+ double precision :: a(128)
+ real :: b(128), d(128)
+ data d /171., 414., 745., 1164., 1671., 2266., 2949., 3720., 4579., &
+ & 5526., 6561., 7684., 8895., 10194., 11581., 13056., 14619., &
+ & 16270., 18009., 19836., 21751., 23754., 25845., 28024., &
+ & 30291., 32646., 35089., 37620., 40239., 42946., 45741., &
+ & 48624., 51595., 54654., 57801., 61036., 64359., 67770., &
+ & 71269., 74856., 78531., 82294., 86145., 90084., 94111., &
+ & 98226., 102429., 106720., 111099., 115566., 120121., 124764., &
+ & 129495., 134314., 139221., 144216., 149299., 154470., 159729., &
+ & 165076., 170511., 176034., 181645., 187344., 193131., 199006., &
+ & 204969., 211020., 217159., 223386., 229701., 236104., 242595., &
+ & 249174., 255841., 262596., 269439., 276370., 283389., 290496., &
+ & 297691., 304974., 312345., 319804., 327351., 334986., 342709., &
+ & 350520., 358419., 366406., 374481., 382644., 390895., 399234., &
+ & 407661., 416176., 424779., 433470., 442249., 451116., 460071., &
+ & 469114., 478245., 487464., 496771., 506166., 515649., 525220., &
+ & 534879., 544626., 554461., 564384., 574395., 584494., 594681., &
+ & 604956., 615319., 625770., 636309., 646936., 657651., 668454., &
+ & 679345., 690324., 701391., 712546., 723789., 735120./
+ !$omp simd
+ do i = 1, 128
+ a(i) = 7.0 * i + 16.0
+ b(i) = 5.0 * i + 12.0
+ end do
+ !$omp simd
+ do i = 1, 128
+ b(i) = foo (a(i), 3, b(i))
+ end do
+ !$omp simd
+ do i = 1, 128
+ b(i) = bar (a(i), 2 * i, b(i))
+ end do
+ if (any (b.ne.d)) call abort
+ !$omp simd
+ do i = 1, 128
+ b(i) = i * 2.0
+ end do
+ !$omp simd
+ do i = 1, 128
+ b(i) = baz (7.0_8, 2, b(i))
+ end do
+ do i = 1, 128
+ if (b(i).ne.(7.0 + 4.0 * i)) call abort
+ end do
+contains
+ function baz (x, y, z)
+ !$omp declare simd (baz) simdlen (8) uniform (x, y)
+ !$omp declare simd (baz)
+ integer, value :: y
+ real, value :: z
+ real :: baz
+ double precision, value :: x
+ baz = x + y * z
+ end function baz
+end
+function bar (a, b, c)
+ integer, value :: b
+ real, value :: c
+ real :: bar
+ double precision, value :: a
+ !$omp declare simd (bar)
+ !$omp declare simd (bar) simdlen (4) linear (b : 2)
+ bar = a + b * c
+end function bar
--- /dev/null
+! { dg-do run { target vect_simd_clones } }
+! { dg-options "-fno-inline" }
+! { dg-additional-sources declare-simd-3.f90 }
+! { dg-additional-options "-msse2" { target sse2_runtime } }
+! { dg-additional-options "-mavx" { target avx_runtime } }
+
+module declare_simd_2_mod
+ contains
+ real function foo (a, b, c)
+ !$omp declare simd (foo) simdlen (4) uniform (a) linear (b : 5)
+ double precision, value :: a
+ real, value :: c
+ !$omp declare simd (foo)
+ integer, value :: b
+ foo = a + b * c
+ end function foo
+end module declare_simd_2_mod
+
+ interface
+ subroutine bar ()
+ end subroutine bar
+ end interface
+
+ call bar ()
+end
--- /dev/null
+! Don't compile this anywhere, it is just auxiliary
+! file compiled together with declare-simd-2.f90
+! to verify inter-CU module handling of omp declare simd.
+! { dg-do compile { target { lp64 && { ! lp64 } } } }
+
+subroutine bar
+ use declare_simd_2_mod
+ real :: b(128)
+ integer :: i
+
+ !$omp simd
+ do i = 1, 128
+ b(i) = i * 2.0
+ end do
+ !$omp simd
+ do i = 1, 128
+ b(i) = foo (7.0_8, 5 * i, b(i))
+ end do
+ do i = 1, 128
+ if (b(i).ne.(7.0 + 10.0 * i * i)) call abort
+ end do
+end subroutine bar
--- /dev/null
+! { dg-do run }
+
+ call dep ()
+ call dep2 ()
+ call dep3 ()
+ call firstpriv ()
+ call antidep ()
+ call antidep2 ()
+ call antidep3 ()
+ call outdep ()
+ call concurrent ()
+ call concurrent2 ()
+ call concurrent3 ()
+contains
+ subroutine dep
+ integer :: x
+ x = 1
+ !$omp parallel
+ !$omp single
+ !$omp task shared (x) depend(out: x)
+ x = 2
+ !$omp end task
+ !$omp task shared (x) depend(in: x)
+ if (x.ne.2) call abort
+ !$omp end task
+ !$omp end single
+ !$omp end parallel
+ end subroutine dep
+
+ subroutine dep2
+ integer :: x
+ !$omp parallel
+ !$omp single private (x)
+ x = 1
+ !$omp task shared (x) depend(out: x)
+ x = 2
+ !$omp end task
+ !$omp task shared (x) depend(in: x)
+ if (x.ne.2) call abort
+ !$omp end task
+ !$omp taskwait
+ !$omp end single
+ !$omp end parallel
+ end subroutine dep2
+
+ subroutine dep3
+ integer :: x
+ !$omp parallel private (x)
+ x = 1
+ !$omp single
+ !$omp task shared (x) depend(out: x)
+ x = 2
+ !$omp endtask
+ !$omp task shared (x) depend(in: x)
+ if (x.ne.2) call abort
+ !$omp endtask
+ !$omp endsingle
+ !$omp endparallel
+ end subroutine dep3
+
+ subroutine firstpriv
+ integer :: x
+ !$omp parallel private (x)
+ !$omp single
+ x = 1
+ !$omp task depend(out: x)
+ x = 2
+ !$omp end task
+ !$omp task depend(in: x)
+ if (x.ne.1) call abort
+ !$omp end task
+ !$omp end single
+ !$omp end parallel
+ end subroutine firstpriv
+
+ subroutine antidep
+ integer :: x
+ x = 1
+ !$omp parallel
+ !$omp single
+ !$omp task shared(x) depend(in: x)
+ if (x.ne.1) call abort
+ !$omp end task
+ !$omp task shared(x) depend(out: x)
+ x = 2
+ !$omp end task
+ !$omp end single
+ !$omp end parallel
+ end subroutine antidep
+
+ subroutine antidep2
+ integer :: x
+ !$omp parallel private (x)
+ !$omp single
+ x = 1
+ !$omp taskgroup
+ !$omp task shared(x) depend(in: x)
+ if (x.ne.1) call abort
+ !$omp end task
+ !$omp task shared(x) depend(out: x)
+ x = 2
+ !$omp end task
+ !$omp end taskgroup
+ !$omp end single
+ !$omp end parallel
+ end subroutine antidep2
+
+ subroutine antidep3
+ integer :: x
+ !$omp parallel
+ x = 1
+ !$omp single
+ !$omp task shared(x) depend(in: x)
+ if (x.ne.1) call abort
+ !$omp end task
+ !$omp task shared(x) depend(out: x)
+ x = 2
+ !$omp end task
+ !$omp end single
+ !$omp end parallel
+ end subroutine antidep3
+
+ subroutine outdep
+ integer :: x
+ !$omp parallel private (x)
+ !$omp single
+ x = 0
+ !$omp task shared(x) depend(out: x)
+ x = 1
+ !$omp end task
+ !$omp task shared(x) depend(out: x)
+ x = 2
+ !$omp end task
+ !$omp taskwait
+ if (x.ne.2) call abort
+ !$omp end single
+ !$omp end parallel
+ end subroutine outdep
+
+ subroutine concurrent
+ integer :: x
+ x = 1
+ !$omp parallel
+ !$omp single
+ !$omp task shared (x) depend(out: x)
+ x = 2
+ !$omp end task
+ !$omp task shared (x) depend(in: x)
+ if (x.ne.2) call abort
+ !$omp end task
+ !$omp task shared (x) depend(in: x)
+ if (x.ne.2) call abort
+ !$omp end task
+ !$omp task shared (x) depend(in: x)
+ if (x.ne.2) call abort
+ !$omp end task
+ !$omp end single
+ !$omp end parallel
+ end subroutine concurrent
+
+ subroutine concurrent2
+ integer :: x
+ !$omp parallel private (x)
+ !$omp single
+ x = 1
+ !$omp task shared (x) depend(out: x)
+ x = 2;
+ !$omp end task
+ !$omp task shared (x) depend(in: x)
+ if (x.ne.2) call abort
+ !$omp end task
+ !$omp task shared (x) depend(in: x)
+ if (x.ne.2) call abort
+ !$omp end task
+ !$omp task shared (x) depend(in: x)
+ if (x.ne.2) call abort
+ !$omp end task
+ !$omp taskwait
+ !$omp end single
+ !$omp end parallel
+ end subroutine concurrent2
+
+ subroutine concurrent3
+ integer :: x
+ !$omp parallel private (x)
+ x = 1
+ !$omp single
+ !$omp task shared (x) depend(out: x)
+ x = 2
+ !$omp end task
+ !$omp task shared (x) depend(in: x)
+ if (x.ne.2) call abort
+ !$omp end task
+ !$omp task shared (x) depend(in: x)
+ if (x.ne.2) call abort
+ !$omp end task
+ !$omp task shared (x) depend(in: x)
+ if (x.ne.2) call abort
+ !$omp end task
+ !$omp end single
+ !$omp end parallel
+ end subroutine concurrent3
+end
--- /dev/null
+! { dg-do run }
+
+ integer :: x(3:6, 7:12), y
+ y = 1
+ !$omp parallel shared (x, y)
+ !$omp single
+ !$omp taskgroup
+ !$omp task depend(in: x(:, :))
+ if (y.ne.1) call abort
+ !$omp end task
+ !$omp task depend(out: x(:, :))
+ y = 2
+ !$omp end task
+ !$omp end taskgroup
+ !$omp taskgroup
+ !$omp task depend(in: x(4, 7))
+ if (y.ne.2) call abort
+ !$omp end task
+ !$omp task depend(out: x(4:4, 7:7))
+ y = 3
+ !$omp end task
+ !$omp end taskgroup
+ !$omp taskgroup
+ !$omp task depend(in: x(4:, 8:))
+ if (y.ne.3) call abort
+ !$omp end task
+ !$omp task depend(out: x(4:6, 8:12))
+ y = 4
+ !$omp end task
+ !$omp end taskgroup
+ !$omp end single
+ !$omp end parallel
+ if (y.ne.4) call abort
+end
--- /dev/null
+! { dg-do run }
+
+ integer :: x(2, 3)
+ integer, allocatable :: z(:, :)
+ allocate (z(-2:3, 2:4))
+ call foo (x, z)
+contains
+ subroutine foo (x, z)
+ integer :: x(:, :), y
+ integer, allocatable :: z(:, :)
+ y = 1
+ !$omp parallel shared (x, y, z)
+ !$omp single
+ !$omp taskgroup
+ !$omp task depend(in: x)
+ if (y.ne.1) call abort
+ !$omp end task
+ !$omp task depend(out: x(1:2, 1:3))
+ y = 2
+ !$omp end task
+ !$omp end taskgroup
+ !$omp taskgroup
+ !$omp task depend(in: z)
+ if (y.ne.2) call abort
+ !$omp end task
+ !$omp task depend(out: z(-2:3, 2:4))
+ y = 3
+ !$omp end task
+ !$omp end taskgroup
+ !$omp taskgroup
+ !$omp task depend(in: x)
+ if (y.ne.3) call abort
+ !$omp end task
+ !$omp task depend(out: x(1:, 1:))
+ y = 4
+ !$omp end task
+ !$omp end taskgroup
+ !$omp end single
+ !$omp end parallel
+ if (y.ne.4) call abort
+ end subroutine
+end
--- /dev/null
+! { dg-do run }
+
+ interface
+ subroutine bar (q)
+ integer :: q(19:)
+ end subroutine
+ end interface
+ integer :: q(7:15)
+ q(:) = 5
+ call bar (q)
+end
+subroutine bar (q)
+ use iso_c_binding, only: c_ptr, c_loc, c_int
+ integer :: a, b, c, d(2:3,4:5), q(19:), h, k, m, n, o, p
+ integer(c_int), target :: e(64)
+ type (c_ptr) :: f, g(64)
+ logical :: l
+ a = 1
+ b = 2
+ c = 3
+ d = 4
+ l = .false.
+ f = c_loc (e)
+ call foo
+contains
+ subroutine foo
+ use iso_c_binding, only: c_sizeof
+!$omp simd linear(a:2) linear(b:1)
+ do a = 1, 20, 2
+ b = b + 1
+ end do
+!$omp end simd
+ if (a /= 21 .or. b /= 12) call abort
+!$omp simd aligned(f : c_sizeof (e(1)))
+ do b = 1, 64
+ g(b) = f
+ end do
+!$omp end simd
+!$omp parallel
+!$omp single
+!$omp taskgroup
+!$omp task depend(out : a, d(2:2,4:5))
+ a = a + 1
+ d(2:2,4:5) = d(2:2,4:5) + 1
+!$omp end task
+!$omp task depend(in : a, d(2:2,4:5))
+ if (a /= 22) call abort
+ if (any (d(2:2,4:5) /= 5)) call abort
+!$omp end task
+!$omp end taskgroup
+!$omp end single
+!$omp end parallel
+ b = 10
+!$omp target data map (tofrom: a, d(2:3,4:4), q) map (from: l)
+!$omp target map (tofrom: b, d(2:3,4:4))
+ l = .false.
+ if (a /= 22 .or. any (q /= 5)) l = .true.
+ if (lbound (q, 1) /= 19 .or. ubound (q, 1) /= 27) l = .true.
+ if (d(2,4) /= 5 .or. d(3,4) /= 4) l = .true.
+ l = l .or. (b /= 10)
+ a = 6
+ b = 11
+ q = 8
+ d(2:3,4:4) = 9
+!$omp end target
+!$omp target update from (a, q, d(2:3,4:4), l)
+ if (a /= 6 .or. l .or. b /= 11 .or. any (q /= 8)) call abort
+ if (any (d(2:3,4:4) /= 9) .or. d(2,5) /= 5 .or. d(3,5) /= 4) call abort
+ a = 12
+ b = 13
+ q = 14
+ d = 15
+!$omp target update to (a, q, d(2:3,4:4))
+!$omp target map (tofrom: b, d(2:3,4:4))
+ if (a /= 12 .or. b /= 13 .or. any (q /= 14)) l = .true.
+ l = l .or. any (d(2:3,4:4) /= 15)
+!$omp end target
+ a = 0
+ b = 1
+ c = 100
+ h = 8
+ m = 0
+ n = 64
+ o = 16
+ if (l) call abort
+!$omp target teams distribute parallel do simd if (.not.l) device(a) &
+!$omp & num_teams(b) dist_schedule(static, c) num_threads (h) &
+!$omp & reduction (+: m) safelen (n) schedule(static, o)
+ do p = 1, 64
+ m = m + 1
+ end do
+!$omp end target teams distribute parallel do simd
+ if (m /= 64) call abort
+!$omp end target data
+ end subroutine foo
+end subroutine bar
--- /dev/null
+! { dg-do run }
+ integer (kind = 4) :: a, a2
+ integer (kind = 2) :: b, b2
+ real :: c
+ double precision :: d, d2, c2
+ integer, dimension (10) :: e
+ e(:) = 5
+ e(7) = 9
+!$omp atomic write seq_cst
+ a = 1
+!$omp atomic seq_cst, write
+ b = 2
+!$omp atomic write, seq_cst
+ c = 3
+!$omp atomic seq_cst write
+ d = 4
+!$omp atomic capture seq_cst
+ a2 = a
+ a = a + 4
+!$omp end atomic
+!$omp atomic capture, seq_cst
+ b = b - 18
+ b2 = b
+!$omp end atomic
+!$omp atomic seq_cst, capture
+ c2 = c
+ c = 2.0 * c
+!$omp end atomic
+!$omp atomic seq_cst capture
+ d = d / 2.0
+ d2 = d
+!$omp end atomic
+ if (a2 .ne. 1 .or. b2 .ne. -16 .or. c2 .ne. 3 .or. d2 .ne. 2) call abort
+!$omp atomic read seq_cst
+ a2 = a
+!$omp atomic seq_cst, read
+ c2 = c
+ if (a2 .ne. 5 .or. b2 .ne. -16 .or. c2 .ne. 6 .or. d2 .ne. 2) call abort
+ a2 = 10
+ if (a2 .ne. 10) call abort
+!$omp atomic capture
+ a2 = a
+ a = e(1) + e(6) + e(7) * 2
+!$omp endatomic
+ if (a2 .ne. 5) call abort
+!$omp atomic read
+ a2 = a
+!$omp end atomic
+ if (a2 .ne. 28) call abort
+!$omp atomic capture seq_cst
+ b2 = b
+ b = e(1) + e(7) + e(5) * 2
+!$omp end atomic
+ if (b2 .ne. -16) call abort
+!$omp atomic seq_cst, read
+ b2 = b
+!$omp end atomic
+ if (b2 .ne. 24) call abort
+end
implicit none
include "omp_lib.h"
- if (openmp_version .ne. 201107) call abort;
+ if (openmp_version .ne. 201307) call abort;
end program main
use omp_lib
implicit none
- if (openmp_version .ne. 201107) call abort;
+ if (openmp_version .ne. 201307) call abort;
end program main
--- /dev/null
+! { dg-do run }
+ interface
+ integer function foo ()
+ end function
+ integer function bar ()
+ end function
+ integer function baz ()
+ end function
+ end interface
+ procedure(foo), pointer :: ptr
+ integer :: i
+ ptr => foo
+!$omp parallel shared (ptr)
+ if (ptr () /= 1) call abort
+!$omp end parallel
+ ptr => bar
+!$omp parallel firstprivate (ptr)
+ if (ptr () /= 2) call abort
+!$omp end parallel
+!$omp parallel sections lastprivate (ptr)
+!$omp section
+ ptr => foo
+ if (ptr () /= 1) call abort
+!$omp section
+ ptr => bar
+ if (ptr () /= 2) call abort
+!$omp section
+ ptr => baz
+ if (ptr () /= 3) call abort
+!$omp end parallel sections
+ if (ptr () /= 3) call abort
+ if (.not.associated (ptr, baz)) call abort
+end
+integer function foo ()
+ foo = 1
+end function
+integer function bar ()
+ bar = 2
+end function
+integer function baz ()
+ baz = 3
+end function
--- /dev/null
+! { dg-do run }
+! { dg-additional-options "-msse2" { target sse2_runtime } }
+! { dg-additional-options "-mavx" { target avx_runtime } }
+
+ type dt
+ integer :: x = 0
+ end type
+ type (dt) :: t
+ integer :: i, j, k, l, r, s, a(30)
+ integer, target :: q(30)
+ integer, pointer :: p(:)
+ !$omp declare reduction (foo : integer : &
+ !$omp & omp_out = omp_out + omp_in) initializer (omp_priv = 0)
+ !$omp declare reduction (+ : dt : omp_out%x = omp_out%x &
+ !$omp & + omp_in%x)
+ a(:) = 1
+ q(:) = 1
+ p => q
+ r = 0
+ j = 10
+ k = 20
+ s = 0
+ !$omp simd safelen (8) reduction(+:r, t) linear(j, k : 2) &
+ !$omp& private (l) aligned(p : 4) reduction(foo:s)
+ do i = 1, 30
+ l = j + k + a(i) + p(i)
+ r = r + l
+ j = j + 2
+ k = k + 2
+ s = s + l
+ t%x = t%x + l
+ end do
+ if (r.ne.2700.or.j.ne.70.or.k.ne.80.or.s.ne.2700) call abort
+ if (t%x.ne.2700) call abort
+end
--- /dev/null
+! { dg-do run }
+! { dg-additional-options "-msse2" { target sse2_runtime } }
+! { dg-additional-options "-mavx" { target avx_runtime } }
+
+ integer :: a(1024), b(1024), k, m, i, s, t
+ k = 4
+ m = 2
+ t = 1
+ do i = 1, 1024
+ a(i) = i - 513
+ b(i) = modulo (i - 52, 39)
+ if (i.lt.52.and.b(i).ne.0) b(i) = b(i) - 39
+ end do
+ s = foo (b)
+ do i = 1, 1024
+ if (a(i).ne.((i - 513) * b(i))) call abort
+ if (i.lt.52.and.modulo (i - 52, 39).ne.0) then
+ if (b(i).ne.(modulo (i - 52, 39) - 39)) call abort
+ else
+ if (b(i).ne.(modulo (i - 52, 39))) call abort
+ end if
+ a(i) = i - 513
+ end do
+ if (k.ne.(4 + 3 * 1024).or.s.ne.1596127) call abort
+ k = 4
+ m = 2
+ t = 1
+ s = bar (b)
+ do i = 1, 1024
+ if (a(i).ne.((i - 513) * b(i))) call abort
+ if (i.lt.52.and.modulo (i - 52, 39).ne.0) then
+ if (b(i).ne.(modulo (i - 52, 39) - 39)) call abort
+ else
+ if (b(i).ne.(modulo (i - 52, 39))) call abort
+ end if
+ a(i) = i - 513
+ end do
+ if (k.ne.(4 + 3 * 1024).or.s.ne.1596127) call abort
+ k = 4
+ m = 2
+ t = 1
+ s = baz (b)
+ do i = 1, 1024
+ if (a(i).ne.((i - 513) * b(i))) call abort
+ if (i.lt.52.and.modulo (i - 52, 39).ne.0) then
+ if (b(i).ne.(modulo (i - 52, 39) - 39)) call abort
+ else
+ if (b(i).ne.(modulo (i - 52, 39))) call abort
+ end if
+ end do
+ if (k.ne.(4 + 3 * 1024).or.s.ne.1596127) call abort
+contains
+ function foo (p)
+ integer :: p(1024), u, v, i, s, foo
+ s = 0
+ !$omp simd linear(k : m + 1) reduction(+: s) lastprivate(u, v)
+ do i = 1, 1024
+ a(i) = a(i) * p(i)
+ u = p(i) + k
+ k = k + m + 1
+ v = p(i) + k
+ s = s + p(i) + k
+ end do
+ !$omp end simd
+ if (i.ne.1025) call abort
+ if (u.ne.(36 + 4 + 3 * 1023).or.v.ne.(36 + 4 + 3 * 1024)) call abort
+ foo = s
+ end function foo
+ function bar (p)
+ integer :: p(1024), u, v, i, s, bar
+ s = 0
+ !$omp simd linear(k : m + 1) reduction(+: s) lastprivate(u, v)
+ do i = 1, 1024, t
+ a(i) = a(i) * p(i)
+ u = p(i) + k
+ k = k + m + 1
+ v = p(i) + k
+ s = s + p(i) + k
+ end do
+ !$omp end simd
+ if (i.ne.1025) call abort
+ if (u.ne.(36 + 4 + 3 * 1023).or.v.ne.(36 + 4 + 3 * 1024)) call abort
+ bar = s
+ end function bar
+ function baz (p)
+ integer :: p(1024), u, v, i, s, baz
+ s = 0
+ !$omp simd linear(k : m + 1) reduction(+: s) lastprivate(u, v) &
+ !$omp & linear(i : t)
+ do i = 1, 1024, t
+ a(i) = a(i) * p(i)
+ u = p(i) + k
+ k = k + m + 1
+ v = p(i) + k
+ s = s + p(i) + k
+ end do
+ if (i.ne.1025) call abort
+ if (u.ne.(36 + 4 + 3 * 1023).or.v.ne.(36 + 4 + 3 * 1024)) call abort
+ baz = s
+ end function baz
+end
--- /dev/null
+! { dg-do run }
+! { dg-additional-options "-msse2" { target sse2_runtime } }
+! { dg-additional-options "-mavx" { target avx_runtime } }
+
+ integer :: a(1024), b(1024), k, m, i, s, t
+ k = 4
+ m = 2
+ t = 1
+ do i = 1, 1024
+ a(i) = i - 513
+ b(i) = modulo (i - 52, 39)
+ if (i.lt.52.and.b(i).ne.0) b(i) = b(i) - 39
+ end do
+ s = foo (b)
+ do i = 1, 1024
+ if (a(i).ne.((i - 513) * b(i))) call abort
+ if (i.lt.52.and.modulo (i - 52, 39).ne.0) then
+ if (b(i).ne.(modulo (i - 52, 39) - 39)) call abort
+ else
+ if (b(i).ne.(modulo (i - 52, 39))) call abort
+ end if
+ a(i) = i - 513
+ end do
+ if (k.ne.(4 + 3 * 1024).or.s.ne.1596127) call abort
+ k = 4
+ m = 2
+ t = 1
+ s = bar (b)
+ do i = 1, 1024
+ if (a(i).ne.((i - 513) * b(i))) call abort
+ if (i.lt.52.and.modulo (i - 52, 39).ne.0) then
+ if (b(i).ne.(modulo (i - 52, 39) - 39)) call abort
+ else
+ if (b(i).ne.(modulo (i - 52, 39))) call abort
+ end if
+ a(i) = i - 513
+ end do
+ if (k.ne.(4 + 3 * 1024).or.s.ne.1596127) call abort
+ k = 4
+ m = 2
+ t = 1
+ s = baz (b)
+ do i = 1, 1024
+ if (a(i).ne.((i - 513) * b(i))) call abort
+ if (i.lt.52.and.modulo (i - 52, 39).ne.0) then
+ if (b(i).ne.(modulo (i - 52, 39) - 39)) call abort
+ else
+ if (b(i).ne.(modulo (i - 52, 39))) call abort
+ end if
+ end do
+ if (k.ne.(4 + 3 * 1024).or.s.ne.1596127) call abort
+contains
+ function foo (p)
+ integer :: p(1024), u, v, i, s, foo
+ s = 0
+ !$omp parallel
+ !$omp do simd linear(k : m + 1) reduction(+: s) lastprivate(u, v) &
+ !$omp & schedule (static, 32)
+ do i = 1, 1024
+ a(i) = a(i) * p(i)
+ u = p(i) + k
+ k = k + m + 1
+ v = p(i) + k
+ s = s + p(i) + k
+ end do
+ !$omp end do simd
+ !$omp end parallel
+ if (i.ne.1025) call abort
+ if (u.ne.(36 + 4 + 3 * 1023).or.v.ne.(36 + 4 + 3 * 1024)) call abort
+ foo = s
+ end function foo
+ function bar (p)
+ integer :: p(1024), u, v, i, s, bar
+ s = 0
+ !$omp parallel
+ !$omp do simd linear(k : m + 1) reduction(+: s) lastprivate(u, v) &
+ !$omp & schedule (dynamic, 32)
+ do i = 1, 1024, t
+ a(i) = a(i) * p(i)
+ u = p(i) + k
+ k = k + m + 1
+ v = p(i) + k
+ s = s + p(i) + k
+ end do
+ !$omp end do simd
+ !$omp endparallel
+ if (i.ne.1025) call abort
+ if (u.ne.(36 + 4 + 3 * 1023).or.v.ne.(36 + 4 + 3 * 1024)) call abort
+ bar = s
+ end function bar
+ function baz (p)
+ integer :: p(1024), u, v, i, s, baz
+ s = 0
+ !$omp parallel
+ !$omp do simd linear(k : m + 1) reduction(+: s) lastprivate(u, v) &
+ !$omp & linear(i : t) schedule (static, 8)
+ do i = 1, 1024, t
+ a(i) = a(i) * p(i)
+ u = p(i) + k
+ k = k + m + 1
+ v = p(i) + k
+ s = s + p(i) + k
+ end do
+ !$omp end parallel
+ if (i.ne.1025) call abort
+ if (u.ne.(36 + 4 + 3 * 1023).or.v.ne.(36 + 4 + 3 * 1024)) call abort
+ baz = s
+ end function baz
+end
--- /dev/null
+! { dg-do run }
+! { dg-additional-options "-msse2" { target sse2_runtime } }
+! { dg-additional-options "-mavx" { target avx_runtime } }
+
+ integer :: a(1024), b(1024), k, m, i, s, t
+ k = 4
+ m = 2
+ t = 1
+ do i = 1, 1024
+ a(i) = i - 513
+ b(i) = modulo (i - 52, 39)
+ if (i.lt.52.and.b(i).ne.0) b(i) = b(i) - 39
+ end do
+ s = foo (b)
+ do i = 1, 1024
+ if (a(i).ne.((i - 513) * b(i))) call abort
+ if (i.lt.52.and.modulo (i - 52, 39).ne.0) then
+ if (b(i).ne.(modulo (i - 52, 39) - 39)) call abort
+ else
+ if (b(i).ne.(modulo (i - 52, 39))) call abort
+ end if
+ a(i) = i - 513
+ end do
+ if (k.ne.(4 + 3 * 1024).or.s.ne.1596127) call abort
+ k = 4
+ m = 2
+ t = 1
+ s = bar (b)
+ do i = 1, 1024
+ if (a(i).ne.((i - 513) * b(i))) call abort
+ if (i.lt.52.and.modulo (i - 52, 39).ne.0) then
+ if (b(i).ne.(modulo (i - 52, 39) - 39)) call abort
+ else
+ if (b(i).ne.(modulo (i - 52, 39))) call abort
+ end if
+ a(i) = i - 513
+ end do
+ if (k.ne.(4 + 3 * 1024).or.s.ne.1596127) call abort
+ k = 4
+ m = 2
+ t = 1
+ s = baz (b)
+ do i = 1, 1024
+ if (a(i).ne.((i - 513) * b(i))) call abort
+ if (i.lt.52.and.modulo (i - 52, 39).ne.0) then
+ if (b(i).ne.(modulo (i - 52, 39) - 39)) call abort
+ else
+ if (b(i).ne.(modulo (i - 52, 39))) call abort
+ end if
+ end do
+ if (k.ne.(4 + 3 * 1024).or.s.ne.1596127) call abort
+contains
+ function foo (p)
+ integer :: p(1024), u, v, i, s, foo
+ s = 0
+ !$omp parallel do simd linear(k : m + 1) reduction(+: s) &
+ !$omp & lastprivate(u, v) schedule (static, 32)
+ do i = 1, 1024
+ a(i) = a(i) * p(i)
+ u = p(i) + k
+ k = k + m + 1
+ v = p(i) + k
+ s = s + p(i) + k
+ end do
+ !$omp end parallel do simd
+ if (i.ne.1025) call abort
+ if (u.ne.(36 + 4 + 3 * 1023).or.v.ne.(36 + 4 + 3 * 1024)) call abort
+ foo = s
+ end function foo
+ function bar (p)
+ integer :: p(1024), u, v, i, s, bar
+ s = 0
+ !$omp parallel do simd linear(k : m + 1) reduction(+: s) &
+ !$omp & lastprivate(u, v) schedule (dynamic, 32)
+ do i = 1, 1024, t
+ a(i) = a(i) * p(i)
+ u = p(i) + k
+ k = k + m + 1
+ v = p(i) + k
+ s = s + p(i) + k
+ end do
+ !$omp endparalleldosimd
+ if (i.ne.1025) call abort
+ if (u.ne.(36 + 4 + 3 * 1023).or.v.ne.(36 + 4 + 3 * 1024)) call abort
+ bar = s
+ end function bar
+ function baz (p)
+ integer :: p(1024), u, v, i, s, baz
+ s = 0
+ !$omp parallel do simd linear(k : m + 1) reduction(+: s) &
+ !$omp & lastprivate(u, v) linear(i : t) schedule (static, 8)
+ do i = 1, 1024, t
+ a(i) = a(i) * p(i)
+ u = p(i) + k
+ k = k + m + 1
+ v = p(i) + k
+ s = s + p(i) + k
+ end do
+ if (i.ne.1025) call abort
+ if (u.ne.(36 + 4 + 3 * 1023).or.v.ne.(36 + 4 + 3 * 1024)) call abort
+ baz = s
+ end function baz
+end
--- /dev/null
+! { dg-do run }
+! { dg-additional-options "-msse2" { target sse2_runtime } }
+! { dg-additional-options "-mavx" { target avx_runtime } }
+
+ integer :: i, j, b, c
+ c = 0
+ i = 4
+ j = 4
+ b = 7
+!$omp simd linear(b:2) reduction(+:c)
+ do i = 0, 63
+ c = c + b - (7 + 2 * i)
+ b = b + 2
+ end do
+ if (c /= 0 .or. i /= 64 .or. b /= 7 + 64 * 2) call abort
+ i = 4
+ j = 4
+ b = 7
+!$omp simd linear(b:3) reduction(+:c)
+ do i = 0, 63, 4
+ c = c + b - (7 + i / 4 * 3)
+ b = b + 3
+ end do
+ if (c /= 0 .or. i /= 64 .or. b /= 7 + 16 * 3) call abort
+ i = 4
+ j = 4
+ b = 7
+!$omp simd linear(i) linear(b:2) reduction(+:c)
+ do i = 0, 63
+ c = c + b - (7 + 2 * i)
+ b = b + 2
+ end do
+ if (c /= 0 .or. i /= 64 .or. b /= 7 + 64 * 2) call abort
+ i = 4
+ j = 4
+ b = 7
+!$omp simd linear(i:4) linear(b:3) reduction(+:c)
+ do i = 0, 63, 4
+ c = c + b - (7 + i / 4 * 3)
+ b = b + 3
+ end do
+ if (c /= 0 .or. i /= 64 .or. b /= 7 + 16 * 3) call abort
+ i = 4
+ j = 4
+ b = 7
+!$omp simd collapse(2) linear(b:2) reduction(+:c)
+ do i = 0, 7
+ do j = 0, 7
+ c = c + b - (7 + 2 * j + 2 * 8 * i)
+ b = b + 2
+ end do
+ end do
+ if (c /= 0 .or. i /= 8 .or. j /= 8 .or. b /= 7 + 64 * 2) call abort
+ i = 4
+ j = 4
+ b = 7
+!$omp simd collapse(2) linear(b:2) reduction(+:c) lastprivate (i, j)
+ do i = 0, 7
+ do j = 0, 7
+ c = c + b - (7 + 2 * j + 2 * 8 * i)
+ b = b + 2
+ end do
+ end do
+ if (c /= 0 .or. i /= 8 .or. j /= 8 .or. b /= 7 + 64 * 2) call abort
+ i = 4
+ j = 4
+ b = 7
+!$omp parallel do simd schedule (static, 4) linear(b:2) reduction(+:c)
+ do i = 0, 63
+ c = c + b - (7 + 2 * i)
+ b = b + 2
+ end do
+ if (c /= 0 .or. i /= 64 .or. b /= 7 + 64 * 2) call abort
+ i = 4
+ j = 4
+ b = 7
+!$omp parallel do simd schedule (static, 4) linear(b:3) reduction(+:c)
+ do i = 0, 63, 4
+ c = c + b - (7 + i / 4 * 3)
+ b = b + 3
+ end do
+ if (c /= 0 .or. i /= 64 .or. b /= 7 + 16 * 3) call abort
+ i = 4
+ j = 4
+ b = 7
+!$omp parallel do simd schedule (static, 4) linear(i) linear(b:2) reduction(+:c)
+ do i = 0, 63
+ c = c + b - (7 + 2 * i)
+ b = b + 2
+ end do
+ if (c /= 0 .or. i /= 64 .or. b /= 7 + 64 * 2) call abort
+ i = 4
+ j = 4
+ b = 7
+!$omp parallel do simd schedule (static, 4) linear(i:4) linear(b:3) reduction(+:c)
+ do i = 0, 63, 4
+ c = c + b - (7 + i / 4 * 3)
+ b = b + 3
+ end do
+ if (c /= 0 .or. i /= 64 .or. b /= 7 + 16 * 3) call abort
+ i = 4
+ j = 4
+ b = 7
+!$omp parallel do simd schedule (static, 4) collapse(2) linear(b:2) reduction(+:c)
+ do i = 0, 7
+ do j = 0, 7
+ c = c + b - (7 + 2 * j + 2 * 8 * i)
+ b = b + 2
+ end do
+ end do
+ if (c /= 0 .or. i /= 8 .or. j /= 8 .or. b /= 7 + 64 * 2) call abort
+ i = 4
+ j = 4
+ b = 7
+!$omp parallel do simd schedule (static, 4) collapse(2) linear(b:2) &
+!$omp & reduction(+:c) lastprivate (i, j)
+ do i = 0, 7
+ do j = 0, 7
+ c = c + b - (7 + 2 * j + 2 * 8 * i)
+ b = b + 2
+ end do
+ end do
+ if (c /= 0 .or. i /= 8 .or. j /= 8 .or. b /= 7 + 64 * 2) call abort
+end
--- /dev/null
+! { dg-do run }
+! { dg-additional-options "-msse2" { target sse2_runtime } }
+! { dg-additional-options "-mavx" { target avx_runtime } }
+
+ interface
+ subroutine foo (b, i, j, x)
+ integer, intent (inout) :: b
+ integer, intent (in) :: i, j, x
+ end subroutine
+ end interface
+ integer :: i, j, b, c
+ c = 0
+ i = 4
+ j = 4
+ b = 7
+!$omp simd linear(b:2) reduction(+:c)
+ do i = 0, 63
+ c = c + b - (7 + 2 * i)
+ call foo (b, i, j, 2)
+ end do
+ if (c /= 0 .or. i /= 64 .or. b /= 7 + 64 * 2) call abort
+ i = 4
+ j = 4
+ b = 7
+!$omp simd linear(b:3) reduction(+:c)
+ do i = 0, 63, 4
+ c = c + b - (7 + i / 4 * 3)
+ call foo (b, i, j, 3)
+ end do
+ if (c /= 0 .or. i /= 64 .or. b /= 7 + 16 * 3) call abort
+ i = 4
+ j = 4
+ b = 7
+!$omp simd linear(i) linear(b:2) reduction(+:c)
+ do i = 0, 63
+ c = c + b - (7 + 2 * i)
+ call foo (b, i, j, 2)
+ end do
+ if (c /= 0 .or. i /= 64 .or. b /= 7 + 64 * 2) call abort
+ i = 4
+ j = 4
+ b = 7
+!$omp simd linear(i:4) linear(b:3) reduction(+:c)
+ do i = 0, 63, 4
+ c = c + b - (7 + i / 4 * 3)
+ call foo (b, i, j, 3)
+ end do
+ if (c /= 0 .or. i /= 64 .or. b /= 7 + 16 * 3) call abort
+ i = 4
+ j = 4
+ b = 7
+!$omp simd collapse(2) linear(b:2) reduction(+:c)
+ do i = 0, 7
+ do j = 0, 7
+ c = c + b - (7 + 2 * j + 2 * 8 * i)
+ call foo (b, i, j, 2)
+ end do
+ end do
+ if (c /= 0 .or. i /= 8 .or. j /= 8 .or. b /= 7 + 64 * 2) call abort
+ i = 4
+ j = 4
+ b = 7
+!$omp simd collapse(2) linear(b:2) reduction(+:c) lastprivate (i, j)
+ do i = 0, 7
+ do j = 0, 7
+ c = c + b - (7 + 2 * j + 2 * 8 * i)
+ call foo (b, i, j, 2)
+ end do
+ end do
+ if (c /= 0 .or. i /= 8 .or. j /= 8 .or. b /= 7 + 64 * 2) call abort
+ i = 4
+ j = 4
+ b = 7
+!$omp parallel do simd schedule (static, 4) linear(b:2) reduction(+:c)
+ do i = 0, 63
+ c = c + b - (7 + 2 * i)
+ call foo (b, i, j, 2)
+ end do
+ if (c /= 0 .or. i /= 64 .or. b /= 7 + 64 * 2) call abort
+ i = 4
+ j = 4
+ b = 7
+!$omp parallel do simd schedule (static, 4) linear(b:3) reduction(+:c)
+ do i = 0, 63, 4
+ c = c + b - (7 + i / 4 * 3)
+ call foo (b, i, j, 3)
+ end do
+ if (c /= 0 .or. i /= 64 .or. b /= 7 + 16 * 3) call abort
+ i = 4
+ j = 4
+ b = 7
+!$omp parallel do simd schedule (static, 4) linear(i) linear(b:2) reduction(+:c)
+ do i = 0, 63
+ c = c + b - (7 + 2 * i)
+ call foo (b, i, j, 2)
+ end do
+ if (c /= 0 .or. i /= 64 .or. b /= 7 + 64 * 2) call abort
+ i = 4
+ j = 4
+ b = 7
+!$omp parallel do simd schedule (static, 4) linear(i:4) linear(b:3) reduction(+:c)
+ do i = 0, 63, 4
+ c = c + b - (7 + i / 4 * 3)
+ call foo (b, i, j, 3)
+ end do
+ if (c /= 0 .or. i /= 64 .or. b /= 7 + 16 * 3) call abort
+ i = 4
+ j = 4
+ b = 7
+!$omp parallel do simd schedule (static, 4) collapse(2) linear(b:2) reduction(+:c)
+ do i = 0, 7
+ do j = 0, 7
+ c = c + b - (7 + 2 * j + 2 * 8 * i)
+ call foo (b, i, j, 2)
+ end do
+ end do
+ if (c /= 0 .or. i /= 8 .or. j /= 8 .or. b /= 7 + 64 * 2) call abort
+ i = 4
+ j = 4
+ b = 7
+!$omp parallel do simd schedule (static, 4) collapse(2) linear(b:2) &
+!$omp & reduction(+:c) lastprivate (i, j)
+ do i = 0, 7
+ do j = 0, 7
+ c = c + b - (7 + 2 * j + 2 * 8 * i)
+ call foo (b, i, j, 2)
+ end do
+ end do
+ if (c /= 0 .or. i /= 8 .or. j /= 8 .or. b /= 7 + 64 * 2) call abort
+end
+subroutine foo (b, i, j, x)
+ integer, intent (inout) :: b
+ integer, intent (in) :: i, j, x
+ b = b + (i - i) + (j - j) + x
+end subroutine
--- /dev/null
+! { dg-do run }
+! { dg-additional-options "-msse2" { target sse2_runtime } }
+! { dg-additional-options "-mavx" { target avx_runtime } }
+
+subroutine foo (d, e, f, g, m, n)
+ integer :: i, j, b(2:9), c(3:n), d(:), e(2:n), f(2:,3:), n
+ integer, allocatable :: g(:), h(:), k, m
+ logical :: l
+ l = .false.
+ allocate (h(2:7))
+ i = 4; j = 4; b = 7; c = 8; d = 9; e = 10; f = 11; g = 12; h = 13; k = 14; m = 15
+!$omp simd linear(b)linear(c:2)linear(d:3)linear(e:4)linear(f:5)linear(g:6) &
+!$omp & linear(h:7)linear(k:8)linear(m:9) reduction(.or.:l)
+ do i = 0, 63
+ l = l .or. .not.allocated (g) .or. .not.allocated (h)
+ l = l .or. .not.allocated (k) .or. .not.allocated (m)
+ l = l .or. any (b /= 7 + i) .or. any (c /= 8 + 2 * i)
+ l = l .or. any (d /= 9 + 3 * i) .or. any (e /= 10 + 4 * i)
+ l = l .or. any (f /= 11 + 5 * i) .or. any (g /= 12 + 6 * i)
+ l = l .or. any (h /= 13 + 7 * i) .or. (k /= 14 + 8 * i)
+ l = l .or. (m /= 15 + 9 * i)
+ l = l .or. (lbound (b, 1) /= 2) .or. (ubound (b, 1) /= 9)
+ l = l .or. (lbound (c, 1) /= 3) .or. (ubound (c, 1) /= n)
+ l = l .or. (lbound (d, 1) /= 1) .or. (ubound (d, 1) /= 17)
+ l = l .or. (lbound (e, 1) /= 2) .or. (ubound (e, 1) /= n)
+ l = l .or. (lbound (f, 1) /= 2) .or. (ubound (f, 1) /= 3)
+ l = l .or. (lbound (f, 2) /= 3) .or. (ubound (f, 2) /= 5)
+ l = l .or. (lbound (g, 1) /= 7) .or. (ubound (g, 1) /= 10)
+ l = l .or. (lbound (h, 1) /= 2) .or. (ubound (h, 1) /= 7)
+ b = b + 1; c = c + 2; d = d + 3; e = e + 4; f = f + 5; g = g + 6
+ h = h + 7; k = k + 8; m = m + 9
+ end do
+ if (l .or. i /= 64) call abort
+ if (any (b /= 7 + 64) .or. any (c /= 8 + 2 * 64)) call abort
+ if (any (d /= 9 + 3 * 64) .or. any (e /= 10 + 4 * 64)) call abort
+ if (any (f /= 11 + 5 * 64) .or. any (g /= 12 + 6 * 64)) call abort
+ if (any (h /= 13 + 7 * 64) .or. (k /= 14 + 8 * 64)) call abort
+ if (m /= 15 + 9 * 64) call abort
+ if ((lbound (b, 1) /= 2) .or. (ubound (b, 1) /= 9)) call abort
+ if ((lbound (c, 1) /= 3) .or. (ubound (c, 1) /= n)) call abort
+ if ((lbound (d, 1) /= 1) .or. (ubound (d, 1) /= 17)) call abort
+ if ((lbound (e, 1) /= 2) .or. (ubound (e, 1) /= n)) call abort
+ if ((lbound (f, 1) /= 2) .or. (ubound (f, 1) /= 3)) call abort
+ if ((lbound (f, 2) /= 3) .or. (ubound (f, 2) /= 5)) call abort
+ if ((lbound (g, 1) /= 7) .or. (ubound (g, 1) /= 10)) call abort
+ if ((lbound (h, 1) /= 2) .or. (ubound (h, 1) /= 7)) call abort
+ i = 4; j = 4; b = 7; c = 8; d = 9; e = 10; f = 11; g = 12; h = 13; k = 14; m = 15
+!$omp simd linear(b)linear(c:2)linear(d:3)linear(e:4)linear(f:5)linear(g:6) &
+!$omp & linear(h:7)linear(k:8)linear(m:9) reduction(.or.:l) collapse(2)
+ do i = 0, 7
+ do j = 0, 7
+ l = l .or. .not.allocated (g) .or. .not.allocated (h)
+ l = l .or. .not.allocated (k) .or. .not.allocated (m)
+ l = l .or. any (b /= 7 + (8 * i + j)) .or. any (c /= 8 + 2 * (8 * i + j))
+ l = l .or. any (d /= 9 + 3 * (8 * i + j)) .or. any (e /= 10 + 4 * (8 * i + j))
+ l = l .or. any (f /= 11 + 5 * (8 * i + j)) .or. any (g /= 12 + 6 * (8 * i + j))
+ l = l .or. any (h /= 13 + 7 * (8 * i + j)) .or. (k /= 14 + 8 * (8 * i + j))
+ l = l .or. (m /= 15 + 9 * (8 * i + j))
+ l = l .or. (lbound (b, 1) /= 2) .or. (ubound (b, 1) /= 9)
+ l = l .or. (lbound (c, 1) /= 3) .or. (ubound (c, 1) /= n)
+ l = l .or. (lbound (d, 1) /= 1) .or. (ubound (d, 1) /= 17)
+ l = l .or. (lbound (e, 1) /= 2) .or. (ubound (e, 1) /= n)
+ l = l .or. (lbound (f, 1) /= 2) .or. (ubound (f, 1) /= 3)
+ l = l .or. (lbound (f, 2) /= 3) .or. (ubound (f, 2) /= 5)
+ l = l .or. (lbound (g, 1) /= 7) .or. (ubound (g, 1) /= 10)
+ l = l .or. (lbound (h, 1) /= 2) .or. (ubound (h, 1) /= 7)
+ b = b + 1; c = c + 2; d = d + 3; e = e + 4; f = f + 5; g = g + 6
+ h = h + 7; k = k + 8; m = m + 9
+ end do
+ end do
+ if (l .or. i /= 8 .or. j /= 8) call abort
+ if (any (b /= 7 + 64) .or. any (c /= 8 + 2 * 64)) call abort
+ if (any (d /= 9 + 3 * 64) .or. any (e /= 10 + 4 * 64)) call abort
+ if (any (f /= 11 + 5 * 64) .or. any (g /= 12 + 6 * 64)) call abort
+ if (any (h /= 13 + 7 * 64) .or. (k /= 14 + 8 * 64)) call abort
+ if (m /= 15 + 9 * 64) call abort
+ if ((lbound (b, 1) /= 2) .or. (ubound (b, 1) /= 9)) call abort
+ if ((lbound (c, 1) /= 3) .or. (ubound (c, 1) /= n)) call abort
+ if ((lbound (d, 1) /= 1) .or. (ubound (d, 1) /= 17)) call abort
+ if ((lbound (e, 1) /= 2) .or. (ubound (e, 1) /= n)) call abort
+ if ((lbound (f, 1) /= 2) .or. (ubound (f, 1) /= 3)) call abort
+ if ((lbound (f, 2) /= 3) .or. (ubound (f, 2) /= 5)) call abort
+ if ((lbound (g, 1) /= 7) .or. (ubound (g, 1) /= 10)) call abort
+ if ((lbound (h, 1) /= 2) .or. (ubound (h, 1) /= 7)) call abort
+ i = 4; j = 4; b = 7; c = 8; d = 9; e = 10; f = 11; g = 12; h = 13; k = 14; m = 15
+!$omp parallel do simd linear(b)linear(c:2)linear(d:3)linear(e:4)linear(f:5) &
+!$omp & linear(g:6)linear(h:7)linear(k:8)linear(m:9) reduction(.or.:l)
+ do i = 0, 63
+ l = l .or. .not.allocated (g) .or. .not.allocated (h)
+ l = l .or. .not.allocated (k) .or. .not.allocated (m)
+ l = l .or. any (b /= 7 + i) .or. any (c /= 8 + 2 * i)
+ l = l .or. any (d /= 9 + 3 * i) .or. any (e /= 10 + 4 * i)
+ l = l .or. any (f /= 11 + 5 * i) .or. any (g /= 12 + 6 * i)
+ l = l .or. any (h /= 13 + 7 * i) .or. (k /= 14 + 8 * i)
+ l = l .or. (m /= 15 + 9 * i)
+ l = l .or. (lbound (b, 1) /= 2) .or. (ubound (b, 1) /= 9)
+ l = l .or. (lbound (c, 1) /= 3) .or. (ubound (c, 1) /= n)
+ l = l .or. (lbound (d, 1) /= 1) .or. (ubound (d, 1) /= 17)
+ l = l .or. (lbound (e, 1) /= 2) .or. (ubound (e, 1) /= n)
+ l = l .or. (lbound (f, 1) /= 2) .or. (ubound (f, 1) /= 3)
+ l = l .or. (lbound (f, 2) /= 3) .or. (ubound (f, 2) /= 5)
+ l = l .or. (lbound (g, 1) /= 7) .or. (ubound (g, 1) /= 10)
+ l = l .or. (lbound (h, 1) /= 2) .or. (ubound (h, 1) /= 7)
+ b = b + 1; c = c + 2; d = d + 3; e = e + 4; f = f + 5; g = g + 6
+ h = h + 7; k = k + 8; m = m + 9
+ end do
+ if (l .or. i /= 64) call abort
+ if (any (b /= 7 + 64) .or. any (c /= 8 + 2 * 64)) call abort
+ if (any (d /= 9 + 3 * 64) .or. any (e /= 10 + 4 * 64)) call abort
+ if (any (f /= 11 + 5 * 64) .or. any (g /= 12 + 6 * 64)) call abort
+ if (any (h /= 13 + 7 * 64) .or. (k /= 14 + 8 * 64)) call abort
+ if (m /= 15 + 9 * 64) call abort
+ if ((lbound (b, 1) /= 2) .or. (ubound (b, 1) /= 9)) call abort
+ if ((lbound (c, 1) /= 3) .or. (ubound (c, 1) /= n)) call abort
+ if ((lbound (d, 1) /= 1) .or. (ubound (d, 1) /= 17)) call abort
+ if ((lbound (e, 1) /= 2) .or. (ubound (e, 1) /= n)) call abort
+ if ((lbound (f, 1) /= 2) .or. (ubound (f, 1) /= 3)) call abort
+ if ((lbound (f, 2) /= 3) .or. (ubound (f, 2) /= 5)) call abort
+ if ((lbound (g, 1) /= 7) .or. (ubound (g, 1) /= 10)) call abort
+ if ((lbound (h, 1) /= 2) .or. (ubound (h, 1) /= 7)) call abort
+ i = 4; j = 4; b = 7; c = 8; d = 9; e = 10; f = 11; g = 12; h = 13; k = 14; m = 15
+!$omp parallel do simd linear(b)linear(c:2)linear(d:3)linear(e:4)linear(f:5) &
+!$omp & linear(g:6)linear(h:7)linear(k:8)linear(m:9) reduction(.or.:l) collapse(2)
+ do i = 0, 7
+ do j = 0, 7
+ l = l .or. .not.allocated (g) .or. .not.allocated (h)
+ l = l .or. .not.allocated (k) .or. .not.allocated (m)
+ l = l .or. any (b /= 7 + (8 * i + j)) .or. any (c /= 8 + 2 * (8 * i + j))
+ l = l .or. any (d /= 9 + 3 * (8 * i + j)) .or. any (e /= 10 + 4 * (8 * i + j))
+ l = l .or. any (f /= 11 + 5 * (8 * i + j)) .or. any (g /= 12 + 6 * (8 * i + j))
+ l = l .or. any (h /= 13 + 7 * (8 * i + j)) .or. (k /= 14 + 8 * (8 * i + j))
+ l = l .or. (m /= 15 + 9 * (8 * i + j))
+ l = l .or. (lbound (b, 1) /= 2) .or. (ubound (b, 1) /= 9)
+ l = l .or. (lbound (c, 1) /= 3) .or. (ubound (c, 1) /= n)
+ l = l .or. (lbound (d, 1) /= 1) .or. (ubound (d, 1) /= 17)
+ l = l .or. (lbound (e, 1) /= 2) .or. (ubound (e, 1) /= n)
+ l = l .or. (lbound (f, 1) /= 2) .or. (ubound (f, 1) /= 3)
+ l = l .or. (lbound (f, 2) /= 3) .or. (ubound (f, 2) /= 5)
+ l = l .or. (lbound (g, 1) /= 7) .or. (ubound (g, 1) /= 10)
+ l = l .or. (lbound (h, 1) /= 2) .or. (ubound (h, 1) /= 7)
+ b = b + 1; c = c + 2; d = d + 3; e = e + 4; f = f + 5; g = g + 6
+ h = h + 7; k = k + 8; m = m + 9
+ end do
+ end do
+ if (l .or. i /= 8 .or. j /= 8) call abort
+ if (any (b /= 7 + 64) .or. any (c /= 8 + 2 * 64)) call abort
+ if (any (d /= 9 + 3 * 64) .or. any (e /= 10 + 4 * 64)) call abort
+ if (any (f /= 11 + 5 * 64) .or. any (g /= 12 + 6 * 64)) call abort
+ if (any (h /= 13 + 7 * 64) .or. (k /= 14 + 8 * 64)) call abort
+ if (m /= 15 + 9 * 64) call abort
+ if ((lbound (b, 1) /= 2) .or. (ubound (b, 1) /= 9)) call abort
+ if ((lbound (c, 1) /= 3) .or. (ubound (c, 1) /= n)) call abort
+ if ((lbound (d, 1) /= 1) .or. (ubound (d, 1) /= 17)) call abort
+ if ((lbound (e, 1) /= 2) .or. (ubound (e, 1) /= n)) call abort
+ if ((lbound (f, 1) /= 2) .or. (ubound (f, 1) /= 3)) call abort
+ if ((lbound (f, 2) /= 3) .or. (ubound (f, 2) /= 5)) call abort
+ if ((lbound (g, 1) /= 7) .or. (ubound (g, 1) /= 10)) call abort
+ if ((lbound (h, 1) /= 2) .or. (ubound (h, 1) /= 7)) call abort
+end subroutine
+
+ interface
+ subroutine foo (d, e, f, g, m, n)
+ integer :: d(:), e(2:n), f(2:,3:), n
+ integer, allocatable :: g(:), m
+ end subroutine
+ end interface
+ integer, parameter :: n = 8
+ integer :: d(2:18), e(3:n+1), f(5:6,7:9)
+ integer, allocatable :: g(:), m
+ allocate (g(7:10))
+ call foo (d, e, f, g, m, n)
+end
--- /dev/null
+! { dg-do run }
+
+module target1
+contains
+ subroutine foo (p, v, w, n)
+ double precision, pointer :: p(:), v(:), w(:)
+ double precision :: q(n)
+ integer :: i, n
+ !$omp target if (n > 256) map (to: v(1:n), w(:n)) map (from: p(1:n), q)
+ !$omp parallel do simd
+ do i = 1, n
+ p(i) = v(i) * w(i)
+ q(i) = p(i)
+ end do
+ !$omp end target
+ if (any (p /= q)) call abort
+ do i = 1, n
+ if (p(i) /= i * iand (i, 63)) call abort
+ end do
+ !$omp target data if (n > 256) map (to: v(1:n), w) map (from: p, q)
+ !$omp target if (n > 256)
+ do i = 1, n
+ p(i) = 1.0
+ q(i) = 2.0
+ end do
+ !$omp end target
+ !$omp target if (n > 256)
+ do i = 1, n
+ p(i) = p(i) + v(i) * w(i)
+ q(i) = q(i) + v(i) * w(i)
+ end do
+ !$omp end target
+ !$omp target if (n > 256)
+ !$omp teams distribute parallel do simd linear(i:1)
+ do i = 1, n
+ p(i) = p(i) + 2.0
+ q(i) = q(i) + 3.0
+ end do
+ !$omp end target
+ !$omp end target data
+ if (any (p + 2.0 /= q)) call abort
+ end subroutine
+end module target1
+ use target1, only : foo
+ integer :: n, i
+ double precision, pointer :: p(:), v(:), w(:)
+ n = 10000
+ allocate (p(n), v(n), w(n))
+ do i = 1, n
+ v(i) = i
+ w(i) = iand (i, 63)
+ end do
+ call foo (p, v, w, n)
+ do i = 1, n
+ if (p(i) /= i * iand (i, 63) + 3) call abort
+ end do
+ deallocate (p, v, w)
+end
--- /dev/null
+! { dg-do run }
+! { dg-options "-fopenmp -ffree-line-length-160" }
+
+module target2
+contains
+ subroutine foo (a, b, c, d, e, f, g, n, q)
+ integer :: n, q
+ integer :: a, b(3:n), c(5:), d(2:*), e(:,:)
+ integer, pointer :: f, g(:)
+ integer :: h, i(3:n)
+ integer, pointer :: j, k(:)
+ logical :: r
+ allocate (j, k(4:n))
+ h = 14
+ i = 15
+ j = 16
+ k = 17
+ !$omp target map (to: a, b, c, d(2:n+1), e, f, g, h, i, j, k, n) map (from: r)
+ r = a /= 7
+ r = r .or. (any (b /= 8)) .or. (lbound (b, 1) /= 3) .or. (ubound (b, 1) /= n)
+ r = r .or. (any (c /= 9)) .or. (lbound (c, 1) /= 5) .or. (ubound (c, 1) /= n + 4)
+ r = r .or. (any (d(2:n+1) /= 10)) .or. (lbound (d, 1) /= 2)
+ r = r .or. (any (e /= 11)) .or. (lbound (e, 1) /= 1) .or. (ubound (e, 1) /= 2)
+ r = r .or. (lbound (e, 2) /= 1) .or. (ubound (e, 2) /= 2)
+ r = r .or. (f /= 12)
+ r = r .or. (any (g /= 13)) .or. (lbound (g, 1) /= 3) .or. (ubound (g, 1) /= n)
+ r = r .or. (h /= 14)
+ r = r .or. (any (i /= 15)) .or. (lbound (i, 1) /= 3) .or. (ubound (i, 1) /= n)
+ r = r .or. (j /= 16)
+ r = r .or. (any (k /= 17)) .or. (lbound (k, 1) /= 4) .or. (ubound (k, 1) /= n)
+ !$omp end target
+ if (r) call abort
+ !$omp target map (to: b(3:n), c(5:n+4), d(2:n+1), e(1:,:2), g(3:n), i(3:n), k(4:n), n) map (from: r)
+ r = (any (b /= 8)) .or. (lbound (b, 1) /= 3) .or. (ubound (b, 1) /= n)
+ r = r .or. (any (c /= 9)) .or. (lbound (c, 1) /= 5) .or. (ubound (c, 1) /= n + 4)
+ r = r .or. (any (d(2:n+1) /= 10)) .or. (lbound (d, 1) /= 2)
+ r = r .or. (any (e /= 11)) .or. (lbound (e, 1) /= 1) .or. (ubound (e, 1) /= 2)
+ r = r .or. (lbound (e, 2) /= 1) .or. (ubound (e, 2) /= 2)
+ r = r .or. (any (g /= 13)) .or. (lbound (g, 1) /= 3) .or. (ubound (g, 1) /= n)
+ r = r .or. (any (i /= 15)) .or. (lbound (i, 1) /= 3) .or. (ubound (i, 1) /= n)
+ r = r .or. (any (k /= 17)) .or. (lbound (k, 1) /= 4) .or. (ubound (k, 1) /= n)
+ !$omp end target
+ if (r) call abort
+ !$omp target map (to: b(5:n-2), c(7:n), d(4:n-2), e(1:,2:), g(5:n-3), i(6:n-4), k(5:n-5), n) map (from: r)
+ r = (any (b(5:n-2) /= 8)) .or. (lbound (b, 1) /= 3) .or. (ubound (b, 1) /= n)
+ r = r .or. (any (c(7:n) /= 9)) .or. (lbound (c, 1) /= 5) .or. (ubound (c, 1) /= n + 4)
+ r = r .or. (any (d(4:n-2) /= 10)) .or. (lbound (d, 1) /= 2)
+ r = r .or. (any (e(1:,2:) /= 11)) .or. (lbound (e, 1) /= 1) .or. (ubound (e, 1) /= 2)
+ r = r .or. (lbound (e, 2) /= 1) .or. (ubound (e, 2) /= 2)
+ r = r .or. (any (g(5:n-3) /= 13)) .or. (lbound (g, 1) /= 3) .or. (ubound (g, 1) /= n)
+ r = r .or. (any (i(6:n-4) /= 15)) .or. (lbound (i, 1) /= 3) .or. (ubound (i, 1) /= n)
+ r = r .or. (any (k(5:n-5) /= 17)) .or. (lbound (k, 1) /= 4) .or. (ubound (k, 1) /= n)
+ !$omp end target
+ !$omp target map (to: b(q+5:n-2+q), c(q+7:q+n), d(q+4:q+n-2), e(1:q+2,2:q+2), g(5+q:n-3+q), &
+ !$omp & i(6+q:n-4+q), k(5+q:n-5+q), n) map (from: r)
+ r = (any (b(5:n-2) /= 8)) .or. (lbound (b, 1) /= 3) .or. (ubound (b, 1) /= n)
+ r = r .or. (any (c(7:n) /= 9)) .or. (lbound (c, 1) /= 5) .or. (ubound (c, 1) /= n + 4)
+ r = r .or. (any (d(4:n-2) /= 10)) .or. (lbound (d, 1) /= 2)
+ r = r .or. (any (e(1:,2:) /= 11)) .or. (lbound (e, 1) /= 1) .or. (ubound (e, 1) /= 2)
+ r = r .or. (lbound (e, 2) /= 1) .or. (ubound (e, 2) /= 2)
+ r = r .or. (any (g(5:n-3) /= 13)) .or. (lbound (g, 1) /= 3) .or. (ubound (g, 1) /= n)
+ r = r .or. (any (i(6:n-4) /= 15)) .or. (lbound (i, 1) /= 3) .or. (ubound (i, 1) /= n)
+ r = r .or. (any (k(5:n-5) /= 17)) .or. (lbound (k, 1) /= 4) .or. (ubound (k, 1) /= n)
+ !$omp end target
+ if (r) call abort
+ !$omp target map (to: d(2:n+1), n)
+ r = a /= 7
+ r = r .or. (any (b /= 8)) .or. (lbound (b, 1) /= 3) .or. (ubound (b, 1) /= n)
+ r = r .or. (any (c /= 9)) .or. (lbound (c, 1) /= 5) .or. (ubound (c, 1) /= n + 4)
+ r = r .or. (any (d(2:n+1) /= 10)) .or. (lbound (d, 1) /= 2)
+ r = r .or. (any (e /= 11)) .or. (lbound (e, 1) /= 1) .or. (ubound (e, 1) /= 2)
+ r = r .or. (lbound (e, 2) /= 1) .or. (ubound (e, 2) /= 2)
+ r = r .or. (f /= 12)
+ r = r .or. (any (g /= 13)) .or. (lbound (g, 1) /= 3) .or. (ubound (g, 1) /= n)
+ r = r .or. (h /= 14)
+ r = r .or. (any (i /= 15)) .or. (lbound (i, 1) /= 3) .or. (ubound (i, 1) /= n)
+ r = r .or. (j /= 16)
+ r = r .or. (any (k /= 17)) .or. (lbound (k, 1) /= 4) .or. (ubound (k, 1) /= n)
+ !$omp end target
+ if (r) call abort
+ end subroutine foo
+end module target2
+ use target2, only : foo
+ integer, parameter :: n = 15, q = 0
+ integer :: a, b(2:n-1), c(n), d(n), e(3:4, 3:4)
+ integer, pointer :: f, g(:)
+ allocate (f, g(3:n))
+ a = 7
+ b = 8
+ c = 9
+ d = 10
+ e = 11
+ f = 12
+ g = 13
+ call foo (a, b, c, d, e, f, g, n, q)
+end
--- /dev/null
+! { dg-do run }
+
+module target3
+contains
+ subroutine foo (f, g)
+ integer :: n
+ integer, pointer :: f, g(:)
+ integer, pointer :: j, k(:)
+ logical :: r
+ nullify (j)
+ k => null ()
+ !$omp target map (tofrom: f, g, j, k) map (from: r)
+ r = associated (f) .or. associated (g)
+ r = r .or. associated (j) .or. associated (k)
+ !$omp end target
+ if (r) call abort
+ !$omp target
+ r = associated (f) .or. associated (g)
+ r = r .or. associated (j) .or. associated (k)
+ !$omp end target
+ if (r) call abort
+ end subroutine foo
+end module target3
+ use target3, only : foo
+ integer, pointer :: f, g(:)
+ f => null ()
+ nullify (g)
+ call foo (f, g)
+end
--- /dev/null
+! { dg-do run }
+
+module target4
+contains
+ subroutine foo (a,m,n)
+ integer :: m,n,i,j
+ double precision :: a(m, n), t
+ !$omp target data map(a) map(to: m, n)
+ do i=1,n
+ t = 0.0d0
+ !$omp target
+ !$omp parallel do reduction(+:t)
+ do j=1,m
+ t = t + a(j,i) * a(j,i)
+ end do
+ !$omp end target
+ t = 2.0d0 * t
+ !$omp target
+ !$omp parallel do
+ do j=1,m
+ a(j,i) = a(j,i) * t
+ end do
+ !$omp end target
+ end do
+ !$omp end target data
+ end subroutine foo
+end module target4
+ use target4, only : foo
+ integer :: i, j
+ double precision :: a(8, 9), res(8, 9)
+ do i = 1, 8
+ do j = 1, 9
+ a(i, j) = i + j
+ end do
+ end do
+ call foo (a, 8, 9)
+ res = reshape ((/ 1136.0d0, 1704.0d0, 2272.0d0, 2840.0d0, 3408.0d0, 3976.0d0, &
+& 4544.0d0, 5112.0d0, 2280.0d0, 3040.0d0, 3800.0d0, 4560.0d0, 5320.0d0, 6080.0d0, &
+& 6840.0d0, 7600.0d0, 3936.0d0, 4920.0d0, 5904.0d0, 6888.0d0, 7872.0d0, 8856.0d0, &
+& 9840.0d0, 10824.0d0, 6200.0d0, 7440.0d0, 8680.0d0, 9920.0d0, 11160.0d0, 12400.0d0, &
+& 13640.0d0, 14880.0d0, 9168.0d0, 10696.0d0, 12224.0d0, 13752.0d0, 15280.0d0, 16808.0d0, &
+& 18336.0d0, 19864.0d0, 12936.0d0, 14784.0d0, 16632.0d0, 18480.0d0, 20328.0d0, 22176.0d0, &
+& 24024.0d0, 25872.0d0, 17600.0d0, 19800.0d0, 22000.0d0, 24200.0d0, 26400.0d0, 28600.0d0, &
+& 30800.0d0, 33000.0d0, 23256.0d0, 25840.0d0, 28424.0d0, 31008.0d0, 33592.0d0, 36176.0d0, &
+& 38760.0d0, 41344.0d0, 30000.0d0, 33000.0d0, 36000.0d0, 39000.0d0, 42000.0d0, 45000.0d0, &
+& 48000.0d0, 51000.0d0 /), (/ 8, 9 /))
+ if (any (a /= res)) call abort
+end
--- /dev/null
+! { dg-do compile }
+! { dg-options "-fopenmp" }
+
+ integer :: r
+ r = 0
+ call foo (r)
+ if (r /= 11) call abort
+contains
+ subroutine foo (r)
+ integer :: i, r
+ !$omp parallel
+ !$omp single
+ !$omp target teams distribute parallel do reduction (+: r)
+ do i = 1, 10
+ r = r + 1
+ end do
+ r = r + 1
+ !$omp end single
+ !$omp end parallel
+ end subroutine
+end
--- /dev/null
+! { dg-do run }
+
+module target6
+contains
+ subroutine foo (p, v, w, n)
+ double precision, pointer :: p(:), v(:), w(:)
+ double precision :: q(n)
+ integer :: i, n
+ !$omp target data if (n > 256) map (to: v(1:n), w(:n)) map (from: p(1:n), q)
+ !$omp target if (n > 256)
+ !$omp parallel do simd
+ do i = 1, n
+ p(i) = v(i) * w(i)
+ q(i) = p(i)
+ end do
+ !$omp end target
+ !$omp target update if (n > 256) from (p)
+ do i = 1, n
+ if (p(i) /= i * iand (i, 63)) call abort
+ v(i) = v(i) + 1
+ end do
+ !$omp target update if (n > 256) to (v(1:n))
+ !$omp target if (n > 256)
+ !$omp parallel do simd
+ do i = 1, n
+ p(i) = v(i) * w(i)
+ end do
+ !$omp end target
+ !$omp end target data
+ do i = 1, n
+ if (q(i) /= (v(i) - 1) * w(i)) call abort
+ if (p(i) /= q(i) + w(i)) call abort
+ end do
+ end subroutine
+end module target6
+ use target6, only : foo
+ integer :: n, i
+ double precision, pointer :: p(:), v(:), w(:)
+ n = 10000
+ allocate (p(n), v(n), w(n))
+ do i = 1, n
+ v(i) = i
+ w(i) = iand (i, 63)
+ end do
+ call foo (p, v, w, n)
+ do i = 1, n
+ if (p(i) /= (i + 1) * iand (i, 63)) call abort
+ end do
+ deallocate (p, v, w)
+end
--- /dev/null
+! { dg-do run }
+
+ interface
+ real function foo (x)
+ !$omp declare target
+ real, intent(in) :: x
+ end function foo
+ end interface
+ integer, parameter :: n = 1000
+ integer, parameter :: c = 100
+ integer :: i, j
+ real :: a(n)
+ do i = 1, n
+ a(i) = i
+ end do
+ !$omp parallel
+ !$omp single
+ do i = 1, n, c
+ !$omp task shared(a)
+ !$omp target map(a(i:i+c-1))
+ !$omp parallel do
+ do j = i, i + c - 1
+ a(j) = foo (a(j))
+ end do
+ !$omp end target
+ !$omp end task
+ end do
+ !$omp end single
+ !$omp end parallel
+ do i = 1, n
+ if (a(i) /= i + 1) call abort
+ end do
+end
+real function foo (x)
+ !$omp declare target
+ real, intent(in) :: x
+ foo = x + 1
+end function foo
--- /dev/null
+! { dg-do run }
+
+ integer, parameter :: n = 1000
+ integer, parameter :: c = 100
+ integer :: i, j
+ real :: a(n)
+ do i = 1, n
+ a(i) = i
+ end do
+ !$omp parallel
+ !$omp single
+ do i = 1, n, c
+ !$omp task shared(a)
+ !$omp target map(a(i:i+c-1))
+ !$omp parallel do
+ do j = i, i + c - 1
+ a(j) = foo (a(j))
+ end do
+ !$omp end target
+ !$omp end task
+ end do
+ !$omp end single
+ !$omp end parallel
+ do i = 1, n
+ if (a(i) /= i + 1) call abort
+ end do
+contains
+ real function foo (x)
+ !$omp declare target
+ real, intent(in) :: x
+ foo = x + 1
+ end function foo
+end
--- /dev/null
+ integer :: v(16), i
+ do i = 1, 16
+ v(i) = i
+ end do
+
+ !$omp parallel num_threads (4)
+ !$omp single
+ !$omp taskgroup
+ do i = 1, 16, 2
+ !$omp task
+ !$omp task
+ v(i) = v(i) + 1
+ !$omp end task
+ !$omp task
+ v(i + 1) = v(i + 1) + 1
+ !$omp end task
+ !$omp end task
+ end do
+ !$omp end taskgroup
+ do i = 1, 16
+ if (v(i).ne.(i + 1)) call abort
+ end do
+ !$omp taskgroup
+ do i = 1, 16, 2
+ !$omp task
+ !$omp task
+ v(i) = v(i) + 1
+ !$omp endtask
+ !$omp task
+ v(i + 1) = v(i + 1) + 1
+ !$omp endtask
+ !$omp taskwait
+ !$omp endtask
+ end do
+ !$omp endtaskgroup
+ do i = 1, 16
+ if (v(i).ne.(i + 2)) call abort
+ end do
+ !$omp taskgroup
+ do i = 1, 16, 2
+ !$omp task
+ !$omp task
+ v(i) = v(i) + 1
+ !$omp end task
+ v(i + 1) = v(i + 1) + 1
+ !$omp end task
+ end do
+ !$omp taskwait
+ do i = 1, 16, 2
+ !$omp task
+ v(i + 1) = v(i + 1) + 1
+ !$omp end task
+ end do
+ !$omp end taskgroup
+ do i = 1, 16, 2
+ if (v(i).ne.(i + 3)) call abort
+ if (v(i + 1).ne.(i + 5)) call abort
+ end do
+ !$omp taskgroup
+ do i = 1, 16, 2
+ !$omp taskgroup
+ !$omp task
+ v(i) = v(i) + 1
+ !$omp end task
+ !$omp task
+ v(i + 1) = v(i + 1) + 1
+ !$omp end task
+ !$omp end taskgroup
+ if (v(i).ne.(i + 4).or.v(i + 1).ne.(i + 6)) call abort
+ !$omp task
+ v(i) = v(i) + 1
+ !$omp end task
+ end do
+ !$omp end taskgroup
+ do i = 1, 16
+ if (v(i).ne.(i + 5)) call abort
+ end do
+ !$omp end single
+ !$omp end parallel
+end
--- /dev/null
+! { dg-do run }
+
+module udr1
+ type dt
+ integer :: x = 7
+ integer :: y = 9
+ end type
+end module udr1
+ use udr1, only : dt
+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in)
+ integer :: i, j
+!$omp declare reduction (bar : integer : &
+!$omp & omp_out = omp_out + iand (omp_in, -4)) initializer (omp_priv = 3)
+ type (dt) :: d
+!$omp declare reduction (+ : dt : omp_out%x = omp_out%x &
+!$omp & + iand (omp_in%x, -8))
+!$omp declare reduction (foo : dt : omp_out%x = iand (omp_in%x, -8) &
+!$omp & + omp_out%x) initializer (omp_priv = dt (5, 21))
+ interface operator (+)
+ function notdefined(x, y)
+ use udr1, only : dt
+ type(dt), intent (in) :: x, y
+ type(dt) :: notdefined
+ end function
+ end interface
+ j = 0
+!$omp parallel do reduction (foo : j)
+ do i = 1, 100
+ j = j + i
+ end do
+ if (j .ne. 5050) call abort
+ j = 3
+!$omp parallel do reduction (bar : j)
+ do i = 1, 100
+ j = j + 4 * i
+ end do
+ if (j .ne. (5050 * 4 + 3)) call abort
+!$omp parallel do reduction (+ : d)
+ do i = 1, 100
+ if (d%y .ne. 9) call abort
+ d%x = d%x + 8 * i
+ end do
+ if (d%x .ne. (5050 * 8 + 7) .or. d%y .ne. 9) call abort
+ d = dt (5, 21)
+!$omp parallel do reduction (foo : d)
+ do i = 1, 100
+ if (d%y .ne. 21) call abort
+ d%x = d%x + 8 * i
+ end do
+ if (d%x .ne. (5050 * 8 + 5) .or. d%y .ne. 21) call abort
+end
--- /dev/null
+! { dg-do run }
+
+module udr10m
+ type dt
+ integer :: x = 0
+ end type
+!$omp declare reduction(.add.:dt:omp_out=omp_out.add.omp_in)
+!$omp declare reduction(+:dt:omp_out=omp_out+omp_in)
+ interface operator(+)
+ module procedure addme
+ end interface
+ interface operator(.add.)
+ module procedure addme
+ end interface
+contains
+ type(dt) function addme (x, y)
+ type (dt), intent (in) :: x, y
+ addme%x = x%x + y%x
+ end function addme
+end module udr10m
+program udr10
+ use udr10m, only : operator(.localadd.) => operator(.add.), &
+& operator(+), dl => dt
+ type(dl) :: j, k
+ integer :: i
+!$omp parallel do reduction(+:j) reduction(.localadd.:k)
+ do i = 1, 100
+ j = j .localadd. dl(i)
+ k = k + dl(i * 2)
+ end do
+ if (j%x /= 5050 .or. k%x /= 10100) call abort
+end
--- /dev/null
+! { dg-do run }
+
+module udr11
+ type dt
+ integer :: x = 0
+ end type
+end module udr11
+ use udr11, only : dt
+!$omp declare reduction(+:dt:omp_out%x=omp_out%x+omp_in%x)
+!$omp declare reduction(-:dt:omp_out%x=omp_out%x+omp_in%x)
+!$omp declare reduction(*:dt:omp_out%x=omp_out%x+omp_in%x)
+!$omp declare reduction(.and.:dt:omp_out%x=omp_out%x+omp_in%x)
+!$omp declare reduction(.or.:dt:omp_out%x=omp_out%x+3*omp_in%x)
+!$omp declare reduction(.eqv.:dt:omp_out%x=omp_out%x+omp_in%x)
+!$omp declare reduction(.neqv.:dt:omp_out%x=omp_out%x+omp_in%x)
+!$omp declare reduction(min:dt:omp_out%x=omp_out%x+omp_in%x)
+!$omp declare reduction(max:dt:omp_out%x=omp_out%x+omp_in%x)
+!$omp declare reduction(iand:dt:omp_out%x=omp_out%x+omp_in%x)
+!$omp declare reduction(ior:dt:omp_out%x=omp_out%x+omp_in%x)
+!$omp declare reduction(ieor:dt:omp_out%x=omp_out%x+omp_in%x)
+ interface operator(.and.)
+ function addme1 (x, y)
+ use udr11, only : dt
+ type (dt), intent (in) :: x, y
+ type(dt) :: addme1
+ end function addme1
+ end interface
+ interface operator(.or.)
+ function addme2 (x, y)
+ use udr11, only : dt
+ type (dt), intent (in) :: x, y
+ type(dt) :: addme2
+ end function addme2
+ end interface
+ interface operator(.eqv.)
+ function addme3 (x, y)
+ use udr11, only : dt
+ type (dt), intent (in) :: x, y
+ type(dt) :: addme3
+ end function addme3
+ end interface
+ interface operator(.neqv.)
+ function addme4 (x, y)
+ use udr11, only : dt
+ type (dt), intent (in) :: x, y
+ type(dt) :: addme4
+ end function addme4
+ end interface
+ interface operator(+)
+ function addme5 (x, y)
+ use udr11, only : dt
+ type (dt), intent (in) :: x, y
+ type(dt) :: addme5
+ end function addme5
+ end interface
+ interface operator(-)
+ function addme6 (x, y)
+ use udr11, only : dt
+ type (dt), intent (in) :: x, y
+ type(dt) :: addme6
+ end function addme6
+ end interface
+ interface operator(*)
+ function addme7 (x, y)
+ use udr11, only : dt
+ type (dt), intent (in) :: x, y
+ type(dt) :: addme7
+ end function addme7
+ end interface
+ type(dt) :: j, k, l, m, n, o, p, q, r, s, t, u
+ integer :: i
+!$omp parallel do reduction(.and.:j) reduction(.or.:k) &
+!$omp & reduction(.eqv.:l) reduction(.neqv.:m) &
+!$omp & reduction(min:n) reduction(max:o) &
+!$omp & reduction(iand:p) reduction(ior:q) reduction (ieor:r) &
+!$omp & reduction(+:s) reduction(-:t) reduction(*:u)
+ do i = 1, 100
+ j%x = j%x + i
+ k%x = k%x + 2 * i
+ l%x = l%x + 3 * i
+ m%x = m%x + i
+ n%x = n%x + 2 * i
+ o%x = o%x + 3 * i
+ p%x = p%x + i
+ q%x = q%x + 2 * i
+ r%x = r%x + 3 * i
+ s%x = s%x + i
+ t%x = t%x + 2 * i
+ u%x = u%x + 3 * i
+ end do
+ if (j%x /= 5050 .or. k%x /= 30300 .or. l%x /= 15150) call abort
+ if (m%x /= 5050 .or. n%x /= 10100 .or. o%x /= 15150) call abort
+ if (p%x /= 5050 .or. q%x /= 10100 .or. r%x /= 15150) call abort
+ if (s%x /= 5050 .or. t%x /= 10100 .or. u%x /= 15150) call abort
+end
--- /dev/null
+! { dg-do run }
+
+ interface
+ elemental subroutine sub1 (x, y)
+ integer, intent(in) :: y
+ integer, intent(out) :: x
+ end subroutine
+ elemental function fn2 (x)
+ integer, intent(in) :: x
+ integer :: fn2
+ end function
+ end interface
+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0)
+!$omp declare reduction (bar : integer : omp_out = fn1 (omp_out, omp_in)) &
+!$omp & initializer (sub1 (omp_priv, omp_orig))
+!$omp declare reduction (baz : integer : sub2 (omp_out, omp_in)) &
+!$omp initializer (omp_priv = fn2 (omp_orig))
+ interface
+ elemental function fn1 (x, y)
+ integer, intent(in) :: x, y
+ integer :: fn1
+ end function
+ elemental subroutine sub2 (x, y)
+ integer, intent(in) :: y
+ integer, intent(inout) :: x
+ end subroutine
+ end interface
+ integer :: a(10), b, r
+ a(:) = 0
+ b = 0
+ r = 0
+!$omp parallel reduction (foo : a, b) reduction (+: r)
+ a = a + 2
+ b = b + 3
+ r = r + 1
+!$omp end parallel
+ if (any (a /= 2 * r) .or. b /= 3 * r) call abort
+ a(:) = 0
+ b = 0
+ r = 0
+!$omp parallel reduction (bar : a, b) reduction (+: r)
+ a = a + 2
+ b = b + 3
+ r = r + 1
+!$omp end parallel
+ if (any (a /= 4 * r) .or. b /= 6 * r) call abort
+ a(:) = 0
+ b = 0
+ r = 0
+!$omp parallel reduction (baz : a, b) reduction (+: r)
+ a = a + 2
+ b = b + 3
+ r = r + 1
+!$omp end parallel
+ if (any (a /= 2 * r) .or. b /= 3 * r) call abort
+end
+elemental function fn1 (x, y)
+ integer, intent(in) :: x, y
+ integer :: fn1
+ fn1 = x + 2 * y
+end function
+elemental subroutine sub1 (x, y)
+ integer, intent(in) :: y
+ integer, intent(out) :: x
+ x = 0
+end subroutine
+elemental function fn2 (x)
+ integer, intent(in) :: x
+ integer :: fn2
+ fn2 = x
+end function
+elemental subroutine sub2 (x, y)
+ integer, intent(inout) :: x
+ integer, intent(in) :: y
+ x = x + y
+end subroutine
--- /dev/null
+! { dg-do run }
+
+ interface
+ subroutine sub1 (x, y)
+ integer, intent(in) :: y(:)
+ integer, intent(out) :: x(:)
+ end subroutine
+ function fn2 (x, m1, m2, n1, n2)
+ integer, intent(in) :: x(:,:), m1, m2, n1, n2
+ integer :: fn2(m1:m2,n1:n2)
+ end function
+ subroutine sub3 (x, y)
+ integer, allocatable, intent(in) :: y(:,:)
+ integer, allocatable, intent(inout) :: x(:,:)
+ end subroutine
+ end interface
+!$omp declare reduction (foo : integer : sub3 (omp_out, omp_in)) &
+!$omp initializer (omp_priv = fn3 (omp_orig))
+!$omp declare reduction (bar : integer : omp_out = fn1 (omp_out, omp_in, &
+!$omp & lbound (omp_out, 1), ubound (omp_out, 1))) &
+!$omp & initializer (sub1 (omp_priv, omp_orig))
+!$omp declare reduction (baz : integer : sub2 (omp_out, omp_in)) &
+!$omp initializer (omp_priv = fn2 (omp_orig, lbound (omp_priv, 1), &
+!$omp ubound (omp_priv, 1), lbound (omp_priv, 2), ubound (omp_priv, 2)))
+ interface
+ function fn1 (x, y, m1, m2)
+ integer, intent(in) :: x(:), y(:), m1, m2
+ integer :: fn1(m1:m2)
+ end function
+ subroutine sub2 (x, y)
+ integer, intent(in) :: y(:,:)
+ integer, intent(inout) :: x(:,:)
+ end subroutine
+ function fn3 (x)
+ integer, allocatable, intent(in) :: x(:,:)
+ integer, allocatable :: fn3(:,:)
+ end function
+ end interface
+ integer :: a(10), b(3:5,7:9), r
+ integer, allocatable :: c(:,:)
+ a(:) = 0
+ r = 0
+!$omp parallel reduction (bar : a) reduction (+: r)
+ if (lbound (a, 1) /= 1 .or. ubound (a, 1) /= 10) call abort
+ a = a + 2
+ r = r + 1
+!$omp end parallel
+ if (any (a /= 4 * r) ) call abort
+ b(:,:) = 0
+ allocate (c (4:6,8:10))
+ c(:,:) = 0
+ r = 0
+!$omp parallel reduction (baz : b, c) reduction (+: r)
+ if (lbound (b, 1) /= 3 .or. ubound (b, 1) /= 5) call abort
+ if (lbound (b, 2) /= 7 .or. ubound (b, 2) /= 9) call abort
+ if (.not. allocated (c)) call abort
+ if (lbound (c, 1) /= 4 .or. ubound (c, 1) /= 6) call abort
+ if (lbound (c, 2) /= 8 .or. ubound (c, 2) /= 10) call abort
+ b = b + 3
+ c = c + 4
+ r = r + 1
+!$omp end parallel
+ if (any (b /= 3 * r) .or. any (c /= 4 * r)) call abort
+ deallocate (c)
+ allocate (c (0:1,7:11))
+ c(:,:) = 0
+ r = 0
+!$omp parallel reduction (foo : c) reduction (+: r)
+ if (.not. allocated (c)) call abort
+ if (lbound (c, 1) /= 0 .or. ubound (c, 1) /= 1) call abort
+ if (lbound (c, 2) /= 7 .or. ubound (c, 2) /= 11) call abort
+ c = c + 5
+ r = r + 1
+!$omp end parallel
+ if (any (c /= 10 * r)) call abort
+end
+function fn1 (x, y, m1, m2)
+ integer, intent(in) :: x(:), y(:), m1, m2
+ integer :: fn1(m1:m2)
+ fn1 = x + 2 * y
+end function
+subroutine sub1 (x, y)
+ integer, intent(in) :: y(:)
+ integer, intent(out) :: x(:)
+ x = 0
+end subroutine
+function fn2 (x, m1, m2, n1, n2)
+ integer, intent(in) :: x(:,:), m1, m2, n1, n2
+ integer :: fn2(m1:m2,n1:n2)
+ fn2 = x
+end function
+subroutine sub2 (x, y)
+ integer, intent(inout) :: x(:,:)
+ integer, intent(in) :: y(:,:)
+ x = x + y
+end subroutine
+function fn3 (x)
+ integer, allocatable, intent(in) :: x(:,:)
+ integer, allocatable :: fn3(:,:)
+ fn3 = x
+end function
+subroutine sub3 (x, y)
+ integer, allocatable, intent(inout) :: x(:,:)
+ integer, allocatable, intent(in) :: y(:,:)
+ x = x + 2 * y
+end subroutine
--- /dev/null
+! { dg-do run }
+
+ type dt
+ integer :: g
+ integer, allocatable :: h(:)
+ end type
+!$omp declare reduction (baz : dt : bar (omp_out, omp_in)) &
+!$omp & initializer (foo (omp_priv, omp_orig))
+ integer :: r
+ type (dt), allocatable :: a(:)
+ allocate (a(7:8))
+ a(:)%g = 0
+ a(7)%h = (/ 0, 0, 0 /)
+ r = 0
+!$omp parallel reduction(+:r) reduction (baz:a)
+ if (.not.allocated (a)) call abort
+ if (lbound (a, 1) /= 7 .or. ubound (a, 1) /= 8) call abort
+ if (.not.allocated (a(7)%h)) call abort
+ if (allocated (a(8)%h)) call abort
+ if (lbound (a(7)%h, 1) /= 1 .or. ubound (a(7)%h, 1) /= 3) call abort
+ a(:)%g = a(:)%g + 2
+ a(7)%h = a(7)%h + 3
+ r = r + 1
+!$omp end parallel
+ if (.not.allocated (a)) call abort
+ if (lbound (a, 1) /= 7 .or. ubound (a, 1) /= 8) call abort
+ if (.not.allocated (a(7)%h)) call abort
+ if (allocated (a(8)%h)) call abort
+ if (lbound (a(7)%h, 1) /= 1 .or. ubound (a(7)%h, 1) /= 3) call abort
+ if (any (a(:)%g /= 2 * r) .or. any (a(7)%h(:) /= 3 * r)) call abort
+contains
+ subroutine foo (x, y)
+ type (dt), allocatable :: x(:), y(:)
+ if (allocated (x) .neqv. allocated (y)) call abort
+ if (lbound (x, 1) /= lbound (y, 1)) call abort
+ if (ubound (x, 1) /= ubound (y, 1)) call abort
+ if (allocated (x(7)%h) .neqv. allocated (y(7)%h)) call abort
+ if (allocated (x(8)%h) .neqv. allocated (y(8)%h)) call abort
+ if (lbound (x(7)%h, 1) /= lbound (y(7)%h, 1)) call abort
+ if (ubound (x(7)%h, 1) /= ubound (y(7)%h, 1)) call abort
+ x(7)%g = 0
+ x(7)%h = 0
+ x(8)%g = 0
+ end subroutine
+ subroutine bar (x, y)
+ type (dt), allocatable :: x(:), y(:)
+ x(:)%g = x(:)%g + y(:)%g
+ x(7)%h(:) = x(7)%h(:) + y(7)%h(:)
+ end subroutine
+end
--- /dev/null
+! { dg-do run }
+
+module udr15m1
+ integer, parameter :: a = 6
+ integer :: b
+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in)
+!$omp declare reduction (.add. : integer : &
+!$omp & omp_out = omp_out .add. f3 (omp_in, -4)) &
+!$omp & initializer (s1 (omp_priv, omp_orig))
+ interface operator (.add.)
+ module procedure f1
+ end interface
+contains
+ integer function f1 (x, y)
+ integer, intent (in) :: x, y
+ f1 = x + y
+ end function f1
+ integer function f3 (x, y)
+ integer, intent (in) :: x, y
+ f3 = iand (x, y)
+ end function f3
+ subroutine s1 (x, y)
+ integer, intent (in) :: y
+ integer, intent (out) :: x
+ x = 3
+ end subroutine s1
+end module udr15m1
+module udr15m2
+ use udr15m1, f4 => f1, f5 => f3, s2 => s1, operator (.addtwo.) => operator (.add.)
+ type dt
+ integer :: x
+ end type
+!$omp declare reduction (+ : dt : omp_out = f6 (omp_out + omp_in)) &
+!$omp & initializer (s3 (omp_priv))
+ interface operator (+)
+ module procedure f2
+ end interface
+contains
+ type(dt) function f2 (x, y)
+ type(dt), intent (in) :: x, y
+ f2%x = x%x + y%x
+ end function f2
+ type(dt) function f6 (x)
+ type(dt), intent (in) :: x
+ f6%x = x%x
+ end function f6
+ subroutine s3 (x)
+ type(dt), intent (out) :: x
+ x = dt(0)
+ end subroutine
+end module udr15m2
+ use udr15m2, operator (.addthree.) => operator (.addtwo.), &
+ f7 => f4, f8 => f6, s4 => s3
+ integer :: i, j
+ type(dt) :: d
+ j = 3
+ d%x = 0
+!$omp parallel do reduction (.addthree.: j) reduction (+ : d)
+ do i = 1, 100
+ j = j.addthree.iand (i, -4)
+ d = d + dt(i)
+ end do
+ if (d%x /= 5050 .or. j /= 4903) call abort
+end
--- /dev/null
+! { dg-do run }
+
+module udr2
+ type dt
+ integer :: x = 7
+ integer :: y = 9
+ end type
+end module udr2
+ use udr2, only : dt
+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in)
+ integer :: i, j(2:4,3:5)
+!$omp declare reduction (bar : integer : &
+!$omp & omp_out = omp_out + iand (omp_in, -4)) initializer (omp_priv = 3)
+ interface operator (+)
+ function notdefined(x, y)
+ use udr2, only : dt
+ type(dt), intent (in) :: x, y
+ type(dt) :: notdefined
+ end function
+ end interface
+ type (dt) :: d(2:4,3:5)
+!$omp declare reduction (+ : dt : omp_out%x = omp_out%x &
+!$omp & + iand (omp_in%x, -8))
+!$omp declare reduction (foo : dt : omp_out%x = iand (omp_in%x, -8) &
+!$omp & + omp_out%x) initializer (omp_priv = dt (5, 21))
+ j = 0
+!$omp parallel do reduction (foo : j)
+ do i = 1, 100
+ j = j + i
+ end do
+ if (any(j .ne. 5050)) call abort
+ j = 3
+!$omp parallel do reduction (bar : j)
+ do i = 1, 100
+ j = j + 4 * i
+ end do
+ if (any(j .ne. (5050 * 4 + 3))) call abort
+!$omp parallel do reduction (+ : d)
+ do i = 1, 100
+ if (any(d%y .ne. 9)) call abort
+ d%x = d%x + 8 * i
+ end do
+ if (any(d%x .ne. (5050 * 8 + 7)) .or. any(d%y .ne. 9)) call abort
+ d = dt (5, 21)
+!$omp parallel do reduction (foo : d)
+ do i = 1, 100
+ if (any(d%y .ne. 21)) call abort
+ d%x = d%x + 8 * i
+ end do
+ if (any(d%x .ne. (5050 * 8 + 5)) .or. any(d%y .ne. 21)) call abort
+end
--- /dev/null
+! { dg-do run }
+
+!$omp declare reduction (foo : character(kind=1, len=*) &
+!$omp & : omp_out = trim(omp_out) // omp_in) initializer (omp_priv = '')
+!$omp declare reduction (bar : character(kind=1, len=:) &
+!$omp & : omp_out = trim(omp_in) // omp_out) initializer (omp_priv = '')
+!$omp declare reduction (baz : character(kind=1, len=1) &
+!$omp & : omp_out = char (ichar (omp_out) + ichar (omp_in) &
+!$omp & - ichar ('0'))) initializer (omp_priv = '0')
+!$omp declare reduction (baz : character(kind=1, len=2) &
+!$omp & : omp_out = char (ichar (omp_out(1:1)) + ichar (omp_in(1:1)) &
+!$omp & - ichar ('0')) // char (ichar (omp_out(2:2)) + &
+!$omp & ichar (omp_in(2:2)) - ichar ('0'))) initializer (omp_priv = '00')
+ character(kind=1, len=64) :: c, d
+ character(kind = 1, len=1) :: e
+ character(kind = 1, len=1+1) :: f
+ integer :: i
+ c = ''
+ d = ''
+ e = '0'
+ f = '00'
+!$omp parallel do reduction (foo : c) reduction (bar : d) &
+!$omp & reduction (baz : e, f)
+ do i = 1, 64
+ c = trim(c) // char (ichar ('0') + i)
+ d = char (ichar ('0') + i) // d
+ e = char (ichar (e) + mod (i, 3))
+ f = char (ichar (f(1:1)) + mod (i, 2)) &
+& // char (ichar (f(2:2)) + mod (i, 3))
+ end do
+ do i = 1, 64
+ if (index (c, char (ichar ('0') + i)) .eq. 0) call abort
+ if (index (d, char (ichar ('0') + i)) .eq. 0) call abort
+ end do
+ if (e.ne.char (ichar ('0') + 64)) call abort
+ if (f(1:1).ne.char (ichar ('0') + 32)) call abort
+ if (f(2:2).ne.char (ichar ('0') + 64)) call abort
+end
--- /dev/null
+! { dg-do run }
+
+!$omp declare reduction (foo : character(kind=1, len=*) &
+!$omp & : omp_out = fn (omp_out, omp_in)) initializer (omp_priv = '')
+!$omp declare reduction (bar : character(kind=1, len=:) &
+!$omp & : omp_out = fn (omp_in, omp_out)) initializer (omp_priv = '')
+!$omp declare reduction (baz : character(kind=1, len=1) &
+!$omp & : omp_out = char (ichar (omp_out) + ichar (omp_in) &
+!$omp & - ichar ('0'))) initializer (omp_priv = '0')
+!$omp declare reduction (baz : character(kind=1, len=2) &
+!$omp & : omp_out = char (ichar (omp_out(1:1)) + ichar (omp_in(1:1)) &
+!$omp & - ichar ('0')) // char (ichar (omp_out(2:2)) + &
+!$omp & ichar (omp_in(2:2)) - ichar ('0'))) initializer (omp_priv = '00')
+ interface
+ elemental function fn (x, y)
+ character (len=64), intent (in) :: x, y
+ character (len=64) :: fn
+ end function
+ end interface
+ character(kind=1, len=64) :: c(-3:-2,1:1,7:8), d(2:3,-7:-5)
+ character(kind = 1, len=1) :: e(2:4)
+ character(kind = 1, len=1+1) :: f(8:10,9:10)
+ integer :: i, j, k
+ c = ''
+ d = ''
+ e = '0'
+ f = '00'
+!$omp parallel do reduction (foo : c) reduction (bar : d) &
+!$omp & reduction (baz : e, f) private (j, k)
+ do i = 1, 64
+ forall (j = -3:-2, k = 7:8) &
+ c(j,1,k) = trim(c(j,1,k)) // char (ichar ('0') + i)
+ d = char (ichar ('0') + i) // d
+ e = char (ichar (e) + mod (i, 3))
+ f = char (ichar (f(:,:)(1:1)) + mod (i, 2)) &
+& // char (ichar (f(:,:)(2:2)) + mod (i, 3))
+ end do
+ do i = 1, 64
+ if (any (index (c, char (ichar ('0') + i)) .eq. 0)) call abort
+ if (any (index (d, char (ichar ('0') + i)) .eq. 0)) call abort
+ end do
+ if (any (e.ne.char (ichar ('0') + 64))) call abort
+ if (any (f(:,:)(1:1).ne.char (ichar ('0') + 32))) call abort
+ if (any (f(:,:)(2:2).ne.char (ichar ('0') + 64))) call abort
+end
+elemental function fn (x, y)
+ character (len=64), intent (in) :: x, y
+ character (len=64) :: fn
+ fn = trim(x) // y
+end function
--- /dev/null
+! { dg-do run }
+
+module m
+ interface operator(.add.)
+ module procedure do_add
+ end interface
+ type dt
+ real :: r = 0.0
+ end type
+contains
+ function do_add(x, y)
+ type (dt), intent (in) :: x, y
+ type (dt) :: do_add
+ do_add%r = x%r + y%r
+ end function
+ subroutine dp_add(x, y)
+ double precision :: x, y
+ x = x + y
+ end subroutine
+ subroutine dp_init(x)
+ double precision :: x
+ x = 0.0
+ end subroutine
+end module
+
+program udr5
+ use m, only : operator(.add.), dt, dp_add, dp_init
+ type(dt) :: xdt, one
+ real :: r
+ integer (kind = 4) :: i4
+ integer (kind = 8) :: i8
+ real (kind = 4) :: r4
+ double precision :: dp
+!$omp declare reduction(.add.:dt:omp_out=omp_out.add.omp_in)
+!$omp declare reduction(foo:integer(4),integer(kind=8),real (kind = 4) &
+!$omp & :omp_out = omp_out + omp_in) initializer (omp_priv = 0)
+!$omp declare reduction(foo:double precision:dp_add (omp_out, omp_in)) &
+!$omp & initializer (dp_init (omp_priv))
+
+ one%r = 1.0
+ r = 0.0
+ i4 = 0
+ i8 = 0
+ r4 = 0.0
+ call dp_init (dp)
+!$omp parallel reduction(.add.: xdt) reduction(+: r) &
+!$omp & reduction(foo: i4, i8, r4, dp)
+ xdt = xdt.add.one
+ r = r + 1.0
+ i4 = i4 + 1
+ i8 = i8 + 1
+ r4 = r4 + 1.0
+ call dp_add (dp, 1.0d0)
+!$omp end parallel
+ if (xdt%r .ne. r) call abort
+ if (i4.ne.r.or.i8.ne.r.or.r4.ne.r.or.dp.ne.r) call abort
+end program udr5
--- /dev/null
+! { dg-do run }
+
+module m
+ interface operator(.add.)
+ module procedure do_add
+ end interface
+ type dt
+ real :: r = 0.0
+ end type
+contains
+ elemental function do_add(x, y)
+ type (dt), intent (in) :: x, y
+ type (dt) :: do_add
+ do_add%r = x%r + y%r
+ end function
+ elemental subroutine dp_add(x, y)
+ double precision, intent (inout) :: x
+ double precision, intent (in) :: y
+ x = x + y
+ end subroutine
+ elemental subroutine dp_init(x)
+ double precision, intent (out) :: x
+ x = 0.0
+ end subroutine
+end module
+
+program udr6
+ use m, only : operator(.add.), dt, dp_add, dp_init
+ type(dt), allocatable :: xdt(:)
+ type(dt) :: one
+ real :: r
+ integer (kind = 4), allocatable, dimension(:) :: i4
+ integer (kind = 8), allocatable, dimension(:,:) :: i8
+ integer :: i
+ real (kind = 4), allocatable :: r4(:,:)
+ double precision, allocatable :: dp(:)
+!$omp declare reduction(.add.:dt:omp_out=omp_out.add.omp_in)
+!$omp declare reduction(foo:integer(4),integer(kind=8),real (kind = 4) &
+!$omp & :omp_out = omp_out + omp_in) initializer (omp_priv = 0)
+!$omp declare reduction(foo:double precision:dp_add (omp_out, omp_in)) &
+!$omp & initializer (dp_init (omp_priv))
+
+ one%r = 1.0
+ allocate (xdt(4), i4 (3), i8(-5:-2,2:3), r4(2:5,1:1), dp(7))
+ r = 0.0
+ i4 = 0
+ i8 = 0
+ r4 = 0.0
+ do i = 1, 7
+ call dp_init (dp(i))
+ end do
+!$omp parallel reduction(.add.: xdt) reduction(+: r) &
+!$omp & reduction(foo: i4, i8, r4, dp) private(i)
+ do i = 1, 4
+ xdt(i) = xdt(i).add.one
+ end do
+ r = r + 1.0
+ i4 = i4 + 1
+ i8 = i8 + 1
+ r4 = r4 + 1.0
+ do i = 1, 7
+ call dp_add (dp(i), 1.0d0)
+ end do
+!$omp end parallel
+ if (any (xdt%r .ne. r)) call abort
+ if (any (i4.ne.r).or.any(i8.ne.r)) call abort
+ if (any(r4.ne.r).or.any(dp.ne.r)) call abort
+ deallocate (xdt, i4, i8, r4, dp)
+end program udr6
--- /dev/null
+! { dg-do run }
+
+program udr7
+ implicit none
+ interface
+ elemental subroutine omp_priv (x, y, z)
+ real, intent (in) :: x
+ real, intent (inout) :: y
+ real, intent (in) :: z
+ end subroutine omp_priv
+ elemental real function omp_orig (x)
+ real, intent (in) :: x
+ end function omp_orig
+ end interface
+!$omp declare reduction (omp_priv : real : &
+!$omp & omp_priv (omp_orig (omp_in), omp_out, 1.0)) &
+!$omp & initializer (omp_out (omp_priv, omp_in (omp_orig)))
+ real :: x (2:4, 1:1, -2:0)
+ integer :: i
+ x = 0
+!$omp parallel do reduction (omp_priv : x)
+ do i = 1, 64
+ x = x + i
+ end do
+ if (any (x /= 2080.0)) call abort
+contains
+ elemental subroutine omp_out (x, y)
+ real, intent (out) :: x
+ real, intent (in) :: y
+ x = y - 4.0
+ end subroutine omp_out
+ elemental real function omp_in (x)
+ real, intent (in) :: x
+ omp_in = x + 4.0
+ end function omp_in
+end program udr7
+elemental subroutine omp_priv (x, y, z)
+ real, intent (in) :: x
+ real, intent (inout) :: y
+ real, intent (in) :: z
+ y = y + (x - 4.0) + (z - 1.0)
+end subroutine omp_priv
+elemental real function omp_orig (x)
+ real, intent (in) :: x
+ omp_orig = x + 4.0
+end function omp_orig
--- /dev/null
+! { dg-do run }
+
+module udr8m1
+ integer, parameter :: a = 6
+ integer :: b
+!$omp declare reduction (foo : integer : omp_out = omp_out + omp_in)
+!$omp declare reduction (.add. : integer : &
+!$omp & omp_out = omp_out .add. iand (omp_in, -4)) &
+!$omp & initializer (omp_priv = 3)
+ interface operator (.add.)
+ module procedure f1
+ end interface
+contains
+ integer function f1 (x, y)
+ integer, intent (in) :: x, y
+ f1 = x + y
+ end function f1
+end module udr8m1
+module udr8m2
+ use udr8m1
+ type dt
+ integer :: x
+ end type
+!$omp declare reduction (+ : dt : omp_out = omp_out + omp_in) &
+!$omp & initializer (omp_priv = dt (0))
+ interface operator (+)
+ module procedure f2
+ end interface
+contains
+ type(dt) function f2 (x, y)
+ type(dt), intent (in) :: x, y
+ f2%x = x%x + y%x
+ end function f2
+end module udr8m2
+ use udr8m2
+ integer :: i, j
+ type(dt) :: d
+ j = 3
+ d%x = 0
+!$omp parallel do reduction (.add.: j) reduction (+ : d)
+ do i = 1, 100
+ j = j.add.iand (i, -4)
+ d = d + dt(i)
+ end do
+ if (d%x /= 5050 .or. j /= 4903) call abort
+end
--- /dev/null
+! { dg-do run }
+
+module udr9m1
+ integer, parameter :: a = 6
+ integer :: b
+!$omp declare reduction (foo : integer : combiner1 (omp_out, omp_in)) &
+!$omp & initializer (initializer1 (omp_priv, omp_orig))
+!$omp declare reduction (.add. : integer : &
+!$omp & combiner1 (omp_out, omp_in)) &
+!$omp & initializer (initializer1 (omp_priv, omp_orig))
+ interface operator (.add.)
+ module procedure f1
+ end interface
+contains
+ integer function f1 (x, y)
+ integer, intent (in) :: x, y
+ f1 = x + y
+ end function f1
+ elemental subroutine combiner1 (x, y)
+ integer, intent (inout) :: x
+ integer, intent (in) :: y
+ x = x + iand (y, -4)
+ end subroutine
+ subroutine initializer1 (x, y)
+ integer :: x, y
+ if (y .ne. 3) call abort
+ x = y
+ end subroutine
+end module udr9m1
+module udr9m2
+ use udr9m1
+ type dt
+ integer :: x
+ end type
+!$omp declare reduction (+ : dt : combiner2 (omp_in, omp_out)) &
+!$omp & initializer (initializer2 (omp_priv))
+ interface operator (+)
+ module procedure f2
+ end interface
+contains
+ type(dt) function f2 (x, y)
+ type(dt), intent (in) :: x, y
+ f2%x = x%x + y%x
+ end function f2
+ subroutine combiner2 (x, y)
+ type(dt) :: x, y
+ y = y + x
+ end subroutine combiner2
+ subroutine initializer2 (x)
+ type(dt), intent(out) :: x
+ x%x = 0
+ end subroutine initializer2
+end module udr9m2
+ use udr9m2
+ integer :: i, j
+ type(dt) :: d
+ j = 3
+ d%x = 0
+!$omp parallel do reduction (.add.: j) reduction (+ : d)
+ do i = 1, 100
+ j = j.add.iand (i, -4)
+ d = d + dt(i)
+ end do
+ if (d%x /= 5050 .or. j /= 4903) call abort
+end
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
+2014-05-28 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+
+ * acinclude.m4 (LIBITM_CHECK_LINKER_HWCAP): Check for
+ -mclear-hwcap instead.
+ * configure: Regenerate.
+ * clearcap.map: Remove.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
dnl
dnl Check if the linker used supports linker maps to clear hardware
-dnl capabilities. This is only supported by Sun ld at the moment.
+dnl capabilities. This is only supported on Solaris at the moment.
dnl
dnl Defines:
-dnl HWCAP_LDFLAGS='-Wl,-M,clearcap.map' if possible
+dnl HWCAP_LDFLAGS=-mclear-hwcap if possible
dnl LD (as a side effect of testing)
dnl
AC_DEFUN([LIBITM_CHECK_LINKER_HWCAP], [
AC_REQUIRE([AC_PROG_LD])
ac_save_LDFLAGS="$LDFLAGS"
- LDFLAGS="$LFLAGS -Wl,-M,$srcdir/clearcap.map"
+ LDFLAGS="$LFLAGS -mclear-hwcap"
- AC_MSG_CHECKING([for ld that supports -Wl,-M,mapfile])
+ AC_MSG_CHECKING([for -mclear-hwcap])
AC_TRY_LINK([], [return 0;], [ac_hwcap_ldflags=yes],[ac_hwcap_ldflags=no])
if test "$ac_hwcap_ldflags" = "yes"; then
- HWCAP_LDFLAGS="-Wl,-M,$srcdir/clearcap.map $HWCAP_LDFLAGS"
+ HWCAP_LDFLAGS="-mclear-hwcap $HWCAP_LDFLAGS"
fi
AC_MSG_RESULT($ac_hwcap_ldflags)
+++ /dev/null
-# Clear hardware capabilities emitted by Sun as: calls to the x86_avx.c
-# functions are only emitted with -mavx.
-#
-# The v1 mapfile syntax has no support for clearing specific capabilities,
-# so clear everything.
-#
-hwcap_1 = V0x0 OVERRIDE;
-#
-# If we can assume mapfile v2 syntax, we can specificially clear AVX.
-#
-#$mapfile_version 2
-#CAPABILITY {
-# HW -= AVX;
-#};
ac_save_LDFLAGS="$LDFLAGS"
- LDFLAGS="$LFLAGS -Wl,-M,$srcdir/clearcap.map"
+ LDFLAGS="$LFLAGS -mclear-hwcap"
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld that supports -Wl,-M,mapfile" >&5
-$as_echo_n "checking for ld that supports -Wl,-M,mapfile... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -mclear-hwcap" >&5
+$as_echo_n "checking for -mclear-hwcap... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
if test "$ac_hwcap_ldflags" = "yes"; then
- HWCAP_LDFLAGS="-Wl,-M,$srcdir/clearcap.map $HWCAP_LDFLAGS"
+ HWCAP_LDFLAGS="-mclear-hwcap $HWCAP_LDFLAGS"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_hwcap_ldflags" >&5
$as_echo "$ac_hwcap_ldflags" >&6; }
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
.\" ========================================================================
.\"
.IX Title "GAPPLETVIEWER 1"
-.TH GAPPLETVIEWER 1 "2014-04-22" "0.99.1-pre" "GNU"
+.TH GAPPLETVIEWER 1 "2014-07-16" "0.99.1-pre" "GNU"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
.\" ========================================================================
.\"
.IX Title "GJAR 1"
-.TH GJAR 1 "2014-04-22" "0.99.1-pre" "GNU"
+.TH GJAR 1 "2014-07-16" "0.99.1-pre" "GNU"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
.\" ========================================================================
.\"
.IX Title "GJARSIGNER 1"
-.TH GJARSIGNER 1 "2014-04-22" "0.99.1-pre" "GNU"
+.TH GJARSIGNER 1 "2014-07-16" "0.99.1-pre" "GNU"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
.\" ========================================================================
.\"
.IX Title "GJAVAH 1"
-.TH GJAVAH 1 "2014-04-22" "0.99.1-pre" "GNU"
+.TH GJAVAH 1 "2014-07-16" "0.99.1-pre" "GNU"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
.\" ========================================================================
.\"
.IX Title "GJDOC 1"
-.TH GJDOC 1 "2014-04-22" "0.99.1-pre" "GNU"
+.TH GJDOC 1 "2014-07-16" "0.99.1-pre" "GNU"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
.\" ========================================================================
.\"
.IX Title "GKEYTOOL 1"
-.TH GKEYTOOL 1 "2014-04-22" "0.99.1-pre" "GNU"
+.TH GKEYTOOL 1 "2014-07-16" "0.99.1-pre" "GNU"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
.\" ========================================================================
.\"
.IX Title "GNATIVE2ASCII 1"
-.TH GNATIVE2ASCII 1 "2014-04-22" "0.99.1-pre" "GNU"
+.TH GNATIVE2ASCII 1 "2014-07-16" "0.99.1-pre" "GNU"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
.\" ========================================================================
.\"
.IX Title "GORBD 1"
-.TH GORBD 1 "2014-04-22" "0.99.1-pre" "GNU"
+.TH GORBD 1 "2014-07-16" "0.99.1-pre" "GNU"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
.\" ========================================================================
.\"
.IX Title "GRMID 1"
-.TH GRMID 1 "2014-04-22" "0.99.1-pre" "GNU"
+.TH GRMID 1 "2014-07-16" "0.99.1-pre" "GNU"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
.\" ========================================================================
.\"
.IX Title "GRMIREGISTRY 1"
-.TH GRMIREGISTRY 1 "2014-04-22" "0.99.1-pre" "GNU"
+.TH GRMIREGISTRY 1 "2014-07-16" "0.99.1-pre" "GNU"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
.\" ========================================================================
.\"
.IX Title "GSERIALVER 1"
-.TH GSERIALVER 1 "2014-04-22" "0.99.1-pre" "GNU"
+.TH GSERIALVER 1 "2014-07-16" "0.99.1-pre" "GNU"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
.\" ========================================================================
.\"
.IX Title "GTNAMESERV 1"
-.TH GTNAMESERV 1 "2014-04-22" "0.99.1-pre" "GNU"
+.TH GTNAMESERV 1 "2014-07-16" "0.99.1-pre" "GNU"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
+2014-06-23 Jonathan Wakely <jwakely@redhat.com>
+
+ PR libstdc++/61532
+ * testsuite/20_util/make_signed/requirements/typedefs-1.cc: Do not
+ apply the signed specifier to wchar_t.
+ * testsuite/20_util/make_signed/requirements/typedefs-2.cc: Likewise.
+ * testsuite/20_util/make_unsigned/requirements/typedefs-1.cc: Do not
+ apply the unsigned specifier to wchar_t.
+ * testsuite/20_util/make_unsigned/requirements/typedefs-2.cc:
+ Likewise.
+
+2014-06-13 Jonathan Wakely <jwakely@redhat.com>
+
+ Backport from mainline
+ PR libstdc++/60326
+ * include/std/type_traits (__make_unsigned, __make_signed): Define
+ specializations for wchar_t, char16_t and char32_t.
+ * testsuite/20_util/make_signed/requirements/typedefs-4.cc: New.
+ * testsuite/20_util/make_unsigned/requirements/typedefs-1.cc: Correct
+ test for make_unsigned<volatile wchar_t>.
+ * testsuite/20_util/make_unsigned/requirements/typedefs-2.cc:
+ Likewise.
+ * testsuite/20_util/declval/requirements/1_neg.cc: Adjust dg-error
+ line number.
+ * testsuite/20_util/make_signed/requirements/typedefs_neg.cc:
+ Likewise.
+ * testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc:
+ Likewise.
+
+ Backport from mainline
+ PR libstdc++/61269
+ * include/std/type_traits: Move include outside namespace std.
+ * testsuite/20_util/declval/requirements/1_neg.cc: Adjust dg-error.
+ * testsuite/20_util/make_signed/requirements/typedefs_neg.cc: Likewise.
+ * testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc:
+ Likewise.
+
+ * include/std/tuple (tuple_size<cv _Tp>): Implement LWG 2313.
+ (get<_Tp>(tuple<_Types...>&&)): Use forward instead of move.
+ * testsuite/20_util/tuple/element_access/get_by_type.cc: Test rvalues.
+
+2014-06-07 Ed Smith-Rowland <3dw4rd@verizon.net>
+
+ Backport from mainline
+ DR 2344 - std::quoted doesn't respect padding
+ * include/std/iomanip: Allow for padding in quoted inserters.
+ * testsuite/27_io/manipulators/standard/char/dr2344.cc: New.
+ * testsuite/27_io/manipulators/standard/wchar_t/dr2344.cc: New.
+
+2014-06-03 Jonathan Wakely <jwakely@redhat.com>
+
+ * include/bits/regex_executor.tcc (_Executor<>::_M_main): Move instead
+ of copying.
+
+2014-06-03 Jonathan Wakely <jwakely@redhat.com>
+
+ Backport from mainline
+ 2014-04-15 Jonathan Wakely <jwakely@redhat.com>
+
+ PR libstdc++/60734
+ * include/bits/stl_tree.h (_Rb_tree::_M_end): Fix invalid cast.
+
+ Backport from mainline
+ 2014-04-24 Tim Shen <timshen91@gmail.com>
+
+ * include/bits/regex_automaton.tcc (_StateSeq<>::_M_clone()):
+ Do _M_alt before _M_next.
+ * testsuite/28_regex/basic_regex/multiple_quantifiers.cc: Add testcases.
+
+ Backport from mainline
+ 2014-05-20 Tim Shen <timshen91@gmail.com>
+
+ PR libstdc++/61227
+ * include/bits/regex_compiler.h
+ (_BracketMatcher<>::_M_add_character_class): Add negative character
+ class support.
+ * include/bits/regex_compiler.tcc (_BracketMatcher<>::_M_apply):
+ Likewise.
+ * testsuite/28_regex/algorithms/regex_match/ecma/char/quoted_char.cc:
+ Add more testcases.
+
+2014-05-29 Jonathan Wakely <jwakely@redhat.com>
+
+ * include/tr2/bool_set: Use UTF-8 for accented characters.
+ * scripts/run_doxygen: Handle Doxygen 1.8.x change.
+
+2014-05-27 Jonathan Wakely <jwakely@redhat.com>
+
+ PR libstdc++/61329
+ * include/bits/regex_automaton.tcc (_State_base::_M_print): Add
+ inline specifier.
+ (_State_base::_M_dot): Likewise.
+
+2014-05-23 François Dumont <fdumont@gcc.gnu.org>
+
+ PR libstdc++/61143
+ * include/bits/hashtable.h: Fix move semantic to leave hashtable in a
+ usable state.
+ * testsuite/23_containers/unordered_set/61143.cc: New.
+ * testsuite/23_containers/unordered_set/modifiers/swap.cc: New.
+
+2014-05-17 Jonathan Wakely <jwakely@redhat.com>
+
+ PR libstdc++/60966
+ * include/std/future (__future_base::_State_baseV2::_M_set_result):
+ Signal condition variable after call_once returns.
+ (__future_base::_State_baseV2::_M_do_set): Do not signal here.
+ (promise::set_value, promise::set_exception): Increment the reference
+ count on the shared state until the function returns.
+ * testsuite/30_threads/promise/60966.cc: New.
+
+2014-05-08 Joshua Gay <jgay@gnu.org>
+
+ PR libstdc++/61117
+ * doc/xml/faq.xml (faq.license.what_restrictions): Replace "open
+ source" with "free software".
+ * doc/html/faq.html: Likewise.
+
+2014-05-08 Jonathan Wakely <jwakely@redhat.com>
+
+ * include/std/iostream: Fix URL in comment.
+ * src/c++98/ios_init.cc: Fix path in comment.
+
+2014-05-07 Jonathan Wakely <jwakely@redhat.com>
+
+ PR libstdc++/61023
+ * include/bits/stl_tree.h (_Rb_tree::_M_move_assign): Copy the
+ comparison function.
+ * testsuite/23_containers/set/cons/61023.cc: New.
+
+ PR libstdc++/61086
+ * include/bits/stl_iterator.h (__normal_iterator::_M_const_cast):
+ Remove.
+ * include/bits/stl_vector.h (vector::insert, vector::erase): Use
+ arithmetic to obtain a mutable iterator from const_iterator.
+ * include/bits/vector.tcc (vector::insert): Likewise.
+ * include/debug/vector (vector::erase): Likewise.
+ * testsuite/23_containers/vector/requirements/dr438/assign_neg.cc:
+ Adjust dg-error line number.
+ * testsuite/23_containers/vector/requirements/dr438/
+ constructor_1_neg.cc: Likewise.
+ * testsuite/23_containers/vector/requirements/dr438/
+ constructor_2_neg.cc: Likewise.
+ * testsuite/23_containers/vector/requirements/dr438/insert_neg.cc:
+ Likewise.
+
+2014-05-06 Jonathan Wakely <jwakely@redhat.com>
+
+ Backport from mainline
+ 2014-04-15 Jonathan Wakely <jwakely@redhat.com>
+
+ PR libstdc++/60594
+ * include/std/functional (function::_Callable): Exclude own type
+ from the callable checks.
+ * testsuite/20_util/function/60594.cc: New.
+
+2014-05-02 Jonathan Wakely <jwakely@redhat.com>
+
+ PR libstdc++/59476
+ * python/libstdcxx/v6/printers.py (get_value_from_Rb_tree_node): New
+ function to handle both C++03 and C++11 _Rb_tree_node implementations.
+ (StdRbtreeIteratorPrinter, StdMapPrinter, StdSetPrinter): Use it.
+ * testsuite/libstdc++-prettyprinters/simple.cc: Update comment to
+ refer to...
+ * testsuite/libstdc++-prettyprinters/simple11.cc: New.
+
+ PR libstdc++/61036
+ * include/bits/shared_ptr_base.h (__shared_ptr::__shared_ptr(_Tp1*)):
+ Check the correct type in the static assertion.
+ * testsuite/20_util/shared_ptr/cons/61036.cc: New.
+
+2014-04-27 Lars Gullik Bjønnes <larsbj@gullik.org>
+
+ PR libstdc++/60710
+ * include/experimental/optional (operator!=): Implement in terms of
+ operator==.
+ * testsuite/experimental/optional/relops/1.cc: Remove operator!=.
+ * testsuite/experimental/optional/relops/2.cc: Likewise.
+ * testsuite/experimental/optional/relops/3.cc: Likewise.
+ * testsuite/experimental/optional/relops/4.cc: Likewise.
+ * testsuite/experimental/optional/relops/5.cc: Likewise.
+ * testsuite/experimental/optional/relops/6.cc: Likewise.
+
+2014-04-27 Jonathan Wakely <jwakely@redhat.com>
+
+ PR libstdc++/60497
+ * include/std/tuple (get): Qualify calls to prevent ADL.
+ * testsuite/20_util/tuple/60497.cc: New.
+
+ * include/std/tuple (tuple_element_t): Define.
+ * testsuite/20_util/tuple/tuple_element.cc: Change to compile-only
+ test.
+ * testsuite/20_util/tuple/tuple_element_t.cc: New.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
</p></td></tr><tr class="question"><td align="left" valign="top"><a id="faq.license.what_restrictions"></a><a id="q-license.what_restrictions"></a><p><strong>2.4.</strong></p></td><td align="left" valign="top"><p>
I see. So, what restrictions are there on programs that use the library?
</p></td></tr><tr class="answer"><td align="left" valign="top"><a id="a-license.what_restrictions"></a></td><td align="left" valign="top"><p>
- None. We encourage such programs to be released as open source,
+ None. We encourage such programs to be released as free software,
but we won't punish you or sue you if you choose otherwise.
</p></td></tr><tr class="toc"><td align="left" valign="top" colspan="2"><dl><dt>3.1. <a href="faq.html#faq.how_to_install">How do I install libstdc++?
</a></dt><dt>3.2. <a href="faq.html#faq.how_to_get_sources">How does one get current libstdc++ sources?
</question>
<answer xml:id="a-license.what_restrictions">
<para>
- None. We encourage such programs to be released as open source,
+ None. We encourage such programs to be released as free software,
but we won't punish you or sue you if you choose otherwise.
</para>
</answer>
size_type _M_element_count;
_RehashPolicy _M_rehash_policy;
+ // A single bucket used when only need for 1 bucket. Especially
+ // interesting in move semantic to leave hashtable with only 1 buckets
+ // which is not allocated so that we can have those operations noexcept
+ // qualified.
+ // Note that we can't leave hashtable with 0 bucket without adding
+ // numerous checks in the code to avoid 0 modulus.
+ __bucket_type _M_single_bucket;
+
+ bool
+ _M_uses_single_bucket(__bucket_type* __bkts) const
+ { return __builtin_expect(_M_buckets == &_M_single_bucket, false); }
+
+ bool
+ _M_uses_single_bucket() const
+ { return _M_uses_single_bucket(_M_buckets); }
+
__hashtable_alloc&
_M_base_alloc() { return *this; }
- using __hashtable_alloc::_M_deallocate_buckets;
+ __bucket_type*
+ _M_allocate_buckets(size_type __n)
+ {
+ if (__builtin_expect(__n == 1, false))
+ {
+ _M_single_bucket = nullptr;
+ return &_M_single_bucket;
+ }
+
+ return __hashtable_alloc::_M_allocate_buckets(__n);
+ }
+
+ void
+ _M_deallocate_buckets(__bucket_type* __bkts, size_type __n)
+ {
+ if (_M_uses_single_bucket(__bkts))
+ return;
+
+ __hashtable_alloc::_M_deallocate_buckets(__bkts, __n);
+ }
void
_M_deallocate_buckets()
- { this->_M_deallocate_buckets(_M_buckets, _M_bucket_count); }
+ { _M_deallocate_buckets(_M_buckets, _M_bucket_count); }
// Gets bucket begin, deals with the fact that non-empty buckets contain
// their before begin node.
size_type
erase(const key_type& __k)
- {
- if (__builtin_expect(_M_bucket_count == 0, false))
- return 0;
- return _M_erase(__unique_keys(), __k);
- }
+ { return _M_erase(__unique_keys(), __k); }
iterator
erase(const_iterator, const_iterator);
_M_rehash_policy()
{
_M_bucket_count = _M_rehash_policy._M_next_bkt(__bucket_hint);
- _M_buckets = this->_M_allocate_buckets(_M_bucket_count);
+ _M_buckets = _M_allocate_buckets(_M_bucket_count);
}
template<typename _Key, typename _Value,
std::max(_M_rehash_policy._M_bkt_for_elements(__nb_elems),
__bucket_hint));
- _M_buckets = this->_M_allocate_buckets(_M_bucket_count);
+ _M_buckets = _M_allocate_buckets(_M_bucket_count);
__try
{
for (; __f != __l; ++__f)
{
// Replacement allocator cannot free existing storage.
this->_M_deallocate_nodes(_M_begin());
- if (__builtin_expect(_M_bucket_count != 0, true))
- _M_deallocate_buckets();
- _M_reset();
+ _M_before_begin._M_nxt = nullptr;
+ _M_deallocate_buckets();
+ _M_buckets = nullptr;
std::__alloc_on_copy(__this_alloc, __that_alloc);
__hashtable_base::operator=(__ht);
_M_bucket_count = __ht._M_bucket_count;
if (_M_bucket_count != __ht._M_bucket_count)
{
__former_buckets = _M_buckets;
- _M_buckets = this->_M_allocate_buckets(__ht._M_bucket_count);
+ _M_buckets = _M_allocate_buckets(__ht._M_bucket_count);
_M_bucket_count = __ht._M_bucket_count;
}
else
[&__roan](const __node_type* __n)
{ return __roan(__n->_M_v()); });
if (__former_buckets)
- this->_M_deallocate_buckets(__former_buckets,
- __former_bucket_count);
+ _M_deallocate_buckets(__former_buckets, __former_bucket_count);
}
__catch(...)
{
{
__bucket_type* __buckets = nullptr;
if (!_M_buckets)
- _M_buckets = __buckets = this->_M_allocate_buckets(_M_bucket_count);
+ _M_buckets = __buckets = _M_allocate_buckets(_M_bucket_count);
__try
{
_M_reset() noexcept
{
_M_rehash_policy._M_reset();
- _M_bucket_count = 0;
- _M_buckets = nullptr;
+ _M_bucket_count = 1;
+ _M_single_bucket = nullptr;
+ _M_buckets = &_M_single_bucket;
_M_before_begin._M_nxt = nullptr;
_M_element_count = 0;
}
_M_move_assign(_Hashtable&& __ht, std::true_type)
{
this->_M_deallocate_nodes(_M_begin());
- if (__builtin_expect(_M_bucket_count != 0, true))
- _M_deallocate_buckets();
-
+ _M_deallocate_buckets();
__hashtable_base::operator=(std::move(__ht));
_M_rehash_policy = __ht._M_rehash_policy;
- _M_buckets = __ht._M_buckets;
+ if (!__ht._M_uses_single_bucket())
+ _M_buckets = __ht._M_buckets;
+ else
+ {
+ _M_buckets = &_M_single_bucket;
+ _M_single_bucket = __ht._M_single_bucket;
+ }
_M_bucket_count = __ht._M_bucket_count;
_M_before_begin._M_nxt = __ht._M_before_begin._M_nxt;
_M_element_count = __ht._M_element_count;
if (_M_bucket_count != __ht._M_bucket_count)
{
__former_buckets = _M_buckets;
- _M_buckets = this->_M_allocate_buckets(__ht._M_bucket_count);
+ _M_buckets = _M_allocate_buckets(__ht._M_bucket_count);
_M_bucket_count = __ht._M_bucket_count;
}
else
_M_element_count(__ht._M_element_count),
_M_rehash_policy(__ht._M_rehash_policy)
{
+ // Update, if necessary, buckets if __ht is using its single bucket.
+ if (__ht._M_uses_single_bucket())
+ {
+ _M_buckets = &_M_single_bucket;
+ _M_single_bucket = __ht._M_single_bucket;
+ }
+
// Update, if necessary, bucket pointing to before begin that hasn't
// moved.
if (_M_begin())
_M_buckets[_M_bucket_index(_M_begin())] = &_M_before_begin;
+
__ht._M_reset();
}
{
if (__ht._M_node_allocator() == this->_M_node_allocator())
{
- _M_buckets = __ht._M_buckets;
+ if (__ht._M_uses_single_bucket())
+ {
+ _M_buckets = &_M_single_bucket;
+ _M_single_bucket = __ht._M_single_bucket;
+ }
+ else
+ _M_buckets = __ht._M_buckets;
+
_M_before_begin._M_nxt = __ht._M_before_begin._M_nxt;
// Update, if necessary, bucket pointing to before begin that hasn't
// moved.
std::__alloc_on_swap(this->_M_node_allocator(), __x._M_node_allocator());
std::swap(_M_rehash_policy, __x._M_rehash_policy);
- std::swap(_M_buckets, __x._M_buckets);
+
+ // Deal properly with potentially moved instances.
+ if (this->_M_uses_single_bucket())
+ {
+ if (!__x._M_uses_single_bucket())
+ {
+ _M_buckets = __x._M_buckets;
+ __x._M_buckets = &__x._M_single_bucket;
+ }
+ }
+ else if (__x._M_uses_single_bucket())
+ {
+ __x._M_buckets = _M_buckets;
+ _M_buckets = &_M_single_bucket;
+ }
+ else
+ std::swap(_M_buckets, __x._M_buckets);
+
std::swap(_M_bucket_count, __x._M_bucket_count);
std::swap(_M_before_begin._M_nxt, __x._M_before_begin._M_nxt);
std::swap(_M_element_count, __x._M_element_count);
+ std::swap(_M_single_bucket, __x._M_single_bucket);
// Fix buckets containing the _M_before_begin pointers that can't be
// swapped.
if (_M_begin())
_M_buckets[_M_bucket_index(_M_begin())] = &_M_before_begin;
+
if (__x._M_begin())
__x._M_buckets[__x._M_bucket_index(__x._M_begin())]
= &__x._M_before_begin;
_H1, _H2, _Hash, _RehashPolicy, _Traits>::
find(const key_type& __k)
{
- if (__builtin_expect(_M_bucket_count == 0, false))
- return end();
-
__hash_code __code = this->_M_hash_code(__k);
std::size_t __n = _M_bucket_index(__k, __code);
__node_type* __p = _M_find_node(__n, __k, __code);
_H1, _H2, _Hash, _RehashPolicy, _Traits>::
find(const key_type& __k) const
{
- if (__builtin_expect(_M_bucket_count == 0, false))
- return end();
-
__hash_code __code = this->_M_hash_code(__k);
std::size_t __n = _M_bucket_index(__k, __code);
__node_type* __p = _M_find_node(__n, __k, __code);
_H1, _H2, _Hash, _RehashPolicy, _Traits>::
count(const key_type& __k) const
{
- if (__builtin_expect(_M_bucket_count == 0, false))
- return 0;
-
__hash_code __code = this->_M_hash_code(__k);
std::size_t __n = _M_bucket_index(__k, __code);
__node_type* __p = _M_bucket_begin(__n);
else if (__result)
// All equivalent values are next to each other, if we
// found a non-equivalent value after an equivalent one it
- // means that we won't find any more equivalent values.
+ // means that we won't find any new equivalent value.
break;
if (!__p->_M_nxt || _M_bucket_index(__p->_M_next()) != __n)
break;
_H1, _H2, _Hash, _RehashPolicy, _Traits>::
equal_range(const key_type& __k)
{
- if (__builtin_expect(_M_bucket_count == 0, false))
- return std::make_pair(end(), end());
-
__hash_code __code = this->_M_hash_code(__k);
std::size_t __n = _M_bucket_index(__k, __code);
__node_type* __p = _M_find_node(__n, __k, __code);
_H1, _H2, _Hash, _RehashPolicy, _Traits>::
equal_range(const key_type& __k) const
{
- if (__builtin_expect(_M_bucket_count == 0, false))
- return std::make_pair(end(), end());
-
__hash_code __code = this->_M_hash_code(__k);
std::size_t __n = _M_bucket_index(__k, __code);
__node_type* __p = _M_find_node(__n, __k, __code);
_H1, _H2, _Hash, _RehashPolicy, _Traits>::
_M_rehash_aux(size_type __n, std::true_type)
{
- __bucket_type* __new_buckets = this->_M_allocate_buckets(__n);
+ __bucket_type* __new_buckets = _M_allocate_buckets(__n);
__node_type* __p = _M_begin();
_M_before_begin._M_nxt = nullptr;
std::size_t __bbegin_bkt = 0;
__p = __next;
}
- if (__builtin_expect(_M_bucket_count != 0, true))
- _M_deallocate_buckets();
+ _M_deallocate_buckets();
_M_bucket_count = __n;
_M_buckets = __new_buckets;
}
_H1, _H2, _Hash, _RehashPolicy, _Traits>::
_M_rehash_aux(size_type __n, std::false_type)
{
- __bucket_type* __new_buckets = this->_M_allocate_buckets(__n);
+ __bucket_type* __new_buckets = _M_allocate_buckets(__n);
__node_type* __p = _M_begin();
_M_before_begin._M_nxt = nullptr;
__new_buckets[__next_bkt] = __prev_p;
}
- if (__builtin_expect(_M_bucket_count != 0, true))
- _M_deallocate_buckets();
+ _M_deallocate_buckets();
_M_bucket_count = __n;
_M_buckets = __new_buckets;
}
_GLIBCXX_BEGIN_NAMESPACE_VERSION
#ifdef _GLIBCXX_DEBUG
- std::ostream&
+ inline std::ostream&
_State_base::_M_print(std::ostream& ostr) const
{
switch (_M_opcode)
}
// Prints graphviz dot commands for state.
- std::ostream&
+ inline std::ostream&
_State_base::_M_dot(std::ostream& __ostr, _StateIdT __id) const
{
switch (_M_opcode)
// _M_insert_state() never return -1
auto __id = _M_nfa._M_insert_state(__dup);
__m[__u] = __id;
- if (__u == _M_end)
- continue;
- if (__dup._M_next != _S_invalid_state_id && __m[__dup._M_next] == -1)
- __stack.push(__dup._M_next);
if (__dup._M_opcode == _S_opcode_alternative
|| __dup._M_opcode == _S_opcode_subexpr_lookahead)
if (__dup._M_alt != _S_invalid_state_id && __m[__dup._M_alt] == -1)
__stack.push(__dup._M_alt);
+ if (__u == _M_end)
+ continue;
+ if (__dup._M_next != _S_invalid_state_id && __m[__dup._M_next] == -1)
+ __stack.push(__dup._M_next);
}
- long __size = static_cast<long>(__m.size());
- for (long __k = 0; __k < __size; __k++)
+ for (auto __v : __m)
{
- long __v;
- if ((__v = __m[__k]) == -1)
+ if (__v == -1)
continue;
auto& __ref = _M_nfa[__v];
if (__ref._M_next != _S_invalid_state_id)
#endif
}
+ // __neg should be true for \D, \S and \W only.
void
- _M_add_character_class(const _StringT& __s)
+ _M_add_character_class(const _StringT& __s, bool __neg)
{
auto __mask = _M_traits.lookup_classname(__s.data(),
__s.data() + __s.size(),
__icase);
if (__mask == 0)
__throw_regex_error(regex_constants::error_ctype);
- _M_class_set |= __mask;
+ if (!__neg)
+ _M_class_set |= __mask;
+ else
+ _M_neg_class_set.push_back(__mask);
#ifdef _GLIBCXX_DEBUG
_M_is_ready = false;
#endif
_M_make_range(_CharT __l, _CharT __r)
{
_M_range_set.push_back(make_pair(_M_translator._M_transform(__l),
- _M_translator._M_transform(__r)));
+ _M_translator._M_transform(__r)));
#ifdef _GLIBCXX_DEBUG
_M_is_ready = false;
#endif
std::vector<_CharT> _M_char_set;
std::vector<_StringT> _M_equiv_set;
std::vector<pair<_StrTransT, _StrTransT>> _M_range_set;
+ std::vector<_CharClassT> _M_neg_class_set;
_CharClassT _M_class_set;
_TransT _M_translator;
const _TraitsT& _M_traits;
_GLIBCXX_DEBUG_ASSERT(_M_value.size() == 1);
_BracketMatcher<_TraitsT, __icase, __collate> __matcher
(_M_ctype.is(_CtypeT::upper, _M_value[0]), _M_traits);
- __matcher._M_add_character_class(_M_value);
+ __matcher._M_add_character_class(_M_value, false);
__matcher._M_ready();
_M_stack.push(_StateSeqT(_M_nfa,
_M_nfa._M_insert_matcher(std::move(__matcher))));
else if (_M_match_token(_ScannerT::_S_token_equiv_class_name))
__matcher._M_add_equivalence_class(_M_value);
else if (_M_match_token(_ScannerT::_S_token_char_class_name))
- __matcher._M_add_character_class(_M_value);
+ __matcher._M_add_character_class(_M_value, false);
else if (_M_try_char()) // [a
{
auto __ch = _M_value[0];
}
__matcher._M_add_char(__ch);
}
+ else if (_M_match_token(_ScannerT::_S_token_quoted_class))
+ __matcher._M_add_character_class(_M_value,
+ _M_ctype.is(_CtypeT::upper,
+ _M_value[0]));
else
__throw_regex_error(regex_constants::error_brack);
}
_M_traits.transform_primary(&__ch, &__ch+1))
!= _M_equiv_set.end())
__ret = true;
+ else
+ {
+ for (auto& __it : _M_neg_class_set)
+ if (!_M_traits.isctype(__ch, __it))
+ {
+ __ret = true;
+ break;
+ }
+ }
}
if (_M_is_non_matching)
return !__ret;
if (_M_match_queue->empty())
break;
_M_visited->assign(_M_visited->size(), false);
- auto _M_old_queue = std::move(*_M_match_queue);
- for (auto __task : _M_old_queue)
+ auto __old_queue = std::move(*_M_match_queue);
+ for (auto& __task : __old_queue)
{
- _M_cur_results = __task.second;
+ _M_cur_results = std::move(__task.second);
_M_dfs<__match_mode>(__task.first);
}
if (!__match_mode)
: _M_ptr(__p), _M_refcount(__p)
{
__glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
- static_assert( !is_void<_Tp>::value, "incomplete type" );
+ static_assert( !is_void<_Tp1>::value, "incomplete type" );
static_assert( sizeof(_Tp1) > 0, "incomplete type" );
__enable_shared_from_this_helper(_M_refcount, __p, __p);
}
_Container>::__type>& __i) _GLIBCXX_NOEXCEPT
: _M_current(__i.base()) { }
-#if __cplusplus >= 201103L
- __normal_iterator<typename _Container::pointer, _Container>
- _M_const_cast() const noexcept
- {
- using _PTraits = std::pointer_traits<typename _Container::pointer>;
- return __normal_iterator<typename _Container::pointer, _Container>
- (_PTraits::pointer_to(const_cast<typename _PTraits::element_type&>
- (*_M_current)));
- }
-#else
- __normal_iterator
- _M_const_cast() const
- { return *this; }
-#endif
-
// Forward iterator requirements
reference
operator*() const _GLIBCXX_NOEXCEPT
_Link_type
_M_end() _GLIBCXX_NOEXCEPT
- { return static_cast<_Link_type>(&this->_M_impl._M_header); }
+ { return reinterpret_cast<_Link_type>(&this->_M_impl._M_header); }
_Const_Link_type
_M_end() const _GLIBCXX_NOEXCEPT
- { return static_cast<_Const_Link_type>(&this->_M_impl._M_header); }
+ { return reinterpret_cast<_Const_Link_type>(&this->_M_impl._M_header); }
static const_reference
_S_value(_Const_Link_type __x)
_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
_M_move_assign(_Rb_tree& __x)
{
+ _M_impl._M_key_compare = __x._M_impl._M_key_compare;
if (_Alloc_traits::_S_propagate_on_move_assign()
|| _Alloc_traits::_S_always_equal()
|| _M_get_Node_allocator() == __x._M_get_Node_allocator())
insert(const_iterator __position, size_type __n, const value_type& __x)
{
difference_type __offset = __position - cbegin();
- _M_fill_insert(__position._M_const_cast(), __n, __x);
+ _M_fill_insert(begin() + __offset, __n, __x);
return begin() + __offset;
}
#else
_InputIterator __last)
{
difference_type __offset = __position - cbegin();
- _M_insert_dispatch(__position._M_const_cast(),
+ _M_insert_dispatch(begin() + __offset,
__first, __last, __false_type());
return begin() + __offset;
}
iterator
#if __cplusplus >= 201103L
erase(const_iterator __position)
+ { return _M_erase(begin() + (__position - cbegin())); }
#else
erase(iterator __position)
+ { return _M_erase(__position); }
#endif
- { return _M_erase(__position._M_const_cast()); }
/**
* @brief Remove a range of elements.
iterator
#if __cplusplus >= 201103L
erase(const_iterator __first, const_iterator __last)
+ {
+ const auto __beg = begin();
+ const auto __cbeg = cbegin();
+ return _M_erase(__beg + (__first - __cbeg), __beg + (__last - __cbeg));
+ }
#else
erase(iterator __first, iterator __last)
+ { return _M_erase(__first, __last); }
#endif
- { return _M_erase(__first._M_const_cast(), __last._M_const_cast()); }
/**
* @brief Swaps data with another %vector.
else
{
#if __cplusplus >= 201103L
+ const auto __pos = begin() + (__position - cbegin());
if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
{
_Tp __x_copy = __x;
- _M_insert_aux(__position._M_const_cast(), std::move(__x_copy));
+ _M_insert_aux(__pos, std::move(__x_copy));
}
else
+ _M_insert_aux(__pos, __x);
+#else
+ _M_insert_aux(__position, __x);
#endif
- _M_insert_aux(__position._M_const_cast(), __x);
}
return iterator(this->_M_impl._M_start + __n);
}
++this->_M_impl._M_finish;
}
else
- _M_insert_aux(__position._M_const_cast(),
+ _M_insert_aux(begin() + (__position - cbegin()),
std::forward<_Args>(__args)...);
return iterator(this->_M_impl._M_start + __n);
}
}
else
#if __cplusplus >= 201103L
- return iterator(__first.base()._M_const_cast(), this);
+ return begin() + (__first.base() - cbegin().base());
#else
return __first;
#endif
template<typename _Tp>
constexpr bool
operator!=(const optional<_Tp>& __lhs, _Tp const& __rhs)
- { return !__lhs || *__lhs != __rhs; }
+ { return !__lhs || !(*__lhs == __rhs); }
template<typename _Tp>
constexpr bool
operator!=(const _Tp& __lhs, const optional<_Tp>& __rhs)
- { return !__rhs || __lhs != *__rhs; }
+ { return !__rhs || !(__lhs == *__rhs); }
template<typename _Tp>
constexpr bool
using _Invoke = decltype(__callable_functor(std::declval<_Functor&>())
(std::declval<_ArgTypes>()...) );
+ // Used so the return type convertibility checks aren't done when
+ // performing overload resolution for copy construction/assignment.
+ template<typename _Tp>
+ using _NotSelf = __not_<is_same<_Tp, function>>;
+
template<typename _Functor>
- using _Callable = __check_func_return_type<_Invoke<_Functor>, _Res>;
+ using _Callable
+ = __and_<_NotSelf<_Functor>,
+ __check_func_return_type<_Invoke<_Functor>, _Res>>;
template<typename _Cond, typename _Tp>
using _Requires = typename enable_if<_Cond::value, _Tp>::type;
* reference_wrapper<F>, this function will not throw.
*/
template<typename _Functor>
- _Requires<_Callable<_Functor>, function&>
+ _Requires<_Callable<typename decay<_Functor>::type>, function&>
operator=(_Functor&& __f)
{
function(std::forward<_Functor>(__f)).swap(*this);
void
_M_set_result(function<_Ptr_type()> __res, bool __ignore_failure = false)
{
- bool __set = __ignore_failure;
+ bool __set = false;
// all calls to this function are serialized,
// side-effects of invoking __res only happen once
call_once(_M_once, &_State_baseV2::_M_do_set, this, ref(__res),
ref(__set));
- if (!__set)
+ if (__set)
+ _M_cond.notify_all();
+ else if (!__ignore_failure)
__throw_future_error(int(future_errc::promise_already_satisfied));
}
lock_guard<mutex> __lock(_M_mutex);
_M_result.swap(__res);
}
- _M_cond.notify_all();
__set = true;
}
virtual void _M_complete_async() { }
// Return true if state contains a deferred function.
+ // Caller must own _M_mutex.
virtual bool _M_has_deferred() const { return false; }
};
void
set_value(const _Res& __r)
{
+ auto __future = _M_future;
auto __setter = _State::__setter(this, __r);
- _M_future->_M_set_result(std::move(__setter));
+ __future->_M_set_result(std::move(__setter));
}
void
set_value(_Res&& __r)
{
+ auto __future = _M_future;
auto __setter = _State::__setter(this, std::move(__r));
- _M_future->_M_set_result(std::move(__setter));
+ __future->_M_set_result(std::move(__setter));
}
void
set_exception(exception_ptr __p)
{
+ auto __future = _M_future;
auto __setter = _State::__setter(__p, this);
- _M_future->_M_set_result(std::move(__setter));
+ __future->_M_set_result(std::move(__setter));
}
};
void
set_value(_Res& __r)
{
+ auto __future = _M_future;
auto __setter = _State::__setter(this, __r);
- _M_future->_M_set_result(std::move(__setter));
+ __future->_M_set_result(std::move(__setter));
}
void
set_exception(exception_ptr __p)
{
+ auto __future = _M_future;
auto __setter = _State::__setter(__p, this);
- _M_future->_M_set_result(std::move(__setter));
+ __future->_M_set_result(std::move(__setter));
}
};
void
set_exception(exception_ptr __p)
{
+ auto __future = _M_future;
auto __setter = _State::__setter(__p, this);
- _M_future->_M_set_result(std::move(__setter));
+ __future->_M_set_result(std::move(__setter));
}
};
inline void
promise<void>::set_value()
{
+ auto __future = _M_future;
auto __setter = _State::__setter(this);
- _M_future->_M_set_result(std::move(__setter));
+ __future->_M_set_result(std::move(__setter));
}
#if __cplusplus >= 201103L
#include <locale>
+#if __cplusplus > 201103L
+#include <sstream> // used in quoted.
+#endif
#endif
namespace std _GLIBCXX_VISIBILITY(default)
/**
* @brief Struct for delimited strings.
- * The left and right delimiters can be different.
*/
template<typename _String, typename _CharT>
struct _Quoted_string
};
/**
- * @brief Inserter for delimited strings.
- * The left and right delimiters can be different.
+ * @brief Inserter for quoted strings.
+ *
+ * _GLIBCXX_RESOLVE_LIB_DEFECTS
+ * DR 2344 quoted()'s interaction with padding is unclear
*/
template<typename _CharT, typename _Traits>
auto&
operator<<(std::basic_ostream<_CharT, _Traits>& __os,
const _Quoted_string<const _CharT*, _CharT>& __str)
{
- __os << __str._M_delim;
+ std::basic_ostringstream<_CharT, _Traits> __ostr;
+ __ostr << __str._M_delim;
for (const _CharT* __c = __str._M_string; *__c; ++__c)
{
if (*__c == __str._M_delim || *__c == __str._M_escape)
- __os << __str._M_escape;
- __os << *__c;
+ __ostr << __str._M_escape;
+ __ostr << *__c;
}
- __os << __str._M_delim;
+ __ostr << __str._M_delim;
- return __os;
+ return __os << __ostr.str();
}
/**
- * @brief Inserter for delimited strings.
- * The left and right delimiters can be different.
+ * @brief Inserter for quoted strings.
+ *
+ * _GLIBCXX_RESOLVE_LIB_DEFECTS
+ * DR 2344 quoted()'s interaction with padding is unclear
*/
template<typename _CharT, typename _Traits, typename _String>
auto&
operator<<(std::basic_ostream<_CharT, _Traits>& __os,
const _Quoted_string<_String, _CharT>& __str)
{
- __os << __str._M_delim;
+ std::basic_ostringstream<_CharT, _Traits> __ostr;
+ __ostr << __str._M_delim;
for (auto& __c : __str._M_string)
{
if (__c == __str._M_delim || __c == __str._M_escape)
- __os << __str._M_escape;
- __os << __c;
+ __ostr << __str._M_escape;
+ __ostr << __c;
}
- __os << __str._M_delim;
+ __ostr << __str._M_delim;
- return __os;
+ return __os << __ostr.str();
}
/**
*
* The <iostream> header declares the eight <em>standard stream
* objects</em>. For other declarations, see
- * http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt11ch24.html
+ * http://gcc.gnu.org/onlinedocs/libstdc++/manual/io.html
* and the @link iosfwd I/O forward declarations @endlink
*
* They are required by default to cooperate with the global C
* library's @c FILE streams, and to be available during program
- * startup and termination. For more information, see the HOWTO
- * linked to above.
+ * startup and termination. For more information, see the section of the
+ * manual linked to above.
*/
//@{
extern istream cin; /// Linked to standard input
add_cv<typename tuple_element<__i, _Tp>::type>::type type;
};
+#if __cplusplus > 201103L
+ template<std::size_t __i, typename _Tp>
+ using tuple_element_t = typename tuple_element<__i, _Tp>::type;
+#endif
+
/// Finds the size of a given tuple type.
template<typename _Tp>
struct tuple_size;
+ // _GLIBCXX_RESOLVE_LIB_DEFECTS
+ // 2313. tuple_size should always derive from integral_constant<size_t, N>
template<typename _Tp>
struct tuple_size<const _Tp>
- : public integral_constant<
- typename remove_cv<decltype(tuple_size<_Tp>::value)>::type,
- tuple_size<_Tp>::value> { };
+ : public integral_constant<size_t, tuple_size<_Tp>::value> { };
template<typename _Tp>
struct tuple_size<volatile _Tp>
- : public integral_constant<
- typename remove_cv<decltype(tuple_size<_Tp>::value)>::type,
- tuple_size<_Tp>::value> { };
+ : public integral_constant<size_t, tuple_size<_Tp>::value> { };
template<typename _Tp>
struct tuple_size<const volatile _Tp>
- : public integral_constant<
- typename remove_cv<decltype(tuple_size<_Tp>::value)>::type,
- tuple_size<_Tp>::value> { };
+ : public integral_constant<size_t, tuple_size<_Tp>::value> { };
/// class tuple_size
template<typename... _Elements>
__get_helper(const _Tuple_impl<__i, _Head, _Tail...>& __t) noexcept
{ return _Tuple_impl<__i, _Head, _Tail...>::_M_head(__t); }
- // Return a reference (const reference, rvalue reference) to the ith element
- // of a tuple. Any const or non-const ref elements are returned with their
- // original type.
+ /// Return a reference to the ith element of a tuple.
template<std::size_t __i, typename... _Elements>
constexpr typename __add_ref<
typename tuple_element<__i, tuple<_Elements...>>::type
>::type
get(tuple<_Elements...>& __t) noexcept
- { return __get_helper<__i>(__t); }
+ { return std::__get_helper<__i>(__t); }
+ /// Return a const reference to the ith element of a const tuple.
template<std::size_t __i, typename... _Elements>
constexpr typename __add_c_ref<
typename tuple_element<__i, tuple<_Elements...>>::type
>::type
get(const tuple<_Elements...>& __t) noexcept
- { return __get_helper<__i>(__t); }
+ { return std::__get_helper<__i>(__t); }
+ /// Return an rvalue reference to the ith element of a tuple rvalue.
template<std::size_t __i, typename... _Elements>
constexpr typename __add_r_ref<
typename tuple_element<__i, tuple<_Elements...>>::type
__get_helper2(const _Tuple_impl<__i, _Head, _Tail...>& __t) noexcept
{ return _Tuple_impl<__i, _Head, _Tail...>::_M_head(__t); }
+ /// Return a reference to the unique element of type _Tp of a tuple.
template <typename _Tp, typename... _Types>
constexpr _Tp&
get(tuple<_Types...>& __t) noexcept
- { return __get_helper2<_Tp>(__t); }
+ { return std::__get_helper2<_Tp>(__t); }
+ /// Return a reference to the unique element of type _Tp of a tuple rvalue.
template <typename _Tp, typename... _Types>
constexpr _Tp&&
get(tuple<_Types...>&& __t) noexcept
- { return std::move(__get_helper2<_Tp>(__t)); }
+ { return std::forward<_Tp&&>(std::__get_helper2<_Tp>(__t)); }
+ /// Return a const reference to the unique element of type _Tp of a tuple.
template <typename _Tp, typename... _Types>
constexpr const _Tp&
get(const tuple<_Types...>& __t) noexcept
- { return __get_helper2<_Tp>(__t); }
+ { return std::__get_helper2<_Tp>(__t); }
#endif
+
// This class helps construct the various comparison operations on tuples
template<std::size_t __check_equal_size, std::size_t __i, std::size_t __j,
typename _Tp, typename _Up>
#include <bits/c++config.h>
+#ifdef _GLIBCXX_USE_C99_STDINT_TR1
+# if defined (__UINT_LEAST16_TYPE__) && defined(__UINT_LEAST32_TYPE__)
+namespace std
+{
+ typedef __UINT_LEAST16_TYPE__ uint_least16_t;
+ typedef __UINT_LEAST32_TYPE__ uint_least32_t;
+}
+# else
+# include <cstdint>
+# endif
+#endif
+
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
struct __make_unsigned<long long>
{ typedef unsigned long long __type; };
+#if defined(_GLIBCXX_USE_WCHAR_T) && !defined(__WCHAR_UNSIGNED__)
+ template<>
+ struct __make_unsigned<wchar_t> : __make_unsigned<__WCHAR_TYPE__>
+ { };
+#endif
+
#if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_INT128)
template<>
struct __make_unsigned<__int128>
struct __make_signed<unsigned long long>
{ typedef signed long long __type; };
+#if defined(_GLIBCXX_USE_WCHAR_T) && defined(__WCHAR_UNSIGNED__)
+ template<>
+ struct __make_signed<wchar_t> : __make_signed<__WCHAR_TYPE__>
+ { };
+#endif
+
+#ifdef _GLIBCXX_USE_C99_STDINT_TR1
+ template<>
+ struct __make_signed<char16_t> : __make_signed<uint_least16_t>
+ { };
+ template<>
+ struct __make_signed<char32_t> : __make_signed<uint_least32_t>
+ { };
+#endif
+
#if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_INT128)
template<>
struct __make_signed<unsigned __int128>
* bool_set
*
* See N2136, Bool_set: multi-valued logic
- * by Hervé Brönnimann, Guillaume Melquiond, Sylvain Pion.
+ * by Hervé Brönnimann, Guillaume Melquiond, Sylvain Pion.
*
* The implicit conversion to bool is slippery! I may use the new
* explicit conversion. This has been specialized in the language
self.node = node
return result
+def get_value_from_Rb_tree_node(node):
+ """Returns the value held in an _Rb_tree_node<_Val>"""
+ try:
+ member = node.type.fields()[1].name
+ if member == '_M_value_field':
+ # C++03 implementation, node contains the value as a member
+ return node['_M_value_field']
+ elif member == '_M_storage':
+ # C++11 implementation, node stores value in __aligned_buffer
+ p = node['_M_storage']['_M_storage'].address
+ p = p.cast(node.type.template_argument(0).pointer())
+ return p.dereference()
+ except:
+ pass
+ raise ValueError, "Unsupported implementation for %s" % str(node.type)
+
# This is a pretty printer for std::_Rb_tree_iterator (which is
# std::map::iterator), and has nothing to do with the RbtreeIterator
# class above.
def to_string (self):
typename = str(self.val.type.strip_typedefs()) + '::_Link_type'
nodetype = gdb.lookup_type(typename).strip_typedefs()
- return self.val.cast(nodetype).dereference()['_M_value_field']
+ node = self.val.cast(nodetype).dereference()
+ return get_value_from_Rb_tree_node(node)
class StdDebugIteratorPrinter:
"Print a debug enabled version of an iterator"
def next(self):
if self.count % 2 == 0:
n = self.rbiter.next()
- n = n.cast(self.type).dereference()['_M_value_field']
+ n = n.cast(self.type).dereference()
+ n = get_value_from_Rb_tree_node(n)
self.pair = n
item = n['first']
else:
def next(self):
item = self.rbiter.next()
- item = item.cast(self.type).dereference()['_M_value_field']
+ item = item.cast(self.type).dereference()
+ item = get_value_from_Rb_tree_node(item)
# FIXME: this is weird ... what to do?
# Maybe a 'set' display hint?
result = ('[%d]' % self.count, item)
if $do_latex; then
cd ${outdir}/${mode}
- # Also drop in the header file and style sheet
- doxygen -w latex header.tex doxygen.sty
+ # Grrr, Doxygen 1.8.x changed the -w latex options.
+ need_footer=`doxygen -h | sed -n -e '/-w latex/s=.*footer.*=true=p'`
+
+ # Also drop in the header file (maybe footer file) and style sheet
+ if $need_footer; then
+ doxygen -w latex header.tex footer.tex doxygen.sty
+ else
+ doxygen -w latex header.tex doxygen.sty
+ fi
echo ::
echo :: LaTeX pages begin with
{
using namespace __gnu_cxx;
- // Extern declarations for global objects in src/globals.cc.
+ // Extern declarations for global objects in src/c++98/globals.cc.
extern stdio_sync_filebuf<char> buf_cout_sync;
extern stdio_sync_filebuf<char> buf_cin_sync;
extern stdio_sync_filebuf<char> buf_cerr_sync;
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
-// { dg-error "static assertion failed" "" { target *-*-* } 2003 }
+// { dg-error "static assertion failed" "" { target *-*-* } 2036 }
#include <utility>
--- /dev/null
+// { dg-options "-std=gnu++11" }
+// { dg-do compile }
+
+// Copyright (C) 2011-2014 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// libstdc++/60594
+
+#include <functional>
+#include <type_traits>
+struct bar;
+using F = std::function<bar()>;
+// check for copy constructible and assignable while 'bar' is incomplete
+constexpr int c = std::is_copy_constructible<F>::value;
+constexpr int a = std::is_copy_assignable<F>::value;
+struct bar { };
+bar func();
+void test()
+{
+ F g{ &func };
+ g = func;
+}
using std::make_signed;
using std::is_same;
using std::is_signed;
+ using std::is_volatile;
// Positive tests.
typedef make_signed<const int>::type test2_type;
#ifdef _GLIBCXX_USE_WCHAR_T
typedef make_signed<volatile wchar_t>::type test23_type;
- static_assert( is_same<test23_type, volatile signed wchar_t>::value,
+ static_assert( is_signed<test23_type>::value
+ && is_volatile<test23_type>::value
+ && sizeof(test23_type) == sizeof(volatile wchar_t),
"make_signed<volatile wchar_t>" );
#endif
{
using std::make_signed;
using std::is_same;
+ using std::is_signed;
+ using std::is_volatile;
// Positive tests.
typedef make_signed<const int>::type test2_type;
#ifdef _GLIBCXX_USE_WCHAR_T
typedef make_signed<volatile wchar_t>::type test23_type;
- static_assert(is_same<test23_type, volatile signed wchar_t>::value, "");
+ static_assert(is_signed<test23_type>::value
+ && is_volatile<test23_type>::value
+ && sizeof(test23_type) == sizeof(volatile wchar_t), "");
#endif
typedef make_signed<test_enum>::type test24_type;
--- /dev/null
+// { dg-options "-std=gnu++11" }
+// { dg-do compile }
+// { dg-require-cstdint "" }
+
+// Copyright (C) 2014 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <type_traits>
+
+// libstdc++/60326
+
+using namespace std;
+#ifdef _GLIBCXX_USE_WCHAR_T
+using wchar_signed = make_signed<wchar_t>::type;
+using wchar_unsigned = make_unsigned<wchar_t>::type;
+static_assert( !is_same<wchar_signed, wchar_unsigned>::value, "wchar_t" );
+#endif
+static_assert( is_signed<make_signed<char16_t>::type>::value, "char16_t");
+static_assert( is_signed<make_signed<char32_t>::type>::value, "char32_t");
// { dg-error "required from here" "" { target *-*-* } 40 }
// { dg-error "required from here" "" { target *-*-* } 42 }
-// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1714 }
-// { dg-error "declaration of" "" { target *-*-* } 1678 }
+// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1747 }
+// { dg-error "declaration of" "" { target *-*-* } 1711 }
using std::make_unsigned;
using std::is_same;
using std::is_unsigned;
+ using std::is_volatile;
// Positive tests.
typedef make_unsigned<const unsigned int>::type test2_type;
#ifdef _GLIBCXX_USE_WCHAR_T
typedef make_unsigned<volatile wchar_t>::type test23_type;
- static_assert(is_same<test23_type, volatile wchar_t>::value, "");
+ static_assert(is_unsigned<test23_type>::value
+ && is_volatile<test23_type>::value
+ && sizeof(test23_type) == sizeof(volatile wchar_t), "");
#endif
// Chapter 48, chapter 20. Smallest rank such that new unsigned type
{
using std::make_unsigned;
using std::is_same;
+ using std::is_unsigned;
+ using std::is_volatile;
// Positive tests.
typedef make_unsigned<const unsigned int>::type test2_type;
#ifdef _GLIBCXX_USE_WCHAR_T
typedef make_unsigned<volatile wchar_t>::type test23_type;
- static_assert(is_same<test23_type, volatile wchar_t>::value, "");
+ static_assert(is_unsigned<test23_type>::value
+ && is_volatile<test23_type>::value
+ && sizeof(test23_type) == sizeof(volatile wchar_t), "");
#endif
typedef make_unsigned<test_enum>::type test24_type;
// { dg-error "required from here" "" { target *-*-* } 40 }
// { dg-error "required from here" "" { target *-*-* } 42 }
-// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1632 }
-// { dg-error "declaration of" "" { target *-*-* } 1596 }
+// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1650 }
+// { dg-error "declaration of" "" { target *-*-* } 1614 }
--- /dev/null
+// { dg-options "-std=gnu++11" }
+// { dg-do compile }
+
+// Copyright (C) 2014 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// 20.8.2.2 Template class shared_ptr [util.smartptr.shared]
+
+#include <memory>
+
+void test01()
+{
+ std::shared_ptr<void> p(new int);
+}
--- /dev/null
+// { dg-options "-std=gnu++14" }
+// { dg-do compile }
+
+// Copyright (C) 2014 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// libstdc++/60497
+
+#include <tuple>
+
+struct A;
+template<typename T> struct B { T t; };
+
+using element_type = B<A>*;
+using tuple_type = std::tuple<element_type>;
+
+tuple_type t;
+const tuple_type ct;
+
+auto a = std::get<0>(t);
+auto b = std::get<0>(ct);
+auto c = std::get<element_type>(t);
+auto d = std::get<element_type>(ct);
get<1>(b)=5;
VERIFY(get<int>(b)==1 && get<int&>(b)==5 && get<const int&>(b)==2);
VERIFY(j==5);
+ // test rvalue overload:
+ VERIFY(get<int>(std::move(b))==1);
+ VERIFY(get<int&>(std::move(b))==5);
+ VERIFY(get<const int&>(std::move(b))==2);
}
-// { dg-options "-std=gnu++0x" }
+// { dg-options "-std=gnu++11" }
+// { dg-do compile }
// Copyright (C) 2007-2014 Free Software Foundation, Inc.
//
--- /dev/null
+// { dg-options "-std=gnu++14" }
+// { dg-do compile }
+
+// Copyright (C) 2014 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <tuple>
+
+using namespace std;
+
+struct foo
+{ };
+
+int
+main()
+{
+ // As foo isn't constructible from anything else, this
+ // lets us check if the alias is returning foo when it should
+ foo q1;
+ tuple_element_t<0,tuple<foo,void,int> > q2(q1);
+ tuple_element_t<2,tuple<void,int,foo> > q3(q1);
+}
--- /dev/null
+// { dg-options "-std=gnu++11" }
+
+// Copyright (C) 2014 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <set>
+#include <stdexcept>
+
+struct Comparator
+{
+ Comparator() : valid(false) { }
+ explicit Comparator(bool) : valid(true) { }
+
+ bool operator()(int i, int j) const
+ {
+ if (!valid)
+ throw std::logic_error("Comparator is invalid");
+ return i < j;
+ }
+
+private:
+ bool valid;
+};
+
+int main()
+{
+ using test_type = std::set<int, Comparator>;
+
+ Comparator cmp{true};
+
+ test_type good{cmp};
+
+ test_type s1;
+ s1 = good; // copy-assign
+ s1.insert(1);
+ s1.insert(2);
+
+ test_type s2;
+ s2 = std::move(good); // move-assign
+ s2.insert(1);
+ s2.insert(2);
+}
--- /dev/null
+// { dg-options "-std=gnu++11" }
+
+// Copyright (C) 2014 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// libstdc++/61143
+
+#include <unordered_set>
+
+void test01()
+{
+ std::unordered_set<int> us1, us2;
+ us1.insert(1);
+
+ us2 = std::move(us1);
+
+ us1.insert(1);
+}
+
+int main()
+{
+ test01();
+ return 0;
+}
--- /dev/null
+// Copyright (C) 2014 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++11" }
+
+#include <unordered_set>
+#include <testsuite_hooks.h>
+
+void test01()
+{
+ bool test __attribute__((unused)) = true;
+ std::unordered_set<int> us1 { 0, 1 };
+ {
+ std::unordered_set<int> us2(std::move(us1));
+
+ us1.swap(us2);
+
+ VERIFY( us1.find(0) != us1.end() );
+
+ us1.insert(2);
+
+ VERIFY( us1.size() == 3 );
+
+ us2.swap(us1);
+
+ VERIFY( us2.size() == 3 );
+ VERIFY( us2.find(2) != us2.end() );
+
+ us1 = { 3, 4, 5 };
+
+ VERIFY( us1.size() == 3 );
+ VERIFY( us1.bucket_count() >= 3 );
+
+ std::unordered_set<int> us3(std::move(us1));
+ us3 = std::move(us2);
+
+ us1.swap(us2);
+
+ VERIFY( us1.empty() );
+ VERIFY( us2.empty() );
+ }
+
+ us1 = { 0, 1 };
+ VERIFY( us1.size() == 2 );
+}
+
+int main()
+{
+ test01();
+ return 0;
+}
// <http://www.gnu.org/licenses/>.
// { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1320 }
+// { dg-error "no matching" "" { target *-*-* } 1326 }
#include <vector>
// <http://www.gnu.org/licenses/>.
// { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1246 }
+// { dg-error "no matching" "" { target *-*-* } 1252 }
#include <vector>
// <http://www.gnu.org/licenses/>.
// { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1246 }
+// { dg-error "no matching" "" { target *-*-* } 1252 }
#include <vector>
#include <utility>
// <http://www.gnu.org/licenses/>.
// { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1361 }
+// { dg-error "no matching" "" { target *-*-* } 1367 }
#include <vector>
--- /dev/null
+// { dg-do run }
+// { dg-options "-std=gnu++14" }
+
+// Copyright (C) 2014 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// 27.7.6 - Quoted manipulators [quoted.manip]
+
+#include <sstream>
+#include <iomanip>
+#include <testsuite_hooks.h>
+
+void
+test01()
+{
+ bool test [[gnu::unused]] = true;
+
+ std::ostringstream ssx;
+ ssx << "[" << std::left << std::setfill('x') << std::setw(20) << R"("AB \"CD\" EF")" << "]";
+ VERIFY( ssx.str() == R"(["AB \"CD\" EF"xxxxxx])" );
+
+ std::ostringstream ssy;
+ ssy << "[" << std::left << std::setfill('y') << std::setw(20) << std::quoted(R"(GH "IJ" KL)") << "]";
+ VERIFY( ssy.str() == R"(["GH \"IJ\" KL"yyyyyy])" );
+
+ std::ostringstream ssz;
+ ssz << "[" << std::right << std::setfill('z') << std::setw(20) << std::quoted(R"(PQ "RS" TU)") << "]";
+ VERIFY( ssz.str() == R"([zzzzzz"PQ \"RS\" TU"])" );
+}
+
+int
+main()
+{
+ test01();
+ return 0;
+}
--- /dev/null
+// { dg-do run }
+// { dg-options "-std=gnu++14" }
+
+// Copyright (C) 2014 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// 27.7.6 - Quoted manipulators [quoted.manip]
+
+#include <sstream>
+#include <iomanip>
+#include <testsuite_hooks.h>
+
+void
+test01()
+{
+ bool test [[gnu::unused]] = true;
+
+ std::wostringstream ssx;
+ ssx << L"[" << std::left << std::setfill(L'x') << std::setw(20) << LR"("AB \"CD\" EF")" << L"]";
+ VERIFY( ssx.str() == LR"(["AB \"CD\" EF"xxxxxx])" );
+
+ std::wostringstream ssy;
+ ssy << L"[" << std::left << std::setfill(L'y') << std::setw(20) << std::quoted(LR"(GH "IJ" KL)") << L"]";
+ VERIFY( ssy.str() == LR"(["GH \"IJ\" KL"yyyyyy])" );
+
+ std::wostringstream ssz;
+ ssz << L"[" << std::right << std::setfill(L'z') << std::setw(20) << std::quoted(LR"(PQ "RS" TU)") << L"]";
+ VERIFY( ssz.str() == LR"([zzzzzz"PQ \"RS\" TU"])" );
+}
+
+int
+main()
+{
+ test01();
+ return 0;
+}
VERIFY(regex_match_debug("_az", regex("\\w*")));
VERIFY(regex_match_debug("!@#$%", regex("\\W*")));
VERIFY(!regex_match_debug("_01234", regex("\\W*")));
+
+ VERIFY(regex_match_debug("01", regex("[\\d]*")));
+ VERIFY(regex_match_debug("asdfjkl", regex("[\\D]*")));
+ VERIFY(!regex_match_debug("asdfjkl0", regex("[\\D]*")));
+ VERIFY(regex_match_debug("\r\t\v\f ", regex("[\\s]*")));
+ VERIFY(regex_match_debug("asdfjkl", regex("[\\S]*")));
+ VERIFY(!regex_match_debug("asdfjkl\r", regex("[\\S]*")));
+ VERIFY(regex_match_debug("_az", regex("[\\w]*")));
+ VERIFY(regex_match_debug("!@#$%", regex("[\\W]*")));
+ VERIFY(!regex_match_debug("_01234", regex("[\\W]*")));
}
int
// Tests multiple consecutive quantifiers
#include <regex>
+#include <testsuite_hooks.h>
+#include <testsuite_regex.h>
+using namespace __gnu_test;
using namespace std;
int
{
regex re1("a++");
regex re2("(a+)+");
+ VERIFY(regex_match_debug("aa", regex("(a)*{3}")));
return 0;
}
--- /dev/null
+// { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-gnu* *-*-solaris* *-*-cygwin *-*-darwin* powerpc-ibm-aix* } }
+// { dg-options " -std=gnu++11 -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-gnu* powerpc-ibm-aix* } }
+// { dg-options " -std=gnu++11 -pthreads" { target *-*-solaris* } }
+// { dg-options " -std=gnu++11 " { target *-*-cygwin *-*-darwin* } }
+// { dg-require-cstdint "" }
+// { dg-require-gthreads "" }
+// { dg-require-atomic-builtins "" }
+
+// Copyright (C) 2014 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// libstdc++/60966
+// This test hangs if std::promise::~promise() destroys the
+// shared state before std::promise::set_value() finishes using it.
+
+#include <future>
+#include <thread>
+#include <vector>
+
+const int THREADS = 10;
+
+void run_task(std::promise<void>* pr)
+{
+ std::this_thread::sleep_for(std::chrono::milliseconds(100));
+ pr->set_value();
+}
+
+int main()
+{
+ std::vector<std::promise<void>*> tasks(THREADS);
+ std::vector<std::thread> threads(THREADS);
+ std::vector<std::future<void>> futures(THREADS);
+
+ for (int i = 0; i < THREADS; ++i)
+ {
+ std::promise<void>* task = new std::promise<void>;
+ tasks[i] = task;
+ futures[i] = task->get_future();
+ threads[i] = std::thread(run_task, task);
+ }
+
+ for (int i = 0; i < THREADS; ++i)
+ {
+ // the temporary future releases the state as soon as wait() returns
+ std::future<void>(std::move(futures[i])).wait();
+ // state is ready, should now be safe to delete promise, so it
+ // releases the shared state too
+ delete tasks[i];
+ }
+
+ for (auto& t : threads)
+ t.join();
+}
{ return std::tie(lhs.i, lhs.s) == std::tie(rhs.i, rhs.s); }
bool
- operator!=(value_type const& lhs, value_type const& rhs)
- { return !(lhs == rhs); }
-
- bool
operator<(value_type const& lhs, value_type const& rhs)
{ return std::tie(lhs.i, lhs.s) < std::tie(rhs.i, rhs.s); }
{ return std::tie(lhs.i, lhs.s) == std::tie(rhs.i, rhs.s); }
bool
- operator!=(value_type const& lhs, value_type const& rhs)
- { return !(lhs == rhs); }
-
- bool
operator<(value_type const& lhs, value_type const& rhs)
{ return std::tie(lhs.i, lhs.s) < std::tie(rhs.i, rhs.s); }
{ return std::tie(lhs.i, lhs.s) == std::tie(rhs.i, rhs.s); }
bool
- operator!=(value_type const& lhs, value_type const& rhs)
- { return !(lhs == rhs); }
-
- bool
operator<(value_type const& lhs, value_type const& rhs)
{ return std::tie(lhs.i, lhs.s) < std::tie(rhs.i, rhs.s); }
{ return std::tie(lhs.i, lhs.s) == std::tie(rhs.i, rhs.s); }
bool
- operator!=(value_type const& lhs, value_type const& rhs)
- { return !(lhs == rhs); }
-
- bool
operator<(value_type const& lhs, value_type const& rhs)
{ return std::tie(lhs.i, lhs.s) < std::tie(rhs.i, rhs.s); }
{ return std::tie(lhs.i, lhs.s) == std::tie(rhs.i, rhs.s); }
bool
- operator!=(value_type const& lhs, value_type const& rhs)
- { return !(lhs == rhs); }
-
- bool
operator<(value_type const& lhs, value_type const& rhs)
{ return std::tie(lhs.i, lhs.s) < std::tie(rhs.i, rhs.s); }
{ return std::tie(lhs.i, lhs.s) == std::tie(rhs.i, rhs.s); }
bool
- operator!=(value_type const& lhs, value_type const& rhs)
- { return !(lhs == rhs); }
-
- bool
operator<(value_type const& lhs, value_type const& rhs)
{ return std::tie(lhs.i, lhs.s) < std::tie(rhs.i, rhs.s); }
-// If you modify this, please update debug.cc as well.
+// If you modify this, please update simple11.cc and debug.cc as well.
// { dg-do run }
// { dg-options "-g -O0" }
--- /dev/null
+// If you modify this, please update simple.cc and debug.cc as well.
+
+// { dg-do run }
+// { dg-options "-g -O0 -std=gnu++11" }
+
+// Copyright (C) 2011-2014 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <string>
+#include <deque>
+#include <bitset>
+#include <iostream>
+#include <list>
+#include <map>
+#include <set>
+#include <ext/slist>
+
+int
+main()
+{
+ std::string tem;
+ std::string str = "zardoz";
+// { dg-final { note-test str "\"zardoz\"" } }
+
+ std::bitset<10> bs;
+ bs[0] = 1;
+ bs[5] = 1;
+ bs[7] = 1;
+// { dg-final { note-test bs {std::bitset = {[0] = 1, [5] = 1, [7] = 1}} } }
+
+ std::deque<std::string> deq;
+ deq.push_back("one");
+ deq.push_back("two");
+// { dg-final { note-test deq {std::deque with 2 elements = {"one", "two"}} } }
+
+ std::deque<std::string>::iterator deqiter = deq.begin();
+// { dg-final { note-test deqiter {"one"} } }
+
+ std::list<std::string> lst;
+ lst.push_back("one");
+ lst.push_back("two");
+// { dg-final { note-test lst {std::list = {[0] = "one", [1] = "two"}} } }
+
+ std::list<std::string>::iterator lstiter = lst.begin();
+ tem = *lstiter;
+// { dg-final { note-test lstiter {"one"}} }
+
+ std::list<std::string>::const_iterator lstciter = lst.begin();
+ tem = *lstciter;
+// { dg-final { note-test lstciter {"one"}} }
+
+ std::map<std::string, int> mp;
+ mp["zardoz"] = 23;
+// { dg-final { note-test mp {std::map with 1 elements = {["zardoz"] = 23}} } }
+
+ std::map<std::string, int>::iterator mpiter = mp.begin();
+// { dg-final { note-test mpiter {{first = "zardoz", second = 23}} } }
+
+ std::set<std::string> sp;
+ sp.insert("clownfish");
+ sp.insert("barrel");
+// { dg-final { note-test sp {std::set with 2 elements = {[0] = "barrel", [1] = "clownfish"}} } }
+
+ std::set<std::string>::const_iterator spciter = sp.begin();
+// { dg-final { note-test spciter {"barrel"} } }
+
+ __gnu_cxx::slist<int> sll;
+ sll.push_front(23);
+ sll.push_front(47);
+// { dg-final { note-test sll {__gnu_cxx::slist = {[0] = 47, [1] = 23}} } }
+
+ __gnu_cxx::slist<int>::iterator slliter = sll.begin();
+// { dg-final { note-test slliter {47} } }
+
+ return 0; // Mark SPOT
+}
+
+// { dg-final { gdb-test SPOT } }
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
+2014-05-15 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+
+ PR lto/60981
+ * configure.ac: Check for -static-libgcc.
+ * configure: Regenerate.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
done
CFLAGS="$save_CFLAGS"
+
+# Check whether -static-libgcc is supported.
+saved_LDFLAGS="$LDFLAGS"
+LDFLAGS="$LDFLAGS -static-libgcc"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for -static-libgcc" >&5
+$as_echo_n "checking for -static-libgcc... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ int main() {}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ have_static_libgcc=yes
+else
+ have_static_libgcc=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_static_libgcc" >&5
+$as_echo "$have_static_libgcc" >&6; };
+LDFLAGS="$saved_LDFLAGS"
# Need -Wc to get it through libtool.
-if test "x$GCC" = xyes; then ac_lto_plugin_ldflags="-Wc,-static-libgcc"; fi
+if test "x$have_static_libgcc" = xyes; then
+ ac_lto_plugin_ldflags="-Wc,-static-libgcc"
+fi
+
case `pwd` in
*\ * | *\ *)
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 10565 "configure"
+#line 10589 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 10671 "configure"
+#line 10695 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
AC_PROG_CC
AC_SYS_LARGEFILE
ACX_PROG_CC_WARNING_OPTS([-Wall], [ac_lto_plugin_warn_cflags])
+
+# Check whether -static-libgcc is supported.
+saved_LDFLAGS="$LDFLAGS"
+LDFLAGS="$LDFLAGS -static-libgcc"
+AC_MSG_CHECKING([for -static-libgcc])
+AC_LINK_IFELSE([
+ int main() {}], [have_static_libgcc=yes], [have_static_libgcc=no])
+AC_MSG_RESULT($have_static_libgcc);
+LDFLAGS="$saved_LDFLAGS"
# Need -Wc to get it through libtool.
-if test "x$GCC" = xyes; then ac_lto_plugin_ldflags="-Wc,-static-libgcc"; fi
+if test "x$have_static_libgcc" = xyes; then
+ ac_lto_plugin_ldflags="-Wc,-static-libgcc"
+fi
AC_SUBST(ac_lto_plugin_ldflags)
+
AM_PROG_LIBTOOL
ACX_LT_HOST_FLAGS
AC_SUBST(target_noncanonical)
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.
+2014-07-16 Release Manager
+
+ * GCC 4.9.1 released.
+
2014-04-22 Release Manager
* GCC 4.9.0 released.