[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