Skip to content

Commit 4d78674

Browse files
committed
AST,DependencyScan,IRGen,Serialization,Tooling: 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 e689ad3 commit 4d78674

19 files changed

+107
-81
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/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 = 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
@@ -4070,15 +4070,11 @@ void ClangModuleUnit::collectLinkLibraries(
40704070
if (clangModule->UseExportAsModuleLinkName)
40714071
return;
40724072

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

40844080
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: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -324,17 +324,18 @@ 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");
333333

334-
LinkLibraries.push_back(LinkLibrary(libraryIdentifier.value(),
335-
isFramework ? LibraryKind::Framework
336-
: LibraryKind::Library,
337-
shouldForceLoad));
334+
LinkLibraries.emplace_back(
335+
LinkLibrary{libraryIdentifier.value(),
336+
isFramework ? LibraryKind::Framework
337+
: LibraryKind::Library,
338+
isStatic, shouldForceLoad));
338339
break;
339340
}
340341

@@ -1273,13 +1274,12 @@ void ModuleDependenciesCacheSerializer::writeLinkLibraries(
12731274
unsigned ModuleDependenciesCacheSerializer::writeLinkLibraryInfos(
12741275
const ModuleDependencyInfo &dependencyInfo) {
12751276
using namespace graph_block;
1276-
for (auto &linkLibrary : dependencyInfo.getLinkLibraries()) {
1277+
for (auto &linkLibrary : dependencyInfo.getLinkLibraries())
12771278
LinkLibraryLayout::emitRecord(
12781279
Out, ScratchRecord, AbbrCodes[LinkLibraryLayout::Code],
12791280
getIdentifier(linkLibrary.getName().str()),
12801281
linkLibrary.getKind() == LibraryKind::Framework,
1281-
linkLibrary.shouldForceLoad());
1282-
}
1282+
linkLibrary.isStaticLibrary(), linkLibrary.shouldForceLoad());
12831283
return dependencyInfo.getLinkLibraries().size();
12841284
}
12851285

lib/DependencyScan/ScanDependencies.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -894,10 +894,10 @@ generateFullDependencyGraph(const CompilerInstance &instance,
894894
linkLibrarySet->count = linkLibraries.size();
895895
linkLibrarySet->link_libraries =
896896
new swiftscan_link_library_info_t[linkLibrarySet->count];
897-
for (size_t i = 0; i < linkLibraries.size(); ++i) {
898-
const auto &ll = linkLibraries[i];
897+
for (const LinkLibrary &ll : linkLibraries) {
899898
swiftscan_link_library_info_s *llInfo = new swiftscan_link_library_info_s;
900899
llInfo->name = create_clone(ll.getName().str().c_str());
900+
llInfo->isStatic = ll.isStaticLibrary();
901901
llInfo->isFramework = ll.getKind() == LibraryKind::Framework;
902902
llInfo->forceLoad = ll.shouldForceLoad();
903903
linkLibrarySet->link_libraries[i] = llInfo;
@@ -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: 4 additions & 2 deletions
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,
@@ -3450,7 +3451,8 @@ static bool ParseIRGenArgs(IRGenOptions &Opts, ArgList &Args,
34503451
}
34513452

34523453
for (const auto &Lib : Args.getAllArgValues(options::OPT_autolink_library))
3453-
Opts.LinkLibraries.push_back(LinkLibrary(Lib, LibraryKind::Library));
3454+
Opts.LinkLibraries.emplace_back(
3455+
LinkLibrary{Lib, LibraryKind::Library, /*static=*/false});
34543456

34553457
for (const auto &Lib : Args.getAllArgValues(options::OPT_public_autolink_library)) {
34563458
Opts.PublicLinkLibraries.push_back(Lib);

lib/IRGen/IRGenModule.cpp

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

15501550
llvm::SmallString<32> getTargetDependentLibraryOption(const llvm::Triple &T,
1551-
StringRef library) {
1551+
LinkLibrary library) {
15521552
llvm::SmallString<32> buffer;
1553+
StringRef name = library.getName();
15531554

15541555
if (T.isWindowsMSVCEnvironment() || T.isWindowsItaniumEnvironment()) {
1555-
bool quote = library.contains(' ');
1556+
bool quote = name.contains(' ');
15561557

15571558
buffer += "/DEFAULTLIB:";
15581559
if (quote)
15591560
buffer += '"';
1560-
buffer += library;
1561-
if (!library.ends_with_insensitive(".lib"))
1561+
if (library.isStaticLibrary() && !name.starts_with_insensitive("lib"))
1562+
buffer += "lib";
1563+
buffer += name;
1564+
if (!name.ends_with_insensitive(".lib"))
15621565
buffer += ".lib";
15631566
if (quote)
15641567
buffer += '"';
15651568
} else if (T.isPS4()) {
1566-
bool quote = library.contains(' ');
1569+
bool quote = name.contains(' ');
15671570

15681571
buffer += "\01";
15691572
if (quote)
15701573
buffer += '"';
1571-
buffer += library;
1574+
buffer += name;
15721575
if (quote)
15731576
buffer += '"';
15741577
} else {
15751578
buffer += "-l";
1576-
buffer += library;
1579+
buffer += name;
15771580
}
15781581

15791582
return buffer;
@@ -1653,7 +1656,8 @@ void IRGenModule::addLinkLibraries() {
16531656
});
16541657

16551658
if (ObjCInterop)
1656-
registerLinkLibrary(LinkLibrary("objc", LibraryKind::Library));
1659+
registerLinkLibrary(
1660+
LinkLibrary{"objc", LibraryKind::Library, /*static=*/false});
16571661

16581662
// If C++ interop is enabled, add -lc++ on Darwin and -lstdc++ on linux.
16591663
// Also link with C++ bridging utility module (Cxx) and C++ stdlib overlay
@@ -1784,7 +1788,7 @@ void AutolinkKind::collectEntriesFromLibraries(
17841788
switch (linkLib.getKind()) {
17851789
case LibraryKind::Library: {
17861790
llvm::SmallString<32> opt =
1787-
getTargetDependentLibraryOption(IGM.Triple, linkLib.getName());
1791+
getTargetDependentLibraryOption(IGM.Triple, linkLib);
17881792
Entries.insert(llvm::MDNode::get(ctx, llvm::MDString::get(ctx, opt)));
17891793
continue;
17901794
}
@@ -1805,7 +1809,7 @@ void AutolinkKind::collectEntriesFromLibraries(
18051809
switch (linkLib.getKind()) {
18061810
case LibraryKind::Library: {
18071811
llvm::SmallString<32> opt =
1808-
getTargetDependentLibraryOption(IGM.Triple, linkLib.getName());
1812+
getTargetDependentLibraryOption(IGM.Triple, linkLib);
18091813
Entries.insert(llvm::MDNode::get(ctx, llvm::MDString::get(ctx, opt)));
18101814
continue;
18111815
}

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
@@ -620,8 +620,9 @@ SerializedModuleLoaderBase::scanModuleFile(Twine modulePath, bool isFramework,
620620
llvm::copy(loadedModuleFile->getLinkLibraries(),
621621
std::back_inserter(linkLibraries));
622622
if (loadedModuleFile->isFramework())
623-
linkLibraries.push_back(LinkLibrary(loadedModuleFile->getName(),
624-
LibraryKind::Framework));
623+
linkLibraries.emplace_back(
624+
LinkLibrary{loadedModuleFile->getName(), LibraryKind::Framework,
625+
loadedModuleFile->isStaticLibrary()});
625626
}
626627

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

0 commit comments

Comments
 (0)