1 | //===-- PPC.h - Top-level interface for PowerPC Target ----------*- C++ -*-===// |
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 | // This file contains the entry points for global functions defined in the LLVM |
10 | // PowerPC back-end. |
11 | // |
12 | //===----------------------------------------------------------------------===// |
13 | |
14 | #ifndef LLVM_LIB_TARGET_POWERPC_PPC_H |
15 | #define LLVM_LIB_TARGET_POWERPC_PPC_H |
16 | |
17 | #include "llvm/Support/CodeGen.h" |
18 | |
19 | // GCC #defines PPC on Linux but we use it as our namespace name |
20 | #undef PPC |
21 | |
22 | namespace llvm { |
23 | class PPCRegisterBankInfo; |
24 | class PPCSubtarget; |
25 | class PPCTargetMachine; |
26 | class PassRegistry; |
27 | class FunctionPass; |
28 | class InstructionSelector; |
29 | class MachineInstr; |
30 | class MachineOperand; |
31 | class AsmPrinter; |
32 | class MCInst; |
33 | class MCOperand; |
34 | class ModulePass; |
35 | |
36 | #ifndef NDEBUG |
37 | FunctionPass *createPPCCTRLoopsVerify(); |
38 | #endif |
39 | FunctionPass *createPPCLoopInstrFormPrepPass(PPCTargetMachine &TM); |
40 | FunctionPass *createPPCTOCRegDepsPass(); |
41 | FunctionPass *createPPCEarlyReturnPass(); |
42 | FunctionPass *createPPCVSXCopyPass(); |
43 | FunctionPass *createPPCVSXFMAMutatePass(); |
44 | FunctionPass *createPPCVSXSwapRemovalPass(); |
45 | FunctionPass *createPPCReduceCRLogicalsPass(); |
46 | FunctionPass *createPPCMIPeepholePass(); |
47 | FunctionPass *createPPCBranchSelectionPass(); |
48 | FunctionPass *createPPCBranchCoalescingPass(); |
49 | FunctionPass *createPPCISelDag(PPCTargetMachine &TM, CodeGenOptLevel OL); |
50 | FunctionPass *createPPCTLSDynamicCallPass(); |
51 | FunctionPass *createPPCBoolRetToIntPass(); |
52 | FunctionPass *createPPCExpandISELPass(); |
53 | FunctionPass *createPPCPreEmitPeepholePass(); |
54 | FunctionPass *createPPCExpandAtomicPseudoPass(); |
55 | FunctionPass *createPPCCTRLoopsPass(); |
56 | ModulePass *createPPCMergeStringPoolPass(); |
57 | void LowerPPCMachineInstrToMCInst(const MachineInstr *MI, MCInst &OutMI, |
58 | AsmPrinter &AP); |
59 | bool LowerPPCMachineOperandToMCOperand(const MachineOperand &MO, |
60 | MCOperand &OutMO, AsmPrinter &AP); |
61 | |
62 | #ifndef NDEBUG |
63 | void initializePPCCTRLoopsVerifyPass(PassRegistry&); |
64 | #endif |
65 | void initializePPCLoopInstrFormPrepPass(PassRegistry&); |
66 | void initializePPCTOCRegDepsPass(PassRegistry&); |
67 | void initializePPCEarlyReturnPass(PassRegistry&); |
68 | void initializePPCVSXCopyPass(PassRegistry&); |
69 | void initializePPCVSXFMAMutatePass(PassRegistry&); |
70 | void initializePPCVSXSwapRemovalPass(PassRegistry&); |
71 | void initializePPCReduceCRLogicalsPass(PassRegistry&); |
72 | void initializePPCBSelPass(PassRegistry&); |
73 | void initializePPCBranchCoalescingPass(PassRegistry&); |
74 | void initializePPCBoolRetToIntPass(PassRegistry&); |
75 | void initializePPCExpandISELPass(PassRegistry &); |
76 | void initializePPCPreEmitPeepholePass(PassRegistry &); |
77 | void initializePPCTLSDynamicCallPass(PassRegistry &); |
78 | void initializePPCMIPeepholePass(PassRegistry&); |
79 | void initializePPCExpandAtomicPseudoPass(PassRegistry &); |
80 | void initializePPCCTRLoopsPass(PassRegistry &); |
81 | void initializePPCDAGToDAGISelLegacyPass(PassRegistry &); |
82 | void initializePPCMergeStringPoolPass(PassRegistry &); |
83 | |
84 | extern char &PPCVSXFMAMutateID; |
85 | |
86 | ModulePass *createPPCLowerMASSVEntriesPass(); |
87 | void initializePPCLowerMASSVEntriesPass(PassRegistry &); |
88 | extern char &PPCLowerMASSVEntriesID; |
89 | |
90 | ModulePass *createPPCGenScalarMASSEntriesPass(); |
91 | void initializePPCGenScalarMASSEntriesPass(PassRegistry &); |
92 | extern char &PPCGenScalarMASSEntriesID; |
93 | |
94 | InstructionSelector * |
95 | createPPCInstructionSelector(const PPCTargetMachine &, const PPCSubtarget &, |
96 | const PPCRegisterBankInfo &); |
97 | namespace PPCII { |
98 | |
99 | /// Target Operand Flag enum. |
100 | enum TOF { |
101 | //===------------------------------------------------------------------===// |
102 | // PPC Specific MachineOperand flags. |
103 | MO_NO_FLAG, |
104 | |
105 | /// On PPC, the 12 bits are not enough for all target operand flags. |
106 | /// Treat all PPC target flags as direct flags. To define new flag that is |
107 | /// combination of other flags, add new enum entry instead of combining |
108 | /// existing flags. See example MO_GOT_TPREL_PCREL_FLAG. |
109 | |
110 | /// On a symbol operand "FOO", this indicates that the reference is actually |
111 | /// to "FOO@plt". This is used for calls and jumps to external functions |
112 | /// and for PIC calls on 32-bit ELF systems. |
113 | MO_PLT, |
114 | |
115 | /// MO_PIC_FLAG - If this bit is set, the symbol reference is relative to |
116 | /// the function's picbase, e.g. lo16(symbol-picbase). |
117 | MO_PIC_FLAG, |
118 | |
119 | /// MO_PCREL_FLAG - If this bit is set, the symbol reference is relative to |
120 | /// the current instruction address(pc), e.g., var@pcrel. Fixup is VK_PCREL. |
121 | MO_PCREL_FLAG, |
122 | |
123 | /// MO_GOT_FLAG - If this bit is set the symbol reference is to be computed |
124 | /// via the GOT. For example when combined with the MO_PCREL_FLAG it should |
125 | /// produce the relocation @got@pcrel. Fixup is VK_PPC_GOT_PCREL. |
126 | MO_GOT_FLAG, |
127 | |
128 | /// MO_PCREL_OPT_FLAG - If this bit is set the operand is part of a |
129 | /// PC Relative linker optimization. |
130 | MO_PCREL_OPT_FLAG, |
131 | |
132 | /// MO_TLSGD_FLAG - If this bit is set the symbol reference is relative to |
133 | /// TLS General Dynamic model for Linux and the variable offset of TLS |
134 | /// General Dynamic model for AIX. |
135 | MO_TLSGD_FLAG, |
136 | |
137 | /// MO_TPREL_FLAG - If this bit is set, the symbol reference is relative to |
138 | /// the thread pointer and the symbol can be used for the TLS Initial Exec |
139 | /// and Local Exec models. |
140 | MO_TPREL_FLAG, |
141 | |
142 | /// MO_TLSLDM_FLAG - on AIX the ML relocation type is only valid for a |
143 | /// reference to a TOC symbol from the symbol itself, and right now its only |
144 | /// user is the symbol "_$TLSML". The symbol name is used to decide that |
145 | /// the R_TLSML relocation is expected. |
146 | MO_TLSLDM_FLAG, |
147 | |
148 | /// MO_TLSLD_FLAG - If this bit is set the symbol reference is relative to |
149 | /// TLS Local Dynamic model. |
150 | MO_TLSLD_FLAG, |
151 | |
152 | /// MO_TLSGDM_FLAG - If this bit is set the symbol reference is relative |
153 | /// to the region handle of TLS General Dynamic model for AIX. |
154 | MO_TLSGDM_FLAG, |
155 | |
156 | /// MO_GOT_TLSGD_PCREL_FLAG - A combintaion of flags, if these bits are set |
157 | /// they should produce the relocation @got@tlsgd@pcrel. |
158 | /// Fix up is VK_PPC_GOT_TLSGD_PCREL |
159 | /// MO_GOT_TLSGD_PCREL_FLAG = MO_PCREL_FLAG | MO_GOT_FLAG | MO_TLSGD_FLAG, |
160 | MO_GOT_TLSGD_PCREL_FLAG, |
161 | |
162 | /// MO_GOT_TLSLD_PCREL_FLAG - A combintaion of flags, if these bits are set |
163 | /// they should produce the relocation @got@tlsld@pcrel. |
164 | /// Fix up is VK_PPC_GOT_TLSLD_PCREL |
165 | /// MO_GOT_TLSLD_PCREL_FLAG = MO_PCREL_FLAG | MO_GOT_FLAG | MO_TLSLD_FLAG, |
166 | MO_GOT_TLSLD_PCREL_FLAG, |
167 | |
168 | /// MO_GOT_TPREL_PCREL_FLAG - A combintaion of flags, if these bits are set |
169 | /// they should produce the relocation @got@tprel@pcrel. |
170 | /// Fix up is VK_PPC_GOT_TPREL_PCREL |
171 | /// MO_GOT_TPREL_PCREL_FLAG = MO_GOT_FLAG | MO_TPREL_FLAG | MO_PCREL_FLAG, |
172 | MO_GOT_TPREL_PCREL_FLAG, |
173 | |
174 | /// MO_LO, MO_HA - lo16(symbol) and ha16(symbol) |
175 | MO_LO, |
176 | MO_HA, |
177 | |
178 | MO_TPREL_LO, |
179 | MO_TPREL_HA, |
180 | |
181 | /// These values identify relocations on immediates folded |
182 | /// into memory operations. |
183 | MO_DTPREL_LO, |
184 | MO_TLSLD_LO, |
185 | MO_TOC_LO, |
186 | |
187 | /// Symbol for VK_PPC_TLS fixup attached to an ADD instruction |
188 | MO_TLS, |
189 | |
190 | /// MO_PIC_HA_FLAG = MO_PIC_FLAG | MO_HA |
191 | MO_PIC_HA_FLAG, |
192 | |
193 | /// MO_PIC_LO_FLAG = MO_PIC_FLAG | MO_LO |
194 | MO_PIC_LO_FLAG, |
195 | |
196 | /// MO_TPREL_PCREL_FLAG = MO_PCREL_FLAG | MO_TPREL_FLAG |
197 | MO_TPREL_PCREL_FLAG, |
198 | |
199 | /// MO_TPREL_PCREL_FLAG = MO_PCREL_FLAG | MO_TLS |
200 | MO_TLS_PCREL_FLAG, |
201 | |
202 | /// MO_GOT_PCREL_FLAG = MO_PCREL_FLAG | MO_GOT_FLAG |
203 | MO_GOT_PCREL_FLAG, |
204 | }; |
205 | } // end namespace PPCII |
206 | |
207 | } // end namespace llvm; |
208 | |
209 | #endif |
210 | |