// Copyright 2018 the V8 project authors. All rights reserved.
|
// Use of this source code is governed by a BSD-style license that can be
|
// found in the LICENSE file.
|
|
#ifndef V8_CODE_TRACER_H_
|
#define V8_CODE_TRACER_H_
|
|
#include "src/allocation.h"
|
#include "src/flags.h"
|
#include "src/globals.h"
|
#include "src/utils.h"
|
|
namespace v8 {
|
namespace internal {
|
|
class CodeTracer final : public Malloced {
|
public:
|
explicit CodeTracer(int isolate_id) : file_(nullptr), scope_depth_(0) {
|
if (!ShouldRedirect()) {
|
file_ = stdout;
|
return;
|
}
|
|
if (FLAG_redirect_code_traces_to != nullptr) {
|
StrNCpy(filename_, FLAG_redirect_code_traces_to, filename_.length());
|
} else if (isolate_id >= 0) {
|
SNPrintF(filename_, "code-%d-%d.asm", base::OS::GetCurrentProcessId(),
|
isolate_id);
|
} else {
|
SNPrintF(filename_, "code-%d.asm", base::OS::GetCurrentProcessId());
|
}
|
|
WriteChars(filename_.start(), "", 0, false);
|
}
|
|
class Scope {
|
public:
|
explicit Scope(CodeTracer* tracer) : tracer_(tracer) { tracer->OpenFile(); }
|
~Scope() { tracer_->CloseFile(); }
|
|
FILE* file() const { return tracer_->file(); }
|
|
private:
|
CodeTracer* tracer_;
|
};
|
|
void OpenFile() {
|
if (!ShouldRedirect()) {
|
return;
|
}
|
|
if (file_ == nullptr) {
|
file_ = base::OS::FOpen(filename_.start(), "ab");
|
}
|
|
scope_depth_++;
|
}
|
|
void CloseFile() {
|
if (!ShouldRedirect()) {
|
return;
|
}
|
|
if (--scope_depth_ == 0) {
|
fclose(file_);
|
file_ = nullptr;
|
}
|
}
|
|
FILE* file() const { return file_; }
|
|
private:
|
static bool ShouldRedirect() { return FLAG_redirect_code_traces; }
|
|
EmbeddedVector<char, 128> filename_;
|
FILE* file_;
|
int scope_depth_;
|
};
|
|
} // namespace internal
|
} // namespace v8
|
|
#endif // V8_CODE_TRACER_H_
|