PECOFFTargetInfo()
: _stackReserve(1024 * 1024),
_stackCommit(4096),
+ _heapReserve(1024 * 1024),
+ _heapCommit(4096),
_subsystem(llvm::COFF::IMAGE_SUBSYSTEM_UNKNOWN),
_minOSVersion(6, 0) {}
virtual void addPasses(PassManager &pm) const {}
void setStackReserve(uint64_t size) { _stackReserve = size; }
- uint64_t getStackReserve() const { return _stackReserve; }
-
void setStackCommit(uint64_t size) { _stackCommit = size; }
+ uint64_t getStackReserve() const { return _stackReserve; }
uint64_t getStackCommit() const { return _stackCommit; }
+ void setHeapReserve(uint64_t size) { _heapReserve = size; }
+ void setHeapCommit(uint64_t size) { _heapCommit = size; }
+ uint64_t getHeapReserve() const { return _heapReserve; }
+ uint64_t getHeapCommit() const { return _heapCommit; }
+
void setSubsystem(llvm::COFF::WindowsSubsystem ss) { _subsystem = ss; }
llvm::COFF::WindowsSubsystem getSubsystem() const { return _subsystem; }
private:
uint64_t _stackReserve;
uint64_t _stackCommit;
+ uint64_t _heapReserve;
+ uint64_t _heapCommit;
llvm::COFF::WindowsSubsystem _subsystem;
OSVersion _minOSVersion;
return true;
}
-// 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))
+// Parse an argument for -stack or -heap. The expected string is
+// "reserveSize[,stackCommitSize]".
+bool parseMemoryOption(const StringRef &arg, raw_ostream &diagnostics,
+ uint64_t &reserve, uint64_t &commit) {
+ StringRef reserveStr, commitStr;
+ llvm::tie(reserveStr, commitStr) = arg.split(',');
+ if (!checkNumber(reserveStr, "invalid stack size: ", diagnostics))
return false;
- info.setStackReserve(atoi(reserve.str().c_str()));
- if (!commit.empty()) {
- if (!checkNumber(commit, "invalid stack size: ", diagnostics))
+ reserve = atoi(reserveStr.str().c_str());
+ if (!commitStr.empty()) {
+ if (!checkNumber(commitStr, "invalid stack size: ", diagnostics))
return false;
- info.setStackCommit(atoi(commit.str().c_str()));
+ commit = atoi(commitStr.str().c_str());
}
return true;
}
+// Parse -stack command line option
+bool parseStackOption(PECOFFTargetInfo &info, const StringRef &arg,
+ raw_ostream &diagnostics) {
+ uint64_t reserve;
+ uint64_t commit = info.getStackCommit();
+ if (!parseMemoryOption(arg, diagnostics, reserve, commit))
+ return false;
+ info.setStackReserve(reserve);
+ info.setStackCommit(commit);
+ return true;
+}
+
+// Parse -heap command line option.
+bool parseHeapOption(PECOFFTargetInfo &info, const StringRef &arg,
+ raw_ostream &diagnostics) {
+ uint64_t reserve;
+ uint64_t commit = info.getHeapCommit();
+ if (!parseMemoryOption(arg, diagnostics, reserve, commit))
+ return false;
+ info.setHeapReserve(reserve);
+ info.setHeapCommit(commit);
+ return true;
+}
+
// Returns subsystem type for the given string.
llvm::COFF::WindowsSubsystem stringToWinSubsystem(StringRef str) {
std::string arg(str.lower());
if (!parseStackOption(info, arg->getValue(), diagnostics))
return true;
+ // Handle -heap
+ if (llvm::opt::Arg *arg = parsedArgs->getLastArg(OPT_heap))
+ if (!parseHeapOption(info, arg->getValue(), diagnostics))
+ return true;
+
// Handle -subsystem
if (llvm::opt::Arg *arg = parsedArgs->getLastArg(OPT_subsystem))
if (!parseSubsystemOption(info, arg->getValue(), diagnostics))
HelpText<"Size of the stack">;
def stack_c: Joined<["-", "/"], "stack:">, Alias<stack>;
+def heap : Separate<["-", "/"], "heap">,
+ HelpText<"Size of the heap">;
+def heap_c: Joined<["-", "/"], "heap:">, Alias<heap>;
+
def subsystem : Separate<["-", "/"], "subsystem">,
HelpText<"Specify subsystem">;
def subsystem_c: Joined<["-", "/"], "subsystem:">, Alias<subsystem>;
EXPECT_EQ(16384, info->getStackReserve());
EXPECT_EQ(8192, info->getStackCommit());
}
+
+TEST_F(WinLinkParserTest, HeapReserve) {
+ parse("link.exe", "-heap", "8192", nullptr);
+ EXPECT_EQ(8192, info->getHeapReserve());
+ EXPECT_EQ(4096, info->getHeapCommit());
+}
+
+TEST_F(WinLinkParserTest, HeapReserveAndCommit) {
+ parse("link.exe", "-heap", "16384,8192", nullptr);
+ EXPECT_EQ(16384, info->getHeapReserve());
+ EXPECT_EQ(8192, info->getHeapCommit());
+}
} // end anonymous namespace