• Joel Stanley's avatar
    powerpc/Makefile: Fix PPC_BOOK3S_64 ASFLAGS · 960e3002
    Joel Stanley authored
    Ever since commit 15a3204d ("powerpc/64s: Set assembler machine type
    to POWER4") we force -mpower4 to be passed to the assembler
    irrespective of the CFLAGS used (for Book3s 64).
    
    When building a powerpc64 kernel with clang, clang will not add -many
    to the assembler flags, so any instructions that the compiler has
    generated that are not available on power4 will cause an error:
    
      /usr/bin/as -a64 -mppc64 -mlittle-endian -mpower8 \
       -I ./arch/powerpc/include -I ./arch/powerpc/include/generated \
       -I ./include -I ./arch/powerpc/include/uapi \
       -I ./arch/powerpc/include/generated/uapi -I ./include/uapi \
       -I ./include/generated/uapi -I arch/powerpc -I arch/powerpc \
       -maltivec -mpower4 -o init/do_mounts.o /tmp/do_mounts-3b0a3d.s
      /tmp/do_mounts-51ce54.s:748: Error: unrecognized opcode: `isel'
    
    GCC does include -many, so the GCC driven gas call will succeed:
    
      as -v -I ./arch/powerpc/include -I ./arch/powerpc/include/generated -I
      ./include -I ./arch/powerpc/include/uapi
      -I ./arch/powerpc/include/generated/uapi -I ./include/uapi
      -I ./include/generated/uapi -I arch/powerpc -I arch/powerpc
       -a64 -mpower8 -many -mlittle -maltivec -mpower4 -o init/do_mounts.o
    
    Note that isel is power7 and above for IBM CPUs. GCC only generates it
    for Power9 and above, but the above test was run against the clang
    generated assembly.
    
    Peter Bergner explains:
    
      When using -many -mpower4, gas will first try and find a matching
      power4 mnemonic and failing that, it will then allow any valid
      mnemonic that gas knows about. GCC's use of -many predates me
      though.
    
      IIRC, Alan looked at trying to remove it, but I forget why he
      didn't. Could be either a gcc or gas issue at the time. I'm not sure
      whether issue still exists or not. He and I have modified how gas
      works internally a fair amount since he tried removing gcc use of
      -many.
    
      I will also note that when using -many, gas will choose the first
      mnemonic that matches in the mnemonic table and we have (mostly)
      sorted the table so that server mnemonics show up earlier in the
      table than other mnemonics, so they'll be seen/chosen first.
    
    By explicitly setting -many we can build with Clang and GCC while
    retaining the -mpower4 option.
    Signed-off-by: default avatarJoel Stanley <joel@jms.id.au>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    960e3002
Makefile 14.5 KB