[lld] r183604 - [PECOFF][Driver] Add -stack command line option.
Rui Ueyama
ruiu at google.com
Fri Jun 7 20:59:00 PDT 2013
Author: ruiu
Date: Fri Jun 7 22:59:00 2013
New Revision: 183604
URL: http://llvm.org/viewvc/llvm-project?rev=183604&view=rev
Log:
[PECOFF][Driver] Add -stack command line option.
Modified:
lld/trunk/include/lld/ReaderWriter/PECOFFTargetInfo.h
lld/trunk/lib/Driver/WinLinkDriver.cpp
lld/trunk/lib/Driver/WinLinkOptions.td
lld/trunk/lib/ReaderWriter/PECOFF/PECOFFTargetInfo.cpp
lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp
lld/trunk/unittests/DriverTests/WinLinkDriverTest.cpp
Modified: lld/trunk/include/lld/ReaderWriter/PECOFFTargetInfo.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/PECOFFTargetInfo.h?rev=183604&r1=183603&r2=183604&view=diff
==============================================================================
--- lld/trunk/include/lld/ReaderWriter/PECOFFTargetInfo.h (original)
+++ lld/trunk/include/lld/ReaderWriter/PECOFFTargetInfo.h Fri Jun 7 22:59:00 2013
@@ -23,9 +23,17 @@ namespace lld {
class PECOFFTargetInfo : public TargetInfo {
public:
PECOFFTargetInfo()
- : _subsystem(llvm::COFF::IMAGE_SUBSYSTEM_UNKNOWN),
+ : _stackReserve(1024 * 1024),
+ _stackCommit(4096),
+ _subsystem(llvm::COFF::IMAGE_SUBSYSTEM_UNKNOWN),
_minOSVersion(6, 0) {}
+ struct OSVersion {
+ OSVersion(int v1, int v2) : majorVersion(v1), minorVersion(v2) {}
+ int majorVersion;
+ int minorVersion;
+ };
+
virtual error_code parseFile(
std::unique_ptr<MemoryBuffer> &mb,
std::vector<std::unique_ptr<File>> &result) const;
@@ -35,30 +43,20 @@ public:
virtual void addPasses(PassManager &pm) const {}
- void setSubsystem(llvm::COFF::WindowsSubsystem subsystem) {
- _subsystem = subsystem;
- }
+ void setStackReserve(uint64_t size) { _stackReserve = size; }
+ uint64_t getStackReserve() const { return _stackReserve; }
- llvm::COFF::WindowsSubsystem getSubsystem() const {
- return _subsystem;
- }
-
- virtual ErrorOr<Reference::Kind> relocKindFromString(StringRef str) const;
- virtual ErrorOr<std::string> stringFromRelocKind(Reference::Kind kind) const;
+ void setStackCommit(uint64_t size) { _stackCommit = size; }
+ uint64_t getStackCommit() const { return _stackCommit; }
- struct OSVersion {
- OSVersion(int v1, int v2) : majorVersion(v1), minorVersion(v2) {}
- int majorVersion;
- int minorVersion;
- };
+ void setSubsystem(llvm::COFF::WindowsSubsystem ss) { _subsystem = ss; }
+ llvm::COFF::WindowsSubsystem getSubsystem() const { return _subsystem; }
- void setMinOSVersion(const OSVersion &version) {
- _minOSVersion = version;
- }
+ void setMinOSVersion(const OSVersion &version) { _minOSVersion = version; }
+ OSVersion getMinOSVersion() const { return _minOSVersion; }
- OSVersion getMinOSVersion() const {
- return _minOSVersion;
- }
+ virtual ErrorOr<Reference::Kind> relocKindFromString(StringRef str) const;
+ virtual ErrorOr<std::string> stringFromRelocKind(Reference::Kind kind) const;
StringRef allocateString(const StringRef &ref) {
char *x = _extraStrings.Allocate<char>(ref.size() + 1);
@@ -68,6 +66,8 @@ public:
}
private:
+ uint64_t _stackReserve;
+ uint64_t _stackCommit;
llvm::COFF::WindowsSubsystem _subsystem;
OSVersion _minOSVersion;
Modified: lld/trunk/lib/Driver/WinLinkDriver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/WinLinkDriver.cpp?rev=183604&r1=183603&r2=183604&view=diff
==============================================================================
--- lld/trunk/lib/Driver/WinLinkDriver.cpp (original)
+++ lld/trunk/lib/Driver/WinLinkDriver.cpp Fri Jun 7 22:59:00 2013
@@ -66,20 +66,10 @@ int findDoubleDash(int argc, const char
return -1;
}
-// Returns subsystem type for the given string.
-llvm::COFF::WindowsSubsystem stringToWinSubsystem(StringRef str) {
- std::string arg(str.lower());
- return llvm::StringSwitch<llvm::COFF::WindowsSubsystem>(arg)
- .Case("windows", llvm::COFF::IMAGE_SUBSYSTEM_WINDOWS_GUI)
- .Case("console", llvm::COFF::IMAGE_SUBSYSTEM_WINDOWS_CUI)
- .Default(llvm::COFF::IMAGE_SUBSYSTEM_UNKNOWN);
-}
-
-
// Displays error message if the given version does not match with
// /^\d+$/.
-bool checkOSVersion(StringRef version, const char *errorMessage,
- raw_ostream &diagnostics) {
+bool checkNumber(StringRef version, const char *errorMessage,
+ raw_ostream &diagnostics) {
if (version.str().find_first_not_of("0123456789") != std::string::npos
|| version.empty()) {
diagnostics << "error: " << errorMessage << version << "\n";
@@ -88,15 +78,41 @@ bool checkOSVersion(StringRef version, c
return true;
}
-bool parseMinOSVersion(PECOFFTargetInfo &info, StringRef &osVersion,
+// Parse -stack command line option. The form of the option is
+// "-stack:stackReserveSize[,stackCommitSize]".
+bool parseStackOption(PECOFFTargetInfo &info, const StringRef &arg,
+ raw_ostream &diagnostics) {
+ StringRef reserve, commit;
+ llvm::tie(reserve, commit) = arg.split(',');
+ if (!checkNumber(reserve, "invalid stack size: ", diagnostics))
+ return false;
+ info.setStackReserve(atoi(reserve.str().c_str()));
+ if (!commit.empty()) {
+ if (!checkNumber(commit, "invalid stack size: ", diagnostics))
+ return false;
+ info.setStackCommit(atoi(commit.str().c_str()));
+ }
+ return true;
+}
+
+// Returns subsystem type for the given string.
+llvm::COFF::WindowsSubsystem stringToWinSubsystem(StringRef str) {
+ std::string arg(str.lower());
+ return llvm::StringSwitch<llvm::COFF::WindowsSubsystem>(arg)
+ .Case("windows", llvm::COFF::IMAGE_SUBSYSTEM_WINDOWS_GUI)
+ .Case("console", llvm::COFF::IMAGE_SUBSYSTEM_WINDOWS_CUI)
+ .Default(llvm::COFF::IMAGE_SUBSYSTEM_UNKNOWN);
+}
+
+bool parseMinOSVersion(PECOFFTargetInfo &info, const StringRef &osVersion,
raw_ostream &diagnostics) {
StringRef majorVersion, minorVersion;
llvm::tie(majorVersion, minorVersion) = osVersion.split('.');
if (minorVersion.empty())
minorVersion = "0";
- if (!checkOSVersion(majorVersion, "invalid OS major version: ", diagnostics))
+ if (!checkNumber(majorVersion, "invalid OS major version: ", diagnostics))
return false;
- if (!checkOSVersion(minorVersion, "invalid OS minor version: ", diagnostics))
+ if (!checkNumber(minorVersion, "invalid OS minor version: ", diagnostics))
return false;
PECOFFTargetInfo::OSVersion minOSVersion(atoi(majorVersion.str().c_str()),
atoi(minorVersion.str().c_str()));
@@ -195,6 +211,11 @@ bool WinLinkDriver::parse(int argc, cons
info.appendLLVMOption((*it)->getValue());
}
+ // Handle -stack
+ if (llvm::opt::Arg *arg = parsedArgs->getLastArg(OPT_stack))
+ if (!parseStackOption(info, arg->getValue(), diagnostics))
+ return true;
+
// Handle -subsystem
if (llvm::opt::Arg *arg = parsedArgs->getLastArg(OPT_subsystem))
if (!parseSubsystemOption(info, arg->getValue(), diagnostics))
Modified: lld/trunk/lib/Driver/WinLinkOptions.td
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/WinLinkOptions.td?rev=183604&r1=183603&r2=183604&view=diff
==============================================================================
--- lld/trunk/lib/Driver/WinLinkOptions.td (original)
+++ lld/trunk/lib/Driver/WinLinkOptions.td Fri Jun 7 22:59:00 2013
@@ -9,6 +9,10 @@ def out : Separate<["-", "/"], "out">,
HelpText<"Path to file to write output">;
def out_c : Joined<["-", "/"], "out:">, Alias<out>;
+def stack : Separate<["-", "/"], "stack">,
+ HelpText<"Size of the stack">;
+def stack_c: Joined<["-", "/"], "stack:">, Alias<stack>;
+
def subsystem : Separate<["-", "/"], "subsystem">,
HelpText<"Specify subsystem">;
def subsystem_c: Joined<["-", "/"], "subsystem:">, Alias<subsystem>;
Modified: lld/trunk/lib/ReaderWriter/PECOFF/PECOFFTargetInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/PECOFFTargetInfo.cpp?rev=183604&r1=183603&r2=183604&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/PECOFFTargetInfo.cpp (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/PECOFFTargetInfo.cpp Fri Jun 7 22:59:00 2013
@@ -23,6 +23,13 @@ error_code PECOFFTargetInfo::parseFile(
}
bool PECOFFTargetInfo::validate(raw_ostream &diagnostics) {
+ if (_stackReserve < _stackCommit) {
+ diagnostics << "Invalid stack size: reserve size must be equal to or "
+ << "greater than commit size, but got "
+ << _stackCommit << " and " << _stackReserve << ".\n";
+ return true;
+ }
+
_reader = createReaderPECOFF(*this);
_writer = createWriterPECOFF(*this);
return false;
Modified: lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp?rev=183604&r1=183603&r2=183604&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp Fri Jun 7 22:59:00 2013
@@ -155,8 +155,8 @@ public:
| llvm::COFF::IMAGE_DLL_CHARACTERISTICS_NX_COMPAT
| llvm::COFF::IMAGE_DLL_CHARACTERISTICS_TERMINAL_SERVER_AWARE;
- _peHeader.SizeOfStackReserve = 0x100000;
- _peHeader.SizeOfStackCommit = 0x1000;
+ _peHeader.SizeOfStackReserve = targetInfo.getStackReserve();
+ _peHeader.SizeOfStackCommit = targetInfo.getStackCommit();
_peHeader.SizeOfHeapReserve = 0x100000;
_peHeader.SizeOfHeapCommit = 0x1000;
Modified: lld/trunk/unittests/DriverTests/WinLinkDriverTest.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/unittests/DriverTests/WinLinkDriverTest.cpp?rev=183604&r1=183603&r2=183604&view=diff
==============================================================================
--- lld/trunk/unittests/DriverTests/WinLinkDriverTest.cpp (original)
+++ lld/trunk/unittests/DriverTests/WinLinkDriverTest.cpp Fri Jun 7 22:59:00 2013
@@ -44,6 +44,8 @@ TEST_F(WinLinkParserTest, Basic) {
EXPECT_EQ("c.obj", inputFiles[2]);
EXPECT_EQ(6, info->getMinOSVersion().majorVersion);
EXPECT_EQ(0, info->getMinOSVersion().minorVersion);
+ EXPECT_EQ(1024 * 1024, info->getStackReserve());
+ EXPECT_EQ(4096, info->getStackCommit());
}
TEST_F(WinLinkParserTest, WindowsStyleOption) {
@@ -83,4 +85,15 @@ TEST_F(WinLinkParserTest, MinMajorMinorO
EXPECT_EQ(1, info->getMinOSVersion().minorVersion);
}
+TEST_F(WinLinkParserTest, StackReserve) {
+ parse("link.exe", "-stack", "8192", nullptr);
+ EXPECT_EQ(8192, info->getStackReserve());
+ EXPECT_EQ(4096, info->getStackCommit());
+}
+
+TEST_F(WinLinkParserTest, StackReserveAndCommit) {
+ parse("link.exe", "-stack", "16384,8192", nullptr);
+ EXPECT_EQ(16384, info->getStackReserve());
+ EXPECT_EQ(8192, info->getStackCommit());
+}
} // end anonymous namespace
More information about the llvm-commits
mailing list