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