Skip to content

Commit 3e2d12d

Browse files
author
Hamlin Li
committed
8362515: RISC-V: cleanup NativeFarCall
Reviewed-by: fyang, fjiang
1 parent bdc1ef2 commit 3e2d12d

File tree

2 files changed

+41
-127
lines changed

2 files changed

+41
-127
lines changed

src/hotspot/cpu/riscv/nativeInst_riscv.cpp

Lines changed: 24 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
265168
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);
267170
}
268171

269172
NativeCall* nativeCall_at(address addr) {
@@ -276,7 +179,7 @@ NativeCall* nativeCall_at(address addr) {
276179
NativeCall* 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
}

src/hotspot/cpu/riscv/nativeInst_riscv.hpp

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -111,41 +111,52 @@ NativeCall* nativeCall_before(address return_address);
111111
// The NativeCall is an abstraction for accessing/manipulating native
112112
// call instructions (used to manipulate inline caches, primitive &
113113
// DSO calls, etc.).
114+
// NativeCall is reloc call on RISC-V. See MacroAssembler::reloc_call.
114115
class NativeCall: private NativeInstruction {
115116
// private: when common code is using byte_size()
116117
private:
117118
enum {
118119
// Use byte_size() as it can be changed in runtime
119120
// Since instruction_size exists on NativeInstruction we need
120121
// to overload and hide it.
121-
instruction_size = 3 * Assembler::instruction_size // auipc + ld + jalr
122+
instruction_size = 3 * NativeInstruction::instruction_size // auipc + ld + jalr
122123
};
123124
public:
124125

125126
static int byte_size() {
126-
return 3 * NativeInstruction::instruction_size; // auipc + ld + jalr
127+
return NativeCall::instruction_size; // auipc + ld + jalr
127128
}
128129

129130
// Creation
130131
friend NativeCall* nativeCall_at(address addr);
131132
friend NativeCall* nativeCall_before(address return_address);
132133

133-
address instruction_address() const;
134-
address next_instruction_address() const;
135-
address return_address() const;
134+
address instruction_address() const { return addr_at(0); }
135+
address next_instruction_address() const { return addr_at(NativeCall::instruction_size); }
136+
address return_address() const { return addr_at(NativeCall::instruction_size); }
136137
address destination() const;
137138
address reloc_destination();
138139

139140
void verify_alignment() {} // do nothing on riscv
140141
void verify();
141142
void print();
142143

143-
void set_destination(address dest);
144+
void set_destination(address dest) { Unimplemented(); }
145+
// patch stub to target address of the reloc call
144146
bool set_destination_mt_safe(address dest);
147+
// patch reloc call to stub address
145148
bool reloc_set_destination(address dest);
146149

147150
static bool is_at(address addr);
148151
static bool is_call_before(address return_address);
152+
153+
private:
154+
// return stub address, without checking stub address in locs
155+
address stub_address();
156+
// set target address at stub
157+
static void set_stub_address_destination_at(address dest, address value);
158+
// return target address at stub
159+
static address stub_address_destination_at(address src);
149160
};
150161

151162
// An interface for accessing/manipulating native mov reg, imm instructions.

0 commit comments

Comments
 (0)