[llvm] e6ebe8b - [TextAPI] use unique sorted vector for holding target triples for (#75959)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Dec 19 14:50:01 PST 2023
Author: Cyndy Ishida
Date: 2023-12-19T14:49:57-08:00
New Revision: e6ebe8bf816c3e8ca0e000414bbe326d2765ff73
URL: https://github.com/llvm/llvm-project/commit/e6ebe8bf816c3e8ca0e000414bbe326d2765ff73
DIFF: https://github.com/llvm/llvm-project/commit/e6ebe8bf816c3e8ca0e000414bbe326d2765ff73.diff
LOG: [TextAPI] use unique sorted vector for holding target triples for (#75959)
reading dylibs
* This is a better fix than what I originally did to appease CI.
Added:
Modified:
llvm/lib/TextAPI/BinaryReader/DylibReader.cpp
Removed:
################################################################################
diff --git a/llvm/lib/TextAPI/BinaryReader/DylibReader.cpp b/llvm/lib/TextAPI/BinaryReader/DylibReader.cpp
index 846ec9a8460675..b01130cee60620 100644
--- a/llvm/lib/TextAPI/BinaryReader/DylibReader.cpp
+++ b/llvm/lib/TextAPI/BinaryReader/DylibReader.cpp
@@ -11,6 +11,7 @@
//===----------------------------------------------------------------------===//
#include "llvm/TextAPI/DylibReader.h"
+#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/StringMap.h"
#include "llvm/Object/Binary.h"
#include "llvm/Object/MachOUniversal.h"
@@ -22,6 +23,7 @@
#include <set>
#include <sstream>
#include <string>
+#include <tuple>
using namespace llvm;
using namespace llvm::object;
@@ -29,6 +31,17 @@ using namespace llvm::MachO;
using namespace llvm::MachO::DylibReader;
using TripleVec = std::vector<Triple>;
+static typename TripleVec::iterator emplace(TripleVec &Container, Triple &&T) {
+ auto I = partition_point(Container, [=](const Triple &CT) {
+ return std::forward_as_tuple(CT.getArch(), CT.getOS(),
+ CT.getEnvironment()) <
+ std::forward_as_tuple(T.getArch(), T.getOS(), T.getEnvironment());
+ });
+
+ if (I != Container.end() && *I == T)
+ return I;
+ return Container.emplace(I, T);
+}
static TripleVec constructTriples(MachOObjectFile *Obj,
const Architecture ArchT) {
@@ -53,61 +66,61 @@ static TripleVec constructTriples(MachOObjectFile *Obj,
switch (cmd.C.cmd) {
case MachO::LC_VERSION_MIN_MACOSX:
OSVersion = getOSVersion(cmd);
- Triples.emplace_back(Arch, "apple", "macos" + OSVersion);
+ emplace(Triples, {Arch, "apple", "macos" + OSVersion});
break;
case MachO::LC_VERSION_MIN_IPHONEOS:
OSVersion = getOSVersion(cmd);
if (IsIntel)
- Triples.emplace_back(Arch, "apple", "ios" + OSVersion, "simulator");
+ emplace(Triples, {Arch, "apple", "ios" + OSVersion, "simulator"});
else
- Triples.emplace_back(Arch, "apple", "ios" + OSVersion);
+ emplace(Triples, {Arch, "apple", "ios" + OSVersion});
break;
case MachO::LC_VERSION_MIN_TVOS:
OSVersion = getOSVersion(cmd);
if (IsIntel)
- Triples.emplace_back(Arch, "apple", "tvos" + OSVersion, "simulator");
+ emplace(Triples, {Arch, "apple", "tvos" + OSVersion, "simulator"});
else
- Triples.emplace_back(Arch, "apple", "tvos" + OSVersion);
+ emplace(Triples, {Arch, "apple", "tvos" + OSVersion});
break;
case MachO::LC_VERSION_MIN_WATCHOS:
OSVersion = getOSVersion(cmd);
if (IsIntel)
- Triples.emplace_back(Arch, "apple", "watchos" + OSVersion, "simulator");
+ emplace(Triples, {Arch, "apple", "watchos" + OSVersion, "simulator"});
else
- Triples.emplace_back(Arch, "apple", "watchos" + OSVersion);
+ emplace(Triples, {Arch, "apple", "watchos" + OSVersion});
break;
case MachO::LC_BUILD_VERSION: {
OSVersion = getOSVersionStr(Obj->getBuildVersionLoadCommand(cmd).minos);
switch (Obj->getBuildVersionLoadCommand(cmd).platform) {
case MachO::PLATFORM_MACOS:
- Triples.emplace_back(Arch, "apple", "macos" + OSVersion);
+ emplace(Triples, {Arch, "apple", "macos" + OSVersion});
break;
case MachO::PLATFORM_IOS:
- Triples.emplace_back(Arch, "apple", "ios" + OSVersion);
+ emplace(Triples, {Arch, "apple", "ios" + OSVersion});
break;
case MachO::PLATFORM_TVOS:
- Triples.emplace_back(Arch, "apple", "tvos" + OSVersion);
+ emplace(Triples, {Arch, "apple", "tvos" + OSVersion});
break;
case MachO::PLATFORM_WATCHOS:
- Triples.emplace_back(Arch, "apple", "watchos" + OSVersion);
+ emplace(Triples, {Arch, "apple", "watchos" + OSVersion});
break;
case MachO::PLATFORM_BRIDGEOS:
- Triples.emplace_back(Arch, "apple", "bridgeos" + OSVersion);
+ emplace(Triples, {Arch, "apple", "bridgeos" + OSVersion});
break;
case MachO::PLATFORM_MACCATALYST:
- Triples.emplace_back(Arch, "apple", "ios" + OSVersion, "macabi");
+ emplace(Triples, {Arch, "apple", "ios" + OSVersion, "macabi"});
break;
case MachO::PLATFORM_IOSSIMULATOR:
- Triples.emplace_back(Arch, "apple", "ios" + OSVersion, "simulator");
+ emplace(Triples, {Arch, "apple", "ios" + OSVersion, "simulator"});
break;
case MachO::PLATFORM_TVOSSIMULATOR:
- Triples.emplace_back(Arch, "apple", "tvos" + OSVersion, "simulator");
+ emplace(Triples, {Arch, "apple", "tvos" + OSVersion, "simulator"});
break;
case MachO::PLATFORM_WATCHOSSIMULATOR:
- Triples.emplace_back(Arch, "apple", "watchos" + OSVersion, "simulator");
+ emplace(Triples, {Arch, "apple", "watchos" + OSVersion, "simulator"});
break;
case MachO::PLATFORM_DRIVERKIT:
- Triples.emplace_back(Arch, "apple", "driverkit" + OSVersion);
+ emplace(Triples, {Arch, "apple", "driverkit" + OSVersion});
break;
default:
break; // Skip any others.
@@ -122,7 +135,7 @@ static TripleVec constructTriples(MachOObjectFile *Obj,
// Record unknown platform for older binaries that don't enforce platform
// load commands.
if (Triples.empty())
- Triples.emplace_back(Arch, "apple", "unknown");
+ emplace(Triples, {Arch, "apple", "unknown"});
return Triples;
}
More information about the llvm-commits
mailing list