Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What's the use of LLVM in Android NDK Toolchains?

What's the use of LLVM in Android NDK Toolchains?


A little recap:

I was building my native project with Gradlew on Ubuntu, targeting arm and x86_64 architectures. Seems that LLVM were utilized to call C/C++ compiler of arm-linux-androideabi-4.9 as well as x86_64(?)

The following is extracted from armeabi-v7a/ndkBuild_build_output.log:

/home/mypc/Android/android-ndk-r17c/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ -MMD -MP -MF /home/mypc/git/android-project-1/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a/objs-debug/module-5/stream_cpp.o.d -gcc-toolchain /home/mypc/Android/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64 -fpic -ffunction-sections -funwind-tables -fstack-protector-strong -Wno-invalid-command-line-argument ...

..and the following is extracted from x86_64/ndkBuild_build_output.log:

/home/mypc/Android/android-ndk-r17c/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ -MMD -MP -MF /home/mypc/git/android-project-1/build/intermediates/ndkBuild/debug/obj/local/x86_64/objs-debug/module-5/stream_cpp.o.d -gcc-toolchain /home/mypc/Android/android-ndk-r17c/toolchains/x86_64-4.9/prebuilt/linux-x86_64 -target x86_64-none-linux-android -ffunction-sections -funwind-tables -fstack-protector-strong -fPIC -Wno-invalid-command-line-argument ...

  • The "..." indicates that there's a long tail of this single-line command I've trimmed off.
  • Names of personal folders & project were changed.

Let's take a look what's inside Android NDK's toolchains folder:

myacc:~/.../android-ndk-r17c/toolchains$ tree -L 1
.
├── aarch64-linux-android-4.9
├── arm-linux-androideabi-4.9
├── llvm
├── mips64el-linux-android-4.9
├── mipsel-linux-android-4.9
├── NOTICE-MIPS
├── NOTICE-MIPS64
├── renderscript
├── x86-4.9
└── x86_64-4.9

It's quite confusing to me. I thought llvm is a kind of toolchain since it's placed here, next to other toolchains. Again, what's actually the use of LLVM in Android NDK Toolchains?

Thanks for the help :)

like image 333
Nikolas Avatar asked Feb 20 '19 11:02

Nikolas


People also ask

What is LLVM used for?

LLVM helps build new computer languages and improve existing languages. It automates many of the difficult and unpleasant tasks involved in language creation, such as porting the outputted code to multiple platforms and architectures.

What compiler does NDK use?

The Clang compiler in the NDK is useable with only minimal configuration required to define your target environment. Note: Prior to NDK r19, the toolchains installed by default with the NDK could not be used in-place, and make_standalone_toolchain.py needed to be used instead. This is no longer the case.

What is LLVM toolchain?

LLVM is a set of compiler and toolchain technologies that can be used to develop a front end for any programming language and a back end for any instruction set architecture.

What is the use of NDK in Android?

The Native Development Kit (NDK) is a set of tools that allows you to use C and C++ code with Android, and provides platform libraries you can use to manage native activities and access physical device components, such as sensors and touch input.


1 Answers

LLVM is an umbrela project now, and it contains multiple modular and reusable compiler and toolchain technologies. You can check more details at The LLVM Compiler Infrastructure.

For Android NDK, llvm became the default toolchain since r13b and gcc was removed since r18b.

According to toolchains directory toolchains/llvm/prebuilt/darwin-x86_64, llvm supports all the ABIs, i.e. x86, x86_64, arm, arm64.

Probably there will be only one llvm directory under toolchains directory in future NDK releases when all the gcc related tools, headers and libs are completely ported to llvm.

enter image description here

References that may help: Android NDK path variable for "strip" command in CMake build tool chain


Updates

Just did a quick test on different NDK revisions to check the configurations for --gcc-toolchain and --sysroot which are for cross compilation.

On r16b

--target=armv7-none-linux-androideabi 
--gcc-toolchain=~/ndks/android-ndk-r16b/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
--sysroot=~/ndks/android-ndk-r16b/sysroot 

On r17c

--target=armv7-none-linux-androideabi
--gcc-toolchain=~/ndks/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
--sysroot=~/ndks/android-ndk-r17c/sysroot

On r18b

--target=armv7-none-linux-androideabi19
--gcc-toolchain=~/ndks/android-ndk-r18b/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
--sysroot=~/ndks/android-ndk-r18b/sysroot

On r19b

--target=armv7-none-linux-androideabi19 
--gcc-toolchain=~/ndks/android-ndk-r19b/toolchains/llvm/prebuilt/darwin-x86_64 
--sysroot=~/ndks/android-ndk-r19b/toolchains/llvm/prebuilt/darwin-x86_64/sysroot 

As seen above, before NDK r19b, NDK uses clang compiler but the --gcc-toolchain and --sysroot are configured as the older paths for build tools, headers and libs.

But, since NDK r19b, the --gcc-toolchain and --sysroot are configured as the new tool chains llvm, i.e. toolchains/llvm/prebuilt/darwin-x86_64, and the tools (e.g. ranlib, ar, strip, etc) header files and libraries of "llvm version" will be used.

Also, note that toolchains/llvm/prebuilt/darwin-x86_64 contains the support for all the Android ABIs, i.e. aarch64-linux-android for arm64-v8a, arm-linux-androideabi for armeabi-v7a, i686-linux-android for x86, x86_64-linux-android for x86_64.

So, you can try out the NDK r19b if you want to purely use llvm toolchains.

like image 152
shizhen Avatar answered Sep 20 '22 08:09

shizhen