[lld] [lld][ELF] Extend profile guided function ordering to ELF binaries (PR #117514)

Ellis Hoag via llvm-commits llvm-commits at lists.llvm.org
Thu Dec 12 13:37:26 PST 2024


================
@@ -14,13 +14,145 @@
 #ifndef LLD_MACHO_BPSECTION_ORDERER_H
 #define LLD_MACHO_BPSECTION_ORDERER_H
 
+#include "InputSection.h"
+#include "Relocations.h"
+#include "Symbols.h"
+#include "lld/Common/BPSectionOrdererBase.h"
 #include "llvm/ADT/DenseMap.h"
 #include "llvm/ADT/StringRef.h"
+#include "llvm/ADT/TinyPtrVector.h"
 
 namespace lld::macho {
 
 class InputSection;
 
+class BPSymbolMacho : public BPSymbol {
+  const Symbol *sym;
+
+public:
+  explicit BPSymbolMacho(const Symbol *s) : sym(s) {}
+
+  llvm::StringRef getName() const override { return sym->getName(); }
+
+  const Defined *asDefined() const {
+    return llvm::dyn_cast_or_null<Defined>(sym);
+  }
+
+  std::optional<uint64_t> getValue() const override {
+    if (auto *d = asDefined())
+      return d->value;
+    return {};
+  }
+
+  std::optional<uint64_t> getSize() const override {
+    if (auto *d = asDefined())
+      return d->size;
+    return {};
+  }
+
+  const Symbol *getSymbol() const { return sym; }
+};
+
+class BPSectionMacho : public BPSectionBase {
+  const InputSection *isec;
+  uint64_t sectionIdx;
+
+public:
+  explicit BPSectionMacho(const InputSection *sec, uint64_t sectionIdx)
+      : isec(sec), sectionIdx(sectionIdx) {}
+
+  const InputSection *getSection() const { return isec; }
+
+  uint64_t getSize() const override { return isec->getSize(); }
+
+  uint64_t getSectionIdx() const { return sectionIdx; }
+
+  bool isCodeSection() const override { return macho::isCodeSection(isec); }
+
+  bool hasValidData() const override {
+    return isec && !isec->data.empty() && isec->data.data();
+  }
+
+  SmallVector<std::unique_ptr<BPSymbol>> getSymbols() const override {
+    SmallVector<std::unique_ptr<BPSymbol>> symbols;
+    for (auto *sym : isec->symbols)
+      if (auto *d = llvm::dyn_cast_or_null<Defined>(sym))
+        symbols.emplace_back(std::make_unique<BPSymbolMacho>(d));
+    return symbols;
+  }
+
+  // Linkage names can be prefixed with "_" or "l_" on Mach-O. See
+  // Mangler::getNameWithPrefix() for details.
+  std::optional<StringRef>
+  getResolvedLinkageName(llvm::StringRef name) const override {
+    if (name.consume_front("_") || name.consume_front("l_"))
+      return name;
+    return {};
+  }
+
+  void getSectionHashes(llvm::SmallVectorImpl<uint64_t> &hashes,
+                        const llvm::DenseMap<const BPSectionBase *, uint64_t>
+                            &sectionToIdx) const override {
+    constexpr unsigned windowSize = 4;
+
+    // Create a map from BPSectionBase* to InputSection* for lookup
+    llvm::DenseMap<const InputSection *, uint64_t> isecToIdx;
+    for (const auto &[section, idx] : sectionToIdx)
+      if (auto *machoSection = llvm::dyn_cast<BPSectionMacho>(section))
+        isecToIdx[machoSection->getSection()] = idx;
----------------
ellishg wrote:

I'm fine with that for ELF, but we don't want to regress anything for Mach-O

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


More information about the llvm-commits mailing list