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