3030#include  " src/common/assert-scope.h" 
3131#include  " src/flags/flags.h" 
3232
33- //  Only compile the {LinuxPerfJitLogger } on Linux.
34- #if  V8_OS_LINUX
33+ //  Only compile the {PerfJitLogger } on Linux & Darwin .
34+ #if  V8_OS_LINUX || V8_OS_DARWIN 
3535
3636#include  < fcntl.h> 
3737#include  < sys/mman.h> 
@@ -118,22 +118,22 @@ struct PerfJitCodeUnwindingInfo : PerfJitBase {
118118  //  Followed by size_ - sizeof(PerfJitCodeUnwindingInfo) bytes of data.
119119};
120120
121- const  char  LinuxPerfJitLogger ::kFilenameFormatString [] = " %s/jit-%d.dump"  ;
121+ const  char  PerfJitLogger ::kFilenameFormatString [] = " %s/jit-%d.dump"  ;
122122
123123//  Extra padding for the PID in the filename
124- const  int  LinuxPerfJitLogger ::kFilenameBufferPadding  = 16 ;
124+ const  int  PerfJitLogger ::kFilenameBufferPadding  = 16 ;
125125
126126static  const  char  kStringTerminator [] = {' \0 '  };
127127
128128//  The following static variables are protected by
129129//  GetFileMutex().
130- int  LinuxPerfJitLogger ::process_id_ = 0 ;
131- uint64_t  LinuxPerfJitLogger ::reference_count_ = 0 ;
132- void * LinuxPerfJitLogger ::marker_address_ = nullptr ;
133- uint64_t  LinuxPerfJitLogger ::code_index_ = 0 ;
134- FILE* LinuxPerfJitLogger ::perf_output_handle_ = nullptr ;
130+ int  PerfJitLogger ::process_id_ = 0 ;
131+ uint64_t  PerfJitLogger ::reference_count_ = 0 ;
132+ void * PerfJitLogger ::marker_address_ = nullptr ;
133+ uint64_t  PerfJitLogger ::code_index_ = 0 ;
134+ FILE* PerfJitLogger ::perf_output_handle_ = nullptr ;
135135
136- void  LinuxPerfJitLogger ::OpenJitDumpFile () {
136+ void  PerfJitLogger ::OpenJitDumpFile () {
137137  //  Open the perf JIT dump file.
138138  perf_output_handle_ = nullptr ;
139139
@@ -153,22 +153,31 @@ void LinuxPerfJitLogger::OpenJitDumpFile() {
153153  if  (v8_flags.perf_prof_delete_file )
154154    CHECK_EQ (0 , unlink (perf_dump_name.begin ()));
155155
156+   //  On Linux, call OpenMarkerFile so that perf knows about the file path via
157+   //  an MMAP record.
158+   //  On macOS, don't call OpenMarkerFile because samply has already detected
159+   //  the file path during the call to `open` above (it interposes `open` with
160+   //  a preloaded library), and because the mmap call can be slow.
161+ #if  V8_OS_DARWIN
162+   marker_address_ = nullptr ;
163+ #else 
156164  marker_address_ = OpenMarkerFile (fd);
157165  if  (marker_address_ == nullptr ) return ;
166+ #endif 
158167
159168  perf_output_handle_ = fdopen (fd, " w+"  );
160169  if  (perf_output_handle_ == nullptr ) return ;
161170
162171  setvbuf (perf_output_handle_, nullptr , _IOFBF, kLogBufferSize );
163172}
164173
165- void  LinuxPerfJitLogger ::CloseJitDumpFile () {
174+ void  PerfJitLogger ::CloseJitDumpFile () {
166175  if  (perf_output_handle_ == nullptr ) return ;
167176  base::Fclose (perf_output_handle_);
168177  perf_output_handle_ = nullptr ;
169178}
170179
171- void * LinuxPerfJitLogger ::OpenMarkerFile (int  fd) {
180+ void * PerfJitLogger ::OpenMarkerFile (int  fd) {
172181  long  page_size = sysconf (_SC_PAGESIZE);  //  NOLINT(runtime/int)
173182  if  (page_size == -1 ) return  nullptr ;
174183
@@ -180,15 +189,14 @@ void* LinuxPerfJitLogger::OpenMarkerFile(int fd) {
180189  return  (marker_address == MAP_FAILED) ? nullptr  : marker_address;
181190}
182191
183- void  LinuxPerfJitLogger ::CloseMarkerFile (void * marker_address) {
192+ void  PerfJitLogger ::CloseMarkerFile (void * marker_address) {
184193  if  (marker_address == nullptr ) return ;
185194  long  page_size = sysconf (_SC_PAGESIZE);  //  NOLINT(runtime/int)
186195  if  (page_size == -1 ) return ;
187196  munmap (marker_address, page_size);
188197}
189198
190- LinuxPerfJitLogger::LinuxPerfJitLogger (Isolate* isolate)
191-     : CodeEventLogger(isolate) {
199+ PerfJitLogger::PerfJitLogger (Isolate* isolate) : CodeEventLogger(isolate) {
192200  base::LockGuard<base::RecursiveMutex> guard_file (GetFileMutex ().Pointer ());
193201  process_id_ = base::OS::GetCurrentProcessId ();
194202
@@ -201,7 +209,7 @@ LinuxPerfJitLogger::LinuxPerfJitLogger(Isolate* isolate)
201209  }
202210}
203211
204- LinuxPerfJitLogger ::~LinuxPerfJitLogger  () {
212+ PerfJitLogger ::~PerfJitLogger  () {
205213  base::LockGuard<base::RecursiveMutex> guard_file (GetFileMutex ().Pointer ());
206214
207215  reference_count_--;
@@ -211,16 +219,11 @@ LinuxPerfJitLogger::~LinuxPerfJitLogger() {
211219  }
212220}
213221
214- uint64_t  LinuxPerfJitLogger::GetTimestamp () {
215-   struct  timespec  ts;
216-   int  result = clock_gettime (CLOCK_MONOTONIC, &ts);
217-   DCHECK_EQ (0 , result);
218-   USE (result);
219-   static  const  uint64_t  kNsecPerSec  = 1000000000 ;
220-   return  (ts.tv_sec  * kNsecPerSec ) + ts.tv_nsec ;
222+ uint64_t  PerfJitLogger::GetTimestamp () {
223+   return  base::TimeTicks::Now ().since_origin ().InNanoseconds ();
221224}
222225
223- void  LinuxPerfJitLogger ::LogRecordedBuffer (
226+ void  PerfJitLogger ::LogRecordedBuffer (
224227    Tagged<AbstractCode> abstract_code,
225228    MaybeHandle<SharedFunctionInfo> maybe_sfi, const  char * name, int  length) {
226229  DisallowGarbageCollection no_gc;
@@ -263,8 +266,8 @@ void LinuxPerfJitLogger::LogRecordedBuffer(
263266}
264267
265268#if  V8_ENABLE_WEBASSEMBLY
266- void  LinuxPerfJitLogger ::LogRecordedBuffer (const  wasm::WasmCode* code,
267-                                             const  char * name, int  length) {
269+ void  PerfJitLogger ::LogRecordedBuffer (const  wasm::WasmCode* code,
270+                                       const  char * name, int  length) {
268271  base::LockGuard<base::RecursiveMutex> guard_file (GetFileMutex ().Pointer ());
269272
270273  if  (perf_output_handle_ == nullptr ) return ;
@@ -276,10 +279,9 @@ void LinuxPerfJitLogger::LogRecordedBuffer(const wasm::WasmCode* code,
276279}
277280#endif   //  V8_ENABLE_WEBASSEMBLY
278281
279- void  LinuxPerfJitLogger::WriteJitCodeLoadEntry (const  uint8_t * code_pointer,
280-                                                uint32_t  code_size,
281-                                                const  char * name,
282-                                                int  name_length) {
282+ void  PerfJitLogger::WriteJitCodeLoadEntry (const  uint8_t * code_pointer,
283+                                           uint32_t  code_size, const  char * name,
284+                                           int  name_length) {
283285  PerfJitCodeLoad code_load;
284286  code_load.event_  = PerfJitCodeLoad::kLoad ;
285287  code_load.size_  = sizeof (code_load) + name_length + 1  + code_size;
@@ -342,8 +344,8 @@ SourcePositionInfo GetSourcePositionInfo(Isolate* isolate, Tagged<Code> code,
342344
343345}  //  namespace
344346
345- void  LinuxPerfJitLogger ::LogWriteDebugInfo (Tagged<Code> code,
346-                                             Handle<SharedFunctionInfo> shared) {
347+ void  PerfJitLogger ::LogWriteDebugInfo (Tagged<Code> code,
348+                                       Handle<SharedFunctionInfo> shared) {
347349  //  Line ends of all scripts have been initialized prior to this.
348350  DisallowGarbageCollection no_gc;
349351  //  The WasmToJS wrapper stubs have source position entries.
@@ -426,7 +428,7 @@ void LinuxPerfJitLogger::LogWriteDebugInfo(Tagged<Code> code,
426428}
427429
428430#if  V8_ENABLE_WEBASSEMBLY
429- void  LinuxPerfJitLogger ::LogWriteDebugInfo (const  wasm::WasmCode* code) {
431+ void  PerfJitLogger ::LogWriteDebugInfo (const  wasm::WasmCode* code) {
430432  wasm::WasmModuleSourceMap* source_map =
431433      code->native_module ()->GetWasmSourceMap ();
432434  wasm::WireBytesRef code_ref =
@@ -494,7 +496,7 @@ void LinuxPerfJitLogger::LogWriteDebugInfo(const wasm::WasmCode* code) {
494496}
495497#endif   //  V8_ENABLE_WEBASSEMBLY
496498
497- void  LinuxPerfJitLogger ::LogWriteUnwindingInfo (Tagged<Code> code) {
499+ void  PerfJitLogger ::LogWriteUnwindingInfo (Tagged<Code> code) {
498500  PerfJitCodeUnwindingInfo unwinding_info_header;
499501  unwinding_info_header.event_  = PerfJitCodeLoad::kUnwindingInfo ;
500502  unwinding_info_header.time_stamp_  = GetTimestamp ();
@@ -529,13 +531,13 @@ void LinuxPerfJitLogger::LogWriteUnwindingInfo(Tagged<Code> code) {
529531  LogWriteBytes (padding_bytes, static_cast <int >(padding_size));
530532}
531533
532- void  LinuxPerfJitLogger ::LogWriteBytes (const  char * bytes, int  size) {
534+ void  PerfJitLogger ::LogWriteBytes (const  char * bytes, int  size) {
533535  size_t  rv = fwrite (bytes, 1 , size, perf_output_handle_);
534536  DCHECK (static_cast <size_t >(size) == rv);
535537  USE (rv);
536538}
537539
538- void  LinuxPerfJitLogger ::LogWriteHeader () {
540+ void  PerfJitLogger ::LogWriteHeader () {
539541  DCHECK_NOT_NULL (perf_output_handle_);
540542  PerfJitHeader header;
541543
@@ -556,4 +558,4 @@ void LinuxPerfJitLogger::LogWriteHeader() {
556558}  //  namespace internal
557559}  //  namespace v8
558560
559- #endif   //  V8_OS_LINUX
561+ #endif   //  V8_OS_LINUX || V8_OS_DARWIN 
0 commit comments