diff options
author | Jakub Jelinek <jakub@redhat.com> | 2021-11-05 16:39:14 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2021-11-05 16:59:28 +0100 |
commit | 858d7ee1a0cd97c01d844ea73ab81918da738344 (patch) | |
tree | 6d125610ffdfa1aec31cad99166cd24c69591427 | |
parent | b58c12f3cf926f877ea2f590c411fe7e853974e3 (diff) | |
download | gcc-858d7ee1a0cd97c01d844ea73ab81918da738344.zip gcc-858d7ee1a0cd97c01d844ea73ab81918da738344.tar.gz gcc-858d7ee1a0cd97c01d844ea73ab81918da738344.tar.bz2 |
x86: Make stringop_algs::stringop_strategy ctor constexpr [PR100246]
> Several older compilers fail to build modern GCC because of missing
> or incomplete C++11 support.
>
> * config/i386/i386.h (struct stringop_algs): Define a CTOR for
> this type.
Unfortunately, as mentioned in my
https://gcc.gnu.org/pipermail/gcc-patches/2021-November/583289.html
mail, without the new dyninit pass this causes dynamic initialization of
many variables, 6.5KB _GLOBAL__sub_I_* on x86_64 and 12.5KB on i686.
The following patch makes the ctor constexpr so that already the FE
is able to statically initialize all those.
I have tested on godbolt a reduced testcase without a constructor,
with constructor and with constexpr constructor.
clang before 3.3 is unhappy about all the 3 cases, clang 3.3 and 3.4
is ok with ctor and ctor with constexpr and optimizes it into static
initialization, clang 3.5+ is ok with all 3 versions and optimizes,
gcc 4.8 and 5+ is ok with all 3 versions and no ctor and ctor with constexpr
is optimized, gcc 4.9 is unhappy about the no ctor case and happy with the
other two.
2021-11-05 Jakub Jelinek <jakub@redhat.com>
PR bootstrap/100246
* config/i386/i386.h
(stringop_algs::stringop_strategy::stringop_strategy): Make the ctor
constexpr.
-rw-r--r-- | gcc/config/i386/i386.h | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h index cba6d83..e35c79c 100644 --- a/gcc/config/i386/i386.h +++ b/gcc/config/i386/i386.h @@ -78,8 +78,9 @@ struct stringop_algs this issue. Since this header is used by code compiled with the C compiler we must guard the addition. */ #ifdef __cplusplus - stringop_strategy(int _max = -1, enum stringop_alg _alg = libcall, - int _noalign = false) + constexpr + stringop_strategy (int _max = -1, enum stringop_alg _alg = libcall, + int _noalign = false) : max (_max), alg (_alg), noalign (_noalign) {} #endif const int max; |