[kaffe] x86 trampoline brokenness and classloader problem

Timothy Stack stack@cs.utah.edu
Sat, 10 Aug 2002 00:05:47 -0600


hi,

There seems to be a bug with the current implementation of 
i386_do_fixup_trampoline that masks the calling stack frame from stack 
traces.  Unfortunately, this presents a problem for any code that tries 
to catch an exception generated by the jitter (which is rare atm).  The 
problem is that the return pc associated with the stack frame belongs to 
i386_do_fixup_trampoline and not the original method.  So, when the 
exception code is walking the stack it will see, and ignore, a native 
function (i386_do_fixup_trampoline) while continuing up the stack.  So, 
I propose the following modification, we first pop the trampoline return 
address off the stack, create a real frame for 
i386_do_fixup_trampoline,  and then push the return address back on for 
soft_fixup_trampoline.  It seems to work for me:

asm(
         START_ASM_FUNC() C_FUNC_NAME(i386_do_fixup_trampoline) "\n"
C_FUNC_NAME(i386_do_fixup_trampoline) ":                        \n
         popl    %eax                                            \n
         push    %ebp                                            \n
         mov     %esp,%ebp                                       \n
         push    %eax                                            \n
         call    " C_FUNC_NAME(soft_fixup_trampoline) "          \n
         popl    %ecx                                            \n
         leave                                                   \n
         jmp     *%eax"
         END_ASM_FUNC()
);


Now, onto the problem that exposed the above problem...  The exception 
handling code in classMethod.c:loadClass() doesn't appear to do the 
right thing, if a user ClassLoader throws a ClassNotFoundException, it 
will just pass this up to the caller.  Shouldn't this be converting the 
ClassNotFound to a NoClassDefFoundError and marking the errorInfo.type 
with KERR_NO_CLASS_FOUND?  Otherwise, the verifier will fail too quickly 
and the jitter will throw a ClassNotFoundException, which is neither a 
RuntimeException or Error and shouldn't be thrown willy nilly.

thanks,

tim stack