FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
WebKit/Source/JavaScriptCore/b3/air/AirStackAllocation.cpp at main · WebKit/WebKit · GitHub
Uh oh!
There was an error while loading.
Please reload this page
.
WebKit
/
WebKit
Public
Notifications
You must be signed in to change notification settings
Fork
2.1k
Star
10.1k
Code
Pull requests
2.6k
Actions
Wiki
Security and quality
0
Insights
Additional navigation options
Code
Pull requests
Actions
Wiki
Security and quality
Insights
Expand file tree
Breadcrumbs
WebKit
/
Source
/
JavaScriptCore
/
b3
/
air
/
AirStackAllocation.cpp
Copy path
More file actions
More file actions
Latest commit
History
History
History
126 lines (108 loc) · 5.16 KB
Breadcrumbs
WebKit
/
Source
/
JavaScriptCore
/
b3
/
air
/
AirStackAllocation.cpp
Copy path
File metadata and controls
126 lines (108 loc) · 5.16 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/*
* Copyright (C) 2017-2019 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#
include
"
config.h
"
#
include
"
AirStackAllocation.h
"
#
if
ENABLE(B3_JIT)
#
include
"
AirCode.h
"
#
include
"
StackAlignment.h
"
#
include
<
wtf/ListDump.h
>
namespace
JSC
{
namespace
B3
{
namespace
Air
{
namespace
{
namespace
AirStackAllocationInternal
{
static
constexpr
bool
verbose =
false
;
}
template
<
typename
Collection>
void
updateFrameSizeBasedOnStackSlotsImpl
(Code& code,
const
Collection& collection)
{
unsigned
frameSize =
0
;
for
(StackSlot* slot : collection)
frameSize =
std::max
(frameSize,
static_cast
<
unsigned
>(-slot->
offsetFromFP
()));
code.
setFrameSize
(
WTF
::roundUpToMultipleOf<
stackAlignmentBytes
()>(frameSize) +
stackAdjustmentForAlignment
());
}
}
//
anonymous namespace
void
assign
(StackSlot* slot,
const
Vector<StackSlot*>& otherSlots)
{
dataLogLnIf
(AirStackAllocationInternal::verbose,
"
Attempting to assign
"
,
pointerDump
(slot),
"
with interference
"
,
pointerListDump
(otherSlots));
//
Start candidate at the top of the frame and push it down past any overlapping slot.
intptr_t
offsetFromFP = -
static_cast
<
intptr_t
>(slot->
byteSize
());
offsetFromFP = -
WTF::roundUpToMultipleOf
(slot->
alignment
(), -offsetFromFP);
intptr_t
prevOffset =
0
;
for
(StackSlot* otherSlot : otherSlots) {
ASSERT
(otherSlot->
offsetFromFP
() <
0
);
ASSERT_UNUSED
(prevOffset, otherSlot->
offsetFromFP
() <= prevOffset);
prevOffset = otherSlot->
offsetFromFP
();
bool
overlap =
WTF::rangesOverlap
(
offsetFromFP,
offsetFromFP +
static_cast
<
intptr_t
>(slot->
byteSize
()),
otherSlot->
offsetFromFP
(),
otherSlot->
offsetFromFP
() +
static_cast
<
intptr_t
>(otherSlot->
byteSize
()));
if
(overlap) {
offsetFromFP = otherSlot->
offsetFromFP
() -
static_cast
<
intptr_t
>(slot->
byteSize
());
offsetFromFP = -
WTF::roundUpToMultipleOf
(slot->
alignment
(), -offsetFromFP);
}
}
dataLogLnIf
(AirStackAllocationInternal::verbose,
"
Assigned
"
,
pointerDump
(slot),
"
to
"
, offsetFromFP);
slot->
setOffsetFromFP
(offsetFromFP);
}
Vector<StackSlot*>
allocateAndGetEscapedStackSlotsWithoutChangingFrameSize
(Code& code)
{
//
Allocate all of the escaped slots in order. This is kind of a crazy algorithm to allow for
//
the possibility of stack slots being assigned frame offsets before we even get here.
RELEASE_ASSERT
(code.
frameSize
() ==
stackAdjustmentForAlignment
());
Vector<StackSlot*> assignedEscapedStackSlots;
Vector<StackSlot*> escapedStackSlotsWorklist;
for
(StackSlot* slot : code.
stackSlots
()) {
if
(slot->
isLocked
()) {
if
(slot->
offsetFromFP
())
assignedEscapedStackSlots.
append
(slot);
else
escapedStackSlotsWorklist.
append
(slot);
}
else
{
//
It would be super strange to have an unlocked stack slot that has an offset already.
ASSERT
(!slot->
offsetFromFP
());
}
}
std::ranges::sort
(assignedEscapedStackSlots, std::ranges::greater { }, &StackSlot::offsetFromFP);
//
This is a fairly expensive loop, but it's OK because we'll usually only have a handful of
//
escaped stack slots.
while
(!escapedStackSlotsWorklist.
isEmpty
()) {
StackSlot* slot = escapedStackSlotsWorklist.
takeLast
();
assign
(slot, assignedEscapedStackSlots);
auto
it =
std::ranges::upper_bound
(assignedEscapedStackSlots, slot->
offsetFromFP
(), std::ranges::greater { }, &StackSlot::offsetFromFP);
assignedEscapedStackSlots.
insert
(it - assignedEscapedStackSlots.
begin
(), slot);
}
return
assignedEscapedStackSlots;
}
void
allocateEscapedStackSlots
(Code& code)
{
updateFrameSizeBasedOnStackSlotsImpl
(
code,
allocateAndGetEscapedStackSlotsWithoutChangingFrameSize
(code));
}
void
updateFrameSizeBasedOnStackSlots
(Code& code)
{
updateFrameSizeBasedOnStackSlotsImpl
(code, code.
stackSlots
());
}
} } }
//
namespace JSC::B3::Air
#
endif
//
ENABLE(B3_JIT)
Back
|
FazBrowse Home
|
New Git URL