diff --git a/clang/include/clang/Driver/Driver.h b/clang/include/clang/Driver/Driver.h --- a/clang/include/clang/Driver/Driver.h +++ b/clang/include/clang/Driver/Driver.h @@ -627,10 +627,19 @@ /// Returns the default name for linked images (e.g., "a.out"). const char *getDefaultImageName() const; - // Creates a temp file with $Prefix-%%%%%%.$Suffix + /// Creates a temp file. + /// 1. If \p MultipleArch is false or \p BoundArch is empty, the temp file is + /// in the temporary directory with name $Prefix-%%%%%%.$Suffix. + /// 2. If \p MultipleArch is true and \p BoundArch is not empty, + /// 2a. If \p NeedUniqueDirectory is false, the temp file is in the + /// temporary directory with name $Prefix-$BoundArch-%%%%%.$Suffix. + /// 2b. If \p NeedUniqueDirectory is true, the temp file is in a unique + /// subdiretory with random name under the temporary directory, and + /// the temp file itself has name $Prefix-$BoundArch.$Suffix. const char *CreateTempFile(Compilation &C, StringRef Prefix, StringRef Suffix, bool MultipleArchs = false, - StringRef BoundArch = {}) const; + StringRef BoundArch = {}, + bool NeedUniqueDirectory = false) const; /// GetNamedOutputPath - Return the name to use for the output of /// the action \p JA. The result is appended to the compilation's diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -5545,7 +5545,8 @@ const char *Driver::CreateTempFile(Compilation &C, StringRef Prefix, StringRef Suffix, bool MultipleArchs, - StringRef BoundArch) const { + StringRef BoundArch, + bool NeedUniqueDirectory) const { SmallString<128> TmpName; Arg *A = C.getArgs().getLastArg(options::OPT_fcrash_diagnostics_dir); std::optional CrashDirectory = @@ -5565,9 +5566,15 @@ } } else { if (MultipleArchs && !BoundArch.empty()) { - TmpName = GetTemporaryDirectory(Prefix); - llvm::sys::path::append(TmpName, - Twine(Prefix) + "-" + BoundArch + "." + Suffix); + if (NeedUniqueDirectory) { + TmpName = GetTemporaryDirectory(Prefix); + llvm::sys::path::append(TmpName, + Twine(Prefix) + "-" + BoundArch + "." + Suffix); + } else { + TmpName = + GetTemporaryPath((Twine(Prefix) + "-" + BoundArch).str(), Suffix); + } + } else { TmpName = GetTemporaryPath(Prefix, Suffix); } @@ -5683,7 +5690,16 @@ StringRef Name = llvm::sys::path::filename(BaseInput); std::pair Split = Name.split('.'); const char *Suffix = types::getTypeTempSuffix(JA.getType(), IsCLMode()); - return CreateTempFile(C, Split.first, Suffix, MultipleArchs, BoundArch); + // The non-offloading toolchain on Darwin requires deterministic input + // file name for binaries to be deterministic, therefore it needs unique + // directory. + llvm::Triple Triple(C.getDriver().getTargetTriple()); + bool NeedUniqueDirectory = + (JA.getOffloadingDeviceKind() == Action::OFK_None || + JA.getOffloadingDeviceKind() == Action::OFK_Host) && + Triple.isOSDarwin(); + return CreateTempFile(C, Split.first, Suffix, MultipleArchs, BoundArch, + NeedUniqueDirectory); } SmallString<128> BasePath(BaseInput); diff --git a/clang/test/Driver/hip-link-bc-to-bc.hip b/clang/test/Driver/hip-link-bc-to-bc.hip --- a/clang/test/Driver/hip-link-bc-to-bc.hip +++ b/clang/test/Driver/hip-link-bc-to-bc.hip @@ -11,10 +11,10 @@ // RUN: 2>&1 | FileCheck -check-prefix=BITCODE %s // BITCODE: "{{.*}}clang-offload-bundler" "-type=bc" "-targets=host-x86_64-unknown-linux-gnu,hip-amdgcn-amd-amdhsa-gfx906" "-input={{.*}}bundle1.bc" "-output=[[B1HOST:.*\.bc]]" "-output=[[B1DEV1:.*\.bc]]" "-unbundle" "-allow-missing-bundles" -// BITCODE: "{{.*}}clang{{.*}}" "-o" "[[B1DEV2:.*bundle1-gfx906.bc]]" "-x" "ir" "[[B1DEV1]]" +// BITCODE: "{{.*}}clang{{.*}}" "-o" "[[B1DEV2:.*bundle1-gfx906-.*\.bc]]" "-x" "ir" "[[B1DEV1]]" // BITCODE: "{{.*}}clang-offload-bundler" "-type=bc" "-targets=host-x86_64-unknown-linux-gnu,hip-amdgcn-amd-amdhsa-gfx906" "-input={{.*}}bundle2.bc" "-output=[[B2HOST:.*\.bc]]" "-output=[[B2DEV1:.*\.bc]]" "-unbundle" "-allow-missing-bundles" -// BITCODE: "{{.*}}clang{{.*}}" "-o" "[[B2DEV2:.*bundle2-gfx906.bc]]" "-x" "ir" "[[B2DEV1]]" +// BITCODE: "{{.*}}clang{{.*}}" "-o" "[[B2DEV2:.*bundle2-gfx906-.*\.bc]]" "-x" "ir" "[[B2DEV1]]" // BITCODE: "{{.*}}llvm-link" "-o" "bundle1-hip-amdgcn-amd-amdhsa-gfx906.bc" "[[B1DEV2]]" "[[B2DEV2]]" diff --git a/clang/test/Driver/hip-temps-linux.hip b/clang/test/Driver/hip-temps-linux.hip new file mode 100644 --- /dev/null +++ b/clang/test/Driver/hip-temps-linux.hip @@ -0,0 +1,18 @@ +// REQUIRES: x86-registered-target +// REQUIRES: amdgpu-registered-target +// REQUIRES: system-linux + +// Check no temporary files or directores are left after compilation. +// RUN: rm -rf %t/mytmp +// RUN: mkdir -p %t/mytmp +// RUN: env TMPDIR="%t/mytmp" %clang --target=x86_64-linux-gnu -nogpulib -nogpuinc \ +// RUN: --rocm-path=%S/Inputs/rocm -nostdinc -nostdlib -c \ +// RUN: --offload-arch=gfx1030 -emit-llvm -v %s 2>&1 | \ +// RUN: FileCheck -check-prefixes=CHECK %s +// RUN: ls %t/mytmp >%t/mytmp.txt 2>&1 +// RUN: touch %t/empty.txt +// RUN: diff %t/mytmp.txt %t/empty.txt + +// CHECK: -o {{.*}}/mytmp/hip-temps-linux-gfx1030-{{.*}}.bc + +int main() {} diff --git a/clang/test/Driver/hip-temps-windows.hip b/clang/test/Driver/hip-temps-windows.hip new file mode 100644 --- /dev/null +++ b/clang/test/Driver/hip-temps-windows.hip @@ -0,0 +1,18 @@ +// REQUIRES: x86-registered-target +// REQUIRES: amdgpu-registered-target +// REQUIRES: system-windows + +// Check no temporary files or directores are left after compilation. +// RUN: rm -rf %t/mytmp +// RUN: mkdir -p %t/mytmp +// RUN: env TMP="%t/mytmp" %clang --target=x86_64-pc-windows-msvc -nogpulib -nogpuinc \ +// RUN: --rocm-path=%S/Inputs/rocm -nostdinc -nostdlib -c \ +// RUN: --offload-arch=gfx1030 -emit-llvm -v %s 2>&1 | \ +// RUN: FileCheck -check-prefixes=CHECK %s +// RUN: ls %t/mytmp >%t/mytmp.txt 2>&1 +// RUN: touch %t/empty.txt +// RUN: diff %t/mytmp.txt %t/empty.txt + +// CHECK: -o "{{.*}}mytmp{{/|\\\\}}hip-temps-windows-gfx1030-{{.*}}.bc" + +int main() {}