Martin G C Davies wrote:
-----Original Message----- From: gpc-owner@gnu.de [mailto:gpc-owner@gnu.de]On Behalf Of Maurice Lombardi Sent: 16 January 2002 10:47 To: gpc@gnu.de Subject: Re: Is this a bug or me being stupid?
Martin G C Davies wrote:
main: sizeof curpseudoreg=2 main: alignof curpseudoreg=2 main: curpseudoreg initially set to 5 initregcons: sizeof curpseudoreg=4 initregcons: alignof curpseudoreg=4 initregcons: curpseudoreg=327680 initregcons: curpseudoreg now set to 99 main: curpseudoreg=0
So the quuestion is, why is the sizeof and alignog different in the two modules?
<snip>
Thanks for the analysis Maurice but I don't think it's correct for three reasons:-
- 327680 is hex 50000 so it just looks like the sizeof and alignof of 4 are
what is mucking it up.
Right, and it depends on endianness, with low endian djgpp the values of
curpseudoreg are correct, because (I presume) they are now correctly aligned.
Now it seems nevertheless to me that it is the incorrect use of two "external" declarations in main and regabs which fools gpc. The following program, modeled after demomod3.pas (in the docdemos directory), which describes non EP, gpc specific modules, avoids the asmnames by putting module and main in a single file, and has only correct external declarations in main.
------------------------------------------------------------------------------ combine.pas ============
module regabs ;
var curpseudoreg : packed -32768..32767 ;
procedure initregcons ; begin writeln( 'initregcons: addr curpseudoreg=' , integer( addr(curpseudoreg ) ) ) ; writeln( 'initregcons: sizeof curpseudoreg=' , sizeof( curpseudoreg ) ); writeln( 'initregcons: alignof curpseudoreg=' , alignof(curpseudoreg ) ) ; writeln( 'initregcons: curpseudoreg=' , curpseudoreg ) ; curpseudoreg := 99 ; writeln( 'initregcons: curpseudoreg now set to ' , curpseudoreg ) ; end ;
end.
program main(output) ;
procedure initregcons ; external ; var curpseudoreg : packed -32768..32767 ; external ;
begin writeln( 'main: addr curpseudoreg=' , integer( addr( curpseudoreg ) ) ); writeln( 'main: sizeof curpseudoreg=' , sizeof( curpseudoreg ) ) ; writeln( 'main: alignof curpseudoreg=' , alignof( curpseudoreg ) ) ; curpseudoreg := 5 ; writeln( 'main: curpseudoreg initially set to ' , curpseudoreg ) ; initregcons ; writeln( 'main: curpseudoreg=' , curpseudoreg ) ; end.
---------------------------------------------------------------------------------------
It gives correct results:
main: addr curpseudoreg=338472 main: sizeof curpseudoreg=2 main: alignof curpseudoreg=2 main: curpseudoreg initially set to 5 initregcons: addr curpseudoreg=338472 initregcons: sizeof curpseudoreg=2 initregcons: alignof curpseudoreg=2 initregcons: curpseudoreg=5 initregcons: curpseudoreg now set to 99 main: curpseudoreg=99
I cannot say more ...
Maurice