On Mon, 11 Jun 2012 15:55:53 -0700 Chandler Carruth <[email protected]> wrote:
> On Mon, Jun 11, 2012 at 3:35 PM, Hal Finkel <[email protected]> wrote: > > > Author: hfinkel > > Date: Mon Jun 11 17:35:19 2012 > > New Revision: 158334 > > > > URL: http://llvm.org/viewvc/llvm-project?rev=158334&view=rev > > Log: > > Add PPC support for translating gcc-style -mcpu options into LLVM > > -target-cpu options. > > > > Very cool. Thanks. > > > > This functionality is based on what is done on ARM, and enables > > selecting PPC CPUs > > in a way compatible with gcc's driver. Also, mirroring gcc (and > > what is done on x86), > > -mcpu=native support was added. This uses the host cpu detection > > from LLVM (which will also soon be updated by refactoring code > > currently in backend). > > > > In order for this to work, the target needs a list of valid CPUs -- > > we now accept all CPUs accepted by LLVM. > > > > Is there any way to re-use the list from LLVM? Would be nice... I wish there were (if there is, I don't know how). The list essentially needs to be repeated in three places. > > > > A few preprocessor defines for common CPU types have been added. > > > > I wonder, could we get more exhaustive testing here? I worry that > these code paths are particularly prone to rot due to lots of > developers not working on a power platform. > > In particular, I'd at least ask for tests for each of the preprocessor > macros you added. I'd ideally like tests for all the CPU variants, but > there are a *lot* of them, so likely not worth it... Indeed; I'll add additional tests. -Hal > > > > > > Modified: > > cfe/trunk/lib/Basic/Targets.cpp > > cfe/trunk/lib/Driver/Tools.cpp > > cfe/trunk/lib/Driver/Tools.h > > cfe/trunk/test/Driver/clang-translation.c > > cfe/trunk/test/Preprocessor/init.c > > > > Modified: cfe/trunk/lib/Basic/Targets.cpp > > URL: > > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets.cpp?rev=158334&r1=158333&r2=158334&view=diff > > > > ============================================================================== > > --- cfe/trunk/lib/Basic/Targets.cpp (original) > > +++ cfe/trunk/lib/Basic/Targets.cpp Mon Jun 11 17:35:19 2012 > > @@ -575,12 +575,47 @@ > > static const Builtin::Info BuiltinInfo[]; > > static const char * const GCCRegNames[]; > > static const TargetInfo::GCCRegAlias GCCRegAliases[]; > > + std::string CPU; > > public: > > PPCTargetInfo(const std::string& triple) : TargetInfo(triple) { > > LongDoubleWidth = LongDoubleAlign = 128; > > LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble; > > } > > > > + virtual bool setCPU(const std::string &Name) { > > + bool CPUKnown = llvm::StringSwitch<bool>(Name) > > + .Case("generic", true) > > + .Case("440", true) > > + .Case("450", true) > > + .Case("601", true) > > + .Case("602", true) > > + .Case("603", true) > > + .Case("603e", true) > > + .Case("603ev", true) > > + .Case("604", true) > > + .Case("604e", true) > > + .Case("620", true) > > + .Case("g3", true) > > + .Case("7400", true) > > + .Case("g4", true) > > + .Case("7450", true) > > + .Case("g4+", true) > > + .Case("750", true) > > + .Case("970", true) > > + .Case("g5", true) > > + .Case("a2", true) > > + .Case("pwr6", true) > > + .Case("pwr7", true) > > + .Case("ppc", true) > > + .Case("ppc64", true) > > + .Default(false); > > + > > + if (CPUKnown) > > + CPU = Name; > > + > > + return CPUKnown; > > + } > > + > > virtual void getTargetBuiltins(const Builtin::Info *&Records, > > unsigned &NumRecords) const { > > Records = BuiltinInfo; > > @@ -744,6 +779,20 @@ > > Builder.defineMacro("__VEC__", "10206"); > > Builder.defineMacro("__ALTIVEC__"); > > } > > + > > + // CPU identification. > > + if (CPU == "440") { > > + Builder.defineMacro("_ARCH_440"); > > + } else if (CPU == "450") { > > + Builder.defineMacro("_ARCH_440"); > > + Builder.defineMacro("_ARCH_450"); > > + } else if (CPU == "970") { > > + Builder.defineMacro("_ARCH_970"); > > + } else if (CPU == "pwr6") { > > + Builder.defineMacro("_ARCH_PWR6"); > > + } else if (CPU == "pwr7") { > > + Builder.defineMacro("_ARCH_PWR7"); > > + } > > } > > > > bool PPCTargetInfo::hasFeature(StringRef Feature) const { > > > > Modified: cfe/trunk/lib/Driver/Tools.cpp > > URL: > > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=158334&r1=158333&r2=158334&view=diff > > > > ============================================================================== > > --- cfe/trunk/lib/Driver/Tools.cpp (original) > > +++ cfe/trunk/lib/Driver/Tools.cpp Mon Jun 11 17:35:19 2012 > > @@ -902,6 +902,72 @@ > > } > > } > > > > +/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are > > targeting. > > +static std::string getPPCTargetCPU(const ArgList &Args) { > > + if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) { > > + StringRef CPUName = A->getValue(Args); > > + > > + if (CPUName == "native") { > > + std::string CPU = llvm::sys::getHostCPUName(); > > + if (!CPU.empty() && CPU != "generic") > > + return CPU; > > + else > > + return ""; > > + } > > + > > + return llvm::StringSwitch<const char *>(CPUName) > > + .Case("common", "generic") > > + .Case("440", "440") > > + .Case("440fp", "440") > > + .Case("450", "450") > > + .Case("601", "601") > > + .Case("602", "602") > > + .Case("603", "603") > > + .Case("603e", "603e") > > + .Case("603ev", "603ev") > > + .Case("604", "604") > > + .Case("604e", "604e") > > + .Case("620", "620") > > + .Case("G3", "g3") > > + .Case("7400", "7400") > > + .Case("G4", "g4") > > + .Case("7450", "7450") > > + .Case("G4+", "g4+") > > + .Case("750", "750") > > + .Case("970", "970") > > + .Case("G5", "g5") > > + .Case("a2", "a2") > > + .Case("power6", "pwr6") > > + .Case("power7", "pwr7") > > + .Case("powerpc", "ppc") > > + .Case("powerpc64", "ppc64") > > + .Default(""); > > + } > > + > > + return ""; > > +} > > + > > +void Clang::AddPPCTargetArgs(const ArgList &Args, > > + ArgStringList &CmdArgs) const { > > + std::string TargetCPUName = getPPCTargetCPU(Args); > > + > > + // LLVM may default to generating code for the native CPU, > > + // but, like gcc, we default to a more generic option for > > + // each architecture. (except on Darwin) > > + llvm::Triple Triple = getToolChain().getTriple(); > > + if (TargetCPUName.empty() && !Triple.isOSDarwin()) { > > + if (Triple.getArch() == llvm::Triple::ppc64) > > + TargetCPUName = "ppc64"; > > + else > > + TargetCPUName = "ppc"; > > + } > > + > > + if (!TargetCPUName.empty()) { > > + CmdArgs.push_back("-target-cpu"); > > + CmdArgs.push_back(Args.MakeArgString(TargetCPUName.c_str())); > > + } > > +} > > + > > void Clang::AddSparcTargetArgs(const ArgList &Args, > > ArgStringList &CmdArgs) const { > > const Driver &D = getToolChain().getDriver(); > > @@ -1778,6 +1844,11 @@ > > AddMIPSTargetArgs(Args, CmdArgs); > > break; > > > > + case llvm::Triple::ppc: > > + case llvm::Triple::ppc64: > > + AddPPCTargetArgs(Args, CmdArgs); > > + break; > > + > > case llvm::Triple::sparc: > > AddSparcTargetArgs(Args, CmdArgs); > > break; > > > > Modified: cfe/trunk/lib/Driver/Tools.h > > URL: > > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.h?rev=158334&r1=158333&r2=158334&view=diff > > > > ============================================================================== > > --- cfe/trunk/lib/Driver/Tools.h (original) > > +++ cfe/trunk/lib/Driver/Tools.h Mon Jun 11 17:35:19 2012 > > @@ -39,6 +39,7 @@ > > void AddARMTargetArgs(const ArgList &Args, ArgStringList > > &CmdArgs, bool KernelOrKext) const; > > void AddMIPSTargetArgs(const ArgList &Args, ArgStringList > > &CmdArgs) const; > > + void AddPPCTargetArgs(const ArgList &Args, ArgStringList > > &CmdArgs) const; > > void AddSparcTargetArgs(const ArgList &Args, ArgStringList > > &CmdArgs) const; > > void AddX86TargetArgs(const ArgList &Args, ArgStringList > > &CmdArgs) const; > > void AddHexagonTargetArgs (const ArgList &Args, ArgStringList > > &CmdArgs) const; > > > > Modified: cfe/trunk/test/Driver/clang-translation.c > > URL: > > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/clang-translation.c?rev=158334&r1=158333&r2=158334&view=diff > > > > ============================================================================== > > --- cfe/trunk/test/Driver/clang-translation.c (original) > > +++ cfe/trunk/test/Driver/clang-translation.c Mon Jun 11 17:35:19 > > 2012 @@ -51,3 +51,23 @@ > > // ARMV5E: clang > > // ARMV5E: "-cc1" > > // ARMV5E: "-target-cpu" "arm1022e" > > + > > +// RUN: %clang -target powerpc64-unknown-linux-gnu -### -S %s 2> > > %t.log \ +// RUN: -mcpu=G5 > > +// RUN: FileCheck -check-prefix=PPCG5 %s < %t.log > > +// PPCG5: clang > > +// PPCG5: "-cc1" > > +// PPCG5: "-target-cpu" "g5" > > + > > +// RUN: %clang -target powerpc64-unknown-linux-gnu -### -S %s 2> > > %t.log \ +// RUN: -mcpu=power7 > > +// RUN: FileCheck -check-prefix=PPCPWR7 %s < %t.log > > +// PPCPWR7: clang > > +// PPCPWR7: "-cc1" > > +// PPCPWR7: "-target-cpu" "pwr7" > > + > > +// RUN: %clang -target powerpc64-unknown-linux-gnu -### -S %s 2> > > %t.log +// RUN: FileCheck -check-prefix=PPC64NS %s < %t.log > > +// PPC64NS: clang > > +// PPC64NS: "-cc1" > > +// PPC64NS: "-target-cpu" "ppc64" > > > > Modified: cfe/trunk/test/Preprocessor/init.c > > URL: > > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Preprocessor/init.c?rev=158334&r1=158333&r2=158334&view=diff > > > > ============================================================================== > > --- cfe/trunk/test/Preprocessor/init.c (original) > > +++ cfe/trunk/test/Preprocessor/init.c Mon Jun 11 17:35:19 2012 > > @@ -967,10 +967,11 @@ > > // MSP430:#define __WINT_WIDTH__ 16 > > // MSP430:#define __clang__ 1 > > // > > -// RUN: %clang_cc1 -E -dM -ffreestanding > > -triple=powerpc64-none-none -fno-signed-char < /dev/null | > > FileCheck -check-prefix PPC64 %s +// RUN: %clang_cc1 -E -dM > > -ffreestanding -triple=powerpc64-none-none -target-cpu pwr7 > > -fno-signed-char < /dev/null | FileCheck -check-prefix PPC64 %s > > // > > // PPC64:#define _ARCH_PPC 1 > > // PPC64:#define _ARCH_PPC64 1 > > +// PPC64:#define _ARCH_PWR7 1 > > // PPC64:#define _BIG_ENDIAN 1 > > // PPC64:#define _LP64 1 > > // PPC64:#define __BIG_ENDIAN__ 1 > > > > > > _______________________________________________ > > cfe-commits mailing list > > [email protected] > > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > > -- Hal Finkel Postdoctoral Appointee Leadership Computing Facility Argonne National Laboratory _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
