Re: [PATCH] target/i386: floatx80: avoid compound literals in static initializers
On 07/21/20 18:02, Alex Bennée wrote: > > Philippe Mathieu-Daudé writes: > >> On 7/17/20 6:46 PM, Laszlo Ersek wrote: >>> On 07/17/20 11:26, Laszlo Ersek wrote: On 07/16/20 17:09, Philippe Mathieu-Daudé wrote: > On 7/16/20 4:42 PM, Laszlo Ersek wrote: >> Quoting ISO C99 6.7.8p4, "All the expressions in an initializer for an >> object that has static storage duration shall be constant expressions or >> string literals". >> >> The compound literal produced by the make_floatx80() macro is not such a >> constant expression, per 6.6p7-9. (An implementation may accept it, >> according to 6.6p10, but is not required to.) >> >> Therefore using "floatx80_zero" and make_floatx80() for initializing >> "f2xm1_table" and "fpatan_table" is not portable. And gcc-4.8 in RHEL-7.6 >> actually chokes on them: >> >>> target/i386/fpu_helper.c:871:5: error: initializer element is not >>> constant >>> { make_floatx80(0xbfff, 0x8000ULL), >>> ^ > > This reminds me of: > > commit 6fa9ba09dbf4eb8b52bcb47d6820957f1b77ee0b > Author: Kamil Rytarowski > Date: Mon Sep 4 23:23:06 2017 +0200 > > target/m68k: Switch fpu_rom from make_floatx80() to > make_floatx80_init() > > GCC 4.7.2 on SunOS reports that the values assigned to array members > are not > real constants: > > target/m68k/fpu_helper.c:32:5: error: initializer element is not > constant > target/m68k/fpu_helper.c:32:5: error: (near initialization for > 'fpu_rom[0]') > rules.mak:66: recipe for target 'target/m68k/fpu_helper.o' failed > > Convert the array to make_floatx80_init() to fix it. > Replace floatx80_pi-like constants with make_floatx80_init() as they > are > defined as make_floatx80(). > > Reviewed-by: Philippe Mathieu-Daudé > >> >> We've had the make_floatx80_init() macro for this purpose since commit >> 3bf7e40ab914 ("softfloat: fix for C99", 2012-03-17), so let's use that >> macro again. >> >> Fixes: eca30647fc07 >> Fixes: ff57bb7b6326 >> Link: https://lists.gnu.org/archive/html/qemu-devel/2017-08/msg06566.html >> Link: https://lists.gnu.org/archive/html/qemu-devel/2020-07/msg04714.html >> Cc: Alex Bennée >> Cc: Aurelien Jarno >> Cc: Eduardo Habkost >> Cc: Joseph Myers >> Cc: Paolo Bonzini >> Cc: Peter Maydell >> Cc: Richard Henderson >> Signed-off-by: Laszlo Ersek >> --- >> >> Notes: >> I can see that there are test cases under "tests/tcg/i386", but I >> don't >> know how to run them. > > Yeah it is not easy to figure... > > Try 'make run-tcg-tests-i386-softmmu' > but you need docker :^) That worked, thanks! Even without Docker: I just had to add --cross-cc-i386=gcc to my ./configure flags. >>> >>> Also -- I meant to, but I forgot to put "for-5.1" in the subject prefix; >>> sorry about that. >> >> Alex, as Paolo is not available, can this go via your tree? > > Ok queued to for-5.1/fixes-for-rc1-v2, thanks. Many thanks! Laszlo
Re: [PATCH] target/i386: floatx80: avoid compound literals in static initializers
Philippe Mathieu-Daudé writes: > On 7/17/20 6:46 PM, Laszlo Ersek wrote: >> On 07/17/20 11:26, Laszlo Ersek wrote: >>> On 07/16/20 17:09, Philippe Mathieu-Daudé wrote: On 7/16/20 4:42 PM, Laszlo Ersek wrote: > Quoting ISO C99 6.7.8p4, "All the expressions in an initializer for an > object that has static storage duration shall be constant expressions or > string literals". > > The compound literal produced by the make_floatx80() macro is not such a > constant expression, per 6.6p7-9. (An implementation may accept it, > according to 6.6p10, but is not required to.) > > Therefore using "floatx80_zero" and make_floatx80() for initializing > "f2xm1_table" and "fpatan_table" is not portable. And gcc-4.8 in RHEL-7.6 > actually chokes on them: > >> target/i386/fpu_helper.c:871:5: error: initializer element is not >> constant >> { make_floatx80(0xbfff, 0x8000ULL), >> ^ This reminds me of: commit 6fa9ba09dbf4eb8b52bcb47d6820957f1b77ee0b Author: Kamil Rytarowski Date: Mon Sep 4 23:23:06 2017 +0200 target/m68k: Switch fpu_rom from make_floatx80() to make_floatx80_init() GCC 4.7.2 on SunOS reports that the values assigned to array members are not real constants: target/m68k/fpu_helper.c:32:5: error: initializer element is not constant target/m68k/fpu_helper.c:32:5: error: (near initialization for 'fpu_rom[0]') rules.mak:66: recipe for target 'target/m68k/fpu_helper.o' failed Convert the array to make_floatx80_init() to fix it. Replace floatx80_pi-like constants with make_floatx80_init() as they are defined as make_floatx80(). Reviewed-by: Philippe Mathieu-Daudé > > We've had the make_floatx80_init() macro for this purpose since commit > 3bf7e40ab914 ("softfloat: fix for C99", 2012-03-17), so let's use that > macro again. > > Fixes: eca30647fc07 > Fixes: ff57bb7b6326 > Link: https://lists.gnu.org/archive/html/qemu-devel/2017-08/msg06566.html > Link: https://lists.gnu.org/archive/html/qemu-devel/2020-07/msg04714.html > Cc: Alex Bennée > Cc: Aurelien Jarno > Cc: Eduardo Habkost > Cc: Joseph Myers > Cc: Paolo Bonzini > Cc: Peter Maydell > Cc: Richard Henderson > Signed-off-by: Laszlo Ersek > --- > > Notes: > I can see that there are test cases under "tests/tcg/i386", but I > don't > know how to run them. Yeah it is not easy to figure... Try 'make run-tcg-tests-i386-softmmu' but you need docker :^) >>> >>> That worked, thanks! Even without Docker: I just had to add >>> >>> --cross-cc-i386=gcc >>> >>> to my ./configure flags. >>> >> >> Also -- I meant to, but I forgot to put "for-5.1" in the subject prefix; >> sorry about that. > > Alex, as Paolo is not available, can this go via your tree? Ok queued to for-5.1/fixes-for-rc1-v2, thanks. > >> >> Laszlo >> -- Alex Bennée
Re: [PATCH] target/i386: floatx80: avoid compound literals in static initializers
On 7/17/20 6:46 PM, Laszlo Ersek wrote: > On 07/17/20 11:26, Laszlo Ersek wrote: >> On 07/16/20 17:09, Philippe Mathieu-Daudé wrote: >>> On 7/16/20 4:42 PM, Laszlo Ersek wrote: Quoting ISO C99 6.7.8p4, "All the expressions in an initializer for an object that has static storage duration shall be constant expressions or string literals". The compound literal produced by the make_floatx80() macro is not such a constant expression, per 6.6p7-9. (An implementation may accept it, according to 6.6p10, but is not required to.) Therefore using "floatx80_zero" and make_floatx80() for initializing "f2xm1_table" and "fpatan_table" is not portable. And gcc-4.8 in RHEL-7.6 actually chokes on them: > target/i386/fpu_helper.c:871:5: error: initializer element is not constant > { make_floatx80(0xbfff, 0x8000ULL), > ^ >>> >>> This reminds me of: >>> >>> commit 6fa9ba09dbf4eb8b52bcb47d6820957f1b77ee0b >>> Author: Kamil Rytarowski >>> Date: Mon Sep 4 23:23:06 2017 +0200 >>> >>> target/m68k: Switch fpu_rom from make_floatx80() to make_floatx80_init() >>> >>> GCC 4.7.2 on SunOS reports that the values assigned to array members >>> are not >>> real constants: >>> >>> target/m68k/fpu_helper.c:32:5: error: initializer element is not >>> constant >>> target/m68k/fpu_helper.c:32:5: error: (near initialization for >>> 'fpu_rom[0]') >>> rules.mak:66: recipe for target 'target/m68k/fpu_helper.o' failed >>> >>> Convert the array to make_floatx80_init() to fix it. >>> Replace floatx80_pi-like constants with make_floatx80_init() as they are >>> defined as make_floatx80(). >>> >>> Reviewed-by: Philippe Mathieu-Daudé >>> We've had the make_floatx80_init() macro for this purpose since commit 3bf7e40ab914 ("softfloat: fix for C99", 2012-03-17), so let's use that macro again. Fixes: eca30647fc07 Fixes: ff57bb7b6326 Link: https://lists.gnu.org/archive/html/qemu-devel/2017-08/msg06566.html Link: https://lists.gnu.org/archive/html/qemu-devel/2020-07/msg04714.html Cc: Alex Bennée Cc: Aurelien Jarno Cc: Eduardo Habkost Cc: Joseph Myers Cc: Paolo Bonzini Cc: Peter Maydell Cc: Richard Henderson Signed-off-by: Laszlo Ersek --- Notes: I can see that there are test cases under "tests/tcg/i386", but I don't know how to run them. >>> >>> Yeah it is not easy to figure... >>> >>> Try 'make run-tcg-tests-i386-softmmu' >>> but you need docker :^) >> >> That worked, thanks! Even without Docker: I just had to add >> >> --cross-cc-i386=gcc >> >> to my ./configure flags. >> > > Also -- I meant to, but I forgot to put "for-5.1" in the subject prefix; > sorry about that. Alex, as Paolo is not available, can this go via your tree? > > Laszlo >
Re: [PATCH] target/i386: floatx80: avoid compound literals in static initializers
On 07/17/20 11:26, Laszlo Ersek wrote: > On 07/16/20 17:09, Philippe Mathieu-Daudé wrote: >> On 7/16/20 4:42 PM, Laszlo Ersek wrote: >>> Quoting ISO C99 6.7.8p4, "All the expressions in an initializer for an >>> object that has static storage duration shall be constant expressions or >>> string literals". >>> >>> The compound literal produced by the make_floatx80() macro is not such a >>> constant expression, per 6.6p7-9. (An implementation may accept it, >>> according to 6.6p10, but is not required to.) >>> >>> Therefore using "floatx80_zero" and make_floatx80() for initializing >>> "f2xm1_table" and "fpatan_table" is not portable. And gcc-4.8 in RHEL-7.6 >>> actually chokes on them: >>> target/i386/fpu_helper.c:871:5: error: initializer element is not constant { make_floatx80(0xbfff, 0x8000ULL), ^ >> >> This reminds me of: >> >> commit 6fa9ba09dbf4eb8b52bcb47d6820957f1b77ee0b >> Author: Kamil Rytarowski >> Date: Mon Sep 4 23:23:06 2017 +0200 >> >> target/m68k: Switch fpu_rom from make_floatx80() to make_floatx80_init() >> >> GCC 4.7.2 on SunOS reports that the values assigned to array members >> are not >> real constants: >> >> target/m68k/fpu_helper.c:32:5: error: initializer element is not >> constant >> target/m68k/fpu_helper.c:32:5: error: (near initialization for >> 'fpu_rom[0]') >> rules.mak:66: recipe for target 'target/m68k/fpu_helper.o' failed >> >> Convert the array to make_floatx80_init() to fix it. >> Replace floatx80_pi-like constants with make_floatx80_init() as they are >> defined as make_floatx80(). >> >> Reviewed-by: Philippe Mathieu-Daudé >> >>> >>> We've had the make_floatx80_init() macro for this purpose since commit >>> 3bf7e40ab914 ("softfloat: fix for C99", 2012-03-17), so let's use that >>> macro again. >>> >>> Fixes: eca30647fc07 >>> Fixes: ff57bb7b6326 >>> Link: https://lists.gnu.org/archive/html/qemu-devel/2017-08/msg06566.html >>> Link: https://lists.gnu.org/archive/html/qemu-devel/2020-07/msg04714.html >>> Cc: Alex Bennée >>> Cc: Aurelien Jarno >>> Cc: Eduardo Habkost >>> Cc: Joseph Myers >>> Cc: Paolo Bonzini >>> Cc: Peter Maydell >>> Cc: Richard Henderson >>> Signed-off-by: Laszlo Ersek >>> --- >>> >>> Notes: >>> I can see that there are test cases under "tests/tcg/i386", but I don't >>> know how to run them. >> >> Yeah it is not easy to figure... >> >> Try 'make run-tcg-tests-i386-softmmu' >> but you need docker :^) > > That worked, thanks! Even without Docker: I just had to add > > --cross-cc-i386=gcc > > to my ./configure flags. > Also -- I meant to, but I forgot to put "for-5.1" in the subject prefix; sorry about that. Laszlo
Re: [PATCH] target/i386: floatx80: avoid compound literals in static initializers
On 07/16/20 18:31, Alex Bennée wrote: > > Laszlo Ersek writes: > >> Quoting ISO C99 6.7.8p4, "All the expressions in an initializer for an >> object that has static storage duration shall be constant expressions or >> string literals". >> >> The compound literal produced by the make_floatx80() macro is not such a >> constant expression, per 6.6p7-9. (An implementation may accept it, >> according to 6.6p10, but is not required to.) >> >> Therefore using "floatx80_zero" and make_floatx80() for initializing >> "f2xm1_table" and "fpatan_table" is not portable. And gcc-4.8 in RHEL-7.6 >> actually chokes on them: >> >>> target/i386/fpu_helper.c:871:5: error: initializer element is not constant >>> { make_floatx80(0xbfff, 0x8000ULL), >>> ^ >> >> We've had the make_floatx80_init() macro for this purpose since commit >> 3bf7e40ab914 ("softfloat: fix for C99", 2012-03-17), so let's use that >> macro again. >> >> Fixes: eca30647fc07 >> Fixes: ff57bb7b6326 >> Link: https://lists.gnu.org/archive/html/qemu-devel/2017-08/msg06566.html >> Link: https://lists.gnu.org/archive/html/qemu-devel/2020-07/msg04714.html >> Cc: Alex Bennée >> Cc: Aurelien Jarno >> Cc: Eduardo Habkost >> Cc: Joseph Myers >> Cc: Paolo Bonzini >> Cc: Peter Maydell >> Cc: Richard Henderson >> Signed-off-by: Laszlo Ersek >> --- >> >> Notes: >> I can see that there are test cases under "tests/tcg/i386", but I don't >> know how to run them. > > You can run the TCG tests with: > > make check-tcg > > or more specifically: > > make run-tcg-tests-i386-linux-user > > there is also a: > > make check-softfloat > > although in this case nothing is affected. > > softfloat bits: > > Acked-by: Alex Bennée Thank you! Laszlo
Re: [PATCH] target/i386: floatx80: avoid compound literals in static initializers
On 07/16/20 17:09, Philippe Mathieu-Daudé wrote: > On 7/16/20 4:42 PM, Laszlo Ersek wrote: >> Quoting ISO C99 6.7.8p4, "All the expressions in an initializer for an >> object that has static storage duration shall be constant expressions or >> string literals". >> >> The compound literal produced by the make_floatx80() macro is not such a >> constant expression, per 6.6p7-9. (An implementation may accept it, >> according to 6.6p10, but is not required to.) >> >> Therefore using "floatx80_zero" and make_floatx80() for initializing >> "f2xm1_table" and "fpatan_table" is not portable. And gcc-4.8 in RHEL-7.6 >> actually chokes on them: >> >>> target/i386/fpu_helper.c:871:5: error: initializer element is not constant >>> { make_floatx80(0xbfff, 0x8000ULL), >>> ^ > > This reminds me of: > > commit 6fa9ba09dbf4eb8b52bcb47d6820957f1b77ee0b > Author: Kamil Rytarowski > Date: Mon Sep 4 23:23:06 2017 +0200 > > target/m68k: Switch fpu_rom from make_floatx80() to make_floatx80_init() > > GCC 4.7.2 on SunOS reports that the values assigned to array members > are not > real constants: > > target/m68k/fpu_helper.c:32:5: error: initializer element is not > constant > target/m68k/fpu_helper.c:32:5: error: (near initialization for > 'fpu_rom[0]') > rules.mak:66: recipe for target 'target/m68k/fpu_helper.o' failed > > Convert the array to make_floatx80_init() to fix it. > Replace floatx80_pi-like constants with make_floatx80_init() as they are > defined as make_floatx80(). > > Reviewed-by: Philippe Mathieu-Daudé > >> >> We've had the make_floatx80_init() macro for this purpose since commit >> 3bf7e40ab914 ("softfloat: fix for C99", 2012-03-17), so let's use that >> macro again. >> >> Fixes: eca30647fc07 >> Fixes: ff57bb7b6326 >> Link: https://lists.gnu.org/archive/html/qemu-devel/2017-08/msg06566.html >> Link: https://lists.gnu.org/archive/html/qemu-devel/2020-07/msg04714.html >> Cc: Alex Bennée >> Cc: Aurelien Jarno >> Cc: Eduardo Habkost >> Cc: Joseph Myers >> Cc: Paolo Bonzini >> Cc: Peter Maydell >> Cc: Richard Henderson >> Signed-off-by: Laszlo Ersek >> --- >> >> Notes: >> I can see that there are test cases under "tests/tcg/i386", but I don't >> know how to run them. > > Yeah it is not easy to figure... > > Try 'make run-tcg-tests-i386-softmmu' > but you need docker :^) That worked, thanks! Even without Docker: I just had to add --cross-cc-i386=gcc to my ./configure flags. Thanks, Laszlo > > (There is also 'make check-softfloat', listed in 'make check-help') > >> >> include/fpu/softfloat.h | 1 + >> target/i386/fpu_helper.c | 426 +++ >> 2 files changed, 214 insertions(+), 213 deletions(-) >> >> diff --git a/include/fpu/softfloat.h b/include/fpu/softfloat.h >> index f1a19df066b7..659218b5c787 100644 >> --- a/include/fpu/softfloat.h >> +++ b/include/fpu/softfloat.h >> @@ -822,6 +822,7 @@ static inline bool floatx80_invalid_encoding(floatx80 a) >> } >> >> #define floatx80_zero make_floatx80(0x, 0xLL) >> +#define floatx80_zero_init make_floatx80_init(0x, 0xLL) >> #define floatx80_one make_floatx80(0x3fff, 0x8000LL) >> #define floatx80_ln2 make_floatx80(0x3ffe, 0xb17217f7d1cf79acLL) >> #define floatx80_pi make_floatx80(0x4000, 0xc90fdaa22168c235LL) >> diff --git a/target/i386/fpu_helper.c b/target/i386/fpu_helper.c >> index f5e6c4b88d4e..4ea73874d836 100644 >> --- a/target/i386/fpu_helper.c >> +++ b/target/i386/fpu_helper.c >> @@ -868,201 +868,201 @@ struct f2xm1_data { >> }; > ... >
Re: [PATCH] target/i386: floatx80: avoid compound literals in static initializers
Laszlo Ersek writes: > Quoting ISO C99 6.7.8p4, "All the expressions in an initializer for an > object that has static storage duration shall be constant expressions or > string literals". > > The compound literal produced by the make_floatx80() macro is not such a > constant expression, per 6.6p7-9. (An implementation may accept it, > according to 6.6p10, but is not required to.) > > Therefore using "floatx80_zero" and make_floatx80() for initializing > "f2xm1_table" and "fpatan_table" is not portable. And gcc-4.8 in RHEL-7.6 > actually chokes on them: > >> target/i386/fpu_helper.c:871:5: error: initializer element is not constant >> { make_floatx80(0xbfff, 0x8000ULL), >> ^ > > We've had the make_floatx80_init() macro for this purpose since commit > 3bf7e40ab914 ("softfloat: fix for C99", 2012-03-17), so let's use that > macro again. > > Fixes: eca30647fc07 > Fixes: ff57bb7b6326 > Link: https://lists.gnu.org/archive/html/qemu-devel/2017-08/msg06566.html > Link: https://lists.gnu.org/archive/html/qemu-devel/2020-07/msg04714.html > Cc: Alex Bennée > Cc: Aurelien Jarno > Cc: Eduardo Habkost > Cc: Joseph Myers > Cc: Paolo Bonzini > Cc: Peter Maydell > Cc: Richard Henderson > Signed-off-by: Laszlo Ersek > --- > > Notes: > I can see that there are test cases under "tests/tcg/i386", but I don't > know how to run them. You can run the TCG tests with: make check-tcg or more specifically: make run-tcg-tests-i386-linux-user there is also a: make check-softfloat although in this case nothing is affected. softfloat bits: Acked-by: Alex Bennée > > include/fpu/softfloat.h | 1 + > target/i386/fpu_helper.c | 426 +++ > 2 files changed, 214 insertions(+), 213 deletions(-) > > diff --git a/include/fpu/softfloat.h b/include/fpu/softfloat.h > index f1a19df066b7..659218b5c787 100644 > --- a/include/fpu/softfloat.h > +++ b/include/fpu/softfloat.h > @@ -822,6 +822,7 @@ static inline bool floatx80_invalid_encoding(floatx80 a) > } > > #define floatx80_zero make_floatx80(0x, 0xLL) > +#define floatx80_zero_init make_floatx80_init(0x, 0xLL) > #define floatx80_one make_floatx80(0x3fff, 0x8000LL) > #define floatx80_ln2 make_floatx80(0x3ffe, 0xb17217f7d1cf79acLL) > #define floatx80_pi make_floatx80(0x4000, 0xc90fdaa22168c235LL) > diff --git a/target/i386/fpu_helper.c b/target/i386/fpu_helper.c > index f5e6c4b88d4e..4ea73874d836 100644 > --- a/target/i386/fpu_helper.c > +++ b/target/i386/fpu_helper.c > @@ -868,201 +868,201 @@ struct f2xm1_data { > }; > > static const struct f2xm1_data f2xm1_table[65] = { > -{ make_floatx80(0xbfff, 0x8000ULL), > - make_floatx80(0x3ffe, 0x8000ULL), > - make_floatx80(0xbffe, 0x8000ULL) }, > -{ make_floatx80(0xbffe, 0xf8002e7eULL), > - make_floatx80(0x3ffe, 0x82cd8698ac2b9160ULL), > - make_floatx80(0xbffd, 0xfa64f2cea7a8dd40ULL) }, > -{ make_floatx80(0xbffe, 0xefffe960ULL), > - make_floatx80(0x3ffe, 0x85aac367cc488345ULL), > - make_floatx80(0xbffd, 0xf4aa7930676ef976ULL) }, > -{ make_floatx80(0xbffe, 0xe8006f10ULL), > - make_floatx80(0x3ffe, 0x88980e8092da5c14ULL), > - make_floatx80(0xbffd, 0xeecfe2feda4b47d8ULL) }, > -{ make_floatx80(0xbffe, 0xe0008a45ULL), > - make_floatx80(0x3ffe, 0x8b95c1e3ea8ba2a5ULL), > - make_floatx80(0xbffd, 0xe8d47c382ae8bab6ULL) }, > -{ make_floatx80(0xbffe, 0xd7ff8a9eULL), > - make_floatx80(0x3ffe, 0x8ea4398b45cd8116ULL), > - make_floatx80(0xbffd, 0xe2b78ce97464fdd4ULL) }, > -{ make_floatx80(0xbffe, 0xd00019a0ULL), > - make_floatx80(0x3ffe, 0x91c3d373ab11b919ULL), > - make_floatx80(0xbffd, 0xdc785918a9dc8dceULL) }, > -{ make_floatx80(0xbffe, 0xc7ff14dfULL), > - make_floatx80(0x3ffe, 0x94f4efa8fef76836ULL), > - make_floatx80(0xbffd, 0xd61620ae02112f94ULL) }, > -{ make_floatx80(0xbffe, 0xc0006530ULL), > - make_floatx80(0x3ffe, 0x9837f0518db87fbbULL), > - make_floatx80(0xbffd, 0xcf901f5ce48f008aULL) }, > -{ make_floatx80(0xbffe, 0xb7ff1723ULL), > - make_floatx80(0x3ffe, 0x9b8d39b9d54eb74cULL), > - make_floatx80(0xbffd, 0xc8e58c8c55629168ULL) }, > -{ make_floatx80(0xbffe, 0xb000b5e1ULL), > - make_floatx80(0x3ffe, 0x9ef5326091a0c366ULL), > - make_floatx80(0xbffd, 0xc2159b3edcbe7934ULL) }, > -{ make_floatx80(0xbffe, 0xa8006f8aULL), > - make_floatx80(0x3ffe, 0xa27043030c49370aULL), > - make_floatx80(0xbffd, 0xbb1f79f9e76d91ecULL) }, > -{ make_floatx80(0xbffe, 0x9fff816aULL), > - make_floatx80(0x3ffe, 0xa5fed6a9b15171cfULL), > - make_floatx80(0xbffd, 0xb40252ac9d5d1c62ULL) }, > -{ make_floatx80(0xbffe, 0x97ffb621ULL), > - make_floatx80(0x3ffe, 0xa9a15ab4ea7c30e6ULL), > - make_floatx80(0xbffd, 0xacbd
Re: [PATCH] target/i386: floatx80: avoid compound literals in static initializers
On 7/16/20 4:42 PM, Laszlo Ersek wrote: > Quoting ISO C99 6.7.8p4, "All the expressions in an initializer for an > object that has static storage duration shall be constant expressions or > string literals". > > The compound literal produced by the make_floatx80() macro is not such a > constant expression, per 6.6p7-9. (An implementation may accept it, > according to 6.6p10, but is not required to.) > > Therefore using "floatx80_zero" and make_floatx80() for initializing > "f2xm1_table" and "fpatan_table" is not portable. And gcc-4.8 in RHEL-7.6 > actually chokes on them: > >> target/i386/fpu_helper.c:871:5: error: initializer element is not constant >> { make_floatx80(0xbfff, 0x8000ULL), >> ^ This reminds me of: commit 6fa9ba09dbf4eb8b52bcb47d6820957f1b77ee0b Author: Kamil Rytarowski Date: Mon Sep 4 23:23:06 2017 +0200 target/m68k: Switch fpu_rom from make_floatx80() to make_floatx80_init() GCC 4.7.2 on SunOS reports that the values assigned to array members are not real constants: target/m68k/fpu_helper.c:32:5: error: initializer element is not constant target/m68k/fpu_helper.c:32:5: error: (near initialization for 'fpu_rom[0]') rules.mak:66: recipe for target 'target/m68k/fpu_helper.o' failed Convert the array to make_floatx80_init() to fix it. Replace floatx80_pi-like constants with make_floatx80_init() as they are defined as make_floatx80(). Reviewed-by: Philippe Mathieu-Daudé > > We've had the make_floatx80_init() macro for this purpose since commit > 3bf7e40ab914 ("softfloat: fix for C99", 2012-03-17), so let's use that > macro again. > > Fixes: eca30647fc07 > Fixes: ff57bb7b6326 > Link: https://lists.gnu.org/archive/html/qemu-devel/2017-08/msg06566.html > Link: https://lists.gnu.org/archive/html/qemu-devel/2020-07/msg04714.html > Cc: Alex Bennée > Cc: Aurelien Jarno > Cc: Eduardo Habkost > Cc: Joseph Myers > Cc: Paolo Bonzini > Cc: Peter Maydell > Cc: Richard Henderson > Signed-off-by: Laszlo Ersek > --- > > Notes: > I can see that there are test cases under "tests/tcg/i386", but I don't > know how to run them. Yeah it is not easy to figure... Try 'make run-tcg-tests-i386-softmmu' but you need docker :^) (There is also 'make check-softfloat', listed in 'make check-help') > > include/fpu/softfloat.h | 1 + > target/i386/fpu_helper.c | 426 +++ > 2 files changed, 214 insertions(+), 213 deletions(-) > > diff --git a/include/fpu/softfloat.h b/include/fpu/softfloat.h > index f1a19df066b7..659218b5c787 100644 > --- a/include/fpu/softfloat.h > +++ b/include/fpu/softfloat.h > @@ -822,6 +822,7 @@ static inline bool floatx80_invalid_encoding(floatx80 a) > } > > #define floatx80_zero make_floatx80(0x, 0xLL) > +#define floatx80_zero_init make_floatx80_init(0x, 0xLL) > #define floatx80_one make_floatx80(0x3fff, 0x8000LL) > #define floatx80_ln2 make_floatx80(0x3ffe, 0xb17217f7d1cf79acLL) > #define floatx80_pi make_floatx80(0x4000, 0xc90fdaa22168c235LL) > diff --git a/target/i386/fpu_helper.c b/target/i386/fpu_helper.c > index f5e6c4b88d4e..4ea73874d836 100644 > --- a/target/i386/fpu_helper.c > +++ b/target/i386/fpu_helper.c > @@ -868,201 +868,201 @@ struct f2xm1_data { > }; ...
[PATCH] target/i386: floatx80: avoid compound literals in static initializers
Quoting ISO C99 6.7.8p4, "All the expressions in an initializer for an object that has static storage duration shall be constant expressions or string literals". The compound literal produced by the make_floatx80() macro is not such a constant expression, per 6.6p7-9. (An implementation may accept it, according to 6.6p10, but is not required to.) Therefore using "floatx80_zero" and make_floatx80() for initializing "f2xm1_table" and "fpatan_table" is not portable. And gcc-4.8 in RHEL-7.6 actually chokes on them: > target/i386/fpu_helper.c:871:5: error: initializer element is not constant > { make_floatx80(0xbfff, 0x8000ULL), > ^ We've had the make_floatx80_init() macro for this purpose since commit 3bf7e40ab914 ("softfloat: fix for C99", 2012-03-17), so let's use that macro again. Fixes: eca30647fc07 Fixes: ff57bb7b6326 Link: https://lists.gnu.org/archive/html/qemu-devel/2017-08/msg06566.html Link: https://lists.gnu.org/archive/html/qemu-devel/2020-07/msg04714.html Cc: Alex Bennée Cc: Aurelien Jarno Cc: Eduardo Habkost Cc: Joseph Myers Cc: Paolo Bonzini Cc: Peter Maydell Cc: Richard Henderson Signed-off-by: Laszlo Ersek --- Notes: I can see that there are test cases under "tests/tcg/i386", but I don't know how to run them. include/fpu/softfloat.h | 1 + target/i386/fpu_helper.c | 426 +++ 2 files changed, 214 insertions(+), 213 deletions(-) diff --git a/include/fpu/softfloat.h b/include/fpu/softfloat.h index f1a19df066b7..659218b5c787 100644 --- a/include/fpu/softfloat.h +++ b/include/fpu/softfloat.h @@ -822,6 +822,7 @@ static inline bool floatx80_invalid_encoding(floatx80 a) } #define floatx80_zero make_floatx80(0x, 0xLL) +#define floatx80_zero_init make_floatx80_init(0x, 0xLL) #define floatx80_one make_floatx80(0x3fff, 0x8000LL) #define floatx80_ln2 make_floatx80(0x3ffe, 0xb17217f7d1cf79acLL) #define floatx80_pi make_floatx80(0x4000, 0xc90fdaa22168c235LL) diff --git a/target/i386/fpu_helper.c b/target/i386/fpu_helper.c index f5e6c4b88d4e..4ea73874d836 100644 --- a/target/i386/fpu_helper.c +++ b/target/i386/fpu_helper.c @@ -868,201 +868,201 @@ struct f2xm1_data { }; static const struct f2xm1_data f2xm1_table[65] = { -{ make_floatx80(0xbfff, 0x8000ULL), - make_floatx80(0x3ffe, 0x8000ULL), - make_floatx80(0xbffe, 0x8000ULL) }, -{ make_floatx80(0xbffe, 0xf8002e7eULL), - make_floatx80(0x3ffe, 0x82cd8698ac2b9160ULL), - make_floatx80(0xbffd, 0xfa64f2cea7a8dd40ULL) }, -{ make_floatx80(0xbffe, 0xefffe960ULL), - make_floatx80(0x3ffe, 0x85aac367cc488345ULL), - make_floatx80(0xbffd, 0xf4aa7930676ef976ULL) }, -{ make_floatx80(0xbffe, 0xe8006f10ULL), - make_floatx80(0x3ffe, 0x88980e8092da5c14ULL), - make_floatx80(0xbffd, 0xeecfe2feda4b47d8ULL) }, -{ make_floatx80(0xbffe, 0xe0008a45ULL), - make_floatx80(0x3ffe, 0x8b95c1e3ea8ba2a5ULL), - make_floatx80(0xbffd, 0xe8d47c382ae8bab6ULL) }, -{ make_floatx80(0xbffe, 0xd7ff8a9eULL), - make_floatx80(0x3ffe, 0x8ea4398b45cd8116ULL), - make_floatx80(0xbffd, 0xe2b78ce97464fdd4ULL) }, -{ make_floatx80(0xbffe, 0xd00019a0ULL), - make_floatx80(0x3ffe, 0x91c3d373ab11b919ULL), - make_floatx80(0xbffd, 0xdc785918a9dc8dceULL) }, -{ make_floatx80(0xbffe, 0xc7ff14dfULL), - make_floatx80(0x3ffe, 0x94f4efa8fef76836ULL), - make_floatx80(0xbffd, 0xd61620ae02112f94ULL) }, -{ make_floatx80(0xbffe, 0xc0006530ULL), - make_floatx80(0x3ffe, 0x9837f0518db87fbbULL), - make_floatx80(0xbffd, 0xcf901f5ce48f008aULL) }, -{ make_floatx80(0xbffe, 0xb7ff1723ULL), - make_floatx80(0x3ffe, 0x9b8d39b9d54eb74cULL), - make_floatx80(0xbffd, 0xc8e58c8c55629168ULL) }, -{ make_floatx80(0xbffe, 0xb000b5e1ULL), - make_floatx80(0x3ffe, 0x9ef5326091a0c366ULL), - make_floatx80(0xbffd, 0xc2159b3edcbe7934ULL) }, -{ make_floatx80(0xbffe, 0xa8006f8aULL), - make_floatx80(0x3ffe, 0xa27043030c49370aULL), - make_floatx80(0xbffd, 0xbb1f79f9e76d91ecULL) }, -{ make_floatx80(0xbffe, 0x9fff816aULL), - make_floatx80(0x3ffe, 0xa5fed6a9b15171cfULL), - make_floatx80(0xbffd, 0xb40252ac9d5d1c62ULL) }, -{ make_floatx80(0xbffe, 0x97ffb621ULL), - make_floatx80(0x3ffe, 0xa9a15ab4ea7c30e6ULL), - make_floatx80(0xbffd, 0xacbd4a962b079e34ULL) }, -{ make_floatx80(0xbffe, 0x8fff162bULL), - make_floatx80(0x3ffe, 0xad583eea42a1b886ULL), - make_floatx80(0xbffd, 0xa54f822b7abc8ef4ULL) }, -{ make_floatx80(0xbffe, 0x87ff4d34ULL), - make_floatx80(0x3ffe, 0xb123f581d2ac7b51ULL), - make_floatx80(0xbffd, 0x9db814fc5aa7095eULL) }, -{ make_floatx80(0xbffe, 0x8000227dULL), - make_floatx80(0x3ffe, 0xb504f333f9de539dULL), - make_fl