Merge remote-tracking branch 'origin/main' into rebranch

This commit is contained in:
swift-ci
2025-05-29 18:36:55 -07:00
7 changed files with 80 additions and 55 deletions

View File

@@ -1097,13 +1097,8 @@ public:
return SwiftDependencyTracker(CAS, Mapper.get(), CI); return SwiftDependencyTracker(CAS, Mapper.get(), CI);
} }
llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> getClangScanningFS() const { llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>
if (CAS) getClangScanningFS(ASTContext &ctx) const;
return llvm::cas::createCASProvidingFileSystem(
CAS, llvm::vfs::createPhysicalFileSystem());
return llvm::vfs::createPhysicalFileSystem();
}
bool hasPathMapping() const { bool hasPathMapping() const {
return Mapper && !Mapper->getMappings().empty(); return Mapper && !Mapper->getMappings().empty();

View File

@@ -873,10 +873,19 @@ struct ClangInvocationFileMapping {
/// `suppressDiagnostic` prevents us from emitting warning messages when we /// `suppressDiagnostic` prevents us from emitting warning messages when we
/// are unable to find headers. /// are unable to find headers.
ClangInvocationFileMapping getClangInvocationFileMapping( ClangInvocationFileMapping getClangInvocationFileMapping(
ASTContext &ctx, const ASTContext &ctx,
llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> vfs = nullptr, llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> vfs = nullptr,
bool suppressDiagnostic = false); bool suppressDiagnostic = false);
/// Apply the given file mapping to the specified 'fileSystem', used
/// primarily to inject modulemaps on platforms with non-modularized
/// platform libraries.
ClangInvocationFileMapping applyClangInvocationMapping(
const ASTContext &ctx,
llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> baseVFS,
llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> &fileSystem,
bool suppressDiagnostics = false);
/// Information used to compute the access level of inherited C++ members. /// Information used to compute the access level of inherited C++ members.
class ClangInheritanceInfo { class ClangInheritanceInfo {
/// The cumulative inheritance access specifier, that is used to compute the /// The cumulative inheritance access specifier, that is used to compute the

View File

@@ -499,6 +499,18 @@ SwiftDependencyScanningService::SwiftDependencyScanningService() {
SharedFilesystemCache.emplace(); SharedFilesystemCache.emplace();
} }
llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>
SwiftDependencyScanningService::getClangScanningFS(ASTContext &ctx) const {
llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> baseFileSystem =
llvm::vfs::createPhysicalFileSystem();
ClangInvocationFileMapping fileMapping =
applyClangInvocationMapping(ctx, nullptr, baseFileSystem, false);
if (CAS)
return llvm::cas::createCASProvidingFileSystem(CAS, baseFileSystem);
return baseFileSystem;
}
bool bool
swift::dependencies::checkImportNotTautological(const ImportPath::Module modulePath, swift::dependencies::checkImportNotTautological(const ImportPath::Module modulePath,
const SourceLoc importLoc, const SourceLoc importLoc,

View File

@@ -1300,49 +1300,11 @@ ClangImporter::create(ASTContext &ctx,
ctx.SourceMgr.getFileSystem(); ctx.SourceMgr.getFileSystem();
ClangInvocationFileMapping fileMapping = ClangInvocationFileMapping fileMapping =
getClangInvocationFileMapping(ctx, nullptr, ignoreFileMapping); applyClangInvocationMapping(ctx, nullptr, VFS, ignoreFileMapping);
importer->requiresBuiltinHeadersInSystemModules = importer->requiresBuiltinHeadersInSystemModules =
fileMapping.requiresBuiltinHeadersInSystemModules; fileMapping.requiresBuiltinHeadersInSystemModules;
// Avoid creating indirect file system when using include tree.
if (!ctx.CASOpts.HasImmutableFileSystem) {
// Wrap Swift's FS to allow Clang to override the working directory
VFS = llvm::vfs::RedirectingFileSystem::create(
fileMapping.redirectedFiles, true, *ctx.SourceMgr.getFileSystem());
if (importerOpts.DumpClangDiagnostics) {
llvm::errs() << "clang importer redirected file mappings:\n";
for (const auto &mapping : fileMapping.redirectedFiles) {
llvm::errs() << " mapping real file '" << mapping.second
<< "' to virtual file '" << mapping.first << "'\n";
}
llvm::errs() << "\n";
}
if (!fileMapping.overridenFiles.empty()) {
llvm::IntrusiveRefCntPtr<llvm::vfs::InMemoryFileSystem> overridenVFS =
new llvm::vfs::InMemoryFileSystem();
for (const auto &file : fileMapping.overridenFiles) {
if (importerOpts.DumpClangDiagnostics) {
llvm::errs() << "clang importer overriding file '" << file.first
<< "' with the following contents:\n";
llvm::errs() << file.second << "\n";
}
auto contents = ctx.Allocate<char>(file.second.size() + 1);
std::copy(file.second.begin(), file.second.end(), contents.begin());
// null terminate the buffer.
contents[contents.size() - 1] = '\0';
overridenVFS->addFile(file.first, 0,
llvm::MemoryBuffer::getMemBuffer(StringRef(
contents.begin(), contents.size() - 1)));
}
llvm::IntrusiveRefCntPtr<llvm::vfs::OverlayFileSystem> overlayVFS =
new llvm::vfs::OverlayFileSystem(VFS);
VFS = overlayVFS;
overlayVFS->pushOverlay(overridenVFS);
}
}
// Create a new Clang compiler invocation. // Create a new Clang compiler invocation.
{ {
if (auto ClangArgs = importer->getClangCC1Arguments(ctx, VFS)) if (auto ClangArgs = importer->getClangCC1Arguments(ctx, VFS))

View File

@@ -200,7 +200,7 @@ ClangImporter::createClangArgs(const ClangImporterOptions &ClangImporterOpts,
} }
static SmallVector<std::pair<std::string, std::string>, 2> static SmallVector<std::pair<std::string, std::string>, 2>
getLibcFileMapping(ASTContext &ctx, StringRef modulemapFileName, getLibcFileMapping(const ASTContext &ctx, StringRef modulemapFileName,
std::optional<ArrayRef<StringRef>> maybeHeaderFileNames, std::optional<ArrayRef<StringRef>> maybeHeaderFileNames,
const llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> &vfs, const llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> &vfs,
bool suppressDiagnostic) { bool suppressDiagnostic) {
@@ -266,7 +266,7 @@ getLibcFileMapping(ASTContext &ctx, StringRef modulemapFileName,
} }
static void getLibStdCxxFileMapping( static void getLibStdCxxFileMapping(
ClangInvocationFileMapping &fileMapping, ASTContext &ctx, ClangInvocationFileMapping &fileMapping, const ASTContext &ctx,
const llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> &vfs, const llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> &vfs,
bool suppressDiagnostic) { bool suppressDiagnostic) {
assert(ctx.LangOpts.EnableCXXInterop && assert(ctx.LangOpts.EnableCXXInterop &&
@@ -457,7 +457,7 @@ GetPlatformAuxiliaryFile(StringRef Platform, StringRef File,
} }
void GetWindowsFileMappings( void GetWindowsFileMappings(
ClangInvocationFileMapping &fileMapping, ASTContext &Context, ClangInvocationFileMapping &fileMapping, const ASTContext &Context,
const llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> &driverVFS, const llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> &driverVFS,
bool &requiresBuiltinHeadersInSystemModules) { bool &requiresBuiltinHeadersInSystemModules) {
const llvm::Triple &Triple = Context.LangOpts.Target; const llvm::Triple &Triple = Context.LangOpts.Target;
@@ -588,7 +588,7 @@ void GetWindowsFileMappings(
} // namespace } // namespace
ClangInvocationFileMapping swift::getClangInvocationFileMapping( ClangInvocationFileMapping swift::getClangInvocationFileMapping(
ASTContext &ctx, llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> vfs, const ASTContext &ctx, llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> vfs,
bool suppressDiagnostic) { bool suppressDiagnostic) {
ClangInvocationFileMapping result; ClangInvocationFileMapping result;
if (!vfs) if (!vfs)
@@ -658,3 +658,52 @@ ClangInvocationFileMapping swift::getClangInvocationFileMapping(
result.requiresBuiltinHeadersInSystemModules); result.requiresBuiltinHeadersInSystemModules);
return result; return result;
} }
ClangInvocationFileMapping swift::applyClangInvocationMapping(const ASTContext &ctx,
llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> baseVFS,
llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> &fileSystem,
bool suppressDiagnostics) {
if (ctx.CASOpts.HasImmutableFileSystem)
return ClangInvocationFileMapping();
ClangInvocationFileMapping fileMapping =
getClangInvocationFileMapping(ctx, baseVFS, suppressDiagnostics);
auto importerOpts = ctx.ClangImporterOpts;
// Wrap Swift's FS to allow Clang to override the working directory
fileSystem = llvm::vfs::RedirectingFileSystem::create(
fileMapping.redirectedFiles, true, *fileSystem);
if (importerOpts.DumpClangDiagnostics) {
llvm::errs() << "clang importer redirected file mappings:\n";
for (const auto &mapping : fileMapping.redirectedFiles) {
llvm::errs() << " mapping real file '" << mapping.second
<< "' to virtual file '" << mapping.first << "'\n";
}
llvm::errs() << "\n";
}
if (!fileMapping.overridenFiles.empty()) {
llvm::IntrusiveRefCntPtr<llvm::vfs::InMemoryFileSystem> overridenVFS =
new llvm::vfs::InMemoryFileSystem();
for (const auto &file : fileMapping.overridenFiles) {
if (importerOpts.DumpClangDiagnostics) {
llvm::errs() << "clang importer overriding file '" << file.first
<< "' with the following contents:\n";
llvm::errs() << file.second << "\n";
}
auto contents = ctx.Allocate<char>(file.second.size() + 1);
std::copy(file.second.begin(), file.second.end(), contents.begin());
// null terminate the buffer.
contents[contents.size() - 1] = '\0';
overridenVFS->addFile(file.first, 0,
llvm::MemoryBuffer::getMemBuffer(StringRef(
contents.begin(), contents.size() - 1)));
}
llvm::IntrusiveRefCntPtr<llvm::vfs::OverlayFileSystem> overlayVFS =
new llvm::vfs::OverlayFileSystem(fileSystem);
fileSystem = overlayVFS;
overlayVFS->pushOverlay(overridenVFS);
}
return fileMapping;
}

View File

@@ -31,6 +31,7 @@
#include "swift/Frontend/ModuleInterfaceLoader.h" #include "swift/Frontend/ModuleInterfaceLoader.h"
#include "swift/Serialization/SerializedModuleLoader.h" #include "swift/Serialization/SerializedModuleLoader.h"
#include "swift/Subsystems.h" #include "swift/Subsystems.h"
#include "clang/Frontend/CompilerInstance.h"
#include "llvm/ADT/IntrusiveRefCntPtr.h" #include "llvm/ADT/IntrusiveRefCntPtr.h"
#include "llvm/ADT/SetOperations.h" #include "llvm/ADT/SetOperations.h"
#include "llvm/CAS/CachingOnDiskFileSystem.h" #include "llvm/CAS/CachingOnDiskFileSystem.h"
@@ -267,7 +268,7 @@ ModuleDependencyScanningWorker::ModuleDependencyScanningWorker(
const SILOptions &SILOptions, ASTContext &ScanASTContext, const SILOptions &SILOptions, ASTContext &ScanASTContext,
swift::DependencyTracker &DependencyTracker, DiagnosticEngine &Diagnostics) swift::DependencyTracker &DependencyTracker, DiagnosticEngine &Diagnostics)
: clangScanningTool(*globalScanningService.ClangScanningService, : clangScanningTool(*globalScanningService.ClangScanningService,
globalScanningService.getClangScanningFS()) { globalScanningService.getClangScanningFS(ScanASTContext)) {
// Create a scanner-specific Invocation and ASTContext. // Create a scanner-specific Invocation and ASTContext.
workerCompilerInvocation = workerCompilerInvocation =
std::make_unique<CompilerInvocation>(ScanCompilerInvocation); std::make_unique<CompilerInvocation>(ScanCompilerInvocation);

View File

@@ -3,9 +3,6 @@
// RUN: %target-swift-frontend -scan-dependencies -o %t/deps.json %s -cxx-interoperability-mode=default -disable-implicit-string-processing-module-import -disable-implicit-concurrency-module-import // RUN: %target-swift-frontend -scan-dependencies -o %t/deps.json %s -cxx-interoperability-mode=default -disable-implicit-string-processing-module-import -disable-implicit-concurrency-module-import
// RUN: %validate-json %t/deps.json | %FileCheck %s // RUN: %validate-json %t/deps.json | %FileCheck %s
// rdar://151780437: libstdc++ VFS modulemap redirects not functioning with EBM enabled
// REQUIRES: OS=macosx
import CxxStdlib import CxxStdlib
// CHECK: "mainModuleName": "deps" // CHECK: "mainModuleName": "deps"