Clang Plugin for Msys2's mingw x86_64-w64-windows

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Clang Plugin for Msys2's mingw x86_64-w64-windows

Vassil Vassilev via cfe-dev
Hello there,

I am trying to create a simple Clang plugin and test it on my Windows host with Msys2's mingw x86_64-w64-windows toolchain. The issue is that clang is failing to "find" the plugin after loading windows plugin dll. Can you please help me to figure out what is wrong here? I am very new to clang and the plugin framework. Thank you for any suggestion, Mark

1. creating plugin dll:

$ make -f makefile.mk
clang++ -c -std=c++14 -fno-exceptions -fno-rtti  -D_FILE_OFFSET_BITS=64 -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS   -I. -Ic:/msys64/mingw64/include  example_plugin_clang.cpp -o example_plugin_clang.o
clang++ -shared example_plugin_clang.o -static -o example-plugin-clang.dll -Lc:/msys64/mingw64/lib c:/msys64/mingw64/lib/libclang-cpp.dll.a c:/msys64/mingw64/lib/libLLVM.dll.a

2. test run: 

 $ make -f makefile.mk test
clang++ -Xclang -load -Xclang  <CURDIR> /example-plugin-clang.dll -Xclang -add-plugin -Xclang example-plugin-clang -c -std=c++11 example_cpp_class.cc -o example_cpp_class.o
error: unable to find plugin 'example-plugin-clang'
1 error generated.
mingw32-make: *** [makefile.mk:86: example_cpp_class.o] Error 1

...
$ nm example-plugin-clang.dll | grep example
00000000701c1cb0 t _GLOBAL__sub_I_example_plugin_clang.cpp
00000000701e9020 b _ZL26_example_plugin_clang_node

per example_plugin_clang.cpp:

static FrontendPluginRegistry::Add<FindDependenciesAction>
_example_plugin_clang_node(/*plugin Name=*/          "example-plugin-clang",
                           /*plugin Description=*/   "Print out header dependencies");

$ ntldd example-plugin-clang.dll
        libclang-cpp.dll => C:\msys64\mingw64\bin\libclang-cpp.dll (0x0000000000e10000)
        KERNEL32.dll => C:\WINDOWS\SYSTEM32\KERNEL32.dll (0x0000000005690000)
        msvcrt.dll => C:\WINDOWS\SYSTEM32\msvcrt.dll (0x00000000006d0000)

***

I tried an example for GCC plugin with the Msys2 GCC toolchain and this works:

$ make -f makefile.mk
g++ -c -std=c++11 -Wno-literal-suffix  -fno-exceptions -fno-rtti   -I. -Ic:/msys64/mingw64/include -Ic:/msys64/mingw64/lib/gcc/x86_64-w64-mingw32/9.3.0/plugin/include  example_plugin_gcc.cpp -o example_plugin_gcc.o
g++ -shared example_plugin_gcc.o -static -o example-plugin-gcc.dll c:/msys64/mingw64/lib/gcc/x86_64-w64-mingw32/9.3.0/plugin/cc1plus.exe.a

$ make -f makefile.mk test
g++  -fplugin=C:/Users/msx/demo/plugin/example-plugin-gcc.dll -c -std=c++11 example_cpp_class.cc -o example_cpp_class.o
Plugin info
===========

Base name: example-plugin-gcc
Full name: C:/Users/msx/demo/plugin/example-plugin-gcc.dll
Number of arguments of this plugin:0

Version info
============

Base version: 9.3.0
Date stamp: 20200312
Dev phase:
Revision:
Configuration arguments: ../gcc-9.3.0/configure --prefix=/mingw64 --with-local-prefix=/mingw64/local --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --with-native-system-header-dir=/mingw64/x86_64-w64-mingw32/include --libexecdir=/mingw64/lib --enable-bootstrap --with-arch=x86-64 --with-tune=generic --enable-languages=c,lto,c++,fortran,ada,objc,obj-c++ --enable-shared --enable-static --enable-libatomic --enable-threads=posix --enable-graphite --enable-fully-dynamic-string --enable-libstdcxx-filesystem-ts=yes --enable-libstdcxx-time=yes --disable-libstdcxx-pch --disable-libstdcxx-debug --disable-isl-version-check --enable-lto --enable-libgomp --disable-multilib --enable-checking=release --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --enable-plugin --with-libiconv --with-system-zlib --with-gmp=/mingw64 --with-mpfr=/mingw64 --with-mpc=/mingw64 --with-isl=/mingw64 --with-pkgversion='Rev2, Built by MSYS2 project' --with-bugurl=https://sourceforge.net/projects/msys2 --with-gnu-as --with-gnu-ld

Plugin successfully initialized

*** Other relevant info for clang plugin build ***

$ ldd example-plugin-clang.dll
        ntdll.dll => /c/WINDOWS/SYSTEM32/ntdll.dll (0x7fff6fb30000)
        KERNEL32.DLL => /c/WINDOWS/System32/KERNEL32.DLL (0x7fff6f890000)
        KERNELBASE.dll => /c/WINDOWS/System32/KERNELBASE.dll (0x7fff6c610000)
        msvcrt.dll => /c/WINDOWS/System32/msvcrt.dll (0x7fff6d540000)
        libclang-cpp.dll => /c/msys64/mingw64/bin/libclang-cpp.dll (0x67400000)
        ADVAPI32.dll => /c/WINDOWS/System32/ADVAPI32.dll (0x7fff6d020000)
        sechost.dll => /c/WINDOWS/System32/sechost.dll (0x7fff6e2c0000)
        zlib1.dll => /mingw64/bin/zlib1.dll (0x62e80000)
        RPCRT4.dll => /c/WINDOWS/System32/RPCRT4.dll (0x7fff6cec0000)
        ole32.dll => /c/WINDOWS/System32/ole32.dll (0x7fff6d300000)
        combase.dll => /c/WINDOWS/System32/combase.dll (0x7fff6de50000)
        ucrtbase.dll => /c/WINDOWS/System32/ucrtbase.dll (0x7fff6c970000)
        bcryptPrimitives.dll => /c/WINDOWS/System32/bcryptPrimitives.dll (0x7fff6c4e0000)
        GDI32.dll => /c/WINDOWS/System32/GDI32.dll (0x7fff6e360000)
        gdi32full.dll => /c/WINDOWS/System32/gdi32full.dll (0x7fff6bbf0000)
        msvcp_win.dll => /c/WINDOWS/System32/msvcp_win.dll (0x7fff6c8d0000)
        USER32.dll => /c/WINDOWS/System32/USER32.dll (0x7fff6dcb0000)
        win32u.dll => /c/WINDOWS/System32/win32u.dll (0x7fff6ca70000)
        SHELL32.dll => /c/WINDOWS/System32/SHELL32.dll (0x7fff6e390000)
        cfgmgr32.dll => /c/WINDOWS/System32/cfgmgr32.dll (0x7fff6c560000)
        shcore.dll => /c/WINDOWS/System32/shcore.dll (0x7fff6db80000)
        libwinpthread-1.dll => /mingw64/bin/libwinpthread-1.dll (0x64940000)
        windows.storage.dll => /c/WINDOWS/System32/windows.storage.dll (0x7fff6bd90000)
        profapi.dll => /c/WINDOWS/System32/profapi.dll (0x7fff6bb40000)
        powrprof.dll => /c/WINDOWS/System32/powrprof.dll (0x7fff6bb70000)
        shlwapi.dll => /c/WINDOWS/System32/shlwapi.dll (0x7fff6d2a0000)
        kernel.appcore.dll => /c/WINDOWS/System32/kernel.appcore.dll (0x7fff6bbd0000)
        cryptsp.dll => /c/WINDOWS/System32/cryptsp.dll (0x7fff6c8b0000)
        VERSION.dll => /c/WINDOWS/SYSTEM32/VERSION.dll (0x7fff60a40000)
        libstdc++-6.dll => /mingw64/bin/libstdc++-6.dll (0x6fc40000)
        libgcc_s_seh-1.dll => /mingw64/bin/libgcc_s_seh-1.dll (0x61440000)
        libz3.dll => /c/msys64/mingw64/bin/libz3.dll (0xcf0000)
        libz3.dll => /c/msys64/mingw64/bin/libz3.dll (0xcf0000)

- Tools -

Compiler:

$ clang++ --version
clang version 10.0.0 (https://github.com/msys2/MINGW-packages.git
3f880aaba91a3d9cdfb222dc270274731a2119a9
)
Target: x86_64-w64-windows-gnu
Thread model: posix
InstalledDir: C:\msys64\mingw64\bin

w/

$ llvm-config --version
10.0.0

Linker:

$ /c/msys64/mingw64/bin/ld --version
GNU ld (GNU Binutils) 2.34
Copyright (C) 2020 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or (at your option) a later
version.
This program has absolutely no warranty.

Make:

$ mingw32-make --version
GNU Make 4.3
Built for Windows32
Copyright (C) 1988-2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later

_______________________________________________
cfe-dev mailing list
[hidden email]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
Reply | Threaded
Open this post in threaded view
|

Re: Clang Plugin for Msys2's mingw x86_64-w64-windows

Vassil Vassilev via cfe-dev
clang/LLVM does not support dynamically loaded plugins on Windows. The
reasons are that
1. importing symbols require specifying which binary they are loaded
from. That is, clang.exe, clang++.exe, libLLVM.dll or clang-cpp.dll
2. There is a limit of ~2^16 exported symbols per dll. LLVM alone
already has more symbols.

Also see the thread
http://lists.llvm.org/pipermail/cfe-dev/2020-March/064919.html

Michael

Am Mo., 25. Mai 2020 um 17:31 Uhr schrieb mark via cfe-dev
<[hidden email]>:

>
> Hello there,
>
> I am trying to create a simple Clang plugin and test it on my Windows host with Msys2's mingw x86_64-w64-windows toolchain. The issue is that clang is failing to "find" the plugin after loading windows plugin dll. Can you please help me to figure out what is wrong here? I am very new to clang and the plugin framework. Thank you for any suggestion, Mark
>
> 1. creating plugin dll:
>
> $ make -f makefile.mk
> clang++ -c -std=c++14 -fno-exceptions -fno-rtti  -D_FILE_OFFSET_BITS=64 -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS   -I. -Ic:/msys64/mingw64/include  example_plugin_clang.cpp -o example_plugin_clang.o
> clang++ -shared example_plugin_clang.o -static -o example-plugin-clang.dll -Lc:/msys64/mingw64/lib c:/msys64/mingw64/lib/libclang-cpp.dll.a c:/msys64/mingw64/lib/libLLVM.dll.a
>
> 2. test run:
>
>  $ make -f makefile.mk test
> clang++ -Xclang -load -Xclang  <CURDIR> /example-plugin-clang.dll -Xclang -add-plugin -Xclang example-plugin-clang -c -std=c++11 example_cpp_class.cc -o example_cpp_class.o
> error: unable to find plugin 'example-plugin-clang'
> 1 error generated.
> mingw32-make: *** [makefile.mk:86: example_cpp_class.o] Error 1
>
> ...
> $ nm example-plugin-clang.dll | grep example
> 00000000701c1cb0 t _GLOBAL__sub_I_example_plugin_clang.cpp
> 00000000701e9020 b _ZL26_example_plugin_clang_node
>
> per example_plugin_clang.cpp:
>
> static FrontendPluginRegistry::Add<FindDependenciesAction>
> _example_plugin_clang_node(/*plugin Name=*/          "example-plugin-clang",
>                            /*plugin Description=*/   "Print out header dependencies");
>
> $ ntldd example-plugin-clang.dll
>         libclang-cpp.dll => C:\msys64\mingw64\bin\libclang-cpp.dll (0x0000000000e10000)
>         KERNEL32.dll => C:\WINDOWS\SYSTEM32\KERNEL32.dll (0x0000000005690000)
>         msvcrt.dll => C:\WINDOWS\SYSTEM32\msvcrt.dll (0x00000000006d0000)
>
> ***
>
> I tried an example for GCC plugin with the Msys2 GCC toolchain and this works:
>
> $ make -f makefile.mk
> g++ -c -std=c++11 -Wno-literal-suffix  -fno-exceptions -fno-rtti   -I. -Ic:/msys64/mingw64/include -Ic:/msys64/mingw64/lib/gcc/x86_64-w64-mingw32/9.3.0/plugin/include  example_plugin_gcc.cpp -o example_plugin_gcc.o
> g++ -shared example_plugin_gcc.o -static -o example-plugin-gcc.dll c:/msys64/mingw64/lib/gcc/x86_64-w64-mingw32/9.3.0/plugin/cc1plus.exe.a
>
> $ make -f makefile.mk test
> g++  -fplugin=C:/Users/msx/demo/plugin/example-plugin-gcc.dll -c -std=c++11 example_cpp_class.cc -o example_cpp_class.o
> Plugin info
> ===========
>
> Base name: example-plugin-gcc
> Full name: C:/Users/msx/demo/plugin/example-plugin-gcc.dll
> Number of arguments of this plugin:0
>
> Version info
> ============
>
> Base version: 9.3.0
> Date stamp: 20200312
> Dev phase:
> Revision:
> Configuration arguments: ../gcc-9.3.0/configure --prefix=/mingw64 --with-local-prefix=/mingw64/local --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --with-native-system-header-dir=/mingw64/x86_64-w64-mingw32/include --libexecdir=/mingw64/lib --enable-bootstrap --with-arch=x86-64 --with-tune=generic --enable-languages=c,lto,c++,fortran,ada,objc,obj-c++ --enable-shared --enable-static --enable-libatomic --enable-threads=posix --enable-graphite --enable-fully-dynamic-string --enable-libstdcxx-filesystem-ts=yes --enable-libstdcxx-time=yes --disable-libstdcxx-pch --disable-libstdcxx-debug --disable-isl-version-check --enable-lto --enable-libgomp --disable-multilib --enable-checking=release --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --enable-plugin --with-libiconv --with-system-zlib --with-gmp=/mingw64 --with-mpfr=/mingw64 --with-mpc=/mingw64 --with-isl=/mingw64 --with-pkgversion='Rev2, Built by MSYS2 project' --with-bugurl=https://sourceforge.net/projects/msys2 --with-gnu-as --with-gnu-ld
>
> Plugin successfully initialized
>
> *** Other relevant info for clang plugin build ***
>
> $ ldd example-plugin-clang.dll
>         ntdll.dll => /c/WINDOWS/SYSTEM32/ntdll.dll (0x7fff6fb30000)
>         KERNEL32.DLL => /c/WINDOWS/System32/KERNEL32.DLL (0x7fff6f890000)
>         KERNELBASE.dll => /c/WINDOWS/System32/KERNELBASE.dll (0x7fff6c610000)
>         msvcrt.dll => /c/WINDOWS/System32/msvcrt.dll (0x7fff6d540000)
>         libclang-cpp.dll => /c/msys64/mingw64/bin/libclang-cpp.dll (0x67400000)
>         ADVAPI32.dll => /c/WINDOWS/System32/ADVAPI32.dll (0x7fff6d020000)
>         sechost.dll => /c/WINDOWS/System32/sechost.dll (0x7fff6e2c0000)
>         zlib1.dll => /mingw64/bin/zlib1.dll (0x62e80000)
>         RPCRT4.dll => /c/WINDOWS/System32/RPCRT4.dll (0x7fff6cec0000)
>         ole32.dll => /c/WINDOWS/System32/ole32.dll (0x7fff6d300000)
>         combase.dll => /c/WINDOWS/System32/combase.dll (0x7fff6de50000)
>         ucrtbase.dll => /c/WINDOWS/System32/ucrtbase.dll (0x7fff6c970000)
>         bcryptPrimitives.dll => /c/WINDOWS/System32/bcryptPrimitives.dll (0x7fff6c4e0000)
>         GDI32.dll => /c/WINDOWS/System32/GDI32.dll (0x7fff6e360000)
>         gdi32full.dll => /c/WINDOWS/System32/gdi32full.dll (0x7fff6bbf0000)
>         msvcp_win.dll => /c/WINDOWS/System32/msvcp_win.dll (0x7fff6c8d0000)
>         USER32.dll => /c/WINDOWS/System32/USER32.dll (0x7fff6dcb0000)
>         win32u.dll => /c/WINDOWS/System32/win32u.dll (0x7fff6ca70000)
>         SHELL32.dll => /c/WINDOWS/System32/SHELL32.dll (0x7fff6e390000)
>         cfgmgr32.dll => /c/WINDOWS/System32/cfgmgr32.dll (0x7fff6c560000)
>         shcore.dll => /c/WINDOWS/System32/shcore.dll (0x7fff6db80000)
>         libwinpthread-1.dll => /mingw64/bin/libwinpthread-1.dll (0x64940000)
>         windows.storage.dll => /c/WINDOWS/System32/windows.storage.dll (0x7fff6bd90000)
>         profapi.dll => /c/WINDOWS/System32/profapi.dll (0x7fff6bb40000)
>         powrprof.dll => /c/WINDOWS/System32/powrprof.dll (0x7fff6bb70000)
>         shlwapi.dll => /c/WINDOWS/System32/shlwapi.dll (0x7fff6d2a0000)
>         kernel.appcore.dll => /c/WINDOWS/System32/kernel.appcore.dll (0x7fff6bbd0000)
>         cryptsp.dll => /c/WINDOWS/System32/cryptsp.dll (0x7fff6c8b0000)
>         VERSION.dll => /c/WINDOWS/SYSTEM32/VERSION.dll (0x7fff60a40000)
>         libstdc++-6.dll => /mingw64/bin/libstdc++-6.dll (0x6fc40000)
>         libgcc_s_seh-1.dll => /mingw64/bin/libgcc_s_seh-1.dll (0x61440000)
>         libz3.dll => /c/msys64/mingw64/bin/libz3.dll (0xcf0000)
>         libz3.dll => /c/msys64/mingw64/bin/libz3.dll (0xcf0000)
>
> - Tools -
>
> Compiler:
>
> $ clang++ --version
> clang version 10.0.0 (https://github.com/msys2/MINGW-packages.git
> 3f880aaba91a3d9cdfb222dc270274731a2119a9)
> Target: x86_64-w64-windows-gnu
> Thread model: posix
> InstalledDir: C:\msys64\mingw64\bin
>
> w/
>
> $ llvm-config --version
> 10.0.0
>
> Linker:
>
> $ /c/msys64/mingw64/bin/ld --version
> GNU ld (GNU Binutils) 2.34
> Copyright (C) 2020 Free Software Foundation, Inc.
> This program is free software; you may redistribute it under the terms of
> the GNU General Public License version 3 or (at your option) a later
> version.
> This program has absolutely no warranty.
>
> Make:
>
> $ mingw32-make --version
> GNU Make 4.3
> Built for Windows32
> Copyright (C) 1988-2020 Free Software Foundation, Inc.
> License GPLv3+: GNU GPL version 3 or later
> _______________________________________________
> cfe-dev mailing list
> [hidden email]
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
_______________________________________________
cfe-dev mailing list
[hidden email]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev