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

📄 opt_macro.c

📁 一个内存数据库的源代码这是服务器端还有客户端
💻 C
字号:
#line 131 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_macro.mx"#include "mal_config.h"#include "opt_prelude.h"#include "opt_macro.h"#include "mal_interpreter.h"#line 140 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_macro.mx"static intmalMatch(InstrPtr p1, InstrPtr p2){	int i, j;	if (getFunctionId(p1) == 0 && getFunctionId(p2) != 0)		return 0;	if (getModuleId(p1) == 0 && getModuleId(p2) != 0)		return 0;	if (getModuleId(p1) != getModuleId(p2))		return 0;	if (getFunctionId(p2) == 0)		return 0;	if (getFunctionId(p1) != getFunctionId(p2))		return 0;	if (p1->retc != p2->retc)		return 0;	if (p1->argc != p2->argc)		return 0;	if (p1->barrier != p2->barrier)		return 0;	for (i = 0; i < p1->argc; i++)		for (j = i + 1; j < p1->argc; j++)			if ((getArg(p1, i) == getArg(p1, j) && getArg(p2, i) != getArg(p2, j)) || (getArg(p1, i) != getArg(p1, j) && getArg(p2, i) == getArg(p2, j)))				return 0;	return 1;}#line 178 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_macro.mx"static intmalFcnMatch(MalBlkPtr mc, MalBlkPtr mb, int pc){	int i, j, k, lim;	int *cvar, *mvar;	int ctop = 0, mtop = 0;	InstrPtr p, q;	if (mb->stop - pc < mc->stop - 2)		return 0;	cvar = (int *) alloca(mc->vtop * MAXARG);	mvar = (int *) alloca(mb->vtop * MAXARG);	/* also trim the return statement */	lim = pc + mc->stop - 3;	k = 1;	for (i = pc; i < lim; i++, k++) {		p = getInstrPtr(mb, i);		q = getInstrPtr(mc, k);		if (malMatch(p, q) == 0)			return 0;		for (j = 0; j < p->argc; j++)			cvar[ctop++] = getArg(p, j);		for (j = 0; j < p->argc; j++)			mvar[mtop++] = getArg(q, j);	}	assert(mtop == ctop);	/*shouldn;t happen */#ifdef DEBUG_OPT_MACRO	for (i = 0; i < ctop; i++)		printf("match %d %d\n", cvar[i], mvar[i]);#endif	for (i = 0; i < ctop; i++)		for (j = i + 1; j < ctop; j++)			if ((cvar[i] == cvar[j] && mvar[i] != mvar[j]) ||(mvar[i] == mvar[j] && cvar[i] != cvar[j]))				return 0;	return 1;}#line 224 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_macro.mx"#define MAXEXPANSION 256intinlineMALblock(MalBlkPtr mb, int pc, MalBlkPtr mc){	int i, k, l, n;	InstrPtr *ns, p,q;	int *nv;#ifdef DEBUG_OPT_MACRO	printf("inlineMALblock\n");	printFunction(GDKout,mb,LIST_MAL_ALL);	printFunction(GDKout,mc,LIST_MAL_ALL);#endif	ns = GDKmalloc((l = (mb->ssize + mc->ssize - 3)) * sizeof(InstrPtr));	nv = alloca(mc->vtop * sizeof(int));	p = getInstrPtr(mb, pc);	q = getInstrPtr(mc, 0);	k = 0;	/* add variables to target */	for (n = 0; n < mc->vtop; n++) {		if (mc->var[n]->isaconstant ){			nv[n] = cpyConstant(mb,getVar(mc,n));		} else			nv[n] = newTmpVariable(mb, getVarType(mc, n));		k++;	}	/* keep track of the actual arguments */	for (n = 0; n < p->argc; n++)		nv[getArg(q,n)] = getArg(p, n);	k = 0;	/* copy the stable part */	for (i = 0; i < pc; i++)		ns[k++] = mb->stmt[i];	/* copying stops at the first return statement */	for (i = 1; i < mc->stop - 1; i++) {		p = mc->stmt[i];		/* copy the instruction and fix variable references */		ns[k] = copyInstruction(p);		for (n = 0; n < p->argc; n++) 			getArg(ns[k], n) = nv[getArg(p, n)];		if (p->barrier == RETURNsymbol || p->barrier == YIELDsymbol) {			ns[k]->barrier = 0;			if (p->token == RETURNsymbol || p->token == YIELDsymbol)				ns[k]->token = ASSIGNsymbol;			/* fix returns that do not evaluate an expression */			if( p->retc == p->argc){				for (n =0; n < p->retc; n++) {					pushArgument(mb,ns[k], nv[getArg(p,n)]);					getArg(ns[k],n)= getArg(getInstrPtr(mb,pc),n);				}			} 			k++;			break;		}		k++;	}	/* copy the stable part */	for (i = pc + 1; i < mb->stop; i++)		ns[k++] = mb->stmt[i];	GDKfree(mb->stmt);	mb->stmt = ns;	mb->ssize = l;	mb->stop = k;	return pc;}#line 306 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_macro.mx"static strMACROvalidate(MalBlkPtr mb){	int retseen = 0;	int i;	InstrPtr p = 0;	if (getArgType(mb, getInstrPtr(mb, 0), 0) == TYPE_void)		return MAL_SUCCEED;	for (i = 1; retseen == 0 && i < mb->stop; i++) {		p = getInstrPtr(mb, i);		retseen = p->token == RETURNsymbol || p->token == YIELDsymbol || p->barrier == RETURNsymbol || p->barrier == YIELDsymbol;	}	if (retseen && i != mb->stop - 1)		throw(MAL, "optimizer.MACROvalidate", "RETURN statement is not the last one");	return MAL_SUCCEED;}strMACROprocessor(MalBlkPtr mb, Symbol t){	InstrPtr q;	int i, cnt = 0, last = -1;	str msg = MAL_SUCCEED;#ifdef DEBUG_OPT_MACRO	printf("calling the MACRO processor\n");#endif	if (t == NULL)		return msg;	msg = MACROvalidate(t->def);	if (msg)		return msg;	for (i = 0; i < mb->stop; i++) {		q = getInstrPtr(mb, i);		if (getFunctionId(q) && idcmp(getFunctionId(q), t->name) == 0 && 			getSignature(t)->token == FUNCTIONsymbol) {#ifdef DEBUG_OPT_MACRO			printf("Hit, replace macro call %s\n", t->name);#endif			if (i == last)				throw(MAL, "optimizer.MACROoptimizer", "duplicate macro expansion");			last = i;			i = inlineMALblock(mb, i, t->def);			cnt++;			if (cnt > MAXEXPANSION)				throw(MAL, "optimizer.MACROoptimizer", "too many macro expansions");		}	}	return msg;}#line 371 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_macro.mx"static intreplaceMALblock(MalBlkPtr mb, int pc, MalBlkPtr mc){	int i, j, k, lim;	InstrPtr p, q, rq;	int *cvar, *mvar;	int ctop = 0, mtop = 0;	/* collect variable map */	cvar = (int *) alloca(mc->vtop * MAXARG);	mvar = (int *) alloca(mb->vtop * MAXARG);	lim = pc + mc->stop - 2;	k = 1;	for (i = pc; i < lim; i++, k++) {		p = getInstrPtr(mb, i);		q = getInstrPtr(mc, k);		for (j = 0; j < p->argc; j++)			cvar[ctop++] = getArg(q, j);		for (j = 0; j < p->argc; j++)			mvar[mtop++] = getArg(p, j);	}	assert(mtop == ctop);	/*shouldn;t happen */#ifdef DEBUG_OPT_MACRO	for (i = 0; i < ctop; i++)		printf("match %d %d\n", cvar[i], mvar[i]);#endif	p = getInstrPtr(mb, pc);	q = copyInstruction(getInstrPtr(mc, 0));	/* the signature */	q->token = ASSIGNsymbol;	mb->stmt[pc] = q;	for (i = q->retc; i < q->argc; i++)		for (j = 0; j < ctop; j++)			if (q->argv[i] == cvar[j]) {				q->argv[i] = mvar[j];				break;			}	rq = getInstrPtr(mc, mc->stop - 2);	for (i = 0; i < rq->retc; i++)		for (j = 0; j < ctop; j++)			if (rq->argv[i] == cvar[j]) {				q->argv[i] = mvar[j];				break;			}	freeInstruction(p);	/* strip signature, return, and end statements */	k = mc->stop - 3;	j = pc + k;	for (i = pc + 1; i < pc + k; i++)		freeInstruction(mb->stmt[i]);	for (i = pc + 1; i < mb->stop - k; i++)		mb->stmt[i] = mb->stmt[j++];	k = i;	for (; i < mb->stop; i++)		mb->stmt[i] = 0;	mb->stop = k;	return pc;}static strORCAMprocessor(MalBlkPtr mb, Symbol t){	MalBlkPtr mc = t->def;	int i;	str msg = MAL_SUCCEED;	if (t == NULL || mc->stop < 3)		return msg;#ifdef DEBUG_OPT_MACRO	printf("calling the ORCAM processor for %s\n", t->name);#endif	/* strip signature, return, and end statements */	for (i = 1; i < mb->stop - mc->stop + 3; i++)		if (malFcnMatch(mc, mb, i)) {#ifdef DEBUG_OPT_MACRO			printf("found match for %s at %d \n", t->name, i);#endif			msg = MACROvalidate(mc);			if (msg == MAL_SUCCEED)				replaceMALblock(mb, i, mc);			else				break;		}	chkProgram(MCgetClient()->nspace, mb);	return msg;}#line 470 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_macro.mx"#line 513 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_macro.mx"#line 471 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_macro.mx"static intOPTmacroImplementation(MalBlkPtr mb, MalStkPtr stk, InstrPtr p){	MalBlkPtr target= mb;	Module s;	Symbol t;	str mod,fcn;	int j;	(void) p;	(void) stk;	if( p->argc == 3){		mod= getArgDefault(mb,p,1);		fcn= getArgDefault(mb,p,2);	} else {		mod= getArgDefault(mb,p,1);		fcn= getArgDefault(mb,p,2);		s = findModule(MCgetClient()->nspace, putName(mod, strlen(mod)));		if (s == 0)			return 0;		t= findSymbolInModule(s, fcn);		if( t == 0)			return 0;		target= t->def;		mod= getArgDefault(mb,p,3);		fcn= getArgDefault(mb,p,4);	}	s = findModule(MCgetClient()->nspace, putName(mod, strlen(mod)));	if (s == 0)		return 0;	if (s->subscope) {		j = getSubScope(fcn);		for (t = s->subscope[j]; t != NULL; t = t->peer)			if (t->def->errors == 0) {				if (getSignature(t)->token == FUNCTIONsymbol)					MACROprocessor(target, t);			}	}	return 1;}#line 513 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_macro.mx"#line 471 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_macro.mx"static intOPTorcamImplementation(MalBlkPtr mb, MalStkPtr stk, InstrPtr p){	MalBlkPtr target= mb;	Module s;	Symbol t;	str mod,fcn;	int j;	(void) p;	(void) stk;	if( p->argc == 3){		mod= getArgDefault(mb,p,1);		fcn= getArgDefault(mb,p,2);	} else {		mod= getArgDefault(mb,p,1);		fcn= getArgDefault(mb,p,2);		s = findModule(MCgetClient()->nspace, putName(mod, strlen(mod)));		if (s == 0)			return 0;		t= findSymbolInModule(s, fcn);		if( t == 0)			return 0;		target= t->def;		mod= getArgDefault(mb,p,3);		fcn= getArgDefault(mb,p,4);	}	s = findModule(MCgetClient()->nspace, putName(mod, strlen(mod)));	if (s == 0)		return 0;	if (s->subscope) {		j = getSubScope(fcn);		for (t = s->subscope[j]; t != NULL; t = t->peer)			if (t->def->errors == 0) {				if (getSignature(t)->token == FUNCTIONsymbol)					ORCAMprocessor(target, t);			}	}	return 1;}#line 514 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_macro.mx"#line 568 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_macro.mx"#line 533 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_macro.mx"str OPTmacro(MalBlkPtr mb, MalStkPtr stk, InstrPtr p){	Module s;	Symbol t;	str msg,mod,fcn;	lng clk= GDKusec();	int actions = 0;	optimizerInit();	if( p->argc == 3){		mod= getArgDefault(mb,p,1);		fcn= getArgDefault(mb,p,2);	} else {		mod= getArgDefault(mb,p,3);		fcn= getArgDefault(mb,p,4);	}	s = findModule(MCgetClient()->nspace, putName(mod, strlen(mod)));	if (s == 0)		return 0;	t= findSymbolInModule(s, fcn);	if( t == 0)		return 0;	msg = MACROvalidate(t->def);	if( msg) 		return msg;	if( mb->errors == 0)		actions= OPTmacroImplementation(mb,stk,p);	if( p )		removeInstruction(mb, p);    optimizerCheck(mb, "optimizer.macro", actions, GDKusec() - clk, OPT_CHECK_ALL);	return MAL_SUCCEED;}#line 568 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_macro.mx"#line 572 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_macro.mx"#line 533 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_macro.mx"str OPTorcam(MalBlkPtr mb, MalStkPtr stk, InstrPtr p){	Module s;	Symbol t;	str msg,mod,fcn;	lng clk= GDKusec();	int actions = 0;	optimizerInit();	if( p->argc == 3){		mod= getArgDefault(mb,p,1);		fcn= getArgDefault(mb,p,2);	} else {		mod= getArgDefault(mb,p,3);		fcn= getArgDefault(mb,p,4);	}	s = findModule(MCgetClient()->nspace, putName(mod, strlen(mod)));	if (s == 0)		return 0;	t= findSymbolInModule(s, fcn);	if( t == 0)		return 0;	msg = MACROvalidate(t->def);	if( msg) 		return msg;	if( mb->errors == 0)		actions= OPTorcamImplementation(mb,stk,p);	if( p )		removeInstruction(mb, p);    optimizerCheck(mb, "optimizer.orcam", actions, GDKusec() - clk, OPT_CHECK_ALL);	return MAL_SUCCEED;}#line 572 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_macro.mx"#line 575 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_macro.mx"

⌨️ 快捷键说明

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