diff options
-rw-r--r-- | lld/include/lld/ReaderWriter/PECOFFTargetInfo.h | 6 | ||||
-rw-r--r-- | lld/lib/Driver/WinLinkDriver.cpp | 4 | ||||
-rw-r--r-- | lld/lib/Driver/WinLinkOptions.td | 5 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp | 7 | ||||
-rw-r--r-- | lld/unittests/DriverTests/WinLinkDriverTest.cpp | 11 |
5 files changed, 30 insertions, 3 deletions
diff --git a/lld/include/lld/ReaderWriter/PECOFFTargetInfo.h b/lld/include/lld/ReaderWriter/PECOFFTargetInfo.h index 3e6e649b4d6..744e7581a4e 100644 --- a/lld/include/lld/ReaderWriter/PECOFFTargetInfo.h +++ b/lld/include/lld/ReaderWriter/PECOFFTargetInfo.h @@ -26,7 +26,7 @@ public: : _stackReserve(1024 * 1024), _stackCommit(4096), _heapReserve(1024 * 1024), _heapCommit(4096), _subsystem(llvm::COFF::IMAGE_SUBSYSTEM_UNKNOWN), _minOSVersion(6, 0), - _nxCompat(true) {} + _nxCompat(true), _largeAddressAware(false) {} struct OSVersion { OSVersion(int v1, int v2) : majorVersion(v1), minorVersion(v2) {} @@ -62,6 +62,9 @@ public: void setNxCompat(bool nxCompat) { _nxCompat = nxCompat; } bool getNxCompat() const { return _nxCompat; } + void setLargeAddressAware(bool option) { _largeAddressAware = option; } + bool getLargeAddressAware() const { return _largeAddressAware; } + virtual ErrorOr<Reference::Kind> relocKindFromString(StringRef str) const; virtual ErrorOr<std::string> stringFromRelocKind(Reference::Kind kind) const; @@ -80,6 +83,7 @@ private: llvm::COFF::WindowsSubsystem _subsystem; OSVersion _minOSVersion; bool _nxCompat; + bool _largeAddressAware; mutable std::unique_ptr<Reader> _reader; mutable std::unique_ptr<Writer> _writer; diff --git a/lld/lib/Driver/WinLinkDriver.cpp b/lld/lib/Driver/WinLinkDriver.cpp index f19ce14a3a6..873dfb159bf 100644 --- a/lld/lib/Driver/WinLinkDriver.cpp +++ b/lld/lib/Driver/WinLinkDriver.cpp @@ -262,6 +262,10 @@ bool WinLinkDriver::parse(int argc, const char *argv[], if (parsedArgs->getLastArg(OPT_no_nxcompat)) info.setNxCompat(false); + // Hanlde -largeaddressaware + if (parsedArgs->getLastArg(OPT_largeaddressaware)) + info.setLargeAddressAware(true); + // Hanlde -out if (llvm::opt::Arg *outpath = parsedArgs->getLastArg(OPT_out)) info.setOutputPath(outpath->getValue()); diff --git a/lld/lib/Driver/WinLinkOptions.td b/lld/lib/Driver/WinLinkOptions.td index 2fa8762d042..8669ca8fb65 100644 --- a/lld/lib/Driver/WinLinkOptions.td +++ b/lld/lib/Driver/WinLinkOptions.td @@ -33,5 +33,10 @@ def nxcompat : Flag<["-", "/"], "nxcompat">, def no_nxcompat : Flag<["-", "/"], "nxcompat:no">, HelpText<"Disable data execution provention">; +def largeaddressaware : Flag<["-", "/"], "largeaddressaware">, + HelpText<"Enable large addresses">; +def no_largeaddressaware : Flag<["-", "/"], "largeaddressaware:no">, + HelpText<"Disable large addresses">; + def help : Flag<["-", "/"], "help">; def help_q : Flag<["-", "/"], "?">, Alias<help>; diff --git a/lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp b/lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp index f56aba3f5a4..1fa1d64d6a8 100644 --- a/lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp +++ b/lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp @@ -151,8 +151,11 @@ public: _coffHeader.SizeOfOptionalHeader = 224; // Attributes of the executable. - _coffHeader.Characteristics = llvm::COFF::IMAGE_FILE_32BIT_MACHINE | - llvm::COFF::IMAGE_FILE_EXECUTABLE_IMAGE; + uint16_t characteristics = llvm::COFF::IMAGE_FILE_32BIT_MACHINE | + llvm::COFF::IMAGE_FILE_EXECUTABLE_IMAGE; + if (targetInfo.getLargeAddressAware()) + characteristics |= llvm::COFF::IMAGE_FILE_LARGE_ADDRESS_AWARE; + _coffHeader.Characteristics = characteristics; // 0x10b indicates a normal PE32 executable. For PE32+ it should be 0x20b. _peHeader.Magic = 0x10b; diff --git a/lld/unittests/DriverTests/WinLinkDriverTest.cpp b/lld/unittests/DriverTests/WinLinkDriverTest.cpp index 16dce75beaf..6e02cee1427 100644 --- a/lld/unittests/DriverTests/WinLinkDriverTest.cpp +++ b/lld/unittests/DriverTests/WinLinkDriverTest.cpp @@ -48,6 +48,7 @@ TEST_F(WinLinkParserTest, Basic) { EXPECT_EQ(4096, info->getStackCommit()); EXPECT_FALSE(info->allowRemainingUndefines()); EXPECT_TRUE(info->getNxCompat()); + EXPECT_FALSE(info->getLargeAddressAware()); } TEST_F(WinLinkParserTest, WindowsStyleOption) { @@ -121,4 +122,14 @@ TEST_F(WinLinkParserTest, NoNxCompat) { EXPECT_FALSE(info->getNxCompat()); } +TEST_F(WinLinkParserTest, LargeAddressAware) { + parse("link.exe", "-largeaddressaware", nullptr); + EXPECT_TRUE(info->getLargeAddressAware()); +} + +TEST_F(WinLinkParserTest, NoLargeAddressAware) { + parse("link.exe", "-largeaddressaware:no", nullptr); + EXPECT_FALSE(info->getLargeAddressAware()); +} + } // end anonymous namespace |