bool MIRParserImpl::initializeMachineBasicBlock( MachineFunction &MF, MachineBasicBlock &MBB, const yaml::MachineBasicBlock &YamlMBB, const PerFunctionMIParsingState &PFS) { MBB.setAlignment(YamlMBB.Alignment); if (YamlMBB.AddressTaken) MBB.setHasAddressTaken(); MBB.setIsLandingPad(YamlMBB.IsLandingPad); SMDiagnostic Error; // Parse the successors. for (const auto &MBBSource : YamlMBB.Successors) { MachineBasicBlock *SuccMBB = nullptr; if (parseMBBReference(SuccMBB, MBBSource, MF, PFS)) return true; // TODO: Report an error when adding the same successor more than once. MBB.addSuccessor(SuccMBB); } // Parse the liveins. for (const auto &LiveInSource : YamlMBB.LiveIns) { unsigned Reg = 0; if (parseNamedRegisterReference(Reg, SM, MF, LiveInSource.Value, PFS, IRSlots, Error)) return error(Error, LiveInSource.SourceRange); MBB.addLiveIn(Reg); } // Parse the instructions. for (const auto &MISource : YamlMBB.Instructions) { MachineInstr *MI = nullptr; if (parseMachineInstr(MI, SM, MF, MISource.Value, PFS, IRSlots, Error)) return error(Error, MISource.SourceRange); MBB.insert(MBB.end(), MI); } return false; }
bool MIRParserImpl::initializeMachineBasicBlock( MachineFunction &MF, MachineBasicBlock &MBB, const yaml::MachineBasicBlock &YamlMBB, const DenseMap<unsigned, MachineBasicBlock *> &MBBSlots) { MBB.setAlignment(YamlMBB.Alignment); if (YamlMBB.AddressTaken) MBB.setHasAddressTaken(); MBB.setIsLandingPad(YamlMBB.IsLandingPad); // Parse the instructions. for (const auto &MISource : YamlMBB.Instructions) { SMDiagnostic Error; if (auto *MI = parseMachineInstr(SM, MF, MISource.Value, MBBSlots, IRSlots, Error)) { MBB.insert(MBB.end(), MI); continue; } reportDiagnostic(diagFromMIStringDiag(Error, MISource.SourceRange)); return true; } return false; }