2
0
Эх сурвалжийг харах

corrected alignment for WinAPI64

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@7415 8c9fc860-2736-0410-a75d-ab315db34111
felixf 7 жил өмнө
parent
commit
7e2f165f62

+ 15 - 3
source/FoxIntermediateBackend.Mod

@@ -5685,7 +5685,13 @@ TYPE
 			IF alignment > 1 THEN
 			IF alignment > 1 THEN
 				IntermediateCode.InitRegister(reg,addressType,IntermediateCode.GeneralPurposeRegister,AcquireRegister(addressType,IntermediateCode.GeneralPurposeRegister));
 				IntermediateCode.InitRegister(reg,addressType,IntermediateCode.GeneralPurposeRegister,AcquireRegister(addressType,IntermediateCode.GeneralPurposeRegister));
 				Emit(Mov(position,reg, sp));
 				Emit(Mov(position,reg, sp));
-				gap := ParametersSize(system, procedureType, FALSE) + ToMemoryUnits(system,system.offsetFirstParameter) + ToMemoryUnits(system,system.addressSize);
+				gap := ParametersSize(system, procedureType, FALSE); 
+				IF (procedureType.callingConvention = SyntaxTree.WinAPICallingConvention) & (system.addressSize =64) THEN
+					IF gap < 4*ToMemoryUnits(system,system.addressSize) THEN 
+						gap := 4*ToMemoryUnits(system,system.addressSize); (* at least four registers get pushed*)
+					END;
+				END;
+				gap := gap + ToMemoryUnits(system,system.offsetFirstParameter) + ToMemoryUnits(system,system.addressSize);
 
 
 				Emit(Sub(position,sp, sp, IntermediateCode.Immediate(addressType,gap)));
 				Emit(Sub(position,sp, sp, IntermediateCode.Immediate(addressType,gap)));
 				IntermediateCode.InitImmediate(mask,addressType,-alignment);
 				IntermediateCode.InitImmediate(mask,addressType,-alignment);
@@ -14222,12 +14228,18 @@ TYPE
 			parSize := parSize + (-parSize) MOD system.addressSize;
 			parSize := parSize + (-parSize) MOD system.addressSize;
 		END;
 		END;
 
 
+		
 		parameter :=procedureType.lastParameter;
 		parameter :=procedureType.lastParameter;
 		WHILE (parameter # NIL) DO
 		WHILE (parameter # NIL) DO
-			INC(parSize,system.SizeOfParameter(parameter));
-			parSize := parSize + (-parSize) MOD system.addressSize;
+			IF SysvABIorWINAPI(procedureType.callingConvention) THEN
+				INC(parSize, system.addressSize); 
+			ELSE
+				INC(parSize,system.SizeOfParameter(parameter));
+				parSize := parSize + (-parSize) MOD system.addressSize;
+			END;
 			parameter := parameter.prevParameter;
 			parameter := parameter.prevParameter;
 		END;
 		END;
+		
 
 
 		IF procedureType.selfParameter # NIL THEN
 		IF procedureType.selfParameter # NIL THEN
 			parameter := procedureType.selfParameter;
 			parameter := procedureType.selfParameter;