[lld] [llvm] [LLD][MachO] make InterfaceFile::symbols iteration order deterministic (PR #97615)
Tim Gymnich via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 3 11:18:52 PDT 2024
https://github.com/tgymnich created https://github.com/llvm/llvm-project/pull/97615
None
>From b653d8f1e570033a26bac764106f68e77bd39f6c Mon Sep 17 00:00:00 2001
From: Tim Gymnich <tgymnich at icloud.com>
Date: Wed, 3 Jul 2024 17:48:45 +0200
Subject: [PATCH] make InterfaceFile::symbols iteration order deterministic
---
lld/MachO/InputFiles.cpp | 12 +++--------
llvm/include/llvm/TextAPI/SymbolSet.h | 15 +++++++++++++-
llvm/lib/TextAPI/SymbolSet.cpp | 30 ++++++++++++++++++---------
3 files changed, 37 insertions(+), 20 deletions(-)
diff --git a/lld/MachO/InputFiles.cpp b/lld/MachO/InputFiles.cpp
index 0cee1a84d0b55..7823e00718467 100644
--- a/lld/MachO/InputFiles.cpp
+++ b/lld/MachO/InputFiles.cpp
@@ -1896,8 +1896,6 @@ DylibFile::DylibFile(const InterfaceFile &interface, DylibFile *umbrella,
symbol.isThreadLocalValue()));
};
- std::vector<const llvm::MachO::Symbol *> normalSymbols;
- normalSymbols.reserve(interface.symbolsCount());
for (const auto *symbol : interface.symbols()) {
if (!isArchABICompatible(symbol->getArchitectures(), config->arch()))
continue;
@@ -1909,15 +1907,11 @@ DylibFile::DylibFile(const InterfaceFile &interface, DylibFile *umbrella,
case EncodeKind::ObjectiveCClass:
case EncodeKind::ObjectiveCClassEHType:
case EncodeKind::ObjectiveCInstanceVariable:
- normalSymbols.push_back(symbol);
+ break;
+ default:
+ continue;
}
- }
- // interface.symbols() order is non-deterministic.
- llvm::sort(normalSymbols,
- [](auto *l, auto *r) { return l->getName() < r->getName(); });
- // TODO(compnerd) filter out symbols based on the target platform
- for (const auto *symbol : normalSymbols) {
switch (symbol->getKind()) {
case EncodeKind::GlobalSymbol:
addSymbol(*symbol, symbol->getName());
diff --git a/llvm/include/llvm/TextAPI/SymbolSet.h b/llvm/include/llvm/TextAPI/SymbolSet.h
index 6ccabb9077208..4362fe4a6b87a 100644
--- a/llvm/include/llvm/TextAPI/SymbolSet.h
+++ b/llvm/include/llvm/TextAPI/SymbolSet.h
@@ -18,6 +18,7 @@
#include "llvm/TextAPI/Architecture.h"
#include "llvm/TextAPI/ArchitectureSet.h"
#include "llvm/TextAPI/Symbol.h"
+#include <map>
#include <stddef.h>
namespace llvm {
@@ -28,6 +29,18 @@ struct SymbolsMapKey {
SymbolsMapKey(MachO::EncodeKind Kind, StringRef Name)
: Kind(Kind), Name(Name) {}
+
+ bool operator==(const SymbolsMapKey &Other) const {
+ return Kind == Other.Kind && Name == Other.Name;
+ }
+
+ bool operator!=(const SymbolsMapKey &Other) const {
+ return operator==(Other);
+ }
+
+ bool operator<(const SymbolsMapKey &Other) const {
+ return Kind < Other.Kind || Name < Other.Name;
+ }
};
template <> struct DenseMapInfo<SymbolsMapKey> {
static inline SymbolsMapKey getEmptyKey() {
@@ -84,7 +97,7 @@ class SymbolSet {
return StringRef(reinterpret_cast<const char *>(Ptr), String.size());
}
- using SymbolsMapType = llvm::DenseMap<SymbolsMapKey, Symbol *>;
+ using SymbolsMapType = std::map<SymbolsMapKey, Symbol *>;
SymbolsMapType Symbols;
Symbol *addGlobalImpl(EncodeKind, StringRef Name, SymbolFlags Flags);
diff --git a/llvm/lib/TextAPI/SymbolSet.cpp b/llvm/lib/TextAPI/SymbolSet.cpp
index 2e0b4160c9b46..21b927256442f 100644
--- a/llvm/lib/TextAPI/SymbolSet.cpp
+++ b/llvm/lib/TextAPI/SymbolSet.cpp
@@ -30,19 +30,29 @@ Symbol *SymbolSet::addGlobal(EncodeKind Kind, StringRef Name, SymbolFlags Flags,
const Symbol *SymbolSet::findSymbol(EncodeKind Kind, StringRef Name,
ObjCIFSymbolKind ObjCIF) const {
- if (auto result = Symbols.lookup({Kind, Name}))
- return result;
+ auto Iter = Symbols.find({Kind, Name});
+ if (Iter != Symbols.end())
+ return Iter->second;
if ((ObjCIF == ObjCIFSymbolKind::None) || (ObjCIF > ObjCIFSymbolKind::EHType))
return nullptr;
assert(ObjCIF <= ObjCIFSymbolKind::EHType &&
"expected single ObjCIFSymbolKind enum value");
// Non-complete ObjC Interfaces are represented as global symbols.
- if (ObjCIF == ObjCIFSymbolKind::Class)
- return Symbols.lookup(
- {EncodeKind::GlobalSymbol, (ObjC2ClassNamePrefix + Name).str()});
- if (ObjCIF == ObjCIFSymbolKind::MetaClass)
- return Symbols.lookup(
- {EncodeKind::GlobalSymbol, (ObjC2MetaClassNamePrefix + Name).str()});
- return Symbols.lookup(
- {EncodeKind::GlobalSymbol, (ObjC2EHTypePrefix + Name).str()});
+ if (ObjCIF == ObjCIFSymbolKind::Class) {
+ auto Iter = Symbols.find({EncodeKind::GlobalSymbol, (ObjC2ClassNamePrefix + Name).str()});
+ if (Iter != Symbols.end())
+ return Iter->second;
+ }
+
+ if (ObjCIF == ObjCIFSymbolKind::MetaClass) {
+ auto Iter = Symbols.find({EncodeKind::GlobalSymbol, (ObjC2MetaClassNamePrefix + Name).str()});
+ if (Iter != Symbols.end())
+ return Iter->second;
+ }
+
+ Iter = Symbols.find({EncodeKind::GlobalSymbol, (ObjC2EHTypePrefix + Name).str()});
+ if (Iter != Symbols.end())
+ return Iter->second;
+
+ return nullptr;
}
More information about the llvm-commits
mailing list