diff options
author | Kai Nacke <kai@redstar.de> | 2021-09-23 22:53:16 -0400 |
---|---|---|
committer | Kai Nacke <kai@redstar.de> | 2022-11-13 11:06:31 -0500 |
commit | f5d70dc2e708cc3e78b426c0a662753fd3df44d5 (patch) | |
tree | 88b277dfc676399c20fc42ba4bbcb92bbc4dc6dd /clang | |
parent | 1f98e294d98c771cf39f397316994abd3bb2bd1c (diff) | |
download | llvm-f5d70dc2e708cc3e78b426c0a662753fd3df44d5.zip llvm-f5d70dc2e708cc3e78b426c0a662753fd3df44d5.tar.gz llvm-f5d70dc2e708cc3e78b426c0a662753fd3df44d5.tar.bz2 |
[m88k] Implement basic clang support.
Diffstat (limited to 'clang')
-rw-r--r-- | clang/include/clang/Basic/Attr.td | 1 | ||||
-rw-r--r-- | clang/include/clang/Driver/Options.td | 7 | ||||
-rw-r--r-- | clang/lib/Basic/CMakeLists.txt | 1 | ||||
-rw-r--r-- | clang/lib/Basic/Targets.cpp | 9 | ||||
-rw-r--r-- | clang/lib/Basic/Targets/M88k.cpp | 152 | ||||
-rw-r--r-- | clang/lib/Basic/Targets/M88k.h | 49 | ||||
-rw-r--r-- | clang/lib/Driver/CMakeLists.txt | 1 | ||||
-rw-r--r-- | clang/lib/Driver/ToolChains/Arch/M88k.cpp | 83 | ||||
-rw-r--r-- | clang/lib/Driver/ToolChains/Arch/M88k.h | 42 | ||||
-rw-r--r-- | clang/lib/Driver/ToolChains/Clang.cpp | 4 | ||||
-rw-r--r-- | clang/lib/Driver/ToolChains/CommonArgs.cpp | 4 |
11 files changed, 353 insertions, 0 deletions
diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td index 16cf932..0dfb6a0 100644 --- a/clang/include/clang/Basic/Attr.td +++ b/clang/include/clang/Basic/Attr.td @@ -404,6 +404,7 @@ def TargetMips32 : TargetArch<["mips", "mipsel"]>; def TargetAnyMips : TargetArch<["mips", "mipsel", "mips64", "mips64el"]>; def TargetMSP430 : TargetArch<["msp430"]>; def TargetM68k : TargetArch<["m68k"]>; +def TargetM88k : TargetArch<["m88k"]>; def TargetRISCV : TargetArch<["riscv32", "riscv64"]>; def TargetX86 : TargetArch<["x86"]>; def TargetAnyX86 : TargetArch<["x86", "x86_64"]>; diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index a501306..78cab84 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -170,6 +170,8 @@ def m_hexagon_Features_HVX_Group : OptionGroup<"<hexagon features group>">, Group<m_Group>, DocName<"Hexagon">; def m_m68k_Features_Group: OptionGroup<"<m68k features group>">, Group<m_Group>, DocName<"M68k">; +def m_m88k_Features_Group: OptionGroup<"<m88k features group>">, + Group<m_Group>, DocName<"M88k">; def m_mips_Features_Group : OptionGroup<"<mips features group>">, Group<m_Group>, DocName<"MIPS">; def m_ppc_Features_Group : OptionGroup<"<ppc features group>">, @@ -4525,6 +4527,11 @@ foreach i = {0-7} in def ffixed_d#i : Flag<["-"], "ffixed-d"#i>, Group<m_m68k_Features_Group>, HelpText<"Reserve the d"#i#" register (M68k only)">; +// M88k features flags +def m88000 : Flag<["-"], "m88000">, Group<m_m88k_Features_Group>; +def m88100 : Flag<["-"], "m88100">, Group<m_m88k_Features_Group>; +def m88110 : Flag<["-"], "m88110">, Group<m_m88k_Features_Group>; + // X86 feature flags def mx87 : Flag<["-"], "mx87">, Group<m_x86_Features_Group>; def mno_x87 : Flag<["-"], "mno-x87">, Group<m_x86_Features_Group>; diff --git a/clang/lib/Basic/CMakeLists.txt b/clang/lib/Basic/CMakeLists.txt index f0f3839..78158ca 100644 --- a/clang/lib/Basic/CMakeLists.txt +++ b/clang/lib/Basic/CMakeLists.txt @@ -84,6 +84,7 @@ add_clang_library(clangBasic Targets/Le64.cpp Targets/LoongArch.cpp Targets/M68k.cpp + Targets/M88k.cpp Targets/MSP430.cpp Targets/Mips.cpp Targets/NVPTX.cpp diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index 8400774..93ccf80 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -26,6 +26,7 @@ #include "Targets/Le64.h" #include "Targets/LoongArch.h" #include "Targets/M68k.h" +#include "Targets/M88k.h" #include "Targets/MSP430.h" #include "Targets/Mips.h" #include "Targets/NVPTX.h" @@ -318,6 +319,14 @@ TargetInfo *AllocateTarget(const llvm::Triple &Triple, return new M68kTargetInfo(Triple, Opts); } + case llvm::Triple::m88k: + switch (os) { + case llvm::Triple::OpenBSD: + return new OpenBSDTargetInfo<M88kTargetInfo>(Triple, Opts); + default: + return new M88kTargetInfo(Triple, Opts); + } + case llvm::Triple::le32: switch (os) { case llvm::Triple::NaCl: diff --git a/clang/lib/Basic/Targets/M88k.cpp b/clang/lib/Basic/Targets/M88k.cpp new file mode 100644 index 0000000..e60f75c --- /dev/null +++ b/clang/lib/Basic/Targets/M88k.cpp @@ -0,0 +1,152 @@ +//===--- M88k.cpp - Implement M88k targets feature support ----------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file implements M88k TargetInfo objects. +// +//===----------------------------------------------------------------------===// + +#include "M88k.h" +#include "clang/Basic/Builtins.h" +#include "clang/Basic/Diagnostic.h" +#include "clang/Basic/TargetBuiltins.h" +#include "llvm/ADT/StringExtras.h" +#include "llvm/ADT/StringRef.h" +#include "llvm/ADT/StringSwitch.h" +#include "llvm/Support/TargetParser.h" +#include <cstring> + +namespace clang { +namespace targets { + +M88kTargetInfo::M88kTargetInfo(const llvm::Triple &Triple, + const TargetOptions &) + : TargetInfo(Triple) { + + std::string Layout = ""; + + // M68k is Big Endian + Layout += "E"; + + // FIXME how to wire it with the used object format? + Layout += "-m:e"; + + // Pointers are 32 bit. + Layout += "-p:32:8:32"; + + // Make sure that global data has at least 16 bits of alignment by + // default, so that we can refer to it using LARL. We don't have any + // special requirements for stack variables though. + Layout += "-i1:8:16-i8:8:16"; + + // 64-bit integers are naturally aligned. + Layout += "-i64:64"; + + // 128-bit floats are aligned only to 64 bits. + Layout += "-f128:64"; + + // We prefer 16 bits of aligned for all globals; see above. + Layout += "-a:8:16"; + + // Integer registers are 32bits. + Layout += "-n32"; + + resetDataLayout(Layout); + + SizeType = UnsignedInt; + PtrDiffType = SignedInt; + IntPtrType = SignedInt; +} + +bool M88kTargetInfo::setCPU(const std::string &Name) { + StringRef N = Name; + CPU = llvm::StringSwitch<CPUKind>(N) + .Case("generic", CK_88000) + .Case("M88000", CK_88000) + .Case("M88100", CK_88100) + .Case("M88110", CK_88110) + .Default(CK_Unknown); + return CPU != CK_Unknown; +} + +void M88kTargetInfo::getTargetDefines(const LangOptions &Opts, + MacroBuilder &Builder) const { + using llvm::Twine; + + Builder.defineMacro("__m88k__"); + Builder.defineMacro("__m88k"); + + // For sub-architecture + switch (CPU) { + case CK_88000: + Builder.defineMacro("__mc88000__"); + break; + case CK_88100: + Builder.defineMacro("__mc88100__"); + break; + case CK_88110: + Builder.defineMacro("__mc88110__"); + break; + default: + break; + } +} + +ArrayRef<Builtin::Info> M88kTargetInfo::getTargetBuiltins() const { + // TODO Implement. + return None; +} + +bool M88kTargetInfo::hasFeature(StringRef Feature) const { + // TODO Implement. + return Feature == "M88000"; +} + +const char *const M88kTargetInfo::GCCRegNames[] = { + // TODO Extended registers, control registers. + "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", + "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21", + "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r39", "r31"}; + +ArrayRef<const char *> M88kTargetInfo::getGCCRegNames() const { + return llvm::makeArrayRef(GCCRegNames); +} + +ArrayRef<TargetInfo::GCCRegAlias> M88kTargetInfo::getGCCRegAliases() const { + // No aliases. + return None; +} + +bool M88kTargetInfo::validateAsmConstraint( + const char *&Name, TargetInfo::ConstraintInfo &info) const { + // TODO Implement. + switch (*Name) { + case 'a': // address register + case 'd': // data register + case 'f': // floating point register + info.setAllowsRegister(); + return true; + case 'K': // the constant 1 + case 'L': // constant -1^20 .. 1^19 + case 'M': // constant 1-4: + return true; + } + return false; +} + +const char *M88kTargetInfo::getClobbers() const { + // TODO Implement. + return ""; +} + +M88kTargetInfo::BuiltinVaListKind M88kTargetInfo::getBuiltinVaListKind() const { + // TODO Check. + return TargetInfo::VoidPtrBuiltinVaList; +} + +} // namespace targets +} // namespace clang diff --git a/clang/lib/Basic/Targets/M88k.h b/clang/lib/Basic/Targets/M88k.h new file mode 100644 index 0000000..f959668 --- /dev/null +++ b/clang/lib/Basic/Targets/M88k.h @@ -0,0 +1,49 @@ +//===--- M88k.h - Declare M88k target feature support ---------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file declares M88k TargetInfo objects. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_LIB_BASIC_TARGETS_M88K_H +#define LLVM_CLANG_LIB_BASIC_TARGETS_M88K_H + +#include "OSTargets.h" +#include "clang/Basic/TargetInfo.h" +#include "clang/Basic/TargetOptions.h" +#include "llvm/ADT/Triple.h" +#include "llvm/Support/Compiler.h" + +namespace clang { +namespace targets { + +class LLVM_LIBRARY_VISIBILITY M88kTargetInfo : public TargetInfo { + static const char *const GCCRegNames[]; + + enum CPUKind { CK_Unknown, CK_88000, CK_88100, CK_88110 } CPU = CK_Unknown; + +public: + M88kTargetInfo(const llvm::Triple &Triple, const TargetOptions &); + + void getTargetDefines(const LangOptions &Opts, + MacroBuilder &Builder) const override; + ArrayRef<Builtin::Info> getTargetBuiltins() const override; + bool hasFeature(StringRef Feature) const override; + ArrayRef<const char *> getGCCRegNames() const override; + ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override; + bool validateAsmConstraint(const char *&Name, + TargetInfo::ConstraintInfo &info) const override; + const char *getClobbers() const override; + BuiltinVaListKind getBuiltinVaListKind() const override; + bool setCPU(const std::string &Name) override; +}; + +} // namespace targets +} // namespace clang + +#endif // LLVM_CLANG_LIB_BASIC_TARGETS_M88K_H diff --git a/clang/lib/Driver/CMakeLists.txt b/clang/lib/Driver/CMakeLists.txt index cfef82c..145d4361 100644 --- a/clang/lib/Driver/CMakeLists.txt +++ b/clang/lib/Driver/CMakeLists.txt @@ -32,6 +32,7 @@ add_clang_library(clangDriver ToolChains/Arch/CSKY.cpp ToolChains/Arch/LoongArch.cpp ToolChains/Arch/M68k.cpp + ToolChains/Arch/M88k.cpp ToolChains/Arch/Mips.cpp ToolChains/Arch/PPC.cpp ToolChains/Arch/RISCV.cpp diff --git a/clang/lib/Driver/ToolChains/Arch/M88k.cpp b/clang/lib/Driver/ToolChains/Arch/M88k.cpp new file mode 100644 index 0000000..1d74d12 --- /dev/null +++ b/clang/lib/Driver/ToolChains/Arch/M88k.cpp @@ -0,0 +1,83 @@ +//===--- M88k.cpp - M88k Helpers for Tools --------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "M88k.h" +#include "ToolChains/CommonArgs.h" +#include "clang/Driver/Driver.h" +#include "clang/Driver/DriverDiagnostic.h" +#include "clang/Driver/Options.h" +#include "llvm/ADT/SmallVector.h" +#include "llvm/ADT/StringSwitch.h" +#include "llvm/Option/ArgList.h" +#include "llvm/Support/Host.h" +#include "llvm/Support/Regex.h" +#include <sstream> + +using namespace clang::driver; +using namespace clang::driver::tools; +using namespace clang; +using namespace llvm::opt; + +/// getM88KTargetCPU - Get the (LLVM) name of the 88000 cpu we are targeting. +std::string m88k::getM88kTargetCPU(const ArgList &Args) { + if (Arg *A = Args.getLastArg(clang::driver::options::OPT_mcpu_EQ)) { + // The canonical CPU name is captalize. However, we allow + // starting with lower case or numbers only + StringRef CPUName = A->getValue(); + + if (CPUName == "native") { + std::string CPU = std::string(llvm::sys::getHostCPUName()); + if (!CPU.empty() && CPU != "generic") + return CPU; + } + + if (CPUName == "common") + return "generic"; + + return llvm::StringSwitch<std::string>(CPUName) + .Cases("m88000", "88000", "M88000") + .Cases("m88100", "88100", "M88100") + .Cases("m88110", "88110", "M88110") + .Default(CPUName.str()); + } + // FIXME: Throw error when multiple sub-architecture flag exist + if (Args.hasArg(clang::driver::options::OPT_m88000)) + return "M88000"; + if (Args.hasArg(clang::driver::options::OPT_m88100)) + return "M88100"; + if (Args.hasArg(clang::driver::options::OPT_m88110)) + return "M88110"; + + return ""; +} + +void m88k::getM88kTargetFeatures(const Driver &D, const llvm::Triple &Triple, + const ArgList &Args, + std::vector<StringRef> &Features) { + m88k::FloatABI FloatABI = m88k::getM88kFloatABI(D, Args); + if (FloatABI == m88k::FloatABI::Soft) + Features.push_back("-hard-float"); +} + +m88k::FloatABI m88k::getM88kFloatABI(const Driver &D, const ArgList &Args) { + m88k::FloatABI ABI = m88k::FloatABI::Invalid; + if (Arg *A = + Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) { + + if (A->getOption().matches(options::OPT_msoft_float)) + ABI = m88k::FloatABI::Soft; + else if (A->getOption().matches(options::OPT_mhard_float)) + ABI = m88k::FloatABI::Hard; + } + + // If unspecified, choose the default based on the platform. + if (ABI == m88k::FloatABI::Invalid) + ABI = m88k::FloatABI::Hard; + + return ABI; +} diff --git a/clang/lib/Driver/ToolChains/Arch/M88k.h b/clang/lib/Driver/ToolChains/Arch/M88k.h new file mode 100644 index 0000000..05c67fa --- /dev/null +++ b/clang/lib/Driver/ToolChains/Arch/M88k.h @@ -0,0 +1,42 @@ +//===--- M88k.h - M88k-specific Tool Helpers ------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_ARCH_M88K_H +#define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_ARCH_M88K_H + +#include "clang/Driver/Driver.h" +#include "llvm/ADT/StringRef.h" +#include "llvm/Option/Option.h" +#include <string> +#include <vector> + +namespace clang { +namespace driver { +namespace tools { +namespace m88k { + +enum class FloatABI { + Invalid, + Soft, + Hard, +}; + +FloatABI getM88kFloatABI(const Driver &D, const llvm::opt::ArgList &Args); + +std::string getM88kTargetCPU(const llvm::opt::ArgList &Args); + +void getM88kTargetFeatures(const Driver &D, const llvm::Triple &Triple, + const llvm::opt::ArgList &Args, + std::vector<llvm::StringRef> &Features); + +} // end namespace m88k +} // end namespace tools +} // end namespace driver +} // end namespace clang + +#endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_ARCH_M88K_H diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 90c4bb5..22e15f7 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -13,6 +13,7 @@ #include "Arch/CSKY.h" #include "Arch/LoongArch.h" #include "Arch/M68k.h" +#include "Arch/M88k.h" #include "Arch/Mips.h" #include "Arch/PPC.h" #include "Arch/RISCV.h" @@ -363,6 +364,9 @@ static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple, case llvm::Triple::m68k: m68k::getM68kTargetFeatures(D, Triple, Args, Features); break; + case llvm::Triple::m88k: + m88k::getM88kTargetFeatures(D, Triple, Args, Features); + break; case llvm::Triple::msp430: msp430::getMSP430TargetFeatures(D, Args, Features); break; diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp index 30fca3a4..c71e194 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -10,6 +10,7 @@ #include "Arch/AArch64.h" #include "Arch/ARM.h" #include "Arch/M68k.h" +#include "Arch/M88k.h" #include "Arch/Mips.h" #include "Arch/PPC.h" #include "Arch/RISCV.h" @@ -386,6 +387,9 @@ std::string tools::getCPUName(const Driver &D, const ArgList &Args, case llvm::Triple::m68k: return m68k::getM68kTargetCPU(Args); + case llvm::Triple::m88k: + return m88k::getM88kTargetCPU(Args); + case llvm::Triple::mips: case llvm::Triple::mipsel: case llvm::Triple::mips64: |