浏览代码

Small but important issues: compiler can compile itself with GC metadata enabled now

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6722 8c9fc860-2736-0410-a75d-ab315db34111
felixf 9 年之前
父节点
当前提交
bd78335e20
共有 2 个文件被更改,包括 18 次插入3 次删除
  1. 1 1
      source/FoxIntermediateBackend.Mod
  2. 17 2
      source/Heaps.Mod

+ 1 - 1
source/FoxIntermediateBackend.Mod

@@ -9102,7 +9102,7 @@ TYPE
 				result.op := basereg;
 				parametersSize := ProcedureParametersSize(system,scope(SyntaxTree.ProcedureScope).ownerProcedure);
 				IntermediateCode.AddOffset(result.op,ToMemoryUnits(system,addressType.sizeInBits)+parametersSize);
-				IF backend.cooperative THEN
+				IF backend.cooperative OR PreciseGCSupport THEN
 					IntermediateCode.AddOffset(result.op,ToMemoryUnits(system,addressType.sizeInBits));
 				END;
 				(* tag must be loaded when dereferencing SELF pointer *)

+ 17 - 2
source/Heaps.Mod

@@ -152,11 +152,12 @@ TYPE
 		first: ADDRESS;
 	END;
 	
-	StackBlock = POINTER{UNSAFE} TO StackBlockDesc;
+	(*StackBlock = POINTER{UNSAFE} TO StackBlockDesc;
 	StackBlockDesc= RECORD
 		link: StackBlock;
 		pc: ADDRESS;
 	END;
+	*)
 	
 	(* a single pointer -- required as base type TD for array of pointer
 		Don't rename this. Compiler refers to this TD by name
@@ -1092,12 +1093,26 @@ BEGIN
 	END;
 END NewBlock;
 
+PROCEDURE CheckBP(bp: ADDRESS): ADDRESS;
+VAR n: ADDRESS;
+BEGIN
+	SYSTEM.GET(bp,n);
+	IF ODD(n) THEN  bp := bp + SIZEOF(ADDRESS) END;
+	RETURN bp;
+END CheckBP;
+
 PROCEDURE SetPC(p: DataBlockU);
-VAR stackDesc: StackBlock;
+VAR bp: ADDRESS;
 BEGIN
 	IF p # NIL THEN
+		bp := CheckBP(Machine.CurrentBP()); 
+		SYSTEM.GET(bp, bp); 
+		bp := CheckBP(bp);
+		SYSTEM.GET(bp+SIZEOF(ADDRESS), p.heapBlock.heapBlock);
+		(*
 		stackDesc := Machine.CurrentBP();
 		p.heapBlock.heapBlock := stackDesc.link.pc;
+		*)
 	END;
 END SetPC;