124 lines · cpp
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-exception6//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{"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 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{"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 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{"argpath", 6, 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{"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