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