| ---------------------- |
| - BUILD INSTRUCTIONS - |
| ---------------------- |
| |
| Step 0: Build and install llvm-2.7 |
| ---------------------------------- |
| |
| I'm assuming anyone reading this knows how to build and install llvm. |
| You need to use the 2.7 release of LLVM, which you can find here: |
| http://llvm.org/releases/download.html#2.7 |
| |
| Step 1: Build gcc |
| ----------------- |
| |
| Obtain a copy of the source code for the gcc-4.5 release. You can get it from |
| one of the gcc mirrors, see http://gcc.gnu.org/mirrors.html. Alternatively, you |
| can use the gcc-4.5 branch of the gcc subversion repository: |
| svn checkout svn://gcc.gnu.org/svn/gcc/branches/gcc-4_5-branch SomeLocalDir |
| If you are feeling brave then you can try gcc mainline: |
| svn checkout svn://gcc.gnu.org/svn/gcc/trunk SomeLocalDir |
| Changes on gcc mainline occasionally break the plugin, so your mileage may vary. |
| You can find a subversion revision number that is known to work well in the file |
| gcc_revision_tested_with (in the same directory as this README). |
| |
| Apply the patches in the gcc-patches subdirectory, if any. The following should |
| do the trick ("SomeLocalDir" is where you checked/unpacked the gcc source): |
| cat gcc-patches/*.diff | patch -d SomeLocalDir -p1 |
| |
| Configure gcc with your favorite options and also with --enable-plugin and |
| --enable-lto. Build gcc and install it somewhere. If you don't have libelf |
| installed then the build will fail, because gcc's LTO code makes use of it, |
| see |
| http://gcc.gnu.org/wiki/LinkTimeOptimization#Building_the_branch |
| In theory the gcc you build can be a cross-compiler, and the plugin should work |
| and build code for the targetted platform. I don't think anyone has ever tried |
| this though. |
| |
| Darwin special: the gcc configure script thinks darwin doesn't support dynamic |
| libraries and concludes that plugins won't work. You can find patches to fix |
| this here: |
| http://gcc.gnu.org/ml/gcc-patches/2010-04/msg00610.html |
| |
| Step 2: Build the plugin |
| ------------------------ |
| |
| Build the plugin like this: |
| GCC=PATH_TO_JUST_INSTALLED_GCC make |
| This should be done in the directory containing this README. |
| |
| The plugin needs to know about the version of gcc it will be loaded into, which |
| is why you need to specify the gcc installed in step 1 via the GCC variable like |
| this. If you have arranged for the new gcc to occur in your path with the name |
| gcc-4.5 (using a symbolic link for example) then you can build the plugin using: |
| make |
| The plugin is compiled using the system compiler, and not with the gcc specified |
| in the GCC variable (which wouldn't work if you built a cross compiler). If you |
| want to also compile the plugin with the new gcc, you can do: |
| CC=PATH_TO_JUST_INSTALLED_GCC CXX=PATH_TO_JUST_INSTALLED_GCC GCC=PATH_TO_JUST_INSTALLED_GCC make |
| |
| The build system runs the "llvm-config" program (which should be in your path if |
| you installed LLVM properly in step 0) to find out about the copy of LLVM you |
| installed, so there is no need to tell the build system explicitly about LLVM. |
| If llvm-config is not in your path then you can specify where to find it using |
| the LLVM_CONFIG variable. |
| |
| The end result of the build is a shared library, dragonegg.so. |
| |
| |
| ---------------------- |
| - USAGE INSTRUCTIONS - |
| ---------------------- |
| |
| Run gcc as usual, but pass -fplugin=./dragonegg.so as an extra command line |
| argument. Make sure you use the gcc you installed above, not the system gcc! |
| |
| |
| ------------------ |
| - USEFUL OPTIONS - |
| ------------------ |
| |
| If you renamed dragonegg.so to something else, for example llvm.so, replace |
| -fplugin-arg-dragonegg with -fplugin-arg-llvm in the options below. |
| |
| -fplugin-arg-dragonegg-emit-ir |
| -flto |
| Output LLVM IR rather than target assembler. You need to use -S with this, |
| since otherwise GCC will pass the output to the system assembler (these don't |
| usually understand LLVM IR). It would be nice to fix this and have the option |
| work with -c too but it's not clear how. If you plan to read the IR then you |
| probably want to use the -fverbose-asm flag as well (see below). |
| |
| -fverbose-asm |
| Annotate the target assembler with helpful comments. Turns on the generation |
| of helpful names (the same as in GCC tree dumps) in the LLVM IR. |
| |
| -fstats |
| Output both LLVM and GCC statistics. |
| |
| -ftime-report |
| Output both LLVM and GCC timing information. |
| |
| -fno-ident |
| If the ident global asm in the LLVM IR annoys you, use this to turn it off. |
| |
| -fplugin-arg-dragonegg-debug-pass-arguments |
| -fplugin-arg-dragonegg-debug-pass-structure |
| Output information about the passes being run. |
| |
| -fplugin-arg-dragonegg-disable-llvm-optzns |
| Do not perform any LLVM IR optimizations even if compiling at -O1, -O2 etc. |
| |
| -fplugin-arg-dragonegg-enable-gcc-optzns |
| Run the GCC tree optimizers as well as the LLVM IR optimizers. Only early GCC |
| optimizations are performed. Normally all GCC optimizations are disabled. |
| |
| -fplugin-arg-dragonegg-save-gcc-output |
| GCC assembler output is normally redirected to /dev/null so that it doesn't |
| clash with the LLVM output. This option causes GCC output to be written to |
| a file instead. Good for seeing which GCC output we've failed to turn off. |