@@ -46,44 +46,11 @@ bool NativeInstruction::is_call_at(address addr) {
46
46
}
47
47
48
48
// -----------------------------------------------------------------------------
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
83
50
84
- address NativeFarCall ::destination () const {
51
+ address NativeCall ::destination () const {
85
52
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" );
87
54
88
55
address destination = MacroAssembler::target_addr_for_insn (addr);
89
56
@@ -96,9 +63,9 @@ address NativeFarCall::destination() const {
96
63
return stub_address_destination_at (destination);
97
64
}
98
65
99
- address NativeFarCall ::reloc_destination () {
66
+ address NativeCall ::reloc_destination () {
100
67
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" );
102
69
103
70
CodeBlob *code = CodeCache::find_blob (call_addr);
104
71
assert (code != nullptr , " Could not find the containing code blob" );
@@ -115,25 +82,19 @@ address NativeFarCall::reloc_destination() {
115
82
return stub_addr;
116
83
}
117
84
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" );
126
87
}
127
88
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 ( )));
131
92
}
132
93
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" );
135
96
assert ((CodeCache_lock->is_locked () || SafepointSynchronize::is_at_safepoint ()) ||
136
- CompiledICLocker::is_safe (addr_at ( 0 )),
97
+ CompiledICLocker::is_safe (instruction_address ( )),
137
98
" concurrent code patching" );
138
99
139
100
address stub_addr = stub_address ();
@@ -145,9 +106,9 @@ bool NativeFarCall::set_destination_mt_safe(address dest) {
145
106
return false ;
146
107
}
147
108
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" );
151
112
152
113
CodeBlob *code = CodeCache::find_blob (call_addr);
153
114
assert (code != nullptr , " Could not find the containing code blob" );
@@ -163,39 +124,32 @@ bool NativeFarCall::reloc_set_destination(address dest) {
163
124
return true ;
164
125
}
165
126
166
- void NativeFarCall ::set_stub_address_destination_at (address dest, address value) {
127
+ void NativeCall ::set_stub_address_destination_at (address dest, address value) {
167
128
assert_cond (dest != nullptr );
168
129
assert_cond (value != nullptr );
169
130
170
131
set_data64_at (dest, (uint64_t )value);
171
132
OrderAccess::release ();
172
133
}
173
134
174
- address NativeFarCall ::stub_address_destination_at (address src) {
135
+ address NativeCall ::stub_address_destination_at (address src) {
175
136
assert_cond (src != nullptr );
176
137
address dest = (address)get_data64_at (src);
177
138
return dest;
178
139
}
179
140
180
- address NativeFarCall ::stub_address () {
181
- address call_addr = addr_at ( 0 );
141
+ address NativeCall ::stub_address () {
142
+ address call_addr = instruction_address ( );
182
143
183
144
CodeBlob *code = CodeCache::find_blob (call_addr);
184
145
assert (code != nullptr , " Could not find the containing code blob" );
185
146
186
- address dest = MacroAssembler::pd_call_destination (call_addr);
147
+ address dest = MacroAssembler::target_addr_for_insn (call_addr);
187
148
assert (code->contains (dest), " Sanity" );
188
149
return dest;
189
150
}
190
151
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) {
199
153
assert_cond (addr != nullptr );
200
154
const int instr_size = NativeInstruction::instruction_size;
201
155
if (MacroAssembler::is_auipc_at (addr) &&
@@ -211,59 +165,8 @@ bool NativeFarCall::is_at(address addr) {
211
165
return false ;
212
166
}
213
167
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
-
265
168
bool 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 );
267
170
}
268
171
269
172
NativeCall* nativeCall_at (address addr) {
@@ -276,7 +179,7 @@ NativeCall* nativeCall_at(address addr) {
276
179
NativeCall* nativeCall_before (address return_address) {
277
180
assert_cond (return_address != nullptr );
278
181
NativeCall* call = nullptr ;
279
- call = (NativeCall*)(return_address - NativeFarCall::return_address_offset );
182
+ call = (NativeCall*)(return_address - NativeCall::instruction_size );
280
183
DEBUG_ONLY (call->verify ());
281
184
return call;
282
185
}
0 commit comments