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 
13 using namespace llvm;
14 
TEST(RemarksAPI,Comparison)15 TEST(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{"path", 3, 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{"argpath", 6, 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 
TEST(RemarksAPI,Clone)45 TEST(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{"path", 3, 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{"argpath", 6, 7};
60 
61   // Check that clone works.
62   remarks::Remark R2 = R.clone();
63   EXPECT_EQ(R, R2);
64 }
65 
TEST(RemarksAPI,ArgsAsMsg)66 TEST(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{"argpath", 6, 7};
76 
77   EXPECT_EQ(R.getArgsAsMsg(), "can not do this because of that.");
78 }
79 
TEST(RemarksAPI,StringTableInternalize)80 TEST(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{"path", 3, 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{"argpath", 6, 7};
96 
97   // Check that internalize starts using the strings from the string table.
98   remarks::Remark R2 = R.clone();
99   StrTab.internalize(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