@@ -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+
97157pub 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
106167impl 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