[HLSL] Implement RWBuffer::operator[] via __builtin_hlsl_resource_getpointer (#117017)
[llvm-project.git] / llvm / unittests / XRay / FDRBlockIndexerTest.cpp
blobf2fab2f2ba1eaa9948dedbcc0f8c4286f8ccd969
1 //===- llvm/unittest/XRay/FDRTraceWriterTest.cpp ----------------*- C++ -*-===//
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-exception
6 //
7 //===----------------------------------------------------------------------===//
8 #include "llvm/XRay/BlockIndexer.h"
9 #include "llvm/XRay/FDRLogBuilder.h"
10 #include "llvm/XRay/FDRRecords.h"
11 #include "gmock/gmock.h"
12 #include "gtest/gtest.h"
14 namespace llvm {
15 namespace xray {
16 namespace {
18 using ::testing::ElementsAre;
19 using ::testing::Eq;
20 using ::testing::Field;
21 using ::testing::Not;
22 using ::testing::SizeIs;
24 // This test ensures that we can index blocks that follow version 3 of the log
25 // format.
26 TEST(FDRBlockIndexerTest, IndexBlocksV3) {
27 auto Block0 = LogBuilder()
28 .add<BufferExtents>(80)
29 .add<NewBufferRecord>(1)
30 .add<WallclockRecord>(1, 2)
31 .add<PIDRecord>(1)
32 .add<NewCPUIDRecord>(1, 2)
33 .add<FunctionRecord>(RecordTypes::ENTER, 1, 1)
34 .add<FunctionRecord>(RecordTypes::EXIT, 1, 100)
35 .consume();
36 auto Block1 = LogBuilder()
37 .add<BufferExtents>(80)
38 .add<NewBufferRecord>(1)
39 .add<WallclockRecord>(1, 2)
40 .add<PIDRecord>(1)
41 .add<NewCPUIDRecord>(1, 2)
42 .add<FunctionRecord>(RecordTypes::ENTER, 1, 1)
43 .add<FunctionRecord>(RecordTypes::EXIT, 1, 100)
44 .consume();
45 auto Block2 = LogBuilder()
46 .add<BufferExtents>(80)
47 .add<NewBufferRecord>(2)
48 .add<WallclockRecord>(1, 2)
49 .add<PIDRecord>(1)
50 .add<NewCPUIDRecord>(2, 2)
51 .add<FunctionRecord>(RecordTypes::ENTER, 1, 1)
52 .add<FunctionRecord>(RecordTypes::EXIT, 1, 100)
53 .consume();
54 BlockIndexer::Index Index;
55 BlockIndexer Indexer(Index);
56 // Iterate through the contrived blocks we have created above.
57 for (auto B : {std::ref(Block0), std::ref(Block1), std::ref(Block2)}) {
58 // For each record in the block, we apply the indexer.
59 for (auto &R : B.get())
60 ASSERT_FALSE(errorToBool(R->apply(Indexer)));
61 ASSERT_FALSE(errorToBool(Indexer.flush()));
64 ASSERT_THAT(Index.size(), Eq(2u));
65 auto T1Blocks = Index.find({1, 1});
66 ASSERT_THAT(T1Blocks, Not(Eq(Index.end())));
68 // Expect only six records, because we're ignoring the BufferExtents record.
69 EXPECT_THAT(T1Blocks->second,
70 ElementsAre(Field(&BlockIndexer::Block::Records, SizeIs(6u)),
71 Field(&BlockIndexer::Block::Records, SizeIs(6u))));
72 auto T2Blocks = Index.find({1, 2});
73 ASSERT_THAT(T2Blocks, Not(Eq(Index.end())));
74 EXPECT_THAT(T2Blocks->second, ElementsAre(Field(&BlockIndexer::Block::Records,
75 SizeIs(Eq(6u)))));
78 // FIXME: Support indexing V2 and V1 blocks.
80 } // namespace
81 } // namespace xray
82 } // namespace llvm