[Mono-devel-list] Bug in mini
Piers Haken
piersh at friskit.com
Sat May 3 17:22:10 EDT 2003
Paolo, I think you may be mistaken about the meanin of 'single forward
pass'. I believe that 'forward' does NOT refer to an increasing sequence
of addresses. I believe that it refers to the order in which the
'virtual' processor might execute those instructions: an acyclic,
depth-first traversal as opposed to a linear one, if you will.
In this case that would imply that IL_0030 should be considered BEFORE
IL_001c. And since, with a depth-first traversal, the stack depth is
known at the end of the basic block that ends with IL_0030, you'd also
know the stack depth at IL_001c.
One possible 'single forward pass' might look like:
IL_0000: ldc.i4 256
IL_0005: newarr Smalltalk.Classes.Character
IL_000a: stsfld class Smalltalk.Classes.Character[]
Smalltalk.Pools.Smalltalk::Character-literals$
IL_000f: ldsfld class Smalltalk.Classes.Character[]
Smalltalk.Pools.Smalltalk::Character-literals$
IL_0014: ldc.i4.s 0x00
IL_0016: stloc.0
IL_0017: br IL_002a
IL_002a: ldloc.0
IL_002b: ldc.i4 255
IL_0030: ble IL_001c
IL_001c: dup
IL_001d: ldloc.0
IL_001e: dup
IL_001f: newobj instance void class
Smalltalk.Classes.Character::.ctor(char)
IL_0024: stelem.ref
IL_0025: ldloc.0
IL_0026: ldc.i4.s 0x01
IL_0028: add
IL_0029: stloc.0
IL_0035: pop
IL_0036: ret
Piers.
> -----Original Message-----
> From: Paolo Molaro [mailto:lupus at ximian.com]
> Sent: Saturday, May 03, 2003 8:46 AM
> To: mono-devel-list at lists.ximian.com
> Subject: Re: [Mono-devel-list] Bug in mini
>
>
> On 05/02/03 Don Roberts wrote:
> > Let me preface this by saying that I'm not a mono developer, I'm in
> > the process of trying to get #Smalltalk to run under it, though. We
> > ran into a problem running our calculator example under mono. After
> > many hours and brain cells, I know why it doesn't work. Mini can't
> > handle MSIL with the following pattern:
> > ...some code...
> > br LOOP_TEST
> > LOOP: dup
> > ...code using stack value...
> > LOOP_TEST: ldloc.0
> > ldc.i4 0xff
> > ble LOOP
> >
> > What happens is that mini creates the basic block for LOOP
> before it
> > has processed any of the in-edges (since the only in-edge
> comes from
> > the ble instruction). Therefore, it doesn't know how many arguments
> > are on the stack when it translates the DUP instruction and
> > CHECK_STACK(1) fails.
>
> I tryed running the sst.exe compiler and it seems to die in
> the same way. The complete function that triggers it is:
>
> .method public static specialname
> default void GenerateCharacterLiterals$() cil managed
> {
> // Method begins at RVA 0x8f7c
> // Code size 55 (0x37)
> .maxstack 6
> .locals init (
> int32 V_0)
> IL_0000: ldc.i4 256
> IL_0005: newarr Smalltalk.Classes.Character
> IL_000a: stsfld class Smalltalk.Classes.Character[]
> Smalltalk.Pools.Smalltalk::Character-literals$
> IL_000f: ldsfld class Smalltalk.Classes.Character[]
> Smalltalk.Pools.Smalltalk::Character-literals$
> IL_0014: ldc.i4.s 0x00
> IL_0016: stloc.0
> IL_0017: br IL_002a
>
> IL_001c: dup
> IL_001d: ldloc.0
> IL_001e: dup
> IL_001f: newobj instance void class
> Smalltalk.Classes.Character::.ctor(char)
> IL_0024: stelem.ref
> IL_0025: ldloc.0
> IL_0026: ldc.i4.s 0x01
> IL_0028: add
> IL_0029: stloc.0
> IL_002a: ldloc.0
> IL_002b: ldc.i4 255
> IL_0030: ble IL_001c
>
> IL_0035: pop
> IL_0036: ret
> } // end of method Root$::default void
> GenerateCharacterLiterals$()
>
> The problem with this method is that it is not valid if I
> understand the following paragraph of the spec correctly:
>
> 1.7.5 Backward Branch Constraints
> It must be possible, with a single forward-pass through the CIL
> instruction stream for any method, to infer the exact state of
> the evaluation stack at every instruction (where by "state" we
> mean the number and type of each item on the evaluation stack).
> In particular, if that single-pass analysis arrives at an
> instruction, call it location X, that immediately follows an
> unconditional branch, and where X is not the target of
> an earlier
> branch instruction, then the state of the evaluation stack at X,
> clearly, cannot be derived from existing information.
> In this case,
> the CLI demands that the evaluation stack at X be empty.
>
> In this method, location X is at label IL_001c, the dup is
> preceded by an unconditional branch and there is no previous
> branch to IL_001c itself, so the evaluation stack at that
> point is assumed to be empty and since dup has no element to
> duplicate, we bail out and report an error. Sigh. The sad
> part is that peverify doesn't report the issue and the ms jit
> obviously executes the code, so we'll have to make it work,
> too. Is it possible to change the #smalltalk compiler to not
> generate that kind of code? It may be that sometime in the
> future the MS people will follow the spec and report an error
> for it, too...
>
> Should bring the issue up with the MS and ECMA people :-(
>
> lupus
>
> --
> -----------------------------------------------------------------
> lupus at debian.org debian/rules
> lupus at ximian.com Monkeys do it better
> _______________________________________________
> Mono-devel-list mailing list
> Mono-devel-list at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-> devel-list
>
More information about the Mono-devel-list
mailing list