Mercurial > hg > graal-jvmci-8
diff c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTargetMethod.java @ 1423:760213a60e8b
* rewrite of the code installation
* partial support for safepoints
* macro-based CiTargetMethod interface
* code stub support
author | Lukas Stadler <lukas.stadler@oracle.com> |
---|---|
date | Mon, 16 Aug 2010 18:59:36 -0700 |
parents | 3483ec571caf |
children | 149b1d2316de |
line wrap: on
line diff
--- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTargetMethod.java Mon Aug 02 15:44:38 2010 -0700 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTargetMethod.java Mon Aug 16 18:59:36 2010 -0700 @@ -1,88 +1,83 @@ +/* + * Copyright (c) 2010 Sun Microsystems, Inc. All rights reserved. + * + * Sun Microsystems, Inc. has intellectual property rights relating to technology embodied in the product that is + * described in this document. In particular, and without limitation, these intellectual property rights may include one + * or more of the U.S. patents listed at http://www.sun.com/patents and one or more additional patents or pending patent + * applications in the U.S. and in other countries. + * + * U.S. Government Rights - Commercial software. Government users are subject to the Sun Microsystems, Inc. standard + * license agreement and applicable provisions of the FAR and its supplements. + * + * Use is subject to license terms. Sun, Sun Microsystems, the Sun logo, Java and Solaris are trademarks or registered + * trademarks of Sun Microsystems, Inc. in the U.S. and other countries. All SPARC trademarks are used under license and + * are trademarks or registered trademarks of SPARC International, Inc. in the U.S. and other countries. + * + * UNIX is a registered trademark in the U.S. and other countries, exclusively licensed through X/Open Company, Ltd. + */ package com.sun.hotspot.c1x; -import java.lang.reflect.*; import java.util.*; import com.sun.cri.ci.*; -import com.sun.cri.ci.CiTargetMethod.*; -import com.sun.cri.ri.*; +import com.sun.cri.ci.CiTargetMethod.Site; -public class HotSpotTargetMethod { +/** + * CiTargetMethod augmented with HotSpot-specific information. + * + * @author Lukas Stadler + */ +public class HotSpotTargetMethod implements CompilerObject { - public final Method method; - private byte[] code; - private int codeSize; - private int frameSize; + public final CiTargetMethod targetMethod; + public final HotSpotMethod method; // used only for methods + public final String name; // used only for stubs - public int verifiedEntrypoint; - public int unverifiedEntrypoint; + public final Site[] sites; - public int relocationOffsets[]; - public Object relocationData[]; + private HotSpotTargetMethod(HotSpotMethod method, CiTargetMethod targetMethod) { + this.method = method; + this.targetMethod = targetMethod; + this.name = null; - private HotSpotTargetMethod(HotSpotVMConfig config, RiMethod method, CiTargetMethod targetMethod) { - this.method= ((HotSpotMethod) method).method; - code = targetMethod.targetCode(); - codeSize = targetMethod.targetCodeSize(); - frameSize = targetMethod.frameSize(); - verifiedEntrypoint = targetMethod.entrypointCodeOffsets.get(HotSpotRuntime.Entrypoints.VERIFIED); - unverifiedEntrypoint = targetMethod.entrypointCodeOffsets.get(HotSpotRuntime.Entrypoints.UNVERIFIED); + sites = getSortedSites(targetMethod); + } + + private HotSpotTargetMethod(CiTargetMethod targetMethod, String name) { + this.method = null; + this.targetMethod = targetMethod; + this.name = name; + + sites = getSortedSites(targetMethod); + } - Map<Integer, Object> relocations = new TreeMap<Integer, Object>(); - if (!targetMethod.dataReferences.isEmpty()) { - for (DataPatch patch : targetMethod.dataReferences) { - if (patch.data.kind == CiKind.Object) { - if (patch.data.asObject() instanceof RiType) { - relocations.put(patch.pcOffset, patch.data.asObject()); - } else { - throw new RuntimeException("unexpected data reference"); - } - } + private Site[] getSortedSites(CiTargetMethod target) { + List<?>[] lists = new List<?>[] {target.directCalls, target.indirectCalls, target.safepoints, target.dataReferences, target.exceptionHandlers, target.marks}; + int count = 0; + for (List<?> list: lists) { + count += list.size(); + } + Site[] result = new Site[count]; + int pos = 0; + for (List<?> list: lists) { + for (Object elem: list) { + result[pos++] = (Site)elem; } } - - if (!targetMethod.directCalls.isEmpty()) { - for (CiTargetMethod.Call call : targetMethod.directCalls) { - if (call.globalStubID instanceof Long) { - relocations.put(call.pcOffset, (Long)call.globalStubID); - } else if (call.globalStubID instanceof CiRuntimeCall) { - switch ((CiRuntimeCall) call.globalStubID) { - case Debug: - // relocations.put(call.pcOffset, config.debugStub); - System.out.println("debug call"); - break; - case UnwindException: - case RegisterFinalizer: - case HandleException: - case OSRMigrationEnd: - case JavaTimeMillis: - case JavaTimeNanos: - case ArithmethicLrem: - case ArithmeticLdiv: - case ArithmeticFrem: - case ArithmeticDrem: - case ArithmeticCos: - case ArithmeticTan: - case ArithmeticLog: - case ArithmeticLog10: - case ArithmeticSin: - default: - throw new RuntimeException("unexpected runtime call: " + call.globalStubID); - } - } + Arrays.sort(result, new Comparator<Site>() { + public int compare(Site s1, Site s2) { + return s1.pcOffset - s2.pcOffset; } - } - relocationOffsets = new int[relocations.size()]; - relocationData = new Object[relocations.size()]; - int i=0; - for( Map.Entry<Integer, Object> entry: relocations.entrySet()) { - relocationOffsets[i] = entry.getKey(); - relocationData[i++] = entry.getValue(); - } + }); + return result; } - public static void installCode(HotSpotVMConfig config, RiMethod method, CiTargetMethod targetMethod) { - Compiler.getVMEntries().installCode(new HotSpotTargetMethod(config, method, targetMethod)); + public static void installMethod(HotSpotMethod method, CiTargetMethod targetMethod) { + Compiler.getVMEntries().installMethod(new HotSpotTargetMethod(method, targetMethod)); + } + + public static Object installStub(CiTargetMethod targetMethod, String name) { + return Compiler.getVMEntries().installStub(new HotSpotTargetMethod(targetMethod, name)); } }