⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 slots.c

📁 linux下建立JAVA虚拟机的源码KAFFE
💻 C
字号:
/* slots.c * Slots. * * Copyright (c) 1996, 1997 *	Transvirtual Technologies, Inc.  All rights reserved. * * See the file "license.terms" for information on usage and redistribution  * of this file.  */#include "config.h"#include "config-std.h"#include "gtypes.h"#include "slots.h"#include "seq.h"#include "md.h"#include "registers.h"#include "gc.h"#include "machine.h"#include "debug.h"/** * number of elements in basicslots. */int maxslot;/** * array containing all slots of the method being translated. */SlotInfo* basicslots;/** * same as basicslots ??? */SlotInfo* slotinfo;/** * array of locals of the method being translated. * * the first localsz entries correspond to the local variables as per vm spec, * the last stacksz entries correspond to the entries of the operand stack * * The bottom of the operand stack is the last entry of this array and it * grows downwards (towards smaller indices). */SlotInfo* localinfo;/** * array of temp slots being used by the generated native code. */SlotInfo* tempinfo;/** * the slot that contains the stack limit. * * only used when STACK_LIMIT is #defined by the backend.  */SlotInfo stack_limit[1];static SlotData* basicdatas;static int lastnrslots = 0;#if defined(STACK_LIMIT)static SlotData stack_limit_data;#endif/** * Initializes the slots for the jitted method. * * @param islots number of slots that are needed. */voidinitSlots(int islots){	int i;	int nrslots = islots;	/* Allocate extra slots for temps */	nrslots += MAXTEMPS;	/* Make sure we have enough slots space */	if (nrslots > lastnrslots) {		basicslots = gc_realloc(basicslots,					nrslots * sizeof(SlotInfo),					KGC_ALLOC_JIT_SLOTS);		basicdatas = gc_realloc(basicdatas,					nrslots * sizeof(SlotData),					KGC_ALLOC_JIT_SLOTS);		lastnrslots = nrslots;	}	/* Set 'maxslot' to the maximum slot usable (excluding returns) */	maxslot = nrslots;	/* Setup various slot pointers */	slotinfo = &basicslots[0];	localinfo = &slotinfo[0];	tempinfo = &localinfo[islots];        /* Setup all slots */        for (i = 0; i < nrslots; i++) {		basicslots[i].slot = &basicdatas[i];		basicdatas[i].regno = NOREG;		basicdatas[i].modified = 0;		basicdatas[i].rnext = NULL;		basicdatas[i].rseq = NULL;		basicdatas[i].wseq = NULL;		basicdatas[i].offset = SLOT2FRAMEOFFSET(&basicslots[i]);		basicdatas[i].global = GL_NOGLOBAL;        }#if defined(STACK_LIMIT)	/* And setup the stack offset */	stack_limit->slot = &stack_limit_data;	stack_limit_data.regno = NOREG;	stack_limit_data.modified = 0;	stack_limit_data.rnext = NULL;	stack_limit_data.rseq = NULL;	stack_limit_data.wseq = NULL;	stack_limit_data.offset = SLOT2FRAMEOFFSET(stack_limit);	stack_limit_data.global = GL_NOGLOBAL;#endif}/** * Setup for the beginning of a basic block. * * Sets the rseq and wseq fields of all slots to 0. */voidsetupSlotsForBasicBlock(void){	int i;	SlotData* sdata;	for (i = 0; i < maxslot; i++) {		sdata = slotinfo[i].slot;		sdata->rseq = NULL;		sdata->wseq = NULL;	}#if defined(STACK_LIMIT)	sdata = stack_limit->slot;	sdata->rseq = NULL;	sdata->wseq = NULL;#endif}/** * Record that a few slots are not used any longer.  * * @param data array of slots that are not used further in the basic block. * @param nr   number of slots in data */voidlastuse_slot(SlotInfo* data, int nr){	SlotData* sdata;	for (; nr > 0; nr--, data++) {		sdata = data->slot;		if (sdata->rseq != NULL && !isGlobal(sdata)) {			sdata->rseq->lastuse |= 1 << sdata->rseqslot;		}		sdata->wseq = NULL;		sdata->rseq = NULL;	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -