Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 47 additions & 36 deletions bolt/tools/merge-fdata/merge-fdata.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,45 +34,32 @@ cl::OptionCategory MergeFdataCategory("merge-fdata options");

enum SortType : char {
ST_NONE,
ST_EXEC_COUNT, /// Sort based on function execution count.
ST_TOTAL_BRANCHES, /// Sort based on all branches in the function.
ST_EXEC_COUNT, /// Sort based on function execution count.
ST_TOTAL_BRANCHES, /// Sort based on all branches in the function.
};

static cl::list<std::string>
InputDataFilenames(
cl::Positional,
cl::CommaSeparated,
cl::desc("<fdata1> [<fdata2>]..."),
cl::OneOrMore,
cl::cat(MergeFdataCategory));

static cl::opt<SortType>
PrintFunctionList("print",
cl::desc("print the list of objects with count to stderr"),
cl::init(ST_NONE),
cl::values(clEnumValN(ST_NONE,
"none",
"do not print objects/functions"),
clEnumValN(ST_EXEC_COUNT,
"exec",
"print functions sorted by execution count"),
clEnumValN(ST_TOTAL_BRANCHES,
"branches",
"print functions sorted by total branch count")),
cl::cat(MergeFdataCategory));

static cl::opt<bool>
SuppressMergedDataOutput("q",
cl::desc("do not print merged data to stdout"),
cl::init(false),
cl::Optional,
cl::cat(MergeFdataCategory));

static cl::opt<std::string>
OutputFilePath("o",
cl::value_desc("file"),
cl::desc("Write output to <file>"),
cl::cat(MergeFdataCategory));
InputDataFilenames(cl::Positional, cl::CommaSeparated,
cl::desc("<fdata1> [<fdata2>]..."), cl::OneOrMore,
cl::cat(MergeFdataCategory));

static cl::opt<SortType> PrintFunctionList(
"print", cl::desc("print the list of objects with count to stderr"),
cl::init(ST_NONE),
cl::values(clEnumValN(ST_NONE, "none", "do not print objects/functions"),
clEnumValN(ST_EXEC_COUNT, "exec",
"print functions sorted by execution count"),
clEnumValN(ST_TOTAL_BRANCHES, "branches",
"print functions sorted by total branch count")),
cl::cat(MergeFdataCategory));

static cl::opt<bool> SuppressMergedDataOutput(
"q", cl::desc("do not print merged data to stdout"), cl::init(false),
cl::Optional, cl::cat(MergeFdataCategory));

static cl::opt<std::string> OutputFilePath("o", cl::value_desc("file"),
cl::desc("Write output to <file>"),
cl::cat(MergeFdataCategory));

} // namespace opts

Expand Down Expand Up @@ -265,7 +252,10 @@ bool isYAML(const StringRef Filename) {
void mergeLegacyProfiles(const SmallVectorImpl<std::string> &Filenames) {
errs() << "Using legacy profile format.\n";
std::optional<bool> BoltedCollection;
std::optional<bool> NoLbr;
std::mutex BoltedCollectionMutex;
std::mutex NoLbrMutex;
std::string NoLbrLabel;
typedef StringMap<uint64_t> ProfileTy;

auto ParseProfile = [&](const std::string &Filename, auto &Profiles) {
Expand Down Expand Up @@ -298,6 +288,25 @@ void mergeLegacyProfiles(const SmallVectorImpl<std::string> &Filenames) {
BoltedCollection = false;
}

std::lock_guard<std::mutex> Lock1(NoLbrMutex);
// Check if the string "no_lbr" is in the first line
if (Buf.starts_with("no_lbr")) {
if (!NoLbr.value_or(true))
report_error(
Filename,
"cannot mix profile collected on LBR and non-LBR architectures");
NoLbr = true;
size_t Pos = Buf.find("\n");
NoLbrLabel = Buf.substr(0, Pos).str();
Buf = Buf.drop_front(Pos + 1);
} else {
if (NoLbr.value_or(false))
report_error(
Filename,
"cannot mix profile collected on LBR and non-LBR architectures");
NoLbr = false;
}

Profile = &Profiles[tid];
}

Expand Down Expand Up @@ -336,6 +345,8 @@ void mergeLegacyProfiles(const SmallVectorImpl<std::string> &Filenames) {

if (BoltedCollection.value_or(false))
output() << "boltedcollection\n";
if (NoLbr.value_or(false))
output() << NoLbrLabel << "\n";
for (const auto &[Key, Value] : MergedProfile)
output() << Key << " " << Value << "\n";

Expand Down
Loading