Skip to content

Commit e6ebe8b

Browse files
authored
[TextAPI] use unique sorted vector for holding target triples for (llvm#75959)
reading dylibs * This is a better fix than what I originally did to appease CI.
1 parent 98e20e1 commit e6ebe8b

File tree

1 file changed

+31
-18
lines changed

1 file changed

+31
-18
lines changed

llvm/lib/TextAPI/BinaryReader/DylibReader.cpp

Lines changed: 31 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
//===----------------------------------------------------------------------===//
1212

1313
#include "llvm/TextAPI/DylibReader.h"
14+
#include "llvm/ADT/STLExtras.h"
1415
#include "llvm/ADT/StringMap.h"
1516
#include "llvm/Object/Binary.h"
1617
#include "llvm/Object/MachOUniversal.h"
@@ -22,13 +23,25 @@
2223
#include <set>
2324
#include <sstream>
2425
#include <string>
26+
#include <tuple>
2527

2628
using namespace llvm;
2729
using namespace llvm::object;
2830
using namespace llvm::MachO;
2931
using namespace llvm::MachO::DylibReader;
3032

3133
using TripleVec = std::vector<Triple>;
34+
static typename TripleVec::iterator emplace(TripleVec &Container, Triple &&T) {
35+
auto I = partition_point(Container, [=](const Triple &CT) {
36+
return std::forward_as_tuple(CT.getArch(), CT.getOS(),
37+
CT.getEnvironment()) <
38+
std::forward_as_tuple(T.getArch(), T.getOS(), T.getEnvironment());
39+
});
40+
41+
if (I != Container.end() && *I == T)
42+
return I;
43+
return Container.emplace(I, T);
44+
}
3245

3346
static TripleVec constructTriples(MachOObjectFile *Obj,
3447
const Architecture ArchT) {
@@ -53,61 +66,61 @@ static TripleVec constructTriples(MachOObjectFile *Obj,
5366
switch (cmd.C.cmd) {
5467
case MachO::LC_VERSION_MIN_MACOSX:
5568
OSVersion = getOSVersion(cmd);
56-
Triples.emplace_back(Arch, "apple", "macos" + OSVersion);
69+
emplace(Triples, {Arch, "apple", "macos" + OSVersion});
5770
break;
5871
case MachO::LC_VERSION_MIN_IPHONEOS:
5972
OSVersion = getOSVersion(cmd);
6073
if (IsIntel)
61-
Triples.emplace_back(Arch, "apple", "ios" + OSVersion, "simulator");
74+
emplace(Triples, {Arch, "apple", "ios" + OSVersion, "simulator"});
6275
else
63-
Triples.emplace_back(Arch, "apple", "ios" + OSVersion);
76+
emplace(Triples, {Arch, "apple", "ios" + OSVersion});
6477
break;
6578
case MachO::LC_VERSION_MIN_TVOS:
6679
OSVersion = getOSVersion(cmd);
6780
if (IsIntel)
68-
Triples.emplace_back(Arch, "apple", "tvos" + OSVersion, "simulator");
81+
emplace(Triples, {Arch, "apple", "tvos" + OSVersion, "simulator"});
6982
else
70-
Triples.emplace_back(Arch, "apple", "tvos" + OSVersion);
83+
emplace(Triples, {Arch, "apple", "tvos" + OSVersion});
7184
break;
7285
case MachO::LC_VERSION_MIN_WATCHOS:
7386
OSVersion = getOSVersion(cmd);
7487
if (IsIntel)
75-
Triples.emplace_back(Arch, "apple", "watchos" + OSVersion, "simulator");
88+
emplace(Triples, {Arch, "apple", "watchos" + OSVersion, "simulator"});
7689
else
77-
Triples.emplace_back(Arch, "apple", "watchos" + OSVersion);
90+
emplace(Triples, {Arch, "apple", "watchos" + OSVersion});
7891
break;
7992
case MachO::LC_BUILD_VERSION: {
8093
OSVersion = getOSVersionStr(Obj->getBuildVersionLoadCommand(cmd).minos);
8194
switch (Obj->getBuildVersionLoadCommand(cmd).platform) {
8295
case MachO::PLATFORM_MACOS:
83-
Triples.emplace_back(Arch, "apple", "macos" + OSVersion);
96+
emplace(Triples, {Arch, "apple", "macos" + OSVersion});
8497
break;
8598
case MachO::PLATFORM_IOS:
86-
Triples.emplace_back(Arch, "apple", "ios" + OSVersion);
99+
emplace(Triples, {Arch, "apple", "ios" + OSVersion});
87100
break;
88101
case MachO::PLATFORM_TVOS:
89-
Triples.emplace_back(Arch, "apple", "tvos" + OSVersion);
102+
emplace(Triples, {Arch, "apple", "tvos" + OSVersion});
90103
break;
91104
case MachO::PLATFORM_WATCHOS:
92-
Triples.emplace_back(Arch, "apple", "watchos" + OSVersion);
105+
emplace(Triples, {Arch, "apple", "watchos" + OSVersion});
93106
break;
94107
case MachO::PLATFORM_BRIDGEOS:
95-
Triples.emplace_back(Arch, "apple", "bridgeos" + OSVersion);
108+
emplace(Triples, {Arch, "apple", "bridgeos" + OSVersion});
96109
break;
97110
case MachO::PLATFORM_MACCATALYST:
98-
Triples.emplace_back(Arch, "apple", "ios" + OSVersion, "macabi");
111+
emplace(Triples, {Arch, "apple", "ios" + OSVersion, "macabi"});
99112
break;
100113
case MachO::PLATFORM_IOSSIMULATOR:
101-
Triples.emplace_back(Arch, "apple", "ios" + OSVersion, "simulator");
114+
emplace(Triples, {Arch, "apple", "ios" + OSVersion, "simulator"});
102115
break;
103116
case MachO::PLATFORM_TVOSSIMULATOR:
104-
Triples.emplace_back(Arch, "apple", "tvos" + OSVersion, "simulator");
117+
emplace(Triples, {Arch, "apple", "tvos" + OSVersion, "simulator"});
105118
break;
106119
case MachO::PLATFORM_WATCHOSSIMULATOR:
107-
Triples.emplace_back(Arch, "apple", "watchos" + OSVersion, "simulator");
120+
emplace(Triples, {Arch, "apple", "watchos" + OSVersion, "simulator"});
108121
break;
109122
case MachO::PLATFORM_DRIVERKIT:
110-
Triples.emplace_back(Arch, "apple", "driverkit" + OSVersion);
123+
emplace(Triples, {Arch, "apple", "driverkit" + OSVersion});
111124
break;
112125
default:
113126
break; // Skip any others.
@@ -122,7 +135,7 @@ static TripleVec constructTriples(MachOObjectFile *Obj,
122135
// Record unknown platform for older binaries that don't enforce platform
123136
// load commands.
124137
if (Triples.empty())
125-
Triples.emplace_back(Arch, "apple", "unknown");
138+
emplace(Triples, {Arch, "apple", "unknown"});
126139

127140
return Triples;
128141
}

0 commit comments

Comments
 (0)