diff options
Diffstat (limited to 'contrib/llvm-project/clang/lib/Basic/Targets/M68k.cpp')
-rw-r--r-- | contrib/llvm-project/clang/lib/Basic/Targets/M68k.cpp | 72 |
1 files changed, 44 insertions, 28 deletions
diff --git a/contrib/llvm-project/clang/lib/Basic/Targets/M68k.cpp b/contrib/llvm-project/clang/lib/Basic/Targets/M68k.cpp index c0cd8fa90ed6..1b7e0a7f32c9 100644 --- a/contrib/llvm-project/clang/lib/Basic/Targets/M68k.cpp +++ b/contrib/llvm-project/clang/lib/Basic/Targets/M68k.cpp @@ -17,19 +17,20 @@ #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringRef.h" #include "llvm/ADT/StringSwitch.h" -#include "llvm/Support/TargetParser.h" +#include "llvm/TargetParser/TargetParser.h" #include <cstdint> #include <cstring> #include <limits> +#include <optional> namespace clang { namespace targets { M68kTargetInfo::M68kTargetInfo(const llvm::Triple &Triple, - const TargetOptions &) - : TargetInfo(Triple) { + const TargetOptions &Opts) + : TargetInfo(Triple), TargetOpts(Opts) { - std::string Layout = ""; + std::string Layout; // M68k is Big Endian Layout += "E"; @@ -79,45 +80,44 @@ void M68kTargetInfo::getTargetDefines(const LangOptions &Opts, Builder.defineMacro("__m68k__"); - Builder.defineMacro("mc68000"); - Builder.defineMacro("__mc68000"); - Builder.defineMacro("__mc68000__"); + DefineStd(Builder, "mc68000", Opts); // For sub-architecture switch (CPU) { case CK_68010: - Builder.defineMacro("mc68010"); - Builder.defineMacro("__mc68010"); - Builder.defineMacro("__mc68010__"); + DefineStd(Builder, "mc68010", Opts); break; case CK_68020: - Builder.defineMacro("mc68020"); - Builder.defineMacro("__mc68020"); - Builder.defineMacro("__mc68020__"); + DefineStd(Builder, "mc68020", Opts); break; case CK_68030: - Builder.defineMacro("mc68030"); - Builder.defineMacro("__mc68030"); - Builder.defineMacro("__mc68030__"); + DefineStd(Builder, "mc68030", Opts); break; case CK_68040: - Builder.defineMacro("mc68040"); - Builder.defineMacro("__mc68040"); - Builder.defineMacro("__mc68040__"); + DefineStd(Builder, "mc68040", Opts); break; case CK_68060: - Builder.defineMacro("mc68060"); - Builder.defineMacro("__mc68060"); - Builder.defineMacro("__mc68060__"); + DefineStd(Builder, "mc68060", Opts); break; default: break; } + + if (CPU >= CK_68020) { + Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1"); + Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2"); + Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4"); + } + + // Floating point + if (TargetOpts.FeatureMap.lookup("isa-68881") || + TargetOpts.FeatureMap.lookup("isa-68882")) + Builder.defineMacro("__HAVE_68881__"); } ArrayRef<Builtin::Info> M68kTargetInfo::getTargetBuiltins() const { // FIXME: Implement. - return None; + return std::nullopt; } bool M68kTargetInfo::hasFeature(StringRef Feature) const { @@ -131,12 +131,12 @@ const char *const M68kTargetInfo::GCCRegNames[] = { "pc"}; ArrayRef<const char *> M68kTargetInfo::getGCCRegNames() const { - return llvm::makeArrayRef(GCCRegNames); + return llvm::ArrayRef(GCCRegNames); } ArrayRef<TargetInfo::GCCRegAlias> M68kTargetInfo::getGCCRegAliases() const { // No aliases. - return None; + return std::nullopt; } bool M68kTargetInfo::validateAsmConstraint( @@ -185,13 +185,19 @@ bool M68kTargetInfo::validateAsmConstraint( break; } break; + case 'Q': // address register indirect addressing + case 'U': // address register indirect w/ constant offset addressing + // TODO: Handle 'S' (basically 'm' when pc-rel is enforced) when + // '-mpcrel' flag is properly handled by the driver. + info.setAllowsMemory(); + return true; default: break; } return false; } -llvm::Optional<std::string> +std::optional<std::string> M68kTargetInfo::handleAsmEscapedChar(char EscChar) const { char C; switch (EscChar) { @@ -209,7 +215,7 @@ M68kTargetInfo::handleAsmEscapedChar(char EscChar) const { C = 'd'; break; default: - return llvm::None; + return std::nullopt; } return std::string(1, C); @@ -223,7 +229,7 @@ std::string M68kTargetInfo::convertConstraint(const char *&Constraint) const { return std::string(1, *Constraint); } -const char *M68kTargetInfo::getClobbers() const { +std::string_view M68kTargetInfo::getClobbers() const { // FIXME: Is this really right? return ""; } @@ -232,5 +238,15 @@ TargetInfo::BuiltinVaListKind M68kTargetInfo::getBuiltinVaListKind() const { return TargetInfo::VoidPtrBuiltinVaList; } +TargetInfo::CallingConvCheckResult +M68kTargetInfo::checkCallingConvention(CallingConv CC) const { + switch (CC) { + case CC_C: + case CC_M68kRTD: + return CCCR_OK; + default: + return TargetInfo::checkCallingConvention(CC); + } +} } // namespace targets } // namespace clang |