Message ID | 1404202956-30657-4-git-send-email-pbonzini@redhat.com |
---|---|
State | New |
Headers | show |
On 1 July 2014 09:22, Paolo Bonzini <pbonzini@redhat.com> wrote: > From: Alexey Kardashevskiy <aik@ozlabs.ru> > > The existing test whether "-lm" needs to be included or not is > insufficient as it reports false negative on Fedora20/ppc64. > This happens because sin(0.0) is a constant value which compiler > can safely throw away and therefore there is no need to add "-lm". > As the result, qemu-nbd/qemu-io/qemu-img tools cannot compile. > > This adds a global variable and uses it in the test to prevent > from optimization. > --- a/configure > +++ b/configure > @@ -3453,7 +3453,7 @@ fi > # Do we need libm > cat > $TMPC << EOF > #include <math.h> > -int main(void) { return isnan(sin(0.0)); } > +double x; int main(void) {return isnan(sin(x));} > EOF > if compile_prog "" "" ; then > : This looks to me like we're leaving ourselves open for a smarter compiler with linktime optimisation to complain that x is used uninitialized. thanks -- PMM
On 07/01/2014 02:26 AM, Peter Maydell wrote: > On 1 July 2014 09:22, Paolo Bonzini <pbonzini@redhat.com> wrote: >> From: Alexey Kardashevskiy <aik@ozlabs.ru> >> >> The existing test whether "-lm" needs to be included or not is >> insufficient as it reports false negative on Fedora20/ppc64. >> This happens because sin(0.0) is a constant value which compiler >> can safely throw away and therefore there is no need to add "-lm". >> As the result, qemu-nbd/qemu-io/qemu-img tools cannot compile. >> >> This adds a global variable and uses it in the test to prevent >> from optimization. > >> --- a/configure >> +++ b/configure >> @@ -3453,7 +3453,7 @@ fi >> # Do we need libm >> cat > $TMPC << EOF >> #include <math.h> >> -int main(void) { return isnan(sin(0.0)); } >> +double x; int main(void) {return isnan(sin(x));} >> EOF >> if compile_prog "" "" ; then >> : > > This looks to me like we're leaving ourselves open for > a smarter compiler with linktime optimisation to complain > that x is used uninitialized. If that's your worry, what about: int main(int argc, char **argv) { return isnan(sin(argc > 1)); }
Peter Maydell <peter.maydell@linaro.org> writes: > On 1 July 2014 09:22, Paolo Bonzini <pbonzini@redhat.com> wrote: >> From: Alexey Kardashevskiy <aik@ozlabs.ru> >> >> The existing test whether "-lm" needs to be included or not is >> insufficient as it reports false negative on Fedora20/ppc64. >> This happens because sin(0.0) is a constant value which compiler >> can safely throw away and therefore there is no need to add "-lm". >> As the result, qemu-nbd/qemu-io/qemu-img tools cannot compile. >> >> This adds a global variable and uses it in the test to prevent >> from optimization. > >> --- a/configure >> +++ b/configure >> @@ -3453,7 +3453,7 @@ fi >> # Do we need libm >> cat > $TMPC << EOF >> #include <math.h> >> -int main(void) { return isnan(sin(0.0)); } >> +double x; int main(void) {return isnan(sin(x));} >> EOF >> if compile_prog "" "" ; then >> : > > This looks to me like we're leaving ourselves open for > a smarter compiler with linktime optimisation to complain > that x is used uninitialized. x *is* initialized, to zero. A sufficiently smart compiler(TM) could figure out that x is still zero in main(), and constant fold the test away. Suggest to use argc.
On 2 July 2014 08:02, Markus Armbruster <armbru@redhat.com> wrote: >> This looks to me like we're leaving ourselves open for >> a smarter compiler with linktime optimisation to complain >> that x is used uninitialized. > > x *is* initialized, to zero. A sufficiently smart compiler(TM) could > figure out that x is still zero in main(), and constant fold the test > away. Yes, I was wrong there. > Suggest to use argc. That's what we did -- see commit f80ea986. thanks -- PMM
diff --git a/Makefile.target b/Makefile.target index 6089d29..137d0b0 100644 --- a/Makefile.target +++ b/Makefile.target @@ -163,10 +163,6 @@ dummy := $(call unnest-vars,.., \ all-obj-y += $(common-obj-y) all-obj-$(CONFIG_SOFTMMU) += $(block-obj-y) -ifndef CONFIG_HAIKU -LIBS+=-lm -endif - # build either PROG or PROGW $(QEMU_PROG_BUILD): $(all-obj-y) ../libqemuutil.a ../libqemustub.a $(call LINK,$^) diff --git a/configure b/configure index 23ecb37..6dd44a9 100755 --- a/configure +++ b/configure @@ -3453,7 +3453,7 @@ fi # Do we need libm cat > $TMPC << EOF #include <math.h> -int main(void) { return isnan(sin(0.0)); } +double x; int main(void) {return isnan(sin(x));} EOF if compile_prog "" "" ; then :