From d5bd790d05eec223d06d3d49f9060dd80cf628f4 Mon Sep 17 00:00:00 2001 From: Finagolfin Date: Wed, 28 Aug 2024 11:58:11 +0530 Subject: [PATCH] [test] Check that the C/C++ module maps are looked for in `-resource-dir` before `-sdk`, as changed in #74814 Also, dump the module map paths when `-Xfrontend -dump-clang-diagnostics` is passed in, both so we can check that manually and in these tests, and fix another Frontend test to be more specific now that this other output trips it up. --- lib/ClangImporter/ClangImporter.cpp | 15 ++++++- .../print-module-map-paths.swift | 39 +++++++++++++++++++ test/Frontend/embed-bitcode.ll | 4 +- 3 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 test/ClangImporter/print-module-map-paths.swift diff --git a/lib/ClangImporter/ClangImporter.cpp b/lib/ClangImporter/ClangImporter.cpp index b99bdfc691f57..f99ab3a46374e 100644 --- a/lib/ClangImporter/ClangImporter.cpp +++ b/lib/ClangImporter/ClangImporter.cpp @@ -1186,7 +1186,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; @@ -1291,11 +1291,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/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