From 5d24cf87d7683f7dc620ddfa278efed30a137409 Mon Sep 17 00:00:00 2001
From: Dodji Seketeli <dodji@redhat.com>
Date: Sat, 7 Nov 2015 22:52:10 +0100
Subject: [PATCH] Support DW_AT_count DWARF attribute

Libabigail's DWARF reader does not support the DW_AT_count attribute
used to specify the number of elements in an array subrange.  Rather,
it uses the DW_AT_lower_bound and DW_AT_upper_bound attributes that
are emitted by GCC.  Recent versions of Clang, on the other hand, use
the DW_AT_count attribute.

This patch adds support for the DW_AT_count attribute too.

	* src/abg-dwarf-reader.cc (get_default_array_lower_bound): Define
	new static function.
	(build_array_type): Support the DW_AT_count attribute.
	* tests/data/test-diff-dwarf/test35-pr19173-libfoo-long-clang.so:
	New test binary input.
	* tests/data/test-diff-dwarf/test35-pr19173-libfoo-long-clang2.so: Likewise.
	* tests/data/test-diff-dwarf/test35-pr19173-libfoo-long-clang-report-0.txt:
	New test reference output.
	* tests/data/test-diff-dwarf/test35-pr19173-libfoo-long-gcc.so:
	New test binary input.
	* tests/data/test-diff-dwarf/test35-pr19173-libfoo-long-gcc2.so:
	New test binary input.
	* tests/data/test-diff-dwarf/test35-pr19173-libfoo-long-gcc-report-0.txt:
	New test reference output.
	* tests/data/test-diff-dwarf/test35-pr19173-libfoo-long.c: Source
	code for the binaries above.
	* tests/data/Makefile.am: Add the new test material to the build
	system.
	* tests/test-diff-dwarf.cc (in_out_specs): Add the new test inputs
	to the harness.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
---
 src/abg-dwarf-reader.cc                       | 104 +++++++++++++++++-
 tests/data/Makefile.am                        |   6 +
 ...t35-pr19173-libfoo-long-clang-report-0.txt |  13 +++
 .../test35-pr19173-libfoo-long-clang.so       | Bin 0 -> 9165 bytes
 .../test35-pr19173-libfoo-long-clang2.so      | Bin 0 -> 9165 bytes
 ...est35-pr19173-libfoo-long-gcc-report-0.txt |  13 +++
 .../test35-pr19173-libfoo-long-gcc.so         | Bin 0 -> 8725 bytes
 .../test35-pr19173-libfoo-long-gcc2.so        | Bin 0 -> 8725 bytes
 .../test35-pr19173-libfoo-long.c              |  15 +++
 tests/test-diff-dwarf.cc                      |  12 ++
 10 files changed, 160 insertions(+), 3 deletions(-)
 create mode 100644 tests/data/test-diff-dwarf/test35-pr19173-libfoo-long-clang-report-0.txt
 create mode 100755 tests/data/test-diff-dwarf/test35-pr19173-libfoo-long-clang.so
 create mode 100755 tests/data/test-diff-dwarf/test35-pr19173-libfoo-long-clang2.so
 create mode 100644 tests/data/test-diff-dwarf/test35-pr19173-libfoo-long-gcc-report-0.txt
 create mode 100755 tests/data/test-diff-dwarf/test35-pr19173-libfoo-long-gcc.so
 create mode 100755 tests/data/test-diff-dwarf/test35-pr19173-libfoo-long-gcc2.so
 create mode 100644 tests/data/test-diff-dwarf/test35-pr19173-libfoo-long.c

diff --git a/src/abg-dwarf-reader.cc b/src/abg-dwarf-reader.cc
index fc436983..21a648e1 100644
--- a/src/abg-dwarf-reader.cc
+++ b/src/abg-dwarf-reader.cc
@@ -144,6 +144,9 @@ maybe_canonicalize_type(Dwarf_Off	die_offset,
 			bool		in_alt_di,
 			read_context&	ctxt);
 
+static int
+get_default_array_lower_bound(translation_unit::language l);
+
 /// Convert an elf symbol type (given by the ELF{32,64}_ST_TYPE
 /// macros) into an elf_symbol::type value.
 ///
@@ -6092,6 +6095,64 @@ dwarf_language_to_tu_language(size_t l)
     }
 }
 
+/// Get the default array lower bound value as defined by the DWARF
+/// specification, version 4, depending on the language of the
+/// translation unit.
+///
+/// @param l the language of the translation unit.
+///
+/// @return the default array lower bound value.
+static int
+get_default_array_lower_bound(translation_unit::language l)
+{
+  int value = 0;
+    switch (l)
+    {
+    case translation_unit::LANG_UNKNOWN:
+      value = 0;
+      break;
+    case translation_unit::LANG_Cobol74:
+    case translation_unit::LANG_Cobol85:
+      value = 1;
+      break;
+    case translation_unit::LANG_C89:
+    case translation_unit::LANG_C99:
+    case translation_unit::LANG_C11:
+    case translation_unit::LANG_C:
+    case translation_unit::LANG_C_plus_plus_11:
+    case translation_unit::LANG_C_plus_plus_14:
+    case translation_unit::LANG_C_plus_plus:
+    case translation_unit::LANG_ObjC:
+    case translation_unit::LANG_ObjC_plus_plus:
+      value = 0;
+      break;
+    case translation_unit::LANG_Fortran77:
+    case translation_unit::LANG_Fortran90:
+    case translation_unit::LANG_Fortran95:
+    case translation_unit::LANG_Ada83:
+    case translation_unit::LANG_Ada95:
+    case translation_unit::LANG_Pascal83:
+    case translation_unit::LANG_Modula2:
+      value = 1;
+      break;
+    case translation_unit::LANG_Java:
+      value = 0;
+      break;
+    case translation_unit::LANG_PL1:
+      value = 1;
+      break;
+    case translation_unit::LANG_UPC:
+    case translation_unit::LANG_D:
+    case translation_unit::LANG_Python:
+    case translation_unit::LANG_Go:
+    case translation_unit::LANG_Mips_Assembler:
+      value = 0;
+      break;
+    }
+
+    return value;
+}
+
 /// Given a DW_TAG_compile_unit, build and return the corresponding
 /// abigail::translation_unit ir node.  Note that this function
 /// recursively reads the children dies of the current DIE and
@@ -7265,7 +7326,11 @@ build_array_type(read_context&	ctxt,
 
   Dwarf_Die child;
   array_type_def::subranges_type subranges;
-  size_t upper_bound, lower_bound = 0;
+  translation_unit::language language =
+    ctxt.current_translation_unit()->get_language();
+  size_t upper_bound = 0;
+  size_t lower_bound = get_default_array_lower_bound(language);
+  size_t count = 0;
 
   if (dwarf_child(die, &child) == 0)
     {
@@ -7274,15 +7339,48 @@ build_array_type(read_context&	ctxt,
 	  int child_tag = dwarf_tag(&child);
 	  if (child_tag == DW_TAG_subrange_type)
 	    {
-	      // usually not specified for C/C++
+	      // The DWARF 4 specifications says, in [5.11 Subrange
+	      // Type Entries]:
+	      //
+	      //     The subrange entry may have the attributes
+	      //     DW_AT_lower_bound and DW_AT_upper_bound to
+	      //     specify, respectively, the lower and upper bound
+	      //     values of the subrange.
+	      //
+	      // So let's look for DW_AT_lower_bound first.
 	      die_unsigned_constant_attribute(&child,
 					      DW_AT_lower_bound,
 					      lower_bound);
 
+	      // Then, DW_AT_upper_bound.
 	      if (!die_unsigned_constant_attribute(&child,
 						   DW_AT_upper_bound,
 						   upper_bound))
-		return result;
+		{
+		  // The DWARF 4 spec says, in [5.11 Subrange Type
+		  // Entries]:
+		  //
+		  //   The DW_AT_upper_bound attribute may be replaced
+		  //   by a DW_AT_count attribute, whose value
+		  //   describes the number of elements in the
+		  //   subrange rather than the value of the last
+		  //   element."
+		  //
+		  // So, as DW_AT_upper_bound is not present in this
+		  // case, let's see if there is a DW_AT_count.
+		  if (!die_unsigned_constant_attribute(&child,
+						       DW_AT_count,
+						       count))
+		    // We have no information about the number of
+		    // elements of the array.  Let's bail out then.
+		    return result;
+
+		  // We can deduce the upper_bound from the
+		  // lower_bound and the number of elements of the
+		  // array:
+		  if (size_t u = lower_bound + count)
+		    upper_bound = u - 1;
+		}
 
 	      array_type_def::subrange_sptr s
 		(new array_type_def::subrange_type(lower_bound,
diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am
index 23363d65..7ab72fcd 100644
--- a/tests/data/Makefile.am
+++ b/tests/data/Makefile.am
@@ -249,6 +249,12 @@ test-diff-dwarf/test33-fnref-changes-v1.o \
 test-diff-dwarf/test34-pr19173-libfoo.so \
 test-diff-dwarf/test34-pr19173-libfoo2.so \
 test-diff-dwarf/test34-pr19173-libfoo-report-0.txt \
+test-diff-dwarf/test35-pr19173-libfoo-long-gcc.so \
+test-diff-dwarf/test35-pr19173-libfoo-long-gcc2.so \
+test-diff-dwarf/test35-pr19173-libfoo-long-gcc-report-0.txt \
+test-diff-dwarf/test35-pr19173-libfoo-long-clang.so \
+test-diff-dwarf/test35-pr19173-libfoo-long-clang2.so \
+test-diff-dwarf/test35-pr19173-libfoo-long-clang-report-0.txt \
 \
 test-read-dwarf/test0			\
 test-read-dwarf/test0.abi			\
diff --git a/tests/data/test-diff-dwarf/test35-pr19173-libfoo-long-clang-report-0.txt b/tests/data/test-diff-dwarf/test35-pr19173-libfoo-long-clang-report-0.txt
new file mode 100644
index 00000000..56a89614
--- /dev/null
+++ b/tests/data/test-diff-dwarf/test35-pr19173-libfoo-long-clang-report-0.txt
@@ -0,0 +1,13 @@
+Functions changes summary: 0 Removed, 0 Changed, 0 Added function
+Variables changes summary: 0 Removed, 1 Changed, 0 Added variable
+
+1 Changed variable:
+
+  [C]'char buggy_symbol[5]' was changed to 'char buggy_symbol[10]':
+    size of symbol (in bytes) changed from 5 to 10
+    type of variable changed:
+     type name changed from 'char[5]' to 'char[10]'
+     array type size changed from 40 to 80 bits:
+     array type subrange 1 changed length from 5 to 10
+
+
diff --git a/tests/data/test-diff-dwarf/test35-pr19173-libfoo-long-clang.so b/tests/data/test-diff-dwarf/test35-pr19173-libfoo-long-clang.so
new file mode 100755
index 0000000000000000000000000000000000000000..4b68a63c6c612a756bf333830839c294a3d907ec
GIT binary patch
literal 9165
zcmeHNTWlOx89wXHCQhBK?W7@>wqytibr7Dt`5JPu<JwsV$EB`AiiA7N?#z0(+Kan8
zo5qMs)D(#nBBg}~c!CFBxIDmHpb~NkG^i?4C{&8_WDyk-sMLgVF#^SW|C#fzXJ^+5
z5)uN*$C~}m|NWP9nKS47=Nx}wbYiR}5D=V#;;<m@(;*ibQi6*Qstm}G7!d36tBFUX
zu2Nl5@Z>(V-es5ySW%)fNVK$>IHFn|jkZWu3@OTX#FE{Puq)pY)?|k10y#!v+Ul}m
z9Vk5)mE2GFDm|v8OX-QX9ZNOA1@809<xRnke5}^KR@E-1s#>y+)YU;e$0kpTJH20j
z`8&6Mcl~c~^gMs?Zs^X_uRr}~sshP3;NgD!(t;Kcp`ne0J%DEuo`LV4yLNQ+t#@9z
z@$zS{J^R$dKe})y{KsFvt9lL!tE8aVC^~#E^<n60P4ub!X1KWuKClWt1$+-4f2soL
z6x+l{Iy5QbYJCM<hj>tQDO?Ki^G%6w69Yc{s|xq)cL3kgq`mKx_$HC`zkI`(EtHBz
z#WBl{VF)8v%sIlyfCyuJ`h;QGWqUSPaqRN+iIIG%XiuA|yzR=GON{gxlN^}&+-IP8
z{IoHpJdEVcO2w{-RCRWC-l)tMQl-4e=Td3CQquc`VOyqS3d2ZMDsF`U6)kaWV*Kcc
z5!d5-FIusZS}<Bx{#=~+=aHp;pj6$J+bBef__oW|zDpk09o!%4yJP&SdNCb7ocU|*
zn)FEKYUoRT(Sy^N=5*78^S4N{+a8?90^v&@oU2Iq4mA$wyYTwgJh)dsdG4Lo<d;J~
ze?Sw-FD^Ktn-9S-dG2Sem&uzD%e`+xw7l;(_-)@kgdFi%65U!{M%wo}@$^~Tx(YUV
zA@mCX$qR>m401BLe<^wX?c}+o@N+FQmr>9(2~p6WW|kMpAM{^x^<VVpzq%Amp8sj`
z)ju3b2CgQ5wN#bH+al8VO&BN7zqb5avOjz134o&dX!6{l?UXx-@|;a5e^09>ZqA@e
zH?#Pec`eihap1kn8A^Kl?iWyHYU-ie8(`*q2$j3C(XHIBld!)I7`~RT&fGc$2kpDh
zlK!oa$vo`PZ!6tIqP4Wv18Y67)&pxju+{@>J@7x)102V3+{V@8c#Q%WN)#JXqWuIV
z-WRBCTP;4`>56OdB85$qI6mCvvO=i%koFUlSpJv0%O&D3se(DSi>jcFW3(kDr#%j(
zAGk!cDY`?^TCAtyJdQb|O3vF^iVG=icZpb3!6xIH;<=s+N)JJ@OkCdGWw-uv0|yDB
zBH149$J>fuR2BQX;%oI({{Gv9_s#xt$J7h>grdhrMh<9Q*pcqndh`K3p~a)Ip6FmK
zrgcr(mX<Uf7w_)hFVcClIIEqu%avTIs3o8t)w;5dGgmnfiOlAlY&E5)ONB^2f4b0J
z$d${bazxtb5Nes8!F0MWlkQ7J`}<8ZKA4X84D{IXSTqq&n^t0=&$iN;-ogF%^-2Dv
z%V;ca4fYPE(!DV|W2VgLV9HF#W2R;H^(11wv7SVKyf4*{s_#ZWxI<+Ux%cC#+j~(j
z9mnGiidOk@H;GpWM!JTl<q?1hWCG!hLEf|mj{sOVhM$lKeHaSs1M4Fots6w3Gq5kb
zH53eYY=0;W^Bxflk8eG)^FZ52+gdQVf`P#JRv3RkjBoA7AP?<@!r`_yWY<%+t?e)k
z{Xsk}Zn=Sfgg1)-5+FPQ;n)=?(c3*&jt$286W!Q9W=f@QY)xnNG<3xO^ZUAI+alRg
z!H!rZ>zN!4y9iotrgF1pE>EK(lF6OvE||1akC2;6gm%+1+im4CnQrSjvz)1a|LLq*
z78PvMo%uOi&KWC%h2F80%RbeyTX)Qq&?`>arCH7uOOCD27OQ%yn#)_=IZH?`YgV#C
zx8{qmbg5HzCF)D6V+_d3cHSfdm7B{uLYK!8x?`U~ULH#5cGk$0&4TU946|G|=Uo}+
zpGm_RHJ&``<&rGjEacKCu>?Q((WP^oGYI-}3w9B(W#ij0=BlY8yhGsfxnhPKNST>R
zmF?5a<#R<;!j+&eI12~Vn-$q@|M3s4J2ZFme81W`9~Y#icV>l-++Q&_vpugzOb;qe
zp0{~jU<U)p&<Dx(yk0RKpwAMC$|W7P=XGQV82M&<UjLZ#dIuGmlsjfc5;<CX*q+xL
zro0Yw{aKIcN!Zg`#yqcQOf^*!)t}1d`YTvi$Z*>T(}?lV1<9?P#jriMzX-Y4eo@&o
z<@KBDPceYs{tPgx7sm@6uQ28ILq#U#o>@V|&}$!6>tBu5G~G;x;+cNlXV2&8OmD7Y
z&+rRAdp>_;%5ewl`|JOrvgh~rl<Ekketqsg_V+bpunx&FNZ87`JaH@i?Q)I$w;*W8
z!{dwNJ?Rv<zdS$xedtjCvwf?I7h9=PNPc}k|3m0_?Kz(9_&4o;0(<H*E}!EgzHe9{
z=SbX-Tt2`5E0B51=X1|%)G0_^E~)*pJ<~TJ@!AU&zw!a?{p{a@J^AAL^Lcldsvy^s
zE5Pkw{yH*Lev|=4+5Y!FTy=-EA<+#yjCobtJ6-OBUa*PodrdGhi7Wd_Vm!%T)-q&%
zjMUF6`(qwk%KCLT1Mp*{cSYGBBF2;ax;vG<zyH>4agBKXXBTYGbg!~!In#p(0x9vn
z%H<mCO4a0d&pJd;Df=ESNC|zcY&*{#Ui*t`!#1bpLkg55czE3M{7v&yv-0_J=a;?$
zeXO_0hI|mU<MrGt3}Uss)WlH`HQ{x)UVok7^|T%jiNz+B57La_|4?8UM5LiL#anCp
z$a?>c_i7{$VkP7CrCz_Sb`M*RH@TORel`o9=j-*uwRyZA$E2j@*Lu7|@Vr}(cM6_Q
z>+vnPkJY@8%m>9*!SkP27{t9@ZC>*Tg1G17`N{*Mf9N)@F$HV8_Ig=R@M!eod`jWR
z{ZWA{4>o*ljPvQmiXR$&>%<+Je(DmPn*=a<`}>n>(t=2l;{rC)6@F2DXN(Uk{HhN>
z1w7#CH~tJV5^sFJ7nC19{{bu0H}D(4BF*c)g2g3dnzd`S_R{(j5RK#ThQu5Dfy!y-
z|6QryINts#@y78MLWKfN?t?oO?jLWD0@vWnpGJT;yKnwD@MibTr+{z4=@`dn>~99R
z#*ByNrJu(8>1P%0AOD|Q#m`Ht;NJtj$5S3>uK;g$&n?nrr{Yv`1DM7|^6`-=V`BWt
zX<Tft++!O~!AR3hc17?7wg)l{t7OdPODQvNSWc;2G0f^2flcCE-gazD?@J^G;JJyC
zyfk<Bpt!bn%JV|*Qw^(HD9ppe!^vCrI@Nn_{0(DlYWT#cF*^AeUD3;Cao(zwjI3F-
z=uZBzPfiY>7$1QK?&?|l*u>*UhbN53$Htx<oi?V2k4}uj$33q0>rROHPTu{80N?)#
h(B*vHZGDrwepwRtbN#;%)cvEt(2)0<-~Bg)e*yZ=PVxW%

literal 0
HcmV?d00001

diff --git a/tests/data/test-diff-dwarf/test35-pr19173-libfoo-long-clang2.so b/tests/data/test-diff-dwarf/test35-pr19173-libfoo-long-clang2.so
new file mode 100755
index 0000000000000000000000000000000000000000..8e9f6ce0993c8d81d31a4ee126d09dfa586da03e
GIT binary patch
literal 9165
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

literal 0
HcmV?d00001

diff --git a/tests/data/test-diff-dwarf/test35-pr19173-libfoo-long-gcc-report-0.txt b/tests/data/test-diff-dwarf/test35-pr19173-libfoo-long-gcc-report-0.txt
new file mode 100644
index 00000000..56a89614
--- /dev/null
+++ b/tests/data/test-diff-dwarf/test35-pr19173-libfoo-long-gcc-report-0.txt
@@ -0,0 +1,13 @@
+Functions changes summary: 0 Removed, 0 Changed, 0 Added function
+Variables changes summary: 0 Removed, 1 Changed, 0 Added variable
+
+1 Changed variable:
+
+  [C]'char buggy_symbol[5]' was changed to 'char buggy_symbol[10]':
+    size of symbol (in bytes) changed from 5 to 10
+    type of variable changed:
+     type name changed from 'char[5]' to 'char[10]'
+     array type size changed from 40 to 80 bits:
+     array type subrange 1 changed length from 5 to 10
+
+
diff --git a/tests/data/test-diff-dwarf/test35-pr19173-libfoo-long-gcc.so b/tests/data/test-diff-dwarf/test35-pr19173-libfoo-long-gcc.so
new file mode 100755
index 0000000000000000000000000000000000000000..737c5f06fef86b3d6d05ed28d08b02f8ef3cddbb
GIT binary patch
literal 8725
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

literal 0
HcmV?d00001

diff --git a/tests/data/test-diff-dwarf/test35-pr19173-libfoo-long-gcc2.so b/tests/data/test-diff-dwarf/test35-pr19173-libfoo-long-gcc2.so
new file mode 100755
index 0000000000000000000000000000000000000000..2ea5b962f54d04d27914a240b1b2764e58155293
GIT binary patch
literal 8725
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

literal 0
HcmV?d00001

diff --git a/tests/data/test-diff-dwarf/test35-pr19173-libfoo-long.c b/tests/data/test-diff-dwarf/test35-pr19173-libfoo-long.c
new file mode 100644
index 00000000..1ed48875
--- /dev/null
+++ b/tests/data/test-diff-dwarf/test35-pr19173-libfoo-long.c
@@ -0,0 +1,15 @@
+// This file is the source code for 4 binaries.
+// It comes from one of the comments of bug libabigail/19173.
+
+// To compile the first two binaries, please do:
+//  gcc test35-pr19173-libfoo-long.c -shared -fpic -o test35-pr19173-libfoo-long-gcc.so -g
+//  gcc test35-pr19173-libfoo-long.c -shared -fpic -o test35-pr19173-libfoo-long-gcc2.so -g -DLONG
+//
+// To compile the next two binaries, please do:
+// clang test35-pr19173-libfoo-long.c -shared -fpic -o test35-pr19173-libfoo-long-clang.so -g
+//  clang test35-pr19173-libfoo-long.c -shared -fpic -o test35-pr19173-libfoo-long-clang2.so -g -DLONG
+#ifdef LONG
+char buggy_symbol[10];
+#else
+char buggy_symbol[5];
+#endif
diff --git a/tests/test-diff-dwarf.cc b/tests/test-diff-dwarf.cc
index d148f1a7..9e41c799 100644
--- a/tests/test-diff-dwarf.cc
+++ b/tests/test-diff-dwarf.cc
@@ -272,6 +272,18 @@ InOutSpec in_out_specs[] =
     "data/test-diff-dwarf/test34-pr19173-libfoo-report-0.txt",
     "output/test-diff-dwarf/test34-pr19173-libfoo-report-0.txt"
   },
+  {
+    "data/test-diff-dwarf/test35-pr19173-libfoo-long-gcc.so",
+    "data/test-diff-dwarf/test35-pr19173-libfoo-long-gcc2.so",
+    "data/test-diff-dwarf/test35-pr19173-libfoo-long-gcc-report-0.txt",
+    "output/test-diff-dwarf/test35-pr19173-libfoo-long-gcc-report-0.txt"
+  },
+  {
+    "data/test-diff-dwarf/test35-pr19173-libfoo-long-clang.so",
+    "data/test-diff-dwarf/test35-pr19173-libfoo-long-clang2.so",
+    "data/test-diff-dwarf/test35-pr19173-libfoo-long-clang-report-0.txt",
+    "output/test-diff-dwarf/test35-pr19173-libfoo-long-clang-report-0.txt"
+  },
   // This should be the last entry
   {NULL, NULL, NULL, NULL}
 };