1 | //===---- PPCCCState.h - CCState with PowerPC specific extensions -----------===// |
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 PPCCCSTATE_H |
10 | #define PPCCCSTATE_H |
11 | |
12 | #include "PPCISelLowering.h" |
13 | #include "llvm/ADT/BitVector.h" |
14 | #include "llvm/ADT/SmallVector.h" |
15 | #include "llvm/CodeGen/CallingConvLower.h" |
16 | |
17 | namespace llvm { |
18 | |
19 | class PPCCCState : public CCState { |
20 | public: |
21 | |
22 | void |
23 | PreAnalyzeCallOperands(const SmallVectorImpl<ISD::OutputArg> &Outs); |
24 | void |
25 | PreAnalyzeFormalArguments(const SmallVectorImpl<ISD::InputArg> &Ins); |
26 | |
27 | private: |
28 | |
29 | // Records whether the value has been lowered from an ppcf128. |
30 | SmallVector<bool, 4> OriginalArgWasPPCF128; |
31 | |
32 | public: |
33 | PPCCCState(CallingConv::ID CC, bool isVarArg, MachineFunction &MF, |
34 | SmallVectorImpl<CCValAssign> &locs, LLVMContext &C) |
35 | : CCState(CC, isVarArg, MF, locs, C) {} |
36 | |
37 | bool WasOriginalArgPPCF128(unsigned ValNo) { return OriginalArgWasPPCF128[ValNo]; } |
38 | void clearWasPPCF128() { OriginalArgWasPPCF128.clear(); } |
39 | }; |
40 | |
41 | class AIXCCState : public CCState { |
42 | private: |
43 | BitVector IsFixed; |
44 | |
45 | public: |
46 | AIXCCState(CallingConv::ID CC, bool IsVarArg, MachineFunction &MF, |
47 | SmallVectorImpl<CCValAssign> &Locs, LLVMContext &C) |
48 | : CCState(CC, IsVarArg, MF, Locs, C) {} |
49 | |
50 | void AnalyzeFormalArguments(const SmallVectorImpl<ISD::InputArg> &Ins, |
51 | CCAssignFn Fn) { |
52 | // All formal arguments are fixed. |
53 | IsFixed.resize(N: Ins.size(), t: true); |
54 | CCState::AnalyzeFormalArguments(Ins, Fn); |
55 | } |
56 | |
57 | void AnalyzeCallOperands(const SmallVectorImpl<ISD::OutputArg> &Outs, |
58 | CCAssignFn Fn) { |
59 | // Record whether the call operand was a fixed argument. |
60 | IsFixed.resize(N: Outs.size(), t: false); |
61 | for (unsigned ValNo = 0, E = Outs.size(); ValNo != E; ++ValNo) |
62 | if (Outs[ValNo].IsFixed) |
63 | IsFixed.set(ValNo); |
64 | |
65 | CCState::AnalyzeCallOperands(Outs, Fn); |
66 | } |
67 | |
68 | bool isFixed(unsigned ValNo) const { return IsFixed.test(Idx: ValNo); } |
69 | }; |
70 | |
71 | } // end namespace llvm |
72 | |
73 | #endif |
74 | |