Commit 776cfe28 authored by thoughtpolice's avatar thoughtpolice

Properly externalise codegen identifiers (#8166)

388e14e2 unfortunately broke a subtle invariant in the code generator:
when generating code for an application, names may need to be
externalised, in case you're building against something external with
was built with -split-objs.

We were never externalising the ids of the applied functions. This means
if the libraries are split and we call into them, then the compiler
won't may not generate correct ids when making references to functions
in the library (causing linker failure).

I'm not entirely sure how this didn't break everything, but it certainly
caused several failures for a bunch of people. I had to fiddle with my
tree a little to make this occur.

This should fix #8166.
Signed-off-by: thoughtpolice's avatarAustin Seipp <>
parent 795fe083
......@@ -634,12 +634,16 @@ cgIdApp fun_id [] | isVoidId fun_id = emitReturn []
cgIdApp fun_id args = do
dflags <- getDynFlags
fun_info <- getCgIdInfo fun_id
let fun_arg = StgVarArg fun_id
fun_name = idName fun_id
let cg_fun_id = cg_id fun_info
-- NB. use (cg_id fun_info) instead of fun_id, because the former
-- may be externalised for -split-objs.
-- See StgCmm.maybeExternaliseId.
fun_arg = StgVarArg cg_fun_id
fun_name = idName cg_fun_id
fun = idInfoToAmode fun_info
lf_info = cg_lf fun_info
node_points dflags = nodeMustPointToIt dflags lf_info
case (getCallMethod dflags fun_name (idCafInfo fun_id) lf_info (length args)) of
case (getCallMethod dflags fun_name (idCafInfo cg_fun_id) lf_info (length args)) of
-- A value in WHNF, so we can just return it.
ReturnIt -> emitReturn [fun] -- ToDo: does ReturnIt guarantee tagged?
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment