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