packages feed

ghc-heap-view-0.5.2: cbits/HeapViewPrim.cmm

#include "Cmm.h"

#if GHC_7_7

aToWordzh (P_ clos)
{
	return (clos);
}

slurpClosurezh ( P_ closure )
{
    W_ info, ptrs, nptrs, p, ptrs_arr, dat_arr;
    info  = %GET_STD_INFO(UNTAG(closure));

    ptrs  = TO_W_(%INFO_PTRS(info));
    nptrs = TO_W_(%INFO_NPTRS(info));

    W_ clos;
    clos = UNTAG(closure);

    W_ len;
    (len) = foreign "C" gtc_heap_view_closureSize(clos "ptr");

    W_ ptrs_arr_sz, ptrs_arr_cards, dat_arr_sz;
    dat_arr_sz = SIZEOF_StgArrWords + WDS(len);

    ALLOC_PRIM_P (dat_arr_sz, slurpClosurezh, closure);

    dat_arr = Hp - dat_arr_sz + WDS(1);


    SET_HDR(dat_arr, stg_ARR_WORDS_info, CCCS);
    StgArrWords_bytes(dat_arr) = WDS(len);
    p = 0;
for:
    if(p < len) {
         W_[BYTE_ARR_CTS(dat_arr) + WDS(p)] = W_[clos + WDS(p)];
         p = p + 1;
         goto for;
    }

    W_ ptrArray;

    ("ptr" ptrArray) = foreign "C" gtc_heap_view_closurePtrs(MyCapability() "ptr", clos "ptr");

    return (info, dat_arr, ptrArray);
}


reallyUnsafePtrEqualityUpToTag (W_ clos1, W_  clos2)
{
    clos1 = UNTAG(clos1);
    clos2 = UNTAG(clos2);
    return (clos1 == clos2);
}

#else
aToWordzh
{
	W_ clos;
	clos = R1;
    	RET_N(clos);
}

// Taken from stg_unpackClosurezh in rts/PrimOps.cmm
slurpClosurezh
{
/* args: R1 = closure to analyze */

    W_ clos, len;
    clos = UNTAG(R1);

    W_ info;
    info = %GET_STD_INFO(clos);

    (len) = foreign "C" gtc_heap_view_closureSize(clos "ptr") [R1];

    W_ data_arr_sz;
    data_arr_sz = SIZEOF_StgArrWords  + WDS(len);

    ALLOC_PRIM (data_arr_sz, R1_PTR, slurpClosurezh);

    W_ data_arr;
    data_arr = Hp - data_arr_sz + WDS(1);

    SET_HDR(data_arr, stg_ARR_WORDS_info, CCCS);
    StgArrWords_bytes(data_arr) = WDS(len);
    W_ p;
    p = 0;
for:
    if(p < len) {
    	 // W_[BYTE_ARR_CTS(data_arr) + WDS(p)] = StgClosure_payload(clos, p);
    	 W_[BYTE_ARR_CTS(data_arr) + WDS(p)] = W_[clos + WDS(p)];
    	 p = p + 1;
	 goto for;
    }

    W_ ptrArray;

    ("ptr" ptrArray) = foreign "C" gtc_heap_view_closurePtrs(MyCapability() "ptr", clos "ptr") [];

    RET_NPP(info, data_arr, ptrArray);
}

reallyUnsafePtrEqualityUpToTag
{
    W_ clos1;
    W_ clos2;
    clos1 = UNTAG(R1);
    clos2 = UNTAG(R2);
    RET_N(clos1 == clos2);
}
#endif