Upgrade V8 to version 4.9.385.28
https://chromium.googlesource.com/v8/v8/+/4.9.385.28
FPIIM-449
Change-Id: I4b2e74289d4bf3667f2f3dc8aa2e541f63e26eb4
diff --git a/src/log.cc b/src/log.cc
index 3eede36..a10d962 100644
--- a/src/log.cc
+++ b/src/log.cc
@@ -7,21 +7,17 @@
#include <cstdarg>
#include <sstream>
-#include "src/v8.h"
-
#include "src/bailout-reason.h"
#include "src/base/platform/platform.h"
#include "src/bootstrapper.h"
#include "src/code-stubs.h"
-#include "src/cpu-profiler.h"
#include "src/deoptimizer.h"
#include "src/global-handles.h"
#include "src/log-inl.h"
#include "src/log-utils.h"
#include "src/macro-assembler.h"
-#include "src/perf-jit.h"
+#include "src/profiler/cpu-profiler.h"
#include "src/runtime-profiler.h"
-#include "src/serialize.h"
#include "src/string-stream.h"
#include "src/vm-state-inl.h"
@@ -49,12 +45,14 @@
} \
} while (false);
-// ComputeMarker must only be used when SharedFunctionInfo is known.
-static const char* ComputeMarker(Code* code) {
+static const char* ComputeMarker(SharedFunctionInfo* shared, Code* code) {
switch (code->kind()) {
- case Code::FUNCTION: return code->optimizable() ? "~" : "";
- case Code::OPTIMIZED_FUNCTION: return "*";
- default: return "";
+ case Code::FUNCTION:
+ return shared->optimization_disabled() ? "" : "~";
+ case Code::OPTIMIZED_FUNCTION:
+ return "*";
+ default:
+ return "";
}
}
@@ -125,8 +123,9 @@
}
void AppendInt(int n) {
- Vector<char> buffer(utf8_buffer_ + utf8_pos_,
- kUtf8BufferSize - utf8_pos_);
+ int space = kUtf8BufferSize - utf8_pos_;
+ if (space <= 0) return;
+ Vector<char> buffer(utf8_buffer_ + utf8_pos_, space);
int size = SNPrintF(buffer, "%d", n);
if (size > 0 && utf8_pos_ + size <= kUtf8BufferSize) {
utf8_pos_ += size;
@@ -134,8 +133,9 @@
}
void AppendHex(uint32_t n) {
- Vector<char> buffer(utf8_buffer_ + utf8_pos_,
- kUtf8BufferSize - utf8_pos_);
+ int space = kUtf8BufferSize - utf8_pos_;
+ if (space <= 0) return;
+ Vector<char> buffer(utf8_buffer_ + utf8_pos_, space);
int size = SNPrintF(buffer, "%x", n);
if (size > 0 && utf8_pos_ + size <= kUtf8BufferSize) {
utf8_pos_ += size;
@@ -147,7 +147,7 @@
private:
static const int kUtf8BufferSize = 512;
- static const int kUtf16BufferSize = 128;
+ static const int kUtf16BufferSize = kUtf8BufferSize;
int utf8_pos_;
char utf8_buffer_[kUtf8BufferSize];
@@ -184,7 +184,7 @@
CompilationInfo* info,
Name* name) {
name_buffer_->Init(tag);
- name_buffer_->AppendBytes(ComputeMarker(code));
+ name_buffer_->AppendBytes(ComputeMarker(shared, code));
name_buffer_->AppendName(name);
LogRecordedBuffer(code, shared, name_buffer_->get(), name_buffer_->size());
}
@@ -196,7 +196,7 @@
CompilationInfo* info,
Name* source, int line, int column) {
name_buffer_->Init(tag);
- name_buffer_->AppendBytes(ComputeMarker(code));
+ name_buffer_->AppendBytes(ComputeMarker(shared, code));
name_buffer_->AppendString(shared->DebugName());
name_buffer_->AppendByte(' ');
if (source->IsString()) {
@@ -271,7 +271,7 @@
CHECK_NE(size, -1);
perf_output_handle_ =
base::OS::FOpen(perf_dump_name.start(), base::OS::LogFileOpenMode);
- CHECK_NE(perf_output_handle_, NULL);
+ CHECK_NOT_NULL(perf_output_handle_);
setvbuf(perf_output_handle_, NULL, _IOFBF, kLogBufferSize);
}
@@ -288,6 +288,12 @@
int length) {
DCHECK(code->instruction_start() == code->address() + Code::kHeaderSize);
+ if (FLAG_perf_basic_prof_only_functions &&
+ (code->kind() != Code::FUNCTION &&
+ code->kind() != Code::OPTIMIZED_FUNCTION)) {
+ return;
+ }
+
base::OS::FPrint(perf_output_handle_, "%llx %x %.*s\n",
reinterpret_cast<uint64_t>(code->instruction_start()),
code->instruction_size(), length, name);
@@ -402,6 +408,8 @@
const char arch[] = "x32";
#elif V8_TARGET_ARCH_ARM
const char arch[] = "arm";
+#elif V8_TARGET_ARCH_PPC
+ const char arch[] = "ppc";
#elif V8_TARGET_ARCH_MIPS
const char arch[] = "mips";
#elif V8_TARGET_ARCH_X87
@@ -495,6 +503,7 @@
int length);
JitCodeEventHandler code_event_handler_;
+ base::Mutex logger_mutex_;
};
@@ -524,6 +533,7 @@
void JitLogger::CodeMoveEvent(Address from, Address to) {
+ base::LockGuard<base::Mutex> guard(&logger_mutex_);
Code* from_code = Code::cast(HeapObject::FromAddress(from));
JitCodeEvent event;
@@ -775,7 +785,6 @@
is_logging_(false),
log_(new Log(this)),
perf_basic_logger_(NULL),
- perf_jit_logger_(NULL),
ll_logger_(NULL),
jit_logger_(NULL),
listeners_(5),
@@ -874,34 +883,16 @@
}
-void Logger::ApiNamedSecurityCheck(Object* key) {
+void Logger::ApiSecurityCheck() {
if (!log_->IsEnabled() || !FLAG_log_api) return;
- if (key->IsString()) {
- SmartArrayPointer<char> str =
- String::cast(key)->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL);
- ApiEvent("api,check-security,\"%s\"", str.get());
- } else if (key->IsSymbol()) {
- Symbol* symbol = Symbol::cast(key);
- if (symbol->name()->IsUndefined()) {
- ApiEvent("api,check-security,symbol(hash %x)", Symbol::cast(key)->Hash());
- } else {
- SmartArrayPointer<char> str = String::cast(symbol->name())->ToCString(
- DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL);
- ApiEvent("api,check-security,symbol(\"%s\" hash %x)", str.get(),
- Symbol::cast(key)->Hash());
- }
- } else if (key->IsUndefined()) {
- ApiEvent("api,check-security,undefined");
- } else {
- ApiEvent("api,check-security,['no-name']");
- }
+ ApiEvent("api,check-security");
}
void Logger::SharedLibraryEvent(const std::string& library_path,
uintptr_t start,
uintptr_t end) {
- if (!log_->IsEnabled() || !FLAG_prof) return;
+ if (!log_->IsEnabled() || !FLAG_prof_cpp) return;
Log::MessageBuilder msg(log_);
msg.Append("shared-library,\"%s\",0x%08" V8PRIxPTR ",0x%08" V8PRIxPTR,
library_path.c_str(), start, end);
@@ -909,9 +900,9 @@
}
-void Logger::CodeDeoptEvent(Code* code) {
- if (!log_->IsEnabled()) return;
- DCHECK(FLAG_log_internal_timer_events);
+void Logger::CodeDeoptEvent(Code* code, Address pc, int fp_to_sp_delta) {
+ PROFILER_LOG(CodeDeoptEvent(code, pc, fp_to_sp_delta));
+ if (!log_->IsEnabled() || !FLAG_log_internal_timer_events) return;
Log::MessageBuilder msg(log_);
int since_epoch = static_cast<int>(timer_.Elapsed().InMicroseconds());
msg.Append("code-deopt,%ld,%d", since_epoch, code->CodeSize());
@@ -921,7 +912,7 @@
void Logger::CurrentTimeEvent() {
if (!log_->IsEnabled()) return;
- DCHECK(FLAG_log_internal_timer_events);
+ DCHECK(FLAG_log_timer_events || FLAG_prof_cpp);
Log::MessageBuilder msg(log_);
int since_epoch = static_cast<int>(timer_.Elapsed().InMicroseconds());
msg.Append("current-time,%ld", since_epoch);
@@ -970,78 +961,73 @@
#undef V
-void Logger::LogRegExpSource(Handle<JSRegExp> regexp) {
+namespace {
+// Emits the source code of a regexp. Used by regexp events.
+void LogRegExpSource(Handle<JSRegExp> regexp, Isolate* isolate,
+ Log::MessageBuilder* msg) {
// Prints "/" + re.source + "/" +
// (re.global?"g":"") + (re.ignorecase?"i":"") + (re.multiline?"m":"")
- Log::MessageBuilder msg(log_);
- Handle<Object> source = Object::GetProperty(
- isolate_, regexp, "source").ToHandleChecked();
+ Handle<Object> source =
+ Object::GetProperty(isolate, regexp, "source").ToHandleChecked();
if (!source->IsString()) {
- msg.Append("no source");
+ msg->Append("no source");
return;
}
switch (regexp->TypeTag()) {
case JSRegExp::ATOM:
- msg.Append('a');
+ msg->Append('a');
break;
default:
break;
}
- msg.Append('/');
- msg.AppendDetailed(*Handle<String>::cast(source), false);
- msg.Append('/');
+ msg->Append('/');
+ msg->AppendDetailed(*Handle<String>::cast(source), false);
+ msg->Append('/');
// global flag
- Handle<Object> global = Object::GetProperty(
- isolate_, regexp, "global").ToHandleChecked();
+ Handle<Object> global =
+ Object::GetProperty(isolate, regexp, "global").ToHandleChecked();
if (global->IsTrue()) {
- msg.Append('g');
+ msg->Append('g');
}
// ignorecase flag
- Handle<Object> ignorecase = Object::GetProperty(
- isolate_, regexp, "ignoreCase").ToHandleChecked();
+ Handle<Object> ignorecase =
+ Object::GetProperty(isolate, regexp, "ignoreCase").ToHandleChecked();
if (ignorecase->IsTrue()) {
- msg.Append('i');
+ msg->Append('i');
}
// multiline flag
- Handle<Object> multiline = Object::GetProperty(
- isolate_, regexp, "multiline").ToHandleChecked();
+ Handle<Object> multiline =
+ Object::GetProperty(isolate, regexp, "multiline").ToHandleChecked();
if (multiline->IsTrue()) {
- msg.Append('m');
+ msg->Append('m');
}
-
- msg.WriteToLogFile();
}
+} // namespace
void Logger::RegExpCompileEvent(Handle<JSRegExp> regexp, bool in_cache) {
if (!log_->IsEnabled() || !FLAG_log_regexp) return;
Log::MessageBuilder msg(log_);
msg.Append("regexp-compile,");
- LogRegExpSource(regexp);
+ LogRegExpSource(regexp, isolate_, &msg);
msg.Append(in_cache ? ",hit" : ",miss");
msg.WriteToLogFile();
}
-void Logger::ApiIndexedSecurityCheck(uint32_t index) {
- if (!log_->IsEnabled() || !FLAG_log_api) return;
- ApiEvent("api,check-security,%u", index);
-}
-
-
void Logger::ApiNamedPropertyAccess(const char* tag,
JSObject* holder,
Object* name) {
DCHECK(name->IsName());
if (!log_->IsEnabled() || !FLAG_log_api) return;
String* class_name_obj = holder->class_name();
- SmartArrayPointer<char> class_name =
+ base::SmartArrayPointer<char> class_name =
class_name_obj->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL);
if (name->IsString()) {
- SmartArrayPointer<char> property_name =
+ base::SmartArrayPointer<char> property_name =
String::cast(name)->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL);
ApiEvent("api,%s,\"%s\",\"%s\"", tag, class_name.get(),
property_name.get());
@@ -1051,8 +1037,9 @@
if (symbol->name()->IsUndefined()) {
ApiEvent("api,%s,\"%s\",symbol(hash %x)", tag, class_name.get(), hash);
} else {
- SmartArrayPointer<char> str = String::cast(symbol->name())->ToCString(
- DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL);
+ base::SmartArrayPointer<char> str =
+ String::cast(symbol->name())
+ ->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL);
ApiEvent("api,%s,\"%s\",symbol(\"%s\" hash %x)", tag, class_name.get(),
str.get(), hash);
}
@@ -1064,7 +1051,7 @@
uint32_t index) {
if (!log_->IsEnabled() || !FLAG_log_api) return;
String* class_name_obj = holder->class_name();
- SmartArrayPointer<char> class_name =
+ base::SmartArrayPointer<char> class_name =
class_name_obj->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL);
ApiEvent("api,%s,\"%s\",%u", tag, class_name.get(), index);
}
@@ -1073,7 +1060,7 @@
void Logger::ApiObjectAccess(const char* tag, JSObject* object) {
if (!log_->IsEnabled() || !FLAG_log_api) return;
String* class_name_obj = object->class_name();
- SmartArrayPointer<char> class_name =
+ base::SmartArrayPointer<char> class_name =
class_name_obj->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL);
ApiEvent("api,%s,\"%s\"", tag, class_name.get());
}
@@ -1102,16 +1089,6 @@
}
-void Logger::NewEventStatic(const char* name, void* object, size_t size) {
- Isolate::Current()->logger()->NewEvent(name, object, size);
-}
-
-
-void Logger::DeleteEventStatic(const char* name, void* object) {
- Isolate::Current()->logger()->DeleteEvent(name, object);
-}
-
-
void Logger::CallbackEventInternal(const char* prefix, Name* name,
Address entry_point) {
if (!FLAG_log_code || !log_->IsEnabled()) return;
@@ -1121,7 +1098,7 @@
kLogEventsNames[CALLBACK_TAG]);
msg.AppendAddress(entry_point);
if (name->IsString()) {
- SmartArrayPointer<char> str =
+ base::SmartArrayPointer<char> str =
String::cast(name)->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL);
msg.Append(",1,\"%s%s\"", prefix, str.get());
} else {
@@ -1129,8 +1106,9 @@
if (symbol->name()->IsUndefined()) {
msg.Append(",1,symbol(hash %x)", prefix, symbol->Hash());
} else {
- SmartArrayPointer<char> str = String::cast(symbol->name())->ToCString(
- DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL);
+ base::SmartArrayPointer<char> str =
+ String::cast(symbol->name())
+ ->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL);
msg.Append(",1,symbol(\"%s\" hash %x)", prefix, str.get(),
symbol->Hash());
}
@@ -1224,7 +1202,7 @@
Log::MessageBuilder msg(log_);
AppendCodeCreateHeader(&msg, tag, code);
if (name->IsString()) {
- SmartArrayPointer<char> str =
+ base::SmartArrayPointer<char> str =
String::cast(name)->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL);
msg.Append("\"%s\"", str.get());
} else {
@@ -1232,7 +1210,7 @@
}
msg.Append(',');
msg.AppendAddress(shared->address());
- msg.Append(",%s", ComputeMarker(code));
+ msg.Append(",%s", ComputeMarker(shared, code));
msg.WriteToLogFile();
}
@@ -1254,19 +1232,19 @@
if (!FLAG_log_code || !log_->IsEnabled()) return;
Log::MessageBuilder msg(log_);
AppendCodeCreateHeader(&msg, tag, code);
- SmartArrayPointer<char> name =
+ base::SmartArrayPointer<char> name =
shared->DebugName()->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL);
msg.Append("\"%s ", name.get());
if (source->IsString()) {
- SmartArrayPointer<char> sourcestr =
- String::cast(source)->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL);
+ base::SmartArrayPointer<char> sourcestr = String::cast(source)->ToCString(
+ DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL);
msg.Append("%s", sourcestr.get());
} else {
msg.AppendSymbolName(Symbol::cast(source));
}
msg.Append(":%d:%d\",", line, column);
msg.AppendAddress(shared->address());
- msg.Append(",%s", ComputeMarker(code));
+ msg.Append(",%s", ComputeMarker(shared, code));
msg.WriteToLogFile();
}
@@ -1297,7 +1275,7 @@
if (!FLAG_log_code || !log_->IsEnabled()) return;
Log::MessageBuilder msg(log_);
msg.Append("%s,", kLogEventsNames[CODE_DISABLE_OPT_EVENT]);
- SmartArrayPointer<char> name =
+ base::SmartArrayPointer<char> name =
shared->DebugName()->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL);
msg.Append("\"%s\",", name.get());
msg.Append("\"%s\"", GetBailoutReason(shared->disable_optimization_reason()));
@@ -1409,8 +1387,6 @@
void Logger::SharedFunctionInfoMoveEvent(Address from, Address to) {
- PROFILER_LOG(SharedFunctionInfoMoveEvent(from, to));
-
if (!is_logging_code_events()) return;
MoveEventInternal(SHARED_FUNC_MOVE_EVENT, from, to);
}
@@ -1514,14 +1490,18 @@
void Logger::TickEvent(TickSample* sample, bool overflow) {
- if (!log_->IsEnabled() || !FLAG_prof) return;
+ if (!log_->IsEnabled() || !FLAG_prof_cpp) return;
Log::MessageBuilder msg(log_);
msg.Append("%s,", kLogEventsNames[TICK_EVENT]);
msg.AppendAddress(sample->pc);
msg.Append(",%ld", static_cast<int>(timer_.Elapsed().InMicroseconds()));
if (sample->has_external_callback) {
msg.Append(",1,");
+#if USES_FUNCTION_DESCRIPTORS
+ msg.AppendAddress(*FUNCTION_ENTRYPOINT_ADDRESS(sample->external_callback));
+#else
msg.AppendAddress(sample->external_callback);
+#endif
} else {
msg.Append(",0,");
msg.AppendAddress(sample->tos);
@@ -1634,8 +1614,7 @@
case Code::COMPARE_NIL_IC: // fall through
case Code::TO_BOOLEAN_IC: // fall through
case Code::STUB:
- description =
- CodeStub::MajorName(CodeStub::GetMajorKey(code_object), true);
+ description = CodeStub::MajorName(CodeStub::GetMajorKey(code_object));
if (description == NULL)
description = "A stub from the snapshot";
tag = Logger::STUB_TAG;
@@ -1645,7 +1624,7 @@
tag = Logger::REG_EXP_TAG;
break;
case Code::BUILTIN:
- description = "A builtin from the snapshot";
+ description = isolate_->builtins()->name(code_object->builtin_index());
tag = Logger::BUILTIN_TAG;
break;
case Code::HANDLER:
@@ -1672,6 +1651,10 @@
description = "A keyed store IC from the snapshot";
tag = Logger::KEYED_STORE_IC_TAG;
break;
+ case Code::WASM_FUNCTION:
+ description = "A wasm function";
+ tag = Logger::STUB_TAG;
+ break;
case Code::NUMBER_OF_KINDS:
break;
}
@@ -1790,8 +1773,16 @@
static void PrepareLogFileName(std::ostream& os, // NOLINT
Isolate* isolate, const char* file_name) {
- AddIsolateIdIfNeeded(os, isolate);
+ int dir_separator_count = 0;
for (const char* p = file_name; *p; p++) {
+ if (base::OS::isDirectorySeparator(*p)) dir_separator_count++;
+ }
+
+ for (const char* p = file_name; *p; p++) {
+ if (dir_separator_count == 0) {
+ AddIsolateIdIfNeeded(os, isolate);
+ dir_separator_count--;
+ }
if (*p == '%') {
p++;
switch (*p) {
@@ -1817,6 +1808,7 @@
break;
}
} else {
+ if (base::OS::isDirectorySeparator(*p)) dir_separator_count--;
os << *p;
}
}
@@ -1843,11 +1835,6 @@
addCodeEventListener(perf_basic_logger_);
}
- if (FLAG_perf_jit_prof) {
- perf_jit_logger_ = new PerfJitLogger();
- addCodeEventListener(perf_jit_logger_);
- }
-
if (FLAG_ll_prof) {
ll_logger_ = new LowLevelLogger(log_file_name.str().c_str());
addCodeEventListener(ll_logger_);
@@ -1859,9 +1846,9 @@
is_logging_ = true;
}
- if (FLAG_log_internal_timer_events || FLAG_prof) timer_.Start();
+ if (FLAG_log_internal_timer_events || FLAG_prof_cpp) timer_.Start();
- if (FLAG_prof) {
+ if (FLAG_prof_cpp) {
profiler_ = new Profiler(isolate);
is_logging_ = true;
profiler_->Engage();
@@ -1916,12 +1903,6 @@
perf_basic_logger_ = NULL;
}
- if (perf_jit_logger_) {
- removeCodeEventListener(perf_jit_logger_);
- delete perf_jit_logger_;
- perf_jit_logger_ = NULL;
- }
-
if (ll_logger_) {
removeCodeEventListener(ll_logger_);
delete ll_logger_;
@@ -1937,4 +1918,5 @@
return log_->Close();
}
-} } // namespace v8::internal
+} // namespace internal
+} // namespace v8