File indexing completed on 2026-05-10 08:43:26
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #ifndef LLVM_CODEGEN_MIRPARSER_MIPARSER_H
0014 #define LLVM_CODEGEN_MIRPARSER_MIPARSER_H
0015
0016 #include "llvm/ADT/DenseMap.h"
0017 #include "llvm/ADT/StringMap.h"
0018 #include "llvm/CodeGen/MachineMemOperand.h"
0019 #include "llvm/CodeGen/Register.h"
0020 #include "llvm/IR/TrackingMDRef.h"
0021 #include "llvm/Support/Allocator.h"
0022 #include "llvm/Support/SMLoc.h"
0023 #include <map>
0024 #include <utility>
0025
0026 namespace llvm {
0027
0028 class MachineBasicBlock;
0029 class MachineFunction;
0030 class MDNode;
0031 class RegisterBank;
0032 struct SlotMapping;
0033 class SMDiagnostic;
0034 class SourceMgr;
0035 class StringRef;
0036 class TargetRegisterClass;
0037 class TargetSubtargetInfo;
0038
0039 struct VRegInfo {
0040 enum : uint8_t { UNKNOWN, NORMAL, GENERIC, REGBANK } Kind = UNKNOWN;
0041 bool Explicit = false;
0042 union {
0043 const TargetRegisterClass *RC;
0044 const RegisterBank *RegBank;
0045 } D;
0046 Register VReg;
0047 Register PreferredReg;
0048 uint8_t Flags = 0;
0049 };
0050
0051 using Name2RegClassMap = StringMap<const TargetRegisterClass *>;
0052 using Name2RegBankMap = StringMap<const RegisterBank *>;
0053
0054 struct PerTargetMIParsingState {
0055 private:
0056 const TargetSubtargetInfo &Subtarget;
0057
0058
0059 StringMap<unsigned> Names2InstrOpCodes;
0060
0061
0062 StringMap<Register> Names2Regs;
0063
0064
0065 StringMap<const uint32_t *> Names2RegMasks;
0066
0067
0068 StringMap<unsigned> Names2SubRegIndices;
0069
0070
0071 StringMap<int> Names2TargetIndices;
0072
0073
0074 StringMap<unsigned> Names2DirectTargetFlags;
0075
0076
0077 StringMap<unsigned> Names2BitmaskTargetFlags;
0078
0079
0080 StringMap<MachineMemOperand::Flags> Names2MMOTargetFlags;
0081
0082
0083 Name2RegClassMap Names2RegClasses;
0084
0085
0086 Name2RegBankMap Names2RegBanks;
0087
0088 void initNames2InstrOpCodes();
0089 void initNames2Regs();
0090 void initNames2RegMasks();
0091 void initNames2SubRegIndices();
0092 void initNames2TargetIndices();
0093 void initNames2DirectTargetFlags();
0094 void initNames2BitmaskTargetFlags();
0095 void initNames2MMOTargetFlags();
0096
0097 void initNames2RegClasses();
0098 void initNames2RegBanks();
0099
0100 public:
0101
0102
0103 bool parseInstrName(StringRef InstrName, unsigned &OpCode);
0104
0105
0106
0107 bool getRegisterByName(StringRef RegName, Register &Reg);
0108
0109
0110
0111
0112 const uint32_t *getRegMask(StringRef Identifier);
0113
0114
0115
0116
0117 unsigned getSubRegIndex(StringRef Name);
0118
0119
0120
0121
0122 bool getTargetIndex(StringRef Name, int &Index);
0123
0124
0125
0126
0127
0128 bool getDirectTargetFlag(StringRef Name, unsigned &Flag);
0129
0130
0131
0132
0133
0134 bool getBitmaskTargetFlag(StringRef Name, unsigned &Flag);
0135
0136
0137
0138
0139
0140 bool getMMOTargetFlag(StringRef Name, MachineMemOperand::Flags &Flag);
0141
0142
0143
0144
0145 const TargetRegisterClass *getRegClass(StringRef Name);
0146
0147
0148
0149
0150 const RegisterBank *getRegBank(StringRef Name);
0151
0152 bool getVRegFlagValue(StringRef FlagName, uint8_t &FlagValue) const;
0153
0154 PerTargetMIParsingState(const TargetSubtargetInfo &STI)
0155 : Subtarget(STI) {
0156 initNames2RegClasses();
0157 initNames2RegBanks();
0158 }
0159
0160 ~PerTargetMIParsingState() = default;
0161
0162 void setTarget(const TargetSubtargetInfo &NewSubtarget);
0163 };
0164
0165 struct PerFunctionMIParsingState {
0166 BumpPtrAllocator Allocator;
0167 MachineFunction &MF;
0168 SourceMgr *SM;
0169 const SlotMapping &IRSlots;
0170 PerTargetMIParsingState &Target;
0171
0172 std::map<unsigned, TrackingMDNodeRef> MachineMetadataNodes;
0173 std::map<unsigned, std::pair<TempMDTuple, SMLoc>> MachineForwardRefMDNodes;
0174
0175 DenseMap<unsigned, MachineBasicBlock *> MBBSlots;
0176 DenseMap<Register, VRegInfo *> VRegInfos;
0177 StringMap<VRegInfo *> VRegInfosNamed;
0178 DenseMap<unsigned, int> FixedStackObjectSlots;
0179 DenseMap<unsigned, int> StackObjectSlots;
0180 DenseMap<unsigned, unsigned> ConstantPoolSlots;
0181 DenseMap<unsigned, unsigned> JumpTableSlots;
0182
0183
0184 DenseMap<unsigned, const Value *> Slots2Values;
0185
0186 PerFunctionMIParsingState(MachineFunction &MF, SourceMgr &SM,
0187 const SlotMapping &IRSlots,
0188 PerTargetMIParsingState &Target);
0189
0190 VRegInfo &getVRegInfo(Register Num);
0191 VRegInfo &getVRegInfoNamed(StringRef RegName);
0192 const Value *getIRValue(unsigned Slot);
0193 };
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206
0207 bool parseMachineBasicBlockDefinitions(PerFunctionMIParsingState &PFS,
0208 StringRef Src, SMDiagnostic &Error);
0209
0210
0211
0212
0213
0214
0215
0216
0217
0218
0219
0220 bool parseMachineInstructions(PerFunctionMIParsingState &PFS, StringRef Src,
0221 SMDiagnostic &Error);
0222
0223 bool parseMBBReference(PerFunctionMIParsingState &PFS,
0224 MachineBasicBlock *&MBB, StringRef Src,
0225 SMDiagnostic &Error);
0226
0227 bool parseRegisterReference(PerFunctionMIParsingState &PFS,
0228 Register &Reg, StringRef Src,
0229 SMDiagnostic &Error);
0230
0231 bool parseNamedRegisterReference(PerFunctionMIParsingState &PFS, Register &Reg,
0232 StringRef Src, SMDiagnostic &Error);
0233
0234 bool parseVirtualRegisterReference(PerFunctionMIParsingState &PFS,
0235 VRegInfo *&Info, StringRef Src,
0236 SMDiagnostic &Error);
0237
0238 bool parseStackObjectReference(PerFunctionMIParsingState &PFS, int &FI,
0239 StringRef Src, SMDiagnostic &Error);
0240
0241 bool parseMDNode(PerFunctionMIParsingState &PFS, MDNode *&Node, StringRef Src,
0242 SMDiagnostic &Error);
0243
0244 bool parseMachineMetadata(PerFunctionMIParsingState &PFS, StringRef Src,
0245 SMRange SourceRange, SMDiagnostic &Error);
0246
0247 }
0248
0249 #endif