Mercurial > hg > truffle
comparison src/share/vm/code/relocInfo.hpp @ 1563:1a5913bf5e19
6951083: oops and relocations should part of nmethod not CodeBlob
Summary: This moves the oops from Codeblob to nmethod.
Reviewed-by: kvn, never
author | twisti |
---|---|
date | Thu, 20 May 2010 06:34:23 -0700 |
parents | 9ee9cf798b59 |
children | e9ff18c4ace7 |
comparison
equal
deleted
inserted
replaced
1544:1a88d3c58e1d | 1563:1a5913bf5e19 |
---|---|
510 | 510 |
511 private: | 511 private: |
512 address _limit; // stop producing relocations after this _addr | 512 address _limit; // stop producing relocations after this _addr |
513 relocInfo* _current; // the current relocation information | 513 relocInfo* _current; // the current relocation information |
514 relocInfo* _end; // end marker; we're done iterating when _current == _end | 514 relocInfo* _end; // end marker; we're done iterating when _current == _end |
515 CodeBlob* _code; // compiled method containing _addr | 515 nmethod* _code; // compiled method containing _addr |
516 address _addr; // instruction to which the relocation applies | 516 address _addr; // instruction to which the relocation applies |
517 short _databuf; // spare buffer for compressed data | 517 short _databuf; // spare buffer for compressed data |
518 short* _data; // pointer to the relocation's data | 518 short* _data; // pointer to the relocation's data |
519 short _datalen; // number of halfwords in _data | 519 short _datalen; // number of halfwords in _data |
520 char _format; // position within the instruction | 520 char _format; // position within the instruction |
547 } | 547 } |
548 } | 548 } |
549 | 549 |
550 address compute_section_start(int n) const; // out-of-line helper | 550 address compute_section_start(int n) const; // out-of-line helper |
551 | 551 |
552 void initialize(CodeBlob* nm, address begin, address limit); | 552 void initialize(nmethod* nm, address begin, address limit); |
553 | 553 |
554 friend class PatchingRelocIterator; | 554 friend class PatchingRelocIterator; |
555 // make an uninitialized one, for PatchingRelocIterator: | 555 // make an uninitialized one, for PatchingRelocIterator: |
556 RelocIterator() { initialize_misc(); } | 556 RelocIterator() { initialize_misc(); } |
557 | 557 |
558 public: | 558 public: |
559 // constructor | 559 // constructor |
560 RelocIterator(CodeBlob* cb, address begin = NULL, address limit = NULL); | 560 RelocIterator(nmethod* nm, address begin = NULL, address limit = NULL); |
561 RelocIterator(CodeSection* cb, address begin = NULL, address limit = NULL); | 561 RelocIterator(CodeSection* cb, address begin = NULL, address limit = NULL); |
562 | 562 |
563 // get next reloc info, return !eos | 563 // get next reloc info, return !eos |
564 bool next() { | 564 bool next() { |
565 _current++; | 565 _current++; |
590 address limit() const { return _limit; } | 590 address limit() const { return _limit; } |
591 void set_limit(address x); | 591 void set_limit(address x); |
592 relocType type() const { return current()->type(); } | 592 relocType type() const { return current()->type(); } |
593 int format() const { return (relocInfo::have_format) ? current()->format() : 0; } | 593 int format() const { return (relocInfo::have_format) ? current()->format() : 0; } |
594 address addr() const { return _addr; } | 594 address addr() const { return _addr; } |
595 CodeBlob* code() const { return _code; } | 595 nmethod* code() const { return _code; } |
596 short* data() const { return _data; } | 596 short* data() const { return _data; } |
597 int datalen() const { return _datalen; } | 597 int datalen() const { return _datalen; } |
598 bool has_current() const { return _datalen >= 0; } | 598 bool has_current() const { return _datalen >= 0; } |
599 | 599 |
600 void set_addr(address addr) { _addr = addr; } | 600 void set_addr(address addr) { _addr = addr; } |
788 address new_addr_for(address olda, const CodeBuffer* src, CodeBuffer* dest); | 788 address new_addr_for(address olda, const CodeBuffer* src, CodeBuffer* dest); |
789 void normalize_address(address& addr, const CodeSection* dest, bool allow_other_sections = false); | 789 void normalize_address(address& addr, const CodeSection* dest, bool allow_other_sections = false); |
790 | 790 |
791 public: | 791 public: |
792 // accessors which only make sense for a bound Relocation | 792 // accessors which only make sense for a bound Relocation |
793 address addr() const { return binding()->addr(); } | 793 address addr() const { return binding()->addr(); } |
794 CodeBlob* code() const { return binding()->code(); } | 794 nmethod* code() const { return binding()->code(); } |
795 bool addr_in_const() const { return binding()->addr_in_const(); } | 795 bool addr_in_const() const { return binding()->addr_in_const(); } |
796 protected: | 796 protected: |
797 short* data() const { return binding()->data(); } | 797 short* data() const { return binding()->data(); } |
798 int datalen() const { return binding()->datalen(); } | 798 int datalen() const { return binding()->datalen(); } |
799 int format() const { return binding()->format(); } | 799 int format() const { return binding()->format(); } |
800 | 800 |
980 | 980 |
981 void clear_inline_cache(); | 981 void clear_inline_cache(); |
982 | 982 |
983 // Figure out where an ic_call is hiding, given a set-oop or call. | 983 // Figure out where an ic_call is hiding, given a set-oop or call. |
984 // Either ic_call or first_oop must be non-null; the other is deduced. | 984 // Either ic_call or first_oop must be non-null; the other is deduced. |
985 // Code if non-NULL must be the CodeBlob, else it is deduced. | 985 // Code if non-NULL must be the nmethod, else it is deduced. |
986 // The address of the patchable oop is also deduced. | 986 // The address of the patchable oop is also deduced. |
987 // The returned iterator will enumerate over the oops and the ic_call, | 987 // The returned iterator will enumerate over the oops and the ic_call, |
988 // as well as any other relocations that happen to be in that span of code. | 988 // as well as any other relocations that happen to be in that span of code. |
989 // Recognize relevant set_oops with: oop_reloc()->oop_addr() == oop_addr. | 989 // Recognize relevant set_oops with: oop_reloc()->oop_addr() == oop_addr. |
990 static RelocIterator parse_ic(CodeBlob* &code, address &ic_call, address &first_oop, oop* &oop_addr, bool *is_optimized); | 990 static RelocIterator parse_ic(nmethod* &nm, address &ic_call, address &first_oop, oop* &oop_addr, bool *is_optimized); |
991 }; | 991 }; |
992 | 992 |
993 | 993 |
994 class opt_virtual_call_Relocation : public CallRelocation { | 994 class opt_virtual_call_Relocation : public CallRelocation { |
995 relocInfo::relocType type() { return relocInfo::opt_virtual_call_type; } | 995 relocInfo::relocType type() { return relocInfo::opt_virtual_call_type; } |
1302 return r; \ | 1302 return r; \ |
1303 } | 1303 } |
1304 APPLY_TO_RELOCATIONS(EACH_CASE); | 1304 APPLY_TO_RELOCATIONS(EACH_CASE); |
1305 #undef EACH_CASE | 1305 #undef EACH_CASE |
1306 | 1306 |
1307 inline RelocIterator::RelocIterator(CodeBlob* cb, address begin, address limit) { | 1307 inline RelocIterator::RelocIterator(nmethod* nm, address begin, address limit) { |
1308 initialize(cb, begin, limit); | 1308 initialize(nm, begin, limit); |
1309 } | 1309 } |
1310 | 1310 |
1311 // if you are going to patch code, you should use this subclass of | 1311 // if you are going to patch code, you should use this subclass of |
1312 // RelocIterator | 1312 // RelocIterator |
1313 class PatchingRelocIterator : public RelocIterator { | 1313 class PatchingRelocIterator : public RelocIterator { |
1321 // these are private and have no bodies defined because they should not be called | 1321 // these are private and have no bodies defined because they should not be called |
1322 PatchingRelocIterator(const RelocIterator&); | 1322 PatchingRelocIterator(const RelocIterator&); |
1323 void operator=(const RelocIterator&); | 1323 void operator=(const RelocIterator&); |
1324 | 1324 |
1325 public: | 1325 public: |
1326 PatchingRelocIterator(CodeBlob* cb, address begin =NULL, address limit =NULL) | 1326 PatchingRelocIterator(nmethod* nm, address begin = NULL, address limit = NULL) |
1327 : RelocIterator(cb, begin, limit) { prepass(); } | 1327 : RelocIterator(nm, begin, limit) { prepass(); } |
1328 | 1328 |
1329 ~PatchingRelocIterator() { postpass(); } | 1329 ~PatchingRelocIterator() { postpass(); } |
1330 }; | 1330 }; |