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