mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-26 08:44:35 +00:00
Add instructions on how to generate GIMPLE format
This commit is contained in:
parent
57d2ecb14e
commit
cd57c6ea1c
@ -227,6 +227,11 @@ https://rust-lang.zulipchat.com/#narrow/stream/301329-t-devtools/topic/subtree.2
|
||||
|
||||
`rustc` needs to be built without `jemalloc` so that `mem-trace` can overload `malloc` since `jemalloc` is linked statically, so a `LD_PRELOAD`-ed library won't a chance to intercept the calls to `malloc`.
|
||||
|
||||
### How to generate GIMPLE
|
||||
|
||||
If you need to check what gccjit is generating (GIMPLE), then take a look at how to
|
||||
generate it in [gimple.md](./doc/gimple.md).
|
||||
|
||||
### How to build a cross-compiling libgccjit
|
||||
|
||||
#### Building libgccjit
|
||||
|
80
doc/gimple.md
Normal file
80
doc/gimple.md
Normal file
@ -0,0 +1,80 @@
|
||||
# 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 into:
|
||||
|
||||
```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();
|
||||
create_code(ctxt, NULL);
|
||||
gcc_jit_context_compile_to_file(ctxt, GCC_JIT_OUTPUT_KIND_DYNAMIC_LIBRARY, "tmp");
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
Then we can compile it by using:
|
||||
|
||||
```console
|
||||
gcc const.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 ./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;
|
||||
}
|
||||
```
|
Loading…
Reference in New Issue
Block a user