[llvm] [BOLT] DataAggregator support for binaries with multiple text segments (PR #92815)

Maksim Panchenko via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 19 16:42:43 PST 2024


================
@@ -2073,12 +2078,22 @@ std::error_code DataAggregator::parseMMapEvents() {
                << " using file offset 0x" << Twine::utohexstr(MMapInfo.Offset)
                << ". Ignoring profile data for this mapping\n";
         continue;
-      } else {
-        MMapInfo.BaseAddress = *BaseAddress;
       }
+      MMapInfo.BaseAddress = *BaseAddress;
     }
 
-    BinaryMMapInfo.insert(std::make_pair(MMapInfo.PID, MMapInfo));
+    // Try to add MMapInfo to the map and update its size. Large binaries may
+    // span to multiple text segments, so the mapping is inserted only on the
+    // first occurrence.
+    if (!BinaryMMapInfo.insert(std::make_pair(MMapInfo.PID, MMapInfo)).second)
+      assert(MMapInfo.BaseAddress == BinaryMMapInfo[MMapInfo.PID].BaseAddress &&
+             "Base address on multiple segment mappings should match");
+
+    // Update section size.
+    uint64_t EndAddress = MMapInfo.MMapAddress + MMapInfo.Size;
+    uint64_t Size = EndAddress - BinaryMMapInfo[MMapInfo.PID].BaseAddress;
----------------
maksfb wrote:

```suggestion
    const uint64_t EndAddress = MMapInfo.MMapAddress + MMapInfo.Size;
    const uint64_t Size = EndAddress - BinaryMMapInfo[MMapInfo.PID].BaseAddress;
```

https://github.com/llvm/llvm-project/pull/92815


More information about the llvm-commits mailing list