aboutsummaryrefslogtreecommitdiff
path: root/flang/lib/FrontendTool
diff options
context:
space:
mode:
authorStuart Ellis <stuart.ellis@arm.com>2021-06-23 18:05:29 +0100
committerAndrzej Warzynski <andrzej.warzynski@arm.com>2021-07-01 08:10:40 +0000
commit788a5d4afe6407e647454a9832a7b4a27fba06bf (patch)
treea61e31c4fb41302e36c3478a13f91163aaf7c773 /flang/lib/FrontendTool
parent226f925c3f3461cbd3e76f383069b01b5f7db2f3 (diff)
downloadllvm-788a5d4afe6407e647454a9832a7b4a27fba06bf.zip
llvm-788a5d4afe6407e647454a9832a7b4a27fba06bf.tar.gz
llvm-788a5d4afe6407e647454a9832a7b4a27fba06bf.tar.bz2
PoC for Flang Driver Plugins
Diffstat (limited to 'flang/lib/FrontendTool')
-rw-r--r--flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp67
1 files changed, 67 insertions, 0 deletions
diff --git a/flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp b/flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp
index 243e251..8ef0c93 100644
--- a/flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp
+++ b/flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp
@@ -13,11 +13,14 @@
#include "flang/Frontend/CompilerInstance.h"
#include "flang/Frontend/FrontendActions.h"
+#include "flang/Frontend/FrontendAction.h"
+#include "flang/Frontend/FrontendPluginRegistry.h"
#include "clang/Driver/Options.h"
#include "llvm/Option/OptTable.h"
#include "llvm/Option/Option.h"
#include "llvm/Support/BuryPointer.h"
#include "llvm/Support/CommandLine.h"
+#include "llvm/Support/DynamicLibrary.h"
namespace Fortran::frontend {
@@ -79,6 +82,22 @@ static std::unique_ptr<FrontendAction> CreateFrontendBaseAction(
case InitOnly:
return std::make_unique<InitOnlyAction>();
break;
+ case PluginAction: {
+ llvm::outs() << "---------- (case: PluginAction) --------\n";
+ llvm::outs() << " Plugin Action: " << ci.frontendOpts().ActionName << "\n";
+ for (const FrontendPluginRegistry::entry &plugin : FrontendPluginRegistry::entries()) {
+ llvm::outs() << " " << plugin.getName() << "\t-- " << plugin.getDesc() << "\n";
+ if (plugin.getName() == ci.frontendOpts().ActionName) {
+ llvm::outs() << "We have found the plugin name!! :-)\n";
+ std::unique_ptr<PluginParseTreeAction> P(plugin.instantiate());
+ return std::move(P);
+ }
+ }
+
+ unsigned diagID = ci.diagnostics().getCustomDiagID(clang::DiagnosticsEngine::Error, "unable to find plugin '%0'");
+ ci.diagnostics().Report(diagID) << ci.frontendOpts().ActionName;
+ return nullptr;
+ }
default:
break;
// TODO:
@@ -92,6 +111,26 @@ static std::unique_ptr<FrontendAction> CreateFrontendBaseAction(
return 0;
}
+/// <<< TEMP Plugin Example
+
+class HelloWorldFlangPlugin : public PluginParseTreeAction
+{
+ protected:
+ void ExecuteAction() override {
+ llvm::outs() << "Hello World from your new plugin (Hello World)\n";
+ }
+};
+
+class HelloTwoFlangPlugin : public PluginParseTreeAction
+{
+ protected:
+ void ExecuteAction() override {
+ llvm::outs() << "Hello World from your new plugin (Hello Two)\n";
+ }
+};
+
+/// <<<<< TEMP Plugin Example
+
std::unique_ptr<FrontendAction> CreateFrontendAction(CompilerInstance &ci) {
// Create the underlying action.
std::unique_ptr<FrontendAction> act = CreateFrontendBaseAction(ci);
@@ -100,6 +139,7 @@ std::unique_ptr<FrontendAction> CreateFrontendAction(CompilerInstance &ci) {
return act;
}
+
bool ExecuteCompilerInvocation(CompilerInstance *flang) {
// Honor -help.
if (flang->frontendOpts().showHelp_) {
@@ -117,6 +157,33 @@ bool ExecuteCompilerInvocation(CompilerInstance *flang) {
return true;
}
+ llvm::outs() << "------ (ExecuteCompilerInvocation) -----\n";
+
+ // Load any requested plugins.
+ for (const std::string &Path : flang->frontendOpts().plugins) {
+ llvm::outs() << " Load :: Path >> " << Path << "\n";
+ std::string Error;
+ if (llvm::sys::DynamicLibrary::LoadLibraryPermanently(Path.c_str(), &Error)) {
+ unsigned diagID = flang->diagnostics().getCustomDiagID(clang::DiagnosticsEngine::Error, "unable to load plugin '%0': '%1'");
+ flang->diagnostics().Report(diagID) << Path << Error;
+ }
+ }
+
+ llvm::outs() << " Plugin Registry List >>\n";
+ for (const FrontendPluginRegistry::entry &plugin : FrontendPluginRegistry::entries()) {
+ llvm::outs() << plugin.getName() << " -- " << plugin.getDesc() << "\n";
+ }
+ llvm::outs() << " << Plugin Registry List\n";
+
+ static FrontendPluginRegistry::Add<HelloWorldFlangPlugin> X("-hello-wor", "simple Plugin example");
+ static FrontendPluginRegistry::Add<HelloTwoFlangPlugin> Y("hellotwo", "another print plugin example");
+
+ llvm::outs() << "----- (\\ExecuteCompilerInvocation) -----\n";
+
+ // If there were errors in processing arguments, don't do anything else.
+ if (flang->diagnostics().hasErrorOccurred())
+ return false;
+
// Create and execute the frontend action.
std::unique_ptr<FrontendAction> act(CreateFrontendAction(*flang));
if (!act)