From dce71c7425d1d90a63024a03f8b763d0a8394932 Mon Sep 17 00:00:00 2001 From: Alexander Shaposhnikov Date: Sat, 2 Sep 2017 08:19:01 +0000 Subject: [PATCH] [llvm-dwp] Implement -e option The binutils utility dwp has an option "-e" https://gcc.gnu.org/wiki/DebugFissionDWP to specify an executable/library to get the list of *.dwo files from it. This option is particularly useful when someone runs the tool manually outside of a build system. This diff adds an implementation of "-e" to llvm-dwp. Test plan: make check-all Differential revision: https://reviews.llvm.org/D37371 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@312409 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../llvm-dwp/Inputs/dwos_list_from_exec/a.dwo | Bin 0 -> 1312 bytes .../llvm-dwp/Inputs/dwos_list_from_exec/b.dwo | Bin 0 -> 1384 bytes .../llvm-dwp/Inputs/dwos_list_from_exec/c.dwo | Bin 0 -> 1312 bytes .../llvm-dwp/Inputs/dwos_list_from_exec/d.dwo | Bin 0 -> 1312 bytes .../llvm-dwp/Inputs/dwos_list_from_exec/e.dwo | Bin 0 -> 1312 bytes .../Inputs/dwos_list_from_exec/libd.so | Bin 0 -> 6832 bytes .../llvm-dwp/Inputs/dwos_list_from_exec/main | Bin 0 -> 7608 bytes .../X86/dwos_list_from_exec_simple.test | 97 ++++++++++++++++++ tools/llvm-dwp/llvm-dwp.cpp | 54 +++++++++- 9 files changed, 148 insertions(+), 3 deletions(-) create mode 100644 test/tools/llvm-dwp/Inputs/dwos_list_from_exec/a.dwo create mode 100644 test/tools/llvm-dwp/Inputs/dwos_list_from_exec/b.dwo create mode 100644 test/tools/llvm-dwp/Inputs/dwos_list_from_exec/c.dwo create mode 100644 test/tools/llvm-dwp/Inputs/dwos_list_from_exec/d.dwo create mode 100644 test/tools/llvm-dwp/Inputs/dwos_list_from_exec/e.dwo create mode 100755 test/tools/llvm-dwp/Inputs/dwos_list_from_exec/libd.so create mode 100755 test/tools/llvm-dwp/Inputs/dwos_list_from_exec/main create mode 100644 test/tools/llvm-dwp/X86/dwos_list_from_exec_simple.test diff --git a/test/tools/llvm-dwp/Inputs/dwos_list_from_exec/a.dwo b/test/tools/llvm-dwp/Inputs/dwos_list_from_exec/a.dwo new file mode 100644 index 0000000000000000000000000000000000000000..b6c773435649530f73621b3e0688cb7fdb8cb12f GIT binary patch literal 1312 zcmbVLO^eh(5UnJ$UoI|;>tPlzK~P-Ld`&)Ah~t8uJb3aT!q`bVvjf>AByq%(m|x;e zFM=Ze3IETYyjY#>u%U?vHq>;zSMOCim7WhzpFfi&3Hl{L2v?|Q0Y1rB`Jzh~a1C~V zXvw<*;*8`gbwjIqUF52(8JeNqJ8PQqMAx%ybFLNDN?)xTy%TDfskTkL$c=o@r1Qj& zt;jS}*LNMyjDxu!(7<(kH}%Nzcq7(TO^9V%vE@5yV8*Ux8_wLbOv9kAJ$DkCQYT4B z5c|h?%(yIJ`N||4Al>n|@%J;vSBxJRw=pId0J{=M6Oa#{{CaRv9+omNsq|8r;FzST z^zF0_@3i6JmePjbPj>)h4W=K%8{3On-iAn?>_6Ine1x9s7&6WX-O}%av8iHdu$0ls z11Q*KY$;e7TMB;>v8KS5NOf50-cT%Q_51UNM4;78b-ADQSwf??t7TTi-N)B1Ar=L= zEYh^5O+BR7d0GrHiK2>bhD^53X@|uF{TIH4uCd84{?bj<-sgTp(D(kI0^j@lJ>Y&p z1{a*TDHM8NPrtxKX9Irh`7_>BJgRqB;`6Qa>Z6PRa0&pSJmoZJYFm|OSLHH<9Sw%n?w~O#WVva zv_sd?lS%AGMyTtl?b?>3N8ZHs63@0=J9UEn{zkN`5(kE9M22gno*vnTsaX@p&^0Zw z&50E!X=253;6?5}zGk#q!R)afZXkqZkmZo&RkM#FKHs9hNB@NW8T~7|g)X53Y!e_7 z2=(iiJHe~(=LDc70Vy@NFK%Vb)Ti>o8tLM_-7bC86 zLR;6;4=~_4s$FIz?cX&%_XtIvqxlaRN&9z=&n;2pIhy~5k)v*LPcGH_ZfU@-bp4Nd gI;QXTe_`|AvHCN((qC?qL=$K~P-5Op?jx3UOG_lLt>8L>QA!XLcZ)3`v~DlbDM? zLvM;8DB@4>-+1++AXaBOOlTs44K-cw)q9mrrRU}ShYw^)f_6y|zy`G}z*~8fPn&cK zmtY5o7GLB*(lDE=D_WF`JX0M_*L3yPSye4h#^W?yoojh9AI}%nxDjfYsg@PGkrR2Y zK_{_C%*Zej$8&7gApXSjsqfgHlepn=e^eu(Ih*(o#OQagCG;b)DwDQGy6-JbQ86=xnCFbt^cdQ zxBhnbxnGdM4^A8kh1S>7k1!EAR@>v`%~r^FQTq&ekz>*^C+{%OS)#VUn#eKvQ%(*$ vUY3elR`0u|NBm0H|M0VZeYbzfAM~F4_i$(bv|Wxz9lr1RBi>XzuZaHuEU$pz literal 0 HcmV?d00001 diff --git a/test/tools/llvm-dwp/Inputs/dwos_list_from_exec/d.dwo b/test/tools/llvm-dwp/Inputs/dwos_list_from_exec/d.dwo new file mode 100644 index 0000000000000000000000000000000000000000..42401022c2e1a5c54aedb147bcead9869bbe0390 GIT binary patch literal 1312 zcmbVL%Zk)M6un7$UJeSaE_!fb5EMr=ug-IX*bL~(g)0{#v`MPc(~wD;B=#^XF<;_J z-3UJL2mAon{)1~*ZoHMLFrkPD7Tm6T&OPU*a#Q{4;p0cLBtf?%2;m%cEWjK2JfF4c z3@*SH5RIG^kYrK5P}j7qmPM|*nxPr$?W4M09q4+Nt&g>$T>iVwZnMpA90~)xF@1|a~Kir6QRY_#oR$}>18kmV|*@iRqEYmQkYfl|Q zQ|b^B1&P0p$4pi$m_IYg8c2KmP5ga_@d4ut#tn=S2Eeui(g@_YKR$o^`ThD`8JJXh zs*G?<(pdU<*n~Hm@XChLgr5$#0Avluufxlmvq|2BNFMCo-+i!$o{JbV&IsMo?@L2d z#Zqr6gOdkPu*=X=urjn1{vu*cfen#rvC_VwSkkJ~<2s5#tLpM>Kk70<V$k3wJ(qtIVROPd5?kK6164PM2^Xyb8_7C uvQ*Tv`p_-i<5#-*hoAKuy8SEup!eLrgFE}DZF4;7@k7s_@TTHZ8c5TbiBX8n*#Ir5ePMl!e--vdVF;Js1|YFN- zIwti_9zen_eI{Y0&m{IDd`*H49%^!_c|*RWlRAm=lWJ%u5gD@<}s*9wHY<;Qt1N~QifU3U9Pyf=5=RRb5jpMia?;PIh z+tp)wjt0LNaEB|jx)y$k0gutz4g>GEM7HwWcZl;CrK${kM3av3+yZMnM(J-EIP7R? t$a87E@0RYfD_#FXPy6-V{w3S!Gt=+jO8>NNmXA7k-~J=kls_+@{{b@qe&YZD literal 0 HcmV?d00001 diff --git a/test/tools/llvm-dwp/Inputs/dwos_list_from_exec/libd.so b/test/tools/llvm-dwp/Inputs/dwos_list_from_exec/libd.so new file mode 100755 index 0000000000000000000000000000000000000000..56a30cf3caf764ee7a057cce31676d0fe80f64c6 GIT binary patch literal 6832 zcmc&&U2Ggz6~42n8@Ea9P5R@I6tXH!Vxwg2UE6EBAvCt*coUo-Qb(nz)-by>_Acy? zyE{(e2xz2~wiXJ6f&}FO@qnrbRU(Bx1i?d^&?*86Old{>76FkQTB%79UlM3uUY zt{r05=>Z7_+AMyoZW6v8xyXU3fhx(*I5t6l@m}^KS?H%Df$Rtcj>Uh4yC(evML!Q* z@f;rC3(_B*-WQ}(pzO=-6ND2;p!hHUxqGoXF?iVb*U|4LU967YZJ>Xmf&OcxU!zv2 zE*T8Q^c?A<>Uy>P1H^>d3&gX2i>Bw>w?^He7BE4A`HuMOafW^Wm8u^J#a~(0RH0O~ zDxO{TEK6CrV$LIF=BRB==8ASccg$6zW4nijt%R8{dsRM{&X|>wnPko(PO)E3S-Z#g zT8>+Gr*aj~EsyUV&XnrQ%kU^{KdXSXr)Pdp7kXU8w}U zBURBsx0eyaL*e_#^qF%pL*2e(j`=(2T0z&s{)LvIkvHD{@$a7f+}V@YTi$&9llQ&# z>vvknq_CU~ilG1AnOTh7%}&&|1;qD>6OU~>vo1$zB5I@9qjG<+&LOYW^k-y~#x(sk z(Vtx#1jN`RyqXW`(Ra3;3+Z`I&@P7b;U#h@q?eRFWKs0XN#Z%JHR&ho!+BFD-fm8P zsp*xwluCW^oY%DQVRA^F_-XTn8q#N~y|0l=b>r*we~MalBg7}kfpzgSDR9#F#dR9lAGDO;Yo7lA#aZ|%-ckr`^}o5bL$Qf{yi4vu2knIu0BEm zS~nbL|EnJ-K7{9V6Bi~=`STf?KCD0E*g<6+jT-A$E^j_Xv&7FuzAjQ2UL$I-CHhok zc$LqS_yAoWrR$j+)oK?})e_y+vUX4FiX+X()kEvHeWd$=+T+bwziit#DGuLPhx}hB z{z zc)j?;eoe;nUCIAH@tZo8*Qhabv^*&p|x* z@SIbl!^028+DG>t>WKB2{bp}0(G~CQN+!Bv?FU^ama@G-zcn83P?@}4oQfTG%avTI z7)zR6W>>5|>v_`;c6R3ThYMz@Jk>ds^E!P;lekz)0$;m#uqkbTc8guMKPa>1(@0}coXOfAYuHNpxM7*oZP4;y6I_{*~ z>p1p6roTfurgNmE%uZ#jR?)UILoMrDUL0Ef!=bj-#u{GATj&aQN^|Xwvi|u?KREx^ zFE+4wX-Rn)H z&_>gWJNHB)Gz2q>k4srb_{w-p#H&ZSA6}w3i}!U-y(+N*Vd&Np7;IR zYWo}huMl$^)nkxB8_mPd$-z*o)M>ukq4p;6_2%aa>m&EvGC%M7`djDihOcj})$6FY zms5v~$ZCb>cRTrU`ylCKKDYF53+e0ClL^w_ztq*227Uiq>&a2l$LjcJ8t6aYK>tXSMg@(O`M?`bI`?^H@w)-F0+g!=;%!_G(d z4es4NtgO+o{X>Ie*8W|)9v&ID#s`PSMtBbX{h8o@T=koLE(r#&Og?accii;Mlx3&W zW%sZ$J@=@m%&8Ln(d-v!Mt#Yg&J$C1^LD`bha8hm7Rn6p(=%yrcA9SPO}R+7p(dB< z{o_ls#fn#km(RLcxk*{4X0RRRKa-)qsp5<&FD{Gibg1Eum}Poh1i1@#CRd!Si2?8T z)tN0W382hk$#eaX{CwUjaVZdWYqk(fOn}JRl`InEb46E~=qF8*EM?2{PiITI==j0x zLN24sN|pvlKE#2}7JS)1n$_9m|GDZzv_HAFlQK@B-UE%1og3SkMSX=j@M+R<$pk#= zK~U6#q`z@uIVJtuhdALGZkb_#w-{BRxs#d(48 zT%+rFevh*auSa~(07V^6E`HO;&);Rj_^8wgpvW)q+W9>yip?4x^#|x8fI@+TdJ`oN z=g0X0lxwPR)B8Upc+7uFCIZw6gNeudLCy6G=Lf#g_cZwH`9DiwPASKZS{;G!fv6`C zANes4TO~j6_6 zJf`JGT^ntXU&mk6^6PlrUzhpZ+DaG3kNS44{=YRn?$iF8> z*Ricl@Or;=-`NKEQGC$gV4l#24)jt96j3FWb literal 0 HcmV?d00001 diff --git a/test/tools/llvm-dwp/Inputs/dwos_list_from_exec/main b/test/tools/llvm-dwp/Inputs/dwos_list_from_exec/main new file mode 100755 index 0000000000000000000000000000000000000000..a56edf634151f0378b168a9f90f4ad6240483831 GIT binary patch literal 7608 zcmcIpYit|G5#FPuNOf$Awv*b4m6$F3kd5d>QWQt>u9YfbanT_( z(Ji)$I{;~gOOq`qof^w?rgIG}*v1NO5f9c!-DUr|}jjFqS+%92;I;xo6xYDtaA_%RJQ z#NGQQq-)McP-@L@$XT;Y^ESYO%i!@Q_;?e%*aR244kJqIRokf8dcnvQ#qP1u!67}O zM$~?RZ8*3X*i98mMY7X{K03ZvH?4{_m8;rTWqj{YzErfvja1%p+LmwGb5uV_l%c#) zty)zY8;&2J2g=(EPcm#*#6~cn=_YFT=01muf|pzT9!=8GSA!+QLsAsYL^2Iuo&D&AO zE-x>D8vbB(?#;u=xp$Js-o1KYeDuP(g*HtjFPuLj#f1YP7JmhX*D{?OVbY#`1_GQ& z_Dq9F9=qvJ&Ru%SH#vV6JHWuMO}>gv^^2VwXAwJ#8rz@0*#h>-x!)$wUwJgCEF|B& zSp)KK&@g%Y&p=Mjz3%YeA^z;cKe`KAYpW-Kx%e~$GWmMjNr03O=Q}rI3=e0~z`lPe zgu5nQEn{?Zm+A|Xm%j;=&W+-7)sg6Caz3MWZhQ`Vh0t!-!{;uHe1wgY^QRJzCFbgh zuZ+&!NKA~*{UtFzc4Bh}bU2Yb(S!2P*tSdIza`Iq+=5SNapIGDJ$d{C`+oL6Hg{!g z?#3|qsNeN=^4PqR9C)vG1s~kkCKFF4CKHDf`uwRzJRiT~|7$>B5B<33_a?yJhD-anUJrp3{=hE(`aPX@KGiWR9=&(x_P$MDM0ok}w+9gK zf-404?P%yK%7&JmZ$R9**53c9UjH%l-34~ z79Phvjw)uUeFN#-ezorOZ21HrIORv| z9vXTu*bSfAZNaD-SNnsJP`E!7i}VG%4_an0Y1j_l6Ao_^>AX>#3Ldp8)m*6Bc|+W>#}(9}?1Ve61;n5I!O2y|>9euw;;cFBnY?P!L{6Y|JVd?mY+AlUJ;!l z*sejXQT`6qt*K)&0@6(pSV23E3!rJuD+ z-=}WEcLTl#^0q+n@OSGm!ZpwHI!yQxvbV@jk#JsVa*qIQRltL=?y{cw^EBYAVOd=y zKhFC=h!fHeIdzF20v=e#&&z-ZU3Of3MfzE>^u1#Iyu?=t{%$dTp^2Y=G{HY^g0F@I zVm^6o-$5O$Bb*m5msU9qcnEt65xaP-+TbWk4~Jv6Sv z!AFO)4l9iVkZu?BG#-Jff=@m!NY~AhK9w(}jJ$5zrAk#dYSSWJDwOkVqiEvUO%9J5hM(A%*gHA|pv$#9Dc%ZMMN{az$Mz2<#`OKWb{!fS*T)ls zV5LT*M<%lr{LT%(psEsElRMSe;rgS5fs#r&bYFpE`P^U_8gE>%u z=PEU|oQF!q${S8ijzfh$m|w1??3pr5G4cm`5hlZuUV&YX)MkoRyTVqoYGrAvWX+`p z!^Ha6({P(A)>PUa>7c@=*Q%7+LBUApiW%6RIHPdtGE8%(cnepk#gc7FZ}_3?A(y~} zh-L~-P8>$osAkDLF*w>|8&m8beps=D$^k>RXl3cP{B;3+8HHS0sMRbC4M3=|oGD1X zQj!lym3Mw6{a5l0V8bg4zKK+Pno}Ww_vh3qZMlvTzZdNwncwBpK!bff0YRxXZv6gc z@f+{{IFCX`1m{a~v@wso2_R=cggV+{Vfhl(z5K`MhbKNCNRo@keCK@0 ztqqwWzS@9fjd=_^=P%Y8@-*>}G$2{?@@D|`VrY1ce>jt@#?5QH08L&Dt(nj3nmu@J zf7*n9gZk(9d^3Ko3Ez(|dnf~rSh{=re*#*(7#i;;KK>@-E?(P50q|mIUnTyx-DIeH zZG8aX{=-|Y5}&`{-0offv%vS}7;OXe;r=Tvj4goSPdU8)IIq*d=e2`8E{imA`#sLR U@#A@TIsSe0r`h*B1dl5I4ITB=F#rGn literal 0 HcmV?d00001 diff --git a/test/tools/llvm-dwp/X86/dwos_list_from_exec_simple.test b/test/tools/llvm-dwp/X86/dwos_list_from_exec_simple.test new file mode 100644 index 00000000000..4bbc2fb7b62 --- /dev/null +++ b/test/tools/llvm-dwp/X86/dwos_list_from_exec_simple.test @@ -0,0 +1,97 @@ +REQUIRES: shell + +RUN: rm -rf %t +RUN: mkdir %t +RUN: cd %t +RUN: cp %p/../Inputs/dwos_list_from_exec/a.dwo a.dwo +RUN: cp %p/../Inputs/dwos_list_from_exec/b.dwo b.dwo +RUN: cp %p/../Inputs/dwos_list_from_exec/c.dwo c.dwo +RUN: cp %p/../Inputs/dwos_list_from_exec/d.dwo d.dwo +RUN: cp %p/../Inputs/dwos_list_from_exec/e.dwo e.dwo +RUN: cp %p/../Inputs/dwos_list_from_exec/main main +RUN: cp %p/../Inputs/dwos_list_from_exec/libd.so libd.so +RUN: llvm-dwp c.dwo e.dwo -e main -e libd.so -o pkg.dwp +RUN: llvm-dwarfdump pkg.dwp | FileCheck %s + +Build commands for the test binaries: + +clang++ -Xclang -fdebug-compilation-dir -Xclang "./" -g -O0 -gsplit-dwarf a.cpp b.cpp -o main +clang++ -g -O0 -gsplit-dwarf -c c.cpp -o c.o +clang++ -Xclang -fdebug-compilation-dir -Xclang "./" -g -O0 -gsplit-dwarf -fPIC -shared d.cpp -o libd.so +clang++ -g -O0 -gsplit-dwarf -c e.cpp -o e.o + +sources: +a.cpp: + void a() {} + +b.cpp: + void b() {} + int main() { + return 0; + } + +c.cpp: + void c() {} + +d.cpp: + void d() {} + +e.cpp: + void e() {} + +CHECK-LABEL: .debug_abbrev.dwo contents: + +CHECK-LABEL: Abbrev table for offset: +CHECK: DW_TAG_compile_unit +CHECK: DW_TAG_subprogram + +CHECK-LABEL: Abbrev table for offset: +CHECK: DW_TAG_compile_unit +CHECK: DW_TAG_subprogram + +CHECK-LABEL: Abbrev table for offset: +CHECK: DW_TAG_compile_unit +CHECK: DW_TAG_subprogram + +CHECK-LABEL: Abbrev table for offset: +CHECK: DW_TAG_compile_unit +CHECK: DW_TAG_subprogram + +CHECK-LABEL: Abbrev table for offset: +CHECK: DW_TAG_compile_unit +CHECK: DW_TAG_subprogram + +CHECK: .debug_info.dwo contents: +CHECK: [[AOFF:0x[0-9a-f]*]]: + +CHECK-LABEL: Compile Unit: length = {{.*}} version = 0x0004 +CHECK: DW_TAG_compile_unit +CHECK: DW_AT_name {{.*}} "c.cpp" +CHECK: DW_TAG_subprogram +CHECK: DW_AT_name {{.*}} "c" + +CHECK-LABEL: Compile Unit: length = {{.*}} version = 0x0004 +CHECK: DW_TAG_compile_unit +CHECK: DW_AT_name {{.*}} "e.cpp" +CHECK: DW_TAG_subprogram +CHECK: DW_AT_name {{.*}} "e" + +CHECK-LABEL: Compile Unit: length = {{.*}} version = 0x0004 +CHECK: DW_TAG_compile_unit +CHECK: DW_AT_name {{.*}} "a.cpp" +CHECK: DW_TAG_subprogram +CHECK: DW_AT_name {{.*}} "a" + +CHECK-LABEL: Compile Unit: length = {{.*}} version = 0x0004 +CHECK: DW_TAG_compile_unit +CHECK: DW_AT_name {{.*}} "b.cpp" +CHECK: DW_TAG_subprogram +CHECK: DW_AT_name {{.*}} "b" +CHECK: DW_TAG_subprogram +CHECK: DW_AT_name {{.*}} "main" + +CHECK-LABEL: Compile Unit: length = {{.*}} version = 0x0004 +CHECK: DW_TAG_compile_unit +CHECK: DW_AT_name {{.*}} "d.cpp" +CHECK: DW_TAG_subprogram +CHECK: DW_AT_name {{.*}} "d" diff --git a/tools/llvm-dwp/llvm-dwp.cpp b/tools/llvm-dwp/llvm-dwp.cpp index 2297db6097e..aab3f88d257 100644 --- a/tools/llvm-dwp/llvm-dwp.cpp +++ b/tools/llvm-dwp/llvm-dwp.cpp @@ -17,6 +17,7 @@ #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/StringSet.h" #include "llvm/CodeGen/AsmPrinter.h" +#include "llvm/DebugInfo/DWARF/DWARFContext.h" #include "llvm/DebugInfo/DWARF/DWARFFormValue.h" #include "llvm/DebugInfo/DWARF/DWARFUnitIndex.h" #include "llvm/MC/MCAsmInfo.h" @@ -36,6 +37,7 @@ #include "llvm/Support/MathExtras.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/Options.h" +#include "llvm/Support/Path.h" #include "llvm/Support/TargetRegistry.h" #include "llvm/Support/TargetSelect.h" #include "llvm/Support/raw_ostream.h" @@ -49,9 +51,14 @@ using namespace llvm::object; using namespace cl; OptionCategory DwpCategory("Specific Options"); -static list InputFiles(Positional, OneOrMore, +static list InputFiles(Positional, ZeroOrMore, desc(""), cat(DwpCategory)); +static list ExecFilenames( + "e", ZeroOrMore, + desc("Specify the executable/library files to get the list of *.dwo from"), + value_desc("filename"), cat(DwpCategory)); + static opt OutputFilename(Required, "o", desc("Specify the output file."), value_desc("filename"), @@ -113,7 +120,7 @@ struct CompileUnitIdentifiers { }; static Expected -getIndexedString(dwarf::Form Form, DataExtractor InfoData, +getIndexedString(dwarf::Form Form, DataExtractor InfoData, uint32_t &InfoOffset, StringRef StrOffsets, StringRef Str) { if (Form == dwarf::DW_FORM_string) return InfoData.getCStr(&InfoOffset); @@ -463,6 +470,35 @@ buildDuplicateError(const std::pair &PrevE, " and " + buildDWODescription(ID.Name, DWPName, ID.DWOName)); } +static Expected> +getDWOFilenames(StringRef ExecFilename) { + auto ErrOrObj = object::ObjectFile::createObjectFile(ExecFilename); + if (!ErrOrObj) + return ErrOrObj.takeError(); + + const ObjectFile &Obj = *ErrOrObj.get().getBinary(); + std::unique_ptr DWARFCtx = DWARFContext::create(Obj); + + SmallVector DWOPaths; + for (const auto &CU : DWARFCtx->compile_units()) { + const DWARFDie &Die = CU->getUnitDIE(); + std::string DWOName = dwarf::toString( + Die.find({dwarf::DW_AT_dwo_name, dwarf::DW_AT_GNU_dwo_name}), ""); + if (DWOName.empty()) + continue; + std::string DWOCompDir = + dwarf::toString(Die.find(dwarf::DW_AT_comp_dir), ""); + if (!DWOCompDir.empty()) { + SmallString<16> DWOPath; + sys::path::append(DWOPath, DWOCompDir, DWOName); + DWOPaths.emplace_back(DWOPath.data(), DWOPath.size()); + } else { + DWOPaths.push_back(std::move(DWOName)); + } + } + return std::move(DWOPaths); +} + static Error write(MCStreamer &Out, ArrayRef Inputs) { const auto &MCOFI = *Out.getContext().getObjectFileInfo(); MCSection *const StrSection = MCOFI.getDwarfStrDWOSection(); @@ -676,7 +712,19 @@ int main(int argc, char **argv) { if (!MS) return error("no object streamer for target " + TripleName, Context); - if (auto Err = write(*MS, InputFiles)) { + std::vector DWOFilenames = InputFiles; + for (const auto &ExecFilename : ExecFilenames) { + auto DWOs = getDWOFilenames(ExecFilename); + if (!DWOs) { + logAllUnhandledErrors(DWOs.takeError(), errs(), "error: "); + return 1; + } + DWOFilenames.insert(DWOFilenames.end(), + std::make_move_iterator(DWOs->begin()), + std::make_move_iterator(DWOs->end())); + } + + if (auto Err = write(*MS, DWOFilenames)) { logAllUnhandledErrors(std::move(Err), errs(), "error: "); return 1; } -- 2.50.1