[llvm] [lld] [clang] [SHT_LLVM_BB_ADDR_MAP] Allow basic-block-sections and labels be used together by decoupling the handling of the two features. (PR #74128)
Aiden Grossman via cfe-commits
cfe-commits at lists.llvm.org
Fri Jan 26 01:06:27 PST 2024
================
@@ -172,6 +172,105 @@ class OtoolOptTable : public CommonOptTable {
"Mach-O object file displaying tool") {}
};
+struct BBAddrMapLabel {
+ std::string BlockLabel;
+ std::string PGOAnalysis;
+};
+
+// This class represents the BBAddrMap and PGOMap associated with a single
+// function.
+class BBAddrMapFunctionEntry {
+public:
+ BBAddrMapFunctionEntry(BBAddrMap AddrMap, PGOAnalysisMap PGOMap)
+ : AddrMap(std::move(AddrMap)), PGOMap(std::move(PGOMap)) {}
+
+ const BBAddrMap &getAddrMap() const { return AddrMap; }
+
+ // Returns the PGO string associated with the entry of index `PGOBBEntryIndex`
+ // in `PGOMap`.
+ std::string constructPGOLabelString(size_t PGOBBEntryIndex) const {
+ if (!PGOMap.FeatEnable.hasPGOAnalysis())
+ return "";
+ std::string PGOString;
+ raw_string_ostream PGOSS(PGOString);
+
+ PGOSS << " (";
+ if (PGOMap.FeatEnable.FuncEntryCount && PGOBBEntryIndex == 0) {
+ PGOSS << "Entry count: " << Twine(PGOMap.FuncEntryCount);
+ if (PGOMap.FeatEnable.hasPGOAnalysisBBData()) {
+ PGOSS << ", ";
+ }
+ }
+
+ if (PGOMap.FeatEnable.hasPGOAnalysisBBData()) {
+
+ assert(PGOBBEntryIndex < PGOMap.BBEntries.size() &&
+ "Expected PGOAnalysisMap and BBAddrMap to have the same entires");
+ const PGOAnalysisMap::PGOBBEntry &PGOBBEntry =
+ PGOMap.BBEntries[PGOBBEntryIndex];
+
+ if (PGOMap.FeatEnable.BBFreq) {
+ PGOSS << "Frequency: " << Twine(PGOBBEntry.BlockFreq.getFrequency());
+ if (PGOMap.FeatEnable.BrProb && PGOBBEntry.Successors.size() > 0) {
+ PGOSS << ", ";
+ }
+ }
+ if (PGOMap.FeatEnable.BrProb && PGOBBEntry.Successors.size() > 0) {
+ PGOSS << "Successors: ";
+ interleaveComma(
+ PGOBBEntry.Successors, PGOSS,
+ [&PGOSS](const PGOAnalysisMap::PGOBBEntry::SuccessorEntry &SE) {
+ PGOSS << "BB" << SE.ID << ":";
+ PGOSS.write_hex(SE.Prob.getNumerator());
+ });
+ }
+ }
+ PGOSS << ")";
+
+ return PGOString;
+ }
+
+private:
+ const BBAddrMap AddrMap;
+ const PGOAnalysisMap PGOMap;
+};
+
+// This class represents the BBAddrMap and PGOMap of potentially multiple
+// functions in a section.
+class BBAddrMapInfo {
+public:
+ void clear() {
+ FunctionAddrToMap.clear();
+ RangeBaseAddrToFunctionAddr.clear();
+ }
+ bool empty() const { return FunctionAddrToMap.empty(); }
+
+ void AddFunctionEntry(BBAddrMap AddrMap, PGOAnalysisMap PGOMap) {
+ uint64_t FunctionAddr = AddrMap.getFunctionAddress();
+ for (size_t I = 1; I < AddrMap.BBRanges.size(); ++I)
+ RangeBaseAddrToFunctionAddr.emplace(AddrMap.BBRanges[I].BaseAddress,
+ FunctionAddr);
+ [[maybe_unused]] auto R = FunctionAddrToMap.try_emplace(
+ FunctionAddr, std::move(AddrMap), std::move(PGOMap));
+ assert(R.second && "duplicate function address");
+ }
+
+ const BBAddrMapFunctionEntry *getEntryForAddress(uint64_t BaseAddress) const {
----------------
boomanaiden154 wrote:
I'm assuming this is returning a pointer rather than a `std::optional` due to the inability to return an optional reference without something like a `std::reference_wrapper`?
https://github.com/llvm/llvm-project/pull/74128
More information about the cfe-commits
mailing list