< prev index next >
src/hotspot/cpu/aarch64/compiledIC_aarch64.cpp
Print this page
rev 49736 : 8185505: AArch64: Port AOT to AArch64
Reviewed-by: duke
@@ -1,8 +1,8 @@
/*
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2014, Red Hat Inc. All rights reserved.
+ * Copyright (c) 2014, 2018, Red Hat Inc. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
@@ -54,12 +54,17 @@
if (base == NULL) {
return NULL; // CodeBuffer::expand failed
}
// static stub relocation stores the instruction address of the call
__ relocate(static_stub_Relocation::spec(mark));
- // static stub relocation also tags the Method* in the code-stream.
+
+ // Don't create a Metadata reloc if we're generating immutable PIC.
+ if (cbuf.immutable_PIC()) {
+ __ movptr(rmethod, 0);
+ } else {
__ mov_metadata(rmethod, (Metadata*)NULL);
+ }
__ movptr(rscratch1, 0);
__ br(rscratch1);
assert((__ offset() - offset) <= (int)to_interp_stub_size(), "stub too big");
__ end_a_stub();
@@ -81,10 +86,65 @@
// Relocation entries for call stub, compiled java to interpreter.
int CompiledStaticCall::reloc_to_interp_stub() {
return 4; // 3 in emit_to_interp_stub + 1 in emit_call
}
+#if INCLUDE_AOT
+#define __ _masm.
+void CompiledStaticCall::emit_to_aot_stub(CodeBuffer &cbuf, address mark) {
+ if (!UseAOT) {
+ return;
+ }
+ // Stub is fixed up when the corresponding call is converted from
+ // calling compiled code to calling aot code.
+ // mov r, imm64_aot_code_address
+ // jmp r
+
+ if (mark == NULL) {
+ mark = cbuf.insts_mark(); // Get mark within main instrs section.
+ }
+
+ // Note that the code buffer's insts_mark is always relative to insts.
+ // That's why we must use the macroassembler to generate a stub.
+ MacroAssembler _masm(&cbuf);
+
+ address base =
+ __ start_a_stub(to_aot_stub_size());
+ guarantee(base != NULL, "out of space");
+
+ // Static stub relocation stores the instruction address of the call.
+ __ relocate(static_stub_Relocation::spec(mark, true /* is_aot */));
+ // Load destination AOT code address.
+ __ movptr(rscratch1, 0); // address is zapped till fixup time.
+ // This is recognized as unresolved by relocs/nativeinst/ic code.
+ __ br(rscratch1);
+
+ assert(__ pc() - base <= to_aot_stub_size(), "wrong stub size");
+
+ // Update current stubs pointer and restore insts_end.
+ __ end_a_stub();
+}
+#undef __
+
+int CompiledStaticCall::to_aot_stub_size() {
+ if (UseAOT) {
+ return 5 * 4; // movz; movk; movk; movk; br
+ } else {
+ return 0;
+ }
+}
+
+// Relocation entries for call stub, compiled java to aot.
+int CompiledStaticCall::reloc_to_aot_stub() {
+ if (UseAOT) {
+ return 5 * 4; // movz; movk; movk; movk; br
+ } else {
+ return 0;
+ }
+}
+#endif // INCLUDE_AOT
+
void CompiledDirectStaticCall::set_to_interpreted(const methodHandle& callee, address entry) {
address stub = find_stub(false /* is_aot */);
guarantee(stub != NULL, "stub not found");
if (TraceICs) {
< prev index next >