Skip to content

Commit 4a206e2

Browse files
RaisinTenaduh95
authored andcommitted
deps: V8: backport e5dbbbadcbff
Original commit message: Enable --perf-prof flag on MacOS MacOS actually can share the implementation of {PerfJitLogger} with Linux. From the issue 40112126, only Fuzzer tests on Windows ran into UNREACHABLE/FATAL because of the unimplemented {PerfJitLogger}. This CL enables the flag --perf-prof on MacOS. Bug: 403765219 Change-Id: I97871fbcc0cb9890c51ca14fd7a6e65bd0e3c0d2 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/6385655 Reviewed-by: Clemens Backes <[email protected]> Reviewed-by: Matthias Liedtke <[email protected]> Auto-Submit: 杨文明 <[email protected]> Commit-Queue: Clemens Backes <[email protected]> Cr-Commit-Position: refs/heads/main@{#99885} Refs: v8/v8@e5dbbba Co-authored-by: Darshan Sen <[email protected]> PR-URL: #58120 Reviewed-By: Michaël Zasso <[email protected]> Reviewed-By: Antoine du Hamel <[email protected]>
1 parent fbbb01f commit 4a206e2

File tree

7 files changed

+81
-80
lines changed

7 files changed

+81
-80
lines changed

common.gypi

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838

3939
# Reset this number to 0 on major V8 upgrades.
4040
# Increment by one for each non-official patch applied to deps/v8.
41-
'v8_embedder_string': '-node.24',
41+
'v8_embedder_string': '-node.25',
4242

4343
##### V8 defaults for Node.js #####
4444

deps/v8/src/compiler/backend/code-generator.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,7 @@ void CodeGenerator::AssembleCode() {
408408
}
409409
}
410410

411-
// The LinuxPerfJitLogger logs code up until here, excluding the safepoint
411+
// The PerfJitLogger logs code up until here, excluding the safepoint
412412
// table. Resolve the unwinding info now so it is aware of the same code
413413
// size as reported by perf.
414414
unwinding_info_writer_.Finish(masm()->pc_offset());

deps/v8/src/diagnostics/perf-jit.cc

+39-37
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@
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

126126
static 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

deps/v8/src/diagnostics/perf-jit.h

+6-6
Original file line numberDiff line numberDiff line change
@@ -30,19 +30,19 @@
3030

3131
#include "include/v8config.h"
3232

33-
// {LinuxPerfJitLogger} is only implemented on Linux.
34-
#if V8_OS_LINUX
33+
// {PerfJitLogger} is only implemented on Linux & Darwin.
34+
#if V8_OS_LINUX || V8_OS_DARWIN
3535

3636
#include "src/logging/log.h"
3737

3838
namespace v8 {
3939
namespace internal {
4040

4141
// Linux perf tool logging support.
42-
class LinuxPerfJitLogger : public CodeEventLogger {
42+
class PerfJitLogger : public CodeEventLogger {
4343
public:
44-
explicit LinuxPerfJitLogger(Isolate* isolate);
45-
~LinuxPerfJitLogger() override;
44+
explicit PerfJitLogger(Isolate* isolate);
45+
~PerfJitLogger() override;
4646

4747
void CodeMoveEvent(Tagged<InstructionStream> from,
4848
Tagged<InstructionStream> to) override {
@@ -142,6 +142,6 @@ class LinuxPerfJitLogger : public CodeEventLogger {
142142
} // namespace internal
143143
} // namespace v8
144144

145-
#endif // V8_OS_LINUX
145+
#endif // V8_OS_LINUX || V8_OS_DARWIN
146146

147147
#endif // V8_DIAGNOSTICS_PERF_JIT_H_

deps/v8/src/flags/flag-definitions.h

+4-4
Original file line numberDiff line numberDiff line change
@@ -2782,7 +2782,7 @@ DEFINE_IMPLICATION(prof, log_code)
27822782

27832783
DEFINE_BOOL(ll_prof, false, "Enable low-level linux profiler.")
27842784

2785-
#if V8_OS_LINUX
2785+
#if V8_OS_LINUX || V8_OS_DARWIN
27862786
#define DEFINE_PERF_PROF_BOOL(nam, cmt) DEFINE_BOOL(nam, false, cmt)
27872787
#define DEFINE_PERF_PROF_IMPLICATION DEFINE_IMPLICATION
27882788
#else
@@ -2799,7 +2799,7 @@ DEFINE_BOOL(ll_prof, false, "Enable low-level linux profiler.")
27992799
#endif
28002800

28012801
DEFINE_PERF_PROF_BOOL(perf_basic_prof,
2802-
"Enable perf linux profiler (basic support).")
2802+
"Enable basic support for perf profiler.")
28032803
DEFINE_NEG_IMPLICATION(perf_basic_prof, compact_code_space)
28042804
DEFINE_STRING(perf_basic_prof_path, DEFAULT_PERF_BASIC_PROF_PATH,
28052805
"directory to write perf-<pid>.map symbol file to")
@@ -2808,8 +2808,8 @@ DEFINE_PERF_PROF_BOOL(
28082808
"Only report function code ranges to perf (i.e. no stubs).")
28092809
DEFINE_PERF_PROF_IMPLICATION(perf_basic_prof_only_functions, perf_basic_prof)
28102810

2811-
DEFINE_PERF_PROF_BOOL(
2812-
perf_prof, "Enable perf linux profiler (experimental annotate support).")
2811+
DEFINE_PERF_PROF_BOOL(perf_prof,
2812+
"Enable experimental annotate support for perf profiler.")
28132813
DEFINE_STRING(perf_prof_path, DEFAULT_PERF_PROF_PATH,
28142814
"directory to write jit-<pid>.dump symbol file to")
28152815
DEFINE_PERF_PROF_BOOL(

0 commit comments

Comments
 (0)