Path: blob/master/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/opto/JVMState.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.io.PrintStream;27import java.util.*;28import sun.jvm.hotspot.debugger.*;29import sun.jvm.hotspot.runtime.*;30import sun.jvm.hotspot.oops.*;31import sun.jvm.hotspot.ci.*;32import sun.jvm.hotspot.types.*;33import sun.jvm.hotspot.utilities.Observable;34import sun.jvm.hotspot.utilities.Observer;3536public class JVMState extends VMObject {37static {38VM.registerVMInitializedObserver(new Observer() {39public void update(Observable o, Object data) {40initialize(VM.getVM().getTypeDataBase());41}42});43}4445private static synchronized void initialize(TypeDataBase db) throws WrongTypeException {46Type type = db.lookupType("JVMState");47mapField = type.getAddressField("_map");48methodField = type.getAddressField("_method");49bciField = new CIntField(type.getCIntegerField("_bci"), 0);50spField = new CIntField(type.getCIntegerField("_sp"), 0);51endoffField = new CIntField(type.getCIntegerField("_endoff"), 0);52try {53scloffField = new CIntField(type.getCIntegerField("_scloff"), 0);54} catch (Exception e) {55}56monoffField = new CIntField(type.getCIntegerField("_monoff"), 0);57stkoffField = new CIntField(type.getCIntegerField("_stkoff"), 0);58locoffField = new CIntField(type.getCIntegerField("_locoff"), 0);59depthField = new CIntField(type.getCIntegerField("_depth"), 0);60callerField = type.getAddressField("_caller");61}6263private static AddressField mapField;64private static AddressField methodField;65private static CIntField bciField;66private static CIntField spField;67private static CIntField endoffField;68private static CIntField scloffField;69private static CIntField monoffField;70private static CIntField stkoffField;71private static CIntField locoffField;72private static CIntField depthField;73private static AddressField callerField;7475public static JVMState create(Address addr) {76if (addr == null) return null;77return new JVMState(addr);78}7980public JVMState(Address addr) {81super(addr);82}8384public ciMethod method() {85return (ciMethod) ciObjectFactory.getMetadata(methodField.getValue(getAddress()));86}8788public int bci() {89return (int)bciField.getValue(getAddress());90}9192public int depth() {93return (int)depthField.getValue(getAddress());94}9596public JVMState caller() {97return create(callerField.getValue(getAddress()));98}99100public void dumpSpec(PrintStream out) {101ciMethod m = method();102if (m != null) {103Method meth = m.method();104out.print(" " + meth.getMethodHolder().getName().asString().replace('/', '.') + "::" +105meth.getName().asString() + " @ bci:" + bci());106} else {107out.print(" runtime stub");108}109if (caller() != null) caller().dumpSpec(out);110}111}112113114