36
36
#include " llvm/CAS/CachingOnDiskFileSystem.h"
37
37
#include " llvm/Support/Error.h"
38
38
#include " llvm/Support/MemoryBuffer.h"
39
+ #include " llvm/Support/MemoryBufferRef.h"
39
40
#include " llvm/Support/Path.h"
40
41
#include " llvm/Support/Threading.h"
41
42
#include " llvm/Support/VersionTuple.h"
@@ -1063,6 +1064,42 @@ void ModuleDependencyScanner::resolveHeaderDependenciesForModule(
1063
1064
if (!isTextualModuleWithABridgingHeader && !isBinaryModuleWithHeaderInput)
1064
1065
return ;
1065
1066
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
+
1066
1103
withDependencyScanningWorker (
1067
1104
[&](ModuleDependencyScanningWorker *ScanningWorker) {
1068
1105
auto clangImporter = static_cast <ClangImporter *>(
@@ -1072,12 +1109,9 @@ void ModuleDependencyScanner::resolveHeaderDependenciesForModule(
1072
1109
std::optional<std::string> includeTreeID;
1073
1110
std::vector<std::string> bridgingHeaderCommandLine;
1074
1111
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,
1081
1115
bridgingHeaderCommandLine, includeTreeID);
1082
1116
if (!headerScan) {
1083
1117
// Record direct header Clang dependencies
0 commit comments