Exemple #1
0
Tr_exp Tr_breakExp(){
	//Get done label from the list, which should have been prepared before this function is called.
	Temp_label f = LL_peek();
	T_stm st = 
		T_Jump(
			T_Name(f), 
			Temp_LabelList(f, NULL)
		);

	return Tr_Nx(st);
}
Exemple #2
0
Tr_exp Tr_forExp(Tr_exp var, Tr_exp low, Tr_exp high, Tr_exp body){
debug("Tr_forExp");

	T_stm st;
	T_exp v = unEx(var);
	Temp_label t = Temp_newlabel();
	Temp_label f = LL_peek();//Get done label from the list, which should have been prepared before this function is called.
	Temp_label start = Temp_newlabel();

	T_stm cond = T_Cjump(T_le, v, unEx(high), t, f);

	/*
		T_Move   var <- low
		T_Label  start
		T_CJump	 var <= high, t, f
		T_Label(t)
		body
		T_Move   var + 1
		T_Jump	 start
		T_Label(f)
	*/
	st = T_Seq(T_Move(v, unEx(low)),
			T_Seq(T_Label(start),
				T_Seq(cond,
					T_Seq(T_Label(t),
						T_Seq(unNx(body),
							T_Seq(T_Move(v, T_Binop(T_plus, v, T_Const(1))),
								T_Seq(
									T_Jump(
										T_Name(start), 
										Temp_LabelList(start, NULL)
									),
									T_Label(f)
								)
							)
						)
					)
				)
			)
		);

	//Pop the label as it's no longer used
	LL_pop();

	return Tr_Nx(st);
}
Exemple #3
0
Tr_exp Tr_whileExp(Tr_exp cond, Tr_exp body){
debug("Tr_whileExp");

	T_stm st;
	struct Cx cx_cond = unCx(cond);

	Temp_label t = Temp_newlabel();
	Temp_label f = LL_peek();//Get done label from the list, which should have been prepared before this function is called.
	Temp_label start = Temp_newlabel();

	doPatch(cx_cond.trues, t);
	doPatch(cx_cond.falses, f);

	/*
		T_Label  start
		cx_cond.stm (true->t, false->f)
		T_Label(t)
		body
		T_Jump	 start
		T_Label(f)
	*/
	st = T_Seq(T_Label(start),
			T_Seq(cx_cond.stm,
				T_Seq(T_Label(t),
					T_Seq(unNx(body),
						T_Seq(
							T_Jump(
								T_Name(start), 
								Temp_LabelList(start, NULL)
							),
							T_Label(f)
						)
					)
				)
			)
		);
	
	//Pop the label as it's no longer used
	LL_pop();

	return Tr_Nx(st);
}
Exemple #4
0
void print_frag(F_fragList fl, FILE * out) {
	if (!fl) {
		puts("fragList is NULL");
		return;
	}
	while (fl) {
		F_frag f = fl->head;
		switch(f->kind) {
		case F_stringFrag:
			print(Tr_Ex(T_Name(f->u.string.label)), out);
			fprintf(out, "\n");
			break;
		case F_procFrag:
			print(Tr_Nx(f->u.proc.body), out);
			break;
		default: assert(0 && "frag-kind is error");
		}
		fl = fl->tail;
	}
}
Exemple #5
0
Tr_exp Tr_callExp(Tr_level caller_lvl, Tr_level callee_lvl, Temp_label fun_label, Tr_exp* argv, int args){

int z = 0;
int cnt = 0;
debug("caller = %d; callee = %d", caller_lvl->depth, callee_lvl->depth);
	//1) Get the static link for the called function
	T_exp slk;
	if(caller_lvl!=callee_lvl){
debug("  (Tr_callExp: Follow static link %d)", ++cnt);
		//Follow the static link
		slk = F_Exp(F_staticLink(), T_Temp(F_FP()));
		caller_lvl = caller_lvl->parent;
		//TODO check: caller_lvl cannot be null
		while(caller_lvl!=callee_lvl){
debug("  (Tr_callExp: Follow static link %d)", ++cnt);
			slk = F_Exp(F_staticLink(), slk);			
			caller_lvl = caller_lvl->parent;
			//TODO check: caller_lvl cannot be null
		}
	} else {
debug("  (Tr_callExp: Don't follow link)");
		//Just use the current frame pointer
		slk = F_Exp(F_staticLink(), T_Temp(F_FP()));
	}
debug("Static link done");

	//2) Create the argument list, including the static link
	//2.1) Allocate memory
	T_expList listp_head = NULL;
	if(args>0){
/* Problematic on 64-bit machine
		int node_size = sizeof(struct T_expList_)/8;
		T_expList listp = (T_expList)checked_malloc((args+1) * sizeof(struct T_expList_));
		listp_head = listp;

		//2.2) Initialize
		listp->head = slk;
		listp->tail = listp + node_size;
		listp = listp->tail;
		int i = 0;
		while(i < args){
			//Let head point to the next argument
			listp->head = unEx(*argv);

			//Let tail point to next head
			listp->tail = listp + node_size;

			//Move the base pointer over one node
			if(i<args-1){
				listp = listp->tail;
				argv++;
			}
			i++;
		}
		listp->tail = NULL;
*/
		T_expList listp = (T_expList)checked_malloc(sizeof(struct T_expList_));
		listp_head = listp;
		//2.2) Initialize
		listp->head = slk;
		listp->tail = NULL;
		int i = 0;		
		while(i < args){
			//Create new list on the tail
			listp->tail = (T_expList)checked_malloc(sizeof(struct T_expList_));
			listp = listp->tail;

			//Let head point to the next argument
			listp->head = unEx(*argv);

			//Let tail point to next head
			listp->tail = NULL;

			//Get next argument
			argv++;

			i++;
		}
	}
debug("argument list prepared");

	//3) Generate IR
	T_exp exp = T_Call(T_Name(fun_label), listp_head);

/*
int i = 0;
while(listp_head!=NULL){
printf("arg %d\n", i++);listp_head=listp_head->tail;
}
*/

debug("call done");
	return Tr_Ex(exp);
}
Exemple #6
0
Tr_exp Tr_stringExp(string str_val){
	Temp_label tl = Temp_newlabel();
	F_String(tl, str_val);
	return Tr_Ex(T_Name(tl));
}
Exemple #7
0
Tr_exp Tr_ifExp(Tr_exp cond, Tr_exp thenb, Tr_exp elseb){
	T_exp ex;
	T_stm st;
	Tr_exp ret;
	struct Cx cx_cond = unCx(cond);

	Temp_label t = Temp_newlabel();
	Temp_label f = Temp_newlabel();
	Temp_label join = Temp_newlabel();

	doPatch(cx_cond.trues, t);
	doPatch(cx_cond.falses, f);
	
	if(elseb==NULL){
	//case 1: if-then
debug("Tr_ifExp: if-then");
		st = T_Seq(cx_cond.stm,
				T_Seq(T_Label(t),
					T_Seq(unNx(thenb),
						T_Label(f)
					)
				)
			);
		ret = Tr_Nx(st);
	} else {
	//case 2: if-then-else
		if(thenb->kind==Tr_nx && elseb->kind==Tr_nx){
debug("Tr_ifExp: if-then-else (2 nx)");
			//special case: two statements
			st = T_Seq(cx_cond.stm,
					T_Seq(T_Label(t),
						T_Seq(unNx(thenb),
							T_Seq(
								T_Jump(
									T_Name(join), 
									Temp_LabelList(join, NULL)
								),
								T_Seq(T_Label(f),
									T_Seq(unNx(elseb),
										T_Label(join)
									)
								)
							)
						)
					)
				);
			ret = Tr_Nx(st);
//TODO: special case - two cx.
		} else {
debug("Tr_ifExp: if-then-else");
			Temp_temp r = Temp_newtemp();
			ex = T_Eseq(cx_cond.stm,
					T_Eseq(T_Label(t),
						T_Eseq(T_Move(T_Temp(r), unEx(thenb)),
							T_Eseq(
								T_Jump(
									T_Name(join), 
									Temp_LabelList(join, NULL)
								),
								T_Eseq(T_Label(f),
									T_Eseq(T_Move(T_Temp(r), unEx(elseb)),
										T_Eseq(T_Label(join),
											T_Temp(r)
										)
									)
								)
							)
						)
					)
				);
			ret = Tr_Ex(ex);
		}

	}
	
	return ret;
}
Exemple #8
0
T_exp F_externalCall(string str, T_expList args)
{
	return T_Call(T_Name(Temp_namedlabel(str)), args);
}