Enable gigacage on iOS
https://bugs.webkit.org/show_bug.cgi?id=177586
Reviewed by JF Bastien.
JSTests:
Add tests for when Gigacage gets runtime disabled.
- stress/disable-gigacage-arrays.js: Added.
(foo):
- stress/disable-gigacage-strings.js: Added.
(foo):
- stress/disable-gigacage-typed-arrays.js: Added.
(foo):
Source/bmalloc:
Introduce the ability to disable gigacage at runtime if allocation fails. If any step of gigacage
allocation fails, we free all of the gigacages and turn off gigacage support.
- CMakeLists.txt:
- bmalloc.xcodeproj/project.pbxproj:
- bmalloc/Cache.cpp:
(bmalloc::Cache::scavenge):
(bmalloc::Cache::tryAllocate):
(bmalloc::Cache::allocate):
(bmalloc::Cache::deallocate):
(bmalloc::Cache::reallocate):
(Gigacage::ensureGigacage):
(Gigacage::runway):
(Gigacage::totalSize):
(Gigacage::shouldBeEnabled):
(): Deleted.
(Gigacage::Callback::Callback): Deleted.
(Gigacage::Callback::function): Deleted.
(Gigacage::PrimitiveDisableCallbacks::PrimitiveDisableCallbacks): Deleted.
(Gigacage::wasEnabled):
(Gigacage::isEnabled):
(Gigacage::runway): Deleted.
(Gigacage::totalSize): Deleted.
- bmalloc/HeapKind.cpp: Added.
(bmalloc::isActiveHeapKind):
(bmalloc::mapToActiveHeapKind):
(bmalloc::isActiveHeapKindAfterEnsuringGigacage):
(bmalloc::mapToActiveHeapKindAfterEnsuringGigacage):
(bmalloc::Scavenger::scavenge):
(bmalloc::api::tryLargeMemalignVirtual):
(bmalloc::api::freeLargeVirtual):
(bmalloc::api::isEnabled):
Source/JavaScriptCore:
The hardest part of enabling Gigacage on iOS is that it requires loading global variables while
executing JS, so the LLInt needs to know how to load from global variables on all platforms that
have Gigacage. So, this teaches ARM64 how to load from global variables.
Also, this makes the code handle disabling the gigacage a bit better.
(JSC::FTL::DFG::LowerDFGToB3::caged):
(JSC::AssemblyHelpers::cage):
(JSC::AssemblyHelpers::cageConditionally):
- offlineasm/arm64.rb:
- offlineasm/asm.rb:
- offlineasm/instructions.rb:
Tools:
Add a mode to test disabling Gigacage.
- Scripts/run-jsc-stress-tests:
- Scripts/webkitruby/jsc-stress-test-writer-default.rb: