Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openj9
Path: blob/master/runtime/compiler/il/J9Symbol.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
/**************************************************************************
24
Testarossa JIT Codegen
25
26
File name: Symbol.cpp
27
Attributes: Platform independent, IL interface
28
Purpose: Implementation of the:
29
Symbol class
30
31
**************************************************************************/
32
33
#include <stddef.h>
34
#include <stdint.h>
35
#include <string.h>
36
#include "env/FrontEnd.hpp"
37
#include "compile/Compilation.hpp"
38
#include "compile/SymbolReferenceTable.hpp"
39
#include "env/TRMemory.hpp"
40
#include "env/VMJ9.h"
41
#include "il/DataTypes.hpp"
42
#include "il/StaticSymbol.hpp"
43
#include "il/StaticSymbol_inlines.hpp"
44
#include "il/Symbol.hpp"
45
#include "il/SymbolReference.hpp"
46
#include "infra/Assert.hpp"
47
#include "infra/Flags.hpp"
48
#include "ras/Debug.hpp"
49
50
struct F
51
{
52
TR::Symbol::RecognizedField id;
53
// split "<class>.<field> <signature>"
54
const char *classStr; // "<class>"
55
uint16_t classLen;
56
const char *fieldStr; // "<field>"
57
uint16_t fieldLen;
58
const char *sigStr; // "<signature>"
59
uint16_t sigLen;
60
};
61
#define r(id, c, f, s) id, c, sizeof(c)-1, f, sizeof(f)-1, s, sizeof(s)-1
62
63
/*
64
* These recognized fields start with 'c' (like "com/...") as class name.
65
*/
66
static F recognizedFieldName_c[] =
67
{
68
{r(TR::Symbol::Com_ibm_gpu_Kernel_blockIdxX, "com/ibm/gpu/Kernel", "blockIdxX", "I")},
69
{r(TR::Symbol::Com_ibm_gpu_Kernel_blockIdxY, "com/ibm/gpu/Kernel", "blockIdxY", "I")},
70
{r(TR::Symbol::Com_ibm_gpu_Kernel_blockIdxZ, "com/ibm/gpu/Kernel", "blockIdxZ", "I")},
71
{r(TR::Symbol::Com_ibm_gpu_Kernel_blockDimX, "com/ibm/gpu/Kernel", "blockDimX", "I")},
72
{r(TR::Symbol::Com_ibm_gpu_Kernel_blockDimY, "com/ibm/gpu/Kernel", "blockDimY", "I")},
73
{r(TR::Symbol::Com_ibm_gpu_Kernel_blockDimZ, "com/ibm/gpu/Kernel", "blockDimZ", "I")},
74
{r(TR::Symbol::Com_ibm_gpu_Kernel_threadIdxX, "com/ibm/gpu/Kernel", "threadIdxX", "I")},
75
{r(TR::Symbol::Com_ibm_gpu_Kernel_threadIdxY, "com/ibm/gpu/Kernel", "threadIdxY", "I")},
76
{r(TR::Symbol::Com_ibm_gpu_Kernel_threadIdxZ, "com/ibm/gpu/Kernel", "threadIdxZ", "I")},
77
{r(TR::Symbol::Com_ibm_gpu_Kernel_syncThreads, "com/ibm/gpu/Kernel", "syncThreads", "I")},
78
79
{r(TR::Symbol::Com_ibm_jit_JITHelpers_IS_32_BIT, "com/ibm/jit/JITHelpers", "IS_32_BIT", "Z")}, //22
80
{r(TR::Symbol::Com_ibm_jit_JITHelpers_J9OBJECT_J9CLASS_OFFSET, "com/ibm/jit/JITHelpers", "J9OBJECT_J9CLASS_OFFSET", "I")}, //22
81
{r(TR::Symbol::Com_ibm_jit_JITHelpers_J9OBJECT_FLAGS_MASK32, "com/ibm/jit/JITHelpers", "J9OBJECT_FLAGS_MASK32", "I")}, //22
82
{r(TR::Symbol::Com_ibm_jit_JITHelpers_J9OBJECT_FLAGS_MASK64, "com/ibm/jit/JITHelpers", "J9OBJECT_FLAGS_MASK64", "I")}, //22
83
{r(TR::Symbol::Com_ibm_jit_JITHelpers_JLTHREAD_J9THREAD_OFFSET, "com/ibm/jit/JITHelpers", "JLTHREAD_J9THREAD_OFFSET", "I")}, //22
84
{r(TR::Symbol::Com_ibm_jit_JITHelpers_J9THREAD_J9VM_OFFSET, "com/ibm/jit/JITHelpers", "J9THREAD_J9VM_OFFSET", "I")}, //22
85
{r(TR::Symbol::Com_ibm_jit_JITHelpers_J9_GC_OBJECT_ALIGNMENT_SHIFT, "com/ibm/jit/JITHelpers", "J9_GC_OBJECT_ALIGNMENT_SHIFT", "I")}, //22
86
{r(TR::Symbol::Com_ibm_jit_JITHelpers_J9ROMARRAYCLASS_ARRAYSHAPE_OFFSET, "com/ibm/jit/JITHelpers", "J9ROMARRAYCLASS_ARRAYSHAPE_OFFSET", "I")}, //22
87
{r(TR::Symbol::Com_ibm_jit_JITHelpers_J9CLASS_BACKFILL_OFFSET_OFFSET, "com/ibm/jit/JITHelpers", "J9CLASS_BACKFILL_OFFSET_OFFSET", "I")}, //22
88
{r(TR::Symbol::Com_ibm_jit_JITHelpers_ARRAYSHAPE_ELEMENTCOUNT_MASK, "com/ibm/jit/JITHelpers", "ARRAYSHAPE_ELEMENTCOUNT_MASK", "I")}, //22
89
{r(TR::Symbol::Com_ibm_jit_JITHelpers_J9CONTIGUOUSARRAY_HEADER_SIZE, "com/ibm/jit/JITHelpers", "J9CONTIGUOUSARRAY_HEADER_SIZE", "I")}, //22
90
{r(TR::Symbol::Com_ibm_jit_JITHelpers_J9DISCONTIGUOUSARRAY_HEADER_SIZE, "com/ibm/jit/JITHelpers", "J9DISCONTIGUOUSARRAY_HEADER_SIZE", "I")}, //22
91
{r(TR::Symbol::Com_ibm_jit_JITHelpers_J9OBJECT_CONTIGUOUS_LENGTH_OFFSET, "com/ibm/jit/JITHelpers", "J9OBJECT_CONTIGUOUS_LENGTH_OFFSET", "I")}, //22
92
{r(TR::Symbol::Com_ibm_jit_JITHelpers_J9OBJECT_DISCONTIGUOUS_LENGTH_OFFSET, "com/ibm/jit/JITHelpers", "J9OBJECT_DISCONTIGUOUS_LENGTH_OFFSET", "I")}, //22
93
{r(TR::Symbol::Com_ibm_jit_JITHelpers_JLOBJECT_ARRAY_BASE_OFFSET, "com/ibm/jit/JITHelpers", "JLOBJECT_ARRAY_BASE_OFFSET", "I")}, //22
94
{r(TR::Symbol::Com_ibm_jit_JITHelpers_J9CLASS_J9ROMCLASS_OFFSET, "com/ibm/jit/JITHelpers", "J9CLASS_J9ROMCLASS_OFFSET", "I")}, //22
95
{r(TR::Symbol::Com_ibm_jit_JITHelpers_J9JAVAVM_IDENTITY_HASH_DATA_OFFSET, "com/ibm/jit/JITHelpers", "J9JAVAVM_IDENTITY_HASH_DATA_OFFSET","I")},
96
{r(TR::Symbol::Com_ibm_jit_JITHelpers_J9IDENTITYHASHDATA_HASH_DATA1_OFFSET,"com/ibm/jit/JITHelpers", "J9IDENTITYHASHDATA_HASH_DATA1_OFFSET", "I")},
97
{r(TR::Symbol::Com_ibm_jit_JITHelpers_J9IDENTITYHASHDATA_HASH_DATA2_OFFSET,"com/ibm/jit/JITHelpers", "J9IDENTITYHASHDATA_HASH_DATA2_OFFSET", "I")},
98
{r(TR::Symbol::Com_ibm_jit_JITHelpers_J9IDENTITYHASHDATA_HASH_DATA3_OFFSET,"com/ibm/jit/JITHelpers", "J9IDENTITYHASHDATA_HASH_DATA3_OFFSET", "I")},
99
{r(TR::Symbol::Com_ibm_jit_JITHelpers_J9IDENTITYHASHDATA_HASH_SALT_TABLE_OFFSET,"com/ibm/jit/JITHelpers","J9IDENTITYHASHDATA_HASH_SALT_TABLE_OFFSET", "I")},
100
{r(TR::Symbol::Com_ibm_jit_JITHelpers_J9_IDENTITY_HASH_SALT_POLICY_STANDARD,"com/ibm/jit/JITHelpers","J9_IDENTITY_HASH_SALT_POLICY_STANDARD", "I")},
101
{r(TR::Symbol::Com_ibm_jit_JITHelpers_J9_IDENTITY_HASH_SALT_POLICY_REGION,"com/ibm/jit/JITHelpers","J9_IDENTITY_HASH_SALT_POLICY_REGION", "I")},
102
{r(TR::Symbol::Com_ibm_jit_JITHelpers_J9_IDENTITY_HASH_SALT_POLICY_NONE,"com/ibm/jit/JITHelpers","J9_IDENTITY_HASH_SALT_POLICY_NONE", "I")},
103
{r(TR::Symbol::Com_ibm_jit_JITHelpers_IDENTITY_HASH_SALT_POLICY,"com/ibm/jit/JITHelpers","IDENTITY_HASH_SALT_POLICY", "I")},
104
{r(TR::Symbol::Com_ibm_oti_vm_VM_J9CLASS_CLASS_FLAGS_OFFSET,"com/ibm/oti/vm/VM","J9CLASS_CLASS_FLAGS_OFFSET", "I")},
105
{r(TR::Symbol::Com_ibm_oti_vm_VM_J9CLASS_INITIALIZE_STATUS_OFFSET,"com/ibm/oti/vm/VM","J9CLASS_INITIALIZE_STATUS_OFFSET", "I")},
106
{r(TR::Symbol::Com_ibm_oti_vm_VM_J9_JAVA_CLASS_RAM_SHAPE_SHIFT,"com/ibm/oti/vm/VM","J9AccClassRAMShapeShift", "I")},
107
{r(TR::Symbol::Com_ibm_oti_vm_VM_OBJECT_HEADER_SHAPE_MASK,"com/ibm/oti/vm/VM","OBJECT_HEADER_SHAPE_MASK", "I")},
108
{r(TR::Symbol::Com_ibm_oti_vm_VM_ADDRESS_SIZE,"com/ibm/oti/vm/VM","ADDRESS_SIZE", "I")},
109
{TR::Symbol::UnknownField}
110
};
111
112
/*
113
* These recognized fields start with 'j' (like "java/...") as class name.
114
*/
115
static F recognizedFieldName_j[] =
116
{
117
/*
118
* NOTE: If you add a new class here, make sure its length is within
119
* minClassLength and maxClassLength of the corresponding FP struct.
120
*
121
* r(<enum>, "<class>" ,"<field>", "<sig>")
122
*/
123
{r(TR::Symbol::Java_io_ByteArrayOutputStream_count, "java/io/ByteArrayOutputStream", "count", "I")},
124
{r(TR::Symbol::Java_lang_J9VMInternals_jitHelpers, "java/lang/J9VMInternals", "jitHelpers", "Lcom/ibm/jit/JITHelpers;")},
125
{r(TR::Symbol::Java_lang_String_count, "java/lang/String", "count", "I")},
126
{r(TR::Symbol::Java_lang_String_enableCompression, "java/lang/String", "COMPACT_STRINGS", "Z") },
127
{r(TR::Symbol::Java_lang_String_hashCode, "java/lang/String", "hash", "I")},
128
{r(TR::Symbol::Java_lang_String_value, "java/lang/String", "value", "[B")},
129
{r(TR::Symbol::Java_lang_String_value, "java/lang/String", "value", "[C")},
130
{r(TR::Symbol::Java_lang_StringBuffer_count, "java/lang/StringBuffer", "count", "I")},
131
{r(TR::Symbol::Java_lang_StringBuffer_value, "java/lang/StringBuffer", "value", "[B")},
132
{r(TR::Symbol::Java_lang_StringBuffer_value, "java/lang/StringBuffer", "value", "[C")},
133
{r(TR::Symbol::Java_lang_StringBuilder_count, "java/lang/StringBuilder", "count", "I")},
134
{r(TR::Symbol::Java_lang_StringBuilder_value, "java/lang/StringBuilder", "value", "[B")},
135
{r(TR::Symbol::Java_lang_StringBuilder_value, "java/lang/StringBuilder", "value", "[C")},
136
{r(TR::Symbol::Java_lang_Throwable_stackTrace, "java/lang/Throwable", "stackTrace", "[Ljava/lang/StackTraceElement;")},
137
{r(TR::Symbol::Java_lang_invoke_BruteArgumentMoverHandle_extra,"java/lang/invoke/BruteArgumentMoverHandle", "extra", "[Ljava/lang/Object;")},
138
{r(TR::Symbol::Java_lang_invoke_DynamicInvokerHandle_site, "java/lang/invoke/DynamicInvokerHandle", "site", "Ljava/lang/invoke/CallSite;")},
139
{r(TR::Symbol::Java_lang_invoke_CallSite_target, "java/lang/invoke/CallSite", "target", "Ljava/lang/invoke/MethodHandle;")},
140
{r(TR::Symbol::Java_lang_invoke_LambdaForm_vmentry, "java/lang/invoke/LambdaForm", "vmentry", "Ljava/lang/invoke/MemberName;")},
141
{r(TR::Symbol::Java_lang_invoke_MutableCallSite_target, "java/lang/invoke/MutableCallSite", "target", "Ljava/lang/invoke/MethodHandle;")},
142
{r(TR::Symbol::Java_lang_invoke_MutableCallSiteDynamicInvokerHandle_mutableSite,"java/lang/invoke/MutableCallSiteDynamicInvokerHandle", "mutableSite", "Ljava/lang/invoke/MutableCallSite;")},
143
{r(TR::Symbol::Java_lang_invoke_MemberName_vmtarget, "java/lang/invoke/MemberName", "vmtarget", "J")},
144
{r(TR::Symbol::Java_lang_invoke_MemberName_vmindex, "java/lang/invoke/MemberName", "vmindex", "J")},
145
{r(TR::Symbol::Java_lang_invoke_MethodHandle_form, "java/lang/invoke/MethodHandle", "form", "Ljava/lang/invoke/LambdaForm;")},
146
{r(TR::Symbol::Java_lang_invoke_MethodHandle_thunks, "java/lang/invoke/MethodHandle", "thunks", "Ljava/lang/invoke/ThunkTuple;")},
147
{r(TR::Symbol::Java_lang_invoke_MethodHandle_type, "java/lang/invoke/MethodHandle", "type", "Ljava/lang/invoke/MethodType;")},
148
{r(TR::Symbol::Java_lang_invoke_MethodType_ptypes, "java/lang/invoke/MethodType", "ptypes", "[Ljava/lang/Class;")},
149
{r(TR::Symbol::Java_lang_invoke_PrimitiveHandle_rawModifiers, "java/lang/invoke/PrimitiveHandle", "rawModifiers", "I")},
150
{r(TR::Symbol::Java_lang_invoke_PrimitiveHandle_defc, "java/lang/invoke/PrimitiveHandle", "defc", "Ljava/lang/Class;")},
151
{r(TR::Symbol::Java_lang_invoke_ThunkTuple_invokeExactThunk, "java/lang/invoke/ThunkTuple", "invokeExactThunk", "J")},
152
{r(TR::Symbol::Java_util_Hashtable_elementCount, "java/util/Hashtable", "count", "I")},
153
{r(TR::Symbol::Java_math_BigInteger_ZERO, "java/math/BigInteger", "ZERO", "Ljava/math/BigInteger;")},
154
{r(TR::Symbol::Java_math_BigInteger_useLongRepresentation, "java/math/BigInteger", "useLongRepresentation", "Z")},
155
{r(TR::Symbol::Java_lang_ref_SoftReference_age, "java/lang/ref/SoftReference", "age", "I")},
156
{r(TR::Symbol::Java_lang_invoke_VarHandle_handleTable, "java/lang/invoke/VarHandle", "handleTable", "[Ljava/lang/invoke/MethodHandle;")},
157
{r(TR::Symbol::Java_lang_invoke_MethodHandleImpl_LoopClauses_clauses, "java/lang/invoke/MethodHandleImpl$LoopClauses", "clauses", "[[Ljava/lang/invoke/MethodHandle;")},
158
{r(TR::Symbol::Java_lang_Integer_value, "java/lang/Integer", "value", "I")},
159
{r(TR::Symbol::Java_lang_Long_value, "java/lang/Long", "value", "J")},
160
{r(TR::Symbol::Java_lang_Float_value, "java/lang/Float", "value", "F")},
161
{r(TR::Symbol::Java_lang_Double_value, "java/lang/Double", "value", "D")},
162
{r(TR::Symbol::Java_lang_Byte_value, "java/lang/Byte", "value", "B")},
163
{r(TR::Symbol::Java_lang_Character_value, "java/lang/Character", "value", "C")},
164
{r(TR::Symbol::Java_lang_Short_value, "java/lang/Short", "value", "S")},
165
{r(TR::Symbol::Java_lang_Boolean_value, "java/lang/Boolean", "value", "Z")},
166
{r(TR::Symbol::Java_lang_Class_enumVars, "java/lang/Class", "enumVars", "Ljava/lang/Class$EnumVars;")},
167
{r(TR::Symbol::Java_lang_ClassEnumVars_cachedEnumConstants, "java/lang/Class$EnumVars", "cachedEnumConstants", "[Ljava/lang/Object;")},
168
{TR::Symbol::UnknownField}
169
};
170
171
TR::Symbol::RecognizedField
172
J9::Symbol::searchRecognizedField(TR::Compilation * comp, TR_ResolvedMethod * owningMethod, int32_t cpIndex, bool isStatic)
173
{
174
struct FP
175
{
176
struct F *fieldInfo;
177
uint16_t minClassLength;
178
uint16_t maxClassLength;
179
};
180
static FP fieldPrefixTable[] =
181
{
182
/*
183
* List is sorted by class name prefix
184
* The first prefix is 'c'
185
*/
186
{recognizedFieldName_c, 17, 22},
187
{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},
188
{recognizedFieldName_j, 14, 52}
189
};
190
191
const char minClassPrefix = 'c';
192
const char maxClassPrefix = 'j';
193
194
TR_OpaqueClassBlock *declaringClass = owningMethod->getDeclaringClassFromFieldOrStatic(comp, cpIndex);
195
196
// $assertionDisabled fields are always foldable based on the Javadoc (setClassAssertionStatus
197
// "This method has no effect if the named class has already been initialized.
198
// (Once a class is initialized, its assertion status cannot change.)"
199
// So check if the field is final and check if it is this special field
200
if (isStatic)
201
{
202
int32_t totalLen;
203
char *fieldName;
204
fieldName = owningMethod->staticName(cpIndex, totalLen, comp->trMemory()); // totalLen = strlen("<class>" + "<field>" + "<sig>") + 3
205
static char *assertionsDisabledStr = "$assertionsDisabled Z";
206
//string will be of the form "<class>.$assertionsDisabled Z"
207
if (declaringClass
208
&& totalLen >= 22
209
&& comp->fej9()->isClassInitialized(declaringClass)
210
&& strncmp(&(fieldName[totalLen - 22]), assertionsDisabledStr, 21) == 0)
211
{
212
if (comp->getOption(TR_TraceCG))
213
traceMsg(comp, "Matched $assertionsDisabled Z\n");
214
return assertionsDisabled;
215
}
216
}
217
218
/*
219
* quick check
220
*/
221
int32_t classLen;
222
char *className; // Note: not Null-terminated!
223
if (declaringClass)
224
className = comp->fej9()->getClassNameChars(declaringClass, classLen);
225
else
226
className = owningMethod->classNameOfFieldOrStatic(cpIndex, classLen); // classLen = strlen("<class>");
227
228
if (!className ||
229
className[0] < minClassPrefix ||
230
className[0] > maxClassPrefix)
231
{
232
return TR::Symbol::UnknownField;
233
}
234
235
FP * recognizedFieldPrefix = &fieldPrefixTable[className[0] - minClassPrefix];
236
if (!recognizedFieldPrefix ||
237
classLen < recognizedFieldPrefix->minClassLength || classLen > recognizedFieldPrefix->maxClassLength)
238
{
239
return TR::Symbol::UnknownField;
240
}
241
242
F *recognizedFieldName = recognizedFieldPrefix->fieldInfo;
243
int32_t i;
244
F *knownField;
245
246
int32_t fieldLen;
247
char* fieldName = isStatic ? owningMethod->staticNameChars(cpIndex, fieldLen) : owningMethod->fieldNameChars(cpIndex, fieldLen);
248
249
int32_t sigLen;
250
char* fieldSig = isStatic ? owningMethod->staticSignatureChars(cpIndex, sigLen) : owningMethod->fieldSignatureChars(cpIndex, sigLen);
251
252
for (i=0, knownField = &recognizedFieldName[i];
253
knownField->id != TR::Symbol::UnknownField;
254
knownField = &recognizedFieldName[++i])
255
{
256
if (classLen ==knownField->classLen &&
257
fieldLen == knownField->fieldLen &&
258
sigLen == knownField->sigLen &&
259
strncmp(knownField->fieldStr, fieldName, fieldLen) == 0 &&
260
strncmp(knownField->classStr, className, classLen) == 0)
261
{
262
// TODO (Filip): This is a workaround for Java 829 performance as we switched to using a byte[] backing array in String*. Remove this workaround once obsolete.
263
if (knownField->id != TR::Symbol::Java_lang_String_value &&
264
knownField->id != TR::Symbol::Java_lang_StringBuffer_value &&
265
knownField->id != TR::Symbol::Java_lang_StringBuilder_value)
266
{
267
TR_ASSERT(strncmp(knownField->sigStr, fieldSig, sigLen) == 0, "Signature is altered unexpectly!");
268
}
269
270
return knownField->id;
271
}
272
}
273
274
return TR::Symbol::UnknownField;
275
}
276
277
TR::Symbol::RecognizedField
278
J9::Symbol::getRecognizedField()
279
{
280
if (self()->isRecognizedShadow())
281
return _recognizedField;
282
else if (self()->isRecognizedStatic())
283
return self()->getRecognizedStaticSymbol()->getRecognizedField();
284
else
285
return TR::Symbol::UnknownField;
286
}
287
288
/**
289
* Return the owning class name of this recognized field.
290
* Return null if this symbol does not have a recognized field.
291
*/
292
const char *
293
J9::Symbol::owningClassNameCharsForRecognizedField(int32_t & length)
294
{
295
TR_ASSERT(isShadow(), "Must be a shadow symbol");
296
TR::Symbol::RecognizedField recognizedField = self()->getRecognizedField();
297
TR_ASSERT(TR::Symbol::UnknownField != recognizedField, "Symbol should have a valid recognized field");
298
for (int i = 0; recognizedFieldName_c[i].id != TR::Symbol::UnknownField; ++i)
299
{
300
F &knownField = recognizedFieldName_c[i];
301
if (knownField.id == recognizedField)
302
{
303
length = knownField.classLen;
304
return knownField.classStr;
305
}
306
}
307
for (int i = 0; recognizedFieldName_j[i].id != TR::Symbol::UnknownField; ++i)
308
{
309
F &knownField = recognizedFieldName_j[i];
310
if (knownField.id == recognizedField)
311
{
312
length = knownField.classLen;
313
return knownField.classStr;
314
}
315
}
316
317
return NULL;
318
}
319
320
/**
321
* Sets the data type of a symbol, and the size, if the size can be inferred
322
* from the data type.
323
*/
324
void
325
J9::Symbol::setDataType(TR::DataType dt)
326
{
327
if (dt.isBCD())
328
{
329
// do not infer a size for BCD types as their size varies
330
//Set data type but not size
331
_flags.setValue(DataTypeMask, dt);
332
}
333
else
334
{
335
OMR::SymbolConnector::setDataType(dt);
336
}
337
}
338
339
uint32_t
340
J9::Symbol::convertTypeToSize(TR::DataType dt)
341
{
342
TR_ASSERT(!dt.isBCD(),"size for BCD type is not fixed\n");
343
return OMR::SymbolConnector::convertTypeToSize(dt);
344
}
345
346
TR::Symbol *
347
J9::Symbol::getRecognizedShadowSymbol()
348
{
349
return self()->isRecognizedShadow() ? (TR::Symbol*)this : 0;
350
}
351
352
template <typename AllocatorType>
353
TR::Symbol *
354
J9::Symbol::createRecognizedShadow(AllocatorType m, TR::DataType d, RecognizedField f)
355
{
356
auto * sym = createShadow(m, d);
357
sym->_recognizedField = f;
358
sym->_flags.set(RecognizedShadow);
359
if ((f == TR::Symbol::Java_lang_Class_enumVars) || (f == TR::Symbol::Java_lang_ClassEnumVars_cachedEnumConstants))
360
sym->_flags.set(RecognizedKnownObjectShadow);
361
return sym;
362
}
363
364
template <typename AllocatorType>
365
TR::Symbol *
366
J9::Symbol::createRecognizedShadow(AllocatorType m, TR::DataType d, uint32_t s, RecognizedField f)
367
{
368
auto * sym = createShadow(m,d,s);
369
sym->_recognizedField = f;
370
sym->_flags.set(RecognizedShadow);
371
if ((f == TR::Symbol::Java_lang_Class_enumVars) || (f == TR::Symbol::Java_lang_ClassEnumVars_cachedEnumConstants))
372
sym->_flags.set(RecognizedKnownObjectShadow);
373
return sym;
374
}
375
376
template <typename AllocatorType>
377
TR::Symbol *
378
J9::Symbol::createPossiblyRecognizedShadowWithFlags(
379
AllocatorType m,
380
TR::DataType type,
381
bool isVolatile,
382
bool isFinal,
383
bool isPrivate,
384
RecognizedField recognizedField)
385
{
386
TR::Symbol *fieldSymbol = NULL;
387
if (recognizedField != TR::Symbol::UnknownField)
388
fieldSymbol = TR::Symbol::createRecognizedShadow(m, type, recognizedField);
389
else
390
fieldSymbol = TR::Symbol::createShadow(m, type);
391
392
if (isVolatile)
393
fieldSymbol->setVolatile();
394
395
if (isFinal)
396
fieldSymbol->setFinal();
397
398
if (isPrivate)
399
fieldSymbol->setPrivate();
400
401
return fieldSymbol;
402
}
403
404
template <typename AllocatorType>
405
TR::Symbol *
406
J9::Symbol::createPossiblyRecognizedShadowFromCP(
407
TR::Compilation *comp,
408
AllocatorType m,
409
TR_ResolvedMethod *owningMethod,
410
int32_t cpIndex,
411
TR::DataType *type, // can be determined accurately even for unresolved field refs
412
uint32_t *offset, // typically stored for some reason on symref (not Symbol)
413
bool needsAOTValidation)
414
{
415
*type = TR::NoType;
416
*offset = 0;
417
418
const bool isStatic = false;
419
RecognizedField recognizedField =
420
TR::Symbol::searchRecognizedField(comp, owningMethod, cpIndex, isStatic);
421
422
bool isVolatile, isFinal, isPrivate, isUnresolvedInCP;
423
424
const bool isStore = false;
425
bool resolved = owningMethod->fieldAttributes(
426
comp,
427
cpIndex,
428
offset,
429
type,
430
&isVolatile,
431
&isFinal,
432
&isPrivate,
433
isStore,
434
&isUnresolvedInCP,
435
needsAOTValidation);
436
437
if (!resolved)
438
return NULL;
439
440
return createPossiblyRecognizedShadowWithFlags(
441
m, *type, isVolatile, isFinal, isPrivate, recognizedField);
442
}
443
444
/*
445
* Explicit instantiation of factories for each TR_Memory type.
446
*/
447
448
template TR::Symbol * J9::Symbol::createRecognizedShadow(TR_StackMemory, TR::DataType, RecognizedField);
449
template TR::Symbol * J9::Symbol::createRecognizedShadow(TR_HeapMemory, TR::DataType, RecognizedField);
450
451
template TR::Symbol * J9::Symbol::createRecognizedShadow(TR_StackMemory, TR::DataType, uint32_t, RecognizedField);
452
template TR::Symbol * J9::Symbol::createRecognizedShadow(TR_HeapMemory, TR::DataType, uint32_t, RecognizedField);
453
454
template TR::Symbol * J9::Symbol::createPossiblyRecognizedShadowWithFlags(TR_StackMemory, TR::DataType, bool, bool, bool, RecognizedField);
455
template TR::Symbol * J9::Symbol::createPossiblyRecognizedShadowWithFlags(TR_HeapMemory, TR::DataType, bool, bool, bool, RecognizedField);
456
457
template TR::Symbol * J9::Symbol::createPossiblyRecognizedShadowFromCP(TR::Compilation*, TR_StackMemory, TR_ResolvedMethod*, int32_t, TR::DataType*, uint32_t*, bool);
458
template TR::Symbol * J9::Symbol::createPossiblyRecognizedShadowFromCP(TR::Compilation*, TR_HeapMemory, TR_ResolvedMethod*, int32_t, TR::DataType*, uint32_t*, bool);
459
460