[llvm] [dsymutil] Avoid copying binary swiftmodules built from textual (PR #134719)

Adrian Prantl via llvm-commits llvm-commits at lists.llvm.org
Mon Apr 7 12:57:28 PDT 2025


https://github.com/adrian-prantl created https://github.com/llvm/llvm-project/pull/134719

.swiftinterface files into the dSYM bundle. These typically come only from the SDK (since textual interfaces require library evolution) and thus are a waste of space to copy into the bundle.

The information about this is being parsed out of the control block, which means duplicating 5 constants from the Swift frontend. If a file cannot be parsed, dsymutil errs on the side of copying the file anyway.

rdar://138186524

>From ed52e034f3867982eede08832bd650854383d068 Mon Sep 17 00:00:00 2001
From: Adrian Prantl <aprantl at apple.com>
Date: Thu, 3 Apr 2025 16:25:43 -0700
Subject: [PATCH] [dsymutil] Avoid copying binary swiftmodules built from
 textual

.swiftinterface files into the dSYM bundle. These typically come only
from the SDK (since textual interfaces require library evolution) and
thus are a waste of space to copy into the bundle.

The information about this is being parsed out of the control block,
which means duplicating 5 constants from the Swift frontend. If a file
cannot be parsed, dsymutil errs on the side of copying the file
anyway.

rdar://138186524
---
 .../tools/dsymutil/Inputs/Binary.swiftmodule  | Bin 0 -> 17192 bytes
 .../dsymutil/Inputs/FromInterface.swiftmodule | Bin 0 -> 17028 bytes
 llvm/test/tools/dsymutil/swiftmodule.test     |  29 +++
 .../dsymutil/yaml-object-address-rewrite.test |   3 +
 llvm/tools/dsymutil/CMakeLists.txt            |   1 +
 llvm/tools/dsymutil/DebugMap.cpp              |  12 +-
 llvm/tools/dsymutil/DwarfLinkerForBinary.cpp  |  16 ++
 llvm/tools/dsymutil/RelocationMap.h           |   1 +
 llvm/tools/dsymutil/SwiftModule.cpp           | 203 ++++++++++++++++++
 llvm/tools/dsymutil/SwiftModule.h             |  15 ++
 10 files changed, 275 insertions(+), 5 deletions(-)
 create mode 100644 llvm/test/tools/dsymutil/Inputs/Binary.swiftmodule
 create mode 100644 llvm/test/tools/dsymutil/Inputs/FromInterface.swiftmodule
 create mode 100644 llvm/test/tools/dsymutil/swiftmodule.test
 create mode 100644 llvm/tools/dsymutil/SwiftModule.cpp
 create mode 100644 llvm/tools/dsymutil/SwiftModule.h

diff --git a/llvm/test/tools/dsymutil/Inputs/Binary.swiftmodule b/llvm/test/tools/dsymutil/Inputs/Binary.swiftmodule
new file mode 100644
index 0000000000000000000000000000000000000000..7ba817b22b707a23387b728923ae764699578561
GIT binary patch
literal 17192
zcmbt*4Rl-8mF~5q_~+iBd*dYFKqirm2P9i|WRnCtmXoV12MmN(A?Bwu%v1>u4Q&At
zLJO~LDoY9o#<VxVyqc2E*omAtQzsFQ!<dfWLr8hSFouebp)k{V%La#%0fGo&z_Z+$
z_w92fS=M!E*Lqo5C(^y=XP>>l{q22pcHZ6JZ!Re2xSw3YaYY4#v7vais?<ak+f2Y3
zjaPTZtCpKyQLf>SPw+z);dqRH(ZUa;_=8biydlZ=$wIHp_o7Y3ijSuFh({Rk at GnmA
zy?B at MEgX{gK_B%JOX`G3H2X$fGU(x-SNRhvO)Q4@@+VTlaffh1;>EWX at dGjbxKHTC
zN|?;S52$<}mQM-CB>t#}7mMrpeu+Oe!S}^@aZ^2;*emo|1Z}#af}!My!JbsAMgrAi
z at l|0%^+?=05O<f38EgabRWZeyG*meyLv3f=>Rj%wLZ30EDjW~CMB?_DI7V7AxHG;g
zil+g4C}5w82XE_9tmxRI*hZD=E<;TuZbjEF1zK7aGSti%sw07FEOIx^q1c83)-Hoh
zRctCIkJm&3wq$%&R=G~c^|WeIv5gsOLeR8gb9%z|uDCsdc@*1l+}ee4hMG|l#kOCm
zb^30wj>0Mi`>0a&HhVgwR1F#IBLRDotvIY$u~RJS^xa64N0jOqCW~7mB%N(4P#sd}
zD}<Zv>b;4&hLswu3jw<W_7SBT6Av3|x&roY#o7tUh6<h{`}D at h^8b($W)1BVj>tlP
zN;sI}k8;A17!M=7=-~%}6j&oAz-*coBPnjp>@bNxpk}e)Ydqo*U}XT|phv(^3_7UN
zlYS53tWV~}@qgxz%lt{qpAw=HJ?#aovVgdBeD-ypUx=poL0NcFBB9fexzz+<3Wrtx
zSV}nIfl$IhKmTHikIKT46dp>2rBxv^zIDP-o83Q91TDZmWEDfrRD4wzw8+e*#uIDz
z7^>kSzl*OLj#m%ISHV1h5io;J&}Ar2${UN at ojb;9nur23SAD>2h<5{ubw57m8bf}Q
ztquShYy`ddssXZu&AI7P`#7yin9O2mh8eUg?k>CY1nl4?2RQ;af%?6CuY=Sx$1J%X
z(lHnXT4PEL<jlB-aS0(NUOfua8z5Nqh`}}vK*ilxV&&m at 6@xfHh`+T?*_{EOLJ)^r
zgbX(9(%IfJ{|l%V?g%ggT4QndmYjWHv)294ljAh`(`ek<lXX)0F&lIbUr-fWjK*S(
z>Q1cRR&47c>wvAuTVNVhse%PM4K?rx`0LZN3(SQxTnPT!6L<GrWWVq`JDk|*yva7f
z+yL$ph2r51aF4hvYHy1GnK9-Q6MQ5k45>oYLthVoxE%a1Q;r1(Jmd~T3~+FqBMgjM
zKd~Fw1$kM7BM$yWS$KgHG*}OU-ZGPkZ^?WgUSNI?e++0&@_kAE0F0aMamgfqJjui4
zm_IX3bjgrMh%!G(FZNTHaFPS~vt0zR=1^*4`5}*R%s~>u at iN0xmN`#3aIgR>7r*u!
zjq1~~rl<ayK^Ro|qY^&|cSXxQR(qG3&|7nyZ30ewu^x5k(JKijA>sUU$ZIs0zsPG}
zBQ^xxKvnPn&9f14G_9s3{THJ!n8Irw9x;&d3&b0+7jyr#1;yp2^o}tB*{4S!!MQnu
z(^GD4<A)Kz&=2dXxi)aza3IB>WWYEK+reZi*3B&O)~+1md#T^SJRue>B?9dw3KS6f
z4$hj6yETIET6azB>3#aXG3enBVI{1`JRfp_fi;p$3;gD-!Z8bf99GAc=0V_u7ly!2
z0EZkv`L;h#D<Q`7gjR>p$4sTIlAd|rTEhB^^KRxh*YPi4Lf}*z9pevWRdM<4Iu*i<
zGE$1U*1P>$Hh(7ZfDo`GoCVs=;LPy|Vm~a481p=yrubtq{)Oy9uVp4U?iVs6xQ-4A
zh at h4b$eqRZq*4oxaeB4_kmSVz#S#e`oePqEWie1eyb9bMMWAPlHiPH at I*JGD3o!!m
zDYMLk`Vz%-A|1*>5c1g?_U$khi;|g+$!-^mx^ZIB%yjPW73LDjA(bEY5a9sj*#GPX
z)#ci}Ghix(1u_t29IRzrTcpPz0Im7;i{KcfS1HdME-M1n2yz9MS%A>f^JS*lQUpW|
zdIW$kGe~;pC1P}zq||7%i!_6+>fTvIs7VPLPm00{Xbgd4i1B!*q1tJEL_<rq%ia|T
zwjsqnPVrIGC2>CWZTkV_m4zW_Y=Y8HFdp3Cm=8ME#GgnN*hk}txky(Lku&4&_z~VC
z6e1^u)IM@{IO7Q<8-N(gEk$)Dg8mrBL1|jpORsJGkD at 62KS`Ma)ZB~IG=;2$Qe9$%
zG(bHal#bcDm8yyOs&ulz;!j2q!KFNs5vYzVhYXh^R>2(b&5ZE!;|NayM7i3TI3hB#
zODi at qn%#x{AS{IFL1Js$?V*sT)XXZgwGVFZ0rrX7vrL%Q{ZEmU)P&=9#IA?|sbWSu
zPT*pgu@^jtg#c}Ku9u8xPX_Gc at wt-RaRfx@AwHsz#AxO)AdGmEwc<~Jy>!-tD4fwk
zVvvHwLG;abG}{>>5W2N=oU+Z~cyKYSoDN at bqalcA5ssxSuNZ2^4R$!27Q2(sQUF=1
zEo!K7Hk at GeqVaSVCgMV*)z!!fuuM`5;_=`X&>ID6I8e^)v9|;03t=fO(57}aOl4d|
z3k0BH7*YI2V>e8r*dlQf93lgCuoO@?9Ka5$lL{R<obB&>d04nl<qrd}u$@YgR!ecg
zPKf3#=y-l%tR?i!I-8c5K;|mA5y)hZc^K1pL9LX0Q-p+AEa8r-WUanbPhVz^E<-JZ
zAC4n+p=6Zp8z~#oP8;R$T^;Kt0?3zac_<?@5u0H-as=!qf8 at g-`pN8|?OY~-0=0C7
zH0dY7jxcD5%bU{c0M<$sG(z+msAZ&<zrWv_;fF*lKnGlusE9v-GXORUZ~|>CR6}1N
z;-QpWc#ds<9wGo8sOcz7F&o~+&J*Yfh>P1(W+3*EL<a~hMK}y^VTO3|t4A((!WUz4
z90YA|18&UJD#1|WIc9m{joM^95fbOsPZ~P6tVgy#OzvHUBp&C4{Yc*dYuF?n>=Uu&
z=a4bN+K7NGk%3nNJ+SskJWR<SCn)oU79-jTE`TE?&VJQe_;K!<vG6Am0Rb&Qjx;wX
z+d0Mn2`6N3>-{{zVp2S3O2Q4D3zJF>FzIahF9#MT+kiDsrU5Hpf at n(qgOSeDFe}u6
zJei0^p~Ek>12j4BuoO^Q_&jg{J5t&p!1a%4nJS|`@zz#QCUlDRApcCj#>is!Wb3 at M
z!UcS at 6iniw!CzrAjinqyua|O!7g9Y>wje*p>5Ps5h*+8YoCprnYv3by^i^&qF!i!j
z8or<9A}AfHGD3Y?=?+1>^Cq0-MiuOZLUwLYVNOnhVjXrocb5&H0*k at BG7vWqKYitx
z#22No56-nv5VS)?1XhGn0M}TWAr7VZLBt(84fEonO>jrbHR2R&8T;S>ig;yn+Ux3A
zT7(^_#KJ?Vp4UuYz5FW8HJz5#Z_u6(Ko0DA<IU;Ep0#@^Z=w^0_R|Z}MVVz8njihk
z&0}zaz#rdb*@P+0Y$MsA4xlr*gPStBMIId__ASPt3L8J1P29HiEQaSoS<f>7fIRcE
zOyu*x_7NWsFM+QxUX6a#g7`o`i~w0t#kxQ4KE0Sa0*hJ~V2XYQ5Dp-dBtuY(5Gelj
z*U8F2wE;ixR0EyxcrAK@$KV+nziYNo<Hj?K0nI}mf+pC6!ZVjSun{-Qe`rBQhhGEW
zZ0txq2OM^1+b(9n!yfaw34StZK9h-#2pI@{gDLsVjn=o_4H08gDA*8nH)d%Eo`(4B
zbbkL+{@ork&K6J-RF at gob9RAkD%ccqH$@T+ok~OWViRoo!5jRfYCb0m)10VV-tp;1
z+l0|M5_BfrjcOvDI3QXeppM3azr8G?isvNr$Ex|gB!4Dpe%E6 at ALBnsnLqT1seGB_
z={?nB0I|_I<z6?O(CuZ at kN5HiB>p{FJex9~%OCCQxUMP;(oHxciN;}fL)h5Vl`oL-
z(#wxn0ABNF*o(t_K{CG^)9cjnIA)4hj~knz(4=mTHJ2mXKPs8AuityjQ~7eFo-VA8
z8f+v=uwgvWxZmA48nlfEn>vlnkwnw5ZoY3_4p#2v#8k|D)?uF1c9&#I&!1Z^JiJ*r
z=MX2o<}(veBQvcmO!}B4obU-5N<3o`GkG8Z9>2+oi at qHRG)19RJwiN3>I7J3a>9H8
zR&wZu{?G3u1I|#eY0QY$*%fTkX(YI8<WYN<+d1xDH|lO2OW2c%CVWth_R&OB4BIz0
zPr0jx-RqJGXFfh#2PgSYCd|hz=6`o&ll6?$Z+*90SvNs5RfpW`N8HW2rHvb}fHgnD
zw&ypc=grf0NYLqC7cw?Qg6nmN2yVYZTl=WT{ISIh)qR$)^of5vZ5?rABkKT%QEemH
z`HVW0woP{MlMeBOEPi4UVHusz`1d|$4<(w_cvEMBCLVG(4jY?wig|xC|31tNl<IBr
z)*~Z<hW>;#9B at XAgfN}!86R5#l>TX`k_yjiBmqcGm<J^Df2v3}%#*-lkC?`zPANxT
zwu3*C#&zUyP^_^r7I2Ojn at 182BgUru-E8{MC7f}H7jZcGx$CU}=l<YDbkTNh5r4rV
zoRP&3EaE3Vy@@=9pVSFosOI-&@t8z7{tr(YQiC259&r}TX(6lVjKLLt`hYNL5zl#q
zbCUSEL|A%XHJ_2qy$<tx9`k2<<^TMLV}^AjiDq~d{(|>LgN>m?gAQ88)hiFmJPi0z
zzVf1PTwgP$F;vh79~lCu2%hs0*6k}JDuggY#3>Ep(1Sz#JZ8R-Kdb+pmu>W8aKcH5
zH#W~75Zb=j%YV#?9|7(jA`2bddnRA54hPpEWdmm=-RlURN(0(_o9=h*9y2tDh}9ZM
z7x>^t2wL}nyHP{ukkXiRH>mCgwE2U>9lJ-B#xY1~YzB6;0iE%t;b0?z$&kBYcpi<q
zUtXy>>ye}xYzfvn1J+^&2XON_Z_AHI3<yiu0Ev_@!2XUOcN!2hoA%>Z>P!S1P2__*
zsjP=K^9Q&6_XENi$^2oAKRba?rVj#AN0<zYb#;92UKR at 5u*a}_otm(B1)UkKQOJW%
zx`|{kOb at 8wRTce``7 at P2rxM2DpU(rY9zCeNPll^Uf=wfVW=ubdb at V&fRjKgP6K13o
zh&ga}sB_Yh(P%!h98ZU>kQf{K-F#GYcSY19p7jz{oKXo}AU+*BQ@?1nMib58 at iDgz
zCP@<J!4~BB^92?6V- at pS`8d(NE=X;DqEl%Gnn0)dw%So;5YDH}DP$h9IPDY8OXd`!
zzdlC(+Y_p?ZVbL0Y{q68C`o_OL{rG9Lx9&_k?}(d|G8 at ZNT%4455cWTQq3nljK%>I
zuK=Tc?lIFtCc_2&R(|$3!*Bz)Ee2|JH$ebIuKYc<uTuE4Ui16d6LaFT^GCmEp(8-7
zca$hZ1XO=dd?cRrQMkMSd2*lxs-G|T^%U0a<InkNb7w&o4vG*US0E6s2Yx&<Va9W;
z58nJwh at +>=r#m$t>OvNgK>nah0le4j<B?^b at sVc0x`6gP-n`<;5d^zLBUlm&iMrRT
z<SLZVs6bMFQsut&$_S)EAYkkOiSteK?2~kbgM$+}nsW at 17;G0r1k)+obFD(4LE4o{
znLpFdblFc}Fh~POLnaQwd0X#pcQ|+QAEnIiLQgD#g@@z|^w&QfGdR0Ir5O_KGOR~%
z0iDm6H6|`xd4f!jzyJ!+?QT)`kkT-kfM at B{?b%k!f+;bHc+R04>h)fA5(%<I=z?`W
zU~0VJ;lK32-tcSl`Fwhq_{9xGp>Sm6SxIo3v8g*@4H-ec&7iV;@IJgF2T^2iOv!Ks
zM1Cpj^wRe8E~SBzXg4^mSr=s!k6tl=aY$XETkx?Lv75zvJrdvgISloclNpyqZ_voe
zItHw|n{bGj3f4q48w8Q$B4RiP^l9uJ_r6P>@l_^y=2@&BQJP|i^sutA8PP80UZ1a>
z*84FNjz|vkhx#2{wjXnZ3{BvqP6joAHh+Tl2f%l*RSJkTe{K<pAspuEe50jayP*cB
zBp^0>cI-w1hYiM^Q#h>TdsJ}a)qQ^PJ<t~j#7ktLo6`5@<5na>14dgH(2!`FnkQH!
zc3pim#nQ8Rd3=Ze>fV_73&}j~5c?3DWbq*O;WfiwK9*=7XK;*^5oze0G?~9A>C6r6
zGz!z{#2>o)1V?B8b1}Ux{GXQCkhhK#-6G{7AD&0CZM$KauUbCUc_Y#~eJ&nssRA%A
za%`2Kd4f&@QKexj(S##szByYC-@?Nyz`yzvZ|@Tn=DXrffFU;ji8oOexv>Tu5(+kU
z1$DiF=!A3Js6Wyf+b=t$Qk2l;u8zq)vu8csu_MuS*>O(P7#yK4pX0=Pu+I<X0sY^*
zX0ws}K}kBhg6b#oZR$RCIRfb!ulcNB#~QbMCl<$%wRygA!P7(;zn9GKsSI97rvWuY
z$9z0FKEIBB1)vlcd1C(Z!82DJ12~iX=LAR=Uh^mL{sBkFU=soYPQSobr=ATrO?=8D
zJe{||rRF&+K7Re55TWjT4 at Y=e1b?1Kbb*sN^l5$a>Bo?40t9q~ha4mEX2j0XgtN!J
zE|$Nw#Q2IqkNJWhTyOqDPeY4;2#cufw2yN}K4LdD?c+a7A<(fDBVQ%lbgOmDy&m~(
z{<zkyNU1Isl`ee-%m*coB at p}Jpn5M$9J-2*O0tNk|1JU*(wmEg+GqEJdl9j~d|k$x
z2;829f50VQruOd*^5>v~3G-0Oe86KKNU=DRzbU!nRkHJ#yBV1+()j#oJiQe>D2%iT
zukz{qqN^X_x)a$)(2fK|PhPiIoscQ3p7bFRV+U!#1(B0wO1cvqced3EyC8|pm*e4I
z)(aP47ZstL|I$H+htIUb^1N((cdQDWe*x=aEf%7oUizWPAs#{on=~K2=#M7yN#ds2
zBV at iL?Z-f-kbzl at PI2r!quYx5zc5WgJC9oFB*PLwy(^ZTy3ranHsMs>tu(@4#{u(%
zecb4b(Ff<)yoA1MkVQ%)Ipl!&alpqz63TQPW}PJRYp=q8U}BtH=F9L}hHlCHGMA4I
z$D4e01g=L1WW8}+F?-t){4UH&L~sX8H&ZfQ>h#Xm3ULeO at 8OeH3pY{u7p|AG#hA|3
z1?kK2kpONE={I#0Q(cKG58RaFYOgzh>t2)^+MS!+Rd|YGE0iAM4iFc6IU|fMdG}h{
z1Y_~wE%?PAzgTN`Ib-p}wz>C;c4z3Ny3BnvuBtMZ2>4lEyVIU6_K5MvQ~WP+otu)%
z=UjYa7~Ns=5!^l8e4anh!{Zlh{D6*YL|iwVNI435s)2|EY9Iw#lxTD-HMn!h{rMd?
zJp1XYD*bRQZahI3uvGfB3Po(Vj>47P=_p<8)35j$1*L1yP}em_Sv!7x(W|gI{d~!s
ze$Z}U&Mn-WuI=wo%^s>F at Z<kDT6QaoyCd8t<`^OodD1`^I{UM?BDpqfxg>kjHm4*4
zCco?@+;HH+4L_-q;qz~Y=8969E<VxSVa*X`^=r74qq|O2(^W&{Idilwp-KnbI}xZ@
zb?SZypwz?wwbrLmMq^LnU3M2hZ5(>XyGzqorMT#$npnD&(dusS?y~edx~_|p&0}PC
zSkCVBzKudedPKE|*rx#(^tk at SJqlerrY8@*bQ|650eRWWG~60SaT$Ui-EooClf4s4
z-;kW}Ni9N|P9g&e0IX33#hTe_NcZA2WKbfcRENod?8{BBEA?|qk;I!(8-$COIi*ir
z3GQxj!G!A!d;qpHRe?R1XfJTp)Rz))rG=7Ie9*q8U4+WUl2UHJbdi-uyY0g at 7Ot95
zxQc5rT<4-T_L<xlnaU~MobsRP=ggKBoJdWS&+{6^zK|4!ynY^~A341xo7Q{CM<pGz
zlEa~2*AxVXV>&?DSOixT;x$Z7D%DaAp`3=JB99kR@)~U(+&JQ<8D-;hW=lmIwAasL
zHmzRg4Q(E;FoY7~7-^BHl}dCbWUcRE(2j+S5A_bFJR7qM;OdWx3RoeB#>eO+?pw_S
zo3}XV9sRp3b<Hm9+pI0|54cE#wy02uSsqsMP^kxMBgMa5qgw^oaL~2y+`D at JH}sRG
zYma7ElnZ~WUEdS6prinmTj?uFx}>BE6uQ0EQG#>F+iVzll`VuCfAa90DKbvr>~v}M
zeDWWup3>}<F at XQxtg6YDxf-3-n*4y)3CFcQ2NlKQ0`*tWRQkfx^N{u$MOU~3M&S!C
zS5X)Oji#@<{#7gF(>VcI7OIxAGs%Ts%`>&G7j+9(Sz at 7ZoL=G1GSp^(1(R`bYo?|P
zB?i#3f^q|jIGGzzcUf4g?IZTmDyymxe~GieVW<jVoH7%zjR&exAIBnqdu`zyHG!l6
z8iJ~DD5oA*yhonfPv%kJ4Q-%g0hof~H1y|=$?5<a6SsQij=#t{bH=oL=Z;aSS_BIs
zG-FK-sK{XkAO)+-LFp=J7uVFkNUNcGgn~6L(5dhW^a&~lLY<x+nki^L^8S8cAJ^}y
zaMVIo58`c?Ybs}%2bEof;#4UKrU&zqDp9JPmMki<+DZ=zkrvBG*@XCJdX99p1j-Z;
zZdm$5|49Qv$oFeP0Mw|I at uAj&s^h_;;*#as@(>vR4+4RhuBnj(v4Z~YxGQCMW=)2B
zc9ijD_&jCOUT9WG|F0Kt;9hMhEhvB=VL1oN27zNK9Rae8HalpsM&miumNQOWs;#7z
zw}RXURElW84$&IwHQ-`c_*rd^B!AqCz`|-^v0vyN+%!jyOf;CwmclWKw0a`tO-F;g
z*Es_D|6CI&m-VuooSCL49VX`OlrtGu_)mWlGtFiW;Q}oX{85TZ at rS%9DdUHrom;gr
ztT>9oClwLp8b>aCJuL=O=58w0V(ByfTMZb2s1+5OIeeK-W4d3;2$S!la29ADh1|ZJ
z;?o?FiVE(r?}8CgAC)da0wboVgzHd>6#=CyTC#{!O|TF29FeFMpG62kxtxOnq2`(N
z`wEBkC^?Aw>HpXurS1dn at cI~B#X<!~m>+OBh726=zXFw3TG<LJOo178z at gqGIV%iJ
z&%rItKc{FfIIbN3f9zT#$Njm)aqBsbtKj?l3k<=S9G3o%T<2N1B=|%_Peo~exTI=Z
z#}nb6ipyK2Ph}gYpzi|C*Wi%xLHjd6|E#U8v#zPFbJ$k7e7^5)w`}?TJ$LW2d~f^C
z2k*K6J`3JjtPj$o?{2;CTQ&Gv>!_`(bJW(?S?*$w>aKM-=-D;3*VqnYzI(Ucb^n78
z*R82t&2c;My?*t^`qgzDcXt8DZQXhA+SN5%X`PyEKL^LXqREk+`c-__difsO_T78#
zs<sq!20W`Uw_5NI`(wlYug0fa3P)9oYh#<Id_iTa$5vD+Ei?t6XzfuhZ&iDCuApzG
zl2BWVX=$Bn`<-g9iRU=BM~pR9q(6WCzWeXnzU3jG at BW>;=y at 5(ebasaeRn;ybLaN^
z?s|m!eRIpMo%h`LEzi#T at 7n(0gZM=K?DU+plhb+2j(hHX5HInk5%UD_Z+wX{)GC#`
z0}B^bw1-toP&Jjb^-Fs#u7Ihew6axQIaM_6+D-pFwKB9hHdQpaT&h&?pk-84Zm_h5
zXDo_CFqQ132Z8DG)}P?PZpmYGRZJBvIv*^acF8W&<NN3}p17WrDmR4L=<~r>#K0q#
z*4@(9^Fd!lacTL6uw&ZQu-Np9SW($6m#ejbO+C^r3(_;Od4D6hcCvZdx7QcA&Ie~K
z8%D+R!D#)cRL(xlSlo|d>bEVeS;3UQx3q?62wU0kk622z<jV0+<*tA>k#T8NOJyqr
zu{KQ=DW#Rghl|UVP-XXwrRz%e&;ClbtB?s at Zep^SdROm-f|QV{bmMLsxy8g!yRcqQ
zRUo5;-BNNXdq%5H6?L?03VWxbWj7N${sH8X#-Qww>8X{b^DQK5 at zo(|QE4S@&vRq(
zUQ+C6$@EK8MO!0mk^#*;Wi at 1^vQ at 0Dn<^?-y34y(KuVbGHur9+!WCM`j99#=e%jUg
zO*Ua#ZN;w8-jy8J49voHx%!Z_u*w~NMa1Wtc8;5ZZx~K<7%e&emgL|TlVl7OlIQhN
zk)$(x?eb|?kGhhS<gKK)1zS7(Z^-CqiWZ#@O4AHYQ$@?p2TcWbP0<7{DBV<II1NpP
z{Cgp2xwnmteh*zd#btj6Jt^EPntlDx5e!Y;Sdpy5m6UJ5a&jl0b(I1I-t$5KLr_o!
z=A3ptI%9#zmhVBh7IE4Y`;wqx_;x>5EH1wVOIuuzn(Ev7X-m)q%><R2I+xN{d5k_@
z3b+=$w+C;FB`CGvUCilSNQN#r2-HKq>o at I|<b5PfY)6G_LFm~6!>Lky>0ah-H}%(_
z56ZM^DfWHUhT?_=Ev at R+4qDLv08`Dt8tOr~3l=Ye&6CONdLS2bJmxG=+rpC4e$wh=
z*J^!DfCGdFh|1lM!l)SRhFk$y%&;wdC2evKJ!Z};RcshlSGM`h51ROrQY=sUW<X#F
zFjdv#-?Tc-PtVf_qL<fWJ<@I4^{{Z74BA^I|GDBNrIq2Ht%g1Rr?1~FSxGEd2)@j{
zf$x_8f+(j~U|XFsiSAvvZ>5PZh^WvU-Xtr57^%D?1iAljIiZJboV2egBifQt&W2Ho
zatccS&R$ZMR05%@pwHo6_T5xc(LM at g02|m$eLKR+2B~h^<^La*Oc|!>4yN3$R>K}s
z355Ip4OnXfh^^hzTTYOI5gq%UnXy<xrH<=f5!+1RTgXH=657JIRhT;42({au1}=sc
zdJ3-mTZnwxiH&vr0HQF@`1fVY3hw$lJil?nbjK6;_x1W^rIixH%Asdw<WTXV62sSi
z%~g=HOAN2Bopu=(0orG;+K}`Vy!Wi^a{G&~_7q!xO%n!81r>MuXDqRnr=W1KaB<l`
z)ALwAw!O%4Y;$i#Py16VE5Y0Hy$c~FU)9#njKqCfF9VY63N=`Je~7oxT;<;Z#9_&!
zu;&nO^cC`GjO^Z9fXyjad5Wd~ZY`DyjOe}1i?!t?G;wFJptLR4S_U|Gb`@atvTF3G
zFtogm at v(Q7SvvTo*i&)Y1|w<lH-)X90_VUb84!DVm6m|1sx92A%6s at lfbyu=*5A*4
zwpI?9Dlnb&kg>8@`aU&}Q1b(7enicWsp+65NX;H<9;4=OsCkl_pHj2e*iu~fl(Dj(
zd!tbfaGz4Mc^#SusM(9ge-aI$-lD(^FkASof>KlXx719c2~8CkuKSDwHThFc*&kkE
zarwK^$o(rU@|~h;@wSVq-0J at T&thMq0k%&UwMv#((Kuc&!j>z3<Oe{gIY7<t(R3)g
zd$wUpX at l(VUP-g9wDe42Hu6~cBT*{1ToB<TG?9TvQ%DU at jTw!%lm|k?L`(K1s>QN;
ziDX$pFDuZ<SJ6vse(3@<mr=6}P1zL-h>KgUFDNmLp{Ym6w#Xq2mpjpTyU;-8SEFmI
zZ9!$)I8~OT^t=^ZLD0PJrUIy_`)3A%_Dh(#j;3#<riq#j)VQeGNX^aEe4U!j)NG;V
zIkL;`^ywSa{3SJiMa?&<*-Fh_Xv)5|09Jc$gB;?9Zj%ix>h at H~BTFIgDK!2uG_D2V
ze>9Yux<*Kzl6q74f8$#?fu{460noh1PMou{m{&?o-7g#9bL9sNE$z_2DQa5&l|%D8
zG^eO(d6$|q^p%>H_vsTgE$8SHH7%deCu&+!Xp~R6g2{*d{wR>~HX)-Jw)79%(0o8m
zSrtIhiUz2=m7sSUnm4FfbO)L`YTD44%G-#>{q{>OW$+Zsx5<{Z0-Abi)>5;Mn)PU;
z>x5#dkMwkynj>f$ez^cnWO=C)VVSF2sKx41V;7>c_Gb;^H@&QnbkE3!9!@O`7hK>1
z+;)G3T-sBT<l0-y%i11Y^3=+OM(X3cLapoYdMY`;Ha<HM%~2&S{JDw4j2xHyyrOng
zM2gCViw!L2tuK at o()aqmkQV-Gp8hm`QIVHJip?3?{V|K9-*2<H4Qsw#YC2W0R4OSh
zEO<^Xq4c?h*7^U>@;R;;6DgQ$K_O?5jSjBPQMYwXWBoOC?bobcU0?55ySnk3ZTP;m
Vu73Nrt=F_KF#l=&FeUr*{{U!EIS>E<

literal 0
HcmV?d00001

diff --git a/llvm/test/tools/dsymutil/Inputs/FromInterface.swiftmodule b/llvm/test/tools/dsymutil/Inputs/FromInterface.swiftmodule
new file mode 100644
index 0000000000000000000000000000000000000000..2873ee93e137a7651f01638440c22ee3c3b4d558
GIT binary patch
literal 17028
zcma)j4R{;XmG)Rt{4*0Y6DI)&vWaZGAlb4ln~>VEOhzLE4un=o%um1N+bZBt(iRXQ
zQ25%WvZR1uO*;u at Yf8FnCvxJnP9hwKHM{=42#F1bHB at vBh28ExHaL_l5JU(I-pAej
z-g8HiWsO6dC(n&EbAQe~=RNN^SNG)IeFNr#VvhUCMI2XDFcce(SF1`*RI$wltkHON
zSG;Pa=@sQF{@5fxY!Qyd_>&fXFvTB;^5TXh-!BV&GT(<b6)QfH;v*hm(8Hgc<oob0
z<y$-~@k2i9C6?3+k!bdfx@^e9Kd<t~Rhn1~@8OT9gkuijxWtQZE#U`a{4t-<hm|my
zgCA7+ek`97j!OIy4=)xs at B<Qmbdv9n@#4k?HnCUew+PyFMFqpjQG-3HRE-9z$K!Qj
zL-lCfIv97CjvH))@w%8|O&Y44lA*RMZgsA7SE0|iQWcH|TO)D%Y#bx47~B=Fi{fd(
z9tzl}<H1{c6)QUSDz-7Dy4z3_iCfXNTY;A9LWY`ILv<ujjYaOFITYJ)z}juFsfta-
z<nfwFz?O{HWtHo6Tu-Ye72CL>CIn3 at Hm4_S?~dCem`AaV#I4;JXQ&w?QEdB^TBmP=
zbqrQ9*vFKrx7pKKrE1t<9}U=(Y{e19ik)Inr|$-uJfc*`Fj?FhA?a+>f$ES#Um at IF
zSMQC~HLTQNT?p6{u#YO$n0Ulc(;cw)DAq1WHeB!&*{3f?mjAnyFlT6=a99=wQo?~0
ze}oeb$9Ndwq=z2 at Qecgg0JCXUjHI}$=Y~oAel?2)U(;cS04oCs2Rs6XV$cDVo(y;h
zXZ<oSPW&@}Oy*Bu{*(}v=xHBdl?BAb6LYWo{X#Uw56QwwiG)r==4KOsDI8MyqbcFI
z2SN!4{QSujAC-l}DLj-4ORGX;eCwp4HoJeI2wH%B$SQ`K>3Cf?w8+e*#uICI8>-<V
zzl+z6#H&Z*bubTL1k9ilbQy}1^2XzK=iL)DO+<m2t3F^h#JfSox(}aojUm6uRtEqL
zHiBNfZjdZtb8fuYK0&JzCbJltWd`kzyUT7r4m)_sK at P)Bpnfmk=OFdWGfS?AbPh#<
z)|gTQIWz8ITt<kASC7H;1_)L?YOqZJP;vL=Sa~E~#UKt4;%}`}c4xq+5X9jYA%hLO
zbau2Z`~s?lI|9sr)_B~#C1)SltaTss<TyqCG#0n^W}Q at i%m&@V7gWU-qp?_{x(n;K
z7u&kYI$$gE7MMm=s$hXGLk&Cv{`&OX0`uVv7lOa`#@+oF*f0Ff4kvaxZ?sJ^H-NiD
zp?Ek0+#~La+S?;QW{mm7Bp*o$!>SPV(AWJSE(iaslw;9;54poI0~{RZFax93PwWA9
zL0%T&u!BD-3omej2J0cvTV^uxEt&7f3(W7~j{?m}zCX$DhjFt#E}G(xC3%<}^Jk`s
zE*tg;QRXM<#eV7%PH+H!wu=DP98OKHJm?XQI!Hn|US at d8GVdt|4i-S=;@5wpQGHt0
z^wd8y2tz7=MB<0wu4tLZYVR@=dTWlcO~8pS)T16f`Xu25BwTn7`D)GOFYwyegbhJA
zP!&8t^K3*MO{-~1|HUW_rSO`EM+|2C0`Ugy#oRw_L2;!iy<<#3_URQ!aBkk<^pu<0
z`4I##^uxMpt_>U;_NVw03>b%CJD5zxx|t>3+L>c~FZDZ+C&ZHFM4){{fdWF`fjQH0
zH%IVY>#k`%y-(jahdlg2tc3NL=R+<qutt(;f#1AYIBMaK!Rpx30tlS+!VuUA;E)3-
z-?ryzCB%51(CQHSnW?l@(lhT}OISa-;AVbv9sdF*1WvWlG5%my6_?(sQz6VKBc+&c
zy<5M==FcP^5CWEjvp~BUoH-sr?1yC$W1h#;6n`|vzmQ$%waf&^{6b~~*V#z{5!4a_
zxwF`wRBFL7PR~{VlDt@;SRz5A^Fgw=ECwowSAn~u2=t86W)U4gNAX}oAx0oRWtN##
zU!<5$q(eCfLOxr=z757=Q8Lpp+2dkSH%=^?na=%CVJ?vzRQVAP5e`s}{m*SsU8&7G
z3#L+7AOlgx!CJ<(MS2VZ(3)SL1jit~N_pOJSrMp4kt?vw0)(EPFEh=SA|PtWBLIAv
zLDD-f5~H&urADJ&q#0~g_l_b$O-j&sQWRD}V+b6>jK{kS)lTap8d|bl_N+p%4Jq~s
zijSHuiSwy%`wt+mEDS?qlazjf@!$qWebBKc{$#4aJ{CvJMY at WJoEdl9kMJI$5IHHN
z_K~y08IL2`0K`~sDXOax^v5v{O4Gt#dTrx>7DeIzNy-$U=02pRDP$#->JlTQ0qW_b
zbj;SHR87X~(#ZmgKN&>?m-9$QpgOV~GF*;W1#`eRGs4S{BRmBV<!Wc+h{(t;t=Py|
zb{F;oun?jLiLGt7mqMOWGpEe9ez?5{*e7bwGGSWxKSfef6OP*vyCMdpiW%)Vfr}Bw
zUho_i0<_t=J~E;`8L&^p=Sy<iVGyB*_=rLhqnSg1Fyc+tia!DN(pe9pa7GJ>Aqo-)
z&^O!BY-fl-=+ at G4$~H&h!KJWrI()&6h9RCsIGVD&VyKxg*x_ti>`p>U0c5GRsG-K$
zc%0FT#?x7th>MX{S0gLHGD$6n$AeoyZxpEEKsmF=-VUHIgr&4Vo7&kpopBK at 5P*hZ
zMDd$VJur=8i^NHAhz!)hQb65E06VBoDs<#<cD(Q9Vc~w2KLo(Sb}B_$EyV>pA)2$G
z<N1ZLme4cjY+7OhnXBMNAd}tZ5lrI+wNmm;5fWmtggdH|wfa-N{h2ws4Yd${B#zXD
zl2NvAq-;n#ZIr`zcdnZZAYZcOp^VH#Y=-5?5wM&5kq>|9C$odLbD0DR)Y28wq at M&k
z%%CBzY)-EOSSwY~2+?bxmXTWi{(ftQ9}=+u9dJ>iBK|ne0N5zN3AC|L4Sj)#hf{Ll
zS+ at NJhyZk;rlT;$Y<L$tPoO6tE^bSif!Ko*9U!z6;Sjuq8RFzuk6h`5FUI0H2- at BT
z+?c6Vf}zH9%<{w=waIuQBrd3*G;}s!gKU3<+`9@%JkAOGkiG-fut_}FFJjBjA!CHK
z5dm2u1Fr;nVC at rln36wEQ05CQMzj-L07puk{i?O_<J>uG;ZGm}0$P9^X>MM&bCdxR
zPRQKW`+0)Jq<GGhgc~{+CY2gs(%Jgo4lGQz0c)N}16IHU(UklLBb}#VR;U4aG7*bH
zhhJ<5XmZ|WDWJ6QdEf$eq_jbR>mSxKRYrZ{&26Ae=oITg{@H+yk;UA})_Hq{3;1R!
zn8ZVae~-yDmU0MvUdj<(NcBG1iu at d>GdcnwVrBAkA~;O1fsfqLSGkG6)W=e3_<oj)
zpme0l2=!^DI|T9e8*!E!Q?M5b*||Z5IXMZ6b=dLTT{iL(SPb5kfw+PA=_|)1z9 at x#
zaIS at dpdBJ2up*QKxW>{9aWKUXA at 0y=m=~99gga8M5vN$o*artt#4DTAUSH4BBJ4mV
z79LLZzGnLB<?A%pbXwNDL3`d0Ik4wzZ%RM*tldL-6P+lupI(qI$}G#!{ODh98ix}E
z{`fA-CQWH(8_foF0G+`d+?2^J^5`J3cPS24*!ZDr;&w;xQg|+u^*jRr$TKg?L_QB}
zANKL^68H+^)#yj9h!6C`2#^(3to!2bQ%k8Mu&8wbrs!t?VLviSG6b~<f#P3&gRBfx
z8}Rc^HP8u<*P<tQ44$F!yJibDZalpd&^+iNXo5{BJad@?8*#JzhgM{C_%#5|#*WnU
zz+rc`?_>r%<T0O}<foG6)0yaqkb%%Ql#<`P*7~-)F=A{E1skL8rY!Bi(-5DX&hLN9
zzuRlZ*#b&}>N4Yc&n&V{2b)9g=18KkOKFT=Xo8JDc!Qr(&1Yp{h7)zmJ3hVEHfeN@
z2AxTFlbT2;4u}>AsAKWqZ!d|c;#tZ3v1)!V$)8S|-}RW!#rRKB<_|q$DqkjfW_R^C
zKx}kQyVs2*bbHzO<30R-iGNQP&!o&}^GEwSud51!bQ8`<qG`n47&bO{=L=-K_|n4`
zfY<yP_Tn&~m(1_R^g4Asj+x at s6UG)OG^v~8>PwOBACb)1*Y7>%>3lg-PZw544K at -b
z*f^1B+UIT>3)&`v&0WTpNTPW}H{Z7}1uOS)Vk%}n<1kNYyGt^q=g%z{9 at -?Fb%;}5
z^XW;bk(pK&rhH5iPWXfjC7!m3nLLmHkKbg)CEtkznxoLF9wDB?^#Uw2HEBK%D>-yS
z|N6VhfHM?q9yg+Ob_bhv8VRl#ebnCVc22n0jk%k~6ZT}H86Q-meJs%&!}g6W)9$Jf
z_qt at lnUBx5p(*~8N%Jv_`9B=lWIZGGTi@$Z)=kn()gkvaqwW^n(#C5qgEc?Gwih;~
z=gm`gNYLe87cw?Sg4gH}5!`l}w)PQ^`D2S2s{1To>68C<$~x-CM%DoiW7<Zt^BHw0
zZJ+AorySyOS^UHz!ZJFa@$Y%e9!j*R@#d}sO+4&w8Zox$6!ZQj{(YDkDAn8Ktw%-!
zjROg5IN*#J31K?dGd{KoDE-q=B^930NCJ?WG!IJV|5A}`n5TfpUNMbFol*|JYzKcN
zjqAwapjcy5EZ`h9wu~kkM~%(-yV>}mOE~QiFW_+UbJtq|&V9iP=%W4X68^kJI4z4G
zSj10!dJ}mHKdBeKP|fel;!%lk{GXmQq=q~qJmL(P(?V9!8G|eQ^nPK=BA)dKXC?7-
ziLms(YCbKS`yA%?Jm$~z%K!Nf#|`U76D{y4`~~lg1)D;NMjf<_YgQkSc^L4ceC0*o
zxV~mwW2m4FJ~9kY5j+<ltXo${R0v^)h|?Oxp$CWfdCYu1e^&oHFWczH;DnP9Z){mO
zAhdt6hyR!pKLXr6L>4- at _fEZB9S*KT$_CC#y4Mjrl}5DrHr?miHEw7L5vw(lF7UyP
z5VY<Ccaw(BVWlbQZdBckX!8e$J9mvKP2-T#*aGZm1G?hPBf%yFlVNw`$O0O5zr0#=
z*276N*b=OD8mz?(4&df<-j*Ma8W5JS0TL-+fPI}m?lK@~Ht)l))R_o2mdFQnQn?1&
z%pctTKlcl#CG&?d{>&sonLY?eonbO8*46R7dqpU0!yd!#b!x)i9du^2Mj;P6=^>KA
zFg>7xS5yp0=Fe3AtV$S%e?AYqdi0?7J{hha4K|MkS}^?>*3s`^XQjf=Oq!8WAm+f?
zq0T8sMx*)2ay%WjLSk&_cMDO?T at _J_c*aXqaatvCf%tUjO#PzG8cno-$H(0^m?TM<
z2V0QiFBDYVk5w#a<zqzmx*)abi7urDXab$)+v at HrgK#coP9gJ<#TlP)PBNzu{q-^O
z-=0vFb>r~mU<)?OKuP+GCYnP=9Rj at eii{sx_|H}IM>55Zd<bq$l4?HbWi$?$cm){k
zbB~!GG8xY6xAL>U8i5<QZ81=*yBPu?a^>%-qfX(^c+Kx)Pt1wWEFAr!g^mER-Vve@
z5m5a- at sW7ON8$23<jH{&sD7c~*IQV>mp|*L&7A>RI4DAZT!BEi9{BO_q#4h#K6vxL
zAda3cpYGCps2f>C0{Me31 at K<Amq(U;+DDoJ>jK&fc=M_!M-l82O<+kVB<j9KC0C(@
zMg@}clPdSkmq#EC0s&(ONStq)XP=}i92}g;(VXLm#9+H1BA8Cup06nc8l+vRl=(CL
zOqcuw27@$kG-To+oVWGvcAIkt|53{PF7(6_Sa?XjK!5quaf7oPRGJ~tZo at SQE}-*;
zvc|;u%a4=k5g0%Ly4@}58CDv{67VdYx;=N4vS3O~BA#{VhI+kMoIrvs5xQXA511Oy
zd-yLsus8hLd at i3JCV#PkC=`y2JSz!KGdA}mtRW-Fw*^#|58j9G&OsE}8&fh|0g+$I
zI=!_2yjy9cB-#y5Ytcp7#G{uDVjNOe=oWnJMeJtrUXR4Lehx!@<z&Vc(G40oS;v7@
zcQXzV)4`gEW`iJ-Ttp1#pgxVg?VfkZGrr0s&peCOBT91&ksekywjkQY+}Gr5r|mw>
zgd>u}{Gomam+ZqFAwx4bsf$4kpv|A4<9_fRY?T6H&7WIDVhD$MCf{hO*EZDPlmx_P
z&yGDv;IP5Ca~g-0e2)rVdu6|0d=K;m0`U?V=%)0&`M4E{(4f)Q4KyU0rxyqoiJey-
zNwM^7K_0)`e`R0H{DowmaftnhO|p0Z`|z6KFCR;^kJC6t%7`>{PMXT!lXQ9mJB`A0
zI`N0EJkHVC|7=XJ3;(AjHsq}nM7KzJ$cGnDZ2K-)=Bt)Zb=`opPM?bhTdM$!3mjYJ
zXP%(bKvZd*PBi1lnQzY4Lz{Vc1^8Eg;_Z8a!hCn!2{6PKKJg~XA~)24Lqfr(?x3zW
z5S?&N81+XwW5*>2Rf-b2+|@C)d+w~KJ9Z?xFFD4E8iOO$<#U|49sB%X0nq=_HJ6R#
z4@%P66;wZ&Z&UY6mm-j!_L|T5b*!=ZyRkTqtSt+T3!Wm%_`PI)Pi62zIt{2HI_Bfa
z@%eT1D*&aq$P at FI51zj4D8QNIKPN!4 at R~n?_YXKa2AdHOaQX$dy7X+gaq?3h;pv<O
zF15f}@$u{bga~!}dpN?&BKY$hq6?hFp-=0RPd|oa6Cj`?JmeUSw;*<oC7iwPb+P=d
zB_>u4dCcei;Ck~HdKy~#Ls&#*r+u6=@)5hSc`yH23W1KL82KvUX4<Ud?rV_W=8tRJ
zij?X?QR(7mz<f~RcmlB>4yyOE#K9}*s3ePs`tKr8A-%a!sC{-HxEB!%%-3zKiNNhy
z_y=6_W$Jinh(8M*Oqz#N=KUV?V2Z_={7uQ7uacd|-7Uy$k;dmw<LRs5L1Cm#c$H7*
z7u^F0*Imdyf_5Yzdh)up>bOi<^^^~Z7&}M<E{L2gQ_`K_xHD~5*ab;!z8nw#szEpp
zyQm1|{Fe?oJbb1dmKS8>yJA(~{PS2BYq1aw_0kVT4)Gu|*rfT$1%EV=PY^fF9U=22
z={O29g$&GMbc$o=8QoUY|BGo7+IiGUCmEIi>Rqwyr5mhKV>3?WJxUY&bpkL?*e8t6
z7=3V#FG%P+hghUUl0y!N9|wFqB%w^#Vb)0^zxFEp2PVeJWuXkOb$D~;m$`g&INs!|
zBXB)BAnT3mirL!_<9A_JB7!?$x|x#cQm1dOR)|})a1WofM!1p6zi_>jEyi at NDM(+A
zj|OmaNWZD0nCfy|dEllTS9?7HT=$~X(C*ymuEJ9kTcPw2cYwIq%Nb#8&AZpqCK!(g
zH{%z3{9>)$<&4J at cg(+6v^zsD)@SacaaEPMM8MDT+MV`Xu}6$Qmg0Yf>)e!7KJVfi
z!{`o^kKpd%rgQxMULL<-;|FwHBjUQ at c*;@8Qw>BUPy;E at qC}%dsllB~?$7VI;n_!5
zRq2Q0apQ5ifThx}Iux<tIto{Er=oPVPru at 46qK$(LtWQAW!?Sj3tolI>*q`6^n-Q-
z^KRkhb?tbEYW7eafgk at T(6U=u+#TUIF~<;z$dd-T(Ak&070I<>>qXg{ws|EHF!?1f
z;)VkkZum)^44;2HG+&g`bn%Jq4r`t$YhJ^p9Nl%Inywlm&zqxd8C5#q-ibiPs#Ett
z0Hr1dsI@(fG8%gl at 3Ol9YU9v5-d&u&D#b+~)x^@Jj8=DpcbBB!(RE#%Y#t-C!*X_~
z_iYp+(j%%x#6AtUpvUzm?osI4F+F+c#arlR56H`2rs38wipvoE=#Go5-t3)F`iA7V
zPihs)bP^d*0AP(ODAvqYL%NryA%hYjr8-OwWM64|U1^wCiX`5I+8|uK%qxB3N^p0J
z3npA=-~+IosS519NPB^+rv8+GD=n0y;)C`z?IKh*mXvb)rHiaQ+HD`Mv2fLd!c|<0
z;W`(!vCrhb$W%`0=9K?TKWDbA;CO1Xe1X>}_JyP<<n{9?{mAJp*|grnJ}T*$lN=8H
zx~3p79Mb{H#v-_)5U*ltQmK||809n^6?wdnlCRe0!Hpwsno%}BZ?;slQG5M7X4C3*
z-q7ap3d1NNj*%9LTB$^5Qr7w&0_|AH_)zaq%5!aY0bKo2Q2{ID(D)dg#Jy{nU<(!p
zy`z7ZrLMV!eVeo;{tg$3&=wU6G0VeB9xC-fZKU`YSL;>*HXL;AJO8fU|4sd5>Dr^Y
z73IR;YS;HfEhs5K<yQJik}fH!0)=j`b(G+|`)xLiyvi0rjX!yK&J-CZaCW)0dOrD&
zR8ML4${4_ZPgd1r%Uq4lX-&Rg>xAQ4zk`Zmae?~x&{X=u)AOMA8bw#Q14iKsE>}?)
z0*$7xy8cxw<kL9;Sr)36vNOqrUd=PLt`~F*R#{@9aGYM at _A=CFfCZCraBHTf3nd27
zv4U~~ia41YP<L5atL-E9(kiQ}5PylYz+tEgV4N}=uuTN2Q6I-5fO~D>JT-x&02+d-
za4 at GHSKKbo?<eyp at P;-}vH(m$aT at w_$7FQ?jfq=5^T%Icoq1zAyz|GXR4sx95t^~4
z22|uQgOGyN<)CyGw2N!%U!>JgJxakE7wA-Y1^NV)1EEgO-I^(AKJxwnU?11-s&K?Y
zRS)7Vmuf0!nFp0!gyK{w38n}0k}6TEot7*rvD!)x36U1dN7;n<W_pfvwFJr(5N=rd
zL;pzwLdf at NLIBjLl<}d~f~w=eqT;fZ+VT(>{|^Fzn69aj1hIntp13PzcV<n7dv=uZ
zW%xX0(q3p*NdK=FaNr(oDJ>{~A7MEM$_9aBDIEc_j5arDsYc^D)Rr?&U9PR9mA8W2
z2UUt_zz)$G>NVhESom3OjwFA~i@?HaV6k859o#fej!ZO|&z8bbiL`n=<xNL}yw^Db
z`TtxKD3|rJoSd1aHytJx?36PZSNKnV5;M(Z4&eeV5d2Y!O7RE1C at JHIp`DwxF|0U>
z!Y36G<r+sWd_64&Qsy2i)ne&0{#y+gfv6P~nmK%#O=Egq%m|b3qi_~z9);Y#oZ{0Q
zk%|ho+jqi<sE<mQAb}B6RKj&I#fpH^6)joBsV3M5dX7lciq9g1pj^&Dfl%{I`hA7N
zdXyYQ{q%oqkW%*pcX)jiu418rBg_vt97P5W_+N%fE3Iq=6{f%pJK#`nlAINWrsv?6
z=buxw7aUiP|379na@?Ow9Jik1xC(w?puiA}$zkaq<$BNJWx*#Jdn-x@!X;IAbUqR8
zt+=#J`c$@Y8_;(V=WBGx_ at Mn6q<_}d)?2Txt#{b!Tt46Twpq4(fBRiKEe~zm at xb=`
z?zP~p#rgm}`rg)izg>f`wT{~QdPi+Tz2#2!sQzmX2R*y0_A1*U%y-Y$JMVko;rgp<
z*Kpij1su0^$31J;)NG}>YqIYg9QTU0c6Pc~@m=fXd+?6$ZNIbHQp^?NS%taHQc)2e
zsJz{=r0#qn$&07j9~*SgfRCFC$5e~!+ICO*qRKXpt*BC3YzjWn)~j6FruObwMc+&%
zq4rkO at _N^{+tt1wV&XdAj_nU^-MOu9=RLl<+PV$3>F>2{x7+XCxoyW?TkqV)nRt$4
zI>9=oiuC7i+<V`>+qOLD^WC>&Cp|CYxNo`dyZ6oqckI}9 at 12iOzi(~Xxnuji-}dad
z at 6K%xJb+Ks&rZ)tn>n4g+`avt2k;VqnlMiQ|HhXYLv2#IJFs|3MMqe*1XWW>`+&5^
z;tH5bN-Nvc)zd{Yu3hxcQ>#OpV$(%aE2T;W4_e1WWrL+HJZn)Lf~jN=JqXN{xBUbU
zc1a$it75un$+=+hj7xTz9^Xr^@x=9{RJlIPMxP75A_g9 at wC$3%o(uXaic8DahaEGn
z#-*lL#EQxuxm>LcZ0wabFG|nE=KYQ2+QH^!-(FwjIv1R^tREB41)~jPQaSrHYjHn{
zso%D=Wd&1yX=w}55Vo at 6AFz~a$(7 at u%3T3%BIEL^*2*>rVr`x-Qc5d}4;7ayp~{|F
zOZVmMpM8~VS0NL++{k1x^{v?h1t}p@>9xCP<Q5Y@<HCBqRe_8Wc1g+Q>=~^(UDVm3
zDeRq!)?G~O_y>?j8i%q&rl(e$&b5-L#aD);C8d?LJ<kordq}ZkB{MHh7j2EONd`6Z
zl+}=t%Ia8KKV4L=^ptn6f|M}XE$&@Xg)6j}8L at at!;Gu#TWrF#+KOGFJ*zpc1^9-m
za}6PBag{s#iipoO9UM0ezcQTSFj{i_4avbRCCL~lB+u((B1vcX`lU0jUUfAo$y-Tp
z3$}Lp-;mMK6fHUzlx7&3ri)gb3z`b-nxY9 at P`ataa0;3X`S(E3a&J2u{T{k_ip%~C
zdQ!MoH2eCWBN&=`up(K9D=A-(<>W3r>n;Tfyyt at c2ce(}%sJzFbk+iqEe}DsR&mA^
z`;wqx_|5=UEH2-Sr7f;UO%3e>v?XYQW`ashUCZgKJWd}k23!l?+l{xy5|mo-F6Q(u
zCPNn-0O}#%^&59d@?MfAc6WtqQRvwM!%L<3(zC+bVH#*S7nEt$QtbPR^~H^gTHDks
z9kihTex{nitEmU!E?B$-Hcuw6>xEp*@tCtfZHr4v2S}@reNF3Y0vsSbKveF26h_5h
zH{=SyVum}ym(wP9(_`kmQpNf)b#=Sn{D6rsDaG=nZw3U008>>1{!OdX{PY5SAbNQN
z)+61vUk?kX$)KZ6@}DhUR$3YE-D=qFfBO1el9j}Qh2YEF8~ASdZ-{bg6}HtSljz>X
zdsmzIf`|&u;Z3p<h>^-WLy-I5%LzSf<D`8}8PV2^a at LPol$W6N at 9rUGNhJ`f3i=%B
zW8Y0B6&+(x2C#w6G;|;gt(WR&T>k%4$&_K5>14|7ZZqsQl|Z=fZ@^mXL2MnKzH)*T
zjOf_=%&f%{Ds^1<ir8)nZzdDnKxhl!Qeo<9C)D2YG;lGz*i&%%-$3M3PHe3E2M~pM
z#(%6>QE=zq;`t5hXF8w2zppo}D6NzjRt`QhD~F1glo-DLYp#NnU1E53?TpK?1kgTn
z#rmYD;Js&Mm)l=_rKi~XYnm`%DyX>2KWmA#J_Ut?g^SDnnV!c6u<a#|qnr9FdOMz4
zT?yWn?^z5f`KtB-W+d*@1{siCSE#|-`$N2i<|_XdAP!3&g*}IOW3P}$V`R^s0&GsX
z!c#2$Pg}86U_|dbyjWXaMiX}h3rgE#ZDoLSS9bwcFRMn63PbDb7$19Qg{6~Ujy)BZ
ztv8Yue^c1zDR2&6lmW4)PiYO9s at lVCs=S+D0w|A(?E?ecXKUqvsRGkU4;m|rrSDVo
z2sJ;T=10{0n3_&%g4FD$<}qsiikc^>`6)GfjIG6GPZ=u*xHp>Q0QV_1o7SPZpPD^r
z{3p;5>MaV)0JDYPDkwFDe at o32n$UEC;kwT_P?JC9l>OmV7MH&VjXbc*BHu2m7H@~B
z%5DA+ at GSNv8escWQJZ9W6^-NdB5b+hM}7c=n*G%L9!;mRtM?8}DXo|NJ*#Q9)t26A
z%tjt7e<Vufmh&Q<geEfZXbP#}sWGGRmhwPom}tqqOto0nER!s&=w$^O`3ic8%`abs
z<`QaFpeeg-5pi+r^#vt{aWoAG*%mp3;c^!mZ#NpK{7Q6fvn{Gj8>h;0gr2v7D+rp`
z-B<t>_5930(0&m!*VFV()HGAGo*EZ5*HUv6HQ%6S6E$0?d5-LID}DMVHGe_P|EA_!
z)NG~ZPBdlTUIeQ>w_Xl$!?(x=7Ik|o<k97j_a!v`aWt+);eRlcnz~0xo{|Pr`2XQs
zIDw|?B?F+j-A<gdx|ml=O+7Cg;B)2s4Xqu}z)RG${ws&(cW7RsruAKFPSaOvTHmKn
z)U=+ZPt>%2LZ7H<O`%af<qD=A_WPqi#@mF9V%X9 at Vng!*HDy%*MH?ER?q-7CEok1L
zX31 at 6>Zxf*V=8Ya8u!~Twv at qBEZ-qp)(U7Es98(RI%=*#BV8vHOZ}v$L)08b)A*}J
za3af#l?cmR{bDUvmm0efowYw#BYq<l<QgJ9v$CO=Qwzfd=eYp4&0isx_Ld~Mj<)i$
z_D7dJwR*9U`uHwW>pQ)kO3ts1&rU>hR7s0}ZsIT_$K^g>;zBM!?+c~HNL9Ip|0ON{
L<pTX^9R2zKHZvW5

literal 0
HcmV?d00001

diff --git a/llvm/test/tools/dsymutil/swiftmodule.test b/llvm/test/tools/dsymutil/swiftmodule.test
new file mode 100644
index 0000000000000..05d4021886c2f
--- /dev/null
+++ b/llvm/test/tools/dsymutil/swiftmodule.test
@@ -0,0 +1,29 @@
+# RUN: dsymutil -verbose -oso-prepend-path=%p -y -o %t.dSYM  %s | FileCheck %s
+#
+# RUN: dsymutil --linker parallel -verbose -oso-prepend-path=%p -y %s -o %t-parallel.dSYM | FileCheck %s
+#
+# To regenerate:
+# echo ''>I.swift
+# echo ''>B.swift
+# echo 'import I'>main.swift
+# xcrun swiftc -emit-module-interface-path I.swiftinterface -enable-library-evolution I.swift
+# xcrun swiftc -emit-module-path B.swiftmodule B.swift -Xfrontend -no-serialize-debugging-options
+# xcrun swiftc -explicit-module-build main.swift -I. -module-cache-path cache -g -Xfrontend  -no-serialize-debugging-options
+# output is "B.swiftmodule" and "cache/I*.swiftmodule"
+#
+# CHECK-NOT: Skipping compiled textual Swift interface: {{.*}}/Inputs/Binary.swiftmodule
+# CHECK: Skipping compiled textual Swift interface: {{.*}}/Inputs/FromInterface.swiftmodule
+
+#
+---
+triple:          'arm64-apple-darwin'
+objects:
+  - filename:        '/Inputs/Binary.swiftmodule'
+    timestamp:       0
+    type:            50
+    symbols:         []
+  - filename:        '/Inputs/FromInterface.swiftmodule'
+    timestamp:       0
+    type:            50
+    symbols:         []
+...
diff --git a/llvm/test/tools/dsymutil/yaml-object-address-rewrite.test b/llvm/test/tools/dsymutil/yaml-object-address-rewrite.test
index dfa0f285c5ce5..74e8c1e7ae777 100644
--- a/llvm/test/tools/dsymutil/yaml-object-address-rewrite.test
+++ b/llvm/test/tools/dsymutil/yaml-object-address-rewrite.test
@@ -12,10 +12,12 @@
 # CHECK-NEXT: objects:
 # CHECK-NEXT: filename:{{.*}}/Inputs/basic1.macho.x86_64.o
 # CHECK-NEXT: timestamp: 0
+# CHECK-NEXT: type: 102
 # CHECK-NEXT: symbols:
 # CHECK-NEXT: sym: _main, objAddr: 0x0, binAddr: 0x100000EA0, size: 0x24
 # CHECK-NEXT: filename:{{.*}}/Inputs/./libbasic.a(basic2.macho.x86_64.o)'
 # CHECK-NEXT: timestamp: 0
+# CHECK-NEXT: type: 102
 # CHECK-NEXT: symbols:
 # CHECK-DAG:   sym: _foo, objAddr: 0x20, binAddr: 0x100000ED0, size: 0x50
 # CHECK-DAG:   sym: _private_int, objAddr: 0x560, binAddr: 0x100001004, size: 0x0
@@ -24,6 +26,7 @@
 # CHECK-NOT: { sym:
 # CHECK-NEXT: filename:{{.*}}/Inputs/./libbasic.a(basic3.macho.x86_64.o)'
 # CHECK-NEXT: timestamp: 0
+# CHECK-NEXT: type: 102
 # CHECK-NEXT: symbols:
 # CHECK-DAG:   sym: _val, binAddr: 0x100001008, size: 0x0
 # CHECK-DAG:   sym: _bar, objAddr: 0x20, binAddr: 0x100000F40, size: 0x50
diff --git a/llvm/tools/dsymutil/CMakeLists.txt b/llvm/tools/dsymutil/CMakeLists.txt
index efe28bda68ebf..f88b1d0b20cef 100644
--- a/llvm/tools/dsymutil/CMakeLists.txt
+++ b/llvm/tools/dsymutil/CMakeLists.txt
@@ -32,6 +32,7 @@ add_llvm_tool(dsymutil
   MachOUtils.cpp
   Reproducer.cpp
   RelocationMap.cpp
+  SwiftModule.cpp
 
   DEPENDS
   intrinsics_gen
diff --git a/llvm/tools/dsymutil/DebugMap.cpp b/llvm/tools/dsymutil/DebugMap.cpp
index b38d502dda7c9..1ce7e9b9ed201 100644
--- a/llvm/tools/dsymutil/DebugMap.cpp
+++ b/llvm/tools/dsymutil/DebugMap.cpp
@@ -50,8 +50,8 @@ bool DebugMapObject::addSymbol(StringRef Name,
     return true;
   }
 
-  auto InsertResult = Symbols.insert(
-      std::make_pair(Name, SymbolMapping(ObjectAddress, LinkedAddress, Size)));
+  auto InsertResult = Symbols.insert(std::make_pair(
+      Name, SymbolMapping(ObjectAddress, LinkedAddress, Size)));
 
   if (ObjectAddress && InsertResult.second)
     AddressToMapping[*ObjectAddress] = &*InsertResult.first;
@@ -161,12 +161,13 @@ namespace yaml {
 
 // Normalize/Denormalize between YAML and a DebugMapObject.
 struct MappingTraits<dsymutil::DebugMapObject>::YamlDMO {
-  YamlDMO(IO &io) { Timestamp = 0; }
+  YamlDMO(IO &io) {}
   YamlDMO(IO &io, dsymutil::DebugMapObject &Obj);
   dsymutil::DebugMapObject denormalize(IO &IO);
 
   std::string Filename;
-  int64_t Timestamp;
+  int64_t Timestamp = 0;
+  uint8_t Type = MachO::N_OSO;
   std::vector<dsymutil::DebugMapObject::YAMLSymbolMapping> Entries;
 };
 
@@ -183,6 +184,7 @@ void MappingTraits<dsymutil::DebugMapObject>::mapping(
   MappingNormalization<YamlDMO, dsymutil::DebugMapObject> Norm(io, DMO);
   io.mapRequired("filename", Norm->Filename);
   io.mapOptional("timestamp", Norm->Timestamp);
+  io.mapOptional("type", Norm->Type);
   io.mapRequired("symbols", Norm->Entries);
 }
 
@@ -236,6 +238,7 @@ MappingTraits<dsymutil::DebugMapObject>::YamlDMO::YamlDMO(
     IO &io, dsymutil::DebugMapObject &Obj) {
   Filename = Obj.Filename;
   Timestamp = sys::toTimeT(Obj.getTimestamp());
+  Type = Obj.getType();
   Entries.reserve(Obj.Symbols.size());
   for (auto &Entry : Obj.Symbols)
     Entries.push_back(
@@ -286,7 +289,6 @@ MappingTraits<dsymutil::DebugMapObject>::YamlDMO::denormalize(IO &IO) {
     }
   }
 
-  uint8_t Type = MachO::N_OSO;
   if (Path.ends_with(".dylib")) {
     // FIXME: find a more resilient way
     Type = MachO::N_LIB;
diff --git a/llvm/tools/dsymutil/DwarfLinkerForBinary.cpp b/llvm/tools/dsymutil/DwarfLinkerForBinary.cpp
index f6a35708dc076..c8fa4dbeffb9e 100644
--- a/llvm/tools/dsymutil/DwarfLinkerForBinary.cpp
+++ b/llvm/tools/dsymutil/DwarfLinkerForBinary.cpp
@@ -10,6 +10,7 @@
 #include "BinaryHolder.h"
 #include "DebugMap.h"
 #include "MachOUtils.h"
+#include "SwiftModule.h"
 #include "dsymutil.h"
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/ADT/DenseMap.h"
@@ -783,6 +784,21 @@ bool DwarfLinkerForBinary::linkImpl(
         reportWarning("Could not open '" + File + "'");
         continue;
       }
+      auto FromInterfaceOrErr =
+          IsBuiltFromSwiftInterface((*ErrorOrMem)->getBuffer());
+      if (!FromInterfaceOrErr) {
+        reportWarning("Could not parse binary Swift module: " +
+                          toString(FromInterfaceOrErr.takeError()),
+                      Obj->getObjectFilename());
+        // Only skip swiftmodules that could be parsed and are
+        // positively identified as textual.
+      } else if (*FromInterfaceOrErr) {
+        if (Options.Verbose)
+          outs() << "Skipping compiled textual Swift interface: "
+                 << Obj->getObjectFilename() << "\n";
+        continue;
+      }
+
       sys::fs::file_status Stat;
       if (auto Err = sys::fs::status(File, Stat)) {
         reportWarning(Err.message());
diff --git a/llvm/tools/dsymutil/RelocationMap.h b/llvm/tools/dsymutil/RelocationMap.h
index 3d851acf2b892..5a804cd141c38 100644
--- a/llvm/tools/dsymutil/RelocationMap.h
+++ b/llvm/tools/dsymutil/RelocationMap.h
@@ -37,6 +37,7 @@ struct SymbolMapping {
   std::optional<yaml::Hex64> ObjectAddress;
   yaml::Hex64 BinaryAddress;
   yaml::Hex32 Size;
+  yaml::Hex8 Type;
 
   SymbolMapping(std::optional<uint64_t> ObjectAddr, uint64_t BinaryAddress,
                 uint32_t Size)
diff --git a/llvm/tools/dsymutil/SwiftModule.cpp b/llvm/tools/dsymutil/SwiftModule.cpp
new file mode 100644
index 0000000000000..ba7ee8f1c93ed
--- /dev/null
+++ b/llvm/tools/dsymutil/SwiftModule.cpp
@@ -0,0 +1,203 @@
+//===- tools/dsymutil/SwiftModule.cpp -------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Bitcode/BitcodeReader.h"
+#include "llvm/Bitcode/LLVMBitCodes.h"
+#include "llvm/Bitstream/BitCodes.h"
+#include "llvm/Bitstream/BitstreamReader.h"
+
+static const unsigned char SWIFTMODULE_SIGNATURE[] = {0xE2, 0x9C, 0xA8, 0x0E};
+static const uint16_t expectedMajorVersion = 0;
+static const unsigned MODULE_BLOCK_ID = llvm::bitc::FIRST_APPLICATION_BLOCKID;
+static const unsigned CONTROL_BLOCK_ID =
+    llvm::bitc::FIRST_APPLICATION_BLOCKID + 1;
+static const unsigned METADATA = 1;
+static const unsigned OPTIONS_BLOCK_ID =
+    llvm::bitc::FIRST_APPLICATION_BLOCKID + 8;
+static const unsigned IS_BUILT_FROM_INTERFACE = 11;
+
+static llvm::Error
+checkModuleSignature(llvm::BitstreamCursor &cursor,
+                     llvm::ArrayRef<unsigned char> signature) {
+  for (unsigned char byte : signature) {
+    if (cursor.AtEndOfStream())
+      return llvm::createStringError("malformed bitstream");
+    if (llvm::Expected<llvm::SimpleBitstreamCursor::word_t> maybeRead =
+            cursor.Read(8)) {
+      if (maybeRead.get() != byte)
+        return llvm::createStringError("malformed bitstream");
+    } else
+      return maybeRead.takeError();
+  }
+  return llvm::Error::success();
+}
+
+static llvm::Error enterTopLevelModuleBlock(llvm::BitstreamCursor &cursor,
+                                            unsigned ID,
+                                            bool shouldReadBlockInfo = true) {
+  llvm::Expected<llvm::BitstreamEntry> maybeNext = cursor.advance();
+  if (!maybeNext)
+    return maybeNext.takeError();
+  llvm::BitstreamEntry next = maybeNext.get();
+
+  if (next.Kind != llvm::BitstreamEntry::SubBlock)
+    return llvm::createStringError("malformed bitstream");
+
+  if (next.ID == llvm::bitc::BLOCKINFO_BLOCK_ID) {
+    if (shouldReadBlockInfo) {
+      if (!cursor.ReadBlockInfoBlock())
+        return llvm::createStringError("malformed bitstream");
+    } else {
+      if (cursor.SkipBlock())
+        return llvm::createStringError("malformed bitstream");
+    }
+    return enterTopLevelModuleBlock(cursor, ID, false);
+  }
+
+  if (next.ID != ID)
+    return llvm::createStringError("malformed bitstream");
+
+  if (llvm::Error Err = cursor.EnterSubBlock(ID))
+    return Err;
+
+  return llvm::Error::success();
+}
+
+static llvm::Expected<bool>
+readOptionsBlock(llvm::BitstreamCursor &cursor,
+                 llvm::SmallVectorImpl<uint64_t> &scratch) {
+  bool is_built_from_interface = false;
+  while (!cursor.AtEndOfStream()) {
+    llvm::Expected<llvm::BitstreamEntry> maybeEntry = cursor.advance();
+    if (!maybeEntry)
+      return maybeEntry.takeError();
+
+    llvm::BitstreamEntry entry = maybeEntry.get();
+    if (entry.Kind == llvm::BitstreamEntry::EndBlock)
+      break;
+
+    if (entry.Kind == llvm::BitstreamEntry::Error)
+      return llvm::createStringError("malformed bitstream");
+
+    if (entry.Kind == llvm::BitstreamEntry::SubBlock) {
+      if (cursor.SkipBlock())
+        return llvm::createStringError("malformed bitstream");
+      continue;
+    }
+
+    scratch.clear();
+    llvm::StringRef blobData;
+    llvm::Expected<unsigned> maybeKind =
+        cursor.readRecord(entry.ID, scratch, &blobData);
+    if (!maybeKind)
+      return maybeKind.takeError();
+    unsigned kind = maybeKind.get();
+    switch (kind) {
+    case IS_BUILT_FROM_INTERFACE:
+      is_built_from_interface = true;
+      continue;
+    default:
+      continue;
+    }
+  }
+  return is_built_from_interface;
+}
+
+static llvm::Expected<bool>
+parseControlBlock(llvm::BitstreamCursor &cursor,
+                  llvm::SmallVectorImpl<uint64_t> &scratch) {
+  // The control block is malformed until we've at least read a major version
+  // number.
+  bool versionSeen = false;
+
+  while (!cursor.AtEndOfStream()) {
+    llvm::Expected<llvm::BitstreamEntry> maybeEntry = cursor.advance();
+    if (!maybeEntry) {
+      return maybeEntry.takeError();
+    }
+    llvm::BitstreamEntry entry = maybeEntry.get();
+    if (entry.Kind == llvm::BitstreamEntry::EndBlock)
+      break;
+
+    if (entry.Kind == llvm::BitstreamEntry::Error)
+      return llvm::createStringError("malformed bitstream");
+
+    if (entry.Kind == llvm::BitstreamEntry::SubBlock) {
+      if (entry.ID == OPTIONS_BLOCK_ID) {
+        if (llvm::Error Err = cursor.EnterSubBlock(OPTIONS_BLOCK_ID))
+          return Err;
+
+        return readOptionsBlock(cursor, scratch);
+      } else {
+        // Unknown metadata sub-block, possibly for use by a future version of
+        // the module format.
+        if (cursor.SkipBlock())
+          return llvm::createStringError("malformed bitstream");
+      }
+      continue;
+    }
+
+    scratch.clear();
+    llvm::StringRef blobData;
+    llvm::Expected<unsigned> maybeKind =
+        cursor.readRecord(entry.ID, scratch, &blobData);
+    if (!maybeKind)
+      return maybeKind.takeError();
+
+    unsigned kind = maybeKind.get();
+    switch (kind) {
+    case METADATA: {
+      if (versionSeen) {
+        return llvm::createStringError("multiple metadata blocks");
+      }
+
+      uint16_t versionMajor = scratch[0];
+      if (versionMajor != expectedMajorVersion)
+        return llvm::createStringError("unsupported module version");
+
+      versionSeen = true;
+      break;
+    }
+    default:
+      continue;
+    }
+  }
+  return llvm::createStringError("could not find control block");
+}
+
+llvm::Expected<bool> IsBuiltFromSwiftInterface(llvm::StringRef data) {
+  llvm::BitstreamCursor cursor(data);
+  if (llvm::Error Err = checkModuleSignature(cursor, SWIFTMODULE_SIGNATURE))
+    return llvm::joinErrors(
+        llvm::createStringError("could not check signature"), std::move(Err));
+  if (llvm::Error Err = enterTopLevelModuleBlock(cursor, MODULE_BLOCK_ID, false))
+    return llvm::joinErrors(
+        llvm::createStringError("could not enter top level block"),
+        std::move(Err));
+
+  llvm::BitstreamEntry topLevelEntry;
+  llvm::SmallVector<uint64_t, 32> scratch;
+
+  while (!cursor.AtEndOfStream()) {
+    llvm::Expected<llvm::BitstreamEntry> maybeEntry =
+        cursor.advance(llvm::BitstreamCursor::AF_DontPopBlockAtEnd);
+    if (!maybeEntry)
+      return maybeEntry.takeError();
+
+    topLevelEntry = maybeEntry.get();
+    if (topLevelEntry.Kind != llvm::BitstreamEntry::SubBlock)
+      break;
+
+    if (topLevelEntry.ID == CONTROL_BLOCK_ID) {
+      if (llvm::Error Err = cursor.EnterSubBlock(CONTROL_BLOCK_ID))
+        return Err;
+      return parseControlBlock(cursor, scratch);
+    }
+  }
+  return llvm::createStringError("no control block found");
+}
diff --git a/llvm/tools/dsymutil/SwiftModule.h b/llvm/tools/dsymutil/SwiftModule.h
new file mode 100644
index 0000000000000..599fe4530772f
--- /dev/null
+++ b/llvm/tools/dsymutil/SwiftModule.h
@@ -0,0 +1,15 @@
+//===- tools/dsymutil/SwiftModule.h ----------------------------*- C++ -*--===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+#ifndef LLVM_TOOLS_DSYMUTIL_SWIFTMODULE_H
+#define LLVM_TOOLS_DSYMUTIL_SWIFTMODULE_H
+
+#include "llvm/Support/Error.h"
+
+llvm::Expected<bool> IsBuiltFromSwiftInterface(llvm::StringRef data);
+
+#endif



More information about the llvm-commits mailing list