public List<VMThreadLocalInfo> sortThreadLocals(Feature.CompilationAccess config) { return sortThreadLocals(config, null); }
@Override public void beforeCompilation(BeforeCompilationAccess config) { List<VMThreadLocalInfo> sortedThreadLocalInfos = threadLocalCollector.sortThreadLocals(config); ObjectLayout layout = ConfigurationValues.getObjectLayout(); int nextObject = 0; int nextPrimitive = 0; for (VMThreadLocalInfo info : sortedThreadLocalInfos) { if (info.isObject) { info.offset = layout.getArrayElementOffset(JavaKind.Object, nextObject); nextObject += 1; } else { assert nextPrimitive % Math.min(8, info.sizeInBytes) == 0 : "alignment mismatch: " + info.sizeInBytes + ", " + nextPrimitive; info.offset = layout.getArrayElementOffset(JavaKind.Byte, nextPrimitive); nextPrimitive += info.sizeInBytes; } } VMThreadLocalSTSupport support = ImageSingletons.lookup(VMThreadLocalSTSupport.class); support.objectThreadLocals = new Object[nextObject]; support.primitiveThreadLocals = new byte[nextPrimitive]; /* Remember the final sorted list. */ VMThreadLocalInfos.setInfos(sortedThreadLocalInfos); } }
@Override public void beforeCompilation(BeforeCompilationAccess config) { List<VMThreadLocalInfo> sortedThreadLocalInfos = threadLocalCollector.sortThreadLocals(config, threadLocalAtOffsetZero); SubstrateReferenceMap referenceMap = new SubstrateReferenceMap(); int nextOffset = 0; for (VMThreadLocalInfo info : sortedThreadLocalInfos) { assert nextOffset % Math.min(8, info.sizeInBytes) == 0 : "alignment mismatch: " + info.sizeInBytes + ", " + nextOffset; if (info.isObject) { referenceMap.markReferenceAtOffset(nextOffset, true); } info.offset = nextOffset; nextOffset += info.sizeInBytes; } VMError.guarantee(threadLocalAtOffsetZero == null || threadLocalCollector.getInfo(threadLocalAtOffsetZero).offset == 0); ReferenceMapEncoder encoder = new ReferenceMapEncoder(); encoder.add(referenceMap); objectReferenceWalker.vmThreadReferenceMapEncoding = encoder.encodeAll(null); objectReferenceWalker.vmThreadReferenceMapIndex = encoder.lookupEncoding(referenceMap); objectReferenceWalker.vmThreadSize = nextOffset; /* Remember the final sorted list. */ VMThreadLocalInfos.setInfos(sortedThreadLocalInfos); } }