-
Notifications
You must be signed in to change notification settings - Fork 265
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
clang doesn't export explicit specializations function templates #34
Comments
You've set
Don't know if that's something you're supposed to define on the command line or if there's something in QT's headers that set it up, but it's not being set properly. A contrived test case shows that specializations are exported properly (no one would be able to use the Clang for production work if it didn't). |
A few clarifications:
Because seeing is believing, I'll give you the steps to compile Qt yourself:
Next you'll need to cherry-pick https://codereview.qt-project.org/#/c/153564/
Next step is to make sure you revert the workaround I did to src/plugins/bearer/android/src/wrappers/androidconnectivitymanager.cpp. In this file you can see that we're using other methods and other explicit specializations function templates from that class, but *ONLY * callObjectMethod is not found. Final step is to configure & compile Qt, you'll need Android NDK & SDK (with API-16 installed):
|
The LLVM bug you point at looks to be specific to |
…port Should be reverted when android/ndk#34 is fixed Change-Id: Idcc951ff432dbadd57a09851bcb7486b019b3426 Reviewed-by: Oswald Buddenhagen <[email protected]> Reviewed-by: Eskil Abrahamsen Blomfeldt <[email protected]>
Should be reverted when android/ndk#34 is fixed Change-Id: Ic7fe394412afc25082a9689da59d36cba8b3dade Reviewed-by: Eskil Abrahamsen Blomfeldt <[email protected]>
Can you give me updated instructions to reproduce this issue? In particular, from your comment on March 22:
What WAR should be reverted? |
You need to revert qt/qtbase@cc119de Same setup as for #143
|
After looking at this a bit, not sure why the symbols are hidden. I am attaching an easy reproduction for others to take a look. Run the following command on the .ii file (which is in a zip so github accepts it as an attachment): The problematic functions will be marked hidden in the generated |
Aah, found the reason after digging into how Clang's visiblity-determination code. Thes specializations are getting I cannot find anything in the spec that explicitly clarifies this. But, I think Clang is reasonable here - based on the requested @bog-dan-ro You can either (a) restrict your workaround to just those functions that specialize jobject and its subclasses or (b) use GCC visiblity pragmas around jni.h (https://gcc.gnu.org/onlinedocs/gcc/Visibility-Pragmas.html). |
@pirama-arumuga-nainar but I'm changing the visibility of the entire class ... so IMHO all the methods should be exported properly :) |
And, the visibility of To determine a method's visiblity, Clang picks the strictest visibility among that of its class, types of its parameters and its template types. The way to override this is via the method's attribute (like in your WAR). |
Here:
you can find the implementations
Same code just works with gcc.
Compile command line:
/home/bogdan/necessitas/android-ndk/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ -c -target armv7-none-linux-androideabi -march=armv7-a -mfpu=vfp -mfloat-abi=softfp -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums -DANDROID -Wa,--noexecstack -fno-builtin-memmove --sysroot=/home/bogdan/necessitas/android-ndk/platforms/android-16/arch-arm/ -g -Os -fomit-frame-pointer -fno-strict-aliasing -mthumb -std=c++1z -fvisibility=hidden -fvisibility-inlines-hidden -Wall -W -Wdate-time -D_REENTRANT -fPIC -DQT_NO_MTDEV -DQT_NO_LIBUDEV -DQT_NO_TSLIB -DQT_NO_LIBINPUT -DQT_NO_USING_NAMESPACE -DQT_HAVE_POLL -DQT_BUILD_CORE_LIB -DQT_BUILDING_QT -DQT_NO_CAST_TO_ASCII -DQT_ASCII_CAST_WARNINGS -DQT_MOC_COMPAT -DQT_USE_QSTRINGBUILDER -DQT_DEPRECATED_WARNINGS -DQT_DISABLE_DEPRECATED_BEFORE=0x050000 -DQT_NO_DEBUG -I. -I/home/bogdan/work/qt/openssl-1.0.2f/include -Iglobal -I../3rdparty/pcre -I../3rdparty/harfbuzz/src -I../3rdparty/md5 -I../3rdparty/md4 -I../3rdparty/sha3 -I../3rdparty/double-conversion/include -I../3rdparty/double-conversion/include/double-conversion -I../3rdparty/forkfd -I../../include -I../../include/QtCore -I../../include/QtCore/5.7.0 -I../../include/QtCore/5.7.0/QtCore -I.moc -isystem /home/bogdan/necessitas/android-ndk/sources/cxx-stl/gnu-libstdc++/4.9/include -isystem /home/bogdan/necessitas/android-ndk/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/include -isystem /home/bogdan/necessitas/android-ndk/platforms/android-16/arch-arm/usr/include -I../../mkspecs/android-clang -o .obj/qjni.o kernel/qjni.cpp
The text was updated successfully, but these errors were encountered: