COFF: Add /heap option.
authorRui Ueyama <ruiu@google.com>
Fri, 29 May 2015 16:23:40 +0000 (16:23 +0000)
committerRui Ueyama <ruiu@google.com>
Fri, 29 May 2015 16:23:40 +0000 (16:23 +0000)
llvm-svn: 238569

lld/COFF/Config.h
lld/COFF/Driver.cpp
lld/COFF/Writer.cpp
lld/test/COFF/heap.test [new file with mode: 0644]

index 2610d24..15e3674 100644 (file)
@@ -28,6 +28,8 @@ public:
   uint64_t ImageBase = 0x140000000;
   uint64_t StackReserve = 1024 * 1024;
   uint64_t StackCommit = 4096;
+  uint64_t HeapReserve = 1024 * 1024;
+  uint64_t HeapCommit = 4096;
 
   bool insertFile(llvm::StringRef Path) {
     return VisitedFiles.insert(Path.lower()).second;
index b868e18..93661fa 100644 (file)
@@ -143,6 +143,15 @@ bool link(int Argc, const char *Argv[]) {
     }
   }
 
+  // Handle /heap
+  if (auto *Arg = Args->getLastArg(OPT_heap)) {
+    if (auto EC = parseNumbers(Arg->getValue(), &Config->HeapReserve,
+                               &Config->HeapCommit)) {
+      llvm::errs() << "/heap: " << EC.message() << "\n";
+      return false;
+    }
+  }
+
   // Parse all input files and put all symbols to the symbol table.
   // The symbol table will take care of name resolution.
   SymbolTable Symtab;
index 8dc8ef0..265cd0d 100644 (file)
@@ -267,8 +267,8 @@ void Writer::writeHeader() {
   PE->AddressOfEntryPoint = Entry->getRVA();
   PE->SizeOfStackReserve = Config->StackReserve;
   PE->SizeOfStackCommit = Config->StackCommit;
-  PE->SizeOfHeapReserve = 1024 * 1024;
-  PE->SizeOfHeapCommit = 4096;
+  PE->SizeOfHeapReserve = Config->HeapReserve;
+  PE->SizeOfHeapCommit = Config->HeapCommit;
   PE->NumberOfRvaAndSize = NumberfOfDataDirectory;
   if (OutputSection *Text = findSection(".text")) {
     PE->BaseOfCode = Text->getRVA();
diff --git a/lld/test/COFF/heap.test b/lld/test/COFF/heap.test
new file mode 100644 (file)
index 0000000..dbd5ffd
--- /dev/null
@@ -0,0 +1,19 @@
+# RUN: lld -flavor link2 /entry:main /out:%t.exe %p/Inputs/ret42.obj
+# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=DEFAULT %s
+
+DEFAULT: SizeOfHeapReserve: 1048576
+DEFAULT: SizeOfHeapCommit: 4096
+
+# RUN: lld -flavor link2 /entry:main /out:%t.exe /heap:0x3000 \
+# RUN:   %p/Inputs/ret42.obj
+# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=CHECK1 %s
+
+CHECK1: SizeOfHeapReserve: 12288
+CHECK1: SizeOfHeapCommit: 4096
+
+# RUN: lld -flavor link2 /entry:main /out:%t.exe /heap:0x5000,0x3000 \
+# RUN:   %p/Inputs/ret42.obj
+# RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=CHECK2 %s
+
+CHECK2: SizeOfHeapReserve: 20480
+CHECK2: SizeOfHeapCommit: 12288