Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(137)

Unified Diff: tools/binary_size/java/src/org/chromium/tools/binary_size/NmDumper.java

Issue 119083006: Add tool to help analyze binary size (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase onto master for a clean commit of gyp change Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: tools/binary_size/java/src/org/chromium/tools/binary_size/NmDumper.java
diff --git a/tools/binary_size/java/src/org/chromium/tools/binary_size/NmDumper.java b/tools/binary_size/java/src/org/chromium/tools/binary_size/NmDumper.java
new file mode 100644
index 0000000000000000000000000000000000000000..0d77e37f63d397e543d163da9cb3c1edfd5b6b17
--- /dev/null
+++ b/tools/binary_size/java/src/org/chromium/tools/binary_size/NmDumper.java
@@ -0,0 +1,161 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+package org.chromium.tools.binary_size;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.PrintWriter;
+
+/**
+ * Converts records to a format that simulates output from 'nm'.
+ */
+class NmDumper {
+ private final String mOutPath;
+ private final String mSkipPath;
+ private final String mFailPath;
+ private final Output mOutput;
+
+ /**
+ * Create a new dumper that will output to the specified paths.
+ * @param outPath where to write all records and lines, including lines
+ * that are skipped or records that failed to resolve
+ * @param failPath if not null, a path to which <em>only</em> records that
+ * failed to resolve will be written
+ * @param skipPath if not null, a path to which <em>only</em> lines that
+ * were skipped will be written
+ */
+ NmDumper(final String outPath, final String failPath, final String skipPath) {
+ mOutPath = outPath;
+ mFailPath = failPath;
+ mSkipPath = skipPath;
+ mOutput = new Output();
+ }
+
+ /**
+ * Close all output files.
+ */
+ void close() {
+ mOutput.closeAll();
+ }
+
+ /**
+ * Output a line that was skipped.
+ * @param line the line
+ */
+ void skipped(String line) {
+ mOutput.printSkip(line);
+ }
+
+ /**
+ * Output a record that failed to resolve.
+ * @param record the record
+ */
+ void failed(Record record) {
+ mOutput.printFail(simulateNmOutput(record));
+ }
+
+ /**
+ * Output a record that successfully resolved.
+ * @param record the record
+ */
+ void succeeded(Record record) {
+ mOutput.print(simulateNmOutput(record));
+ }
+
+ /**
+ * Generate a string that looks like output from nm for a given record.
+ * @param record the record
+ * @return nm-like output
+ */
+ private static final String simulateNmOutput(final Record record) {
+ StringBuilder builder = new StringBuilder(record.address);
+ builder.append(' ');
+ builder.append(record.size);
+ builder.append(' ');
+ builder.append(record.symbolType);
+ builder.append(' ');
+ builder.append(record.symbolName != null ? record.symbolName : "unknown");
+ if (record.location != null) {
+ builder.append('\t');
+ builder.append(record.location);
+ }
+ return builder.toString();
+ }
+
+ private class Output {
+ private final PrintWriter skipWriter;
+ private final PrintWriter failWriter;
+ private final PrintWriter outWriter;
+
+ private Output() {
+ try {
+ new File(mOutPath).getParentFile().mkdirs();
+ outWriter = new PrintWriter(mOutPath);
+ } catch (FileNotFoundException e) {
+ throw new RuntimeException("Can't open output file: " + mOutPath, e);
+ }
+
+ if (mFailPath != null) {
+ try {
+ new File(mFailPath).getParentFile().mkdirs();
+ failWriter = new PrintWriter(mFailPath);
+ } catch (FileNotFoundException e) {
+ throw new RuntimeException("Can't open fail file: " + mFailPath, e);
+ }
+ } else {
+ failWriter = null;
+ }
+
+ if (mSkipPath != null) {
+ try {
+ new File(mSkipPath).getParentFile().mkdirs();
+ skipWriter = new PrintWriter(mSkipPath);
+ } catch (IOException e) {
+ throw new RuntimeException("Can't open skip file: " + mSkipPath, e);
+ }
+ } else {
+ skipWriter = null;
+ }
+ }
+
+ private synchronized void println(PrintWriter writer, String string) {
+ if (writer != null) {
+ writer.println(string);
+ writer.flush();
+ }
+ }
+
+ synchronized void print(String string) {
+ println(outWriter, string);
+ }
+
+ synchronized void printSkip(String string) {
+ println(skipWriter, string);
+ println(outWriter, string);
+ }
+
+ synchronized void printFail(String string) {
+ println(failWriter, string);
+ println(outWriter, string);
+ }
+
+ private void closeAll() {
+ for (PrintWriter writer : new PrintWriter[]{outWriter, failWriter, skipWriter}) {
+ if (writer != null) {
+ try {
+ writer.flush(); }
+ catch (Exception ignored) {
+ // Nothing to be done.
+ }
+ try {
+ writer.close(); }
+ catch (Exception ignored) {
+ // Nothing to be done.
+ }
+ }
+ }
+ }
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698