From c614b050c23f68f2df17eaa3aec4052aad3c1817 Mon Sep 17 00:00:00 2001 From: Nicolas Miller Date: Thu, 17 Nov 2022 14:04:49 +0000 Subject: [PATCH] [SYCL] Move offload mismatch warning into SYCLActionBuilder The SYCLActionBuilder handles the parsing of the arguments to determine the SYCL triples and architectures being used, so doing the check here means we can just re-use that rather than having to parse the triples and target arguments again. This fixes the issue where for CUDA and HIP the specific architecture is embedded in the offload binary section name but is passed as a different argument and is not in the triple of `-fsycl-targets`. --- clang/lib/Driver/Driver.cpp | 143 ++++++++---------- .../Driver/Inputs/SYCL/libamdgcn-gfx908.a | Bin 0 -> 3824 bytes .../Driver/Inputs/SYCL/libnvptx64-sm_50.a | Bin 0 -> 3800 bytes .../Driver/Inputs/SYCL/objamdgcn-gfx908.o | Bin 0 -> 3600 bytes .../Driver/Inputs/SYCL/objnvptx64-sm_50.o | Bin 0 -> 3576 bytes clang/test/Driver/sycl-target-mismatch.cpp | 55 ++++++- 6 files changed, 119 insertions(+), 79 deletions(-) create mode 100644 clang/test/Driver/Inputs/SYCL/libamdgcn-gfx908.a create mode 100644 clang/test/Driver/Inputs/SYCL/libnvptx64-sm_50.a create mode 100644 clang/test/Driver/Inputs/SYCL/objamdgcn-gfx908.o create mode 100644 clang/test/Driver/Inputs/SYCL/objnvptx64-sm_50.o diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 229bb2ce0f462..fa12bf31b30bc 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -1731,9 +1731,6 @@ Compilation *Driver::BuildCompilation(ArrayRef ArgList) { if (checkForSYCLDefaultDevice(*C, *TranslatedArgs)) setSYCLDefaultTriple(true); - // Check missing targets in archives/objects based on inputs from the user. - checkForOffloadMismatch(*C, *TranslatedArgs); - // Populate the tool chains for the offloading devices, if any. CreateOffloadingDeviceToolChains(*C, Inputs); @@ -3606,81 +3603,6 @@ bool Driver::checkForOffloadStaticLib(Compilation &C, return false; } -// Goes through all of the arguments, including inputs expected for the -// linker directly, to determine if the targets contained in the objects and -// archives match target expectations being performed. -void Driver::checkForOffloadMismatch(Compilation &C, - DerivedArgList &Args) const { - // Check only if enabled with -fsycl - if (!Args.hasFlag(options::OPT_fsycl, options::OPT_fno_sycl, false)) - return; - - SmallVector OffloadLibArgs(getLinkerArgs(C, Args, true)); - // Gather all of the sections seen in the offload objects/archives - SmallVector UniqueSections; - for (StringRef OLArg : OffloadLibArgs) { - SmallVector Sections(getOffloadSections(C, OLArg)); - for (auto Section : Sections) { - // We only care about sections that start with 'sycl-'. Also remove - // the prefix before adding it. - std::string Prefix("sycl-"); - if (Section.compare(0, Prefix.length(), Prefix) != 0) - continue; - std::string Arch = Section.substr(Prefix.length()); - // There are a few different variants for FPGA, if we see one, just - // use the default FPGA triple to reduce possible match confusion. - if (Arch.compare(0, 4, "fpga") == 0) - Arch = C.getDriver().MakeSYCLDeviceTriple("spir64_fpga").str(); - if (std::find(UniqueSections.begin(), UniqueSections.end(), Arch) == - UniqueSections.end()) - UniqueSections.push_back(Arch); - } - } - - if (!UniqueSections.size()) - return; - - // Put together list of user defined and implied targets, we will diagnose - // each target individually. - SmallVector Targets; - if (const Arg *A = Args.getLastArg(options::OPT_fsycl_targets_EQ)) { - for (StringRef Val : A->getValues()) { - if (auto ValidDevice = isIntelGPUTarget(Val)) { - if (!ValidDevice->empty()) - Targets.push_back(Args.MakeArgString( - C.getDriver().MakeSYCLDeviceTriple("spir64_gen").str() + "-" + - *ValidDevice)); - continue; - } - Targets.push_back(Val); - } - } else { // Implied targets - // No -fsycl-targets given, check based on -fintelfpga or default device - bool SYCLfpga = C.getInputArgs().hasArg(options::OPT_fintelfpga); - // -fsycl -fintelfpga implies spir64_fpga - Targets.push_back(SYCLfpga ? "spir64_fpga" : getDefaultSYCLArch(C)); - } - - for (auto SyclTarget : Targets) { - // Match found sections with user and implied targets. - llvm::Triple TT(C.getDriver().MakeSYCLDeviceTriple(SyclTarget)); - // If any matching section is found, we are good. - if (std::find(UniqueSections.begin(), UniqueSections.end(), TT.str()) != - UniqueSections.end()) - continue; - // Didn't find any matches, return the full list for the diagnostic. - SmallString<128> ArchListStr; - int Cnt = 0; - for (std::string Section : UniqueSections) { - if (Cnt) - ArchListStr += ", "; - ArchListStr += Section; - Cnt++; - } - Diag(diag::warn_drv_sycl_target_missing) << SyclTarget << ArchListStr; - } -} - /// Check whether the given input tree contains any clang-offload-dependency /// actions. static bool ContainsOffloadDepsAction(const Action *A) { @@ -5718,6 +5640,68 @@ class OffloadingActionBuilder final { return false; } + // Goes through all of the arguments, including inputs expected for the + // linker directly, to determine if the targets contained in the objects and + // archives match target expectations being performed. + void + checkForOffloadMismatch(Compilation &C, DerivedArgList &Args, + SmallVector &Targets) const { + if (Targets.empty()) + return; + + SmallVector OffloadLibArgs( + getLinkerArgs(C, Args, true)); + // Gather all of the sections seen in the offload objects/archives + SmallVector UniqueSections; + for (StringRef OLArg : OffloadLibArgs) { + SmallVector Sections(getOffloadSections(C, OLArg)); + for (auto Section : Sections) { + // We only care about sections that start with 'sycl-'. Also remove + // the prefix before adding it. + std::string Prefix("sycl-"); + if (Section.compare(0, Prefix.length(), Prefix) != 0) + continue; + + std::string Arch = Section.substr(Prefix.length()); + + // There are a few different variants for FPGA, if we see one, just + // use the default FPGA triple to reduce possible match confusion. + if (Arch.compare(0, 4, "fpga") == 0) + Arch = C.getDriver().MakeSYCLDeviceTriple("spir64_fpga").str(); + if (std::find(UniqueSections.begin(), UniqueSections.end(), Arch) == + UniqueSections.end()) + UniqueSections.push_back(Arch); + } + } + + if (!UniqueSections.size()) + return; + + for (auto SyclTarget : Targets) { + std::string SectionTriple = SyclTarget.TC->getTriple().str(); + if (SyclTarget.BoundArch) { + SectionTriple += "-"; + SectionTriple += SyclTarget.BoundArch; + } + + // If any matching section is found, we are good. + if (std::find(UniqueSections.begin(), UniqueSections.end(), + SectionTriple) != UniqueSections.end()) + continue; + // Didn't find any matches, return the full list for the diagnostic. + SmallString<128> ArchListStr; + int Cnt = 0; + for (std::string Section : UniqueSections) { + if (Cnt) + ArchListStr += ", "; + ArchListStr += Section; + Cnt++; + } + C.getDriver().Diag(diag::warn_drv_sycl_target_missing) + << SectionTriple << ArchListStr; + } + } + bool initialize() override { // Get the SYCL toolchains. If we don't get any, the action builder will // know there is nothing to do related to SYCL offloading. @@ -5914,6 +5898,9 @@ class OffloadingActionBuilder final { const auto *TC = ToolChains.front(); SYCLTargetInfoList.emplace_back(TC, nullptr); } + + checkForOffloadMismatch(C, Args, SYCLTargetInfoList); + DeviceLinkerInputs.resize(SYCLTargetInfoList.size()); return false; } diff --git a/clang/test/Driver/Inputs/SYCL/libamdgcn-gfx908.a b/clang/test/Driver/Inputs/SYCL/libamdgcn-gfx908.a new file mode 100644 index 0000000000000000000000000000000000000000..15c9c5ceafac8702684451b0533f3f9d7e62dd9d GIT binary patch literal 3824 zcmcH+ZERE5^*SbbCNb|lSXz?BcAuNDX3&I(9fFOM){c`9Mh1osDXXaL7k?xvvHkMw zI8Nv`Cr|B3D z#=wtB+mY@)_k7-S&%O7&`_v7bVDEmdcr)`PusLLUoZB4 z2GHhwXIa(fV9m;8wqkGR+nn3cW%tx{xq^CDSL@weym>{Qc92WvMpa)|mr~Hyvl$gz z@sC>CTMHyOyfjGAYpGzfbQW7mvLl3ysi6^-fad|CX)Vffq6}l2^28> z9M}!~Rp_6OpCy)}f~VLxL+f(*skwm1WHhnG6IR*Hwpz{YrrkTNdscjAK|RIogP1O^t;`IHJo;v zV;iKB=TWW4>vz`f*uB5T=jZGPQ7z7@m2)^?1G-SH;OymUo!wTKz`32M*5?=eTqoc` zH^$Ek$v0^4t;w7&KzP{g<1z;gHJLA5-wNAM2rKQBvsK^y{)etV{OjzVim9q*iKY;# z)b?JS}-`lFIj`G!JSxoXuFy+ zm#1V*XDd=~s*1_g8=xzHMgH!|s7>QIz*N~sF2pKPSYP0v)%5St)uPk}edAYrHzDZ6 zK3=Ssi2)|v6aJXU&(P}^r;C>3M8HT4*$6+3>C_;_aU)8I6F!C*VhI66Y-*6=fXJU~ zWqCpr$g#QuZqwduRG*C)qKUwC(L)9^!L!>&t@wXvB!XGZ!IY*D!U}y+0>Th18N+@M zF$DA=>Zh>?_u!Kz_>|i|Lq||NgPI6JXUY(|1bSLoNO5sq;VP9hj+u3%iAYn37z`4=SfBhRqQ0QX z2O&}`Z&FQ8D6gDQxY)v!TDT%9ZJaVUMx>3&V8qW8hh)THo5=IT5HAe`MV=AMlWWPP zC^^qk9+tYXOfFkUEqzgWU9Ff=DOA2v*z^=G9G=fe%7QbTgNG+-kRbrajV zMFIMd$VWxqMg*#fz@tKNI}j4BGO@2r6k_6FZ1~l?%jDfT@~aEv5-aVTI-yuNp-86s zSx#|Tt++U>yv!B-J!;lZnf0+$e=eaLH|xfvhVjH^nDpxr!{4Na(+T-UJtE&B3Vhh# zO$2SCzfAPU#quj}Pyin>X>%haY;`7(Buu41oHk|(VaPR!9qS_D?eT06qCcsnfdigYUNF}@}gP^J9u0D zl8gDJ;k>!=oK!y^)+am8!|uakhak>2aex=g|8k4G$5Qifc#YJZILwleNPVXWSc?^I zHjgvxpN6d*9yRIb5|Fw^*r}xPVqAIogmTWLx;~+BRoPi`9`7#&P8M0SI^17I_}WBk zTzn@4wr9pA4Ut5{ctSUA-VVnp2^o{Osb6T~R1oTw3FW@wQWw)@BtPXzkC9xoky=Ha zQ50lE5N87?cCZZ+E0*v0W-{Cmks8h?bZ{-uAcK$%u%K#V%wzKM)qmPp?|{9V6Rf_TA*W@h znQ3;fPfs4XL?3@AX1R=y*YWED-C zL|p!nJki8zWrQ{yt<%aPTC*idmuc3;;*pt|rB4oga((Kvnac-~Gm}?twyKX4KM{t) zn|u{^-+SR*$9!it9s9+uL%xa)(W99D!1vzJ?~YY$s@M?Qmr)x8)fKJyKF?? zjl5-n>q;%)OH19dkPl9WhKa%IR5b~Ta1-!d>fnzjbY~@oli|kkM8QEQOp4ig#Vn&( z;BbF?ST)HhrcWrQ(iec6kWdd8YTiOYO)MEp9Yg}hc$G#-1(--SoD3U|LvfKd#={Lz zXrc)TADuPpW}yCrp~@Mi6DEPW$55a1YG`Up6|*~^EH zObV{$334-oMXy7{yzKiF^Dr1w{nLCp!_T4?7+`xg%gEr?47TR+v-4*$mS@Mgs=v-9 za>n_(BWZhn<+YK~J(a<_99uk;<_lFYu)8k1+~C zTY-)F0c9ll@s9)lS*mjxeOm@&JG{^N^B)IZ#%BnIE0CR^!B->)^5@6mXW4%z^Z%Bw HpHKe>7CNxr literal 0 HcmV?d00001 diff --git a/clang/test/Driver/Inputs/SYCL/libnvptx64-sm_50.a b/clang/test/Driver/Inputs/SYCL/libnvptx64-sm_50.a new file mode 100644 index 0000000000000000000000000000000000000000..a636d8e083105f900d0cb79956d5e59a048ba6f6 GIT binary patch literal 3800 zcmcH+ZA@F&_1OlV1J1LP(i9ZieGarG?J&9jB;)j1^5@=bMO{x6Y3B$3y_bJlr5~wv`X2z{>X@% zOxn5~y?f6+=bm%!x#!+{?tO|{#%=3(J->o{5~xjNs=c`;NmX@5z><$)7!S%>^IIBc zPmd3)$TpS{eFj!P9?X*8V|~ZvW4-?B%5qP)xr$QuRODAY?oS!mOm6n7y0S7UpsA`! zduPf2QDaLJpNHH_0S|jU>1>A1V7egF!Z3ZZsmBUH@@VtPmA9jqt&4HBlRk&r)7j&K z$tx)(MV7U9di78``m9P@Pxqcqm)Fr%(beVaRsxr-VpKG3tEsftSRIvWwbo&?YN}PL zYKNNEXlWZmYb)(q#%kS-hAT{t34t6ugz@|m-cAuN41?QJ;G=>d4^;+2@*dx~HO~M7 zh<*m_2YwFr=SNTL7GV5uuu+7zZ{jD%0v?%`L>fH2YHB%PXfW3w z-QUpCXf}8Bc)aC)y4nmY+2=au>gjitcXhh@{N?SgK1}I#_`Mj4TDQaH#q53E-2>${ z8m3A`D{U-`DP28YhjQ=!qvakiV>^Z^QB=*0-3|-Tjw#)aE=K9-Fgx8$w*ympylyXJ z1w7D=@UvX<4A{ELGrP;>>$G<=<+eUMliF!mz47v56|6%pOw}r)O5b?%6X&n~apAzu zSZM=Kor@_%81^@aQvqL*48;zR!-FNK46&T=RcK!lHfoYV}AnJEJIR*v^eg45#__nDBfdX>1xHukzID;i6Z|UJa{`Pqv*RqcO01 zlEkpBfYrNVLekoVDPAj$h!ihDRs4$R#M!V#ZEqt>Z9|Dj2^P}w?GlCLL+pAU{|M+j z_j3Ov?jOgGPYU*Q2>K^EFUfg@Ty+sQNOJ6aIB#Vx?~Vocj^jQ(-W?`-NhFQxxxB9= zxDVPEyxSu7koX{lyXW%mCz*&uTHB_>SM@5+8Gzr#f){Mg1WeW z)XU=U3h{wvj%D#dR^an+san`Y!r>ZI;c zNH=HHUJ%q?3e^q^bn*2DMs3WfjU?-fQF_csj|g;Q z(Fz#!>ml9m1-i+o=+jP)ZROl-$lHPYEu6QA^Nw@H*A9#CW8%M&5oWIyD|k;4kvI+J(gM2L<@b(6+A2*}sdwaZ4`2$0dy-{iwgxqk3Rh!2+G z?ntohri56#OstrQ2UN+_4TF4n>4o_v*&;a5T&$Z6)m;ef9FEeXMr}M=dvQt|i^3dh zSnSeIC|>T^@edtnY~t}uK#gZ@zW7%kpDja%{MAG_&Y%yJKV63{C?_&>bG?;ZnLLz z(Bbm=y35@TXP3j~Eq8hcpP*T{!&dI;b$gR}w4CihH<3BibIVpjfTUGW(`eMI6GZT z7hJj}LOnHP5taxqQ$v^pDAf>F1e7Wo&Y2ZOcTpNqd@fE=4Vq}8@TzF~beyC<69rX9 zHZCF6+au$n^Yd$;w|%}CyE{MI7N4KKw%W8?UUvF}GmDAYg)8%ItBD)SZELg3t2Y)G znzo#?BYLgvgT=ecS7w{G{PIXr{YGqd;daw*@fW}T=v#lvFFyVVeg6Yf|Hg?O{xL|>(uF1I0x4Z)P<=ZnpJt?U6Vg~J z88A~k@dhbgGKt}SC>Ti|N*tYs>yp%y36IyF4e8E6q7~GQhiW0|hNI}Y(@UnFG-^V! zD+eh6IACrs0^TkdTSqipWl35MxCIK*YlVUUVMMct05}NcIVg50=ear*~50aedZopmzj0LF?E`bY7B?f`)q@$$LN3Z;C#vx zDERS7X1UD(WcaA@%8C} z;QS>4>7fT}MnA*v0iK}c5kdhdkKwg!htfUS{*M9wX`+d=yd{m19$M$@@y`G+Z8HGP b$B-FcgigpN$Q~bcKTW?T{hyXCpH2T0wW0*s literal 0 HcmV?d00001 diff --git a/clang/test/Driver/Inputs/SYCL/objamdgcn-gfx908.o b/clang/test/Driver/Inputs/SYCL/objamdgcn-gfx908.o new file mode 100644 index 0000000000000000000000000000000000000000..0d0684f09b64a0980b9dc49f4e252189e83b20af GIT binary patch literal 3600 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 \ // RUN: | FileCheck %s -check-prefix=SPIR64_GEN_DIAG -// SPIR64_GEN_DIAG: linked binaries do not contain expected 'spir64_gen' target; found targets: 'spir64-unknown-unknown{{.*}}, spir64-unknown-unknown{{.*}}' [-Wsycl-target] +// SPIR64_GEN_DIAG: linked binaries do not contain expected 'spir64_gen-unknown-unknown' target; found targets: 'spir64-unknown-unknown{{.*}}, spir64-unknown-unknown{{.*}}' [-Wsycl-target] // RUN: %clangxx -fsycl -fsycl-targets=spir64 %S/Inputs/SYCL/liblin64.a \ // RUN: -### %s 2>&1 \ @@ -23,3 +23,56 @@ // RUN: -Wno-sycl-target -### %s 2>&1 \ // RUN: | FileCheck %s -check-prefix=SPIR64_DIAG // SPIR64_DIAG-NOT: linked binaries do not contain expected + +// RUN: %clangxx -fsycl -fsycl-targets=nvptx64-nvidia-cuda -Xsycl-target-backend --cuda-gpu-arch=sm_60 \ +// RUN: %S/Inputs/SYCL/libnvptx64-sm_50.a -### %s 2>&1 \ +// RUN: | FileCheck %s -check-prefix=NVPTX64_DIAG +// RUN: %clangxx -fsycl -fsycl-targets=nvptx64-nvidia-cuda -Xsycl-target-backend --cuda-gpu-arch=sm_60 \ +// RUN: -L%S/Inputs/SYCL -lnvptx64-sm_50 -### %s 2>&1 \ +// RUN: | FileCheck %s -check-prefix=NVPTX64_DIAG +// RUN: %clangxx -fsycl -fsycl-targets=nvptx64-nvidia-cuda -Xsycl-target-backend --cuda-gpu-arch=sm_60 \ +// RUN: %S/Inputs/SYCL/objnvptx64-sm_50.o -### %s 2>&1 \ +// RUN: | FileCheck %s -check-prefix=NVPTX64_DIAG +// NVPTX64_DIAG: linked binaries do not contain expected 'nvptx64-nvidia-cuda-sm_60' target; found targets: 'nvptx64-nvidia-cuda-sm_50' [-Wsycl-target] + +// RUN: %clangxx -fsycl -fsycl-targets=nvptx64-nvidia-cuda -Xsycl-target-backend --cuda-gpu-arch=sm_50 \ +// RUN: %S/Inputs/SYCL/libnvptx64-sm_50.a -### %s 2>&1 \ +// RUN: | FileCheck %s -check-prefix=NVPTX64_MATCH_DIAG +// RUN: %clangxx -fsycl -fsycl-targets=nvptx64-nvidia-cuda -Xsycl-target-backend --cuda-gpu-arch=sm_50 \ +// RUN: -L%S/Inputs/SYCL -lnvptx64-sm_50 -### %s 2>&1 \ +// RUN: | FileCheck %s -check-prefix=NVPTX64_MATCH_DIAG +// RUN: %clangxx -fsycl -fsycl-targets=nvptx64-nvidia-cuda -Xsycl-target-backend --cuda-gpu-arch=sm_50 \ +// RUN: %S/Inputs/SYCL/objnvptx64-sm_50.o -### %s 2>&1 \ +// RUN: | FileCheck %s -check-prefix=NVPTX64_MATCH_DIAG +// RUN: %clangxx -fsycl -fsycl-targets=nvptx64-nvidia-cuda \ +// RUN: %S/Inputs/SYCL/objnvptx64-sm_50.o -### %s 2>&1 \ +// RUN: | FileCheck %s -check-prefix=NVPTX64_MATCH_DIAG +// RUN: %clangxx -fsycl -fsycl-targets=nvptx64-nvidia-cuda -Xsycl-target-backend --cuda-gpu-arch=sm_60 \ +// RUN: -Wno-sycl-target %S/Inputs/SYCL/objnvptx64-sm_50.o -### %s 2>&1 \ +// RUN: | FileCheck %s -check-prefix=NVPTX64_MATCH_DIAG +// NVPTX64_MATCH_DIAG-NOT: linked binaries do not contain expected + +// RUN: %clangxx -fsycl -fsycl-targets=amdgcn-amd-amdhsa -Xsycl-target-backend --offload-arch=gfx906 \ +// RUN: %S/Inputs/SYCL/libamdgcn-gfx908.a -### %s 2>&1 \ +// RUN: | FileCheck %s -check-prefix=AMDGCN_DIAG +// RUN: %clangxx -fsycl -fsycl-targets=amdgcn-amd-amdhsa -Xsycl-target-backend --offload-arch=gfx906 \ +// RUN: -L%S/Inputs/SYCL -lamdgcn-gfx908 -### %s 2>&1 \ +// RUN: | FileCheck %s -check-prefix=AMDGCN_DIAG +// RUN: %clangxx -fsycl -fsycl-targets=amdgcn-amd-amdhsa -Xsycl-target-backend --offload-arch=gfx906 \ +// RUN: %S/Inputs/SYCL/objamdgcn-gfx908.o -### %s 2>&1 \ +// RUN: | FileCheck %s -check-prefix=AMDGCN_DIAG +// AMDGCN_DIAG: linked binaries do not contain expected 'amdgcn-amd-amdhsa-gfx906' target; found targets: 'amdgcn-amd-amdhsa-gfx908' [-Wsycl-target] + +// RUN: %clangxx -fsycl -fsycl-targets=amdgcn-amd-amdhsa -Xsycl-target-backend --offload-arch=gfx908 \ +// RUN: %S/Inputs/SYCL/libamdgcn-gfx908.a -### %s 2>&1 \ +// RUN: | FileCheck %s -check-prefix=AMDGCN_MATCH_DIAG +// RUN: %clangxx -fsycl -fsycl-targets=amdgcn-amd-amdhsa -Xsycl-target-backend --offload-arch=gfx908 \ +// RUN: -L%S/Inputs/SYCL -lamdgcn-gfx908 -### %s 2>&1 \ +// RUN: | FileCheck %s -check-prefix=AMDGCN_MATCH_DIAG +// RUN: %clangxx -fsycl -fsycl-targets=amdgcn-amd-amdhsa -Xsycl-target-backend --offload-arch=gfx908 \ +// RUN: %S/Inputs/SYCL/objamdgcn-gfx908.o -### %s 2>&1 \ +// RUN: | FileCheck %s -check-prefix=AMDGCN_MATCH_DIAG +// RUN: %clangxx -fsycl -fsycl-targets=amdgcn-amd-amdhsa -Xsycl-target-backend --offload-arch=gfx906 \ +// RUN: -Wno-sycl-target %S/Inputs/SYCL/objamdgcn-gfx908.o -### %s 2>&1 \ +// RUN: | FileCheck %s -check-prefix=AMDGCN_MATCH_DIAG +// AMDGCN_MATCH_DIAG-NOT: linked binaries do not contain expected