Skip to content

Commit df8098b

Browse files
committed
Write jit addresses to perf map
1 parent c9cc594 commit df8098b

File tree

2 files changed

+74
-6
lines changed

2 files changed

+74
-6
lines changed

src/jit/jit_asm_common_funs.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,16 @@ impl<const CPU: CpuType> Default for JitAsmCommonFuns<CPU> {
2525

2626
impl<const CPU: CpuType> JitAsmCommonFuns<CPU> {
2727
pub fn new(asm: &mut JitAsm<CPU>) -> Self {
28-
let mut create_function = |fun: fn(&mut BlockAsm, &mut JitAsm<CPU>)| {
28+
let mut create_function = |fun: fn(&mut BlockAsm, &mut JitAsm<CPU>), name: &str| {
2929
let mut block_asm = asm.new_block_asm(true);
3030
fun(&mut block_asm, asm);
3131
block_asm.emit_opcodes(0, false);
3232
let opcodes = block_asm.finalize(0);
33-
get_jit_mut!(asm.emu).insert_common_fun_block(opcodes) as usize - get_jit!(asm.emu).get_start_entry()
33+
get_jit_mut!(asm.emu).insert_common_fun_block(opcodes, name) as usize - get_jit!(asm.emu).get_start_entry()
3434
};
3535
JitAsmCommonFuns {
36-
branch_return_stack: create_function(Self::emit_branch_return_stack),
37-
branch_reg: create_function(Self::emit_branch_reg),
36+
branch_return_stack: create_function(Self::emit_branch_return_stack, &format!("{CPU:?}_branch_return_stack")),
37+
branch_reg: create_function(Self::emit_branch_reg, &format!("{CPU:?}_branch_reg")),
3838
}
3939
}
4040

src/jit/jit_memory.rs

Lines changed: 70 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,13 +94,74 @@ pub struct JitLiveRanges {
9494
pub vram_arm7: HeapMemU8<{ (vram::ARM7_SIZE / JIT_LIVE_RANGE_PAGE_SIZE / 8) as usize }>,
9595
}
9696

97+
#[cfg(target_os = "linux")]
98+
struct JitPerfMapRecord {
99+
common_records: Vec<(usize, usize, String)>,
100+
perf_map_path: std::path::PathBuf,
101+
perf_map: std::fs::File,
102+
}
103+
104+
#[cfg(target_os = "linux")]
105+
impl JitPerfMapRecord {
106+
fn new() -> Self {
107+
let perf_map_path = std::path::PathBuf::from(format!("/tmp/perf-{}.map", std::process::id()));
108+
JitPerfMapRecord {
109+
common_records: Vec::new(),
110+
perf_map_path: perf_map_path.clone(),
111+
perf_map: std::fs::File::create(perf_map_path).unwrap(),
112+
}
113+
}
114+
115+
fn record_common(&mut self, jit_start: usize, jit_size: usize, name: impl AsRef<str>) {
116+
if crate::IS_DEBUG {
117+
self.common_records.push((jit_start, jit_size, name.as_ref().to_string()));
118+
use std::io::Write;
119+
writeln!(self.perf_map, "{jit_start:x} {jit_size:x} {}", name.as_ref()).unwrap();
120+
}
121+
}
122+
123+
fn record(&mut self, jit_start: usize, jit_size: usize, guest_pc: u32, cpu_type: CpuType) {
124+
if crate::IS_DEBUG {
125+
use std::io::Write;
126+
writeln!(self.perf_map, "{jit_start:x} {jit_size:x} {cpu_type:?}_{guest_pc:x}").unwrap();
127+
}
128+
}
129+
130+
fn reset(&mut self) {
131+
if crate::IS_DEBUG {
132+
self.perf_map = std::fs::File::create(&self.perf_map_path).unwrap();
133+
for (jit_start, jit_size, name) in &self.common_records {
134+
use std::io::Write;
135+
writeln!(self.perf_map, "{jit_start:x} {jit_size:x} {name}").unwrap();
136+
}
137+
}
138+
}
139+
}
140+
141+
#[cfg(target_os = "vita")]
142+
struct JitPerfMapRecord;
143+
144+
#[cfg(target_os = "vita")]
145+
impl JitPerfMapRecord {
146+
fn new() -> Self {
147+
JitPerfMapRecord
148+
}
149+
150+
fn record_common(&mut self, jit_start: usize, jit_size: usize, name: impl AsRef<str>) {}
151+
152+
fn record(&mut self, jit_start: usize, jit_size: usize, guest_pc: u32, cpu_type: CpuType) {}
153+
154+
fn reset(&mut self) {}
155+
}
156+
97157
pub struct JitMemory {
98158
mem: Mmap,
99159
mem_common_end: usize,
100160
mem_start: usize,
101161
jit_entries: JitEntries,
102162
jit_live_ranges: JitLiveRanges,
103163
pub jit_memory_map: JitMemoryMap,
164+
jit_perf_map_record: JitPerfMapRecord,
104165
}
105166

106167
impl JitMemory {
@@ -115,11 +176,14 @@ impl JitMemory {
115176
jit_entries,
116177
jit_live_ranges,
117178
jit_memory_map,
179+
jit_perf_map_record: JitPerfMapRecord::new(),
118180
}
119181
}
120182

121183
fn reset_blocks(&mut self) {
122184
debug_println!("Jit memory reset");
185+
self.jit_perf_map_record.reset();
186+
123187
self.mem_start = self.mem_common_end;
124188

125189
self.jit_entries.reset();
@@ -155,7 +219,7 @@ impl JitMemory {
155219
}
156220
}
157221

158-
pub fn insert_common_fun_block(&mut self, opcodes: &[u32]) -> *const extern "C" fn() {
222+
pub fn insert_common_fun_block(&mut self, opcodes: &[u32], name: impl AsRef<str>) -> *const extern "C" fn() {
159223
let aligned_size = utils::align_up(size_of_val(opcodes), PAGE_SIZE);
160224
let mem_start = self.mem_start;
161225

@@ -165,7 +229,9 @@ impl JitMemory {
165229
self.mem_start += aligned_size;
166230
self.mem_common_end = self.mem_start;
167231

168-
(mem_start + self.mem.as_ptr() as usize) as _
232+
let jit_entry_addr = mem_start + self.mem.as_ptr() as usize;
233+
self.jit_perf_map_record.record_common(jit_entry_addr, aligned_size, name);
234+
jit_entry_addr as _
169235
}
170236

171237
fn insert(&mut self, opcodes: &[u32]) -> (usize, usize, bool) {
@@ -216,6 +282,8 @@ impl JitMemory {
216282
guest_pc
217283
);
218284

285+
self.jit_perf_map_record.record(jit_entry_addr as usize, aligned_size, guest_pc, CPU);
286+
219287
(jit_entry_addr, flushed)
220288
}};
221289
}

0 commit comments

Comments
 (0)