comparison src/share/vm/code/relocInfo.hpp @ 1762:0878d7bae69f

6961697: move nmethod constants section before instruction section Summary: This is a preparation for 6961690. Reviewed-by: kvn, never
author twisti
date Fri, 27 Aug 2010 01:51:27 -0700
parents e9ff18c4ace7
children f95d63e2154a
comparison
equal deleted inserted replaced
1761:14b92b91f460 1762:0878d7bae69f
1 /* 1 /*
2 * Copyright (c) 1997, 2008, Oracle and/or its affiliates. All rights reserved. 2 * Copyright (c) 1997, 2010, 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.
500 // ... 500 // ...
501 // } 501 // }
502 // } 502 // }
503 503
504 class RelocIterator : public StackObj { 504 class RelocIterator : public StackObj {
505 enum { SECT_CONSTS = 2, 505 enum { SECT_LIMIT = 3 }; // must be equal to CodeBuffer::SECT_LIMIT, checked in ctor
506 SECT_LIMIT = 3 }; // must be equal to CodeBuffer::SECT_LIMIT
507 friend class Relocation; 506 friend class Relocation;
508 friend class relocInfo; // for change_reloc_info_for_address only 507 friend class relocInfo; // for change_reloc_info_for_address only
509 typedef relocInfo::relocType relocType; 508 typedef relocInfo::relocType relocType;
510 509
511 private: 510 private:
519 short _datalen; // number of halfwords in _data 518 short _datalen; // number of halfwords in _data
520 char _format; // position within the instruction 519 char _format; // position within the instruction
521 520
522 // Base addresses needed to compute targets of section_word_type relocs. 521 // Base addresses needed to compute targets of section_word_type relocs.
523 address _section_start[SECT_LIMIT]; 522 address _section_start[SECT_LIMIT];
523 address _section_end [SECT_LIMIT];
524 524
525 void set_has_current(bool b) { 525 void set_has_current(bool b) {
526 _datalen = !b ? -1 : 0; 526 _datalen = !b ? -1 : 0;
527 debug_only(_data = NULL); 527 debug_only(_data = NULL);
528 } 528 }
538 538
539 void set_limits(address begin, address limit); 539 void set_limits(address begin, address limit);
540 540
541 void advance_over_prefix(); // helper method 541 void advance_over_prefix(); // helper method
542 542
543 void initialize_misc() { 543 void initialize_misc();
544 set_has_current(false);
545 for (int i = 0; i < SECT_LIMIT; i++) {
546 _section_start[i] = NULL; // these will be lazily computed, if needed
547 }
548 }
549
550 address compute_section_start(int n) const; // out-of-line helper
551 544
552 void initialize(nmethod* nm, address begin, address limit); 545 void initialize(nmethod* nm, address begin, address limit);
553 546
554 friend class PatchingRelocIterator; 547 friend class PatchingRelocIterator;
555 // make an uninitialized one, for PatchingRelocIterator: 548 // make an uninitialized one, for PatchingRelocIterator:
596 short* data() const { return _data; } 589 short* data() const { return _data; }
597 int datalen() const { return _datalen; } 590 int datalen() const { return _datalen; }
598 bool has_current() const { return _datalen >= 0; } 591 bool has_current() const { return _datalen >= 0; }
599 592
600 void set_addr(address addr) { _addr = addr; } 593 void set_addr(address addr) { _addr = addr; }
601 bool addr_in_const() const { return addr() >= section_start(SECT_CONSTS); } 594 bool addr_in_const() const;
602 595
603 address section_start(int n) const { 596 address section_start(int n) const {
604 address res = _section_start[n]; 597 assert(_section_start[n], "must be initialized");
605 return (res != NULL) ? res : compute_section_start(n); 598 return _section_start[n];
599 }
600 address section_end(int n) const {
601 assert(_section_end[n], "must be initialized");
602 return _section_end[n];
606 } 603 }
607 604
608 // The address points to the affected displacement part of the instruction. 605 // The address points to the affected displacement part of the instruction.
609 // For RISC, this is just the whole instruction. 606 // For RISC, this is just the whole instruction.
610 // For Intel, this is an unaligned 32-bit word. 607 // For Intel, this is an unaligned 32-bit word.