aboutsummaryrefslogtreecommitdiff
path: root/llvm/unittests/TextAPI
diff options
context:
space:
mode:
authorHaowei Wu <haowei@google.com>2020-08-11 11:44:22 -0700
committerHaowei Wu <haowei@google.com>2020-08-13 11:51:44 -0700
commitd650cbc349ccc4f477568c2827f1bce650020058 (patch)
tree0becbb9d7d98273e5e98a5853c6f3ebd2981ce79 /llvm/unittests/TextAPI
parent759f9a7acdfc33afd5d8bd1c33446c1b4d721388 (diff)
downloadllvm-d650cbc349ccc4f477568c2827f1bce650020058.zip
llvm-d650cbc349ccc4f477568c2827f1bce650020058.tar.gz
llvm-d650cbc349ccc4f477568c2827f1bce650020058.tar.bz2
[elfabi] Move llvm-elfabi related code to InterfaceStub library
This change moves elfabi related code to llvm/InterfaceStub library so it can be shared by multiple llvm tools without causing cyclic dependencies. Differential Revision: https://reviews.llvm.org/D85678
Diffstat (limited to 'llvm/unittests/TextAPI')
-rw-r--r--llvm/unittests/TextAPI/CMakeLists.txt1
-rw-r--r--llvm/unittests/TextAPI/ELFYAMLTest.cpp227
2 files changed, 0 insertions, 228 deletions
diff --git a/llvm/unittests/TextAPI/CMakeLists.txt b/llvm/unittests/TextAPI/CMakeLists.txt
index 775ec2f..d575d57 100644
--- a/llvm/unittests/TextAPI/CMakeLists.txt
+++ b/llvm/unittests/TextAPI/CMakeLists.txt
@@ -3,7 +3,6 @@ set(LLVM_LINK_COMPONENTS
)
add_llvm_unittest(TextAPITests
- ELFYAMLTest.cpp
TextStubV1Tests.cpp
TextStubV2Tests.cpp
TextStubV3Tests.cpp
diff --git a/llvm/unittests/TextAPI/ELFYAMLTest.cpp b/llvm/unittests/TextAPI/ELFYAMLTest.cpp
deleted file mode 100644
index 8217507..0000000
--- a/llvm/unittests/TextAPI/ELFYAMLTest.cpp
+++ /dev/null
@@ -1,227 +0,0 @@
-//===- llvm/unittests/TextAPI/YAMLTest.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/ADT/StringRef.h"
-#include "llvm/TextAPI/ELF/ELFStub.h"
-#include "llvm/TextAPI/ELF/TBEHandler.h"
-#include "llvm/Support/Error.h"
-#include "llvm/Testing/Support/Error.h"
-#include "gtest/gtest.h"
-#include <string>
-
-using namespace llvm;
-using namespace llvm::ELF;
-using namespace llvm::elfabi;
-
-void compareByLine(StringRef LHS, StringRef RHS) {
- StringRef Line1;
- StringRef Line2;
- while (LHS.size() > 0 && RHS.size() > 0) {
- std::tie(Line1, LHS) = LHS.split('\n');
- std::tie(Line2, RHS) = RHS.split('\n');
- // Comparing StringRef objects works, but has messy output when not equal.
- // Using STREQ on StringRef.data() doesn't work since these substrings are
- // not null terminated.
- // This is inefficient, but forces null terminated strings that can be
- // cleanly compared.
- EXPECT_STREQ(Line1.str().data(), Line2.str().data());
- }
-}
-
-TEST(ElfYamlTextAPI, YAMLReadableTBE) {
- const char Data[] = "--- !tapi-tbe\n"
- "TbeVersion: 1.0\n"
- "Arch: x86_64\n"
- "NeededLibs: [libc.so, libfoo.so, libbar.so]\n"
- "Symbols:\n"
- " foo: { Type: Func, Undefined: true }\n"
- "...\n";
- Expected<std::unique_ptr<ELFStub>> StubOrErr = readTBEFromBuffer(Data);
- ASSERT_THAT_ERROR(StubOrErr.takeError(), Succeeded());
- std::unique_ptr<ELFStub> Stub = std::move(StubOrErr.get());
- EXPECT_NE(Stub.get(), nullptr);
- EXPECT_FALSE(Stub->SoName.hasValue());
- EXPECT_EQ(Stub->Arch, (uint16_t)llvm::ELF::EM_X86_64);
- EXPECT_EQ(Stub->NeededLibs.size(), 3u);
- EXPECT_STREQ(Stub->NeededLibs[0].c_str(), "libc.so");
- EXPECT_STREQ(Stub->NeededLibs[1].c_str(), "libfoo.so");
- EXPECT_STREQ(Stub->NeededLibs[2].c_str(), "libbar.so");
-}
-
-TEST(ElfYamlTextAPI, YAMLReadsTBESymbols) {
- const char Data[] = "--- !tapi-tbe\n"
- "TbeVersion: 1.0\n"
- "SoName: test.so\n"
- "Arch: x86_64\n"
- "Symbols:\n"
- " bar: { Type: Object, Size: 42 }\n"
- " baz: { Type: TLS, Size: 3 }\n"
- " foo: { Type: Func, Warning: \"Deprecated!\" }\n"
- " nor: { Type: NoType, Undefined: true }\n"
- " not: { Type: File, Undefined: true, Size: 111, "
- "Weak: true, Warning: \'All fields populated!\' }\n"
- "...\n";
- Expected<std::unique_ptr<ELFStub>> StubOrErr = readTBEFromBuffer(Data);
- ASSERT_THAT_ERROR(StubOrErr.takeError(), Succeeded());
- std::unique_ptr<ELFStub> Stub = std::move(StubOrErr.get());
- EXPECT_NE(Stub.get(), nullptr);
- EXPECT_TRUE(Stub->SoName.hasValue());
- EXPECT_STREQ(Stub->SoName->c_str(), "test.so");
- EXPECT_EQ(Stub->Symbols.size(), 5u);
-
- auto Iterator = Stub->Symbols.begin();
- ELFSymbol const &SymBar = *Iterator++;
- EXPECT_STREQ(SymBar.Name.c_str(), "bar");
- EXPECT_EQ(SymBar.Size, 42u);
- EXPECT_EQ(SymBar.Type, ELFSymbolType::Object);
- EXPECT_FALSE(SymBar.Undefined);
- EXPECT_FALSE(SymBar.Weak);
- EXPECT_FALSE(SymBar.Warning.hasValue());
-
- ELFSymbol const &SymBaz = *Iterator++;
- EXPECT_STREQ(SymBaz.Name.c_str(), "baz");
- EXPECT_EQ(SymBaz.Size, 3u);
- EXPECT_EQ(SymBaz.Type, ELFSymbolType::TLS);
- EXPECT_FALSE(SymBaz.Undefined);
- EXPECT_FALSE(SymBaz.Weak);
- EXPECT_FALSE(SymBaz.Warning.hasValue());
-
- ELFSymbol const &SymFoo = *Iterator++;
- EXPECT_STREQ(SymFoo.Name.c_str(), "foo");
- EXPECT_EQ(SymFoo.Size, 0u);
- EXPECT_EQ(SymFoo.Type, ELFSymbolType::Func);
- EXPECT_FALSE(SymFoo.Undefined);
- EXPECT_FALSE(SymFoo.Weak);
- EXPECT_TRUE(SymFoo.Warning.hasValue());
- EXPECT_STREQ(SymFoo.Warning->c_str(), "Deprecated!");
-
- ELFSymbol const &SymNor = *Iterator++;
- EXPECT_STREQ(SymNor.Name.c_str(), "nor");
- EXPECT_EQ(SymNor.Size, 0u);
- EXPECT_EQ(SymNor.Type, ELFSymbolType::NoType);
- EXPECT_TRUE(SymNor.Undefined);
- EXPECT_FALSE(SymNor.Weak);
- EXPECT_FALSE(SymNor.Warning.hasValue());
-
- ELFSymbol const &SymNot = *Iterator++;
- EXPECT_STREQ(SymNot.Name.c_str(), "not");
- EXPECT_EQ(SymNot.Size, 111u);
- EXPECT_EQ(SymNot.Type, ELFSymbolType::Unknown);
- EXPECT_TRUE(SymNot.Undefined);
- EXPECT_TRUE(SymNot.Weak);
- EXPECT_TRUE(SymNot.Warning.hasValue());
- EXPECT_STREQ(SymNot.Warning->c_str(), "All fields populated!");
-}
-
-TEST(ElfYamlTextAPI, YAMLReadsNoTBESyms) {
- const char Data[] = "--- !tapi-tbe\n"
- "TbeVersion: 1.0\n"
- "SoName: test.so\n"
- "Arch: x86_64\n"
- "Symbols: {}\n"
- "...\n";
- Expected<std::unique_ptr<ELFStub>> StubOrErr = readTBEFromBuffer(Data);
- ASSERT_THAT_ERROR(StubOrErr.takeError(), Succeeded());
- std::unique_ptr<ELFStub> Stub = std::move(StubOrErr.get());
- EXPECT_NE(Stub.get(), nullptr);
- EXPECT_EQ(0u, Stub->Symbols.size());
-}
-
-TEST(ElfYamlTextAPI, YAMLUnreadableTBE) {
- // Can't read: wrong format/version.
- const char Data[] = "--- !tapi-tbz\n"
- "TbeVersion: z.3\n"
- "SoName: test.so\n"
- "Arch: x86_64\n"
- "Symbols:\n"
- " foo: { Type: Func, Undefined: true }\n";
- Expected<std::unique_ptr<ELFStub>> StubOrErr = readTBEFromBuffer(Data);
- ASSERT_THAT_ERROR(StubOrErr.takeError(), Failed());
-}
-
-TEST(ElfYamlTextAPI, YAMLWritesTBESymbols) {
- const char Expected[] =
- "--- !tapi-tbe\n"
- "TbeVersion: 1.0\n"
- "Arch: AArch64\n"
- "Symbols:\n"
- " bar: { Type: Func, Weak: true }\n"
- " foo: { Type: NoType, Size: 99, Warning: Does nothing }\n"
- " nor: { Type: Func, Undefined: true }\n"
- " not: { Type: Unknown, Size: 12345678901234 }\n"
- "...\n";
- ELFStub Stub;
- Stub.TbeVersion = VersionTuple(1, 0);
- Stub.Arch = ELF::EM_AARCH64;
-
- ELFSymbol SymFoo("foo");
- SymFoo.Size = 99u;
- SymFoo.Type = ELFSymbolType::NoType;
- SymFoo.Undefined = false;
- SymFoo.Weak = false;
- SymFoo.Warning = "Does nothing";
-
- ELFSymbol SymBar("bar");
- SymBar.Size = 128u;
- SymBar.Type = ELFSymbolType::Func;
- SymBar.Undefined = false;
- SymBar.Weak = true;
-
- ELFSymbol SymNor("nor");
- SymNor.Size = 1234u;
- SymNor.Type = ELFSymbolType::Func;
- SymNor.Undefined = true;
- SymNor.Weak = false;
-
- ELFSymbol SymNot("not");
- SymNot.Size = 12345678901234u;
- SymNot.Type = ELFSymbolType::Unknown;
- SymNot.Undefined = false;
- SymNot.Weak = false;
-
- // Deliberately not in order to check that result is sorted.
- Stub.Symbols.insert(SymNot);
- Stub.Symbols.insert(SymBar);
- Stub.Symbols.insert(SymFoo);
- Stub.Symbols.insert(SymNor);
-
- // Ensure move constructor works as expected.
- ELFStub Moved = std::move(Stub);
-
- std::string Result;
- raw_string_ostream OS(Result);
- ASSERT_THAT_ERROR(writeTBEToOutputStream(OS, Moved), Succeeded());
- Result = OS.str();
- compareByLine(Result.c_str(), Expected);
-}
-
-TEST(ElfYamlTextAPI, YAMLWritesNoTBESyms) {
- const char Expected[] = "--- !tapi-tbe\n"
- "TbeVersion: 1.0\n"
- "SoName: nosyms.so\n"
- "Arch: x86_64\n"
- "NeededLibs:\n"
- " - libc.so\n"
- " - libfoo.so\n"
- " - libbar.so\n"
- "Symbols: {}\n"
- "...\n";
- ELFStub Stub;
- Stub.TbeVersion = VersionTuple(1, 0);
- Stub.SoName = "nosyms.so";
- Stub.Arch = ELF::EM_X86_64;
- Stub.NeededLibs.push_back("libc.so");
- Stub.NeededLibs.push_back("libfoo.so");
- Stub.NeededLibs.push_back("libbar.so");
-
- std::string Result;
- raw_string_ostream OS(Result);
- ASSERT_THAT_ERROR(writeTBEToOutputStream(OS, Stub), Succeeded());
- Result = OS.str();
- compareByLine(Result.c_str(), Expected);
-}