Skip to content

Commit 9c85fbc

Browse files
authored
AST,DependencyScan,IRGen,Serialization,Tooling: track library style (#78777)
Track if the dependency is static or dynamic. This is in preparation for helping rename the static library to differentiate it from import libraries.
1 parent 8d69807 commit 9c85fbc

26 files changed

+158
-96
lines changed

include/swift-c/DependencyScan/DependencyScan.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,8 @@ swiftscan_module_info_get_details(swiftscan_dependency_info_t info);
155155
SWIFTSCAN_PUBLIC swiftscan_string_ref_t
156156
swiftscan_link_library_info_get_link_name(
157157
swiftscan_link_library_info_t info);
158+
SWIFTSCAN_PUBLIC bool
159+
swiftscan_link_library_info_get_is_static(swiftscan_link_library_info_t info);
158160
SWIFTSCAN_PUBLIC bool swiftscan_link_library_info_get_is_framework(
159161
swiftscan_link_library_info_t info);
160162
SWIFTSCAN_PUBLIC bool swiftscan_link_library_info_get_should_force_load(

include/swift/AST/IRGenOptions.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include "llvm/Support/VersionTuple.h"
3434
#include <optional>
3535
#include <string>
36+
#include <tuple>
3637
#include <vector>
3738

3839
namespace swift {
@@ -258,7 +259,7 @@ class IRGenOptions {
258259
SmallVector<LinkLibrary, 4> LinkLibraries;
259260

260261
/// The public dependent libraries specified on the command line.
261-
std::vector<std::string> PublicLinkLibraries;
262+
std::vector<std::tuple<std::string, bool>> PublicLinkLibraries;
262263

263264
/// If non-empty, the (unmangled) name of a dummy symbol to emit that can be
264265
/// used to force-load this module.

include/swift/AST/LinkLibrary.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,19 @@ class LinkLibrary {
3232
private:
3333
std::string Name;
3434
unsigned Kind : 1;
35+
unsigned Static : 1;
3536
unsigned ForceLoad : 1;
3637

3738
public:
38-
LinkLibrary(StringRef N, LibraryKind K, bool forceLoad = false)
39-
: Name(N), Kind(static_cast<unsigned>(K)), ForceLoad(forceLoad) {
39+
LinkLibrary(StringRef N, LibraryKind K, bool Static, bool forceLoad = false)
40+
: Name(N), Kind(static_cast<unsigned>(K)), Static(Static),
41+
ForceLoad(forceLoad) {
4042
assert(getKind() == K && "not enough bits for the kind");
4143
}
4244

4345
LibraryKind getKind() const { return static_cast<LibraryKind>(Kind); }
4446
StringRef getName() const { return Name; }
47+
bool isStaticLibrary() const { return Static; }
4548
bool shouldForceLoad() const { return ForceLoad; }
4649
};
4750

include/swift/DependencyScan/DependencyScanImpl.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ struct swiftscan_dependency_info_s {
6969

7070
struct swiftscan_link_library_info_s {
7171
swiftscan_string_ref_t name;
72+
bool isStatic;
7273
bool isFramework;
7374
bool forceLoad;
7475
};

include/swift/DependencyScan/SerializedModuleDependencyCacheFormat.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ using llvm::BCVBR;
4141
const unsigned char MODULE_DEPENDENCY_CACHE_FORMAT_SIGNATURE[] = {'I', 'M', 'D','C'};
4242
const unsigned MODULE_DEPENDENCY_CACHE_FORMAT_VERSION_MAJOR = 9;
4343
/// Increment this on every change.
44-
const unsigned MODULE_DEPENDENCY_CACHE_FORMAT_VERSION_MINOR = 0;
44+
const unsigned MODULE_DEPENDENCY_CACHE_FORMAT_VERSION_MINOR = 1;
4545

4646
/// Various identifiers in this format will rely on having their strings mapped
4747
/// using this ID.
@@ -148,12 +148,12 @@ using IdentifierArrayLayout =
148148
// A record for a given link library node containing information
149149
// required for the build system client to capture a requirement
150150
// to link a given dependency library.
151-
using LinkLibraryLayout =
152-
BCRecordLayout<LINK_LIBRARY_NODE, // ID
153-
IdentifierIDField, // libraryName
154-
IsFrameworkField, // isFramework
155-
IsForceLoadField // forceLoad
156-
>;
151+
using LinkLibraryLayout = BCRecordLayout<LINK_LIBRARY_NODE, // ID
152+
IdentifierIDField, // libraryName
153+
IsFrameworkField, // isFramework
154+
IsStaticField, // isStatic
155+
IsForceLoadField // forceLoad
156+
>;
157157
using LinkLibraryArrayLayout =
158158
BCRecordLayout<LINK_LIBRARY_ARRAY_NODE, IdentifierIDArryField>;
159159

include/swift/Frontend/Frontend.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -230,8 +230,8 @@ class CompilerInvocation {
230230
return ClangImporterOpts.ExtraArgs;
231231
}
232232

233-
void addLinkLibrary(StringRef name, LibraryKind kind) {
234-
IRGenOpts.LinkLibraries.push_back({name, kind});
233+
void addLinkLibrary(StringRef name, LibraryKind kind, bool isStaticLibrary) {
234+
IRGenOpts.LinkLibraries.emplace_back(name, kind, isStaticLibrary);
235235
}
236236

237237
ArrayRef<LinkLibrary> getLinkLibraries() const {

include/swift/Serialization/SerializationOptions.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
#include <set>
2222
#include <string>
23+
#include <tuple>
2324
#include <vector>
2425

2526
namespace swift {
@@ -150,7 +151,7 @@ class SerializationOptions {
150151
uint64_t getSize() const { return Size; }
151152
};
152153
ArrayRef<FileDependency> Dependencies;
153-
ArrayRef<std::string> PublicDependentLibraries;
154+
ArrayRef<std::tuple<std::string, bool>> PublicDependentLibraries;
154155

155156
bool AutolinkForceLoad = false;
156157
bool SerializeAllSIL = false;

lib/AST/ModuleDependencies.cpp

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -503,24 +503,33 @@ swift::dependencies::checkImportNotTautological(const ImportPath::Module moduleP
503503
return false;
504504
}
505505

506-
void
507-
swift::dependencies::registerCxxInteropLibraries(
508-
const llvm::Triple &Target,
509-
StringRef mainModuleName,
510-
bool hasStaticCxx, bool hasStaticCxxStdlib, CXXStdlibKind cxxStdlibKind,
511-
std::function<void(const LinkLibrary&)> RegistrationCallback) {
512-
if (cxxStdlibKind == CXXStdlibKind::Libcxx)
513-
RegistrationCallback(LinkLibrary("c++", LibraryKind::Library));
514-
else if (cxxStdlibKind == CXXStdlibKind::Libstdcxx)
515-
RegistrationCallback(LinkLibrary("stdc++", LibraryKind::Library));
506+
void swift::dependencies::registerCxxInteropLibraries(
507+
const llvm::Triple &Target, StringRef mainModuleName, bool hasStaticCxx,
508+
bool hasStaticCxxStdlib, CXXStdlibKind cxxStdlibKind,
509+
std::function<void(const LinkLibrary &)> RegistrationCallback) {
510+
511+
switch (cxxStdlibKind) {
512+
case CXXStdlibKind::Libcxx:
513+
RegistrationCallback(
514+
LinkLibrary{"c++", LibraryKind::Library, /*static=*/false});
515+
break;
516+
case CXXStdlibKind::Libstdcxx:
517+
RegistrationCallback(
518+
LinkLibrary{"stdc++", LibraryKind::Library, /*static=*/false});
519+
break;
520+
case CXXStdlibKind::Msvcprt:
521+
// FIXME: should we be explicitly linking in msvcprt or will the module do
522+
// so?
523+
break;
524+
case CXXStdlibKind::Unknown:
525+
// FIXME: we should probably emit a warning or a note here.
526+
break;
527+
}
516528

517529
// Do not try to link Cxx with itself.
518-
if (mainModuleName != CXX_MODULE_NAME) {
519-
RegistrationCallback(LinkLibrary(Target.isOSWindows() && hasStaticCxx
520-
? "libswiftCxx"
521-
: "swiftCxx",
522-
LibraryKind::Library));
523-
}
530+
if (mainModuleName != CXX_MODULE_NAME)
531+
RegistrationCallback(
532+
LinkLibrary{"swiftCxx", LibraryKind::Library, hasStaticCxx});
524533

525534
// Do not try to link CxxStdlib with the C++ standard library, Cxx or
526535
// itself.
@@ -529,19 +538,9 @@ swift::dependencies::registerCxxInteropLibraries(
529538
return mainModuleName == Name;
530539
})) {
531540
// Only link with CxxStdlib on platforms where the overlay is available.
532-
switch (Target.getOS()) {
533-
case llvm::Triple::Win32: {
534-
RegistrationCallback(
535-
LinkLibrary(hasStaticCxxStdlib ? "libswiftCxxStdlib" : "swiftCxxStdlib",
536-
LibraryKind::Library));
537-
break;
538-
}
539-
default:
540-
if (Target.isOSDarwin() || Target.isOSLinux())
541-
RegistrationCallback(LinkLibrary("swiftCxxStdlib",
542-
LibraryKind::Library));
543-
break;
544-
}
541+
if (Target.isOSDarwin() || Target.isOSLinux() || Target.isOSWindows())
542+
RegistrationCallback(LinkLibrary{"swiftCxxStdlib", LibraryKind::Library,
543+
hasStaticCxxStdlib});
545544
}
546545
}
547546

@@ -569,7 +568,8 @@ swift::dependencies::registerBackDeployLibraries(
569568
if (*compatibilityVersion > version)
570569
return;
571570

572-
RegistrationCallback({libraryName, LibraryKind::Library, forceLoad});
571+
RegistrationCallback(
572+
{libraryName, LibraryKind::Library, /*static=*/true, forceLoad});
573573
};
574574

575575
#define BACK_DEPLOYMENT_LIB(Version, Filter, LibraryName, ForceLoad) \

lib/ClangImporter/ClangImporter.cpp

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4105,15 +4105,11 @@ void ClangModuleUnit::collectLinkLibraries(
41054105
if (clangModule->UseExportAsModuleLinkName)
41064106
return;
41074107

4108-
for (auto clangLinkLib : clangModule->LinkLibraries) {
4109-
LibraryKind kind;
4110-
if (clangLinkLib.IsFramework)
4111-
kind = LibraryKind::Framework;
4112-
else
4113-
kind = LibraryKind::Library;
4114-
4115-
callback(LinkLibrary(clangLinkLib.Library, kind));
4116-
}
4108+
for (auto clangLinkLib : clangModule->LinkLibraries)
4109+
callback(LinkLibrary{clangLinkLib.Library,
4110+
clangLinkLib.IsFramework ? LibraryKind::Framework
4111+
: LibraryKind::Library,
4112+
/*static=*/false});
41174113
}
41184114

41194115
StringRef ClangModuleUnit::getFilename() const {

lib/ClangImporter/ClangModuleDependencyScanner.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -266,9 +266,10 @@ ModuleDependencyVector ClangImporter::bridgeClangModuleDependencies(
266266

267267
std::vector<LinkLibrary> LinkLibraries;
268268
for (const auto &ll : clangModuleDep.LinkLibraries)
269-
LinkLibraries.push_back(
270-
{ll.Library,
271-
ll.IsFramework ? LibraryKind::Framework : LibraryKind::Library});
269+
LinkLibraries.emplace_back(
270+
ll.Library,
271+
ll.IsFramework ? LibraryKind::Framework : LibraryKind::Library,
272+
/*static=*/false);
272273

273274
// Module-level dependencies.
274275
llvm::StringSet<> alreadyAddedModules;

lib/DependencyScan/DependencyScanJSON.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,10 @@ void writeLinkLibraries(llvm::raw_ostream &out,
199199
writeJSONValue(out, llInfo.name, indentLevel);
200200
out << ",\n";
201201
out.indent(entryIndentLevel);
202+
out << "\"isStatic\": ";
203+
writeJSONValue(out, llInfo.isStatic, entryIndentLevel);
204+
out << ",\n";
205+
out.indent(entryIndentLevel);
202206
out << "\"isFramework\": ";
203207
writeJSONValue(out, llInfo.isFramework, entryIndentLevel);
204208
out << ",\n";

lib/DependencyScan/ModuleDependencyCacheSerialization.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -354,17 +354,18 @@ bool ModuleDependenciesCacheDeserializer::readGraph(
354354

355355
case LINK_LIBRARY_NODE: {
356356
unsigned libraryIdentifierID;
357-
bool isFramework, shouldForceLoad;
357+
bool isFramework, isStatic, shouldForceLoad;
358358
LinkLibraryLayout::readRecord(Scratch, libraryIdentifierID, isFramework,
359-
shouldForceLoad);
359+
isStatic, shouldForceLoad);
360360
auto libraryIdentifier = getIdentifier(libraryIdentifierID);
361361
if (!libraryIdentifier)
362362
llvm::report_fatal_error("Bad link library identifier");
363363

364-
LinkLibraries.push_back(LinkLibrary(libraryIdentifier.value(),
365-
isFramework ? LibraryKind::Framework
366-
: LibraryKind::Library,
367-
shouldForceLoad));
364+
LinkLibraries.emplace_back(
365+
libraryIdentifier.value(),
366+
isFramework ? LibraryKind::Framework
367+
: LibraryKind::Library,
368+
isStatic, shouldForceLoad);
368369
break;
369370
}
370371

@@ -1311,13 +1312,12 @@ void ModuleDependenciesCacheSerializer::writeLinkLibraries(
13111312
unsigned ModuleDependenciesCacheSerializer::writeLinkLibraryInfos(
13121313
const ModuleDependencyInfo &dependencyInfo) {
13131314
using namespace graph_block;
1314-
for (auto &linkLibrary : dependencyInfo.getLinkLibraries()) {
1315+
for (auto &linkLibrary : dependencyInfo.getLinkLibraries())
13151316
LinkLibraryLayout::emitRecord(
13161317
Out, ScratchRecord, AbbrCodes[LinkLibraryLayout::Code],
13171318
getIdentifier(linkLibrary.getName().str()),
13181319
linkLibrary.getKind() == LibraryKind::Framework,
1319-
linkLibrary.shouldForceLoad());
1320-
}
1320+
linkLibrary.isStaticLibrary(), linkLibrary.shouldForceLoad());
13211321
return dependencyInfo.getLinkLibraries().size();
13221322
}
13231323

lib/DependencyScan/ScanDependencies.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -815,6 +815,7 @@ generateFullDependencyGraph(const CompilerInstance &instance,
815815
const auto &ll = linkLibraries[i];
816816
swiftscan_link_library_info_s *llInfo = new swiftscan_link_library_info_s;
817817
llInfo->name = create_clone(ll.getName().str().c_str());
818+
llInfo->isStatic = ll.isStaticLibrary();
818819
llInfo->isFramework = ll.getKind() == LibraryKind::Framework;
819820
llInfo->forceLoad = ll.shouldForceLoad();
820821
linkLibrarySet->link_libraries[i] = llInfo;
@@ -1242,7 +1243,7 @@ static void resolveImplicitLinkLibraries(const CompilerInstance &instance,
12421243
};
12431244

12441245
if (langOpts.EnableObjCInterop)
1245-
addLinkLibrary({"objc", LibraryKind::Library});
1246+
addLinkLibrary(LinkLibrary{"objc", LibraryKind::Library, /*static=*/false});
12461247

12471248
if (langOpts.EnableCXXInterop) {
12481249
auto OptionalCxxDep = cache.findDependency(CXX_MODULE_NAME);

lib/Frontend/CompilerInvocation.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3215,7 +3215,8 @@ static bool ParseIRGenArgs(IRGenOptions &Opts, ArgList &Args,
32153215
llvm_unreachable("Unknown LinkLibrary option kind");
32163216
}
32173217

3218-
Opts.LinkLibraries.push_back(LinkLibrary(A->getValue(), Kind));
3218+
Opts.LinkLibraries.emplace_back(
3219+
A->getValue(), Kind, /*static=*/false);
32193220
}
32203221

32213222
if (auto valueNames = Args.getLastArg(OPT_disable_llvm_value_names,
@@ -3445,11 +3446,11 @@ static bool ParseIRGenArgs(IRGenOptions &Opts, ArgList &Args,
34453446
}
34463447

34473448
for (const auto &Lib : Args.getAllArgValues(options::OPT_autolink_library))
3448-
Opts.LinkLibraries.push_back(LinkLibrary(Lib, LibraryKind::Library));
3449+
Opts.LinkLibraries.emplace_back(
3450+
Lib, LibraryKind::Library, /*static=*/false);
34493451

3450-
for (const auto &Lib : Args.getAllArgValues(options::OPT_public_autolink_library)) {
3451-
Opts.PublicLinkLibraries.push_back(Lib);
3452-
}
3452+
for (const auto &Lib : Args.getAllArgValues(options::OPT_public_autolink_library))
3453+
Opts.PublicLinkLibraries.push_back(std::make_tuple(Lib, /*static=*/false));
34533454

34543455
if (const Arg *A = Args.getLastArg(OPT_type_info_dump_filter_EQ)) {
34553456
StringRef mode(A->getValue());

lib/IRGen/IRGenModule.cpp

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1581,32 +1581,35 @@ swift::irgen::encodeForceLoadSymbolName(llvm::SmallVectorImpl<char> &buf,
15811581
}
15821582

15831583
llvm::SmallString<32> getTargetDependentLibraryOption(const llvm::Triple &T,
1584-
StringRef library) {
1584+
LinkLibrary library) {
15851585
llvm::SmallString<32> buffer;
1586+
StringRef name = library.getName();
15861587

15871588
if (T.isWindowsMSVCEnvironment() || T.isWindowsItaniumEnvironment()) {
1588-
bool quote = library.contains(' ');
1589+
bool quote = name.contains(' ');
15891590

15901591
buffer += "/DEFAULTLIB:";
15911592
if (quote)
15921593
buffer += '"';
1593-
buffer += library;
1594-
if (!library.ends_with_insensitive(".lib"))
1594+
if (library.isStaticLibrary() && !name.starts_with_insensitive("lib"))
1595+
buffer += "lib";
1596+
buffer += name;
1597+
if (!name.ends_with_insensitive(".lib"))
15951598
buffer += ".lib";
15961599
if (quote)
15971600
buffer += '"';
15981601
} else if (T.isPS4()) {
1599-
bool quote = library.contains(' ');
1602+
bool quote = name.contains(' ');
16001603

16011604
buffer += "\01";
16021605
if (quote)
16031606
buffer += '"';
1604-
buffer += library;
1607+
buffer += name;
16051608
if (quote)
16061609
buffer += '"';
16071610
} else {
16081611
buffer += "-l";
1609-
buffer += library;
1612+
buffer += name;
16101613
}
16111614

16121615
return buffer;
@@ -1686,7 +1689,8 @@ void IRGenModule::addLinkLibraries() {
16861689
});
16871690

16881691
if (ObjCInterop)
1689-
registerLinkLibrary(LinkLibrary("objc", LibraryKind::Library));
1692+
registerLinkLibrary(
1693+
LinkLibrary{"objc", LibraryKind::Library, /*static=*/false});
16901694

16911695
// If C++ interop is enabled, add -lc++ on Darwin and -lstdc++ on linux.
16921696
// Also link with C++ bridging utility module (Cxx) and C++ stdlib overlay
@@ -1817,7 +1821,7 @@ void AutolinkKind::collectEntriesFromLibraries(
18171821
switch (linkLib.getKind()) {
18181822
case LibraryKind::Library: {
18191823
llvm::SmallString<32> opt =
1820-
getTargetDependentLibraryOption(IGM.Triple, linkLib.getName());
1824+
getTargetDependentLibraryOption(IGM.Triple, linkLib);
18211825
Entries.insert(llvm::MDNode::get(ctx, llvm::MDString::get(ctx, opt)));
18221826
continue;
18231827
}
@@ -1838,7 +1842,7 @@ void AutolinkKind::collectEntriesFromLibraries(
18381842
switch (linkLib.getKind()) {
18391843
case LibraryKind::Library: {
18401844
llvm::SmallString<32> opt =
1841-
getTargetDependentLibraryOption(IGM.Triple, linkLib.getName());
1845+
getTargetDependentLibraryOption(IGM.Triple, linkLib);
18421846
Entries.insert(llvm::MDNode::get(ctx, llvm::MDString::get(ctx, opt)));
18431847
continue;
18441848
}

0 commit comments

Comments
 (0)