• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===- MIParser.cpp - Machine instructions parser implementation ----------===//
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 implements the parsing of machine instructions.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #include "llvm/CodeGen/MIRParser/MIParser.h"
14 #include "MILexer.h"
15 #include "llvm/ADT/APInt.h"
16 #include "llvm/ADT/APSInt.h"
17 #include "llvm/ADT/ArrayRef.h"
18 #include "llvm/ADT/DenseMap.h"
19 #include "llvm/ADT/None.h"
20 #include "llvm/ADT/Optional.h"
21 #include "llvm/ADT/SmallVector.h"
22 #include "llvm/ADT/StringMap.h"
23 #include "llvm/ADT/StringRef.h"
24 #include "llvm/ADT/StringSwitch.h"
25 #include "llvm/ADT/Twine.h"
26 #include "llvm/Analysis/MemoryLocation.h"
27 #include "llvm/AsmParser/Parser.h"
28 #include "llvm/AsmParser/SlotMapping.h"
29 #include "llvm/CodeGen/GlobalISel/RegisterBank.h"
30 #include "llvm/CodeGen/GlobalISel/RegisterBankInfo.h"
31 #include "llvm/CodeGen/MIRFormatter.h"
32 #include "llvm/CodeGen/MIRPrinter.h"
33 #include "llvm/CodeGen/MachineBasicBlock.h"
34 #include "llvm/CodeGen/MachineFrameInfo.h"
35 #include "llvm/CodeGen/MachineFunction.h"
36 #include "llvm/CodeGen/MachineInstr.h"
37 #include "llvm/CodeGen/MachineInstrBuilder.h"
38 #include "llvm/CodeGen/MachineMemOperand.h"
39 #include "llvm/CodeGen/MachineOperand.h"
40 #include "llvm/CodeGen/MachineRegisterInfo.h"
41 #include "llvm/CodeGen/TargetInstrInfo.h"
42 #include "llvm/CodeGen/TargetRegisterInfo.h"
43 #include "llvm/CodeGen/TargetSubtargetInfo.h"
44 #include "llvm/IR/BasicBlock.h"
45 #include "llvm/IR/Constants.h"
46 #include "llvm/IR/DataLayout.h"
47 #include "llvm/IR/DebugInfoMetadata.h"
48 #include "llvm/IR/DebugLoc.h"
49 #include "llvm/IR/Function.h"
50 #include "llvm/IR/InstrTypes.h"
51 #include "llvm/IR/Instructions.h"
52 #include "llvm/IR/Intrinsics.h"
53 #include "llvm/IR/Metadata.h"
54 #include "llvm/IR/Module.h"
55 #include "llvm/IR/ModuleSlotTracker.h"
56 #include "llvm/IR/Type.h"
57 #include "llvm/IR/Value.h"
58 #include "llvm/IR/ValueSymbolTable.h"
59 #include "llvm/MC/LaneBitmask.h"
60 #include "llvm/MC/MCContext.h"
61 #include "llvm/MC/MCDwarf.h"
62 #include "llvm/MC/MCInstrDesc.h"
63 #include "llvm/MC/MCRegisterInfo.h"
64 #include "llvm/Support/AtomicOrdering.h"
65 #include "llvm/Support/BranchProbability.h"
66 #include "llvm/Support/Casting.h"
67 #include "llvm/Support/ErrorHandling.h"
68 #include "llvm/Support/LowLevelTypeImpl.h"
69 #include "llvm/Support/MemoryBuffer.h"
70 #include "llvm/Support/SMLoc.h"
71 #include "llvm/Support/SourceMgr.h"
72 #include "llvm/Support/raw_ostream.h"
73 #include "llvm/Target/TargetIntrinsicInfo.h"
74 #include "llvm/Target/TargetMachine.h"
75 #include <algorithm>
76 #include <cassert>
77 #include <cctype>
78 #include <cstddef>
79 #include <cstdint>
80 #include <limits>
81 #include <string>
82 #include <utility>
83 
84 using namespace llvm;
85 
setTarget(const TargetSubtargetInfo & NewSubtarget)86 void PerTargetMIParsingState::setTarget(
87   const TargetSubtargetInfo &NewSubtarget) {
88 
89   // If the subtarget changed, over conservatively assume everything is invalid.
90   if (&Subtarget == &NewSubtarget)
91     return;
92 
93   Names2InstrOpCodes.clear();
94   Names2Regs.clear();
95   Names2RegMasks.clear();
96   Names2SubRegIndices.clear();
97   Names2TargetIndices.clear();
98   Names2DirectTargetFlags.clear();
99   Names2BitmaskTargetFlags.clear();
100   Names2MMOTargetFlags.clear();
101 
102   initNames2RegClasses();
103   initNames2RegBanks();
104 }
105 
initNames2Regs()106 void PerTargetMIParsingState::initNames2Regs() {
107   if (!Names2Regs.empty())
108     return;
109 
110   // The '%noreg' register is the register 0.
111   Names2Regs.insert(std::make_pair("noreg", 0));
112   const auto *TRI = Subtarget.getRegisterInfo();
113   assert(TRI && "Expected target register info");
114 
115   for (unsigned I = 0, E = TRI->getNumRegs(); I < E; ++I) {
116     bool WasInserted =
117         Names2Regs.insert(std::make_pair(StringRef(TRI->getName(I)).lower(), I))
118             .second;
119     (void)WasInserted;
120     assert(WasInserted && "Expected registers to be unique case-insensitively");
121   }
122 }
123 
getRegisterByName(StringRef RegName,unsigned & Reg)124 bool PerTargetMIParsingState::getRegisterByName(StringRef RegName,
125                                                 unsigned &Reg) {
126   initNames2Regs();
127   auto RegInfo = Names2Regs.find(RegName);
128   if (RegInfo == Names2Regs.end())
129     return true;
130   Reg = RegInfo->getValue();
131   return false;
132 }
133 
initNames2InstrOpCodes()134 void PerTargetMIParsingState::initNames2InstrOpCodes() {
135   if (!Names2InstrOpCodes.empty())
136     return;
137   const auto *TII = Subtarget.getInstrInfo();
138   assert(TII && "Expected target instruction info");
139   for (unsigned I = 0, E = TII->getNumOpcodes(); I < E; ++I)
140     Names2InstrOpCodes.insert(std::make_pair(StringRef(TII->getName(I)), I));
141 }
142 
parseInstrName(StringRef InstrName,unsigned & OpCode)143 bool PerTargetMIParsingState::parseInstrName(StringRef InstrName,
144                                              unsigned &OpCode) {
145   initNames2InstrOpCodes();
146   auto InstrInfo = Names2InstrOpCodes.find(InstrName);
147   if (InstrInfo == Names2InstrOpCodes.end())
148     return true;
149   OpCode = InstrInfo->getValue();
150   return false;
151 }
152 
initNames2RegMasks()153 void PerTargetMIParsingState::initNames2RegMasks() {
154   if (!Names2RegMasks.empty())
155     return;
156   const auto *TRI = Subtarget.getRegisterInfo();
157   assert(TRI && "Expected target register info");
158   ArrayRef<const uint32_t *> RegMasks = TRI->getRegMasks();
159   ArrayRef<const char *> RegMaskNames = TRI->getRegMaskNames();
160   assert(RegMasks.size() == RegMaskNames.size());
161   for (size_t I = 0, E = RegMasks.size(); I < E; ++I)
162     Names2RegMasks.insert(
163         std::make_pair(StringRef(RegMaskNames[I]).lower(), RegMasks[I]));
164 }
165 
getRegMask(StringRef Identifier)166 const uint32_t *PerTargetMIParsingState::getRegMask(StringRef Identifier) {
167   initNames2RegMasks();
168   auto RegMaskInfo = Names2RegMasks.find(Identifier);
169   if (RegMaskInfo == Names2RegMasks.end())
170     return nullptr;
171   return RegMaskInfo->getValue();
172 }
173 
initNames2SubRegIndices()174 void PerTargetMIParsingState::initNames2SubRegIndices() {
175   if (!Names2SubRegIndices.empty())
176     return;
177   const TargetRegisterInfo *TRI = Subtarget.getRegisterInfo();
178   for (unsigned I = 1, E = TRI->getNumSubRegIndices(); I < E; ++I)
179     Names2SubRegIndices.insert(
180         std::make_pair(TRI->getSubRegIndexName(I), I));
181 }
182 
getSubRegIndex(StringRef Name)183 unsigned PerTargetMIParsingState::getSubRegIndex(StringRef Name) {
184   initNames2SubRegIndices();
185   auto SubRegInfo = Names2SubRegIndices.find(Name);
186   if (SubRegInfo == Names2SubRegIndices.end())
187     return 0;
188   return SubRegInfo->getValue();
189 }
190 
initNames2TargetIndices()191 void PerTargetMIParsingState::initNames2TargetIndices() {
192   if (!Names2TargetIndices.empty())
193     return;
194   const auto *TII = Subtarget.getInstrInfo();
195   assert(TII && "Expected target instruction info");
196   auto Indices = TII->getSerializableTargetIndices();
197   for (const auto &I : Indices)
198     Names2TargetIndices.insert(std::make_pair(StringRef(I.second), I.first));
199 }
200 
getTargetIndex(StringRef Name,int & Index)201 bool PerTargetMIParsingState::getTargetIndex(StringRef Name, int &Index) {
202   initNames2TargetIndices();
203   auto IndexInfo = Names2TargetIndices.find(Name);
204   if (IndexInfo == Names2TargetIndices.end())
205     return true;
206   Index = IndexInfo->second;
207   return false;
208 }
209 
initNames2DirectTargetFlags()210 void PerTargetMIParsingState::initNames2DirectTargetFlags() {
211   if (!Names2DirectTargetFlags.empty())
212     return;
213 
214   const auto *TII = Subtarget.getInstrInfo();
215   assert(TII && "Expected target instruction info");
216   auto Flags = TII->getSerializableDirectMachineOperandTargetFlags();
217   for (const auto &I : Flags)
218     Names2DirectTargetFlags.insert(
219         std::make_pair(StringRef(I.second), I.first));
220 }
221 
getDirectTargetFlag(StringRef Name,unsigned & Flag)222 bool PerTargetMIParsingState::getDirectTargetFlag(StringRef Name,
223                                                   unsigned &Flag) {
224   initNames2DirectTargetFlags();
225   auto FlagInfo = Names2DirectTargetFlags.find(Name);
226   if (FlagInfo == Names2DirectTargetFlags.end())
227     return true;
228   Flag = FlagInfo->second;
229   return false;
230 }
231 
initNames2BitmaskTargetFlags()232 void PerTargetMIParsingState::initNames2BitmaskTargetFlags() {
233   if (!Names2BitmaskTargetFlags.empty())
234     return;
235 
236   const auto *TII = Subtarget.getInstrInfo();
237   assert(TII && "Expected target instruction info");
238   auto Flags = TII->getSerializableBitmaskMachineOperandTargetFlags();
239   for (const auto &I : Flags)
240     Names2BitmaskTargetFlags.insert(
241         std::make_pair(StringRef(I.second), I.first));
242 }
243 
getBitmaskTargetFlag(StringRef Name,unsigned & Flag)244 bool PerTargetMIParsingState::getBitmaskTargetFlag(StringRef Name,
245                                                    unsigned &Flag) {
246   initNames2BitmaskTargetFlags();
247   auto FlagInfo = Names2BitmaskTargetFlags.find(Name);
248   if (FlagInfo == Names2BitmaskTargetFlags.end())
249     return true;
250   Flag = FlagInfo->second;
251   return false;
252 }
253 
initNames2MMOTargetFlags()254 void PerTargetMIParsingState::initNames2MMOTargetFlags() {
255   if (!Names2MMOTargetFlags.empty())
256     return;
257 
258   const auto *TII = Subtarget.getInstrInfo();
259   assert(TII && "Expected target instruction info");
260   auto Flags = TII->getSerializableMachineMemOperandTargetFlags();
261   for (const auto &I : Flags)
262     Names2MMOTargetFlags.insert(std::make_pair(StringRef(I.second), I.first));
263 }
264 
getMMOTargetFlag(StringRef Name,MachineMemOperand::Flags & Flag)265 bool PerTargetMIParsingState::getMMOTargetFlag(StringRef Name,
266                                                MachineMemOperand::Flags &Flag) {
267   initNames2MMOTargetFlags();
268   auto FlagInfo = Names2MMOTargetFlags.find(Name);
269   if (FlagInfo == Names2MMOTargetFlags.end())
270     return true;
271   Flag = FlagInfo->second;
272   return false;
273 }
274 
initNames2RegClasses()275 void PerTargetMIParsingState::initNames2RegClasses() {
276   if (!Names2RegClasses.empty())
277     return;
278 
279   const TargetRegisterInfo *TRI = Subtarget.getRegisterInfo();
280   for (unsigned I = 0, E = TRI->getNumRegClasses(); I < E; ++I) {
281     const auto *RC = TRI->getRegClass(I);
282     Names2RegClasses.insert(
283         std::make_pair(StringRef(TRI->getRegClassName(RC)).lower(), RC));
284   }
285 }
286 
initNames2RegBanks()287 void PerTargetMIParsingState::initNames2RegBanks() {
288   if (!Names2RegBanks.empty())
289     return;
290 
291   const RegisterBankInfo *RBI = Subtarget.getRegBankInfo();
292   // If the target does not support GlobalISel, we may not have a
293   // register bank info.
294   if (!RBI)
295     return;
296 
297   for (unsigned I = 0, E = RBI->getNumRegBanks(); I < E; ++I) {
298     const auto &RegBank = RBI->getRegBank(I);
299     Names2RegBanks.insert(
300         std::make_pair(StringRef(RegBank.getName()).lower(), &RegBank));
301   }
302 }
303 
304 const TargetRegisterClass *
getRegClass(StringRef Name)305 PerTargetMIParsingState::getRegClass(StringRef Name) {
306   auto RegClassInfo = Names2RegClasses.find(Name);
307   if (RegClassInfo == Names2RegClasses.end())
308     return nullptr;
309   return RegClassInfo->getValue();
310 }
311 
getRegBank(StringRef Name)312 const RegisterBank *PerTargetMIParsingState::getRegBank(StringRef Name) {
313   auto RegBankInfo = Names2RegBanks.find(Name);
314   if (RegBankInfo == Names2RegBanks.end())
315     return nullptr;
316   return RegBankInfo->getValue();
317 }
318 
PerFunctionMIParsingState(MachineFunction & MF,SourceMgr & SM,const SlotMapping & IRSlots,PerTargetMIParsingState & T)319 PerFunctionMIParsingState::PerFunctionMIParsingState(MachineFunction &MF,
320     SourceMgr &SM, const SlotMapping &IRSlots, PerTargetMIParsingState &T)
321   : MF(MF), SM(&SM), IRSlots(IRSlots), Target(T) {
322 }
323 
getVRegInfo(unsigned Num)324 VRegInfo &PerFunctionMIParsingState::getVRegInfo(unsigned Num) {
325   auto I = VRegInfos.insert(std::make_pair(Num, nullptr));
326   if (I.second) {
327     MachineRegisterInfo &MRI = MF.getRegInfo();
328     VRegInfo *Info = new (Allocator) VRegInfo;
329     Info->VReg = MRI.createIncompleteVirtualRegister();
330     I.first->second = Info;
331   }
332   return *I.first->second;
333 }
334 
getVRegInfoNamed(StringRef RegName)335 VRegInfo &PerFunctionMIParsingState::getVRegInfoNamed(StringRef RegName) {
336   assert(RegName != "" && "Expected named reg.");
337 
338   auto I = VRegInfosNamed.insert(std::make_pair(RegName.str(), nullptr));
339   if (I.second) {
340     VRegInfo *Info = new (Allocator) VRegInfo;
341     Info->VReg = MF.getRegInfo().createIncompleteVirtualRegister(RegName);
342     I.first->second = Info;
343   }
344   return *I.first->second;
345 }
346 
mapValueToSlot(const Value * V,ModuleSlotTracker & MST,DenseMap<unsigned,const Value * > & Slots2Values)347 static void mapValueToSlot(const Value *V, ModuleSlotTracker &MST,
348                            DenseMap<unsigned, const Value *> &Slots2Values) {
349   int Slot = MST.getLocalSlot(V);
350   if (Slot == -1)
351     return;
352   Slots2Values.insert(std::make_pair(unsigned(Slot), V));
353 }
354 
355 /// Creates the mapping from slot numbers to function's unnamed IR values.
initSlots2Values(const Function & F,DenseMap<unsigned,const Value * > & Slots2Values)356 static void initSlots2Values(const Function &F,
357                              DenseMap<unsigned, const Value *> &Slots2Values) {
358   ModuleSlotTracker MST(F.getParent(), /*ShouldInitializeAllMetadata=*/false);
359   MST.incorporateFunction(F);
360   for (const auto &Arg : F.args())
361     mapValueToSlot(&Arg, MST, Slots2Values);
362   for (const auto &BB : F) {
363     mapValueToSlot(&BB, MST, Slots2Values);
364     for (const auto &I : BB)
365       mapValueToSlot(&I, MST, Slots2Values);
366   }
367 }
368 
getIRValue(unsigned Slot)369 const Value* PerFunctionMIParsingState::getIRValue(unsigned Slot) {
370   if (Slots2Values.empty())
371     initSlots2Values(MF.getFunction(), Slots2Values);
372   auto ValueInfo = Slots2Values.find(Slot);
373   if (ValueInfo == Slots2Values.end())
374     return nullptr;
375   return ValueInfo->second;
376 }
377 
378 namespace {
379 
380 /// A wrapper struct around the 'MachineOperand' struct that includes a source
381 /// range and other attributes.
382 struct ParsedMachineOperand {
383   MachineOperand Operand;
384   StringRef::iterator Begin;
385   StringRef::iterator End;
386   Optional<unsigned> TiedDefIdx;
387 
ParsedMachineOperand__anon5e931b060111::ParsedMachineOperand388   ParsedMachineOperand(const MachineOperand &Operand, StringRef::iterator Begin,
389                        StringRef::iterator End, Optional<unsigned> &TiedDefIdx)
390       : Operand(Operand), Begin(Begin), End(End), TiedDefIdx(TiedDefIdx) {
391     if (TiedDefIdx)
392       assert(Operand.isReg() && Operand.isUse() &&
393              "Only used register operands can be tied");
394   }
395 };
396 
397 class MIParser {
398   MachineFunction &MF;
399   SMDiagnostic &Error;
400   StringRef Source, CurrentSource;
401   MIToken Token;
402   PerFunctionMIParsingState &PFS;
403   /// Maps from slot numbers to function's unnamed basic blocks.
404   DenseMap<unsigned, const BasicBlock *> Slots2BasicBlocks;
405 
406 public:
407   MIParser(PerFunctionMIParsingState &PFS, SMDiagnostic &Error,
408            StringRef Source);
409 
410   /// \p SkipChar gives the number of characters to skip before looking
411   /// for the next token.
412   void lex(unsigned SkipChar = 0);
413 
414   /// Report an error at the current location with the given message.
415   ///
416   /// This function always return true.
417   bool error(const Twine &Msg);
418 
419   /// Report an error at the given location with the given message.
420   ///
421   /// This function always return true.
422   bool error(StringRef::iterator Loc, const Twine &Msg);
423 
424   bool
425   parseBasicBlockDefinitions(DenseMap<unsigned, MachineBasicBlock *> &MBBSlots);
426   bool parseBasicBlocks();
427   bool parse(MachineInstr *&MI);
428   bool parseStandaloneMBB(MachineBasicBlock *&MBB);
429   bool parseStandaloneNamedRegister(unsigned &Reg);
430   bool parseStandaloneVirtualRegister(VRegInfo *&Info);
431   bool parseStandaloneRegister(unsigned &Reg);
432   bool parseStandaloneStackObject(int &FI);
433   bool parseStandaloneMDNode(MDNode *&Node);
434 
435   bool
436   parseBasicBlockDefinition(DenseMap<unsigned, MachineBasicBlock *> &MBBSlots);
437   bool parseBasicBlock(MachineBasicBlock &MBB,
438                        MachineBasicBlock *&AddFalthroughFrom);
439   bool parseBasicBlockLiveins(MachineBasicBlock &MBB);
440   bool parseBasicBlockSuccessors(MachineBasicBlock &MBB);
441 
442   bool parseNamedRegister(unsigned &Reg);
443   bool parseVirtualRegister(VRegInfo *&Info);
444   bool parseNamedVirtualRegister(VRegInfo *&Info);
445   bool parseRegister(unsigned &Reg, VRegInfo *&VRegInfo);
446   bool parseRegisterFlag(unsigned &Flags);
447   bool parseRegisterClassOrBank(VRegInfo &RegInfo);
448   bool parseSubRegisterIndex(unsigned &SubReg);
449   bool parseRegisterTiedDefIndex(unsigned &TiedDefIdx);
450   bool parseRegisterOperand(MachineOperand &Dest,
451                             Optional<unsigned> &TiedDefIdx, bool IsDef = false);
452   bool parseImmediateOperand(MachineOperand &Dest);
453   bool parseIRConstant(StringRef::iterator Loc, StringRef StringValue,
454                        const Constant *&C);
455   bool parseIRConstant(StringRef::iterator Loc, const Constant *&C);
456   bool parseLowLevelType(StringRef::iterator Loc, LLT &Ty);
457   bool parseTypedImmediateOperand(MachineOperand &Dest);
458   bool parseFPImmediateOperand(MachineOperand &Dest);
459   bool parseMBBReference(MachineBasicBlock *&MBB);
460   bool parseMBBOperand(MachineOperand &Dest);
461   bool parseStackFrameIndex(int &FI);
462   bool parseStackObjectOperand(MachineOperand &Dest);
463   bool parseFixedStackFrameIndex(int &FI);
464   bool parseFixedStackObjectOperand(MachineOperand &Dest);
465   bool parseGlobalValue(GlobalValue *&GV);
466   bool parseGlobalAddressOperand(MachineOperand &Dest);
467   bool parseConstantPoolIndexOperand(MachineOperand &Dest);
468   bool parseSubRegisterIndexOperand(MachineOperand &Dest);
469   bool parseJumpTableIndexOperand(MachineOperand &Dest);
470   bool parseExternalSymbolOperand(MachineOperand &Dest);
471   bool parseMCSymbolOperand(MachineOperand &Dest);
472   bool parseMDNode(MDNode *&Node);
473   bool parseDIExpression(MDNode *&Expr);
474   bool parseDILocation(MDNode *&Expr);
475   bool parseMetadataOperand(MachineOperand &Dest);
476   bool parseCFIOffset(int &Offset);
477   bool parseCFIRegister(unsigned &Reg);
478   bool parseCFIEscapeValues(std::string& Values);
479   bool parseCFIOperand(MachineOperand &Dest);
480   bool parseIRBlock(BasicBlock *&BB, const Function &F);
481   bool parseBlockAddressOperand(MachineOperand &Dest);
482   bool parseIntrinsicOperand(MachineOperand &Dest);
483   bool parsePredicateOperand(MachineOperand &Dest);
484   bool parseShuffleMaskOperand(MachineOperand &Dest);
485   bool parseTargetIndexOperand(MachineOperand &Dest);
486   bool parseCustomRegisterMaskOperand(MachineOperand &Dest);
487   bool parseLiveoutRegisterMaskOperand(MachineOperand &Dest);
488   bool parseMachineOperand(const unsigned OpCode, const unsigned OpIdx,
489                            MachineOperand &Dest,
490                            Optional<unsigned> &TiedDefIdx);
491   bool parseMachineOperandAndTargetFlags(const unsigned OpCode,
492                                          const unsigned OpIdx,
493                                          MachineOperand &Dest,
494                                          Optional<unsigned> &TiedDefIdx);
495   bool parseOffset(int64_t &Offset);
496   bool parseAlignment(unsigned &Alignment);
497   bool parseAddrspace(unsigned &Addrspace);
498   bool parseOperandsOffset(MachineOperand &Op);
499   bool parseIRValue(const Value *&V);
500   bool parseMemoryOperandFlag(MachineMemOperand::Flags &Flags);
501   bool parseMemoryPseudoSourceValue(const PseudoSourceValue *&PSV);
502   bool parseMachinePointerInfo(MachinePointerInfo &Dest);
503   bool parseOptionalScope(LLVMContext &Context, SyncScope::ID &SSID);
504   bool parseOptionalAtomicOrdering(AtomicOrdering &Order);
505   bool parseMachineMemoryOperand(MachineMemOperand *&Dest);
506   bool parsePreOrPostInstrSymbol(MCSymbol *&Symbol);
507   bool parseHeapAllocMarker(MDNode *&Node);
508 
509   bool parseTargetImmMnemonic(const unsigned OpCode, const unsigned OpIdx,
510                               MachineOperand &Dest, const MIRFormatter &MF);
511 
512 private:
513   /// Convert the integer literal in the current token into an unsigned integer.
514   ///
515   /// Return true if an error occurred.
516   bool getUnsigned(unsigned &Result);
517 
518   /// Convert the integer literal in the current token into an uint64.
519   ///
520   /// Return true if an error occurred.
521   bool getUint64(uint64_t &Result);
522 
523   /// Convert the hexadecimal literal in the current token into an unsigned
524   ///  APInt with a minimum bitwidth required to represent the value.
525   ///
526   /// Return true if the literal does not represent an integer value.
527   bool getHexUint(APInt &Result);
528 
529   /// If the current token is of the given kind, consume it and return false.
530   /// Otherwise report an error and return true.
531   bool expectAndConsume(MIToken::TokenKind TokenKind);
532 
533   /// If the current token is of the given kind, consume it and return true.
534   /// Otherwise return false.
535   bool consumeIfPresent(MIToken::TokenKind TokenKind);
536 
537   bool parseInstruction(unsigned &OpCode, unsigned &Flags);
538 
539   bool assignRegisterTies(MachineInstr &MI,
540                           ArrayRef<ParsedMachineOperand> Operands);
541 
542   bool verifyImplicitOperands(ArrayRef<ParsedMachineOperand> Operands,
543                               const MCInstrDesc &MCID);
544 
545   const BasicBlock *getIRBlock(unsigned Slot);
546   const BasicBlock *getIRBlock(unsigned Slot, const Function &F);
547 
548   /// Get or create an MCSymbol for a given name.
549   MCSymbol *getOrCreateMCSymbol(StringRef Name);
550 
551   /// parseStringConstant
552   ///   ::= StringConstant
553   bool parseStringConstant(std::string &Result);
554 };
555 
556 } // end anonymous namespace
557 
MIParser(PerFunctionMIParsingState & PFS,SMDiagnostic & Error,StringRef Source)558 MIParser::MIParser(PerFunctionMIParsingState &PFS, SMDiagnostic &Error,
559                    StringRef Source)
560     : MF(PFS.MF), Error(Error), Source(Source), CurrentSource(Source), PFS(PFS)
561 {}
562 
lex(unsigned SkipChar)563 void MIParser::lex(unsigned SkipChar) {
564   CurrentSource = lexMIToken(
565       CurrentSource.data() + SkipChar, Token,
566       [this](StringRef::iterator Loc, const Twine &Msg) { error(Loc, Msg); });
567 }
568 
error(const Twine & Msg)569 bool MIParser::error(const Twine &Msg) { return error(Token.location(), Msg); }
570 
error(StringRef::iterator Loc,const Twine & Msg)571 bool MIParser::error(StringRef::iterator Loc, const Twine &Msg) {
572   const SourceMgr &SM = *PFS.SM;
573   assert(Loc >= Source.data() && Loc <= (Source.data() + Source.size()));
574   const MemoryBuffer &Buffer = *SM.getMemoryBuffer(SM.getMainFileID());
575   if (Loc >= Buffer.getBufferStart() && Loc <= Buffer.getBufferEnd()) {
576     // Create an ordinary diagnostic when the source manager's buffer is the
577     // source string.
578     Error = SM.GetMessage(SMLoc::getFromPointer(Loc), SourceMgr::DK_Error, Msg);
579     return true;
580   }
581   // Create a diagnostic for a YAML string literal.
582   Error = SMDiagnostic(SM, SMLoc(), Buffer.getBufferIdentifier(), 1,
583                        Loc - Source.data(), SourceMgr::DK_Error, Msg.str(),
584                        Source, None, None);
585   return true;
586 }
587 
588 typedef function_ref<bool(StringRef::iterator Loc, const Twine &)>
589     ErrorCallbackType;
590 
toString(MIToken::TokenKind TokenKind)591 static const char *toString(MIToken::TokenKind TokenKind) {
592   switch (TokenKind) {
593   case MIToken::comma:
594     return "','";
595   case MIToken::equal:
596     return "'='";
597   case MIToken::colon:
598     return "':'";
599   case MIToken::lparen:
600     return "'('";
601   case MIToken::rparen:
602     return "')'";
603   default:
604     return "<unknown token>";
605   }
606 }
607 
expectAndConsume(MIToken::TokenKind TokenKind)608 bool MIParser::expectAndConsume(MIToken::TokenKind TokenKind) {
609   if (Token.isNot(TokenKind))
610     return error(Twine("expected ") + toString(TokenKind));
611   lex();
612   return false;
613 }
614 
consumeIfPresent(MIToken::TokenKind TokenKind)615 bool MIParser::consumeIfPresent(MIToken::TokenKind TokenKind) {
616   if (Token.isNot(TokenKind))
617     return false;
618   lex();
619   return true;
620 }
621 
parseBasicBlockDefinition(DenseMap<unsigned,MachineBasicBlock * > & MBBSlots)622 bool MIParser::parseBasicBlockDefinition(
623     DenseMap<unsigned, MachineBasicBlock *> &MBBSlots) {
624   assert(Token.is(MIToken::MachineBasicBlockLabel));
625   unsigned ID = 0;
626   if (getUnsigned(ID))
627     return true;
628   auto Loc = Token.location();
629   auto Name = Token.stringValue();
630   lex();
631   bool HasAddressTaken = false;
632   bool IsLandingPad = false;
633   unsigned Alignment = 0;
634   BasicBlock *BB = nullptr;
635   if (consumeIfPresent(MIToken::lparen)) {
636     do {
637       // TODO: Report an error when multiple same attributes are specified.
638       switch (Token.kind()) {
639       case MIToken::kw_address_taken:
640         HasAddressTaken = true;
641         lex();
642         break;
643       case MIToken::kw_landing_pad:
644         IsLandingPad = true;
645         lex();
646         break;
647       case MIToken::kw_align:
648         if (parseAlignment(Alignment))
649           return true;
650         break;
651       case MIToken::IRBlock:
652         // TODO: Report an error when both name and ir block are specified.
653         if (parseIRBlock(BB, MF.getFunction()))
654           return true;
655         lex();
656         break;
657       default:
658         break;
659       }
660     } while (consumeIfPresent(MIToken::comma));
661     if (expectAndConsume(MIToken::rparen))
662       return true;
663   }
664   if (expectAndConsume(MIToken::colon))
665     return true;
666 
667   if (!Name.empty()) {
668     BB = dyn_cast_or_null<BasicBlock>(
669         MF.getFunction().getValueSymbolTable()->lookup(Name));
670     if (!BB)
671       return error(Loc, Twine("basic block '") + Name +
672                             "' is not defined in the function '" +
673                             MF.getName() + "'");
674   }
675   auto *MBB = MF.CreateMachineBasicBlock(BB);
676   MF.insert(MF.end(), MBB);
677   bool WasInserted = MBBSlots.insert(std::make_pair(ID, MBB)).second;
678   if (!WasInserted)
679     return error(Loc, Twine("redefinition of machine basic block with id #") +
680                           Twine(ID));
681   if (Alignment)
682     MBB->setAlignment(Align(Alignment));
683   if (HasAddressTaken)
684     MBB->setHasAddressTaken();
685   MBB->setIsEHPad(IsLandingPad);
686   return false;
687 }
688 
parseBasicBlockDefinitions(DenseMap<unsigned,MachineBasicBlock * > & MBBSlots)689 bool MIParser::parseBasicBlockDefinitions(
690     DenseMap<unsigned, MachineBasicBlock *> &MBBSlots) {
691   lex();
692   // Skip until the first machine basic block.
693   while (Token.is(MIToken::Newline))
694     lex();
695   if (Token.isErrorOrEOF())
696     return Token.isError();
697   if (Token.isNot(MIToken::MachineBasicBlockLabel))
698     return error("expected a basic block definition before instructions");
699   unsigned BraceDepth = 0;
700   do {
701     if (parseBasicBlockDefinition(MBBSlots))
702       return true;
703     bool IsAfterNewline = false;
704     // Skip until the next machine basic block.
705     while (true) {
706       if ((Token.is(MIToken::MachineBasicBlockLabel) && IsAfterNewline) ||
707           Token.isErrorOrEOF())
708         break;
709       else if (Token.is(MIToken::MachineBasicBlockLabel))
710         return error("basic block definition should be located at the start of "
711                      "the line");
712       else if (consumeIfPresent(MIToken::Newline)) {
713         IsAfterNewline = true;
714         continue;
715       }
716       IsAfterNewline = false;
717       if (Token.is(MIToken::lbrace))
718         ++BraceDepth;
719       if (Token.is(MIToken::rbrace)) {
720         if (!BraceDepth)
721           return error("extraneous closing brace ('}')");
722         --BraceDepth;
723       }
724       lex();
725     }
726     // Verify that we closed all of the '{' at the end of a file or a block.
727     if (!Token.isError() && BraceDepth)
728       return error("expected '}'"); // FIXME: Report a note that shows '{'.
729   } while (!Token.isErrorOrEOF());
730   return Token.isError();
731 }
732 
parseBasicBlockLiveins(MachineBasicBlock & MBB)733 bool MIParser::parseBasicBlockLiveins(MachineBasicBlock &MBB) {
734   assert(Token.is(MIToken::kw_liveins));
735   lex();
736   if (expectAndConsume(MIToken::colon))
737     return true;
738   if (Token.isNewlineOrEOF()) // Allow an empty list of liveins.
739     return false;
740   do {
741     if (Token.isNot(MIToken::NamedRegister))
742       return error("expected a named register");
743     unsigned Reg = 0;
744     if (parseNamedRegister(Reg))
745       return true;
746     lex();
747     LaneBitmask Mask = LaneBitmask::getAll();
748     if (consumeIfPresent(MIToken::colon)) {
749       // Parse lane mask.
750       if (Token.isNot(MIToken::IntegerLiteral) &&
751           Token.isNot(MIToken::HexLiteral))
752         return error("expected a lane mask");
753       static_assert(sizeof(LaneBitmask::Type) == sizeof(unsigned),
754                     "Use correct get-function for lane mask");
755       LaneBitmask::Type V;
756       if (getUnsigned(V))
757         return error("invalid lane mask value");
758       Mask = LaneBitmask(V);
759       lex();
760     }
761     MBB.addLiveIn(Reg, Mask);
762   } while (consumeIfPresent(MIToken::comma));
763   return false;
764 }
765 
parseBasicBlockSuccessors(MachineBasicBlock & MBB)766 bool MIParser::parseBasicBlockSuccessors(MachineBasicBlock &MBB) {
767   assert(Token.is(MIToken::kw_successors));
768   lex();
769   if (expectAndConsume(MIToken::colon))
770     return true;
771   if (Token.isNewlineOrEOF()) // Allow an empty list of successors.
772     return false;
773   do {
774     if (Token.isNot(MIToken::MachineBasicBlock))
775       return error("expected a machine basic block reference");
776     MachineBasicBlock *SuccMBB = nullptr;
777     if (parseMBBReference(SuccMBB))
778       return true;
779     lex();
780     unsigned Weight = 0;
781     if (consumeIfPresent(MIToken::lparen)) {
782       if (Token.isNot(MIToken::IntegerLiteral) &&
783           Token.isNot(MIToken::HexLiteral))
784         return error("expected an integer literal after '('");
785       if (getUnsigned(Weight))
786         return true;
787       lex();
788       if (expectAndConsume(MIToken::rparen))
789         return true;
790     }
791     MBB.addSuccessor(SuccMBB, BranchProbability::getRaw(Weight));
792   } while (consumeIfPresent(MIToken::comma));
793   MBB.normalizeSuccProbs();
794   return false;
795 }
796 
parseBasicBlock(MachineBasicBlock & MBB,MachineBasicBlock * & AddFalthroughFrom)797 bool MIParser::parseBasicBlock(MachineBasicBlock &MBB,
798                                MachineBasicBlock *&AddFalthroughFrom) {
799   // Skip the definition.
800   assert(Token.is(MIToken::MachineBasicBlockLabel));
801   lex();
802   if (consumeIfPresent(MIToken::lparen)) {
803     while (Token.isNot(MIToken::rparen) && !Token.isErrorOrEOF())
804       lex();
805     consumeIfPresent(MIToken::rparen);
806   }
807   consumeIfPresent(MIToken::colon);
808 
809   // Parse the liveins and successors.
810   // N.B: Multiple lists of successors and liveins are allowed and they're
811   // merged into one.
812   // Example:
813   //   liveins: %edi
814   //   liveins: %esi
815   //
816   // is equivalent to
817   //   liveins: %edi, %esi
818   bool ExplicitSuccessors = false;
819   while (true) {
820     if (Token.is(MIToken::kw_successors)) {
821       if (parseBasicBlockSuccessors(MBB))
822         return true;
823       ExplicitSuccessors = true;
824     } else if (Token.is(MIToken::kw_liveins)) {
825       if (parseBasicBlockLiveins(MBB))
826         return true;
827     } else if (consumeIfPresent(MIToken::Newline)) {
828       continue;
829     } else
830       break;
831     if (!Token.isNewlineOrEOF())
832       return error("expected line break at the end of a list");
833     lex();
834   }
835 
836   // Parse the instructions.
837   bool IsInBundle = false;
838   MachineInstr *PrevMI = nullptr;
839   while (!Token.is(MIToken::MachineBasicBlockLabel) &&
840          !Token.is(MIToken::Eof)) {
841     if (consumeIfPresent(MIToken::Newline))
842       continue;
843     if (consumeIfPresent(MIToken::rbrace)) {
844       // The first parsing pass should verify that all closing '}' have an
845       // opening '{'.
846       assert(IsInBundle);
847       IsInBundle = false;
848       continue;
849     }
850     MachineInstr *MI = nullptr;
851     if (parse(MI))
852       return true;
853     MBB.insert(MBB.end(), MI);
854     if (IsInBundle) {
855       PrevMI->setFlag(MachineInstr::BundledSucc);
856       MI->setFlag(MachineInstr::BundledPred);
857     }
858     PrevMI = MI;
859     if (Token.is(MIToken::lbrace)) {
860       if (IsInBundle)
861         return error("nested instruction bundles are not allowed");
862       lex();
863       // This instruction is the start of the bundle.
864       MI->setFlag(MachineInstr::BundledSucc);
865       IsInBundle = true;
866       if (!Token.is(MIToken::Newline))
867         // The next instruction can be on the same line.
868         continue;
869     }
870     assert(Token.isNewlineOrEOF() && "MI is not fully parsed");
871     lex();
872   }
873 
874   // Construct successor list by searching for basic block machine operands.
875   if (!ExplicitSuccessors) {
876     SmallVector<MachineBasicBlock*,4> Successors;
877     bool IsFallthrough;
878     guessSuccessors(MBB, Successors, IsFallthrough);
879     for (MachineBasicBlock *Succ : Successors)
880       MBB.addSuccessor(Succ);
881 
882     if (IsFallthrough) {
883       AddFalthroughFrom = &MBB;
884     } else {
885       MBB.normalizeSuccProbs();
886     }
887   }
888 
889   return false;
890 }
891 
parseBasicBlocks()892 bool MIParser::parseBasicBlocks() {
893   lex();
894   // Skip until the first machine basic block.
895   while (Token.is(MIToken::Newline))
896     lex();
897   if (Token.isErrorOrEOF())
898     return Token.isError();
899   // The first parsing pass should have verified that this token is a MBB label
900   // in the 'parseBasicBlockDefinitions' method.
901   assert(Token.is(MIToken::MachineBasicBlockLabel));
902   MachineBasicBlock *AddFalthroughFrom = nullptr;
903   do {
904     MachineBasicBlock *MBB = nullptr;
905     if (parseMBBReference(MBB))
906       return true;
907     if (AddFalthroughFrom) {
908       if (!AddFalthroughFrom->isSuccessor(MBB))
909         AddFalthroughFrom->addSuccessor(MBB);
910       AddFalthroughFrom->normalizeSuccProbs();
911       AddFalthroughFrom = nullptr;
912     }
913     if (parseBasicBlock(*MBB, AddFalthroughFrom))
914       return true;
915     // The method 'parseBasicBlock' should parse the whole block until the next
916     // block or the end of file.
917     assert(Token.is(MIToken::MachineBasicBlockLabel) || Token.is(MIToken::Eof));
918   } while (Token.isNot(MIToken::Eof));
919   return false;
920 }
921 
parse(MachineInstr * & MI)922 bool MIParser::parse(MachineInstr *&MI) {
923   // Parse any register operands before '='
924   MachineOperand MO = MachineOperand::CreateImm(0);
925   SmallVector<ParsedMachineOperand, 8> Operands;
926   while (Token.isRegister() || Token.isRegisterFlag()) {
927     auto Loc = Token.location();
928     Optional<unsigned> TiedDefIdx;
929     if (parseRegisterOperand(MO, TiedDefIdx, /*IsDef=*/true))
930       return true;
931     Operands.push_back(
932         ParsedMachineOperand(MO, Loc, Token.location(), TiedDefIdx));
933     if (Token.isNot(MIToken::comma))
934       break;
935     lex();
936   }
937   if (!Operands.empty() && expectAndConsume(MIToken::equal))
938     return true;
939 
940   unsigned OpCode, Flags = 0;
941   if (Token.isError() || parseInstruction(OpCode, Flags))
942     return true;
943 
944   // Parse the remaining machine operands.
945   while (!Token.isNewlineOrEOF() && Token.isNot(MIToken::kw_pre_instr_symbol) &&
946          Token.isNot(MIToken::kw_post_instr_symbol) &&
947          Token.isNot(MIToken::kw_heap_alloc_marker) &&
948          Token.isNot(MIToken::kw_debug_location) &&
949          Token.isNot(MIToken::coloncolon) && Token.isNot(MIToken::lbrace)) {
950     auto Loc = Token.location();
951     Optional<unsigned> TiedDefIdx;
952     if (parseMachineOperandAndTargetFlags(OpCode, Operands.size(), MO, TiedDefIdx))
953       return true;
954     if (OpCode == TargetOpcode::DBG_VALUE && MO.isReg())
955       MO.setIsDebug();
956     Operands.push_back(
957         ParsedMachineOperand(MO, Loc, Token.location(), TiedDefIdx));
958     if (Token.isNewlineOrEOF() || Token.is(MIToken::coloncolon) ||
959         Token.is(MIToken::lbrace))
960       break;
961     if (Token.isNot(MIToken::comma))
962       return error("expected ',' before the next machine operand");
963     lex();
964   }
965 
966   MCSymbol *PreInstrSymbol = nullptr;
967   if (Token.is(MIToken::kw_pre_instr_symbol))
968     if (parsePreOrPostInstrSymbol(PreInstrSymbol))
969       return true;
970   MCSymbol *PostInstrSymbol = nullptr;
971   if (Token.is(MIToken::kw_post_instr_symbol))
972     if (parsePreOrPostInstrSymbol(PostInstrSymbol))
973       return true;
974   MDNode *HeapAllocMarker = nullptr;
975   if (Token.is(MIToken::kw_heap_alloc_marker))
976     if (parseHeapAllocMarker(HeapAllocMarker))
977       return true;
978 
979   DebugLoc DebugLocation;
980   if (Token.is(MIToken::kw_debug_location)) {
981     lex();
982     MDNode *Node = nullptr;
983     if (Token.is(MIToken::exclaim)) {
984       if (parseMDNode(Node))
985         return true;
986     } else if (Token.is(MIToken::md_dilocation)) {
987       if (parseDILocation(Node))
988         return true;
989     } else
990       return error("expected a metadata node after 'debug-location'");
991     if (!isa<DILocation>(Node))
992       return error("referenced metadata is not a DILocation");
993     DebugLocation = DebugLoc(Node);
994   }
995 
996   // Parse the machine memory operands.
997   SmallVector<MachineMemOperand *, 2> MemOperands;
998   if (Token.is(MIToken::coloncolon)) {
999     lex();
1000     while (!Token.isNewlineOrEOF()) {
1001       MachineMemOperand *MemOp = nullptr;
1002       if (parseMachineMemoryOperand(MemOp))
1003         return true;
1004       MemOperands.push_back(MemOp);
1005       if (Token.isNewlineOrEOF())
1006         break;
1007       if (Token.isNot(MIToken::comma))
1008         return error("expected ',' before the next machine memory operand");
1009       lex();
1010     }
1011   }
1012 
1013   const auto &MCID = MF.getSubtarget().getInstrInfo()->get(OpCode);
1014   if (!MCID.isVariadic()) {
1015     // FIXME: Move the implicit operand verification to the machine verifier.
1016     if (verifyImplicitOperands(Operands, MCID))
1017       return true;
1018   }
1019 
1020   // TODO: Check for extraneous machine operands.
1021   MI = MF.CreateMachineInstr(MCID, DebugLocation, /*NoImplicit=*/true);
1022   MI->setFlags(Flags);
1023   for (const auto &Operand : Operands)
1024     MI->addOperand(MF, Operand.Operand);
1025   if (assignRegisterTies(*MI, Operands))
1026     return true;
1027   if (PreInstrSymbol)
1028     MI->setPreInstrSymbol(MF, PreInstrSymbol);
1029   if (PostInstrSymbol)
1030     MI->setPostInstrSymbol(MF, PostInstrSymbol);
1031   if (HeapAllocMarker)
1032     MI->setHeapAllocMarker(MF, HeapAllocMarker);
1033   if (!MemOperands.empty())
1034     MI->setMemRefs(MF, MemOperands);
1035   return false;
1036 }
1037 
parseStandaloneMBB(MachineBasicBlock * & MBB)1038 bool MIParser::parseStandaloneMBB(MachineBasicBlock *&MBB) {
1039   lex();
1040   if (Token.isNot(MIToken::MachineBasicBlock))
1041     return error("expected a machine basic block reference");
1042   if (parseMBBReference(MBB))
1043     return true;
1044   lex();
1045   if (Token.isNot(MIToken::Eof))
1046     return error(
1047         "expected end of string after the machine basic block reference");
1048   return false;
1049 }
1050 
parseStandaloneNamedRegister(unsigned & Reg)1051 bool MIParser::parseStandaloneNamedRegister(unsigned &Reg) {
1052   lex();
1053   if (Token.isNot(MIToken::NamedRegister))
1054     return error("expected a named register");
1055   if (parseNamedRegister(Reg))
1056     return true;
1057   lex();
1058   if (Token.isNot(MIToken::Eof))
1059     return error("expected end of string after the register reference");
1060   return false;
1061 }
1062 
parseStandaloneVirtualRegister(VRegInfo * & Info)1063 bool MIParser::parseStandaloneVirtualRegister(VRegInfo *&Info) {
1064   lex();
1065   if (Token.isNot(MIToken::VirtualRegister))
1066     return error("expected a virtual register");
1067   if (parseVirtualRegister(Info))
1068     return true;
1069   lex();
1070   if (Token.isNot(MIToken::Eof))
1071     return error("expected end of string after the register reference");
1072   return false;
1073 }
1074 
parseStandaloneRegister(unsigned & Reg)1075 bool MIParser::parseStandaloneRegister(unsigned &Reg) {
1076   lex();
1077   if (Token.isNot(MIToken::NamedRegister) &&
1078       Token.isNot(MIToken::VirtualRegister))
1079     return error("expected either a named or virtual register");
1080 
1081   VRegInfo *Info;
1082   if (parseRegister(Reg, Info))
1083     return true;
1084 
1085   lex();
1086   if (Token.isNot(MIToken::Eof))
1087     return error("expected end of string after the register reference");
1088   return false;
1089 }
1090 
parseStandaloneStackObject(int & FI)1091 bool MIParser::parseStandaloneStackObject(int &FI) {
1092   lex();
1093   if (Token.isNot(MIToken::StackObject))
1094     return error("expected a stack object");
1095   if (parseStackFrameIndex(FI))
1096     return true;
1097   if (Token.isNot(MIToken::Eof))
1098     return error("expected end of string after the stack object reference");
1099   return false;
1100 }
1101 
parseStandaloneMDNode(MDNode * & Node)1102 bool MIParser::parseStandaloneMDNode(MDNode *&Node) {
1103   lex();
1104   if (Token.is(MIToken::exclaim)) {
1105     if (parseMDNode(Node))
1106       return true;
1107   } else if (Token.is(MIToken::md_diexpr)) {
1108     if (parseDIExpression(Node))
1109       return true;
1110   } else if (Token.is(MIToken::md_dilocation)) {
1111     if (parseDILocation(Node))
1112       return true;
1113   } else
1114     return error("expected a metadata node");
1115   if (Token.isNot(MIToken::Eof))
1116     return error("expected end of string after the metadata node");
1117   return false;
1118 }
1119 
printImplicitRegisterFlag(const MachineOperand & MO)1120 static const char *printImplicitRegisterFlag(const MachineOperand &MO) {
1121   assert(MO.isImplicit());
1122   return MO.isDef() ? "implicit-def" : "implicit";
1123 }
1124 
getRegisterName(const TargetRegisterInfo * TRI,unsigned Reg)1125 static std::string getRegisterName(const TargetRegisterInfo *TRI,
1126                                    unsigned Reg) {
1127   assert(Register::isPhysicalRegister(Reg) && "expected phys reg");
1128   return StringRef(TRI->getName(Reg)).lower();
1129 }
1130 
1131 /// Return true if the parsed machine operands contain a given machine operand.
isImplicitOperandIn(const MachineOperand & ImplicitOperand,ArrayRef<ParsedMachineOperand> Operands)1132 static bool isImplicitOperandIn(const MachineOperand &ImplicitOperand,
1133                                 ArrayRef<ParsedMachineOperand> Operands) {
1134   for (const auto &I : Operands) {
1135     if (ImplicitOperand.isIdenticalTo(I.Operand))
1136       return true;
1137   }
1138   return false;
1139 }
1140 
verifyImplicitOperands(ArrayRef<ParsedMachineOperand> Operands,const MCInstrDesc & MCID)1141 bool MIParser::verifyImplicitOperands(ArrayRef<ParsedMachineOperand> Operands,
1142                                       const MCInstrDesc &MCID) {
1143   if (MCID.isCall())
1144     // We can't verify call instructions as they can contain arbitrary implicit
1145     // register and register mask operands.
1146     return false;
1147 
1148   // Gather all the expected implicit operands.
1149   SmallVector<MachineOperand, 4> ImplicitOperands;
1150   if (MCID.ImplicitDefs)
1151     for (const MCPhysReg *ImpDefs = MCID.getImplicitDefs(); *ImpDefs; ++ImpDefs)
1152       ImplicitOperands.push_back(
1153           MachineOperand::CreateReg(*ImpDefs, true, true));
1154   if (MCID.ImplicitUses)
1155     for (const MCPhysReg *ImpUses = MCID.getImplicitUses(); *ImpUses; ++ImpUses)
1156       ImplicitOperands.push_back(
1157           MachineOperand::CreateReg(*ImpUses, false, true));
1158 
1159   const auto *TRI = MF.getSubtarget().getRegisterInfo();
1160   assert(TRI && "Expected target register info");
1161   for (const auto &I : ImplicitOperands) {
1162     if (isImplicitOperandIn(I, Operands))
1163       continue;
1164     return error(Operands.empty() ? Token.location() : Operands.back().End,
1165                  Twine("missing implicit register operand '") +
1166                      printImplicitRegisterFlag(I) + " $" +
1167                      getRegisterName(TRI, I.getReg()) + "'");
1168   }
1169   return false;
1170 }
1171 
parseInstruction(unsigned & OpCode,unsigned & Flags)1172 bool MIParser::parseInstruction(unsigned &OpCode, unsigned &Flags) {
1173   // Allow frame and fast math flags for OPCODE
1174   while (Token.is(MIToken::kw_frame_setup) ||
1175          Token.is(MIToken::kw_frame_destroy) ||
1176          Token.is(MIToken::kw_nnan) ||
1177          Token.is(MIToken::kw_ninf) ||
1178          Token.is(MIToken::kw_nsz) ||
1179          Token.is(MIToken::kw_arcp) ||
1180          Token.is(MIToken::kw_contract) ||
1181          Token.is(MIToken::kw_afn) ||
1182          Token.is(MIToken::kw_reassoc) ||
1183          Token.is(MIToken::kw_nuw) ||
1184          Token.is(MIToken::kw_nsw) ||
1185          Token.is(MIToken::kw_exact) ||
1186          Token.is(MIToken::kw_nofpexcept)) {
1187     // Mine frame and fast math flags
1188     if (Token.is(MIToken::kw_frame_setup))
1189       Flags |= MachineInstr::FrameSetup;
1190     if (Token.is(MIToken::kw_frame_destroy))
1191       Flags |= MachineInstr::FrameDestroy;
1192     if (Token.is(MIToken::kw_nnan))
1193       Flags |= MachineInstr::FmNoNans;
1194     if (Token.is(MIToken::kw_ninf))
1195       Flags |= MachineInstr::FmNoInfs;
1196     if (Token.is(MIToken::kw_nsz))
1197       Flags |= MachineInstr::FmNsz;
1198     if (Token.is(MIToken::kw_arcp))
1199       Flags |= MachineInstr::FmArcp;
1200     if (Token.is(MIToken::kw_contract))
1201       Flags |= MachineInstr::FmContract;
1202     if (Token.is(MIToken::kw_afn))
1203       Flags |= MachineInstr::FmAfn;
1204     if (Token.is(MIToken::kw_reassoc))
1205       Flags |= MachineInstr::FmReassoc;
1206     if (Token.is(MIToken::kw_nuw))
1207       Flags |= MachineInstr::NoUWrap;
1208     if (Token.is(MIToken::kw_nsw))
1209       Flags |= MachineInstr::NoSWrap;
1210     if (Token.is(MIToken::kw_exact))
1211       Flags |= MachineInstr::IsExact;
1212     if (Token.is(MIToken::kw_nofpexcept))
1213       Flags |= MachineInstr::NoFPExcept;
1214 
1215     lex();
1216   }
1217   if (Token.isNot(MIToken::Identifier))
1218     return error("expected a machine instruction");
1219   StringRef InstrName = Token.stringValue();
1220   if (PFS.Target.parseInstrName(InstrName, OpCode))
1221     return error(Twine("unknown machine instruction name '") + InstrName + "'");
1222   lex();
1223   return false;
1224 }
1225 
parseNamedRegister(unsigned & Reg)1226 bool MIParser::parseNamedRegister(unsigned &Reg) {
1227   assert(Token.is(MIToken::NamedRegister) && "Needs NamedRegister token");
1228   StringRef Name = Token.stringValue();
1229   if (PFS.Target.getRegisterByName(Name, Reg))
1230     return error(Twine("unknown register name '") + Name + "'");
1231   return false;
1232 }
1233 
parseNamedVirtualRegister(VRegInfo * & Info)1234 bool MIParser::parseNamedVirtualRegister(VRegInfo *&Info) {
1235   assert(Token.is(MIToken::NamedVirtualRegister) && "Expected NamedVReg token");
1236   StringRef Name = Token.stringValue();
1237   // TODO: Check that the VReg name is not the same as a physical register name.
1238   //       If it is, then print a warning (when warnings are implemented).
1239   Info = &PFS.getVRegInfoNamed(Name);
1240   return false;
1241 }
1242 
parseVirtualRegister(VRegInfo * & Info)1243 bool MIParser::parseVirtualRegister(VRegInfo *&Info) {
1244   if (Token.is(MIToken::NamedVirtualRegister))
1245     return parseNamedVirtualRegister(Info);
1246   assert(Token.is(MIToken::VirtualRegister) && "Needs VirtualRegister token");
1247   unsigned ID;
1248   if (getUnsigned(ID))
1249     return true;
1250   Info = &PFS.getVRegInfo(ID);
1251   return false;
1252 }
1253 
parseRegister(unsigned & Reg,VRegInfo * & Info)1254 bool MIParser::parseRegister(unsigned &Reg, VRegInfo *&Info) {
1255   switch (Token.kind()) {
1256   case MIToken::underscore:
1257     Reg = 0;
1258     return false;
1259   case MIToken::NamedRegister:
1260     return parseNamedRegister(Reg);
1261   case MIToken::NamedVirtualRegister:
1262   case MIToken::VirtualRegister:
1263     if (parseVirtualRegister(Info))
1264       return true;
1265     Reg = Info->VReg;
1266     return false;
1267   // TODO: Parse other register kinds.
1268   default:
1269     llvm_unreachable("The current token should be a register");
1270   }
1271 }
1272 
parseRegisterClassOrBank(VRegInfo & RegInfo)1273 bool MIParser::parseRegisterClassOrBank(VRegInfo &RegInfo) {
1274   if (Token.isNot(MIToken::Identifier) && Token.isNot(MIToken::underscore))
1275     return error("expected '_', register class, or register bank name");
1276   StringRef::iterator Loc = Token.location();
1277   StringRef Name = Token.stringValue();
1278 
1279   // Was it a register class?
1280   const TargetRegisterClass *RC = PFS.Target.getRegClass(Name);
1281   if (RC) {
1282     lex();
1283 
1284     switch (RegInfo.Kind) {
1285     case VRegInfo::UNKNOWN:
1286     case VRegInfo::NORMAL:
1287       RegInfo.Kind = VRegInfo::NORMAL;
1288       if (RegInfo.Explicit && RegInfo.D.RC != RC) {
1289         const TargetRegisterInfo &TRI = *MF.getSubtarget().getRegisterInfo();
1290         return error(Loc, Twine("conflicting register classes, previously: ") +
1291                      Twine(TRI.getRegClassName(RegInfo.D.RC)));
1292       }
1293       RegInfo.D.RC = RC;
1294       RegInfo.Explicit = true;
1295       return false;
1296 
1297     case VRegInfo::GENERIC:
1298     case VRegInfo::REGBANK:
1299       return error(Loc, "register class specification on generic register");
1300     }
1301     llvm_unreachable("Unexpected register kind");
1302   }
1303 
1304   // Should be a register bank or a generic register.
1305   const RegisterBank *RegBank = nullptr;
1306   if (Name != "_") {
1307     RegBank = PFS.Target.getRegBank(Name);
1308     if (!RegBank)
1309       return error(Loc, "expected '_', register class, or register bank name");
1310   }
1311 
1312   lex();
1313 
1314   switch (RegInfo.Kind) {
1315   case VRegInfo::UNKNOWN:
1316   case VRegInfo::GENERIC:
1317   case VRegInfo::REGBANK:
1318     RegInfo.Kind = RegBank ? VRegInfo::REGBANK : VRegInfo::GENERIC;
1319     if (RegInfo.Explicit && RegInfo.D.RegBank != RegBank)
1320       return error(Loc, "conflicting generic register banks");
1321     RegInfo.D.RegBank = RegBank;
1322     RegInfo.Explicit = true;
1323     return false;
1324 
1325   case VRegInfo::NORMAL:
1326     return error(Loc, "register bank specification on normal register");
1327   }
1328   llvm_unreachable("Unexpected register kind");
1329 }
1330 
parseRegisterFlag(unsigned & Flags)1331 bool MIParser::parseRegisterFlag(unsigned &Flags) {
1332   const unsigned OldFlags = Flags;
1333   switch (Token.kind()) {
1334   case MIToken::kw_implicit:
1335     Flags |= RegState::Implicit;
1336     break;
1337   case MIToken::kw_implicit_define:
1338     Flags |= RegState::ImplicitDefine;
1339     break;
1340   case MIToken::kw_def:
1341     Flags |= RegState::Define;
1342     break;
1343   case MIToken::kw_dead:
1344     Flags |= RegState::Dead;
1345     break;
1346   case MIToken::kw_killed:
1347     Flags |= RegState::Kill;
1348     break;
1349   case MIToken::kw_undef:
1350     Flags |= RegState::Undef;
1351     break;
1352   case MIToken::kw_internal:
1353     Flags |= RegState::InternalRead;
1354     break;
1355   case MIToken::kw_early_clobber:
1356     Flags |= RegState::EarlyClobber;
1357     break;
1358   case MIToken::kw_debug_use:
1359     Flags |= RegState::Debug;
1360     break;
1361   case MIToken::kw_renamable:
1362     Flags |= RegState::Renamable;
1363     break;
1364   default:
1365     llvm_unreachable("The current token should be a register flag");
1366   }
1367   if (OldFlags == Flags)
1368     // We know that the same flag is specified more than once when the flags
1369     // weren't modified.
1370     return error("duplicate '" + Token.stringValue() + "' register flag");
1371   lex();
1372   return false;
1373 }
1374 
parseSubRegisterIndex(unsigned & SubReg)1375 bool MIParser::parseSubRegisterIndex(unsigned &SubReg) {
1376   assert(Token.is(MIToken::dot));
1377   lex();
1378   if (Token.isNot(MIToken::Identifier))
1379     return error("expected a subregister index after '.'");
1380   auto Name = Token.stringValue();
1381   SubReg = PFS.Target.getSubRegIndex(Name);
1382   if (!SubReg)
1383     return error(Twine("use of unknown subregister index '") + Name + "'");
1384   lex();
1385   return false;
1386 }
1387 
parseRegisterTiedDefIndex(unsigned & TiedDefIdx)1388 bool MIParser::parseRegisterTiedDefIndex(unsigned &TiedDefIdx) {
1389   if (!consumeIfPresent(MIToken::kw_tied_def))
1390     return true;
1391   if (Token.isNot(MIToken::IntegerLiteral))
1392     return error("expected an integer literal after 'tied-def'");
1393   if (getUnsigned(TiedDefIdx))
1394     return true;
1395   lex();
1396   if (expectAndConsume(MIToken::rparen))
1397     return true;
1398   return false;
1399 }
1400 
assignRegisterTies(MachineInstr & MI,ArrayRef<ParsedMachineOperand> Operands)1401 bool MIParser::assignRegisterTies(MachineInstr &MI,
1402                                   ArrayRef<ParsedMachineOperand> Operands) {
1403   SmallVector<std::pair<unsigned, unsigned>, 4> TiedRegisterPairs;
1404   for (unsigned I = 0, E = Operands.size(); I != E; ++I) {
1405     if (!Operands[I].TiedDefIdx)
1406       continue;
1407     // The parser ensures that this operand is a register use, so we just have
1408     // to check the tied-def operand.
1409     unsigned DefIdx = Operands[I].TiedDefIdx.getValue();
1410     if (DefIdx >= E)
1411       return error(Operands[I].Begin,
1412                    Twine("use of invalid tied-def operand index '" +
1413                          Twine(DefIdx) + "'; instruction has only ") +
1414                        Twine(E) + " operands");
1415     const auto &DefOperand = Operands[DefIdx].Operand;
1416     if (!DefOperand.isReg() || !DefOperand.isDef())
1417       // FIXME: add note with the def operand.
1418       return error(Operands[I].Begin,
1419                    Twine("use of invalid tied-def operand index '") +
1420                        Twine(DefIdx) + "'; the operand #" + Twine(DefIdx) +
1421                        " isn't a defined register");
1422     // Check that the tied-def operand wasn't tied elsewhere.
1423     for (const auto &TiedPair : TiedRegisterPairs) {
1424       if (TiedPair.first == DefIdx)
1425         return error(Operands[I].Begin,
1426                      Twine("the tied-def operand #") + Twine(DefIdx) +
1427                          " is already tied with another register operand");
1428     }
1429     TiedRegisterPairs.push_back(std::make_pair(DefIdx, I));
1430   }
1431   // FIXME: Verify that for non INLINEASM instructions, the def and use tied
1432   // indices must be less than tied max.
1433   for (const auto &TiedPair : TiedRegisterPairs)
1434     MI.tieOperands(TiedPair.first, TiedPair.second);
1435   return false;
1436 }
1437 
parseRegisterOperand(MachineOperand & Dest,Optional<unsigned> & TiedDefIdx,bool IsDef)1438 bool MIParser::parseRegisterOperand(MachineOperand &Dest,
1439                                     Optional<unsigned> &TiedDefIdx,
1440                                     bool IsDef) {
1441   unsigned Flags = IsDef ? RegState::Define : 0;
1442   while (Token.isRegisterFlag()) {
1443     if (parseRegisterFlag(Flags))
1444       return true;
1445   }
1446   if (!Token.isRegister())
1447     return error("expected a register after register flags");
1448   unsigned Reg;
1449   VRegInfo *RegInfo;
1450   if (parseRegister(Reg, RegInfo))
1451     return true;
1452   lex();
1453   unsigned SubReg = 0;
1454   if (Token.is(MIToken::dot)) {
1455     if (parseSubRegisterIndex(SubReg))
1456       return true;
1457     if (!Register::isVirtualRegister(Reg))
1458       return error("subregister index expects a virtual register");
1459   }
1460   if (Token.is(MIToken::colon)) {
1461     if (!Register::isVirtualRegister(Reg))
1462       return error("register class specification expects a virtual register");
1463     lex();
1464     if (parseRegisterClassOrBank(*RegInfo))
1465         return true;
1466   }
1467   MachineRegisterInfo &MRI = MF.getRegInfo();
1468   if ((Flags & RegState::Define) == 0) {
1469     if (consumeIfPresent(MIToken::lparen)) {
1470       unsigned Idx;
1471       if (!parseRegisterTiedDefIndex(Idx))
1472         TiedDefIdx = Idx;
1473       else {
1474         // Try a redundant low-level type.
1475         LLT Ty;
1476         if (parseLowLevelType(Token.location(), Ty))
1477           return error("expected tied-def or low-level type after '('");
1478 
1479         if (expectAndConsume(MIToken::rparen))
1480           return true;
1481 
1482         if (MRI.getType(Reg).isValid() && MRI.getType(Reg) != Ty)
1483           return error("inconsistent type for generic virtual register");
1484 
1485         MRI.setRegClassOrRegBank(Reg, static_cast<RegisterBank *>(nullptr));
1486         MRI.setType(Reg, Ty);
1487       }
1488     }
1489   } else if (consumeIfPresent(MIToken::lparen)) {
1490     // Virtual registers may have a tpe with GlobalISel.
1491     if (!Register::isVirtualRegister(Reg))
1492       return error("unexpected type on physical register");
1493 
1494     LLT Ty;
1495     if (parseLowLevelType(Token.location(), Ty))
1496       return true;
1497 
1498     if (expectAndConsume(MIToken::rparen))
1499       return true;
1500 
1501     if (MRI.getType(Reg).isValid() && MRI.getType(Reg) != Ty)
1502       return error("inconsistent type for generic virtual register");
1503 
1504     MRI.setRegClassOrRegBank(Reg, static_cast<RegisterBank *>(nullptr));
1505     MRI.setType(Reg, Ty);
1506   } else if (Register::isVirtualRegister(Reg)) {
1507     // Generic virtual registers must have a type.
1508     // If we end up here this means the type hasn't been specified and
1509     // this is bad!
1510     if (RegInfo->Kind == VRegInfo::GENERIC ||
1511         RegInfo->Kind == VRegInfo::REGBANK)
1512       return error("generic virtual registers must have a type");
1513   }
1514   Dest = MachineOperand::CreateReg(
1515       Reg, Flags & RegState::Define, Flags & RegState::Implicit,
1516       Flags & RegState::Kill, Flags & RegState::Dead, Flags & RegState::Undef,
1517       Flags & RegState::EarlyClobber, SubReg, Flags & RegState::Debug,
1518       Flags & RegState::InternalRead, Flags & RegState::Renamable);
1519 
1520   return false;
1521 }
1522 
parseImmediateOperand(MachineOperand & Dest)1523 bool MIParser::parseImmediateOperand(MachineOperand &Dest) {
1524   assert(Token.is(MIToken::IntegerLiteral));
1525   const APSInt &Int = Token.integerValue();
1526   if (Int.getMinSignedBits() > 64)
1527     return error("integer literal is too large to be an immediate operand");
1528   Dest = MachineOperand::CreateImm(Int.getExtValue());
1529   lex();
1530   return false;
1531 }
1532 
parseTargetImmMnemonic(const unsigned OpCode,const unsigned OpIdx,MachineOperand & Dest,const MIRFormatter & MF)1533 bool MIParser::parseTargetImmMnemonic(const unsigned OpCode,
1534                                       const unsigned OpIdx,
1535                                       MachineOperand &Dest,
1536                                       const MIRFormatter &MF) {
1537   assert(Token.is(MIToken::dot));
1538   auto Loc = Token.location(); // record start position
1539   size_t Len = 1;              // for "."
1540   lex();
1541 
1542   // Handle the case that mnemonic starts with number.
1543   if (Token.is(MIToken::IntegerLiteral)) {
1544     Len += Token.range().size();
1545     lex();
1546   }
1547 
1548   StringRef Src;
1549   if (Token.is(MIToken::comma))
1550     Src = StringRef(Loc, Len);
1551   else {
1552     assert(Token.is(MIToken::Identifier));
1553     Src = StringRef(Loc, Len + Token.stringValue().size());
1554   }
1555   int64_t Val;
1556   if (MF.parseImmMnemonic(OpCode, OpIdx, Src, Val,
1557                           [this](StringRef::iterator Loc, const Twine &Msg)
1558                               -> bool { return error(Loc, Msg); }))
1559     return true;
1560 
1561   Dest = MachineOperand::CreateImm(Val);
1562   if (!Token.is(MIToken::comma))
1563     lex();
1564   return false;
1565 }
1566 
parseIRConstant(StringRef::iterator Loc,StringRef StringValue,PerFunctionMIParsingState & PFS,const Constant * & C,ErrorCallbackType ErrCB)1567 static bool parseIRConstant(StringRef::iterator Loc, StringRef StringValue,
1568                             PerFunctionMIParsingState &PFS, const Constant *&C,
1569                             ErrorCallbackType ErrCB) {
1570   auto Source = StringValue.str(); // The source has to be null terminated.
1571   SMDiagnostic Err;
1572   C = parseConstantValue(Source, Err, *PFS.MF.getFunction().getParent(),
1573                          &PFS.IRSlots);
1574   if (!C)
1575     return ErrCB(Loc + Err.getColumnNo(), Err.getMessage());
1576   return false;
1577 }
1578 
parseIRConstant(StringRef::iterator Loc,StringRef StringValue,const Constant * & C)1579 bool MIParser::parseIRConstant(StringRef::iterator Loc, StringRef StringValue,
1580                                const Constant *&C) {
1581   return ::parseIRConstant(
1582       Loc, StringValue, PFS, C,
1583       [this](StringRef::iterator Loc, const Twine &Msg) -> bool {
1584         return error(Loc, Msg);
1585       });
1586 }
1587 
parseIRConstant(StringRef::iterator Loc,const Constant * & C)1588 bool MIParser::parseIRConstant(StringRef::iterator Loc, const Constant *&C) {
1589   if (parseIRConstant(Loc, StringRef(Loc, Token.range().end() - Loc), C))
1590     return true;
1591   lex();
1592   return false;
1593 }
1594 
1595 // See LLT implemntation for bit size limits.
verifyScalarSize(uint64_t Size)1596 static bool verifyScalarSize(uint64_t Size) {
1597   return Size != 0 && isUInt<16>(Size);
1598 }
1599 
verifyVectorElementCount(uint64_t NumElts)1600 static bool verifyVectorElementCount(uint64_t NumElts) {
1601   return NumElts != 0 && isUInt<16>(NumElts);
1602 }
1603 
verifyAddrSpace(uint64_t AddrSpace)1604 static bool verifyAddrSpace(uint64_t AddrSpace) {
1605   return isUInt<24>(AddrSpace);
1606 }
1607 
parseLowLevelType(StringRef::iterator Loc,LLT & Ty)1608 bool MIParser::parseLowLevelType(StringRef::iterator Loc, LLT &Ty) {
1609   if (Token.range().front() == 's' || Token.range().front() == 'p') {
1610     StringRef SizeStr = Token.range().drop_front();
1611     if (SizeStr.size() == 0 || !llvm::all_of(SizeStr, isdigit))
1612       return error("expected integers after 's'/'p' type character");
1613   }
1614 
1615   if (Token.range().front() == 's') {
1616     auto ScalarSize = APSInt(Token.range().drop_front()).getZExtValue();
1617     if (!verifyScalarSize(ScalarSize))
1618       return error("invalid size for scalar type");
1619 
1620     Ty = LLT::scalar(ScalarSize);
1621     lex();
1622     return false;
1623   } else if (Token.range().front() == 'p') {
1624     const DataLayout &DL = MF.getDataLayout();
1625     uint64_t AS = APSInt(Token.range().drop_front()).getZExtValue();
1626     if (!verifyAddrSpace(AS))
1627       return error("invalid address space number");
1628 
1629     Ty = LLT::pointer(AS, DL.getPointerSizeInBits(AS));
1630     lex();
1631     return false;
1632   }
1633 
1634   // Now we're looking for a vector.
1635   if (Token.isNot(MIToken::less))
1636     return error(Loc,
1637                  "expected sN, pA, <M x sN>, or <M x pA> for GlobalISel type");
1638   lex();
1639 
1640   if (Token.isNot(MIToken::IntegerLiteral))
1641     return error(Loc, "expected <M x sN> or <M x pA> for vector type");
1642   uint64_t NumElements = Token.integerValue().getZExtValue();
1643   if (!verifyVectorElementCount(NumElements))
1644     return error("invalid number of vector elements");
1645 
1646   lex();
1647 
1648   if (Token.isNot(MIToken::Identifier) || Token.stringValue() != "x")
1649     return error(Loc, "expected <M x sN> or <M x pA> for vector type");
1650   lex();
1651 
1652   if (Token.range().front() != 's' && Token.range().front() != 'p')
1653     return error(Loc, "expected <M x sN> or <M x pA> for vector type");
1654   StringRef SizeStr = Token.range().drop_front();
1655   if (SizeStr.size() == 0 || !llvm::all_of(SizeStr, isdigit))
1656     return error("expected integers after 's'/'p' type character");
1657 
1658   if (Token.range().front() == 's') {
1659     auto ScalarSize = APSInt(Token.range().drop_front()).getZExtValue();
1660     if (!verifyScalarSize(ScalarSize))
1661       return error("invalid size for scalar type");
1662     Ty = LLT::scalar(ScalarSize);
1663   } else if (Token.range().front() == 'p') {
1664     const DataLayout &DL = MF.getDataLayout();
1665     uint64_t AS = APSInt(Token.range().drop_front()).getZExtValue();
1666     if (!verifyAddrSpace(AS))
1667       return error("invalid address space number");
1668 
1669     Ty = LLT::pointer(AS, DL.getPointerSizeInBits(AS));
1670   } else
1671     return error(Loc, "expected <M x sN> or <M x pA> for vector type");
1672   lex();
1673 
1674   if (Token.isNot(MIToken::greater))
1675     return error(Loc, "expected <M x sN> or <M x pA> for vector type");
1676   lex();
1677 
1678   Ty = LLT::vector(NumElements, Ty);
1679   return false;
1680 }
1681 
parseTypedImmediateOperand(MachineOperand & Dest)1682 bool MIParser::parseTypedImmediateOperand(MachineOperand &Dest) {
1683   assert(Token.is(MIToken::Identifier));
1684   StringRef TypeStr = Token.range();
1685   if (TypeStr.front() != 'i' && TypeStr.front() != 's' &&
1686       TypeStr.front() != 'p')
1687     return error(
1688         "a typed immediate operand should start with one of 'i', 's', or 'p'");
1689   StringRef SizeStr = Token.range().drop_front();
1690   if (SizeStr.size() == 0 || !llvm::all_of(SizeStr, isdigit))
1691     return error("expected integers after 'i'/'s'/'p' type character");
1692 
1693   auto Loc = Token.location();
1694   lex();
1695   if (Token.isNot(MIToken::IntegerLiteral)) {
1696     if (Token.isNot(MIToken::Identifier) ||
1697         !(Token.range() == "true" || Token.range() == "false"))
1698       return error("expected an integer literal");
1699   }
1700   const Constant *C = nullptr;
1701   if (parseIRConstant(Loc, C))
1702     return true;
1703   Dest = MachineOperand::CreateCImm(cast<ConstantInt>(C));
1704   return false;
1705 }
1706 
parseFPImmediateOperand(MachineOperand & Dest)1707 bool MIParser::parseFPImmediateOperand(MachineOperand &Dest) {
1708   auto Loc = Token.location();
1709   lex();
1710   if (Token.isNot(MIToken::FloatingPointLiteral) &&
1711       Token.isNot(MIToken::HexLiteral))
1712     return error("expected a floating point literal");
1713   const Constant *C = nullptr;
1714   if (parseIRConstant(Loc, C))
1715     return true;
1716   Dest = MachineOperand::CreateFPImm(cast<ConstantFP>(C));
1717   return false;
1718 }
1719 
getHexUint(const MIToken & Token,APInt & Result)1720 static bool getHexUint(const MIToken &Token, APInt &Result) {
1721   assert(Token.is(MIToken::HexLiteral));
1722   StringRef S = Token.range();
1723   assert(S[0] == '0' && tolower(S[1]) == 'x');
1724   // This could be a floating point literal with a special prefix.
1725   if (!isxdigit(S[2]))
1726     return true;
1727   StringRef V = S.substr(2);
1728   APInt A(V.size()*4, V, 16);
1729 
1730   // If A is 0, then A.getActiveBits() is 0. This isn't a valid bitwidth. Make
1731   // sure it isn't the case before constructing result.
1732   unsigned NumBits = (A == 0) ? 32 : A.getActiveBits();
1733   Result = APInt(NumBits, ArrayRef<uint64_t>(A.getRawData(), A.getNumWords()));
1734   return false;
1735 }
1736 
getUnsigned(const MIToken & Token,unsigned & Result,ErrorCallbackType ErrCB)1737 static bool getUnsigned(const MIToken &Token, unsigned &Result,
1738                         ErrorCallbackType ErrCB) {
1739   if (Token.hasIntegerValue()) {
1740     const uint64_t Limit = uint64_t(std::numeric_limits<unsigned>::max()) + 1;
1741     uint64_t Val64 = Token.integerValue().getLimitedValue(Limit);
1742     if (Val64 == Limit)
1743       return ErrCB(Token.location(), "expected 32-bit integer (too large)");
1744     Result = Val64;
1745     return false;
1746   }
1747   if (Token.is(MIToken::HexLiteral)) {
1748     APInt A;
1749     if (getHexUint(Token, A))
1750       return true;
1751     if (A.getBitWidth() > 32)
1752       return ErrCB(Token.location(), "expected 32-bit integer (too large)");
1753     Result = A.getZExtValue();
1754     return false;
1755   }
1756   return true;
1757 }
1758 
getUnsigned(unsigned & Result)1759 bool MIParser::getUnsigned(unsigned &Result) {
1760   return ::getUnsigned(
1761       Token, Result, [this](StringRef::iterator Loc, const Twine &Msg) -> bool {
1762         return error(Loc, Msg);
1763       });
1764 }
1765 
parseMBBReference(MachineBasicBlock * & MBB)1766 bool MIParser::parseMBBReference(MachineBasicBlock *&MBB) {
1767   assert(Token.is(MIToken::MachineBasicBlock) ||
1768          Token.is(MIToken::MachineBasicBlockLabel));
1769   unsigned Number;
1770   if (getUnsigned(Number))
1771     return true;
1772   auto MBBInfo = PFS.MBBSlots.find(Number);
1773   if (MBBInfo == PFS.MBBSlots.end())
1774     return error(Twine("use of undefined machine basic block #") +
1775                  Twine(Number));
1776   MBB = MBBInfo->second;
1777   // TODO: Only parse the name if it's a MachineBasicBlockLabel. Deprecate once
1778   // we drop the <irname> from the bb.<id>.<irname> format.
1779   if (!Token.stringValue().empty() && Token.stringValue() != MBB->getName())
1780     return error(Twine("the name of machine basic block #") + Twine(Number) +
1781                  " isn't '" + Token.stringValue() + "'");
1782   return false;
1783 }
1784 
parseMBBOperand(MachineOperand & Dest)1785 bool MIParser::parseMBBOperand(MachineOperand &Dest) {
1786   MachineBasicBlock *MBB;
1787   if (parseMBBReference(MBB))
1788     return true;
1789   Dest = MachineOperand::CreateMBB(MBB);
1790   lex();
1791   return false;
1792 }
1793 
parseStackFrameIndex(int & FI)1794 bool MIParser::parseStackFrameIndex(int &FI) {
1795   assert(Token.is(MIToken::StackObject));
1796   unsigned ID;
1797   if (getUnsigned(ID))
1798     return true;
1799   auto ObjectInfo = PFS.StackObjectSlots.find(ID);
1800   if (ObjectInfo == PFS.StackObjectSlots.end())
1801     return error(Twine("use of undefined stack object '%stack.") + Twine(ID) +
1802                  "'");
1803   StringRef Name;
1804   if (const auto *Alloca =
1805           MF.getFrameInfo().getObjectAllocation(ObjectInfo->second))
1806     Name = Alloca->getName();
1807   if (!Token.stringValue().empty() && Token.stringValue() != Name)
1808     return error(Twine("the name of the stack object '%stack.") + Twine(ID) +
1809                  "' isn't '" + Token.stringValue() + "'");
1810   lex();
1811   FI = ObjectInfo->second;
1812   return false;
1813 }
1814 
parseStackObjectOperand(MachineOperand & Dest)1815 bool MIParser::parseStackObjectOperand(MachineOperand &Dest) {
1816   int FI;
1817   if (parseStackFrameIndex(FI))
1818     return true;
1819   Dest = MachineOperand::CreateFI(FI);
1820   return false;
1821 }
1822 
parseFixedStackFrameIndex(int & FI)1823 bool MIParser::parseFixedStackFrameIndex(int &FI) {
1824   assert(Token.is(MIToken::FixedStackObject));
1825   unsigned ID;
1826   if (getUnsigned(ID))
1827     return true;
1828   auto ObjectInfo = PFS.FixedStackObjectSlots.find(ID);
1829   if (ObjectInfo == PFS.FixedStackObjectSlots.end())
1830     return error(Twine("use of undefined fixed stack object '%fixed-stack.") +
1831                  Twine(ID) + "'");
1832   lex();
1833   FI = ObjectInfo->second;
1834   return false;
1835 }
1836 
parseFixedStackObjectOperand(MachineOperand & Dest)1837 bool MIParser::parseFixedStackObjectOperand(MachineOperand &Dest) {
1838   int FI;
1839   if (parseFixedStackFrameIndex(FI))
1840     return true;
1841   Dest = MachineOperand::CreateFI(FI);
1842   return false;
1843 }
1844 
parseGlobalValue(const MIToken & Token,PerFunctionMIParsingState & PFS,GlobalValue * & GV,ErrorCallbackType ErrCB)1845 static bool parseGlobalValue(const MIToken &Token,
1846                              PerFunctionMIParsingState &PFS, GlobalValue *&GV,
1847                              ErrorCallbackType ErrCB) {
1848   switch (Token.kind()) {
1849   case MIToken::NamedGlobalValue: {
1850     const Module *M = PFS.MF.getFunction().getParent();
1851     GV = M->getNamedValue(Token.stringValue());
1852     if (!GV)
1853       return ErrCB(Token.location(), Twine("use of undefined global value '") +
1854                                          Token.range() + "'");
1855     break;
1856   }
1857   case MIToken::GlobalValue: {
1858     unsigned GVIdx;
1859     if (getUnsigned(Token, GVIdx, ErrCB))
1860       return true;
1861     if (GVIdx >= PFS.IRSlots.GlobalValues.size())
1862       return ErrCB(Token.location(), Twine("use of undefined global value '@") +
1863                                          Twine(GVIdx) + "'");
1864     GV = PFS.IRSlots.GlobalValues[GVIdx];
1865     break;
1866   }
1867   default:
1868     llvm_unreachable("The current token should be a global value");
1869   }
1870   return false;
1871 }
1872 
parseGlobalValue(GlobalValue * & GV)1873 bool MIParser::parseGlobalValue(GlobalValue *&GV) {
1874   return ::parseGlobalValue(
1875       Token, PFS, GV,
1876       [this](StringRef::iterator Loc, const Twine &Msg) -> bool {
1877         return error(Loc, Msg);
1878       });
1879 }
1880 
parseGlobalAddressOperand(MachineOperand & Dest)1881 bool MIParser::parseGlobalAddressOperand(MachineOperand &Dest) {
1882   GlobalValue *GV = nullptr;
1883   if (parseGlobalValue(GV))
1884     return true;
1885   lex();
1886   Dest = MachineOperand::CreateGA(GV, /*Offset=*/0);
1887   if (parseOperandsOffset(Dest))
1888     return true;
1889   return false;
1890 }
1891 
parseConstantPoolIndexOperand(MachineOperand & Dest)1892 bool MIParser::parseConstantPoolIndexOperand(MachineOperand &Dest) {
1893   assert(Token.is(MIToken::ConstantPoolItem));
1894   unsigned ID;
1895   if (getUnsigned(ID))
1896     return true;
1897   auto ConstantInfo = PFS.ConstantPoolSlots.find(ID);
1898   if (ConstantInfo == PFS.ConstantPoolSlots.end())
1899     return error("use of undefined constant '%const." + Twine(ID) + "'");
1900   lex();
1901   Dest = MachineOperand::CreateCPI(ID, /*Offset=*/0);
1902   if (parseOperandsOffset(Dest))
1903     return true;
1904   return false;
1905 }
1906 
parseJumpTableIndexOperand(MachineOperand & Dest)1907 bool MIParser::parseJumpTableIndexOperand(MachineOperand &Dest) {
1908   assert(Token.is(MIToken::JumpTableIndex));
1909   unsigned ID;
1910   if (getUnsigned(ID))
1911     return true;
1912   auto JumpTableEntryInfo = PFS.JumpTableSlots.find(ID);
1913   if (JumpTableEntryInfo == PFS.JumpTableSlots.end())
1914     return error("use of undefined jump table '%jump-table." + Twine(ID) + "'");
1915   lex();
1916   Dest = MachineOperand::CreateJTI(JumpTableEntryInfo->second);
1917   return false;
1918 }
1919 
parseExternalSymbolOperand(MachineOperand & Dest)1920 bool MIParser::parseExternalSymbolOperand(MachineOperand &Dest) {
1921   assert(Token.is(MIToken::ExternalSymbol));
1922   const char *Symbol = MF.createExternalSymbolName(Token.stringValue());
1923   lex();
1924   Dest = MachineOperand::CreateES(Symbol);
1925   if (parseOperandsOffset(Dest))
1926     return true;
1927   return false;
1928 }
1929 
parseMCSymbolOperand(MachineOperand & Dest)1930 bool MIParser::parseMCSymbolOperand(MachineOperand &Dest) {
1931   assert(Token.is(MIToken::MCSymbol));
1932   MCSymbol *Symbol = getOrCreateMCSymbol(Token.stringValue());
1933   lex();
1934   Dest = MachineOperand::CreateMCSymbol(Symbol);
1935   if (parseOperandsOffset(Dest))
1936     return true;
1937   return false;
1938 }
1939 
parseSubRegisterIndexOperand(MachineOperand & Dest)1940 bool MIParser::parseSubRegisterIndexOperand(MachineOperand &Dest) {
1941   assert(Token.is(MIToken::SubRegisterIndex));
1942   StringRef Name = Token.stringValue();
1943   unsigned SubRegIndex = PFS.Target.getSubRegIndex(Token.stringValue());
1944   if (SubRegIndex == 0)
1945     return error(Twine("unknown subregister index '") + Name + "'");
1946   lex();
1947   Dest = MachineOperand::CreateImm(SubRegIndex);
1948   return false;
1949 }
1950 
parseMDNode(MDNode * & Node)1951 bool MIParser::parseMDNode(MDNode *&Node) {
1952   assert(Token.is(MIToken::exclaim));
1953 
1954   auto Loc = Token.location();
1955   lex();
1956   if (Token.isNot(MIToken::IntegerLiteral) || Token.integerValue().isSigned())
1957     return error("expected metadata id after '!'");
1958   unsigned ID;
1959   if (getUnsigned(ID))
1960     return true;
1961   auto NodeInfo = PFS.IRSlots.MetadataNodes.find(ID);
1962   if (NodeInfo == PFS.IRSlots.MetadataNodes.end())
1963     return error(Loc, "use of undefined metadata '!" + Twine(ID) + "'");
1964   lex();
1965   Node = NodeInfo->second.get();
1966   return false;
1967 }
1968 
parseDIExpression(MDNode * & Expr)1969 bool MIParser::parseDIExpression(MDNode *&Expr) {
1970   assert(Token.is(MIToken::md_diexpr));
1971   lex();
1972 
1973   // FIXME: Share this parsing with the IL parser.
1974   SmallVector<uint64_t, 8> Elements;
1975 
1976   if (expectAndConsume(MIToken::lparen))
1977     return true;
1978 
1979   if (Token.isNot(MIToken::rparen)) {
1980     do {
1981       if (Token.is(MIToken::Identifier)) {
1982         if (unsigned Op = dwarf::getOperationEncoding(Token.stringValue())) {
1983           lex();
1984           Elements.push_back(Op);
1985           continue;
1986         }
1987         if (unsigned Enc = dwarf::getAttributeEncoding(Token.stringValue())) {
1988           lex();
1989           Elements.push_back(Enc);
1990           continue;
1991         }
1992         return error(Twine("invalid DWARF op '") + Token.stringValue() + "'");
1993       }
1994 
1995       if (Token.isNot(MIToken::IntegerLiteral) ||
1996           Token.integerValue().isSigned())
1997         return error("expected unsigned integer");
1998 
1999       auto &U = Token.integerValue();
2000       if (U.ugt(UINT64_MAX))
2001         return error("element too large, limit is " + Twine(UINT64_MAX));
2002       Elements.push_back(U.getZExtValue());
2003       lex();
2004 
2005     } while (consumeIfPresent(MIToken::comma));
2006   }
2007 
2008   if (expectAndConsume(MIToken::rparen))
2009     return true;
2010 
2011   Expr = DIExpression::get(MF.getFunction().getContext(), Elements);
2012   return false;
2013 }
2014 
parseDILocation(MDNode * & Loc)2015 bool MIParser::parseDILocation(MDNode *&Loc) {
2016   assert(Token.is(MIToken::md_dilocation));
2017   lex();
2018 
2019   bool HaveLine = false;
2020   unsigned Line = 0;
2021   unsigned Column = 0;
2022   MDNode *Scope = nullptr;
2023   MDNode *InlinedAt = nullptr;
2024   bool ImplicitCode = false;
2025 
2026   if (expectAndConsume(MIToken::lparen))
2027     return true;
2028 
2029   if (Token.isNot(MIToken::rparen)) {
2030     do {
2031       if (Token.is(MIToken::Identifier)) {
2032         if (Token.stringValue() == "line") {
2033           lex();
2034           if (expectAndConsume(MIToken::colon))
2035             return true;
2036           if (Token.isNot(MIToken::IntegerLiteral) ||
2037               Token.integerValue().isSigned())
2038             return error("expected unsigned integer");
2039           Line = Token.integerValue().getZExtValue();
2040           HaveLine = true;
2041           lex();
2042           continue;
2043         }
2044         if (Token.stringValue() == "column") {
2045           lex();
2046           if (expectAndConsume(MIToken::colon))
2047             return true;
2048           if (Token.isNot(MIToken::IntegerLiteral) ||
2049               Token.integerValue().isSigned())
2050             return error("expected unsigned integer");
2051           Column = Token.integerValue().getZExtValue();
2052           lex();
2053           continue;
2054         }
2055         if (Token.stringValue() == "scope") {
2056           lex();
2057           if (expectAndConsume(MIToken::colon))
2058             return true;
2059           if (parseMDNode(Scope))
2060             return error("expected metadata node");
2061           if (!isa<DIScope>(Scope))
2062             return error("expected DIScope node");
2063           continue;
2064         }
2065         if (Token.stringValue() == "inlinedAt") {
2066           lex();
2067           if (expectAndConsume(MIToken::colon))
2068             return true;
2069           if (Token.is(MIToken::exclaim)) {
2070             if (parseMDNode(InlinedAt))
2071               return true;
2072           } else if (Token.is(MIToken::md_dilocation)) {
2073             if (parseDILocation(InlinedAt))
2074               return true;
2075           } else
2076             return error("expected metadata node");
2077           if (!isa<DILocation>(InlinedAt))
2078             return error("expected DILocation node");
2079           continue;
2080         }
2081         if (Token.stringValue() == "isImplicitCode") {
2082           lex();
2083           if (expectAndConsume(MIToken::colon))
2084             return true;
2085           if (!Token.is(MIToken::Identifier))
2086             return error("expected true/false");
2087           // As far as I can see, we don't have any existing need for parsing
2088           // true/false in MIR yet. Do it ad-hoc until there's something else
2089           // that needs it.
2090           if (Token.stringValue() == "true")
2091             ImplicitCode = true;
2092           else if (Token.stringValue() == "false")
2093             ImplicitCode = false;
2094           else
2095             return error("expected true/false");
2096           lex();
2097           continue;
2098         }
2099       }
2100       return error(Twine("invalid DILocation argument '") +
2101                    Token.stringValue() + "'");
2102     } while (consumeIfPresent(MIToken::comma));
2103   }
2104 
2105   if (expectAndConsume(MIToken::rparen))
2106     return true;
2107 
2108   if (!HaveLine)
2109     return error("DILocation requires line number");
2110   if (!Scope)
2111     return error("DILocation requires a scope");
2112 
2113   Loc = DILocation::get(MF.getFunction().getContext(), Line, Column, Scope,
2114                         InlinedAt, ImplicitCode);
2115   return false;
2116 }
2117 
parseMetadataOperand(MachineOperand & Dest)2118 bool MIParser::parseMetadataOperand(MachineOperand &Dest) {
2119   MDNode *Node = nullptr;
2120   if (Token.is(MIToken::exclaim)) {
2121     if (parseMDNode(Node))
2122       return true;
2123   } else if (Token.is(MIToken::md_diexpr)) {
2124     if (parseDIExpression(Node))
2125       return true;
2126   }
2127   Dest = MachineOperand::CreateMetadata(Node);
2128   return false;
2129 }
2130 
parseCFIOffset(int & Offset)2131 bool MIParser::parseCFIOffset(int &Offset) {
2132   if (Token.isNot(MIToken::IntegerLiteral))
2133     return error("expected a cfi offset");
2134   if (Token.integerValue().getMinSignedBits() > 32)
2135     return error("expected a 32 bit integer (the cfi offset is too large)");
2136   Offset = (int)Token.integerValue().getExtValue();
2137   lex();
2138   return false;
2139 }
2140 
parseCFIRegister(unsigned & Reg)2141 bool MIParser::parseCFIRegister(unsigned &Reg) {
2142   if (Token.isNot(MIToken::NamedRegister))
2143     return error("expected a cfi register");
2144   unsigned LLVMReg;
2145   if (parseNamedRegister(LLVMReg))
2146     return true;
2147   const auto *TRI = MF.getSubtarget().getRegisterInfo();
2148   assert(TRI && "Expected target register info");
2149   int DwarfReg = TRI->getDwarfRegNum(LLVMReg, true);
2150   if (DwarfReg < 0)
2151     return error("invalid DWARF register");
2152   Reg = (unsigned)DwarfReg;
2153   lex();
2154   return false;
2155 }
2156 
parseCFIEscapeValues(std::string & Values)2157 bool MIParser::parseCFIEscapeValues(std::string &Values) {
2158   do {
2159     if (Token.isNot(MIToken::HexLiteral))
2160       return error("expected a hexadecimal literal");
2161     unsigned Value;
2162     if (getUnsigned(Value))
2163       return true;
2164     if (Value > UINT8_MAX)
2165       return error("expected a 8-bit integer (too large)");
2166     Values.push_back(static_cast<uint8_t>(Value));
2167     lex();
2168   } while (consumeIfPresent(MIToken::comma));
2169   return false;
2170 }
2171 
parseCFIOperand(MachineOperand & Dest)2172 bool MIParser::parseCFIOperand(MachineOperand &Dest) {
2173   auto Kind = Token.kind();
2174   lex();
2175   int Offset;
2176   unsigned Reg;
2177   unsigned CFIIndex;
2178   switch (Kind) {
2179   case MIToken::kw_cfi_same_value:
2180     if (parseCFIRegister(Reg))
2181       return true;
2182     CFIIndex = MF.addFrameInst(MCCFIInstruction::createSameValue(nullptr, Reg));
2183     break;
2184   case MIToken::kw_cfi_offset:
2185     if (parseCFIRegister(Reg) || expectAndConsume(MIToken::comma) ||
2186         parseCFIOffset(Offset))
2187       return true;
2188     CFIIndex =
2189         MF.addFrameInst(MCCFIInstruction::createOffset(nullptr, Reg, Offset));
2190     break;
2191   case MIToken::kw_cfi_rel_offset:
2192     if (parseCFIRegister(Reg) || expectAndConsume(MIToken::comma) ||
2193         parseCFIOffset(Offset))
2194       return true;
2195     CFIIndex = MF.addFrameInst(
2196         MCCFIInstruction::createRelOffset(nullptr, Reg, Offset));
2197     break;
2198   case MIToken::kw_cfi_def_cfa_register:
2199     if (parseCFIRegister(Reg))
2200       return true;
2201     CFIIndex =
2202         MF.addFrameInst(MCCFIInstruction::createDefCfaRegister(nullptr, Reg));
2203     break;
2204   case MIToken::kw_cfi_def_cfa_offset:
2205     if (parseCFIOffset(Offset))
2206       return true;
2207     // NB: MCCFIInstruction::createDefCfaOffset negates the offset.
2208     CFIIndex = MF.addFrameInst(
2209         MCCFIInstruction::createDefCfaOffset(nullptr, -Offset));
2210     break;
2211   case MIToken::kw_cfi_adjust_cfa_offset:
2212     if (parseCFIOffset(Offset))
2213       return true;
2214     CFIIndex = MF.addFrameInst(
2215         MCCFIInstruction::createAdjustCfaOffset(nullptr, Offset));
2216     break;
2217   case MIToken::kw_cfi_def_cfa:
2218     if (parseCFIRegister(Reg) || expectAndConsume(MIToken::comma) ||
2219         parseCFIOffset(Offset))
2220       return true;
2221     // NB: MCCFIInstruction::createDefCfa negates the offset.
2222     CFIIndex =
2223         MF.addFrameInst(MCCFIInstruction::createDefCfa(nullptr, Reg, -Offset));
2224     break;
2225   case MIToken::kw_cfi_remember_state:
2226     CFIIndex = MF.addFrameInst(MCCFIInstruction::createRememberState(nullptr));
2227     break;
2228   case MIToken::kw_cfi_restore:
2229     if (parseCFIRegister(Reg))
2230       return true;
2231     CFIIndex = MF.addFrameInst(MCCFIInstruction::createRestore(nullptr, Reg));
2232     break;
2233   case MIToken::kw_cfi_restore_state:
2234     CFIIndex = MF.addFrameInst(MCCFIInstruction::createRestoreState(nullptr));
2235     break;
2236   case MIToken::kw_cfi_undefined:
2237     if (parseCFIRegister(Reg))
2238       return true;
2239     CFIIndex = MF.addFrameInst(MCCFIInstruction::createUndefined(nullptr, Reg));
2240     break;
2241   case MIToken::kw_cfi_register: {
2242     unsigned Reg2;
2243     if (parseCFIRegister(Reg) || expectAndConsume(MIToken::comma) ||
2244         parseCFIRegister(Reg2))
2245       return true;
2246 
2247     CFIIndex =
2248         MF.addFrameInst(MCCFIInstruction::createRegister(nullptr, Reg, Reg2));
2249     break;
2250   }
2251   case MIToken::kw_cfi_window_save:
2252     CFIIndex = MF.addFrameInst(MCCFIInstruction::createWindowSave(nullptr));
2253     break;
2254   case MIToken::kw_cfi_aarch64_negate_ra_sign_state:
2255     CFIIndex = MF.addFrameInst(MCCFIInstruction::createNegateRAState(nullptr));
2256     break;
2257   case MIToken::kw_cfi_escape: {
2258     std::string Values;
2259     if (parseCFIEscapeValues(Values))
2260       return true;
2261     CFIIndex = MF.addFrameInst(MCCFIInstruction::createEscape(nullptr, Values));
2262     break;
2263   }
2264   default:
2265     // TODO: Parse the other CFI operands.
2266     llvm_unreachable("The current token should be a cfi operand");
2267   }
2268   Dest = MachineOperand::CreateCFIIndex(CFIIndex);
2269   return false;
2270 }
2271 
parseIRBlock(BasicBlock * & BB,const Function & F)2272 bool MIParser::parseIRBlock(BasicBlock *&BB, const Function &F) {
2273   switch (Token.kind()) {
2274   case MIToken::NamedIRBlock: {
2275     BB = dyn_cast_or_null<BasicBlock>(
2276         F.getValueSymbolTable()->lookup(Token.stringValue()));
2277     if (!BB)
2278       return error(Twine("use of undefined IR block '") + Token.range() + "'");
2279     break;
2280   }
2281   case MIToken::IRBlock: {
2282     unsigned SlotNumber = 0;
2283     if (getUnsigned(SlotNumber))
2284       return true;
2285     BB = const_cast<BasicBlock *>(getIRBlock(SlotNumber, F));
2286     if (!BB)
2287       return error(Twine("use of undefined IR block '%ir-block.") +
2288                    Twine(SlotNumber) + "'");
2289     break;
2290   }
2291   default:
2292     llvm_unreachable("The current token should be an IR block reference");
2293   }
2294   return false;
2295 }
2296 
parseBlockAddressOperand(MachineOperand & Dest)2297 bool MIParser::parseBlockAddressOperand(MachineOperand &Dest) {
2298   assert(Token.is(MIToken::kw_blockaddress));
2299   lex();
2300   if (expectAndConsume(MIToken::lparen))
2301     return true;
2302   if (Token.isNot(MIToken::GlobalValue) &&
2303       Token.isNot(MIToken::NamedGlobalValue))
2304     return error("expected a global value");
2305   GlobalValue *GV = nullptr;
2306   if (parseGlobalValue(GV))
2307     return true;
2308   auto *F = dyn_cast<Function>(GV);
2309   if (!F)
2310     return error("expected an IR function reference");
2311   lex();
2312   if (expectAndConsume(MIToken::comma))
2313     return true;
2314   BasicBlock *BB = nullptr;
2315   if (Token.isNot(MIToken::IRBlock) && Token.isNot(MIToken::NamedIRBlock))
2316     return error("expected an IR block reference");
2317   if (parseIRBlock(BB, *F))
2318     return true;
2319   lex();
2320   if (expectAndConsume(MIToken::rparen))
2321     return true;
2322   Dest = MachineOperand::CreateBA(BlockAddress::get(F, BB), /*Offset=*/0);
2323   if (parseOperandsOffset(Dest))
2324     return true;
2325   return false;
2326 }
2327 
parseIntrinsicOperand(MachineOperand & Dest)2328 bool MIParser::parseIntrinsicOperand(MachineOperand &Dest) {
2329   assert(Token.is(MIToken::kw_intrinsic));
2330   lex();
2331   if (expectAndConsume(MIToken::lparen))
2332     return error("expected syntax intrinsic(@llvm.whatever)");
2333 
2334   if (Token.isNot(MIToken::NamedGlobalValue))
2335     return error("expected syntax intrinsic(@llvm.whatever)");
2336 
2337   std::string Name = Token.stringValue();
2338   lex();
2339 
2340   if (expectAndConsume(MIToken::rparen))
2341     return error("expected ')' to terminate intrinsic name");
2342 
2343   // Find out what intrinsic we're dealing with, first try the global namespace
2344   // and then the target's private intrinsics if that fails.
2345   const TargetIntrinsicInfo *TII = MF.getTarget().getIntrinsicInfo();
2346   Intrinsic::ID ID = Function::lookupIntrinsicID(Name);
2347   if (ID == Intrinsic::not_intrinsic && TII)
2348     ID = static_cast<Intrinsic::ID>(TII->lookupName(Name));
2349 
2350   if (ID == Intrinsic::not_intrinsic)
2351     return error("unknown intrinsic name");
2352   Dest = MachineOperand::CreateIntrinsicID(ID);
2353 
2354   return false;
2355 }
2356 
parsePredicateOperand(MachineOperand & Dest)2357 bool MIParser::parsePredicateOperand(MachineOperand &Dest) {
2358   assert(Token.is(MIToken::kw_intpred) || Token.is(MIToken::kw_floatpred));
2359   bool IsFloat = Token.is(MIToken::kw_floatpred);
2360   lex();
2361 
2362   if (expectAndConsume(MIToken::lparen))
2363     return error("expected syntax intpred(whatever) or floatpred(whatever");
2364 
2365   if (Token.isNot(MIToken::Identifier))
2366     return error("whatever");
2367 
2368   CmpInst::Predicate Pred;
2369   if (IsFloat) {
2370     Pred = StringSwitch<CmpInst::Predicate>(Token.stringValue())
2371                .Case("false", CmpInst::FCMP_FALSE)
2372                .Case("oeq", CmpInst::FCMP_OEQ)
2373                .Case("ogt", CmpInst::FCMP_OGT)
2374                .Case("oge", CmpInst::FCMP_OGE)
2375                .Case("olt", CmpInst::FCMP_OLT)
2376                .Case("ole", CmpInst::FCMP_OLE)
2377                .Case("one", CmpInst::FCMP_ONE)
2378                .Case("ord", CmpInst::FCMP_ORD)
2379                .Case("uno", CmpInst::FCMP_UNO)
2380                .Case("ueq", CmpInst::FCMP_UEQ)
2381                .Case("ugt", CmpInst::FCMP_UGT)
2382                .Case("uge", CmpInst::FCMP_UGE)
2383                .Case("ult", CmpInst::FCMP_ULT)
2384                .Case("ule", CmpInst::FCMP_ULE)
2385                .Case("une", CmpInst::FCMP_UNE)
2386                .Case("true", CmpInst::FCMP_TRUE)
2387                .Default(CmpInst::BAD_FCMP_PREDICATE);
2388     if (!CmpInst::isFPPredicate(Pred))
2389       return error("invalid floating-point predicate");
2390   } else {
2391     Pred = StringSwitch<CmpInst::Predicate>(Token.stringValue())
2392                .Case("eq", CmpInst::ICMP_EQ)
2393                .Case("ne", CmpInst::ICMP_NE)
2394                .Case("sgt", CmpInst::ICMP_SGT)
2395                .Case("sge", CmpInst::ICMP_SGE)
2396                .Case("slt", CmpInst::ICMP_SLT)
2397                .Case("sle", CmpInst::ICMP_SLE)
2398                .Case("ugt", CmpInst::ICMP_UGT)
2399                .Case("uge", CmpInst::ICMP_UGE)
2400                .Case("ult", CmpInst::ICMP_ULT)
2401                .Case("ule", CmpInst::ICMP_ULE)
2402                .Default(CmpInst::BAD_ICMP_PREDICATE);
2403     if (!CmpInst::isIntPredicate(Pred))
2404       return error("invalid integer predicate");
2405   }
2406 
2407   lex();
2408   Dest = MachineOperand::CreatePredicate(Pred);
2409   if (expectAndConsume(MIToken::rparen))
2410     return error("predicate should be terminated by ')'.");
2411 
2412   return false;
2413 }
2414 
parseShuffleMaskOperand(MachineOperand & Dest)2415 bool MIParser::parseShuffleMaskOperand(MachineOperand &Dest) {
2416   assert(Token.is(MIToken::kw_shufflemask));
2417 
2418   lex();
2419   if (expectAndConsume(MIToken::lparen))
2420     return error("expected syntax shufflemask(<integer or undef>, ...)");
2421 
2422   SmallVector<int, 32> ShufMask;
2423   do {
2424     if (Token.is(MIToken::kw_undef)) {
2425       ShufMask.push_back(-1);
2426     } else if (Token.is(MIToken::IntegerLiteral)) {
2427       const APSInt &Int = Token.integerValue();
2428       ShufMask.push_back(Int.getExtValue());
2429     } else
2430       return error("expected integer constant");
2431 
2432     lex();
2433   } while (consumeIfPresent(MIToken::comma));
2434 
2435   if (expectAndConsume(MIToken::rparen))
2436     return error("shufflemask should be terminated by ')'.");
2437 
2438   ArrayRef<int> MaskAlloc = MF.allocateShuffleMask(ShufMask);
2439   Dest = MachineOperand::CreateShuffleMask(MaskAlloc);
2440   return false;
2441 }
2442 
parseTargetIndexOperand(MachineOperand & Dest)2443 bool MIParser::parseTargetIndexOperand(MachineOperand &Dest) {
2444   assert(Token.is(MIToken::kw_target_index));
2445   lex();
2446   if (expectAndConsume(MIToken::lparen))
2447     return true;
2448   if (Token.isNot(MIToken::Identifier))
2449     return error("expected the name of the target index");
2450   int Index = 0;
2451   if (PFS.Target.getTargetIndex(Token.stringValue(), Index))
2452     return error("use of undefined target index '" + Token.stringValue() + "'");
2453   lex();
2454   if (expectAndConsume(MIToken::rparen))
2455     return true;
2456   Dest = MachineOperand::CreateTargetIndex(unsigned(Index), /*Offset=*/0);
2457   if (parseOperandsOffset(Dest))
2458     return true;
2459   return false;
2460 }
2461 
parseCustomRegisterMaskOperand(MachineOperand & Dest)2462 bool MIParser::parseCustomRegisterMaskOperand(MachineOperand &Dest) {
2463   assert(Token.stringValue() == "CustomRegMask" && "Expected a custom RegMask");
2464   lex();
2465   if (expectAndConsume(MIToken::lparen))
2466     return true;
2467 
2468   uint32_t *Mask = MF.allocateRegMask();
2469   while (true) {
2470     if (Token.isNot(MIToken::NamedRegister))
2471       return error("expected a named register");
2472     unsigned Reg;
2473     if (parseNamedRegister(Reg))
2474       return true;
2475     lex();
2476     Mask[Reg / 32] |= 1U << (Reg % 32);
2477     // TODO: Report an error if the same register is used more than once.
2478     if (Token.isNot(MIToken::comma))
2479       break;
2480     lex();
2481   }
2482 
2483   if (expectAndConsume(MIToken::rparen))
2484     return true;
2485   Dest = MachineOperand::CreateRegMask(Mask);
2486   return false;
2487 }
2488 
parseLiveoutRegisterMaskOperand(MachineOperand & Dest)2489 bool MIParser::parseLiveoutRegisterMaskOperand(MachineOperand &Dest) {
2490   assert(Token.is(MIToken::kw_liveout));
2491   uint32_t *Mask = MF.allocateRegMask();
2492   lex();
2493   if (expectAndConsume(MIToken::lparen))
2494     return true;
2495   while (true) {
2496     if (Token.isNot(MIToken::NamedRegister))
2497       return error("expected a named register");
2498     unsigned Reg;
2499     if (parseNamedRegister(Reg))
2500       return true;
2501     lex();
2502     Mask[Reg / 32] |= 1U << (Reg % 32);
2503     // TODO: Report an error if the same register is used more than once.
2504     if (Token.isNot(MIToken::comma))
2505       break;
2506     lex();
2507   }
2508   if (expectAndConsume(MIToken::rparen))
2509     return true;
2510   Dest = MachineOperand::CreateRegLiveOut(Mask);
2511   return false;
2512 }
2513 
parseMachineOperand(const unsigned OpCode,const unsigned OpIdx,MachineOperand & Dest,Optional<unsigned> & TiedDefIdx)2514 bool MIParser::parseMachineOperand(const unsigned OpCode, const unsigned OpIdx,
2515                                    MachineOperand &Dest,
2516                                    Optional<unsigned> &TiedDefIdx) {
2517   switch (Token.kind()) {
2518   case MIToken::kw_implicit:
2519   case MIToken::kw_implicit_define:
2520   case MIToken::kw_def:
2521   case MIToken::kw_dead:
2522   case MIToken::kw_killed:
2523   case MIToken::kw_undef:
2524   case MIToken::kw_internal:
2525   case MIToken::kw_early_clobber:
2526   case MIToken::kw_debug_use:
2527   case MIToken::kw_renamable:
2528   case MIToken::underscore:
2529   case MIToken::NamedRegister:
2530   case MIToken::VirtualRegister:
2531   case MIToken::NamedVirtualRegister:
2532     return parseRegisterOperand(Dest, TiedDefIdx);
2533   case MIToken::IntegerLiteral:
2534     return parseImmediateOperand(Dest);
2535   case MIToken::kw_half:
2536   case MIToken::kw_float:
2537   case MIToken::kw_double:
2538   case MIToken::kw_x86_fp80:
2539   case MIToken::kw_fp128:
2540   case MIToken::kw_ppc_fp128:
2541     return parseFPImmediateOperand(Dest);
2542   case MIToken::MachineBasicBlock:
2543     return parseMBBOperand(Dest);
2544   case MIToken::StackObject:
2545     return parseStackObjectOperand(Dest);
2546   case MIToken::FixedStackObject:
2547     return parseFixedStackObjectOperand(Dest);
2548   case MIToken::GlobalValue:
2549   case MIToken::NamedGlobalValue:
2550     return parseGlobalAddressOperand(Dest);
2551   case MIToken::ConstantPoolItem:
2552     return parseConstantPoolIndexOperand(Dest);
2553   case MIToken::JumpTableIndex:
2554     return parseJumpTableIndexOperand(Dest);
2555   case MIToken::ExternalSymbol:
2556     return parseExternalSymbolOperand(Dest);
2557   case MIToken::MCSymbol:
2558     return parseMCSymbolOperand(Dest);
2559   case MIToken::SubRegisterIndex:
2560     return parseSubRegisterIndexOperand(Dest);
2561   case MIToken::md_diexpr:
2562   case MIToken::exclaim:
2563     return parseMetadataOperand(Dest);
2564   case MIToken::kw_cfi_same_value:
2565   case MIToken::kw_cfi_offset:
2566   case MIToken::kw_cfi_rel_offset:
2567   case MIToken::kw_cfi_def_cfa_register:
2568   case MIToken::kw_cfi_def_cfa_offset:
2569   case MIToken::kw_cfi_adjust_cfa_offset:
2570   case MIToken::kw_cfi_escape:
2571   case MIToken::kw_cfi_def_cfa:
2572   case MIToken::kw_cfi_register:
2573   case MIToken::kw_cfi_remember_state:
2574   case MIToken::kw_cfi_restore:
2575   case MIToken::kw_cfi_restore_state:
2576   case MIToken::kw_cfi_undefined:
2577   case MIToken::kw_cfi_window_save:
2578   case MIToken::kw_cfi_aarch64_negate_ra_sign_state:
2579     return parseCFIOperand(Dest);
2580   case MIToken::kw_blockaddress:
2581     return parseBlockAddressOperand(Dest);
2582   case MIToken::kw_intrinsic:
2583     return parseIntrinsicOperand(Dest);
2584   case MIToken::kw_target_index:
2585     return parseTargetIndexOperand(Dest);
2586   case MIToken::kw_liveout:
2587     return parseLiveoutRegisterMaskOperand(Dest);
2588   case MIToken::kw_floatpred:
2589   case MIToken::kw_intpred:
2590     return parsePredicateOperand(Dest);
2591   case MIToken::kw_shufflemask:
2592     return parseShuffleMaskOperand(Dest);
2593   case MIToken::Error:
2594     return true;
2595   case MIToken::Identifier:
2596     if (const auto *RegMask = PFS.Target.getRegMask(Token.stringValue())) {
2597       Dest = MachineOperand::CreateRegMask(RegMask);
2598       lex();
2599       break;
2600     } else if (Token.stringValue() == "CustomRegMask") {
2601       return parseCustomRegisterMaskOperand(Dest);
2602     } else
2603       return parseTypedImmediateOperand(Dest);
2604   case MIToken::dot: {
2605     const auto *TII = MF.getSubtarget().getInstrInfo();
2606     if (const auto *Formatter = TII->getMIRFormatter()) {
2607       return parseTargetImmMnemonic(OpCode, OpIdx, Dest, *Formatter);
2608     }
2609     LLVM_FALLTHROUGH;
2610   }
2611   default:
2612     // FIXME: Parse the MCSymbol machine operand.
2613     return error("expected a machine operand");
2614   }
2615   return false;
2616 }
2617 
parseMachineOperandAndTargetFlags(const unsigned OpCode,const unsigned OpIdx,MachineOperand & Dest,Optional<unsigned> & TiedDefIdx)2618 bool MIParser::parseMachineOperandAndTargetFlags(
2619     const unsigned OpCode, const unsigned OpIdx, MachineOperand &Dest,
2620     Optional<unsigned> &TiedDefIdx) {
2621   unsigned TF = 0;
2622   bool HasTargetFlags = false;
2623   if (Token.is(MIToken::kw_target_flags)) {
2624     HasTargetFlags = true;
2625     lex();
2626     if (expectAndConsume(MIToken::lparen))
2627       return true;
2628     if (Token.isNot(MIToken::Identifier))
2629       return error("expected the name of the target flag");
2630     if (PFS.Target.getDirectTargetFlag(Token.stringValue(), TF)) {
2631       if (PFS.Target.getBitmaskTargetFlag(Token.stringValue(), TF))
2632         return error("use of undefined target flag '" + Token.stringValue() +
2633                      "'");
2634     }
2635     lex();
2636     while (Token.is(MIToken::comma)) {
2637       lex();
2638       if (Token.isNot(MIToken::Identifier))
2639         return error("expected the name of the target flag");
2640       unsigned BitFlag = 0;
2641       if (PFS.Target.getBitmaskTargetFlag(Token.stringValue(), BitFlag))
2642         return error("use of undefined target flag '" + Token.stringValue() +
2643                      "'");
2644       // TODO: Report an error when using a duplicate bit target flag.
2645       TF |= BitFlag;
2646       lex();
2647     }
2648     if (expectAndConsume(MIToken::rparen))
2649       return true;
2650   }
2651   auto Loc = Token.location();
2652   if (parseMachineOperand(OpCode, OpIdx, Dest, TiedDefIdx))
2653     return true;
2654   if (!HasTargetFlags)
2655     return false;
2656   if (Dest.isReg())
2657     return error(Loc, "register operands can't have target flags");
2658   Dest.setTargetFlags(TF);
2659   return false;
2660 }
2661 
parseOffset(int64_t & Offset)2662 bool MIParser::parseOffset(int64_t &Offset) {
2663   if (Token.isNot(MIToken::plus) && Token.isNot(MIToken::minus))
2664     return false;
2665   StringRef Sign = Token.range();
2666   bool IsNegative = Token.is(MIToken::minus);
2667   lex();
2668   if (Token.isNot(MIToken::IntegerLiteral))
2669     return error("expected an integer literal after '" + Sign + "'");
2670   if (Token.integerValue().getMinSignedBits() > 64)
2671     return error("expected 64-bit integer (too large)");
2672   Offset = Token.integerValue().getExtValue();
2673   if (IsNegative)
2674     Offset = -Offset;
2675   lex();
2676   return false;
2677 }
2678 
parseAlignment(unsigned & Alignment)2679 bool MIParser::parseAlignment(unsigned &Alignment) {
2680   assert(Token.is(MIToken::kw_align));
2681   lex();
2682   if (Token.isNot(MIToken::IntegerLiteral) || Token.integerValue().isSigned())
2683     return error("expected an integer literal after 'align'");
2684   if (getUnsigned(Alignment))
2685     return true;
2686   lex();
2687 
2688   if (!isPowerOf2_32(Alignment))
2689     return error("expected a power-of-2 literal after 'align'");
2690 
2691   return false;
2692 }
2693 
parseAddrspace(unsigned & Addrspace)2694 bool MIParser::parseAddrspace(unsigned &Addrspace) {
2695   assert(Token.is(MIToken::kw_addrspace));
2696   lex();
2697   if (Token.isNot(MIToken::IntegerLiteral) || Token.integerValue().isSigned())
2698     return error("expected an integer literal after 'addrspace'");
2699   if (getUnsigned(Addrspace))
2700     return true;
2701   lex();
2702   return false;
2703 }
2704 
parseOperandsOffset(MachineOperand & Op)2705 bool MIParser::parseOperandsOffset(MachineOperand &Op) {
2706   int64_t Offset = 0;
2707   if (parseOffset(Offset))
2708     return true;
2709   Op.setOffset(Offset);
2710   return false;
2711 }
2712 
parseIRValue(const MIToken & Token,PerFunctionMIParsingState & PFS,const Value * & V,ErrorCallbackType ErrCB)2713 static bool parseIRValue(const MIToken &Token, PerFunctionMIParsingState &PFS,
2714                          const Value *&V, ErrorCallbackType ErrCB) {
2715   switch (Token.kind()) {
2716   case MIToken::NamedIRValue: {
2717     V = PFS.MF.getFunction().getValueSymbolTable()->lookup(Token.stringValue());
2718     break;
2719   }
2720   case MIToken::IRValue: {
2721     unsigned SlotNumber = 0;
2722     if (getUnsigned(Token, SlotNumber, ErrCB))
2723       return true;
2724     V = PFS.getIRValue(SlotNumber);
2725     break;
2726   }
2727   case MIToken::NamedGlobalValue:
2728   case MIToken::GlobalValue: {
2729     GlobalValue *GV = nullptr;
2730     if (parseGlobalValue(Token, PFS, GV, ErrCB))
2731       return true;
2732     V = GV;
2733     break;
2734   }
2735   case MIToken::QuotedIRValue: {
2736     const Constant *C = nullptr;
2737     if (parseIRConstant(Token.location(), Token.stringValue(), PFS, C, ErrCB))
2738       return true;
2739     V = C;
2740     break;
2741   }
2742   default:
2743     llvm_unreachable("The current token should be an IR block reference");
2744   }
2745   if (!V)
2746     return ErrCB(Token.location(), Twine("use of undefined IR value '") + Token.range() + "'");
2747   return false;
2748 }
2749 
parseIRValue(const Value * & V)2750 bool MIParser::parseIRValue(const Value *&V) {
2751   return ::parseIRValue(
2752       Token, PFS, V, [this](StringRef::iterator Loc, const Twine &Msg) -> bool {
2753         return error(Loc, Msg);
2754       });
2755 }
2756 
getUint64(uint64_t & Result)2757 bool MIParser::getUint64(uint64_t &Result) {
2758   if (Token.hasIntegerValue()) {
2759     if (Token.integerValue().getActiveBits() > 64)
2760       return error("expected 64-bit integer (too large)");
2761     Result = Token.integerValue().getZExtValue();
2762     return false;
2763   }
2764   if (Token.is(MIToken::HexLiteral)) {
2765     APInt A;
2766     if (getHexUint(A))
2767       return true;
2768     if (A.getBitWidth() > 64)
2769       return error("expected 64-bit integer (too large)");
2770     Result = A.getZExtValue();
2771     return false;
2772   }
2773   return true;
2774 }
2775 
getHexUint(APInt & Result)2776 bool MIParser::getHexUint(APInt &Result) {
2777   return ::getHexUint(Token, Result);
2778 }
2779 
parseMemoryOperandFlag(MachineMemOperand::Flags & Flags)2780 bool MIParser::parseMemoryOperandFlag(MachineMemOperand::Flags &Flags) {
2781   const auto OldFlags = Flags;
2782   switch (Token.kind()) {
2783   case MIToken::kw_volatile:
2784     Flags |= MachineMemOperand::MOVolatile;
2785     break;
2786   case MIToken::kw_non_temporal:
2787     Flags |= MachineMemOperand::MONonTemporal;
2788     break;
2789   case MIToken::kw_dereferenceable:
2790     Flags |= MachineMemOperand::MODereferenceable;
2791     break;
2792   case MIToken::kw_invariant:
2793     Flags |= MachineMemOperand::MOInvariant;
2794     break;
2795   case MIToken::StringConstant: {
2796     MachineMemOperand::Flags TF;
2797     if (PFS.Target.getMMOTargetFlag(Token.stringValue(), TF))
2798       return error("use of undefined target MMO flag '" + Token.stringValue() +
2799                    "'");
2800     Flags |= TF;
2801     break;
2802   }
2803   default:
2804     llvm_unreachable("The current token should be a memory operand flag");
2805   }
2806   if (OldFlags == Flags)
2807     // We know that the same flag is specified more than once when the flags
2808     // weren't modified.
2809     return error("duplicate '" + Token.stringValue() + "' memory operand flag");
2810   lex();
2811   return false;
2812 }
2813 
parseMemoryPseudoSourceValue(const PseudoSourceValue * & PSV)2814 bool MIParser::parseMemoryPseudoSourceValue(const PseudoSourceValue *&PSV) {
2815   switch (Token.kind()) {
2816   case MIToken::kw_stack:
2817     PSV = MF.getPSVManager().getStack();
2818     break;
2819   case MIToken::kw_got:
2820     PSV = MF.getPSVManager().getGOT();
2821     break;
2822   case MIToken::kw_jump_table:
2823     PSV = MF.getPSVManager().getJumpTable();
2824     break;
2825   case MIToken::kw_constant_pool:
2826     PSV = MF.getPSVManager().getConstantPool();
2827     break;
2828   case MIToken::FixedStackObject: {
2829     int FI;
2830     if (parseFixedStackFrameIndex(FI))
2831       return true;
2832     PSV = MF.getPSVManager().getFixedStack(FI);
2833     // The token was already consumed, so use return here instead of break.
2834     return false;
2835   }
2836   case MIToken::StackObject: {
2837     int FI;
2838     if (parseStackFrameIndex(FI))
2839       return true;
2840     PSV = MF.getPSVManager().getFixedStack(FI);
2841     // The token was already consumed, so use return here instead of break.
2842     return false;
2843   }
2844   case MIToken::kw_call_entry:
2845     lex();
2846     switch (Token.kind()) {
2847     case MIToken::GlobalValue:
2848     case MIToken::NamedGlobalValue: {
2849       GlobalValue *GV = nullptr;
2850       if (parseGlobalValue(GV))
2851         return true;
2852       PSV = MF.getPSVManager().getGlobalValueCallEntry(GV);
2853       break;
2854     }
2855     case MIToken::ExternalSymbol:
2856       PSV = MF.getPSVManager().getExternalSymbolCallEntry(
2857           MF.createExternalSymbolName(Token.stringValue()));
2858       break;
2859     default:
2860       return error(
2861           "expected a global value or an external symbol after 'call-entry'");
2862     }
2863     break;
2864   case MIToken::kw_custom: {
2865     lex();
2866     const auto *TII = MF.getSubtarget().getInstrInfo();
2867     if (const auto *Formatter = TII->getMIRFormatter()) {
2868       if (Formatter->parseCustomPseudoSourceValue(
2869               Token.stringValue(), MF, PFS, PSV,
2870               [this](StringRef::iterator Loc, const Twine &Msg) -> bool {
2871                 return error(Loc, Msg);
2872               }))
2873         return true;
2874     } else
2875       return error("unable to parse target custom pseudo source value");
2876     break;
2877   }
2878   default:
2879     llvm_unreachable("The current token should be pseudo source value");
2880   }
2881   lex();
2882   return false;
2883 }
2884 
parseMachinePointerInfo(MachinePointerInfo & Dest)2885 bool MIParser::parseMachinePointerInfo(MachinePointerInfo &Dest) {
2886   if (Token.is(MIToken::kw_constant_pool) || Token.is(MIToken::kw_stack) ||
2887       Token.is(MIToken::kw_got) || Token.is(MIToken::kw_jump_table) ||
2888       Token.is(MIToken::FixedStackObject) || Token.is(MIToken::StackObject) ||
2889       Token.is(MIToken::kw_call_entry) || Token.is(MIToken::kw_custom)) {
2890     const PseudoSourceValue *PSV = nullptr;
2891     if (parseMemoryPseudoSourceValue(PSV))
2892       return true;
2893     int64_t Offset = 0;
2894     if (parseOffset(Offset))
2895       return true;
2896     Dest = MachinePointerInfo(PSV, Offset);
2897     return false;
2898   }
2899   if (Token.isNot(MIToken::NamedIRValue) && Token.isNot(MIToken::IRValue) &&
2900       Token.isNot(MIToken::GlobalValue) &&
2901       Token.isNot(MIToken::NamedGlobalValue) &&
2902       Token.isNot(MIToken::QuotedIRValue))
2903     return error("expected an IR value reference");
2904   const Value *V = nullptr;
2905   if (parseIRValue(V))
2906     return true;
2907   if (!V->getType()->isPointerTy())
2908     return error("expected a pointer IR value");
2909   lex();
2910   int64_t Offset = 0;
2911   if (parseOffset(Offset))
2912     return true;
2913   Dest = MachinePointerInfo(V, Offset);
2914   return false;
2915 }
2916 
parseOptionalScope(LLVMContext & Context,SyncScope::ID & SSID)2917 bool MIParser::parseOptionalScope(LLVMContext &Context,
2918                                   SyncScope::ID &SSID) {
2919   SSID = SyncScope::System;
2920   if (Token.is(MIToken::Identifier) && Token.stringValue() == "syncscope") {
2921     lex();
2922     if (expectAndConsume(MIToken::lparen))
2923       return error("expected '(' in syncscope");
2924 
2925     std::string SSN;
2926     if (parseStringConstant(SSN))
2927       return true;
2928 
2929     SSID = Context.getOrInsertSyncScopeID(SSN);
2930     if (expectAndConsume(MIToken::rparen))
2931       return error("expected ')' in syncscope");
2932   }
2933 
2934   return false;
2935 }
2936 
parseOptionalAtomicOrdering(AtomicOrdering & Order)2937 bool MIParser::parseOptionalAtomicOrdering(AtomicOrdering &Order) {
2938   Order = AtomicOrdering::NotAtomic;
2939   if (Token.isNot(MIToken::Identifier))
2940     return false;
2941 
2942   Order = StringSwitch<AtomicOrdering>(Token.stringValue())
2943               .Case("unordered", AtomicOrdering::Unordered)
2944               .Case("monotonic", AtomicOrdering::Monotonic)
2945               .Case("acquire", AtomicOrdering::Acquire)
2946               .Case("release", AtomicOrdering::Release)
2947               .Case("acq_rel", AtomicOrdering::AcquireRelease)
2948               .Case("seq_cst", AtomicOrdering::SequentiallyConsistent)
2949               .Default(AtomicOrdering::NotAtomic);
2950 
2951   if (Order != AtomicOrdering::NotAtomic) {
2952     lex();
2953     return false;
2954   }
2955 
2956   return error("expected an atomic scope, ordering or a size specification");
2957 }
2958 
parseMachineMemoryOperand(MachineMemOperand * & Dest)2959 bool MIParser::parseMachineMemoryOperand(MachineMemOperand *&Dest) {
2960   if (expectAndConsume(MIToken::lparen))
2961     return true;
2962   MachineMemOperand::Flags Flags = MachineMemOperand::MONone;
2963   while (Token.isMemoryOperandFlag()) {
2964     if (parseMemoryOperandFlag(Flags))
2965       return true;
2966   }
2967   if (Token.isNot(MIToken::Identifier) ||
2968       (Token.stringValue() != "load" && Token.stringValue() != "store"))
2969     return error("expected 'load' or 'store' memory operation");
2970   if (Token.stringValue() == "load")
2971     Flags |= MachineMemOperand::MOLoad;
2972   else
2973     Flags |= MachineMemOperand::MOStore;
2974   lex();
2975 
2976   // Optional 'store' for operands that both load and store.
2977   if (Token.is(MIToken::Identifier) && Token.stringValue() == "store") {
2978     Flags |= MachineMemOperand::MOStore;
2979     lex();
2980   }
2981 
2982   // Optional synchronization scope.
2983   SyncScope::ID SSID;
2984   if (parseOptionalScope(MF.getFunction().getContext(), SSID))
2985     return true;
2986 
2987   // Up to two atomic orderings (cmpxchg provides guarantees on failure).
2988   AtomicOrdering Order, FailureOrder;
2989   if (parseOptionalAtomicOrdering(Order))
2990     return true;
2991 
2992   if (parseOptionalAtomicOrdering(FailureOrder))
2993     return true;
2994 
2995   if (Token.isNot(MIToken::IntegerLiteral) &&
2996       Token.isNot(MIToken::kw_unknown_size))
2997     return error("expected the size integer literal or 'unknown-size' after "
2998                  "memory operation");
2999   uint64_t Size;
3000   if (Token.is(MIToken::IntegerLiteral)) {
3001     if (getUint64(Size))
3002       return true;
3003   } else if (Token.is(MIToken::kw_unknown_size)) {
3004     Size = MemoryLocation::UnknownSize;
3005   }
3006   lex();
3007 
3008   MachinePointerInfo Ptr = MachinePointerInfo();
3009   if (Token.is(MIToken::Identifier)) {
3010     const char *Word =
3011         ((Flags & MachineMemOperand::MOLoad) &&
3012          (Flags & MachineMemOperand::MOStore))
3013             ? "on"
3014             : Flags & MachineMemOperand::MOLoad ? "from" : "into";
3015     if (Token.stringValue() != Word)
3016       return error(Twine("expected '") + Word + "'");
3017     lex();
3018 
3019     if (parseMachinePointerInfo(Ptr))
3020       return true;
3021   }
3022   unsigned BaseAlignment = (Size != MemoryLocation::UnknownSize ? Size : 1);
3023   AAMDNodes AAInfo;
3024   MDNode *Range = nullptr;
3025   while (consumeIfPresent(MIToken::comma)) {
3026     switch (Token.kind()) {
3027     case MIToken::kw_align:
3028       if (parseAlignment(BaseAlignment))
3029         return true;
3030       break;
3031     case MIToken::kw_addrspace:
3032       if (parseAddrspace(Ptr.AddrSpace))
3033         return true;
3034       break;
3035     case MIToken::md_tbaa:
3036       lex();
3037       if (parseMDNode(AAInfo.TBAA))
3038         return true;
3039       break;
3040     case MIToken::md_alias_scope:
3041       lex();
3042       if (parseMDNode(AAInfo.Scope))
3043         return true;
3044       break;
3045     case MIToken::md_noalias:
3046       lex();
3047       if (parseMDNode(AAInfo.NoAlias))
3048         return true;
3049       break;
3050     case MIToken::md_range:
3051       lex();
3052       if (parseMDNode(Range))
3053         return true;
3054       break;
3055     // TODO: Report an error on duplicate metadata nodes.
3056     default:
3057       return error("expected 'align' or '!tbaa' or '!alias.scope' or "
3058                    "'!noalias' or '!range'");
3059     }
3060   }
3061   if (expectAndConsume(MIToken::rparen))
3062     return true;
3063   Dest = MF.getMachineMemOperand(Ptr, Flags, Size, BaseAlignment, AAInfo, Range,
3064                                  SSID, Order, FailureOrder);
3065   return false;
3066 }
3067 
parsePreOrPostInstrSymbol(MCSymbol * & Symbol)3068 bool MIParser::parsePreOrPostInstrSymbol(MCSymbol *&Symbol) {
3069   assert((Token.is(MIToken::kw_pre_instr_symbol) ||
3070           Token.is(MIToken::kw_post_instr_symbol)) &&
3071          "Invalid token for a pre- post-instruction symbol!");
3072   lex();
3073   if (Token.isNot(MIToken::MCSymbol))
3074     return error("expected a symbol after 'pre-instr-symbol'");
3075   Symbol = getOrCreateMCSymbol(Token.stringValue());
3076   lex();
3077   if (Token.isNewlineOrEOF() || Token.is(MIToken::coloncolon) ||
3078       Token.is(MIToken::lbrace))
3079     return false;
3080   if (Token.isNot(MIToken::comma))
3081     return error("expected ',' before the next machine operand");
3082   lex();
3083   return false;
3084 }
3085 
parseHeapAllocMarker(MDNode * & Node)3086 bool MIParser::parseHeapAllocMarker(MDNode *&Node) {
3087   assert(Token.is(MIToken::kw_heap_alloc_marker) &&
3088          "Invalid token for a heap alloc marker!");
3089   lex();
3090   parseMDNode(Node);
3091   if (!Node)
3092     return error("expected a MDNode after 'heap-alloc-marker'");
3093   if (Token.isNewlineOrEOF() || Token.is(MIToken::coloncolon) ||
3094       Token.is(MIToken::lbrace))
3095     return false;
3096   if (Token.isNot(MIToken::comma))
3097     return error("expected ',' before the next machine operand");
3098   lex();
3099   return false;
3100 }
3101 
initSlots2BasicBlocks(const Function & F,DenseMap<unsigned,const BasicBlock * > & Slots2BasicBlocks)3102 static void initSlots2BasicBlocks(
3103     const Function &F,
3104     DenseMap<unsigned, const BasicBlock *> &Slots2BasicBlocks) {
3105   ModuleSlotTracker MST(F.getParent(), /*ShouldInitializeAllMetadata=*/false);
3106   MST.incorporateFunction(F);
3107   for (auto &BB : F) {
3108     if (BB.hasName())
3109       continue;
3110     int Slot = MST.getLocalSlot(&BB);
3111     if (Slot == -1)
3112       continue;
3113     Slots2BasicBlocks.insert(std::make_pair(unsigned(Slot), &BB));
3114   }
3115 }
3116 
getIRBlockFromSlot(unsigned Slot,const DenseMap<unsigned,const BasicBlock * > & Slots2BasicBlocks)3117 static const BasicBlock *getIRBlockFromSlot(
3118     unsigned Slot,
3119     const DenseMap<unsigned, const BasicBlock *> &Slots2BasicBlocks) {
3120   auto BlockInfo = Slots2BasicBlocks.find(Slot);
3121   if (BlockInfo == Slots2BasicBlocks.end())
3122     return nullptr;
3123   return BlockInfo->second;
3124 }
3125 
getIRBlock(unsigned Slot)3126 const BasicBlock *MIParser::getIRBlock(unsigned Slot) {
3127   if (Slots2BasicBlocks.empty())
3128     initSlots2BasicBlocks(MF.getFunction(), Slots2BasicBlocks);
3129   return getIRBlockFromSlot(Slot, Slots2BasicBlocks);
3130 }
3131 
getIRBlock(unsigned Slot,const Function & F)3132 const BasicBlock *MIParser::getIRBlock(unsigned Slot, const Function &F) {
3133   if (&F == &MF.getFunction())
3134     return getIRBlock(Slot);
3135   DenseMap<unsigned, const BasicBlock *> CustomSlots2BasicBlocks;
3136   initSlots2BasicBlocks(F, CustomSlots2BasicBlocks);
3137   return getIRBlockFromSlot(Slot, CustomSlots2BasicBlocks);
3138 }
3139 
getOrCreateMCSymbol(StringRef Name)3140 MCSymbol *MIParser::getOrCreateMCSymbol(StringRef Name) {
3141   // FIXME: Currently we can't recognize temporary or local symbols and call all
3142   // of the appropriate forms to create them. However, this handles basic cases
3143   // well as most of the special aspects are recognized by a prefix on their
3144   // name, and the input names should already be unique. For test cases, keeping
3145   // the symbol name out of the symbol table isn't terribly important.
3146   return MF.getContext().getOrCreateSymbol(Name);
3147 }
3148 
parseStringConstant(std::string & Result)3149 bool MIParser::parseStringConstant(std::string &Result) {
3150   if (Token.isNot(MIToken::StringConstant))
3151     return error("expected string constant");
3152   Result = Token.stringValue();
3153   lex();
3154   return false;
3155 }
3156 
parseMachineBasicBlockDefinitions(PerFunctionMIParsingState & PFS,StringRef Src,SMDiagnostic & Error)3157 bool llvm::parseMachineBasicBlockDefinitions(PerFunctionMIParsingState &PFS,
3158                                              StringRef Src,
3159                                              SMDiagnostic &Error) {
3160   return MIParser(PFS, Error, Src).parseBasicBlockDefinitions(PFS.MBBSlots);
3161 }
3162 
parseMachineInstructions(PerFunctionMIParsingState & PFS,StringRef Src,SMDiagnostic & Error)3163 bool llvm::parseMachineInstructions(PerFunctionMIParsingState &PFS,
3164                                     StringRef Src, SMDiagnostic &Error) {
3165   return MIParser(PFS, Error, Src).parseBasicBlocks();
3166 }
3167 
parseMBBReference(PerFunctionMIParsingState & PFS,MachineBasicBlock * & MBB,StringRef Src,SMDiagnostic & Error)3168 bool llvm::parseMBBReference(PerFunctionMIParsingState &PFS,
3169                              MachineBasicBlock *&MBB, StringRef Src,
3170                              SMDiagnostic &Error) {
3171   return MIParser(PFS, Error, Src).parseStandaloneMBB(MBB);
3172 }
3173 
parseRegisterReference(PerFunctionMIParsingState & PFS,unsigned & Reg,StringRef Src,SMDiagnostic & Error)3174 bool llvm::parseRegisterReference(PerFunctionMIParsingState &PFS,
3175                                   unsigned &Reg, StringRef Src,
3176                                   SMDiagnostic &Error) {
3177   return MIParser(PFS, Error, Src).parseStandaloneRegister(Reg);
3178 }
3179 
parseNamedRegisterReference(PerFunctionMIParsingState & PFS,unsigned & Reg,StringRef Src,SMDiagnostic & Error)3180 bool llvm::parseNamedRegisterReference(PerFunctionMIParsingState &PFS,
3181                                        unsigned &Reg, StringRef Src,
3182                                        SMDiagnostic &Error) {
3183   return MIParser(PFS, Error, Src).parseStandaloneNamedRegister(Reg);
3184 }
3185 
parseVirtualRegisterReference(PerFunctionMIParsingState & PFS,VRegInfo * & Info,StringRef Src,SMDiagnostic & Error)3186 bool llvm::parseVirtualRegisterReference(PerFunctionMIParsingState &PFS,
3187                                          VRegInfo *&Info, StringRef Src,
3188                                          SMDiagnostic &Error) {
3189   return MIParser(PFS, Error, Src).parseStandaloneVirtualRegister(Info);
3190 }
3191 
parseStackObjectReference(PerFunctionMIParsingState & PFS,int & FI,StringRef Src,SMDiagnostic & Error)3192 bool llvm::parseStackObjectReference(PerFunctionMIParsingState &PFS,
3193                                      int &FI, StringRef Src,
3194                                      SMDiagnostic &Error) {
3195   return MIParser(PFS, Error, Src).parseStandaloneStackObject(FI);
3196 }
3197 
parseMDNode(PerFunctionMIParsingState & PFS,MDNode * & Node,StringRef Src,SMDiagnostic & Error)3198 bool llvm::parseMDNode(PerFunctionMIParsingState &PFS,
3199                        MDNode *&Node, StringRef Src, SMDiagnostic &Error) {
3200   return MIParser(PFS, Error, Src).parseStandaloneMDNode(Node);
3201 }
3202 
parseIRValue(StringRef Src,MachineFunction & MF,PerFunctionMIParsingState & PFS,const Value * & V,ErrorCallbackType ErrorCallback)3203 bool MIRFormatter::parseIRValue(StringRef Src, MachineFunction &MF,
3204                                 PerFunctionMIParsingState &PFS, const Value *&V,
3205                                 ErrorCallbackType ErrorCallback) {
3206   MIToken Token;
3207   Src = lexMIToken(Src, Token, [&](StringRef::iterator Loc, const Twine &Msg) {
3208     ErrorCallback(Loc, Msg);
3209   });
3210   V = nullptr;
3211 
3212   return ::parseIRValue(Token, PFS, V, ErrorCallback);
3213 }
3214