[MLton-commit] r5370

Matthew Fluet fluet at mlton.org
Wed Feb 28 18:10:47 PST 2007

Going to 64-bit headers and array lengths on 64-bit executables.

See commit r5322 for more details on preliminary 64-bit executables.

This commit "fixes" the mark-compact collector.  The issue is that the
mark-compact collector threads object pointers through headers.

We might be able to get by with 32-bit headers, if every object was
required to have 32-bits of non-object-pointers after the header.  (It
would be o.k. if these bits were from object data.)  However, this
wouldn't suffice for an array of object pointers, since adding another
32-bits at the beginning of the array would break offsets; and adding
32-bits to every element (just to get 32-bits at the beginning of the
object) is too much of a space waste.

So, we need to go with 64-bit headers.  However, advanceToObjectData
assumes that one can distinguish between the beginning of a normal
object header and the beginning of an array object header by looking
for the 0 of the array counter word.  So, array counters need to be
64-bits, and since the compiler currently assumes that the array
counter and the array length fields of an array header are the same
size, array lengths need to be 64-bits.

Note that the default integer size is still Int32.int, so Array.maxLen
(and array indexes) are still only 32-bits (from user code).

Haven't tested very large arrays with -default-ty int64.


U   mlton/branches/on-20050822-x86_64-branch/mlton/main/main.fun
U   mlton/branches/on-20050822-x86_64-branch/runtime/gc/array.h
U   mlton/branches/on-20050822-x86_64-branch/runtime/gc/object.h


Modified: mlton/branches/on-20050822-x86_64-branch/mlton/main/main.fun
--- mlton/branches/on-20050822-x86_64-branch/mlton/main/main.fun	2007-03-01 01:53:20 UTC (rev 5369)
+++ mlton/branches/on-20050822-x86_64-branch/mlton/main/main.fun	2007-03-01 02:10:46 UTC (rev 5370)
@@ -694,10 +694,10 @@
                    cpointer = word64,
                    cptrdiff = word64,
                    csize = word64,
-                   header = word32,
+                   header = word64,
                    mplimb = word64,
                    objptr = word64,
-                   seqIndex = word32}
+                   seqIndex = word64}
           | _ =>

Modified: mlton/branches/on-20050822-x86_64-branch/runtime/gc/array.h
--- mlton/branches/on-20050822-x86_64-branch/runtime/gc/array.h	2007-03-01 01:53:20 UTC (rev 5369)
+++ mlton/branches/on-20050822-x86_64-branch/runtime/gc/array.h	2007-03-01 02:10:46 UTC (rev 5370)
@@ -20,15 +20,28 @@
  * the number of elements in the array.  Array elements have the same
  * individual layout as normal objects, omitting the header word.
 typedef uint32_t GC_arrayLength;
 #define GC_ARRAY_LENGTH_SIZE sizeof(GC_arrayLength)
 #define PRIxARRLEN PRIu32
 typedef GC_arrayLength GC_arrayCounter;
 #define GC_ARRAY_COUNTER_SIZE sizeof(GC_arrayCounter)
-#define PRIxARRCTR PRIu32
+typedef uint64_t GC_arrayLength;
+#define GC_ARRAY_LENGTH_SIZE sizeof(GC_arrayLength)
+#define PRIxARRLEN PRIu64
+typedef GC_arrayLength GC_arrayCounter;
+#define GC_ARRAY_COUNTER_SIZE sizeof(GC_arrayCounter)
 #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */

Modified: mlton/branches/on-20050822-x86_64-branch/runtime/gc/object.h
--- mlton/branches/on-20050822-x86_64-branch/runtime/gc/object.h	2007-03-01 01:53:20 UTC (rev 5369)
+++ mlton/branches/on-20050822-x86_64-branch/runtime/gc/object.h	2007-03-01 02:10:46 UTC (rev 5370)
@@ -39,20 +39,32 @@
  * 20 - 30   : counter bits, used by mark compact GC (initially 0)
  *      31   : mark bit, used by mark compact GC (initially 0)
 typedef uint32_t GC_header;
 #define GC_HEADER_SIZE sizeof(GC_header)
 #define PRIxHDR PRIx32
 #define FMTHDR "0x%08"PRIxHDR
+typedef uint64_t GC_header;
+#define GC_HEADER_SIZE sizeof(GC_header)
+#define PRIxHDR PRIx64
+#define FMTHDR "0x%08"PRIxHDR
+#error GC_header undefined
 #define GC_VALID_HEADER_MASK ((GC_header)0x1)
 #define TYPE_INDEX_BITS    19
-#define TYPE_INDEX_MASK    0x000FFFFE
+#define TYPE_INDEX_MASK    ((GC_header)0x000FFFFE)
 #define TYPE_INDEX_SHIFT   1
 #define COUNTER_BITS       10
-#define COUNTER_MASK       0x7FF00000
+#define COUNTER_MASK       ((GC_header)0x7FF00000)
 #define COUNTER_SHIFT      20
 #define MARK_BITS          1
-#define MARK_MASK          0x80000000
+#define MARK_MASK          ((GC_header)0x80000000)
 #define MARK_SHIFT         31
 #endif /* (defined (MLTON_GC_INTERNAL_TYPES)) */

More information about the MLton-commit mailing list