Several bug fixes for the arm32JIT
Andrew Hughes
gnu.andrew at redhat.com
Mon Mar 2 13:24:48 UTC 2015
----- Original Message -----
> Hi,
>
> The following patch fixes several bugs in the arm32jit.
>
> These bugs were found while resolving an issue with eclipse giving SEGVs
> although only one of them is actually responsible for the SEGV in eclipse.
>
> Eclipse now seems to run OK.
>
> I have put the patch at
>
> http://openjdk.linaro.org/arm32jit/eclipse.patch
>
> Below is a summary of these bug fixes.
>
> Ok to push these?
> Ed.
>
> Bug 1:
>
> loc >>= 2;
> offset = dest - loc;
> uoff = offset;
> - if (offset >= -(1<<22) && offset < (1<<22))
> + if (offset >= -(1<<23) && offset < (1<<23))
> return out_32(codebuf, A_BL(cond, uoff));
> }
> J_Unimplemented();
>
> The offset was wrong for ARM BL instruction which has 24 bits offset, not 23.
>
> Bug 2:
>
> ldrb r1, [jpc, lr]
> bic ip, ip, #7
> ldr pc, [ip, r1, lsl #2]
> + .set dispatch_state, 0
> .endm
>
> This fixes a compile time error when compiling with FAST_BYTECODES disabled.
> The error was generate by the VOLATILE_VERSION macro.
>
> .error "VOLATILE_VERSION macro used before non-volatile
> DISPATCH_FINISH."
>
> This was occurring because DISPATCH_BYTECODE was not setting the
> dispatch_state back to 0.
>
> Bug 3:
>
> Opcode if_acmpeq
> POP r2, r3
> ldrsb r1, [jpc, #1]
> + cmp r3, r2
> ldrb r2, [jpc, #2]
> - cmp r3, r2
> beq branch_taken
> DISPATCH 3
>
> (and also in if_acmpne, if_icmplt, if_icmpge, if_icmpgt, if_icmple)
>
> I am slightly surprise this one has remained undetected for so long!
> Essentially it was comparing against the bytecode it had just loaded rather
> that the TOS element which means that whether the branch was taken or not is
> essentially random.
>
> However, this is only in the safepoint version of these bytecode, the non
> safe version was OK, so I guess when it was running to safepoints it just
> didn't encounter these. I only noticed this when I disabled
> NOTICE_SAFEPOINTS for debugging which tells it to always use the 'safe'
> version which actually turns out to be not very safe.
>
> Bug 4:
>
> ldr tmp1, [r2, #4] @ rcvr->klass()
> - tst r3, #flag_methodInterface
> + tst r3, #flag_is_forced_virtual
> bne .invokeinterface_methodInterface
>
> and the corresponding definition of flag_is_forced_virtual in asm_helper.cpp.
>
> This is the bug that was causing the SEGV in eclipse.
>
> This bug was caused by the renaming of the flag from flag_methodInterface
> (bit 24) to flag_is_forced_virtual (bit 25) which meant that it was trying
> to do an invokeinterface lookup on a vfinal method and getting a SEGV.
>
> The change was introduced to bytecodeInterpreter.cpp in change
> 4066:1d7922586cf6.
>
> changeset: 4066:1d7922586cf6
> parent: 4041:aba91a731143
> user: twisti
> date: Tue Jul 24 10:51:00 2012 -0700
> summary: 7023639: JSR 292 method handle invocation needs a fast path for
> compiled code
>
> However, this change was not reflected in cppInterpreter_arm.S.
>
> Bug 5:
>
> +#ifdef FAST_BYTECODES
> // Common code for fast_aldc and fast_aldc_w
> # r0 = constpool cache entry
> .macro aldc opc, seq_len
> @@ -3060,7 +3063,6 @@
> add r0, constpool, r1, lsl #4
> aldc opc_fast_aldc_w, 3
>
> -#ifdef FAST_BYTECODES
> # r2 = [jpc, #1]
> # r1 = [jpc, #2]
>
> Another build failure with FAST_BYTECODES disabled
>
> Bug 6:
>
> + // Ensure that any literals generated in the stubs are output here
> + // as this code is copied to the bottom of the code buffer
> + .ltorg
> +
> .global Thumb2_stubs_end
> .type Thumb2_stubs_end, %function
> Thumb2_stubs_end:
>
> This bug occurred with the volatile version of get_static. Basically, when
> build for ARMv6 this need to call _kernel_dmb because there is no DMB
> instruction. The code to call _kernel_dmb did
>
> ldr r2, =_kernel_dmb
> blx r2
>
> This creates an assembler literal which the assembler will dump at the next
> .ltorg (or at the end of the file if no .ltorg).
>
> However, because the run time stubs are copied to the bottom of the code
> buffer in order to make them reachable from the compiled code, the literal
> was not being copied because the literals were only being dumped after the
> end of the stubs.
>
> The solution is simply to dump the literal pool before the end of the stubs
> so the literals get copied as well.
>
>
>
Ok by me, unless Andrew Haley or Andrew Dinn have any objections.
Thanks,
--
Andrew :)
Free Java Software Engineer
Red Hat, Inc. (http://www.redhat.com)
PGP Key: ed25519/35964222 (hkp://keys.gnupg.net)
Fingerprint = 5132 579D D154 0ED2 3E04 C5A0 CFDA 0F9B 3596 4222
PGP Key: rsa4096/248BDC07 (hkp://keys.gnupg.net)
Fingerprint = EC5A 1F5E C0AD 1D15 8F1F 8F91 3B96 A578 248B DC07
More information about the distro-pkg-dev
mailing list