seems to work for records, but the offsets are wrong (1)

This commit is contained in:
Annie
2025-05-03 21:14:24 -04:00
parent 5e314118f9
commit 3e1c510c68

View File

@ -663,27 +663,21 @@ int generateParam(Instruction *inst){
} }
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%eax\t#adding param start\n", getAddress(op1CG)); 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", getPrimSize(getTypeEntry(tn))); fprintf(cg_flag, "\tmovl\t%%eax, %d(%%rbp)\t#adding param end\n", getPrimSize(getTypeEntry(getTN(op1))));
return 0; return 0;
} }
int generateFunctionStart(Instruction *inst) { int generateFunctionStart(Instruction *inst) {
TNodeOrConst *op1 = getResult(inst); TableNode *funDecTN = getResult(inst);
if (op1 == NULL) { if (funDecTN == NULL) {
printdebug("%sgenerateFunctionStart failed, NULL operand", COLOR_RED);
return -1;
}
TableNode *funDecTN = getTN(op1);
if (getTN(op1) == NULL) {
printdebug("generateFunctionStart failed, NULL tablenode"); printdebug("generateFunctionStart failed, NULL tablenode");
return -1; return -1;
} }
//this is independent of parameters: //this is independent of parameters:
fprintf(cg_flag, "%s:\n", getName(getTN(op1))); fprintf(cg_flag, "%s:\n", getName(funDecTN));
fprintf(cg_flag, "\tpushq\t%%rbp\n"); fprintf(cg_flag, "\tpushq\t%%rbp\n");
fprintf(cg_flag, "\tmovq\t%%rsp, %%rbp\n"); fprintf(cg_flag, "\tmovq\t%%rsp, %%rbp\n");
@ -693,21 +687,23 @@ int generateFunctionStart(Instruction *inst) {
// if not, go get one element of type of param // if not, go get one element of type of param
//declaration ->getType->getDefinitionScope?: go through first n entries to get table nodes for params //declaration ->getType->getDefinitionScope?: go through first n entries to get table nodes for params
TableNode *paramTN = getParameter(funDecTN); TableNode *paramTN = getParameter(getTypeEntry(funDecTN));
SymbolTable *st = getFunScope(funDecTN); SymbolTable *st = getFunScope(funDecTN);
int paramOffset = -16; int paramOffset = 16;
if (getAdInfoType(paramTN) != TYPE_RECORD) { if (getAdInfoType(paramTN) != TYPE_RECORD_TYPE) {
CGNode *paramCG = addCG(tn, currentsp); fprintf(stderr, "%d\n", getAdInfoType(funDecTN));
CGNode *paramCG = addCG(paramTN, currentsp);
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%eax\t#FunctionStart1Param start\n", paramOffset); 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", getPrimSize(getTypeEntry(paramTN))); fprintf(cg_flag, "\tmovl\t%%eax, %d(%%rbp)\t#FunctionStart1param end\n", getPrimSize(getTypeEntry(paramTN)));
} else { } else {
fprintf(stderr, "record type\n");
int numParams = getRecLength(paramTN); int numParams = getRecLength(paramTN);
TableNode *tnToAdd = getFirstEntry(st); TableNode *tnToAdd = getFirstEntry(st);
for (int i = 0; i < numParams; i++) { for (int i = 0; i < numParams; i++) {
CGNode *paramCG = addCG(tnTooAdd, currentsp); CGNode *paramCG = addCG(tnToAdd, currentsp);
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%eax\t#FunctionStart1Param start\n", paramOffset); 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", getPrimSize(getTypeEntry(paramTN))); fprintf(cg_flag, "\tmovl\t%%eax, %d(%%rbp)\t#FunctionStart1param end\n", getPrimSize(getTypeEntry(paramTN)));
paramoffset -= getPrimSize(getTypeEntry(tnToAdd)); paramOffset += getPrimSize(getTypeEntry(tnToAdd));
tnToAdd = getNextEntry(tnToAdd); tnToAdd = getNextEntry(tnToAdd);
} }
} }