| ---------------------- |
| - BUILD INSTRUCTIONS - |
| ---------------------- |
| |
| Step 0: Build and install llvm |
| ------------------------------ |
| |
| I'm assuming anyone reading this knows how to build and install llvm. |
| You need the latest llvm from the subversion repository. |
| |
| Step 1: Build gcc |
| ----------------- |
| |
| Check out gcc from the gcc subversion repository: |
| svn checkout svn://gcc.gnu.org/svn/gcc/trunk SomeLocalDir |
| Apply the patches in the gcc-patches subdirectory, if any. Hopefully one day |
| the plugin will work with an unpatched gcc, but for the moment a few small |
| patches need to be applied. Configure gcc with your favorite options. |
| Build gcc, and install it somewhere. |
| |
| Darwin special: the gcc configure script thinks darwin doesn't support dynamic |
| libraries and concludes that plugins won't work. Delete or improve the check. |
| If you improve it, please send your patch to the gcc developers! |
| |
| Step 2: Build the plugin |
| ------------------------ |
| |
| In the Makefile, set the GCCSOURCE_DIR variable to point to the place you |
| checked out the gcc repository, rather than to where I checked it out. |
| Set the GCCOBJECT_DIR to point to the place you built the repository. |
| Admire the awfulness of the build system, and make a mental note to rewrite |
| it properly. |
| |
| Build the plugin using "make". The end result of the build is a shared |
| library, dragonegg.so. |
| |
| Darwin special: "-shared" doesn't result in a correct dynamic library on darwin, |
| use "-Wl,-flat_namespace -Wl,-undefined -Wl,suppress -dynamiclib" instead. |
| |
| ---------------------- |
| - 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! |
| |
| Currently the plugin isn't capable of compiling much - you have been warned. |
| |
| |
| ------------------ |
| - 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 |
| 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. |
| |
| -fdump-rtl-all |
| In the dump file, each function is output both as gimple and as LLVM IR. |
| |
| -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. Normally the |
| GCC optimizers 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. |