[Mono-dev] Mono JIT on MIPS - disappearing this argument in virtual call....

Mark E Mason mark.e.mason at broadcom.com
Wed Sep 13 18:56:35 EDT 2006


Hello all,
 
I'm working on a MIPS port of the Mono JIT compiler.  It's coming along
fairly well -- my "hello, world" test is getting approximately halfway
to actually producing output.... lol.
 
I've run into a problem with generating calls to virtual functions with
'this' pointers.  In the mono_arch_call_opcode() function (for most all
JIT targets), there's the following if() which prevents the 'this'
argument from being placed on the call->out_args list:
 
1044                    if (is_virtual && i == 0) {
1045                            /* the argument will be attached to the
call instrucion */
1046                            in = call->args [i];
1047                            call->used_iregs |= 1 << ainfo->reg;
1048                    } else {

This seems to be compensated for in mono_emit_method_call_full(), where
the 'this' pointer gets placed into the call instruction directly:

	call->inst.flags |= MONO_INST_HAS_METHOD;
	call->inst.inst_left = this;

But - the 'this' argument doesn't get emitted, and I'm getting lost in
tracking down where this 'should' be handled.  See below for an example
(the first arg to the 3rd call in Block 4 should be getting into 'a0',
but that's not happening (there's an assignment to 'R34' which never
gets moved from there to the register 'a0'.

Pointers anyone?  I've working off of the svn tip as of about a week
ago.

Thanks in advance,
Mark

[Snipped output below - I've '*' the lines corresponding to the 'this'
pointer]

converting method System.Console:OpenStandardError (int)

CODE BLOCK 4 (nesting 0):
 (stind.i local[3] call[get_ConsoleError])
 (outarg iconst[7155124])
 (stind.ref local[4] call[mono_object_new_specific])
* (outarg (ldind.i local[3]))
 (outarg iconst[2])
 (outarg iconst[0])
 (outarg (ldind.i4 arg[0]))
 (outarg iconst[0])
 (outarg (ceq (compare (ldind.i4 arg[0]) iconst[0])))
 (voidcallvirt[.ctor])
 (stind.ref local[1] (ldind.ref local[4]))
 br[B6]


DUMP BLOCK 4:
 (stind.i regoffset[0x60(mips_fp)] call[get_ConsoleError])
 (outarg iconst[7155124])
 (stind.ref regvar[mips_s5] call[mono_object_new_specific])
* (outarg (ldind.i regoffset[0x60(mips_fp)]))
 (outarg iconst[2])
 (outarg iconst[0])
 (outarg (ldind.i4 regoffset[0x90(mips_fp)]))
 (outarg iconst[0])
 (outarg (ceq (compare (ldind.i4 regoffset[0x90(mips_fp)]) iconst[0])))
 (voidcallvirt[.ctor])
 (stind.ref regoffset[0x58(mips_fp)] (ldind.ref regvar[mips_s5]))
 br[B6]


LABEL BLOCK 4:
 (stind.i regoffset[0x60(mips_fp)] call[get_ConsoleError])
 (outarg iconst[7155124])
 (stind.ref regvar[mips_s5] call[mono_object_new_specific])
* (outarg (ldind.i regoffset[0x60(mips_fp)]))
 (outarg iconst[2])
 (outarg iconst[0])
 (outarg (ldind.i4 regoffset[0x90(mips_fp)]))
 (outarg iconst[0])
 (outarg (ceq (compare (ldind.i4 regoffset[0x90(mips_fp)]) iconst[0])))
 (voidcallvirt[.ctor])
 (stind.ref regoffset[0x58(mips_fp)] (ldind.ref regvar[mips_s5]))
 br[B6]


LOCAL REGALLOC: BASIC BLOCK: 4
        1  call R32 <- clobbers: c
        2  store_membase_reg [mips_fp + 0x60] <- R32
        3  setregimm mips_a0 <- clobbers: r
        4  call R33 <- clobbers: c
        5  move mips_s5 <- R33

Where did the calculation the 'this' pointer and the assignment to 'a0'
go? 

        6  load_membase R34 <- [mips_fp + 0x60]
        7  setreg mips_a1 <- R34 clobbers: r
        8  setregimm mips_a2 <- clobbers: r
        9  setregimm mips_a3 <- clobbers: r
        10 loadi4_membase R35 <- [mips_fp + 0x90]
        11 store_membase_reg [mips_sp + 0x10] <- R35
        12 store_membase_imm [mips_sp + 0x14] <-
        13 loadi4_membase R37 <- [mips_fp + 0x90]
        14 compare_imm R37
        15 ceq R36 <-
        16 store_membase_reg [mips_sp + 0x18] <- R36
        17 move R38 <- mips_s5
        18 setreg mips_v0 <- R38 clobbers: r
        19 checkthis R38
        20 voidcall clobbers: c
        21 store_membase_reg [mips_fp + 0x58] <- mips_s5
        22 br






More information about the Mono-devel-list mailing list