1//===- unittest/Support/RemarksAPITest.cpp - C++ API tests ----------------===//
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
9#include "llvm/Remarks/Remark.h"
10#include "llvm/Remarks/RemarkStringTable.h"
11#include "gtest/gtest.h"
12
13using namespace llvm;
14
15TEST(RemarksAPI, Comparison) {
16 remarks::Remark R;
17 R.RemarkType = remarks::Type::Missed;
18 R.PassName = "pass";
19 R.RemarkName = "name";
20 R.FunctionName = "func";
21 R.Loc = remarks::RemarkLocation{.SourceFilePath: "path", .SourceLine: 3, .SourceColumn: 4};
22 R.Hotness = 5;
23 R.Args.emplace_back();
24 R.Args.back().Key = "key";
25 R.Args.back().Val = "value";
26 R.Args.emplace_back();
27 R.Args.back().Key = "keydebug";
28 R.Args.back().Val = "valuedebug";
29 R.Args.back().Loc = remarks::RemarkLocation{.SourceFilePath: "argpath", .SourceLine: 6, .SourceColumn: 7};
30
31 // Check that == works.
32 EXPECT_EQ(R, R);
33
34 // Check that != works.
35 remarks::Remark R2 = R.clone();
36 R2.FunctionName = "func0";
37 EXPECT_NE(R, R2);
38
39 // Check that we iterate through all the arguments.
40 remarks::Remark R3 = R.clone();
41 R3.Args.back().Val = "not";
42 EXPECT_NE(R, R3);
43}
44
45TEST(RemarksAPI, Clone) {
46 remarks::Remark R;
47 R.RemarkType = remarks::Type::Missed;
48 R.PassName = "pass";
49 R.RemarkName = "name";
50 R.FunctionName = "func";
51 R.Loc = remarks::RemarkLocation{.SourceFilePath: "path", .SourceLine: 3, .SourceColumn: 4};
52 R.Hotness = 5;
53 R.Args.emplace_back();
54 R.Args.back().Key = "key";
55 R.Args.back().Val = "value";
56 R.Args.emplace_back();
57 R.Args.back().Key = "keydebug";
58 R.Args.back().Val = "valuedebug";
59 R.Args.back().Loc = remarks::RemarkLocation{.SourceFilePath: "argpath", .SourceLine: 6, .SourceColumn: 7};
60
61 // Check that clone works.
62 remarks::Remark R2 = R.clone();
63 EXPECT_EQ(R, R2);
64}
65
66TEST(RemarksAPI, ArgsAsMsg) {
67 remarks::Remark R;
68 R.RemarkType = remarks::Type::Missed;
69 R.Args.emplace_back();
70 R.Args.back().Key = "key";
71 R.Args.back().Val = "can not do this ";
72 R.Args.emplace_back();
73 R.Args.back().Key = "keydebug";
74 R.Args.back().Val = "because of that.";
75 R.Args.back().Loc = remarks::RemarkLocation{.SourceFilePath: "argpath", .SourceLine: 6, .SourceColumn: 7};
76
77 EXPECT_EQ(R.getArgsAsMsg(), "can not do this because of that.");
78}
79
80TEST(RemarksAPI, StringTableInternalize) {
81 remarks::StringTable StrTab;
82
83 // Empty table.
84 EXPECT_EQ(StrTab.SerializedSize, 0UL);
85
86 remarks::Remark R;
87 R.RemarkType = remarks::Type::Missed;
88 R.PassName = "pass";
89 R.RemarkName = "name";
90 R.FunctionName = "func";
91 R.Loc = remarks::RemarkLocation{.SourceFilePath: "path", .SourceLine: 3, .SourceColumn: 4};
92 R.Args.emplace_back();
93 R.Args.back().Key = "keydebug";
94 R.Args.back().Val = "valuedebug";
95 R.Args.back().Loc = remarks::RemarkLocation{.SourceFilePath: "argpath", .SourceLine: 6, .SourceColumn: 7};
96
97 // Check that internalize starts using the strings from the string table.
98 remarks::Remark R2 = R.clone();
99 StrTab.internalize(R&: R2);
100
101 // Check that the pointers in the remarks are different.
102 EXPECT_NE(R.PassName.data(), R2.PassName.data());
103 EXPECT_NE(R.RemarkName.data(), R2.RemarkName.data());
104 EXPECT_NE(R.FunctionName.data(), R2.FunctionName.data());
105 EXPECT_NE(R.Loc->SourceFilePath.data(), R2.Loc->SourceFilePath.data());
106 EXPECT_NE(R.Args.back().Key.data(), R2.Args.back().Key.data());
107 EXPECT_NE(R.Args.back().Val.data(), R2.Args.back().Val.data());
108 EXPECT_NE(R.Args.back().Loc->SourceFilePath.data(),
109 R2.Args.back().Loc->SourceFilePath.data());
110
111 // Check that the internalized remark is using the pointers from the string table.
112 EXPECT_EQ(StrTab.add(R.PassName).second.data(), R2.PassName.data());
113 EXPECT_EQ(StrTab.add(R.RemarkName).second.data(), R2.RemarkName.data());
114 EXPECT_EQ(StrTab.add(R.FunctionName).second.data(), R2.FunctionName.data());
115 EXPECT_EQ(StrTab.add(R.Loc->SourceFilePath).second.data(),
116 R2.Loc->SourceFilePath.data());
117 EXPECT_EQ(StrTab.add(R.Args.back().Key).second.data(),
118 R2.Args.back().Key.data());
119 EXPECT_EQ(StrTab.add(R.Args.back().Val).second.data(),
120 R2.Args.back().Val.data());
121 EXPECT_EQ(StrTab.add(R.Args.back().Loc->SourceFilePath).second.data(),
122 R2.Args.back().Loc->SourceFilePath.data());
123}
124

source code of llvm/unittests/Remarks/RemarksAPITest.cpp