Path: blob/master/runtime/compiler/compile/J9AliasBuilder.cpp
6000 views
/*******************************************************************************1* Copyright (c) 2000, 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#include "compile/AliasBuilder.hpp"23#include "compile/Compilation.hpp"24#include "compile/SymbolReferenceTable.hpp"25#include "env/CompilerEnv.hpp"26#include "env/TRMemory.hpp"27#include "il/SymbolReference.hpp"28#include "il/Node.hpp"29#include "il/Node_inlines.hpp"30#include "il/ILOpCodes.hpp"31#include "infra/BitVector.hpp"323334J9::AliasBuilder::AliasBuilder(TR::SymbolReferenceTable *symRefTab, size_t sizeHint, TR::Compilation *c) :35OMR::AliasBuilderConnector(symRefTab, sizeHint, c),36_userFieldSymRefNumbers(c->trMemory(), _numNonUserFieldClasses),37_tenantDataMetaSymRefs(sizeHint, c->trMemory(), heapAlloc, growable),38_callSiteTableEntrySymRefs(sizeHint, c->trMemory(), heapAlloc, growable),39_unresolvedShadowSymRefs(sizeHint, c->trMemory(), heapAlloc, growable),40_immutableConstructorDefAliases(c->trMemory(), _numImmutableClasses),41_methodTypeTableEntrySymRefs(sizeHint, c->trMemory(), heapAlloc, growable)42{43for (int32_t i = 0; i < _numNonUserFieldClasses; i++)44_userFieldSymRefNumbers[i] = new (trHeapMemory()) TR_BitVector(sizeHint, c->trMemory(), heapAlloc, growable);45}464748TR_BitVector *49J9::AliasBuilder::methodAliases(TR::SymbolReference *symRef)50{51static bool newImmutableAlias = feGetEnv("TR_noNewImmutableAlias") == NULL;52static bool newUserFieldAlias = feGetEnv("TR_noNewUserFieldAlias") == NULL;5354if (symRef->isUnresolved() || !newImmutableAlias || !symRefTab()->hasImmutable() || !newUserFieldAlias || !symRefTab()->hasUserField())55{56if (comp()->getOption(TR_TraceAliases))57traceMsg(comp(), "For method sym %d default aliases\n", symRef->getReferenceNumber());58return &defaultMethodDefAliases();59}6061TR::ResolvedMethodSymbol *method = symRef->getSymbol()->castToResolvedMethodSymbol();6263while (true)64{65int32_t id = symRefTab()->immutableConstructorId(method);66if (id >= 0)67return _immutableConstructorDefAliases[id];6869id = symRefTab()->userFieldMethodId(method);70if (id >= 0)71{72if (comp()->getOption(TR_TraceAliases))73{74traceMsg(comp(), "For method sym %d aliases\n", symRef->getReferenceNumber());75_userFieldMethodDefAliases[id]->print(comp());76traceMsg(comp(), "\n");77}78return _userFieldMethodDefAliases[id];79}8081if (symRef->isInitMethod())82{83TR_BitVector *result = NULL;84TR_BitVector *allocatedResult = NULL;85for (TR_OpaqueClassBlock *clazz = method->getResolvedMethod()->containingClass(); clazz; clazz = comp()->fe()->getSuperClass(clazz))86{87int32_t clazzNameLen;88char *clazzName = TR::Compiler->cls.classNameChars(comp(), clazz, clazzNameLen);8990ListElement<TR_ImmutableInfo> *immutableClassInfoElem = symRefTab()->immutableInfo().getListHead();91while (immutableClassInfoElem)92{93TR_ImmutableInfo *immutableClassInfo = immutableClassInfoElem->getData();94int32_t immutableClassNameLen;95char *immutableClassName = TR::Compiler->cls.classNameChars(comp(), immutableClassInfo->_clazz, immutableClassNameLen);96if ((immutableClassNameLen == clazzNameLen) &&97!strncmp(immutableClassName, clazzName, clazzNameLen))98{99TR_BitVector *symrefsToInclude = immutableClassInfo->_immutableConstructorDefAliases;100if (comp()->getOption(TR_TraceAliases))101{102traceMsg(comp(), "Method sym %d includes aliases for %.*s.<init>\n", symRef->getReferenceNumber(), clazzNameLen, clazzName);103symrefsToInclude->print(comp());104traceMsg(comp(), "\n");105}106if (allocatedResult)107*allocatedResult |= *symrefsToInclude;108else if (result)109{110allocatedResult = new (comp()->trHeapMemory()) TR_BitVector(symRefTab()->getNumSymRefs(), comp()->trMemory(), heapAlloc, growable);111*allocatedResult = *result;112*allocatedResult |= *symrefsToInclude;113result = allocatedResult;114}115else116result = symrefsToInclude;117}118immutableClassInfoElem = immutableClassInfoElem->getNextElement();119}120}121if (result)122return result;123}124125method = symRef->getOwningMethodSymbol(_compilation);126mcount_t method_index = ((TR::ResolvedMethodSymbol *)method)->getResolvedMethodIndex();127if (method_index == JITTED_METHOD_INDEX)128break;129130// get symbol reference for the owning method131symRef = _compilation->getResolvedMethodSymbolReference(method_index);132if (!symRef)133break;134}135136if (comp()->getOption(TR_TraceAliases))137{138traceMsg(comp(), "For method sym %d default aliases without immutable\n", symRef->getReferenceNumber());139defaultMethodDefAliasesWithoutImmutable().print(comp());140traceMsg(comp(), "\n");141}142143return &defaultMethodDefAliasesWithoutImmutable();144145}146147148void149J9::AliasBuilder::createAliasInfo()150{151TR::StackMemoryRegion stackMemoryRegion(*trMemory());152self()->unresolvedShadowSymRefs().pack();153addressShadowSymRefs().pack();154genericIntShadowSymRefs().pack();155genericIntArrayShadowSymRefs().pack();156genericIntNonArrayShadowSymRefs().pack();157intShadowSymRefs().pack();158nonIntPrimitiveShadowSymRefs().pack();159addressStaticSymRefs().pack();160intStaticSymRefs().pack();161nonIntPrimitiveStaticSymRefs().pack();162methodSymRefs().pack();163unsafeSymRefNumbers().pack();164unsafeArrayElementSymRefs().pack();165gcSafePointSymRefNumbers().pack();166167self()->tenantDataMetaSymRefs().pack();168169int32_t i;170171for (i = 0; i < _numImmutableClasses; i++)172{173symRefTab()->immutableSymRefNumbers()[i]->pack();174}175176ListElement<TR_ImmutableInfo> *immutableClassInfoElem = symRefTab()->immutableInfo().getListHead();177while (immutableClassInfoElem)178{179TR_ImmutableInfo *immutableClassInfo = immutableClassInfoElem->getData();180immutableClassInfo->_immutableSymRefNumbers->pack();181immutableClassInfoElem = immutableClassInfoElem->getNextElement();182}183184for (i = 0; i < _numNonUserFieldClasses; i++)185{186self()->userFieldSymRefNumbers()[i]->pack();187}188189setCatchLocalUseSymRefs();190191defaultMethodDefAliases().init(symRefTab()->getNumSymRefs(), comp()->trMemory(), heapAlloc, growable);192defaultMethodDefAliases() |= addressShadowSymRefs();193defaultMethodDefAliases() |= intShadowSymRefs();194defaultMethodDefAliases() |= nonIntPrimitiveShadowSymRefs();195defaultMethodDefAliases() |= arrayElementSymRefs();196defaultMethodDefAliases() |= arrayletElementSymRefs();197defaultMethodDefAliases() |= addressStaticSymRefs();198defaultMethodDefAliases() |= intStaticSymRefs();199defaultMethodDefAliases() |= nonIntPrimitiveStaticSymRefs();200defaultMethodDefAliases() |= unsafeSymRefNumbers();201defaultMethodDefAliases() |= gcSafePointSymRefNumbers();202203defaultMethodDefAliases() |= self()->tenantDataMetaSymRefs();204205defaultMethodDefAliasesWithoutImmutable().init(symRefTab()->getNumSymRefs(), comp()->trMemory(), heapAlloc, growable);206defaultMethodDefAliasesWithoutUserField().init(symRefTab()->getNumSymRefs(), comp()->trMemory(), heapAlloc, growable);207208defaultMethodDefAliasesWithoutUserField() |= defaultMethodDefAliases();209210for (i = 0; i < _numNonUserFieldClasses; i++)211{212defaultMethodDefAliasesWithoutUserField() -= *(self()->userFieldSymRefNumbers()[i]);213}214215defaultMethodDefAliasesWithoutImmutable() |= defaultMethodDefAliases();216217for (i = 0; i < _numImmutableClasses; i++)218{219defaultMethodDefAliasesWithoutImmutable() -= *(symRefTab()->immutableSymRefNumbers()[i]);220}221222immutableClassInfoElem = symRefTab()->immutableInfo().getListHead();223while (immutableClassInfoElem)224{225TR_ImmutableInfo *immutableClassInfo = immutableClassInfoElem->getData();226defaultMethodDefAliasesWithoutImmutable() -= *(immutableClassInfo->_immutableSymRefNumbers);227immutableClassInfoElem = immutableClassInfoElem->getNextElement();228}229230for (i = 0; i < _numImmutableClasses; i++)231{232immutableConstructorDefAliases()[i] = new (trHeapMemory()) TR_BitVector(symRefTab()->getNumSymRefs(), comp()->trMemory(), heapAlloc, growable);233*(immutableConstructorDefAliases()[i]) = defaultMethodDefAliasesWithoutImmutable();234*(immutableConstructorDefAliases()[i]) |= *(symRefTab()->immutableSymRefNumbers()[i]);235}236237for (i = 0; i < _numNonUserFieldClasses; i++)238{239userFieldMethodDefAliases()[i] = new (trHeapMemory()) TR_BitVector(symRefTab()->getNumSymRefs(), comp()->trMemory(), heapAlloc, growable);240*(userFieldMethodDefAliases()[i]) = defaultMethodDefAliasesWithoutUserField();241}242243immutableClassInfoElem = symRefTab()->immutableInfo().getListHead();244while (immutableClassInfoElem)245{246TR_ImmutableInfo *immutableClassInfo = immutableClassInfoElem->getData();247immutableClassInfo->_immutableConstructorDefAliases = new (trHeapMemory()) TR_BitVector(symRefTab()->getNumSymRefs(), comp()->trMemory(), heapAlloc, growable);248*(immutableClassInfo->_immutableConstructorDefAliases) = defaultMethodDefAliasesWithoutImmutable();249*(immutableClassInfo->_immutableConstructorDefAliases) |= *(immutableClassInfo->_immutableSymRefNumbers);250immutableClassInfoElem = immutableClassInfoElem->getNextElement();251}252253defaultMethodUseAliases().init(symRefTab()->getNumSymRefs(), comp()->trMemory(), heapAlloc, growable);254defaultMethodUseAliases() |= defaultMethodDefAliases();255defaultMethodUseAliases() |= catchLocalUseSymRefs();256257if (symRefTab()->element(TR::SymbolReferenceTable::contiguousArraySizeSymbol))258defaultMethodUseAliases().set(symRefTab()->element(TR::SymbolReferenceTable::contiguousArraySizeSymbol)->getReferenceNumber());259if (symRefTab()->element(TR::SymbolReferenceTable::discontiguousArraySizeSymbol))260defaultMethodUseAliases().set(symRefTab()->element(TR::SymbolReferenceTable::discontiguousArraySizeSymbol)->getReferenceNumber());261if (symRefTab()->element(TR::SymbolReferenceTable::vftSymbol))262defaultMethodUseAliases().set(symRefTab()->element(TR::SymbolReferenceTable::vftSymbol)->getReferenceNumber());263264methodsThatMayThrow().init(symRefTab()->getNumSymRefs(), comp()->trMemory(), heapAlloc, growable);265methodsThatMayThrow() |= methodSymRefs();266267static TR_RuntimeHelper helpersThatMayThrow[] =268{269TR_typeCheckArrayStore,270TR_arrayStoreException,271TR_arrayBoundsCheck,272TR_checkCast,273TR_checkCastForArrayStore,274TR_divCheck,275TR_aThrow,276TR_aNewArray,277TR_monitorExit,278TR_newObject,279TR_newObjectNoZeroInit,280TR_acmpeqHelper,281TR_acmpneHelper,282TR_newValue,283TR_newValueNoZeroInit,284TR_newArray,285TR_nullCheck,286TR_methodTypeCheck,287TR_incompatibleReceiver,288TR_IncompatibleClassChangeError,289TR_multiANewArray290};291292for (i = 0; i < (sizeof(helpersThatMayThrow) / 4); ++i)293if (symRefTab()->element(helpersThatMayThrow[i]))294methodsThatMayThrow().set(helpersThatMayThrow[i]);295296static TR::SymbolReferenceTable::CommonNonhelperSymbol nonhelpersThatMayThrow[] =297{298TR::SymbolReferenceTable::resolveCheckSymbol299};300301for (i = 0; i < (sizeof(nonhelpersThatMayThrow) / 4); ++i)302if (symRefTab()->element(helpersThatMayThrow[i]))303methodsThatMayThrow().set(symRefTab()->getNumHelperSymbols() + nonhelpersThatMayThrow[i]);304305for (CallAliases * callAliases = _callAliases.getFirst(); callAliases; callAliases = callAliases->getNext())306callAliases->_methodSymbol->setHasVeryRefinedAliasSets(false);307_callAliases.setFirst(0);308309if (comp()->getOption(TR_TraceAliases))310{311comp()->getDebug()->printAliasInfo(comp()->getOutFile(), symRefTab());312}313314}315316317