summaryrefslogtreecommitdiffstats
path: root/lld/lib/Driver/WinLinkDriver.cpp
diff options
context:
space:
mode:
authorRui Ueyama <ruiu@google.com>2013-06-08 03:59:00 +0000
committerRui Ueyama <ruiu@google.com>2013-06-08 03:59:00 +0000
commiteb0cc96e4b0a1d6f36a00d92b82dc58a97f4bcd2 (patch)
tree1fee4f3fb56521f5dd64ef44516a18747ddc2ca1 /lld/lib/Driver/WinLinkDriver.cpp
parent7b5592bc0b75f04293768a92f4db01a703b82ce0 (diff)
downloadbcm5719-llvm-eb0cc96e4b0a1d6f36a00d92b82dc58a97f4bcd2.tar.gz
bcm5719-llvm-eb0cc96e4b0a1d6f36a00d92b82dc58a97f4bcd2.zip
[PECOFF][Driver] Add -stack command line option.
llvm-svn: 183604
Diffstat (limited to 'lld/lib/Driver/WinLinkDriver.cpp')
-rw-r--r--lld/lib/Driver/WinLinkDriver.cpp51
1 files changed, 36 insertions, 15 deletions
diff --git a/lld/lib/Driver/WinLinkDriver.cpp b/lld/lib/Driver/WinLinkDriver.cpp
index 8730a9cc22e..e67337ccdd5 100644
--- a/lld/lib/Driver/WinLinkDriver.cpp
+++ b/lld/lib/Driver/WinLinkDriver.cpp
@@ -66,20 +66,10 @@ int findDoubleDash(int argc, const char *argv[]) {
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, const char *errorMessage,
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, const char *argv[],
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))
OpenPOWER on IntegriCloud