src/share/vm/ci/ciObjectFactory.hpp

Mon, 12 Nov 2012 14:03:53 -0800

author
minqi
date
Mon, 12 Nov 2012 14:03:53 -0800
changeset 4267
bd7a7ce2e264
parent 4037
da91efe96a93
child 5628
f98f5d48f511
permissions
-rw-r--r--

6830717: replay of compilations would help with debugging
Summary: When java process crashed in compiler thread, repeat the compilation process will help finding root cause. This is done with using SA dump application class data and replay data from core dump, then use debug version of jvm to recompile the problematic java method.
Reviewed-by: kvn, twisti, sspitsyn
Contributed-by: yumin.qi@oracle.com

duke@435 1 /*
coleenp@4037 2 * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
duke@435 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@435 4 *
duke@435 5 * This code is free software; you can redistribute it and/or modify it
duke@435 6 * under the terms of the GNU General Public License version 2 only, as
duke@435 7 * published by the Free Software Foundation.
duke@435 8 *
duke@435 9 * This code is distributed in the hope that it will be useful, but WITHOUT
duke@435 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@435 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@435 12 * version 2 for more details (a copy is included in the LICENSE file that
duke@435 13 * accompanied this code).
duke@435 14 *
duke@435 15 * You should have received a copy of the GNU General Public License version
duke@435 16 * 2 along with this work; if not, write to the Free Software Foundation,
duke@435 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@435 18 *
trims@1907 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
trims@1907 20 * or visit www.oracle.com if you need additional information or have any
trims@1907 21 * questions.
duke@435 22 *
duke@435 23 */
duke@435 24
stefank@2314 25 #ifndef SHARE_VM_CI_CIOBJECTFACTORY_HPP
stefank@2314 26 #define SHARE_VM_CI_CIOBJECTFACTORY_HPP
stefank@2314 27
stefank@2314 28 #include "ci/ciClassList.hpp"
stefank@2314 29 #include "ci/ciObject.hpp"
stefank@2314 30 #include "utilities/growableArray.hpp"
stefank@2314 31
duke@435 32 // ciObjectFactory
duke@435 33 //
duke@435 34 // This class handles requests for the creation of new instances
duke@435 35 // of ciObject and its subclasses. It contains a caching mechanism
duke@435 36 // which ensures that for each oop, at most one ciObject is created.
duke@435 37 // This invariant allows efficient implementation of ciObject.
duke@435 38 class ciObjectFactory : public ResourceObj {
never@3138 39 friend class VMStructs;
never@3138 40 friend class ciEnv;
never@3138 41
duke@435 42 private:
duke@435 43 static volatile bool _initialized;
coleenp@4037 44 static GrowableArray<ciMetadata*>* _shared_ci_metadata;
duke@435 45 static ciSymbol* _shared_ci_symbols[];
duke@435 46 static int _shared_ident_limit;
duke@435 47
duke@435 48 Arena* _arena;
coleenp@4037 49 GrowableArray<ciMetadata*>* _ci_metadata;
duke@435 50 GrowableArray<ciMethod*>* _unloaded_methods;
duke@435 51 GrowableArray<ciKlass*>* _unloaded_klasses;
jrose@1957 52 GrowableArray<ciInstance*>* _unloaded_instances;
duke@435 53 GrowableArray<ciReturnAddress*>* _return_addresses;
coleenp@2497 54 GrowableArray<ciSymbol*>* _symbols; // keep list of symbols created
duke@435 55 int _next_ident;
duke@435 56
duke@435 57 public:
duke@435 58 struct NonPermObject : public ResourceObj {
duke@435 59 ciObject* _object;
duke@435 60 NonPermObject* _next;
duke@435 61
duke@435 62 inline NonPermObject(NonPermObject* &bucket, oop key, ciObject* object);
duke@435 63 ciObject* object() { return _object; }
duke@435 64 NonPermObject* &next() { return _next; }
duke@435 65 };
duke@435 66 private:
duke@435 67 enum { NON_PERM_BUCKETS = 61 };
duke@435 68 NonPermObject* _non_perm_bucket[NON_PERM_BUCKETS];
duke@435 69 int _non_perm_count;
duke@435 70
coleenp@4037 71 int find(Metadata* key, GrowableArray<ciMetadata*>* objects);
coleenp@4037 72 bool is_found_at(int index, Metadata* key, GrowableArray<ciMetadata*>* objects);
coleenp@4037 73 void insert(int index, ciMetadata* obj, GrowableArray<ciMetadata*>* objects);
coleenp@4037 74
duke@435 75 ciObject* create_new_object(oop o);
coleenp@4037 76 ciMetadata* create_new_object(Metadata* o);
coleenp@4037 77
duke@435 78 static bool is_equal(NonPermObject* p, oop key) {
duke@435 79 return p->object()->get_oop() == key;
duke@435 80 }
duke@435 81
duke@435 82 NonPermObject* &find_non_perm(oop key);
duke@435 83 void insert_non_perm(NonPermObject* &where, oop key, ciObject* obj);
duke@435 84
coleenp@4037 85 void init_ident_of(ciBaseObject* obj);
duke@435 86
duke@435 87 Arena* arena() { return _arena; }
duke@435 88
duke@435 89 void print_contents_impl();
duke@435 90
jrose@1957 91 ciInstance* get_unloaded_instance(ciInstanceKlass* klass);
jrose@1957 92
duke@435 93 public:
duke@435 94 static bool is_initialized() { return _initialized; }
duke@435 95
duke@435 96 static void initialize();
duke@435 97 void init_shared_objects();
coleenp@2497 98 void remove_symbols();
duke@435 99
duke@435 100 ciObjectFactory(Arena* arena, int expected_size);
duke@435 101
duke@435 102 // Get the ciObject corresponding to some oop.
duke@435 103 ciObject* get(oop key);
coleenp@4037 104 ciMetadata* get_metadata(Metadata* key);
coleenp@2497 105 ciSymbol* get_symbol(Symbol* key);
coleenp@2497 106
duke@435 107 // Get the ciSymbol corresponding to one of the vmSymbols.
duke@435 108 static ciSymbol* vm_symbol_at(int index);
duke@435 109
duke@435 110 // Get the ciMethod representing an unloaded/unfound method.
duke@435 111 ciMethod* get_unloaded_method(ciInstanceKlass* holder,
duke@435 112 ciSymbol* name,
twisti@3197 113 ciSymbol* signature,
twisti@3197 114 ciInstanceKlass* accessor);
duke@435 115
duke@435 116 // Get a ciKlass representing an unloaded klass.
duke@435 117 ciKlass* get_unloaded_klass(ciKlass* accessing_klass,
duke@435 118 ciSymbol* name,
duke@435 119 bool create_if_not_found);
duke@435 120
jrose@1957 121 // Get a ciInstance representing an unresolved klass mirror.
jrose@1957 122 ciInstance* get_unloaded_klass_mirror(ciKlass* type);
jrose@1957 123
jrose@1957 124 // Get a ciInstance representing an unresolved method handle constant.
jrose@1957 125 ciInstance* get_unloaded_method_handle_constant(ciKlass* holder,
jrose@1957 126 ciSymbol* name,
jrose@1957 127 ciSymbol* signature,
jrose@1957 128 int ref_kind);
jrose@1957 129
jrose@1957 130 // Get a ciInstance representing an unresolved method type constant.
jrose@1957 131 ciInstance* get_unloaded_method_type_constant(ciSymbol* signature);
jrose@1957 132
duke@435 133
duke@435 134 // Get the ciMethodData representing the methodData for a method
duke@435 135 // with none.
duke@435 136 ciMethodData* get_empty_methodData();
duke@435 137
duke@435 138 ciReturnAddress* get_return_address(int bci);
duke@435 139
minqi@4267 140 GrowableArray<ciMetadata*>* get_ci_metadata() const { return _ci_metadata; }
coleenp@4037 141 // RedefineClasses support
coleenp@4037 142 void metadata_do(void f(Metadata*));
coleenp@4037 143
duke@435 144 void print_contents();
duke@435 145 void print();
duke@435 146 };
stefank@2314 147
stefank@2314 148 #endif // SHARE_VM_CI_CIOBJECTFACTORY_HPP

mercurial