Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openj9
Path: blob/master/runtime/compiler/control/CompilationRuntime.hpp
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
#ifndef COMPILATION_RUNTIME_HPP
24
#define COMPILATION_RUNTIME_HPP
25
26
#pragma once
27
28
#include "AtomicSupport.hpp"
29
#include "compile/CompilationTypes.hpp"
30
#include "control/CompilationPriority.hpp"
31
#include "control/ClassHolder.hpp"
32
#include "control/MethodToBeCompiled.hpp"
33
#include "env/CpuUtilization.hpp"
34
#include "env/Processors.hpp"
35
#include "env/ProcessorInfo.hpp"
36
#include "env/TRMemory.hpp"
37
#include "env/jittypes.h"
38
#include "infra/Flags.hpp"
39
#include "infra/Statistics.hpp"
40
#include "control/rossa.h"
41
#include "runtime/RelocationRuntime.hpp"
42
#if defined(J9VM_OPT_JITSERVER)
43
#include "control/JITServerHelpers.hpp"
44
#include "env/PersistentCollections.hpp"
45
#include "net/ServerStream.hpp"
46
#endif /* defined(J9VM_OPT_JITSERVER) */
47
48
extern "C" {
49
struct J9Method;
50
struct J9JITConfig;
51
struct J9VMThread;
52
struct J9ROMMethod;
53
struct J9ClassLoader;
54
struct J9SharedClassJavacoreDataDescriptor;
55
}
56
57
class CpuUtilization;
58
namespace TR { class CompilationInfoPerThread; }
59
namespace TR { class CompilationInfoPerThreadBase; }
60
class TR_FilterBST;
61
class TR_FrontEnd;
62
class TR_HWProfiler;
63
class TR_J9VMBase;
64
class TR_LowPriorityCompQueue;
65
class TR_OptimizationPlan;
66
class TR_PersistentMethodInfo;
67
class TR_RelocationRuntime;
68
class TR_ResolvedMethod;
69
namespace TR { class MonitorTable; }
70
namespace TR { class IlGeneratorMethodDetails; }
71
namespace TR { class Options; }
72
namespace J9 { class RWMonitor; }
73
struct TR_JitPrivateConfig;
74
struct TR_MethodToBeCompiled;
75
template <typename T> class TR_PersistentArray;
76
typedef J9JITExceptionTable TR_MethodMetaData;
77
#if defined(J9VM_OPT_JITSERVER)
78
class ClientSessionHT;
79
class JITServerAOTCacheMap;
80
class JITServerAOTDeserializer;
81
class JITServerSharedROMClassCache;
82
#endif /* defined(J9VM_OPT_JITSERVER) */
83
84
struct TR_SignatureCountPair
85
{
86
TR_PERSISTENT_ALLOC(TR_Memory::OptimizationPlan)
87
TR_SignatureCountPair(char *string, int32_t c)
88
{
89
count = c;
90
91
for(int32_t i=0 ; i < 4000 ; i++)
92
{
93
signature[i] = string[i];
94
if(string[i] == '\0')
95
break;
96
}
97
98
};
99
char signature[4000];
100
int32_t count;
101
};
102
103
104
class TR_LowPriorityCompQueue
105
{
106
public:
107
TR_PERSISTENT_ALLOC(TR_Memory::PersistentInfo); // TODO: define its own category
108
static const uint32_t HT_SIZE = (1 << 13); // power of two for cheap modulo
109
TR_LowPriorityCompQueue();
110
~TR_LowPriorityCompQueue();
111
112
void setCompInfo(TR::CompilationInfo *compInfo) { _compInfo = compInfo; }
113
bool hasLowPriorityRequest() const { return (_firstLPQentry != NULL); }
114
TR_MethodToBeCompiled *getFirstLPQRequest() const { return _firstLPQentry; }
115
TR_MethodToBeCompiled *extractFirstLPQRequest();
116
TR_MethodToBeCompiled *findAndDequeueFromLPQ(TR::IlGeneratorMethodDetails &details,
117
uint8_t reason, TR_J9VMBase *fe, bool & dequeued);
118
void enqueueCompReqToLPQ(TR_MethodToBeCompiled *compReq);
119
bool createLowPriorityCompReqAndQueueIt(TR::IlGeneratorMethodDetails &details, void *startPC, uint8_t reason);
120
bool addFirstTimeCompReqToLPQ(J9Method *j9method, uint8_t reason);
121
bool addUpgradeReqToLPQ(TR_MethodToBeCompiled*, uint8_t reason = TR_MethodToBeCompiled::REASON_UPGRADE);
122
int32_t getLowPriorityQueueSize() const { return _sizeLPQ; }
123
int32_t getLPQWeight() const { return _LPQWeight; }
124
void increaseLPQWeightBy(uint8_t weight) { _LPQWeight += (int32_t)weight; }
125
void decreaseLPQWeightBy(uint8_t weight) { _LPQWeight -= (int32_t)weight; }
126
void invalidateRequestsForUnloadedMethods(J9Class * unloadedClass);
127
void purgeLPQ();
128
129
// The following refer to the mechanism that schedules low priority
130
// compilation requests based on the Iprofiler
131
static uint32_t hash(J9Method *j9method) { return ((uintptr_t)j9method >> 3) & (HT_SIZE - 1); }
132
bool isTrackingEnabled() const { return _trackingEnabled; }
133
void startTrackingIProfiledCalls(int32_t threshold);
134
bool isTrackableMethod(J9Method *j9method) const;
135
void stopTrackingMethod(J9Method *j9method); // Executed by the compilation thread when a low pri req is processed
136
void tryToScheduleCompilation(J9VMThread *vmThread, J9Method *j9method); // Executed by the IProfiler thread
137
void purgeEntriesOnClassLoaderUnloading(J9ClassLoader *j9classLoader);
138
void purgeEntriesOnClassRedefinition(J9Class *j9class);
139
void printStats() const;
140
void incStatsBypass() { _STAT_bypass++; } // Done by comp threads
141
void incStatsCompFromLPQ(uint8_t reason); // Done by JIT
142
void incStatsReqQueuedToLPQ(uint8_t reason);
143
void incNumFailuresToEnqueue() { _STAT_numFailedToEnqueueInLPQ++; }
144
145
struct Entry
146
{
147
uintptr_t _j9method; // this is the key; Initialized by IProfiler thread; reset by compilation thread
148
uint32_t _count; // updated by IProfiler thread
149
bool _queuedForCompilation; // used to avoid duplicates in the queue; set by IProfiler thread
150
bool isInvalid() const { return !_j9method; }
151
void setInvalid() { _j9method = 0; }
152
void initialize(J9Method *m, uint32_t c) { _j9method = (uintptr_t)m; _count = c; _queuedForCompilation = false; }
153
};
154
private:
155
TR::CompilationInfo* _compInfo;
156
TR_MethodToBeCompiled* _firstLPQentry; // first entry of low priority queue
157
TR_MethodToBeCompiled* _lastLPQentry; // last entry of low priority queue
158
int32_t _sizeLPQ; // size of low priority queue
159
int32_t _LPQWeight; // weight of low priority queue
160
uint32_t _threshold;
161
bool _trackingEnabled;
162
// Direct mapped hashtable that records j9methods and "counts"
163
Entry *_spine; // my hashtable
164
// stats written by IProfiler thread
165
uint32_t _STAT_compReqQueuedByIProfiler;
166
uint32_t _STAT_conflict;
167
uint32_t _STAT_staleScrubbed;
168
// stats written by comp thread
169
uint32_t _STAT_bypass; // an LPQ compilation was overtaken by a normal compilation
170
uint32_t _STAT_compReqQueuedByJIT;
171
uint32_t _STAT_LPQcompFromIprofiler; // first time compilations coming from LPQ
172
uint32_t _STAT_LPQcompFromInterpreter;
173
uint32_t _STAT_LPQcompUpgrade;
174
// stats written by application threads
175
uint32_t _STAT_compReqQueuedByInterpreter;
176
uint32_t _STAT_numFailedToEnqueueInLPQ;
177
}; // TR_LowPriorityCompQueue
178
179
180
// Definition of compilation queue to hold JProfiling candidates
181
class TR_JProfilingQueue
182
{
183
public:
184
TR_PERSISTENT_ALLOC(TR_Memory::PersistentInfo); // TODO: define its own category
185
TR_JProfilingQueue() : _firstQentry(NULL), _lastQentry(NULL), _size(0), _weight(0), _allowProcessing(false) {};
186
void setCompInfo(TR::CompilationInfo *compInfo) { _compInfo = compInfo; }
187
bool isEmpty() const { return (_firstQentry == NULL); }
188
TR_MethodToBeCompiled *getFirstCompRequest() const { return _firstQentry; }
189
TR_MethodToBeCompiled *extractFirstCompRequest();
190
bool createCompReqAndQueueIt(TR::IlGeneratorMethodDetails &details, void *startPC);
191
int32_t getQSize() const { return _size; }
192
int32_t getQWeight() const { return _weight; }
193
bool getAllowProcessing() const { return _allowProcessing; }
194
void setAllowProcessing() { _allowProcessing = true; }
195
static bool isJProfilingCandidate(TR_MethodToBeCompiled *entry, TR::Options *options, TR_J9VMBase* fej9);
196
void invalidateRequestsForUnloadedMethods(J9Class * unloadedClass);
197
void purge();
198
private:
199
void increaseQWeightBy(uint8_t weight) { _weight += (int32_t)weight; }
200
void decreaseQWeightBy(uint8_t weight) { _weight -= (int32_t)weight; }
201
void enqueueCompReq(TR_MethodToBeCompiled *compReq);
202
203
TR::CompilationInfo* _compInfo;
204
TR_MethodToBeCompiled* _firstQentry; // first entry of JProfiling queue
205
TR_MethodToBeCompiled* _lastQentry; // last entry of JProfiling queue
206
int32_t _size; // size of JProfiling queue
207
int32_t _weight; // weight of JProfiling queue
208
bool _allowProcessing;
209
};
210
211
212
// Supporting class for getting information on density of samples
213
class TR_JitSampleInfo
214
{
215
public:
216
void init()
217
{
218
_maxSamplesPerSecond = 0;
219
_samplesPerSecondDuringLastInterval = 0;
220
_sizeOfLastInterval = 1; // avoid check for divide by 0
221
_globalSampleCounterInLastInterval = 0;
222
_timestampOfLastInterval = 0;
223
_increaseFactor = 1;
224
}
225
TR_JitSampleInfo() { init(); }
226
uint32_t getMaxSamplesPerSecond() const { return _maxSamplesPerSecond; }
227
uint32_t getSamplesPerSecondDuringLastInterval() const { return _samplesPerSecondDuringLastInterval; }
228
uint32_t getCurrentSamplesPerSecond(uint64_t crtTime, uint32_t crtGlobalSampleCounter) const
229
{
230
uint64_t diffTime = crtTime - _timestampOfLastInterval;
231
return diffTime > 0 ? (crtGlobalSampleCounter - _globalSampleCounterInLastInterval) * 1000 / diffTime : 0;
232
}
233
void update(uint64_t crtTime, uint32_t crtGlobalSampleCounter);
234
uint32_t getIncreaseFactor() const { return _increaseFactor; }
235
private:
236
uint32_t _maxSamplesPerSecond;
237
uint32_t _samplesPerSecondDuringLastInterval;
238
uint32_t _sizeOfLastInterval; // ms
239
uint32_t _globalSampleCounterInLastInterval;
240
uint64_t _timestampOfLastInterval;
241
uint32_t _increaseFactor;
242
}; // class TR_JitSampleInfo
243
244
// The following class is used for tracking methods that have their invocation
245
// count decremented due to a sample in interpreted code. When that happens
246
// we add the method to a list. When a method needs to be compiled we check
247
// the list and if the method is in the list we delete it and schedule a
248
// SamplingJprofiling compilation for the count that has been skipped
249
class TR_InterpreterSamplingTracking
250
{
251
public:
252
TR_PERSISTENT_ALLOC(TR_MemoryBase::CompilationInfo);
253
class TR_MethodCnt
254
{
255
friend class TR_InterpreterSamplingTracking;
256
TR_MethodCnt(J9Method *m, int32_t c) : _next(NULL), _method(m), _skippedCount(c) {}
257
258
TR_MethodCnt *_next;
259
J9Method * _method;
260
int32_t _skippedCount;
261
};
262
263
TR_InterpreterSamplingTracking(TR::CompilationInfo *compInfo) :
264
_container(NULL), _compInfo(compInfo), _maxElements(0), _size(0) {}
265
// both these methods need the compilation monitor in hand
266
void addOrUpdate(J9Method *method, int32_t cnt);
267
int32_t findAndDelete(J9Method *method);
268
void onClassUnloading() {/* TODO: prune list when classes change or get unloaded */}
269
uint32_t getMaxElements() const { return _maxElements; }
270
private:
271
TR_MethodCnt *_container;
272
TR::CompilationInfo *_compInfo; // cache value of compInfo
273
uint32_t _maxElements;
274
uint32_t _size;
275
};
276
277
278
class J9Method_HT
279
{
280
public:
281
TR_PERSISTENT_ALLOC(TR_MemoryBase::CompilationInfo);
282
static const size_t LOG_HT_SIZE = 6;
283
static const size_t HT_SIZE = 1 << LOG_HT_SIZE;
284
static const size_t MASK = HT_SIZE - 1;
285
struct HT_Entry
286
{
287
HT_Entry *_next; // for linking entries together
288
J9Method *_j9method;
289
volatile int32_t _count; // invocation count when last visited
290
uint32_t _seqID;
291
uint64_t _timestamp;
292
HT_Entry(J9Method *j9method, uint64_t timestamp);
293
uint64_t getTimestamp() const { return _timestamp; }
294
};
295
J9Method_HT(TR::PersistentInfo *persistentInfo);
296
size_t getNumEntries() const { return _numEntries; }
297
// method used by various hooks that perform class unloading
298
void onClassUnloading();
299
300
protected:
301
TR::PersistentInfo *getPersistentInfo() const { return _persistentInfo; }
302
size_t hash(J9Method *j9method) const
303
{ return (size_t)(((uintptr_t)j9method >> 3) ^ ((uintptr_t)j9method >> (3 + LOG_HT_SIZE))); }
304
HT_Entry *find(J9Method *j9method) const;
305
bool addNewEntry(J9Method *j9method, uint64_t timestamp);
306
private:
307
// Backbone of the hashtable
308
struct HT_Entry *_spine[HT_SIZE];
309
TR::PersistentInfo *_persistentInfo;
310
int32_t _numEntries; // for stats; may be imprecise due to multithreading issues
311
};
312
313
class DLTTracking : public J9Method_HT
314
{
315
public:
316
DLTTracking(TR::PersistentInfo *persistentInfo) : J9Method_HT(persistentInfo) {}
317
// Method used by application threads when a DLT decision needs to be taken
318
// Need to have VMaccess in hand
319
bool shouldIssueDLTCompilation(J9Method *j9method, int32_t numHitsInDLTBuffer);
320
321
// Method used by application threads whenever invocation count
322
// for a method is changed abruptly (e.g. interpreter sampling)
323
// Need to have VMaccess in hand
324
void adjustStoredCounterForMethod(J9Method *j9method, int32_t countDiff);
325
};
326
327
328
329
//--------------------------------- TR::CompilationInfo -----------------------
330
namespace TR
331
{
332
333
class CompilationInfo
334
{
335
public:
336
friend class TR::CompilationInfoPerThreadBase;
337
friend class TR::CompilationInfoPerThread;
338
friend class ::TR_LowPriorityCompQueue;
339
friend class ::TR_JProfilingQueue;
340
341
TR_PERSISTENT_ALLOC(TR_MemoryBase::CompilationInfo);
342
343
enum hotnessWeights
344
{
345
AOT_LOAD_WEIGHT = 1, // actually AOT loads have their own parameter
346
THUNKS_WEIGHT = 1,
347
NOOPT_WEIGHT = 1,
348
COLD_WEIGHT = 2,
349
WARM_LOOPLESS_WEIGHT = 6,
350
WARM_LOOPY_WEIGHT = 12,
351
JSR292_WEIGHT = 20,
352
HOT_WEIGHT = 30,
353
VERY_HOT_WEIGHT = 100,
354
MAX_WEIGHT = 255
355
};
356
357
enum TR_SamplerStates
358
{
359
SAMPLER_NOT_INITIALIZED = 0,
360
SAMPLER_DEFAULT,
361
SAMPLER_IDLE,
362
SAMPLER_DEEPIDLE,
363
SAMPLER_SUSPENDED,
364
SAMPLER_STOPPED,
365
SAMPLER_LAST_STATE, // must be the last one
366
// If adding new state, one must add a new name as well in samplerThreadStateNames array
367
// and a frequency in samplerThreadStateFrequencies array
368
};
369
370
enum TR_SamplingThreadLifetimeStates
371
{
372
SAMPLE_THR_NOT_CREATED = 0,
373
SAMPLE_THR_FAILED_TO_ATTACH,
374
SAMPLE_THR_ATTACHED,
375
SAMPLE_THR_INITIALIZED,
376
SAMPLE_THR_STOPPING,
377
SAMPLE_THR_DESTROYED,
378
SAMPLE_THR_LAST_STATE // must be the last one
379
};
380
381
enum TR_CompThreadActions
382
{
383
PROCESS_ENTRY,
384
GO_TO_SLEEP_EMPTY_QUEUE,
385
GO_TO_SLEEP_CONCURRENT_EXPENSIVE_REQUESTS,
386
SUSPEND_COMP_THREAD_EXCEED_CPU_ENTITLEMENT,
387
THROTTLE_COMP_THREAD_EXCEED_CPU_ENTITLEMENT,
388
SUSPEND_COMP_THREAD_EMPTY_QUEUE,
389
UNDEFINED_ACTION
390
};
391
392
struct DLT_record
393
{
394
DLT_record *_next;
395
J9Method *_method;
396
void *_dltEntry;
397
int32_t _bcIndex;
398
};
399
400
struct CompilationStatistics
401
{
402
// perhaps not the greatest way to do this, but TR_Stats classes weren't an exact match
403
uint32_t _heartbeatWindowCount;
404
uint32_t _windowStartTick;
405
uint32_t _sampleMessagesSent;
406
uint32_t _sampleMessagesReceived;
407
uint32_t _interpretedMethodSamples;
408
uint32_t _compiledMethodSamples;
409
uint32_t _compiledMethodSamplesIgnored;
410
uint32_t _ticksInIdleMode;
411
uint32_t _methodsCompiledOnCount;
412
uint32_t _methodsReachingSampleInterval;
413
uint32_t _methodsSelectedToRecompile;
414
uint32_t _methodsSampleWindowReset;
415
}; // CompilationStatistics
416
417
struct CompilationStatsPerInterval
418
{
419
uint32_t _interpretedMethodSamples;
420
uint32_t _compiledMethodSamples;
421
uint32_t _numFirstTimeCompilationsInInterval;
422
uint32_t _numRecompilationsInInterval;
423
uint32_t _numRecompPrevInterval;
424
uint32_t _samplesSentInInterval;
425
void reset()
426
{
427
_interpretedMethodSamples = _compiledMethodSamples = 0;
428
_numFirstTimeCompilationsInInterval = _numRecompilationsInInterval = 0;
429
_numRecompPrevInterval = 0; _samplesSentInInterval = 0;
430
}
431
void decay()
432
{
433
_interpretedMethodSamples >>= 1;
434
_compiledMethodSamples >>= 1;
435
_numFirstTimeCompilationsInInterval >>= 1;
436
_numRecompPrevInterval = _numRecompilationsInInterval; // remember the previous value
437
_numRecompilationsInInterval = (_numRecompilationsInInterval*2)/3;
438
_samplesSentInInterval = 0;
439
}
440
}; // CompilationStatsPerInterval
441
442
static bool createCompilationInfo(J9JITConfig * jitConfig);
443
static void freeCompilationInfo(J9JITConfig *jitConfig);
444
static TR::CompilationInfo *get(J9JITConfig * = 0) { return _compilationRuntime; }
445
static bool shouldRetryCompilation(TR_MethodToBeCompiled *entry, TR::Compilation *comp);
446
static bool shouldAbortCompilation(TR_MethodToBeCompiled *entry, TR::PersistentInfo *persistentInfo);
447
static bool canRelocateMethod(TR::Compilation * comp);
448
static int computeCompilationThreadPriority(J9JavaVM *vm);
449
static void *compilationEnd(J9VMThread *context, TR::IlGeneratorMethodDetails & details, J9JITConfig *jitConfig, void * startPC,
450
void *oldStartPC, TR_FrontEnd *vm=0, TR_MethodToBeCompiled *entry=NULL, TR::Compilation *comp=NULL);
451
#if defined(J9VM_OPT_JITSERVER)
452
static JITServer::ServerStream *getStream();
453
#endif /* defined(J9VM_OPT_JITSERVER) */
454
static bool isInterpreted(J9Method *method) { return !isCompiled(method); }
455
456
/**
457
* @brief Determines if a J9Method is compiled
458
*
459
* @param method pointer to the J9Method
460
*
461
* @return true if compiled, false otherwise
462
*/
463
static bool isCompiled(J9Method *method)
464
{
465
#if defined(J9VM_OPT_JITSERVER)
466
if (auto stream = getStream())
467
{
468
stream->write(JITServer::MessageType::CompInfo_isCompiled, method);
469
return std::get<0>(stream->read<bool>());
470
}
471
#endif /* defined(J9VM_OPT_JITSERVER) */
472
473
return (getPCIfCompiled(method) != NULL);
474
}
475
476
/**
477
* @brief Returns the PC of a method that is compiled
478
*
479
* @param method pointer to the J9Method
480
*
481
* @return The start PC if compiled, NULL otherwise
482
*/
483
static void* getPCIfCompiled(J9Method *method)
484
{
485
#if defined(J9VM_OPT_JITSERVER)
486
if (auto stream = getStream())
487
{
488
stream->write(JITServer::MessageType::CompInfo_getPCIfCompiled, method);
489
return std::get<0>(stream->read<void *>());
490
}
491
#endif /* defined(J9VM_OPT_JITSERVER) */
492
493
/* Read extra field only once */
494
void *extra = method->extra;
495
496
/* Return extra field if compiled, NULL otherwise */
497
return ((uintptr_t)extra & J9_STARTPC_NOT_TRANSLATED) == 0 ? extra : NULL;
498
}
499
500
static bool isJNINative(J9Method *method)
501
{
502
#if defined(J9VM_OPT_JITSERVER)
503
if (auto stream = getStream())
504
{
505
stream->write(JITServer::MessageType::CompInfo_isJNINative, method);
506
return std::get<0>(stream->read<bool>());
507
}
508
#endif /* defined(J9VM_OPT_JITSERVER) */
509
// Note: This query is only concerned with the method to be compiled
510
// and so we don't have to care if the VM has a FastJNI version
511
return (((uintptr_t)method->constantPool) & J9_STARTPC_JNI_NATIVE) != 0;
512
}
513
514
static const intptr_t J9_INVOCATION_COUNT_MASK = 0xffffffff;
515
516
static int32_t getInvocationCount(J9Method *method)
517
{
518
#if defined(J9VM_OPT_JITSERVER)
519
if (auto stream = getStream())
520
{
521
stream->write(JITServer::MessageType::CompInfo_getInvocationCount, method);
522
return std::get<0>(stream->read<int32_t>());
523
}
524
#endif /* defined(J9VM_OPT_JITSERVER) */
525
if (((intptr_t)method->extra & J9_STARTPC_NOT_TRANSLATED) == 0)
526
return -1;
527
int32_t count = getJ9MethodVMExtra(method);
528
if (count < 0)
529
return count;
530
return count >> 1;
531
}
532
static intptr_t getJ9MethodExtra(J9Method *method)
533
{
534
#if defined(J9VM_OPT_JITSERVER)
535
if (auto stream = getStream())
536
{
537
stream->write(JITServer::MessageType::CompInfo_getJ9MethodExtra, method);
538
return (intptr_t) std::get<0>(stream->read<uint64_t>());
539
}
540
#endif /* defined(J9VM_OPT_JITSERVER) */
541
return (intptr_t)method->extra;
542
}
543
static int32_t getJ9MethodVMExtra(J9Method *method)
544
{
545
#if defined(J9VM_OPT_JITSERVER)
546
TR_ASSERT_FATAL(!TR::CompilationInfo::getStream(), "not yet implemented for JITServer");
547
#endif /* defined(J9VM_OPT_JITSERVER) */
548
return (int32_t)((intptr_t)method->extra);
549
}
550
static void * getJ9MethodStartPC(J9Method *method)
551
{
552
#if defined(J9VM_OPT_JITSERVER)
553
if (auto stream = getStream())
554
{
555
stream->write(JITServer::MessageType::CompInfo_getJ9MethodStartPC, method);
556
return std::get<0>(stream->read<void*>());
557
}
558
else
559
#endif /* defined(J9VM_OPT_JITSERVER) */
560
{
561
/* Read extra field only once */
562
void *extra = method->extra;
563
TR_ASSERT(!((intptr_t)extra & J9_STARTPC_NOT_TRANSLATED), "Method NOT Jitted!");
564
return extra;
565
}
566
}
567
static void setJ9MethodExtra(J9Method *method, intptr_t newValue)
568
{
569
#if defined(J9VM_OPT_JITSERVER)
570
if (auto stream = getStream())
571
{
572
stream->write(JITServer::MessageType::CompInfo_setJ9MethodExtra, method, (uint64_t) newValue);
573
std::get<0>(stream->read<JITServer::Void>());
574
}
575
else
576
#endif /* defined(J9VM_OPT_JITSERVER) */
577
{
578
method->extra = (void *)newValue;
579
}
580
}
581
static bool setJ9MethodExtraAtomic(J9Method *method, intptr_t oldValue, intptr_t newValue)
582
{
583
#if defined(J9VM_OPT_JITSERVER)
584
TR_ASSERT_FATAL(!TR::CompilationInfo::getStream(), "not yet implemented for JITServer");
585
#endif /* defined(J9VM_OPT_JITSERVER) */
586
return oldValue == VM_AtomicSupport::lockCompareExchange((UDATA*)&method->extra, oldValue, newValue);
587
}
588
static bool setJ9MethodExtraAtomic(J9Method *method, intptr_t newValue)
589
{
590
#if defined(J9VM_OPT_JITSERVER)
591
TR_ASSERT_FATAL(!TR::CompilationInfo::getStream(), "not yet implemented for JITServer");
592
#endif /* defined(J9VM_OPT_JITSERVER) */
593
intptr_t oldValue = (intptr_t)method->extra;
594
return setJ9MethodExtraAtomic(method, oldValue, newValue);
595
}
596
static bool setJ9MethodVMExtra(J9Method *method, int32_t value)
597
{
598
#if defined(J9VM_OPT_JITSERVER)
599
TR_ASSERT_FATAL(!TR::CompilationInfo::getStream(), "not yet implemented for JITServer");
600
#endif /* defined(J9VM_OPT_JITSERVER) */
601
intptr_t oldValue = (intptr_t)method->extra;
602
intptr_t newValue = (intptr_t)value;
603
return setJ9MethodExtraAtomic(method, oldValue, newValue);
604
}
605
static bool setInvocationCount(J9Method *method, int32_t newCount)
606
{
607
#if defined(J9VM_OPT_JITSERVER)
608
if (auto stream = getStream())
609
{
610
stream->write(JITServer::MessageType::CompInfo_setInvocationCount, method, newCount);
611
return std::get<0>(stream->read<bool>());
612
}
613
#endif /* defined(J9VM_OPT_JITSERVER) */
614
newCount = (newCount << 1) | J9_STARTPC_NOT_TRANSLATED;
615
if (newCount < 1)
616
return false;
617
return setJ9MethodVMExtra(method, newCount);
618
}
619
static bool setInvocationCount(J9Method *method, int32_t oldCount, int32_t newCount)
620
{
621
#if defined(J9VM_OPT_JITSERVER)
622
if (auto stream = getStream())
623
{
624
stream->write(JITServer::MessageType::CompInfo_setInvocationCountAtomic, method, oldCount, newCount);
625
return std::get<0>(stream->read<bool>());
626
}
627
#endif /* defined(J9VM_OPT_JITSERVER) */
628
newCount = (newCount << 1) | J9_STARTPC_NOT_TRANSLATED;
629
oldCount = (oldCount << 1) | J9_STARTPC_NOT_TRANSLATED;
630
if (newCount < 0)
631
return false;
632
intptr_t oldMethodExtra = (intptr_t) method->extra & (intptr_t)(~J9_INVOCATION_COUNT_MASK);
633
intptr_t newMethodExtra = oldMethodExtra | newCount;
634
oldMethodExtra = oldMethodExtra | oldCount;
635
bool success = setJ9MethodExtraAtomic(method, oldMethodExtra, newMethodExtra);
636
if (success)
637
{
638
DLTTracking *dltHT = _compilationRuntime->getDLT_HT();
639
if (dltHT)
640
dltHT->adjustStoredCounterForMethod(method, oldCount - newCount);
641
}
642
return success;
643
}
644
// If the invocation count is 0, set it to the value indicated by newCount
645
static bool replenishInvocationCountIfExpired(J9Method *method, int32_t newCount)
646
{
647
intptr_t oldMethodExtra = (intptr_t) method->extra;
648
if ((oldMethodExtra & J9_STARTPC_NOT_TRANSLATED) == 0)
649
return false; // Do not touch compiled methods
650
651
int32_t oldCount = (int32_t)oldMethodExtra;
652
if (oldCount < 0)
653
return false; // Do not touch uncountable methods
654
oldCount >>= 1; // Eliminate the J9_STARTPC_NOT_TRANSLATED bit
655
if (oldCount != 0)
656
return false; // Only replenish invocation count if it expired
657
// Prepare the new method->extra
658
intptr_t oldMethodExtraUpperPart = oldMethodExtra & (~J9_INVOCATION_COUNT_MASK);
659
newCount = (newCount << 1) | J9_STARTPC_NOT_TRANSLATED;
660
intptr_t newMethodExtra = oldMethodExtraUpperPart | newCount;
661
return setJ9MethodExtraAtomic(method, oldMethodExtra, newMethodExtra);
662
}
663
static void setInitialInvocationCountUnsynchronized(J9Method *method, int32_t value)
664
{
665
#if defined(J9VM_OPT_JITSERVER)
666
TR_ASSERT_FATAL(!TR::CompilationInfo::getStream(), "not yet implemented for JITServer");
667
#endif /* defined(J9VM_OPT_JITSERVER) */
668
value = (value << 1) | J9_STARTPC_NOT_TRANSLATED;
669
if (value < 0)
670
value = INT_MAX;
671
method->extra = reinterpret_cast<void *>(static_cast<intptr_t>(value));
672
}
673
674
static uint32_t getMethodBytecodeSize(const J9ROMMethod * romMethod);
675
static uint32_t getMethodBytecodeSize(J9Method* method);
676
677
// Check to see if the J9AccMethodHasMethodHandleInvokes flag is set
678
static bool isJSR292(const J9ROMMethod *romMethod);
679
static bool isJSR292(J9Method *j9method);
680
681
#if defined(J9VM_INTERP_AOT_COMPILE_SUPPORT) && defined(J9VM_OPT_SHARED_CLASSES) && (defined(TR_HOST_X86) || defined(TR_HOST_POWER) || defined(TR_HOST_S390) || defined(TR_HOST_ARM) || defined(TR_HOST_ARM64))
682
static void disableAOTCompilations();
683
#endif
684
685
void * operator new(size_t s, void * p) throw() { return p; }
686
void operator delete (void *, void * p) {}
687
CompilationInfo (J9JITConfig *jitConfig);
688
TR::Monitor *getCompilationMonitor() {return _compilationMonitor;}
689
void acquireCompMonitor(J9VMThread *vmThread); // used when we know we have a compilation monitor
690
void releaseCompMonitor(J9VMThread *vmThread); // used when we know we have a compilation monitor
691
void waitOnCompMonitor(J9VMThread *vmThread);
692
intptr_t waitOnCompMonitorTimed(J9VMThread *vmThread, int64_t millis, int32_t nanos);
693
694
TR_PersistentMemory * persistentMemory() { return _persistentMemory; }
695
696
TR::PersistentInfo * getPersistentInfo() { return persistentMemory()->getPersistentInfo(); }
697
TR_MethodToBeCompiled *requestExistsInCompilationQueue(TR::IlGeneratorMethodDetails & details, TR_FrontEnd *fe);
698
699
TR_MethodToBeCompiled *addMethodToBeCompiled(TR::IlGeneratorMethodDetails &details, void *pc, CompilationPriority priority,
700
bool async, TR_OptimizationPlan *optPlan, bool *queued, TR_YesNoMaybe methodIsInSharedCache);
701
#if defined(J9VM_OPT_JITSERVER)
702
TR_MethodToBeCompiled *addOutOfProcessMethodToBeCompiled(JITServer::ServerStream *stream);
703
#endif /* defined(J9VM_OPT_JITSERVER) */
704
void queueEntry(TR_MethodToBeCompiled *entry);
705
void recycleCompilationEntry(TR_MethodToBeCompiled *cur);
706
#if defined(J9VM_OPT_JITSERVER)
707
void requeueOutOfProcessEntry(TR_MethodToBeCompiled *entry);
708
#endif /* defined(J9VM_OPT_JITSERVER) */
709
TR_MethodToBeCompiled *adjustCompilationEntryAndRequeue(TR::IlGeneratorMethodDetails &details,
710
TR_PersistentMethodInfo *methodInfo,
711
TR_Hotness newOptLevel, bool useProfiling,
712
CompilationPriority priority, TR_J9VMBase *fe);
713
void changeCompReqFromAsyncToSync(J9Method * method);
714
int32_t promoteMethodInAsyncQueue(J9Method * method, void *pc);
715
TR_MethodToBeCompiled *getNextMethodToBeCompiled(TR::CompilationInfoPerThread *compInfoPT, bool compThreadCameOutOfSleep, TR_CompThreadActions*);
716
TR_MethodToBeCompiled *peekNextMethodToBeCompiled();
717
TR_MethodToBeCompiled *getMethodQueue() { return _methodQueue; }
718
int32_t getOverallCompCpuUtilization() const { return _overallCompCpuUtilization; } // -1 in case of error. 0 if feature is not enabled
719
void setOverallCompCpuUtilization(int32_t c) { _overallCompCpuUtilization = c; }
720
TR_YesNoMaybe exceedsCompCpuEntitlement() const { return _exceedsCompCpuEntitlement; }
721
void setExceedsCompCpuEntitlement(TR_YesNoMaybe value) { _exceedsCompCpuEntitlement = value; }
722
int32_t computeCompThreadSleepTime(int32_t compilationTimeMs);
723
bool isQueuedForCompilation(J9Method *, void *oldStartPC);
724
void * startPCIfAlreadyCompiled(J9VMThread *, TR::IlGeneratorMethodDetails & details, void *oldStartPC);
725
726
static int32_t getCompThreadSuspensionThreshold(int32_t threadID) { return _compThreadSuspensionThresholds[threadID]; }
727
728
// updateNumUsableCompThreads() is called before startCompilationThread() to update TR::Options::_numUsableCompilationThreads.
729
// It makes sure the number of usable compilation threads is within allowed bounds.
730
// If not, set it to the upper bound based on the mode: JITClient/non-JITServer or JITServer.
731
void updateNumUsableCompThreads(int32_t &numUsableCompThreads);
732
bool allocateCompilationThreads(int32_t numUsableCompThreads);
733
void freeAllCompilationThreads();
734
void freeAllResources();
735
736
uintptr_t startCompilationThread(int32_t priority, int32_t id, bool isDiagnosticThread);
737
bool asynchronousCompilation();
738
void stopCompilationThreads();
739
740
/**
741
* \brief
742
* Stops a compilation thread by issuing an interruption request at the threads next yield point and by changing
743
* its state to signal termination. Note that there can be a delay between making this request and the thread
744
* state changing to `COMPTHREAD_STOPPED`.
745
*
746
* \param compInfoPT
747
* The thread to be stopped.
748
*/
749
void stopCompilationThread(CompilationInfoPerThread* compInfoPT);
750
751
void suspendCompilationThread();
752
void resumeCompilationThread();
753
void purgeMethodQueue(TR_CompilationErrorCode errorCode);
754
void *compileMethod(J9VMThread * context, TR::IlGeneratorMethodDetails &details, void *oldStartPC,
755
TR_YesNoMaybe async, TR_CompilationErrorCode *, bool *queued, TR_OptimizationPlan *optPlan);
756
757
void *compileOnSeparateThread(J9VMThread * context, TR::IlGeneratorMethodDetails &details, void *oldStartPC,
758
TR_YesNoMaybe async, TR_CompilationErrorCode*,
759
bool *queued, TR_OptimizationPlan *optPlan);
760
void invalidateRequestsForUnloadedMethods(TR_OpaqueClassBlock *unloadedClass, J9VMThread * vmThread, bool hotCodeReplacement);
761
void invalidateRequestsForNativeMethods(J9Class * clazz, J9VMThread * vmThread);
762
#if defined(J9VM_JIT_DYNAMIC_LOOP_TRANSFER)
763
void *searchForDLTRecord(J9Method *method, int32_t bcIndex);
764
void insertDLTRecord(J9Method *method, int32_t bcIndex, void *dltEntry);
765
void cleanDLTRecordOnUnload();
766
DLTTracking *getDLT_HT() const { return _dltHT; }
767
void setDLT_HT(DLTTracking *dltHT) { _dltHT = dltHT; }
768
#else
769
DLTTracking *getDLT_HT() const { return NULL; }
770
#endif // J9VM_JIT_DYNAMIC_LOOP_TRANSFER
771
772
J9::RWMonitor *getClassUnloadMonitor() { return _classUnloadMonitor; }
773
774
// Synchronize output to the vlog file (or stdout if there is no file)
775
//
776
void vlogAcquire();
777
void vlogRelease();
778
779
// Synchronize output to the rtlog file (or stdout if there is no file)
780
//
781
void rtlogAcquire();
782
void rtlogRelease();
783
784
// Synchronize updates to J9Method objects
785
//
786
void acquireCompilationLock();
787
void releaseCompilationLock();
788
789
TR::Monitor *createLogMonitor();
790
void acquireLogMonitor();
791
void releaseLogMonitor();
792
793
int32_t getQueueWeight() const { return _queueWeight; }
794
void increaseQueueWeightBy(uint8_t w) { _queueWeight += (int32_t)w; }
795
int32_t decreaseQueueWeightBy(uint8_t w) { TR_ASSERT((int32_t)w <= _queueWeight, "assertion failure"); return _queueWeight -= (int32_t)w; }
796
int32_t getOverallQueueWeight() const { return _queueWeight; /*+ (_LPQWeight >> 1);*/ } // make secondary queue count only half as much
797
int32_t getMethodQueueSize() const { return _numQueuedMethods; }
798
void incrementMethodQueueSize();
799
int32_t getPeakMethodQueueSize() const { return _maxQueueSize; }
800
int32_t getNumQueuedFirstTimeCompilations() const { return _numQueuedFirstTimeCompilations; }
801
void decNumGCRReqestsQueued(TR_MethodToBeCompiled *entry);
802
void incNumGCRRequestsQueued(TR_MethodToBeCompiled *entry);
803
int32_t getNumGCRRequestsQueued() const { return _numGCRQueued; }
804
void decNumInvReqestsQueued(TR_MethodToBeCompiled *entry);
805
void incNumInvRequestsQueued(TR_MethodToBeCompiled *entry);
806
void updateCompQueueAccountingOnDequeue(TR_MethodToBeCompiled *entry);
807
int32_t getNumCompThreadsActive() const { return _numCompThreadsActive; }
808
void incNumCompThreadsActive() { _numCompThreadsActive++; }
809
void decNumCompThreadsActive() { _numCompThreadsActive--; }
810
void setNumCompThreadsActive(int32_t n) { _numCompThreadsActive = n; }
811
int32_t getNumCompThreadsJobless() const { return _numCompThreadsJobless; }
812
void incNumCompThreadsJobless() { _numCompThreadsJobless++; }
813
void decNumCompThreadsJobless() { _numCompThreadsJobless--; }
814
void setNumCompThreadsJobless(int32_t n) { _numCompThreadsJobless = n; }
815
int32_t getNumCompThreadsCompilingHotterMethods() const { return _numCompThreadsCompilingHotterMethods; }
816
void incNumCompThreadsCompilingHotterMethods() { _numCompThreadsCompilingHotterMethods++; }
817
void decNumCompThreadsCompilingHotterMethods() { _numCompThreadsCompilingHotterMethods--; TR_ASSERT(_numCompThreadsCompilingHotterMethods>=0, "assertion failure");}
818
void setNumCompThreadsCompilingHotterMethods(int32_t n) { _numCompThreadsCompilingHotterMethods = n; }
819
int32_t getNumAppThreadsActive() const { return _numAppThreadsActive; }
820
uint64_t getElapsedTimeNumAppThreadsActiveWasSet() const { return _elapsedTimeNumAppThreadsActiveWasSet; }
821
void setNumAppThreadsActive(int32_t n, uint64_t t) { _numAppThreadsActive = n; _elapsedTimeNumAppThreadsActiveWasSet = t; }
822
bool useOptLevelAdjustment();
823
824
825
bool getHasResumableTrapHandler() {return _flags.testAny(HasResumableTrapHandler);}
826
void setHasResumableTrapHandler(bool t=true)
827
{
828
if (t)
829
_flags.set(HasResumableTrapHandler);
830
else
831
_flags.reset(HasResumableTrapHandler);
832
}
833
834
bool getHasFixedFrameC_CallingConvention() {return _flags.testAny(HasFixedFrameC_CallingConvention);}
835
void setHasFixedFrameC_CallingConvention() { _flags.set(HasFixedFrameC_CallingConvention);}
836
837
uint32_t getNumberBytesReadInaccessible() {return _numberBytesReadInaccessible;}
838
uint32_t setNumberBytesReadInaccessible(int32_t r) { return (_numberBytesReadInaccessible = r); }
839
840
uint32_t getNumberBytesWriteInaccessible() {return _numberBytesWriteInaccessible;}
841
uint32_t setNumberBytesWriteInaccessible(int32_t w) { return (_numberBytesWriteInaccessible = w); }
842
843
bool getSupportsScaledIndexAddressing() {return _flags.testAny(SupportsScaledIndexAddressing);}
844
void setSupportsScaledIndexAddressing() { _flags.set(SupportsScaledIndexAddressing);}
845
846
bool isInZOSSupervisorState() {return _flags.testAny(IsInZOSSupervisorState);}
847
void setIsInZOSSupervisorState() { _flags.set(IsInZOSSupervisorState);}
848
849
TR_LinkHead0<TR_ClassHolder> *getListOfClassesToCompile() { return &_classesToCompileList; }
850
int32_t getCompilationLag();
851
int32_t getCompilationLagUnlocked() { return getCompilationLag(); } // will go away
852
bool dynamicThreadPriority();
853
854
void updateCompilationErrorStats(TR_CompilationErrorCode errorCode) { statCompErrors.update(errorCode); }
855
bool SmoothCompilation(TR_MethodToBeCompiled *entry, int32_t *optLevelAdjustment);
856
bool compBudgetSupport() const {return _compBudgetSupport;}
857
void setCompBudgetSupport(bool val) {_compBudgetSupport = val;}
858
int32_t getCompBudget() const;
859
void setCompBudget(int32_t budget) {_compilationBudget = budget;}
860
int32_t idleThreshold() const {return _idleThreshold;}
861
void setIdleThreshold(int32_t threshold) {_idleThreshold = threshold;}
862
int64_t getCpuTimeSpentInCompilation();
863
int32_t changeCompThreadPriority(int32_t priority, int32_t locationCode);
864
TR_MethodToBeCompiled *getFirstDowngradedMethod();
865
uint64_t getLastReqStartTime() const {return _lastReqStartTime;}
866
void setLastReqStartTime(uint64_t t) { _lastReqStartTime = t; }
867
CpuUtilization * getCpuUtil() const { return _cpuUtil;}
868
void setCpuUtil(CpuUtilization *cpuUtil){ _cpuUtil = cpuUtil; }
869
UDATA getVMStateOfCrashedThread() { return _vmStateOfCrashedThread; }
870
void setVMStateOfCrashedThread(UDATA vmState) { _vmStateOfCrashedThread = vmState; }
871
void printCompQueue();
872
TR::CompilationInfoPerThread *getCompilationInfoForDiagnosticThread() const { return _compInfoForDiagnosticCompilationThread; }
873
TR::CompilationInfoPerThread * const *getArrayOfCompilationInfoPerThread() const { return _arrayOfCompilationInfoPerThread; }
874
uint32_t getAotQueryTime() { return _statTotalAotQueryTime; }
875
void setAotQueryTime(uint32_t queryTime) { _statTotalAotQueryTime = queryTime; }
876
uint32_t getAotRelocationTime() { return _statTotalAotRelocationTime; }
877
void setAotRelocationTime(uint32_t reloTime) { _statTotalAotRelocationTime = reloTime; }
878
void incrementNumMethodsFoundInSharedCache() { _numMethodsFoundInSharedCache++; }
879
int32_t numMethodsFoundInSharedCache() { return _numMethodsFoundInSharedCache; }
880
int32_t getNumInvRequestsInCompQueue() const { return _numInvRequestsInCompQueue; }
881
J9JITConfig *getJITConfig() { return _jitConfig; }
882
TR::CompilationInfoPerThread *getCompInfoForThread(J9VMThread *vmThread);
883
int32_t getNumUsableCompilationThreads() const { return _numCompThreads; }
884
int32_t getNumTotalCompilationThreads() const { return _numCompThreads + _numDiagnosticThreads; }
885
TR::CompilationInfoPerThreadBase *getCompInfoWithID(int32_t ID);
886
TR::Compilation *getCompilationWithID(int32_t ID);
887
TR::CompilationInfoPerThread *getFirstSuspendedCompilationThread();
888
bool useMultipleCompilationThreads() { return (getNumUsableCompilationThreads() + _numDiagnosticThreads) > 1; }
889
bool getRampDownMCT() const { return _rampDownMCT; }
890
void setRampDownMCT() { _rampDownMCT = true; } // cannot be reset
891
static void printMethodNameToVlog(J9Method *method);
892
static void printMethodNameToVlog(const J9ROMClass* romClass, const J9ROMMethod* romMethod);
893
894
void queueForcedAOTUpgrade(TR_MethodToBeCompiled *originalEntry);
895
896
void queueForcedAOTUpgrade(TR_MethodToBeCompiled *originalEntry, uint16_t hints, TR_FrontEnd *fe);
897
898
uint32_t getNumTargetCPUs() const { return _cpuEntitlement.getNumTargetCPUs(); }
899
900
bool isHypervisorPresent() { return _cpuEntitlement.isHypervisorPresent(); }
901
double getGuestCpuEntitlement() const { return _cpuEntitlement.getGuestCpuEntitlement(); }
902
void computeAndCacheCpuEntitlement() { _cpuEntitlement.computeAndCacheCpuEntitlement(); }
903
double getJvmCpuEntitlement() const { return _cpuEntitlement.getJvmCpuEntitlement(); }
904
905
bool importantMethodForStartup(J9Method *method);
906
bool shouldDowngradeCompReq(TR_MethodToBeCompiled *entry);
907
908
909
int32_t computeDynamicDumbInlinerBytecodeSizeCutoff(TR::Options *options);
910
TR_YesNoMaybe shouldActivateNewCompThread();
911
#if DEBUG
912
void debugPrint(char *debugString);
913
void debugPrint(J9VMThread *, char *);
914
void debugPrint(char *, intptr_t);
915
void debugPrint(J9VMThread *, char *, IDATA);
916
void debugPrint(J9Method*);
917
void debugPrint(char *, J9Method *);
918
void debugPrint(J9VMThread *, char *, TR_MethodToBeCompiled *);
919
void debugPrint(char * debugString, TR::IlGeneratorMethodDetails & details, J9VMThread * vmThread);
920
void printQueue();
921
#else // !DEBUG
922
void debugPrint(char *debugString) {}
923
void debugPrint(J9VMThread *, char *) {}
924
void debugPrint(char *, intptr_t) {}
925
void debugPrint(J9VMThread *, char *, IDATA) {}
926
void debugPrint(J9Method*) {}
927
void debugPrint(char *, J9Method *) {}
928
void debugPrint(J9VMThread *, char *, TR_MethodToBeCompiled *) {}
929
void debugPrint(char * debugString, TR::IlGeneratorMethodDetails & details, J9VMThread * vmThread) { }
930
void printQueue() {}
931
#endif // DEBUG
932
void debugPrint(TR_OpaqueMethodBlock *omb){ debugPrint((J9Method*)omb); }
933
934
enum {SMALL_LAG=1, MEDIUM_LAG, LARGE_LAG};
935
bool methodCanBeCompiled(TR_FrontEnd *, TR_ResolvedMethod *compilee, TR_FilterBST *&filter);
936
937
void setAllCompilationsShouldBeInterrupted();
938
939
int32_t getIprofilerMaxCount() const { return _iprofilerMaxCount; }
940
void setIprofilerMaxCount(int32_t n) { _iprofilerMaxCount = n; }
941
942
TR_SharedCacheRelocationRuntime *reloRuntime() { return &_sharedCacheReloRuntime; }
943
944
int32_t incNumSeriousFailures() { return ++_numSeriousFailures; } // no atomicity guarantees for the increment
945
946
TR_SamplerStates getSamplerState() const { return _samplerState; }
947
void setSamplerState(TR_SamplerStates s) { _prevSamplerState = _samplerState; _samplerState = s; }
948
TR_SamplerStates getPrevSamplerState() const { return _prevSamplerState; }
949
950
951
J9VMThread *getSamplerThread() const { return _samplerThread; }
952
void setSamplerThread(J9VMThread *thr) { _samplerThread = thr; }
953
// use jitConfig->samplerMonitor for the following two routines
954
TR_SamplingThreadLifetimeStates getSamplingThreadLifetimeState() const { return _samplingThreadLifetimeState; }
955
void setSamplingThreadLifetimeState(TR_SamplingThreadLifetimeStates s) { _samplingThreadLifetimeState = s; }
956
int32_t getSamplingThreadWaitTimeInDeepIdleToNotifyVM() const { return _samplingThreadWaitTimeInDeepIdleToNotifyVM; }
957
void setSamplingThreadWaitTimeInDeepIdleToNotifyVM()
958
{
959
int32_t minIdleWaitTimeToNotifyVM = _jitConfig->javaVM->internalVMFunctions->getVMMinIdleWaitTime(_jitConfig->javaVM);
960
961
if (minIdleWaitTimeToNotifyVM == 0)
962
_samplingThreadWaitTimeInDeepIdleToNotifyVM = -1;
963
else
964
{
965
if (minIdleWaitTimeToNotifyVM <= TR::Options::_waitTimeToEnterDeepIdleMode)
966
_samplingThreadWaitTimeInDeepIdleToNotifyVM = 0;
967
else
968
_samplingThreadWaitTimeInDeepIdleToNotifyVM = minIdleWaitTimeToNotifyVM - TR::Options::_waitTimeToEnterDeepIdleMode;
969
}
970
}
971
972
TR::CompilationInfoPerThread * findFirstLowPriorityCompilationInProgress(CompilationPriority priority); // needs compilationQueueMonitor in hand
973
974
TR_YesNoMaybe isWarmSCC() const { return _warmSCC; }
975
void setIsWarmSCC(TR_YesNoMaybe param) { _warmSCC = param; }
976
#if defined(J9VM_OPT_SHARED_CLASSES)
977
J9SharedClassJavacoreDataDescriptor* getAddrOfJavacoreData() { return &_javacoreData; }
978
#endif
979
TR::Monitor *getIProfilerBufferArrivalMonitor() const { return _iprofilerBufferArrivalMonitor; }
980
981
TR_HWProfiler *getHWProfiler() const;
982
983
TR_JProfilerThread *getJProfilerThread() const;
984
985
int32_t calculateCodeSize(TR_MethodMetaData *metaData);
986
void increaseUnstoredBytes(U_32 aotBytes, U_32 jitBytes);
987
988
/**
989
* @brief Compute free physical memory taking into account container limits
990
*
991
* @param incompleteInfo [OUTPUT] Boolean indicating that cached/buffered memory couldn't be read
992
* @return A value representing the free physicalMemory
993
or OMRPORT_MEMINFO_NOT_AVAILABLE in case of error
994
*/
995
uint64_t computeFreePhysicalMemory(bool &incompleteInfo);
996
997
/**
998
* @brief Compute free physical memory taking into account container limits and caches it for later use
999
*
1000
* To limit overhead, this function caches the computed value and
1001
* only refreshes it if more than "updatePeriodMs" have passed since the last update
1002
* If updatePeriodMs==-1, then updatePeriodMs uses a default value of 500 ms
1003
*
1004
* @param incompleteInfo [OUTPUT] Boolean indicating that cached/buffered memory couldn't be read
1005
* @param updatePeriodMs Indicates how often the cached values are refreshed
1006
* @return A value representing the free physicalMemory
1007
or OMRPORT_MEMINFO_NOT_AVAILABLE in case of error
1008
*/
1009
uint64_t computeAndCacheFreePhysicalMemory(bool &incompleteInfo, int64_t updatePeriodMs=-1);
1010
uint64_t computeFreePhysicalLimitAndAbortCompilationIfLow(TR::Compilation *comp, bool &incompleteInfo, size_t sizeToAllocate);
1011
1012
TR_LowPriorityCompQueue &getLowPriorityCompQueue() { return _lowPriorityCompilationScheduler; }
1013
bool canProcessLowPriorityRequest();
1014
TR_CompilationErrorCode scheduleLPQAndBumpCount(TR::IlGeneratorMethodDetails &details, TR_J9VMBase *fe);
1015
1016
TR_JProfilingQueue &getJProfilingCompQueue() { return _JProfilingQueue; }
1017
1018
TR_JitSampleInfo &getJitSampleInfoRef() { return _jitSampleInfo; }
1019
TR_InterpreterSamplingTracking *getInterpSamplTrackingInfo() const { return _interpSamplTrackingInfo; }
1020
1021
int32_t getAppSleepNano() const { return _appSleepNano; }
1022
void setAppSleepNano(int32_t t) { _appSleepNano = t; }
1023
int32_t computeAppSleepNano() const;
1024
TR_YesNoMaybe detectCompThreadStarvation();
1025
bool getStarvationDetected() const { return _starvationDetected; }
1026
void setStarvationDetected(bool b) { _starvationDetected = b; }
1027
int32_t getTotalCompThreadCpuUtilWhenStarvationComputed() const { return _totalCompThreadCpuUtilWhenStarvationComputed; }
1028
int32_t getNumActiveCompThreadsWhenStarvationComputed() const { return _numActiveCompThreadsWhenStarvationComputed; }
1029
bool canProcessJProfilingRequest();
1030
bool getSuspendThreadDueToLowPhysicalMemory() const { return _suspendThreadDueToLowPhysicalMemory; }
1031
void setSuspendThreadDueToLowPhysicalMemory(bool b) { _suspendThreadDueToLowPhysicalMemory = b; }
1032
1033
#if defined(J9VM_OPT_JITSERVER)
1034
ClientSessionHT *getClientSessionHT() const { return _clientSessionHT; }
1035
void setClientSessionHT(ClientSessionHT *ht) { _clientSessionHT = ht; }
1036
1037
PersistentVector<TR_OpaqueClassBlock*> *getUnloadedClassesTempList() const { return _unloadedClassesTempList; }
1038
void setUnloadedClassesTempList(PersistentVector<TR_OpaqueClassBlock*> *it) { _unloadedClassesTempList = it; }
1039
PersistentVector<TR_OpaqueClassBlock*> *getIllegalFinalFieldModificationList() const { return _illegalFinalFieldModificationList; }
1040
void setIllegalFinalFieldModificationList(PersistentVector<TR_OpaqueClassBlock*> *it) { _illegalFinalFieldModificationList = it; }
1041
PersistentUnorderedMap<TR_OpaqueClassBlock*, uint8_t> *getNewlyExtendedClasses() const { return _newlyExtendedClasses; }
1042
void classGotNewlyExtended(TR_OpaqueClassBlock* clazz)
1043
{
1044
auto &newlyExtendedClasses = *getNewlyExtendedClasses();
1045
uint8_t inProgress = getCHTableUpdateDone();
1046
if (inProgress)
1047
newlyExtendedClasses[clazz] |= inProgress;
1048
}
1049
void setNewlyExtendedClasses(PersistentUnorderedMap<TR_OpaqueClassBlock*, uint8_t> *it) { _newlyExtendedClasses = it; }
1050
1051
TR::Monitor *getclassesCachedAtServerMonitor() const { return _classesCachedAtServerMonitor; }
1052
TR::Monitor *getSequencingMonitor() const { return _sequencingMonitor; }
1053
uint32_t getCompReqSeqNo() const { return _compReqSeqNo; }
1054
uint32_t incCompReqSeqNo() { return ++_compReqSeqNo; }
1055
uint32_t getLastCriticalSeqNo() const { return _lastCriticalCompReqSeqNo; }
1056
void setLastCriticalSeqNo(uint32_t seqNo) { _lastCriticalCompReqSeqNo = seqNo; }
1057
1058
void markCHTableUpdateDone(int32_t threadId) { _chTableUpdateFlags |= (1 << threadId); }
1059
void resetCHTableUpdateDone(int32_t threadId) { _chTableUpdateFlags &= ~(1 << threadId); }
1060
uint8_t getCHTableUpdateDone() const { return _chTableUpdateFlags; }
1061
1062
const PersistentVector<std::string> &getJITServerSslKeys() const { return _sslKeys; }
1063
PersistentUnorderedSet<J9Class*> & getclassesCachedAtServer() { return _classesCachedAtServer; }
1064
void addJITServerSslKey(const std::string &key) { _sslKeys.push_back(key); }
1065
const PersistentVector<std::string> &getJITServerSslCerts() const { return _sslCerts; }
1066
void addJITServerSslCert(const std::string &cert) { _sslCerts.push_back(cert); }
1067
const std::string &getJITServerSslRootCerts() const { return _sslRootCerts; }
1068
void setJITServerSslRootCerts(const std::string &cert) { _sslRootCerts = cert; }
1069
1070
void setCompThreadActivationPolicy(JITServer::CompThreadActivationPolicy newPolicy) { _activationPolicy = newPolicy; }
1071
JITServer::CompThreadActivationPolicy getCompThreadActivationPolicy() const { return _activationPolicy; }
1072
uint64_t getCachedFreePhysicalMemoryB() const { return _cachedFreePhysicalMemoryB; }
1073
1074
JITServerSharedROMClassCache *getJITServerSharedROMClassCache() const { return _sharedROMClassCache; }
1075
void setJITServerSharedROMClassCache(JITServerSharedROMClassCache *cache) { _sharedROMClassCache = cache; }
1076
1077
JITServerAOTCacheMap *getJITServerAOTCacheMap() const { return _JITServerAOTCacheMap; }
1078
void setJITServerAOTCacheMap(JITServerAOTCacheMap *map) { _JITServerAOTCacheMap = map; }
1079
1080
JITServerAOTDeserializer *getJITServerAOTDeserializer() const { return _JITServerAOTDeserializer; }
1081
void setJITServerAOTDeserializer(JITServerAOTDeserializer *deserializer) { _JITServerAOTDeserializer = deserializer; }
1082
#endif /* defined(J9VM_OPT_JITSERVER) */
1083
1084
static void replenishInvocationCount(J9Method* method, TR::Compilation* comp);
1085
1086
static void addJ9HookVMDynamicCodeLoadForAOT(J9VMThread * vmThread, J9Method * method, J9JITConfig *jitConfig, TR_MethodMetaData* relocatedMetaData);
1087
1088
#if defined(J9VM_INTERP_AOT_COMPILE_SUPPORT) && defined(J9VM_OPT_SHARED_CLASSES) && (defined(TR_HOST_X86) || defined(TR_HOST_POWER) || defined(TR_HOST_S390) || defined(TR_HOST_ARM) || defined(TR_HOST_ARM64))
1089
static void storeAOTInSharedCache(J9VMThread *vmThread, J9ROMMethod *romMethod, const U_8 *dataStart, UDATA dataSize, const U_8 *codeStart, UDATA codeSize, TR::Compilation *comp, J9JITConfig *jitConfig, TR_MethodToBeCompiled *entry);
1090
#endif
1091
1092
static int32_t VERY_SMALL_QUEUE;
1093
static int32_t SMALL_QUEUE;
1094
static int32_t MEDIUM_LARGE_QUEUE;
1095
static int32_t LARGE_QUEUE;
1096
static int32_t VERY_LARGE_QUEUE;
1097
1098
struct CompilationStatistics _stats;
1099
struct CompilationStatsPerInterval _intervalStats;
1100
TR_PersistentArray<TR_SignatureCountPair *> *_persistedMethods;
1101
1102
// Must be less than 16 at the JITClient or non-JITServer mode because
1103
// in some parts of the code (CHTable) we keep flags on a 2-byte variable.
1104
static const uint32_t MAX_CLIENT_USABLE_COMP_THREADS = 15; // For JITClient and non-JITServer mode
1105
static const uint32_t DEFAULT_CLIENT_USABLE_COMP_THREADS = 7; // For JITClient and non-JITServer mode
1106
#if defined(J9VM_OPT_JITSERVER)
1107
static const uint32_t MAX_SERVER_USABLE_COMP_THREADS = 999; // JITServer
1108
static const uint32_t DEFAULT_SERVER_USABLE_COMP_THREADS = 63; // JITServer
1109
#endif /* defined(J9VM_OPT_JITSERVER) */
1110
static const uint32_t MAX_DIAGNOSTIC_COMP_THREADS = 1;
1111
1112
private:
1113
1114
enum
1115
{
1116
JITA2N_EXTENDED_DATA_EYE_CATCHER = 0xCCCCCCCC,
1117
JITA2N_EXTENDED_DATA_LINENUM = 0xBEEFCAFE, // Picked early and used... so we'll leave it
1118
JITA2N_EXTENDED_DATA_CALLSITES = 0xCAFE0002,
1119
JITA2N_EXTENDED_DATA_INLINETABLE = 0xCAFE0003,
1120
JITA2N_EXTENDED_DATA_COMPILATION_DESC = 0xCAFE0004
1121
};
1122
1123
/**
1124
* @brief getCompilationQueueEntry gets a TR_MethodToBeCompiled for use in queuing compilations
1125
* @return Returns an unused queue entry if available, or NULL otherwise.
1126
*/
1127
TR_MethodToBeCompiled * getCompilationQueueEntry();
1128
1129
J9Method *getRamMethod(TR_FrontEnd *vm, char *className, char *methodName, char *signature);
1130
//char *buildMethodString(TR_ResolvedMethod *method);
1131
1132
static const size_t DLT_HASHSIZE = 123;
1133
1134
static TR::CompilationInfo * _compilationRuntime;
1135
1136
static int32_t *_compThreadActivationThresholds;
1137
static int32_t *_compThreadSuspensionThresholds;
1138
static int32_t *_compThreadActivationThresholdsonStarvation;
1139
1140
TR::CompilationInfoPerThread **_arrayOfCompilationInfoPerThread; // First NULL entry means end of the array
1141
TR::CompilationInfoPerThread *_compInfoForDiagnosticCompilationThread; // compinfo for dump compilation thread
1142
TR_MethodToBeCompiled *_methodQueue;
1143
TR_MethodToBeCompiled *_methodPool;
1144
int32_t _methodPoolSize; // shouldn't this and _methodPool be static?
1145
1146
J9JITConfig *_jitConfig;
1147
TR_PersistentMemory *_persistentMemory; // memorize the persistentMemory
1148
TR::Monitor *_compilationMonitor;
1149
J9::RWMonitor *_classUnloadMonitor;
1150
TR::Monitor *_logMonitor; // only used if multiple compilation threads
1151
TR::Monitor *_schedulingMonitor;
1152
#if defined(J9VM_JIT_DYNAMIC_LOOP_TRANSFER)
1153
TR::Monitor *_dltMonitor;
1154
struct DLT_record *_freeDLTRecord;
1155
struct DLT_record *_dltHash[DLT_HASHSIZE];
1156
#endif
1157
DLTTracking *_dltHT;
1158
1159
TR::Monitor *_vlogMonitor;
1160
TR::Monitor *_rtlogMonitor;
1161
TR::Monitor *_iprofilerBufferArrivalMonitor;
1162
TR::MonitorTable *_j9MonitorTable; // used only for RAS (debuggerExtensions); no accessor; use TR_J9MonitorTable::get() everywhere else
1163
TR_LinkHead0<TR_ClassHolder> _classesToCompileList; // used by compileClasses; adjusted by unload hooks
1164
intptr_t _numSyncCompilations;
1165
intptr_t _numAsyncCompilations;
1166
int32_t _numCompThreadsActive;
1167
int32_t _numCompThreadsJobless; // threads are not suspended, but have no work to do
1168
int32_t _numCompThreadsCompilingHotterMethods; // allow only one at a time; use compQmonitor to change
1169
int32_t _numAppThreadsActive; // updated by sampling thread once in a while
1170
uint64_t _elapsedTimeNumAppThreadsActiveWasSet; // ms; maintained by sampling thread
1171
int32_t _numQueuedMethods;
1172
int32_t _maxQueueSize;
1173
int32_t _numQueuedFirstTimeCompilations; // these have oldStartPC==0
1174
int32_t _queueWeight; // approximation on overhead to process the entire queue
1175
CpuUtilization* _cpuUtil; // object to compute cpu utilization
1176
int32_t _overallCompCpuUtilization; // In percentage points. Valid only if TR::Options::_compThreadCPUEntitlement has a positive value
1177
int32_t _idleThreshold; // % of entire machine CPU
1178
int32_t _compilationBudget;
1179
TR_YesNoMaybe _warmSCC; // shared class cache has methods, so this could be second run
1180
bool _compBudgetSupport;
1181
bool _rampDownMCT; // flag that from now on we should not activate more than one compilation thread
1182
// Once set, the flag is never reset
1183
TR_YesNoMaybe _exceedsCompCpuEntitlement;
1184
J9VMThread *_samplerThread; // The Os thread for this VM attached thread is stored at jitConfig->samplerThread
1185
TR_SamplerStates _samplerState; // access is guarded by J9JavaVM->vmThreadListMutex
1186
TR_SamplerStates _prevSamplerState; // previous state of the sampler thread
1187
volatile TR_SamplingThreadLifetimeStates _samplingThreadLifetimeState; // access guarded by jitConfig->samplerMonitor (most of the time)
1188
int32_t _samplingThreadWaitTimeInDeepIdleToNotifyVM;
1189
int32_t _numMethodsFoundInSharedCache;
1190
int32_t _numInvRequestsInCompQueue; // number of invalidation requests present in the compilation queue
1191
uint64_t _lastReqStartTime; // time (ms) when processing the last request started
1192
uint64_t _lastCompilationsShouldBeInterruptedTime; // RAS
1193
// statistics
1194
int32_t _statsOptLevels[numHotnessLevels]; // will be zeroed with memset
1195
#if defined(J9VM_OPT_JITSERVER)
1196
int32_t _statsRemoteOptLevels[numHotnessLevels];
1197
#endif /* defined(J9VM_OPT_JITSERVER) */
1198
uint32_t _statNumAotedMethods;
1199
uint32_t _statNumMethodsFromSharedCache; // methods whose body was taken from shared cache
1200
uint32_t _statNumAotedMethodsRecompiled;
1201
uint32_t _statNumForcedAotUpgrades;
1202
uint32_t _statNumJNIMethodsCompiled;
1203
TR_StatsEvents<compilationMaxError> statCompErrors;
1204
uint32_t _statNumPriorityChanges; // statistics
1205
uint32_t _statNumYields;
1206
uint32_t _statNumUpgradeInterpretedMethod;
1207
uint32_t _statNumDowngradeInterpretedMethod;
1208
uint32_t _statNumUpgradeJittedMethod;
1209
uint32_t _statNumQueuePromotions;
1210
uint32_t _statNumGCRInducedCompilations;
1211
uint32_t _statNumSamplingJProfilingBodies;
1212
uint32_t _statNumJProfilingBodies;
1213
uint32_t _statNumRecompilationForBodiesWithJProfiling;
1214
uint32_t _statNumMethodsFromJProfilingQueue;
1215
uint32_t _statTotalAotQueryTime;
1216
uint32_t _statTotalAotRelocationTime;
1217
1218
uint32_t _numberBytesReadInaccessible;
1219
uint32_t _numberBytesWriteInaccessible;
1220
flags32_t _flags;
1221
int32_t _numSeriousFailures; // count failures where method needs to continue interpreted
1222
1223
TR::Monitor *_gpuInitMonitor;
1224
1225
enum // flags
1226
{
1227
// = 0x00000001, // AVAILABLE FOR USE !!
1228
HasResumableTrapHandler = 0x00000002,
1229
HasFixedFrameC_CallingConvention = 0x00000004,
1230
SupportsScaledIndexAddressing = 0x00000080,
1231
S390SupportsDFP = 0x00000100,
1232
S390SupportsFPE = 0x00000200,
1233
IsInZOSSupervisorState = 0x00008000,
1234
S390SupportsTM = 0x00010000,
1235
S390SupportsRI = 0x00020000,
1236
S390SupportsVectorFacility = 0x00040000,
1237
DummyLastFlag
1238
};
1239
1240
#ifdef DEBUG
1241
bool _traceCompiling;
1242
#endif
1243
int32_t _numCompThreads; // Number of usable compilation threads that does not include the diagnostic thread
1244
int32_t _numDiagnosticThreads;
1245
int32_t _iprofilerMaxCount;
1246
int32_t _numGCRQueued; // how many GCR requests are in the queue
1247
// We should disable GCR counting if too many
1248
// GCR requests because GCR counting has a large
1249
// negative effect on performance
1250
//----------------
1251
int32_t _appSleepNano; // make app threads sleep when sampling
1252
1253
bool _starvationDetected;
1254
int32_t _totalCompThreadCpuUtilWhenStarvationComputed; // for RAS purposes
1255
int32_t _numActiveCompThreadsWhenStarvationComputed; // for RAS purposes
1256
//--------------
1257
TR_LowPriorityCompQueue _lowPriorityCompilationScheduler;
1258
TR_JProfilingQueue _JProfilingQueue;
1259
1260
TR_CpuEntitlement _cpuEntitlement;
1261
TR_JitSampleInfo _jitSampleInfo;
1262
TR_SharedCacheRelocationRuntime _sharedCacheReloRuntime;
1263
uintptr_t _vmStateOfCrashedThread; // Set by Jit Dump; used by diagnostic thread
1264
#if defined(J9VM_OPT_SHARED_CLASSES)
1265
J9SharedClassJavacoreDataDescriptor _javacoreData;
1266
#endif
1267
uint64_t _cachedFreePhysicalMemoryB;
1268
bool _cachedIncompleteFreePhysicalMemory;
1269
bool _cgroupMemorySubsystemEnabled; // true when running in container and the memory subsystem is enabled
1270
// The following flag is set when the JIT is not allowed to allocate
1271
// a scratch segment due to low physical memory.
1272
// It is reset when a compilation thread is suspended, thus possibly
1273
// freeing scratch segments it holds to
1274
bool _suspendThreadDueToLowPhysicalMemory;
1275
TR_InterpreterSamplingTracking *_interpSamplTrackingInfo;
1276
1277
#if defined(J9VM_OPT_JITSERVER)
1278
ClientSessionHT *_clientSessionHT; // JITServer hashtable that holds session information about JITClients
1279
PersistentUnorderedSet<J9Class*> _classesCachedAtServer;
1280
TR::Monitor *_classesCachedAtServerMonitor;
1281
PersistentVector<TR_OpaqueClassBlock*> *_unloadedClassesTempList; // JITServer list of classes unloaded
1282
PersistentVector<TR_OpaqueClassBlock*> *_illegalFinalFieldModificationList; // JITServer list of classes that have J9ClassHasIllegalFinalFieldModifications is set
1283
TR::Monitor *_sequencingMonitor; // Used for ordering outgoing messages at the client
1284
uint32_t _compReqSeqNo; // seqNo for outgoing messages at the client
1285
uint32_t _lastCriticalCompReqSeqNo; // seqNo for last request that carried information that needs to be processed in order
1286
PersistentUnorderedMap<TR_OpaqueClassBlock*, uint8_t> *_newlyExtendedClasses; // JITServer table of newly extended classes
1287
uint8_t _chTableUpdateFlags;
1288
uint32_t _localGCCounter; // Number of local gc cycles done
1289
std::string _sslRootCerts;
1290
PersistentVector<std::string> _sslKeys;
1291
PersistentVector<std::string> _sslCerts;
1292
JITServer::CompThreadActivationPolicy _activationPolicy;
1293
JITServerSharedROMClassCache *_sharedROMClassCache;
1294
JITServerAOTCacheMap *_JITServerAOTCacheMap;
1295
JITServerAOTDeserializer *_JITServerAOTDeserializer;
1296
#endif /* defined(J9VM_OPT_JITSERVER) */
1297
}; // CompilationInfo
1298
}
1299
1300
1301
#endif // COMPILATIONRUNTIME_HPP
1302
1303
1304