[GHC] #15262: GHC and iserv cannot agree on what an Integer is; insanity ensues (was: TH splice containing numeric literal 0 causes heap overflow while cross-compiling)

GHC ghc-devs at haskell.org
Tue Jul 3 03:57:28 UTC 2018


#15262: GHC and iserv cannot agree on what an Integer is; insanity ensues
-------------------------------------+-------------------------------------
        Reporter:  howtonotwin       |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:  8.8.1
       Component:  Compiler          |              Version:  8.5
      Resolution:                    |             Keywords:
Operating System:  MacOS X           |         Architecture:  x86_64
 Type of failure:  Compile-time      |  (amd64)
  crash or panic                     |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------
Changes (by howtonotwin):

 * architecture:  Unknown/Multiple => x86_64 (amd64)


Old description:

> Tested off commit `9976bed24dda9449ac2e3e95fb4bf8b379114a28`, running on
> macOS 10.13.5, trying to compile for iOS.
>
> 1. Compile a GHC that cross compiles to `x86_64-apple-ios` (i.e. with
> `./configure --build=x86_64-apple-darwin --host=x86_64-apple-darwin
> --target=x86_64-apple-ios; make`).
> 2. Compile a `ghc-iserv` that can run on the build system (i.e. with
> `./configure; cd utils/iserv; make`)
> 3. Try to cross-compile the following file (i.e `x86_64-apple-ios-ghc
> -fexternal-interpreter -pgmi=path/to/ghc-iserv T.hs`):
>    {{{#!hs
>    {-# LANGUAGE TemplateHaskell #-}
>    module T where
>    $([d| zero = 0 |])
>    }}}
>
> Expected: Compiles fine.
>
> Actual:
>
> {{{
> [1 of 1] Compiling T                ( T.hs, T.o )
>
> T.hs:1:1: error:
>     Exception when trying to run compile-time code:
>       heap overflow
>     Code: [d| zero = 0 |]
>   |
> 1 | {-# LANGUAGE TemplateHaskell #-}
>   | ^
> }}}
>
> For more fun:
>
> * This problem appears to only affect the numeric literal `0`.
>    * `0.0` is not fine.
>    * `1` is fine.
>    * `1 - 1` appears to be a workaround.
>    * `0.1` is fine.
>    * "Burying" the `0` inside another expression is not fine (e.g. `zero
> = [0]`).
>    * I can even compile most of `singletons`, and it only chokes when the
> `0` literal first appears (`negate x = 0 - x`).
>    * The `0` has to actually appear in the result. (`$(const [d| |] [d|
> zero = 0 |])` is fine.)
>    * `0#` is not fine.
> * This problem only appears when cross-compiling. If I complete the build
> of the native GHC above and use it instead of the cross-compiler but
> still use `-fexternal-interpreter`, everything is fine.
> * Moving the declaration outside of the TH brackets is fine.

New description:

 Tested off `ghc-8.6.1-alpha1`, running on macOS 10.13.5.

 1. Compile a GHC that uses `integer-gmp`.
 2. Compile a GHC that uses `integer-simple`.
 3. Make `Main.hs`:
    {{{#!hs
    {-# LANGUAGE TemplateHaskell #-}
    main = print $([e| 0 |])
    }}}
 4. Try to compile the file with  `integer-gmp` `ghc` and `integer-simple`
 `ghc-iserv`.
    * Expected behavior: compiles fine; executable prints `0`
    * Actual:
     {{{
     [1 of 1] Compiling Main             ( Main.hs, Main.o )

     Main.hs:2:14: error:
         • Exception when trying to run compile-time code:
             ghc: ghc-iserv terminated (-11)
           Code: [| 0 |]
         • In the untyped splice: $([| 0 |])
       |
     2 | main = print $([e| 0 |])
       |              ^^^^^^^^^^^
     }}}

 4. Try to compile the file with `integer-simple` `ghc` and `integer-gmp`
 `ghc-iserv`.
   * Expected behavior: compiles fine, executable prints `0`.
   * Actual:
     {{{
     [1 of 1] Compiling Main             ( Main.hs, Main.o )

     Main.hs:2:14: error:
         • Exception when trying to run compile-time code:
             heap overflow
           Code: [| 0 |]
         • In the untyped splice: $([| 0 |])
       |
     2 | main = print $([e| 0 |])
       |              ^^^^^^^^^^^
     }}}

 For more fun, replace the `0` with a `1`. `gmp` `ghc` + `simple` `iserv`
 continues to explode. This is better than `simple` `ghc` + `gmp` `iserv`:

 {{{#!bash
 $ ./Main
 283468057265
 $ ./Main
 283468057265
 $ $simple_ghc -fexternal-interpreter -pgmi=$gmp_iserv Main.hs # again
 # ...
 $ ./Main
 283468057105
 }}}

 Absolutely delicious. There is a similar situation for fractional
 literals.

 It would be nice if there was at least a warning for situations like this.

--

-- 
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/15262#comment:3>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list