Merge "Support --pg-conf in Disassemble for class-file input"
diff --git a/src/main/java/com/android/tools/r8/Disassemble.java b/src/main/java/com/android/tools/r8/Disassemble.java
index 4f64416..9b1599f 100644
--- a/src/main/java/com/android/tools/r8/Disassemble.java
+++ b/src/main/java/com/android/tools/r8/Disassemble.java
@@ -161,6 +161,7 @@
InternalOptions getInternalOptions() {
InternalOptions internal = new InternalOptions();
internal.useSmaliSyntax = useSmali;
+ internal.enableCfFrontend = true;
return internal;
}
}
diff --git a/src/main/java/com/android/tools/r8/cf/CfPrinter.java b/src/main/java/com/android/tools/r8/cf/CfPrinter.java
index f907ffb..66664e6 100644
--- a/src/main/java/com/android/tools/r8/cf/CfPrinter.java
+++ b/src/main/java/com/android/tools/r8/cf/CfPrinter.java
@@ -59,6 +59,8 @@
import com.android.tools.r8.ir.code.NumericType;
import com.android.tools.r8.ir.code.Position;
import com.android.tools.r8.ir.code.ValueType;
+import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.naming.MemberNaming.MethodSignature;
import com.android.tools.r8.utils.DescriptorUtils;
import it.unimi.dsi.fastutil.ints.Int2ReferenceMap.Entry;
import it.unimi.dsi.fastutil.ints.IntList;
@@ -80,15 +82,18 @@
private final Map<CfLabel, String> labels;
private final StringBuilder builder = new StringBuilder();
+ private final ClassNameMapper mapper;
/** Entry for printing single instructions without global knowledge (eg, label numbers). */
public CfPrinter() {
indent = "";
labels = null;
+ mapper = null;
}
/** Entry for printing a complete code object. */
- public CfPrinter(CfCode code) {
+ public CfPrinter(CfCode code, ClassNameMapper mapper) {
+ this.mapper = mapper;
indent = " ";
labels = new HashMap<>();
int nextLabelNumber = 0;
@@ -284,12 +289,13 @@
}
public void print(CfFrame frame) {
- StringBuilder builder = new StringBuilder("frame: [");
+ indent();
+ builder.append("; frame: [");
{
String separator = "";
for (Entry<FrameType> entry : frame.getLocals().int2ReferenceEntrySet()) {
builder.append(separator).append(entry.getIntKey()).append(':');
- print(entry.getValue(), builder);
+ print(entry.getValue());
separator = ", ";
}
}
@@ -298,17 +304,18 @@
String separator = "";
for (FrameType element : frame.getStack()) {
builder.append(separator);
- print(element, builder);
+ print(element);
separator = ", ";
}
}
builder.append(']');
- comment(builder.toString());
}
- private void print(FrameType type, StringBuilder builder) {
+ private void print(FrameType type) {
if (type.isUninitializedNew()) {
builder.append("uninitialized ").append(getLabel(type.getUninitializedLabel()));
+ } else if (type.isInitialized()) {
+ appendType(type.getInitializedType());
} else {
builder.append(type.toString());
}
@@ -566,19 +573,50 @@
}
private void appendDescriptor(DexType type) {
+ if (mapper != null) {
+ builder.append(DescriptorUtils.javaTypeToDescriptor(mapper.originalNameOf(type)));
+ return;
+ }
builder.append(type.toDescriptorString());
}
+ private void appendType(DexType type) {
+ if (type.isArrayType() || type.isClassType()) {
+ appendClass(type);
+ } else {
+ builder.append(type);
+ }
+ }
+
private void appendClass(DexType type) {
- builder.append(type.getInternalName());
+ assert type.isArrayType() || type.isClassType();
+ if (mapper == null) {
+ builder.append(type.getInternalName());
+ } else if (type == DexItemFactory.nullValueType) {
+ builder.append("NULL");
+ } else {
+ builder.append(
+ DescriptorUtils.descriptorToInternalName(
+ DescriptorUtils.javaTypeToDescriptor(mapper.originalNameOf(type))));
+ }
}
private void appendField(DexField field) {
+ if (mapper != null) {
+ builder.append(mapper.originalSignatureOf(field).toString());
+ return;
+ }
appendClass(field.getHolder());
builder.append('/').append(field.name);
}
private void appendMethod(DexMethod method) {
+ if (mapper != null) {
+ MethodSignature signature = (MethodSignature) mapper.originalSignatureOf(method);
+ builder.append(mapper.originalNameOf(method.holder)).append('.');
+ builder.append(signature.name).append(signature.toDescriptor());
+ return;
+ }
builder.append(method.qualifiedName());
builder.append(method.proto.toDescriptorString());
}
diff --git a/src/main/java/com/android/tools/r8/graph/AssemblyWriter.java b/src/main/java/com/android/tools/r8/graph/AssemblyWriter.java
index 63a2958..89abadd 100644
--- a/src/main/java/com/android/tools/r8/graph/AssemblyWriter.java
+++ b/src/main/java/com/android/tools/r8/graph/AssemblyWriter.java
@@ -79,7 +79,7 @@
void writeMethod(DexEncodedMethod method, PrintStream ps) {
ClassNameMapper naming = application.getProguardMap();
String methodName = naming != null
- ? naming.originalSignatureOf(method.method).toString()
+ ? naming.originalSignatureOf(method.method).name
: method.method.name.toString();
ps.println("#");
ps.println("# Method: '" + methodName + "':");
diff --git a/src/main/java/com/android/tools/r8/graph/CfCode.java b/src/main/java/com/android/tools/r8/graph/CfCode.java
index 1fd4a73..ffa34d1 100644
--- a/src/main/java/com/android/tools/r8/graph/CfCode.java
+++ b/src/main/java/com/android/tools/r8/graph/CfCode.java
@@ -251,11 +251,11 @@
@Override
public String toString() {
- return new CfPrinter(this).toString();
+ return new CfPrinter(this, null).toString();
}
@Override
public String toString(DexEncodedMethod method, ClassNameMapper naming) {
- return null;
+ return new CfPrinter(this, naming).toString();
}
}
diff --git a/src/main/java/com/android/tools/r8/graph/LazyCfCode.java b/src/main/java/com/android/tools/r8/graph/LazyCfCode.java
index 8ecc1ab..454ed29 100644
--- a/src/main/java/com/android/tools/r8/graph/LazyCfCode.java
+++ b/src/main/java/com/android/tools/r8/graph/LazyCfCode.java
@@ -203,7 +203,7 @@
@Override
public String toString(DexEncodedMethod method, ClassNameMapper naming) {
- return null;
+ return asCfCode().toString(method, naming);
}
private static class ClassCodeVisitor extends ClassVisitor {