[lld] [lld][COFF] Emit coffgrp debug record (PR #205630)

Alexandre Ganea via llvm-commits llvm-commits at lists.llvm.org
Sat Jul 4 08:37:03 PDT 2026


================
@@ -3113,3 +3123,64 @@ void Writer::printSummary() {
 
   Msg(ctx) << buffer;
 }
+
+size_t COFFDebugRecordChunk::getSize() const {
+  size_t size = sizeof(uint32_t);
+  llvm::for_each(records, [&](auto &r) { size += r.size(); });
+  return size;
+}
+
+void COFFDebugRecordChunk::computeRecords() {
+  records.clear();
+  auto addRange = [](const auto &range, Chunk *end, StringRef name) {
+    bool hasData = false;
+    Chunk *last = nullptr;
+    for (auto *c : range) {
+      if (c == end)
+        break;
+      hasData |= c->getSize();
+      last = c;
+    }
+    return hasData ? COFFGrpRecord{*range.begin(), last, name}
+                   : COFFGrpRecord{nullptr, nullptr, ""};
+  };
+
+  for (OutputSection *os : ctx.outputSections) {
+    for (auto *sec : os->contribSections) {
+      COFFGrpRecord rec = addRange(sec->chunks, nullptr, sec->name);
+      if (!rec.first)
+        continue;
+      records.push_back(rec);
+    }
+    Chunk *lastChunk = records.empty() ? nullptr : records.back().last;
+    COFFGrpRecord lastRec =
+        addRange(llvm::reverse(os->chunks), lastChunk, os->name);
+    if (lastRec.first) {
+      std::swap(lastRec.first, lastRec.last);
+      records.push_back(lastRec);
+    }
+  }
+}
+
+void COFFDebugRecordChunk::writeTo(uint8_t *b) const {
+  bool is_pgo = llvm::any_of(records, [](auto &r) {
+    return llvm::is_contained(pgoSectionNames, r.name);
+  });
+  // ASCII code of "PGO\0" or zero
+  uint8_t *start = b;
+  write32le(b, is_pgo ? 0x50474F00 : 0);
----------------
aganea wrote:

We shouldn't have obsfuscated strings, please define a "PGO\0" c-string and use that accordingly.

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


More information about the llvm-commits mailing list