From eb0cc96e4b0a1d6f36a00d92b82dc58a97f4bcd2 Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Sat, 8 Jun 2013 03:59:00 +0000 Subject: [PECOFF][Driver] Add -stack command line option. llvm-svn: 183604 --- lld/lib/Driver/WinLinkDriver.cpp | 51 ++++++++++++++++++++++++++++------------ 1 file changed, 36 insertions(+), 15 deletions(-) (limited to 'lld/lib/Driver/WinLinkDriver.cpp') 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(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(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)) -- cgit v1.2.3