Hi Doug,
> Have you filed a bugzilla report for gcc against this bug? If it is
> an optimization wrong code bug, then it probably exists for other
> targets besides mingw32.
Yes, it's a problem across targets. I first caught it when compiling
for an x86_64-linux target.
> For example, a
> common occurrence in migrating to compiling with gcc 4.5+ is better
> optimizations of pointer aliasing handling such as the following:
>
> #include <stdio.h>
>
> double s = 123;
> int main()
> {
> unsigned int* pc = (unsigned int*)&s;
> *pc = 43;
> printf("%f", s);
> return 0;
> }
>
> Optimization is free to print 123.00000 (seemingly unexpectedly) in
> these cases. While this may seem like a bug in gcc, it's actually a
> bug in the user's code, exposed by the optimizer.
I'm very confused by this example, and not sure what you are trying to
get at. In fact, I feel as though the behavior you are talking about
is fully expected and doesn't seem to have anything to do with
optimization.
1) A double is 8 bytes long.
2) The assignment using the int pointer only alters 4 bytes of that.
3) The 4 bytes that are altered are the 4 least-significant bytes (on
x86 or other Little Endian machines, at least)
4) As such the alteration is beyond the default precision of your %f
format string.
This modified example might make things more clear:
---
#include <stdio.h>
#include <stdint.h>
double s = 123;
int main()
{
unsigned int* pc = (unsigned int*)&s;
uint64_t *val = (uint64_t *)&s;
printf("s before alteration = %f\n", s);
printf("raw repr of s before alteration = 0x%16lx\n", *val);
*pc = 0x43;
printf("s after alteration = %f\n", s);
printf("raw repr of s after alteration = 0x%16lx\n", *val);
return 0;
}
---
Please do let me know if I'm missing something here.
Yes, I am planning on posting my find on the GCC Bugzilla. I'm pretty
sure it's a case of over-optimization (and a critical one at that),
but I freely admit that I'm not an expert on the internals of GCC. :)
> I personally wouldn't do a mulitlib compiler with 4.4 series, but just
> have two compilers, one that targets i686-w64-mingw32 and one that
> targets x86_64-w64-mingw32.
Yes, I considered that, but I'd highly prefer that my toolchain (which
includes a multilib Linux GCC and multilib Darwin GCC as well) be
consistent if possible.
> In fact, even with the 4.5 and 4.6 series, multilib requires a bit of
> work to ensure that the installed DLLs are correctly placed on the
> build system. This doesn't even take into consideration placement of
> the runtime libraries on the end user's system.
Yes, thanks. I had noticed that before too with 4.5, and moved some
binary DLLs around appropriately in the bin directory (bin/32 and
bin/64).
Cheers,
Paarvai
------------------------------------------------------------------------------
This SF.net email is sponsored by Sprint
What will you do first with EVO, the first 4G phone?
Visit sprint.com/first -- http://p.sf.net/sfu/sprint-com-first
_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public