@@ -414,17 +414,16 @@ GetWindowsAuxiliaryFile(StringRef modulemap, const SearchPathOptions &Options) {
414
414
return " " ;
415
415
}
416
416
417
- SmallVector<std::pair<std::string, std::string>, 2 > GetWindowsFileMappings (
418
- ASTContext &Context,
417
+ void GetWindowsFileMappings (
418
+ ClangInvocationFileMapping &fileMapping, ASTContext &Context,
419
419
const llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> &driverVFS,
420
420
bool &requiresBuiltinHeadersInSystemModules) {
421
421
const llvm::Triple &Triple = Context.LangOpts .Target ;
422
422
const SearchPathOptions &SearchPathOpts = Context.SearchPathOpts ;
423
- SmallVector<std::pair<std::string, std::string>, 2 > Mappings;
424
423
std::string AuxiliaryFile;
425
424
426
425
if (!Triple.isWindowsMSVCEnvironment ())
427
- return Mappings ;
426
+ return ;
428
427
429
428
clang::driver::Driver Driver = createClangDriver (Context, driverVFS);
430
429
const llvm::opt::InputArgList Args = createClangArgs (Context, Driver);
@@ -450,7 +449,8 @@ SmallVector<std::pair<std::string, std::string>, 2> GetWindowsFileMappings(
450
449
451
450
AuxiliaryFile = GetWindowsAuxiliaryFile (" winsdk.modulemap" , SearchPathOpts);
452
451
if (!AuxiliaryFile.empty ())
453
- Mappings.emplace_back (std::string (WinSDKInjection), AuxiliaryFile);
452
+ fileMapping.redirectedFiles .emplace_back (std::string (WinSDKInjection),
453
+ AuxiliaryFile);
454
454
}
455
455
456
456
struct {
@@ -477,7 +477,8 @@ SmallVector<std::pair<std::string, std::string>, 2> GetWindowsFileMappings(
477
477
// cycle goes away. Note that -fbuiltin-headers-in-system-modules does
478
478
// nothing to fix the same problem with C++ headers, and is generally
479
479
// fragile.
480
- Mappings.emplace_back (std::string (UCRTInjection), AuxiliaryFile);
480
+ fileMapping.redirectedFiles .emplace_back (std::string (UCRTInjection),
481
+ AuxiliaryFile);
481
482
requiresBuiltinHeadersInSystemModules = true ;
482
483
}
483
484
}
@@ -503,17 +504,27 @@ SmallVector<std::pair<std::string, std::string>, 2> GetWindowsFileMappings(
503
504
AuxiliaryFile =
504
505
GetWindowsAuxiliaryFile (" vcruntime.modulemap" , SearchPathOpts);
505
506
if (!AuxiliaryFile.empty ())
506
- Mappings.emplace_back (std::string (VCToolsInjection), AuxiliaryFile);
507
+ fileMapping.redirectedFiles .emplace_back (std::string (VCToolsInjection),
508
+ AuxiliaryFile);
507
509
508
510
llvm::sys::path::remove_filename (VCToolsInjection);
509
511
llvm::sys::path::append (VCToolsInjection, " vcruntime.apinotes" );
510
512
AuxiliaryFile =
511
513
GetWindowsAuxiliaryFile (" vcruntime.apinotes" , SearchPathOpts);
512
514
if (!AuxiliaryFile.empty ())
513
- Mappings. emplace_back (std::string (VCToolsInjection), AuxiliaryFile);
514
- }
515
+ fileMapping. redirectedFiles . emplace_back (std::string (VCToolsInjection),
516
+ AuxiliaryFile);
515
517
516
- return Mappings;
518
+ // __msvc_bit_utils.hpp was added in a recent VS 2022 version. It has to be
519
+ // referenced from the modulemap directly to avoid modularization errors.
520
+ // Older VS versions might not have it. Let's inject an empty header file if
521
+ // it isn't available.
522
+ llvm::sys::path::remove_filename (VCToolsInjection);
523
+ llvm::sys::path::append (VCToolsInjection, " __msvc_bit_utils.hpp" );
524
+ if (!llvm::sys::fs::exists (VCToolsInjection))
525
+ fileMapping.overridenFiles .emplace_back (std::string (VCToolsInjection),
526
+ " " );
527
+ }
517
528
}
518
529
} // namespace
519
530
@@ -573,8 +584,7 @@ ClangInvocationFileMapping swift::getClangInvocationFileMapping(
573
584
if (ctx.LangOpts .EnableCXXInterop )
574
585
getLibStdCxxFileMapping (result, ctx, vfs);
575
586
576
- result.redirectedFiles .append (GetWindowsFileMappings (
577
- ctx, vfs, result.requiresBuiltinHeadersInSystemModules ));
578
-
587
+ GetWindowsFileMappings (result, ctx, vfs,
588
+ result.requiresBuiltinHeadersInSystemModules );
579
589
return result;
580
590
}
0 commit comments