diff --git a/src/codegen.c b/src/codegen.c index 79a489c..a3c4dff 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -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%%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; } int generateFunctionStart(Instruction *inst) { - TNodeOrConst *op1 = getResult(inst); + TableNode *funDecTN = getResult(inst); - if (op1 == NULL) { - printdebug("%sgenerateFunctionStart failed, NULL operand", COLOR_RED); - return -1; - } - - TableNode *funDecTN = getTN(op1); - if (getTN(op1) == NULL) { + if (funDecTN == NULL) { printdebug("generateFunctionStart failed, NULL tablenode"); return -1; } //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, "\tmovq\t%%rsp, %%rbp\n"); @@ -693,21 +687,23 @@ int generateFunctionStart(Instruction *inst) { // if not, go get one element of type of param //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); - int paramOffset = -16; - if (getAdInfoType(paramTN) != TYPE_RECORD) { - CGNode *paramCG = addCG(tn, currentsp); + int paramOffset = 16; + if (getAdInfoType(paramTN) != TYPE_RECORD_TYPE) { + 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%%eax, %d(%%rbp)\t#FunctionStart1param end\n", getPrimSize(getTypeEntry(paramTN))); } else { + fprintf(stderr, "record type\n"); int numParams = getRecLength(paramTN); TableNode *tnToAdd = getFirstEntry(st); 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%%eax, %d(%%rbp)\t#FunctionStart1param end\n", getPrimSize(getTypeEntry(paramTN))); - paramoffset -= getPrimSize(getTypeEntry(tnToAdd)); + paramOffset += getPrimSize(getTypeEntry(tnToAdd)); tnToAdd = getNextEntry(tnToAdd); } }