From de0d96c0ebc0b8bb89af9f7b7159f87748168f95 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Tue, 8 Jul 2008 17:16:51 -0700 Subject: [PATCH] Builds against latest nanojit; merged VMSideExitInfo into SideExit --- js/src/jstracer.cpp | 78 ++++++++++++++++++++++++++++++++++++++---------- js/src/jstracer.h | 4 --- js/src/nanojit/Tests.cpp | 4 +-- js/src/nanojit/avmplus.h | 51 +++++++++++++++++++++++++++++-- 4 files changed, 112 insertions(+), 25 deletions(-) diff --git a/js/src/jstracer.cpp b/js/src/jstracer.cpp index 70bed10f20..428612b31f 100644 --- a/js/src/jstracer.cpp +++ b/js/src/jstracer.cpp @@ -407,8 +407,7 @@ public: } virtual LInsp insGuard(LOpcode v, LIns *c, SideExit *x) { - VMSideExitInfo* i = (VMSideExitInfo*)x->vmprivate; - buildExitMap(recorder.getEntryFrame(), recorder.getFp(), i->typeMap); + buildExitMap(recorder.getFp(), recorder.getFp(), x->typeMap); return out->insGuard(v, c, x); } @@ -480,12 +479,12 @@ TraceRecorder::TraceRecorder(JSContext* cx, Fragmento* fragmento, Fragment* _fra fragmentInfo = (VMFragmentInfo*)fragment->vmprivate; } fragment->vmprivate = fragmentInfo; - fragment->param0 = lir->insImm8(LIR_param, Assembler::argRegs[0], 0); + fragment->state = lir->insImm8(LIR_param, Assembler::argRegs[0], 0); fragment->param1 = lir->insImm8(LIR_param, Assembler::argRegs[1], 0); - fragment->sp = lir->insLoadi(fragment->param0, offsetof(InterpState, sp)); - cx_ins = lir->insLoadi(fragment->param0, offsetof(InterpState, cx)); + fragment->sp = lir->insLoadi(fragment->state, offsetof(InterpState, sp)); + cx_ins = lir->insLoadi(fragment->state, offsetof(InterpState, cx)); #ifdef DEBUG - lirbuf->names->addName(fragment->param0, "state"); + lirbuf->names->addName(fragment->state, "state"); lirbuf->names->addName(fragment->sp, "sp"); lirbuf->names->addName(cx_ins, "cx"); #endif @@ -811,17 +810,15 @@ TraceRecorder::snapshot() unsigned slots = nativeFrameSlots(cx->fp, *cx->fp->regs); trackNativeFrameUse(slots); /* reserve space for the type map, ExitFilter will write it out for us */ - LIns* data = lir_buf_writer->skip(sizeof(VMSideExitInfo) + slots * sizeof(char)); - VMSideExitInfo* si = (VMSideExitInfo*)data->payload(); + LIns* data = lir_buf_writer->skip(slots * sizeof(uint8)); /* setup side exit structure */ memset(&exit, 0, sizeof(exit)); -#ifdef DEBUG exit.from = fragment; -#endif exit.calldepth = getCallDepth(); exit.sp_adj = (cx->fp->regs->sp - entryRegs.sp) * sizeof(double); exit.ip_adj = cx->fp->regs->pc - entryRegs.pc; - exit.vmprivate = si; + exit.typeMap = (uint8 *)data->payload(); + exit.numMapEntries = slots; return &exit; } @@ -926,7 +923,7 @@ TraceRecorder::closeLoop(Fragmento* fragmento) #endif return; } - fragment->lastIns = lir->ins0(LIR_loop); + fragment->lastIns = lir->insGuard(LIR_loop, lir->insImm(1), snapshot()); compile(fragmento->assm(), fragment); } @@ -946,6 +943,59 @@ TraceRecorder::stop() fragment->blacklist(); } +int +nanojit::StackFilter::getTop(LInsp guard) +{ + return guard->exit()->sp_adj; +} + +#if defined NJ_VERBOSE +void +nanojit::LirNameMap::formatGuard(LIns *i, char *out) +{ + uint32_t ip; + SideExit *x; + + x = (SideExit *)i->exit(); + ip = intptr_t(x->from->ip) + x->ip_adj; + sprintf(out, + "%s: %s %s -> %s sp%+d", + formatRef(i), + lirNames[i->opcode()], + i->oprnd1()->isCond() ? formatRef(i->oprnd1()) : "", + labels->format((void *)ip), + x->sp_adj + ); +} +#endif + +void +nanojit::Assembler::initGuardRecord(LIns *guard, GuardRecord *rec) +{ + SideExit *exit; + + exit = guard->exit(); + rec->calldepth = exit->calldepth; + rec->exit = exit; + verbose_only(rec->sid = exit->sid); +} + +void +nanojit::Assembler::asm_bailout(LIns *guard, Register state) +{ + SideExit *exit; + + exit = guard->exit(); + +#if defined NANOJIT_IA32 + if (exit->sp_adj) + ADDmi((int32_t)offsetof(InterpState, sp), state, exit->sp_adj); + + if (exit->ip_adj) + ADDmi((int32_t)offsetof(InterpState, ip), state, exit->ip_adj); +#endif +} + void js_DeleteRecorder(JSContext* cx) { @@ -1012,8 +1062,6 @@ js_LoopEdge(JSContext* cx) InterpState state; state.ip = cx->fp->regs->pc; state.sp = (void*)entry_sp; - state.rp = NULL; - state.f = NULL; state.cx = cx; union { NIns *code; GuardRecord* (FASTCALL *func)(InterpState*, Fragment*); } u; u.code = f->code(); @@ -1028,7 +1076,7 @@ js_LoopEdge(JSContext* cx) #endif cx->fp->regs->sp += (((double*)state.sp - entry_sp)); cx->fp->regs->pc = (jsbytecode*)state.ip; - box(cx, cx->fp, cx->fp, ((VMSideExitInfo*)lr->vmprivate)->typeMap, native); + box(cx, cx->fp, cx->fp, lr->exit->typeMap, native); #ifdef DEBUG JS_ASSERT(*(uint64*)&native[fi->maxNativeFrameSlots] == 0xdeadbeefdeadbeefLL); #endif diff --git a/js/src/jstracer.h b/js/src/jstracer.h index 1dc7a57123..1de0f08ac0 100644 --- a/js/src/jstracer.h +++ b/js/src/jstracer.h @@ -94,10 +94,6 @@ struct VMFragmentInfo { uint8 typeMap[0]; }; -struct VMSideExitInfo { - uint8 typeMap[0]; -}; - #define TYPEMAP_GET_TYPE(x) ((x) & JSVAL_TAGMASK) #define TYPEMAP_SET_TYPE(x, t) (x = (x & 0xf0) | t) #define TYPEMAP_GET_FLAG(x, flag) ((x) & flag) diff --git a/js/src/nanojit/Tests.cpp b/js/src/nanojit/Tests.cpp index 8c1b91c408..578d9184df 100644 --- a/js/src/nanojit/Tests.cpp +++ b/js/src/nanojit/Tests.cpp @@ -353,8 +353,6 @@ do_test(Test* test) state.ip = NULL; state.sp = NULL; - state.rp = NULL; - state.f = NULL; /* Begin a dummy trace */ frago->labels = new (gc) LabelMap(core, NULL); @@ -364,7 +362,7 @@ do_test(Test* test) frag->lirbuf = lirbuf; lirout = new LirBufWriter(lirbuf); lirout->ins0(LIR_trace); - frag->param0 = lirout->insImm8(LIR_param, Assembler::argRegs[0], 0); + frag->state = lirout->insImm8(LIR_param, Assembler::argRegs[0], 0); frag->param1 = lirout->insImm8(LIR_param, Assembler::argRegs[1], 0); test->Compile(lirout); memset(&exit, 0, sizeof(exit)); diff --git a/js/src/nanojit/avmplus.h b/js/src/nanojit/avmplus.h index cb253bd500..b5e75a92fa 100644 --- a/js/src/nanojit/avmplus.h +++ b/js/src/nanojit/avmplus.h @@ -107,6 +107,53 @@ static __inline__ unsigned long long rdtsc(void) #endif +struct JSContext; + +namespace nanojit +{ + class Fragment; + + struct SideExit + { + intptr_t sp_adj; + intptr_t ip_adj; + Fragment *target; + Fragment *from; + int32_t calldepth; + uint8 *typeMap; + uint32 numMapEntries; +#if defined NJ_VERBOSE + uint32_t sid; +#endif + }; + + class LIns; + + struct GuardRecord + { + Fragment *target; + Fragment *from; + void *jmp; + void *origTarget; + SideExit *exit; + GuardRecord *outgoing; + GuardRecord *next; + LIns *guard; + int32_t calldepth; +#if defined NJ_VERBOSE + uint32_t compileNbr; + uint32_t sid; +#endif + }; + + #define GuardRecordSize(g) sizeof(GuardRecord) + + inline size_t SideExitSize(const SideExit *e) + { + return sizeof(SideExit) + (sizeof(uint8) * e->numMapEntries); + } +} + class GCObject { }; @@ -184,9 +231,7 @@ namespace avmplus { void* ip; void* sp; - void* rp; - void* f; - void* cx; + JSContext *cx; }; class String -- 2.11.4.GIT