Quellcode durchsuchen

corrected SYSVABI procedure calls

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6639 8c9fc860-2736-0410-a75d-ab315db34111
eth.guenter vor 9 Jahren
Ursprung
Commit
0e1d8dfa4e
1 geänderte Dateien mit 9 neuen und 3 gelöschten Zeilen
  1. 9 3
      source/FoxIntermediateBackend.Mod

+ 9 - 3
source/FoxIntermediateBackend.Mod

@@ -5537,10 +5537,15 @@ TYPE
 				ReleaseIntermediateOperand(reg);
 			END;
 
-			IF (procedureType.callingConvention = SyntaxTree.DarwinCCallingConvention) & (system.addressSize = 32) THEN
+			IF SysvABI(procedureType.callingConvention) & (system.addressSize = 32) THEN
 				(* align stack to 16-byte boundary *)
 				IntermediateCode.InitImmediate(mask,addressType,-16);
-				Emit(And(position,sp, sp, mask))		
+				Emit(And(position,sp, sp, mask));
+				gap := (-ParametersSize( system, procedureType, FALSE )) MOD 16;
+				IF gap # 0 THEN
+					IntermediateCode.InitImmediate(size,addressType,gap);
+					Emit(Sub(position,sp,sp,size))
+				END;
 			END;
 
 			IF x.left IS SyntaxTree.SupercallDesignator THEN
@@ -5784,7 +5789,8 @@ TYPE
 						parametersSize := 0
 					END;
 				ELSE
-					parametersSize := ToMemoryUnits(system,parameters.Length()*addressType.sizeInBits)
+					parametersSize := ToMemoryUnits(system,parameters.Length()*addressType.sizeInBits);
+					INC( parametersSize, (-parametersSize) MOD 16 )
 				END;
 				IF parametersSize > 0 THEN
 					size := IntermediateCode.Immediate(addressType,parametersSize);