27 "Error while parsing %s: unknown record entry (%lu).", BlockName,
34 "Error while parsing %s: malformed record entry (%s).", BlockName,
40 : Stream(Stream), BlockInfo(BlockInfo) {}
126 return malformedRecord(
"BLOCK_REMARK",
"RECORD_REMARK_ARG_WITH_DEBUGLOC");
142 "RECORD_REMARK_ARG_WITHOUT_DEBUGLOC");
158 template <
typename T>
160 const char *BlockName) {
168 "Error while parsing %s: expecting [ENTER_SUBBLOCK, %s, ...].",
169 BlockName, BlockName);
173 "Error while entering %s.", BlockName);
181 switch (Next->Kind) {
188 "Error while parsing %s: expecting records.", BlockName);
199 "Error while parsing %s: unterminated block.", BlockName);
214 std::array<char, 4> Result;
215 for (
unsigned i = 0;
i < 4; ++
i)
219 return R.takeError();
231 "Error while parsing BLOCKINFO_BLOCK: expecting [ENTER_SUBBLOCK, "
232 "BLOCKINFO_BLOCK, ...].");
239 if (!*MaybeBlockInfo)
242 "Error while parsing BLOCKINFO_BLOCK.");
256 switch (Next->Kind) {
259 Result = Next->ID == BlockID;
264 "Unexpected error while parsing bitstream.");
285 "Unknown magic number: expecting %s, got %.4s.",
305 "Expecting META_BLOCK after the BLOCKINFO_BLOCK.");
311 StringRef Buf, std::optional<ParsedStringTable> StrTab,
312 std::optional<StringRef> ExternalFilePrependPath) {
323 StrTab ? std::make_unique<BitstreamRemarkParser>(Buf,
std::move(*StrTab))
324 : std::make_unique<BitstreamRemarkParser>(Buf);
326 if (ExternalFilePrependPath)
327 Parser->ExternalFilePrependPath = std::string(*ExternalFilePrependPath);
334 return make_error<EndOfFileError>();
355 if (
Error E = processCommonMeta(MetaHelper))
360 return processStandaloneMeta(MetaHelper);
362 return processSeparateRemarksFileMeta(MetaHelper);
364 return processSeparateRemarksMetaMeta(MetaHelper);
369 Error BitstreamRemarkParser::processCommonMeta(
376 "Error while parsing BLOCK_META: missing container version.");
383 "Error while parsing BLOCK_META: invalid container type.");
389 "Error while parsing BLOCK_META: missing container type.");
395 std::optional<StringRef> StrTabBuf) {
399 "Error while parsing BLOCK_META: missing string table.");
401 P.StrTab.emplace(*StrTabBuf);
406 std::optional<uint64_t> RemarkVersion) {
410 "Error while parsing BLOCK_META: missing remark version.");
411 P.RemarkVersion = *RemarkVersion;
415 Error BitstreamRemarkParser::processExternalFilePath(
416 std::optional<StringRef> ExternalFilePath) {
417 if (!ExternalFilePath)
420 "Error while parsing BLOCK_META: missing external file path.");
430 if (std::error_code EC = BufferOrErr.
getError())
437 return make_error<EndOfFileError>();
449 if (
Error E = SeparateMetaHelper.parse())
453 if (
Error E = processCommonMeta(SeparateMetaHelper))
459 "Error while parsing external file's BLOCK_META: wrong container "
465 "Error while parsing external file's BLOCK_META: mismatching versions: "
466 "original meta: %lu, external file meta: %lu.",
470 return processSeparateRemarksFileMeta(SeparateMetaHelper);
473 Error BitstreamRemarkParser::processStandaloneMeta(
480 Error BitstreamRemarkParser::processSeparateRemarksFileMeta(
485 Error BitstreamRemarkParser::processSeparateRemarksMetaMeta(
497 return processRemark(RemarkHelper);
502 std::unique_ptr<Remark> Result = std::make_unique<Remark>();
505 if (
StrTab == std::nullopt)
508 "Error while parsing BLOCK_REMARK: missing string table.");
513 "Error while parsing BLOCK_REMARK: missing remark type.");
519 "Error while parsing BLOCK_REMARK: unknown remark type.");
521 R.RemarkType =
static_cast<Type>(*Helper.
Type);
526 "Error while parsing BLOCK_REMARK: missing remark name.");
529 R.RemarkName = *RemarkName;
531 return RemarkName.takeError();
536 "Error while parsing BLOCK_REMARK: missing remark pass.");
546 "Error while parsing BLOCK_REMARK: missing remark function name.");
548 R.FunctionName = *FunctionName;
550 return FunctionName.takeError();
557 R.Loc->SourceFilePath = *SourceFileName;
572 "Error while parsing BLOCK_REMARK: missing key in remark argument.");
576 "Error while parsing BLOCK_REMARK: missing value in remark "
580 R.Args.emplace_back();
583 R.Args.back().Key = *
Key;
585 return Key.takeError();
588 R.Args.back().Val = *
Value;
590 return Value.takeError();
592 if (
Arg.SourceFileNameIdx &&
Arg.SourceLine &&
Arg.SourceColumn) {
595 R.Args.back().Loc.emplace();
596 R.Args.back().Loc->SourceFilePath = *SourceFileName;
597 R.Args.back().Loc->SourceLine = *
Arg.SourceLine;
598 R.Args.back().Loc->SourceColumn = *
Arg.SourceColumn;