Problems with GMP in latest Cygwin

mwoehlke mwoehlke@tibco.com
Mon Oct 9 16:11:00 GMT 2006


(TITTTL'd)

William Hart wrote:
> Firstly I was using Cygwin on a **64** bit Athlon,
> running on **32** bit Windows XP.
> 
> I'm not sure about what choices of bit length are made
> for long's under such circumstances, but one has to be
> very careful of the following:

Microsoft, in their "infinite wisdom", made long's 32-bit, even for 
64-bit targets (which is different from how the ENTIRE REST OF THE WORLD 
works - don't get me started, or at least TITTTL any continuation)... 
but, basically, if you are running a 32-bit OS on 64-bit hardware this 
should be no different than running the same 32-bit OS on 32-bit 
hardware. Of course I expect/hope that gcc, when it is ported to 64-bit 
Windows (soon, I think, since I hear binutils is ported) to make more 
reasonable decisions.

> 1) printf("%ld",longvar) expects a long
> 2) Using gmp_scanf and gmp_printf after instances of
> ordinary printf and scanf when the incorrect
> assumptions have been made about the length of a long
> may cause problems (note the compiler may not give an
> error or warning).
> 3) Replacing long's with u_int32_t's may further
> compound the problems: GMP expects a ui (in functions
> like mpz_mul_ui) to be 32 bits on a 32 bit machine and
> 64 bits on a 64 bit machine. But what does it expect
> on a 64 bit machine running in 32 bit mode? One must
> use a long, but this may cause issues elsewhere.

This I don't get; if GMP is doing anything that takes into account the 
hardware bits, independent of the OS bits, then IMO it is doing 
something wrong. At any rate, all SANE systems ought to be using the 
LPxx model; i.e. 'sizeof(long) == sizeof(void*)'. This has nothing to do 
with the hardware, since a 32-bit OS (or even a 32-bit program on a 
64-bit OS) still has 32-bit pointers and should therefore have 32-bit longs.

> Some combination of the above led me to write a
> program which compiled without warnings and which ran
> correctly on my 32 bit laptop, but which compiled
> correctly did not run correctly on my 64 bit Athlon
> running 32 bit Windows XP (under Cygwin). 

This I find VERY surprising. What was the program? The only possible 
explanation I can think of is that this program somehow was run in 
64-bit mode even though it is a 32-bit program (possibly because it 
intentionally alters itself depending on the hardware it is run on). I 
can think of no reason that identical assembly should not behave 
identically on different CPU's.

What you are suggesting has very serious ramifications.

> C is portable only if you are porting it to the same
> kind of machine, using the same operating system with
> the same kind of OS emulator!!

I thought you said you were doing this? 32-bit OS in both cases; 
emulation should be the same. If your 64-bit hardware can't run 32-bit 
code correctly then there is something very wrong with it. That, or 
there is something wrong with your code that 'fortuitously' works 
correctly on 32-bit hardware (some issue with sign extension, maybe).

-- 
Matthew
"Try to bring it back in one piece this time." -- Q (MI6)



More information about the Cygwin-talk mailing list