FUNCTION CALLS WORK WITH 6+ ENTRIES YIPPEEgit add .
This commit is contained in:
@ -2,7 +2,7 @@
|
|||||||
/* The Translators - Spring 2025 */
|
/* The Translators - Spring 2025 */
|
||||||
|
|
||||||
#include "codegen.h"
|
#include "codegen.h"
|
||||||
|
int paramCount = 0;
|
||||||
int generate() {
|
int generate() {
|
||||||
offset = 0;
|
offset = 0;
|
||||||
currentsp = 0;
|
currentsp = 0;
|
||||||
@ -603,6 +603,7 @@ int generateEqualTo(Instruction *inst) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
int generateCall(Instruction *inst) {
|
int generateCall(Instruction *inst) {
|
||||||
|
paramCount = 0;
|
||||||
TNodeOrConst *op1 = getOperand1(inst);
|
TNodeOrConst *op1 = getOperand1(inst);
|
||||||
TNodeOrConst *op2 = getOperand2(inst);
|
TNodeOrConst *op2 = getOperand2(inst);
|
||||||
if (op1 == NULL) {
|
if (op1 == NULL) {
|
||||||
@ -670,7 +671,7 @@ int generateAddressOf(Instruction *inst) {
|
|||||||
|
|
||||||
int generateParam(Instruction *inst) {
|
int generateParam(Instruction *inst) {
|
||||||
TNodeOrConst *op1 = getOperand1(inst);
|
TNodeOrConst *op1 = getOperand1(inst);
|
||||||
|
fprintf(stderr, "generate param reached\n");
|
||||||
if (op1 == NULL) {
|
if (op1 == NULL) {
|
||||||
printdebug("generateParam failed, NULL operand");
|
printdebug("generateParam failed, NULL operand");
|
||||||
return -1;
|
return -1;
|
||||||
@ -681,8 +682,31 @@ int generateParam(Instruction *inst) {
|
|||||||
printdebug("generateParam failed, %s is not in CGlist", getName(getTN(op1)));
|
printdebug("generateParam failed, %s is not in CGlist", getName(getTN(op1)));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
paramCount += 1;
|
||||||
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%edi\t#adding param start\n", getAddress(op1CG));
|
switch(paramCount) {
|
||||||
|
case 1:
|
||||||
|
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %s\t#adding param start\n", getAddress(op1CG), REG1);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %s\t#adding param start\n", getAddress(op1CG), REG2);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %s\t#adding param start\n", getAddress(op1CG), REG3);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %s\t#adding param start\n", getAddress(op1CG), REG4);
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %s\t#adding param start\n", getAddress(op1CG), REG5);
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %s\t#adding param start\n", getAddress(op1CG), REG6);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
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))));
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -712,16 +736,40 @@ int generateFunctionStart(Instruction *inst) {
|
|||||||
int paramOffset = 16;
|
int paramOffset = 16;
|
||||||
TableNode *tnToAdd = getFirstEntry(st);
|
TableNode *tnToAdd = getFirstEntry(st);
|
||||||
if (getAdInfoType(paramTN) != TYPE_RECORD_TYPE) {
|
if (getAdInfoType(paramTN) != TYPE_RECORD_TYPE) {
|
||||||
CGNode *paramCG = addCG(tnToAdd, offset);
|
CGNode *paramCG = addCG(tnToAdd, offset);
|
||||||
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%eax\t#FunctionStart1Param start\n", paramOffset);
|
paramOffset += getPrimSize(tnToAdd);
|
||||||
fprintf(cg_flag, "\tmovl\t%%eax, %d(%%rbp)\t#FunctionStart1param end\n", getAddress(paramCG));
|
fprintf(cg_flag, "\tmovl\t%%edi, %d(%%rbp)\t#FunctionStart1param end\n", getAddress(paramCG));
|
||||||
} else {
|
} else {
|
||||||
int numParams = getRecLength(paramTN);
|
int numParams = getRecLength(paramTN);
|
||||||
for (int i = 0; i < numParams; i++) {
|
for (int i = numParams; i > 0; i--) {
|
||||||
CGNode *paramCG = addCG(tnToAdd, offset);
|
CGNode *paramCG = addCG(tnToAdd, offset);
|
||||||
fprintf(cg_flag, "\tmovl\t%d(%%rbp), %%eax\t#FunctionStart1Param start\n", paramOffset);
|
switch(i) {
|
||||||
fprintf(cg_flag, "\tmovl\t%%eax, %d(%%rbp)\t#FunctionStart1param end\n", getAddress(paramCG));
|
case 1:
|
||||||
paramOffset = getPrimSize(getTypeEntry(tnToAdd));
|
fprintf(cg_flag, "\tmovl\t%s, %d(%%rbp)\t#FunctionStart1param end\n", REG1, getAddress(paramCG));
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
fprintf(cg_flag, "\tmovl\t%s, %d(%%rbp)\t#FunctionStart1param end\n", REG2, getAddress(paramCG));
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
fprintf(cg_flag, "\tmovl\t%s, %d(%%rbp)\t#FunctionStart1param end\n", REG3, getAddress(paramCG));
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
fprintf(cg_flag, "\tmovl\t%s, %d(%%rbp)\t#FunctionStart1param end\n", REG4, getAddress(paramCG));
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
fprintf(cg_flag, "\tmovl\t%s, %d(%%rbp)\t#FunctionStart1param end\n", REG5, getAddress(paramCG));
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
fprintf(cg_flag, "\tmovl\t%s, %d(%%rbp)\t#FunctionStart1param end\n", REG6, getAddress(paramCG));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
paramOffset += getPrimSize(getTypeEntry(tnToAdd));
|
||||||
|
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));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
tnToAdd = getNextEntry(tnToAdd);
|
tnToAdd = getNextEntry(tnToAdd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,13 @@
|
|||||||
#include "intermediate_code.h"
|
#include "intermediate_code.h"
|
||||||
#include "symbol_table.h"
|
#include "symbol_table.h"
|
||||||
|
|
||||||
|
#define REG1 "%edi"
|
||||||
|
#define REG2 "%esi"
|
||||||
|
#define REG3 "%edx"
|
||||||
|
#define REG4 "%ecx"
|
||||||
|
#define REG5 "%r8d"
|
||||||
|
#define REG6 "%r9d"
|
||||||
|
|
||||||
extern FILE *cg_flag;
|
extern FILE *cg_flag;
|
||||||
|
|
||||||
typedef struct CGNode {
|
typedef struct CGNode {
|
||||||
|
34
tests/sprint4/test/sp4_cg_calls.alpha
Normal file
34
tests/sprint4/test/sp4_cg_calls.alpha
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
(* TEST: [-asc -tc -cg -ir] *)
|
||||||
|
|
||||||
|
#include "std.alpha"
|
||||||
|
(* Standard Alpha Library - Provided by Carl *)
|
||||||
|
|
||||||
|
type string: 1 -> character
|
||||||
|
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
|
||||||
|
type main: string -> integer
|
||||||
|
function entry: main
|
||||||
|
function bar: T2
|
||||||
|
function ahh: T
|
||||||
|
|
||||||
|
ahh (a) := {
|
||||||
|
a := printInteger(a);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
bar (a, b, c,d,e,f,g) := {
|
||||||
|
a := printInteger(g);
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
|
||||||
|
entry (arg) := {
|
||||||
|
[integer:x; integer:y; integer: result]
|
||||||
|
|
||||||
|
result := bar(1,2,3,4,5,6,7);
|
||||||
|
return 1;
|
||||||
|
}
|
34
tests/sprint4/test/sp4_cg_calls.alpha~
Normal file
34
tests/sprint4/test/sp4_cg_calls.alpha~
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
(* TEST: [-asc -tc -cg -ir] *)
|
||||||
|
|
||||||
|
#include "std.alpha"
|
||||||
|
(* Standard Alpha Library - Provided by Carl *)
|
||||||
|
|
||||||
|
type string: 1 -> character
|
||||||
|
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
|
||||||
|
type main: string -> integer
|
||||||
|
function entry: main
|
||||||
|
function bar: T2
|
||||||
|
function ahh: T
|
||||||
|
|
||||||
|
ahh (a) := {
|
||||||
|
a := printInteger(a);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
bar (a, b, c,d,e,f,g) := {
|
||||||
|
a := printInteger(f);
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
|
||||||
|
entry (arg) := {
|
||||||
|
[integer:x; integer:y; integer: result]
|
||||||
|
|
||||||
|
result := bar(1,2,3,4,5,6,7);
|
||||||
|
return 1;
|
||||||
|
}
|
Reference in New Issue
Block a user