Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openj9
Path: blob/master/runtime/compiler/compile/J9AliasBuilder.cpp
6000 views
1
/*******************************************************************************
2
* Copyright (c) 2000, 2021 IBM Corp. and others
3
*
4
* This program and the accompanying materials are made available under
5
* the terms of the Eclipse Public License 2.0 which accompanies this
6
* distribution and is available at https://www.eclipse.org/legal/epl-2.0/
7
* or the Apache License, Version 2.0 which accompanies this distribution and
8
* is available at https://www.apache.org/licenses/LICENSE-2.0.
9
*
10
* This Source Code may also be made available under the following
11
* Secondary Licenses when the conditions for such availability set
12
* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU
13
* General Public License, version 2 with the GNU Classpath
14
* Exception [1] and GNU General Public License, version 2 with the
15
* OpenJDK Assembly Exception [2].
16
*
17
* [1] https://www.gnu.org/software/classpath/license.html
18
* [2] http://openjdk.java.net/legal/assembly-exception.html
19
*
20
* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 OR LicenseRef-GPL-2.0 WITH Assembly-exception
21
*******************************************************************************/
22
23
#include "compile/AliasBuilder.hpp"
24
#include "compile/Compilation.hpp"
25
#include "compile/SymbolReferenceTable.hpp"
26
#include "env/CompilerEnv.hpp"
27
#include "env/TRMemory.hpp"
28
#include "il/SymbolReference.hpp"
29
#include "il/Node.hpp"
30
#include "il/Node_inlines.hpp"
31
#include "il/ILOpCodes.hpp"
32
#include "infra/BitVector.hpp"
33
34
35
J9::AliasBuilder::AliasBuilder(TR::SymbolReferenceTable *symRefTab, size_t sizeHint, TR::Compilation *c) :
36
OMR::AliasBuilderConnector(symRefTab, sizeHint, c),
37
_userFieldSymRefNumbers(c->trMemory(), _numNonUserFieldClasses),
38
_tenantDataMetaSymRefs(sizeHint, c->trMemory(), heapAlloc, growable),
39
_callSiteTableEntrySymRefs(sizeHint, c->trMemory(), heapAlloc, growable),
40
_unresolvedShadowSymRefs(sizeHint, c->trMemory(), heapAlloc, growable),
41
_immutableConstructorDefAliases(c->trMemory(), _numImmutableClasses),
42
_methodTypeTableEntrySymRefs(sizeHint, c->trMemory(), heapAlloc, growable)
43
{
44
for (int32_t i = 0; i < _numNonUserFieldClasses; i++)
45
_userFieldSymRefNumbers[i] = new (trHeapMemory()) TR_BitVector(sizeHint, c->trMemory(), heapAlloc, growable);
46
}
47
48
49
TR_BitVector *
50
J9::AliasBuilder::methodAliases(TR::SymbolReference *symRef)
51
{
52
static bool newImmutableAlias = feGetEnv("TR_noNewImmutableAlias") == NULL;
53
static bool newUserFieldAlias = feGetEnv("TR_noNewUserFieldAlias") == NULL;
54
55
if (symRef->isUnresolved() || !newImmutableAlias || !symRefTab()->hasImmutable() || !newUserFieldAlias || !symRefTab()->hasUserField())
56
{
57
if (comp()->getOption(TR_TraceAliases))
58
traceMsg(comp(), "For method sym %d default aliases\n", symRef->getReferenceNumber());
59
return &defaultMethodDefAliases();
60
}
61
62
TR::ResolvedMethodSymbol *method = symRef->getSymbol()->castToResolvedMethodSymbol();
63
64
while (true)
65
{
66
int32_t id = symRefTab()->immutableConstructorId(method);
67
if (id >= 0)
68
return _immutableConstructorDefAliases[id];
69
70
id = symRefTab()->userFieldMethodId(method);
71
if (id >= 0)
72
{
73
if (comp()->getOption(TR_TraceAliases))
74
{
75
traceMsg(comp(), "For method sym %d aliases\n", symRef->getReferenceNumber());
76
_userFieldMethodDefAliases[id]->print(comp());
77
traceMsg(comp(), "\n");
78
}
79
return _userFieldMethodDefAliases[id];
80
}
81
82
if (symRef->isInitMethod())
83
{
84
TR_BitVector *result = NULL;
85
TR_BitVector *allocatedResult = NULL;
86
for (TR_OpaqueClassBlock *clazz = method->getResolvedMethod()->containingClass(); clazz; clazz = comp()->fe()->getSuperClass(clazz))
87
{
88
int32_t clazzNameLen;
89
char *clazzName = TR::Compiler->cls.classNameChars(comp(), clazz, clazzNameLen);
90
91
ListElement<TR_ImmutableInfo> *immutableClassInfoElem = symRefTab()->immutableInfo().getListHead();
92
while (immutableClassInfoElem)
93
{
94
TR_ImmutableInfo *immutableClassInfo = immutableClassInfoElem->getData();
95
int32_t immutableClassNameLen;
96
char *immutableClassName = TR::Compiler->cls.classNameChars(comp(), immutableClassInfo->_clazz, immutableClassNameLen);
97
if ((immutableClassNameLen == clazzNameLen) &&
98
!strncmp(immutableClassName, clazzName, clazzNameLen))
99
{
100
TR_BitVector *symrefsToInclude = immutableClassInfo->_immutableConstructorDefAliases;
101
if (comp()->getOption(TR_TraceAliases))
102
{
103
traceMsg(comp(), "Method sym %d includes aliases for %.*s.<init>\n", symRef->getReferenceNumber(), clazzNameLen, clazzName);
104
symrefsToInclude->print(comp());
105
traceMsg(comp(), "\n");
106
}
107
if (allocatedResult)
108
*allocatedResult |= *symrefsToInclude;
109
else if (result)
110
{
111
allocatedResult = new (comp()->trHeapMemory()) TR_BitVector(symRefTab()->getNumSymRefs(), comp()->trMemory(), heapAlloc, growable);
112
*allocatedResult = *result;
113
*allocatedResult |= *symrefsToInclude;
114
result = allocatedResult;
115
}
116
else
117
result = symrefsToInclude;
118
}
119
immutableClassInfoElem = immutableClassInfoElem->getNextElement();
120
}
121
}
122
if (result)
123
return result;
124
}
125
126
method = symRef->getOwningMethodSymbol(_compilation);
127
mcount_t method_index = ((TR::ResolvedMethodSymbol *)method)->getResolvedMethodIndex();
128
if (method_index == JITTED_METHOD_INDEX)
129
break;
130
131
// get symbol reference for the owning method
132
symRef = _compilation->getResolvedMethodSymbolReference(method_index);
133
if (!symRef)
134
break;
135
}
136
137
if (comp()->getOption(TR_TraceAliases))
138
{
139
traceMsg(comp(), "For method sym %d default aliases without immutable\n", symRef->getReferenceNumber());
140
defaultMethodDefAliasesWithoutImmutable().print(comp());
141
traceMsg(comp(), "\n");
142
}
143
144
return &defaultMethodDefAliasesWithoutImmutable();
145
146
}
147
148
149
void
150
J9::AliasBuilder::createAliasInfo()
151
{
152
TR::StackMemoryRegion stackMemoryRegion(*trMemory());
153
self()->unresolvedShadowSymRefs().pack();
154
addressShadowSymRefs().pack();
155
genericIntShadowSymRefs().pack();
156
genericIntArrayShadowSymRefs().pack();
157
genericIntNonArrayShadowSymRefs().pack();
158
intShadowSymRefs().pack();
159
nonIntPrimitiveShadowSymRefs().pack();
160
addressStaticSymRefs().pack();
161
intStaticSymRefs().pack();
162
nonIntPrimitiveStaticSymRefs().pack();
163
methodSymRefs().pack();
164
unsafeSymRefNumbers().pack();
165
unsafeArrayElementSymRefs().pack();
166
gcSafePointSymRefNumbers().pack();
167
168
self()->tenantDataMetaSymRefs().pack();
169
170
int32_t i;
171
172
for (i = 0; i < _numImmutableClasses; i++)
173
{
174
symRefTab()->immutableSymRefNumbers()[i]->pack();
175
}
176
177
ListElement<TR_ImmutableInfo> *immutableClassInfoElem = symRefTab()->immutableInfo().getListHead();
178
while (immutableClassInfoElem)
179
{
180
TR_ImmutableInfo *immutableClassInfo = immutableClassInfoElem->getData();
181
immutableClassInfo->_immutableSymRefNumbers->pack();
182
immutableClassInfoElem = immutableClassInfoElem->getNextElement();
183
}
184
185
for (i = 0; i < _numNonUserFieldClasses; i++)
186
{
187
self()->userFieldSymRefNumbers()[i]->pack();
188
}
189
190
setCatchLocalUseSymRefs();
191
192
defaultMethodDefAliases().init(symRefTab()->getNumSymRefs(), comp()->trMemory(), heapAlloc, growable);
193
defaultMethodDefAliases() |= addressShadowSymRefs();
194
defaultMethodDefAliases() |= intShadowSymRefs();
195
defaultMethodDefAliases() |= nonIntPrimitiveShadowSymRefs();
196
defaultMethodDefAliases() |= arrayElementSymRefs();
197
defaultMethodDefAliases() |= arrayletElementSymRefs();
198
defaultMethodDefAliases() |= addressStaticSymRefs();
199
defaultMethodDefAliases() |= intStaticSymRefs();
200
defaultMethodDefAliases() |= nonIntPrimitiveStaticSymRefs();
201
defaultMethodDefAliases() |= unsafeSymRefNumbers();
202
defaultMethodDefAliases() |= gcSafePointSymRefNumbers();
203
204
defaultMethodDefAliases() |= self()->tenantDataMetaSymRefs();
205
206
defaultMethodDefAliasesWithoutImmutable().init(symRefTab()->getNumSymRefs(), comp()->trMemory(), heapAlloc, growable);
207
defaultMethodDefAliasesWithoutUserField().init(symRefTab()->getNumSymRefs(), comp()->trMemory(), heapAlloc, growable);
208
209
defaultMethodDefAliasesWithoutUserField() |= defaultMethodDefAliases();
210
211
for (i = 0; i < _numNonUserFieldClasses; i++)
212
{
213
defaultMethodDefAliasesWithoutUserField() -= *(self()->userFieldSymRefNumbers()[i]);
214
}
215
216
defaultMethodDefAliasesWithoutImmutable() |= defaultMethodDefAliases();
217
218
for (i = 0; i < _numImmutableClasses; i++)
219
{
220
defaultMethodDefAliasesWithoutImmutable() -= *(symRefTab()->immutableSymRefNumbers()[i]);
221
}
222
223
immutableClassInfoElem = symRefTab()->immutableInfo().getListHead();
224
while (immutableClassInfoElem)
225
{
226
TR_ImmutableInfo *immutableClassInfo = immutableClassInfoElem->getData();
227
defaultMethodDefAliasesWithoutImmutable() -= *(immutableClassInfo->_immutableSymRefNumbers);
228
immutableClassInfoElem = immutableClassInfoElem->getNextElement();
229
}
230
231
for (i = 0; i < _numImmutableClasses; i++)
232
{
233
immutableConstructorDefAliases()[i] = new (trHeapMemory()) TR_BitVector(symRefTab()->getNumSymRefs(), comp()->trMemory(), heapAlloc, growable);
234
*(immutableConstructorDefAliases()[i]) = defaultMethodDefAliasesWithoutImmutable();
235
*(immutableConstructorDefAliases()[i]) |= *(symRefTab()->immutableSymRefNumbers()[i]);
236
}
237
238
for (i = 0; i < _numNonUserFieldClasses; i++)
239
{
240
userFieldMethodDefAliases()[i] = new (trHeapMemory()) TR_BitVector(symRefTab()->getNumSymRefs(), comp()->trMemory(), heapAlloc, growable);
241
*(userFieldMethodDefAliases()[i]) = defaultMethodDefAliasesWithoutUserField();
242
}
243
244
immutableClassInfoElem = symRefTab()->immutableInfo().getListHead();
245
while (immutableClassInfoElem)
246
{
247
TR_ImmutableInfo *immutableClassInfo = immutableClassInfoElem->getData();
248
immutableClassInfo->_immutableConstructorDefAliases = new (trHeapMemory()) TR_BitVector(symRefTab()->getNumSymRefs(), comp()->trMemory(), heapAlloc, growable);
249
*(immutableClassInfo->_immutableConstructorDefAliases) = defaultMethodDefAliasesWithoutImmutable();
250
*(immutableClassInfo->_immutableConstructorDefAliases) |= *(immutableClassInfo->_immutableSymRefNumbers);
251
immutableClassInfoElem = immutableClassInfoElem->getNextElement();
252
}
253
254
defaultMethodUseAliases().init(symRefTab()->getNumSymRefs(), comp()->trMemory(), heapAlloc, growable);
255
defaultMethodUseAliases() |= defaultMethodDefAliases();
256
defaultMethodUseAliases() |= catchLocalUseSymRefs();
257
258
if (symRefTab()->element(TR::SymbolReferenceTable::contiguousArraySizeSymbol))
259
defaultMethodUseAliases().set(symRefTab()->element(TR::SymbolReferenceTable::contiguousArraySizeSymbol)->getReferenceNumber());
260
if (symRefTab()->element(TR::SymbolReferenceTable::discontiguousArraySizeSymbol))
261
defaultMethodUseAliases().set(symRefTab()->element(TR::SymbolReferenceTable::discontiguousArraySizeSymbol)->getReferenceNumber());
262
if (symRefTab()->element(TR::SymbolReferenceTable::vftSymbol))
263
defaultMethodUseAliases().set(symRefTab()->element(TR::SymbolReferenceTable::vftSymbol)->getReferenceNumber());
264
265
methodsThatMayThrow().init(symRefTab()->getNumSymRefs(), comp()->trMemory(), heapAlloc, growable);
266
methodsThatMayThrow() |= methodSymRefs();
267
268
static TR_RuntimeHelper helpersThatMayThrow[] =
269
{
270
TR_typeCheckArrayStore,
271
TR_arrayStoreException,
272
TR_arrayBoundsCheck,
273
TR_checkCast,
274
TR_checkCastForArrayStore,
275
TR_divCheck,
276
TR_aThrow,
277
TR_aNewArray,
278
TR_monitorExit,
279
TR_newObject,
280
TR_newObjectNoZeroInit,
281
TR_acmpeqHelper,
282
TR_acmpneHelper,
283
TR_newValue,
284
TR_newValueNoZeroInit,
285
TR_newArray,
286
TR_nullCheck,
287
TR_methodTypeCheck,
288
TR_incompatibleReceiver,
289
TR_IncompatibleClassChangeError,
290
TR_multiANewArray
291
};
292
293
for (i = 0; i < (sizeof(helpersThatMayThrow) / 4); ++i)
294
if (symRefTab()->element(helpersThatMayThrow[i]))
295
methodsThatMayThrow().set(helpersThatMayThrow[i]);
296
297
static TR::SymbolReferenceTable::CommonNonhelperSymbol nonhelpersThatMayThrow[] =
298
{
299
TR::SymbolReferenceTable::resolveCheckSymbol
300
};
301
302
for (i = 0; i < (sizeof(nonhelpersThatMayThrow) / 4); ++i)
303
if (symRefTab()->element(helpersThatMayThrow[i]))
304
methodsThatMayThrow().set(symRefTab()->getNumHelperSymbols() + nonhelpersThatMayThrow[i]);
305
306
for (CallAliases * callAliases = _callAliases.getFirst(); callAliases; callAliases = callAliases->getNext())
307
callAliases->_methodSymbol->setHasVeryRefinedAliasSets(false);
308
_callAliases.setFirst(0);
309
310
if (comp()->getOption(TR_TraceAliases))
311
{
312
comp()->getDebug()->printAliasInfo(comp()->getOutFile(), symRefTab());
313
}
314
315
}
316
317