Index: lib/Driver/ToolChains/Arch/PPC.h =================================================================== --- lib/Driver/ToolChains/Arch/PPC.h +++ lib/Driver/ToolChains/Arch/PPC.h @@ -32,6 +32,7 @@ FloatABI getPPCFloatABI(const Driver &D, const llvm::opt::ArgList &Args); std::string getPPCTargetCPU(const llvm::opt::ArgList &Args); +const char *getPPCAsmModeForCPU(StringRef Name); void getPPCTargetFeatures(const Driver &D, const llvm::Triple &Triple, const llvm::opt::ArgList &Args, Index: lib/Driver/ToolChains/Arch/PPC.cpp =================================================================== --- lib/Driver/ToolChains/Arch/PPC.cpp +++ lib/Driver/ToolChains/Arch/PPC.cpp @@ -86,6 +86,18 @@ return ""; } +const char *ppc::getPPCAsmModeForCPU(StringRef Name) { + return llvm::StringSwitch(Name) + .Case("pwr7", "-mpower7") + .Case("power7", "-mpower7") + .Case("pwr8", "-mpower8") + .Case("power8", "-mpower8") + .Case("ppc64le", "-mpower8") + .Case("pwr9", "-mpower9") + .Case("power9", "-mpower9") + .Default("-many"); +} + void ppc::getPPCTargetFeatures(const Driver &D, const llvm::Triple &Triple, const ArgList &Args, std::vector &Features) { Index: lib/Driver/ToolChains/Gnu.cpp =================================================================== --- lib/Driver/ToolChains/Gnu.cpp +++ lib/Driver/ToolChains/Gnu.cpp @@ -11,6 +11,7 @@ #include "Linux.h" #include "Arch/ARM.h" #include "Arch/Mips.h" +#include "Arch/PPC.h" #include "Arch/Sparc.h" #include "Arch/SystemZ.h" #include "CommonArgs.h" @@ -674,22 +675,28 @@ else CmdArgs.push_back("--64"); break; - case llvm::Triple::ppc: + case llvm::Triple::ppc: { CmdArgs.push_back("-a32"); CmdArgs.push_back("-mppc"); - CmdArgs.push_back("-many"); + std::string CPU = getCPUName(Args, getToolChain().getTriple()); + CmdArgs.push_back(ppc::getPPCAsmModeForCPU(CPU)); break; - case llvm::Triple::ppc64: + } + case llvm::Triple::ppc64: { CmdArgs.push_back("-a64"); CmdArgs.push_back("-mppc64"); - CmdArgs.push_back("-many"); + std::string CPU = getCPUName(Args, getToolChain().getTriple()); + CmdArgs.push_back(ppc::getPPCAsmModeForCPU(CPU)); break; - case llvm::Triple::ppc64le: + } + case llvm::Triple::ppc64le: { CmdArgs.push_back("-a64"); CmdArgs.push_back("-mppc64"); - CmdArgs.push_back("-many"); CmdArgs.push_back("-mlittle-endian"); + std::string CPU = getCPUName(Args, getToolChain().getTriple()); + CmdArgs.push_back(ppc::getPPCAsmModeForCPU(CPU)); break; + } case llvm::Triple::sparc: case llvm::Triple::sparcel: { CmdArgs.push_back("-32");