Index: bolt/tools/merge-fdata/merge-fdata.cpp =================================================================== --- bolt/tools/merge-fdata/merge-fdata.cpp +++ bolt/tools/merge-fdata/merge-fdata.cpp @@ -239,6 +239,7 @@ errs() << "Using legacy profile format.\n"; bool BoltedCollection = false; bool First = true; + StringMap Entries; for (const std::string &Filename : Filenames) { if (isYAML(Filename)) report_error(Filename, "cannot mix YAML and legacy formats"); @@ -265,9 +266,29 @@ "cannot mix profile collected in BOLT and non-BOLT deployments"); } - outs() << Buf; + SmallVector Lines; + SplitString(Buf, Lines, "\n"); + for(StringRef Line : Lines) { + size_t Pos = Line.rfind(" "); + if (Pos == StringRef::npos) + report_error( + Filename, + "Malformed / corrupted profile"); + StringRef Signiture = Line.substr(0, Pos); + uint64_t Count; + if (Line.substr(Pos + 1, Line.size() - Pos).getAsInteger(10, Count)) + report_error( + Filename, + "Malformed / corrupted profile counter"); + Count += Entries.lookup(Signiture); + Entries.insert_or_assign(Signiture, Count); + } First = false; } + + for (const auto& Entry : Entries) + outs() << Entry.getKey() << " " << Entry.getValue() << "\n"; + errs() << "Profile from " << Filenames.size() << " files merged.\n"; }