sparc -mcpu=v9 is not used in assembly phase
The ghc DriverPipeline.hs adds -mcpu=v9 when compiling .hs files on sparc:
#ifdef sparc_TARGET_ARCH
-- We only support SparcV9 and better because V8 lacks an atomic CAS
-- instruction. Note that the user can still override this
-- (e.g., -mcpu=ultrasparc) as GCC picks the "best" -mcpu flag
-- regardless of the ordering.
--
-- This is a temporary hack.
++ ["-mcpu=v9"]
#endif
This is great, but it does not add -mcpu=v9 when it calls gcc to assemble the .s file. So it fails because the .s file uses v9 instructions but we're not telling the assembler to use v9:
/tmp/ghc16216_0/ghc16216_0.split__1.s:22:0:
Error: Architecture mismatch on "blu,pn %icc,.LL4".
/tmp/ghc16216_0/ghc16216_0.split__1.s:22:0:
(Requires v9|v9a|v9b; requested architecture is v8.)
If one re-runs that failing command with -opta-mcpu=v9 then of course it works.
The general rule is that any -mcpu flags passed to gcc at the compile stage also have to be passed to gcc at the assembly phase.
Looking at the code it appears that the -mcpu=v9 flag is passed for the HCc and As but not SplitAs phases. Of course the SplitAs phase is used during ghc bootstrapping which is where I found this failure. This is in ghc-6.8.3 but the code looks to be the same in 6.10 so I don't think it's already been fixed.
The workaround is to use SRC_HC_OPTS=-opta-mcpu=v9 in mk/build.mk.
Trac metadata
| Trac field | Value |
|---|---|
| Version | 6.8.3 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Compiler |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | |
| Architecture |