18
18
19
19
#include < string>
20
20
#include < vector>
21
+ #include < unordered_set>
21
22
22
23
#include " swift/AST/DiagnosticsFrontend.h"
23
24
#include " swift/Frontend/Frontend.h"
@@ -112,6 +113,7 @@ class AutolinkExtractInvocation {
112
113
// / Return 'true' if there was an error, and 'false' otherwise.
113
114
static bool
114
115
extractLinkerFlagsFromObjectFile (const llvm::object::ObjectFile *ObjectFile,
116
+ std::unordered_set<std::string> &SeenLinkerFlags,
115
117
std::vector<std::string> &LinkerFlags,
116
118
CompilerInstance &Instance) {
117
119
// Search for the section we hold autolink entries in
@@ -140,8 +142,11 @@ extractLinkerFlagsFromObjectFile(const llvm::object::ObjectFile *ObjectFile,
140
142
llvm::SmallVector<llvm::StringRef, 4 > SplitFlags;
141
143
SectionData->split (SplitFlags, llvm::StringRef (" \0 " , 1 ), -1 ,
142
144
/* KeepEmpty=*/ false );
143
- for (const auto &Flag : SplitFlags)
144
- LinkerFlags.push_back (Flag.str ());
145
+ for (const auto &Flag : SplitFlags) {
146
+ auto SeenFlagsInsertResult = SeenLinkerFlags.insert (Flag.str ());
147
+ if (SeenFlagsInsertResult.second == true )
148
+ LinkerFlags.push_back (Flag.str ());
149
+ }
145
150
}
146
151
}
147
152
return false ;
@@ -152,6 +157,7 @@ extractLinkerFlagsFromObjectFile(const llvm::object::ObjectFile *ObjectFile,
152
157
// / 'true' if there was an error, and 'false' otherwise.
153
158
static bool
154
159
extractLinkerFlagsFromObjectFile (const llvm::object::WasmObjectFile *ObjectFile,
160
+ std::unordered_set<std::string> &SeenLinkerFlags,
155
161
std::vector<std::string> &LinkerFlags,
156
162
CompilerInstance &Instance) {
157
163
// Search for the data segment we hold autolink entries in
@@ -164,8 +170,11 @@ extractLinkerFlagsFromObjectFile(const llvm::object::WasmObjectFile *ObjectFile,
164
170
llvm::SmallVector<llvm::StringRef, 4 > SplitFlags;
165
171
SegmentData.split (SplitFlags, llvm::StringRef (" \0 " , 1 ), -1 ,
166
172
/* KeepEmpty=*/ false );
167
- for (const auto &Flag : SplitFlags)
168
- LinkerFlags.push_back (Flag.str ());
173
+ for (const auto &Flag : SplitFlags) {
174
+ auto SeenFlagsInsertResult = SeenLinkerFlags.insert (Flag.str ());
175
+ if (SeenFlagsInsertResult.second == true )
176
+ LinkerFlags.push_back (Flag.str ());
177
+ }
169
178
}
170
179
}
171
180
return false ;
@@ -178,12 +187,13 @@ extractLinkerFlagsFromObjectFile(const llvm::object::WasmObjectFile *ObjectFile,
178
187
static bool extractLinkerFlags (const llvm::object::Binary *Bin,
179
188
CompilerInstance &Instance,
180
189
StringRef BinaryFileName,
190
+ std::unordered_set<std::string> &SeenLinkerFlags,
181
191
std::vector<std::string> &LinkerFlags) {
182
192
if (auto *ObjectFile = llvm::dyn_cast<llvm::object::ELFObjectFileBase>(Bin)) {
183
- return extractLinkerFlagsFromObjectFile (ObjectFile, LinkerFlags, Instance);
193
+ return extractLinkerFlagsFromObjectFile (ObjectFile, SeenLinkerFlags, LinkerFlags, Instance);
184
194
} else if (auto *ObjectFile =
185
195
llvm::dyn_cast<llvm::object::WasmObjectFile>(Bin)) {
186
- return extractLinkerFlagsFromObjectFile (ObjectFile, LinkerFlags, Instance);
196
+ return extractLinkerFlagsFromObjectFile (ObjectFile, SeenLinkerFlags, LinkerFlags, Instance);
187
197
} else if (auto *Archive = llvm::dyn_cast<llvm::object::Archive>(Bin)) {
188
198
llvm::Error Error = llvm::Error::success ();
189
199
for (const auto &Child : Archive->children (Error)) {
@@ -197,7 +207,7 @@ static bool extractLinkerFlags(const llvm::object::Binary *Bin,
197
207
return true ;
198
208
}
199
209
if (extractLinkerFlags (ChildBinary->get (), Instance, BinaryFileName,
200
- LinkerFlags)) {
210
+ SeenLinkerFlags, LinkerFlags)) {
201
211
return true ;
202
212
}
203
213
}
@@ -228,6 +238,7 @@ int autolink_extract_main(ArrayRef<const char *> Args, const char *Argv0,
228
238
}
229
239
230
240
std::vector<std::string> LinkerFlags;
241
+ std::unordered_set<std::string> SeenLinkerFlags;
231
242
232
243
// Extract the linker flags from the objects.
233
244
for (const auto &BinaryFileName : Invocation.getInputFilenames ()) {
@@ -245,7 +256,7 @@ int autolink_extract_main(ArrayRef<const char *> Args, const char *Argv0,
245
256
}
246
257
247
258
if (extractLinkerFlags (BinaryOwner->getBinary (), Instance, BinaryFileName,
248
- LinkerFlags)) {
259
+ SeenLinkerFlags, LinkerFlags)) {
249
260
return 1 ;
250
261
}
251
262
}
0 commit comments