Mercurial > hg > truffle
diff c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/Compiler.java @ 2284:569d3fe7d65c
non-static VMEntries and VMExits, CompilationServer simplifications
author | Lukas Stadler <lukas.stadler@jku.at> |
---|---|
date | Thu, 07 Apr 2011 15:32:25 +0200 |
parents | 76607939e139 |
children | 762de4b26788 |
line wrap: on
line diff
--- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/Compiler.java Mon Apr 04 21:02:45 2011 +0200 +++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/Compiler.java Thu Apr 07 15:32:25 2011 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010 Sun Microsystems, Inc. All rights reserved. + * Copyright (c) 2011 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 @@ -20,14 +20,13 @@ */ package com.sun.hotspot.c1x; +import java.io.*; import java.lang.management.*; import java.lang.reflect.Proxy; import java.net.*; import com.sun.c1x.*; import com.sun.c1x.target.amd64.*; -import com.sun.cri.ci.*; -import com.sun.cri.ri.*; import com.sun.cri.xir.*; import com.sun.hotspot.c1x.logging.*; import com.sun.hotspot.c1x.server.CompilationServer.ReplacingInputStream; @@ -43,18 +42,19 @@ private static Compiler theInstance; private static boolean PrintGCStats = false; + private final VMEntries vmEntries; + private final VMExits vmExits; + public static Compiler getInstance() { if (theInstance == null) { - theInstance = new Compiler(); + theInstance = new Compiler(null); Runtime.getRuntime().addShutdownHook(new ShutdownThread()); } return theInstance; } - private static VMEntries vmEntries; + public static class ShutdownThread extends Thread { - - public static class ShutdownThread extends Thread { @Override public void run() { VMExitsNative.compileMethods = false; @@ -64,7 +64,6 @@ if (C1XOptions.PrintTimers) { C1XTimers.print(); } - if (PrintGCStats) { printGCStats(); } @@ -91,127 +90,95 @@ System.out.println("Total Garbage Collection Time (ms): " + garbageCollectionTime); } - public static VMExits initializeServer(VMEntries entries) { - if (Logger.ENABLED) { - vmEntries = LoggingProxy.getProxy(VMEntries.class, entries); - vmExits = LoggingProxy.getProxy(VMExits.class, new VMExitsNative()); - } else { - vmEntries = entries; - vmExits = new VMExitsNative(); - } - return vmExits; + public static Compiler initializeServer(VMEntries entries) { + assert theInstance == null; + theInstance = new Compiler(entries); + return theInstance; } - private static VMEntries initializeClient(VMExits exits) { - vmEntries = new VMEntriesNative(); - vmExits = exits; + public VMEntries getVMEntries() { return vmEntries; } - public static VMEntries getVMEntries() { - if (vmEntries == null) { - try { - vmEntries = new VMEntriesNative(); - if (CountingProxy.ENABLED) { - vmEntries = CountingProxy.getProxy(VMEntries.class, vmEntries); - } - if (Logger.ENABLED) { - vmEntries = LoggingProxy.getProxy(VMEntries.class, vmEntries); - } - } catch (Throwable t) { - t.printStackTrace(); - } - } - return vmEntries; - } - - private static VMExits vmExits; - - public static VMExits getVMExits() { - if (vmExits == null) { - String remote = System.getProperty("c1x.remote"); - assert theInstance == null; - assert vmEntries == null; - try { - if (remote != null) { - System.out.println("C1X compiler started in client/server mode, connection to server " + remote); - Socket socket = new Socket(remote, 1199); - ReplacingOutputStream output = new ReplacingOutputStream(socket.getOutputStream()); - ReplacingInputStream input = new ReplacingInputStream(socket.getInputStream()); - - InvocationSocket invocation = new InvocationSocket(output, input); - VMExits exits = (VMExits) Proxy.newProxyInstance(VMExits.class.getClassLoader(), new Class<?>[] {VMExits.class}, invocation); - VMEntries entries = Compiler.initializeClient(exits); - invocation.setDelegate(entries); - } else { - vmExits = new VMExitsNative(); - if (CountingProxy.ENABLED) { - vmExits = CountingProxy.getProxy(VMExits.class, vmExits); - } - if (Logger.ENABLED) { - vmExits = LoggingProxy.getProxy(VMExits.class, vmExits); - } - } - } catch (Throwable t) { - t.printStackTrace(); - } - } + public VMExits getVMExits() { return vmExits; } private final C1XCompiler compiler; - private final HotSpotVMConfig config; - private final HotSpotRuntime runtime; - private final HotSpotRegisterConfig registerConfig; - private final CiTarget target; - private final RiXirGenerator generator; - private Compiler() { - config = getVMEntries().getConfiguration(); - config.check(); + private Compiler(VMEntries entries) { + // remote compilation (will not create a C1XCompiler) + String remote = System.getProperty("c1x.remote"); + if (remote != null) { + try { + System.out.println("C1X compiler started in client/server mode, server: " + remote); + Socket socket = new Socket(remote, 1199); + + ReplacingOutputStream output = new ReplacingOutputStream(new BufferedOutputStream(socket.getOutputStream())); + // required, because creating an ObjectOutputStream writes a header, but doesn't flush the stream + output.flush(); + ReplacingInputStream input = new ReplacingInputStream(new BufferedInputStream(socket.getInputStream())); + input.setCompiler(this); - runtime = new HotSpotRuntime(config); - final int wordSize = 8; - final int stackFrameAlignment = 16; - registerConfig = runtime.globalStubRegConfig; - target = new HotSpotTarget(new AMD64(), true, wordSize, stackFrameAlignment, config.vmPageSize, wordSize, true); + InvocationSocket invocation = new InvocationSocket(output, input); + vmEntries = new VMEntriesNative(); + vmExits = (VMExits) Proxy.newProxyInstance(VMExits.class.getClassLoader(), new Class<?>[] { VMExits.class}, invocation); + invocation.setDelegate(vmEntries); + compiler = null; + return; + } catch (IOException t) { + System.out.println("Connection to compilation server FAILED."); + throw new RuntimeException(t); + } + } + + // initialize VMEntries + if (entries == null) + entries = new VMEntriesNative(); + // initialize VMExits + VMExits exits = new VMExitsNative(this); + + // logging, etc. + if (CountingProxy.ENABLED) { + exits = CountingProxy.getProxy(VMExits.class, exits); + entries = CountingProxy.getProxy(VMEntries.class, entries); + } if (Logger.ENABLED) { - generator = LoggingProxy.getProxy(RiXirGenerator.class, new HotSpotXirGenerator(config, target, registerConfig)); - } else { - generator = new HotSpotXirGenerator(config, target, registerConfig); + exits = LoggingProxy.getProxy(VMExits.class, exits); + entries = LoggingProxy.getProxy(VMEntries.class, entries); } - compiler = new C1XCompiler(runtime, target, generator, registerConfig); + + // set the final fields + vmEntries = entries; + vmExits = exits; + + // initialize compiler and C1XOptions + HotSpotVMConfig config = vmEntries.getConfiguration(); + config.check(); // these options are important - c1x4hotspot will not generate correct code without them C1XOptions.GenSpecialDivChecks = true; C1XOptions.NullCheckUniquePc = true; C1XOptions.InvokeSnippetAfterArguments = true; C1XOptions.StackShadowPages = config.stackShadowPages; + + HotSpotRuntime runtime = new HotSpotRuntime(config, this); + HotSpotRegisterConfig registerConfig = runtime.globalStubRegConfig; + + final int wordSize = 8; + final int stackFrameAlignment = 16; + HotSpotTarget target = new HotSpotTarget(new AMD64(), true, wordSize, stackFrameAlignment, config.vmPageSize, wordSize, true); + + RiXirGenerator generator = new HotSpotXirGenerator(config, target, registerConfig, this); + if (Logger.ENABLED) { + generator = LoggingProxy.getProxy(RiXirGenerator.class, generator); + } + compiler = new C1XCompiler(runtime, target, generator, registerConfig); } public C1XCompiler getCompiler() { return compiler; } - public HotSpotVMConfig getConfig() { - return config; - } - - public HotSpotRuntime getRuntime() { - return runtime; - } - - public RiRegisterConfig getRegisterConfig() { - return registerConfig; - } - - public CiTarget getTarget() { - return target; - } - - public RiXirGenerator getGenerator() { - return generator; - } - }