diff options
Diffstat (limited to 'lld/lib')
| -rw-r--r-- | lld/lib/Driver/WinLinkDriver.cpp | 51 | ||||
| -rw-r--r-- | lld/lib/Driver/WinLinkOptions.td | 4 | ||||
| -rw-r--r-- | lld/lib/ReaderWriter/PECOFF/PECOFFTargetInfo.cpp | 7 | ||||
| -rw-r--r-- | lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp | 4 | 
4 files changed, 49 insertions, 17 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)) diff --git a/lld/lib/Driver/WinLinkOptions.td b/lld/lib/Driver/WinLinkOptions.td index c32ae56cbe6..850814ae6f6 100644 --- a/lld/lib/Driver/WinLinkOptions.td +++ b/lld/lib/Driver/WinLinkOptions.td @@ -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>; diff --git a/lld/lib/ReaderWriter/PECOFF/PECOFFTargetInfo.cpp b/lld/lib/ReaderWriter/PECOFF/PECOFFTargetInfo.cpp index 516479e65d5..a4c3e7ec4ab 100644 --- a/lld/lib/ReaderWriter/PECOFF/PECOFFTargetInfo.cpp +++ b/lld/lib/ReaderWriter/PECOFF/PECOFFTargetInfo.cpp @@ -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; diff --git a/lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp b/lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp index af54e275f45..f8e4ae9f13d 100644 --- a/lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp +++ b/lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp @@ -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; | 

