[gcc r15-784] AARCH64: Add Qualcomnm oryon-1 core
https://gcc.gnu.org/g:01cfd6018250141a262219c5803c3f2a278d909d commit r15-784-g01cfd6018250141a262219c5803c3f2a278d909d Author: Andrew Pinski Date: Fri Apr 5 13:40:35 2024 -0700 AARCH64: Add Qualcomnm oryon-1 core This patch adds Qualcomm's new oryon-1 core; this is enough to recongize the core and later on will add the tuning structure. gcc/ChangeLog: * config/aarch64/aarch64-cores.def (oryon-1): New entry. * config/aarch64/aarch64-tune.md: Regenerate. * doc/invoke.texi (AArch64 Options): Document oryon-1. Signed-off-by: Andrew Pinski Co-authored-by: Joel Jones Co-authored-by: Wei Zhao Diff: --- gcc/config/aarch64/aarch64-cores.def | 5 + gcc/config/aarch64/aarch64-tune.md | 2 +- gcc/doc/invoke.texi | 1 + 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/gcc/config/aarch64/aarch64-cores.def b/gcc/config/aarch64/aarch64-cores.def index f69fc212d56..be60929e400 100644 --- a/gcc/config/aarch64/aarch64-cores.def +++ b/gcc/config/aarch64/aarch64-cores.def @@ -151,6 +151,11 @@ AARCH64_CORE("neoverse-512tvb", neoverse512tvb, cortexa57, V8_4A, (SVE, I8MM, B /* Qualcomm ('Q') cores. */ AARCH64_CORE("saphira", saphira,saphira,V8_4A, (CRYPTO), saphira, 0x51, 0xC01, -1) +/* ARMv8.6-A Architecture Processors. */ + +/* Qualcomm ('Q') cores. */ +AARCH64_CORE("oryon-1", oryon1, cortexa57, V8_6A, (CRYPTO, SM4, SHA3, F16), cortexa72, 0x51, 0x001, -1) + /* ARMv8-A big.LITTLE implementations. */ AARCH64_CORE("cortex-a57.cortex-a53", cortexa57cortexa53, cortexa53, V8A, (CRC), cortexa57, 0x41, AARCH64_BIG_LITTLE (0xd07, 0xd03), -1) diff --git a/gcc/config/aarch64/aarch64-tune.md b/gcc/config/aarch64/aarch64-tune.md index abd3c9e0822..ba940f1c890 100644 --- a/gcc/config/aarch64/aarch64-tune.md +++ b/gcc/config/aarch64/aarch64-tune.md @@ -1,5 +1,5 @@ ;; -*- buffer-read-only: t -*- ;; Generated automatically by gentune.sh from aarch64-cores.def (define_attr "tune" - "cortexa34,cortexa35,cortexa53,cortexa57,cortexa72,cortexa73,thunderx,thunderxt88p1,thunderxt88,octeontx,octeontxt81,octeontxt83,thunderxt81,thunderxt83,ampere1,ampere1a,ampere1b,emag,xgene1,falkor,qdf24xx,exynosm1,phecda,thunderx2t99p1,vulcan,thunderx2t99,cortexa55,cortexa75,cortexa76,cortexa76ae,cortexa77,cortexa78,cortexa78ae,cortexa78c,cortexa65,cortexa65ae,cortexx1,cortexx1c,neoversen1,ares,neoversee1,octeontx2,octeontx2t98,octeontx2t96,octeontx2t93,octeontx2f95,octeontx2f95n,octeontx2f95mm,a64fx,tsv110,thunderx3t110,neoversev1,zeus,neoverse512tvb,saphira,cortexa57cortexa53,cortexa72cortexa53,cortexa73cortexa35,cortexa73cortexa53,cortexa75cortexa55,cortexa76cortexa55,cortexr82,cortexa510,cortexa520,cortexa710,cortexa715,cortexa720,cortexx2,cortexx3,cortexx4,neoversen2,cobalt100,neoversev2,demeter,generic,generic_armv8_a,generic_armv9_a" + "cortexa34,cortexa35,cortexa53,cortexa57,cortexa72,cortexa73,thunderx,thunderxt88p1,thunderxt88,octeontx,octeontxt81,octeontxt83,thunderxt81,thunderxt83,ampere1,ampere1a,ampere1b,emag,xgene1,falkor,qdf24xx,exynosm1,phecda,thunderx2t99p1,vulcan,thunderx2t99,cortexa55,cortexa75,cortexa76,cortexa76ae,cortexa77,cortexa78,cortexa78ae,cortexa78c,cortexa65,cortexa65ae,cortexx1,cortexx1c,neoversen1,ares,neoversee1,octeontx2,octeontx2t98,octeontx2t96,octeontx2t93,octeontx2f95,octeontx2f95n,octeontx2f95mm,a64fx,tsv110,thunderx3t110,neoversev1,zeus,neoverse512tvb,saphira,oryon1,cortexa57cortexa53,cortexa72cortexa53,cortexa73cortexa35,cortexa73cortexa53,cortexa75cortexa55,cortexa76cortexa55,cortexr82,cortexa510,cortexa520,cortexa710,cortexa715,cortexa720,cortexx2,cortexx3,cortexx4,neoversen2,cobalt100,neoversev2,demeter,generic,generic_armv8_a,generic_armv9_a" (const (symbol_ref "((enum attr_tune) aarch64_tune)"))) diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 0625a5ede6f..c9d8f6b37b6 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -21382,6 +21382,7 @@ performance of the code. Permissible values for this option are: @samp{cortex-a65}, @samp{cortex-a65ae}, @samp{cortex-a34}, @samp{cortex-a78}, @samp{cortex-a78ae}, @samp{cortex-a78c}, @samp{ares}, @samp{exynos-m1}, @samp{emag}, @samp{falkor}, +@samp{oryon-1}, @samp{neoverse-512tvb}, @samp{neoverse-e1}, @samp{neoverse-n1}, @samp{neoverse-n2}, @samp{neoverse-v1}, @samp{neoverse-v2}, @samp{qdf24xx}, @samp{saphira}, @samp{phecda}, @samp{xgene1}, @samp{vulcan},
gcc-wwwdocs branch master updated. 465817d0e0a96a1e1722a67383183dbec95ab21f
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "gcc-wwwdocs". The branch, master has been updated via 465817d0e0a96a1e1722a67383183dbec95ab21f (commit) from 9d10f6fccee3a68102173f28cf312ed266b7d95d (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log - commit 465817d0e0a96a1e1722a67383183dbec95ab21f Author: Jakub Jelinek Date: Thu May 23 02:13:35 2024 +0200 Fix up year of 14.1 release. diff --git a/htdocs/develop.html b/htdocs/develop.html index 9145aceb..4cae4cbd 100644 --- a/htdocs/develop.html +++ b/htdocs/develop.html @@ -715,7 +715,7 @@ stages of development, branch points, and releases: +-- GCC 14 branch created ---+ | \ | v - | GCC 14.1 release (2023-05-07) + | GCC 14.1 release (2024-05-07) GCC 15 Stage 1 (starts 2024-04-26) | v --- Summary of changes: htdocs/develop.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) hooks/post-receive -- gcc-wwwdocs
[gcc r15-782] libstdc++: Add [[nodiscard]] to some std::locale functions
https://gcc.gnu.org/g:fd1a674ff5f37e74fbbdcdb85d78399e963eb401 commit r15-782-gfd1a674ff5f37e74fbbdcdb85d78399e963eb401 Author: Jonathan Wakely Date: Wed May 22 18:38:36 2024 +0100 libstdc++: Add [[nodiscard]] to some std::locale functions libstdc++-v3/ChangeLog: * include/bits/locale_classes.h (locale::combine) (locale::name, locale::operator==, locale::operator!=) (locale::operator(), locale::classic): Add nodiscard attribute. * include/bits/locale_classes.tcc (has_facet, use_facet): Likewise. * testsuite/22_locale/locale/cons/12438.cc: Add dg-warning for nodiscard diagnostic. * testsuite/22_locale/locale/cons/2.cc: Cast use_facet expression to void, to suppress diagnostic. * testsuite/22_locale/locale/cons/unicode.cc: Likewise. * testsuite/22_locale/locale/operations/2.cc: Add dg-warning. Diff: --- libstdc++-v3/include/bits/locale_classes.h | 7 ++- libstdc++-v3/include/bits/locale_classes.tcc| 2 ++ libstdc++-v3/testsuite/22_locale/locale/cons/12438.cc | 2 +- libstdc++-v3/testsuite/22_locale/locale/cons/2.cc | 2 +- libstdc++-v3/testsuite/22_locale/locale/cons/unicode.cc | 2 +- libstdc++-v3/testsuite/22_locale/locale/operations/2.cc | 2 +- 6 files changed, 12 insertions(+), 5 deletions(-) diff --git a/libstdc++-v3/include/bits/locale_classes.h b/libstdc++-v3/include/bits/locale_classes.h index a2e94217006..50a748066f1 100644 --- a/libstdc++-v3/include/bits/locale_classes.h +++ b/libstdc++-v3/include/bits/locale_classes.h @@ -240,6 +240,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * @throw std::runtime_error if __other has no facet of type _Facet. */ template + _GLIBCXX_NODISCARD locale combine(const locale& __other) const; @@ -248,7 +249,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * @brief Return locale name. * @return Locale name or "*" if unnamed. */ -_GLIBCXX_DEFAULT_ABI_TAG +_GLIBCXX_NODISCARD _GLIBCXX_DEFAULT_ABI_TAG string name() const; @@ -269,6 +270,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * @return True if other and this refer to the same locale instance, are * copies, or have the same name. False otherwise. */ +_GLIBCXX_NODISCARD bool operator==(const locale& __other) const throw(); @@ -279,6 +281,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * @param __other The locale to compare against. * @return ! (*this == __other) */ +_GLIBCXX_NODISCARD bool operator!=(const locale& __other) const throw() { return !(this->operator==(__other)); } @@ -300,6 +303,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * @return True if collate<_Char> facet compares __s1 < __s2, else false. */ template + _GLIBCXX_NODISCARD bool operator()(const basic_string<_Char, _Traits, _Alloc>& __s1, const basic_string<_Char, _Traits, _Alloc>& __s2) const; @@ -321,6 +325,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION /** * @brief Return reference to the C locale. */ +_GLIBCXX_NODISCARD static const locale& classic(); diff --git a/libstdc++-v3/include/bits/locale_classes.tcc b/libstdc++-v3/include/bits/locale_classes.tcc index 00eeb7dd9f8..c79574e58de 100644 --- a/libstdc++-v3/include/bits/locale_classes.tcc +++ b/libstdc++-v3/include/bits/locale_classes.tcc @@ -173,6 +173,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * @return true if @p __loc contains a facet of type _Facet, else false. */ template +_GLIBCXX_NODISCARD inline bool has_facet(const locale& __loc) _GLIBCXX_USE_NOEXCEPT { @@ -202,6 +203,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdangling-reference" template +_GLIBCXX_NODISCARD inline const _Facet& use_facet(const locale& __loc) { diff --git a/libstdc++-v3/testsuite/22_locale/locale/cons/12438.cc b/libstdc++-v3/testsuite/22_locale/locale/cons/12438.cc index 7ff3a487745..4838e1ba693 100644 --- a/libstdc++-v3/testsuite/22_locale/locale/cons/12438.cc +++ b/libstdc++-v3/testsuite/22_locale/locale/cons/12438.cc @@ -45,7 +45,7 @@ void test01(int iters) locale loc2 = locale(""); VERIFY( !has_facet(loc2) ); - loc1.combine(loc2); + loc1.combine(loc2); // { dg-warning "nodiscard" "" { target c++17 } } VERIFY( false ); } catch (std::runtime_error&) diff --git a/libstdc++-v3/testsuite/22_locale/locale/cons/2.cc b/libstdc++-v3/testsuite/22_locale/locale/cons/2.cc index 12478dbfdc2..dce150effea 100644 --- a/libstdc++-v3/testsuite/22_locale/locale/cons/2.cc +++ b/libstdc++-v3/testsuite/22_locale/locale/cons/2.cc @@ -68,7 +68,7 @@ void test01() { VERIFY( false ); } try -{ use_facet(loc02); } +{ (void) use_facet(loc02); }
[gcc r15-781] libstdc++: Fix effects of combining locales [PR108323]
https://gcc.gnu.org/g:947a9c801e818f412ad4c669a49297c3512b3a6e commit r15-781-g947a9c801e818f412ad4c669a49297c3512b3a6e Author: Jonathan Wakely Date: Tue Jan 30 14:48:28 2024 + libstdc++: Fix effects of combining locales [PR108323] This fixes a bug in locale::combine where we fail to meet the standard's requirement that the result is unnamed. It also implements two library issues related to the names of combined locales (2295 and 3676). libstdc++-v3/ChangeLog: PR libstdc++/108323 * include/bits/locale_classes.tcc (locale(const locale&, Facet*)): Return a copy of the first argument when the facet pointer is null, as per LWG 2295. (locale::combine): Ensure the result is unnamed. * src/c++11/localename.cc (_M_replace_categories): Ignore whether the second locale has a name when cat == none, as per LWG 3676. * src/c++98/locale.cc (_M_install_facet): Use __builtin_expect to predict that the facet pointer is non-null. * testsuite/22_locale/locale/cons/names.cc: New test. Diff: --- libstdc++-v3/include/bits/locale_classes.tcc | 13 - libstdc++-v3/src/c++11/localename.cc | 4 +- libstdc++-v3/src/c++98/locale.cc | 2 +- .../testsuite/22_locale/locale/cons/names.cc | 61 ++ 4 files changed, 77 insertions(+), 3 deletions(-) diff --git a/libstdc++-v3/include/bits/locale_classes.tcc b/libstdc++-v3/include/bits/locale_classes.tcc index 63097582dec..00eeb7dd9f8 100644 --- a/libstdc++-v3/include/bits/locale_classes.tcc +++ b/libstdc++-v3/include/bits/locale_classes.tcc @@ -44,6 +44,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION locale:: locale(const locale& __other, _Facet* __f) { + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 2295. Locale name when the provided Facet is a nullptr + if (__builtin_expect(!__f, 0)) + { + _M_impl = __other._M_impl; + _M_impl->_M_add_reference(); + return; + } + _M_impl = new _Impl(*__other._M_impl, 1); __try @@ -72,6 +81,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __tmp->_M_remove_reference(); __throw_exception_again; } + delete[] __tmp->_M_names[0]; + __tmp->_M_names[0] = 0; // Unnamed. return locale(__tmp); } @@ -163,7 +174,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION */ template inline bool -has_facet(const locale& __loc) throw() +has_facet(const locale& __loc) _GLIBCXX_USE_NOEXCEPT { #if __cplusplus >= 201103L static_assert(__is_base_of(locale::facet, _Facet), diff --git a/libstdc++-v3/src/c++11/localename.cc b/libstdc++-v3/src/c++11/localename.cc index cde94ec6e19..909cf4c66d3 100644 --- a/libstdc++-v3/src/c++11/localename.cc +++ b/libstdc++-v3/src/c++11/localename.cc @@ -326,7 +326,9 @@ const int num_facets = ( _M_replace_categories(const _Impl* __imp, category __cat) { category __mask = 1; -if (!_M_names[0] || !__imp->_M_names[0]) +// _GLIBCXX_RESOLVE_LIB_DEFECTS +// 3676. Name of locale composed using std::locale::none +if (!_M_names[0] || (__cat != none && !__imp->_M_names[0])) { if (_M_names[0]) { diff --git a/libstdc++-v3/src/c++98/locale.cc b/libstdc++-v3/src/c++98/locale.cc index 3749408115e..0e7533e1e15 100644 --- a/libstdc++-v3/src/c++98/locale.cc +++ b/libstdc++-v3/src/c++98/locale.cc @@ -323,7 +323,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION locale::_Impl:: _M_install_facet(const locale::id* __idp, const facet* __fp) { -if (__fp) +if (__builtin_expect(__fp != 0, 1)) { size_t __index = __idp->_M_id(); diff --git a/libstdc++-v3/testsuite/22_locale/locale/cons/names.cc b/libstdc++-v3/testsuite/22_locale/locale/cons/names.cc new file mode 100644 index 000..2a9cfe4c14d --- /dev/null +++ b/libstdc++-v3/testsuite/22_locale/locale/cons/names.cc @@ -0,0 +1,61 @@ +// { dg-do run } + +#include +#include + +void +test_pr108323() +{ + std::locale named = std::locale::classic(); + std::locale unnamed = named.combine >(named); + + // Bug libstdc++/108323 - combine does not change the locale name + VERIFY( unnamed.name() == "*" ); +} + +void +test_lwg2295() +{ + std::locale named = std::locale::classic(); + std::locale unnamed(named, ::use_facet >(named)); + VERIFY( unnamed.name() == "*" ); + + // LWG 2295. Locale name when the provided Facet is a nullptr + std::locale loc(named, (std::ctype*)0); + VERIFY( loc.name() != "*" ); + VERIFY( loc.name() == named.name() ); +} + +void +test_lwg3676() +{ + std::locale named = std::locale::classic(); + std::locale unnamed = named.combine >(named); + std::locale combo; + + // LWG 3676. Name of locale composed using std::locale::none + + combo = std::locale(named, named, std::locale::numeric); + VERIFY( combo.name() != "*" ); + combo = std::locale(named, named,
[gcc r15-780] libstdc++: Guard use of sized deallocation [PR114940]
https://gcc.gnu.org/g:b2fdd508d7e63158e9d2a6dd04f901d02900def3 commit r15-780-gb2fdd508d7e63158e9d2a6dd04f901d02900def3 Author: Jonathan Wakely Date: Wed May 22 10:32:43 2024 +0100 libstdc++: Guard use of sized deallocation [PR114940] Clang does not enable -fsized-deallocation by default, which means it can't compile our and headers. Make the __cpp_lib_generator macro depend on the compiler-defined __cpp_sized_deallocation macro, and change to use unsized deallocation when __cpp_sized_deallocation isn't defined. libstdc++-v3/ChangeLog: PR libstdc++/114940 * include/bits/version.def (generator): Depend on __cpp_sized_deallocation. * include/bits/version.h: Regenerate. * include/std/stacktrace (_GLIBCXX_SIZED_DELETE): New macro. (basic_stacktrace::_Impl::_M_deallocate): Use it. Diff: --- libstdc++-v3/include/bits/version.def | 2 +- libstdc++-v3/include/bits/version.h | 2 +- libstdc++-v3/include/std/stacktrace | 13 +++-- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/libstdc++-v3/include/bits/version.def b/libstdc++-v3/include/bits/version.def index f0ba4f2bb3d..5cbc9d1a8d8 100644 --- a/libstdc++-v3/include/bits/version.def +++ b/libstdc++-v3/include/bits/version.def @@ -1651,7 +1651,7 @@ ftms = { values = { v = 202207; cxxmin = 23; -extra_cond = "__glibcxx_coroutine"; +extra_cond = "__glibcxx_coroutine && __cpp_sized_deallocation"; }; }; diff --git a/libstdc++-v3/include/bits/version.h b/libstdc++-v3/include/bits/version.h index f30f51dcedc..164ebed4983 100644 --- a/libstdc++-v3/include/bits/version.h +++ b/libstdc++-v3/include/bits/version.h @@ -1834,7 +1834,7 @@ #undef __glibcxx_want_forward_like #if !defined(__cpp_lib_generator) -# if (__cplusplus >= 202100L) && (__glibcxx_coroutine) +# if (__cplusplus >= 202100L) && (__glibcxx_coroutine && __cpp_sized_deallocation) # define __glibcxx_generator 202207L # if defined(__glibcxx_want_all) || defined(__glibcxx_want_generator) # define __cpp_lib_generator 202207L diff --git a/libstdc++-v3/include/std/stacktrace b/libstdc++-v3/include/std/stacktrace index d217d63af3b..962dbed7a41 100644 --- a/libstdc++-v3/include/std/stacktrace +++ b/libstdc++-v3/include/std/stacktrace @@ -551,6 +551,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION #else # define _GLIBCXX_OPERATOR_NEW ::operator new # define _GLIBCXX_OPERATOR_DELETE ::operator delete +#endif + +#if __cpp_sized_deallocation +# define _GLIBCXX_SIZED_DELETE(T, p, n) \ + _GLIBCXX_OPERATOR_DELETE((p), (n) * sizeof(T)) +#else +# define _GLIBCXX_SIZED_DELETE(T, p, n) _GLIBCXX_OPERATOR_DELETE(p) #endif // Precondition: _M_frames == nullptr && __n != 0 @@ -592,8 +599,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION if (_M_capacity) { if constexpr (is_same_v>) - _GLIBCXX_OPERATOR_DELETE (static_cast(_M_frames), - _M_capacity * sizeof(value_type)); + _GLIBCXX_SIZED_DELETE(value_type, + static_cast(_M_frames), + _M_capacity); else __alloc.deallocate(_M_frames, _M_capacity); _M_frames = nullptr; @@ -601,6 +609,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } } +#undef _GLIBCXX_SIZED_DELETE #undef _GLIBCXX_OPERATOR_DELETE #undef _GLIBCXX_OPERATOR_NEW
[gcc r14-10235] c++: failure to suppress -Wsizeof-array-div in template [PR114983]
https://gcc.gnu.org/g:c27d6c7fd03f95483d372eae2c96912ceee98a5e commit r14-10235-gc27d6c7fd03f95483d372eae2c96912ceee98a5e Author: Marek Polacek Date: Wed May 8 17:02:49 2024 -0400 c++: failure to suppress -Wsizeof-array-div in template [PR114983] -Wsizeof-array-div offers a way to suppress the warning by wrapping the second operand of the division in parens: sizeof (samplesBuffer) / (sizeof(unsigned char)) but this doesn't work in a template, because we fail to propagate the suppression bits. Do it, then. The finish_parenthesized_expr hunk is not needed because suppress_warning isn't very fine-grained. But I think it makes sense to be explicit and not rely on OPT_Wparentheses also suppressing OPT_Wsizeof_array_div. PR c++/114983 gcc/cp/ChangeLog: * pt.cc (tsubst_expr) : Use copy_warning. * semantics.cc (finish_parenthesized_expr): Also suppress -Wsizeof-array-div. gcc/testsuite/ChangeLog: * g++.dg/warn/Wsizeof-array-div3.C: New test. (cherry picked from commit 646db3d30bd071a1b671b4f91c9ea2ab7f2be21c) Diff: --- gcc/cp/pt.cc | 1 + gcc/cp/semantics.cc| 2 ++ gcc/testsuite/g++.dg/warn/Wsizeof-array-div3.C | 27 ++ 3 files changed, 30 insertions(+) diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index ba47620ec59..6b54e6b10fc 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -20576,6 +20576,7 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl) TREE_READONLY (r) = 1; } SET_EXPR_LOCATION (r, EXPR_LOCATION (t)); + copy_warning (r, t); } RETURN (r); } diff --git a/gcc/cp/semantics.cc b/gcc/cp/semantics.cc index 02c7c1bf5a4..4eeec209fa4 100644 --- a/gcc/cp/semantics.cc +++ b/gcc/cp/semantics.cc @@ -2306,6 +2306,8 @@ finish_parenthesized_expr (cp_expr expr) /* This inhibits warnings in maybe_warn_unparenthesized_assignment and c_common_truthvalue_conversion. */ suppress_warning (STRIP_REFERENCE_REF (*expr), OPT_Wparentheses); + /* And maybe_warn_sizeof_array_div. */ + suppress_warning (STRIP_REFERENCE_REF (*expr), OPT_Wsizeof_array_div); } if (TREE_CODE (expr) == OFFSET_REF diff --git a/gcc/testsuite/g++.dg/warn/Wsizeof-array-div3.C b/gcc/testsuite/g++.dg/warn/Wsizeof-array-div3.C new file mode 100644 index 000..bfd690325e5 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wsizeof-array-div3.C @@ -0,0 +1,27 @@ +// PR c++/114983 +// { dg-do compile { target c++11 } } +// { dg-options "-Wsizeof-array-div" } + +using size_t = decltype (sizeof (0)); +unsigned int samplesBuffer[40]; + +template +constexpr inline size_t fn1() +{ + return ((sizeof(samplesBuffer)) / (sizeof(T))); // { dg-bogus "expression does not compute" } +} + +template +constexpr inline size_t fn2() +{ + return ((sizeof(samplesBuffer)) / sizeof(T)); // { dg-warning "expression does not compute" } +} + +size_t +g () +{ + auto sz = sizeof (samplesBuffer) / (sizeof(unsigned char)); + sz += fn1(); + sz += fn2(); // { dg-message "required from here" } + return sz; +}
[gcc r15-779] c++: canonicity of fn types w/ complex eh specs [PR115159]
https://gcc.gnu.org/g:3c98d06a9016a0fa3a806879bd168f13b8a606f8 commit r15-779-g3c98d06a9016a0fa3a806879bd168f13b8a606f8 Author: Patrick Palka Date: Wed May 22 17:45:04 2024 -0400 c++: canonicity of fn types w/ complex eh specs [PR115159] Here the member functions QList::g and QList::h are given the same function type by build_cp_fntype_variant since their noexcept-specs are equivalent according to cp_tree_equal. In doing so however this means that the function type of QList::h refers to a function parameter from QList::g, which ends up confusing modules streaming. I'm not sure if modules can be fixed to handle this situation, but regardless it seems weird in principle that a function parameter can escape in such a way. The analogous situation with a trailing return type and decltype auto g(QList ) -> decltype(f(other)); auto h(QList ) -> decltype(f(other)); behaves better because we don't canonicalize decltype, and so the function types of g and h are non-canonical and therefore not shared. In light of this, it seems natural to treat function types with complex noexcept-specs as non-canonical as well so that each such function declaration is given a unique function type node. (The main benefit of type canonicalization is to speed up repeated type comparisons, but it should be rare to repeatedly compare two otherwise compatible function types with complex noexcept-specs.) To that end, this patch strengthens the ce_exact case of comp_except_specs to require identity instead of equivalence of the noexcept-spec so that build_cp_fntype_variant doesn't reuse a variant when it shouldn't. In turn we need to use structural equality for types with a complex eh spec. This lets us get rid of the tricky handling of canonical types when updating unparsed noexcept-spec variants. PR c++/115159 gcc/cp/ChangeLog: * tree.cc (build_cp_fntype_variant): Always use structural equality for types with a complex exception specification. (fixup_deferred_exception_variants): Use structural equality for adjusted variants. * typeck.cc (comp_except_specs): Require == instead of cp_tree_equal for ce_exact noexcept-spec comparison. gcc/testsuite/ChangeLog: * g++.dg/modules/noexcept-2_a.H: New test. * g++.dg/modules/noexcept-2_b.C: New test. Reviewed-by: Jason Merrill Diff: --- gcc/cp/tree.cc | 48 ++--- gcc/cp/typeck.cc| 4 ++- gcc/testsuite/g++.dg/modules/noexcept-2_a.H | 24 +++ gcc/testsuite/g++.dg/modules/noexcept-2_b.C | 4 +++ 4 files changed, 41 insertions(+), 39 deletions(-) diff --git a/gcc/cp/tree.cc b/gcc/cp/tree.cc index 9d37d255d8d..4d87661b4ad 100644 --- a/gcc/cp/tree.cc +++ b/gcc/cp/tree.cc @@ -2793,9 +2793,13 @@ build_cp_fntype_variant (tree type, cp_ref_qualifier rqual, /* Canonicalize the exception specification. */ tree cr = flag_noexcept_type ? canonical_eh_spec (raises) : NULL_TREE; + bool complex_eh_spec_p = (cr && cr != noexcept_true_spec + && !UNPARSED_NOEXCEPT_SPEC_P (cr)); - if (TYPE_STRUCTURAL_EQUALITY_P (type)) -/* Propagate structural equality. */ + if (TYPE_STRUCTURAL_EQUALITY_P (type) || complex_eh_spec_p) +/* Propagate structural equality. And always use structural equality + for function types with a complex noexcept-spec since their identity + may depend on e.g. whether comparing_specializations is set. */ SET_TYPE_STRUCTURAL_EQUALITY (v); else if (TYPE_CANONICAL (type) != type || cr != raises || late) /* Build the underlying canonical type, since it is different @@ -2812,55 +2816,23 @@ build_cp_fntype_variant (tree type, cp_ref_qualifier rqual, /* TYPE is a function or method type with a deferred exception specification that has been parsed to RAISES. Fixup all the type variants that are affected in place. Via decltype &| noexcept - tricks, the unparsed spec could have escaped into the type system. - The general case is hard to fixup canonical types for. */ + tricks, the unparsed spec could have escaped into the type system. */ void fixup_deferred_exception_variants (tree type, tree raises) { tree original = TYPE_RAISES_EXCEPTIONS (type); - tree cr = flag_noexcept_type ? canonical_eh_spec (raises) : NULL_TREE; gcc_checking_assert (UNPARSED_NOEXCEPT_SPEC_P (original)); - /* Though sucky, this walk will process the canonical variants - first. */ - tree prev = NULL_TREE; for (tree variant = TYPE_MAIN_VARIANT (type); - variant; prev = variant, variant = TYPE_NEXT_VARIANT (variant)) + variant; variant = TYPE_NEXT_VARIANT (variant)) if (TYPE_RAISES_EXCEPTIONS (variant) == original)
[gcc r15-778] aarch64: Fold vget_high_* intrinsics to BIT_FIELD_REF [PR102171]
https://gcc.gnu.org/g:1d1ef1c22752b3e250ee769ae6d79f537471a57f commit r15-778-g1d1ef1c22752b3e250ee769ae6d79f537471a57f Author: Pengxuan Zheng Date: Tue May 21 10:55:06 2024 -0700 aarch64: Fold vget_high_* intrinsics to BIT_FIELD_REF [PR102171] This patch is a follow-up of r15-697-ga2e4fe5a53cf75 to also fold vget_high_* intrinsics to BIT_FILED_REF and remove the vget_high_* definitions from arm_neon.h to use the new intrinsics framework. PR target/102171 gcc/ChangeLog: * config/aarch64/aarch64-builtins.cc (AARCH64_SIMD_VGET_HIGH_BUILTINS): New macro to create definitions for all vget_high intrinsics. (VGET_HIGH_BUILTIN): Likewise. (enum aarch64_builtins): Add vget_high function codes. (AARCH64_SIMD_VGET_LOW_BUILTINS): Delete duplicate macro. (aarch64_general_fold_builtin): Fold vget_high calls. * config/aarch64/aarch64-simd-builtins.def: Delete vget_high builtins. * config/aarch64/aarch64-simd.md (aarch64_get_high): Delete. (aarch64_vget_hi_halfv8bf): Likewise. * config/aarch64/arm_neon.h (__attribute__): Delete. (vget_high_f16): Likewise. (vget_high_f32): Likewise. (vget_high_f64): Likewise. (vget_high_p8): Likewise. (vget_high_p16): Likewise. (vget_high_p64): Likewise. (vget_high_s8): Likewise. (vget_high_s16): Likewise. (vget_high_s32): Likewise. (vget_high_s64): Likewise. (vget_high_u8): Likewise. (vget_high_u16): Likewise. (vget_high_u32): Likewise. (vget_high_u64): Likewise. (vget_high_bf16): Likewise. gcc/testsuite/ChangeLog: * gcc.target/aarch64/vget_high_2.c: New test. * gcc.target/aarch64/vget_high_2_be.c: New test. Signed-off-by: Pengxuan Zheng Diff: --- gcc/config/aarch64/aarch64-builtins.cc| 59 gcc/config/aarch64/aarch64-simd-builtins.def | 6 -- gcc/config/aarch64/aarch64-simd.md| 22 - gcc/config/aarch64/arm_neon.h | 105 -- gcc/testsuite/gcc.target/aarch64/vget_high_2.c| 30 +++ gcc/testsuite/gcc.target/aarch64/vget_high_2_be.c | 31 +++ 6 files changed, 104 insertions(+), 149 deletions(-) diff --git a/gcc/config/aarch64/aarch64-builtins.cc b/gcc/config/aarch64/aarch64-builtins.cc index 11b888016ed..f8eeccb554d 100644 --- a/gcc/config/aarch64/aarch64-builtins.cc +++ b/gcc/config/aarch64/aarch64-builtins.cc @@ -675,6 +675,23 @@ static aarch64_simd_builtin_datum aarch64_simd_builtin_data[] = { VGET_LOW_BUILTIN(u64) \ VGET_LOW_BUILTIN(bf16) +#define AARCH64_SIMD_VGET_HIGH_BUILTINS \ + VGET_HIGH_BUILTIN(f16) \ + VGET_HIGH_BUILTIN(f32) \ + VGET_HIGH_BUILTIN(f64) \ + VGET_HIGH_BUILTIN(p8) \ + VGET_HIGH_BUILTIN(p16) \ + VGET_HIGH_BUILTIN(p64) \ + VGET_HIGH_BUILTIN(s8) \ + VGET_HIGH_BUILTIN(s16) \ + VGET_HIGH_BUILTIN(s32) \ + VGET_HIGH_BUILTIN(s64) \ + VGET_HIGH_BUILTIN(u8) \ + VGET_HIGH_BUILTIN(u16) \ + VGET_HIGH_BUILTIN(u32) \ + VGET_HIGH_BUILTIN(u64) \ + VGET_HIGH_BUILTIN(bf16) + typedef struct { const char *name; @@ -717,6 +734,9 @@ typedef struct #define VGET_LOW_BUILTIN(A) \ AARCH64_SIMD_BUILTIN_VGET_LOW_##A, +#define VGET_HIGH_BUILTIN(A) \ + AARCH64_SIMD_BUILTIN_VGET_HIGH_##A, + #undef VAR1 #define VAR1(T, N, MAP, FLAG, A) \ AARCH64_SIMD_BUILTIN_##T##_##N##A, @@ -753,6 +773,7 @@ enum aarch64_builtins /* SIMD intrinsic builtins. */ AARCH64_SIMD_VREINTERPRET_BUILTINS AARCH64_SIMD_VGET_LOW_BUILTINS + AARCH64_SIMD_VGET_HIGH_BUILTINS /* ARMv8.3-A Pointer Authentication Builtins. */ AARCH64_PAUTH_BUILTIN_AUTIA1716, AARCH64_PAUTH_BUILTIN_PACIA1716, @@ -855,26 +876,21 @@ static aarch64_fcmla_laneq_builtin_datum aarch64_fcmla_lane_builtin_data[] = { false \ }, -#define AARCH64_SIMD_VGET_LOW_BUILTINS \ - VGET_LOW_BUILTIN(f16) \ - VGET_LOW_BUILTIN(f32) \ - VGET_LOW_BUILTIN(f64) \ - VGET_LOW_BUILTIN(p8) \ - VGET_LOW_BUILTIN(p16) \ - VGET_LOW_BUILTIN(p64) \ - VGET_LOW_BUILTIN(s8) \ - VGET_LOW_BUILTIN(s16) \ - VGET_LOW_BUILTIN(s32) \ - VGET_LOW_BUILTIN(s64) \ - VGET_LOW_BUILTIN(u8) \ - VGET_LOW_BUILTIN(u16) \ - VGET_LOW_BUILTIN(u32) \ - VGET_LOW_BUILTIN(u64) \ - VGET_LOW_BUILTIN(bf16) +#undef VGET_HIGH_BUILTIN +#define VGET_HIGH_BUILTIN(A) \ + {"vget_high_" #A, \ + AARCH64_SIMD_BUILTIN_VGET_HIGH_##A, \ + 2, \ + { SIMD_INTR_MODE(A, d), SIMD_INTR_MODE(A, q) }, \ + { SIMD_INTR_QUAL(A), SIMD_INTR_QUAL(A) }, \ + FLAG_AUTO_FP, \ + false \ + }, static const aarch64_simd_intrinsic_datum aarch64_simd_intrinsic_data[] = { AARCH64_SIMD_VREINTERPRET_BUILTINS AARCH64_SIMD_VGET_LOW_BUILTINS + AARCH64_SIMD_VGET_HIGH_BUILTINS }; @@ -3270,6 +3286,10 @@
[gcc r11-11443] testsuite: Verify r0-r3 are extended with CMSE
https://gcc.gnu.org/g:08ca81e4b49bda153d678a372df7f7143a94f4ad commit r11-11443-g08ca81e4b49bda153d678a372df7f7143a94f4ad Author: Torbjörn SVENSSON Date: Sat Apr 27 15:57:27 2024 +0200 testsuite: Verify r0-r3 are extended with CMSE Add regression test to the existing zero/sign extend tests for CMSE to verify that r0, r1, r2 and r3 are properly extended, not just r0. boolCharShortEnumSecureFunc test is done using -O0 to ensure the instructions are in a predictable order. gcc/testsuite/ChangeLog: * gcc.target/arm/cmse/extend-param.c: Add regression test. Add -fshort-enums. * gcc.target/arm/cmse/extend-return.c: Add -fshort-enums option. Signed-off-by: Torbjörn SVENSSON (cherry picked from commit 9ddad76e98ac8f257f90b3814ed3c6ba78d0f3c7) Diff: --- gcc/testsuite/gcc.target/arm/cmse/extend-param.c | 21 + gcc/testsuite/gcc.target/arm/cmse/extend-return.c | 4 ++-- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/gcc/testsuite/gcc.target/arm/cmse/extend-param.c b/gcc/testsuite/gcc.target/arm/cmse/extend-param.c index 01fac786238..d01ef87e0be 100644 --- a/gcc/testsuite/gcc.target/arm/cmse/extend-param.c +++ b/gcc/testsuite/gcc.target/arm/cmse/extend-param.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-mcmse" } */ +/* { dg-options "-mcmse -fshort-enums" } */ /* { dg-final { check-function-bodies "**" "" "" } } */ #include @@ -78,7 +78,6 @@ __attribute__((cmse_nonsecure_entry)) char enumSecureFunc (enum offset index) { if (index >= ARRAY_SIZE) return 0; return array[index]; - } /* @@ -88,9 +87,23 @@ __attribute__((cmse_nonsecure_entry)) char enumSecureFunc (enum offset index) { ** ... */ __attribute__((cmse_nonsecure_entry)) char boolSecureFunc (bool index) { - if (index >= ARRAY_SIZE) return 0; return array[index]; +} -} \ No newline at end of file +/* +**__acle_se_boolCharShortEnumSecureFunc: +** ... +** uxtbr0, r0 +** uxtbr1, r1 +** uxthr2, r2 +** uxtbr3, r3 +** ... +*/ +__attribute__((cmse_nonsecure_entry,optimize(0))) char boolCharShortEnumSecureFunc (bool a, unsigned char b, unsigned short c, enum offset d) { + size_t index = a + b + c + d; + if (index >= ARRAY_SIZE) +return 0; + return array[index]; +} diff --git a/gcc/testsuite/gcc.target/arm/cmse/extend-return.c b/gcc/testsuite/gcc.target/arm/cmse/extend-return.c index cf731ed33df..081de0d699f 100644 --- a/gcc/testsuite/gcc.target/arm/cmse/extend-return.c +++ b/gcc/testsuite/gcc.target/arm/cmse/extend-return.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-mcmse" } */ +/* { dg-options "-mcmse -fshort-enums" } */ /* { dg-final { check-function-bodies "**" "" "" } } */ #include @@ -89,4 +89,4 @@ unsigned char __attribute__((noipa)) enumNonsecure0 (ns_enum_foo_t * ns_foo_p) unsigned char boolNonsecure0 (ns_bool_foo_t * ns_foo_p) { return ns_foo_p (); -} \ No newline at end of file +}
[gcc r12-10463] testsuite: Verify r0-r3 are extended with CMSE
https://gcc.gnu.org/g:d9c89402b54be4c15bb3c7bcce3465f534746204 commit r12-10463-gd9c89402b54be4c15bb3c7bcce3465f534746204 Author: Torbjörn SVENSSON Date: Sat Apr 27 15:57:27 2024 +0200 testsuite: Verify r0-r3 are extended with CMSE Add regression test to the existing zero/sign extend tests for CMSE to verify that r0, r1, r2 and r3 are properly extended, not just r0. boolCharShortEnumSecureFunc test is done using -O0 to ensure the instructions are in a predictable order. gcc/testsuite/ChangeLog: * gcc.target/arm/cmse/extend-param.c: Add regression test. Add -fshort-enums. * gcc.target/arm/cmse/extend-return.c: Add -fshort-enums option. Signed-off-by: Torbjörn SVENSSON (cherry picked from commit 9ddad76e98ac8f257f90b3814ed3c6ba78d0f3c7) Diff: --- gcc/testsuite/gcc.target/arm/cmse/extend-param.c | 21 + gcc/testsuite/gcc.target/arm/cmse/extend-return.c | 4 ++-- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/gcc/testsuite/gcc.target/arm/cmse/extend-param.c b/gcc/testsuite/gcc.target/arm/cmse/extend-param.c index 01fac786238..d01ef87e0be 100644 --- a/gcc/testsuite/gcc.target/arm/cmse/extend-param.c +++ b/gcc/testsuite/gcc.target/arm/cmse/extend-param.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-mcmse" } */ +/* { dg-options "-mcmse -fshort-enums" } */ /* { dg-final { check-function-bodies "**" "" "" } } */ #include @@ -78,7 +78,6 @@ __attribute__((cmse_nonsecure_entry)) char enumSecureFunc (enum offset index) { if (index >= ARRAY_SIZE) return 0; return array[index]; - } /* @@ -88,9 +87,23 @@ __attribute__((cmse_nonsecure_entry)) char enumSecureFunc (enum offset index) { ** ... */ __attribute__((cmse_nonsecure_entry)) char boolSecureFunc (bool index) { - if (index >= ARRAY_SIZE) return 0; return array[index]; +} -} \ No newline at end of file +/* +**__acle_se_boolCharShortEnumSecureFunc: +** ... +** uxtbr0, r0 +** uxtbr1, r1 +** uxthr2, r2 +** uxtbr3, r3 +** ... +*/ +__attribute__((cmse_nonsecure_entry,optimize(0))) char boolCharShortEnumSecureFunc (bool a, unsigned char b, unsigned short c, enum offset d) { + size_t index = a + b + c + d; + if (index >= ARRAY_SIZE) +return 0; + return array[index]; +} diff --git a/gcc/testsuite/gcc.target/arm/cmse/extend-return.c b/gcc/testsuite/gcc.target/arm/cmse/extend-return.c index cf731ed33df..081de0d699f 100644 --- a/gcc/testsuite/gcc.target/arm/cmse/extend-return.c +++ b/gcc/testsuite/gcc.target/arm/cmse/extend-return.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-mcmse" } */ +/* { dg-options "-mcmse -fshort-enums" } */ /* { dg-final { check-function-bodies "**" "" "" } } */ #include @@ -89,4 +89,4 @@ unsigned char __attribute__((noipa)) enumNonsecure0 (ns_enum_foo_t * ns_foo_p) unsigned char boolNonsecure0 (ns_bool_foo_t * ns_foo_p) { return ns_foo_p (); -} \ No newline at end of file +}
[gcc r13-8795] testsuite: Verify r0-r3 are extended with CMSE
https://gcc.gnu.org/g:75d394c20b0ad85dfe8511324d61d13e453c9285 commit r13-8795-g75d394c20b0ad85dfe8511324d61d13e453c9285 Author: Torbjörn SVENSSON Date: Sat Apr 27 15:57:27 2024 +0200 testsuite: Verify r0-r3 are extended with CMSE Add regression test to the existing zero/sign extend tests for CMSE to verify that r0, r1, r2 and r3 are properly extended, not just r0. boolCharShortEnumSecureFunc test is done using -O0 to ensure the instructions are in a predictable order. gcc/testsuite/ChangeLog: * gcc.target/arm/cmse/extend-param.c: Add regression test. Add -fshort-enums. * gcc.target/arm/cmse/extend-return.c: Add -fshort-enums option. Signed-off-by: Torbjörn SVENSSON (cherry picked from commit 9ddad76e98ac8f257f90b3814ed3c6ba78d0f3c7) Diff: --- gcc/testsuite/gcc.target/arm/cmse/extend-param.c | 21 + gcc/testsuite/gcc.target/arm/cmse/extend-return.c | 4 ++-- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/gcc/testsuite/gcc.target/arm/cmse/extend-param.c b/gcc/testsuite/gcc.target/arm/cmse/extend-param.c index 01fac786238..d01ef87e0be 100644 --- a/gcc/testsuite/gcc.target/arm/cmse/extend-param.c +++ b/gcc/testsuite/gcc.target/arm/cmse/extend-param.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-mcmse" } */ +/* { dg-options "-mcmse -fshort-enums" } */ /* { dg-final { check-function-bodies "**" "" "" } } */ #include @@ -78,7 +78,6 @@ __attribute__((cmse_nonsecure_entry)) char enumSecureFunc (enum offset index) { if (index >= ARRAY_SIZE) return 0; return array[index]; - } /* @@ -88,9 +87,23 @@ __attribute__((cmse_nonsecure_entry)) char enumSecureFunc (enum offset index) { ** ... */ __attribute__((cmse_nonsecure_entry)) char boolSecureFunc (bool index) { - if (index >= ARRAY_SIZE) return 0; return array[index]; +} -} \ No newline at end of file +/* +**__acle_se_boolCharShortEnumSecureFunc: +** ... +** uxtbr0, r0 +** uxtbr1, r1 +** uxthr2, r2 +** uxtbr3, r3 +** ... +*/ +__attribute__((cmse_nonsecure_entry,optimize(0))) char boolCharShortEnumSecureFunc (bool a, unsigned char b, unsigned short c, enum offset d) { + size_t index = a + b + c + d; + if (index >= ARRAY_SIZE) +return 0; + return array[index]; +} diff --git a/gcc/testsuite/gcc.target/arm/cmse/extend-return.c b/gcc/testsuite/gcc.target/arm/cmse/extend-return.c index cf731ed33df..081de0d699f 100644 --- a/gcc/testsuite/gcc.target/arm/cmse/extend-return.c +++ b/gcc/testsuite/gcc.target/arm/cmse/extend-return.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-mcmse" } */ +/* { dg-options "-mcmse -fshort-enums" } */ /* { dg-final { check-function-bodies "**" "" "" } } */ #include @@ -89,4 +89,4 @@ unsigned char __attribute__((noipa)) enumNonsecure0 (ns_enum_foo_t * ns_foo_p) unsigned char boolNonsecure0 (ns_bool_foo_t * ns_foo_p) { return ns_foo_p (); -} \ No newline at end of file +}
[gcc r14-10234] testsuite: Verify r0-r3 are extended with CMSE
https://gcc.gnu.org/g:da3a6b0dda45bc676bb985d7940853b50803e11a commit r14-10234-gda3a6b0dda45bc676bb985d7940853b50803e11a Author: Torbjörn SVENSSON Date: Sat Apr 27 15:57:27 2024 +0200 testsuite: Verify r0-r3 are extended with CMSE Add regression test to the existing zero/sign extend tests for CMSE to verify that r0, r1, r2 and r3 are properly extended, not just r0. boolCharShortEnumSecureFunc test is done using -O0 to ensure the instructions are in a predictable order. gcc/testsuite/ChangeLog: * gcc.target/arm/cmse/extend-param.c: Add regression test. Add -fshort-enums. * gcc.target/arm/cmse/extend-return.c: Add -fshort-enums option. Signed-off-by: Torbjörn SVENSSON (cherry picked from commit 9ddad76e98ac8f257f90b3814ed3c6ba78d0f3c7) Diff: --- gcc/testsuite/gcc.target/arm/cmse/extend-param.c | 21 + gcc/testsuite/gcc.target/arm/cmse/extend-return.c | 4 ++-- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/gcc/testsuite/gcc.target/arm/cmse/extend-param.c b/gcc/testsuite/gcc.target/arm/cmse/extend-param.c index 01fac786238..d01ef87e0be 100644 --- a/gcc/testsuite/gcc.target/arm/cmse/extend-param.c +++ b/gcc/testsuite/gcc.target/arm/cmse/extend-param.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-mcmse" } */ +/* { dg-options "-mcmse -fshort-enums" } */ /* { dg-final { check-function-bodies "**" "" "" } } */ #include @@ -78,7 +78,6 @@ __attribute__((cmse_nonsecure_entry)) char enumSecureFunc (enum offset index) { if (index >= ARRAY_SIZE) return 0; return array[index]; - } /* @@ -88,9 +87,23 @@ __attribute__((cmse_nonsecure_entry)) char enumSecureFunc (enum offset index) { ** ... */ __attribute__((cmse_nonsecure_entry)) char boolSecureFunc (bool index) { - if (index >= ARRAY_SIZE) return 0; return array[index]; +} -} \ No newline at end of file +/* +**__acle_se_boolCharShortEnumSecureFunc: +** ... +** uxtbr0, r0 +** uxtbr1, r1 +** uxthr2, r2 +** uxtbr3, r3 +** ... +*/ +__attribute__((cmse_nonsecure_entry,optimize(0))) char boolCharShortEnumSecureFunc (bool a, unsigned char b, unsigned short c, enum offset d) { + size_t index = a + b + c + d; + if (index >= ARRAY_SIZE) +return 0; + return array[index]; +} diff --git a/gcc/testsuite/gcc.target/arm/cmse/extend-return.c b/gcc/testsuite/gcc.target/arm/cmse/extend-return.c index cf731ed33df..081de0d699f 100644 --- a/gcc/testsuite/gcc.target/arm/cmse/extend-return.c +++ b/gcc/testsuite/gcc.target/arm/cmse/extend-return.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-mcmse" } */ +/* { dg-options "-mcmse -fshort-enums" } */ /* { dg-final { check-function-bodies "**" "" "" } } */ #include @@ -89,4 +89,4 @@ unsigned char __attribute__((noipa)) enumNonsecure0 (ns_enum_foo_t * ns_foo_p) unsigned char boolNonsecure0 (ns_bool_foo_t * ns_foo_p) { return ns_foo_p (); -} \ No newline at end of file +}
[gcc r15-777] testsuite: Verify r0-r3 are extended with CMSE
https://gcc.gnu.org/g:9ddad76e98ac8f257f90b3814ed3c6ba78d0f3c7 commit r15-777-g9ddad76e98ac8f257f90b3814ed3c6ba78d0f3c7 Author: Torbjörn SVENSSON Date: Sat Apr 27 15:57:27 2024 +0200 testsuite: Verify r0-r3 are extended with CMSE Add regression test to the existing zero/sign extend tests for CMSE to verify that r0, r1, r2 and r3 are properly extended, not just r0. boolCharShortEnumSecureFunc test is done using -O0 to ensure the instructions are in a predictable order. gcc/testsuite/ChangeLog: * gcc.target/arm/cmse/extend-param.c: Add regression test. Add -fshort-enums. * gcc.target/arm/cmse/extend-return.c: Add -fshort-enums option. Signed-off-by: Torbjörn SVENSSON Diff: --- gcc/testsuite/gcc.target/arm/cmse/extend-param.c | 21 + gcc/testsuite/gcc.target/arm/cmse/extend-return.c | 4 ++-- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/gcc/testsuite/gcc.target/arm/cmse/extend-param.c b/gcc/testsuite/gcc.target/arm/cmse/extend-param.c index 01fac786238..d01ef87e0be 100644 --- a/gcc/testsuite/gcc.target/arm/cmse/extend-param.c +++ b/gcc/testsuite/gcc.target/arm/cmse/extend-param.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-mcmse" } */ +/* { dg-options "-mcmse -fshort-enums" } */ /* { dg-final { check-function-bodies "**" "" "" } } */ #include @@ -78,7 +78,6 @@ __attribute__((cmse_nonsecure_entry)) char enumSecureFunc (enum offset index) { if (index >= ARRAY_SIZE) return 0; return array[index]; - } /* @@ -88,9 +87,23 @@ __attribute__((cmse_nonsecure_entry)) char enumSecureFunc (enum offset index) { ** ... */ __attribute__((cmse_nonsecure_entry)) char boolSecureFunc (bool index) { - if (index >= ARRAY_SIZE) return 0; return array[index]; +} -} \ No newline at end of file +/* +**__acle_se_boolCharShortEnumSecureFunc: +** ... +** uxtbr0, r0 +** uxtbr1, r1 +** uxthr2, r2 +** uxtbr3, r3 +** ... +*/ +__attribute__((cmse_nonsecure_entry,optimize(0))) char boolCharShortEnumSecureFunc (bool a, unsigned char b, unsigned short c, enum offset d) { + size_t index = a + b + c + d; + if (index >= ARRAY_SIZE) +return 0; + return array[index]; +} diff --git a/gcc/testsuite/gcc.target/arm/cmse/extend-return.c b/gcc/testsuite/gcc.target/arm/cmse/extend-return.c index cf731ed33df..081de0d699f 100644 --- a/gcc/testsuite/gcc.target/arm/cmse/extend-return.c +++ b/gcc/testsuite/gcc.target/arm/cmse/extend-return.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-mcmse" } */ +/* { dg-options "-mcmse -fshort-enums" } */ /* { dg-final { check-function-bodies "**" "" "" } } */ #include @@ -89,4 +89,4 @@ unsigned char __attribute__((noipa)) enumNonsecure0 (ns_enum_foo_t * ns_foo_p) unsigned char boolNonsecure0 (ns_bool_foo_t * ns_foo_p) { return ns_foo_p (); -} \ No newline at end of file +}
[gcc r14-10233] Fix internal error in seh_cfa_offset with -O2 -fno-omit-frame-pointer
https://gcc.gnu.org/g:2f0e0862406a17bb8bf4ad948ae22916bae092a0 commit r14-10233-g2f0e0862406a17bb8bf4ad948ae22916bae092a0 Author: Eric Botcazou Date: Wed May 22 18:10:39 2024 +0200 Fix internal error in seh_cfa_offset with -O2 -fno-omit-frame-pointer The problem directly comes from the -ffold-mem-offsets pass messing up with the prologue and the frame-related instructions, which is a no-no with SEH, so the fix simply disconnects the pass in these circumstances. gcc/ PR rtl-optimization/115038 * fold-mem-offsets.cc (fold_offsets): Return 0 if the defining instruction of the register is frame related. gcc/testsuite/ * g++.dg/opt/fmo1.C: New test. Diff: --- gcc/fold-mem-offsets.cc | 2 +- gcc/testsuite/g++.dg/opt/fmo1.C | 25 + 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/gcc/fold-mem-offsets.cc b/gcc/fold-mem-offsets.cc index 2e15b05529e..84b9623058b 100644 --- a/gcc/fold-mem-offsets.cc +++ b/gcc/fold-mem-offsets.cc @@ -491,7 +491,7 @@ fold_offsets (rtx_insn *insn, rtx reg, bool analyze, bitmap foldable_insns) { rtx_insn *def = get_single_def_in_bb (insn, reg); - if (!def || GET_CODE (PATTERN (def)) != SET) + if (!def || RTX_FRAME_RELATED_P (def) || GET_CODE (PATTERN (def)) != SET) return 0; rtx dest = SET_DEST (PATTERN (def)); diff --git a/gcc/testsuite/g++.dg/opt/fmo1.C b/gcc/testsuite/g++.dg/opt/fmo1.C new file mode 100644 index 000..f0ae624c61a --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/fmo1.C @@ -0,0 +1,25 @@ +// PR rtl-optimization/115038 +// Reported by Christoph Reiter + +// { dg-do compile } +// { dg-options "-O2 -fno-omit-frame-pointer" } + +struct d { + d(); +}; + +struct e { + e() : c(1.0) {} + float c; +}; + +class k { + d g; + e h; +}; + +class a { + k f; +} a; + +k b;
[gcc r13-8794] Fortran: fix issues with class(*) assignment [PR114827]
https://gcc.gnu.org/g:f0b88ec4ae829798cb533618f781ca467bab6b9b commit r13-8794-gf0b88ec4ae829798cb533618f781ca467bab6b9b Author: Harald Anlauf Date: Mon Apr 29 19:52:52 2024 +0200 Fortran: fix issues with class(*) assignment [PR114827] gcc/fortran/ChangeLog: PR fortran/114827 * trans-array.cc (gfc_alloc_allocatable_for_assignment): Take into account _len of unlimited polymorphic entities when calculating the effective element size for allocation size and array span. Set _len of lhs to _len of rhs. * trans-expr.cc (trans_class_assignment): Take into account _len of unlimited polymorphic entities for allocation size. gcc/testsuite/ChangeLog: PR fortran/114827 * gfortran.dg/asan/unlimited_polymorphic_34.f90: New test. (cherry picked from commit 21e7aa5f3ea44ca2fef8deb8788edffc04901b5c) Diff: --- gcc/fortran/trans-array.cc | 16 +++ gcc/fortran/trans-expr.cc | 13 ++ .../gfortran.dg/asan/unlimited_polymorphic_34.f90 | 135 + 3 files changed, 164 insertions(+) diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc index 5eef4b4ec87..f38e872f5d9 100644 --- a/gcc/fortran/trans-array.cc +++ b/gcc/fortran/trans-array.cc @@ -11008,6 +11008,19 @@ gfc_alloc_allocatable_for_assignment (gfc_loopinfo *loop, gfc_add_modify (, linfo->delta[dim], tmp); } + /* Take into account _len of unlimited polymorphic entities, so that span + for array descriptors and allocation sizes are computed correctly. */ + if (UNLIMITED_POLY (expr2)) +{ + tree len = gfc_class_len_get (TREE_OPERAND (desc2, 0)); + len = fold_build2_loc (input_location, MAX_EXPR, size_type_node, +fold_convert (size_type_node, len), +size_one_node); + elemsize2 = fold_build2_loc (input_location, MULT_EXPR, + gfc_array_index_type, elemsize2, + fold_convert (gfc_array_index_type, len)); +} + if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (desc))) gfc_conv_descriptor_span_set (, desc, elemsize2); @@ -11054,6 +11067,9 @@ gfc_alloc_allocatable_for_assignment (gfc_loopinfo *loop, gfc_add_modify (, tmp, fold_convert (TREE_TYPE (tmp), TYPE_SIZE_UNIT (type))); + else if (UNLIMITED_POLY (expr2)) + gfc_add_modify (, tmp, + gfc_class_len_get (TREE_OPERAND (desc2, 0))); else gfc_add_modify (, tmp, build_int_cst (TREE_TYPE (tmp), 0)); diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc index 2b2dceb8d0f..5946aa81391 100644 --- a/gcc/fortran/trans-expr.cc +++ b/gcc/fortran/trans-expr.cc @@ -11668,6 +11668,19 @@ trans_class_assignment (stmtblock_t *block, gfc_expr *lhs, gfc_expr *rhs, old_vptr = build_int_cst (TREE_TYPE (vptr), 0); size = gfc_vptr_size_get (rhs_vptr); + + /* Take into account _len of unlimited polymorphic entities. +TODO: handle class(*) allocatable function results on rhs. */ + if (UNLIMITED_POLY (rhs) && rhs->expr_type == EXPR_VARIABLE) + { + tree len = trans_get_upoly_len (block, rhs); + len = fold_build2_loc (input_location, MAX_EXPR, size_type_node, +fold_convert (size_type_node, len), +size_one_node); + size = fold_build2_loc (input_location, MULT_EXPR, TREE_TYPE (size), + size, fold_convert (TREE_TYPE (size), len)); + } + tmp = lse->expr; class_han = GFC_CLASS_TYPE_P (TREE_TYPE (tmp)) ? gfc_class_data_get (tmp) : tmp; diff --git a/gcc/testsuite/gfortran.dg/asan/unlimited_polymorphic_34.f90 b/gcc/testsuite/gfortran.dg/asan/unlimited_polymorphic_34.f90 new file mode 100644 index 000..c69158a1b55 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/asan/unlimited_polymorphic_34.f90 @@ -0,0 +1,135 @@ +! { dg-do run } +! PR fortran/114827 - issues with class(*) assignment found by valgrind +! +! Contributed by Neil Carlson + +program main + implicit none + call run + call run1 + call run2 +contains + ! Scalar tests + subroutine run () +character(*),parameter :: c = 'fubarfubarfubarfubarfubarfu' +character(*,kind=4), parameter :: d = 4_"abcdef" +complex, parameter :: z = (1.,2.) +class(*), allocatable :: y + +call foo (c, y) +select type (y) +type is (character(*)) +! print *, y(5:6) ! ICE (-> pr114874) + if (y /= c) stop 1 +class default + stop 2 +end select + +call foo (z, y) +select type (y) +type is (complex) + if (y /= z) stop 3 +class default +
[gcc r13-8793] Fortran: fix reallocation on assignment of polymorphic variables [PR110415]
https://gcc.gnu.org/g:2ebf3af1f84d54fbda172eff105a8842c685d11d commit r13-8793-g2ebf3af1f84d54fbda172eff105a8842c685d11d Author: Andrew Jenner Date: Tue Nov 28 15:27:05 2023 + Fortran: fix reallocation on assignment of polymorphic variables [PR110415] This patch fixes two bugs related to polymorphic class assignment in the Fortran front-end. One (described in PR110415) is an issue with the malloc and realloc calls using the size from the old vptr rather than the new one. The other is caused by the return value from the realloc call being ignored. Testcases are added for these issues. 2023-11-28 Andrew Jenner gcc/fortran/ PR fortran/110415 * trans-expr.cc (trans_class_vptr_len_assignment): Add from_vptrp parameter. Populate it. Don't check for DECL_P when deciding whether to create temporary. (trans_class_pointer_fcn, gfc_trans_pointer_assignment): Add NULL argument to trans_class_vptr_len_assignment calls. (trans_class_assignment): Get rhs_vptr from trans_class_vptr_len_assignment and use it for determining size for allocation/reallocation. Use return value from realloc. gcc/testsuite/ PR fortran/110415 * gfortran.dg/pr110415.f90: New test. * gfortran.dg/asan/pr110415-2.f90: New test. * gfortran.dg/asan/pr110415-3.f90: New test. Co-Authored-By: Tobias Burnus (cherry picked from commit b247e917ff13328298c1eecf8563b12edd7ade04) Diff: --- gcc/fortran/trans-expr.cc | 39 + gcc/testsuite/gfortran.dg/asan/pr110415-2.f90 | 45 gcc/testsuite/gfortran.dg/asan/pr110415-3.f90 | 49 +++ gcc/testsuite/gfortran.dg/pr110415.f90| 20 +++ 4 files changed, 139 insertions(+), 14 deletions(-) diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc index cfe03252582..2b2dceb8d0f 100644 --- a/gcc/fortran/trans-expr.cc +++ b/gcc/fortran/trans-expr.cc @@ -9748,7 +9748,8 @@ trans_get_upoly_len (stmtblock_t *block, gfc_expr *expr) static tree trans_class_vptr_len_assignment (stmtblock_t *block, gfc_expr * le, gfc_expr * re, gfc_se *rse, -tree * to_lenp, tree * from_lenp) +tree * to_lenp, tree * from_lenp, +tree * from_vptrp) { gfc_se se; gfc_expr * vptr_expr; @@ -9756,10 +9757,11 @@ trans_class_vptr_len_assignment (stmtblock_t *block, gfc_expr * le, bool set_vptr = false, temp_rhs = false; stmtblock_t *pre = block; tree class_expr = NULL_TREE; + tree from_vptr = NULL_TREE; /* Create a temporary for complicated expressions. */ if (re->expr_type != EXPR_VARIABLE && re->expr_type != EXPR_NULL - && rse->expr != NULL_TREE && !DECL_P (rse->expr)) + && rse->expr != NULL_TREE) { if (re->ts.type == BT_CLASS && !GFC_CLASS_TYPE_P (TREE_TYPE (rse->expr))) class_expr = gfc_get_class_from_expr (rse->expr); @@ -9856,6 +9858,7 @@ trans_class_vptr_len_assignment (stmtblock_t *block, gfc_expr * le, tmp = rse->expr; se.expr = gfc_class_vptr_get (tmp); + from_vptr = se.expr; if (UNLIMITED_POLY (re)) from_len = gfc_class_len_get (tmp); @@ -9877,6 +9880,7 @@ trans_class_vptr_len_assignment (stmtblock_t *block, gfc_expr * le, gfc_free_expr (vptr_expr); gfc_add_block_to_block (block, ); gcc_assert (se.post.head == NULL_TREE); + from_vptr = se.expr; } gfc_add_modify (pre, lhs_vptr, fold_convert (TREE_TYPE (lhs_vptr), se.expr)); @@ -9905,11 +9909,13 @@ trans_class_vptr_len_assignment (stmtblock_t *block, gfc_expr * le, } } - /* Return the _len trees only, when requested. */ + /* Return the _len and _vptr trees only, when requested. */ if (to_lenp) *to_lenp = to_len; if (from_lenp) *from_lenp = from_len; + if (from_vptrp) +*from_vptrp = from_vptr; return lhs_vptr; } @@ -9978,7 +9984,7 @@ trans_class_pointer_fcn (stmtblock_t *block, gfc_se *lse, gfc_se *rse, { expr1_vptr = trans_class_vptr_len_assignment (block, expr1, expr2, rse, - NULL, NULL); + NULL, NULL, NULL); gfc_add_block_to_block (block, >pre); tmp = gfc_create_var (TREE_TYPE (rse->expr), "ptrtemp"); gfc_add_modify (>pre, tmp, rse->expr); @@ -10054,7 +10060,7 @@ gfc_trans_pointer_assignment (gfc_expr * expr1, gfc_expr * expr2) if (non_proc_ptr_assign && expr1->ts.type == BT_CLASS) { trans_class_vptr_len_assignment (, expr1, expr2, ,
[gcc r15-776] Fix internal error in seh_cfa_offset with -O2 -fno-omit-frame-pointer
https://gcc.gnu.org/g:f14ef5cfd4c1ba1d34afda9174935e40d3c0a3ce commit r15-776-gf14ef5cfd4c1ba1d34afda9174935e40d3c0a3ce Author: Eric Botcazou Date: Wed May 22 18:10:39 2024 +0200 Fix internal error in seh_cfa_offset with -O2 -fno-omit-frame-pointer The problem directly comes from the -ffold-mem-offsets pass messing up with the prologue and the frame-related instructions, which is a no-no with SEH, so the fix simply disconnects the pass in these circumstances. gcc/ PR rtl-optimization/115038 * fold-mem-offsets.cc (fold_offsets): Return 0 if the defining instruction of the register is frame related. gcc/testsuite/ * g++.dg/opt/fmo1.C: New test. Diff: --- gcc/fold-mem-offsets.cc | 2 +- gcc/testsuite/g++.dg/opt/fmo1.C | 25 + 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/gcc/fold-mem-offsets.cc b/gcc/fold-mem-offsets.cc index 2e15b05529e..84b9623058b 100644 --- a/gcc/fold-mem-offsets.cc +++ b/gcc/fold-mem-offsets.cc @@ -491,7 +491,7 @@ fold_offsets (rtx_insn *insn, rtx reg, bool analyze, bitmap foldable_insns) { rtx_insn *def = get_single_def_in_bb (insn, reg); - if (!def || GET_CODE (PATTERN (def)) != SET) + if (!def || RTX_FRAME_RELATED_P (def) || GET_CODE (PATTERN (def)) != SET) return 0; rtx dest = SET_DEST (PATTERN (def)); diff --git a/gcc/testsuite/g++.dg/opt/fmo1.C b/gcc/testsuite/g++.dg/opt/fmo1.C new file mode 100644 index 000..f0ae624c61a --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/fmo1.C @@ -0,0 +1,25 @@ +// PR rtl-optimization/115038 +// Reported by Christoph Reiter + +// { dg-do compile } +// { dg-options "-O2 -fno-omit-frame-pointer" } + +struct d { + d(); +}; + +struct e { + e() : c(1.0) {} + float c; +}; + +class k { + d g; + e h; +}; + +class a { + k f; +} a; + +k b;
[gcc r15-775] i386: Correct insn_cost of movabsq.
https://gcc.gnu.org/g:a3b16e73a2d5b2d4d20ef6f2fd164cea633bbec8 commit r15-775-ga3b16e73a2d5b2d4d20ef6f2fd164cea633bbec8 Author: Roger Sayle Date: Wed May 22 16:45:48 2024 +0100 i386: Correct insn_cost of movabsq. This single line patch fixes a strange quirk/glitch in i386's rtx_costs, which considers an instruction loading a 64-bit constant to be significantly cheaper than loading a 32-bit (or smaller) constant. Consider the two functions: unsigned long long foo() { return 0x0123456789abcdefULL; } unsigned int bar() { return 10; } and the corresponding lines from combine's dump file: insn_cost 1 for #: r98:DI=0x123456789abcdef insn_cost 4 for #: ax:SI=0xa The same issue can be seen in -dP assembler output. movabsq $81985529216486895, %rax# 5 [c=1 l=10] *movdi_internal/4 The problem is that pattern_costs interpretation of rtx_costs contains "return cost > 0 ? cost : COSTS_N_INSNS (1)" where a zero value (for example a register or small immediate constant) is considered special, and equivalent to a single instruction, but all other values are treated as verbatim. Hence to x86_64's 10-byte long movabsq instruction slightly more expensive than a simple constant, rtx_costs needs to return COSTS_N_INSNS(1)+1 and not 1. With this change, the insn_cost of movabsq is the intended value 5: insn_cost 5 for #: r98:DI=0x123456789abcdef and movabsq $81985529216486895, %rax# 5 [c=5 l=10] *movdi_internal/4 2024-05-22 Roger Sayle gcc/ChangeLog * config/i386/i386.cc (ix86_rtx_costs) : A CONST_INT that isn't x86_64_immediate_operand requires an extra (expensive) movabsq insn to load, so return COSTS_N_INSNS (1) + 1. Diff: --- gcc/config/i386/i386.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc index 69cd4ae05a7..3e2a3a194f1 100644 --- a/gcc/config/i386/i386.cc +++ b/gcc/config/i386/i386.cc @@ -21562,7 +21562,8 @@ ix86_rtx_costs (rtx x, machine_mode mode, int outer_code_i, int opno, if (x86_64_immediate_operand (x, VOIDmode)) *total = 0; else - *total = 1; + /* movabsq is slightly more expensive than a simple instruction. */ + *total = COSTS_N_INSNS (1) + 1; return true; case CONST_DOUBLE:
[gcc r15-774] Avoid ICE in except.cc on targets that don't support exceptions.
https://gcc.gnu.org/g:26df7b4684e201e66c09dd018603a248ddc5f437 commit r15-774-g26df7b4684e201e66c09dd018603a248ddc5f437 Author: Roger Sayle Date: Wed May 22 13:48:52 2024 +0100 Avoid ICE in except.cc on targets that don't support exceptions. A number of testcases currently fail on nvptx with the ICE: during RTL pass: final openmp-simd-2.c: In function 'foo': openmp-simd-2.c:28:1: internal compiler error: in get_personality_function, at expr.cc:14037 28 | } | ^ 0x98a38f get_personality_function(tree_node*) /home/roger/GCC/nvptx-none/gcc/gcc/expr.cc:14037 0x969d3b output_function_exception_table(int) /home/roger/GCC/nvptx-none/gcc/gcc/except.cc:3226 0x9b760d rest_of_handle_final /home/roger/GCC/nvptx-none/gcc/gcc/final.cc:4252 The simple oversight in output_function_exception_table is that it calls get_personality_function (immediately) before checking the target's except_unwind_info hook (which on nvptx always returns UI_NONE). The (perhaps obvious) fix is to move the assignments of fname and personality after the tests that they are needed, and before their first use. 2024-05-22 Roger Sayle gcc/ChangeLog * except.cc (output_function_exception_table): Move call to get_personality_function after targetm_common.except_unwind_info check, to avoid ICE on targets that don't support exceptions. Diff: --- gcc/except.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gcc/except.cc b/gcc/except.cc index 2080fcc22e6..b5886e97be9 100644 --- a/gcc/except.cc +++ b/gcc/except.cc @@ -3222,9 +3222,6 @@ output_one_function_exception_table (int section) void output_function_exception_table (int section) { - const char *fnname = get_fnname_from_decl (current_function_decl); - rtx personality = get_personality_function (current_function_decl); - /* Not all functions need anything. */ if (!crtl->uses_eh_lsda || targetm_common.except_unwind_info (_options) == UI_NONE) @@ -3234,6 +3231,9 @@ output_function_exception_table (int section) if (section == 1 && !crtl->eh.call_site_record_v[1]) return; + const char *fnname = get_fnname_from_decl (current_function_decl); + rtx personality = get_personality_function (current_function_decl); + if (personality) { assemble_external_libcall (personality);
[gcc r14-10232] libstdc++: Implement std::formatter without [PR115099]
https://gcc.gnu.org/g:4896bb3199253dc350f8fb5ff63370310ca27ce2 commit r14-10232-g4896bb3199253dc350f8fb5ff63370310ca27ce2 Author: Jonathan Wakely Date: Fri May 17 10:55:32 2024 +0100 libstdc++: Implement std::formatter without [PR115099] The std::thread::id formatter uses std::basic_ostringstream without including , which went unnoticed because the test for it uses a stringstream to check the output is correct. The fix implemented here is to stop using basic_ostringstream for formatting thread::id and just use std::format instead. As a drive-by fix, the formatter specialization is constrained to require that the thread::id::native_handle_type can be formatted, to avoid making the formatter ill-formed if the pthread_t type is not a pointer or integer. Since non-void pointers can't be formatted, ensure that we convert pointers to const void* for formatting. Make a similar change to the existing operator<< overload so that in the unlikely case that pthread_t is a typedef for char* we don't treat it as a null-terminated string when inserting into a stream. libstdc++-v3/ChangeLog: PR libstdc++/115099 * include/bits/std_thread.h: Declare formatter as friend of thread::id. * include/std/thread (operator<<): Convert non-void pointers to void pointers for output. (formatter): Add constraint that thread::native_handle_type is a pointer or integer. (formatter::format): Reimplement without basic_ostringstream. * testsuite/30_threads/thread/id/output.cc: Check output compiles before has been included. (cherry picked from commit 1a5e4dd83788ea4c049d354d83ad58a6a3d747e6) Diff: --- libstdc++-v3/include/bits/std_thread.h | 11 +- libstdc++-v3/include/std/thread| 43 +- .../testsuite/30_threads/thread/id/output.cc | 21 ++- 3 files changed, 63 insertions(+), 12 deletions(-) diff --git a/libstdc++-v3/include/bits/std_thread.h b/libstdc++-v3/include/bits/std_thread.h index 2d7df12650d..5817bfb29dd 100644 --- a/libstdc++-v3/include/bits/std_thread.h +++ b/libstdc++-v3/include/bits/std_thread.h @@ -53,6 +53,10 @@ namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION +#if __glibcxx_formatters + template class formatter; +#endif + /** @addtogroup threads * @{ */ @@ -117,13 +121,18 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template friend basic_ostream<_CharT, _Traits>& operator<<(basic_ostream<_CharT, _Traits>& __out, id __id); + +#if __glibcxx_formatters + friend formatter; + friend formatter; +#endif }; private: id _M_id; // _GLIBCXX_RESOLVE_LIB_DEFECTS -// 2097. packaged_task constructors should be constrained +// 2097. packaged_task constructors should be constrained // 3039. Unnecessary decay in thread and packaged_task template using __not_same = __not_, thread>>; diff --git a/libstdc++-v3/include/std/thread b/libstdc++-v3/include/std/thread index 09ca3116e7f..e994d683bff 100644 --- a/libstdc++-v3/include/std/thread +++ b/libstdc++-v3/include/std/thread @@ -42,10 +42,6 @@ # include // std::stop_source, std::stop_token, std::nostopstate #endif -#if __cplusplus > 202002L -# include -#endif - #include // std::thread, get_id, yield #include // std::this_thread::sleep_for, sleep_until @@ -53,6 +49,10 @@ #define __glibcxx_want_formatters #include +#if __cpp_lib_formatters +# include +#endif + namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION @@ -104,10 +104,16 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION inline basic_ostream<_CharT, _Traits>& operator<<(basic_ostream<_CharT, _Traits>& __out, thread::id __id) { + // Convert non-void pointers to const void* for formatted output. + using __output_type + = __conditional_t::value, + const void*, + thread::native_handle_type>; + if (__id == thread::id()) return __out << "thread::id of a non-executing thread"; else - return __out << __id._M_thread; + return __out << static_cast<__output_type>(__id._M_thread); } /// @} @@ -287,8 +293,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION #endif // __cpp_lib_jthread #ifdef __cpp_lib_formatters // C++ >= 23 - template +requires is_pointer_v + || is_integral_v class formatter { public: @@ -331,10 +338,26 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION typename basic_format_context<_Out, _CharT>::iterator format(thread::id __id, basic_format_context<_Out, _CharT>& __fc) const { - std::basic_ostringstream<_CharT> __os; - __os << __id; - auto __str = __os.view(); - return
[gcc r15-773] Fix mixed input kind permute optimization
https://gcc.gnu.org/g:3507ab1b018a68500e49fa9f1de7caa0f1b53dda commit r15-773-g3507ab1b018a68500e49fa9f1de7caa0f1b53dda Author: Richard Biener Date: Tue May 21 19:15:33 2024 +0200 Fix mixed input kind permute optimization When change_vec_perm_layout runs into a permute combining two nodes where one is invariant and one internal the partition of one input can be -1 but the other might not be. The following supports this case by simply ignoring inputs with input partiton -1. I'm not sure this is correct but it avoids ICEing when accessing that partitions layout for gcc.target/i386/pr98928.c with the change to avoid splitting store dataref groups during SLP discovery. * tree-vect-slp.cc (change_vec_perm_layout): Ignore an input partition of -1. Diff: --- gcc/tree-vect-slp.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gcc/tree-vect-slp.cc b/gcc/tree-vect-slp.cc index 43f2c153bf0..3f8209b43a7 100644 --- a/gcc/tree-vect-slp.cc +++ b/gcc/tree-vect-slp.cc @@ -4640,6 +4640,8 @@ change_vec_perm_layout (slp_tree node, lane_permutation_t , { slp_tree in_node = SLP_TREE_CHILDREN (node)[entry.first]; unsigned int in_partition_i = m_vertices[in_node->vertex].partition; + if (in_partition_i == -1u) + continue; this_in_layout_i = m_partitions[in_partition_i].layout; } if (this_in_layout_i > 0)
[gcc r15-772] Avoid SLP_REPRESENTATIVE access for VEC_PERM in SLP scheduling
https://gcc.gnu.org/g:31e9bae0ea5e5413abfa3ca9050e66cc6760553e commit r15-772-g31e9bae0ea5e5413abfa3ca9050e66cc6760553e Author: Richard Biener Date: Fri May 17 15:23:38 2024 +0200 Avoid SLP_REPRESENTATIVE access for VEC_PERM in SLP scheduling SLP permute nodes can end up without a SLP_REPRESENTATIVE now, the following avoids touching it in this case in vect_schedule_slp_node. * tree-vect-slp.cc (vect_schedule_slp_node): Avoid looking at SLP_REPRESENTATIVE for VEC_PERM nodes. Diff: --- gcc/tree-vect-slp.cc | 28 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/gcc/tree-vect-slp.cc b/gcc/tree-vect-slp.cc index f34ed54a70b..43f2c153bf0 100644 --- a/gcc/tree-vect-slp.cc +++ b/gcc/tree-vect-slp.cc @@ -9301,13 +9301,8 @@ vect_schedule_slp_node (vec_info *vinfo, gcc_assert (SLP_TREE_NUMBER_OF_VEC_STMTS (node) != 0); SLP_TREE_VEC_DEFS (node).create (SLP_TREE_NUMBER_OF_VEC_STMTS (node)); - if (dump_enabled_p ()) -dump_printf_loc (MSG_NOTE, vect_location, -"-->vectorizing SLP node starting from: %G", -stmt_info->stmt); - - if (STMT_VINFO_DATA_REF (stmt_info) - && SLP_TREE_CODE (node) != VEC_PERM_EXPR) + if (SLP_TREE_CODE (node) != VEC_PERM_EXPR + && STMT_VINFO_DATA_REF (stmt_info)) { /* Vectorized loads go before the first scalar load to make it ready early, vectorized stores go before the last scalar @@ -9319,10 +9314,10 @@ vect_schedule_slp_node (vec_info *vinfo, last_stmt_info = vect_find_last_scalar_stmt_in_slp (node); si = gsi_for_stmt (last_stmt_info->stmt); } - else if ((STMT_VINFO_TYPE (stmt_info) == cycle_phi_info_type - || STMT_VINFO_TYPE (stmt_info) == induc_vec_info_type - || STMT_VINFO_TYPE (stmt_info) == phi_info_type) - && SLP_TREE_CODE (node) != VEC_PERM_EXPR) + else if (SLP_TREE_CODE (node) != VEC_PERM_EXPR + && (STMT_VINFO_TYPE (stmt_info) == cycle_phi_info_type + || STMT_VINFO_TYPE (stmt_info) == induc_vec_info_type + || STMT_VINFO_TYPE (stmt_info) == phi_info_type)) { /* For PHI node vectorization we do not use the insertion iterator. */ si = gsi_none (); @@ -9456,6 +9451,9 @@ vect_schedule_slp_node (vec_info *vinfo, /* Handle purely internal nodes. */ if (SLP_TREE_CODE (node) == VEC_PERM_EXPR) { + if (dump_enabled_p ()) + dump_printf_loc (MSG_NOTE, vect_location, +"-->vectorizing SLP permutation node\n"); /* ??? the transform kind is stored to STMT_VINFO_TYPE which might be shared with different SLP nodes (but usually it's the same operation apart from the case the stmt is only there for denoting @@ -9474,7 +9472,13 @@ vect_schedule_slp_node (vec_info *vinfo, } } else -vect_transform_stmt (vinfo, stmt_info, , node, instance); +{ + if (dump_enabled_p ()) + dump_printf_loc (MSG_NOTE, vect_location, +"-->vectorizing SLP node starting from: %G", +stmt_info->stmt); + vect_transform_stmt (vinfo, stmt_info, , node, instance); +} } /* Replace scalar calls from SLP node NODE with setting of their lhs to zero.
[gcc r15-771] Avoid requiring VEC_PERM represenatives
https://gcc.gnu.org/g:0c7792f707368d0225a9a457895b847ef660c270 commit r15-771-g0c7792f707368d0225a9a457895b847ef660c270 Author: Richard Biener Date: Fri May 17 14:26:38 2024 +0200 Avoid requiring VEC_PERM represenatives The following plugs one hole where we require a VEC_PERM node representative unnecessarily. This is for vect_check_store_rhs which looks at the RHS and checks whether a constant can be native encoded. The fix is to guard that with vect_constant_def additionally and making vect_is_simple_use forgiving for a missing SLP_TREE_REPRESENTATIVE when the child is a VEC_PERM node, initializing the scalar def to error_mark_node. * tree-vect-stmts.cc (vect_check_store_rhs): Look at *rhs only when it's a vec_constant_def. (vect_is_simple_use): When we have no representative for an internal node, fill in *op with error_mark_node. Diff: --- gcc/tree-vect-stmts.cc | 25 ++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc index 672959501bb..4219ad832db 100644 --- a/gcc/tree-vect-stmts.cc +++ b/gcc/tree-vect-stmts.cc @@ -2553,7 +2553,8 @@ vect_check_store_rhs (vec_info *vinfo, stmt_vec_info stmt_info, /* In the case this is a store from a constant make sure native_encode_expr can handle it. */ - if (CONSTANT_CLASS_P (*rhs) && native_encode_expr (*rhs, NULL, 64) == 0) + if (rhs_dt == vect_constant_def + && CONSTANT_CLASS_P (*rhs) && native_encode_expr (*rhs, NULL, 64) == 0) { if (dump_enabled_p ()) dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, @@ -14002,8 +14003,26 @@ vect_is_simple_use (vec_info *vinfo, stmt_vec_info stmt, slp_tree slp_node, *vectype = SLP_TREE_VECTYPE (child); if (SLP_TREE_DEF_TYPE (child) == vect_internal_def) { - *op = gimple_get_lhs (SLP_TREE_REPRESENTATIVE (child)->stmt); - return vect_is_simple_use (*op, vinfo, dt, def_stmt_info_out); + /* ??? VEC_PERM nodes might be intermediate and their lane value +have no representative (nor do we build a VEC_PERM stmt for +the actual operation). Note for two-operator nodes we set +a representative but leave scalar stmts empty as we'd only +have one for a subset of lanes. Ideally no caller would +require *op for internal defs. */ + if (SLP_TREE_REPRESENTATIVE (child)) + { + *op = gimple_get_lhs (SLP_TREE_REPRESENTATIVE (child)->stmt); + return vect_is_simple_use (*op, vinfo, dt, def_stmt_info_out); + } + else + { + gcc_assert (SLP_TREE_CODE (child) == VEC_PERM_EXPR); + *op = error_mark_node; + *dt = vect_internal_def; + if (def_stmt_info_out) + *def_stmt_info_out = NULL; + return true; + } } else {
[gcc(refs/vendors/redhat/heads/gcc-13-branch)] Merge commit 'r13-8792-g53bc98f5355ada17d1629a2d0e96aebd397780c6' into redhat/gcc-13-branch
https://gcc.gnu.org/g:5632a1dc05eae4936ac0d8d7e8a5cb717bce5960 commit 5632a1dc05eae4936ac0d8d7e8a5cb717bce5960 Merge: 6facfa150db 53bc98f5355 Author: Jakub Jelinek Date: Wed May 22 12:04:04 2024 +0200 Merge commit 'r13-8792-g53bc98f5355ada17d1629a2d0e96aebd397780c6' into redhat/gcc-13-branch Diff: ChangeLog | 15 + Makefile.in| 30 + Makefile.tpl | 24 + c++tools/ChangeLog |4 + config/ChangeLog |4 + contrib/ChangeLog |4 + contrib/header-tools/ChangeLog |4 + contrib/reghunt/ChangeLog |4 + contrib/regression/ChangeLog |4 + fixincludes/ChangeLog |4 + gcc/BASE-VER |2 +- gcc/ChangeLog | 1321 ++ gcc/DATESTAMP |2 +- gcc/ada/ChangeLog |4 + gcc/analyzer/ChangeLog | 148 ++ gcc/analyzer/call-summary.cc | 12 + gcc/analyzer/checker-event.cc | 40 - gcc/analyzer/constraint-manager.cc | 131 ++ gcc/analyzer/constraint-manager.h |1 + gcc/analyzer/engine.cc |7 + gcc/analyzer/inlining-iterator.h | 40 + gcc/analyzer/kf.cc | 22 + gcc/analyzer/region-model-manager.cc |9 +- gcc/analyzer/region-model.cc | 110 +- gcc/analyzer/region.cc | 77 +- gcc/analyzer/region.h | 14 +- gcc/analyzer/sm-malloc.cc | 40 + gcc/analyzer/sm-taint.cc |6 + gcc/analyzer/state-purge.cc|9 + gcc/analyzer/store.cc | 11 +- gcc/analyzer/store.h | 10 +- gcc/analyzer/supergraph.cc |4 + gcc/analyzer/varargs.cc| 38 +- gcc/asan.cc| 42 +- gcc/attribs.cc |7 +- gcc/bitmap.cc |2 +- gcc/c-family/ChangeLog | 22 + gcc/c-family/c-common.cc |8 +- gcc/c/ChangeLog| 14 + gcc/c/c-decl.cc|7 +- gcc/cfgrtl.cc |3 +- gcc/cgraph.cc | 10 +- gcc/cgraph.h | 15 +- gcc/cgraphunit.cc |2 + gcc/common/config/i386/i386-common.cc |2 +- gcc/config.gcc |1 + gcc/config.in |9 +- gcc/config/aarch64/aarch64-arches.def |2 +- gcc/config/aarch64/aarch64-cores.def |2 +- gcc/config/aarch64/aarch64.cc | 16 +- gcc/config/aarch64/t-aarch64-rtems | 42 + gcc/config/alpha/alpha.cc |3 +- gcc/config/arc/arc.cc |3 +- gcc/config/arm/arm.cc | 69 + gcc/config/avr/avr-mcus.def|8 + gcc/config/avr/avr.cc | 25 +- gcc/config/csky/csky.cc|3 +- gcc/config/darwin-protos.h | 11 + gcc/config/darwin-sections.def |4 +- gcc/config/darwin.cc | 223 ++- gcc/config/darwin.h| 43 +- gcc/config/epiphany/epiphany.cc|3 +- gcc/config/ft32/ft32.cc|7 +- gcc/config/i386/i386-features.cc | 119 +- gcc/config/i386/i386-features.h|4 +- gcc/config/i386/i386.cc|3 +- gcc/config/i386/i386.md| 18 +- gcc/config/loongarch/genopts/loongarch.opt.in | 24 +- gcc/config/loongarch/loongarch-opts.cc | 22 + gcc/config/loongarch/loongarch-opts.h |6 + gcc/config/loongarch/loongarch-protos.h|2 +- gcc/config/loongarch/loongarch.cc | 77 +- gcc/config/loongarch/loongarch.md | 23 +- gcc/config/loongarch/loongarch.opt | 24 +- gcc/config/m32r/m32r.cc|3 +- gcc/config/mips/mips.cc|
[gcc/redhat/heads/gcc-13-branch] (337 commits) Merge commit 'r13-8792-g53bc98f5355ada17d1629a2d0e96aebd397
The branch 'redhat/heads/gcc-13-branch' was updated to point to: 5632a1dc05e... Merge commit 'r13-8792-g53bc98f5355ada17d1629a2d0e96aebd397 It previously pointed to: 6facfa150db... Merge commit 'r13-8456-g5acf62723967605ad9037d83c3dc0fb2c8c Diff: Summary of changes (added commits): --- 5632a1d... Merge commit 'r13-8792-g53bc98f5355ada17d1629a2d0e96aebd397 53bc98f... strlen: Fix up !si->full_string_p handling in count_nonzero (*) 35ac28b... ubsan: Use right address space for MEM_REF created for bool (*) a841964... Daily bump. (*) 9433e30... libstdc++: testsuite: Enhance codecvt_unicode with tests fo (*) bd5e672... libstdc++: Fix handling of surrogate CP in codecvt [PR10897 (*) 0a9df2c... c++: Fix std dialect hint for std::to_address [PR107800] (*) 5ed32d0... Fortran: fix dependency checks for inquiry refs [PR115039] (*) c827f46... testsuite: Adjust pr113359-2_*.c with unsigned long long [P (*) 3f6a425... PHIOPT: Don't transform minmax if middle bb contains a phi (*) d6cf49e... match: Disable `(type)zero_one_valuep*CST` for 1bit signed (*) bde5894... Bump BASE-VER. (*) b71f1de... Update ChangeLog and version files for release (*) a021b58... Daily bump. (*) 4416023... Daily bump. (*) 94509b6... Daily bump. (*) 162c441... [committed] Fix RISC-V missing stack tie (*) 5b5342e... Daily bump. (*) 851aa3b... Daily bump. (*) 1db45e8... ipa: Compare jump functions in ICF (PR 113907) (*) 10bf53a... ICF: Make ICF and SRA agree on padding (*) 7dca716... libstdc++: Fix typo in std::stacktrace::max_size [PR115063] (*) 71e941b... libstdc++: Fix infinite loop in std::binomial_distribution (*) b9e2a32... libstdc++: Adjust expected locale-dependent date formats in (*) ebc61a9... libstdc++: Fix typo in Doxygen comment (*) bce15a5... libstdc++: Fix run_doxygen for Doxygen 1.10 man page format (*) 47cac09... c++: build_extra_args recapturing local specs [PR114303] (*) 12ee04d... Daily bump. (*) d3659e2... c++: constexpr union member access folding [PR114709] (*) 2e353c6... Manually add ChangeLog entries for various commits from 202 (*) d629308... rtl-optimization/54052 - RTL SSA PHI insertion compile-time (*) 6d1801f... Daily bump. (*) b7a2697... diagnostics: fix corrupt json/SARIF on stderr [PR114348] (*) 2a6f99a... Fix ICE in -fdiagnostics-generate-patch [PR112684] (*) 230f672... diagnostics: fix ICE on sarif output when source file is un (*) 96f7a36... analyzer: fix ICE and false positive with -Wanalyzer-deref- (*) 810d35a... analyzer: fix ICE due to type mismatch when replaying call (*) ed02610... analyzer: fix -Wanalyzer-deref-before-check false positive (*) 67d104f... analyzer: fix -Wanalyzer-va-arg-type-mismatch false +ve on (*) 2c688f6... analyzer: fix skipping of debug stmts [PR113253] (*) 0593151... analyzer: fix defaults in compound assignments from non-zer (*) 132eb1a... analyzer: casting all zeroes should give all zeroes [PR1133 (*) 994477c... analyzer: fix deref-before-check false positives due to inl (*) a1cb188... analyzer: fix ICE for 2 bits before the start of base regio (*) b8c772c... jit: dump string literal initializers correctly (*) 44968a0... testsuite, analyzer: add test case [PR108171] (*) a0b13d0... analyzer: fix ICE on zero-sized arrays [PR110882] (*) 0df1ee0... analyzer: fix ICE on division of tainted floating-point val (*) 60dcb71... jit.exp: handle dwarf version mismatch in jit-check-debug-i (*) b38472f... jit: avoid using __vector in testcase [PR110466] (*) e0c5290... testsuite: Add more allocation size tests for conjured sval (*) ccf8d3e... analyzer: Fix allocation size false positive on conjured sv (*) 89feb35... analyzer: add caching to globals with initializers [PR11011 (*) e30211c... [PR114415][scheduler]: Fixing wrong code generation (*) 421311a... Fix range-ops operator_addr. (*) fefdb9f... Daily bump. (*) 6f7674a... testsuite: Fix up vector-subaccess-1.C test for ia32 [PR892 (*) adba85b... AVR: target/114981 - Support __builtin_powi[l] / __powidf2. (*) 44d84db... reassoc: Fix up optimize_range_tests_to_bit_test [PR114965] (*) cad27df... expansion: Use __trunchfbf2 calls rather than __extendhfbf2 (*) d1ec7bc... tree-inline: Remove .ASAN_MARK calls when inlining function (*) e07df05... gimple-ssa-sprintf: Use [0, 1] range for %lc with (wint_t) (*) 6f1b3f9... c++: Fix constexpr evaluation of parameters passed by invis (*) 6d30cfc... openmp: Copy DECL_LANG_SPECIFIC and DECL_LANG_FLAG_? to tre (*) f1b1d51... libstdc++: Workaround kernel-headers on s390x-linux (*) 929b0ff... Fix PR 110066: crash with -pg -static on riscv (*) 4f2a35a... tree-optimization/114375 - disallow SLP discovery of permut (*) c63704a... cfgrtl: Fix MEM_EXPR update in duplicate_insn_chain [PR1149 (*) b0632c0... middle-end: Fix ICE in poly-int.h due to SLP. (*) 3367f78... [Committed] Avoid FAIL of gcc.target/i386/pr110792.c (*) 3658daf...
[gcc r15-770] libstdc++: Implement std::formatter without [PR115099]
https://gcc.gnu.org/g:1a5e4dd83788ea4c049d354d83ad58a6a3d747e6 commit r15-770-g1a5e4dd83788ea4c049d354d83ad58a6a3d747e6 Author: Jonathan Wakely Date: Fri May 17 10:55:32 2024 +0100 libstdc++: Implement std::formatter without [PR115099] The std::thread::id formatter uses std::basic_ostringstream without including , which went unnoticed because the test for it uses a stringstream to check the output is correct. The fix implemented here is to stop using basic_ostringstream for formatting thread::id and just use std::format instead. As a drive-by fix, the formatter specialization is constrained to require that the thread::id::native_handle_type can be formatted, to avoid making the formatter ill-formed if the pthread_t type is not a pointer or integer. Since non-void pointers can't be formatted, ensure that we convert pointers to const void* for formatting. Make a similar change to the existing operator<< overload so that in the unlikely case that pthread_t is a typedef for char* we don't treat it as a null-terminated string when inserting into a stream. libstdc++-v3/ChangeLog: PR libstdc++/115099 * include/bits/std_thread.h: Declare formatter as friend of thread::id. * include/std/thread (operator<<): Convert non-void pointers to void pointers for output. (formatter): Add constraint that thread::native_handle_type is a pointer or integer. (formatter::format): Reimplement without basic_ostringstream. * testsuite/30_threads/thread/id/output.cc: Check output compiles before has been included. Diff: --- libstdc++-v3/include/bits/std_thread.h | 11 +- libstdc++-v3/include/std/thread| 43 +- .../testsuite/30_threads/thread/id/output.cc | 21 ++- 3 files changed, 63 insertions(+), 12 deletions(-) diff --git a/libstdc++-v3/include/bits/std_thread.h b/libstdc++-v3/include/bits/std_thread.h index 2d7df12650d..5817bfb29dd 100644 --- a/libstdc++-v3/include/bits/std_thread.h +++ b/libstdc++-v3/include/bits/std_thread.h @@ -53,6 +53,10 @@ namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION +#if __glibcxx_formatters + template class formatter; +#endif + /** @addtogroup threads * @{ */ @@ -117,13 +121,18 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template friend basic_ostream<_CharT, _Traits>& operator<<(basic_ostream<_CharT, _Traits>& __out, id __id); + +#if __glibcxx_formatters + friend formatter; + friend formatter; +#endif }; private: id _M_id; // _GLIBCXX_RESOLVE_LIB_DEFECTS -// 2097. packaged_task constructors should be constrained +// 2097. packaged_task constructors should be constrained // 3039. Unnecessary decay in thread and packaged_task template using __not_same = __not_, thread>>; diff --git a/libstdc++-v3/include/std/thread b/libstdc++-v3/include/std/thread index 09ca3116e7f..e994d683bff 100644 --- a/libstdc++-v3/include/std/thread +++ b/libstdc++-v3/include/std/thread @@ -42,10 +42,6 @@ # include // std::stop_source, std::stop_token, std::nostopstate #endif -#if __cplusplus > 202002L -# include -#endif - #include // std::thread, get_id, yield #include // std::this_thread::sleep_for, sleep_until @@ -53,6 +49,10 @@ #define __glibcxx_want_formatters #include +#if __cpp_lib_formatters +# include +#endif + namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION @@ -104,10 +104,16 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION inline basic_ostream<_CharT, _Traits>& operator<<(basic_ostream<_CharT, _Traits>& __out, thread::id __id) { + // Convert non-void pointers to const void* for formatted output. + using __output_type + = __conditional_t::value, + const void*, + thread::native_handle_type>; + if (__id == thread::id()) return __out << "thread::id of a non-executing thread"; else - return __out << __id._M_thread; + return __out << static_cast<__output_type>(__id._M_thread); } /// @} @@ -287,8 +293,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION #endif // __cpp_lib_jthread #ifdef __cpp_lib_formatters // C++ >= 23 - template +requires is_pointer_v + || is_integral_v class formatter { public: @@ -331,10 +338,26 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION typename basic_format_context<_Out, _CharT>::iterator format(thread::id __id, basic_format_context<_Out, _CharT>& __fc) const { - std::basic_ostringstream<_CharT> __os; - __os << __id; - auto __str = __os.view(); - return __format::__write_padded_as_spec(__str, __str.size(), + basic_string_view<_CharT> __sv; +
[gcc r15-769] libstdc++: Ensure std::variant relops convert to bool [PR115145]
https://gcc.gnu.org/g:b33f44ca6ce2dae7502ce138600e1631ffc9232c commit r15-769-gb33f44ca6ce2dae7502ce138600e1631ffc9232c Author: Jonathan Wakely Date: Tue May 21 15:13:01 2024 +0100 libstdc++: Ensure std::variant relops convert to bool [PR115145] Ensure that the result of comparing the variant alternatives is converted to bool immediately rather than copied. libstdc++-v3/ChangeLog: PR libstdc++/115145 * include/std/variant (operator==, operator!=, operator<) (operator<=, operator>, operator>=): Add trailing-return-type to lambda expressions to trigger conversion to bool. * testsuite/20_util/variant/relops/115145.cc: New test. Diff: --- libstdc++-v3/include/std/variant | 63 -- .../testsuite/20_util/variant/relops/115145.cc | 36 + 2 files changed, 71 insertions(+), 28 deletions(-) diff --git a/libstdc++-v3/include/std/variant b/libstdc++-v3/include/std/variant index cfb4bcdbcc9..371cbb90f54 100644 --- a/libstdc++-v3/include/std/variant +++ b/libstdc++-v3/include/std/variant @@ -1271,10 +1271,11 @@ namespace __detail::__variant operator== [[nodiscard]] (const variant<_Types...>& __lhs, const variant<_Types...>& __rhs) { - return __detail::__variant::__compare(true, __lhs, __rhs, - [](auto&& __l, auto&& __r) { - return __l == __r; - }); + namespace __variant = __detail::__variant; + return __variant::__compare(true, __lhs, __rhs, + [](auto&& __l, auto&& __r) -> bool { + return __l == __r; + }); } template @@ -1286,10 +1287,11 @@ namespace __detail::__variant operator!= [[nodiscard]] (const variant<_Types...>& __lhs, const variant<_Types...>& __rhs) { - return __detail::__variant::__compare(true, __lhs, __rhs, - [](auto&& __l, auto&& __r) { - return __l != __r; - }); + namespace __variant = __detail::__variant; + return __variant::__compare(true, __lhs, __rhs, + [](auto&& __l, auto&& __r) -> bool { + return __l != __r; + }); } template @@ -1301,10 +1303,11 @@ namespace __detail::__variant operator< [[nodiscard]] (const variant<_Types...>& __lhs, const variant<_Types...>& __rhs) { - return __detail::__variant::__compare(true, __lhs, __rhs, - [](auto&& __l, auto&& __r) { - return __l < __r; - }); + namespace __variant = __detail::__variant; + return __variant::__compare(true, __lhs, __rhs, + [](auto&& __l, auto&& __r) -> bool { + return __l < __r; + }); } template @@ -1316,10 +1319,11 @@ namespace __detail::__variant operator<= [[nodiscard]] (const variant<_Types...>& __lhs, const variant<_Types...>& __rhs) { - return __detail::__variant::__compare(true, __lhs, __rhs, - [](auto&& __l, auto&& __r) { - return __l <= __r; - }); + namespace __variant = __detail::__variant; + return __variant::__compare(true, __lhs, __rhs, + [](auto&& __l, auto&& __r) -> bool { + return __l <= __r; + }); } template @@ -1331,10 +1335,11 @@ namespace __detail::__variant operator> [[nodiscard]] (const variant<_Types...>& __lhs, const variant<_Types...>& __rhs) { - return __detail::__variant::__compare(true, __lhs, __rhs, - [](auto&& __l, auto&& __r) { - return __l > __r; - }); + namespace __variant = __detail::__variant; + return __variant::__compare(true, __lhs, __rhs, + [](auto&& __l, auto&& __r) -> bool { + return __l > __r; + }); } template @@ -1346,10 +1351,11 @@ namespace __detail::__variant operator>= [[nodiscard]] (const variant<_Types...>& __lhs, const variant<_Types...>& __rhs) { - return
[gcc r15-768] web/115183 - fix typo in C++ docs
https://gcc.gnu.org/g:424f8a01df9b311250e416759ad61c00bba4af48 commit r15-768-g424f8a01df9b311250e416759ad61c00bba4af48 Author: Richard Biener Date: Wed May 22 10:19:08 2024 +0200 web/115183 - fix typo in C++ docs The following fixes a reported typo. * doc/invoke.texi (C++ Modules): Fix typo. Diff: --- gcc/doc/invoke.texi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 218901c0b20..0625a5ede6f 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -37646,7 +37646,7 @@ not get debugging information for routines in the precompiled header. @cindex speed of compilation Modules are a C++20 language feature. As the name suggests, they -provides a modular compilation system, intending to provide both +provide a modular compilation system, intending to provide both faster builds and better library isolation. The ``Merging Modules'' paper @uref{https://wg21.link/p1103}, provides the easiest to read set of changes to the standard, although it does not capture later
[gcc r15-767] testsuite: Allow for non-SECTION_MERGE systems in gcc.dg/pr115066.c [PR115066]
https://gcc.gnu.org/g:6c97934fde7caf483ffc5079eb8ca4af04354a2c commit r15-767-g6c97934fde7caf483ffc5079eb8ca4af04354a2c Author: Tom de Vries Date: Wed May 22 10:06:10 2024 +0200 testsuite: Allow for non-SECTION_MERGE systems in gcc.dg/pr115066.c [PR115066] gcc.dg/pr115066.c currently FAILs on Solaris/SPARC with the native as: FAIL: gcc.dg/pr115066.c scan-assembler .bytet0xbt# Define macro strx Instead of the expected .byte 0xb ! Define macro strx the assembler output contains .byte 0x1 ! Define macro Apparently this happens because the Solaris as/ld combo doesn't support SHF_MERGE. While I initially meant to just skip the test on sparc*-*-solaris2* && !gas, Tom suggested to allow for both forms instead, which is what his patch does. Tested on sparc-sun-solaris2.11 and i386-pc-solaris2.11 (as and gas each) and x86_64-pc-linux-gnu. 2024-05-21 Tom de Vries gcc/testsuite: PR debug/115066 * gcc.dg/pr115066.c (scan-assembler): Allow for alternative form of Define macro. Diff: --- gcc/testsuite/gcc.dg/pr115066.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gcc/testsuite/gcc.dg/pr115066.c b/gcc/testsuite/gcc.dg/pr115066.c index 780767ac295..aadc4900467 100644 --- a/gcc/testsuite/gcc.dg/pr115066.c +++ b/gcc/testsuite/gcc.dg/pr115066.c @@ -3,6 +3,6 @@ /* { dg-options "-gsplit-dwarf -g3 -dA -gdwarf-4" } */ /* { dg-final { scan-assembler-times {\.section\t"?\.debug_macro} 1 } } */ /* { dg-final { scan-assembler-not {\.byte\t0x5\t[^\n\r]* Define macro strp} } } */ -/* { dg-final { scan-assembler {\.byte\t0xb\t[^\n\r]* Define macro strx} } } */ +/* { dg-final { scan-assembler {\.byte\t0xb\t[^\n\r]* Define macro strx|\.byte\t0x1\t[^\n\r]* Define macro} } } */ #define foo 1
gcc-wwwdocs branch master updated. 9d10f6fccee3a68102173f28cf312ed266b7d95d
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "gcc-wwwdocs". The branch, master has been updated via 9d10f6fccee3a68102173f28cf312ed266b7d95d (commit) from 9e79c5e411eb3236b481c6093fad4dc5ae5141c5 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log - commit 9d10f6fccee3a68102173f28cf312ed266b7d95d Author: Richard Biener Date: Wed May 22 10:04:32 2024 +0200 web/115183 - Remove duplicate links to GCCGO online docs. diff --git a/htdocs/onlinedocs/13.1.0/index.html b/htdocs/onlinedocs/13.1.0/index.html index 2abc06ac..08d312ba 100644 --- a/htdocs/onlinedocs/13.1.0/index.html +++ b/htdocs/onlinedocs/13.1.0/index.html @@ -62,12 +62,6 @@ href="https://gcc.gnu.org/onlinedocs/gcc-13.1.0/libstdc++-api-gfdl.xml.gz;>XML GFDL or https://gcc.gnu.org/onlinedocs/gcc-13.1.0/libstdc++-api-html.tar.gz;>an HTML tarball) - https://gcc.gnu.org/onlinedocs/gcc-13.1.0/gccgo/;>GCCGO 13.1 Manual (https://gcc.gnu.org/onlinedocs/gcc-13.1.0/gccgo.pdf;>also in - PDF or https://gcc.gnu.org/onlinedocs/gcc-13.1.0/gccgo.ps.gz;>PostScript or https://gcc.gnu.org/onlinedocs/gcc-13.1.0/gccgo-html.tar.gz;>an - HTML tarball) https://gcc.gnu.org/onlinedocs/gcc-13.1.0/gccgo/;>GCCGO 13.1 Manual (https://gcc.gnu.org/onlinedocs/gcc-13.1.0/gccgo.pdf;>also in PDF or https://gcc.gnu.org/onlinedocs/gcc-13.2.0/libstdc++-api-gfdl.xml.gz;>XML GFDL or https://gcc.gnu.org/onlinedocs/gcc-13.2.0/libstdc++-api-html.tar.gz;>an HTML tarball) - https://gcc.gnu.org/onlinedocs/gcc-13.2.0/gccgo/;>GCCGO 13.2 Manual (https://gcc.gnu.org/onlinedocs/gcc-13.2.0/gccgo.pdf;>also in - PDF or https://gcc.gnu.org/onlinedocs/gcc-13.2.0/gccgo.ps.gz;>PostScript or https://gcc.gnu.org/onlinedocs/gcc-13.2.0/gccgo-html.tar.gz;>an - HTML tarball) https://gcc.gnu.org/onlinedocs/gcc-13.2.0/gccgo/;>GCCGO 13.2 Manual (https://gcc.gnu.org/onlinedocs/gcc-13.2.0/gccgo.pdf;>also in PDF or https://gcc.gnu.org/onlinedocs/gcc-13.3.0/libstdc++-api-gfdl.xml.gz;>XML GFDL or https://gcc.gnu.org/onlinedocs/gcc-13.3.0/libstdc++-api-html.tar.gz;>an HTML tarball) - https://gcc.gnu.org/onlinedocs/gcc-13.3.0/gccgo/;>GCCGO 13.3 Manual (https://gcc.gnu.org/onlinedocs/gcc-13.3.0/gccgo.pdf;>also in - PDF or https://gcc.gnu.org/onlinedocs/gcc-13.3.0/gccgo.ps.gz;>PostScript or https://gcc.gnu.org/onlinedocs/gcc-13.3.0/gccgo-html.tar.gz;>an - HTML tarball) https://gcc.gnu.org/onlinedocs/gcc-13.3.0/gccgo/;>GCCGO 13.3 Manual (https://gcc.gnu.org/onlinedocs/gcc-13.3.0/gccgo.pdf;>also in PDF or https://gcc.gnu.org/onlinedocs/gcc-14.1.0/libstdc++-api-gfdl.xml.gz;>XML GFDL or https://gcc.gnu.org/onlinedocs/gcc-14.1.0/libstdc++-api-html.tar.gz;>an HTML tarball) - https://gcc.gnu.org/onlinedocs/gcc-14.1.0/gccgo/;>GCCGO 14.1 Manual (https://gcc.gnu.org/onlinedocs/gcc-14.1.0/gccgo.pdf;>also in - PDF or https://gcc.gnu.org/onlinedocs/gcc-14.1.0/gccgo.ps.gz;>PostScript or https://gcc.gnu.org/onlinedocs/gcc-14.1.0/gccgo-html.tar.gz;>an - HTML tarball) https://gcc.gnu.org/onlinedocs/gcc-14.1.0/gccgo/;>GCCGO 14.1 Manual (https://gcc.gnu.org/onlinedocs/gcc-14.1.0/gccgo.pdf;>also in PDF or
[gcc r13-8791] ubsan: Use right address space for MEM_REF created for bool/enum sanitization [PR115172]
https://gcc.gnu.org/g:35ac28b9c26debcc8ec8b247d75d4d271de72189 commit r13-8791-g35ac28b9c26debcc8ec8b247d75d4d271de72189 Author: Jakub Jelinek Date: Wed May 22 09:12:28 2024 +0200 ubsan: Use right address space for MEM_REF created for bool/enum sanitization [PR115172] The following testcase is miscompiled, because -fsanitize=bool,enum creates a MEM_REF without propagating there address space qualifiers, so what should be normally loaded using say %gs:/%fs: segment prefix isn't. Together with asan it then causes that load to be sanitized. 2024-05-22 Jakub Jelinek PR sanitizer/115172 * ubsan.cc (instrument_bool_enum_load): If rhs is not in generic address space, use qualified version of utype with the right address space. Formatting fix. * gcc.dg/asan/pr115172.c: New test. (cherry picked from commit d3c506eff54fcbac389a529c2e98da108a410b7f) Diff: --- gcc/testsuite/gcc.dg/asan/pr115172.c | 20 gcc/ubsan.cc | 6 +- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/gcc/testsuite/gcc.dg/asan/pr115172.c b/gcc/testsuite/gcc.dg/asan/pr115172.c new file mode 100644 index 000..8707e615733 --- /dev/null +++ b/gcc/testsuite/gcc.dg/asan/pr115172.c @@ -0,0 +1,20 @@ +/* PR sanitizer/115172 */ +/* { dg-do compile { target i?86-*-* x86_64-*-* } } */ +/* { dg-options "-O2 -fsanitize=address,bool -ffat-lto-objects -fdump-tree-asan1" } */ +/* { dg-final { scan-tree-dump-not "\.ASAN_CHECK " "asan1" } } */ + +#ifdef __x86_64__ +#define SEG __seg_gs +#else +#define SEG __seg_fs +#endif + +extern struct S { _Bool b; } s; +void bar (void); + +void +foo (void) +{ + if (*(volatile _Bool SEG *) (__UINTPTR_TYPE__) ) +bar (); +} diff --git a/gcc/ubsan.cc b/gcc/ubsan.cc index 93475786c1e..22d3330ca41 100644 --- a/gcc/ubsan.cc +++ b/gcc/ubsan.cc @@ -1719,13 +1719,17 @@ instrument_bool_enum_load (gimple_stmt_iterator *gsi) || TREE_CODE (gimple_assign_lhs (stmt)) != SSA_NAME) return; + addr_space_t as = TYPE_ADDR_SPACE (TREE_TYPE (rhs)); + if (as != TYPE_ADDR_SPACE (utype)) +utype = build_qualified_type (utype, TYPE_QUALS (utype) +| ENCODE_QUAL_ADDR_SPACE (as)); bool ends_bb = stmt_ends_bb_p (stmt); location_t loc = gimple_location (stmt); tree lhs = gimple_assign_lhs (stmt); tree ptype = build_pointer_type (TREE_TYPE (rhs)); tree atype = reference_alias_ptr_type (rhs); gimple *g = gimple_build_assign (make_ssa_name (ptype), - build_fold_addr_expr (rhs)); + build_fold_addr_expr (rhs)); gimple_set_location (g, loc); gsi_insert_before (gsi, g, GSI_SAME_STMT); tree mem = build2 (MEM_REF, utype, gimple_assign_lhs (g),
[gcc r13-8792] strlen: Fix up !si->full_string_p handling in count_nonzero_bytes_addr [PR115152]
https://gcc.gnu.org/g:53bc98f5355ada17d1629a2d0e96aebd397780c6 commit r13-8792-g53bc98f5355ada17d1629a2d0e96aebd397780c6 Author: Jakub Jelinek Date: Wed May 22 09:13:50 2024 +0200 strlen: Fix up !si->full_string_p handling in count_nonzero_bytes_addr [PR115152] The following testcase is miscompiled because strlen_pass::count_nonzero_bytes_addr doesn't handle correctly the !si->full_string_p case. If si->full_string_p, it correctly computes minlen and maxlen as minimum and maximum length of the '\0' terminated stgring and clears *nulterm (ie. makes sure !full_string_p in the ultimate caller) if minlen is equal or larger than nbytes and so '\0' isn't guaranteed to be among those bytes. But in the !si->full_string_p case, all we know is that there are [minlen,maxlen] non-zero bytes followed by unknown bytes, so effectively the maxlen is infinite (but caller cares about only the first nbytes bytes) and furthermore, we never know if there is any '\0' char among those, so *nulterm needs to be always cleared. 2024-05-22 Jakub Jelinek PR tree-optimization/115152 * tree-ssa-strlen.cc (strlen_pass::count_nonzero_bytes_addr): If !si->full_string_p, clear *nulterm and set maxlen to nbytes. * gcc.dg/pr115152.c: New test. (cherry picked from commit dbc9b45a3c2468ad134b3a9bd4961f7ae6bc1e67) Diff: --- gcc/testsuite/gcc.dg/pr115152.c | 17 + gcc/tree-ssa-strlen.cc | 5 - 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/gcc/testsuite/gcc.dg/pr115152.c b/gcc/testsuite/gcc.dg/pr115152.c new file mode 100644 index 000..a44654e2015 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr115152.c @@ -0,0 +1,17 @@ +/* PR tree-optimization/115152 */ +/* { dg-do run } */ +/* { dg-options "-O3 -fno-tree-fre -fno-tree-dominator-opts -fno-tree-loop-im" } */ + +int a, b, c, d; +signed char e[1] = { 1 }; + +int +main () +{ + for (a = 0; a < 3; a++) +for (b = 0; b < 2; b++) + c = e[0] = e[0] ^ d; + if (!c) +__builtin_abort (); + return 0; +} diff --git a/gcc/tree-ssa-strlen.cc b/gcc/tree-ssa-strlen.cc index 3b10c7b4cb2..b911067d009 100644 --- a/gcc/tree-ssa-strlen.cc +++ b/gcc/tree-ssa-strlen.cc @@ -4836,7 +4836,7 @@ strlen_pass::count_nonzero_bytes_addr (tree exp, tree vuse, gimple *stmt, if (maxlen + 1 < nbytes) return false; - if (nbytes <= minlen) + if (nbytes <= minlen || !si->full_string_p) *nulterm = false; if (nbytes < minlen) @@ -4846,6 +4846,9 @@ strlen_pass::count_nonzero_bytes_addr (tree exp, tree vuse, gimple *stmt, maxlen = nbytes; } + if (!si->full_string_p) + maxlen = nbytes; + if (minlen < lenrange[0]) lenrange[0] = minlen; if (lenrange[1] < maxlen)
[gcc r14-10231] strlen: Fix up !si->full_string_p handling in count_nonzero_bytes_addr [PR115152]
https://gcc.gnu.org/g:fc9fb69ad624fd4cc89ff31ad0a7b8d88481c1f7 commit r14-10231-gfc9fb69ad624fd4cc89ff31ad0a7b8d88481c1f7 Author: Jakub Jelinek Date: Wed May 22 09:13:50 2024 +0200 strlen: Fix up !si->full_string_p handling in count_nonzero_bytes_addr [PR115152] The following testcase is miscompiled because strlen_pass::count_nonzero_bytes_addr doesn't handle correctly the !si->full_string_p case. If si->full_string_p, it correctly computes minlen and maxlen as minimum and maximum length of the '\0' terminated stgring and clears *nulterm (ie. makes sure !full_string_p in the ultimate caller) if minlen is equal or larger than nbytes and so '\0' isn't guaranteed to be among those bytes. But in the !si->full_string_p case, all we know is that there are [minlen,maxlen] non-zero bytes followed by unknown bytes, so effectively the maxlen is infinite (but caller cares about only the first nbytes bytes) and furthermore, we never know if there is any '\0' char among those, so *nulterm needs to be always cleared. 2024-05-22 Jakub Jelinek PR tree-optimization/115152 * tree-ssa-strlen.cc (strlen_pass::count_nonzero_bytes_addr): If !si->full_string_p, clear *nulterm and set maxlen to nbytes. * gcc.dg/pr115152.c: New test. (cherry picked from commit dbc9b45a3c2468ad134b3a9bd4961f7ae6bc1e67) Diff: --- gcc/testsuite/gcc.dg/pr115152.c | 17 + gcc/tree-ssa-strlen.cc | 5 - 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/gcc/testsuite/gcc.dg/pr115152.c b/gcc/testsuite/gcc.dg/pr115152.c new file mode 100644 index 000..a44654e2015 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr115152.c @@ -0,0 +1,17 @@ +/* PR tree-optimization/115152 */ +/* { dg-do run } */ +/* { dg-options "-O3 -fno-tree-fre -fno-tree-dominator-opts -fno-tree-loop-im" } */ + +int a, b, c, d; +signed char e[1] = { 1 }; + +int +main () +{ + for (a = 0; a < 3; a++) +for (b = 0; b < 2; b++) + c = e[0] = e[0] ^ d; + if (!c) +__builtin_abort (); + return 0; +} diff --git a/gcc/tree-ssa-strlen.cc b/gcc/tree-ssa-strlen.cc index e09c9cc081f..fcd40ded449 100644 --- a/gcc/tree-ssa-strlen.cc +++ b/gcc/tree-ssa-strlen.cc @@ -4829,7 +4829,7 @@ strlen_pass::count_nonzero_bytes_addr (tree exp, tree vuse, gimple *stmt, if (maxlen + 1 < nbytes) return false; - if (nbytes <= minlen) + if (nbytes <= minlen || !si->full_string_p) *nulterm = false; if (nbytes < minlen) @@ -4839,6 +4839,9 @@ strlen_pass::count_nonzero_bytes_addr (tree exp, tree vuse, gimple *stmt, maxlen = nbytes; } + if (!si->full_string_p) + maxlen = nbytes; + if (minlen < lenrange[0]) lenrange[0] = minlen; if (lenrange[1] < maxlen)
[gcc r14-10230] ubsan: Use right address space for MEM_REF created for bool/enum sanitization [PR115172]
https://gcc.gnu.org/g:d224c7d8d8b49daab54a977a4f2217423d3d12a0 commit r14-10230-gd224c7d8d8b49daab54a977a4f2217423d3d12a0 Author: Jakub Jelinek Date: Wed May 22 09:12:28 2024 +0200 ubsan: Use right address space for MEM_REF created for bool/enum sanitization [PR115172] The following testcase is miscompiled, because -fsanitize=bool,enum creates a MEM_REF without propagating there address space qualifiers, so what should be normally loaded using say %gs:/%fs: segment prefix isn't. Together with asan it then causes that load to be sanitized. 2024-05-22 Jakub Jelinek PR sanitizer/115172 * ubsan.cc (instrument_bool_enum_load): If rhs is not in generic address space, use qualified version of utype with the right address space. Formatting fix. * gcc.dg/asan/pr115172.c: New test. (cherry picked from commit d3c506eff54fcbac389a529c2e98da108a410b7f) Diff: --- gcc/testsuite/gcc.dg/asan/pr115172.c | 20 gcc/ubsan.cc | 6 +- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/gcc/testsuite/gcc.dg/asan/pr115172.c b/gcc/testsuite/gcc.dg/asan/pr115172.c new file mode 100644 index 000..8707e615733 --- /dev/null +++ b/gcc/testsuite/gcc.dg/asan/pr115172.c @@ -0,0 +1,20 @@ +/* PR sanitizer/115172 */ +/* { dg-do compile { target i?86-*-* x86_64-*-* } } */ +/* { dg-options "-O2 -fsanitize=address,bool -ffat-lto-objects -fdump-tree-asan1" } */ +/* { dg-final { scan-tree-dump-not "\.ASAN_CHECK " "asan1" } } */ + +#ifdef __x86_64__ +#define SEG __seg_gs +#else +#define SEG __seg_fs +#endif + +extern struct S { _Bool b; } s; +void bar (void); + +void +foo (void) +{ + if (*(volatile _Bool SEG *) (__UINTPTR_TYPE__) ) +bar (); +} diff --git a/gcc/ubsan.cc b/gcc/ubsan.cc index fb00dc24bf6..76ca7a04265 100644 --- a/gcc/ubsan.cc +++ b/gcc/ubsan.cc @@ -1776,13 +1776,17 @@ instrument_bool_enum_load (gimple_stmt_iterator *gsi) || TREE_CODE (gimple_assign_lhs (stmt)) != SSA_NAME) return; + addr_space_t as = TYPE_ADDR_SPACE (TREE_TYPE (rhs)); + if (as != TYPE_ADDR_SPACE (utype)) +utype = build_qualified_type (utype, TYPE_QUALS (utype) +| ENCODE_QUAL_ADDR_SPACE (as)); bool ends_bb = stmt_ends_bb_p (stmt); location_t loc = gimple_location (stmt); tree lhs = gimple_assign_lhs (stmt); tree ptype = build_pointer_type (TREE_TYPE (rhs)); tree atype = reference_alias_ptr_type (rhs); gimple *g = gimple_build_assign (make_ssa_name (ptype), - build_fold_addr_expr (rhs)); + build_fold_addr_expr (rhs)); gimple_set_location (g, loc); gsi_insert_before (gsi, g, GSI_SAME_STMT); tree mem = build2 (MEM_REF, utype, gimple_assign_lhs (g),
[gcc r15-766] strlen: Fix up !si->full_string_p handling in count_nonzero_bytes_addr [PR115152]
https://gcc.gnu.org/g:dbc9b45a3c2468ad134b3a9bd4961f7ae6bc1e67 commit r15-766-gdbc9b45a3c2468ad134b3a9bd4961f7ae6bc1e67 Author: Jakub Jelinek Date: Wed May 22 09:13:50 2024 +0200 strlen: Fix up !si->full_string_p handling in count_nonzero_bytes_addr [PR115152] The following testcase is miscompiled because strlen_pass::count_nonzero_bytes_addr doesn't handle correctly the !si->full_string_p case. If si->full_string_p, it correctly computes minlen and maxlen as minimum and maximum length of the '\0' terminated stgring and clears *nulterm (ie. makes sure !full_string_p in the ultimate caller) if minlen is equal or larger than nbytes and so '\0' isn't guaranteed to be among those bytes. But in the !si->full_string_p case, all we know is that there are [minlen,maxlen] non-zero bytes followed by unknown bytes, so effectively the maxlen is infinite (but caller cares about only the first nbytes bytes) and furthermore, we never know if there is any '\0' char among those, so *nulterm needs to be always cleared. 2024-05-22 Jakub Jelinek PR tree-optimization/115152 * tree-ssa-strlen.cc (strlen_pass::count_nonzero_bytes_addr): If !si->full_string_p, clear *nulterm and set maxlen to nbytes. * gcc.dg/pr115152.c: New test. Diff: --- gcc/testsuite/gcc.dg/pr115152.c | 17 + gcc/tree-ssa-strlen.cc | 5 - 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/gcc/testsuite/gcc.dg/pr115152.c b/gcc/testsuite/gcc.dg/pr115152.c new file mode 100644 index 000..a44654e2015 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr115152.c @@ -0,0 +1,17 @@ +/* PR tree-optimization/115152 */ +/* { dg-do run } */ +/* { dg-options "-O3 -fno-tree-fre -fno-tree-dominator-opts -fno-tree-loop-im" } */ + +int a, b, c, d; +signed char e[1] = { 1 }; + +int +main () +{ + for (a = 0; a < 3; a++) +for (b = 0; b < 2; b++) + c = e[0] = e[0] ^ d; + if (!c) +__builtin_abort (); + return 0; +} diff --git a/gcc/tree-ssa-strlen.cc b/gcc/tree-ssa-strlen.cc index 61c3da22322..7596dd80942 100644 --- a/gcc/tree-ssa-strlen.cc +++ b/gcc/tree-ssa-strlen.cc @@ -4829,7 +4829,7 @@ strlen_pass::count_nonzero_bytes_addr (tree exp, tree vuse, gimple *stmt, if (maxlen + 1 < nbytes) return false; - if (nbytes <= minlen) + if (nbytes <= minlen || !si->full_string_p) *nulterm = false; if (nbytes < minlen) @@ -4839,6 +4839,9 @@ strlen_pass::count_nonzero_bytes_addr (tree exp, tree vuse, gimple *stmt, maxlen = nbytes; } + if (!si->full_string_p) + maxlen = nbytes; + if (minlen < lenrange[0]) lenrange[0] = minlen; if (lenrange[1] < maxlen)
[gcc r15-765] ubsan: Use right address space for MEM_REF created for bool/enum sanitization [PR115172]
https://gcc.gnu.org/g:d3c506eff54fcbac389a529c2e98da108a410b7f commit r15-765-gd3c506eff54fcbac389a529c2e98da108a410b7f Author: Jakub Jelinek Date: Wed May 22 09:12:28 2024 +0200 ubsan: Use right address space for MEM_REF created for bool/enum sanitization [PR115172] The following testcase is miscompiled, because -fsanitize=bool,enum creates a MEM_REF without propagating there address space qualifiers, so what should be normally loaded using say %gs:/%fs: segment prefix isn't. Together with asan it then causes that load to be sanitized. 2024-05-22 Jakub Jelinek PR sanitizer/115172 * ubsan.cc (instrument_bool_enum_load): If rhs is not in generic address space, use qualified version of utype with the right address space. Formatting fix. * gcc.dg/asan/pr115172.c: New test. Diff: --- gcc/testsuite/gcc.dg/asan/pr115172.c | 20 gcc/ubsan.cc | 6 +- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/gcc/testsuite/gcc.dg/asan/pr115172.c b/gcc/testsuite/gcc.dg/asan/pr115172.c new file mode 100644 index 000..8707e615733 --- /dev/null +++ b/gcc/testsuite/gcc.dg/asan/pr115172.c @@ -0,0 +1,20 @@ +/* PR sanitizer/115172 */ +/* { dg-do compile { target i?86-*-* x86_64-*-* } } */ +/* { dg-options "-O2 -fsanitize=address,bool -ffat-lto-objects -fdump-tree-asan1" } */ +/* { dg-final { scan-tree-dump-not "\.ASAN_CHECK " "asan1" } } */ + +#ifdef __x86_64__ +#define SEG __seg_gs +#else +#define SEG __seg_fs +#endif + +extern struct S { _Bool b; } s; +void bar (void); + +void +foo (void) +{ + if (*(volatile _Bool SEG *) (__UINTPTR_TYPE__) ) +bar (); +} diff --git a/gcc/ubsan.cc b/gcc/ubsan.cc index fb00dc24bf6..76ca7a04265 100644 --- a/gcc/ubsan.cc +++ b/gcc/ubsan.cc @@ -1776,13 +1776,17 @@ instrument_bool_enum_load (gimple_stmt_iterator *gsi) || TREE_CODE (gimple_assign_lhs (stmt)) != SSA_NAME) return; + addr_space_t as = TYPE_ADDR_SPACE (TREE_TYPE (rhs)); + if (as != TYPE_ADDR_SPACE (utype)) +utype = build_qualified_type (utype, TYPE_QUALS (utype) +| ENCODE_QUAL_ADDR_SPACE (as)); bool ends_bb = stmt_ends_bb_p (stmt); location_t loc = gimple_location (stmt); tree lhs = gimple_assign_lhs (stmt); tree ptype = build_pointer_type (TREE_TYPE (rhs)); tree atype = reference_alias_ptr_type (rhs); gimple *g = gimple_build_assign (make_ssa_name (ptype), - build_fold_addr_expr (rhs)); + build_fold_addr_expr (rhs)); gimple_set_location (g, loc); gsi_insert_before (gsi, g, GSI_SAME_STMT); tree mem = build2 (MEM_REF, utype, gimple_assign_lhs (g),