<div dir="ltr">We could do that in either way. I chose to make it a separate pass because of its simplicity. If it turns out that a slow pass, I'll optimize it.</div><div class="gmail_extra"><br><br><div class="gmail_quote">

On Sun, Nov 24, 2013 at 7:27 PM, Shankar Easwaran <span dir="ltr"><<a href="mailto:shankare@codeaurora.org" target="_blank">shankare@codeaurora.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

Why is this not being done by the Reader itself. I thought it might be easier to do it at that time without affecting performance.<br>
<br>
Shankar Easwaran<div class="HOEnZb"><div class="h5"><br>
<br>
On 11/24/2013 8:00 PM, Rui Ueyama wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Author: ruiu<br>
Date: Sun Nov 24 20:00:00 2013<br>
New Revision: 195592<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=195592&view=rev" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project?rev=195592&view=rev</a><br>
Log:<br>
[PECOFF] Infer subsystem from the entry point function.<br>
<br>
If /subsystem option is not specified, the linker needs to infer it from the<br>
entry point function. If "main" or "wmain" is defined, it's a console<br>
application. If "WinMain" or "wWinMain" is defined, it's a GUI application.<br>
<br>
Added:<br>
     lld/trunk/lib/ReaderWriter/<u></u>PECOFF/SetSubsystemPass.h<br>
     lld/trunk/test/pecoff/Inputs/<u></u>subsystem.main.yaml<br>
     lld/trunk/test/pecoff/Inputs/<u></u>subsystem.winmain.yaml<br>
     lld/trunk/test/pecoff/<u></u>subsystem.test<br>
Modified:<br>
     lld/trunk/lib/ReaderWriter/<u></u>PECOFF/PECOFFLinkingContext.<u></u>cpp<br>
     lld/trunk/test/pecoff/<u></u>baseaddr.test<br>
     lld/trunk/test/pecoff/dosstub.<u></u>test<br>
     lld/trunk/test/pecoff/options.<u></u>test<br>
     lld/trunk/test/pecoff/trivial.<u></u>test<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/<u></u>PECOFF/PECOFFLinkingContext.<u></u>cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp?rev=195592&r1=195591&r2=195592&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/PECOFF/<u></u>PECOFFLinkingContext.cpp?rev=<u></u>195592&r1=195591&r2=195592&<u></u>view=diff</a><br>


==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>PECOFF/PECOFFLinkingContext.<u></u>cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>PECOFF/PECOFFLinkingContext.<u></u>cpp Sun Nov 24 20:00:00 2013<br>
@@ -11,6 +11,7 @@<br>
  #include "GroupedSectionsPass.h"<br>
  #include "IdataPass.h"<br>
  #include "LinkerGeneratedSymbolFile.h"<br>
+#include "SetSubsystemPass.h"<br>
    #include "lld/Core/PassManager.h"<br>
  #include "lld/Passes/LayoutPass.h"<br>
@@ -204,6 +205,7 @@ PECOFFLinkingContext::<u></u>stringFromRelocKin<br>
  }<br>
    void PECOFFLinkingContext::<u></u>addPasses(PassManager &pm) {<br>
+  pm.add(std::unique_ptr<Pass>(<u></u>new pecoff::SetSubsystemPass(*<u></u>this)));<br>
    pm.add(std::unique_ptr<Pass>(<u></u>new pecoff::GroupedSectionsPass())<u></u>);<br>
    pm.add(std::unique_ptr<Pass>(<u></u>new pecoff::IdataPass(*this)));<br>
    pm.add(std::unique_ptr<Pass>(<u></u>new LayoutPass()));<br>
<br>
Added: lld/trunk/lib/ReaderWriter/<u></u>PECOFF/SetSubsystemPass.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/SetSubsystemPass.h?rev=195592&view=auto" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/lib/<u></u>ReaderWriter/PECOFF/<u></u>SetSubsystemPass.h?rev=195592&<u></u>view=auto</a><br>


==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/lib/ReaderWriter/<u></u>PECOFF/SetSubsystemPass.h (added)<br>
+++ lld/trunk/lib/ReaderWriter/<u></u>PECOFF/SetSubsystemPass.h Sun Nov 24 20:00:00 2013<br>
@@ -0,0 +1,56 @@<br>
+//===- lib/ReaderWriter/PECOFF/<u></u>SetSubsystemPass.h -------------------------===//<br>
+//<br>
+//                             The LLVM Linker<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<u></u>------------------------------<u></u>----------------===//<br>
+<br>
+#ifndef LLD_READER_WRITER_PE_COFF_SET_<u></u>SUBSYSTEM_PASS_H<br>
+#define LLD_READER_WRITER_PE_COFF_SET_<u></u>SUBSYSTEM_PASS_H<br>
+<br>
+#include "lld/ReaderWriter/<u></u>PECOFFLinkingContext.h"<br>
+<br>
+using llvm::COFF::WindowsSubsystem::<u></u>IMAGE_SUBSYSTEM_UNKNOWN;<br>
+using llvm::COFF::WindowsSubsystem::<u></u>IMAGE_SUBSYSTEM_WINDOWS_CUI;<br>
+using llvm::COFF::WindowsSubsystem::<u></u>IMAGE_SUBSYSTEM_WINDOWS_GUI;<br>
+<br>
+namespace lld {<br>
+namespace pecoff {<br>
+<br>
+/// If "main" or "wmain" is defined, /subsystem:console is the default. If<br>
+/// "WinMain" or "wWinMain" is defined, /subsystem:windows is the default.<br>
+class SetSubsystemPass : public lld::Pass {<br>
+public:<br>
+  SetSubsystemPass(<u></u>PECOFFLinkingContext &ctx) : _ctx(ctx) {}<br>
+<br>
+  virtual void perform(std::unique_ptr<<u></u>MutableFile> &file) {<br>
+    if (_ctx.getSubsystem() != IMAGE_SUBSYSTEM_UNKNOWN)<br>
+      return;<br>
+    StringRef main = _ctx.decorateSymbol("main");<br>
+    StringRef wmain = _ctx.decorateSymbol("wmain");<br>
+    StringRef winmain = _ctx.decorateSymbol("WinMain")<u></u>;<br>
+    StringRef wwinmain = _ctx.decorateSymbol("wWinMain"<u></u>);<br>
+    for (auto *atom : file->defined()) {<br>
+      StringRef s = atom->name();<br>
+      if (s == main || s == wmain) {<br>
+        _ctx.setSubsystem(IMAGE_<u></u>SUBSYSTEM_WINDOWS_CUI);<br>
+        return;<br>
+      }<br>
+      if (s == winmain || s == wwinmain) {<br>
+        _ctx.setSubsystem(IMAGE_<u></u>SUBSYSTEM_WINDOWS_GUI);<br>
+        return;<br>
+      }<br>
+    }<br>
+    llvm_unreachable("Failed to infer the subsystem.");<br>
+  }<br>
+<br>
+private:<br>
+  PECOFFLinkingContext &_ctx;<br>
+};<br>
+<br>
+} // namespace pecoff<br>
+} // namespace lld<br>
+<br>
+#endif<br>
<br>
Added: lld/trunk/test/pecoff/Inputs/<u></u>subsystem.main.yaml<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/Inputs/subsystem.main.yaml?rev=195592&view=auto" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/test/pecoff/<u></u>Inputs/subsystem.main.yaml?<u></u>rev=195592&view=auto</a><br>


==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/test/pecoff/Inputs/<u></u>subsystem.main.yaml (added)<br>
+++ lld/trunk/test/pecoff/Inputs/<u></u>subsystem.main.yaml Sun Nov 24 20:00:00 2013<br>
@@ -0,0 +1,25 @@<br>
+---<br>
+header:<br>
+  Machine:         IMAGE_FILE_MACHINE_I386<br>
+  Characteristics: [  ]<br>
+sections:<br>
+  - Name:            .text<br>
+    Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]<br>
+    Alignment:       4<br>
+    SectionData:     B82A000000C3<br>
+symbols:<br>
+  - Name:            .text<br>
+    Value:           0<br>
+    SectionNumber:   1<br>
+    SimpleType:      IMAGE_SYM_TYPE_NULL<br>
+    ComplexType:     IMAGE_SYM_DTYPE_NULL<br>
+    StorageClass:    IMAGE_SYM_CLASS_STATIC<br>
+    NumberOfAuxSymbols: 1<br>
+    AuxiliaryData:   060000000000000000000000000000<u></u>000000<br>
+  - Name:            _main<br>
+    Value:           0<br>
+    SectionNumber:   1<br>
+    SimpleType:      IMAGE_SYM_TYPE_NULL<br>
+    ComplexType:     IMAGE_SYM_DTYPE_NULL<br>
+    StorageClass:    IMAGE_SYM_CLASS_EXTERNAL<br>
+...<br>
<br>
Added: lld/trunk/test/pecoff/Inputs/<u></u>subsystem.winmain.yaml<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/Inputs/subsystem.winmain.yaml?rev=195592&view=auto" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/test/pecoff/<u></u>Inputs/subsystem.winmain.yaml?<u></u>rev=195592&view=auto</a><br>


==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/test/pecoff/Inputs/<u></u>subsystem.winmain.yaml (added)<br>
+++ lld/trunk/test/pecoff/Inputs/<u></u>subsystem.winmain.yaml Sun Nov 24 20:00:00 2013<br>
@@ -0,0 +1,25 @@<br>
+---<br>
+header:<br>
+  Machine:         IMAGE_FILE_MACHINE_I386<br>
+  Characteristics: [  ]<br>
+sections:<br>
+  - Name:            .text<br>
+    Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]<br>
+    Alignment:       4<br>
+    SectionData:     B82A000000C3<br>
+symbols:<br>
+  - Name:            .text<br>
+    Value:           0<br>
+    SectionNumber:   1<br>
+    SimpleType:      IMAGE_SYM_TYPE_NULL<br>
+    ComplexType:     IMAGE_SYM_DTYPE_NULL<br>
+    StorageClass:    IMAGE_SYM_CLASS_STATIC<br>
+    NumberOfAuxSymbols: 1<br>
+    AuxiliaryData:   060000000000000000000000000000<u></u>000000<br>
+  - Name:            _WinMain<br>
+    Value:           0<br>
+    SectionNumber:   1<br>
+    SimpleType:      IMAGE_SYM_TYPE_NULL<br>
+    ComplexType:     IMAGE_SYM_DTYPE_NULL<br>
+    StorageClass:    IMAGE_SYM_CLASS_EXTERNAL<br>
+...<br>
<br>
Modified: lld/trunk/test/pecoff/<u></u>baseaddr.test<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/baseaddr.test?rev=195592&r1=195591&r2=195592&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/test/pecoff/<u></u>baseaddr.test?rev=195592&r1=<u></u>195591&r2=195592&view=diff</a><br>


==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/test/pecoff/<u></u>baseaddr.test (original)<br>
+++ lld/trunk/test/pecoff/<u></u>baseaddr.test Sun Nov 24 20:00:00 2013<br>
@@ -1,9 +1,11 @@<br>
  # RUN: yaml2obj %p/Inputs/nop.obj.yaml > %t.obj<br>
  #<br>
-# RUN: lld -flavor link /out:%t1 /opt:noref -- %t.obj \<br>
+# RUN: lld -flavor link /out:%t1 /opt:noref /subsystem:console /force \<br>
+# RUN:   -- %t.obj \<br>
  # RUN:   && llvm-readobj -file-headers %t1 | FileCheck -check-prefix=DEFAULT %s<br>
  #<br>
-# RUN: lld -flavor link /out:%t1 /opt:noref /base:8388608 -- %t.obj \<br>
+# RUN: lld -flavor link /out:%t1 /opt:noref /base:8388608 /subsystem:console \<br>
+# RUN:   /force -- %t.obj \<br>
  # RUN:   && llvm-readobj -file-headers %t1 | FileCheck -check-prefix=BASE %s<br>
    DEFAULT: ImageBase: 0x400000<br>
@@ -11,7 +13,7 @@ DEFAULT: ImageBase: 0x400000<br>
  BASE: ImageBase: 0x800000<br>
    -# RUN: not lld -flavor link /base:3 -- %t.obj >& %t.log<br>
+# RUN: not lld -flavor link /base:3 /subsystem:console -- %t.obj >& %t.log<br>
  # RUN: FileCheck -check-prefix=ERROR %s < %t.log<br>
    ERROR: Base address have to be multiple of 64K, but got 3<br>
<br>
Modified: lld/trunk/test/pecoff/dosstub.<u></u>test<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/dosstub.test?rev=195592&r1=195591&r2=195592&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/test/pecoff/<u></u>dosstub.test?rev=195592&r1=<u></u>195591&r2=195592&view=diff</a><br>


==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/test/pecoff/dosstub.<u></u>test (original)<br>
+++ lld/trunk/test/pecoff/dosstub.<u></u>test Sun Nov 24 20:00:00 2013<br>
@@ -1,7 +1,8 @@<br>
  # RUN: yaml2obj %p/Inputs/nop.obj.yaml > %t.obj<br>
    # RUN: echo "MZ Hello world" > %t.stub<br>
-# RUN: lld -flavor link /out:%t.exe /entry:start /stub:%t.stub -- %t.obj<br>
+# RUN: lld -flavor link /out:%t.exe /entry:start /subsystem:console \<br>
+# RUN:   /stub:%t.stub -- %t.obj<br>
  # RUN: FileCheck -check-prefix=FILE %s < %t.exe<br>
  # RUN: llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=READOBJ %s<br>
  <br>
Modified: lld/trunk/test/pecoff/options.<u></u>test<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/options.test?rev=195592&r1=195591&r2=195592&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/test/pecoff/<u></u>options.test?rev=195592&r1=<u></u>195591&r2=195592&view=diff</a><br>


==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/test/pecoff/options.<u></u>test (original)<br>
+++ lld/trunk/test/pecoff/options.<u></u>test Sun Nov 24 20:00:00 2013<br>
@@ -2,26 +2,31 @@<br>
  #<br>
  # RUN: yaml2obj %p/Inputs/nop.obj.yaml > %t.obj<br>
  -# RUN: lld -flavor link /align:8192 /out:%t.exe /entry:start -- %t.obj \<br>
+# RUN: lld -flavor link /align:8192 /out:%t.exe /entry:start \<br>
+# RUN:   /subsystem:console -- %t.obj \<br>
  # RUN:   && llvm-readobj -file-headers %t.exe | FileCheck -check-prefix=ALIGN %s<br>
  ALIGN: SectionAlignment: 8192<br>
  -# RUN: lld -flavor link /allowbind:no /out:%t.exe /entry:start -- %t.obj \<br>
+# RUN: lld -flavor link /allowbind:no /out:%t.exe /entry:start \<br>
+# RUN:   /subsystem:console -- %t.obj \<br>
  # RUN:   && llvm-readobj -file-headers %t.exe \<br>
  # RUN:   | FileCheck -check-prefix=NOBIND %s<br>
  NOBIND: IMAGE_DLL_CHARACTERISTICS_NO_<u></u>BIND<br>
  -# RUN: lld -flavor link /allowisolation:no /out:%t.exe /entry:start -- %t.obj \<br>
+# RUN: lld -flavor link /allowisolation:no /out:%t.exe /entry:start \<br>
+# RUN:   /subsystem:console -- %t.obj \<br>
  # RUN:   && llvm-readobj -file-headers %t.exe \<br>
  # RUN:   | FileCheck -check-prefix=NOISOLATION %s<br>
  NOISOLATION: IMAGE_DLL_CHARACTERISTICS_NO_<u></u>ISOLATION<br>
  -# RUN: lld -flavor link /swaprun:cd /out:%t.exe /entry:start -- %t.obj \<br>
+# RUN: lld -flavor link /swaprun:cd /out:%t.exe /entry:start \<br>
+# RUN:   /subsystem:console -- %t.obj \<br>
  # RUN:   && llvm-readobj -file-headers %t.exe \<br>
  # RUN:   | FileCheck -check-prefix=SWAPRUNCD %s<br>
  SWAPRUNCD: IMAGE_FILE_REMOVABLE_RUN_FROM_<u></u>SWAP<br>
  -# RUN: lld -flavor link /swaprun:net /out:%t.exe /entry:start -- %t.obj \<br>
+# RUN: lld -flavor link /swaprun:net /out:%t.exe /entry:start \<br>
+# RUN:   /subsystem:console -- %t.obj \<br>
  # RUN:   && llvm-readobj -file-headers %t.exe \<br>
  # RUN:   | FileCheck -check-prefix=SWAPRUNNET %s<br>
  SWAPRUNNET: IMAGE_FILE_NET_RUN_FROM_SWAP<br>
<br>
Added: lld/trunk/test/pecoff/<u></u>subsystem.test<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/subsystem.test?rev=195592&view=auto" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/test/pecoff/<u></u>subsystem.test?rev=195592&<u></u>view=auto</a><br>


==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/test/pecoff/<u></u>subsystem.test (added)<br>
+++ lld/trunk/test/pecoff/<u></u>subsystem.test Sun Nov 24 20:00:00 2013<br>
@@ -0,0 +1,12 @@<br>
+# RUN: yaml2obj %p/Inputs/subsystem.main.yaml  > %t.main.obj<br>
+# RUN: yaml2obj %p/Inputs/subsystem.winmain.<u></u>yaml > %t.winmain.obj<br>
+#<br>
+# RUN: lld -flavor link /out:%t.main.exe -- %t.main.obj<br>
+# RUN: llvm-readobj -file-headers %t.main.exe | FileCheck -check-prefix=MAIN %s<br>
+#<br>
+# RUN: lld -flavor link /out:%t.winmain.exe -- %t.winmain.obj<br>
+# RUN: llvm-readobj -file-headers %t.winmain.exe | \<br>
+# RUN:   FileCheck -check-prefix=WINMAIN %s<br>
+<br>
+MAIN:    Subsystem: IMAGE_SUBSYSTEM_WINDOWS_CUI<br>
+WINMAIN: Subsystem: IMAGE_SUBSYSTEM_WINDOWS_GUI<br>
<br>
Modified: lld/trunk/test/pecoff/trivial.<u></u>test<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/trivial.test?rev=195592&r1=195591&r2=195592&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/lld/trunk/test/pecoff/<u></u>trivial.test?rev=195592&r1=<u></u>195591&r2=195592&view=diff</a><br>


==============================<u></u>==============================<u></u>==================<br>
--- lld/trunk/test/pecoff/trivial.<u></u>test (original)<br>
+++ lld/trunk/test/pecoff/trivial.<u></u>test Sun Nov 24 20:00:00 2013<br>
@@ -8,7 +8,8 @@<br>
  # RUN:   /entry:start /opt:noref -- %t.obj && llvm-readobj -file-headers %t1 \<br>
  # RUN:   | FileCheck -check-prefix=FILE %s<br>
  #<br>
-# RUN: lld -flavor link /out:%t1 /entry:start /opt:noref -- %t.obj \<br>
+# RUN: lld -flavor link /out:%t1 /subsystem:console /entry:start /opt:noref \<br>
+# RUN:   -- %t.obj \<br>
  # RUN:   && llvm-readobj -sections %t1 | FileCheck -check-prefix=SECTIONS %s<br>
    FILE: Format: COFF-i386<br>
<br>
<br>
______________________________<u></u>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/<u></u>mailman/listinfo/llvm-commits</a><br>
<br>
<br>
</blockquote>
<br>
<br></div></div><span class="HOEnZb"><font color="#888888">
-- <br>
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by the Linux Foundation<br>
<br>
</font></span></blockquote></div><br></div>