<div dir="ltr"><span style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px">+#define TEST_SECTION(testname, arg, expect)                                  \</span><br style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px">
<span style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px">+  TEST_F(WinLinkParserTest, testname) {                                      \</span><br style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px">
<span style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px">+    EXPECT_TRUE(parse("link.exe", "/section:.text," arg, "a.obj", nullptr)); \</span><br style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px">
<span style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px">+    llvm::Optional<uint32_t> val = _context.getSectionAttributes(</span><span style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px">".text");   \</span><br style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px">
<span style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px">+    EXPECT_TRUE(val.hasValue());                                             \</span><br style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px">
<span style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px">+    EXPECT_EQ(expect, *val);                                                 \</span><br style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px">
<span style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px">+  }</span><br style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px"><span style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px">+</span><br style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px">
<span style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px">+TEST_SECTION(SectionD, "d", llvm::COFF::IMAGE_SCN_MEM_</span><span style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px">DISCARDABLE);</span><br style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px">
<span style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px">+TEST_SECTION(SectionE, "e", llvm::COFF::IMAGE_SCN_MEM_</span><span style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px">EXECUTE);</span><br style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px">
<span style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px">+TEST_SECTION(SectionK, "k", llvm::COFF::IMAGE_SCN_MEM_NOT_</span><span style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px">CACHED);</span><br style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px">
<span style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px">+TEST_SECTION(SectionP, "p", llvm::COFF::IMAGE_SCN_MEM_NOT_</span><span style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px">PAGED);</span><br style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px">
<span style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px">+TEST_SECTION(SectionR, "r", llvm::COFF::IMAGE_SCN_MEM_</span><span style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px">READ);</span><br style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px">
<span style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px">+TEST_SECTION(SectionS, "s", llvm::COFF::IMAGE_SCN_MEM_</span><span style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px">SHARED);</span><br style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px">
<span style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px">+TEST_SECTION(SectionW, "w", llvm::COFF::IMAGE_SCN_MEM_</span><span style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px">WRITE);</span><br>
<div><span style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px"><br></span></div><div><span style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px">Is there a better way to test this? It seems like all it's doing is checking is whether you typed (pasted?) the same thing in two different files; this same sort of test doesn't seem like it would have caught the bug that you are fixing in this commit.</span></div>
<div><span style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px"><br></span></div><div><span style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:13px">-- Sean Silva</span></div></div><div class="gmail_extra">
<br><br><div class="gmail_quote">On Tue, Nov 26, 2013 at 12:57 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: Tue Nov 26 11:57:05 2013<br>
New Revision: 195774<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=195774&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=195774&view=rev</a><br>
Log:<br>
[PECOFF] Fix parameter mapping for /section.<br>
<br>
The current mapping for /section one character options is really bogus.<br>
Map to the correct flags.<br>
<br>
Modified:<br>
    lld/trunk/lib/Driver/WinLinkDriver.cpp<br>
    lld/trunk/unittests/DriverTests/WinLinkDriverTest.cpp<br>
<br>
Modified: lld/trunk/lib/Driver/WinLinkDriver.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/WinLinkDriver.cpp?rev=195774&r1=195773&r2=195774&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/WinLinkDriver.cpp?rev=195774&r1=195773&r2=195774&view=diff</a><br>

==============================================================================<br>
--- lld/trunk/lib/Driver/WinLinkDriver.cpp (original)<br>
+++ lld/trunk/lib/Driver/WinLinkDriver.cpp Tue Nov 26 11:57:05 2013<br>
@@ -156,7 +156,7 @@ llvm::COFF::MachineTypes stringToMachine<br>
 //<br>
 // /section option is to set non-default bits in the Characteristics fields of<br>
 // the section header. D, E, K, P, R, S, and W represent discardable,<br>
-// not_cachable, not_pageable, shared, execute, read, and write bits,<br>
+// execute, not_cachable, not_pageable, read, shared, and write bits,<br>
 // respectively. You can specify multiple flags in one /section option.<br>
 //<br>
 // If the flag starts with "!", the flags represent a mask that should be turned<br>
@@ -185,11 +185,11 @@ bool parseSection(StringRef option, std:<br>
       attribs |= flag;                          \<br>
       break<br>
     CASE('d', llvm::COFF::IMAGE_SCN_MEM_DISCARDABLE);<br>
-    CASE('e', llvm::COFF::IMAGE_SCN_MEM_NOT_CACHED);<br>
-    CASE('k', llvm::COFF::IMAGE_SCN_MEM_NOT_PAGED);<br>
-    CASE('p', llvm::COFF::IMAGE_SCN_MEM_SHARED);<br>
-    CASE('r', llvm::COFF::IMAGE_SCN_MEM_EXECUTE);<br>
-    CASE('s', llvm::COFF::IMAGE_SCN_MEM_READ);<br>
+    CASE('e', llvm::COFF::IMAGE_SCN_MEM_EXECUTE);<br>
+    CASE('k', llvm::COFF::IMAGE_SCN_MEM_NOT_CACHED);<br>
+    CASE('p', llvm::COFF::IMAGE_SCN_MEM_NOT_PAGED);<br>
+    CASE('r', llvm::COFF::IMAGE_SCN_MEM_READ);<br>
+    CASE('s', llvm::COFF::IMAGE_SCN_MEM_SHARED);<br>
     CASE('w', llvm::COFF::IMAGE_SCN_MEM_WRITE);<br>
 #undef CASE<br>
     default:<br>
<br>
Modified: lld/trunk/unittests/DriverTests/WinLinkDriverTest.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/unittests/DriverTests/WinLinkDriverTest.cpp?rev=195774&r1=195773&r2=195774&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/unittests/DriverTests/WinLinkDriverTest.cpp?rev=195774&r1=195773&r2=195774&view=diff</a><br>

==============================================================================<br>
--- lld/trunk/unittests/DriverTests/WinLinkDriverTest.cpp (original)<br>
+++ lld/trunk/unittests/DriverTests/WinLinkDriverTest.cpp Tue Nov 26 11:57:05 2013<br>
@@ -236,6 +236,36 @@ TEST_F(WinLinkParserTest, SectionAlignme<br>
   EXPECT_EQ(8192U, _context.getSectionDefaultAlignment());<br>
 }<br>
<br>
+TEST_F(WinLinkParserTest, InvalidAlignment) {<br>
+  EXPECT_FALSE(parse("link.exe", "/align:1000", "a.obj", nullptr));<br>
+  EXPECT_EQ("Section alignment must be a power of 2, but got 1000\n",<br>
+            errorMessage());<br>
+}<br>
+<br>
+TEST_F(WinLinkParserTest, Include) {<br>
+  EXPECT_TRUE(parse("link.exe", "/include:foo", "a.out", nullptr));<br>
+  auto symbols = _context.initialUndefinedSymbols();<br>
+  EXPECT_FALSE(symbols.empty());<br>
+  EXPECT_EQ("foo", symbols[0]);<br>
+}<br>
+<br>
+TEST_F(WinLinkParserTest, Merge) {<br>
+  EXPECT_TRUE(parse("link.exe", "/merge:.foo=.bar", "/merge:.bar=.baz",<br>
+                    "a.out", nullptr));<br>
+  EXPECT_EQ(".baz", _context.getFinalSectionName(".foo"));<br>
+  EXPECT_EQ(".baz", _context.getFinalSectionName(".bar"));<br>
+  EXPECT_EQ(".abc", _context.getFinalSectionName(".abc"));<br>
+}<br>
+<br>
+TEST_F(WinLinkParserTest, Merge_Circular) {<br>
+  EXPECT_FALSE(parse("link.exe", "/merge:.foo=.bar", "/merge:.bar=.foo",<br>
+                     "a.out", nullptr));<br>
+}<br>
+<br>
+//<br>
+// Tests for /section<br>
+//<br>
+<br>
 TEST_F(WinLinkParserTest, Section) {<br>
   EXPECT_TRUE(parse("link.exe", "/section:.teXT,dekpRSW", "a.obj", nullptr));<br>
   uint32_t expect = llvm::COFF::IMAGE_SCN_MEM_DISCARDABLE |<br>
@@ -267,31 +297,23 @@ TEST_F(WinLinkParserTest, SectionNegativ<br>
   EXPECT_EQ(expect, _context.getSectionAttributeMask(".teXT"));<br>
 }<br>
<br>
-TEST_F(WinLinkParserTest, InvalidAlignment) {<br>
-  EXPECT_FALSE(parse("link.exe", "/align:1000", "a.obj", nullptr));<br>
-  EXPECT_EQ("Section alignment must be a power of 2, but got 1000\n",<br>
-            errorMessage());<br>
-}<br>
-<br>
-TEST_F(WinLinkParserTest, Include) {<br>
-  EXPECT_TRUE(parse("link.exe", "/include:foo", "a.out", nullptr));<br>
-  auto symbols = _context.initialUndefinedSymbols();<br>
-  EXPECT_FALSE(symbols.empty());<br>
-  EXPECT_EQ("foo", symbols[0]);<br>
-}<br>
-<br>
-TEST_F(WinLinkParserTest, Merge) {<br>
-  EXPECT_TRUE(parse("link.exe", "/merge:.foo=.bar", "/merge:.bar=.baz",<br>
-                    "a.out", nullptr));<br>
-  EXPECT_EQ(".baz", _context.getFinalSectionName(".foo"));<br>
-  EXPECT_EQ(".baz", _context.getFinalSectionName(".bar"));<br>
-  EXPECT_EQ(".abc", _context.getFinalSectionName(".abc"));<br>
-}<br>
+#define TEST_SECTION(testname, arg, expect)                                  \<br>
+  TEST_F(WinLinkParserTest, testname) {                                      \<br>
+    EXPECT_TRUE(parse("link.exe", "/section:.text," arg, "a.obj", nullptr)); \<br>
+    llvm::Optional<uint32_t> val = _context.getSectionAttributes(".text");   \<br>
+    EXPECT_TRUE(val.hasValue());                                             \<br>
+    EXPECT_EQ(expect, *val);                                                 \<br>
+  }<br>
+<br>
+TEST_SECTION(SectionD, "d", llvm::COFF::IMAGE_SCN_MEM_DISCARDABLE);<br>
+TEST_SECTION(SectionE, "e", llvm::COFF::IMAGE_SCN_MEM_EXECUTE);<br>
+TEST_SECTION(SectionK, "k", llvm::COFF::IMAGE_SCN_MEM_NOT_CACHED);<br>
+TEST_SECTION(SectionP, "p", llvm::COFF::IMAGE_SCN_MEM_NOT_PAGED);<br>
+TEST_SECTION(SectionR, "r", llvm::COFF::IMAGE_SCN_MEM_READ);<br>
+TEST_SECTION(SectionS, "s", llvm::COFF::IMAGE_SCN_MEM_SHARED);<br>
+TEST_SECTION(SectionW, "w", llvm::COFF::IMAGE_SCN_MEM_WRITE);<br>
<br>
-TEST_F(WinLinkParserTest, Merge_Circular) {<br>
-  EXPECT_FALSE(parse("link.exe", "/merge:.foo=.bar", "/merge:.bar=.foo",<br>
-                     "a.out", nullptr));<br>
-}<br>
+#undef TEST_SECTION<br>
<br>
 //<br>
 // Tests for /defaultlib and /nodefaultlib.<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>