Skip to content

Commit 5465047

Browse files
committed
AST,DependencyScan,Serialization: track library style
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 cc9713b commit 5465047

14 files changed

+70
-65
lines changed

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/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 = 8;
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.
@@ -139,12 +139,12 @@ using IdentifierArrayLayout =
139139
BCRecordLayout<IDENTIFIER_ARRAY_NODE, IdentifierIDArryField>;
140140

141141
// ACTODO: Comment
142-
using LinkLibraryLayout =
143-
BCRecordLayout<LINK_LIBRARY_NODE, // ID
144-
IdentifierIDField, // libraryName
145-
IsFrameworkField, // isFramework
146-
IsForceLoadField // forceLoad
147-
>;
142+
using LinkLibraryLayout = BCRecordLayout<LINK_LIBRARY_NODE, // ID
143+
IdentifierIDField, // libraryName
144+
IsFrameworkField, // isFramework
145+
IsStaticField, // isStatic
146+
IsForceLoadField // forceLoad
147+
>;
148148
// ACTODO: Comment
149149
using LinkLibraryArrayLayout =
150150
BCRecordLayout<LINK_LIBRARY_ARRAY_NODE, IdentifierIDArryField>;

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 {

lib/AST/ModuleDependencies.cpp

Lines changed: 28 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -490,24 +490,33 @@ swift::dependencies::checkImportNotTautological(const ImportPath::Module moduleP
490490
return false;
491491
}
492492

493-
void
494-
swift::dependencies::registerCxxInteropLibraries(
495-
const llvm::Triple &Target,
496-
StringRef mainModuleName,
497-
bool hasStaticCxx, bool hasStaticCxxStdlib, CXXStdlibKind cxxStdlibKind,
498-
std::function<void(const LinkLibrary&)> RegistrationCallback) {
499-
if (cxxStdlibKind == CXXStdlibKind::Libcxx)
500-
RegistrationCallback(LinkLibrary("c++", LibraryKind::Library));
501-
else if (cxxStdlibKind == CXXStdlibKind::Libstdcxx)
502-
RegistrationCallback(LinkLibrary("stdc++", LibraryKind::Library));
493+
void swift::dependencies::registerCxxInteropLibraries(
494+
const llvm::Triple &Target, StringRef mainModuleName, bool hasStaticCxx,
495+
bool hasStaticCxxStdlib, CXXStdlibKind cxxStdlibKind,
496+
std::function<void(const LinkLibrary &)> RegistrationCallback) {
497+
498+
switch (cxxStdlibKind) {
499+
case CXXStdlibKind::Libcxx:
500+
RegistrationCallback(
501+
LinkLibrary{"c++", LibraryKind::Library, /*static=*/false});
502+
break;
503+
case CXXStdlibKind::Libstdcxx:
504+
RegistrationCallback(
505+
LinkLibrary{"stdc++", LibraryKind::Library, /*static=*/false});
506+
break;
507+
case CXXStdlibKind::Msvcprt:
508+
// FIXME: should we be explicitly linking in msvcprt or will the module do
509+
// so?
510+
break;
511+
case CXXStdlibKind::Unknown:
512+
// FIXME: we should probably emit a warning or a note here.
513+
break;
514+
}
503515

504516
// Do not try to link Cxx with itself.
505-
if (mainModuleName != CXX_MODULE_NAME) {
506-
RegistrationCallback(LinkLibrary(Target.isOSWindows() && hasStaticCxx
507-
? "libswiftCxx"
508-
: "swiftCxx",
509-
LibraryKind::Library));
510-
}
517+
if (mainModuleName != CXX_MODULE_NAME)
518+
RegistrationCallback(
519+
LinkLibrary{"swiftCxx", LibraryKind::Library, hasStaticCxx});
511520

512521
// Do not try to link CxxStdlib with the C++ standard library, Cxx or
513522
// itself.
@@ -516,19 +525,9 @@ swift::dependencies::registerCxxInteropLibraries(
516525
return mainModuleName == Name;
517526
})) {
518527
// Only link with CxxStdlib on platforms where the overlay is available.
519-
switch (Target.getOS()) {
520-
case llvm::Triple::Win32: {
521-
RegistrationCallback(
522-
LinkLibrary(hasStaticCxxStdlib ? "libswiftCxxStdlib" : "swiftCxxStdlib",
523-
LibraryKind::Library));
524-
break;
525-
}
526-
default:
527-
if (Target.isOSDarwin() || Target.isOSLinux())
528-
RegistrationCallback(LinkLibrary("swiftCxxStdlib",
529-
LibraryKind::Library));
530-
break;
531-
}
528+
if (Target.isOSDarwin() || Target.isOSLinux() || Target.isOSWindows())
529+
RegistrationCallback(LinkLibrary{"swiftCxxStdlib", LibraryKind::Library,
530+
hasStaticCxxStdlib});
532531
}
533532
}
534533

lib/ClangImporter/ClangImporter.cpp

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4068,15 +4068,11 @@ void ClangModuleUnit::collectLinkLibraries(
40684068
if (clangModule->UseExportAsModuleLinkName)
40694069
return;
40704070

4071-
for (auto clangLinkLib : clangModule->LinkLibraries) {
4072-
LibraryKind kind;
4073-
if (clangLinkLib.IsFramework)
4074-
kind = LibraryKind::Framework;
4075-
else
4076-
kind = LibraryKind::Library;
4077-
4078-
callback(LinkLibrary(clangLinkLib.Library, kind));
4079-
}
4071+
for (auto clangLinkLib : clangModule->LinkLibraries)
4072+
callback(LinkLibrary{clangLinkLib.Library,
4073+
clangLinkLib.IsFramework ? LibraryKind::Framework
4074+
: LibraryKind::Library,
4075+
/*static=*/false});
40804076
}
40814077

40824078
StringRef ClangModuleUnit::getFilename() const {

lib/ClangImporter/ClangModuleDependencyScanner.cpp

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

274274
std::vector<LinkLibrary> LinkLibraries;
275275
for (const auto &ll : clangModuleDep.LinkLibraries)
276-
LinkLibraries.push_back(
277-
{ll.Library,
278-
ll.IsFramework ? LibraryKind::Framework : LibraryKind::Library});
276+
LinkLibraries.emplace_back(LinkLibrary{
277+
ll.Library,
278+
ll.IsFramework ? LibraryKind::Framework : LibraryKind::Library,
279+
/*static=*/false});
279280

280281
// Module-level dependencies.
281282
llvm::StringSet<> alreadyAddedModules;

lib/DependencyScan/ModuleDependencyCacheSerialization.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -324,9 +324,9 @@ bool ModuleDependenciesCacheDeserializer::readGraph(
324324

325325
case LINK_LIBRARY_NODE: {
326326
unsigned libraryIdentifierID;
327-
bool isFramework, shouldForceLoad;
327+
bool isFramework, isStatic, shouldForceLoad;
328328
LinkLibraryLayout::readRecord(Scratch, libraryIdentifierID, isFramework,
329-
shouldForceLoad);
329+
isStatic, shouldForceLoad);
330330
auto libraryIdentifier = getIdentifier(libraryIdentifierID);
331331
if (!libraryIdentifier)
332332
llvm::report_fatal_error("Bad link library identifier");
@@ -1273,13 +1273,12 @@ void ModuleDependenciesCacheSerializer::writeLinkLibraries(
12731273
unsigned ModuleDependenciesCacheSerializer::writeLinkLibraryInfos(
12741274
const ModuleDependencyInfo &dependencyInfo) {
12751275
using namespace graph_block;
1276-
for (auto &linkLibrary : dependencyInfo.getLinkLibraries()) {
1276+
for (auto &linkLibrary : dependencyInfo.getLinkLibraries())
12771277
LinkLibraryLayout::emitRecord(
12781278
Out, ScratchRecord, AbbrCodes[LinkLibraryLayout::Code],
12791279
getIdentifier(linkLibrary.getName().str()),
12801280
linkLibrary.getKind() == LibraryKind::Framework,
1281-
linkLibrary.shouldForceLoad());
1282-
}
1281+
linkLibrary.isStaticLibrary(), linkLibrary.shouldForceLoad());
12831282
return dependencyInfo.getLinkLibraries().size();
12841283
}
12851284

lib/DependencyScan/ScanDependencies.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1495,7 +1495,7 @@ static void resolveImplicitLinkLibraries(const CompilerInstance &instance,
14951495
};
14961496

14971497
if (langOpts.EnableObjCInterop)
1498-
addLinkLibrary({"objc", LibraryKind::Library});
1498+
addLinkLibrary(LinkLibrary{"objc", LibraryKind::Library, /*static=*/false});
14991499

15001500
if (langOpts.EnableCXXInterop) {
15011501
auto OptionalCxxDep = cache.findDependency(CXX_MODULE_NAME);

lib/Frontend/CompilerInvocation.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3220,7 +3220,8 @@ static bool ParseIRGenArgs(IRGenOptions &Opts, ArgList &Args,
32203220
llvm_unreachable("Unknown LinkLibrary option kind");
32213221
}
32223222

3223-
Opts.LinkLibraries.push_back(LinkLibrary(A->getValue(), Kind));
3223+
Opts.LinkLibraries.emplace_back(
3224+
LinkLibrary{A->getValue(), Kind, /*static=*/false});
32243225
}
32253226

32263227
if (auto valueNames = Args.getLastArg(OPT_disable_llvm_value_names,

lib/IRGen/IRGenModule.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1653,7 +1653,8 @@ void IRGenModule::addLinkLibraries() {
16531653
});
16541654

16551655
if (ObjCInterop)
1656-
registerLinkLibrary(LinkLibrary("objc", LibraryKind::Library));
1656+
registerLinkLibrary(
1657+
LinkLibrary{"objc", LibraryKind::Library, /*static=*/false});
16571658

16581659
// If C++ interop is enabled, add -lc++ on Darwin and -lstdc++ on linux.
16591660
// Also link with C++ bridging utility module (Cxx) and C++ stdlib overlay

lib/Immediate/Immediate.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,8 @@ static void addMergedLibraries(SmallVectorImpl<LinkLibrary> &AllLinkLibraries,
231231
}
232232

233233
for (StringRef NewLib : NewLibs)
234-
AllLinkLibraries.push_back(LinkLibrary(NewLib, LibraryKind::Library));
234+
AllLinkLibraries.emplace_back(
235+
LinkLibrary{NewLib, LibraryKind::Library, /*static=*/false});
235236
}
236237

237238
bool swift::immediate::autolinkImportedModules(ModuleDecl *M,

lib/Serialization/ModuleFile.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -989,7 +989,8 @@ ModuleFile::collectLinkLibraries(ModuleDecl::LinkLibraryCallback callback) const
989989
for (const auto &lib : Core->LinkLibraries)
990990
callback(lib);
991991
if (Core->Bits.IsFramework)
992-
callback(LinkLibrary(Core->Name, LibraryKind::Framework));
992+
callback(LinkLibrary{Core->Name, LibraryKind::Framework,
993+
static_cast<bool>(Core->Bits.IsStaticLibrary)});
993994
}
994995

995996
void ModuleFile::getTopLevelDecls(

lib/Serialization/ModuleFileSharedCore.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1589,7 +1589,9 @@ ModuleFileSharedCore::ModuleFileSharedCore(
15891589
if (Bits.IsStaticLibrary)
15901590
shouldForceLink = false;
15911591
if (auto libKind = getActualLibraryKind(rawKind))
1592-
LinkLibraries.push_back({blobData, *libKind, shouldForceLink});
1592+
LinkLibraries.emplace_back(LinkLibrary{
1593+
blobData, *libKind, static_cast<bool>(Bits.IsStaticLibrary),
1594+
shouldForceLink});
15931595
// else ignore the dependency...it'll show up as a linker error.
15941596
break;
15951597
}

lib/Serialization/SerializedModuleLoader.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -571,8 +571,9 @@ SerializedModuleLoaderBase::scanModuleFile(Twine modulePath, bool isFramework,
571571
llvm::copy(loadedModuleFile->getLinkLibraries(),
572572
std::back_inserter(linkLibraries));
573573
if (loadedModuleFile->isFramework())
574-
linkLibraries.push_back(LinkLibrary(loadedModuleFile->getName(),
575-
LibraryKind::Framework));
574+
linkLibraries.emplace_back(
575+
LinkLibrary{loadedModuleFile->getName(), LibraryKind::Framework,
576+
loadedModuleFile->isStaticLibrary()});
576577
}
577578

578579
// Attempt to resolve the module's defining .swiftinterface path

0 commit comments

Comments
 (0)