/// Fill Counts with the profile data for the given function name.
error_code getFunctionCounts(StringRef FuncName, uint64_t &FunctionHash,
std::vector<uint64_t> &Counts);
- /// Get the frequency with which a function is called relative to the function
- /// that is called most often in the program.
- error_code getCallFrequency(StringRef FuncName, uint64_t &FunctionHash,
- double &F);
+ /// Return the maximum of all known function counts.
+ uint64_t getMaximumFunctionCount() { return MaxFunctionCount; }
static error_code create(std::string Path,
std::unique_ptr<ProfileDataReader> &Result);
return profiledata_error::success;
}
-
-error_code ProfileDataReader::getCallFrequency(StringRef FuncName,
- uint64_t &FunctionHash,
- double &Frequency) {
- ProfileDataCursor Cursor(DataBuffer.get());
- error_code EC;
- if ((EC = findFunctionCounts(FuncName, FunctionHash, Cursor)))
- return EC;
- if ((EC = Cursor.skip64()))
- return EC;
- uint64_t CallCount;
- if ((EC = Cursor.read64(CallCount)))
- return EC;
- Frequency = CallCount / (double)MaxFunctionCount;
- return profiledata_error::success;
-}
if (ShowAllFunctions && !ShowFunction.empty())
errs() << "warning: -function argument ignored: showing all functions\n";
- uint64_t MaxBlockCount = 0, MaxFunctionCount = 0;
+ uint64_t MaxFunctionCount = Reader->getMaximumFunctionCount();
+
+ uint64_t MaxBlockCount = 0;
uint64_t Hash;
- double CallFreq;
size_t ShownFunctions = false;
std::vector<uint64_t> Counts;
for (const auto &Name : *Reader) {
bool Show = ShowAllFunctions || Name.find(ShowFunction) != Name.npos;
if (error_code EC = Reader->getFunctionCounts(Name, Hash, Counts))
exitWithError(EC.message(), Filename);
- if (error_code EC = Reader->getCallFrequency(Name, Hash, CallFreq))
- exitWithError(EC.message(), Filename);
+
if (Show) {
+ double CallFreq = Counts[0] / (double)MaxFunctionCount;
+
if (!ShownFunctions)
OS << "Counters:\n";
++ShownFunctions;
+
OS << " " << Name << ":\n"
<< " Hash: " << HashPrinter(Hash) << "\n"
<< " Relative call frequency: " << FreqPrinter(CallFreq) << "\n"
<< " Function count: " << Counts[0] << "\n";
}
- if (Counts[0] > MaxFunctionCount)
- MaxFunctionCount = Counts[0];
-
if (Show && ShowCounts)
OS << " Block counts: [";
for (size_t I = 1, E = Counts.size(); I < E; ++I) {