diff --git a/lib/Serialization/Serialization.cpp b/lib/Serialization/Serialization.cpp index 5ac366860ad17..e1b149205a6d6 100644 --- a/lib/Serialization/Serialization.cpp +++ b/lib/Serialization/Serialization.cpp @@ -1199,10 +1199,12 @@ void Serializer::writeHeader() { const auto &PathRemapper = Options.DebuggingOptionsPrefixMap; const auto &PathObfuscator = Options.PathObfuscator; + auto remapPath = [&PathRemapper, &PathObfuscator](StringRef Path) { + return PathObfuscator.obfuscate(PathRemapper.remapPath(Path)); + }; + auto sdkPath = M->getASTContext().SearchPathOpts.getSDKPath(); - SDKPath.emit( - ScratchRecord, - PathObfuscator.obfuscate(PathRemapper.remapPath(sdkPath))); + SDKPath.emit(ScratchRecord, remapPath(sdkPath)); auto &Opts = Options.ExtraClangOptions; for (auto Arg = Opts.begin(), E = Opts.end(); Arg != E; ++Arg) { StringRef arg(*Arg); @@ -1246,7 +1248,7 @@ void Serializer::writeHeader() { auto &opt = elem.get(); PluginSearchOpt.emit(ScratchRecord, uint8_t(PluginSearchOptionKind::PluginPath), - opt.SearchPath); + remapPath(opt.SearchPath)); continue; } case PluginSearchOption::Kind::ExternalPluginPath: { @@ -1254,7 +1256,7 @@ void Serializer::writeHeader() { PluginSearchOpt.emit( ScratchRecord, uint8_t(PluginSearchOptionKind::ExternalPluginPath), - opt.SearchPath + "#" + opt.ServerPath); + remapPath(opt.SearchPath) + "#" + remapPath(opt.ServerPath)); continue; } case PluginSearchOption::Kind::LoadPluginLibrary: { @@ -1262,12 +1264,12 @@ void Serializer::writeHeader() { PluginSearchOpt.emit( ScratchRecord, uint8_t(PluginSearchOptionKind::LoadPluginLibrary), - opt.LibraryPath); + remapPath(opt.LibraryPath)); continue; } case PluginSearchOption::Kind::LoadPluginExecutable: { auto &opt = elem.get(); - std::string optStr = opt.ExecutablePath + "#"; + std::string optStr = remapPath(opt.ExecutablePath) + "#"; llvm::interleave( opt.ModuleNames, [&](auto &name) { optStr += name; }, [&]() { optStr += ","; }); @@ -1278,8 +1280,8 @@ void Serializer::writeHeader() { } case PluginSearchOption::Kind::ResolvedPluginConfig: { auto &opt = elem.get(); - std::string optStr = - opt.LibraryPath + "#" + opt.ExecutablePath + "#"; + std::string optStr = remapPath(opt.LibraryPath) + "#" + + remapPath(opt.ExecutablePath) + "#"; llvm::interleave( opt.ModuleNames, [&](auto &name) { optStr += name; }, [&]() { optStr += ","; }); diff --git a/test/Serialization/plugin_search_option_prefixing.swift b/test/Serialization/plugin_search_option_prefixing.swift new file mode 100644 index 0000000000000..11df53ab13e2f --- /dev/null +++ b/test/Serialization/plugin_search_option_prefixing.swift @@ -0,0 +1,63 @@ +// REQUIRES: swift_swift_parser + +/// Test loading dependencies that has macros. +// RUN: %empty-directory(%t) +// RUN: split-file %s %t + +/// Build macros. +// RUN: %host-build-swift -swift-version 5 -emit-library -o %t/%target-library-name(MacroOne) -module-name=MacroOne %t/macro-1.swift +// RUN: %host-build-swift -swift-version 5 -emit-library -o %t/%target-library-name(MacroTwo) -module-name=MacroTwo %t/macro-2.swift + +// RUN: %target-swift-frontend -emit-module %t/test.swift -module-name Test -o %t/Test.swiftmodule \ +// RUN: -swift-version 5 -external-plugin-path %t#%swift-plugin-server -package-name Test \ +// RUN: -plugin-path %swift-plugin-dir -prefix-serialized-debugging-options \ +// RUN: -load-plugin-library %t/%target-library-name(MacroOne) \ +// RUN: -debug-prefix-map %t=/externalsearchpath \ +// RUN: -debug-prefix-map %swift-plugin-server=/externalserverpath \ +// RUN: -debug-prefix-map %swift-plugin-dir=/plugindir +// RUN: llvm-bcanalyzer -dump %t/Test.swiftmodule | %FileCheck %s + +// CHECK: blob data = '/externalsearchpath#/externalserverpath' +// CHECK: blob data = '/plugindir' +// CHECK: blob data = '/externalsearchpath/{{(lib)?}}MacroOne + +//--- macro-1.swift +import SwiftSyntax +@_spi(ExperimentalLanguageFeature) import SwiftSyntaxMacros + +public struct AssertMacro: ExpressionMacro { + public static func expansion( + of macro: some FreestandingMacroExpansionSyntax, + in context: some MacroExpansionContext + ) -> ExprSyntax { + guard let argument = macro.arguments.first?.expression else { + fatalError("boom") + } + + return "assert(\(argument))" + } +} + +//--- macro-2.swift +import SwiftSyntax +@_spi(ExperimentalLanguageFeature) import SwiftSyntaxMacros + +public struct StringifyMacro: ExpressionMacro { + public static func expansion( + of macro: some FreestandingMacroExpansionSyntax, + in context: some MacroExpansionContext + ) -> ExprSyntax { + guard let argument = macro.arguments.first?.expression else { + fatalError("boom") + } + + return "(\(argument), \(StringLiteralExprSyntax(content: argument.description)))" + } +} + +//--- test.swift +import Swift +@freestanding(expression) public macro assert(_: Bool) = #externalMacro(module: "MacroOne", type: "AssertMacro") +@freestanding(expression) public macro assert_2(_: Bool) = #externalMacro(module: "MacroOne", type: "AssertMacro") +@freestanding(expression) public macro stringify(_ value: T) -> (T, String) = #externalMacro(module: "MacroTwo", type: "StringifyMacro") +@freestanding(expression) public macro stringify_2(_ value: T) -> (T, String) = #externalMacro(module: "MacroTwo", type: "StringifyMacro")