On Monday, May 9, 2016, Joe Groff &lt;<a href="mailto:jgroff@apple.com">jgroff@apple.com</a>&gt; wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
&gt; On May 9, 2016, at 7:19 PM, Saleem Abdulrasool &lt;<a href="javascript:;" onclick="_e(event, &#39;cvml&#39;, &#39;compnerd@compnerd.org&#39;)">compnerd@compnerd.org</a>&gt; wrote:<br>
&gt;<br>
&gt; On Sat, May 7, 2016 at 7:55 PM, Sangjin Han &lt;<a href="javascript:;" onclick="_e(event, &#39;cvml&#39;, &#39;tinysun.net@gmail.com&#39;)">tinysun.net@gmail.com</a>&gt; wrote:<br>
&gt; One more,<br>
&gt;<br>
&gt; I couldn&#39;t build the libswiftCore.dll which can be used for Hello.swift. At least one symbol _TMSS is not dllexported.<br>
&gt; (But I could build the dll with dlltool.exe which make all symbols to be dllexported)<br>
&gt;<br>
&gt; To find out the reason, I built a Swift.ll instead of the Swift.obj for the libswiftCore.dll. The Swift.ll are built from many stdlib/public/core/*.swift and core/8/*.swift files, and about 50MB.<br>
&gt;<br>
&gt; In that file, I could find many dllexport symbols, like<br>
&gt; @_TZvOs7Process5_argcVs5Int32 = dllexport global %Vs5Int32 zeroinitializer, align 4<br>
&gt; and Hello.ll uses them,<br>
&gt; @_TZvOs7Process5_argcVs5Int32 = external dllimport global %Vs5Int32, align 4<br>
&gt;<br>
&gt; In the case of _TMSS, Hello.ll uses the same way,<br>
&gt; @_TMSS = external dllimport global %swift.type, align 8<br>
&gt; But, Swift.ll did not declared with dllexport.<br>
&gt; @_TMSS = alias %swift.type, bitcast (i64* getelementptr inbounds (&lt;{ i8**, i64, i64, %swift.type*, i64 }&gt;, &lt;{ i8**, i64, i64, %swift.type*, i64 }&gt;* @_TMfSS, i32 0, i32 1) to %swift.type*)<br>
&gt;<br>
&gt; How we can make @_TMSS also has the dllexport?  Or any other solution ?<br>
&gt;<br>
&gt; Interesting.  Does changing the string type from struct to class help?  Ill try to have a look at this.<br>
<br>
Did you handle the path that creates these llvm::GlobalAlias objects for type metadata when adding the dllimport/export attributes?</blockquote><div><br></div><div>Ah, awesome, thanks for that hint.  That was indeed missing.  I suppose I should audit a few more things.  I&#39;ll upload a new version shortly that should take care of the dll storage on metadata.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
-Joe<br>
<br>
&gt;<br>
&gt;<br>
&gt; -Han Sangjin<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; 2016-05-08 8:01 GMT+09:00 Sangjin Han &lt;<a href="javascript:;" onclick="_e(event, &#39;cvml&#39;, &#39;tinysun.net@gmail.com&#39;)">tinysun.net@gmail.com</a>&gt;:<br>
&gt; Hi all,<br>
&gt;<br>
&gt; I merged Saleem&#39;s #2080 to my working branch, and did some experiment.<br>
&gt;<br>
&gt; I could compile easily Hello.swift with #2080 merged one.<br>
&gt;<br>
&gt;   swiftc -c -o Hello.obj Hello.swift<br>
&gt;   clang -o Hello.exe Hello.obj -llibswiftCore -llibswiftSwiftOnoneSupport -Wl,&lt;some link options&gt;<br>
&gt;<br>
&gt; Without #2080, I should use the *.ll-modifying-trick. It is perfect in this example.<br>
&gt;<br>
&gt; But, we need the way to disable dllimport. The immediate mode did not work.<br>
&gt;<br>
&gt;   swift Hello.swift<br>
&gt;   LLVM ERROR: Program used external function &#39;__imp_globalinit_33_1BDF70FFC18749BAB495A73B459ED2F0_func3&#39; which could not be resolved!<br>
&gt;<br>
&gt;   swift -O Hello.swift<br>
&gt;   LLVM ERROR: Program used external function &#39;__imp__swift_getExistentialTypeMetadata&#39; which could not be resolved!<br>
&gt;<br>
&gt; It seems swift.exe call directly the function in the DLL without import library.<br>
&gt;<br>
&gt; The feature also needed when we link to static library.<br>
&gt;<br>
&gt; I don&#39;t know about the SIL, IR, so it is thankful someone tell me how to approach this problem.<br>
&gt;<br>
&gt;<br>
&gt; 2016-05-07 5:01 GMT+09:00 Saleem Abdulrasool &lt;<a href="javascript:;" onclick="_e(event, &#39;cvml&#39;, &#39;compnerd@compnerd.org&#39;)">compnerd@compnerd.org</a>&gt;:<br>
&gt; On Thu, May 5, 2016 at 5:26 PM, Joe Groff via swift-dev &lt;<a href="javascript:;" onclick="_e(event, &#39;cvml&#39;, &#39;swift-dev@swift.org&#39;)">swift-dev@swift.org</a>&gt; wrote:<br>
&gt;<br>
&gt; &gt; On May 5, 2016, at 4:18 PM, Sangjin Han via swift-dev &lt;<a href="javascript:;" onclick="_e(event, &#39;cvml&#39;, &#39;swift-dev@swift.org&#39;)">swift-dev@swift.org</a>&gt; wrote:<br>
&gt; &gt;<br>
&gt; &gt; Hi,<br>
&gt; &gt;<br>
&gt; &gt; I made an experimental MSVC port. Of cause, dllimport/dllexport and the driver for linking and many other part is not implemented. But dynamic linking was possible with some trick.<br>
&gt; &gt;<br>
&gt; &gt; I think it is useful for designing, my observation about the experimental building of libswiftCore.dll, libswiftSwiftOnoneSupport.dll and linking of Hello.exe - its source has only &#39;print(&quot;Hello&quot;)&#39;.<br>
&gt; &gt;<br>
&gt; &gt; 1) SWIFT_RUNTIME_EXPORT was not enough for dllexport.<br>
&gt; &gt;   Hello.obj needed defined in libswift*.dll<br>
&gt; &gt;     _swift_getExistentialTypeMetadata,<br>
&gt; &gt;     _TFs5printFTGSaP__9separatorSS10terminatorSS_T_,<br>
&gt; &gt;     _TMSS,<br>
&gt; &gt;     _TZvOs7Process5_argcVs5Int32,<br>
&gt; &gt;     swift_bufferAllocate, ....<br>
&gt; &gt;   Some of above are dllexported by the macro, but _T* are not. Maybe, it generated by swiftc.exe.<br>
&gt; &gt;   I used the utility &#39;dlltool.exe&#39; from Cygwin/MinGW world. It extracts all symbols and generates &#39;allsymbol.def&#39;.<br>
&gt; &gt;   With that .def, I could build the all-symbol-dllexported libswiftCore.dll.<br>
&gt; &gt;   (I&#39;m hoping we can build it without this trick.)<br>
&gt;<br>
&gt; The _T symbols are emitted by the Swift compiler. You should modify swiftc&#39;s IRGen to generate public symbols with LLVM&#39;s &quot;dllexport&quot; storage class when targeting Windows.<br>
&gt;<br>
&gt; <a href="https://github.com/apple/swift/pull/2080" target="_blank">https://github.com/apple/swift/pull/2080</a> is a first cut attempt to do this.<br>
&gt;<br>
&gt;<br>
&gt; -Joe<br>
&gt; _______________________________________________<br>
&gt; swift-dev mailing list<br>
&gt; <a href="javascript:;" onclick="_e(event, &#39;cvml&#39;, &#39;swift-dev@swift.org&#39;)">swift-dev@swift.org</a><br>
&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-dev" target="_blank">https://lists.swift.org/mailman/listinfo/swift-dev</a><br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; --<br>
&gt; Saleem Abdulrasool<br>
&gt; compnerd (at) compnerd (dot) org<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; --<br>
&gt; Saleem Abdulrasool<br>
&gt; compnerd (at) compnerd (dot) org<br>
<br>
</blockquote><br><br>-- <br>Saleem Abdulrasool<br>compnerd (at) compnerd (dot) org<br>