Path: blob/master/runtime/bcutil/ROMClassWriter.hpp
5985 views
/*******************************************************************************1* Copyright (c) 2001, 2021 IBM Corp. and others2*3* This program and the accompanying materials are made available under4* the terms of the Eclipse Public License 2.0 which accompanies this5* distribution and is available at https://www.eclipse.org/legal/epl-2.0/6* or the Apache License, Version 2.0 which accompanies this distribution and7* is available at https://www.apache.org/licenses/LICENSE-2.0.8*9* This Source Code may also be made available under the following10* Secondary Licenses when the conditions for such availability set11* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU12* General Public License, version 2 with the GNU Classpath13* Exception [1] and GNU General Public License, version 2 with the14* OpenJDK Assembly Exception [2].15*16* [1] https://www.gnu.org/software/classpath/license.html17* [2] http://openjdk.java.net/legal/assembly-exception.html18*19* 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-exception20*******************************************************************************/2122/*23* ROMClassWriter.hpp24*/2526#ifndef ROMCLASSWRITER_HPP_27#define ROMCLASSWRITER_HPP_2829/* @ddr_namespace: default */30#include "j9comp.h"3132#include "ClassFileOracle.hpp"33#include "ConstantPoolMap.hpp"34#include "SRPOffsetTable.hpp"35#include "ROMClassCreationContext.hpp"36#if defined(J9VM_OPT_VALHALLA_VALUE_TYPES)37#include "ROMClassBuilder.hpp" /* included to obtain definition of InterfaceInjectionInfo */38#endif /* J9VM_OPT_VALHALLA_VALUE_TYPES */3940class Cursor;41class SRPKeyProducer;42class BufferManager;4344class ROMClassWriter45{46public:47#if defined(J9VM_OPT_VALHALLA_VALUE_TYPES)48ROMClassWriter(BufferManager *bufferManager, ClassFileOracle *classFileOracle, SRPKeyProducer *srpKeyProducer, ConstantPoolMap *constantPoolMap, ROMClassCreationContext *context, InterfaceInjectionInfo *interfaceInjectionInfo);49#else /* J9VM_OPT_VALHALLA_VALUE_TYPES */50ROMClassWriter(BufferManager *bufferManager, ClassFileOracle *classFileOracle, SRPKeyProducer *srpKeyProducer, ConstantPoolMap *constantPoolMap, ROMClassCreationContext *context);51#endif /* J9VM_OPT_VALHALLA_VALUE_TYPES */52~ROMClassWriter();5354void setSRPOffsetTable(SRPOffsetTable *srpOffsetTable)55{56_srpOffsetTable = srpOffsetTable;5758if (_context->isIntermediateDataAClassfile()) {59/* Check if intermediateClassData can be re-used. It is re-usable when class is being re-transformed.60* However, do not re-use intermediateClassData from previous ROMClass if61* previous ROMClass is in private memory and the new class is share-able,62* otherwise we would end up with intermediateClassData of shared ROMClass pointing to private memory of the JVM.63*64* Do not re-use intermediateClassData if class is an anonClass. AnonClasses can be unloaded separately which would cause a65* problem if romClasses reference each other66*/67if ((false == _context->isClassAnon())68&& ((false == _context->isROMClassShareable())69|| (true == _context->isIntermediateClassDataShareable()))70) {71reuseIntermediateClassData();72}73}74}7576void reuseIntermediateClassData()77{78if ((false == _context->isReusingIntermediateClassData())79&& (true == _context->isRetransformAllowed())80&& (true == _context->isRetransforming())81) {82_srpOffsetTable->setInternedAt(_intermediateClassDataSRPKey, _context->getIntermediateClassDataFromPreviousROMClass());83_context->setReusingIntermediateClassData();84}85}8687enum MarkOrWrite {88MARK_AND_COUNT_ONLY,89WRITE90};9192/*93* write out the entire ROMClass, including UTF8s94*/95void writeROMClass(Cursor *cursor,96Cursor *lineNumberCursor,97Cursor *variableInfoCursor,98Cursor *utf8Cursor,99Cursor *classDataCursor,100U_32 romSize,101U_32 modifiers,102U_32 extraModifiers,103U_32 optionalFlags,104MarkOrWrite markOrWrite );105106/*107* writes out only UTF8s108*/109void writeUTF8s(Cursor *cursor);110111bool isOK() const { return OK == _buildResult; }112BuildResult getBuildResult() const { return _buildResult; }113114private:115class AnnotationWriter;116class AnnotationElementWriter;117class NamedAnnotationElementWriter;118class ConstantPoolWriter;119class ConstantPoolShapeDescriptionWriter;120class CheckSize;121class Helper;122class CallSiteWriter;123124struct MethodNotes {125U_32 debugInfoSize;126U_32 stackMapSize;127};128129void writeConstantPool(Cursor *cursor, bool markAndCountOnly);130void writeFields(Cursor *cursor, bool markAndCountOnly);131void writeInterfaces(Cursor *cursor, bool markAndCountOnly);132void writeInnerClasses(Cursor *cursor, bool markAndCountOnly);133void writeEnclosedInnerClasses(Cursor *cursor, bool markAndCountOnly);134void writeNestMembers(Cursor *cursor, bool markAndCountOnly);135void writeNameAndSignatureBlock(Cursor *cursor);136void writeMethods(Cursor *cursor, Cursor *lineNumberCursor, Cursor *variableInfoCursor, bool markAndCountOnly);137void writeMethodDebugInfo(ClassFileOracle::MethodIterator *methodIterator, Cursor *lineNumberCursor, Cursor *variableInfoCursor, bool markAndCountOnly, bool existHasDebugInformation);138void writeConstantPoolShapeDescriptions(Cursor *cursor, bool markAndCountOnly);139void writeAnnotationInfo(Cursor *cursor);140void writeSourceDebugExtension(Cursor *cursor);141void writeRecordComponents(Cursor *cursor, bool markAndCountOnly);142void writeStackMaps(Cursor *cursor);143void writeOptionalInfo(Cursor *cursor);144void writeCallSiteData(Cursor *cursor, bool markAndCountOnly);145#if defined(J9VM_OPT_METHOD_HANDLE)146void writeVarHandleMethodTypeLookupTable(Cursor *cursor, bool markAndCountOnly);147#endif /* defined(J9VM_OPT_METHOD_HANDLE) */148void writeStaticSplitTable(Cursor *cursor, bool markAndCountOnly);149void writeSpecialSplitTable(Cursor *cursor, bool markAndCountOnly);150void writeByteCodes(Cursor *cursor, ClassFileOracle::MethodIterator *methodIterator);151U_32 computeNativeSignatureSize(U_8 *methodDescriptor);152void writeNativeSignature(Cursor *cursor, U_8 *methodDescriptor, U_8 nativeArgCount);153void writePermittedSubclasses(Cursor *cursor, bool markAndCountOnly);154#if defined(J9VM_OPT_VALHALLA_VALUE_TYPES)155void writeInjectedInterfaces(Cursor *cursor, bool markAndCountOnly);156#endif /* J9VM_OPT_VALHALLA_VALUE_TYPES */157158BufferManager *_bufferManager;159ClassFileOracle *_classFileOracle;160SRPKeyProducer *_srpKeyProducer;161ConstantPoolMap *_constantPoolMap;162SRPOffsetTable *_srpOffsetTable;163ROMClassCreationContext *_context;164#if defined(J9VM_OPT_VALHALLA_VALUE_TYPES)165InterfaceInjectionInfo *_interfaceInjectionInfo;166#endif /* J9VM_OPT_VALHALLA_VALUE_TYPES */167MethodNotes *_methodNotes;168BuildResult _buildResult;169UDATA _interfacesSRPKey;170UDATA _methodsSRPKey;171UDATA _fieldsSRPKey;172UDATA _cpDescriptionShapeSRPKey;173UDATA _innerClassesSRPKey;174UDATA _enclosedInnerClassesSRPKey;175#if JAVA_SPEC_VERSION >= 11176UDATA _nestMembersSRPKey;177#endif /* JAVA_SPEC_VERSION >= 11 */178UDATA _optionalInfoSRPKey;179UDATA _stackMapsSRPKey;180UDATA _enclosingMethodSRPKey;181UDATA _sourceDebugExtensionSRPKey;182UDATA _intermediateClassDataSRPKey;183UDATA _annotationInfoClassSRPKey;184UDATA _typeAnnotationInfoSRPKey;185UDATA _callSiteDataSRPKey;186#if defined(J9VM_OPT_METHOD_HANDLE)187UDATA _varHandleMethodTypeLookupTableSRPKey;188#endif /* defined(J9VM_OPT_METHOD_HANDLE) */189UDATA _staticSplitTableSRPKey;190UDATA _specialSplitTableSRPKey;191UDATA _recordInfoSRPKey;192UDATA _permittedSubclassesInfoSRPKey;193#if defined(J9VM_OPT_VALHALLA_VALUE_TYPES)194UDATA _injectedInterfaceInfoSRPKey;195#endif /* J9VM_OPT_VALHALLA_VALUE_TYPES */196};197198#endif /* ROMCLASSWRITER_HPP_ */199200201