diff options
| author | Rui Ueyama <ruiu@google.com> | 2013-06-08 03:59:00 +0000 | 
|---|---|---|
| committer | Rui Ueyama <ruiu@google.com> | 2013-06-08 03:59:00 +0000 | 
| commit | eb0cc96e4b0a1d6f36a00d92b82dc58a97f4bcd2 (patch) | |
| tree | 1fee4f3fb56521f5dd64ef44516a18747ddc2ca1 /lld/lib/Driver/WinLinkDriver.cpp | |
| parent | 7b5592bc0b75f04293768a92f4db01a703b82ce0 (diff) | |
| download | bcm5719-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.cpp | 51 | 
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)) | 

