From 1ee18f275e60462d8c5e149fc74eaea9c671d4a8 Mon Sep 17 00:00:00 2001 From: Francis Visoiu Mistrih Date: Mon, 30 Sep 2019 09:05:12 -0700 Subject: [PATCH] [dsymutil] Add support for linking remarks This adds support to dsymutil for linking remark files and placing them in the final .dSYM bundle. The result will be placed in: * a.out.dSYM/Contents/Resources/Remarks/a.out or * a.out.dSYM/Contents/Resources/Remarks/a.out- for universal binaries When multi-threaded, this runs a third thread which loops over all the object files and parses remarks as it finds __remarks sections. Testing this involves running dsymutil on pre-built binaries and object files, then running llvm-bcanalyzer on the final result to check for remarks. Differential Revision: https://reviews.llvm.org/D69142 --- llvm/test/tools/dsymutil/Inputs/basic1.c | 7 ++ .../Inputs/remarks/basic.macho.remarks.x86_64 | Bin 0 -> 9280 bytes .../Inputs/remarks/basic1.macho.remarks.x86_64.o | Bin 0 -> 2416 bytes .../basic1.macho.remarks.x86_64.opt.bitstream | Bin 0 -> 384 bytes .../Inputs/remarks/basic2.macho.remarks.x86_64.o | Bin 0 -> 3356 bytes .../basic2.macho.remarks.x86_64.opt.bitstream | Bin 0 -> 592 bytes .../Inputs/remarks/basic3.macho.remarks.x86_64.o | Bin 0 -> 3080 bytes .../basic3.macho.remarks.x86_64.opt.bitstream | Bin 0 -> 592 bytes .../remarks/fat.macho.remarks.i386.opt.bitstream | Bin 0 -> 372 bytes .../dsymutil/Inputs/remarks/fat.macho.remarks.x86 | Bin 0 -> 24876 bytes .../Inputs/remarks/fat.macho.remarks.x86.c | 14 ++++ .../Inputs/remarks/fat.macho.remarks.x86.o | Bin 0 -> 14440 bytes .../remarks/fat.macho.remarks.x86.opt.bitstream | Bin 0 -> 372 bytes .../remarks/fat.macho.remarks.x86_64.opt.bitstream | Bin 0 -> 344 bytes .../fat.macho.remarks.x86_64h.opt.bitstream | Bin 0 -> 344 bytes .../tools/dsymutil/X86/basic-linking-bundle.test | 3 + .../tools/dsymutil/X86/remarks-linking-bundle.test | 59 ++++++++++++++ .../dsymutil/X86/remarks-linking-fat-bundle.test | 16 ++++ llvm/test/tools/dsymutil/cmdline.test | 2 + llvm/tools/dsymutil/CMakeLists.txt | 1 + llvm/tools/dsymutil/DwarfLinker.cpp | 88 ++++++++++++++++++++- llvm/tools/dsymutil/LinkUtils.h | 16 ++++ llvm/tools/dsymutil/Options.td | 12 +++ llvm/tools/dsymutil/dsymutil.cpp | 16 ++++ 24 files changed, 233 insertions(+), 1 deletion(-) create mode 100755 llvm/test/tools/dsymutil/Inputs/remarks/basic.macho.remarks.x86_64 create mode 100644 llvm/test/tools/dsymutil/Inputs/remarks/basic1.macho.remarks.x86_64.o create mode 100644 llvm/test/tools/dsymutil/Inputs/remarks/basic1.macho.remarks.x86_64.opt.bitstream create mode 100644 llvm/test/tools/dsymutil/Inputs/remarks/basic2.macho.remarks.x86_64.o create mode 100644 llvm/test/tools/dsymutil/Inputs/remarks/basic2.macho.remarks.x86_64.opt.bitstream create mode 100644 llvm/test/tools/dsymutil/Inputs/remarks/basic3.macho.remarks.x86_64.o create mode 100644 llvm/test/tools/dsymutil/Inputs/remarks/basic3.macho.remarks.x86_64.opt.bitstream create mode 100644 llvm/test/tools/dsymutil/Inputs/remarks/fat.macho.remarks.i386.opt.bitstream create mode 100755 llvm/test/tools/dsymutil/Inputs/remarks/fat.macho.remarks.x86 create mode 100644 llvm/test/tools/dsymutil/Inputs/remarks/fat.macho.remarks.x86.c create mode 100644 llvm/test/tools/dsymutil/Inputs/remarks/fat.macho.remarks.x86.o create mode 100644 llvm/test/tools/dsymutil/Inputs/remarks/fat.macho.remarks.x86.opt.bitstream create mode 100644 llvm/test/tools/dsymutil/Inputs/remarks/fat.macho.remarks.x86_64.opt.bitstream create mode 100644 llvm/test/tools/dsymutil/Inputs/remarks/fat.macho.remarks.x86_64h.opt.bitstream create mode 100644 llvm/test/tools/dsymutil/X86/remarks-linking-bundle.test create mode 100644 llvm/test/tools/dsymutil/X86/remarks-linking-fat-bundle.test diff --git a/llvm/test/tools/dsymutil/Inputs/basic1.c b/llvm/test/tools/dsymutil/Inputs/basic1.c index cedf83ae..a41edc9 100644 --- a/llvm/test/tools/dsymutil/Inputs/basic1.c +++ b/llvm/test/tools/dsymutil/Inputs/basic1.c @@ -19,6 +19,13 @@ Archive compilation (after basic compilation): ar -q libbasic.a basic2.macho.x86_64.o basic3.macho.x86_64.o clang basic1.macho.x86_64.o -lbasic -o basic-archive.macho.x86_64 -Wl,-dead_strip -L. + + Remarks compilation: + for FILE in basic1.c basic2.c basic3.c; do + clang -gline-tables-only -c $FILE -fsave-optimization-record=bitstream -foptimization-remarks-file=/tmp/${FILE%.c}.macho.remarks.x86_64.opt.bitstream -mllvm -remarks-section -o ${FILE%.c}.macho.remarks.x86_64.o + done + clang basic1.macho.remarks.x86_64.o basic2.macho.remarks.x86_64.o basic3.macho.remarks.x86_64.o -o basic.macho.remarks.x86_64 -Wl,-dead_strip + */ int foo(int); diff --git a/llvm/test/tools/dsymutil/Inputs/remarks/basic.macho.remarks.x86_64 b/llvm/test/tools/dsymutil/Inputs/remarks/basic.macho.remarks.x86_64 new file mode 100755 index 0000000000000000000000000000000000000000..59e53c8de9acbfd3a4c3b28fe28346d910c12db7 GIT binary patch literal 9280 zcmeHN-)me&6rP)8O{lTE6)LS(d#R;rZSTf3ED=PEX4@^AHq;1G3B%nVAs4f|vOi*4 z8Yr#>FBhx$;-mco`p~|#f-j~O4ZhU=2c;maV4;tTY#YDt-aFa5o21qUUt|uPJM*2H zIdjgpGjQ+B-umm_!$Bd8ej(2H2_fQ8b3lj-!bDAo-OvnF%IS$?>C@>`Cu!{#qZ@9D z=%)#lawh%ZOm`Q5e4^VXLL7sc%GfAU)(T6tpdR3Ee^<6688kc*21Sf?Ix-;6cL4p> zOP@NWymU%)Wi<50_dN)qD{?>~R`!QZ3ek}_MZcHC`f!{rRzXjn9>f#d1lRdgB}Vm;O5I?7ibB z-c3&)S8K%V;SHGbRv0MbipI7N>v+WP@edC(_)VGPF6cDyVU*^JP&j;&HYnw#P`M5d zL8J2lK9*n^3KKdEP1dWGuA?VKbrr zobhegpxgX9*9sPP-$4|hdR<;d{`A9j9~I6!4rN>LyBbKx=){6}-ak{V6^ho|7UFWU z!RP}h=s#l$F@*A!5R)%0ngPv#WIoWnZ}=qU(#((6U|v_s`%c?U_OkP^+z;T40p&~<%Ikm*aM|R zOTOFl-G2-v^*X*+DXjCGVHofHiQsF3W`o}kS~LTi0nLDBKr^5j&Gy|Fe&46Y= zGoTsxpEF=c+^@%Eab6ad3b}f%Amiy;>|^SLA=BBg?@46 zc|7j$@!Jb{d||>eGHv2OE<-uL!nAQNo)uAuIe!#0{t=wB zueMUEo v8nw0>!I2HVj%?}6&(Qb9+~8v~uR{C{BSBEG literal 0 HcmV?d00001 diff --git a/llvm/test/tools/dsymutil/Inputs/remarks/basic1.macho.remarks.x86_64.o b/llvm/test/tools/dsymutil/Inputs/remarks/basic1.macho.remarks.x86_64.o new file mode 100644 index 0000000000000000000000000000000000000000..f8aa44116ebe3020b91be19781527e31737bcb32 GIT binary patch literal 2416 zcmbVN&2Jl35PuuTj*~jB3l=5dxEoZY1jyPBCUIIL*-e66kyI!t5DwMqdA+u`-4C<7 zcGIe*sVpHPKq(6xm2wL^Z*g39ys)Zlmke)AXQKiW_I8DORgF*t9kQg z-pudKys!P`??3+?B82l1Xn+TScd+4sfyRK>QGWtWv9UcSJsmI!@+gZFMO)sm+aRKN zc4_@=Tlad$SqJeDGB)hy1$tJ_&nXv|VXi9tcqqWVhgDA>Xv24O_czXAJyT$Nw?l8H* z@R&*t5mNQ~D82ikD!PN%yM7ND-f0%J!|KgGAwS%=2>Ko#aUyVWp9fxK=d}bf1UlqF z-U03;Jd+-G+7Hryx3Kklq4`JTho#5pzIF9cVXMCP>D5QOs1};{BIoX|uB^VzLH_qcVkK*ZG(56 zO#%ZFty?f^TYRZC0k2qmU8fDIsI;icfJdbZYszJr)J#J)DsoMMmYk_;&d8}tHk|XB zG~q3Do%d5HeG`xZP`Saj&X~mQUroq0o_Pn!dXhN z=RLt{hj*%K2+SyKWM;+Lv|!Y1p$KK!rc5Rbl)9z>kWx*kYC{vimzUGhY_gclB&Fnhsw~gV&CSwM zDMRJ*>!mlO8Je1bFC(R=+8gAhO`Lt>j&LuBpY{8~k)tn$k8sbxKVv{3*ztuS*9DG;Lj>`hfp&w10AW^L_HwKS1bpEdT%j literal 0 HcmV?d00001 diff --git a/llvm/test/tools/dsymutil/Inputs/remarks/basic1.macho.remarks.x86_64.opt.bitstream b/llvm/test/tools/dsymutil/Inputs/remarks/basic1.macho.remarks.x86_64.opt.bitstream new file mode 100644 index 0000000000000000000000000000000000000000..ac700c36c6c7b7002403f87531b638b8964d94fe GIT binary patch literal 384 zcmWIY4f1B>U|?`yU|?Wp+~lyu$?}4;g^kTYjXllQK-Q9G>nY7P4USejnl1Mnc5JX< z;}B7jlXDb1wNUnuquez{o;M3+o+Qd$dMJCxG0-XPD%}gPJJ|Wo{_~704c7 zkUga+a{{RNp@N4Fcgh4s=NAW!5Yi1YryONoJ(M}nAbT%S=1?QV#7hl*4vGObHtjl7 zoUL1$ZPqYLEI4d^0qCg1HfNe2F)nQ9<7BP0Xs^m>FDhWKVrZ`RV6SpuH&AFV5@@fo zU^hr;FPCU9SkPWl!CrpBWr1@$*gO?ajT470uQ&t!1~e?0N!AMJeFjAy1_ovz%>u+L zKmtIZD!{-13?2p*1%VX@*%%lan1CE1t_%wqCxZ(h1wi27%mh})3S^t43a)4bssjTf Ysf+?317rqBZVS5*Le5PkV+K$R0990TCIA2c literal 0 HcmV?d00001 diff --git a/llvm/test/tools/dsymutil/Inputs/remarks/basic2.macho.remarks.x86_64.o b/llvm/test/tools/dsymutil/Inputs/remarks/basic2.macho.remarks.x86_64.o new file mode 100644 index 0000000000000000000000000000000000000000..880926b0cd8a728a981747fc9ff07b326d873307 GIT binary patch literal 3356 zcmbVPU2GIp6u#4C`pvm7#@X4~?#S%Sx-(m7 z6Sc5nx~UI55Mz8WXpHgM_}~K%mh#Z>AZmEvfk#cys4+efB;t2w?zG#b#>TTbbMCqK z-0z-q?zwknZ{Gjy?<&TG5W@q!4V)G6kiekb;Cs~hFBGrz2QJYZ&|$6vlMy#iCrD9T z{haH!eSP}K$?0`HXkFwD!lPwx)iG8>ecRXqiGUO(sk&;Q5&n2=I<~Ga@@6%cyWm&F z`tTzyMM*eLNpCscIFG9|6{UETyHZk=oSsp0X97$`nV5KKa^2z*Z;o>iiQ}(ZY;+g# z>WTb};C#xKf!!uk9>7Y$As29_)JjC++t#Z71KItR?h^FBmub~b8bz&?+1`U2< zXmA(!HQ3WpxC1!~NiZ*fi73v1={RoyB!ex`i}B)5ONYqtE z-g+KX;TxgoHBPONCHN`u)a2AL0RitsyGrJ@!pK5w z=y6l(qwOu9Hve(H?MAHaPDjga zp?;#H_4X$%%{9%y?m#~CkW@xjdUT4{yZQ3(>*1(e;&u6@m!*edqbd*UB*+~gf5u}vL zTbh@zqZVEhd9OWY=Pj41PNpl11i5;SP)f!fHo!1<&3+?LUq9a`CN2B8R(botScvwTQ{ex8B7FerfSVd$clr_lzMw){G@%3lOF2so-y1} zgyE!RCn=YHuHYQLTUfdX)rjv!H%xZ)rb;M&XI@4lxvt?A#M>6q;~mD`ZBEP#A8% z3Z`4b3$_>24G%fp9!ea2$p$a@uI+xZOPshtVCRc_~9tI*5ws8qIj zQ3-JG7~azt#D#adb1 z{js?7g4ijG?bS_UNETUTX#P*J)|>QWMFo~&jLH+3t>gnqDr8XW^ITG#FzXtDMEqS( zL*iTg5WUMt=Q(Mm&sEq}k{wC1BiY8~D3=nK5Z-tfm#}4FIPg9VfcApJ=nVFf)(N9z zf^Tbjzcyf8f+Xq(lOE8MqyvwtnrH{OWSF&<=}bwe^Gw0TH>U|?`yU|?Wp+~lyu$?}4;g^kTYjXllQK-Q9G>nY7P4USejnl1Mnc5JX< z;}B7jlXDb1wNUnuquez{o;M3+o+Qd$dMJCxG0-XPD%}gPJJ|Wo{_~704c7 zkUga+a{{RNp@N4Fcgh4s=NAW!5Yi1YryONoJ(M}nAbT%S=1?QV#7hl*4vGObHtjl7 zoUL1$ZPqYLEI4d^0qCg1HfNe2F)nQ9<7BP0Xs^m>FDhWKVrZ`RV6SpuH&AFV5@@fo zU^hr;FPCU9SkPWl!CrpBWr1@$*gO?ajT470uQ&t!1~e?0N!AMJeFjAy1_ovz%>u+L zKmtIZD!{-13?2p*1%VX@nHU%jfCPoOGAv}A3<5xGAaHPILQ)s7f{~Shp#i8Cs?Kl* zSQSDY&>Ds%st|P!Y(O&wC79WvYD`S{7E1U)ISURpwy{eoNKAyd186M6mQJA+jUcl@ zAWSD?2ap1}5hQ1#BaD#CGRt^?B)6qAXvIO0$3P&=3Qb=yLN3b&O<&TAMo^%D0ET_Z K2)Qgfus#3-qLPFF literal 0 HcmV?d00001 diff --git a/llvm/test/tools/dsymutil/Inputs/remarks/basic3.macho.remarks.x86_64.o b/llvm/test/tools/dsymutil/Inputs/remarks/basic3.macho.remarks.x86_64.o new file mode 100644 index 0000000000000000000000000000000000000000..9508c979596385d4111997f602bd88b76a834292 GIT binary patch literal 3080 zcmbVOU2GIp6h71KY?rod7pQ=-w6_M6f_C~tZMQ!pUD}$Wg=neTnBXuwJKG(ZomqBf zwgrP0*ANsvu_@KrIUrdbgp&`5wcpyAjVtnAis4pfp(S%2WL_Fv2o$hw2fp|9O zo_p^7?sw0*f3vIi|N5s6KnejCsI{oKsbHumPovI~{~t0CE_K`$n7~I)Al)j)sj6oz zc)~%WsxuR_Gi5)hofj42Bg&2j06s-6ECv{|s+u>lTK=Rf8dY^_>Ww31M8Gp%Q)(;7 zw|6y^kvaC)Iqv3BKS6+42t0Ze`!yT-g zFH*cFEk%}Y9=|?)Wcn2;0ZI>Rzdtm1dn`UOa;@WPaTse~6^AbsM-~%9E5*U9 z*At8JaHRR!)=#yaYl+q$ukHCkYFuk?xp8jKt;DI(ww5oO@1ASDm1zCBz2%P7IMu%A z&KE7sTbhx(y%E4iONZxkB?L#EaU*Tore``fm^R-`-}YT2)eA|@HT46E4r7{S83v>s z2ab7p)1Cu1Z(0_!9gigqRvMN<>p83h&I5Mn8uBpHb6IMA4raQ{x3z+1T3XUFaE?42 zH3~-laA|JS)`9bGB&}d$ZpQJg6tihm<@C^@JFa(-x9@`?2GfS-Vpg`pG;3Zv?UpE+ z=3x#=-!m{7O+R_eJYzsE?^w>9ku$M`qkfk696IgcO^yR|3CEJ;Vv;QF+d5yb!!~{# zd|n@OeA@%f&35K+fjk4V^0O8FE(`#UUB_=E>g|J`K^Vk6`2>$~m-vu%i4DLPIpZjz zQCW!htNne7lk=1$uC13hv@8xp(JjrMW4J0VZYJyLR`AC6SYLiKGI*gatL{(KbTuOGY!&0Oo}zuMV1k@ z7r`y4EB7gihYtfBB%-nNHDg|XgI!8*cjR<5(N81xi(?J(2_ibN`4@;?iDWoZlaID3sLFq VRq0Vz3z`KgT~++AQF{9U{sp`i_45D# literal 0 HcmV?d00001 diff --git a/llvm/test/tools/dsymutil/Inputs/remarks/basic3.macho.remarks.x86_64.opt.bitstream b/llvm/test/tools/dsymutil/Inputs/remarks/basic3.macho.remarks.x86_64.opt.bitstream new file mode 100644 index 0000000000000000000000000000000000000000..e29471cd769055d4d82762c7a64d4b6aaed0463e GIT binary patch literal 592 zcmWIY4f1B>U|?`yU|?Wp+~lyu$?}4;g^kTYjXllQK-Q9G>nY7P4USejnl1Mnc5JX< z;}B7jlXDb1wNUnuquez{o;M3+o+Qd$dMJCxG0-XPD%}gPJJ|Wo{_~704c7 zkUga+a{{RNp@N4Fcgh4s=NAW!5Yi1YryONoJ(M}nAbT%S=1?QV#7hl*4vGObHtjl7 zoUL1$ZPqYLEI4d^0qCg1HfNe2F)nQ9<7BP0Xs^m>FDhWKVrZ`RV6SpuH&AFV5@@fo zU^hr;FPCU9SkPWl!CrpBWr1@$*gO?ajT470uQ&t!1~e?0N!AMJeFjAy1_ovz%>u+L zKmtIZD!{-13?2p*1%VZeObiSSK+GV-m0=;{WMBbO00a)sOi1biRvZKxfTYf_0jvt4 z4rmR-64ihejUbDF79J3kXl8|~F)`s=DB%F*EI8QM#xA8GF%jYpkeV%>LMsk3LgmAB zGIju&AUA^KOmu`1a#>~>50K=xbOxU|?`yU|?Wp+~lyu$?}4;g^kTYjXllQK-Q9G>nY7P4USejnl1Mnc5JX< z;}B7jlXDb1wNUnuquez{o;M3+o+Qd$dMJCxG0-XPD%}gPJJ|Wo{_~704c7 zkUga+a{{RNp@N4Fcgh4s=NAW!5Yi1YryONoJ(M}nAbT%S=1?QV#7hl*4vGObHtjl7 zoUL1$ZPqYLEI4d^0qCg1HfNe2F)nQ9<7BP0Xs^m>FDhWKVrZ`RV6SpuH&AFV5@@fo zU^hr;FPCU9SkPWl!CrpBWr1@$*gO?ajT470uQ&t!1~e?0N!AMJeFjAy1_ovz%>u+L zKmtIZD!{3WNQIur0h@zlL>=&DvqRgOz!a=1-ON9vHI^&EvI}QFoKNjx?-#zC$_uO;OdG2h!d*;1w z=BJ(;V=6<&tVX%Um<=d4cH>aZwsD*@CRS)eh5gXh&bE3Ss^Kyb5CIVo0TB=Z5fA|p z5CIVo0TB>^6-?mWx4C&F^dThvrUJemK8wmt6GqLLt?(AOWwoDbj$evjXk%;8@Sb2% z<2bW$%j%3@>?nq}qE`J7XC;^27qYp@ucKw%r>Dz|PIRc72D zTGr^mwah@u$_(@l;za5E9=qd_0gbUY7pEn7Eb= z4_Ir=cq}+{`3U2%ALq0M-iUY|%2||ol&rVIX?(_X_FW72-w)xEjK7aCoG*Q%qa(x7 z{!B8O8tYFXrfq|B9(AqnyXQ^Al}8_5ne!iyJv@ZAFxfIIO6;`&-O6Su(qq(%zmrkV8!)9kTkr^<%IB=!8zr*f~d$^SY zh`pSTr;e7yZHRlnzqd!iulWUw-O~^^! z*u2?}i{q0G+6z~Nk=g&eM$29!(^qRGH=4APcoTr7M~Bnd#PHRTsOe4QBH2Vw-(bXT zisTy`B0a?(YKm6F1^WLG|2$8v zby@BI0=j8lH*H@R+)K9w*xq$0`60n&Y5So)*o14SA*e!GFrTJ>F+Kkz#%RHXlNf{R zEoa4bmuUFI=*{`V>(PnxXJ5~1@gItq7c5lrdYtF|sbi-mojUzVlzEiDL$gmkL^;jA zr`MnR`gFSK(~)Pln&daW literal 0 HcmV?d00001 diff --git a/llvm/test/tools/dsymutil/Inputs/remarks/fat.macho.remarks.x86.c b/llvm/test/tools/dsymutil/Inputs/remarks/fat.macho.remarks.x86.c new file mode 100644 index 0000000..8153fc2 --- /dev/null +++ b/llvm/test/tools/dsymutil/Inputs/remarks/fat.macho.remarks.x86.c @@ -0,0 +1,14 @@ +/* This file was used to generate: + * - fat.macho.remarks.x86.o + * - fat.macho.remarks.x86.opt.bitstream + * - fat.macho.remarks.x86 + */ + +/* for ARCH in x86_64 x86_64h i386 + * do + * clang -gline-tables-only -c fat.macho.remarks.x86.c -fsave-optimization-record=bitstream -foptimization-record-file=fat.macho.remarks."$ARCH".opt.bitstream -mllvm -remarks-section -arch "$ARCH" + * done + * lipo -create -output fat.macho.remarks.x86.o fat.macho.remarks.x86_64.o fat.macho.remarks.x86_64h.o fat.macho.remarks.i386.o + * clang -gline-tables-only fat.macho.remarks.x86.o -arch x86_64 -arch x86_64h -arch i386 -o fat.macho.remarks.x86 + */ +int main(void) { return 0; } diff --git a/llvm/test/tools/dsymutil/Inputs/remarks/fat.macho.remarks.x86.o b/llvm/test/tools/dsymutil/Inputs/remarks/fat.macho.remarks.x86.o new file mode 100644 index 0000000000000000000000000000000000000000..2f5b8f3c4bc09d5583092b96a76797dbd4708358 GIT binary patch literal 14440 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 oKmtIZD!{ %t/basic.macho.remarks.x86_64 + +RUN: dsymutil -oso-prepend-path=%p/../Inputs -remarks-prepend-path=%p/../Inputs %t/basic.macho.remarks.x86_64 + +Check that the remark file in the bundle exists and is sane: +RUN: llvm-bcanalyzer %t/basic.macho.remarks.x86_64.dSYM/Contents/Resources/Remarks/basic.macho.remarks.x86_64 | FileCheck %s + +Now emit it in a different format: YAML. +RUN: dsymutil -remarks-output-format=yaml -oso-prepend-path=%p/../Inputs -remarks-prepend-path=%p/../Inputs %t/basic.macho.remarks.x86_64 +RUN: cat %t/basic.macho.remarks.x86_64.dSYM/Contents/Resources/Remarks/basic.macho.remarks.x86_64 | FileCheck %s --check-prefix=CHECK-YAML + +CHECK: %t/fat.macho.remarks.x86 + +RUN: dsymutil -oso-prepend-path=%p/../Inputs -remarks-prepend-path=%p/../Inputs %t/fat.macho.remarks.x86 + +Check that the remark files in the bundle exist and are all sane: +RUN: llvm-bcanalyzer %t/fat.macho.remarks.x86.dSYM/Contents/Resources/Remarks/fat.macho.remarks.x86-x86_64h | FileCheck %s +RUN: llvm-bcanalyzer %t/fat.macho.remarks.x86.dSYM/Contents/Resources/Remarks/fat.macho.remarks.x86-x86_64 | FileCheck %s +RUN: llvm-bcanalyzer %t/fat.macho.remarks.x86.dSYM/Contents/Resources/Remarks/fat.macho.remarks.x86-i386 | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-i386 + +CHECK: HELP: -oso-prepend-path HELP: -o HELP: -papertrail +HELP: -remarks-output-format +HELP: -remarks-prepend-path HELP: -symbol-map HELP: -symtab HELP: -toolchain diff --git a/llvm/tools/dsymutil/CMakeLists.txt b/llvm/tools/dsymutil/CMakeLists.txt index f88e6db..489ad9b 100644 --- a/llvm/tools/dsymutil/CMakeLists.txt +++ b/llvm/tools/dsymutil/CMakeLists.txt @@ -12,6 +12,7 @@ set(LLVM_LINK_COMPONENTS MC Object Option + Remarks Support Target ) diff --git a/llvm/tools/dsymutil/DwarfLinker.cpp b/llvm/tools/dsymutil/DwarfLinker.cpp index e835ce1..624c343 100644 --- a/llvm/tools/dsymutil/DwarfLinker.cpp +++ b/llvm/tools/dsymutil/DwarfLinker.cpp @@ -63,6 +63,8 @@ #include "llvm/Object/MachO.h" #include "llvm/Object/ObjectFile.h" #include "llvm/Object/SymbolicFile.h" +#include "llvm/Remarks/RemarkFormat.h" +#include "llvm/Remarks/RemarkLinker.h" #include "llvm/Support/Allocator.h" #include "llvm/Support/Casting.h" #include "llvm/Support/Compiler.h" @@ -2540,6 +2542,42 @@ static Error copySwiftInterfaces( return Error::success(); } +static Error emitRemarks(const LinkOptions &Options, StringRef BinaryPath, + StringRef ArchName, + const remarks::RemarkLinker &RL) { + // Make sure we don't create the directories and the file if there is nothing + // to serialize. + if (RL.empty()) + return Error::success(); + + SmallString<128> InputPath; + SmallString<128> Path; + // Create the "Remarks" directory in the "Resources" directory. + sys::path::append(Path, *Options.ResourceDir, "Remarks"); + if (std::error_code EC = sys::fs::create_directories(Path.str(), true, + sys::fs::perms::all_all)) + return errorCodeToError(EC); + + // Append the file name. + // For fat binaries, also append a dash and the architecture name. + sys::path::append(Path, sys::path::filename(BinaryPath)); + if (Options.NumDebugMaps > 1) { + // More than one debug map means we have a fat binary. + Path += '-'; + Path += ArchName; + } + + std::error_code EC; + raw_fd_ostream OS(Options.NoOutput ? "-" : Path.str(), EC, sys::fs::OF_None); + if (EC) + return errorCodeToError(EC); + + if (Error E = RL.serialize(OS, Options.RemarksFormat)) + return E; + + return Error::success(); +} + bool DwarfLinker::link(const DebugMap &Map) { if (!createStreamer(Map.getTriple(), OutFile)) return false; @@ -2803,6 +2841,18 @@ bool DwarfLinker::link(const DebugMap &Map) { } }; + remarks::RemarkLinker RL; + if (!Options.RemarksPrependPath.empty()) + RL.setExternalFilePrependPath(Options.RemarksPrependPath); + auto RemarkLinkLambda = [&](size_t i) { + // Link remarks from one object file. + auto &LinkContext = ObjectContexts[i]; + if (const object::ObjectFile *Obj = LinkContext.ObjectFile) + if (Error E = RL.link(*Obj)) + return E; + return Error(Error::success()); + }; + auto AnalyzeAll = [&]() { for (unsigned i = 0, e = NumObjects; i != e; ++i) { AnalyzeLambda(i); @@ -2828,6 +2878,26 @@ bool DwarfLinker::link(const DebugMap &Map) { EmitLambda(); }; + auto EmitRemarksLambda = [&]() { + StringRef ArchName = Map.getTriple().getArchName(); + return emitRemarks(Options, Map.getBinaryPath(), ArchName, RL); + }; + + // Instead of making error handling a lot more complicated using futures, + // write to one llvm::Error instance if something went wrong. + // We're assuming RemarkLinkAllError is alive longer than the thread + // executing RemarkLinkAll. + auto RemarkLinkAll = [&](Error &RemarkLinkAllError) { + // Allow assigning to the error only within the lambda. + ErrorAsOutParameter EAO(&RemarkLinkAllError); + for (unsigned i = 0, e = NumObjects; i != e; ++i) + if ((RemarkLinkAllError = RemarkLinkLambda(i))) + return; + + if ((RemarkLinkAllError = EmitRemarksLambda())) + return; + }; + // To limit memory usage in the single threaded case, analyze and clone are // run sequentially so the LinkContext is freed after processing each object // in endDebugObject. @@ -2835,13 +2905,29 @@ bool DwarfLinker::link(const DebugMap &Map) { for (unsigned i = 0, e = NumObjects; i != e; ++i) { AnalyzeLambda(i); CloneLambda(i); + + if (Error E = RemarkLinkLambda(i)) + return error(toString(std::move(E))); } EmitLambda(); + + if (Error E = EmitRemarksLambda()) + return error(toString(std::move(E))); + } else { - ThreadPool pool(2); + // This should not be constructed on the single-threaded path to avoid fatal + // errors from unchecked llvm::Error objects. + Error RemarkLinkAllError = Error::success(); + + ThreadPool pool(3); pool.async(AnalyzeAll); pool.async(CloneAll); + pool.async(RemarkLinkAll, std::ref(RemarkLinkAllError)); pool.wait(); + + // Report errors from RemarkLinkAll, if any. + if (Error E = std::move(RemarkLinkAllError)) + return error(toString(std::move(E))); } if (Options.NoOutput) diff --git a/llvm/tools/dsymutil/LinkUtils.h b/llvm/tools/dsymutil/LinkUtils.h index 0cd5600..0f31334 100644 --- a/llvm/tools/dsymutil/LinkUtils.h +++ b/llvm/tools/dsymutil/LinkUtils.h @@ -12,6 +12,7 @@ #include "SymbolMap.h" #include "llvm/ADT/Twine.h" +#include "llvm/Remarks/RemarkFormat.h" #include "llvm/Support/WithColor.h" #include @@ -68,6 +69,21 @@ struct LinkOptions { /// Symbol map translator. SymbolMapTranslator Translator; + /// Fields used for linking and placing remarks into the .dSYM bundle. + /// @{ + + /// Number of debug maps processed in total. + unsigned NumDebugMaps = 0; + + /// -remarks-prepend-path: prepend a path to all the external remark file + /// paths found in remark metadata. + std::string RemarksPrependPath; + + /// The output format of the remarks. + remarks::Format RemarksFormat = remarks::Format::Bitstream; + + /// @} + LinkOptions() = default; }; diff --git a/llvm/tools/dsymutil/Options.td b/llvm/tools/dsymutil/Options.td index c2114c8..8eaa365a 100644 --- a/llvm/tools/dsymutil/Options.td +++ b/llvm/tools/dsymutil/Options.td @@ -144,3 +144,15 @@ def: Separate<["-"], "j">, Alias, HelpText<"Alias for --num-threads">, Group; + +def remarks_prepend_path: Separate<["--", "-"], "remarks-prepend-path">, + MetaVarName<"">, + HelpText<"Specify a directory to prepend to the paths of the external remark files.">, + Group; +def: Joined<["--", "-"], "remarks-prepend-path=">, Alias; + +def remarks_output_format: Separate<["--", "-"], "remarks-output-format">, + MetaVarName<"">, + HelpText<"Specify the format to be used when serializing the linked remarks.">, + Group; +def: Joined<["--", "-"], "remarks-output-format=">, Alias; diff --git a/llvm/tools/dsymutil/dsymutil.cpp b/llvm/tools/dsymutil/dsymutil.cpp index 88a8593..2801178 100644 --- a/llvm/tools/dsymutil/dsymutil.cpp +++ b/llvm/tools/dsymutil/dsymutil.cpp @@ -266,6 +266,18 @@ static Expected getOptions(opt::InputArgList &Args) { if (getenv("RC_DEBUG_OPTIONS")) Options.PaperTrailWarnings = true; + if (opt::Arg *RemarksPrependPath = Args.getLastArg(OPT_remarks_prepend_path)) + Options.LinkOpts.RemarksPrependPath = RemarksPrependPath->getValue(); + + if (opt::Arg *RemarksOutputFormat = + Args.getLastArg(OPT_remarks_output_format)) { + if (Expected FormatOrErr = + remarks::parseFormat(RemarksOutputFormat->getValue())) + Options.LinkOpts.RemarksFormat = *FormatOrErr; + else + return FormatOrErr.takeError(); + } + if (Error E = verifyOptions(Options)) return std::move(E); return Options; @@ -507,6 +519,10 @@ int main(int argc, char **argv) { return 1; } + // Remember the number of debug maps that are being processed to decide how + // to name the remark files. + Options.LinkOpts.NumDebugMaps = DebugMapPtrsOrErr->size(); + if (Options.LinkOpts.Update) { // The debug map should be empty. Add one object file corresponding to // the input file. -- 2.7.4