Skip to content

Commit a63a640

Browse files
authored
[Driver][SYCL][FPGA] Process aoco as regular archives for emulation (#4081)
AOCO archives are treated in a special manner for FPGA consumption. Much of this functionality is handled within the 'aoc' tool. Now that we have moved away from using 'aoc' for emulation (using opencl-aot), modify the behavior to treat aoco archives are regular archives only and process through opencl-aot.
1 parent 73455a1 commit a63a640

File tree

3 files changed

+59
-8
lines changed

3 files changed

+59
-8
lines changed

clang/lib/Driver/Driver.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4847,7 +4847,7 @@ class OffloadingActionBuilder final {
48474847
D.Diag(clang::diag::warn_drv_mismatch_fpga_archive) << InputName;
48484848
};
48494849
// Type FPGA aoco is a special case for static archives
4850-
if (A->getType() == types::TY_FPGA_AOCO) {
4850+
if (A->getType() == types::TY_FPGA_AOCO && !IsFPGAEmulation) {
48514851
if (!hasFPGABinary(C, InputName, types::TY_FPGA_AOCO))
48524852
return false;
48534853
A = C.MakeAction<InputAction>(*InputArg, types::TY_FPGA_AOCO);
@@ -5429,8 +5429,10 @@ void Driver::BuildActions(Compilation &C, DerivedArgList &Args,
54295429
unbundleStaticLib(types::TY_Archive, LA);
54305430
// Pass along the static libraries to check if we need to add them for
54315431
// unbundling for FPGA AOT static lib usage. Uses FPGA aoco type to
5432-
// differentiate if aoco unbundling is needed.
5433-
unbundleStaticLib(types::TY_FPGA_AOCO, LA);
5432+
// differentiate if aoco unbundling is needed. Unbundling of aoco is not
5433+
// needed for emulation, as these are treated as regular archives.
5434+
if (!C.getDriver().isFPGAEmulationMode())
5435+
unbundleStaticLib(types::TY_FPGA_AOCO, LA);
54345436
}
54355437
}
54365438

clang/test/Driver/sycl-intelfpga-aoco-win.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
// RUN: clang-offload-wrapper -o %t-aoco.bc -host=x86_64-pc-windows-msvc -kind=sycl -target=fpga_aoco-intel-unknown-sycldevice %t.aoco
88
// RUN: llc -filetype=obj -o %t-aoco.o %t-aoco.bc
99
// RUN: llvm-ar crv %t_aoco.a %t.o %t2.o %t-aoco.o
10-
// RUN: %clang_cl --target=x86_64-pc-windows-msvc -fsycl -fno-sycl-device-lib=all -fintelfpga -foffload-static-lib=%t_aoco.a %s -ccc-print-phases 2>&1 \
10+
// RUN: %clang_cl --target=x86_64-pc-windows-msvc -fsycl -fno-sycl-device-lib=all -fintelfpga -Xshardware %t_aoco.a %s -ccc-print-phases 2>&1 \
1111
// RUN: | FileCheck -check-prefixes=CHK-FPGA-AOCO-PHASES-WIN %s
12-
// RUN: %clangxx -target x86_64-pc-windows-msvc -fsycl -fno-sycl-device-lib=all -fintelfpga -foffload-static-lib=%t_aoco.a %s -ccc-print-phases 2>&1 \
12+
// RUN: %clangxx -target x86_64-pc-windows-msvc -fsycl -fno-sycl-device-lib=all -fintelfpga -Xshardware %t_aoco.a %s -ccc-print-phases 2>&1 \
1313
// RUN: | FileCheck -check-prefixes=CHK-FPGA-AOCO-PHASES-WIN %s
1414
// CHK-FPGA-AOCO-PHASES-WIN: 0: input, "[[INPUTA:.+\.a]]", object, (host-sycl)
1515
// CHK-FPGA-AOCO-PHASES-WIN: 1: input, "[[INPUTSRC:.+\.cpp]]", c++, (host-sycl)
@@ -42,7 +42,7 @@
4242
// CHK-FPGA-AOCO-PHASES-WIN: 28: offload, "host-sycl (x86_64-pc-windows-msvc)" {12}, "device-sycl (spir64_fpga-unknown-unknown-sycldevice)" {27}, image
4343

4444
/// aoco test, checking tools
45-
// RUN: %clang_cl --target=x86_64-pc-windows-msvc -fsycl -fno-sycl-device-lib=all -fintelfpga -foffload-static-lib=%t_aoco.a -Xshardware -### %s 2>&1 \
45+
// RUN: %clang_cl --target=x86_64-pc-windows-msvc -fsycl -fno-sycl-device-lib=all -fintelfpga %t_aoco.a -Xshardware -### %s 2>&1 \
4646
// RUN: | FileCheck -check-prefix=CHK-FPGA-AOCO %s
4747
// RUN: %clang_cl --target=x86_64-pc-windows-msvc -fsycl -fno-sycl-device-lib=all -fintelfpga %t_aoco.a -Xshardware -### %s 2>&1 \
4848
// RUN: | FileCheck -check-prefix=CHK-FPGA-AOCO %s

clang/test/Driver/sycl-intelfpga-aoco.cpp

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
// RUN: llc -filetype=obj -o %t-aoco_cl.o %t-aoco_cl.bc
1414
// RUN: llvm-ar crv %t_aoco.a %t.o %t2.o %t-aoco.o
1515
// RUN: llvm-ar crv %t_aoco_cl.a %t.o %t2_cl.o %t-aoco_cl.o
16-
// RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-device-lib=all -fintelfpga %t_aoco.a %s -ccc-print-phases 2>&1 \
16+
// RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-device-lib=all -fintelfpga -Xshardware %t_aoco.a %s -ccc-print-phases 2>&1 \
1717
// RUN: | FileCheck -check-prefix=CHK-FPGA-AOCO-PHASES %s
1818
// CHK-FPGA-AOCO-PHASES: 0: input, "[[INPUTA:.+\.a]]", object, (host-sycl)
1919
// CHK-FPGA-AOCO-PHASES: 1: input, "[[INPUTCPP:.+\.cpp]]", c++, (host-sycl)
@@ -46,7 +46,7 @@
4646
// CHK-FPGA-AOCO-PHASES: 28: offload, "host-sycl (x86_64-unknown-linux-gnu)" {12}, "device-sycl (spir64_fpga-unknown-unknown-sycldevice)" {27}, image
4747

4848
/// FPGA AOCO Windows phases check
49-
// RUN: %clang_cl -fsycl -fno-sycl-device-lib=all -fintelfpga -foffload-static-lib=%t_aoco_cl.a %s -ccc-print-phases 2>&1 \
49+
// RUN: %clang_cl -fsycl -fno-sycl-device-lib=all -fintelfpga -Xshardware %t_aoco_cl.a %s -ccc-print-phases 2>&1 \
5050
// RUN: | FileCheck -check-prefixes=CHK-FPGA-AOCO-PHASES-WIN %s
5151
// CHK-FPGA-AOCO-PHASES-WIN: 0: input, "[[INPUTA:.+\.a]]", object, (host-sycl)
5252
// CHK-FPGA-AOCO-PHASES-WIN: 1: input, "[[INPUTSRC:.+\.cpp]]", c++, (host-sycl)
@@ -100,3 +100,52 @@
100100
// CHK-FPGA-AOCO-WIN: llc{{.*}} "-filetype=obj" "-o" "[[FINALOBJW:.+\.obj]]" "[[FINALBC]]"
101101
// CHK-FPGA-AOCO-LIN: ld{{.*}} "[[INPUTLIB]]" {{.*}} "[[FINALOBJL]]"
102102
// CHK-FPGA-AOCO-WIN: link.exe{{.*}} "{{.*}}[[INPUTLIB]]" {{.*}} "[[FINALOBJW]]"
103+
104+
/// aoco archive check with emulation
105+
// RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-device-lib=all -fintelfpga %t_aoco.a %s -ccc-print-phases 2>&1 \
106+
// RUN: | FileCheck -check-prefix=CHK-FPGA-AOCO-PHASES-EMU %s
107+
// CHK-FPGA-AOCO-PHASES-EMU: 0: input, "[[INPUTA:.+\.a]]", object, (host-sycl)
108+
// CHK-FPGA-AOCO-PHASES-EMU: 1: input, "[[INPUTCPP:.+\.cpp]]", c++, (host-sycl)
109+
// CHK-FPGA-AOCO-PHASES-EMU: 2: preprocessor, {1}, c++-cpp-output, (host-sycl)
110+
// CHK-FPGA-AOCO-PHASES-EMU: 3: append-footer, {2}, c++, (host-sycl)
111+
// CHK-FPGA-AOCO-PHASES-EMU: 4: preprocessor, {3}, c++-cpp-output, (host-sycl)
112+
// CHK-FPGA-AOCO-PHASES-EMU: 5: input, "[[INPUTCPP]]", c++, (device-sycl)
113+
// CHK-FPGA-AOCO-PHASES-EMU: 6: preprocessor, {5}, c++-cpp-output, (device-sycl)
114+
// CHK-FPGA-AOCO-PHASES-EMU: 7: compiler, {6}, ir, (device-sycl)
115+
// CHK-FPGA-AOCO-PHASES-EMU: 8: offload, "host-sycl (x86_64-unknown-linux-gnu)" {4}, "device-sycl (spir64_fpga-unknown-unknown-sycldevice)" {7}, c++-cpp-output
116+
// CHK-FPGA-AOCO-PHASES-EMU: 9: compiler, {8}, ir, (host-sycl)
117+
// CHK-FPGA-AOCO-PHASES-EMU: 10: backend, {9}, assembler, (host-sycl)
118+
// CHK-FPGA-AOCO-PHASES-EMU: 11: assembler, {10}, object, (host-sycl)
119+
// CHK-FPGA-AOCO-PHASES-EMU: 12: linker, {0, 11}, image, (host-sycl)
120+
// CHK-FPGA-AOCO-PHASES-EMU: 13: linker, {0, 11}, host_dep_image, (host-sycl)
121+
// CHK-FPGA-AOCO-PHASES-EMU: 14: clang-offload-deps, {13}, ir, (host-sycl)
122+
// CHK-FPGA-AOCO-PHASES-EMU: 15: input, "[[INPUTA]]", archive
123+
// CHK-FPGA-AOCO-PHASES-EMU: 16: clang-offload-unbundler, {15}, archive
124+
// CHK-FPGA-AOCO-PHASES-EMU: 17: linker, {7, 14, 16}, ir, (device-sycl)
125+
// CHK-FPGA-AOCO-PHASES-EMU: 18: sycl-post-link, {17}, tempfiletable, (device-sycl)
126+
// CHK-FPGA-AOCO-PHASES-EMU: 19: file-table-tform, {18}, tempfilelist, (device-sycl)
127+
// CHK-FPGA-AOCO-PHASES-EMU: 20: llvm-spirv, {19}, tempfilelist, (device-sycl)
128+
// CHK-FPGA-AOCO-PHASES-EMU: 21: input, "[[INPUTA]]", archive
129+
// CHK-FPGA-AOCO-PHASES-EMU: 22: clang-offload-unbundler, {21}, fpga_dep_list
130+
// CHK-FPGA-AOCO-PHASES-EMU: 23: backend-compiler, {20, 22}, fpga_aocx, (device-sycl)
131+
// CHK-FPGA-AOCO-PHASES-EMU: 24: file-table-tform, {18, 23}, tempfiletable, (device-sycl)
132+
// CHK-FPGA-AOCO-PHASES-EMU: 25: clang-offload-wrapper, {24}, object, (device-sycl)
133+
// CHK-FPGA-AOCO-PHASES-EMU: 26: offload, "host-sycl (x86_64-unknown-linux-gnu)" {12}, "device-sycl (spir64_fpga-unknown-unknown-sycldevice)" {25}, image
134+
135+
/// aoco emulation test, checking tools
136+
// RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-device-lib=all -fintelfpga %t_aoco.a -### %s 2>&1 \
137+
// RUN: | FileCheck -check-prefixes=CHK-FPGA-AOCO-EMU,CHK-FPGA-AOCO-EMU-LIN %s
138+
// RUN: %clang_cl -fsycl -fno-sycl-device-lib=all -fintelfpga %t_aoco_cl.a -### %s 2>&1 \
139+
// RUN: | FileCheck -check-prefixes=CHK-FPGA-AOCO-EMU,CHK-FPGA-AOCO-EMU-WIN %s
140+
// CHK-FPGA-AOCO-EMU: clang-offload-bundler{{.*}} "-type=a" "-targets=sycl-spir64_fpga-unknown-unknown-sycldevice" "-inputs=[[INPUTLIB:.+\.a]]" "-outputs=[[OUTLIB:.+\.a]]" "-unbundle"
141+
// CHK-FPGA-AOCO-EMU: llvm-link{{.*}} "[[OUTLIB]]" "-o" "[[LINKEDBC:.+\.bc]]"
142+
// CHK-FPGA-AOCO-EMU: sycl-post-link{{.*}} "-split-esimd"{{.*}} "-O2" "-spec-const=default" "-o" "[[SPLTABLE:.+\.table]]" "[[LINKEDBC]]"
143+
// CHK-FPGA-AOCO-EMU: file-table-tform{{.*}} "-o" "[[TABLEOUT:.+\.txt]]" "[[SPLTABLE]]"
144+
// CHK-FPGA-AOCO-EMU: llvm-spirv{{.*}} "-o" "[[TARGSPV:.+\.txt]]" {{.*}} "[[TABLEOUT]]"
145+
// CHK-FPGA-AOCO-EMU: opencl-aot{{.*}} "-device=fpga_fast_emu" "-spv=[[TARGSPV]]" "-ir=[[AOCXOUT:.+\.aocx]]"
146+
// CHK-FPGA-AOCO-EMU: file-table-tform{{.*}} "-o" "[[TABLEOUT2:.+\.table]]" "[[SPLTABLE]]" "[[AOCXOUT]]"
147+
// CHK-FPGA-AOCO-EMU: clang-offload-wrapper{{.*}} "-o=[[FINALBC:.+\.bc]]" {{.*}} "-target=spir64_fpga" "-kind=sycl" "-batch" "[[TABLEOUT2]]"
148+
// CHK-FPGA-AOCO-EMU-LIN: llc{{.*}} "-filetype=obj" "-o" "[[FINALOBJL:.+\.o]]" "[[FINALBC]]"
149+
// CHK-FPGA-AOCO-EMU-WIN: llc{{.*}} "-filetype=obj" "-o" "[[FINALOBJW:.+\.obj]]" "[[FINALBC]]"
150+
// CHK-FPGA-AOCO-EMU-LIN: ld{{.*}} "[[INPUTLIB]]" {{.*}} "[[FINALOBJL]]"
151+
// CHK-FPGA-AOCO-EMU-WIN: link.exe{{.*}} "{{.*}}[[INPUTLIB]]" {{.*}} "[[FINALOBJW]]"

0 commit comments

Comments
 (0)