comparison src/cpu/x86/vm/vtableStubs_x86_32.cpp @ 6725:da91efe96a93

6964458: Reimplement class meta-data storage to use native memory Summary: Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland Contributed-by: jmasa <jon.masamitsu@oracle.com>, stefank <stefan.karlsson@oracle.com>, mgerdin <mikael.gerdin@oracle.com>, never <tom.rodriguez@oracle.com>
author coleenp
date Sat, 01 Sep 2012 13:25:18 -0400
parents 1d7922586cf6
children cd3d6a6b95d9
comparison
equal deleted inserted replaced
6724:36d1d483d5d6 6725:da91efe96a93
1 /* 1 /*
2 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. 2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 * 4 *
5 * This code is free software; you can redistribute it and/or modify it 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 6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
79 79
80 #ifndef PRODUCT 80 #ifndef PRODUCT
81 if (DebugVtables) { 81 if (DebugVtables) {
82 Label L; 82 Label L;
83 // check offset vs vtable length 83 // check offset vs vtable length
84 __ cmpl(Address(rax, instanceKlass::vtable_length_offset()*wordSize), vtable_index*vtableEntry::size()); 84 __ cmpl(Address(rax, InstanceKlass::vtable_length_offset()*wordSize), vtable_index*vtableEntry::size());
85 __ jcc(Assembler::greater, L); 85 __ jcc(Assembler::greater, L);
86 __ movl(rbx, vtable_index); 86 __ movl(rbx, vtable_index);
87 __ call_VM(noreg, CAST_FROM_FN_PTR(address, bad_compiled_vtable_index), rcx, rbx); 87 __ call_VM(noreg, CAST_FROM_FN_PTR(address, bad_compiled_vtable_index), rcx, rbx);
88 __ bind(L); 88 __ bind(L);
89 } 89 }
90 #endif // PRODUCT 90 #endif // PRODUCT
91 91
92 const Register method = rbx; 92 const Register method = rbx;
93 93
94 // load methodOop and target address 94 // load Method* and target address
95 __ lookup_virtual_method(rax, vtable_index, method); 95 __ lookup_virtual_method(rax, vtable_index, method);
96 96
97 if (DebugVtables) { 97 if (DebugVtables) {
98 Label L; 98 Label L;
99 __ cmpptr(method, (int32_t)NULL_WORD); 99 __ cmpptr(method, (int32_t)NULL_WORD);
100 __ jcc(Assembler::equal, L); 100 __ jcc(Assembler::equal, L);
101 __ cmpptr(Address(method, methodOopDesc::from_compiled_offset()), (int32_t)NULL_WORD); 101 __ cmpptr(Address(method, Method::from_compiled_offset()), (int32_t)NULL_WORD);
102 __ jcc(Assembler::notZero, L); 102 __ jcc(Assembler::notZero, L);
103 __ stop("Vtable entry is NULL"); 103 __ stop("Vtable entry is NULL");
104 __ bind(L); 104 __ bind(L);
105 } 105 }
106 106
107 // rax,: receiver klass 107 // rax,: receiver klass
108 // method (rbx): methodOop 108 // method (rbx): Method*
109 // rcx: receiver 109 // rcx: receiver
110 address ame_addr = __ pc(); 110 address ame_addr = __ pc();
111 __ jmp( Address(method, methodOopDesc::from_compiled_offset())); 111 __ jmp( Address(method, Method::from_compiled_offset()));
112 112
113 masm->flush(); 113 masm->flush();
114 114
115 if (PrintMiscellaneous && (WizardMode || Verbose)) { 115 if (PrintMiscellaneous && (WizardMode || Verbose)) {
116 tty->print_cr("vtable #%d at "PTR_FORMAT"[%d] left over: %d", 116 tty->print_cr("vtable #%d at "PTR_FORMAT"[%d] left over: %d",
157 // Most registers are in use; we'll use rax, rbx, rsi, rdi 157 // Most registers are in use; we'll use rax, rbx, rsi, rdi
158 // (If we need to make rsi, rdi callee-save, do a push/pop here.) 158 // (If we need to make rsi, rdi callee-save, do a push/pop here.)
159 const Register method = rbx; 159 const Register method = rbx;
160 Label throw_icce; 160 Label throw_icce;
161 161
162 // Get methodOop and entrypoint for compiler 162 // Get Method* and entrypoint for compiler
163 __ lookup_interface_method(// inputs: rec. class, interface, itable index 163 __ lookup_interface_method(// inputs: rec. class, interface, itable index
164 rsi, rax, itable_index, 164 rsi, rax, itable_index,
165 // outputs: method, scan temp. reg 165 // outputs: method, scan temp. reg
166 method, rdi, 166 method, rdi,
167 throw_icce); 167 throw_icce);
168 168
169 // method (rbx): methodOop 169 // method (rbx): Method*
170 // rcx: receiver 170 // rcx: receiver
171 171
172 #ifdef ASSERT 172 #ifdef ASSERT
173 if (DebugVtables) { 173 if (DebugVtables) {
174 Label L1; 174 Label L1;
175 __ cmpptr(method, (int32_t)NULL_WORD); 175 __ cmpptr(method, (int32_t)NULL_WORD);
176 __ jcc(Assembler::equal, L1); 176 __ jcc(Assembler::equal, L1);
177 __ cmpptr(Address(method, methodOopDesc::from_compiled_offset()), (int32_t)NULL_WORD); 177 __ cmpptr(Address(method, Method::from_compiled_offset()), (int32_t)NULL_WORD);
178 __ jcc(Assembler::notZero, L1); 178 __ jcc(Assembler::notZero, L1);
179 __ stop("methodOop is null"); 179 __ stop("Method* is null");
180 __ bind(L1); 180 __ bind(L1);
181 } 181 }
182 #endif // ASSERT 182 #endif // ASSERT
183 183
184 address ame_addr = __ pc(); 184 address ame_addr = __ pc();
185 __ jmp(Address(method, methodOopDesc::from_compiled_offset())); 185 __ jmp(Address(method, Method::from_compiled_offset()));
186 186
187 __ bind(throw_icce); 187 __ bind(throw_icce);
188 __ jump(RuntimeAddress(StubRoutines::throw_IncompatibleClassChangeError_entry())); 188 __ jump(RuntimeAddress(StubRoutines::throw_IncompatibleClassChangeError_entry()));
189 masm->flush(); 189 masm->flush();
190 190