xref: /aosp_15_r20/art/tools/compiler-explorer/compiler-explorer.md (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker# Compiler Explorer
2*795d594fSAndroid Build Coastguard Worker
3*795d594fSAndroid Build Coastguard WorkerThis doc describes how to run a local instance of Compiler Explorer
4*795d594fSAndroid Build Coastguard Worker(https://godbolt.org/) with local compilers built from an Android source tree.
5*795d594fSAndroid Build Coastguard Worker
6*795d594fSAndroid Build Coastguard Worker## Prerequisites
7*795d594fSAndroid Build Coastguard Worker
8*795d594fSAndroid Build Coastguard Worker- Compiler Explorer depends on Node.js. You can download it through
9*795d594fSAndroid Build Coastguard Worker  [Node Version Manager (NVM)](https://nodejs.org/en/download/package-manager) or
10*795d594fSAndroid Build Coastguard Worker  through your favorite package manager.
11*795d594fSAndroid Build Coastguard Worker- You need a **full** Android source tree to build compilers.
12*795d594fSAndroid Build Coastguard Worker
13*795d594fSAndroid Build Coastguard Worker## Instructions
14*795d594fSAndroid Build Coastguard Worker
15*795d594fSAndroid Build Coastguard Worker1. Set a directory to install Compiler Explorer.
16*795d594fSAndroid Build Coastguard Worker
17*795d594fSAndroid Build Coastguard Worker    ```
18*795d594fSAndroid Build Coastguard Worker    export COMPILER_EXPLORER_DIR=/tmp/compiler-explorer
19*795d594fSAndroid Build Coastguard Worker    ```
20*795d594fSAndroid Build Coastguard Worker
21*795d594fSAndroid Build Coastguard Worker1. Create the directory.
22*795d594fSAndroid Build Coastguard Worker
23*795d594fSAndroid Build Coastguard Worker    ```
24*795d594fSAndroid Build Coastguard Worker    mkdir -p $COMPILER_EXPLORER_DIR
25*795d594fSAndroid Build Coastguard Worker    ```
26*795d594fSAndroid Build Coastguard Worker
27*795d594fSAndroid Build Coastguard Worker1. Check out Compiler Explorer.
28*795d594fSAndroid Build Coastguard Worker
29*795d594fSAndroid Build Coastguard Worker    ```
30*795d594fSAndroid Build Coastguard Worker    cd $COMPILER_EXPLORER_DIR
31*795d594fSAndroid Build Coastguard Worker    git clone https://github.com/compiler-explorer/compiler-explorer.git
32*795d594fSAndroid Build Coastguard Worker    ```
33*795d594fSAndroid Build Coastguard Worker
34*795d594fSAndroid Build Coastguard Worker1. Go to a full Android source tree, and initialize the environment as usual.
35*795d594fSAndroid Build Coastguard Worker
36*795d594fSAndroid Build Coastguard Worker    ```
37*795d594fSAndroid Build Coastguard Worker    cd <path-to-android-source-tree>
38*795d594fSAndroid Build Coastguard Worker    source build/envsetup.sh
39*795d594fSAndroid Build Coastguard Worker    lunch aosp_cf_x86_64_phone-trunk_staging-userdebug
40*795d594fSAndroid Build Coastguard Worker    ```
41*795d594fSAndroid Build Coastguard Worker
42*795d594fSAndroid Build Coastguard Worker    Note: You may use a different `lunch` target, as long as it can build the
43*795d594fSAndroid Build Coastguard Worker    host binaries in the later steps.
44*795d594fSAndroid Build Coastguard Worker
45*795d594fSAndroid Build Coastguard Worker1. Configure Compiler Explorer.
46*795d594fSAndroid Build Coastguard Worker
47*795d594fSAndroid Build Coastguard Worker    ```
48*795d594fSAndroid Build Coastguard Worker    cp art/tools/compiler-explorer/config/* $COMPILER_EXPLORER_DIR/compiler-explorer/etc/config
49*795d594fSAndroid Build Coastguard Worker    # Replace {{compilersDir}} in the config files with the actual path.
50*795d594fSAndroid Build Coastguard Worker    find $COMPILER_EXPLORER_DIR/compiler-explorer/etc/config -type f -name '*local*' | \
51*795d594fSAndroid Build Coastguard Worker      xargs sed -i 's?{{compilersDir}}?'$COMPILER_EXPLORER_DIR/compilers'?'
52*795d594fSAndroid Build Coastguard Worker    ```
53*795d594fSAndroid Build Coastguard Worker
54*795d594fSAndroid Build Coastguard Worker1. Build Compiler Explorer.
55*795d594fSAndroid Build Coastguard Worker
56*795d594fSAndroid Build Coastguard Worker    ```
57*795d594fSAndroid Build Coastguard Worker    (cd $COMPILER_EXPLORER_DIR/compiler-explorer && make prebuild)
58*795d594fSAndroid Build Coastguard Worker    ```
59*795d594fSAndroid Build Coastguard Worker
60*795d594fSAndroid Build Coastguard Worker1. Build and copy compilers except dex2oat.
61*795d594fSAndroid Build Coastguard Worker
62*795d594fSAndroid Build Coastguard Worker    ```
63*795d594fSAndroid Build Coastguard Worker    m r8 smali-baksmali
64*795d594fSAndroid Build Coastguard Worker    rm -rf $COMPILER_EXPLORER_DIR/compilers
65*795d594fSAndroid Build Coastguard Worker    mkdir $COMPILER_EXPLORER_DIR/compilers
66*795d594fSAndroid Build Coastguard Worker    cp -r prebuilts/jdk/jdk21/linux-x86 $COMPILER_EXPLORER_DIR/compilers/java-local
67*795d594fSAndroid Build Coastguard Worker    cp -r external/kotlinc $COMPILER_EXPLORER_DIR/compilers/kotlinc-local
68*795d594fSAndroid Build Coastguard Worker    mkdir $COMPILER_EXPLORER_DIR/compilers/d8-local
69*795d594fSAndroid Build Coastguard Worker    cp out/host/linux-x86/framework/r8.jar $COMPILER_EXPLORER_DIR/compilers/d8-local
70*795d594fSAndroid Build Coastguard Worker    chmod +x $COMPILER_EXPLORER_DIR/compilers/d8-local/r8.jar
71*795d594fSAndroid Build Coastguard Worker    mkdir $COMPILER_EXPLORER_DIR/compilers/baksmali-local
72*795d594fSAndroid Build Coastguard Worker    cp out/host/linux-x86/framework/smali-baksmali.jar $COMPILER_EXPLORER_DIR/compilers/baksmali-local
73*795d594fSAndroid Build Coastguard Worker    ```
74*795d594fSAndroid Build Coastguard Worker
75*795d594fSAndroid Build Coastguard Worker    Note: `smali-baksmali` is for decompiling dex code. You don't need it if you
76*795d594fSAndroid Build Coastguard Worker    only want to see native code generated by dex2oat.
77*795d594fSAndroid Build Coastguard Worker
78*795d594fSAndroid Build Coastguard Worker1. Build and copy dex2oat.
79*795d594fSAndroid Build Coastguard Worker
80*795d594fSAndroid Build Coastguard Worker    ```
81*795d594fSAndroid Build Coastguard Worker    m dist out/dist/art_release.zip
82*795d594fSAndroid Build Coastguard Worker    rm -rf $COMPILER_EXPLORER_DIR/compilers/dex2oat-local
83*795d594fSAndroid Build Coastguard Worker    unzip -d $COMPILER_EXPLORER_DIR/compilers/dex2oat-local out/dist/art_release.zip
84*795d594fSAndroid Build Coastguard Worker    ```
85*795d594fSAndroid Build Coastguard Worker
86*795d594fSAndroid Build Coastguard Worker    Note: You may choose to do this on `master-art` instead of on a full Android
87*795d594fSAndroid Build Coastguard Worker    source tree if you wish.
88*795d594fSAndroid Build Coastguard Worker
89*795d594fSAndroid Build Coastguard Worker1. Generate boot images (optional but recommended).
90*795d594fSAndroid Build Coastguard Worker
91*795d594fSAndroid Build Coastguard Worker    ```
92*795d594fSAndroid Build Coastguard Worker    declare -a instruction_sets=("arm" "arm64" "x86" "x86_64" "riscv64")
93*795d594fSAndroid Build Coastguard Worker    m generate-boot-image
94*795d594fSAndroid Build Coastguard Worker    rm -rf $COMPILER_EXPLORER_DIR/compilers/dex2oat-local/app
95*795d594fSAndroid Build Coastguard Worker    mkdir -p $COMPILER_EXPLORER_DIR/compilers/dex2oat-local/app/apex/com.android.art/javalib
96*795d594fSAndroid Build Coastguard Worker    cp $COMPILER_EXPLORER_DIR/compilers/dex2oat-local/bootjars/* \
97*795d594fSAndroid Build Coastguard Worker        $COMPILER_EXPLORER_DIR/compilers/dex2oat-local/app/apex/com.android.art/javalib
98*795d594fSAndroid Build Coastguard Worker    mkdir -p $COMPILER_EXPLORER_DIR/compilers/dex2oat-local/app/system/framework
99*795d594fSAndroid Build Coastguard Worker    for instruction_set in "${instruction_sets[@]}"; do
100*795d594fSAndroid Build Coastguard Worker      $ANDROID_HOST_OUT/bin/generate-boot-image64 \
101*795d594fSAndroid Build Coastguard Worker          --output-dir=$COMPILER_EXPLORER_DIR/compilers/dex2oat-local/app/system/framework \
102*795d594fSAndroid Build Coastguard Worker          --compiler-filter=speed \
103*795d594fSAndroid Build Coastguard Worker          --use-profile=false \
104*795d594fSAndroid Build Coastguard Worker          --dex2oat-bin=$COMPILER_EXPLORER_DIR/compilers/dex2oat-local/x86_64/bin/dex2oat64 \
105*795d594fSAndroid Build Coastguard Worker          --android-root=$COMPILER_EXPLORER_DIR/compilers/dex2oat-local/app \
106*795d594fSAndroid Build Coastguard Worker          --core-only=true \
107*795d594fSAndroid Build Coastguard Worker          --instruction-set=$instruction_set \
108*795d594fSAndroid Build Coastguard Worker          -- \
109*795d594fSAndroid Build Coastguard Worker          --runtime-arg \
110*795d594fSAndroid Build Coastguard Worker          -Xgc:CMC
111*795d594fSAndroid Build Coastguard Worker    done
112*795d594fSAndroid Build Coastguard Worker    ```
113*795d594fSAndroid Build Coastguard Worker
114*795d594fSAndroid Build Coastguard Worker    Note: You may change `instruction_sets` on the first line to only include
115*795d594fSAndroid Build Coastguard Worker    the instruction sets that you need, to speed up boot image generation.
116*795d594fSAndroid Build Coastguard Worker
117*795d594fSAndroid Build Coastguard Worker    Note: Although this step is not required, having boot images makes dex2oat generate better code.
118*795d594fSAndroid Build Coastguard Worker
119*795d594fSAndroid Build Coastguard Worker1. Start Compiler Explorer server.
120*795d594fSAndroid Build Coastguard Worker
121*795d594fSAndroid Build Coastguard Worker    ```
122*795d594fSAndroid Build Coastguard Worker    (cd $COMPILER_EXPLORER_DIR/compiler-explorer && make run-only)
123*795d594fSAndroid Build Coastguard Worker    ```
124*795d594fSAndroid Build Coastguard Worker
125*795d594fSAndroid Build Coastguard Worker    Once you see `Listening on http://localhost:10240/`, you can open a browser
126*795d594fSAndroid Build Coastguard Worker    with that address to access Compiler Explorer.
127*795d594fSAndroid Build Coastguard Worker
128*795d594fSAndroid Build Coastguard WorkerWhen you iterate, press `Ctrl+C` to stop the server, and then repeat the last
129*795d594fSAndroid Build Coastguard Workerthree steps.
130