Mercurial > hg > release > icedtea7-forest-2.6 > hotspot
changeset 6479:53986bf097ad
8016696: PPC64 (part 4): add relocation for trampoline stubs
Summary: A trampoline allows to encode a small branch in the code, even if there is the chance that this branch can not reach all possible code locations. If the relocation finds that a branch is too far for the instruction in the code, it can patch it to jump to the trampoline where is sufficient space for a far branch. Needed on PPC.
Reviewed-by: kvn, bdelsart, jrose
author | goetz |
---|---|
date | Fri, 07 Feb 2014 16:18:07 +0100 |
parents | f2f5a053bd0d |
children | 33e70139574f |
files | src/share/vm/code/relocInfo.cpp src/share/vm/code/relocInfo.hpp |
diffstat | 2 files changed, 11 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/vm/code/relocInfo.cpp Fri Feb 07 16:07:53 2014 +0100 +++ b/src/share/vm/code/relocInfo.cpp Fri Feb 07 16:18:07 2014 +0100 @@ -622,7 +622,7 @@ } void trampoline_stub_Relocation::pack_data_to(CodeSection* dest ) { - short* p = (short*) dest->locs_end(); + short* p = (short*) dest->locs_end(); CodeSection* insts = dest->outer()->insts(); normalize_address(_owner, insts); p = pack_1_int_to(p,scaled_offset(_owner, insts->start() )); @@ -1198,6 +1198,12 @@ tty->print(" | [static_call=" INTPTR_FORMAT "]", r->static_call()); break; } + case relocInfo::trampoline_stub_type: + { + trampoline_stub_Relocation* r = (trampoline_stub_Relocation*) reloc(); + tty->print(" | [trampoline owner=" INTPTR_FORMAT "]", r->owner()); + break; + } } tty->cr(); }
--- a/src/share/vm/code/relocInfo.hpp Fri Feb 07 16:07:53 2014 +0100 +++ b/src/share/vm/code/relocInfo.hpp Fri Feb 07 16:18:07 2014 +0100 @@ -268,7 +268,7 @@ poll_return_type = 11, // polling instruction for safepoints at return breakpoint_type = 12, // an initialization barrier or safepoint trampoline_stub_type = 13, // stub-entry for trampoline - yet_unused_type = 14, // Still unused + yet_unused_type_1 = 14, // Still unused data_prefix_tag = 15, // tag for a prefix (carries data arguments) type_mask = 15 // A mask which selects only the above values }; @@ -1118,14 +1118,14 @@ // is the chance that this branch can not reach all possible code locations. // If the relocation finds that a branch is too far for the instruction // in the code, it can patch it to jump to the trampoline where is -// sufficient space for a far branch. Needed on PPC. +// sufficient space for a far branch. Needed on PPC. class trampoline_stub_Relocation : public Relocation { relocInfo::relocType type() { return relocInfo::trampoline_stub_type; } public: static RelocationHolder spec(address static_call) { RelocationHolder rh = newHolder(); - return (new(rh) trampoline_stub_Relocation(static_call)); + return (new (rh) trampoline_stub_Relocation(static_call)); } private: @@ -1143,7 +1143,7 @@ // Return the address of the NativeCall that owns the trampoline. address owner() { return _owner; } - void pack_data_to( CodeSection * dest); + void pack_data_to(CodeSection * dest); void unpack_data(); // Find the trampoline stub for a call.