Skip to content

Commit 4419ef2

Browse files
DingliZhangRealFYang
authored andcommitted
8362515: RISC-V: cleanup NativeFarCall
Backport-of: 3e2d12d85a35d9724c2ddf17a2dccf4b0866bc62
1 parent 028b4ba commit 4419ef2

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
@@ -112,41 +112,52 @@ NativeCall* nativeCall_before(address return_address);
112112
// The NativeCall is an abstraction for accessing/manipulating native
113113
// call instructions (used to manipulate inline caches, primitive &
114114
// DSO calls, etc.).
115+
// NativeCall is reloc call on RISC-V. See MacroAssembler::reloc_call.
115116
class NativeCall: private NativeInstruction {
116117
// private: when common code is using byte_size()
117118
private:
118119
enum {
119120
// Use byte_size() as it can be changed in runtime
120121
// Since instruction_size exists on NativeInstruction we need
121122
// to overload and hide it.
122-
instruction_size = 3 * Assembler::instruction_size // auipc + ld + jalr
123+
instruction_size = 3 * NativeInstruction::instruction_size // auipc + ld + jalr
123124
};
124125
public:
125126

126127
static int byte_size() {
127-
return 3 * NativeInstruction::instruction_size; // auipc + ld + jalr
128+
return NativeCall::instruction_size; // auipc + ld + jalr
128129
}
129130

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

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

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

144-
void set_destination(address dest);
145+
void set_destination(address dest) { Unimplemented(); }
146+
// patch stub to target address of the reloc call
145147
bool set_destination_mt_safe(address dest);
148+
// patch reloc call to stub address
146149
bool reloc_set_destination(address dest);
147150

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

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

0 commit comments

Comments
 (0)