diff --git a/clang/test/Driver/fat-archive-unbundle-ext.c b/clang/test/Driver/fat-archive-unbundle-ext.c new file mode 100644 --- /dev/null +++ b/clang/test/Driver/fat-archive-unbundle-ext.c @@ -0,0 +1,21 @@ +// REQUIRES: x86-registered-target +// UNSUPPORTED: windows, darwin, aix + +// Generate dummy fat object +// RUN: %clang -O0 -target %itanium_abi_triple %s -c -o %t.host.o +// RUN: echo 'Content of device file' > %t.tgt.o +// RUN: clang-offload-bundler -type=o -targets=host-%itanium_abi_triple,openmp-%itanium_abi_triple -inputs=%t.host.o,%t.tgt.o -outputs=%t.fat.obj + +// Then create a static archive with that object +// RUN: rm -f %t.fat.a +// RUN: llvm-ar cr %t.fat.a %t.fat.obj + +// Unbundle device part from the archive. Check that bundler does not print warnings. +// RUN: clang-offload-bundler -unbundle -type=a -targets=openmp-%itanium_abi_triple -inputs=%t.fat.a -outputs=%t.tgt.a 2>&1 | FileCheck --allow-empty --check-prefix=CHECK-WARNING %s +// CHECK-WARNING-NOT: warning + +// Check that device archive member inherited file extension from the original file. +// RUN: llvm-ar t %t.tgt.a | FileCheck --check-prefix=CHECK-ARCHIVE %s +// CHECK-ARCHIVE: {{\.obj$}} + +void foo(void) {} diff --git a/clang/tools/clang-offload-bundler/ClangOffloadBundler.cpp b/clang/tools/clang-offload-bundler/ClangOffloadBundler.cpp --- a/clang/tools/clang-offload-bundler/ClangOffloadBundler.cpp +++ b/clang/tools/clang-offload-bundler/ClangOffloadBundler.cpp @@ -180,21 +180,19 @@ } }; -static StringRef getDeviceFileExtension(StringRef Device) { +static StringRef getDeviceFileExtension(StringRef Device, + StringRef BundleFileName) { if (Device.contains("gfx")) return ".bc"; if (Device.contains("sm_")) return ".cubin"; - - WithColor::warning() << "Could not determine extension for archive" - "members, using \".o\"\n"; - return ".o"; + return sys::path::extension(BundleFileName); } static std::string getDeviceLibraryFileName(StringRef BundleFileName, StringRef Device) { StringRef LibName = sys::path::stem(BundleFileName); - StringRef Extension = getDeviceFileExtension(Device); + StringRef Extension = getDeviceFileExtension(Device, BundleFileName); std::string Result; Result += LibName;