seems to work for records, but the offsets are wrong (1)
This commit is contained in:
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user