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