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) {
@@ -1058,25 +1059,35 @@ void Serializer::writeHeader(const SerializationOptions &options) {
10581059 options_block::SDKPathLayout SDKPath (Out);
10591060 options_block::XCCLayout XCC (Out);
10601061
1061- SDKPath.emit (ScratchRecord, M->getASTContext ().SearchPathOpts .SDKPath );
1062+ const auto &PathRemapper = options.DebuggingOptionsPrefixMap ;
1063+ SDKPath.emit (
1064+ ScratchRecord,
1065+ PathRemapper.remapPath (M->getASTContext ().SearchPathOpts .SDKPath ));
10621066 auto &Opts = options.ExtraClangOptions ;
1063- for (auto Arg = Opts.begin (), E = Opts.end (); Arg != E; ++Arg) {
1064- // FIXME: This is a hack and calls for a better design.
1065- //
1066- // Filter out any -ivfsoverlay options that include an
1067- // unextended-module-overlay.yaml overlay. By convention the Xcode
1068- // buildsystem uses these while *building* mixed Objective-C and Swift
1069- // frameworks; but they should never be used to *import* the module
1070- // defined in the framework.
1071- if (StringRef (*Arg).startswith (" -ivfsoverlay" )) {
1067+ for (auto Arg = Opts.begin (), E = Opts.end (); Arg != E; ++Arg) {
1068+ StringRef arg (*Arg);
1069+ if (arg.startswith (" -ivfsoverlay" )) {
1070+ // FIXME: This is a hack and calls for a better design.
1071+ //
1072+ // Filter out any -ivfsoverlay options that include an
1073+ // unextended-module-overlay.yaml overlay. By convention the Xcode
1074+ // buildsystem uses these while *building* mixed Objective-C and
1075+ // Swift frameworks; but they should never be used to *import* the
1076+ // module defined in the framework.
10721077 auto Next = std::next (Arg);
10731078 if (Next != E &&
10741079 StringRef (*Next).endswith (" unextended-module-overlay.yaml" )) {
10751080 ++Arg;
10761081 continue ;
10771082 }
1083+ } else if (arg.startswith (" -fdebug-prefix-map=" )) {
1084+ // We don't serialize the debug prefix map flags as these
1085+ // contain absoute paths that are not usable on different
1086+ // machines. These flags are not necessary to compile the
1087+ // clang modules again so are safe to remove.
1088+ continue ;
10781089 }
1079- XCC.emit (ScratchRecord, *Arg );
1090+ XCC.emit (ScratchRecord, arg );
10801091 }
10811092 }
10821093 }
@@ -1127,14 +1138,16 @@ void Serializer::writeInputBlock(const SerializationOptions &options) {
11271138 input_block::ModuleInterfaceLayout ModuleInterface (Out);
11281139
11291140 if (options.SerializeOptionsForDebugging ) {
1141+ const auto &PathMapper = options.DebuggingOptionsPrefixMap ;
11301142 const SearchPathOptions &searchPathOpts = M->getASTContext ().SearchPathOpts ;
11311143 // Put the framework search paths first so that they'll be preferred upon
11321144 // deserialization.
11331145 for (auto &framepath : searchPathOpts.FrameworkSearchPaths )
11341146 SearchPath.emit (ScratchRecord, /* framework=*/ true , framepath.IsSystem ,
1135- framepath.Path );
1147+ PathMapper. remapPath ( framepath.Path ) );
11361148 for (auto &path : searchPathOpts.ImportSearchPaths )
1137- SearchPath.emit (ScratchRecord, /* framework=*/ false , /* system=*/ false , path);
1149+ SearchPath.emit (ScratchRecord, /* framework=*/ false , /* system=*/ false ,
1150+ PathMapper.remapPath (path));
11381151 }
11391152
11401153 // Note: We're not using StringMap here because we don't need to own the
@@ -1468,7 +1481,7 @@ void Serializer::writeASTBlockEntity(const SILLayout *layout) {
14681481 typeRef |= 0x80000000U ;
14691482 data.push_back (typeRef);
14701483 }
1471-
1484+
14721485 unsigned abbrCode
14731486 = DeclTypeAbbrCodes[SILLayoutLayout::Code];
14741487
@@ -1703,7 +1716,7 @@ static bool shouldSerializeMember(Decl *D) {
17031716
17041717 case DeclKind::OpaqueType:
17051718 return true ;
1706-
1719+
17071720 case DeclKind::EnumElement:
17081721 case DeclKind::Protocol:
17091722 case DeclKind::Constructor:
@@ -1801,14 +1814,14 @@ void Serializer::writeCrossReference(const DeclContext *DC, uint32_t pathLen) {
18011814 if (auto opaque = dyn_cast<OpaqueTypeDecl>(generic)) {
18021815 if (!opaque->hasName ()) {
18031816 abbrCode = DeclTypeAbbrCodes[XRefOpaqueReturnTypePathPieceLayout::Code];
1804-
1817+
18051818 XRefOpaqueReturnTypePathPieceLayout::emitRecord (Out, ScratchRecord,
18061819 abbrCode,
18071820 addDeclBaseNameRef (opaque->getOpaqueReturnTypeIdentifier ()));
18081821 break ;
18091822 }
18101823 }
1811-
1824+
18121825 assert (generic->hasName ());
18131826
18141827 abbrCode = DeclTypeAbbrCodes[XRefTypePathPieceLayout::Code];
@@ -1849,7 +1862,7 @@ void Serializer::writeCrossReference(const DeclContext *DC, uint32_t pathLen) {
18491862 case DeclContextKind::SubscriptDecl: {
18501863 auto SD = cast<SubscriptDecl>(DC);
18511864 writeCrossReference (DC->getParent (), pathLen + 1 );
1852-
1865+
18531866 Type ty = SD->getInterfaceType ()->getCanonicalType ();
18541867
18551868 abbrCode = DeclTypeAbbrCodes[XRefValuePathPieceLayout::Code];
@@ -1860,7 +1873,7 @@ void Serializer::writeCrossReference(const DeclContext *DC, uint32_t pathLen) {
18601873 SD->isStatic ());
18611874 break ;
18621875 }
1863-
1876+
18641877 case DeclContextKind::AbstractFunctionDecl: {
18651878 if (auto fn = dyn_cast<AccessorDecl>(DC)) {
18661879 auto storage = fn->getStorage ();
@@ -1972,7 +1985,7 @@ void Serializer::writeCrossReference(const Decl *D) {
19721985 addDeclBaseNameRef (opaque->getOpaqueReturnTypeIdentifier ()));
19731986 return ;
19741987 }
1975-
1988+
19761989 if (auto genericParam = dyn_cast<GenericTypeParamDecl>(D)) {
19771990 assert (!D->getDeclContext ()->isModuleScopeContext () &&
19781991 " Cannot cross reference a generic type decl at module scope." );
@@ -4673,7 +4686,7 @@ class ClangToSwiftBasicWriter :
46734686
46744687 Serializer &S;
46754688 SmallVectorImpl<uint64_t > &Record;
4676- using TypeWriter =
4689+ using TypeWriter =
46774690 clang::serialization::AbstractTypeWriter<ClangToSwiftBasicWriter>;
46784691 TypeWriter Types;
46794692
@@ -5477,7 +5490,7 @@ void Serializer::writeAST(ModuleOrSourceFile DC) {
54775490 /* isLocal=*/ true );
54785491 }
54795492 }
5480-
5493+
54815494 for (auto OTD : opaqueReturnTypeDecls) {
54825495 // FIXME: We should delay parsing function bodies so these type decls
54835496 // don't even get added to the file.
0 commit comments