@@ -46,44 +46,11 @@ bool NativeInstruction::is_call_at(address addr) {
4646}
4747
4848// -----------------------------------------------------------------------------
49- // NativeFarCall
50- //
51- // Implements direct far calling loading an address from the stub section version of reloc call.
52-
53- class NativeFarCall : public NativeInstruction {
54- public:
55- enum RISCV_specific_constants {
56- return_address_offset = 3 * NativeInstruction::instruction_size, // auipc + ld + jalr
57- };
58-
59- address instruction_address () const { return addr_at (0 ); }
60- address next_instruction_address () const { return addr_at (return_address_offset); }
61- address return_address () const { return addr_at (return_address_offset); }
62- address destination () const ;
63- address reloc_destination ();
64-
65- void set_destination (address dest);
66- void verify ();
67- void print ();
68-
69- bool set_destination_mt_safe (address dest);
70- bool reloc_set_destination (address dest);
71-
72- private:
73- address stub_address ();
74-
75- static void set_stub_address_destination_at (address dest, address value);
76- static address stub_address_destination_at (address src);
77- public:
78-
79- static NativeFarCall* at (address addr);
80- static bool is_at (address addr);
81- static bool is_call_before (address return_address);
82- };
49+ // NativeCall
8350
84- address NativeFarCall ::destination () const {
51+ address NativeCall ::destination () const {
8552 address addr = instruction_address ();
86- assert (NativeFarCall ::is_at (addr), " unexpected code at call site" );
53+ assert (NativeCall ::is_at (addr), " unexpected code at call site" );
8754
8855 address destination = MacroAssembler::target_addr_for_insn (addr);
8956
@@ -96,9 +63,9 @@ address NativeFarCall::destination() const {
9663 return stub_address_destination_at (destination);
9764}
9865
99- address NativeFarCall ::reloc_destination () {
66+ address NativeCall ::reloc_destination () {
10067 address call_addr = instruction_address ();
101- assert (NativeFarCall ::is_at (call_addr), " unexpected code at call site" );
68+ assert (NativeCall ::is_at (call_addr), " unexpected code at call site" );
10269
10370 CodeBlob *code = CodeCache::find_blob (call_addr);
10471 assert (code != nullptr , " Could not find the containing code blob" );
@@ -115,25 +82,19 @@ address NativeFarCall::reloc_destination() {
11582 return stub_addr;
11683}
11784
118- void NativeFarCall::set_destination (address dest) {
119- address addr = instruction_address ();
120- assert (NativeFarCall::is_at (addr), " unexpected code at call site" );
121- Unimplemented ();
122- }
123-
124- void NativeFarCall::verify () {
125- assert (NativeFarCall::is_at (instruction_address ()), " unexpected code at call site" );
85+ void NativeCall::verify () {
86+ assert (NativeCall::is_at (instruction_address ()), " unexpected code at call site" );
12687}
12788
128- void NativeFarCall ::print () {
129- assert (NativeFarCall ::is_at (instruction_address ()), " unexpected code at call site" );
130- tty->print_cr (PTR_FORMAT " : auipc,ld,jalr x1, offset/reg, " , p2i (addr_at ( 0 )));
89+ void NativeCall ::print () {
90+ assert (NativeCall ::is_at (instruction_address ()), " unexpected code at call site" );
91+ tty->print_cr (PTR_FORMAT " : auipc,ld,jalr x1, offset/reg, " , p2i (instruction_address ( )));
13192}
13293
133- bool NativeFarCall ::set_destination_mt_safe (address dest) {
134- assert (NativeFarCall ::is_at (addr_at ( 0 )), " unexpected code at call site" );
94+ bool NativeCall ::set_destination_mt_safe (address dest) {
95+ assert (NativeCall ::is_at (instruction_address ( )), " unexpected code at call site" );
13596 assert ((CodeCache_lock->is_locked () || SafepointSynchronize::is_at_safepoint ()) ||
136- CompiledICLocker::is_safe (addr_at ( 0 )),
97+ CompiledICLocker::is_safe (instruction_address ( )),
13798 " concurrent code patching" );
13899
139100 address stub_addr = stub_address ();
@@ -145,9 +106,9 @@ bool NativeFarCall::set_destination_mt_safe(address dest) {
145106 return false ;
146107}
147108
148- bool NativeFarCall ::reloc_set_destination (address dest) {
149- address call_addr = addr_at ( 0 );
150- assert (NativeFarCall ::is_at (call_addr), " unexpected code at call site" );
109+ bool NativeCall ::reloc_set_destination (address dest) {
110+ address call_addr = instruction_address ( );
111+ assert (NativeCall ::is_at (call_addr), " unexpected code at call site" );
151112
152113 CodeBlob *code = CodeCache::find_blob (call_addr);
153114 assert (code != nullptr , " Could not find the containing code blob" );
@@ -163,39 +124,32 @@ bool NativeFarCall::reloc_set_destination(address dest) {
163124 return true ;
164125}
165126
166- void NativeFarCall ::set_stub_address_destination_at (address dest, address value) {
127+ void NativeCall ::set_stub_address_destination_at (address dest, address value) {
167128 assert_cond (dest != nullptr );
168129 assert_cond (value != nullptr );
169130
170131 set_data64_at (dest, (uint64_t )value);
171132 OrderAccess::release ();
172133}
173134
174- address NativeFarCall ::stub_address_destination_at (address src) {
135+ address NativeCall ::stub_address_destination_at (address src) {
175136 assert_cond (src != nullptr );
176137 address dest = (address)get_data64_at (src);
177138 return dest;
178139}
179140
180- address NativeFarCall ::stub_address () {
181- address call_addr = addr_at ( 0 );
141+ address NativeCall ::stub_address () {
142+ address call_addr = instruction_address ( );
182143
183144 CodeBlob *code = CodeCache::find_blob (call_addr);
184145 assert (code != nullptr , " Could not find the containing code blob" );
185146
186- address dest = MacroAssembler::pd_call_destination (call_addr);
147+ address dest = MacroAssembler::target_addr_for_insn (call_addr);
187148 assert (code->contains (dest), " Sanity" );
188149 return dest;
189150}
190151
191- NativeFarCall* NativeFarCall::at (address addr) {
192- assert_cond (addr != nullptr );
193- assert (NativeFarCall::is_at (addr), " unexpected code at call site: %p" , addr);
194- NativeFarCall* call = (NativeFarCall*)(addr);
195- return call;
196- }
197-
198- bool NativeFarCall::is_at (address addr) {
152+ bool NativeCall::is_at (address addr) {
199153 assert_cond (addr != nullptr );
200154 const int instr_size = NativeInstruction::instruction_size;
201155 if (MacroAssembler::is_auipc_at (addr) &&
@@ -211,59 +165,8 @@ bool NativeFarCall::is_at(address addr) {
211165 return false ;
212166}
213167
214- bool NativeFarCall::is_call_before (address return_address) {
215- return NativeFarCall::is_at (return_address - return_address_offset);
216- }
217-
218- // -----------------------------------------------------------------------------
219- // NativeCall
220-
221- address NativeCall::instruction_address () const {
222- return NativeFarCall::at (addr_at (0 ))->instruction_address ();
223- }
224-
225- address NativeCall::next_instruction_address () const {
226- return NativeFarCall::at (addr_at (0 ))->next_instruction_address ();
227- }
228-
229- address NativeCall::return_address () const {
230- return NativeFarCall::at (addr_at (0 ))->return_address ();
231- }
232-
233- address NativeCall::destination () const {
234- return NativeFarCall::at (addr_at (0 ))->destination ();
235- }
236-
237- address NativeCall::reloc_destination () {
238- return NativeFarCall::at (addr_at (0 ))->reloc_destination ();
239- }
240-
241- void NativeCall::set_destination (address dest) {
242- NativeFarCall::at (addr_at (0 ))->set_destination (dest);
243- }
244-
245- void NativeCall::verify () {
246- NativeFarCall::at (addr_at (0 ))->verify ();;
247- }
248-
249- void NativeCall::print () {
250- NativeFarCall::at (addr_at (0 ))->print ();;
251- }
252-
253- bool NativeCall::set_destination_mt_safe (address dest) {
254- return NativeFarCall::at (addr_at (0 ))->set_destination_mt_safe (dest);
255- }
256-
257- bool NativeCall::reloc_set_destination (address dest) {
258- return NativeFarCall::at (addr_at (0 ))->reloc_set_destination (dest);
259- }
260-
261- bool NativeCall::is_at (address addr) {
262- return NativeFarCall::is_at (addr);
263- }
264-
265168bool NativeCall::is_call_before (address return_address) {
266- return NativeFarCall::is_call_before (return_address);
169+ return NativeCall::is_at (return_address - NativeCall::instruction_size );
267170}
268171
269172NativeCall* nativeCall_at (address addr) {
@@ -276,7 +179,7 @@ NativeCall* nativeCall_at(address addr) {
276179NativeCall* nativeCall_before (address return_address) {
277180 assert_cond (return_address != nullptr );
278181 NativeCall* call = nullptr ;
279- call = (NativeCall*)(return_address - NativeFarCall::return_address_offset );
182+ call = (NativeCall*)(return_address - NativeCall::instruction_size );
280183 DEBUG_ONLY (call->verify ());
281184 return call;
282185}
0 commit comments