implemented annies and meyers stuff
This commit is contained in:
127
src/codegen.c
127
src/codegen.c
@ -74,7 +74,8 @@ int generate() {
|
|||||||
case E_ADDRESS_OF:
|
case E_ADDRESS_OF:
|
||||||
generateAddressOf(i);
|
generateAddressOf(i);
|
||||||
break;
|
break;
|
||||||
default:;
|
default:
|
||||||
|
;
|
||||||
}
|
}
|
||||||
i = i->next;
|
i = i->next;
|
||||||
}
|
}
|
||||||
@ -117,13 +118,14 @@ CGNode *findCG(TableNode *tn) {
|
|||||||
CGNode *addCG(TableNode *tn, int sp) {
|
CGNode *addCG(TableNode *tn, int sp) {
|
||||||
CGNode *cg = calloc(1, sizeof(CGNode));
|
CGNode *cg = calloc(1, sizeof(CGNode));
|
||||||
cg->tn = tn;
|
cg->tn = tn;
|
||||||
cg->address = sp;
|
offset += getPrimSize(getTypeEntry(tn));
|
||||||
offset += getPrimSize(tn); //not sure if this is the correct amount to add to the offset
|
cg->address = offset;
|
||||||
cg->next = cgList;
|
cg->next = cgList;
|
||||||
cgList = cg;
|
cgList = cg;
|
||||||
return cg;
|
return cg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int generateLabel(Instruction *inst) {
|
int generateLabel(Instruction *inst) {
|
||||||
fprintf(cg_flag, ".L%d:\n", getLabel(inst));
|
fprintf(cg_flag, ".L%d:\n", getLabel(inst));
|
||||||
return 0;
|
return 0;
|
||||||
@ -147,6 +149,7 @@ int generateAdd(Instruction *inst) {
|
|||||||
cg = addCG(getResult(inst), offset);
|
cg = addCG(getResult(inst), offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
CGNode *op1CG = findCG(getTN(op1));
|
CGNode *op1CG = findCG(getTN(op1));
|
||||||
CGNode *op2CG = findCG(getTN(op1));
|
CGNode *op2CG = findCG(getTN(op1));
|
||||||
if (op1CG == NULL) {
|
if (op1CG == NULL) {
|
||||||
@ -158,10 +161,10 @@ int generateAdd(Instruction *inst) {
|
|||||||
printdebug("generateAdd failed, %s is not initialized/in CG", getName(getTN(op2)));
|
printdebug("generateAdd failed, %s is not initialized/in CG", getName(getTN(op2)));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%eax\t#addition start\n", getAddress(op1CG));
|
||||||
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%eax\n", getAddress(op1CG));
|
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%eax\n", getAddress(op2CG));
|
||||||
fprintf(cg_flag, "\taddl\t%d(%%rbp), %%eax\n", getAddress(op2CG));
|
fprintf(cg_flag, "\taddl\t%%edx, %%eax\n");
|
||||||
fprintf(cg_flag, "\tmovl\t%%eax, %d(%%rbp)\n", getAddress(cg));
|
fprintf(cg_flag, "\tmovl\t%%eax, %d(%%rbp)\t#addition end\n", getAddress(cg));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -196,9 +199,9 @@ int generateSub(Instruction *instruction) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%eax\n", getAddress(op1CG));
|
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%eax\t#subtraction start\n", getAddress(op1CG));
|
||||||
fprintf(cg_flag, "\tsubl\t%d(%%rbp), %%eax\n", getAddress(op2CG));
|
fprintf(cg_flag, "\tsubl\t%d(%%rbp), %%eax\n", getAddress(op2CG));
|
||||||
fprintf(cg_flag, "\tmovl\t%%eax, %d(%%rbp)\n", getAddress(cg));
|
fprintf(cg_flag, "\tmovl\t%%eax, %d(%%rbp)\t#subtraction end\n", getAddress(cg));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -232,9 +235,9 @@ int generateMult(Instruction *inst) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%eax\n", getAddress(op1CG));
|
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%eax\t#multiplication start\n", getAddress(op1CG));
|
||||||
fprintf(cg_flag, "\tsubl\t%d(%%rbp), %%eax\n", getAddress(op2CG));
|
fprintf(cg_flag, "\timull\t%d(%%rbp), %%eax\n", getAddress(op2CG));
|
||||||
fprintf(cg_flag, "\tmovl\t%%eax, %d(%%rbp)\n", getAddress(cg));
|
fprintf(cg_flag, "\tmovl\t%%eax, %d(%%rbp)\t#multiplication end\n", getAddress(cg));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -269,10 +272,10 @@ int generateDiv(Instruction *inst) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%eax\n", getAddress(op1CG)); //moves dividend into eax
|
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%eax\t#division start\n", getAddress(op1CG)); //moves dividend into eax
|
||||||
fprintf(cg_flag, "\tcltd\n"); //sign extends the dividend in eax
|
fprintf(cg_flag, "\tcltd\n"); //sign extends the dividend in eax
|
||||||
fprintf(cg_flag, "\tidivl\t%d(%%rbp)\n", getAddress(op2CG));//divides edx by value accessed from stack
|
fprintf(cg_flag, "\tidivl\t%d(%%rbp)\n", getAddress(op2CG));//divides edx by value accessed from stack
|
||||||
fprintf(cg_flag, "\tmovl\t%%eax, %d(%%rbp)\n", getAddress(cg)); //stores result
|
fprintf(cg_flag, "\tmovl\t%%eax, %d(%%rbp)\t#division end\n", getAddress(cg)); //stores result
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -306,10 +309,10 @@ int generateMod(Instruction *inst) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%eax\n", getAddress(op1CG)); //moves dividend into eax
|
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%eax\t#mod start\n", getAddress(op1CG)); //moves dividend into eax
|
||||||
fprintf(cg_flag, "\tcltd\n"); //sign extends the dividend in eax
|
fprintf(cg_flag, "\tcltd\n"); //sign extends the dividend in eax
|
||||||
fprintf(cg_flag, "\tidivl\t%d(%%rbp)\n", getAddress(op2CG));//divides edx by value accessed from stack
|
fprintf(cg_flag, "\tidivl\t%d(%%rbp)\n", getAddress(op2CG));//divides edx by value accessed from stack
|
||||||
fprintf(cg_flag, "\tmovl\t%%edx, %d(%%rbp)\n", getAddress(cg)); //stores result from edx (remainder)
|
fprintf(cg_flag, "\tmovl\t%%edx, %d(%%rbp)\t#mod end\n", getAddress(cg)); //stores result from edx (remainder)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -344,9 +347,24 @@ int generateOr(Instruction *inst) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%eax\n", getAddress(op1CG));
|
int label = label_gen();
|
||||||
fprintf(cg_flag, "\torll\t%d(%%rbp), %%eax\n", getAddress(op2CG)); //divides edx by value accessed from stack
|
|
||||||
fprintf(cg_flag, "\tmovl\t%%eax, %d(%%rbp)\n", getAddress(cg)); //stores result
|
fprintf(cg_flag, "\tcmpl\t$0, %d(%%rbp)\t#start or\n", getAddress(op1CG));
|
||||||
|
fprintf(cg_flag, "\tjne\t.L%dor2\n", label);
|
||||||
|
|
||||||
|
fprintf(cg_flag, "\tcmpl\t$0, %d(%%rbp)\n", getAddress(op2CG));
|
||||||
|
fprintf(cg_flag, "\tje\t.L%dor3\n", label);
|
||||||
|
|
||||||
|
fprintf(cg_flag, ".L%dor2:\n", label);
|
||||||
|
fprintf(cg_flag, "\tmovl\t$1, %%eax\n");
|
||||||
|
fprintf(cg_flag, "\tjmp\t.L%dor4\n", label);
|
||||||
|
|
||||||
|
fprintf(cg_flag, ".L%dor3:\n", label);
|
||||||
|
fprintf(cg_flag, "\tmovl\t$0, %%eax\n");
|
||||||
|
|
||||||
|
fprintf(cg_flag, ".L%dor4:\n", label);
|
||||||
|
fprintf(cg_flag, "\tmovb\t%%al, %d(%%rbp)\n", getAddress(cg));
|
||||||
|
fprintf(cg_flag, "\tandb\t$1, %d(%%rbp)\t#or end\n", getAddress(cg)); //stores result
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -380,18 +398,30 @@ int generateAnd(Instruction *inst) {
|
|||||||
printdebug("generateAnd failed, %s is not initialized/in CG", getName(getTN(op2)));
|
printdebug("generateAnd failed, %s is not initialized/in CG", getName(getTN(op2)));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
int label = label_gen();
|
||||||
|
|
||||||
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%eax\n", getAddress(op1CG));
|
fprintf(cg_flag, "\tcmpl\t$0, %d(%%rbp)\t#start and\n", getAddress(op1CG));
|
||||||
fprintf(cg_flag, "\tandl\t%d(%%rbp), %%eax\n", getAddress(op2CG));
|
fprintf(cg_flag, "\tje\t.L%dor2\n", label);
|
||||||
fprintf(cg_flag, "\tmovl\t%%eax, %d(%%rbp)\n", getAddress(cg));
|
|
||||||
|
fprintf(cg_flag, "\tcmpl\t$0, %d(%%rbp)\n", getAddress(op2CG));
|
||||||
|
fprintf(cg_flag, "\tje\t.L%dor2\n", label);
|
||||||
|
|
||||||
|
fprintf(cg_flag, "\tmovl\t$1, %%eax\n");
|
||||||
|
fprintf(cg_flag, "\tjmp\t.L%dor3\n", label);
|
||||||
|
|
||||||
|
fprintf(cg_flag, ".L%dor2:\n", label);
|
||||||
|
fprintf(cg_flag, "\tmovl\t$0, %%eax\n");
|
||||||
|
|
||||||
|
fprintf(cg_flag, ".L%dor3:\n", label);
|
||||||
|
fprintf(cg_flag, "\tmovb\t%%al, %d(%%rbp)\n", getAddress(cg));
|
||||||
|
fprintf(cg_flag, "\tandb\t$1, %d(%%rbp)\t#and end\n", getAddress(cg)); //stores result
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
int generateNeg(Instruction *inst) {
|
int generateNeg(Instruction *inst) {
|
||||||
TNodeOrConst *op1 = getOperand1(inst);
|
TNodeOrConst *op1 = getOperand1(inst);
|
||||||
TNodeOrConst *op2 = getOperand2(inst);
|
|
||||||
CGNode *cg = findCG(getResult(inst));
|
CGNode *cg = findCG(getResult(inst));
|
||||||
|
|
||||||
if (op1 == NULL || op2 == NULL) {
|
if (op1 == NULL) {
|
||||||
printdebug("generateNeg failed, NULL operand");
|
printdebug("generateNeg failed, NULL operand");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -401,28 +431,21 @@ int generateNeg(Instruction *inst) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
CGNode *op1CG = findCG(getTN(op1));
|
CGNode *op1CG = findCG(getTN(op1));
|
||||||
CGNode *op2CG = findCG(getTN(op2));
|
|
||||||
if (op1CG == NULL) {
|
if (op1CG == NULL) {
|
||||||
printdebug("generateNeg failed, op1 is not constant but not in CGlist");
|
printdebug("generateNeg failed, op1 is not constant but not in CGlist");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (op2CG == NULL) {
|
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%eax\t#negation start\n", getAddress(op1CG));
|
||||||
printdebug("generateNeg failed, %s is not initialized/in CG", getName(getTN(op2)));
|
fprintf(cg_flag, "\tnegl\t%%eax\n");
|
||||||
return -1;
|
fprintf(cg_flag, "\tmovl\t%%eax, %d(%%rbp)\t#negation end\n", getAddress(cg));
|
||||||
}
|
|
||||||
|
|
||||||
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%eax\n", getAddress(op1CG));
|
|
||||||
fprintf(cg_flag, "\tnegl\t%d %%eax\n", getAddress(op2CG));
|
|
||||||
fprintf(cg_flag, "\tmovl\t%%eax, %d(%%rbp)\n", getAddress(cg));
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
int generateNot(Instruction *inst) {
|
int generateNot(Instruction *inst) {
|
||||||
TNodeOrConst *op1 = getOperand1(inst);
|
TNodeOrConst *op1 = getOperand1(inst);
|
||||||
TNodeOrConst *op2 = getOperand2(inst);
|
|
||||||
CGNode *cg = findCG(getResult(inst));
|
CGNode *cg = findCG(getResult(inst));
|
||||||
|
|
||||||
if (op1 == NULL || op2 == NULL) {
|
if (op1 == NULL) {
|
||||||
printdebug("generateNot failed, NULL operand");
|
printdebug("generateNot failed, NULL operand");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -432,20 +455,18 @@ int generateNot(Instruction *inst) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
CGNode *op1CG = findCG(getTN(op1));
|
CGNode *op1CG = findCG(getTN(op1));
|
||||||
CGNode *op2CG = findCG(getTN(op2));
|
|
||||||
if (op1CG == NULL) {
|
if (op1CG == NULL) {
|
||||||
printdebug("generateNot failed, op1 is not constant but not in CGlist");
|
printdebug("generateNot failed, op1 is not constant but not in CGlist");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (op2CG == NULL) {
|
fprintf(cg_flag, "\tmovzbl\t%d(%%rbp), %%eax\t#not start\n", getAddress(op1CG));
|
||||||
printdebug("generateNot failed, %s is not initialized/in CG", getName(getTN(op2)));
|
fprintf(cg_flag, "\ttestl\t%%eax, %%eax\n");
|
||||||
return -1;
|
fprintf(cg_flag, "\tsetne\t%%al\n");
|
||||||
}
|
fprintf(cg_flag, "\txorl\t$1, %%eax\n");
|
||||||
|
fprintf(cg_flag, "\tmovzbl\t%%al, %%eax\n");
|
||||||
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%eax\n", getAddress(op1CG));
|
fprintf(cg_flag, "\tmovb\t%%al, %d(%%rbp)\n", getAddress(cg));
|
||||||
fprintf(cg_flag, "\tnotl\t%%eax\n", getAddress(op2CG));
|
fprintf(cg_flag, "\tandb\t$1, %d(%%rbp)\t#not end\n", getAddress(cg));
|
||||||
fprintf(cg_flag, "\tmovl\t%%eax, %d(%%rbp)\n", getAddress(cg));
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -453,6 +474,7 @@ int generateAssign(Instruction *inst) {
|
|||||||
TNodeOrConst *op1 = getOperand1(inst);
|
TNodeOrConst *op1 = getOperand1(inst);
|
||||||
CGNode *cg = findCG(getResult(inst));
|
CGNode *cg = findCG(getResult(inst));
|
||||||
|
|
||||||
|
|
||||||
if (op1 == NULL) {
|
if (op1 == NULL) {
|
||||||
printdebug("generateAssign failed, NULL operand");
|
printdebug("generateAssign failed, NULL operand");
|
||||||
return -1;
|
return -1;
|
||||||
@ -462,19 +484,22 @@ int generateAssign(Instruction *inst) {
|
|||||||
cg = addCG(getResult(inst), offset);
|
cg = addCG(getResult(inst), offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//add option for constant assignment (should be easy)
|
//add option for constant assignment (should be easy)
|
||||||
if (isConst(op1) == true) {
|
if (isConst(op1) == true) {
|
||||||
fprintf(cg_flag, "\tmovl\t$%d, %d(%%rbp)\n", getConst(op1), getAddress(cg));
|
fprintf(cg_flag, "\tmovl\t$%d, %d(%%rbp)\t#constant assign\n", getConst(op1), getAddress(cg));
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
CGNode *op1CG = findCG(getTN(op1));
|
CGNode *op1CG = findCG(getTN(op1));
|
||||||
if (op1CG == NULL) {
|
if (op1CG == NULL) {
|
||||||
|
printf("failed here\n");
|
||||||
printdebug("generateAssign failed, op1 is not constant but not in CGlist");
|
printdebug("generateAssign failed, op1 is not constant but not in CGlist");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%eax\n", getAddress(op1CG));
|
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%eax\t#assign start\n", getAddress(op1CG));
|
||||||
fprintf(cg_flag, "\tmovl\t%%eax, %d(%%rbp)\n", getAddress(cg));
|
fprintf(cg_flag, "\tmovl\t%%eax, %d(%%rbp)\t#assign end\n", getAddress(cg));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -526,10 +551,10 @@ int generateLessThan(Instruction *inst) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%eax\n", getAddress(op1CG));
|
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%eax\t#less than start\n", getAddress(op1CG));
|
||||||
fprintf(cg_flag, "\tcmpl\t%d(%%rbp), %%eax\n", getAddress(op2CG));
|
fprintf(cg_flag, "\tcmpl\t%d(%%rbp), %%eax\n", getAddress(op2CG));
|
||||||
fprintf(cg_flag, "\tsetl\t%%al\n");
|
fprintf(cg_flag, "\tsetl\t%%al\n");
|
||||||
fprintf(cg_flag, "\tmovb\t%%al, %d(%%rbp)\n", getAddress(cg));
|
fprintf(cg_flag, "\tmovb\t%%al, %d(%%rbp)\t#less than end\n", getAddress(cg));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -564,10 +589,10 @@ int generateEqualTo(Instruction *inst) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%eax\n", getAddress(op1CG));
|
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%eax\t#equal to start\n", getAddress(op1CG));
|
||||||
fprintf(cg_flag, "\tcmpl\t%d(%%rbp), %%eax\n", getAddress(op2CG));
|
fprintf(cg_flag, "\tcmpl\t%d(%%rbp), %%eax\n", getAddress(op2CG));
|
||||||
fprintf(cg_flag, "\tsete\t%%al\n");
|
fprintf(cg_flag, "\tsete\t%%al\n");
|
||||||
fprintf(cg_flag, "\tmovb\t%%al, %d(%%rbp)\n", getAddress(cg));
|
fprintf(cg_flag, "\tmovb\t%%al, %d(%%rbp)\t#equal to end\n", getAddress(cg));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
int generateCall(Instruction *instruction){
|
int generateCall(Instruction *instruction){
|
||||||
|
@ -577,7 +577,7 @@ simple_statement:
|
|||||||
|
|
||||||
|
|
||||||
if(getAdInfoType(node) == getAdInfoType((TableNode*)$3)){
|
if(getAdInfoType(node) == getAdInfoType((TableNode*)$3)){
|
||||||
//EMIT ASSIGN INSTRUCTION HERE
|
emit_assignment($1, tn_or_const(NODE, $3));
|
||||||
printdebug("%s[☺] Passed type check; %s = %s", COLOR_GREEN, getName(node), getName((TableNode*)$3));
|
printdebug("%s[☺] Passed type check; %s = %s", COLOR_GREEN, getName(node), getName((TableNode*)$3));
|
||||||
} else {
|
} else {
|
||||||
throw_error(ERROR_TYPE, "%s != %s", getName(node), getName((TableNode*)$3));
|
throw_error(ERROR_TYPE, "%s != %s", getName(node), getName((TableNode*)$3));
|
||||||
|
@ -278,11 +278,11 @@ void emit_conditional_jump(Op condition, int label, ...) {
|
|||||||
va_end(argptr);
|
va_end(argptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void emit_function_start(int name) {
|
void emit_function_start(TNodeOrConst * name) {
|
||||||
emit_helper();
|
emit_helper();
|
||||||
current->opcode = E_LABEL; // I think this is right TODO: ask
|
current->opcode = E_LABEL; // I think this is right TODO: ask
|
||||||
current->label = name;
|
current->operand1 = name;
|
||||||
// this is probabaly a func decleration
|
// this is probabaly a func declaration
|
||||||
}
|
}
|
||||||
|
|
||||||
void emit_parameter(TNodeOrConst* param) {
|
void emit_parameter(TNodeOrConst* param) {
|
||||||
@ -380,11 +380,9 @@ char * temp_var_gen(){
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
char* label_gen() {
|
int label_gen(){
|
||||||
char* ret = calloc(9, sizeof(*ret));
|
|
||||||
sprintf(ret, "L_%d", label_count);
|
|
||||||
label_count++;
|
label_count++;
|
||||||
return ret;
|
return label_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
TableNode* getTN(TNodeOrConst* tnc) {
|
TableNode* getTN(TNodeOrConst* tnc) {
|
||||||
@ -393,7 +391,7 @@ TableNode* getTN(TNodeOrConst* tnc) {
|
|||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
//we must fix this
|
|
||||||
int getConst(TNodeOrConst* tnc) {
|
int getConst(TNodeOrConst* tnc) {
|
||||||
if (tnc->d == INTEGER) {
|
if (tnc->d == INTEGER) {
|
||||||
return tnc->tnc_union->integer;
|
return tnc->tnc_union->integer;
|
||||||
|
@ -100,7 +100,7 @@ void emit_as_file(FILE* out_file, Instruction* i);
|
|||||||
void emit_label(int label);
|
void emit_label(int label);
|
||||||
void emit_jump(int label);
|
void emit_jump(int label);
|
||||||
void emit_conditional_jump(Op condition, int label, ...);
|
void emit_conditional_jump(Op condition, int label, ...);
|
||||||
void emit_function_start(int name);
|
void emit_function_start(TNodeOrConst * name);
|
||||||
void emit_parameter(TNodeOrConst* param);
|
void emit_parameter(TNodeOrConst* param);
|
||||||
void emit_function_call(TableNode* result, int param_count, TNodeOrConst* name);
|
void emit_function_call(TableNode* result, int param_count, TNodeOrConst* name);
|
||||||
void emit_return(TNodeOrConst* value);
|
void emit_return(TNodeOrConst* value);
|
||||||
@ -111,7 +111,7 @@ void emit_deref_left();
|
|||||||
void emit_field_access(char* result, char* record, char* field);
|
void emit_field_access(char* result, char* record, char* field);
|
||||||
void emit_array_access(Op op, TableNode* result, TNodeOrConst* array, TNodeOrConst* index);
|
void emit_array_access(Op op, TableNode* result, TNodeOrConst* array, TNodeOrConst* index);
|
||||||
void emit_bounds_check(TNodeOrConst* index, TNodeOrConst* arr);
|
void emit_bounds_check(TNodeOrConst* index, TNodeOrConst* arr);
|
||||||
char* label_gen();
|
int label_gen();
|
||||||
TableNode* getTN(TNodeOrConst* tnc);
|
TableNode* getTN(TNodeOrConst* tnc);
|
||||||
int getConst(TNodeOrConst* tnc);
|
int getConst(TNodeOrConst* tnc);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user