X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FLinker.c;h=fe9d98bc606e28935d92e2a38be4ae558a74c850;hb=19ecaccf6bcc6bd64d9dd4ee332b8635b1d75844;hp=043252dca1537fc6bd31534514c0020a3039d61a;hpb=82460c32166d91c494723f9752389f6b9bbe5bcb;p=ghc-hetmet.git diff --git a/ghc/rts/Linker.c b/ghc/rts/Linker.c index 043252d..fe9d98b 100644 --- a/ghc/rts/Linker.c +++ b/ghc/rts/Linker.c @@ -26,6 +26,7 @@ #include "RtsUtils.h" #include "Schedule.h" #include "Storage.h" +#include "Sparks.h" #ifdef HAVE_SYS_TYPES_H #include @@ -474,6 +475,7 @@ typedef struct _RtsSymbolVal { SymX(delayzh_fast) \ SymX(deRefWeakzh_fast) \ SymX(deRefStablePtrzh_fast) \ + SymX(dirty_MUT_VAR) \ SymX(divExactIntegerzh_fast) \ SymX(divModIntegerzh_fast) \ SymX(forkzh_fast) \ @@ -526,6 +528,7 @@ typedef struct _RtsSymbolVal { SymX(newTVarzh_fast) \ SymX(atomicModifyMutVarzh_fast) \ SymX(newPinnedByteArrayzh_fast) \ + SymX(newSpark) \ SymX(orIntegerzh_fast) \ SymX(performGC) \ SymX(performMajorGC) \ @@ -597,6 +600,7 @@ typedef struct _RtsSymbolVal { SymX(stg_EMPTY_MVAR_info) \ SymX(stg_IND_STATIC_info) \ SymX(stg_INTLIKE_closure) \ + SymX(stg_MUT_ARR_PTRS_DIRTY_info) \ SymX(stg_MUT_ARR_PTRS_FROZEN_info) \ SymX(stg_MUT_ARR_PTRS_FROZEN0_info) \ SymX(stg_WEAK_info) \ @@ -654,6 +658,19 @@ typedef struct _RtsSymbolVal { SymX(writeTVarzh_fast) \ SymX(xorIntegerzh_fast) \ SymX(yieldzh_fast) \ + SymX(stg_interp_constr_entry) \ + SymX(stg_interp_constr1_entry) \ + SymX(stg_interp_constr2_entry) \ + SymX(stg_interp_constr3_entry) \ + SymX(stg_interp_constr4_entry) \ + SymX(stg_interp_constr5_entry) \ + SymX(stg_interp_constr6_entry) \ + SymX(stg_interp_constr7_entry) \ + SymX(stg_interp_constr8_entry) \ + SymX(stgMallocBytesRWX) \ + SymX(getAllocations) \ + SymX(revertCAFs) \ + SymX(RtsFlags) \ RTS_USER_SIGNALS_SYMBOLS #ifdef SUPPORT_LONG_LONGS @@ -1447,22 +1464,37 @@ static int ocAllocateJumpIslands( ObjectCode* oc, int count, int first ) n = ROUND_UP( oc->fileSize, pagesize ); m = ROUND_UP( aligned + sizeof (ppcJumpIsland) * count, pagesize ); - /* The effect of this mremap() call is only the ensure that we have - * a sufficient number of virtually contiguous pages. As returned from - * mremap, the pages past the end of the file are not backed. We give - * them a backing by using MAP_FIXED to map in anonymous pages. + /* If we have a half-page-size file and map one page of it then + * the part of the page after the size of the file remains accessible. + * If, however, we map in 2 pages, the 2nd page is not accessible + * and will give a "Bus Error" on access. To get around this, we check + * if we need any extra pages for the jump islands and map them in + * anonymously. We must check that we actually require extra pages + * otherwise the attempt to mmap 0 pages of anonymous memory will + * fail -EINVAL. */ - if( (oc->image = mremap( oc->image, n, m, MREMAP_MAYMOVE )) == MAP_FAILED ) - { - errorBelch( "Unable to mremap for Jump Islands\n" ); - return 0; - } - if( mmap( oc->image + n, m - n, PROT_READ | PROT_WRITE | PROT_EXEC, - MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, 0, 0 ) == MAP_FAILED ) + if( m > n ) { - errorBelch( "Unable to mmap( MAP_FIXED ) for Jump Islands\n" ); - return 0; + /* The effect of this mremap() call is only the ensure that we have + * a sufficient number of virtually contiguous pages. As returned from + * mremap, the pages past the end of the file are not backed. We give + * them a backing by using MAP_FIXED to map in anonymous pages. + */ + oc->image = mremap( oc->image, n, m, MREMAP_MAYMOVE ); + + if( oc->image == MAP_FAILED ) + { + errorBelch( "Unable to mremap for Jump Islands\n" ); + return 0; + } + + if( mmap( oc->image + n, m - n, PROT_READ | PROT_WRITE | PROT_EXEC, + MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, 0, 0 ) == MAP_FAILED ) + { + errorBelch( "Unable to mmap( MAP_FIXED ) for Jump Islands\n" ); + return 0; + } } #else