diff options
author | Stuart Ellis <stuart.ellis@arm.com> | 2021-06-23 18:05:29 +0100 |
---|---|---|
committer | Andrzej Warzynski <andrzej.warzynski@arm.com> | 2021-07-01 08:10:40 +0000 |
commit | 788a5d4afe6407e647454a9832a7b4a27fba06bf (patch) | |
tree | a61e31c4fb41302e36c3478a13f91163aaf7c773 /flang/lib/FrontendTool | |
parent | 226f925c3f3461cbd3e76f383069b01b5f7db2f3 (diff) | |
download | llvm-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.cpp | 67 |
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) |