| //===--- SystemZ.h - Declare SystemZ target feature support -----*- C++ -*-===// |
| // |
| // 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 SystemZ TargetInfo objects. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_CLANG_LIB_BASIC_TARGETS_SYSTEMZ_H |
| #define LLVM_CLANG_LIB_BASIC_TARGETS_SYSTEMZ_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 SystemZTargetInfo : public TargetInfo { |
| |
| static const Builtin::Info BuiltinInfo[]; |
| static const char *const GCCRegNames[]; |
| std::string CPU; |
| int ISARevision; |
| bool HasTransactionalExecution; |
| bool HasVector; |
| |
| public: |
| SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &) |
| : TargetInfo(Triple), CPU("z10"), ISARevision(8), |
| HasTransactionalExecution(false), HasVector(false) { |
| IntMaxType = SignedLong; |
| Int64Type = SignedLong; |
| TLSSupported = true; |
| IntWidth = IntAlign = 32; |
| LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64; |
| PointerWidth = PointerAlign = 64; |
| LongDoubleWidth = 128; |
| LongDoubleAlign = 64; |
| LongDoubleFormat = &llvm::APFloat::IEEEquad(); |
| DefaultAlignForAttributeAligned = 64; |
| MinGlobalAlign = 16; |
| resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64"); |
| MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64; |
| } |
| |
| void getTargetDefines(const LangOptions &Opts, |
| MacroBuilder &Builder) const override; |
| |
| ArrayRef<Builtin::Info> getTargetBuiltins() const override; |
| |
| ArrayRef<const char *> getGCCRegNames() const override; |
| |
| ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override { |
| // No aliases. |
| return None; |
| } |
| |
| ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override; |
| |
| bool validateAsmConstraint(const char *&Name, |
| TargetInfo::ConstraintInfo &info) const override; |
| |
| const char *getClobbers() const override { |
| // FIXME: Is this really right? |
| return ""; |
| } |
| |
| BuiltinVaListKind getBuiltinVaListKind() const override { |
| return TargetInfo::SystemZBuiltinVaList; |
| } |
| |
| int getISARevision(StringRef Name) const; |
| |
| bool isValidCPUName(StringRef Name) const override { |
| return getISARevision(Name) != -1; |
| } |
| |
| void fillValidCPUList(SmallVectorImpl<StringRef> &Values) const override; |
| |
| bool setCPU(const std::string &Name) override { |
| CPU = Name; |
| ISARevision = getISARevision(CPU); |
| return ISARevision != -1; |
| } |
| |
| bool |
| initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, |
| StringRef CPU, |
| const std::vector<std::string> &FeaturesVec) const override { |
| int ISARevision = getISARevision(CPU); |
| if (ISARevision >= 10) |
| Features["transactional-execution"] = true; |
| if (ISARevision >= 11) |
| Features["vector"] = true; |
| if (ISARevision >= 12) |
| Features["vector-enhancements-1"] = true; |
| if (ISARevision >= 13) |
| Features["vector-enhancements-2"] = true; |
| return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec); |
| } |
| |
| bool handleTargetFeatures(std::vector<std::string> &Features, |
| DiagnosticsEngine &Diags) override { |
| HasTransactionalExecution = false; |
| HasVector = false; |
| for (const auto &Feature : Features) { |
| if (Feature == "+transactional-execution") |
| HasTransactionalExecution = true; |
| else if (Feature == "+vector") |
| HasVector = true; |
| } |
| // If we use the vector ABI, vector types are 64-bit aligned. |
| if (HasVector) { |
| MaxVectorAlign = 64; |
| resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64" |
| "-v128:64-a:8:16-n32:64"); |
| } |
| return true; |
| } |
| |
| bool hasFeature(StringRef Feature) const override; |
| |
| CallingConvCheckResult checkCallingConvention(CallingConv CC) const override { |
| switch (CC) { |
| case CC_C: |
| case CC_Swift: |
| case CC_OpenCLKernel: |
| return CCCR_OK; |
| default: |
| return CCCR_Warning; |
| } |
| } |
| |
| StringRef getABI() const override { |
| if (HasVector) |
| return "vector"; |
| return ""; |
| } |
| |
| const char *getLongDoubleMangling() const override { return "g"; } |
| }; |
| } // namespace targets |
| } // namespace clang |
| #endif // LLVM_CLANG_LIB_BASIC_TARGETS_SYSTEMZ_H |