Path: blob/master/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/opto/InlineTree.java
41161 views
/*1* Copyright (c) 2011, 2020, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*22*/2324package sun.jvm.hotspot.opto;2526import java.util.*;27import java.io.PrintStream;28import sun.jvm.hotspot.ci.*;29import sun.jvm.hotspot.debugger.*;30import sun.jvm.hotspot.runtime.*;31import sun.jvm.hotspot.oops.*;32import sun.jvm.hotspot.utilities.GrowableArray;33import sun.jvm.hotspot.types.*;34import sun.jvm.hotspot.utilities.Observable;35import sun.jvm.hotspot.utilities.Observer;3637public class InlineTree extends VMObject {38static {39VM.registerVMInitializedObserver(new Observer() {40public void update(Observable o, Object data) {41initialize(VM.getVM().getTypeDataBase());42}43});44}4546private static synchronized void initialize(TypeDataBase db) throws WrongTypeException {47Type type = db.lookupType("InlineTree");48callerJvmsField = type.getAddressField("_caller_jvms");49methodField = type.getAddressField("_method");50callerTreeField = type.getAddressField("_caller_tree");51subtreesField = type.getAddressField("_subtrees");52}5354private static AddressField callerJvmsField;55private static AddressField methodField;56private static AddressField callerTreeField;57private static AddressField subtreesField;5859private static StaticBaseConstructor<InlineTree> inlineTreeConstructor = new StaticBaseConstructor<>(InlineTree.class);6061public InlineTree(Address addr) {62super(addr);63}6465public InlineTree callerTree() {66Address addr = callerTreeField.getValue(getAddress());67if (addr == null) return null;6869return new InlineTree(addr);70}7172public ciMethod method() {73return (ciMethod) ciObjectFactory.getMetadata(methodField.getValue(getAddress()));74}7576public JVMState callerJvms() {77return JVMState.create(callerJvmsField.getValue(getAddress()));78}7980public int callerBci() {81JVMState jvms = callerJvms();82return (jvms != null) ? jvms.bci() : -1;83}8485public GrowableArray<InlineTree> subtrees() {86Address addr = getAddress().addOffsetTo(subtreesField.getOffset());8788return GrowableArray.create(addr, inlineTreeConstructor);89}9091public int inlineLevel() {92JVMState jvms = callerJvms();93return (jvms != null) ? jvms.depth() : 0;94}9596public void printImpl(PrintStream st, int indent) {97for (int i = 0; i < indent; i++) st.print(" ");98st.printf(" @ %d ", callerBci());99method().printShortName(st);100st.println();101102GrowableArray<InlineTree> subt = subtrees();103for (int i = 0 ; i < subt.length(); i++) {104subt.at(i).printImpl(st, indent + 2);105}106}107public void print(PrintStream st) {108printImpl(st, 2);109}110111// Count number of nodes in this subtree112public int count() {113int result = 1;114GrowableArray<InlineTree> subt = subtrees();115for (int i = 0 ; i < subt.length(); i++) {116result += subt.at(i).count();117}118return result;119}120121public void dumpReplayData(PrintStream out) {122out.printf(" %d %d ", inlineLevel(), callerBci());123Method method = (Method)method().getMetadata();124Klass holder = method.getMethodHolder();125out.print(holder.getName().asString() + " " +126OopUtilities.escapeString(method.getName().asString()) + " " +127method.getSignature().asString());128129GrowableArray<InlineTree> subt = subtrees();130for (int i = 0 ; i < subt.length(); i++) {131subt.at(i).dumpReplayData(out);132}133}134}135136137