Преглед на файлове

Make sure that the compiler does not run into false pointers (runtime part)

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@7169 8c9fc860-2736-0410-a75d-ab315db34111
felixf преди 8 години
родител
ревизия
2a4edb8691
променени са 2 файла, в които са добавени 26 реда и са изтрити 11 реда
  1. 25 10
      source/Heaps.Mod
  2. 1 1
      source/Win32.Objects.Mod

+ 25 - 10
source/Heaps.Mod

@@ -13,6 +13,10 @@ MODULE Heaps;	(** AUTHOR "pjm/Luc Bläser/U. Glavitsch (ug)"; PURPOSE "Heap mana
 IMPORT SYSTEM, Trace, Machine;
 
 CONST
+	Paranoid = TRUE; (* if paranoid =true, then during mark phase the GC can accept spurious pointers but reports them
+									paranoid = false enforces correct metadata and correct settings of untraced variables
+									moreover, it should improve GC mark speed *)
+
 	DebugValue = LONGINT(0DEADDEADH);	(* set non-0 to clear free storage to this value *)
 
 	Stats* = TRUE;					(* maintain statistical counters *)
@@ -242,21 +246,25 @@ END SetAllocationLogger;
 
 (* check validity of p *)
 PROCEDURE CheckPointer(p: ADDRESS): BOOLEAN;
-VAR ret: BOOLEAN; heapBlockAdr, tdAdr: ADDRESS;
+VAR 
+	tdAdr: ADDRESS;
+	block: Block; 
 BEGIN
-	ret := FALSE;
-	IF Machine.ValidHeapAddress(p+HeapBlockOffset)THEN
-		SYSTEM.GET(p + HeapBlockOffset, heapBlockAdr);
-		IF Machine.ValidHeapAddress(heapBlockAdr + TypeDescOffset) THEN
-			SYSTEM.GET(heapBlockAdr + TypeDescOffset, tdAdr);
+	block := p;
+	IF (block # NIL) & Machine.ValidHeapAddress(ADDRESS OF block.heapBlock)THEN
+		block := block.heapBlock;
+		IF (block # NIL) & Machine.ValidHeapAddress(ADDRESS OF block.typeBlock) THEN
+			tdAdr := block.typeBlock;
 			IF (tdAdr = systemBlockTag) OR (tdAdr = recordBlockTag) OR (tdAdr = protRecBlockTag) OR (tdAdr = arrayBlockTag) THEN
-				ret := TRUE
+				RETURN TRUE;
 			END
 		END
 	END;
-	RETURN ret
+	Trace.String("Heaps: invalid pointer encountered: "); Trace.Address(p); Trace.String(","); Trace.Address(block); Trace.Ln;
+	RETURN FALSE
 END CheckPointer;
 
+
 PROCEDURE AppendToMarkList(heapBlock: HeapBlock);
 BEGIN
 	IF markList.first = NIL THEN
@@ -286,7 +294,7 @@ VAR
 	blockMeta : Block;
 BEGIN
 	(* ug: check for validity of block is necessary since users may assign values to pointer variables that are not real heap blocks, e.g. by using SYSTEM.VAL or ADDRESSOF *)
-	IF (block = NIL) OR ~CheckPointer(block) THEN RETURN END;
+	IF (block = NIL) OR Paranoid & ~CheckPointer(block) THEN RETURN END;
 	blockMeta := block;
 	heapBlock := blockMeta.heapBlock; 
 	IF (heapBlock = NIL) OR (heapBlock.mark >= currentMarkValue) THEN RETURN END;
@@ -319,6 +327,13 @@ BEGIN
 		orgBlock := orgHeapBlock.dataAdr;
 		meta := orgBlock;
 		staticTypeBlock := meta.staticTypeBlock;
+		(*
+		IF TraceInvalid THEN 
+			TRACE(orgBlock);  
+			IF staticTypeBlock # NIL THEN WriteType(staticTypeBlock); END
+		END;
+		*)
+		
 		IF ~(orgHeapBlock IS ArrayBlock) THEN
 			FOR i := 0 TO LEN(staticTypeBlock.pointerOffsets) - 1 DO
 				b := orgBlock + staticTypeBlock.pointerOffsets[i];
@@ -1552,7 +1567,7 @@ TraceHeap:
 11.07.2008 	ug	new heap data structures and adaption to GC
 *)
 
-Compiler.Compile -p=Win32G --traceModule=Trace Heaps.Mod ~
+Compiler.Compile -p=Win32G --traceModule=Trace  Heaps.Mod ~
 StaticLinker.Link --fileFormat=PE32 --fileName=A2M.exe --extension=GofW --displacement=401000H Runtime Trace Kernel32 Machine Heaps Modules Objects Kernel KernelLog Streams Commands FIles WinFS Clock Dates Reals Strings Diagnostics BitSets StringPool ObjectFile GenericLinker Reflection  GenericLoader  BootConsole ~
 FSTools.CloseFiles A2M.exe ~
 

+ 1 - 1
source/Win32.Objects.Mod

@@ -163,7 +163,7 @@ TYPE
 
 		PROCEDURE FindRoots;   (* override, called while GC, replaces Threads.CheckStacks *)
 		VAR sp: ADDRESS; res: Kernel32.BOOL; pc, bp: ADDRESS;
-			n,adr: ADDRESS; desc: Modules.ProcedureDescPointer; i: LONGINT; p {UNTRACED}: ANY;
+			n,adr: ADDRESS; desc {UNTRACED}: Modules.ProcedureDescPointer; i: LONGINT; p {UNTRACED}: ANY;
 			context: Kernel32.Wow64Context;
 			a0,a1, obp, osb, osbp, opc, gbp: ADDRESS;
 		BEGIN