From 5f65148409fa08613f21280c5aea026d8b78366f Mon Sep 17 00:00:00 2001 From: Dima Kogan Date: Fri, 8 Dec 2017 01:45:10 -0800 Subject: [PATCH] libdw: dwarf_aggregate_size() works with multi-dimensional arrays If we have a multidimensional array of dimensions (a,b,c) the number of elements should be a*b*c, but prior to this patch dwarf_aggregate_size() would report a+b+c instead. This patch fixes the bug and adds a test that demonstrates the bug (the test fails without the functional part of this patch). Fixes: https://sourceware.org/bugzilla/show_bug.cgi?id=22546 Signed-off-by: Dima Kogan --- libdw/ChangeLog | 5 +++++ libdw/dwarf_aggregate_size.c | 43 ++++++++++++++++++++++--------------------- tests/ChangeLog | 6 ++++++ tests/run-aggregate-size.sh | 2 ++ tests/run-peel-type.sh | 1 + tests/testfile-sizes3.o.bz2 | Bin 1147 -> 1208 bytes 6 files changed, 36 insertions(+), 21 deletions(-) diff --git a/libdw/ChangeLog b/libdw/ChangeLog index 43752440..2a6d7118 100644 --- a/libdw/ChangeLog +++ b/libdw/ChangeLog @@ -1,3 +1,8 @@ +2017-12-11 Dima Kogan + + * dwarf_aggregate_size.c (array_size): Handle multi-dimensional + arrays properly. + 2017-11-03 Mark Wielaard * dwarf_getlocation.c (__libdw_intern_expression): Handle diff --git a/libdw/dwarf_aggregate_size.c b/libdw/dwarf_aggregate_size.c index 838468dd..3010c0aa 100644 --- a/libdw/dwarf_aggregate_size.c +++ b/libdw/dwarf_aggregate_size.c @@ -63,7 +63,7 @@ array_size (Dwarf_Die *die, Dwarf_Word *size, return -1; bool any = false; - Dwarf_Word total = 0; + Dwarf_Word count_total = 1; do { Dwarf_Word count; @@ -134,34 +134,35 @@ array_size (Dwarf_Die *die, Dwarf_Word *size, continue; } - /* This is a subrange_type or enumeration_type and we've set COUNT. - Now determine the stride for this array dimension. */ - Dwarf_Word stride = eltsize; - if (INTUSE(dwarf_attr_integrate) (&child, DW_AT_byte_stride, - attr_mem) != NULL) - { - if (INTUSE(dwarf_formudata) (attr_mem, &stride) != 0) - return -1; - } - else if (INTUSE(dwarf_attr_integrate) (&child, DW_AT_bit_stride, - attr_mem) != NULL) - { - if (INTUSE(dwarf_formudata) (attr_mem, &stride) != 0) - return -1; - if (stride % 8) /* XXX maybe compute in bits? */ - return -1; - stride /= 8; - } + count_total *= count; any = true; - total += stride * count; } while (INTUSE(dwarf_siblingof) (&child, &child) == 0); if (!any) return -1; - *size = total; + /* This is a subrange_type or enumeration_type and we've set COUNT. + Now determine the stride for this array. */ + Dwarf_Word stride = eltsize; + if (INTUSE(dwarf_attr_integrate) (die, DW_AT_byte_stride, + attr_mem) != NULL) + { + if (INTUSE(dwarf_formudata) (attr_mem, &stride) != 0) + return -1; + } + else if (INTUSE(dwarf_attr_integrate) (die, DW_AT_bit_stride, + attr_mem) != NULL) + { + if (INTUSE(dwarf_formudata) (attr_mem, &stride) != 0) + return -1; + if (stride % 8) /* XXX maybe compute in bits? */ + return -1; + stride /= 8; + } + + *size = count_total * stride; return 0; } diff --git a/tests/ChangeLog b/tests/ChangeLog index fe633594..e16a3d04 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,3 +1,9 @@ +2017-12-11 Dima Kogan + + * run-aggregate-size.sh: Added check for multi-dimensional arrays. + * run-peel-type.sh: Likewise. + * testfile-sizes3.o.bz2: Likewise. + 2017-12-07 Mark Wielaard * run-readelf-variant.sh: New test. diff --git a/tests/run-aggregate-size.sh b/tests/run-aggregate-size.sh index 42b0742b..6d8aa240 100755 --- a/tests/run-aggregate-size.sh +++ b/tests/run-aggregate-size.sh @@ -54,6 +54,7 @@ # volatile int ia[32]; # const volatile void * const volatile restrict va[64]; # struct s sa[8]; +# double d3d[3][4][5]; # # typedef const int foo; # typedef volatile foo bar; @@ -98,6 +99,7 @@ ca size 16 ia size 128 va size 512 sa size 128 +d3d size 480 f size 4 b size 4 EOF diff --git a/tests/run-peel-type.sh b/tests/run-peel-type.sh index 7fd96e84..668e3161 100755 --- a/tests/run-peel-type.sh +++ b/tests/run-peel-type.sh @@ -55,6 +55,7 @@ ca raw type array_type ia raw type array_type va raw type array_type sa raw type array_type +d3d raw type array_type f raw type base_type b raw type base_type EOF diff --git a/tests/testfile-sizes3.o.bz2 b/tests/testfile-sizes3.o.bz2 index 7fa6a8a529676bc8324d383c8d11f86c66ef453c..863338269bab61fb385344c489d48d1466915b61 100644 GIT binary patch literal 1208 zcmV;p1V{TqT4*^jL0KkKS#6BOfdB+#|L_0*|Nrmj|NqbJ$0`5s-*CW0grxvV07V4= z#YuEo&;$O8fgmQKVWLd}XliXV4Jo|{$vjM$h||>3lRynJ4@5STKx7&K(@dIZ^*v4M zO&SQACR0r@JyX%5c}+CX000Jn00000000004FExt044!3GGxF2m=ggpFiZdd005a7 z34shC5M;m!fJ{u8FaRb5z)VaN00000CPo5aLkIyPA|TR1Jk->A4Npn6GJ1y8(7_rs z(V!328aANF8ZsJa^wA6v=#2sCEv>fvAEl-1JsnyijCVVn;F96iw5rqPe7fD8oTY%# zzkuFvwU@36G3K_Qb9Sag|zst|i=R^b=#SNyh%ugP6%%MroDY)>eBF2GVY8z>^ zA#zxcHJ~$H7_haaFxpbV8FL9XCW(Qu5ipQT9FWH50EP%nnyiM8k?@$e86)x5;K|ab zjRE)de=To@@M38Tdc;E#&wkd|ogxudAm_AcG^Zpl&8cWfutQ+j8P2|N;UJ?)WMH{j zkdUguXf=;74rRSb@MjvmMs8TC%hb};SB$d}XTE5h+iFFPJxFCbzy&paR@UwAE8I|a z>xv}SnwAD>pa%$y@(plQfgqr{x1+1G*MleHd-cI?2p3a%pSs%d=EyV)h8{65&x97d z>cDTWLv8Xn`g=akU54?c+i3h47%y-nOZ)e~&fmHUsODqv5K0UU8IB#yK_fyTqUYo+ z)d?A_7DlSo=IuV-hDwK$z_pp|ywWc)*!}X1qKo}@IdI`&akX%qVS+{otAS{>1hp0Y zbtneMFy6|*&|9z(0}COLj1K0FvK}l(J|&ecc3B9Bj{i?y%G7S#p%iNi46?!k>de^? z3Rs5G!w7B`gxJ+7U0I2THHuOQ(1_YGz6@iwwMq&Y2zO6EVh!zH9mMFImZ>*ZsuLy0 zn3@%twCb_%q@x}3@E3X|(lXKpMNGy8M6IZ*<}a>cyXYroi4JaIBJ!eQ3k4}8G!<+lI=Adwap=bECfTe( zW+rQEQP(u6ongYUT{QX6VtT7#Np6UV8Ib#0Si}K9g8qhj$h|~>RR>A#gn%ZG0P;rC zXb4sTR}i6mh^hs5)i70UnnMDF2qkUMOrr4^D7XnaV83=f7$B8Q&M?G4WL7l;K?{x` z{u*5F#e8Rgc*rV;5Ik9ip@F4bgtMYX0k#wg$ahLQc{34|8S4cHt2PcHrIj$$i66yu zQV^pm;)Dbq17r>Pa;eFUB?r>OOiJ&Q0|>(mpy5@cn3e0WYtS^ZjtF!vE8pbd@yJU2 WN)yF8Z)d&>{}*yaI8cynjKqQ37B1`n literal 1147 zcmV->1cduST4*^jL0KkKSxZ~zf&c_3|NsC0|L^bT_ka8SS{VQT-|)ggfXE^V2tr{{ zfPe%fFbvQGsyqn-nNI+XsA;u5Kn*nY9-4z>Lror_ z1JrFJL-eE6^hSh2YGI~{l5I58Q%_UUX{Jp8000000000000068OeO$Km;eOC3;+NC zm=geu002w?00IU~CIC#B00hJg0001(699|=089V?0Fe<0o{}3)Q#55BQ+lVUX_HKW z>S>{%4X83S7?_Me4K&f|84pt<^+tzP)-#f|y7q30foPkXqYxWfgEY8a>(~ESWfS6- z@Ni+=gF-x(6*8ds7=!_fcc2kOBPJBUTw z#ZeF;oL~!mc$lCHaf@Drt4cMyxPV_n1%SYA{*@Uz8m{Xo77Mc1ipRx|I%Gs-^K(S# zz~LeuggzfHUyp-V(Bybt)#5L0rk*Fcl4m_=YRW}g1D3!>b4XIsTc#4pVGLTXT1b{C zY;B`mlF~hPlCrSbNQO5skS=2lszO~R9%C1M@JCp&g7!T8HvC6bBViRaun7(O9 zMH*Q?m_SQ4nGFCoAne2jUmhiaU4g<%SiRPgJxp*QJ!Z6V-=k*4?&l$Mq#Nd}>3J!t zfx`XPsYr$eHCW5YOOW$;|$B@q}qM(GTYNG+|LJ({_8 zb?fQ(KL3N(l{N!Fuwt=`l~6!h_jQGp+&2DQfA3p2e_{{Wqh*T+0t305Wg<};8-x;t zy1Eb$FcdZ6tgC~fs4Li$X=7Hm$kLz{Vyi0BR^Tv8VMh)byfdjST0soqw3Uq0%@siW zhg)D{cfrYaV$Ry29j-}_4KTE4FuSx2gziv|o=8Q_V$X13V#y?Tx__-HW3poW6C$fd z@R9=!CQBj`C4z1vY#q@>WGYL(A=#;?K`$6H79)_yACnT8a*1<2g3nIX@5n|ABB$^! z2F#TNRAR^FJ!$x@vp$$~3RP9v;)X!xUCK>tjRyltEBDzZBH@|);M+R^*Ec4{I0-W4 zgB{bwG2sl~4o$|I-@tg-b+`N9^GeVf@32um(kr174#XSZnKXtArwj{}267M#JLjb? zBEnP>Sz`~{TP{nXOoJaxH!a1OYD%q#3i;{k(pI3vICDllLdrL&A+{t8{qoj}gu_}I)ytfkiqQ~5BcQzLqo_fwvE6!VfF5U-qN=(h5IlgqS=W8etiOryOLoxgk~01!GmL1C>KHinx!gA5J!N5gTbgIL$nc6oK%e13>g$> z2FNzDZWI9%SIuBR+mE)BL>%;jojDHxDS-I|yTEbKl*(HQYg(19@laZxtTkWzypjKl Nxgwk>NF}ZF!2m-C{KEhM -- 2.14.1