hopefully fixed merge

This commit is contained in:
Annie
2025-05-06 15:53:24 -04:00
parent c8491b62e4
commit bab71df517
8 changed files with 135 additions and 86 deletions

View File

@ -32,4 +32,4 @@ external function printB: Boolean2integer
external function inS: integer2string
external function inI: integer2integer
external function inC: integer2character
external function inC: integer2character

View File

@ -3,92 +3,99 @@
#include "codegen.h"
int paramCount = 0;
int funDec = 0;
int generate() {
offset = 0;
currentsp = 0;
Instruction *i = begin;
funList = NULL;
// temporary
fprintf(cg_flag, ".globl entry\n");
while (i != NULL) {
switch (getOp(i)) {
case E_LABEL:
generateLabel(i);
break;
case E_ADD:
generateAdd(i);
break;
case E_SUB:
generateSub(i);
break;
case E_MUL:
generateMult(i);
break;
case E_DIV:
generateDiv(i);
break;
case E_MOD:
generateMod(i);
break;
case E_OR:
generateOr(i);
break;
case E_AND:
generateAnd(i);
break;
case E_NEG:
generateNeg(i);
break;
case E_NOT:
generateNot(i);
break;
case E_ASSIGN:
generateAssign(i);
break;
case E_GOTO:
generateGoto(i);
break;
case E_IF_X_TRUE:
generateIfTrue(i);
break;
case E_IF_X_FALSE:
generateIfFalse(i);
break;
case E_LESS_THAN:
generateLessThan(i);
break;
case E_EQUAL_TO:
generateEqualTo(i);
break;
case E_CALL:
generateCall(i);
break;
case E_PARAM:
generateParam(i);
break;
case E_RETURN:
generateReturn(i);
break;
case E_INDEX_COPY_RIGHT:
generateCopyRight(i);
break;
case E_INDEX_COPY_LEFT:
generateCopyLeft(i);
break;
case E_ADDRESS_OF:
generateAddressOf(i);
break;
case E_FUNC_START:
generateFunctionStart(i);
break;
default:;
case E_LABEL:
generateLabel(i);
break;
case E_ADD:
generateAdd(i);
break;
case E_SUB:
generateSub(i);
break;
case E_MUL:
generateMult(i);
break;
case E_DIV:
generateDiv(i);
break;
case E_MOD:
generateMod(i);
break;
case E_OR:
generateOr(i);
break;
case E_AND:
generateAnd(i);
break;
case E_NEG:
generateNeg(i);
break;
case E_NOT:
generateNot(i);
break;
case E_ASSIGN:
generateAssign(i);
break;
case E_GOTO:
generateGoto(i);
break;
case E_IF_X_TRUE:
generateIfTrue(i);
break;
case E_IF_X_FALSE:
generateIfFalse(i);
break;
case E_LESS_THAN:
generateLessThan(i);
break;
case E_EQUAL_TO:
generateEqualTo(i);
break;
case E_CALL:
generateCall(i);
break;
case E_PARAM:
generateParam(i);
break;
case E_RETURN:
generateReturn(i);
break;
case E_INDEX_COPY_RIGHT:
generateCopyRight(i);
break;
case E_INDEX_COPY_LEFT:
generateCopyLeft(i);
break;
case E_ADDRESS_OF:
generateAddressOf(i);
break;
case E_FUNC_START:
generateFunctionStart(i);
break;
case E_FUNC_DEC:
generateFunctionDec(i);
default:;
}
i = i->next;
}
return -1;
}
void align(TableNode *tn) {
int size = getPrimSize(getTypeEntry(tn));
offset += offset % size;
}
CGNode *getNextCG(CGNode *cg) {
if (cg == NULL) {
return NULL;
@ -125,6 +132,7 @@ CGNode *findCG(TableNode *tn) {
CGNode *addCG(TableNode *tn, int sp) {
CGNode *cg = calloc(1, sizeof(CGNode));
cg->tn = tn;
align(tn);
offset += getPrimSize(getTypeEntry(tn));
cg->address = offset;
cg->next = cgList;
@ -132,6 +140,13 @@ CGNode *addCG(TableNode *tn, int sp) {
return cg;
}
int generateFunctionDec(Instruction *i) {
FunDecList * fd = calloc(1, sizeof(FunDecList));
fd->tn = getResult(i);
fd->next = funList;
funList = fd;
return 0;
}
int generateLabel(Instruction *inst) {
if (inst == NULL) {
return -1;
@ -511,7 +526,8 @@ int generateAssign(Instruction *inst) {
}
int generateGoto(Instruction *inst) {
return -1;
fprintf(cg_flag, "\tjmp\t.L%d\n", getLabel(inst));
return 0;
}
int generateCondGoto(Instruction *inst) {
@ -520,7 +536,6 @@ int generateCondGoto(Instruction *inst) {
int generateIfTrue(Instruction *inst) {
return -1;
// might just be a goto for where to go if something is true, or returning if something is true, or checking if true and writing goto if thats the case
}
int generateIfFalse(Instruction *inst) {
@ -621,13 +636,18 @@ int generateCall(Instruction *inst) {
return -1;
}
//if (findCG(getTN(op1)) == NULL) {
// printdebug("generateFunctionCall failed, function not in stack");
// return -1;
//}
// if (getTN(op2) == NULL) {
// printdebug("generateFunctionCall failed, NULL tablenode2");
// return -1;
//}
fprintf(cg_flag, "\tcall %s\n", getName(getTN(op1)));
//fprintf(cg_flag, "\tmovq\t%d(%%rbp), %%rax\t#call %s!\n", getAddress(findCG(getTN(op1))), getName(getTN(op1)));
//fprintf(cg_flag, "\tcall *%%rax\n");
//now for the return
CGNode *cg = findCG(getResult(inst));
@ -703,6 +723,7 @@ int generateParam(Instruction *inst) {
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %s\t#adding param start\n", getAddress(op1CG), REG6);
break;
default:
align(getTN(op1));
offset += getPrimSize(getTypeEntry(getTN(op1)));
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%eax\t#adding param start\n", getAddress(op1CG));
fprintf(cg_flag, "\tmovl\t%%eax, %d(%%rbp)\t#adding param end\n", offset - getPrimSize(getTypeEntry(getTN(op1))));
@ -737,7 +758,8 @@ int generateFunctionStart(Instruction *inst) {
TableNode *tnToAdd = getFirstEntry(st);
if (getAdInfoType(paramTN) != TYPE_RECORD_TYPE) {
CGNode *paramCG = addCG(tnToAdd, offset);
paramOffset += getPrimSize(tnToAdd);
int size = getPrimSize(getTypeEntry(tnToAdd));
paramOffset += getPrimSize(getTypeEntry(tnToAdd));
fprintf(cg_flag, "\tmovl\t%%edi, %d(%%rbp)\t#FunctionStart1param end\n", getAddress(paramCG));
} else {
int numParams = getRecLength(paramTN);
@ -763,7 +785,8 @@ int generateFunctionStart(Instruction *inst) {
fprintf(cg_flag, "\tmovl\t%s, %d(%%rbp)\t#FunctionStart1param end\n", REG6, getAddress(paramCG));
break;
default:
paramOffset += getPrimSize(getTypeEntry(tnToAdd));
int size = getPrimSize(getTypeEntry(tnToAdd));
paramOffset += size;
offset += getPrimSize(getTypeEntry(tnToAdd));
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%eax\t#FunctionStart1Param start\n", paramOffset);
fprintf(cg_flag, "\tmovl\t%%eax, %d(%%rbp)\t#FunctionStart1param end\n", getAddress(paramCG));
@ -774,5 +797,18 @@ int generateFunctionStart(Instruction *inst) {
}
}
if (strcmp(getName(funDecTN), "entry") == 0) {
if (funList == NULL) {
return -1;
}
fprintf(stderr, "here\n");
TableNode *funDec;
while (funList != NULL) {
funDec = funList->tn;
CGNode *cg = addCG(getResult(inst), offset);
fprintf(cg_flag, "\tmovq\t$%s, %d(%%rbp)\t#storing function declaration\n", getName(funDec), getAddress(cg));
funList = funList->next;
}
}
return 0;
}

View File

@ -25,15 +25,21 @@ extern FILE *cg_flag;
typedef struct CGNode {
TableNode *tn;
int address;
CGNode *next;
struct CGNode *next;
} CGNode;
typedef struct FunDecList {
TableNode *tn;
struct FunDecList *next;
} FunDecList;
int generate();
CGNode *getNextCG(CGNode *cg);
int getAddress(CGNode *cg);
TableNode *getTNofCG(CGNode *cg);
CGNode *findCG(TableNode *tn);
CGNode *addCG(TableNode *tn, int sp);
int generateFunctionDec(Instruction *inst);
int generateLabel(Instruction *inst);
int generateAdd(Instruction *inst);
int generateSub(Instruction *instruction);
@ -66,3 +72,4 @@ extern Instruction *current;
extern int offset;
extern int currentsp;
extern CGNode *cgList;
extern FunDecList *funList;

View File

@ -31,7 +31,7 @@ Instruction *current;
int offset;
int currentsp;
CGNode *cgList;
FunDecList *funList;
Stack *stack;
Stack *TrueList;
Stack *FalseList;

View File

@ -615,6 +615,10 @@ TableNode *getTN(TNodeOrConst *tnc) {
int getConst(TNodeOrConst *tnc) {
if (tnc->d == INTEGER) {
return tnc->tnc_union->integer;
} else if (tnc->d == CHARACTER) {
return tnc->tnc_union->character;
} else if (tnc->d == BOOLEAN) {
return tnc->tnc_union->Boolean;
}
return -1;
}

View File

@ -30,7 +30,7 @@ function d: iic2b
d(x,y,z) := {
[string: s]
return 0;
return true;
}
function entry: string2int
@ -38,6 +38,7 @@ function entry: string2int
a(x) := {
[string : s]
s := x;
return 0;
}
@ -50,7 +51,7 @@ b(x) := {
c(x) := {
[string: s]
s := "Hi!";
return x(s);
return a(s);
}
@ -61,6 +62,7 @@ entry(arg) := {
[integer: result; string2int: f; integer: temp]
temp := a("Hello");
f := b(temp);
result := f("ahhh");
result := c(f);
if (d(1,2,'c'))
then {

View File

@ -1,5 +1,5 @@
(* TEST: [-asc -tc -cg -ir] *)
type string: 1 -> character
type BooleanXBoolean: [Boolean: x; Boolean: y]
type characterXcharacter: [character: x; character: y]
@ -35,7 +35,7 @@ external function inI: integer2integer
external function inC: integer2character
function entry: string2integer
entry (arg) := {
[integer:x; integer:y; integer: result]

View File

@ -36,7 +36,6 @@ external function inC: integer2character
function entry: string2integer
type rec: [integer: x; integer: y; integer: z; integer: a; integer: b; integer: c; integer: d]
type T2: rec -> integer
type T: integer -> integer
@ -54,8 +53,9 @@ bar (a, b, c,d,e,f,g) := {
}
entry (arg) := {
[integer:x; integer:y; integer: result]
[integer:x; integer:y; integer: result; character: a]
a := 'a';
x := printCharacter(a);
result := bar(1,2,3,4,5,6,7);
return 1;
}