<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";
        color:black;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML Preformatted Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";
        color:black;}
tt
        {mso-style-priority:99;
        font-family:"Courier New";}
p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
        {mso-style-priority:99;
        mso-style-link:"Balloon Text Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:8.0pt;
        font-family:"Tahoma","sans-serif";
        color:black;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0in;
        margin-right:0in;
        margin-bottom:0in;
        margin-left:.5in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";
        color:black;}
span.BalloonTextChar
        {mso-style-name:"Balloon Text Char";
        mso-style-priority:99;
        mso-style-link:"Balloon Text";
        font-family:"Tahoma","sans-serif";}
span.EmailStyle20
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.EmailStyle21
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.EmailStyle22
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:"Consolas","serif";
        color:black;}
span.EmailStyle26
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body bgcolor="white" lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Matthew,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Thank you so much!  This was very enlightening.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">I didn’t know that a .exe file could have exports.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">This opens up new possibilities, even though it’s not a full generic solution.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">I’m assuming symbols using declspec(export)’s would cause these to be exported in the .exe as well.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">In the .def file, you had to use the mangled names, right?<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">In my experiment of a couple of years ago, I created a new common header for each llvm/clang library which had the purpose of #define’ing a (module name)_LINKAGE
 preprocessor symbol to be used in the declarations of symbols to exported/imported.  Thus I could switch it between declspec(export) and declspec(import) based on a flag input from the build.  I did this with an eye toward having either a “big clang DLL” or
 individual clang library DLLs, using build flags to switch between them.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">We could now do the same thing, except that clang.exe itself could now be the “big clang DLL”.  Assuming a DLL build of clang is a future or never to be done
 thing, we could start out adding the *_LINKAGE tags to just those items likely to be used in a plugin, without worrying about breaking a DLL build.  This would probably be easier than dealing with mangled names and the .def file.  It might complicate the plug-in
 writer’s lives though, since if they need a symbol that wasn’t exported, they would need to patch clang for it.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">I know using import/export tags is a sore spot for many.  But at least with this scheme, it seems it would be less of a hassle because the main build won’t
 general break if someone forgets to add one.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">I wonder what the impact of an embedded export table would have on the load time for clang.exe?<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">I looked for some kind of “export all” option in VC++ and the linker, but didn’t see one, and it probably would be a bad idea anyway, because of the number
 of exports, and would hit the (supposed) import limit anyway in the import library, unless Microsoft has fixed or will fix it.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Comments anyone from the llvm/clang community?  I can’t work on it right now, but I probably could later.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">-John<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif";color:windowtext">From:</span></b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif";color:windowtext"> Matthew Curtis [mailto:mcurtis@codeaurora.org]
<br>
<b>Sent:</b> Thursday, March 21, 2013 12:19 PM<br>
<b>To:</b> Thompson, John<br>
<b>Cc:</b> Gao, Yunzhong; 'cfe-commits@cs.uiuc.edu'<br>
<b>Subject:</b> Re: [PATCH] Implement a sane plugin API for clang<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">On 3/20/2013 8:17 PM, Thompson, John wrote:<o:p></o:p></p>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Hi Matthew,</span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"> </span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Could you point me to more information on how you got the plug-in mechanism to work with clang on Windows?</span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"> </span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">I understand the need to add access functions for static data, but I don’t understand how you build the plugin DLL in general.</span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"> </span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">How does a clang.exe built from statically-linked libraries have the necessary exports to satisfy the dynamic loading of the plugin DLL?</span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"> </span><o:p></o:p></p>
</blockquote>
<p class="MsoNormal" style="margin-bottom:12.0pt">We made the following change to clang's tools/driver/CMakeLists.txt<o:p></o:p></p>
<p class="MsoNormal"><tt><span style="font-size:10.0pt">diff --git a/tools/driver/CMakeLists.txt b/tools/driver/CMakeLists.txt</span></tt><br>
<tt><span style="font-size:10.0pt">index 2545610..a3fe292 100644</span></tt><br>
<tt><span style="font-size:10.0pt">--- a/tools/driver/CMakeLists.txt</span></tt><br>
<tt><span style="font-size:10.0pt">+++ b/tools/driver/CMakeLists.txt</span></tt><br>
<tt><span style="font-size:10.0pt">@@ -10,10 +10,17 @@ set( LLVM_LINK_COMPONENTS</span></tt><br>
<tt><span style="font-size:10.0pt">   selectiondag</span></tt><br>
<tt><span style="font-size:10.0pt">   )</span></tt><br>
<tt><span style="font-size:10.0pt"> </span></tt><br>
<tt><span style="font-size:10.0pt;color:#009900">+if(MSVC)</span></tt><span style="color:#009900"><br>
</span><tt><span style="font-size:10.0pt;color:#009900">+  set(def_file "clang.def")</span></tt><span style="color:#009900"><br>
</span><tt><span style="font-size:10.0pt;color:#009900">+else(MSVC)</span></tt><span style="color:#009900"><br>
</span><tt><span style="font-size:10.0pt;color:#009900">+  set(def_file "")</span></tt><span style="color:#009900"><br>
</span><tt><span style="font-size:10.0pt;color:#009900">+endif(MSVC)</span></tt><span style="color:#009900"><br>
</span><tt><span style="font-size:10.0pt;color:#009900">+</span></tt><span style="color:#009900"><br>
</span><tt><span style="font-size:10.0pt"> add_clang_executable(clang</span></tt><br>
<tt><span style="font-size:10.0pt">   driver.cpp</span></tt><br>
<tt><span style="font-size:10.0pt">   cc1_main.cpp</span></tt><br>
<tt><span style="font-size:10.0pt">   cc1as_main.cpp</span></tt><br>
<tt><span style="font-size:10.0pt;color:#009900">+  ${def_file}</span></tt><span style="color:#009900"><br>
</span><tt><span style="font-size:10.0pt">   )</span></tt><br>
<tt><span style="font-size:10.0pt"> </span></tt><br>
<tt><span style="font-size:10.0pt"> target_link_libraries(clang</span></tt><br>
<tt><span style="font-size:10.0pt">@@ -40,6 +47,10 @@ target_link_libraries(clang</span></tt><br>
<tt><span style="font-size:10.0pt"> </span></tt><br>
<tt><span style="font-size:10.0pt"> set_target_properties(clang PROPERTIES VERSION ${CLANG_EXECUTABLE_VERSION})</span></tt><br>
<tt><span style="font-size:10.0pt"> </span></tt><br>
<tt><span style="font-size:10.0pt;color:#009900">+if(MSVC)</span></tt><span style="color:#009900"><br>
</span><tt><span style="font-size:10.0pt;color:#009900">+  set_target_properties(clang PROPERTIES ENABLE_EXPORTS true)</span></tt><span style="color:#009900"><br>
</span><tt><span style="font-size:10.0pt;color:#009900">+endif(MSVC)</span></tt><span style="color:#009900"><br>
</span><tt><span style="font-size:10.0pt;color:#009900">+</span></tt><span style="color:#009900"><br>
</span><tt><span style="font-size:10.0pt"> add_dependencies(clang clang-headers)</span></tt><br>
<tt><span style="font-size:10.0pt"> </span></tt><br>
<tt><span style="font-size:10.0pt"> if(UNIX)</span></tt><o:p></o:p></p>
<p class="MsoNormal"><br>
Note that on Windows we only support CMake builds.<br>
<br>
Documentation for ENABLE_EXPORTS is here: <a href="http://www.cmake.org/cmake/help/v2.8.10/cmake.html#prop_tgt:ENABLE_EXPORTS">
http://www.cmake.org/cmake/help/v2.8.10/cmake.html#prop_tgt:ENABLE_EXPORTS</a><br>
<br>
On the plug-in side we just added 'clang' to the list of Polly's target link libraries.<br>
<br>
<br>
<br>
<o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">How do you get the list of symbols to import in the plugin DLL build?  Do you manually collect it from a bare link of the plug-in .obj’s with no library references?</span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"> </span><o:p></o:p></p>
<p class="MsoNormal">I wish I could say I did something intelligent here, but unfortunately this was a manual process. I would attempt to link, note any unresolved externals, add them to the def file, and then relink. I don't consider this to be a maintainable
 solution in general. However at the time we were under pressure to release and discovered our Windows issues very late. So I did not spend much time thinking about a better solution to managing the exports.<br>
<br>
<br>
<o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Or did you succeed in building a DLL-based version of clang? (Not one big clang DLL like I was experimenting with, but the normal libraries as DLLs.)  If so,
 how did you do the exports and imports in general?</span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"> </span><o:p></o:p></p>
<p class="MsoNormal">No. We're just building a stand-alone clang executable.<br>
<br>
<br>
<o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Doing so without declspec(import/export) seemed problematic because of the 16K limit on the number of exports or some-such.  I know exporting everything in
 one big DLL would exceed that, but I’m not sure about separate DLLs.</span><o:p></o:p></p>
<p class="MsoNormal">Hmm. We did not run into any size limitations. Perhaps because we were exporting just what Polly needed.<br>
<br>
<br>
<o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"> </span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">How do you register the plugin’s action?  In my hack, I had to have the plugin DLL provide a named function derived from the plug-in name in order for clang
 to find it.</span><o:p></o:p></p>
<p class="MsoNormal">We didn't have to do anything special here. Static initializers in the Polly dll run on load which register the Polly passes (see lib/RegisterPasses.cpp in the Polly source). Is there a difference in the way that back-end plug-ins work
 versus clang AST plug-ins?<br>
<br>
Hope this helps.<br>
<br>
Cheers,<br>
Matthew<br>
<br>
<br>
<br>
<o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"> </span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Thanks.</span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"> </span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">-John</span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"> </span><o:p></o:p></p>
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> Gao, Yunzhong
<br>
<b>Sent:</b> Wednesday, March 20, 2013 2:42 PM<br>
<b>To:</b> Thompson, John<br>
<b>Cc:</b> 'Matthew Curtis'; '<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a>'<br>
<b>Subject:</b> RE: [PATCH] Implement a sane plugin API for clang</span><o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Hi John,</span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">The other day I ran across a post by Matthew of the Polly team and it seems that the Polly</span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">team might have made some progress regarding plug-in support on Windows.</span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><a href="http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20130311/168147.html">http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20130311/168147.html</a></span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"> </span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Although I do not fully understand their implementation, it sounds like the Polly team was</span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">not trying to add __declspec(dllimport/dllexport) all over the clang/llvm source base. They</span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">used a .def file to export the necessary symbols from the clang executable, and then they</span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">just tried to use the imported symbols without __declspec(dllimport). According to the</span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">MSDN blog entry below, dllimport is not necessary for function calls and is only necessary</span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">for data access. I am cc’ing Matthew in case I misunderstood Polly’s implementation.</span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><a href="http://blogs.msdn.com/b/russellk/archive/2005/03/20/399465.aspx?wa=wsignin1.0">http://blogs.msdn.com/b/russellk/archive/2005/03/20/399465.aspx?wa=wsignin1.0</a></span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"> </span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">I think both the Cygwin and the mingw environments on Windows provide a dlltool</span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">executable that can automate the generation of .def files from either the object files or a</span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">static library. I am not aware of equivalent tools in the Visual Studio package; you may have</span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">to write some scripts to extract and package the symbols if you are using Visual Studio.</span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"> </span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">HTH,</span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">- Gao</span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"> </span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"> </span><o:p></o:p></p>
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">
<a href="mailto:cfe-commits-bounces@cs.uiuc.edu">cfe-commits-bounces@cs.uiuc.edu</a> [<a href="mailto:cfe-commits-bounces@cs.uiuc.edu">mailto:cfe-commits-bounces@cs.uiuc.edu</a>]
<b>On Behalf Of </b>Thompson, John<br>
<b>Sent:</b> Friday, March 15, 2013 6:04 PM<br>
<b>To:</b> <a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<b>Subject:</b> RE: [PATCH] Implement a sane plugin API for clang</span><o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Hi Sean,</span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"> </span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">I missed the discussion, but I saw your message and wanted to find out where things stood on the plug-in API with respect to Windows.</span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"> </span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">A year or two ago I wrote a plug-in for Clang for generating LUA bindings, and developing on Windows, found that the plug-in mechanism didn’t work on Windows,
 because it relies on how *nix systems do DLLs.  Unfortunately, in Windows land, a plug-in DLL would have to be linked with Clang libraries which are DLLs, and apparently building the Clang libraries as DLLs is problematic, due to the build system and the messy
 business of importing/exporting symbols.</span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"> </span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">I managed to skirt the issue by still building the plug-in against the static libraries, and hacking clang to look up call an entry point function with a name
 based on the plug-in name so it could hook up the objects in the plug-in.  This, of course, was kind of dangerous, because the plugin module and the clang executable would have totally separate static data areas, not to mention the duplicated code segments.</span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"> </span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Then I did some work on making a big Clang DLL, to skirt some of the DLL import/export issues, just exporting the symbol references needed between the driver
 and the library, using some header conventions for handling the exports.  I intended to pursue this further, and try to resolve the clang DLL build issues, but haven’t been able to get back to it.</span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"> </span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Has anyone else worked on resolving the plugin issues for Windows or the Clang-libraries-as-DLLs build?</span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"> </span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">-John</span><o:p></o:p></p>
<div>
<div>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
</div>
</div>
<p class="MsoNormal"><br>
<br>
<br>
<o:p></o:p></p>
<pre>-- <o:p></o:p></pre>
<pre>Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation<o:p></o:p></pre>
</div>
</body>
</html>