1326941Sdim//===--- PNaCl.h - Declare PNaCl target feature support ---------*- C++ -*-===// 2326941Sdim// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6326941Sdim// 7326941Sdim//===----------------------------------------------------------------------===// 8326941Sdim// 9326941Sdim// This file declares PNaCl TargetInfo objects. 10326941Sdim// 11326941Sdim//===----------------------------------------------------------------------===// 12326941Sdim 13326941Sdim#ifndef LLVM_CLANG_LIB_BASIC_TARGETS_PNACL_H 14326941Sdim#define LLVM_CLANG_LIB_BASIC_TARGETS_PNACL_H 15326941Sdim 16326941Sdim#include "Mips.h" 17326941Sdim#include "clang/Basic/TargetInfo.h" 18326941Sdim#include "clang/Basic/TargetOptions.h" 19326941Sdim#include "llvm/ADT/Triple.h" 20326941Sdim#include "llvm/Support/Compiler.h" 21326941Sdim 22326941Sdimnamespace clang { 23326941Sdimnamespace targets { 24326941Sdim 25326941Sdimclass LLVM_LIBRARY_VISIBILITY PNaClTargetInfo : public TargetInfo { 26326941Sdimpublic: 27326941Sdim PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 28326941Sdim : TargetInfo(Triple) { 29326941Sdim this->LongAlign = 32; 30326941Sdim this->LongWidth = 32; 31326941Sdim this->PointerAlign = 32; 32326941Sdim this->PointerWidth = 32; 33326941Sdim this->IntMaxType = TargetInfo::SignedLongLong; 34326941Sdim this->Int64Type = TargetInfo::SignedLongLong; 35326941Sdim this->DoubleAlign = 64; 36326941Sdim this->LongDoubleWidth = 64; 37326941Sdim this->LongDoubleAlign = 64; 38326941Sdim this->SizeType = TargetInfo::UnsignedInt; 39326941Sdim this->PtrDiffType = TargetInfo::SignedInt; 40326941Sdim this->IntPtrType = TargetInfo::SignedInt; 41326941Sdim this->RegParmMax = 0; // Disallow regparm 42326941Sdim } 43326941Sdim 44326941Sdim void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const; 45326941Sdim 46326941Sdim void getTargetDefines(const LangOptions &Opts, 47326941Sdim MacroBuilder &Builder) const override { 48326941Sdim getArchDefines(Opts, Builder); 49326941Sdim } 50326941Sdim 51326941Sdim bool hasFeature(StringRef Feature) const override { 52326941Sdim return Feature == "pnacl"; 53326941Sdim } 54326941Sdim 55326941Sdim ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; } 56326941Sdim 57326941Sdim BuiltinVaListKind getBuiltinVaListKind() const override { 58326941Sdim return TargetInfo::PNaClABIBuiltinVaList; 59326941Sdim } 60326941Sdim 61326941Sdim ArrayRef<const char *> getGCCRegNames() const override; 62326941Sdim 63326941Sdim ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override; 64326941Sdim 65326941Sdim bool validateAsmConstraint(const char *&Name, 66326941Sdim TargetInfo::ConstraintInfo &Info) const override { 67326941Sdim return false; 68326941Sdim } 69326941Sdim 70326941Sdim const char *getClobbers() const override { return ""; } 71326941Sdim}; 72326941Sdim 73326941Sdim// We attempt to use PNaCl (le32) frontend and Mips32EL backend. 74326941Sdimclass LLVM_LIBRARY_VISIBILITY NaClMips32TargetInfo : public MipsTargetInfo { 75326941Sdimpublic: 76326941Sdim NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 77326941Sdim : MipsTargetInfo(Triple, Opts) {} 78326941Sdim 79326941Sdim BuiltinVaListKind getBuiltinVaListKind() const override { 80326941Sdim return TargetInfo::PNaClABIBuiltinVaList; 81326941Sdim } 82326941Sdim}; 83326941Sdim} // namespace targets 84326941Sdim} // namespace clang 85326941Sdim 86326941Sdim#endif // LLVM_CLANG_LIB_BASIC_TARGETS_PNACL_H 87