1+ use runner_shared:: perf_event:: PerfEvent ;
2+
13use crate :: prelude:: * ;
24use std:: path:: Path ;
35
@@ -67,15 +69,7 @@ pub fn get_working_perf_executable() -> Option<OsString> {
6769/// Detects if the required perf events are available on this system.
6870/// Returns the flags to pass to perf record command if they are available, otherwise returns None.
6971pub fn get_event_flags ( perf_executable : & OsString ) -> anyhow:: Result < Option < String > > {
70- const CYCLES_EVENT_NAME : & str = "cycles" ;
71- const CACHE_REFERENCES_EVENT_NAME : & str = "cache-references" ;
72- const CACHE_MISSES_EVENT_NAME : & str = "cache-misses" ;
73-
74- let perf_events = [
75- CYCLES_EVENT_NAME ,
76- CACHE_REFERENCES_EVENT_NAME ,
77- CACHE_MISSES_EVENT_NAME ,
78- ] ;
72+ let perf_events = PerfEvent :: all_events ( ) ;
7973
8074 let output = Command :: new ( perf_executable)
8175 . arg ( "list" )
@@ -97,29 +91,28 @@ pub fn get_event_flags(perf_executable: &OsString) -> anyhow::Result<Option<Stri
9791 // cpu-cycles OR cycles [Hardware event]
9892 // instructions [Hardware event]
9993 // ref-cycles [Hardware event]
100- let missing_events: Vec < & str > = perf_events
94+ let missing_events: Vec < PerfEvent > = perf_events
10195 . iter ( )
10296 . filter ( |& & event| {
103- !stdout
104- . lines ( )
105- . any ( |line| line. split_whitespace ( ) . any ( |word| word == event) )
97+ !stdout. lines ( ) . any ( |line| {
98+ line. split_whitespace ( )
99+ . any ( |word| word == event. to_perf_string ( ) )
100+ } )
106101 } )
107102 . copied ( )
108103 . collect ( ) ;
109104
110105 if !missing_events. is_empty ( ) {
111106 warn ! (
112107 "Not all required perf events available. Missing: [{}], using default events" ,
113- missing_events. join( ", " )
108+ missing_events. into_iter ( ) . join( ", " )
114109 ) ;
115110 return Ok ( None ) ;
116111 }
117112
118- debug ! (
119- "All required perf events available: {}" ,
120- perf_events. join( ", " )
121- ) ;
122- Ok ( Some ( format ! ( "-e {{{}}}" , perf_events. join( "," ) ) ) )
113+ let events_string = perf_events. into_iter ( ) . join ( "," ) ;
114+ debug ! ( "All required perf events available: {events_string}" , ) ;
115+ Ok ( Some ( format ! ( "-e {{{events_string}}}" ) ) )
123116}
124117
125118pub fn get_compression_flags < S : AsRef < Path > > ( perf_executable : S ) -> Result < Option < String > > {
0 commit comments