3636#include " llvm/CAS/CachingOnDiskFileSystem.h"
3737#include " llvm/Support/Error.h"
3838#include " llvm/Support/MemoryBuffer.h"
39+ #include " llvm/Support/MemoryBufferRef.h"
3940#include " llvm/Support/Path.h"
4041#include " llvm/Support/Threading.h"
4142#include " llvm/Support/VersionTuple.h"
@@ -1063,6 +1064,42 @@ void ModuleDependencyScanner::resolveHeaderDependenciesForModule(
10631064 if (!isTextualModuleWithABridgingHeader && !isBinaryModuleWithHeaderInput)
10641065 return ;
10651066
1067+
1068+ std::optional<std::string> headerPath;
1069+ std::unique_ptr<llvm::MemoryBuffer> sourceBuffer;
1070+ std::optional<llvm::MemoryBufferRef> sourceBufferRef;
1071+
1072+ auto extractHeaderContent =
1073+ [&](const SwiftBinaryModuleDependencyStorage &binaryMod)
1074+ -> std::unique_ptr<llvm::MemoryBuffer> {
1075+ auto header = binaryMod.headerImport ;
1076+ // Check to see if the header input exists on disk.
1077+ auto FS = ScanASTContext.SourceMgr .getFileSystem ();
1078+ if (FS->exists (header))
1079+ return nullptr ;
1080+
1081+ auto moduleBuf = FS->getBufferForFile (binaryMod.compiledModulePath );
1082+ if (!moduleBuf)
1083+ return nullptr ;
1084+
1085+ auto content = extractEmbeddedBridgingHeaderContent (std::move (*moduleBuf),
1086+ ScanASTContext);
1087+ if (content.empty ())
1088+ return nullptr ;
1089+
1090+ return llvm::MemoryBuffer::getMemBufferCopy (content, header);
1091+ };
1092+
1093+ if (isBinaryModuleWithHeaderInput) {
1094+ auto &binaryMod = *moduleDependencyInfo.getAsSwiftBinaryModule ();
1095+ if (auto embeddedHeader = extractHeaderContent (binaryMod)) {
1096+ sourceBuffer = std::move (embeddedHeader);
1097+ sourceBufferRef = sourceBuffer->getMemBufferRef ();
1098+ } else
1099+ headerPath = binaryMod.headerImport ;
1100+ } else
1101+ headerPath = *moduleDependencyInfo.getBridgingHeader ();
1102+
10661103 withDependencyScanningWorker (
10671104 [&](ModuleDependencyScanningWorker *ScanningWorker) {
10681105 auto clangImporter = static_cast <ClangImporter *>(
@@ -1072,12 +1109,9 @@ void ModuleDependencyScanner::resolveHeaderDependenciesForModule(
10721109 std::optional<std::string> includeTreeID;
10731110 std::vector<std::string> bridgingHeaderCommandLine;
10741111 auto headerScan = clangImporter->getHeaderDependencies (
1075- moduleID,
1076- isTextualModuleWithABridgingHeader
1077- ? *moduleDependencyInfo.getBridgingHeader ()
1078- : moduleDependencyInfo.getAsSwiftBinaryModule ()->headerImport ,
1079- /* sourceBuffer=*/ std::nullopt , ScanningWorker->clangScanningTool ,
1080- cache, headerClangModuleDependencies, headerFileInputs,
1112+ moduleID, headerPath, sourceBufferRef,
1113+ ScanningWorker->clangScanningTool , cache,
1114+ headerClangModuleDependencies, headerFileInputs,
10811115 bridgingHeaderCommandLine, includeTreeID);
10821116 if (!headerScan) {
10831117 // Record direct header Clang dependencies
0 commit comments