CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
349 lines
13 KiB
C++
349 lines
13 KiB
C++
//===- unittest/Support/BitstreamRemarksSerializerTest.cpp ----------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/Bitcode/BitcodeAnalyzer.h"
|
|
#include "llvm/Remarks/Remark.h"
|
|
#include "llvm/Remarks/RemarkSerializer.h"
|
|
#include "llvm/Support/raw_ostream.h"
|
|
#include "gtest/gtest.h"
|
|
#include <optional>
|
|
#include <string>
|
|
|
|
// We need to supprt Windows paths as well. In order to have paths with the same
|
|
// length, use a different path according to the platform.
|
|
#ifdef _WIN32
|
|
#define EXTERNALFILETESTPATH "C:/externalfi"
|
|
#else
|
|
#define EXTERNALFILETESTPATH "/externalfile"
|
|
#endif
|
|
|
|
using namespace llvm;
|
|
|
|
static void checkAnalyze(StringRef Input, StringRef Expected) {
|
|
std::string OutputBuf;
|
|
raw_string_ostream OutputOS(OutputBuf);
|
|
BCDumpOptions O(OutputOS);
|
|
O.ShowBinaryBlobs = true;
|
|
BitcodeAnalyzer BA(Input);
|
|
EXPECT_FALSE(BA.analyze(O)); // Expect no errors.
|
|
EXPECT_EQ(OutputOS.str(), Expected);
|
|
}
|
|
|
|
static void check(const remarks::Remark &R, StringRef ExpectedR,
|
|
std::optional<StringRef> ExpectedMeta = std::nullopt,
|
|
std::optional<remarks::StringTable> StrTab = std::nullopt) {
|
|
// Emit the remark.
|
|
std::string InputBuf;
|
|
raw_string_ostream InputOS(InputBuf);
|
|
Expected<std::unique_ptr<remarks::RemarkSerializer>> MaybeSerializer = [&] {
|
|
if (StrTab)
|
|
return createRemarkSerializer(remarks::Format::Bitstream, InputOS,
|
|
std::move(*StrTab));
|
|
else
|
|
return createRemarkSerializer(remarks::Format::Bitstream, InputOS);
|
|
}();
|
|
EXPECT_FALSE(errorToBool(MaybeSerializer.takeError()));
|
|
std::unique_ptr<remarks::RemarkSerializer> Serializer =
|
|
std::move(*MaybeSerializer);
|
|
Serializer->emit(R);
|
|
Serializer->finalize();
|
|
|
|
// Analyze the serialized remark.
|
|
checkAnalyze(InputOS.str(), ExpectedR);
|
|
|
|
// Analyze the serialized metadata if it's not in standalone mode.
|
|
if (ExpectedMeta) {
|
|
std::string MetaBuf;
|
|
raw_string_ostream MetaOS(MetaBuf);
|
|
std::unique_ptr<remarks::MetaSerializer> MetaSerializer =
|
|
Serializer->metaSerializer(MetaOS, StringRef(EXTERNALFILETESTPATH));
|
|
MetaSerializer->emit();
|
|
checkAnalyze(MetaOS.str(), *ExpectedMeta);
|
|
}
|
|
}
|
|
|
|
TEST(BitstreamRemarkSerializer, SeparateRemarkFileNoOptionals) {
|
|
remarks::Remark R;
|
|
R.RemarkType = remarks::Type::Missed;
|
|
R.PassName = "pass";
|
|
R.RemarkName = "remark";
|
|
R.FunctionName = "function";
|
|
check(R,
|
|
"<BLOCKINFO_BLOCK/>\n"
|
|
"<Meta BlockID=8 NumWords=3 BlockCodeSize=3>\n"
|
|
" <Container info codeid=1 abbrevid=4 op0=1 op1=1/>\n"
|
|
" <Remark version codeid=2 abbrevid=5 op0=0/>\n"
|
|
"</Meta>\n"
|
|
"<Remark BlockID=9 NumWords=1 BlockCodeSize=4>\n"
|
|
" <Remark header codeid=5 abbrevid=4 op0=2 op1=0 op2=1 op3=2/>\n"
|
|
"</Remark>\n"
|
|
"<Meta BlockID=8 NumWords=8 BlockCodeSize=3>\n"
|
|
" <String table codeid=3 abbrevid=6/> blob data = "
|
|
"'remark\\x00pass\\x00function\\x00'\n"
|
|
"</Meta>\n",
|
|
"<BLOCKINFO_BLOCK/>\n"
|
|
"<Meta BlockID=8 NumWords=7 BlockCodeSize=3>\n"
|
|
" <Container info codeid=1 abbrevid=4 op0=1 op1=0/>\n"
|
|
" <External File codeid=4 abbrevid=5/> blob data = "
|
|
"'" EXTERNALFILETESTPATH "'\n"
|
|
"</Meta>\n");
|
|
}
|
|
|
|
TEST(BitstreamRemarkSerializer, SeparateRemarkFileNoOptionalsSeparateStrTab) {
|
|
remarks::StringTable StrTab;
|
|
StrTab.add("function");
|
|
StrTab.add("pass");
|
|
StrTab.add("remark");
|
|
remarks::Remark R;
|
|
R.RemarkType = remarks::Type::Missed;
|
|
R.PassName = "pass";
|
|
R.RemarkName = "remark";
|
|
R.FunctionName = "function";
|
|
check(R,
|
|
"<BLOCKINFO_BLOCK/>\n"
|
|
"<Meta BlockID=8 NumWords=3 BlockCodeSize=3>\n"
|
|
" <Container info codeid=1 abbrevid=4 op0=1 op1=1/>\n"
|
|
" <Remark version codeid=2 abbrevid=5 op0=0/>\n"
|
|
"</Meta>\n"
|
|
"<Remark BlockID=9 NumWords=1 BlockCodeSize=4>\n"
|
|
" <Remark header codeid=5 abbrevid=4 op0=2 op1=2 op2=1 op3=0/>\n"
|
|
"</Remark>\n"
|
|
"<Meta BlockID=8 NumWords=8 BlockCodeSize=3>\n"
|
|
" <String table codeid=3 abbrevid=6/> blob data = "
|
|
"'function\\x00pass\\x00remark\\x00'\n"
|
|
"</Meta>\n",
|
|
"<BLOCKINFO_BLOCK/>\n"
|
|
"<Meta BlockID=8 NumWords=7 BlockCodeSize=3>\n"
|
|
" <Container info codeid=1 abbrevid=4 op0=1 op1=0/>\n"
|
|
" <External File codeid=4 abbrevid=5/> blob data = "
|
|
"'" EXTERNALFILETESTPATH "'\n"
|
|
"</Meta>\n",
|
|
std::move(StrTab));
|
|
}
|
|
|
|
TEST(BitstreamRemarkSerializer, SeparateRemarkFileDebugLoc) {
|
|
remarks::Remark R;
|
|
R.RemarkType = remarks::Type::Missed;
|
|
R.PassName = "pass";
|
|
R.RemarkName = "remark";
|
|
R.FunctionName = "function";
|
|
R.Loc.emplace();
|
|
R.Loc->SourceFilePath = "path";
|
|
R.Loc->SourceLine = 99;
|
|
R.Loc->SourceColumn = 55;
|
|
check(R,
|
|
"<BLOCKINFO_BLOCK/>\n"
|
|
"<Meta BlockID=8 NumWords=3 BlockCodeSize=3>\n"
|
|
" <Container info codeid=1 abbrevid=4 op0=1 op1=1/>\n"
|
|
" <Remark version codeid=2 abbrevid=5 op0=0/>\n"
|
|
"</Meta>\n"
|
|
"<Remark BlockID=9 NumWords=4 BlockCodeSize=4>\n"
|
|
" <Remark header codeid=5 abbrevid=4 op0=2 op1=0 op2=1 op3=2/>\n"
|
|
" <Remark debug location codeid=6 abbrevid=5 op0=3 op1=99 op2=55/>\n"
|
|
"</Remark>\n"
|
|
"<Meta BlockID=8 NumWords=9 BlockCodeSize=3>\n"
|
|
" <String table codeid=3 abbrevid=6/> blob data = "
|
|
"'remark\\x00pass\\x00function\\x00path\\x00'\n"
|
|
"</Meta>\n",
|
|
"<BLOCKINFO_BLOCK/>\n"
|
|
"<Meta BlockID=8 NumWords=7 BlockCodeSize=3>\n"
|
|
" <Container info codeid=1 abbrevid=4 op0=1 op1=0/>\n"
|
|
" <External File codeid=4 abbrevid=5/> blob data = "
|
|
"'" EXTERNALFILETESTPATH "'\n"
|
|
"</Meta>\n");
|
|
}
|
|
|
|
TEST(BitstreamRemarkSerializer, SeparateRemarkFileHotness) {
|
|
remarks::Remark R;
|
|
R.RemarkType = remarks::Type::Missed;
|
|
R.PassName = "pass";
|
|
R.RemarkName = "remark";
|
|
R.FunctionName = "function";
|
|
R.Hotness.emplace(999999999);
|
|
check(R,
|
|
"<BLOCKINFO_BLOCK/>\n"
|
|
"<Meta BlockID=8 NumWords=3 BlockCodeSize=3>\n"
|
|
" <Container info codeid=1 abbrevid=4 op0=1 op1=1/>\n"
|
|
" <Remark version codeid=2 abbrevid=5 op0=0/>\n"
|
|
"</Meta>\n"
|
|
"<Remark BlockID=9 NumWords=3 BlockCodeSize=4>\n"
|
|
" <Remark header codeid=5 abbrevid=4 op0=2 op1=0 op2=1 op3=2/>\n"
|
|
" <Remark hotness codeid=7 abbrevid=6 op0=999999999/>\n"
|
|
"</Remark>\n"
|
|
"<Meta BlockID=8 NumWords=8 BlockCodeSize=3>\n"
|
|
" <String table codeid=3 abbrevid=6/> blob data = "
|
|
"'remark\\x00pass\\x00function\\x00'\n"
|
|
"</Meta>\n",
|
|
"<BLOCKINFO_BLOCK/>\n"
|
|
"<Meta BlockID=8 NumWords=7 BlockCodeSize=3>\n"
|
|
" <Container info codeid=1 abbrevid=4 op0=1 op1=0/>\n"
|
|
" <External File codeid=4 abbrevid=5/> blob data = "
|
|
"'" EXTERNALFILETESTPATH "'\n"
|
|
"</Meta>\n");
|
|
}
|
|
|
|
TEST(BitstreamRemarkSerializer, SeparateRemarkFileArgNoDebugLoc) {
|
|
remarks::Remark R;
|
|
R.RemarkType = remarks::Type::Missed;
|
|
R.PassName = "pass";
|
|
R.RemarkName = "remark";
|
|
R.FunctionName = "function";
|
|
R.Args.emplace_back();
|
|
R.Args.back().Key = "key";
|
|
R.Args.back().Val = "value";
|
|
check(R,
|
|
"<BLOCKINFO_BLOCK/>\n"
|
|
"<Meta BlockID=8 NumWords=3 BlockCodeSize=3>\n"
|
|
" <Container info codeid=1 abbrevid=4 op0=1 op1=1/>\n"
|
|
" <Remark version codeid=2 abbrevid=5 op0=0/>\n"
|
|
"</Meta>\n"
|
|
"<Remark BlockID=9 NumWords=2 BlockCodeSize=4>\n"
|
|
" <Remark header codeid=5 abbrevid=4 op0=2 op1=0 op2=1 op3=2/>\n"
|
|
" <Argument codeid=9 abbrevid=8 op0=3 op1=4/>\n"
|
|
"</Remark>\n"
|
|
"<Meta BlockID=8 NumWords=10 BlockCodeSize=3>\n"
|
|
" <String table codeid=3 abbrevid=6/> blob data = "
|
|
"'remark\\x00pass\\x00function\\x00key\\x00value\\x00'\n"
|
|
"</Meta>\n",
|
|
"<BLOCKINFO_BLOCK/>\n"
|
|
"<Meta BlockID=8 NumWords=7 BlockCodeSize=3>\n"
|
|
" <Container info codeid=1 abbrevid=4 op0=1 op1=0/>\n"
|
|
" <External File codeid=4 abbrevid=5/> blob data = "
|
|
"'" EXTERNALFILETESTPATH "'\n"
|
|
"</Meta>\n");
|
|
}
|
|
|
|
TEST(BitstreamRemarkSerializer, SeparateRemarkFileArgDebugLoc) {
|
|
remarks::Remark R;
|
|
R.RemarkType = remarks::Type::Missed;
|
|
R.PassName = "pass";
|
|
R.RemarkName = "remark";
|
|
R.FunctionName = "function";
|
|
R.Args.emplace_back();
|
|
R.Args.back().Key = "key";
|
|
R.Args.back().Val = "value";
|
|
R.Args.back().Loc.emplace();
|
|
R.Args.back().Loc->SourceFilePath = "path";
|
|
R.Args.back().Loc->SourceLine = 99;
|
|
R.Args.back().Loc->SourceColumn = 55;
|
|
check(R,
|
|
"<BLOCKINFO_BLOCK/>\n"
|
|
"<Meta BlockID=8 NumWords=3 BlockCodeSize=3>\n"
|
|
" <Container info codeid=1 abbrevid=4 op0=1 op1=1/>\n"
|
|
" <Remark version codeid=2 abbrevid=5 op0=0/>\n"
|
|
"</Meta>\n"
|
|
"<Remark BlockID=9 NumWords=4 BlockCodeSize=4>\n"
|
|
" <Remark header codeid=5 abbrevid=4 op0=2 op1=0 op2=1 op3=2/>\n"
|
|
" <Argument with debug location codeid=8 abbrevid=7 op0=3 op1=4 op2=5 "
|
|
"op3=99 op4=55/>\n"
|
|
"</Remark>\n"
|
|
"<Meta BlockID=8 NumWords=11 BlockCodeSize=3>\n"
|
|
" <String table codeid=3 abbrevid=6/> blob data = "
|
|
"'remark\\x00pass\\x00function\\x00key\\x00value\\x00path\\x00'\n"
|
|
"</Meta>\n",
|
|
"<BLOCKINFO_BLOCK/>\n"
|
|
"<Meta BlockID=8 NumWords=7 BlockCodeSize=3>\n"
|
|
" <Container info codeid=1 abbrevid=4 op0=1 op1=0/>\n"
|
|
" <External File codeid=4 abbrevid=5/> blob data = "
|
|
"'" EXTERNALFILETESTPATH "'\n"
|
|
"</Meta>\n");
|
|
}
|
|
|
|
TEST(BitstreamRemarkSerializer, SeparateRemarkFileAll) {
|
|
remarks::Remark R;
|
|
R.RemarkType = remarks::Type::Missed;
|
|
R.PassName = "pass";
|
|
R.RemarkName = "remark";
|
|
R.FunctionName = "function";
|
|
R.Loc.emplace();
|
|
R.Loc->SourceFilePath = "path";
|
|
R.Loc->SourceLine = 99;
|
|
R.Loc->SourceColumn = 55;
|
|
R.Hotness.emplace(999999999);
|
|
R.Args.emplace_back();
|
|
R.Args.back().Key = "key";
|
|
R.Args.back().Val = "value";
|
|
R.Args.back().Loc.emplace();
|
|
R.Args.back().Loc->SourceFilePath = "argpath";
|
|
R.Args.back().Loc->SourceLine = 11;
|
|
R.Args.back().Loc->SourceColumn = 66;
|
|
check(R,
|
|
"<BLOCKINFO_BLOCK/>\n"
|
|
"<Meta BlockID=8 NumWords=3 BlockCodeSize=3>\n"
|
|
" <Container info codeid=1 abbrevid=4 op0=1 op1=1/>\n"
|
|
" <Remark version codeid=2 abbrevid=5 op0=0/>\n"
|
|
"</Meta>\n"
|
|
"<Remark BlockID=9 NumWords=8 BlockCodeSize=4>\n"
|
|
" <Remark header codeid=5 abbrevid=4 op0=2 op1=0 op2=1 op3=2/>\n"
|
|
" <Remark debug location codeid=6 abbrevid=5 op0=3 op1=99 op2=55/>\n"
|
|
" <Remark hotness codeid=7 abbrevid=6 op0=999999999/>\n"
|
|
" <Argument with debug location codeid=8 abbrevid=7 op0=4 op1=5 op2=6 "
|
|
"op3=11 op4=66/>\n"
|
|
"</Remark>\n"
|
|
"<Meta BlockID=8 NumWords=13 BlockCodeSize=3>\n"
|
|
" <String table codeid=3 abbrevid=6/> blob data = "
|
|
"'remark\\x00pass\\x00function\\x00path\\x00key\\x00value\\x00argpa"
|
|
"th\\x00'\n"
|
|
"</Meta>\n",
|
|
"<BLOCKINFO_BLOCK/>\n"
|
|
"<Meta BlockID=8 NumWords=7 BlockCodeSize=3>\n"
|
|
" <Container info codeid=1 abbrevid=4 op0=1 op1=0/>\n"
|
|
" <External File codeid=4 abbrevid=5/> blob data = "
|
|
"'" EXTERNALFILETESTPATH "'\n"
|
|
"</Meta>\n");
|
|
}
|
|
|
|
TEST(BitstreamRemarkSerializer, Standalone) {
|
|
// Pre-populate the string table.
|
|
remarks::StringTable StrTab;
|
|
StrTab.add("pass");
|
|
StrTab.add("remark");
|
|
StrTab.add("function");
|
|
StrTab.add("path");
|
|
StrTab.add("key");
|
|
StrTab.add("value");
|
|
StrTab.add("argpath");
|
|
remarks::Remark R;
|
|
R.RemarkType = remarks::Type::Missed;
|
|
R.PassName = "pass";
|
|
R.RemarkName = "remark";
|
|
R.FunctionName = "function";
|
|
R.Loc.emplace();
|
|
R.Loc->SourceFilePath = "path";
|
|
R.Loc->SourceLine = 99;
|
|
R.Loc->SourceColumn = 55;
|
|
R.Hotness.emplace(999999999);
|
|
R.Args.emplace_back();
|
|
R.Args.back().Key = "key";
|
|
R.Args.back().Val = "value";
|
|
R.Args.back().Loc.emplace();
|
|
R.Args.back().Loc->SourceFilePath = "argpath";
|
|
R.Args.back().Loc->SourceLine = 11;
|
|
R.Args.back().Loc->SourceColumn = 66;
|
|
check(
|
|
R,
|
|
"<BLOCKINFO_BLOCK/>\n"
|
|
"<Meta BlockID=8 NumWords=3 BlockCodeSize=3>\n"
|
|
" <Container info codeid=1 abbrevid=4 op0=1 op1=1/>\n"
|
|
" <Remark version codeid=2 abbrevid=5 op0=0/>\n"
|
|
"</Meta>\n"
|
|
"<Remark BlockID=9 NumWords=8 BlockCodeSize=4>\n"
|
|
" <Remark header codeid=5 abbrevid=4 op0=2 op1=1 op2=0 op3=2/>\n"
|
|
" <Remark debug location codeid=6 abbrevid=5 op0=3 op1=99 op2=55/>\n"
|
|
" <Remark hotness codeid=7 abbrevid=6 op0=999999999/>\n"
|
|
" <Argument with debug location codeid=8 abbrevid=7 op0=4 op1=5 op2=6 "
|
|
"op3=11 op4=66/>\n"
|
|
"</Remark>\n"
|
|
"<Meta BlockID=8 NumWords=13 BlockCodeSize=3>\n"
|
|
" <String table codeid=3 abbrevid=6/> blob data = "
|
|
"'pass\\x00remark\\x00function\\x00path\\x00key\\x00value\\x00argpath\\x0"
|
|
"0'\n"
|
|
"</Meta>\n",
|
|
std::nullopt, std::move(StrTab));
|
|
}
|