aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikhail Glushenkov <foldr@codedgers.com>2008-09-22 20:49:34 +0000
committerMikhail Glushenkov <foldr@codedgers.com>2008-09-22 20:49:34 +0000
commitc82ce4a8a7d2e09cc2b510a6759e169e28dd136a (patch)
tree62621694b4b03bd8603ea50f346d0db32d46dd92
parent9ecd30c4a279bd66418166dfb6663f1e78710400 (diff)
Plugin support for llvmc2 (a-la opt).
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@56465 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--tools/llvmc2/AutoGenerated.cpp15
-rw-r--r--tools/llvmc2/AutoGenerated.h34
-rw-r--r--tools/llvmc2/CompilationGraph.h2
-rw-r--r--tools/llvmc2/Plugin.cpp41
-rw-r--r--tools/llvmc2/Plugin.h56
-rw-r--r--tools/llvmc2/Tool.h1
-rw-r--r--tools/llvmc2/llvmc.cpp3
-rw-r--r--tools/llvmc2/plugins/Hello/Hello.cpp35
-rw-r--r--tools/llvmc2/plugins/Hello/Makefile17
-rw-r--r--utils/TableGen/LLVMCConfigurationEmitter.cpp46
10 files changed, 195 insertions, 55 deletions
diff --git a/tools/llvmc2/AutoGenerated.cpp b/tools/llvmc2/AutoGenerated.cpp
index 4cc85f92d0..9f34e58b14 100644
--- a/tools/llvmc2/AutoGenerated.cpp
+++ b/tools/llvmc2/AutoGenerated.cpp
@@ -11,20 +11,5 @@
//
//===----------------------------------------------------------------------===//
-#include "AutoGenerated.h"
-#include "CompilationGraph.h"
-#include "Tool.h"
-
-#include "llvm/ADT/StringExtras.h"
-#include "llvm/Support/CommandLine.h"
-
-#include <cstdlib>
-#include <stdexcept>
-
-using namespace llvm;
-using namespace llvmc;
-
-extern cl::opt<std::string> OutputFilename;
-
// The auto-generated file
#include "AutoGenerated.inc"
diff --git a/tools/llvmc2/AutoGenerated.h b/tools/llvmc2/AutoGenerated.h
deleted file mode 100644
index 0de7208f7f..0000000000
--- a/tools/llvmc2/AutoGenerated.h
+++ /dev/null
@@ -1,34 +0,0 @@
-//===--- AutoGenerated.h - The LLVM Compiler Driver -------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open
-// Source License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// Auto-generated tool descriptions - public interface.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_TOOLS_LLVMC2_AUTOGENERATED_H
-#define LLVM_TOOLS_LLVMC2_AUTOGENERATED_H
-
-#include "llvm/ADT/StringMap.h"
-
-#include <string>
-
-namespace llvmc {
-
- class LanguageMap;
- class CompilationGraph;
-
- /// PopulateLanguageMap - The auto-generated function that fills in
- /// the language map (map from file extensions to language names).
- void PopulateLanguageMap(LanguageMap& langMap);
- /// PopulateCompilationGraph - The auto-generated function that
- /// populates the compilation graph with nodes and edges.
- void PopulateCompilationGraph(CompilationGraph& tools);
-}
-
-#endif // LLVM_TOOLS_LLVMC2_AUTOGENERATED_H
diff --git a/tools/llvmc2/CompilationGraph.h b/tools/llvmc2/CompilationGraph.h
index 71ae2272eb..57758bfd9e 100644
--- a/tools/llvmc2/CompilationGraph.h
+++ b/tools/llvmc2/CompilationGraph.h
@@ -14,7 +14,6 @@
#ifndef LLVM_TOOLS_LLVMC2_COMPILATION_GRAPH_H
#define LLVM_TOOLS_LLVMC2_COMPILATION_GRAPH_H
-#include "AutoGenerated.h"
#include "Tool.h"
#include "llvm/ADT/GraphTraits.h"
@@ -30,6 +29,7 @@
namespace llvmc {
+ class CompilationGraph;
typedef llvm::StringSet<> InputLanguagesSet;
/// LanguageMap - Maps from extensions to language names.
diff --git a/tools/llvmc2/Plugin.cpp b/tools/llvmc2/Plugin.cpp
new file mode 100644
index 0000000000..70d99878ba
--- /dev/null
+++ b/tools/llvmc2/Plugin.cpp
@@ -0,0 +1,41 @@
+//===--- Plugin.cpp - The LLVM Compiler Driver ------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open
+// Source License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// Plugin support for llvmc2.
+//
+//===----------------------------------------------------------------------===//
+
+#include "Plugin.h"
+
+#include <vector>
+
+namespace {
+ typedef std::vector<llvmc::BasePlugin*> PluginRegistry;
+ static PluginRegistry GlobalPluginRegistry;
+}
+
+namespace llvmc {
+
+ RegisterPluginImpl::RegisterPluginImpl(BasePlugin* plugin) {
+ GlobalPluginRegistry.push_back(plugin);
+ }
+
+ void PopulateLanguageMap(LanguageMap& langMap) {
+ for (PluginRegistry::const_iterator B = GlobalPluginRegistry.begin(),
+ E = GlobalPluginRegistry.end(); B != E; ++B)
+ (*B)->PopulateLanguageMap(langMap);
+ }
+
+ void PopulateCompilationGraph(CompilationGraph& graph) {
+ for (PluginRegistry::const_iterator B = GlobalPluginRegistry.begin(),
+ E = GlobalPluginRegistry.end(); B != E; ++B)
+ (*B)->PopulateCompilationGraph(graph);
+ }
+
+}
diff --git a/tools/llvmc2/Plugin.h b/tools/llvmc2/Plugin.h
new file mode 100644
index 0000000000..ba22450697
--- /dev/null
+++ b/tools/llvmc2/Plugin.h
@@ -0,0 +1,56 @@
+//===--- Plugin.h - The LLVM Compiler Driver --------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open
+// Source License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// Plugin support for llvmc2.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_TOOLS_LLVMC2_PLUGIN_H
+#define LLVM_TOOLS_LLVMC2_PLUGIN_H
+
+namespace llvmc {
+
+ class LanguageMap;
+ class CompilationGraph;
+
+ /// BasePlugin - An abstract base class for all LLVMC plugins.
+ struct BasePlugin {
+
+ /// PopulateLanguageMap - The auto-generated function that fills in
+ /// the language map (map from file extensions to language names).
+ virtual void PopulateLanguageMap(LanguageMap&) const = 0;
+
+ /// PopulateCompilationGraph - The auto-generated function that
+ /// populates the compilation graph with nodes and edges.
+ virtual void PopulateCompilationGraph(CompilationGraph&) const = 0;
+ };
+
+ // Helper class for RegisterPlugin.
+ class RegisterPluginImpl {
+ protected:
+ RegisterPluginImpl(BasePlugin*);
+ };
+
+ /// RegisterPlugin<T> template - Used to register LLVMC plugins.
+ template <class T>
+ struct RegisterPlugin : RegisterPluginImpl {
+ RegisterPlugin() : RegisterPluginImpl (new T()) {}
+ };
+
+ /// PopulateLanguageMap - Fills in the language map by calling
+ /// PopulateLanguageMap methods of all plugins.
+ void PopulateLanguageMap(LanguageMap& langMap);
+
+ /// PopulateCompilationGraph - Populates the compilation graph by
+ /// calling PopulateCompilationGraph methods of all plugins.
+ void PopulateCompilationGraph(CompilationGraph& tools);
+
+}
+
+#endif // LLVM_TOOLS_LLVMC2_PLUGIN_H
diff --git a/tools/llvmc2/Tool.h b/tools/llvmc2/Tool.h
index f4fe0c4ed5..6f7cb8d051 100644
--- a/tools/llvmc2/Tool.h
+++ b/tools/llvmc2/Tool.h
@@ -25,6 +25,7 @@
namespace llvmc {
+ class LanguageMap;
typedef std::vector<llvm::sys::Path> PathVector;
typedef llvm::StringSet<> InputLanguagesSet;
diff --git a/tools/llvmc2/llvmc.cpp b/tools/llvmc2/llvmc.cpp
index 08a59890eb..bd5ea2b73f 100644
--- a/tools/llvmc2/llvmc.cpp
+++ b/tools/llvmc2/llvmc.cpp
@@ -16,10 +16,11 @@
#include "CompilationGraph.h"
#include "Error.h"
-#include "Tool.h"
+#include "Plugin.h"
#include "llvm/System/Path.h"
#include "llvm/Support/CommandLine.h"
+#include "llvm/Support/PluginLoader.h"
#include <iostream>
#include <stdexcept>
diff --git a/tools/llvmc2/plugins/Hello/Hello.cpp b/tools/llvmc2/plugins/Hello/Hello.cpp
new file mode 100644
index 0000000000..729d3c8166
--- /dev/null
+++ b/tools/llvmc2/plugins/Hello/Hello.cpp
@@ -0,0 +1,35 @@
+//===- Hello.cpp - Example code from "Writing an LLVM Pass" ---------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// Test plugin for LLVMC.
+//
+//===----------------------------------------------------------------------===//
+
+// TODO: Since llvmc2 has now gained support for plugins, its header
+// files should be probably moved into LLVM include dir.
+
+#include "../../CompilationGraph.h"
+#include "../../Plugin.h"
+
+#include <iostream>
+
+namespace {
+struct MyPlugin : public llvmc::BasePlugin {
+ void PopulateLanguageMap(llvmc::LanguageMap&) const
+ { std::cout << "Hello!\n"; }
+
+ void PopulateCompilationGraph(llvmc::CompilationGraph&) const
+ {}
+};
+
+static llvmc::RegisterPlugin<MyPlugin> RP;
+
+}
+
+
diff --git a/tools/llvmc2/plugins/Hello/Makefile b/tools/llvmc2/plugins/Hello/Makefile
new file mode 100644
index 0000000000..3aeef24eea
--- /dev/null
+++ b/tools/llvmc2/plugins/Hello/Makefile
@@ -0,0 +1,17 @@
+##===- lib/Transforms/Hello/Makefile -----------------------*- Makefile -*-===##
+#
+# The LLVM Compiler Infrastructure
+#
+# This file is distributed under the University of Illinois Open Source
+# License. See LICENSE.TXT for details.
+#
+##===----------------------------------------------------------------------===##
+
+LEVEL = ../../../..
+LIBRARYNAME = LLVMCHello
+LOADABLE_MODULE = 1
+REQUIRES_EH = 1
+USEDLIBS =
+
+include $(LEVEL)/Makefile.common
+
diff --git a/utils/TableGen/LLVMCConfigurationEmitter.cpp b/utils/TableGen/LLVMCConfigurationEmitter.cpp
index 9bfb5da88f..9bb3be3747 100644
--- a/utils/TableGen/LLVMCConfigurationEmitter.cpp
+++ b/utils/TableGen/LLVMCConfigurationEmitter.cpp
@@ -1456,7 +1456,8 @@ void EmitPopulateLanguageMap (const RecordKeeper& Records, std::ostream& O)
throw std::string("Error in the language map definition!");
// Generate code
- O << "void llvmc::PopulateLanguageMap(LanguageMap& langMap) {\n";
+ O << "namespace {\n\n";
+ O << "void PopulateLanguageMapLocal(LanguageMap& langMap) {\n";
for (unsigned i = 0; i < LangsToSuffixesList->size(); ++i) {
Record* LangToSuffixes = LangsToSuffixesList->getElementAsRecord(i);
@@ -1470,7 +1471,7 @@ void EmitPopulateLanguageMap (const RecordKeeper& Records, std::ostream& O)
<< "\"] = \"" << Lang << "\";\n";
}
- O << "}\n\n";
+ O << "}\n\n}\n\n";
}
/// FillInToolToLang - Fills in two tables that map tool names to
@@ -1593,7 +1594,8 @@ void EmitPopulateCompilationGraph (Record* CompilationGraph,
ListInit* edges = CompilationGraph->getValueAsListInit("edges");
// Generate code
- O << "void llvmc::PopulateCompilationGraph(CompilationGraph& G) {\n";
+ O << "namespace {\n\n";
+ O << "void PopulateCompilationGraphLocal(CompilationGraph& G) {\n";
// Insert vertices
@@ -1627,7 +1629,7 @@ void EmitPopulateCompilationGraph (Record* CompilationGraph,
O << ");\n";
}
- O << "}\n\n";
+ O << "}\n\n}\n\n";
}
/// ExtractHookNames - Extract the hook names from all instances of
@@ -1704,6 +1706,38 @@ void EmitHookDeclarations(const ToolPropertiesList& ToolProps,
O << "}\n\n";
}
+/// EmitRegisterPlugin - Emit code to register this plugin.
+void EmitRegisterPlugin(std::ostream& O) {
+ O << "namespace {\n\n"
+ << "struct Plugin : public llvmc::BasePlugin {\n"
+ << Indent1 << "void PopulateLanguageMap(LanguageMap& langMap) const\n"
+ << Indent1 << "{ PopulateLanguageMapLocal(langMap); }\n\n"
+ << Indent1
+ << "void PopulateCompilationGraph(CompilationGraph& graph) const\n"
+ << Indent1 << "{ PopulateCompilationGraphLocal(graph); }\n"
+ << "};\n\n"
+
+ << "static llvmc::RegisterPlugin<Plugin> RP;\n\n}\n\n";
+}
+
+/// EmitInclude - Emit necessary #include directives.
+void EmitIncludes(std::ostream& O) {
+ O << "#include \"CompilationGraph.h\"\n"
+ << "#include \"Plugin.h\"\n"
+ << "#include \"Tool.h\"\n\n"
+
+ << "#include \"llvm/ADT/StringExtras.h\"\n"
+ << "#include \"llvm/Support/CommandLine.h\"\n\n"
+
+ << "#include <cstdlib>\n"
+ << "#include <stdexcept>\n\n"
+
+ << "using namespace llvm;\n"
+ << "using namespace llvmc;\n\n"
+
+ << "extern cl::opt<std::string> OutputFilename;\n\n";
+}
+
// End of anonymous namespace
}
@@ -1713,6 +1747,7 @@ void LLVMCConfigurationEmitter::run (std::ostream &O) {
// Emit file header.
EmitSourceFileHeader("LLVMC Configuration Library", O);
+ EmitIncludes(O);
// Get a list of all defined Tools.
RecordVector Tools = Records.getAllDerivedDefinitions("Tool");
@@ -1760,6 +1795,9 @@ void LLVMCConfigurationEmitter::run (std::ostream &O) {
// Emit PopulateCompilationGraph() function.
EmitPopulateCompilationGraph(CompilationGraphRecord, O);
+ // Emit code for plugin registration.
+ EmitRegisterPlugin(O);
+
// EOF
} catch (std::exception& Error) {
throw Error.what() + std::string(" - usually this means a syntax error.");