[GHC] #7684: cgrun071 segfaults
GHC
ghc-devs at haskell.org
Sat Sep 7 01:43:08 CEST 2013
#7684: cgrun071 segfaults
----------------------------------+----------------------------------
Reporter: tibbe | Owner:
Type: bug | Status: new
Priority: normal | Milestone: 7.8.1
Component: Compiler | Version: 7.7
Resolution: | Keywords:
Operating System: MacOS X | Architecture: x86_64 (amd64)
Type of failure: Runtime crash | Difficulty: Unknown
Test Case: cgrun071 | Blocked By:
Blocking: | Related Tickets:
----------------------------------+----------------------------------
Comment (by rwbarton):
Well, which compiler is doing the wrong thing?
According to the x86_64 ABI, gcc 4.2 is doing the wrong thing, because
when it generates code for `hs_popcnt8`, it assumes that the high 7 bytes
of the argument register `%edi` are 0. The caller is not supposed to have
to guarantee that, and gcc 4.8 does the right thing by masking off the
high 7 bytes inside `hs_popcnt8`.
ghc sees a primop `PopCnt8Op` of type `Word# -> Word#`, and given that, it
is doing the right thing by taking the whole `Word#` value extracted from
the argument to `popcnt8` (in `cgrun071`) and putting it in `%edi` before
calling `hs_popcnt8`. I don't think ghc looks at the C prototype of
functions that implement primops, does it? It just prepares the arguments
for the call in registers or on the stack according to their Cmm sizes,
and does a call to the symbol of the right name.
Now, the combination of ghc passing a whole `Word#` and `hs_popcnt8`
treating the argument as an `unsigned char` works out according to the
x86_64 ABI since the intent is to compute the popcnt of the lowest byte.
It doesn't work out if `hs_popcnt8` expects its argument to be zero-
extended from 1 byte to 8 bytes like under gcc 4.2.
Changing the declared argument type of `hs_popcnt8` to `StgWord` will make
`popcnt.c` agree with the list of primops. Given that we can modify ghc
but not gcc 4.2 this seems like the best solution for now.
If `Word8#` becomes a thing, we can change the signature of `hs_popcnt8`
back and also change the declared type of `PopCnt8Op` to `Word8# ->
Word#`. As I understand things, the key is that those two declarations
agree.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/7684#comment:35>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list