• Ben Gamari's avatar
    llvmGen: Compatibility with LLVM 3.5 (re #9142) · e16a342d
    Ben Gamari authored
    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
    e16a342d
LlvmCodeGen.hs 6.3 KB