Git Product home page Git Product logo

Comments (9)

DanAlbert avatar DanAlbert commented on August 22, 2024

You've set -fvisibility-hidden, so the compiler is doing what you asked.

Q_CORE_EXPORT seems to be configured as follows: http://stackoverflow.com/a/3148584/632035

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).

from ndk.

bog-dan-ro avatar bog-dan-ro commented on August 22, 2024

A few clarifications:

  • Q_CORE_EXPORT is defined as attribute((visibility("default"))) when that file is compiled (you'll need to check QtCore/qglobal.h).
  • only a few explicit specializations function templates are not exported (e.g. callObjectMethod).
    • the other functions (including other explicit specializations function templates (i.e. callMethod) are exported properly).
  • the bug I reported is quite similar to https://llvm.org/bugs/show_bug.cgi?id=23667 which seems to be fixed ~6 months ago.

Because seeing is believing, I'll give you the steps to compile Qt yourself:

  • $ git clone git://code.qt.io/qt/qtbase.git
  • $ cd qtbase
  • $ git checkout 5.7

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):

  • $ ./configure -developer-build -release -force-debug-info -xplatform android-clang -nomake tests -nomake examples -android-ndk /path/to/NDK android-sdk /path/to/SDK
  • $ make -j8 (you'll need to wait a few minutes)

from ndk.

DanAlbert avatar DanAlbert commented on August 22, 2024

The LLVM bug you point at looks to be specific to dllexport, which is a Windows thing. We do already have that patch as well.

from ndk.

pirama-arumuga-nainar avatar pirama-arumuga-nainar commented on August 22, 2024

Can you give me updated instructions to reproduce this issue? In particular, from your comment on March 22:

Next step is to make sure you revert the workaround I did to src/plugins/bearer/android/src/wrappers/androidconnectivitymanager.cpp.

What WAR should be reverted?

from ndk.

bog-dan-ro avatar bog-dan-ro commented on August 22, 2024

You need to revert qt/qtbase@cc119de

Same setup as for #143
If you already have it compiled, just go to qtbase folder and do:

$ git revert cc119dee73c6
$ make clean
$ make -j10

from ndk.

pirama-arumuga-nainar avatar pirama-arumuga-nainar commented on August 22, 2024

After looking at this a bit, not sure why the symbols are hidden. callObjectMethod does not use the template type but that doesn't seem to be the reason behind the issue. setField, which takes a parameter of the template type, is also 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):
clang++ -cc1 -triple thumbv7-none-linux-android -emit-llvm -emit-llvm-uselists -disable-free -disable-llvm-verifier -main-file-name qjni.cpp -mrelocation-model pic -pic-level 2 -mthread-model posix -mdisable-fp-elim -fmath-errno -masm-verbose -mconstructor-aliases -fuse-init-array -target-cpu cortex-a8 -target-feature +soft-float-abi -target-feature -fp-only-sp -target-feature -d16 -target-feature +vfp2 -target-feature -vfp3 -target-feature -fp16 -target-feature -vfp4 -target-feature -fp-armv8 -target-feature -neon -target-feature -crypto -target-abi aapcs-linux -mfloat-abi soft -target-linker-version 2.24 -v -dwarf-column-info -debugger-tuning=gdb -O3 -Wall -W -std=c++14 -fdeprecated-macro -ferror-limit 19 -fmessage-length 85 -fvisibility hidden -fvisibility-inlines-hidden -femulated-tls -stack-protector 2 -fallow-half-arguments-and-returns -fno-signed-char -fobjc-runtime=gcc -fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -vectorize-loops -vectorize-slp -disable-llvm-passes -x c++-cpp-output qjni.ii

The problematic functions will be marked hidden in the generated qjni.ll
qjni.zip

from ndk.

pirama-arumuga-nainar avatar pirama-arumuga-nainar commented on August 22, 2024

Aah, found the reason after digging into how Clang's visiblity-determination code. Thes specializations are getting hidden visiblity because the types they specialize (jstring etc.) have hidden visibility based on -fvisibility-hidden.

I cannot find anything in the spec that explicitly clarifies this. But, I think Clang is reasonable here - based on the requested visiblity, these types, and specializations on them, cannot be visible outside this unit.

@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).

from ndk.

bog-dan-ro avatar bog-dan-ro commented on August 22, 2024

@pirama-arumuga-nainar but I'm changing the visibility of the entire class ... so IMHO all the methods should be exported properly :)

from ndk.

pirama-arumuga-nainar avatar pirama-arumuga-nainar commented on August 22, 2024

And, the visibility of jstring etc is hidden, so Clang concludes that this specialization jstring is not callable from outside the translational unit.

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).

from ndk.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.