[cfe-dev] [PATCH] Add preliminary Alpha support

Andrew Lenharth andrewl at lenharth.org
Wed May 11 13:48:22 PDT 2011


On Wed, May 11, 2011 at 3:40 PM, Matt Turner <mattst88 at gmail.com> wrote:
> Signed-off-by: Matt Turner <mattst88 at gmail.com>
> ---
> So LLVM's Alpha backend works, somewhat. It generates code that segfaults at
> any optimization level except -O0, but this is a start at reviving it.

The patch looks good, but I haven't looked at clang stuff for quite a
while.  Others can comment more here.

> Things I'm unsure about:
>        DescriptionString - I think everything is natually aligned, but the MIPS
>        desc string I looked at specified 32-bit alignment for 8 and 16-bit units.
>
>        getDefaultFeatures - This seems to be where ISA additions should be created,
>        or something, but I see 'FIXME: This should not be here.' in other arch's
>        code. So, what goes here?

If your assumption is correct, then probably nothing.  I took 21164
support out a few years ago, so only 21264 features are supported.

>        getTargetDefines - I don't know what this function does. Sets what the
>        preprocessor is supposed to define? gcc defines __alpha__ and some other
>        things dependent on features supported. Should these things be defined here?
>
>        getTargetBuiltins - No idea what this is.

I would assume things like:
__builtin_alpha_mskwh
__builtin_alpha_minub8

>        validateAsmConstraint - I think this is for validating inline assembly inputs
>        and outputs? If so, this shouldn't be a problem.

Yes.  I think you should only need to check INT/FP ness to validate most asm.

>        getClobbers - Must be for inline assembly. The only relevant comments I see
>        in other code is '// FIXME: Is this really right?', so not terribly helpful.

There shouldn't be hidden clobbers, so this doesn't seem too bad.

> So, help on figuring out what to do for these would be fantastic. Other review
> very much welcomed!
>
> Thanks,
> Matt
>
>  lib/Basic/Targets.cpp     |  110 +++++++++++++++++++++++++++++++++++++++++++++
>  lib/Driver/ToolChains.cpp |    4 +-
>  lib/Driver/Tools.cpp      |    5 ++-
>  3 files changed, 117 insertions(+), 2 deletions(-)
>
> diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp
> index 09a2f56..de7e5ee 100644
> --- a/lib/Basic/Targets.cpp
> +++ b/lib/Basic/Targets.cpp
> @@ -1785,6 +1785,113 @@ public:
>  } // end anonymous namespace
>
>  namespace {
> +class AlphaTargetInfo : public TargetInfo {
> +  std::string CPU;
> +  static const TargetInfo::GCCRegAlias GCCRegAliases[];
> +  static const char * const GCCRegNames[];
> +public:
> +  AlphaTargetInfo(const std::string& triple) : TargetInfo(triple) {
> +    DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
> +                        "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n64";
> +  }
> +  virtual bool setCPU(const std::string &Name) {
> +    CPU = Name;
> +    return true;
> +  }
> +  void getDefaultFeatures(const std::string &CPU,
> +                          llvm::StringMap<bool> &Features) const {
> +    Features[CPU] = true;
> +  }
> +  virtual void getTargetDefines(const LangOptions &Opts,
> +                                MacroBuilder &Builder) const {
> +    DefineStd(Builder, "alpha", Opts);
> +    Builder.defineMacro("_alpha");
> +    DefineStd(Builder, "ALPHA", Opts);
> +    Builder.defineMacro("_ALPHA");
> +    Builder.defineMacro("__REGISTER_PREFIX__", "");
> +  }
> +  virtual void getTargetBuiltins(const Builtin::Info *&Records,
> +                                 unsigned &NumRecords) const {
> +    // FIXME: Implement!
> +  }
> +  virtual const char *getVAListDeclaration() const {
> +    return "typedef void* __builtin_va_list;";
> +  }
> +  virtual void getGCCRegNames(const char * const *&Names,
> +                              unsigned &NumNames) const;
> +  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
> +                                unsigned &NumAliases) const;
> +  virtual bool validateAsmConstraint(const char *&Name,
> +                                     TargetInfo::ConstraintInfo &Info) const {
> +    return false;
> +  }
> +
> +  virtual const char *getClobbers() const {
> +    // FIXME: Implement!
> +    return "";
> +  }
> +};
> +
> +const char * const AlphaTargetInfo::GCCRegNames[] = {
> +  "$0",   "$1",   "$2",   "$3",   "$4",   "$5",   "$6",   "$7",
> +  "$8",   "$9",   "$10",  "$11",  "$12",  "$13",  "$14",  "$15",
> +  "$16",  "$17",  "$18",  "$19",  "$20",  "$21",  "$22",  "$23",
> +  "$24",  "$25",  "$26",  "$27",  "$28",  "$sp",  "$fp",  "$31",
> +  "$f0",  "$f1",  "$f2",  "$f3",  "$f4",  "$f5",  "$f6",  "$f7",
> +  "$f8",  "$f9",  "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
> +  "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
> +  "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31"
> +};
> +
> +void AlphaTargetInfo::getGCCRegNames(const char * const *&Names,
> +                                     unsigned &NumNames) const {
> +  Names = GCCRegNames;
> +  NumNames = llvm::array_lengthof(GCCRegNames);
> +}
> +
> +const TargetInfo::GCCRegAlias AlphaTargetInfo::GCCRegAliases[] = {
> +  { { "v0" },  "$0" },
> +  { { "t0" },  "$1" },
> +  { { "t1" },  "$2" },
> +  { { "t2" },  "$3" },
> +  { { "t3" },  "$4" },
> +  { { "t4" },  "$5" },
> +  { { "t5" },  "$6" },
> +  { { "t6" },  "$7" },
> +  { { "t7" },  "$8" },
> +  { { "s0" },  "$9" },
> +  { { "s1" }, "$10" },
> +  { { "s2" }, "$11" },
> +  { { "s3" }, "$12" },
> +  { { "s4" }, "$13" },
> +  { { "s5" }, "$14" },
> +  { { "s6", "fp" }, "$15" },
> +  { { "a0" }, "$16" },
> +  { { "a1" }, "$17" },
> +  { { "a2" }, "$18" },
> +  { { "a3" }, "$19" },
> +  { { "a4" }, "$20" },
> +  { { "a5" }, "$21" },
> +  { { "t8" }, "$22" },
> +  { { "t9" }, "$23" },
> +  { { "t10" }, "$24" },
> +  { { "t11" }, "$25" },
> +  { { "ra" }, "$26" },
> +  { { "t12", "pv" }, "$27" },
> +  { { "at" }, "$28" },
> +  { { "gp" }, "$29" },
> +  { { "sp" }, "$30" },
> +  { { "zero" }, "$31" }
> +};
> +
> +void AlphaTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
> +                                       unsigned &NumAliases) const {
> +  Aliases = GCCRegAliases;
> +  NumAliases = llvm::array_lengthof(GCCRegAliases);
> +}
> +} // end anonymous namespace.
> +
> +namespace {
>  class ARMTargetInfo : public TargetInfo {
>   // Possible FPU choices.
>   enum FPUMode {
> @@ -2693,6 +2800,9 @@ static TargetInfo *AllocateTarget(const std::string &T) {
>   default:
>     return NULL;
>
> +  case llvm::Triple::alpha:
> +    return new LinuxTargetInfo<AlphaTargetInfo>(T);
> +
>   case llvm::Triple::arm:
>   case llvm::Triple::thumb:
>     if (Triple.isOSDarwin())
> diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp
> index 4668d73..2ff58fb 100644
> --- a/lib/Driver/ToolChains.cpp
> +++ b/lib/Driver/ToolChains.cpp
> @@ -1319,7 +1319,9 @@ Linux::Linux(const HostInfo &Host, const llvm::Triple &Triple)
>     Lib64 = "lib64";
>
>   std::string GccTriple = "";
> -  if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
> +  if (Arch == llvm::Triple::alpha) {
> +    GccTriple = "alpha-unknown-linux-gnu";
> +  } else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
>     if (!llvm::sys::fs::exists("/usr/lib/gcc/arm-linux-gnueabi", Exists) &&
>         Exists)
>       GccTriple = "arm-linux-gnueabi";
> diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp
> index a8998c4..681b0ed 100644
> --- a/lib/Driver/Tools.cpp
> +++ b/lib/Driver/Tools.cpp
> @@ -3819,6 +3819,8 @@ void linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA,
>   else if (ToolChain.getArch() == llvm::Triple::arm
>            ||  ToolChain.getArch() == llvm::Triple::thumb)
>     CmdArgs.push_back("armelf_linux_eabi");
> +  else if (ToolChain.getArch() == llvm::Triple::alpha)
> +    CmdArgs.push_back("elf64alpha");
>   else if (ToolChain.getArch() == llvm::Triple::ppc)
>     CmdArgs.push_back("elf32ppclinux");
>   else if (ToolChain.getArch() == llvm::Triple::ppc64)
> @@ -3841,7 +3843,8 @@ void linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA,
>       (!Args.hasArg(options::OPT_static) &&
>        !Args.hasArg(options::OPT_shared))) {
>     CmdArgs.push_back("-dynamic-linker");
> -    if (ToolChain.getArch() == llvm::Triple::x86)
> +    if (ToolChain.getArch() == llvm::Triple::x86 ||
> +        ToolChain.getArch() == llvm::Triple::alpha)
>       CmdArgs.push_back("/lib/ld-linux.so.2");
>     else if (ToolChain.getArch() == llvm::Triple::arm ||
>              ToolChain.getArch() == llvm::Triple::thumb)
> --
> 1.7.3.4
>
>




More information about the cfe-dev mailing list