1*52c62d46SVolodymyr Sapsai// Test the module map path is consistent between clang invocations when using VFS overlays. 2*52c62d46SVolodymyr Sapsai 3*52c62d46SVolodymyr Sapsai// RUN: rm -rf %t 4*52c62d46SVolodymyr Sapsai// RUN: split-file %s %t 5*52c62d46SVolodymyr Sapsai 6*52c62d46SVolodymyr Sapsai// Pre-populate the module cache with the modules that don't use VFS overlays. 7*52c62d46SVolodymyr Sapsai// RUN: %clang_cc1 -fsyntax-only -F%t/Frameworks -I%t/include %t/prepopulate_module_cache.m \ 8*52c62d46SVolodymyr Sapsai// RUN: -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/modules.cache 9*52c62d46SVolodymyr Sapsai 10*52c62d46SVolodymyr Sapsai// Execute a compilation with VFS overlay. .pcm file path looks like <hash1>/ModuleName-<hash2>.pcm. 11*52c62d46SVolodymyr Sapsai// <hash1> corresponds to the compilation settings like language options. 12*52c62d46SVolodymyr Sapsai// <hash2> corresponds to the module map path. So if any of those change, we should use a different module. 13*52c62d46SVolodymyr Sapsai// But for VFS overlay we make an exception that it's not a part of <hash1> to reduce the number of built .pcm files. 14*52c62d46SVolodymyr Sapsai// Test that paths in overlays don't leak into <hash2> and don't cause using 2 .pcm files for the same module. 15*52c62d46SVolodymyr Sapsai// DEFINE: %{command} = %clang_cc1 -fsyntax-only -verify -F%t/Frameworks -I%t/include %t/test.m \ 16*52c62d46SVolodymyr Sapsai// DEFINE: -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/modules.cache 17*52c62d46SVolodymyr Sapsai// RUN: sed -e "s@TMP_DIR@%{/t:regex_replacement}@g" -e "s@USE_EXTERNAL_NAMES_OPTION@@g" %t/overlay.yaml.template > %t/external-names-default.yaml 18*52c62d46SVolodymyr Sapsai// RUN: %{command} -ivfsoverlay %t/external-names-default.yaml 19*52c62d46SVolodymyr Sapsai 20*52c62d46SVolodymyr Sapsai// RUN: sed -e "s@TMP_DIR@%{/t:regex_replacement}@g" -e "s@USE_EXTERNAL_NAMES_OPTION@'use-external-names': true,@g" %t/overlay.yaml.template > %t/external-names-true.yaml 21*52c62d46SVolodymyr Sapsai// RUN: %{command} -ivfsoverlay %t/external-names-true.yaml 22*52c62d46SVolodymyr Sapsai 23*52c62d46SVolodymyr Sapsai// RUN: sed -e "s@TMP_DIR@%{/t:regex_replacement}@g" -e "s@USE_EXTERNAL_NAMES_OPTION@'use-external-names': false,@g" %t/overlay.yaml.template > %t/external-names-false.yaml 24*52c62d46SVolodymyr Sapsai// RUN: %{command} -ivfsoverlay %t/external-names-false.yaml 25*52c62d46SVolodymyr Sapsai 26*52c62d46SVolodymyr Sapsai//--- prepopulate_module_cache.m 27*52c62d46SVolodymyr Sapsai#import <Redirecting/Redirecting.h> 28*52c62d46SVolodymyr Sapsai 29*52c62d46SVolodymyr Sapsai//--- test.m 30*52c62d46SVolodymyr Sapsai// At first import multi-path modules directly, so clang decides which .pcm file they should belong to. 31*52c62d46SVolodymyr Sapsai#import <MultiPath/MultiPath.h> 32*52c62d46SVolodymyr Sapsai#import <MultiPathHeader.h> 33*52c62d46SVolodymyr Sapsai 34*52c62d46SVolodymyr Sapsai// Then import a module from the module cache and all its transitive dependencies. 35*52c62d46SVolodymyr Sapsai// Make sure the .pcm files loaded directly are the same as 'Redirecting' is referencing. 36*52c62d46SVolodymyr Sapsai#import <Redirecting/Redirecting.h> 37*52c62d46SVolodymyr Sapsai// expected-no-diagnostics 38*52c62d46SVolodymyr Sapsai 39*52c62d46SVolodymyr Sapsai 40*52c62d46SVolodymyr Sapsai//--- Frameworks/MultiPath.framework/Headers/MultiPath.h 41*52c62d46SVolodymyr Sapsaivoid multiPathFramework(void); 42*52c62d46SVolodymyr Sapsai 43*52c62d46SVolodymyr Sapsai//--- Frameworks/MultiPath.framework/Modules/module.modulemap 44*52c62d46SVolodymyr Sapsaiframework module MultiPath { 45*52c62d46SVolodymyr Sapsai header "MultiPath.h" 46*52c62d46SVolodymyr Sapsai export * 47*52c62d46SVolodymyr Sapsai} 48*52c62d46SVolodymyr Sapsai 49*52c62d46SVolodymyr Sapsai 50*52c62d46SVolodymyr Sapsai//--- include/MultiPathHeader.h 51*52c62d46SVolodymyr Sapsaivoid multiPathHeader(void); 52*52c62d46SVolodymyr Sapsai 53*52c62d46SVolodymyr Sapsai//--- include/module.modulemap 54*52c62d46SVolodymyr Sapsaimodule MultiPathHeader { 55*52c62d46SVolodymyr Sapsai header "MultiPathHeader.h" 56*52c62d46SVolodymyr Sapsai export * 57*52c62d46SVolodymyr Sapsai} 58*52c62d46SVolodymyr Sapsai 59*52c62d46SVolodymyr Sapsai 60*52c62d46SVolodymyr Sapsai//--- Frameworks/Redirecting.framework/Headers/Redirecting.h 61*52c62d46SVolodymyr Sapsai#import <MultiPath/MultiPath.h> 62*52c62d46SVolodymyr Sapsai#import <MultiPathHeader.h> 63*52c62d46SVolodymyr Sapsai 64*52c62d46SVolodymyr Sapsai//--- Frameworks/Redirecting.framework/Modules/module.modulemap 65*52c62d46SVolodymyr Sapsaiframework module Redirecting { 66*52c62d46SVolodymyr Sapsai header "Redirecting.h" 67*52c62d46SVolodymyr Sapsai export * 68*52c62d46SVolodymyr Sapsai} 69*52c62d46SVolodymyr Sapsai 70*52c62d46SVolodymyr Sapsai 71*52c62d46SVolodymyr Sapsai//--- BuildTemporaries/MultiPath.h 72*52c62d46SVolodymyr Sapsaivoid multiPathFramework(void); 73*52c62d46SVolodymyr Sapsai//--- BuildTemporaries/framework.modulemap 74*52c62d46SVolodymyr Sapsaiframework module MultiPath { 75*52c62d46SVolodymyr Sapsai header "MultiPath.h" 76*52c62d46SVolodymyr Sapsai export * 77*52c62d46SVolodymyr Sapsai} 78*52c62d46SVolodymyr Sapsai//--- BuildTemporaries/header.h 79*52c62d46SVolodymyr Sapsaivoid multiPathHeader(void); 80*52c62d46SVolodymyr Sapsai//--- BuildTemporaries/include.modulemap 81*52c62d46SVolodymyr Sapsaimodule MultiPathHeader { 82*52c62d46SVolodymyr Sapsai header "MultiPathHeader.h" 83*52c62d46SVolodymyr Sapsai export * 84*52c62d46SVolodymyr Sapsai} 85*52c62d46SVolodymyr Sapsai 86*52c62d46SVolodymyr Sapsai//--- overlay.yaml.template 87*52c62d46SVolodymyr Sapsai{ 88*52c62d46SVolodymyr Sapsai 'version': 0, 89*52c62d46SVolodymyr Sapsai USE_EXTERNAL_NAMES_OPTION 90*52c62d46SVolodymyr Sapsai 'roots': [ 91*52c62d46SVolodymyr Sapsai { 'name': 'TMP_DIR/Frameworks/MultiPath.framework/Headers', 'type': 'directory', 92*52c62d46SVolodymyr Sapsai 'contents': [ 93*52c62d46SVolodymyr Sapsai { 'name': 'MultiPath.h', 'type': 'file', 94*52c62d46SVolodymyr Sapsai 'external-contents': 'TMP_DIR/BuildTemporaries/MultiPath.h'} 95*52c62d46SVolodymyr Sapsai ]}, 96*52c62d46SVolodymyr Sapsai { 'name': 'TMP_DIR/Frameworks/MultiPath.framework/Modules', 'type': 'directory', 97*52c62d46SVolodymyr Sapsai 'contents': [ 98*52c62d46SVolodymyr Sapsai { 'name': 'module.modulemap', 'type': 'file', 99*52c62d46SVolodymyr Sapsai 'external-contents': 'TMP_DIR/BuildTemporaries/framework.modulemap'} 100*52c62d46SVolodymyr Sapsai ]}, 101*52c62d46SVolodymyr Sapsai { 'name': 'TMP_DIR/include', 'type': 'directory', 102*52c62d46SVolodymyr Sapsai 'contents': [ 103*52c62d46SVolodymyr Sapsai { 'name': 'MultiPathHeader.h', 'type': 'file', 104*52c62d46SVolodymyr Sapsai 'external-contents': 'TMP_DIR/BuildTemporaries/header.h'}, 105*52c62d46SVolodymyr Sapsai { 'name': 'module.modulemap', 'type': 'file', 106*52c62d46SVolodymyr Sapsai 'external-contents': 'TMP_DIR/BuildTemporaries/include.modulemap'} 107*52c62d46SVolodymyr Sapsai ]} 108*52c62d46SVolodymyr Sapsai ] 109*52c62d46SVolodymyr Sapsai} 110*52c62d46SVolodymyr Sapsai 111