[PATCH] D106137: [flang][driver] Add support for Frontend Plugins
stuartellis created this revision. Herald added subscribers: dang, mgorny. Herald added a reviewer: sscalpone. Herald added a reviewer: awarzynski. stuartellis requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits. Introducing a plugin API and a simple HelloWorld Plugin example. This patch adds the `-load` and `-plugin` flags to frontend driver and the code around using custom frontend actions from within a plugin shared library object. It also adds to the Driver-help test to check the help option with the updated driver flags. Additionally, the patch creates a plugin-example test to check the HelloWorld plugin example runs correctly. As part of this, a new CMake flag (FLANG_BUILD_EXAMPLES) is added to allow the example to be built and for the test to run. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D106137 Files: clang/include/clang/Driver/Options.td flang/CMakeLists.txt flang/examples/CMakeLists.txt flang/examples/HelloWorld/CMakeLists.txt flang/examples/HelloWorld/HelloWorldPlugin.cpp flang/include/flang/Frontend/FrontendActions.h flang/include/flang/Frontend/FrontendOptions.h flang/include/flang/Frontend/FrontendPluginRegistry.h flang/lib/Frontend/CompilerInvocation.cpp flang/lib/Frontend/FrontendAction.cpp flang/lib/Frontend/FrontendActions.cpp flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp flang/test/CMakeLists.txt flang/test/Driver/driver-help.f90 flang/test/Driver/plugin-example.f90 flang/test/lit.cfg.py flang/test/lit.site.cfg.py.in flang/tools/flang-driver/CMakeLists.txt Index: flang/tools/flang-driver/CMakeLists.txt === --- flang/tools/flang-driver/CMakeLists.txt +++ flang/tools/flang-driver/CMakeLists.txt @@ -27,4 +27,6 @@ clangBasic ) +export_executable_symbols_for_plugins(flang-new) + install(TARGETS flang-new DESTINATION bin) Index: flang/test/lit.site.cfg.py.in === --- flang/test/lit.site.cfg.py.in +++ flang/test/lit.site.cfg.py.in @@ -3,6 +3,8 @@ import sys config.llvm_tools_dir = "@LLVM_TOOLS_DIR@" +config.llvm_shlib_dir = path(r"@SHLIBDIR@") +config.llvm_plugin_ext = "@LLVM_PLUGIN_EXT@" config.lit_tools_dir = "@LLVM_LIT_TOOLS_DIR@" config.flang_obj_root = "@FLANG_BINARY_DIR@" config.flang_src_dir = "@FLANG_SOURCE_DIR@" @@ -10,8 +12,10 @@ config.flang_intrinsic_modules_dir = "@FLANG_INTRINSIC_MODULES_DIR@" config.flang_llvm_tools_dir = "@CMAKE_BINARY_DIR@/bin" config.flang_lib_dir = "@CMAKE_BINARY_DIR@/lib" +config.flang_examples = @FLANG_BUILD_EXAMPLES@ config.python_executable = "@PYTHON_EXECUTABLE@" config.flang_standalone_build = @FLANG_STANDALONE_BUILD@ +config.has_plugins = @LLVM_ENABLE_PLUGINS@ config.cc = "@CMAKE_C_COMPILER@" # Control the regression test for flang-new driver @@ -24,6 +28,7 @@ try: config.llvm_tools_dir = config.llvm_tools_dir % lit_config.params config.flang_tools_dir = config.flang_tools_dir % lit_config.params +config.llvm_shlib_dir = config.llvm_shlib_dir % lit_config.params except KeyError: e = sys.exc_info()[1] key, = e.args Index: flang/test/lit.cfg.py === --- flang/test/lit.cfg.py +++ flang/test/lit.cfg.py @@ -30,6 +30,8 @@ '.CUF', '.f18', '.F18', '.fir', '.f03', '.F03', '.f08', '.F08'] config.substitutions.append(('%PATH%', config.environment['PATH'])) +config.substitutions.append(('%llvmshlibdir', config.llvm_shlib_dir)) +config.substitutions.append(('%pluginext', config.llvm_plugin_ext)) llvm_config.use_default_substitutions() @@ -45,6 +47,14 @@ else: config.available_features.add('old-flang-driver') +# If the flang examples are built, add examples to the config +if config.flang_examples: +config.available_features.add('examples') + +# Plugins (loadable modules) +if config.has_plugins and config.llvm_plugin_ext: +config.available_features.add('plugins') + # test_source_root: The root path where tests are located. config.test_source_root = os.path.dirname(__file__) Index: flang/test/Driver/plugin-example.f90 === --- /dev/null +++ flang/test/Driver/plugin-example.f90 @@ -0,0 +1,7 @@ +! Check that loading and running the Hello World plugin example results in the correct print statement +! This requires that the examples are built (FLANG_BUILD_EXAMPLES=ON) + +! REQUIRES: new-flang-driver, plugins, examples + +! RUN: %flang_fc1 -load %llvmshlibdir/flangHelloWorldPlugin%pluginext -plugin -hello-world %s 2>&1 | FileCheck %s +! CHECK: Hello World from your new plugin Index: flang/test/Driver/driver-help.f90 === --- flang/test/Driver/driver-help.f90 +++ flang/test/Driver/driver-help.f90 @@ -109,11 +109,13 @@ ! HELP-FC1-NEXT: -help
[PATCH] D106137: [flang][driver] Add support for Frontend Plugins
stuartellis updated this revision to Diff 360887. stuartellis added a comment. Address review comments Added some comments to a couple of places Added new `FLANG_PLUGIN_SUPPORT` CMake flag to control exporting executable symbols Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D106137/new/ https://reviews.llvm.org/D106137 Files: clang/include/clang/Driver/Options.td flang/CMakeLists.txt flang/examples/CMakeLists.txt flang/examples/HelloWorld/CMakeLists.txt flang/examples/HelloWorld/HelloWorldPlugin.cpp flang/include/flang/Frontend/FrontendActions.h flang/include/flang/Frontend/FrontendOptions.h flang/include/flang/Frontend/FrontendPluginRegistry.h flang/lib/Frontend/CompilerInvocation.cpp flang/lib/Frontend/FrontendAction.cpp flang/lib/Frontend/FrontendActions.cpp flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp flang/test/CMakeLists.txt flang/test/Driver/driver-help.f90 flang/test/Driver/plugin-example.f90 flang/test/lit.cfg.py flang/test/lit.site.cfg.py.in flang/tools/flang-driver/CMakeLists.txt Index: flang/tools/flang-driver/CMakeLists.txt === --- flang/tools/flang-driver/CMakeLists.txt +++ flang/tools/flang-driver/CMakeLists.txt @@ -27,4 +27,11 @@ clangBasic ) +option(FLANG_PLUGIN_SUPPORT "Build Flang with plugin support." ON) + +# Enable support for plugins, which need access to symbols from flang-new +if(FLANG_PLUGIN_SUPPORT) + export_executable_symbols_for_plugins(flang-new) +endif() + install(TARGETS flang-new DESTINATION bin) Index: flang/test/lit.site.cfg.py.in === --- flang/test/lit.site.cfg.py.in +++ flang/test/lit.site.cfg.py.in @@ -3,6 +3,8 @@ import sys config.llvm_tools_dir = "@LLVM_TOOLS_DIR@" +config.llvm_shlib_dir = path(r"@SHLIBDIR@") +config.llvm_plugin_ext = "@LLVM_PLUGIN_EXT@" config.lit_tools_dir = "@LLVM_LIT_TOOLS_DIR@" config.flang_obj_root = "@FLANG_BINARY_DIR@" config.flang_src_dir = "@FLANG_SOURCE_DIR@" @@ -10,8 +12,10 @@ config.flang_intrinsic_modules_dir = "@FLANG_INTRINSIC_MODULES_DIR@" config.flang_llvm_tools_dir = "@CMAKE_BINARY_DIR@/bin" config.flang_lib_dir = "@CMAKE_BINARY_DIR@/lib" +config.flang_examples = @FLANG_BUILD_EXAMPLES@ config.python_executable = "@PYTHON_EXECUTABLE@" config.flang_standalone_build = @FLANG_STANDALONE_BUILD@ +config.has_plugins = @LLVM_ENABLE_PLUGINS@ config.cc = "@CMAKE_C_COMPILER@" # Control the regression test for flang-new driver @@ -24,6 +28,7 @@ try: config.llvm_tools_dir = config.llvm_tools_dir % lit_config.params config.flang_tools_dir = config.flang_tools_dir % lit_config.params +config.llvm_shlib_dir = config.llvm_shlib_dir % lit_config.params except KeyError: e = sys.exc_info()[1] key, = e.args Index: flang/test/lit.cfg.py === --- flang/test/lit.cfg.py +++ flang/test/lit.cfg.py @@ -30,6 +30,8 @@ '.CUF', '.f18', '.F18', '.fir', '.f03', '.F03', '.f08', '.F08'] config.substitutions.append(('%PATH%', config.environment['PATH'])) +config.substitutions.append(('%llvmshlibdir', config.llvm_shlib_dir)) +config.substitutions.append(('%pluginext', config.llvm_plugin_ext)) llvm_config.use_default_substitutions() @@ -45,6 +47,14 @@ else: config.available_features.add('old-flang-driver') +# If the flang examples are built, add examples to the config +if config.flang_examples: +config.available_features.add('examples') + +# Plugins (loadable modules) +if config.has_plugins: +config.available_features.add('plugins') + # test_source_root: The root path where tests are located. config.test_source_root = os.path.dirname(__file__) Index: flang/test/Driver/plugin-example.f90 === --- /dev/null +++ flang/test/Driver/plugin-example.f90 @@ -0,0 +1,11 @@ +! Check that loading and running the Hello World plugin example results in the correct print statement +! Also check that when a plugin name isn't found, the error diagnostic is correct +! This requires that the examples are built (FLANG_BUILD_EXAMPLES=ON) + +! REQUIRES: new-flang-driver, plugins, examples, shell + +! RUN: %flang_fc1 -load %llvmshlibdir/flangHelloWorldPlugin%pluginext -plugin -hello-world %s 2>&1 | FileCheck %s +! CHECK: Hello World from your new Flang plugin + +! RUN: not %flang_fc1 -load %llvmshlibdir/flangHelloWorldPlugin%pluginext -plugin -wrong-name %s 2>&1 | FileCheck %s --check-prefix=ERROR +! ERROR: error: unable to find plugin '-wrong-name' Index: flang/test/Driver/driver-help.f90 === --- flang/test/Driver/driver-help.f90 +++ flang/test/Driver/driver-help.f90 @@ -109,11 +109,13 @@ ! HELP-FC1-NEXT: -help Display available options ! HELP-FC1-NEXT: -init-only
[PATCH] D106137: [flang][driver] Add support for Frontend Plugins
stuartellis marked 9 inline comments as done. stuartellis added inline comments. Comment at: flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp:92 +unsigned diagID = ci.diagnostics().getCustomDiagID( +clang::DiagnosticsEngine::Error, "unable to find plugin '%0'"); +ci.diagnostics().Report(diagID) << ci.frontendOpts().ActionName; awarzynski wrote: > Could you add a test for this diagnostic? Added diagnostic test to the end of plugin-example.f90 test Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D106137/new/ https://reviews.llvm.org/D106137 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D102849: [flang][driver] Add support for the "-init-only" option
stuartellis created this revision. Herald added a reviewer: sscalpone. Herald added a subscriber: dang. Herald added a reviewer: awarzynski. stuartellis requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits. Adding the -init-only option and corresponding frontend action to generate a diagnostic. It also adds a Driver test to check this action. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D102849 Files: clang/include/clang/Driver/Options.td flang/include/flang/Frontend/FrontendActions.h flang/include/flang/Frontend/FrontendOptions.h flang/lib/Frontend/CompilerInvocation.cpp flang/lib/Frontend/FrontendActions.cpp flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp flang/test/Driver/driver-help.f90 flang/test/Driver/init-only.f90 Index: flang/test/Driver/init-only.f90 === --- /dev/null +++ flang/test/Driver/init-only.f90 @@ -0,0 +1,5 @@ +! Verify that -init-only flag generates a diagnostic as expected + +! RUN: %flang_fc1 -init-only 2>&1 | FileCheck %s + +! CHECK: warning: Use `-init-only` for testing purposes only Index: flang/test/Driver/driver-help.f90 === --- flang/test/Driver/driver-help.f90 +++ flang/test/Driver/driver-help.f90 @@ -104,6 +104,7 @@ ! HELP-FC1-NEXT: -fopenmp Parse OpenMP pragmas and generate parallel code. ! HELP-FC1-NEXT: -fxor-operator Enable .XOR. as a synonym of .NEQV. ! HELP-FC1-NEXT: -help Display available options +! HELP-FC1-NEXT: -init-only Only execute frontend initialization ! HELP-FC1-NEXT: -IAdd directory to the end of the list of include search paths ! HELP-FC1-NEXT: -module-dir Put MODULE files in ! HELP-FC1-NEXT: -nocpp Disable predefined and command line preprocessor macros Index: flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp === --- flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp +++ flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp @@ -73,6 +73,9 @@ case GetSymbolsSources: return std::make_unique(); break; + case InitializationOnly: +return std::make_unique(); +break; default: break; // TODO: Index: flang/lib/Frontend/FrontendActions.cpp === --- flang/lib/Frontend/FrontendActions.cpp +++ flang/lib/Frontend/FrontendActions.cpp @@ -447,3 +447,11 @@ clang::DiagnosticsEngine::Error, "code-generation is not available yet"); ci.diagnostics().Report(DiagID); } + +void InitializationOnlyAction::ExecuteAction() { + CompilerInstance &ci = this->instance(); + unsigned DiagID = + ci.diagnostics().getCustomDiagID(clang::DiagnosticsEngine::Warning, + "Use `-init-only` for testing purposes only"); + ci.diagnostics().Report(DiagID); +} Index: flang/lib/Frontend/CompilerInvocation.cpp === --- flang/lib/Frontend/CompilerInvocation.cpp +++ flang/lib/Frontend/CompilerInvocation.cpp @@ -162,9 +162,12 @@ case clang::driver::options::OPT_fget_definition: opts.programAction_ = GetDefinition; break; +case clang::driver::options::OPT_init_only: + opts.programAction_ = InitializationOnly; + break; // TODO: - // case calng::driver::options::OPT_emit_llvm: + // case clang::driver::options::OPT_emit_llvm: // case clang::driver::options::OPT_emit_llvm_only: // case clang::driver::options::OPT_emit_codegen_only: // case clang::driver::options::OPT_emit_module: Index: flang/include/flang/Frontend/FrontendOptions.h === --- flang/include/flang/Frontend/FrontendOptions.h +++ flang/include/flang/Frontend/FrontendOptions.h @@ -71,7 +71,10 @@ GetDefinition, /// Parse, run semantics and then dump symbol sources map - GetSymbolsSources + GetSymbolsSources, + + /// Only execute frontend initialization + InitializationOnly /// TODO: RunPreprocessor, EmitLLVM, EmitLLVMOnly, /// EmitCodeGenOnly, EmitAssembly, (...) Index: flang/include/flang/Frontend/FrontendActions.h === --- flang/include/flang/Frontend/FrontendActions.h +++ flang/include/flang/Frontend/FrontendActions.h @@ -38,6 +38,10 @@ void ExecuteAction() override; }; +class InitializationOnlyAction : public FrontendAction { + void ExecuteAction() override; +}; + //===--===// // Prescan Actions //===--===// Index: clang/include/clang/Driver/Options.td === ---
[PATCH] D102849: [flang][driver] Add support for the "-init-only" option
stuartellis updated this revision to Diff 349307. stuartellis added a comment. Address review comments Renaming InitializationOnly to InitOnly Add missing line in init-only.f90 Updating commit message with init-only/test-io comparison Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D102849/new/ https://reviews.llvm.org/D102849 Files: clang/include/clang/Driver/Options.td flang/include/flang/Frontend/FrontendActions.h flang/include/flang/Frontend/FrontendOptions.h flang/lib/Frontend/CompilerInvocation.cpp flang/lib/Frontend/FrontendActions.cpp flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp flang/test/Driver/driver-help.f90 flang/test/Driver/init-only.f90 Index: flang/test/Driver/init-only.f90 === --- /dev/null +++ flang/test/Driver/init-only.f90 @@ -0,0 +1,7 @@ +! Verify that -init-only flag generates a diagnostic as expected + +! REQUIRES: new-flang-driver + +! RUN: %flang_fc1 -init-only 2>&1 | FileCheck %s + +! CHECK: warning: Use `-init-only` for testing purposes only Index: flang/test/Driver/driver-help.f90 === --- flang/test/Driver/driver-help.f90 +++ flang/test/Driver/driver-help.f90 @@ -104,6 +104,7 @@ ! HELP-FC1-NEXT: -fopenmp Parse OpenMP pragmas and generate parallel code. ! HELP-FC1-NEXT: -fxor-operator Enable .XOR. as a synonym of .NEQV. ! HELP-FC1-NEXT: -help Display available options +! HELP-FC1-NEXT: -init-only Only execute frontend initialization ! HELP-FC1-NEXT: -IAdd directory to the end of the list of include search paths ! HELP-FC1-NEXT: -module-dir Put MODULE files in ! HELP-FC1-NEXT: -nocpp Disable predefined and command line preprocessor macros Index: flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp === --- flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp +++ flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp @@ -73,6 +73,9 @@ case GetSymbolsSources: return std::make_unique(); break; + case InitOnly: +return std::make_unique(); +break; default: break; // TODO: Index: flang/lib/Frontend/FrontendActions.cpp === --- flang/lib/Frontend/FrontendActions.cpp +++ flang/lib/Frontend/FrontendActions.cpp @@ -447,3 +447,11 @@ clang::DiagnosticsEngine::Error, "code-generation is not available yet"); ci.diagnostics().Report(DiagID); } + +void InitOnlyAction::ExecuteAction() { + CompilerInstance &ci = this->instance(); + unsigned DiagID = + ci.diagnostics().getCustomDiagID(clang::DiagnosticsEngine::Warning, + "Use `-init-only` for testing purposes only"); + ci.diagnostics().Report(DiagID); +} Index: flang/lib/Frontend/CompilerInvocation.cpp === --- flang/lib/Frontend/CompilerInvocation.cpp +++ flang/lib/Frontend/CompilerInvocation.cpp @@ -162,9 +162,12 @@ case clang::driver::options::OPT_fget_definition: opts.programAction_ = GetDefinition; break; +case clang::driver::options::OPT_init_only: + opts.programAction_ = InitOnly; + break; // TODO: - // case calng::driver::options::OPT_emit_llvm: + // case clang::driver::options::OPT_emit_llvm: // case clang::driver::options::OPT_emit_llvm_only: // case clang::driver::options::OPT_emit_codegen_only: // case clang::driver::options::OPT_emit_module: Index: flang/include/flang/Frontend/FrontendOptions.h === --- flang/include/flang/Frontend/FrontendOptions.h +++ flang/include/flang/Frontend/FrontendOptions.h @@ -71,7 +71,10 @@ GetDefinition, /// Parse, run semantics and then dump symbol sources map - GetSymbolsSources + GetSymbolsSources, + + /// Only execute frontend initialization + InitOnly /// TODO: RunPreprocessor, EmitLLVM, EmitLLVMOnly, /// EmitCodeGenOnly, EmitAssembly, (...) Index: flang/include/flang/Frontend/FrontendActions.h === --- flang/include/flang/Frontend/FrontendActions.h +++ flang/include/flang/Frontend/FrontendActions.h @@ -38,6 +38,10 @@ void ExecuteAction() override; }; +class InitOnlyAction : public FrontendAction { + void ExecuteAction() override; +}; + //===--===// // Prescan Actions //===--===// Index: clang/include/clang/Driver/Options.td === --- clang/include/clang/Driver/Options.td +++ clang/include/clang/Driver/Options.td @@ -5224,8 +5224,6 @@ HelpText<
[PATCH] D106137: [flang][driver] Add support for Frontend Plugins
stuartellis updated this revision to Diff 365411. stuartellis marked an inline comment as done. stuartellis added a comment. Address review comments Small changes due to rebase Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D106137/new/ https://reviews.llvm.org/D106137 Files: clang/include/clang/Driver/Options.td flang/CMakeLists.txt flang/examples/CMakeLists.txt flang/examples/HelloWorld/CMakeLists.txt flang/examples/HelloWorld/HelloWorldPlugin.cpp flang/include/flang/Frontend/FrontendActions.h flang/include/flang/Frontend/FrontendOptions.h flang/include/flang/Frontend/FrontendPluginRegistry.h flang/lib/Frontend/CompilerInvocation.cpp flang/lib/Frontend/FrontendAction.cpp flang/lib/Frontend/FrontendActions.cpp flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp flang/test/CMakeLists.txt flang/test/Driver/driver-help.f90 flang/test/Driver/plugin-example.f90 flang/test/lit.cfg.py flang/test/lit.site.cfg.py.in flang/tools/flang-driver/CMakeLists.txt Index: flang/tools/flang-driver/CMakeLists.txt === --- flang/tools/flang-driver/CMakeLists.txt +++ flang/tools/flang-driver/CMakeLists.txt @@ -27,4 +27,11 @@ clangBasic ) +option(FLANG_PLUGIN_SUPPORT "Build Flang with plugin support." ON) + +# Enable support for plugins, which need access to symbols from flang-new +if(FLANG_PLUGIN_SUPPORT) + export_executable_symbols_for_plugins(flang-new) +endif() + install(TARGETS flang-new DESTINATION bin) Index: flang/test/lit.site.cfg.py.in === --- flang/test/lit.site.cfg.py.in +++ flang/test/lit.site.cfg.py.in @@ -3,6 +3,8 @@ import sys config.llvm_tools_dir = "@LLVM_TOOLS_DIR@" +config.llvm_shlib_dir = path(r"@SHLIBDIR@") +config.llvm_plugin_ext = "@LLVM_PLUGIN_EXT@" config.lit_tools_dir = "@LLVM_LIT_TOOLS_DIR@" config.flang_obj_root = "@FLANG_BINARY_DIR@" config.flang_src_dir = "@FLANG_SOURCE_DIR@" @@ -10,8 +12,10 @@ config.flang_intrinsic_modules_dir = "@FLANG_INTRINSIC_MODULES_DIR@" config.flang_llvm_tools_dir = "@CMAKE_BINARY_DIR@/bin" config.flang_lib_dir = "@CMAKE_BINARY_DIR@/lib" +config.flang_examples = @FLANG_BUILD_EXAMPLES@ config.python_executable = "@PYTHON_EXECUTABLE@" config.flang_standalone_build = @FLANG_STANDALONE_BUILD@ +config.has_plugins = @LLVM_ENABLE_PLUGINS@ config.cc = "@CMAKE_C_COMPILER@" # Support substitution of the tools_dir with user parameters. This is @@ -19,6 +23,7 @@ try: config.llvm_tools_dir = config.llvm_tools_dir % lit_config.params config.flang_tools_dir = config.flang_tools_dir % lit_config.params +config.llvm_shlib_dir = config.llvm_shlib_dir % lit_config.params except KeyError: e = sys.exc_info()[1] key, = e.args Index: flang/test/lit.cfg.py === --- flang/test/lit.cfg.py +++ flang/test/lit.cfg.py @@ -30,6 +30,8 @@ '.CUF', '.f18', '.F18', '.fir', '.f03', '.F03', '.f08', '.F08'] config.substitutions.append(('%PATH%', config.environment['PATH'])) +config.substitutions.append(('%llvmshlibdir', config.llvm_shlib_dir)) +config.substitutions.append(('%pluginext', config.llvm_plugin_ext)) llvm_config.use_default_substitutions() @@ -42,6 +44,14 @@ # config. config.available_features.add('new-flang-driver') +# If the flang examples are built, add examples to the config +if config.flang_examples: +config.available_features.add('examples') + +# Plugins (loadable modules) +if config.has_plugins: +config.available_features.add('plugins') + # test_source_root: The root path where tests are located. config.test_source_root = os.path.dirname(__file__) Index: flang/test/Driver/plugin-example.f90 === --- /dev/null +++ flang/test/Driver/plugin-example.f90 @@ -0,0 +1,11 @@ +! Check that loading and running the Hello World plugin example results in the correct print statement +! Also check that when a plugin name isn't found, the error diagnostic is correct +! This requires that the examples are built (FLANG_BUILD_EXAMPLES=ON) + +! REQUIRES: new-flang-driver, plugins, examples, shell + +! RUN: %flang_fc1 -load %llvmshlibdir/flangHelloWorldPlugin%pluginext -plugin -hello-world %s 2>&1 | FileCheck %s +! CHECK: Hello World from your new Flang plugin + +! RUN: not %flang_fc1 -load %llvmshlibdir/flangHelloWorldPlugin%pluginext -plugin -wrong-name %s 2>&1 | FileCheck %s --check-prefix=ERROR +! ERROR: error: unable to find plugin '-wrong-name' Index: flang/test/Driver/driver-help.f90 === --- flang/test/Driver/driver-help.f90 +++ flang/test/Driver/driver-help.f90 @@ -123,11 +123,13 @@ ! HELP-FC1-NEXT: -help Display available options ! HELP-FC1-NEXT: -init-only Only execute frontend initial