Synced repos to: 60208
diff --git a/crosperf/perf_processor.py b/crosperf/perf_processor.py
index 031f35d..8e6f1cd 100644
--- a/crosperf/perf_processor.py
+++ b/crosperf/perf_processor.py
@@ -1,11 +1,11 @@
 #!/usr/bin/python
-
+#
 # Copyright 2011 Google Inc. All Rights Reserved.
 
 import os
 import re
+
 from utils import command_executer
-from utils import utils
 
 
 class PerfProcessor(object):
@@ -14,18 +14,54 @@
       self.report = report
       self.output = output
 
-  def __init__(self, logger_to_use=None):
+  def __init__(self, results_dir, chromeos_root, board, logger_to_use=None):
     self._logger = logger_to_use
     self._ce = command_executer.GetCommandExecuter(self._logger)
+    self._results_dir = results_dir
+    self._chromeos_root = chromeos_root
+    self._board = board
+    self._perf_relative_dir = os.path.basename(self._results_dir)
+    self.host_data_file = self.FindSingleFile(
+                            "perf.data", os.path.join(
+                              chromeos_root,
+                              "chroot",
+                              self._results_dir.lstrip("/")))
+    self.perf_out = self.FindSingleFile(
+                            "perf.out", os.path.join(
+                              chromeos_root,
+                              "chroot",
+                              self._results_dir.lstrip("/")))
 
-  def GeneratePerfResults(self, results_dir, chromeos_root, board):
-    perf_location = os.path.join(results_dir,
-                                 os.path.basename(results_dir),
-                                 "profiling/iteration.1")
-    host_perf_location = os.path.join(chromeos_root, "chroot",
-                                      perf_location.lstrip("/"))
-    report = self._GeneratePerfReport(perf_location, chromeos_root, board)
-    output = self._ReadPerfOutput(host_perf_location)
+  def FindSingleFile(self, name, path):
+    find_command = ("find %s -name %s" % (path, name))
+    ret, out, err = self._ce.RunCommand(find_command, return_output=True)
+    if ret == 0:
+      data_files = out.splitlines()
+      if len(data_files) == 0:
+         # No data file, no report to generate.
+         data_file = None
+      else:
+         assert len(data_files) == 1, "More than 1 perf.out file found"
+         data_file = data_files[0]
+    return data_file
+
+
+  def GeneratePerfResults(self):
+    perf_location = os.path.join(self._results_dir,
+                                 self._perf_relative_dir)
+    if self.perf_out != None:
+      output = self._ReadPerfOutput()
+
+    if self.host_data_file != None:
+      perf_location = os.path.join(self._results_dir,
+                                   self._perf_relative_dir)
+      host_perf_location = os.path.dirname(self.host_data_file)
+      report = self._GeneratePerfReport(perf_location,
+                                        self._chromeos_root,
+                                        self._board)
+    else:
+      # lets make perf.report have output of stat...
+      report = output
     return PerfProcessor.PerfResults(report, output)
 
   def ParseStatResults(self, results):
@@ -38,16 +74,18 @@
         result[match.group(2)] = match.group(1)
     return result
 
-  def _ReadPerfOutput(self, perf_location):
-    perf_output_file = os.path.join(perf_location, "perf.out")
-    with open(perf_output_file, "rb") as f:
+  def _ReadPerfOutput(self):
+    with open(self.perf_out, "rb") as f:
       return f.read()
 
   def _GeneratePerfReport(self, perf_location, chromeos_root, board):
     perf_data_file = os.path.join(perf_location, "perf.data")
     # Attempt to build a perf report and keep it with the results.
     command = ("/usr/sbin/perf report --symfs=/build/%s"
-               " -i %s --stdio | head -n1000" % (board, perf_data_file))
+               " --vmlinux /build/%s/usr/lib/debug/boot/vmlinux"
+               " --kallsyms /build/%s/boot/System.map-*"
+               " -i %s --stdio | head -n1000" % (board, board, board,
+                                                 perf_data_file))
     _, out, _ = self._ce.ChrootRunCommand(chromeos_root,
                                           command, return_output=True)
     return out