aea3ce3df3
TypeFeedbackVectors are strongly rooted by a closure. However, in modern JavaScript closures are created and abandoned more freely. An important closure may not be present in the root-set at time of garbage collection, even though we've cached optimized code and use it regularly. For example, consider leaf functions in an event dispatching system. They may well be "hot," but tragically non-present when we collect the heap. Until now, we've relied on a weak root to cache the feedback vector in this case. Since there is no way to signal intent or relative importance, this weak root is as susceptible to clearing as any other weak root at garbage collection time. Meanwhile, the feedback vector has become more important. All of our ICs store their data there. Literal and regex boilerplates are stored there. If we lose the vector, then we not only lose optimized code built from it, we also lose the very feedback which allowed us to create that optimized code. Therefore it's vital to express that dependency through the root set. This CL does this by creating a strong link to a feedback vector at the instantiation site of the function closure. This instantiation site is in the code and feedback vector of the outer closure. BUG=v8:5456 Review-Url: https://codereview.chromium.org/2674593003 Cr-Commit-Position: refs/heads/master@{#42953}
128 lines
2.8 KiB
Plaintext
128 lines
2.8 KiB
Plaintext
# Copyright 2014 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.
|
|
|
|
# Print HeapObjects.
|
|
define job
|
|
call _v8_internal_Print_Object((void*)($arg0))
|
|
end
|
|
document job
|
|
Print a v8 JavaScript object
|
|
Usage: job tagged_ptr
|
|
end
|
|
|
|
# Print v8::Local handle value.
|
|
define jlh
|
|
call _v8_internal_Print_Object(*(v8::internal::Object**)(*$arg0))
|
|
end
|
|
document jlh
|
|
Print content of a v8::Local handle
|
|
Usage: jlh local_handle
|
|
end
|
|
|
|
# Print Code objects containing given PC.
|
|
define jco
|
|
call _v8_internal_Print_Code((void*)($arg0))
|
|
end
|
|
document jco
|
|
Print a v8 Code object from an internal code address
|
|
Usage: jco pc
|
|
end
|
|
|
|
# Print TypeFeedbackVector
|
|
define jfv
|
|
call _v8_internal_Print_TypeFeedbackVector((void*)($arg0))
|
|
end
|
|
document jfv
|
|
Print a v8 TypeFeedbackVector object
|
|
Usage: jtv tagged_ptr
|
|
end
|
|
|
|
# Print TypeFeedbackMetadata
|
|
define jfm
|
|
call _v8_internal_Print_TypeFeedbackMetadata((void*)($arg0))
|
|
end
|
|
document jfm
|
|
Print a v8 TypeFeedbackMetadata object
|
|
Usage: jtm tagged_ptr
|
|
end
|
|
|
|
|
|
# Print DescriptorArray.
|
|
define jda
|
|
call _v8_internal_Print_DescriptorArray((void*)($arg0))
|
|
end
|
|
document jda
|
|
Print a v8 DescriptorArray object
|
|
Usage: jda tagged_ptr
|
|
end
|
|
|
|
# Print LayoutDescriptor.
|
|
define jld
|
|
call _v8_internal_Print_LayoutDescriptor((void*)($arg0))
|
|
end
|
|
document jld
|
|
Print a v8 LayoutDescriptor object
|
|
Usage: jld tagged_ptr
|
|
end
|
|
|
|
# Print TransitionArray.
|
|
define jta
|
|
call _v8_internal_Print_TransitionArray((void*)($arg0))
|
|
end
|
|
document jta
|
|
Print a v8 TransitionArray object
|
|
Usage: jta tagged_ptr
|
|
end
|
|
|
|
# Print JavaScript stack trace.
|
|
define jst
|
|
call _v8_internal_Print_StackTrace()
|
|
end
|
|
document jst
|
|
Print the current JavaScript stack trace
|
|
Usage: jst
|
|
end
|
|
|
|
# Skip the JavaScript stack.
|
|
define jss
|
|
set $js_entry_sp=v8::internal::Isolate::Current()->thread_local_top()->js_entry_sp_
|
|
set $rbp=*(void**)$js_entry_sp
|
|
set $rsp=$js_entry_sp + 2*sizeof(void*)
|
|
set $pc=*(void**)($js_entry_sp+sizeof(void*))
|
|
end
|
|
document jss
|
|
Skip the jitted stack on x64 to where we entered JS last.
|
|
Usage: jss
|
|
end
|
|
|
|
# Print stack trace with assertion scopes.
|
|
define bta
|
|
python
|
|
import re
|
|
frame_re = re.compile("^#(\d+)\s*(?:0x[a-f\d]+ in )?(.+) \(.+ at (.+)")
|
|
assert_re = re.compile("^\s*(\S+) = .+<v8::internal::Per\w+AssertType::(\w+)_ASSERT, (false|true)>")
|
|
btl = gdb.execute("backtrace full", to_string = True).splitlines()
|
|
for l in btl:
|
|
match = frame_re.match(l)
|
|
if match:
|
|
print("[%-2s] %-60s %-40s" % (match.group(1), match.group(2), match.group(3)))
|
|
match = assert_re.match(l)
|
|
if match:
|
|
if match.group(3) == "false":
|
|
prefix = "Disallow"
|
|
color = "\033[91m"
|
|
else:
|
|
prefix = "Allow"
|
|
color = "\033[92m"
|
|
print("%s -> %s %s (%s)\033[0m" % (color, prefix, match.group(2), match.group(1)))
|
|
end
|
|
end
|
|
document bta
|
|
Print stack trace with assertion scopes
|
|
Usage: bta
|
|
end
|
|
|
|
set disassembly-flavor intel
|
|
set disable-randomization off
|