Index: cfe/trunk/lib/Driver/ToolChains/Arch/PPC.h =================================================================== --- cfe/trunk/lib/Driver/ToolChains/Arch/PPC.h +++ cfe/trunk/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: cfe/trunk/lib/Driver/ToolChains/Arch/PPC.cpp =================================================================== --- cfe/trunk/lib/Driver/ToolChains/Arch/PPC.cpp +++ cfe/trunk/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: cfe/trunk/lib/Driver/ToolChains/Gnu.cpp =================================================================== --- cfe/trunk/lib/Driver/ToolChains/Gnu.cpp +++ cfe/trunk/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" @@ -695,22 +696,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"); + CmdArgs.push_back( + ppc::getPPCAsmModeForCPU(getCPUName(Args, getToolChain().getTriple()))); break; - case llvm::Triple::ppc64: + } + case llvm::Triple::ppc64: { CmdArgs.push_back("-a64"); CmdArgs.push_back("-mppc64"); - CmdArgs.push_back("-many"); + CmdArgs.push_back( + ppc::getPPCAsmModeForCPU(getCPUName(Args, getToolChain().getTriple()))); 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"); + CmdArgs.push_back( + ppc::getPPCAsmModeForCPU(getCPUName(Args, getToolChain().getTriple()))); break; + } case llvm::Triple::sparc: case llvm::Triple::sparcel: { CmdArgs.push_back("-32"); Index: cfe/trunk/test/Driver/linux-as.c =================================================================== --- cfe/trunk/test/Driver/linux-as.c +++ cfe/trunk/test/Driver/linux-as.c @@ -174,3 +174,18 @@ // RUN: -no-integrated-as -c %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHECK-Z-ARCH-Z196 %s // CHECK-Z-ARCH-Z196: as{{.*}} "-march=z196" +// +// RUN: %clang -target powerpc64le-linux -### \ +// RUN: -no-integrated-as -c %s 2>&1 \ +// RUN: | FileCheck -check-prefix=CHECK-PPC64LE %s +// CHECK-PPC64LE: as{{.*}} "-mpower8" +// +// RUN: %clang -target powerpc64-linux -mcpu=pwr7 -### \ +// RUN: -no-integrated-as -c %s 2>&1 \ +// RUN: | FileCheck -check-prefix=CHECK-PPC64 %s +// CHECK-PPC64: as{{.*}} "-mpower7" +// +// RUN: %clang -target powerpc-linux -mcpu=pwr9 -### \ +// RUN: -no-integrated-as -c %s 2>&1 \ +// RUN: | FileCheck -check-prefix=CHECK-PPC32 %s +// CHECK-PPC32: as{{.*}} "-mpower9" Index: cfe/trunk/test/Driver/ppc-features.cpp =================================================================== --- cfe/trunk/test/Driver/ppc-features.cpp +++ cfe/trunk/test/Driver/ppc-features.cpp @@ -171,8 +171,8 @@ // RUN: %clang -target powerpc64le-unknown-linux-gnu %s -### -o %t.o -no-integrated-as 2>&1 | FileCheck -check-prefix=CHECK_LE_AS_ARGS %s // CHECK_LE_AS_ARGS: "-mppc64" -// CHECK_LE_AS_ARGS: "-many" // CHECK_LE_AS_ARGS: "-mlittle-endian" +// CHECK_LE_AS_ARGS: "-mpower8" // linker features // RUN: %clang -target powerpc64-unknown-linux-gnu %s -### -o %t.o 2>&1 | FileCheck -check-prefix=CHECK_BE_LD_ARGS %s