Mercurial > hg > truffle
diff src/cpu/sparc/vm/c1_CodeStubs_sparc.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 | 09aad8452938 |
children | d02120b7a34f |
line wrap: on
line diff
--- a/src/cpu/sparc/vm/c1_CodeStubs_sparc.cpp Fri Aug 31 16:39:35 2012 -0700 +++ b/src/cpu/sparc/vm/c1_CodeStubs_sparc.cpp Sat Sep 01 13:25:18 2012 -0400 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -268,7 +268,22 @@ #ifdef ASSERT address start = __ pc(); #endif - AddressLiteral addrlit(NULL, oop_Relocation::spec(_oop_index)); + AddressLiteral addrlit(NULL, metadata_Relocation::spec(_index)); + __ patchable_set(addrlit, _obj); + +#ifdef ASSERT + for (int i = 0; i < _bytes_to_copy; i++) { + address ptr = (address)(_pc_start + i); + int a_byte = (*ptr) & 0xFF; + assert(a_byte == *start++, "should be the same code"); + } +#endif + } else if (_id == load_mirror_id) { + // produce a copy of the load mirror instruction for use by the being initialized case +#ifdef ASSERT + address start = __ pc(); +#endif + AddressLiteral addrlit(NULL, oop_Relocation::spec(_index)); __ patchable_set(addrlit, _obj); #ifdef ASSERT @@ -289,7 +304,7 @@ address end_of_patch = __ pc(); int bytes_to_skip = 0; - if (_id == load_klass_id) { + if (_id == load_mirror_id) { int offset = __ offset(); if (CommentedAssembly) { __ block_comment(" being_initialized check"); @@ -300,9 +315,9 @@ // check that this code is being executed by the initializing // thread. assert(_obj != noreg, "must be a valid register"); - assert(_oop_index >= 0, "must have oop index"); - __ load_heap_oop(_obj, java_lang_Class::klass_offset_in_bytes(), G3); - __ ld_ptr(G3, in_bytes(instanceKlass::init_thread_offset()), G3); + assert(_index >= 0, "must have oop index"); + __ ld_ptr(_obj, java_lang_Class::klass_offset_in_bytes(), G3); + __ ld_ptr(G3, in_bytes(InstanceKlass::init_thread_offset()), G3); __ cmp_and_brx_short(G2_thread, G3, Assembler::notEqual, Assembler::pn, call_patch); // load_klass patches may execute the patched code before it's @@ -335,9 +350,11 @@ address entry = __ pc(); NativeGeneralJump::insert_unconditional((address)_pc_start, entry); address target = NULL; + relocInfo::relocType reloc_type = relocInfo::none; switch (_id) { case access_field_id: target = Runtime1::entry_for(Runtime1::access_field_patching_id); break; - case load_klass_id: target = Runtime1::entry_for(Runtime1::load_klass_patching_id); break; + case load_klass_id: target = Runtime1::entry_for(Runtime1::load_klass_patching_id); reloc_type = relocInfo::metadata_type; break; + case load_mirror_id: target = Runtime1::entry_for(Runtime1::load_mirror_patching_id); reloc_type = relocInfo::oop_type; break; default: ShouldNotReachHere(); } __ bind(call_patch); @@ -351,15 +368,15 @@ ce->add_call_info_here(_info); __ br(Assembler::always, false, Assembler::pt, _patch_site_entry); __ delayed()->nop(); - if (_id == load_klass_id) { + if (_id == load_klass_id || _id == load_mirror_id) { CodeSection* cs = __ code_section(); address pc = (address)_pc_start; RelocIterator iter(cs, pc, pc + 1); - relocInfo::change_reloc_info_for_address(&iter, (address) pc, relocInfo::oop_type, relocInfo::none); + relocInfo::change_reloc_info_for_address(&iter, (address) pc, reloc_type, relocInfo::none); pc = (address)(_pc_start + NativeMovConstReg::add_offset); RelocIterator iter2(cs, pc, pc+1); - relocInfo::change_reloc_info_for_address(&iter2, (address) pc, relocInfo::oop_type, relocInfo::none); + relocInfo::change_reloc_info_for_address(&iter2, (address) pc, reloc_type, relocInfo::none); } }