mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Merge remote-tracking branch 'origin/master' into master-rebranch
This commit is contained in:
@@ -310,9 +310,13 @@ function(_compile_swift_files
|
||||
set(module_base "${module_dir}/${SWIFTFILE_MODULE_NAME}")
|
||||
if(SWIFTFILE_SDK IN_LIST SWIFT_APPLE_PLATFORMS)
|
||||
set(specific_module_dir "${module_base}.swiftmodule")
|
||||
set(specific_module_private_dir "${specific_module_dir}/Private")
|
||||
set(source_info_file "${specific_module_private_dir}/${SWIFTFILE_ARCHITECTURE}.swiftsourceinfo")
|
||||
set(module_base "${module_base}.swiftmodule/${SWIFTFILE_ARCHITECTURE}")
|
||||
else()
|
||||
set(specific_module_dir)
|
||||
set(specific_module_private_dir)
|
||||
set(source_info_file "${module_base}.swiftsourceinfo")
|
||||
endif()
|
||||
set(module_file "${module_base}.swiftmodule")
|
||||
set(module_doc_file "${module_base}.swiftdoc")
|
||||
@@ -322,6 +326,8 @@ function(_compile_swift_files
|
||||
set(sib_file "${module_base}.Onone.sib")
|
||||
set(sibopt_file "${module_base}.O.sib")
|
||||
set(sibgen_file "${module_base}.sibgen")
|
||||
list(APPEND swift_module_flags
|
||||
"-emit-module-source-info-path" "${source_info_file}")
|
||||
|
||||
if(SWIFT_ENABLE_MODULE_INTERFACES)
|
||||
set(interface_file "${module_base}.swiftinterface")
|
||||
@@ -349,7 +355,8 @@ function(_compile_swift_files
|
||||
swift_install_in_component(DIRECTORY "${specific_module_dir}"
|
||||
DESTINATION "lib${LLVM_LIBDIR_SUFFIX}/swift/${library_subdir}"
|
||||
COMPONENT "${SWIFTFILE_INSTALL_IN_COMPONENT}"
|
||||
OPTIONAL)
|
||||
OPTIONAL
|
||||
PATTERN "Private" EXCLUDE)
|
||||
else()
|
||||
swift_install_in_component(FILES ${module_outputs}
|
||||
DESTINATION "lib${LLVM_LIBDIR_SUFFIX}/swift/${library_subdir}"
|
||||
@@ -490,6 +497,7 @@ function(_compile_swift_files
|
||||
COMMAND
|
||||
"${CMAKE_COMMAND}" "-E" "make_directory" ${module_dir}
|
||||
${specific_module_dir}
|
||||
${specific_module_private_dir}
|
||||
COMMAND
|
||||
"${PYTHON_EXECUTABLE}" "${line_directive_tool}" "@${file_path}" --
|
||||
"${swift_compiler_tool}" "-emit-module" "-o" "${module_file}"
|
||||
|
||||
@@ -124,6 +124,8 @@ ERROR(error_mode_cannot_emit_module,none,
|
||||
"this mode does not support emitting modules", ())
|
||||
ERROR(error_mode_cannot_emit_module_doc,none,
|
||||
"this mode does not support emitting module documentation files", ())
|
||||
ERROR(error_mode_cannot_emit_module_source_info,none,
|
||||
"this mode does not support emitting module source info files", ())
|
||||
ERROR(error_mode_cannot_emit_interface,none,
|
||||
"this mode does not support emitting module interface files", ())
|
||||
|
||||
|
||||
@@ -50,6 +50,7 @@ TYPE("autolink", AutolinkFile, "autolink", "")
|
||||
TYPE("swiftmodule", SwiftModuleFile, "swiftmodule", "")
|
||||
TYPE("swiftdoc", SwiftModuleDocFile, "swiftdoc", "")
|
||||
TYPE("swiftinterface", SwiftModuleInterfaceFile, "swiftinterface", "")
|
||||
TYPE("swiftsourceinfo", SwiftSourceInfoFile, "swiftsourceinfo", "")
|
||||
TYPE("assembly", Assembly, "s", "")
|
||||
TYPE("raw-sil", RawSIL, "sil", "")
|
||||
TYPE("raw-sib", RawSIB, "sib", "")
|
||||
|
||||
@@ -41,6 +41,15 @@ struct SupplementaryOutputPaths {
|
||||
/// \sa swift::serialize
|
||||
std::string ModuleOutputPath;
|
||||
|
||||
/// The path to which we should emit a module source information file.
|
||||
/// It is valid whenever there are any inputs.
|
||||
///
|
||||
/// This binary format stores source locations and other information about the
|
||||
/// declarations in a module.
|
||||
///
|
||||
/// \sa swift::serialize
|
||||
std::string ModuleSourceInfoOutputPath;
|
||||
|
||||
/// The path to which we should emit a module documentation file.
|
||||
/// It is valid whenever there are any inputs.
|
||||
///
|
||||
@@ -132,7 +141,8 @@ struct SupplementaryOutputPaths {
|
||||
ModuleDocOutputPath.empty() && DependenciesFilePath.empty() &&
|
||||
ReferenceDependenciesFilePath.empty() &&
|
||||
SerializedDiagnosticsPath.empty() && LoadedModuleTracePath.empty() &&
|
||||
TBDPath.empty() && ModuleInterfaceOutputPath.empty();
|
||||
TBDPath.empty() && ModuleInterfaceOutputPath.empty() &&
|
||||
ModuleSourceInfoOutputPath.empty();
|
||||
}
|
||||
};
|
||||
} // namespace swift
|
||||
|
||||
@@ -354,6 +354,11 @@ private:
|
||||
StringRef workingDirectory,
|
||||
CommandOutput *Output) const;
|
||||
|
||||
void chooseSwiftSourceInfoOutputPath(Compilation &C,
|
||||
const TypeToPathMap *OutputMap,
|
||||
StringRef workingDirectory,
|
||||
CommandOutput *Output) const;
|
||||
|
||||
void chooseModuleInterfacePath(Compilation &C, const JobAction *JA,
|
||||
StringRef workingDirectory,
|
||||
llvm::SmallString<128> &buffer,
|
||||
|
||||
@@ -235,6 +235,7 @@ public:
|
||||
bool hasLoadedModuleTracePath() const;
|
||||
bool hasModuleOutputPath() const;
|
||||
bool hasModuleDocOutputPath() const;
|
||||
bool hasModuleSourceInfoOutputPath() const;
|
||||
bool hasModuleInterfaceOutputPath() const;
|
||||
bool hasTBDPath() const;
|
||||
|
||||
|
||||
@@ -38,6 +38,9 @@ def emit_module_doc_path
|
||||
: Separate<["-"], "emit-module-doc-path">, MetaVarName<"<path>">,
|
||||
HelpText<"Output module documentation file <path>">;
|
||||
|
||||
def emit_module_source_info : Flag<["-"], "emit-module-source-info">,
|
||||
HelpText<"Output module source info file">;
|
||||
|
||||
def merge_modules
|
||||
: Flag<["-"], "merge-modules">, ModeOpt,
|
||||
HelpText<"Merge the input modules without otherwise processing them">;
|
||||
|
||||
@@ -364,6 +364,12 @@ def emit_module_interface_path :
|
||||
ArgumentIsPath]>,
|
||||
MetaVarName<"<path>">, HelpText<"Output module interface file to <path>">;
|
||||
|
||||
def emit_module_source_info_path :
|
||||
Separate<["-"], "emit-module-source-info-path">,
|
||||
Flags<[FrontendOption, NoInteractiveOption, DoesNotAffectIncrementalBuild,
|
||||
ArgumentIsPath]>,
|
||||
MetaVarName<"<path>">, HelpText<"Output module source info file to <path>">;
|
||||
|
||||
def emit_parseable_module_interface :
|
||||
Flag<["-"], "emit-parseable-module-interface">,
|
||||
Alias<emit_module_interface>,
|
||||
|
||||
@@ -29,6 +29,7 @@ namespace swift {
|
||||
|
||||
const char *OutputPath = nullptr;
|
||||
const char *DocOutputPath = nullptr;
|
||||
const char *SourceInfoOutputPath = nullptr;
|
||||
|
||||
StringRef GroupInfoPath;
|
||||
StringRef ImportedHeader;
|
||||
|
||||
@@ -282,6 +282,7 @@ namespace swift {
|
||||
const SerializationOptions &opts,
|
||||
std::unique_ptr<llvm::MemoryBuffer> *moduleBuffer,
|
||||
std::unique_ptr<llvm::MemoryBuffer> *moduleDocBuffer,
|
||||
std::unique_ptr<llvm::MemoryBuffer> *moduleSourceInfoBuffer,
|
||||
const SILModule *M = nullptr);
|
||||
|
||||
/// Get the CPU, subtarget feature options, and triple to use when emitting code.
|
||||
|
||||
@@ -89,6 +89,7 @@ bool file_types::isTextual(ID Id) {
|
||||
case file_types::TY_RawSIB:
|
||||
case file_types::TY_SwiftModuleFile:
|
||||
case file_types::TY_SwiftModuleDocFile:
|
||||
case file_types::TY_SwiftSourceInfoFile:
|
||||
case file_types::TY_LLVM_BC:
|
||||
case file_types::TY_SerializedDiagnostics:
|
||||
case file_types::TY_ClangModuleFile:
|
||||
@@ -128,6 +129,7 @@ bool file_types::isAfterLLVM(ID Id) {
|
||||
case file_types::TY_RawSIB:
|
||||
case file_types::TY_SwiftModuleFile:
|
||||
case file_types::TY_SwiftModuleDocFile:
|
||||
case file_types::TY_SwiftSourceInfoFile:
|
||||
case file_types::TY_SerializedDiagnostics:
|
||||
case file_types::TY_ClangModuleFile:
|
||||
case file_types::TY_SwiftDeps:
|
||||
@@ -169,6 +171,7 @@ bool file_types::isPartOfSwiftCompilation(ID Id) {
|
||||
case file_types::TY_SwiftModuleFile:
|
||||
case file_types::TY_SwiftModuleDocFile:
|
||||
case file_types::TY_SwiftModuleInterfaceFile:
|
||||
case file_types::TY_SwiftSourceInfoFile:
|
||||
case file_types::TY_SerializedDiagnostics:
|
||||
case file_types::TY_ClangModuleFile:
|
||||
case file_types::TY_SwiftDeps:
|
||||
|
||||
@@ -1782,6 +1782,7 @@ void Driver::buildActions(SmallVectorImpl<const Action *> &TopLevelActions,
|
||||
}
|
||||
case file_types::TY_SwiftModuleFile:
|
||||
case file_types::TY_SwiftModuleDocFile:
|
||||
case file_types::TY_SwiftSourceInfoFile:
|
||||
if (OI.ShouldGenerateModule && !OI.shouldLink()) {
|
||||
// When generating a .swiftmodule as a top-level output (as opposed
|
||||
// to, for example, linking an image), treat .swiftmodule files as
|
||||
@@ -2541,9 +2542,10 @@ Job *Driver::buildJobsForAction(Compilation &C, const JobAction *JA,
|
||||
chooseSwiftModuleOutputPath(C, OutputMap, workingDirectory, Output.get());
|
||||
|
||||
if (OI.ShouldGenerateModule &&
|
||||
(isa<CompileJobAction>(JA) || isa<MergeModuleJobAction>(JA)))
|
||||
chooseSwiftModuleDocOutputPath(C, OutputMap, workingDirectory,
|
||||
Output.get());
|
||||
(isa<CompileJobAction>(JA) || isa<MergeModuleJobAction>(JA))) {
|
||||
chooseSwiftModuleDocOutputPath(C, OutputMap, workingDirectory, Output.get());
|
||||
chooseSwiftSourceInfoOutputPath(C, OutputMap, workingDirectory, Output.get());
|
||||
}
|
||||
|
||||
if (C.getArgs().hasArg(options::OPT_emit_module_interface,
|
||||
options::OPT_emit_module_interface_path))
|
||||
@@ -2786,35 +2788,67 @@ void Driver::chooseSwiftModuleOutputPath(Compilation &C,
|
||||
}
|
||||
}
|
||||
|
||||
static void chooseModuleAuxiliaryOutputFilePath(Compilation &C,
|
||||
const TypeToPathMap *OutputMap,
|
||||
StringRef workingDirectory,
|
||||
CommandOutput *Output,
|
||||
file_types::ID fileID,
|
||||
bool isPrivate,
|
||||
Optional<options::ID> optId = llvm::None) {
|
||||
if (hasExistingAdditionalOutput(*Output, fileID))
|
||||
return;
|
||||
// Honor driver option for this path if it's given
|
||||
if (optId.hasValue()) {
|
||||
if (const Arg *A = C.getArgs().getLastArg(*optId)) {
|
||||
Output->setAdditionalOutputForType(fileID, StringRef(A->getValue()));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
StringRef OFMOutputPath;
|
||||
if (OutputMap) {
|
||||
auto iter = OutputMap->find(fileID);
|
||||
if (iter != OutputMap->end())
|
||||
OFMOutputPath = iter->second;
|
||||
}
|
||||
if (!OFMOutputPath.empty()) {
|
||||
// Prefer a path from the OutputMap.
|
||||
Output->setAdditionalOutputForType(fileID, OFMOutputPath);
|
||||
} else if (Output->getPrimaryOutputType() != file_types::TY_Nothing) {
|
||||
auto ModulePath = Output->getAnyOutputForType(file_types::TY_SwiftModuleFile);
|
||||
bool isTempFile = C.isTemporaryFile(ModulePath);
|
||||
auto ModuleName = llvm::sys::path::filename(ModulePath);
|
||||
llvm::SmallString<128> Path(llvm::sys::path::parent_path(ModulePath));
|
||||
if (isPrivate) {
|
||||
llvm::sys::path::append(Path, "Private");
|
||||
// If the build system has created a Private dir for us to include the file, use it.
|
||||
if (!llvm::sys::fs::exists(Path)) {
|
||||
llvm::sys::path::remove_filename(Path);
|
||||
}
|
||||
}
|
||||
llvm::sys::path::append(Path, ModuleName);
|
||||
llvm::sys::path::replace_extension(Path, file_types::getExtension(fileID));
|
||||
Output->setAdditionalOutputForType(fileID, Path);
|
||||
if (isTempFile)
|
||||
C.addTemporaryFile(Path);
|
||||
}
|
||||
}
|
||||
|
||||
void Driver::chooseSwiftSourceInfoOutputPath(Compilation &C,
|
||||
const TypeToPathMap *OutputMap,
|
||||
StringRef workingDirectory,
|
||||
CommandOutput *Output) const {
|
||||
chooseModuleAuxiliaryOutputFilePath(C, OutputMap, workingDirectory, Output,
|
||||
file_types::TY_SwiftSourceInfoFile,
|
||||
/*isPrivate*/true, options::OPT_emit_module_source_info_path);
|
||||
}
|
||||
|
||||
void Driver::chooseSwiftModuleDocOutputPath(Compilation &C,
|
||||
const TypeToPathMap *OutputMap,
|
||||
StringRef workingDirectory,
|
||||
CommandOutput *Output) const {
|
||||
|
||||
if (hasExistingAdditionalOutput(*Output, file_types::TY_SwiftModuleDocFile))
|
||||
return;
|
||||
|
||||
StringRef OFMModuleDocOutputPath;
|
||||
if (OutputMap) {
|
||||
auto iter = OutputMap->find(file_types::TY_SwiftModuleDocFile);
|
||||
if (iter != OutputMap->end())
|
||||
OFMModuleDocOutputPath = iter->second;
|
||||
}
|
||||
if (!OFMModuleDocOutputPath.empty()) {
|
||||
// Prefer a path from the OutputMap.
|
||||
Output->setAdditionalOutputForType(file_types::TY_SwiftModuleDocFile,
|
||||
OFMModuleDocOutputPath);
|
||||
} else if (Output->getPrimaryOutputType() != file_types::TY_Nothing) {
|
||||
// Otherwise, put it next to the swiftmodule file.
|
||||
llvm::SmallString<128> Path(
|
||||
Output->getAnyOutputForType(file_types::TY_SwiftModuleFile));
|
||||
bool isTempFile = C.isTemporaryFile(Path);
|
||||
llvm::sys::path::replace_extension(
|
||||
Path, file_types::getExtension(file_types::TY_SwiftModuleDocFile));
|
||||
Output->setAdditionalOutputForType(file_types::TY_SwiftModuleDocFile, Path);
|
||||
if (isTempFile)
|
||||
C.addTemporaryFile(Path);
|
||||
}
|
||||
chooseModuleAuxiliaryOutputFilePath(C, OutputMap, workingDirectory, Output,
|
||||
file_types::TY_SwiftModuleDocFile, /*isPrivate*/false);
|
||||
}
|
||||
|
||||
void Driver::chooseRemappingOutputPath(Compilation &C,
|
||||
|
||||
@@ -531,6 +531,7 @@ const char *ToolChain::JobContext::computeFrontendModeForCompile() const {
|
||||
case file_types::TY_TBD:
|
||||
case file_types::TY_OptRecord:
|
||||
case file_types::TY_SwiftModuleInterfaceFile:
|
||||
case file_types::TY_SwiftSourceInfoFile:
|
||||
llvm_unreachable("Output type can never be primary output.");
|
||||
case file_types::TY_INVALID:
|
||||
llvm_unreachable("Invalid type ID");
|
||||
@@ -639,6 +640,9 @@ void ToolChain::JobContext::addFrontendSupplementaryOutputArguments(
|
||||
addOutputsOfType(arguments, Output, Args, file_types::TY_SwiftModuleDocFile,
|
||||
"-emit-module-doc-path");
|
||||
|
||||
addOutputsOfType(arguments, Output, Args, file_types::TY_SwiftSourceInfoFile,
|
||||
"-emit-module-source-info-path");
|
||||
|
||||
addOutputsOfType(arguments, Output, Args,
|
||||
file_types::ID::TY_SwiftModuleInterfaceFile,
|
||||
"-emit-module-interface-path");
|
||||
@@ -770,6 +774,7 @@ ToolChain::constructInvocation(const BackendJobAction &job,
|
||||
case file_types::TY_ModuleTrace:
|
||||
case file_types::TY_OptRecord:
|
||||
case file_types::TY_SwiftModuleInterfaceFile:
|
||||
case file_types::TY_SwiftSourceInfoFile:
|
||||
llvm_unreachable("Output type can never be primary output.");
|
||||
case file_types::TY_INVALID:
|
||||
llvm_unreachable("Invalid type ID");
|
||||
@@ -907,6 +912,9 @@ ToolChain::constructInvocation(const MergeModuleJobAction &job,
|
||||
|
||||
addOutputsOfType(Arguments, context.Output, context.Args,
|
||||
file_types::TY_SwiftModuleDocFile, "-emit-module-doc-path");
|
||||
addOutputsOfType(Arguments, context.Output, context.Args,
|
||||
file_types::TY_SwiftSourceInfoFile,
|
||||
"-emit-module-source-info-path");
|
||||
addOutputsOfType(Arguments, context.Output, context.Args,
|
||||
file_types::ID::TY_SwiftModuleInterfaceFile,
|
||||
"-emit-module-interface-path");
|
||||
|
||||
@@ -535,6 +535,12 @@ bool ArgsToFrontendOptionsConverter::checkUnusedSupplementaryOutputPaths()
|
||||
Diags.diagnose(SourceLoc(), diag::error_mode_cannot_emit_module_doc);
|
||||
return true;
|
||||
}
|
||||
// If we cannot emit module doc, we cannot emit source information file either.
|
||||
if (!FrontendOptions::canActionEmitModuleDoc(Opts.RequestedAction) &&
|
||||
Opts.InputsAndOutputs.hasModuleSourceInfoOutputPath()) {
|
||||
Diags.diagnose(SourceLoc(), diag::error_mode_cannot_emit_module_source_info);
|
||||
return true;
|
||||
}
|
||||
if (!FrontendOptions::canActionEmitInterface(Opts.RequestedAction) &&
|
||||
Opts.InputsAndOutputs.hasModuleInterfaceOutputPath()) {
|
||||
Diags.diagnose(SourceLoc(), diag::error_mode_cannot_emit_interface);
|
||||
|
||||
@@ -296,11 +296,13 @@ SupplementaryOutputPathsComputer::getSupplementaryOutputPathsFromArguments()
|
||||
auto TBD = getSupplementaryFilenamesFromArguments(options::OPT_emit_tbd_path);
|
||||
auto moduleInterfaceOutput = getSupplementaryFilenamesFromArguments(
|
||||
options::OPT_emit_module_interface_path);
|
||||
auto moduleSourceInfoOutput = getSupplementaryFilenamesFromArguments(
|
||||
options::OPT_emit_module_source_info_path);
|
||||
|
||||
if (!objCHeaderOutput || !moduleOutput || !moduleDocOutput ||
|
||||
!dependenciesFile || !referenceDependenciesFile ||
|
||||
!serializedDiagnostics || !fixItsOutput || !loadedModuleTrace || !TBD ||
|
||||
!moduleInterfaceOutput) {
|
||||
!moduleInterfaceOutput || !moduleSourceInfoOutput) {
|
||||
return None;
|
||||
}
|
||||
std::vector<SupplementaryOutputPaths> result;
|
||||
@@ -319,7 +321,7 @@ SupplementaryOutputPathsComputer::getSupplementaryOutputPathsFromArguments()
|
||||
sop.LoadedModuleTracePath = (*loadedModuleTrace)[i];
|
||||
sop.TBDPath = (*TBD)[i];
|
||||
sop.ModuleInterfaceOutputPath = (*moduleInterfaceOutput)[i];
|
||||
|
||||
sop.ModuleSourceInfoOutputPath = (*moduleSourceInfoOutput)[i];
|
||||
result.push_back(sop);
|
||||
}
|
||||
return result;
|
||||
@@ -394,6 +396,11 @@ SupplementaryOutputPathsComputer::computeOutputPathsForOneInput(
|
||||
file_types::TY_SwiftModuleDocFile, "",
|
||||
defaultSupplementaryOutputPathExcludingExtension);
|
||||
|
||||
auto moduleSourceInfoOutputPath = determineSupplementaryOutputFilename(
|
||||
OPT_emit_module_source_info, pathsFromArguments.ModuleSourceInfoOutputPath,
|
||||
file_types::TY_SwiftSourceInfoFile, "",
|
||||
defaultSupplementaryOutputPathExcludingExtension);
|
||||
|
||||
// There is no non-path form of -emit-interface-path
|
||||
auto ModuleInterfaceOutputPath =
|
||||
pathsFromArguments.ModuleInterfaceOutputPath;
|
||||
@@ -420,6 +427,7 @@ SupplementaryOutputPathsComputer::computeOutputPathsForOneInput(
|
||||
sop.LoadedModuleTracePath = loadedModuleTracePath;
|
||||
sop.TBDPath = tbdPath;
|
||||
sop.ModuleInterfaceOutputPath = ModuleInterfaceOutputPath;
|
||||
sop.ModuleSourceInfoOutputPath = moduleSourceInfoOutputPath;
|
||||
return sop;
|
||||
}
|
||||
|
||||
@@ -489,6 +497,7 @@ createFromTypeToPathMap(const TypeToPathMap *map) {
|
||||
{file_types::TY_ObjCHeader, paths.ObjCHeaderOutputPath},
|
||||
{file_types::TY_SwiftModuleFile, paths.ModuleOutputPath},
|
||||
{file_types::TY_SwiftModuleDocFile, paths.ModuleDocOutputPath},
|
||||
{file_types::TY_SwiftSourceInfoFile, paths.ModuleSourceInfoOutputPath},
|
||||
{file_types::TY_Dependencies, paths.DependenciesFilePath},
|
||||
{file_types::TY_SwiftDeps, paths.ReferenceDependenciesFilePath},
|
||||
{file_types::TY_SerializedDiagnostics, paths.SerializedDiagnosticsPath},
|
||||
@@ -516,6 +525,7 @@ SupplementaryOutputPathsComputer::readSupplementaryOutputFileMap() const {
|
||||
options::OPT_serialize_diagnostics_path,
|
||||
options::OPT_emit_loaded_module_trace_path,
|
||||
options::OPT_emit_module_interface_path,
|
||||
options::OPT_emit_module_source_info_path,
|
||||
options::OPT_emit_tbd_path)) {
|
||||
Diags.diagnose(SourceLoc(),
|
||||
diag::error_cannot_have_supplementary_outputs,
|
||||
|
||||
@@ -129,6 +129,7 @@ SerializationOptions CompilerInvocation::computeSerializationOptions(
|
||||
SerializationOptions serializationOpts;
|
||||
serializationOpts.OutputPath = outs.ModuleOutputPath.c_str();
|
||||
serializationOpts.DocOutputPath = outs.ModuleDocOutputPath.c_str();
|
||||
serializationOpts.SourceInfoOutputPath = outs.ModuleSourceInfoOutputPath.c_str();
|
||||
serializationOpts.GroupInfoPath = opts.GroupInfoPath.c_str();
|
||||
if (opts.SerializeBridgingHeader && !outs.ModuleOutputPath.empty())
|
||||
serializationOpts.ImportedHeader = opts.ImplicitObjCHeaderPath;
|
||||
|
||||
@@ -435,6 +435,12 @@ bool FrontendInputsAndOutputs::hasModuleDocOutputPath() const {
|
||||
return outs.ModuleDocOutputPath;
|
||||
});
|
||||
}
|
||||
bool FrontendInputsAndOutputs::hasModuleSourceInfoOutputPath() const {
|
||||
return hasSupplementaryOutputPath(
|
||||
[](const SupplementaryOutputPaths &outs) -> const std::string & {
|
||||
return outs.ModuleSourceInfoOutputPath;
|
||||
});
|
||||
}
|
||||
bool FrontendInputsAndOutputs::hasModuleInterfaceOutputPath() const {
|
||||
return hasSupplementaryOutputPath(
|
||||
[](const SupplementaryOutputPaths &outs) -> const std::string & {
|
||||
|
||||
@@ -127,7 +127,8 @@ void FrontendOptions::forAllOutputPaths(
|
||||
const std::string *outputs[] = {&outs.ModuleOutputPath,
|
||||
&outs.ModuleDocOutputPath,
|
||||
&outs.ModuleInterfaceOutputPath,
|
||||
&outs.ObjCHeaderOutputPath};
|
||||
&outs.ObjCHeaderOutputPath,
|
||||
&outs.ModuleSourceInfoOutputPath};
|
||||
for (const std::string *next : outputs) {
|
||||
if (!next->empty())
|
||||
fn(*next);
|
||||
|
||||
@@ -366,7 +366,9 @@ bool ModuleInterfaceBuilder::buildSwiftModule(
|
||||
// We don't want to serialize module docs in the cache -- they
|
||||
// will be serialized beside the interface file.
|
||||
serializeToBuffers(Mod, SerializationOpts, ModuleBuffer,
|
||||
/*ModuleDocBuffer*/nullptr, SILMod.get());
|
||||
/*ModuleDocBuffer*/nullptr,
|
||||
/*SourceInfoBuffer*/nullptr,
|
||||
SILMod.get());
|
||||
});
|
||||
|
||||
LLVM_DEBUG(llvm::dbgs() << "Running SIL processing passes\n");
|
||||
|
||||
@@ -4738,6 +4738,7 @@ void swift::serializeToBuffers(
|
||||
ModuleOrSourceFile DC, const SerializationOptions &options,
|
||||
std::unique_ptr<llvm::MemoryBuffer> *moduleBuffer,
|
||||
std::unique_ptr<llvm::MemoryBuffer> *moduleDocBuffer,
|
||||
std::unique_ptr<llvm::MemoryBuffer> *moduleSourceInfoBuffer,
|
||||
const SILModule *M) {
|
||||
|
||||
assert(!StringRef::withNullAsEmpty(options.OutputPath).empty());
|
||||
@@ -4774,6 +4775,22 @@ void swift::serializeToBuffers(
|
||||
*moduleDocBuffer = llvm::make_unique<llvm::SmallVectorMemoryBuffer>(
|
||||
std::move(buf), options.DocOutputPath);
|
||||
}
|
||||
|
||||
if (!StringRef::withNullAsEmpty(options.SourceInfoOutputPath).empty()) {
|
||||
SharedTimer timer("Serialization, swiftsourceinfo, to buffer");
|
||||
llvm::SmallString<1024> buf;
|
||||
llvm::raw_svector_ostream stream(buf);
|
||||
writeSourceInfoToStream(stream, DC);
|
||||
(void)withOutputFile(getContext(DC).Diags,
|
||||
options.SourceInfoOutputPath,
|
||||
[&](raw_ostream &out) {
|
||||
out << stream.str();
|
||||
return false;
|
||||
});
|
||||
if (moduleSourceInfoBuffer)
|
||||
*moduleSourceInfoBuffer = llvm::make_unique<llvm::SmallVectorMemoryBuffer>(
|
||||
std::move(buf), options.SourceInfoOutputPath);
|
||||
}
|
||||
}
|
||||
|
||||
void swift::serialize(ModuleOrSourceFile DC,
|
||||
@@ -4807,4 +4824,14 @@ void swift::serialize(ModuleOrSourceFile DC,
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
if (!StringRef::withNullAsEmpty(options.SourceInfoOutputPath).empty()) {
|
||||
(void)withOutputFile(getContext(DC).Diags,
|
||||
options.SourceInfoOutputPath,
|
||||
[&](raw_ostream &out) {
|
||||
SharedTimer timer("Serialization, swiftsourceinfo");
|
||||
writeSourceInfoToStream(out, DC);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -486,6 +486,9 @@ public:
|
||||
/// Serialize module documentation to the given stream.
|
||||
void writeDocToStream(raw_ostream &os, ModuleOrSourceFile DC,
|
||||
StringRef GroupInfoPath);
|
||||
|
||||
/// Serialize module source info to the given stream.
|
||||
void writeSourceInfoToStream(raw_ostream &os, ModuleOrSourceFile DC);
|
||||
} // end namespace serialization
|
||||
} // end namespace swift
|
||||
#endif
|
||||
|
||||
@@ -502,3 +502,7 @@ void serialization::writeDocToStream(raw_ostream &os, ModuleOrSourceFile DC,
|
||||
|
||||
S.writeToStream(os);
|
||||
}
|
||||
|
||||
void serialization::writeSourceInfoToStream(raw_ostream &os, ModuleOrSourceFile DC) {
|
||||
os << "Some stuff";
|
||||
}
|
||||
|
||||
@@ -19,9 +19,9 @@
|
||||
// DUMPOFM-NEXT: {{.*}}/advanced_output_file_map.swift -> swiftdoc: "/build/swiftmodule/advanced_output_file_map_x.swiftdoc"
|
||||
// DUMPOFM-NEXT: {{.*}}/advanced_output_file_map.swift -> diagnostics: "/build/dia/advanced_output_file_map.dia"
|
||||
|
||||
// BINDINGS: # "x86_64-apple-macosx10.9" - "swift{{c?(\.EXE)?}}", inputs: ["{{.*}}/advanced_output_file_map.swift"], output: {object: "/build/obj/advanced_output_file_map.o", dependencies: "/build/d/advanced_output_file_map.d", swiftmodule: "/build/swiftmodule/advanced_output_file_map.swiftmodule", swiftdoc: "/build/swiftmodule/advanced_output_file_map_x.swiftdoc", diagnostics: "/build/dia/advanced_output_file_map.dia"}
|
||||
// BINDINGS: # "x86_64-apple-macosx10.9" - "swift{{c?(\.EXE)?}}", inputs: ["{{.*}}/Inputs/main.swift"], output: {object: "/build/obj/main.o", dependencies: "/build/d/main.d", swiftmodule: "/build/swiftmodule/main.swiftmodule", swiftdoc: "/build/swiftmodule/main_x.swiftdoc", diagnostics: "/build/dia/main.dia"}
|
||||
// BINDINGS: # "x86_64-apple-macosx10.9" - "swift{{c?(\.EXE)?}}", inputs: ["{{.*}}/Inputs/lib.swift"], output: {object: "/build/obj/lib.o", dependencies: "/build/d/lib.d", swiftmodule: "/build/swiftmodule/lib.swiftmodule", swiftdoc: "/build/swiftmodule/lib_x.swiftdoc", diagnostics: "/build/dia/lib.dia"}
|
||||
// BINDINGS: # "x86_64-apple-macosx10.9" - "swift{{c?(\.EXE)?}}", inputs: ["/build/obj/advanced_output_file_map.o", "/build/obj/main.o", "/build/obj/lib.o"], output: {swiftmodule: "/build/OutputFileMap.swiftmodule", swiftdoc: "/build/OutputFileMap.swiftdoc"}
|
||||
// BINDINGS: # "x86_64-apple-macosx10.9" - "swift{{c?(\.EXE)?}}", inputs: ["{{.*}}/advanced_output_file_map.swift"], output: {object: "/build/obj/advanced_output_file_map.o", dependencies: "/build/d/advanced_output_file_map.d", swiftmodule: "/build/swiftmodule/advanced_output_file_map.swiftmodule", swiftdoc: "/build/swiftmodule/advanced_output_file_map_x.swiftdoc", swiftsourceinfo: "/build/swiftmodule/advanced_output_file_map.swiftsourceinfo", diagnostics: "/build/dia/advanced_output_file_map.dia"}
|
||||
// BINDINGS: # "x86_64-apple-macosx10.9" - "swift{{c?(\.EXE)?}}", inputs: ["{{.*}}/Inputs/main.swift"], output: {object: "/build/obj/main.o", dependencies: "/build/d/main.d", swiftmodule: "/build/swiftmodule/main.swiftmodule", swiftdoc: "/build/swiftmodule/main_x.swiftdoc", swiftsourceinfo: "/build/swiftmodule/main.swiftsourceinfo", diagnostics: "/build/dia/main.dia"}
|
||||
// BINDINGS: # "x86_64-apple-macosx10.9" - "swift{{c?(\.EXE)?}}", inputs: ["{{.*}}/Inputs/lib.swift"], output: {object: "/build/obj/lib.o", dependencies: "/build/d/lib.d", swiftmodule: "/build/swiftmodule/lib.swiftmodule", swiftdoc: "/build/swiftmodule/lib_x.swiftdoc", swiftsourceinfo: "/build/swiftmodule/lib.swiftsourceinfo", diagnostics: "/build/dia/lib.dia"}
|
||||
// BINDINGS: # "x86_64-apple-macosx10.9" - "swift{{c?(\.EXE)?}}", inputs: ["/build/obj/advanced_output_file_map.o", "/build/obj/main.o", "/build/obj/lib.o"], output: {swiftmodule: "/build/OutputFileMap.swiftmodule", swiftdoc: "/build/OutputFileMap.swiftdoc", swiftsourceinfo: "/build/OutputFileMap.swiftsourceinfo"}
|
||||
// BINDINGS: # "x86_64-apple-macosx10.9" - "ld{{(.exe)?}}", inputs: ["/build/obj/advanced_output_file_map.o", "/build/obj/main.o", "/build/obj/lib.o", "/build/OutputFileMap.swiftmodule"], output: {image: "/build/advanced_output_file_map.out"}
|
||||
// BINDINGS: # "x86_64-apple-macosx10.9" - "dsymutil{{(\.exe)?}}", inputs: ["/build/advanced_output_file_map.out"], output: {dSYM: "/build/advanced_output_file_map.out.dSYM"}
|
||||
|
||||
@@ -43,6 +43,10 @@
|
||||
// CHECK-NEXT: {
|
||||
// CHECK-NEXT: "type": "swiftdoc",
|
||||
// CHECK-NEXT: "path": "{{.*[\\/]}}file-01-[[SWIFTDOC01]].swiftdoc"
|
||||
// CHECK-NEXT: },
|
||||
// CHECK-NEXT: {
|
||||
// CHECK-NEXT: "type": "swiftsourceinfo",
|
||||
// CHECK-NEXT: "path": "{{.*[\\/]}}file-01-[[MODULE01]].swiftsourceinfo"
|
||||
// CHECK-NEXT: }
|
||||
// CHECK-NEXT: ],
|
||||
// CHECK-NEXT: "pid": -{{[1-9][0-9]*}},
|
||||
@@ -88,6 +92,10 @@
|
||||
// CHECK-NEXT: {
|
||||
// CHECK-NEXT: "type": "swiftdoc",
|
||||
// CHECK-NEXT: "path": "{{.*[\\/]}}file-02-[[SWIFTDOC02]].swiftdoc"
|
||||
// CHECK-NEXT: },
|
||||
// CHECK-NEXT: {
|
||||
// CHECK-NEXT: "type": "swiftsourceinfo",
|
||||
// CHECK-NEXT: "path": "{{.*[\\/]}}file-02-[[MODULE02]].swiftsourceinfo"
|
||||
// CHECK-NEXT: }
|
||||
// CHECK-NEXT: ],
|
||||
// CHECK-NEXT: "pid": -{{[1-9][0-9]*}},
|
||||
@@ -133,6 +141,10 @@
|
||||
// CHECK-NEXT: {
|
||||
// CHECK-NEXT: "type": "swiftdoc",
|
||||
// CHECK-NEXT: "path": "{{.*[\\/]}}file-03-[[SWIFTDOC03]].swiftdoc"
|
||||
// CHECK-NEXT: },
|
||||
// CHECK-NEXT: {
|
||||
// CHECK-NEXT: "type": "swiftsourceinfo",
|
||||
// CHECK-NEXT: "path": "{{.*[\\/]}}file-03-[[MODULE03]].swiftsourceinfo"
|
||||
// CHECK-NEXT: }
|
||||
// CHECK-NEXT: ],
|
||||
// CHECK-NEXT: "pid": -{{[1-9][0-9]*}},
|
||||
@@ -178,6 +190,10 @@
|
||||
// CHECK-NEXT: {
|
||||
// CHECK-NEXT: "type": "swiftdoc",
|
||||
// CHECK-NEXT: "path": "{{.*[\\/]}}main-[[SWIFTDOCMAIN]].swiftdoc"
|
||||
// CHECK-NEXT: },
|
||||
// CHECK-NEXT: {
|
||||
// CHECK-NEXT: "type": "swiftsourceinfo",
|
||||
// CHECK-NEXT: "path": "{{.*[\\/]}}main-[[MODULEMAIN]].swiftsourceinfo"
|
||||
// CHECK-NEXT: }
|
||||
// CHECK-NEXT: ],
|
||||
// CHECK-NEXT: "pid": -{{[1-9][0-9]*}},
|
||||
@@ -233,7 +249,7 @@
|
||||
// CHECK-NEXT: {
|
||||
// CHECK-NEXT: "kind": "began",
|
||||
// CHECK-NEXT: "name": "merge-module",
|
||||
// CHECK-NEXT: "command": "{{.*[\\/]}}swift{{c?(\.EXE)?(\\")?}} -frontend -merge-modules -emit-module {{.*[\\/]}}file-01-[[MODULE01]].swiftmodule{{(\\")?}} {{.*[\\/]}}file-02-[[MODULE02]].swiftmodule{{(\\")?}} {{.*[\\/]}}file-03-[[MODULE03]].swiftmodule{{(\\")?}} {{.*[\\/]}}main-[[MODULEMAIN]].swiftmodule{{(\\")?}} {{.*}} -emit-module-doc-path main.swiftdoc -module-name main -o main.swiftmodule",
|
||||
// CHECK-NEXT: "command": "{{.*[\\/]}}swift{{c?(\.EXE)?(\\")?}} -frontend -merge-modules -emit-module {{.*[\\/]}}file-01-[[MODULE01]].swiftmodule{{(\\")?}} {{.*[\\/]}}file-02-[[MODULE02]].swiftmodule{{(\\")?}} {{.*[\\/]}}file-03-[[MODULE03]].swiftmodule{{(\\")?}} {{.*[\\/]}}main-[[MODULEMAIN]].swiftmodule{{(\\")?}} {{.*}} -emit-module-doc-path main.swiftdoc -emit-module-source-info-path main.swiftsourceinfo -module-name main -o main.swiftmodule",
|
||||
// CHECK-NEXT: "command_executable": "{{.*[\\/]}}swift{{c?(\.EXE)?}}",
|
||||
// CHECK-NEXT: "command_arguments": [
|
||||
// CHECK-NEXT: "-frontend",
|
||||
@@ -245,6 +261,8 @@
|
||||
// CHECK-NEXT: "{{.*[\\/]}}main-[[MODULEMAIN]].swiftmodule",
|
||||
// CHECK: "-emit-module-doc-path",
|
||||
// CHECK-NEXT: "main.swiftdoc",
|
||||
// CHECK: "-emit-module-source-info-path",
|
||||
// CHECK-NEXT: "main.swiftsourceinfo",
|
||||
// CHECK-NEXT: "-module-name",
|
||||
// CHECK-NEXT: "main",
|
||||
// CHECK-NEXT: "-o",
|
||||
@@ -264,6 +282,10 @@
|
||||
// CHECK-NEXT: {
|
||||
// CHECK-NEXT: "type": "swiftdoc",
|
||||
// CHECK-NEXT: "path": "main.swiftdoc"
|
||||
// CHECK-NEXT: },
|
||||
// CHECK-NEXT: {
|
||||
// CHECK-NEXT: "type": "swiftsourceinfo",
|
||||
// CHECK-NEXT: "path": "main.swiftsourceinfo"
|
||||
// CHECK-NEXT: }
|
||||
// CHECK-NEXT: ],
|
||||
// CHECK-NEXT: "pid": {{[1-9][0-9]*}},
|
||||
|
||||
@@ -8,14 +8,17 @@
|
||||
// CHECK: Handled a.swift
|
||||
// CHECK-NEXT: Supplementary swiftdoc: "./a.swiftdoc"
|
||||
// CHECK-NEXT: Supplementary swiftmodule: "./a.swiftmodule"
|
||||
// CHECK-NEXT: Supplementary swiftsourceinfo: "./a.swiftsourceinfo"
|
||||
// CHECK-NEXT: Supplementary "./a.swift":
|
||||
// CHECK-NEXT: Handled b.swift
|
||||
// CHECK-NEXT: Supplementary swiftdoc: "./b.swiftdoc"
|
||||
// CHECK-NEXT: Supplementary swiftmodule: "./b.swiftmodule"
|
||||
// CHECK-NEXT: Supplementary swiftsourceinfo: "./b.swiftsourceinfo"
|
||||
// CHECK-NEXT: Supplementary "./b.swift":
|
||||
// CHECK-NEXT: Handled c.swift
|
||||
// CHECK-NEXT: Supplementary swiftdoc: "./c.swiftdoc"
|
||||
// CHECK-NEXT: Supplementary swiftmodule: "./c.swiftmodule"
|
||||
// CHECK-NEXT: Supplementary swiftsourceinfo: "./c.swiftsourceinfo"
|
||||
// CHECK-NEXT: Supplementary "./c.swift":
|
||||
// CHECK-NEXT: Handled modules
|
||||
// CHECK-NOT: Handled
|
||||
|
||||
@@ -37,6 +37,10 @@
|
||||
// CHECK-NEXT: "path": "{{.*[\\/]}}parseable_output-[[OUTPUT]].swiftdoc"
|
||||
// CHECK-NEXT: },
|
||||
// CHECK-NEXT: {
|
||||
// CHECK-NEXT: "type": "swiftsourceinfo",
|
||||
// CHECK-NEXT: "path": "{{.*[\\/]}}parseable_output-[[OUTPUT]].swiftsourceinfo"
|
||||
// CHECK-NEXT: },
|
||||
// CHECK-NEXT: {
|
||||
// CHECK-NEXT: "type": "diagnostics",
|
||||
// CHECK-NEXT: "path": "{{.*[\\/]}}parseable_output-[[OUTPUT]].dia"
|
||||
// CHECK-NEXT: }
|
||||
@@ -86,6 +90,10 @@
|
||||
// CHECK-NEXT: "path": "{{.*[\\/]}}parseable_output.swift.tmp.swiftdoc"
|
||||
// CHECK-NEXT: },
|
||||
// CHECK-NEXT: {
|
||||
// CHECK-NEXT: "type": "swiftsourceinfo",
|
||||
// CHECK-NEXT: "path": "{{.*[\\/]}}parseable_output.swift.tmp.swiftsourceinfo"
|
||||
// CHECK-NEXT: },
|
||||
// CHECK-NEXT: {
|
||||
// CHECK-NEXT: "type": "objc-header",
|
||||
// CHECK-NEXT: "path": "{{.*[\\/]}}parseable_output.swift.tmp.h"
|
||||
// CHECK-NEXT: }
|
||||
|
||||
@@ -39,6 +39,10 @@
|
||||
// CHECK-NEXT: "path": "{{.*[\\/]}}你好-[[OUTPUT]].swiftdoc"
|
||||
// CHECK-NEXT: },
|
||||
// CHECK-NEXT: {
|
||||
// CHECK-NEXT: "type": "swiftsourceinfo",
|
||||
// CHECK-NEXT: "path": "{{.*[\\/]}}你好-[[OUTPUT]].swiftsourceinfo"
|
||||
// CHECK-NEXT: },
|
||||
// CHECK-NEXT: {
|
||||
// CHECK-NEXT: "type": "diagnostics",
|
||||
// CHECK-NEXT: "path": "{{.*[\\/]}}你好-[[OUTPUT]].dia"
|
||||
// CHECK-NEXT: }
|
||||
@@ -88,6 +92,10 @@
|
||||
// CHECK-NEXT: "path": "{{.*[\\/]}}parseable_output_unicode.swift.tmp.swiftdoc"
|
||||
// CHECK-NEXT: },
|
||||
// CHECK-NEXT: {
|
||||
// CHECK-NEXT: "type": "swiftsourceinfo",
|
||||
// CHECK-NEXT: "path": "{{.*[\\/]}}parseable_output_unicode.swift.tmp.swiftsourceinfo"
|
||||
// CHECK-NEXT: },
|
||||
// CHECK-NEXT: {
|
||||
// CHECK-NEXT: "type": "objc-header",
|
||||
// CHECK-NEXT: "path": "{{.*[\\/]}}parseable_output_unicode.swift.tmp.h"
|
||||
// CHECK-NEXT: }
|
||||
|
||||
16
test/Driver/sourceinfo_file.swift
Normal file
16
test/Driver/sourceinfo_file.swift
Normal file
@@ -0,0 +1,16 @@
|
||||
// RUN: %empty-directory(%t)
|
||||
// RUN: mkdir -p %t/build/Private
|
||||
// RUN: %swiftc_driver -driver-print-jobs -emit-module %s -emit-module-path %t/build/sourceinfo_file.swiftmodule -module-name sourceinfo_file | %FileCheck %s -check-prefix CHECK-PRIVATE
|
||||
|
||||
// CHECK-PRIVATE: build/Private/sourceinfo_file.swiftsourceinfo
|
||||
|
||||
// RUN: %empty-directory(%t/build)
|
||||
// RUN: %swiftc_driver -driver-print-jobs -emit-module %s -emit-module-path %t/build/sourceinfo_file.swiftmodule -module-name sourceinfo_file | %FileCheck %s -check-prefix CHECK-NOPRIVATE
|
||||
|
||||
// CHECK-NOPRIVATE-NOT: Private/sourceinfo_file.swiftsourceinfo
|
||||
// CHECK-NOPRIVATE: build/sourceinfo_file.swiftsourceinfo
|
||||
|
||||
// RUN: %empty-directory(%t/build)
|
||||
// RUN: %swiftc_driver -driver-print-jobs -emit-module %s -emit-module-path %t/build/sourceinfo_file.swiftmodule -module-name sourceinfo_file -emit-module-source-info-path %t/build/DriverPath.swiftsourceinfo | %FileCheck %s -check-prefix CHECK-DRIVER-OPT
|
||||
|
||||
// CHECK-DRIVER-OPT: build/DriverPath.swiftsourceinfo
|
||||
Reference in New Issue
Block a user