26 "Error while parsing %s: unknown record entry (%lu).", BlockName,
33 "Error while parsing %s: malformed record entry (%s).", BlockName,
39 : Stream(Stream), BlockInfo(BlockInfo) {}
125 return malformedRecord(
"BLOCK_REMARK",
"RECORD_REMARK_ARG_WITH_DEBUGLOC");
141 "RECORD_REMARK_ARG_WITHOUT_DEBUGLOC");
157 template <
typename T>
159 const char *BlockName) {
167 "Error while parsing %s: expecting [ENTER_SUBBLOCK, %s, ...].",
168 BlockName, BlockName);
169 if (Stream.EnterSubBlock(BlockID))
172 "Error while entering %s.", BlockName);
176 while (!Stream.AtEndOfStream()) {
177 Next = Stream.advance();
180 switch (Next->Kind) {
187 "Error while parsing %s: expecting records.", BlockName);
198 "Error while parsing %s: unterminated block.", BlockName);
213 std::array<char, 4> Result;
214 for (
unsigned i = 0;
i < 4; ++
i)
218 return R.takeError();
230 "Error while parsing BLOCKINFO_BLOCK: expecting [ENTER_SUBBLOCK, "
231 "BLOCKINFO_BLOCK, ...].");
238 if (!*MaybeBlockInfo)
241 "Error while parsing BLOCKINFO_BLOCK.");
251 uint64_t PreviousBitNo = Stream.GetCurrentBitNo();
255 switch (Next->Kind) {
258 Result = Next->ID == BlockID;
263 "Unexpected error while parsing bitstream.");
268 if (
Error E = Stream.JumpToBit(PreviousBitNo))
284 "Unknown magic number: expecting %s, got %.4s.",
304 "Expecting META_BLOCK after the BLOCKINFO_BLOCK.");
322 StrTab ? std::make_unique<BitstreamRemarkParser>(Buf,
std::move(*StrTab))
323 : std::make_unique<BitstreamRemarkParser>(Buf);
325 if (ExternalFilePrependPath)
326 Parser->ExternalFilePrependPath = std::string(*ExternalFilePrependPath);
333 return make_error<EndOfFileError>();
354 if (
Error E = processCommonMeta(MetaHelper))
359 return processStandaloneMeta(MetaHelper);
361 return processSeparateRemarksFileMeta(MetaHelper);
363 return processSeparateRemarksMetaMeta(MetaHelper);
368 Error BitstreamRemarkParser::processCommonMeta(
375 "Error while parsing BLOCK_META: missing container version.");
382 "Error while parsing BLOCK_META: invalid container type.");
388 "Error while parsing BLOCK_META: missing container type.");
398 "Error while parsing BLOCK_META: missing string table.");
400 P.StrTab.emplace(*StrTabBuf);
409 "Error while parsing BLOCK_META: missing remark version.");
410 P.RemarkVersion = *RemarkVersion;
414 Error BitstreamRemarkParser::processExternalFilePath(
416 if (!ExternalFilePath)
419 "Error while parsing BLOCK_META: missing external file path.");
429 if (std::error_code EC = BufferOrErr.
getError())
436 return make_error<EndOfFileError>();
448 if (
Error E = SeparateMetaHelper.parse())
452 if (
Error E = processCommonMeta(SeparateMetaHelper))
458 "Error while parsing external file's BLOCK_META: wrong container "
464 "Error while parsing external file's BLOCK_META: mismatching versions: "
465 "original meta: %lu, external file meta: %lu.",
469 return processSeparateRemarksFileMeta(SeparateMetaHelper);
472 Error BitstreamRemarkParser::processStandaloneMeta(
479 Error BitstreamRemarkParser::processSeparateRemarksFileMeta(
484 Error BitstreamRemarkParser::processSeparateRemarksMetaMeta(
496 return processRemark(RemarkHelper);
501 std::unique_ptr<Remark> Result = std::make_unique<Remark>();
507 "Error while parsing BLOCK_REMARK: missing string table.");
512 "Error while parsing BLOCK_REMARK: missing remark type.");
518 "Error while parsing BLOCK_REMARK: unknown remark type.");
520 R.RemarkType =
static_cast<Type>(*Helper.
Type);
525 "Error while parsing BLOCK_REMARK: missing remark name.");
528 R.RemarkName = *RemarkName;
530 return RemarkName.takeError();
535 "Error while parsing BLOCK_REMARK: missing remark pass.");
545 "Error while parsing BLOCK_REMARK: missing remark function name.");
547 R.FunctionName = *FunctionName;
549 return FunctionName.takeError();
556 R.Loc->SourceFilePath = *SourceFileName;
571 "Error while parsing BLOCK_REMARK: missing key in remark argument.");
575 "Error while parsing BLOCK_REMARK: missing value in remark "
579 R.Args.emplace_back();
582 R.Args.back().Key = *
Key;
584 return Key.takeError();
587 R.Args.back().Val = *
Value;
589 return Value.takeError();
591 if (
Arg.SourceFileNameIdx &&
Arg.SourceLine &&
Arg.SourceColumn) {
594 R.Args.back().Loc.emplace();
595 R.Args.back().Loc->SourceFilePath = *SourceFileName;
596 R.Args.back().Loc->SourceLine = *
Arg.SourceLine;
597 R.Args.back().Loc->SourceColumn = *
Arg.SourceColumn;