[lld] r195774 - [PECOFF] Fix parameter mapping for /section.
Rui Ueyama
ruiu at google.com
Tue Nov 26 09:57:05 PST 2013
Author: ruiu
Date: Tue Nov 26 11:57:05 2013
New Revision: 195774
URL: http://llvm.org/viewvc/llvm-project?rev=195774&view=rev
Log:
[PECOFF] Fix parameter mapping for /section.
The current mapping for /section one character options is really bogus.
Map to the correct flags.
Modified:
lld/trunk/lib/Driver/WinLinkDriver.cpp
lld/trunk/unittests/DriverTests/WinLinkDriverTest.cpp
Modified: lld/trunk/lib/Driver/WinLinkDriver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/WinLinkDriver.cpp?rev=195774&r1=195773&r2=195774&view=diff
==============================================================================
--- lld/trunk/lib/Driver/WinLinkDriver.cpp (original)
+++ lld/trunk/lib/Driver/WinLinkDriver.cpp Tue Nov 26 11:57:05 2013
@@ -156,7 +156,7 @@ llvm::COFF::MachineTypes stringToMachine
//
// /section option is to set non-default bits in the Characteristics fields of
// the section header. D, E, K, P, R, S, and W represent discardable,
-// not_cachable, not_pageable, shared, execute, read, and write bits,
+// execute, not_cachable, not_pageable, read, shared, and write bits,
// respectively. You can specify multiple flags in one /section option.
//
// If the flag starts with "!", the flags represent a mask that should be turned
@@ -185,11 +185,11 @@ bool parseSection(StringRef option, std:
attribs |= flag; \
break
CASE('d', llvm::COFF::IMAGE_SCN_MEM_DISCARDABLE);
- CASE('e', llvm::COFF::IMAGE_SCN_MEM_NOT_CACHED);
- CASE('k', llvm::COFF::IMAGE_SCN_MEM_NOT_PAGED);
- CASE('p', llvm::COFF::IMAGE_SCN_MEM_SHARED);
- CASE('r', llvm::COFF::IMAGE_SCN_MEM_EXECUTE);
- CASE('s', llvm::COFF::IMAGE_SCN_MEM_READ);
+ CASE('e', llvm::COFF::IMAGE_SCN_MEM_EXECUTE);
+ CASE('k', llvm::COFF::IMAGE_SCN_MEM_NOT_CACHED);
+ CASE('p', llvm::COFF::IMAGE_SCN_MEM_NOT_PAGED);
+ CASE('r', llvm::COFF::IMAGE_SCN_MEM_READ);
+ CASE('s', llvm::COFF::IMAGE_SCN_MEM_SHARED);
CASE('w', llvm::COFF::IMAGE_SCN_MEM_WRITE);
#undef CASE
default:
Modified: lld/trunk/unittests/DriverTests/WinLinkDriverTest.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/unittests/DriverTests/WinLinkDriverTest.cpp?rev=195774&r1=195773&r2=195774&view=diff
==============================================================================
--- lld/trunk/unittests/DriverTests/WinLinkDriverTest.cpp (original)
+++ lld/trunk/unittests/DriverTests/WinLinkDriverTest.cpp Tue Nov 26 11:57:05 2013
@@ -236,6 +236,36 @@ TEST_F(WinLinkParserTest, SectionAlignme
EXPECT_EQ(8192U, _context.getSectionDefaultAlignment());
}
+TEST_F(WinLinkParserTest, InvalidAlignment) {
+ EXPECT_FALSE(parse("link.exe", "/align:1000", "a.obj", nullptr));
+ EXPECT_EQ("Section alignment must be a power of 2, but got 1000\n",
+ errorMessage());
+}
+
+TEST_F(WinLinkParserTest, Include) {
+ EXPECT_TRUE(parse("link.exe", "/include:foo", "a.out", nullptr));
+ auto symbols = _context.initialUndefinedSymbols();
+ EXPECT_FALSE(symbols.empty());
+ EXPECT_EQ("foo", symbols[0]);
+}
+
+TEST_F(WinLinkParserTest, Merge) {
+ EXPECT_TRUE(parse("link.exe", "/merge:.foo=.bar", "/merge:.bar=.baz",
+ "a.out", nullptr));
+ EXPECT_EQ(".baz", _context.getFinalSectionName(".foo"));
+ EXPECT_EQ(".baz", _context.getFinalSectionName(".bar"));
+ EXPECT_EQ(".abc", _context.getFinalSectionName(".abc"));
+}
+
+TEST_F(WinLinkParserTest, Merge_Circular) {
+ EXPECT_FALSE(parse("link.exe", "/merge:.foo=.bar", "/merge:.bar=.foo",
+ "a.out", nullptr));
+}
+
+//
+// Tests for /section
+//
+
TEST_F(WinLinkParserTest, Section) {
EXPECT_TRUE(parse("link.exe", "/section:.teXT,dekpRSW", "a.obj", nullptr));
uint32_t expect = llvm::COFF::IMAGE_SCN_MEM_DISCARDABLE |
@@ -267,31 +297,23 @@ TEST_F(WinLinkParserTest, SectionNegativ
EXPECT_EQ(expect, _context.getSectionAttributeMask(".teXT"));
}
-TEST_F(WinLinkParserTest, InvalidAlignment) {
- EXPECT_FALSE(parse("link.exe", "/align:1000", "a.obj", nullptr));
- EXPECT_EQ("Section alignment must be a power of 2, but got 1000\n",
- errorMessage());
-}
-
-TEST_F(WinLinkParserTest, Include) {
- EXPECT_TRUE(parse("link.exe", "/include:foo", "a.out", nullptr));
- auto symbols = _context.initialUndefinedSymbols();
- EXPECT_FALSE(symbols.empty());
- EXPECT_EQ("foo", symbols[0]);
-}
-
-TEST_F(WinLinkParserTest, Merge) {
- EXPECT_TRUE(parse("link.exe", "/merge:.foo=.bar", "/merge:.bar=.baz",
- "a.out", nullptr));
- EXPECT_EQ(".baz", _context.getFinalSectionName(".foo"));
- EXPECT_EQ(".baz", _context.getFinalSectionName(".bar"));
- EXPECT_EQ(".abc", _context.getFinalSectionName(".abc"));
-}
+#define TEST_SECTION(testname, arg, expect) \
+ TEST_F(WinLinkParserTest, testname) { \
+ EXPECT_TRUE(parse("link.exe", "/section:.text," arg, "a.obj", nullptr)); \
+ llvm::Optional<uint32_t> val = _context.getSectionAttributes(".text"); \
+ EXPECT_TRUE(val.hasValue()); \
+ EXPECT_EQ(expect, *val); \
+ }
+
+TEST_SECTION(SectionD, "d", llvm::COFF::IMAGE_SCN_MEM_DISCARDABLE);
+TEST_SECTION(SectionE, "e", llvm::COFF::IMAGE_SCN_MEM_EXECUTE);
+TEST_SECTION(SectionK, "k", llvm::COFF::IMAGE_SCN_MEM_NOT_CACHED);
+TEST_SECTION(SectionP, "p", llvm::COFF::IMAGE_SCN_MEM_NOT_PAGED);
+TEST_SECTION(SectionR, "r", llvm::COFF::IMAGE_SCN_MEM_READ);
+TEST_SECTION(SectionS, "s", llvm::COFF::IMAGE_SCN_MEM_SHARED);
+TEST_SECTION(SectionW, "w", llvm::COFF::IMAGE_SCN_MEM_WRITE);
-TEST_F(WinLinkParserTest, Merge_Circular) {
- EXPECT_FALSE(parse("link.exe", "/merge:.foo=.bar", "/merge:.bar=.foo",
- "a.out", nullptr));
-}
+#undef TEST_SECTION
//
// Tests for /defaultlib and /nodefaultlib.
More information about the llvm-commits
mailing list