This is a continuation of #4012 (closed), which was resolved in 8.0.2 by making interface files deterministic. Now someone needs to make object code deterministic.
Edited
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information
It's not an entirely trivial task. We use uniques quite often to name symbols in code produced by the native codegen. Fixing this without compromising compiler performance is rather tricky. I don't know if niteria has thought much about how to approach this.
I have attached some files, objdump-headers-1.txt and objdump-headers-1.txt which are the outputs of objdump --all-headers Example.o as produced by ghc --make -j1 of a project of mine.
Have a look at them in a diff viewer.
At the top you will find probably what was talked about before: Uniques making it into symbol names, like cZoQ_info vs cQJU_info.
It's not an entirely trivial task. We use uniques quite often to name symbols in code produced by the native codegen. Fixing this without compromising compiler performance is rather tricky.
@bgamari Question:
Why cannot the uniques be predetermined by a seed that's dependent on the module name?
My understanding so far is this: We need an infinite stream of unused strings to generate symbols. Parallel compilation with -j and "partial" compilation of the projects (resumes, incremental compilation), means some number or pseudorandom generator has a different initial state when we come by the file next time.
So couldn't we initialise the seed of that pseudorandom generator as hash(module name), so that each time a module is compiled, it always generates the same uniques in the same order (as within a module there is no parallel compilation)? And when a module name changes, we have to recompile anyway and it's probably OK if the object code changes when that happens.
(Edit: Looks like this is the same question asked but unanswered here: #4012 (closed)##12935)