llvmGen: Compatibility with LLVM 3.5 (re #9142)
authorBen Gamari <bgamari.foss@gmail.com>
Fri, 21 Nov 2014 20:05:25 +0000 (21:05 +0100)
committerHerbert Valerio Riedel <hvr@gnu.org>
Fri, 21 Nov 2014 21:32:16 +0000 (22:32 +0100)
commite16a342d70b92fc8480793d3ec911853f0c31e44
treea566c89ae63c6953a68ecf0292c27c9f781b0e59
parent2a523ebf091478aea39deef28073320bed628434
llvmGen: Compatibility with LLVM 3.5 (re #9142)

Due to changes in LLVM 3.5 aliases now may only refer to definitions.
Previously to handle symbols defined outside of the current commpilation
unit GHC would emit both an `external` declaration, as well as an alias
pointing to it, e.g.,

    @stg_BCO_info = external global i8
    @stg_BCO_info$alias = alias private i8* @stg_BCO_info

Where references to `stg_BCO_info` will use the alias
`stg_BCO_info$alias`. This is not permitted under the new alias
behavior, resulting in errors resembling,

    Alias must point to a definition
    i8* @"stg_BCO_info$alias"

To fix this, we invert the naming relationship between aliases and
definitions. That is, now the symbol definition takes the name
`@stg_BCO_info$def` and references use the actual name, `@stg_BCO_info`.
This means the external symbols can be handled by simply emitting an
`external` declaration,

    @stg_BCO_info = external global i8

Whereas in the case of a forward declaration we emit,

    @stg_BCO_info = alias private i8* @stg_BCO_info$def

Reviewed By: austin

Differential Revision: https://phabricator.haskell.org/D155
compiler/llvmGen/Llvm/Types.hs
compiler/llvmGen/LlvmCodeGen.hs
compiler/llvmGen/LlvmCodeGen/Base.hs
compiler/llvmGen/LlvmCodeGen/Data.hs
compiler/llvmGen/LlvmCodeGen/Ppr.hs