summaryrefslogtreecommitdiffstats
path: root/lld/lib
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
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')
-rw-r--r--lld/lib/Driver/WinLinkDriver.cpp51
-rw-r--r--lld/lib/Driver/WinLinkOptions.td4
-rw-r--r--lld/lib/ReaderWriter/PECOFF/PECOFFTargetInfo.cpp7
-rw-r--r--lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp4
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;
OpenPOWER on IntegriCloud