From a0172d75311f36adb6db58000474d31f8a9cd553 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Mon, 25 Jun 2012 17:18:53 +0200 Subject: [PATCH] Add low-level support for .debug_macro. Signed-off-by: Mark Wielaard --- libdw/ChangeLog | 7 +++++ libdw/dwarf.h | 1 + libdw/dwarf_begin_elf.c | 1 + libdw/dwarf_formudata.c | 10 ++++++- libdw/libdwP.h | 1 + libebl/ChangeLog | 4 +++ libebl/eblopenbackend.c | 2 ++ src/ChangeLog | 4 +++ src/readelf.c | 4 +++ tests/ChangeLog | 6 +++++ tests/Makefile.am | 6 +++-- tests/run-macro-test.sh | 53 +++++++++++++++++++++++++++++++++++++ tests/testfile-macinfo.bz2 | Bin 0 -> 6689 bytes tests/testfile-macros.bz2 | Bin 0 -> 7882 bytes 14 files changed, 96 insertions(+), 3 deletions(-) create mode 100755 tests/run-macro-test.sh create mode 100755 tests/testfile-macinfo.bz2 create mode 100755 tests/testfile-macros.bz2 diff --git a/libdw/ChangeLog b/libdw/ChangeLog index 3ff83e453..48bbaa0e5 100644 --- a/libdw/ChangeLog +++ b/libdw/ChangeLog @@ -1,3 +1,10 @@ +2012-06-26 Mark Wielaard + + * libdwP.h: Add IDX_debug_macro. + * dwarf.h: Add DW_AT_GNU_macros. + * dwarf_begin_elf.c (dwarf_scnnames): Add .debug_macro. + * dwarf_formudata.c (dwarf_formudata): Recognize DW_AT_GNU_macros. + 2012-04-27 Mark Wielaard * libdw/dwarf_highpc.c (dwarf_highpc): Handle DW_AT_high_pc being diff --git a/libdw/dwarf.h b/libdw/dwarf.h index 38f663d66..01aee5ad7 100644 --- a/libdw/dwarf.h +++ b/libdw/dwarf.h @@ -266,6 +266,7 @@ enum DW_AT_GNU_all_tail_call_sites = 0x2116, DW_AT_GNU_all_call_sites = 0x2117, DW_AT_GNU_all_source_call_sites = 0x2118, + DW_AT_GNU_macros = 0x2119, DW_AT_hi_user = 0x3fff }; diff --git a/libdw/dwarf_begin_elf.c b/libdw/dwarf_begin_elf.c index fc6ac8d65..3e01800a5 100644 --- a/libdw/dwarf_begin_elf.c +++ b/libdw/dwarf_begin_elf.c @@ -61,6 +61,7 @@ static const char dwarf_scnnames[IDX_last][17] = [IDX_debug_pubnames] = ".debug_pubnames", [IDX_debug_str] = ".debug_str", [IDX_debug_macinfo] = ".debug_macinfo", + [IDX_debug_macro] = ".debug_macro", [IDX_debug_ranges] = ".debug_ranges" }; #define ndwarf_scnnames (sizeof (dwarf_scnnames) / sizeof (dwarf_scnnames[0])) diff --git a/libdw/dwarf_formudata.c b/libdw/dwarf_formudata.c index f5b2a1a15..f08e0d8f5 100644 --- a/libdw/dwarf_formudata.c +++ b/libdw/dwarf_formudata.c @@ -140,13 +140,21 @@ dwarf_formudata (attr, return_uval) break; case DW_AT_macro_info: - /* macptr */ + /* macptr into .debug_macinfo */ if (__libdw_formptr (attr, IDX_debug_macinfo, DWARF_E_NO_ENTRY, NULL, return_uval) == NULL) return -1; break; + case DW_AT_GNU_macros: + /* macptr into .debug_macro */ + if (__libdw_formptr (attr, IDX_debug_macro, + DWARF_E_NO_ENTRY, NULL, + return_uval) == NULL) + return -1; + break; + case DW_AT_ranges: case DW_AT_start_scope: /* rangelistptr */ diff --git a/libdw/libdwP.h b/libdw/libdwP.h index 3c1925b3c..77e1b31f8 100644 --- a/libdw/libdwP.h +++ b/libdw/libdwP.h @@ -71,6 +71,7 @@ enum IDX_debug_pubnames, IDX_debug_str, IDX_debug_macinfo, + IDX_debug_macro, IDX_debug_ranges, IDX_last }; diff --git a/libebl/ChangeLog b/libebl/ChangeLog index ac2160de9..941ed6f1f 100644 --- a/libebl/ChangeLog +++ b/libebl/ChangeLog @@ -1,3 +1,7 @@ +2011-06-26 Mark Wielaard + + * eblopenbackend.c (default_debugscn_p): Add .debug_macro. + 2011-04-26 Mark Wielaard * libebl.h (ebl_object_note_type_name): Add const char *name arg. diff --git a/libebl/eblopenbackend.c b/libebl/eblopenbackend.c index 9789ef373..b39ab2e93 100644 --- a/libebl/eblopenbackend.c +++ b/libebl/eblopenbackend.c @@ -646,6 +646,8 @@ default_debugscn_p (const char *name) ".debug_types", /* GDB DWARF 4 extension */ ".gdb_index", + /* GNU/DWARF 5 extension/proposal */ + ".debug_macro", /* SGI/MIPS DWARF 2 extensions */ ".debug_weaknames", ".debug_funcnames", diff --git a/src/ChangeLog b/src/ChangeLog index 40905b8a3..2928ab1f9 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,7 @@ +2012-06-26 Mark Wielaard + + * readelf.c (dwarf_attr_string): Add DW_AT_GNU_macros. + 2012-06-22 Mark Wielaard * readelf.c (print_ops): Cast printf PRIu/x64 arguments to uint64_t diff --git a/src/readelf.c b/src/readelf.c index d182ab50b..eb1d469d0 100644 --- a/src/readelf.c +++ b/src/readelf.c @@ -3590,6 +3590,10 @@ dwarf_attr_string (unsigned int attrnum) result = "GNU_all_source_call_sites"; break; + case DW_AT_GNU_macros: + result = "GNU_macros"; + break; + default: if (attrnum < DW_AT_lo_user) snprintf (buf, sizeof buf, gettext ("unknown attribute %hx"), diff --git a/tests/ChangeLog b/tests/ChangeLog index 6f5e45842..9b649173e 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,3 +1,9 @@ +2012-06-26 Mark Wielaard + + * run-macro-test.sh: New test. + * testfile-macinfo.bz2: New testfile. + * testfile-macros.bz2: Likewise. + 2012-05-07 Mark Wielaard * low_high_pc.c: Use proper inttypes in printf formats. diff --git a/tests/Makefile.am b/tests/Makefile.am index ced7831bb..39e58ae86 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -79,7 +79,8 @@ TESTS = run-arextract.sh run-arsymtest.sh newfile test-nlist \ run-early-offscn.sh run-dwarf-getmacros.sh \ run-test-flag-nobits.sh run-prelink-addr-test.sh \ run-dwarf-getstring.sh run-rerequest_tag.sh run-typeiter.sh \ - run-readelf-d.sh run-unstrip-n.sh run-low_high_pc.sh + run-readelf-d.sh run-unstrip-n.sh run-low_high_pc.sh \ + run-macro-test.sh if !STANDALONE noinst_PROGRAMS += msg_tst md5-sha1-test @@ -157,7 +158,8 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh \ run-typeiter.sh testfile59.bz2 \ run-readelf-d.sh testlib_dynseg.so.bz2 \ run-unstrip-n.sh testcore-rtlib.bz2 \ - run-low_high_pc.sh testfile_low_high_pc.bz2 + run-low_high_pc.sh testfile_low_high_pc.bz2 \ + run-macro-test.sh testfile-macinfo.bz2 testfile-macros.bz2 installed_TESTS_ENVIRONMENT = libdir=$(DESTDIR)$(libdir) \ bindir=$(DESTDIR)$(bindir) \ diff --git a/tests/run-macro-test.sh b/tests/run-macro-test.sh new file mode 100755 index 000000000..70a16edfe --- /dev/null +++ b/tests/run-macro-test.sh @@ -0,0 +1,53 @@ +#! /bin/sh +# Copyright (C) 2012 Red Hat, Inc. +# This file is part of elfutils. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# elfutils is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +. $srcdir/test-subr.sh + +# #include +# +# #define HELLO "world" +# +# int +# main(int argc, char ** argv) +# { +# return strlen (HELLO); +# } +# +# gcc -gdwarf-4 -g3 -o testfile-macros macro.c +# gcc -gstrict-dwarf -gdwarf-4 -g3 -o testfile-macinfo macro.c + +testfiles testfile-macinfo testfile-macros + +status=0 + +testrun ../src/readelf --debug-dump=info testfile-macinfo \ + | grep macro_info > readelf.macros.out || + { echo "*** failure readelf --debug-dump=info testfile-macinfo"; status=1; } +testrun_compare cat readelf.macros.out <<\EOF + macro_info (sec_offset) 0 +EOF + +testrun ../src/readelf --debug-dump=info testfile-macros \ + | grep GNU_macros > readelf.macros.out || + { echo "*** failure readelf --debug-dump=info testfile-macros"; status=1; } +testrun_compare cat readelf.macros.out <<\EOF + GNU_macros (sec_offset) 0 +EOF + +rm -f readelf.macros.out + +exit $status diff --git a/tests/testfile-macinfo.bz2 b/tests/testfile-macinfo.bz2 new file mode 100755 index 0000000000000000000000000000000000000000..e6cc5f1c246de436dce5b8df176963887d27f7f7 GIT binary patch literal 6689 zc-m!(*ZjL{*Clu%lRY;=b-BSs1c7BL#6J8l>?x*G&WNOuSb64Iek ziWtB9dEVbS?;r2yT<1F9bDgVIEzl1nRLuDd%_(&zJOGgKH-G;RU;g|(u=o2{T>tt0 z=gZ$sw&^A%(xq$M4rfn`+NZ$Uhd*1pdQK;U4|&D}4AOhPpx367cgK#~L2)(ZNG^;> z%T!yBT{IJfu_WK>`udDo3p82*f~I0u34*@H-!XLi zcSDS>o)kbyr4T^u<~XkmU_+10{5#`+AVx}oB4Phg|7nXR!~Zub1uO*oFTkQCfL4+U z5bj#0j5cKB%RDb{Z6#3agb#^tns`|_v^)f%uYgja9(07;Id3LRfr)r?=uS%D>X`Jf&Pfdo&Wi)d6 znl8HOF#}En_vXcB?~k4dl?qNto%<-1#C9k6=;%IYs#L3c*-%x(+q;wn>Pu{oC+lOa z>^?i=z@cl*LhnP&}3zGgeu(1nN;>V9?C?l$kC&bXt>Tp`7- zrx`IvY!1sBO(fUxQx>ul9D+w7b7$LR`BX@~kn}ddUzaJ7xFU=_6ST&g=tsIb83dtO z1rRr?GraC3XF%1y2w@prs;O^SMW(|A;)clA*Hqtgahw^BoSqe@8v-{`-)XZMe}9R< zwbR}`{@ncd@eCpb1TZ5FRR!9HF>{*0y2~hd>ib$kK*#5i2|g5Dh6rA!4b~8Nn0Uxl zBt>*~43pXuI+Chc$-JgE9NP~HGXIppu-LQ^Iv)MIm^fFQd)sZN+nYNM!t*eMMV~Ka}ie`ynY8E7OA*#~S<# zV{ntmOzE zDl#@P6uLu|gpC$d6HE`6b~34X{exB@|5goj7Q;Of4AU>^yn`F6nGG{`iJmE(_IROV z`2K92>%Pm$*3k#Oi*M7JnE@R-*PjfCu~>JJmJ1j=uC!eu>pgZ84XDI(%!ds>c>g;n5>c5m|Y?d`9- z+S{r^#d)wDMR#T&)9)g}z7X0Kk$^@?CZ2y%7{b)^3dOS7+*4%}UY{sleRHToK1(Fs z{3fox{!ZTiz1PFn{!7*qk7(42Qj5x3A171rRKYKhGSm;gt=IhXS{A6#IDfG2%3SQ; z8^)OxGt4VKVs^(?pNMkJd&h6~D#?guz(vty`1hCDo35e0bvo)lk@R-|AkV2*YHDxC zj(^M44h)oQD_w(n4=^{~6Cb%U_E2>^_q#8z^Tt3aFkbI)2!doqNO;`7*x3GhIwJbG zxr^uW`zM~>S2DJC8v)UjEq)mh+6&MZpPg&Y0b+^8bLq>+&cW6q6BF+*zh|d(rcyu> zRlv#@Nq`|(8$feQSDEOMsRRGQRdYdI#fO2Ud^ndT8A#yp+sz*`gLmd!GEXgsFAF&z z=2Fe2JSK-wl*J`MYzq-9P=qhQmSX+-5mkGD0c=E zxT1&Lzt^L`Q63TofCzy!r~$y8FAF&^A;nV6}+dS zMgPSgKbQ6SZcN)fEi0xGNHhQ zib+tw{gYoScWUtF32#C9H&Jj|-&5le}n`6=`eSk6AgR ze<}g8PUXsImofQ!;guFfj;>j*Cs>VwPyP!K?6At(nBX%(mq9^e=6Ntcf`k_{P0FW&C-`9~9MNRH%W6e=!cK zX|1D|+cpGw9GEn@^_wt-OjVt?W>2MwPW7cCM3CV z7cdQJ6niD5Y*l6n(Wz$(DMNDf)hkss+_u7_NYqtatzLcGIMpQ^=Im4;u}!FR;E}e= zHolegpRRcOi(eo)Iu^YebAbc}{Sxm{BX~Txv(E{;Vm9KjM?hLi_*&i-1Cr4N_fg39StL7Wb)Mo?>qw z?V0p{e0@6q`G_;H&r#qxPNd@5EwZJFuUBhPUu$X$@5s>H1#|c#TDZKl39n-zr#Wtw zt+6!16{-8>sPK%wq5=ZB>t%C*kdph1Dv${<#?6;`s6e!WFZ2Z5lIB4y-qOB=DsNb^ zN|pN<+O=?p5=G&d!HB=5dUOxpyzWaJTB;fKFr(2_{S@E42DBbAlCqxqadA#M{WiZX zYy!wB77?FKh$oS}$_To&N=4ZQCbf7KyLM{p=J@kU&_Xe)X6tfwxnw9J?!tGqlx%;N!7|Oo`RZw~)`9U6_5*G+DA(I*wNsiuMMm-X1E zIuJS_IUdGkT}=JM%{o*kdoYLHHS(4dCv4Wp!!!gvHN|~n?4}_Su4J-XwLMf*qQWn& z_xAJ-_XaFhW>QWY)W;^30VHy!Z%aTK%3uzoO3}6IKQT>C&mFvy7gBu^^bCQKpBf+ER@`=;O!xsUU8@+)hTB>$osw@3)85JjKmQTTeOXQ&3nGrWBZBl#0_D~aHd>EkKbe=r21qHpQV6jK{z!S5_ zlhfMIu-~Dy=Z<-?vGbVTg2d)&PTe$_UFv3};adobgk3pC-fuS=UdrN1r}$B!)Q|xr z;*qt=D@P3SBJSYexJMsfN|zIGY)h;NVl4eR=ZJx1O8 zDa~YN@!~0Q@!DAzGcCVz-G8C-Q0LSXDQ+m{H(g&jdF z)ew8WzQ%}5IzS9_5cS@lThD-fCFjt#c#d~`w$Ow?3gA!Q+Q1nW=|2Uk+O@ctxJ^V^ zkC|VjBDa7DUpR%YO%5434u=yG64qlqzY9WZg?*tzZZ{sr@ZSC&+a}sQHY7WW`bGkv z(RO&U^w@tnQ#(v-3@fF)fi6olf|P|iF!FYoB$!4j3@RH@-I0qCq87x5X~H5|LJtbu zj3fO``lcwGgqp-*N={nQ{C`L9)~5BjtxQf@<~KP)Xf zCZu&SW|u_aiK0cH;X?aU;zk*IqFWum^VW(UU)cNo=4)0CXR24Lf?BPDxZDmaXe-Rw3tjQrG~UT$dfbxsZ+%*O_XEpSx4TB48pTq%DEf1&o3c{}gv}+fT1-eN zi@)3<%ATJ>l_lA#(Pe3{YadiPFe+hHYa61K2pmWi<-#-w{$N8rIKj_FuMY3#ie$?@e#V53T1+ z#nxE4v;KF`1G)o?Zlq>ceq70@-}=-9p3tu>S2=wd5dP@fU8Vl)@rP!&Yiz9 zGoMq>UQeROm0a9|ehk+K@^X&5ZlD^)} zC~^^-!1_`VcR)wdA`;UmdDCR?3Nx6!?GC3`?~K&BT`bm6l57-(1_dN4Z7Ipb4eIr=4jKgsk|q zo|rPbTPj7w3Hr9;&`)C3KWQSFI@yt9j!dfv2Y50dMk;BaH*Xo3Wh@(C!SIny`9qw+ zAPL0|BPb{Y3~k2hMVmH=q?;WRrLRw#{32;l;!>=y&JEOLUl?9PwtkJM)l<9)Nj8(A9jG6h(d(x10DtKG93W%HO{v6g6tZlqc9co zzEJ^I%7yQ>mQ!}U`t&U5;)S_Zv>5osmsg;7rN-4QF%1m~J|^Ij!PM^@Ea#wAW$E#e zwqp%uOIC7#H2a;p<(k8R-$PYHXUvH*!cbCQQa#qbJRmHerX0Ryu*0sz7Nb?)!RE=x zswF^E6GL!Rx)J^U4mA>FbR+RoEB>{}N3&Mc_!@@kTd7!nBMD1^hnJTT7jDwm1#Tx} zZr3I&svkT_RW0~7{vXA=?*+DX>U|MR; zh(ZLV773f=lh05S6*=#DUYW&G83>2CCp}p%sxMW84NUn(;mxu})+&t6xk@b>%%9t* zf5^G#9;-jl5Y5I~LzqOw!nMYX zuk+OW?^NQKH-DX)RQ41cJbYYmfIP8S&@11%yytIAzwb87GlV{$^yfp5YE0lhmaPrH zOpai#ccs?A6^dE>7#qs+fshc`J68JAAiOZ0Mb<3!5Nu!#cfdGcUV@KCAcsj*;MMcV zQ|tQ`|WW7-5TCeREI+^w(Qk5`!nBM7G4<>$X;woV*@-X29x%oAzG_) zQ56E_dBQ{|e$_b8Sij?@_>2q}`&N%H+2>>P5ArVVfjhtc34PSQ6OjAJ^$%PKsk4~{ znGij$HqdBx7zEM~Y1zb*)6TA7@8D3@p#zsEJy#TY>n5XFt3Cd%t2y-nnS4xrEcwQ- zANX!1ON-b~IH5YZlSfjs#`PpA34pCrIopd&NSWO8{iRdhOSnAMA*P!5c>oL%57($P zPNO;df&B9amTkeuSLPPuxYfv(3{@Ib)BI~RA;0sKePM+VxTWs!O-m-QZ^_<-o;clA zR=gnnKC97CjOe-!y=zl;b0b4tq;i`$>qsf-Or?2}bTj1-^B&doqOth>h!%9pM`t^S z$8~!a0q6M-lQMOxhu$pdl!9WaEzcho1d)PcDfo?Pea0kbemAhWX5ffV`gLrardp1w~r@Xh1l%_F5`JX}HtO49XflerAe?&#N66dRBcCDmV zq4Jg%4V_zqnikn-SZ_P*^R5+QzV*E|-;|XPYiCR%YO464f|3-*m!`>kX;+UVdpe&+ z2}W!i0fM$$fsr#>gkE+^or>bFl&OmOyNd*p_%eY$bzH^bil?;RJFL6~_ZQ0&%9En8NE7Fpg3?0g z${gD2Bnr2b?Ry17recd}=QR`AGZWlK>;`l1X|cAIo7n;6a&}+cxGL^HbTC(-cFIU_ z9tvr+AZA|6)rV`rV*~)XU}K! zAhL`+*++%f9b_d&R5CP6)6+l*p_!+j9Dafwk;XMFFmoS$l*ph-GKLw24YWE^I}zTh zNw|rC9T`VxkKF~_mdjIRn)G|^?5&8|^zK4Gz3CQB$jcY-{H($rJ<(Q0mO~hlK+cQE z2`ey_z0a#2u)%i^i|ZiF2;$JuQf`cJLzX)GSPL*C9;=*XCCxl)2RAj^^mOu|Spi4E z2@m8gB$;vTMNJEo0~S(f-!&4{Y=TaVSv9|#jH95_fC~CYaxCA(%6g!Lc8p+-EJemL zBe&q&DS^#-5x*%qI*xUbH(@Wx`!H2nwl_EDLJn6M43SejUW!fNwD;ND{JC8Uis^bm zgX6@{5Sm!J8lh8f5z|O5!nhCHVYF;?)>pkP0s?zHd8Z3Z9H~mvVb}g*BjRsV?*L>u zBo5n(og{hz)G5lFopf~`t<_U|@LikUG%Ij68eytI^83!w?sC=9r9H8Nvw&40)|&cS z!!@P*2`GlKy>{7ht_eK6CBFeK$EG;+?Dr4unH;S3%{+bgED#y_y64Jj>G3mHDtoQP z!Zsmd>4^2*jcj+fT(s-2Bd>IF2M5Bna-_FCGl4zo4!*RKF3|11d1@F;U-46VgHyu8 zgtI*>zo(H^2@jdIWvIJF4{Tj-9>6Ue`%s2ZsJI%GVQfBG&pxr zcPdlDypsdVD;pQOfsr;OF`Z?s*iF)7!TIKaJ+kXPclNpJUnN_xsYRa+@k({Thd}k=3t8m!0Bn5qIxrO24(7Dn?ndMq4wj>SP+?-!-p! zeDG)$lG;%ipF-lJ3LLh6(kp&_rSL`49P_aFUh=%;!2)C}7DubJ=nkV@VJHX@r{#L? jOnzvd$pj*c=pW0yw^p_3b94MRt^=AUphe2(ECcv|dhlDT literal 0 Hc-jL100001 diff --git a/tests/testfile-macros.bz2 b/tests/testfile-macros.bz2 new file mode 100755 index 0000000000000000000000000000000000000000..d74df94c62c8f29a046ebea0aae8e2e3e9454f5a GIT binary patch literal 7882 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