[CMake] Use WEBKIT_EXECUTABLE in MallocBench
[WebKit-https.git] / Source / bmalloc / ChangeLog
1 2020-05-09  Don Olmstead  <don.olmstead@sony.com>
2
3         [CMake] Use WEBKIT_EXECUTABLE in MallocBench
4         https://bugs.webkit.org/show_bug.cgi?id=211665
5
6         Reviewed by Yusuke Suzuki.
7
8         Only build mbmalloc if its possible to run MallocBench.
9
10         * CMakeLists.txt:
11
12 2020-05-08  Basuke Suzuki  <basuke.suzuki@sony.com>
13
14         [WTF] Share Linux's MemoryPressureHandler among other Unix ports
15         https://bugs.webkit.org/show_bug.cgi?id=208955
16
17         Reviewed by Yusuke Suzuki.
18
19         Added FreeBSD implementation of memoryFootprint().
20
21         * bmalloc/AvailableMemory.cpp:
22         (bmalloc::memoryStatus):
23         * bmalloc/AvailableMemory.h:
24         (bmalloc::isUnderMemoryPressure):
25         * bmalloc/bmalloc.h:
26
27 2020-05-05  Saam Barati  <sbarati@apple.com>
28
29         Don't use the DebugHeap for catalyst
30         https://bugs.webkit.org/show_bug.cgi?id=211471
31
32         Reviewed by Tim Horton.
33
34         * bmalloc/BPlatform.h:
35         * bmalloc/Environment.cpp:
36         (bmalloc::Environment::computeIsDebugHeapEnabled):
37         * bmalloc/ProcessCheck.h:
38         (bmalloc::shouldProcessUnconditionallyUseBmalloc): Deleted.
39         * bmalloc/ProcessCheck.mm:
40
41 2020-05-01  Don Olmstead  <don.olmstead@sony.com>
42
43         Use export macros on all platforms
44         https://bugs.webkit.org/show_bug.cgi?id=211293
45
46         Reviewed by Michael Catanzaro.
47
48         Always use export macros on all platforms. Remove BUSE_EXPORT_MACROS and always
49         define macros based on the platform. Allow overriding of BEXPORT if desired
50         otherwise use the defaults.
51
52         * bmalloc/BExport.h:
53         * bmalloc/BPlatform.h:
54
55 2020-04-29  Mark Lam  <mark.lam@apple.com>
56
57         Freezing of Gigacage and JSC Configs should be thread safe.
58         https://bugs.webkit.org/show_bug.cgi?id=211201
59         <rdar://problem/62597619>
60
61         Reviewed by Yusuke Suzuki.
62
63         * bmalloc/Gigacage.cpp:
64         (Gigacage::bmalloc::permanentlyFreezeGigacageConfig):
65
66 2020-04-25  Darin Adler  <darin@apple.com>
67
68         [Cocoa] Deal with another round of Xcode upgrade checks
69         https://bugs.webkit.org/show_bug.cgi?id=211027
70
71         Reviewed by Alexey Proskuryakov.
72
73         * bmalloc.xcodeproj/project.pbxproj: Bump the upgrade check version.
74         Add a harmless base localization; this project contains nothing localized.
75
76 2020-04-07  Saam Barati  <sbarati@apple.com>
77
78         RAMification should have a way of gathering vmmaps for each test at the end of each run
79         https://bugs.webkit.org/show_bug.cgi?id=210060
80
81         Reviewed by Yusuke Suzuki.
82
83         * bmalloc/Scavenger.cpp:
84         (bmalloc::Scavenger::scavenge):
85         (bmalloc::Scavenger::partialScavenge):
86         * bmalloc/Scavenger.h:
87         (bmalloc::Scavenger::disable):
88         * bmalloc/bmalloc.cpp:
89         (bmalloc::api::disableScavenger):
90         * bmalloc/bmalloc.h:
91
92 2020-04-03  David Kilzer  <ddkilzer@apple.com>
93
94         [Xcode] Replace ASAN_OTHER_CFLAGS and ASAN_OTHER_CPLUSPLUSFLAGS with $(inherited)
95         <https://webkit.org/b/209963>
96         <rdar://problem/61257504>
97
98         Reviewed by Alexey Proskuryakov.
99
100         * Configurations/Base.xcconfig:
101         - Remove ASAN_OTHER_CFLAGS, ASAN_OTHER_CPLUSPLUSFLAGS and
102           ASAN_OTHER_LDFLAGS.
103
104 2020-04-01  Michael Catanzaro  <mcatanzaro@gnome.org>
105
106         Update check for aarch64
107         https://bugs.webkit.org/show_bug.cgi?id=209322
108         <rdar://problem/61135818>
109
110         Reviewed by Mark Lam.
111
112         Update BPlatform.h to follow the corresponding change in WTF's PlatformCPU.h.
113
114         * bmalloc/BPlatform.h:
115
116 2020-03-15  Yusuke Suzuki  <ysuzuki@apple.com>
117
118         Should not use variable-length-array (VLA)
119         https://bugs.webkit.org/show_bug.cgi?id=209043
120
121         Reviewed by Mark Lam.
122
123         * Configurations/Base.xcconfig:
124
125 2020-03-13  Saam Barati  <sbarati@apple.com>
126
127         configSizeToProtect should be 16KB
128         https://bugs.webkit.org/show_bug.cgi?id=209068
129
130         Reviewed by Keith Miller.
131
132         * bmalloc/Gigacage.h:
133
134 2020-03-09  Mike Gorse  <mgorse@suse.com>
135
136         Build failure on ppc64le if __unix is undefined
137         https://bugs.webkit.org/show_bug.cgi?id=207906
138
139         Reviewed by Yusuke Suzuki.
140
141         * bmalloc/BPlatform.h: Check for __unix__ along with __unix.
142
143 2020-03-02  Alan Coon  <alancoon@apple.com>
144
145         Add new Mac target numbers
146         https://bugs.webkit.org/show_bug.cgi?id=208398
147
148         Reviewed by Alexey Proskuryakov.
149
150         * Configurations/Base.xcconfig:
151         * Configurations/DebugRelease.xcconfig:
152
153 2020-02-29  Yusuke Suzuki  <ysuzuki@apple.com>
154
155         Remove std::lock_guard
156         https://bugs.webkit.org/show_bug.cgi?id=206451
157
158         Reviewed by Anders Carlsson.
159
160         * bmalloc/Mutex.h:
161
162 2020-02-28  Saam Barati  <sbarati@apple.com>
163
164         Clean up code with how we choose Gigacage sizes and whether or not to use Wasm fast memory
165         https://bugs.webkit.org/show_bug.cgi?id=208392
166
167         Reviewed by Yusuke Suzuki.
168
169         * bmalloc/Gigacage.h:
170
171 2020-02-26  Basuke Suzuki  <basuke.suzuki@sony.com>
172
173         [bmalloc][PlayStation] Set Scavenger's thread name.
174         https://bugs.webkit.org/show_bug.cgi?id=208268
175
176         Reviewed by Alex Christensen.
177
178         We also need to have our thread with proper name.
179
180         * bmalloc/Scavenger.cpp:
181         (bmalloc::Scavenger::setThreadName):
182
183 2020-02-25  Saam Barati  <sbarati@apple.com>
184
185         Update stale comment about PackedAlignedPtr
186         https://bugs.webkit.org/show_bug.cgi?id=208176
187
188         Reviewed by Yusuke Suzuki.
189
190         The comment was stale since cells aren't guaranteed anymore to be
191         aligned on 16 byte boundaries because of the GCs precise allocations.
192
193         * bmalloc/Packed.h:
194
195 2020-02-09  Keith Rollin  <krollin@apple.com>
196
197         Re-enable LTO for ARM builds
198         https://bugs.webkit.org/show_bug.cgi?id=207402
199         <rdar://problem/49190767>
200
201         Reviewed by Sam Weinig.
202
203         Bug 190758 re-enabled LTO for Production builds for x86-family CPUs.
204         Enabling it for ARM was left out due to a compiler issue. That issue
205         has been fixed, and so now we can re-enable LTO for ARM.
206
207         * Configurations/Base.xcconfig:
208
209 2020-02-08  Basuke Suzuki  <basuke.suzuki@sony.com>
210
211         [bmalloc] VMHeap can be merge into Heap
212         https://bugs.webkit.org/show_bug.cgi?id=207410
213
214         Reviewed by Yusuke Suzuki.
215
216         VMHeap has only one member function in it and Heap is the only client of that.
217         No member variable is defined. It does nothing special with its context as a class.
218         It is safe to merge the function into Heap.
219
220         * CMakeLists.txt:
221         * bmalloc.xcodeproj/project.pbxproj:
222         * bmalloc/Heap.cpp:
223         (bmalloc::Heap::allocateLarge):
224         (bmalloc::Heap::tryAllocateLargeChunk): Moved from VMHeap.
225         * bmalloc/Heap.h:
226         * bmalloc/VMHeap.cpp: Removed.
227         * bmalloc/VMHeap.h: Removed.
228
229 2020-02-05  Don Olmstead  <don.olmstead@sony.com>
230
231         [bmalloc] Add declspec support for export macros
232         https://bugs.webkit.org/show_bug.cgi?id=207158
233
234         Reviewed by Yusuke Suzuki.
235
236         Add a check for __has_declspec_attribute which is a Clang extension for Microsoft
237         style __declspec attributes in BCompiler.h. Then use that check within BPlatform.h
238         to determine if __declspec or visibility("default") should be used for the export
239         macros.
240
241         The BExport.h file was then expanded to properly implement __declspec definitions
242         for export and import. Libraries that could be compiled statically in WebKit have
243         a STATICALLY_LINKED_WITH_${library} definition for when they're compiled statically
244         and later exposed through a different shared library. In practice though this is
245         really only needed when __declspec is used since this is the only case where the
246         import and export declarations differ.
247
248         The BEXPORT on StaticPerProcess resulted in undefined symbol errors when WebCore
249         was linked. Specifically IsoSharedHeap::getFastCase and IsoSharedHeap::getSlowCase
250         which is a subclass. It appears that Storage was the only one required to be
251         exported. This only appeared due to how __declspec requires exports and imports
252         to be defined differently.
253
254         Also added support for export macros on PlayStation in the BPlatform.h file and
255         fixed any exports for that platform when building.
256
257         * CMakeLists.txt:
258         * bmalloc/Allocator.h:
259         * bmalloc/AvailableMemory.h:
260         * bmalloc/BCompiler.h:
261         * bmalloc/BExport.h:
262         * bmalloc/BPlatform.h:
263         * bmalloc/Cache.h:
264         * bmalloc/IsoTLS.h:
265         * bmalloc/StaticPerProcess.h:
266
267 2020-01-21  Basuke Suzuki  <basuke.suzuki@sony.com>
268
269         [bmalloc] Make use of LockHolder strict in some methods of Scavenger
270         https://bugs.webkit.org/show_bug.cgi?id=206460
271
272         Reviewed by Darin Adler.
273
274         For instance, Scavenger::runHoldingLock() assume the caller has lock and express that by its function name. This rule can be
275         strict by passing LockHolder and that's the way as other code do.
276
277         Same change to runSoonHoldingLock and scheduleIfUnderMemoryPressureHoldingLock.
278
279         * bmalloc/Scavenger.cpp:
280         (bmalloc::Scavenger::run):
281         (bmalloc::Scavenger::runSoon):
282         (bmalloc::Scavenger::scheduleIfUnderMemoryPressure):
283         (bmalloc::Scavenger::schedule):
284         (bmalloc::Scavenger::runHoldingLock): Renamed.
285         (bmalloc::Scavenger::runSoonHoldingLock): Renamed.
286         (bmalloc::Scavenger::scheduleIfUnderMemoryPressureHoldingLock): Renamed.
287         * bmalloc/Scavenger.h:
288
289 2020-01-17  Sam Weinig  <weinig@apple.com>
290
291         Platform.h is out of control Part 8: Macros are used inconsistently
292         https://bugs.webkit.org/show_bug.cgi?id=206425
293
294         Reviewed by Darin Adler.
295
296         * bmalloc/BPlatform.h:
297         Update OS_EFFECTIVE_ADDRESS_WIDTH to match WTF definition, add needed OS macros.
298
299 2020-01-20  David Kilzer  <ddkilzer@apple.com>
300
301         Fix missing header guards and clean up empty files in bmalloc, WTF, JavaScriptCore
302         <https://webkit.org/b/206481>
303
304         Reviewed by Darin Adler.
305
306         * bmalloc/PerThread.cpp: Remove empty file.
307         * bmalloc/ScopeExit.h: Add #pragma once.
308
309 2020-01-17  Basuke Suzuki  <basuke.suzuki@sony.com>
310
311         [bmalloc] Define alias for std::lock_guard and std::unique_lock for better readability
312         https://bugs.webkit.org/show_bug.cgi?id=206443
313
314         Reviewed by Yusuke Suzuki.
315
316         There are two types of lock holder in bmalloc: std::lock_guard and std::unique_lock. Their names are relatively long
317         and a bit harder to distinguish them each other. Define simple type name for them, LockHolder and UniqueLockHolder.
318
319         * bmalloc/AllIsoHeaps.cpp:
320         (bmalloc::AllIsoHeaps::AllIsoHeaps):
321         (bmalloc::AllIsoHeaps::add):
322         (bmalloc::AllIsoHeaps::head):
323         * bmalloc/AllIsoHeaps.h:
324         * bmalloc/Allocator.cpp:
325         (bmalloc::Allocator::reallocateImpl):
326         (bmalloc::Allocator::refillAllocatorSlowCase):
327         (bmalloc::Allocator::allocateLarge):
328         * bmalloc/CryptoRandom.cpp:
329         (bmalloc::ARC4RandomNumberGenerator::ARC4RandomNumberGenerator):
330         (bmalloc::ARC4RandomNumberGenerator::randomValues):
331         * bmalloc/Deallocator.cpp:
332         (bmalloc::Deallocator::scavenge):
333         (bmalloc::Deallocator::processObjectLog):
334         (bmalloc::Deallocator::deallocateSlowCase):
335         * bmalloc/Deallocator.h:
336         (bmalloc::Deallocator::lineCache):
337         * bmalloc/DebugHeap.cpp:
338         (bmalloc::DebugHeap::DebugHeap):
339         (bmalloc::DebugHeap::memalignLarge):
340         (bmalloc::DebugHeap::freeLarge):
341         * bmalloc/DebugHeap.h:
342         * bmalloc/DeferredTrigger.h:
343         * bmalloc/DeferredTriggerInlines.h:
344         (bmalloc::DeferredTrigger<trigger>::didBecome):
345         (bmalloc::DeferredTrigger<trigger>::handleDeferral):
346         * bmalloc/Environment.cpp:
347         (bmalloc::Environment::Environment):
348         * bmalloc/Environment.h:
349         * bmalloc/Gigacage.cpp:
350         (bmalloc::PrimitiveDisableCallbacks::PrimitiveDisableCallbacks):
351         (Gigacage::disablePrimitiveGigacage):
352         (Gigacage::addPrimitiveDisableCallback):
353         (Gigacage::removePrimitiveDisableCallback):
354         * bmalloc/Heap.cpp:
355         (bmalloc::Heap::Heap):
356         (bmalloc::Heap::freeableMemory):
357         (bmalloc::Heap::markAllLargeAsEligibile):
358         (bmalloc::Heap::decommitLargeRange):
359         (bmalloc::Heap::scavenge):
360         (bmalloc::Heap::scavengeToHighWatermark):
361         (bmalloc::Heap::deallocateLineCache):
362         (bmalloc::Heap::allocateSmallChunk):
363         (bmalloc::Heap::allocateSmallPage):
364         (bmalloc::Heap::deallocateSmallLine):
365         (bmalloc::Heap::allocateSmallBumpRangesByMetadata):
366         (bmalloc::Heap::allocateSmallBumpRangesByObject):
367         (bmalloc::Heap::splitAndAllocate):
368         (bmalloc::Heap::allocateLarge):
369         (bmalloc::Heap::isLarge):
370         (bmalloc::Heap::largeSize):
371         (bmalloc::Heap::shrinkLarge):
372         (bmalloc::Heap::deallocateLarge):
373         (bmalloc::Heap::externalCommit):
374         (bmalloc::Heap::externalDecommit):
375         * bmalloc/Heap.h:
376         (bmalloc::Heap::allocateSmallBumpRanges):
377         (bmalloc::Heap::derefSmallLine):
378         * bmalloc/HeapConstants.cpp:
379         (bmalloc::HeapConstants::HeapConstants):
380         * bmalloc/HeapConstants.h:
381         * bmalloc/IsoAllocatorInlines.h:
382         (bmalloc::IsoAllocator<Config>::allocateSlow):
383         (bmalloc::IsoAllocator<Config>::scavenge):
384         * bmalloc/IsoDeallocatorInlines.h:
385         (bmalloc::IsoDeallocator<Config>::deallocate):
386         (bmalloc::IsoDeallocator<Config>::scavenge):
387         * bmalloc/IsoDirectory.h:
388         * bmalloc/IsoDirectoryInlines.h:
389         (bmalloc::passedNumPages>::takeFirstEligible):
390         (bmalloc::passedNumPages>::didBecome):
391         (bmalloc::passedNumPages>::didDecommit):
392         (bmalloc::passedNumPages>::scavengePage):
393         (bmalloc::passedNumPages>::scavenge):
394         (bmalloc::passedNumPages>::scavengeToHighWatermark):
395         (bmalloc::passedNumPages>::forEachCommittedPage):
396         * bmalloc/IsoHeapImpl.h:
397         * bmalloc/IsoHeapImplInlines.h:
398         (bmalloc::IsoHeapImpl<Config>::takeFirstEligible):
399         (bmalloc::IsoHeapImpl<Config>::didBecomeEligibleOrDecommited):
400         (bmalloc::IsoHeapImpl<Config>::scavenge):
401         (bmalloc::IsoHeapImpl<Config>::scavengeToHighWatermark):
402         (bmalloc::IsoHeapImpl<Config>::numLiveObjects):
403         (bmalloc::IsoHeapImpl<Config>::numCommittedPages):
404         (bmalloc::IsoHeapImpl<Config>::forEachDirectory):
405         (bmalloc::IsoHeapImpl<Config>::forEachCommittedPage):
406         (bmalloc::IsoHeapImpl<Config>::forEachLiveObject):
407         (bmalloc::IsoHeapImpl<Config>::allocateFromShared):
408         * bmalloc/IsoPage.h:
409         * bmalloc/IsoPageInlines.h:
410         (bmalloc::IsoPage<Config>::free):
411         (bmalloc::IsoPage<Config>::startAllocating):
412         (bmalloc::IsoPage<Config>::stopAllocating):
413         (bmalloc::IsoPage<Config>::forEachLiveObject):
414         * bmalloc/IsoSharedHeap.h:
415         (bmalloc::IsoSharedHeap::IsoSharedHeap):
416         * bmalloc/IsoSharedHeapInlines.h:
417         (bmalloc::IsoSharedHeap::allocateNew):
418         (bmalloc::IsoSharedHeap::allocateSlow):
419         * bmalloc/IsoSharedPage.h:
420         * bmalloc/IsoSharedPageInlines.h:
421         (bmalloc::IsoSharedPage::free):
422         (bmalloc::IsoSharedPage::startAllocating):
423         (bmalloc::IsoSharedPage::stopAllocating):
424         * bmalloc/IsoTLSDeallocatorEntry.h:
425         * bmalloc/IsoTLSDeallocatorEntryInlines.h:
426         (bmalloc::IsoTLSDeallocatorEntry<Config>::IsoTLSDeallocatorEntry):
427         * bmalloc/IsoTLSInlines.h:
428         (bmalloc::IsoTLS::ensureHeap):
429         * bmalloc/IsoTLSLayout.cpp:
430         (bmalloc::IsoTLSLayout::IsoTLSLayout):
431         (bmalloc::IsoTLSLayout::add):
432         * bmalloc/IsoTLSLayout.h:
433         * bmalloc/Mutex.h:
434         (bmalloc::sleep):
435         (bmalloc::waitUntilFalse):
436         * bmalloc/ObjectType.cpp:
437         (bmalloc::objectType):
438         * bmalloc/PerProcess.cpp:
439         (bmalloc::getPerProcessData):
440         * bmalloc/PerProcess.h:
441         (bmalloc::PerProcess::getSlowCase):
442         * bmalloc/Scavenger.cpp:
443         (bmalloc::Scavenger::Scavenger):
444         (bmalloc::Scavenger::run):
445         (bmalloc::Scavenger::runSoon):
446         (bmalloc::Scavenger::scheduleIfUnderMemoryPressure):
447         (bmalloc::Scavenger::schedule):
448         (bmalloc::Scavenger::timeSinceLastFullScavenge):
449         (bmalloc::Scavenger::timeSinceLastPartialScavenge):
450         (bmalloc::Scavenger::scavenge):
451         (bmalloc::Scavenger::partialScavenge):
452         (bmalloc::Scavenger::freeableMemory):
453         (bmalloc::Scavenger::threadRunLoop):
454         * bmalloc/Scavenger.h:
455         * bmalloc/SmallLine.h:
456         (bmalloc::SmallLine::refCount):
457         (bmalloc::SmallLine::ref):
458         (bmalloc::SmallLine::deref):
459         * bmalloc/SmallPage.h:
460         (bmalloc::SmallPage::refCount):
461         (bmalloc::SmallPage::hasFreeLines const):
462         (bmalloc::SmallPage::setHasFreeLines):
463         (bmalloc::SmallPage::ref):
464         (bmalloc::SmallPage::deref):
465         * bmalloc/StaticPerProcess.h:
466         * bmalloc/VMHeap.cpp:
467         (bmalloc::VMHeap::VMHeap):
468         * bmalloc/VMHeap.h:
469         * bmalloc/Zone.cpp:
470         (bmalloc::Zone::Zone):
471         * bmalloc/Zone.h:
472         * bmalloc/bmalloc.cpp:
473         (bmalloc::api::tryLargeZeroedMemalignVirtual):
474         (bmalloc::api::freeLargeVirtual):
475         (bmalloc::api::setScavengerThreadQOSClass):
476
477 2020-01-17  Yusuke Suzuki  <ysuzuki@apple.com>
478
479         [bmalloc] Fix IsoHeapImpl's assertion introduced in r254708
480         https://bugs.webkit.org/show_bug.cgi?id=206440
481         <rdar://problem/58688794>
482
483         Reviewed by Mark Lam.
484
485         The assertion introduced in r254708 was wrong.
486         Fixing it to check the invariant we actually want to ensure.
487         This fixes TestWTF crash in Debug build.
488
489         * bmalloc/IsoHeapImplInlines.h:
490         (bmalloc::IsoHeapImpl<Config>::takeFirstEligible):
491
492 2020-01-16  Yusuke Suzuki  <ysuzuki@apple.com>
493
494         [bmalloc] IsoHeap's initial setup should be small
495         https://bugs.webkit.org/show_bug.cgi?id=206214
496
497         Reviewed by Michael Saboff.
498
499         Keep IsoHeap related data structures small by using Packed technique. We start using IsoHeap for many classes,
500         then it is important that we keep metadata for IsoHeap small because these data persistently exists.
501
502         1. We pass IsoHeapImpl<> as a parameter instead of holding it unnecessarily.
503         2. We make some of pointers Packed so that we can keep sizeof(IsoHeapImpl<Config>) small.
504         3. One of the drawback of PackedPtr is that loading and storing are not atomic. And we pass `const std::lock_guard<Mutex>&`
505            to functions if functions need to be called with lock so that we ensure that PackedPtr are accessed only when lock is
506            held correctly.
507
508         * CMakeLists.txt:
509         * bmalloc.xcodeproj/project.pbxproj:
510         * bmalloc/Algorithm.h:
511         (bmalloc::ctzConstexpr):
512         (bmalloc::getLSBSetNonZeroConstexpr):
513         * bmalloc/BPlatform.h:
514         * bmalloc/DebugHeap.cpp:
515         (bmalloc::DebugHeap::DebugHeap):
516         * bmalloc/DebugHeap.h:
517         * bmalloc/DeferredTrigger.h:
518         * bmalloc/DeferredTriggerInlines.h:
519         (bmalloc::DeferredTrigger<trigger>::didBecome):
520         (bmalloc::DeferredTrigger<trigger>::handleDeferral):
521         * bmalloc/Environment.cpp:
522         (bmalloc::Environment::Environment):
523         * bmalloc/Environment.h:
524         * bmalloc/Gigacage.cpp:
525         (bmalloc::PrimitiveDisableCallbacks::PrimitiveDisableCallbacks):
526         * bmalloc/Heap.cpp:
527         (bmalloc::Heap::freeableMemory):
528         (bmalloc::Heap::markAllLargeAsEligibile):
529         (bmalloc::Heap::decommitLargeRange):
530         (bmalloc::Heap::scavenge):
531         (bmalloc::Heap::scavengeToHighWatermark):
532         * bmalloc/Heap.h:
533         * bmalloc/HeapConstants.cpp:
534         (bmalloc::HeapConstants::HeapConstants):
535         * bmalloc/HeapConstants.h:
536         * bmalloc/IsoAllocator.h:
537         * bmalloc/IsoAllocatorInlines.h:
538         (bmalloc::IsoAllocator<Config>::IsoAllocator):
539         (bmalloc::IsoAllocator<Config>::allocate):
540         (bmalloc::IsoAllocator<Config>::allocateSlow):
541         (bmalloc::IsoAllocator<Config>::scavenge):
542         * bmalloc/IsoDeallocatorInlines.h:
543         (bmalloc::IsoDeallocator<Config>::scavenge):
544         * bmalloc/IsoDirectory.h:
545         * bmalloc/IsoDirectoryInlines.h:
546         (bmalloc::passedNumPages>::IsoDirectory):
547         (bmalloc::passedNumPages>::takeFirstEligible):
548         (bmalloc::passedNumPages>::didBecome):
549         (bmalloc::passedNumPages>::didDecommit):
550         (bmalloc::passedNumPages>::scavengePage):
551         (bmalloc::passedNumPages>::scavenge):
552         (bmalloc::passedNumPages>::scavengeToHighWatermark):
553         (bmalloc::passedNumPages>::forEachCommittedPage):
554         * bmalloc/IsoHeapImpl.cpp:
555         (bmalloc::IsoHeapImplBase::IsoHeapImplBase):
556         * bmalloc/IsoHeapImpl.h:
557         * bmalloc/IsoHeapImplInlines.h:
558         (bmalloc::IsoHeapImpl<Config>::IsoHeapImpl):
559         (bmalloc::IsoHeapImpl<Config>::takeFirstEligible):
560         (bmalloc::IsoHeapImpl<Config>::didBecomeEligibleOrDecommited):
561         (bmalloc::IsoHeapImpl<Config>::scavenge):
562         (bmalloc::IsoHeapImpl<Config>::scavengeToHighWatermark):
563         (bmalloc::IsoHeapImplBase::freeableMemory):
564         (bmalloc::IsoHeapImpl<Config>::numLiveObjects):
565         (bmalloc::IsoHeapImpl<Config>::numCommittedPages):
566         (bmalloc::IsoHeapImpl<Config>::forEachDirectory):
567         (bmalloc::IsoHeapImpl<Config>::forEachCommittedPage):
568         (bmalloc::IsoHeapImpl<Config>::forEachLiveObject):
569         (bmalloc::IsoHeapImplBase::footprint):
570         (bmalloc::IsoHeapImplBase::didCommit):
571         (bmalloc::IsoHeapImplBase::didDecommit):
572         (bmalloc::IsoHeapImplBase::isNowFreeable):
573         (bmalloc::IsoHeapImplBase::isNoLongerFreeable):
574         (bmalloc::IsoHeapImpl<Config>::allocateFromShared):
575         (bmalloc::IsoHeapImpl<Config>::freeableMemory): Deleted.
576         (bmalloc::IsoHeapImpl<Config>::footprint): Deleted.
577         (bmalloc::IsoHeapImpl<Config>::didCommit): Deleted.
578         (bmalloc::IsoHeapImpl<Config>::didDecommit): Deleted.
579         (bmalloc::IsoHeapImpl<Config>::isNowFreeable): Deleted.
580         (bmalloc::IsoHeapImpl<Config>::isNoLongerFreeable): Deleted.
581         * bmalloc/IsoPage.h:
582         (bmalloc::IsoPageBase::IsoPageBase):
583         * bmalloc/IsoPageInlines.h:
584         (bmalloc::IsoPage<Config>::IsoPage):
585         (bmalloc::IsoPage<Config>::free):
586         (bmalloc::IsoPage<Config>::startAllocating):
587         (bmalloc::IsoPage<Config>::stopAllocating):
588         (bmalloc::IsoPage<Config>::forEachLiveObject):
589         * bmalloc/IsoSharedHeap.h:
590         (bmalloc::IsoSharedHeap::IsoSharedHeap):
591         * bmalloc/IsoSharedHeapInlines.h:
592         (bmalloc::IsoSharedHeap::allocateNew):
593         (bmalloc::IsoSharedHeap::allocateSlow):
594         * bmalloc/IsoSharedPage.h:
595         * bmalloc/IsoSharedPageInlines.h:
596         (bmalloc::IsoSharedPage::free):
597         (bmalloc::IsoSharedPage::startAllocating):
598         (bmalloc::IsoSharedPage::stopAllocating):
599         * bmalloc/IsoTLS.h:
600         * bmalloc/IsoTLSAllocatorEntry.h:
601         * bmalloc/IsoTLSAllocatorEntryInlines.h:
602         (bmalloc::IsoTLSAllocatorEntry<Config>::scavenge):
603         * bmalloc/IsoTLSDeallocatorEntry.h:
604         * bmalloc/IsoTLSDeallocatorEntryInlines.h:
605         (bmalloc::IsoTLSDeallocatorEntry<Config>::scavenge):
606         * bmalloc/IsoTLSEntry.cpp:
607         (bmalloc::IsoTLSEntry::IsoTLSEntry):
608         * bmalloc/IsoTLSEntry.h:
609         * bmalloc/IsoTLSEntryInlines.h:
610         (bmalloc::DefaultIsoTLSEntry<EntryType>::DefaultIsoTLSEntry):
611         (bmalloc::DefaultIsoTLSEntry<EntryType>::~DefaultIsoTLSEntry): Deleted.
612         (bmalloc::DefaultIsoTLSEntry<EntryType>::scavenge): Deleted.
613         * bmalloc/IsoTLSInlines.h:
614         (bmalloc::IsoTLS::scavenge):
615         (bmalloc::IsoTLS::allocateImpl):
616         (bmalloc::IsoTLS::allocateFast):
617         (bmalloc::IsoTLS::allocateSlow):
618         * bmalloc/IsoTLSLayout.cpp:
619         (bmalloc::IsoTLSLayout::add):
620         * bmalloc/Packed.h: Added.
621         (bmalloc::Packed::Packed):
622         (bmalloc::Packed::get const):
623         (bmalloc::Packed::set):
624         (bmalloc::Packed::operator=):
625         (bmalloc::Packed::exchange):
626         (bmalloc::Packed::swap):
627         (bmalloc::alignof):
628         (bmalloc::PackedPtrTraits::exchange):
629         (bmalloc::PackedPtrTraits::swap):
630         (bmalloc::PackedPtrTraits::unwrap):
631         * bmalloc/Scavenger.cpp:
632         (bmalloc::Scavenger::Scavenger):
633         * bmalloc/Scavenger.h:
634         * bmalloc/VMHeap.cpp:
635         (bmalloc::VMHeap::VMHeap):
636         * bmalloc/VMHeap.h:
637         * bmalloc/Zone.cpp:
638         (bmalloc::Zone::Zone):
639         * bmalloc/Zone.h:
640
641 2020-01-14  Basuke Suzuki  <basuke.suzuki@sony.com>
642
643         [bmalloc] Calculate LineMetadata for specific VM page size in compile time
644         https://bugs.webkit.org/show_bug.cgi?id=206044
645
646         Reviewed by Yusuke Suzuki.
647
648         LineMetadata is dependent only on VM page size. This patch enables the pre-calculation for
649         specific VM page sizes by compiler flags. The benefit is both runtime initialization speed
650         up and avoiding extra VM allocation on runtime.
651
652         First targets are 4k (Mac) and 16k (some iOS, PlayStation) VM page sizes.
653
654         * bmalloc/Algorithm.h:
655         (bmalloc::divideRoundingUp):
656         * bmalloc/BPlatform.h:
657         * bmalloc/HeapConstants.cpp:
658         (bmalloc::fillLineMetadata):
659         (bmalloc::computeLineMetadata):
660         (bmalloc::HeapConstants::initializeLineMetadata):
661         * bmalloc/HeapConstants.h:
662         (bmalloc::HeapConstants::smallLineCount const):
663         (bmalloc::HeapConstants::startOffset const):
664         (bmalloc::HeapConstants::objectCount const):
665         (bmalloc::HeapConstants::lineMetadata const):
666         (bmalloc::HeapConstants::startOffset): Deleted.
667         (bmalloc::HeapConstants::objectCount): Deleted.
668         (bmalloc::HeapConstants::lineMetadata): Deleted.
669         * bmalloc/LineMetadata.h:
670         * bmalloc/Sizes.h:
671         (bmalloc::Sizes::maskObjectSize):
672         (bmalloc::Sizes::logSizeClass):
673         (bmalloc::Sizes::logObjectSize):
674         (bmalloc::Sizes::sizeClass):
675         (bmalloc::Sizes::objectSize):
676         (bmalloc::Sizes::pageSize):
677         (bmalloc::Sizes::smallLineCount):
678
679 2020-01-14  David Kilzer  <ddkilzer@apple.com>
680
681         Enable -Wconditional-uninitialized in bmalloc, WTF, JavaScriptCore
682         <https://webkit.org/b/206190>
683         <rdar://problem/58540387>
684
685         Reviewed by Mark Lam.
686
687         * Configurations/Base.xcconfig:
688         (WARNING_CFLAGS): Add -Wconditional-uninitialized.
689
690 2020-01-09  Basuke Suzuki  <basuke.suzuki@sony.com>
691
692         [bmalloc] Extract constants from Heap and share it among Heaps.
693         https://bugs.webkit.org/show_bug.cgi?id=205834
694
695         Reviewed by Geoffrey Garen.
696
697         A Heap has many constants (m_vmPageSizePhysical, m_smallLineMetadata and m_pageClasses) and they
698         are dependent only to vmPageSizePhysical and identical for all Heaps.
699
700         Extracting them into a class and make it sharable among heaps. Also this is the first step for
701         making Heap constants to actual `constexpr`.
702
703         * CMakeLists.txt: Added HeapConstants.cpp.
704         * bmalloc.xcodeproj/project.pbxproj: Ditto.
705         * bmalloc/Heap.cpp: Referencing HeapConstants object to get information.
706         (bmalloc::Heap::Heap):
707         (bmalloc::Heap::allocateSmallPage):
708         (bmalloc::Heap::deallocateSmallLine):
709         (bmalloc::Heap::allocateSmallBumpRangesByMetadata):
710         (bmalloc::Heap::allocateSmallBumpRangesByObject):
711         (bmalloc::Heap::initializeLineMetadata): Moved to HeapConstants.cpp.
712         (bmalloc::Heap::initializePageMetadata): Moved to HeapConstants.cpp.
713         * bmalloc/Heap.h: Extract metadata initialization and member variables.
714         * bmalloc/HeapConstants.cpp: Added.
715         (bmalloc::HeapConstants::HeapConstants):
716         (bmalloc::HeapConstants::initializeLineMetadata):
717         (bmalloc::HeapConstants::initializePageMetadata):
718         * bmalloc/HeapConstants.h:
719         (bmalloc::HeapConstants::pageClass const):
720         (bmalloc::HeapConstants::smallLineCount const):
721         (bmalloc::HeapConstants::startOffset):
722         (bmalloc::HeapConstants::objectCount):
723         (bmalloc::HeapConstants::lineMetadata):
724
725 2020-01-02  Yusuke Suzuki  <ysuzuki@apple.com> and Simon Fraser  <simon.fraser@apple.com>
726
727         Experiment: create lots of different malloc zones for easier accounting of memory use
728         https://bugs.webkit.org/show_bug.cgi?id=186422
729
730         Reviewed by Saam Barati.
731
732         * bmalloc/BPlatform.h:
733         * bmalloc/Environment.cpp:
734         (bmalloc::Environment::computeIsDebugHeapEnabled):
735         * bmalloc/IsoHeap.h:
736         (bmalloc::api::IsoHeap::IsoHeap):
737         * bmalloc/IsoHeapInlines.h:
738         (bmalloc::api::IsoHeap<Type>::IsoHeap):
739         * bmalloc/IsoTLSInlines.h:
740         (bmalloc::IsoTLS::allocateSlow):
741         (bmalloc::IsoTLS::deallocateSlow):
742
743 2019-12-07  Basuke Suzuki  <basuke.suzuki@sony.com>
744
745         [bmalloc] Decommit unused region in chunk metadata.
746         https://bugs.webkit.org/show_bug.cgi?id=204810
747
748         Reviewed by Yusuke Suzuki.
749
750         There is an unused memory region from just after Chunk object to next page border.
751         We can decommit those memory to kernel at the initialization of Chunk.
752
753         * bmalloc/Heap.cpp:
754         (bmalloc::Heap::allocateSmallChunk):
755
756 2019-11-25  Fujii Hironori  <Hironori.Fujii@sony.com>
757
758         Ran sort-Xcode-project-file.
759
760         Unreviewed.
761
762         * bmalloc.xcodeproj/project.pbxproj:
763
764 2019-11-18  Basuke Suzuki  <basuke.suzuki@sony.com>
765
766         [bmalloc] Some chunks have unused region in the tail of its memory block.
767         https://bugs.webkit.org/show_bug.cgi?id=204286
768
769         Reviewed by Yusuke Suzuki.
770
771         When chunk is initialized, some amount of memory are not used and be kept untouched until its end.
772         This patch tries to decommit those region at the end of initialization.
773
774         For instance, think about the case that the pageClass is 5. Then pageSize is 24k. With this pageSize,
775         a chunk can hold 42 pages and its size is 24k * 42 = 1008k which is smaller than chunkSize = 1024k.
776         Here is the complete result:
777
778                 page    page    page
779                 class   size    count   remainings
780                 ----------------------------------
781                 0       4kB     256     0
782                 1       8kB     128     0
783                 2       12kB    85      4kB
784                 3       16kB    64      0
785                 4       20kB    51      4kB
786                 5       24kB    42      16kB
787                 6       28kB    36      16kB
788                 7       32kB    32      0
789                 8       36kB    28      16kB
790                 9       40kB    25      24kB
791                 10      44kB    23      12kB
792                 11      48kB    21      16kB
793                 12      52kB    19      36kB
794                 13      56kB    18      16kB
795                 14      60kB    17      4kB
796                 15      64kB    16      0
797
798         Tested on Mac testmem and result is almost same or in error margin.
799
800                 Before:                                 After:
801                 end score:           8.5425 MB          end score:           8.5127 MB
802                 peak score:          8.7997 MB          peak score:          8.7884 MB
803                 total memory score:  8.6702 MB          total memory score:  8.6495 MB
804                 time score:          668.19 ms          time score:          666.27 ms
805
806         * bmalloc/Chunk.h:
807         (bmalloc::Chunk::metadataSize):
808         (bmalloc::forEachPage):
809         * bmalloc/Heap.cpp:
810         (bmalloc::Heap::allocateSmallChunk):
811
812 2019-11-15  Basuke Suzuki  <basuke.suzuki@sony.com>
813
814         [bmalloc] The tracking of freeableMemory of Heap doesn't count Chunk's metadata size.
815         https://bugs.webkit.org/show_bug.cgi?id=204135
816
817         Reviewed by Yusuke Suzuki.
818
819         When chunk is allocated in allocateSmallChunk(), all chunk size is added to freeableMemory.
820         This is wrong. Only free pages should be added to it.
821
822         * bmalloc/Heap.cpp:
823         (bmalloc::Heap::allocateSmallChunk):
824
825 2019-11-15  Basuke Suzuki  <basuke.suzuki@sony.com>
826
827         [Mac] Use better describing name for Mac's scavenger compiler flag.
828         https://bugs.webkit.org/show_bug.cgi?id=203922
829
830         Reviewed by Yusuke Suzuki.
831
832         Changing BPLATFORM(MAC) to BUSE(PARTIAL_SCAVENGE).
833
834         * bmalloc/BPlatform.h:
835         * bmalloc/Heap.cpp:
836         (bmalloc::Heap::scavenge):
837         (bmalloc::Heap::allocateSmallChunk):
838         (bmalloc::Heap::allocateSmallPage):
839         (bmalloc::Heap::allocateLarge):
840         * bmalloc/Heap.h:
841         * bmalloc/IsoDirectory.h:
842         * bmalloc/IsoDirectoryInlines.h:
843         (bmalloc::passedNumPages>::takeFirstEligible):
844         (bmalloc::passedNumPages>::scavenge):
845         * bmalloc/IsoHeapImpl.h:
846         * bmalloc/IsoHeapImplInlines.h:
847         * bmalloc/LargeMap.cpp:
848         (bmalloc::LargeMap::add):
849         * bmalloc/LargeRange.h:
850         (bmalloc::LargeRange::LargeRange):
851         (bmalloc::merge):
852         * bmalloc/Scavenger.cpp:
853         (bmalloc::Scavenger::Scavenger):
854         (bmalloc::Scavenger::scavenge):
855         (bmalloc::Scavenger::threadRunLoop):
856         * bmalloc/Scavenger.h:
857         * bmalloc/SmallPage.h:
858
859 2019-11-07  Basuke Suzuki  <Basuke.Suzuki@sony.com> and Yusuke Suzuki  <ysuzuki@apple.com>
860
861         [bmalloc] Bug fix for wait time when it's in mini mode.
862         https://bugs.webkit.org/show_bug.cgi?id=203121
863
864         Reviewed by Saam Barati.
865
866         Basuke pointed out that we never changed m_waitTime in scavenger when we are in iOS and mini-mode.
867         So previously, we are always executing scavenger for each 10ms in mini-mode. After fixing it, we
868         found that this unintentional behavior was better policy for RAMification.
869         In this patch, we explicitly use the old behavior, "scavenge for each 10ms" in iOS mini-mode.
870         We should revisit scavenger's behavior in the future to explore further better behavior.
871
872         * bmalloc/Scavenger.cpp:
873         (bmalloc::Scavenger::threadRunLoop):
874
875 2019-11-06  Yusuke Suzuki  <ysuzuki@apple.com>
876
877         Unreviewed, roll-out r251268 due to RAMification regression
878         https://bugs.webkit.org/show_bug.cgi?id=203121
879
880         The code was the bug, but it would be possible that this bug accidentally makes our policy better.
881         We should clean up to make this bug's behavior default. And we should look for a bit larger interval here.
882
883         * bmalloc/Scavenger.cpp:
884         (bmalloc::Scavenger::threadRunLoop):
885
886 2019-10-17  Basuke Suzuki  <Basuke.Suzuki@sony.com>
887
888         [bmalloc] Bug fix for wait time when it's in mini mode.
889         https://bugs.webkit.org/show_bug.cgi?id=203121
890
891         Reviewed by Yusuke Suzuki.
892
893         Since r243144, m_waitTime is never changed on mini mode.
894
895         * bmalloc/Scavenger.cpp:
896         (bmalloc::Scavenger::threadRunLoop):
897
898 2019-10-07  Wenson Hsieh  <wenson_hsieh@apple.com>
899
900         Add a missing #include in DeferredTriggerInlines.h
901         https://bugs.webkit.org/show_bug.cgi?id=202677
902
903         Reviewed by Yusuke Suzuki.
904
905         DeferredTriggerInlines.h uses RELEASE_BASSERT, but does not include BAssert.h. This causes
906         subsequent build failures when shuffling around some sources in WebCore that then attempt to
907         include <wtf/IsoMallocInlines.h>.
908
909         * bmalloc/DeferredTriggerInlines.h:
910
911 2019-09-24  Keith Rollin  <krollin@apple.com>
912
913         Address static analysis warning in Allocator.cpp: Null pointer argument in call to memory copy function
914         https://bugs.webkit.org/show_bug.cgi?id=202152
915         <rdar://problem/55671444>
916
917         Reviewed by Geoffrey Garen.
918
919         Xcode's static analysis facility flags the following:
920
921             .../OpenSource/Source/bmalloc/bmalloc/Allocator.cpp:98:5: warning: Null pointer argument in call to memory copy function
922                 memcpy(result, object, copySize);
923                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
924
925         https://en.cppreference.com/w/cpp/string/byte/memcpy explains that
926         this is undefined behavior:
927
928             "If either dest or src is a null pointer, the behavior is
929              undefined, even if count is zero."
930
931         I suppose that passing in a null source pointer could be bad if the
932         implementation fetched the first source byte to copy before actually
933         checking the number of bytes to copy. So far, it doesn’t seem to be an
934         issue, but we should clean this up.
935
936         Simply adding "if (result && object)" before the memcpy will add tests
937         and branches in the hot path of this function and so might not be the
938         best solution. Instead, straighten out the code a little bit by
939         putting an early check and return on "object". This also allows us to
940         remove some intermediate code.
941
942         * bmalloc/Allocator.cpp:
943         (bmalloc::Allocator::reallocateImpl):
944
945 2019-09-17  Mark Lam  <mark.lam@apple.com>
946
947         Use constexpr instead of const in symbol definitions that are obviously constexpr.
948         https://bugs.webkit.org/show_bug.cgi?id=201879
949
950         Rubber-stamped by Joseph Pecoraro.
951
952         * bmalloc/AvailableMemory.cpp:
953         * bmalloc/IsoTLS.h:
954         * bmalloc/Map.h:
955         * bmalloc/Mutex.cpp:
956         (bmalloc::Mutex::lockSlowCase):
957         * bmalloc/PerThread.h:
958         * bmalloc/Vector.h:
959         * bmalloc/Zone.h:
960
961 2019-09-13  Mark Lam  <mark.lam@apple.com>
962
963         We should never fail to allocate VA for the Gigacage.
964         https://bugs.webkit.org/show_bug.cgi?id=201774
965         <rdar://problem/55352042>
966
967         Reviewed by Yusuke Suzuki.
968
969         Unfortunately, this is still not true for OS(LINUX).  So, I'll leave the
970         GIGACAGE_ALLOCATION_CAN_FAIL code in place but disable it for everything else.
971
972         * bmalloc/Gigacage.h:
973
974 2019-09-09  Michael Saboff  <msaboff@apple.com>
975
976         Revert to pre-r243144 scavenging behavior for macOS
977         https://bugs.webkit.org/show_bug.cgi?id=201555
978
979         Reviewed by Saam Barati.
980
981         The change in r243144 regressed internal power metrics for some Mac models.
982
983         * bmalloc/Heap.cpp:
984         (bmalloc::Heap::scavenge):
985         (bmalloc::Heap::scavengeToHighWatermark):
986         (bmalloc::Heap::allocateSmallChunk):
987         (bmalloc::Heap::allocateSmallPage):
988         (bmalloc::Heap::allocateLarge):
989         * bmalloc/Heap.h:
990         * bmalloc/IsoDirectory.h:
991         * bmalloc/IsoDirectoryInlines.h:
992         (bmalloc::passedNumPages>::takeFirstEligible):
993         (bmalloc::passedNumPages>::scavenge):
994         (bmalloc::passedNumPages>::scavengeToHighWatermark):
995         * bmalloc/IsoHeapImpl.h:
996         * bmalloc/IsoHeapImplInlines.h:
997         (bmalloc::IsoHeapImpl<Config>::scavengeToHighWatermark):
998         * bmalloc/LargeMap.cpp:
999         (bmalloc::LargeMap::add):
1000         * bmalloc/LargeRange.h:
1001         (bmalloc::LargeRange::LargeRange):
1002         (bmalloc::merge):
1003         * bmalloc/Scavenger.cpp:
1004         (bmalloc::Scavenger::Scavenger):
1005         (bmalloc::Scavenger::timeSinceLastPartialScavenge):
1006         (bmalloc::Scavenger::scavenge):
1007         (bmalloc::Scavenger::partialScavenge):
1008         (bmalloc::Scavenger::threadRunLoop):
1009         * bmalloc/Scavenger.h:
1010         * bmalloc/SmallPage.h:
1011
1012 2019-09-07  Mark Lam  <mark.lam@apple.com>
1013
1014         [Follow up fix] Harden protection of the Gigacage Config parameters.
1015         https://bugs.webkit.org/show_bug.cgi?id=201570
1016         <rdar://problem/55134229>
1017
1018         Reviewed by Saam Barati.
1019
1020         The previously landed hardening measures is failing the assertion in
1021         forbidDisablingPrimitiveGigacage() when a replacement heap (e.g. gmalloc) is
1022         used.
1023
1024         1. forbidDisablingPrimitiveGigacage() should just ensureGigacage() so that we
1025            know that the Gigacage is properly configured (whether enabled or disabled).
1026         2. Strengthen the assertion in forbidDisablingPrimitiveGigacage() to ensure that
1027            we have already determined if the Gigacage should be enabled.
1028
1029         * bmalloc/Gigacage.cpp:
1030         (Gigacage::forbidDisablingPrimitiveGigacage):
1031
1032 2019-09-07  Mark Lam  <mark.lam@apple.com>
1033
1034         performJITMemcpy() source buffer should not be in the Gigacage.
1035         https://bugs.webkit.org/show_bug.cgi?id=201577
1036         <rdar://problem/55142606>
1037
1038         Reviewed by Michael Saboff.
1039
1040         1. Add the Gigacage start address and totalSize to the Config.
1041         2. Add a contains() function that uses the start address and totalSize to check
1042            if a given pointer is in the Gigacage's address range.
1043
1044         * bmalloc/Gigacage.cpp:
1045         (Gigacage::ensureGigacage):
1046         (Gigacage::verifyGigacageIsEnabled):
1047         * bmalloc/Gigacage.h:
1048         (Gigacage::contains):
1049
1050 2019-09-06  Mark Lam  <mark.lam@apple.com>
1051
1052         Harden protection of the Gigacage Config parameters.
1053         https://bugs.webkit.org/show_bug.cgi?id=201570
1054         <rdar://problem/55134229>
1055
1056         Reviewed by Saam Barati.
1057
1058         1. Rename protectGigacageBasePtrs() and unprotectGigacageBasePtrs() to
1059            freezeGigacageConfig() and unfreezeGigacageConfig() respectively.
1060
1061            Also move the alignment check in protectGigacageBasePtrs() into ensureGigacage().
1062            There's no need to check it more than once.
1063
1064         2. Introduce permanentlyFreezeGigacageConfig() which permanently makes the
1065            Config ReadOnly.  Once invoked, the Config cannot be made writable again.
1066
1067            This is made possible by using vm_protect with a true set_maximum argument.
1068            We also add a g_gigacageConfig.isPermanentlyFrozen flag that we assert.
1069            Note: this permanence is only true for OS(DARWIN) since vm_protect is Mach API.
1070
1071         3. Rename disableDisablingPrimitiveGigacageIfShouldBeEnabled() to
1072            forbidDisablingPrimitiveGigacage() because "disablingDisabling" is a tongue
1073            twister.
1074
1075            Also, we don't want to make it conditional on "IfShouldBeEnabled".  We want
1076            forbidDisablingPrimitiveGigacage() to be irreversible.  It is up to the client
1077            to ensure that the Gigacage is already initialized (if possible) before
1078            invoking forbidDisablingPrimitiveGigacage().  Conceptually, the forbidding
1079            isn't about guaranteeing that the Gigacage is enabled.  It only takes away the
1080            option to disable it.
1081
1082            That said, forbidDisablingPrimitiveGigacage() is only invoked by clients that
1083            care about keeping the Gigacage enabled.  So, it does a sanity check (with an
1084            assertion) that if !GIGACAGE_ALLOCATION_CAN_FAIL, then the Gigacage should be
1085            have been initialized and enabled before invoking it.
1086
1087            We also make sure that forbidDisablingPrimitiveGigacage() calls
1088            permanentlyFreezeGigacageConfig() unconditionally.  It is safe to call it more
1089            than once.  This guarantees that the Config is permanently frozen after this,
1090            even if a bug should inadvertantly set the
1091            g_gigacageConfig.disablingPrimitiveGigacageIsForbidden flag before
1092            forbidDisablingPrimitiveGigacage() is invoked.
1093
1094         4. Assert that ensureGigacage() is only called once.
1095
1096         5. Assert that shouldBeEnabled() is only called once.
1097            Also moved its cached result into the Config so that it can be frozen.
1098
1099         * bmalloc/Gigacage.cpp:
1100         (Gigacage::bmalloc::freezeGigacageConfig):
1101         (Gigacage::bmalloc::unfreezeGigacageConfig):
1102         (Gigacage::bmalloc::permanentlyFreezeGigacageConfig):
1103         (Gigacage::bmalloc::UnfreezeGigacageConfigScope::UnfreezeGigacageConfigScope):
1104         (Gigacage::bmalloc::UnfreezeGigacageConfigScope::~UnfreezeGigacageConfigScope):
1105         (Gigacage::ensureGigacage):
1106         (Gigacage::disablePrimitiveGigacage):
1107         (Gigacage::verifyGigacageIsEnabled):
1108         (Gigacage::forbidDisablingPrimitiveGigacage):
1109         (Gigacage::isDisablingPrimitiveGigacageForbidden):
1110         (Gigacage::shouldBeEnabled):
1111         (Gigacage::bmalloc::protectGigacageBasePtrs): Deleted.
1112         (Gigacage::bmalloc::unprotectGigacageBasePtrs): Deleted.
1113         (Gigacage::bmalloc::UnprotectGigacageBasePtrsScope::UnprotectGigacageBasePtrsScope): Deleted.
1114         (Gigacage::bmalloc::UnprotectGigacageBasePtrsScope::~UnprotectGigacageBasePtrsScope): Deleted.
1115         (Gigacage::primitiveGigacageDisabled): Deleted.
1116         (Gigacage::disableDisablingPrimitiveGigacageIfShouldBeEnabled): Deleted.
1117         (Gigacage::isDisablingPrimitiveGigacageDisabled): Deleted.
1118         * bmalloc/Gigacage.h:
1119         (Gigacage::isPrimitiveGigacagePermanentlyEnabled):
1120         (Gigacage::canPrimitiveGigacageBeDisabled):
1121         (Gigacage::forbidDisablingPrimitiveGigacage):
1122         (Gigacage::disableDisablingPrimitiveGigacageIfShouldBeEnabled): Deleted.
1123
1124 2019-09-06  Mark Lam  <mark.lam@apple.com>
1125
1126         Use FailureAction everywhere in bmalloc instead of a crashOnFailure boolean.
1127         https://bugs.webkit.org/show_bug.cgi?id=201553
1128
1129         Reviewed by Yusuke Suzuki.
1130
1131         * bmalloc/Cache.cpp:
1132         (bmalloc::Cache::tryAllocateSlowCaseNullCache):
1133         (bmalloc::Cache::allocateSlowCaseNullCache):
1134         (bmalloc::Cache::tryReallocateSlowCaseNullCache):
1135         (bmalloc::Cache::reallocateSlowCaseNullCache):
1136         * bmalloc/DebugHeap.cpp:
1137         (bmalloc::DebugHeap::malloc):
1138         (bmalloc::DebugHeap::memalign):
1139         (bmalloc::DebugHeap::realloc):
1140         * bmalloc/DebugHeap.h:
1141
1142 2019-09-06  Mark Lam  <mark.lam@apple.com>
1143
1144         Fix bmalloc::Allocator:tryAllocate() to return null on failure to allocate.
1145         https://bugs.webkit.org/show_bug.cgi?id=201529
1146         <rdar://problem/53935772>
1147
1148         Reviewed by Yusuke Suzuki.
1149
1150         In this implementation, we pass FailureAction in as a runtime option.  If this
1151         proves to be a perf issue, we can easily fix this by passing it as a template
1152         argument.  That will also automatically elide unneeded code paths.  We'll defer
1153         that exercise until we have evidence that it is warranted.
1154
1155         * CMakeLists.txt:
1156         * bmalloc.xcodeproj/project.pbxproj:
1157         * bmalloc/Allocator.cpp:
1158         (bmalloc::Allocator::allocateImpl):
1159         (bmalloc::Allocator::reallocateImpl):
1160         (bmalloc::Allocator::refillAllocatorSlowCase):
1161         (bmalloc::Allocator::refillAllocator):
1162         (bmalloc::Allocator::allocateLarge):
1163         (bmalloc::Allocator::allocateLogSizeClass):
1164         (bmalloc::Allocator::allocateSlowCase):
1165         (bmalloc::Allocator::tryAllocate): Deleted.
1166         (bmalloc::Allocator::allocate): Deleted.
1167         (bmalloc::Allocator::reallocate): Deleted.
1168         (bmalloc::Allocator::tryReallocate): Deleted.
1169         * bmalloc/Allocator.h:
1170         (bmalloc::Allocator::tryAllocate):
1171         (bmalloc::Allocator::allocate):
1172         (bmalloc::Allocator::tryReallocate):
1173         (bmalloc::Allocator::reallocate):
1174         (bmalloc::Allocator::allocateImpl):
1175         * bmalloc/BumpAllocator.h:
1176         * bmalloc/FailureAction.h: Added.
1177         * bmalloc/Heap.cpp:
1178         (bmalloc::Heap::allocateSmallChunk):
1179         (bmalloc::Heap::allocateSmallPage):
1180         (bmalloc::Heap::allocateSmallBumpRangesByMetadata):
1181         (bmalloc::Heap::allocateSmallBumpRangesByObject):
1182         (bmalloc::Heap::allocateLarge):
1183         (bmalloc::Heap::tryAllocateLarge): Deleted.
1184         * bmalloc/Heap.h:
1185         (bmalloc::Heap::allocateSmallBumpRanges):
1186         * bmalloc/bmalloc.cpp:
1187         (bmalloc::api::tryLargeZeroedMemalignVirtual):
1188
1189 2019-09-05  Mark Lam  <mark.lam@apple.com>
1190
1191         Refactor the Gigacage code to require less pointer casting.
1192         https://bugs.webkit.org/show_bug.cgi?id=201521
1193
1194         Reviewed by Saam Barati.
1195
1196         1. Define a Gigacage::Config struct instead of hacking around a g_gigacageBasePtrs
1197            array of bytes.
1198         2. Change Gigacage::basePtr() to return a pointer instead of a reference to the
1199            requested basePtr.  Instead, make it explicit when the client is trying to
1200            take the address of the basePtr, or setting it.
1201         3. Renamed wasEnabled() to isEnabled() because it returns the present state of the
1202            flag, not some past state.
1203
1204         * bmalloc/Gigacage.cpp:
1205         (Gigacage::bmalloc::protectGigacageBasePtrs):
1206         (Gigacage::bmalloc::unprotectGigacageBasePtrs):
1207         (Gigacage::bmalloc::runwaySize):
1208         (Gigacage::ensureGigacage):
1209         (Gigacage::disablePrimitiveGigacage):
1210         (Gigacage::addPrimitiveDisableCallback):
1211         (Gigacage::primitiveGigacageDisabled):
1212         * bmalloc/Gigacage.h:
1213         (Gigacage::name):
1214         (Gigacage::Config::basePtr const):
1215         (Gigacage::Config::setBasePtr):
1216         (Gigacage::isEnabled):
1217         (Gigacage::basePtr):
1218         (Gigacage::addressOfBasePtr):
1219         (Gigacage::size):
1220         (Gigacage::caged):
1221         (Gigacage::wasEnabled): Deleted.
1222         (Gigacage::setWasEnabled): Deleted.
1223         (Gigacage::basePtrs): Deleted.
1224         * bmalloc/HeapKind.h:
1225         (bmalloc::heapKind):
1226         (bmalloc::isActiveHeapKindAfterEnsuringGigacage):
1227         (bmalloc::mapToActiveHeapKindAfterEnsuringGigacage):
1228
1229 2019-09-03  Yusuke Suzuki  <ysuzuki@apple.com>
1230
1231         [bmalloc] IsoTLSLayout and AllIsoHeaps registration is racy with derived class initialization with virtual functions
1232         https://bugs.webkit.org/show_bug.cgi?id=201448
1233
1234         Reviewed by Mark Lam.
1235
1236         In the base class of IsoTLSEntry and IsoHeapImplBase, we register each instance with the per-process linked-list singleton to
1237         offer a way to iterate all these instances. But since derived classes of IsoTLSEntry and IsoHeapImplBase have virtual functions,
1238         the instance is not fully instantiated yet when executing the base constructor! In particular, the register instance needs vtable pointer
1239         initialization in the derived constructor.
1240
1241         So, there is a race condition,
1242
1243         1. IsoTLSEntry adds itself to the global linked-list.
1244         2. IsoTLSEntry's derived class is initializing the instance including vtable pointer, this happens because base and derived classes have virtual functions.
1245         3. While doing (2), other thread iterates instances through (1)'s linked-list and call virtual functions
1246
1247         Then, crash happens because the instance vtable pointer hasn't been set to the derived class' vtable yet. IsoHeapImpl has the same problem.
1248         This issue causes some crashes in bmalloc::Scavenger::scavenge / bmalloc::IsoTLS::ensureEntries.
1249
1250         In this patch,
1251
1252         1. We introduce IsoTLSEntryHolder, which initialize the TLS entry. And after fully initializing it, the holder registers the entry with the IsoTLSLayout singleton.
1253         2. We call IsoHeapImplBase::addToAllIsoHeaps after IsoHeapImpl is fully initialized.
1254         3. We put memory barrier in IsoTLSLayout since IsoTLSLayout::head does not take a lock.
1255         4. We add unit-test that reliably reproduces IsoHeapImpl crash if we run this test ~10 times!
1256
1257         * bmalloc/AllIsoHeaps.h:
1258         * bmalloc/IsoHeapImpl.h:
1259         * bmalloc/IsoHeapImplInlines.h:
1260         (bmalloc::IsoHeapImpl<Config>::IsoHeapImpl):
1261         (bmalloc::IsoHeapImpl<Config>::allocatorOffset):
1262         (bmalloc::IsoHeapImpl<Config>::deallocatorOffset):
1263         * bmalloc/IsoHeapInlines.h:
1264         (bmalloc::api::IsoHeap<Type>::initialize):
1265         * bmalloc/IsoTLSAllocatorEntry.h:
1266         * bmalloc/IsoTLSDeallocatorEntry.h:
1267         * bmalloc/IsoTLSEntry.cpp:
1268         (bmalloc::IsoTLSEntry::IsoTLSEntry):
1269         * bmalloc/IsoTLSEntry.h:
1270         (bmalloc::IsoTLSEntryHolder::IsoTLSEntryHolder):
1271         (bmalloc::IsoTLSEntryHolder::operator* const):
1272         (bmalloc::IsoTLSEntryHolder::operator*):
1273         (bmalloc::IsoTLSEntryHolder::operator-> const):
1274         (bmalloc::IsoTLSEntryHolder::operator->):
1275         * bmalloc/IsoTLSLayout.cpp:
1276         (bmalloc::IsoTLSLayout::add):
1277         * bmalloc/IsoTLSLayout.h:
1278
1279 2019-08-29  Keith Rollin  <krollin@apple.com>
1280
1281         Update .xcconfig symbols to reflect the current set of past and future product versions.
1282         https://bugs.webkit.org/show_bug.cgi?id=200720
1283         <rdar://problem/54305032>
1284
1285         Reviewed by Alex Christensen.
1286
1287         Remove version symbols related to old OS's we no longer support,
1288         ensure that version symbols are defined for OS's we do support.
1289
1290         * Configurations/Base.xcconfig:
1291         * Configurations/DebugRelease.xcconfig:
1292
1293 2019-08-26  Yusuke Suzuki  <ysuzuki@apple.com>
1294
1295         [bmalloc] Disable IsoHeap completely if DebugHeap is enabled
1296         https://bugs.webkit.org/show_bug.cgi?id=201154
1297
1298         Reviewed by Simon Fraser.
1299
1300         Previously we had the guarantee that IsoHeap is disabled when DebugHeap is enabled.
1301         But this is guaranteed in a bit tricky way: when DebugHeap is enabled, Gigacage is disabled.
1302         And IsoHeap is disabled when Gigacage is disabled. However r249065 enabled IsoHeap even if
1303         Gigacage is disabled. This accidentally enabled IsoHeap even if DebugHeap is enabled.
1304
1305         Currently, this is incorrect. When DebugHeap is enabled, we do not start bmalloc::Scavenger.
1306         So IsoHeap does not work. In addition, when DebugHeap is enabled, we want to investigate the Malloc data.
1307         However IsoHeap wipes these information for IsoHeaped objects. Moreover enabling IsoHeap is not free
1308         in terms of memory usage: bmalloc::Scavenger starts working.
1309
1310         So we should not enable IsoHeap in such an accidental way for DebugHeap environment. If we consider enabling
1311         IsoHeap even if `Malloc=1` is specified, we should first examine how memory is used by this change because
1312         the users of `Malloc=1` requires explicitly tight memory usage.
1313
1314         In this patch, we remove the accidental enabling of IsoHeap for DebugHeap by checking DebugHeap status in IsoTLS.
1315
1316         * bmalloc/IsoTLS.cpp:
1317         (bmalloc::IsoTLS::determineMallocFallbackState):
1318
1319 2019-08-22  Mark Lam  <mark.lam@apple.com>
1320
1321         Undo disabling of IsoHeaps when Gigacage is off.
1322         https://bugs.webkit.org/show_bug.cgi?id=201061
1323         <rdar://problem/54622500>
1324
1325         Reviewed by Saam Barati and Michael Saboff.
1326
1327         * CMakeLists.txt:
1328         * bmalloc.xcodeproj/project.pbxproj:
1329         * bmalloc/IsoTLS.cpp:
1330         (bmalloc::IsoTLS::determineMallocFallbackState):
1331         * bmalloc/PerThread.cpp: Removed.
1332         * bmalloc/PerThread.h:
1333
1334 2019-08-19  Yusuke Suzuki  <ysuzuki@apple.com>
1335
1336         [WTF] Add makeUnique<T>, which ensures T is fast-allocated, actual static_assert part
1337         https://bugs.webkit.org/show_bug.cgi?id=200620
1338
1339         Reviewed by Geoff Garen.
1340
1341         Expose T::webkitFastMalloced type to perform static_assert in makeUnique.
1342
1343         * bmalloc/IsoHeap.h:
1344         * bmalloc/IsoHeapInlines.h:
1345
1346 2019-07-24  Yusuke Suzuki  <ysuzuki@apple.com>
1347
1348         [bmalloc] Add IsoHeap test to ensure that IsoHeap pages are not allocating too large VA
1349         https://bugs.webkit.org/show_bug.cgi?id=200103
1350
1351         Reviewed by Mark Lam.
1352
1353         * bmalloc/IsoPage.cpp:
1354
1355 2019-07-22  Yusuke Suzuki  <ysuzuki@apple.com>
1356
1357         [bmalloc] Each IsoPage gets 1MB VA because VMHeap::tryAllocateLargeChunk rounds up
1358         https://bugs.webkit.org/show_bug.cgi?id=200024
1359
1360         Reviewed by Saam Barati.
1361
1362         When we allocate IsoHeap's page, we reused VMHeap::tryAllocateLargeChunk. However, this function is originally designed
1363         to be used for Large allocation in bmalloc (e.g. allocating Chunk in bmalloc). As a result, this function rounds up the
1364         requested size with 1MB (bmalloc::chunkSize). As a result, all IsoHeap's 16KB page gets 1MB VA while it just uses 16KB of
1365         the allocated region. This leads to VA exhaustion since IsoHeap now uses 64x VA than we expected!
1366
1367         This patch fixes the above VA exhaustion issue by allocating a page by using tryVMAllocate. When allocating a page, we start
1368         using a VM tag for IsoHeap. We discussed at e-mail and we decided reusing a VM tag previously assigned to CLoop Stack since
1369         this is less profitable. Since this tag is not Malloc-related tag, Leaks tool can scan memory region conservatively without
1370         registering allocated region into Zone, which was previously done in VMHeap and that's why we reused VMHeap for IsoHeap.
1371
1372         * bmalloc/BVMTags.h:
1373         * bmalloc/IsoPage.cpp:
1374         (bmalloc::IsoPageBase::allocatePageMemory):
1375         * bmalloc/IsoTLS.cpp:
1376         (bmalloc::IsoTLS::ensureEntries):
1377         * bmalloc/VMAllocate.h:
1378         (bmalloc::vmAllocate):
1379
1380 2019-07-22  Yusuke Suzuki  <ysuzuki@apple.com>
1381
1382         Unreviewed, follow-up fix for tls->size() access
1383         https://bugs.webkit.org/show_bug.cgi?id=200019
1384
1385         * bmalloc/IsoTLS.cpp:
1386         (bmalloc::IsoTLS::ensureEntries):
1387         (bmalloc::IsoTLS::destructor):
1388
1389 2019-07-22  Yusuke Suzuki  <ysuzuki@apple.com>
1390
1391         [bmalloc] IsoTLS is not deallocated in TLS destructor
1392         https://bugs.webkit.org/show_bug.cgi?id=200019
1393
1394         Reviewed by Mark Lam.
1395
1396         TLS destructor for IsoTLS needs to deallocate memory used for IsoTLS itself.
1397         While we are correctly deallocating old IsoTLS when extending it to the new one,
1398         we lack deallocation when the thread is destroyed. IsoTLS is per-thread, so we
1399         should destroy IsoTLS when a thread finishes.
1400
1401         * bmalloc/IsoTLS.cpp:
1402         (bmalloc::IsoTLS::ensureEntries):
1403         (bmalloc::IsoTLS::destructor):
1404
1405 2019-07-12  Keith Miller  <keith_miller@apple.com>
1406
1407         Increase JSValue cage size on iOS and reduce the max slide
1408         https://bugs.webkit.org/show_bug.cgi?id=199765
1409
1410         Reviewed by Saam Barati.
1411
1412         Since the WebContent jetsam limit has changed we sometimes run out
1413         of JSValue cage VA space causing us to run out of memory for
1414         arrays. This change makes the JSValue cage a more reasonable upper
1415         limit for what should be possible without jetsamming.
1416
1417         The worst case memory mapping with this configuration is has not
1418         changed from before. Under both configurations we could map 36GB
1419         with a temporary mapping of 38GB (to align the VA to 2GB).
1420
1421         * bmalloc/Gigacage.h:
1422
1423 2019-07-03  Keith Miller  <keith_miller@apple.com>
1424
1425         PACCage should first cage leaving PAC bits intact then authenticate
1426         https://bugs.webkit.org/show_bug.cgi?id=199372
1427
1428         Reviewed by Saam Barati.
1429
1430         * bmalloc/ProcessCheck.mm:
1431         (bmalloc::shouldProcessUnconditionallyUseBmalloc):
1432
1433 2019-07-02  Commit Queue  <commit-queue@webkit.org>
1434
1435         Unreviewed, rolling out r247041.
1436         https://bugs.webkit.org/show_bug.cgi?id=199425
1437
1438         broke some iOS arm64e tests (Requested by keith_miller on
1439         #webkit).
1440
1441         Reverted changeset:
1442
1443         "PACCage should first cage leaving PAC bits intact then
1444         authenticate"
1445         https://bugs.webkit.org/show_bug.cgi?id=199372
1446         https://trac.webkit.org/changeset/247041
1447
1448 2019-07-02  Keith Miller  <keith_miller@apple.com>
1449
1450         PACCage should first cage leaving PAC bits intact then authenticate
1451         https://bugs.webkit.org/show_bug.cgi?id=199372
1452
1453         Reviewed by Saam Barati.
1454
1455         * bmalloc/ProcessCheck.mm:
1456         (bmalloc::shouldProcessUnconditionallyUseBmalloc):
1457
1458 2019-06-27  Beth Dakin  <bdakin@apple.com>
1459
1460         Upstream use of MACCATALYST
1461         https://bugs.webkit.org/show_bug.cgi?id=199245
1462         rdar://problem/51687723
1463
1464         Reviewed by Tim Horton.
1465
1466         * Configurations/SDKVariant.xcconfig:
1467
1468 2019-06-24  Yusuke Suzuki  <ysuzuki@apple.com>
1469
1470         [bmalloc] IsoHeap shared tier threshold is small
1471         https://bugs.webkit.org/show_bug.cgi?id=199145
1472
1473         Reviewed by Saam Barati.
1474
1475         We accidentally picked 3 for the shared tier threshold. While this is OK because the important part of IsoHeap shared tier is putting
1476         small # of shared objects before tiering up to the page-based allocation, increasing this threshold can potentially improve memory footprint.
1477         This patch increases this threshold from 3 to 8. A/B test says that this offers stable 0.25% improvement in PLUM2.
1478
1479         * bmalloc/IsoHeapImpl.h:
1480
1481 2019-06-21  Yusuke Suzuki  <ysuzuki@apple.com>
1482
1483         [bmalloc] IsoTLS Layout extension initializes one IsoTLSEntry twice
1484         https://bugs.webkit.org/show_bug.cgi?id=199077
1485
1486         Reviewed by Saam Barati.
1487
1488         Found that IsoTLS::ensureEntries can construct the same IsoTLSEntry many times, it can leak memory because the construction clears previous fields including freelist.
1489
1490         1. We have oldLastEntry.
1491         2. In that case, startEntry is oldLastEntry.
1492         3. We find some targetEntry.
1493         4. Finally, if startEntry exists, we newly construct [startEntry, targetEntry]
1494         5. In the above sequence, oldLastEntry (== startEntry) is constructed again, while oldLastEntry is already constructed previously.
1495
1496         We fix this issue by changing the startEntry. We already have `RELEASE_BASSERT(!oldLastEntry || oldLastEntry->offset() < offset);`
1497         assertion. This means that `oldLastEntry->m_next` must exist, otherwise the following loop would not find a `targetEntry`. And `layout.head()`
1498         must return non nullptr at `IsoTLS::ensureEntries` because `IsoTLS::ensureEntries` requires that `IsoHeap<>` is initialized, and `IsoHeap<>`
1499         must add at least one TLS entry to the IsoTLSLayout.
1500
1501         * bmalloc/IsoTLS.cpp:
1502         (bmalloc::IsoTLS::ensureEntries):
1503
1504 2019-06-19  Yusuke Suzuki  <ysuzuki@apple.com>
1505
1506         [bmalloc] IsoHeap's initialization is racy with IsoHeap::isInitialized
1507         https://bugs.webkit.org/show_bug.cgi?id=199053
1508
1509         Reviewed by Saam Barati.
1510
1511         IsoHeap's initialization code is racy. Let's see the `isInitialized` and the initialization code.
1512
1513         isInitialized:
1514
1515             template<typename Type>
1516             bool IsoHeap<Type>::isInitialized()
1517             {
1518                 std::atomic<unsigned>* atomic =
1519                     reinterpret_cast<std::atomic<unsigned>*>(&m_allocatorOffsetPlusOne);
1520                 return !!atomic->load(std::memory_order_acquire);
1521             }
1522
1523         initialization:
1524
1525             if (!handle.isInitialized()) {
1526                 std::lock_guard<Mutex> locker(handle.m_initializationLock);
1527                 if (!handle.isInitialized()) {
1528                     auto* heap = new IsoHeapImpl<typename api::IsoHeap<Type>::Config>();
1529                     std::atomic_thread_fence(std::memory_order_seq_cst);
1530                     handle.setAllocatorOffset(heap->allocatorOffset());                  // <================= (1)
1531                     handle.setDeallocatorOffset(heap->deallocatorOffset());              // (2)
1532                     handle.m_impl = heap;
1533                 }
1534             }
1535
1536         IsoHeap::isInitialized is loading m_allocatorOffsetPlusOne with acquire fence. On the other hand, the initialization
1537         code configures m_allocatorOffsetPlusOne (1) before configuring m_deallocatorOffsetPlusOne (2). Let's consider the following
1538         case.
1539
1540             1. Thread A is at (1)
1541             2. Thread B calls handle.isInitialized(). Then B think that handle is already initialized while it lacks m_deallocatorOffsetPlusOne and m_impl pointer.
1542             3. Thread B uses this handle, and does `std::max(handle.allocatorOffset(), handle.deallocatorOffset())`. But m_deallocatorOffsetPlusOne is not configured
1543                yet. As a result, deallocatorOffset() returns 0xffffffff (b/c it calculates m_deallocatorOffsetPlusOne - 1, and m_deallocatorOffsetPlusOne is first
1544                zero-initialized before IsoHeap initialization happens).
1545             4. std::max returns 0xffffffff as an offset. Of course, this is wrong, and leading to the release assertion.
1546
1547         This patch fixes the above issue by,
1548
1549             1. Add IsoHeap::initialize() function instead of initializing it in IsoTLS
1550             2. Change `isInitialized()` function to load m_impl pointer instead of m_allocatorOffsetPlusOne with acquire fence.
1551             3. In initialize() function, we store m_heap with release fence at last.
1552
1553         * bmalloc/IsoHeap.h:
1554         * bmalloc/IsoHeapInlines.h:
1555         (bmalloc::api::IsoHeap<Type>::isInitialized):
1556         (bmalloc::api::IsoHeap<Type>::initialize):
1557         * bmalloc/IsoTLSInlines.h:
1558         (bmalloc::IsoTLS::ensureHeap):
1559
1560 2019-06-14  Keith Miller  <keith_miller@apple.com>
1561
1562         Restore PAC based cage.
1563         https://bugs.webkit.org/show_bug.cgi?id=198872
1564
1565         Rubber-stamped by Saam Barati.
1566
1567         * bmalloc/Gigacage.h:
1568
1569 2019-06-12  Commit Queue  <commit-queue@webkit.org>
1570
1571         Unreviewed, rolling out r246322.
1572         https://bugs.webkit.org/show_bug.cgi?id=198796
1573
1574         "It's a huge page load regression on iOS" (Requested by
1575         saamyjoon on #webkit).
1576
1577         Reverted changeset:
1578
1579         "Roll out PAC cage"
1580         https://bugs.webkit.org/show_bug.cgi?id=198726
1581         https://trac.webkit.org/changeset/246322
1582
1583 2019-06-11  Saam Barati  <sbarati@apple.com>
1584
1585         Roll out PAC cage
1586         https://bugs.webkit.org/show_bug.cgi?id=198726
1587
1588         Reviewed by Keith Miller.
1589
1590         * bmalloc/Gigacage.h:
1591         (Gigacage::isEnabled):
1592         (Gigacage::caged):
1593         (Gigacage::cagedMayBeNull): Deleted.
1594
1595 2019-06-09  Commit Queue  <commit-queue@webkit.org>
1596
1597         Unreviewed, rolling out r246150, r246160, and r246166.
1598         https://bugs.webkit.org/show_bug.cgi?id=198698
1599
1600         Regresses page loading time on iOS 13 (Requested by keith_m__
1601         on #webkit).
1602
1603         Reverted changesets:
1604
1605         "Reenable Gigacage on ARM64."
1606         https://bugs.webkit.org/show_bug.cgi?id=198453
1607         https://trac.webkit.org/changeset/246150
1608
1609         "Unrevied build fix for FTL without Gigacage."
1610         https://trac.webkit.org/changeset/246160
1611
1612         "Fix typo in cageWithoutUntagging"
1613         https://bugs.webkit.org/show_bug.cgi?id=198617
1614         https://trac.webkit.org/changeset/246166
1615
1616 2019-06-06  Keith Miller  <keith_miller@apple.com>
1617
1618         Reenable Gigacage on ARM64.
1619         https://bugs.webkit.org/show_bug.cgi?id=198453
1620
1621         Reviewed by Michael Saboff.
1622
1623         * bmalloc/Gigacage.h:
1624
1625 2019-06-03  Commit Queue  <commit-queue@webkit.org>
1626
1627         Unreviewed, rolling out r246022.
1628         https://bugs.webkit.org/show_bug.cgi?id=198486
1629
1630         Causing Internal build failures and JSC test failures
1631         (Requested by ShawnRoberts on #webkit).
1632
1633         Reverted changeset:
1634
1635         "Reenable Gigacage on ARM64."
1636         https://bugs.webkit.org/show_bug.cgi?id=198453
1637         https://trac.webkit.org/changeset/246022
1638
1639 2019-06-02  Keith Miller  <keith_miller@apple.com>
1640
1641         Reenable Gigacage on ARM64.
1642         https://bugs.webkit.org/show_bug.cgi?id=198453
1643
1644         Reviewed by Filip Pizlo.
1645
1646         * bmalloc/Gigacage.h:
1647
1648 2019-05-30  Don Olmstead  <don.olmstead@sony.com>
1649
1650         [CMake] Add WEBKIT_FRAMEWORK_TARGET macro
1651         https://bugs.webkit.org/show_bug.cgi?id=198396
1652
1653         Reviewed by Konstantin Tokarev.
1654
1655         Use WEBKIT_FRAMEWORK_TARGET.
1656
1657         * CMakeLists.txt:
1658
1659 2019-05-30  Keith Miller  <keith_miller@apple.com>
1660
1661         IsoHeaps don't notice uncommitted VA becoming the first eligible.
1662         https://bugs.webkit.org/show_bug.cgi?id=198301
1663
1664         Reviewed by Yusuke Suzuki.
1665
1666         IsoDirectory has a firstEligible member that is used as an
1667         optimization to help find the first fit. However if the scavenger
1668         decommitted a page before firstEligible then we wouldn't move
1669         firstEligible. Thus, if no space is ever freed below firstEligible
1670         we will never reused the decommitted memory (e.g. if the VA page
1671         is decommitted). The fix is to make IsoDirectory::didDecommit move
1672         the firstEligible page back if the decommitted page is smaller
1673         than the current firstEligible. As such, this patch renames
1674         firstEligible to firstEligibleOrDecommitted.
1675
1676         Also, this patch changes gigacageEnabledForProcess to check if the
1677         process starts with Test rather than just test as TestWTF does.
1678
1679         Lastly, unbeknownst to me IsoHeaps are dependent on gigacage, so
1680         by removing gigacage from arm64 I accidentally disabled
1681         IsoHeaps...
1682
1683         * bmalloc.xcodeproj/project.pbxproj:
1684         * bmalloc/IsoDirectory.h:
1685         * bmalloc/IsoDirectoryInlines.h:
1686         (bmalloc::passedNumPages>::takeFirstEligible):
1687         (bmalloc::passedNumPages>::didBecome):
1688         (bmalloc::passedNumPages>::didDecommit):
1689         * bmalloc/IsoHeapImpl.h:
1690         * bmalloc/IsoHeapImplInlines.h:
1691         (bmalloc::IsoHeapImpl<Config>::takeFirstEligible):
1692         (bmalloc::IsoHeapImpl<Config>::didBecomeEligibleOrDecommited):
1693         (bmalloc::IsoHeapImpl<Config>::didCommit):
1694         (bmalloc::IsoHeapImpl<Config>::didBecomeEligible): Deleted.
1695         * bmalloc/IsoTLS.cpp:
1696         (bmalloc::IsoTLS::determineMallocFallbackState):
1697         * bmalloc/ProcessCheck.mm:
1698         (bmalloc::gigacageEnabledForProcess):
1699
1700 2019-05-23  Don Olmstead  <don.olmstead@sony.com>
1701
1702         [CMake] Use target oriented design for bmalloc
1703         https://bugs.webkit.org/show_bug.cgi?id=198046
1704
1705         Reviewed by Konstantin Tokarev.
1706
1707         Switch to a target oriented dsign for bmalloc. Use target_include_directories directly
1708         instead of include_directories.
1709
1710         List the headers for bmalloc and copy them using WEBKIT_COPY_FILES.
1711
1712         Add an intermediate target bmalloc_PostBuild which depends on bmalloc and the headers
1713         being copied. Then alias that to WebKit::bmalloc.
1714
1715         * CMakeLists.txt:
1716         * PlatformMac.cmake:
1717
1718 2019-05-16  Keith Miller  <keith_miller@apple.com>
1719
1720         Wasm should cage the memory base pointers in structs
1721         https://bugs.webkit.org/show_bug.cgi?id=197620
1722
1723         Reviewed by Saam Barati.
1724
1725         Fix signature to take Gigacage::Kind, which matches GIGACAGE_ENABLED build.
1726
1727         * bmalloc/Gigacage.h:
1728         (Gigacage::isEnabled):
1729
1730 2019-05-08  Keith Miller  <keith_miller@apple.com>
1731
1732         Remove Gigacage from arm64 and use PAC for arm64e instead
1733         https://bugs.webkit.org/show_bug.cgi?id=197110
1734
1735         Reviewed by Saam Barati.
1736
1737         Stop using gigacage on arm64 and add a new cage function cagedMayBeNull that is the same as
1738         cage but returns a nullptr if the incoming pointer is already null.
1739
1740         * bmalloc/Gigacage.h:
1741         (Gigacage::cagedMayBeNull):
1742
1743 2019-04-29  Alex Christensen  <achristensen@webkit.org>
1744
1745         <rdar://problem/50299396> Fix internal High Sierra build
1746         https://bugs.webkit.org/show_bug.cgi?id=197388
1747
1748         * Configurations/Base.xcconfig:
1749
1750 2019-04-25  Yusuke Suzuki  <ysuzuki@apple.com>
1751
1752         [bmalloc] Follow-up and fixing bug after r244481
1753         https://bugs.webkit.org/show_bug.cgi?id=197294
1754
1755         Reviewed by Saam Barati.
1756
1757         This patch includes follow-up after r244481 and bug fixes which is introduced in the refactoring.
1758
1759         * bmalloc/IsoAllocator.h: Remove unused function.
1760         * bmalloc/IsoAllocatorInlines.h:
1761         (bmalloc::IsoAllocator<Config>::allocateSlow):
1762         * bmalloc/IsoDeallocatorInlines.h:
1763         (bmalloc::IsoDeallocator<Config>::deallocate):
1764         * bmalloc/IsoHeapImpl.h: Rename m_usableBits to m_availableShared and add static_assert.
1765         * bmalloc/IsoHeapImplInlines.h: Do not clear m_numberOfAllocationsFromSharedInOneCycle etc. in scavenge since IsoHeapImpl::scavenge
1766         is not related to thread-local IsoAllocator's status.
1767         (bmalloc::IsoHeapImpl<Config>::scavenge):
1768         (bmalloc::IsoHeapImpl<Config>::forEachLiveObject):
1769         (bmalloc::IsoHeapImpl<Config>::updateAllocationMode): Update m_allocationMode correctly.
1770         (bmalloc::IsoHeapImpl<Config>::allocateFromShared):
1771         * bmalloc/IsoSharedHeapInlines.h:
1772         (bmalloc::computeObjectSizeForSharedCell):
1773         (bmalloc::IsoSharedHeap::allocateNew):
1774         (bmalloc::IsoSharedHeap::allocateSlow): Add computeObjectSizeForSharedCell.
1775         * bmalloc/IsoSharedPage.h:
1776         * bmalloc/IsoSharedPageInlines.h:
1777         (bmalloc::IsoSharedPage::free): Pass `const std::lock_guard<Mutex>&` in its parameter.
1778
1779 2019-04-25  Alex Christensen  <achristensen@webkit.org>
1780
1781         Start using C++17
1782         https://bugs.webkit.org/show_bug.cgi?id=197131
1783
1784         Reviewed by Darin Adler.
1785
1786         * Configurations/Base.xcconfig:
1787
1788 2019-04-24  Yusuke Suzuki  <ysuzuki@apple.com>
1789
1790         Unreviewed, fix typo in r244481
1791         https://bugs.webkit.org/show_bug.cgi?id=196837
1792
1793         * bmalloc/IsoHeapImplInlines.h:
1794         (bmalloc::IsoHeapImpl<Config>::allocateFromShared):
1795
1796 2019-04-21  Yusuke Suzuki  <ysuzuki@apple.com>
1797
1798         [bmalloc] Use StaticPerProcess' mutex as bmalloc::Heap does with PerProcess
1799         https://bugs.webkit.org/show_bug.cgi?id=197135
1800
1801         Reviewed by Darin Adler.
1802
1803         This patch leverages StaticPerProcess::mutex() for per process instance's lock in various classes,
1804         as Heap does with PerProcess::mutex().
1805
1806         * bmalloc/AllIsoHeaps.cpp:
1807         (bmalloc::AllIsoHeaps::add):
1808         (bmalloc::AllIsoHeaps::head):
1809         * bmalloc/AllIsoHeaps.h:
1810         * bmalloc/CryptoRandom.cpp:
1811         (bmalloc::ARC4RandomNumberGenerator::randomValues):
1812         * bmalloc/DebugHeap.cpp:
1813         (bmalloc::DebugHeap::memalignLarge):
1814         (bmalloc::DebugHeap::freeLarge):
1815         * bmalloc/DebugHeap.h:
1816         * bmalloc/Scavenger.cpp:
1817         (bmalloc::Scavenger::run):
1818         (bmalloc::Scavenger::runSoon):
1819         (bmalloc::Scavenger::scheduleIfUnderMemoryPressure):
1820         (bmalloc::Scavenger::schedule):
1821         (bmalloc::Scavenger::timeSinceLastFullScavenge):
1822         (bmalloc::Scavenger::scavenge):
1823         (bmalloc::Scavenger::threadRunLoop):
1824         * bmalloc/Scavenger.h:
1825
1826 2019-04-19  Yusuke Suzuki  <ysuzuki@apple.com>
1827
1828         [bmalloc] IsoHeap should have lower tier using shared IsoPage
1829         https://bugs.webkit.org/show_bug.cgi?id=196837
1830
1831         Reviewed by Filip Pizlo.
1832
1833         IsoHeap had a scalability problem. Once one instance is allocated from IsoHeap, it immediately allocates 16KB page for this type.
1834         But some types allocate only a few instances. It leads to memory wastage, and it also limits the scalability of IsoHeap since
1835         we need to carefully select classes which will be confined in IsoHeap due to this characteristics. If we can remove this wastage,
1836         we can apply IsoHeap more aggressively without causing memory regression, this is the goal of this patch.
1837
1838         In this patch, we introduce a slow tier to IsoHeap allocation. Initially, the allocator for a certain type allocates instances from
1839         a shared page with the other allocators, and eventually, the allocator tiers up and gets dedicated pages if instances of the type
1840         are allocated a lot. This "shared" tier is slow, but it is totally OK because we will tier up to the normal fast tier if allocation
1841         frequently happens. Even the instance is allocated from pages shared with the other allocators, we still make the allocated memory
1842         region dedicated to the specific type: once a memory region is allocated for a certain type from a shared page, this region continues
1843         being used only for this type even after this memory is freed. To summarize the changes:
1844
1845         1. We introduce "shared" tier to IsoHeap allocation. Up to N (N = 8 for now, but we can pick any power-of-two numbers up to 32) allocations,
1846            we continue using this tier. We allocate memory from shared pages so that we do not waste 16KB pages for types which only allocates a few instances.
1847
1848         2. We eventually tier up to the "fast" tier, and eventually tier down to the "shared" tier too. We measure the period between slow paths,
1849            and switch the appropriate tier for the type. Currently, we use 1 seconds as heuristics. We also count # of allocations per cycle to
1850            avoid pathological slow downs.
1851
1852         3. Shared page mechanism must keep the characteristics of IsoHeap. Once a memory region is allocated for a certain type, this memory region
1853            must be dedicated to this type. We keep track the allocated memory regions from shared pages in IsoHeapImpl, and ensure that we never
1854            reuse a memory region for a different type.
1855
1856         This patch improves PLUM2 by 1.4% (128.4MB v.s. 126.62MB), and early Speedometer2 results are performance-neutral.
1857
1858         * CMakeLists.txt:
1859         * bmalloc.xcodeproj/project.pbxproj:
1860         * bmalloc/Algorithm.h:
1861         (bmalloc::roundUpToMultipleOfImpl):
1862         (bmalloc::roundUpToMultipleOf):
1863         * bmalloc/BCompiler.h:
1864         * bmalloc/BExport.h:
1865         * bmalloc/FreeList.h:
1866         * bmalloc/IsoAllocator.h:
1867         * bmalloc/IsoAllocatorInlines.h:
1868         (bmalloc::IsoAllocator<Config>::allocateSlow):
1869         * bmalloc/IsoDeallocator.h:
1870         * bmalloc/IsoDeallocatorInlines.h:
1871         (bmalloc::IsoDeallocator<Config>::deallocate):
1872         * bmalloc/IsoHeapImpl.h:
1873         * bmalloc/IsoHeapImplInlines.h:
1874         (bmalloc::IsoHeapImpl<Config>::scavenge):
1875         (bmalloc::IsoHeapImpl<Config>::forEachLiveObject):
1876         (bmalloc::IsoHeapImpl<Config>::updateAllocationMode):
1877         (bmalloc::IsoHeapImpl<Config>::allocateFromShared):
1878         * bmalloc/IsoPage.h:
1879         (bmalloc::IsoPageBase::IsoPageBase):
1880         (bmalloc::IsoPageBase::isShared const):
1881         * bmalloc/IsoPageInlines.h:
1882         (bmalloc::IsoPage<Config>::IsoPage):
1883         (bmalloc::IsoPageBase::pageFor):
1884         (bmalloc::IsoPage<Config>::pageFor):
1885         (bmalloc::IsoPage<Config>::free):
1886         * bmalloc/IsoSharedConfig.h: Copied from Source/bmalloc/bmalloc/BExport.h.
1887         * bmalloc/IsoSharedHeap.cpp: Copied from Source/bmalloc/bmalloc/BExport.h.
1888         * bmalloc/IsoSharedHeap.h: Copied from Source/bmalloc/bmalloc/IsoAllocator.h.
1889         (bmalloc::VariadicBumpAllocator::VariadicBumpAllocator):
1890         (bmalloc::IsoSharedHeap::IsoSharedHeap):
1891         * bmalloc/IsoSharedHeapInlines.h: Added.
1892         (bmalloc::VariadicBumpAllocator::allocate):
1893         (bmalloc::IsoSharedHeap::allocateNew):
1894         (bmalloc::IsoSharedHeap::allocateSlow):
1895         * bmalloc/IsoSharedPage.cpp: Copied from Source/bmalloc/bmalloc/BExport.h.
1896         (bmalloc::IsoSharedPage::tryCreate):
1897         * bmalloc/IsoSharedPage.h: Copied from Source/bmalloc/bmalloc/IsoDeallocator.h.
1898         (bmalloc::IsoSharedPage::IsoSharedPage):
1899         (bmalloc::indexSlotFor):
1900         * bmalloc/IsoSharedPageInlines.h: Added.
1901         (bmalloc::IsoSharedPage::free):
1902         (bmalloc::IsoSharedPage::startAllocating):
1903         (bmalloc::IsoSharedPage::stopAllocating):
1904         * bmalloc/IsoTLS.h:
1905         * bmalloc/IsoTLSInlines.h:
1906         (bmalloc::IsoTLS::deallocateImpl):
1907         (bmalloc::IsoTLS::deallocateFast):
1908         (bmalloc::IsoTLS::deallocateSlow):
1909         * bmalloc/StdLibExtras.h:
1910         (bmalloc::bitwise_cast):
1911         * test/testbmalloc.cpp:
1912         (testIsoMallocAndFreeFast):
1913         (run):
1914
1915 2019-04-18  Yusuke Suzuki  <ysuzuki@apple.com>
1916
1917         Unreviewed, fix build failure
1918         https://bugs.webkit.org/show_bug.cgi?id=195938
1919
1920         Including <array>.
1921
1922         * bmalloc/AvailableMemory.cpp:
1923
1924 2019-04-15  Yoshiaki Jitsukawa  <yoshiaki.jitsukawa@sony.com>
1925
1926         Unreviewed. Build fix after r244244.
1927
1928         * bmalloc/AvailableMemory.cpp:
1929
1930 2019-04-13  Zan Dobersek  <zdobersek@igalia.com>
1931
1932         [bmalloc][Linux] Add support for memory status calculation
1933         https://bugs.webkit.org/show_bug.cgi?id=195938
1934
1935         Reviewed by Carlos Garcia Campos.
1936
1937         Memory status and under-memory-pressure capabilities in bmalloc can be
1938         implemented on Linux by reading and parsing the statm file under the
1939         proc filesystem.
1940
1941         We retrieve the resident set size from the statm file and multiply it
1942         with the page size. This gives an upper-bound estimate of the memory
1943         that's being consumed by the process.
1944
1945         The statm-based estimate seems preferable to other alternatives. One
1946         such alternative would be reading and parsing more-detailed smaps file,
1947         also exposed under the proc filesystem. This is at the moment being done
1948         in WTF's MemoryFootprint implementation for Linux systems, but on Linux
1949         ports this operation is being throttled to only execute once per second
1950         because of the big computing expense required to read and parse out the
1951         data. A future MemoryFootprint implementation could simply retrieve the
1952         memory footprint value from bmalloc.
1953
1954         Another alternative is the Linux taskstats interface. This one would
1955         require utilizing a netlink socket to retrieve the necessary statistics,
1956         but it requires the process to have elevated privileges, which is a
1957         blocker.
1958
1959         * bmalloc/AvailableMemory.cpp:
1960         (bmalloc::LinuxMemory::singleton):
1961         (bmalloc::LinuxMemory::footprint const):
1962         (bmalloc::computeAvailableMemory):
1963         (bmalloc::memoryStatus):
1964         * bmalloc/AvailableMemory.h:
1965         (bmalloc::isUnderMemoryPressure):
1966         * bmalloc/bmalloc.h:
1967
1968 2019-04-04  Yusuke Suzuki  <ysuzuki@apple.com>
1969
1970         [WebCore] Put most of derived classes of ScriptWrappable into IsoHeap
1971         https://bugs.webkit.org/show_bug.cgi?id=196475
1972
1973         Reviewed by Saam Barati.
1974
1975         Add MAKE_BISO_MALLOCED_IMPL_TEMPLATE, which can be used for explicit specialization for template classes.
1976
1977         * bmalloc/IsoHeap.h:
1978         * bmalloc/IsoHeapInlines.h:
1979
1980 2019-03-22  Keith Rollin  <krollin@apple.com>
1981
1982         Enable ThinLTO support in Production builds
1983         https://bugs.webkit.org/show_bug.cgi?id=190758
1984         <rdar://problem/45413233>
1985
1986         Reviewed by Daniel Bates.
1987
1988         Enable building with Thin LTO in Production when using Xcode 10.2 or
1989         later. This change results in a 1.45% progression in PLT5. Full
1990         Production build times increase about 2-3%. Incremental build times
1991         are more severely affected, and so LTO is not enabled for local
1992         engineering builds.
1993
1994         LTO is enabled only on macOS for now, until rdar://problem/49013399,
1995         which affects ARM builds, is fixed.
1996
1997         To change the LTO setting when building locally:
1998
1999         - If building with `make`, specify WK_LTO_MODE={none,thin,full} on the
2000           command line.
2001         - If building with `build-webkit`, specify --lto-mode={none,thin,full}
2002           on the command line.
2003         - If building with `build-root`, specify --lto={none,thin,full} on the
2004           command line.
2005         - If building with Xcode, create a LocalOverrides.xcconfig file at the
2006           top level of your repository directory (if needed) and define
2007           WK_LTO_MODE to full, thin, or none.
2008
2009         * Configurations/Base.xcconfig:
2010
2011 2019-03-21  Michael Saboff  <msaboff@apple.com>
2012
2013         [BMalloc] No need to delay deallocating chunks based on recent use
2014         https://bugs.webkit.org/show_bug.cgi?id=196121
2015
2016         Reviewed by Mark Lam.
2017
2018         The "used since last scavenge" logic is not needed for small chunks since their memory isn't decommitted directly.
2019         We can deallocate small chunks immediately as that adds them to the LargeRange free list.  That free list employs the
2020         "used since last scavenge" logic before the scavenger decommits the backing memory.
2021
2022         * bmalloc/Chunk.h:
2023         (bmalloc::Chunk::usedSinceLastScavenge): Deleted.
2024         (bmalloc::Chunk::clearUsedSinceLastScavenge): Deleted.
2025         (bmalloc::Chunk::setUsedSinceLastScavenge): Deleted.
2026         * bmalloc/Heap.cpp:
2027         (bmalloc::Heap::scavenge):
2028         (bmalloc::Heap::allocateSmallPage):
2029
2030 2019-03-21  Brady Eidson  <beidson@apple.com>
2031
2032         Certain WebProcesses should opt-out of the freezer.
2033         <rdar://problem/42846139> and https://bugs.webkit.org/show_bug.cgi?id=196062
2034
2035         Reviewed by Andy Estes.
2036
2037         * bmalloc.xcodeproj/project.pbxproj:
2038         * bmalloc/darwin/MemoryStatusSPI.h:
2039
2040 2019-03-19  Michael Catanzaro  <mcatanzaro@igalia.com>
2041
2042         Unreviewed, fix -Wformat warning
2043         https://bugs.webkit.org/show_bug.cgi?id=195895
2044         <rdar://problem/48517629>
2045
2046         * bmalloc/Scavenger.cpp:
2047         (bmalloc::Scavenger::threadRunLoop):
2048
2049 2019-03-18  Michael Saboff  <msaboff@apple.com>
2050
2051         [BMalloc] Scavenger should react to recent memory activity
2052         https://bugs.webkit.org/show_bug.cgi?id=195895
2053
2054         Reviewed by Geoffrey Garen.
2055
2056         This change adds a recently used bit to objects that are scavenged.  When an object is allocated, that bit is set.
2057         When we scavenge, if the bit is set, we clear it.  If the bit was already clear, we decommit the object.  The timing
2058         to scavenging has been changed as well.  We perform our first scavne almost immediately after bmalloc is initialized
2059         (10ms later).  Subsequent scavenging is done as a multiple of the time it took to scavenge.  We bound this computed
2060         time between a minimum and maximum.  Through empirical testing, the multiplier, minimum and maximum are
2061         150x, 100ms and 10,000ms respectively.  For mini-mode, when the JIT is disabled, we use much more aggressive values of
2062         50x, 25ms and 500ms.
2063
2064         Eliminated partial scavenging since this change allows for any scavenge to be partial or full based on recent use of
2065         the objects on the various free lists.
2066
2067         * bmalloc/Chunk.h:
2068         (bmalloc::Chunk::usedSinceLastScavenge):
2069         (bmalloc::Chunk::clearUsedSinceLastScavenge):
2070         (bmalloc::Chunk::setUsedSinceLastScavenge):
2071         * bmalloc/Heap.cpp:
2072         (bmalloc::Heap::scavenge):
2073         (bmalloc::Heap::allocateSmallChunk):
2074         (bmalloc::Heap::allocateSmallPage):
2075         (bmalloc::Heap::splitAndAllocate):
2076         (bmalloc::Heap::tryAllocateLarge):
2077         (bmalloc::Heap::scavengeToHighWatermark): Deleted.
2078         * bmalloc/Heap.h:
2079         * bmalloc/IsoDirectory.h:
2080         * bmalloc/IsoDirectoryInlines.h:
2081         (bmalloc::passedNumPages>::takeFirstEligible):
2082         (bmalloc::passedNumPages>::scavenge):
2083         (bmalloc::passedNumPages>::scavengeToHighWatermark): Deleted.
2084         * bmalloc/IsoHeapImpl.h:
2085         * bmalloc/IsoHeapImplInlines.h:
2086         (bmalloc::IsoHeapImpl<Config>::scavengeToHighWatermark): Deleted.
2087         * bmalloc/LargeRange.h:
2088         (bmalloc::LargeRange::LargeRange):
2089         (bmalloc::LargeRange::usedSinceLastScavenge):
2090         (bmalloc::LargeRange::clearUsedSinceLastScavenge):
2091         (bmalloc::LargeRange::setUsedSinceLastScavenge):
2092         (): Deleted.
2093         * bmalloc/Scavenger.cpp:
2094         (bmalloc::Scavenger::Scavenger):
2095         (bmalloc::Scavenger::threadRunLoop):
2096         (bmalloc::Scavenger::timeSinceLastPartialScavenge): Deleted.
2097         (bmalloc::Scavenger::partialScavenge): Deleted.
2098         * bmalloc/Scavenger.h:
2099         * bmalloc/SmallPage.h:
2100         (bmalloc::SmallPage::usedSinceLastScavenge):
2101         (bmalloc::SmallPage::clearUsedSinceLastScavenge):
2102         (bmalloc::SmallPage::setUsedSinceLastScavenge):
2103
2104 2019-03-14  Yusuke Suzuki  <ysuzuki@apple.com>
2105
2106         [bmalloc] Add StaticPerProcess for known types to save pages
2107         https://bugs.webkit.org/show_bug.cgi?id=195691
2108
2109         Reviewed by Mark Lam.
2110
2111         As initial memory footprint of VM + JSGlobalObject becomes 488KB dirty size in fast malloc memory (w/ JSC_useJIT=0 and Malloc=1), pages for PerProcess is costly.
2112         For example, under Malloc=1 mode, we still need to allocate PerProcess<DebugHeap> and PerProcess<Environment>. And sizeof(Environment) is only 1 (bool flag), and
2113         sizeof(DebugHeap) is 120. But we are allocating 1 pages for them. Since page size in iOS is 16KB, this 121B consumes 16KB dirty memory, and it is not negligible
2114         size if we keep in mind that the current fast malloc heap size is 488KB. Putting them into the __DATA section, close to the other mutable data, we can avoid allocating
2115         this page.
2116
2117         This patch revives the SafePerProcess concept in r228107. We add "StaticPerProcess<T>", which allocates underlying storage statically in the __DATA section instead of
2118         allocating it at runtime. And we use this StaticPerProcess<T> for types where (1) T is known a priori, and (2) sizeof(T) is not huge.
2119
2120         * bmalloc.xcodeproj/project.pbxproj:
2121         * bmalloc/AllIsoHeaps.cpp:
2122         * bmalloc/AllIsoHeaps.h:
2123         * bmalloc/Allocator.cpp:
2124         (bmalloc::Allocator::Allocator):
2125         * bmalloc/Cache.cpp:
2126         (bmalloc::Cache::Cache):
2127         * bmalloc/CryptoRandom.cpp:
2128         (bmalloc::cryptoRandom):
2129         * bmalloc/Deallocator.cpp:
2130         (bmalloc::Deallocator::Deallocator):
2131         * bmalloc/DebugHeap.cpp:
2132         * bmalloc/DebugHeap.h:
2133         (bmalloc::DebugHeap::tryGet):
2134         * bmalloc/Environment.cpp:
2135         * bmalloc/Environment.h:
2136         * bmalloc/Gigacage.cpp:
2137         (Gigacage::Callback::Callback):
2138         (Gigacage::Callback::function):
2139         (bmalloc::PrimitiveDisableCallbacks::PrimitiveDisableCallbacks):
2140         (Gigacage::disablePrimitiveGigacage):
2141         (Gigacage::addPrimitiveDisableCallback):
2142         (Gigacage::removePrimitiveDisableCallback):
2143         (Gigacage::shouldBeEnabled):
2144         (Gigacage::bmalloc::Callback::Callback): Deleted.
2145         (Gigacage::bmalloc::Callback::function): Deleted.
2146         (Gigacage::bmalloc::PrimitiveDisableCallbacks::PrimitiveDisableCallbacks): Deleted.
2147         * bmalloc/Heap.cpp:
2148         (bmalloc::Heap::Heap):
2149         (bmalloc::Heap::tryAllocateLarge):
2150         * bmalloc/IsoDirectoryInlines.h:
2151         (bmalloc::passedNumPages>::takeFirstEligible):
2152         (bmalloc::passedNumPages>::didBecome):
2153         * bmalloc/IsoHeapImpl.cpp:
2154         (bmalloc::IsoHeapImplBase::addToAllIsoHeaps):
2155         * bmalloc/IsoPage.cpp:
2156         (bmalloc::IsoPageBase::allocatePageMemory):
2157         * bmalloc/IsoTLS.cpp:
2158         (bmalloc::IsoTLS::IsoTLS):
2159         (bmalloc::IsoTLS::ensureEntries):
2160         (bmalloc::IsoTLS::forEachEntry):
2161         * bmalloc/IsoTLSEntry.cpp:
2162         (bmalloc::IsoTLSEntry::IsoTLSEntry):
2163         * bmalloc/IsoTLSInlines.h:
2164         (bmalloc::IsoTLS::allocateSlow):
2165         (bmalloc::IsoTLS::deallocateSlow):
2166         * bmalloc/IsoTLSLayout.cpp:
2167         * bmalloc/IsoTLSLayout.h:
2168         * bmalloc/Scavenger.cpp:
2169         (bmalloc::Scavenger::Scavenger):
2170         (bmalloc::dumpStats):
2171         (bmalloc::Scavenger::scavenge):
2172         (bmalloc::Scavenger::partialScavenge):
2173         (bmalloc::Scavenger::freeableMemory):
2174         (bmalloc::Scavenger::footprint):
2175         * bmalloc/Scavenger.h:
2176         * bmalloc/StaticPerProcess.h: Added.
2177         * bmalloc/VMHeap.cpp:
2178         * bmalloc/VMHeap.h:
2179         * bmalloc/Zone.h:
2180         * bmalloc/bmalloc.cpp:
2181         (bmalloc::api::scavenge):
2182         (bmalloc::api::isEnabled):
2183         (bmalloc::api::setScavengerThreadQOSClass):
2184         (bmalloc::api::enableMiniMode):
2185         * test/testbmalloc.cpp:
2186         (assertEmptyPointerSet):
2187         (assertHasObjects):
2188         (assertHasOnlyObjects):
2189         (assertClean):
2190
2191 2019-03-13  Yoshiaki Jitsukawa  <yoshiaki.jitsukawa@sony.com>
2192
2193         [bmalloc] Use MADV_FREE on FreeBSD
2194         https://bugs.webkit.org/show_bug.cgi?id=195665
2195
2196         Reviewed by Geoffrey Garen.
2197
2198         * bmalloc/BPlatform.h:
2199
2200         Introduce BOS_FREEBSD, which is equivalent to WTF_OS_FREEBSD
2201
2202         * bmalloc/VMAllocate.h:
2203         (bmalloc::vmDeallocatePhysicalPages):
2204
2205         Use MADV_FREE instead of MADV_DONTNEED if BOS(FREEBSD), since on FreeBSD,
2206         unlike on Linux, MADV_DONTNEED doesn't let the OS discard the contents of
2207         the pages.
2208
2209 2019-03-13  Sam Weinig  <sam@webkit.org>
2210
2211         Fix testbmalloc build
2212         https://bugs.webkit.org/show_bug.cgi?id=195660
2213
2214         Reviewed by Geoffrey Garen.
2215
2216         * bmalloc.xcodeproj/project.pbxproj:
2217         Link Foundation in when building testbmalloc. Since bmalloc requires Foundation, and is a static
2218         library, all clients of bmalloc are required to link it themselves.
2219         
2220         * bmalloc/IsoPageInlines.h:
2221         * bmalloc/StdLibExtras.h: Added.
2222         (bmalloc::bitwise_cast):
2223         Add bitwise_cast implementation, and use it in IsoPageInlines.h. It is a layering violation
2224         to expect the one from WTF to be available, as seems to have been the case.
2225
2226 2019-03-12  Robin Morisset  <rmorisset@apple.com>
2227
2228         A lot more classes have padding that can be reduced by reordering their fields
2229         https://bugs.webkit.org/show_bug.cgi?id=195579
2230
2231         Reviewed by Mark Lam.
2232
2233         * bmalloc/Heap.h:
2234         * bmalloc/Scavenger.h:
2235
2236 2019-03-05  Yusuke Suzuki  <ysuzuki@apple.com>
2237
2238         [bmalloc] Bmalloc DebugHeap should have dump and scavenge features
2239         https://bugs.webkit.org/show_bug.cgi?id=195305
2240
2241         Reviewed by Saam Barati.
2242
2243         As the same to bmalloc, bmalloc::DebugHeap should have scavenge feature to make it scavengable if we want.
2244         We also add DebugHeap::dump feature which dumps system malloc data in the WebKit Malloc zone.
2245
2246         * bmalloc/DebugHeap.cpp:
2247         (bmalloc::DebugHeap::scavenge):
2248         (bmalloc::DebugHeap::dump):
2249         * bmalloc/DebugHeap.h:
2250         * bmalloc/bmalloc.cpp:
2251         (bmalloc::api::scavenge):
2252
2253 2019-02-23  Keith Miller  <keith_miller@apple.com>
2254
2255         Add new mac target numbers
2256         https://bugs.webkit.org/show_bug.cgi?id=194955
2257
2258         Reviewed by Tim Horton.
2259
2260         * Configurations/Base.xcconfig:
2261         * Configurations/DebugRelease.xcconfig:
2262
2263 2019-02-19  Yusuke Suzuki  <ysuzuki@apple.com>
2264
2265         [bmalloc] bmalloc::Heap is allocated even though we use system malloc mode
2266         https://bugs.webkit.org/show_bug.cgi?id=194836
2267
2268         Reviewed by Mark Lam.
2269
2270         Previously, bmalloc::Heap holds DebugHeap, and delegates allocation and deallocation to debug heap.
2271         However, bmalloc::Heap is large. We would like to avoid initialization of bmalloc::Heap under the
2272         system malloc mode.
2273
2274         This patch extracts out DebugHeap from bmalloc::Heap, and logically puts this in a boundary of
2275         bmalloc::api. bmalloc::api delegates allocation and deallocation to DebugHeap if DebugHeap is enabled.
2276         Otherwise, using bmalloc's usual mechanism. The challenge is that we would like to keep bmalloc fast
2277         path fast.
2278
2279         1. For IsoHeaps, we use the similar techniques done in Cache. If the debug mode is enabled, we always go
2280            to the slow path of the IsoHeap allocation, and keep IsoTLS::get() returning nullptr. In the slow path,
2281            we just fallback to the usual bmalloc::api::tryMalloc implementation. This is efficient because bmalloc
2282            continues using the fast path.
2283
2284         2. For the other APIs, like freeLargeVirtual, we just put DebugHeap check because this API itself takes fair
2285            amount of time. Then debug heap check does not matter.
2286
2287         * bmalloc/Allocator.cpp:
2288         (bmalloc::Allocator::reallocateImpl):
2289         * bmalloc/Cache.cpp:
2290         (bmalloc::Cache::tryAllocateSlowCaseNullCache):
2291         (bmalloc::Cache::allocateSlowCaseNullCache):
2292         (bmalloc::Cache::deallocateSlowCaseNullCache):
2293         (bmalloc::Cache::tryReallocateSlowCaseNullCache):
2294         (bmalloc::Cache::reallocateSlowCaseNullCache):
2295         (): Deleted.
2296         (bmalloc::debugHeap): Deleted.
2297         * bmalloc/DebugHeap.cpp:
2298         * bmalloc/DebugHeap.h:
2299         (bmalloc::DebugHeap::tryGet):
2300         * bmalloc/Heap.cpp:
2301         (bmalloc::Heap::Heap):
2302         (bmalloc::Heap::footprint):
2303         (bmalloc::Heap::tryAllocateLarge):
2304         (bmalloc::Heap::deallocateLarge):
2305         * bmalloc/Heap.h:
2306         (bmalloc::Heap::debugHeap): Deleted.
2307         * bmalloc/IsoTLS.cpp:
2308         (bmalloc::IsoTLS::IsoTLS):
2309         (bmalloc::IsoTLS::isUsingDebugHeap): Deleted.
2310         (bmalloc::IsoTLS::debugMalloc): Deleted.
2311         (bmalloc::IsoTLS::debugFree): Deleted.
2312         * bmalloc/IsoTLS.h:
2313         * bmalloc/IsoTLSInlines.h:
2314         (bmalloc::IsoTLS::allocateSlow):
2315         (bmalloc::IsoTLS::deallocateSlow):
2316         * bmalloc/ObjectType.cpp:
2317         (bmalloc::objectType):
2318         * bmalloc/ObjectType.h:
2319         * bmalloc/Scavenger.cpp:
2320         (bmalloc::Scavenger::Scavenger):
2321         * bmalloc/bmalloc.cpp:
2322         (bmalloc::api::tryLargeZeroedMemalignVirtual):
2323         (bmalloc::api::freeLargeVirtual):
2324         (bmalloc::api::scavenge):
2325         (bmalloc::api::isEnabled):
2326         (bmalloc::api::setScavengerThreadQOSClass):
2327         (bmalloc::api::commitAlignedPhysical):
2328         (bmalloc::api::decommitAlignedPhysical):
2329         (bmalloc::api::enableMiniMode):
2330
2331 2019-02-20  Andy Estes  <aestes@apple.com>
2332
2333         [Xcode] Add SDKVariant.xcconfig to various Xcode projects
2334         https://bugs.webkit.org/show_bug.cgi?id=194869
2335
2336         Rubber-stamped by Jer Noble.
2337
2338         * bmalloc.xcodeproj/project.pbxproj:
2339
2340 2019-02-20  Yusuke Suzuki  <ysuzuki@apple.com>
2341
2342         [bmalloc] DebugHeap::malloc does not have "try" version.
2343         https://bugs.webkit.org/show_bug.cgi?id=194837
2344
2345         Reviewed by Mark Lam.
2346
2347         Since DebugHeap::malloc does not have "try" version, our tryAllocate implementation does not work well with DebugHeap.
2348         This patch adds crashOnFailure flag to DebugHeap::malloc.
2349
2350         * bmalloc/Cache.cpp:
2351         (bmalloc::Cache::tryAllocateSlowCaseNullCache):
2352         (bmalloc::Cache::allocateSlowCaseNullCache):
2353         * bmalloc/DebugHeap.cpp:
2354         (bmalloc::DebugHeap::malloc):
2355         * bmalloc/DebugHeap.h:
2356         * bmalloc/IsoTLS.cpp:
2357         (bmalloc::IsoTLS::debugMalloc):
2358
2359 2019-02-20  Yusuke Suzuki  <ysuzuki@apple.com>
2360
2361         [bmalloc] bmalloc::Cache should not be instantiated if we are using system malloc
2362         https://bugs.webkit.org/show_bug.cgi?id=194811
2363
2364         Reviewed by Mark Lam.
2365
2366         bmalloc::Cache is very large. It is 13KB. Since it exists per HeapKind, it takes 40KB.
2367         But this is meaningless if we are under the system malloc mode by using "Malloc=1". We
2368         found that it continues using so much dirty memory region even under the system malloc mode.
2369         This patch avoids instantiation of bmalloc::Cache under the system malloc mode.
2370
2371         * bmalloc/Allocator.cpp:
2372         (bmalloc::Allocator::Allocator):
2373         (bmalloc::Allocator::tryAllocate):
2374         (bmalloc::Allocator::allocateImpl):
2375         (bmalloc::Allocator::reallocateImpl):
2376         (bmalloc::Allocator::allocateSlowCase):
2377         Allocator is a per Cache object. So we no longer need to keep m_debugHeap. If debug heap is enabled,
2378         Allocator is never created.
2379
2380         * bmalloc/Allocator.h:
2381         * bmalloc/Cache.cpp:
2382         (bmalloc::debugHeap):
2383         (bmalloc::Cache::Cache):
2384         (bmalloc::Cache::tryAllocateSlowCaseNullCache):
2385         (bmalloc::Cache::allocateSlowCaseNullCache):
2386         (bmalloc::Cache::deallocateSlowCaseNullCache):
2387         (bmalloc::Cache::tryReallocateSlowCaseNullCache):
2388         (bmalloc::Cache::reallocateSlowCaseNullCache):
2389         * bmalloc/Cache.h:
2390         (bmalloc::Cache::tryAllocate):
2391         (bmalloc::Cache::tryReallocate):
2392         If the debug heap mode is enabled, we keep Cache::getFast() returning nullptr. And in the slow path case, we use debugHeap.
2393         This makes bmalloc fast path fast, while we avoid Cache instantiation.
2394
2395         * bmalloc/Deallocator.cpp:
2396         (bmalloc::Deallocator::Deallocator):
2397         (bmalloc::Deallocator::scavenge):
2398         (bmalloc::Deallocator::deallocateSlowCase):
2399         * bmalloc/Deallocator.h:
2400         Ditto for Deallocator.
2401
2402         * bmalloc/bmalloc.cpp:
2403         (bmalloc::api::isEnabled):
2404         We used `getFastCase()` for Heap. But it is basically wrong since we do not have any guarantee that someone already initializes
2405         Heap when this is called. Previously, luckily, Cache is initialized, and Cache initialized Heap. But Cache initialization is removed
2406         for system malloc mode and now PerProcess<PerHeapKind<Heap>>::getFastCase() returns nullptr at an early phase. This patch just uses
2407         Environment::isDebugHeapEnabled() instead.
2408
2409 2019-02-20  Commit Queue  <commit-queue@webkit.org>
2410
2411         Unreviewed, rolling out r241789.
2412         https://bugs.webkit.org/show_bug.cgi?id=194856
2413
2414         GuardMalloc crashes (Requested by yusukesuzuki on #webkit).
2415
2416         Reverted changeset:
2417
2418         "[bmalloc] bmalloc::Cache should not be instantiated if we are
2419         using system malloc"
2420         https://bugs.webkit.org/show_bug.cgi?id=194811
2421         https://trac.webkit.org/changeset/241789
2422
2423 2019-02-19  Yusuke Suzuki  <ysuzuki@apple.com>
2424
2425         [bmalloc] bmalloc::Cache should not be instantiated if we are using system malloc
2426         https://bugs.webkit.org/show_bug.cgi?id=194811
2427
2428         Reviewed by Mark Lam.
2429
2430         bmalloc::Cache is very large. It is 13KB. Since it exists per HeapKind, it takes 40KB.
2431         But this is meaningless if we are under the system malloc mode by using "Malloc=1". We
2432         found that it continues using so much dirty memory region even under the system malloc mode.
2433         This patch avoids instantiation of bmalloc::Cache under the system malloc mode.
2434
2435         * bmalloc/Allocator.cpp:
2436         (bmalloc::Allocator::Allocator):
2437         (bmalloc::Allocator::tryAllocate):
2438         (bmalloc::Allocator::allocateImpl):
2439         (bmalloc::Allocator::reallocateImpl):
2440         (bmalloc::Allocator::allocateSlowCase):
2441         Allocator is a per Cache object. So we no longer need to keep m_debugHeap. If debug heap is enabled,
2442         Allocator is never created.
2443
2444         * bmalloc/Allocator.h:
2445         * bmalloc/Cache.cpp:
2446         (bmalloc::debugHeap):
2447         (bmalloc::Cache::Cache):
2448         (bmalloc::Cache::tryAllocateSlowCaseNullCache):
2449         (bmalloc::Cache::allocateSlowCaseNullCache):
2450         (bmalloc::Cache::deallocateSlowCaseNullCache):
2451         (bmalloc::Cache::tryReallocateSlowCaseNullCache):
2452         (bmalloc::Cache::reallocateSlowCaseNullCache):
2453         * bmalloc/Cache.h:
2454         (bmalloc::Cache::tryAllocate):
2455         (bmalloc::Cache::tryReallocate):
2456         If the debug heap mode is enabled, we keep Cache::getFast() returning nullptr. And in the slow path case, we use debugHeap.
2457         This makes bmalloc fast path fast, while we avoid Cache instantiation.
2458
2459         * bmalloc/Deallocator.cpp:
2460         (bmalloc::Deallocator::Deallocator):
2461         (bmalloc::Deallocator::scavenge):
2462         (bmalloc::Deallocator::deallocateSlowCase):
2463         * bmalloc/Deallocator.h:
2464         Ditto for Deallocator.
2465
2466 2019-02-15  Yusuke Suzuki  <ysuzuki@apple.com>
2467
2468         [bmalloc] NSBundle-based application name check should be executed after debug-heap environment variable check
2469         https://bugs.webkit.org/show_bug.cgi?id=194694
2470
2471         Reviewed by Mark Lam.
2472
2473         Interestingly, NSBundle allocates fair amount of memory and keeps it for a process-long time. For example, it
2474         allocates global NSConcreteHashTable, which takes 2.5KB. This patch changes the order of gigacage-check, we
2475         first check "Malloc=1" status, and then check the process name through NSBundle. This allows us to remove NSBundle
2476         related allocation in JSC initialization in the system malloc mode.
2477
2478         * bmalloc/Gigacage.cpp:
2479         (Gigacage::shouldBeEnabled):
2480
2481 2019-02-15  Yusuke Suzuki  <ysuzuki@apple.com>
2482
2483         [bmalloc] Do not start scavenger thread if we use system malloc
2484         https://bugs.webkit.org/show_bug.cgi?id=194674
2485
2486         Reviewed by Mark Lam.
2487
2488         We always start the scavenger thread even if system malloc is used by the environment variable like "Malloc=1".
2489         Because bmalloc allocation goes to the system malloc if "Malloc=1" is set, we do not need to scavenge. This patch
2490         changes it not to start the scavenger thread.
2491
2492         * bmalloc/Scavenger.cpp:
2493         (bmalloc::Scavenger::Scavenger):
2494
2495 2019-02-12  Commit Queue  <commit-queue@webkit.org>
2496
2497         Unreviewed, rolling out r241182.
2498         https://bugs.webkit.org/show_bug.cgi?id=194547
2499
2500         causes a 2-3% Speedometer2 regression. (Requested by
2501         keith_miller on #webkit).
2502
2503         Reverted changeset:
2504
2505         "bmalloc uses more memory on iOS compared to macOS due to
2506         physical page size differences"
2507         https://bugs.webkit.org/show_bug.cgi?id=192389
2508         https://trac.webkit.org/changeset/241182
2509
2510 2019-02-07  Michael Saboff  <msaboff@apple.com>
2511
2512         bmalloc uses more memory on iOS compared to macOS due to physical page size differences
2513         https://bugs.webkit.org/show_bug.cgi?id=192389
2514
2515         Reviewed by Geoffrey Garen.
2516
2517         Changed small line allocations to be in smallPageSize "virtual page" multiples instead of physical
2518         page size increments for sizes less that the physical page size.  This required changing the small
2519         page commit / decommit code to work in full physical page increments.  For page classes that are
2520         physical page size and larger, there isn't any functional change.
2521
2522         When scavenging page classes smaller than the physical page size, we need to consider whether or
2523         not the adjacent small pages on the same physical page are also free before decommiting that
2524         containing page.  When we need to commit more memory, we commit the whole page, and add any
2525         adjacent virtual pages that were fully committed as well.
2526
2527         * bmalloc/Chunk.h:
2528         (bmalloc::forEachPage):
2529         * bmalloc/Heap.cpp:
2530         (bmalloc::Heap::initializeLineMetadata):
2531         (bmalloc::Heap::initializePageMetadata):
2532         (bmalloc::Heap::scavenge):
2533         (bmalloc::__attribute__):
2534         (bmalloc::Heap::commitSmallPagesInPhysicalPage):
2535         (bmalloc::Heap::allocateSmallPage):
2536         (bmalloc::Heap::allocateSmallBumpRangesByMetadata):
2537         * bmalloc/Heap.h:
2538         * bmalloc/SmallPage.h:
2539         (bmalloc::SmallPage::refCount):
2540
2541 2019-01-18  Keith Miller  <keith_miller@apple.com>
2542
2543         gigacage slide should randomize both start and end
2544         https://bugs.webkit.org/show_bug.cgi?id=193601
2545
2546         Reviewed by Yusuke Suzuki.
2547
2548         This patch makes it so that the gigacade slide has an arbitrary
2549         distance from the end as well as the start. This is done by
2550         picking a random size then based on that size picking an random
2551         starting offset.
2552
2553         * bmalloc/Gigacage.h:
2554         * bmalloc/Heap.cpp:
2555         (bmalloc::Heap::Heap):
2556
2557 2019-01-18  Jer Noble  <jer.noble@apple.com>
2558
2559         SDK_VARIANT build destinations should be separate from non-SDK_VARIANT builds
2560         https://bugs.webkit.org/show_bug.cgi?id=189553
2561
2562         Reviewed by Tim Horton.
2563
2564         * Configurations/Base.xcconfig:
2565         * Configurations/SDKVariant.xcconfig: Added.
2566
2567 2019-01-18  Keith Miller  <keith_miller@apple.com>
2568
2569         Gigacages should start allocations from a slide
2570         https://bugs.webkit.org/show_bug.cgi?id=193523
2571
2572         Reviewed by Mark Lam.
2573
2574         This patch makes it so that Gigacage Heaps slide the start of the
2575         cage by some random amount. We still ensure that there is always
2576         at least 4/2GB, on MacOS/iOS respectively, of VA space available
2577         for allocation.
2578
2579         Also, this patch changes some macros into constants since macros
2580         are the devil.
2581
2582         * bmalloc/Gigacage.cpp:
2583         (Gigacage::bmalloc::protectGigacageBasePtrs):
2584         (Gigacage::bmalloc::unprotectGigacageBasePtrs):
2585         (Gigacage::bmalloc::runwaySize):
2586         (Gigacage::ensureGigacage):
2587         (Gigacage::shouldBeEnabled):
2588         * bmalloc/Gigacage.h:
2589         (Gigacage::name):
2590         (Gigacage::gigacageSizeToMask):
2591         (Gigacage::size):
2592         (Gigacage::mask):
2593         (Gigacage::basePtr):
2594         (Gigacage::ensureGigacage):
2595         (Gigacage::wasEnabled):
2596         (Gigacage::isCaged):
2597         (Gigacage::isEnabled):
2598         (Gigacage::caged):
2599         (Gigacage::disableDisablingPrimitiveGigacageIfShouldBeEnabled):
2600         (Gigacage::canPrimitiveGigacageBeDisabled):
2601         (Gigacage::disablePrimitiveGigacage):
2602         (Gigacage::addPrimitiveDisableCallback):
2603         (Gigacage::removePrimitiveDisableCallback):
2604         * bmalloc/Heap.cpp:
2605         (bmalloc::Heap::Heap):
2606         * bmalloc/Sizes.h:
2607         (bmalloc::Sizes::maskSizeClass):
2608         (bmalloc::Sizes::maskObjectSize):
2609         (bmalloc::Sizes::logSizeClass):
2610         (bmalloc::Sizes::logObjectSize):
2611         (bmalloc::Sizes::sizeClass):
2612         (bmalloc::Sizes::objectSize):
2613         (bmalloc::Sizes::pageSize):
2614
2615 2019-01-18  Matt Lewis  <jlewis3@apple.com>
2616
2617         Unreviewed, rolling out r240160.
2618
2619         This broke multiple internal builds.
2620
2621         Reverted changeset:
2622
2623         "Gigacages should start allocations from a slide"
2624         https://bugs.webkit.org/show_bug.cgi?id=193523
2625         https://trac.webkit.org/changeset/240160
2626
2627 2019-01-18  Keith Miller  <keith_miller@apple.com>
2628
2629         Gigacages should start allocations from a slide
2630         https://bugs.webkit.org/show_bug.cgi?id=193523
2631
2632         Reviewed by Mark Lam.
2633
2634         This patch makes it so that Gigacage Heaps slide the start of the
2635         cage by some random amount. We still ensure that there is always
2636         at least 4/2GB, on MacOS/iOS respectively, of VA space available
2637         for allocation.
2638
2639         Also, this patch changes some macros into constants since macros
2640         are the devil.
2641
2642         * bmalloc/Gigacage.cpp:
2643         (Gigacage::bmalloc::protectGigacageBasePtrs):
2644         (Gigacage::bmalloc::unprotectGigacageBasePtrs):
2645         (Gigacage::bmalloc::runwaySize):
2646         (Gigacage::ensureGigacage):
2647         (Gigacage::shouldBeEnabled):
2648         * bmalloc/Gigacage.h:
2649         (Gigacage::name):
2650         (Gigacage::gigacageSizeToMask):
2651         (Gigacage::size):
2652         (Gigacage::mask):
2653         (Gigacage::basePtr):
2654         (Gigacage::ensureGigacage):
2655         (Gigacage::wasEnabled):
2656         (Gigacage::isCaged):
2657         (Gigacage::caged):
2658         (Gigacage::disableDisablingPrimitiveGigacageIfShouldBeEnabled):
2659         (Gigacage::disablePrimitiveGigacage):
2660         (Gigacage::addPrimitiveDisableCallback):
2661         (Gigacage::removePrimitiveDisableCallback):
2662         * bmalloc/Heap.cpp:
2663         (bmalloc::Heap::Heap):
2664         * bmalloc/Sizes.h:
2665         (bmalloc::Sizes::maskSizeClass):
2666         (bmalloc::Sizes::maskObjectSize):
2667         (bmalloc::Sizes::logSizeClass):
2668         (bmalloc::Sizes::logObjectSize):
2669         (bmalloc::Sizes::sizeClass):
2670         (bmalloc::Sizes::objectSize):
2671         (bmalloc::Sizes::pageSize):
2672
2673 2019-01-17  Truitt Savell  <tsavell@apple.com>
2674
2675         Unreviewed, rolling out r240124.
2676
2677         This commit broke an internal build.
2678
2679         Reverted changeset:
2680
2681         "SDK_VARIANT build destinations should be separate from non-
2682         SDK_VARIANT builds"
2683         https://bugs.webkit.org/show_bug.cgi?id=189553
2684         https://trac.webkit.org/changeset/240124
2685
2686 2019-01-17  Jer Noble  <jer.noble@apple.com>
2687
2688         SDK_VARIANT build destinations should be separate from non-SDK_VARIANT builds
2689         https://bugs.webkit.org/show_bug.cgi?id=189553
2690
2691         Reviewed by Tim Horton.
2692
2693         * Configurations/Base.xcconfig:
2694         * Configurations/SDKVariant.xcconfig: Added.
2695
2696 2019-01-16  Keith Miller  <keith_miller@apple.com>
2697
2698         bmalloc should use JSC VM tag for gigacage
2699         https://bugs.webkit.org/show_bug.cgi?id=193496
2700
2701         Reviewed by Mark Lam.
2702
2703         This patch moves the VMTag info from WTF to bmalloc so that we can
2704         tag gigacage memory with the unused JSC memory tag. The JSC memory
2705         tag was previously used for wasm but since wasm is now allocated
2706         out of the primitive cage it was unused.
2707
2708         * bmalloc.xcodeproj/project.pbxproj:
2709         * bmalloc/BVMTags.h: Copied from Source/WTF/wtf/VMTags.h.
2710         * bmalloc/Gigacage.cpp:
2711         (Gigacage::ensureGigacage):
2712         * bmalloc/VMAllocate.h:
2713         (bmalloc::tryVMAllocate):
2714         (bmalloc::vmZeroAndPurge):
2715
2716 2019-01-09  Mark Lam  <mark.lam@apple.com>
2717
2718         Gigacage disabling checks should handle the GIGACAGE_ALLOCATION_CAN_FAIL case properly.
2719         https://bugs.webkit.org/show_bug.cgi?id=193292
2720         <rdar://problem/46485450>
2721
2722         Reviewed by Yusuke Suzuki.
2723
2724         Previously, when GIGACAGE_ALLOCATION_CAN_FAIL is true, we allow the Gigacage to
2725         be disabled if we fail to allocate memory for it.  However, Gigacage::primitiveGigacageDisabled()
2726         still always assumes that the Gigacage is always enabled after ensureGigacage() is
2727         called.
2728
2729         This patch updates Gigacage::primitiveGigacageDisabled() to allow the Gigacage to
2730         already be disabled if GIGACAGE_ALLOCATION_CAN_FAIL is true and wasEnabled() is
2731         false.
2732
2733         In this patch, we also put the wasEnabled flag in the 0th slot of the
2734         g_gigacageBasePtrs buffer to ensure that it is also protected against writes just
2735         like the Gigacage base pointers.
2736
2737         To achieve this, we do the following:
2738         1. Added a reservedForFlags field in struct BasePtrs.
2739         2. Added a ReservedForFlagsAndNotABasePtr Gigacage::Kind.
2740         3. Added assertions to ensure that the BasePtrs::primitive is at the offset
2741            matching the offset computed from Gigacage::Primitive.  Ditto for
2742            BasePtrs::jsValue and Gigacage::JSValue.
2743         4. Added assertions to ensure that Gigacage::ReservedForFlagsAndNotABasePtr is not
2744            used for fetching a Gigacage base pointer.
2745         5. Added RELEASE_BASSERT_NOT_REACHED() to implement such assertions in bmalloc.
2746
2747         No test added because this issue requires Gigacage allocation to fail in order to
2748         manifest.  I've tested it manually by modifying the code locally to force an
2749         allocation failure.
2750
2751         * bmalloc/BAssert.h:
2752         * bmalloc/Gigacage.cpp:
2753         (Gigacage::ensureGigacage):
2754         (Gigacage::primitiveGigacageDisabled):
2755         * bmalloc/Gigacage.h:
2756         (Gigacage::wasEnabled):
2757         (Gigacage::setWasEnabled):
2758         (Gigacage::name):
2759         (Gigacage::basePtr):
2760         (Gigacage::size):
2761         * bmalloc/HeapKind.h:
2762         (bmalloc::heapKind):
2763
2764 2018-12-15  Yusuke Suzuki  <yusukesuzuki@slowstart.org>
2765
2766         Unreviewed, suppress warnings in Linux
2767
2768         * bmalloc/Gigacage.cpp:
2769
2770 2018-12-14  Keith Miller  <keith_miller@apple.com>
2771
2772         Gigacage runway should immediately follow the primitive cage
2773         https://bugs.webkit.org/show_bug.cgi?id=192733
2774
2775         Reviewed by Saam Barati.
2776
2777         This patch makes sure that the Gigacage runway is always
2778         immediately after the primitive cage. Since writing outside the
2779         primitive gigacage is likely to be more dangerous than the JSValue
2780         cage. The ordering of the cages is still random however.
2781
2782         * bmalloc/Gigacage.cpp:
2783         (Gigacage::ensureGigacage):
2784
2785 2018-12-13  Mark Lam  <mark.lam@apple.com>
2786
2787         Verify that tryLargeZeroedMemalignVirtual()'s aligned size and alignment values are valid.
2788         https://bugs.webkit.org/show_bug.cgi?id=192682
2789         <rdar://problem/37751522>
2790
2791         Reviewed by Saam Barati.
2792
2793         * bmalloc/bmalloc.cpp:
2794         (bmalloc::api::tryLargeZeroedMemalignVirtual):
2795
2796 2018-11-21  Dominik Infuehr  <dinfuehr@igalia.com>
2797
2798         Enable JIT on ARM/Linux
2799         https://bugs.webkit.org/show_bug.cgi?id=191548
2800
2801         Reviewed by Yusuke Suzuki.
2802
2803         * bmalloc/IsoPageInlines.h:
2804         (bmalloc::IsoPage<Config>::startAllocating):
2805
2806 2018-11-01  Jiewen Tan  <jiewen_tan@apple.com>
2807
2808         Replace CommonRandom SPI with API
2809         https://bugs.webkit.org/show_bug.cgi?id=191178
2810         <rdar://problem/45722391>
2811
2812         Reviewed by Brent Fulgham.
2813
2814         * bmalloc/CryptoRandom.cpp:
2815         (bmalloc::ARC4RandomNumberGenerator::stir):
2816
2817 2018-10-29  Mark Lam  <mark.lam@apple.com>
2818
2819         Correctly detect string overflow when using the 'Function' constructor.
2820         https://bugs.webkit.org/show_bug.cgi?id=184883
2821         <rdar://problem/36320331>
2822
2823         Reviewed by Saam Barati.
2824
2825         * bmalloc/Allocator.cpp:
2826         (bmalloc::Allocator::reallocate):
2827         (bmalloc::Allocator::tryReallocate):
2828         (bmalloc::Allocator::reallocateImpl):
2829         * bmalloc/Allocator.h:
2830         * bmalloc/Cache.h:
2831         (bmalloc::Cache::tryReallocate):
2832         * bmalloc/DebugHeap.cpp:
2833         (bmalloc::DebugHeap::realloc):
2834         * bmalloc/DebugHeap.h:
2835         * bmalloc/bmalloc.h:
2836         (bmalloc::api::tryRealloc):
2837
2838 2018-10-25  Ross Kirsling  <ross.kirsling@sony.com>
2839
2840         Cleanup: inline constexpr is redundant as constexpr implies inline
2841         https://bugs.webkit.org/show_bug.cgi?id=190819
2842
2843         Reviewed by Mark Lam.
2844
2845         * bmalloc/Algorithm.h:
2846         (bmalloc::max):
2847         (bmalloc::min):
2848         (bmalloc::mask):
2849         (bmalloc::test):
2850         (bmalloc::isPowerOfTwo):
2851         (bmalloc::roundDownToMultipleOf):
2852         (bmalloc::sizeOf):
2853         (bmalloc::bitCount):
2854         (bmalloc::log2):
2855         * bmalloc/Bits.h:
2856         (bmalloc::bitsArrayLength):
2857         * bmalloc/Sizes.h:
2858         (bmalloc::Sizes::maskSizeClass):
2859
2860 2018-10-24  Alexey Proskuryakov  <ap@apple.com>
2861
2862         Add BPLATFORM(IOS_FAMILY)
2863         https://bugs.webkit.org/show_bug.cgi?id=190878
2864
2865         Reviewed by Saam Barati.
2866
2867         * bmalloc/AvailableMemory.cpp:
2868         (bmalloc::memorySizeAccordingToKernel):
2869         (bmalloc::computeAvailableMemory):
2870         * bmalloc/AvailableMemory.h:
2871         (bmalloc::isUnderMemoryPressure):
2872         * bmalloc/BPlatform.h:
2873         * bmalloc/Gigacage.h:
2874         * bmalloc/Logging.cpp:
2875         (bmalloc::logVMFailure):
2876         * bmalloc/VMAllocate.h:
2877         (bmalloc::vmPageSizePhysical):
2878         * bmalloc/bmalloc.h:
2879         * bmalloc/darwin/MemoryStatusSPI.h:
2880
2881 2018-10-12  Ryan Haddad  <ryanhaddad@apple.com>
2882
2883         Unreviewed, rolling out r237063.
2884
2885         Caused layout test fast/dom/Window/window-postmessage-clone-
2886         deep-array.html to fail on macOS and iOS Debug bots.
2887
2888         Reverted changeset:
2889
2890         "[JSC] Remove gcc warnings on mips and armv7"
2891         https://bugs.webkit.org/show_bug.cgi?id=188598
2892         https://trac.webkit.org/changeset/237063
2893
2894 2018-10-11  Guillaume Emont  <guijemont@igalia.com>
2895
2896         [JSC] Remove gcc warnings on mips and armv7
2897         https://bugs.webkit.org/show_bug.cgi?id=188598
2898
2899         Reviewed by Mark Lam.
2900
2901         Add bitwise_cast (from WTF) and use it instead of reinterpret_cast in
2902         a couple places where reinterpret_cast triggers a warning about
2903         alignment even though we know that alignment is correct.
2904
2905         * bmalloc/Algorithm.h:
2906         (bmalloc::bitwise_cast): Copied from WTF/wtf/StdLibextras.h
2907         * bmalloc/IsoDirectoryPageInlines.h:
2908         (bmalloc::IsoDirectoryPage<Config>::pageFor):
2909         * bmalloc/IsoPageInlines.h:
2910         (bmalloc::IsoPage<Config>::startAllocating):
2911
2912 2018-10-03  Dan Bernstein  <mitz@apple.com>
2913
2914         bmalloc part of [Xcode] Update some build settings as recommended by Xcode 10
2915         https://bugs.webkit.org/show_bug.cgi?id=190250
2916
2917         Reviewed by Alex Christensen.
2918
2919         * Configurations/Base.xcconfig: Enabled CLANG_WARN_COMMA, CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS,
2920           and CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF.
2921
2922         * bmalloc.xcodeproj/project.pbxproj: Let Xcode update LastUpgradeCheck.
2923
2924 2018-09-25  Alex Christensen  <achristensen@webkit.org>
2925
2926         Allow for suffixes to com.apple.WebKit.WebContent
2927         https://bugs.webkit.org/show_bug.cgi?id=189972
2928
2929         Reviewed by Chris Dumez.
2930
2931         * bmalloc/ProcessCheck.mm:
2932         (bmalloc::gigacageEnabledForProcess):
2933
2934 2018-09-24  Fujii Hironori  <Hironori.Fujii@sony.com>
2935
2936         Rename WTF_COMPILER_GCC_OR_CLANG to WTF_COMPILER_GCC_COMPATIBLE
2937         https://bugs.webkit.org/show_bug.cgi?id=189733
2938
2939         Reviewed by Michael Catanzaro.
2940
2941         * bmalloc/BCompiler.h:
2942
2943 2018-08-27  Keith Rollin  <krollin@apple.com>
2944
2945         Unreviewed build fix -- disable LTO for production builds
2946
2947         * Configurations/Base.xcconfig:
2948
2949 2018-08-27  Keith Rollin  <krollin@apple.com>
2950
2951         Build system support for LTO
2952         https://bugs.webkit.org/show_bug.cgi?id=187785
2953         <rdar://problem/42353132>
2954
2955         Reviewed by Dan Bernstein.
2956
2957         Update Base.xcconfig and DebugRelease.xcconfig to optionally enable
2958         LTO.
2959
2960         * Configurations/Base.xcconfig:
2961         * Configurations/DebugRelease.xcconfig:
2962
2963 2018-08-16  Tomas Popela  <tpopela@redhat.com>
2964
2965         bmalloc: Coverity scan issues
2966         https://bugs.webkit.org/show_bug.cgi?id=186763
2967
2968         Reviewed by Saam Barati.
2969
2970         * bmalloc/DebugHeap.h: Initialize the m_pageSize variable.
2971         * bmalloc/IsoTLS.cpp:
2972         (bmalloc::IsoTLS::ensureEntries): Check the return value of
2973         pthread_key_create return().
2974         * bmalloc/VMAllocate.h:
2975         (bmalloc::vmPageSize): Correctly check the return value of sysconf().
2976
2977 2018-07-27  Mark Lam  <mark.lam@apple.com>
2978
2979         Initialize bmalloc::DebugHeap::m_pageSize for non-Darwin builds.
2980         https://bugs.webkit.org/show_bug.cgi?id=188132
2981         <rdar://problem/40401599>
2982
2983         Reviewed by Saam Barati.
2984
2985         * bmalloc/DebugHeap.cpp:
2986         (bmalloc::DebugHeap::DebugHeap):
2987
2988 2018-07-27  Saam Barati  <sbarati@apple.com>
2989
2990         Explicitly handle memlimit_active < 0
2991         https://bugs.webkit.org/show_bug.cgi?id=188125
2992
2993         Reviewed by Mark Lam.
2994
2995         This may come up during development when someone wants the limit
2996         to be "infinite".
2997
2998         * bmalloc/AvailableMemory.cpp:
2999         (bmalloc::jetsamLimit):
3000
3001 2018-07-27  Saam Barati  <sbarati@apple.com>
3002
3003         Use SPI to compute the jetsam limit on iOS instead of hardcoding 840MB
3004         https://bugs.webkit.org/show_bug.cgi?id=188091
3005         <rdar://problem/42647697>
3006
3007         Reviewed by Simon Fraser.
3008
3009         We want bmalloc to dynamically adapt to the jetsam limit of the process
3010         it's running in. WTF::ramSize() is based off bmalloc's availableMemory,
3011         so it will now reflect the result of the real jetsam limit when we can
3012         read it.
3013         
3014         Reading the jetsam limit requires an entitlement, so this patch opts in
3015         the WebContent/Storage/Network processes. We fall back to 840MB (the
3016         old hard coded value) when the SPI call fails (e.g, when we're in a
3017         process without the proper entitlement).
3018
3019         * bmalloc.xcodeproj/project.pbxproj:
3020         * bmalloc/AvailableMemory.cpp:
3021         (bmalloc::jetsamLimit):
3022         (bmalloc::computeAvailableMemory):
3023         * bmalloc/darwin/MemoryStatusSPI.h: Added.
3024
3025 2018-07-24  Saam Barati  <sbarati@apple.com>
3026
3027         Revert back to using phys_footprint to calculate isUnderMemoryPressure()
3028         https://bugs.webkit.org/show_bug.cgi?id=187919
3029         <rdar://problem/42552888>
3030
3031         Reviewed by Simon Fraser.
3032
3033         Currently on iOS, bmalloc will run the scavenger more frequently when it detects
3034         that the process is under memory pressure. However, it only uses bmalloc's
3035         own footprint as a percentage of the HW available memory to determine if
3036         the process is under memory pressure. This is a change I recently made
3037         in an effort to run the scavenger less when bmalloc wasn't contributing
3038         to the dirty footprint in the process. However, this fails to run the
3039         scavenger eagerly when the process in question has a heap split
3040         between a lot of dirty bmalloc memory as well as a lot of dirty memory
3041         from elsewhere. We also have evidence that we may have increased jetsams
3042         in the Web Content process. Since my original change was not a measurable
3043         speedup, this patch reverts isUnderMemoryPressure() to its previous
3044         behavior of using phys_footprint to determine if 75% of the available 
3045         HW memory is being used.
3046
3047         * bmalloc/AvailableMemory.cpp:
3048         (bmalloc::memoryStatus):
3049
3050 2019-07-12  Michael Saboff  <msaboff@apple.com>
3051
3052         Disable IsoHeaps when Gigacage is off
3053         https://bugs.webkit.org/show_bug.cgi?id=187160
3054
3055         Reviewed by Saam Barati.
3056
3057         Relanding change sets 233547 and 233550 with the added fix that Gigacage is also
3058         enabled for DumpRenderTree.
3059
3060         Updated determineMallocFallbackState to base enabling of Iso Heaps on Gigacage 
3061         being enabled.  We do this because if Gigacage is disabled, it may be due to lack
3062         of address space.
3063
3064         To work around a compiler issue uncovered by the change above, I added explicit
3065         instantiation of PerThread's static variables.  Defined the same explicit
3066         instantiated static variables with export scope in the new file PerThread.cpp
3067         to eliminate separate variables allocations in each linked framework / library.
3068
3069         * CMakeLists.txt:
3070         * bmalloc.xcodeproj/project.pbxproj:
3071         * bmalloc/IsoTLS.cpp:
3072         (bmalloc::IsoTLS::determineMallocFallbackState):
3073         * bmalloc/PerThread.cpp: Added.
3074         * bmalloc/PerThread.h:
3075         * bmalloc/ProcessCheck.mm:
3076         (bmalloc::gigacageEnabledForProcess):
3077
3078 2018-07-09  Commit Queue  <commit-queue@webkit.org>
3079
3080         Unreviewed, rolling out r233547 and r233550.
3081         https://bugs.webkit.org/show_bug.cgi?id=187497
3082
3083         Introduced flakiness for media/fullscreen-* tests on mac-wk1
3084         (Requested by ryanhaddad on #webkit).
3085
3086         Reverted changesets:
3087
3088         "Disable IsoHeaps when Gigacage is off"
3089         https://bugs.webkit.org/show_bug.cgi?id=187160
3090         https://trac.webkit.org/changeset/233547
3091
3092         "Build fix (r233547): Disable IsoHeaps when Gigacage is off"
3093         https://bugs.webkit.org/show_bug.cgi?id=187160
3094         https://trac.webkit.org/changeset/233550
3095
3096 2018-07-05  David Kilzer  <ddkilzer@apple.com>
3097
3098         Build fix (r233547): Disable IsoHeaps when Gigacage is off
3099         <https://webkit.org/b/187160>
3100
3101         * bmalloc/PerThread.cpp: Add #if !HAVE_PTHREAD_MACHDEP_H/#endif
3102         around variables only used when that macro is 0.  Include what
3103         you use: Cache.h and Heap.h.
3104         * bmalloc/PerThread.h: Include <memory> for std::once_flag.
3105
3106 2018-07-05  Michael Saboff  <msaboff@apple.com>
3107
3108         Disable IsoHeaps when Gigacage is off
3109         https://bugs.webkit.org/show_bug.cgi?id=187160
3110
3111         Reviewed by Saam Barati.
3112
3113         Updated determineMallocFallbackState to base enabling of Iso Heaps on Gigacage 
3114         being enabled.  We do this because if Gigacage is disabled, it may be due to lack
3115         of address space.
3116
3117         To work around a compiler issue uncovered by the change above, I added explicit
3118         instantiation of PerThread's static variables.  Defined the same explicit
3119         instantiated static variables with export scope in the new file PerThread.cpp
3120         to eliminate separate variables allocations in each linked framework / library.
3121
3122         * CMakeLists.txt:
3123         * bmalloc.xcodeproj/project.pbxproj:
3124         * bmalloc/IsoTLS.cpp:
3125         (bmalloc::IsoTLS::determineMallocFallbackState):
3126         * bmalloc/PerThread.cpp: Added.
3127         * bmalloc/PerThread.h:
3128
3129 2018-07-04  Tim Horton  <timothy_horton@apple.com>
3130
3131         Introduce PLATFORM(IOSMAC)
3132         https://bugs.webkit.org/show_bug.cgi?id=187315
3133
3134         Reviewed by Dan Bernstein.
3135
3136         * Configurations/Base.xcconfig:
3137
3138 2018-06-29  Ryan Haddad  <ryanhaddad@apple.com>
3139
3140         Unreviewed, rolling out r233347.
3141
3142         Causes crashes during WK1 tests.
3143
3144         Reverted changeset:
3145
3146         "Disable IsoHeaps when Gigacage is off"
3147         https://bugs.webkit.org/show_bug.cgi?id=187160
3148         https://trac.webkit.org/changeset/233347
3149
3150 2018-06-28  Michael Saboff  <msaboff@apple.com>
3151
3152         Disable IsoHeaps when Gigacage is off
3153         https://bugs.webkit.org/show_bug.cgi?id=187160
3154
3155         Reviewed by Saam Barati.
3156
3157         If Gigacage is disabled, it may be due to lack of address space.
3158         Therefore we should also turn off IsoHeaps since it uses more virtual
3159         address space as well.
3160
3161         * bmalloc/IsoTLS.cpp:
3162         (bmalloc::IsoTLS::determineMallocFallbackState):
3163
3164 2018-06-27  Simon Fraser  <simon.fraser@apple.com>
3165
3166         https://hackernoon.com/ uses lots of layer backing store
3167         https://bugs.webkit.org/show_bug.cgi?id=186909
3168         rdar://problem/40257540
3169
3170         Reviewed by Tim Horton.
3171         
3172         Drive-by typo fix.
3173
3174         * bmalloc/Scavenger.cpp:
3175         (bmalloc::dumpStats):
3176
3177 2018-06-26  Saam Barati  <sbarati@apple.com>
3178
3179         Unreviewed followup. Fix the watchos build after r233192.
3180
3181         This patch also correct the changelog entry below to have the correct
3182         bug and title info.
3183
3184         * bmalloc/ProcessCheck.mm:
3185
3186 2018-06-26  Saam Barati  <sbarati@apple.com>
3187
3188         Switch to system malloc on iOS when nano malloc is disabled
3189         https://bugs.webkit.org/show_bug.cgi?id=186322
3190         <rdar://problem/41140257>
3191
3192         Reviewed by Keith Miller.
3193
3194         We have evidence showing that processes with small heaps using the
3195         JS API are more space efficient when using system malloc. Our main
3196         hypothesis as to why this is, is that when dealing with small heaps,
3197         one malloc can be more efficient at optimizing memory usage than
3198         two mallocs.
3199
3200         * bmalloc/BPlatform.h:
3201         * bmalloc/Environment.cpp:
3202         (bmalloc::isNanoMallocEnabled):
3203         (bmalloc::Environment::computeIsDebugHeapEnabled):
3204         * bmalloc/ProcessCheck.h:
3205         (bmalloc::shouldProcessUnconditionallyUseBmalloc):
3206         * bmalloc/ProcessCheck.mm:
3207         (bmalloc::shouldProcessUnconditionallyUseBmalloc):
3208
3209 2018-06-24  Yusuke Suzuki  <utatane.tea@gmail.com>
3210
3211         [bmalloc][Linux] Remove static initializers for PerProcess<>::s_object
3212         https://bugs.webkit.org/show_bug.cgi?id=186966
3213
3214         Reviewed by Anders Carlsson.
3215
3216         chrome/tools/linux/dump-static-initializers.py can dump static initializers
3217         in the binary and we found that PerProcess<>::s_object initialization is done
3218         by static initializers in GCC + Linux environments. The example is the following.
3219
3220         Scavenger.cpp (initializer offset 0x38c210 size 0x3e)
3221             _GLOBAL__sub_I_Scavenger.cpp+0x1e
3222             _GLOBAL__sub_I_Scavenger.cpp+0x2d
3223             _GLOBAL__sub_I_Scavenger.cpp+0x3c
3224             _GLOBAL__sub_I_Scavenger.cpp+0xf
3225             guard variable for bmalloc::PerProcess<bmalloc::AllIsoHeaps>::s_object@@Base-0x3f0d8
3226             guard variable for bmalloc::PerProcess<bmalloc::Environment>::s_object@@Base-0x3f0e8
3227             guard variable for bmalloc::PerProcess<bmalloc::PerHeapKind<bmalloc::Heap> >::s_object@@Base-0x3c600
3228             guard variable for bmalloc::PerProcess<bmalloc::Scavenger>::s_object@@Base-0x38ce8
3229
3230         We can remove this by initializing `nullptr`, which leads to constexpr initialization.
3231         After this change, Linux JSCOnly libJavaScriptCore.so has no static initializers.
3232
3233         * bmalloc/PerProcess.h:
3234
3235 2018-06-09  Dan Bernstein  <mitz@apple.com>
3236
3237         [Xcode] Clean up and modernize some build setting definitions
3238         https://bugs.webkit.org/show_bug.cgi?id=186463
3239
3240         Reviewed by Sam Weinig.
3241
3242         * Configurations/Base.xcconfig: Removed definition for macOS 10.11.
3243         * Configurations/DebugRelease.xcconfig: Ditto.
3244
3245 2018-06-07  Darin Adler  <darin@apple.com>
3246
3247         [Cocoa] Turn on ARC for the single Objective-C++ source file in bmalloc
3248         https://bugs.webkit.org/show_bug.cgi?id=186398
3249
3250         Reviewed by Saam Barati.
3251
3252         * Configurations/Base.xcconfig: Turn on ARC.
3253         * bmalloc/ProcessCheck.mm:
3254         (bmalloc::gigacageEnabledForProcess): Removed the globals from this function,
3255         since it's only called once. If it was called more than once, we could optimize
3256         that with a single boolean global rather than two strings and two booleans.
3257
3258 2018-06-07  David Kilzer  <ddkilzer@apple.com>
3259
3260         bmalloc: Fix 'noreturn' warnings when compiling with -std=gnu++17
3261         <https://webkit.org/b/186400>
3262
3263         Reviewed by Saam Barati.
3264
3265         Fixes the following warnings when compiling with gnu++17:
3266
3267             Source/bmalloc/bmalloc/Scavenger.cpp:363:1: error: function 'threadRunLoop' could be declared with attribute 'noreturn' [-Werror,-Wmissing-noreturn]
3268             {
3269             ^
3270             Source/bmalloc/bmalloc/Scavenger.cpp:358:1: error: function 'threadEntryPoint' could be declared with attribute 'noreturn' [-Werror,-Wmissing-noreturn]
3271             {
3272             ^
3273
3274         * bmalloc/BCompiler.h:
3275         (BCOMPILER): Add support for the BCOMPILER() macro, then add
3276         BCOMPILER(GCC_OR_CLANG).  Taken from Source/WTF/wtf/Compiler.h.
3277         (BNO_RETURN): Implement 'norerturn' support using the new
3278         BCOMPILER() macros.  Taken from Source/WTF/wtf/Compiler.h.
3279         * bmalloc/Scavenger.cpp:
3280         (bmalloc::Scavenger::threadRunLoop): Remove the workaround that
3281         tricked older compilers into thinking the while() loop wasn't
3282         infinite.
3283         * bmalloc/Scavenger.h:
3284         (bmalloc::Scavenger::threadEntryPoint): Add BNO_RETURN attribute.
3285         (bmalloc::Scavenger::threadRunLoop): Ditto.
3286
3287 2018-05-29  Saam Barati  <sbarati@apple.com>
3288
3289         JSC should put bmalloc's scavenger into mini mode
3290         https://bugs.webkit.org/show_bug.cgi?id=185988
3291
3292         Reviewed by Michael Saboff.
3293
3294         We expose an API for putting bmalloc into mini mode. All that means now
3295         is that we'll run the scavenger more aggressively.
3296
3297         * bmalloc/Scavenger.cpp:
3298         (bmalloc::Scavenger::enableMiniMode):
3299         (bmalloc::Scavenger::threadRunLoop):
3300         * bmalloc/Scavenger.h:
3301         * bmalloc/Sizes.h:
3302         * bmalloc/bmalloc.cpp:
3303         (bmalloc::api::enableMiniMode):
3304         * bmalloc/bmalloc.h:
3305
3306 2018-05-29  Geoffrey Garen  <ggaren@apple.com>
3307
3308         Fixed the bmalloc build
3309         https://bugs.webkit.org/show_bug.cgi?id=186025
3310
3311         Reviewed by Sam Weinig.
3312
3313         * bmalloc.xcodeproj/project.pbxproj: Link Foundation because the 
3314         gigacage check needs it.
3315
3316 2018-05-23  Antti Koivisto  <antti@apple.com>
3317
3318         Increase the simulated memory size on PLATFORM(IOS_SIMULATOR) from 512MB to 1024MB
3319         https://bugs.webkit.org/show_bug.cgi?id=185908
3320
3321         Reviewed by Geoffrey Garen.
3322
3323         We don't support 512MB devices anymore. This will make the simulator behave more
3324         like a real device.
3325
3326         * bmalloc/AvailableMemory.cpp:
3327         (bmalloc::memorySizeAccordingToKernel):
3328
3329         Factor to a function.
3330         Don't use availableMemoryGuess for the simulator value as it is not a guess.
3331
3332         (bmalloc::computeAvailableMemory):
3333
3334         Apply the same adjustments to the simulated value too.
3335
3336 2018-05-22  Ryan Haddad  <ryanhaddad@apple.com>
3337
3338         Unreviewed, rolling out r232052.
3339
3340         Breaks internal builds.
3341
3342         Reverted changeset:
3343
3344         "Use more C++17"
3345         https://bugs.webkit.org/show_bug.cgi?id=185176
3346         https://trac.webkit.org/changeset/232052
3347
3348 2018-05-22  Yusuke Suzuki  <utatane.tea@gmail.com>
3349
3350         Define GIGACAGE_ALLOCATION_CAN_FAIL on Linux
3351         https://bugs.webkit.org/show_bug.cgi?id=183329
3352
3353         Reviewed by Michael Catanzaro.
3354
3355         We specify `GIGACAGE_ALLOCATION_CAN_FAIL 1` in Linux since
3356         Linux can fail to `mmap` if `vm.overcommit_memory = 2`.
3357         Users can enable Gigacage if users enable overcommit_memory.
3358
3359         * bmalloc/Gigacage.h:
3360
3361 2018-05-21  Yusuke Suzuki  <utatane.tea@gmail.com>
3362
3363         Use more C++17
3364         https://bugs.webkit.org/show_bug.cgi?id=185176
3365
3366         Reviewed by JF Bastien.
3367
3368         Add BNO_RETURN.
3369
3370         * Configurations/Base.xcconfig:
3371         * bmalloc/BCompiler.h:
3372         * bmalloc/Scavenger.h:
3373
3374 2018-05-06  Yusuke Suzuki  <utatane.tea@gmail.com>
3375
3376         [JSC] Remove "using namespace std;" from JSC, bmalloc, WTF
3377         https://bugs.webkit.org/show_bug.cgi?id=185362
3378
3379         Reviewed by Sam Weinig.
3380
3381         * bmalloc/Allocator.cpp:
3382         * bmalloc/Deallocator.cpp:
3383
3384 2018-05-03  Filip Pizlo  <fpizlo@apple.com>
3385
3386         Strings should not be allocated in a gigacage
3387         https://bugs.webkit.org/show_bug.cgi?id=185218
3388
3389         Reviewed by Saam Barati.
3390         
3391         This removes the string gigacage.
3392         
3393         Putting strings in a gigacage prevents read gadgets. The other things that get to be in gigacages
3394         are there to prevent read-write gadgets.
3395         
3396         Also, putting strings in a gigacage seems to have been a bigger regression than putting other
3397         things in gigacages.
3398         
3399         Therefore, to maximize the benefit/cost ratio of gigacages, we should evict strings from them. If
3400         we want to throw away perf for security, there are more beneficial things to sacrifice.
3401
3402         * bmalloc/Gigacage.h:
3403         (Gigacage::name):
3404         (Gigacage::basePtr):
3405         (Gigacage::size):
3406         (Gigacage::forEachKind):
3407         * bmalloc/HeapKind.h:
3408         (bmalloc::isGigacage):
3409         (bmalloc::gigacageKind):
3410         (bmalloc::heapKind):
3411         (bmalloc::isActiveHeapKindAfterEnsuringGigacage):
3412         (bmalloc::mapToActiveHeapKindAfterEnsuringGigacage):
3413
3414 2018-04-30  Yusuke Suzuki  <utatane.tea@gmail.com>
3415
3416         Use WordLock instead of std::mutex for Threading
3417         https://bugs.webkit.org/show_bug.cgi?id=185121
3418
3419         Reviewed by Geoffrey Garen.
3420
3421         Add constexpr to explicitly describe that bmalloc::Mutex constructor is constexpr.
3422
3423         * bmalloc/Mutex.h:
3424
3425 2018-04-23  Ting-Wei Lan  <lantw44@gmail.com>
3426
3427         Include stdio.h before using stderr
3428         https://bugs.webkit.org/show_bug.cgi?id=184872
3429
3430         Reviewed by Yusuke Suzuki.
3431
3432         * bmalloc/PerProcess.cpp:
3433         * bmalloc/Scavenger.cpp:
3434
3435 2018-04-21  Yusuke Suzuki  <utatane.tea@gmail.com>
3436
3437         Unreviewed, follow-up patch after r230474
3438         https://bugs.webkit.org/show_bug.cgi?id=166684
3439
3440         Add "JavaScriptCore" to Darwin name. And use short name "BMScavenger"
3441         for Linux since adding "JavaScriptCore" makes the name too long for Linux.
3442
3443         * bmalloc/Scavenger.cpp:
3444         (bmalloc::Scavenger::threadRunLoop):
3445
3446 2018-04-18  Jer Noble  <jer.noble@apple.com>
3447
3448         Don't put build products into WK_ALTERNATE_WEBKIT_SDK_PATH for engineering builds
3449         https://bugs.webkit.org/show_bug.cgi?id=184762
3450
3451         Reviewed by Dan Bernstein.
3452
3453         * Configurations/Base.xcconfig:
3454
3455 2018-04-20  Daniel Bates  <dabates@apple.com>
3456
3457         Remove code for compilers that did not support NSDMI for aggregates
3458         https://bugs.webkit.org/show_bug.cgi?id=184599
3459
3460         Reviewed by Per Arne Vollan.
3461
3462         Remove workaround for earlier Visual Studio versions that did not support non-static data
3463         member initializers (NSDMI) for aggregates. We have since updated all the build.webkit.org
3464         and EWS bots to a newer version that supports this feature.
3465
3466         * bmalloc/BPlatform.h:
3467         * bmalloc/List.h:
3468         (bmalloc::ListNode::ListNode): Deleted.
3469         (bmalloc::List::iterator::iterator): Deleted.
3470
3471 2018-04-19  David Kilzer  <ddkilzer@apple.com>
3472
3473         Enable Objective-C weak references
3474         <https://webkit.org/b/184789>
3475         <rdar://problem/39571716>
3476
3477         Reviewed by Dan Bernstein.
3478
3479         * Configurations/Base.xcconfig:
3480         (CLANG_ENABLE_OBJC_WEAK): Enable.
3481
3482 2018-04-12  Saam Barati  <sbarati@apple.com>
3483
3484         Lessen partial scavenge interval on x86-64
3485         https://bugs.webkit.org/show_bug.cgi?id=184577
3486
3487         Rubber-stamped by Filip Pizlo.
3488
3489         I initially made the scavenge interval longer because I had thought the
3490         shorter interval caused a JetStream regression. I was mistaken though.
3491         I was looking at the wrong commit range when analyzing perf data.
3492