/*
* 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.compiler;
import com.oracle.max.criutils.*;
import com.oracle.max.graal.compiler.debug.*;
import com.oracle.max.graal.compiler.observer.*;
/**
* This class is intended for non-essential stuff like statistics, observing, etc. It should not be used for anything
* that has a direct influence on the result of a compilation!
*/
public class GraalContext {
public static final GraalContext EMPTY_CONTEXT = new GraalContext(true, "silent context");
public final ObservableContext observable = new ObservableContext();
public final GraalTimers timers = new GraalTimers();
public final GraalMetrics metrics = new GraalMetrics();
private final String name;
private GraalContext(boolean empty, String name) {
this.name = name;
if (!empty) {
reset();
}
}
public GraalContext(String name) {
this(false, name);
}
public boolean isObserved() {
return observable.isObserved();
}
public void reset() {
observable.clear();
if (GraalOptions.PrintCFGToFile) {
observable.addCompilationObserver(new CFGPrinterObserver());
}
if (GraalOptions.PrintDOTGraphToFile) {
observable.addCompilationObserver(new GraphvizPrinterObserver(false));
}
if (GraalOptions.PrintDOTGraphToPdf) {
observable.addCompilationObserver(new GraphvizPrinterObserver(true));
}
if (GraalOptions.PrintIdealGraphLevel != 0 || GraalOptions.Plot || GraalOptions.PlotOnError) {
CompilationObserver observer;
if (GraalOptions.PrintIdealGraphFile) {
observer = new IdealGraphPrinterObserver();
} else {
observer = new IdealGraphPrinterObserver(GraalOptions.PrintIdealGraphAddress, GraalOptions.PrintIdealGraphPort);
}
observable.addCompilationObserver(observer);
}
}
public void print() {
if (GraalOptions.Meter || GraalOptions.Time) {
for (int i = 0; i < 22 + name.length(); i++) {
TTY.print('=');
}
TTY.println("\n========== " + name + " ==========");
if (GraalOptions.Meter) {
metrics.print();
}
if (GraalOptions.Time) {
timers.print();
}
}
}
}