| # GIMPLE | |
| You can see the full documentation about what GIMPLE is [here](https://gcc.gnu.org/onlinedocs/gccint/GIMPLE.html). In this document we will explain how to generate it. | |
| First, we'll copy the content from `gcc/gcc/testsuite/jit.dg/test-const-attribute.c` into a | |
| file named `local.c` and remove the content we're not interested in: | |
| ```diff | |
| - /* { dg-do compile { target x86_64-*-* } } */ | |
| ... | |
| - /* We don't want set_options() in harness.h to set -O3 to see that the const | |
| - attribute affects the optimizations. */ | |
| - #define TEST_ESCHEWS_SET_OPTIONS | |
| - static void set_options (gcc_jit_context *ctxt, const char *argv0) | |
| - { | |
| - // Set "-O3". | |
| - gcc_jit_context_set_int_option(ctxt, GCC_JIT_INT_OPTION_OPTIMIZATION_LEVEL, 3); | |
| - } | |
| - | |
| - #define TEST_COMPILING_TO_FILE | |
| - #define OUTPUT_KIND GCC_JIT_OUTPUT_KIND_ASSEMBLER | |
| - #define OUTPUT_FILENAME "output-of-test-const-attribute.c.s" | |
| - #include "harness.h" | |
| ... | |
| - /* { dg-final { jit-verify-output-file-was-created "" } } */ | |
| - /* Check that the loop was optimized away */ | |
| - /* { dg-final { jit-verify-assembler-output-not "jne" } } */ | |
| ``` | |
| Then we'll add a `main` function which will call the `create_code` function but | |
| also add the calls we need to generate the GIMPLE: | |
| ```C | |
| int main() { | |
| gcc_jit_context *ctxt = gcc_jit_context_acquire(); | |
| // To set `-O3`, update it depending on your needs. | |
| gcc_jit_context_set_int_option(ctxt, GCC_JIT_INT_OPTION_OPTIMIZATION_LEVEL, 3); | |
| // Very important option to generate the gimple format. | |
| gcc_jit_context_set_bool_option(ctxt, GCC_JIT_BOOL_OPTION_DUMP_INITIAL_GIMPLE, 1); | |
| create_code(ctxt, NULL); | |
| gcc_jit_context_compile(ctxt); | |
| // If you want to compile to assembly (or any other format) directly, you can | |
| // use the following call instead: | |
| // gcc_jit_context_compile_to_file(ctxt, GCC_JIT_OUTPUT_KIND_ASSEMBLER, "out.s"); | |
| return 0; | |
| } | |
| ``` | |
| Then we can compile it by using: | |
| ```console | |
| gcc local.c -I `pwd`/gcc/gcc/jit/ -L `pwd`/gcc-build/gcc -lgccjit -o out | |
| ``` | |
| And finally when you run it: | |
| ```console | |
| LD_LIBRARY_PATH=`pwd`/gcc-build/gcc LIBRARY_PATH=`pwd`/gcc-build/gcc ./out | |
| ``` | |
| It should display: | |
| ```c | |
| __attribute__((const)) | |
| int xxx () | |
| { | |
| int D.3394; | |
| int sum; | |
| int x; | |
| <D.3377>: | |
| x = 45; | |
| sum = 0; | |
| goto loop_cond; | |
| loop_cond: | |
| x = x >> 1; | |
| if (x != 0) goto after_loop; else goto loop_body; | |
| loop_body: | |
| _1 = foo (x); | |
| _2 = _1 * 2; | |
| x = x + _2; | |
| goto loop_cond; | |
| after_loop: | |
| D.3394 = sum; | |
| return D.3394; | |
| } | |
| ``` | |
| An alternative way to generate the GIMPLE is to replace: | |
| ```c | |
| gcc_jit_context_set_bool_option(ctxt, GCC_JIT_BOOL_OPTION_DUMP_INITIAL_GIMPLE, 1); | |
| ``` | |
| with: | |
| ```c | |
| gcc_jit_context_add_command_line_option(ctxt, "-fdump-tree-gimple"); | |
| ``` | |
| (although you can have both at the same time too). Then you can compile it like previously. Only one difference: before executing it, I recommend to run: | |
| ```console | |
| rm -rf /tmp/libgccjit-* | |
| ``` | |
| to make it easier for you to know which folder to look into. | |
| Once the execution is done, you should now have a file with path looking like `/tmp/libgccjit-9OFqkD/fake.c.006t.gimple` which contains the GIMPLE format. |