summaryrefslogtreecommitdiffstats
path: root/llvm/lib/TextAPI/MachO/InterfaceFile.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/TextAPI/MachO/InterfaceFile.cpp')
-rw-r--r--llvm/lib/TextAPI/MachO/InterfaceFile.cpp80
1 files changed, 61 insertions, 19 deletions
diff --git a/llvm/lib/TextAPI/MachO/InterfaceFile.cpp b/llvm/lib/TextAPI/MachO/InterfaceFile.cpp
index 54ba8cc3126..c40a952a6a8 100644
--- a/llvm/lib/TextAPI/MachO/InterfaceFile.cpp
+++ b/llvm/lib/TextAPI/MachO/InterfaceFile.cpp
@@ -27,36 +27,65 @@ typename C::iterator addEntry(C &Container, StringRef InstallName) {
return Container.emplace(I, InstallName);
}
+
+template <typename C>
+typename C::iterator addEntry(C &Container, const Target &Target_) {
+ auto Iter =
+ lower_bound(Container, Target_, [](const Target &LHS, const Target &RHS) {
+ return LHS < RHS;
+ });
+ if ((Iter != std::end(Container)) && !(Target_ < *Iter))
+ return Iter;
+
+ return Container.insert(Iter, Target_);
+}
} // end namespace detail.
-void InterfaceFile::addAllowableClient(StringRef Name,
- ArchitectureSet Architectures) {
- auto Client = detail::addEntry(AllowableClients, Name);
- Client->addArchitectures(Architectures);
+void InterfaceFileRef::addTarget(const Target &Target) {
+ detail::addEntry(Targets, Target);
+}
+
+void InterfaceFile::addAllowableClient(StringRef InstallName,
+ const Target &Target) {
+ auto Client = detail::addEntry(AllowableClients, InstallName);
+ Client->addTarget(Target);
}
void InterfaceFile::addReexportedLibrary(StringRef InstallName,
- ArchitectureSet Architectures) {
+ const Target &Target) {
auto Lib = detail::addEntry(ReexportedLibraries, InstallName);
- Lib->addArchitectures(Architectures);
+ Lib->addTarget(Target);
}
-void InterfaceFile::addUUID(Architecture Arch, StringRef UUID) {
- auto I = partition_point(UUIDs,
- [=](const std::pair<Architecture, std::string> &O) {
- return O.first < Arch;
- });
+void InterfaceFile::addParentUmbrella(const Target &Target_, StringRef Parent) {
+ auto Iter = lower_bound(ParentUmbrellas, Target_,
+ [](const std::pair<Target, std::string> &LHS,
+ Target RHS) { return LHS.first < RHS; });
- if (I != UUIDs.end() && Arch == I->first) {
- I->second = UUID;
+ if ((Iter != ParentUmbrellas.end()) && !(Target_ < Iter->first)) {
+ Iter->second = Parent;
return;
}
- UUIDs.emplace(I, Arch, UUID);
+ ParentUmbrellas.emplace(Iter, Target_, Parent);
return;
}
-void InterfaceFile::addUUID(Architecture Arch, uint8_t UUID[16]) {
+void InterfaceFile::addUUID(const Target &Target_, StringRef UUID) {
+ auto Iter = lower_bound(UUIDs, Target_,
+ [](const std::pair<Target, std::string> &LHS,
+ Target RHS) { return LHS.first < RHS; });
+
+ if ((Iter != UUIDs.end()) && !(Target_ < Iter->first)) {
+ Iter->second = UUID;
+ return;
+ }
+
+ UUIDs.emplace(Iter, Target_, UUID);
+ return;
+}
+
+void InterfaceFile::addUUID(const Target &Target, uint8_t UUID[16]) {
std::stringstream Stream;
for (unsigned i = 0; i < 16; ++i) {
if (i == 4 || i == 6 || i == 8 || i == 10)
@@ -64,17 +93,30 @@ void InterfaceFile::addUUID(Architecture Arch, uint8_t UUID[16]) {
Stream << std::setfill('0') << std::setw(2) << std::uppercase << std::hex
<< static_cast<int>(UUID[i]);
}
- addUUID(Arch, Stream.str());
+ addUUID(Target, Stream.str());
+}
+
+void InterfaceFile::addTarget(const Target &Target) {
+ detail::addEntry(Targets, Target);
+}
+
+InterfaceFile::const_filtered_target_range
+InterfaceFile::targets(ArchitectureSet Archs) const {
+ std::function<bool(const Target &)> fn = [Archs](const Target &Target_) {
+ return Archs.has(Target_.Arch);
+ };
+ return make_filter_range(Targets, fn);
}
void InterfaceFile::addSymbol(SymbolKind Kind, StringRef Name,
- ArchitectureSet Archs, SymbolFlags Flags) {
+ const TargetList &Targets, SymbolFlags Flags) {
Name = copyString(Name);
auto result = Symbols.try_emplace(SymbolsMapKey{Kind, Name}, nullptr);
if (result.second)
- result.first->second = new (Allocator) Symbol{Kind, Name, Archs, Flags};
+ result.first->second = new (Allocator) Symbol{Kind, Name, Targets, Flags};
else
- result.first->second->addArchitectures(Archs);
+ for (const auto &Target : Targets)
+ result.first->second->addTarget(Target);
}
} // end namespace MachO.
OpenPOWER on IntegriCloud