Hack in a -module-link-name option for autolinking.

In Swift, a module is expected to know which libraries it needs, rather than
having this specified by an external module map. While we haven't quite
designed this yet (frameworks get this for free in Clang, for example),
we can at least provide a simple option for the common case of a module
associated with a single library.

This will probably change in the future, so I left in the more general
deserialization code I was working on before simplifying the use case.
A loaded module can in theory specify any arbitrary frameworks or libraries
as dependencies, not just a single dylib.

Swift SVN r7583
This commit is contained in:
Jordan Rose
2013-08-26 18:57:48 +00:00
parent 22912bc3b3
commit ee2ed392c7
7 changed files with 91 additions and 12 deletions

View File

@@ -15,6 +15,7 @@
#include "swift/AST/AST.h"
#include "swift/AST/Diagnostics.h"
#include "swift/AST/KnownProtocols.h"
#include "swift/AST/LinkLibrary.h"
#include "swift/Basic/STLExtras.h"
#include "swift/Basic/SourceManager.h"
#include "swift/Serialization/BCRecordLayout.h"
@@ -239,7 +240,8 @@ namespace {
/// Writes the dependencies used to build this module: its imported
/// modules and its source files.
void writeInputFiles(const TranslationUnit *TU, FileBufferIDs inputFiles);
void writeInputFiles(const TranslationUnit *TU, FileBufferIDs inputFiles,
StringRef moduleLinkName);
/// Writes the given pattern, recursively.
void writePattern(const Pattern *pattern);
@@ -335,7 +337,7 @@ namespace {
/// Serialize a translation unit to the given stream.
void writeToStream(raw_ostream &os, const TranslationUnit *TU,
FileBufferIDs inputFiles);
FileBufferIDs inputFiles, StringRef moduleLinkName);
};
} // end anonymous namespace
@@ -499,6 +501,7 @@ void Serializer::writeBlockInfoBlock() {
BLOCK(INPUT_BLOCK);
RECORD(input_block, SOURCE_FILE);
RECORD(input_block, IMPORTED_MODULE);
RECORD(input_block, LINK_LIBRARY);
BLOCK(DECLS_AND_TYPES_BLOCK);
RECORD(decls_block, NAME_ALIAS_TYPE);
@@ -621,10 +624,12 @@ void flattenImportPath(const Module::ImportedModule &import,
}
void Serializer::writeInputFiles(const TranslationUnit *TU,
FileBufferIDs inputFiles) {
FileBufferIDs inputFiles,
StringRef moduleLinkName) {
BCBlockRAII restoreBlock(Out, INPUT_BLOCK_ID, 3);
input_block::SourceFileLayout SourceFile(Out);
input_block::ImportedModuleLayout ImportedModule(Out);
input_block::LinkLibraryLayout LinkLibrary(Out);
auto &sourceMgr = TU->Ctx.SourceMgr;
for (auto bufferID : inputFiles) {
@@ -648,6 +653,11 @@ void Serializer::writeInputFiles(const TranslationUnit *TU,
flattenImportPath(import.first, importPath);
ImportedModule.emit(ScratchRecord, import.second, importPath);
}
if (!moduleLinkName.empty()) {
LinkLibrary.emit(ScratchRecord, serialization::LibraryKind::Library,
moduleLinkName);
}
}
/// Translate AST default argument kind to the Serialization enum values, which
@@ -2095,13 +2105,14 @@ void Serializer::writeTranslationUnit(const TranslationUnit *TU) {
}
void Serializer::writeToStream(raw_ostream &os, const TranslationUnit *TU,
FileBufferIDs inputFiles) {
FileBufferIDs inputFiles,
StringRef moduleLinkName) {
// Write the signature through the BitstreamWriter for alignment purposes.
for (unsigned char byte : SIGNATURE)
Out.Emit(byte, 8);
writeHeader();
writeInputFiles(TU, inputFiles);
writeInputFiles(TU, inputFiles, moduleLinkName);
writeTranslationUnit(TU);
if (ShouldFallBackToTranslationUnit)
@@ -2113,7 +2124,7 @@ void Serializer::writeToStream(raw_ostream &os, const TranslationUnit *TU,
}
void swift::serialize(const TranslationUnit *TU, const char *outputPath,
FileBufferIDs inputFiles) {
FileBufferIDs inputFiles, StringRef moduleLinkName) {
std::string errorInfo;
llvm::raw_fd_ostream out(outputPath, errorInfo,
llvm::sys::fs::F_Binary);
@@ -2125,11 +2136,12 @@ void swift::serialize(const TranslationUnit *TU, const char *outputPath,
return;
}
serializeToStream(TU, out, inputFiles);
serializeToStream(TU, out, inputFiles, moduleLinkName);
}
void swift::serializeToStream(const TranslationUnit *TU, raw_ostream &out,
FileBufferIDs inputFiles) {
FileBufferIDs inputFiles,
StringRef moduleLinkName) {
Serializer S;
S.writeToStream(out, TU, inputFiles);
S.writeToStream(out, TU, inputFiles, moduleLinkName);
}