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