Skip to content

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
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information