Fix: Arguments that don't fit into registeres are passed in the incorrect order

This commit is contained in:
Marvin Kaiser
2019-12-17 17:22:44 +01:00
parent 5745062704
commit 08f486203b
3 changed files with 11 additions and 10 deletions

View File

@@ -222,20 +222,21 @@ public class GenASM implements Visitor<Void> {
this.env = new HashMap<String, Integer>();
// Merke dir die offsets der parameter, die direkt auf den stack gelegt wurden
int m = e.parameters.length - this.rs.length;
for (int i = this.rs.length; i < e.parameters.length; i++) {
int j = i - this.rs.length;
this.env.put(e.parameters[i], (((m - j) + 1) * 8)); // positiv, liegt über unserem stack frame
}
int offset = 16; // Per Stack übergebene Parameter liegen über unserm BSP
// Per stack übergebene variablen in env registrieren
for (int i = this.rs.length; i < e.parameters.length; i++) {
env.put(e.parameters[i], offset);
offset += 8;
}
// pushe die aufrufparameter aus den Registern wieder auf den Stack
int offset = 0;
offset = 0;
for (int i = 0; i < Math.min(this.rs.length, e.parameters.length); i++) {
this.ex.write(" pushq " + this.rs[i] + "\n");
offset -= 8;
this.env.put(e.parameters[i], offset); // negative, liegt unter aktuellem BP
}
// Reserviere Platz auf dem Stack für jede lokale variable
for (String lok_var : vars) {
offset -= 8;
@@ -256,7 +257,7 @@ public class GenASM implements Visitor<Void> {
}
// Den Rest auf den stack pushen
for (int i = this.rs.length; i < e.arguments.length; i++) {
for (int i = e.arguments.length -1; i >= this.rs.length; i--) {
e.arguments[i].welcome(this);
this.ex.write(" pushq %rax\n");
}

View File

@@ -21,7 +21,7 @@ int argumentTest(char* name, int expected, int result) {
int runFunctionCallTests () {
int failed = 0;
printf("\nFunctionCallTests Tests \n");
printf("\nFunction Call Tests \n");
// Checks that parameters are correctly passed from gcc to functions
failed += argumentTest("arg1", 1, arg1(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
failed += argumentTest("arg2", 2, arg2(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));

View File

@@ -105,7 +105,7 @@ int main(){
failed += testOneArg("id", cId, id, -1);
failed += testOneArg("id", cId, id, 15);
printf("\nFunction Argument Tests\n");
// Test for passing arguments to functions
failed += runFunctionCallTests();
printf("\n=== Failed Tests: %d\n", failed);