Mercurial > hg > truffle
view graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotRuntime.java @ 2874:d90bf514d647
Renamed packages.
author | Thomas Wuerthinger <thomas@wuerthinger.net> |
---|---|
date | Wed, 08 Jun 2011 08:59:54 +0200 |
parents | graal/com.oracle.max.graal.runtime/src/com/oracle/graal/runtime/HotSpotRuntime.java@0341b6424579 |
children | 0ef7a8219b45 |
line wrap: on
line source
/* * Copyright (c) 2011, 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 com.oracle.max.graal.runtime; import java.io.*; import java.lang.reflect.*; import java.util.*; import com.sun.cri.ci.*; import com.sun.cri.ci.CiTargetMethod.Call; import com.sun.cri.ci.CiTargetMethod.DataPatch; import com.sun.cri.ci.CiTargetMethod.Safepoint; import com.sun.cri.ri.*; import com.sun.max.asm.dis.*; import com.sun.max.lang.*; /** * CRI runtime implementation for the HotSpot VM. */ public class HotSpotRuntime implements RiRuntime { final HotSpotVMConfig config; final HotSpotRegisterConfig regConfig; final HotSpotRegisterConfig globalStubRegConfig; private final Compiler compiler; public HotSpotRuntime(HotSpotVMConfig config, Compiler compiler) { this.config = config; this.compiler = compiler; regConfig = new HotSpotRegisterConfig(config, false); globalStubRegConfig = new HotSpotRegisterConfig(config, true); } @Override public int codeOffset() { return 0; } @Override public String disassemble(byte[] code, long address) { return disassemble(code, new DisassemblyPrinter(false), address); } private String disassemble(byte[] code, DisassemblyPrinter disassemblyPrinter, long address) { final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); final ISA instructionSet = ISA.AMD64; Disassembler.disassemble(byteArrayOutputStream, code, instructionSet, WordWidth.BITS_64, address, null, disassemblyPrinter); return byteArrayOutputStream.toString(); } @Override public String disassemble(final CiTargetMethod targetMethod) { final DisassemblyPrinter disassemblyPrinter = new DisassemblyPrinter(false) { private String toString(Call call) { if (call.runtimeCall != null) { return "{" + call.runtimeCall.name() + "}"; } else if (call.symbol != null) { return "{" + call.symbol + "}"; } else if (call.globalStubID != null) { return "{" + call.globalStubID + "}"; } else { return "{" + call.method + "}"; } } private String siteInfo(int pcOffset) { for (Call call : targetMethod.directCalls) { if (call.pcOffset == pcOffset) { return toString(call); } } for (Call call : targetMethod.indirectCalls) { if (call.pcOffset == pcOffset) { return toString(call); } } for (Safepoint site : targetMethod.safepoints) { if (site.pcOffset == pcOffset) { return "{safepoint}"; } } for (DataPatch site : targetMethod.dataReferences) { if (site.pcOffset == pcOffset) { return "{" + site.constant + "}"; } } return null; } @Override protected String disassembledObjectString(Disassembler disassembler, DisassembledObject disassembledObject) { final String string = super.disassembledObjectString(disassembler, disassembledObject); String site = siteInfo(disassembledObject.startPosition()); if (site != null) { return string + " " + site; } return string; } }; final byte[] code = Arrays.copyOf(targetMethod.targetCode(), targetMethod.targetCodeSize()); return disassemble(code, disassemblyPrinter, 0L); } @Override public String disassemble(RiMethod method) { return "No disassembler available"; } @Override public RiConstantPool getConstantPool(RiMethod method) { return ((HotSpotTypeResolved) method.holder()).constantPool(); } @Override public RiOsrFrame getOsrFrame(RiMethod method, int bci) { return null; } public Class<?> getJavaClass(CiConstant c) { return null; } @Override public RiType asRiType(CiKind kind) { return compiler.getVMEntries().getType(kind.toJavaClass()); } @Override public RiType getTypeOf(CiConstant constant) { return compiler.getVMEntries().getRiType(constant); } @Override public boolean isExceptionType(RiType type) { return type.isSubtypeOf(compiler.getVMEntries().getType(Throwable.class)); } @Override public RiSnippets getSnippets() { throw new UnsupportedOperationException("getSnippets"); } @Override public boolean mustInline(RiMethod method) { return false; } @Override public boolean mustNotCompile(RiMethod method) { return false; } @Override public boolean mustNotInline(RiMethod method) { return Modifier.isNative(method.accessFlags()); } @Override public Object registerGlobalStub(CiTargetMethod targetMethod, String name) { return HotSpotTargetMethod.installStub(compiler, targetMethod, name); } @Override public int sizeOfBasicObjectLock() { // TODO shouldn't be hard coded return 2 * 8; } @Override public int basicObjectLockOffsetInBytes() { return 8; } @Override public CiConstant invoke(RiMethod method, CiMethodInvokeArguments args) { return null; } @Override public CiConstant foldWordOperation(int opcode, CiMethodInvokeArguments args) { throw new UnsupportedOperationException("foldWordOperation"); } @Override public boolean areConstantObjectsEqual(CiConstant x, CiConstant y) { return compiler.getVMEntries().compareConstantObjects(x, y); } @Override public RiRegisterConfig getRegisterConfig(RiMethod method) { return regConfig; } /** * HotSpots needs an area suitable for storing a program counter for temporary use during the deoptimization process. */ @Override public int getCustomStackAreaSize() { return 8; } @Override public boolean supportsArrayIntrinsics() { return true; } @Override public int getArrayLength(CiConstant array) { return compiler.getVMEntries().getArrayLength(array); } @Override public Class<?> asJavaClass(CiConstant c) { return null; } @Override public Object asJavaObject(CiConstant c) { return null; } }