From bd94fb8d313e2cace74dd1372f7d73aa4246fe1d Mon Sep 17 00:00:00 2001 From: NyanCatTW1 <17372086+NyanCatTW1@users.noreply.github.com> Date: Tue, 23 Apr 2024 23:59:08 +0300 Subject: [PATCH] Handle more types of specifiers in vprintf --- ptx/lib/zluda_ptx_impl.bc | Bin 232076 -> 232464 bytes ptx/lib/zluda_ptx_impl.cpp | 34 +++++++++++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/ptx/lib/zluda_ptx_impl.bc b/ptx/lib/zluda_ptx_impl.bc index 4e441511ffc37584dc5e8960d13debdc46e39a39..a6ddfdaaee3b32a33f7a5a9b50f6e9b4b947b2d5 100644 GIT binary patch delta 1741 zcmXw(ZEzFE8OQhbq_t$9WLcOXV;Ro!O9(wBC&e(XtF~v^i5<*j&P*mH&<-cRsEjQu zPT~(rK13_afK6QcXh5Th(?$j-qo#Q=#sxK`?a4OGr53hKNf9M!MF>+77)L2-#xx=6 z35T8M!+&>v&;Fm?d3J}7=*6&Jtc2>fk5|v=NF=LH+|cdX0k13un}h>R0&%KIfP~Gz zhX7!W%55l60bm9I%yHVo-zg*SxW@qqg4d{9w{>pdsA8gs*RO3gsJPZ5qLbI|<7J|% zjQ@o%ubt!+AIAi9AiPz2iLE@U3A0evDd_U2-flm`>%DBQ&Z~+wYNn&3a2M#NH zkt$BB*!jU1EC5DDS(;?AHNTN;R0{Gu?fvC*d!K%`Pg!51O5ds0fN$P5ct2V9q^94JD17ks^b73J;ICEJxn}@p@@lexdZYAH zP}qMR{V+_rLV_tu`x;C-yD2I<#%p9D(*MlBc{-@abcWD@0hgYp|2ax!-wjvMcfHJ9 zB>mbUe^VZ}>823E)bb=5lk_ztI!e;p>(QQv{Ax<1Dw9vaj)>DZLR<%$zyso4@0|qY zE-_YSfacJqk6^y2CZDf2uAA(?SLf~K*Hu-v77meXB@^rBsV5Aj6?td4ebY9tGGTKQ zHjk_Mya|1Kst>4K_lq~CYIMu!6V4{SIq?LwQwJ`>qqPGGhrGSP^s=TIXU60*ZWRur;_g=|>JzA9uR zLUuw(M}_oTLV8k2PYdaokbYlCOG0{1NXtSxp@h*vKH>*^YF}JhdF1N4U+t+`73UbD zh9_c=RyfGD54nxH#~df9L&eGo-ZZ(Lve7!=?9>+ngPrE~4-Il_;&f@8 zu87k=h|>?p=^w@Eu{eIEO0EMibPxMu4wKf$B}-h|9GC2I$zKE1E0ze_M?Y{>-wG$%S4GsHI5wqCRI_7}2cB3JZtZm7 zKKyd*;OyY=7}^EC5>v<83Ww!X`+BctnV@zEv~s2rrJ={Eo34V%k8AqEYHo(h3+lgheEs!uA!Qe6e;w#&RJmIe zXt#EbF35Fe$|(}5mVnkmqP7r6?QkiEGY_gt8jlwn*zduOIS@C9@rx}4*`ZLr$Uu?A z-QKi#V`N5{lLE>E3vTE{OLL*|^4_+2L7kcGlqSYf_70-XQ&M}q`Xtq6$jpVVP_Qp$p9plU*^Pdp zdBHW$<>!Eo@?5%ArDSFHfwGg-SBA)JD6kR!Hf0}dOcv}$hc$i52UTtZfK>bnH03}> zp11+DqfmKi*aewTp0?%s0@j-fjV8182O!Ql7M2j^g>JCb4WU(g#1(Bw&f#^70Waslr2 zByTYIESg<_gPzDu2LBcPeF4fI+P}=;bLiFrT=8T-XYdkwX%W`;2)7yhAsSzVdwZn+ zG58`ny$A<;_-`0|3H@ymMth_?48Dw(7oprEe#hXC(O?p0dRVO${|g;WLXB6-x8f`4 zy(HY^1$ryKiViHnW^Z!66< delta 1355 zcmaKreN0nV7{<>%w>`b!EnG^4TU5NT`MJwha5!-;J17e{7IWQL=+K#4f?A=i3|K_B zqz76`|8TBq$5>`&UDS0SDg-x)Swbr~2^46P8A1F2=LZb7A@0kGcJ*Wb?&Ljre#!gf zN#5jr-OX{kKZB;4f949XO!Unz2r$t;U(iQ-zlxPc_a#o=O~p zJUelnO1lHRvcTpX%ErJGO$Xq%9)N_XrssFN*T?4BXe9+ewP|}* zjd{CuYqXK57`eZY0W-%q>$T+NOtvv`j`NcdrK!`Mm_u23Q+={m-MMa3p@@2)Ldv-g zf%g@^-@ax~onmDn#}*Ypy<#3n<7o|GI@P%;Bp}*3#ZII#Y1r$^axU3hw}%%hxq4YY z-nh@E7{%KF=B>;KV2{rE5yaJxqih3hY?67OU|7@KXz{L|cI+BNOZj|X<1t!bsxS?V z%`|iJui>c=1&X*SDl4et0())F2fBM(rw)c~&WJ9umB^AqmRz#5TbA6if7XlepK119u8fdnn3u{vdW<&4o7)389> zBpFse0-HQjcf0Z2{8U@*%;*z{dYwrrC6y-QA!S37wnQ@JJ_gxT_fEsP*{Q{~8%LvH zdq`ViKCeq6g)5xzF|IdI3IF`skRx}0BMIeg1I(NHLP1>wN(mpv4GP30s9#`?1JuS| z)LzGU<1JKK2Mn4u%mHppKa0p&yfjrjbnsnUF=F#n*kC6RtVV2?nA@bJ!xVQ#=pLCk z;#cgY=*&X*5!)GD0~9NnELZ6gK`!&-pr-7uo{KI}d_C*m6w3>33SGQMf98mx=*Ied zqrP;+pUc$eW-qD+N%b4M8y?l!bwQ1Zo~L+`ofHy=aHAv6o?5WWt*+5e>Raq(Wo?RK ztTdXY^=#4iyunnO8C_Esitofqo89!gKA6Q``Y-s~MFGQD!=@*tEGfgl%yIO?liA=* z$Bh}CX+vF2htjO2y|QwwWwRgF3}$(9N!$jM&4i4-Kt-)I>t0KXI_YN=Ijx)B4c_GM z*miF6;lY5kOaNe1XE}keEUF)mG{NLk!%cAQTwAyY)|QiFBJrWCJf+9JM#)5FH!hKOB z9q4Qyzbuj;(6v73GP|#cqzC=c2fNLjZA>J6XkS14+dMKZk}&$J zAFi-S6Cyc}{Qb~mX_*ws1$40=x-9rtkqn{fe(1Bb{3eoN^uYk^wvf9bxs1LTfMXWn zo=C2uzyM^dEi)n+MMDE{v2`jUlAqAg5G=6z*$i?6-3dXHmFP0aEi{@ChRs%QY6h7= RcfxSc>YaaT*-3c$!oLWH_T>No diff --git a/ptx/lib/zluda_ptx_impl.cpp b/ptx/lib/zluda_ptx_impl.cpp index a6417f6..7c6600f 100644 --- a/ptx/lib/zluda_ptx_impl.cpp +++ b/ptx/lib/zluda_ptx_impl.cpp @@ -1395,8 +1395,36 @@ extern "C" char c = *(s++); if (c == 0) break; - if (c == '%') + if (c != '%') + continue; + + // %% requires no additional handling + if (*s == '%') { + s++; + continue; + } + + // %s uses __ockl_printf_append_string_n + // https://github.com/ROCm/clr/blob/5a715ed160c69a2deebac187a0368900a774f3e8/hipamd/include/hip/amd_detail/hip_assert.h#L73 + if (*s == 's') + { + s++; + const char *value = (const char *)read_valist(valist_ptr, valist_offset, 8); + handle = __ockl_printf_append_string_n(handle, value, strlen_plus_one(value), 0); + continue; + } + + // Keep scanning until we figure out the length of this specifier or if we reach the end of the string + while (*s != 0) { + // "The width is not specified in the format string, but as an additional integer value argument preceding the argument that has to be formatted." + if (*s == '*') { + s++; + uint64_t value = read_valist(valist_ptr, valist_offset, 4); + handle = __ockl_printf_append_args(handle, 1, value, 0, 0, 0, 0, 0, 0, 0); + continue; + } + uint8_t len = 0; if (parse_printf_specifier(s, len)) { @@ -1408,6 +1436,9 @@ extern "C" if (specifier_with_length) { s += specifier_with_length; + } else { + s++; + continue; } } @@ -1416,6 +1447,7 @@ extern "C" uint64_t value = read_valist(valist_ptr, valist_offset, len); handle = __ockl_printf_append_args(handle, 1, value, 0, 0, 0, 0, 0, 0, 0); } + break; } } return (uint32_t)__ockl_printf_append_args(handle, 0, 0, 0, 0, 0, 0, 0, 0, 1);