[GHC] #14779: Compiling with -g fails -lint-core checks

GHC ghc-devs at haskell.org
Thu Feb 8 14:50:30 UTC 2018


#14779: Compiling with -g fails -lint-core checks
-------------------------------------+-------------------------------------
        Reporter:  niteria           |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:
  (Debugging)                        |
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
 Type of failure:  Compile-time      |  Unknown/Multiple
  crash or panic                     |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:  #14122, #14123,   |  Differential Rev(s):
  #8472, #14406                      |
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by niteria):

 > That is bad, and we should not allow it. In which case whichever code is
 generating it needs to be fixed.

 https://phabricator.haskell.org/D3925 suggests that this is the way we
 want to proceed. It refers to this note:

 {{{
 Note [CoreSyn top-level string literals]
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 As an exception to the usual rule that top-level binders must be lifted,
 we allow binding primitive string literals (of type Addr#) of type Addr#
 at the
 top level. This allows us to share string literals earlier in the pipeline
 and
 crucially allows other optimizations in the Core2Core pipeline to fire.
 Consider,

   f n = let a::Addr# = "foo"#
         in \x -> blah

 In order to be able to inline `f`, we would like to float `a` to the top.
 Another option would be to inline `a`, but that would lead to duplicating
 string
 literals, which we want to avoid. See Trac #8472.

 The solution is simply to allow top-level unlifted binders. We can't allow
 arbitrary unlifted expression at the top-level though, unlifted binders
 cannot
 be thunks, so we just allow string literals.

 It is important to note that top-level primitive string literals cannot be
 wrapped in Ticks, as is otherwise done with lifted bindings. CoreToStg
 expects
 to see just a plain (Lit (MachStr ...)) expression on the RHS of primitive
 string bindings; anything else and things break. CoreLint checks this
 invariant.

 Also see Note [Compilation plan for top-level string literals].
 }}}

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


More information about the ghc-tickets mailing list