annotate src/share/vm/interpreter/rewriter.hpp @ 4181:319860ae697a

Simplify FrameMap: make offsets of spill slots and outgoing parameters independent so that they can be allocated at the same time, eliminating the separate phases. This makes the separate StackBlock unnecesary. Change CiStackSlot to use byte offsets instead of spill slot index. This makes CiTarget.spillSlotSize unnecessary.
author Christian Wimmer <Christian.Wimmer@Oracle.com>
date Mon, 02 Jan 2012 14:16:08 -0800
parents 2d4b2b833d29
children 1d7922586cf6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1579
jrose
parents: 1552 1565
diff changeset
2 * Copyright (c) 1998, 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: 1138
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1138
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: 1138
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
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1660
diff changeset
25 #ifndef SHARE_VM_INTERPRETER_REWRITER_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1660
diff changeset
26 #define SHARE_VM_INTERPRETER_REWRITER_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1660
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1660
diff changeset
28 #include "memory/allocation.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1660
diff changeset
29 #include "runtime/handles.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1660
diff changeset
30 #include "utilities/growableArray.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1660
diff changeset
31
0
a61af66fc99e Initial load
duke
parents:
diff changeset
32 // The Rewriter adds caches to the constant pool and rewrites bytecode indices
a61af66fc99e Initial load
duke
parents:
diff changeset
33 // pointing into the constant pool for better interpreter performance.
a61af66fc99e Initial load
duke
parents:
diff changeset
34
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 0
diff changeset
35 class Rewriter: public StackObj {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
36 private:
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 0
diff changeset
37 instanceKlassHandle _klass;
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 0
diff changeset
38 constantPoolHandle _pool;
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 0
diff changeset
39 objArrayHandle _methods;
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 0
diff changeset
40 intArray _cp_map;
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 0
diff changeset
41 intStack _cp_cache_map;
1660
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1602
diff changeset
42 bool _have_invoke_dynamic;
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 0
diff changeset
43
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 0
diff changeset
44 void init_cp_map(int length) {
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 0
diff changeset
45 _cp_map.initialize(length, -1);
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 0
diff changeset
46 // Choose an initial value large enough that we don't get frequent
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 0
diff changeset
47 // calls to grow().
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 0
diff changeset
48 _cp_cache_map.initialize(length / 2);
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 0
diff changeset
49 }
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 0
diff changeset
50 int cp_entry_to_cp_cache(int i) { assert(has_cp_cache(i), "oob"); return _cp_map[i]; }
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 0
diff changeset
51 bool has_cp_cache(int i) { return (uint)i < (uint)_cp_map.length() && _cp_map[i] >= 0; }
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 0
diff changeset
52 int maybe_add_cp_cache_entry(int i) { return has_cp_cache(i) ? _cp_map[i] : add_cp_cache_entry(i); }
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 0
diff changeset
53 int add_cp_cache_entry(int cp_index) {
1059
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 844
diff changeset
54 assert((cp_index & _secondary_entry_tag) == 0, "bad tag");
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 0
diff changeset
55 assert(_cp_map[cp_index] == -1, "not twice on same cp_index");
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 0
diff changeset
56 int cache_index = _cp_cache_map.append(cp_index);
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 0
diff changeset
57 _cp_map.at_put(cp_index, cache_index);
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 0
diff changeset
58 assert(cp_entry_to_cp_cache(cp_index) == cache_index, "");
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 0
diff changeset
59 return cache_index;
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 0
diff changeset
60 }
1059
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 844
diff changeset
61 int add_secondary_cp_cache_entry(int main_cpc_entry) {
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 844
diff changeset
62 assert(main_cpc_entry < _cp_cache_map.length(), "must be earlier CP cache entry");
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 844
diff changeset
63 int cache_index = _cp_cache_map.append(main_cpc_entry | _secondary_entry_tag);
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 844
diff changeset
64 return cache_index;
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 844
diff changeset
65 }
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 0
diff changeset
66
1660
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1602
diff changeset
67 // Access the contents of _cp_cache_map to determine CP cache layout.
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1602
diff changeset
68 int cp_cache_entry_pool_index(int cache_index) {
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1602
diff changeset
69 int cp_index = _cp_cache_map[cache_index];
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1602
diff changeset
70 if ((cp_index & _secondary_entry_tag) != 0)
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1602
diff changeset
71 return -1;
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1602
diff changeset
72 else
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1602
diff changeset
73 return cp_index;
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1602
diff changeset
74 }
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1602
diff changeset
75 int cp_cache_secondary_entry_main_index(int cache_index) {
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1602
diff changeset
76 int cp_index = _cp_cache_map[cache_index];
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1602
diff changeset
77 if ((cp_index & _secondary_entry_tag) == 0)
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1602
diff changeset
78 return -1;
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1602
diff changeset
79 else
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1602
diff changeset
80 return (cp_index - _secondary_entry_tag);
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1602
diff changeset
81 }
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1602
diff changeset
82
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 0
diff changeset
83 // All the work goes in here:
1138
dd57230ba8fe 6893268: additional dynamic language related optimizations in C2
twisti
parents: 1059
diff changeset
84 Rewriter(instanceKlassHandle klass, constantPoolHandle cpool, objArrayHandle methods, TRAPS);
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 0
diff changeset
85
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 0
diff changeset
86 void compute_index_maps();
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 0
diff changeset
87 void make_constant_pool_cache(TRAPS);
3404
2d4b2b833d29 7033141: assert(has_cp_cache(i)) failed: oob
coleenp
parents: 1972
diff changeset
88 void scan_method(methodOop m, bool reverse = false);
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 0
diff changeset
89 void rewrite_Object_init(methodHandle m, TRAPS);
3404
2d4b2b833d29 7033141: assert(has_cp_cache(i)) failed: oob
coleenp
parents: 1972
diff changeset
90 void rewrite_member_reference(address bcp, int offset, bool reverse = false);
2d4b2b833d29 7033141: assert(has_cp_cache(i)) failed: oob
coleenp
parents: 1972
diff changeset
91 void rewrite_invokedynamic(address bcp, int offset, bool reverse = false);
2d4b2b833d29 7033141: assert(has_cp_cache(i)) failed: oob
coleenp
parents: 1972
diff changeset
92 void maybe_rewrite_ldc(address bcp, int offset, bool is_wide, bool reverse = false);
2d4b2b833d29 7033141: assert(has_cp_cache(i)) failed: oob
coleenp
parents: 1972
diff changeset
93 // Revert bytecodes in case of an exception.
2d4b2b833d29 7033141: assert(has_cp_cache(i)) failed: oob
coleenp
parents: 1972
diff changeset
94 void restore_bytecodes();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
95
3404
2d4b2b833d29 7033141: assert(has_cp_cache(i)) failed: oob
coleenp
parents: 1972
diff changeset
96 static methodHandle rewrite_jsrs(methodHandle m, TRAPS);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
97 public:
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 0
diff changeset
98 // Driver routine:
0
a61af66fc99e Initial load
duke
parents:
diff changeset
99 static void rewrite(instanceKlassHandle klass, TRAPS);
1138
dd57230ba8fe 6893268: additional dynamic language related optimizations in C2
twisti
parents: 1059
diff changeset
100 static void rewrite(instanceKlassHandle klass, constantPoolHandle cpool, objArrayHandle methods, TRAPS);
1059
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 844
diff changeset
101
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 844
diff changeset
102 enum {
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 844
diff changeset
103 _secondary_entry_tag = nth_bit(30)
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 844
diff changeset
104 };
3404
2d4b2b833d29 7033141: assert(has_cp_cache(i)) failed: oob
coleenp
parents: 1972
diff changeset
105
2d4b2b833d29 7033141: assert(has_cp_cache(i)) failed: oob
coleenp
parents: 1972
diff changeset
106 // Second pass, not gated by is_rewritten flag
2d4b2b833d29 7033141: assert(has_cp_cache(i)) failed: oob
coleenp
parents: 1972
diff changeset
107 static void relocate_and_link(instanceKlassHandle klass, TRAPS);
2d4b2b833d29 7033141: assert(has_cp_cache(i)) failed: oob
coleenp
parents: 1972
diff changeset
108 // JSR292 version to call with it's own methods.
2d4b2b833d29 7033141: assert(has_cp_cache(i)) failed: oob
coleenp
parents: 1972
diff changeset
109 static void relocate_and_link(instanceKlassHandle klass,
2d4b2b833d29 7033141: assert(has_cp_cache(i)) failed: oob
coleenp
parents: 1972
diff changeset
110 objArrayHandle methods, TRAPS);
2d4b2b833d29 7033141: assert(has_cp_cache(i)) failed: oob
coleenp
parents: 1972
diff changeset
111
0
a61af66fc99e Initial load
duke
parents:
diff changeset
112 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1660
diff changeset
113
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1660
diff changeset
114 #endif // SHARE_VM_INTERPRETER_REWRITER_HPP