annotate llvm/unittests/Remarks/RemarksLinkingTest.cpp @ 235:edfff9242030 cbc-llvm13

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 21 Jul 2021 11:30:30 +0900
parents 1d019706d866
children 1f2b6ac9f198
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===- unittest/Support/RemarksLinkingTest.cpp - Linking tests ------------===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8
anatofuz
parents:
diff changeset
9 #include "llvm/Bitcode/BitcodeAnalyzer.h"
anatofuz
parents:
diff changeset
10 #include "llvm/Remarks/RemarkLinker.h"
anatofuz
parents:
diff changeset
11 #include "llvm/Remarks/RemarkSerializer.h"
anatofuz
parents:
diff changeset
12 #include "llvm/Support/raw_ostream.h"
anatofuz
parents:
diff changeset
13 #include "gtest/gtest.h"
anatofuz
parents:
diff changeset
14 #include <string>
anatofuz
parents:
diff changeset
15
anatofuz
parents:
diff changeset
16 using namespace llvm;
anatofuz
parents:
diff changeset
17
anatofuz
parents:
diff changeset
18 static void serializeAndCheck(remarks::RemarkLinker &RL,
anatofuz
parents:
diff changeset
19 remarks::Format OutputFormat,
anatofuz
parents:
diff changeset
20 StringRef ExpectedOutput) {
anatofuz
parents:
diff changeset
21 // 1. Create a serializer.
anatofuz
parents:
diff changeset
22 // 2. Serialize all the remarks from the linker.
anatofuz
parents:
diff changeset
23 // 3. Check that it matches the output.
anatofuz
parents:
diff changeset
24 std::string Buf;
anatofuz
parents:
diff changeset
25 raw_string_ostream OS(Buf);
anatofuz
parents:
diff changeset
26 Error E = RL.serialize(OS, OutputFormat);
anatofuz
parents:
diff changeset
27 EXPECT_FALSE(static_cast<bool>(E));
anatofuz
parents:
diff changeset
28
anatofuz
parents:
diff changeset
29 // For bitstream, run it through the analyzer.
anatofuz
parents:
diff changeset
30 if (OutputFormat == remarks::Format::Bitstream) {
anatofuz
parents:
diff changeset
31 std::string AnalyzeBuf;
anatofuz
parents:
diff changeset
32 raw_string_ostream AnalyzeOS(AnalyzeBuf);
anatofuz
parents:
diff changeset
33 BCDumpOptions O(AnalyzeOS);
anatofuz
parents:
diff changeset
34 O.ShowBinaryBlobs = true;
anatofuz
parents:
diff changeset
35 BitcodeAnalyzer BA(OS.str());
anatofuz
parents:
diff changeset
36 EXPECT_FALSE(BA.analyze(O)); // Expect no errors.
anatofuz
parents:
diff changeset
37 EXPECT_EQ(AnalyzeOS.str(), ExpectedOutput);
anatofuz
parents:
diff changeset
38 } else {
anatofuz
parents:
diff changeset
39 EXPECT_EQ(OS.str(), ExpectedOutput);
anatofuz
parents:
diff changeset
40 }
anatofuz
parents:
diff changeset
41 }
anatofuz
parents:
diff changeset
42
anatofuz
parents:
diff changeset
43 static void check(remarks::Format InputFormat, StringRef Input,
anatofuz
parents:
diff changeset
44 remarks::Format OutputFormat, StringRef ExpectedOutput) {
anatofuz
parents:
diff changeset
45 remarks::RemarkLinker RL;
anatofuz
parents:
diff changeset
46 EXPECT_FALSE(RL.link(Input, InputFormat));
anatofuz
parents:
diff changeset
47 serializeAndCheck(RL, OutputFormat, ExpectedOutput);
anatofuz
parents:
diff changeset
48 }
anatofuz
parents:
diff changeset
49
anatofuz
parents:
diff changeset
50 static void check(remarks::Format InputFormat, StringRef Input,
anatofuz
parents:
diff changeset
51 remarks::Format InputFormat2, StringRef Input2,
anatofuz
parents:
diff changeset
52 remarks::Format OutputFormat, StringRef ExpectedOutput) {
anatofuz
parents:
diff changeset
53 remarks::RemarkLinker RL;
anatofuz
parents:
diff changeset
54 EXPECT_FALSE(RL.link(Input, InputFormat));
anatofuz
parents:
diff changeset
55 EXPECT_FALSE(RL.link(Input2, InputFormat2));
anatofuz
parents:
diff changeset
56 serializeAndCheck(RL, OutputFormat, ExpectedOutput);
anatofuz
parents:
diff changeset
57 }
anatofuz
parents:
diff changeset
58
anatofuz
parents:
diff changeset
59 TEST(Remarks, LinkingGoodYAML) {
anatofuz
parents:
diff changeset
60 // One YAML remark.
anatofuz
parents:
diff changeset
61 check(remarks::Format::YAML,
anatofuz
parents:
diff changeset
62 "--- !Missed\n"
anatofuz
parents:
diff changeset
63 "Pass: inline\n"
anatofuz
parents:
diff changeset
64 "Name: NoDefinition\n"
anatofuz
parents:
diff changeset
65 "DebugLoc: { File: file.c, Line: 3, Column: 12 }\n"
anatofuz
parents:
diff changeset
66 "Function: foo\n"
anatofuz
parents:
diff changeset
67 "...\n",
anatofuz
parents:
diff changeset
68 remarks::Format::YAML,
anatofuz
parents:
diff changeset
69 "--- !Missed\n"
anatofuz
parents:
diff changeset
70 "Pass: inline\n"
anatofuz
parents:
diff changeset
71 "Name: NoDefinition\n"
anatofuz
parents:
diff changeset
72 "DebugLoc: { File: file.c, Line: 3, Column: 12 }\n"
anatofuz
parents:
diff changeset
73 "Function: foo\n"
anatofuz
parents:
diff changeset
74 "...\n");
anatofuz
parents:
diff changeset
75
anatofuz
parents:
diff changeset
76 // Check that we don't keep remarks without debug locations.
anatofuz
parents:
diff changeset
77 check(remarks::Format::YAML,
anatofuz
parents:
diff changeset
78 "--- !Missed\n"
anatofuz
parents:
diff changeset
79 "Pass: inline\n"
anatofuz
parents:
diff changeset
80 "Name: NoDefinition\n"
anatofuz
parents:
diff changeset
81 "Function: foo\n"
anatofuz
parents:
diff changeset
82 "...\n",
anatofuz
parents:
diff changeset
83 remarks::Format::YAML, "");
anatofuz
parents:
diff changeset
84
anatofuz
parents:
diff changeset
85 // Check that we deduplicate remarks.
anatofuz
parents:
diff changeset
86 check(remarks::Format::YAML,
anatofuz
parents:
diff changeset
87 "--- !Missed\n"
anatofuz
parents:
diff changeset
88 "Pass: inline\n"
anatofuz
parents:
diff changeset
89 "Name: NoDefinition\n"
anatofuz
parents:
diff changeset
90 "DebugLoc: { File: file.c, Line: 3, Column: 12 }\n"
anatofuz
parents:
diff changeset
91 "Function: foo\n"
anatofuz
parents:
diff changeset
92 "...\n"
anatofuz
parents:
diff changeset
93 "--- !Missed\n"
anatofuz
parents:
diff changeset
94 "Pass: inline\n"
anatofuz
parents:
diff changeset
95 "Name: NoDefinition\n"
anatofuz
parents:
diff changeset
96 "DebugLoc: { File: file.c, Line: 3, Column: 12 }\n"
anatofuz
parents:
diff changeset
97 "Function: foo\n"
anatofuz
parents:
diff changeset
98 "...\n",
anatofuz
parents:
diff changeset
99 remarks::Format::YAML,
anatofuz
parents:
diff changeset
100 "--- !Missed\n"
anatofuz
parents:
diff changeset
101 "Pass: inline\n"
anatofuz
parents:
diff changeset
102 "Name: NoDefinition\n"
anatofuz
parents:
diff changeset
103 "DebugLoc: { File: file.c, Line: 3, Column: 12 }\n"
anatofuz
parents:
diff changeset
104 "Function: foo\n"
anatofuz
parents:
diff changeset
105 "...\n");
anatofuz
parents:
diff changeset
106 }
anatofuz
parents:
diff changeset
107
anatofuz
parents:
diff changeset
108 TEST(Remarks, LinkingGoodBitstream) {
anatofuz
parents:
diff changeset
109 // One YAML remark.
anatofuz
parents:
diff changeset
110 check(remarks::Format::YAML,
anatofuz
parents:
diff changeset
111 "--- !Missed\n"
anatofuz
parents:
diff changeset
112 "Pass: inline\n"
anatofuz
parents:
diff changeset
113 "Name: NoDefinition\n"
anatofuz
parents:
diff changeset
114 "DebugLoc: { File: file.c, Line: 3, Column: 12 }\n"
anatofuz
parents:
diff changeset
115 "Function: foo\n"
anatofuz
parents:
diff changeset
116 "...\n",
anatofuz
parents:
diff changeset
117 remarks::Format::Bitstream,
anatofuz
parents:
diff changeset
118 "<BLOCKINFO_BLOCK/>\n"
anatofuz
parents:
diff changeset
119 "<Meta BlockID=8 NumWords=12 BlockCodeSize=3>\n"
anatofuz
parents:
diff changeset
120 " <Container info codeid=1 abbrevid=4 op0=0 op1=2/>\n"
anatofuz
parents:
diff changeset
121 " <Remark version codeid=2 abbrevid=5 op0=0/>\n"
anatofuz
parents:
diff changeset
122 " <String table codeid=3 abbrevid=6/> blob data = "
anatofuz
parents:
diff changeset
123 "'inline\\x00NoDefinition\\x00foo\\x00file.c\\x00'\n"
anatofuz
parents:
diff changeset
124 "</Meta>\n"
anatofuz
parents:
diff changeset
125 "<Remark BlockID=9 NumWords=4 BlockCodeSize=4>\n"
anatofuz
parents:
diff changeset
126 " <Remark header codeid=5 abbrevid=4 op0=2 op1=1 op2=0 op3=2/>\n"
anatofuz
parents:
diff changeset
127 " <Remark debug location codeid=6 abbrevid=5 op0=3 op1=3 op2=12/>\n"
anatofuz
parents:
diff changeset
128 "</Remark>\n");
anatofuz
parents:
diff changeset
129
anatofuz
parents:
diff changeset
130 // Check that we deduplicate remarks.
anatofuz
parents:
diff changeset
131 check(remarks::Format::YAML,
anatofuz
parents:
diff changeset
132 "--- !Missed\n"
anatofuz
parents:
diff changeset
133 "Pass: inline\n"
anatofuz
parents:
diff changeset
134 "Name: NoDefinition\n"
anatofuz
parents:
diff changeset
135 "DebugLoc: { File: file.c, Line: 3, Column: 12 }\n"
anatofuz
parents:
diff changeset
136 "Function: foo\n"
anatofuz
parents:
diff changeset
137 "...\n"
anatofuz
parents:
diff changeset
138 "--- !Missed\n"
anatofuz
parents:
diff changeset
139 "Pass: inline\n"
anatofuz
parents:
diff changeset
140 "Name: NoDefinition\n"
anatofuz
parents:
diff changeset
141 "DebugLoc: { File: file.c, Line: 3, Column: 12 }\n"
anatofuz
parents:
diff changeset
142 "Function: foo\n"
anatofuz
parents:
diff changeset
143 "...\n",
anatofuz
parents:
diff changeset
144 remarks::Format::Bitstream,
anatofuz
parents:
diff changeset
145 "<BLOCKINFO_BLOCK/>\n"
anatofuz
parents:
diff changeset
146 "<Meta BlockID=8 NumWords=12 BlockCodeSize=3>\n"
anatofuz
parents:
diff changeset
147 " <Container info codeid=1 abbrevid=4 op0=0 op1=2/>\n"
anatofuz
parents:
diff changeset
148 " <Remark version codeid=2 abbrevid=5 op0=0/>\n"
anatofuz
parents:
diff changeset
149 " <String table codeid=3 abbrevid=6/> blob data = "
anatofuz
parents:
diff changeset
150 "'inline\\x00NoDefinition\\x00foo\\x00file.c\\x00'\n"
anatofuz
parents:
diff changeset
151 "</Meta>\n"
anatofuz
parents:
diff changeset
152 "<Remark BlockID=9 NumWords=4 BlockCodeSize=4>\n"
anatofuz
parents:
diff changeset
153 " <Remark header codeid=5 abbrevid=4 op0=2 op1=1 op2=0 op3=2/>\n"
anatofuz
parents:
diff changeset
154 " <Remark debug location codeid=6 abbrevid=5 op0=3 op1=3 op2=12/>\n"
anatofuz
parents:
diff changeset
155 "</Remark>\n");
anatofuz
parents:
diff changeset
156 }
anatofuz
parents:
diff changeset
157
anatofuz
parents:
diff changeset
158 TEST(Remarks, LinkingGoodStrTab) {
anatofuz
parents:
diff changeset
159 // Check that remarks from different entries use the same strtab.
anatofuz
parents:
diff changeset
160 check(remarks::Format::YAML,
anatofuz
parents:
diff changeset
161 "--- !Missed\n"
anatofuz
parents:
diff changeset
162 "Pass: inline\n"
anatofuz
parents:
diff changeset
163 "Name: NoDefinition\n"
anatofuz
parents:
diff changeset
164 "DebugLoc: { File: file.c, Line: 3, Column: 12 }\n"
anatofuz
parents:
diff changeset
165 "Function: foo\n"
anatofuz
parents:
diff changeset
166 "...\n",
anatofuz
parents:
diff changeset
167 remarks::Format::YAML,
anatofuz
parents:
diff changeset
168 "--- !Passed\n"
anatofuz
parents:
diff changeset
169 "Pass: inline\n"
anatofuz
parents:
diff changeset
170 "Name: Ok\n"
anatofuz
parents:
diff changeset
171 "DebugLoc: { File: file.c, Line: 3, Column: 12 }\n"
anatofuz
parents:
diff changeset
172 "Function: foo\n"
anatofuz
parents:
diff changeset
173 "...\n",
anatofuz
parents:
diff changeset
174 remarks::Format::YAMLStrTab,
anatofuz
parents:
diff changeset
175 StringRef("REMARKS\0\0\0\0\0\0\0\0\0\x22\0\0\0\0\0\0\0"
anatofuz
parents:
diff changeset
176 "inline\0NoDefinition\0foo\0file.c\0Ok\0"
anatofuz
parents:
diff changeset
177 "--- !Passed\n"
anatofuz
parents:
diff changeset
178 "Pass: 0\n"
anatofuz
parents:
diff changeset
179 "Name: 4\n"
anatofuz
parents:
diff changeset
180 "DebugLoc: { File: 3, Line: 3, Column: 12 }\n"
anatofuz
parents:
diff changeset
181 "Function: 2\n"
anatofuz
parents:
diff changeset
182 "...\n"
anatofuz
parents:
diff changeset
183 "--- !Missed\n"
anatofuz
parents:
diff changeset
184 "Pass: 0\n"
anatofuz
parents:
diff changeset
185 "Name: 1\n"
anatofuz
parents:
diff changeset
186 "DebugLoc: { File: 3, Line: 3, Column: 12 }\n"
anatofuz
parents:
diff changeset
187 "Function: 2\n"
anatofuz
parents:
diff changeset
188 "...\n",
anatofuz
parents:
diff changeset
189 304));
anatofuz
parents:
diff changeset
190 }
anatofuz
parents:
diff changeset
191
anatofuz
parents:
diff changeset
192 // Check that we propagate parsing errors.
anatofuz
parents:
diff changeset
193 TEST(Remarks, LinkingError) {
anatofuz
parents:
diff changeset
194 remarks::RemarkLinker RL;
anatofuz
parents:
diff changeset
195 {
anatofuz
parents:
diff changeset
196 Error E = RL.link("badyaml", remarks::Format::YAML);
anatofuz
parents:
diff changeset
197 EXPECT_TRUE(static_cast<bool>(E));
anatofuz
parents:
diff changeset
198 EXPECT_EQ(toString(std::move(E)),
anatofuz
parents:
diff changeset
199 "YAML:1:1: error: document root is not of mapping type.\n"
anatofuz
parents:
diff changeset
200 "\n"
anatofuz
parents:
diff changeset
201 "badyaml\n"
anatofuz
parents:
diff changeset
202 "^~~~~~~\n"
anatofuz
parents:
diff changeset
203 "\n");
anatofuz
parents:
diff changeset
204 }
anatofuz
parents:
diff changeset
205
anatofuz
parents:
diff changeset
206 {
anatofuz
parents:
diff changeset
207 // Check that the prepend path is propagated and fails with the full path.
anatofuz
parents:
diff changeset
208 RL.setExternalFilePrependPath("/baddir/");
anatofuz
parents:
diff changeset
209 Error E = RL.link(
anatofuz
parents:
diff changeset
210 StringRef("REMARKS\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0badfile.opt.yaml",
anatofuz
parents:
diff changeset
211 40),
anatofuz
parents:
diff changeset
212 remarks::Format::YAMLStrTab);
anatofuz
parents:
diff changeset
213 EXPECT_TRUE(static_cast<bool>(E));
anatofuz
parents:
diff changeset
214 std::string ErrorMessage = toString(std::move(E));
anatofuz
parents:
diff changeset
215 EXPECT_EQ(StringRef(ErrorMessage).lower(),
anatofuz
parents:
diff changeset
216 StringRef("'/baddir/badfile.opt.yaml': No such file or directory")
anatofuz
parents:
diff changeset
217 .lower());
anatofuz
parents:
diff changeset
218 }
anatofuz
parents:
diff changeset
219 }