Mercurial > hg > truffle
comparison src/cpu/sparc/vm/nativeInst_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 | 1d1603768966 |
children | f0c2369fda5a |
comparison
equal
deleted
inserted
replaced
6724:36d1d483d5d6 | 6725:da91efe96a93 |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 1997, 2011, 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. |
298 //------------------------------------------------------------------- | 298 //------------------------------------------------------------------- |
299 | 299 |
300 | 300 |
301 void NativeMovConstReg::verify() { | 301 void NativeMovConstReg::verify() { |
302 NativeInstruction::verify(); | 302 NativeInstruction::verify(); |
303 // make sure code pattern is actually a "set_oop" synthetic instruction | 303 // make sure code pattern is actually a "set_metadata" synthetic instruction |
304 // see MacroAssembler::set_oop() | 304 // see MacroAssembler::set_oop() |
305 int i0 = long_at(sethi_offset); | 305 int i0 = long_at(sethi_offset); |
306 int i1 = long_at(add_offset); | 306 int i1 = long_at(add_offset); |
307 | 307 |
308 // verify the pattern "sethi %hi22(imm), reg ; add reg, %lo10(imm), reg" | 308 // verify the pattern "sethi %hi22(imm), reg ; add reg, %lo10(imm), reg" |
310 #ifndef _LP64 | 310 #ifndef _LP64 |
311 if (!(is_op2(i0, Assembler::sethi_op2) && rd != G0 && | 311 if (!(is_op2(i0, Assembler::sethi_op2) && rd != G0 && |
312 is_op3(i1, Assembler::add_op3, Assembler::arith_op) && | 312 is_op3(i1, Assembler::add_op3, Assembler::arith_op) && |
313 inv_immed(i1) && (unsigned)get_simm13(i1) < (1 << 10) && | 313 inv_immed(i1) && (unsigned)get_simm13(i1) < (1 << 10) && |
314 rd == inv_rs1(i1) && rd == inv_rd(i1))) { | 314 rd == inv_rs1(i1) && rd == inv_rd(i1))) { |
315 fatal("not a set_oop"); | 315 fatal("not a set_metadata"); |
316 } | 316 } |
317 #else | 317 #else |
318 if (!is_op2(i0, Assembler::sethi_op2) && rd != G0 ) { | 318 if (!is_op2(i0, Assembler::sethi_op2) && rd != G0 ) { |
319 fatal("not a set_oop"); | 319 fatal("not a set_metadata"); |
320 } | 320 } |
321 #endif | 321 #endif |
322 } | 322 } |
323 | 323 |
324 | 324 |
350 CodeBlob* cb = CodeCache::find_blob(instruction_address()); | 350 CodeBlob* cb = CodeCache::find_blob(instruction_address()); |
351 nmethod* nm = cb ? cb->as_nmethod_or_null() : NULL; | 351 nmethod* nm = cb ? cb->as_nmethod_or_null() : NULL; |
352 if (nm != NULL) { | 352 if (nm != NULL) { |
353 RelocIterator iter(nm, instruction_address(), next_instruction_address()); | 353 RelocIterator iter(nm, instruction_address(), next_instruction_address()); |
354 oop* oop_addr = NULL; | 354 oop* oop_addr = NULL; |
355 Metadata** metadata_addr = NULL; | |
355 while (iter.next()) { | 356 while (iter.next()) { |
356 if (iter.type() == relocInfo::oop_type) { | 357 if (iter.type() == relocInfo::oop_type) { |
357 oop_Relocation *r = iter.oop_reloc(); | 358 oop_Relocation *r = iter.oop_reloc(); |
358 if (oop_addr == NULL) { | 359 if (oop_addr == NULL) { |
359 oop_addr = r->oop_addr(); | 360 oop_addr = r->oop_addr(); |
360 *oop_addr = (oop)x; | 361 *oop_addr = (oop)x; |
361 } else { | 362 } else { |
362 assert(oop_addr == r->oop_addr(), "must be only one set-oop here"); | 363 assert(oop_addr == r->oop_addr(), "must be only one set-oop here"); |
364 } | |
365 } | |
366 if (iter.type() == relocInfo::metadata_type) { | |
367 metadata_Relocation *r = iter.metadata_reloc(); | |
368 if (metadata_addr == NULL) { | |
369 metadata_addr = r->metadata_addr(); | |
370 *metadata_addr = (Metadata*)x; | |
371 } else { | |
372 assert(metadata_addr == r->metadata_addr(), "must be only one set-metadata here"); | |
363 } | 373 } |
364 } | 374 } |
365 } | 375 } |
366 } | 376 } |
367 } | 377 } |
427 if (!(is_op2(i0, Assembler::sethi_op2) && rd0 != G0 && | 437 if (!(is_op2(i0, Assembler::sethi_op2) && rd0 != G0 && |
428 is_op2(i1, Assembler::sethi_op2) && rd1 == G0 && // nop is a special case of sethi | 438 is_op2(i1, Assembler::sethi_op2) && rd1 == G0 && // nop is a special case of sethi |
429 is_op3(i2, Assembler::add_op3, Assembler::arith_op) && | 439 is_op3(i2, Assembler::add_op3, Assembler::arith_op) && |
430 inv_immed(i2) && (unsigned)get_simm13(i2) < (1 << 10) && | 440 inv_immed(i2) && (unsigned)get_simm13(i2) < (1 << 10) && |
431 rd0 == inv_rs1(i2) && rd0 == inv_rd(i2))) { | 441 rd0 == inv_rs1(i2) && rd0 == inv_rd(i2))) { |
432 fatal("not a set_oop"); | 442 fatal("not a set_metadata"); |
433 } | 443 } |
434 } | 444 } |
435 | 445 |
436 | 446 |
437 void NativeMovConstRegPatching::print() { | 447 void NativeMovConstRegPatching::print() { |
460 CodeBlob* cb = CodeCache::find_blob(instruction_address()); | 470 CodeBlob* cb = CodeCache::find_blob(instruction_address()); |
461 nmethod* nm = cb ? cb->as_nmethod_or_null() : NULL; | 471 nmethod* nm = cb ? cb->as_nmethod_or_null() : NULL; |
462 if (nm != NULL) { | 472 if (nm != NULL) { |
463 RelocIterator iter(nm, instruction_address(), next_instruction_address()); | 473 RelocIterator iter(nm, instruction_address(), next_instruction_address()); |
464 oop* oop_addr = NULL; | 474 oop* oop_addr = NULL; |
475 Metadata** metadata_addr = NULL; | |
465 while (iter.next()) { | 476 while (iter.next()) { |
466 if (iter.type() == relocInfo::oop_type) { | 477 if (iter.type() == relocInfo::oop_type) { |
467 oop_Relocation *r = iter.oop_reloc(); | 478 oop_Relocation *r = iter.oop_reloc(); |
468 if (oop_addr == NULL) { | 479 if (oop_addr == NULL) { |
469 oop_addr = r->oop_addr(); | 480 oop_addr = r->oop_addr(); |
470 *oop_addr = (oop)x; | 481 *oop_addr = (oop)x; |
471 } else { | 482 } else { |
472 assert(oop_addr == r->oop_addr(), "must be only one set-oop here"); | 483 assert(oop_addr == r->oop_addr(), "must be only one set-oop here"); |
484 } | |
485 } | |
486 if (iter.type() == relocInfo::metadata_type) { | |
487 metadata_Relocation *r = iter.metadata_reloc(); | |
488 if (metadata_addr == NULL) { | |
489 metadata_addr = r->metadata_addr(); | |
490 *metadata_addr = (Metadata*)x; | |
491 } else { | |
492 assert(metadata_addr == r->metadata_addr(), "must be only one set-metadata here"); | |
473 } | 493 } |
474 } | 494 } |
475 } | 495 } |
476 } | 496 } |
477 } | 497 } |