blob: be909cfc40a3a4f150698fc8c6c8cb4bee270ea1 [file] [log] [blame]
/*
* Copyright (c) 2011, 2016, Oracle and/or its affiliates. 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.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package jdk.vm.ci.hotspot;
import jdk.vm.ci.code.BytecodeFrame;
import jdk.vm.ci.code.CompiledCode;
import jdk.vm.ci.code.StackSlot;
import jdk.vm.ci.code.site.DataPatch;
import jdk.vm.ci.code.site.Infopoint;
import jdk.vm.ci.code.site.Site;
import jdk.vm.ci.meta.Assumptions.Assumption;
import jdk.vm.ci.meta.ResolvedJavaMethod;
/**
* A {@link CompiledCode} with additional HotSpot-specific information required for installing the
* code in HotSpot's code cache.
*/
public class HotSpotCompiledCode implements CompiledCode {
/**
* The name of this compilation unit.
*/
protected final String name;
/**
* The buffer containing the emitted machine code.
*/
protected final byte[] targetCode;
/**
* The leading number of bytes in {@link #targetCode} containing the emitted machine code.
*/
protected final int targetCodeSize;
/**
* A list of code annotations describing special sites in {@link #targetCode}.
*/
protected final Site[] sites;
/**
* A list of {@link Assumption} this code relies on.
*/
protected final Assumption[] assumptions;
/**
* The list of the methods whose bytecodes were used as input to the compilation. If
* {@code null}, then the compilation did not record method dependencies. Otherwise, the first
* element of this array is the root method of the compilation.
*/
protected final ResolvedJavaMethod[] methods;
/**
* A list of comments that will be included in code dumps.
*/
protected final Comment[] comments;
/**
* The data section containing serialized constants for the emitted machine code.
*/
protected final byte[] dataSection;
/**
* The minimum alignment of the data section.
*/
protected final int dataSectionAlignment;
/**
* A list of relocations in the {@link #dataSection}.
*/
protected final DataPatch[] dataSectionPatches;
/**
* A flag determining whether this code is immutable and position independent.
*/
protected final boolean isImmutablePIC;
/**
* The total size of the stack frame of this compiled method.
*/
protected final int totalFrameSize;
/**
* The deopt rescue slot. Must be non-null if there is a safepoint in the method.
*/
protected final StackSlot deoptRescueSlot;
public static class Comment {
public final String text;
public final int pcOffset;
public Comment(int pcOffset, String text) {
this.text = text;
this.pcOffset = pcOffset;
}
}
@SuppressFBWarnings(value = "EI_EXPOSE_REP2", justification = "caller transfers ownership of `sites`, `targetCode`, `comments`, `methods`, `dataSection`, `dataSectionPatches` and `assumptions`")
public HotSpotCompiledCode(String name, byte[] targetCode, int targetCodeSize, Site[] sites, Assumption[] assumptions, ResolvedJavaMethod[] methods, Comment[] comments, byte[] dataSection,
int dataSectionAlignment, DataPatch[] dataSectionPatches, boolean isImmutablePIC, int totalFrameSize, StackSlot deoptRescueSlot) {
this.name = name;
this.targetCode = targetCode;
this.targetCodeSize = targetCodeSize;
this.sites = sites;
this.assumptions = assumptions;
this.methods = methods;
this.comments = comments;
this.dataSection = dataSection;
this.dataSectionAlignment = dataSectionAlignment;
this.dataSectionPatches = dataSectionPatches;
this.isImmutablePIC = isImmutablePIC;
this.totalFrameSize = totalFrameSize;
this.deoptRescueSlot = deoptRescueSlot;
assert validateFrames();
}
public String getName() {
return name;
}
@Override
public String toString() {
return name;
}
/**
* Ensure that all the frames passed into the VM are properly formatted with an empty or illegal
* slot following double word slots.
*/
private boolean validateFrames() {
for (Site site : sites) {
if (site instanceof Infopoint) {
Infopoint info = (Infopoint) site;
if (info.debugInfo != null) {
BytecodeFrame frame = info.debugInfo.frame();
assert frame == null || frame.validateFormat();
}
}
}
return true;
}
}