[GHC] #13378: ghc-stage2 broken for quick-llvm

GHC ghc-devs at haskell.org
Mon Mar 6 13:43:38 UTC 2017


#13378: ghc-stage2 broken for quick-llvm
-------------------------------------+-------------------------------------
        Reporter:  angerman          |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  highest           |            Milestone:  8.2.1
       Component:  Compiler          |              Version:
      Resolution:                    |             Keywords:
Operating System:  MacOS X           |         Architecture:  x86_64
 Type of failure:  Building GHC      |  (amd64)
  failed                             |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by rwbarton):

 So our options seem to be, in increasing order of desirability:

 0. Just don't use `-dead_strip` at link time by default on Darwin. But it
 doesn't really fix the problem, since a downstream link process could
 still use `-dead_strip`. Furthermore it would break dead code stripping
 for the NCG, which currently does work. (We'd then have to use `-split-
 objs` everywhere to get the same effect.)

 1. Disable subsections-via-symbols for modules compiled with the LLVM
 backend. angerman found that llc unconditionally enables subsections-via-
 symbols on Darwin with a "funny hack" (https://github.com/llvm-
 mirror/llvm/blob/f61ad6ec119554f251f44f54c9cf42d8b713866e/lib/Target/X86/X86AsmPrinter.cpp#L607-L612).
 But we could remove the directive in the LLVM mangler.

   This would be a sound thing to do, but we'd have no way to do dead code
 stripping when using LLVM; and on iOS LLVM is the only available option.

 2. Insert symbols that point to the start of info tables and give them
 some kind of externally-visible linkage or mark them as `.no_dead_strip`.
 I don't think the LLVM input language gives us any way to do this, but we
 could probably do it in the mangler.

   This would give us some degree of dead code stripping, but it would keep
 ''all'' info tables live, even those that were attached to functions that
 got stripped. As far as I can see that's not a problem except in that the
 eventual object file will not be as small as it could be.

   I think this was the strategy used by
 https://phabricator.haskell.org/D206, but with the adoption of prefix data
 it's not so easy to implement any more.

 3. Insert symbols that point to the start of info tables, and also insert
 a reference at the end of each function to the start of its info table.
 Again we could probably do this in the mangler, though it would be more
 complicated. Ideally we would have some kind of "suffix data" mechanism
 for this...

   This would give the best dead code stripping (at the cost of slightly
 larger code in the non-stripped case) and it's the strategy used by the
 NCG. (See where `X86.Ppr.pprNatCmmDecl` uses
 `platformHasSubsectionsViaSymbols`.)

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


More information about the ghc-tickets mailing list