From 08f486203b026461d56386ce069ea5df1f47dc52 Mon Sep 17 00:00:00 2001 From: Marvin Kaiser Date: Tue, 17 Dec 2019 17:22:44 +0100 Subject: [PATCH] Fix: Arguments that don't fit into registeres are passed in the incorrect order --- .../de/hsrm/compiler/Klang/visitors/GenASM.java | 17 +++++++++-------- src/test/functionCall/functionCall.c | 2 +- src/test/testCode.c | 2 +- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/main/java/de/hsrm/compiler/Klang/visitors/GenASM.java b/src/main/java/de/hsrm/compiler/Klang/visitors/GenASM.java index a0fbcd2..fcb2597 100644 --- a/src/main/java/de/hsrm/compiler/Klang/visitors/GenASM.java +++ b/src/main/java/de/hsrm/compiler/Klang/visitors/GenASM.java @@ -222,20 +222,21 @@ public class GenASM implements Visitor { this.env = new HashMap(); // 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 { } // 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"); } diff --git a/src/test/functionCall/functionCall.c b/src/test/functionCall/functionCall.c index fc30112..b097e95 100644 --- a/src/test/functionCall/functionCall.c +++ b/src/test/functionCall/functionCall.c @@ -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)); diff --git a/src/test/testCode.c b/src/test/testCode.c index 865c775..609306f 100644 --- a/src/test/testCode.c +++ b/src/test/testCode.c @@ -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);