11
11
// ===----------------------------------------------------------------------===//
12
12
13
13
#include " llvm/TextAPI/DylibReader.h"
14
+ #include " llvm/ADT/STLExtras.h"
14
15
#include " llvm/ADT/StringMap.h"
15
16
#include " llvm/Object/Binary.h"
16
17
#include " llvm/Object/MachOUniversal.h"
22
23
#include < set>
23
24
#include < sstream>
24
25
#include < string>
26
+ #include < tuple>
25
27
26
28
using namespace llvm ;
27
29
using namespace llvm ::object;
28
30
using namespace llvm ::MachO;
29
31
using namespace llvm ::MachO::DylibReader;
30
32
31
33
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
+ }
32
45
33
46
static TripleVec constructTriples (MachOObjectFile *Obj,
34
47
const Architecture ArchT) {
@@ -53,61 +66,61 @@ static TripleVec constructTriples(MachOObjectFile *Obj,
53
66
switch (cmd.C .cmd ) {
54
67
case MachO::LC_VERSION_MIN_MACOSX:
55
68
OSVersion = getOSVersion (cmd);
56
- Triples. emplace_back ( Arch, " apple" , " macos" + OSVersion);
69
+ emplace (Triples, { Arch, " apple" , " macos" + OSVersion} );
57
70
break ;
58
71
case MachO::LC_VERSION_MIN_IPHONEOS:
59
72
OSVersion = getOSVersion (cmd);
60
73
if (IsIntel)
61
- Triples. emplace_back ( Arch, " apple" , " ios" + OSVersion, " simulator" );
74
+ emplace (Triples, { Arch, " apple" , " ios" + OSVersion, " simulator" } );
62
75
else
63
- Triples. emplace_back ( Arch, " apple" , " ios" + OSVersion);
76
+ emplace (Triples, { Arch, " apple" , " ios" + OSVersion} );
64
77
break ;
65
78
case MachO::LC_VERSION_MIN_TVOS:
66
79
OSVersion = getOSVersion (cmd);
67
80
if (IsIntel)
68
- Triples. emplace_back ( Arch, " apple" , " tvos" + OSVersion, " simulator" );
81
+ emplace (Triples, { Arch, " apple" , " tvos" + OSVersion, " simulator" } );
69
82
else
70
- Triples. emplace_back ( Arch, " apple" , " tvos" + OSVersion);
83
+ emplace (Triples, { Arch, " apple" , " tvos" + OSVersion} );
71
84
break ;
72
85
case MachO::LC_VERSION_MIN_WATCHOS:
73
86
OSVersion = getOSVersion (cmd);
74
87
if (IsIntel)
75
- Triples. emplace_back ( Arch, " apple" , " watchos" + OSVersion, " simulator" );
88
+ emplace (Triples, { Arch, " apple" , " watchos" + OSVersion, " simulator" } );
76
89
else
77
- Triples. emplace_back ( Arch, " apple" , " watchos" + OSVersion);
90
+ emplace (Triples, { Arch, " apple" , " watchos" + OSVersion} );
78
91
break ;
79
92
case MachO::LC_BUILD_VERSION: {
80
93
OSVersion = getOSVersionStr (Obj->getBuildVersionLoadCommand (cmd).minos );
81
94
switch (Obj->getBuildVersionLoadCommand (cmd).platform ) {
82
95
case MachO::PLATFORM_MACOS:
83
- Triples. emplace_back ( Arch, " apple" , " macos" + OSVersion);
96
+ emplace (Triples, { Arch, " apple" , " macos" + OSVersion} );
84
97
break ;
85
98
case MachO::PLATFORM_IOS:
86
- Triples. emplace_back ( Arch, " apple" , " ios" + OSVersion);
99
+ emplace (Triples, { Arch, " apple" , " ios" + OSVersion} );
87
100
break ;
88
101
case MachO::PLATFORM_TVOS:
89
- Triples. emplace_back ( Arch, " apple" , " tvos" + OSVersion);
102
+ emplace (Triples, { Arch, " apple" , " tvos" + OSVersion} );
90
103
break ;
91
104
case MachO::PLATFORM_WATCHOS:
92
- Triples. emplace_back ( Arch, " apple" , " watchos" + OSVersion);
105
+ emplace (Triples, { Arch, " apple" , " watchos" + OSVersion} );
93
106
break ;
94
107
case MachO::PLATFORM_BRIDGEOS:
95
- Triples. emplace_back ( Arch, " apple" , " bridgeos" + OSVersion);
108
+ emplace (Triples, { Arch, " apple" , " bridgeos" + OSVersion} );
96
109
break ;
97
110
case MachO::PLATFORM_MACCATALYST:
98
- Triples. emplace_back ( Arch, " apple" , " ios" + OSVersion, " macabi" );
111
+ emplace (Triples, { Arch, " apple" , " ios" + OSVersion, " macabi" } );
99
112
break ;
100
113
case MachO::PLATFORM_IOSSIMULATOR:
101
- Triples. emplace_back ( Arch, " apple" , " ios" + OSVersion, " simulator" );
114
+ emplace (Triples, { Arch, " apple" , " ios" + OSVersion, " simulator" } );
102
115
break ;
103
116
case MachO::PLATFORM_TVOSSIMULATOR:
104
- Triples. emplace_back ( Arch, " apple" , " tvos" + OSVersion, " simulator" );
117
+ emplace (Triples, { Arch, " apple" , " tvos" + OSVersion, " simulator" } );
105
118
break ;
106
119
case MachO::PLATFORM_WATCHOSSIMULATOR:
107
- Triples. emplace_back ( Arch, " apple" , " watchos" + OSVersion, " simulator" );
120
+ emplace (Triples, { Arch, " apple" , " watchos" + OSVersion, " simulator" } );
108
121
break ;
109
122
case MachO::PLATFORM_DRIVERKIT:
110
- Triples. emplace_back ( Arch, " apple" , " driverkit" + OSVersion);
123
+ emplace (Triples, { Arch, " apple" , " driverkit" + OSVersion} );
111
124
break ;
112
125
default :
113
126
break ; // Skip any others.
@@ -122,7 +135,7 @@ static TripleVec constructTriples(MachOObjectFile *Obj,
122
135
// Record unknown platform for older binaries that don't enforce platform
123
136
// load commands.
124
137
if (Triples.empty ())
125
- Triples. emplace_back ( Arch, " apple" , " unknown" );
138
+ emplace (Triples, { Arch, " apple" , " unknown" } );
126
139
127
140
return Triples;
128
141
}
0 commit comments