<div dir="ltr">Nice!</div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Feb 2, 2015 at 10:42 PM, Rui Ueyama <span dir="ltr"><<a href="mailto:ruiu@google.com" target="_blank">ruiu@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: ruiu<br>
Date: Mon Feb  2 18:42:36 2015<br>
New Revision: 227902<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=227902&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=227902&view=rev</a><br>
Log:<br>
ELF: Improve linker script unit tests.<br>
<br>
This patch is to enable to write unit tests for linker script with<br>
less boilerplate code.<br>
<br>
Modified:<br>
    lld/trunk/include/lld/Driver/Driver.h<br>
    lld/trunk/lib/Driver/GnuLdDriver.cpp<br>
    lld/trunk/unittests/DriverTests/GnuLdDriverTest.cpp<br>
<br>
Modified: lld/trunk/include/lld/Driver/Driver.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/Driver/Driver.h?rev=227902&r1=227901&r2=227902&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/Driver/Driver.h?rev=227902&r1=227901&r2=227902&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/include/lld/Driver/Driver.h (original)<br>
+++ lld/trunk/include/lld/Driver/Driver.h Mon Feb  2 18:42:36 2015<br>
@@ -82,6 +82,10 @@ public:<br>
                                           std::unique_ptr<MemoryBuffer> mb,<br>
                                           raw_ostream &diag);<br>
<br>
+  /// A factory method to create an instance of ELFLinkingContext.<br>
+  static std::unique_ptr<ELFLinkingContext><br>
+  createELFLinkingContext(llvm::Triple triple);<br>
+<br>
 private:<br>
   static llvm::Triple getDefaultTarget(const char *progName);<br>
   static bool applyEmulation(llvm::Triple &triple,<br>
@@ -137,7 +141,6 @@ private:<br>
 /// Driver for lld unit tests<br>
 class CoreDriver : public Driver {<br>
 public:<br>
-<br>
   /// Parses command line arguments same as lld-core and performs link.<br>
   /// Returns true iff there was an error.<br>
   static bool link(int argc, const char *argv[],<br>
<br>
Modified: lld/trunk/lib/Driver/GnuLdDriver.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/GnuLdDriver.cpp?rev=227902&r1=227901&r2=227902&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/GnuLdDriver.cpp?rev=227902&r1=227901&r2=227902&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/lib/Driver/GnuLdDriver.cpp (original)<br>
+++ lld/trunk/lib/Driver/GnuLdDriver.cpp Mon Feb  2 18:42:36 2015<br>
@@ -311,22 +311,21 @@ bool GnuLdDriver::applyEmulation(llvm::T<br>
   return true;<br>
 }<br>
<br>
-#define LLVM_TARGET(targetName) \<br>
-  if ((p = elf::targetName##LinkingContext::create(triple))) return p;<br>
-<br>
 std::unique_ptr<ELFLinkingContext><br>
-createELFLinkingContext(llvm::Triple triple) {<br>
+GnuLdDriver::createELFLinkingContext(llvm::Triple triple) {<br>
   std::unique_ptr<ELFLinkingContext> p;<br>
   // FIXME: #include "llvm/Config/Targets.def"<br>
+#define LLVM_TARGET(targetName) \<br>
+  if ((p = elf::targetName##LinkingContext::create(triple))) return p;<br>
   LLVM_TARGET(AArch64)<br>
   LLVM_TARGET(ARM)<br>
   LLVM_TARGET(Hexagon)<br>
   LLVM_TARGET(Mips)<br>
   LLVM_TARGET(X86)<br>
   LLVM_TARGET(X86_64)<br>
+#undef LLVM_TARGET<br>
   return nullptr;<br>
 }<br>
-#undef LLVM_TARGET<br>
<br>
 bool GnuLdDriver::parse(int argc, const char *argv[],<br>
                         std::unique_ptr<ELFLinkingContext> &context,<br>
<br>
Modified: lld/trunk/unittests/DriverTests/GnuLdDriverTest.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/unittests/DriverTests/GnuLdDriverTest.cpp?rev=227902&r1=227901&r2=227902&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/unittests/DriverTests/GnuLdDriverTest.cpp?rev=227902&r1=227901&r2=227902&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/unittests/DriverTests/GnuLdDriverTest.cpp (original)<br>
+++ lld/trunk/unittests/DriverTests/GnuLdDriverTest.cpp Mon Feb  2 18:42:36 2015<br>
@@ -20,12 +20,31 @@ using namespace llvm;<br>
 using namespace lld;<br>
<br>
 namespace {<br>
+<br>
 class GnuLdParserTest<br>
     : public ParserTest<GnuLdDriver, std::unique_ptr<ELFLinkingContext>> {<br>
 protected:<br>
   const LinkingContext *linkingContext() override { return _context.get(); }<br>
 };<br>
-}<br>
+<br>
+class LinkerScriptTest : public testing::Test {<br>
+protected:<br>
+  void parse(StringRef script) {<br>
+    llvm::Triple triple(llvm::sys::getDefaultTargetTriple());<br>
+    _ctx = std::move(GnuLdDriver::createELFLinkingContext(triple));<br>
+    std::unique_ptr<MemoryBuffer> mb = MemoryBuffer::getMemBuffer(<br>
+      script, "foo.so");<br>
+    std::string s;<br>
+    raw_string_ostream out(s);<br>
+    std::error_code ec = GnuLdDriver::evalLinkerScript(<br>
+      *_ctx, std::move(mb), out);<br>
+    EXPECT_FALSE(ec);<br>
+  };<br>
+<br>
+  std::unique_ptr<ELFLinkingContext> _ctx;<br>
+};<br>
+<br>
+} // anonymous namespace<br>
<br>
 TEST_F(GnuLdParserTest, Empty) {<br>
   EXPECT_FALSE(parse("ld", nullptr));<br>
@@ -162,58 +181,28 @@ TEST_F(GnuLdParserTest, AsNeeded) {<br>
<br>
 // Linker script<br>
<br>
-TEST_F(GnuLdParserTest, LinkerScriptGroup) {<br>
-  parse("ld", "a.o", nullptr);<br>
-  std::unique_ptr<MemoryBuffer> mb = MemoryBuffer::getMemBuffer(<br>
-    "GROUP(/x /y)", "foo.so");<br>
-  std::string s;<br>
-  raw_string_ostream out(s);<br>
-  std::error_code ec = GnuLdDriver::evalLinkerScript(<br>
-    *_context, std::move(mb), out);<br>
-  EXPECT_FALSE(ec);<br>
-  std::vector<std::unique_ptr<Node>> &nodes = _context->getNodes();<br>
-  EXPECT_EQ((size_t)4, nodes.size());<br>
-  EXPECT_EQ("/x", cast<FileNode>(nodes[1].get())->getFile()->path());<br>
-  EXPECT_EQ("/y", cast<FileNode>(nodes[2].get())->getFile()->path());<br>
-  EXPECT_EQ(2, cast<GroupEnd>(nodes[3].get())->getSize());<br>
-}<br>
-<br>
-TEST_F(GnuLdParserTest, LinkerScriptSearchDir) {<br>
-  parse("ld", "a.o", nullptr);<br>
-  std::unique_ptr<MemoryBuffer> mb = MemoryBuffer::getMemBuffer(<br>
-    "SEARCH_DIR(\"/foo/bar\")", "foo.so");<br>
-  std::string s;<br>
-  raw_string_ostream out(s);<br>
-  std::error_code ec = GnuLdDriver::evalLinkerScript(<br>
-    *_context, std::move(mb), out);<br>
-  EXPECT_FALSE(ec);<br>
-  std::vector<StringRef> searchPaths = _context->getSearchPaths();<br>
-  EXPECT_EQ((size_t)2, searchPaths.size());<br>
-  EXPECT_EQ("/foo/bar", searchPaths[1]);<br>
-}<br>
-<br>
-TEST_F(GnuLdParserTest, LinkerScriptEntry) {<br>
-  parse("ld", "a.o", nullptr);<br>
-  std::unique_ptr<MemoryBuffer> mb = MemoryBuffer::getMemBuffer(<br>
-    "ENTRY(blah)", "foo.so");<br>
-  std::string s;<br>
-  raw_string_ostream out(s);<br>
-  std::error_code ec = GnuLdDriver::evalLinkerScript(<br>
-    *_context, std::move(mb), out);<br>
-  EXPECT_FALSE(ec);<br>
-  StringRef entrySymbol = _context->entrySymbolName();<br>
-  EXPECT_EQ("blah", entrySymbol);<br>
-}<br>
-<br>
-TEST_F(GnuLdParserTest, LinkerScriptOutput) {<br>
-  parse("ld", "a.o", nullptr);<br>
-  std::unique_ptr<MemoryBuffer> mb = MemoryBuffer::getMemBuffer(<br>
-    "OUTPUT(\"/path/to/output\")", "foo.so");<br>
-  std::string s;<br>
-  raw_string_ostream out(s);<br>
-  std::error_code ec = GnuLdDriver::evalLinkerScript(<br>
-    *_context, std::move(mb), out);<br>
-  EXPECT_FALSE(ec);<br>
-  StringRef output = _context->outputPath();<br>
-  EXPECT_EQ("/path/to/output", output);<br>
+TEST_F(LinkerScriptTest, Group) {<br>
+  parse("GROUP(/x /y)");<br>
+  std::vector<std::unique_ptr<Node>> &nodes = _ctx->getNodes();<br>
+  EXPECT_EQ((size_t)3, nodes.size());<br>
+  EXPECT_EQ("/x", cast<FileNode>(nodes[0].get())->getFile()->path());<br>
+  EXPECT_EQ("/y", cast<FileNode>(nodes[1].get())->getFile()->path());<br>
+  EXPECT_EQ(2, cast<GroupEnd>(nodes[2].get())->getSize());<br>
+}<br>
+<br>
+TEST_F(LinkerScriptTest, SearchDir) {<br>
+  parse("SEARCH_DIR(\"/foo/bar\")");<br>
+  std::vector<StringRef> paths = _ctx->getSearchPaths();<br>
+  EXPECT_EQ((size_t)1, paths.size());<br>
+  EXPECT_EQ("/foo/bar", paths[0]);<br>
+}<br>
+<br>
+TEST_F(LinkerScriptTest, Entry) {<br>
+  parse("ENTRY(blah)");<br>
+  EXPECT_EQ("blah", _ctx->entrySymbolName());<br>
+}<br>
+<br>
+TEST_F(LinkerScriptTest, Output) {<br>
+  parse("OUTPUT(\"/path/to/output\")");<br>
+  EXPECT_EQ("/path/to/output", _ctx->outputPath());<br>
 }<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>