| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> |
| <html> |
| <head> |
| <META http-equiv="Content-Type" content="text/html; charset=utf-8"> |
| <title>DragonEgg</title> |
| </head> |
| <body> |
| <div> |
| |
| <img src="dragoneggsmall.png" alt="DragonEgg logo" width="136" height="136" align="left" hspace="30"> |
| |
| <!--*********************************************************************--> |
| <h1>DragonEgg - Using LLVM as a GCC backend</h1> |
| <!--*********************************************************************--> |
| |
| <p><a href="http://dragonegg.llvm.org/">DragonEgg</a> is a gcc plugin |
| <tt>dragonegg.so</tt> that replaces gcc's optimizers and code generators with |
| those from the <a href="http://llvm.org">LLVM project</a>.</p> |
| <p>It is a reimplementation of |
| <a href="http://llvm.org/docs/CommandGuide/">llvm-gcc</a> |
| that works with <a href="http://gcc.gnu.org">gcc-4.5</a> or later.</p> |
| |
| <br clear="all"> |
| |
| <!--=====================================================================--> |
| <h2>Goals</h2> |
| <!--=====================================================================--> |
| |
| <ul> |
| <li>Work with unmodified gcc</li> |
| <li>Support all gcc languages</li> |
| </ul> |
| |
| <!--=====================================================================--> |
| <h2>Current Status</h2> |
| <!--=====================================================================--> |
| |
| <ul> |
| <li>C works well, for example you can build a working gcc using it</li> |
| <li>C++ works fairly well, for example you can build LLVM, clang and boost |
| with it (the resulting LLVM and clang work correctly; I did not test whether |
| boost actually works)</li> |
| <li>A lot of Fortran compiles, but the compiled code has not been tested for |
| correctness</li> |
| <li>It can compile quite a lot of Ada, and the compiled code mostly seems to |
| work</li> |
| <li>It can compile a small amount of Obj-C and Obj-C++</li> |
| <li>It fails to compile any Java</li> |
| <li>Limited debug info</li> |
| <li>Requires one gcc patch</li> |
| <li>Only supports x86-32 and x86-64</li> |
| <li>Only supports linux and darwin</li> |
| </ul> |
| |
| <p><a href="http://dragonegg.llvm.org/">DragonEgg</a> is under heavy |
| development and is not mature - it may crash or produce wrong code. It works |
| with <a href="http://gcc.gnu.org">gcc-4.5</a> which hasn't been released yet. |
| This is an additional source of instability, and means that |
| <a href="http://dragonegg.llvm.org/">DragonEgg</a> may fail to build from |
| time-to-time if it has not caught up with the latest gcc changes. |
| <a href="http://dragonegg.llvm.org/">DragonEgg</a> uses the development |
| version of <a href="http://llvm.org">LLVM</a> which creates similar problems.</p> |
| |
| <!--=====================================================================--> |
| <h2>DragonEgg in action</h2> |
| <!--=====================================================================--> |
| |
| <p>Here is the result of compiling a simple "hello world" program with gcc-4.5:</p> |
| <pre> |
| $ gcc hello.c -S -O1 -o - |
| .file "hello.c" |
| .section .rodata.str1.1,"aMS",@progbits,1 |
| .LC0: |
| .string "Hello world!" |
| .text |
| .globl main |
| .type main, @function |
| main: |
| subq $8, %rsp |
| movl $.LC0, %edi |
| call puts |
| movl $0, %eax |
| addq $8, %rsp |
| ret |
| .size main, .-main |
| .ident "GCC: (GNU) 4.5.0 20090928 (experimental)" |
| .section .note.GNU-stack,"",@progbits |
| </pre> |
| |
| <p>Adding <tt>-fplugin=path/dragonegg.so</tt> to the gcc command line causes |
| the program to be optimized and codegened by LLVM instead:</p> |
| <pre> |
| $ gcc hello.c -S -O1 -o - -fplugin=./dragonegg.so |
| .file "hello.c" |
| # Start of file scope inline assembly |
| .ident "GCC: (GNU) 4.5.0 20090928 (experimental) LLVM: 82450:82981" |
| # End of file scope inline assembly |
| |
| |
| .text |
| .align 16 |
| .globl main |
| .type main,@function |
| main: |
| subq $8, %rsp |
| movl $.L.str, %edi |
| call puts |
| xorl %eax, %eax |
| addq $8, %rsp |
| ret |
| .size main, .-main |
| .type .L.str,@object |
| .section .rodata.str1.1,"aMS",@progbits,1 |
| .L.str: |
| .asciz "Hello world!" |
| .size .L.str, 13 |
| |
| .section .note.GNU-stack,"",@progbits |
| </pre> |
| |
| <p>Adding <tt>-fplugin-arg-dragonegg-emit-ir</tt> or <tt>-flto</tt> causes |
| LLVM IR to be output (you need to request assembler output, -S, rather |
| than object code output, -c, since otherwise gcc will pass the LLVM IR |
| to the system assembler, which will doubtless fail to assemble it):</p> |
| <pre> |
| $ gcc hello.c -S -O1 -o - -fplugin=./dragonegg.so -fplugin-arg-dragonegg-emit-ir |
| ; ModuleID = 'hello.c' |
| target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128" |
| target triple = "x86_64-unknown-linux-gnu" |
| |
| module asm "\09.ident\09\22GCC: (GNU) 4.5.0 20090928 (experimental) LLVM: 82450:82981\22" |
| |
| @.str = private constant [13 x i8] c"Hello world!\00", align 1 ; <[13 x i8]*> [#uses=1] |
| |
| define i32 @main() nounwind { |
| entry: |
| %0 = tail call i32 @puts(i8* getelementptr inbounds ([13 x i8]* @.str, i64 0, i64 0)) nounwind ; <i32> [#uses=0] |
| ret i32 0 |
| } |
| |
| declare i32 @puts(i8* nocapture) nounwind |
| </pre> |
| <!--=====================================================================--> |
| <h2>Getting it</h2> |
| <!--=====================================================================--> |
| |
| <p>Get <a href="http://dragonegg.llvm.org/">DragonEgg</a>:</p> |
| <pre> svn co http://llvm.org/svn/llvm-project/dragonegg/trunk dragonegg</pre> |
| <p>Get the development version of <a href="http://llvm.org">LLVM</a>:</p> |
| <pre> svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm</pre> |
| <p>Build <a href="http://llvm.org">LLVM</a> in the usual way. |
| You do not need to install it.</p> |
| <p>Get the development version of <a href="http://gcc.gnu.org">gcc</a>:</p> |
| <pre> svn co http://gcc.gnu.org/svn/gcc/trunk gcc</pre> |
| <p>Apply all of the patches in <tt>dragonegg/gcc-patches/</tt>, if any, to |
| <a href="http://gcc.gnu.org">gcc</a>. |
| You need to pass the <tt>-p1</tt> option to <tt>patch</tt>. |
| Build and install <a href="http://gcc.gnu.org">gcc</a> in the usual way.</p> |
| <p>Doing</p> |
| <pre> GCC=path_to_just_installed_gcc make</pre> |
| <p>in the <tt>dragonegg</tt> directory should then build <tt>dragonegg.so</tt>. |
| See the <tt>README</tt> file for more details.</p> |
| <p>To use <tt>dragonegg.so</tt>, compile something with your just-installed |
| version of <tt>gcc</tt>, adding <tt>-fplugin=path_to_dragonegg/dragonegg.so</tt> |
| to the command line. See the <tt>README</tt> file for more details and useful |
| command line options.</p> |
| |
| <!--=====================================================================--> |
| <h2>It doesn't work!</h2> |
| <!--=====================================================================--> |
| <p>Sorry about that! Please report bugs and problems to the LLVM developers' |
| <a href="http://llvm.org/docs/#maillist">mailing list</a>, or using LLVM's |
| <a href="http://llvm.org/bugs/">bugzilla</a>.</p> |
| <p>Suggestions for improvement are welcome. Patches are even more welcome!</p> |
| |
| <!--=====================================================================--> |
| <h2>More information</h2> |
| <!--=====================================================================--> |
| There was a talk "Reimplementing llvm-gcc as a gcc plugin" about |
| <a href="http://dragonegg.llvm.org/">DragonEgg</a> at the |
| <a href="http://llvm.org/devmtg/2009-10/">2009 llvm developers meeting</a>. |
| At that time, <a href="http://dragonegg.llvm.org/">DragonEgg</a> was known as |
| "the gcc plugin". |
| <p>[<a href="http://llvm.org/devmtg/2009-10/Sands_LLVMGCCPlugin.pdf">Slides</a>]</p> |
| <p>[<a href="http://llvm.org/devmtg/2009-10/Sands_LLVMGCCPlugin-700kbps.mov">Video</a>] <font size="-1">(Computer)</font></p> |
| <p>[<a href="http://llvm.org/devmtg/2009-10/Sands_LLVMGCCPlugin-mobile.m4v">Video</a>] <font size="-1">(Mobile)</font></p> |
| </div> |
| </body> |
| </html> |