Great. I can now wait to try. How can I compile a pass as a DLL? Can you include a sample CMakefile?<br><br><div class="gmail_quote">On Mon, Jun 29, 2009 at 11:09 AM, Mikhail Glushenkov <span dir="ltr"><<a href="mailto:foldr@codedgers.com">foldr@codedgers.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">Author: foldr<br>
Date: Sun Jun 28 22:09:15 2009<br>
New Revision: 74417<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=74417&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=74417&view=rev</a><br>
Log:<br>
Make dynamic LLVMC plugins work on Windows (finally!).<br>
<br>
Implemented by making lib/CompilerDriver a shared library that holds all the<br>
global static data (CommandLine options, plugin registry) that we unfortunately<br>
have to live with.<br>
<br>
Added:<br>
    llvm/trunk/lib/CompilerDriver/BuiltinOptions.cpp<br>
Modified:<br>
    llvm/trunk/Makefile.rules<br>
    llvm/trunk/include/llvm/CompilerDriver/Main.inc<br>
    llvm/trunk/lib/CompilerDriver/Makefile<br>
    llvm/trunk/lib/CompilerDriver/Tool.cpp<br>
<br>
Modified: llvm/trunk/Makefile.rules<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/Makefile.rules?rev=74417&r1=74416&r2=74417&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/Makefile.rules?rev=74417&r1=74416&r2=74417&view=diff</a><br>

<br>
==============================================================================<br>
--- llvm/trunk/Makefile.rules (original)<br>
+++ llvm/trunk/Makefile.rules Sun Jun 28 22:09:15 2009<br>
@@ -200,6 +200,7 @@<br>
 LIBRARYNAME := $(patsubst %,plugin_llvmc_%,$(LLVMC_PLUGIN))<br>
 CPP.Flags += -DLLVMC_PLUGIN_NAME=$(LLVMC_PLUGIN)<br>
 REQUIRES_EH := 1<br>
+LD.Flags += -lCompilerDriver<br>
<br>
 # Build a dynamic library if the user runs `make` directly from the plugin<br>
 # directory.<br>
@@ -217,9 +218,8 @@<br>
 ifdef LLVMC_BASED_DRIVER<br>
<br>
 TOOLNAME = $(LLVMC_BASED_DRIVER)<br>
-LLVMLIBS = CompilerDriver.a<br>
-LINK_COMPONENTS = support system<br>
 REQUIRES_EH := 1<br>
+LD.Flags += -lCompilerDriver<br>
<br>
 # Preprocessor magic that generates references to static variables in built-in<br>
 # plugins.<br>
<br>
Modified: llvm/trunk/include/llvm/CompilerDriver/Main.inc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CompilerDriver/Main.inc?rev=74417&r1=74416&r2=74417&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CompilerDriver/Main.inc?rev=74417&r1=74416&r2=74417&view=diff</a><br>

<br>
==============================================================================<br>
--- llvm/trunk/include/llvm/CompilerDriver/Main.inc (original)<br>
+++ llvm/trunk/include/llvm/CompilerDriver/Main.inc Sun Jun 28 22:09:15 2009<br>
@@ -24,8 +24,6 @@<br>
 #include "llvm/CompilerDriver/Plugin.h"<br>
<br>
 #include "llvm/System/Path.h"<br>
-#include "llvm/Support/CommandLine.h"<br>
-#include "llvm/Support/PluginLoader.h"<br>
<br>
 #include <iostream><br>
 #include <stdexcept><br>
@@ -35,42 +33,6 @@<br>
 namespace sys = llvm::sys;<br>
 using namespace llvmc;<br>
<br>
-// Built-in command-line options.<br>
-// External linkage here is intentional.<br>
-<br>
-cl::list<std::string> InputFilenames(cl::Positional, cl::desc("<input file>"),<br>
-                                     cl::ZeroOrMore);<br>
-cl::opt<std::string> OutputFilename("o", cl::desc("Output file name"),<br>
-                                    cl::value_desc("file"), cl::Prefix);<br>
-cl::list<std::string> Languages("x",<br>
-          cl::desc("Specify the language of the following input files"),<br>
-          cl::ZeroOrMore);<br>
-cl::opt<bool> DryRun("dry-run",<br>
-                     cl::desc("Only pretend to run commands"));<br>
-cl::opt<bool> VerboseMode("v",<br>
-                          cl::desc("Enable verbose mode"));<br>
-<br>
-cl::opt<bool> CheckGraph("check-graph",<br>
-                         cl::desc("Check the compilation graph for errors"),<br>
-                         cl::Hidden);<br>
-cl::opt<bool> WriteGraph("write-graph",<br>
-                         cl::desc("Write compilation-graph.dot file"),<br>
-                         cl::Hidden);<br>
-cl::opt<bool> ViewGraph("view-graph",<br>
-                         cl::desc("Show compilation graph in GhostView"),<br>
-                         cl::Hidden);<br>
-<br>
-cl::opt<SaveTempsEnum::Values> SaveTemps<br>
-("save-temps", cl::desc("Keep temporary files"),<br>
- cl::init(SaveTempsEnum::Unset),<br>
- cl::values(clEnumValN(SaveTempsEnum::Obj, "obj",<br>
-                       "Save files in the directory specified with -o"),<br>
-            clEnumValN(SaveTempsEnum::Cwd, "cwd",<br>
-                       "Use current working directory"),<br>
-            clEnumValN(SaveTempsEnum::Obj, "", "Same as 'cwd'"),<br>
-            clEnumValEnd),<br>
- cl::ValueOptional);<br>
-<br>
 namespace {<br>
<br>
   sys::Path getTempDir() {<br>
<br>
Added: llvm/trunk/lib/CompilerDriver/BuiltinOptions.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CompilerDriver/BuiltinOptions.cpp?rev=74417&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CompilerDriver/BuiltinOptions.cpp?rev=74417&view=auto</a><br>

<br>
==============================================================================<br>
--- llvm/trunk/lib/CompilerDriver/BuiltinOptions.cpp (added)<br>
+++ llvm/trunk/lib/CompilerDriver/BuiltinOptions.cpp Sun Jun 28 22:09:15 2009<br>
@@ -0,0 +1,52 @@<br>
+//===--- BuiltinOptions.cpp - The LLVM Compiler Driver ----------*- C++ -*-===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is distributed under the University of Illinois Open<br>
+// Source License. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+//<br>
+//  Definitions of all global command-line option variables.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+#include "llvm/CompilerDriver/BuiltinOptions.h"<br>
+#include "llvm/Support/PluginLoader.h"<br>
+<br>
+namespace cl = llvm::cl;<br>
+<br>
+// External linkage here is intentional.<br>
+<br>
+cl::list<std::string> InputFilenames(cl::Positional, cl::desc("<input file>"),<br>
+                                     cl::ZeroOrMore);<br>
+cl::opt<std::string> OutputFilename("o", cl::desc("Output file name"),<br>
+                                    cl::value_desc("file"), cl::Prefix);<br>
+cl::list<std::string> Languages("x",<br>
+          cl::desc("Specify the language of the following input files"),<br>
+          cl::ZeroOrMore);<br>
+cl::opt<bool> DryRun("dry-run",<br>
+                     cl::desc("Only pretend to run commands"));<br>
+cl::opt<bool> VerboseMode("v",<br>
+                          cl::desc("Enable verbose mode"));<br>
+<br>
+cl::opt<bool> CheckGraph("check-graph",<br>
+                         cl::desc("Check the compilation graph for errors"),<br>
+                         cl::Hidden);<br>
+cl::opt<bool> WriteGraph("write-graph",<br>
+                         cl::desc("Write compilation-graph.dot file"),<br>
+                         cl::Hidden);<br>
+cl::opt<bool> ViewGraph("view-graph",<br>
+                         cl::desc("Show compilation graph in GhostView"),<br>
+                         cl::Hidden);<br>
+<br>
+cl::opt<SaveTempsEnum::Values> SaveTemps<br>
+("save-temps", cl::desc("Keep temporary files"),<br>
+ cl::init(SaveTempsEnum::Unset),<br>
+ cl::values(clEnumValN(SaveTempsEnum::Obj, "obj",<br>
+                       "Save files in the directory specified with -o"),<br>
+            clEnumValN(SaveTempsEnum::Cwd, "cwd",<br>
+                       "Use current working directory"),<br>
+            clEnumValN(SaveTempsEnum::Obj, "", "Same as 'cwd'"),<br>
+            clEnumValEnd),<br>
+ cl::ValueOptional);<br>
<br>
Modified: llvm/trunk/lib/CompilerDriver/Makefile<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CompilerDriver/Makefile?rev=74417&r1=74416&r2=74417&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CompilerDriver/Makefile?rev=74417&r1=74416&r2=74417&view=diff</a><br>

<br>
==============================================================================<br>
--- llvm/trunk/lib/CompilerDriver/Makefile (original)<br>
+++ llvm/trunk/lib/CompilerDriver/Makefile Sun Jun 28 22:09:15 2009<br>
@@ -12,8 +12,22 @@<br>
 # We don't want this library to appear in `llvm-config --libs` output, so its<br>
 # name doesn't start with "LLVM".<br>
<br>
-LIBRARYNAME = CompilerDriver<br>
-LINK_COMPONENTS = support system<br>
+LIBRARYNAME = libCompilerDriver<br>
+LLVMLIBS = LLVMSupport.a LLVMSystem.a<br>
+LOADABLE_MODULE := 1<br>
 REQUIRES_EH := 1<br>
<br>
 include $(LEVEL)/Makefile.common<br>
+<br>
+FullLibName = $(LIBRARYNAME)$(SHLIBEXT)<br>
+<br>
+# Copy the library to the bin dir so that llvmc can find it.<br>
+all-local::<br>
+       $(Echo) Copying $(BuildMode) Shared Library $(FullLibName) \<br>
+       to $(ToolDir)<br>
+       -$(Verb) $(CP) $(LibDir)/$(FullLibName) $(ToolDir)/<br>
+<br>
+clean-local::<br>
+       $(Echo) Removing $(BuildMode) Shared Library $(FullLibName) \<br>
+       from $(ToolDir)<br>
+       -$(Verb) $(RM) -f $(ToolDir)/$(FullLibName)<br>
<br>
Modified: llvm/trunk/lib/CompilerDriver/Tool.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CompilerDriver/Tool.cpp?rev=74417&r1=74416&r2=74417&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CompilerDriver/Tool.cpp?rev=74417&r1=74416&r2=74417&view=diff</a><br>

<br>
==============================================================================<br>
--- llvm/trunk/lib/CompilerDriver/Tool.cpp (original)<br>
+++ llvm/trunk/lib/CompilerDriver/Tool.cpp Sun Jun 28 22:09:15 2009<br>
@@ -14,11 +14,17 @@<br>
 #include "llvm/CompilerDriver/BuiltinOptions.h"<br>
 #include "llvm/CompilerDriver/Tool.h"<br>
<br>
+#include "llvm/ADT/StringExtras.h"<br>
 #include "llvm/System/Path.h"<br>
<br>
 using namespace llvm;<br>
 using namespace llvmc;<br>
<br>
+// SplitString is used by derived Tool classes.<br>
+typedef void (*SplitStringFunPtr)(const std::string&,<br>
+                                  std::vector<std::string>&, const char*);<br>
+SplitStringFunPtr ForceLinkageSplitString = &llvm::SplitString;<br>
+<br>
 namespace {<br>
   sys::Path MakeTempFile(const sys::Path& TempDir, const std::string& BaseName,<br>
                          const std::string& Suffix) {<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">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/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br><br clear="all"><br>-- <br>-Howard<br>