//===- unittests/Support/SymbolRemappingReaderTest.cpp --------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "llvm/Support/SymbolRemappingReader.h" #include "llvm/Support/MemoryBuffer.h" #include "gtest/gtest.h" using namespace llvm; namespace { class SymbolRemappingReaderTest : public testing::Test { public: std::unique_ptr Buffer; SymbolRemappingReader Reader; std::string readWithErrors(StringRef Text, StringRef BufferName) { Buffer = MemoryBuffer::getMemBuffer(Text, BufferName); Error E = Reader.read(*Buffer); EXPECT_TRUE((bool)E); return toString(std::move(E)); } void read(StringRef Text, StringRef BufferName) { Buffer = MemoryBuffer::getMemBuffer(Text, BufferName); Error E = Reader.read(*Buffer); EXPECT_FALSE((bool)E); } }; } // unnamed namespace TEST_F(SymbolRemappingReaderTest, ParseErrors) { EXPECT_EQ(readWithErrors("error", "foo.map"), "foo.map:1: Expected 'kind mangled_name mangled_name', " "found 'error'"); EXPECT_EQ(readWithErrors("error m1 m2", "foo.map"), "foo.map:1: Invalid kind, expected 'name', 'type', or 'encoding', " "found 'error'"); } TEST_F(SymbolRemappingReaderTest, DemanglingErrors) { EXPECT_EQ(readWithErrors("type i banana", "foo.map"), "foo.map:1: Could not demangle 'banana' as a ; " "invalid mangling?"); EXPECT_EQ(readWithErrors("name i 1X", "foo.map"), "foo.map:1: Could not demangle 'i' as a ; " "invalid mangling?"); EXPECT_EQ(readWithErrors("name 1X 1fv", "foo.map"), "foo.map:1: Could not demangle '1fv' as a ; " "invalid mangling?"); EXPECT_EQ(readWithErrors("encoding 1fv 1f1gE", "foo.map"), "foo.map:1: Could not demangle '1f1gE' as a ; " "invalid mangling?"); } TEST_F(SymbolRemappingReaderTest, BadMappingOrder) { StringRef Map = R"( # N::foo == M::bar name N1N3fooE N1M3barE # N:: == M:: name 1N 1M )"; EXPECT_EQ(readWithErrors(Map, "foo.map"), "foo.map:6: Manglings '1N' and '1M' have both been used in prior " "remappings. Move this remapping earlier in the file."); } TEST_F(SymbolRemappingReaderTest, RemappingsAdded) { StringRef Map = R"( # A::foo == B::bar name N1A3fooE N1B3barE # int == long type i l # void f() = void g() encoding 1fIiEvv 1gIiEvv )"; read(Map, "foo.map"); auto Key = Reader.insert("_ZN1B3bar3bazIiEEvv"); EXPECT_NE(Key, SymbolRemappingReader::Key()); EXPECT_EQ(Key, Reader.lookup("_ZN1A3foo3bazIlEEvv")); EXPECT_NE(Key, Reader.lookup("_ZN1C3foo3bazIlEEvv")); Key = Reader.insert("_Z1fIiEvv"); EXPECT_NE(Key, SymbolRemappingReader::Key()); EXPECT_EQ(Key, Reader.lookup("_Z1gIlEvv")); }