1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright 2016 The Android Open Source Project 3*795d594fSAndroid Build Coastguard Worker * 4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*795d594fSAndroid Build Coastguard Worker * 8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*795d594fSAndroid Build Coastguard Worker * 10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*795d594fSAndroid Build Coastguard Worker * limitations under the License. 15*795d594fSAndroid Build Coastguard Worker */ 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Worker #ifndef ART_COMPILER_JIT_JIT_LOGGER_H_ 18*795d594fSAndroid Build Coastguard Worker #define ART_COMPILER_JIT_JIT_LOGGER_H_ 19*795d594fSAndroid Build Coastguard Worker 20*795d594fSAndroid Build Coastguard Worker #include <memory> 21*795d594fSAndroid Build Coastguard Worker 22*795d594fSAndroid Build Coastguard Worker #include "base/macros.h" 23*795d594fSAndroid Build Coastguard Worker #include "base/mutex.h" 24*795d594fSAndroid Build Coastguard Worker #include "base/os.h" 25*795d594fSAndroid Build Coastguard Worker 26*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN { 27*795d594fSAndroid Build Coastguard Worker 28*795d594fSAndroid Build Coastguard Worker class ArtMethod; 29*795d594fSAndroid Build Coastguard Worker 30*795d594fSAndroid Build Coastguard Worker namespace jit { 31*795d594fSAndroid Build Coastguard Worker 32*795d594fSAndroid Build Coastguard Worker // 33*795d594fSAndroid Build Coastguard Worker // JitLogger supports two approaches of perf profiling. 34*795d594fSAndroid Build Coastguard Worker // 35*795d594fSAndroid Build Coastguard Worker // (1) perf-map: 36*795d594fSAndroid Build Coastguard Worker // The perf-map mechanism generates perf-PID.map file, 37*795d594fSAndroid Build Coastguard Worker // which provides simple "address, size, method_name" information to perf, 38*795d594fSAndroid Build Coastguard Worker // and allows perf to map samples in jit-code-cache to jitted method symbols. 39*795d594fSAndroid Build Coastguard Worker // 40*795d594fSAndroid Build Coastguard Worker // Command line Example: 41*795d594fSAndroid Build Coastguard Worker // $ perf record dalvikvm -Xcompiler-option --generate-debug-info -cp <classpath> Test 42*795d594fSAndroid Build Coastguard Worker // $ perf report 43*795d594fSAndroid Build Coastguard Worker // NOTE: 44*795d594fSAndroid Build Coastguard Worker // - Make sure that the perf-PID.map file is available for 'perf report' tool to access, 45*795d594fSAndroid Build Coastguard Worker // so that jitted method can be displayed. 46*795d594fSAndroid Build Coastguard Worker // 47*795d594fSAndroid Build Coastguard Worker // 48*795d594fSAndroid Build Coastguard Worker // (2) perf-inject: 49*795d594fSAndroid Build Coastguard Worker // The perf-inject mechansim generates jit-PID.dump file, 50*795d594fSAndroid Build Coastguard Worker // which provides rich informations about a jitted method. 51*795d594fSAndroid Build Coastguard Worker // It allows perf or other profiling tools to do advanced analysis on jitted code, 52*795d594fSAndroid Build Coastguard Worker // for example instruction level profiling. 53*795d594fSAndroid Build Coastguard Worker // 54*795d594fSAndroid Build Coastguard Worker // Command line Example: 55*795d594fSAndroid Build Coastguard Worker // $ perf record -k mono dalvikvm -Xcompiler-option --generate-debug-info -cp <classpath> Test 56*795d594fSAndroid Build Coastguard Worker // $ perf inject -j -i perf.data -o perf.data.jitted 57*795d594fSAndroid Build Coastguard Worker // $ perf report -i perf.data.jitted 58*795d594fSAndroid Build Coastguard Worker // $ perf annotate -i perf.data.jitted 59*795d594fSAndroid Build Coastguard Worker // NOTE: 60*795d594fSAndroid Build Coastguard Worker // REQUIREMENTS 61*795d594fSAndroid Build Coastguard Worker // - The 'perf record -k mono' option requires 4.1 (or higher) Linux kernel. 62*795d594fSAndroid Build Coastguard Worker // - The 'perf inject' (generating jit ELF files feature) requires perf 4.6 (or higher). 63*795d594fSAndroid Build Coastguard Worker // PERF RECORD 64*795d594fSAndroid Build Coastguard Worker // - The '-k mono' option tells 'perf record' to use CLOCK_MONOTONIC clock during sampling; 65*795d594fSAndroid Build Coastguard Worker // which is required by 'perf inject', to make sure that both perf.data and jit-PID.dump 66*795d594fSAndroid Build Coastguard Worker // have unified clock source for timestamps. 67*795d594fSAndroid Build Coastguard Worker // PERF INJECT 68*795d594fSAndroid Build Coastguard Worker // - The 'perf inject' tool injects information from jit-PID.dump into perf.data file, 69*795d594fSAndroid Build Coastguard Worker // and generates small ELF files (jitted-TID-CODEID.so) for each jitted method. 70*795d594fSAndroid Build Coastguard Worker // - On Android devices, the jit-PID.dump file is generated in /data/misc/trace/ folder, and 71*795d594fSAndroid Build Coastguard Worker // such location is recorded in perf.data file. 72*795d594fSAndroid Build Coastguard Worker // The 'perf inject' tool is going to look for jit-PID.dump and generates small ELF files in 73*795d594fSAndroid Build Coastguard Worker // this /data/misc/trace/ folder. 74*795d594fSAndroid Build Coastguard Worker // Make sure that you have the read/write access to /data/misc/trace/ folder. 75*795d594fSAndroid Build Coastguard Worker // - On non-Android devices, the jit-PID.dump file is generated in /tmp/ folder, and 76*795d594fSAndroid Build Coastguard Worker // 'perf inject' tool operates on this folder. 77*795d594fSAndroid Build Coastguard Worker // Make sure that you have the read/write access to /tmp/ folder. 78*795d594fSAndroid Build Coastguard Worker // - If you are executing 'perf inject' on non-Android devices (host), but perf.data and 79*795d594fSAndroid Build Coastguard Worker // jit-PID.dump files are adb-pulled from Android devices, make sure that there is a 80*795d594fSAndroid Build Coastguard Worker // /data/misc/trace/ folder on host, and jit-PID.dump file is copied to this folder. 81*795d594fSAndroid Build Coastguard Worker // - Currently 'perf inject' doesn't provide option to change the path for jit-PID.dump and 82*795d594fSAndroid Build Coastguard Worker // generated ELF files. 83*795d594fSAndroid Build Coastguard Worker // PERF ANNOTATE 84*795d594fSAndroid Build Coastguard Worker // - The 'perf annotate' tool displays assembly level profiling report. 85*795d594fSAndroid Build Coastguard Worker // Source code can also be displayed if the ELF file has debug symbols. 86*795d594fSAndroid Build Coastguard Worker // - Make sure above small ELF files are available for 'perf annotate' tool to access, 87*795d594fSAndroid Build Coastguard Worker // so that jitted code can be displayed in assembly view. 88*795d594fSAndroid Build Coastguard Worker // 89*795d594fSAndroid Build Coastguard Worker class JitLogger { 90*795d594fSAndroid Build Coastguard Worker public: JitLogger()91*795d594fSAndroid Build Coastguard Worker JitLogger() : code_index_(0), marker_address_(nullptr) {} 92*795d594fSAndroid Build Coastguard Worker OpenLog()93*795d594fSAndroid Build Coastguard Worker void OpenLog() { 94*795d594fSAndroid Build Coastguard Worker OpenPerfMapLog(); 95*795d594fSAndroid Build Coastguard Worker OpenJitDumpLog(); 96*795d594fSAndroid Build Coastguard Worker } 97*795d594fSAndroid Build Coastguard Worker WriteLog(const void * ptr,size_t code_size,ArtMethod * method)98*795d594fSAndroid Build Coastguard Worker void WriteLog(const void* ptr, size_t code_size, ArtMethod* method) 99*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) { 100*795d594fSAndroid Build Coastguard Worker WritePerfMapLog(ptr, code_size, method); 101*795d594fSAndroid Build Coastguard Worker WriteJitDumpLog(ptr, code_size, method); 102*795d594fSAndroid Build Coastguard Worker } 103*795d594fSAndroid Build Coastguard Worker CloseLog()104*795d594fSAndroid Build Coastguard Worker void CloseLog() { 105*795d594fSAndroid Build Coastguard Worker ClosePerfMapLog(); 106*795d594fSAndroid Build Coastguard Worker CloseJitDumpLog(); 107*795d594fSAndroid Build Coastguard Worker } 108*795d594fSAndroid Build Coastguard Worker 109*795d594fSAndroid Build Coastguard Worker private: 110*795d594fSAndroid Build Coastguard Worker // For perf-map profiling 111*795d594fSAndroid Build Coastguard Worker void OpenPerfMapLog(); 112*795d594fSAndroid Build Coastguard Worker void WritePerfMapLog(const void* ptr, size_t code_size, ArtMethod* method) 113*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 114*795d594fSAndroid Build Coastguard Worker void ClosePerfMapLog(); 115*795d594fSAndroid Build Coastguard Worker 116*795d594fSAndroid Build Coastguard Worker // For perf-inject profiling 117*795d594fSAndroid Build Coastguard Worker void OpenJitDumpLog(); 118*795d594fSAndroid Build Coastguard Worker void WriteJitDumpLog(const void* ptr, size_t code_size, ArtMethod* method) 119*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_); 120*795d594fSAndroid Build Coastguard Worker void CloseJitDumpLog(); 121*795d594fSAndroid Build Coastguard Worker 122*795d594fSAndroid Build Coastguard Worker void OpenMarkerFile(); 123*795d594fSAndroid Build Coastguard Worker void CloseMarkerFile(); 124*795d594fSAndroid Build Coastguard Worker void WriteJitDumpHeader(); 125*795d594fSAndroid Build Coastguard Worker void WriteJitDumpDebugInfo(); 126*795d594fSAndroid Build Coastguard Worker 127*795d594fSAndroid Build Coastguard Worker std::unique_ptr<File> perf_file_; 128*795d594fSAndroid Build Coastguard Worker std::unique_ptr<File> jit_dump_file_; 129*795d594fSAndroid Build Coastguard Worker uint64_t code_index_; 130*795d594fSAndroid Build Coastguard Worker void* marker_address_; 131*795d594fSAndroid Build Coastguard Worker 132*795d594fSAndroid Build Coastguard Worker DISALLOW_COPY_AND_ASSIGN(JitLogger); 133*795d594fSAndroid Build Coastguard Worker }; 134*795d594fSAndroid Build Coastguard Worker 135*795d594fSAndroid Build Coastguard Worker } // namespace jit 136*795d594fSAndroid Build Coastguard Worker } // namespace art 137*795d594fSAndroid Build Coastguard Worker 138*795d594fSAndroid Build Coastguard Worker #endif // ART_COMPILER_JIT_JIT_LOGGER_H_ 139