Merge v11.2. Last aurora commit: 053e54e7
# Conflicts: #include/v8-cppgc.h (reverted v8 changes, keeping our fix. again, doesn't resolve msvc build issues. this does not fix the issue properly. xref:4c7c7d1a
) #src/codegen/cpu-features.h (...did something change?) #src/flags/flag-definitions.h (xref:053e54e7
) #src/heap/safepoint.cc [-] (USE AFTER FREE) quick hack: removing a mutex guard on shared RemoveClient to temporarily mitigate a crash on deinit well, this is fucking dumb. i think someone at google also figured out this can lead to crashing. their solution: remove the mutex with a call to AssertActive. considering my issue was related to a dead context with everything else alive, i dont want to find out what that AssertActive is doing. reverting v8 change. #src/objects/fixed-array-inl.h who cares
This commit is contained in:
commit
7c5992067e
@ -18,11 +18,106 @@
|
|||||||
# - Because you must use a hash, you need to append to this list in a follow-up
|
# - Because you must use a hash, you need to append to this list in a follow-up
|
||||||
# CL to the actual reformatting CL that you are trying to ignore.
|
# CL to the actual reformatting CL that you are trying to ignore.
|
||||||
|
|
||||||
|
# objects.h splitting
|
||||||
|
0604031eb1d01c52b6c1c9ae3012d80b23d74a68
|
||||||
|
09e405453359000d66cc0faaa102854e626bebeb
|
||||||
|
766ef168fbcac6bd0728cc2c9bb3ae7cbd74278a
|
||||||
|
b5a2839b927be04bdb50a236071c11764e4d6400
|
||||||
|
c911f91b5b6219e038c0117b05a8375bdf3db0b0
|
||||||
|
1bb48bf91ba8c887884a0fbd674c91f64964d8a5
|
||||||
|
19da9f24df7b59fec72b9dd8a979ad0ce5639c87
|
||||||
|
b090d7e7468236ffce0afdb55bb496bf0073f2ee
|
||||||
|
f40638d148b7a435522d5b714993908061e3b10d
|
||||||
|
e8a1c25f6afae9b77921abb70fad49da252eb6f0
|
||||||
|
6fa8283d0e031c9585d190f751907ed45bf85de0
|
||||||
|
9aa861c4bcfed612039259f93c2cd2b01337e99e
|
||||||
|
8175648018bd9f70af866f9fa433f1d79644d86b
|
||||||
|
c7b1ceb801ec7f639a093468d8e6424212cc197c
|
||||||
|
e39d2cbe1b1baa6513ddce2d73c981e335cc34fb
|
||||||
|
eda00a5c499b7a83479115eb275a816b8a2ed104
|
||||||
|
68deca9b418976ca8b3375e81058a9e0a815357f
|
||||||
|
0525e17847f39f80e3fd163021a58f68d8fcaf06
|
||||||
|
81a3c699d6eef936452ac3d10c7c59a2c1e38c0c
|
||||||
|
01452bedfca2b5447a7f62bda87edbbb76259a6e
|
||||||
|
1baf1050113a5418696839c273e05ea5ad1b5c4d
|
||||||
|
4b39fe3d608916b1cfea015de287511a1623fc7f
|
||||||
|
c6effdbba9b301244475553538f6eb1b3d9670b9
|
||||||
|
71e4c573199466ea4541e3d6b307c9b33d7bb785
|
||||||
|
efc92f0d4aa77bb90f5b56606b6f0d0819fba4af
|
||||||
|
a9db2c74b5bae2345ac52be404748954a3b5050d
|
||||||
|
0a01b6202226bbe99c0b83acf6c5a80344f5fb6a
|
||||||
|
a6c44361c8f2dc07b935e3f2bb3e0d3ad4f4a383
|
||||||
|
10d8aab1de430695a69e9d75af6ea42c2cdc9d6d
|
||||||
|
dd3c4fca2f0a2761b8b95cd47fcd62836d714890
|
||||||
|
e9c932233980866074025e65051003d1f298516c
|
||||||
|
2b1f79881c3f0b69bfb9274bda57ea50f7304982
|
||||||
|
7f031160d71a3d836667dc98288eaff4c94e6f56
|
||||||
|
490fabb4578f8a3c4096fdccff688c17ed5ed00d
|
||||||
|
d953b2ab726acca0b3abe90ce090a16d7ccc2ae3
|
||||||
|
bb514c426b9438cfb1149d219ac4ec2d8d1c8458
|
||||||
|
dfb453d713d8a05e76f720a6aae2871eec210276
|
||||||
|
b490fd66b873c89fca37b21eab58502b6367a864
|
||||||
|
9a71683d9c8ff9470eda6be5b2b11babac7b9863
|
||||||
|
37945f731c4d800ef788e3c32f8663773a93450e
|
||||||
|
b90c98fc29a8d896354de4a22c055f6d98376171
|
||||||
|
35f3e9d0e654e84646a0b98f29e4a2786cdca4b1
|
||||||
|
260eb5bb9b62ea3d5fa6ad0b0e8c2de75d48bad4
|
||||||
|
cc2c11441ce352360acce8638a19f58edf361f7d
|
||||||
|
7be0159e4b1e0b064e215ae4ced34d649cb2552e
|
||||||
|
95a7cfe0eaabbcff0f730ed60e1805779f6cfe41
|
||||||
|
8f54d18ba4ad10770e9537a2803459feccfe79a3
|
||||||
|
f44759d9ff52a3e5563e5f2bb23ee2c08222fcfd
|
||||||
|
09050c8a967f5f2956305e5d016b304d7bf5e669
|
||||||
|
c769745d5856a7eb3a0dbe6af5376c7638944364
|
||||||
|
a1547aa914aeedd7862f74124c18d2bbaf432c36
|
||||||
|
5f950698c0dc7c36b855961feb929022f74102fb
|
||||||
|
4aedeb1bd50c12ebcd6cf954c4cbef1205fff5ac
|
||||||
|
7366d8954cb1bd277d3283241da2fae62b886c48
|
||||||
|
bc35251f5e55a65c3a4acf7cba52cee505c86a46
|
||||||
|
4fb60b215801db70c694a799e735b64bfead59bb
|
||||||
|
03762b8488de0e393077e3f40fe7b63e675b3af3
|
||||||
|
a8a45d875f0a98b192cf0063ceda12aaf75ddfaf
|
||||||
|
a48e5ab8804e9e97b5ea577d6f2667bacee92eb2
|
||||||
|
|
||||||
# Update of quotations in DEPS file.
|
# Update of quotations in DEPS file.
|
||||||
e50b49a0e38b34e2b28e026f4d1c7e0da0c7bb1a
|
e50b49a0e38b34e2b28e026f4d1c7e0da0c7bb1a
|
||||||
|
|
||||||
# Rewrite code base to use "." instead of "->" to access Object members.
|
# Rewrite code base to use "." instead of "->" to access Object members.
|
||||||
878ccb33bd3cf0e6dc018ff8d15843f585ac07be
|
878ccb33bd3cf0e6dc018ff8d15843f585ac07be
|
||||||
|
|
||||||
|
# Splitting src/ into subfolders
|
||||||
|
632239011db501e76475d82ff6492f37fa8c1edc
|
||||||
|
f455f86d899716df3b9550950ce172f5b867619a
|
||||||
|
24a51e1eee4e286165dd0bba6afb4c35e8177a25
|
||||||
|
f9a88acbc928f0fc5e9a3acbcd3b4ece52355f3d
|
||||||
|
dec3298d9cfbe95759774a0e00302a08836b5f3d
|
||||||
|
a0c3797461810e3159662851e64946e17654236e
|
||||||
|
b72941e8b0d2843adf768442024d8950da798db1
|
||||||
|
4c986c625f19e35c95f3492c662822f4695218b4
|
||||||
|
0fa243af7096ee5b748b194476be2e4efecaec59
|
||||||
|
786ce26341b7ab11b4d42f1c77202530d5138ad2
|
||||||
|
a6eeea35cb7ff0c29b6cfdd1c786f382110241ce
|
||||||
|
be014256adea1552d4a044ef80616cdab6a7d549
|
||||||
|
93d3b7173fec7d010539057cdbd78d497f09fa9b
|
||||||
|
5bfe84a0dab60289b3470c080908ce83ac2212d4
|
||||||
|
a7695520556665ba73ab02c497ab73b162a5fb13
|
||||||
|
61523c45a335fe3be76498e0b16bf8e7aec0d058
|
||||||
|
bf372a73d8a5f4029fc9f4f69b675ef0cad80ada
|
||||||
|
8ad6b335376c6275ffb3361c662a1a45c853f4fc
|
||||||
|
06bf8261cf2c94fc071652652600b5790f719c05
|
||||||
|
81a0102fe8586071cc68e9595b26c5c1207ee5b3
|
||||||
|
5f28539599f6a6a265e18b8c897cc96ccbeec9c4
|
||||||
|
3253767622a784866dc34aeb7b5d0f02ebdff61e
|
||||||
|
9ac8b20086f95f1158a1901eefe12e25fd0333e4
|
||||||
|
3cb560adfe26edb586a0e6e655e5a7c4755cad1a
|
||||||
|
7bbd0bfe5161d57bcf268716ce4d1ce14d6786e6
|
||||||
|
c39cabbcbea26891558b81fd2236c38a7aeada08
|
||||||
|
a3187716d31a0ab9d7051adde6be9bd2b2c6fec1
|
||||||
|
|
||||||
# Move test/mjsunit/regress-*.js => test/mjsunit/regress/
|
# Move test/mjsunit/regress-*.js => test/mjsunit/regress/
|
||||||
cb67be1a3842fcf6a0da18aee444e3b7ea789e04
|
cb67be1a3842fcf6a0da18aee444e3b7ea789e04
|
||||||
|
|
||||||
|
# [include] Split out v8.h
|
||||||
|
d1b27019d3bf86360ea838c317f8505fac6d3a7e
|
||||||
|
44fe02ced6e4c6b49d627807e3b3fd0edbbeb36e
|
||||||
|
ec06bb6ce5641cf65e400ec55b7421f87d04b999
|
||||||
|
1
.gitignore
vendored
1
.gitignore
vendored
@ -28,6 +28,7 @@
|
|||||||
.clangd
|
.clangd
|
||||||
.cpplint-cache
|
.cpplint-cache
|
||||||
.cproject
|
.cproject
|
||||||
|
.DS_Store
|
||||||
.gclient_entries
|
.gclient_entries
|
||||||
.gdb_history
|
.gdb_history
|
||||||
.idea
|
.idea
|
||||||
|
2
AUTHORS
2
AUTHORS
@ -153,6 +153,8 @@ Jiawen Geng <technicalcute@gmail.com>
|
|||||||
Jiaxun Yang <jiaxun.yang@flygoat.com>
|
Jiaxun Yang <jiaxun.yang@flygoat.com>
|
||||||
Joel Stanley <joel@jms.id.au>
|
Joel Stanley <joel@jms.id.au>
|
||||||
Johan Bergström <johan@bergstroem.nu>
|
Johan Bergström <johan@bergstroem.nu>
|
||||||
|
Johan Levin <johan13@gmail.com>
|
||||||
|
John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
|
||||||
Jonathan Liu <net147@gmail.com>
|
Jonathan Liu <net147@gmail.com>
|
||||||
Juan Arboleda <soyjuanarbol@gmail.com>
|
Juan Arboleda <soyjuanarbol@gmail.com>
|
||||||
Julien Brianceau <jbriance@cisco.com>
|
Julien Brianceau <jbriance@cisco.com>
|
||||||
|
237
BUILD.bazel
237
BUILD.bazel
@ -16,7 +16,8 @@ load(
|
|||||||
"v8_library",
|
"v8_library",
|
||||||
"v8_mksnapshot",
|
"v8_mksnapshot",
|
||||||
"v8_string",
|
"v8_string",
|
||||||
"v8_torque",
|
"v8_torque_definitions",
|
||||||
|
"v8_torque_initializers",
|
||||||
)
|
)
|
||||||
load(":bazel/v8-non-pointer-compression.bzl", "v8_binary_non_pointer_compression")
|
load(":bazel/v8-non-pointer-compression.bzl", "v8_binary_non_pointer_compression")
|
||||||
|
|
||||||
@ -68,6 +69,7 @@ load(":bazel/v8-non-pointer-compression.bzl", "v8_binary_non_pointer_compression
|
|||||||
# v8_enable_sandbox
|
# v8_enable_sandbox
|
||||||
# cppgc_enable_caged_heap
|
# cppgc_enable_caged_heap
|
||||||
# cppgc_enable_check_assignments_in_prefinalizers
|
# cppgc_enable_check_assignments_in_prefinalizers
|
||||||
|
# cppgc_enable_slim_write_barrier
|
||||||
# cppgc_enable_object_names
|
# cppgc_enable_object_names
|
||||||
# cppgc_enable_pointer_compression
|
# cppgc_enable_pointer_compression
|
||||||
# cppgc_enable_verify_heap
|
# cppgc_enable_verify_heap
|
||||||
@ -146,6 +148,11 @@ v8_flag(name = "v8_enable_verify_predictable")
|
|||||||
|
|
||||||
v8_flag(name = "v8_enable_test_features")
|
v8_flag(name = "v8_enable_test_features")
|
||||||
|
|
||||||
|
v8_flag(
|
||||||
|
name = "v8_enable_turbofan",
|
||||||
|
default = True,
|
||||||
|
)
|
||||||
|
|
||||||
v8_flag(
|
v8_flag(
|
||||||
name = "v8_enable_webassembly",
|
name = "v8_enable_webassembly",
|
||||||
default = True,
|
default = True,
|
||||||
@ -320,6 +327,7 @@ v8_config(
|
|||||||
"v8_enable_snapshot_native_code_counters": "V8_SNAPSHOT_NATIVE_CODE_COUNTERS",
|
"v8_enable_snapshot_native_code_counters": "V8_SNAPSHOT_NATIVE_CODE_COUNTERS",
|
||||||
"v8_enable_static_roots": "V8_STATIC_ROOTS",
|
"v8_enable_static_roots": "V8_STATIC_ROOTS",
|
||||||
"v8_enable_trace_maps": "V8_TRACE_MAPS",
|
"v8_enable_trace_maps": "V8_TRACE_MAPS",
|
||||||
|
"v8_enable_turbofan": "V8_ENABLE_TURBOFAN",
|
||||||
"v8_enable_v8_checks": "V8_ENABLE_CHECKS",
|
"v8_enable_v8_checks": "V8_ENABLE_CHECKS",
|
||||||
"v8_enable_verify_csa": "ENABLE_VERIFY_CSA",
|
"v8_enable_verify_csa": "ENABLE_VERIFY_CSA",
|
||||||
"v8_enable_verify_heap": "VERIFY_HEAP",
|
"v8_enable_verify_heap": "VERIFY_HEAP",
|
||||||
@ -861,6 +869,7 @@ filegroup(
|
|||||||
"src/builtins/string-html.tq",
|
"src/builtins/string-html.tq",
|
||||||
"src/builtins/string-includes.tq",
|
"src/builtins/string-includes.tq",
|
||||||
"src/builtins/string-indexof.tq",
|
"src/builtins/string-indexof.tq",
|
||||||
|
"src/builtins/string-iswellformed.tq",
|
||||||
"src/builtins/string-iterator.tq",
|
"src/builtins/string-iterator.tq",
|
||||||
"src/builtins/string-match-search.tq",
|
"src/builtins/string-match-search.tq",
|
||||||
"src/builtins/string-pad.tq",
|
"src/builtins/string-pad.tq",
|
||||||
@ -870,6 +879,7 @@ filegroup(
|
|||||||
"src/builtins/string-startswith.tq",
|
"src/builtins/string-startswith.tq",
|
||||||
"src/builtins/string-substr.tq",
|
"src/builtins/string-substr.tq",
|
||||||
"src/builtins/string-substring.tq",
|
"src/builtins/string-substring.tq",
|
||||||
|
"src/builtins/string-towellformed.tq",
|
||||||
"src/builtins/string-trim.tq",
|
"src/builtins/string-trim.tq",
|
||||||
"src/builtins/symbol.tq",
|
"src/builtins/symbol.tq",
|
||||||
"src/builtins/torque-internal.tq",
|
"src/builtins/torque-internal.tq",
|
||||||
@ -1155,7 +1165,6 @@ filegroup(
|
|||||||
"src/builtins/builtins-utils-inl.h",
|
"src/builtins/builtins-utils-inl.h",
|
||||||
"src/builtins/builtins-utils.h",
|
"src/builtins/builtins-utils.h",
|
||||||
"src/builtins/builtins-weak-refs.cc",
|
"src/builtins/builtins-weak-refs.cc",
|
||||||
"src/builtins/builtins-web-snapshots.cc",
|
|
||||||
"src/builtins/builtins.cc",
|
"src/builtins/builtins.cc",
|
||||||
"src/builtins/builtins.h",
|
"src/builtins/builtins.h",
|
||||||
"src/builtins/constants-table-builder.cc",
|
"src/builtins/constants-table-builder.cc",
|
||||||
@ -1254,6 +1263,7 @@ filegroup(
|
|||||||
"src/compiler-dispatcher/lazy-compile-dispatcher.h",
|
"src/compiler-dispatcher/lazy-compile-dispatcher.h",
|
||||||
"src/compiler-dispatcher/optimizing-compile-dispatcher.cc",
|
"src/compiler-dispatcher/optimizing-compile-dispatcher.cc",
|
||||||
"src/compiler-dispatcher/optimizing-compile-dispatcher.h",
|
"src/compiler-dispatcher/optimizing-compile-dispatcher.h",
|
||||||
|
"src/compiler/turbofan.h",
|
||||||
"src/date/date.cc",
|
"src/date/date.cc",
|
||||||
"src/date/date.h",
|
"src/date/date.h",
|
||||||
"src/date/dateparser-inl.h",
|
"src/date/dateparser-inl.h",
|
||||||
@ -1442,9 +1452,8 @@ filegroup(
|
|||||||
"src/heap/cppgc-js/unified-heap-marking-verifier.h",
|
"src/heap/cppgc-js/unified-heap-marking-verifier.h",
|
||||||
"src/heap/cppgc-js/unified-heap-marking-visitor.cc",
|
"src/heap/cppgc-js/unified-heap-marking-visitor.cc",
|
||||||
"src/heap/cppgc-js/unified-heap-marking-visitor.h",
|
"src/heap/cppgc-js/unified-heap-marking-visitor.h",
|
||||||
"src/heap/embedder-tracing.cc",
|
"src/heap/cppgc-js/wrappable-info.h",
|
||||||
"src/heap/embedder-tracing.h",
|
"src/heap/cppgc-js/wrappable-info-inl.h",
|
||||||
"src/heap/embedder-tracing-inl.h",
|
|
||||||
"src/heap/evacuation-verifier.cc",
|
"src/heap/evacuation-verifier.cc",
|
||||||
"src/heap/evacuation-verifier.h",
|
"src/heap/evacuation-verifier.h",
|
||||||
"src/heap/evacuation-verifier-inl.h",
|
"src/heap/evacuation-verifier-inl.h",
|
||||||
@ -1668,6 +1677,8 @@ filegroup(
|
|||||||
"src/numbers/conversions.cc",
|
"src/numbers/conversions.cc",
|
||||||
"src/numbers/conversions.h",
|
"src/numbers/conversions.h",
|
||||||
"src/numbers/hash-seed-inl.h",
|
"src/numbers/hash-seed-inl.h",
|
||||||
|
"src/numbers/integer-literal-inl.h",
|
||||||
|
"src/numbers/integer-literal.h",
|
||||||
"src/numbers/math-random.cc",
|
"src/numbers/math-random.cc",
|
||||||
"src/numbers/math-random.h",
|
"src/numbers/math-random.h",
|
||||||
"src/objects/all-objects-inl.h",
|
"src/objects/all-objects-inl.h",
|
||||||
@ -1783,6 +1794,7 @@ filegroup(
|
|||||||
"src/objects/js-shadow-realm-inl.h",
|
"src/objects/js-shadow-realm-inl.h",
|
||||||
"src/objects/js-shared-array.h",
|
"src/objects/js-shared-array.h",
|
||||||
"src/objects/js-shared-array-inl.h",
|
"src/objects/js-shared-array-inl.h",
|
||||||
|
"src/objects/js-struct.cc",
|
||||||
"src/objects/js-struct.h",
|
"src/objects/js-struct.h",
|
||||||
"src/objects/js-struct-inl.h",
|
"src/objects/js-struct-inl.h",
|
||||||
"src/objects/js-temporal-objects.h",
|
"src/objects/js-temporal-objects.h",
|
||||||
@ -2199,8 +2211,6 @@ filegroup(
|
|||||||
"src/utils/utils.h",
|
"src/utils/utils.h",
|
||||||
"src/utils/version.cc",
|
"src/utils/version.cc",
|
||||||
"src/utils/version.h",
|
"src/utils/version.h",
|
||||||
"src/web-snapshot/web-snapshot.h",
|
|
||||||
"src/web-snapshot/web-snapshot.cc",
|
|
||||||
"src/zone/accounting-allocator.cc",
|
"src/zone/accounting-allocator.cc",
|
||||||
"src/zone/accounting-allocator.h",
|
"src/zone/accounting-allocator.h",
|
||||||
"src/zone/compressed-zone-ptr.h",
|
"src/zone/compressed-zone-ptr.h",
|
||||||
@ -2242,10 +2252,6 @@ filegroup(
|
|||||||
"src/codegen/ia32/macro-assembler-ia32.h",
|
"src/codegen/ia32/macro-assembler-ia32.h",
|
||||||
"src/codegen/ia32/register-ia32.h",
|
"src/codegen/ia32/register-ia32.h",
|
||||||
"src/codegen/ia32/reglist-ia32.h",
|
"src/codegen/ia32/reglist-ia32.h",
|
||||||
"src/compiler/backend/ia32/code-generator-ia32.cc",
|
|
||||||
"src/compiler/backend/ia32/instruction-codes-ia32.h",
|
|
||||||
"src/compiler/backend/ia32/instruction-scheduler-ia32.cc",
|
|
||||||
"src/compiler/backend/ia32/instruction-selector-ia32.cc",
|
|
||||||
"src/deoptimizer/ia32/deoptimizer-ia32.cc",
|
"src/deoptimizer/ia32/deoptimizer-ia32.cc",
|
||||||
"src/diagnostics/ia32/disasm-ia32.cc",
|
"src/diagnostics/ia32/disasm-ia32.cc",
|
||||||
"src/diagnostics/ia32/unwinder-ia32.cc",
|
"src/diagnostics/ia32/unwinder-ia32.cc",
|
||||||
@ -2272,12 +2278,6 @@ filegroup(
|
|||||||
"src/codegen/x64/macro-assembler-x64.h",
|
"src/codegen/x64/macro-assembler-x64.h",
|
||||||
"src/codegen/x64/register-x64.h",
|
"src/codegen/x64/register-x64.h",
|
||||||
"src/codegen/x64/reglist-x64.h",
|
"src/codegen/x64/reglist-x64.h",
|
||||||
"src/compiler/backend/x64/code-generator-x64.cc",
|
|
||||||
"src/compiler/backend/x64/instruction-codes-x64.h",
|
|
||||||
"src/compiler/backend/x64/instruction-scheduler-x64.cc",
|
|
||||||
"src/compiler/backend/x64/instruction-selector-x64.cc",
|
|
||||||
"src/compiler/backend/x64/unwinding-info-writer-x64.cc",
|
|
||||||
"src/compiler/backend/x64/unwinding-info-writer-x64.h",
|
|
||||||
"src/deoptimizer/x64/deoptimizer-x64.cc",
|
"src/deoptimizer/x64/deoptimizer-x64.cc",
|
||||||
"src/diagnostics/x64/disasm-x64.cc",
|
"src/diagnostics/x64/disasm-x64.cc",
|
||||||
"src/diagnostics/x64/eh-frame-x64.cc",
|
"src/diagnostics/x64/eh-frame-x64.cc",
|
||||||
@ -2302,12 +2302,6 @@ filegroup(
|
|||||||
"src/codegen/arm/macro-assembler-arm.h",
|
"src/codegen/arm/macro-assembler-arm.h",
|
||||||
"src/codegen/arm/register-arm.h",
|
"src/codegen/arm/register-arm.h",
|
||||||
"src/codegen/arm/reglist-arm.h",
|
"src/codegen/arm/reglist-arm.h",
|
||||||
"src/compiler/backend/arm/code-generator-arm.cc",
|
|
||||||
"src/compiler/backend/arm/instruction-codes-arm.h",
|
|
||||||
"src/compiler/backend/arm/instruction-scheduler-arm.cc",
|
|
||||||
"src/compiler/backend/arm/instruction-selector-arm.cc",
|
|
||||||
"src/compiler/backend/arm/unwinding-info-writer-arm.cc",
|
|
||||||
"src/compiler/backend/arm/unwinding-info-writer-arm.h",
|
|
||||||
"src/deoptimizer/arm/deoptimizer-arm.cc",
|
"src/deoptimizer/arm/deoptimizer-arm.cc",
|
||||||
"src/diagnostics/arm/disasm-arm.cc",
|
"src/diagnostics/arm/disasm-arm.cc",
|
||||||
"src/diagnostics/arm/eh-frame-arm.cc",
|
"src/diagnostics/arm/eh-frame-arm.cc",
|
||||||
@ -2343,12 +2337,6 @@ filegroup(
|
|||||||
"src/codegen/arm64/reglist-arm64.h",
|
"src/codegen/arm64/reglist-arm64.h",
|
||||||
"src/codegen/arm64/utils-arm64.cc",
|
"src/codegen/arm64/utils-arm64.cc",
|
||||||
"src/codegen/arm64/utils-arm64.h",
|
"src/codegen/arm64/utils-arm64.h",
|
||||||
"src/compiler/backend/arm64/code-generator-arm64.cc",
|
|
||||||
"src/compiler/backend/arm64/instruction-codes-arm64.h",
|
|
||||||
"src/compiler/backend/arm64/instruction-scheduler-arm64.cc",
|
|
||||||
"src/compiler/backend/arm64/instruction-selector-arm64.cc",
|
|
||||||
"src/compiler/backend/arm64/unwinding-info-writer-arm64.cc",
|
|
||||||
"src/compiler/backend/arm64/unwinding-info-writer-arm64.h",
|
|
||||||
"src/deoptimizer/arm64/deoptimizer-arm64.cc",
|
"src/deoptimizer/arm64/deoptimizer-arm64.cc",
|
||||||
"src/diagnostics/arm64/disasm-arm64.cc",
|
"src/diagnostics/arm64/disasm-arm64.cc",
|
||||||
"src/diagnostics/arm64/disasm-arm64.h",
|
"src/diagnostics/arm64/disasm-arm64.h",
|
||||||
@ -2378,12 +2366,6 @@ filegroup(
|
|||||||
"src/codegen/s390/macro-assembler-s390.h",
|
"src/codegen/s390/macro-assembler-s390.h",
|
||||||
"src/codegen/s390/register-s390.h",
|
"src/codegen/s390/register-s390.h",
|
||||||
"src/codegen/s390/reglist-s390.h",
|
"src/codegen/s390/reglist-s390.h",
|
||||||
"src/compiler/backend/s390/code-generator-s390.cc",
|
|
||||||
"src/compiler/backend/s390/instruction-codes-s390.h",
|
|
||||||
"src/compiler/backend/s390/instruction-scheduler-s390.cc",
|
|
||||||
"src/compiler/backend/s390/instruction-selector-s390.cc",
|
|
||||||
"src/compiler/backend/s390/unwinding-info-writer-s390.cc",
|
|
||||||
"src/compiler/backend/s390/unwinding-info-writer-s390.h",
|
|
||||||
"src/deoptimizer/s390/deoptimizer-s390.cc",
|
"src/deoptimizer/s390/deoptimizer-s390.cc",
|
||||||
"src/diagnostics/s390/disasm-s390.cc",
|
"src/diagnostics/s390/disasm-s390.cc",
|
||||||
"src/diagnostics/s390/eh-frame-s390.cc",
|
"src/diagnostics/s390/eh-frame-s390.cc",
|
||||||
@ -2410,10 +2392,6 @@ filegroup(
|
|||||||
"src/codegen/riscv64/macro-assembler-riscv64.h",
|
"src/codegen/riscv64/macro-assembler-riscv64.h",
|
||||||
"src/codegen/riscv64/register-riscv64.h",
|
"src/codegen/riscv64/register-riscv64.h",
|
||||||
"src/codegen/riscv64/reglist-riscv64.h",
|
"src/codegen/riscv64/reglist-riscv64.h",
|
||||||
"src/compiler/backend/riscv64/code-generator-riscv64.cc",
|
|
||||||
"src/compiler/backend/riscv64/instruction-codes-riscv64.h",
|
|
||||||
"src/compiler/backend/riscv64/instruction-scheduler-riscv64.cc",
|
|
||||||
"src/compiler/backend/riscv64/instruction-selector-riscv64.cc",
|
|
||||||
"src/deoptimizer/riscv64/deoptimizer-riscv64.cc",
|
"src/deoptimizer/riscv64/deoptimizer-riscv64.cc",
|
||||||
"src/diagnostics/riscv64/disasm-riscv64.cc",
|
"src/diagnostics/riscv64/disasm-riscv64.cc",
|
||||||
"src/diagnostics/riscv64/unwinder-riscv64.cc",
|
"src/diagnostics/riscv64/unwinder-riscv64.cc",
|
||||||
@ -2439,12 +2417,6 @@ filegroup(
|
|||||||
"src/codegen/ppc/macro-assembler-ppc.h",
|
"src/codegen/ppc/macro-assembler-ppc.h",
|
||||||
"src/codegen/ppc/register-ppc.h",
|
"src/codegen/ppc/register-ppc.h",
|
||||||
"src/codegen/ppc/reglist-ppc.h",
|
"src/codegen/ppc/reglist-ppc.h",
|
||||||
"src/compiler/backend/ppc/code-generator-ppc.cc",
|
|
||||||
"src/compiler/backend/ppc/instruction-codes-ppc.h",
|
|
||||||
"src/compiler/backend/ppc/instruction-scheduler-ppc.cc",
|
|
||||||
"src/compiler/backend/ppc/instruction-selector-ppc.cc",
|
|
||||||
"src/compiler/backend/ppc/unwinding-info-writer-ppc.cc",
|
|
||||||
"src/compiler/backend/ppc/unwinding-info-writer-ppc.h",
|
|
||||||
"src/deoptimizer/ppc/deoptimizer-ppc.cc",
|
"src/deoptimizer/ppc/deoptimizer-ppc.cc",
|
||||||
"src/diagnostics/ppc/disasm-ppc.cc",
|
"src/diagnostics/ppc/disasm-ppc.cc",
|
||||||
"src/diagnostics/ppc/eh-frame-ppc.cc",
|
"src/diagnostics/ppc/eh-frame-ppc.cc",
|
||||||
@ -2616,7 +2588,6 @@ filegroup(
|
|||||||
name = "icu/v8_base_without_compiler_files",
|
name = "icu/v8_base_without_compiler_files",
|
||||||
srcs = [
|
srcs = [
|
||||||
"src/builtins/builtins-intl.cc",
|
"src/builtins/builtins-intl.cc",
|
||||||
"src/builtins/builtins-intl-gen.cc",
|
|
||||||
"src/objects/intl-objects.cc",
|
"src/objects/intl-objects.cc",
|
||||||
"src/objects/intl-objects.h",
|
"src/objects/intl-objects.h",
|
||||||
"src/objects/js-break-iterator.cc",
|
"src/objects/js-break-iterator.cc",
|
||||||
@ -2891,10 +2862,13 @@ filegroup(
|
|||||||
"src/compiler/state-values-utils.h",
|
"src/compiler/state-values-utils.h",
|
||||||
"src/compiler/store-store-elimination.cc",
|
"src/compiler/store-store-elimination.cc",
|
||||||
"src/compiler/store-store-elimination.h",
|
"src/compiler/store-store-elimination.h",
|
||||||
|
"src/compiler/turbofan-enabled.cc",
|
||||||
|
"src/compiler/turbofan.h",
|
||||||
"src/compiler/turboshaft/assembler.cc",
|
"src/compiler/turboshaft/assembler.cc",
|
||||||
"src/compiler/turboshaft/assembler.h",
|
"src/compiler/turboshaft/assembler.h",
|
||||||
"src/compiler/turboshaft/assert-types-reducer.h",
|
"src/compiler/turboshaft/assert-types-reducer.h",
|
||||||
"src/compiler/turboshaft/branch-elimination-reducer.h",
|
"src/compiler/turboshaft/branch-elimination-reducer.h",
|
||||||
|
"src/compiler/turboshaft/dead-code-elimination-reducer.h",
|
||||||
"src/compiler/turboshaft/decompression-optimization.cc",
|
"src/compiler/turboshaft/decompression-optimization.cc",
|
||||||
"src/compiler/turboshaft/decompression-optimization.h",
|
"src/compiler/turboshaft/decompression-optimization.h",
|
||||||
"src/compiler/turboshaft/deopt-data.h",
|
"src/compiler/turboshaft/deopt-data.h",
|
||||||
@ -2909,6 +2883,7 @@ filegroup(
|
|||||||
"src/compiler/turboshaft/late-escape-analysis-reducer.h",
|
"src/compiler/turboshaft/late-escape-analysis-reducer.h",
|
||||||
"src/compiler/turboshaft/late-escape-analysis-reducer.cc",
|
"src/compiler/turboshaft/late-escape-analysis-reducer.cc",
|
||||||
"src/compiler/turboshaft/layered-hash-map.h",
|
"src/compiler/turboshaft/layered-hash-map.h",
|
||||||
|
"src/compiler/turboshaft/machine-lowering-reducer.h",
|
||||||
"src/compiler/turboshaft/machine-optimization-reducer.h",
|
"src/compiler/turboshaft/machine-optimization-reducer.h",
|
||||||
"src/compiler/turboshaft/memory-optimization.cc",
|
"src/compiler/turboshaft/memory-optimization.cc",
|
||||||
"src/compiler/turboshaft/memory-optimization.h",
|
"src/compiler/turboshaft/memory-optimization.h",
|
||||||
@ -2919,6 +2894,7 @@ filegroup(
|
|||||||
"src/compiler/turboshaft/optimization-phase.h",
|
"src/compiler/turboshaft/optimization-phase.h",
|
||||||
"src/compiler/turboshaft/recreate-schedule.cc",
|
"src/compiler/turboshaft/recreate-schedule.cc",
|
||||||
"src/compiler/turboshaft/recreate-schedule.h",
|
"src/compiler/turboshaft/recreate-schedule.h",
|
||||||
|
"src/compiler/turboshaft/reducer-traits.h",
|
||||||
"src/compiler/turboshaft/representations.cc",
|
"src/compiler/turboshaft/representations.cc",
|
||||||
"src/compiler/turboshaft/representations.h",
|
"src/compiler/turboshaft/representations.h",
|
||||||
"src/compiler/turboshaft/select-lowering-reducer.h",
|
"src/compiler/turboshaft/select-lowering-reducer.h",
|
||||||
@ -2929,8 +2905,10 @@ filegroup(
|
|||||||
"src/compiler/turboshaft/type-inference-reducer.h",
|
"src/compiler/turboshaft/type-inference-reducer.h",
|
||||||
"src/compiler/turboshaft/type-parser.cc",
|
"src/compiler/turboshaft/type-parser.cc",
|
||||||
"src/compiler/turboshaft/type-parser.h",
|
"src/compiler/turboshaft/type-parser.h",
|
||||||
|
"src/compiler/turboshaft/typed-optimizations-reducer.h",
|
||||||
"src/compiler/turboshaft/types.cc",
|
"src/compiler/turboshaft/types.cc",
|
||||||
"src/compiler/turboshaft/types.h",
|
"src/compiler/turboshaft/types.h",
|
||||||
|
"src/compiler/turboshaft/uniform-reducer-adapter.h",
|
||||||
"src/compiler/turboshaft/utils.cc",
|
"src/compiler/turboshaft/utils.cc",
|
||||||
"src/compiler/turboshaft/utils.h",
|
"src/compiler/turboshaft/utils.h",
|
||||||
"src/compiler/turboshaft/value-numbering-reducer.h",
|
"src/compiler/turboshaft/value-numbering-reducer.h",
|
||||||
@ -2954,6 +2932,59 @@ filegroup(
|
|||||||
"src/compiler/zone-stats.cc",
|
"src/compiler/zone-stats.cc",
|
||||||
"src/compiler/zone-stats.h",
|
"src/compiler/zone-stats.h",
|
||||||
] + select({
|
] + select({
|
||||||
|
"@v8//bazel/config:v8_target_ia32": [
|
||||||
|
"src/compiler/backend/ia32/code-generator-ia32.cc",
|
||||||
|
"src/compiler/backend/ia32/instruction-codes-ia32.h",
|
||||||
|
"src/compiler/backend/ia32/instruction-scheduler-ia32.cc",
|
||||||
|
"src/compiler/backend/ia32/instruction-selector-ia32.cc",
|
||||||
|
],
|
||||||
|
"@v8//bazel/config:v8_target_x64": [
|
||||||
|
"src/compiler/backend/x64/code-generator-x64.cc",
|
||||||
|
"src/compiler/backend/x64/instruction-codes-x64.h",
|
||||||
|
"src/compiler/backend/x64/instruction-scheduler-x64.cc",
|
||||||
|
"src/compiler/backend/x64/instruction-selector-x64.cc",
|
||||||
|
"src/compiler/backend/x64/unwinding-info-writer-x64.cc",
|
||||||
|
"src/compiler/backend/x64/unwinding-info-writer-x64.h",
|
||||||
|
],
|
||||||
|
"@v8//bazel/config:v8_target_arm": [
|
||||||
|
"src/compiler/backend/arm/code-generator-arm.cc",
|
||||||
|
"src/compiler/backend/arm/instruction-codes-arm.h",
|
||||||
|
"src/compiler/backend/arm/instruction-scheduler-arm.cc",
|
||||||
|
"src/compiler/backend/arm/instruction-selector-arm.cc",
|
||||||
|
"src/compiler/backend/arm/unwinding-info-writer-arm.cc",
|
||||||
|
"src/compiler/backend/arm/unwinding-info-writer-arm.h",
|
||||||
|
],
|
||||||
|
"@v8//bazel/config:v8_target_arm64": [
|
||||||
|
"src/compiler/backend/arm64/code-generator-arm64.cc",
|
||||||
|
"src/compiler/backend/arm64/instruction-codes-arm64.h",
|
||||||
|
"src/compiler/backend/arm64/instruction-scheduler-arm64.cc",
|
||||||
|
"src/compiler/backend/arm64/instruction-selector-arm64.cc",
|
||||||
|
"src/compiler/backend/arm64/unwinding-info-writer-arm64.cc",
|
||||||
|
"src/compiler/backend/arm64/unwinding-info-writer-arm64.h",
|
||||||
|
],
|
||||||
|
"@v8//bazel/config:v8_target_s390x": [
|
||||||
|
"src/compiler/backend/s390/code-generator-s390.cc",
|
||||||
|
"src/compiler/backend/s390/instruction-codes-s390.h",
|
||||||
|
"src/compiler/backend/s390/instruction-scheduler-s390.cc",
|
||||||
|
"src/compiler/backend/s390/instruction-selector-s390.cc",
|
||||||
|
"src/compiler/backend/s390/unwinding-info-writer-s390.cc",
|
||||||
|
"src/compiler/backend/s390/unwinding-info-writer-s390.h",
|
||||||
|
],
|
||||||
|
"@v8//bazel/config:v8_target_riscv64": [
|
||||||
|
"src/compiler/backend/riscv64/code-generator-riscv64.cc",
|
||||||
|
"src/compiler/backend/riscv64/instruction-codes-riscv64.h",
|
||||||
|
"src/compiler/backend/riscv64/instruction-scheduler-riscv64.cc",
|
||||||
|
"src/compiler/backend/riscv64/instruction-selector-riscv64.cc",
|
||||||
|
],
|
||||||
|
"@v8//bazel/config:v8_target_ppc64le": [
|
||||||
|
"src/compiler/backend/ppc/code-generator-ppc.cc",
|
||||||
|
"src/compiler/backend/ppc/instruction-codes-ppc.h",
|
||||||
|
"src/compiler/backend/ppc/instruction-scheduler-ppc.cc",
|
||||||
|
"src/compiler/backend/ppc/instruction-selector-ppc.cc",
|
||||||
|
"src/compiler/backend/ppc/unwinding-info-writer-ppc.cc",
|
||||||
|
"src/compiler/backend/ppc/unwinding-info-writer-ppc.h",
|
||||||
|
],
|
||||||
|
}) + select({
|
||||||
":is_v8_enable_webassembly": [
|
":is_v8_enable_webassembly": [
|
||||||
"src/compiler/int64-lowering.cc",
|
"src/compiler/int64-lowering.cc",
|
||||||
"src/compiler/int64-lowering.h",
|
"src/compiler/int64-lowering.h",
|
||||||
@ -2964,6 +2995,8 @@ filegroup(
|
|||||||
"src/compiler/wasm-compiler.h",
|
"src/compiler/wasm-compiler.h",
|
||||||
"src/compiler/wasm-escape-analysis.cc",
|
"src/compiler/wasm-escape-analysis.cc",
|
||||||
"src/compiler/wasm-escape-analysis.h",
|
"src/compiler/wasm-escape-analysis.h",
|
||||||
|
"src/compiler/wasm-load-elimination.cc",
|
||||||
|
"src/compiler/wasm-load-elimination.h",
|
||||||
"src/compiler/wasm-loop-peeling.cc",
|
"src/compiler/wasm-loop-peeling.cc",
|
||||||
"src/compiler/wasm-loop-peeling.h",
|
"src/compiler/wasm-loop-peeling.h",
|
||||||
"src/compiler/wasm-gc-lowering.cc",
|
"src/compiler/wasm-gc-lowering.cc",
|
||||||
@ -2982,7 +3015,7 @@ filegroup(
|
|||||||
)
|
)
|
||||||
|
|
||||||
filegroup(
|
filegroup(
|
||||||
name = "v8_initializers_files",
|
name = "noicu/v8_initializers_files",
|
||||||
srcs = [
|
srcs = [
|
||||||
"src/builtins/builtins-array-gen.cc",
|
"src/builtins/builtins-array-gen.cc",
|
||||||
"src/builtins/builtins-array-gen.h",
|
"src/builtins/builtins-array-gen.h",
|
||||||
@ -3002,6 +3035,7 @@ filegroup(
|
|||||||
"src/builtins/builtins-constructor.h",
|
"src/builtins/builtins-constructor.h",
|
||||||
"src/builtins/builtins-conversion-gen.cc",
|
"src/builtins/builtins-conversion-gen.cc",
|
||||||
"src/builtins/builtins-data-view-gen.h",
|
"src/builtins/builtins-data-view-gen.h",
|
||||||
|
"src/builtins/builtins-data-view-gen.cc",
|
||||||
"src/builtins/builtins-date-gen.cc",
|
"src/builtins/builtins-date-gen.cc",
|
||||||
"src/builtins/builtins-generator-gen.cc",
|
"src/builtins/builtins-generator-gen.cc",
|
||||||
"src/builtins/builtins-global-gen.cc",
|
"src/builtins/builtins-global-gen.cc",
|
||||||
@ -3073,6 +3107,14 @@ filegroup(
|
|||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "icu/v8_initializers_files",
|
||||||
|
srcs = [
|
||||||
|
"src/builtins/builtins-intl-gen.cc",
|
||||||
|
":noicu/v8_initializers_files",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
filegroup(
|
filegroup(
|
||||||
name = "cppgc_base_files",
|
name = "cppgc_base_files",
|
||||||
srcs = [
|
srcs = [
|
||||||
@ -3187,16 +3229,16 @@ filegroup(
|
|||||||
# Note these cannot be v8_target_is_* selects because these contain
|
# Note these cannot be v8_target_is_* selects because these contain
|
||||||
# inline assembly that runs inside the executable. Since these are
|
# inline assembly that runs inside the executable. Since these are
|
||||||
# linked directly into mksnapshot, they must use the actual target cpu.
|
# linked directly into mksnapshot, they must use the actual target cpu.
|
||||||
"@v8//bazel/config:is_inline_asm_ia32": ["src/heap/base/asm/ia32/save_registers_asm.cc"],
|
"@v8//bazel/config:is_inline_asm_ia32": ["src/heap/base/asm/ia32/push_registers_asm.cc"],
|
||||||
"@v8//bazel/config:is_inline_asm_x64": ["src/heap/base/asm/x64/save_registers_asm.cc"],
|
"@v8//bazel/config:is_inline_asm_x64": ["src/heap/base/asm/x64/push_registers_asm.cc"],
|
||||||
"@v8//bazel/config:is_inline_asm_arm": ["src/heap/base/asm/arm/save_registers_asm.cc"],
|
"@v8//bazel/config:is_inline_asm_arm": ["src/heap/base/asm/arm/push_registers_asm.cc"],
|
||||||
"@v8//bazel/config:is_inline_asm_arm64": ["src/heap/base/asm/arm64/save_registers_asm.cc"],
|
"@v8//bazel/config:is_inline_asm_arm64": ["src/heap/base/asm/arm64/push_registers_asm.cc"],
|
||||||
"@v8//bazel/config:is_inline_asm_s390x": ["src/heap/base/asm/s390/save_registers_asm.cc"],
|
"@v8//bazel/config:is_inline_asm_s390x": ["src/heap/base/asm/s390/push_registers_asm.cc"],
|
||||||
"@v8//bazel/config:is_inline_asm_riscv64": ["src/heap/base/asm/riscv64/save_registers_asm.cc"],
|
"@v8//bazel/config:is_inline_asm_riscv64": ["src/heap/base/asm/riscv64/push_registers_asm.cc"],
|
||||||
"@v8//bazel/config:is_inline_asm_ppc64le": ["src/heap/base/asm/ppc/save_registers_asm.cc"],
|
"@v8//bazel/config:is_inline_asm_ppc64le": ["src/heap/base/asm/ppc/push_registers_asm.cc"],
|
||||||
"@v8//bazel/config:is_msvc_asm_ia32": ["src/heap/base/asm/ia32/save_registers_masm.asm"],
|
"@v8//bazel/config:is_msvc_asm_ia32": ["src/heap/base/asm/ia32/push_registers_masm.asm"],
|
||||||
"@v8//bazel/config:is_msvc_asm_x64": ["src/heap/base/asm/x64/save_registers_masm.asm"],
|
"@v8//bazel/config:is_msvc_asm_x64": ["src/heap/base/asm/x64/push_registers_masm.asm"],
|
||||||
"@v8//bazel/config:is_msvc_asm_arm64": ["src/heap/base/asm/arm64/save_registers_masm.S"],
|
"@v8//bazel/config:is_msvc_asm_arm64": ["src/heap/base/asm/arm64/push_registers_masm.S"],
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -3252,6 +3294,8 @@ filegroup(
|
|||||||
filegroup(
|
filegroup(
|
||||||
name = "v8_inspector_files",
|
name = "v8_inspector_files",
|
||||||
srcs = [
|
srcs = [
|
||||||
|
"src/inspector/crc32.cc",
|
||||||
|
"src/inspector/crc32.h",
|
||||||
"src/inspector/custom-preview.cc",
|
"src/inspector/custom-preview.cc",
|
||||||
"src/inspector/custom-preview.h",
|
"src/inspector/custom-preview.h",
|
||||||
"src/inspector/injected-script.cc",
|
"src/inspector/injected-script.cc",
|
||||||
@ -3405,8 +3449,8 @@ filegroup(
|
|||||||
|
|
||||||
# TODO(victorgomes): Add support to tools/debug_helper,
|
# TODO(victorgomes): Add support to tools/debug_helper,
|
||||||
# which needs class-debug-readers and debug-macros.
|
# which needs class-debug-readers and debug-macros.
|
||||||
v8_torque(
|
v8_torque_definitions(
|
||||||
name = "generated_torque_files",
|
name = "generated_torque_definitions",
|
||||||
args = select({
|
args = select({
|
||||||
":is_v8_annotate_torque_ir": ["-annotate-ir"],
|
":is_v8_annotate_torque_ir": ["-annotate-ir"],
|
||||||
"//conditions:default": [],
|
"//conditions:default": [],
|
||||||
@ -3422,12 +3466,8 @@ v8_torque(
|
|||||||
"class-forward-declarations.h",
|
"class-forward-declarations.h",
|
||||||
"class-verifiers.cc",
|
"class-verifiers.cc",
|
||||||
"class-verifiers.h",
|
"class-verifiers.h",
|
||||||
"csa-types.h",
|
|
||||||
# "debug-macros.cc",
|
# "debug-macros.cc",
|
||||||
# "debug-macros.h",
|
# "debug-macros.h",
|
||||||
"enum-verifiers.cc",
|
|
||||||
"exported-macros-assembler.cc",
|
|
||||||
"exported-macros-assembler.h",
|
|
||||||
"factory.cc",
|
"factory.cc",
|
||||||
"factory.inc",
|
"factory.inc",
|
||||||
"instance-types.h",
|
"instance-types.h",
|
||||||
@ -3440,8 +3480,28 @@ v8_torque(
|
|||||||
noicu_srcs = [":noicu/torque_files"],
|
noicu_srcs = [":noicu/torque_files"],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
v8_torque_initializers(
|
||||||
|
name = "generated_torque_initializers",
|
||||||
|
args = select({
|
||||||
|
":is_v8_annotate_torque_ir": ["-annotate-ir"],
|
||||||
|
"//conditions:default": [],
|
||||||
|
}) + select({
|
||||||
|
"@v8//bazel/config:v8_target_is_32_bits": ["-m32"],
|
||||||
|
"//conditions:default": [],
|
||||||
|
}),
|
||||||
|
extras = [
|
||||||
|
"csa-types.h",
|
||||||
|
"enum-verifiers.cc",
|
||||||
|
"exported-macros-assembler.cc",
|
||||||
|
"exported-macros-assembler.h",
|
||||||
|
],
|
||||||
|
icu_srcs = [":icu/torque_files"],
|
||||||
|
noicu_srcs = [":noicu/torque_files"],
|
||||||
|
)
|
||||||
|
|
||||||
py_binary(
|
py_binary(
|
||||||
name = "code_generator",
|
name = "code_generator",
|
||||||
|
python_version = "PY3",
|
||||||
srcs = [
|
srcs = [
|
||||||
"third_party/inspector_protocol/code_generator.py",
|
"third_party/inspector_protocol/code_generator.py",
|
||||||
"third_party/inspector_protocol/pdl.py",
|
"third_party/inspector_protocol/pdl.py",
|
||||||
@ -3507,8 +3567,6 @@ filegroup(
|
|||||||
name = "v8_common_libshared_files",
|
name = "v8_common_libshared_files",
|
||||||
srcs = [
|
srcs = [
|
||||||
":torque_runtime_support_files",
|
":torque_runtime_support_files",
|
||||||
":v8_compiler_files",
|
|
||||||
":v8_initializers_files",
|
|
||||||
":v8_libplatform_files",
|
":v8_libplatform_files",
|
||||||
":v8_libsampler_files",
|
":v8_libsampler_files",
|
||||||
":v8_shared_internal_headers",
|
":v8_shared_internal_headers",
|
||||||
@ -3578,15 +3636,15 @@ v8_mksnapshot(
|
|||||||
|
|
||||||
# NOTE: This allow headers to be accessed without the icu/noicu prefixes.
|
# NOTE: This allow headers to be accessed without the icu/noicu prefixes.
|
||||||
cc_library(
|
cc_library(
|
||||||
name = "icu/generated_torque_headers",
|
name = "icu/generated_torque_definitions_headers",
|
||||||
hdrs = [":icu/generated_torque_files"],
|
hdrs = [":icu/generated_torque_definitions"],
|
||||||
copts = ["-Wno-implicit-fallthrough"],
|
copts = ["-Wno-implicit-fallthrough"],
|
||||||
strip_include_prefix = "icu",
|
strip_include_prefix = "icu",
|
||||||
)
|
)
|
||||||
|
|
||||||
cc_library(
|
cc_library(
|
||||||
name = "noicu/generated_torque_headers",
|
name = "noicu/generated_torque_definitions_headers",
|
||||||
hdrs = [":noicu/generated_torque_files"],
|
hdrs = [":noicu/generated_torque_definitions"],
|
||||||
copts = ["-Wno-implicit-fallthrough"],
|
copts = ["-Wno-implicit-fallthrough"],
|
||||||
strip_include_prefix = "noicu",
|
strip_include_prefix = "noicu",
|
||||||
)
|
)
|
||||||
@ -3632,22 +3690,27 @@ v8_library(
|
|||||||
srcs = [
|
srcs = [
|
||||||
":v8_base_without_compiler_files",
|
":v8_base_without_compiler_files",
|
||||||
":v8_common_libshared_files",
|
":v8_common_libshared_files",
|
||||||
|
] + select({
|
||||||
|
":is_v8_enable_turbofan": [
|
||||||
|
":v8_compiler_files",
|
||||||
],
|
],
|
||||||
|
"//conditions:default": [],
|
||||||
|
}),
|
||||||
copts = ["-Wno-implicit-fallthrough"],
|
copts = ["-Wno-implicit-fallthrough"],
|
||||||
icu_deps = [
|
icu_deps = [
|
||||||
":icu/generated_torque_headers",
|
":icu/generated_torque_definitions_headers",
|
||||||
"//external:icu",
|
"//external:icu",
|
||||||
],
|
],
|
||||||
icu_srcs = [
|
icu_srcs = [
|
||||||
":generated_regexp_special_case",
|
":generated_regexp_special_case",
|
||||||
":icu/generated_torque_files",
|
":icu/generated_torque_definitions",
|
||||||
":icu/v8_base_without_compiler_files",
|
":icu/v8_base_without_compiler_files",
|
||||||
],
|
],
|
||||||
noicu_deps = [
|
noicu_deps = [
|
||||||
":noicu/generated_torque_headers",
|
":noicu/generated_torque_definitions_headers",
|
||||||
],
|
],
|
||||||
noicu_srcs = [
|
noicu_srcs = [
|
||||||
":noicu/generated_torque_files",
|
":noicu/generated_torque_definitions",
|
||||||
],
|
],
|
||||||
deps = [
|
deps = [
|
||||||
":v8_libbase",
|
":v8_libbase",
|
||||||
@ -3657,7 +3720,15 @@ v8_library(
|
|||||||
|
|
||||||
v8_library(
|
v8_library(
|
||||||
name = "v8",
|
name = "v8",
|
||||||
srcs = [":v8_inspector_files"],
|
srcs = [
|
||||||
|
":v8_inspector_files",
|
||||||
|
] + select({
|
||||||
|
":is_not_v8_enable_turbofan": [
|
||||||
|
# With Turbofan disabled, we only include the stubbed-out API.
|
||||||
|
"src/compiler/turbofan-disabled.cc",
|
||||||
|
],
|
||||||
|
"//conditions:default": [],
|
||||||
|
}),
|
||||||
hdrs = [":public_header_files"],
|
hdrs = [":public_header_files"],
|
||||||
copts = ["-Wno-implicit-fallthrough"],
|
copts = ["-Wno-implicit-fallthrough"],
|
||||||
icu_deps = [":icu/v8_libshared"],
|
icu_deps = [":icu/v8_libshared"],
|
||||||
@ -3747,14 +3818,30 @@ v8_binary(
|
|||||||
|
|
||||||
v8_binary(
|
v8_binary(
|
||||||
name = "mksnapshot",
|
name = "mksnapshot",
|
||||||
srcs = [":mksnapshot_files"],
|
srcs = [
|
||||||
|
":mksnapshot_files",
|
||||||
|
] + select({
|
||||||
|
":is_not_v8_enable_turbofan": [
|
||||||
|
# Turbofan is needed to generate builtins.
|
||||||
|
":v8_compiler_files",
|
||||||
|
],
|
||||||
|
"//conditions:default": [],
|
||||||
|
}),
|
||||||
copts = ["-Wno-implicit-fallthrough"],
|
copts = ["-Wno-implicit-fallthrough"],
|
||||||
icu_deps = [":icu/v8_libshared"],
|
icu_deps = [":icu/v8_libshared"],
|
||||||
linkopts = select({
|
linkopts = select({
|
||||||
"@v8//bazel/config:is_android": ["-llog"],
|
"@v8//bazel/config:is_android": ["-llog"],
|
||||||
"//conditions:default": [],
|
"//conditions:default": [],
|
||||||
}),
|
}),
|
||||||
|
icu_srcs = [
|
||||||
|
":icu/generated_torque_initializers",
|
||||||
|
":icu/v8_initializers_files",
|
||||||
|
],
|
||||||
noicu_deps = [":v8_libshared_noicu"],
|
noicu_deps = [":v8_libshared_noicu"],
|
||||||
|
noicu_srcs = [
|
||||||
|
":noicu/generated_torque_initializers",
|
||||||
|
":noicu/v8_initializers_files",
|
||||||
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
v8_binary(
|
v8_binary(
|
||||||
|
323
BUILD.gn
323
BUILD.gn
@ -10,10 +10,6 @@ import("//build/config/mips.gni")
|
|||||||
import("//build/config/sanitizers/sanitizers.gni")
|
import("//build/config/sanitizers/sanitizers.gni")
|
||||||
import("//build_overrides/build.gni")
|
import("//build_overrides/build.gni")
|
||||||
|
|
||||||
if (is_android) {
|
|
||||||
import("//build/config/android/rules.gni")
|
|
||||||
}
|
|
||||||
|
|
||||||
import("gni/snapshot_toolchain.gni")
|
import("gni/snapshot_toolchain.gni")
|
||||||
import("gni/v8.gni")
|
import("gni/v8.gni")
|
||||||
|
|
||||||
@ -121,7 +117,7 @@ declare_args() {
|
|||||||
v8_enable_snapshot_native_code_counters = ""
|
v8_enable_snapshot_native_code_counters = ""
|
||||||
|
|
||||||
# Use pre-generated static root pointer values from static-roots.h.
|
# Use pre-generated static root pointer values from static-roots.h.
|
||||||
v8_enable_static_roots = false
|
v8_enable_static_roots = ""
|
||||||
|
|
||||||
# Enable code-generation-time checking of types in the CodeStubAssembler.
|
# Enable code-generation-time checking of types in the CodeStubAssembler.
|
||||||
v8_enable_verify_csa = false
|
v8_enable_verify_csa = false
|
||||||
@ -207,10 +203,6 @@ declare_args() {
|
|||||||
# Sets -dV8_EXTERNAL_CODE_SPACE
|
# Sets -dV8_EXTERNAL_CODE_SPACE
|
||||||
v8_enable_external_code_space = ""
|
v8_enable_external_code_space = ""
|
||||||
|
|
||||||
# Enable the Maglev compiler.
|
|
||||||
# Sets -dV8_ENABLE_MAGLEV
|
|
||||||
v8_enable_maglev = ""
|
|
||||||
|
|
||||||
# With post mortem support enabled, metadata is embedded into libv8 that
|
# With post mortem support enabled, metadata is embedded into libv8 that
|
||||||
# describes various parameters of the VM for use by debuggers. See
|
# describes various parameters of the VM for use by debuggers. See
|
||||||
# tools/gen-postmortem-metadata.py for details.
|
# tools/gen-postmortem-metadata.py for details.
|
||||||
@ -462,8 +454,13 @@ if (v8_enable_external_code_space == "") {
|
|||||||
(target_os != "fuchsia" && v8_current_cpu == "arm64"))
|
(target_os != "fuchsia" && v8_current_cpu == "arm64"))
|
||||||
}
|
}
|
||||||
if (v8_enable_maglev == "") {
|
if (v8_enable_maglev == "") {
|
||||||
v8_enable_maglev = v8_current_cpu == "x64" && v8_enable_pointer_compression
|
v8_enable_maglev = v8_enable_turbofan &&
|
||||||
|
(v8_current_cpu == "x64" || v8_current_cpu == "arm64") &&
|
||||||
|
v8_enable_pointer_compression
|
||||||
}
|
}
|
||||||
|
assert(v8_enable_turbofan || !v8_enable_maglev,
|
||||||
|
"Maglev is not available when Turbofan is disabled.")
|
||||||
|
|
||||||
if (v8_builtins_profiling_log_file == "default") {
|
if (v8_builtins_profiling_log_file == "default") {
|
||||||
v8_builtins_profiling_log_file = ""
|
v8_builtins_profiling_log_file = ""
|
||||||
|
|
||||||
@ -516,6 +513,10 @@ assert(!v8_enable_trace_ignition || v8_enable_trace_unoptimized,
|
|||||||
"Ignition tracing requires unoptimized tracing to be enabled.")
|
"Ignition tracing requires unoptimized tracing to be enabled.")
|
||||||
assert(!v8_enable_trace_baseline_exec || v8_enable_trace_unoptimized,
|
assert(!v8_enable_trace_baseline_exec || v8_enable_trace_unoptimized,
|
||||||
"Baseline tracing requires unoptimized tracing to be enabled.")
|
"Baseline tracing requires unoptimized tracing to be enabled.")
|
||||||
|
assert(
|
||||||
|
v8_enable_debugging_features == true || dcheck_always_on ||
|
||||||
|
!v8_enable_slow_dchecks,
|
||||||
|
"v8_enable_slow_dchecks requires v8_enable_debugging_features or dcheck_always_on.")
|
||||||
|
|
||||||
if (v8_enable_short_builtin_calls &&
|
if (v8_enable_short_builtin_calls &&
|
||||||
(!v8_enable_pointer_compression && v8_current_cpu != "x64")) {
|
(!v8_enable_pointer_compression && v8_current_cpu != "x64")) {
|
||||||
@ -540,11 +541,16 @@ if (v8_enable_sandbox == "") {
|
|||||||
|
|
||||||
if (v8_enable_static_roots == "") {
|
if (v8_enable_static_roots == "") {
|
||||||
# Static roots are only valid for builds with pointer compression and a
|
# Static roots are only valid for builds with pointer compression and a
|
||||||
# shared ro heap. Also, non-wasm and non-i18n builds have fewer read-only
|
# shared read-only heap.
|
||||||
# roots.
|
# TODO(olivf, v8:13466) Some configurations could be supported if we
|
||||||
|
# introduce different static root files for different build configurations:
|
||||||
|
# Non-wasm and non-i18n builds have fewer read only roots. Configurations
|
||||||
|
# without external code space allocate read only roots at a further
|
||||||
|
# location relative to the cage base.
|
||||||
v8_enable_static_roots =
|
v8_enable_static_roots =
|
||||||
v8_enable_pointer_compression && v8_enable_shared_ro_heap &&
|
v8_enable_pointer_compression && v8_enable_shared_ro_heap &&
|
||||||
v8_enable_pointer_compression_shared_cage && v8_enable_webassembly &&
|
v8_enable_pointer_compression_shared_cage &&
|
||||||
|
v8_enable_external_code_space && v8_enable_webassembly &&
|
||||||
v8_enable_i18n_support
|
v8_enable_i18n_support
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -598,8 +604,9 @@ assert(
|
|||||||
|
|
||||||
assert(
|
assert(
|
||||||
!v8_enable_pointer_compression_shared_cage || v8_current_cpu == "x64" ||
|
!v8_enable_pointer_compression_shared_cage || v8_current_cpu == "x64" ||
|
||||||
v8_current_cpu == "arm64" || v8_current_cpu == "riscv64",
|
v8_current_cpu == "arm64" || v8_current_cpu == "riscv64" ||
|
||||||
"Sharing a pointer compression cage is only supported on x64,arm64 and riscv64")
|
v8_current_cpu == "ppc64",
|
||||||
|
"Sharing a pointer compression cage is only supported on x64,arm64, ppc64 and riscv64")
|
||||||
|
|
||||||
assert(!v8_enable_unconditional_write_barriers || !v8_disable_write_barriers,
|
assert(!v8_enable_unconditional_write_barriers || !v8_disable_write_barriers,
|
||||||
"Write barriers can't be both enabled and disabled")
|
"Write barriers can't be both enabled and disabled")
|
||||||
@ -831,6 +838,7 @@ config("v8_header_features") {
|
|||||||
external_cppgc_defines = [
|
external_cppgc_defines = [
|
||||||
"CPPGC_SUPPORTS_OBJECT_NAMES",
|
"CPPGC_SUPPORTS_OBJECT_NAMES",
|
||||||
"CPPGC_CAGED_HEAP",
|
"CPPGC_CAGED_HEAP",
|
||||||
|
"CPPGC_SLIM_WRITE_BARRIER",
|
||||||
"CPPGC_YOUNG_GENERATION",
|
"CPPGC_YOUNG_GENERATION",
|
||||||
"CPPGC_POINTER_COMPRESSION",
|
"CPPGC_POINTER_COMPRESSION",
|
||||||
]
|
]
|
||||||
@ -860,6 +868,9 @@ if (cppgc_enable_pointer_compression) {
|
|||||||
if (cppgc_enable_2gb_cage) {
|
if (cppgc_enable_2gb_cage) {
|
||||||
enabled_external_cppgc_defines += [ "CPPGC_2GB_CAGE" ]
|
enabled_external_cppgc_defines += [ "CPPGC_2GB_CAGE" ]
|
||||||
}
|
}
|
||||||
|
if (cppgc_enable_slim_write_barrier) {
|
||||||
|
enabled_external_cppgc_defines += [ "CPPGC_SLIM_WRITE_BARRIER" ]
|
||||||
|
}
|
||||||
|
|
||||||
disabled_external_cppgc_defines =
|
disabled_external_cppgc_defines =
|
||||||
external_cppgc_defines - enabled_external_cppgc_defines
|
external_cppgc_defines - enabled_external_cppgc_defines
|
||||||
@ -1041,6 +1052,9 @@ config("features") {
|
|||||||
if (v8_enable_maglev) {
|
if (v8_enable_maglev) {
|
||||||
defines += [ "V8_ENABLE_MAGLEV" ]
|
defines += [ "V8_ENABLE_MAGLEV" ]
|
||||||
}
|
}
|
||||||
|
if (v8_enable_turbofan) {
|
||||||
|
defines += [ "V8_ENABLE_TURBOFAN" ]
|
||||||
|
}
|
||||||
if (v8_enable_swiss_name_dictionary) {
|
if (v8_enable_swiss_name_dictionary) {
|
||||||
defines += [ "V8_ENABLE_SWISS_NAME_DICTIONARY" ]
|
defines += [ "V8_ENABLE_SWISS_NAME_DICTIONARY" ]
|
||||||
}
|
}
|
||||||
@ -1294,13 +1308,12 @@ config("toolchain") {
|
|||||||
if ((is_linux || is_chromeos) && v8_enable_backtrace) {
|
if ((is_linux || is_chromeos) && v8_enable_backtrace) {
|
||||||
ldflags += [ "-rdynamic" ]
|
ldflags += [ "-rdynamic" ]
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
if (v8_enable_debugging_features || dcheck_always_on) {
|
||||||
defines += [ "DEBUG" ]
|
defines += [ "DEBUG" ]
|
||||||
if (v8_enable_slow_dchecks) {
|
if (v8_enable_slow_dchecks) {
|
||||||
defines += [ "ENABLE_SLOW_DCHECKS" ]
|
defines += [ "ENABLE_SLOW_DCHECKS" ]
|
||||||
}
|
}
|
||||||
} else if (dcheck_always_on) {
|
|
||||||
defines += [ "DEBUG" ]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (v8_enable_verify_csa) {
|
if (v8_enable_verify_csa) {
|
||||||
@ -1599,21 +1612,6 @@ template("asm_to_inline_asm") {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_android && enable_java_templates) {
|
|
||||||
android_assets("v8_external_startup_data_assets") {
|
|
||||||
if (v8_use_external_startup_data) {
|
|
||||||
deps = [ "//v8" ]
|
|
||||||
renaming_sources = [ "$root_out_dir/snapshot_blob.bin" ]
|
|
||||||
if (current_cpu == "arm" || current_cpu == "x86") {
|
|
||||||
renaming_destinations = [ "snapshot_blob_32.bin" ]
|
|
||||||
} else {
|
|
||||||
renaming_destinations = [ "snapshot_blob_64.bin" ]
|
|
||||||
}
|
|
||||||
disable_compression = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (v8_postmortem_support) {
|
if (v8_postmortem_support) {
|
||||||
action("postmortem-metadata") {
|
action("postmortem-metadata") {
|
||||||
# Only targets in this file and the top-level visibility target can
|
# Only targets in this file and the top-level visibility target can
|
||||||
@ -1801,6 +1799,7 @@ torque_files = [
|
|||||||
"src/builtins/string-html.tq",
|
"src/builtins/string-html.tq",
|
||||||
"src/builtins/string-includes.tq",
|
"src/builtins/string-includes.tq",
|
||||||
"src/builtins/string-indexof.tq",
|
"src/builtins/string-indexof.tq",
|
||||||
|
"src/builtins/string-iswellformed.tq",
|
||||||
"src/builtins/string-iterator.tq",
|
"src/builtins/string-iterator.tq",
|
||||||
"src/builtins/string-match-search.tq",
|
"src/builtins/string-match-search.tq",
|
||||||
"src/builtins/string-pad.tq",
|
"src/builtins/string-pad.tq",
|
||||||
@ -1810,6 +1809,7 @@ torque_files = [
|
|||||||
"src/builtins/string-startswith.tq",
|
"src/builtins/string-startswith.tq",
|
||||||
"src/builtins/string-substr.tq",
|
"src/builtins/string-substr.tq",
|
||||||
"src/builtins/string-substring.tq",
|
"src/builtins/string-substring.tq",
|
||||||
|
"src/builtins/string-towellformed.tq",
|
||||||
"src/builtins/string-trim.tq",
|
"src/builtins/string-trim.tq",
|
||||||
"src/builtins/symbol.tq",
|
"src/builtins/symbol.tq",
|
||||||
"src/builtins/torque-internal.tq",
|
"src/builtins/torque-internal.tq",
|
||||||
@ -2160,12 +2160,6 @@ template("run_mksnapshot") {
|
|||||||
suffix = "_$name"
|
suffix = "_$name"
|
||||||
}
|
}
|
||||||
action("run_mksnapshot_" + name) {
|
action("run_mksnapshot_" + name) {
|
||||||
# Only targets in this file and running mkgrokdump can depend on this.
|
|
||||||
visibility = [
|
|
||||||
":*",
|
|
||||||
"tools/debug_helper:run_mkgrokdump",
|
|
||||||
]
|
|
||||||
|
|
||||||
deps = [ ":mksnapshot($v8_snapshot_toolchain)" ]
|
deps = [ ":mksnapshot($v8_snapshot_toolchain)" ]
|
||||||
|
|
||||||
script = "tools/run.py"
|
script = "tools/run.py"
|
||||||
@ -2307,6 +2301,7 @@ action("v8_dump_build_config") {
|
|||||||
script = "tools/testrunner/utils/dump_build_config.py"
|
script = "tools/testrunner/utils/dump_build_config.py"
|
||||||
outputs = [ "$root_out_dir/v8_build_config.json" ]
|
outputs = [ "$root_out_dir/v8_build_config.json" ]
|
||||||
is_gcov_coverage = v8_code_coverage && !is_clang
|
is_gcov_coverage = v8_code_coverage && !is_clang
|
||||||
|
is_DEBUG_defined = v8_enable_debugging_features || dcheck_always_on
|
||||||
is_full_debug = v8_enable_debugging_features && !v8_optimized_debug
|
is_full_debug = v8_enable_debugging_features && !v8_optimized_debug
|
||||||
args = [
|
args = [
|
||||||
rebase_path("$root_out_dir/v8_build_config.json", root_build_dir),
|
rebase_path("$root_out_dir/v8_build_config.json", root_build_dir),
|
||||||
@ -2318,36 +2313,45 @@ action("v8_dump_build_config") {
|
|||||||
"is_clang=$is_clang",
|
"is_clang=$is_clang",
|
||||||
"is_component_build=$is_component_build",
|
"is_component_build=$is_component_build",
|
||||||
"is_debug=$v8_enable_debugging_features",
|
"is_debug=$v8_enable_debugging_features",
|
||||||
|
"is_DEBUG_defined=$is_DEBUG_defined",
|
||||||
"is_full_debug=$is_full_debug",
|
"is_full_debug=$is_full_debug",
|
||||||
"is_gcov_coverage=$is_gcov_coverage",
|
"is_gcov_coverage=$is_gcov_coverage",
|
||||||
"is_msan=$is_msan",
|
"is_msan=$is_msan",
|
||||||
"is_tsan=$is_tsan",
|
"is_tsan=$is_tsan",
|
||||||
"is_ubsan_vptr=$is_ubsan_vptr",
|
"is_ubsan_vptr=$is_ubsan_vptr",
|
||||||
"target_cpu=\"$target_cpu\"",
|
"target_cpu=\"$target_cpu\"",
|
||||||
|
"v8_code_comments=$v8_code_comments",
|
||||||
|
"v8_control_flow_integrity=$v8_control_flow_integrity",
|
||||||
"v8_current_cpu=\"$v8_current_cpu\"",
|
"v8_current_cpu=\"$v8_current_cpu\"",
|
||||||
|
"v8_dict_property_const_tracking=$v8_dict_property_const_tracking",
|
||||||
|
"v8_disable_write_barriers=$v8_disable_write_barriers",
|
||||||
"v8_enable_atomic_object_field_writes=" +
|
"v8_enable_atomic_object_field_writes=" +
|
||||||
"$v8_enable_atomic_object_field_writes",
|
"$v8_enable_atomic_object_field_writes",
|
||||||
|
"v8_enable_cet_shadow_stack=$v8_enable_cet_shadow_stack",
|
||||||
|
"v8_enable_concurrent_marking=$v8_enable_concurrent_marking",
|
||||||
"v8_enable_conservative_stack_scanning=" +
|
"v8_enable_conservative_stack_scanning=" +
|
||||||
"$v8_enable_conservative_stack_scanning",
|
"$v8_enable_conservative_stack_scanning",
|
||||||
"v8_enable_concurrent_marking=$v8_enable_concurrent_marking",
|
"v8_enable_debug_code=$v8_enable_debug_code",
|
||||||
"v8_enable_single_generation=$v8_enable_single_generation",
|
"v8_enable_disassembler=$v8_enable_disassembler",
|
||||||
|
"v8_enable_gdbjit=$v8_enable_gdbjit",
|
||||||
"v8_enable_i18n_support=$v8_enable_i18n_support",
|
"v8_enable_i18n_support=$v8_enable_i18n_support",
|
||||||
"v8_enable_verify_predictable=$v8_enable_verify_predictable",
|
|
||||||
"v8_enable_verify_csa=$v8_enable_verify_csa",
|
|
||||||
"v8_enable_lite_mode=$v8_enable_lite_mode",
|
"v8_enable_lite_mode=$v8_enable_lite_mode",
|
||||||
"v8_enable_runtime_call_stats=$v8_enable_runtime_call_stats",
|
"v8_enable_maglev=$v8_enable_maglev",
|
||||||
"v8_enable_pointer_compression=$v8_enable_pointer_compression",
|
"v8_enable_pointer_compression=$v8_enable_pointer_compression",
|
||||||
"v8_enable_pointer_compression_shared_cage=" +
|
"v8_enable_pointer_compression_shared_cage=" +
|
||||||
"$v8_enable_pointer_compression_shared_cage",
|
"$v8_enable_pointer_compression_shared_cage",
|
||||||
|
"v8_enable_runtime_call_stats=$v8_enable_runtime_call_stats",
|
||||||
"v8_enable_sandbox=$v8_enable_sandbox",
|
"v8_enable_sandbox=$v8_enable_sandbox",
|
||||||
"v8_enable_shared_ro_heap=$v8_enable_shared_ro_heap",
|
"v8_enable_shared_ro_heap=$v8_enable_shared_ro_heap",
|
||||||
"v8_disable_write_barriers=$v8_disable_write_barriers",
|
"v8_enable_single_generation=$v8_enable_single_generation",
|
||||||
|
"v8_enable_slow_dchecks=$v8_enable_slow_dchecks",
|
||||||
"v8_enable_third_party_heap=$v8_enable_third_party_heap",
|
"v8_enable_third_party_heap=$v8_enable_third_party_heap",
|
||||||
|
"v8_enable_turbofan=$v8_enable_turbofan",
|
||||||
|
"v8_enable_verify_csa=$v8_enable_verify_csa",
|
||||||
|
"v8_enable_verify_heap=$v8_enable_verify_heap",
|
||||||
|
"v8_enable_verify_predictable=$v8_enable_verify_predictable",
|
||||||
"v8_enable_webassembly=$v8_enable_webassembly",
|
"v8_enable_webassembly=$v8_enable_webassembly",
|
||||||
"v8_dict_property_const_tracking=$v8_dict_property_const_tracking",
|
|
||||||
"v8_control_flow_integrity=$v8_control_flow_integrity",
|
|
||||||
"v8_target_cpu=\"$v8_target_cpu\"",
|
"v8_target_cpu=\"$v8_target_cpu\"",
|
||||||
"v8_enable_cet_shadow_stack=$v8_enable_cet_shadow_stack",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
if (v8_current_cpu == "mips64" || v8_current_cpu == "mips64el") {
|
if (v8_current_cpu == "mips64" || v8_current_cpu == "mips64el") {
|
||||||
@ -2368,6 +2372,7 @@ v8_source_set("v8_snapshot") {
|
|||||||
deps = [
|
deps = [
|
||||||
":v8_internal_headers",
|
":v8_internal_headers",
|
||||||
":v8_libbase",
|
":v8_libbase",
|
||||||
|
":v8_tracing",
|
||||||
]
|
]
|
||||||
public_deps = [
|
public_deps = [
|
||||||
# This should be public so downstream targets can declare the snapshot
|
# This should be public so downstream targets can declare the snapshot
|
||||||
@ -2439,6 +2444,7 @@ v8_source_set("v8_initializers") {
|
|||||||
"src/builtins/builtins-constructor-gen.h",
|
"src/builtins/builtins-constructor-gen.h",
|
||||||
"src/builtins/builtins-constructor.h",
|
"src/builtins/builtins-constructor.h",
|
||||||
"src/builtins/builtins-conversion-gen.cc",
|
"src/builtins/builtins-conversion-gen.cc",
|
||||||
|
"src/builtins/builtins-data-view-gen.cc",
|
||||||
"src/builtins/builtins-data-view-gen.h",
|
"src/builtins/builtins-data-view-gen.h",
|
||||||
"src/builtins/builtins-date-gen.cc",
|
"src/builtins/builtins-date-gen.cc",
|
||||||
"src/builtins/builtins-generator-gen.cc",
|
"src/builtins/builtins-generator-gen.cc",
|
||||||
@ -2980,9 +2986,11 @@ v8_header_set("v8_internal_headers") {
|
|||||||
"src/compiler/simplified-operator.h",
|
"src/compiler/simplified-operator.h",
|
||||||
"src/compiler/state-values-utils.h",
|
"src/compiler/state-values-utils.h",
|
||||||
"src/compiler/store-store-elimination.h",
|
"src/compiler/store-store-elimination.h",
|
||||||
|
"src/compiler/turbofan.h",
|
||||||
"src/compiler/turboshaft/assembler.h",
|
"src/compiler/turboshaft/assembler.h",
|
||||||
"src/compiler/turboshaft/assert-types-reducer.h",
|
"src/compiler/turboshaft/assert-types-reducer.h",
|
||||||
"src/compiler/turboshaft/branch-elimination-reducer.h",
|
"src/compiler/turboshaft/branch-elimination-reducer.h",
|
||||||
|
"src/compiler/turboshaft/dead-code-elimination-reducer.h",
|
||||||
"src/compiler/turboshaft/decompression-optimization.h",
|
"src/compiler/turboshaft/decompression-optimization.h",
|
||||||
"src/compiler/turboshaft/deopt-data.h",
|
"src/compiler/turboshaft/deopt-data.h",
|
||||||
"src/compiler/turboshaft/fast-hash.h",
|
"src/compiler/turboshaft/fast-hash.h",
|
||||||
@ -2992,12 +3000,14 @@ v8_header_set("v8_internal_headers") {
|
|||||||
"src/compiler/turboshaft/index.h",
|
"src/compiler/turboshaft/index.h",
|
||||||
"src/compiler/turboshaft/late-escape-analysis-reducer.h",
|
"src/compiler/turboshaft/late-escape-analysis-reducer.h",
|
||||||
"src/compiler/turboshaft/layered-hash-map.h",
|
"src/compiler/turboshaft/layered-hash-map.h",
|
||||||
|
"src/compiler/turboshaft/machine-lowering-reducer.h",
|
||||||
"src/compiler/turboshaft/machine-optimization-reducer.h",
|
"src/compiler/turboshaft/machine-optimization-reducer.h",
|
||||||
"src/compiler/turboshaft/memory-optimization.h",
|
"src/compiler/turboshaft/memory-optimization.h",
|
||||||
"src/compiler/turboshaft/operation-matching.h",
|
"src/compiler/turboshaft/operation-matching.h",
|
||||||
"src/compiler/turboshaft/operations.h",
|
"src/compiler/turboshaft/operations.h",
|
||||||
"src/compiler/turboshaft/optimization-phase.h",
|
"src/compiler/turboshaft/optimization-phase.h",
|
||||||
"src/compiler/turboshaft/recreate-schedule.h",
|
"src/compiler/turboshaft/recreate-schedule.h",
|
||||||
|
"src/compiler/turboshaft/reducer-traits.h",
|
||||||
"src/compiler/turboshaft/representations.h",
|
"src/compiler/turboshaft/representations.h",
|
||||||
"src/compiler/turboshaft/select-lowering-reducer.h",
|
"src/compiler/turboshaft/select-lowering-reducer.h",
|
||||||
"src/compiler/turboshaft/sidetable.h",
|
"src/compiler/turboshaft/sidetable.h",
|
||||||
@ -3005,7 +3015,9 @@ v8_header_set("v8_internal_headers") {
|
|||||||
"src/compiler/turboshaft/snapshot-table.h",
|
"src/compiler/turboshaft/snapshot-table.h",
|
||||||
"src/compiler/turboshaft/type-inference-reducer.h",
|
"src/compiler/turboshaft/type-inference-reducer.h",
|
||||||
"src/compiler/turboshaft/type-parser.h",
|
"src/compiler/turboshaft/type-parser.h",
|
||||||
|
"src/compiler/turboshaft/typed-optimizations-reducer.h",
|
||||||
"src/compiler/turboshaft/types.h",
|
"src/compiler/turboshaft/types.h",
|
||||||
|
"src/compiler/turboshaft/uniform-reducer-adapater.h",
|
||||||
"src/compiler/turboshaft/utils.h",
|
"src/compiler/turboshaft/utils.h",
|
||||||
"src/compiler/turboshaft/value-numbering-reducer.h",
|
"src/compiler/turboshaft/value-numbering-reducer.h",
|
||||||
"src/compiler/turboshaft/variable-reducer.h",
|
"src/compiler/turboshaft/variable-reducer.h",
|
||||||
@ -3124,8 +3136,8 @@ v8_header_set("v8_internal_headers") {
|
|||||||
"src/heap/cppgc-js/unified-heap-marking-state.h",
|
"src/heap/cppgc-js/unified-heap-marking-state.h",
|
||||||
"src/heap/cppgc-js/unified-heap-marking-verifier.h",
|
"src/heap/cppgc-js/unified-heap-marking-verifier.h",
|
||||||
"src/heap/cppgc-js/unified-heap-marking-visitor.h",
|
"src/heap/cppgc-js/unified-heap-marking-visitor.h",
|
||||||
"src/heap/embedder-tracing-inl.h",
|
"src/heap/cppgc-js/wrappable-info-inl.h",
|
||||||
"src/heap/embedder-tracing.h",
|
"src/heap/cppgc-js/wrappable-info.h",
|
||||||
"src/heap/evacuation-allocator-inl.h",
|
"src/heap/evacuation-allocator-inl.h",
|
||||||
"src/heap/evacuation-allocator.h",
|
"src/heap/evacuation-allocator.h",
|
||||||
"src/heap/evacuation-verifier-inl.h",
|
"src/heap/evacuation-verifier-inl.h",
|
||||||
@ -3640,6 +3652,7 @@ v8_header_set("v8_internal_headers") {
|
|||||||
|
|
||||||
if (v8_enable_maglev) {
|
if (v8_enable_maglev) {
|
||||||
sources += [
|
sources += [
|
||||||
|
"src/maglev/maglev-assembler-inl.h",
|
||||||
"src/maglev/maglev-assembler.h",
|
"src/maglev/maglev-assembler.h",
|
||||||
"src/maglev/maglev-basic-block.h",
|
"src/maglev/maglev-basic-block.h",
|
||||||
"src/maglev/maglev-code-gen-state.h",
|
"src/maglev/maglev-code-gen-state.h",
|
||||||
@ -3685,6 +3698,7 @@ v8_header_set("v8_internal_headers") {
|
|||||||
"src/compiler/wasm-gc-operator-reducer.h",
|
"src/compiler/wasm-gc-operator-reducer.h",
|
||||||
"src/compiler/wasm-graph-assembler.h",
|
"src/compiler/wasm-graph-assembler.h",
|
||||||
"src/compiler/wasm-inlining.h",
|
"src/compiler/wasm-inlining.h",
|
||||||
|
"src/compiler/wasm-load-elimination.h",
|
||||||
"src/compiler/wasm-loop-peeling.h",
|
"src/compiler/wasm-loop-peeling.h",
|
||||||
"src/compiler/wasm-typer.h",
|
"src/compiler/wasm-typer.h",
|
||||||
"src/debug/debug-wasm-objects-inl.h",
|
"src/debug/debug-wasm-objects-inl.h",
|
||||||
@ -3936,7 +3950,7 @@ v8_header_set("v8_internal_headers") {
|
|||||||
if (v8_enable_webassembly) {
|
if (v8_enable_webassembly) {
|
||||||
# Trap handling is enabled on arm64 Mac and in simulators on x64 on Linux
|
# Trap handling is enabled on arm64 Mac and in simulators on x64 on Linux
|
||||||
# and Mac.
|
# and Mac.
|
||||||
if ((current_cpu == "arm64" && is_mac) ||
|
if ((current_cpu == "arm64" && (is_mac || is_ios)) ||
|
||||||
(current_cpu == "x64" && (is_linux || is_chromeos || is_mac))) {
|
(current_cpu == "x64" && (is_linux || is_chromeos || is_mac))) {
|
||||||
sources += [ "src/trap-handler/handler-inside-posix.h" ]
|
sources += [ "src/trap-handler/handler-inside-posix.h" ]
|
||||||
}
|
}
|
||||||
@ -4241,6 +4255,7 @@ v8_compiler_sources = [
|
|||||||
"src/compiler/simplified-operator.cc",
|
"src/compiler/simplified-operator.cc",
|
||||||
"src/compiler/state-values-utils.cc",
|
"src/compiler/state-values-utils.cc",
|
||||||
"src/compiler/store-store-elimination.cc",
|
"src/compiler/store-store-elimination.cc",
|
||||||
|
"src/compiler/turbofan-enabled.cc",
|
||||||
"src/compiler/type-cache.cc",
|
"src/compiler/type-cache.cc",
|
||||||
"src/compiler/type-narrowing-reducer.cc",
|
"src/compiler/type-narrowing-reducer.cc",
|
||||||
"src/compiler/typed-optimization.cc",
|
"src/compiler/typed-optimization.cc",
|
||||||
@ -4249,10 +4264,93 @@ v8_compiler_sources = [
|
|||||||
"src/compiler/value-numbering-reducer.cc",
|
"src/compiler/value-numbering-reducer.cc",
|
||||||
"src/compiler/verifier.cc",
|
"src/compiler/verifier.cc",
|
||||||
"src/compiler/zone-stats.cc",
|
"src/compiler/zone-stats.cc",
|
||||||
"src/utils/hex-format.cc",
|
|
||||||
"src/utils/sha-256.cc",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
if (v8_current_cpu == "x86") {
|
||||||
|
v8_compiler_sources += [
|
||||||
|
### gcmole(ia32) ###
|
||||||
|
"src/compiler/backend/ia32/code-generator-ia32.cc",
|
||||||
|
"src/compiler/backend/ia32/instruction-scheduler-ia32.cc",
|
||||||
|
"src/compiler/backend/ia32/instruction-selector-ia32.cc",
|
||||||
|
]
|
||||||
|
} else if (v8_current_cpu == "x64") {
|
||||||
|
v8_compiler_sources += [
|
||||||
|
### gcmole(x64) ###
|
||||||
|
"src/compiler/backend/x64/code-generator-x64.cc",
|
||||||
|
"src/compiler/backend/x64/instruction-scheduler-x64.cc",
|
||||||
|
"src/compiler/backend/x64/instruction-selector-x64.cc",
|
||||||
|
"src/compiler/backend/x64/unwinding-info-writer-x64.cc",
|
||||||
|
]
|
||||||
|
} else if (v8_current_cpu == "arm") {
|
||||||
|
v8_compiler_sources += [
|
||||||
|
### gcmole(arm) ###
|
||||||
|
"src/compiler/backend/arm/code-generator-arm.cc",
|
||||||
|
"src/compiler/backend/arm/instruction-scheduler-arm.cc",
|
||||||
|
"src/compiler/backend/arm/instruction-selector-arm.cc",
|
||||||
|
"src/compiler/backend/arm/unwinding-info-writer-arm.cc",
|
||||||
|
]
|
||||||
|
} else if (v8_current_cpu == "arm64") {
|
||||||
|
v8_compiler_sources += [
|
||||||
|
### gcmole(arm64) ###
|
||||||
|
"src/compiler/backend/arm64/code-generator-arm64.cc",
|
||||||
|
"src/compiler/backend/arm64/instruction-scheduler-arm64.cc",
|
||||||
|
"src/compiler/backend/arm64/instruction-selector-arm64.cc",
|
||||||
|
"src/compiler/backend/arm64/unwinding-info-writer-arm64.cc",
|
||||||
|
]
|
||||||
|
} else if (v8_current_cpu == "mips64" || v8_current_cpu == "mips64el") {
|
||||||
|
v8_compiler_sources += [
|
||||||
|
### gcmole(mips64el) ###
|
||||||
|
"src/compiler/backend/mips64/code-generator-mips64.cc",
|
||||||
|
"src/compiler/backend/mips64/instruction-scheduler-mips64.cc",
|
||||||
|
"src/compiler/backend/mips64/instruction-selector-mips64.cc",
|
||||||
|
]
|
||||||
|
} else if (v8_current_cpu == "loong64") {
|
||||||
|
v8_compiler_sources += [
|
||||||
|
### gcmole(loong64) ###
|
||||||
|
"src/compiler/backend/loong64/code-generator-loong64.cc",
|
||||||
|
"src/compiler/backend/loong64/instruction-scheduler-loong64.cc",
|
||||||
|
"src/compiler/backend/loong64/instruction-selector-loong64.cc",
|
||||||
|
]
|
||||||
|
} else if (v8_current_cpu == "ppc") {
|
||||||
|
v8_compiler_sources += [
|
||||||
|
### gcmole(ppc) ###
|
||||||
|
"src/compiler/backend/ppc/code-generator-ppc.cc",
|
||||||
|
"src/compiler/backend/ppc/instruction-scheduler-ppc.cc",
|
||||||
|
"src/compiler/backend/ppc/instruction-selector-ppc.cc",
|
||||||
|
"src/compiler/backend/ppc/unwinding-info-writer-ppc.cc",
|
||||||
|
]
|
||||||
|
} else if (v8_current_cpu == "ppc64") {
|
||||||
|
v8_compiler_sources += [
|
||||||
|
### gcmole(ppc64) ###
|
||||||
|
"src/compiler/backend/ppc/code-generator-ppc.cc",
|
||||||
|
"src/compiler/backend/ppc/instruction-scheduler-ppc.cc",
|
||||||
|
"src/compiler/backend/ppc/instruction-selector-ppc.cc",
|
||||||
|
"src/compiler/backend/ppc/unwinding-info-writer-ppc.cc",
|
||||||
|
]
|
||||||
|
} else if (v8_current_cpu == "s390" || v8_current_cpu == "s390x") {
|
||||||
|
v8_compiler_sources += [
|
||||||
|
### gcmole(s390) ###
|
||||||
|
"src/compiler/backend/s390/code-generator-s390.cc",
|
||||||
|
"src/compiler/backend/s390/instruction-scheduler-s390.cc",
|
||||||
|
"src/compiler/backend/s390/instruction-selector-s390.cc",
|
||||||
|
"src/compiler/backend/s390/unwinding-info-writer-s390.cc",
|
||||||
|
]
|
||||||
|
} else if (v8_current_cpu == "riscv64") {
|
||||||
|
v8_compiler_sources += [
|
||||||
|
### gcmole(riscv64) ###
|
||||||
|
"src/compiler/backend/riscv/code-generator-riscv.cc",
|
||||||
|
"src/compiler/backend/riscv/instruction-scheduler-riscv.cc",
|
||||||
|
"src/compiler/backend/riscv/instruction-selector-riscv64.cc",
|
||||||
|
]
|
||||||
|
} else if (v8_current_cpu == "riscv32") {
|
||||||
|
v8_compiler_sources += [
|
||||||
|
### gcmole(riscv32) ###
|
||||||
|
"src/compiler/backend/riscv/code-generator-riscv.cc",
|
||||||
|
"src/compiler/backend/riscv/instruction-scheduler-riscv.cc",
|
||||||
|
"src/compiler/backend/riscv/instruction-selector-riscv32.cc",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
if (v8_enable_webassembly) {
|
if (v8_enable_webassembly) {
|
||||||
v8_compiler_sources += [
|
v8_compiler_sources += [
|
||||||
"src/compiler/int64-lowering.cc",
|
"src/compiler/int64-lowering.cc",
|
||||||
@ -4263,6 +4361,7 @@ if (v8_enable_webassembly) {
|
|||||||
"src/compiler/wasm-gc-operator-reducer.cc",
|
"src/compiler/wasm-gc-operator-reducer.cc",
|
||||||
"src/compiler/wasm-graph-assembler.cc",
|
"src/compiler/wasm-graph-assembler.cc",
|
||||||
"src/compiler/wasm-inlining.cc",
|
"src/compiler/wasm-inlining.cc",
|
||||||
|
"src/compiler/wasm-load-elimination.cc",
|
||||||
"src/compiler/wasm-loop-peeling.cc",
|
"src/compiler/wasm-loop-peeling.cc",
|
||||||
"src/compiler/wasm-typer.cc",
|
"src/compiler/wasm-typer.cc",
|
||||||
]
|
]
|
||||||
@ -4275,8 +4374,12 @@ if (v8_enable_wasm_simd256_revec) {
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
# The src/compiler files with optimizations.
|
# The src/compiler files for use in mksnapshot.
|
||||||
v8_source_set("v8_compiler_opt") {
|
# - These might be built with additional optimizations if
|
||||||
|
# v8_enable_fast_mksnapshot is set.
|
||||||
|
# - We always include Turbofan even if v8_enable_turbofan is unset s.t.
|
||||||
|
# builtins can be generated by mksnapshot.
|
||||||
|
v8_source_set("v8_compiler_for_mksnapshot_source_set") {
|
||||||
visibility = [ ":*" ] # Only targets in this file can depend on this.
|
visibility = [ ":*" ] # Only targets in this file can depend on this.
|
||||||
|
|
||||||
sources = v8_compiler_sources
|
sources = v8_compiler_sources
|
||||||
@ -4307,11 +4410,16 @@ v8_source_set("v8_compiler_opt") {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# The src/compiler files with default optimization behavior.
|
# The src/compiler files with default behavior.
|
||||||
v8_source_set("v8_compiler") {
|
v8_source_set("v8_compiler") {
|
||||||
visibility = [ ":*" ] # Only targets in this file can depend on this.
|
visibility = [ ":*" ] # Only targets in this file can depend on this.
|
||||||
|
|
||||||
|
if (v8_enable_turbofan) {
|
||||||
sources = v8_compiler_sources
|
sources = v8_compiler_sources
|
||||||
|
} else {
|
||||||
|
# With Turbofan disabled, we only include the stubbed-out API.
|
||||||
|
sources = [ "src/compiler/turbofan-disabled.cc" ]
|
||||||
|
}
|
||||||
|
|
||||||
public_deps = [
|
public_deps = [
|
||||||
":generate_bytecode_builtins_list",
|
":generate_bytecode_builtins_list",
|
||||||
@ -4370,8 +4478,14 @@ v8_source_set("v8_turboshaft") {
|
|||||||
}
|
}
|
||||||
|
|
||||||
group("v8_compiler_for_mksnapshot") {
|
group("v8_compiler_for_mksnapshot") {
|
||||||
if (is_debug && !v8_optimized_debug && v8_enable_fast_mksnapshot) {
|
if ((is_debug && !v8_optimized_debug && v8_enable_fast_mksnapshot) ||
|
||||||
deps = [ ":v8_compiler_opt" ]
|
!v8_enable_turbofan) {
|
||||||
|
# mksnapshot needs its own version of the compiler, either because
|
||||||
|
# a) we're optimizing for mksnapshot execution speed and the compiler
|
||||||
|
# should be optimized even if the rest of V8 is not; or
|
||||||
|
# b) Turbofan is disabled and thus not compiled into the rest of V8, yet
|
||||||
|
# mksnapshot still needs TF to generate builtins.
|
||||||
|
deps = [ ":v8_compiler_for_mksnapshot_source_set" ]
|
||||||
} else {
|
} else {
|
||||||
deps = [ ":v8_compiler" ]
|
deps = [ ":v8_compiler" ]
|
||||||
}
|
}
|
||||||
@ -4390,7 +4504,11 @@ group("v8_tracing") {
|
|||||||
}
|
}
|
||||||
|
|
||||||
v8_source_set("v8_base_without_compiler") {
|
v8_source_set("v8_base_without_compiler") {
|
||||||
visibility = [ ":*" ] # Only targets in this file can depend on this.
|
# Only targets in this file and gcmole can depend on this.
|
||||||
|
visibility = [
|
||||||
|
":*",
|
||||||
|
"tools/gcmole/:*",
|
||||||
|
]
|
||||||
|
|
||||||
# Split static libraries on windows into two.
|
# Split static libraries on windows into two.
|
||||||
split_count = 2
|
split_count = 2
|
||||||
@ -4444,7 +4562,6 @@ v8_source_set("v8_base_without_compiler") {
|
|||||||
"src/builtins/builtins-trace.cc",
|
"src/builtins/builtins-trace.cc",
|
||||||
"src/builtins/builtins-typed-array.cc",
|
"src/builtins/builtins-typed-array.cc",
|
||||||
"src/builtins/builtins-weak-refs.cc",
|
"src/builtins/builtins-weak-refs.cc",
|
||||||
"src/builtins/builtins-web-snapshots.cc",
|
|
||||||
"src/builtins/builtins.cc",
|
"src/builtins/builtins.cc",
|
||||||
"src/builtins/constants-table-builder.cc",
|
"src/builtins/constants-table-builder.cc",
|
||||||
"src/codegen/aligned-slot-allocator.cc",
|
"src/codegen/aligned-slot-allocator.cc",
|
||||||
@ -4558,7 +4675,6 @@ v8_source_set("v8_base_without_compiler") {
|
|||||||
"src/heap/cppgc-js/unified-heap-marking-state.cc",
|
"src/heap/cppgc-js/unified-heap-marking-state.cc",
|
||||||
"src/heap/cppgc-js/unified-heap-marking-verifier.cc",
|
"src/heap/cppgc-js/unified-heap-marking-verifier.cc",
|
||||||
"src/heap/cppgc-js/unified-heap-marking-visitor.cc",
|
"src/heap/cppgc-js/unified-heap-marking-visitor.cc",
|
||||||
"src/heap/embedder-tracing.cc",
|
|
||||||
"src/heap/evacuation-verifier.cc",
|
"src/heap/evacuation-verifier.cc",
|
||||||
"src/heap/factory-base.cc",
|
"src/heap/factory-base.cc",
|
||||||
"src/heap/factory.cc",
|
"src/heap/factory.cc",
|
||||||
@ -4679,6 +4795,7 @@ v8_source_set("v8_base_without_compiler") {
|
|||||||
"src/objects/js-segment-iterator.cc",
|
"src/objects/js-segment-iterator.cc",
|
||||||
"src/objects/js-segmenter.cc",
|
"src/objects/js-segmenter.cc",
|
||||||
"src/objects/js-segments.cc",
|
"src/objects/js-segments.cc",
|
||||||
|
"src/objects/js-struct.cc",
|
||||||
"src/objects/js-temporal-objects.cc",
|
"src/objects/js-temporal-objects.cc",
|
||||||
"src/objects/keys.cc",
|
"src/objects/keys.cc",
|
||||||
"src/objects/literal-objects.cc",
|
"src/objects/literal-objects.cc",
|
||||||
@ -4831,13 +4948,13 @@ v8_source_set("v8_base_without_compiler") {
|
|||||||
"src/utils/allocation.cc",
|
"src/utils/allocation.cc",
|
||||||
"src/utils/bit-vector.cc",
|
"src/utils/bit-vector.cc",
|
||||||
"src/utils/detachable-vector.cc",
|
"src/utils/detachable-vector.cc",
|
||||||
|
"src/utils/hex-format.cc",
|
||||||
"src/utils/identity-map.cc",
|
"src/utils/identity-map.cc",
|
||||||
"src/utils/memcopy.cc",
|
"src/utils/memcopy.cc",
|
||||||
"src/utils/ostreams.cc",
|
"src/utils/ostreams.cc",
|
||||||
|
"src/utils/sha-256.cc",
|
||||||
"src/utils/utils.cc",
|
"src/utils/utils.cc",
|
||||||
"src/utils/version.cc",
|
"src/utils/version.cc",
|
||||||
"src/web-snapshot/web-snapshot.cc",
|
|
||||||
"src/web-snapshot/web-snapshot.h",
|
|
||||||
"src/zone/accounting-allocator.cc",
|
"src/zone/accounting-allocator.cc",
|
||||||
"src/zone/type-stats.cc",
|
"src/zone/type-stats.cc",
|
||||||
"src/zone/zone-segment.cc",
|
"src/zone/zone-segment.cc",
|
||||||
@ -4966,9 +5083,6 @@ v8_source_set("v8_base_without_compiler") {
|
|||||||
"src/codegen/ia32/cpu-ia32.cc",
|
"src/codegen/ia32/cpu-ia32.cc",
|
||||||
"src/codegen/ia32/macro-assembler-ia32.cc",
|
"src/codegen/ia32/macro-assembler-ia32.cc",
|
||||||
"src/codegen/shared-ia32-x64/macro-assembler-shared-ia32-x64.cc",
|
"src/codegen/shared-ia32-x64/macro-assembler-shared-ia32-x64.cc",
|
||||||
"src/compiler/backend/ia32/code-generator-ia32.cc",
|
|
||||||
"src/compiler/backend/ia32/instruction-scheduler-ia32.cc",
|
|
||||||
"src/compiler/backend/ia32/instruction-selector-ia32.cc",
|
|
||||||
"src/deoptimizer/ia32/deoptimizer-ia32.cc",
|
"src/deoptimizer/ia32/deoptimizer-ia32.cc",
|
||||||
"src/diagnostics/ia32/disasm-ia32.cc",
|
"src/diagnostics/ia32/disasm-ia32.cc",
|
||||||
"src/diagnostics/ia32/unwinder-ia32.cc",
|
"src/diagnostics/ia32/unwinder-ia32.cc",
|
||||||
@ -4982,10 +5096,6 @@ v8_source_set("v8_base_without_compiler") {
|
|||||||
"src/codegen/x64/assembler-x64.cc",
|
"src/codegen/x64/assembler-x64.cc",
|
||||||
"src/codegen/x64/cpu-x64.cc",
|
"src/codegen/x64/cpu-x64.cc",
|
||||||
"src/codegen/x64/macro-assembler-x64.cc",
|
"src/codegen/x64/macro-assembler-x64.cc",
|
||||||
"src/compiler/backend/x64/code-generator-x64.cc",
|
|
||||||
"src/compiler/backend/x64/instruction-scheduler-x64.cc",
|
|
||||||
"src/compiler/backend/x64/instruction-selector-x64.cc",
|
|
||||||
"src/compiler/backend/x64/unwinding-info-writer-x64.cc",
|
|
||||||
"src/deoptimizer/x64/deoptimizer-x64.cc",
|
"src/deoptimizer/x64/deoptimizer-x64.cc",
|
||||||
"src/diagnostics/x64/disasm-x64.cc",
|
"src/diagnostics/x64/disasm-x64.cc",
|
||||||
"src/diagnostics/x64/eh-frame-x64.cc",
|
"src/diagnostics/x64/eh-frame-x64.cc",
|
||||||
@ -5021,10 +5131,6 @@ v8_source_set("v8_base_without_compiler") {
|
|||||||
"src/codegen/arm/constants-arm.cc",
|
"src/codegen/arm/constants-arm.cc",
|
||||||
"src/codegen/arm/cpu-arm.cc",
|
"src/codegen/arm/cpu-arm.cc",
|
||||||
"src/codegen/arm/macro-assembler-arm.cc",
|
"src/codegen/arm/macro-assembler-arm.cc",
|
||||||
"src/compiler/backend/arm/code-generator-arm.cc",
|
|
||||||
"src/compiler/backend/arm/instruction-scheduler-arm.cc",
|
|
||||||
"src/compiler/backend/arm/instruction-selector-arm.cc",
|
|
||||||
"src/compiler/backend/arm/unwinding-info-writer-arm.cc",
|
|
||||||
"src/deoptimizer/arm/deoptimizer-arm.cc",
|
"src/deoptimizer/arm/deoptimizer-arm.cc",
|
||||||
"src/diagnostics/arm/disasm-arm.cc",
|
"src/diagnostics/arm/disasm-arm.cc",
|
||||||
"src/diagnostics/arm/eh-frame-arm.cc",
|
"src/diagnostics/arm/eh-frame-arm.cc",
|
||||||
@ -5044,10 +5150,6 @@ v8_source_set("v8_base_without_compiler") {
|
|||||||
"src/codegen/arm64/macro-assembler-arm64.cc",
|
"src/codegen/arm64/macro-assembler-arm64.cc",
|
||||||
"src/codegen/arm64/register-arm64.cc",
|
"src/codegen/arm64/register-arm64.cc",
|
||||||
"src/codegen/arm64/utils-arm64.cc",
|
"src/codegen/arm64/utils-arm64.cc",
|
||||||
"src/compiler/backend/arm64/code-generator-arm64.cc",
|
|
||||||
"src/compiler/backend/arm64/instruction-scheduler-arm64.cc",
|
|
||||||
"src/compiler/backend/arm64/instruction-selector-arm64.cc",
|
|
||||||
"src/compiler/backend/arm64/unwinding-info-writer-arm64.cc",
|
|
||||||
"src/deoptimizer/arm64/deoptimizer-arm64.cc",
|
"src/deoptimizer/arm64/deoptimizer-arm64.cc",
|
||||||
"src/diagnostics/arm64/disasm-arm64.cc",
|
"src/diagnostics/arm64/disasm-arm64.cc",
|
||||||
"src/diagnostics/arm64/eh-frame-arm64.cc",
|
"src/diagnostics/arm64/eh-frame-arm64.cc",
|
||||||
@ -5089,9 +5191,6 @@ v8_source_set("v8_base_without_compiler") {
|
|||||||
"src/codegen/mips64/cpu-mips64.cc",
|
"src/codegen/mips64/cpu-mips64.cc",
|
||||||
"src/codegen/mips64/interface-descriptors-mips64-inl.h",
|
"src/codegen/mips64/interface-descriptors-mips64-inl.h",
|
||||||
"src/codegen/mips64/macro-assembler-mips64.cc",
|
"src/codegen/mips64/macro-assembler-mips64.cc",
|
||||||
"src/compiler/backend/mips64/code-generator-mips64.cc",
|
|
||||||
"src/compiler/backend/mips64/instruction-scheduler-mips64.cc",
|
|
||||||
"src/compiler/backend/mips64/instruction-selector-mips64.cc",
|
|
||||||
"src/deoptimizer/mips64/deoptimizer-mips64.cc",
|
"src/deoptimizer/mips64/deoptimizer-mips64.cc",
|
||||||
"src/diagnostics/mips64/disasm-mips64.cc",
|
"src/diagnostics/mips64/disasm-mips64.cc",
|
||||||
"src/diagnostics/mips64/unwinder-mips64.cc",
|
"src/diagnostics/mips64/unwinder-mips64.cc",
|
||||||
@ -5107,9 +5206,6 @@ v8_source_set("v8_base_without_compiler") {
|
|||||||
"src/codegen/loong64/cpu-loong64.cc",
|
"src/codegen/loong64/cpu-loong64.cc",
|
||||||
"src/codegen/loong64/interface-descriptors-loong64-inl.h",
|
"src/codegen/loong64/interface-descriptors-loong64-inl.h",
|
||||||
"src/codegen/loong64/macro-assembler-loong64.cc",
|
"src/codegen/loong64/macro-assembler-loong64.cc",
|
||||||
"src/compiler/backend/loong64/code-generator-loong64.cc",
|
|
||||||
"src/compiler/backend/loong64/instruction-scheduler-loong64.cc",
|
|
||||||
"src/compiler/backend/loong64/instruction-selector-loong64.cc",
|
|
||||||
"src/deoptimizer/loong64/deoptimizer-loong64.cc",
|
"src/deoptimizer/loong64/deoptimizer-loong64.cc",
|
||||||
"src/diagnostics/loong64/disasm-loong64.cc",
|
"src/diagnostics/loong64/disasm-loong64.cc",
|
||||||
"src/diagnostics/loong64/unwinder-loong64.cc",
|
"src/diagnostics/loong64/unwinder-loong64.cc",
|
||||||
@ -5124,10 +5220,6 @@ v8_source_set("v8_base_without_compiler") {
|
|||||||
"src/codegen/ppc/constants-ppc.cc",
|
"src/codegen/ppc/constants-ppc.cc",
|
||||||
"src/codegen/ppc/cpu-ppc.cc",
|
"src/codegen/ppc/cpu-ppc.cc",
|
||||||
"src/codegen/ppc/macro-assembler-ppc.cc",
|
"src/codegen/ppc/macro-assembler-ppc.cc",
|
||||||
"src/compiler/backend/ppc/code-generator-ppc.cc",
|
|
||||||
"src/compiler/backend/ppc/instruction-scheduler-ppc.cc",
|
|
||||||
"src/compiler/backend/ppc/instruction-selector-ppc.cc",
|
|
||||||
"src/compiler/backend/ppc/unwinding-info-writer-ppc.cc",
|
|
||||||
"src/deoptimizer/ppc/deoptimizer-ppc.cc",
|
"src/deoptimizer/ppc/deoptimizer-ppc.cc",
|
||||||
"src/diagnostics/ppc/disasm-ppc.cc",
|
"src/diagnostics/ppc/disasm-ppc.cc",
|
||||||
"src/diagnostics/ppc/eh-frame-ppc.cc",
|
"src/diagnostics/ppc/eh-frame-ppc.cc",
|
||||||
@ -5143,10 +5235,6 @@ v8_source_set("v8_base_without_compiler") {
|
|||||||
"src/codegen/ppc/constants-ppc.cc",
|
"src/codegen/ppc/constants-ppc.cc",
|
||||||
"src/codegen/ppc/cpu-ppc.cc",
|
"src/codegen/ppc/cpu-ppc.cc",
|
||||||
"src/codegen/ppc/macro-assembler-ppc.cc",
|
"src/codegen/ppc/macro-assembler-ppc.cc",
|
||||||
"src/compiler/backend/ppc/code-generator-ppc.cc",
|
|
||||||
"src/compiler/backend/ppc/instruction-scheduler-ppc.cc",
|
|
||||||
"src/compiler/backend/ppc/instruction-selector-ppc.cc",
|
|
||||||
"src/compiler/backend/ppc/unwinding-info-writer-ppc.cc",
|
|
||||||
"src/deoptimizer/ppc/deoptimizer-ppc.cc",
|
"src/deoptimizer/ppc/deoptimizer-ppc.cc",
|
||||||
"src/diagnostics/ppc/disasm-ppc.cc",
|
"src/diagnostics/ppc/disasm-ppc.cc",
|
||||||
"src/diagnostics/ppc/eh-frame-ppc.cc",
|
"src/diagnostics/ppc/eh-frame-ppc.cc",
|
||||||
@ -5162,10 +5250,6 @@ v8_source_set("v8_base_without_compiler") {
|
|||||||
"src/codegen/s390/constants-s390.cc",
|
"src/codegen/s390/constants-s390.cc",
|
||||||
"src/codegen/s390/cpu-s390.cc",
|
"src/codegen/s390/cpu-s390.cc",
|
||||||
"src/codegen/s390/macro-assembler-s390.cc",
|
"src/codegen/s390/macro-assembler-s390.cc",
|
||||||
"src/compiler/backend/s390/code-generator-s390.cc",
|
|
||||||
"src/compiler/backend/s390/instruction-scheduler-s390.cc",
|
|
||||||
"src/compiler/backend/s390/instruction-selector-s390.cc",
|
|
||||||
"src/compiler/backend/s390/unwinding-info-writer-s390.cc",
|
|
||||||
"src/deoptimizer/s390/deoptimizer-s390.cc",
|
"src/deoptimizer/s390/deoptimizer-s390.cc",
|
||||||
"src/diagnostics/s390/disasm-s390.cc",
|
"src/diagnostics/s390/disasm-s390.cc",
|
||||||
"src/diagnostics/s390/eh-frame-s390.cc",
|
"src/diagnostics/s390/eh-frame-s390.cc",
|
||||||
@ -5191,9 +5275,6 @@ v8_source_set("v8_base_without_compiler") {
|
|||||||
"src/codegen/riscv/extension-riscv-zicsr.cc",
|
"src/codegen/riscv/extension-riscv-zicsr.cc",
|
||||||
"src/codegen/riscv/extension-riscv-zifencei.cc",
|
"src/codegen/riscv/extension-riscv-zifencei.cc",
|
||||||
"src/codegen/riscv/macro-assembler-riscv.cc",
|
"src/codegen/riscv/macro-assembler-riscv.cc",
|
||||||
"src/compiler/backend/riscv/code-generator-riscv.cc",
|
|
||||||
"src/compiler/backend/riscv/instruction-scheduler-riscv.cc",
|
|
||||||
"src/compiler/backend/riscv/instruction-selector-riscv64.cc",
|
|
||||||
"src/deoptimizer/riscv/deoptimizer-riscv.cc",
|
"src/deoptimizer/riscv/deoptimizer-riscv.cc",
|
||||||
"src/diagnostics/riscv/disasm-riscv.cc",
|
"src/diagnostics/riscv/disasm-riscv.cc",
|
||||||
"src/diagnostics/riscv/unwinder-riscv.cc",
|
"src/diagnostics/riscv/unwinder-riscv.cc",
|
||||||
@ -5218,9 +5299,6 @@ v8_source_set("v8_base_without_compiler") {
|
|||||||
"src/codegen/riscv/extension-riscv-zicsr.cc",
|
"src/codegen/riscv/extension-riscv-zicsr.cc",
|
||||||
"src/codegen/riscv/extension-riscv-zifencei.cc",
|
"src/codegen/riscv/extension-riscv-zifencei.cc",
|
||||||
"src/codegen/riscv/macro-assembler-riscv.cc",
|
"src/codegen/riscv/macro-assembler-riscv.cc",
|
||||||
"src/compiler/backend/riscv/code-generator-riscv.cc",
|
|
||||||
"src/compiler/backend/riscv/instruction-scheduler-riscv.cc",
|
|
||||||
"src/compiler/backend/riscv/instruction-selector-riscv32.cc",
|
|
||||||
"src/deoptimizer/riscv/deoptimizer-riscv.cc",
|
"src/deoptimizer/riscv/deoptimizer-riscv.cc",
|
||||||
"src/diagnostics/riscv/disasm-riscv.cc",
|
"src/diagnostics/riscv/disasm-riscv.cc",
|
||||||
"src/diagnostics/riscv/unwinder-riscv.cc",
|
"src/diagnostics/riscv/unwinder-riscv.cc",
|
||||||
@ -5341,8 +5419,11 @@ group("v8_base") {
|
|||||||
public_deps = [
|
public_deps = [
|
||||||
":v8_base_without_compiler",
|
":v8_base_without_compiler",
|
||||||
":v8_compiler",
|
":v8_compiler",
|
||||||
":v8_turboshaft",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
if (v8_enable_turbofan) {
|
||||||
|
public_deps += [ ":v8_turboshaft" ]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
v8_source_set("torque_base") {
|
v8_source_set("torque_base") {
|
||||||
@ -5908,31 +5989,31 @@ v8_source_set("v8_heap_base") {
|
|||||||
|
|
||||||
if (is_clang || !is_win) {
|
if (is_clang || !is_win) {
|
||||||
if (current_cpu == "x64") {
|
if (current_cpu == "x64") {
|
||||||
sources += [ "src/heap/base/asm/x64/save_registers_asm.cc" ]
|
sources += [ "src/heap/base/asm/x64/push_registers_asm.cc" ]
|
||||||
} else if (current_cpu == "x86") {
|
} else if (current_cpu == "x86") {
|
||||||
sources += [ "src/heap/base/asm/ia32/save_registers_asm.cc" ]
|
sources += [ "src/heap/base/asm/ia32/push_registers_asm.cc" ]
|
||||||
} else if (current_cpu == "arm") {
|
} else if (current_cpu == "arm") {
|
||||||
sources += [ "src/heap/base/asm/arm/save_registers_asm.cc" ]
|
sources += [ "src/heap/base/asm/arm/push_registers_asm.cc" ]
|
||||||
} else if (current_cpu == "arm64") {
|
} else if (current_cpu == "arm64") {
|
||||||
sources += [ "src/heap/base/asm/arm64/save_registers_asm.cc" ]
|
sources += [ "src/heap/base/asm/arm64/push_registers_asm.cc" ]
|
||||||
} else if (current_cpu == "ppc64") {
|
} else if (current_cpu == "ppc64") {
|
||||||
sources += [ "src/heap/base/asm/ppc/save_registers_asm.cc" ]
|
sources += [ "src/heap/base/asm/ppc/push_registers_asm.cc" ]
|
||||||
} else if (current_cpu == "s390x") {
|
} else if (current_cpu == "s390x") {
|
||||||
sources += [ "src/heap/base/asm/s390/save_registers_asm.cc" ]
|
sources += [ "src/heap/base/asm/s390/push_registers_asm.cc" ]
|
||||||
} else if (current_cpu == "mips64el") {
|
} else if (current_cpu == "mips64el") {
|
||||||
sources += [ "src/heap/base/asm/mips64/save_registers_asm.cc" ]
|
sources += [ "src/heap/base/asm/mips64/push_registers_asm.cc" ]
|
||||||
} else if (current_cpu == "loong64") {
|
} else if (current_cpu == "loong64") {
|
||||||
sources += [ "src/heap/base/asm/loong64/save_registers_asm.cc" ]
|
sources += [ "src/heap/base/asm/loong64/push_registers_asm.cc" ]
|
||||||
} else if (current_cpu == "riscv64" || current_cpu == "riscv32") {
|
} else if (current_cpu == "riscv64" || current_cpu == "riscv32") {
|
||||||
sources += [ "src/heap/base/asm/riscv/save_registers_asm.cc" ]
|
sources += [ "src/heap/base/asm/riscv/push_registers_asm.cc" ]
|
||||||
}
|
}
|
||||||
} else if (is_win) {
|
} else if (is_win) {
|
||||||
if (current_cpu == "x64") {
|
if (current_cpu == "x64") {
|
||||||
sources += [ "src/heap/base/asm/x64/save_registers_masm.asm" ]
|
sources += [ "src/heap/base/asm/x64/push_registers_masm.asm" ]
|
||||||
} else if (current_cpu == "x86") {
|
} else if (current_cpu == "x86") {
|
||||||
sources += [ "src/heap/base/asm/ia32/save_registers_masm.asm" ]
|
sources += [ "src/heap/base/asm/ia32/push_registers_masm.asm" ]
|
||||||
} else if (current_cpu == "arm64") {
|
} else if (current_cpu == "arm64") {
|
||||||
sources += [ "src/heap/base/asm/arm64/save_registers_masm.S" ]
|
sources += [ "src/heap/base/asm/arm64/push_registers_masm.S" ]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6548,10 +6629,14 @@ if (is_component_build) {
|
|||||||
":torque_ls_base",
|
":torque_ls_base",
|
||||||
":v8_base",
|
":v8_base",
|
||||||
":v8_headers",
|
":v8_headers",
|
||||||
":v8_initializers",
|
|
||||||
":v8_snapshot",
|
":v8_snapshot",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
if (v8_enable_turbofan) {
|
||||||
|
# For cctest/test-serialize.
|
||||||
|
public_deps += [ ":v8_initializers" ]
|
||||||
|
}
|
||||||
|
|
||||||
configs = [ ":internal_config" ]
|
configs = [ ":internal_config" ]
|
||||||
|
|
||||||
public_configs = [ ":external_config" ]
|
public_configs = [ ":external_config" ]
|
||||||
@ -6604,10 +6689,14 @@ if (is_component_build) {
|
|||||||
":torque_base",
|
":torque_base",
|
||||||
":torque_ls_base",
|
":torque_ls_base",
|
||||||
":v8_base",
|
":v8_base",
|
||||||
":v8_initializers",
|
|
||||||
":v8_snapshot",
|
":v8_snapshot",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
if (v8_enable_turbofan) {
|
||||||
|
# For cctest/test-serialize.
|
||||||
|
public_deps += [ ":v8_initializers" ]
|
||||||
|
}
|
||||||
|
|
||||||
public_configs = [ ":external_config" ]
|
public_configs = [ ":external_config" ]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
55
DEPS
55
DEPS
@ -39,6 +39,9 @@ vars = {
|
|||||||
# Fetch clang-tidy into the same bin/ directory as our clang binary.
|
# Fetch clang-tidy into the same bin/ directory as our clang binary.
|
||||||
'checkout_clang_tidy': False,
|
'checkout_clang_tidy': False,
|
||||||
|
|
||||||
|
# Fetch and build V8 builtins with PGO profiles
|
||||||
|
'checkout_v8_builtins_pgo_profiles': False,
|
||||||
|
|
||||||
'chromium_url': 'https://chromium.googlesource.com',
|
'chromium_url': 'https://chromium.googlesource.com',
|
||||||
'android_url': 'https://android.googlesource.com',
|
'android_url': 'https://android.googlesource.com',
|
||||||
'download_gcmole': False,
|
'download_gcmole': False,
|
||||||
@ -50,22 +53,22 @@ vars = {
|
|||||||
'fuchsia_sdk_cipd_prefix': 'fuchsia/sdk/gn/',
|
'fuchsia_sdk_cipd_prefix': 'fuchsia/sdk/gn/',
|
||||||
|
|
||||||
# reclient CIPD package version
|
# reclient CIPD package version
|
||||||
'reclient_version': 're_client_version:0.87.0.b6908b3-gomaip',
|
'reclient_version': 're_client_version:0.93.0.9ed3cef-gomaip',
|
||||||
|
|
||||||
# GN CIPD package version.
|
# GN CIPD package version.
|
||||||
'gn_version': 'git_revision:5e19d2fb166fbd4f6f32147fbb2f497091a54ad8',
|
'gn_version': 'git_revision:84c8431f3e03cc6226c59dd49637c15ea31169a1',
|
||||||
|
|
||||||
# ninja CIPD package version
|
# ninja CIPD package version
|
||||||
# https://chrome-infra-packages.appspot.com/p/infra/3pp/tools/ninja
|
# https://chrome-infra-packages.appspot.com/p/infra/3pp/tools/ninja
|
||||||
'ninja_version': 'version:2@1.8.2.chromium.3',
|
'ninja_version': 'version:2@1.11.1.chromium.6',
|
||||||
|
|
||||||
# luci-go CIPD package version.
|
# luci-go CIPD package version.
|
||||||
'luci_go': 'git_revision:bac571b5399502fa16ac48a1d3820e1117505085',
|
'luci_go': 'git_revision:c41d94e382727fc5276cd2771741990543fce337',
|
||||||
|
|
||||||
# Three lines of non-changing comments so that
|
# Three lines of non-changing comments so that
|
||||||
# the commit queue can handle CLs rolling Fuchsia sdk
|
# the commit queue can handle CLs rolling Fuchsia sdk
|
||||||
# and whatever else without interference from each other.
|
# and whatever else without interference from each other.
|
||||||
'fuchsia_version': 'version:11.20221219.3.1',
|
'fuchsia_version': 'version:11.20230131.1.1',
|
||||||
|
|
||||||
# Three lines of non-changing comments so that
|
# Three lines of non-changing comments so that
|
||||||
# the commit queue can handle CLs rolling android_sdk_build-tools_version
|
# the commit queue can handle CLs rolling android_sdk_build-tools_version
|
||||||
@ -98,18 +101,18 @@ vars = {
|
|||||||
# Three lines of non-changing comments so that
|
# Three lines of non-changing comments so that
|
||||||
# the commit queue can handle CLs rolling android_sdk_tools-lint_version
|
# the commit queue can handle CLs rolling android_sdk_tools-lint_version
|
||||||
# and whatever else without interference from each other.
|
# and whatever else without interference from each other.
|
||||||
'android_sdk_cmdline-tools_version': 'oWlET2yQhaPKQ66tYNuSPaueU78Z9VlxpyxOoUjwRuIC',
|
'android_sdk_cmdline-tools_version': '3Yn5Sn7BMObm8gsoZCF0loJMKg9_PpgU07G9DObCLdQC',
|
||||||
}
|
}
|
||||||
|
|
||||||
deps = {
|
deps = {
|
||||||
'base/trace_event/common':
|
'base/trace_event/common':
|
||||||
Var('chromium_url') + '/chromium/src/base/trace_event/common.git' + '@' + '521ac34ebd795939c7e16b37d9d3ddb40e8ed556',
|
Var('chromium_url') + '/chromium/src/base/trace_event/common.git' + '@' + '68e6038b5350cba18c341cc7c572170af5c5b20c',
|
||||||
'build':
|
'build':
|
||||||
Var('chromium_url') + '/chromium/src/build.git' + '@' + '8b3f1346a4f7f3b89c938e537a9be0e2120a9535',
|
Var('chromium_url') + '/chromium/src/build.git' + '@' + 'e0df145ecb560e48381b6dccf3b9c8b31aa95bcd',
|
||||||
'buildtools':
|
'buildtools':
|
||||||
Var('chromium_url') + '/chromium/src/buildtools.git' + '@' + '600a61514a682cdda7952a3ef8c75acd9487fa6b',
|
Var('chromium_url') + '/chromium/src/buildtools.git' + '@' + '295c6e5037e358904aef73a21409896d58547ba6',
|
||||||
'buildtools/clang_format/script':
|
'buildtools/clang_format/script':
|
||||||
Var('chromium_url') + '/external/github.com/llvm/llvm-project/clang/tools/clang-format.git' + '@' + '8b525d2747f2584fc35d8c7e612e66f377858df7',
|
Var('chromium_url') + '/external/github.com/llvm/llvm-project/clang/tools/clang-format.git' + '@' + 'f97059df7f8b205064625cdb5f97b56668a125ef',
|
||||||
'buildtools/linux64': {
|
'buildtools/linux64': {
|
||||||
'packages': [
|
'packages': [
|
||||||
{
|
{
|
||||||
@ -131,11 +134,11 @@ deps = {
|
|||||||
'condition': 'host_os == "mac"',
|
'condition': 'host_os == "mac"',
|
||||||
},
|
},
|
||||||
'buildtools/third_party/libc++/trunk':
|
'buildtools/third_party/libc++/trunk':
|
||||||
Var('chromium_url') + '/external/github.com/llvm/llvm-project/libcxx.git' + '@' + '7b20455cbdf0891a6e5e2b66609b08c4f407ae5f',
|
Var('chromium_url') + '/external/github.com/llvm/llvm-project/libcxx.git' + '@' + '59bae40d835ae4eabaddbef781f5e3b778dd7907',
|
||||||
'buildtools/third_party/libc++abi/trunk':
|
'buildtools/third_party/libc++abi/trunk':
|
||||||
Var('chromium_url') + '/external/github.com/llvm/llvm-project/libcxxabi.git' + '@' + '123239cdb67b3d69c5af933e364a84019a33575c',
|
Var('chromium_url') + '/external/github.com/llvm/llvm-project/libcxxabi.git' + '@' + 'b74d7716111d7eda5c03cb8f5dfc940e1c2c0030',
|
||||||
'buildtools/third_party/libunwind/trunk':
|
'buildtools/third_party/libunwind/trunk':
|
||||||
Var('chromium_url') + '/external/github.com/llvm/llvm-project/libunwind.git' + '@' + '5e22a7fe2335161ab267867c8e1be481bf6c8300',
|
Var('chromium_url') + '/external/github.com/llvm/llvm-project/libunwind.git' + '@' + 'e95b94b74d26f8387d4fb03a687a2fab0ed8e91c',
|
||||||
'buildtools/win': {
|
'buildtools/win': {
|
||||||
'packages': [
|
'packages': [
|
||||||
{
|
{
|
||||||
@ -154,14 +157,14 @@ deps = {
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
'dep_type': 'cipd',
|
'dep_type': 'cipd',
|
||||||
'condition': '(host_os == "linux" or host_os == "mac" or host_os == "win") and host_cpu != "s390" and host_cpu != "ppc"',
|
'condition': '(host_os == "linux" or host_os == "mac" or host_os == "win") and host_cpu != "s390" and host_cpu != "ppc" and host_cpu != "arm64"',
|
||||||
},
|
},
|
||||||
'test/benchmarks/data':
|
'test/benchmarks/data':
|
||||||
Var('chromium_url') + '/v8/deps/third_party/benchmarks.git' + '@' + '05d7188267b4560491ff9155c5ee13e207ecd65f',
|
Var('chromium_url') + '/v8/deps/third_party/benchmarks.git' + '@' + '05d7188267b4560491ff9155c5ee13e207ecd65f',
|
||||||
'test/mozilla/data':
|
'test/mozilla/data':
|
||||||
Var('chromium_url') + '/v8/deps/third_party/mozilla-tests.git' + '@' + 'f6c578a10ea707b1a8ab0b88943fe5115ce2b9be',
|
Var('chromium_url') + '/v8/deps/third_party/mozilla-tests.git' + '@' + 'f6c578a10ea707b1a8ab0b88943fe5115ce2b9be',
|
||||||
'test/test262/data':
|
'test/test262/data':
|
||||||
Var('chromium_url') + '/external/github.com/tc39/test262.git' + '@' + 'e6c6460a5b94e32e01ce9a9d236f3148d4648ce5',
|
Var('chromium_url') + '/external/github.com/tc39/test262.git' + '@' + 'f00d4118dba5d266d1611ba2cd4e995d3e4b523a',
|
||||||
'third_party/android_ndk': {
|
'third_party/android_ndk': {
|
||||||
'url': Var('chromium_url') + '/android_ndk.git' + '@' + '8388a2be5421311dc75c5f937aae13d821a27f3d',
|
'url': Var('chromium_url') + '/android_ndk.git' + '@' + '8388a2be5421311dc75c5f937aae13d821a27f3d',
|
||||||
'condition': 'checkout_android',
|
'condition': 'checkout_android',
|
||||||
@ -209,7 +212,7 @@ deps = {
|
|||||||
'dep_type': 'cipd',
|
'dep_type': 'cipd',
|
||||||
},
|
},
|
||||||
'third_party/catapult': {
|
'third_party/catapult': {
|
||||||
'url': Var('chromium_url') + '/catapult.git' + '@' + '1e4341629217ba4a71a976d9c173d13f7c4e63a4',
|
'url': Var('chromium_url') + '/catapult.git' + '@' + '5a468ccd919e16a29bb3121e3c90f27bf8745942',
|
||||||
'condition': 'checkout_android',
|
'condition': 'checkout_android',
|
||||||
},
|
},
|
||||||
'third_party/colorama/src': {
|
'third_party/colorama/src': {
|
||||||
@ -217,7 +220,7 @@ deps = {
|
|||||||
'condition': 'checkout_android',
|
'condition': 'checkout_android',
|
||||||
},
|
},
|
||||||
'third_party/depot_tools':
|
'third_party/depot_tools':
|
||||||
Var('chromium_url') + '/chromium/tools/depot_tools.git' + '@' + '5decb175432cb284b6f8ee102dc1b908b58d8e41',
|
Var('chromium_url') + '/chromium/tools/depot_tools.git' + '@' + '3d072ab6fb49fd3d2116a41cee66d47c3d409299',
|
||||||
'third_party/fuchsia-sdk/sdk': {
|
'third_party/fuchsia-sdk/sdk': {
|
||||||
'packages': [
|
'packages': [
|
||||||
{
|
{
|
||||||
@ -234,7 +237,7 @@ deps = {
|
|||||||
'third_party/googletest/src':
|
'third_party/googletest/src':
|
||||||
Var('chromium_url') + '/external/github.com/google/googletest.git' + '@' + 'af29db7ec28d6df1c7f0f745186884091e602e07',
|
Var('chromium_url') + '/external/github.com/google/googletest.git' + '@' + 'af29db7ec28d6df1c7f0f745186884091e602e07',
|
||||||
'third_party/icu':
|
'third_party/icu':
|
||||||
Var('chromium_url') + '/chromium/deps/icu.git' + '@' + '1b7d391f0528fb3a4976b7541b387ee04f915f83',
|
Var('chromium_url') + '/chromium/deps/icu.git' + '@' + '2c51e5cc7e0a06cd4cd7cb2ddbac445af9b475ba',
|
||||||
'third_party/instrumented_libraries':
|
'third_party/instrumented_libraries':
|
||||||
Var('chromium_url') + '/chromium/src/third_party/instrumented_libraries.git' + '@' + '09ba70cfb2c0d01c60684660e357ae200caf2968',
|
Var('chromium_url') + '/chromium/src/third_party/instrumented_libraries.git' + '@' + '09ba70cfb2c0d01c60684660e357ae200caf2968',
|
||||||
'third_party/ittapi': {
|
'third_party/ittapi': {
|
||||||
@ -244,7 +247,7 @@ deps = {
|
|||||||
'condition': "checkout_ittapi or check_v8_header_includes",
|
'condition': "checkout_ittapi or check_v8_header_includes",
|
||||||
},
|
},
|
||||||
'third_party/jinja2':
|
'third_party/jinja2':
|
||||||
Var('chromium_url') + '/chromium/src/third_party/jinja2.git' + '@' + '4633bf431193690c3491244f5a0acbe9ac776233',
|
Var('chromium_url') + '/chromium/src/third_party/jinja2.git' + '@' + '264c07d7e64f2874434a3b8039e101ddf1b01e7e',
|
||||||
'third_party/jsoncpp/source':
|
'third_party/jsoncpp/source':
|
||||||
Var('chromium_url') + '/external/github.com/open-source-parsers/jsoncpp.git'+ '@' + '42e892d96e47b1f6e29844cc705e148ec4856448',
|
Var('chromium_url') + '/external/github.com/open-source-parsers/jsoncpp.git'+ '@' + '42e892d96e47b1f6e29844cc705e148ec4856448',
|
||||||
'third_party/logdog/logdog':
|
'third_party/logdog/logdog':
|
||||||
@ -270,9 +273,9 @@ deps = {
|
|||||||
'condition': 'checkout_android',
|
'condition': 'checkout_android',
|
||||||
},
|
},
|
||||||
'third_party/zlib':
|
'third_party/zlib':
|
||||||
Var('chromium_url') + '/chromium/src/third_party/zlib.git'+ '@' + '18d27fa10b237fdfcbd8f0c65c19fe009981a3bc',
|
Var('chromium_url') + '/chromium/src/third_party/zlib.git'+ '@' + '2d44c51ada6d325b85b53427b02dabf44648bca4',
|
||||||
'tools/clang':
|
'tools/clang':
|
||||||
Var('chromium_url') + '/chromium/src/tools/clang.git' + '@' + 'cab032b11ddc12804bf4ae8d71a6e0f88bc51ddb',
|
Var('chromium_url') + '/chromium/src/tools/clang.git' + '@' + '44e5e39a90511e079e4b9bc2f753059f2fe6ac4b',
|
||||||
'tools/luci-go': {
|
'tools/luci-go': {
|
||||||
'packages': [
|
'packages': [
|
||||||
{
|
{
|
||||||
@ -621,6 +624,16 @@ hooks = [
|
|||||||
'tools/generate-header-include-checks.py',
|
'tools/generate-header-include-checks.py',
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
'name': 'checkout_v8_builtins_pgo_profiles',
|
||||||
|
'pattern': '.',
|
||||||
|
'condition': 'checkout_v8_builtins_pgo_profiles',
|
||||||
|
'action': [
|
||||||
|
'python3',
|
||||||
|
'tools/builtins-pgo/download_profiles.py',
|
||||||
|
'download',
|
||||||
|
],
|
||||||
|
},
|
||||||
{
|
{
|
||||||
# Clean up build dirs for crbug.com/1337238.
|
# Clean up build dirs for crbug.com/1337238.
|
||||||
# After a libc++ roll and revert, .ninja_deps would get into a state
|
# After a libc++ roll and revert, .ninja_deps would get into a state
|
||||||
|
@ -2,4 +2,3 @@ junyan@redhat.com
|
|||||||
joransiu@ca.ibm.com
|
joransiu@ca.ibm.com
|
||||||
midawson@redhat.com
|
midawson@redhat.com
|
||||||
mfarazma@redhat.com
|
mfarazma@redhat.com
|
||||||
vasili.skurydzin@ibm.com
|
|
||||||
|
@ -2,4 +2,3 @@ junyan@redhat.com
|
|||||||
joransiu@ca.ibm.com
|
joransiu@ca.ibm.com
|
||||||
midawson@redhat.com
|
midawson@redhat.com
|
||||||
mfarazma@redhat.com
|
mfarazma@redhat.com
|
||||||
vasili.skurydzin@ibm.com
|
|
||||||
|
10
WATCHLISTS
10
WATCHLISTS
@ -101,11 +101,13 @@
|
|||||||
'|test/unittests/heap/cppgc/' \
|
'|test/unittests/heap/cppgc/' \
|
||||||
'|test/unittests/heap/cppgc-js/',
|
'|test/unittests/heap/cppgc-js/',
|
||||||
},
|
},
|
||||||
|
'trap-handler': {
|
||||||
|
'filepath': 'src/trap-handler/',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
'WATCHLISTS': {
|
'WATCHLISTS': {
|
||||||
'maglev': [
|
'maglev': [
|
||||||
'jgruber+watch@chromium.org',
|
|
||||||
'leszeks+watch@chromium.org',
|
'leszeks+watch@chromium.org',
|
||||||
'verwaest+watch@chromium.org',
|
'verwaest+watch@chromium.org',
|
||||||
'victorgomes+watch@chromium.org',
|
'victorgomes+watch@chromium.org',
|
||||||
@ -168,5 +170,11 @@
|
|||||||
'cppgc': [
|
'cppgc': [
|
||||||
'oilpan-reviews+v8@chromium.org',
|
'oilpan-reviews+v8@chromium.org',
|
||||||
],
|
],
|
||||||
|
'trap-handler': [
|
||||||
|
'ahaas@chromium.org',
|
||||||
|
'clemensb@chromium.org',
|
||||||
|
'mark@chromium.org',
|
||||||
|
'mseaborn@chromium.org',
|
||||||
|
],
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
120
bazel/defs.bzl
120
bazel/defs.bzl
@ -205,7 +205,7 @@ def v8_binary(
|
|||||||
name = "noicu/" + name,
|
name = "noicu/" + name,
|
||||||
srcs = srcs + noicu_srcs,
|
srcs = srcs + noicu_srcs,
|
||||||
deps = deps + noicu_deps + default.deps,
|
deps = deps + noicu_deps + default.deps,
|
||||||
includes = includes + default.includes,
|
includes = includes + ["noicu/"] + default.includes,
|
||||||
copts = copts + default.copts,
|
copts = copts + default.copts,
|
||||||
linkopts = linkopts + default.linkopts,
|
linkopts = linkopts + default.linkopts,
|
||||||
**kwargs
|
**kwargs
|
||||||
@ -214,7 +214,7 @@ def v8_binary(
|
|||||||
name = "icu/" + name,
|
name = "icu/" + name,
|
||||||
srcs = srcs + icu_srcs,
|
srcs = srcs + icu_srcs,
|
||||||
deps = deps + icu_deps + default.deps,
|
deps = deps + icu_deps + default.deps,
|
||||||
includes = includes + default.includes,
|
includes = includes + ["icu/"] + default.includes,
|
||||||
copts = copts + default.copts + ENABLE_I18N_SUPPORT_DEFINES,
|
copts = copts + default.copts + ENABLE_I18N_SUPPORT_DEFINES,
|
||||||
linkopts = linkopts + default.linkopts,
|
linkopts = linkopts + default.linkopts,
|
||||||
**kwargs
|
**kwargs
|
||||||
@ -249,7 +249,7 @@ def v8_library(
|
|||||||
name = name + "_noicu",
|
name = name + "_noicu",
|
||||||
srcs = srcs + noicu_srcs,
|
srcs = srcs + noicu_srcs,
|
||||||
deps = deps + noicu_deps + default.deps,
|
deps = deps + noicu_deps + default.deps,
|
||||||
includes = includes + default.includes,
|
includes = includes + ["noicu/"] + default.includes,
|
||||||
copts = copts + default.copts,
|
copts = copts + default.copts,
|
||||||
linkopts = linkopts + default.linkopts,
|
linkopts = linkopts + default.linkopts,
|
||||||
alwayslink = 1,
|
alwayslink = 1,
|
||||||
@ -268,7 +268,7 @@ def v8_library(
|
|||||||
name = name + "_icu",
|
name = name + "_icu",
|
||||||
srcs = srcs + icu_srcs,
|
srcs = srcs + icu_srcs,
|
||||||
deps = deps + icu_deps + default.deps,
|
deps = deps + icu_deps + default.deps,
|
||||||
includes = includes + default.includes,
|
includes = includes + ["icu/"] + default.includes,
|
||||||
copts = copts + default.copts + ENABLE_I18N_SUPPORT_DEFINES,
|
copts = copts + default.copts + ENABLE_I18N_SUPPORT_DEFINES,
|
||||||
linkopts = linkopts + default.linkopts,
|
linkopts = linkopts + default.linkopts,
|
||||||
alwayslink = 1,
|
alwayslink = 1,
|
||||||
@ -296,7 +296,7 @@ def v8_library(
|
|||||||
**kwargs
|
**kwargs
|
||||||
)
|
)
|
||||||
|
|
||||||
def _torque_impl(ctx):
|
def _torque_initializers_impl(ctx):
|
||||||
if ctx.workspace_name == "v8":
|
if ctx.workspace_name == "v8":
|
||||||
v8root = "."
|
v8root = "."
|
||||||
else:
|
else:
|
||||||
@ -317,7 +317,7 @@ def _torque_impl(ctx):
|
|||||||
# Generate/declare output files
|
# Generate/declare output files
|
||||||
outs = []
|
outs = []
|
||||||
for src in ctx.files.srcs:
|
for src in ctx.files.srcs:
|
||||||
root, period, ext = src.path.rpartition(".")
|
root, _period, _ext = src.path.rpartition(".")
|
||||||
|
|
||||||
# Strip v8root
|
# Strip v8root
|
||||||
if root[:len(v8root)] == v8root:
|
if root[:len(v8root)] == v8root:
|
||||||
@ -325,22 +325,19 @@ def _torque_impl(ctx):
|
|||||||
file = ctx.attr.prefix + "/torque-generated/" + root
|
file = ctx.attr.prefix + "/torque-generated/" + root
|
||||||
outs.append(ctx.actions.declare_file(file + "-tq-csa.cc"))
|
outs.append(ctx.actions.declare_file(file + "-tq-csa.cc"))
|
||||||
outs.append(ctx.actions.declare_file(file + "-tq-csa.h"))
|
outs.append(ctx.actions.declare_file(file + "-tq-csa.h"))
|
||||||
outs.append(ctx.actions.declare_file(file + "-tq-inl.inc"))
|
|
||||||
outs.append(ctx.actions.declare_file(file + "-tq.inc"))
|
|
||||||
outs.append(ctx.actions.declare_file(file + "-tq.cc"))
|
|
||||||
outs += [ctx.actions.declare_file(ctx.attr.prefix + "/torque-generated/" + f) for f in ctx.attr.extras]
|
outs += [ctx.actions.declare_file(ctx.attr.prefix + "/torque-generated/" + f) for f in ctx.attr.extras]
|
||||||
ctx.actions.run(
|
ctx.actions.run(
|
||||||
outputs = outs,
|
outputs = outs,
|
||||||
inputs = ctx.files.srcs,
|
inputs = ctx.files.srcs,
|
||||||
arguments = args,
|
arguments = args,
|
||||||
executable = ctx.executable.tool,
|
executable = ctx.executable.tool,
|
||||||
mnemonic = "GenTorque",
|
mnemonic = "GenTorqueInitializers",
|
||||||
progress_message = "Generating Torque files",
|
progress_message = "Generating Torque initializers",
|
||||||
)
|
)
|
||||||
return [DefaultInfo(files = depset(outs))]
|
return [DefaultInfo(files = depset(outs))]
|
||||||
|
|
||||||
_v8_torque = rule(
|
_v8_torque_initializers = rule(
|
||||||
implementation = _torque_impl,
|
implementation = _torque_initializers_impl,
|
||||||
# cfg = v8_target_cpu_transition,
|
# cfg = v8_target_cpu_transition,
|
||||||
attrs = {
|
attrs = {
|
||||||
"prefix": attr.string(mandatory = True),
|
"prefix": attr.string(mandatory = True),
|
||||||
@ -355,8 +352,8 @@ _v8_torque = rule(
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
def v8_torque(name, noicu_srcs, icu_srcs, args, extras):
|
def v8_torque_initializers(name, noicu_srcs, icu_srcs, args, extras):
|
||||||
_v8_torque(
|
_v8_torque_initializers(
|
||||||
name = "noicu/" + name,
|
name = "noicu/" + name,
|
||||||
prefix = "noicu",
|
prefix = "noicu",
|
||||||
srcs = noicu_srcs,
|
srcs = noicu_srcs,
|
||||||
@ -367,7 +364,88 @@ def v8_torque(name, noicu_srcs, icu_srcs, args, extras):
|
|||||||
"//conditions:default": ":torque",
|
"//conditions:default": ":torque",
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
_v8_torque(
|
_v8_torque_initializers(
|
||||||
|
name = "icu/" + name,
|
||||||
|
prefix = "icu",
|
||||||
|
srcs = icu_srcs,
|
||||||
|
args = args,
|
||||||
|
extras = extras,
|
||||||
|
tool = select({
|
||||||
|
"@v8//bazel/config:v8_target_is_32_bits": ":torque_non_pointer_compression",
|
||||||
|
"//conditions:default": ":torque",
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
|
||||||
|
def _torque_definitions_impl(ctx):
|
||||||
|
if ctx.workspace_name == "v8":
|
||||||
|
v8root = "."
|
||||||
|
else:
|
||||||
|
v8root = "external/v8"
|
||||||
|
|
||||||
|
# Arguments
|
||||||
|
args = []
|
||||||
|
args += ctx.attr.args
|
||||||
|
args.append("-o")
|
||||||
|
args.append(ctx.bin_dir.path + "/" + v8root + "/" + ctx.attr.prefix + "/torque-generated")
|
||||||
|
args.append("-strip-v8-root")
|
||||||
|
args.append("-v8-root")
|
||||||
|
args.append(v8root)
|
||||||
|
|
||||||
|
# Sources
|
||||||
|
args += [f.path for f in ctx.files.srcs]
|
||||||
|
|
||||||
|
# Generate/declare output files
|
||||||
|
outs = []
|
||||||
|
for src in ctx.files.srcs:
|
||||||
|
root, _period, _ext = src.path.rpartition(".")
|
||||||
|
|
||||||
|
# Strip v8root
|
||||||
|
if root[:len(v8root)] == v8root:
|
||||||
|
root = root[len(v8root):]
|
||||||
|
file = ctx.attr.prefix + "/torque-generated/" + root
|
||||||
|
outs.append(ctx.actions.declare_file(file + "-tq-inl.inc"))
|
||||||
|
outs.append(ctx.actions.declare_file(file + "-tq.inc"))
|
||||||
|
outs.append(ctx.actions.declare_file(file + "-tq.cc"))
|
||||||
|
outs += [ctx.actions.declare_file(ctx.attr.prefix + "/torque-generated/" + f) for f in ctx.attr.extras]
|
||||||
|
ctx.actions.run(
|
||||||
|
outputs = outs,
|
||||||
|
inputs = ctx.files.srcs,
|
||||||
|
arguments = args,
|
||||||
|
executable = ctx.executable.tool,
|
||||||
|
mnemonic = "GenTorqueDefinitions",
|
||||||
|
progress_message = "Generating Torque definitions",
|
||||||
|
)
|
||||||
|
return [DefaultInfo(files = depset(outs))]
|
||||||
|
|
||||||
|
_v8_torque_definitions = rule(
|
||||||
|
implementation = _torque_definitions_impl,
|
||||||
|
# cfg = v8_target_cpu_transition,
|
||||||
|
attrs = {
|
||||||
|
"prefix": attr.string(mandatory = True),
|
||||||
|
"srcs": attr.label_list(allow_files = True, mandatory = True),
|
||||||
|
"extras": attr.string_list(),
|
||||||
|
"tool": attr.label(
|
||||||
|
allow_files = True,
|
||||||
|
executable = True,
|
||||||
|
cfg = "exec",
|
||||||
|
),
|
||||||
|
"args": attr.string_list(),
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
def v8_torque_definitions(name, noicu_srcs, icu_srcs, args, extras):
|
||||||
|
_v8_torque_definitions(
|
||||||
|
name = "noicu/" + name,
|
||||||
|
prefix = "noicu",
|
||||||
|
srcs = noicu_srcs,
|
||||||
|
args = args,
|
||||||
|
extras = extras,
|
||||||
|
tool = select({
|
||||||
|
"@v8//bazel/config:v8_target_is_32_bits": ":torque_non_pointer_compression",
|
||||||
|
"//conditions:default": ":torque",
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
_v8_torque_definitions(
|
||||||
name = "icu/" + name,
|
name = "icu/" + name,
|
||||||
prefix = "icu",
|
prefix = "icu",
|
||||||
srcs = icu_srcs,
|
srcs = icu_srcs,
|
||||||
@ -533,7 +611,17 @@ def build_config_content(cpu, icu):
|
|||||||
("v8_enable_single_generation", "false"),
|
("v8_enable_single_generation", "false"),
|
||||||
("v8_enable_sandbox", "false"),
|
("v8_enable_sandbox", "false"),
|
||||||
("v8_enable_shared_ro_heap", "false"),
|
("v8_enable_shared_ro_heap", "false"),
|
||||||
|
("v8_disable_write_barriers", "false"),
|
||||||
("v8_target_cpu", cpu),
|
("v8_target_cpu", cpu),
|
||||||
|
("v8_code_comments", "false"),
|
||||||
|
("v8_enable_debug_code", "false"),
|
||||||
|
("v8_enable_verify_heap", "false"),
|
||||||
|
("v8_enable_slow_dchecks", "false"),
|
||||||
|
("v8_enable_maglev", "false"),
|
||||||
|
("v8_enable_turbofan", "true"),
|
||||||
|
("v8_enable_disassembler", "false"),
|
||||||
|
("is_DEBUG_defined", "false"),
|
||||||
|
("v8_enable_gdbjit", "false"),
|
||||||
])
|
])
|
||||||
|
|
||||||
# TODO(victorgomes): Create a rule (instead of a macro), that can
|
# TODO(victorgomes): Create a rule (instead of a macro), that can
|
||||||
|
@ -104,6 +104,10 @@ if (v8_snapshot_toolchain == "") {
|
|||||||
# cross compile Windows arm64 with host toolchain.
|
# cross compile Windows arm64 with host toolchain.
|
||||||
v8_snapshot_toolchain = host_toolchain
|
v8_snapshot_toolchain = host_toolchain
|
||||||
}
|
}
|
||||||
|
} else if (host_cpu == "arm64" && current_cpu == "arm64" &&
|
||||||
|
host_os == "mac") {
|
||||||
|
# cross compile iOS arm64 with host_toolchain
|
||||||
|
v8_snapshot_toolchain = host_toolchain
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
23
gni/v8.gni
23
gni/v8.gni
@ -63,10 +63,19 @@ declare_args() {
|
|||||||
# Sets -DV8_LITE_MODE.
|
# Sets -DV8_LITE_MODE.
|
||||||
v8_enable_lite_mode = false
|
v8_enable_lite_mode = false
|
||||||
|
|
||||||
|
# Enable the Turbofan compiler.
|
||||||
|
# Sets -dV8_ENABLE_TURBOFAN.
|
||||||
|
v8_enable_turbofan = ""
|
||||||
|
|
||||||
|
# Enable the Maglev compiler.
|
||||||
|
# Sets -dV8_ENABLE_MAGLEV
|
||||||
|
v8_enable_maglev = ""
|
||||||
|
|
||||||
# Include support for WebAssembly. If disabled, the 'WebAssembly' global
|
# Include support for WebAssembly. If disabled, the 'WebAssembly' global
|
||||||
# will not be available, and embedder APIs to generate WebAssembly modules
|
# will not be available, and embedder APIs to generate WebAssembly modules
|
||||||
# will fail. Also, asm.js will not be translated to WebAssembly and will be
|
# will fail. Also, asm.js will not be translated to WebAssembly and will be
|
||||||
# executed as standard JavaScript instead.
|
# executed as standard JavaScript instead.
|
||||||
|
# Sets -dV8_ENABLE_WEBASSEMBLY.
|
||||||
v8_enable_webassembly = ""
|
v8_enable_webassembly = ""
|
||||||
|
|
||||||
# Enable 256-bit long vector re-vectorization pass in WASM compilation pipeline.
|
# Enable 256-bit long vector re-vectorization pass in WASM compilation pipeline.
|
||||||
@ -97,6 +106,12 @@ declare_args() {
|
|||||||
# Enable young generation in cppgc.
|
# Enable young generation in cppgc.
|
||||||
cppgc_enable_young_generation = false
|
cppgc_enable_young_generation = false
|
||||||
|
|
||||||
|
# Enables a slim write barrier that only performs a single check in the fast
|
||||||
|
# path and delegates all further checks to a slow path call. This is fast
|
||||||
|
# in a setting with few slow-path checks, i.e., with disabled young generation
|
||||||
|
# GC.
|
||||||
|
cppgc_enable_slim_write_barrier = true
|
||||||
|
|
||||||
# Enable pointer compression in cppgc.
|
# Enable pointer compression in cppgc.
|
||||||
cppgc_enable_pointer_compression = false
|
cppgc_enable_pointer_compression = false
|
||||||
|
|
||||||
@ -135,6 +150,13 @@ if (v8_enable_webassembly == "") {
|
|||||||
assert(!(v8_enable_webassembly && v8_enable_lite_mode),
|
assert(!(v8_enable_webassembly && v8_enable_lite_mode),
|
||||||
"Webassembly is not available in lite mode.")
|
"Webassembly is not available in lite mode.")
|
||||||
|
|
||||||
|
# Turbofan is enabled by default, except in lite mode.
|
||||||
|
if (v8_enable_turbofan == "") {
|
||||||
|
v8_enable_turbofan = !v8_enable_lite_mode
|
||||||
|
}
|
||||||
|
assert(v8_enable_turbofan || !v8_enable_webassembly,
|
||||||
|
"Webassembly is not available when Turbofan is disabled.")
|
||||||
|
|
||||||
# Points to // in v8 stand-alone or to //v8/ in chromium. We need absolute
|
# Points to // in v8 stand-alone or to //v8/ in chromium. We need absolute
|
||||||
# paths for all configs in templates as they are shared in different
|
# paths for all configs in templates as they are shared in different
|
||||||
# subdirectories.
|
# subdirectories.
|
||||||
@ -280,6 +302,7 @@ template("v8_executable") {
|
|||||||
|
|
||||||
template("v8_component") {
|
template("v8_component") {
|
||||||
component(target_name) {
|
component(target_name) {
|
||||||
|
output_name = target_name
|
||||||
forward_variables_from(invoker,
|
forward_variables_from(invoker,
|
||||||
"*",
|
"*",
|
||||||
[
|
[
|
||||||
|
@ -148,10 +148,11 @@ class BasicCrossThreadPersistent final : public CrossThreadPersistentBase,
|
|||||||
|
|
||||||
template <typename U, typename MemberBarrierPolicy,
|
template <typename U, typename MemberBarrierPolicy,
|
||||||
typename MemberWeaknessTag, typename MemberCheckingPolicy,
|
typename MemberWeaknessTag, typename MemberCheckingPolicy,
|
||||||
|
typename MemberStorageType,
|
||||||
typename = std::enable_if_t<std::is_base_of<T, U>::value>>
|
typename = std::enable_if_t<std::is_base_of<T, U>::value>>
|
||||||
BasicCrossThreadPersistent(
|
BasicCrossThreadPersistent(
|
||||||
internal::BasicMember<U, MemberBarrierPolicy, MemberWeaknessTag,
|
internal::BasicMember<U, MemberBarrierPolicy, MemberWeaknessTag,
|
||||||
MemberCheckingPolicy>
|
MemberCheckingPolicy, MemberStorageType>
|
||||||
member,
|
member,
|
||||||
const SourceLocation& loc = SourceLocation::Current())
|
const SourceLocation& loc = SourceLocation::Current())
|
||||||
: BasicCrossThreadPersistent(member.Get(), loc) {}
|
: BasicCrossThreadPersistent(member.Get(), loc) {}
|
||||||
@ -230,10 +231,11 @@ class BasicCrossThreadPersistent final : public CrossThreadPersistentBase,
|
|||||||
// Assignment from member.
|
// Assignment from member.
|
||||||
template <typename U, typename MemberBarrierPolicy,
|
template <typename U, typename MemberBarrierPolicy,
|
||||||
typename MemberWeaknessTag, typename MemberCheckingPolicy,
|
typename MemberWeaknessTag, typename MemberCheckingPolicy,
|
||||||
|
typename MemberStorageType,
|
||||||
typename = std::enable_if_t<std::is_base_of<T, U>::value>>
|
typename = std::enable_if_t<std::is_base_of<T, U>::value>>
|
||||||
BasicCrossThreadPersistent& operator=(
|
BasicCrossThreadPersistent& operator=(
|
||||||
internal::BasicMember<U, MemberBarrierPolicy, MemberWeaknessTag,
|
internal::BasicMember<U, MemberBarrierPolicy, MemberWeaknessTag,
|
||||||
MemberCheckingPolicy>
|
MemberCheckingPolicy, MemberStorageType>
|
||||||
member) {
|
member) {
|
||||||
return operator=(member.Get());
|
return operator=(member.Get());
|
||||||
}
|
}
|
||||||
|
@ -62,10 +62,10 @@ class HeapConsistency final {
|
|||||||
* \returns whether a write barrier is needed and which barrier to invoke.
|
* \returns whether a write barrier is needed and which barrier to invoke.
|
||||||
*/
|
*/
|
||||||
template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
|
template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
|
||||||
typename CheckingPolicy>
|
typename CheckingPolicy, typename StorageType>
|
||||||
static V8_INLINE WriteBarrierType GetWriteBarrierType(
|
static V8_INLINE WriteBarrierType GetWriteBarrierType(
|
||||||
const internal::BasicMember<T, WeaknessTag, WriteBarrierPolicy,
|
const internal::BasicMember<T, WeaknessTag, WriteBarrierPolicy,
|
||||||
CheckingPolicy>& value,
|
CheckingPolicy, StorageType>& value,
|
||||||
WriteBarrierParams& params) {
|
WriteBarrierParams& params) {
|
||||||
return internal::WriteBarrier::GetWriteBarrierType(
|
return internal::WriteBarrier::GetWriteBarrierType(
|
||||||
value.GetRawSlot(), value.GetRawStorage(), params);
|
value.GetRawSlot(), value.GetRawStorage(), params);
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
|
|
||||||
#include "cppgc/internal/finalizer-trait.h"
|
#include "cppgc/internal/finalizer-trait.h"
|
||||||
|
#include "cppgc/internal/logging.h"
|
||||||
#include "cppgc/internal/name-trait.h"
|
#include "cppgc/internal/name-trait.h"
|
||||||
#include "cppgc/trace-trait.h"
|
#include "cppgc/trace-trait.h"
|
||||||
#include "v8config.h" // NOLINT(build/include_directory)
|
#include "v8config.h" // NOLINT(build/include_directory)
|
||||||
@ -20,12 +21,12 @@ namespace internal {
|
|||||||
using GCInfoIndex = uint16_t;
|
using GCInfoIndex = uint16_t;
|
||||||
|
|
||||||
struct V8_EXPORT EnsureGCInfoIndexTrait final {
|
struct V8_EXPORT EnsureGCInfoIndexTrait final {
|
||||||
// Acquires a new GC info object and returns the index. In addition, also
|
// Acquires a new GC info object and updates `registered_index` with the index
|
||||||
// updates `registered_index` atomically.
|
// that identifies that new info accordingly.
|
||||||
template <typename T>
|
template <typename T>
|
||||||
V8_INLINE static GCInfoIndex EnsureIndex(
|
V8_INLINE static void EnsureIndex(
|
||||||
std::atomic<GCInfoIndex>& registered_index) {
|
std::atomic<GCInfoIndex>& registered_index) {
|
||||||
return EnsureGCInfoIndexTraitDispatch<T>{}(registered_index);
|
EnsureGCInfoIndexTraitDispatch<T>{}(registered_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -34,38 +35,32 @@ struct V8_EXPORT EnsureGCInfoIndexTrait final {
|
|||||||
bool = NameTrait<T>::HasNonHiddenName()>
|
bool = NameTrait<T>::HasNonHiddenName()>
|
||||||
struct EnsureGCInfoIndexTraitDispatch;
|
struct EnsureGCInfoIndexTraitDispatch;
|
||||||
|
|
||||||
static GCInfoIndex EnsureGCInfoIndexPolymorphic(std::atomic<GCInfoIndex>&,
|
static void V8_PRESERVE_MOST
|
||||||
TraceCallback,
|
EnsureGCInfoIndexPolymorphic(std::atomic<GCInfoIndex>&, TraceCallback,
|
||||||
FinalizationCallback,
|
FinalizationCallback, NameCallback);
|
||||||
NameCallback);
|
static void V8_PRESERVE_MOST EnsureGCInfoIndexPolymorphic(
|
||||||
static GCInfoIndex EnsureGCInfoIndexPolymorphic(std::atomic<GCInfoIndex>&,
|
std::atomic<GCInfoIndex>&, TraceCallback, FinalizationCallback);
|
||||||
TraceCallback,
|
static void V8_PRESERVE_MOST EnsureGCInfoIndexPolymorphic(
|
||||||
FinalizationCallback);
|
std::atomic<GCInfoIndex>&, TraceCallback, NameCallback);
|
||||||
static GCInfoIndex EnsureGCInfoIndexPolymorphic(std::atomic<GCInfoIndex>&,
|
static void V8_PRESERVE_MOST
|
||||||
TraceCallback, NameCallback);
|
EnsureGCInfoIndexPolymorphic(std::atomic<GCInfoIndex>&, TraceCallback);
|
||||||
static GCInfoIndex EnsureGCInfoIndexPolymorphic(std::atomic<GCInfoIndex>&,
|
static void V8_PRESERVE_MOST
|
||||||
TraceCallback);
|
EnsureGCInfoIndexNonPolymorphic(std::atomic<GCInfoIndex>&, TraceCallback,
|
||||||
static GCInfoIndex EnsureGCInfoIndexNonPolymorphic(std::atomic<GCInfoIndex>&,
|
FinalizationCallback, NameCallback);
|
||||||
TraceCallback,
|
static void V8_PRESERVE_MOST EnsureGCInfoIndexNonPolymorphic(
|
||||||
FinalizationCallback,
|
std::atomic<GCInfoIndex>&, TraceCallback, FinalizationCallback);
|
||||||
NameCallback);
|
static void V8_PRESERVE_MOST EnsureGCInfoIndexNonPolymorphic(
|
||||||
static GCInfoIndex EnsureGCInfoIndexNonPolymorphic(std::atomic<GCInfoIndex>&,
|
std::atomic<GCInfoIndex>&, TraceCallback, NameCallback);
|
||||||
TraceCallback,
|
static void V8_PRESERVE_MOST
|
||||||
FinalizationCallback);
|
EnsureGCInfoIndexNonPolymorphic(std::atomic<GCInfoIndex>&, TraceCallback);
|
||||||
static GCInfoIndex EnsureGCInfoIndexNonPolymorphic(std::atomic<GCInfoIndex>&,
|
|
||||||
TraceCallback,
|
|
||||||
NameCallback);
|
|
||||||
static GCInfoIndex EnsureGCInfoIndexNonPolymorphic(std::atomic<GCInfoIndex>&,
|
|
||||||
TraceCallback);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define DISPATCH(is_polymorphic, has_finalizer, has_non_hidden_name, function) \
|
#define DISPATCH(is_polymorphic, has_finalizer, has_non_hidden_name, function) \
|
||||||
template <typename T> \
|
template <typename T> \
|
||||||
struct EnsureGCInfoIndexTrait::EnsureGCInfoIndexTraitDispatch< \
|
struct EnsureGCInfoIndexTrait::EnsureGCInfoIndexTraitDispatch< \
|
||||||
T, is_polymorphic, has_finalizer, has_non_hidden_name> { \
|
T, is_polymorphic, has_finalizer, has_non_hidden_name> { \
|
||||||
V8_INLINE GCInfoIndex \
|
V8_INLINE void operator()(std::atomic<GCInfoIndex>& registered_index) { \
|
||||||
operator()(std::atomic<GCInfoIndex>& registered_index) { \
|
function; \
|
||||||
return function; \
|
|
||||||
} \
|
} \
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -143,9 +138,16 @@ struct GCInfoTrait final {
|
|||||||
static_assert(sizeof(T), "T must be fully defined");
|
static_assert(sizeof(T), "T must be fully defined");
|
||||||
static std::atomic<GCInfoIndex>
|
static std::atomic<GCInfoIndex>
|
||||||
registered_index; // Uses zero initialization.
|
registered_index; // Uses zero initialization.
|
||||||
const GCInfoIndex index = registered_index.load(std::memory_order_acquire);
|
GCInfoIndex index = registered_index.load(std::memory_order_acquire);
|
||||||
return index ? index
|
if (V8_UNLIKELY(!index)) {
|
||||||
: EnsureGCInfoIndexTrait::EnsureIndex<T>(registered_index);
|
EnsureGCInfoIndexTrait::EnsureIndex<T>(registered_index);
|
||||||
|
// Slow path call uses V8_PRESERVE_MOST which does not support return
|
||||||
|
// values (also preserves RAX). Avoid out parameter by just reloading the
|
||||||
|
// value here which at this point is guaranteed to be set.
|
||||||
|
index = registered_index.load(std::memory_order_acquire);
|
||||||
|
CPPGC_DCHECK(index != 0);
|
||||||
|
}
|
||||||
|
return index;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -225,9 +225,9 @@ class V8_TRIVIAL_ABI RawPointer final {
|
|||||||
};
|
};
|
||||||
|
|
||||||
#if defined(CPPGC_POINTER_COMPRESSION)
|
#if defined(CPPGC_POINTER_COMPRESSION)
|
||||||
using MemberStorage = CompressedPointer;
|
using DefaultMemberStorage = CompressedPointer;
|
||||||
#else // !defined(CPPGC_POINTER_COMPRESSION)
|
#else // !defined(CPPGC_POINTER_COMPRESSION)
|
||||||
using MemberStorage = RawPointer;
|
using DefaultMemberStorage = RawPointer;
|
||||||
#endif // !defined(CPPGC_POINTER_COMPRESSION)
|
#endif // !defined(CPPGC_POINTER_COMPRESSION)
|
||||||
|
|
||||||
} // namespace internal
|
} // namespace internal
|
||||||
|
@ -34,18 +34,29 @@ struct DijkstraWriteBarrierPolicy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
V8_INLINE static void AssigningBarrier(const void* slot, const void* value) {
|
V8_INLINE static void AssigningBarrier(const void* slot, const void* value) {
|
||||||
|
#ifdef CPPGC_SLIM_WRITE_BARRIER
|
||||||
|
if (V8_UNLIKELY(WriteBarrier::IsEnabled()))
|
||||||
|
WriteBarrier::CombinedWriteBarrierSlow(slot);
|
||||||
|
#else // !CPPGC_SLIM_WRITE_BARRIER
|
||||||
WriteBarrier::Params params;
|
WriteBarrier::Params params;
|
||||||
const WriteBarrier::Type type =
|
const WriteBarrier::Type type =
|
||||||
WriteBarrier::GetWriteBarrierType(slot, value, params);
|
WriteBarrier::GetWriteBarrierType(slot, value, params);
|
||||||
WriteBarrier(type, params, slot, value);
|
WriteBarrier(type, params, slot, value);
|
||||||
|
#endif // !CPPGC_SLIM_WRITE_BARRIER
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename MemberStorage>
|
||||||
V8_INLINE static void AssigningBarrier(const void* slot,
|
V8_INLINE static void AssigningBarrier(const void* slot,
|
||||||
MemberStorage storage) {
|
MemberStorage storage) {
|
||||||
|
#ifdef CPPGC_SLIM_WRITE_BARRIER
|
||||||
|
if (V8_UNLIKELY(WriteBarrier::IsEnabled()))
|
||||||
|
WriteBarrier::CombinedWriteBarrierSlow(slot);
|
||||||
|
#else // !CPPGC_SLIM_WRITE_BARRIER
|
||||||
WriteBarrier::Params params;
|
WriteBarrier::Params params;
|
||||||
const WriteBarrier::Type type =
|
const WriteBarrier::Type type =
|
||||||
WriteBarrier::GetWriteBarrierType(slot, storage, params);
|
WriteBarrier::GetWriteBarrierType(slot, storage, params);
|
||||||
WriteBarrier(type, params, slot, storage.Load());
|
WriteBarrier(type, params, slot, storage.Load());
|
||||||
|
#endif // !CPPGC_SLIM_WRITE_BARRIER
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -69,6 +80,7 @@ struct DijkstraWriteBarrierPolicy {
|
|||||||
struct NoWriteBarrierPolicy {
|
struct NoWriteBarrierPolicy {
|
||||||
V8_INLINE static void InitializingBarrier(const void*, const void*) {}
|
V8_INLINE static void InitializingBarrier(const void*, const void*) {}
|
||||||
V8_INLINE static void AssigningBarrier(const void*, const void*) {}
|
V8_INLINE static void AssigningBarrier(const void*, const void*) {}
|
||||||
|
template <typename MemberStorage>
|
||||||
V8_INLINE static void AssigningBarrier(const void*, MemberStorage) {}
|
V8_INLINE static void AssigningBarrier(const void*, MemberStorage) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -197,7 +209,8 @@ template <typename T, typename WeaknessPolicy,
|
|||||||
typename CheckingPolicy = DefaultPersistentCheckingPolicy>
|
typename CheckingPolicy = DefaultPersistentCheckingPolicy>
|
||||||
class BasicPersistent;
|
class BasicPersistent;
|
||||||
template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
|
template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
|
||||||
typename CheckingPolicy = DefaultMemberCheckingPolicy>
|
typename CheckingPolicy = DefaultMemberCheckingPolicy,
|
||||||
|
typename StorageType = DefaultMemberStorage>
|
||||||
class BasicMember;
|
class BasicMember;
|
||||||
|
|
||||||
} // namespace internal
|
} // namespace internal
|
||||||
|
@ -70,6 +70,7 @@ class V8_EXPORT WriteBarrier final {
|
|||||||
static V8_INLINE Type GetWriteBarrierType(const void* slot, const void* value,
|
static V8_INLINE Type GetWriteBarrierType(const void* slot, const void* value,
|
||||||
Params& params);
|
Params& params);
|
||||||
// Returns the required write barrier for a given `slot` and `value`.
|
// Returns the required write barrier for a given `slot` and `value`.
|
||||||
|
template <typename MemberStorage>
|
||||||
static V8_INLINE Type GetWriteBarrierType(const void* slot, MemberStorage,
|
static V8_INLINE Type GetWriteBarrierType(const void* slot, MemberStorage,
|
||||||
Params& params);
|
Params& params);
|
||||||
// Returns the required write barrier for a given `slot`.
|
// Returns the required write barrier for a given `slot`.
|
||||||
@ -79,6 +80,14 @@ class V8_EXPORT WriteBarrier final {
|
|||||||
// Returns the required write barrier for a given `value`.
|
// Returns the required write barrier for a given `value`.
|
||||||
static V8_INLINE Type GetWriteBarrierType(const void* value, Params& params);
|
static V8_INLINE Type GetWriteBarrierType(const void* value, Params& params);
|
||||||
|
|
||||||
|
#ifdef CPPGC_SLIM_WRITE_BARRIER
|
||||||
|
// A write barrier that combines `GenerationalBarrier()` and
|
||||||
|
// `DijkstraMarkingBarrier()`. We only pass a single parameter here to clobber
|
||||||
|
// as few registers as possible.
|
||||||
|
static V8_NOINLINE void V8_PRESERVE_MOST
|
||||||
|
CombinedWriteBarrierSlow(const void* slot);
|
||||||
|
#endif // CPPGC_SLIM_WRITE_BARRIER
|
||||||
|
|
||||||
static V8_INLINE void DijkstraMarkingBarrier(const Params& params,
|
static V8_INLINE void DijkstraMarkingBarrier(const Params& params,
|
||||||
const void* object);
|
const void* object);
|
||||||
static V8_INLINE void DijkstraMarkingBarrierRange(
|
static V8_INLINE void DijkstraMarkingBarrierRange(
|
||||||
@ -163,7 +172,8 @@ class V8_EXPORT WriteBarrierTypeForCagedHeapPolicy final {
|
|||||||
return ValueModeDispatch<value_mode>::Get(slot, value, params, callback);
|
return ValueModeDispatch<value_mode>::Get(slot, value, params, callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <WriteBarrier::ValueMode value_mode, typename HeapHandleCallback>
|
template <WriteBarrier::ValueMode value_mode, typename HeapHandleCallback,
|
||||||
|
typename MemberStorage>
|
||||||
static V8_INLINE WriteBarrier::Type Get(const void* slot, MemberStorage value,
|
static V8_INLINE WriteBarrier::Type Get(const void* slot, MemberStorage value,
|
||||||
WriteBarrier::Params& params,
|
WriteBarrier::Params& params,
|
||||||
HeapHandleCallback callback) {
|
HeapHandleCallback callback) {
|
||||||
@ -207,7 +217,7 @@ class V8_EXPORT WriteBarrierTypeForCagedHeapPolicy final {
|
|||||||
template <>
|
template <>
|
||||||
struct WriteBarrierTypeForCagedHeapPolicy::ValueModeDispatch<
|
struct WriteBarrierTypeForCagedHeapPolicy::ValueModeDispatch<
|
||||||
WriteBarrier::ValueMode::kValuePresent> {
|
WriteBarrier::ValueMode::kValuePresent> {
|
||||||
template <typename HeapHandleCallback>
|
template <typename HeapHandleCallback, typename MemberStorage>
|
||||||
static V8_INLINE WriteBarrier::Type Get(const void* slot,
|
static V8_INLINE WriteBarrier::Type Get(const void* slot,
|
||||||
MemberStorage storage,
|
MemberStorage storage,
|
||||||
WriteBarrier::Params& params,
|
WriteBarrier::Params& params,
|
||||||
@ -305,11 +315,9 @@ class V8_EXPORT WriteBarrierTypeForNonCagedHeapPolicy final {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <WriteBarrier::ValueMode value_mode, typename HeapHandleCallback>
|
template <WriteBarrier::ValueMode value_mode, typename HeapHandleCallback>
|
||||||
static V8_INLINE WriteBarrier::Type Get(const void* slot, MemberStorage value,
|
static V8_INLINE WriteBarrier::Type Get(const void* slot, RawPointer value,
|
||||||
WriteBarrier::Params& params,
|
WriteBarrier::Params& params,
|
||||||
HeapHandleCallback callback) {
|
HeapHandleCallback callback) {
|
||||||
// `MemberStorage` will always be `RawPointer` for non-caged heap builds.
|
|
||||||
// Just convert to `void*` in this case.
|
|
||||||
return ValueModeDispatch<value_mode>::Get(slot, value.Load(), params,
|
return ValueModeDispatch<value_mode>::Get(slot, value.Load(), params,
|
||||||
callback);
|
callback);
|
||||||
}
|
}
|
||||||
@ -383,6 +391,7 @@ WriteBarrier::Type WriteBarrier::GetWriteBarrierType(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// static
|
// static
|
||||||
|
template <typename MemberStorage>
|
||||||
WriteBarrier::Type WriteBarrier::GetWriteBarrierType(
|
WriteBarrier::Type WriteBarrier::GetWriteBarrierType(
|
||||||
const void* slot, MemberStorage value, WriteBarrier::Params& params) {
|
const void* slot, MemberStorage value, WriteBarrier::Params& params) {
|
||||||
return WriteBarrierTypePolicy::Get<ValueMode::kValuePresent>(slot, value,
|
return WriteBarrierTypePolicy::Get<ValueMode::kValuePresent>(slot, value,
|
||||||
|
@ -28,13 +28,11 @@ namespace internal {
|
|||||||
|
|
||||||
// MemberBase always refers to the object as const object and defers to
|
// MemberBase always refers to the object as const object and defers to
|
||||||
// BasicMember on casting to the right type as needed.
|
// BasicMember on casting to the right type as needed.
|
||||||
|
template <typename StorageType>
|
||||||
class V8_TRIVIAL_ABI MemberBase {
|
class V8_TRIVIAL_ABI MemberBase {
|
||||||
public:
|
public:
|
||||||
#if defined(CPPGC_POINTER_COMPRESSION)
|
using RawStorage = StorageType;
|
||||||
using RawStorage = CompressedPointer;
|
|
||||||
#else // !defined(CPPGC_POINTER_COMPRESSION)
|
|
||||||
using RawStorage = RawPointer;
|
|
||||||
#endif // !defined(CPPGC_POINTER_COMPRESSION)
|
|
||||||
protected:
|
protected:
|
||||||
struct AtomicInitializerTag {};
|
struct AtomicInitializerTag {};
|
||||||
|
|
||||||
@ -75,16 +73,19 @@ class V8_TRIVIAL_ABI MemberBase {
|
|||||||
|
|
||||||
// The basic class from which all Member classes are 'generated'.
|
// The basic class from which all Member classes are 'generated'.
|
||||||
template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
|
template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
|
||||||
typename CheckingPolicy>
|
typename CheckingPolicy, typename StorageType>
|
||||||
class V8_TRIVIAL_ABI BasicMember final : private MemberBase,
|
class V8_TRIVIAL_ABI BasicMember final : private MemberBase<StorageType>,
|
||||||
private CheckingPolicy {
|
private CheckingPolicy {
|
||||||
|
using Base = MemberBase<StorageType>;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
using PointeeType = T;
|
using PointeeType = T;
|
||||||
|
using RawStorage = typename Base::RawStorage;
|
||||||
|
|
||||||
V8_INLINE constexpr BasicMember() = default;
|
V8_INLINE constexpr BasicMember() = default;
|
||||||
V8_INLINE constexpr BasicMember(std::nullptr_t) {} // NOLINT
|
V8_INLINE constexpr BasicMember(std::nullptr_t) {} // NOLINT
|
||||||
V8_INLINE BasicMember(SentinelPointer s) : MemberBase(s) {} // NOLINT
|
V8_INLINE BasicMember(SentinelPointer s) : Base(s) {} // NOLINT
|
||||||
V8_INLINE BasicMember(T* raw) : MemberBase(raw) { // NOLINT
|
V8_INLINE BasicMember(T* raw) : Base(raw) { // NOLINT
|
||||||
InitializingWriteBarrier(raw);
|
InitializingWriteBarrier(raw);
|
||||||
this->CheckPointer(Get());
|
this->CheckPointer(Get());
|
||||||
}
|
}
|
||||||
@ -94,13 +95,13 @@ class V8_TRIVIAL_ABI BasicMember final : private MemberBase,
|
|||||||
// Atomic ctor. Using the AtomicInitializerTag forces BasicMember to
|
// Atomic ctor. Using the AtomicInitializerTag forces BasicMember to
|
||||||
// initialize using atomic assignments. This is required for preventing
|
// initialize using atomic assignments. This is required for preventing
|
||||||
// data races with concurrent marking.
|
// data races with concurrent marking.
|
||||||
using AtomicInitializerTag = MemberBase::AtomicInitializerTag;
|
using AtomicInitializerTag = typename Base::AtomicInitializerTag;
|
||||||
V8_INLINE BasicMember(std::nullptr_t, AtomicInitializerTag atomic)
|
V8_INLINE BasicMember(std::nullptr_t, AtomicInitializerTag atomic)
|
||||||
: MemberBase(nullptr, atomic) {}
|
: Base(nullptr, atomic) {}
|
||||||
V8_INLINE BasicMember(SentinelPointer s, AtomicInitializerTag atomic)
|
V8_INLINE BasicMember(SentinelPointer s, AtomicInitializerTag atomic)
|
||||||
: MemberBase(s, atomic) {}
|
: Base(s, atomic) {}
|
||||||
V8_INLINE BasicMember(T* raw, AtomicInitializerTag atomic)
|
V8_INLINE BasicMember(T* raw, AtomicInitializerTag atomic)
|
||||||
: MemberBase(raw, atomic) {
|
: Base(raw, atomic) {
|
||||||
InitializingWriteBarrier(raw);
|
InitializingWriteBarrier(raw);
|
||||||
this->CheckPointer(Get());
|
this->CheckPointer(Get());
|
||||||
}
|
}
|
||||||
@ -119,7 +120,7 @@ class V8_TRIVIAL_ABI BasicMember final : private MemberBase,
|
|||||||
std::enable_if_t<internal::IsDecayedSameV<T, U>>* = nullptr>
|
std::enable_if_t<internal::IsDecayedSameV<T, U>>* = nullptr>
|
||||||
V8_INLINE BasicMember( // NOLINT
|
V8_INLINE BasicMember( // NOLINT
|
||||||
const BasicMember<U, OtherWeaknessTag, OtherBarrierPolicy,
|
const BasicMember<U, OtherWeaknessTag, OtherBarrierPolicy,
|
||||||
OtherCheckingPolicy>& other)
|
OtherCheckingPolicy, StorageType>& other)
|
||||||
: BasicMember(other.GetRawStorage()) {}
|
: BasicMember(other.GetRawStorage()) {}
|
||||||
|
|
||||||
template <typename U, typename OtherBarrierPolicy, typename OtherWeaknessTag,
|
template <typename U, typename OtherBarrierPolicy, typename OtherWeaknessTag,
|
||||||
@ -127,7 +128,7 @@ class V8_TRIVIAL_ABI BasicMember final : private MemberBase,
|
|||||||
std::enable_if_t<internal::IsStrictlyBaseOfV<T, U>>* = nullptr>
|
std::enable_if_t<internal::IsStrictlyBaseOfV<T, U>>* = nullptr>
|
||||||
V8_INLINE BasicMember( // NOLINT
|
V8_INLINE BasicMember( // NOLINT
|
||||||
const BasicMember<U, OtherWeaknessTag, OtherBarrierPolicy,
|
const BasicMember<U, OtherWeaknessTag, OtherBarrierPolicy,
|
||||||
OtherCheckingPolicy>& other)
|
OtherCheckingPolicy, StorageType>& other)
|
||||||
: BasicMember(other.Get()) {}
|
: BasicMember(other.Get()) {}
|
||||||
|
|
||||||
// Move ctor.
|
// Move ctor.
|
||||||
@ -142,8 +143,9 @@ class V8_TRIVIAL_ABI BasicMember final : private MemberBase,
|
|||||||
template <typename U, typename OtherBarrierPolicy, typename OtherWeaknessTag,
|
template <typename U, typename OtherBarrierPolicy, typename OtherWeaknessTag,
|
||||||
typename OtherCheckingPolicy,
|
typename OtherCheckingPolicy,
|
||||||
std::enable_if_t<internal::IsDecayedSameV<T, U>>* = nullptr>
|
std::enable_if_t<internal::IsDecayedSameV<T, U>>* = nullptr>
|
||||||
V8_INLINE BasicMember(BasicMember<U, OtherWeaknessTag, OtherBarrierPolicy,
|
V8_INLINE BasicMember(
|
||||||
OtherCheckingPolicy>&& other) noexcept
|
BasicMember<U, OtherWeaknessTag, OtherBarrierPolicy, OtherCheckingPolicy,
|
||||||
|
StorageType>&& other) noexcept
|
||||||
: BasicMember(other.GetRawStorage()) {
|
: BasicMember(other.GetRawStorage()) {
|
||||||
other.Clear();
|
other.Clear();
|
||||||
}
|
}
|
||||||
@ -151,8 +153,9 @@ class V8_TRIVIAL_ABI BasicMember final : private MemberBase,
|
|||||||
template <typename U, typename OtherBarrierPolicy, typename OtherWeaknessTag,
|
template <typename U, typename OtherBarrierPolicy, typename OtherWeaknessTag,
|
||||||
typename OtherCheckingPolicy,
|
typename OtherCheckingPolicy,
|
||||||
std::enable_if_t<internal::IsStrictlyBaseOfV<T, U>>* = nullptr>
|
std::enable_if_t<internal::IsStrictlyBaseOfV<T, U>>* = nullptr>
|
||||||
V8_INLINE BasicMember(BasicMember<U, OtherWeaknessTag, OtherBarrierPolicy,
|
V8_INLINE BasicMember(
|
||||||
OtherCheckingPolicy>&& other) noexcept
|
BasicMember<U, OtherWeaknessTag, OtherBarrierPolicy, OtherCheckingPolicy,
|
||||||
|
StorageType>&& other) noexcept
|
||||||
: BasicMember(other.Get()) {
|
: BasicMember(other.Get()) {
|
||||||
other.Clear();
|
other.Clear();
|
||||||
}
|
}
|
||||||
@ -179,7 +182,7 @@ class V8_TRIVIAL_ABI BasicMember final : private MemberBase,
|
|||||||
typename OtherCheckingPolicy>
|
typename OtherCheckingPolicy>
|
||||||
V8_INLINE BasicMember& operator=(
|
V8_INLINE BasicMember& operator=(
|
||||||
const BasicMember<U, OtherWeaknessTag, OtherBarrierPolicy,
|
const BasicMember<U, OtherWeaknessTag, OtherBarrierPolicy,
|
||||||
OtherCheckingPolicy>& other) {
|
OtherCheckingPolicy, StorageType>& other) {
|
||||||
if constexpr (internal::IsDecayedSameV<T, U>) {
|
if constexpr (internal::IsDecayedSameV<T, U>) {
|
||||||
return operator=(other.GetRawStorage());
|
return operator=(other.GetRawStorage());
|
||||||
} else {
|
} else {
|
||||||
@ -201,8 +204,8 @@ class V8_TRIVIAL_ABI BasicMember final : private MemberBase,
|
|||||||
template <typename U, typename OtherWeaknessTag, typename OtherBarrierPolicy,
|
template <typename U, typename OtherWeaknessTag, typename OtherBarrierPolicy,
|
||||||
typename OtherCheckingPolicy>
|
typename OtherCheckingPolicy>
|
||||||
V8_INLINE BasicMember& operator=(
|
V8_INLINE BasicMember& operator=(
|
||||||
BasicMember<U, OtherWeaknessTag, OtherBarrierPolicy,
|
BasicMember<U, OtherWeaknessTag, OtherBarrierPolicy, OtherCheckingPolicy,
|
||||||
OtherCheckingPolicy>&& other) noexcept {
|
StorageType>&& other) noexcept {
|
||||||
if constexpr (internal::IsDecayedSameV<T, U>) {
|
if constexpr (internal::IsDecayedSameV<T, U>) {
|
||||||
operator=(other.GetRawStorage());
|
operator=(other.GetRawStorage());
|
||||||
} else {
|
} else {
|
||||||
@ -226,7 +229,7 @@ class V8_TRIVIAL_ABI BasicMember final : private MemberBase,
|
|||||||
}
|
}
|
||||||
|
|
||||||
V8_INLINE BasicMember& operator=(T* other) {
|
V8_INLINE BasicMember& operator=(T* other) {
|
||||||
SetRawAtomic(other);
|
Base::SetRawAtomic(other);
|
||||||
AssigningWriteBarrier(other);
|
AssigningWriteBarrier(other);
|
||||||
this->CheckPointer(Get());
|
this->CheckPointer(Get());
|
||||||
return *this;
|
return *this;
|
||||||
@ -237,20 +240,20 @@ class V8_TRIVIAL_ABI BasicMember final : private MemberBase,
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
V8_INLINE BasicMember& operator=(SentinelPointer s) {
|
V8_INLINE BasicMember& operator=(SentinelPointer s) {
|
||||||
SetRawAtomic(s);
|
Base::SetRawAtomic(s);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename OtherWeaknessTag, typename OtherBarrierPolicy,
|
template <typename OtherWeaknessTag, typename OtherBarrierPolicy,
|
||||||
typename OtherCheckingPolicy>
|
typename OtherCheckingPolicy>
|
||||||
V8_INLINE void Swap(BasicMember<T, OtherWeaknessTag, OtherBarrierPolicy,
|
V8_INLINE void Swap(BasicMember<T, OtherWeaknessTag, OtherBarrierPolicy,
|
||||||
OtherCheckingPolicy>& other) {
|
OtherCheckingPolicy, StorageType>& other) {
|
||||||
auto tmp = GetRawStorage();
|
auto tmp = GetRawStorage();
|
||||||
*this = other;
|
*this = other;
|
||||||
other = tmp;
|
other = tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
V8_INLINE explicit operator bool() const { return !IsCleared(); }
|
V8_INLINE explicit operator bool() const { return !Base::IsCleared(); }
|
||||||
V8_INLINE operator T*() const { return Get(); }
|
V8_INLINE operator T*() const { return Get(); }
|
||||||
V8_INLINE T* operator->() const { return Get(); }
|
V8_INLINE T* operator->() const { return Get(); }
|
||||||
V8_INLINE T& operator*() const { return *Get(); }
|
V8_INLINE T& operator*() const { return *Get(); }
|
||||||
@ -264,10 +267,12 @@ class V8_TRIVIAL_ABI BasicMember final : private MemberBase,
|
|||||||
// The const_cast below removes the constness from MemberBase storage. The
|
// The const_cast below removes the constness from MemberBase storage. The
|
||||||
// following static_cast re-adds any constness if specified through the
|
// following static_cast re-adds any constness if specified through the
|
||||||
// user-visible template parameter T.
|
// user-visible template parameter T.
|
||||||
return static_cast<T*>(const_cast<void*>(MemberBase::GetRaw()));
|
return static_cast<T*>(const_cast<void*>(Base::GetRaw()));
|
||||||
}
|
}
|
||||||
|
|
||||||
V8_INLINE void Clear() { SetRawStorageAtomic(RawStorage{}); }
|
V8_INLINE void Clear() {
|
||||||
|
Base::SetRawStorageAtomic(RawStorage{});
|
||||||
|
}
|
||||||
|
|
||||||
V8_INLINE T* Release() {
|
V8_INLINE T* Release() {
|
||||||
T* result = Get();
|
T* result = Get();
|
||||||
@ -276,41 +281,42 @@ class V8_TRIVIAL_ABI BasicMember final : private MemberBase,
|
|||||||
}
|
}
|
||||||
|
|
||||||
V8_INLINE const T** GetSlotForTesting() const {
|
V8_INLINE const T** GetSlotForTesting() const {
|
||||||
return reinterpret_cast<const T**>(GetRawSlot());
|
return reinterpret_cast<const T**>(Base::GetRawSlot());
|
||||||
}
|
}
|
||||||
|
|
||||||
V8_INLINE RawStorage GetRawStorage() const {
|
V8_INLINE RawStorage GetRawStorage() const {
|
||||||
return MemberBase::GetRawStorage();
|
return Base::GetRawStorage();
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
V8_INLINE explicit BasicMember(RawStorage raw) : MemberBase(raw) {
|
V8_INLINE explicit BasicMember(RawStorage raw) : Base(raw) {
|
||||||
InitializingWriteBarrier(Get());
|
InitializingWriteBarrier(Get());
|
||||||
this->CheckPointer(Get());
|
this->CheckPointer(Get());
|
||||||
}
|
}
|
||||||
|
|
||||||
V8_INLINE BasicMember& operator=(RawStorage other) {
|
V8_INLINE BasicMember& operator=(RawStorage other) {
|
||||||
SetRawStorageAtomic(other);
|
Base::SetRawStorageAtomic(other);
|
||||||
AssigningWriteBarrier();
|
AssigningWriteBarrier();
|
||||||
this->CheckPointer(Get());
|
this->CheckPointer(Get());
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
V8_INLINE const T* GetRawAtomic() const {
|
V8_INLINE const T* GetRawAtomic() const {
|
||||||
return static_cast<const T*>(MemberBase::GetRawAtomic());
|
return static_cast<const T*>(Base::GetRawAtomic());
|
||||||
}
|
}
|
||||||
|
|
||||||
V8_INLINE void InitializingWriteBarrier(T* value) const {
|
V8_INLINE void InitializingWriteBarrier(T* value) const {
|
||||||
WriteBarrierPolicy::InitializingBarrier(GetRawSlot(), value);
|
WriteBarrierPolicy::InitializingBarrier(Base::GetRawSlot(), value);
|
||||||
}
|
}
|
||||||
V8_INLINE void AssigningWriteBarrier(T* value) const {
|
V8_INLINE void AssigningWriteBarrier(T* value) const {
|
||||||
WriteBarrierPolicy::AssigningBarrier(GetRawSlot(), value);
|
WriteBarrierPolicy::AssigningBarrier(Base::GetRawSlot(), value);
|
||||||
}
|
}
|
||||||
V8_INLINE void AssigningWriteBarrier() const {
|
V8_INLINE void AssigningWriteBarrier() const {
|
||||||
WriteBarrierPolicy::AssigningBarrier(GetRawSlot(), GetRawStorage());
|
WriteBarrierPolicy::AssigningBarrier(Base::GetRawSlot(),
|
||||||
|
Base::GetRawStorage());
|
||||||
}
|
}
|
||||||
|
|
||||||
V8_INLINE void ClearFromGC() const { MemberBase::ClearFromGC(); }
|
V8_INLINE void ClearFromGC() const { Base::ClearFromGC(); }
|
||||||
|
|
||||||
V8_INLINE T* GetFromGC() const { return Get(); }
|
V8_INLINE T* GetFromGC() const { return Get(); }
|
||||||
|
|
||||||
@ -319,19 +325,20 @@ class V8_TRIVIAL_ABI BasicMember final : private MemberBase,
|
|||||||
template <typename U>
|
template <typename U>
|
||||||
friend struct cppgc::TraceTrait;
|
friend struct cppgc::TraceTrait;
|
||||||
template <typename T1, typename WeaknessTag1, typename WriteBarrierPolicy1,
|
template <typename T1, typename WeaknessTag1, typename WriteBarrierPolicy1,
|
||||||
typename CheckingPolicy1>
|
typename CheckingPolicy1, typename StorageType1>
|
||||||
friend class BasicMember;
|
friend class BasicMember;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Member equality operators.
|
// Member equality operators.
|
||||||
template <typename T1, typename WeaknessTag1, typename WriteBarrierPolicy1,
|
template <typename T1, typename WeaknessTag1, typename WriteBarrierPolicy1,
|
||||||
typename CheckingPolicy1, typename T2, typename WeaknessTag2,
|
typename CheckingPolicy1, typename T2, typename WeaknessTag2,
|
||||||
typename WriteBarrierPolicy2, typename CheckingPolicy2>
|
typename WriteBarrierPolicy2, typename CheckingPolicy2,
|
||||||
|
typename StorageType>
|
||||||
V8_INLINE bool operator==(
|
V8_INLINE bool operator==(
|
||||||
const BasicMember<T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1>&
|
const BasicMember<T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1,
|
||||||
member1,
|
StorageType>& member1,
|
||||||
const BasicMember<T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2>&
|
const BasicMember<T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2,
|
||||||
member2) {
|
StorageType>& member2) {
|
||||||
if constexpr (internal::IsDecayedSameV<T1, T2>) {
|
if constexpr (internal::IsDecayedSameV<T1, T2>) {
|
||||||
// Check compressed pointers if types are the same.
|
// Check compressed pointers if types are the same.
|
||||||
return member1.GetRawStorage() == member2.GetRawStorage();
|
return member1.GetRawStorage() == member2.GetRawStorage();
|
||||||
@ -345,31 +352,32 @@ V8_INLINE bool operator==(
|
|||||||
|
|
||||||
template <typename T1, typename WeaknessTag1, typename WriteBarrierPolicy1,
|
template <typename T1, typename WeaknessTag1, typename WriteBarrierPolicy1,
|
||||||
typename CheckingPolicy1, typename T2, typename WeaknessTag2,
|
typename CheckingPolicy1, typename T2, typename WeaknessTag2,
|
||||||
typename WriteBarrierPolicy2, typename CheckingPolicy2>
|
typename WriteBarrierPolicy2, typename CheckingPolicy2,
|
||||||
|
typename StorageType>
|
||||||
V8_INLINE bool operator!=(
|
V8_INLINE bool operator!=(
|
||||||
const BasicMember<T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1>&
|
const BasicMember<T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1,
|
||||||
member1,
|
StorageType>& member1,
|
||||||
const BasicMember<T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2>&
|
const BasicMember<T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2,
|
||||||
member2) {
|
StorageType>& member2) {
|
||||||
return !(member1 == member2);
|
return !(member1 == member2);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Equality with raw pointers.
|
// Equality with raw pointers.
|
||||||
template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
|
template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
|
||||||
typename CheckingPolicy, typename U>
|
typename CheckingPolicy, typename StorageType, typename U>
|
||||||
V8_INLINE bool operator==(const BasicMember<T, WeaknessTag, WriteBarrierPolicy,
|
V8_INLINE bool operator==(
|
||||||
CheckingPolicy>& member,
|
const BasicMember<T, WeaknessTag, WriteBarrierPolicy, CheckingPolicy,
|
||||||
|
StorageType>& member,
|
||||||
U* raw) {
|
U* raw) {
|
||||||
// Never allow comparison with erased pointers.
|
// Never allow comparison with erased pointers.
|
||||||
static_assert(!internal::IsDecayedSameV<void, U>);
|
static_assert(!internal::IsDecayedSameV<void, U>);
|
||||||
|
|
||||||
if constexpr (internal::IsDecayedSameV<T, U>) {
|
if constexpr (internal::IsDecayedSameV<T, U>) {
|
||||||
// Check compressed pointers if types are the same.
|
// Check compressed pointers if types are the same.
|
||||||
return member.GetRawStorage() == MemberBase::RawStorage(raw);
|
return member.GetRawStorage() == StorageType(raw);
|
||||||
} else if constexpr (internal::IsStrictlyBaseOfV<T, U>) {
|
} else if constexpr (internal::IsStrictlyBaseOfV<T, U>) {
|
||||||
// Cast the raw pointer to T, which may adjust the pointer.
|
// Cast the raw pointer to T, which may adjust the pointer.
|
||||||
return member.GetRawStorage() ==
|
return member.GetRawStorage() == StorageType(static_cast<T*>(raw));
|
||||||
MemberBase::RawStorage(static_cast<T*>(raw));
|
|
||||||
} else {
|
} else {
|
||||||
// Otherwise, decompressed the member.
|
// Otherwise, decompressed the member.
|
||||||
return member.Get() == raw;
|
return member.Get() == raw;
|
||||||
@ -377,104 +385,112 @@ V8_INLINE bool operator==(const BasicMember<T, WeaknessTag, WriteBarrierPolicy,
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
|
template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
|
||||||
typename CheckingPolicy, typename U>
|
typename CheckingPolicy, typename StorageType, typename U>
|
||||||
V8_INLINE bool operator!=(const BasicMember<T, WeaknessTag, WriteBarrierPolicy,
|
V8_INLINE bool operator!=(
|
||||||
CheckingPolicy>& member,
|
const BasicMember<T, WeaknessTag, WriteBarrierPolicy, CheckingPolicy,
|
||||||
|
StorageType>& member,
|
||||||
U* raw) {
|
U* raw) {
|
||||||
return !(member == raw);
|
return !(member == raw);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T, typename U, typename WeaknessTag,
|
template <typename T, typename U, typename WeaknessTag,
|
||||||
typename WriteBarrierPolicy, typename CheckingPolicy>
|
typename WriteBarrierPolicy, typename CheckingPolicy,
|
||||||
V8_INLINE bool operator==(T* raw,
|
typename StorageType>
|
||||||
const BasicMember<U, WeaknessTag, WriteBarrierPolicy,
|
V8_INLINE bool operator==(
|
||||||
CheckingPolicy>& member) {
|
T* raw, const BasicMember<U, WeaknessTag, WriteBarrierPolicy,
|
||||||
|
CheckingPolicy, StorageType>& member) {
|
||||||
return member == raw;
|
return member == raw;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T, typename U, typename WeaknessTag,
|
template <typename T, typename U, typename WeaknessTag,
|
||||||
typename WriteBarrierPolicy, typename CheckingPolicy>
|
typename WriteBarrierPolicy, typename CheckingPolicy,
|
||||||
V8_INLINE bool operator!=(T* raw,
|
typename StorageType>
|
||||||
const BasicMember<U, WeaknessTag, WriteBarrierPolicy,
|
V8_INLINE bool operator!=(
|
||||||
CheckingPolicy>& member) {
|
T* raw, const BasicMember<U, WeaknessTag, WriteBarrierPolicy,
|
||||||
|
CheckingPolicy, StorageType>& member) {
|
||||||
return !(raw == member);
|
return !(raw == member);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Equality with sentinel.
|
// Equality with sentinel.
|
||||||
template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
|
template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
|
||||||
typename CheckingPolicy>
|
typename CheckingPolicy, typename StorageType>
|
||||||
V8_INLINE bool operator==(const BasicMember<T, WeaknessTag, WriteBarrierPolicy,
|
V8_INLINE bool operator==(
|
||||||
CheckingPolicy>& member,
|
const BasicMember<T, WeaknessTag, WriteBarrierPolicy, CheckingPolicy,
|
||||||
|
StorageType>& member,
|
||||||
SentinelPointer) {
|
SentinelPointer) {
|
||||||
return member.GetRawStorage().IsSentinel();
|
return member.GetRawStorage().IsSentinel();
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
|
template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
|
||||||
typename CheckingPolicy>
|
typename CheckingPolicy, typename StorageType>
|
||||||
V8_INLINE bool operator!=(const BasicMember<T, WeaknessTag, WriteBarrierPolicy,
|
V8_INLINE bool operator!=(
|
||||||
CheckingPolicy>& member,
|
const BasicMember<T, WeaknessTag, WriteBarrierPolicy, CheckingPolicy,
|
||||||
|
StorageType>& member,
|
||||||
SentinelPointer s) {
|
SentinelPointer s) {
|
||||||
return !(member == s);
|
return !(member == s);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
|
template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
|
||||||
typename CheckingPolicy>
|
typename CheckingPolicy, typename StorageType>
|
||||||
V8_INLINE bool operator==(SentinelPointer s,
|
V8_INLINE bool operator==(
|
||||||
const BasicMember<T, WeaknessTag, WriteBarrierPolicy,
|
SentinelPointer s, const BasicMember<T, WeaknessTag, WriteBarrierPolicy,
|
||||||
CheckingPolicy>& member) {
|
CheckingPolicy, StorageType>& member) {
|
||||||
return member == s;
|
return member == s;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
|
template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
|
||||||
typename CheckingPolicy>
|
typename CheckingPolicy, typename StorageType>
|
||||||
V8_INLINE bool operator!=(SentinelPointer s,
|
V8_INLINE bool operator!=(
|
||||||
const BasicMember<T, WeaknessTag, WriteBarrierPolicy,
|
SentinelPointer s, const BasicMember<T, WeaknessTag, WriteBarrierPolicy,
|
||||||
CheckingPolicy>& member) {
|
CheckingPolicy, StorageType>& member) {
|
||||||
return !(s == member);
|
return !(s == member);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Equality with nullptr.
|
// Equality with nullptr.
|
||||||
template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
|
template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
|
||||||
typename CheckingPolicy>
|
typename CheckingPolicy, typename StorageType>
|
||||||
V8_INLINE bool operator==(const BasicMember<T, WeaknessTag, WriteBarrierPolicy,
|
V8_INLINE bool operator==(
|
||||||
CheckingPolicy>& member,
|
const BasicMember<T, WeaknessTag, WriteBarrierPolicy, CheckingPolicy,
|
||||||
|
StorageType>& member,
|
||||||
std::nullptr_t) {
|
std::nullptr_t) {
|
||||||
return !static_cast<bool>(member);
|
return !static_cast<bool>(member);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
|
template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
|
||||||
typename CheckingPolicy>
|
typename CheckingPolicy, typename StorageType>
|
||||||
V8_INLINE bool operator!=(const BasicMember<T, WeaknessTag, WriteBarrierPolicy,
|
V8_INLINE bool operator!=(
|
||||||
CheckingPolicy>& member,
|
const BasicMember<T, WeaknessTag, WriteBarrierPolicy, CheckingPolicy,
|
||||||
|
StorageType>& member,
|
||||||
std::nullptr_t n) {
|
std::nullptr_t n) {
|
||||||
return !(member == n);
|
return !(member == n);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
|
template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
|
||||||
typename CheckingPolicy>
|
typename CheckingPolicy, typename StorageType>
|
||||||
V8_INLINE bool operator==(std::nullptr_t n,
|
V8_INLINE bool operator==(
|
||||||
const BasicMember<T, WeaknessTag, WriteBarrierPolicy,
|
std::nullptr_t n, const BasicMember<T, WeaknessTag, WriteBarrierPolicy,
|
||||||
CheckingPolicy>& member) {
|
CheckingPolicy, StorageType>& member) {
|
||||||
return member == n;
|
return member == n;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
|
template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
|
||||||
typename CheckingPolicy>
|
typename CheckingPolicy, typename StorageType>
|
||||||
V8_INLINE bool operator!=(std::nullptr_t n,
|
V8_INLINE bool operator!=(
|
||||||
const BasicMember<T, WeaknessTag, WriteBarrierPolicy,
|
std::nullptr_t n, const BasicMember<T, WeaknessTag, WriteBarrierPolicy,
|
||||||
CheckingPolicy>& member) {
|
CheckingPolicy, StorageType>& member) {
|
||||||
return !(n == member);
|
return !(n == member);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Relational operators.
|
// Relational operators.
|
||||||
template <typename T1, typename WeaknessTag1, typename WriteBarrierPolicy1,
|
template <typename T1, typename WeaknessTag1, typename WriteBarrierPolicy1,
|
||||||
typename CheckingPolicy1, typename T2, typename WeaknessTag2,
|
typename CheckingPolicy1, typename T2, typename WeaknessTag2,
|
||||||
typename WriteBarrierPolicy2, typename CheckingPolicy2>
|
typename WriteBarrierPolicy2, typename CheckingPolicy2,
|
||||||
|
typename StorageType>
|
||||||
V8_INLINE bool operator<(
|
V8_INLINE bool operator<(
|
||||||
const BasicMember<T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1>&
|
const BasicMember<T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1,
|
||||||
member1,
|
StorageType>& member1,
|
||||||
const BasicMember<T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2>&
|
const BasicMember<T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2,
|
||||||
member2) {
|
StorageType>& member2) {
|
||||||
static_assert(
|
static_assert(
|
||||||
internal::IsDecayedSameV<T1, T2>,
|
internal::IsDecayedSameV<T1, T2>,
|
||||||
"Comparison works only for same pointer type modulo cv-qualifiers");
|
"Comparison works only for same pointer type modulo cv-qualifiers");
|
||||||
@ -483,12 +499,13 @@ V8_INLINE bool operator<(
|
|||||||
|
|
||||||
template <typename T1, typename WeaknessTag1, typename WriteBarrierPolicy1,
|
template <typename T1, typename WeaknessTag1, typename WriteBarrierPolicy1,
|
||||||
typename CheckingPolicy1, typename T2, typename WeaknessTag2,
|
typename CheckingPolicy1, typename T2, typename WeaknessTag2,
|
||||||
typename WriteBarrierPolicy2, typename CheckingPolicy2>
|
typename WriteBarrierPolicy2, typename CheckingPolicy2,
|
||||||
|
typename StorageType>
|
||||||
V8_INLINE bool operator<=(
|
V8_INLINE bool operator<=(
|
||||||
const BasicMember<T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1>&
|
const BasicMember<T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1,
|
||||||
member1,
|
StorageType>& member1,
|
||||||
const BasicMember<T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2>&
|
const BasicMember<T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2,
|
||||||
member2) {
|
StorageType>& member2) {
|
||||||
static_assert(
|
static_assert(
|
||||||
internal::IsDecayedSameV<T1, T2>,
|
internal::IsDecayedSameV<T1, T2>,
|
||||||
"Comparison works only for same pointer type modulo cv-qualifiers");
|
"Comparison works only for same pointer type modulo cv-qualifiers");
|
||||||
@ -497,12 +514,13 @@ V8_INLINE bool operator<=(
|
|||||||
|
|
||||||
template <typename T1, typename WeaknessTag1, typename WriteBarrierPolicy1,
|
template <typename T1, typename WeaknessTag1, typename WriteBarrierPolicy1,
|
||||||
typename CheckingPolicy1, typename T2, typename WeaknessTag2,
|
typename CheckingPolicy1, typename T2, typename WeaknessTag2,
|
||||||
typename WriteBarrierPolicy2, typename CheckingPolicy2>
|
typename WriteBarrierPolicy2, typename CheckingPolicy2,
|
||||||
|
typename StorageType>
|
||||||
V8_INLINE bool operator>(
|
V8_INLINE bool operator>(
|
||||||
const BasicMember<T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1>&
|
const BasicMember<T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1,
|
||||||
member1,
|
StorageType>& member1,
|
||||||
const BasicMember<T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2>&
|
const BasicMember<T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2,
|
||||||
member2) {
|
StorageType>& member2) {
|
||||||
static_assert(
|
static_assert(
|
||||||
internal::IsDecayedSameV<T1, T2>,
|
internal::IsDecayedSameV<T1, T2>,
|
||||||
"Comparison works only for same pointer type modulo cv-qualifiers");
|
"Comparison works only for same pointer type modulo cv-qualifiers");
|
||||||
@ -511,21 +529,23 @@ V8_INLINE bool operator>(
|
|||||||
|
|
||||||
template <typename T1, typename WeaknessTag1, typename WriteBarrierPolicy1,
|
template <typename T1, typename WeaknessTag1, typename WriteBarrierPolicy1,
|
||||||
typename CheckingPolicy1, typename T2, typename WeaknessTag2,
|
typename CheckingPolicy1, typename T2, typename WeaknessTag2,
|
||||||
typename WriteBarrierPolicy2, typename CheckingPolicy2>
|
typename WriteBarrierPolicy2, typename CheckingPolicy2,
|
||||||
|
typename StorageType>
|
||||||
V8_INLINE bool operator>=(
|
V8_INLINE bool operator>=(
|
||||||
const BasicMember<T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1>&
|
const BasicMember<T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1,
|
||||||
member1,
|
StorageType>& member1,
|
||||||
const BasicMember<T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2>&
|
const BasicMember<T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2,
|
||||||
member2) {
|
StorageType>& member2) {
|
||||||
static_assert(
|
static_assert(
|
||||||
internal::IsDecayedSameV<T1, T2>,
|
internal::IsDecayedSameV<T1, T2>,
|
||||||
"Comparison works only for same pointer type modulo cv-qualifiers");
|
"Comparison works only for same pointer type modulo cv-qualifiers");
|
||||||
return member1.GetRawStorage() >= member2.GetRawStorage();
|
return member1.GetRawStorage() >= member2.GetRawStorage();
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T, typename WriteBarrierPolicy, typename CheckingPolicy>
|
template <typename T, typename WriteBarrierPolicy, typename CheckingPolicy,
|
||||||
struct IsWeak<
|
typename StorageType>
|
||||||
internal::BasicMember<T, WeakMemberTag, WriteBarrierPolicy, CheckingPolicy>>
|
struct IsWeak<internal::BasicMember<T, WeakMemberTag, WriteBarrierPolicy,
|
||||||
|
CheckingPolicy, StorageType>>
|
||||||
: std::true_type {};
|
: std::true_type {};
|
||||||
|
|
||||||
} // namespace internal
|
} // namespace internal
|
||||||
@ -536,8 +556,9 @@ struct IsWeak<
|
|||||||
* trace method.
|
* trace method.
|
||||||
*/
|
*/
|
||||||
template <typename T>
|
template <typename T>
|
||||||
using Member = internal::BasicMember<T, internal::StrongMemberTag,
|
using Member = internal::BasicMember<
|
||||||
internal::DijkstraWriteBarrierPolicy>;
|
T, internal::StrongMemberTag, internal::DijkstraWriteBarrierPolicy,
|
||||||
|
internal::DefaultMemberCheckingPolicy, internal::DefaultMemberStorage>;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* WeakMember is similar to Member in that it is used to point to other garbage
|
* WeakMember is similar to Member in that it is used to point to other garbage
|
||||||
@ -548,8 +569,9 @@ using Member = internal::BasicMember<T, internal::StrongMemberTag,
|
|||||||
* will automatically be set to null.
|
* will automatically be set to null.
|
||||||
*/
|
*/
|
||||||
template <typename T>
|
template <typename T>
|
||||||
using WeakMember = internal::BasicMember<T, internal::WeakMemberTag,
|
using WeakMember = internal::BasicMember<
|
||||||
internal::DijkstraWriteBarrierPolicy>;
|
T, internal::WeakMemberTag, internal::DijkstraWriteBarrierPolicy,
|
||||||
|
internal::DefaultMemberCheckingPolicy, internal::DefaultMemberStorage>;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* UntracedMember is a pointer to an on-heap object that is not traced for some
|
* UntracedMember is a pointer to an on-heap object that is not traced for some
|
||||||
@ -558,8 +580,22 @@ using WeakMember = internal::BasicMember<T, internal::WeakMemberTag,
|
|||||||
* must be kept alive through other means.
|
* must be kept alive through other means.
|
||||||
*/
|
*/
|
||||||
template <typename T>
|
template <typename T>
|
||||||
using UntracedMember = internal::BasicMember<T, internal::UntracedMemberTag,
|
using UntracedMember = internal::BasicMember<
|
||||||
internal::NoWriteBarrierPolicy>;
|
T, internal::UntracedMemberTag, internal::NoWriteBarrierPolicy,
|
||||||
|
internal::DefaultMemberCheckingPolicy, internal::DefaultMemberStorage>;
|
||||||
|
|
||||||
|
namespace subtle {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UncompressedMember. Use with care in hot paths that would otherwise cause
|
||||||
|
* many decompression cycles.
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
using UncompressedMember = internal::BasicMember<
|
||||||
|
T, internal::StrongMemberTag, internal::DijkstraWriteBarrierPolicy,
|
||||||
|
internal::DefaultMemberCheckingPolicy, internal::RawPointer>;
|
||||||
|
|
||||||
|
} // namespace subtle
|
||||||
|
|
||||||
} // namespace cppgc
|
} // namespace cppgc
|
||||||
|
|
||||||
|
@ -114,10 +114,11 @@ class BasicPersistent final : public PersistentBase,
|
|||||||
// Constructor from member.
|
// Constructor from member.
|
||||||
template <typename U, typename MemberBarrierPolicy,
|
template <typename U, typename MemberBarrierPolicy,
|
||||||
typename MemberWeaknessTag, typename MemberCheckingPolicy,
|
typename MemberWeaknessTag, typename MemberCheckingPolicy,
|
||||||
|
typename MemberStorageType,
|
||||||
typename = std::enable_if_t<std::is_base_of<T, U>::value>>
|
typename = std::enable_if_t<std::is_base_of<T, U>::value>>
|
||||||
BasicPersistent(
|
BasicPersistent(const internal::BasicMember<
|
||||||
const internal::BasicMember<U, MemberBarrierPolicy, MemberWeaknessTag,
|
U, MemberBarrierPolicy, MemberWeaknessTag,
|
||||||
MemberCheckingPolicy>& member,
|
MemberCheckingPolicy, MemberStorageType>& member,
|
||||||
const SourceLocation& loc = SourceLocation::Current())
|
const SourceLocation& loc = SourceLocation::Current())
|
||||||
: BasicPersistent(member.Get(), loc) {}
|
: BasicPersistent(member.Get(), loc) {}
|
||||||
|
|
||||||
@ -154,10 +155,12 @@ class BasicPersistent final : public PersistentBase,
|
|||||||
// Assignment from member.
|
// Assignment from member.
|
||||||
template <typename U, typename MemberBarrierPolicy,
|
template <typename U, typename MemberBarrierPolicy,
|
||||||
typename MemberWeaknessTag, typename MemberCheckingPolicy,
|
typename MemberWeaknessTag, typename MemberCheckingPolicy,
|
||||||
|
typename MemberStorageType,
|
||||||
typename = std::enable_if_t<std::is_base_of<T, U>::value>>
|
typename = std::enable_if_t<std::is_base_of<T, U>::value>>
|
||||||
BasicPersistent& operator=(
|
BasicPersistent& operator=(
|
||||||
const internal::BasicMember<U, MemberBarrierPolicy, MemberWeaknessTag,
|
const internal::BasicMember<U, MemberBarrierPolicy, MemberWeaknessTag,
|
||||||
MemberCheckingPolicy>& member) {
|
MemberCheckingPolicy, MemberStorageType>&
|
||||||
|
member) {
|
||||||
return operator=(member.Get());
|
return operator=(member.Get());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -286,36 +289,39 @@ bool operator!=(const BasicPersistent<T1, WeaknessPolicy1, LocationPolicy1,
|
|||||||
template <typename T1, typename PersistentWeaknessPolicy,
|
template <typename T1, typename PersistentWeaknessPolicy,
|
||||||
typename PersistentLocationPolicy, typename PersistentCheckingPolicy,
|
typename PersistentLocationPolicy, typename PersistentCheckingPolicy,
|
||||||
typename T2, typename MemberWriteBarrierPolicy,
|
typename T2, typename MemberWriteBarrierPolicy,
|
||||||
typename MemberWeaknessTag, typename MemberCheckingPolicy>
|
typename MemberWeaknessTag, typename MemberCheckingPolicy,
|
||||||
|
typename MemberStorageType>
|
||||||
bool operator==(
|
bool operator==(
|
||||||
const BasicPersistent<T1, PersistentWeaknessPolicy,
|
const BasicPersistent<T1, PersistentWeaknessPolicy,
|
||||||
PersistentLocationPolicy, PersistentCheckingPolicy>&
|
PersistentLocationPolicy, PersistentCheckingPolicy>&
|
||||||
p,
|
p,
|
||||||
const BasicMember<T2, MemberWeaknessTag, MemberWriteBarrierPolicy,
|
const BasicMember<T2, MemberWeaknessTag, MemberWriteBarrierPolicy,
|
||||||
MemberCheckingPolicy>& m) {
|
MemberCheckingPolicy, MemberStorageType>& m) {
|
||||||
return p.Get() == m.Get();
|
return p.Get() == m.Get();
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T1, typename PersistentWeaknessPolicy,
|
template <typename T1, typename PersistentWeaknessPolicy,
|
||||||
typename PersistentLocationPolicy, typename PersistentCheckingPolicy,
|
typename PersistentLocationPolicy, typename PersistentCheckingPolicy,
|
||||||
typename T2, typename MemberWriteBarrierPolicy,
|
typename T2, typename MemberWriteBarrierPolicy,
|
||||||
typename MemberWeaknessTag, typename MemberCheckingPolicy>
|
typename MemberWeaknessTag, typename MemberCheckingPolicy,
|
||||||
|
typename MemberStorageType>
|
||||||
bool operator!=(
|
bool operator!=(
|
||||||
const BasicPersistent<T1, PersistentWeaknessPolicy,
|
const BasicPersistent<T1, PersistentWeaknessPolicy,
|
||||||
PersistentLocationPolicy, PersistentCheckingPolicy>&
|
PersistentLocationPolicy, PersistentCheckingPolicy>&
|
||||||
p,
|
p,
|
||||||
const BasicMember<T2, MemberWeaknessTag, MemberWriteBarrierPolicy,
|
const BasicMember<T2, MemberWeaknessTag, MemberWriteBarrierPolicy,
|
||||||
MemberCheckingPolicy>& m) {
|
MemberCheckingPolicy, MemberStorageType>& m) {
|
||||||
return !(p == m);
|
return !(p == m);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T1, typename MemberWriteBarrierPolicy,
|
template <typename T1, typename MemberWriteBarrierPolicy,
|
||||||
typename MemberWeaknessTag, typename MemberCheckingPolicy,
|
typename MemberWeaknessTag, typename MemberCheckingPolicy,
|
||||||
typename T2, typename PersistentWeaknessPolicy,
|
typename MemberStorageType, typename T2,
|
||||||
typename PersistentLocationPolicy, typename PersistentCheckingPolicy>
|
typename PersistentWeaknessPolicy, typename PersistentLocationPolicy,
|
||||||
|
typename PersistentCheckingPolicy>
|
||||||
bool operator==(
|
bool operator==(
|
||||||
const BasicMember<T2, MemberWeaknessTag, MemberWriteBarrierPolicy,
|
const BasicMember<T2, MemberWeaknessTag, MemberWriteBarrierPolicy,
|
||||||
MemberCheckingPolicy>& m,
|
MemberCheckingPolicy, MemberStorageType>& m,
|
||||||
const BasicPersistent<T1, PersistentWeaknessPolicy,
|
const BasicPersistent<T1, PersistentWeaknessPolicy,
|
||||||
PersistentLocationPolicy, PersistentCheckingPolicy>&
|
PersistentLocationPolicy, PersistentCheckingPolicy>&
|
||||||
p) {
|
p) {
|
||||||
@ -324,11 +330,12 @@ bool operator==(
|
|||||||
|
|
||||||
template <typename T1, typename MemberWriteBarrierPolicy,
|
template <typename T1, typename MemberWriteBarrierPolicy,
|
||||||
typename MemberWeaknessTag, typename MemberCheckingPolicy,
|
typename MemberWeaknessTag, typename MemberCheckingPolicy,
|
||||||
typename T2, typename PersistentWeaknessPolicy,
|
typename MemberStorageType, typename T2,
|
||||||
typename PersistentLocationPolicy, typename PersistentCheckingPolicy>
|
typename PersistentWeaknessPolicy, typename PersistentLocationPolicy,
|
||||||
|
typename PersistentCheckingPolicy>
|
||||||
bool operator!=(
|
bool operator!=(
|
||||||
const BasicMember<T2, MemberWeaknessTag, MemberWriteBarrierPolicy,
|
const BasicMember<T2, MemberWeaknessTag, MemberWriteBarrierPolicy,
|
||||||
MemberCheckingPolicy>& m,
|
MemberCheckingPolicy, MemberStorageType>& m,
|
||||||
const BasicPersistent<T1, PersistentWeaknessPolicy,
|
const BasicPersistent<T1, PersistentWeaknessPolicy,
|
||||||
PersistentLocationPolicy, PersistentCheckingPolicy>&
|
PersistentLocationPolicy, PersistentCheckingPolicy>&
|
||||||
p) {
|
p) {
|
||||||
|
@ -16,7 +16,7 @@ class Visitor;
|
|||||||
|
|
||||||
namespace internal {
|
namespace internal {
|
||||||
template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
|
template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
|
||||||
typename CheckingPolicy>
|
typename CheckingPolicy, typename StorageType>
|
||||||
class BasicMember;
|
class BasicMember;
|
||||||
struct DijkstraWriteBarrierPolicy;
|
struct DijkstraWriteBarrierPolicy;
|
||||||
struct NoWriteBarrierPolicy;
|
struct NoWriteBarrierPolicy;
|
||||||
@ -126,9 +126,10 @@ template <typename BasicMemberCandidate, typename WeaknessTag,
|
|||||||
typename WriteBarrierPolicy>
|
typename WriteBarrierPolicy>
|
||||||
struct IsSubclassOfBasicMemberTemplate {
|
struct IsSubclassOfBasicMemberTemplate {
|
||||||
private:
|
private:
|
||||||
template <typename T, typename CheckingPolicy>
|
template <typename T, typename CheckingPolicy, typename StorageType>
|
||||||
static std::true_type SubclassCheck(
|
static std::true_type SubclassCheck(
|
||||||
BasicMember<T, WeaknessTag, WriteBarrierPolicy, CheckingPolicy>*);
|
BasicMember<T, WeaknessTag, WriteBarrierPolicy, CheckingPolicy,
|
||||||
|
StorageType>*);
|
||||||
static std::false_type SubclassCheck(...);
|
static std::false_type SubclassCheck(...);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -99,6 +99,20 @@ class V8_EXPORT Visitor {
|
|||||||
&HandleWeak<WeakMember<T>>, &weak_member);
|
&HandleWeak<WeakMember<T>>, &weak_member);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(CPPGC_POINTER_COMPRESSION)
|
||||||
|
/**
|
||||||
|
* Trace method for UncompressedMember.
|
||||||
|
*
|
||||||
|
* \param member UncompressedMember reference retaining an object.
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
void Trace(const subtle::UncompressedMember<T>& member) {
|
||||||
|
const T* value = member.GetRawAtomic();
|
||||||
|
CPPGC_DCHECK(value != kSentinelPointer);
|
||||||
|
TraceImpl(value);
|
||||||
|
}
|
||||||
|
#endif // defined(CPPGC_POINTER_COMPRESSION)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Trace method for inlined objects that are not allocated themselves but
|
* Trace method for inlined objects that are not allocated themselves but
|
||||||
* otherwise follow managed heap layout and have a Trace() method.
|
* otherwise follow managed heap layout and have a Trace() method.
|
||||||
|
@ -1402,6 +1402,13 @@ domain Runtime
|
|||||||
optional string objectGroup
|
optional string objectGroup
|
||||||
# Whether to throw an exception if side effect cannot be ruled out during evaluation.
|
# Whether to throw an exception if side effect cannot be ruled out during evaluation.
|
||||||
experimental optional boolean throwOnSideEffect
|
experimental optional boolean throwOnSideEffect
|
||||||
|
# An alternative way to specify the execution context to call function on.
|
||||||
|
# Compared to contextId that may be reused across processes, this is guaranteed to be
|
||||||
|
# system-unique, so it can be used to prevent accidental function call
|
||||||
|
# in context different than intended (e.g. as a result of navigation across process
|
||||||
|
# boundaries).
|
||||||
|
# This is mutually exclusive with `executionContextId`.
|
||||||
|
experimental optional string uniqueContextId
|
||||||
# Whether the result should contain `webDriverValue`, serialized according to
|
# Whether the result should contain `webDriverValue`, serialized according to
|
||||||
# https://w3c.github.io/webdriver-bidi. This is mutually exclusive with `returnByValue`, but
|
# https://w3c.github.io/webdriver-bidi. This is mutually exclusive with `returnByValue`, but
|
||||||
# resulting `objectId` is still provided.
|
# resulting `objectId` is still provided.
|
||||||
@ -1734,7 +1741,9 @@ domain Runtime
|
|||||||
event executionContextDestroyed
|
event executionContextDestroyed
|
||||||
parameters
|
parameters
|
||||||
# Id of the destroyed context
|
# Id of the destroyed context
|
||||||
ExecutionContextId executionContextId
|
deprecated ExecutionContextId executionContextId
|
||||||
|
# Unique Id of the destroyed context
|
||||||
|
experimental string executionContextUniqueId
|
||||||
|
|
||||||
# Issued when all executionContexts were cleared in browser
|
# Issued when all executionContexts were cleared in browser
|
||||||
event executionContextsCleared
|
event executionContextsCleared
|
||||||
|
@ -328,6 +328,10 @@ using WasmSimdEnabledCallback = bool (*)(Local<Context> context);
|
|||||||
// --- Callback for checking if WebAssembly exceptions are enabled ---
|
// --- Callback for checking if WebAssembly exceptions are enabled ---
|
||||||
using WasmExceptionsEnabledCallback = bool (*)(Local<Context> context);
|
using WasmExceptionsEnabledCallback = bool (*)(Local<Context> context);
|
||||||
|
|
||||||
|
// --- Callback for checking if WebAssembly GC is enabled ---
|
||||||
|
// If the callback returns true, it will also enable Wasm stringrefs.
|
||||||
|
using WasmGCEnabledCallback = bool (*)(Local<Context> context);
|
||||||
|
|
||||||
// --- Callback for checking if the SharedArrayBuffer constructor is enabled ---
|
// --- Callback for checking if the SharedArrayBuffer constructor is enabled ---
|
||||||
using SharedArrayBufferConstructorEnabledCallback =
|
using SharedArrayBufferConstructorEnabledCallback =
|
||||||
bool (*)(Local<Context> context);
|
bool (*)(Local<Context> context);
|
||||||
|
@ -85,6 +85,7 @@ struct CppHeapCreateParams {
|
|||||||
inline CppHeapCreateParams(WrapperDescriptor wrapper_descriptor)
|
inline CppHeapCreateParams(WrapperDescriptor wrapper_descriptor)
|
||||||
: wrapper_descriptor(wrapper_descriptor) {}
|
: wrapper_descriptor(wrapper_descriptor) {}
|
||||||
|
|
||||||
|
|
||||||
std::vector<std::unique_ptr<cppgc::CustomSpaceBase>> custom_spaces;
|
std::vector<std::unique_ptr<cppgc::CustomSpaceBase>> custom_spaces;
|
||||||
WrapperDescriptor wrapper_descriptor;
|
WrapperDescriptor wrapper_descriptor;
|
||||||
/**
|
/**
|
||||||
|
@ -5,27 +5,14 @@
|
|||||||
#ifndef INCLUDE_V8_EMBEDDER_HEAP_H_
|
#ifndef INCLUDE_V8_EMBEDDER_HEAP_H_
|
||||||
#define INCLUDE_V8_EMBEDDER_HEAP_H_
|
#define INCLUDE_V8_EMBEDDER_HEAP_H_
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#include <utility>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "cppgc/common.h"
|
|
||||||
#include "v8-local-handle.h" // NOLINT(build/include_directory)
|
|
||||||
#include "v8-traced-handle.h" // NOLINT(build/include_directory)
|
#include "v8-traced-handle.h" // NOLINT(build/include_directory)
|
||||||
#include "v8config.h" // NOLINT(build/include_directory)
|
#include "v8config.h" // NOLINT(build/include_directory)
|
||||||
|
|
||||||
namespace v8 {
|
namespace v8 {
|
||||||
|
|
||||||
class Data;
|
|
||||||
class Isolate;
|
class Isolate;
|
||||||
class Value;
|
class Value;
|
||||||
|
|
||||||
namespace internal {
|
|
||||||
class LocalEmbedderHeapTracer;
|
|
||||||
} // namespace internal
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handler for embedder roots on non-unified heap garbage collections.
|
* Handler for embedder roots on non-unified heap garbage collections.
|
||||||
*/
|
*/
|
||||||
@ -62,162 +49,6 @@ class V8_EXPORT EmbedderRootsHandler {
|
|||||||
virtual void ResetRoot(const v8::TracedReference<v8::Value>& handle) = 0;
|
virtual void ResetRoot(const v8::TracedReference<v8::Value>& handle) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* Interface for tracing through the embedder heap. During a V8 garbage
|
|
||||||
* collection, V8 collects hidden fields of all potential wrappers, and at the
|
|
||||||
* end of its marking phase iterates the collection and asks the embedder to
|
|
||||||
* trace through its heap and use reporter to report each JavaScript object
|
|
||||||
* reachable from any of the given wrappers.
|
|
||||||
*/
|
|
||||||
class V8_EXPORT
|
|
||||||
// GCC doesn't like combining __attribute__(()) with [[deprecated]].
|
|
||||||
#ifdef __clang__
|
|
||||||
V8_DEPRECATED("Use CppHeap when working with v8::TracedReference.")
|
|
||||||
#endif // __clang__
|
|
||||||
EmbedderHeapTracer {
|
|
||||||
public:
|
|
||||||
using EmbedderStackState = cppgc::EmbedderStackState;
|
|
||||||
|
|
||||||
enum TraceFlags : uint64_t {
|
|
||||||
kNoFlags = 0,
|
|
||||||
kReduceMemory = 1 << 0,
|
|
||||||
kForced = 1 << 2,
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Interface for iterating through |TracedReference| handles.
|
|
||||||
*/
|
|
||||||
class V8_EXPORT TracedGlobalHandleVisitor {
|
|
||||||
public:
|
|
||||||
virtual ~TracedGlobalHandleVisitor() = default;
|
|
||||||
virtual void VisitTracedReference(const TracedReference<Value>& handle) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Summary of a garbage collection cycle. See |TraceEpilogue| on how the
|
|
||||||
* summary is reported.
|
|
||||||
*/
|
|
||||||
struct TraceSummary {
|
|
||||||
/**
|
|
||||||
* Time spent managing the retained memory in milliseconds. This can e.g.
|
|
||||||
* include the time tracing through objects in the embedder.
|
|
||||||
*/
|
|
||||||
double time = 0.0;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Memory retained by the embedder through the |EmbedderHeapTracer|
|
|
||||||
* mechanism in bytes.
|
|
||||||
*/
|
|
||||||
size_t allocated_size = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
virtual ~EmbedderHeapTracer() = default;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Iterates all |TracedReference| handles created for the |v8::Isolate| the
|
|
||||||
* tracer is attached to.
|
|
||||||
*/
|
|
||||||
void IterateTracedGlobalHandles(TracedGlobalHandleVisitor* visitor);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called by the embedder to set the start of the stack which is e.g. used by
|
|
||||||
* V8 to determine whether handles are used from stack or heap.
|
|
||||||
*/
|
|
||||||
void SetStackStart(void* stack_start);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called by v8 to register internal fields of found wrappers.
|
|
||||||
*
|
|
||||||
* The embedder is expected to store them somewhere and trace reachable
|
|
||||||
* wrappers from them when called through |AdvanceTracing|.
|
|
||||||
*/
|
|
||||||
virtual void RegisterV8References(
|
|
||||||
const std::vector<std::pair<void*, void*>>& embedder_fields) = 0;
|
|
||||||
|
|
||||||
void RegisterEmbedderReference(const BasicTracedReference<v8::Data>& ref);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called at the beginning of a GC cycle.
|
|
||||||
*/
|
|
||||||
virtual void TracePrologue(TraceFlags flags) {}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called to advance tracing in the embedder.
|
|
||||||
*
|
|
||||||
* The embedder is expected to trace its heap starting from wrappers reported
|
|
||||||
* by RegisterV8References method, and report back all reachable wrappers.
|
|
||||||
* Furthermore, the embedder is expected to stop tracing by the given
|
|
||||||
* deadline. A deadline of infinity means that tracing should be finished.
|
|
||||||
*
|
|
||||||
* Returns |true| if tracing is done, and false otherwise.
|
|
||||||
*/
|
|
||||||
virtual bool AdvanceTracing(double deadline_in_ms) = 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Returns true if there no more tracing work to be done (see AdvanceTracing)
|
|
||||||
* and false otherwise.
|
|
||||||
*/
|
|
||||||
virtual bool IsTracingDone() = 0;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called at the end of a GC cycle.
|
|
||||||
*
|
|
||||||
* Note that allocation is *not* allowed within |TraceEpilogue|. Can be
|
|
||||||
* overriden to fill a |TraceSummary| that is used by V8 to schedule future
|
|
||||||
* garbage collections.
|
|
||||||
*/
|
|
||||||
virtual void TraceEpilogue(TraceSummary* trace_summary) {}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called upon entering the final marking pause. No more incremental marking
|
|
||||||
* steps will follow this call.
|
|
||||||
*/
|
|
||||||
virtual void EnterFinalPause(EmbedderStackState stack_state) = 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Called by the embedder to request immediate finalization of the currently
|
|
||||||
* running tracing phase that has been started with TracePrologue and not
|
|
||||||
* yet finished with TraceEpilogue.
|
|
||||||
*
|
|
||||||
* Will be a noop when currently not in tracing.
|
|
||||||
*
|
|
||||||
* This is an experimental feature.
|
|
||||||
*/
|
|
||||||
void FinalizeTracing();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* See documentation on EmbedderRootsHandler.
|
|
||||||
*/
|
|
||||||
virtual bool IsRootForNonTracingGC(
|
|
||||||
const v8::TracedReference<v8::Value>& handle);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* See documentation on EmbedderRootsHandler.
|
|
||||||
*/
|
|
||||||
virtual void ResetHandleInNonTracingGC(
|
|
||||||
const v8::TracedReference<v8::Value>& handle);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Called by the embedder to signal newly allocated or freed memory. Not bound
|
|
||||||
* to tracing phases. Embedders should trade off when increments are reported
|
|
||||||
* as V8 may consult global heuristics on whether to trigger garbage
|
|
||||||
* collection on this change.
|
|
||||||
*/
|
|
||||||
void IncreaseAllocatedSize(size_t bytes);
|
|
||||||
void DecreaseAllocatedSize(size_t bytes);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Returns the v8::Isolate this tracer is attached too and |nullptr| if it
|
|
||||||
* is not attached to any v8::Isolate.
|
|
||||||
*/
|
|
||||||
v8::Isolate* isolate() const { return v8_isolate_; }
|
|
||||||
|
|
||||||
protected:
|
|
||||||
v8::Isolate* v8_isolate_ = nullptr;
|
|
||||||
|
|
||||||
friend class internal::LocalEmbedderHeapTracer;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace v8
|
} // namespace v8
|
||||||
|
|
||||||
#endif // INCLUDE_V8_EMBEDDER_HEAP_H_
|
#endif // INCLUDE_V8_EMBEDDER_HEAP_H_
|
||||||
|
@ -315,6 +315,7 @@ static_assert(1ULL << (64 - kBoundedSizeShift) ==
|
|||||||
|
|
||||||
#ifdef V8_COMPRESS_POINTERS
|
#ifdef V8_COMPRESS_POINTERS
|
||||||
|
|
||||||
|
#ifdef V8_TARGET_OS_ANDROID
|
||||||
// The size of the virtual memory reservation for an external pointer table.
|
// The size of the virtual memory reservation for an external pointer table.
|
||||||
// This determines the maximum number of entries in a table. Using a maximum
|
// This determines the maximum number of entries in a table. Using a maximum
|
||||||
// size allows omitting bounds checks on table accesses if the indices are
|
// size allows omitting bounds checks on table accesses if the indices are
|
||||||
@ -322,14 +323,18 @@ static_assert(1ULL << (64 - kBoundedSizeShift) ==
|
|||||||
// value must be a power of two.
|
// value must be a power of two.
|
||||||
static const size_t kExternalPointerTableReservationSize = 512 * MB;
|
static const size_t kExternalPointerTableReservationSize = 512 * MB;
|
||||||
|
|
||||||
// The maximum number of entries in an external pointer table.
|
|
||||||
static const size_t kMaxExternalPointers =
|
|
||||||
kExternalPointerTableReservationSize / kApiSystemPointerSize;
|
|
||||||
|
|
||||||
// The external pointer table indices stored in HeapObjects as external
|
// The external pointer table indices stored in HeapObjects as external
|
||||||
// pointers are shifted to the left by this amount to guarantee that they are
|
// pointers are shifted to the left by this amount to guarantee that they are
|
||||||
// smaller than the maximum table size.
|
// smaller than the maximum table size.
|
||||||
static const uint32_t kExternalPointerIndexShift = 6;
|
static const uint32_t kExternalPointerIndexShift = 6;
|
||||||
|
#else
|
||||||
|
static const size_t kExternalPointerTableReservationSize = 1024 * MB;
|
||||||
|
static const uint32_t kExternalPointerIndexShift = 5;
|
||||||
|
#endif // V8_TARGET_OS_ANDROID
|
||||||
|
|
||||||
|
// The maximum number of entries in an external pointer table.
|
||||||
|
static const size_t kMaxExternalPointers =
|
||||||
|
kExternalPointerTableReservationSize / kApiSystemPointerSize;
|
||||||
static_assert((1 << (32 - kExternalPointerIndexShift)) == kMaxExternalPointers,
|
static_assert((1 << (32 - kExternalPointerIndexShift)) == kMaxExternalPointers,
|
||||||
"kExternalPointerTableReservationSize and "
|
"kExternalPointerTableReservationSize and "
|
||||||
"kExternalPointerIndexShift don't match");
|
"kExternalPointerIndexShift don't match");
|
||||||
|
@ -541,6 +541,7 @@ class V8_EXPORT Isolate {
|
|||||||
kTurboFanOsrCompileStarted = 115,
|
kTurboFanOsrCompileStarted = 115,
|
||||||
kAsyncStackTaggingCreateTaskCall = 116,
|
kAsyncStackTaggingCreateTaskCall = 116,
|
||||||
kDurationFormat = 117,
|
kDurationFormat = 117,
|
||||||
|
kInvalidatedNumberStringPrototypeNoReplaceProtector = 118,
|
||||||
|
|
||||||
// If you add new values here, you'll also need to update Chromium's:
|
// If you add new values here, you'll also need to update Chromium's:
|
||||||
// web_feature.mojom, use_counter_callback.cc, and enums.xml. V8 changes to
|
// web_feature.mojom, use_counter_callback.cc, and enums.xml. V8 changes to
|
||||||
@ -928,27 +929,10 @@ class V8_EXPORT Isolate {
|
|||||||
void RemoveGCPrologueCallback(GCCallbackWithData, void* data = nullptr);
|
void RemoveGCPrologueCallback(GCCallbackWithData, void* data = nullptr);
|
||||||
void RemoveGCPrologueCallback(GCCallback callback);
|
void RemoveGCPrologueCallback(GCCallback callback);
|
||||||
|
|
||||||
START_ALLOW_USE_DEPRECATED()
|
|
||||||
/**
|
|
||||||
* Sets the embedder heap tracer for the isolate.
|
|
||||||
* SetEmbedderHeapTracer cannot be used simultaneously with AttachCppHeap.
|
|
||||||
*/
|
|
||||||
void SetEmbedderHeapTracer(EmbedderHeapTracer* tracer);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Gets the currently active heap tracer for the isolate that was set with
|
|
||||||
* SetEmbedderHeapTracer.
|
|
||||||
*/
|
|
||||||
EmbedderHeapTracer* GetEmbedderHeapTracer();
|
|
||||||
END_ALLOW_USE_DEPRECATED()
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets an embedder roots handle that V8 should consider when performing
|
* Sets an embedder roots handle that V8 should consider when performing
|
||||||
* non-unified heap garbage collections.
|
* non-unified heap garbage collections. The intended use case is for setting
|
||||||
*
|
* a custom handler after invoking `AttachCppHeap()`.
|
||||||
* Using only EmbedderHeapTracer automatically sets up a default handler.
|
|
||||||
* The intended use case is for setting a custom handler after invoking
|
|
||||||
* `AttachCppHeap()`.
|
|
||||||
*
|
*
|
||||||
* V8 does not take ownership of the handler.
|
* V8 does not take ownership of the handler.
|
||||||
*/
|
*/
|
||||||
@ -959,8 +943,6 @@ class V8_EXPORT Isolate {
|
|||||||
* embedder maintains ownership of the CppHeap. At most one C++ heap can be
|
* embedder maintains ownership of the CppHeap. At most one C++ heap can be
|
||||||
* attached to V8.
|
* attached to V8.
|
||||||
*
|
*
|
||||||
* AttachCppHeap cannot be used simultaneously with SetEmbedderHeapTracer.
|
|
||||||
*
|
|
||||||
* Multi-threaded use requires the use of v8::Locker/v8::Unlocker, see
|
* Multi-threaded use requires the use of v8::Locker/v8::Unlocker, see
|
||||||
* CppHeap.
|
* CppHeap.
|
||||||
*/
|
*/
|
||||||
@ -1350,11 +1332,13 @@ class V8_EXPORT Isolate {
|
|||||||
* V8 uses this notification to guide heuristics which may result in a
|
* V8 uses this notification to guide heuristics which may result in a
|
||||||
* smaller memory footprint at the cost of reduced runtime performance.
|
* smaller memory footprint at the cost of reduced runtime performance.
|
||||||
*/
|
*/
|
||||||
|
V8_DEPRECATED("Use IsolateInBackgroundNotification() instead")
|
||||||
void EnableMemorySavingsMode();
|
void EnableMemorySavingsMode();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Optional notification which will disable the memory savings mode.
|
* Optional notification which will disable the memory savings mode.
|
||||||
*/
|
*/
|
||||||
|
V8_DEPRECATED("Use IsolateInBackgroundNotification() instead")
|
||||||
void DisableMemorySavingsMode();
|
void DisableMemorySavingsMode();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1534,6 +1518,13 @@ class V8_EXPORT Isolate {
|
|||||||
V8_DEPRECATED("Wasm exceptions are always enabled")
|
V8_DEPRECATED("Wasm exceptions are always enabled")
|
||||||
void SetWasmExceptionsEnabledCallback(WasmExceptionsEnabledCallback callback);
|
void SetWasmExceptionsEnabledCallback(WasmExceptionsEnabledCallback callback);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register callback to control whehter Wasm GC is enabled.
|
||||||
|
* The callback overwrites the value of the flag.
|
||||||
|
* If the callback returns true, it will also enable Wasm stringrefs.
|
||||||
|
*/
|
||||||
|
void SetWasmGCEnabledCallback(WasmGCEnabledCallback callback);
|
||||||
|
|
||||||
void SetSharedArrayBufferConstructorEnabledCallback(
|
void SetSharedArrayBufferConstructorEnabledCallback(
|
||||||
SharedArrayBufferConstructorEnabledCallback callback);
|
SharedArrayBufferConstructorEnabledCallback callback);
|
||||||
|
|
||||||
|
@ -53,6 +53,7 @@ class Utils;
|
|||||||
namespace internal {
|
namespace internal {
|
||||||
template <typename T>
|
template <typename T>
|
||||||
class CustomArguments;
|
class CustomArguments;
|
||||||
|
class SamplingHeapProfiler;
|
||||||
} // namespace internal
|
} // namespace internal
|
||||||
|
|
||||||
namespace api_internal {
|
namespace api_internal {
|
||||||
@ -313,6 +314,7 @@ class Local {
|
|||||||
friend class BasicTracedReference;
|
friend class BasicTracedReference;
|
||||||
template <class F>
|
template <class F>
|
||||||
friend class TracedReference;
|
friend class TracedReference;
|
||||||
|
friend class v8::internal::SamplingHeapProfiler;
|
||||||
|
|
||||||
explicit V8_INLINE Local(T* that) : val_(that) {}
|
explicit V8_INLINE Local(T* that) : val_(that) {}
|
||||||
V8_INLINE static Local<T> New(Isolate* isolate, T* that) {
|
V8_INLINE static Local<T> New(Isolate* isolate, T* that) {
|
||||||
|
@ -108,34 +108,12 @@ struct WasmModuleDecoded {
|
|||||||
function_count(function_count),
|
function_count(function_count),
|
||||||
wall_clock_duration_in_us(wall_clock_duration_in_us) {}
|
wall_clock_duration_in_us(wall_clock_duration_in_us) {}
|
||||||
|
|
||||||
V8_DEPRECATED("Use the version without cpu_duration_in_us")
|
|
||||||
WasmModuleDecoded(bool async, bool streamed, bool success,
|
|
||||||
size_t module_size_in_bytes, size_t function_count,
|
|
||||||
int64_t wall_clock_duration_in_us,
|
|
||||||
int64_t cpu_duration_in_us)
|
|
||||||
: async(async),
|
|
||||||
streamed(streamed),
|
|
||||||
success(success),
|
|
||||||
module_size_in_bytes(module_size_in_bytes),
|
|
||||||
function_count(function_count),
|
|
||||||
wall_clock_duration_in_us(wall_clock_duration_in_us),
|
|
||||||
cpu_duration_in_us(cpu_duration_in_us) {}
|
|
||||||
|
|
||||||
START_ALLOW_USE_DEPRECATED()
|
|
||||||
// Copy constructor and copy assignment operator are allowed to copy the
|
|
||||||
// {cpu_duration_in_us} field.
|
|
||||||
WasmModuleDecoded(const WasmModuleDecoded&) = default;
|
|
||||||
WasmModuleDecoded& operator=(const WasmModuleDecoded&) = default;
|
|
||||||
END_ALLOW_USE_DEPRECATED()
|
|
||||||
|
|
||||||
bool async = false;
|
bool async = false;
|
||||||
bool streamed = false;
|
bool streamed = false;
|
||||||
bool success = false;
|
bool success = false;
|
||||||
size_t module_size_in_bytes = 0;
|
size_t module_size_in_bytes = 0;
|
||||||
size_t function_count = 0;
|
size_t function_count = 0;
|
||||||
int64_t wall_clock_duration_in_us = -1;
|
int64_t wall_clock_duration_in_us = -1;
|
||||||
V8_DEPRECATED("We do not collect cpu times any more")
|
|
||||||
int64_t cpu_duration_in_us = -1;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct WasmModuleCompiled {
|
struct WasmModuleCompiled {
|
||||||
@ -155,30 +133,6 @@ struct WasmModuleCompiled {
|
|||||||
liftoff_bailout_count(liftoff_bailout_count),
|
liftoff_bailout_count(liftoff_bailout_count),
|
||||||
wall_clock_duration_in_us(wall_clock_duration_in_us) {}
|
wall_clock_duration_in_us(wall_clock_duration_in_us) {}
|
||||||
|
|
||||||
V8_DEPRECATED("Use the version without cpu_duration_in_us")
|
|
||||||
WasmModuleCompiled(bool async, bool streamed, bool cached, bool deserialized,
|
|
||||||
bool lazy, bool success, size_t code_size_in_bytes,
|
|
||||||
size_t liftoff_bailout_count,
|
|
||||||
int64_t wall_clock_duration_in_us,
|
|
||||||
int64_t cpu_duration_in_us)
|
|
||||||
: async(async),
|
|
||||||
streamed(streamed),
|
|
||||||
cached(cached),
|
|
||||||
deserialized(deserialized),
|
|
||||||
lazy(lazy),
|
|
||||||
success(success),
|
|
||||||
code_size_in_bytes(code_size_in_bytes),
|
|
||||||
liftoff_bailout_count(liftoff_bailout_count),
|
|
||||||
wall_clock_duration_in_us(wall_clock_duration_in_us),
|
|
||||||
cpu_duration_in_us(cpu_duration_in_us) {}
|
|
||||||
|
|
||||||
START_ALLOW_USE_DEPRECATED()
|
|
||||||
// Copy constructor and copy assignment operator are allowed to copy the
|
|
||||||
// {cpu_duration_in_us} field.
|
|
||||||
WasmModuleCompiled(const WasmModuleCompiled&) = default;
|
|
||||||
WasmModuleCompiled& operator=(const WasmModuleCompiled&) = default;
|
|
||||||
END_ALLOW_USE_DEPRECATED()
|
|
||||||
|
|
||||||
bool async = false;
|
bool async = false;
|
||||||
bool streamed = false;
|
bool streamed = false;
|
||||||
bool cached = false;
|
bool cached = false;
|
||||||
@ -188,8 +142,6 @@ struct WasmModuleCompiled {
|
|||||||
size_t code_size_in_bytes = 0;
|
size_t code_size_in_bytes = 0;
|
||||||
size_t liftoff_bailout_count = 0;
|
size_t liftoff_bailout_count = 0;
|
||||||
int64_t wall_clock_duration_in_us = -1;
|
int64_t wall_clock_duration_in_us = -1;
|
||||||
V8_DEPRECATED("We do not collect cpu times any more")
|
|
||||||
int64_t cpu_duration_in_us = -1;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct WasmModuleInstantiated {
|
struct WasmModuleInstantiated {
|
||||||
|
@ -596,6 +596,7 @@ class V8_EXPORT HeapGraphNode {
|
|||||||
kBigInt = 13, // BigInt.
|
kBigInt = 13, // BigInt.
|
||||||
kObjectShape = 14, // Internal data used for tracking the shapes (or
|
kObjectShape = 14, // Internal data used for tracking the shapes (or
|
||||||
// "hidden classes") of JS objects.
|
// "hidden classes") of JS objects.
|
||||||
|
kWasmObject = 15, // A WasmGC struct or array.
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Returns node type (see HeapGraphNode::Type). */
|
/** Returns node type (see HeapGraphNode::Type). */
|
||||||
|
@ -347,6 +347,12 @@ class V8_EXPORT Script {
|
|||||||
* ScriptOrigin. This can be either a v8::String or v8::Undefined.
|
* ScriptOrigin. This can be either a v8::String or v8::Undefined.
|
||||||
*/
|
*/
|
||||||
Local<Value> GetResourceName();
|
Local<Value> GetResourceName();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If the script was compiled, returns the positions of lazy functions which
|
||||||
|
* were eventually compiled and executed.
|
||||||
|
*/
|
||||||
|
std::vector<int> GetProducedCompileHints() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class ScriptType { kClassic, kModule };
|
enum class ScriptType { kClassic, kModule };
|
||||||
@ -569,7 +575,8 @@ class V8_EXPORT ScriptCompiler {
|
|||||||
enum CompileOptions {
|
enum CompileOptions {
|
||||||
kNoCompileOptions = 0,
|
kNoCompileOptions = 0,
|
||||||
kConsumeCodeCache,
|
kConsumeCodeCache,
|
||||||
kEagerCompile
|
kEagerCompile,
|
||||||
|
kProduceCompileHints
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -117,11 +117,11 @@ class TracedReferenceBase {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* A traced handle with copy and move semantics. The handle is to be used
|
* A traced handle with copy and move semantics. The handle is to be used
|
||||||
* together with |v8::EmbedderHeapTracer| or as part of GarbageCollected objects
|
* together as part of GarbageCollected objects (see v8-cppgc.h) or from stack
|
||||||
* (see v8-cppgc.h) and specifies edges from C++ objects to JavaScript.
|
* and specifies edges from C++ objects to JavaScript.
|
||||||
*
|
*
|
||||||
* The exact semantics are:
|
* The exact semantics are:
|
||||||
* - Tracing garbage collections use |v8::EmbedderHeapTracer| or cppgc.
|
* - Tracing garbage collections using CppHeap.
|
||||||
* - Non-tracing garbage collections refer to
|
* - Non-tracing garbage collections refer to
|
||||||
* |v8::EmbedderRootsHandler::IsRoot()| whether the handle should
|
* |v8::EmbedderRootsHandler::IsRoot()| whether the handle should
|
||||||
* be treated as root or not.
|
* be treated as root or not.
|
||||||
@ -166,7 +166,6 @@ class BasicTracedReference : public TracedReferenceBase {
|
|||||||
Isolate* isolate, T* that, void* slot,
|
Isolate* isolate, T* that, void* slot,
|
||||||
internal::GlobalHandleStoreMode store_mode);
|
internal::GlobalHandleStoreMode store_mode);
|
||||||
|
|
||||||
friend class EmbedderHeapTracer;
|
|
||||||
template <typename F>
|
template <typename F>
|
||||||
friend class Local;
|
friend class Local;
|
||||||
friend class Object;
|
friend class Object;
|
||||||
@ -181,13 +180,7 @@ class BasicTracedReference : public TracedReferenceBase {
|
|||||||
/**
|
/**
|
||||||
* A traced handle without destructor that clears the handle. The embedder needs
|
* A traced handle without destructor that clears the handle. The embedder needs
|
||||||
* to ensure that the handle is not accessed once the V8 object has been
|
* to ensure that the handle is not accessed once the V8 object has been
|
||||||
* reclaimed. This can happen when the handle is not passed through the
|
* reclaimed. For more details see BasicTracedReference.
|
||||||
* EmbedderHeapTracer. For more details see BasicTracedReference.
|
|
||||||
*
|
|
||||||
* The reference assumes the embedder has precise knowledge about references at
|
|
||||||
* all times. In case V8 needs to separately handle on-stack references, the
|
|
||||||
* embedder is required to set the stack start through
|
|
||||||
* |EmbedderHeapTracer::SetStackStart|.
|
|
||||||
*/
|
*/
|
||||||
template <typename T>
|
template <typename T>
|
||||||
class TracedReference : public BasicTracedReference<T> {
|
class TracedReference : public BasicTracedReference<T> {
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
// NOTE these macros are used by some of the tool scripts and the build
|
// NOTE these macros are used by some of the tool scripts and the build
|
||||||
// system so their names cannot be changed without changing the scripts.
|
// system so their names cannot be changed without changing the scripts.
|
||||||
#define V8_MAJOR_VERSION 11
|
#define V8_MAJOR_VERSION 11
|
||||||
#define V8_MINOR_VERSION 1
|
#define V8_MINOR_VERSION 2
|
||||||
#define V8_BUILD_NUMBER 0
|
#define V8_BUILD_NUMBER 0
|
||||||
#define V8_PATCH_LEVEL 0
|
#define V8_PATCH_LEVEL 0
|
||||||
|
|
||||||
|
@ -346,6 +346,14 @@ path. Add it with -I<path> to the command line
|
|||||||
# define V8_HAS_ATTRIBUTE_NONNULL (__has_attribute(nonnull))
|
# define V8_HAS_ATTRIBUTE_NONNULL (__has_attribute(nonnull))
|
||||||
# define V8_HAS_ATTRIBUTE_NOINLINE (__has_attribute(noinline))
|
# define V8_HAS_ATTRIBUTE_NOINLINE (__has_attribute(noinline))
|
||||||
# define V8_HAS_ATTRIBUTE_UNUSED (__has_attribute(unused))
|
# define V8_HAS_ATTRIBUTE_UNUSED (__has_attribute(unused))
|
||||||
|
// Support for the "preserve_most" attribute is incomplete on 32-bit, and we see
|
||||||
|
// failures in component builds. Thus only use it in 64-bit non-component builds
|
||||||
|
// for now.
|
||||||
|
#if (defined(_M_X64) || defined(__x86_64__) || defined(__AARCH64EL__) || \
|
||||||
|
defined(_M_ARM64)) /* x64 or arm64 */ \
|
||||||
|
&& !defined(COMPONENT_BUILD)
|
||||||
|
# define V8_HAS_ATTRIBUTE_PRESERVE_MOST (__has_attribute(preserve_most))
|
||||||
|
#endif
|
||||||
# define V8_HAS_ATTRIBUTE_VISIBILITY (__has_attribute(visibility))
|
# define V8_HAS_ATTRIBUTE_VISIBILITY (__has_attribute(visibility))
|
||||||
# define V8_HAS_ATTRIBUTE_WARN_UNUSED_RESULT \
|
# define V8_HAS_ATTRIBUTE_WARN_UNUSED_RESULT \
|
||||||
(__has_attribute(warn_unused_result))
|
(__has_attribute(warn_unused_result))
|
||||||
@ -504,6 +512,21 @@ path. Add it with -I<path> to the command line
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
// A macro used to change the calling conventions to preserve all registers (no
|
||||||
|
// caller-saved registers). Use this for cold functions called from hot
|
||||||
|
// functions.
|
||||||
|
// Note: The attribute is considered experimental, so apply with care. Also,
|
||||||
|
// "preserve_most" is currently not handling the return value correctly, so only
|
||||||
|
// use it for functions returning void (see https://reviews.llvm.org/D141020).
|
||||||
|
// Use like:
|
||||||
|
// V8_NOINLINE V8_PRESERVE_MOST void UnlikelyMethod();
|
||||||
|
#if V8_HAS_ATTRIBUTE_PRESERVE_MOST
|
||||||
|
# define V8_PRESERVE_MOST __attribute__((preserve_most))
|
||||||
|
#else
|
||||||
|
# define V8_PRESERVE_MOST /* NOT SUPPORTED */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// A macro (V8_DEPRECATED) to mark classes or functions as deprecated.
|
// A macro (V8_DEPRECATED) to mark classes or functions as deprecated.
|
||||||
#if defined(V8_DEPRECATION_WARNINGS)
|
#if defined(V8_DEPRECATION_WARNINGS)
|
||||||
# define V8_DEPRECATED(message) [[deprecated(message)]]
|
# define V8_DEPRECATED(message) [[deprecated(message)]]
|
||||||
|
@ -31,6 +31,10 @@
|
|||||||
"label": "//test:v8_d8_default",
|
"label": "//test:v8_d8_default",
|
||||||
"type": "script",
|
"type": "script",
|
||||||
},
|
},
|
||||||
|
"d8_pgo": {
|
||||||
|
"label": "//test:d8_pgo",
|
||||||
|
"type": "script",
|
||||||
|
},
|
||||||
"generate-bytecode-expectations": {
|
"generate-bytecode-expectations": {
|
||||||
"label": "//test/unittests:generate-bytecode-expectations",
|
"label": "//test/unittests:generate-bytecode-expectations",
|
||||||
"type": "script",
|
"type": "script",
|
||||||
|
@ -52,6 +52,10 @@
|
|||||||
'linux-v8-dr': 'release_x64',
|
'linux-v8-dr': 'release_x64',
|
||||||
},
|
},
|
||||||
'client.v8': {
|
'client.v8': {
|
||||||
|
# PGO
|
||||||
|
'V8 Linux PGO instrumentation - builder' : 'builtins_profiling_x86',
|
||||||
|
'V8 Linux64 PGO instrumentation - builder' : 'builtins_profiling_x64',
|
||||||
|
|
||||||
# Linux.
|
# Linux.
|
||||||
'V8 Linux - builder': 'release_x86_gcmole',
|
'V8 Linux - builder': 'release_x86_gcmole',
|
||||||
'V8 Linux - debug builder': 'debug_x86',
|
'V8 Linux - debug builder': 'debug_x86',
|
||||||
@ -59,7 +63,7 @@
|
|||||||
'V8 Linux - noi18n - debug builder': 'debug_x86_no_i18n',
|
'V8 Linux - noi18n - debug builder': 'debug_x86_no_i18n',
|
||||||
'V8 Linux - verify csa - builder': 'release_x86_verify_csa',
|
'V8 Linux - verify csa - builder': 'release_x86_verify_csa',
|
||||||
# Linux64.
|
# Linux64.
|
||||||
'V8 Linux64 - builder': 'release_x64',
|
'V8 Linux64 - builder': 'release_x64_gcmole',
|
||||||
'V8 Linux64 - builder (goma cache silo)': 'release_x64',
|
'V8 Linux64 - builder (goma cache silo)': 'release_x64',
|
||||||
'V8 Linux64 - builder (reclient)': 'release_x64_reclient',
|
'V8 Linux64 - builder (reclient)': 'release_x64_reclient',
|
||||||
'V8 Linux64 - builder (reclient compare)': 'release_x64_reclient',
|
'V8 Linux64 - builder (reclient compare)': 'release_x64_reclient',
|
||||||
@ -102,6 +106,7 @@
|
|||||||
# Sanitizers.
|
# Sanitizers.
|
||||||
'V8 Linux64 ASAN - builder': 'release_x64_asan',
|
'V8 Linux64 ASAN - builder': 'release_x64_asan',
|
||||||
'V8 Linux64 TSAN - builder': 'release_x64_tsan',
|
'V8 Linux64 TSAN - builder': 'release_x64_tsan',
|
||||||
|
'V8 Linux64 TSAN - debug builder': 'debug_x64_tsan_minimal_symbols',
|
||||||
'V8 Linux64 TSAN - no-concurrent-marking - builder': 'release_x64_tsan_no_cm',
|
'V8 Linux64 TSAN - no-concurrent-marking - builder': 'release_x64_tsan_no_cm',
|
||||||
'V8 Linux - arm64 - sim - CFI - builder': 'release_simulate_arm64_cfi',
|
'V8 Linux - arm64 - sim - CFI - builder': 'release_simulate_arm64_cfi',
|
||||||
'V8 Linux - arm64 - sim - MSAN - builder': 'release_simulate_arm64_msan',
|
'V8 Linux - arm64 - sim - MSAN - builder': 'release_simulate_arm64_msan',
|
||||||
@ -182,7 +187,7 @@
|
|||||||
'V8 Arm - builder': 'release_arm',
|
'V8 Arm - builder': 'release_arm',
|
||||||
'V8 Arm - debug builder': 'debug_arm',
|
'V8 Arm - debug builder': 'debug_arm',
|
||||||
'V8 Android Arm - builder': 'release_android_arm',
|
'V8 Android Arm - builder': 'release_android_arm',
|
||||||
'V8 Linux - arm - sim - builder': 'release_simulate_arm',
|
'V8 Linux - arm - sim - builder': 'release_simulate_arm_gcmole',
|
||||||
'V8 Linux - arm - sim - debug builder': 'debug_simulate_arm',
|
'V8 Linux - arm - sim - debug builder': 'debug_simulate_arm',
|
||||||
'V8 Linux - arm - sim - lite - builder': 'release_simulate_arm_lite',
|
'V8 Linux - arm - sim - lite - builder': 'release_simulate_arm_lite',
|
||||||
'V8 Linux - arm - sim - lite - debug builder': 'debug_simulate_arm_lite',
|
'V8 Linux - arm - sim - lite - debug builder': 'debug_simulate_arm_lite',
|
||||||
@ -190,7 +195,7 @@
|
|||||||
'V8 Android Arm64 - builder': 'release_android_arm64',
|
'V8 Android Arm64 - builder': 'release_android_arm64',
|
||||||
'V8 Android Arm64 - debug builder': 'debug_android_arm64',
|
'V8 Android Arm64 - debug builder': 'debug_android_arm64',
|
||||||
'V8 Arm64 - builder': 'release_arm64_hard_float',
|
'V8 Arm64 - builder': 'release_arm64_hard_float',
|
||||||
'V8 Linux - arm64 - sim - builder': 'release_simulate_arm64',
|
'V8 Linux - arm64 - sim - builder': 'release_simulate_arm64_gcmole',
|
||||||
'V8 Linux - arm64 - sim - debug builder': 'debug_simulate_arm64',
|
'V8 Linux - arm64 - sim - debug builder': 'debug_simulate_arm64',
|
||||||
'V8 Linux - arm64 - sim - gc stress - builder': 'debug_simulate_arm64',
|
'V8 Linux - arm64 - sim - gc stress - builder': 'debug_simulate_arm64',
|
||||||
# Mips.
|
# Mips.
|
||||||
@ -242,7 +247,7 @@
|
|||||||
'v8_linux64_nodcheck_compile_rel': 'release_x64',
|
'v8_linux64_nodcheck_compile_rel': 'release_x64',
|
||||||
'v8_linux64_perfetto_compile_dbg': 'debug_x64_perfetto',
|
'v8_linux64_perfetto_compile_dbg': 'debug_x64_perfetto',
|
||||||
'v8_linux64_no_pointer_compression_compile_rel': 'release_x64_no_pointer_compression',
|
'v8_linux64_no_pointer_compression_compile_rel': 'release_x64_no_pointer_compression',
|
||||||
'v8_linux64_compile_rel': 'release_x64_test_features_trybot',
|
'v8_linux64_compile_rel': 'release_x64_test_features_gcmole_trybot',
|
||||||
'v8_linux64_no_sandbox_compile_rel': 'release_x64_no_sandbox',
|
'v8_linux64_no_sandbox_compile_rel': 'release_x64_no_sandbox',
|
||||||
'v8_linux64_predictable_compile_rel': 'release_x64_predictable',
|
'v8_linux64_predictable_compile_rel': 'release_x64_predictable',
|
||||||
'v8_linux64_shared_compile_rel': 'release_x64_shared_verify_heap',
|
'v8_linux64_shared_compile_rel': 'release_x64_shared_verify_heap',
|
||||||
@ -257,6 +262,7 @@
|
|||||||
'v8_linux_riscv32_compile_rel': 'release_simulate_riscv32',
|
'v8_linux_riscv32_compile_rel': 'release_simulate_riscv32',
|
||||||
'v8_linux64_riscv64_compile_rel': 'release_simulate_riscv64',
|
'v8_linux64_riscv64_compile_rel': 'release_simulate_riscv64',
|
||||||
'v8_linux64_tsan_compile_rel': 'release_x64_tsan_minimal_symbols',
|
'v8_linux64_tsan_compile_rel': 'release_x64_tsan_minimal_symbols',
|
||||||
|
'v8_linux64_tsan_compile_dbg': 'debug_x64_tsan_minimal_symbols',
|
||||||
'v8_linux64_tsan_no_cm_compile_rel': 'release_x64_tsan_no_cm',
|
'v8_linux64_tsan_no_cm_compile_rel': 'release_x64_tsan_no_cm',
|
||||||
'v8_linux64_tsan_isolates_compile_rel':
|
'v8_linux64_tsan_isolates_compile_rel':
|
||||||
'release_x64_tsan_minimal_symbols',
|
'release_x64_tsan_minimal_symbols',
|
||||||
@ -284,13 +290,13 @@
|
|||||||
'v8_mac64_compile_dbg': 'debug_x64',
|
'v8_mac64_compile_dbg': 'debug_x64',
|
||||||
'v8_mac64_noopt_compile_dbg': 'full_debug_x64',
|
'v8_mac64_noopt_compile_dbg': 'full_debug_x64',
|
||||||
'v8_mac64_asan_compile_rel': 'release_x64_asan_no_lsan',
|
'v8_mac64_asan_compile_rel': 'release_x64_asan_no_lsan',
|
||||||
'v8_linux_arm_compile_rel': 'release_simulate_arm_trybot',
|
'v8_linux_arm_compile_rel': 'release_simulate_arm_gcmole_trybot',
|
||||||
'v8_linux_arm_lite_compile_dbg': 'debug_simulate_arm_lite',
|
'v8_linux_arm_lite_compile_dbg': 'debug_simulate_arm_lite',
|
||||||
'v8_linux_arm_lite_compile_rel': 'release_simulate_arm_lite_trybot',
|
'v8_linux_arm_lite_compile_rel': 'release_simulate_arm_lite_trybot',
|
||||||
'v8_linux_arm_compile_dbg': 'debug_simulate_arm',
|
'v8_linux_arm_compile_dbg': 'debug_simulate_arm',
|
||||||
'v8_linux_arm_armv8a_rel': 'release_simulate_arm_trybot',
|
'v8_linux_arm_armv8a_rel': 'release_simulate_arm_trybot',
|
||||||
'v8_linux_arm_armv8a_dbg': 'debug_simulate_arm',
|
'v8_linux_arm_armv8a_dbg': 'debug_simulate_arm',
|
||||||
'v8_linux_arm64_compile_rel': 'release_simulate_arm64_trybot',
|
'v8_linux_arm64_compile_rel': 'release_simulate_arm64_gcmole_trybot',
|
||||||
'v8_linux_arm64_cfi_compile_rel' : 'release_simulate_arm64_cfi',
|
'v8_linux_arm64_cfi_compile_rel' : 'release_simulate_arm64_cfi',
|
||||||
'v8_linux_arm64_compile_dbg': 'debug_simulate_arm64',
|
'v8_linux_arm64_compile_dbg': 'debug_simulate_arm64',
|
||||||
'v8_linux_arm64_gc_stress_compile_dbg': 'debug_simulate_arm64',
|
'v8_linux_arm64_gc_stress_compile_dbg': 'debug_simulate_arm64',
|
||||||
@ -397,18 +403,24 @@
|
|||||||
'debug_bot', 'simulate_arm64', 'asan', 'lsan'],
|
'debug_bot', 'simulate_arm64', 'asan', 'lsan'],
|
||||||
|
|
||||||
# Release configs for simulators.
|
# Release configs for simulators.
|
||||||
'release_simulate_arm': [
|
'release_simulate_arm_gcmole': [
|
||||||
'release_bot', 'simulate_arm'],
|
'release_bot', 'simulate_arm', 'gcmole'],
|
||||||
'release_simulate_arm_lite': [
|
'release_simulate_arm_lite': [
|
||||||
'release_bot', 'simulate_arm', 'v8_enable_lite_mode'],
|
'release_bot', 'simulate_arm', 'v8_enable_lite_mode'],
|
||||||
'release_simulate_arm_trybot': [
|
'release_simulate_arm_gcmole_trybot': [
|
||||||
'release_trybot', 'simulate_arm'],
|
'release_trybot', 'simulate_arm', 'gcmole'],
|
||||||
'release_simulate_arm_lite_trybot': [
|
'release_simulate_arm_lite_trybot': [
|
||||||
'release_trybot', 'simulate_arm', 'v8_enable_lite_mode'],
|
'release_trybot', 'simulate_arm', 'v8_enable_lite_mode'],
|
||||||
|
'release_simulate_arm_trybot': [
|
||||||
|
'release_trybot', 'simulate_arm'],
|
||||||
'release_simulate_arm64': [
|
'release_simulate_arm64': [
|
||||||
'release_bot', 'simulate_arm64'],
|
'release_bot', 'simulate_arm64'],
|
||||||
'release_simulate_arm64_cfi': [
|
'release_simulate_arm64_cfi': [
|
||||||
'release_bot', 'simulate_arm64', 'v8_control_flow_integrity'],
|
'release_bot', 'simulate_arm64', 'v8_control_flow_integrity'],
|
||||||
|
'release_simulate_arm64_gcmole': [
|
||||||
|
'release_bot', 'simulate_arm64', 'gcmole'],
|
||||||
|
'release_simulate_arm64_gcmole_trybot': [
|
||||||
|
'release_trybot', 'simulate_arm64', 'gcmole'],
|
||||||
'release_simulate_arm64_no_pointer_compression': [
|
'release_simulate_arm64_no_pointer_compression': [
|
||||||
'release_bot', 'simulate_arm64', 'no_sandbox', 'dcheck_always_on',
|
'release_bot', 'simulate_arm64', 'no_sandbox', 'dcheck_always_on',
|
||||||
'v8_enable_slow_dchecks', 'v8_disable_pointer_compression'],
|
'v8_enable_slow_dchecks', 'v8_disable_pointer_compression'],
|
||||||
@ -505,6 +517,8 @@
|
|||||||
'release_x64_fuzzilli': [
|
'release_x64_fuzzilli': [
|
||||||
'release_bot', 'x64', 'dcheck_always_on', 'v8_enable_slow_dchecks',
|
'release_bot', 'x64', 'dcheck_always_on', 'v8_enable_slow_dchecks',
|
||||||
'v8_verify_heap', 'v8_verify_csa', 'fuzzilli'],
|
'v8_verify_heap', 'v8_verify_csa', 'fuzzilli'],
|
||||||
|
'release_x64_gcmole': [
|
||||||
|
'release_bot', 'x64', 'gcmole'],
|
||||||
'release_x64_msvc': [
|
'release_x64_msvc': [
|
||||||
'release_bot_no_goma', 'x64', 'minimal_symbols', 'msvc'],
|
'release_bot_no_goma', 'x64', 'minimal_symbols', 'msvc'],
|
||||||
'release_x64_correctness_fuzzer' : [
|
'release_x64_correctness_fuzzer' : [
|
||||||
@ -537,6 +551,8 @@
|
|||||||
'release_bot', 'x64', 'no_sandbox'],
|
'release_bot', 'x64', 'no_sandbox'],
|
||||||
'release_x64_trybot': [
|
'release_x64_trybot': [
|
||||||
'release_trybot', 'x64'],
|
'release_trybot', 'x64'],
|
||||||
|
'release_x64_test_features_gcmole_trybot': [
|
||||||
|
'release_trybot', 'x64', 'v8_enable_test_features', 'gcmole'],
|
||||||
'release_x64_test_features_trybot': [
|
'release_x64_test_features_trybot': [
|
||||||
'release_trybot', 'x64', 'v8_enable_test_features'],
|
'release_trybot', 'x64', 'v8_enable_test_features'],
|
||||||
'release_x64_tsan': [
|
'release_x64_tsan': [
|
||||||
@ -599,6 +615,9 @@
|
|||||||
'debug_trybot', 'x64', 'v8_enable_dict_property_const_tracking'],
|
'debug_trybot', 'x64', 'v8_enable_dict_property_const_tracking'],
|
||||||
'debug_x64_trybot_custom': [
|
'debug_x64_trybot_custom': [
|
||||||
'debug_trybot', 'x64', 'v8_snapshot_custom'],
|
'debug_trybot', 'x64', 'v8_snapshot_custom'],
|
||||||
|
'debug_x64_tsan_minimal_symbols': [
|
||||||
|
'debug_bot_no_slow_dchecks', 'minimal_symbols', 'x64', 'dcheck_always_on',
|
||||||
|
'tsan', 'v8_disable_verify_heap', 'v8_fast_mksnapshot'],
|
||||||
'full_debug_x64': [
|
'full_debug_x64': [
|
||||||
'debug_bot', 'x64', 'v8_full_debug'],
|
'debug_bot', 'x64', 'v8_full_debug'],
|
||||||
|
|
||||||
@ -650,7 +669,11 @@
|
|||||||
|
|
||||||
# Torque compare test
|
# Torque compare test
|
||||||
'torque_compare': [
|
'torque_compare': [
|
||||||
'release_bot', 'verify_torque']
|
'release_bot', 'verify_torque'],
|
||||||
|
|
||||||
|
# PGO
|
||||||
|
'builtins_profiling_x86': ['builtins_profiling', 'x86'],
|
||||||
|
'builtins_profiling_x64': ['builtins_profiling', 'x64'],
|
||||||
},
|
},
|
||||||
|
|
||||||
'mixins': {
|
'mixins': {
|
||||||
@ -675,6 +698,11 @@
|
|||||||
'gn_args': 'is_asan=true',
|
'gn_args': 'is_asan=true',
|
||||||
},
|
},
|
||||||
|
|
||||||
|
'builtins_profiling': {
|
||||||
|
'mixins' : ['release_bot_reclient'],
|
||||||
|
'gn_args': 'v8_enable_builtins_profiling=true',
|
||||||
|
},
|
||||||
|
|
||||||
'cfi': {
|
'cfi': {
|
||||||
'mixins': ['v8_enable_test_features'],
|
'mixins': ['v8_enable_test_features'],
|
||||||
'gn_args': ('is_cfi=true use_cfi_cast=true use_cfi_icall=true '
|
'gn_args': ('is_cfi=true use_cfi_cast=true use_cfi_icall=true '
|
||||||
@ -712,6 +740,12 @@
|
|||||||
'gn_args': 'is_debug=true v8_enable_backtrace=true',
|
'gn_args': 'is_debug=true v8_enable_backtrace=true',
|
||||||
},
|
},
|
||||||
|
|
||||||
|
'debug_bot_no_slow_dchecks': {
|
||||||
|
'mixins': [
|
||||||
|
'debug', 'shared', 'goma', 'v8_disable_slow_dchecks',
|
||||||
|
'v8_optimized_debug', 'v8_enable_google_benchmark'],
|
||||||
|
},
|
||||||
|
|
||||||
'debug_bot': {
|
'debug_bot': {
|
||||||
'mixins': [
|
'mixins': [
|
||||||
'debug', 'shared', 'goma', 'v8_enable_slow_dchecks',
|
'debug', 'shared', 'goma', 'v8_enable_slow_dchecks',
|
||||||
@ -934,6 +968,10 @@
|
|||||||
'gn_args': 'v8_enable_runtime_call_stats=false',
|
'gn_args': 'v8_enable_runtime_call_stats=false',
|
||||||
},
|
},
|
||||||
|
|
||||||
|
'v8_disable_verify_heap': {
|
||||||
|
'gn_args': 'v8_enable_verify_heap=false',
|
||||||
|
},
|
||||||
|
|
||||||
'v8_expose_memory_corruption_api': {
|
'v8_expose_memory_corruption_api': {
|
||||||
'gn_args': 'v8_expose_memory_corruption_api=true',
|
'gn_args': 'v8_expose_memory_corruption_api=true',
|
||||||
},
|
},
|
||||||
@ -946,6 +984,10 @@
|
|||||||
'gn_args': 'v8_enable_slow_dchecks=true',
|
'gn_args': 'v8_enable_slow_dchecks=true',
|
||||||
},
|
},
|
||||||
|
|
||||||
|
'v8_disable_slow_dchecks': {
|
||||||
|
'gn_args': 'v8_enable_slow_dchecks=false',
|
||||||
|
},
|
||||||
|
|
||||||
'v8_enable_javascript_promise_hooks': {
|
'v8_enable_javascript_promise_hooks': {
|
||||||
'gn_args': 'v8_enable_javascript_promise_hooks=true',
|
'gn_args': 'v8_enable_javascript_promise_hooks=true',
|
||||||
},
|
},
|
||||||
@ -981,6 +1023,10 @@
|
|||||||
'gn_args': 'v8_enable_vtunejit=true v8_enable_vtunetracemark=true',
|
'gn_args': 'v8_enable_vtunejit=true v8_enable_vtunetracemark=true',
|
||||||
},
|
},
|
||||||
|
|
||||||
|
'v8_fast_mksnapshot': {
|
||||||
|
'gn_args': 'v8_enable_fast_mksnapshot=true',
|
||||||
|
},
|
||||||
|
|
||||||
'v8_full_debug': {
|
'v8_full_debug': {
|
||||||
'gn_args': 'v8_optimized_debug=false',
|
'gn_args': 'v8_optimized_debug=false',
|
||||||
},
|
},
|
||||||
|
@ -180,27 +180,7 @@
|
|||||||
],
|
],
|
||||||
'shards': 4,
|
'shards': 4,
|
||||||
},
|
},
|
||||||
{'name': 'gcmole_v2', 'variant': 'ia32'},
|
|
||||||
{'name': 'gcmole_v2', 'variant': 'x64'},
|
|
||||||
{'name': 'gcmole_v2', 'variant': 'arm'},
|
|
||||||
{'name': 'gcmole_v2', 'variant': 'arm64'},
|
|
||||||
# TODO(https://crbug.com/v8/12660): Remove v2 above after testing.
|
|
||||||
{'name': 'gcmole_v3', 'variant': 'ia32', 'shards': 4},
|
{'name': 'gcmole_v3', 'variant': 'ia32', 'shards': 4},
|
||||||
{'name': 'gcmole_v3', 'variant': 'x64', 'shards': 4},
|
|
||||||
{'name': 'gcmole_v3', 'variant': 'arm', 'shards': 4},
|
|
||||||
{'name': 'gcmole_v3', 'variant': 'arm64', 'shards': 4},
|
|
||||||
{
|
|
||||||
'name': 'gcmole_v2',
|
|
||||||
'variant': 'x64',
|
|
||||||
'suffix': 'test single host',
|
|
||||||
'test_args': ['--test-run'],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
'name': 'gcmole_v3',
|
|
||||||
'variant': 'x64',
|
|
||||||
'suffix': 'test multi host',
|
|
||||||
'test_args': ['--test-run'],
|
|
||||||
},
|
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
'v8_linux_optional_rel': {
|
'v8_linux_optional_rel': {
|
||||||
@ -350,6 +330,7 @@
|
|||||||
{'name': 'test262', 'variant': 'default', 'shards': 2},
|
{'name': 'test262', 'variant': 'default', 'shards': 2},
|
||||||
{'name': 'v8testing', 'shards': 10},
|
{'name': 'v8testing', 'shards': 10},
|
||||||
{'name': 'v8testing', 'variant': 'extra', 'shards': 10},
|
{'name': 'v8testing', 'variant': 'extra', 'shards': 10},
|
||||||
|
{'name': 'gcmole_v3', 'variant': 'arm', 'shards': 4},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
##############################################################################
|
##############################################################################
|
||||||
@ -475,14 +456,10 @@
|
|||||||
{'name': 'webkit', 'variant': 'stress_sampling'},
|
{'name': 'webkit', 'variant': 'stress_sampling'},
|
||||||
# Stress snapshot.
|
# Stress snapshot.
|
||||||
{'name': 'mjsunit', 'variant': 'stress_snapshot'},
|
{'name': 'mjsunit', 'variant': 'stress_snapshot'},
|
||||||
# Maglev.
|
|
||||||
{'name': 'mjsunit', 'variant': 'maglev'},
|
|
||||||
# Stress maglev.
|
# Stress maglev.
|
||||||
{'name': 'mjsunit', 'variant': 'stress_maglev'},
|
{'name': 'mjsunit', 'variant': 'stress_maglev'},
|
||||||
# Experimental regexp engine.
|
# Experimental regexp engine.
|
||||||
{'name': 'mjsunit', 'variant': 'experimental_regexp'},
|
{'name': 'mjsunit', 'variant': 'experimental_regexp'},
|
||||||
# Wasm write protect code space.
|
|
||||||
{'name': 'mjsunit', 'variant': 'wasm_write_protect_code'},
|
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
'v8_linux64_gc_stress_custom_snapshot_dbg': {
|
'v8_linux64_gc_stress_custom_snapshot_dbg': {
|
||||||
@ -636,6 +613,20 @@
|
|||||||
{'name': 'v8testing', 'variant': 'stress_instruction_scheduling'},
|
{'name': 'v8testing', 'variant': 'stress_instruction_scheduling'},
|
||||||
# Maglev -- move to extra once more architectures are supported.
|
# Maglev -- move to extra once more architectures are supported.
|
||||||
{'name': 'mjsunit', 'variant': 'maglev'},
|
{'name': 'mjsunit', 'variant': 'maglev'},
|
||||||
|
# GCMole.
|
||||||
|
{'name': 'gcmole_v3', 'variant': 'x64', 'shards': 4},
|
||||||
|
{
|
||||||
|
'name': 'gcmole_v2',
|
||||||
|
'variant': 'x64',
|
||||||
|
'suffix': 'test single host',
|
||||||
|
'test_args': ['--test-run'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': 'gcmole_v3',
|
||||||
|
'variant': 'x64',
|
||||||
|
'suffix': 'test multi host',
|
||||||
|
'test_args': ['--test-run'],
|
||||||
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
'v8_linux64_predictable_rel': {
|
'v8_linux64_predictable_rel': {
|
||||||
@ -672,6 +663,18 @@
|
|||||||
{'name': 'v8testing', 'variant': 'stress_concurrent_allocation', 'shards': 2},
|
{'name': 'v8testing', 'variant': 'stress_concurrent_allocation', 'shards': 2},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
'v8_linux64_tsan_dbg': {
|
||||||
|
'swarming_dimensions' : {
|
||||||
|
'os': 'Ubuntu-18.04',
|
||||||
|
},
|
||||||
|
'tests': [
|
||||||
|
{'name': 'benchmarks', 'shards': 2},
|
||||||
|
{'name': 'mozilla', 'shards': 4},
|
||||||
|
{'name': 'test262', 'variant': 'default', 'shards': 5},
|
||||||
|
{'name': 'v8testing', 'shards': 12},
|
||||||
|
{'name': 'v8testing', 'variant': 'extra', 'shards': 10},
|
||||||
|
],
|
||||||
|
},
|
||||||
'v8_linux64_tsan_no_cm_rel': {
|
'v8_linux64_tsan_no_cm_rel': {
|
||||||
'swarming_dimensions' : {
|
'swarming_dimensions' : {
|
||||||
'os': 'Ubuntu-18.04',
|
'os': 'Ubuntu-18.04',
|
||||||
@ -746,6 +749,7 @@
|
|||||||
{'name': 'test262', 'variant': 'default', 'shards': 4},
|
{'name': 'test262', 'variant': 'default', 'shards': 4},
|
||||||
{'name': 'v8testing', 'shards': 14},
|
{'name': 'v8testing', 'shards': 14},
|
||||||
{'name': 'v8testing', 'variant': 'extra', 'shards': 14},
|
{'name': 'v8testing', 'variant': 'extra', 'shards': 14},
|
||||||
|
{'name': 'gcmole_v3', 'variant': 'arm64', 'shards': 4},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
'v8_linux_arm64_cfi_rel': {
|
'v8_linux_arm64_cfi_rel': {
|
||||||
@ -838,7 +842,7 @@
|
|||||||
# Win64
|
# Win64
|
||||||
'v8_win64_asan_rel': {
|
'v8_win64_asan_rel': {
|
||||||
'swarming_dimensions' : {
|
'swarming_dimensions' : {
|
||||||
'os': 'Windows-10-19042',
|
'os': 'Windows-10-19045',
|
||||||
},
|
},
|
||||||
'tests': [
|
'tests': [
|
||||||
{'name': 'v8testing', 'shards': 5},
|
{'name': 'v8testing', 'shards': 5},
|
||||||
@ -847,7 +851,7 @@
|
|||||||
'v8_win64_dbg': {
|
'v8_win64_dbg': {
|
||||||
'swarming_dimensions' : {
|
'swarming_dimensions' : {
|
||||||
'cpu': 'x86-64',
|
'cpu': 'x86-64',
|
||||||
'os': 'Windows-10-19042',
|
'os': 'Windows-10-19045',
|
||||||
},
|
},
|
||||||
'tests': [
|
'tests': [
|
||||||
{'name': 'mozilla'},
|
{'name': 'mozilla'},
|
||||||
@ -859,7 +863,7 @@
|
|||||||
'v8_win64_msvc_rel': {
|
'v8_win64_msvc_rel': {
|
||||||
'swarming_dimensions' : {
|
'swarming_dimensions' : {
|
||||||
'cpu': 'x86-64',
|
'cpu': 'x86-64',
|
||||||
'os': 'Windows-10-19042',
|
'os': 'Windows-10-19045',
|
||||||
},
|
},
|
||||||
'tests': [
|
'tests': [
|
||||||
{'name': 'mozilla'},
|
{'name': 'mozilla'},
|
||||||
@ -870,7 +874,7 @@
|
|||||||
'v8_win64_rel': {
|
'v8_win64_rel': {
|
||||||
'swarming_dimensions' : {
|
'swarming_dimensions' : {
|
||||||
'cpu': 'x86-64',
|
'cpu': 'x86-64',
|
||||||
'os': 'Windows-10-19042',
|
'os': 'Windows-10-19045',
|
||||||
},
|
},
|
||||||
'tests': [
|
'tests': [
|
||||||
{'name': 'mozilla'},
|
{'name': 'mozilla'},
|
||||||
@ -940,6 +944,8 @@
|
|||||||
},
|
},
|
||||||
'tests': [
|
'tests': [
|
||||||
{'name': 'v8testing'},
|
{'name': 'v8testing'},
|
||||||
|
# Maglev -- move to extra once more architectures are supported.
|
||||||
|
{'name': 'mjsunit', 'variant': 'maglev'},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
'v8_mac_arm64_dbg': {
|
'v8_mac_arm64_dbg': {
|
||||||
@ -950,6 +956,8 @@
|
|||||||
},
|
},
|
||||||
'tests': [
|
'tests': [
|
||||||
{'name': 'v8testing'},
|
{'name': 'v8testing'},
|
||||||
|
# Maglev -- move to extra once more architectures are supported.
|
||||||
|
{'name': 'mjsunit', 'variant': 'maglev'},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
'v8_mac_arm64_full_dbg': {
|
'v8_mac_arm64_full_dbg': {
|
||||||
@ -960,6 +968,8 @@
|
|||||||
},
|
},
|
||||||
'tests': [
|
'tests': [
|
||||||
{'name': 'v8testing'},
|
{'name': 'v8testing'},
|
||||||
|
# Maglev -- move to extra once more architectures are supported.
|
||||||
|
{'name': 'mjsunit', 'variant': 'maglev'},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
'v8_mac_arm64_no_pointer_compression_dbg': {
|
'v8_mac_arm64_no_pointer_compression_dbg': {
|
||||||
@ -1089,27 +1099,7 @@
|
|||||||
'test_args': ['--extra-flags', '--noenable-avx'],
|
'test_args': ['--extra-flags', '--noenable-avx'],
|
||||||
'shards': 2
|
'shards': 2
|
||||||
},
|
},
|
||||||
{'name': 'gcmole_v2', 'variant': 'ia32'},
|
|
||||||
{'name': 'gcmole_v2', 'variant': 'x64'},
|
|
||||||
{'name': 'gcmole_v2', 'variant': 'arm'},
|
|
||||||
{'name': 'gcmole_v2', 'variant': 'arm64'},
|
|
||||||
# TODO(https://crbug.com/v8/12660): Remove v2 above after testing.
|
|
||||||
{'name': 'gcmole_v3', 'variant': 'ia32', 'shards': 4},
|
{'name': 'gcmole_v3', 'variant': 'ia32', 'shards': 4},
|
||||||
{'name': 'gcmole_v3', 'variant': 'x64', 'shards': 4},
|
|
||||||
{'name': 'gcmole_v3', 'variant': 'arm', 'shards': 4},
|
|
||||||
{'name': 'gcmole_v3', 'variant': 'arm64', 'shards': 4},
|
|
||||||
{
|
|
||||||
'name': 'gcmole_v2',
|
|
||||||
'variant': 'x64',
|
|
||||||
'suffix': 'test single host',
|
|
||||||
'test_args': ['--test-run'],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
'name': 'gcmole_v3',
|
|
||||||
'variant': 'x64',
|
|
||||||
'suffix': 'test multi host',
|
|
||||||
'test_args': ['--test-run'],
|
|
||||||
},
|
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
'V8 Linux - arm64 - sim - CFI': {
|
'V8 Linux - arm64 - sim - CFI': {
|
||||||
@ -1299,6 +1289,14 @@
|
|||||||
{'name': 'v8testing'},
|
{'name': 'v8testing'},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
'V8 Linux PGO instrumentation - builder' : {
|
||||||
|
'swarming_dimensions': {
|
||||||
|
'os': 'Ubuntu-18.04',
|
||||||
|
},
|
||||||
|
'tests': [
|
||||||
|
{'name': 'pgo_instrumentation'}
|
||||||
|
],
|
||||||
|
},
|
||||||
'V8 Linux64': {
|
'V8 Linux64': {
|
||||||
'swarming_dimensions': {
|
'swarming_dimensions': {
|
||||||
'cpu': 'x86-64-avx2',
|
'cpu': 'x86-64-avx2',
|
||||||
@ -1345,6 +1343,20 @@
|
|||||||
'suffix': 'noavx',
|
'suffix': 'noavx',
|
||||||
'test_args': ['--extra-flags', '--noenable-avx']
|
'test_args': ['--extra-flags', '--noenable-avx']
|
||||||
},
|
},
|
||||||
|
# GCMole.
|
||||||
|
{'name': 'gcmole_v3', 'variant': 'x64', 'shards': 4},
|
||||||
|
{
|
||||||
|
'name': 'gcmole_v2',
|
||||||
|
'variant': 'x64',
|
||||||
|
'suffix': 'test single host',
|
||||||
|
'test_args': ['--test-run'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': 'gcmole_v3',
|
||||||
|
'variant': 'x64',
|
||||||
|
'suffix': 'test multi host',
|
||||||
|
'test_args': ['--test-run'],
|
||||||
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
'V8 Linux64 - cfi': {
|
'V8 Linux64 - cfi': {
|
||||||
@ -1457,14 +1469,10 @@
|
|||||||
{'name': 'webkit', 'variant': 'stress_sampling'},
|
{'name': 'webkit', 'variant': 'stress_sampling'},
|
||||||
# Stress snapshot.
|
# Stress snapshot.
|
||||||
{'name': 'mjsunit', 'variant': 'stress_snapshot'},
|
{'name': 'mjsunit', 'variant': 'stress_snapshot'},
|
||||||
# Maglev.
|
|
||||||
{'name': 'mjsunit', 'variant': 'maglev'},
|
|
||||||
# Stress maglev.
|
# Stress maglev.
|
||||||
{'name': 'mjsunit', 'variant': 'stress_maglev'},
|
{'name': 'mjsunit', 'variant': 'stress_maglev'},
|
||||||
# Experimental regexp engine.
|
# Experimental regexp engine.
|
||||||
{'name': 'mjsunit', 'variant': 'experimental_regexp'},
|
{'name': 'mjsunit', 'variant': 'experimental_regexp'},
|
||||||
# Wasm write protect code space.
|
|
||||||
{'name': 'mjsunit', 'variant': 'wasm_write_protect_code'},
|
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
'V8 Linux64 - cppgc-non-default - debug': {
|
'V8 Linux64 - cppgc-non-default - debug': {
|
||||||
@ -1523,14 +1531,10 @@
|
|||||||
{'name': 'webkit', 'variant': 'stress_sampling'},
|
{'name': 'webkit', 'variant': 'stress_sampling'},
|
||||||
# Stress snapshot.
|
# Stress snapshot.
|
||||||
{'name': 'mjsunit', 'variant': 'stress_snapshot'},
|
{'name': 'mjsunit', 'variant': 'stress_snapshot'},
|
||||||
# Maglev.
|
|
||||||
{'name': 'mjsunit', 'variant': 'maglev'},
|
|
||||||
# Stress maglev.
|
# Stress maglev.
|
||||||
{'name': 'mjsunit', 'variant': 'stress_maglev'},
|
{'name': 'mjsunit', 'variant': 'stress_maglev'},
|
||||||
# Experimental regexp engine.
|
# Experimental regexp engine.
|
||||||
{'name': 'mjsunit', 'variant': 'experimental_regexp'},
|
{'name': 'mjsunit', 'variant': 'experimental_regexp'},
|
||||||
# Wasm write protect code space.
|
|
||||||
{'name': 'mjsunit', 'variant': 'wasm_write_protect_code'},
|
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
'V8 Linux64 gcc': {
|
'V8 Linux64 gcc': {
|
||||||
@ -1657,6 +1661,14 @@
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
'V8 Linux64 PGO instrumentation - builder' : {
|
||||||
|
'swarming_dimensions' : {
|
||||||
|
'os': 'Ubuntu-18.04',
|
||||||
|
},
|
||||||
|
'tests': [
|
||||||
|
{'name': 'pgo_instrumentation'}
|
||||||
|
],
|
||||||
|
},
|
||||||
'V8 Linux64 TSAN': {
|
'V8 Linux64 TSAN': {
|
||||||
'swarming_dimensions' : {
|
'swarming_dimensions' : {
|
||||||
'os': 'Ubuntu-18.04',
|
'os': 'Ubuntu-18.04',
|
||||||
@ -1671,6 +1683,18 @@
|
|||||||
{'name': 'v8testing', 'variant': 'stress_concurrent_allocation', 'shards': 2},
|
{'name': 'v8testing', 'variant': 'stress_concurrent_allocation', 'shards': 2},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
'V8 Linux64 TSAN - debug': {
|
||||||
|
'swarming_dimensions' : {
|
||||||
|
'os': 'Ubuntu-18.04',
|
||||||
|
},
|
||||||
|
'tests': [
|
||||||
|
{'name': 'benchmarks', 'shards': 2},
|
||||||
|
{'name': 'mozilla', 'shards': 4},
|
||||||
|
{'name': 'test262', 'variant': 'default', 'shards': 5},
|
||||||
|
{'name': 'v8testing', 'shards': 12},
|
||||||
|
{'name': 'v8testing', 'variant': 'extra', 'shards': 10},
|
||||||
|
],
|
||||||
|
},
|
||||||
'V8 Linux64 TSAN - stress-incremental-marking': {
|
'V8 Linux64 TSAN - stress-incremental-marking': {
|
||||||
'swarming_dimensions' : {
|
'swarming_dimensions' : {
|
||||||
'os': 'Ubuntu-18.04',
|
'os': 'Ubuntu-18.04',
|
||||||
@ -1797,6 +1821,8 @@
|
|||||||
'tests': [
|
'tests': [
|
||||||
{'name': 'v8testing'},
|
{'name': 'v8testing'},
|
||||||
{'name': 'v8testing', 'variant': 'extra'},
|
{'name': 'v8testing', 'variant': 'extra'},
|
||||||
|
# Maglev -- move to extra once more architectures are supported.
|
||||||
|
{'name': 'mjsunit', 'variant': 'maglev'},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
'V8 Mac - arm64 - debug': {
|
'V8 Mac - arm64 - debug': {
|
||||||
@ -1813,6 +1839,8 @@
|
|||||||
'tests': [
|
'tests': [
|
||||||
{'name': 'v8testing', 'shards': 2},
|
{'name': 'v8testing', 'shards': 2},
|
||||||
{'name': 'v8testing', 'variant': 'extra', 'shards': 2},
|
{'name': 'v8testing', 'variant': 'extra', 'shards': 2},
|
||||||
|
# Maglev -- move to extra once more architectures are supported.
|
||||||
|
{'name': 'mjsunit', 'variant': 'maglev'},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
'V8 Mac - arm64 - no pointer compression debug': {
|
'V8 Mac - arm64 - no pointer compression debug': {
|
||||||
@ -1879,7 +1907,7 @@
|
|||||||
},
|
},
|
||||||
'V8 Win64': {
|
'V8 Win64': {
|
||||||
'swarming_dimensions': {
|
'swarming_dimensions': {
|
||||||
'os': 'Windows-10-19042',
|
'os': 'Windows-10-19045',
|
||||||
},
|
},
|
||||||
'tests': [
|
'tests': [
|
||||||
{'name': 'mozilla'},
|
{'name': 'mozilla'},
|
||||||
@ -1890,7 +1918,7 @@
|
|||||||
},
|
},
|
||||||
'V8 Win64 - debug': {
|
'V8 Win64 - debug': {
|
||||||
'swarming_dimensions': {
|
'swarming_dimensions': {
|
||||||
'os': 'Windows-10-19042',
|
'os': 'Windows-10-19045',
|
||||||
},
|
},
|
||||||
'tests': [
|
'tests': [
|
||||||
{'name': 'mozilla'},
|
{'name': 'mozilla'},
|
||||||
@ -1901,7 +1929,7 @@
|
|||||||
},
|
},
|
||||||
'V8 Win64 - msvc': {
|
'V8 Win64 - msvc': {
|
||||||
'swarming_dimensions': {
|
'swarming_dimensions': {
|
||||||
'os': 'Windows-10-19042',
|
'os': 'Windows-10-19045',
|
||||||
},
|
},
|
||||||
'tests': [
|
'tests': [
|
||||||
{'name': 'mozilla'},
|
{'name': 'mozilla'},
|
||||||
@ -1911,7 +1939,7 @@
|
|||||||
},
|
},
|
||||||
'V8 Win64 ASAN': {
|
'V8 Win64 ASAN': {
|
||||||
'swarming_dimensions': {
|
'swarming_dimensions': {
|
||||||
'os': 'Windows-10-19042',
|
'os': 'Windows-10-19045',
|
||||||
},
|
},
|
||||||
'tests': [
|
'tests': [
|
||||||
{'name': 'v8testing', 'shards': 5},
|
{'name': 'v8testing', 'shards': 5},
|
||||||
@ -2056,6 +2084,8 @@
|
|||||||
'test_args': ['--novfp3'],
|
'test_args': ['--novfp3'],
|
||||||
'shards': 6
|
'shards': 6
|
||||||
},
|
},
|
||||||
|
# GCMole.
|
||||||
|
{'name': 'gcmole_v3', 'variant': 'arm', 'shards': 4},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
'V8 Linux - arm - sim - debug': {
|
'V8 Linux - arm - sim - debug': {
|
||||||
@ -2137,6 +2167,7 @@
|
|||||||
{'name': 'test262', 'variant': 'default', 'shards': 2},
|
{'name': 'test262', 'variant': 'default', 'shards': 2},
|
||||||
{'name': 'v8testing', 'shards': 3},
|
{'name': 'v8testing', 'shards': 3},
|
||||||
{'name': 'v8testing', 'variant': 'extra', 'shards': 2},
|
{'name': 'v8testing', 'variant': 'extra', 'shards': 2},
|
||||||
|
{'name': 'gcmole_v3', 'variant': 'arm64', 'shards': 4},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
'V8 Linux - arm64 - sim - debug': {
|
'V8 Linux - arm64 - sim - debug': {
|
||||||
|
9
src/DEPS
9
src/DEPS
@ -10,19 +10,20 @@ include_rules = [
|
|||||||
"-src/bigint",
|
"-src/bigint",
|
||||||
"+src/bigint/bigint.h",
|
"+src/bigint/bigint.h",
|
||||||
"-src/compiler",
|
"-src/compiler",
|
||||||
"+src/compiler/pipeline.h",
|
|
||||||
"+src/compiler/code-assembler.h",
|
"+src/compiler/code-assembler.h",
|
||||||
|
"+src/compiler/turbofan.h",
|
||||||
"+src/compiler/wasm-compiler-definitions.h",
|
"+src/compiler/wasm-compiler-definitions.h",
|
||||||
"+src/compiler/wasm-compiler.h",
|
"+src/compiler/wasm-compiler.h",
|
||||||
"-src/heap",
|
"-src/heap",
|
||||||
"+src/heap/basic-memory-chunk.h",
|
"+src/heap/basic-memory-chunk.h",
|
||||||
"+src/heap/code-range.h",
|
"+src/heap/code-range.h",
|
||||||
"+src/heap/combined-heap.h",
|
"+src/heap/combined-heap.h",
|
||||||
"+src/heap/embedder-tracing.h",
|
|
||||||
"+src/heap/factory.h",
|
"+src/heap/factory.h",
|
||||||
"+src/heap/factory-inl.h",
|
"+src/heap/factory-inl.h",
|
||||||
# TODO(v8:10496): Don't expose so much (through transitive includes) outside
|
# TODO(v8:10496): Don't expose so much (through transitive includes) outside
|
||||||
# of heap/.
|
# of heap/.
|
||||||
|
"+src/heap/gc-tracer.h",
|
||||||
|
"+src/heap/gc-tracer-inl.h",
|
||||||
"+src/heap/heap.h",
|
"+src/heap/heap.h",
|
||||||
"+src/heap/heap-verifier.h",
|
"+src/heap/heap-verifier.h",
|
||||||
"+src/heap/heap-inl.h",
|
"+src/heap/heap-inl.h",
|
||||||
@ -76,6 +77,7 @@ include_rules = [
|
|||||||
"+starboard",
|
"+starboard",
|
||||||
# Using cppgc inside v8 is not (yet) allowed.
|
# Using cppgc inside v8 is not (yet) allowed.
|
||||||
"-include/cppgc",
|
"-include/cppgc",
|
||||||
|
"+include/cppgc/common.h",
|
||||||
"+include/cppgc/platform.h",
|
"+include/cppgc/platform.h",
|
||||||
"+include/cppgc/source-location.h",
|
"+include/cppgc/source-location.h",
|
||||||
]
|
]
|
||||||
@ -84,7 +86,8 @@ specific_include_rules = {
|
|||||||
"d8\.cc": [
|
"d8\.cc": [
|
||||||
"+include/libplatform/libplatform.h",
|
"+include/libplatform/libplatform.h",
|
||||||
"+include/libplatform/v8-tracing.h",
|
"+include/libplatform/v8-tracing.h",
|
||||||
"+perfetto/tracing.h"
|
"+perfetto/tracing/track_event.h",
|
||||||
|
"+perfetto/tracing/track_event_legacy.h"
|
||||||
],
|
],
|
||||||
"d8-platforms\.cc": [
|
"d8-platforms\.cc": [
|
||||||
"+include/libplatform/libplatform.h",
|
"+include/libplatform/libplatform.h",
|
||||||
|
@ -83,7 +83,7 @@ MaybeHandle<Object> DefineAccessorProperty(Isolate* isolate,
|
|||||||
InstantiateFunction(isolate,
|
InstantiateFunction(isolate,
|
||||||
Handle<FunctionTemplateInfo>::cast(getter)),
|
Handle<FunctionTemplateInfo>::cast(getter)),
|
||||||
Object);
|
Object);
|
||||||
Handle<CodeT> trampoline = BUILTIN_CODE(isolate, DebugBreakTrampoline);
|
Handle<Code> trampoline = BUILTIN_CODE(isolate, DebugBreakTrampoline);
|
||||||
Handle<JSFunction>::cast(getter)->set_code(*trampoline);
|
Handle<JSFunction>::cast(getter)->set_code(*trampoline);
|
||||||
}
|
}
|
||||||
if (setter->IsFunctionTemplateInfo() &&
|
if (setter->IsFunctionTemplateInfo() &&
|
||||||
@ -93,7 +93,7 @@ MaybeHandle<Object> DefineAccessorProperty(Isolate* isolate,
|
|||||||
InstantiateFunction(isolate,
|
InstantiateFunction(isolate,
|
||||||
Handle<FunctionTemplateInfo>::cast(setter)),
|
Handle<FunctionTemplateInfo>::cast(setter)),
|
||||||
Object);
|
Object);
|
||||||
Handle<CodeT> trampoline = BUILTIN_CODE(isolate, DebugBreakTrampoline);
|
Handle<Code> trampoline = BUILTIN_CODE(isolate, DebugBreakTrampoline);
|
||||||
Handle<JSFunction>::cast(setter)->set_code(*trampoline);
|
Handle<JSFunction>::cast(setter)->set_code(*trampoline);
|
||||||
}
|
}
|
||||||
RETURN_ON_EXCEPTION(
|
RETURN_ON_EXCEPTION(
|
||||||
|
176
src/api/api.cc
176
src/api/api.cc
@ -38,6 +38,7 @@
|
|||||||
#include "src/baseline/baseline-batch-compiler.h"
|
#include "src/baseline/baseline-batch-compiler.h"
|
||||||
#include "src/builtins/accessors.h"
|
#include "src/builtins/accessors.h"
|
||||||
#include "src/builtins/builtins-utils.h"
|
#include "src/builtins/builtins-utils.h"
|
||||||
|
#include "src/codegen/compilation-cache.h"
|
||||||
#include "src/codegen/compiler.h"
|
#include "src/codegen/compiler.h"
|
||||||
#include "src/codegen/cpu-features.h"
|
#include "src/codegen/cpu-features.h"
|
||||||
#include "src/codegen/script-details.h"
|
#include "src/codegen/script-details.h"
|
||||||
@ -64,7 +65,6 @@
|
|||||||
#include "src/handles/persistent-handles.h"
|
#include "src/handles/persistent-handles.h"
|
||||||
#include "src/handles/shared-object-conveyor-handles.h"
|
#include "src/handles/shared-object-conveyor-handles.h"
|
||||||
#include "src/handles/traced-handles.h"
|
#include "src/handles/traced-handles.h"
|
||||||
#include "src/heap/embedder-tracing.h"
|
|
||||||
#include "src/heap/heap-inl.h"
|
#include "src/heap/heap-inl.h"
|
||||||
#include "src/heap/heap-write-barrier.h"
|
#include "src/heap/heap-write-barrier.h"
|
||||||
#include "src/heap/safepoint.h"
|
#include "src/heap/safepoint.h"
|
||||||
@ -128,7 +128,6 @@
|
|||||||
#include "src/tracing/trace-event.h"
|
#include "src/tracing/trace-event.h"
|
||||||
#include "src/utils/detachable-vector.h"
|
#include "src/utils/detachable-vector.h"
|
||||||
#include "src/utils/version.h"
|
#include "src/utils/version.h"
|
||||||
#include "src/web-snapshot/web-snapshot.h"
|
|
||||||
|
|
||||||
#if V8_ENABLE_WEBASSEMBLY
|
#if V8_ENABLE_WEBASSEMBLY
|
||||||
#include "src/trap-handler/trap-handler.h"
|
#include "src/trap-handler/trap-handler.h"
|
||||||
@ -2245,42 +2244,6 @@ MaybeLocal<Value> Script::Run(Local<Context> context,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
auto fun = i::Handle<i::JSFunction>::cast(Utils::OpenHandle(this));
|
auto fun = i::Handle<i::JSFunction>::cast(Utils::OpenHandle(this));
|
||||||
|
|
||||||
// TODO(crbug.com/1193459): remove once ablation study is completed
|
|
||||||
base::ElapsedTimer timer;
|
|
||||||
base::TimeDelta delta;
|
|
||||||
if (i::v8_flags.script_delay > 0) {
|
|
||||||
delta = v8::base::TimeDelta::FromMillisecondsD(i::v8_flags.script_delay);
|
|
||||||
}
|
|
||||||
if (i::v8_flags.script_delay_once > 0 && !i_isolate->did_run_script_delay()) {
|
|
||||||
delta =
|
|
||||||
v8::base::TimeDelta::FromMillisecondsD(i::v8_flags.script_delay_once);
|
|
||||||
i_isolate->set_did_run_script_delay(true);
|
|
||||||
}
|
|
||||||
if (i::v8_flags.script_delay_fraction > 0.0) {
|
|
||||||
timer.Start();
|
|
||||||
} else if (delta.InMicroseconds() > 0) {
|
|
||||||
timer.Start();
|
|
||||||
while (timer.Elapsed() < delta) {
|
|
||||||
// Busy wait.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (V8_UNLIKELY(i::v8_flags.experimental_web_snapshots)) {
|
|
||||||
i::Handle<i::HeapObject> maybe_script =
|
|
||||||
handle(fun->shared().script(), i_isolate);
|
|
||||||
if (maybe_script->IsScript() &&
|
|
||||||
i::Script::cast(*maybe_script).type() == i::Script::TYPE_WEB_SNAPSHOT) {
|
|
||||||
i::WebSnapshotDeserializer deserializer(
|
|
||||||
reinterpret_cast<i::Isolate*>(v8_isolate),
|
|
||||||
i::Handle<i::Script>::cast(maybe_script));
|
|
||||||
deserializer.Deserialize();
|
|
||||||
RETURN_ON_FAILED_EXECUTION(Value);
|
|
||||||
Local<Value> result = v8::Undefined(v8_isolate);
|
|
||||||
RETURN_ESCAPED(result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
i::Handle<i::Object> receiver = i_isolate->global_proxy();
|
i::Handle<i::Object> receiver = i_isolate->global_proxy();
|
||||||
// TODO(cbruni, chromium:1244145): Remove once migrated to the context.
|
// TODO(cbruni, chromium:1244145): Remove once migrated to the context.
|
||||||
i::Handle<i::Object> options(
|
i::Handle<i::Object> options(
|
||||||
@ -2290,15 +2253,6 @@ MaybeLocal<Value> Script::Run(Local<Context> context,
|
|||||||
has_pending_exception = !ToLocal<Value>(
|
has_pending_exception = !ToLocal<Value>(
|
||||||
i::Execution::CallScript(i_isolate, fun, receiver, options), &result);
|
i::Execution::CallScript(i_isolate, fun, receiver, options), &result);
|
||||||
|
|
||||||
if (i::v8_flags.script_delay_fraction > 0.0) {
|
|
||||||
delta = v8::base::TimeDelta::FromMillisecondsD(
|
|
||||||
timer.Elapsed().InMillisecondsF() * i::v8_flags.script_delay_fraction);
|
|
||||||
timer.Restart();
|
|
||||||
while (timer.Elapsed() < delta) {
|
|
||||||
// Busy wait.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
RETURN_ON_FAILED_EXECUTION(Value);
|
RETURN_ON_FAILED_EXECUTION(Value);
|
||||||
RETURN_ESCAPED(result);
|
RETURN_ESCAPED(result);
|
||||||
}
|
}
|
||||||
@ -2337,6 +2291,31 @@ Local<Value> Script::GetResourceName() {
|
|||||||
i::handle(i::Script::cast(sfi.script()).name(), i_isolate));
|
i::handle(i::Script::cast(sfi.script()).name(), i_isolate));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<int> Script::GetProducedCompileHints() const {
|
||||||
|
i::DisallowGarbageCollection no_gc;
|
||||||
|
i::Handle<i::JSFunction> func = Utils::OpenHandle(this);
|
||||||
|
i::Isolate* i_isolate = func->GetIsolate();
|
||||||
|
i::SharedFunctionInfo sfi = (*func).shared();
|
||||||
|
CHECK(sfi.script().IsScript());
|
||||||
|
i::Script script = i::Script::cast(sfi.script());
|
||||||
|
i::Object maybe_array_list = script.compiled_lazy_function_positions();
|
||||||
|
std::vector<int> result;
|
||||||
|
if (!maybe_array_list.IsUndefined(i_isolate)) {
|
||||||
|
i::ArrayList array_list = i::ArrayList::cast(maybe_array_list);
|
||||||
|
result.reserve(array_list.Length());
|
||||||
|
for (int i = 0; i < array_list.Length(); ++i) {
|
||||||
|
i::Object item = array_list.Get(i);
|
||||||
|
CHECK(item.IsSmi());
|
||||||
|
result.push_back(i::Smi::ToInt(item));
|
||||||
|
}
|
||||||
|
// Clear the data; the embedder can still request more data later, but it'll
|
||||||
|
// have to keep track of the original data itself.
|
||||||
|
script.set_compiled_lazy_function_positions(
|
||||||
|
i::ReadOnlyRoots(i_isolate).undefined_value());
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
// static
|
// static
|
||||||
Local<PrimitiveArray> PrimitiveArray::New(Isolate* v8_isolate, int length) {
|
Local<PrimitiveArray> PrimitiveArray::New(Isolate* v8_isolate, int length) {
|
||||||
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(v8_isolate);
|
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(v8_isolate);
|
||||||
@ -2759,9 +2738,10 @@ MaybeLocal<Script> ScriptCompiler::Compile(Local<Context> context,
|
|||||||
MaybeLocal<Module> ScriptCompiler::CompileModule(
|
MaybeLocal<Module> ScriptCompiler::CompileModule(
|
||||||
Isolate* v8_isolate, Source* source, CompileOptions options,
|
Isolate* v8_isolate, Source* source, CompileOptions options,
|
||||||
NoCacheReason no_cache_reason) {
|
NoCacheReason no_cache_reason) {
|
||||||
Utils::ApiCheck(options == kNoCompileOptions || options == kConsumeCodeCache,
|
Utils::ApiCheck(
|
||||||
"v8::ScriptCompiler::CompileModule",
|
options == kNoCompileOptions || options == kConsumeCodeCache ||
|
||||||
"Invalid CompileOptions");
|
options == kProduceCompileHints,
|
||||||
|
"v8::ScriptCompiler::CompileModule", "Invalid CompileOptions");
|
||||||
Utils::ApiCheck(source->GetResourceOptions().IsModule(),
|
Utils::ApiCheck(source->GetResourceOptions().IsModule(),
|
||||||
"v8::ScriptCompiler::CompileModule",
|
"v8::ScriptCompiler::CompileModule",
|
||||||
"Invalid ScriptOrigin: is_module must be true");
|
"Invalid ScriptOrigin: is_module must be true");
|
||||||
@ -2896,7 +2876,8 @@ void ScriptCompiler::ScriptStreamingTask::Run() { data_->task->Run(); }
|
|||||||
ScriptCompiler::ScriptStreamingTask* ScriptCompiler::StartStreaming(
|
ScriptCompiler::ScriptStreamingTask* ScriptCompiler::StartStreaming(
|
||||||
Isolate* v8_isolate, StreamedSource* source, v8::ScriptType type,
|
Isolate* v8_isolate, StreamedSource* source, v8::ScriptType type,
|
||||||
CompileOptions options) {
|
CompileOptions options) {
|
||||||
Utils::ApiCheck(options == kNoCompileOptions || options == kEagerCompile,
|
Utils::ApiCheck(options == kNoCompileOptions || options == kEagerCompile ||
|
||||||
|
options == kProduceCompileHints,
|
||||||
"v8::ScriptCompiler::StartStreaming",
|
"v8::ScriptCompiler::StartStreaming",
|
||||||
"Invalid CompileOptions");
|
"Invalid CompileOptions");
|
||||||
if (!i::v8_flags.script_streaming) return nullptr;
|
if (!i::v8_flags.script_streaming) return nullptr;
|
||||||
@ -4953,8 +4934,8 @@ Maybe<bool> v8::Object::SetIntegrityLevel(Local<Context> context,
|
|||||||
auto self = Utils::OpenHandle(this);
|
auto self = Utils::OpenHandle(this);
|
||||||
i::JSReceiver::IntegrityLevel i_level =
|
i::JSReceiver::IntegrityLevel i_level =
|
||||||
level == IntegrityLevel::kFrozen ? i::FROZEN : i::SEALED;
|
level == IntegrityLevel::kFrozen ? i::FROZEN : i::SEALED;
|
||||||
Maybe<bool> result =
|
Maybe<bool> result = i::JSReceiver::SetIntegrityLevel(
|
||||||
i::JSReceiver::SetIntegrityLevel(self, i_level, i::kThrowOnError);
|
i_isolate, self, i_level, i::kThrowOnError);
|
||||||
has_pending_exception = result.IsNothing();
|
has_pending_exception = result.IsNothing();
|
||||||
RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool);
|
RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool);
|
||||||
return result;
|
return result;
|
||||||
@ -6736,7 +6717,7 @@ Local<Context> NewContext(
|
|||||||
// TODO(jkummerow): This is for crbug.com/713699. Remove it if it doesn't
|
// TODO(jkummerow): This is for crbug.com/713699. Remove it if it doesn't
|
||||||
// fail.
|
// fail.
|
||||||
// Sanity-check that the isolate is initialized and usable.
|
// Sanity-check that the isolate is initialized and usable.
|
||||||
CHECK(i_isolate->builtins()->code(i::Builtin::kIllegal).IsCodeT());
|
CHECK(i_isolate->builtins()->code(i::Builtin::kIllegal).IsCode());
|
||||||
|
|
||||||
TRACE_EVENT_CALL_STATS_SCOPED(i_isolate, "v8", "V8.NewContext");
|
TRACE_EVENT_CALL_STATS_SCOPED(i_isolate, "v8", "V8.NewContext");
|
||||||
API_RCS_SCOPE(i_isolate, Context, New);
|
API_RCS_SCOPE(i_isolate, Context, New);
|
||||||
@ -8967,21 +8948,6 @@ void Isolate::RemoveGCEpilogueCallback(GCCallback callback) {
|
|||||||
RemoveGCEpilogueCallback(CallGCCallbackWithoutData, data);
|
RemoveGCEpilogueCallback(CallGCCallbackWithoutData, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
START_ALLOW_USE_DEPRECATED()
|
|
||||||
|
|
||||||
void Isolate::SetEmbedderHeapTracer(EmbedderHeapTracer* tracer) {
|
|
||||||
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(this);
|
|
||||||
CHECK_NULL(i_isolate->heap()->cpp_heap());
|
|
||||||
i_isolate->heap()->SetEmbedderHeapTracer(tracer);
|
|
||||||
}
|
|
||||||
|
|
||||||
EmbedderHeapTracer* Isolate::GetEmbedderHeapTracer() {
|
|
||||||
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(this);
|
|
||||||
return i_isolate->heap()->GetEmbedderHeapTracer();
|
|
||||||
}
|
|
||||||
|
|
||||||
END_ALLOW_USE_DEPRECATED()
|
|
||||||
|
|
||||||
void Isolate::SetEmbedderRootsHandler(EmbedderRootsHandler* handler) {
|
void Isolate::SetEmbedderRootsHandler(EmbedderRootsHandler* handler) {
|
||||||
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(this);
|
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(this);
|
||||||
i_isolate->heap()->SetEmbedderRootsHandler(handler);
|
i_isolate->heap()->SetEmbedderRootsHandler(handler);
|
||||||
@ -8989,7 +8955,6 @@ void Isolate::SetEmbedderRootsHandler(EmbedderRootsHandler* handler) {
|
|||||||
|
|
||||||
void Isolate::AttachCppHeap(CppHeap* cpp_heap) {
|
void Isolate::AttachCppHeap(CppHeap* cpp_heap) {
|
||||||
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(this);
|
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(this);
|
||||||
CHECK_NULL(GetEmbedderHeapTracer());
|
|
||||||
i_isolate->heap()->AttachCppHeap(cpp_heap);
|
i_isolate->heap()->AttachCppHeap(cpp_heap);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -9747,6 +9712,7 @@ void Isolate::ClearCachesForTesting() {
|
|||||||
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(this);
|
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(this);
|
||||||
i_isolate->AbortConcurrentOptimization(i::BlockingBehavior::kBlock);
|
i_isolate->AbortConcurrentOptimization(i::BlockingBehavior::kBlock);
|
||||||
i_isolate->ClearSerializerData();
|
i_isolate->ClearSerializerData();
|
||||||
|
i_isolate->compilation_cache()->Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Isolate::EnableMemorySavingsMode() {
|
void Isolate::EnableMemorySavingsMode() {
|
||||||
@ -9818,7 +9784,7 @@ JSEntryStubs Isolate::GetJSEntryStubs() {
|
|||||||
{i::Builtin::kJSRunMicrotasksEntry,
|
{i::Builtin::kJSRunMicrotasksEntry,
|
||||||
&entry_stubs.js_run_microtasks_entry_stub}}};
|
&entry_stubs.js_run_microtasks_entry_stub}}};
|
||||||
for (auto& pair : stubs) {
|
for (auto& pair : stubs) {
|
||||||
i::CodeT js_entry = i_isolate->builtins()->code(pair.first);
|
i::Code js_entry = i_isolate->builtins()->code(pair.first);
|
||||||
pair.second->code.start =
|
pair.second->code.start =
|
||||||
reinterpret_cast<const void*>(js_entry.InstructionStart());
|
reinterpret_cast<const void*>(js_entry.InstructionStart());
|
||||||
pair.second->code.length_in_bytes = js_entry.InstructionSize();
|
pair.second->code.length_in_bytes = js_entry.InstructionSize();
|
||||||
@ -9877,6 +9843,9 @@ CALLBACK_SETTER(WasmAsyncResolvePromiseCallback,
|
|||||||
CALLBACK_SETTER(WasmLoadSourceMapCallback, WasmLoadSourceMapCallback,
|
CALLBACK_SETTER(WasmLoadSourceMapCallback, WasmLoadSourceMapCallback,
|
||||||
wasm_load_source_map_callback)
|
wasm_load_source_map_callback)
|
||||||
|
|
||||||
|
CALLBACK_SETTER(WasmGCEnabledCallback, WasmGCEnabledCallback,
|
||||||
|
wasm_gc_enabled_callback)
|
||||||
|
|
||||||
CALLBACK_SETTER(SharedArrayBufferConstructorEnabledCallback,
|
CALLBACK_SETTER(SharedArrayBufferConstructorEnabledCallback,
|
||||||
SharedArrayBufferConstructorEnabledCallback,
|
SharedArrayBufferConstructorEnabledCallback,
|
||||||
sharedarraybuffer_constructor_enabled_callback)
|
sharedarraybuffer_constructor_enabled_callback)
|
||||||
@ -10799,71 +10768,6 @@ void HeapProfiler::SetGetDetachednessCallback(GetDetachednessCallback callback,
|
|||||||
data);
|
data);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmbedderHeapTracer::SetStackStart(void* stack_start) {
|
|
||||||
CHECK(v8_isolate_);
|
|
||||||
reinterpret_cast<i::Isolate*>(v8_isolate_)
|
|
||||||
->heap()
|
|
||||||
->SetStackStart(stack_start);
|
|
||||||
}
|
|
||||||
|
|
||||||
void EmbedderHeapTracer::FinalizeTracing() {
|
|
||||||
if (v8_isolate_) {
|
|
||||||
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(v8_isolate_);
|
|
||||||
if (i_isolate->heap()->incremental_marking()->IsMarking()) {
|
|
||||||
i_isolate->heap()->FinalizeIncrementalMarkingAtomically(
|
|
||||||
i::GarbageCollectionReason::kExternalFinalize);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void EmbedderHeapTracer::IncreaseAllocatedSize(size_t bytes) {
|
|
||||||
if (v8_isolate_) {
|
|
||||||
i::LocalEmbedderHeapTracer* const tracer =
|
|
||||||
reinterpret_cast<i::Isolate*>(v8_isolate_)
|
|
||||||
->heap()
|
|
||||||
->local_embedder_heap_tracer();
|
|
||||||
DCHECK_NOT_NULL(tracer);
|
|
||||||
tracer->IncreaseAllocatedSize(bytes);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void EmbedderHeapTracer::DecreaseAllocatedSize(size_t bytes) {
|
|
||||||
if (v8_isolate_) {
|
|
||||||
i::LocalEmbedderHeapTracer* const tracer =
|
|
||||||
reinterpret_cast<i::Isolate*>(v8_isolate_)
|
|
||||||
->heap()
|
|
||||||
->local_embedder_heap_tracer();
|
|
||||||
DCHECK_NOT_NULL(tracer);
|
|
||||||
tracer->DecreaseAllocatedSize(bytes);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void EmbedderHeapTracer::RegisterEmbedderReference(
|
|
||||||
const BasicTracedReference<v8::Data>& ref) {
|
|
||||||
if (ref.IsEmpty()) return;
|
|
||||||
|
|
||||||
i::Heap* const heap = reinterpret_cast<i::Isolate*>(v8_isolate_)->heap();
|
|
||||||
heap->RegisterExternallyReferencedObject(
|
|
||||||
reinterpret_cast<i::Address*>(ref.val_));
|
|
||||||
}
|
|
||||||
|
|
||||||
void EmbedderHeapTracer::IterateTracedGlobalHandles(
|
|
||||||
TracedGlobalHandleVisitor* visitor) {
|
|
||||||
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(v8_isolate_);
|
|
||||||
i::DisallowGarbageCollection no_gc;
|
|
||||||
i_isolate->traced_handles()->Iterate(visitor);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool EmbedderHeapTracer::IsRootForNonTracingGC(
|
|
||||||
const v8::TracedReference<v8::Value>& handle) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void EmbedderHeapTracer::ResetHandleInNonTracingGC(
|
|
||||||
const v8::TracedReference<v8::Value>& handle) {
|
|
||||||
UNREACHABLE();
|
|
||||||
}
|
|
||||||
|
|
||||||
EmbedderStateScope::EmbedderStateScope(Isolate* v8_isolate,
|
EmbedderStateScope::EmbedderStateScope(Isolate* v8_isolate,
|
||||||
Local<v8::Context> context,
|
Local<v8::Context> context,
|
||||||
EmbedderStateTag tag)
|
EmbedderStateTag tag)
|
||||||
|
@ -2240,7 +2240,7 @@ AsmType* AsmJsParser::ValidateCall() {
|
|||||||
function_type->AsFunctionType()->AddArgument(t);
|
function_type->AsFunctionType()->AddArgument(t);
|
||||||
}
|
}
|
||||||
FunctionSig* sig = ConvertSignature(return_type, param_types);
|
FunctionSig* sig = ConvertSignature(return_type, param_types);
|
||||||
uint32_t signature_index = module_builder_->AddSignature(sig);
|
uint32_t signature_index = module_builder_->AddSignature(sig, true);
|
||||||
|
|
||||||
// Emit actual function invocation depending on the kind. At this point we
|
// Emit actual function invocation depending on the kind. At this point we
|
||||||
// also determined the complete function type and can perform checking against
|
// also determined the complete function type and can perform checking against
|
||||||
|
@ -1613,7 +1613,9 @@ enum AssignType {
|
|||||||
PRIVATE_METHOD, // obj.#key: #key is a private method
|
PRIVATE_METHOD, // obj.#key: #key is a private method
|
||||||
PRIVATE_GETTER_ONLY, // obj.#key: #key only has a getter defined
|
PRIVATE_GETTER_ONLY, // obj.#key: #key only has a getter defined
|
||||||
PRIVATE_SETTER_ONLY, // obj.#key: #key only has a setter defined
|
PRIVATE_SETTER_ONLY, // obj.#key: #key only has a setter defined
|
||||||
PRIVATE_GETTER_AND_SETTER // obj.#key: #key has both accessors defined
|
PRIVATE_GETTER_AND_SETTER, // obj.#key: #key has both accessors defined
|
||||||
|
PRIVATE_DEBUG_DYNAMIC, // obj.#key: #key is private that requries dynamic
|
||||||
|
// lookup in debug-evaluate.
|
||||||
};
|
};
|
||||||
|
|
||||||
class Property final : public Expression {
|
class Property final : public Expression {
|
||||||
@ -1650,6 +1652,9 @@ class Property final : public Expression {
|
|||||||
return PRIVATE_SETTER_ONLY;
|
return PRIVATE_SETTER_ONLY;
|
||||||
case VariableMode::kPrivateGetterAndSetter:
|
case VariableMode::kPrivateGetterAndSetter:
|
||||||
return PRIVATE_GETTER_AND_SETTER;
|
return PRIVATE_GETTER_AND_SETTER;
|
||||||
|
case VariableMode::kDynamic:
|
||||||
|
// From debug-evaluate.
|
||||||
|
return PRIVATE_DEBUG_DYNAMIC;
|
||||||
default:
|
default:
|
||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
}
|
}
|
||||||
|
@ -1367,6 +1367,10 @@ void AstPrinter::VisitProperty(Property* node) {
|
|||||||
PrintIndentedVisit("KEY", node->key());
|
PrintIndentedVisit("KEY", node->key());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case PRIVATE_DEBUG_DYNAMIC: {
|
||||||
|
PrintIndentedVisit("PRIVATE_DEBUG_DYNAMIC", node->key());
|
||||||
|
break;
|
||||||
|
}
|
||||||
case NON_PROPERTY:
|
case NON_PROPERTY:
|
||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
}
|
}
|
||||||
|
@ -2061,6 +2061,15 @@ Variable* Scope::NonLocal(const AstRawString* name, VariableMode mode) {
|
|||||||
return var;
|
return var;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Scope::ForceDynamicLookup(VariableProxy* proxy) {
|
||||||
|
// At the moment this is only used for looking up private names dynamically
|
||||||
|
// in debug-evaluate from top-level scope.
|
||||||
|
DCHECK(proxy->IsPrivateName());
|
||||||
|
DCHECK(is_script_scope() || is_module_scope() || is_eval_scope());
|
||||||
|
Variable* dynamic = NonLocal(proxy->raw_name(), VariableMode::kDynamic);
|
||||||
|
proxy->BindTo(dynamic);
|
||||||
|
}
|
||||||
|
|
||||||
// static
|
// static
|
||||||
template <Scope::ScopeLookupMode mode>
|
template <Scope::ScopeLookupMode mode>
|
||||||
Variable* Scope::Lookup(VariableProxy* proxy, Scope* scope,
|
Variable* Scope::Lookup(VariableProxy* proxy, Scope* scope,
|
||||||
@ -3112,6 +3121,13 @@ void PrivateNameScopeIterator::AddUnresolvedPrivateName(VariableProxy* proxy) {
|
|||||||
// be new.
|
// be new.
|
||||||
DCHECK(!proxy->is_resolved());
|
DCHECK(!proxy->is_resolved());
|
||||||
DCHECK(proxy->IsPrivateName());
|
DCHECK(proxy->IsPrivateName());
|
||||||
|
|
||||||
|
// Use dynamic lookup for top-level scopes in debug-evaluate.
|
||||||
|
if (Done()) {
|
||||||
|
start_scope_->ForceDynamicLookup(proxy);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
GetScope()->EnsureRareData()->unresolved_private_names.Add(proxy);
|
GetScope()->EnsureRareData()->unresolved_private_names.Add(proxy);
|
||||||
// Any closure scope that contain uses of private names that skips over a
|
// Any closure scope that contain uses of private names that skips over a
|
||||||
// class scope due to heritage expressions need private name context chain
|
// class scope due to heritage expressions need private name context chain
|
||||||
|
@ -637,6 +637,8 @@ class V8_EXPORT_PRIVATE Scope : public NON_EXPORTED_BASE(ZoneObject) {
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ForceDynamicLookup(VariableProxy* proxy);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
explicit Scope(Zone* zone);
|
explicit Scope(Zone* zone);
|
||||||
|
|
||||||
|
@ -71,8 +71,9 @@ constexpr int kPageSizeBits = 18;
|
|||||||
// to that size needs to be individually protectable via
|
// to that size needs to be individually protectable via
|
||||||
// {base::OS::SetPermission} and friends.
|
// {base::OS::SetPermission} and friends.
|
||||||
#if (defined(V8_OS_MACOS) && defined(V8_HOST_ARCH_ARM64)) || \
|
#if (defined(V8_OS_MACOS) && defined(V8_HOST_ARCH_ARM64)) || \
|
||||||
defined(V8_HOST_ARCH_LOONG64) || defined(V8_HOST_ARCH_MIPS64)
|
defined(V8_HOST_ARCH_LOONG64) || defined(V8_HOST_ARCH_MIPS64) || \
|
||||||
// MacOS on arm64 uses 16kB pages.
|
defined(V8_OS_IOS)
|
||||||
|
// MacOS & iOS on arm64 uses 16kB pages.
|
||||||
// LOONG64 and MIPS64 also use 16kB pages.
|
// LOONG64 and MIPS64 also use 16kB pages.
|
||||||
constexpr int kMinimumOSPageSize = 16 * 1024;
|
constexpr int kMinimumOSPageSize = 16 * 1024;
|
||||||
#elif defined(V8_OS_LINUX) && !defined(V8_OS_ANDROID) && \
|
#elif defined(V8_OS_LINUX) && !defined(V8_OS_ANDROID) && \
|
||||||
|
@ -404,6 +404,7 @@ CPU::CPU()
|
|||||||
has_vfp3_(false),
|
has_vfp3_(false),
|
||||||
has_vfp3_d32_(false),
|
has_vfp3_d32_(false),
|
||||||
has_jscvt_(false),
|
has_jscvt_(false),
|
||||||
|
has_dot_prod_(false),
|
||||||
is_fp64_mode_(false),
|
is_fp64_mode_(false),
|
||||||
has_non_stop_time_stamp_counter_(false),
|
has_non_stop_time_stamp_counter_(false),
|
||||||
is_running_in_vm_(false),
|
is_running_in_vm_(false),
|
||||||
@ -726,20 +727,27 @@ CPU::CPU()
|
|||||||
#if !defined(PF_ARM_V83_JSCVT_INSTRUCTIONS_AVAILABLE)
|
#if !defined(PF_ARM_V83_JSCVT_INSTRUCTIONS_AVAILABLE)
|
||||||
constexpr int PF_ARM_V83_JSCVT_INSTRUCTIONS_AVAILABLE = 44;
|
constexpr int PF_ARM_V83_JSCVT_INSTRUCTIONS_AVAILABLE = 44;
|
||||||
#endif
|
#endif
|
||||||
|
#if !defined(PF_ARM_V82_DP_INSTRUCTIONS_AVAILABLE)
|
||||||
|
constexpr int PF_ARM_V82_DP_INSTRUCTIONS_AVAILABLE = 43;
|
||||||
|
#endif
|
||||||
|
|
||||||
has_jscvt_ =
|
has_jscvt_ =
|
||||||
IsProcessorFeaturePresent(PF_ARM_V83_JSCVT_INSTRUCTIONS_AVAILABLE);
|
IsProcessorFeaturePresent(PF_ARM_V83_JSCVT_INSTRUCTIONS_AVAILABLE);
|
||||||
|
has_dot_prod_ =
|
||||||
|
IsProcessorFeaturePresent(PF_ARM_V82_DP_INSTRUCTIONS_AVAILABLE);
|
||||||
|
|
||||||
#elif V8_OS_LINUX
|
#elif V8_OS_LINUX
|
||||||
// Try to extract the list of CPU features from ELF hwcaps.
|
// Try to extract the list of CPU features from ELF hwcaps.
|
||||||
uint32_t hwcaps = ReadELFHWCaps();
|
uint32_t hwcaps = ReadELFHWCaps();
|
||||||
if (hwcaps != 0) {
|
if (hwcaps != 0) {
|
||||||
has_jscvt_ = (hwcaps & HWCAP_JSCVT) != 0;
|
has_jscvt_ = (hwcaps & HWCAP_JSCVT) != 0;
|
||||||
|
has_dot_prod_ = (hwcaps & HWCAP_ASIMDDP) != 0;
|
||||||
} else {
|
} else {
|
||||||
// Try to fallback to "Features" CPUInfo field
|
// Try to fallback to "Features" CPUInfo field
|
||||||
CPUInfo cpu_info;
|
CPUInfo cpu_info;
|
||||||
char* features = cpu_info.ExtractField("Features");
|
char* features = cpu_info.ExtractField("Features");
|
||||||
has_jscvt_ = HasListItem(features, "jscvt");
|
has_jscvt_ = HasListItem(features, "jscvt");
|
||||||
|
has_dot_prod_ = HasListItem(features, "asimddp");
|
||||||
delete[] features;
|
delete[] features;
|
||||||
}
|
}
|
||||||
#elif V8_OS_DARWIN
|
#elif V8_OS_DARWIN
|
||||||
@ -752,9 +760,18 @@ CPU::CPU()
|
|||||||
} else {
|
} else {
|
||||||
has_jscvt_ = feat_jscvt;
|
has_jscvt_ = feat_jscvt;
|
||||||
}
|
}
|
||||||
|
int64_t feat_dot_prod = 0;
|
||||||
|
size_t feat_dot_prod_size = sizeof(feat_dot_prod);
|
||||||
|
if (sysctlbyname("hw.optional.arm.FEAT_DotProd", &feat_dot_prod,
|
||||||
|
&feat_dot_prod_size, nullptr, 0) == -1) {
|
||||||
|
has_dot_prod_ = false;
|
||||||
|
} else {
|
||||||
|
has_dot_prod_ = feat_dot_prod;
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
// ARM64 Macs always have JSCVT.
|
// ARM64 Macs always have JSCVT and ASIMDDP
|
||||||
has_jscvt_ = true;
|
has_jscvt_ = true;
|
||||||
|
has_dot_prod_ = true;
|
||||||
#endif // V8_OS_IOS
|
#endif // V8_OS_IOS
|
||||||
#endif // V8_OS_WIN
|
#endif // V8_OS_WIN
|
||||||
|
|
||||||
|
@ -123,6 +123,7 @@ class V8_BASE_EXPORT CPU final {
|
|||||||
bool has_vfp3() const { return has_vfp3_; }
|
bool has_vfp3() const { return has_vfp3_; }
|
||||||
bool has_vfp3_d32() const { return has_vfp3_d32_; }
|
bool has_vfp3_d32() const { return has_vfp3_d32_; }
|
||||||
bool has_jscvt() const { return has_jscvt_; }
|
bool has_jscvt() const { return has_jscvt_; }
|
||||||
|
bool has_dot_prod() const { return has_dot_prod_; }
|
||||||
|
|
||||||
// mips features
|
// mips features
|
||||||
bool is_fp64_mode() const { return is_fp64_mode_; }
|
bool is_fp64_mode() const { return is_fp64_mode_; }
|
||||||
@ -176,6 +177,7 @@ class V8_BASE_EXPORT CPU final {
|
|||||||
bool has_vfp3_;
|
bool has_vfp3_;
|
||||||
bool has_vfp3_d32_;
|
bool has_vfp3_d32_;
|
||||||
bool has_jscvt_;
|
bool has_jscvt_;
|
||||||
|
bool has_dot_prod_;
|
||||||
bool is_fp64_mode_;
|
bool is_fp64_mode_;
|
||||||
bool has_non_stop_time_stamp_counter_;
|
bool has_non_stop_time_stamp_counter_;
|
||||||
bool is_running_in_vm_;
|
bool is_running_in_vm_;
|
||||||
|
@ -126,8 +126,8 @@ inline size_t MallocUsableSize(void* ptr) {
|
|||||||
// Mimics C++23 `allocation_result`.
|
// Mimics C++23 `allocation_result`.
|
||||||
template <class Pointer>
|
template <class Pointer>
|
||||||
struct AllocationResult {
|
struct AllocationResult {
|
||||||
Pointer ptr;
|
Pointer ptr = nullptr;
|
||||||
size_t count;
|
size_t count = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Allocates at least `n * sizeof(T)` uninitialized storage but may allocate
|
// Allocates at least `n * sizeof(T)` uninitialized storage but may allocate
|
||||||
|
@ -505,8 +505,9 @@ bool OS::SetPermissions(void* address, size_t size, MemoryPermission access) {
|
|||||||
// TODO(erikchen): Fix this to only call MADV_FREE_REUSE when necessary.
|
// TODO(erikchen): Fix this to only call MADV_FREE_REUSE when necessary.
|
||||||
// https://crbug.com/823915
|
// https://crbug.com/823915
|
||||||
#if defined(V8_OS_DARWIN)
|
#if defined(V8_OS_DARWIN)
|
||||||
if (access != OS::MemoryPermission::kNoAccess)
|
if (access != OS::MemoryPermission::kNoAccess) {
|
||||||
madvise(address, size, MADV_FREE_REUSE);
|
madvise(address, size, MADV_FREE_REUSE);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return ret == 0;
|
return ret == 0;
|
||||||
@ -554,14 +555,19 @@ bool OS::DiscardSystemPages(void* address, size_t size) {
|
|||||||
}
|
}
|
||||||
#elif defined(_AIX) || defined(V8_OS_SOLARIS)
|
#elif defined(_AIX) || defined(V8_OS_SOLARIS)
|
||||||
int ret = madvise(reinterpret_cast<caddr_t>(address), size, MADV_FREE);
|
int ret = madvise(reinterpret_cast<caddr_t>(address), size, MADV_FREE);
|
||||||
if (ret != 0 && errno == ENOSYS)
|
if (ret != 0 && errno == ENOSYS) {
|
||||||
return true; // madvise is not available on all systems.
|
return true; // madvise is not available on all systems.
|
||||||
if (ret != 0 && errno == EINVAL)
|
}
|
||||||
|
if (ret != 0 && errno == EINVAL) {
|
||||||
ret = madvise(reinterpret_cast<caddr_t>(address), size, MADV_DONTNEED);
|
ret = madvise(reinterpret_cast<caddr_t>(address), size, MADV_DONTNEED);
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
int ret = madvise(address, size, MADV_DONTNEED);
|
int ret = madvise(address, size, MADV_DONTNEED);
|
||||||
#endif
|
#endif
|
||||||
return ret == 0;
|
// madvise with MADV_DONTNEED only fails on illegal parameters. That's a bug
|
||||||
|
// in the caller.
|
||||||
|
CHECK_EQ(0, ret);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined(_AIX)
|
#if !defined(_AIX)
|
||||||
@ -576,9 +582,14 @@ bool OS::DecommitPages(void* address, size_t size) {
|
|||||||
// shall be removed, as if by an appropriate call to munmap(), before the new
|
// shall be removed, as if by an appropriate call to munmap(), before the new
|
||||||
// mapping is established." As a consequence, the memory will be
|
// mapping is established." As a consequence, the memory will be
|
||||||
// zero-initialized on next access.
|
// zero-initialized on next access.
|
||||||
void* ptr = mmap(address, size, PROT_NONE,
|
void* ret = mmap(address, size, PROT_NONE,
|
||||||
MAP_FIXED | MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
|
MAP_FIXED | MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
|
||||||
return ptr == address;
|
if (V8_UNLIKELY(ret == MAP_FAILED)) {
|
||||||
|
CHECK_EQ(ENOMEM, errno);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
CHECK_EQ(ret, address);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
#endif // !defined(_AIX)
|
#endif // !defined(_AIX)
|
||||||
|
|
||||||
|
@ -91,10 +91,10 @@ class V8_BASE_EXPORT TimeDelta final {
|
|||||||
return TimeDelta(nanoseconds / TimeConstants::kNanosecondsPerMicrosecond);
|
return TimeDelta(nanoseconds / TimeConstants::kNanosecondsPerMicrosecond);
|
||||||
}
|
}
|
||||||
|
|
||||||
static TimeDelta FromSecondsD(double seconds) {
|
static constexpr TimeDelta FromSecondsD(double seconds) {
|
||||||
return FromDouble(seconds * TimeConstants::kMicrosecondsPerSecond);
|
return FromDouble(seconds * TimeConstants::kMicrosecondsPerSecond);
|
||||||
}
|
}
|
||||||
static TimeDelta FromMillisecondsD(double milliseconds) {
|
static constexpr TimeDelta FromMillisecondsD(double milliseconds) {
|
||||||
return FromDouble(milliseconds *
|
return FromDouble(milliseconds *
|
||||||
TimeConstants::kMicrosecondsPerMillisecond);
|
TimeConstants::kMicrosecondsPerMillisecond);
|
||||||
}
|
}
|
||||||
@ -210,8 +210,7 @@ class V8_BASE_EXPORT TimeDelta final {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// TODO(v8:10620): constexpr requires constexpr saturated_cast.
|
static constexpr inline TimeDelta FromDouble(double value);
|
||||||
static inline TimeDelta FromDouble(double value);
|
|
||||||
|
|
||||||
template<class TimeClass> friend class time_internal::TimeBase;
|
template<class TimeClass> friend class time_internal::TimeBase;
|
||||||
// Constructs a delta given the duration in microseconds. This is private
|
// Constructs a delta given the duration in microseconds. This is private
|
||||||
@ -224,7 +223,7 @@ class V8_BASE_EXPORT TimeDelta final {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// static
|
// static
|
||||||
TimeDelta TimeDelta::FromDouble(double value) {
|
constexpr TimeDelta TimeDelta::FromDouble(double value) {
|
||||||
return TimeDelta(saturated_cast<int64_t>(value));
|
return TimeDelta(saturated_cast<int64_t>(value));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -142,10 +142,10 @@ class SmallVector {
|
|||||||
|
|
||||||
template <typename... Args>
|
template <typename... Args>
|
||||||
void emplace_back(Args&&... args) {
|
void emplace_back(Args&&... args) {
|
||||||
T* end = end_;
|
if (V8_UNLIKELY(end_ == end_of_storage_)) Grow();
|
||||||
if (V8_UNLIKELY(end == end_of_storage_)) end = Grow();
|
void* storage = end_;
|
||||||
new (end) T(std::forward<Args>(args)...);
|
end_ += 1;
|
||||||
end_ = end + 1;
|
new (storage) T(std::forward<Args>(args)...);
|
||||||
}
|
}
|
||||||
|
|
||||||
void push_back(T x) { emplace_back(std::move(x)); }
|
void push_back(T x) { emplace_back(std::move(x)); }
|
||||||
@ -200,10 +200,10 @@ class SmallVector {
|
|||||||
|
|
||||||
// Grows the backing store by a factor of two. Returns the new end of the used
|
// Grows the backing store by a factor of two. Returns the new end of the used
|
||||||
// storage (this reduces binary size).
|
// storage (this reduces binary size).
|
||||||
V8_NOINLINE T* Grow() { return Grow(0); }
|
V8_NOINLINE V8_PRESERVE_MOST void Grow() { Grow(0); }
|
||||||
|
|
||||||
// Grows the backing store by a factor of two, and at least to {min_capacity}.
|
// Grows the backing store by a factor of two, and at least to {min_capacity}.
|
||||||
V8_NOINLINE T* Grow(size_t min_capacity) {
|
V8_NOINLINE V8_PRESERVE_MOST void Grow(size_t min_capacity) {
|
||||||
size_t in_use = end_ - begin_;
|
size_t in_use = end_ - begin_;
|
||||||
size_t new_capacity =
|
size_t new_capacity =
|
||||||
base::bits::RoundUpToPowerOfTwo(std::max(min_capacity, 2 * capacity()));
|
base::bits::RoundUpToPowerOfTwo(std::max(min_capacity, 2 * capacity()));
|
||||||
@ -220,14 +220,13 @@ class SmallVector {
|
|||||||
begin_ = new_storage;
|
begin_ = new_storage;
|
||||||
end_ = new_storage + in_use;
|
end_ = new_storage + in_use;
|
||||||
end_of_storage_ = new_storage + new_capacity;
|
end_of_storage_ = new_storage + new_capacity;
|
||||||
return end_;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
T* AllocateDynamicStorage(size_t number_of_elements) {
|
T* AllocateDynamicStorage(size_t number_of_elements) {
|
||||||
return allocator_.allocate(number_of_elements);
|
return allocator_.allocate(number_of_elements);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FreeDynamicStorage() {
|
V8_NOINLINE V8_PRESERVE_MOST void FreeDynamicStorage() {
|
||||||
DCHECK(is_big());
|
DCHECK(is_big());
|
||||||
allocator_.deallocate(begin_, end_of_storage_ - begin_);
|
allocator_.deallocate(begin_, end_of_storage_ - begin_);
|
||||||
}
|
}
|
||||||
|
@ -39,35 +39,6 @@ class BaselineAssembler::ScratchRegisterScope {
|
|||||||
UseScratchRegisterScope wrapped_scope_;
|
UseScratchRegisterScope wrapped_scope_;
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO(v8:11429,leszeks): Unify condition names in the MacroAssembler.
|
|
||||||
enum class Condition : uint32_t {
|
|
||||||
kEqual = static_cast<uint32_t>(eq),
|
|
||||||
kNotEqual = static_cast<uint32_t>(ne),
|
|
||||||
|
|
||||||
kLessThan = static_cast<uint32_t>(lt),
|
|
||||||
kGreaterThan = static_cast<uint32_t>(gt),
|
|
||||||
kLessThanEqual = static_cast<uint32_t>(le),
|
|
||||||
kGreaterThanEqual = static_cast<uint32_t>(ge),
|
|
||||||
|
|
||||||
kUnsignedLessThan = static_cast<uint32_t>(lo),
|
|
||||||
kUnsignedGreaterThan = static_cast<uint32_t>(hi),
|
|
||||||
kUnsignedLessThanEqual = static_cast<uint32_t>(ls),
|
|
||||||
kUnsignedGreaterThanEqual = static_cast<uint32_t>(hs),
|
|
||||||
|
|
||||||
kOverflow = static_cast<uint32_t>(vs),
|
|
||||||
kNoOverflow = static_cast<uint32_t>(vc),
|
|
||||||
|
|
||||||
kZero = static_cast<uint32_t>(eq),
|
|
||||||
kNotZero = static_cast<uint32_t>(ne),
|
|
||||||
};
|
|
||||||
|
|
||||||
inline internal::Condition AsMasmCondition(Condition cond) {
|
|
||||||
// This is important for arm, where the internal::Condition where each value
|
|
||||||
// represents an encoded bit field value.
|
|
||||||
static_assert(sizeof(internal::Condition) == sizeof(Condition));
|
|
||||||
return static_cast<internal::Condition>(cond);
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace detail {
|
namespace detail {
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
@ -132,13 +103,13 @@ void BaselineAssembler::JumpIfNotSmi(Register value, Label* target,
|
|||||||
void BaselineAssembler::TestAndBranch(Register value, int mask, Condition cc,
|
void BaselineAssembler::TestAndBranch(Register value, int mask, Condition cc,
|
||||||
Label* target, Label::Distance) {
|
Label* target, Label::Distance) {
|
||||||
__ tst(value, Operand(mask));
|
__ tst(value, Operand(mask));
|
||||||
__ b(AsMasmCondition(cc), target);
|
__ b(cc, target);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaselineAssembler::JumpIf(Condition cc, Register lhs, const Operand& rhs,
|
void BaselineAssembler::JumpIf(Condition cc, Register lhs, const Operand& rhs,
|
||||||
Label* target, Label::Distance) {
|
Label* target, Label::Distance) {
|
||||||
__ cmp(lhs, Operand(rhs));
|
__ cmp(lhs, Operand(rhs));
|
||||||
__ b(AsMasmCondition(cc), target);
|
__ b(cc, target);
|
||||||
}
|
}
|
||||||
void BaselineAssembler::JumpIfObjectType(Condition cc, Register object,
|
void BaselineAssembler::JumpIfObjectType(Condition cc, Register object,
|
||||||
InstanceType instance_type,
|
InstanceType instance_type,
|
||||||
@ -409,7 +380,7 @@ void BaselineAssembler::TryLoadOptimizedOsrCode(Register scratch_and_result,
|
|||||||
{
|
{
|
||||||
ScratchRegisterScope temps(this);
|
ScratchRegisterScope temps(this);
|
||||||
Register scratch = temps.AcquireScratch();
|
Register scratch = temps.AcquireScratch();
|
||||||
__ TestCodeTIsMarkedForDeoptimization(scratch_and_result, scratch);
|
__ TestCodeIsMarkedForDeoptimization(scratch_and_result, scratch);
|
||||||
__ b(eq, on_result);
|
__ b(eq, on_result);
|
||||||
__ mov(scratch, __ ClearedValue());
|
__ mov(scratch, __ ClearedValue());
|
||||||
StoreTaggedFieldNoWriteBarrier(
|
StoreTaggedFieldNoWriteBarrier(
|
||||||
@ -536,8 +507,7 @@ void BaselineAssembler::Switch(Register reg, int case_value_base,
|
|||||||
|
|
||||||
// Mostly copied from code-generator-arm.cc
|
// Mostly copied from code-generator-arm.cc
|
||||||
ScratchRegisterScope scope(this);
|
ScratchRegisterScope scope(this);
|
||||||
JumpIf(Condition::kUnsignedGreaterThanEqual, reg, Operand(num_labels),
|
JumpIf(kUnsignedGreaterThanEqual, reg, Operand(num_labels), &fallthrough);
|
||||||
&fallthrough);
|
|
||||||
// Ensure to emit the constant pool first if necessary.
|
// Ensure to emit the constant pool first if necessary.
|
||||||
__ CheckConstPool(true, true);
|
__ CheckConstPool(true, true);
|
||||||
__ BlockConstPoolFor(num_labels);
|
__ BlockConstPoolFor(num_labels);
|
||||||
@ -591,8 +561,8 @@ void BaselineAssembler::EmitReturn(MacroAssembler* masm) {
|
|||||||
// If actual is bigger than formal, then we should use it to free up the stack
|
// If actual is bigger than formal, then we should use it to free up the stack
|
||||||
// arguments.
|
// arguments.
|
||||||
Label corrected_args_count;
|
Label corrected_args_count;
|
||||||
__ JumpIf(Condition::kGreaterThanEqual, params_size,
|
__ JumpIf(kGreaterThanEqual, params_size, Operand(actual_params_size),
|
||||||
Operand(actual_params_size), &corrected_args_count);
|
&corrected_args_count);
|
||||||
__ masm()->mov(params_size, actual_params_size);
|
__ masm()->mov(params_size, actual_params_size);
|
||||||
__ Bind(&corrected_args_count);
|
__ Bind(&corrected_args_count);
|
||||||
|
|
||||||
|
@ -38,32 +38,6 @@ class BaselineAssembler::ScratchRegisterScope {
|
|||||||
UseScratchRegisterScope wrapped_scope_;
|
UseScratchRegisterScope wrapped_scope_;
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO(v8:11461): Unify condition names in the MacroAssembler.
|
|
||||||
enum class Condition : uint32_t {
|
|
||||||
kEqual = eq,
|
|
||||||
kNotEqual = ne,
|
|
||||||
|
|
||||||
kLessThan = lt,
|
|
||||||
kGreaterThan = gt,
|
|
||||||
kLessThanEqual = le,
|
|
||||||
kGreaterThanEqual = ge,
|
|
||||||
|
|
||||||
kUnsignedLessThan = lo,
|
|
||||||
kUnsignedGreaterThan = hi,
|
|
||||||
kUnsignedLessThanEqual = ls,
|
|
||||||
kUnsignedGreaterThanEqual = hs,
|
|
||||||
|
|
||||||
kOverflow = vs,
|
|
||||||
kNoOverflow = vc,
|
|
||||||
|
|
||||||
kZero = eq,
|
|
||||||
kNotZero = ne,
|
|
||||||
};
|
|
||||||
|
|
||||||
inline internal::Condition AsMasmCondition(Condition cond) {
|
|
||||||
return static_cast<internal::Condition>(cond);
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace detail {
|
namespace detail {
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
@ -125,19 +99,19 @@ void BaselineAssembler::JumpIfImmediate(Condition cc, Register left, int right,
|
|||||||
|
|
||||||
void BaselineAssembler::TestAndBranch(Register value, int mask, Condition cc,
|
void BaselineAssembler::TestAndBranch(Register value, int mask, Condition cc,
|
||||||
Label* target, Label::Distance) {
|
Label* target, Label::Distance) {
|
||||||
if (cc == Condition::kZero) {
|
if (cc == kZero) {
|
||||||
__ TestAndBranchIfAllClear(value, mask, target);
|
__ TestAndBranchIfAllClear(value, mask, target);
|
||||||
} else if (cc == Condition::kNotZero) {
|
} else if (cc == kNotZero) {
|
||||||
__ TestAndBranchIfAnySet(value, mask, target);
|
__ TestAndBranchIfAnySet(value, mask, target);
|
||||||
} else {
|
} else {
|
||||||
__ Tst(value, Immediate(mask));
|
__ Tst(value, Immediate(mask));
|
||||||
__ B(AsMasmCondition(cc), target);
|
__ B(cc, target);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaselineAssembler::JumpIf(Condition cc, Register lhs, const Operand& rhs,
|
void BaselineAssembler::JumpIf(Condition cc, Register lhs, const Operand& rhs,
|
||||||
Label* target, Label::Distance) {
|
Label* target, Label::Distance) {
|
||||||
__ CompareAndBranch(lhs, rhs, AsMasmCondition(cc), target);
|
__ CompareAndBranch(lhs, rhs, cc, target);
|
||||||
}
|
}
|
||||||
void BaselineAssembler::JumpIfObjectType(Condition cc, Register object,
|
void BaselineAssembler::JumpIfObjectType(Condition cc, Register object,
|
||||||
InstanceType instance_type,
|
InstanceType instance_type,
|
||||||
@ -173,14 +147,14 @@ void BaselineAssembler::JumpIfPointer(Condition cc, Register value,
|
|||||||
void BaselineAssembler::JumpIfSmi(Condition cc, Register value, Smi smi,
|
void BaselineAssembler::JumpIfSmi(Condition cc, Register value, Smi smi,
|
||||||
Label* target, Label::Distance distance) {
|
Label* target, Label::Distance distance) {
|
||||||
__ AssertSmi(value);
|
__ AssertSmi(value);
|
||||||
__ CompareTaggedAndBranch(value, smi, AsMasmCondition(cc), target);
|
__ CompareTaggedAndBranch(value, smi, cc, target);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaselineAssembler::JumpIfSmi(Condition cc, Register lhs, Register rhs,
|
void BaselineAssembler::JumpIfSmi(Condition cc, Register lhs, Register rhs,
|
||||||
Label* target, Label::Distance) {
|
Label* target, Label::Distance) {
|
||||||
__ AssertSmi(lhs);
|
__ AssertSmi(lhs);
|
||||||
__ AssertSmi(rhs);
|
__ AssertSmi(rhs);
|
||||||
__ CompareTaggedAndBranch(lhs, rhs, AsMasmCondition(cc), target);
|
__ CompareTaggedAndBranch(lhs, rhs, cc, target);
|
||||||
}
|
}
|
||||||
void BaselineAssembler::JumpIfTagged(Condition cc, Register value,
|
void BaselineAssembler::JumpIfTagged(Condition cc, Register value,
|
||||||
MemOperand operand, Label* target,
|
MemOperand operand, Label* target,
|
||||||
@ -188,7 +162,7 @@ void BaselineAssembler::JumpIfTagged(Condition cc, Register value,
|
|||||||
ScratchRegisterScope temps(this);
|
ScratchRegisterScope temps(this);
|
||||||
Register tmp = temps.AcquireScratch();
|
Register tmp = temps.AcquireScratch();
|
||||||
__ Ldr(tmp, operand);
|
__ Ldr(tmp, operand);
|
||||||
__ CompareTaggedAndBranch(value, tmp, AsMasmCondition(cc), target);
|
__ CompareTaggedAndBranch(value, tmp, cc, target);
|
||||||
}
|
}
|
||||||
void BaselineAssembler::JumpIfTagged(Condition cc, MemOperand operand,
|
void BaselineAssembler::JumpIfTagged(Condition cc, MemOperand operand,
|
||||||
Register value, Label* target,
|
Register value, Label* target,
|
||||||
@ -196,7 +170,7 @@ void BaselineAssembler::JumpIfTagged(Condition cc, MemOperand operand,
|
|||||||
ScratchRegisterScope temps(this);
|
ScratchRegisterScope temps(this);
|
||||||
Register tmp = temps.AcquireScratch();
|
Register tmp = temps.AcquireScratch();
|
||||||
__ Ldr(tmp, operand);
|
__ Ldr(tmp, operand);
|
||||||
__ CompareTaggedAndBranch(tmp, value, AsMasmCondition(cc), target);
|
__ CompareTaggedAndBranch(tmp, value, cc, target);
|
||||||
}
|
}
|
||||||
void BaselineAssembler::JumpIfByte(Condition cc, Register value, int32_t byte,
|
void BaselineAssembler::JumpIfByte(Condition cc, Register value, int32_t byte,
|
||||||
Label* target, Label::Distance) {
|
Label* target, Label::Distance) {
|
||||||
@ -456,27 +430,8 @@ void BaselineAssembler::TryLoadOptimizedOsrCode(Register scratch_and_result,
|
|||||||
FeedbackSlot slot,
|
FeedbackSlot slot,
|
||||||
Label* on_result,
|
Label* on_result,
|
||||||
Label::Distance) {
|
Label::Distance) {
|
||||||
Label fallthrough, clear_slot;
|
__ TryLoadOptimizedOsrCode(scratch_and_result, feedback_vector, slot,
|
||||||
LoadTaggedPointerField(scratch_and_result, feedback_vector,
|
on_result, Label::Distance::kFar);
|
||||||
FeedbackVector::OffsetOfElementAt(slot.ToInt()));
|
|
||||||
__ LoadWeakValue(scratch_and_result, scratch_and_result, &fallthrough);
|
|
||||||
|
|
||||||
// Is it marked_for_deoptimization? If yes, clear the slot.
|
|
||||||
{
|
|
||||||
ScratchRegisterScope temps(this);
|
|
||||||
__ JumpIfCodeTIsMarkedForDeoptimization(
|
|
||||||
scratch_and_result, temps.AcquireScratch(), &clear_slot);
|
|
||||||
__ B(on_result);
|
|
||||||
}
|
|
||||||
|
|
||||||
__ bind(&clear_slot);
|
|
||||||
__ Mov(scratch_and_result, __ ClearedValue());
|
|
||||||
StoreTaggedFieldNoWriteBarrier(
|
|
||||||
feedback_vector, FeedbackVector::OffsetOfElementAt(slot.ToInt()),
|
|
||||||
scratch_and_result);
|
|
||||||
|
|
||||||
__ bind(&fallthrough);
|
|
||||||
Move(scratch_and_result, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaselineAssembler::AddToInterruptBudgetAndJumpIfNotExceeded(
|
void BaselineAssembler::AddToInterruptBudgetAndJumpIfNotExceeded(
|
||||||
@ -601,16 +556,23 @@ void BaselineAssembler::Switch(Register reg, int case_value_base,
|
|||||||
ScratchRegisterScope scope(this);
|
ScratchRegisterScope scope(this);
|
||||||
Register temp = scope.AcquireScratch();
|
Register temp = scope.AcquireScratch();
|
||||||
Label table;
|
Label table;
|
||||||
JumpIf(Condition::kUnsignedGreaterThanEqual, reg, num_labels, &fallthrough);
|
JumpIf(kUnsignedGreaterThanEqual, reg, num_labels, &fallthrough);
|
||||||
__ Adr(temp, &table);
|
__ Adr(temp, &table);
|
||||||
int entry_size_log2 = 2;
|
int entry_size_log2 = 2;
|
||||||
#ifdef V8_ENABLE_CONTROL_FLOW_INTEGRITY
|
#ifdef V8_ENABLE_CONTROL_FLOW_INTEGRITY
|
||||||
++entry_size_log2; // Account for BTI.
|
++entry_size_log2; // Account for BTI.
|
||||||
|
constexpr int instructions_per_jump_target = 1;
|
||||||
|
#else
|
||||||
|
constexpr int instructions_per_jump_target = 0;
|
||||||
#endif
|
#endif
|
||||||
|
constexpr int instructions_per_label = 1 + instructions_per_jump_target;
|
||||||
__ Add(temp, temp, Operand(reg, UXTW, entry_size_log2));
|
__ Add(temp, temp, Operand(reg, UXTW, entry_size_log2));
|
||||||
__ Br(temp);
|
__ Br(temp);
|
||||||
{
|
{
|
||||||
TurboAssembler::BlockPoolsScope block_pools(masm_, num_labels * kInstrSize);
|
const int instruction_count =
|
||||||
|
num_labels * instructions_per_label + instructions_per_jump_target;
|
||||||
|
TurboAssembler::BlockPoolsScope block_pools(masm_,
|
||||||
|
instruction_count * kInstrSize);
|
||||||
__ Bind(&table);
|
__ Bind(&table);
|
||||||
for (int i = 0; i < num_labels; ++i) {
|
for (int i = 0; i < num_labels; ++i) {
|
||||||
__ JumpTarget();
|
__ JumpTarget();
|
||||||
@ -659,7 +621,7 @@ void BaselineAssembler::EmitReturn(MacroAssembler* masm) {
|
|||||||
// If actual is bigger than formal, then we should use it to free up the stack
|
// If actual is bigger than formal, then we should use it to free up the stack
|
||||||
// arguments.
|
// arguments.
|
||||||
Label corrected_args_count;
|
Label corrected_args_count;
|
||||||
__ JumpIf(Condition::kGreaterThanEqual, params_size, actual_params_size,
|
__ JumpIf(kGreaterThanEqual, params_size, actual_params_size,
|
||||||
&corrected_args_count);
|
&corrected_args_count);
|
||||||
__ masm()->Mov(params_size, actual_params_size);
|
__ masm()->Mov(params_size, actual_params_size);
|
||||||
__ Bind(&corrected_args_count);
|
__ Bind(&corrected_args_count);
|
||||||
|
@ -17,8 +17,6 @@ namespace v8 {
|
|||||||
namespace internal {
|
namespace internal {
|
||||||
namespace baseline {
|
namespace baseline {
|
||||||
|
|
||||||
enum class Condition : uint32_t;
|
|
||||||
|
|
||||||
class BaselineAssembler {
|
class BaselineAssembler {
|
||||||
public:
|
public:
|
||||||
class ScratchRegisterScope;
|
class ScratchRegisterScope;
|
||||||
|
@ -74,7 +74,7 @@ class BaselineCompilerTask {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
shared_function_info_->set_baseline_code(ToCodeT(*code), kReleaseStore);
|
shared_function_info_->set_baseline_code(*code, kReleaseStore);
|
||||||
if (v8_flags.trace_baseline_concurrent_compilation) {
|
if (v8_flags.trace_baseline_concurrent_compilation) {
|
||||||
CodeTracer::Scope scope(isolate->GetCodeTracer());
|
CodeTracer::Scope scope(isolate->GetCodeTracer());
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
|
@ -561,8 +561,8 @@ void BaselineCompiler::VerifyFrame() {
|
|||||||
__ Move(scratch, __ FeedbackVectorOperand());
|
__ Move(scratch, __ FeedbackVectorOperand());
|
||||||
Label is_smi, is_ok;
|
Label is_smi, is_ok;
|
||||||
__ JumpIfSmi(scratch, &is_smi);
|
__ JumpIfSmi(scratch, &is_smi);
|
||||||
__ JumpIfObjectType(Condition::kEqual, scratch, FEEDBACK_VECTOR_TYPE,
|
__ JumpIfObjectType(kEqual, scratch, FEEDBACK_VECTOR_TYPE, scratch,
|
||||||
scratch, &is_ok);
|
&is_ok);
|
||||||
__ Bind(&is_smi);
|
__ Bind(&is_smi);
|
||||||
__ masm()->Abort(AbortReason::kExpectedFeedbackVector);
|
__ masm()->Abort(AbortReason::kExpectedFeedbackVector);
|
||||||
__ Bind(&is_ok);
|
__ Bind(&is_ok);
|
||||||
@ -669,8 +669,8 @@ void BaselineCompiler::JumpIfToBoolean(bool do_jump_if_true, Label* label,
|
|||||||
// the original value into kInterpreterAccumulatorRegister, so we don't have
|
// the original value into kInterpreterAccumulatorRegister, so we don't have
|
||||||
// to worry about it getting clobbered.
|
// to worry about it getting clobbered.
|
||||||
static_assert(kReturnRegister0 == kInterpreterAccumulatorRegister);
|
static_assert(kReturnRegister0 == kInterpreterAccumulatorRegister);
|
||||||
__ JumpIfSmi(do_jump_if_true ? Condition::kNotEqual : Condition::kEqual,
|
__ JumpIfSmi(do_jump_if_true ? kNotEqual : kEqual, kReturnRegister1,
|
||||||
kReturnRegister1, Smi::FromInt(0), label, distance);
|
Smi::FromInt(0), label, distance);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaselineCompiler::VisitLdaZero() {
|
void BaselineCompiler::VisitLdaZero() {
|
||||||
@ -942,7 +942,8 @@ void BaselineCompiler::VisitDefineKeyedOwnProperty() {
|
|||||||
RegisterOperand(0), // object
|
RegisterOperand(0), // object
|
||||||
RegisterOperand(1), // key
|
RegisterOperand(1), // key
|
||||||
kInterpreterAccumulatorRegister, // value
|
kInterpreterAccumulatorRegister, // value
|
||||||
IndexAsTagged(2)); // slot
|
Flag8AsSmi(2), // flags
|
||||||
|
IndexAsTagged(3)); // slot
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaselineCompiler::VisitStaInArrayLiteral() {
|
void BaselineCompiler::VisitStaInArrayLiteral() {
|
||||||
@ -1489,8 +1490,7 @@ void BaselineCompiler::VisitTestReferenceEqual() {
|
|||||||
SelectBooleanConstant(
|
SelectBooleanConstant(
|
||||||
kInterpreterAccumulatorRegister,
|
kInterpreterAccumulatorRegister,
|
||||||
[&](Label* is_true, Label::Distance distance) {
|
[&](Label* is_true, Label::Distance distance) {
|
||||||
__ JumpIfTagged(Condition::kEqual,
|
__ JumpIfTagged(kEqual, __ RegisterFrameOperand(RegisterOperand(0)),
|
||||||
__ RegisterFrameOperand(RegisterOperand(0)),
|
|
||||||
kInterpreterAccumulatorRegister, is_true, distance);
|
kInterpreterAccumulatorRegister, is_true, distance);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -1520,8 +1520,8 @@ void BaselineCompiler::VisitTestUndetectable() {
|
|||||||
Register map_bit_field = kInterpreterAccumulatorRegister;
|
Register map_bit_field = kInterpreterAccumulatorRegister;
|
||||||
__ LoadMap(map_bit_field, kInterpreterAccumulatorRegister);
|
__ LoadMap(map_bit_field, kInterpreterAccumulatorRegister);
|
||||||
__ LoadWord8Field(map_bit_field, map_bit_field, Map::kBitFieldOffset);
|
__ LoadWord8Field(map_bit_field, map_bit_field, Map::kBitFieldOffset);
|
||||||
__ TestAndBranch(map_bit_field, Map::Bits1::IsUndetectableBit::kMask,
|
__ TestAndBranch(map_bit_field, Map::Bits1::IsUndetectableBit::kMask, kZero,
|
||||||
Condition::kZero, ¬_undetectable, Label::kNear);
|
¬_undetectable, Label::kNear);
|
||||||
|
|
||||||
__ LoadRoot(kInterpreterAccumulatorRegister, RootIndex::kTrueValue);
|
__ LoadRoot(kInterpreterAccumulatorRegister, RootIndex::kTrueValue);
|
||||||
__ Jump(&done, Label::kNear);
|
__ Jump(&done, Label::kNear);
|
||||||
@ -1561,7 +1561,7 @@ void BaselineCompiler::VisitTestTypeOf() {
|
|||||||
case interpreter::TestTypeOfFlags::LiteralFlag::kNumber: {
|
case interpreter::TestTypeOfFlags::LiteralFlag::kNumber: {
|
||||||
Label is_smi, is_heap_number;
|
Label is_smi, is_heap_number;
|
||||||
__ JumpIfSmi(kInterpreterAccumulatorRegister, &is_smi, Label::kNear);
|
__ JumpIfSmi(kInterpreterAccumulatorRegister, &is_smi, Label::kNear);
|
||||||
__ JumpIfObjectType(Condition::kEqual, kInterpreterAccumulatorRegister,
|
__ JumpIfObjectType(kEqual, kInterpreterAccumulatorRegister,
|
||||||
HEAP_NUMBER_TYPE, scratch_scope.AcquireScratch(),
|
HEAP_NUMBER_TYPE, scratch_scope.AcquireScratch(),
|
||||||
&is_heap_number, Label::kNear);
|
&is_heap_number, Label::kNear);
|
||||||
|
|
||||||
@ -1577,10 +1577,9 @@ void BaselineCompiler::VisitTestTypeOf() {
|
|||||||
Label is_smi, bad_instance_type;
|
Label is_smi, bad_instance_type;
|
||||||
__ JumpIfSmi(kInterpreterAccumulatorRegister, &is_smi, Label::kNear);
|
__ JumpIfSmi(kInterpreterAccumulatorRegister, &is_smi, Label::kNear);
|
||||||
static_assert(INTERNALIZED_STRING_TYPE == FIRST_TYPE);
|
static_assert(INTERNALIZED_STRING_TYPE == FIRST_TYPE);
|
||||||
__ JumpIfObjectType(Condition::kGreaterThanEqual,
|
__ JumpIfObjectType(kGreaterThanEqual, kInterpreterAccumulatorRegister,
|
||||||
kInterpreterAccumulatorRegister, FIRST_NONSTRING_TYPE,
|
FIRST_NONSTRING_TYPE, scratch_scope.AcquireScratch(),
|
||||||
scratch_scope.AcquireScratch(), &bad_instance_type,
|
&bad_instance_type, Label::kNear);
|
||||||
Label::kNear);
|
|
||||||
|
|
||||||
__ LoadRoot(kInterpreterAccumulatorRegister, RootIndex::kTrueValue);
|
__ LoadRoot(kInterpreterAccumulatorRegister, RootIndex::kTrueValue);
|
||||||
__ Jump(&done, Label::kNear);
|
__ Jump(&done, Label::kNear);
|
||||||
@ -1593,7 +1592,7 @@ void BaselineCompiler::VisitTestTypeOf() {
|
|||||||
case interpreter::TestTypeOfFlags::LiteralFlag::kSymbol: {
|
case interpreter::TestTypeOfFlags::LiteralFlag::kSymbol: {
|
||||||
Label is_smi, bad_instance_type;
|
Label is_smi, bad_instance_type;
|
||||||
__ JumpIfSmi(kInterpreterAccumulatorRegister, &is_smi, Label::kNear);
|
__ JumpIfSmi(kInterpreterAccumulatorRegister, &is_smi, Label::kNear);
|
||||||
__ JumpIfObjectType(Condition::kNotEqual, kInterpreterAccumulatorRegister,
|
__ JumpIfObjectType(kNotEqual, kInterpreterAccumulatorRegister,
|
||||||
SYMBOL_TYPE, scratch_scope.AcquireScratch(),
|
SYMBOL_TYPE, scratch_scope.AcquireScratch(),
|
||||||
&bad_instance_type, Label::kNear);
|
&bad_instance_type, Label::kNear);
|
||||||
|
|
||||||
@ -1623,7 +1622,7 @@ void BaselineCompiler::VisitTestTypeOf() {
|
|||||||
case interpreter::TestTypeOfFlags::LiteralFlag::kBigInt: {
|
case interpreter::TestTypeOfFlags::LiteralFlag::kBigInt: {
|
||||||
Label is_smi, bad_instance_type;
|
Label is_smi, bad_instance_type;
|
||||||
__ JumpIfSmi(kInterpreterAccumulatorRegister, &is_smi, Label::kNear);
|
__ JumpIfSmi(kInterpreterAccumulatorRegister, &is_smi, Label::kNear);
|
||||||
__ JumpIfObjectType(Condition::kNotEqual, kInterpreterAccumulatorRegister,
|
__ JumpIfObjectType(kNotEqual, kInterpreterAccumulatorRegister,
|
||||||
BIGINT_TYPE, scratch_scope.AcquireScratch(),
|
BIGINT_TYPE, scratch_scope.AcquireScratch(),
|
||||||
&bad_instance_type, Label::kNear);
|
&bad_instance_type, Label::kNear);
|
||||||
|
|
||||||
@ -1648,7 +1647,7 @@ void BaselineCompiler::VisitTestTypeOf() {
|
|||||||
__ LoadMap(map_bit_field, kInterpreterAccumulatorRegister);
|
__ LoadMap(map_bit_field, kInterpreterAccumulatorRegister);
|
||||||
__ LoadWord8Field(map_bit_field, map_bit_field, Map::kBitFieldOffset);
|
__ LoadWord8Field(map_bit_field, map_bit_field, Map::kBitFieldOffset);
|
||||||
__ TestAndBranch(map_bit_field, Map::Bits1::IsUndetectableBit::kMask,
|
__ TestAndBranch(map_bit_field, Map::Bits1::IsUndetectableBit::kMask,
|
||||||
Condition::kZero, ¬_undetectable, Label::kNear);
|
kZero, ¬_undetectable, Label::kNear);
|
||||||
|
|
||||||
__ LoadRoot(kInterpreterAccumulatorRegister, RootIndex::kTrueValue);
|
__ LoadRoot(kInterpreterAccumulatorRegister, RootIndex::kTrueValue);
|
||||||
__ Jump(&done, Label::kNear);
|
__ Jump(&done, Label::kNear);
|
||||||
@ -1667,10 +1666,10 @@ void BaselineCompiler::VisitTestTypeOf() {
|
|||||||
Register map_bit_field = kInterpreterAccumulatorRegister;
|
Register map_bit_field = kInterpreterAccumulatorRegister;
|
||||||
__ LoadMap(map_bit_field, kInterpreterAccumulatorRegister);
|
__ LoadMap(map_bit_field, kInterpreterAccumulatorRegister);
|
||||||
__ LoadWord8Field(map_bit_field, map_bit_field, Map::kBitFieldOffset);
|
__ LoadWord8Field(map_bit_field, map_bit_field, Map::kBitFieldOffset);
|
||||||
__ TestAndBranch(map_bit_field, Map::Bits1::IsCallableBit::kMask,
|
__ TestAndBranch(map_bit_field, Map::Bits1::IsCallableBit::kMask, kZero,
|
||||||
Condition::kZero, ¬_callable, Label::kNear);
|
¬_callable, Label::kNear);
|
||||||
__ TestAndBranch(map_bit_field, Map::Bits1::IsUndetectableBit::kMask,
|
__ TestAndBranch(map_bit_field, Map::Bits1::IsUndetectableBit::kMask,
|
||||||
Condition::kNotZero, &undetectable, Label::kNear);
|
kNotZero, &undetectable, Label::kNear);
|
||||||
|
|
||||||
__ LoadRoot(kInterpreterAccumulatorRegister, RootIndex::kTrueValue);
|
__ LoadRoot(kInterpreterAccumulatorRegister, RootIndex::kTrueValue);
|
||||||
__ Jump(&done, Label::kNear);
|
__ Jump(&done, Label::kNear);
|
||||||
@ -1692,7 +1691,7 @@ void BaselineCompiler::VisitTestTypeOf() {
|
|||||||
// If the object's instance type isn't within the range, return false.
|
// If the object's instance type isn't within the range, return false.
|
||||||
static_assert(LAST_JS_RECEIVER_TYPE == LAST_TYPE);
|
static_assert(LAST_JS_RECEIVER_TYPE == LAST_TYPE);
|
||||||
Register map = scratch_scope.AcquireScratch();
|
Register map = scratch_scope.AcquireScratch();
|
||||||
__ JumpIfObjectType(Condition::kLessThan, kInterpreterAccumulatorRegister,
|
__ JumpIfObjectType(kLessThan, kInterpreterAccumulatorRegister,
|
||||||
FIRST_JS_RECEIVER_TYPE, map, &bad_instance_type,
|
FIRST_JS_RECEIVER_TYPE, map, &bad_instance_type,
|
||||||
Label::kNear);
|
Label::kNear);
|
||||||
|
|
||||||
@ -1702,8 +1701,7 @@ void BaselineCompiler::VisitTestTypeOf() {
|
|||||||
__ TestAndBranch(map_bit_field,
|
__ TestAndBranch(map_bit_field,
|
||||||
Map::Bits1::IsUndetectableBit::kMask |
|
Map::Bits1::IsUndetectableBit::kMask |
|
||||||
Map::Bits1::IsCallableBit::kMask,
|
Map::Bits1::IsCallableBit::kMask,
|
||||||
Condition::kNotZero, &undetectable_or_callable,
|
kNotZero, &undetectable_or_callable, Label::kNear);
|
||||||
Label::kNear);
|
|
||||||
|
|
||||||
__ Bind(&is_null);
|
__ Bind(&is_null);
|
||||||
__ LoadRoot(kInterpreterAccumulatorRegister, RootIndex::kTrueValue);
|
__ LoadRoot(kInterpreterAccumulatorRegister, RootIndex::kTrueValue);
|
||||||
@ -1917,8 +1915,8 @@ void BaselineCompiler::VisitJumpLoop() {
|
|||||||
FeedbackVector::kOsrStateOffset);
|
FeedbackVector::kOsrStateOffset);
|
||||||
static_assert(FeedbackVector::MaybeHasOptimizedOsrCodeBit::encode(true) >
|
static_assert(FeedbackVector::MaybeHasOptimizedOsrCodeBit::encode(true) >
|
||||||
FeedbackVector::kMaxOsrUrgency);
|
FeedbackVector::kMaxOsrUrgency);
|
||||||
__ JumpIfByte(Condition::kUnsignedGreaterThan, osr_state, loop_depth,
|
__ JumpIfByte(kUnsignedGreaterThan, osr_state, loop_depth, &osr_armed,
|
||||||
&osr_armed, Label::kNear);
|
Label::kNear);
|
||||||
}
|
}
|
||||||
|
|
||||||
__ Bind(&osr_not_armed);
|
__ Bind(&osr_not_armed);
|
||||||
@ -1945,8 +1943,8 @@ void BaselineCompiler::VisitJumpLoop() {
|
|||||||
iterator().GetSlotOperand(2), &osr,
|
iterator().GetSlotOperand(2), &osr,
|
||||||
Label::kNear);
|
Label::kNear);
|
||||||
__ DecodeField<FeedbackVector::OsrUrgencyBits>(scratch1);
|
__ DecodeField<FeedbackVector::OsrUrgencyBits>(scratch1);
|
||||||
__ JumpIfByte(Condition::kUnsignedLessThanEqual, scratch1, loop_depth,
|
__ JumpIfByte(kUnsignedLessThanEqual, scratch1, loop_depth, &osr_not_armed,
|
||||||
&osr_not_armed, Label::kNear);
|
Label::kNear);
|
||||||
|
|
||||||
__ Bind(&osr);
|
__ Bind(&osr);
|
||||||
CallBuiltin<Builtin::kBaselineOnStackReplacement>(maybe_target_code);
|
CallBuiltin<Builtin::kBaselineOnStackReplacement>(maybe_target_code);
|
||||||
@ -2048,7 +2046,7 @@ void BaselineCompiler::VisitJumpIfJSReceiver() {
|
|||||||
Label is_smi, dont_jump;
|
Label is_smi, dont_jump;
|
||||||
__ JumpIfSmi(kInterpreterAccumulatorRegister, &is_smi, Label::kNear);
|
__ JumpIfSmi(kInterpreterAccumulatorRegister, &is_smi, Label::kNear);
|
||||||
|
|
||||||
__ JumpIfObjectType(Condition::kLessThan, kInterpreterAccumulatorRegister,
|
__ JumpIfObjectType(kLessThan, kInterpreterAccumulatorRegister,
|
||||||
FIRST_JS_RECEIVER_TYPE, scratch_scope.AcquireScratch(),
|
FIRST_JS_RECEIVER_TYPE, scratch_scope.AcquireScratch(),
|
||||||
&dont_jump);
|
&dont_jump);
|
||||||
UpdateInterruptBudgetAndDoInterpreterJump();
|
UpdateInterruptBudgetAndDoInterpreterJump();
|
||||||
@ -2096,8 +2094,7 @@ void BaselineCompiler::VisitForInContinue() {
|
|||||||
[&](Label* is_true, Label::Distance distance) {
|
[&](Label* is_true, Label::Distance distance) {
|
||||||
LoadRegister(kInterpreterAccumulatorRegister, 0);
|
LoadRegister(kInterpreterAccumulatorRegister, 0);
|
||||||
__ JumpIfTagged(
|
__ JumpIfTagged(
|
||||||
Condition::kNotEqual,
|
kNotEqual, kInterpreterAccumulatorRegister,
|
||||||
kInterpreterAccumulatorRegister,
|
|
||||||
__ RegisterFrameOperand(RegisterOperand(1)),
|
__ RegisterFrameOperand(RegisterOperand(1)),
|
||||||
is_true, distance);
|
is_true, distance);
|
||||||
});
|
});
|
||||||
@ -2189,8 +2186,8 @@ void BaselineCompiler::VisitThrowIfNotSuperConstructor() {
|
|||||||
Register map_bit_field = scratch_scope.AcquireScratch();
|
Register map_bit_field = scratch_scope.AcquireScratch();
|
||||||
__ LoadMap(map_bit_field, reg);
|
__ LoadMap(map_bit_field, reg);
|
||||||
__ LoadWord8Field(map_bit_field, map_bit_field, Map::kBitFieldOffset);
|
__ LoadWord8Field(map_bit_field, map_bit_field, Map::kBitFieldOffset);
|
||||||
__ TestAndBranch(map_bit_field, Map::Bits1::IsConstructorBit::kMask,
|
__ TestAndBranch(map_bit_field, Map::Bits1::IsConstructorBit::kMask, kNotZero,
|
||||||
Condition::kNotZero, &done, Label::kNear);
|
&done, Label::kNear);
|
||||||
|
|
||||||
CallRuntime(Runtime::kThrowNotSuperConstructor, reg, __ FunctionOperand());
|
CallRuntime(Runtime::kThrowNotSuperConstructor, reg, __ FunctionOperand());
|
||||||
|
|
||||||
|
@ -44,32 +44,6 @@ class BaselineAssembler::ScratchRegisterScope {
|
|||||||
int registers_used_;
|
int registers_used_;
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO(v8:11461): Unify condition names in the MacroAssembler.
|
|
||||||
enum class Condition : uint32_t {
|
|
||||||
kEqual = equal,
|
|
||||||
kNotEqual = not_equal,
|
|
||||||
|
|
||||||
kLessThan = less,
|
|
||||||
kGreaterThan = greater,
|
|
||||||
kLessThanEqual = less_equal,
|
|
||||||
kGreaterThanEqual = greater_equal,
|
|
||||||
|
|
||||||
kUnsignedLessThan = below,
|
|
||||||
kUnsignedGreaterThan = above,
|
|
||||||
kUnsignedLessThanEqual = below_equal,
|
|
||||||
kUnsignedGreaterThanEqual = above_equal,
|
|
||||||
|
|
||||||
kOverflow = overflow,
|
|
||||||
kNoOverflow = no_overflow,
|
|
||||||
|
|
||||||
kZero = zero,
|
|
||||||
kNotZero = not_zero,
|
|
||||||
};
|
|
||||||
|
|
||||||
inline internal::Condition AsMasmCondition(Condition cond) {
|
|
||||||
return static_cast<internal::Condition>(cond);
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace detail {
|
namespace detail {
|
||||||
|
|
||||||
#define __ masm_->
|
#define __ masm_->
|
||||||
@ -124,7 +98,7 @@ void BaselineAssembler::JumpIfImmediate(Condition cc, Register left, int right,
|
|||||||
Label* target,
|
Label* target,
|
||||||
Label::Distance distance) {
|
Label::Distance distance) {
|
||||||
__ cmp(left, Immediate(right));
|
__ cmp(left, Immediate(right));
|
||||||
__ j(AsMasmCondition(cc), target, distance);
|
__ j(cc, target, distance);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaselineAssembler::JumpIfNotSmi(Register value, Label* target,
|
void BaselineAssembler::JumpIfNotSmi(Register value, Label* target,
|
||||||
@ -139,13 +113,13 @@ void BaselineAssembler::TestAndBranch(Register value, int mask, Condition cc,
|
|||||||
} else {
|
} else {
|
||||||
__ test(value, Immediate(mask));
|
__ test(value, Immediate(mask));
|
||||||
}
|
}
|
||||||
__ j(AsMasmCondition(cc), target, distance);
|
__ j(cc, target, distance);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaselineAssembler::JumpIf(Condition cc, Register lhs, const Operand& rhs,
|
void BaselineAssembler::JumpIf(Condition cc, Register lhs, const Operand& rhs,
|
||||||
Label* target, Label::Distance distance) {
|
Label* target, Label::Distance distance) {
|
||||||
__ cmp(lhs, rhs);
|
__ cmp(lhs, rhs);
|
||||||
__ j(AsMasmCondition(cc), target, distance);
|
__ j(cc, target, distance);
|
||||||
}
|
}
|
||||||
void BaselineAssembler::JumpIfObjectType(Condition cc, Register object,
|
void BaselineAssembler::JumpIfObjectType(Condition cc, Register object,
|
||||||
InstanceType instance_type,
|
InstanceType instance_type,
|
||||||
@ -153,7 +127,7 @@ void BaselineAssembler::JumpIfObjectType(Condition cc, Register object,
|
|||||||
Label::Distance distance) {
|
Label::Distance distance) {
|
||||||
__ AssertNotSmi(object);
|
__ AssertNotSmi(object);
|
||||||
__ CmpObjectType(object, instance_type, map);
|
__ CmpObjectType(object, instance_type, map);
|
||||||
__ j(AsMasmCondition(cc), target, distance);
|
__ j(cc, target, distance);
|
||||||
}
|
}
|
||||||
void BaselineAssembler::JumpIfInstanceType(Condition cc, Register map,
|
void BaselineAssembler::JumpIfInstanceType(Condition cc, Register map,
|
||||||
InstanceType instance_type,
|
InstanceType instance_type,
|
||||||
@ -167,7 +141,7 @@ void BaselineAssembler::JumpIfInstanceType(Condition cc, Register map,
|
|||||||
__ movd(eax, xmm0);
|
__ movd(eax, xmm0);
|
||||||
}
|
}
|
||||||
__ CmpInstanceType(map, instance_type);
|
__ CmpInstanceType(map, instance_type);
|
||||||
__ j(AsMasmCondition(cc), target, distance);
|
__ j(cc, target, distance);
|
||||||
}
|
}
|
||||||
void BaselineAssembler::JumpIfPointer(Condition cc, Register value,
|
void BaselineAssembler::JumpIfPointer(Condition cc, Register value,
|
||||||
MemOperand operand, Label* target,
|
MemOperand operand, Label* target,
|
||||||
@ -181,31 +155,31 @@ void BaselineAssembler::JumpIfSmi(Condition cc, Register value, Smi smi,
|
|||||||
} else {
|
} else {
|
||||||
__ cmp(value, Immediate(smi));
|
__ cmp(value, Immediate(smi));
|
||||||
}
|
}
|
||||||
__ j(AsMasmCondition(cc), target, distance);
|
__ j(cc, target, distance);
|
||||||
}
|
}
|
||||||
void BaselineAssembler::JumpIfSmi(Condition cc, Register lhs, Register rhs,
|
void BaselineAssembler::JumpIfSmi(Condition cc, Register lhs, Register rhs,
|
||||||
Label* target, Label::Distance distance) {
|
Label* target, Label::Distance distance) {
|
||||||
__ AssertSmi(lhs);
|
__ AssertSmi(lhs);
|
||||||
__ AssertSmi(rhs);
|
__ AssertSmi(rhs);
|
||||||
__ cmp(lhs, rhs);
|
__ cmp(lhs, rhs);
|
||||||
__ j(AsMasmCondition(cc), target, distance);
|
__ j(cc, target, distance);
|
||||||
}
|
}
|
||||||
void BaselineAssembler::JumpIfTagged(Condition cc, Register value,
|
void BaselineAssembler::JumpIfTagged(Condition cc, Register value,
|
||||||
MemOperand operand, Label* target,
|
MemOperand operand, Label* target,
|
||||||
Label::Distance distance) {
|
Label::Distance distance) {
|
||||||
__ cmp(operand, value);
|
__ cmp(operand, value);
|
||||||
__ j(AsMasmCondition(cc), target, distance);
|
__ j(cc, target, distance);
|
||||||
}
|
}
|
||||||
void BaselineAssembler::JumpIfTagged(Condition cc, MemOperand operand,
|
void BaselineAssembler::JumpIfTagged(Condition cc, MemOperand operand,
|
||||||
Register value, Label* target,
|
Register value, Label* target,
|
||||||
Label::Distance distance) {
|
Label::Distance distance) {
|
||||||
__ cmp(operand, value);
|
__ cmp(operand, value);
|
||||||
__ j(AsMasmCondition(cc), target, distance);
|
__ j(cc, target, distance);
|
||||||
}
|
}
|
||||||
void BaselineAssembler::JumpIfByte(Condition cc, Register value, int32_t byte,
|
void BaselineAssembler::JumpIfByte(Condition cc, Register value, int32_t byte,
|
||||||
Label* target, Label::Distance distance) {
|
Label* target, Label::Distance distance) {
|
||||||
__ cmpb(value, Immediate(byte));
|
__ cmpb(value, Immediate(byte));
|
||||||
__ j(AsMasmCondition(cc), target, distance);
|
__ j(cc, target, distance);
|
||||||
}
|
}
|
||||||
void BaselineAssembler::Move(interpreter::Register output, Register source) {
|
void BaselineAssembler::Move(interpreter::Register output, Register source) {
|
||||||
return __ mov(RegisterFrameOperand(output), source);
|
return __ mov(RegisterFrameOperand(output), source);
|
||||||
@ -387,9 +361,7 @@ void BaselineAssembler::TryLoadOptimizedOsrCode(Register scratch_and_result,
|
|||||||
// Is it marked_for_deoptimization? If yes, clear the slot.
|
// Is it marked_for_deoptimization? If yes, clear the slot.
|
||||||
{
|
{
|
||||||
ScratchRegisterScope temps(this);
|
ScratchRegisterScope temps(this);
|
||||||
Register scratch2 = temps.AcquireScratch();
|
__ TestCodeIsMarkedForDeoptimization(scratch_and_result);
|
||||||
DCHECK(!AreAliased(scratch_and_result, scratch2));
|
|
||||||
__ TestCodeTIsMarkedForDeoptimization(scratch_and_result, scratch2);
|
|
||||||
__ j(equal, on_result, distance);
|
__ j(equal, on_result, distance);
|
||||||
__ mov(FieldOperand(feedback_vector,
|
__ mov(FieldOperand(feedback_vector,
|
||||||
FeedbackVector::OffsetOfElementAt(slot.ToInt())),
|
FeedbackVector::OffsetOfElementAt(slot.ToInt())),
|
||||||
|
@ -37,32 +37,6 @@ class BaselineAssembler::ScratchRegisterScope {
|
|||||||
UseScratchRegisterScope wrapped_scope_;
|
UseScratchRegisterScope wrapped_scope_;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class Condition : uint32_t {
|
|
||||||
kEqual = eq,
|
|
||||||
kNotEqual = ne,
|
|
||||||
|
|
||||||
kLessThan = lt,
|
|
||||||
kGreaterThan = gt,
|
|
||||||
kLessThanEqual = le,
|
|
||||||
kGreaterThanEqual = ge,
|
|
||||||
|
|
||||||
kUnsignedLessThan = Uless,
|
|
||||||
kUnsignedGreaterThan = Ugreater,
|
|
||||||
kUnsignedLessThanEqual = Uless_equal,
|
|
||||||
kUnsignedGreaterThanEqual = Ugreater_equal,
|
|
||||||
|
|
||||||
kOverflow = overflow,
|
|
||||||
kNoOverflow = no_overflow,
|
|
||||||
|
|
||||||
kZero = eq,
|
|
||||||
kNotZero = ne,
|
|
||||||
};
|
|
||||||
|
|
||||||
inline internal::Condition AsMasmCondition(Condition cond) {
|
|
||||||
static_assert(sizeof(internal::Condition) == sizeof(Condition));
|
|
||||||
return static_cast<internal::Condition>(cond);
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace detail {
|
namespace detail {
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
@ -123,12 +97,12 @@ void BaselineAssembler::TestAndBranch(Register value, int mask, Condition cc,
|
|||||||
ScratchRegisterScope temps(this);
|
ScratchRegisterScope temps(this);
|
||||||
Register scratch = temps.AcquireScratch();
|
Register scratch = temps.AcquireScratch();
|
||||||
__ And(scratch, value, Operand(mask));
|
__ And(scratch, value, Operand(mask));
|
||||||
__ Branch(target, AsMasmCondition(cc), scratch, Operand(zero_reg));
|
__ Branch(target, cc, scratch, Operand(zero_reg));
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaselineAssembler::JumpIf(Condition cc, Register lhs, const Operand& rhs,
|
void BaselineAssembler::JumpIf(Condition cc, Register lhs, const Operand& rhs,
|
||||||
Label* target, Label::Distance) {
|
Label* target, Label::Distance) {
|
||||||
__ Branch(target, AsMasmCondition(cc), lhs, Operand(rhs));
|
__ Branch(target, cc, lhs, Operand(rhs));
|
||||||
}
|
}
|
||||||
void BaselineAssembler::JumpIfObjectType(Condition cc, Register object,
|
void BaselineAssembler::JumpIfObjectType(Condition cc, Register object,
|
||||||
InstanceType instance_type,
|
InstanceType instance_type,
|
||||||
@ -137,7 +111,7 @@ void BaselineAssembler::JumpIfObjectType(Condition cc, Register object,
|
|||||||
ScratchRegisterScope temps(this);
|
ScratchRegisterScope temps(this);
|
||||||
Register type = temps.AcquireScratch();
|
Register type = temps.AcquireScratch();
|
||||||
__ GetObjectType(object, map, type);
|
__ GetObjectType(object, map, type);
|
||||||
__ Branch(target, AsMasmCondition(cc), type, Operand(instance_type));
|
__ Branch(target, cc, type, Operand(instance_type));
|
||||||
}
|
}
|
||||||
void BaselineAssembler::JumpIfInstanceType(Condition cc, Register map,
|
void BaselineAssembler::JumpIfInstanceType(Condition cc, Register map,
|
||||||
InstanceType instance_type,
|
InstanceType instance_type,
|
||||||
@ -150,7 +124,7 @@ void BaselineAssembler::JumpIfInstanceType(Condition cc, Register map,
|
|||||||
__ Assert(eq, AbortReason::kUnexpectedValue, type, Operand(MAP_TYPE));
|
__ Assert(eq, AbortReason::kUnexpectedValue, type, Operand(MAP_TYPE));
|
||||||
}
|
}
|
||||||
__ Ld_d(type, FieldMemOperand(map, Map::kInstanceTypeOffset));
|
__ Ld_d(type, FieldMemOperand(map, Map::kInstanceTypeOffset));
|
||||||
__ Branch(target, AsMasmCondition(cc), type, Operand(instance_type));
|
__ Branch(target, cc, type, Operand(instance_type));
|
||||||
}
|
}
|
||||||
void BaselineAssembler::JumpIfSmi(Condition cc, Register value, Smi smi,
|
void BaselineAssembler::JumpIfSmi(Condition cc, Register value, Smi smi,
|
||||||
Label* target, Label::Distance) {
|
Label* target, Label::Distance) {
|
||||||
@ -158,13 +132,13 @@ void BaselineAssembler::JumpIfSmi(Condition cc, Register value, Smi smi,
|
|||||||
Register scratch = temps.AcquireScratch();
|
Register scratch = temps.AcquireScratch();
|
||||||
__ li(scratch, Operand(smi));
|
__ li(scratch, Operand(smi));
|
||||||
__ SmiUntag(scratch);
|
__ SmiUntag(scratch);
|
||||||
__ Branch(target, AsMasmCondition(cc), value, Operand(scratch));
|
__ Branch(target, cc, value, Operand(scratch));
|
||||||
}
|
}
|
||||||
void BaselineAssembler::JumpIfSmi(Condition cc, Register lhs, Register rhs,
|
void BaselineAssembler::JumpIfSmi(Condition cc, Register lhs, Register rhs,
|
||||||
Label* target, Label::Distance) {
|
Label* target, Label::Distance) {
|
||||||
__ AssertSmi(lhs);
|
__ AssertSmi(lhs);
|
||||||
__ AssertSmi(rhs);
|
__ AssertSmi(rhs);
|
||||||
__ Branch(target, AsMasmCondition(cc), lhs, Operand(rhs));
|
__ Branch(target, cc, lhs, Operand(rhs));
|
||||||
}
|
}
|
||||||
void BaselineAssembler::JumpIfTagged(Condition cc, Register value,
|
void BaselineAssembler::JumpIfTagged(Condition cc, Register value,
|
||||||
MemOperand operand, Label* target,
|
MemOperand operand, Label* target,
|
||||||
@ -172,7 +146,7 @@ void BaselineAssembler::JumpIfTagged(Condition cc, Register value,
|
|||||||
ScratchRegisterScope temps(this);
|
ScratchRegisterScope temps(this);
|
||||||
Register scratch = temps.AcquireScratch();
|
Register scratch = temps.AcquireScratch();
|
||||||
__ Ld_d(scratch, operand);
|
__ Ld_d(scratch, operand);
|
||||||
__ Branch(target, AsMasmCondition(cc), value, Operand(scratch));
|
__ Branch(target, cc, value, Operand(scratch));
|
||||||
}
|
}
|
||||||
void BaselineAssembler::JumpIfTagged(Condition cc, MemOperand operand,
|
void BaselineAssembler::JumpIfTagged(Condition cc, MemOperand operand,
|
||||||
Register value, Label* target,
|
Register value, Label* target,
|
||||||
@ -180,11 +154,11 @@ void BaselineAssembler::JumpIfTagged(Condition cc, MemOperand operand,
|
|||||||
ScratchRegisterScope temps(this);
|
ScratchRegisterScope temps(this);
|
||||||
Register scratch = temps.AcquireScratch();
|
Register scratch = temps.AcquireScratch();
|
||||||
__ Ld_d(scratch, operand);
|
__ Ld_d(scratch, operand);
|
||||||
__ Branch(target, AsMasmCondition(cc), scratch, Operand(value));
|
__ Branch(target, cc, scratch, Operand(value));
|
||||||
}
|
}
|
||||||
void BaselineAssembler::JumpIfByte(Condition cc, Register value, int32_t byte,
|
void BaselineAssembler::JumpIfByte(Condition cc, Register value, int32_t byte,
|
||||||
Label* target, Label::Distance) {
|
Label* target, Label::Distance) {
|
||||||
__ Branch(target, AsMasmCondition(cc), value, Operand(byte));
|
__ Branch(target, cc, value, Operand(byte));
|
||||||
}
|
}
|
||||||
void BaselineAssembler::Move(interpreter::Register output, Register source) {
|
void BaselineAssembler::Move(interpreter::Register output, Register source) {
|
||||||
Move(RegisterFrameOperand(output), source);
|
Move(RegisterFrameOperand(output), source);
|
||||||
@ -383,8 +357,8 @@ void BaselineAssembler::TryLoadOptimizedOsrCode(Register scratch_and_result,
|
|||||||
{
|
{
|
||||||
ScratchRegisterScope temps(this);
|
ScratchRegisterScope temps(this);
|
||||||
Register scratch = temps.AcquireScratch();
|
Register scratch = temps.AcquireScratch();
|
||||||
__ TestCodeTIsMarkedForDeoptimizationAndJump(scratch_and_result, scratch,
|
__ TestCodeIsMarkedForDeoptimizationAndJump(scratch_and_result, scratch, eq,
|
||||||
eq, on_result);
|
on_result);
|
||||||
__ li(scratch, __ ClearedValue());
|
__ li(scratch, __ ClearedValue());
|
||||||
StoreTaggedFieldNoWriteBarrier(
|
StoreTaggedFieldNoWriteBarrier(
|
||||||
feedback_vector, FeedbackVector::OffsetOfElementAt(slot.ToInt()),
|
feedback_vector, FeedbackVector::OffsetOfElementAt(slot.ToInt()),
|
||||||
@ -504,8 +478,7 @@ void BaselineAssembler::Switch(Register reg, int case_value_base,
|
|||||||
__ Sub_d(reg, reg, Operand(case_value_base));
|
__ Sub_d(reg, reg, Operand(case_value_base));
|
||||||
}
|
}
|
||||||
|
|
||||||
__ Branch(&fallthrough, AsMasmCondition(Condition::kUnsignedGreaterThanEqual),
|
__ Branch(&fallthrough, kUnsignedGreaterThanEqual, reg, Operand(num_labels));
|
||||||
reg, Operand(num_labels));
|
|
||||||
|
|
||||||
__ GenerateSwitchTable(reg, num_labels,
|
__ GenerateSwitchTable(reg, num_labels,
|
||||||
[labels](size_t i) { return labels[i]; });
|
[labels](size_t i) { return labels[i]; });
|
||||||
|
@ -37,32 +37,6 @@ class BaselineAssembler::ScratchRegisterScope {
|
|||||||
UseScratchRegisterScope wrapped_scope_;
|
UseScratchRegisterScope wrapped_scope_;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class Condition : uint32_t {
|
|
||||||
kEqual = eq,
|
|
||||||
kNotEqual = ne,
|
|
||||||
|
|
||||||
kLessThan = lt,
|
|
||||||
kGreaterThan = gt,
|
|
||||||
kLessThanEqual = le,
|
|
||||||
kGreaterThanEqual = ge,
|
|
||||||
|
|
||||||
kUnsignedLessThan = Uless,
|
|
||||||
kUnsignedGreaterThan = Ugreater,
|
|
||||||
kUnsignedLessThanEqual = Uless_equal,
|
|
||||||
kUnsignedGreaterThanEqual = Ugreater_equal,
|
|
||||||
|
|
||||||
kOverflow = overflow,
|
|
||||||
kNoOverflow = no_overflow,
|
|
||||||
|
|
||||||
kZero = eq,
|
|
||||||
kNotZero = ne,
|
|
||||||
};
|
|
||||||
|
|
||||||
inline internal::Condition AsMasmCondition(Condition cond) {
|
|
||||||
static_assert(sizeof(internal::Condition) == sizeof(Condition));
|
|
||||||
return static_cast<internal::Condition>(cond);
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace detail {
|
namespace detail {
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
@ -123,12 +97,12 @@ void BaselineAssembler::TestAndBranch(Register value, int mask, Condition cc,
|
|||||||
ScratchRegisterScope temps(this);
|
ScratchRegisterScope temps(this);
|
||||||
Register scratch = temps.AcquireScratch();
|
Register scratch = temps.AcquireScratch();
|
||||||
__ And(scratch, value, Operand(mask));
|
__ And(scratch, value, Operand(mask));
|
||||||
__ Branch(target, AsMasmCondition(cc), scratch, Operand(zero_reg));
|
__ Branch(target, cc, scratch, Operand(zero_reg));
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaselineAssembler::JumpIf(Condition cc, Register lhs, const Operand& rhs,
|
void BaselineAssembler::JumpIf(Condition cc, Register lhs, const Operand& rhs,
|
||||||
Label* target, Label::Distance) {
|
Label* target, Label::Distance) {
|
||||||
__ Branch(target, AsMasmCondition(cc), lhs, Operand(rhs));
|
__ Branch(target, cc, lhs, Operand(rhs));
|
||||||
}
|
}
|
||||||
void BaselineAssembler::JumpIfObjectType(Condition cc, Register object,
|
void BaselineAssembler::JumpIfObjectType(Condition cc, Register object,
|
||||||
InstanceType instance_type,
|
InstanceType instance_type,
|
||||||
@ -137,7 +111,7 @@ void BaselineAssembler::JumpIfObjectType(Condition cc, Register object,
|
|||||||
ScratchRegisterScope temps(this);
|
ScratchRegisterScope temps(this);
|
||||||
Register type = temps.AcquireScratch();
|
Register type = temps.AcquireScratch();
|
||||||
__ GetObjectType(object, map, type);
|
__ GetObjectType(object, map, type);
|
||||||
__ Branch(target, AsMasmCondition(cc), type, Operand(instance_type));
|
__ Branch(target, cc, type, Operand(instance_type));
|
||||||
}
|
}
|
||||||
void BaselineAssembler::JumpIfInstanceType(Condition cc, Register map,
|
void BaselineAssembler::JumpIfInstanceType(Condition cc, Register map,
|
||||||
InstanceType instance_type,
|
InstanceType instance_type,
|
||||||
@ -150,7 +124,7 @@ void BaselineAssembler::JumpIfInstanceType(Condition cc, Register map,
|
|||||||
__ Assert(eq, AbortReason::kUnexpectedValue, type, Operand(MAP_TYPE));
|
__ Assert(eq, AbortReason::kUnexpectedValue, type, Operand(MAP_TYPE));
|
||||||
}
|
}
|
||||||
__ Ld(type, FieldMemOperand(map, Map::kInstanceTypeOffset));
|
__ Ld(type, FieldMemOperand(map, Map::kInstanceTypeOffset));
|
||||||
__ Branch(target, AsMasmCondition(cc), type, Operand(instance_type));
|
__ Branch(target, cc, type, Operand(instance_type));
|
||||||
}
|
}
|
||||||
void BaselineAssembler::JumpIfPointer(Condition cc, Register value,
|
void BaselineAssembler::JumpIfPointer(Condition cc, Register value,
|
||||||
MemOperand operand, Label* target,
|
MemOperand operand, Label* target,
|
||||||
@ -158,7 +132,7 @@ void BaselineAssembler::JumpIfPointer(Condition cc, Register value,
|
|||||||
ScratchRegisterScope temps(this);
|
ScratchRegisterScope temps(this);
|
||||||
Register scratch = temps.AcquireScratch();
|
Register scratch = temps.AcquireScratch();
|
||||||
__ Ld(scratch, operand);
|
__ Ld(scratch, operand);
|
||||||
__ Branch(target, AsMasmCondition(cc), value, Operand(scratch));
|
__ Branch(target, cc, value, Operand(scratch));
|
||||||
}
|
}
|
||||||
void BaselineAssembler::JumpIfSmi(Condition cc, Register value, Smi smi,
|
void BaselineAssembler::JumpIfSmi(Condition cc, Register value, Smi smi,
|
||||||
Label* target, Label::Distance) {
|
Label* target, Label::Distance) {
|
||||||
@ -166,13 +140,13 @@ void BaselineAssembler::JumpIfSmi(Condition cc, Register value, Smi smi,
|
|||||||
Register scratch = temps.AcquireScratch();
|
Register scratch = temps.AcquireScratch();
|
||||||
__ li(scratch, Operand(smi));
|
__ li(scratch, Operand(smi));
|
||||||
__ SmiUntag(scratch);
|
__ SmiUntag(scratch);
|
||||||
__ Branch(target, AsMasmCondition(cc), value, Operand(scratch));
|
__ Branch(target, cc, value, Operand(scratch));
|
||||||
}
|
}
|
||||||
void BaselineAssembler::JumpIfSmi(Condition cc, Register lhs, Register rhs,
|
void BaselineAssembler::JumpIfSmi(Condition cc, Register lhs, Register rhs,
|
||||||
Label* target, Label::Distance) {
|
Label* target, Label::Distance) {
|
||||||
__ AssertSmi(lhs);
|
__ AssertSmi(lhs);
|
||||||
__ AssertSmi(rhs);
|
__ AssertSmi(rhs);
|
||||||
__ Branch(target, AsMasmCondition(cc), lhs, Operand(rhs));
|
__ Branch(target, cc, lhs, Operand(rhs));
|
||||||
}
|
}
|
||||||
void BaselineAssembler::JumpIfTagged(Condition cc, Register value,
|
void BaselineAssembler::JumpIfTagged(Condition cc, Register value,
|
||||||
MemOperand operand, Label* target,
|
MemOperand operand, Label* target,
|
||||||
@ -180,7 +154,7 @@ void BaselineAssembler::JumpIfTagged(Condition cc, Register value,
|
|||||||
ScratchRegisterScope temps(this);
|
ScratchRegisterScope temps(this);
|
||||||
Register scratch = temps.AcquireScratch();
|
Register scratch = temps.AcquireScratch();
|
||||||
__ Ld(scratch, operand);
|
__ Ld(scratch, operand);
|
||||||
__ Branch(target, AsMasmCondition(cc), value, Operand(scratch));
|
__ Branch(target, cc, value, Operand(scratch));
|
||||||
}
|
}
|
||||||
void BaselineAssembler::JumpIfTagged(Condition cc, MemOperand operand,
|
void BaselineAssembler::JumpIfTagged(Condition cc, MemOperand operand,
|
||||||
Register value, Label* target,
|
Register value, Label* target,
|
||||||
@ -188,11 +162,11 @@ void BaselineAssembler::JumpIfTagged(Condition cc, MemOperand operand,
|
|||||||
ScratchRegisterScope temps(this);
|
ScratchRegisterScope temps(this);
|
||||||
Register scratch = temps.AcquireScratch();
|
Register scratch = temps.AcquireScratch();
|
||||||
__ Ld(scratch, operand);
|
__ Ld(scratch, operand);
|
||||||
__ Branch(target, AsMasmCondition(cc), scratch, Operand(value));
|
__ Branch(target, cc, scratch, Operand(value));
|
||||||
}
|
}
|
||||||
void BaselineAssembler::JumpIfByte(Condition cc, Register value, int32_t byte,
|
void BaselineAssembler::JumpIfByte(Condition cc, Register value, int32_t byte,
|
||||||
Label* target, Label::Distance) {
|
Label* target, Label::Distance) {
|
||||||
__ Branch(target, AsMasmCondition(cc), value, Operand(byte));
|
__ Branch(target, cc, value, Operand(byte));
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaselineAssembler::Move(interpreter::Register output, Register source) {
|
void BaselineAssembler::Move(interpreter::Register output, Register source) {
|
||||||
@ -393,8 +367,8 @@ void BaselineAssembler::TryLoadOptimizedOsrCode(Register scratch_and_result,
|
|||||||
{
|
{
|
||||||
ScratchRegisterScope temps(this);
|
ScratchRegisterScope temps(this);
|
||||||
Register scratch = temps.AcquireScratch();
|
Register scratch = temps.AcquireScratch();
|
||||||
__ TestCodeTIsMarkedForDeoptimizationAndJump(scratch_and_result, scratch,
|
__ TestCodeIsMarkedForDeoptimizationAndJump(scratch_and_result, scratch, eq,
|
||||||
eq, on_result);
|
on_result);
|
||||||
__ li(scratch, __ ClearedValue());
|
__ li(scratch, __ ClearedValue());
|
||||||
StoreTaggedFieldNoWriteBarrier(
|
StoreTaggedFieldNoWriteBarrier(
|
||||||
feedback_vector, FeedbackVector::OffsetOfElementAt(slot.ToInt()),
|
feedback_vector, FeedbackVector::OffsetOfElementAt(slot.ToInt()),
|
||||||
@ -514,8 +488,7 @@ void BaselineAssembler::Switch(Register reg, int case_value_base,
|
|||||||
__ Dsubu(reg, reg, Operand(case_value_base));
|
__ Dsubu(reg, reg, Operand(case_value_base));
|
||||||
}
|
}
|
||||||
|
|
||||||
__ Branch(&fallthrough, AsMasmCondition(Condition::kUnsignedGreaterThanEqual),
|
__ Branch(&fallthrough, kUnsignedGreaterThanEqual, reg, Operand(num_labels));
|
||||||
reg, Operand(num_labels));
|
|
||||||
|
|
||||||
__ GenerateSwitchTable(reg, num_labels,
|
__ GenerateSwitchTable(reg, num_labels,
|
||||||
[labels](size_t i) { return labels[i]; });
|
[labels](size_t i) { return labels[i]; });
|
||||||
|
@ -49,85 +49,24 @@ class BaselineAssembler::ScratchRegisterScope {
|
|||||||
int registers_used_;
|
int registers_used_;
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO(v8:11429,leszeks): Unify condition names in the MacroAssembler.
|
|
||||||
enum class Condition : uint32_t {
|
|
||||||
kEqual,
|
|
||||||
kNotEqual,
|
|
||||||
|
|
||||||
kLessThan,
|
|
||||||
kGreaterThan,
|
|
||||||
kLessThanEqual,
|
|
||||||
kGreaterThanEqual,
|
|
||||||
|
|
||||||
kUnsignedLessThan,
|
|
||||||
kUnsignedGreaterThan,
|
|
||||||
kUnsignedLessThanEqual,
|
|
||||||
kUnsignedGreaterThanEqual,
|
|
||||||
|
|
||||||
kOverflow,
|
|
||||||
kNoOverflow,
|
|
||||||
|
|
||||||
kZero,
|
|
||||||
kNotZero
|
|
||||||
};
|
|
||||||
|
|
||||||
inline internal::Condition AsMasmCondition(Condition cond) {
|
|
||||||
static_assert(sizeof(internal::Condition) == sizeof(Condition));
|
|
||||||
switch (cond) {
|
|
||||||
case Condition::kEqual:
|
|
||||||
return eq;
|
|
||||||
case Condition::kNotEqual:
|
|
||||||
return ne;
|
|
||||||
case Condition::kLessThan:
|
|
||||||
return lt;
|
|
||||||
case Condition::kGreaterThan:
|
|
||||||
return gt;
|
|
||||||
case Condition::kLessThanEqual:
|
|
||||||
return le;
|
|
||||||
case Condition::kGreaterThanEqual:
|
|
||||||
return ge;
|
|
||||||
|
|
||||||
case Condition::kUnsignedLessThan:
|
|
||||||
return lt;
|
|
||||||
case Condition::kUnsignedGreaterThan:
|
|
||||||
return gt;
|
|
||||||
case Condition::kUnsignedLessThanEqual:
|
|
||||||
return le;
|
|
||||||
case Condition::kUnsignedGreaterThanEqual:
|
|
||||||
return ge;
|
|
||||||
|
|
||||||
case Condition::kOverflow:
|
|
||||||
return overflow;
|
|
||||||
case Condition::kNoOverflow:
|
|
||||||
return nooverflow;
|
|
||||||
|
|
||||||
case Condition::kZero:
|
|
||||||
return eq;
|
|
||||||
case Condition::kNotZero:
|
|
||||||
return ne;
|
|
||||||
default:
|
|
||||||
UNREACHABLE();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool IsSignedCondition(Condition cond) {
|
inline bool IsSignedCondition(Condition cond) {
|
||||||
switch (cond) {
|
switch (cond) {
|
||||||
case Condition::kEqual:
|
case kEqual:
|
||||||
case Condition::kNotEqual:
|
case kNotEqual:
|
||||||
case Condition::kLessThan:
|
case kLessThan:
|
||||||
case Condition::kGreaterThan:
|
case kGreaterThan:
|
||||||
case Condition::kLessThanEqual:
|
case kLessThanEqual:
|
||||||
case Condition::kGreaterThanEqual:
|
case kGreaterThanEqual:
|
||||||
case Condition::kOverflow:
|
case kOverflow:
|
||||||
case Condition::kNoOverflow:
|
case kNoOverflow:
|
||||||
case Condition::kZero:
|
case kZero:
|
||||||
case Condition::kNotZero:
|
case kNotZero:
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
case Condition::kUnsignedLessThan:
|
case kUnsignedLessThan:
|
||||||
case Condition::kUnsignedGreaterThan:
|
case kUnsignedGreaterThan:
|
||||||
case Condition::kUnsignedLessThanEqual:
|
case kUnsignedLessThanEqual:
|
||||||
case Condition::kUnsignedGreaterThanEqual:
|
case kUnsignedGreaterThanEqual:
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -155,7 +94,7 @@ static void JumpIfHelper(MacroAssembler* assm, Condition cc, Register lhs,
|
|||||||
__ CmpU32(lhs, rhs);
|
__ CmpU32(lhs, rhs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
__ b(AsMasmCondition(cc), target);
|
__ b(check_condition(cc), target);
|
||||||
}
|
}
|
||||||
#undef __
|
#undef __
|
||||||
|
|
||||||
@ -221,7 +160,7 @@ void BaselineAssembler::TestAndBranch(Register value, int mask, Condition cc,
|
|||||||
Label* target, Label::Distance) {
|
Label* target, Label::Distance) {
|
||||||
ASM_CODE_COMMENT(masm_);
|
ASM_CODE_COMMENT(masm_);
|
||||||
__ AndU64(r0, value, Operand(mask), ip, SetRC);
|
__ AndU64(r0, value, Operand(mask), ip, SetRC);
|
||||||
__ b(AsMasmCondition(cc), target, cr0);
|
__ b(check_condition(cc), target, cr0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaselineAssembler::JumpIf(Condition cc, Register lhs, const Operand& rhs,
|
void BaselineAssembler::JumpIf(Condition cc, Register lhs, const Operand& rhs,
|
||||||
@ -232,7 +171,7 @@ void BaselineAssembler::JumpIf(Condition cc, Register lhs, const Operand& rhs,
|
|||||||
} else {
|
} else {
|
||||||
__ CmpU64(lhs, rhs, r0);
|
__ CmpU64(lhs, rhs, r0);
|
||||||
}
|
}
|
||||||
__ b(AsMasmCondition(cc), target);
|
__ b(check_condition(cc), target);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaselineAssembler::JumpIfObjectType(Condition cc, Register object,
|
void BaselineAssembler::JumpIfObjectType(Condition cc, Register object,
|
||||||
@ -537,7 +476,7 @@ void BaselineAssembler::TryLoadOptimizedOsrCode(Register scratch_and_result,
|
|||||||
{
|
{
|
||||||
ScratchRegisterScope temps(this);
|
ScratchRegisterScope temps(this);
|
||||||
Register scratch = temps.AcquireScratch();
|
Register scratch = temps.AcquireScratch();
|
||||||
__ TestCodeTIsMarkedForDeoptimization(scratch_and_result, scratch, r0);
|
__ TestCodeIsMarkedForDeoptimization(scratch_and_result, scratch, r0);
|
||||||
__ beq(on_result, cr0);
|
__ beq(on_result, cr0);
|
||||||
__ mov(scratch, __ ClearedValue());
|
__ mov(scratch, __ ClearedValue());
|
||||||
StoreTaggedFieldNoWriteBarrier(
|
StoreTaggedFieldNoWriteBarrier(
|
||||||
@ -674,8 +613,7 @@ void BaselineAssembler::Switch(Register reg, int case_value_base,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Mostly copied from code-generator-arm.cc
|
// Mostly copied from code-generator-arm.cc
|
||||||
JumpIf(Condition::kUnsignedGreaterThanEqual, reg, Operand(num_labels),
|
JumpIf(kUnsignedGreaterThanEqual, reg, Operand(num_labels), &fallthrough);
|
||||||
&fallthrough);
|
|
||||||
// Ensure to emit the constant pool first if necessary.
|
// Ensure to emit the constant pool first if necessary.
|
||||||
int entry_size_log2 = 3;
|
int entry_size_log2 = 3;
|
||||||
__ ShiftLeftU32(reg, reg, Operand(entry_size_log2));
|
__ ShiftLeftU32(reg, reg, Operand(entry_size_log2));
|
||||||
@ -737,8 +675,8 @@ void BaselineAssembler::EmitReturn(MacroAssembler* masm) {
|
|||||||
// If actual is bigger than formal, then we should use it to free up the stack
|
// If actual is bigger than formal, then we should use it to free up the stack
|
||||||
// arguments.
|
// arguments.
|
||||||
Label corrected_args_count;
|
Label corrected_args_count;
|
||||||
JumpIfHelper(__ masm(), Condition::kGreaterThanEqual, params_size,
|
JumpIfHelper(__ masm(), kGreaterThanEqual, params_size, actual_params_size,
|
||||||
actual_params_size, &corrected_args_count);
|
&corrected_args_count);
|
||||||
__ masm()->mr(params_size, actual_params_size);
|
__ masm()->mr(params_size, actual_params_size);
|
||||||
__ Bind(&corrected_args_count);
|
__ Bind(&corrected_args_count);
|
||||||
|
|
||||||
|
@ -36,31 +36,6 @@ class BaselineAssembler::ScratchRegisterScope {
|
|||||||
UseScratchRegisterScope wrapped_scope_;
|
UseScratchRegisterScope wrapped_scope_;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class Condition : uint32_t {
|
|
||||||
kEqual = eq,
|
|
||||||
kNotEqual = ne,
|
|
||||||
|
|
||||||
kLessThan = lt,
|
|
||||||
kGreaterThan = gt,
|
|
||||||
kLessThanEqual = le,
|
|
||||||
kGreaterThanEqual = ge,
|
|
||||||
|
|
||||||
kUnsignedLessThan = Uless,
|
|
||||||
kUnsignedGreaterThan = Ugreater,
|
|
||||||
kUnsignedLessThanEqual = Uless_equal,
|
|
||||||
kUnsignedGreaterThanEqual = Ugreater_equal,
|
|
||||||
|
|
||||||
kOverflow = overflow,
|
|
||||||
kNoOverflow = no_overflow,
|
|
||||||
|
|
||||||
kZero = eq,
|
|
||||||
kNotZero = ne,
|
|
||||||
};
|
|
||||||
|
|
||||||
inline internal::Condition AsMasmCondition(Condition cond) {
|
|
||||||
return static_cast<internal::Condition>(cond);
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace detail {
|
namespace detail {
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
@ -121,12 +96,12 @@ void BaselineAssembler::TestAndBranch(Register value, int mask, Condition cc,
|
|||||||
ScratchRegisterScope temps(this);
|
ScratchRegisterScope temps(this);
|
||||||
Register tmp = temps.AcquireScratch();
|
Register tmp = temps.AcquireScratch();
|
||||||
__ And(tmp, value, Operand(mask));
|
__ And(tmp, value, Operand(mask));
|
||||||
__ Branch(target, AsMasmCondition(cc), tmp, Operand(zero_reg));
|
__ Branch(target, cc, tmp, Operand(zero_reg));
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaselineAssembler::JumpIf(Condition cc, Register lhs, const Operand& rhs,
|
void BaselineAssembler::JumpIf(Condition cc, Register lhs, const Operand& rhs,
|
||||||
Label* target, Label::Distance) {
|
Label* target, Label::Distance) {
|
||||||
__ Branch(target, AsMasmCondition(cc), lhs, Operand(rhs));
|
__ Branch(target, cc, lhs, Operand(rhs));
|
||||||
}
|
}
|
||||||
void BaselineAssembler::JumpIfObjectType(Condition cc, Register object,
|
void BaselineAssembler::JumpIfObjectType(Condition cc, Register object,
|
||||||
InstanceType instance_type,
|
InstanceType instance_type,
|
||||||
@ -135,7 +110,7 @@ void BaselineAssembler::JumpIfObjectType(Condition cc, Register object,
|
|||||||
ScratchRegisterScope temps(this);
|
ScratchRegisterScope temps(this);
|
||||||
Register type = temps.AcquireScratch();
|
Register type = temps.AcquireScratch();
|
||||||
__ GetObjectType(object, map, type);
|
__ GetObjectType(object, map, type);
|
||||||
__ Branch(target, AsMasmCondition(cc), type, Operand(instance_type));
|
__ Branch(target, cc, type, Operand(instance_type));
|
||||||
}
|
}
|
||||||
void BaselineAssembler::JumpIfInstanceType(Condition cc, Register map,
|
void BaselineAssembler::JumpIfInstanceType(Condition cc, Register map,
|
||||||
InstanceType instance_type,
|
InstanceType instance_type,
|
||||||
@ -148,7 +123,7 @@ void BaselineAssembler::JumpIfInstanceType(Condition cc, Register map,
|
|||||||
__ Assert(eq, AbortReason::kUnexpectedValue, type, Operand(MAP_TYPE));
|
__ Assert(eq, AbortReason::kUnexpectedValue, type, Operand(MAP_TYPE));
|
||||||
}
|
}
|
||||||
__ LoadWord(type, FieldMemOperand(map, Map::kInstanceTypeOffset));
|
__ LoadWord(type, FieldMemOperand(map, Map::kInstanceTypeOffset));
|
||||||
__ Branch(target, AsMasmCondition(cc), type, Operand(instance_type));
|
__ Branch(target, cc, type, Operand(instance_type));
|
||||||
}
|
}
|
||||||
void BaselineAssembler::JumpIfPointer(Condition cc, Register value,
|
void BaselineAssembler::JumpIfPointer(Condition cc, Register value,
|
||||||
MemOperand operand, Label* target,
|
MemOperand operand, Label* target,
|
||||||
@ -156,7 +131,7 @@ void BaselineAssembler::JumpIfPointer(Condition cc, Register value,
|
|||||||
ScratchRegisterScope temps(this);
|
ScratchRegisterScope temps(this);
|
||||||
Register temp = temps.AcquireScratch();
|
Register temp = temps.AcquireScratch();
|
||||||
__ LoadWord(temp, operand);
|
__ LoadWord(temp, operand);
|
||||||
__ Branch(target, AsMasmCondition(cc), value, Operand(temp));
|
__ Branch(target, cc, value, Operand(temp));
|
||||||
}
|
}
|
||||||
void BaselineAssembler::JumpIfSmi(Condition cc, Register value, Smi smi,
|
void BaselineAssembler::JumpIfSmi(Condition cc, Register value, Smi smi,
|
||||||
Label* target, Label::Distance) {
|
Label* target, Label::Distance) {
|
||||||
@ -164,14 +139,14 @@ void BaselineAssembler::JumpIfSmi(Condition cc, Register value, Smi smi,
|
|||||||
Register temp = temps.AcquireScratch();
|
Register temp = temps.AcquireScratch();
|
||||||
__ li(temp, Operand(smi));
|
__ li(temp, Operand(smi));
|
||||||
__ SmiUntag(temp);
|
__ SmiUntag(temp);
|
||||||
__ Branch(target, AsMasmCondition(cc), value, Operand(temp));
|
__ Branch(target, cc, value, Operand(temp));
|
||||||
}
|
}
|
||||||
void BaselineAssembler::JumpIfSmi(Condition cc, Register lhs, Register rhs,
|
void BaselineAssembler::JumpIfSmi(Condition cc, Register lhs, Register rhs,
|
||||||
Label* target, Label::Distance) {
|
Label* target, Label::Distance) {
|
||||||
// todo: compress pointer
|
// todo: compress pointer
|
||||||
__ AssertSmi(lhs);
|
__ AssertSmi(lhs);
|
||||||
__ AssertSmi(rhs);
|
__ AssertSmi(rhs);
|
||||||
__ Branch(target, AsMasmCondition(cc), lhs, Operand(rhs));
|
__ Branch(target, cc, lhs, Operand(rhs));
|
||||||
}
|
}
|
||||||
void BaselineAssembler::JumpIfTagged(Condition cc, Register value,
|
void BaselineAssembler::JumpIfTagged(Condition cc, Register value,
|
||||||
MemOperand operand, Label* target,
|
MemOperand operand, Label* target,
|
||||||
@ -180,7 +155,7 @@ void BaselineAssembler::JumpIfTagged(Condition cc, Register value,
|
|||||||
ScratchRegisterScope temps(this);
|
ScratchRegisterScope temps(this);
|
||||||
Register scratch = temps.AcquireScratch();
|
Register scratch = temps.AcquireScratch();
|
||||||
__ LoadWord(scratch, operand);
|
__ LoadWord(scratch, operand);
|
||||||
__ Branch(target, AsMasmCondition(cc), value, Operand(scratch));
|
__ Branch(target, cc, value, Operand(scratch));
|
||||||
}
|
}
|
||||||
void BaselineAssembler::JumpIfTagged(Condition cc, MemOperand operand,
|
void BaselineAssembler::JumpIfTagged(Condition cc, MemOperand operand,
|
||||||
Register value, Label* target,
|
Register value, Label* target,
|
||||||
@ -189,11 +164,11 @@ void BaselineAssembler::JumpIfTagged(Condition cc, MemOperand operand,
|
|||||||
ScratchRegisterScope temps(this);
|
ScratchRegisterScope temps(this);
|
||||||
Register scratch = temps.AcquireScratch();
|
Register scratch = temps.AcquireScratch();
|
||||||
__ LoadWord(scratch, operand);
|
__ LoadWord(scratch, operand);
|
||||||
__ Branch(target, AsMasmCondition(cc), scratch, Operand(value));
|
__ Branch(target, cc, scratch, Operand(value));
|
||||||
}
|
}
|
||||||
void BaselineAssembler::JumpIfByte(Condition cc, Register value, int32_t byte,
|
void BaselineAssembler::JumpIfByte(Condition cc, Register value, int32_t byte,
|
||||||
Label* target, Label::Distance) {
|
Label* target, Label::Distance) {
|
||||||
__ Branch(target, AsMasmCondition(cc), value, Operand(byte));
|
__ Branch(target, cc, value, Operand(byte));
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaselineAssembler::Move(interpreter::Register output, Register source) {
|
void BaselineAssembler::Move(interpreter::Register output, Register source) {
|
||||||
@ -383,8 +358,8 @@ void BaselineAssembler::TryLoadOptimizedOsrCode(Register scratch_and_result,
|
|||||||
// Is it marked_for_deoptimization? If yes, clear the slot.
|
// Is it marked_for_deoptimization? If yes, clear the slot.
|
||||||
{
|
{
|
||||||
ScratchRegisterScope temps(this);
|
ScratchRegisterScope temps(this);
|
||||||
__ JumpIfCodeTIsMarkedForDeoptimization(
|
__ JumpIfCodeIsMarkedForDeoptimization(scratch_and_result,
|
||||||
scratch_and_result, temps.AcquireScratch(), &clear_slot);
|
temps.AcquireScratch(), &clear_slot);
|
||||||
Jump(on_result);
|
Jump(on_result);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -519,8 +494,7 @@ void BaselineAssembler::Switch(Register reg, int case_value_base,
|
|||||||
// Mostly copied from code-generator-riscv64.cc
|
// Mostly copied from code-generator-riscv64.cc
|
||||||
ScratchRegisterScope scope(this);
|
ScratchRegisterScope scope(this);
|
||||||
Label table;
|
Label table;
|
||||||
__ Branch(&fallthrough, AsMasmCondition(Condition::kUnsignedGreaterThanEqual),
|
__ Branch(&fallthrough, kUnsignedGreaterThanEqual, reg, Operand(num_labels));
|
||||||
reg, Operand(num_labels));
|
|
||||||
int64_t imm64;
|
int64_t imm64;
|
||||||
imm64 = __ branch_long_offset(&table);
|
imm64 = __ branch_long_offset(&table);
|
||||||
CHECK(is_int32(imm64 + 0x800));
|
CHECK(is_int32(imm64 + 0x800));
|
||||||
|
@ -48,85 +48,24 @@ class BaselineAssembler::ScratchRegisterScope {
|
|||||||
int registers_used_;
|
int registers_used_;
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO(v8:11429,leszeks): Unify condition names in the MacroAssembler.
|
|
||||||
enum class Condition : uint32_t {
|
|
||||||
kEqual,
|
|
||||||
kNotEqual,
|
|
||||||
|
|
||||||
kLessThan,
|
|
||||||
kGreaterThan,
|
|
||||||
kLessThanEqual,
|
|
||||||
kGreaterThanEqual,
|
|
||||||
|
|
||||||
kUnsignedLessThan,
|
|
||||||
kUnsignedGreaterThan,
|
|
||||||
kUnsignedLessThanEqual,
|
|
||||||
kUnsignedGreaterThanEqual,
|
|
||||||
|
|
||||||
kOverflow,
|
|
||||||
kNoOverflow,
|
|
||||||
|
|
||||||
kZero,
|
|
||||||
kNotZero
|
|
||||||
};
|
|
||||||
|
|
||||||
inline internal::Condition AsMasmCondition(Condition cond) {
|
|
||||||
static_assert(sizeof(internal::Condition) == sizeof(Condition));
|
|
||||||
switch (cond) {
|
|
||||||
case Condition::kEqual:
|
|
||||||
return eq;
|
|
||||||
case Condition::kNotEqual:
|
|
||||||
return ne;
|
|
||||||
case Condition::kLessThan:
|
|
||||||
return lt;
|
|
||||||
case Condition::kGreaterThan:
|
|
||||||
return gt;
|
|
||||||
case Condition::kLessThanEqual:
|
|
||||||
return le;
|
|
||||||
case Condition::kGreaterThanEqual:
|
|
||||||
return ge;
|
|
||||||
|
|
||||||
case Condition::kUnsignedLessThan:
|
|
||||||
return lt;
|
|
||||||
case Condition::kUnsignedGreaterThan:
|
|
||||||
return gt;
|
|
||||||
case Condition::kUnsignedLessThanEqual:
|
|
||||||
return le;
|
|
||||||
case Condition::kUnsignedGreaterThanEqual:
|
|
||||||
return ge;
|
|
||||||
|
|
||||||
case Condition::kOverflow:
|
|
||||||
return overflow;
|
|
||||||
case Condition::kNoOverflow:
|
|
||||||
return nooverflow;
|
|
||||||
|
|
||||||
case Condition::kZero:
|
|
||||||
return eq;
|
|
||||||
case Condition::kNotZero:
|
|
||||||
return ne;
|
|
||||||
default:
|
|
||||||
UNREACHABLE();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool IsSignedCondition(Condition cond) {
|
inline bool IsSignedCondition(Condition cond) {
|
||||||
switch (cond) {
|
switch (cond) {
|
||||||
case Condition::kEqual:
|
case kEqual:
|
||||||
case Condition::kNotEqual:
|
case kNotEqual:
|
||||||
case Condition::kLessThan:
|
case kLessThan:
|
||||||
case Condition::kGreaterThan:
|
case kGreaterThan:
|
||||||
case Condition::kLessThanEqual:
|
case kLessThanEqual:
|
||||||
case Condition::kGreaterThanEqual:
|
case kGreaterThanEqual:
|
||||||
case Condition::kOverflow:
|
case kOverflow:
|
||||||
case Condition::kNoOverflow:
|
case kNoOverflow:
|
||||||
case Condition::kZero:
|
case kZero:
|
||||||
case Condition::kNotZero:
|
case kNotZero:
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
case Condition::kUnsignedLessThan:
|
case kUnsignedLessThan:
|
||||||
case Condition::kUnsignedGreaterThan:
|
case kUnsignedGreaterThan:
|
||||||
case Condition::kUnsignedLessThanEqual:
|
case kUnsignedLessThanEqual:
|
||||||
case Condition::kUnsignedGreaterThanEqual:
|
case kUnsignedGreaterThanEqual:
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -154,7 +93,7 @@ static void JumpIfHelper(MacroAssembler* assm, Condition cc, Register lhs,
|
|||||||
__ CmpU32(lhs, rhs);
|
__ CmpU32(lhs, rhs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
__ b(AsMasmCondition(cc), target);
|
__ b(check_condition(cc), target);
|
||||||
}
|
}
|
||||||
|
|
||||||
#undef __
|
#undef __
|
||||||
@ -220,7 +159,7 @@ void BaselineAssembler::TestAndBranch(Register value, int mask, Condition cc,
|
|||||||
Label* target, Label::Distance) {
|
Label* target, Label::Distance) {
|
||||||
ASM_CODE_COMMENT(masm_);
|
ASM_CODE_COMMENT(masm_);
|
||||||
__ AndP(r0, value, Operand(mask));
|
__ AndP(r0, value, Operand(mask));
|
||||||
__ b(AsMasmCondition(cc), target);
|
__ b(check_condition(cc), target);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaselineAssembler::JumpIf(Condition cc, Register lhs, const Operand& rhs,
|
void BaselineAssembler::JumpIf(Condition cc, Register lhs, const Operand& rhs,
|
||||||
@ -231,7 +170,7 @@ void BaselineAssembler::JumpIf(Condition cc, Register lhs, const Operand& rhs,
|
|||||||
} else {
|
} else {
|
||||||
__ CmpU64(lhs, rhs);
|
__ CmpU64(lhs, rhs);
|
||||||
}
|
}
|
||||||
__ b(AsMasmCondition(cc), target);
|
__ b(check_condition(cc), target);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaselineAssembler::JumpIfObjectType(Condition cc, Register object,
|
void BaselineAssembler::JumpIfObjectType(Condition cc, Register object,
|
||||||
@ -550,7 +489,7 @@ void BaselineAssembler::TryLoadOptimizedOsrCode(Register scratch_and_result,
|
|||||||
{
|
{
|
||||||
ScratchRegisterScope temps(this);
|
ScratchRegisterScope temps(this);
|
||||||
Register scratch = temps.AcquireScratch();
|
Register scratch = temps.AcquireScratch();
|
||||||
__ TestCodeTIsMarkedForDeoptimization(scratch_and_result, scratch);
|
__ TestCodeIsMarkedForDeoptimization(scratch_and_result, scratch);
|
||||||
__ beq(on_result);
|
__ beq(on_result);
|
||||||
__ mov(scratch, __ ClearedValue());
|
__ mov(scratch, __ ClearedValue());
|
||||||
StoreTaggedFieldNoWriteBarrier(
|
StoreTaggedFieldNoWriteBarrier(
|
||||||
@ -687,8 +626,7 @@ void BaselineAssembler::Switch(Register reg, int case_value_base,
|
|||||||
|
|
||||||
// Mostly copied from code-generator-arm.cc
|
// Mostly copied from code-generator-arm.cc
|
||||||
ScratchRegisterScope scope(this);
|
ScratchRegisterScope scope(this);
|
||||||
JumpIf(Condition::kUnsignedGreaterThanEqual, reg, Operand(num_labels),
|
JumpIf(kUnsignedGreaterThanEqual, reg, Operand(num_labels), &fallthrough);
|
||||||
&fallthrough);
|
|
||||||
// Ensure to emit the constant pool first if necessary.
|
// Ensure to emit the constant pool first if necessary.
|
||||||
int entry_size_log2 = 3;
|
int entry_size_log2 = 3;
|
||||||
__ ShiftLeftU32(reg, reg, Operand(entry_size_log2));
|
__ ShiftLeftU32(reg, reg, Operand(entry_size_log2));
|
||||||
@ -745,8 +683,8 @@ void BaselineAssembler::EmitReturn(MacroAssembler* masm) {
|
|||||||
// If actual is bigger than formal, then we should use it to free up the stack
|
// If actual is bigger than formal, then we should use it to free up the stack
|
||||||
// arguments.
|
// arguments.
|
||||||
Label corrected_args_count;
|
Label corrected_args_count;
|
||||||
JumpIfHelper(__ masm(), Condition::kGreaterThanEqual, params_size,
|
JumpIfHelper(__ masm(), kGreaterThanEqual, params_size, actual_params_size,
|
||||||
actual_params_size, &corrected_args_count);
|
&corrected_args_count);
|
||||||
__ masm()->mov(params_size, actual_params_size);
|
__ masm()->mov(params_size, actual_params_size);
|
||||||
__ Bind(&corrected_args_count);
|
__ Bind(&corrected_args_count);
|
||||||
|
|
||||||
|
@ -46,32 +46,6 @@ class BaselineAssembler::ScratchRegisterScope {
|
|||||||
int registers_used_;
|
int registers_used_;
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO(v8:11461): Unify condition names in the MacroAssembler.
|
|
||||||
enum class Condition : uint32_t {
|
|
||||||
kEqual = equal,
|
|
||||||
kNotEqual = not_equal,
|
|
||||||
|
|
||||||
kLessThan = less,
|
|
||||||
kGreaterThan = greater,
|
|
||||||
kLessThanEqual = less_equal,
|
|
||||||
kGreaterThanEqual = greater_equal,
|
|
||||||
|
|
||||||
kUnsignedLessThan = below,
|
|
||||||
kUnsignedGreaterThan = above,
|
|
||||||
kUnsignedLessThanEqual = below_equal,
|
|
||||||
kUnsignedGreaterThanEqual = above_equal,
|
|
||||||
|
|
||||||
kOverflow = overflow,
|
|
||||||
kNoOverflow = no_overflow,
|
|
||||||
|
|
||||||
kZero = zero,
|
|
||||||
kNotZero = not_zero,
|
|
||||||
};
|
|
||||||
|
|
||||||
inline internal::Condition AsMasmCondition(Condition cond) {
|
|
||||||
return static_cast<internal::Condition>(cond);
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace detail {
|
namespace detail {
|
||||||
|
|
||||||
#define __ masm_->
|
#define __ masm_->
|
||||||
@ -130,13 +104,13 @@ void BaselineAssembler::TestAndBranch(Register value, int mask, Condition cc,
|
|||||||
} else {
|
} else {
|
||||||
__ testl(value, Immediate(mask));
|
__ testl(value, Immediate(mask));
|
||||||
}
|
}
|
||||||
__ j(AsMasmCondition(cc), target, distance);
|
__ j(cc, target, distance);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaselineAssembler::JumpIf(Condition cc, Register lhs, const Operand& rhs,
|
void BaselineAssembler::JumpIf(Condition cc, Register lhs, const Operand& rhs,
|
||||||
Label* target, Label::Distance distance) {
|
Label* target, Label::Distance distance) {
|
||||||
__ cmpq(lhs, rhs);
|
__ cmpq(lhs, rhs);
|
||||||
__ j(AsMasmCondition(cc), target, distance);
|
__ j(cc, target, distance);
|
||||||
}
|
}
|
||||||
void BaselineAssembler::JumpIfObjectType(Condition cc, Register object,
|
void BaselineAssembler::JumpIfObjectType(Condition cc, Register object,
|
||||||
InstanceType instance_type,
|
InstanceType instance_type,
|
||||||
@ -144,7 +118,7 @@ void BaselineAssembler::JumpIfObjectType(Condition cc, Register object,
|
|||||||
Label::Distance distance) {
|
Label::Distance distance) {
|
||||||
__ AssertNotSmi(object);
|
__ AssertNotSmi(object);
|
||||||
__ CmpObjectType(object, instance_type, map);
|
__ CmpObjectType(object, instance_type, map);
|
||||||
__ j(AsMasmCondition(cc), target, distance);
|
__ j(cc, target, distance);
|
||||||
}
|
}
|
||||||
void BaselineAssembler::JumpIfInstanceType(Condition cc, Register map,
|
void BaselineAssembler::JumpIfInstanceType(Condition cc, Register map,
|
||||||
InstanceType instance_type,
|
InstanceType instance_type,
|
||||||
@ -156,30 +130,30 @@ void BaselineAssembler::JumpIfInstanceType(Condition cc, Register map,
|
|||||||
__ Assert(equal, AbortReason::kUnexpectedValue);
|
__ Assert(equal, AbortReason::kUnexpectedValue);
|
||||||
}
|
}
|
||||||
__ CmpInstanceType(map, instance_type);
|
__ CmpInstanceType(map, instance_type);
|
||||||
__ j(AsMasmCondition(cc), target, distance);
|
__ j(cc, target, distance);
|
||||||
}
|
}
|
||||||
void BaselineAssembler::JumpIfPointer(Condition cc, Register value,
|
void BaselineAssembler::JumpIfPointer(Condition cc, Register value,
|
||||||
MemOperand operand, Label* target,
|
MemOperand operand, Label* target,
|
||||||
Label::Distance distance) {
|
Label::Distance distance) {
|
||||||
__ cmpq(value, operand);
|
__ cmpq(value, operand);
|
||||||
__ j(AsMasmCondition(cc), target, distance);
|
__ j(cc, target, distance);
|
||||||
}
|
}
|
||||||
void BaselineAssembler::JumpIfSmi(Condition cc, Register lhs, Smi smi,
|
void BaselineAssembler::JumpIfSmi(Condition cc, Register lhs, Smi smi,
|
||||||
Label* target, Label::Distance distance) {
|
Label* target, Label::Distance distance) {
|
||||||
__ SmiCompare(lhs, smi);
|
__ SmiCompare(lhs, smi);
|
||||||
__ j(AsMasmCondition(cc), target, distance);
|
__ j(cc, target, distance);
|
||||||
}
|
}
|
||||||
void BaselineAssembler::JumpIfSmi(Condition cc, Register lhs, Register rhs,
|
void BaselineAssembler::JumpIfSmi(Condition cc, Register lhs, Register rhs,
|
||||||
Label* target, Label::Distance distance) {
|
Label* target, Label::Distance distance) {
|
||||||
__ SmiCompare(lhs, rhs);
|
__ SmiCompare(lhs, rhs);
|
||||||
__ j(AsMasmCondition(cc), target, distance);
|
__ j(cc, target, distance);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaselineAssembler::JumpIfImmediate(Condition cc, Register left, int right,
|
void BaselineAssembler::JumpIfImmediate(Condition cc, Register left, int right,
|
||||||
Label* target,
|
Label* target,
|
||||||
Label::Distance distance) {
|
Label::Distance distance) {
|
||||||
__ cmpq(left, Immediate(right));
|
__ cmpq(left, Immediate(right));
|
||||||
__ j(AsMasmCondition(cc), target, distance);
|
__ j(cc, target, distance);
|
||||||
}
|
}
|
||||||
|
|
||||||
// cmp_tagged
|
// cmp_tagged
|
||||||
@ -187,18 +161,18 @@ void BaselineAssembler::JumpIfTagged(Condition cc, Register value,
|
|||||||
MemOperand operand, Label* target,
|
MemOperand operand, Label* target,
|
||||||
Label::Distance distance) {
|
Label::Distance distance) {
|
||||||
__ cmp_tagged(value, operand);
|
__ cmp_tagged(value, operand);
|
||||||
__ j(AsMasmCondition(cc), target, distance);
|
__ j(cc, target, distance);
|
||||||
}
|
}
|
||||||
void BaselineAssembler::JumpIfTagged(Condition cc, MemOperand operand,
|
void BaselineAssembler::JumpIfTagged(Condition cc, MemOperand operand,
|
||||||
Register value, Label* target,
|
Register value, Label* target,
|
||||||
Label::Distance distance) {
|
Label::Distance distance) {
|
||||||
__ cmp_tagged(operand, value);
|
__ cmp_tagged(operand, value);
|
||||||
__ j(AsMasmCondition(cc), target, distance);
|
__ j(cc, target, distance);
|
||||||
}
|
}
|
||||||
void BaselineAssembler::JumpIfByte(Condition cc, Register value, int32_t byte,
|
void BaselineAssembler::JumpIfByte(Condition cc, Register value, int32_t byte,
|
||||||
Label* target, Label::Distance distance) {
|
Label* target, Label::Distance distance) {
|
||||||
__ cmpb(value, Immediate(byte));
|
__ cmpb(value, Immediate(byte));
|
||||||
__ j(AsMasmCondition(cc), target, distance);
|
__ j(cc, target, distance);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaselineAssembler::Move(interpreter::Register output, Register source) {
|
void BaselineAssembler::Move(interpreter::Register output, Register source) {
|
||||||
@ -403,24 +377,8 @@ void BaselineAssembler::TryLoadOptimizedOsrCode(Register scratch_and_result,
|
|||||||
FeedbackSlot slot,
|
FeedbackSlot slot,
|
||||||
Label* on_result,
|
Label* on_result,
|
||||||
Label::Distance distance) {
|
Label::Distance distance) {
|
||||||
Label fallthrough;
|
__ MacroAssembler::TryLoadOptimizedOsrCode(
|
||||||
LoadTaggedPointerField(scratch_and_result, feedback_vector,
|
scratch_and_result, feedback_vector, slot, on_result, distance);
|
||||||
FeedbackVector::OffsetOfElementAt(slot.ToInt()));
|
|
||||||
__ LoadWeakValue(scratch_and_result, &fallthrough);
|
|
||||||
|
|
||||||
// Is it marked_for_deoptimization? If yes, clear the slot.
|
|
||||||
{
|
|
||||||
DCHECK(!AreAliased(scratch_and_result, kScratchRegister));
|
|
||||||
__ TestCodeTIsMarkedForDeoptimization(scratch_and_result, kScratchRegister);
|
|
||||||
__ j(equal, on_result, distance);
|
|
||||||
__ StoreTaggedField(
|
|
||||||
FieldOperand(feedback_vector,
|
|
||||||
FeedbackVector::OffsetOfElementAt(slot.ToInt())),
|
|
||||||
__ ClearedValue());
|
|
||||||
}
|
|
||||||
|
|
||||||
__ bind(&fallthrough);
|
|
||||||
__ Move(scratch_and_result, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaselineAssembler::AddToInterruptBudgetAndJumpIfNotExceeded(
|
void BaselineAssembler::AddToInterruptBudgetAndJumpIfNotExceeded(
|
||||||
|
@ -531,11 +531,11 @@ char* ToStringFormatter::ProcessLevel(RecursionLevel* level, Digits chunk,
|
|||||||
|
|
||||||
// Step 5: Recurse.
|
// Step 5: Recurse.
|
||||||
char* end_of_right_part = ProcessLevel(level->next_, right, out, false);
|
char* end_of_right_part = ProcessLevel(level->next_, right, out, false);
|
||||||
|
if (processor_->should_terminate()) return out;
|
||||||
// The recursive calls are required and hence designed to write exactly as
|
// The recursive calls are required and hence designed to write exactly as
|
||||||
// many characters as their level is responsible for.
|
// many characters as their level is responsible for.
|
||||||
DCHECK(end_of_right_part == out - level->char_count_);
|
DCHECK(end_of_right_part == out - level->char_count_);
|
||||||
USE(end_of_right_part);
|
USE(end_of_right_part);
|
||||||
if (processor_->should_terminate()) return out;
|
|
||||||
// We intentionally don't use {end_of_right_part} here to be prepared for
|
// We intentionally don't use {end_of_right_part} here to be prepared for
|
||||||
// potential future multi-threaded execution.
|
// potential future multi-threaded execution.
|
||||||
return ProcessLevel(level->next_, left, out - level->char_count_,
|
return ProcessLevel(level->next_, left, out - level->char_count_,
|
||||||
@ -575,6 +575,7 @@ void ProcessorImpl::ToStringImpl(char* out, int* out_length, Digits X,
|
|||||||
}
|
}
|
||||||
int excess = formatter.Finish();
|
int excess = formatter.Finish();
|
||||||
*out_length -= excess;
|
*out_length -= excess;
|
||||||
|
memset(out + *out_length, 0, excess);
|
||||||
}
|
}
|
||||||
|
|
||||||
Status Processor::ToString(char* out, int* out_length, Digits X, int radix,
|
Status Processor::ToString(char* out, int* out_length, Digits X, int radix,
|
||||||
|
@ -327,7 +327,7 @@ static void GetSharedFunctionInfoBytecodeOrBaseline(MacroAssembler* masm,
|
|||||||
Label* is_baseline) {
|
Label* is_baseline) {
|
||||||
ASM_CODE_COMMENT(masm);
|
ASM_CODE_COMMENT(masm);
|
||||||
Label done;
|
Label done;
|
||||||
__ CompareObjectType(sfi_data, scratch1, scratch1, CODET_TYPE);
|
__ CompareObjectType(sfi_data, scratch1, scratch1, CODE_TYPE);
|
||||||
if (v8_flags.debug_code) {
|
if (v8_flags.debug_code) {
|
||||||
Label not_baseline;
|
Label not_baseline;
|
||||||
__ b(ne, ¬_baseline);
|
__ b(ne, ¬_baseline);
|
||||||
@ -1500,7 +1500,7 @@ static void Generate_InterpreterEnterBytecode(MacroAssembler* masm) {
|
|||||||
|
|
||||||
__ ldr(r2,
|
__ ldr(r2,
|
||||||
FieldMemOperand(r2, InterpreterData::kInterpreterTrampolineOffset));
|
FieldMemOperand(r2, InterpreterData::kInterpreterTrampolineOffset));
|
||||||
__ add(r2, r2, Operand(Code::kHeaderSize - kHeapObjectTag));
|
__ LoadCodeEntry(r2, r2);
|
||||||
__ b(&trampoline_loaded);
|
__ b(&trampoline_loaded);
|
||||||
|
|
||||||
__ bind(&builtin_trampoline);
|
__ bind(&builtin_trampoline);
|
||||||
@ -1714,8 +1714,8 @@ void OnStackReplacement(MacroAssembler* masm, OsrSourceTier source,
|
|||||||
Label jump_to_optimized_code;
|
Label jump_to_optimized_code;
|
||||||
{
|
{
|
||||||
// If maybe_target_code is not null, no need to call into runtime. A
|
// If maybe_target_code is not null, no need to call into runtime. A
|
||||||
// precondition here is: if maybe_target_code is a Code object, it must NOT
|
// precondition here is: if maybe_target_code is a InstructionStream object,
|
||||||
// be marked_for_deoptimization (callers must ensure this).
|
// it must NOT be marked_for_deoptimization (callers must ensure this).
|
||||||
__ cmp(maybe_target_code, Operand(Smi::zero()));
|
__ cmp(maybe_target_code, Operand(Smi::zero()));
|
||||||
__ b(ne, &jump_to_optimized_code);
|
__ b(ne, &jump_to_optimized_code);
|
||||||
}
|
}
|
||||||
@ -1758,14 +1758,20 @@ void OnStackReplacement(MacroAssembler* masm, OsrSourceTier source,
|
|||||||
__ LeaveFrame(StackFrame::STUB);
|
__ LeaveFrame(StackFrame::STUB);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__ LoadCodeInstructionStreamNonBuiltin(r0, r0);
|
||||||
|
|
||||||
// Load deoptimization data from the code object.
|
// Load deoptimization data from the code object.
|
||||||
// <deopt_data> = <code>[#deoptimization_data_offset]
|
// <deopt_data> = <code>[#deoptimization_data_offset]
|
||||||
__ ldr(r1,
|
__ ldr(
|
||||||
FieldMemOperand(r0, Code::kDeoptimizationDataOrInterpreterDataOffset));
|
r1,
|
||||||
|
FieldMemOperand(
|
||||||
|
r0, InstructionStream::kDeoptimizationDataOrInterpreterDataOffset));
|
||||||
|
|
||||||
{
|
{
|
||||||
ConstantPoolUnavailableScope constant_pool_unavailable(masm);
|
ConstantPoolUnavailableScope constant_pool_unavailable(masm);
|
||||||
__ add(r0, r0, Operand(Code::kHeaderSize - kHeapObjectTag)); // Code start
|
__ add(r0, r0,
|
||||||
|
Operand(InstructionStream::kHeaderSize -
|
||||||
|
kHeapObjectTag)); // InstructionStream start
|
||||||
|
|
||||||
// Load the OSR entrypoint offset from the deoptimization data.
|
// Load the OSR entrypoint offset from the deoptimization data.
|
||||||
// <osr_offset> = <deopt_data>[#header_size + #osr_pc_offset]
|
// <osr_offset> = <deopt_data>[#header_size + #osr_pc_offset]
|
||||||
@ -1997,7 +2003,8 @@ void Generate_AllocateSpaceAndShiftExistingArguments(
|
|||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
// static
|
// static
|
||||||
// TODO(v8:11615): Observe Code::kMaxArguments in CallOrConstructVarargs
|
// TODO(v8:11615): Observe InstructionStream::kMaxArguments in
|
||||||
|
// CallOrConstructVarargs
|
||||||
void Builtins::Generate_CallOrConstructVarargs(MacroAssembler* masm,
|
void Builtins::Generate_CallOrConstructVarargs(MacroAssembler* masm,
|
||||||
Handle<Code> code) {
|
Handle<Code> code) {
|
||||||
// ----------- S t a t e -------------
|
// ----------- S t a t e -------------
|
||||||
@ -2727,8 +2734,7 @@ void Builtins::Generate_WasmOnStackReplace(MacroAssembler* masm) {
|
|||||||
#endif // V8_ENABLE_WEBASSEMBLY
|
#endif // V8_ENABLE_WEBASSEMBLY
|
||||||
|
|
||||||
void Builtins::Generate_CEntry(MacroAssembler* masm, int result_size,
|
void Builtins::Generate_CEntry(MacroAssembler* masm, int result_size,
|
||||||
SaveFPRegsMode save_doubles, ArgvMode argv_mode,
|
ArgvMode argv_mode, bool builtin_exit_frame) {
|
||||||
bool builtin_exit_frame) {
|
|
||||||
// Called from JavaScript; parameters are on stack as if calling JS function.
|
// Called from JavaScript; parameters are on stack as if calling JS function.
|
||||||
// r0: number of arguments including receiver
|
// r0: number of arguments including receiver
|
||||||
// r1: pointer to builtin function
|
// r1: pointer to builtin function
|
||||||
@ -2753,8 +2759,7 @@ void Builtins::Generate_CEntry(MacroAssembler* masm, int result_size,
|
|||||||
// Enter the exit frame that transitions from JavaScript to C++.
|
// Enter the exit frame that transitions from JavaScript to C++.
|
||||||
FrameScope scope(masm, StackFrame::MANUAL);
|
FrameScope scope(masm, StackFrame::MANUAL);
|
||||||
__ EnterExitFrame(
|
__ EnterExitFrame(
|
||||||
save_doubles == SaveFPRegsMode::kSave, 0,
|
0, builtin_exit_frame ? StackFrame::BUILTIN_EXIT : StackFrame::EXIT);
|
||||||
builtin_exit_frame ? StackFrame::BUILTIN_EXIT : StackFrame::EXIT);
|
|
||||||
|
|
||||||
// Store a copy of argc in callee-saved registers for later.
|
// Store a copy of argc in callee-saved registers for later.
|
||||||
__ mov(r4, Operand(r0));
|
__ mov(r4, Operand(r0));
|
||||||
@ -2815,7 +2820,7 @@ void Builtins::Generate_CEntry(MacroAssembler* masm, int result_size,
|
|||||||
? no_reg
|
? no_reg
|
||||||
// Callee-saved register r4 still holds argc.
|
// Callee-saved register r4 still holds argc.
|
||||||
: r4;
|
: r4;
|
||||||
__ LeaveExitFrame(save_doubles == SaveFPRegsMode::kSave, argc);
|
__ LeaveExitFrame(argc, false);
|
||||||
__ mov(pc, lr);
|
__ mov(pc, lr);
|
||||||
|
|
||||||
// Handling of exception.
|
// Handling of exception.
|
||||||
@ -3050,7 +3055,7 @@ void CallApiFunctionAndReturn(MacroAssembler* masm, Register function_address,
|
|||||||
DCHECK_EQ(stack_space, 0);
|
DCHECK_EQ(stack_space, 0);
|
||||||
__ ldr(r4, *stack_space_operand);
|
__ ldr(r4, *stack_space_operand);
|
||||||
}
|
}
|
||||||
__ LeaveExitFrame(false, r4, stack_space_operand != nullptr);
|
__ LeaveExitFrame(r4, stack_space_operand != nullptr);
|
||||||
|
|
||||||
// Check if the function scheduled an exception.
|
// Check if the function scheduled an exception.
|
||||||
__ LoadRoot(r4, RootIndex::kTheHoleValue);
|
__ LoadRoot(r4, RootIndex::kTheHoleValue);
|
||||||
@ -3155,9 +3160,8 @@ void Builtins::Generate_CallApiCallback(MacroAssembler* masm) {
|
|||||||
// Allocate the v8::Arguments structure in the arguments' space since
|
// Allocate the v8::Arguments structure in the arguments' space since
|
||||||
// it's not controlled by GC.
|
// it's not controlled by GC.
|
||||||
static constexpr int kApiStackSpace = 4;
|
static constexpr int kApiStackSpace = 4;
|
||||||
static constexpr bool kDontSaveDoubles = false;
|
|
||||||
FrameScope frame_scope(masm, StackFrame::MANUAL);
|
FrameScope frame_scope(masm, StackFrame::MANUAL);
|
||||||
__ EnterExitFrame(kDontSaveDoubles, kApiStackSpace);
|
__ EnterExitFrame(kApiStackSpace, StackFrame::EXIT);
|
||||||
|
|
||||||
// FunctionCallbackInfo::implicit_args_ (points at kHolder as set up above).
|
// FunctionCallbackInfo::implicit_args_ (points at kHolder as set up above).
|
||||||
// Arguments are after the return address (pushed by EnterExitFrame()).
|
// Arguments are after the return address (pushed by EnterExitFrame()).
|
||||||
@ -3238,7 +3242,7 @@ void Builtins::Generate_CallApiGetter(MacroAssembler* masm) {
|
|||||||
|
|
||||||
const int kApiStackSpace = 1;
|
const int kApiStackSpace = 1;
|
||||||
FrameScope frame_scope(masm, StackFrame::MANUAL);
|
FrameScope frame_scope(masm, StackFrame::MANUAL);
|
||||||
__ EnterExitFrame(false, kApiStackSpace);
|
__ EnterExitFrame(kApiStackSpace, StackFrame::EXIT);
|
||||||
|
|
||||||
// Create v8::PropertyCallbackInfo object on the stack and initialize
|
// Create v8::PropertyCallbackInfo object on the stack and initialize
|
||||||
// it's args_ field.
|
// it's args_ field.
|
||||||
@ -3262,8 +3266,8 @@ void Builtins::Generate_CallApiGetter(MacroAssembler* masm) {
|
|||||||
|
|
||||||
void Builtins::Generate_DirectCEntry(MacroAssembler* masm) {
|
void Builtins::Generate_DirectCEntry(MacroAssembler* masm) {
|
||||||
// The sole purpose of DirectCEntry is for movable callers (e.g. any general
|
// The sole purpose of DirectCEntry is for movable callers (e.g. any general
|
||||||
// purpose Code object) to be able to call into C functions that may trigger
|
// purpose InstructionStream object) to be able to call into C functions that
|
||||||
// GC and thus move the caller.
|
// may trigger GC and thus move the caller.
|
||||||
//
|
//
|
||||||
// DirectCEntry places the return address on the stack (updated by the GC),
|
// DirectCEntry places the return address on the stack (updated by the GC),
|
||||||
// making the call GC safe. The irregexp backend relies on this.
|
// making the call GC safe. The irregexp backend relies on this.
|
||||||
@ -3557,7 +3561,7 @@ void Generate_BaselineOrInterpreterEntry(MacroAssembler* masm,
|
|||||||
Register closure = r1;
|
Register closure = r1;
|
||||||
__ ldr(closure, MemOperand(fp, StandardFrameConstants::kFunctionOffset));
|
__ ldr(closure, MemOperand(fp, StandardFrameConstants::kFunctionOffset));
|
||||||
|
|
||||||
// Get the Code object from the shared function info.
|
// Get the InstructionStream object from the shared function info.
|
||||||
Register code_obj = r4;
|
Register code_obj = r4;
|
||||||
__ ldr(code_obj,
|
__ ldr(code_obj,
|
||||||
FieldMemOperand(closure, JSFunction::kSharedFunctionInfoOffset));
|
FieldMemOperand(closure, JSFunction::kSharedFunctionInfoOffset));
|
||||||
@ -3568,7 +3572,7 @@ void Generate_BaselineOrInterpreterEntry(MacroAssembler* masm,
|
|||||||
// always have baseline code.
|
// always have baseline code.
|
||||||
if (!is_osr) {
|
if (!is_osr) {
|
||||||
Label start_with_baseline;
|
Label start_with_baseline;
|
||||||
__ CompareObjectType(code_obj, r3, r3, CODET_TYPE);
|
__ CompareObjectType(code_obj, r3, r3, CODE_TYPE);
|
||||||
__ b(eq, &start_with_baseline);
|
__ b(eq, &start_with_baseline);
|
||||||
|
|
||||||
// Start with bytecode as there is no baseline code.
|
// Start with bytecode as there is no baseline code.
|
||||||
@ -3581,13 +3585,14 @@ void Generate_BaselineOrInterpreterEntry(MacroAssembler* masm,
|
|||||||
// Start with baseline code.
|
// Start with baseline code.
|
||||||
__ bind(&start_with_baseline);
|
__ bind(&start_with_baseline);
|
||||||
} else if (v8_flags.debug_code) {
|
} else if (v8_flags.debug_code) {
|
||||||
__ CompareObjectType(code_obj, r3, r3, CODET_TYPE);
|
__ CompareObjectType(code_obj, r3, r3, CODE_TYPE);
|
||||||
__ Assert(eq, AbortReason::kExpectedBaselineData);
|
__ Assert(eq, AbortReason::kExpectedBaselineData);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (v8_flags.debug_code) {
|
if (v8_flags.debug_code) {
|
||||||
AssertCodeIsBaseline(masm, code_obj, r3);
|
AssertCodeIsBaseline(masm, code_obj, r3);
|
||||||
}
|
}
|
||||||
|
__ LoadCodeInstructionStreamNonBuiltin(code_obj, code_obj);
|
||||||
|
|
||||||
// Load the feedback vector.
|
// Load the feedback vector.
|
||||||
Register feedback_vector = r2;
|
Register feedback_vector = r2;
|
||||||
@ -3662,9 +3667,10 @@ void Generate_BaselineOrInterpreterEntry(MacroAssembler* masm,
|
|||||||
UseScratchRegisterScope temps(masm);
|
UseScratchRegisterScope temps(masm);
|
||||||
ResetBytecodeAge(masm, kInterpreterBytecodeArrayRegister, temps.Acquire());
|
ResetBytecodeAge(masm, kInterpreterBytecodeArrayRegister, temps.Acquire());
|
||||||
Generate_OSREntry(masm, code_obj,
|
Generate_OSREntry(masm, code_obj,
|
||||||
Operand(Code::kHeaderSize - kHeapObjectTag));
|
Operand(InstructionStream::kHeaderSize - kHeapObjectTag));
|
||||||
} else {
|
} else {
|
||||||
__ add(code_obj, code_obj, Operand(Code::kHeaderSize - kHeapObjectTag));
|
__ add(code_obj, code_obj,
|
||||||
|
Operand(InstructionStream::kHeaderSize - kHeapObjectTag));
|
||||||
__ Jump(code_obj);
|
__ Jump(code_obj);
|
||||||
}
|
}
|
||||||
__ Trap(); // Unreachable.
|
__ Trap(); // Unreachable.
|
||||||
|
@ -388,19 +388,19 @@ void Builtins::Generate_ConstructedNonConstructable(MacroAssembler* masm) {
|
|||||||
__ Unreachable();
|
__ Unreachable();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void AssertCodeTIsBaselineAllowClobber(MacroAssembler* masm,
|
static void AssertCodeIsBaselineAllowClobber(MacroAssembler* masm,
|
||||||
Register code, Register scratch) {
|
Register code, Register scratch) {
|
||||||
// Verify that the code kind is baseline code via the CodeKind.
|
// Verify that the code kind is baseline code via the CodeKind.
|
||||||
__ Ldr(scratch, FieldMemOperand(code, CodeT::kFlagsOffset));
|
__ Ldr(scratch, FieldMemOperand(code, Code::kFlagsOffset));
|
||||||
__ DecodeField<CodeT::KindField>(scratch);
|
__ DecodeField<Code::KindField>(scratch);
|
||||||
__ Cmp(scratch, Operand(static_cast<int>(CodeKind::BASELINE)));
|
__ Cmp(scratch, Operand(static_cast<int>(CodeKind::BASELINE)));
|
||||||
__ Assert(eq, AbortReason::kExpectedBaselineData);
|
__ Assert(eq, AbortReason::kExpectedBaselineData);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void AssertCodeTIsBaseline(MacroAssembler* masm, Register code,
|
static void AssertCodeIsBaseline(MacroAssembler* masm, Register code,
|
||||||
Register scratch) {
|
Register scratch) {
|
||||||
DCHECK(!AreAliased(code, scratch));
|
DCHECK(!AreAliased(code, scratch));
|
||||||
return AssertCodeTIsBaselineAllowClobber(masm, code, scratch);
|
return AssertCodeIsBaselineAllowClobber(masm, code, scratch);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(v8:11429): Add a path for "not_compiled" and unify the two uses under
|
// TODO(v8:11429): Add a path for "not_compiled" and unify the two uses under
|
||||||
@ -411,11 +411,11 @@ static void GetSharedFunctionInfoBytecodeOrBaseline(MacroAssembler* masm,
|
|||||||
Label* is_baseline) {
|
Label* is_baseline) {
|
||||||
ASM_CODE_COMMENT(masm);
|
ASM_CODE_COMMENT(masm);
|
||||||
Label done;
|
Label done;
|
||||||
__ CompareObjectType(sfi_data, scratch1, scratch1, CODET_TYPE);
|
__ CompareObjectType(sfi_data, scratch1, scratch1, CODE_TYPE);
|
||||||
if (v8_flags.debug_code) {
|
if (v8_flags.debug_code) {
|
||||||
Label not_baseline;
|
Label not_baseline;
|
||||||
__ B(ne, ¬_baseline);
|
__ B(ne, ¬_baseline);
|
||||||
AssertCodeTIsBaseline(masm, sfi_data, scratch1);
|
AssertCodeIsBaseline(masm, sfi_data, scratch1);
|
||||||
__ B(eq, is_baseline);
|
__ B(eq, is_baseline);
|
||||||
__ Bind(¬_baseline);
|
__ Bind(¬_baseline);
|
||||||
} else {
|
} else {
|
||||||
@ -550,7 +550,7 @@ void Builtins::Generate_ResumeGeneratorTrampoline(MacroAssembler* masm) {
|
|||||||
__ Mov(x1, x4);
|
__ Mov(x1, x4);
|
||||||
static_assert(kJavaScriptCallCodeStartRegister == x2, "ABI mismatch");
|
static_assert(kJavaScriptCallCodeStartRegister == x2, "ABI mismatch");
|
||||||
__ LoadTaggedPointerField(x2, FieldMemOperand(x1, JSFunction::kCodeOffset));
|
__ LoadTaggedPointerField(x2, FieldMemOperand(x1, JSFunction::kCodeOffset));
|
||||||
__ JumpCodeTObject(x2);
|
__ JumpCodeObject(x2);
|
||||||
}
|
}
|
||||||
|
|
||||||
__ Bind(&prepare_step_in_if_stepping);
|
__ Bind(&prepare_step_in_if_stepping);
|
||||||
@ -758,7 +758,7 @@ void Generate_JSEntryVariant(MacroAssembler* masm, StackFrame::Type type,
|
|||||||
//
|
//
|
||||||
// Invoke the function by calling through JS entry trampoline builtin and
|
// Invoke the function by calling through JS entry trampoline builtin and
|
||||||
// pop the faked function when we return.
|
// pop the faked function when we return.
|
||||||
Handle<CodeT> trampoline_code =
|
Handle<Code> trampoline_code =
|
||||||
masm->isolate()->builtins()->code_handle(entry_trampoline);
|
masm->isolate()->builtins()->code_handle(entry_trampoline);
|
||||||
__ Call(trampoline_code, RelocInfo::CODE_TARGET);
|
__ Call(trampoline_code, RelocInfo::CODE_TARGET);
|
||||||
|
|
||||||
@ -932,7 +932,7 @@ static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm,
|
|||||||
// x28 : pointer cage base register (kPtrComprCageBaseRegister).
|
// x28 : pointer cage base register (kPtrComprCageBaseRegister).
|
||||||
// x29 : frame pointer (fp).
|
// x29 : frame pointer (fp).
|
||||||
|
|
||||||
Handle<CodeT> builtin = is_construct
|
Handle<Code> builtin = is_construct
|
||||||
? BUILTIN_CODE(masm->isolate(), Construct)
|
? BUILTIN_CODE(masm->isolate(), Construct)
|
||||||
: masm->isolate()->builtins()->Call();
|
: masm->isolate()->builtins()->Call();
|
||||||
__ Call(builtin, RelocInfo::CODE_TARGET);
|
__ Call(builtin, RelocInfo::CODE_TARGET);
|
||||||
@ -1503,7 +1503,7 @@ void Builtins::Generate_InterpreterEntryTrampoline(
|
|||||||
__ Move(x2, kInterpreterBytecodeArrayRegister);
|
__ Move(x2, kInterpreterBytecodeArrayRegister);
|
||||||
static_assert(kJavaScriptCallCodeStartRegister == x2, "ABI mismatch");
|
static_assert(kJavaScriptCallCodeStartRegister == x2, "ABI mismatch");
|
||||||
__ ReplaceClosureCodeWithOptimizedCode(x2, closure);
|
__ ReplaceClosureCodeWithOptimizedCode(x2, closure);
|
||||||
__ JumpCodeTObject(x2);
|
__ JumpCodeObject(x2);
|
||||||
|
|
||||||
__ bind(&install_baseline_code);
|
__ bind(&install_baseline_code);
|
||||||
__ GenerateTailCallToReturnedCode(Runtime::kInstallBaselineCode);
|
__ GenerateTailCallToReturnedCode(Runtime::kInstallBaselineCode);
|
||||||
@ -1743,7 +1743,7 @@ static void Generate_InterpreterEnterBytecode(MacroAssembler* masm) {
|
|||||||
|
|
||||||
__ LoadTaggedPointerField(
|
__ LoadTaggedPointerField(
|
||||||
x1, FieldMemOperand(x1, InterpreterData::kInterpreterTrampolineOffset));
|
x1, FieldMemOperand(x1, InterpreterData::kInterpreterTrampolineOffset));
|
||||||
__ LoadCodeTEntry(x1, x1);
|
__ LoadCodeEntry(x1, x1);
|
||||||
__ B(&trampoline_loaded);
|
__ B(&trampoline_loaded);
|
||||||
|
|
||||||
__ Bind(&builtin_trampoline);
|
__ Bind(&builtin_trampoline);
|
||||||
@ -1951,8 +1951,8 @@ void OnStackReplacement(MacroAssembler* masm, OsrSourceTier source,
|
|||||||
Label jump_to_optimized_code;
|
Label jump_to_optimized_code;
|
||||||
{
|
{
|
||||||
// If maybe_target_code is not null, no need to call into runtime. A
|
// If maybe_target_code is not null, no need to call into runtime. A
|
||||||
// precondition here is: if maybe_target_code is a Code object, it must NOT
|
// precondition here is: if maybe_target_code is a InstructionStream object,
|
||||||
// be marked_for_deoptimization (callers must ensure this).
|
// it must NOT be marked_for_deoptimization (callers must ensure this).
|
||||||
__ CompareTaggedAndBranch(x0, Smi::zero(), ne, &jump_to_optimized_code);
|
__ CompareTaggedAndBranch(x0, Smi::zero(), ne, &jump_to_optimized_code);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1993,15 +1993,14 @@ void OnStackReplacement(MacroAssembler* masm, OsrSourceTier source,
|
|||||||
__ LeaveFrame(StackFrame::STUB);
|
__ LeaveFrame(StackFrame::STUB);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (V8_EXTERNAL_CODE_SPACE_BOOL) {
|
__ LoadCodeInstructionStreamNonBuiltin(x0, x0);
|
||||||
__ LoadCodeDataContainerCodeNonBuiltin(x0, x0);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load deoptimization data from the code object.
|
// Load deoptimization data from the code object.
|
||||||
// <deopt_data> = <code>[#deoptimization_data_offset]
|
// <deopt_data> = <code>[#deoptimization_data_offset]
|
||||||
__ LoadTaggedPointerField(
|
__ LoadTaggedPointerField(
|
||||||
x1,
|
x1,
|
||||||
FieldMemOperand(x0, Code::kDeoptimizationDataOrInterpreterDataOffset));
|
FieldMemOperand(
|
||||||
|
x0, InstructionStream::kDeoptimizationDataOrInterpreterDataOffset));
|
||||||
|
|
||||||
// Load the OSR entrypoint offset from the deoptimization data.
|
// Load the OSR entrypoint offset from the deoptimization data.
|
||||||
// <osr_offset> = <deopt_data>[#header_size + #osr_pc_offset]
|
// <osr_offset> = <deopt_data>[#header_size + #osr_pc_offset]
|
||||||
@ -2012,7 +2011,7 @@ void OnStackReplacement(MacroAssembler* masm, OsrSourceTier source,
|
|||||||
// Compute the target address = code_obj + header_size + osr_offset
|
// Compute the target address = code_obj + header_size + osr_offset
|
||||||
// <entry_addr> = <code_obj> + #header_size + <osr_offset>
|
// <entry_addr> = <code_obj> + #header_size + <osr_offset>
|
||||||
__ Add(x0, x0, x1);
|
__ Add(x0, x0, x1);
|
||||||
Generate_OSREntry(masm, x0, Code::kHeaderSize - kHeapObjectTag);
|
Generate_OSREntry(masm, x0, InstructionStream::kHeaderSize - kHeapObjectTag);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
@ -2334,9 +2333,10 @@ void Generate_PrepareForCopyingVarargs(MacroAssembler* masm, Register argc,
|
|||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
// static
|
// static
|
||||||
// TODO(v8:11615): Observe Code::kMaxArguments in CallOrConstructVarargs
|
// TODO(v8:11615): Observe InstructionStream::kMaxArguments in
|
||||||
|
// CallOrConstructVarargs
|
||||||
void Builtins::Generate_CallOrConstructVarargs(MacroAssembler* masm,
|
void Builtins::Generate_CallOrConstructVarargs(MacroAssembler* masm,
|
||||||
Handle<CodeT> code) {
|
Handle<Code> code) {
|
||||||
// ----------- S t a t e -------------
|
// ----------- S t a t e -------------
|
||||||
// -- x1 : target
|
// -- x1 : target
|
||||||
// -- x0 : number of parameters on the stack
|
// -- x0 : number of parameters on the stack
|
||||||
@ -2411,7 +2411,7 @@ void Builtins::Generate_CallOrConstructVarargs(MacroAssembler* masm,
|
|||||||
// static
|
// static
|
||||||
void Builtins::Generate_CallOrConstructForwardVarargs(MacroAssembler* masm,
|
void Builtins::Generate_CallOrConstructForwardVarargs(MacroAssembler* masm,
|
||||||
CallOrConstructMode mode,
|
CallOrConstructMode mode,
|
||||||
Handle<CodeT> code) {
|
Handle<Code> code) {
|
||||||
// ----------- S t a t e -------------
|
// ----------- S t a t e -------------
|
||||||
// -- x0 : the number of arguments
|
// -- x0 : the number of arguments
|
||||||
// -- x3 : the new.target (for [[Construct]] calls)
|
// -- x3 : the new.target (for [[Construct]] calls)
|
||||||
@ -4751,8 +4751,7 @@ void Builtins::Generate_WasmOnStackReplace(MacroAssembler* masm) {
|
|||||||
#endif // V8_ENABLE_WEBASSEMBLY
|
#endif // V8_ENABLE_WEBASSEMBLY
|
||||||
|
|
||||||
void Builtins::Generate_CEntry(MacroAssembler* masm, int result_size,
|
void Builtins::Generate_CEntry(MacroAssembler* masm, int result_size,
|
||||||
SaveFPRegsMode save_doubles, ArgvMode argv_mode,
|
ArgvMode argv_mode, bool builtin_exit_frame) {
|
||||||
bool builtin_exit_frame) {
|
|
||||||
// The Abort mechanism relies on CallRuntime, which in turn relies on
|
// The Abort mechanism relies on CallRuntime, which in turn relies on
|
||||||
// CEntry, so until this stub has been generated, we have to use a
|
// CEntry, so until this stub has been generated, we have to use a
|
||||||
// fall-back Abort mechanism.
|
// fall-back Abort mechanism.
|
||||||
@ -4808,7 +4807,7 @@ void Builtins::Generate_CEntry(MacroAssembler* masm, int result_size,
|
|||||||
// Enter the exit frame.
|
// Enter the exit frame.
|
||||||
FrameScope scope(masm, StackFrame::MANUAL);
|
FrameScope scope(masm, StackFrame::MANUAL);
|
||||||
__ EnterExitFrame(
|
__ EnterExitFrame(
|
||||||
save_doubles == SaveFPRegsMode::kSave, x10, extra_stack_space,
|
x10, extra_stack_space,
|
||||||
builtin_exit_frame ? StackFrame::BUILTIN_EXIT : StackFrame::EXIT);
|
builtin_exit_frame ? StackFrame::BUILTIN_EXIT : StackFrame::EXIT);
|
||||||
|
|
||||||
// Poke callee-saved registers into reserved space.
|
// Poke callee-saved registers into reserved space.
|
||||||
@ -4889,7 +4888,7 @@ void Builtins::Generate_CEntry(MacroAssembler* masm, int result_size,
|
|||||||
__ Peek(argc, 2 * kSystemPointerSize);
|
__ Peek(argc, 2 * kSystemPointerSize);
|
||||||
__ Peek(target, 3 * kSystemPointerSize);
|
__ Peek(target, 3 * kSystemPointerSize);
|
||||||
|
|
||||||
__ LeaveExitFrame(save_doubles == SaveFPRegsMode::kSave, x10, x9);
|
__ LeaveExitFrame(x10, x9);
|
||||||
if (argv_mode == ArgvMode::kStack) {
|
if (argv_mode == ArgvMode::kStack) {
|
||||||
// Drop the remaining stack slots and return from the stub.
|
// Drop the remaining stack slots and return from the stub.
|
||||||
__ DropArguments(x11);
|
__ DropArguments(x11);
|
||||||
@ -5137,7 +5136,7 @@ void CallApiFunctionAndReturn(MacroAssembler* masm, Register function_address,
|
|||||||
__ Ldr(x19, *stack_space_operand);
|
__ Ldr(x19, *stack_space_operand);
|
||||||
}
|
}
|
||||||
|
|
||||||
__ LeaveExitFrame(false, x1, x5);
|
__ LeaveExitFrame(x1, x5);
|
||||||
|
|
||||||
// Check if the function scheduled an exception.
|
// Check if the function scheduled an exception.
|
||||||
__ Mov(x5, ExternalReference::scheduled_exception_address(isolate));
|
__ Mov(x5, ExternalReference::scheduled_exception_address(isolate));
|
||||||
@ -5249,11 +5248,10 @@ void Builtins::Generate_CallApiCallback(MacroAssembler* masm) {
|
|||||||
// Allocate the v8::Arguments structure in the arguments' space, since it's
|
// Allocate the v8::Arguments structure in the arguments' space, since it's
|
||||||
// not controlled by GC.
|
// not controlled by GC.
|
||||||
static constexpr int kApiStackSpace = 4;
|
static constexpr int kApiStackSpace = 4;
|
||||||
static constexpr bool kDontSaveDoubles = false;
|
|
||||||
|
|
||||||
FrameScope frame_scope(masm, StackFrame::MANUAL);
|
FrameScope frame_scope(masm, StackFrame::MANUAL);
|
||||||
__ EnterExitFrame(kDontSaveDoubles, x10,
|
__ EnterExitFrame(x10, kApiStackSpace + kCallApiFunctionSpillSpace,
|
||||||
kApiStackSpace + kCallApiFunctionSpillSpace);
|
StackFrame::EXIT);
|
||||||
|
|
||||||
// FunctionCallbackInfo::implicit_args_ (points at kHolder as set up above).
|
// FunctionCallbackInfo::implicit_args_ (points at kHolder as set up above).
|
||||||
// Arguments are after the return address (pushed by EnterExitFrame()).
|
// Arguments are after the return address (pushed by EnterExitFrame()).
|
||||||
@ -5349,7 +5347,8 @@ void Builtins::Generate_CallApiGetter(MacroAssembler* masm) {
|
|||||||
const int kApiStackSpace = 1;
|
const int kApiStackSpace = 1;
|
||||||
|
|
||||||
FrameScope frame_scope(masm, StackFrame::MANUAL);
|
FrameScope frame_scope(masm, StackFrame::MANUAL);
|
||||||
__ EnterExitFrame(false, x10, kApiStackSpace + kCallApiFunctionSpillSpace);
|
__ EnterExitFrame(x10, kApiStackSpace + kCallApiFunctionSpillSpace,
|
||||||
|
StackFrame::EXIT);
|
||||||
|
|
||||||
// Create v8::PropertyCallbackInfo object on the stack and initialize
|
// Create v8::PropertyCallbackInfo object on the stack and initialize
|
||||||
// it's args_ field.
|
// it's args_ field.
|
||||||
@ -5379,8 +5378,8 @@ void Builtins::Generate_CallApiGetter(MacroAssembler* masm) {
|
|||||||
|
|
||||||
void Builtins::Generate_DirectCEntry(MacroAssembler* masm) {
|
void Builtins::Generate_DirectCEntry(MacroAssembler* masm) {
|
||||||
// The sole purpose of DirectCEntry is for movable callers (e.g. any general
|
// The sole purpose of DirectCEntry is for movable callers (e.g. any general
|
||||||
// purpose Code object) to be able to call into C functions that may trigger
|
// purpose InstructionStream object) to be able to call into C functions that
|
||||||
// GC and thus move the caller.
|
// may trigger GC and thus move the caller.
|
||||||
//
|
//
|
||||||
// DirectCEntry places the return address on the stack (updated by the GC),
|
// DirectCEntry places the return address on the stack (updated by the GC),
|
||||||
// making the call GC safe. The irregexp backend relies on this.
|
// making the call GC safe. The irregexp backend relies on this.
|
||||||
@ -5695,7 +5694,7 @@ void Generate_BaselineOrInterpreterEntry(MacroAssembler* masm,
|
|||||||
Register closure = x1;
|
Register closure = x1;
|
||||||
__ Ldr(closure, MemOperand(fp, StandardFrameConstants::kFunctionOffset));
|
__ Ldr(closure, MemOperand(fp, StandardFrameConstants::kFunctionOffset));
|
||||||
|
|
||||||
// Get the Code object from the shared function info.
|
// Get the InstructionStream object from the shared function info.
|
||||||
Register code_obj = x22;
|
Register code_obj = x22;
|
||||||
__ LoadTaggedPointerField(
|
__ LoadTaggedPointerField(
|
||||||
code_obj,
|
code_obj,
|
||||||
@ -5708,7 +5707,7 @@ void Generate_BaselineOrInterpreterEntry(MacroAssembler* masm,
|
|||||||
// always have baseline code.
|
// always have baseline code.
|
||||||
if (!is_osr) {
|
if (!is_osr) {
|
||||||
Label start_with_baseline;
|
Label start_with_baseline;
|
||||||
__ CompareObjectType(code_obj, x3, x3, CODET_TYPE);
|
__ CompareObjectType(code_obj, x3, x3, CODE_TYPE);
|
||||||
__ B(eq, &start_with_baseline);
|
__ B(eq, &start_with_baseline);
|
||||||
|
|
||||||
// Start with bytecode as there is no baseline code.
|
// Start with bytecode as there is no baseline code.
|
||||||
@ -5721,16 +5720,14 @@ void Generate_BaselineOrInterpreterEntry(MacroAssembler* masm,
|
|||||||
// Start with baseline code.
|
// Start with baseline code.
|
||||||
__ bind(&start_with_baseline);
|
__ bind(&start_with_baseline);
|
||||||
} else if (v8_flags.debug_code) {
|
} else if (v8_flags.debug_code) {
|
||||||
__ CompareObjectType(code_obj, x3, x3, CODET_TYPE);
|
__ CompareObjectType(code_obj, x3, x3, CODE_TYPE);
|
||||||
__ Assert(eq, AbortReason::kExpectedBaselineData);
|
__ Assert(eq, AbortReason::kExpectedBaselineData);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (v8_flags.debug_code) {
|
if (v8_flags.debug_code) {
|
||||||
AssertCodeTIsBaseline(masm, code_obj, x3);
|
AssertCodeIsBaseline(masm, code_obj, x3);
|
||||||
}
|
|
||||||
if (V8_EXTERNAL_CODE_SPACE_BOOL) {
|
|
||||||
__ LoadCodeDataContainerCodeNonBuiltin(code_obj, code_obj);
|
|
||||||
}
|
}
|
||||||
|
__ LoadCodeInstructionStreamNonBuiltin(code_obj, code_obj);
|
||||||
|
|
||||||
// Load the feedback vector.
|
// Load the feedback vector.
|
||||||
Register feedback_vector = x2;
|
Register feedback_vector = x2;
|
||||||
@ -5803,9 +5800,10 @@ void Generate_BaselineOrInterpreterEntry(MacroAssembler* masm,
|
|||||||
|
|
||||||
if (is_osr) {
|
if (is_osr) {
|
||||||
ResetBytecodeAge(masm, kInterpreterBytecodeArrayRegister);
|
ResetBytecodeAge(masm, kInterpreterBytecodeArrayRegister);
|
||||||
Generate_OSREntry(masm, code_obj, Code::kHeaderSize - kHeapObjectTag);
|
Generate_OSREntry(masm, code_obj,
|
||||||
|
InstructionStream::kHeaderSize - kHeapObjectTag);
|
||||||
} else {
|
} else {
|
||||||
__ Add(code_obj, code_obj, Code::kHeaderSize - kHeapObjectTag);
|
__ Add(code_obj, code_obj, InstructionStream::kHeaderSize - kHeapObjectTag);
|
||||||
__ Jump(code_obj);
|
__ Jump(code_obj);
|
||||||
}
|
}
|
||||||
__ Trap(); // Unreachable.
|
__ Trap(); // Unreachable.
|
||||||
|
@ -69,13 +69,23 @@ transitioning builtin ConvertToLocaleString(
|
|||||||
try {
|
try {
|
||||||
const callable: Callable = Cast<Callable>(prop) otherwise TypeError;
|
const callable: Callable = Cast<Callable>(prop) otherwise TypeError;
|
||||||
let result: JSAny;
|
let result: JSAny;
|
||||||
if (IsNullOrUndefined(locales)) {
|
|
||||||
result = Call(context, callable, element);
|
// According to the ECMA-402 specification, the optional arguments locales
|
||||||
} else if (IsNullOrUndefined(options)) {
|
// and options must be passed.
|
||||||
result = Call(context, callable, element, locales);
|
@if(V8_INTL_SUPPORT) {
|
||||||
} else {
|
|
||||||
result = Call(context, callable, element, locales, options);
|
result = Call(context, callable, element, locales, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Without the ECMA-402 internationalization API, the optional arguments
|
||||||
|
// must not be passed.
|
||||||
|
// See: https://tc39.es/ecma262/#sec-array.prototype.tolocalestring
|
||||||
|
@ifnot(V8_INTL_SUPPORT) {
|
||||||
|
result = Call(context, callable, element);
|
||||||
|
// Use the remaining parameters.
|
||||||
|
const _locales = locales;
|
||||||
|
const _options = options;
|
||||||
|
}
|
||||||
|
|
||||||
return ToString_Inline(result);
|
return ToString_Inline(result);
|
||||||
} label TypeError {
|
} label TypeError {
|
||||||
ThrowTypeError(MessageTemplate::kCalledNonCallable, prop);
|
ThrowTypeError(MessageTemplate::kCalledNonCallable, prop);
|
||||||
|
@ -229,7 +229,7 @@ type RawPtr generates 'TNode<RawPtrT>' constexpr 'Address';
|
|||||||
type RawPtr<To: type> extends RawPtr;
|
type RawPtr<To: type> extends RawPtr;
|
||||||
type ExternalPointer
|
type ExternalPointer
|
||||||
generates 'TNode<ExternalPointerT>' constexpr 'ExternalPointer_t';
|
generates 'TNode<ExternalPointerT>' constexpr 'ExternalPointer_t';
|
||||||
extern class Code extends HeapObject;
|
extern class InstructionStream extends HeapObject;
|
||||||
type BuiltinPtr extends Smi generates 'TNode<BuiltinPtr>';
|
type BuiltinPtr extends Smi generates 'TNode<BuiltinPtr>';
|
||||||
|
|
||||||
type Number = Smi|HeapNumber;
|
type Number = Smi|HeapNumber;
|
||||||
@ -488,6 +488,8 @@ const kFixedDoubleArrayMaxLength:
|
|||||||
constexpr int31 generates 'FixedDoubleArray::kMaxLength';
|
constexpr int31 generates 'FixedDoubleArray::kMaxLength';
|
||||||
const kObjectAlignmentMask: constexpr intptr
|
const kObjectAlignmentMask: constexpr intptr
|
||||||
generates 'kObjectAlignmentMask';
|
generates 'kObjectAlignmentMask';
|
||||||
|
const kObjectAlignment: constexpr intptr
|
||||||
|
generates 'kObjectAlignment';
|
||||||
const kMinAddedElementsCapacity:
|
const kMinAddedElementsCapacity:
|
||||||
constexpr int31 generates 'JSObject::kMinAddedElementsCapacity';
|
constexpr int31 generates 'JSObject::kMinAddedElementsCapacity';
|
||||||
const kMaxFastArrayLength:
|
const kMaxFastArrayLength:
|
||||||
|
@ -1808,7 +1808,7 @@ TF_BUILTIN(ArrayConstructor, ArrayBuiltinsAssembler) {
|
|||||||
void ArrayBuiltinsAssembler::TailCallArrayConstructorStub(
|
void ArrayBuiltinsAssembler::TailCallArrayConstructorStub(
|
||||||
const Callable& callable, TNode<Context> context, TNode<JSFunction> target,
|
const Callable& callable, TNode<Context> context, TNode<JSFunction> target,
|
||||||
TNode<HeapObject> allocation_site_or_undefined, TNode<Int32T> argc) {
|
TNode<HeapObject> allocation_site_or_undefined, TNode<Int32T> argc) {
|
||||||
TNode<CodeT> code = HeapConstant(callable.code());
|
TNode<Code> code = HeapConstant(callable.code());
|
||||||
|
|
||||||
// We are going to call here ArrayNoArgumentsConstructor or
|
// We are going to call here ArrayNoArgumentsConstructor or
|
||||||
// ArraySingleArgumentsConstructor which in addition to the register arguments
|
// ArraySingleArgumentsConstructor which in addition to the register arguments
|
||||||
|
@ -1849,5 +1849,12 @@ BUILTIN(ArrayPrototypeGroupToMap) {
|
|||||||
return *map;
|
return *map;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BUILTIN(ArrayFromAsync) {
|
||||||
|
HandleScope scope(isolate);
|
||||||
|
DCHECK(v8_flags.harmony_array_from_async);
|
||||||
|
|
||||||
|
return ReadOnlyRoots(isolate).undefined_value();
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace internal
|
} // namespace internal
|
||||||
} // namespace v8
|
} // namespace v8
|
||||||
|
@ -180,7 +180,7 @@ void AsyncBuiltinsAssembler::InitializeNativeClosure(
|
|||||||
// which almost doubles the size of `await` builtins (unnecessarily).
|
// which almost doubles the size of `await` builtins (unnecessarily).
|
||||||
TNode<Smi> builtin_id = LoadObjectField<Smi>(
|
TNode<Smi> builtin_id = LoadObjectField<Smi>(
|
||||||
shared_info, SharedFunctionInfo::kFunctionDataOffset);
|
shared_info, SharedFunctionInfo::kFunctionDataOffset);
|
||||||
TNode<CodeT> code = LoadBuiltin(builtin_id);
|
TNode<Code> code = LoadBuiltin(builtin_id);
|
||||||
StoreObjectFieldNoWriteBarrier(function, JSFunction::kCodeOffset, code);
|
StoreObjectFieldNoWriteBarrier(function, JSFunction::kCodeOffset, code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -510,6 +510,19 @@ TF_BUILTIN(AsyncGeneratorResumeNext, AsyncGeneratorBuiltinsAssembler) {
|
|||||||
// Remember the {resume_type} for the {generator}.
|
// Remember the {resume_type} for the {generator}.
|
||||||
StoreObjectFieldNoWriteBarrier(
|
StoreObjectFieldNoWriteBarrier(
|
||||||
generator, JSGeneratorObject::kResumeModeOffset, resume_type);
|
generator, JSGeneratorObject::kResumeModeOffset, resume_type);
|
||||||
|
|
||||||
|
Label if_instrumentation(this, Label::kDeferred),
|
||||||
|
if_instrumentation_done(this);
|
||||||
|
Branch(IsDebugActive(), &if_instrumentation, &if_instrumentation_done);
|
||||||
|
BIND(&if_instrumentation);
|
||||||
|
{
|
||||||
|
const TNode<JSPromise> promise = LoadObjectField<JSPromise>(
|
||||||
|
next, AsyncGeneratorRequest::kPromiseOffset);
|
||||||
|
CallRuntime(Runtime::kDebugPushPromise, context, promise);
|
||||||
|
Goto(&if_instrumentation_done);
|
||||||
|
}
|
||||||
|
BIND(&if_instrumentation_done);
|
||||||
|
|
||||||
CallStub(CodeFactory::ResumeGenerator(isolate()), context,
|
CallStub(CodeFactory::ResumeGenerator(isolate()), context,
|
||||||
LoadValueFromAsyncGeneratorRequest(next), generator);
|
LoadValueFromAsyncGeneratorRequest(next), generator);
|
||||||
var_state = LoadGeneratorState(generator);
|
var_state = LoadGeneratorState(generator);
|
||||||
|
@ -8,6 +8,8 @@ namespace bigint {
|
|||||||
|
|
||||||
const kPositiveSign: uint32 = 0;
|
const kPositiveSign: uint32 = 0;
|
||||||
const kNegativeSign: uint32 = 1;
|
const kNegativeSign: uint32 = 1;
|
||||||
|
const kGreaterThan: intptr = 1;
|
||||||
|
const kLessThan: intptr = -1;
|
||||||
|
|
||||||
const kMustRoundDownBitShift: uint32 = 30;
|
const kMustRoundDownBitShift: uint32 = 30;
|
||||||
|
|
||||||
@ -798,6 +800,61 @@ builtin BigIntEqual(implicit context: Context)(x: BigInt, y: BigInt): Boolean {
|
|||||||
return True;
|
return True;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Returns r such that r < 0 if |x| < |y|; r > 0 if |x| > |y|;
|
||||||
|
// r == 0 if |x| == |y|.
|
||||||
|
macro BigIntCompareAbsolute(implicit context: Context)(
|
||||||
|
x: BigInt, y: BigInt): intptr {
|
||||||
|
const xlength = ReadBigIntLength(x);
|
||||||
|
const ylength = ReadBigIntLength(y);
|
||||||
|
const diff = xlength - ylength;
|
||||||
|
if (diff != 0) {
|
||||||
|
return diff;
|
||||||
|
}
|
||||||
|
|
||||||
|
// case: {xlength} == {ylength}
|
||||||
|
for (let i: intptr = xlength - 1; i >= 0; --i) {
|
||||||
|
const xdigit = LoadBigIntDigit(x, i);
|
||||||
|
const ydigit = LoadBigIntDigit(y, i);
|
||||||
|
if (xdigit != ydigit) {
|
||||||
|
return (xdigit > ydigit) ? kGreaterThan : kLessThan;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns r such that r < 0 if x < y; r > 0 if x > y; r == 0 if x == y.
|
||||||
|
macro BigIntCompare(implicit context: Context)(x: BigInt, y: BigInt): intptr {
|
||||||
|
const xsign = ReadBigIntSign(x);
|
||||||
|
const ysign = ReadBigIntSign(y);
|
||||||
|
if (xsign != ysign) {
|
||||||
|
return xsign == kPositiveSign ? kGreaterThan : kLessThan;
|
||||||
|
}
|
||||||
|
|
||||||
|
// case: {xsign} == {ysign}
|
||||||
|
const diff = BigIntCompareAbsolute(x, y);
|
||||||
|
return xsign == kPositiveSign ? diff : 0 - diff;
|
||||||
|
}
|
||||||
|
|
||||||
|
builtin BigIntLessThan(implicit context: Context)(
|
||||||
|
x: BigInt, y: BigInt): Boolean {
|
||||||
|
return BigIntCompare(x, y) < 0 ? True : False;
|
||||||
|
}
|
||||||
|
|
||||||
|
builtin BigIntGreaterThan(implicit context: Context)(
|
||||||
|
x: BigInt, y: BigInt): Boolean {
|
||||||
|
return BigIntCompare(x, y) > 0 ? True : False;
|
||||||
|
}
|
||||||
|
|
||||||
|
builtin BigIntLessThanOrEqual(implicit context: Context)(
|
||||||
|
x: BigInt, y: BigInt): Boolean {
|
||||||
|
return BigIntCompare(x, y) <= 0 ? True : False;
|
||||||
|
}
|
||||||
|
|
||||||
|
builtin BigIntGreaterThanOrEqual(implicit context: Context)(
|
||||||
|
x: BigInt, y: BigInt): Boolean {
|
||||||
|
return BigIntCompare(x, y) >= 0 ? True : False;
|
||||||
|
}
|
||||||
|
|
||||||
builtin BigIntUnaryMinus(implicit context: Context)(bigint: BigInt): BigInt {
|
builtin BigIntUnaryMinus(implicit context: Context)(bigint: BigInt): BigInt {
|
||||||
const length = ReadBigIntLength(bigint);
|
const length = ReadBigIntLength(bigint);
|
||||||
|
|
||||||
|
@ -24,6 +24,7 @@ namespace internal {
|
|||||||
isolate->factory()->NewStringFromAsciiChecked(method))); \
|
isolate->factory()->NewStringFromAsciiChecked(method))); \
|
||||||
} \
|
} \
|
||||||
Handle<CallSiteInfo> frame = Handle<CallSiteInfo>::cast(it.GetDataValue())
|
Handle<CallSiteInfo> frame = Handle<CallSiteInfo>::cast(it.GetDataValue())
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
Object PositiveNumberOrNull(int value, Isolate* isolate) {
|
Object PositiveNumberOrNull(int value, Isolate* isolate) {
|
||||||
@ -31,6 +32,10 @@ Object PositiveNumberOrNull(int value, Isolate* isolate) {
|
|||||||
return ReadOnlyRoots(isolate).null_value();
|
return ReadOnlyRoots(isolate).null_value();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool NativeContextIsForShadowRealm(NativeContext native_context) {
|
||||||
|
return native_context.scope_info().scope_type() == SHADOW_REALM_SCOPE;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
BUILTIN(CallSitePrototypeGetColumnNumber) {
|
BUILTIN(CallSitePrototypeGetColumnNumber) {
|
||||||
@ -69,8 +74,13 @@ BUILTIN(CallSitePrototypeGetFunction) {
|
|||||||
static const char method_name[] = "getFunction";
|
static const char method_name[] = "getFunction";
|
||||||
HandleScope scope(isolate);
|
HandleScope scope(isolate);
|
||||||
CHECK_CALLSITE(frame, method_name);
|
CHECK_CALLSITE(frame, method_name);
|
||||||
if (isolate->raw_native_context().scope_info().scope_type() ==
|
// ShadowRealms have a boundary: references to outside objects must not exist
|
||||||
SHADOW_REALM_SCOPE) {
|
// in the ShadowRealm, and references to ShadowRealm objects must not exist
|
||||||
|
// outside the ShadowRealm.
|
||||||
|
if (NativeContextIsForShadowRealm(isolate->raw_native_context()) ||
|
||||||
|
(frame->function().IsJSFunction() &&
|
||||||
|
NativeContextIsForShadowRealm(
|
||||||
|
JSFunction::cast(frame->function()).native_context()))) {
|
||||||
THROW_NEW_ERROR_RETURN_FAILURE(
|
THROW_NEW_ERROR_RETURN_FAILURE(
|
||||||
isolate,
|
isolate,
|
||||||
NewTypeError(
|
NewTypeError(
|
||||||
@ -136,8 +146,13 @@ BUILTIN(CallSitePrototypeGetThis) {
|
|||||||
static const char method_name[] = "getThis";
|
static const char method_name[] = "getThis";
|
||||||
HandleScope scope(isolate);
|
HandleScope scope(isolate);
|
||||||
CHECK_CALLSITE(frame, method_name);
|
CHECK_CALLSITE(frame, method_name);
|
||||||
if (isolate->raw_native_context().scope_info().scope_type() ==
|
// ShadowRealms have a boundary: references to outside objects must not exist
|
||||||
SHADOW_REALM_SCOPE) {
|
// in the ShadowRealm, and references to ShadowRealm objects must not exist
|
||||||
|
// outside the ShadowRealm.
|
||||||
|
if (NativeContextIsForShadowRealm(isolate->raw_native_context()) ||
|
||||||
|
(frame->function().IsJSFunction() &&
|
||||||
|
NativeContextIsForShadowRealm(
|
||||||
|
JSFunction::cast(frame->function()).native_context()))) {
|
||||||
THROW_NEW_ERROR_RETURN_FAILURE(
|
THROW_NEW_ERROR_RETURN_FAILURE(
|
||||||
isolate,
|
isolate,
|
||||||
NewTypeError(
|
NewTypeError(
|
||||||
|
@ -435,8 +435,8 @@ void BaseCollectionsAssembler::GotoIfCannotBeHeldWeakly(
|
|||||||
// TODO(v8:12547) Shared structs and arrays should only be able to point
|
// TODO(v8:12547) Shared structs and arrays should only be able to point
|
||||||
// to shared values in weak collections. For now, disallow them as weak
|
// to shared values in weak collections. For now, disallow them as weak
|
||||||
// collection keys.
|
// collection keys.
|
||||||
GotoIf(IsJSSharedStructInstanceType(instance_type), if_cannot_be_held_weakly);
|
GotoIf(IsAlwaysSharedSpaceJSObjectInstanceType(instance_type),
|
||||||
GotoIf(IsJSSharedArrayInstanceType(instance_type), if_cannot_be_held_weakly);
|
if_cannot_be_held_weakly);
|
||||||
Goto(&end);
|
Goto(&end);
|
||||||
Bind(&check_symbol_key);
|
Bind(&check_symbol_key);
|
||||||
GotoIfNot(HasHarmonySymbolAsWeakmapKeyFlag(), if_cannot_be_held_weakly);
|
GotoIfNot(HasHarmonySymbolAsWeakmapKeyFlag(), if_cannot_be_held_weakly);
|
||||||
@ -1293,10 +1293,7 @@ void CollectionsBuiltinsAssembler::SameValueZeroString(
|
|||||||
GotoIf(TaggedIsSmi(candidate_key), if_not_same);
|
GotoIf(TaggedIsSmi(candidate_key), if_not_same);
|
||||||
GotoIfNot(IsString(CAST(candidate_key)), if_not_same);
|
GotoIfNot(IsString(CAST(candidate_key)), if_not_same);
|
||||||
|
|
||||||
Branch(TaggedEqual(CallBuiltin(Builtin::kStringEqual, NoContextConstant(),
|
BranchIfStringEqual(key_string, CAST(candidate_key), if_same, if_not_same);
|
||||||
key_string, candidate_key),
|
|
||||||
TrueConstant()),
|
|
||||||
if_same, if_not_same);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CollectionsBuiltinsAssembler::SameValueZeroBigInt(
|
void CollectionsBuiltinsAssembler::SameValueZeroBigInt(
|
||||||
|
@ -252,8 +252,7 @@ TF_BUILTIN(FastNewClosure, ConstructorBuiltinsAssembler) {
|
|||||||
StoreObjectFieldNoWriteBarrier(result, JSFunction::kSharedFunctionInfoOffset,
|
StoreObjectFieldNoWriteBarrier(result, JSFunction::kSharedFunctionInfoOffset,
|
||||||
shared_function_info);
|
shared_function_info);
|
||||||
StoreObjectFieldNoWriteBarrier(result, JSFunction::kContextOffset, context);
|
StoreObjectFieldNoWriteBarrier(result, JSFunction::kContextOffset, context);
|
||||||
TNode<CodeT> lazy_builtin =
|
TNode<Code> lazy_builtin = HeapConstant(BUILTIN_CODE(isolate(), CompileLazy));
|
||||||
HeapConstant(BUILTIN_CODE(isolate(), CompileLazy));
|
|
||||||
StoreObjectFieldNoWriteBarrier(result, JSFunction::kCodeOffset, lazy_builtin);
|
StoreObjectFieldNoWriteBarrier(result, JSFunction::kCodeOffset, lazy_builtin);
|
||||||
Return(result);
|
Return(result);
|
||||||
}
|
}
|
||||||
|
30
src/builtins/builtins-data-view-gen.cc
Normal file
30
src/builtins/builtins-data-view-gen.cc
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
// Copyright 2023 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.
|
||||||
|
|
||||||
|
#include "src/builtins/builtins-data-view-gen.h"
|
||||||
|
|
||||||
|
#include "src/builtins/builtins-utils-gen.h"
|
||||||
|
|
||||||
|
namespace v8 {
|
||||||
|
namespace internal {
|
||||||
|
|
||||||
|
// Returns (intptr) a byte length value from [0..JSArrayBuffer::kMaxLength]
|
||||||
|
// If it fails (due to detached or OOB), it returns -1.
|
||||||
|
TF_BUILTIN(DataViewGetVariableLength, DataViewBuiltinsAssembler) {
|
||||||
|
auto dataview = Parameter<JSDataView>(Descriptor::kDataView);
|
||||||
|
CSA_CHECK(this, IsVariableLengthJSArrayBufferView(dataview));
|
||||||
|
|
||||||
|
Label detached_or_oob(this);
|
||||||
|
auto buffer =
|
||||||
|
LoadObjectField<JSArrayBuffer>(dataview, JSDataView::kBufferOffset);
|
||||||
|
TNode<UintPtrT> byte_length = LoadVariableLengthJSArrayBufferViewByteLength(
|
||||||
|
dataview, buffer, &detached_or_oob);
|
||||||
|
Return(byte_length);
|
||||||
|
|
||||||
|
BIND(&detached_or_oob);
|
||||||
|
Return(IntPtrConstant(-1));
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace internal
|
||||||
|
} // namespace v8
|
@ -207,18 +207,11 @@ TF_BUILTIN(DatePrototypeToPrimitive, CodeStubAssembler) {
|
|||||||
// Slow-case with actual string comparisons.
|
// Slow-case with actual string comparisons.
|
||||||
GotoIf(TaggedIsSmi(hint), &hint_is_invalid);
|
GotoIf(TaggedIsSmi(hint), &hint_is_invalid);
|
||||||
GotoIfNot(IsString(CAST(hint)), &hint_is_invalid);
|
GotoIfNot(IsString(CAST(hint)), &hint_is_invalid);
|
||||||
GotoIf(TaggedEqual(
|
|
||||||
CallBuiltin(Builtin::kStringEqual, context, hint, number_string),
|
TNode<IntPtrT> hint_length = LoadStringLengthAsWord(CAST(hint));
|
||||||
TrueConstant()),
|
GotoIfStringEqual(CAST(hint), hint_length, number_string, &hint_is_number);
|
||||||
&hint_is_number);
|
GotoIfStringEqual(CAST(hint), hint_length, default_string, &hint_is_string);
|
||||||
GotoIf(TaggedEqual(
|
GotoIfStringEqual(CAST(hint), hint_length, string_string, &hint_is_string);
|
||||||
CallBuiltin(Builtin::kStringEqual, context, hint, default_string),
|
|
||||||
TrueConstant()),
|
|
||||||
&hint_is_string);
|
|
||||||
GotoIf(TaggedEqual(
|
|
||||||
CallBuiltin(Builtin::kStringEqual, context, hint, string_string),
|
|
||||||
TrueConstant()),
|
|
||||||
&hint_is_string);
|
|
||||||
Goto(&hint_is_invalid);
|
Goto(&hint_is_invalid);
|
||||||
|
|
||||||
// Use the OrdinaryToPrimitive builtin to convert to a Number.
|
// Use the OrdinaryToPrimitive builtin to convert to a Number.
|
||||||
|
@ -160,7 +160,7 @@ namespace internal {
|
|||||||
\
|
\
|
||||||
/* String helpers */ \
|
/* String helpers */ \
|
||||||
TFC(StringFromCodePointAt, StringAtAsString) \
|
TFC(StringFromCodePointAt, StringAtAsString) \
|
||||||
TFC(StringEqual, Compare) \
|
TFC(StringEqual, StringEqual) \
|
||||||
TFC(StringGreaterThan, Compare) \
|
TFC(StringGreaterThan, Compare) \
|
||||||
TFC(StringGreaterThanOrEqual, Compare) \
|
TFC(StringGreaterThanOrEqual, Compare) \
|
||||||
TFC(StringLessThan, Compare) \
|
TFC(StringLessThan, Compare) \
|
||||||
@ -198,7 +198,6 @@ namespace internal {
|
|||||||
\
|
\
|
||||||
/* Maglev Compiler */ \
|
/* Maglev Compiler */ \
|
||||||
ASM(MaglevOnStackReplacement, OnStackReplacement) \
|
ASM(MaglevOnStackReplacement, OnStackReplacement) \
|
||||||
ASM(MaglevOutOfLinePrologue, NoContext) \
|
|
||||||
\
|
\
|
||||||
/* Code life-cycle */ \
|
/* Code life-cycle */ \
|
||||||
TFC(CompileLazy, JSTrampoline) \
|
TFC(CompileLazy, JSTrampoline) \
|
||||||
@ -399,6 +398,7 @@ namespace internal {
|
|||||||
CPP(ArrayShift) \
|
CPP(ArrayShift) \
|
||||||
/* ES6 #sec-array.prototype.unshift */ \
|
/* ES6 #sec-array.prototype.unshift */ \
|
||||||
CPP(ArrayUnshift) \
|
CPP(ArrayUnshift) \
|
||||||
|
CPP(ArrayFromAsync) \
|
||||||
/* Support for Array.from and other array-copying idioms */ \
|
/* Support for Array.from and other array-copying idioms */ \
|
||||||
TFS(CloneFastJSArray, kSource) \
|
TFS(CloneFastJSArray, kSource) \
|
||||||
TFS(CloneFastJSArrayFillingHoles, kSource) \
|
TFS(CloneFastJSArrayFillingHoles, kSource) \
|
||||||
@ -502,6 +502,7 @@ namespace internal {
|
|||||||
/* DataView */ \
|
/* DataView */ \
|
||||||
/* ES #sec-dataview-constructor */ \
|
/* ES #sec-dataview-constructor */ \
|
||||||
CPP(DataViewConstructor) \
|
CPP(DataViewConstructor) \
|
||||||
|
TFC(DataViewGetVariableLength, DataViewGetVariableLength) \
|
||||||
\
|
\
|
||||||
/* Date */ \
|
/* Date */ \
|
||||||
/* ES #sec-date-constructor */ \
|
/* ES #sec-date-constructor */ \
|
||||||
@ -625,10 +626,6 @@ namespace internal {
|
|||||||
CPP(JsonRawJson) \
|
CPP(JsonRawJson) \
|
||||||
CPP(JsonIsRawJson) \
|
CPP(JsonIsRawJson) \
|
||||||
\
|
\
|
||||||
/* Web snapshots */ \
|
|
||||||
CPP(WebSnapshotSerialize) \
|
|
||||||
CPP(WebSnapshotDeserialize) \
|
|
||||||
\
|
|
||||||
/* ICs */ \
|
/* ICs */ \
|
||||||
TFH(LoadIC, LoadWithVector) \
|
TFH(LoadIC, LoadWithVector) \
|
||||||
TFH(LoadIC_Megamorphic, LoadWithVector) \
|
TFH(LoadIC_Megamorphic, LoadWithVector) \
|
||||||
@ -655,9 +652,9 @@ namespace internal {
|
|||||||
TFH(KeyedStoreIC, StoreWithVector) \
|
TFH(KeyedStoreIC, StoreWithVector) \
|
||||||
TFH(KeyedStoreICTrampoline, Store) \
|
TFH(KeyedStoreICTrampoline, Store) \
|
||||||
TFH(KeyedStoreICBaseline, StoreBaseline) \
|
TFH(KeyedStoreICBaseline, StoreBaseline) \
|
||||||
TFH(DefineKeyedOwnIC, StoreWithVector) \
|
TFH(DefineKeyedOwnIC, DefineKeyedOwnWithVector) \
|
||||||
TFH(DefineKeyedOwnICTrampoline, Store) \
|
TFH(DefineKeyedOwnICTrampoline, DefineKeyedOwn) \
|
||||||
TFH(DefineKeyedOwnICBaseline, StoreBaseline) \
|
TFH(DefineKeyedOwnICBaseline, DefineKeyedOwnBaseline) \
|
||||||
TFH(StoreInArrayLiteralIC, StoreWithVector) \
|
TFH(StoreInArrayLiteralIC, StoreWithVector) \
|
||||||
TFH(StoreInArrayLiteralICBaseline, StoreBaseline) \
|
TFH(StoreInArrayLiteralICBaseline, StoreBaseline) \
|
||||||
TFH(LookupContextTrampoline, LookupTrampoline) \
|
TFH(LookupContextTrampoline, LookupTrampoline) \
|
||||||
@ -896,7 +893,8 @@ namespace internal {
|
|||||||
kSpecifier, kExportName) \
|
kSpecifier, kExportName) \
|
||||||
TFJ(ShadowRealmImportValueFulfilled, kJSArgcReceiverSlots + 1, kReceiver, \
|
TFJ(ShadowRealmImportValueFulfilled, kJSArgcReceiverSlots + 1, kReceiver, \
|
||||||
kExports) \
|
kExports) \
|
||||||
TFJ(ShadowRealmImportValueRejected, kDontAdaptArgumentsSentinel) \
|
TFJ(ShadowRealmImportValueRejected, kJSArgcReceiverSlots + 1, kReceiver, \
|
||||||
|
kException) \
|
||||||
\
|
\
|
||||||
/* SharedArrayBuffer */ \
|
/* SharedArrayBuffer */ \
|
||||||
CPP(SharedArrayBufferPrototypeGetByteLength) \
|
CPP(SharedArrayBufferPrototypeGetByteLength) \
|
||||||
@ -1072,17 +1070,12 @@ namespace internal {
|
|||||||
TFJ(AsyncIteratorValueUnwrap, kJSArgcReceiverSlots + 1, kReceiver, kValue) \
|
TFJ(AsyncIteratorValueUnwrap, kJSArgcReceiverSlots + 1, kReceiver, kValue) \
|
||||||
\
|
\
|
||||||
/* CEntry */ \
|
/* CEntry */ \
|
||||||
ASM(CEntry_Return1_DontSaveFPRegs_ArgvOnStack_NoBuiltinExit, CEntryDummy) \
|
ASM(CEntry_Return1_ArgvInRegister_NoBuiltinExit, CEntryDummy) \
|
||||||
ASM(CEntry_Return1_DontSaveFPRegs_ArgvOnStack_BuiltinExit, \
|
ASM(CEntry_Return1_ArgvOnStack_BuiltinExit, CEntry1ArgvOnStack) \
|
||||||
CEntry1ArgvOnStack) \
|
ASM(CEntry_Return1_ArgvOnStack_NoBuiltinExit, CEntryDummy) \
|
||||||
ASM(CEntry_Return1_DontSaveFPRegs_ArgvInRegister_NoBuiltinExit, CEntryDummy) \
|
ASM(CEntry_Return2_ArgvInRegister_NoBuiltinExit, CEntryDummy) \
|
||||||
ASM(CEntry_Return1_SaveFPRegs_ArgvOnStack_NoBuiltinExit, CEntryDummy) \
|
ASM(CEntry_Return2_ArgvOnStack_BuiltinExit, CEntryDummy) \
|
||||||
ASM(CEntry_Return1_SaveFPRegs_ArgvOnStack_BuiltinExit, CEntryDummy) \
|
ASM(CEntry_Return2_ArgvOnStack_NoBuiltinExit, CEntryDummy) \
|
||||||
ASM(CEntry_Return2_DontSaveFPRegs_ArgvOnStack_NoBuiltinExit, CEntryDummy) \
|
|
||||||
ASM(CEntry_Return2_DontSaveFPRegs_ArgvOnStack_BuiltinExit, CEntryDummy) \
|
|
||||||
ASM(CEntry_Return2_DontSaveFPRegs_ArgvInRegister_NoBuiltinExit, CEntryDummy) \
|
|
||||||
ASM(CEntry_Return2_SaveFPRegs_ArgvOnStack_NoBuiltinExit, CEntryDummy) \
|
|
||||||
ASM(CEntry_Return2_SaveFPRegs_ArgvOnStack_BuiltinExit, CEntryDummy) \
|
|
||||||
ASM(DirectCEntry, CEntryDummy) \
|
ASM(DirectCEntry, CEntryDummy) \
|
||||||
\
|
\
|
||||||
/* String helpers */ \
|
/* String helpers */ \
|
||||||
|
@ -5,10 +5,9 @@
|
|||||||
#ifndef V8_BUILTINS_BUILTINS_DESCRIPTORS_H_
|
#ifndef V8_BUILTINS_BUILTINS_DESCRIPTORS_H_
|
||||||
#define V8_BUILTINS_BUILTINS_DESCRIPTORS_H_
|
#define V8_BUILTINS_BUILTINS_DESCRIPTORS_H_
|
||||||
|
|
||||||
#include "src/builtins/builtins.h"
|
#include "src/builtins/builtins-definitions.h"
|
||||||
#include "src/codegen/interface-descriptors.h"
|
#include "src/codegen/interface-descriptors.h"
|
||||||
#include "src/compiler/code-assembler.h"
|
#include "src/common/globals.h"
|
||||||
#include "src/objects/shared-function-info.h"
|
|
||||||
|
|
||||||
namespace v8 {
|
namespace v8 {
|
||||||
namespace internal {
|
namespace internal {
|
||||||
@ -17,7 +16,7 @@ namespace internal {
|
|||||||
#define DEFINE_TFJ_INTERFACE_DESCRIPTOR(Name, Argc, ...) \
|
#define DEFINE_TFJ_INTERFACE_DESCRIPTOR(Name, Argc, ...) \
|
||||||
struct Builtin_##Name##_InterfaceDescriptor { \
|
struct Builtin_##Name##_InterfaceDescriptor { \
|
||||||
enum ParameterIndices { \
|
enum ParameterIndices { \
|
||||||
kJSTarget = compiler::CodeAssembler::kTargetParameterIndex, \
|
kJSTarget = kJSCallClosureParameterIndex, \
|
||||||
##__VA_ARGS__, \
|
##__VA_ARGS__, \
|
||||||
kJSNewTarget, \
|
kJSNewTarget, \
|
||||||
kJSActualArgumentsCount, \
|
kJSActualArgumentsCount, \
|
||||||
|
@ -52,7 +52,7 @@ BUILTIN(ErrorCaptureStackTrace) {
|
|||||||
|
|
||||||
// Explicitly check for frozen objects. Other access checks are performed by
|
// Explicitly check for frozen objects. Other access checks are performed by
|
||||||
// the LookupIterator in SetAccessor below.
|
// the LookupIterator in SetAccessor below.
|
||||||
if (!JSObject::IsExtensible(object)) {
|
if (!JSObject::IsExtensible(isolate, object)) {
|
||||||
return isolate->Throw(*isolate->factory()->NewTypeError(
|
return isolate->Throw(*isolate->factory()->NewTypeError(
|
||||||
MessageTemplate::kDefineDisallowed, name));
|
MessageTemplate::kDefineDisallowed, name));
|
||||||
}
|
}
|
||||||
|
@ -104,7 +104,7 @@ TF_BUILTIN(DebugBreakTrampoline, CodeStubAssembler) {
|
|||||||
|
|
||||||
BIND(&tailcall_to_shared);
|
BIND(&tailcall_to_shared);
|
||||||
// Tail call into code object on the SharedFunctionInfo.
|
// Tail call into code object on the SharedFunctionInfo.
|
||||||
TNode<CodeT> code = GetSharedFunctionInfoCode(shared);
|
TNode<Code> code = GetSharedFunctionInfoCode(shared);
|
||||||
TailCallJSCode(code, context, function, new_target, arg_count);
|
TailCallJSCode(code, context, function, new_target, arg_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1230,9 +1230,8 @@ TF_BUILTIN(AdaptorWithBuiltinExitFrame, CodeStubAssembler) {
|
|||||||
Int32Constant(BuiltinExitFrameConstants::kNumExtraArgsWithoutReceiver));
|
Int32Constant(BuiltinExitFrameConstants::kNumExtraArgsWithoutReceiver));
|
||||||
|
|
||||||
const bool builtin_exit_frame = true;
|
const bool builtin_exit_frame = true;
|
||||||
TNode<CodeT> code =
|
TNode<Code> code = HeapConstant(
|
||||||
HeapConstant(CodeFactory::CEntry(isolate(), 1, SaveFPRegsMode::kIgnore,
|
CodeFactory::CEntry(isolate(), 1, ArgvMode::kStack, builtin_exit_frame));
|
||||||
ArgvMode::kStack, builtin_exit_frame));
|
|
||||||
|
|
||||||
// Unconditionally push argc, target and new target as extra stack arguments.
|
// Unconditionally push argc, target and new target as extra stack arguments.
|
||||||
// They will be used by stack frame iterators when constructing stack trace.
|
// They will be used by stack frame iterators when constructing stack trace.
|
||||||
@ -1304,56 +1303,34 @@ TF_BUILTIN(AbortCSADcheck, CodeStubAssembler) {
|
|||||||
TailCallRuntime(Runtime::kAbortCSADcheck, NoContextConstant(), message);
|
TailCallRuntime(Runtime::kAbortCSADcheck, NoContextConstant(), message);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Builtins::Generate_CEntry_Return1_DontSaveFPRegs_ArgvOnStack_NoBuiltinExit(
|
void Builtins::Generate_CEntry_Return1_ArgvOnStack_NoBuiltinExit(
|
||||||
MacroAssembler* masm) {
|
MacroAssembler* masm) {
|
||||||
Generate_CEntry(masm, 1, SaveFPRegsMode::kIgnore, ArgvMode::kStack, false);
|
Generate_CEntry(masm, 1, ArgvMode::kStack, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Builtins::Generate_CEntry_Return1_DontSaveFPRegs_ArgvOnStack_BuiltinExit(
|
void Builtins::Generate_CEntry_Return1_ArgvOnStack_BuiltinExit(
|
||||||
MacroAssembler* masm) {
|
MacroAssembler* masm) {
|
||||||
Generate_CEntry(masm, 1, SaveFPRegsMode::kIgnore, ArgvMode::kStack, true);
|
Generate_CEntry(masm, 1, ArgvMode::kStack, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Builtins::
|
void Builtins::Generate_CEntry_Return1_ArgvInRegister_NoBuiltinExit(
|
||||||
Generate_CEntry_Return1_DontSaveFPRegs_ArgvInRegister_NoBuiltinExit(
|
|
||||||
MacroAssembler* masm) {
|
MacroAssembler* masm) {
|
||||||
Generate_CEntry(masm, 1, SaveFPRegsMode::kIgnore, ArgvMode::kRegister, false);
|
Generate_CEntry(masm, 1, ArgvMode::kRegister, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Builtins::Generate_CEntry_Return1_SaveFPRegs_ArgvOnStack_NoBuiltinExit(
|
void Builtins::Generate_CEntry_Return2_ArgvOnStack_NoBuiltinExit(
|
||||||
MacroAssembler* masm) {
|
MacroAssembler* masm) {
|
||||||
Generate_CEntry(masm, 1, SaveFPRegsMode::kSave, ArgvMode::kStack, false);
|
Generate_CEntry(masm, 2, ArgvMode::kStack, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Builtins::Generate_CEntry_Return1_SaveFPRegs_ArgvOnStack_BuiltinExit(
|
void Builtins::Generate_CEntry_Return2_ArgvOnStack_BuiltinExit(
|
||||||
MacroAssembler* masm) {
|
MacroAssembler* masm) {
|
||||||
Generate_CEntry(masm, 1, SaveFPRegsMode::kSave, ArgvMode::kStack, true);
|
Generate_CEntry(masm, 2, ArgvMode::kStack, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Builtins::Generate_CEntry_Return2_DontSaveFPRegs_ArgvOnStack_NoBuiltinExit(
|
void Builtins::Generate_CEntry_Return2_ArgvInRegister_NoBuiltinExit(
|
||||||
MacroAssembler* masm) {
|
MacroAssembler* masm) {
|
||||||
Generate_CEntry(masm, 2, SaveFPRegsMode::kIgnore, ArgvMode::kStack, false);
|
Generate_CEntry(masm, 2, ArgvMode::kRegister, false);
|
||||||
}
|
|
||||||
|
|
||||||
void Builtins::Generate_CEntry_Return2_DontSaveFPRegs_ArgvOnStack_BuiltinExit(
|
|
||||||
MacroAssembler* masm) {
|
|
||||||
Generate_CEntry(masm, 2, SaveFPRegsMode::kIgnore, ArgvMode::kStack, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Builtins::
|
|
||||||
Generate_CEntry_Return2_DontSaveFPRegs_ArgvInRegister_NoBuiltinExit(
|
|
||||||
MacroAssembler* masm) {
|
|
||||||
Generate_CEntry(masm, 2, SaveFPRegsMode::kIgnore, ArgvMode::kRegister, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Builtins::Generate_CEntry_Return2_SaveFPRegs_ArgvOnStack_NoBuiltinExit(
|
|
||||||
MacroAssembler* masm) {
|
|
||||||
Generate_CEntry(masm, 2, SaveFPRegsMode::kSave, ArgvMode::kStack, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Builtins::Generate_CEntry_Return2_SaveFPRegs_ArgvOnStack_BuiltinExit(
|
|
||||||
MacroAssembler* masm) {
|
|
||||||
Generate_CEntry(masm, 2, SaveFPRegsMode::kSave, ArgvMode::kStack, true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined(V8_TARGET_ARCH_ARM)
|
#if !defined(V8_TARGET_ARCH_ARM)
|
||||||
@ -1396,12 +1373,6 @@ void Builtins::Generate_MaglevOnStackReplacement(MacroAssembler* masm) {
|
|||||||
static_assert(D::kParameterCount == 1);
|
static_assert(D::kParameterCount == 1);
|
||||||
masm->Trap();
|
masm->Trap();
|
||||||
}
|
}
|
||||||
void Builtins::Generate_MaglevOutOfLinePrologue(MacroAssembler* masm) {
|
|
||||||
using D =
|
|
||||||
i::CallInterfaceDescriptorFor<Builtin::kMaglevOutOfLinePrologue>::type;
|
|
||||||
static_assert(D::kParameterCount == 0);
|
|
||||||
masm->Trap();
|
|
||||||
}
|
|
||||||
#endif // V8_TARGET_ARCH_X64
|
#endif // V8_TARGET_ARCH_X64
|
||||||
|
|
||||||
// ES6 [[Get]] operation.
|
// ES6 [[Get]] operation.
|
||||||
@ -1591,7 +1562,7 @@ TF_BUILTIN(InstantiateAsmJs, CodeStubAssembler) {
|
|||||||
// On failure, tail call back to regular JavaScript by re-calling the given
|
// On failure, tail call back to regular JavaScript by re-calling the given
|
||||||
// function which has been reset to the compile lazy builtin.
|
// function which has been reset to the compile lazy builtin.
|
||||||
|
|
||||||
TNode<CodeT> code = LoadJSFunctionCode(function);
|
TNode<Code> code = LoadJSFunctionCode(function);
|
||||||
TailCallJSCode(code, context, function, new_target, arg_count);
|
TailCallJSCode(code, context, function, new_target, arg_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -113,10 +113,6 @@ void IntlBuiltinsAssembler::ToLowerCaseImpl(
|
|||||||
ToLowerCaseKind kind, std::function<void(TNode<Object>)> ReturnFct) {
|
ToLowerCaseKind kind, std::function<void(TNode<Object>)> ReturnFct) {
|
||||||
Label call_c(this), return_string(this), runtime(this, Label::kDeferred);
|
Label call_c(this), return_string(this), runtime(this, Label::kDeferred);
|
||||||
|
|
||||||
// Early exit on empty strings.
|
|
||||||
const TNode<Uint32T> length = LoadStringLengthAsWord32(string);
|
|
||||||
GotoIf(Word32Equal(length, Uint32Constant(0)), &return_string);
|
|
||||||
|
|
||||||
// Unpack strings if possible, and bail to runtime unless we get a one-byte
|
// Unpack strings if possible, and bail to runtime unless we get a one-byte
|
||||||
// flat string.
|
// flat string.
|
||||||
ToDirectStringAssembler to_direct(
|
ToDirectStringAssembler to_direct(
|
||||||
@ -153,6 +149,10 @@ void IntlBuiltinsAssembler::ToLowerCaseImpl(
|
|||||||
Bind(&fast);
|
Bind(&fast);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Early exit on empty string.
|
||||||
|
const TNode<Uint32T> length = LoadStringLengthAsWord32(string);
|
||||||
|
GotoIf(Word32Equal(length, Uint32Constant(0)), &return_string);
|
||||||
|
|
||||||
const TNode<Int32T> instance_type = to_direct.instance_type();
|
const TNode<Int32T> instance_type = to_direct.instance_type();
|
||||||
CSA_DCHECK(this,
|
CSA_DCHECK(this,
|
||||||
Word32BinaryNot(IsIndirectStringInstanceType(instance_type)));
|
Word32BinaryNot(IsIndirectStringInstanceType(instance_type)));
|
||||||
|
@ -15,7 +15,7 @@ namespace v8 {
|
|||||||
namespace internal {
|
namespace internal {
|
||||||
|
|
||||||
void LazyBuiltinsAssembler::GenerateTailCallToJSCode(
|
void LazyBuiltinsAssembler::GenerateTailCallToJSCode(
|
||||||
TNode<CodeT> code, TNode<JSFunction> function) {
|
TNode<Code> code, TNode<JSFunction> function) {
|
||||||
auto argc = UncheckedParameter<Int32T>(Descriptor::kActualArgumentsCount);
|
auto argc = UncheckedParameter<Int32T>(Descriptor::kActualArgumentsCount);
|
||||||
auto context = Parameter<Context>(Descriptor::kContext);
|
auto context = Parameter<Context>(Descriptor::kContext);
|
||||||
auto new_target = Parameter<Object>(Descriptor::kNewTarget);
|
auto new_target = Parameter<Object>(Descriptor::kNewTarget);
|
||||||
@ -25,7 +25,7 @@ void LazyBuiltinsAssembler::GenerateTailCallToJSCode(
|
|||||||
void LazyBuiltinsAssembler::GenerateTailCallToReturnedCode(
|
void LazyBuiltinsAssembler::GenerateTailCallToReturnedCode(
|
||||||
Runtime::FunctionId function_id, TNode<JSFunction> function) {
|
Runtime::FunctionId function_id, TNode<JSFunction> function) {
|
||||||
auto context = Parameter<Context>(Descriptor::kContext);
|
auto context = Parameter<Context>(Descriptor::kContext);
|
||||||
TNode<CodeT> code = CAST(CallRuntime(function_id, context, function));
|
TNode<Code> code = CAST(CallRuntime(function_id, context, function));
|
||||||
GenerateTailCallToJSCode(code, function);
|
GenerateTailCallToJSCode(code, function);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -63,8 +63,8 @@ void LazyBuiltinsAssembler::MaybeTailCallOptimizedCodeSlot(
|
|||||||
TNode<MaybeObject> maybe_optimized_code_entry = LoadMaybeWeakObjectField(
|
TNode<MaybeObject> maybe_optimized_code_entry = LoadMaybeWeakObjectField(
|
||||||
feedback_vector, FeedbackVector::kMaybeOptimizedCodeOffset);
|
feedback_vector, FeedbackVector::kMaybeOptimizedCodeOffset);
|
||||||
|
|
||||||
// Optimized code slot is a weak reference to CodeT object.
|
// Optimized code slot is a weak reference to Code object.
|
||||||
TNode<CodeT> optimized_code = CAST(GetHeapObjectAssumeWeak(
|
TNode<Code> optimized_code = CAST(GetHeapObjectAssumeWeak(
|
||||||
maybe_optimized_code_entry, &heal_optimized_code_slot));
|
maybe_optimized_code_entry, &heal_optimized_code_slot));
|
||||||
|
|
||||||
// Check if the optimized code is marked for deopt. If it is, call the
|
// Check if the optimized code is marked for deopt. If it is, call the
|
||||||
@ -100,7 +100,7 @@ void LazyBuiltinsAssembler::CompileLazy(TNode<JSFunction> function) {
|
|||||||
TNode<SharedFunctionInfo> shared =
|
TNode<SharedFunctionInfo> shared =
|
||||||
CAST(LoadObjectField(function, JSFunction::kSharedFunctionInfoOffset));
|
CAST(LoadObjectField(function, JSFunction::kSharedFunctionInfoOffset));
|
||||||
TVARIABLE(Uint16T, sfi_data_type);
|
TVARIABLE(Uint16T, sfi_data_type);
|
||||||
TNode<CodeT> sfi_code =
|
TNode<Code> sfi_code =
|
||||||
GetSharedFunctionInfoCode(shared, &sfi_data_type, &compile_function);
|
GetSharedFunctionInfoCode(shared, &sfi_data_type, &compile_function);
|
||||||
|
|
||||||
TNode<HeapObject> feedback_cell_value = LoadFeedbackCellValue(function);
|
TNode<HeapObject> feedback_cell_value = LoadFeedbackCellValue(function);
|
||||||
@ -124,22 +124,23 @@ void LazyBuiltinsAssembler::CompileLazy(TNode<JSFunction> function) {
|
|||||||
MaybeTailCallOptimizedCodeSlot(function, CAST(feedback_cell_value));
|
MaybeTailCallOptimizedCodeSlot(function, CAST(feedback_cell_value));
|
||||||
Goto(&maybe_use_sfi_code);
|
Goto(&maybe_use_sfi_code);
|
||||||
|
|
||||||
// At this point we have a candidate Code object. It's *not* a cached
|
// At this point we have a candidate InstructionStream object. It's *not* a
|
||||||
// optimized Code object (we'd have tail-called it above). A usual case would
|
// cached optimized InstructionStream object (we'd have tail-called it above).
|
||||||
// be the InterpreterEntryTrampoline to start executing existing bytecode.
|
// A usual case would be the InterpreterEntryTrampoline to start executing
|
||||||
|
// existing bytecode.
|
||||||
BIND(&maybe_use_sfi_code);
|
BIND(&maybe_use_sfi_code);
|
||||||
Label tailcall_code(this), baseline(this);
|
Label tailcall_code(this), baseline(this);
|
||||||
TVARIABLE(CodeT, code);
|
TVARIABLE(Code, code);
|
||||||
|
|
||||||
// Check if we have baseline code.
|
// Check if we have baseline code.
|
||||||
GotoIf(InstanceTypeEqual(sfi_data_type.value(), CODET_TYPE), &baseline);
|
GotoIf(InstanceTypeEqual(sfi_data_type.value(), CODE_TYPE), &baseline);
|
||||||
|
|
||||||
code = sfi_code;
|
code = sfi_code;
|
||||||
Goto(&tailcall_code);
|
Goto(&tailcall_code);
|
||||||
|
|
||||||
BIND(&baseline);
|
BIND(&baseline);
|
||||||
// Ensure we have a feedback vector.
|
// Ensure we have a feedback vector.
|
||||||
code = Select<CodeT>(
|
code = Select<Code>(
|
||||||
IsFeedbackVector(feedback_cell_value), [=]() { return sfi_code; },
|
IsFeedbackVector(feedback_cell_value), [=]() { return sfi_code; },
|
||||||
[=]() {
|
[=]() {
|
||||||
return CAST(CallRuntime(Runtime::kInstallBaselineCode,
|
return CAST(CallRuntime(Runtime::kInstallBaselineCode,
|
||||||
@ -164,7 +165,7 @@ TF_BUILTIN(CompileLazy, LazyBuiltinsAssembler) {
|
|||||||
TF_BUILTIN(CompileLazyDeoptimizedCode, LazyBuiltinsAssembler) {
|
TF_BUILTIN(CompileLazyDeoptimizedCode, LazyBuiltinsAssembler) {
|
||||||
auto function = Parameter<JSFunction>(Descriptor::kTarget);
|
auto function = Parameter<JSFunction>(Descriptor::kTarget);
|
||||||
|
|
||||||
TNode<CodeT> code = HeapConstant(BUILTIN_CODE(isolate(), CompileLazy));
|
TNode<Code> code = HeapConstant(BUILTIN_CODE(isolate(), CompileLazy));
|
||||||
// Set the code slot inside the JSFunction to CompileLazy.
|
// Set the code slot inside the JSFunction to CompileLazy.
|
||||||
StoreObjectField(function, JSFunction::kCodeOffset, code);
|
StoreObjectField(function, JSFunction::kCodeOffset, code);
|
||||||
GenerateTailCallToJSCode(code, function);
|
GenerateTailCallToJSCode(code, function);
|
||||||
|
@ -17,7 +17,7 @@ class LazyBuiltinsAssembler : public CodeStubAssembler {
|
|||||||
explicit LazyBuiltinsAssembler(compiler::CodeAssemblerState* state)
|
explicit LazyBuiltinsAssembler(compiler::CodeAssemblerState* state)
|
||||||
: CodeStubAssembler(state) {}
|
: CodeStubAssembler(state) {}
|
||||||
|
|
||||||
void GenerateTailCallToJSCode(TNode<CodeT> code, TNode<JSFunction> function);
|
void GenerateTailCallToJSCode(TNode<Code> code, TNode<JSFunction> function);
|
||||||
|
|
||||||
void GenerateTailCallToReturnedCode(Runtime::FunctionId function_id,
|
void GenerateTailCallToReturnedCode(Runtime::FunctionId function_id,
|
||||||
TNode<JSFunction> function);
|
TNode<JSFunction> function);
|
||||||
|
@ -148,11 +148,7 @@ Object ObjectLookupAccessor(Isolate* isolate, Handle<Object> object,
|
|||||||
}
|
}
|
||||||
return ObjectLookupAccessor(isolate, prototype, key, component);
|
return ObjectLookupAccessor(isolate, prototype, key, component);
|
||||||
}
|
}
|
||||||
|
|
||||||
case LookupIterator::WASM_OBJECT:
|
case LookupIterator::WASM_OBJECT:
|
||||||
THROW_NEW_ERROR_RETURN_FAILURE(
|
|
||||||
isolate, NewTypeError(MessageTemplate::kWasmObjectsAreOpaque));
|
|
||||||
|
|
||||||
case LookupIterator::INTEGER_INDEXED_EXOTIC:
|
case LookupIterator::INTEGER_INDEXED_EXOTIC:
|
||||||
case LookupIterator::DATA:
|
case LookupIterator::DATA:
|
||||||
return ReadOnlyRoots(isolate).undefined_value();
|
return ReadOnlyRoots(isolate).undefined_value();
|
||||||
@ -219,7 +215,8 @@ BUILTIN(ObjectFreeze) {
|
|||||||
HandleScope scope(isolate);
|
HandleScope scope(isolate);
|
||||||
Handle<Object> object = args.atOrUndefined(isolate, 1);
|
Handle<Object> object = args.atOrUndefined(isolate, 1);
|
||||||
if (object->IsJSReceiver()) {
|
if (object->IsJSReceiver()) {
|
||||||
MAYBE_RETURN(JSReceiver::SetIntegrityLevel(Handle<JSReceiver>::cast(object),
|
MAYBE_RETURN(
|
||||||
|
JSReceiver::SetIntegrityLevel(isolate, Handle<JSReceiver>::cast(object),
|
||||||
FROZEN, kThrowOnError),
|
FROZEN, kThrowOnError),
|
||||||
ReadOnlyRoots(isolate).exception());
|
ReadOnlyRoots(isolate).exception());
|
||||||
}
|
}
|
||||||
@ -299,9 +296,10 @@ BUILTIN(ObjectGetOwnPropertySymbols) {
|
|||||||
BUILTIN(ObjectIsFrozen) {
|
BUILTIN(ObjectIsFrozen) {
|
||||||
HandleScope scope(isolate);
|
HandleScope scope(isolate);
|
||||||
Handle<Object> object = args.atOrUndefined(isolate, 1);
|
Handle<Object> object = args.atOrUndefined(isolate, 1);
|
||||||
Maybe<bool> result = object->IsJSReceiver()
|
Maybe<bool> result =
|
||||||
|
object->IsJSReceiver()
|
||||||
? JSReceiver::TestIntegrityLevel(
|
? JSReceiver::TestIntegrityLevel(
|
||||||
Handle<JSReceiver>::cast(object), FROZEN)
|
isolate, Handle<JSReceiver>::cast(object), FROZEN)
|
||||||
: Just(true);
|
: Just(true);
|
||||||
MAYBE_RETURN(result, ReadOnlyRoots(isolate).exception());
|
MAYBE_RETURN(result, ReadOnlyRoots(isolate).exception());
|
||||||
return isolate->heap()->ToBoolean(result.FromJust());
|
return isolate->heap()->ToBoolean(result.FromJust());
|
||||||
@ -311,9 +309,10 @@ BUILTIN(ObjectIsFrozen) {
|
|||||||
BUILTIN(ObjectIsSealed) {
|
BUILTIN(ObjectIsSealed) {
|
||||||
HandleScope scope(isolate);
|
HandleScope scope(isolate);
|
||||||
Handle<Object> object = args.atOrUndefined(isolate, 1);
|
Handle<Object> object = args.atOrUndefined(isolate, 1);
|
||||||
Maybe<bool> result = object->IsJSReceiver()
|
Maybe<bool> result =
|
||||||
|
object->IsJSReceiver()
|
||||||
? JSReceiver::TestIntegrityLevel(
|
? JSReceiver::TestIntegrityLevel(
|
||||||
Handle<JSReceiver>::cast(object), SEALED)
|
isolate, Handle<JSReceiver>::cast(object), SEALED)
|
||||||
: Just(true);
|
: Just(true);
|
||||||
MAYBE_RETURN(result, ReadOnlyRoots(isolate).exception());
|
MAYBE_RETURN(result, ReadOnlyRoots(isolate).exception());
|
||||||
return isolate->heap()->ToBoolean(result.FromJust());
|
return isolate->heap()->ToBoolean(result.FromJust());
|
||||||
@ -360,7 +359,8 @@ BUILTIN(ObjectSeal) {
|
|||||||
HandleScope scope(isolate);
|
HandleScope scope(isolate);
|
||||||
Handle<Object> object = args.atOrUndefined(isolate, 1);
|
Handle<Object> object = args.atOrUndefined(isolate, 1);
|
||||||
if (object->IsJSReceiver()) {
|
if (object->IsJSReceiver()) {
|
||||||
MAYBE_RETURN(JSReceiver::SetIntegrityLevel(Handle<JSReceiver>::cast(object),
|
MAYBE_RETURN(
|
||||||
|
JSReceiver::SetIntegrityLevel(isolate, Handle<JSReceiver>::cast(object),
|
||||||
SEALED, kThrowOnError),
|
SEALED, kThrowOnError),
|
||||||
ReadOnlyRoots(isolate).exception());
|
ReadOnlyRoots(isolate).exception());
|
||||||
}
|
}
|
||||||
|
@ -45,49 +45,6 @@ TNode<IntPtrT> RegExpBuiltinsAssembler::IntPtrZero() {
|
|||||||
return IntPtrConstant(0);
|
return IntPtrConstant(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If code is a builtin, return the address to the (possibly embedded) builtin
|
|
||||||
// code entry, otherwise return the entry of the code object itself.
|
|
||||||
TNode<RawPtrT> RegExpBuiltinsAssembler::LoadCodeObjectEntry(TNode<CodeT> code) {
|
|
||||||
if (V8_EXTERNAL_CODE_SPACE_BOOL) {
|
|
||||||
// When external code space is enabled we can load the entry point directly
|
|
||||||
// from the CodeT object.
|
|
||||||
return GetCodeEntry(code);
|
|
||||||
}
|
|
||||||
|
|
||||||
TVARIABLE(RawPtrT, var_result);
|
|
||||||
|
|
||||||
Label if_code_is_off_heap(this), out(this);
|
|
||||||
TNode<Int32T> builtin_index =
|
|
||||||
LoadObjectField<Int32T>(code, Code::kBuiltinIndexOffset);
|
|
||||||
{
|
|
||||||
GotoIfNot(
|
|
||||||
Word32Equal(builtin_index,
|
|
||||||
Int32Constant(static_cast<int>(Builtin::kNoBuiltinId))),
|
|
||||||
&if_code_is_off_heap);
|
|
||||||
var_result = ReinterpretCast<RawPtrT>(
|
|
||||||
IntPtrAdd(BitcastTaggedToWord(code),
|
|
||||||
IntPtrConstant(Code::kHeaderSize - kHeapObjectTag)));
|
|
||||||
Goto(&out);
|
|
||||||
}
|
|
||||||
|
|
||||||
BIND(&if_code_is_off_heap);
|
|
||||||
{
|
|
||||||
TNode<IntPtrT> builtin_entry_offset_from_isolate_root =
|
|
||||||
IntPtrAdd(IntPtrConstant(IsolateData::builtin_entry_table_offset()),
|
|
||||||
ChangeInt32ToIntPtr(Word32Shl(
|
|
||||||
builtin_index, Int32Constant(kSystemPointerSizeLog2))));
|
|
||||||
|
|
||||||
var_result = ReinterpretCast<RawPtrT>(
|
|
||||||
Load(MachineType::Pointer(),
|
|
||||||
ExternalConstant(ExternalReference::isolate_root(isolate())),
|
|
||||||
builtin_entry_offset_from_isolate_root));
|
|
||||||
Goto(&out);
|
|
||||||
}
|
|
||||||
|
|
||||||
BIND(&out);
|
|
||||||
return var_result.value();
|
|
||||||
}
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
// ES6 section 21.2 RegExp Objects
|
// ES6 section 21.2 RegExp Objects
|
||||||
|
|
||||||
@ -559,7 +516,7 @@ TNode<HeapObject> RegExpBuiltinsAssembler::RegExpExecInternal(
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
GotoIf(TaggedIsSmi(var_code.value()), &runtime);
|
GotoIf(TaggedIsSmi(var_code.value()), &runtime);
|
||||||
TNode<CodeT> code = CAST(var_code.value());
|
TNode<Code> code = CAST(var_code.value());
|
||||||
|
|
||||||
Label if_success(this), if_exception(this, Label::kDeferred);
|
Label if_success(this), if_exception(this, Label::kDeferred);
|
||||||
{
|
{
|
||||||
@ -623,7 +580,7 @@ TNode<HeapObject> RegExpBuiltinsAssembler::RegExpExecInternal(
|
|||||||
MachineType arg8_type = type_tagged;
|
MachineType arg8_type = type_tagged;
|
||||||
TNode<JSRegExp> arg8 = regexp;
|
TNode<JSRegExp> arg8 = regexp;
|
||||||
|
|
||||||
TNode<RawPtrT> code_entry = LoadCodeObjectEntry(code);
|
TNode<RawPtrT> code_entry = GetCodeEntry(code);
|
||||||
|
|
||||||
// AIX uses function descriptors on CFunction calls. code_entry in this case
|
// AIX uses function descriptors on CFunction calls. code_entry in this case
|
||||||
// may also point to a Regex interpreter entry trampoline which does not
|
// may also point to a Regex interpreter entry trampoline which does not
|
||||||
@ -1066,13 +1023,13 @@ TNode<String> RegExpBuiltinsAssembler::FlagsGetter(TNode<Context> context,
|
|||||||
BIND(&next); \
|
BIND(&next); \
|
||||||
} while (false)
|
} while (false)
|
||||||
|
|
||||||
|
CASE_FOR_FLAG("hasIndices", JSRegExp::kHasIndices);
|
||||||
CASE_FOR_FLAG("global", JSRegExp::kGlobal);
|
CASE_FOR_FLAG("global", JSRegExp::kGlobal);
|
||||||
CASE_FOR_FLAG("ignoreCase", JSRegExp::kIgnoreCase);
|
CASE_FOR_FLAG("ignoreCase", JSRegExp::kIgnoreCase);
|
||||||
CASE_FOR_FLAG("multiline", JSRegExp::kMultiline);
|
CASE_FOR_FLAG("multiline", JSRegExp::kMultiline);
|
||||||
CASE_FOR_FLAG("dotAll", JSRegExp::kDotAll);
|
CASE_FOR_FLAG("dotAll", JSRegExp::kDotAll);
|
||||||
CASE_FOR_FLAG("unicode", JSRegExp::kUnicode);
|
CASE_FOR_FLAG("unicode", JSRegExp::kUnicode);
|
||||||
CASE_FOR_FLAG("sticky", JSRegExp::kSticky);
|
CASE_FOR_FLAG("sticky", JSRegExp::kSticky);
|
||||||
CASE_FOR_FLAG("hasIndices", JSRegExp::kHasIndices);
|
|
||||||
#undef CASE_FOR_FLAG
|
#undef CASE_FOR_FLAG
|
||||||
|
|
||||||
#define CASE_FOR_FLAG(NAME, V8_FLAG_EXTERN_REF, FLAG) \
|
#define CASE_FOR_FLAG(NAME, V8_FLAG_EXTERN_REF, FLAG) \
|
||||||
|
@ -21,8 +21,6 @@ class RegExpBuiltinsAssembler : public CodeStubAssembler {
|
|||||||
TNode<Smi> SmiZero();
|
TNode<Smi> SmiZero();
|
||||||
TNode<IntPtrT> IntPtrZero();
|
TNode<IntPtrT> IntPtrZero();
|
||||||
|
|
||||||
TNode<RawPtrT> LoadCodeObjectEntry(TNode<CodeT> code);
|
|
||||||
|
|
||||||
// Allocate either a JSRegExpResult or a JSRegExpResultWithIndices (depending
|
// Allocate either a JSRegExpResult or a JSRegExpResultWithIndices (depending
|
||||||
// on has_indices) with the given length (the number of captures, including
|
// on has_indices) with the given length (the number of captures, including
|
||||||
// the match itself), index (the index where the match starts), and input
|
// the match itself), index (the index where the match starts), and input
|
||||||
|
@ -38,6 +38,9 @@ class ShadowRealmBuiltinsAssembler : public CodeStubAssembler {
|
|||||||
TNode<JSFunction> AllocateImportValueFulfilledFunction(
|
TNode<JSFunction> AllocateImportValueFulfilledFunction(
|
||||||
TNode<NativeContext> caller_context, TNode<NativeContext> eval_context,
|
TNode<NativeContext> caller_context, TNode<NativeContext> eval_context,
|
||||||
TNode<String> specifier, TNode<String> export_name);
|
TNode<String> specifier, TNode<String> export_name);
|
||||||
|
void ShadowRealmThrow(TNode<Context> context,
|
||||||
|
MessageTemplate fallback_message,
|
||||||
|
TNode<Object> exception);
|
||||||
};
|
};
|
||||||
|
|
||||||
TNode<JSObject> ShadowRealmBuiltinsAssembler::AllocateJSWrappedFunction(
|
TNode<JSObject> ShadowRealmBuiltinsAssembler::AllocateJSWrappedFunction(
|
||||||
@ -97,6 +100,14 @@ void ShadowRealmBuiltinsAssembler::CheckAccessor(TNode<DescriptorArray> array,
|
|||||||
GotoIfNot(IsAccessorInfo(CAST(value)), bailout);
|
GotoIfNot(IsAccessorInfo(CAST(value)), bailout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ShadowRealmBuiltinsAssembler::ShadowRealmThrow(
|
||||||
|
TNode<Context> context, MessageTemplate fallback_message,
|
||||||
|
TNode<Object> exception) {
|
||||||
|
TNode<Smi> template_index = SmiConstant(static_cast<int>(fallback_message));
|
||||||
|
CallRuntime(Runtime::kShadowRealmThrow, context, template_index, exception);
|
||||||
|
Unreachable();
|
||||||
|
}
|
||||||
|
|
||||||
// https://tc39.es/proposal-shadowrealm/#sec-getwrappedvalue
|
// https://tc39.es/proposal-shadowrealm/#sec-getwrappedvalue
|
||||||
TF_BUILTIN(ShadowRealmGetWrappedValue, ShadowRealmBuiltinsAssembler) {
|
TF_BUILTIN(ShadowRealmGetWrappedValue, ShadowRealmBuiltinsAssembler) {
|
||||||
auto context = Parameter<Context>(Descriptor::kContext);
|
auto context = Parameter<Context>(Descriptor::kContext);
|
||||||
@ -285,10 +296,7 @@ TF_BUILTIN(CallWrappedFunction, ShadowRealmBuiltinsAssembler) {
|
|||||||
// 11. Else,
|
// 11. Else,
|
||||||
BIND(&call_exception);
|
BIND(&call_exception);
|
||||||
// 11a. Throw a TypeError exception.
|
// 11a. Throw a TypeError exception.
|
||||||
// TODO(v8:11989): provide a non-observable inspection on the
|
ShadowRealmThrow(context, MessageTemplate::kCallWrappedFunctionThrew,
|
||||||
// pending_exception to the newly created TypeError.
|
|
||||||
// https://github.com/tc39/proposal-shadowrealm/issues/353
|
|
||||||
ThrowTypeError(context, MessageTemplate::kCallShadowRealmFunctionThrown,
|
|
||||||
var_exception.value());
|
var_exception.value());
|
||||||
|
|
||||||
BIND(&target_not_callable);
|
BIND(&target_not_callable);
|
||||||
@ -416,10 +424,9 @@ TF_BUILTIN(ShadowRealmImportValueFulfilled, ShadowRealmBuiltinsAssembler) {
|
|||||||
|
|
||||||
TF_BUILTIN(ShadowRealmImportValueRejected, ShadowRealmBuiltinsAssembler) {
|
TF_BUILTIN(ShadowRealmImportValueRejected, ShadowRealmBuiltinsAssembler) {
|
||||||
TNode<Context> context = Parameter<Context>(Descriptor::kContext);
|
TNode<Context> context = Parameter<Context>(Descriptor::kContext);
|
||||||
// TODO(v8:11989): provide a non-observable inspection on the
|
TNode<Object> exception = Parameter<Object>(Descriptor::kException);
|
||||||
// pending_exception to the newly created TypeError.
|
ShadowRealmThrow(context, MessageTemplate::kImportShadowRealmRejected,
|
||||||
// https://github.com/tc39/proposal-shadowrealm/issues/353
|
exception);
|
||||||
ThrowTypeError(context, MessageTemplate::kImportShadowRealmRejected);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace internal
|
} // namespace internal
|
||||||
|
@ -202,11 +202,11 @@ BUILTIN(ShadowRealmPrototypeEvaluate) {
|
|||||||
*factory->NewError(isolate->syntax_error_function(), message));
|
*factory->NewError(isolate->syntax_error_function(), message));
|
||||||
}
|
}
|
||||||
// 21. If result.[[Type]] is not normal, throw a TypeError exception.
|
// 21. If result.[[Type]] is not normal, throw a TypeError exception.
|
||||||
// TODO(v8:11989): provide a non-observable inspection on the
|
Handle<String> string =
|
||||||
// pending_exception to the newly created TypeError.
|
Object::NoSideEffectsToString(isolate, pending_exception);
|
||||||
// https://github.com/tc39/proposal-shadowrealm/issues/353
|
|
||||||
THROW_NEW_ERROR_RETURN_FAILURE(
|
THROW_NEW_ERROR_RETURN_FAILURE(
|
||||||
isolate, NewTypeError(MessageTemplate::kCallShadowRealmFunctionThrown));
|
isolate,
|
||||||
|
NewTypeError(MessageTemplate::kCallShadowRealmEvaluateThrew, string));
|
||||||
}
|
}
|
||||||
// 22. Return ? GetWrappedValue(callerRealm, result.[[Value]]).
|
// 22. Return ? GetWrappedValue(callerRealm, result.[[Value]]).
|
||||||
Handle<Object> wrapped_result;
|
Handle<Object> wrapped_result;
|
||||||
|
@ -124,17 +124,15 @@ TNode<IntPtrT> StringBuiltinsAssembler::SearchOneByteInOneByteString(
|
|||||||
}
|
}
|
||||||
|
|
||||||
void StringBuiltinsAssembler::GenerateStringEqual(TNode<String> left,
|
void StringBuiltinsAssembler::GenerateStringEqual(TNode<String> left,
|
||||||
TNode<String> right) {
|
TNode<String> right,
|
||||||
|
TNode<IntPtrT> length) {
|
||||||
TVARIABLE(String, var_left, left);
|
TVARIABLE(String, var_left, left);
|
||||||
TVARIABLE(String, var_right, right);
|
TVARIABLE(String, var_right, right);
|
||||||
Label if_equal(this), if_notequal(this), if_indirect(this, Label::kDeferred),
|
Label if_equal(this), if_notequal(this), if_indirect(this, Label::kDeferred),
|
||||||
restart(this, {&var_left, &var_right});
|
restart(this, {&var_left, &var_right});
|
||||||
|
|
||||||
TNode<IntPtrT> lhs_length = LoadStringLengthAsWord(left);
|
CSA_DCHECK(this, IntPtrEqual(LoadStringLengthAsWord(left), length));
|
||||||
TNode<IntPtrT> rhs_length = LoadStringLengthAsWord(right);
|
CSA_DCHECK(this, IntPtrEqual(LoadStringLengthAsWord(right), length));
|
||||||
|
|
||||||
// Strings with different lengths cannot be equal.
|
|
||||||
GotoIf(WordNotEqual(lhs_length, rhs_length), &if_notequal);
|
|
||||||
|
|
||||||
Goto(&restart);
|
Goto(&restart);
|
||||||
BIND(&restart);
|
BIND(&restart);
|
||||||
@ -144,7 +142,7 @@ void StringBuiltinsAssembler::GenerateStringEqual(TNode<String> left,
|
|||||||
TNode<Uint16T> lhs_instance_type = LoadInstanceType(lhs);
|
TNode<Uint16T> lhs_instance_type = LoadInstanceType(lhs);
|
||||||
TNode<Uint16T> rhs_instance_type = LoadInstanceType(rhs);
|
TNode<Uint16T> rhs_instance_type = LoadInstanceType(rhs);
|
||||||
|
|
||||||
StringEqual_Core(lhs, lhs_instance_type, rhs, rhs_instance_type, lhs_length,
|
StringEqual_Core(lhs, lhs_instance_type, rhs, rhs_instance_type, length,
|
||||||
&if_equal, &if_notequal, &if_indirect);
|
&if_equal, &if_notequal, &if_indirect);
|
||||||
|
|
||||||
BIND(&if_indirect);
|
BIND(&if_indirect);
|
||||||
@ -199,22 +197,42 @@ void StringBuiltinsAssembler::StringEqual_Core(
|
|||||||
Int32Constant(0)),
|
Int32Constant(0)),
|
||||||
if_indirect);
|
if_indirect);
|
||||||
|
|
||||||
|
Label if_skip_fast_case(this), if_fast_case(this), if_oneonebytestring(this),
|
||||||
|
if_twotwobytestring(this), if_onetwobytestring(this),
|
||||||
|
if_twoonebytestring(this);
|
||||||
|
|
||||||
// Dispatch based on the {lhs} and {rhs} string encoding.
|
// Dispatch based on the {lhs} and {rhs} string encoding.
|
||||||
int const kBothStringEncodingMask =
|
int const kBothStringEncodingMask =
|
||||||
kStringEncodingMask | (kStringEncodingMask << 8);
|
kStringEncodingMask | (kStringEncodingMask << 8);
|
||||||
|
int const kBothExternalStringTag =
|
||||||
|
kExternalStringTag | (kExternalStringTag << 8);
|
||||||
int const kOneOneByteStringTag = kOneByteStringTag | (kOneByteStringTag << 8);
|
int const kOneOneByteStringTag = kOneByteStringTag | (kOneByteStringTag << 8);
|
||||||
int const kTwoTwoByteStringTag = kTwoByteStringTag | (kTwoByteStringTag << 8);
|
int const kTwoTwoByteStringTag = kTwoByteStringTag | (kTwoByteStringTag << 8);
|
||||||
int const kOneTwoByteStringTag = kOneByteStringTag | (kTwoByteStringTag << 8);
|
int const kOneTwoByteStringTag = kOneByteStringTag | (kTwoByteStringTag << 8);
|
||||||
Label if_oneonebytestring(this), if_twotwobytestring(this),
|
|
||||||
if_onetwobytestring(this), if_twoonebytestring(this);
|
|
||||||
TNode<Word32T> masked_instance_types =
|
TNode<Word32T> masked_instance_types =
|
||||||
Word32And(both_instance_types, Int32Constant(kBothStringEncodingMask));
|
Word32And(both_instance_types, Int32Constant(kBothStringEncodingMask));
|
||||||
GotoIf(
|
TNode<Word32T> both_are_one_byte =
|
||||||
Word32Equal(masked_instance_types, Int32Constant(kOneOneByteStringTag)),
|
Word32Equal(masked_instance_types, Int32Constant(kOneOneByteStringTag));
|
||||||
&if_oneonebytestring);
|
TNode<Word32T> both_are_two_byte =
|
||||||
GotoIf(
|
Word32Equal(masked_instance_types, Int32Constant(kTwoTwoByteStringTag));
|
||||||
Word32Equal(masked_instance_types, Int32Constant(kTwoTwoByteStringTag)),
|
|
||||||
&if_twotwobytestring);
|
// If both strings are not external we know that their payload length is
|
||||||
|
// kTagged sized. When they have the same type we can compare in chunks. The
|
||||||
|
// padding bytes are set to zero.
|
||||||
|
GotoIf(Word32And(both_instance_types, Int32Constant(kBothExternalStringTag)),
|
||||||
|
&if_skip_fast_case);
|
||||||
|
TVARIABLE(IntPtrT, byte_length, length);
|
||||||
|
GotoIf(both_are_one_byte, &if_fast_case);
|
||||||
|
byte_length = WordShl(byte_length.value(), IntPtrConstant(1));
|
||||||
|
Branch(both_are_two_byte, &if_fast_case, &if_skip_fast_case);
|
||||||
|
BIND(&if_fast_case);
|
||||||
|
StringEqual_FastLoop(lhs, lhs_instance_type, rhs, rhs_instance_type,
|
||||||
|
byte_length.value(), if_equal, if_not_equal);
|
||||||
|
|
||||||
|
BIND(&if_skip_fast_case);
|
||||||
|
GotoIf(both_are_one_byte, &if_oneonebytestring);
|
||||||
|
GotoIf(both_are_two_byte, &if_twotwobytestring);
|
||||||
Branch(
|
Branch(
|
||||||
Word32Equal(masked_instance_types, Int32Constant(kOneTwoByteStringTag)),
|
Word32Equal(masked_instance_types, Int32Constant(kOneTwoByteStringTag)),
|
||||||
&if_onetwobytestring, &if_twoonebytestring);
|
&if_onetwobytestring, &if_twoonebytestring);
|
||||||
@ -240,6 +258,87 @@ void StringBuiltinsAssembler::StringEqual_Core(
|
|||||||
if_not_equal);
|
if_not_equal);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void StringBuiltinsAssembler::StringEqual_FastLoop(
|
||||||
|
TNode<String> lhs, TNode<Word32T> lhs_instance_type, TNode<String> rhs,
|
||||||
|
TNode<Word32T> rhs_instance_type, TNode<IntPtrT> byte_length,
|
||||||
|
Label* if_equal, Label* if_not_equal) {
|
||||||
|
TNode<RawPtrT> lhs_data = DirectStringData(lhs, lhs_instance_type);
|
||||||
|
TNode<RawPtrT> rhs_data = DirectStringData(rhs, rhs_instance_type);
|
||||||
|
|
||||||
|
constexpr int kChunk =
|
||||||
|
kObjectAlignment % ElementSizeInBytes(MachineRepresentation::kWord64) == 0
|
||||||
|
? ElementSizeInBytes(MachineRepresentation::kWord64)
|
||||||
|
: ElementSizeInBytes(MachineRepresentation::kWord32);
|
||||||
|
static_assert(kObjectAlignment % kChunk == 0);
|
||||||
|
// Round up the byte_length to `ceiling(length / kChunk) * kChunk`
|
||||||
|
TNode<IntPtrT> rounded_up_len = UncheckedCast<IntPtrT>(WordAnd(
|
||||||
|
UncheckedCast<WordT>(IntPtrAdd(byte_length, IntPtrConstant(kChunk - 1))),
|
||||||
|
UncheckedCast<WordT>(IntPtrConstant(~(kChunk - 1)))));
|
||||||
|
|
||||||
|
#ifdef ENABLE_SLOW_DCHECKS
|
||||||
|
// The padding must me zeroed for chunked comparison to be correct. This loop
|
||||||
|
// checks all bytes being 0 from byte_length up to rounded_up_len.
|
||||||
|
{
|
||||||
|
TVARIABLE(IntPtrT, var_padding_offset, byte_length);
|
||||||
|
Label loop(this, &var_padding_offset), loop_end(this);
|
||||||
|
Goto(&loop);
|
||||||
|
BIND(&loop);
|
||||||
|
{
|
||||||
|
GotoIf(WordEqual(var_padding_offset.value(), rounded_up_len), &loop_end);
|
||||||
|
|
||||||
|
// Load the next byte
|
||||||
|
TNode<Word32T> lhs_value = UncheckedCast<Word32T>(Load(
|
||||||
|
MachineType::Uint8(), lhs_data,
|
||||||
|
WordShl(var_padding_offset.value(),
|
||||||
|
ElementSizeLog2Of(MachineType::Uint8().representation()))));
|
||||||
|
TNode<Word32T> rhs_value = UncheckedCast<Word32T>(Load(
|
||||||
|
MachineType::Uint8(), rhs_data,
|
||||||
|
WordShl(var_padding_offset.value(),
|
||||||
|
ElementSizeLog2Of(MachineType::Uint8().representation()))));
|
||||||
|
|
||||||
|
// Check the padding is zero.
|
||||||
|
CSA_CHECK(this, Word32Equal(lhs_value, Int32Constant(0)));
|
||||||
|
CSA_CHECK(this, Word32Equal(rhs_value, Int32Constant(0)));
|
||||||
|
|
||||||
|
// Advance to next byte.
|
||||||
|
var_padding_offset =
|
||||||
|
IntPtrAdd(var_padding_offset.value(), IntPtrConstant(1));
|
||||||
|
Goto(&loop);
|
||||||
|
}
|
||||||
|
BIND(&loop_end);
|
||||||
|
}
|
||||||
|
#endif // ENABLE_SLOW_DCHECKS
|
||||||
|
|
||||||
|
// Compare strings in chunks of either 4 or 8 bytes, depending on the
|
||||||
|
// alignment of allocations.
|
||||||
|
static_assert(kChunk == ElementSizeInBytes(MachineRepresentation::kWord64) ||
|
||||||
|
kChunk == ElementSizeInBytes(MachineRepresentation::kWord32));
|
||||||
|
if (kChunk == ElementSizeInBytes(MachineRepresentation::kWord64)) {
|
||||||
|
BuildFastLoop<IntPtrT>(
|
||||||
|
IntPtrConstant(0), rounded_up_len,
|
||||||
|
[&](TNode<IntPtrT> index) {
|
||||||
|
TNode<Word64T> lhs_value = UncheckedCast<Word64T>(
|
||||||
|
Load(MachineType::Uint64(), lhs_data, index));
|
||||||
|
TNode<Word64T> rhs_value = UncheckedCast<Word64T>(
|
||||||
|
Load(MachineType::Uint64(), rhs_data, index));
|
||||||
|
GotoIf(Word64NotEqual(lhs_value, rhs_value), if_not_equal);
|
||||||
|
},
|
||||||
|
kChunk, LoopUnrollingMode::kYes, IndexAdvanceMode::kPost);
|
||||||
|
} else {
|
||||||
|
BuildFastLoop<IntPtrT>(
|
||||||
|
IntPtrConstant(0), rounded_up_len,
|
||||||
|
[&](TNode<IntPtrT> index) {
|
||||||
|
TNode<Word32T> lhs_value = UncheckedCast<Word32T>(
|
||||||
|
Load(MachineType::Uint32(), lhs_data, index));
|
||||||
|
TNode<Word32T> rhs_value = UncheckedCast<Word32T>(
|
||||||
|
Load(MachineType::Uint32(), rhs_data, index));
|
||||||
|
GotoIf(Word32NotEqual(lhs_value, rhs_value), if_not_equal);
|
||||||
|
},
|
||||||
|
kChunk, LoopUnrollingMode::kYes, IndexAdvanceMode::kPost);
|
||||||
|
}
|
||||||
|
Goto(if_equal);
|
||||||
|
}
|
||||||
|
|
||||||
void StringBuiltinsAssembler::StringEqual_Loop(
|
void StringBuiltinsAssembler::StringEqual_Loop(
|
||||||
TNode<String> lhs, TNode<Word32T> lhs_instance_type, MachineType lhs_type,
|
TNode<String> lhs, TNode<Word32T> lhs_instance_type, MachineType lhs_type,
|
||||||
TNode<String> rhs, TNode<Word32T> rhs_instance_type, MachineType rhs_type,
|
TNode<String> rhs, TNode<Word32T> rhs_instance_type, MachineType rhs_type,
|
||||||
@ -716,7 +815,8 @@ void StringBuiltinsAssembler::GenerateStringRelationalComparison(
|
|||||||
TF_BUILTIN(StringEqual, StringBuiltinsAssembler) {
|
TF_BUILTIN(StringEqual, StringBuiltinsAssembler) {
|
||||||
auto left = Parameter<String>(Descriptor::kLeft);
|
auto left = Parameter<String>(Descriptor::kLeft);
|
||||||
auto right = Parameter<String>(Descriptor::kRight);
|
auto right = Parameter<String>(Descriptor::kRight);
|
||||||
GenerateStringEqual(left, right);
|
auto length = UncheckedParameter<IntPtrT>(Descriptor::kLength);
|
||||||
|
GenerateStringEqual(left, right, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
TF_BUILTIN(StringLessThan, StringBuiltinsAssembler) {
|
TF_BUILTIN(StringLessThan, StringBuiltinsAssembler) {
|
||||||
@ -993,12 +1093,27 @@ TF_BUILTIN(StringPrototypeReplace, StringBuiltinsAssembler) {
|
|||||||
RequireObjectCoercible(context, receiver, "String.prototype.replace");
|
RequireObjectCoercible(context, receiver, "String.prototype.replace");
|
||||||
|
|
||||||
// Redirect to replacer method if {search[@@replace]} is not undefined.
|
// Redirect to replacer method if {search[@@replace]} is not undefined.
|
||||||
|
{
|
||||||
|
Label next(this);
|
||||||
|
Label check_for_replace(this);
|
||||||
|
|
||||||
|
// The protector guarantees that that the Number and String wrapper
|
||||||
|
// prototypes do not contain Symbol.replace (aka. @@replace).
|
||||||
|
GotoIf(IsNumberStringPrototypeNoReplaceProtectorCellInvalid(),
|
||||||
|
&check_for_replace);
|
||||||
|
// Smi is safe thanks to the protector.
|
||||||
|
GotoIf(TaggedIsSmi(search), &next);
|
||||||
|
// String is safe thanks to the protector.
|
||||||
|
GotoIf(IsString(CAST(search)), &next);
|
||||||
|
// HeapNumber is safe thanks to the protector.
|
||||||
|
Branch(IsHeapNumber(CAST(search)), &next, &check_for_replace);
|
||||||
|
|
||||||
|
BIND(&check_for_replace);
|
||||||
MaybeCallFunctionAtSymbol(
|
MaybeCallFunctionAtSymbol(
|
||||||
context, search, receiver, isolate()->factory()->replace_symbol(),
|
context, search, receiver, isolate()->factory()->replace_symbol(),
|
||||||
DescriptorIndexNameValue{JSRegExp::kSymbolReplaceFunctionDescriptorIndex,
|
DescriptorIndexNameValue{
|
||||||
RootIndex::kreplace_symbol,
|
JSRegExp::kSymbolReplaceFunctionDescriptorIndex,
|
||||||
Context::REGEXP_REPLACE_FUNCTION_INDEX},
|
RootIndex::kreplace_symbol, Context::REGEXP_REPLACE_FUNCTION_INDEX},
|
||||||
[=]() {
|
[=]() {
|
||||||
Return(CallBuiltin(Builtin::kRegExpReplace, context, search, receiver,
|
Return(CallBuiltin(Builtin::kRegExpReplace, context, search, receiver,
|
||||||
replace));
|
replace));
|
||||||
@ -1006,6 +1121,10 @@ TF_BUILTIN(StringPrototypeReplace, StringBuiltinsAssembler) {
|
|||||||
[=](TNode<Object> fn) {
|
[=](TNode<Object> fn) {
|
||||||
Return(Call(context, fn, search, receiver, replace));
|
Return(Call(context, fn, search, receiver, replace));
|
||||||
});
|
});
|
||||||
|
Goto(&next);
|
||||||
|
|
||||||
|
BIND(&next);
|
||||||
|
}
|
||||||
|
|
||||||
// Convert {receiver} and {search} to strings.
|
// Convert {receiver} and {search} to strings.
|
||||||
|
|
||||||
@ -1492,6 +1611,61 @@ TNode<Int32T> StringBuiltinsAssembler::LoadSurrogatePairAt(
|
|||||||
return var_result.value();
|
return var_result.value();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TNode<BoolT> StringBuiltinsAssembler::HasUnpairedSurrogate(TNode<String> string,
|
||||||
|
Label* if_indirect) {
|
||||||
|
TNode<Uint16T> instance_type = LoadInstanceType(string);
|
||||||
|
CSA_DCHECK(this, Word32Equal(Word32And(instance_type,
|
||||||
|
Int32Constant(kStringEncodingMask)),
|
||||||
|
Int32Constant(kTwoByteStringTag)));
|
||||||
|
GotoIfNot(Word32Equal(Word32And(instance_type,
|
||||||
|
Int32Constant(kIsIndirectStringMask |
|
||||||
|
kUncachedExternalStringMask)),
|
||||||
|
Int32Constant(0)),
|
||||||
|
if_indirect);
|
||||||
|
|
||||||
|
TNode<RawPtrT> string_data = DirectStringData(string, instance_type);
|
||||||
|
TNode<IntPtrT> length = LoadStringLengthAsWord(string);
|
||||||
|
|
||||||
|
const TNode<ExternalReference> has_unpaired_surrogate =
|
||||||
|
ExternalConstant(ExternalReference::has_unpaired_surrogate());
|
||||||
|
return UncheckedCast<BoolT>(
|
||||||
|
CallCFunction(has_unpaired_surrogate, MachineType::Uint32(),
|
||||||
|
std::make_pair(MachineType::Pointer(), string_data),
|
||||||
|
std::make_pair(MachineType::IntPtr(), length)));
|
||||||
|
}
|
||||||
|
|
||||||
|
void StringBuiltinsAssembler::ReplaceUnpairedSurrogates(TNode<String> source,
|
||||||
|
TNode<String> dest,
|
||||||
|
Label* if_indirect) {
|
||||||
|
TNode<Uint16T> source_instance_type = LoadInstanceType(source);
|
||||||
|
CSA_DCHECK(this, Word32Equal(Word32And(source_instance_type,
|
||||||
|
Int32Constant(kStringEncodingMask)),
|
||||||
|
Int32Constant(kTwoByteStringTag)));
|
||||||
|
GotoIfNot(Word32Equal(Word32And(source_instance_type,
|
||||||
|
Int32Constant(kIsIndirectStringMask |
|
||||||
|
kUncachedExternalStringMask)),
|
||||||
|
Int32Constant(0)),
|
||||||
|
if_indirect);
|
||||||
|
|
||||||
|
TNode<RawPtrT> source_data = DirectStringData(source, source_instance_type);
|
||||||
|
// The destination string is a freshly allocated SeqString, and so is always
|
||||||
|
// direct.
|
||||||
|
TNode<Uint16T> dest_instance_type = LoadInstanceType(dest);
|
||||||
|
CSA_DCHECK(this, Word32Equal(Word32And(dest_instance_type,
|
||||||
|
Int32Constant(kStringEncodingMask)),
|
||||||
|
Int32Constant(kTwoByteStringTag)));
|
||||||
|
TNode<RawPtrT> dest_data = DirectStringData(dest, dest_instance_type);
|
||||||
|
TNode<IntPtrT> length = LoadStringLengthAsWord(source);
|
||||||
|
CSA_DCHECK(this, IntPtrEqual(length, LoadStringLengthAsWord(dest)));
|
||||||
|
|
||||||
|
const TNode<ExternalReference> replace_unpaired_surrogates =
|
||||||
|
ExternalConstant(ExternalReference::replace_unpaired_surrogates());
|
||||||
|
CallCFunction(replace_unpaired_surrogates, MachineType::Pointer(),
|
||||||
|
std::make_pair(MachineType::Pointer(), source_data),
|
||||||
|
std::make_pair(MachineType::Pointer(), dest_data),
|
||||||
|
std::make_pair(MachineType::IntPtr(), length));
|
||||||
|
}
|
||||||
|
|
||||||
void StringBuiltinsAssembler::BranchIfStringPrimitiveWithNoCustomIteration(
|
void StringBuiltinsAssembler::BranchIfStringPrimitiveWithNoCustomIteration(
|
||||||
TNode<Object> object, TNode<Context> context, Label* if_true,
|
TNode<Object> object, TNode<Context> context, Label* if_true,
|
||||||
Label* if_false) {
|
Label* if_false) {
|
||||||
|
@ -33,6 +33,10 @@ class StringBuiltinsAssembler : public CodeStubAssembler {
|
|||||||
TNode<Int32T> LoadSurrogatePairAt(TNode<String> string, TNode<IntPtrT> length,
|
TNode<Int32T> LoadSurrogatePairAt(TNode<String> string, TNode<IntPtrT> length,
|
||||||
TNode<IntPtrT> index,
|
TNode<IntPtrT> index,
|
||||||
UnicodeEncoding encoding);
|
UnicodeEncoding encoding);
|
||||||
|
TNode<BoolT> HasUnpairedSurrogate(TNode<String> string, Label* if_indirect);
|
||||||
|
|
||||||
|
void ReplaceUnpairedSurrogates(TNode<String> source, TNode<String> dest,
|
||||||
|
Label* if_indirect);
|
||||||
|
|
||||||
TNode<String> StringFromSingleUTF16EncodedCodePoint(TNode<Int32T> codepoint);
|
TNode<String> StringFromSingleUTF16EncodedCodePoint(TNode<Int32T> codepoint);
|
||||||
|
|
||||||
@ -85,6 +89,10 @@ class StringBuiltinsAssembler : public CodeStubAssembler {
|
|||||||
const TNode<RawPtrT> search_ptr, const TNode<IntPtrT> start_position);
|
const TNode<RawPtrT> search_ptr, const TNode<IntPtrT> start_position);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
void StringEqual_FastLoop(TNode<String> lhs, TNode<Word32T> lhs_instance_type,
|
||||||
|
TNode<String> rhs, TNode<Word32T> rhs_instance_type,
|
||||||
|
TNode<IntPtrT> byte_length, Label* if_equal,
|
||||||
|
Label* if_not_equal);
|
||||||
void StringEqual_Loop(TNode<String> lhs, TNode<Word32T> lhs_instance_type,
|
void StringEqual_Loop(TNode<String> lhs, TNode<Word32T> lhs_instance_type,
|
||||||
MachineType lhs_type, TNode<String> rhs,
|
MachineType lhs_type, TNode<String> rhs,
|
||||||
TNode<Word32T> rhs_instance_type, MachineType rhs_type,
|
TNode<Word32T> rhs_instance_type, MachineType rhs_type,
|
||||||
@ -100,7 +108,8 @@ class StringBuiltinsAssembler : public CodeStubAssembler {
|
|||||||
const TNode<IntPtrT> search_length,
|
const TNode<IntPtrT> search_length,
|
||||||
const TNode<IntPtrT> start_position);
|
const TNode<IntPtrT> start_position);
|
||||||
|
|
||||||
void GenerateStringEqual(TNode<String> left, TNode<String> right);
|
void GenerateStringEqual(TNode<String> left, TNode<String> right,
|
||||||
|
TNode<IntPtrT> length);
|
||||||
void GenerateStringRelationalComparison(TNode<String> left,
|
void GenerateStringRelationalComparison(TNode<String> left,
|
||||||
TNode<String> right, Operation op);
|
TNode<String> right, Operation op);
|
||||||
|
|
||||||
|
@ -133,6 +133,8 @@ BUILTIN(SharedStructTypeConstructor) {
|
|||||||
instance_map->set_is_extensible(false);
|
instance_map->set_is_extensible(false);
|
||||||
JSFunction::SetInitialMap(isolate, constructor, instance_map,
|
JSFunction::SetInitialMap(isolate, constructor, instance_map,
|
||||||
factory->null_value(), factory->null_value());
|
factory->null_value(), factory->null_value());
|
||||||
|
constructor->map().SetConstructor(ReadOnlyRoots(isolate).null_value());
|
||||||
|
constructor->map().set_has_non_instance_prototype(true);
|
||||||
|
|
||||||
// Pre-create the enum cache in the shared space, as otherwise for-in
|
// Pre-create the enum cache in the shared space, as otherwise for-in
|
||||||
// enumeration will incorrectly create an enum cache in the per-thread heap.
|
// enumeration will incorrectly create an enum cache in the per-thread heap.
|
||||||
|
@ -1,119 +0,0 @@
|
|||||||
// Copyright 2022 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.
|
|
||||||
|
|
||||||
#include "src/builtins/builtins-utils-inl.h"
|
|
||||||
#include "src/builtins/builtins.h"
|
|
||||||
#include "src/logging/counters.h"
|
|
||||||
#include "src/objects/js-array-buffer-inl.h"
|
|
||||||
#include "src/objects/js-array-inl.h"
|
|
||||||
#include "src/objects/objects-inl.h"
|
|
||||||
#include "src/web-snapshot/web-snapshot.h"
|
|
||||||
|
|
||||||
namespace v8 {
|
|
||||||
namespace internal {
|
|
||||||
|
|
||||||
BUILTIN(WebSnapshotSerialize) {
|
|
||||||
HandleScope scope(isolate);
|
|
||||||
if (args.length() < 2 || args.length() > 3) {
|
|
||||||
THROW_NEW_ERROR_RETURN_FAILURE(
|
|
||||||
isolate, NewTypeError(MessageTemplate::kInvalidArgument));
|
|
||||||
}
|
|
||||||
Handle<Object> object = args.at(1);
|
|
||||||
Handle<FixedArray> block_list = isolate->factory()->empty_fixed_array();
|
|
||||||
Handle<JSArray> block_list_js_array;
|
|
||||||
if (args.length() == 3) {
|
|
||||||
if (!args[2].IsJSArray()) {
|
|
||||||
THROW_NEW_ERROR_RETURN_FAILURE(
|
|
||||||
isolate, NewTypeError(MessageTemplate::kInvalidArgument));
|
|
||||||
}
|
|
||||||
block_list_js_array = args.at<JSArray>(2);
|
|
||||||
ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
|
|
||||||
isolate, block_list,
|
|
||||||
JSReceiver::GetOwnValues(isolate, block_list_js_array,
|
|
||||||
PropertyFilter::ENUMERABLE_STRINGS));
|
|
||||||
}
|
|
||||||
|
|
||||||
auto snapshot_data = std::make_shared<WebSnapshotData>();
|
|
||||||
WebSnapshotSerializer serializer(isolate);
|
|
||||||
if (!serializer.TakeSnapshot(object, block_list, *snapshot_data)) {
|
|
||||||
DCHECK(isolate->has_pending_exception());
|
|
||||||
return ReadOnlyRoots(isolate).exception();
|
|
||||||
}
|
|
||||||
if (!block_list_js_array.is_null() &&
|
|
||||||
static_cast<uint32_t>(block_list->length()) <
|
|
||||||
serializer.external_object_count()) {
|
|
||||||
Handle<FixedArray> externals = serializer.GetExternals();
|
|
||||||
Handle<Map> map = JSObject::GetElementsTransitionMap(block_list_js_array,
|
|
||||||
PACKED_ELEMENTS);
|
|
||||||
block_list_js_array->set_elements(*externals);
|
|
||||||
block_list_js_array->set_length(Smi::FromInt(externals->length()));
|
|
||||||
block_list_js_array->set_map(*map);
|
|
||||||
}
|
|
||||||
|
|
||||||
MaybeHandle<JSArrayBuffer> maybe_result =
|
|
||||||
isolate->factory()->NewJSArrayBufferAndBackingStore(
|
|
||||||
snapshot_data->buffer_size, InitializedFlag::kUninitialized);
|
|
||||||
Handle<JSArrayBuffer> result;
|
|
||||||
if (!maybe_result.ToHandle(&result)) {
|
|
||||||
THROW_NEW_ERROR_RETURN_FAILURE(
|
|
||||||
isolate, NewTypeError(MessageTemplate::kOutOfMemory,
|
|
||||||
isolate->factory()->NewStringFromAsciiChecked(
|
|
||||||
"WebSnapshotSerialize")));
|
|
||||||
}
|
|
||||||
uint8_t* data =
|
|
||||||
reinterpret_cast<uint8_t*>(result->GetBackingStore()->buffer_start());
|
|
||||||
memcpy(data, snapshot_data->buffer, snapshot_data->buffer_size);
|
|
||||||
|
|
||||||
return *result;
|
|
||||||
}
|
|
||||||
|
|
||||||
BUILTIN(WebSnapshotDeserialize) {
|
|
||||||
HandleScope scope(isolate);
|
|
||||||
if (args.length() < 2 || args.length() > 3) {
|
|
||||||
THROW_NEW_ERROR_RETURN_FAILURE(
|
|
||||||
isolate, NewTypeError(MessageTemplate::kInvalidArgument));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!args[1].IsJSArrayBuffer()) {
|
|
||||||
THROW_NEW_ERROR_RETURN_FAILURE(
|
|
||||||
isolate, NewTypeError(MessageTemplate::kInvalidArgument));
|
|
||||||
}
|
|
||||||
auto buffer = args.at<JSArrayBuffer>(1);
|
|
||||||
std::shared_ptr<BackingStore> backing_store = buffer->GetBackingStore();
|
|
||||||
if (backing_store.get() == nullptr) {
|
|
||||||
THROW_NEW_ERROR_RETURN_FAILURE(
|
|
||||||
isolate, NewTypeError(MessageTemplate::kInvalidArgument));
|
|
||||||
}
|
|
||||||
const uint8_t* data =
|
|
||||||
reinterpret_cast<uint8_t*>(backing_store->buffer_start());
|
|
||||||
|
|
||||||
Handle<FixedArray> injected_references =
|
|
||||||
isolate->factory()->empty_fixed_array();
|
|
||||||
if (args.length() == 3) {
|
|
||||||
if (!args[2].IsJSArray()) {
|
|
||||||
THROW_NEW_ERROR_RETURN_FAILURE(
|
|
||||||
isolate, NewTypeError(MessageTemplate::kInvalidArgument));
|
|
||||||
}
|
|
||||||
auto js_array = args.at<JSArray>(2);
|
|
||||||
ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
|
|
||||||
isolate, injected_references,
|
|
||||||
JSReceiver::GetOwnValues(isolate, js_array,
|
|
||||||
PropertyFilter::ENUMERABLE_STRINGS));
|
|
||||||
}
|
|
||||||
|
|
||||||
WebSnapshotDeserializer deserializer(reinterpret_cast<v8::Isolate*>(isolate),
|
|
||||||
data, backing_store->byte_length());
|
|
||||||
if (!deserializer.Deserialize(injected_references)) {
|
|
||||||
DCHECK(isolate->has_pending_exception());
|
|
||||||
return ReadOnlyRoots(isolate).exception();
|
|
||||||
}
|
|
||||||
Handle<Object> object;
|
|
||||||
if (!deserializer.value().ToHandle(&object)) {
|
|
||||||
return ReadOnlyRoots(isolate).undefined_value();
|
|
||||||
}
|
|
||||||
return *object;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace internal
|
|
||||||
} // namespace v8
|
|
@ -121,7 +121,7 @@ const char* Builtins::Lookup(Address pc) {
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
Handle<CodeT> Builtins::CallFunction(ConvertReceiverMode mode) {
|
Handle<Code> Builtins::CallFunction(ConvertReceiverMode mode) {
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
case ConvertReceiverMode::kNullOrUndefined:
|
case ConvertReceiverMode::kNullOrUndefined:
|
||||||
return code_handle(Builtin::kCallFunction_ReceiverIsNullOrUndefined);
|
return code_handle(Builtin::kCallFunction_ReceiverIsNullOrUndefined);
|
||||||
@ -133,7 +133,7 @@ Handle<CodeT> Builtins::CallFunction(ConvertReceiverMode mode) {
|
|||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
}
|
}
|
||||||
|
|
||||||
Handle<CodeT> Builtins::Call(ConvertReceiverMode mode) {
|
Handle<Code> Builtins::Call(ConvertReceiverMode mode) {
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
case ConvertReceiverMode::kNullOrUndefined:
|
case ConvertReceiverMode::kNullOrUndefined:
|
||||||
return code_handle(Builtin::kCall_ReceiverIsNullOrUndefined);
|
return code_handle(Builtin::kCall_ReceiverIsNullOrUndefined);
|
||||||
@ -145,7 +145,7 @@ Handle<CodeT> Builtins::Call(ConvertReceiverMode mode) {
|
|||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
}
|
}
|
||||||
|
|
||||||
Handle<CodeT> Builtins::NonPrimitiveToPrimitive(ToPrimitiveHint hint) {
|
Handle<Code> Builtins::NonPrimitiveToPrimitive(ToPrimitiveHint hint) {
|
||||||
switch (hint) {
|
switch (hint) {
|
||||||
case ToPrimitiveHint::kDefault:
|
case ToPrimitiveHint::kDefault:
|
||||||
return code_handle(Builtin::kNonPrimitiveToPrimitive_Default);
|
return code_handle(Builtin::kNonPrimitiveToPrimitive_Default);
|
||||||
@ -157,7 +157,7 @@ Handle<CodeT> Builtins::NonPrimitiveToPrimitive(ToPrimitiveHint hint) {
|
|||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
}
|
}
|
||||||
|
|
||||||
Handle<CodeT> Builtins::OrdinaryToPrimitive(OrdinaryToPrimitiveHint hint) {
|
Handle<Code> Builtins::OrdinaryToPrimitive(OrdinaryToPrimitiveHint hint) {
|
||||||
switch (hint) {
|
switch (hint) {
|
||||||
case OrdinaryToPrimitiveHint::kNumber:
|
case OrdinaryToPrimitiveHint::kNumber:
|
||||||
return code_handle(Builtin::kOrdinaryToPrimitive_Number);
|
return code_handle(Builtin::kOrdinaryToPrimitive_Number);
|
||||||
@ -179,21 +179,21 @@ FullObjectSlot Builtins::builtin_tier0_slot(Builtin builtin) {
|
|||||||
return FullObjectSlot(location);
|
return FullObjectSlot(location);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Builtins::set_code(Builtin builtin, CodeT code) {
|
void Builtins::set_code(Builtin builtin, Code code) {
|
||||||
DCHECK_EQ(builtin, code.builtin_id());
|
DCHECK_EQ(builtin, code.builtin_id());
|
||||||
DCHECK(Internals::HasHeapObjectTag(code.ptr()));
|
DCHECK(Internals::HasHeapObjectTag(code.ptr()));
|
||||||
// The given builtin may be uninitialized thus we cannot check its type here.
|
// The given builtin may be uninitialized thus we cannot check its type here.
|
||||||
isolate_->builtin_table()[Builtins::ToInt(builtin)] = code.ptr();
|
isolate_->builtin_table()[Builtins::ToInt(builtin)] = code.ptr();
|
||||||
}
|
}
|
||||||
|
|
||||||
CodeT Builtins::code(Builtin builtin) {
|
Code Builtins::code(Builtin builtin) {
|
||||||
Address ptr = isolate_->builtin_table()[Builtins::ToInt(builtin)];
|
Address ptr = isolate_->builtin_table()[Builtins::ToInt(builtin)];
|
||||||
return CodeT::cast(Object(ptr));
|
return Code::cast(Object(ptr));
|
||||||
}
|
}
|
||||||
|
|
||||||
Handle<CodeT> Builtins::code_handle(Builtin builtin) {
|
Handle<Code> Builtins::code_handle(Builtin builtin) {
|
||||||
Address* location = &isolate_->builtin_table()[Builtins::ToInt(builtin)];
|
Address* location = &isolate_->builtin_table()[Builtins::ToInt(builtin)];
|
||||||
return Handle<CodeT>(location);
|
return Handle<Code>(location);
|
||||||
}
|
}
|
||||||
|
|
||||||
// static
|
// static
|
||||||
@ -229,7 +229,7 @@ CallInterfaceDescriptor Builtins::CallInterfaceDescriptorFor(Builtin builtin) {
|
|||||||
|
|
||||||
// static
|
// static
|
||||||
Callable Builtins::CallableFor(Isolate* isolate, Builtin builtin) {
|
Callable Builtins::CallableFor(Isolate* isolate, Builtin builtin) {
|
||||||
Handle<CodeT> code = isolate->builtins()->code_handle(builtin);
|
Handle<Code> code = isolate->builtins()->code_handle(builtin);
|
||||||
return Callable{code, CallInterfaceDescriptorFor(builtin)};
|
return Callable{code, CallInterfaceDescriptorFor(builtin)};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -256,7 +256,7 @@ void Builtins::PrintBuiltinCode() {
|
|||||||
base::CStrVector(v8_flags.print_builtin_code_filter))) {
|
base::CStrVector(v8_flags.print_builtin_code_filter))) {
|
||||||
CodeTracer::Scope trace_scope(isolate_->GetCodeTracer());
|
CodeTracer::Scope trace_scope(isolate_->GetCodeTracer());
|
||||||
OFStream os(trace_scope.file());
|
OFStream os(trace_scope.file());
|
||||||
CodeT builtin_code = code(builtin);
|
Code builtin_code = code(builtin);
|
||||||
builtin_code.Disassemble(builtin_name, os, isolate_);
|
builtin_code.Disassemble(builtin_name, os, isolate_);
|
||||||
os << "\n";
|
os << "\n";
|
||||||
}
|
}
|
||||||
@ -270,7 +270,7 @@ void Builtins::PrintBuiltinSize() {
|
|||||||
++builtin) {
|
++builtin) {
|
||||||
const char* builtin_name = name(builtin);
|
const char* builtin_name = name(builtin);
|
||||||
const char* kind = KindNameOf(builtin);
|
const char* kind = KindNameOf(builtin);
|
||||||
CodeT code = Builtins::code(builtin);
|
Code code = Builtins::code(builtin);
|
||||||
PrintF(stdout, "%s Builtin, %s, %d\n", kind, builtin_name,
|
PrintF(stdout, "%s Builtin, %s, %d\n", kind, builtin_name,
|
||||||
code.InstructionSize());
|
code.InstructionSize());
|
||||||
}
|
}
|
||||||
@ -283,7 +283,7 @@ Address Builtins::CppEntryOf(Builtin builtin) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// static
|
// static
|
||||||
bool Builtins::IsBuiltin(const Code code) {
|
bool Builtins::IsBuiltin(const InstructionStream code) {
|
||||||
return Builtins::IsBuiltinId(code.builtin_id());
|
return Builtins::IsBuiltinId(code.builtin_id());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -298,6 +298,13 @@ bool Builtins::IsBuiltinHandle(Handle<HeapObject> maybe_code,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
|
bool Builtins::IsIsolateIndependentBuiltin(Code code) {
|
||||||
|
Builtin builtin = code.builtin_id();
|
||||||
|
return Builtins::IsBuiltinId(builtin) &&
|
||||||
|
Builtins::IsIsolateIndependent(builtin);
|
||||||
|
}
|
||||||
|
|
||||||
// static
|
// static
|
||||||
void Builtins::InitializeIsolateDataTables(Isolate* isolate) {
|
void Builtins::InitializeIsolateDataTables(Isolate* isolate) {
|
||||||
EmbeddedData embedded_data = EmbeddedData::FromBlob(isolate);
|
EmbeddedData embedded_data = EmbeddedData::FromBlob(isolate);
|
||||||
@ -306,7 +313,7 @@ void Builtins::InitializeIsolateDataTables(Isolate* isolate) {
|
|||||||
// The entry table.
|
// The entry table.
|
||||||
for (Builtin i = Builtins::kFirst; i <= Builtins::kLast; ++i) {
|
for (Builtin i = Builtins::kFirst; i <= Builtins::kLast; ++i) {
|
||||||
DCHECK(Builtins::IsBuiltinId(isolate->builtins()->code(i).builtin_id()));
|
DCHECK(Builtins::IsBuiltinId(isolate->builtins()->code(i).builtin_id()));
|
||||||
DCHECK(isolate->builtins()->code(i).is_off_heap_trampoline());
|
DCHECK(!isolate->builtins()->code(i).has_instruction_stream());
|
||||||
isolate_data->builtin_entry_table()[ToInt(i)] =
|
isolate_data->builtin_entry_table()[ToInt(i)] =
|
||||||
embedded_data.InstructionStartOfBuiltin(i);
|
embedded_data.InstructionStartOfBuiltin(i);
|
||||||
}
|
}
|
||||||
@ -331,16 +338,16 @@ void Builtins::EmitCodeCreateEvents(Isolate* isolate) {
|
|||||||
int i = 0;
|
int i = 0;
|
||||||
HandleScope scope(isolate);
|
HandleScope scope(isolate);
|
||||||
for (; i < ToInt(Builtin::kFirstBytecodeHandler); i++) {
|
for (; i < ToInt(Builtin::kFirstBytecodeHandler); i++) {
|
||||||
Handle<CodeT> builtin_code(&builtins[i]);
|
Handle<Code> builtin_code(&builtins[i]);
|
||||||
Handle<AbstractCode> code = ToAbstractCode(builtin_code, isolate);
|
Handle<AbstractCode> code = Handle<AbstractCode>::cast(builtin_code);
|
||||||
PROFILE(isolate, CodeCreateEvent(LogEventListener::CodeTag::kBuiltin, code,
|
PROFILE(isolate, CodeCreateEvent(LogEventListener::CodeTag::kBuiltin, code,
|
||||||
Builtins::name(FromInt(i))));
|
Builtins::name(FromInt(i))));
|
||||||
}
|
}
|
||||||
|
|
||||||
static_assert(kLastBytecodeHandlerPlusOne == kBuiltinCount);
|
static_assert(kLastBytecodeHandlerPlusOne == kBuiltinCount);
|
||||||
for (; i < kBuiltinCount; i++) {
|
for (; i < kBuiltinCount; i++) {
|
||||||
Handle<CodeT> builtin_code(&builtins[i]);
|
Handle<Code> builtin_code(&builtins[i]);
|
||||||
Handle<AbstractCode> code = ToAbstractCode(builtin_code, isolate);
|
Handle<AbstractCode> code = Handle<AbstractCode>::cast(builtin_code);
|
||||||
interpreter::Bytecode bytecode =
|
interpreter::Bytecode bytecode =
|
||||||
builtin_metadata[i].data.bytecode_and_scale.bytecode;
|
builtin_metadata[i].data.bytecode_and_scale.bytecode;
|
||||||
interpreter::OperandScale scale =
|
interpreter::OperandScale scale =
|
||||||
@ -352,87 +359,6 @@ void Builtins::EmitCodeCreateEvents(Isolate* isolate) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace {
|
|
||||||
enum TrampolineType { kAbort, kJump };
|
|
||||||
|
|
||||||
class OffHeapTrampolineGenerator {
|
|
||||||
public:
|
|
||||||
explicit OffHeapTrampolineGenerator(Isolate* isolate)
|
|
||||||
: isolate_(isolate),
|
|
||||||
masm_(isolate, AssemblerOptions::DefaultForOffHeapTrampoline(isolate),
|
|
||||||
CodeObjectRequired::kYes,
|
|
||||||
ExternalAssemblerBuffer(buffer_, kBufferSize)) {}
|
|
||||||
|
|
||||||
CodeDesc Generate(Address off_heap_entry, TrampolineType type) {
|
|
||||||
// Generate replacement code that simply tail-calls the off-heap code.
|
|
||||||
DCHECK(!masm_.has_frame());
|
|
||||||
{
|
|
||||||
FrameScope scope(&masm_, StackFrame::NO_FRAME_TYPE);
|
|
||||||
if (type == TrampolineType::kJump) {
|
|
||||||
masm_.CodeEntry();
|
|
||||||
masm_.JumpToOffHeapInstructionStream(off_heap_entry);
|
|
||||||
} else {
|
|
||||||
DCHECK_EQ(type, TrampolineType::kAbort);
|
|
||||||
masm_.Trap();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
CodeDesc desc;
|
|
||||||
masm_.GetCode(isolate_, &desc);
|
|
||||||
return desc;
|
|
||||||
}
|
|
||||||
|
|
||||||
Handle<HeapObject> CodeObject() { return masm_.CodeObject(); }
|
|
||||||
|
|
||||||
private:
|
|
||||||
Isolate* isolate_;
|
|
||||||
// Enough to fit the single jmp.
|
|
||||||
static constexpr int kBufferSize = 256;
|
|
||||||
byte buffer_[kBufferSize];
|
|
||||||
MacroAssembler masm_;
|
|
||||||
};
|
|
||||||
|
|
||||||
constexpr int OffHeapTrampolineGenerator::kBufferSize;
|
|
||||||
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
// static
|
|
||||||
Handle<Code> Builtins::GenerateOffHeapTrampolineFor(
|
|
||||||
Isolate* isolate, Address off_heap_entry, int32_t kind_specific_flags,
|
|
||||||
bool generate_jump_to_instruction_stream) {
|
|
||||||
DCHECK_NOT_NULL(isolate->embedded_blob_code());
|
|
||||||
DCHECK_NE(0, isolate->embedded_blob_code_size());
|
|
||||||
|
|
||||||
OffHeapTrampolineGenerator generator(isolate);
|
|
||||||
|
|
||||||
CodeDesc desc =
|
|
||||||
generator.Generate(off_heap_entry, generate_jump_to_instruction_stream
|
|
||||||
? TrampolineType::kJump
|
|
||||||
: TrampolineType::kAbort);
|
|
||||||
|
|
||||||
return Factory::CodeBuilder(isolate, desc, CodeKind::BUILTIN)
|
|
||||||
.set_kind_specific_flags(kind_specific_flags)
|
|
||||||
.set_read_only_data_container(!V8_EXTERNAL_CODE_SPACE_BOOL)
|
|
||||||
.set_self_reference(generator.CodeObject())
|
|
||||||
.set_is_executable(generate_jump_to_instruction_stream)
|
|
||||||
.Build();
|
|
||||||
}
|
|
||||||
|
|
||||||
// static
|
|
||||||
Handle<ByteArray> Builtins::GenerateOffHeapTrampolineRelocInfo(
|
|
||||||
Isolate* isolate) {
|
|
||||||
OffHeapTrampolineGenerator generator(isolate);
|
|
||||||
// Generate a jump to a dummy address as we're not actually interested in the
|
|
||||||
// generated instruction stream.
|
|
||||||
CodeDesc desc = generator.Generate(kNullAddress, TrampolineType::kJump);
|
|
||||||
|
|
||||||
Handle<ByteArray> reloc_info = isolate->factory()->NewByteArray(
|
|
||||||
desc.reloc_size, AllocationType::kReadOnly);
|
|
||||||
Code::CopyRelocInfoToByteArray(*reloc_info, desc);
|
|
||||||
|
|
||||||
return reloc_info;
|
|
||||||
}
|
|
||||||
|
|
||||||
// static
|
// static
|
||||||
Handle<Code> Builtins::CreateInterpreterEntryTrampolineForProfiling(
|
Handle<Code> Builtins::CreateInterpreterEntryTrampolineForProfiling(
|
||||||
Isolate* isolate) {
|
Isolate* isolate) {
|
||||||
@ -469,19 +395,13 @@ Handle<Code> Builtins::CreateInterpreterEntryTrampolineForProfiling(
|
|||||||
|
|
||||||
CodeDesc::Verify(&desc);
|
CodeDesc::Verify(&desc);
|
||||||
|
|
||||||
int kind_specific_flags;
|
const int kind_specific_flags =
|
||||||
{
|
isolate->builtins()->code(builtin).kind_specific_flags(kRelaxedLoad);
|
||||||
CodeT code = isolate->builtins()->code(builtin);
|
|
||||||
kind_specific_flags =
|
|
||||||
CodeDataContainerFromCodeT(code).kind_specific_flags(kRelaxedLoad);
|
|
||||||
}
|
|
||||||
|
|
||||||
return Factory::CodeBuilder(isolate, desc, CodeKind::BUILTIN)
|
return Factory::CodeBuilder(isolate, desc, CodeKind::BUILTIN)
|
||||||
.set_kind_specific_flags(kind_specific_flags)
|
.set_kind_specific_flags(kind_specific_flags)
|
||||||
.set_read_only_data_container(false)
|
|
||||||
// Mimic the InterpreterEntryTrampoline.
|
// Mimic the InterpreterEntryTrampoline.
|
||||||
.set_builtin(Builtin::kInterpreterEntryTrampoline)
|
.set_builtin(Builtin::kInterpreterEntryTrampoline)
|
||||||
.set_is_executable(true)
|
|
||||||
.Build();
|
.Build();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -526,64 +446,6 @@ bool Builtins::AllowDynamicFunction(Isolate* isolate, Handle<JSFunction> target,
|
|||||||
return isolate->MayAccess(responsible_context, target_global_proxy);
|
return isolate->MayAccess(responsible_context, target_global_proxy);
|
||||||
}
|
}
|
||||||
|
|
||||||
// static
|
|
||||||
bool Builtins::CodeObjectIsExecutable(Builtin builtin) {
|
|
||||||
// If the runtime/optimized code always knows when executing a given builtin
|
|
||||||
// that it is a builtin, then that builtin does not need an executable Code
|
|
||||||
// object. Such Code objects can go in read_only_space (and can even be
|
|
||||||
// smaller with no branch instruction), thus saving memory.
|
|
||||||
|
|
||||||
// Builtins with JS linkage will always have executable Code objects since
|
|
||||||
// they can be called directly from jitted code with no way of determining
|
|
||||||
// that they are builtins at generation time. E.g.
|
|
||||||
// f = Array.of;
|
|
||||||
// f(1, 2, 3);
|
|
||||||
// TODO(delphick): This is probably too loose but for now Wasm can call any JS
|
|
||||||
// linkage builtin via its Code object. Once Wasm is fixed this can either be
|
|
||||||
// tighted or removed completely.
|
|
||||||
if (Builtins::KindOf(builtin) != BCH && HasJSLinkage(builtin)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// There are some other non-TF builtins that also have JS linkage like
|
|
||||||
// InterpreterEntryTrampoline which are explicitly allow-listed below.
|
|
||||||
// TODO(delphick): Some of these builtins do not fit with the above, but
|
|
||||||
// currently cause problems if they're not executable. This list should be
|
|
||||||
// pared down as much as possible.
|
|
||||||
switch (builtin) {
|
|
||||||
case Builtin::kInterpreterEntryTrampoline:
|
|
||||||
case Builtin::kCompileLazy:
|
|
||||||
case Builtin::kCompileLazyDeoptimizedCode:
|
|
||||||
case Builtin::kCallFunction_ReceiverIsNullOrUndefined:
|
|
||||||
case Builtin::kCallFunction_ReceiverIsNotNullOrUndefined:
|
|
||||||
case Builtin::kCallFunction_ReceiverIsAny:
|
|
||||||
case Builtin::kCallBoundFunction:
|
|
||||||
case Builtin::kCall_ReceiverIsNullOrUndefined:
|
|
||||||
case Builtin::kCall_ReceiverIsNotNullOrUndefined:
|
|
||||||
case Builtin::kCall_ReceiverIsAny:
|
|
||||||
case Builtin::kHandleApiCall:
|
|
||||||
case Builtin::kInstantiateAsmJs:
|
|
||||||
#if V8_ENABLE_WEBASSEMBLY
|
|
||||||
case Builtin::kGenericJSToWasmWrapper:
|
|
||||||
case Builtin::kWasmReturnPromiseOnSuspend:
|
|
||||||
#endif // V8_ENABLE_WEBASSEMBLY
|
|
||||||
|
|
||||||
// TODO(delphick): Remove this when calls to it have the trampoline inlined
|
|
||||||
// or are converted to use kCallBuiltinPointer.
|
|
||||||
case Builtin::kCEntry_Return1_DontSaveFPRegs_ArgvOnStack_NoBuiltinExit:
|
|
||||||
return true;
|
|
||||||
default:
|
|
||||||
#if V8_TARGET_ARCH_MIPS64
|
|
||||||
// TODO(Loongson): Move non-JS linkage builtins code objects into RO_SPACE
|
|
||||||
// caused MIPS platform to crash, and we need some time to handle it. Now
|
|
||||||
// disable this change temporarily on MIPS platform.
|
|
||||||
return true;
|
|
||||||
#else
|
|
||||||
return false;
|
|
||||||
#endif // V8_TARGET_ARCH_MIPS64
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Builtin ExampleBuiltinForTorqueFunctionPointerType(
|
Builtin ExampleBuiltinForTorqueFunctionPointerType(
|
||||||
size_t function_pointer_type_id) {
|
size_t function_pointer_type_id) {
|
||||||
switch (function_pointer_type_id) {
|
switch (function_pointer_type_id) {
|
||||||
|
@ -138,17 +138,17 @@ class Builtins {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Convenience wrappers.
|
// Convenience wrappers.
|
||||||
Handle<CodeT> CallFunction(ConvertReceiverMode = ConvertReceiverMode::kAny);
|
Handle<Code> CallFunction(ConvertReceiverMode = ConvertReceiverMode::kAny);
|
||||||
Handle<CodeT> Call(ConvertReceiverMode = ConvertReceiverMode::kAny);
|
Handle<Code> Call(ConvertReceiverMode = ConvertReceiverMode::kAny);
|
||||||
Handle<CodeT> NonPrimitiveToPrimitive(
|
Handle<Code> NonPrimitiveToPrimitive(
|
||||||
ToPrimitiveHint hint = ToPrimitiveHint::kDefault);
|
ToPrimitiveHint hint = ToPrimitiveHint::kDefault);
|
||||||
Handle<CodeT> OrdinaryToPrimitive(OrdinaryToPrimitiveHint hint);
|
Handle<Code> OrdinaryToPrimitive(OrdinaryToPrimitiveHint hint);
|
||||||
|
|
||||||
// Used by CreateOffHeapTrampolines in isolate.cc.
|
// Used by CreateOffHeapTrampolines in isolate.cc.
|
||||||
void set_code(Builtin builtin, CodeT code);
|
void set_code(Builtin builtin, Code code);
|
||||||
|
|
||||||
V8_EXPORT_PRIVATE CodeT code(Builtin builtin);
|
V8_EXPORT_PRIVATE Code code(Builtin builtin);
|
||||||
V8_EXPORT_PRIVATE Handle<CodeT> code_handle(Builtin builtin);
|
V8_EXPORT_PRIVATE Handle<Code> code_handle(Builtin builtin);
|
||||||
|
|
||||||
static CallInterfaceDescriptor CallInterfaceDescriptorFor(Builtin builtin);
|
static CallInterfaceDescriptor CallInterfaceDescriptorFor(Builtin builtin);
|
||||||
V8_EXPORT_PRIVATE static Callable CallableFor(Isolate* isolate,
|
V8_EXPORT_PRIVATE static Callable CallableFor(Isolate* isolate,
|
||||||
@ -173,8 +173,8 @@ class Builtins {
|
|||||||
static bool IsCpp(Builtin builtin);
|
static bool IsCpp(Builtin builtin);
|
||||||
|
|
||||||
// True, iff the given code object is a builtin. Note that this does not
|
// True, iff the given code object is a builtin. Note that this does not
|
||||||
// necessarily mean that its kind is Code::BUILTIN.
|
// necessarily mean that its kind is InstructionStream::BUILTIN.
|
||||||
static bool IsBuiltin(const Code code);
|
static bool IsBuiltin(const InstructionStream code);
|
||||||
|
|
||||||
// As above, but safe to access off the main thread since the check is done
|
// As above, but safe to access off the main thread since the check is done
|
||||||
// by handle location. Similar to Heap::IsRootHandle.
|
// by handle location. Similar to Heap::IsRootHandle.
|
||||||
@ -192,12 +192,7 @@ class Builtins {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// True, iff the given code object is a builtin with off-heap embedded code.
|
// True, iff the given code object is a builtin with off-heap embedded code.
|
||||||
template <typename CodeOrCodeT>
|
static bool IsIsolateIndependentBuiltin(Code code);
|
||||||
static bool IsIsolateIndependentBuiltin(CodeOrCodeT code) {
|
|
||||||
Builtin builtin = code.builtin_id();
|
|
||||||
return Builtins::IsBuiltinId(builtin) &&
|
|
||||||
Builtins::IsIsolateIndependent(builtin);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void InitializeIsolateDataTables(Isolate* isolate);
|
static void InitializeIsolateDataTables(Isolate* isolate);
|
||||||
|
|
||||||
@ -220,34 +215,15 @@ class Builtins {
|
|||||||
static void Generate_Adaptor(MacroAssembler* masm, Address builtin_address);
|
static void Generate_Adaptor(MacroAssembler* masm, Address builtin_address);
|
||||||
|
|
||||||
static void Generate_CEntry(MacroAssembler* masm, int result_size,
|
static void Generate_CEntry(MacroAssembler* masm, int result_size,
|
||||||
SaveFPRegsMode save_doubles, ArgvMode argv_mode,
|
ArgvMode argv_mode, bool builtin_exit_frame);
|
||||||
bool builtin_exit_frame);
|
|
||||||
|
|
||||||
static bool AllowDynamicFunction(Isolate* isolate, Handle<JSFunction> target,
|
static bool AllowDynamicFunction(Isolate* isolate, Handle<JSFunction> target,
|
||||||
Handle<JSObject> target_global_proxy);
|
Handle<JSObject> target_global_proxy);
|
||||||
|
|
||||||
// Creates a trampoline code object that jumps to the given off-heap entry.
|
|
||||||
// The result should not be used directly, but only from the related Factory
|
|
||||||
// function.
|
|
||||||
// TODO(delphick): Come up with a better name since it may not generate an
|
|
||||||
// executable trampoline.
|
|
||||||
static Handle<Code> GenerateOffHeapTrampolineFor(
|
|
||||||
Isolate* isolate, Address off_heap_entry, int32_t kind_specific_flags,
|
|
||||||
bool generate_jump_to_instruction_stream);
|
|
||||||
|
|
||||||
// Generate the RelocInfo ByteArray that would be generated for an offheap
|
|
||||||
// trampoline.
|
|
||||||
static Handle<ByteArray> GenerateOffHeapTrampolineRelocInfo(Isolate* isolate);
|
|
||||||
|
|
||||||
// Creates a copy of InterpreterEntryTrampolineForProfiling in the code space.
|
// Creates a copy of InterpreterEntryTrampolineForProfiling in the code space.
|
||||||
static Handle<Code> CreateInterpreterEntryTrampolineForProfiling(
|
static Handle<Code> CreateInterpreterEntryTrampolineForProfiling(
|
||||||
Isolate* isolate);
|
Isolate* isolate);
|
||||||
|
|
||||||
// Only builtins with JS linkage should ever need to be called via their
|
|
||||||
// trampoline Code object. The remaining builtins have non-executable Code
|
|
||||||
// objects.
|
|
||||||
static bool CodeObjectIsExecutable(Builtin builtin);
|
|
||||||
|
|
||||||
static bool IsJSEntryVariant(Builtin builtin) {
|
static bool IsJSEntryVariant(Builtin builtin) {
|
||||||
switch (builtin) {
|
switch (builtin) {
|
||||||
case Builtin::kJSEntry:
|
case Builtin::kJSEntry:
|
||||||
@ -288,10 +264,10 @@ class Builtins {
|
|||||||
|
|
||||||
enum class CallOrConstructMode { kCall, kConstruct };
|
enum class CallOrConstructMode { kCall, kConstruct };
|
||||||
static void Generate_CallOrConstructVarargs(MacroAssembler* masm,
|
static void Generate_CallOrConstructVarargs(MacroAssembler* masm,
|
||||||
Handle<CodeT> code);
|
Handle<Code> code);
|
||||||
static void Generate_CallOrConstructForwardVarargs(MacroAssembler* masm,
|
static void Generate_CallOrConstructForwardVarargs(MacroAssembler* masm,
|
||||||
CallOrConstructMode mode,
|
CallOrConstructMode mode,
|
||||||
Handle<CodeT> code);
|
Handle<Code> code);
|
||||||
|
|
||||||
enum class InterpreterEntryTrampolineMode {
|
enum class InterpreterEntryTrampolineMode {
|
||||||
// The version of InterpreterEntryTrampoline used by default.
|
// The version of InterpreterEntryTrampoline used by default.
|
||||||
@ -335,8 +311,8 @@ class Builtins {
|
|||||||
};
|
};
|
||||||
|
|
||||||
V8_INLINE constexpr bool IsInterpreterTrampolineBuiltin(Builtin builtin_id) {
|
V8_INLINE constexpr bool IsInterpreterTrampolineBuiltin(Builtin builtin_id) {
|
||||||
// Check for kNoBuiltinId first to abort early when the current Code object
|
// Check for kNoBuiltinId first to abort early when the current
|
||||||
// is not a builtin.
|
// InstructionStream object is not a builtin.
|
||||||
return builtin_id != Builtin::kNoBuiltinId &&
|
return builtin_id != Builtin::kNoBuiltinId &&
|
||||||
(builtin_id == Builtin::kInterpreterEntryTrampoline ||
|
(builtin_id == Builtin::kInterpreterEntryTrampoline ||
|
||||||
builtin_id == Builtin::kInterpreterEnterAtBytecode ||
|
builtin_id == Builtin::kInterpreterEnterAtBytecode ||
|
||||||
@ -344,8 +320,8 @@ V8_INLINE constexpr bool IsInterpreterTrampolineBuiltin(Builtin builtin_id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
V8_INLINE constexpr bool IsBaselineTrampolineBuiltin(Builtin builtin_id) {
|
V8_INLINE constexpr bool IsBaselineTrampolineBuiltin(Builtin builtin_id) {
|
||||||
// Check for kNoBuiltinId first to abort early when the current Code object
|
// Check for kNoBuiltinId first to abort early when the current
|
||||||
// is not a builtin.
|
// InstructionStream object is not a builtin.
|
||||||
return builtin_id != Builtin::kNoBuiltinId &&
|
return builtin_id != Builtin::kNoBuiltinId &&
|
||||||
(builtin_id == Builtin::kBaselineOutOfLinePrologue ||
|
(builtin_id == Builtin::kBaselineOutOfLinePrologue ||
|
||||||
builtin_id == Builtin::kBaselineOutOfLinePrologueDeopt ||
|
builtin_id == Builtin::kBaselineOutOfLinePrologueDeopt ||
|
||||||
|
@ -30,13 +30,13 @@ macro IsCell(o: HeapObject): bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@export
|
@export
|
||||||
macro IsCode(o: HeapObject): bool {
|
macro IsInstructionStream(o: HeapObject): bool {
|
||||||
return Is<Code>(o);
|
return Is<InstructionStream>(o);
|
||||||
}
|
}
|
||||||
|
|
||||||
@export
|
@export
|
||||||
macro IsCodeDataContainer(o: HeapObject): bool {
|
macro IsCode(o: HeapObject): bool {
|
||||||
return Is<CodeDataContainer>(o);
|
return Is<Code>(o);
|
||||||
}
|
}
|
||||||
|
|
||||||
@export
|
@export
|
||||||
|
@ -43,7 +43,7 @@ uint32_t BuiltinsConstantsTableBuilder::AddObject(Handle<Object> object) {
|
|||||||
|
|
||||||
// All code objects should be loaded through the root register or use
|
// All code objects should be loaded through the root register or use
|
||||||
// pc-relative addressing.
|
// pc-relative addressing.
|
||||||
DCHECK(!object->IsCode());
|
DCHECK(!object->IsInstructionStream());
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
auto find_result = map_.FindOrInsert(object);
|
auto find_result = map_.FindOrInsert(object);
|
||||||
@ -73,7 +73,7 @@ void CheckPreconditionsForPatching(Isolate* isolate,
|
|||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
void BuiltinsConstantsTableBuilder::PatchSelfReference(
|
void BuiltinsConstantsTableBuilder::PatchSelfReference(
|
||||||
Handle<Object> self_reference, Handle<Code> code_object) {
|
Handle<Object> self_reference, Handle<InstructionStream> code_object) {
|
||||||
CheckPreconditionsForPatching(isolate_, code_object);
|
CheckPreconditionsForPatching(isolate_, code_object);
|
||||||
DCHECK(self_reference->IsOddball());
|
DCHECK(self_reference->IsOddball());
|
||||||
DCHECK(Oddball::cast(*self_reference).kind() ==
|
DCHECK(Oddball::cast(*self_reference).kind() ==
|
||||||
@ -81,7 +81,7 @@ void BuiltinsConstantsTableBuilder::PatchSelfReference(
|
|||||||
|
|
||||||
uint32_t key;
|
uint32_t key;
|
||||||
if (map_.Delete(self_reference, &key)) {
|
if (map_.Delete(self_reference, &key)) {
|
||||||
DCHECK(code_object->IsCode());
|
DCHECK(code_object->IsInstructionStream());
|
||||||
map_.Insert(code_object, key);
|
map_.Insert(code_object, key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user