annotate src/share/vm/code/codeCache.hpp @ 1721:413ad0331a0c

6977924: Changes for 6975078 produce build error with certain gcc versions Summary: The changes introduced for 6975078 assign badHeapOopVal to the _allocation field in the ResourceObj class. In 32 bit linux builds with certain versions of gcc this assignment will be flagged as an error while compiling allocation.cpp. In 32 bit builds the constant value badHeapOopVal (which is cast to an intptr_t) is negative. The _allocation field is typed as an unsigned intptr_t and gcc catches this as an error. Reviewed-by: jcoomes, ysr, phh
author johnc
date Wed, 18 Aug 2010 10:59:06 -0700
parents 2a47bd84841f
children 1e9a9d2e6509
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1552
diff changeset
2 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1538
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1538
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1538
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 // The CodeCache implements the code cache for various pieces of generated
a61af66fc99e Initial load
duke
parents:
diff changeset
26 // code, e.g., compiled java methods, runtime stubs, transition frames, etc.
a61af66fc99e Initial load
duke
parents:
diff changeset
27 // The entries in the CodeCache are all CodeBlob's.
a61af66fc99e Initial load
duke
parents:
diff changeset
28
a61af66fc99e Initial load
duke
parents:
diff changeset
29 // Implementation:
a61af66fc99e Initial load
duke
parents:
diff changeset
30 // - Each CodeBlob occupies one chunk of memory.
a61af66fc99e Initial load
duke
parents:
diff changeset
31 // - Like the offset table in oldspace the zone has at table for
a61af66fc99e Initial load
duke
parents:
diff changeset
32 // locating a method given a addess of an instruction.
a61af66fc99e Initial load
duke
parents:
diff changeset
33
a61af66fc99e Initial load
duke
parents:
diff changeset
34 class OopClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
35 class DepChange;
a61af66fc99e Initial load
duke
parents:
diff changeset
36
a61af66fc99e Initial load
duke
parents:
diff changeset
37 class CodeCache : AllStatic {
a61af66fc99e Initial load
duke
parents:
diff changeset
38 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
39 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
40 // CodeHeap is malloc()'ed at startup and never deleted during shutdown,
a61af66fc99e Initial load
duke
parents:
diff changeset
41 // so that the generated assembly code is always there when it's needed.
a61af66fc99e Initial load
duke
parents:
diff changeset
42 // This may cause memory leak, but is necessary, for now. See 4423824,
a61af66fc99e Initial load
duke
parents:
diff changeset
43 // 4422213 or 4436291 for details.
a61af66fc99e Initial load
duke
parents:
diff changeset
44 static CodeHeap * _heap;
a61af66fc99e Initial load
duke
parents:
diff changeset
45 static int _number_of_blobs;
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1552
diff changeset
46 static int _number_of_adapters;
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1552
diff changeset
47 static int _number_of_nmethods;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
48 static int _number_of_nmethods_with_dependencies;
a61af66fc99e Initial load
duke
parents:
diff changeset
49 static bool _needs_cache_clean;
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 196
diff changeset
50 static nmethod* _scavenge_root_nmethods; // linked via nm->scavenge_root_link()
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
51 static nmethod* _saved_nmethods; // linked via nm->saved_nmethod_look()
0
a61af66fc99e Initial load
duke
parents:
diff changeset
52
a61af66fc99e Initial load
duke
parents:
diff changeset
53 static void verify_if_often() PRODUCT_RETURN;
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 196
diff changeset
54
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 196
diff changeset
55 static void mark_scavenge_root_nmethods() PRODUCT_RETURN;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 196
diff changeset
56 static void verify_perm_nmethods(CodeBlobClosure* f_or_null) PRODUCT_RETURN;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 196
diff changeset
57
0
a61af66fc99e Initial load
duke
parents:
diff changeset
58 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
59
a61af66fc99e Initial load
duke
parents:
diff changeset
60 // Initialization
a61af66fc99e Initial load
duke
parents:
diff changeset
61 static void initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
62
a61af66fc99e Initial load
duke
parents:
diff changeset
63 // Allocation/administration
a61af66fc99e Initial load
duke
parents:
diff changeset
64 static CodeBlob* allocate(int size); // allocates a new CodeBlob
a61af66fc99e Initial load
duke
parents:
diff changeset
65 static void commit(CodeBlob* cb); // called when the allocated CodeBlob has been filled
a61af66fc99e Initial load
duke
parents:
diff changeset
66 static int alignment_unit(); // guaranteed alignment of all CodeBlobs
a61af66fc99e Initial load
duke
parents:
diff changeset
67 static int alignment_offset(); // guaranteed offset of first CodeBlob byte within alignment unit (i.e., allocation header)
a61af66fc99e Initial load
duke
parents:
diff changeset
68 static void free(CodeBlob* cb); // frees a CodeBlob
a61af66fc99e Initial load
duke
parents:
diff changeset
69 static void flush(); // flushes all CodeBlobs
a61af66fc99e Initial load
duke
parents:
diff changeset
70 static bool contains(void *p); // returns whether p is included
a61af66fc99e Initial load
duke
parents:
diff changeset
71 static void blobs_do(void f(CodeBlob* cb)); // iterates over all CodeBlobs
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 196
diff changeset
72 static void blobs_do(CodeBlobClosure* f); // iterates over all CodeBlobs
0
a61af66fc99e Initial load
duke
parents:
diff changeset
73 static void nmethods_do(void f(nmethod* nm)); // iterates over all nmethods
a61af66fc99e Initial load
duke
parents:
diff changeset
74
a61af66fc99e Initial load
duke
parents:
diff changeset
75 // Lookup
a61af66fc99e Initial load
duke
parents:
diff changeset
76 static CodeBlob* find_blob(void* start);
a61af66fc99e Initial load
duke
parents:
diff changeset
77 static nmethod* find_nmethod(void* start);
a61af66fc99e Initial load
duke
parents:
diff changeset
78
a61af66fc99e Initial load
duke
parents:
diff changeset
79 // Lookup that does not fail if you lookup a zombie method (if you call this, be sure to know
a61af66fc99e Initial load
duke
parents:
diff changeset
80 // what you are doing)
a61af66fc99e Initial load
duke
parents:
diff changeset
81 static CodeBlob* find_blob_unsafe(void* start) {
a61af66fc99e Initial load
duke
parents:
diff changeset
82 CodeBlob* result = (CodeBlob*)_heap->find_start(start);
107
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
83 // this assert is too strong because the heap code will return the
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
84 // heapblock containing start. That block can often be larger than
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
85 // the codeBlob itself. If you look up an address that is within
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
86 // the heapblock but not in the codeBlob you will assert.
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
87 //
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
88 // Most things will not lookup such bad addresses. However
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
89 // AsyncGetCallTrace can see intermediate frames and get that kind
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
90 // of invalid address and so can a developer using hsfind.
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
91 //
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
92 // The more correct answer is to return NULL if blob_contains() returns
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
93 // false.
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
94 // assert(result == NULL || result->blob_contains((address)start), "found wrong CodeBlob");
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
95
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
96 if (result != NULL && !result->blob_contains((address)start)) {
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
97 result = NULL;
93b6525e3b82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 0
diff changeset
98 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
99 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
100 }
a61af66fc99e Initial load
duke
parents:
diff changeset
101
a61af66fc99e Initial load
duke
parents:
diff changeset
102 // Iteration
a61af66fc99e Initial load
duke
parents:
diff changeset
103 static CodeBlob* first();
a61af66fc99e Initial load
duke
parents:
diff changeset
104 static CodeBlob* next (CodeBlob* cb);
a61af66fc99e Initial load
duke
parents:
diff changeset
105 static CodeBlob* alive(CodeBlob *cb);
a61af66fc99e Initial load
duke
parents:
diff changeset
106 static nmethod* alive_nmethod(CodeBlob *cb);
1538
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1202
diff changeset
107 static nmethod* first_nmethod();
bfe29ec02863 6950075: nmethod sweeper should operate concurrently
never
parents: 1202
diff changeset
108 static nmethod* next_nmethod (CodeBlob* cb);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
109 static int nof_blobs() { return _number_of_blobs; }
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1552
diff changeset
110 static int nof_adapters() { return _number_of_adapters; }
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1552
diff changeset
111 static int nof_nmethods() { return _number_of_nmethods; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
112
a61af66fc99e Initial load
duke
parents:
diff changeset
113 // GC support
a61af66fc99e Initial load
duke
parents:
diff changeset
114 static void gc_epilogue();
a61af66fc99e Initial load
duke
parents:
diff changeset
115 static void gc_prologue();
a61af66fc99e Initial load
duke
parents:
diff changeset
116 // If "unloading_occurred" is true, then unloads (i.e., breaks root links
a61af66fc99e Initial load
duke
parents:
diff changeset
117 // to) any unmarked codeBlobs in the cache. Sets "marked_for_unloading"
a61af66fc99e Initial load
duke
parents:
diff changeset
118 // to "true" iff some code got unloaded.
a61af66fc99e Initial load
duke
parents:
diff changeset
119 static void do_unloading(BoolObjectClosure* is_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
120 OopClosure* keep_alive,
a61af66fc99e Initial load
duke
parents:
diff changeset
121 bool unloading_occurred);
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 196
diff changeset
122 static void oops_do(OopClosure* f) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 196
diff changeset
123 CodeBlobToOopClosure oopc(f, /*do_marking=*/ false);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 196
diff changeset
124 blobs_do(&oopc);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 196
diff changeset
125 }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 196
diff changeset
126 static void asserted_non_scavengable_nmethods_do(CodeBlobClosure* f = NULL) PRODUCT_RETURN;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 196
diff changeset
127 static void scavenge_root_nmethods_do(CodeBlobClosure* f);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 196
diff changeset
128
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 196
diff changeset
129 static nmethod* scavenge_root_nmethods() { return _scavenge_root_nmethods; }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 196
diff changeset
130 static void set_scavenge_root_nmethods(nmethod* nm) { _scavenge_root_nmethods = nm; }
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 196
diff changeset
131 static void add_scavenge_root_nmethod(nmethod* nm);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 196
diff changeset
132 static void drop_scavenge_root_nmethod(nmethod* nm);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 196
diff changeset
133 static void prune_scavenge_root_nmethods();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
134
a61af66fc99e Initial load
duke
parents:
diff changeset
135 // Printing/debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
136 static void print() PRODUCT_RETURN; // prints summary
a61af66fc99e Initial load
duke
parents:
diff changeset
137 static void print_internals();
a61af66fc99e Initial load
duke
parents:
diff changeset
138 static void verify(); // verifies the code cache
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 196
diff changeset
139 static void print_trace(const char* event, CodeBlob* cb, int size = 0) PRODUCT_RETURN;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
140
a61af66fc99e Initial load
duke
parents:
diff changeset
141 // The full limits of the codeCache
a61af66fc99e Initial load
duke
parents:
diff changeset
142 static address low_bound() { return (address) _heap->low_boundary(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
143 static address high_bound() { return (address) _heap->high_boundary(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
144
a61af66fc99e Initial load
duke
parents:
diff changeset
145 // Profiling
a61af66fc99e Initial load
duke
parents:
diff changeset
146 static address first_address(); // first address used for CodeBlobs
a61af66fc99e Initial load
duke
parents:
diff changeset
147 static address last_address(); // last address used for CodeBlobs
a61af66fc99e Initial load
duke
parents:
diff changeset
148 static size_t capacity() { return _heap->capacity(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
149 static size_t max_capacity() { return _heap->max_capacity(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
150 static size_t unallocated_capacity() { return _heap->unallocated_capacity(); }
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
151 static bool needs_flushing() { return unallocated_capacity() < CodeCacheFlushingMinimumFreeSpace; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
152
a61af66fc99e Initial load
duke
parents:
diff changeset
153 static bool needs_cache_clean() { return _needs_cache_clean; }
a61af66fc99e Initial load
duke
parents:
diff changeset
154 static void set_needs_cache_clean(bool v) { _needs_cache_clean = v; }
a61af66fc99e Initial load
duke
parents:
diff changeset
155 static void clear_inline_caches(); // clear all inline caches
a61af66fc99e Initial load
duke
parents:
diff changeset
156
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
157 static nmethod* find_and_remove_saved_code(methodOop m);
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
158 static void remove_saved_code(nmethod* nm);
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
159 static void speculatively_disconnect(nmethod* nm);
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 989
diff changeset
160
0
a61af66fc99e Initial load
duke
parents:
diff changeset
161 // Deoptimization
a61af66fc99e Initial load
duke
parents:
diff changeset
162 static int mark_for_deoptimization(DepChange& changes);
a61af66fc99e Initial load
duke
parents:
diff changeset
163 #ifdef HOTSWAP
a61af66fc99e Initial load
duke
parents:
diff changeset
164 static int mark_for_evol_deoptimization(instanceKlassHandle dependee);
a61af66fc99e Initial load
duke
parents:
diff changeset
165 #endif // HOTSWAP
a61af66fc99e Initial load
duke
parents:
diff changeset
166
a61af66fc99e Initial load
duke
parents:
diff changeset
167 static void mark_all_nmethods_for_deoptimization();
a61af66fc99e Initial load
duke
parents:
diff changeset
168 static int mark_for_deoptimization(methodOop dependee);
a61af66fc99e Initial load
duke
parents:
diff changeset
169 static void make_marked_nmethods_zombies();
a61af66fc99e Initial load
duke
parents:
diff changeset
170 static void make_marked_nmethods_not_entrant();
a61af66fc99e Initial load
duke
parents:
diff changeset
171
a61af66fc99e Initial load
duke
parents:
diff changeset
172 // tells how many nmethods have dependencies
a61af66fc99e Initial load
duke
parents:
diff changeset
173 static int number_of_nmethods_with_dependencies();
a61af66fc99e Initial load
duke
parents:
diff changeset
174 };