[M3devel] codegen error (from Mika, new test p250)

Tony Hosking hosking at cs.purdue.edu
Tue Jan 11 21:18:09 CET 2011


No, that would be too late.  I certainly don't want automatic loopholing in the code generator.  I want explicit, checked types, as we currently have, to avoid the sorts of errors it has now thrown up.

I do know what the problem is.

On Jan 11, 2011, at 2:36 AM, Jay K wrote:

> 
> ps: can M3CG_Check be pushed into service to do the work?
> You know, it is already tracking everything and where the detection/error is currently.
> Can we make it, like, required, and have it cast/loophole as needed?
> Or is this too late and it might miss problems, such as incorrect/unchecked narrowing?
> 
> 
>  - Jay
> 
> 
> ----------------------------------------
>> From: jay.krell at cornell.edu
>> To: hosking at cs.purdue.edu
>> CC: m3devel at elegosoft.com
>> Subject: RE: [M3devel] codegen error (from Mika, new test p250)
>> Date: Tue, 11 Jan 2011 07:33:57 +0000
>> 
>> 
>> Quibbling with the details:
>> 
>> Is this legal, on a 32bit system?
>> 
>> Longint.T = Longword.T = BITS 64 FOR ARRAY [0..1] OF [16_00000000..16_FFFFFFFF]
>> 
>> And even if it is legal, it is of dubious correctness, eh?
>> For implementation of this in Modula-3, you want the low word to be unsigned and the high word to be signed.
>> Granted, you want full range unsigned, so, like, Word.T, but you want 32 bits.
>> 
>> There should therefore be, like, interfaces Word32 and Word64 (ok, you already have Long).
>> 
>> As well, the implementation on 64bit targets will perhaps suffer.
>> 
>> As well, does it work for 64bit targets? Isn't [00000...FFFFFFFF] 64 bits?
>> Maybe you'd say:
>> Longint.T = Longword.T = BITS 64 FOR ARRAY [0..1] OF BITS 32 FOR [16_00000000..16_FFFFFFFF]
>> 
>> 
>> And then, *really*, you want the order/significance of the words to be endian-specific.
>> 
>> So, you'd want perhaps 3 implementations:
>> 
>> 64bit: Longint.T = INTEGER
>> 32bit big endian: Longint.T = RECORD high: INTEGER; low: Word.T; END;
>> 32bit little endian: Longint.T = RECORD low: Word.T; high: INTEGER; END;
>> 
>> 
>> 
>> or maybe just two:
>> 
>> big endian: Longint.T = RECORD high: some-32bit-signed-type; low: some-32bit-psuedo-unsigned-type; END;
>> little endian: Longint.T = RECORD low some-32bit-psuedo-unsigned-type; low: some-32bit-signed-type; END;
>> 
>> 
>> 
>> Ultimately, the very very very general true point is:
>>  extension via library is probably generally easier
>>  BUT only makes for good results in an adequate language, e.g. one with operator overloading!
>> 
>> 
>> Surely surely the compiler isn't so unmalleable?
>> ie. we aren't stuck with the language asis because the compiler is too hard to change?
>> 
>> 
>> I can't argue too strongly in favor of LONGINT.
>> 
>> 
>> But..definitely there should be some reasonable convenient efficient way for dealing with 64bit integers.
>>  32bit C implementations have had very good mechanisms for 25+ years.
>>  It does seem a shame we seemingly can't/won't compete.
>> 
>> 
>> And still. interface Rd/Wr I believe still need work..
>> Probably to add a parallel set of functions ending in "L".
>> 
>> - Jay
>> 
>> 
>> ----------------------------------------
>>> From: hosking at cs.purdue.edu
>>> Date: Tue, 11 Jan 2011 00:58:35 -0500
>>> To: jay.krell at cornell.edu
>>> CC: m3devel at elegosoft.com
>>> Subject: Re: [M3devel] codegen error (from Mika, new test p250)
>>> 
>>> I know what the problem is. The fix is not particularly pretty, and will entail tracking the stack types for integers (Int32 or Int64) throughout code generation.
>>> 
>>> This all leads me to wonder why we don't simply back LONGINT out of the language.
>>> [I had mentioned my increasing unease with LONGINT in a prior e-mail a long time ago.]
>>> 
>>> We can replace LONGINT with Longint and Longword:
>>> 
>>> Longint.T = Longword.T = BITS 64 FOR ARRAY [0..1] OF [16_00000000..16_FFFFFFFF]
>>> 
>>> and define signed operations in Longint and unsigned operations in Longword.
>>> These can be implemented efficiently as wrappers to appropriate C routines operating on "long long" or inlined if performance is a particular concern. We can provide conversion routines to/from INTEGER as needs.
>>> 
>>> Other than handling 64-bit file offsets, etc., does anyone really make use of LONGINT that argues convincingly for it to be retained?
>>> 
>>> On Jan 8, 2011, at 6:55 PM, Jay K wrote:
>>> 
>>>> 
>>>> Thank you much. Please notice there are 2 or 3 similar problems. This shows only 1.
>>>> See test p250.
>>>> 
>>>> 
>>>> MODULE Main;
>>>> 
>>>> PROCEDURE F1(<*UNUSED*>x: LONGINT) = BEGIN END F1;
>>>> 
>>>> PROCEDURE F2() =
>>>> <*UNUSED*>VAR x: [0L..0L];
>>>> BEGIN
>>>> END F2;
>>>> 
>>>> PROCEDURE F3() =
>>>> VAR x: [0L..0L];
>>>> BEGIN
>>>> F1(x);
>>>> END F3;
>>>> 
>>>> BEGIN
>>>> F1(0L);
>>>> F2();
>>>> F3();
>>>> END Main.
>>>> 
>>>> i.e. initializing local 0L..0L.
>>>> Passing 0L..0L parameter.
>>>> 
>>>> - Jay
>>>> 
>>>> 
>>>> ----------------------------------------
>>>>> From: hosking at cs.purdue.edu
>>>>> Date: Sat, 8 Jan 2011 16:59:33 -0500
>>>>> To: jay.krell at cornell.edu
>>>>> CC: m3devel at elegosoft.com
>>>>> Subject: Re: [M3devel] codegen error (from Mika, new test p250)
>>>>> 
>>>>> I'll look into this one.
>>>>> 
>>>>> Antony Hosking | Associate Professor | Computer Science | Purdue University
>>>>> 305 N. University Street | West Lafayette | IN 47907 | USA
>>>>> Office +1 765 494 6001 | Mobile +1 765 427 5484
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> On Jan 8, 2011, at 12:17 AM, Jay K wrote:
>>>>> 
>>>>>> 
>>>>>> fyi, small repro:
>>>>>> 
>>>>>> 
>>>>>> MODULE Main;
>>>>>> 
>>>>>> VAR x: [0L..0L];
>>>>>> 
>>>>>> PROCEDURE F2(<*UNUSED*>x: LONGINT) = BEGIN END F2;
>>>>>> 
>>>>>> BEGIN
>>>>>> F2(x);
>>>>>> END Main.
>>>>>> 
>>>>>> (32) start_call_direct procedure:0x4 level:0
>>>>>> (33) load var:0x2 offset:0x1A0(416) src_t:word_8 dst_t:int_32
>>>>>> (34) comment comment:********* M3CG_Check ERROR *********** bad stack: expected [ Int64 ] got [ Int32 ]
>>>>>> (35) pop_param type:int_64
>>>>>> 
>>>>>> 
>>>>>> - Jay
>>>>>> 
>>>>>> 
>>>>>> ________________________________
>>>>>>> From: jay.krell at cornell.edu
>>>>>>> To: m3devel at elegosoft.com; mika at async.caltech.edu
>>>>>>> Subject: RE: codegen error (from Mika, new test p250)
>>>>>>> Date: Thu, 6 Jan 2011 01:21:00 +0000
>>>>>>> 
>>>>>>> fyi:
>>>>>>> 
>>>>>>> jbook2:p250 jay$ rm -rf I386_DARWIN/
>>>>>>> jbook2:p250 jay$ cm3 -keep
>>>>>>> --- building in I386_DARWIN ---
>>>>>>> 
>>>>>>> new source -> compiling Main.m3
>>>>>>> "../Main.m3", line 1: 1 code generation error
>>>>>>> 1 error encountered
>>>>>>> compilation failed => not building program "pgm"
>>>>>>> Fatal Error: package build failed
>>>>>>> jbook2:p250 jay$ cm3cg -y I386_DARWIN/Main.mc 2>&1 | grep -i comment
>>>>>>> (4) comment comment:module global constants
>>>>>>> (6) comment comment:module global data
>>>>>>> (27) comment comment:F1
>>>>>>> (34) comment comment:********* M3CG_Check ERROR
>>>>>>> *********** bad stack: expected [ Int64 ] got [ Int32 ]
>>>>>>> (43) comment comment:F2
>>>>>>> (73) comment comment:Main_M3
>>>>>>> (74) comment comment:module main body Main_M3
>>>>>>> (83) comment comment:global constant type descriptor
>>>>>>> (85) comment comment:global data type descriptor
>>>>>>> (87) comment comment:module global constants
>>>>>>> (90) comment comment:procedure names
>>>>>>> (94) comment comment:procedure table
>>>>>>> (101) comment comment:file name
>>>>>>> (103) comment comment:type map for _t0174bdf4
>>>>>>> (106) comment comment:type description for _t0174bdf4
>>>>>>> (110) comment comment:module global data
>>>>>>> (120) comment comment:typecell for _t0174bdf4
>>>>>>> (141) comment comment:load map
>>>>>>> (4) comment comment:module global constants
>>>>>>> (6) comment comment:module global data
>>>>>>> (27) comment comment:F1
>>>>>>> (34) comment comment:********* M3CG_Check ERROR
>>>>>>> *********** bad stack: expected [ Int64 ] got [ Int32 ]
>>>>>>> (43) comment comment:F2
>>>>>>> (73) comment comment:Main_M3
>>>>>>> (74) comment comment:module main body Main_M3
>>>>>>> (83) comment comment:global constant type descriptor
>>>>>>> (85) comment comment:global data type descriptor
>>>>>>> (87) comment comment:module global constants
>>>>>>> (90) comment comment:procedure names
>>>>>>> (94) comment comment:procedure table
>>>>>>> (101) comment comment:file name
>>>>>>> (103) comment comment:type map for _t0174bdf4
>>>>>>> (106) comment comment:type description for _t0174bdf4
>>>>>>> (110) comment comment:module global data
>>>>>>> (120) comment comment:typecell for _t0174bdf4
>>>>>>> (141) comment comment:load map
>>>>>>> 
>>>>>>> 
>>>>>>> - Jay
>>>>>>> 
>>>>>>> 
>>>>>>>> Date: Thu, 6 Jan 2011 01:26:15 +0000
>>>>>>>> To: m3commit at elegosoft.com
>>>>>>>> From: jkrell at elego.de
>>>>>>>> Subject: [M3commit] CVS Update: cm3
>>>>>>>> 
>>>>>>>> CVSROOT: /usr/cvs
>>>>>>>> Changes by: jkrell at birch. 11/01/06 01:26:15
>>>>>>>> 
>>>>>>>> Modified files:
>>>>>>>> cm3/m3-sys/m3tests/src/p2/p250/: Main.m3
>>>>>>>> 
>>>>>>>> Log message:
>>>>>>>> slightly simpler, same error
>>>>>>>> 
>>>>>> 
>>>>> 
>>>> 
>>> 
>> 
> 		 	   		  




More information about the M3devel mailing list