summaryrefslogtreecommitdiff
path: root/lld/unittests
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2016-02-28 00:10:58 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2016-02-28 00:10:58 +0000
commit921a85e0bff7d50992b380c5cba5710674f87530 (patch)
treeb112c08803e1fdaf0a968850705f967a37161416 /lld/unittests
parentfe02b087ed46940a9431fd6e44a6fe6136cef316 (diff)
Remove the old ELF linker.
I think it is clear by now that the new linker is viable.
Diffstat (limited to 'lld/unittests')
-rw-r--r--lld/unittests/DriverTests/CMakeLists.txt1
-rw-r--r--lld/unittests/DriverTests/GnuLdDriverTest.cpp299
-rw-r--r--lld/unittests/DriverTests/UniversalDriverTest.cpp5
3 files changed, 2 insertions, 303 deletions
diff --git a/lld/unittests/DriverTests/CMakeLists.txt b/lld/unittests/DriverTests/CMakeLists.txt
index 0378e616442..716b1019983 100644
--- a/lld/unittests/DriverTests/CMakeLists.txt
+++ b/lld/unittests/DriverTests/CMakeLists.txt
@@ -1,6 +1,5 @@
add_lld_unittest(DriverTests
UniversalDriverTest.cpp
- GnuLdDriverTest.cpp
DarwinLdDriverTest.cpp
)
diff --git a/lld/unittests/DriverTests/GnuLdDriverTest.cpp b/lld/unittests/DriverTests/GnuLdDriverTest.cpp
deleted file mode 100644
index 13d20a4411a..00000000000
--- a/lld/unittests/DriverTests/GnuLdDriverTest.cpp
+++ /dev/null
@@ -1,299 +0,0 @@
-//===- lld/unittest/GnuLdDriverTest.cpp -----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-///
-/// \file
-/// \brief GNU ld driver tests.
-///
-//===----------------------------------------------------------------------===//
-
-#include "DriverTest.h"
-#include "lld/ReaderWriter/ELFLinkingContext.h"
-#include "llvm/Support/MemoryBuffer.h"
-
-using namespace llvm;
-using namespace lld;
-
-namespace {
-
-class GnuLdParserTest
- : public ParserTest<GnuLdDriver, std::unique_ptr<ELFLinkingContext>> {
-protected:
- const LinkingContext *linkingContext() override { return _ctx.get(); }
-};
-
-class LinkerScriptTest : public testing::Test {
-protected:
- void SetUp() override {
- llvm::Triple triple(llvm::sys::getDefaultTargetTriple());
- _ctx = GnuLdDriver::createELFLinkingContext(triple);
- }
-
- void parse(StringRef script, bool nostdlib = false) {
- std::unique_ptr<MemoryBuffer> mb = MemoryBuffer::getMemBuffer(
- script, "foo.so");
- std::string s;
- raw_string_ostream out(s);
- std::error_code ec =
- GnuLdDriver::evalLinkerScript(*_ctx, std::move(mb), out, nostdlib);
- EXPECT_FALSE(ec);
- }
-
- std::unique_ptr<ELFLinkingContext> _ctx;
-};
-
-} // anonymous namespace
-
-TEST_F(GnuLdParserTest, Empty) {
- EXPECT_FALSE(parse("ld", nullptr));
- EXPECT_EQ(linkingContext(), nullptr);
- EXPECT_EQ("No input files\n", errorMessage());
-}
-
-// -o
-
-TEST_F(GnuLdParserTest, Output) {
- EXPECT_TRUE(parse("ld", "a.o", "-o", "foo", nullptr));
- EXPECT_EQ("foo", _ctx->outputPath());
-}
-
-TEST_F(GnuLdParserTest, OutputDefault) {
- EXPECT_TRUE(parse("ld", "abc.o", nullptr));
- EXPECT_EQ("a.out", _ctx->outputPath());
-}
-
-// --noinhibit-exec
-
-TEST_F(GnuLdParserTest, NoinhibitExec) {
- EXPECT_TRUE(parse("ld", "a.o", "--noinhibit-exec", nullptr));
- EXPECT_TRUE(_ctx->allowRemainingUndefines());
-}
-
-// --entry
-
-TEST_F(GnuLdParserTest, Entry) {
- EXPECT_TRUE(parse("ld", "a.o", "--entry", "foo", nullptr));
- EXPECT_EQ("foo", _ctx->entrySymbolName());
-}
-
-TEST_F(GnuLdParserTest, EntryShort) {
- EXPECT_TRUE(parse("ld", "a.o", "-e", "foo", nullptr));
- EXPECT_EQ("foo", _ctx->entrySymbolName());
-}
-
-TEST_F(GnuLdParserTest, EntryJoined) {
- EXPECT_TRUE(parse("ld", "a.o", "--entry=foo", nullptr));
- EXPECT_EQ("foo", _ctx->entrySymbolName());
-}
-
-// --export-dynamic
-
-TEST_F(GnuLdParserTest, ExportDynamic) {
- EXPECT_TRUE(parse("ld", "a.o", "--export-dynamic", nullptr));
- EXPECT_TRUE(_ctx->shouldExportDynamic());
-}
-
-TEST_F(GnuLdParserTest, NoExportDynamic) {
- EXPECT_TRUE(parse("ld", "a.o", "--no-export-dynamic", nullptr));
- EXPECT_FALSE(_ctx->shouldExportDynamic());
-}
-
-// --init
-
-TEST_F(GnuLdParserTest, Init) {
- EXPECT_TRUE(parse("ld", "a.o", "-init", "foo", "-init", "bar", nullptr));
- EXPECT_EQ("bar", _ctx->initFunction());
-}
-
-TEST_F(GnuLdParserTest, InitJoined) {
- EXPECT_TRUE(parse("ld", "a.o", "-init=foo", nullptr));
- EXPECT_EQ("foo", _ctx->initFunction());
-}
-
-// --soname
-
-TEST_F(GnuLdParserTest, SOName) {
- EXPECT_TRUE(parse("ld", "a.o", "--soname=foo", nullptr));
- EXPECT_EQ("foo", _ctx->sharedObjectName());
-}
-
-TEST_F(GnuLdParserTest, SONameSingleDash) {
- EXPECT_TRUE(parse("ld", "a.o", "-soname=foo", nullptr));
- EXPECT_EQ("foo", _ctx->sharedObjectName());
-}
-
-TEST_F(GnuLdParserTest, SONameH) {
- EXPECT_TRUE(parse("ld", "a.o", "-h", "foo", nullptr));
- EXPECT_EQ("foo", _ctx->sharedObjectName());
-}
-
-// -rpath
-
-TEST_F(GnuLdParserTest, Rpath) {
- EXPECT_TRUE(parse("ld", "a.o", "-rpath", "foo:bar", nullptr));
- EXPECT_EQ(2, _ctx->getRpathList().size());
- EXPECT_EQ("foo", _ctx->getRpathList()[0]);
- EXPECT_EQ("bar", _ctx->getRpathList()[1]);
-}
-
-TEST_F(GnuLdParserTest, RpathEq) {
- EXPECT_TRUE(parse("ld", "a.o", "-rpath=foo", nullptr));
- EXPECT_EQ(1, _ctx->getRpathList().size());
- EXPECT_EQ("foo", _ctx->getRpathList()[0]);
-}
-
-// --defsym
-
-TEST_F(GnuLdParserTest, DefsymDecimal) {
- EXPECT_TRUE(parse("ld", "a.o", "--defsym=sym=1000", nullptr));
- assert(_ctx.get());
- auto map = _ctx->getAbsoluteSymbols();
- EXPECT_EQ((size_t)1, map.size());
- EXPECT_EQ((uint64_t)1000, map["sym"]);
-}
-
-TEST_F(GnuLdParserTest, DefsymHexadecimal) {
- EXPECT_TRUE(parse("ld", "a.o", "--defsym=sym=0x1000", nullptr));
- auto map = _ctx->getAbsoluteSymbols();
- EXPECT_EQ((size_t)1, map.size());
- EXPECT_EQ((uint64_t)0x1000, map["sym"]);
-}
-
-TEST_F(GnuLdParserTest, DefsymAlias) {
- EXPECT_TRUE(parse("ld", "a.o", "--defsym=sym=abc", nullptr));
- auto map = _ctx->getAliases();
- EXPECT_EQ((size_t)1, map.size());
- EXPECT_EQ("abc", map["sym"]);
-}
-
-TEST_F(GnuLdParserTest, DefsymOctal) {
- EXPECT_TRUE(parse("ld", "a.o", "--defsym=sym=0777", nullptr));
- auto map = _ctx->getAbsoluteSymbols();
- EXPECT_EQ((size_t)1, map.size());
- EXPECT_EQ((uint64_t)0777, map["sym"]);
-}
-
-TEST_F(GnuLdParserTest, DefsymMisssingSymbol) {
- EXPECT_FALSE(parse("ld", "a.o", "--defsym==0", nullptr));
-}
-
-TEST_F(GnuLdParserTest, DefsymMisssingValue) {
- EXPECT_FALSE(parse("ld", "a.o", "--defsym=sym=", nullptr));
-}
-
-// --as-needed
-
-TEST_F(GnuLdParserTest, AsNeeded) {
- EXPECT_TRUE(parse("ld", "a.o", "--as-needed", "b.o", "c.o",
- "--no-as-needed", "d.o", nullptr));
- std::vector<std::unique_ptr<Node>> &nodes = _ctx->getNodes();
- EXPECT_EQ((size_t)4, nodes.size());
- EXPECT_FALSE(cast<FileNode>(nodes[0].get())->asNeeded());
- EXPECT_TRUE(cast<FileNode>(nodes[1].get())->asNeeded());
- EXPECT_TRUE(cast<FileNode>(nodes[2].get())->asNeeded());
- EXPECT_FALSE(cast<FileNode>(nodes[3].get())->asNeeded());
-}
-
-// Emulation
-
-TEST_F(GnuLdParserTest, Emulation) {
- EXPECT_TRUE(parse("mips-linux-gnu-ld", "a.o", "-m", "elf64ltsmip", nullptr));
- EXPECT_EQ(Triple::mips64el, _ctx->getTriple().getArch());
- EXPECT_TRUE(
- parse("mips64el-linux-gnu-ld", "a.o", "-m", "elf32btsmip", nullptr));
- EXPECT_EQ(Triple::mips, _ctx->getTriple().getArch());
- EXPECT_TRUE(
- parse("mipsel-linux-gnu-ld", "a.o", "-m", "elf32btsmipn32", nullptr));
- EXPECT_EQ(Triple::mips, _ctx->getTriple().getArch());
- EXPECT_TRUE(
- parse("mips-linux-gnu-ld", "a.o", "-m", "elf32ltsmipn32", nullptr));
- EXPECT_EQ(Triple::mipsel, _ctx->getTriple().getArch());
-}
-
-// Linker script
-
-TEST_F(LinkerScriptTest, Input) {
- parse("INPUT(/x /y)");
- std::vector<std::unique_ptr<Node>> &nodes = _ctx->getNodes();
- EXPECT_EQ((size_t)2, nodes.size());
- EXPECT_EQ("/x", cast<FileNode>(nodes[0].get())->getFile()->path());
- EXPECT_EQ("/y", cast<FileNode>(nodes[1].get())->getFile()->path());
-}
-
-TEST_F(LinkerScriptTest, Group) {
- parse("GROUP(/x /y)");
- std::vector<std::unique_ptr<Node>> &nodes = _ctx->getNodes();
- EXPECT_EQ((size_t)3, nodes.size());
- EXPECT_EQ("/x", cast<FileNode>(nodes[0].get())->getFile()->path());
- EXPECT_EQ("/y", cast<FileNode>(nodes[1].get())->getFile()->path());
- EXPECT_EQ(2, cast<GroupEnd>(nodes[2].get())->getSize());
-}
-
-TEST_F(LinkerScriptTest, SearchDir) {
- parse("SEARCH_DIR(\"/foo/bar\")");
- std::vector<StringRef> paths = _ctx->getSearchPaths();
- EXPECT_EQ((size_t)1, paths.size());
- EXPECT_EQ("/foo/bar", paths[0]);
-}
-
-TEST_F(LinkerScriptTest, Entry) {
- parse("ENTRY(blah)");
- EXPECT_EQ("blah", _ctx->entrySymbolName());
-}
-
-TEST_F(LinkerScriptTest, Output) {
- parse("OUTPUT(\"/path/to/output\")");
- EXPECT_EQ("/path/to/output", _ctx->outputPath());
-}
-
-// Test that search paths are ignored when nostdlib is set.
-TEST_F(LinkerScriptTest, IgnoreSearchDirNoStdLib) {
- parse("SEARCH_DIR(\"/foo/bar\")", true /*nostdlib*/);
- std::vector<StringRef> paths = _ctx->getSearchPaths();
- EXPECT_EQ((size_t)0, paths.size());
-}
-
-TEST_F(LinkerScriptTest, ExprEval) {
- parse("SECTIONS { symbol = 0x4000 + 0x40; \n"
- ". = (symbol >= 0x4040)? (0x5001 * 2 & 0xFFF0) << 1 : 0}");
-
- EXPECT_EQ((size_t)1, _ctx->linkerScriptSema().getLinkerScripts().size());
-
- script::LinkerScript *ls =
- _ctx->linkerScriptSema().getLinkerScripts()[0]->get();
- EXPECT_EQ((size_t)1, ls->_commands.size());
-
- auto *secs = dyn_cast<const script::Sections>(*ls->_commands.begin());
- EXPECT_TRUE(secs != nullptr);
- EXPECT_EQ(2, secs->end() - secs->begin());
-
- auto command = secs->begin();
- auto *sa1 = dyn_cast<const script::SymbolAssignment>(*command);
- EXPECT_TRUE(sa1 != nullptr);
- EXPECT_EQ(script::SymbolAssignment::Simple, sa1->assignmentKind());
- EXPECT_EQ(script::SymbolAssignment::Default, sa1->assignmentVisibility());
-
- ++command;
- auto *sa2 = dyn_cast<const script::SymbolAssignment>(*command);
- EXPECT_TRUE(sa2 != nullptr);
- EXPECT_EQ(script::SymbolAssignment::Simple, sa2->assignmentKind());
- EXPECT_EQ(script::SymbolAssignment::Default, sa2->assignmentVisibility());
-
- script::Expression::SymbolTableTy mySymbolTable;
- auto ans = sa1->expr()->evalExpr(mySymbolTable);
- EXPECT_FALSE(ans.getError());
- int64_t result = *ans;
- EXPECT_EQ(0x4040, result);
- mySymbolTable[sa1->symbol()] = result;
-
- auto ans2 = sa2->expr()->evalExpr(mySymbolTable);
- EXPECT_FALSE(ans2.getError());
- result = *ans2;
- EXPECT_EQ(0x14000, result);
- EXPECT_EQ(0, sa2->symbol().compare(StringRef(".")));
-}
diff --git a/lld/unittests/DriverTests/UniversalDriverTest.cpp b/lld/unittests/DriverTests/UniversalDriverTest.cpp
index 0a464d3038c..b15e2cbf879 100644
--- a/lld/unittests/DriverTests/UniversalDriverTest.cpp
+++ b/lld/unittests/DriverTests/UniversalDriverTest.cpp
@@ -21,13 +21,12 @@ using namespace llvm;
using namespace lld;
TEST(UniversalDriver, flavor) {
- const char *args[] = {"ld", "-flavor", "old-gnu"};
+ const char *args[] = {"ld", "-flavor", "gnu"};
std::string diags;
raw_string_ostream os(diags);
UniversalDriver::link(args, os);
EXPECT_EQ(os.str().find("failed to determine driver flavor"),
std::string::npos);
- EXPECT_NE(os.str().find("No input files"),
- std::string::npos);
+ EXPECT_NE(os.str().find("no input files"), std::string::npos);
}