I bought my Raspberry Pi (http://www.raspberrypi.org/) board some weeks ago mainly to use it as a developer board (pretty affordable and efficient). So, I decided to use it to cross-compile LLVM (http://www.llvm.org).
So, here you go.
Building
First of all, download LLVM (from either SVN or GIT repositories). I got the following information from LLVM documentation. For more details, check this out!
- Checkout LLVM:
$ cd where-you-want-llvm-to-live
$ svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
- Checkout Clang:
$ cd where-you-want-llvm-to-live
$ cd llvm/tools
$ svn co http://llvm.org/svn/llvm-project/cfe/trunk clang - Checkout Compiler-RT:
$ cd where-you-want-llvm-to-live
$ cd llvm/projects
$ svn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt - Get the Test Suite Source Code [Optional]
$ cd where-you-want-llvm-to-live
$ cd llvm/projects
$ svn co http://llvm.org/svn/llvm-project/test-suite/trunk test-suite
To cross-compile it to ARM platform, you need a toolchain. I use Sourcery G++ Lite 2011.03-41 (MentorGraphics Sourcery CodeBench Lite Edition) - it is free and contains everything we need. Install it and also remember to set the PATH variable so that you can use your toolchain.
$ export $PATH=$PATH:/home/user/CodeSourcery/Sourcery_G++_Lite/binNow, it´s time to build the application (and remember: for further details, check this out!)
$ cd where-you-want-to-build-llvm
$ mkdir build (for building without polluting the source dir)
$ cd build
$ ../configure --target=arm-none-linux-gnueabi --host=arm-none-linux-gnueabi --enable-optimized (the target/host value may change depending on the toolchain that you have chosen.)
$ make
Now, you just need to wait for a couple of minutes :-) Next step is NFS-mounting the LLVM dir in your Raspberry Pi.
NFS-Mounting
Now, LLVM is cross-compiled and we are able to use it and perform some tests on Raspberry Pi. I prefer NFS as partition mounting solution. An important information is that you have to have the same path on both environments (desktop and remote). It means that if you are building LLVM on /home/user/llvm desktop folder, you have to mount it on /home/user/llvm remote folder (in most of cases, you have to create the user
- Install NFS packages
@desktop$ sudo apt-get install portmap nfs-kernel-server nfs-common - Edit /etc/exports and add the following line
/home/user/llvm 192.168.1.0/24(rw,sync,no_subtree_check) - Restart NFS system
@desktop$ sudo service nfs-kernel-server restart - Change access permission of your shared folder (in this case, I use the same folder)
@desktop$ chmod -R 777 /home/user/llvm
Configuration on Raspberry Pi is also straightforward:
- Install NFS packages (most of Raspberry distributions contain NFS installed, so maybe this step is not necessary)
@remote$ sudo apt-get install portmap nfs-kernel-server nfs-common - Create the host folder
@remote$ mkdir llvm
@remote$ chmod 777 llvm - Mount the NFS-shared folder
@remote$ sudo mount 192.168.1.4:/home/user/llvm /home/user/llvm
Now it is done and you can use your cross-compiled LLVM on your Raspberry.
Testing
Let´s now focus on LLVM tests and how we can run them on ARM platforms. In this case, I am running tests under /home/user/llvm/tests folder.
After some minutes, LLVM test suite runs all integration tests and provides a report with results.
the ARM target platform for LLVM project at this moment. If you want to contribute to LLVM project by supporting ARM features, check a PandaBoard development kit.
- CD to test dir
@remote$ cd llvm/build/test - Run tests
@remote:/home/user/llvm/build/test$ make
After some minutes, LLVM test suite runs all integration tests and provides a report with results.
@remote:/home/user/llvm/build/test$ makeUPDATE: Raspberry Pi
...
PASS: LLVM :: ExecutionEngine/MCJIT/test-shift.ll (59 of 59)
Testing Time: 11.65s
********************
Unexpected Passing Tests (1):
LLVM :: ExecutionEngine/MCJIT/test-data-align-remote.ll
********************
Failing Tests (7):
LLVM :: ExecutionEngine/MCJIT/2003-01-04-ArgumentBug.ll
LLVM :: ExecutionEngine/MCJIT/2005-12-02-TailCallBug.ll
LLVM :: ExecutionEngine/MCJIT/fpbitcast.ll
LLVM :: ExecutionEngine/MCJIT/pr13727.ll
LLVM :: ExecutionEngine/MCJIT/test-call.ll
LLVM :: ExecutionEngine/MCJIT/test-common-symbols.ll
LLVM :: ExecutionEngine/MCJIT/test-ret.ll
Expected Passes : 45
Expected Failures : 6
Unexpected Passes : 1
Unexpected Failures: 7
2 comments:
how about to cross compile for ARM platform using LLVM?
how to do it?
since let say I want to compile Android kernel with LLVM.. I'm used to GCC (Linaro, Google) but not clang
Hi,
sorry for late replay. I usually don't use LLVM for that. Try CodeSourcery... it has a very good set of tools and libs.
Post a Comment