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