[clang] f4f9ad0 - Reland "[clang-repl] Allow loading of plugins in clang-repl."
Vassil Vassilev via cfe-commits
cfe-commits at lists.llvm.org
Tue Oct 5 06:04:09 PDT 2021
Author: Vassil Vassilev
Date: 2021-10-05T13:04:01Z
New Revision: f4f9ad0f5d8e8994c677c3712dff7585bf8bd963
URL: https://github.com/llvm/llvm-project/commit/f4f9ad0f5d8e8994c677c3712dff7585bf8bd963
DIFF: https://github.com/llvm/llvm-project/commit/f4f9ad0f5d8e8994c677c3712dff7585bf8bd963.diff
LOG: Reland "[clang-repl] Allow loading of plugins in clang-repl."
Differential revision: https://reviews.llvm.org/D110484
Added:
clang/test/Interpreter/plugins.cpp
Modified:
clang/include/clang/Frontend/CompilerInstance.h
clang/lib/Frontend/CompilerInstance.cpp
clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp
clang/lib/Interpreter/IncrementalParser.cpp
clang/tools/clang-repl/CMakeLists.txt
clang/tools/clang-repl/ClangRepl.cpp
Removed:
################################################################################
diff --git a/clang/include/clang/Frontend/CompilerInstance.h b/clang/include/clang/Frontend/CompilerInstance.h
index 861b15020329b..74e152ea59520 100644
--- a/clang/include/clang/Frontend/CompilerInstance.h
+++ b/clang/include/clang/Frontend/CompilerInstance.h
@@ -219,6 +219,9 @@ class CompilerInstance : public ModuleLoader {
// of the context or else not CompilerInstance specific.
bool ExecuteAction(FrontendAction &Act);
+ /// Load the list of plugins requested in the \c FrontendOptions.
+ void LoadRequestedPlugins();
+
/// }
/// @name Compiler Invocation and Options
/// {
diff --git a/clang/lib/Frontend/CompilerInstance.cpp b/clang/lib/Frontend/CompilerInstance.cpp
index 8de2e75388bed..a9c7566163560 100644
--- a/clang/lib/Frontend/CompilerInstance.cpp
+++ b/clang/lib/Frontend/CompilerInstance.cpp
@@ -23,6 +23,7 @@
#include "clang/Frontend/FrontendAction.h"
#include "clang/Frontend/FrontendActions.h"
#include "clang/Frontend/FrontendDiagnostic.h"
+#include "clang/Frontend/FrontendPluginRegistry.h"
#include "clang/Frontend/LogDiagnosticPrinter.h"
#include "clang/Frontend/SerializedDiagnosticPrinter.h"
#include "clang/Frontend/TextDiagnosticPrinter.h"
@@ -1029,6 +1030,27 @@ bool CompilerInstance::ExecuteAction(FrontendAction &Act) {
return !getDiagnostics().getClient()->getNumErrors();
}
+void CompilerInstance::LoadRequestedPlugins() {
+ // Load any requested plugins.
+ for (const std::string &Path : getFrontendOpts().Plugins) {
+ std::string Error;
+ if (llvm::sys::DynamicLibrary::LoadLibraryPermanently(Path.c_str(), &Error))
+ getDiagnostics().Report(diag::err_fe_unable_to_load_plugin)
+ << Path << Error;
+ }
+
+ // Check if any of the loaded plugins replaces the main AST action
+ for (const FrontendPluginRegistry::entry &Plugin :
+ FrontendPluginRegistry::entries()) {
+ std::unique_ptr<PluginASTAction> P(Plugin.instantiate());
+ if (P->getActionType() == PluginASTAction::ReplaceAction) {
+ getFrontendOpts().ProgramAction = clang::frontend::PluginAction;
+ getFrontendOpts().ActionName = Plugin.getName().str();
+ break;
+ }
+ }
+}
+
/// Determine the appropriate source input kind based on language
/// options.
static Language getLanguageFromOptions(const LangOptions &LangOpts) {
diff --git a/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp b/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp
index b95851e380d28..dc8409f88dfad 100644
--- a/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp
+++ b/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp
@@ -203,24 +203,7 @@ bool ExecuteCompilerInvocation(CompilerInstance *Clang) {
return true;
}
- // Load any requested plugins.
- for (const std::string &Path : Clang->getFrontendOpts().Plugins) {
- std::string Error;
- if (llvm::sys::DynamicLibrary::LoadLibraryPermanently(Path.c_str(), &Error))
- Clang->getDiagnostics().Report(diag::err_fe_unable_to_load_plugin)
- << Path << Error;
- }
-
- // Check if any of the loaded plugins replaces the main AST action
- for (const FrontendPluginRegistry::entry &Plugin :
- FrontendPluginRegistry::entries()) {
- std::unique_ptr<PluginASTAction> P(Plugin.instantiate());
- if (P->getActionType() == PluginASTAction::ReplaceAction) {
- Clang->getFrontendOpts().ProgramAction = clang::frontend::PluginAction;
- Clang->getFrontendOpts().ActionName = Plugin.getName().str();
- break;
- }
- }
+ Clang->LoadRequestedPlugins();
// Honor -mllvm.
//
diff --git a/clang/lib/Interpreter/IncrementalParser.cpp b/clang/lib/Interpreter/IncrementalParser.cpp
index 897e2cd1aaed8..6c5a26e599033 100644
--- a/clang/lib/Interpreter/IncrementalParser.cpp
+++ b/clang/lib/Interpreter/IncrementalParser.cpp
@@ -65,6 +65,8 @@ class IncrementalAction : public WrapperFrontendAction {
case frontend::ParseSyntaxOnly:
Act = CreateFrontendAction(CI);
break;
+ case frontend::PluginAction:
+ LLVM_FALLTHROUGH;
case frontend::EmitAssembly:
LLVM_FALLTHROUGH;
case frontend::EmitObj:
diff --git a/clang/test/Interpreter/plugins.cpp b/clang/test/Interpreter/plugins.cpp
new file mode 100644
index 0000000000000..032f704624ad7
--- /dev/null
+++ b/clang/test/Interpreter/plugins.cpp
@@ -0,0 +1,14 @@
+// RUN: cat %s | clang-repl -Xcc -Xclang -Xcc -load -Xcc -Xclang \
+// RUN: -Xcc %llvmshlibdir/PrintFunctionNames%pluginext -Xcc -Xclang\
+// RUN: -Xcc -add-plugin -Xcc -Xclang -Xcc print-fns 2>&1 | FileCheck %s
+// REQUIRES: host-supports-jit, plugins, examples
+
+int i = 10;
+extern "C" int printf(const char*,...);
+auto r1 = printf("i = %d\n", i);
+quit
+
+
+// CHECK: top-level-decl: "i"
+// CHECK-NEXT: top-level-decl: "r1"
+// CHECK-NEXT: i = 10
diff --git a/clang/tools/clang-repl/CMakeLists.txt b/clang/tools/clang-repl/CMakeLists.txt
index 060c62aa419c7..30e3b2be9ed37 100644
--- a/clang/tools/clang-repl/CMakeLists.txt
+++ b/clang/tools/clang-repl/CMakeLists.txt
@@ -13,6 +13,12 @@ add_clang_tool(clang-repl
clang_target_link_libraries(clang-repl PUBLIC
clangBasic
+ clangFrontend
clangInterpreter
clangTooling
)
+
+# Support plugins.
+if(CLANG_PLUGIN_SUPPORT)
+ export_executable_symbols_for_plugins(clang-repl)
+endif()
diff --git a/clang/tools/clang-repl/ClangRepl.cpp b/clang/tools/clang-repl/ClangRepl.cpp
index 8e50418f705c2..4240b9d425df1 100644
--- a/clang/tools/clang-repl/ClangRepl.cpp
+++ b/clang/tools/clang-repl/ClangRepl.cpp
@@ -80,6 +80,9 @@ int main(int argc, const char **argv) {
llvm::install_fatal_error_handler(LLVMErrorHandler,
static_cast<void *>(&CI->getDiagnostics()));
+ // Load any requested plugins.
+ CI->LoadRequestedPlugins();
+
auto Interp = ExitOnErr(clang::Interpreter::create(std::move(CI)));
for (const std::string &input : OptInputs) {
if (auto Err = Interp->ParseAndExecute(input))
More information about the cfe-commits
mailing list