aboutsummaryrefslogtreecommitdiff
path: root/clang
diff options
context:
space:
mode:
authorKai Nacke <kai@redstar.de>2021-09-23 22:53:16 -0400
committerKai Nacke <kai@redstar.de>2022-11-13 11:06:31 -0500
commitf5d70dc2e708cc3e78b426c0a662753fd3df44d5 (patch)
tree88b277dfc676399c20fc42ba4bbcb92bbc4dc6dd /clang
parent1f98e294d98c771cf39f397316994abd3bb2bd1c (diff)
downloadllvm-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.td1
-rw-r--r--clang/include/clang/Driver/Options.td7
-rw-r--r--clang/lib/Basic/CMakeLists.txt1
-rw-r--r--clang/lib/Basic/Targets.cpp9
-rw-r--r--clang/lib/Basic/Targets/M88k.cpp152
-rw-r--r--clang/lib/Basic/Targets/M88k.h49
-rw-r--r--clang/lib/Driver/CMakeLists.txt1
-rw-r--r--clang/lib/Driver/ToolChains/Arch/M88k.cpp83
-rw-r--r--clang/lib/Driver/ToolChains/Arch/M88k.h42
-rw-r--r--clang/lib/Driver/ToolChains/Clang.cpp4
-rw-r--r--clang/lib/Driver/ToolChains/CommonArgs.cpp4
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: