1 | //===- unittests/Support/SymbolRemappingReaderTest.cpp --------------------===// |
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/ProfileData/SymbolRemappingReader.h" |
10 | #include "llvm/Support/MemoryBuffer.h" |
11 | #include "gtest/gtest.h" |
12 | |
13 | using namespace llvm; |
14 | |
15 | namespace { |
16 | class SymbolRemappingReaderTest : public testing::Test { |
17 | public: |
18 | std::unique_ptr<MemoryBuffer> Buffer; |
19 | SymbolRemappingReader Reader; |
20 | |
21 | std::string readWithErrors(StringRef Text, StringRef BufferName) { |
22 | Buffer = MemoryBuffer::getMemBuffer(InputData: Text, BufferName); |
23 | Error E = Reader.read(B&: *Buffer); |
24 | EXPECT_TRUE((bool)E); |
25 | return toString(E: std::move(E)); |
26 | } |
27 | |
28 | void read(StringRef Text, StringRef BufferName) { |
29 | Buffer = MemoryBuffer::getMemBuffer(InputData: Text, BufferName); |
30 | Error E = Reader.read(B&: *Buffer); |
31 | EXPECT_FALSE((bool)E); |
32 | } |
33 | }; |
34 | } // unnamed namespace |
35 | |
36 | TEST_F(SymbolRemappingReaderTest, ParseErrors) { |
37 | EXPECT_EQ(readWithErrors("error" , "foo.map" ), |
38 | "foo.map:1: Expected 'kind mangled_name mangled_name', " |
39 | "found 'error'" ); |
40 | |
41 | EXPECT_EQ(readWithErrors("error m1 m2" , "foo.map" ), |
42 | "foo.map:1: Invalid kind, expected 'name', 'type', or 'encoding', " |
43 | "found 'error'" ); |
44 | } |
45 | |
46 | TEST_F(SymbolRemappingReaderTest, DemanglingErrors) { |
47 | EXPECT_EQ(readWithErrors("type i banana" , "foo.map" ), |
48 | "foo.map:1: Could not demangle 'banana' as a <type>; " |
49 | "invalid mangling?" ); |
50 | EXPECT_EQ(readWithErrors("name i 1X" , "foo.map" ), |
51 | "foo.map:1: Could not demangle 'i' as a <name>; " |
52 | "invalid mangling?" ); |
53 | EXPECT_EQ(readWithErrors("name 1X 1fv" , "foo.map" ), |
54 | "foo.map:1: Could not demangle '1fv' as a <name>; " |
55 | "invalid mangling?" ); |
56 | EXPECT_EQ(readWithErrors("encoding 1fv 1f1gE" , "foo.map" ), |
57 | "foo.map:1: Could not demangle '1f1gE' as a <encoding>; " |
58 | "invalid mangling?" ); |
59 | } |
60 | |
61 | TEST_F(SymbolRemappingReaderTest, BadMappingOrder) { |
62 | StringRef Map = R"( |
63 | # N::foo == M::bar |
64 | name N1N3fooE N1M3barE |
65 | |
66 | # N:: == M:: |
67 | name 1N 1M |
68 | )" ; |
69 | EXPECT_EQ(readWithErrors(Map, "foo.map" ), |
70 | "foo.map:6: Manglings '1N' and '1M' have both been used in prior " |
71 | "remappings. Move this remapping earlier in the file." ); |
72 | } |
73 | |
74 | TEST_F(SymbolRemappingReaderTest, RemappingsAdded) { |
75 | StringRef Map = R"( |
76 | # A::foo == B::bar |
77 | name N1A3fooE N1B3barE |
78 | |
79 | # int == long |
80 | type i l |
81 | |
82 | # void f<int>() = void g<int>() |
83 | encoding 1fIiEvv 1gIiEvv |
84 | )" ; |
85 | |
86 | read(Text: Map, BufferName: "foo.map" ); |
87 | auto Key = Reader.insert(FunctionName: "_ZN1B3bar3bazIiEEvv" ); |
88 | EXPECT_NE(Key, SymbolRemappingReader::Key()); |
89 | EXPECT_EQ(Key, Reader.lookup("_ZN1A3foo3bazIlEEvv" )); |
90 | EXPECT_NE(Key, Reader.lookup("_ZN1C3foo3bazIlEEvv" )); |
91 | |
92 | Key = Reader.insert(FunctionName: "_Z1fIiEvv" ); |
93 | EXPECT_NE(Key, SymbolRemappingReader::Key()); |
94 | EXPECT_EQ(Key, Reader.lookup("_Z1gIlEvv" )); |
95 | } |
96 | |