/* Allocate a new MCode area. */ static void mcode_allocarea(jit_State *J) { MCode *oldarea = J->mcarea; size_t sz = (size_t)J->param[JIT_P_sizemcode] << 10; sz = (sz + LJ_PAGESIZE-1) & ~(size_t)(LJ_PAGESIZE - 1); J->mcarea = (MCode *)mcode_alloc(J, sz); J->szmcarea = sz; J->mcprot = MCPROT_GEN; J->mctop = (MCode *)((char *)J->mcarea + J->szmcarea); J->mcbot = (MCode *)((char *)J->mcarea + sizeof(MCLink)); ((MCLink *)J->mcarea)->next = oldarea; ((MCLink *)J->mcarea)->size = sz; J->szallmcarea += sz; }
/* Link generated code. Return mcode address, size and status. */ int luaJIT_link(jit_State *J, void **mcodep, size_t *szp) { size_t sz; void *mcode; /* Pass 2: link sections. */ if ((J->dasmstatus = dasm_link(Dst, &sz))) return JIT_S_DASM_ERROR; /* Check for hardcoded limit on mcode size. */ if (sz > LUAJIT_LIM_MCODE) return JIT_S_TOOLARGE; /* TODO: mark mcode readonly when we're done. */ mcode = mcode_alloc(J, sz); /* Pass 3: encode sections. */ if ((J->dasmstatus = dasm_encode(Dst, mcode))) { mcode_free(J->L, J, mcode, sz); return JIT_S_DASM_ERROR; } *mcodep = mcode; *szp = sz; return JIT_S_OK; }