1 //===- MIParser.cpp - Machine instructions parser implementation ----------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file implements the parsing of machine instructions. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "MIParser.h" 15 #include "MILexer.h" 16 #include "llvm/ADT/StringMap.h" 17 #include "llvm/AsmParser/Parser.h" 18 #include "llvm/AsmParser/SlotMapping.h" 19 #include "llvm/CodeGen/MachineBasicBlock.h" 20 #include "llvm/CodeGen/MachineFunction.h" 21 #include "llvm/CodeGen/MachineFrameInfo.h" 22 #include "llvm/CodeGen/MachineInstr.h" 23 #include "llvm/CodeGen/MachineInstrBuilder.h" 24 #include "llvm/CodeGen/MachineMemOperand.h" 25 #include "llvm/CodeGen/MachineModuleInfo.h" 26 #include "llvm/IR/Instructions.h" 27 #include "llvm/IR/Constants.h" 28 #include "llvm/IR/Module.h" 29 #include "llvm/IR/ModuleSlotTracker.h" 30 #include "llvm/IR/ValueSymbolTable.h" 31 #include "llvm/Support/raw_ostream.h" 32 #include "llvm/Support/SourceMgr.h" 33 #include "llvm/Target/TargetSubtargetInfo.h" 34 #include "llvm/Target/TargetInstrInfo.h" 35 36 using namespace llvm; 37 38 namespace { 39 40 /// A wrapper struct around the 'MachineOperand' struct that includes a source 41 /// range. 42 struct MachineOperandWithLocation { 43 MachineOperand Operand; 44 StringRef::iterator Begin; 45 StringRef::iterator End; 46 47 MachineOperandWithLocation(const MachineOperand &Operand, 48 StringRef::iterator Begin, StringRef::iterator End) 49 : Operand(Operand), Begin(Begin), End(End) {} 50 }; 51 52 class MIParser { 53 SourceMgr &SM; 54 MachineFunction &MF; 55 SMDiagnostic &Error; 56 StringRef Source, CurrentSource; 57 MIToken Token; 58 const PerFunctionMIParsingState &PFS; 59 /// Maps from indices to unnamed global values and metadata nodes. 60 const SlotMapping &IRSlots; 61 /// Maps from instruction names to op codes. 62 StringMap<unsigned> Names2InstrOpCodes; 63 /// Maps from register names to registers. 64 StringMap<unsigned> Names2Regs; 65 /// Maps from register mask names to register masks. 66 StringMap<const uint32_t *> Names2RegMasks; 67 /// Maps from subregister names to subregister indices. 68 StringMap<unsigned> Names2SubRegIndices; 69 /// Maps from slot numbers to function's unnamed basic blocks. 70 DenseMap<unsigned, const BasicBlock *> Slots2BasicBlocks; 71 /// Maps from target index names to target indices. 72 StringMap<int> Names2TargetIndices; 73 /// Maps from direct target flag names to the direct target flag values. 74 StringMap<unsigned> Names2DirectTargetFlags; 75 76 public: 77 MIParser(SourceMgr &SM, MachineFunction &MF, SMDiagnostic &Error, 78 StringRef Source, const PerFunctionMIParsingState &PFS, 79 const SlotMapping &IRSlots); 80 81 void lex(); 82 83 /// Report an error at the current location with the given message. 84 /// 85 /// This function always return true. 86 bool error(const Twine &Msg); 87 88 /// Report an error at the given location with the given message. 89 /// 90 /// This function always return true. 91 bool error(StringRef::iterator Loc, const Twine &Msg); 92 93 bool parse(MachineInstr *&MI); 94 bool parseStandaloneMBB(MachineBasicBlock *&MBB); 95 bool parseStandaloneNamedRegister(unsigned &Reg); 96 bool parseStandaloneVirtualRegister(unsigned &Reg); 97 bool parseStandaloneIRBlockReference(const BasicBlock *&BB); 98 99 bool parseRegister(unsigned &Reg); 100 bool parseRegisterFlag(unsigned &Flags); 101 bool parseSubRegisterIndex(unsigned &SubReg); 102 bool parseRegisterOperand(MachineOperand &Dest, bool IsDef = false); 103 bool parseImmediateOperand(MachineOperand &Dest); 104 bool parseIRConstant(StringRef::iterator Loc, const Constant *&C); 105 bool parseTypedImmediateOperand(MachineOperand &Dest); 106 bool parseFPImmediateOperand(MachineOperand &Dest); 107 bool parseMBBReference(MachineBasicBlock *&MBB); 108 bool parseMBBOperand(MachineOperand &Dest); 109 bool parseStackObjectOperand(MachineOperand &Dest); 110 bool parseFixedStackFrameIndex(int &FI); 111 bool parseFixedStackObjectOperand(MachineOperand &Dest); 112 bool parseGlobalValue(GlobalValue *&GV); 113 bool parseGlobalAddressOperand(MachineOperand &Dest); 114 bool parseConstantPoolIndexOperand(MachineOperand &Dest); 115 bool parseJumpTableIndexOperand(MachineOperand &Dest); 116 bool parseExternalSymbolOperand(MachineOperand &Dest); 117 bool parseMDNode(MDNode *&Node); 118 bool parseMetadataOperand(MachineOperand &Dest); 119 bool parseCFIOffset(int &Offset); 120 bool parseCFIRegister(unsigned &Reg); 121 bool parseCFIOperand(MachineOperand &Dest); 122 bool parseIRBlock(BasicBlock *&BB, const Function &F); 123 bool parseBlockAddressOperand(MachineOperand &Dest); 124 bool parseTargetIndexOperand(MachineOperand &Dest); 125 bool parseLiveoutRegisterMaskOperand(MachineOperand &Dest); 126 bool parseMachineOperand(MachineOperand &Dest); 127 bool parseMachineOperandAndTargetFlags(MachineOperand &Dest); 128 bool parseOffset(int64_t &Offset); 129 bool parseOperandsOffset(MachineOperand &Op); 130 bool parseIRValue(Value *&V); 131 bool parseMemoryOperandFlag(unsigned &Flags); 132 bool parseMemoryPseudoSourceValue(const PseudoSourceValue *&PSV); 133 bool parseMachinePointerInfo(MachinePointerInfo &Dest); 134 bool parseMachineMemoryOperand(MachineMemOperand *&Dest); 135 136 private: 137 /// Convert the integer literal in the current token into an unsigned integer. 138 /// 139 /// Return true if an error occurred. 140 bool getUnsigned(unsigned &Result); 141 142 /// Convert the integer literal in the current token into an uint64. 143 /// 144 /// Return true if an error occurred. 145 bool getUint64(uint64_t &Result); 146 147 /// If the current token is of the given kind, consume it and return false. 148 /// Otherwise report an error and return true. 149 bool expectAndConsume(MIToken::TokenKind TokenKind); 150 151 void initNames2InstrOpCodes(); 152 153 /// Try to convert an instruction name to an opcode. Return true if the 154 /// instruction name is invalid. 155 bool parseInstrName(StringRef InstrName, unsigned &OpCode); 156 157 bool parseInstruction(unsigned &OpCode, unsigned &Flags); 158 159 bool verifyImplicitOperands(ArrayRef<MachineOperandWithLocation> Operands, 160 const MCInstrDesc &MCID); 161 162 void initNames2Regs(); 163 164 /// Try to convert a register name to a register number. Return true if the 165 /// register name is invalid. 166 bool getRegisterByName(StringRef RegName, unsigned &Reg); 167 168 void initNames2RegMasks(); 169 170 /// Check if the given identifier is a name of a register mask. 171 /// 172 /// Return null if the identifier isn't a register mask. 173 const uint32_t *getRegMask(StringRef Identifier); 174 175 void initNames2SubRegIndices(); 176 177 /// Check if the given identifier is a name of a subregister index. 178 /// 179 /// Return 0 if the name isn't a subregister index class. 180 unsigned getSubRegIndex(StringRef Name); 181 182 const BasicBlock *getIRBlock(unsigned Slot); 183 const BasicBlock *getIRBlock(unsigned Slot, const Function &F); 184 185 void initNames2TargetIndices(); 186 187 /// Try to convert a name of target index to the corresponding target index. 188 /// 189 /// Return true if the name isn't a name of a target index. 190 bool getTargetIndex(StringRef Name, int &Index); 191 192 void initNames2DirectTargetFlags(); 193 194 /// Try to convert a name of a direct target flag to the corresponding 195 /// target flag. 196 /// 197 /// Return true if the name isn't a name of a direct flag. 198 bool getDirectTargetFlag(StringRef Name, unsigned &Flag); 199 }; 200 201 } // end anonymous namespace 202 203 MIParser::MIParser(SourceMgr &SM, MachineFunction &MF, SMDiagnostic &Error, 204 StringRef Source, const PerFunctionMIParsingState &PFS, 205 const SlotMapping &IRSlots) 206 : SM(SM), MF(MF), Error(Error), Source(Source), CurrentSource(Source), 207 PFS(PFS), IRSlots(IRSlots) {} 208 209 void MIParser::lex() { 210 CurrentSource = lexMIToken( 211 CurrentSource, Token, 212 [this](StringRef::iterator Loc, const Twine &Msg) { error(Loc, Msg); }); 213 } 214 215 bool MIParser::error(const Twine &Msg) { return error(Token.location(), Msg); } 216 217 bool MIParser::error(StringRef::iterator Loc, const Twine &Msg) { 218 assert(Loc >= Source.data() && Loc <= (Source.data() + Source.size())); 219 Error = SMDiagnostic( 220 SM, SMLoc(), 221 SM.getMemoryBuffer(SM.getMainFileID())->getBufferIdentifier(), 1, 222 Loc - Source.data(), SourceMgr::DK_Error, Msg.str(), Source, None, None); 223 return true; 224 } 225 226 static const char *toString(MIToken::TokenKind TokenKind) { 227 switch (TokenKind) { 228 case MIToken::comma: 229 return "','"; 230 case MIToken::equal: 231 return "'='"; 232 case MIToken::lparen: 233 return "'('"; 234 case MIToken::rparen: 235 return "')'"; 236 default: 237 return "<unknown token>"; 238 } 239 } 240 241 bool MIParser::expectAndConsume(MIToken::TokenKind TokenKind) { 242 if (Token.isNot(TokenKind)) 243 return error(Twine("expected ") + toString(TokenKind)); 244 lex(); 245 return false; 246 } 247 248 bool MIParser::parse(MachineInstr *&MI) { 249 lex(); 250 251 // Parse any register operands before '=' 252 MachineOperand MO = MachineOperand::CreateImm(0); 253 SmallVector<MachineOperandWithLocation, 8> Operands; 254 while (Token.isRegister() || Token.isRegisterFlag()) { 255 auto Loc = Token.location(); 256 if (parseRegisterOperand(MO, /*IsDef=*/true)) 257 return true; 258 Operands.push_back(MachineOperandWithLocation(MO, Loc, Token.location())); 259 if (Token.isNot(MIToken::comma)) 260 break; 261 lex(); 262 } 263 if (!Operands.empty() && expectAndConsume(MIToken::equal)) 264 return true; 265 266 unsigned OpCode, Flags = 0; 267 if (Token.isError() || parseInstruction(OpCode, Flags)) 268 return true; 269 270 // TODO: Parse the bundle instruction flags. 271 272 // Parse the remaining machine operands. 273 while (Token.isNot(MIToken::Eof) && Token.isNot(MIToken::kw_debug_location) && 274 Token.isNot(MIToken::coloncolon)) { 275 auto Loc = Token.location(); 276 if (parseMachineOperandAndTargetFlags(MO)) 277 return true; 278 Operands.push_back(MachineOperandWithLocation(MO, Loc, Token.location())); 279 if (Token.is(MIToken::Eof) || Token.is(MIToken::coloncolon)) 280 break; 281 if (Token.isNot(MIToken::comma)) 282 return error("expected ',' before the next machine operand"); 283 lex(); 284 } 285 286 DebugLoc DebugLocation; 287 if (Token.is(MIToken::kw_debug_location)) { 288 lex(); 289 if (Token.isNot(MIToken::exclaim)) 290 return error("expected a metadata node after 'debug-location'"); 291 MDNode *Node = nullptr; 292 if (parseMDNode(Node)) 293 return true; 294 DebugLocation = DebugLoc(Node); 295 } 296 297 // Parse the machine memory operands. 298 SmallVector<MachineMemOperand *, 2> MemOperands; 299 if (Token.is(MIToken::coloncolon)) { 300 lex(); 301 while (Token.isNot(MIToken::Eof)) { 302 MachineMemOperand *MemOp = nullptr; 303 if (parseMachineMemoryOperand(MemOp)) 304 return true; 305 MemOperands.push_back(MemOp); 306 if (Token.is(MIToken::Eof)) 307 break; 308 if (Token.isNot(MIToken::comma)) 309 return error("expected ',' before the next machine memory operand"); 310 lex(); 311 } 312 } 313 314 const auto &MCID = MF.getSubtarget().getInstrInfo()->get(OpCode); 315 if (!MCID.isVariadic()) { 316 // FIXME: Move the implicit operand verification to the machine verifier. 317 if (verifyImplicitOperands(Operands, MCID)) 318 return true; 319 } 320 321 // TODO: Check for extraneous machine operands. 322 MI = MF.CreateMachineInstr(MCID, DebugLocation, /*NoImplicit=*/true); 323 MI->setFlags(Flags); 324 for (const auto &Operand : Operands) 325 MI->addOperand(MF, Operand.Operand); 326 if (MemOperands.empty()) 327 return false; 328 MachineInstr::mmo_iterator MemRefs = 329 MF.allocateMemRefsArray(MemOperands.size()); 330 std::copy(MemOperands.begin(), MemOperands.end(), MemRefs); 331 MI->setMemRefs(MemRefs, MemRefs + MemOperands.size()); 332 return false; 333 } 334 335 bool MIParser::parseStandaloneMBB(MachineBasicBlock *&MBB) { 336 lex(); 337 if (Token.isNot(MIToken::MachineBasicBlock)) 338 return error("expected a machine basic block reference"); 339 if (parseMBBReference(MBB)) 340 return true; 341 lex(); 342 if (Token.isNot(MIToken::Eof)) 343 return error( 344 "expected end of string after the machine basic block reference"); 345 return false; 346 } 347 348 bool MIParser::parseStandaloneNamedRegister(unsigned &Reg) { 349 lex(); 350 if (Token.isNot(MIToken::NamedRegister)) 351 return error("expected a named register"); 352 if (parseRegister(Reg)) 353 return 0; 354 lex(); 355 if (Token.isNot(MIToken::Eof)) 356 return error("expected end of string after the register reference"); 357 return false; 358 } 359 360 bool MIParser::parseStandaloneVirtualRegister(unsigned &Reg) { 361 lex(); 362 if (Token.isNot(MIToken::VirtualRegister)) 363 return error("expected a virtual register"); 364 if (parseRegister(Reg)) 365 return 0; 366 lex(); 367 if (Token.isNot(MIToken::Eof)) 368 return error("expected end of string after the register reference"); 369 return false; 370 } 371 372 bool MIParser::parseStandaloneIRBlockReference(const BasicBlock *&BB) { 373 lex(); 374 if (Token.isNot(MIToken::IRBlock)) 375 return error("expected an IR block reference"); 376 unsigned SlotNumber = 0; 377 if (getUnsigned(SlotNumber)) 378 return true; 379 BB = getIRBlock(SlotNumber); 380 if (!BB) 381 return error(Twine("use of undefined IR block '%ir-block.") + 382 Twine(SlotNumber) + "'"); 383 lex(); 384 if (Token.isNot(MIToken::Eof)) 385 return error("expected end of string after the IR block reference"); 386 return false; 387 } 388 389 static const char *printImplicitRegisterFlag(const MachineOperand &MO) { 390 assert(MO.isImplicit()); 391 return MO.isDef() ? "implicit-def" : "implicit"; 392 } 393 394 static std::string getRegisterName(const TargetRegisterInfo *TRI, 395 unsigned Reg) { 396 assert(TargetRegisterInfo::isPhysicalRegister(Reg) && "expected phys reg"); 397 return StringRef(TRI->getName(Reg)).lower(); 398 } 399 400 bool MIParser::verifyImplicitOperands( 401 ArrayRef<MachineOperandWithLocation> Operands, const MCInstrDesc &MCID) { 402 if (MCID.isCall()) 403 // We can't verify call instructions as they can contain arbitrary implicit 404 // register and register mask operands. 405 return false; 406 407 // Gather all the expected implicit operands. 408 SmallVector<MachineOperand, 4> ImplicitOperands; 409 if (MCID.ImplicitDefs) 410 for (const uint16_t *ImpDefs = MCID.getImplicitDefs(); *ImpDefs; ++ImpDefs) 411 ImplicitOperands.push_back( 412 MachineOperand::CreateReg(*ImpDefs, true, true)); 413 if (MCID.ImplicitUses) 414 for (const uint16_t *ImpUses = MCID.getImplicitUses(); *ImpUses; ++ImpUses) 415 ImplicitOperands.push_back( 416 MachineOperand::CreateReg(*ImpUses, false, true)); 417 418 const auto *TRI = MF.getSubtarget().getRegisterInfo(); 419 assert(TRI && "Expected target register info"); 420 size_t I = ImplicitOperands.size(), J = Operands.size(); 421 while (I) { 422 --I; 423 if (J) { 424 --J; 425 const auto &ImplicitOperand = ImplicitOperands[I]; 426 const auto &Operand = Operands[J].Operand; 427 if (ImplicitOperand.isIdenticalTo(Operand)) 428 continue; 429 if (Operand.isReg() && Operand.isImplicit()) { 430 return error(Operands[J].Begin, 431 Twine("expected an implicit register operand '") + 432 printImplicitRegisterFlag(ImplicitOperand) + " %" + 433 getRegisterName(TRI, ImplicitOperand.getReg()) + "'"); 434 } 435 } 436 // TODO: Fix source location when Operands[J].end is right before '=', i.e: 437 // insead of reporting an error at this location: 438 // %eax = MOV32r0 439 // ^ 440 // report the error at the following location: 441 // %eax = MOV32r0 442 // ^ 443 return error(J < Operands.size() ? Operands[J].End : Token.location(), 444 Twine("missing implicit register operand '") + 445 printImplicitRegisterFlag(ImplicitOperands[I]) + " %" + 446 getRegisterName(TRI, ImplicitOperands[I].getReg()) + "'"); 447 } 448 return false; 449 } 450 451 bool MIParser::parseInstruction(unsigned &OpCode, unsigned &Flags) { 452 if (Token.is(MIToken::kw_frame_setup)) { 453 Flags |= MachineInstr::FrameSetup; 454 lex(); 455 } 456 if (Token.isNot(MIToken::Identifier)) 457 return error("expected a machine instruction"); 458 StringRef InstrName = Token.stringValue(); 459 if (parseInstrName(InstrName, OpCode)) 460 return error(Twine("unknown machine instruction name '") + InstrName + "'"); 461 lex(); 462 return false; 463 } 464 465 bool MIParser::parseRegister(unsigned &Reg) { 466 switch (Token.kind()) { 467 case MIToken::underscore: 468 Reg = 0; 469 break; 470 case MIToken::NamedRegister: { 471 StringRef Name = Token.stringValue(); 472 if (getRegisterByName(Name, Reg)) 473 return error(Twine("unknown register name '") + Name + "'"); 474 break; 475 } 476 case MIToken::VirtualRegister: { 477 unsigned ID; 478 if (getUnsigned(ID)) 479 return true; 480 const auto RegInfo = PFS.VirtualRegisterSlots.find(ID); 481 if (RegInfo == PFS.VirtualRegisterSlots.end()) 482 return error(Twine("use of undefined virtual register '%") + Twine(ID) + 483 "'"); 484 Reg = RegInfo->second; 485 break; 486 } 487 // TODO: Parse other register kinds. 488 default: 489 llvm_unreachable("The current token should be a register"); 490 } 491 return false; 492 } 493 494 bool MIParser::parseRegisterFlag(unsigned &Flags) { 495 const unsigned OldFlags = Flags; 496 switch (Token.kind()) { 497 case MIToken::kw_implicit: 498 Flags |= RegState::Implicit; 499 break; 500 case MIToken::kw_implicit_define: 501 Flags |= RegState::ImplicitDefine; 502 break; 503 case MIToken::kw_dead: 504 Flags |= RegState::Dead; 505 break; 506 case MIToken::kw_killed: 507 Flags |= RegState::Kill; 508 break; 509 case MIToken::kw_undef: 510 Flags |= RegState::Undef; 511 break; 512 case MIToken::kw_early_clobber: 513 Flags |= RegState::EarlyClobber; 514 break; 515 case MIToken::kw_debug_use: 516 Flags |= RegState::Debug; 517 break; 518 // TODO: parse the other register flags. 519 default: 520 llvm_unreachable("The current token should be a register flag"); 521 } 522 if (OldFlags == Flags) 523 // We know that the same flag is specified more than once when the flags 524 // weren't modified. 525 return error("duplicate '" + Token.stringValue() + "' register flag"); 526 lex(); 527 return false; 528 } 529 530 bool MIParser::parseSubRegisterIndex(unsigned &SubReg) { 531 assert(Token.is(MIToken::colon)); 532 lex(); 533 if (Token.isNot(MIToken::Identifier)) 534 return error("expected a subregister index after ':'"); 535 auto Name = Token.stringValue(); 536 SubReg = getSubRegIndex(Name); 537 if (!SubReg) 538 return error(Twine("use of unknown subregister index '") + Name + "'"); 539 lex(); 540 return false; 541 } 542 543 bool MIParser::parseRegisterOperand(MachineOperand &Dest, bool IsDef) { 544 unsigned Reg; 545 unsigned Flags = IsDef ? RegState::Define : 0; 546 while (Token.isRegisterFlag()) { 547 if (parseRegisterFlag(Flags)) 548 return true; 549 } 550 if (!Token.isRegister()) 551 return error("expected a register after register flags"); 552 if (parseRegister(Reg)) 553 return true; 554 lex(); 555 unsigned SubReg = 0; 556 if (Token.is(MIToken::colon)) { 557 if (parseSubRegisterIndex(SubReg)) 558 return true; 559 } 560 Dest = MachineOperand::CreateReg( 561 Reg, Flags & RegState::Define, Flags & RegState::Implicit, 562 Flags & RegState::Kill, Flags & RegState::Dead, Flags & RegState::Undef, 563 Flags & RegState::EarlyClobber, SubReg, Flags & RegState::Debug); 564 return false; 565 } 566 567 bool MIParser::parseImmediateOperand(MachineOperand &Dest) { 568 assert(Token.is(MIToken::IntegerLiteral)); 569 const APSInt &Int = Token.integerValue(); 570 if (Int.getMinSignedBits() > 64) 571 return error("integer literal is too large to be an immediate operand"); 572 Dest = MachineOperand::CreateImm(Int.getExtValue()); 573 lex(); 574 return false; 575 } 576 577 bool MIParser::parseIRConstant(StringRef::iterator Loc, const Constant *&C) { 578 auto Source = StringRef(Loc, Token.range().end() - Loc).str(); 579 lex(); 580 SMDiagnostic Err; 581 C = parseConstantValue(Source.c_str(), Err, *MF.getFunction()->getParent()); 582 if (!C) 583 return error(Loc + Err.getColumnNo(), Err.getMessage()); 584 return false; 585 } 586 587 bool MIParser::parseTypedImmediateOperand(MachineOperand &Dest) { 588 assert(Token.is(MIToken::IntegerType)); 589 auto Loc = Token.location(); 590 lex(); 591 if (Token.isNot(MIToken::IntegerLiteral)) 592 return error("expected an integer literal"); 593 const Constant *C = nullptr; 594 if (parseIRConstant(Loc, C)) 595 return true; 596 Dest = MachineOperand::CreateCImm(cast<ConstantInt>(C)); 597 return false; 598 } 599 600 bool MIParser::parseFPImmediateOperand(MachineOperand &Dest) { 601 auto Loc = Token.location(); 602 lex(); 603 if (Token.isNot(MIToken::FloatingPointLiteral)) 604 return error("expected a floating point literal"); 605 const Constant *C = nullptr; 606 if (parseIRConstant(Loc, C)) 607 return true; 608 Dest = MachineOperand::CreateFPImm(cast<ConstantFP>(C)); 609 return false; 610 } 611 612 bool MIParser::getUnsigned(unsigned &Result) { 613 assert(Token.hasIntegerValue() && "Expected a token with an integer value"); 614 const uint64_t Limit = uint64_t(std::numeric_limits<unsigned>::max()) + 1; 615 uint64_t Val64 = Token.integerValue().getLimitedValue(Limit); 616 if (Val64 == Limit) 617 return error("expected 32-bit integer (too large)"); 618 Result = Val64; 619 return false; 620 } 621 622 bool MIParser::parseMBBReference(MachineBasicBlock *&MBB) { 623 assert(Token.is(MIToken::MachineBasicBlock)); 624 unsigned Number; 625 if (getUnsigned(Number)) 626 return true; 627 auto MBBInfo = PFS.MBBSlots.find(Number); 628 if (MBBInfo == PFS.MBBSlots.end()) 629 return error(Twine("use of undefined machine basic block #") + 630 Twine(Number)); 631 MBB = MBBInfo->second; 632 if (!Token.stringValue().empty() && Token.stringValue() != MBB->getName()) 633 return error(Twine("the name of machine basic block #") + Twine(Number) + 634 " isn't '" + Token.stringValue() + "'"); 635 return false; 636 } 637 638 bool MIParser::parseMBBOperand(MachineOperand &Dest) { 639 MachineBasicBlock *MBB; 640 if (parseMBBReference(MBB)) 641 return true; 642 Dest = MachineOperand::CreateMBB(MBB); 643 lex(); 644 return false; 645 } 646 647 bool MIParser::parseStackObjectOperand(MachineOperand &Dest) { 648 assert(Token.is(MIToken::StackObject)); 649 unsigned ID; 650 if (getUnsigned(ID)) 651 return true; 652 auto ObjectInfo = PFS.StackObjectSlots.find(ID); 653 if (ObjectInfo == PFS.StackObjectSlots.end()) 654 return error(Twine("use of undefined stack object '%stack.") + Twine(ID) + 655 "'"); 656 StringRef Name; 657 if (const auto *Alloca = 658 MF.getFrameInfo()->getObjectAllocation(ObjectInfo->second)) 659 Name = Alloca->getName(); 660 if (!Token.stringValue().empty() && Token.stringValue() != Name) 661 return error(Twine("the name of the stack object '%stack.") + Twine(ID) + 662 "' isn't '" + Token.stringValue() + "'"); 663 lex(); 664 Dest = MachineOperand::CreateFI(ObjectInfo->second); 665 return false; 666 } 667 668 bool MIParser::parseFixedStackFrameIndex(int &FI) { 669 assert(Token.is(MIToken::FixedStackObject)); 670 unsigned ID; 671 if (getUnsigned(ID)) 672 return true; 673 auto ObjectInfo = PFS.FixedStackObjectSlots.find(ID); 674 if (ObjectInfo == PFS.FixedStackObjectSlots.end()) 675 return error(Twine("use of undefined fixed stack object '%fixed-stack.") + 676 Twine(ID) + "'"); 677 lex(); 678 FI = ObjectInfo->second; 679 return false; 680 } 681 682 bool MIParser::parseFixedStackObjectOperand(MachineOperand &Dest) { 683 int FI; 684 if (parseFixedStackFrameIndex(FI)) 685 return true; 686 Dest = MachineOperand::CreateFI(FI); 687 return false; 688 } 689 690 bool MIParser::parseGlobalValue(GlobalValue *&GV) { 691 switch (Token.kind()) { 692 case MIToken::NamedGlobalValue: { 693 const Module *M = MF.getFunction()->getParent(); 694 GV = M->getNamedValue(Token.stringValue()); 695 if (!GV) 696 return error(Twine("use of undefined global value '") + Token.range() + 697 "'"); 698 break; 699 } 700 case MIToken::GlobalValue: { 701 unsigned GVIdx; 702 if (getUnsigned(GVIdx)) 703 return true; 704 if (GVIdx >= IRSlots.GlobalValues.size()) 705 return error(Twine("use of undefined global value '@") + Twine(GVIdx) + 706 "'"); 707 GV = IRSlots.GlobalValues[GVIdx]; 708 break; 709 } 710 default: 711 llvm_unreachable("The current token should be a global value"); 712 } 713 return false; 714 } 715 716 bool MIParser::parseGlobalAddressOperand(MachineOperand &Dest) { 717 GlobalValue *GV = nullptr; 718 if (parseGlobalValue(GV)) 719 return true; 720 lex(); 721 Dest = MachineOperand::CreateGA(GV, /*Offset=*/0); 722 if (parseOperandsOffset(Dest)) 723 return true; 724 return false; 725 } 726 727 bool MIParser::parseConstantPoolIndexOperand(MachineOperand &Dest) { 728 assert(Token.is(MIToken::ConstantPoolItem)); 729 unsigned ID; 730 if (getUnsigned(ID)) 731 return true; 732 auto ConstantInfo = PFS.ConstantPoolSlots.find(ID); 733 if (ConstantInfo == PFS.ConstantPoolSlots.end()) 734 return error("use of undefined constant '%const." + Twine(ID) + "'"); 735 lex(); 736 Dest = MachineOperand::CreateCPI(ID, /*Offset=*/0); 737 if (parseOperandsOffset(Dest)) 738 return true; 739 return false; 740 } 741 742 bool MIParser::parseJumpTableIndexOperand(MachineOperand &Dest) { 743 assert(Token.is(MIToken::JumpTableIndex)); 744 unsigned ID; 745 if (getUnsigned(ID)) 746 return true; 747 auto JumpTableEntryInfo = PFS.JumpTableSlots.find(ID); 748 if (JumpTableEntryInfo == PFS.JumpTableSlots.end()) 749 return error("use of undefined jump table '%jump-table." + Twine(ID) + "'"); 750 lex(); 751 Dest = MachineOperand::CreateJTI(JumpTableEntryInfo->second); 752 return false; 753 } 754 755 bool MIParser::parseExternalSymbolOperand(MachineOperand &Dest) { 756 assert(Token.is(MIToken::ExternalSymbol)); 757 const char *Symbol = MF.createExternalSymbolName(Token.stringValue()); 758 lex(); 759 Dest = MachineOperand::CreateES(Symbol); 760 if (parseOperandsOffset(Dest)) 761 return true; 762 return false; 763 } 764 765 bool MIParser::parseMDNode(MDNode *&Node) { 766 assert(Token.is(MIToken::exclaim)); 767 auto Loc = Token.location(); 768 lex(); 769 if (Token.isNot(MIToken::IntegerLiteral) || Token.integerValue().isSigned()) 770 return error("expected metadata id after '!'"); 771 unsigned ID; 772 if (getUnsigned(ID)) 773 return true; 774 auto NodeInfo = IRSlots.MetadataNodes.find(ID); 775 if (NodeInfo == IRSlots.MetadataNodes.end()) 776 return error(Loc, "use of undefined metadata '!" + Twine(ID) + "'"); 777 lex(); 778 Node = NodeInfo->second.get(); 779 return false; 780 } 781 782 bool MIParser::parseMetadataOperand(MachineOperand &Dest) { 783 MDNode *Node = nullptr; 784 if (parseMDNode(Node)) 785 return true; 786 Dest = MachineOperand::CreateMetadata(Node); 787 return false; 788 } 789 790 bool MIParser::parseCFIOffset(int &Offset) { 791 if (Token.isNot(MIToken::IntegerLiteral)) 792 return error("expected a cfi offset"); 793 if (Token.integerValue().getMinSignedBits() > 32) 794 return error("expected a 32 bit integer (the cfi offset is too large)"); 795 Offset = (int)Token.integerValue().getExtValue(); 796 lex(); 797 return false; 798 } 799 800 bool MIParser::parseCFIRegister(unsigned &Reg) { 801 if (Token.isNot(MIToken::NamedRegister)) 802 return error("expected a cfi register"); 803 unsigned LLVMReg; 804 if (parseRegister(LLVMReg)) 805 return true; 806 const auto *TRI = MF.getSubtarget().getRegisterInfo(); 807 assert(TRI && "Expected target register info"); 808 int DwarfReg = TRI->getDwarfRegNum(LLVMReg, true); 809 if (DwarfReg < 0) 810 return error("invalid DWARF register"); 811 Reg = (unsigned)DwarfReg; 812 lex(); 813 return false; 814 } 815 816 bool MIParser::parseCFIOperand(MachineOperand &Dest) { 817 auto Kind = Token.kind(); 818 lex(); 819 auto &MMI = MF.getMMI(); 820 int Offset; 821 unsigned Reg; 822 unsigned CFIIndex; 823 switch (Kind) { 824 case MIToken::kw_cfi_offset: 825 if (parseCFIRegister(Reg) || expectAndConsume(MIToken::comma) || 826 parseCFIOffset(Offset)) 827 return true; 828 CFIIndex = 829 MMI.addFrameInst(MCCFIInstruction::createOffset(nullptr, Reg, Offset)); 830 break; 831 case MIToken::kw_cfi_def_cfa_register: 832 if (parseCFIRegister(Reg)) 833 return true; 834 CFIIndex = 835 MMI.addFrameInst(MCCFIInstruction::createDefCfaRegister(nullptr, Reg)); 836 break; 837 case MIToken::kw_cfi_def_cfa_offset: 838 if (parseCFIOffset(Offset)) 839 return true; 840 // NB: MCCFIInstruction::createDefCfaOffset negates the offset. 841 CFIIndex = MMI.addFrameInst( 842 MCCFIInstruction::createDefCfaOffset(nullptr, -Offset)); 843 break; 844 case MIToken::kw_cfi_def_cfa: 845 if (parseCFIRegister(Reg) || expectAndConsume(MIToken::comma) || 846 parseCFIOffset(Offset)) 847 return true; 848 // NB: MCCFIInstruction::createDefCfa negates the offset. 849 CFIIndex = 850 MMI.addFrameInst(MCCFIInstruction::createDefCfa(nullptr, Reg, -Offset)); 851 break; 852 default: 853 // TODO: Parse the other CFI operands. 854 llvm_unreachable("The current token should be a cfi operand"); 855 } 856 Dest = MachineOperand::CreateCFIIndex(CFIIndex); 857 return false; 858 } 859 860 bool MIParser::parseIRBlock(BasicBlock *&BB, const Function &F) { 861 switch (Token.kind()) { 862 case MIToken::NamedIRBlock: { 863 BB = dyn_cast_or_null<BasicBlock>( 864 F.getValueSymbolTable().lookup(Token.stringValue())); 865 if (!BB) 866 return error(Twine("use of undefined IR block '") + Token.range() + "'"); 867 break; 868 } 869 case MIToken::IRBlock: { 870 unsigned SlotNumber = 0; 871 if (getUnsigned(SlotNumber)) 872 return true; 873 BB = const_cast<BasicBlock *>(getIRBlock(SlotNumber, F)); 874 if (!BB) 875 return error(Twine("use of undefined IR block '%ir-block.") + 876 Twine(SlotNumber) + "'"); 877 break; 878 } 879 default: 880 llvm_unreachable("The current token should be an IR block reference"); 881 } 882 return false; 883 } 884 885 bool MIParser::parseBlockAddressOperand(MachineOperand &Dest) { 886 assert(Token.is(MIToken::kw_blockaddress)); 887 lex(); 888 if (expectAndConsume(MIToken::lparen)) 889 return true; 890 if (Token.isNot(MIToken::GlobalValue) && 891 Token.isNot(MIToken::NamedGlobalValue)) 892 return error("expected a global value"); 893 GlobalValue *GV = nullptr; 894 if (parseGlobalValue(GV)) 895 return true; 896 auto *F = dyn_cast<Function>(GV); 897 if (!F) 898 return error("expected an IR function reference"); 899 lex(); 900 if (expectAndConsume(MIToken::comma)) 901 return true; 902 BasicBlock *BB = nullptr; 903 if (Token.isNot(MIToken::IRBlock) && Token.isNot(MIToken::NamedIRBlock)) 904 return error("expected an IR block reference"); 905 if (parseIRBlock(BB, *F)) 906 return true; 907 lex(); 908 if (expectAndConsume(MIToken::rparen)) 909 return true; 910 Dest = MachineOperand::CreateBA(BlockAddress::get(F, BB), /*Offset=*/0); 911 if (parseOperandsOffset(Dest)) 912 return true; 913 return false; 914 } 915 916 bool MIParser::parseTargetIndexOperand(MachineOperand &Dest) { 917 assert(Token.is(MIToken::kw_target_index)); 918 lex(); 919 if (expectAndConsume(MIToken::lparen)) 920 return true; 921 if (Token.isNot(MIToken::Identifier)) 922 return error("expected the name of the target index"); 923 int Index = 0; 924 if (getTargetIndex(Token.stringValue(), Index)) 925 return error("use of undefined target index '" + Token.stringValue() + "'"); 926 lex(); 927 if (expectAndConsume(MIToken::rparen)) 928 return true; 929 Dest = MachineOperand::CreateTargetIndex(unsigned(Index), /*Offset=*/0); 930 if (parseOperandsOffset(Dest)) 931 return true; 932 return false; 933 } 934 935 bool MIParser::parseLiveoutRegisterMaskOperand(MachineOperand &Dest) { 936 assert(Token.is(MIToken::kw_liveout)); 937 const auto *TRI = MF.getSubtarget().getRegisterInfo(); 938 assert(TRI && "Expected target register info"); 939 uint32_t *Mask = MF.allocateRegisterMask(TRI->getNumRegs()); 940 lex(); 941 if (expectAndConsume(MIToken::lparen)) 942 return true; 943 while (true) { 944 if (Token.isNot(MIToken::NamedRegister)) 945 return error("expected a named register"); 946 unsigned Reg = 0; 947 if (parseRegister(Reg)) 948 return true; 949 lex(); 950 Mask[Reg / 32] |= 1U << (Reg % 32); 951 // TODO: Report an error if the same register is used more than once. 952 if (Token.isNot(MIToken::comma)) 953 break; 954 lex(); 955 } 956 if (expectAndConsume(MIToken::rparen)) 957 return true; 958 Dest = MachineOperand::CreateRegLiveOut(Mask); 959 return false; 960 } 961 962 bool MIParser::parseMachineOperand(MachineOperand &Dest) { 963 switch (Token.kind()) { 964 case MIToken::kw_implicit: 965 case MIToken::kw_implicit_define: 966 case MIToken::kw_dead: 967 case MIToken::kw_killed: 968 case MIToken::kw_undef: 969 case MIToken::kw_early_clobber: 970 case MIToken::kw_debug_use: 971 case MIToken::underscore: 972 case MIToken::NamedRegister: 973 case MIToken::VirtualRegister: 974 return parseRegisterOperand(Dest); 975 case MIToken::IntegerLiteral: 976 return parseImmediateOperand(Dest); 977 case MIToken::IntegerType: 978 return parseTypedImmediateOperand(Dest); 979 case MIToken::kw_half: 980 case MIToken::kw_float: 981 case MIToken::kw_double: 982 case MIToken::kw_x86_fp80: 983 case MIToken::kw_fp128: 984 case MIToken::kw_ppc_fp128: 985 return parseFPImmediateOperand(Dest); 986 case MIToken::MachineBasicBlock: 987 return parseMBBOperand(Dest); 988 case MIToken::StackObject: 989 return parseStackObjectOperand(Dest); 990 case MIToken::FixedStackObject: 991 return parseFixedStackObjectOperand(Dest); 992 case MIToken::GlobalValue: 993 case MIToken::NamedGlobalValue: 994 return parseGlobalAddressOperand(Dest); 995 case MIToken::ConstantPoolItem: 996 return parseConstantPoolIndexOperand(Dest); 997 case MIToken::JumpTableIndex: 998 return parseJumpTableIndexOperand(Dest); 999 case MIToken::ExternalSymbol: 1000 return parseExternalSymbolOperand(Dest); 1001 case MIToken::exclaim: 1002 return parseMetadataOperand(Dest); 1003 case MIToken::kw_cfi_offset: 1004 case MIToken::kw_cfi_def_cfa_register: 1005 case MIToken::kw_cfi_def_cfa_offset: 1006 case MIToken::kw_cfi_def_cfa: 1007 return parseCFIOperand(Dest); 1008 case MIToken::kw_blockaddress: 1009 return parseBlockAddressOperand(Dest); 1010 case MIToken::kw_target_index: 1011 return parseTargetIndexOperand(Dest); 1012 case MIToken::kw_liveout: 1013 return parseLiveoutRegisterMaskOperand(Dest); 1014 case MIToken::Error: 1015 return true; 1016 case MIToken::Identifier: 1017 if (const auto *RegMask = getRegMask(Token.stringValue())) { 1018 Dest = MachineOperand::CreateRegMask(RegMask); 1019 lex(); 1020 break; 1021 } 1022 // fallthrough 1023 default: 1024 // TODO: parse the other machine operands. 1025 return error("expected a machine operand"); 1026 } 1027 return false; 1028 } 1029 1030 bool MIParser::parseMachineOperandAndTargetFlags(MachineOperand &Dest) { 1031 unsigned TF = 0; 1032 bool HasTargetFlags = false; 1033 if (Token.is(MIToken::kw_target_flags)) { 1034 HasTargetFlags = true; 1035 lex(); 1036 if (expectAndConsume(MIToken::lparen)) 1037 return true; 1038 if (Token.isNot(MIToken::Identifier)) 1039 return error("expected the name of the target flag"); 1040 if (getDirectTargetFlag(Token.stringValue(), TF)) 1041 return error("use of undefined target flag '" + Token.stringValue() + 1042 "'"); 1043 lex(); 1044 // TODO: Parse target's bit target flags. 1045 if (expectAndConsume(MIToken::rparen)) 1046 return true; 1047 } 1048 auto Loc = Token.location(); 1049 if (parseMachineOperand(Dest)) 1050 return true; 1051 if (!HasTargetFlags) 1052 return false; 1053 if (Dest.isReg()) 1054 return error(Loc, "register operands can't have target flags"); 1055 Dest.setTargetFlags(TF); 1056 return false; 1057 } 1058 1059 bool MIParser::parseOffset(int64_t &Offset) { 1060 if (Token.isNot(MIToken::plus) && Token.isNot(MIToken::minus)) 1061 return false; 1062 StringRef Sign = Token.range(); 1063 bool IsNegative = Token.is(MIToken::minus); 1064 lex(); 1065 if (Token.isNot(MIToken::IntegerLiteral)) 1066 return error("expected an integer literal after '" + Sign + "'"); 1067 if (Token.integerValue().getMinSignedBits() > 64) 1068 return error("expected 64-bit integer (too large)"); 1069 Offset = Token.integerValue().getExtValue(); 1070 if (IsNegative) 1071 Offset = -Offset; 1072 lex(); 1073 return false; 1074 } 1075 1076 bool MIParser::parseOperandsOffset(MachineOperand &Op) { 1077 int64_t Offset = 0; 1078 if (parseOffset(Offset)) 1079 return true; 1080 Op.setOffset(Offset); 1081 return false; 1082 } 1083 1084 bool MIParser::parseIRValue(Value *&V) { 1085 switch (Token.kind()) { 1086 case MIToken::NamedIRValue: { 1087 V = MF.getFunction()->getValueSymbolTable().lookup(Token.stringValue()); 1088 if (!V) 1089 V = MF.getFunction()->getParent()->getValueSymbolTable().lookup( 1090 Token.stringValue()); 1091 if (!V) 1092 return error(Twine("use of undefined IR value '") + Token.range() + "'"); 1093 break; 1094 } 1095 // TODO: Parse unnamed IR value references. 1096 default: 1097 llvm_unreachable("The current token should be an IR block reference"); 1098 } 1099 return false; 1100 } 1101 1102 bool MIParser::getUint64(uint64_t &Result) { 1103 assert(Token.hasIntegerValue()); 1104 if (Token.integerValue().getActiveBits() > 64) 1105 return error("expected 64-bit integer (too large)"); 1106 Result = Token.integerValue().getZExtValue(); 1107 return false; 1108 } 1109 1110 bool MIParser::parseMemoryOperandFlag(unsigned &Flags) { 1111 const unsigned OldFlags = Flags; 1112 switch (Token.kind()) { 1113 case MIToken::kw_volatile: 1114 Flags |= MachineMemOperand::MOVolatile; 1115 break; 1116 case MIToken::kw_non_temporal: 1117 Flags |= MachineMemOperand::MONonTemporal; 1118 break; 1119 case MIToken::kw_invariant: 1120 Flags |= MachineMemOperand::MOInvariant; 1121 break; 1122 // TODO: parse the target specific memory operand flags. 1123 default: 1124 llvm_unreachable("The current token should be a memory operand flag"); 1125 } 1126 if (OldFlags == Flags) 1127 // We know that the same flag is specified more than once when the flags 1128 // weren't modified. 1129 return error("duplicate '" + Token.stringValue() + "' memory operand flag"); 1130 lex(); 1131 return false; 1132 } 1133 1134 bool MIParser::parseMemoryPseudoSourceValue(const PseudoSourceValue *&PSV) { 1135 switch (Token.kind()) { 1136 case MIToken::kw_stack: 1137 PSV = MF.getPSVManager().getStack(); 1138 break; 1139 case MIToken::kw_got: 1140 PSV = MF.getPSVManager().getGOT(); 1141 break; 1142 case MIToken::kw_jump_table: 1143 PSV = MF.getPSVManager().getJumpTable(); 1144 break; 1145 case MIToken::kw_constant_pool: 1146 PSV = MF.getPSVManager().getConstantPool(); 1147 break; 1148 case MIToken::FixedStackObject: { 1149 int FI; 1150 if (parseFixedStackFrameIndex(FI)) 1151 return true; 1152 PSV = MF.getPSVManager().getFixedStack(FI); 1153 // The token was already consumed, so use return here instead of break. 1154 return false; 1155 } 1156 // TODO: Parse the other pseudo source values. 1157 default: 1158 llvm_unreachable("The current token should be pseudo source value"); 1159 } 1160 lex(); 1161 return false; 1162 } 1163 1164 bool MIParser::parseMachinePointerInfo(MachinePointerInfo &Dest) { 1165 if (Token.is(MIToken::kw_constant_pool) || Token.is(MIToken::kw_stack) || 1166 Token.is(MIToken::kw_got) || Token.is(MIToken::kw_jump_table) || 1167 Token.is(MIToken::FixedStackObject)) { 1168 const PseudoSourceValue *PSV = nullptr; 1169 if (parseMemoryPseudoSourceValue(PSV)) 1170 return true; 1171 int64_t Offset = 0; 1172 if (parseOffset(Offset)) 1173 return true; 1174 Dest = MachinePointerInfo(PSV, Offset); 1175 return false; 1176 } 1177 if (Token.isNot(MIToken::NamedIRValue)) 1178 return error("expected an IR value reference"); 1179 Value *V = nullptr; 1180 if (parseIRValue(V)) 1181 return true; 1182 if (!V->getType()->isPointerTy()) 1183 return error("expected a pointer IR value"); 1184 lex(); 1185 int64_t Offset = 0; 1186 if (parseOffset(Offset)) 1187 return true; 1188 Dest = MachinePointerInfo(V, Offset); 1189 return false; 1190 } 1191 1192 bool MIParser::parseMachineMemoryOperand(MachineMemOperand *&Dest) { 1193 if (expectAndConsume(MIToken::lparen)) 1194 return true; 1195 unsigned Flags = 0; 1196 while (Token.isMemoryOperandFlag()) { 1197 if (parseMemoryOperandFlag(Flags)) 1198 return true; 1199 } 1200 if (Token.isNot(MIToken::Identifier) || 1201 (Token.stringValue() != "load" && Token.stringValue() != "store")) 1202 return error("expected 'load' or 'store' memory operation"); 1203 if (Token.stringValue() == "load") 1204 Flags |= MachineMemOperand::MOLoad; 1205 else 1206 Flags |= MachineMemOperand::MOStore; 1207 lex(); 1208 1209 if (Token.isNot(MIToken::IntegerLiteral)) 1210 return error("expected the size integer literal after memory operation"); 1211 uint64_t Size; 1212 if (getUint64(Size)) 1213 return true; 1214 lex(); 1215 1216 const char *Word = Flags & MachineMemOperand::MOLoad ? "from" : "into"; 1217 if (Token.isNot(MIToken::Identifier) || Token.stringValue() != Word) 1218 return error(Twine("expected '") + Word + "'"); 1219 lex(); 1220 1221 MachinePointerInfo Ptr = MachinePointerInfo(); 1222 if (parseMachinePointerInfo(Ptr)) 1223 return true; 1224 unsigned BaseAlignment = Size; 1225 if (Token.is(MIToken::comma)) { 1226 lex(); 1227 if (Token.isNot(MIToken::kw_align)) 1228 return error("expected 'align'"); 1229 lex(); 1230 if (Token.isNot(MIToken::IntegerLiteral)) 1231 return error("expected an integer literal after 'align'"); 1232 if (getUnsigned(BaseAlignment)) 1233 return true; 1234 lex(); 1235 } 1236 // TODO: Parse the attached metadata nodes. 1237 if (expectAndConsume(MIToken::rparen)) 1238 return true; 1239 Dest = MF.getMachineMemOperand(Ptr, Flags, Size, BaseAlignment); 1240 return false; 1241 } 1242 1243 void MIParser::initNames2InstrOpCodes() { 1244 if (!Names2InstrOpCodes.empty()) 1245 return; 1246 const auto *TII = MF.getSubtarget().getInstrInfo(); 1247 assert(TII && "Expected target instruction info"); 1248 for (unsigned I = 0, E = TII->getNumOpcodes(); I < E; ++I) 1249 Names2InstrOpCodes.insert(std::make_pair(StringRef(TII->getName(I)), I)); 1250 } 1251 1252 bool MIParser::parseInstrName(StringRef InstrName, unsigned &OpCode) { 1253 initNames2InstrOpCodes(); 1254 auto InstrInfo = Names2InstrOpCodes.find(InstrName); 1255 if (InstrInfo == Names2InstrOpCodes.end()) 1256 return true; 1257 OpCode = InstrInfo->getValue(); 1258 return false; 1259 } 1260 1261 void MIParser::initNames2Regs() { 1262 if (!Names2Regs.empty()) 1263 return; 1264 // The '%noreg' register is the register 0. 1265 Names2Regs.insert(std::make_pair("noreg", 0)); 1266 const auto *TRI = MF.getSubtarget().getRegisterInfo(); 1267 assert(TRI && "Expected target register info"); 1268 for (unsigned I = 0, E = TRI->getNumRegs(); I < E; ++I) { 1269 bool WasInserted = 1270 Names2Regs.insert(std::make_pair(StringRef(TRI->getName(I)).lower(), I)) 1271 .second; 1272 (void)WasInserted; 1273 assert(WasInserted && "Expected registers to be unique case-insensitively"); 1274 } 1275 } 1276 1277 bool MIParser::getRegisterByName(StringRef RegName, unsigned &Reg) { 1278 initNames2Regs(); 1279 auto RegInfo = Names2Regs.find(RegName); 1280 if (RegInfo == Names2Regs.end()) 1281 return true; 1282 Reg = RegInfo->getValue(); 1283 return false; 1284 } 1285 1286 void MIParser::initNames2RegMasks() { 1287 if (!Names2RegMasks.empty()) 1288 return; 1289 const auto *TRI = MF.getSubtarget().getRegisterInfo(); 1290 assert(TRI && "Expected target register info"); 1291 ArrayRef<const uint32_t *> RegMasks = TRI->getRegMasks(); 1292 ArrayRef<const char *> RegMaskNames = TRI->getRegMaskNames(); 1293 assert(RegMasks.size() == RegMaskNames.size()); 1294 for (size_t I = 0, E = RegMasks.size(); I < E; ++I) 1295 Names2RegMasks.insert( 1296 std::make_pair(StringRef(RegMaskNames[I]).lower(), RegMasks[I])); 1297 } 1298 1299 const uint32_t *MIParser::getRegMask(StringRef Identifier) { 1300 initNames2RegMasks(); 1301 auto RegMaskInfo = Names2RegMasks.find(Identifier); 1302 if (RegMaskInfo == Names2RegMasks.end()) 1303 return nullptr; 1304 return RegMaskInfo->getValue(); 1305 } 1306 1307 void MIParser::initNames2SubRegIndices() { 1308 if (!Names2SubRegIndices.empty()) 1309 return; 1310 const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo(); 1311 for (unsigned I = 1, E = TRI->getNumSubRegIndices(); I < E; ++I) 1312 Names2SubRegIndices.insert( 1313 std::make_pair(StringRef(TRI->getSubRegIndexName(I)).lower(), I)); 1314 } 1315 1316 unsigned MIParser::getSubRegIndex(StringRef Name) { 1317 initNames2SubRegIndices(); 1318 auto SubRegInfo = Names2SubRegIndices.find(Name); 1319 if (SubRegInfo == Names2SubRegIndices.end()) 1320 return 0; 1321 return SubRegInfo->getValue(); 1322 } 1323 1324 static void initSlots2BasicBlocks( 1325 const Function &F, 1326 DenseMap<unsigned, const BasicBlock *> &Slots2BasicBlocks) { 1327 ModuleSlotTracker MST(F.getParent(), /*ShouldInitializeAllMetadata=*/false); 1328 MST.incorporateFunction(F); 1329 for (auto &BB : F) { 1330 if (BB.hasName()) 1331 continue; 1332 int Slot = MST.getLocalSlot(&BB); 1333 if (Slot == -1) 1334 continue; 1335 Slots2BasicBlocks.insert(std::make_pair(unsigned(Slot), &BB)); 1336 } 1337 } 1338 1339 static const BasicBlock *getIRBlockFromSlot( 1340 unsigned Slot, 1341 const DenseMap<unsigned, const BasicBlock *> &Slots2BasicBlocks) { 1342 auto BlockInfo = Slots2BasicBlocks.find(Slot); 1343 if (BlockInfo == Slots2BasicBlocks.end()) 1344 return nullptr; 1345 return BlockInfo->second; 1346 } 1347 1348 const BasicBlock *MIParser::getIRBlock(unsigned Slot) { 1349 if (Slots2BasicBlocks.empty()) 1350 initSlots2BasicBlocks(*MF.getFunction(), Slots2BasicBlocks); 1351 return getIRBlockFromSlot(Slot, Slots2BasicBlocks); 1352 } 1353 1354 const BasicBlock *MIParser::getIRBlock(unsigned Slot, const Function &F) { 1355 if (&F == MF.getFunction()) 1356 return getIRBlock(Slot); 1357 DenseMap<unsigned, const BasicBlock *> CustomSlots2BasicBlocks; 1358 initSlots2BasicBlocks(F, CustomSlots2BasicBlocks); 1359 return getIRBlockFromSlot(Slot, CustomSlots2BasicBlocks); 1360 } 1361 1362 void MIParser::initNames2TargetIndices() { 1363 if (!Names2TargetIndices.empty()) 1364 return; 1365 const auto *TII = MF.getSubtarget().getInstrInfo(); 1366 assert(TII && "Expected target instruction info"); 1367 auto Indices = TII->getSerializableTargetIndices(); 1368 for (const auto &I : Indices) 1369 Names2TargetIndices.insert(std::make_pair(StringRef(I.second), I.first)); 1370 } 1371 1372 bool MIParser::getTargetIndex(StringRef Name, int &Index) { 1373 initNames2TargetIndices(); 1374 auto IndexInfo = Names2TargetIndices.find(Name); 1375 if (IndexInfo == Names2TargetIndices.end()) 1376 return true; 1377 Index = IndexInfo->second; 1378 return false; 1379 } 1380 1381 void MIParser::initNames2DirectTargetFlags() { 1382 if (!Names2DirectTargetFlags.empty()) 1383 return; 1384 const auto *TII = MF.getSubtarget().getInstrInfo(); 1385 assert(TII && "Expected target instruction info"); 1386 auto Flags = TII->getSerializableDirectMachineOperandTargetFlags(); 1387 for (const auto &I : Flags) 1388 Names2DirectTargetFlags.insert( 1389 std::make_pair(StringRef(I.second), I.first)); 1390 } 1391 1392 bool MIParser::getDirectTargetFlag(StringRef Name, unsigned &Flag) { 1393 initNames2DirectTargetFlags(); 1394 auto FlagInfo = Names2DirectTargetFlags.find(Name); 1395 if (FlagInfo == Names2DirectTargetFlags.end()) 1396 return true; 1397 Flag = FlagInfo->second; 1398 return false; 1399 } 1400 1401 bool llvm::parseMachineInstr(MachineInstr *&MI, SourceMgr &SM, 1402 MachineFunction &MF, StringRef Src, 1403 const PerFunctionMIParsingState &PFS, 1404 const SlotMapping &IRSlots, SMDiagnostic &Error) { 1405 return MIParser(SM, MF, Error, Src, PFS, IRSlots).parse(MI); 1406 } 1407 1408 bool llvm::parseMBBReference(MachineBasicBlock *&MBB, SourceMgr &SM, 1409 MachineFunction &MF, StringRef Src, 1410 const PerFunctionMIParsingState &PFS, 1411 const SlotMapping &IRSlots, SMDiagnostic &Error) { 1412 return MIParser(SM, MF, Error, Src, PFS, IRSlots).parseStandaloneMBB(MBB); 1413 } 1414 1415 bool llvm::parseNamedRegisterReference(unsigned &Reg, SourceMgr &SM, 1416 MachineFunction &MF, StringRef Src, 1417 const PerFunctionMIParsingState &PFS, 1418 const SlotMapping &IRSlots, 1419 SMDiagnostic &Error) { 1420 return MIParser(SM, MF, Error, Src, PFS, IRSlots) 1421 .parseStandaloneNamedRegister(Reg); 1422 } 1423 1424 bool llvm::parseVirtualRegisterReference(unsigned &Reg, SourceMgr &SM, 1425 MachineFunction &MF, StringRef Src, 1426 const PerFunctionMIParsingState &PFS, 1427 const SlotMapping &IRSlots, 1428 SMDiagnostic &Error) { 1429 return MIParser(SM, MF, Error, Src, PFS, IRSlots) 1430 .parseStandaloneVirtualRegister(Reg); 1431 } 1432 1433 bool llvm::parseIRBlockReference(const BasicBlock *&BB, SourceMgr &SM, 1434 MachineFunction &MF, StringRef Src, 1435 const PerFunctionMIParsingState &PFS, 1436 const SlotMapping &IRSlots, 1437 SMDiagnostic &Error) { 1438 return MIParser(SM, MF, Error, Src, PFS, IRSlots) 1439 .parseStandaloneIRBlockReference(BB); 1440 } 1441