MERGE: Fix Windows DEP violations (bug #885)
[ghc-hetmet.git] / rts / sm / Storage.c
index 31af78f..ddae8c6 100644 (file)
@@ -578,7 +578,7 @@ allocate( nat n )
        nat req_blocks =  (lnat)BLOCK_ROUND_UP(n*sizeof(W_)) / BLOCK_SIZE;
        bd = allocGroup(req_blocks);
        dbl_link_onto(bd, &g0s0->large_objects);
-       g0s0->n_large_blocks += req_blocks;
+       g0s0->n_large_blocks += bd->blocks; // might be larger than req_blocks
        bd->gen_no  = 0;
        bd->step = g0s0;
        bd->flags = BF_LARGE;
@@ -662,7 +662,7 @@ allocateLocal (Capability *cap, nat n)
        ACQUIRE_SM_LOCK;
        bd = allocGroup(req_blocks);
        dbl_link_onto(bd, &g0s0->large_objects);
-       g0s0->n_large_blocks += req_blocks;
+       g0s0->n_large_blocks += bd->blocks; // might be larger than req_blocks
        bd->gen_no  = 0;
        bd->step = g0s0;
        bd->flags = BF_LARGE;
@@ -979,6 +979,11 @@ calcNeeded(void)
    in the page, and when the page is emptied (all objects on the page
    are free) we free the page again, not forgetting to make it
    non-executable.
+
+   TODO: The inability to handle objects bigger than BLOCK_SIZE_W means that
+         the linker cannot use allocateExec for loading object code files
+         on Windows. Once allocateExec can handle larger objects, the linker
+         should be modified to use allocateExec instead of VirtualAlloc.
    ------------------------------------------------------------------------- */
 
 static bdescr *exec_block;