X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FAdjustor.c;h=607c0b8abebacba0b6338c29eecb4d68267afc76;hb=d8334d807812e40f67770ffc37608c0ce66f96b2;hp=aa7a809029a841f9d1b2c6596b5fece62ddac56d;hpb=c97259cd34b45eb5c06e93e82042dcca784609a6;p=ghc-hetmet.git diff --git a/rts/Adjustor.c b/rts/Adjustor.c index aa7a809..607c0b8 100644 --- a/rts/Adjustor.c +++ b/rts/Adjustor.c @@ -43,10 +43,20 @@ Haskell side. #include "Stable.h" #if defined(USE_LIBFFI_FOR_ADJUSTORS) - #include "ffi.h" #include +#endif + +#if defined(i386_HOST_ARCH) && defined(darwin_HOST_OS) +extern void adjustorCode(void); +#elif defined(powerpc_HOST_ARCH) || defined(powerpc64_HOST_ARCH) +// from AdjustorAsm.s +// not declared as a function so that AIX-style +// fundescs can never get in the way. +extern void *adjustorCode; +#endif +#if defined(USE_LIBFFI_FOR_ADJUSTORS) void freeHaskellFunctionPtr(void* ptr) { @@ -101,7 +111,7 @@ createAdjustor (int cconv, arg_types[i] = char_to_ffi_type(typeString[i+1]); } switch (cconv) { -#ifdef mingw32_TARGET_OS +#ifdef mingw32_HOST_OS case 0: /* stdcall */ abi = FFI_STDCALL; break; @@ -210,12 +220,12 @@ stgAllocStable(size_t size_in_bytes, StgStablePtr *stable) nat data_size_in_words, total_size_in_words; /* round up to a whole number of words */ - data_size_in_words = (size_in_bytes + sizeof(W_) + 1) / sizeof(W_); + data_size_in_words = ROUNDUP_BYTES_TO_WDS(size_in_bytes); total_size_in_words = sizeofW(StgArrWords) + data_size_in_words; /* allocate and fill it in */ arr = (StgArrWords *)allocate(total_size_in_words); - SET_ARR_HDR(arr, &stg_ARR_WORDS_info, CCCS, data_size_in_words); + SET_ARR_HDR(arr, &stg_ARR_WORDS_info, CCCS, size_in_bytes); /* obtain a stable ptr */ *stable = getStablePtr((StgPtr)arr); @@ -423,7 +433,6 @@ createAdjustor(int cconv, StgStablePtr hptr, AdjustorStub *adjustorStub = allocateExec(sizeof(AdjustorStub),&code); adjustor = adjustorStub; - extern void adjustorCode(void); int sz = totalArgumentSize(typeString); adjustorStub->call[0] = 0xe8; @@ -915,11 +924,6 @@ TODO: Depending on how much allocation overhead stgMallocBytes uses for AdjustorStub *adjustorStub; int sz = 0, extra_sz, total_sz; - // from AdjustorAsm.s - // not declared as a function so that AIX-style - // fundescs can never get in the way. - extern void *adjustorCode; - #ifdef FUNDESCS adjustorStub = stgMallocBytes(sizeof(AdjustorStub), "createAdjustor"); #else @@ -1154,7 +1158,6 @@ if ( *(unsigned char*)ptr != 0xe8 ) { } freeStablePtr(((StgStablePtr*)ptr)[1]); #elif defined(powerpc_HOST_ARCH) || defined(powerpc64_HOST_ARCH) - extern void* adjustorCode; if ( ((AdjustorStub*)ptr)->code != (StgFunPtr) &adjustorCode ) { errorBelch("freeHaskellFunctionPtr: not for me, guv! %p\n", ptr); return;