diff --git a/lib/ClangImporter/ClangImporter.cpp b/lib/ClangImporter/ClangImporter.cpp index e8ef04e2ad0c9..c7f93347a45ea 100644 --- a/lib/ClangImporter/ClangImporter.cpp +++ b/lib/ClangImporter/ClangImporter.cpp @@ -1155,7 +1155,7 @@ std::optional> ClangImporter::getClangCC1Arguments( llvm::interleave( invocationArgs, [](StringRef arg) { llvm::errs() << arg; }, [] { llvm::errs() << "' '"; }); - llvm::errs() << "'\n"; + llvm::errs() << "'\n\n"; } clang::CreateInvocationOptions CIOpts; @@ -1260,11 +1260,24 @@ ClangImporter::create(ASTContext &ctx, // Wrap Swift's FS to allow Clang to override the working directory VFS = llvm::vfs::RedirectingFileSystem::create( fileMapping.redirectedFiles, true, *ctx.SourceMgr.getFileSystem()); + if (importerOpts.DumpClangDiagnostics) { + llvm::errs() << "clang importer redirected file mappings:\n"; + for (const auto &mapping : fileMapping.redirectedFiles) { + llvm::errs() << " mapping real file '" << mapping.second + << "' to virtual file '" << mapping.first << "'\n"; + } + llvm::errs() << "\n"; + } if (!fileMapping.overridenFiles.empty()) { llvm::IntrusiveRefCntPtr overridenVFS = new llvm::vfs::InMemoryFileSystem(); for (const auto &file : fileMapping.overridenFiles) { + if (importerOpts.DumpClangDiagnostics) { + llvm::errs() << "clang importer overriding file '" << file.first + << "' with the following contents:\n"; + llvm::errs() << file.second << "\n"; + } auto contents = ctx.Allocate(file.second.size() + 1); std::copy(file.second.begin(), file.second.end(), contents.begin()); // null terminate the buffer. diff --git a/lib/ClangImporter/ClangIncludePaths.cpp b/lib/ClangImporter/ClangIncludePaths.cpp index f76fd229c549c..ee4d58fa19949 100644 --- a/lib/ClangImporter/ClangIncludePaths.cpp +++ b/lib/ClangImporter/ClangIncludePaths.cpp @@ -34,10 +34,9 @@ static std::optional getActualModuleMapPath( Path result; - StringRef SDKPath = Opts.getSDKPath(); - if (!SDKPath.empty()) { - result.append(SDKPath.begin(), SDKPath.end()); - llvm::sys::path::append(result, "usr", "lib", "swift"); + if (!Opts.RuntimeResourcePath.empty()) { + result.append(Opts.RuntimeResourcePath.begin(), + Opts.RuntimeResourcePath.end()); llvm::sys::path::append(result, platform); if (isArchSpecific) { llvm::sys::path::append(result, arch); @@ -51,10 +50,11 @@ static std::optional getActualModuleMapPath( return result; } - if (!Opts.RuntimeResourcePath.empty()) { + StringRef SDKPath = Opts.getSDKPath(); + if (!SDKPath.empty()) { result.clear(); - result.append(Opts.RuntimeResourcePath.begin(), - Opts.RuntimeResourcePath.end()); + result.append(SDKPath.begin(), SDKPath.end()); + llvm::sys::path::append(result, "usr", "lib", "swift"); llvm::sys::path::append(result, platform); if (isArchSpecific) { llvm::sys::path::append(result, arch); diff --git a/test/ClangImporter/print-module-map-paths.swift b/test/ClangImporter/print-module-map-paths.swift new file mode 100644 index 0000000000000..5e82294a7732d --- /dev/null +++ b/test/ClangImporter/print-module-map-paths.swift @@ -0,0 +1,39 @@ +// RUN: %empty-directory(%t) +// RUN: mkdir -p %t/resources/linux/armv7 %t/sdk/usr/include %t/sdk/usr/lib/swift/linux/armv7 +// RUN: touch %t/sdk/usr/include/{inttypes,stdint,unistd}.h + +// RUN: touch %t/resources/linux/armv7/{SwiftGlibc.h,glibc.modulemap} +// RUN: touch %t/sdk/usr/lib/swift/linux/armv7/{SwiftGlibc.h,glibc.modulemap} +// RUN: %swift %s -typecheck -parse-stdlib -dump-clang-diagnostics -target armv7-unknown-linux-gnueabihf -sdk %t/sdk -resource-dir %t/resources 2>&1 | %FileCheck -check-prefix=CHECK-LINUX %s + +// RUN: cp %S/../../stdlib/public/Cxx/{cxxshim/libcxxshim.modulemap,libstdcxx/libstdcxx.h,libstdcxx/libstdcxx.modulemap} %t/resources/linux +// RUN: %target-swift-frontend %s -typecheck -parse-stdlib -dump-clang-diagnostics -resource-dir %t/resources -cxx-interoperability-mode=default 2>&1 | %FileCheck -check-prefix=CHECK-CXX -check-prefix=CHECK-%target-os-CXX %s + +// RUN: mkdir -p %t/resources/android/aarch64 %t/sdk/usr/lib/swift/android/aarch64 +// RUN: cp %S/../../stdlib/public/Platform/{SwiftAndroidNDK.h,SwiftBionic.h,android.modulemap} %t/resources/android/aarch64 +// RUN: cp %S/../../stdlib/public/Platform/{SwiftAndroidNDK.h,SwiftBionic.h,android.modulemap} %t/sdk/usr/lib/swift/android/aarch64 +// RUN: %swift %s -typecheck -parse-stdlib -dump-clang-diagnostics -target aarch64-unknown-linux-android -sdk %t/sdk -resource-dir %t/resources 2>&1 | %FileCheck -check-prefix=CHECK-ANDROID %s + +// RUN: cp %S/../../stdlib/public/Cxx/cxxshim/libcxxshim.modulemap %t/resources/android +// RUN: cp %S/../../stdlib/public/Cxx/cxxshim/libcxxshim.modulemap %t/sdk/usr/lib/swift/android +// RUN: %swift %s -typecheck -parse-stdlib -dump-clang-diagnostics -target aarch64-unknown-linux-android -sdk %t/sdk -resource-dir %t/resources -cxx-interoperability-mode=default 2>&1 | %FileCheck -check-prefix=CHECK-ANDROID-CXX %s + +// CHECK-LINUX: clang importer redirected file mappings: +// CHECK-LINUX-NEXT: mapping real file '{{.*}}{{/|\\}}resources{{/|\\}}linux{{/|\\}}armv7{{/|\\}}glibc.modulemap' to virtual file '{{.*}}{{/|\\}}sdk{{/|\\}}usr{{/|\\}}include{{/|\\}}module.modulemap' +// CHECK-LINUX-NEXT: mapping real file '{{.*}}{{/|\\}}resources{{/|\\}}linux{{/|\\}}armv7{{/|\\}}SwiftGlibc.h' to virtual file '{{.*}}{{/|\\}}sdk{{/|\\}}usr{{/|\\}}include{{/|\\}}SwiftGlibc.h' + +// CHECK-CXX: clang importer redirected file mappings: +// CHECK-linux-gnu-CXX: mapping real file '{{.*}}/resources/linux/libstdcxx.h' to virtual file '{{.*}}/usr/include/c++/{{.*}}/libstdcxx.h' +// CHECK-linux-gnu-CXX: clang importer overriding file '{{.*}}/usr/include/c++/{{.*}}/module.modulemap' with the following contents: +// CHECK-linux-gnu-CXX-NEXT: --- libstdcxx.modulemap --- +// CHECK-linux-gnu-CXX: Currently libstdc++ does not have a module map. To work around +// CHECK-linux-gnu-CXX-NEXT: this, Swift provides its own module map for libstdc++. +// CHECK-linux-gnu-CXX: header "libstdcxx.h" +// CHECK-linux-gnu-CXX: clang importer driver args: {{.*}}'-fmodule-map-file={{.*}}resources/linux/libcxxshim.modulemap' + +// CHECK-ANDROID: clang importer redirected file mappings: +// CHECK-ANDROID-NEXT: mapping real file '{{.*}}{{/|\\}}resources{{/|\\}}android{{/|\\}}aarch64{{/|\\}}android.modulemap' to virtual file '{{.*}}{{/|\\}}sdk{{/|\\}}usr{{/|\\}}include{{/|\\}}module.modulemap' +// CHECK-ANDROID-NEXT: mapping real file '{{.*}}{{/|\\}}resources{{/|\\}}android{{/|\\}}aarch64{{/|\\}}SwiftAndroidNDK.h' to virtual file '{{.*}}{{/|\\}}sdk{{/|\\}}usr{{/|\\}}include{{/|\\}}SwiftAndroidNDK.h' +// CHECK-ANDROID-NEXT: mapping real file '{{.*}}{{/|\\}}resources{{/|\\}}android{{/|\\}}aarch64{{/|\\}}SwiftBionic.h' to virtual file '{{.*}}{{/|\\}}sdk{{/|\\}}usr{{/|\\}}include{{/|\\}}SwiftBionic.h' + +// CHECK-ANDROID-CXX: clang importer driver args: {{.*}}'-fmodule-map-file={{.*}}resources{{/|\\}}android{{/|\\}}libcxxshim.modulemap' diff --git a/test/Frontend/embed-bitcode.ll b/test/Frontend/embed-bitcode.ll index 86518f81c3984..d93252d1611ee 100644 --- a/test/Frontend/embed-bitcode.ll +++ b/test/Frontend/embed-bitcode.ll @@ -36,14 +36,14 @@ target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" ; MARKER-CMD-NEXT: 00 ; CHECK-COMPILER-NOT: argument unused -; CHECK-COMPILER: clang +; CHECK-COMPILER: bin{{/|\\}}clang ; CHECK-COMPILER-SAME: -fembed-bitcode ; CHECK-COMPILER-SAME: -target ; CHECK-COMPILER-NOT: argument unused ; CHECK-COMPILER: Fast Register Allocator ; CHECK-COMPILER-OPT-NOT: argument unused -; CHECK-COMPILER-OPT: clang +; CHECK-COMPILER-OPT: bin{{/|\\}}clang ; CHECK-COMPILER-OPT-SAME: -fembed-bitcode ; CHECK-COMPILER-OPT-SAME: -target ; CHECK-COMPILER-OPT-SAME: -Os