소스 검색

Fixed gap computation for 64-bit SysvABI which depends on how many actual registers have been passed (including floating-point values)

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@8334 8c9fc860-2736-0410-a75d-ab315db34111
negelef 7 년 전
부모
커밋
935314776f
1개의 변경된 파일15개의 추가작업 그리고 1개의 파일을 삭제
  1. 15 1
      source/FoxIntermediateBackend.Mod

+ 15 - 1
source/FoxIntermediateBackend.Mod

@@ -5905,7 +5905,21 @@ TYPE
 						gap := 4*ToMemoryUnits(system,system.addressSize); 
 					END;
 				ELSIF (callingConvention IN SysvABI) & (system.addressSize =64) THEN
-					gap := gap - 6*ToMemoryUnits(system,system.addressSize); (* the first 6 parameters are passed via registers in SysVABI *)
+					backend.ResetParameterRegisters();
+					formalParameter := procedureType.firstParameter;
+					FOR i := 0 TO parameters.Length()-1 DO 
+						IF (formalParameter.kind = SyntaxTree.VarParameter) THEN
+							type := addressType;						
+						ELSIF formalParameter.type.IsRecordType() OR (formalParameter.type.resolved IS SyntaxTree.ArrayType) THEN
+							type := addressType;
+						ELSE
+							type := GetType(system, formalParameter.type);
+						END;
+						IF backend.GetParameterRegister(callingConvention, type, registers[i]) THEN
+							DEC (gap, ToMemoryUnits(system,system.addressSize))
+						END;
+						formalParameter := formalParameter.nextParameter;
+					END;
 					IF gap < 0 THEN 
 						gap := 0
 					END;