Simpleperf: check build id in report command.

1. refactor BuildId type.
2. check build id before parsing symbols in report command.

Bug: 22179177

Change-Id: Iefc797a88d4a168e109db786105120c8d6914369
diff --git a/simpleperf/cmd_report.cpp b/simpleperf/cmd_report.cpp
index 87479bd..5d17715 100644
--- a/simpleperf/cmd_report.cpp
+++ b/simpleperf/cmd_report.cpp
@@ -296,8 +296,9 @@
   if (!ReadEventAttrFromRecordFile()) {
     return false;
   }
-  ReadSampleTreeFromRecordFile();
+  // Read features first to prepare build ids used when building SampleTree.
   ReadFeaturesFromRecordFile();
+  ReadSampleTreeFromRecordFile();
 
   // 3. Show collected information.
   PrintReport();
@@ -306,6 +307,8 @@
 }
 
 bool ReportCommand::ParseOptions(const std::vector<std::string>& args) {
+  bool demangle = true;
+  std::string symfs_dir;
   bool print_sample_count = false;
   std::vector<std::string> sort_keys = {"comm", "pid", "tid", "dso", "symbol"};
   for (size_t i = 0; i < args.size(); ++i) {
@@ -323,7 +326,7 @@
       print_sample_count = true;
 
     } else if (args[i] == "--no-demangle") {
-      DsoFactory::SetDemangle(false);
+      demangle = false;
 
     } else if (args[i] == "--sort") {
       if (!NextArgumentOrError(args, &i)) {
@@ -334,15 +337,18 @@
       if (!NextArgumentOrError(args, &i)) {
         return false;
       }
-      if (!DsoFactory::SetSymFsDir(args[i])) {
-        return false;
-      }
+      symfs_dir = args[i];
     } else {
       ReportUnknownOption(args, i);
       return false;
     }
   }
 
+  DsoFactory::SetDemangle(demangle);
+  if (!DsoFactory::SetSymFsDir(symfs_dir)) {
+    return false;
+  }
+
   if (!accumulate_callchain_) {
     displayable_items_.push_back(
         std::unique_ptr<Displayable>(new SelfOverheadItem(*sample_tree_, "Overhead")));
@@ -495,6 +501,12 @@
 }
 
 void ReportCommand::ReadFeaturesFromRecordFile() {
+  std::vector<BuildIdRecord> records = record_file_reader_->ReadBuildIdFeature();
+  std::vector<std::pair<std::string, BuildId>> build_ids;
+  for (auto& r : records) {
+    build_ids.push_back(std::make_pair(r.filename, r.build_id));
+  }
+  DsoFactory::SetBuildIds(build_ids);
   std::vector<std::string> cmdline = record_file_reader_->ReadCmdlineFeature();
   if (!cmdline.empty()) {
     record_cmdline_ = android::base::Join(cmdline, ' ');