diff --git a/clang/include/clang/Driver/Types.def b/clang/include/clang/Driver/Types.def index 7e3a7239cbeea..716b72dc59df0 100644 --- a/clang/include/clang/Driver/Types.def +++ b/clang/include/clang/Driver/Types.def @@ -114,4 +114,5 @@ TYPE("fpga_aocr_emu", FPGA_AOCR_EMU, INVALID, "aocr", phases TYPE("fpga_aoco", FPGA_AOCO, INVALID, "aoco", phases::Compile, phases::Backend, phases::Assemble, phases::Link) TYPE("fpga_dep", FPGA_Dependencies, INVALID, "d", phases::Compile, phases::Backend, phases::Assemble, phases::Link) TYPE("fpga_dep_list", FPGA_Dependencies_List, INVALID, "txt", phases::Compile, phases::Backend, phases::Assemble, phases::Link) +TYPE("host_dep_image", Host_Dependencies_Image, INVALID, "out", phases::Compile, phases::Backend, phases::Assemble, phases::Link) TYPE("none", Nothing, INVALID, nullptr, phases::Compile, phases::Backend, phases::Assemble, phases::Link) diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 562cb21a7a54c..7c03a88e8c722 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -5009,7 +5009,8 @@ class OffloadingActionBuilder final { /// they can add it to the device linker inputs. void addDeviceLinkDependenciesFromHost(ActionList &LinkerInputs) { // Link image for reading dependencies from it. - auto *LA = C.MakeAction(LinkerInputs, types::TY_Image); + auto *LA = C.MakeAction(LinkerInputs, + types::TY_Host_Dependencies_Image); // Calculate all the offload kinds used in the current compilation. unsigned ActiveOffloadKinds = 0u; diff --git a/clang/lib/Driver/ToolChains/MSVC.cpp b/clang/lib/Driver/ToolChains/MSVC.cpp index 6174cbc8d5134..fa80633ac9f25 100644 --- a/clang/lib/Driver/ToolChains/MSVC.cpp +++ b/clang/lib/Driver/ToolChains/MSVC.cpp @@ -570,6 +570,14 @@ void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA, Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link); + // A user can add the -out: option to the /link sequence on the command line + // which we do not want to use when we are performing the host link when + // gathering dependencies used for device compilation. Add an additional + // -out: to override in case it was seen. + if (JA.getType() == types::TY_Host_Dependencies_Image && Output.isFilename()) + CmdArgs.push_back( + Args.MakeArgString(std::string("-out:") + Output.getFilename())); + // Control Flow Guard checks if (Arg *A = Args.getLastArg(options::OPT__SLASH_guard)) { StringRef GuardArgs = A->getValue(); diff --git a/clang/test/Driver/sycl-intelfpga-aoco-win.cpp b/clang/test/Driver/sycl-intelfpga-aoco-win.cpp index 71150213b3a56..a5c392d044721 100755 --- a/clang/test/Driver/sycl-intelfpga-aoco-win.cpp +++ b/clang/test/Driver/sycl-intelfpga-aoco-win.cpp @@ -24,7 +24,7 @@ // CHK-FPGA-AOCO-PHASES-WIN: 10: backend, {9}, assembler, (host-sycl) // CHK-FPGA-AOCO-PHASES-WIN: 11: assembler, {10}, object, (host-sycl) // CHK-FPGA-AOCO-PHASES-WIN: 12: linker, {0, 11}, image, (host-sycl) -// CHK-FPGA-AOCO-PHASES-WIN: 13: linker, {0, 11}, image, (host-sycl) +// CHK-FPGA-AOCO-PHASES-WIN: 13: linker, {0, 11}, host_dep_image, (host-sycl) // CHK-FPGA-AOCO-PHASES-WIN: 14: clang-offload-deps, {13}, ir, (host-sycl) // CHK-FPGA-AOCO-PHASES-WIN: 15: input, "[[INPUTA]]", archive // CHK-FPGA-AOCO-PHASES-WIN: 16: clang-offload-unbundler, {15}, archive diff --git a/clang/test/Driver/sycl-intelfpga-aoco.cpp b/clang/test/Driver/sycl-intelfpga-aoco.cpp index e42c15acc5ad7..ac9ca191cea5d 100755 --- a/clang/test/Driver/sycl-intelfpga-aoco.cpp +++ b/clang/test/Driver/sycl-intelfpga-aoco.cpp @@ -28,7 +28,7 @@ // CHK-FPGA-AOCO-PHASES: 10: backend, {9}, assembler, (host-sycl) // CHK-FPGA-AOCO-PHASES: 11: assembler, {10}, object, (host-sycl) // CHK-FPGA-AOCO-PHASES: 12: linker, {0, 11}, image, (host-sycl) -// CHK-FPGA-AOCO-PHASES: 13: linker, {0, 11}, image, (host-sycl) +// CHK-FPGA-AOCO-PHASES: 13: linker, {0, 11}, host_dep_image, (host-sycl) // CHK-FPGA-AOCO-PHASES: 14: clang-offload-deps, {13}, ir, (host-sycl) // CHK-FPGA-AOCO-PHASES: 15: input, "[[INPUTA]]", archive // CHK-FPGA-AOCO-PHASES: 16: clang-offload-unbundler, {15}, archive @@ -61,7 +61,7 @@ // CHK-FPGA-AOCO-PHASES-WIN: 10: backend, {9}, assembler, (host-sycl) // CHK-FPGA-AOCO-PHASES-WIN: 11: assembler, {10}, object, (host-sycl) // CHK-FPGA-AOCO-PHASES-WIN: 12: linker, {0, 11}, image, (host-sycl) -// CHK-FPGA-AOCO-PHASES-WIN: 13: linker, {0, 11}, image, (host-sycl) +// CHK-FPGA-AOCO-PHASES-WIN: 13: linker, {0, 11}, host_dep_image, (host-sycl) // CHK-FPGA-AOCO-PHASES-WIN: 14: clang-offload-deps, {13}, ir, (host-sycl) // CHK-FPGA-AOCO-PHASES-WIN: 15: input, "[[INPUTA]]", archive // CHK-FPGA-AOCO-PHASES-WIN: 16: clang-offload-unbundler, {15}, archive diff --git a/clang/test/Driver/sycl-intelfpga-static-lib-win.cpp b/clang/test/Driver/sycl-intelfpga-static-lib-win.cpp index b26c806af366c..c0fb3d3f89f04 100644 --- a/clang/test/Driver/sycl-intelfpga-static-lib-win.cpp +++ b/clang/test/Driver/sycl-intelfpga-static-lib-win.cpp @@ -15,7 +15,7 @@ // RUN: | FileCheck -check-prefix=CHECK_PHASES %s // CHECK_PHASES: 0: input, "[[INPUT:.+\.lib]]", object, (host-sycl) // CHECK_PHASES: 1: linker, {0}, image, (host-sycl) -// CHECK_PHASES: 2: linker, {0}, image, (host-sycl) +// CHECK_PHASES: 2: linker, {0}, host_dep_image, (host-sycl) // CHECK_PHASES: 3: clang-offload-deps, {2}, ir, (host-sycl) // CHECK_PHASES: 4: input, "[[INPUT]]", archive // CHECK_PHASES: 5: clang-offload-unbundler, {4}, archive diff --git a/clang/test/Driver/sycl-intelfpga-static-lib.cpp b/clang/test/Driver/sycl-intelfpga-static-lib.cpp index b45215b985466..98bde770261b9 100644 --- a/clang/test/Driver/sycl-intelfpga-static-lib.cpp +++ b/clang/test/Driver/sycl-intelfpga-static-lib.cpp @@ -14,7 +14,7 @@ // RUN: | FileCheck -check-prefix=CHECK_PHASES %s // CHECK_PHASES: 0: input, "[[INPUT:.+\.a]]", object, (host-sycl) // CHECK_PHASES: 1: linker, {0}, image, (host-sycl) -// CHECK_PHASES: 2: linker, {0}, image, (host-sycl) +// CHECK_PHASES: 2: linker, {0}, host_dep_image, (host-sycl) // CHECK_PHASES: 3: clang-offload-deps, {2}, ir, (host-sycl) // CHECK_PHASES: 4: input, "[[INPUT]]", archive // CHECK_PHASES: 5: clang-offload-unbundler, {4}, archive diff --git a/clang/test/Driver/sycl-offload-static-lib-2.cpp b/clang/test/Driver/sycl-offload-static-lib-2.cpp index 1e36e7a145242..d2abb3d93ad89 100644 --- a/clang/test/Driver/sycl-offload-static-lib-2.cpp +++ b/clang/test/Driver/sycl-offload-static-lib-2.cpp @@ -60,7 +60,7 @@ // STATIC_LIB_SRC: 10: backend, {9}, assembler, (host-sycl) // STATIC_LIB_SRC: 11: assembler, {10}, object, (host-sycl) // STATIC_LIB_SRC: 12: linker, {0, 11}, image, (host-sycl) -// STATIC_LIB_SRC: 13: linker, {0, 11}, image, (host-sycl) +// STATIC_LIB_SRC: 13: linker, {0, 11}, host_dep_image, (host-sycl) // STATIC_LIB_SRC: 14: clang-offload-deps, {13}, ir, (host-sycl) // STATIC_LIB_SRC: 15: input, "[[INPUTA]]", archive // STATIC_LIB_SRC: 16: clang-offload-unbundler, {15}, archive diff --git a/clang/test/Driver/sycl-offload-static-lib.cpp b/clang/test/Driver/sycl-offload-static-lib.cpp index 447c56a06491d..ca93937db9d76 100644 --- a/clang/test/Driver/sycl-offload-static-lib.cpp +++ b/clang/test/Driver/sycl-offload-static-lib.cpp @@ -64,7 +64,7 @@ // FOFFLOAD_STATIC_LIB_SRC: 10: backend, {9}, assembler, (host-sycl) // FOFFLOAD_STATIC_LIB_SRC: 11: assembler, {10}, object, (host-sycl) // FOFFLOAD_STATIC_LIB_SRC: 12: linker, {0, 11}, image, (host-sycl) -// FOFFLOAD_STATIC_LIB_SRC: 13: linker, {0, 11}, image, (host-sycl) +// FOFFLOAD_STATIC_LIB_SRC: 13: linker, {0, 11}, host_dep_image, (host-sycl) // FOFFLOAD_STATIC_LIB_SRC: 14: clang-offload-deps, {13}, ir, (host-sycl) // FOFFLOAD_STATIC_LIB_SRC: 15: input, "[[INPUTA]]", archive // FOFFLOAD_STATIC_LIB_SRC: 16: clang-offload-unbundler, {15}, archive @@ -133,7 +133,7 @@ // RUN: | FileCheck %s -check-prefix=FOFFLOAD_STATIC_LIB_NOSRC_PHASES // FOFFLOAD_STATIC_LIB_NOSRC_PHASES: 0: input, "[[INPUTA:.+\.a]]", object, (host-sycl) // FOFFLOAD_STATIC_LIB_NOSRC_PHASES: 1: linker, {0}, image, (host-sycl) -// FOFFLOAD_STATIC_LIB_NOSRC_PHASES: 2: linker, {0}, image, (host-sycl) +// FOFFLOAD_STATIC_LIB_NOSRC_PHASES: 2: linker, {0}, host_dep_image, (host-sycl) // FOFFLOAD_STATIC_LIB_NOSRC_PHASES: 3: clang-offload-deps, {2}, ir, (host-sycl) // FOFFLOAD_STATIC_LIB_NOSRC_PHASES: 4: input, "[[INPUTA]]", archive // FOFFLOAD_STATIC_LIB_NOSRC_PHASES: 5: clang-offload-unbundler, {4}, archive diff --git a/clang/test/Driver/sycl-offload-win.c b/clang/test/Driver/sycl-offload-win.c index 24618080a7bfb..64684ccd6f66f 100644 --- a/clang/test/Driver/sycl-offload-win.c +++ b/clang/test/Driver/sycl-offload-win.c @@ -74,7 +74,7 @@ // FOFFLOAD_STATIC_LIB_SRC: 10: backend, {9}, assembler, (host-sycl) // FOFFLOAD_STATIC_LIB_SRC: 11: assembler, {10}, object, (host-sycl) // FOFFLOAD_STATIC_LIB_SRC: 12: linker, {0, 11}, image, (host-sycl) -// FOFFLOAD_STATIC_LIB_SRC: 13: linker, {0, 11}, image, (host-sycl) +// FOFFLOAD_STATIC_LIB_SRC: 13: linker, {0, 11}, host_dep_image, (host-sycl) // FOFFLOAD_STATIC_LIB_SRC: 14: clang-offload-deps, {13}, ir, (host-sycl) // FOFFLOAD_STATIC_LIB_SRC: 15: input, "[[INPUTLIB]]", archive // FOFFLOAD_STATIC_LIB_SRC: 16: clang-offload-unbundler, {15}, archive @@ -103,3 +103,10 @@ // FSYCL_P: clang{{.*}} "-cc1" "-triple" "x86_64-pc-windows-msvc{{.*}}" {{.*}} "-E" {{.*}} "-o" "[[HOSTPP:.+\.ii]]" // FSYCL_P: clang-offload-bundler{{.*}} "-type=ii" "-targets=sycl-spir64-unknown-unknown-sycldevice,host-x86_64-pc-windows-msvc" {{.*}} "-inputs=[[DEVICEPP]],[[HOSTPP]]" +// RUN: touch %t-orig.lib +// RUN: %clang_cl --target=x86_64-pc-windows-msvc -fsycl %t-orig.lib %s -### /link -out:force_out_file 2>&1 \ +// RUN: | FileCheck %s -check-prefix=HOSTDEP_LINK_OVERRIDE +// HOSTDEP_LINK_OVERRIDE: link{{.*}} "-out:[[HOSTDEP_LINK_OUT:.+\.out]]"{{.*}} "-out:force_out_file" "-out:[[HOSTDEP_LINK_OUT]]" +// HOSTDEP_LINK_OVERRIDE: clang-offload-deps{{.*}} +// HOSTDEP_LINK_OVERRIDE: link{{.*}} "-out:[[LINK_OUT:.+\.exe]]"{{.*}} "-out:force_out_file" +// HOSTDEP_LINK_OVERRIDE-NOT: "-out:[[LINK_OUT]]"