aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/llvm/lib/TextAPI/InterfaceFile.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm-project/llvm/lib/TextAPI/InterfaceFile.cpp')
-rw-r--r--contrib/llvm-project/llvm/lib/TextAPI/InterfaceFile.cpp127
1 files changed, 127 insertions, 0 deletions
diff --git a/contrib/llvm-project/llvm/lib/TextAPI/InterfaceFile.cpp b/contrib/llvm-project/llvm/lib/TextAPI/InterfaceFile.cpp
new file mode 100644
index 000000000000..b7f967aa754e
--- /dev/null
+++ b/contrib/llvm-project/llvm/lib/TextAPI/InterfaceFile.cpp
@@ -0,0 +1,127 @@
+//===- InterfaceFile.cpp --------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// Implements the Interface File.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/TextAPI/InterfaceFile.h"
+#include <iomanip>
+#include <sstream>
+
+using namespace llvm;
+using namespace llvm::MachO;
+
+void InterfaceFileRef::addTarget(const Target &Target) {
+ addEntry(Targets, Target);
+}
+
+void InterfaceFile::addAllowableClient(StringRef InstallName,
+ const Target &Target) {
+ auto Client = addEntry(AllowableClients, InstallName);
+ Client->addTarget(Target);
+}
+
+void InterfaceFile::addReexportedLibrary(StringRef InstallName,
+ const Target &Target) {
+ auto Lib = addEntry(ReexportedLibraries, InstallName);
+ Lib->addTarget(Target);
+}
+
+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 ((Iter != ParentUmbrellas.end()) && !(Target_ < Iter->first)) {
+ Iter->second = std::string(Parent);
+ return;
+ }
+
+ ParentUmbrellas.emplace(Iter, Target_, std::string(Parent));
+}
+
+void InterfaceFile::addRPath(const Target &InputTarget, StringRef RPath) {
+ auto Iter = lower_bound(RPaths, InputTarget,
+ [](const std::pair<Target, std::string> &LHS,
+ Target RHS) { return LHS.first < RHS; });
+
+ if ((Iter != RPaths.end()) && !(InputTarget < Iter->first)) {
+ Iter->second = std::string(RPath);
+ return;
+ }
+
+ RPaths.emplace(Iter, InputTarget, std::string(RPath));
+}
+
+void InterfaceFile::addTarget(const Target &Target) {
+ 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::addDocument(std::shared_ptr<InterfaceFile> &&Document) {
+ auto Pos = llvm::lower_bound(Documents, Document,
+ [](const std::shared_ptr<InterfaceFile> &LHS,
+ const std::shared_ptr<InterfaceFile> &RHS) {
+ return LHS->InstallName < RHS->InstallName;
+ });
+ Document->Parent = this;
+ Documents.insert(Pos, Document);
+}
+
+static bool isYAMLTextStub(const FileType &Kind) {
+ return (Kind >= FileType::TBD_V1) && (Kind < FileType::TBD_V5);
+}
+
+bool InterfaceFile::operator==(const InterfaceFile &O) const {
+ if (Targets != O.Targets)
+ return false;
+ if (InstallName != O.InstallName)
+ return false;
+ if ((CurrentVersion != O.CurrentVersion) ||
+ (CompatibilityVersion != O.CompatibilityVersion))
+ return false;
+ if (SwiftABIVersion != O.SwiftABIVersion)
+ return false;
+ if (IsTwoLevelNamespace != O.IsTwoLevelNamespace)
+ return false;
+ if (IsAppExtensionSafe != O.IsAppExtensionSafe)
+ return false;
+ if (ParentUmbrellas != O.ParentUmbrellas)
+ return false;
+ if (AllowableClients != O.AllowableClients)
+ return false;
+ if (ReexportedLibraries != O.ReexportedLibraries)
+ return false;
+ if (*SymbolsSet != *O.SymbolsSet)
+ return false;
+ // Don't compare run search paths for older filetypes that cannot express
+ // them.
+ if (!(isYAMLTextStub(FileKind)) && !(isYAMLTextStub(O.FileKind))) {
+ if (RPaths != O.RPaths)
+ return false;
+ if (mapToPlatformVersionSet(Targets) != mapToPlatformVersionSet(O.Targets))
+ return false;
+ }
+
+ if (!std::equal(Documents.begin(), Documents.end(), O.Documents.begin(),
+ O.Documents.end(),
+ [](const std::shared_ptr<InterfaceFile> LHS,
+ const std::shared_ptr<InterfaceFile> RHS) {
+ return *LHS == *RHS;
+ }))
+ return false;
+ return true;
+}