1e5dd7070Spatrick //===--- PNaCl.h - Declare PNaCl target feature support ---------*- C++ -*-===// 2e5dd7070Spatrick // 3e5dd7070Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4e5dd7070Spatrick // See https://llvm.org/LICENSE.txt for license information. 5e5dd7070Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6e5dd7070Spatrick // 7e5dd7070Spatrick //===----------------------------------------------------------------------===// 8e5dd7070Spatrick // 9e5dd7070Spatrick // This file declares PNaCl TargetInfo objects. 10e5dd7070Spatrick // 11e5dd7070Spatrick //===----------------------------------------------------------------------===// 12e5dd7070Spatrick 13e5dd7070Spatrick #ifndef LLVM_CLANG_LIB_BASIC_TARGETS_PNACL_H 14e5dd7070Spatrick #define LLVM_CLANG_LIB_BASIC_TARGETS_PNACL_H 15e5dd7070Spatrick 16e5dd7070Spatrick #include "Mips.h" 17e5dd7070Spatrick #include "clang/Basic/TargetInfo.h" 18e5dd7070Spatrick #include "clang/Basic/TargetOptions.h" 19e5dd7070Spatrick #include "llvm/ADT/Triple.h" 20e5dd7070Spatrick #include "llvm/Support/Compiler.h" 21e5dd7070Spatrick 22e5dd7070Spatrick namespace clang { 23e5dd7070Spatrick namespace targets { 24e5dd7070Spatrick 25e5dd7070Spatrick class LLVM_LIBRARY_VISIBILITY PNaClTargetInfo : public TargetInfo { 26e5dd7070Spatrick public: PNaClTargetInfo(const llvm::Triple & Triple,const TargetOptions & Opts)27e5dd7070Spatrick PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 28e5dd7070Spatrick : TargetInfo(Triple) { 29e5dd7070Spatrick this->LongAlign = 32; 30e5dd7070Spatrick this->LongWidth = 32; 31e5dd7070Spatrick this->PointerAlign = 32; 32e5dd7070Spatrick this->PointerWidth = 32; 33e5dd7070Spatrick this->IntMaxType = TargetInfo::SignedLongLong; 34e5dd7070Spatrick this->Int64Type = TargetInfo::SignedLongLong; 35e5dd7070Spatrick this->DoubleAlign = 64; 36e5dd7070Spatrick this->LongDoubleWidth = 64; 37e5dd7070Spatrick this->LongDoubleAlign = 64; 38e5dd7070Spatrick this->SizeType = TargetInfo::UnsignedInt; 39e5dd7070Spatrick this->PtrDiffType = TargetInfo::SignedInt; 40e5dd7070Spatrick this->IntPtrType = TargetInfo::SignedInt; 41e5dd7070Spatrick this->RegParmMax = 0; // Disallow regparm 42e5dd7070Spatrick } 43e5dd7070Spatrick 44e5dd7070Spatrick void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const; 45e5dd7070Spatrick getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder)46e5dd7070Spatrick void getTargetDefines(const LangOptions &Opts, 47e5dd7070Spatrick MacroBuilder &Builder) const override { 48e5dd7070Spatrick getArchDefines(Opts, Builder); 49e5dd7070Spatrick } 50e5dd7070Spatrick hasFeature(StringRef Feature)51e5dd7070Spatrick bool hasFeature(StringRef Feature) const override { 52e5dd7070Spatrick return Feature == "pnacl"; 53e5dd7070Spatrick } 54e5dd7070Spatrick getTargetBuiltins()55*12c85518Srobert ArrayRef<Builtin::Info> getTargetBuiltins() const override { 56*12c85518Srobert return std::nullopt; 57*12c85518Srobert } 58e5dd7070Spatrick getBuiltinVaListKind()59e5dd7070Spatrick BuiltinVaListKind getBuiltinVaListKind() const override { 60e5dd7070Spatrick return TargetInfo::PNaClABIBuiltinVaList; 61e5dd7070Spatrick } 62e5dd7070Spatrick 63e5dd7070Spatrick ArrayRef<const char *> getGCCRegNames() const override; 64e5dd7070Spatrick 65e5dd7070Spatrick ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override; 66e5dd7070Spatrick validateAsmConstraint(const char * & Name,TargetInfo::ConstraintInfo & Info)67e5dd7070Spatrick bool validateAsmConstraint(const char *&Name, 68e5dd7070Spatrick TargetInfo::ConstraintInfo &Info) const override { 69e5dd7070Spatrick return false; 70e5dd7070Spatrick } 71e5dd7070Spatrick getClobbers()72e5dd7070Spatrick const char *getClobbers() const override { return ""; } 73ec727ea7Spatrick hasBitIntType()74*12c85518Srobert bool hasBitIntType() const override { return true; } 75e5dd7070Spatrick }; 76e5dd7070Spatrick 77e5dd7070Spatrick // We attempt to use PNaCl (le32) frontend and Mips32EL backend. 78e5dd7070Spatrick class LLVM_LIBRARY_VISIBILITY NaClMips32TargetInfo : public MipsTargetInfo { 79e5dd7070Spatrick public: NaClMips32TargetInfo(const llvm::Triple & Triple,const TargetOptions & Opts)80e5dd7070Spatrick NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 81e5dd7070Spatrick : MipsTargetInfo(Triple, Opts) {} 82e5dd7070Spatrick getBuiltinVaListKind()83e5dd7070Spatrick BuiltinVaListKind getBuiltinVaListKind() const override { 84e5dd7070Spatrick return TargetInfo::PNaClABIBuiltinVaList; 85e5dd7070Spatrick } 86e5dd7070Spatrick }; 87e5dd7070Spatrick } // namespace targets 88e5dd7070Spatrick } // namespace clang 89e5dd7070Spatrick 90e5dd7070Spatrick #endif // LLVM_CLANG_LIB_BASIC_TARGETS_PNACL_H 91