4040#include " swift/Basic/Defer.h"
4141#include " swift/Basic/Dwarf.h"
4242#include " swift/Basic/FileSystem.h"
43+ #include " swift/Basic/PathRemapper.h"
4344#include " swift/Basic/STLExtras.h"
4445#include " swift/Basic/Version.h"
4546#include " swift/ClangImporter/ClangImporter.h"
4849#include " swift/Demangling/ManglingMacros.h"
4950#include " swift/Serialization/SerializationOptions.h"
5051#include " swift/Strings.h"
51- #include " clang/AST/DeclTemplate.h"
52- #include " swift/SymbolGraphGen/SymbolGraphOptions.h"
5352#include " swift/SymbolGraphGen/SymbolGraphGen.h"
53+ #include " swift/SymbolGraphGen/SymbolGraphOptions.h"
54+ #include " clang/AST/DeclTemplate.h"
5455#include " llvm/ADT/SmallSet.h"
5556#include " llvm/ADT/SmallString.h"
5657#include " llvm/ADT/StringExtras.h"
@@ -511,7 +512,7 @@ static uint8_t getRawOpaqueReadOwnership(swift::OpaqueReadOwnership ownership) {
511512 CASE (OwnedOrBorrowed)
512513#undef CASE
513514 }
514- llvm_unreachable (" bad kind" );
515+ llvm_unreachable (" bad kind" );
515516}
516517
517518static uint8_t getRawReadImplKind (swift::ReadImplKind kind) {
@@ -1062,25 +1063,35 @@ void Serializer::writeHeader(const SerializationOptions &options) {
10621063 options_block::SDKPathLayout SDKPath (Out);
10631064 options_block::XCCLayout XCC (Out);
10641065
1065- SDKPath.emit (ScratchRecord, M->getASTContext ().SearchPathOpts .SDKPath );
1066+ const auto &PathRemapper = options.DebuggingOptionsPrefixMap ;
1067+ SDKPath.emit (
1068+ ScratchRecord,
1069+ PathRemapper.remapPath (M->getASTContext ().SearchPathOpts .SDKPath ));
10661070 auto &Opts = options.ExtraClangOptions ;
1067- for (auto Arg = Opts.begin (), E = Opts.end (); Arg != E; ++Arg) {
1068- // FIXME: This is a hack and calls for a better design.
1069- //
1070- // Filter out any -ivfsoverlay options that include an
1071- // unextended-module-overlay.yaml overlay. By convention the Xcode
1072- // buildsystem uses these while *building* mixed Objective-C and Swift
1073- // frameworks; but they should never be used to *import* the module
1074- // defined in the framework.
1075- if (StringRef (*Arg).startswith (" -ivfsoverlay" )) {
1071+ for (auto Arg = Opts.begin (), E = Opts.end (); Arg != E; ++Arg) {
1072+ StringRef arg (*Arg);
1073+ if (arg.startswith (" -ivfsoverlay" )) {
1074+ // FIXME: This is a hack and calls for a better design.
1075+ //
1076+ // Filter out any -ivfsoverlay options that include an
1077+ // unextended-module-overlay.yaml overlay. By convention the Xcode
1078+ // buildsystem uses these while *building* mixed Objective-C and
1079+ // Swift frameworks; but they should never be used to *import* the
1080+ // module defined in the framework.
10761081 auto Next = std::next (Arg);
10771082 if (Next != E &&
10781083 StringRef (*Next).endswith (" unextended-module-overlay.yaml" )) {
10791084 ++Arg;
10801085 continue ;
10811086 }
1087+ } else if (arg.startswith (" -fdebug-prefix-map=" )) {
1088+ // We don't serialize the debug prefix map flags as these
1089+ // contain absoute paths that are not usable on different
1090+ // machines. These flags are not necessary to compile the
1091+ // clang modules again so are safe to remove.
1092+ continue ;
10821093 }
1083- XCC.emit (ScratchRecord, *Arg );
1094+ XCC.emit (ScratchRecord, arg );
10841095 }
10851096 }
10861097 }
@@ -1131,14 +1142,16 @@ void Serializer::writeInputBlock(const SerializationOptions &options) {
11311142 input_block::ModuleInterfaceLayout ModuleInterface (Out);
11321143
11331144 if (options.SerializeOptionsForDebugging ) {
1145+ const auto &PathMapper = options.DebuggingOptionsPrefixMap ;
11341146 const SearchPathOptions &searchPathOpts = M->getASTContext ().SearchPathOpts ;
11351147 // Put the framework search paths first so that they'll be preferred upon
11361148 // deserialization.
11371149 for (auto &framepath : searchPathOpts.FrameworkSearchPaths )
11381150 SearchPath.emit (ScratchRecord, /* framework=*/ true , framepath.IsSystem ,
1139- framepath.Path );
1151+ PathMapper. remapPath ( framepath.Path ) );
11401152 for (auto &path : searchPathOpts.ImportSearchPaths )
1141- SearchPath.emit (ScratchRecord, /* framework=*/ false , /* system=*/ false , path);
1153+ SearchPath.emit (ScratchRecord, /* framework=*/ false , /* system=*/ false ,
1154+ PathMapper.remapPath (path));
11421155 }
11431156
11441157 // Note: We're not using StringMap here because we don't need to own the
@@ -1472,7 +1485,7 @@ void Serializer::writeASTBlockEntity(const SILLayout *layout) {
14721485 typeRef |= 0x80000000U ;
14731486 data.push_back (typeRef);
14741487 }
1475-
1488+
14761489 unsigned abbrCode
14771490 = DeclTypeAbbrCodes[SILLayoutLayout::Code];
14781491
@@ -1707,7 +1720,7 @@ static bool shouldSerializeMember(Decl *D) {
17071720
17081721 case DeclKind::OpaqueType:
17091722 return true ;
1710-
1723+
17111724 case DeclKind::EnumElement:
17121725 case DeclKind::Protocol:
17131726 case DeclKind::Constructor:
@@ -1805,14 +1818,14 @@ void Serializer::writeCrossReference(const DeclContext *DC, uint32_t pathLen) {
18051818 if (auto opaque = dyn_cast<OpaqueTypeDecl>(generic)) {
18061819 if (!opaque->hasName ()) {
18071820 abbrCode = DeclTypeAbbrCodes[XRefOpaqueReturnTypePathPieceLayout::Code];
1808-
1821+
18091822 XRefOpaqueReturnTypePathPieceLayout::emitRecord (Out, ScratchRecord,
18101823 abbrCode,
18111824 addDeclBaseNameRef (opaque->getOpaqueReturnTypeIdentifier ()));
18121825 break ;
18131826 }
18141827 }
1815-
1828+
18161829 assert (generic->hasName ());
18171830
18181831 abbrCode = DeclTypeAbbrCodes[XRefTypePathPieceLayout::Code];
@@ -1853,7 +1866,7 @@ void Serializer::writeCrossReference(const DeclContext *DC, uint32_t pathLen) {
18531866 case DeclContextKind::SubscriptDecl: {
18541867 auto SD = cast<SubscriptDecl>(DC);
18551868 writeCrossReference (DC->getParent (), pathLen + 1 );
1856-
1869+
18571870 Type ty = SD->getInterfaceType ()->getCanonicalType ();
18581871
18591872 abbrCode = DeclTypeAbbrCodes[XRefValuePathPieceLayout::Code];
@@ -1864,7 +1877,7 @@ void Serializer::writeCrossReference(const DeclContext *DC, uint32_t pathLen) {
18641877 SD->isStatic ());
18651878 break ;
18661879 }
1867-
1880+
18681881 case DeclContextKind::AbstractFunctionDecl: {
18691882 if (auto fn = dyn_cast<AccessorDecl>(DC)) {
18701883 auto storage = fn->getStorage ();
@@ -1976,7 +1989,7 @@ void Serializer::writeCrossReference(const Decl *D) {
19761989 addDeclBaseNameRef (opaque->getOpaqueReturnTypeIdentifier ()));
19771990 return ;
19781991 }
1979-
1992+
19801993 if (auto genericParam = dyn_cast<GenericTypeParamDecl>(D)) {
19811994 assert (!D->getDeclContext ()->isModuleScopeContext () &&
19821995 " Cannot cross reference a generic type decl at module scope." );
@@ -4677,7 +4690,7 @@ class ClangToSwiftBasicWriter :
46774690
46784691 Serializer &S;
46794692 SmallVectorImpl<uint64_t > &Record;
4680- using TypeWriter =
4693+ using TypeWriter =
46814694 clang::serialization::AbstractTypeWriter<ClangToSwiftBasicWriter>;
46824695 TypeWriter Types;
46834696
@@ -5481,7 +5494,7 @@ void Serializer::writeAST(ModuleOrSourceFile DC) {
54815494 /* isLocal=*/ true );
54825495 }
54835496 }
5484-
5497+
54855498 for (auto OTD : opaqueReturnTypeDecls) {
54865499 // FIXME: We should delay parsing function bodies so these type decls
54875500 // don't even get added to the file.
0 commit comments