예제 #1
0
T_exp T_Cjump(T_binOp		op,
				T_exp		left,
				T_exp		right,
				Temp_label	jumpToHereIfTrue,
				Temp_label	jumpToHereIfFalse)
{
	T_exp p = (T_exp) checked_malloc(sizeof *p);
 
	p->kind=T_CJUMP;
 
	p->PrintMyNodeSerialNumber = serial_node_number++;

	sprintf(
		p->PrintTheKindOfTreeIAm,
		"CJUMP\n op = %s\n if (left op right) goto %s;\n else goto %s;",
		binopConvertEnumToString[op],
		Temp_labelstring(jumpToHereIfTrue),
		Temp_labelstring(jumpToHereIfFalse));

	p->u.CJUMP.op=op;
	p->u.CJUMP.left=left;
	p->u.CJUMP.right=right;
	p->u.CJUMP.jumpToHereIfTrue=jumpToHereIfTrue;
	p->u.CJUMP.jumpToHereIfFalse=jumpToHereIfFalse;
	
	return p;
}
예제 #2
0
파일: translate.c 프로젝트: JackWyj/Tiger
static void display_l(Tr_level l) {
	static int lnum;
	if (l->parent) {
		printf("parent: %s\n", Temp_labelstring(l->parent->name));
	} else {
		printf("parent: root\n");
	}
	printf("addr: %s\n", Temp_labelstring(l->name));
	display_f(l->frame);
}
예제 #3
0
/* print the assembly language instructions to filename.s */
static void doProc(FILE *out, F_frame frame, T_stm body)
{
    T_stmList stmList;
    AS_instrList iList;

    stmList = C_linearize(body);
    stmList = C_traceSchedule(C_basicBlocks(stmList));
//    printStmList(stdout, stmList);
    print_graph_Stm_List(out, stmList);

    iList  = F_codegen(frame, stmList);

    fprintf(stdout, "BEGIN %s\n", Temp_labelstring(frame->name));
    AS_printInstrList (stdout, iList, Temp_layerMap(f_map,Temp_name()));
    fprintf(stdout, "END %s\n\n", Temp_labelstring(frame->name));
}
예제 #4
0
파일: parse.c 프로젝트: JackWyj/Tiger
static void doProc(FILE *out, F_frame frame, T_stm body)
{
	//printStm(body);
	AS_proc proc;
	T_stmList stmList;
	AS_instrList iList;
	stmList = C_linearize(body);
	stmList = C_traceSchedule(C_basicBlocks(stmList));
	//printStmList(stdout, stmList);
	iList  = codegen(frame, stmList); /* 9 */
	G_graph g = FG_AssemFlowGraph(iList);
	//G_show(stdout, G_nodes(g), show_instr);
	//show_graph(g);
	struct L_graph lg = L_liveness(g);
	show_graph(lg.graph);
	fprintf(out, "BEGIN %s\n", Temp_labelstring(F_name(frame)));
	AS_printInstrList (out, iList, Temp_layerMap(F_tempMap,Temp_name()));
	fprintf(out, "END %s\n\n", Temp_labelstring(F_name(frame)));
}
예제 #5
0
파일: parse.c 프로젝트: JackWyj/Tiger
int main(int argc, string *argv)
{

#if 0 
	Temp_temp a1 = Temp_namedtemp(1), 
			  a2 = Temp_namedtemp(2),
			  a3 = Temp_namedtemp(3),
			  a4 = Temp_namedtemp(4),
			  a5 = Temp_namedtemp(5);
	Temp_tempList 
		a = Temp_TempList(a1, Temp_TempList(a2, Temp_TempList(a3, NULL))),
		b = Temp_TempList(a2, Temp_TempList(a4, NULL));
	printf("union: "); printTempList(unionn(a, b));
	printf("except: "); printTempList(except(a,b));

#endif

#if 1 
	A_exp absyn_root;
	S_table base_env, base_tenv;
	F_fragList frags;
	char outfile[100];
	FILE *out = stdout;

	if (argc==2) {
		absyn_root = parse(argv[1]);
		if (!absyn_root) return 1;

        //pr_exp(stdout,absyn_root, 4);
		frags = SEM_transProg(absyn_root);
		if (anyErrors) return 1; /* don't continue */

		/* convert the filename */
		sprintf(outfile, "%s.s", argv[1]);
		out = fopen(outfile, "w");

		for (;frags;frags=frags->tail) {
			if (frags->head->kind == F_procFrag) {
				//puts(Temp_labelstring(F_name(frags->head->u.proc.frame)));
				doProc(out, frags->head->u.proc.frame, frags->head->u.proc.body);
			}
			else if (frags->head->kind == F_stringFrag) {
				fprintf(out, "%s: %s\n",Temp_labelstring(frags->head->u.stringg.label), frags->head->u.stringg.str);
			}
			else assert(0);
		}
		fclose(out);
		return 0;
	}
	EM_error(0,"usage: tiger file.tig");
	return 1;
#endif
}
예제 #6
0
T_exp T_Label(Temp_label label)
{
	T_exp p = (T_exp) checked_malloc(sizeof *p);
 
	p->kind=T_LABEL;

	p->PrintMyNodeSerialNumber = serial_node_number++;

	sprintf(p->PrintTheKindOfTreeIAm,"LABEL: %s",Temp_labelstring(label));

	p->u.LABEL=label;
 
	return p;
}
예제 #7
0
T_exp T_JumpLabel(Temp_label label)
{
	T_exp p = (T_exp) checked_malloc(sizeof *p);
 
	p->kind=T_JUMP;
 
	p->PrintMyNodeSerialNumber = serial_node_number++;

	sprintf(p->PrintTheKindOfTreeIAm,"JUMP %s",Temp_labelstring(label));

	p->u.JUMP.type = T_JUMP_LABEL;
	p->u.JUMP.u.label=label;
 
	return p;
}
예제 #8
0
T_exp T_Call(Temp_label name, T_expList args)
{
	T_exp p = (T_exp) checked_malloc(sizeof *p);

	p->kind=T_CALL;

	p->PrintMyNodeSerialNumber = serial_node_number++;

	sprintf(p->PrintTheKindOfTreeIAm,"CALL: %s",Temp_labelstring(name));

	p->u.CALL.name = name;
	p->u.CALL.args = args;
	
	return p;
}
예제 #9
0
T_exp T_Function(T_exp prologue, T_exp body, T_exp epilogue, Temp_label name)
{
	T_exp p = (T_exp) checked_malloc(sizeof *p);
	
	p->kind=T_FUNCTION;

	p->PrintMyNodeSerialNumber = serial_node_number++;

	sprintf(p->PrintTheKindOfTreeIAm,"FUNCTION: %s",Temp_labelstring(name));

	p->u.FUNCTION.prologue = prologue;
	p->u.FUNCTION.body = body;
	p->u.FUNCTION.epilogue = epilogue;
	p->u.FUNCTION.name = name;
	
	return p;
}
예제 #10
0
파일: assem.c 프로젝트: JackWyj/Tiger
/* first param is string created by this function by reading 'assem' string
 * and replacing `d `s and `j stuff.
 * Last param is function to use to determine what to do with each temp.
 */
static void format(char *result, string assem, Temp_tempList dst, Temp_tempList src, AS_targets jumps, Temp_map m)
{  
	char *p;
	int i = 0; /* offset to result string */

	for (p = assem; p && *p != '\0'; p++) {
		if (*p == '`') {
			switch(*(++p)) {
				case 's':
				{
				int n = *(++p) - '0';
				string s = Temp_look(m, nthTemp(src,n));
				strcpy(result+i, s);
				i += strlen(s);
				}
				break;
				case 'd': 
				{
				int n = *(++p) - '0';
				string s = Temp_look(m, nthTemp(dst,n));
				strcpy(result+i, s);
				i += strlen(s);
				}
				break;
				case 'j': assert(jumps); 
				{
				int n = *(++p) - '0';
				string s = Temp_labelstring(nthLabel(jumps->labels,n));
				strcpy(result+i, s);
				i += strlen(s);
				}
				break;
				default: assert(0);
			} 
		} else {
			result[i] = *p; 
			i++; 
		}
	}
	result[i] = '\0';
}
예제 #11
0
/* first param is string created by this function by reading 'assem' string
 * and replacing `d `s and `j stuff.
 * Last param is function to use to determine what to do with each temp.
 */
void AS_format(char *result, string assem, 
		   Temp_tempList dst, Temp_tempList src,
		   AS_targets jumps, Temp_map m)
{
  char *p;
  int i = 0; /* offset to result string */
  for(p = assem; p && *p != '\0'; p++)
    if (*p == '`')
      switch(*(++p)) {
      case 's': {int n = atoi(++p);
//printf("mark start\n");
//printf("n = %d\n", n);
//if(nthTemp(src,n)==NULL){printf("But it is NULL!\n");}fflush(stdout);
		 string s = Temp_look(m, nthTemp(src,n));
//printf("mark end\n");fflush(stdout);
		 strcpy(result+i, s);
		 i += strlen(s);
	       }
	break;
      case 'd': {int n = atoi(++p);
		 string s = Temp_look(m, nthTemp(dst,n));
		 strcpy(result+i, s);
		 i += strlen(s);
	       }
	break;
      case 'j': assert(jumps); 
	       {int n = atoi(++p);
		 string s = Temp_labelstring(nthLabel(jumps->labels,n));
		 strcpy(result+i, s);
		 i += strlen(s);
	       }
	break;
      case '`': result[i] = '`'; i++; 
	break;
      default: assert(0);
      }
    else {result[i] = *p; i++; }
  result[i] = '\0';
}
예제 #12
0
파일: translate.c 프로젝트: JackWyj/Tiger
static void display_ac(Tr_access ac) {
	printf("level: %s\n", Temp_labelstring(ac->level->name));	
	dis_ac(ac->access);
}