Skip to content

Commit a2e900d

Browse files
committed
[Driver][SYCL][FPGA] Process aoco as regular archives for emulation
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 f09832c commit a2e900d

File tree

4 files changed

+104
-8
lines changed

4 files changed

+104
-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

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
// UNSUPPORTED: system-windows
2+
3+
/// -fintelfpga static lib (aoco)
4+
// RUN: echo "Dummy AOCO image" > %t.aoco
5+
// RUN: echo "void foo() {}" > %t.c
6+
// RUN: echo "void foo2() {}" > %t2.c
7+
// RUN: %clang -c -o %t.o %t.c
8+
// RUN: %clang -fsycl -c -o %t2.o %t2.c
9+
// RUN: %clang_cl -fsycl -c -o %t2_cl.o %t2.c
10+
// RUN: clang-offload-wrapper -o %t-aoco.bc -host=x86_64-unknown-linux-gnu -kind=sycl -target=fpga_aoco-intel-unknown-sycldevice %t.aoco
11+
// RUN: llc -filetype=obj -o %t-aoco.o %t-aoco.bc
12+
// RUN: clang-offload-wrapper -o %t-aoco_cl.bc -host=x86_64-unknown-linux-gnu -kind=sycl -target=fpga_aoco-intel-unknown-sycldevice %t.aoco
13+
// RUN: llc -filetype=obj -o %t-aoco_cl.o %t-aoco_cl.bc
14+
// RUN: llvm-ar crv %t_aoco.a %t.o %t2.o %t-aoco.o
15+
// 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 \
17+
// RUN: | FileCheck -check-prefix=CHK-FPGA-AOCO-PHASES %s
18+
// CHK-FPGA-AOCO-PHASES: 0: input, "[[INPUTA:.+\.a]]", object, (host-sycl)
19+
// CHK-FPGA-AOCO-PHASES: 1: input, "[[INPUTCPP:.+\.cpp]]", c++, (host-sycl)
20+
// CHK-FPGA-AOCO-PHASES: 2: preprocessor, {1}, c++-cpp-output, (host-sycl)
21+
// CHK-FPGA-AOCO-PHASES: 3: append-footer, {2}, c++, (host-sycl)
22+
// CHK-FPGA-AOCO-PHASES: 4: preprocessor, {3}, c++-cpp-output, (host-sycl)
23+
// CHK-FPGA-AOCO-PHASES: 5: input, "[[INPUTCPP]]", c++, (device-sycl)
24+
// CHK-FPGA-AOCO-PHASES: 6: preprocessor, {5}, c++-cpp-output, (device-sycl)
25+
// CHK-FPGA-AOCO-PHASES: 7: compiler, {6}, ir, (device-sycl)
26+
// CHK-FPGA-AOCO-PHASES: 8: offload, "host-sycl (x86_64-unknown-linux-gnu)" {4}, "device-sycl (spir64_fpga-unknown-unknown-sycldevice)" {7}, c++-cpp-output
27+
// CHK-FPGA-AOCO-PHASES: 9: compiler, {8}, ir, (host-sycl)
28+
// CHK-FPGA-AOCO-PHASES: 10: backend, {9}, assembler, (host-sycl)
29+
// CHK-FPGA-AOCO-PHASES: 11: assembler, {10}, object, (host-sycl)
30+
// CHK-FPGA-AOCO-PHASES: 12: linker, {0, 11}, image, (host-sycl)
31+
// CHK-FPGA-AOCO-PHASES: 13: linker, {0, 11}, host_dep_image, (host-sycl)
32+
// CHK-FPGA-AOCO-PHASES: 14: clang-offload-deps, {13}, ir, (host-sycl)
33+
// CHK-FPGA-AOCO-PHASES: 15: input, "[[INPUTA]]", archive
34+
// CHK-FPGA-AOCO-PHASES: 16: clang-offload-unbundler, {15}, archive
35+
// CHK-FPGA-AOCO-PHASES: 17: linker, {7, 14, 16}, ir, (device-sycl)
36+
// CHK-FPGA-AOCO-PHASES: 18: sycl-post-link, {17}, tempfiletable, (device-sycl)
37+
// CHK-FPGA-AOCO-PHASES: 19: file-table-tform, {18}, tempfilelist, (device-sycl)
38+
// CHK-FPGA-AOCO-PHASES: 20: llvm-spirv, {19}, tempfilelist, (device-sycl)
39+
// CHK-FPGA-AOCO-PHASES: 21: input, "[[INPUTA]]", archive
40+
// CHK-FPGA-AOCO-PHASES: 22: clang-offload-unbundler, {21}, fpga_dep_list
41+
// CHK-FPGA-AOCO-PHASES: 23: backend-compiler, {20, 22}, fpga_aocx, (device-sycl)
42+
// CHK-FPGA-AOCO-PHASES: 24: file-table-tform, {18, 23}, tempfiletable, (device-sycl)
43+
// CHK-FPGA-AOCO-PHASES: 25: clang-offload-wrapper, {24}, object, (device-sycl)
44+
// CHK-FPGA-AOCO-PHASES: 26: offload, "host-sycl (x86_64-unknown-linux-gnu)" {12}, "device-sycl (spir64_fpga-unknown-unknown-sycldevice)" {25}, image
45+
46+
/// FPGA AOCO Windows phases check
47+
// RUN: %clang_cl -fsycl -fno-sycl-device-lib=all -fintelfpga %t_aoco_cl.a %s -ccc-print-phases 2>&1 \
48+
// RUN: | FileCheck -check-prefixes=CHK-FPGA-AOCO-PHASES-WIN %s
49+
// CHK-FPGA-AOCO-PHASES-WIN: 0: input, "[[INPUTA:.+\.a]]", object, (host-sycl)
50+
// CHK-FPGA-AOCO-PHASES-WIN: 1: input, "[[INPUTSRC:.+\.cpp]]", c++, (host-sycl)
51+
// CHK-FPGA-AOCO-PHASES-WIN: 2: preprocessor, {1}, c++-cpp-output, (host-sycl)
52+
// CHK-FPGA-AOCO-PHASES-WIN: 3: append-footer, {2}, c++, (host-sycl)
53+
// CHK-FPGA-AOCO-PHASES-WIN: 4: preprocessor, {3}, c++-cpp-output, (host-sycl)
54+
// CHK-FPGA-AOCO-PHASES-WIN: 5: input, "[[INPUTSRC]]", c++, (device-sycl)
55+
// CHK-FPGA-AOCO-PHASES-WIN: 6: preprocessor, {5}, c++-cpp-output, (device-sycl)
56+
// CHK-FPGA-AOCO-PHASES-WIN: 7: compiler, {6}, ir, (device-sycl)
57+
// CHK-FPGA-AOCO-PHASES-WIN: 8: offload, "host-sycl (x86_64-pc-windows-msvc)" {4}, "device-sycl (spir64_fpga-unknown-unknown-sycldevice)" {7}, c++-cpp-output
58+
// CHK-FPGA-AOCO-PHASES-WIN: 9: compiler, {8}, ir, (host-sycl)
59+
// CHK-FPGA-AOCO-PHASES-WIN: 10: backend, {9}, assembler, (host-sycl)
60+
// CHK-FPGA-AOCO-PHASES-WIN: 11: assembler, {10}, object, (host-sycl)
61+
// CHK-FPGA-AOCO-PHASES-WIN: 12: linker, {0, 11}, image, (host-sycl)
62+
// CHK-FPGA-AOCO-PHASES-WIN: 13: linker, {0, 11}, host_dep_image, (host-sycl)
63+
// CHK-FPGA-AOCO-PHASES-WIN: 14: clang-offload-deps, {13}, ir, (host-sycl)
64+
// CHK-FPGA-AOCO-PHASES-WIN: 15: input, "[[INPUTA]]", archive
65+
// CHK-FPGA-AOCO-PHASES-WIN: 16: clang-offload-unbundler, {15}, archive
66+
// CHK-FPGA-AOCO-PHASES-WIN: 17: linker, {7, 14, 16}, ir, (device-sycl)
67+
// CHK-FPGA-AOCO-PHASES-WIN: 18: sycl-post-link, {17}, tempfiletable, (device-sycl)
68+
// CHK-FPGA-AOCO-PHASES-WIN: 19: file-table-tform, {18}, tempfilelist, (device-sycl)
69+
// CHK-FPGA-AOCO-PHASES-WIN: 20: llvm-spirv, {19}, tempfilelist, (device-sycl)
70+
// CHK-FPGA-AOCO-PHASES-WIN: 21: input, "[[INPUTA]]", archive
71+
// CHK-FPGA-AOCO-PHASES-WIN: 22: clang-offload-unbundler, {21}, fpga_dep_list
72+
// CHK-FPGA-AOCO-PHASES-WIN: 23: backend-compiler, {20, 22}, fpga_aocx, (device-sycl)
73+
// CHK-FPGA-AOCO-PHASES-WIN: 24: file-table-tform, {18, 23}, tempfiletable, (device-sycl)
74+
// CHK-FPGA-AOCO-PHASES-WIN: 25: clang-offload-wrapper, {24}, object, (device-sycl)
75+
// CHK-FPGA-AOCO-PHASES-WIN: 26: offload, "host-sycl (x86_64-pc-windows-msvc)" {12}, "device-sycl (spir64_fpga-unknown-unknown-sycldevice)" {25}, image
76+
sycl-build:1459>
77+
78+
/// aoco test, checking tools
79+
// RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-device-lib=all -fintelfpga %t_aoco.a -### %s 2>&1 \
80+
// RUN: | FileCheck -check-prefixes=CHK-FPGA-AOCO,CHK-FPGA-AOCO-LIN %s
81+
// RUN: %clang_cl -fsycl -fno-sycl-device-lib=all -fintelfpga %t_aoco_cl.a -### %s 2>&1 \
82+
// RUN: | FileCheck -check-prefixes=CHK-FPGA-AOCO,CHK-FPGA-AOCO-WIN %s
83+
// CHK-FPGA-AOCO: clang-offload-bundler{{.*}} "-type=a" "-targets=sycl-spir64_fpga-unknown-unknown-sycldevice" "-inputs=[[INPUTLIB:.+\.a]]" "-outputs=[[OUTLIB:.+\.a]]" "-unbundle"
84+
// CHK-FPGA-AOCO: llvm-link{{.*}} "[[OUTLIB]]" "-o" "[[LINKEDBC:.+\.bc]]"
85+
// CHK-FPGA-AOCO: sycl-post-link{{.*}} "-split-esimd"{{.*}} "-O2" "-spec-const=default" "-o" "[[SPLTABLE:.+\.table]]" "[[LINKEDBC]]"
86+
// CHK-FPGA-AOCO: file-table-tform{{.*}} "-o" "[[TABLEOUT:.+\.txt]]" "[[SPLTABLE]]"
87+
// CHK-FPGA-AOCO: llvm-spirv{{.*}} "-o" "[[TARGSPV:.+\.txt]]" {{.*}} "[[TABLEOUT]]"
88+
// CHK-FPGA-AOCO: opencl-aot{{.*}} "-device=fpga_fast_emu" "-spv=[[TARGSPV]]" "-ir=[[AOCXOUT:.+\.aocx]]"
89+
// CHK-FPGA-AOCO: file-table-tform{{.*}} "-o" "[[TABLEOUT2:.+\.table]]" "[[SPLTABLE]]" "[[AOCXOUT]]"
90+
// CHK-FPGA-AOCO: clang-offload-wrapper{{.*}} "-o=[[FINALBC:.+\.bc]]" {{.*}} "-target=spir64_fpga" "-kind=sycl" "-batch" "[[TABLEOUT2]]"
91+
// CHK-FPGA-AOCO-LIN: llc{{.*}} "-filetype=obj" "-o" "[[FINALOBJL:.+\.o]]" "[[FINALBC]]"
92+
// CHK-FPGA-AOCO-WIN: llc{{.*}} "-filetype=obj" "-o" "[[FINALOBJW:.+\.obj]]" "[[FINALBC]]"
93+
// CHK-FPGA-AOCO-LIN: ld{{.*}} "[[INPUTLIB]]" {{.*}} "[[FINALOBJL]]"
94+
// CHK-FPGA-AOCO-WIN: link.exe{{.*}} "{{.*}}[[INPUTLIB]]" {{.*}} "[[FINALOBJW]]"

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: 2 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)

0 commit comments

Comments
 (0)