From 82c80de14da66b80474b298ae99cbff37cdf9b53 Mon Sep 17 00:00:00 2001 From: Udayan Banerji Date: Fri, 29 Mar 2013 13:32:10 -0700 Subject: [PATCH] [x86] Terminate trace if SGET/SPUT have unresolved fields in codegen The interpreter doesn't allow SGET/SPUT bytecodes in a trace till the field is resolved. However, exhaustTrace can pick up bytecodes beyond the trace sent by the interpreter. Terminate the loop formation if this is seen. Signed-off-by: Udayan Banerji (cherry picked from commit 4eb6d969de37f9b82aaa4089490900f620e50f46) Change-Id: If5480640375a5152748e74e00be200d80f313b31 --- vm/compiler/codegen/x86/LowerGetPut.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/vm/compiler/codegen/x86/LowerGetPut.cpp b/vm/compiler/codegen/x86/LowerGetPut.cpp index c87b17403..be519b124 100644 --- a/vm/compiler/codegen/x86/LowerGetPut.cpp +++ b/vm/compiler/codegen/x86/LowerGetPut.cpp @@ -668,7 +668,17 @@ int sget_sput_common(int flag, u2 vA, u2 tmp, bool isObj, bool isVolatile) { void *fieldPtr = (void*) (currentMethod->clazz->pDvmDex->pResFields[tmp]); #endif - assert(fieldPtr != NULL); + + /* Usually, fieldPtr should not be null. The interpreter should resolve + * it before we come here, or not allow this opcode in a trace. However, + * we can be in a loop trace and this opcode might have been picked up + * by exhaustTrace. Sending a -1 here will terminate the loop formation + * and fall back to normal trace, which will not have this opcode. + */ + if (!fieldPtr) { + return -1; + } + move_imm_to_reg(OpndSize_32, (int)fieldPtr, PhysicalReg_EAX, true); if(flag == SGET) { move_mem_to_reg(OpndSize_32, offStaticField_value, PhysicalReg_EAX, true, 7, false); //access field -- 2.11.0