summaryrefslogtreecommitdiff
path: root/unittests/DriverTests/WinLinkModuleDefTest.cpp
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2015-03-24 21:31:36 +0000
committerDimitry Andric <dim@FreeBSD.org>2015-03-24 21:31:36 +0000
commitfb911942f1434f3d1750f83f25f5e42c80e60638 (patch)
tree1678c4a4f0182e4029a86d135aa4a1b7d09e3c41 /unittests/DriverTests/WinLinkModuleDefTest.cpp
Notes
Diffstat (limited to 'unittests/DriverTests/WinLinkModuleDefTest.cpp')
-rw-r--r--unittests/DriverTests/WinLinkModuleDefTest.cpp155
1 files changed, 155 insertions, 0 deletions
diff --git a/unittests/DriverTests/WinLinkModuleDefTest.cpp b/unittests/DriverTests/WinLinkModuleDefTest.cpp
new file mode 100644
index 0000000000000..6762fd4b2ea66
--- /dev/null
+++ b/unittests/DriverTests/WinLinkModuleDefTest.cpp
@@ -0,0 +1,155 @@
+//===- lld/unittest/WinLinkModuleDefTest.cpp ------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "gtest/gtest.h"
+#include "lld/Driver/WinLinkModuleDef.h"
+#include "llvm/Support/MemoryBuffer.h"
+#include <memory>
+
+using namespace llvm;
+using namespace lld;
+
+class ParserTest : public testing::Test {
+protected:
+ std::vector<moduledef::Directive *> _dirs;
+
+ void parse(const char *contents) {
+ auto membuf =
+ std::unique_ptr<MemoryBuffer>(MemoryBuffer::getMemBuffer(contents));
+ moduledef::Lexer lexer(std::move(membuf));
+ moduledef::Parser parser(lexer, _alloc);
+ EXPECT_TRUE(parser.parse(_dirs));
+ EXPECT_TRUE(!_dirs.empty());
+ }
+
+ void verifyExportDesc(const PECOFFLinkingContext::ExportDesc &exp,
+ StringRef sym, int ordinal, bool noname, bool isData) {
+ EXPECT_EQ(sym, exp.name);
+ EXPECT_EQ(ordinal, exp.ordinal);
+ EXPECT_EQ(noname, exp.noname);
+ EXPECT_EQ(isData, exp.isData);
+ }
+
+private:
+ llvm::BumpPtrAllocator _alloc;
+};
+
+TEST_F(ParserTest, Exports) {
+ parse("EXPORTS\n"
+ " sym1\n"
+ " sym2 @5\n"
+ " sym3 @8 NONAME\n"
+ " sym4 DATA\n"
+ " sym5 @10 NONAME DATA\n");
+ EXPECT_EQ(1U, _dirs.size());
+ const std::vector<PECOFFLinkingContext::ExportDesc> &exports =
+ cast<moduledef::Exports>(_dirs[0])->getExports();
+ EXPECT_EQ(5U, exports.size());
+ verifyExportDesc(exports[0], "sym1", -1, false, false);
+ verifyExportDesc(exports[1], "sym2", 5, false, false);
+ verifyExportDesc(exports[2], "sym3", 8, true, false);
+ verifyExportDesc(exports[3], "sym4", -1, false, true);
+ verifyExportDesc(exports[4], "sym5", 10, true, true);
+}
+
+TEST_F(ParserTest, Heapsize) {
+ parse("HEAPSIZE 65536");
+ EXPECT_EQ(1U, _dirs.size());
+ auto *heapsize = cast<moduledef::Heapsize>(_dirs[0]);
+ EXPECT_EQ(65536U, heapsize->getReserve());
+ EXPECT_EQ(0U, heapsize->getCommit());
+}
+
+TEST_F(ParserTest, HeapsizeWithCommit) {
+ parse("HEAPSIZE 65536, 8192");
+ EXPECT_EQ(1U, _dirs.size());
+ auto *heapsize = cast<moduledef::Heapsize>(_dirs[0]);
+ EXPECT_EQ(65536U, heapsize->getReserve());
+ EXPECT_EQ(8192U, heapsize->getCommit());
+}
+
+TEST_F(ParserTest, StacksizeBasic) {
+ parse("STACKSIZE 65536");
+ EXPECT_EQ(1U, _dirs.size());
+ auto *stacksize = cast<moduledef::Stacksize>(_dirs[0]);
+ EXPECT_EQ(65536U, stacksize->getReserve());
+ EXPECT_EQ(0U, stacksize->getCommit());
+}
+
+TEST_F(ParserTest, StacksizeWithCommit) {
+ parse("STACKSIZE 65536, 8192");
+ EXPECT_EQ(1U, _dirs.size());
+ auto *stacksize = cast<moduledef::Stacksize>(_dirs[0]);
+ EXPECT_EQ(65536U, stacksize->getReserve());
+ EXPECT_EQ(8192U, stacksize->getCommit());
+}
+
+TEST_F(ParserTest, Library) {
+ parse("LIBRARY foo.dll");
+ EXPECT_EQ(1U, _dirs.size());
+ auto *lib = cast<moduledef::Library>(_dirs[0]);
+ EXPECT_EQ("foo.dll", lib->getName());
+}
+
+TEST_F(ParserTest, NameBasic) {
+ parse("NAME foo.exe");
+ EXPECT_EQ(1U, _dirs.size());
+ auto *name = cast<moduledef::Name>(_dirs[0]);
+ EXPECT_EQ("foo.exe", name->getOutputPath());
+ EXPECT_EQ(0U, name->getBaseAddress());
+}
+
+TEST_F(ParserTest, NameWithBase) {
+ parse("NAME foo.exe BASE=4096");
+ EXPECT_EQ(1U, _dirs.size());
+ auto *name = cast<moduledef::Name>(_dirs[0]);
+ EXPECT_EQ("foo.exe", name->getOutputPath());
+ EXPECT_EQ(4096U, name->getBaseAddress());
+}
+
+TEST_F(ParserTest, NameLongFileName) {
+ parse("NAME \"a long file name.exe\"");
+ EXPECT_EQ(1U, _dirs.size());
+ auto *name = cast<moduledef::Name>(_dirs[0]);
+ EXPECT_EQ("a long file name.exe", name->getOutputPath());
+ EXPECT_EQ(0U, name->getBaseAddress());
+}
+
+TEST_F(ParserTest, VersionMajor) {
+ parse("VERSION 12");
+ EXPECT_EQ(1U, _dirs.size());
+ auto *ver = cast<moduledef::Version>(_dirs[0]);
+ EXPECT_EQ(12, ver->getMajorVersion());
+ EXPECT_EQ(0, ver->getMinorVersion());
+}
+
+TEST_F(ParserTest, VersionMajorMinor) {
+ parse("VERSION 12.34");
+ EXPECT_EQ(1U, _dirs.size());
+ auto *ver = cast<moduledef::Version>(_dirs[0]);
+ EXPECT_EQ(12, ver->getMajorVersion());
+ EXPECT_EQ(34, ver->getMinorVersion());
+}
+
+TEST_F(ParserTest, Multiple) {
+ parse("LIBRARY foo\n"
+ "EXPORTS sym\n"
+ "VERSION 12");
+ EXPECT_EQ(3U, _dirs.size());
+ auto *lib = cast<moduledef::Library>(_dirs[0]);
+ EXPECT_EQ("foo.dll", lib->getName());
+
+ const std::vector<PECOFFLinkingContext::ExportDesc> &exports =
+ cast<moduledef::Exports>(_dirs[1])->getExports();
+ EXPECT_EQ(1U, exports.size());
+ verifyExportDesc(exports[0], "sym", -1, false, false);
+
+ auto *ver = cast<moduledef::Version>(_dirs[2]);
+ EXPECT_EQ(12, ver->getMajorVersion());
+}