equal
deleted
inserted
replaced
1 /* |
1 /* |
2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. |
2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. |
3 * Copyright 2012, 2013 SAP AG. All rights reserved. |
3 * Copyright 2012, 2014 SAP AG. All rights reserved. |
4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
5 * |
5 * |
6 * This code is free software; you can redistribute it and/or modify it |
6 * This code is free software; you can redistribute it and/or modify it |
7 * under the terms of the GNU General Public License version 2 only, as |
7 * under the terms of the GNU General Public License version 2 only, as |
8 * published by the Free Software Foundation. |
8 * published by the Free Software Foundation. |
77 |
77 |
78 // We might implicit NULL fault here. |
78 // We might implicit NULL fault here. |
79 address npe_addr = __ pc(); // npe = null pointer exception |
79 address npe_addr = __ pc(); // npe = null pointer exception |
80 __ load_klass_with_trap_null_check(rcvr_klass, R3); |
80 __ load_klass_with_trap_null_check(rcvr_klass, R3); |
81 |
81 |
82 // Set methodOop (in case of interpreted method), and destination address. |
82 // Set method (in case of interpreted method), and destination address. |
83 int entry_offset = InstanceKlass::vtable_start_offset() + vtable_index*vtableEntry::size(); |
83 int entry_offset = InstanceKlass::vtable_start_offset() + vtable_index*vtableEntry::size(); |
84 |
84 |
85 #ifndef PRODUCT |
85 #ifndef PRODUCT |
86 if (DebugVtables) { |
86 if (DebugVtables) { |
87 Label L; |
87 Label L; |
159 |
159 |
160 // We might implicit NULL fault here. |
160 // We might implicit NULL fault here. |
161 address npe_addr = __ pc(); // npe = null pointer exception |
161 address npe_addr = __ pc(); // npe = null pointer exception |
162 __ load_klass_with_trap_null_check(rcvr_klass, R3_ARG1); |
162 __ load_klass_with_trap_null_check(rcvr_klass, R3_ARG1); |
163 |
163 |
164 //__ ld(rcvr_klass, oopDesc::klass_offset_in_bytes(), R3_ARG1); |
|
165 |
|
166 BLOCK_COMMENT("Load start of itable entries into itable_entry."); |
164 BLOCK_COMMENT("Load start of itable entries into itable_entry."); |
167 __ lwz(vtable_len, InstanceKlass::vtable_length_offset() * wordSize, rcvr_klass); |
165 __ lwz(vtable_len, InstanceKlass::vtable_length_offset() * wordSize, rcvr_klass); |
168 __ slwi(vtable_len, vtable_len, exact_log2(vtableEntry::size() * wordSize)); |
166 __ slwi(vtable_len, vtable_len, exact_log2(vtableEntry::size() * wordSize)); |
169 __ add(itable_entry_addr, vtable_len, rcvr_klass); |
167 __ add(itable_entry_addr, vtable_len, rcvr_klass); |
170 |
168 |
197 const int vtable_offset_offset = (itableOffsetEntry::offset_offset_in_bytes() - |
195 const int vtable_offset_offset = (itableOffsetEntry::offset_offset_in_bytes() - |
198 itableOffsetEntry::interface_offset_in_bytes()) - |
196 itableOffsetEntry::interface_offset_in_bytes()) - |
199 itable_offset_search_inc; |
197 itable_offset_search_inc; |
200 __ lwz(vtable_offset, vtable_offset_offset, itable_entry_addr); |
198 __ lwz(vtable_offset, vtable_offset_offset, itable_entry_addr); |
201 |
199 |
202 // Compute itableMethodEntry and get methodOop and entry point for compiler. |
200 // Compute itableMethodEntry and get method and entry point for compiler. |
203 const int method_offset = (itableMethodEntry::size() * wordSize * vtable_index) + |
201 const int method_offset = (itableMethodEntry::size() * wordSize * vtable_index) + |
204 itableMethodEntry::method_offset_in_bytes(); |
202 itableMethodEntry::method_offset_in_bytes(); |
205 |
203 |
206 __ add(itable_method, rcvr_klass, vtable_offset); |
204 __ add(itable_method, rcvr_klass, vtable_offset); |
207 __ ld(R19_method, method_offset, itable_method); |
205 __ ld(R19_method, method_offset, itable_method); |
209 #ifndef PRODUCT |
207 #ifndef PRODUCT |
210 if (DebugVtables) { |
208 if (DebugVtables) { |
211 Label ok; |
209 Label ok; |
212 __ cmpd(CCR0, R19_method, 0); |
210 __ cmpd(CCR0, R19_method, 0); |
213 __ bne(CCR0, ok); |
211 __ bne(CCR0, ok); |
214 __ stop("methodOop is null", 103); |
212 __ stop("method is null", 103); |
215 __ bind(ok); |
213 __ bind(ok); |
216 } |
214 } |
217 #endif |
215 #endif |
218 |
216 |
219 // If the vtable entry is null, the method is abstract. |
217 // If the vtable entry is null, the method is abstract. |