ghc-heap-view 0.5.9 → 0.5.10
raw patch · 6 files changed
+62/−154 lines, 6 filesdep ~basedep ~ghcPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: base, ghc
API changes (from Hackage documentation)
Files
- Test.hs +5/−1
- cbits/HeapView.c +22/−17
- cbits/HeapViewPrim.cmm +0/−114
- ghc-heap-view.cabal +20/−14
- src/GHC/Disassembler.hs +0/−1
- src/GHC/HeapView.hs +15/−7
Test.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE MagicHash, BangPatterns #-}+{-# LANGUAGE MagicHash, BangPatterns, CPP #-} import GHC.Exts import GHC.HeapView@@ -27,7 +27,11 @@ unless eq $ fail "Doesn't reference list" getClosureData args >>= \ cl ->+#if MIN_VERSION_GLASGOW_HASKELL(8,1,0,0)+ assertClosureType CONSTR_0_1 (info cl)+#else assertClosureType CONSTR_NOCAF_STATIC (info cl)+#endif getClosureData x >>= \ cl -> assertClosureType THUNK_2_0 (info cl)
cbits/HeapView.c view
@@ -6,9 +6,9 @@ } static void-gtc_heap_view_closure_ptrs_in_large_bitmap(StgClosure *ptrs[], StgWord *nptrs, StgClosure **p, StgLargeBitmap *large_bitmap, nat size )+gtc_heap_view_closure_ptrs_in_large_bitmap(StgClosure *ptrs[], StgWord *nptrs, StgClosure **p, StgLargeBitmap *large_bitmap, uint32_t size ) {- nat i, j, b;+ uint32_t i, j, b; StgWord bitmap; b = 0;@@ -35,8 +35,12 @@ [CONSTR_2_0] = "CONSTR_2_0", [CONSTR_1_1] = "CONSTR_1_1", [CONSTR_0_2] = "CONSTR_0_2",+#if defined(GHC_8_0) [CONSTR_STATIC] = "CONSTR_STATIC", [CONSTR_NOCAF_STATIC] = "CONSTR_NOCAF_STATIC",+#else+ [CONSTR_NOCAF] = "CONSTR_NOCAF",+#endif [FUN] = "FUN", [FUN_1_0] = "FUN_1_0", [FUN_0_1] = "FUN_0_1",@@ -57,18 +61,13 @@ [PAP] = "PAP", [AP_STACK] = "AP_STACK", [IND] = "IND",-#ifdef MIN_VERSION_GLASGOW_HASKELL-#if !MIN_VERSION_GLASGOW_HASKELL(8,1,0,0)+#if defined(GHC_8_0) [IND_PERM] = "IND_PERM", #endif-#endif [IND_STATIC] = "IND_STATIC", [RET_BCO] = "RET_BCO", [RET_SMALL] = "RET_SMALL", [RET_BIG] = "RET_BIG",-#if !defined(GHC_7_7) && !defined(GHC_8_0)- [RET_DYN] = "RET_DYN",-#endif [RET_FUN] = "RET_FUN", [UPDATE_FRAME] = "UPDATE_FRAME", [CATCH_FRAME] = "CATCH_FRAME",@@ -78,9 +77,6 @@ [BLOCKING_QUEUE] = "BLOCKING_QUEUE", [MVAR_CLEAN] = "MVAR_CLEAN", [MVAR_DIRTY] = "MVAR_DIRTY",-#if defined(GHC_7_7) || defined(GHC_8_0)- [TVAR] = "TVAR",-#endif [ARR_WORDS] = "ARR_WORDS", [MUT_ARR_PTRS_CLEAN] = "MUT_ARR_PTRS_CLEAN", [MUT_ARR_PTRS_DIRTY] = "MUT_ARR_PTRS_DIRTY",@@ -97,13 +93,20 @@ [ATOMICALLY_FRAME] = "ATOMICALLY_FRAME", [CATCH_RETRY_FRAME] = "CATCH_RETRY_FRAME", [CATCH_STM_FRAME] = "CATCH_STM_FRAME",- [WHITEHOLE] = "WHITEHOLE"+ [WHITEHOLE] = "WHITEHOLE",+ [SMALL_MUT_ARR_PTRS_CLEAN] = "SMALL_MUT_ARR_PTRS_CLEAN",+ [SMALL_MUT_ARR_PTRS_DIRTY] = "SMALL_MUT_ARR_PTRS_DIRTY",+ [SMALL_MUT_ARR_PTRS_FROZEN0] = "SMALL_MUT_ARR_PTRS_FROZEN0",+ [SMALL_MUT_ARR_PTRS_FROZEN] = "SMALL_MUT_ARR_PTRS_FROZEN",+#if defined(GHC_8_2)+ [COMPACT_NFDATA] = "COMPACT_NFDATA",+#endif }; void gtc_heap_view_closure_ptrs_in_pap_payload(StgClosure *ptrs[], StgWord *nptrs, StgClosure *fun, StgClosure **payload, StgWord size) { StgWord bitmap;- StgFunInfoTable *fun_info;+ const StgFunInfoTable *fun_info; fun_info = get_fun_itbl(UNTAG_CLOSURE(fun)); // ASSERT(fun_info->i.type != PAP);@@ -150,7 +153,7 @@ StgClosure **end; StgClosure **ptr; - StgInfoTable *info = get_itbl(closure);+ const StgInfoTable *info = get_itbl(closure); StgThunkInfoTable *thunk_info; StgFunInfoTable *fun_info; @@ -170,8 +173,12 @@ case CONSTR_1_1: case CONSTR_0_2: case CONSTR:+#if defined(GHC_8_0) case CONSTR_STATIC: case CONSTR_NOCAF_STATIC:+#else+ case CONSTR_NOCAF:+#endif case PRIM: case FUN:@@ -234,10 +241,8 @@ break; case IND:-#ifdef MIN_VERSION_GLASGOW_HASKELL-#if !MIN_VERSION_GLASGOW_HASKELL(8,1,0,0)+#if defined(GHC_8_0) case IND_PERM:-#endif #endif case IND_STATIC: case BLACKHOLE:
cbits/HeapViewPrim.cmm view
@@ -1,7 +1,5 @@ #include "Cmm.h" -#if GHC_8_0- aToWordzh (P_ clos) { return (clos);@@ -53,115 +51,3 @@ clos2 = UNTAG(clos2); return (clos1 == clos2); }--#elif 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
ghc-heap-view.cabal view
@@ -1,5 +1,5 @@ Name: ghc-heap-view-Version: 0.5.9+Version: 0.5.10 Synopsis: Extract the heap representation of Haskell values and thunks Description: This library provides functions to introspect the Haskell heap, for example@@ -48,7 +48,7 @@ bug-reports: https://github.com/nomeata/ghc-heap-view Category: Debug, GHC Build-type: Custom-Cabal-version: >=1.14+Cabal-version: >=1.23 Extra-source-files: Demo.hs data-files: ghci @@ -56,10 +56,15 @@ Description: The used GHC supports Any as an argument to foreign prim functions (GHC ticket #5931) Default: False -Flag ghc_7_7- Flag ghc_8_0 +Flag ghc_8_2++custom-setup+ setup-depends: base+ setup-depends: filepath+ setup-depends: Cabal >= 1.24 && < 2.1+ Library Default-Language: Haskell2010 Exposed-modules:@@ -68,24 +73,25 @@ GHC.Disassembler GHC.HeapView.Debug Build-depends:- base >= 4.5 && < 4.10,+ base >= 4.5 && < 4.11, containers, transformers, template-haskell, bytestring >= 0.10, binary - if flag(ghc_7_7)- build-depends: ghc >= 7.7 && < 8- cc-options: -DGHC_7_7- cpp-options: -DGHC_7_7+ if flag(ghc_8_0)+ build-depends: ghc >= 8.0 && < 8.2+ cc-options: -DGHC_8_0+ cpp-options: -DGHC_8_0 else- if flag(ghc_8_0)- build-depends: ghc >= 8- cc-options: -DGHC_8_0- cpp-options: -DGHC_8_0+ if flag(ghc_8_2)+ build-depends: ghc >= 8.2 && < 8.4+ cc-options: -DGHC_8_2+ cpp-options: -DGHC_8_2 else- build-depends: ghc < 7.7+ build-depends: ghc == 0.0+ C-Sources: cbits/HeapView.c cbits/HeapViewPrim.cmm Hs-source-dirs: src/
src/GHC/Disassembler.hs view
@@ -16,7 +16,6 @@ import Data.Foldable ( Foldable ) import Data.Traversable ( Traversable ) import Control.Applicative ((<$>))-import Data.Monoid #include "ghcautoconf.h" #include "rts/Bytecodes.h"
src/GHC/HeapView.hs view
@@ -214,8 +214,12 @@ | CONSTR_2_0 | CONSTR_1_1 | CONSTR_0_2+#if defined(GHC_8_0) | CONSTR_STATIC | CONSTR_NOCAF_STATIC+#else+ | CONSTR_NOCAF+#endif | FUN | FUN_1_0 | FUN_0_1@@ -236,14 +240,13 @@ | PAP | AP_STACK | IND+#if defined(GHC_8_0) | IND_PERM+#endif | IND_STATIC | RET_BCO | RET_SMALL | RET_BIG-#if !defined(GHC_7_7) && !defined(GHC_8_0)- | RET_DYN-#endif | RET_FUN | UPDATE_FRAME | CATCH_FRAME@@ -253,9 +256,7 @@ | BLACKHOLE | MVAR_CLEAN | MVAR_DIRTY-#if defined(GHC_7_7) || defined(GHC_8_0) | TVAR-#endif | ARR_WORDS | MUT_ARR_PTRS_CLEAN | MUT_ARR_PTRS_DIRTY@@ -273,11 +274,12 @@ | CATCH_RETRY_FRAME | CATCH_STM_FRAME | WHITEHOLE-#if defined(GHC_8_0) | SMALL_MUT_ARR_PTRS_CLEAN | SMALL_MUT_ARR_PTRS_DIRTY | SMALL_MUT_ARR_PTRS_FROZEN0 | SMALL_MUT_ARR_PTRS_FROZEN+#if defined(GHC_8_2)+ | COMPACT_NFDATA #endif deriving (Show, Eq, Enum, Bounded, Ord) @@ -551,7 +553,13 @@ (iptr, wds, ptrs) <- getClosureRaw x itbl <- peek iptr case tipe itbl of- t | t >= CONSTR && t <= CONSTR_NOCAF_STATIC -> do+ t | t >= CONSTR+#if defined(GHC_8_0)+ , t <= CONSTR_NOCAF_STATIC+#else+ , t <= CONSTR_NOCAF+#endif+ -> do (pkg, modl, name) <- dataConInfoPtrToNames iptr if modl == "ByteCodeInstr" && name == "BreakInfo" then return $ UnsupportedClosure itbl