[cfe-commits] r158334 - in /cfe/trunk: lib/Basic/Targets.cpp lib/Driver/Tools.cpp lib/Driver/Tools.h test/Driver/clang-translation.c test/Preprocessor/init.c

Hal Finkel hfinkel at anl.gov
Mon Jun 11 16:02:29 PDT 2012


On Mon, 11 Jun 2012 15:55:53 -0700
Chandler Carruth <chandlerc at google.com> wrote:

> On Mon, Jun 11, 2012 at 3:35 PM, Hal Finkel <hfinkel at anl.gov> 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
> > cfe-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
> >



-- 
Hal Finkel
Postdoctoral Appointee
Leadership Computing Facility
Argonne National Laboratory



More information about the cfe-commits mailing list