Skip to content

Commit 3142b87

Browse files
committed
[Autolink Extract] Keep a set of linker flags instead of vector
Otherwise we can duplicate linker flags across input binaries, which can result in very large linkerr invocation commands. Resolves #58380
1 parent 415c5c1 commit 3142b87

File tree

2 files changed

+14
-8
lines changed

2 files changed

+14
-8
lines changed

lib/DriverTool/autolink_extract_main.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ class AutolinkExtractInvocation {
112112
/// Return 'true' if there was an error, and 'false' otherwise.
113113
static bool
114114
extractLinkerFlagsFromObjectFile(const llvm::object::ObjectFile *ObjectFile,
115-
std::vector<std::string> &LinkerFlags,
115+
llvm::SetVector<StringRef> &LinkerFlags,
116116
CompilerInstance &Instance) {
117117
// Search for the section we hold autolink entries in
118118
for (auto &Section : ObjectFile->sections()) {
@@ -141,7 +141,7 @@ extractLinkerFlagsFromObjectFile(const llvm::object::ObjectFile *ObjectFile,
141141
SectionData->split(SplitFlags, llvm::StringRef("\0", 1), -1,
142142
/*KeepEmpty=*/false);
143143
for (const auto &Flag : SplitFlags)
144-
LinkerFlags.push_back(Flag.str());
144+
LinkerFlags.insert(Flag);
145145
}
146146
}
147147
return false;
@@ -152,7 +152,7 @@ extractLinkerFlagsFromObjectFile(const llvm::object::ObjectFile *ObjectFile,
152152
/// 'true' if there was an error, and 'false' otherwise.
153153
static bool
154154
extractLinkerFlagsFromObjectFile(const llvm::object::WasmObjectFile *ObjectFile,
155-
std::vector<std::string> &LinkerFlags,
155+
llvm::SetVector<StringRef> &LinkerFlags,
156156
CompilerInstance &Instance) {
157157
// Search for the data segment we hold autolink entries in
158158
for (const llvm::object::WasmSegment &Segment : ObjectFile->dataSegments()) {
@@ -165,7 +165,7 @@ extractLinkerFlagsFromObjectFile(const llvm::object::WasmObjectFile *ObjectFile,
165165
SegmentData.split(SplitFlags, llvm::StringRef("\0", 1), -1,
166166
/*KeepEmpty=*/false);
167167
for (const auto &Flag : SplitFlags)
168-
LinkerFlags.push_back(Flag.str());
168+
LinkerFlags.insert(Flag);
169169
}
170170
}
171171
return false;
@@ -178,7 +178,7 @@ extractLinkerFlagsFromObjectFile(const llvm::object::WasmObjectFile *ObjectFile,
178178
static bool extractLinkerFlags(const llvm::object::Binary *Bin,
179179
CompilerInstance &Instance,
180180
StringRef BinaryFileName,
181-
std::vector<std::string> &LinkerFlags) {
181+
llvm::SetVector<StringRef> &LinkerFlags) {
182182
if (auto *ObjectFile = llvm::dyn_cast<llvm::object::ELFObjectFileBase>(Bin)) {
183183
return extractLinkerFlagsFromObjectFile(ObjectFile, LinkerFlags, Instance);
184184
} else if (auto *ObjectFile =
@@ -227,7 +227,7 @@ int autolink_extract_main(ArrayRef<const char *> Args, const char *Argv0,
227227
return 1;
228228
}
229229

230-
std::vector<std::string> LinkerFlags;
230+
llvm::SetVector<StringRef> LinkerFlags;
231231

232232
// Extract the linker flags from the objects.
233233
for (const auto &BinaryFileName : Invocation.getInputFilenames()) {
@@ -261,7 +261,7 @@ int autolink_extract_main(ArrayRef<const char *> Args, const char *Argv0,
261261
}
262262

263263
for (auto &Flag : LinkerFlags) {
264-
OutOS << Flag << '\n';
264+
OutOS << Flag.str() << '\n';
265265
}
266266

267267
return 0;

test/AutolinkExtract/import.swift

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
// RUN: %empty-directory(%t)
22
// RUN: %target-swiftc_driver -emit-module -emit-module-path %t/empty.swiftmodule -module-name empty -module-link-name empty %S/empty.swift
33
// RUN: %target-swiftc_driver -c %s -I %t -o %t/import_experimental.o
4-
// RUN: %target-swift-autolink-extract %t/import_experimental.o -o - | %FileCheck --check-prefix CHECK-%target-object-format %s
4+
// RUN: %target-swiftc_driver -c %s -I %t -o %t/import_experimental_again.o
5+
// RUN: %target-swift-autolink-extract %t/import_experimental.o %t/import_experimental_again.o -o - | %FileCheck --check-prefix CHECK-%target-object-format %s
6+
7+
// RUN: %target-swift-autolink-extract %t/import_experimental.o %t/import_experimental_again.o -o - | %FileCheck --check-prefix UNIQUE %s
58

69
// REQUIRES: autolink-extract
710

11+
// UNIQUE-COUNT-1: -lswiftCore
12+
// UNIQUE-COUNT-1: -lempty
13+
814
// CHECK-elf-DAG: -lswiftCore
915
// CHECK-elf-DAG: -lempty
1016

0 commit comments

Comments
 (0)