1 | //===---- MipsABIInfo.h - Information about MIPS ABI's --------------------===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #ifndef LLVM_LIB_TARGET_MIPS_MCTARGETDESC_MIPSABIINFO_H |
10 | #define LLVM_LIB_TARGET_MIPS_MCTARGETDESC_MIPSABIINFO_H |
11 | |
12 | #include "llvm/IR/CallingConv.h" |
13 | #include "llvm/MC/MCRegisterInfo.h" |
14 | #include "llvm/TargetParser/Triple.h" |
15 | |
16 | namespace llvm { |
17 | |
18 | template <typename T> class ArrayRef; |
19 | class MCTargetOptions; |
20 | class StringRef; |
21 | |
22 | class MipsABIInfo { |
23 | public: |
24 | enum class ABI { Unknown, O32, N32, N64 }; |
25 | |
26 | protected: |
27 | ABI ThisABI; |
28 | |
29 | public: |
30 | MipsABIInfo(ABI ThisABI) : ThisABI(ThisABI) {} |
31 | |
32 | static MipsABIInfo Unknown() { return MipsABIInfo(ABI::Unknown); } |
33 | static MipsABIInfo O32() { return MipsABIInfo(ABI::O32); } |
34 | static MipsABIInfo N32() { return MipsABIInfo(ABI::N32); } |
35 | static MipsABIInfo N64() { return MipsABIInfo(ABI::N64); } |
36 | static MipsABIInfo computeTargetABI(const Triple &TT, StringRef CPU, |
37 | const MCTargetOptions &Options); |
38 | |
39 | bool IsKnown() const { return ThisABI != ABI::Unknown; } |
40 | bool IsO32() const { return ThisABI == ABI::O32; } |
41 | bool IsN32() const { return ThisABI == ABI::N32; } |
42 | bool IsN64() const { return ThisABI == ABI::N64; } |
43 | ABI GetEnumValue() const { return ThisABI; } |
44 | |
45 | /// The registers to use for byval arguments. |
46 | ArrayRef<MCPhysReg> GetByValArgRegs() const; |
47 | |
48 | /// The registers to use for the variable argument list. |
49 | ArrayRef<MCPhysReg> GetVarArgRegs() const; |
50 | |
51 | /// Obtain the size of the area allocated by the callee for arguments. |
52 | /// CallingConv::FastCall affects the value for O32. |
53 | unsigned GetCalleeAllocdArgSizeInBytes(CallingConv::ID CC) const; |
54 | |
55 | /// Ordering of ABI's |
56 | /// MipsGenSubtargetInfo.inc will use this to resolve conflicts when given |
57 | /// multiple ABI options. |
58 | bool operator<(const MipsABIInfo Other) const { |
59 | return ThisABI < Other.GetEnumValue(); |
60 | } |
61 | |
62 | unsigned GetStackPtr() const; |
63 | unsigned GetFramePtr() const; |
64 | unsigned GetBasePtr() const; |
65 | unsigned GetGlobalPtr() const; |
66 | unsigned GetNullPtr() const; |
67 | unsigned GetZeroReg() const; |
68 | unsigned GetPtrAdduOp() const; |
69 | unsigned GetPtrAddiuOp() const; |
70 | unsigned GetPtrSubuOp() const; |
71 | unsigned GetPtrAndOp() const; |
72 | unsigned GetGPRMoveOp() const; |
73 | inline bool ArePtrs64bit() const { return IsN64(); } |
74 | inline bool AreGprs64bit() const { return IsN32() || IsN64(); } |
75 | |
76 | unsigned GetEhDataReg(unsigned I) const; |
77 | }; |
78 | } |
79 | |
80 | #endif |
81 | |