[cfe-dev] Clang won't run example plugins on windows.

Michael Kruse via cfe-dev cfe-dev at lists.llvm.org
Fri Dec 18 14:32:48 PST 2020


One difficulty with plugins on Windows is that the plugin dll needs to
know which executable it is loaded into. This is specified by the
PLUGIN_TOOL argument to add_llvm_library. For the hello world example,
it is:

add_llvm_library(PrintFunctionNames [...] PLUGIN_TOOL clang)

That is, it will only work when loaded by the "clang.exe" executable.
Just renaming clang.exe to something else would already break it, as
you observed with "clang++.exe".

A proper solution would be to build a libLLVM.dll and use that as
"PLUGIN_TOOL", all executables would import that dll instead of
statically linking it. However, we encounter the next problem: Windows
dlls only allow up 2^16 exported symbols and libLLVM.dll would require
more, which is why LLVM_BUILD_LLVM_DYLIB=ON is not supported under
Windows.

Michael


Am Do., 17. Dez. 2020 um 19:12 Uhr schrieb Szoke Balazs via cfe-dev
<cfe-dev at lists.llvm.org>:
>
> I have cloned the llvm-project repository.
>
>
>
> Then I have generated a Visual Studio solution for the project using:
>
>
>
> cmake -G "Visual Studio 16" -DLLVM_ENABLE_PROJECTS="clang;lld" -DLLVM_EXPORT_SYMBOLS_FOR_PLUGINS=ON -DLLVM_TARGETS_TO_BUILD=X86 -DCLANG_BUILD_EXAMPLES=ON -DCMAKE_INSTALL_PREFIX=install ...\llvm-project\llvm
>
>
>
> The important part is DLLVM_EXPORT_SYMBOLS_FOR_PLUGINS, as suggested here:
>
> https://llvm.discourse.group/t/how-to-create-pass-independently-on-windows/474/5
>
>
>
> The solution and all the projects are generated. Then I build Clang itself and an example clang plugin that is already provided in the llvm-project source. The PrintFunctionNames seem to be the hello world of Clang plugins, so I have built that, according to the llvm documentation.
>
>
>
> The build successfully ran, and now I have llvm/clang in the install dir, with the PrintFunctionNames plugin.
>
>
>
> The problem is that I can not invoke the plugin. As far as I know, there is 3 ways to tell calng to use your plugin.
>
>
>
> The cc1 interface:
>
> I can call my plugin with:
>
> clang -cc1 -load PrintFunctionNames.dll -plugin print-fns test.cpp
>
> This only works with clang and won’t work with clang++. Moreover, clang won’t find the standard headers, but that is expected behaviour with cc1 according to the documentation.
>
>
>
> The -Xclang interface:
>
> I call my plugin with:
>
> clang -Xclang -load -Xclang PrintFunctionNames.dll -Xclang -plugin -Xclang print-fns test.cpp
>
> This works aswell, and since Xclang appends to the cc1, standard library headers are found too. However, calling clang++ instead of clang won’t work here either. Clang++ outputs an error: unable to find plugin 'print-fns'.
>
>
>
> -          The fplugin interface:
>
> I have added the necessary code according to the documentation:
>
> https://clang.llvm.org/docs/ClangPlugins.html
>
> // Automatically run the plugin after the main AST action
>
> PluginASTAction::ActionType getActionType() override {
>
>   return AddAfterMainAction;
>
> }
>
> After that, I can run the plugin with:
>
> clang -fplugin=PrintFunctionNames.dll test.cpp
>
> This runs as expected, but once again, clang++ wont run the plugin. Moreover, no error messages are generated, clang++ just refuses to run the plugin.
>
>
>
> I do not understand why clang seems to work fine with plugins, but clang++ refuses to run any. I have tried all the provided example plugins, none of them works with clang++, while all of them works as expected with clang.
>
>
>
> I have tested both the latest version and llvm 11 too, I am using windows 10.
>
>
>
> I would really appreciate any insights as to why clang++ would behave differently when it comes to plugins.
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev


More information about the cfe-dev mailing list