blob: 543aba40cfc3e4a0efa4230a144f630b78a2c688 [file] [log] [blame]
// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.ir.optimize;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.ir.code.Invoke.Type;
import com.android.tools.r8.ir.code.InvokeMethod;
import java.util.ArrayList;
import java.util.List;
// Class for collecting inlining information for one compiled DexEncodedMethod.
public class InliningInfo {
static class Edge {
final Type type;
final DexMethod declared;
final Node inlinee;
public Edge(Type type, DexMethod declared, Node inlinee) {
this.type = type;
this.declared = declared;
this.inlinee = inlinee;
}
void appendOn(StringBuffer buffer) {
if (declared != null) {
buffer.append(declared.toSourceString());
buffer.append(' ');
}
inlinee.appendOn(buffer);
}
}
static abstract class Node {
abstract void appendOn(StringBuffer buffer);
}
static class Inlining extends Node {
final DexEncodedMethod target;
Inlining(DexEncodedMethod target) {
this.target = target;
}
void appendOn(StringBuffer buffer) {
buffer.append("<< INLINED");
}
}
static class NotInlining extends Node {
final String reason;
NotInlining(String reason) {
this.reason = reason;
}
public void appendOn(StringBuffer buffer) {
buffer.append("-- no inlining: ");
buffer.append(reason);
}
}
final DexEncodedMethod method;
final List<Edge> edges = new ArrayList<>();
public InliningInfo(DexEncodedMethod method) {
this.method = method;
}
public void include(Type type, DexEncodedMethod target) {
edges.add(new Edge(type, target.method, new Inlining(target)));
}
public void exclude(InvokeMethod invoke, String reason) {
edges.add(new Edge(invoke.getType(), invoke.getInvokedMethod(), new NotInlining(reason)));
}
public String toString() {
StringBuffer buffer = new StringBuffer(method.method.toSourceString());
buffer.append(" {\n");
for (Edge edge : edges) {
buffer.append(" ");
edge.appendOn(buffer);
buffer.append(".\n");
}
buffer.append("}\n");
return buffer.toString();
}
}