summaryrefslogtreecommitdiff
path: root/compiler/llvmGen/LlvmCodeGen.hs
diff options
context:
space:
mode:
authorBen Gamari <bgamari.foss@gmail.com>2014-11-21 21:05:25 +0100
committerHerbert Valerio Riedel <hvr@gnu.org>2014-11-21 22:32:16 +0100
commite16a342d70b92fc8480793d3ec911853f0c31e44 (patch)
treea566c89ae63c6953a68ecf0292c27c9f781b0e59 /compiler/llvmGen/LlvmCodeGen.hs
parent2a523ebf091478aea39deef28073320bed628434 (diff)
downloadhaskell-e16a342d70b92fc8480793d3ec911853f0c31e44.tar.gz
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
Diffstat (limited to 'compiler/llvmGen/LlvmCodeGen.hs')
-rw-r--r--compiler/llvmGen/LlvmCodeGen.hs5
1 files changed, 3 insertions, 2 deletions
diff --git a/compiler/llvmGen/LlvmCodeGen.hs b/compiler/llvmGen/LlvmCodeGen.hs
index dd16e52868..6120a72d3a 100644
--- a/compiler/llvmGen/LlvmCodeGen.hs
+++ b/compiler/llvmGen/LlvmCodeGen.hs
@@ -81,7 +81,7 @@ llvmCodeGen' cmm_stream
_ <- Stream.collect llvmStream
-- Declare aliases for forward references
- renderLlvm . pprLlvmData =<< generateAliases
+ renderLlvm . pprLlvmData =<< generateExternDecls
-- Postamble
cmmUsedLlvmGens
@@ -120,8 +120,9 @@ cmmDataLlvmGens statics
= funInsert l ty
regGlobal _ = return ()
mapM_ regGlobal (concat gss)
+ gss' <- mapM aliasify $ concat gss
- renderLlvm $ pprLlvmData (concat gss, concat tss)
+ renderLlvm $ pprLlvmData (concat gss', concat tss)
-- | Complete LLVM code generation phase for a single top-level chunk of Cmm.
cmmLlvmGen ::RawCmmDecl -> LlvmM ()