You can see the full documentation about what GIMPLE is here. 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 into:
- /* { 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:
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:
gcc local.c -I `pwd`/gcc/gcc/jit/ -L `pwd`/gcc-build/gcc -lgccjit -o out
And finally when you run it:
LD_LIBRARY_PATH=`pwd`/gcc-build/gcc LIBRARY_PATH=`pwd`/gcc-build/gcc ./out
It should display:
__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:
gcc_jit_context_set_bool_option(ctxt, GCC_JIT_BOOL_OPTION_DUMP_INITIAL_GIMPLE, 1);
with:
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:
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.