Ticket #2872 (closed bug: fixed)
sparc -mcpu=v9 is not used in assembly phase
| Reported by: | duncan | Owned by: | igloo |
|---|---|---|---|
| Priority: | high | Milestone: | 6.10.2 |
| Component: | Compiler | Version: | 6.8.3 |
| Keywords: | Cc: | ||
| Operating System: | Solaris | Architecture: | sparc |
| Type of failure: | Difficulty: | Unknown | |
| Test Case: | Blocked By: | ||
| Blocking: | Related Tickets: |
Description
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.
