View Javadoc
1   /*
2    * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
3    * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4    *
5    * This code is free software; you can redistribute it and/or modify it
6    * under the terms of the GNU General Public License version 2 only, as
7    * published by the Free Software Foundation.
8    *
9    * This code is distributed in the hope that it will be useful, but WITHOUT
10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11   * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12   * version 2 for more details (a copy is included in the LICENSE file that
13   * accompanied this code).
14   *
15   * You should have received a copy of the GNU General Public License version
16   * 2 along with this work; if not, write to the Free Software Foundation,
17   * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18   *
19   * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20   * or visit www.oracle.com if you need additional information or have any
21   * questions.
22   *
23   */
24  
25  package sun.jvm.hotspot.ci;
26  
27  import java.io.PrintStream;
28  import java.util.*;
29  import sun.jvm.hotspot.debugger.*;
30  import sun.jvm.hotspot.runtime.*;
31  import sun.jvm.hotspot.oops.*;
32  import sun.jvm.hotspot.opto.*;
33  import sun.jvm.hotspot.compiler.CompileTask;
34  import sun.jvm.hotspot.prims.JvmtiExport;
35  import sun.jvm.hotspot.types.*;
36  import sun.jvm.hotspot.utilities.GrowableArray;
37  
38  public class ciEnv extends VMObject {
39    static {
40      VM.registerVMInitializedObserver(new Observer() {
41          public void update(Observable o, Object data) {
42            initialize(VM.getVM().getTypeDataBase());
43          }
44        });
45    }
46  
47    private static synchronized void initialize(TypeDataBase db) throws WrongTypeException {
48      Type type      = db.lookupType("ciEnv");
49      dependenciesField = type.getAddressField("_dependencies");
50      factoryField = type.getAddressField("_factory");
51      compilerDataField = type.getAddressField("_compiler_data");
52      taskField = type.getAddressField("_task");
53      systemDictionaryModificationCounterField = new CIntField(type.getCIntegerField("_system_dictionary_modification_counter"), 0);
54    }
55  
56    private static AddressField dependenciesField;
57    private static AddressField factoryField;
58    private static AddressField compilerDataField;
59    private static AddressField taskField;
60    private static CIntField systemDictionaryModificationCounterField;
61  
62    public ciEnv(Address addr) {
63      super(addr);
64    }
65  
66    public Compile compilerData() {
67      return new Compile(compilerDataField.getValue(this.getAddress()));
68    }
69  
70    public ciObjectFactory factory() {
71      return new ciObjectFactory(factoryField.getValue(this.getAddress()));
72    }
73  
74    public CompileTask task() {
75      return new CompileTask(taskField.getValue(this.getAddress()));
76    }
77  
78    public void dumpReplayData(PrintStream out) {
79      out.println("JvmtiExport can_access_local_variables " +
80                  (JvmtiExport.canAccessLocalVariables() ? '1' : '0'));
81      out.println("JvmtiExport can_hotswap_or_post_breakpoint " +
82                  (JvmtiExport.canHotswapOrPostBreakpoint() ? '1' : '0'));
83      out.println("JvmtiExport can_post_on_exceptions " +
84                  (JvmtiExport.canPostOnExceptions() ? '1' : '0'));
85  
86      GrowableArray<ciMetadata> objects = factory().objects();
87      out.println("# " + objects.length() + " ciObject found");
88      for (int i = 0; i < objects.length(); i++) {
89        ciMetadata o = objects.at(i);
90        out.println("# ciMetadata" + i + " @ " + o);
91        o.dumpReplayData(out);
92      }
93      CompileTask task = task();
94      Method method = task.method();
95      int entryBci = task.osrBci();
96      int compLevel = task.compLevel();
97      Klass holder = method.getMethodHolder();
98      out.println("compile " + holder.getName().asString() + " " +
99                  OopUtilities.escapeString(method.getName().asString()) + " " +
100                 method.getSignature().asString() + " " +
101                 entryBci + " " + compLevel);
102   }
103 }